summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore28
-rw-r--r--.gitreview2
-rw-r--r--CREDITS32
-rw-r--r--HISTORY1111
-rw-r--r--INSTALL5
-rw-r--r--README10
-rw-r--r--RELEASE-NOTES-1.18860
-rw-r--r--RELEASE-NOTES-1.19455
-rw-r--r--api.php10
-rw-r--r--docs/design.html18
-rw-r--r--docs/design.txt4
-rw-r--r--docs/doxygen_first_page.php19
-rw-r--r--docs/export-0.5.xsd2
-rw-r--r--docs/export-0.6.xsd226
-rw-r--r--docs/hooks.txt344
-rw-r--r--docs/html/.gitignore3
-rw-r--r--docs/magicword.txt61
-rw-r--r--docs/memcached.txt4
-rw-r--r--docs/uidesign/child-selector-emu.html101
-rw-r--r--docs/uidesign/design.html34
-rw-r--r--docs/uidesign/mediawiki.action.history.diff.html57
-rw-r--r--docs/uidesign/monospace.html78
-rw-r--r--docs/uidesign/table-layout.html60
-rw-r--r--extensions/.gitignore3
-rw-r--r--extensions/ConfirmEdit/.gitreview5
-rw-r--r--extensions/ConfirmEdit/Asirra.i18n.php30
-rw-r--r--extensions/ConfirmEdit/Captcha.php9
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.i18n.php106
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.php2
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.class.php3
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.i18n.php32
-rw-r--r--extensions/ConfirmEdit/QuestyCaptcha.i18n.php44
-rw-r--r--extensions/ConfirmEdit/ReCaptcha.class.php5
-rw-r--r--extensions/ConfirmEdit/ReCaptcha.i18n.php24
-rw-r--r--extensions/Gadgets/.gitreview5
-rw-r--r--extensions/Gadgets/ApiQueryGadgetCategories.php2
-rw-r--r--extensions/Gadgets/ApiQueryGadgets.php5
-rw-r--r--extensions/Gadgets/Gadgets.i18n.php138
-rw-r--r--extensions/Gadgets/Gadgets_body.php46
-rw-r--r--extensions/Gadgets/SpecialGadgets.php18
-rw-r--r--extensions/Nuke/.gitreview5
-rw-r--r--extensions/Nuke/COPYING347
-rw-r--r--extensions/Nuke/INSTALL30
-rw-r--r--extensions/Nuke/Nuke.i18n.php107
-rw-r--r--extensions/Nuke/Nuke.php2
-rw-r--r--extensions/Nuke/Nuke_body.php40
-rw-r--r--extensions/Nuke/RELEASE-NOTES40
-rw-r--r--extensions/Nuke/ext.nuke.js2
-rw-r--r--extensions/ParserFunctions/.gitreview5
-rw-r--r--extensions/README27
-rw-r--r--extensions/Renameuser/.gitreview5
-rw-r--r--extensions/Renameuser/Renameuser.i18n.php131
-rw-r--r--extensions/Vector/.gitreview5
-rw-r--r--extensions/Vector/Vector.i18n.php72
-rw-r--r--extensions/Vector/Vector.php7
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleNav.js6
-rw-r--r--extensions/Vector/modules/ext.vector.footerCleanup.js7
-rw-r--r--extensions/Vector/modules/ext.vector.sectionEditLinks.js11
-rw-r--r--extensions/Vector/modules/images/closed-ltr.pngbin184 -> 143 bytes
-rw-r--r--extensions/Vector/modules/images/closed-rtl.pngbin942 -> 145 bytes
-rw-r--r--extensions/Vector/modules/images/edit-faded.pngbin546 -> 425 bytes
-rw-r--r--extensions/Vector/modules/images/edit.pngbin551 -> 428 bytes
-rw-r--r--extensions/Vector/modules/images/open.pngbin181 -> 145 bytes
-rw-r--r--extensions/Vector/modules/images/portal-break.pngbin242 -> 203 bytes
-rw-r--r--extensions/WikiEditor/.gitreview6
-rw-r--r--extensions/WikiEditor/WikiEditor.hooks.php24
-rw-r--r--extensions/WikiEditor/WikiEditor.i18n.php878
-rw-r--r--extensions/WikiEditor/WikiEditor.php6
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.css1
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js5
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-error.pngbin672 -> 549 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-exists.pngbin335 -> 293 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.pngbin279 -> 234 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-external.pngbin282 -> 235 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-invalid.pngbin607 -> 488 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-notexists.pngbin548 -> 440 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/collapse.pngbin1022 -> 347 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.pngbin291 -> 273 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.pngbin277 -> 274 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/expand.pngbin250 -> 234 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/name-base.pngbin177 -> 148 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/text-base.pngbin128 -> 96 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/wiki-text.pngbin255 -> 211 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/close.pngbin369 -> 319 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/grab.pngbin131 -> 102 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/grip.pngbin159 -> 119 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/open.pngbin370 -> 321 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/arrow-down.pngbin181 -> 145 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/arrow-ltr.pngbin184 -> 143 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/arrow-rtl.pngbin192 -> 145 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/base.pngbin3632 -> 174 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/button-sprite.pngbin21076 -> 19362 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/example-image.pngbin1124 -> 1005 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-big.pngbin725 -> 577 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold-ka.pngbin1492 -> 1132 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold-ru.pngbin925 -> 885 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold.pngbin754 -> 599 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.pngbin1019 -> 319 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-indent.pngbin1037 -> 317 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-italic-ka.pngbin1247 -> 603 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-italic.pngbin644 -> 508 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-olist-rtl.pngbin359 -> 290 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-olist.pngbin365 -> 285 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-small.pngbin713 -> 565 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-subscript.pngbin731 -> 574 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-superscript.pngbin729 -> 577 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.pngbin227 -> 178 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-ulist.pngbin223 -> 176 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-file.pngbin1386 -> 1121 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-gallery.pngbin338 -> 309 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-ilink.pngbin332 -> 286 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-link.pngbin545 -> 429 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-newline.pngbin784 -> 627 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-nowiki.pngbin1557 -> 1266 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.pngbin1319 -> 1257 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-redirect.pngbin1552 -> 1255 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-reference.pngbin371 -> 347 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-signature.pngbin851 -> 682 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-table.pngbin343 -> 270 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-xlink.pngbin413 -> 388 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.pngbin187 -> 144 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.pngbin192 -> 145 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.pngbin189 -> 144 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-big.pngbin740 -> 650 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.pngbin682 -> 672 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.pngbin726 -> 718 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.pngbin576 -> 556 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.pngbin728 -> 672 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.pngbin770 -> 750 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.pngbin642 -> 628 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.pngbin670 -> 613 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold.pngbin682 -> 672 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.pngbin613 -> 588 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.pngbin551 -> 507 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.pngbin449 -> 417 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.pngbin719 -> 660 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic.pngbin613 -> 588 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-olist.pngbin438 -> 375 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-small.pngbin688 -> 640 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.pngbin691 -> 649 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.pngbin698 -> 652 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.pngbin389 -> 332 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.pngbin1585 -> 1562 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.pngbin1244 -> 1133 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.pngbin1128 -> 1056 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.pngbin673 -> 588 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-table.pngbin284 -> 219 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/search-replace.pngbin1088 -> 1047 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/search-replace.pngbin979 -> 788 bytes
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js135
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.css2
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js6
-rw-r--r--img_auth.php180
-rw-r--r--includes/Action.php140
-rw-r--r--includes/AjaxResponse.php14
-rw-r--r--includes/Article.php1329
-rw-r--r--includes/AuthPlugin.php2
-rw-r--r--includes/AutoLoader.php158
-rw-r--r--includes/Autopromote.php4
-rw-r--r--includes/BacklinkCache.php17
-rw-r--r--includes/Block.php83
-rw-r--r--includes/CategoryPage.php684
-rw-r--r--includes/CategoryViewer.php677
-rw-r--r--includes/Categoryfinder.php4
-rw-r--r--includes/Cdb.php7
-rw-r--r--includes/Cdb_PHP.php69
-rw-r--r--includes/ChangeTags.php63
-rw-r--r--includes/ChangesFeed.php5
-rw-r--r--includes/ChangesList.php291
-rw-r--r--includes/Cookie.php23
-rw-r--r--includes/DefaultSettings.php636
-rw-r--r--includes/DeferredUpdates.php89
-rw-r--r--includes/Defines.php9
-rw-r--r--includes/EditPage.php2088
-rw-r--r--includes/Exception.php172
-rw-r--r--includes/Export.php37
-rw-r--r--includes/ExternalEdit.php104
-rw-r--r--includes/ExternalStoreDB.php6
-rw-r--r--includes/FakeTitle.php17
-rw-r--r--includes/Fallback.php53
-rw-r--r--includes/Feed.php92
-rw-r--r--includes/FeedUtils.php151
-rw-r--r--includes/FileDeleteForm.php134
-rw-r--r--includes/ForkController.php6
-rw-r--r--includes/FormOptions.php4
-rw-r--r--includes/GlobalFunctions.php1071
-rw-r--r--includes/HTMLForm.php289
-rw-r--r--includes/Hooks.php6
-rw-r--r--includes/Html.php194
-rw-r--r--includes/HttpFunctions.old.php1
-rw-r--r--includes/HttpFunctions.php89
-rw-r--r--includes/IP.php30
-rw-r--r--includes/ImageFunctions.php37
-rw-r--r--includes/ImageGallery.php15
-rw-r--r--includes/ImagePage.php133
-rw-r--r--includes/Import.php365
-rw-r--r--includes/Init.php49
-rw-r--r--includes/Licenses.php4
-rw-r--r--includes/Linker.php262
-rw-r--r--includes/LinksUpdate.php180
-rw-r--r--includes/LocalisationCache.php251
-rw-r--r--includes/MWFunction.php19
-rw-r--r--includes/MagicWord.php54
-rw-r--r--includes/Message.php205
-rw-r--r--includes/Metadata.php13
-rw-r--r--includes/MimeMagic.php4
-rw-r--r--includes/Namespace.php66
-rw-r--r--includes/OutputPage.php847
-rw-r--r--includes/PHPVersionError.php8
-rw-r--r--includes/PageQueryPage.php2
-rw-r--r--includes/Pager.php211
-rw-r--r--includes/PathRouter.php351
-rw-r--r--includes/PatrolLog.php88
-rw-r--r--includes/PoolCounter.php60
-rw-r--r--includes/Preferences.php568
-rw-r--r--includes/ProtectionForm.php93
-rw-r--r--includes/ProxyTools.php117
-rw-r--r--includes/QueryPage.php106
-rw-r--r--includes/RawPage.php228
-rw-r--r--includes/RecentChange.php180
-rw-r--r--includes/RequestContext.php424
-rw-r--r--includes/Revision.php278
-rw-r--r--includes/RevisionList.php70
-rw-r--r--includes/Sanitizer.php149
-rw-r--r--includes/SeleniumWebSettings.php18
-rw-r--r--includes/Setup.php69
-rw-r--r--includes/SiteConfiguration.php10
-rw-r--r--includes/SiteStats.php16
-rw-r--r--includes/Skin.php423
-rw-r--r--includes/SkinLegacy.php282
-rw-r--r--includes/SkinTemplate.php821
-rw-r--r--includes/SpecialPage.php220
-rw-r--r--includes/SpecialPageFactory.php83
-rw-r--r--includes/SquidPurgeClient.php2
-rw-r--r--includes/Status.php10
-rw-r--r--includes/StreamFile.php235
-rw-r--r--includes/StubObject.php15
-rw-r--r--includes/Title.php2238
-rw-r--r--includes/User.php183
-rw-r--r--includes/UserArray.php3
-rw-r--r--includes/UserMailer.php334
-rw-r--r--includes/UserRightsProxy.php17
-rw-r--r--includes/ViewCountUpdate.php2
-rw-r--r--includes/WebRequest.php277
-rw-r--r--includes/WebResponse.php7
-rw-r--r--includes/WebStart.php2
-rw-r--r--includes/Wiki.php277
-rw-r--r--includes/WikiCategoryPage.php12
-rw-r--r--includes/WikiError.php8
-rw-r--r--includes/WikiFilePage.php41
-rw-r--r--includes/WikiMap.php60
-rw-r--r--includes/WikiPage.php2130
-rw-r--r--includes/Xml.php179
-rw-r--r--includes/XmlTypeCheck.php31
-rw-r--r--includes/ZhClient.php11
-rw-r--r--includes/ZipDirectoryReader.php124
-rw-r--r--includes/actions/CreditsAction.php67
-rw-r--r--includes/actions/DeleteAction.php (renamed from includes/actions/DeletetrackbackAction.php)30
-rw-r--r--includes/actions/EditAction.php74
-rw-r--r--includes/actions/HistoryAction.php (renamed from includes/HistoryPage.php)363
-rw-r--r--includes/actions/InfoAction.php44
-rw-r--r--includes/actions/MarkpatrolledAction.php32
-rw-r--r--includes/actions/ProtectAction.php56
-rw-r--r--includes/actions/PurgeAction.php12
-rw-r--r--includes/actions/RawAction.php239
-rw-r--r--includes/actions/RenderAction.php42
-rw-r--r--includes/actions/RevertAction.php22
-rw-r--r--includes/actions/RevisiondeleteAction.php4
-rw-r--r--includes/actions/RollbackAction.php14
-rw-r--r--includes/actions/ViewAction.php43
-rw-r--r--includes/actions/WatchAction.php16
-rw-r--r--includes/api/ApiBase.php177
-rw-r--r--includes/api/ApiBlock.php25
-rw-r--r--includes/api/ApiComparePages.php6
-rw-r--r--includes/api/ApiDelete.php116
-rw-r--r--includes/api/ApiDisabled.php9
-rw-r--r--includes/api/ApiEditPage.php120
-rw-r--r--includes/api/ApiEmailUser.php13
-rw-r--r--includes/api/ApiExpandTemplates.php17
-rw-r--r--includes/api/ApiFeedContributions.php11
-rw-r--r--includes/api/ApiFeedWatchlist.php24
-rw-r--r--includes/api/ApiFileRevert.php15
-rw-r--r--includes/api/ApiFormatBase.php20
-rw-r--r--includes/api/ApiFormatDbg.php5
-rw-r--r--includes/api/ApiFormatDump.php5
-rw-r--r--includes/api/ApiFormatJson.php5
-rw-r--r--includes/api/ApiFormatPhp.php5
-rw-r--r--includes/api/ApiFormatRaw.php5
-rw-r--r--includes/api/ApiFormatTxt.php5
-rw-r--r--includes/api/ApiFormatWddx.php7
-rw-r--r--includes/api/ApiFormatXml.php17
-rw-r--r--includes/api/ApiFormatYaml.php5
-rw-r--r--includes/api/ApiHelp.php22
-rw-r--r--includes/api/ApiImport.php18
-rw-r--r--includes/api/ApiLogin.php47
-rw-r--r--includes/api/ApiLogout.php17
-rw-r--r--includes/api/ApiMain.php92
-rw-r--r--includes/api/ApiMove.php15
-rw-r--r--includes/api/ApiOpenSearch.php9
-rw-r--r--includes/api/ApiPageSet.php17
-rw-r--r--includes/api/ApiParamInfo.php137
-rw-r--r--includes/api/ApiParse.php71
-rw-r--r--includes/api/ApiPatrol.php10
-rw-r--r--includes/api/ApiProtect.php27
-rw-r--r--includes/api/ApiPurge.php82
-rw-r--r--includes/api/ApiQuery.php27
-rw-r--r--includes/api/ApiQueryAllCategories.php8
-rw-r--r--includes/api/ApiQueryAllLinks.php7
-rw-r--r--includes/api/ApiQueryAllUsers.php32
-rw-r--r--includes/api/ApiQueryAllimages.php21
-rw-r--r--includes/api/ApiQueryAllmessages.php32
-rw-r--r--includes/api/ApiQueryAllpages.php26
-rw-r--r--includes/api/ApiQueryBacklinks.php7
-rw-r--r--includes/api/ApiQueryBase.php31
-rw-r--r--includes/api/ApiQueryBlocks.php58
-rw-r--r--includes/api/ApiQueryCategories.php32
-rw-r--r--includes/api/ApiQueryCategoryInfo.php7
-rw-r--r--includes/api/ApiQueryCategoryMembers.php15
-rw-r--r--includes/api/ApiQueryDeletedrevs.php48
-rw-r--r--includes/api/ApiQueryDisabled.php9
-rw-r--r--includes/api/ApiQueryDuplicateFiles.php18
-rw-r--r--includes/api/ApiQueryExtLinksUsage.php7
-rw-r--r--includes/api/ApiQueryExternalLinks.php10
-rw-r--r--includes/api/ApiQueryFilearchive.php22
-rw-r--r--includes/api/ApiQueryIWBacklinks.php7
-rw-r--r--includes/api/ApiQueryIWLinks.php37
-rw-r--r--includes/api/ApiQueryImageInfo.php10
-rw-r--r--includes/api/ApiQueryImages.php33
-rw-r--r--includes/api/ApiQueryInfo.php33
-rw-r--r--includes/api/ApiQueryLangBacklinks.php7
-rw-r--r--includes/api/ApiQueryLangLinks.php33
-rw-r--r--includes/api/ApiQueryLinks.php50
-rw-r--r--includes/api/ApiQueryLogEvents.php50
-rw-r--r--includes/api/ApiQueryPageProps.php7
-rw-r--r--includes/api/ApiQueryProtectedTitles.php10
-rw-r--r--includes/api/ApiQueryQueryPage.php14
-rw-r--r--includes/api/ApiQueryRandom.php7
-rw-r--r--includes/api/ApiQueryRecentChanges.php20
-rw-r--r--includes/api/ApiQueryRevisions.php57
-rw-r--r--includes/api/ApiQuerySearch.php10
-rw-r--r--includes/api/ApiQuerySiteinfo.php79
-rw-r--r--includes/api/ApiQueryStashImageInfo.php7
-rw-r--r--includes/api/ApiQueryTags.php7
-rw-r--r--includes/api/ApiQueryUserContributions.php21
-rw-r--r--includes/api/ApiQueryUserInfo.php61
-rw-r--r--includes/api/ApiQueryUsers.php9
-rw-r--r--includes/api/ApiQueryWatchlist.php11
-rw-r--r--includes/api/ApiQueryWatchlistRaw.php7
-rw-r--r--includes/api/ApiResult.php15
-rw-r--r--includes/api/ApiRollback.php19
-rw-r--r--includes/api/ApiRsd.php6
-rw-r--r--includes/api/ApiUnblock.php19
-rw-r--r--includes/api/ApiUndelete.php14
-rw-r--r--includes/api/ApiUpload.php217
-rw-r--r--includes/api/ApiUserrights.php13
-rw-r--r--includes/api/ApiWatch.php24
-rw-r--r--includes/cache/CacheDependency.php16
-rw-r--r--includes/cache/FileCacheBase.php249
-rw-r--r--includes/cache/GenderCache.php (renamed from includes/GenderCache.php)2
-rw-r--r--includes/cache/HTMLCacheUpdate.php17
-rw-r--r--includes/cache/HTMLFileCache.php288
-rw-r--r--includes/cache/LinkBatch.php20
-rw-r--r--includes/cache/LinkCache.php55
-rw-r--r--includes/cache/MessageCache.php54
-rw-r--r--includes/cache/ObjectFileCache.php30
-rw-r--r--includes/cache/ResourceFileCache.php87
-rw-r--r--includes/context/ContextSource.php170
-rw-r--r--includes/context/DerivativeContext.php286
-rw-r--r--includes/context/IContextSource.php110
-rw-r--r--includes/context/RequestContext.php398
-rw-r--r--includes/db/CloneDatabase.php6
-rw-r--r--includes/db/Database.php401
-rw-r--r--includes/db/DatabaseError.php54
-rw-r--r--includes/db/DatabaseIbm_db2.php225
-rw-r--r--includes/db/DatabaseMssql.php2
-rw-r--r--includes/db/DatabaseMysql.php329
-rw-r--r--includes/db/DatabaseOracle.php31
-rw-r--r--includes/db/DatabasePostgres.php57
-rw-r--r--includes/db/DatabaseSqlite.php8
-rw-r--r--includes/db/DatabaseUtility.php15
-rw-r--r--includes/db/LBFactory.php11
-rw-r--r--includes/db/LBFactory_Multi.php27
-rw-r--r--includes/db/LBFactory_Single.php8
-rw-r--r--includes/db/LoadBalancer.php85
-rw-r--r--includes/db/LoadMonitor.php6
-rw-r--r--includes/debug/Debug.php285
-rw-r--r--includes/diff/DairikiDiff.php187
-rw-r--r--includes/diff/DifferenceEngine.php913
-rw-r--r--includes/diff/WikiDiff3.php5
-rw-r--r--includes/extauth/vB.php15
-rw-r--r--includes/filerepo/FSRepo.php736
-rw-r--r--includes/filerepo/FileRepo.php1058
-rw-r--r--includes/filerepo/ForeignAPIRepo.php47
-rw-r--r--includes/filerepo/ForeignDBViaLBRepo.php1
-rw-r--r--includes/filerepo/LocalRepo.php111
-rw-r--r--includes/filerepo/NullRepo.php3
-rw-r--r--includes/filerepo/README23
-rw-r--r--includes/filerepo/RepoGroup.php49
-rw-r--r--includes/filerepo/backend/FSFile.php233
-rw-r--r--includes/filerepo/backend/FSFileBackend.php600
-rw-r--r--includes/filerepo/backend/FileBackend.php1739
-rw-r--r--includes/filerepo/backend/FileBackendGroup.php156
-rw-r--r--includes/filerepo/backend/FileBackendMultiWrite.php420
-rw-r--r--includes/filerepo/backend/FileOp.php697
-rw-r--r--includes/filerepo/backend/SwiftFileBackend.php877
-rw-r--r--includes/filerepo/backend/TempFSFile.php92
-rw-r--r--includes/filerepo/backend/lockmanager/DBLockManager.php469
-rw-r--r--includes/filerepo/backend/lockmanager/FSLockManager.php202
-rw-r--r--includes/filerepo/backend/lockmanager/LSLockManager.php295
-rw-r--r--includes/filerepo/backend/lockmanager/LockManager.php182
-rw-r--r--includes/filerepo/backend/lockmanager/LockManagerGroup.php89
-rw-r--r--includes/filerepo/file/ArchivedFile.php (renamed from includes/filerepo/ArchivedFile.php)52
-rw-r--r--includes/filerepo/file/File.php (renamed from includes/filerepo/File.php)519
-rw-r--r--includes/filerepo/file/ForeignAPIFile.php (renamed from includes/filerepo/ForeignAPIFile.php)135
-rw-r--r--includes/filerepo/file/ForeignDBFile.php (renamed from includes/filerepo/ForeignDBFile.php)4
-rw-r--r--includes/filerepo/file/LocalFile.php (renamed from includes/filerepo/LocalFile.php)319
-rw-r--r--includes/filerepo/file/OldLocalFile.php (renamed from includes/filerepo/OldLocalFile.php)11
-rw-r--r--includes/filerepo/file/UnregisteredLocalFile.php (renamed from includes/filerepo/UnregisteredLocalFile.php)55
-rw-r--r--includes/installer/CliInstaller.php14
-rw-r--r--includes/installer/DatabaseInstaller.php33
-rw-r--r--includes/installer/DatabaseUpdater.php196
-rw-r--r--includes/installer/Ibm_db2Installer.php16
-rw-r--r--includes/installer/Ibm_db2Updater.php31
-rw-r--r--includes/installer/Installer.i18n.php2288
-rw-r--r--includes/installer/Installer.php120
-rw-r--r--includes/installer/LocalSettingsGenerator.php5
-rw-r--r--includes/installer/MysqlInstaller.php49
-rw-r--r--includes/installer/MysqlUpdater.php78
-rw-r--r--includes/installer/OracleInstaller.php4
-rw-r--r--includes/installer/OracleUpdater.php28
-rw-r--r--includes/installer/PhpBugTests.php3
-rw-r--r--includes/installer/PostgresInstaller.php49
-rw-r--r--includes/installer/PostgresUpdater.php65
-rw-r--r--includes/installer/SqliteInstaller.php21
-rw-r--r--includes/installer/SqliteUpdater.php22
-rw-r--r--includes/installer/WebInstaller.php41
-rw-r--r--includes/installer/WebInstallerOutput.php13
-rw-r--r--includes/installer/WebInstallerPage.php57
-rw-r--r--includes/interwiki/Interwiki.php130
-rw-r--r--includes/job/DoubleRedirectJob.php31
-rw-r--r--includes/job/EnotifNotifyJob.php3
-rw-r--r--includes/job/JobQueue.php21
-rw-r--r--includes/job/RefreshLinksJob.php12
-rw-r--r--includes/job/UploadFromUrlJob.php16
-rw-r--r--includes/json/FormatJson.php21
-rw-r--r--includes/json/Services_JSON.php4
-rw-r--r--includes/libs/CSSJanus.php32
-rw-r--r--includes/libs/CSSMin.php12
-rw-r--r--includes/libs/IEContentAnalyzer.php79
-rw-r--r--includes/libs/IEUrlExtension.php58
-rw-r--r--includes/libs/JavaScriptMinifier.php49
-rw-r--r--includes/libs/jsminplus.php223
-rw-r--r--includes/logging/LogEntry.php518
-rw-r--r--includes/logging/LogEventsList.php (renamed from includes/LogEventsList.php)521
-rw-r--r--includes/logging/LogFormatter.php673
-rw-r--r--includes/logging/LogPage.php (renamed from includes/LogPage.php)166
-rw-r--r--includes/logging/LogPager.php356
-rw-r--r--includes/logging/PatrolLog.php58
-rw-r--r--includes/media/Bitmap.php85
-rw-r--r--includes/media/BitmapMetadataHandler.php19
-rw-r--r--includes/media/Bitmap_ClientOnly.php2
-rw-r--r--includes/media/DjVu.php9
-rw-r--r--includes/media/DjVuImage.php (renamed from includes/DjVuImage.php)0
-rw-r--r--includes/media/Exif.php5
-rw-r--r--includes/media/ExifBitmap.php10
-rw-r--r--includes/media/FormatMetadata.php11
-rw-r--r--includes/media/GIF.php23
-rw-r--r--includes/media/Generic.php122
-rw-r--r--includes/media/JpegMetadataExtractor.php10
-rw-r--r--includes/media/MediaTransformOutput.php86
-rw-r--r--includes/media/SVG.php12
-rw-r--r--includes/media/SVGMetadataExtractor.php8
-rw-r--r--includes/media/XCF.php137
-rw-r--r--includes/media/XMP.php6
-rw-r--r--includes/media/XMPInfo.php23
-rw-r--r--includes/media/XMPValidate.php53
-rw-r--r--includes/mime.info4
-rw-r--r--includes/mime.types22
-rw-r--r--includes/normal/RandomTest.php2
-rw-r--r--includes/normal/UtfNormal.php32
-rw-r--r--includes/objectcache/BagOStuff.php8
-rw-r--r--includes/objectcache/DBABagOStuff.php4
-rw-r--r--includes/objectcache/EmptyBagOStuff.php2
-rw-r--r--includes/objectcache/MemcachedClient.php20
-rw-r--r--includes/objectcache/MultiWriteBagOStuff.php4
-rw-r--r--includes/objectcache/ObjectCache.php10
-rw-r--r--includes/objectcache/SqlBagOStuff.php139
-rw-r--r--includes/objectcache/eAccelBagOStuff.php46
-rw-r--r--includes/parser/CoreParserFunctions.php42
-rw-r--r--includes/parser/LinkHolderArray.php6
-rw-r--r--includes/parser/Parser.php549
-rw-r--r--includes/parser/ParserCache.php23
-rw-r--r--includes/parser/ParserOptions.php327
-rw-r--r--includes/parser/ParserOutput.php87
-rw-r--r--includes/parser/Preprocessor.php11
-rw-r--r--includes/parser/Preprocessor_DOM.php16
-rw-r--r--includes/parser/Preprocessor_Hash.php11
-rw-r--r--includes/parser/Preprocessor_HipHop.hphp16
-rw-r--r--includes/parser/StripState.php7
-rw-r--r--includes/parser/Tidy.php12
-rw-r--r--includes/profiler/Profiler.php67
-rw-r--r--includes/profiler/ProfilerSimple.php9
-rw-r--r--includes/profiler/ProfilerSimpleText.php1
-rw-r--r--includes/profiler/ProfilerSimpleTrace.php3
-rw-r--r--includes/profiler/ProfilerSimpleUDP.php38
-rw-r--r--includes/profiler/ProfilerStub.php2
-rw-r--r--includes/resourceloader/ResourceLoader.php390
-rw-r--r--includes/resourceloader/ResourceLoaderContext.php32
-rw-r--r--includes/resourceloader/ResourceLoaderFileModule.php99
-rw-r--r--includes/resourceloader/ResourceLoaderFilePageModule.php7
-rw-r--r--includes/resourceloader/ResourceLoaderModule.php99
-rw-r--r--includes/resourceloader/ResourceLoaderStartUpModule.php51
-rw-r--r--includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php113
-rw-r--r--includes/resourceloader/ResourceLoaderUserModule.php25
-rw-r--r--includes/resourceloader/ResourceLoaderUserOptionsModule.php53
-rw-r--r--includes/resourceloader/ResourceLoaderUserTokensModule.php6
-rw-r--r--includes/resourceloader/ResourceLoaderWikiModule.php57
-rw-r--r--includes/revisiondelete/RevisionDelete.php74
-rw-r--r--includes/revisiondelete/RevisionDeleteAbstracts.php4
-rw-r--r--includes/revisiondelete/RevisionDeleter.php88
-rw-r--r--includes/search/SearchEngine.php191
-rw-r--r--includes/search/SearchMySQL.php3
-rw-r--r--includes/search/SearchOracle.php4
-rw-r--r--includes/search/SearchUpdate.php4
-rw-r--r--includes/specials/SpecialActiveusers.php90
-rw-r--r--includes/specials/SpecialAllmessages.php78
-rw-r--r--includes/specials/SpecialAllpages.php58
-rw-r--r--includes/specials/SpecialAncientpages.php8
-rw-r--r--includes/specials/SpecialBlock.php317
-rw-r--r--includes/specials/SpecialBlockList.php171
-rw-r--r--includes/specials/SpecialBlockme.php15
-rw-r--r--includes/specials/SpecialBooksources.php9
-rw-r--r--includes/specials/SpecialBrokenRedirects.php29
-rw-r--r--includes/specials/SpecialCategories.php40
-rw-r--r--includes/specials/SpecialChangeEmail.php213
-rw-r--r--includes/specials/SpecialChangePassword.php91
-rw-r--r--includes/specials/SpecialComparePages.php51
-rw-r--r--includes/specials/SpecialConfirmemail.php22
-rw-r--r--includes/specials/SpecialContributions.php600
-rw-r--r--includes/specials/SpecialDeadendpages.php2
-rw-r--r--includes/specials/SpecialDeletedContributions.php200
-rw-r--r--includes/specials/SpecialDisambiguations.php14
-rw-r--r--includes/specials/SpecialDoubleRedirects.php24
-rw-r--r--includes/specials/SpecialEditWatchlist.php250
-rw-r--r--includes/specials/SpecialEmailuser.php70
-rw-r--r--includes/specials/SpecialExport.php209
-rw-r--r--includes/specials/SpecialFewestrevisions.php20
-rw-r--r--includes/specials/SpecialFileDuplicateSearch.php49
-rw-r--r--includes/specials/SpecialFilepath.php17
-rw-r--r--includes/specials/SpecialImport.php141
-rw-r--r--includes/specials/SpecialJavaScriptTest.php142
-rw-r--r--includes/specials/SpecialLinkSearch.php4
-rw-r--r--includes/specials/SpecialListfiles.php32
-rw-r--r--includes/specials/SpecialListgrouprights.php43
-rw-r--r--includes/specials/SpecialListredirects.php11
-rw-r--r--includes/specials/SpecialListusers.php68
-rw-r--r--includes/specials/SpecialLockdb.php120
-rw-r--r--includes/specials/SpecialLog.php70
-rw-r--r--includes/specials/SpecialMIMEsearch.php23
-rw-r--r--includes/specials/SpecialMergeHistory.php144
-rw-r--r--includes/specials/SpecialMostcategories.php7
-rw-r--r--includes/specials/SpecialMostimages.php4
-rw-r--r--includes/specials/SpecialMostlinked.php13
-rw-r--r--includes/specials/SpecialMostlinkedcategories.php19
-rw-r--r--includes/specials/SpecialMostlinkedtemplates.php17
-rw-r--r--includes/specials/SpecialMovepage.php364
-rw-r--r--includes/specials/SpecialNewimages.php41
-rw-r--r--includes/specials/SpecialNewpages.php85
-rw-r--r--includes/specials/SpecialPasswordReset.php80
-rw-r--r--includes/specials/SpecialPopularpages.php13
-rw-r--r--includes/specials/SpecialPreferences.php48
-rw-r--r--includes/specials/SpecialPrefixindex.php42
-rw-r--r--includes/specials/SpecialProtectedpages.php59
-rw-r--r--includes/specials/SpecialProtectedtitles.php49
-rw-r--r--includes/specials/SpecialRandompage.php13
-rw-r--r--includes/specials/SpecialRecentchanges.php67
-rw-r--r--includes/specials/SpecialRecentchangeslinked.php55
-rw-r--r--includes/specials/SpecialRevisiondelete.php42
-rw-r--r--includes/specials/SpecialSearch.php302
-rw-r--r--includes/specials/SpecialShortpages.php23
-rw-r--r--includes/specials/SpecialSpecialpages.php2
-rw-r--r--includes/specials/SpecialStatistics.php32
-rw-r--r--includes/specials/SpecialTags.php25
-rw-r--r--includes/specials/SpecialUnblock.php65
-rw-r--r--includes/specials/SpecialUndelete.php415
-rw-r--r--includes/specials/SpecialUnlockdb.php104
-rw-r--r--includes/specials/SpecialUnusedcategories.php4
-rw-r--r--includes/specials/SpecialUnusedtemplates.php6
-rw-r--r--includes/specials/SpecialUnwatchedpages.php2
-rw-r--r--includes/specials/SpecialUpload.php176
-rw-r--r--includes/specials/SpecialUploadStash.php58
-rw-r--r--includes/specials/SpecialUserlogin.php414
-rw-r--r--includes/specials/SpecialUserlogout.php21
-rw-r--r--includes/specials/SpecialUserrights.php126
-rw-r--r--includes/specials/SpecialVersion.php31
-rw-r--r--includes/specials/SpecialWantedcategories.php11
-rw-r--r--includes/specials/SpecialWantedfiles.php26
-rw-r--r--includes/specials/SpecialWantedpages.php9
-rw-r--r--includes/specials/SpecialWatchlist.php93
-rw-r--r--includes/specials/SpecialWhatlinkshere.php61
-rw-r--r--includes/specials/SpecialWithoutinterwiki.php6
-rw-r--r--includes/templates/NoLocalSettings.php1
-rw-r--r--includes/templates/Usercreate.php238
-rw-r--r--includes/templates/Userlogin.php227
-rw-r--r--includes/upload/UploadBase.php100
-rw-r--r--includes/upload/UploadFromChunks.php276
-rw-r--r--includes/upload/UploadFromFile.php12
-rw-r--r--includes/upload/UploadFromStash.php4
-rw-r--r--includes/upload/UploadFromUrl.php26
-rw-r--r--includes/upload/UploadStash.php22
-rw-r--r--index.php13
-rw-r--r--index.php52
-rw-r--r--languages/Language.php926
-rw-r--r--languages/LanguageConverter.php88
-rw-r--r--languages/Names.php20
-rw-r--r--languages/classes/LanguageBe.php2
-rw-r--r--languages/classes/LanguageBe_tarask.php7
-rw-r--r--languages/classes/LanguageBs.php5
-rw-r--r--languages/classes/LanguageCy.php2
-rw-r--r--languages/classes/LanguageGd.php8
-rw-r--r--languages/classes/LanguageHe.php12
-rw-r--r--languages/classes/LanguageHu.php1
-rw-r--r--languages/classes/LanguageIu.php9
-rw-r--r--languages/classes/LanguageKk_cyrl.php2
-rw-r--r--languages/classes/LanguageLt.php6
-rw-r--r--languages/classes/LanguageMk.php2
-rw-r--r--languages/classes/LanguageMo.php3
-rw-r--r--languages/classes/LanguageMt.php4
-rw-r--r--languages/classes/LanguageQqx.php4
-rw-r--r--languages/classes/LanguageRo.php2
-rw-r--r--languages/classes/LanguageRu.php7
-rw-r--r--languages/classes/LanguageSgs.php2
-rw-r--r--languages/classes/LanguageShi.deps.php (renamed from languages/classes/LanguageSr_el.deps.php)4
-rw-r--r--languages/classes/LanguageShi.php202
-rw-r--r--languages/classes/LanguageSr.php31
-rw-r--r--languages/classes/LanguageTr.php4
-rw-r--r--languages/classes/LanguageUk.php5
-rw-r--r--languages/messages/MessagesAb.php9
-rw-r--r--languages/messages/MessagesAce.php10
-rw-r--r--languages/messages/MessagesAf.php542
-rw-r--r--languages/messages/MessagesAln.php55
-rw-r--r--languages/messages/MessagesAls.php2
-rw-r--r--languages/messages/MessagesAm.php66
-rw-r--r--languages/messages/MessagesAn.php511
-rw-r--r--languages/messages/MessagesAng.php41
-rw-r--r--languages/messages/MessagesAnp.php10
-rw-r--r--languages/messages/MessagesAr.php711
-rw-r--r--languages/messages/MessagesArc.php120
-rw-r--r--languages/messages/MessagesArn.php15
-rw-r--r--languages/messages/MessagesAry.php83
-rw-r--r--languages/messages/MessagesArz.php356
-rw-r--r--languages/messages/MessagesAs.php453
-rw-r--r--languages/messages/MessagesAst.php462
-rw-r--r--languages/messages/MessagesAv.php3
-rw-r--r--languages/messages/MessagesAvk.php47
-rw-r--r--languages/messages/MessagesAz.php164
-rw-r--r--languages/messages/MessagesBa.php465
-rw-r--r--languages/messages/MessagesBar.php55
-rw-r--r--languages/messages/MessagesBat_smg.php2
-rw-r--r--languages/messages/MessagesBcc.php60
-rw-r--r--languages/messages/MessagesBcl.php135
-rw-r--r--languages/messages/MessagesBe.php508
-rw-r--r--languages/messages/MessagesBe_tarask.php697
-rw-r--r--languages/messages/MessagesBg.php559
-rw-r--r--languages/messages/MessagesBh.php2
-rw-r--r--languages/messages/MessagesBho.php17
-rw-r--r--languages/messages/MessagesBjn.php286
-rw-r--r--languages/messages/MessagesBn.php245
-rw-r--r--languages/messages/MessagesBo.php76
-rw-r--r--languages/messages/MessagesBpy.php47
-rw-r--r--languages/messages/MessagesBqi.php5
-rw-r--r--languages/messages/MessagesBr.php537
-rw-r--r--languages/messages/MessagesBrh.php30
-rw-r--r--languages/messages/MessagesBs.php632
-rw-r--r--languages/messages/MessagesBug.php18
-rw-r--r--languages/messages/MessagesCa.php495
-rw-r--r--languages/messages/MessagesCbk_zam.php4
-rw-r--r--languages/messages/MessagesCdo.php14
-rw-r--r--languages/messages/MessagesCe.php309
-rw-r--r--languages/messages/MessagesCeb.php38
-rw-r--r--languages/messages/MessagesCh.php17
-rw-r--r--languages/messages/MessagesChr.php3
-rw-r--r--languages/messages/MessagesCkb.php72
-rw-r--r--languages/messages/MessagesCo.php5
-rw-r--r--languages/messages/MessagesCps.php16
-rw-r--r--languages/messages/MessagesCrh_cyrl.php49
-rw-r--r--languages/messages/MessagesCrh_latn.php47
-rw-r--r--languages/messages/MessagesCs.php700
-rw-r--r--languages/messages/MessagesCsb.php41
-rw-r--r--languages/messages/MessagesCu.php18
-rw-r--r--languages/messages/MessagesCv.php48
-rw-r--r--languages/messages/MessagesCy.php576
-rw-r--r--languages/messages/MessagesDa.php465
-rw-r--r--languages/messages/MessagesDe.php718
-rw-r--r--languages/messages/MessagesDe_ch.php3
-rw-r--r--languages/messages/MessagesDe_formal.php25
-rw-r--r--languages/messages/MessagesDiq.php60
-rw-r--r--languages/messages/MessagesDsb.php467
-rw-r--r--languages/messages/MessagesDtp.php36
-rw-r--r--languages/messages/MessagesDv.php4
-rw-r--r--languages/messages/MessagesDz.php5
-rw-r--r--languages/messages/MessagesEe.php11
-rw-r--r--languages/messages/MessagesEl.php527
-rw-r--r--languages/messages/MessagesEml.php5
-rw-r--r--languages/messages/MessagesEn.php665
-rw-r--r--languages/messages/MessagesEn_ca.php61
-rw-r--r--languages/messages/MessagesEn_gb.php35
-rw-r--r--languages/messages/MessagesEn_rtl.php (renamed from languages/messages/MessagesEnRTL.php)0
-rw-r--r--languages/messages/MessagesEo.php693
-rw-r--r--languages/messages/MessagesEs.php714
-rw-r--r--languages/messages/MessagesEt.php661
-rw-r--r--languages/messages/MessagesEu.php121
-rw-r--r--languages/messages/MessagesExt.php48
-rw-r--r--languages/messages/MessagesFa.php776
-rw-r--r--languages/messages/MessagesFf.php1
-rw-r--r--languages/messages/MessagesFi.php664
-rw-r--r--languages/messages/MessagesFiu_vro.php2
-rw-r--r--languages/messages/MessagesFj.php1
-rw-r--r--languages/messages/MessagesFo.php100
-rw-r--r--languages/messages/MessagesFr.php738
-rw-r--r--languages/messages/MessagesFrc.php13
-rw-r--r--languages/messages/MessagesFrp.php615
-rw-r--r--languages/messages/MessagesFrr.php52
-rw-r--r--languages/messages/MessagesFur.php34
-rw-r--r--languages/messages/MessagesFy.php45
-rw-r--r--languages/messages/MessagesGa.php107
-rw-r--r--languages/messages/MessagesGag.php18
-rw-r--r--languages/messages/MessagesGan.php2
-rw-r--r--languages/messages/MessagesGan_hans.php30
-rw-r--r--languages/messages/MessagesGan_hant.php34
-rw-r--r--languages/messages/MessagesGd.php27
-rw-r--r--languages/messages/MessagesGl.php572
-rw-r--r--languages/messages/MessagesGn.php6
-rw-r--r--languages/messages/MessagesGot.php23
-rw-r--r--languages/messages/MessagesGrc.php62
-rw-r--r--languages/messages/MessagesGsw.php224
-rw-r--r--languages/messages/MessagesGu.php497
-rw-r--r--languages/messages/MessagesGv.php34
-rw-r--r--languages/messages/MessagesHa.php9
-rw-r--r--languages/messages/MessagesHak.php44
-rw-r--r--languages/messages/MessagesHaw.php53
-rw-r--r--languages/messages/MessagesHe.php793
-rw-r--r--languages/messages/MessagesHi.php475
-rw-r--r--languages/messages/MessagesHif_latn.php102
-rw-r--r--languages/messages/MessagesHil.php80
-rw-r--r--languages/messages/MessagesHr.php521
-rw-r--r--languages/messages/MessagesHsb.php476
-rw-r--r--languages/messages/MessagesHt.php38
-rw-r--r--languages/messages/MessagesHu.php710
-rw-r--r--languages/messages/MessagesHy.php251
-rw-r--r--languages/messages/MessagesIa.php467
-rw-r--r--languages/messages/MessagesId.php490
-rw-r--r--languages/messages/MessagesIe.php49
-rw-r--r--languages/messages/MessagesIg.php87
-rw-r--r--languages/messages/MessagesIi.php2
-rw-r--r--languages/messages/MessagesIk.php1
-rw-r--r--languages/messages/MessagesIke_cans.php2
-rw-r--r--languages/messages/MessagesIke_latn.php2
-rw-r--r--languages/messages/MessagesIlo.php482
-rw-r--r--languages/messages/MessagesInh.php21
-rw-r--r--languages/messages/MessagesIo.php64
-rw-r--r--languages/messages/MessagesIs.php662
-rw-r--r--languages/messages/MessagesIt.php577
-rw-r--r--languages/messages/MessagesJa.php595
-rw-r--r--languages/messages/MessagesJam.php19
-rw-r--r--languages/messages/MessagesJbo.php7
-rw-r--r--languages/messages/MessagesJut.php15
-rw-r--r--languages/messages/MessagesJv.php54
-rw-r--r--languages/messages/MessagesKa.php418
-rw-r--r--languages/messages/MessagesKaa.php53
-rw-r--r--languages/messages/MessagesKab.php24
-rw-r--r--languages/messages/MessagesKbd_cyrl.php36
-rw-r--r--languages/messages/MessagesKhw.php47
-rw-r--r--languages/messages/MessagesKiu.php43
-rw-r--r--languages/messages/MessagesKk_arab.php301
-rw-r--r--languages/messages/MessagesKk_cn.php2
-rw-r--r--languages/messages/MessagesKk_cyrl.php304
-rw-r--r--languages/messages/MessagesKk_latn.php297
-rw-r--r--languages/messages/MessagesKk_tr.php2
-rw-r--r--languages/messages/MessagesKl.php21
-rw-r--r--languages/messages/MessagesKm.php300
-rw-r--r--languages/messages/MessagesKn.php39
-rw-r--r--languages/messages/MessagesKo.php726
-rw-r--r--languages/messages/MessagesKoi.php13
-rw-r--r--languages/messages/MessagesKrc.php63
-rw-r--r--languages/messages/MessagesKs_arab.php7
-rw-r--r--languages/messages/MessagesKs_deva.php3
-rw-r--r--languages/messages/MessagesKsh.php531
-rw-r--r--languages/messages/MessagesKu_latn.php104
-rw-r--r--languages/messages/MessagesKw.php20
-rw-r--r--languages/messages/MessagesKy.php5
-rw-r--r--languages/messages/MessagesLa.php57
-rw-r--r--languages/messages/MessagesLad.php46
-rw-r--r--languages/messages/MessagesLb.php476
-rw-r--r--languages/messages/MessagesLbe.php3
-rw-r--r--languages/messages/MessagesLez.php25
-rw-r--r--languages/messages/MessagesLfn.php6
-rw-r--r--languages/messages/MessagesLg.php29
-rw-r--r--languages/messages/MessagesLi.php496
-rw-r--r--languages/messages/MessagesLij.php10
-rw-r--r--languages/messages/MessagesLiv.php19
-rw-r--r--languages/messages/MessagesLmo.php18
-rw-r--r--languages/messages/MessagesLn.php11
-rw-r--r--languages/messages/MessagesLo.php12
-rw-r--r--languages/messages/MessagesLoz.php15
-rw-r--r--languages/messages/MessagesLt.php451
-rw-r--r--languages/messages/MessagesLtg.php15
-rw-r--r--languages/messages/MessagesLv.php169
-rw-r--r--languages/messages/MessagesLzh.php53
-rw-r--r--languages/messages/MessagesLzz.php9
-rw-r--r--languages/messages/MessagesMai.php235
-rw-r--r--languages/messages/MessagesMap_bms.php59
-rw-r--r--languages/messages/MessagesMdf.php53
-rw-r--r--languages/messages/MessagesMg.php213
-rw-r--r--languages/messages/MessagesMhr.php34
-rw-r--r--languages/messages/MessagesMin.php25
-rw-r--r--languages/messages/MessagesMk.php753
-rw-r--r--languages/messages/MessagesMl.php696
-rw-r--r--languages/messages/MessagesMn.php291
-rw-r--r--languages/messages/MessagesMo.php10
-rw-r--r--languages/messages/MessagesMr.php742
-rw-r--r--languages/messages/MessagesMrj.php14
-rw-r--r--languages/messages/MessagesMs.php533
-rw-r--r--languages/messages/MessagesMt.php460
-rw-r--r--languages/messages/MessagesMwl.php42
-rw-r--r--languages/messages/MessagesMy.php99
-rw-r--r--languages/messages/MessagesMyv.php188
-rw-r--r--languages/messages/MessagesMzn.php150
-rw-r--r--languages/messages/MessagesNa.php3
-rw-r--r--languages/messages/MessagesNah.php34
-rw-r--r--languages/messages/MessagesNan.php122
-rw-r--r--languages/messages/MessagesNap.php35
-rw-r--r--languages/messages/MessagesNb.php744
-rw-r--r--languages/messages/MessagesNds.php116
-rw-r--r--languages/messages/MessagesNds_nl.php835
-rw-r--r--languages/messages/MessagesNe.php325
-rw-r--r--languages/messages/MessagesNew.php3
-rw-r--r--languages/messages/MessagesNiu.php16
-rw-r--r--languages/messages/MessagesNl.php749
-rw-r--r--languages/messages/MessagesNl_informal.php1
-rw-r--r--languages/messages/MessagesNn.php366
-rw-r--r--languages/messages/MessagesNo.php3742
-rw-r--r--languages/messages/MessagesNov.php31
-rw-r--r--languages/messages/MessagesNso.php38
-rw-r--r--languages/messages/MessagesNv.php20
-rw-r--r--languages/messages/MessagesNy.php1
-rw-r--r--languages/messages/MessagesOc.php319
-rw-r--r--languages/messages/MessagesOm.php2
-rw-r--r--languages/messages/MessagesOr.php520
-rw-r--r--languages/messages/MessagesOs.php66
-rw-r--r--languages/messages/MessagesPa.php18
-rw-r--r--languages/messages/MessagesPag.php43
-rw-r--r--languages/messages/MessagesPam.php38
-rw-r--r--languages/messages/MessagesPap.php27
-rw-r--r--languages/messages/MessagesPcd.php13
-rw-r--r--languages/messages/MessagesPdc.php28
-rw-r--r--languages/messages/MessagesPdt.php23
-rw-r--r--languages/messages/MessagesPfl.php17
-rw-r--r--languages/messages/MessagesPi.php1
-rw-r--r--languages/messages/MessagesPih.php2
-rw-r--r--languages/messages/MessagesPl.php620
-rw-r--r--languages/messages/MessagesPms.php465
-rw-r--r--languages/messages/MessagesPnb.php487
-rw-r--r--languages/messages/MessagesPnt.php22
-rw-r--r--languages/messages/MessagesPrg.php58
-rw-r--r--languages/messages/MessagesPs.php200
-rw-r--r--languages/messages/MessagesPt.php670
-rw-r--r--languages/messages/MessagesPt_br.php504
-rw-r--r--languages/messages/MessagesQqq.php656
-rw-r--r--languages/messages/MessagesQu.php731
-rw-r--r--languages/messages/MessagesQug.php67
-rw-r--r--languages/messages/MessagesRgn.php11
-rw-r--r--languages/messages/MessagesRif.php5
-rw-r--r--languages/messages/MessagesRm.php91
-rw-r--r--languages/messages/MessagesRmy.php40
-rw-r--r--languages/messages/MessagesRo.php711
-rw-r--r--languages/messages/MessagesRoa_tara.php448
-rw-r--r--languages/messages/MessagesRu.php780
-rw-r--r--languages/messages/MessagesRue.php246
-rw-r--r--languages/messages/MessagesRup.php16
-rw-r--r--languages/messages/MessagesRuq.php2
-rw-r--r--languages/messages/MessagesRuq_cyrl.php8
-rw-r--r--languages/messages/MessagesRuq_latn.php8
-rw-r--r--languages/messages/MessagesSa.php252
-rw-r--r--languages/messages/MessagesSah.php464
-rw-r--r--languages/messages/MessagesSc.php50
-rw-r--r--languages/messages/MessagesScn.php56
-rw-r--r--languages/messages/MessagesSco.php25
-rw-r--r--languages/messages/MessagesSd.php103
-rw-r--r--languages/messages/MessagesSdc.php34
-rw-r--r--languages/messages/MessagesSe.php19
-rw-r--r--languages/messages/MessagesSei.php11
-rw-r--r--languages/messages/MessagesSg.php4
-rw-r--r--languages/messages/MessagesSgs.php29
-rw-r--r--languages/messages/MessagesSh.php640
-rw-r--r--languages/messages/MessagesShi.php79
-rw-r--r--languages/messages/MessagesSi.php550
-rw-r--r--languages/messages/MessagesSk.php588
-rw-r--r--languages/messages/MessagesSl.php540
-rw-r--r--languages/messages/MessagesSli.php51
-rw-r--r--languages/messages/MessagesSma.php8
-rw-r--r--languages/messages/MessagesSn.php4
-rw-r--r--languages/messages/MessagesSo.php70
-rw-r--r--languages/messages/MessagesSq.php450
-rw-r--r--languages/messages/MessagesSr.php18
-rw-r--r--languages/messages/MessagesSr_ec.php780
-rw-r--r--languages/messages/MessagesSr_el.php660
-rw-r--r--languages/messages/MessagesSrn.php82
-rw-r--r--languages/messages/MessagesSt.php1
-rw-r--r--languages/messages/MessagesStq.php66
-rw-r--r--languages/messages/MessagesSu.php127
-rw-r--r--languages/messages/MessagesSv.php706
-rw-r--r--languages/messages/MessagesSw.php210
-rw-r--r--languages/messages/MessagesSzl.php95
-rw-r--r--languages/messages/MessagesTa.php486
-rw-r--r--languages/messages/MessagesTcy.php19
-rw-r--r--languages/messages/MessagesTe.php202
-rw-r--r--languages/messages/MessagesTet.php14
-rw-r--r--languages/messages/MessagesTg_cyrl.php50
-rw-r--r--languages/messages/MessagesTg_latn.php50
-rw-r--r--languages/messages/MessagesTh.php297
-rw-r--r--languages/messages/MessagesTi.php3
-rw-r--r--languages/messages/MessagesTk.php58
-rw-r--r--languages/messages/MessagesTl.php121
-rw-r--r--languages/messages/MessagesTn.php14
-rw-r--r--languages/messages/MessagesTo.php20
-rw-r--r--languages/messages/MessagesTpi.php24
-rw-r--r--languages/messages/MessagesTr.php619
-rw-r--r--languages/messages/MessagesTs.php3
-rw-r--r--languages/messages/MessagesTt.php2
-rw-r--r--languages/messages/MessagesTt_cyrl.php116
-rw-r--r--languages/messages/MessagesTt_latn.php86
-rw-r--r--languages/messages/MessagesTy.php8
-rw-r--r--languages/messages/MessagesTyv.php6
-rw-r--r--languages/messages/MessagesUdm.php3
-rw-r--r--languages/messages/MessagesUg_arab.php130
-rw-r--r--languages/messages/MessagesUg_latn.php5
-rw-r--r--languages/messages/MessagesUk.php771
-rw-r--r--languages/messages/MessagesUr.php28
-rw-r--r--languages/messages/MessagesUz.php10
-rw-r--r--languages/messages/MessagesVe.php1
-rw-r--r--languages/messages/MessagesVec.php59
-rw-r--r--languages/messages/MessagesVep.php210
-rw-r--r--languages/messages/MessagesVi.php660
-rw-r--r--languages/messages/MessagesVls.php4
-rw-r--r--languages/messages/MessagesVmf.php13
-rw-r--r--languages/messages/MessagesVo.php68
-rw-r--r--languages/messages/MessagesVot.php11
-rw-r--r--languages/messages/MessagesVro.php32
-rw-r--r--languages/messages/MessagesWa.php63
-rw-r--r--languages/messages/MessagesWar.php186
-rw-r--r--languages/messages/MessagesWo.php50
-rw-r--r--languages/messages/MessagesWuu.php45
-rw-r--r--languages/messages/MessagesXal.php19
-rw-r--r--languages/messages/MessagesXh.php1
-rw-r--r--languages/messages/MessagesXmf.php23
-rw-r--r--languages/messages/MessagesYi.php250
-rw-r--r--languages/messages/MessagesYo.php222
-rw-r--r--languages/messages/MessagesYue.php63
-rw-r--r--languages/messages/MessagesZa.php16
-rw-r--r--languages/messages/MessagesZea.php31
-rw-r--r--languages/messages/MessagesZh.php3
-rw-r--r--languages/messages/MessagesZh_hans.php512
-rw-r--r--languages/messages/MessagesZh_hant.php464
-rw-r--r--languages/messages/MessagesZh_hk.php3
-rw-r--r--languages/messages/MessagesZh_mo.php2
-rw-r--r--languages/messages/MessagesZh_my.php2
-rw-r--r--languages/messages/MessagesZh_tw.php10
-rw-r--r--languages/messages/MessagesZu.php5
-rw-r--r--maintenance/Doxyfile180
-rw-r--r--maintenance/Maintenance.php102
-rw-r--r--maintenance/Makefile7
-rw-r--r--maintenance/Site.php19
-rw-r--r--maintenance/addwiki.php479
-rw-r--r--maintenance/archives/patch-ar_sha1.sql3
-rw-r--r--maintenance/archives/patch-drop-user_options.sql1
-rw-r--r--maintenance/archives/patch-jobs-add-timestamp.sql2
-rw-r--r--maintenance/archives/patch-logging-type-action-index.sql1
-rw-r--r--maintenance/archives/patch-page_redirect_namespace_len.sql6
-rw-r--r--maintenance/archives/patch-rev_sha1.sql3
-rw-r--r--maintenance/archives/patch-trackbacks.sql10
-rw-r--r--maintenance/archives/patch-ufg_group-length-increase.sql2
-rw-r--r--maintenance/archives/patch-ug_group-length-increase.sql2
-rw-r--r--maintenance/archives/patch-uploadstash_chunk.sql3
-rw-r--r--maintenance/archives/patch-user_former_groups.sql2
-rw-r--r--maintenance/attachLatest.php4
-rw-r--r--maintenance/backup.inc14
-rw-r--r--maintenance/backupPrefetch.inc5
-rw-r--r--maintenance/benchmarks/Benchmarker.php3
-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_wfIsWindows.php4
-rw-r--r--maintenance/benchmarks/benchmarkHooks.php80
-rw-r--r--maintenance/benchmarks/benchmarkPurge.php6
-rw-r--r--maintenance/changePassword.php2
-rw-r--r--maintenance/checkImages.php4
-rw-r--r--maintenance/checkSyntax.php10
-rw-r--r--maintenance/cleanupCaps.php13
-rw-r--r--maintenance/cleanupImages.php17
-rw-r--r--maintenance/cleanupSpam.php28
-rw-r--r--maintenance/cleanupTable.inc2
-rw-r--r--maintenance/cleanupTitles.php3
-rw-r--r--maintenance/cleanupUploadStash.php34
-rw-r--r--maintenance/clear_stats.php3
-rw-r--r--maintenance/commandLine.inc12
-rw-r--r--maintenance/convertUserOptions.php33
-rw-r--r--maintenance/deleteBatch.php39
-rw-r--r--maintenance/deleteDefaultMessages.php18
-rw-r--r--maintenance/dev/README7
-rw-r--r--maintenance/dev/includes/php.sh12
-rw-r--r--maintenance/dev/includes/require-php.sh8
-rw-r--r--maintenance/dev/includes/router.php82
-rw-r--r--maintenance/dev/install.sh8
-rw-r--r--maintenance/dev/installmw.sh18
-rw-r--r--maintenance/dev/installphp.sh57
-rw-r--r--maintenance/dev/start.sh14
-rw-r--r--maintenance/doMaintenance.php22
-rw-r--r--maintenance/dtrace/counts.d23
-rw-r--r--maintenance/dtrace/tree.d26
-rw-r--r--maintenance/dumpBackup.php2
-rw-r--r--maintenance/dumpHTML.php7
-rw-r--r--maintenance/dumpInterwiki.php251
-rw-r--r--maintenance/dumpLinks.php2
-rw-r--r--maintenance/dumpTextPass.php52
-rw-r--r--maintenance/edit.php4
-rw-r--r--maintenance/eval.php13
-rw-r--r--maintenance/fetchText.php2
-rw-r--r--maintenance/findHooks.php34
-rw-r--r--maintenance/fixExtLinksProtocolRelative.php4
-rw-r--r--maintenance/formatInstallDoc.php3
-rw-r--r--maintenance/fuzz-tester.php165
-rw-r--r--maintenance/gearman/gearman.inc104
-rw-r--r--maintenance/gearman/gearmanRefreshLinks.php45
-rw-r--r--maintenance/gearman/gearmanWorker.php43
-rw-r--r--maintenance/generateSitemap.php31
-rw-r--r--maintenance/getSlaveServer.php14
-rw-r--r--maintenance/hiphop/extra-files1
-rw-r--r--maintenance/hiphop/make3
-rw-r--r--maintenance/ibm_db2/foreignkeys.sql5
-rw-r--r--maintenance/ibm_db2/tables.sql984
-rw-r--r--maintenance/importDump.php32
-rw-r--r--maintenance/importImages.php390
-rw-r--r--maintenance/importSiteScripts.php22
-rw-r--r--maintenance/importTextFile.php4
-rw-r--r--maintenance/importUseModWiki.php375
-rw-r--r--maintenance/importUseModWikipedia.php892
-rw-r--r--maintenance/install.php1
-rw-r--r--maintenance/jsparse.php1
-rw-r--r--maintenance/language/StatOutputs.php4
-rw-r--r--maintenance/language/checkLanguage.inc10
-rw-r--r--maintenance/language/function-list.php63
-rw-r--r--maintenance/language/generateCollationData.php23
-rw-r--r--maintenance/language/languages.inc112
-rw-r--r--maintenance/language/messageTypes.inc33
-rw-r--r--maintenance/language/messages.inc280
-rw-r--r--maintenance/language/transstat.php4
-rw-r--r--maintenance/language/writeMessagesArray.inc3
-rw-r--r--maintenance/locking/LockServerDaemon.php617
-rw-r--r--maintenance/locking/file_locks.sql11
-rw-r--r--maintenance/mctest.php5
-rw-r--r--maintenance/mergeMessageFileList.php79
-rw-r--r--maintenance/moveBatch.php3
-rw-r--r--maintenance/mssql/tables.sql10
-rw-r--r--maintenance/mwdocgen.php69
-rw-r--r--maintenance/namespaceDupes.php20
-rw-r--r--maintenance/nextJobDB.php10
-rw-r--r--maintenance/nukeNS.php6
-rw-r--r--maintenance/oracle/archives/patch-ar_sha1_field.sql3
-rw-r--r--maintenance/oracle/archives/patch-config.sql8
-rw-r--r--maintenance/oracle/archives/patch-job_timestamp_field.sql4
-rw-r--r--maintenance/oracle/archives/patch-job_timestamp_index.sql4
-rw-r--r--maintenance/oracle/archives/patch-logging_type_action_index.sql4
-rw-r--r--maintenance/oracle/archives/patch-page_redirect_namespace_len.sql4
-rw-r--r--maintenance/oracle/archives/patch-rev_sha1_field.sql4
-rw-r--r--maintenance/oracle/archives/patch-ug_group-length-increase.sql3
-rw-r--r--maintenance/oracle/archives/patch-us_chunk_inx_field.sql4
-rw-r--r--maintenance/oracle/archives/patch_fk_rename_deferred.sql1
-rw-r--r--maintenance/oracle/archives/patch_rebuild_dupfunc.sql11
-rw-r--r--maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql3
-rw-r--r--maintenance/oracle/tables.sql75
-rw-r--r--maintenance/orphans.php11
-rw-r--r--maintenance/ourusers.php70
-rw-r--r--maintenance/parse.php110
-rw-r--r--maintenance/populateCategory.php2
-rw-r--r--maintenance/populateImageSha1.php (renamed from maintenance/populateSha1.php)38
-rw-r--r--maintenance/populateLogSearch.php42
-rw-r--r--maintenance/populateLogUsertext.php29
-rw-r--r--maintenance/populateParentId.php39
-rw-r--r--maintenance/populateRevisionLength.php44
-rw-r--r--maintenance/populateRevisionSha1.php185
-rw-r--r--maintenance/postgres/mediawiki_mysql2postgres.pl2
-rw-r--r--maintenance/postgres/tables.sql23
-rw-r--r--maintenance/protect.php25
-rw-r--r--maintenance/proxy_check.php1
-rw-r--r--maintenance/pruneFileCache.php105
-rw-r--r--maintenance/purgeDeletedFiles.php89
-rw-r--r--maintenance/purgeList.php2
-rw-r--r--maintenance/purgeParserCache.php26
-rw-r--r--maintenance/purgeStaleMemcachedText.php4
-rw-r--r--maintenance/reassignEdits.php7
-rw-r--r--maintenance/rebuildFileCache.php67
-rw-r--r--maintenance/rebuildImages.php26
-rw-r--r--maintenance/rebuildInterwiki.php275
-rw-r--r--maintenance/rebuildrecentchanges.php4
-rw-r--r--maintenance/rebuildtextindex.php2
-rw-r--r--maintenance/refreshImageMetadata.php12
-rw-r--r--maintenance/refreshLinks.php15
-rw-r--r--maintenance/removeUnusedAccounts.php2
-rw-r--r--maintenance/renamewiki.php89
-rw-r--r--maintenance/rollbackEdits.php9
-rw-r--r--maintenance/runBatchedQuery.php1
-rw-r--r--maintenance/runJobs.php6
-rw-r--r--maintenance/showJobs.php2
-rw-r--r--maintenance/showStats.php3
-rw-r--r--maintenance/sql.php74
-rw-r--r--maintenance/sqlite.php4
-rw-r--r--maintenance/sqlite/archives/initial-indexes.sql5
-rw-r--r--maintenance/sqlite/archives/patch-drop-user_options.sql31
-rw-r--r--maintenance/sqlite/archives/patch-jobs-add-timestamp.sql2
-rw-r--r--maintenance/sqlite/archives/patch-page_redirect_namespace_len.sql7
-rw-r--r--maintenance/sqlite/archives/patch-ufg_group-length-increase.sql15
-rw-r--r--maintenance/sqlite/archives/patch-ug_group-length-increase.sql15
-rw-r--r--maintenance/stats.php4
-rw-r--r--maintenance/storage/checkStorage.php39
-rw-r--r--maintenance/storage/compressOld.php19
-rw-r--r--maintenance/storage/fixBug20757.php3
-rw-r--r--maintenance/storage/recompressTracked.php7
-rw-r--r--maintenance/tables.sql54
-rw-r--r--maintenance/term/MWTerm.php50
-rw-r--r--maintenance/undelete.php3
-rw-r--r--maintenance/update.php6
-rw-r--r--maintenance/updateCollation.php8
-rw-r--r--maintenance/upgrade1_5.php14
-rw-r--r--maintenance/userOptions.inc34
-rw-r--r--maintenance/userOptions.php2
-rw-r--r--maintenance/wikipedia-interwiki.sql289
-rw-r--r--maintenance/wiktionary-interwiki.sql184
-rw-r--r--mw-config/index.php6
-rw-r--r--profileinfo.php15
-rw-r--r--redirect.php2
-rw-r--r--resources/Resources.php455
-rw-r--r--resources/jquery.effects/jquery.effects.blind.js12
-rw-r--r--resources/jquery.effects/jquery.effects.bounce.js12
-rw-r--r--resources/jquery.effects/jquery.effects.clip.js12
-rw-r--r--resources/jquery.effects/jquery.effects.core.js131
-rw-r--r--resources/jquery.effects/jquery.effects.drop.js12
-rw-r--r--resources/jquery.effects/jquery.effects.explode.js10
-rw-r--r--resources/jquery.effects/jquery.effects.fade.js32
-rw-r--r--resources/jquery.effects/jquery.effects.fold.js12
-rw-r--r--resources/jquery.effects/jquery.effects.highlight.js10
-rw-r--r--resources/jquery.effects/jquery.effects.pulsate.js10
-rw-r--r--resources/jquery.effects/jquery.effects.scale.js14
-rw-r--r--resources/jquery.effects/jquery.effects.shake.js12
-rw-r--r--resources/jquery.effects/jquery.effects.slide.js14
-rw-r--r--resources/jquery.effects/jquery.effects.transfer.js10
-rw-r--r--resources/jquery.tipsy/jquery.tipsy.css17
-rw-r--r--resources/jquery.tipsy/jquery.tipsy.js17
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-af.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js17
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-az.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-da.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-de.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-el.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-et.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js24
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-he.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js14
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js23
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js6
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-no.js38
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js6
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js22
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js21
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-th.js4
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js3
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js2
-rw-r--r--resources/jquery.ui/jquery.ui.accordion.js14
-rw-r--r--resources/jquery.ui/jquery.ui.autocomplete.js16
-rw-r--r--resources/jquery.ui/jquery.ui.button.js103
-rw-r--r--resources/jquery.ui/jquery.ui.core.js52
-rw-r--r--resources/jquery.ui/jquery.ui.datepicker.js335
-rw-r--r--resources/jquery.ui/jquery.ui.dialog.js45
-rw-r--r--resources/jquery.ui/jquery.ui.draggable.js106
-rw-r--r--resources/jquery.ui/jquery.ui.droppable.js17
-rw-r--r--resources/jquery.ui/jquery.ui.mouse.js18
-rw-r--r--resources/jquery.ui/jquery.ui.position.js54
-rw-r--r--resources/jquery.ui/jquery.ui.progressbar.js5
-rw-r--r--resources/jquery.ui/jquery.ui.resizable.js40
-rw-r--r--resources/jquery.ui/jquery.ui.selectable.js13
-rw-r--r--resources/jquery.ui/jquery.ui.slider.js62
-rw-r--r--resources/jquery.ui/jquery.ui.sortable.js31
-rw-r--r--resources/jquery.ui/jquery.ui.tabs.js4
-rw-r--r--resources/jquery.ui/jquery.ui.widget.js32
-rw-r--r--resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gifbin1553 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.pngbin182 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.pngbin178 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.pngbin180 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.pngbin180 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.pngbin180 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.pngbin182 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.pngbin0 -> 120 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 105 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.pngbin0 -> 111 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.pngbin0 -> 110 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.pngbin0 -> 119 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.pngbin0 -> 101 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.pngbin4369 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.pngbin5355 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.pngbin4369 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.pngbin4369 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.pngbin4369 -> 4369 bytes
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.accordion.css17
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.autocomplete.css23
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.button.css25
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.core.css23
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.datepicker.css37
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.dialog.css20
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.progressbar.css13
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.resizable.css13
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.selectable.css13
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.slider.css11
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.tabs.css11
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.theme.css83
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-green.pngbin126 -> 1033 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-green.pngbin170 -> 1042 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-green.pngbin216 -> 1035 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-green.pngbin216 -> 1035 bytes
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.datepicker.css2
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.dialog.css2
-rw-r--r--resources/jquery/images/jquery.arrowSteps.divider-ltr.pngbin0 -> 307 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.divider-rtl.pngbin0 -> 310 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.head-ltr.pngbin0 -> 939 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.head-rtl.pngbin0 -> 1006 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.tail-ltr.pngbin0 -> 338 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.tail-rtl.pngbin0 -> 485 bytes
-rw-r--r--resources/jquery/images/marker.pngbin0 -> 652 bytes
-rw-r--r--resources/jquery/images/mask.pngbin0 -> 2020 bytes
-rw-r--r--resources/jquery/images/spinner.gifbin0 -> 4648 bytes
-rw-r--r--resources/jquery/images/wheel.pngbin0 -> 11733 bytes
-rw-r--r--resources/jquery/jquery.arrowSteps.css45
-rw-r--r--resources/jquery/jquery.arrowSteps.js81
-rw-r--r--resources/jquery/jquery.autoEllipsis.js8
-rw-r--r--resources/jquery/jquery.byteLimit.js61
-rw-r--r--resources/jquery/jquery.checkboxShiftClick.js6
-rw-r--r--resources/jquery/jquery.client.js34
-rw-r--r--resources/jquery/jquery.collapsibleTabs.js10
-rw-r--r--resources/jquery/jquery.color.js8
-rw-r--r--resources/jquery/jquery.cycle.all.js1529
-rw-r--r--resources/jquery/jquery.expandableField.js2
-rw-r--r--resources/jquery/jquery.farbtastic.css54
-rw-r--r--resources/jquery/jquery.farbtastic.js286
-rw-r--r--resources/jquery/jquery.footHovzer.css6
-rw-r--r--resources/jquery/jquery.footHovzer.js45
-rw-r--r--resources/jquery/jquery.form.js310
-rw-r--r--resources/jquery/jquery.js3166
-rw-r--r--resources/jquery/jquery.makeCollapsible.js52
-rw-r--r--resources/jquery/jquery.messageBox.js20
-rw-r--r--resources/jquery/jquery.mockjax.js382
-rw-r--r--resources/jquery/jquery.mw-jump.js15
-rw-r--r--resources/jquery/jquery.mwExtension.js121
-rw-r--r--resources/jquery/jquery.mwPrototypes.js120
-rw-r--r--resources/jquery/jquery.placeholder.js4
-rw-r--r--resources/jquery/jquery.qunit.completenessTest.js36
-rw-r--r--resources/jquery/jquery.qunit.css21
-rw-r--r--resources/jquery/jquery.qunit.js783
-rw-r--r--resources/jquery/jquery.spinner.css12
-rw-r--r--resources/jquery/jquery.spinner.js44
-rw-r--r--resources/jquery/jquery.suggestions.css13
-rw-r--r--resources/jquery/jquery.suggestions.js150
-rw-r--r--resources/jquery/jquery.tabIndex.js8
-rw-r--r--resources/jquery/jquery.tablesorter.css12
-rw-r--r--resources/jquery/jquery.tablesorter.js15
-rw-r--r--resources/jquery/jquery.textSelection.js116
-rw-r--r--resources/jquery/jquery.validate.js1166
-rw-r--r--resources/jquery/jquery.xmldom.js46
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.js165
-rw-r--r--resources/mediawiki.action/mediawiki.action.history.js135
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js12
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.metadata.js2
-rw-r--r--resources/mediawiki.action/mediawiki.action.watch.ajax.js271
-rw-r--r--resources/mediawiki.api/mediawiki.api.category.js105
-rw-r--r--resources/mediawiki.api/mediawiki.api.edit.js119
-rw-r--r--resources/mediawiki.api/mediawiki.api.js224
-rw-r--r--resources/mediawiki.api/mediawiki.api.parse.js31
-rw-r--r--resources/mediawiki.api/mediawiki.api.titleblacklist.js51
-rw-r--r--resources/mediawiki.api/mediawiki.api.watch.js58
-rw-r--r--resources/mediawiki.language/languages/cs.js2
-rw-r--r--resources/mediawiki.language/languages/lt.js3
-rw-r--r--resources/mediawiki.language/languages/mk.js2
-rw-r--r--resources/mediawiki.language/languages/se.js10
-rw-r--r--resources/mediawiki.language/languages/sma.js11
-rw-r--r--resources/mediawiki.language/mediawiki.language.js30
-rw-r--r--resources/mediawiki.page/images/AJAXCategorySprite.pngbin384 -> 0 bytes
-rw-r--r--resources/mediawiki.page/mediawiki.page.ajaxCategories.css64
-rw-r--r--resources/mediawiki.page/mediawiki.page.ready.js2
-rw-r--r--resources/mediawiki.page/mediawiki.page.startup.js14
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeemail.css (renamed from resources/mediawiki.special/mediawiki.special.preferences.css)6
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeemail.js40
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeslist.css9
-rw-r--r--resources/mediawiki.special/mediawiki.special.javaScriptTest.js33
-rw-r--r--resources/mediawiki.special/mediawiki.special.movePage.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.preferences.js43
-rw-r--r--resources/mediawiki.special/mediawiki.special.recentchanges.js8
-rw-r--r--resources/mediawiki.special/mediawiki.special.search.css10
-rw-r--r--resources/mediawiki.special/mediawiki.special.search.js4
-rw-r--r--resources/mediawiki.special/mediawiki.special.upload.js83
-rw-r--r--resources/mediawiki/mediawiki.Uri.js327
-rw-r--r--resources/mediawiki/mediawiki.debug.css185
-rw-r--r--resources/mediawiki/mediawiki.debug.init.js3
-rw-r--r--resources/mediawiki/mediawiki.debug.js351
-rw-r--r--resources/mediawiki/mediawiki.feedback.css9
-rw-r--r--resources/mediawiki/mediawiki.feedback.js242
-rw-r--r--resources/mediawiki/mediawiki.feedback.spinner.gifbin0 -> 1108 bytes
-rw-r--r--resources/mediawiki/mediawiki.htmlform.js6
-rw-r--r--resources/mediawiki/mediawiki.jqueryMsg.js685
-rw-r--r--resources/mediawiki/mediawiki.jqueryMsg.peg76
-rw-r--r--resources/mediawiki/mediawiki.js2342
-rw-r--r--resources/mediawiki/mediawiki.log.js95
-rw-r--r--resources/mediawiki/mediawiki.user.js12
-rw-r--r--resources/mediawiki/mediawiki.util.js410
-rw-r--r--skins/ArchLinux.php53
-rw-r--r--skins/Chick.php5
-rw-r--r--skins/CologneBlue.php78
-rw-r--r--skins/Modern.php13
-rw-r--r--skins/MonoBook.php53
-rw-r--r--skins/Nostalgia.php35
-rw-r--r--skins/Simple.php10
-rw-r--r--skins/Standard.php84
-rw-r--r--skins/Vector.php76
-rw-r--r--skins/archlinux/IE50Fixes.css67
-rw-r--r--skins/archlinux/IE55Fixes.css85
-rw-r--r--skins/archlinux/IE60Fixes.css3
-rw-r--r--skins/archlinux/IE70Fixes.css6
-rw-r--r--skins/archlinux/main.css430
-rw-r--r--skins/chick/IE50Fixes.css67
-rw-r--r--skins/chick/IE55Fixes.css81
-rw-r--r--skins/chick/IE60Fixes.css6
-rw-r--r--skins/chick/main.css18
-rw-r--r--skins/cologneblue/screen.css13
-rw-r--r--skins/common/IE80Fixes.css2
-rw-r--r--skins/common/IEFixes.js5
-rw-r--r--skins/common/ajax.js4
-rw-r--r--skins/common/commonContent.css122
-rw-r--r--skins/common/commonElements.css251
-rw-r--r--skins/common/commonInterface.css64
-rw-r--r--skins/common/commonPrint.css113
-rw-r--r--skins/common/config-cc.css55
-rw-r--r--skins/common/config.css3
-rw-r--r--skins/common/config.js4
-rw-r--r--skins/common/images/add.pngbin3222 -> 555 bytes
-rw-r--r--skins/common/images/cc-0.pngbin1124 -> 1103 bytes
-rw-r--r--skins/common/images/cc-by.pngbin4739 -> 4063 bytes
-rw-r--r--skins/common/images/closewindow19x19.pngbin0 -> 3357 bytes
-rw-r--r--skins/common/images/critical-32.pngbin1914 -> 1892 bytes
-rw-r--r--skins/common/images/sort_both.gifbin1184 -> 0 bytes
-rw-r--r--skins/common/images/sort_down.gifbin464 -> 0 bytes
-rw-r--r--skins/common/images/sort_up.gifbin466 -> 0 bytes
-rw-r--r--skins/common/mwsuggest.js14
-rw-r--r--skins/common/oldshared.css20
-rw-r--r--skins/common/preview.js4
-rw-r--r--skins/common/protect.js26
-rw-r--r--skins/common/shared.css512
-rw-r--r--skins/common/upload.js77
-rw-r--r--skins/common/wikibits.js48
-rw-r--r--skins/common/wikiprintable.css43
-rw-r--r--skins/common/wikistandard.css10
-rw-r--r--skins/modern/main.css48
-rw-r--r--skins/monobook/IE50Fixes.css67
-rw-r--r--skins/monobook/IE55Fixes.css85
-rw-r--r--skins/monobook/IE60Fixes.css3
-rw-r--r--skins/monobook/IE70Fixes.css6
-rw-r--r--skins/monobook/main.css430
-rw-r--r--skins/nostalgia/screen.css5
-rw-r--r--skins/simple/main.css377
-rw-r--r--skins/vector/images/arrow-down-focus-icon.pngbin0 -> 175 bytes
-rw-r--r--skins/vector/images/arrow-down-icon.pngbin241 -> 188 bytes
-rw-r--r--skins/vector/screen.css404
-rw-r--r--skins/vector/vector.js30
-rw-r--r--tests/TestsAutoLoader.php3
-rw-r--r--tests/jasmine/.htaccess1
-rw-r--r--tests/jasmine/SpecRunner.html42
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE20
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js188
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine.css166
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine.js2421
-rw-r--r--tests/jasmine/spec/mediawiki.Uri.spec.js307
-rw-r--r--tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js488
-rw-r--r--tests/jasmine/spec/mediawiki.jqueryMsg.spec.js389
-rw-r--r--tests/jasmine/spec_makers/makeJqueryMsgSpec.php114
-rw-r--r--tests/parser/README8
-rw-r--r--tests/parser/parserTest.inc124
-rw-r--r--tests/parser/parserTests.txt382
-rw-r--r--tests/parser/parserTestsParserHook.php26
-rw-r--r--tests/parser/parserTestsStaticParserHook.php58
-rw-r--r--tests/parser/preprocess/All_system_messages.expected2
-rw-r--r--tests/parser/preprocess/Factorial.expected2
-rw-r--r--tests/parserTests.php9
-rw-r--r--tests/phpunit/Makefile17
-rw-r--r--tests/phpunit/MediaWikiLangTestCase.php6
-rw-r--r--tests/phpunit/MediaWikiPHPUnitCommand.php30
-rw-r--r--tests/phpunit/MediaWikiTestCase.php113
-rw-r--r--tests/phpunit/StructureTest.php56
-rw-r--r--tests/phpunit/data/db/mysql/functions.sql12
-rw-r--r--tests/phpunit/data/db/postgres/functions.sql12
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.13.sql (renamed from tests/phpunit/includes/db/sqlite/tables-1.13.sql)2
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.15.sql (renamed from tests/phpunit/includes/db/sqlite/tables-1.15.sql)4
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.16.sql (renamed from tests/phpunit/includes/db/sqlite/tables-1.16.sql)0
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.17.sql (renamed from tests/phpunit/includes/db/sqlite/tables-1.17.sql)0
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.18.sql535
-rw-r--r--tests/phpunit/data/media/80x60-2layers.xcfbin0 -> 1162 bytes
-rw-r--r--tests/phpunit/data/media/80x60-Greyscale.xcfbin0 -> 667 bytes
-rw-r--r--tests/phpunit/data/media/80x60-RGB.xcfbin0 -> 677 bytes
-rw-r--r--tests/phpunit/data/media/Toll_Texas_1.svg150
-rw-r--r--tests/phpunit/data/media/iptc-invalid-psir.jpgbin0 -> 9574 bytes
-rw-r--r--tests/phpunit/includes/ArticleTablesTest.php31
-rw-r--r--tests/phpunit/includes/ArticleTest.php14
-rw-r--r--tests/phpunit/includes/BlockTest.php17
-rw-r--r--tests/phpunit/includes/EditPageTest.php33
-rw-r--r--tests/phpunit/includes/ExtraParserTest.php64
-rw-r--r--tests/phpunit/includes/FormOptionsInitializationTest.php4
-rw-r--r--tests/phpunit/includes/FormOptionsTest.php4
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalTest.php524
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php29
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php111
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php133
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php36
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php (renamed from tests/phpunit/includes/GlobalFunctions/wfExpandUrl.php)22
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php90
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php28
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php134
-rw-r--r--tests/phpunit/includes/HtmlTest.php277
-rw-r--r--tests/phpunit/includes/HttpTest.php556
-rw-r--r--tests/phpunit/includes/IPTest.php32
-rw-r--r--tests/phpunit/includes/LocalFileTest.php33
-rw-r--r--tests/phpunit/includes/MWNamespaceTest.php329
-rw-r--r--tests/phpunit/includes/MessageTest.php2
-rw-r--r--tests/phpunit/includes/ParserOptionsTest.php9
-rw-r--r--tests/phpunit/includes/PathRouterTest.php254
-rw-r--r--tests/phpunit/includes/Providers.php4
-rw-r--r--tests/phpunit/includes/ResourceLoaderTest.php2
-rw-r--r--tests/phpunit/includes/SanitizerTest.php43
-rw-r--r--tests/phpunit/includes/SanitizerValidateEmailTest.php (renamed from tests/phpunit/includes/UserIsValidEmailAddrTest.php)4
-rw-r--r--tests/phpunit/includes/SeleniumConfigurationTest.php24
-rw-r--r--tests/phpunit/includes/TemplateCategoriesTest.php38
-rw-r--r--tests/phpunit/includes/TitleMethodsTest.php78
-rw-r--r--tests/phpunit/includes/TitlePermissionTest.php34
-rw-r--r--tests/phpunit/includes/TitleTest.php4
-rw-r--r--tests/phpunit/includes/UserTest.php105
-rw-r--r--tests/phpunit/includes/WebRequestTest.php97
-rw-r--r--tests/phpunit/includes/XmlSelectTest.php4
-rw-r--r--tests/phpunit/includes/XmlTest.php99
-rw-r--r--tests/phpunit/includes/api/ApiBlockTest.php28
-rw-r--r--tests/phpunit/includes/api/ApiPurgeTest.php34
-rw-r--r--tests/phpunit/includes/api/ApiQueryTest.php8
-rw-r--r--tests/phpunit/includes/api/ApiTest.php36
-rw-r--r--tests/phpunit/includes/api/ApiTestCase.php51
-rw-r--r--tests/phpunit/includes/api/ApiTestCaseUpload.php40
-rw-r--r--tests/phpunit/includes/api/ApiTestUser.php2
-rw-r--r--tests/phpunit/includes/api/ApiUploadTest.php197
-rw-r--r--tests/phpunit/includes/api/ApiWatchTest.php5
-rw-r--r--tests/phpunit/includes/api/RandomImageGenerator.php124
-rw-r--r--tests/phpunit/includes/db/DatabaseSqliteTest.php14
-rw-r--r--tests/phpunit/includes/db/DatabaseTest.php32
-rw-r--r--tests/phpunit/includes/debug/MWDebugTest.php63
-rw-r--r--tests/phpunit/includes/filerepo/FileBackendTest.php1358
-rw-r--r--tests/phpunit/includes/filerepo/FileRepoTest.php41
-rw-r--r--tests/phpunit/includes/filerepo/StoreBatchTest.php122
-rw-r--r--tests/phpunit/includes/json/ServicesJsonTest.php93
-rw-r--r--tests/phpunit/includes/libs/JavaScriptMinifierTest.php43
-rw-r--r--tests/phpunit/includes/media/BitmapMetadataHandlerTest.php26
-rw-r--r--tests/phpunit/includes/media/BitmapScalingTest.php25
-rw-r--r--tests/phpunit/includes/media/ExifBitmapTest.php24
-rw-r--r--tests/phpunit/includes/media/ExifRotationTest.php59
-rw-r--r--tests/phpunit/includes/media/ExifTest.php9
-rw-r--r--tests/phpunit/includes/media/FormatMetadataTest.php39
-rw-r--r--tests/phpunit/includes/media/GIFMetadataExtractorTest.php1
-rw-r--r--tests/phpunit/includes/media/GIFTest.php31
-rw-r--r--tests/phpunit/includes/media/JpegMetadataExtractorTest.php10
-rw-r--r--tests/phpunit/includes/media/JpegTest.php18
-rw-r--r--tests/phpunit/includes/media/MediaHandlerTest.php (renamed from tests/phpunit/includes/ImageFunctionsTest.php)8
-rw-r--r--tests/phpunit/includes/media/PNGTest.php30
-rw-r--r--tests/phpunit/includes/media/SVGMetadataExtractorTest.php24
-rw-r--r--tests/phpunit/includes/media/TiffTest.php7
-rw-r--r--tests/phpunit/includes/media/XMPTest.php9
-rw-r--r--tests/phpunit/includes/media/XMPValidateTest.php47
-rw-r--r--tests/phpunit/includes/parser/MagicVariableTest.php10
-rw-r--r--tests/phpunit/includes/parser/MediaWikiParserTest.php12
-rw-r--r--tests/phpunit/includes/parser/NewParserTest.php414
-rw-r--r--tests/phpunit/includes/parser/ParserHelpers.php136
-rw-r--r--tests/phpunit/includes/parser/ParserPreloadTest.php67
-rw-r--r--tests/phpunit/includes/parser/PreprocessorTest.php102
-rw-r--r--tests/phpunit/includes/parser/TagHooksTest.php (renamed from tests/phpunit/includes/parser/TagHooks.php)0
-rw-r--r--tests/phpunit/includes/search/SearchEngineTest.php16
-rw-r--r--tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php79
-rw-r--r--tests/phpunit/includes/specials/SpecialRecentchangesTest.php (renamed from tests/phpunit/includes/specials/SpecialRecentchanges.php)16
-rw-r--r--tests/phpunit/includes/specials/SpecialSearchTest.php108
-rw-r--r--tests/phpunit/includes/upload/UploadFromUrlTest.php19
-rw-r--r--tests/phpunit/includes/upload/UploadStashTest.php53
-rw-r--r--tests/phpunit/includes/upload/UploadTest.php87
-rw-r--r--tests/phpunit/languages/LanguageAmTest.php33
-rw-r--r--tests/phpunit/languages/LanguageArTest.php78
-rw-r--r--tests/phpunit/languages/LanguageBeTest.php40
-rw-r--r--tests/phpunit/languages/LanguageBe_taraskTest.php35
-rw-r--r--tests/phpunit/languages/LanguageBhTest.php34
-rw-r--r--tests/phpunit/languages/LanguageBsTest.php41
-rw-r--r--tests/phpunit/languages/LanguageCsTest.php40
-rw-r--r--tests/phpunit/languages/LanguageCuTest.php41
-rw-r--r--tests/phpunit/languages/LanguageCyTest.php42
-rw-r--r--tests/phpunit/languages/LanguageDsbTest.php40
-rw-r--r--tests/phpunit/languages/LanguageFrTest.php34
-rw-r--r--tests/phpunit/languages/LanguageGaTest.php34
-rw-r--r--tests/phpunit/languages/LanguageGdTest.php38
-rw-r--r--tests/phpunit/languages/LanguageGvTest.php39
-rw-r--r--tests/phpunit/languages/LanguageHeTest.php48
-rw-r--r--tests/phpunit/languages/LanguageHiTest.php34
-rw-r--r--tests/phpunit/languages/LanguageHrTest.php41
-rw-r--r--tests/phpunit/languages/LanguageHsbTest.php40
-rw-r--r--tests/phpunit/languages/LanguageHyTest.php34
-rw-r--r--tests/phpunit/languages/LanguageKshTest.php34
-rw-r--r--tests/phpunit/languages/LanguageLnTest.php34
-rw-r--r--tests/phpunit/languages/LanguageLtTest.php53
-rw-r--r--tests/phpunit/languages/LanguageLvTest.php39
-rw-r--r--tests/phpunit/languages/LanguageMgTest.php35
-rw-r--r--tests/phpunit/languages/LanguageMkTest.php41
-rw-r--r--tests/phpunit/languages/LanguageMlTest.php43
-rw-r--r--tests/phpunit/languages/LanguageMoTest.php43
-rw-r--r--tests/phpunit/languages/LanguageMtTest.php72
-rw-r--r--tests/phpunit/languages/LanguageNlTest.php28
-rw-r--r--tests/phpunit/languages/LanguageNsoTest.php32
-rw-r--r--tests/phpunit/languages/LanguagePlTest.php72
-rw-r--r--tests/phpunit/languages/LanguageRoTest.php43
-rw-r--r--tests/phpunit/languages/LanguageRuTest.php54
-rw-r--r--tests/phpunit/languages/LanguageSeTest.php48
-rw-r--r--tests/phpunit/languages/LanguageSgsTest.php66
-rw-r--r--tests/phpunit/languages/LanguageShTest.php32
-rw-r--r--tests/phpunit/languages/LanguageSkTest.php40
-rw-r--r--tests/phpunit/languages/LanguageSlTest.php42
-rw-r--r--tests/phpunit/languages/LanguageSmaTest.php48
-rw-r--r--tests/phpunit/languages/LanguageSrTest.php199
-rw-r--r--tests/phpunit/languages/LanguageTest.php591
-rw-r--r--tests/phpunit/languages/LanguageTiTest.php32
-rw-r--r--tests/phpunit/languages/LanguageTlTest.php32
-rw-r--r--tests/phpunit/languages/LanguageTrTest.php9
-rw-r--r--tests/phpunit/languages/LanguageUkTest.php54
-rw-r--r--tests/phpunit/languages/LanguageWaTest.php32
-rw-r--r--tests/phpunit/phpunit.php4
-rw-r--r--tests/phpunit/skins/SideBarTest.php9
-rw-r--r--tests/phpunit/suite.xml19
-rw-r--r--tests/phpunit/suites/UploadFromUrlTestSuite.php74
-rw-r--r--tests/qunit/QUnitTestResources.php52
-rw-r--r--tests/qunit/data/qunitOkCall.js2
-rw-r--r--tests/qunit/data/testrunner.js130
-rw-r--r--tests/qunit/index.html79
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js)13
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLength.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.byteLength.js)4
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.byteLimit.js)136
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.client.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.client.js)164
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.colorUtil.js)2
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js4
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.getAttrs.js)2
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.highlightText.test.js239
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.localize.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.localize.js)2
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js)6
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js (renamed from tests/qunit/suites/resources/jquery/jquery.tabIndex.js)12
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js227
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.textSelection.test.js279
-rw-r--r--tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js (renamed from tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.js)36
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js201
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js43
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js29
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.test.js (renamed from tests/qunit/suites/resources/mediawiki/mediawiki.js)130
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js (renamed from tests/qunit/suites/resources/mediawiki/mediawiki.user.js)12
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js (renamed from tests/qunit/suites/resources/mediawiki/mediawiki.util.js)56
-rw-r--r--tests/selenium/SeleniumConfig.php16
-rw-r--r--tests/selenium/data/SimpleSeleniumTestDB.sql1
-rw-r--r--tests/selenium/data/mediawiki118_fresh_installation.sql15
-rw-r--r--tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiInstallationConfig.php4
-rw-r--r--tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiRestartInstallationTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php2
-rw-r--r--tests/selenium/installer/MediaWikiUserInterfaceTestCase.php2
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestCase.php40
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestSuite.php2
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestCase.php14
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestSuite.php2
-rw-r--r--tests/testHelpers.inc278
-rw-r--r--thumb.php200
-rw-r--r--thumb_handler.php8
-rw-r--r--thumb_handler.php51
-rw-r--r--trackback.php89
-rw-r--r--trackback.php51
1626 files changed, 112384 insertions, 65417 deletions
diff --git a/.gitignore b/.gitignore
index 954c371e..7b3ec46a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,25 @@
-/images/
-/cache/
+.svn
*~
-/LocalSettings.php*
-/AdminSettings.php*
+*.kate-swp
+.classpath
+.idea
+.metadata*
+.project
+.settings
+AdminSettings.php
+LocalSettings.php
+StartProfiler.php
+cscope.files
+cscope.out
+favicon.ico
+nbproject*
+project.index
+static*
+tags
+cache/*.cdb
+images/[0-9a-f]
+images/temp
+images/thumb
+maintenance/dev/data/
+maintenance/.mweval_history
+maintenance/.mwsql_history
diff --git a/.gitreview b/.gitreview
index 9041fd0b..96d08bba 100644
--- a/.gitreview
+++ b/.gitreview
@@ -2,4 +2,4 @@
host=gerrit.wikimedia.org
port=29418
project=mediawiki/core.git
-defaultbranch=REL1_18
+defaultbranch=REL1_19
diff --git a/CREDITS b/CREDITS
index a5d1ac51..05931937 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.18 is a collaborative project released under the
+MediaWiki 1.19 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.
@@ -8,7 +8,7 @@ following names for their contribution to the product.
* Alexandre Emsenhuber
* Andrew Garrett
* Aryeh Gregor
-* Ashar Voultoiz
+* Antoine Musso
* Brian Wolff
* Bertrand Grondin
* Brad Jorsch
@@ -22,7 +22,6 @@ following names for their contribution to the product.
* Danny B.
* David McCabe
* Derk-Jan Hartman
-* DieBuche
* Domas Mituzas
* Emufarmers
* Fran Rogers
@@ -30,13 +29,17 @@ following names for their contribution to the product.
* Guy Van den Broeck
* Happy-melon
* Hojjat
+* Ian Baker
* Ilmari Karonen
* Jack D. Pond
* Jack Phoenix
* Jan Paul Posma
* Jason Richey
+* Jeroen De Dauw
+* John Du Hart
* Jon Harald Søby
* Juliano F. Ravasi
+* Leo Koppelkamm
* Leon Weber
* Leslie Hoare
* Marco Schuster
@@ -47,6 +50,7 @@ following names for their contribution to the product.
* MinuteElectron
* Mohamed Magdy
* Nathaniel Herman
+* Neil Kandalgaonkar
* Nicolas Dumazet
* Niklas Laxström
* Philip Tzou
@@ -79,8 +83,11 @@ following names for their contribution to the product.
* Ahmad Sherif
* Alejandro Mery
* Amalthea
+* Amir E. Aharoni
+* Andrew Dunbar
* Antonio Ospite
* Azliq7
+* Beau
* Bergi
* Borislav Manolov
* Brad Jorsch
@@ -89,14 +96,19 @@ following names for their contribution to the product.
* Carlin
* Carsten Nielsen
* Conrad Irwin
+* cryptocoryne
* Dan Barrett
* Dan Collins
* Dan Nessett
* Daniel Arnold
+* David Baumgarten
* Denny Vrandecic
+* Edward Z. Yang
* Erwin Dokter
* FunPika
* fomafix
+* Gero Scholz
+* Gilles van den Hoven
* Grunny
* Harry Burt
* Ireas
@@ -104,7 +116,6 @@ following names for their contribution to the product.
* Jeremy Baron
* Jidanni
* Jimmy Xu
-* John Du Hart
* Jonathan Wiltshire
* Karun Dambietz
* Kim Hyun-Joon
@@ -122,21 +133,29 @@ following names for their contribution to the product.
* Mathias Ertl
* Matthew Britton
* mati
+* Max
* Max Sikström
+* merl
* Michael Dale
* Michael De La Rue
* Michael M.
+* Michael Newton
* Michael Walsh
* Mike Horvath
* Mormegil
+* MrBlueSky
* MrPete
* MZMcBride
* mybugs.mail
* Nakon
* Nathan Larson
* nephele
+* Nik
+* Nx.devnull
+* Nikola Kovacs
* Nikolaos S. Karastathis
* Olaf Lenz
+* Olivier Finlay Beaton
* Paul Copperman
* Paul Oranje
* PieRRoMaN
@@ -145,17 +164,20 @@ following names for their contribution to the product.
* rgcjonas
* Robert Treat
* RockMFR
+* Rusty Burchfield
* Salvatore Ingala
* Scott Colcord
* Simon Walker
* Solitarius
-* ST47
+* Søren Løvborg
* Stefano Codari
* Str4nd
* svip
* The Evil IP address
+* Tim Landscheidt
* Tisane
* Umherirrender
+* Van de Bugger
* Ville Stadista
* Vitaliy Filippov
* William Demchick
diff --git a/HISTORY b/HISTORY
index f2d00b41..2669f67d 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,795 @@
-Change notes from older releases. For current info see RELEASE-NOTES.
+Change notes from older releases. For current info see RELEASE-NOTES-1.20.
+
+== MediaWiki 1.18 ==
+=== Changes since 1.18.2 ===
+* (bug 35446) Using "{{nse:}}" with an invalid namespace name no longer throws
+ a PHP warning.
+* (bug 35567) The whole password reminder e-mail is now sent in the same language.
+
+== MediaWiki 1.18.2 ==
+2012-03-21
+
+This is a maintenance and security release of the MediaWiki 1.18 branch.
+
+=== Changes since 1.18.1 ===
+* (bug 33686) could not get a list of contributor for an article when using
+ a SQLite database.
+* (Bug 33865) Exception thrown in action=parse when attempting to use the title
+ parameter without setting the text parameter.
+* UserMailer could potentially throw a fatal error when a MailAddress object had
+ an empty email address.
+* (Bug 33087) Exchange server rejected mail sent by MediaWiki
+* (bug 34528) Edit section tooltips show correction section name again
+* (bug 34246) MediaWiki:Whatlinkshere-summary message is displayed again in
+ Special:Whatlinkshere
+* (bug 22555) Remove or skip strip markers from tag hooks like <nowiki> in
+ core parser functions which operate on strings, such as formatnum.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+ parameter present.
+* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
+ CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
+
+== MediaWiki 1.18.1 ==
+2012-01-11
+
+This a maintenance and security release of the MediaWiki 1.18 branch.
+
+=== Changes since 1.18.0 ===
+* (bug 32712) Fix for search indexing of pages with certain unicode chars following URL.
+* (bug 3901) Lang, hreflang attribs added to sidebar interlanguage links for screen readers.
+* (bug 30774) mediawiki.html: Add support for numbers and booleans in the
+ attribute values and element contents.
+* (bug 32473) [[Special:PasswordReset]] can not be used on private wiki.
+* (bug 32853) Fixed CACHE_DBA object cache type.
+* (bug 32786) Backward compatibility for extension using 1.17's Database::newFromType().
+* Fixed exception when using Special:WhatLinksHere on a Media: file.
+* (bug 32709) Private Wiki users were always taken to Special:Badtitle on login.
+* (bug 33240) Sort images are missing but referenced in css.
+* (bug 31921) Magic words REVISIONDAY, REVISIONMONTH and REVISIONYEAR were
+ not showing their values on preview.
+* (bug 32702) Removed method Skin::makeGlobalVariablesScript() has been readded
+ for backward compatibility.
+* (bug 30172) The check for posix_isatty() in maintenance scripts did not detect
+ when the function exists but is disabled. Introduced Maintenance::posix_isatty().
+* (bug 33305) Make mw.util.addCSS resistant to IE's @font-face bug by setting
+ cssText after DOM insertion.
+* (bug 29102) Upgrades no longer fail with the error "Unknown character set: 'mysql4'.
+* (bug 25355) Parser generates edit section links for special pages.
+* (bug 33321) Adding a line to MediaWiki:Sidebar that contains a pipe, but doesn't
+ have any pipes after being transformed by MessageCache, causes exception on
+ all pages.
+* Fixed recentchanges FK violation on page delete and cache purge error in updater
+ for Oracle DB.
+* (bug 33117) prop=revisions allows deleted text to be exposed through cache pollution.
+
+=== MediaWiki 1.18.0 ===
+2011-11-24
+
+This is the first stable release of the MediaWiki 1.18 branch.
+
+=== Summary of selected changes in 1.18 ===
+
+Selected changes since MediaWiki 1.17 that may be of interest:
+
+* Some of the more commonly used MediaWiki extensions are now included in the
+ release tarball. These extensions are ConfirmEdit, Gadgets, Nuke, ParserFunctions,
+ Renameuser, Vector and WikiEditor.
+
+* Gender support has been improved, meaning user pages can display the correct gender
+ variant of "User" can now be used.
+
+* MediaWiki can now detect the camera orientation of an image from the Exif metadata, and
+ can rotate the image thumbnail appropriately. Metadata support has been generally
+ improved, and can now extract IPTC and XMP metadata.
+
+* Improved directionality support in 1.18 means that MediaWiki is better to use for
+ RTL users.
+
+* MediaWiki now supports protocol - relative URLs in links, interwiki targets and $wgServer
+
+* Math support has been removed from core
+
+=== Changes since 1.18.0rc1 ===
+* (bug 32228) regression in Special:Search which did not conserve profile on new search
+* (bug 32460) Categories were improperly aligned in Simple and CologneBlue
+* (bug 32412) TOC links on [[Special:EditWatchlist]] points to the fieldsets
+* (bug 32582) Fix TOC show/hide link regression on IE 8
+
+=== Changes since 1.18 beta 1 ===
+* (bug 31886) Wrong titles redirecting to Special:Badtitle in the 1.18 deployment.
+* (bug 32051) Fix description for wlprop=sizes.
+* (bug 31913) Special:MostLinkedTemplates had an incorrect GROUP BY clause
+ under Microsoft SQL.
+* (bug 32100) installer complains about suhosin GET limit.
+* (bug 31933) fix 1.18 regression in Monobook sidebar: huge spacing between portlets
+ on IE 7 and IE 8/9 in compatibility view.
+* (bug 32126) Fix 1.18 regression in watchlist editor when items already removed
+ from watchlist.
+* (bug 32183) remove the client-* classes added from user-agent-sniffing onto
+ the <html> element.
+* (bug 29912) Unit tests break if parsertest tables are still present.
+* (bug 31694) During installation, tabbing order (cursor focus) goes to logo
+ instead of 'continue'.
+* (bug 29102) Upgrade fails "Unknown character set: 'mysql4".
+* (bug 31990) justify paragraphs pref adds extra space to category listing.
+* (bug 20148) Better title for [[Special:Disambiguations]] page.
+* (bug 31502) TOC is missing on Special:EditWatchlist.
+* (bug 32256) API list=search stops at first invalid result.
+* (bug 32047) jquery.tablesorter.js: thead is before caption.
+* (bug 29854) Store protocol-relative links twice in the externallinks table,
+ one with http: in el_index and once with https.
+* (bug 31822) Error during upgrade due to output buffer reset in stdout.
+
+=== Configuration changes in 1.18 ===
+* The WantedPages::getSQL hook has been removed and replaced with
+ WantedPages::getQueryInfo. This may break older extensions.
+* The SkinTemplateBuildContentActionUrlsAfterSpecialPage,
+ SkinTemplateContentActions and SkinTemplateTabs hooks have been removed in
+ favor of SkinTemplateNavigation and SkinTemplateNavigation::SpecialPage.
+* $wgUseCombinedLoginLink controls whether to output a combined
+ login / create account link in the personal bar, or to output separate login
+ and create account links.
+* Skin names are no longer created based on a ucfirst version of the key in
+ $wgValidSkinNames but now the value. This means for
+ $wgValidSkinNames["monobook"] = "MonoBook"; the skin loader will no longer try
+ loading SkinMonobook and will instead load SkinMonoBook.
+* $wgMaxUploadSize may now be set to an array to specify the upload size limit
+ per upload type.
+* $wgAPICacheHelp added in 1.16 is now removed. To disable API help caching, set
+ $wgAPICacheHelpTimeout = 0;
+* OutputPage::isUserJsAllowed() no longer returns false when scripts are allowed
+ by the page, but $wgAllowUserJs is set to false.
+* Pure "Skin" class based custom skins are no longer supported, all custom skins
+ should be put together using SkinTemplate and BaseTemplate or QuickTemplate.
+* The transliteration for passwords in case they were migrated from an old
+ Latin-1 install (previous to MediaWiki 1.5) is now only done for wikis with
+ $wgLegacyEncoding set.
+* (bug 27508) Add $wgSVGMetadataCutoff to limit the maximum amount of an SVG we
+ look at when finding metadata to prevent excessive resource usage.
+* $wgSysopUserBans and $wgSysopRangeBans (deprecated in 1.17) are now removed.
+ Use $wgBlockCIDRLimit = array( 'IPv4' => 43, 'IPv6' => 128 ) to achieve the
+ same functionality as $wgSysopRangeBans; you can use the BlockIp hook to
+ replicate $wgSysopUserBans functionality.
+* The options on the block form have been standardised such that checking a box
+ makes the block 'more serious'; so while "check to prevent account creation"
+ and "check to enable autoblock" remain the same, "check to allow user-talk
+ edit" is reversed to "check to *disable* user-talk edit", and "check to block
+ anon-only" becomes "check to block logged-in users too". The default settings
+ remain the same.
+* Most of the field names on the Special:Block form have been changed, which
+ will probably break screen-scraping bots.
+* (bug 26866) The 'trackback' right is no longer granted to sysops by default.
+ $wgUseTrackbacks is already false by default.
+* (bug 17009) the hiddenStructure CSS class, a highly hackish way of at least
+ *appearing* to hide article elements, has been removed. Use the
+ ParserFunctions extension to actually remove unwanted elements from the
+ output.
+* (bug 14202) $wgUseTeX has been superseded by the Math extension. To re-enable
+ math conversion after upgrading, obtain the Math extension from SVN or from
+ http://www.mediawiki.org/wiki/Extension:Math and add to LocalSettings.php:
+ require_once "$IP/extensions/Math/Math.php";
+* $wgProfiler is now a configuration array, see StartProfiler.sample for
+ details.
+* $wgProfiling has been removed.
+* The spyc library is now no longer included in phase3.
+* (bug 28343) Unused preferences contextlines/contextchars have been removed
+* $wgSkinExtensionFunctions has been removed. Use $wgExtensionFunctions instead.
+* $wgProto has been removed. You now only need to set $wgServer to change the
+ URL protocol.
+* $wgRateLimitsExcludedGroups (deprecated in 1.13) has been removed.
+* $wgInputEncoding and $wgOutputEncoding (deprecated in 1.5) have now been removed.
+* $wgAllowUserSkin (deprecated in 1.16) has now been removed.
+* $wgExtraRandompageSQL (deprecated in 1.16) has now been removed.
+* LogReader and LogViewer classes (deprecated in 1.14) have now been removed.
+* (bug 26033) Added $wgArticleCountMethod to select the method to use to say
+ whether a page is an article or not. $wgUseCommaCount is now deprecated.
+* $wgEnableDublinCoreRdf and $wgEnableCreativeCommonsRdf no longer work in core,
+ and the functionality has been moved to the relevant extensions. See
+ http://www.mediawiki.org/wiki/Extension:DublinCoreRdf and
+ http://www.mediawiki.org/wiki/Extension:CreativeCommonsRdf as appropriate.
+* (bug 21107) Split error "customcssjsprotected" into separate messages for JS and CSS
+* Removed $wgCheckCopyrightUpload from DefaultSettings, since the relevant feature
+ was removed in about 1.5.
+* LogPageValidTypes, LogPageLogName, LogPageLogHeader and LogPageActionText
+ hooks have been removed.
+* New hook "Collation::factory" to allow extensions to create custom
+ category collations.
+* $wgGroupPermissions now supports per namespace permissions.
+* $wgEnableAutoRotation enables or disables auto-rotation. Leaving it set to
+ null will cause MediaWiki to determine if auto-rotation is available.
+
+=== New features in 1.18 ===
+* BREAKING CHANGE: action=watch / action=unwatch now requires a token.
+* BREAKING CHANGE: Article class hierarchy split into WikiPage (backend).
+ and Article (frontend) hierarchies. Several hooks now pass a WikiPage object instead
+ of an Article object. These hooks all use an $article paramater as documented in hooks.txt.
+ Extensions should be updated to account for this, though most won't require any changes.
+* (bug 27860) Minor edit after clicking 'new section' tab
+ Now the "This is a minor edit" checkbox is not available when you
+ create a page or new section.
+* (bug 8130) Query pages should limit to content namespaces, not just main
+ namespace.
+* Special:Contribs now redirects to Special:Contributions.
+* (bug 6672) Images are now autorotated according to their EXIF orientation.
+ This only affects thumbnails; the source remains unrotated.
+* (bug 25708) Update case mappings and normalization to Unicode 6.0.0.
+* New hook ArticlePrepareTextForEdit added, called when preparing text to be
+ saved.
+* New parser option PreSaveTransform added, allows the pre-save transformation
+ to be selectively disabled.
+* Alternative to $wgHooks implemented, using the new Hooks class.
+* Add width parameter to Special:Filepath to allow getting the file path of a
+ thumbnail.
+* (bug 26870) Add size to {{filepath:}}.
+* Upload warnings now show a thumbnail of the uploaded file.
+* Introduced the edittools-upload message, which will be inserted under the
+ upload form instead of edittools if available.
+* (bug 26285) Extensions will be automatically generated on upload if the user
+ specified a filename without extension.
+* (bug 26851) Special:UserRights now allows to prefill the reason field
+* New maintenance script to fix double redirects
+ (maintenance/fixDoubleRedirects.php).
+* (bug 23315) New body classes to allow easier styling of special pages.
+* (bug 27159) Make email confirmation code expiration time configurable.
+* (bug 29047) CSS/JS for each user group is imported from MediaWiki:Group-sysop.js,
+ MediaWiki:Group-autoconfirmed.css, etc.
+* (bug 24230) Uploads of ZIP types, such as MS Office or OpenOffice can now be
+ safely enabled. A ZIP file reader was added which can scan a ZIP file for
+ potentially dangerous Java applets. This allows applets to be blocked
+ specifically, rather than all ZIP files being blocked.
+* (bug 2429) Allow selection of associated namespace in recent changes.
+* (bug 26217) File size is now checked before uploading in HTML5 browsers.
+* CSS stylesheet MediaWiki:Noscript.css is now loaded for users with JavaScript
+ disabled (enclosed in the head in a <noscript> tag).
+* Added UserGetLanguageObject hook to change the language used in $wgLang.
+* (bug 14645) When $wgMiserMode is on, expensive special pages are styled
+ differently (italicized by default) on Special:SpecialPages.
+* Added $wgAggregateStatsID, which allows UDP stats to be aggregated over
+ several wikis.
+* When $wgAllowMicrodataAttributes is true, all itemtypes are allowed, not just
+ the three that were defined in the original specification.
+* (bug 14706) Added support for the Imagick PHP extension.
+* (bug 18691) Added support for SVG rasterization using the Imagick PHP
+ extension.
+* (bug 2581, bug 6834) Added links to thumbnail in several resolutions to the
+ file description page. The sizes are set by $wgImageLimits.
+* (bug 28031) Add pageCount support to ArchivedFile.
+* (bug 27924) PhpHttpRequest doesn't return response body if HTTP != 200.
+* Added hook BitmapHandlerTransform to allow extension to transform a file
+ without overriding the entire handler.
+* The parser now attempts to output markers for editsection tokens and defer the
+ rendering of them post-cache to reduce parser cache fragmentation and ensure
+ skin customizability of edit section links.
+* (bug 24755) AuthPlugin auto-creation of local accounts can now be aborted by
+ other extensions by handling the 'AbortAutoAccount' hook, similar to the
+ 'AbortNewAccount' triggered by explicit account creations. (They are separate
+ to avoid loops and confusion; auth plugins like CentralAuth need to handle
+ AbortNewAccount separately.
+* Special:ListFiles is now transcludable.
+* (bug 13879) Special:Emailuser asks for suitable target user if called without.
+* (bug 16956) IPTC and XMP metadata now extracted from images.
+* (bug 23816) A tracking category is now added for any pages with broken images.
+* (bug 23495) Allow createAndPromote.php to create non-sysop users.
+* (bug 28916) A way to to toggle mw.config legacy globals settings from
+ LocalSettings.php has been created by introducing $wgLegacyJavaScriptGlobals.
+* (bug 28503) Support for ircs:// URL protocols.
+* (bug 26033) It is now possible to count all non-redirect pages in content
+ namespaces as articles.
+* Images can now be embedded in an XML dump stream using backupDump.php
+ --include-files and can be imported using importDump.php --uploads;
+ furthermore, it can import files from the filesystem using --image-base-path.
+* Three new hooks in Special:Undelete, 'UndeleteForm::showHistory',
+ 'UndeleteForm::showRevision' and 'UndeleteForm::undelete', so that extensions
+ may override the usage of PageArchive class and replace it with their own
+ class that extends PageArchive.
+* (bug 28915) Implement QUnit test suite for MediaWiki JavaScript.
+ Also built-in support for distribution through a TestSwarm instance.
+* (bug 29036) For cascade-protected pages, the mw-textarea-cprotected class is
+ added to the textarea on the edit form.
+* mw.util.wikiScript has been implemented (like wfScript in GlobalFunctions.php)
+* (bug 29067) Expose user.tokens (like we do user.options) in ResourceLoader.
+* New 'Debug' hook used by wfDebug() and wfDebugLog().
+* (bug 27655) Require token for watching/unwatching pages)
+* (bug 28904) (bug 29773) Update jQuery version from 1.4.4 to 1.6.2 (the latest version)
+* (bug 29441) Expose CapitalLinks config in JS to allow modules to properly
+ handle titles on case-sensitive wikis.
+* (bug 29397) Implement mw.Title module in core.
+* In MySQL 4.1.9+ with replication enabled, fetch the slave lag from SHOW SLAVE
+ STATUS instead of SHOW PROCESSLIST. This ensures that lag is reported
+ correctly in the case where there are no write events occurring. Note that
+ the DB user now needs to have the REPLICATION CLIENT privilege if you are
+ using replication.
+* Language codes in $wgDummyLanguageCodes are now excluded on localization
+ statistics (maintenance/language/transstat.php).
+* (bug 29586) Make the (next 200) links on categories link directly to
+ the relevant section of the category.
+* (bug 29109) Allow the automatic edit summary for redirect creation
+ show the first bit of the new redirect page.
+* (bug 29723) mw.util.wikiGetlink() now defaults to wgPageName.
+* (bug 29680) Add GetDefaultSortkey hook to override the default sortkey.
+* (bug 16699) {{#language:}} accepts second parameter to specify the language in
+ which the language name is wanted. Coverage depends on the cldr extension.
+* (bug 15802) An easy way to look up messages: language qqx which returns
+ the message keys.
+* (bug 29868) Add support for passing parameters to mw.msg in jquery.localize.
+* (bug 29558) $wgMiserMode now disables update.php by default.
+* AjaxCategories: Easily add, edit or delete categories on article pages.
+ Suggests possible categories when typing, all saves are done via AJAX.
+ Supports editing of multiple categories and then saving them in one batch.
+* $wgAutopromoteOnce was added, allowing for users to be automatically promoted
+ to explicit usergroups. If a group is removed from a user via Special:UserRights,
+ it will not automatically be re-added. Configuration is similar to
+ $wgAutopromote (see DefaultSettings.php).
+* The PerformRetroactiveAutoblock hook was added to allow overriding or complementing
+ retroactive autoblock handling. This runs when blocking a user with the 'autoblock' option.
+* MediaWiki now supports using protocol-relative URLs in links, interwiki
+ targets and $wgServer.
+* Introduced $wgVaryOnXFPForAPI which will cause the API to send
+ Vary: X-Forwarded-Proto headers.
+* New maintenance script to refresh image metadata (maintenance/refreshImageMetadata.php).
+* (bug 16428) Include permalink in printable version.
+* (bug 30722) Add an identity collation that sorts things based on what the
+ unicode code point is (aka pre-1.17 behaviour).
+* (bug 30940) Add a hook in User:getDefaultOptions.
+ To give extensions a better and more flexible way of providing default
+ values for preferences a hook has been introdiced in User:getDefaultOptions().
+ Setting preferences in $wgDefaultUserOptions still work fine, but when reading
+ them (i.e. with array_keys) to get a list of all preferences, then
+ $wgDefaultUserOptions should no longer be used as it will contain those set via
+ User:getDefaultOptions().
+* (bug 30497) Add client-nojs and client-js classes on document element
+ to let styles easily hide or show things based on general JS availability.
+* (bug 31293) If Special:Userlogin is loaded over HTTPS, display
+ MediaWiki:loginend-https instead of MediaWiki:loginend, if it's not empty.
+ Same for signupend on the account creation page.
+* (bug 31233) New OutputPage::addJsConfigVars() method to make the output page specific
+ mw.config map extendable.
+* mw.util.wikiScript has been implemented (like wfScript in GlobalFunctions.php).
+
+=== Bug fixes in 1.18 ===
+* (bug 27860) Minor edit after clicking 'new section' tab.
+* (bug 23119) WikiError class and subclasses are now marked as deprecated.
+* (bug 10871) Javascript and CSS pages in MediaWiki namespace are no longer
+ treated as wikitext on preview.
+* (bug 22753) Output from update.php is more clear when things changed, entries
+ indicating nothing changed are now all prefixed by "...".
+* Page existence is now not revealed (in the colour of the tabs) to users who
+ cannot read the page in question.
+* (bug 19006) {{REVISIONUSER}} no longer acts like {{CURRENTUSER}} in some
+ cases.
+* (bug 16019) $wgArticlePath = "/$1" no longer breaks API edit/watch actions.
+* (bug 18372) File types blacklisted by $wgFileBlacklist will no longer be shown
+ as "Permitted file types" on the upload form.
+* (bug 26379) importImages.php gives more descriptive error message on failure.
+* (bug 26410) + signs are no longer treated as spaces in internal links if
+ link has a % sign in it.
+* (bug 26412) Search results headers no longer show a bogus edit link.
+* (bug 26540) Fixed wrong call to applyPatch in MysqlUpdater.
+* (bug 26574) Added 'upload' to $wgRestrictionTypes, allowing upload protected
+ pages to be queried via the API and Special:ProtectedPages, and allowing
+ disabling upload protection by removing it from $wgRestrictionTypes.
+* If an edit summary exceeds 250 bytes and is truncated, add an ellipse.
+* (bug 26638) Database error pages display correctly in RTL languages.
+* (bug 26187) Confirmrecreate no longer parses the edit summary.
+* (bug 26208) Mark directionality of some interlanguage links.
+* (bug 26034) Make the "View / Read" tab in content_navigation style tabs remain
+ selected when the action is "purge".
+* (bug 14267) Support a MediaWiki:Mainpage-nstab override for the subject
+ namespace tab on the mainpage of a wiki.
+* (bug 10158) Do not mention allowing others to contact you when the feature
+ is disabled ($wgEnableUserEmail=false).
+* (bug 26733) Wrap initial table creation in transaction.
+* (bug 26729) Category pages should return 404 if they do not exist and have no
+ members.
+* (bug 2585) Image pages should send 404 if no image, no shared image and no
+ description page.
+* Custom editintro's using the editintro url parameter will no longer show
+ <noinclude> sections on pages they are included on.
+* (bug 26449) Keep underlines from headings outside of tables and thumbs by
+ adding overflow:hidden to h1,h2,h3,h4,h5,h6 (also fixes editsection bunching).
+* (bug 26708) Remove background-color:white from tables in Monobook and Vector.
+* (bug 28422) Remove color:black from tables in Monobook and Vector. And add it
+ to table.wikitable instead.
+* (bug 26781) {{PAGENAME}} and related parser functions escape their output
+ better.
+* (bug 26716) Provide link to instructions for external editor related
+ preferences and add a comment to the ini control file explaining what is
+ going on.
+* Trying to upload a file with no extension or with a disallowed MIME type now
+ gives the right message instead of complaining about a MIME/extension
+ mismatch.
+* (bug 26809) Uploading files with multiple extensions where one of the
+ extensions is blacklisted now gives the proper extension in the error message.
+* (bug 26961) Hide anon edits in watchlist preference now actually works.
+* (bug 19751) Filesystem is now checked during image undeletion.
+* Send last modified headers for Special:Recentchanges when RC patrol is
+ enabled, but user cannot see rc patrol links.
+* (bug 26548) ForeignAPIRepo (InstantCommons) now works with PDF files
+ and other multi-paged file formats.
+* Files with a mime type that does not match the extension are now properly
+ thumbnailed.
+* (bug 27201) Special:WhatLinksHere output no longer contains duplicate IDs.
+* (bug 15905) Nostalgia skin could become more usable by including a Talk:
+ link at the top of the page.
+* (bug 27560) Search queries no longer fail in Walloon language.
+* (bug 27679) Broken embedded files with special characters are no longer
+ double HTML escaped.
+* (bug 27700) The upload protection can now also be set for files that do not
+ exist.
+* (bug 27763) Article::getParserOutput() no longer throws a fatal given when an
+ incorrect revision ID is passed.
+* Trim the form field for uploading by url to remove extra spaces which could
+ cause confusing error messages.
+* (bug 27854) Http::isValidURI is way too lax.
+* Do not show enotifminoredits preference, if disabled by $wgEnotifMinorEdits.
+* AbortLogin returning "ABORTED" now handled. Also allows message identifier
+ for "ABORTED" reason to be returned and displayed to user.
+* (bug 28034) uploading file to local wiki when file exists on shared repository
+ (commons) gives spurious info in the warning message.
+* Usernames get lost when selecting different sorts on Special:listfiles.
+* (bug 14005) editing section 0 of an existing but empty page gives no such
+ section error.
+* (bug 26939) Installer does not set $wgMetaNamespace.
+* (bug 28166) UploadBase assumes that 'edit' and 'upload' rights are not per
+ page restrictions.
+* Make truncate function automatically consider length of '...' string,
+ since length can vary by localization.
+* (bug 28242) Make redirects generated by urls containing a local interwiki
+ prefix be a 301 instead of a 302.
+* (bug 15641) blocked administrators are now prevented from deleting or
+ protecting their own talk page; and all blocked users are more
+ comprehensively prevented from performing other actions.
+* (bug 27893) Edit-on-doubleclick now applies only on view and purge actions;
+ no longer triggers unexpectedly on delete, history etc.
+* (bug 28417) Fix PHP notice when importing revision without a listed id.
+* (bug 28430) Make html and TeX output of <math> always be left-to-right.
+* (bug 28306) Fix exposure of suppressed usernames in ForeignDBRepo.
+* (bug 28372) Fix bogus link to suppressed file versions in ForeignDBRepo.
+* (bug 27473) Fix regression: bold, italic no longer interfere with linktrail
+ for ca, kaa.
+* (bug 28444) Fix regression: edit-on-doubleclick retains revision id again.
+* &apos; character entity is now allowed in wikitext.
+* UtfNormal::cleanUp on an invalid utf-8 sequence no longer returns false if
+ intl installed.
+* (bug 28561) The css class small will no longer make nested elements even
+ smaller.
+* (bug 13172) Array type exif data (like GPS) was not being extracted from
+ images.
+* (bug 28532) wfMsgExt() and wfMsgWikiHtml() use $wgOut->parse().
+* (bug 16129) Transcluded special pages expose strip markers when they output
+ parsed messages.
+* (bug 27249) "Installed software" table in Special:Version should always be
+ left-to-right.
+* (bug 28719) Do not call mLinkHolders __destruct explicitly.
+* (bug 21196) Article::getContributors() no longer fails on PostgreSQL.
+* (bug 28752) XCache doesn't work in CLI mode.
+* (bug 28076) Thumbnail height limited to 360 pixels on Special:Listfiles.
+* (bug 22227) Special:Listfiles no longer throws an error on bogus file entries.
+* (bug 19408) user_properties.up_property: 32 bytes is not enough.
+* (bug 25262) Fix for minification of hardcoded data: URIs in CSS.
+* (bug 29263) Add LTR class to the shared CSS to be used for left-to-right text
+ such as SQL queries shown in dberrortext and similar messages in RTL
+ environments.
+* (bug 14977) Fixed $wgServer detection in cases where an IPv6 address is used
+ as the server name.
+* The View X deleted revisions is now shown again on Special:Upload.
+* (bug 29071) mediawiki.action.watch.ajax.js should pass uselang to API.
+* (bug 28868) Show total pages in the subtitle of an image on the
+ file description page for multi-paged documents.
+* (bug 28883) Message names for different compression types commonly
+ used in Tiff files.
+* When translcuding a special page, do not let it interpret url parameters.
+* (bug 28887) Special page classes are no longer re-used during 1 request.
+* (bug 28888) Searching for something starting with a # sign no longer tells
+ the user a page named [[:]] already exists.
+* (bug 23002) Imagelinks table not updated after imagemove.
+* (bug 27864) Transcluding {{Special:Prefix}} with empty prefix now lists all
+ pages.
+* (bug 18803) JPEG2000 images should not be uploadable as .jpg files.
+* (bug 11868) If using links to count articles, the checking will now be based
+ on the real presence of an internal link instead of the "[[" string.
+* (bug 28287) The "your changes" box for edit conflicts is now read-only.
+* (bug 28940) When making a thumb of an SVG, and only specifying the height
+ make the width be the max SVG size, not the natrual width of the SVG.
+* (bug 1780) Uploading files with non-ascii characters are now forbidden on
+ Windows.
+* (bug 23464) File: prefixes are now chopped off during uploading.
+* (bug 28174) Message config-logo-help amended to not explicitly assume any
+ LTR/RTL screen layout.
+* (bug 28992) Revision numbers in the patrol log are transformed in the user
+ language.
+* (bug 27073) ResourceLoaderDynamicStyles marker should be dynamically appended to
+ the document head if it doesn't exist.
+* (bug 27023) After the document is ready, mw.loader is broken (calls callback
+ before module is parsed).
+* (bug 4330) External URLs without a custom title should be treated as LTR,
+ even in RTL text.
+* (bug 29055) Make "don't send email on minor edits" preference apply to
+ changes to talk page in addition to watchlist edits.
+* (bug 28272) Special:AllMessages should have only one "Go" button.
+* (bug 29101) Special:FileDuplicateSearch no longer shows silly message.
+* (bug 29048) jQuery.tabIndex: firstTabIndex() should not output the same
+ as lastTabIndex().
+* (bug 29332) Warn if user requests mediawiki-announce subscription but does not
+ enter an e-mail address.
+* (bug 25375) Add canonical namespaces to "wgNamespaceIds" in mw.config.
+* The class JpegOrTiffHandler was renamed ExifBitmapHandler.
+* (bug 29443) Special:Undelete should use JavaScript to invert all checkboxes
+ instead of reloading the page.
+* (bug 29325) Setting $wgStrictFileExtensions to false no longer gives incorrect warning.
+* (bug 29437) Multiple apostrophes in deleted article title cause odd rendering.
+* (bug 29485) RSS feed of Special:RecentChange grouped together multiple
+ consecutive edits by same user in included diff, but then linked to
+ a single ungrouped diff.
+* Do not try to group together a page creation and edit in the RSS feed of RC.
+* (bug 29342) Patrol preferences shouldn't be visible to users who don't have
+ patrol permissions.
+* (bug 29471) Exception no longer thrown for files with invalid date in metadata.
+* (bug 29492) Long-running steps in the installer (such as Upgrade and Install)
+ no longer cause timeouts.
+* (bug 29507) Change 'image link' to 'file link' in Special:Whatlinkshere.
+* If the db is really screwed up, and doesn't have a recentchanges table,
+ make the updater throw an exception instead of a fatal.
+* wfArrayToCGI() and wfCgiToArray() now handle nested and associative arrays
+ correctly.
+* (bug 29567) mw.util.addPortletLink should only wrap link in <span> for
+ "vectorTabs" portlets.
+* (bug 8556) Incorrect session failure warning on preview-on-open
+ namespaces (categories) when combined with $wgRawHtml.
+* Use content language in formatting of dates in revertpage message
+ (rollback revert edit summary) and do not adjust for user timezone.
+* (bug 29277) MediaWiki:Filepage.css is also shown on the local wiki
+* Make sure Backlink cache does not retrieve interwiki redirects when looking for
+ redirects to a local page.
+* (bug 6100) Allow different directionality (LTR/RTL) for user interface
+ and wiki content, along with many other RTL and directionality improvements
+ (such as bugs 28030, 12406, 28349).
+* (bug 29712) Removed broken defaultUserOptionOverrides in MessagesXx files and
+ unneeded CSS flipping of quickbar. Instead, introduce option 5 which sets
+ left/right according to the directionality of your interface language.
+* (bug 19514) Unordered list list-style-image should be IE6-compatible (8-bit).
+* (bug 27410) The tag filter on a history page is now within a <label> element.
+* (bug 29779) DairikiDiff/WikiDiff <ins> and <del> should undo browser default
+ styling (strike/underline).
+* (bug 28630) Add iwlinks, langlinks, redirect to
+ RefreshLinks::deleteLinksFromNonexistent.
+* (bug 29797) Error: "Tried to load block with invalid type" when subpages
+ are disabled for user pages.
+* (bug 12205) Bidirectional names in action=credits are split and displayed.
+ incorrectly when wrapped to the next line.
+* (bug 20781) Move 'mainpagetext' messages to installer's .i18n file.
+* (bug 29737) "MediaWiki:Qbsettings-directionality" should refer to script,
+ not language.
+* (bug 26360) $wgSessionHandler was overriding system settings unconditionally.
+* Removed AjaxFunctions.php. The last remaining function js_unescape() was moved
+ to the FCKEditor extension.
+* (bug 28762) Resizing to specified height broken for very thin images.
+* (bug 29959) Installer fatal when cURL and allow_url_fopen is disabled and user
+ tries to subsribe to mediawiki-announce.
+* (bug 27427) mw.util.getParamValue shouldn't return value from hash even if
+ param is only present in hash.
+* Installer checked for magic_quotes_runtime instead of register_globals.
+* (bug 30131) XCache with variable caching disabled no longer used for variable
+ caching (CACHE_ACCEL)
+* $wgSVGMaxSize is now applied to the smaller of width or height, making very wide
+ pano/timeline/diagram SVGs renderable at saner sizes.
+* (bug 30219) The page shown when LocalSettings.php does not exist was broken on
+ Windows servers.
+* (bug 30074) Moving user JS subpages resulted in JS errors because
+ #REDIRECT [[Foo]] is invalid JS.
+* (bug 30335) Fix for HTMLForms using GET breaking when non-friendly URLs
+ are used.
+* (bug 30264) Changed installer-generated LocalSettings.php to use require_once()
+ instead require() for included extensions.
+* Tracking categories are no longer shown in footer for special pages.
+* (bug 30684) Fix bad escaping in mw.message for inexistent messages (i.e. <key>).
+* $wgOverrideSiteFeed no longer double escapes urls.
+* The preprocessor no longer fails with a PHP warning about XML_PARSE_HUGE when
+ processing complex pages using newer versions of libxml2.
+* (bug 30907) Special:Unusedcategories should sort ascendingly.
+* (bug 28545) When using the uca-default collation, sortkey's starting with a
+ space (U+20) will sort under an invisible header like in 1.16 rather than a U+6DE.
+* (bug 30192) Thumbnails of archived files are now deleted.
+* (bug 30843) mediawiki.Title should not convert extensions (anything after the
+ last full stop) to lower case).
+* (bug 31213) Exception thrown when trying to move file cross-namespace.
+* (bug 18424) Special:Prefixindex and Special:Allpages paging links are
+ really small, and somewhat inconsistent with each other.
+* (bug 30466) Entries in iwlinks table are now cleared when moving a page over
+ redirect.
+* (bug 31674) Can't edit watchlist if it contains special pages.
+* (bug 32100) Installer complains about Suhosin GET limit even if it is
+ already set above 1024 bytes.
+
+=== API changes in 1.18 ===
+* BREAKING CHANGE: action=watch now requires POST and token.
+* (bug 26339) Throw warning when truncating an overlarge API result.
+* (bug 14869) Add API module for accessing QueryPage-based special pages.
+* (bug 14020) API for Special:Unwatchedpages.
+* (bug 24287) Wrap API Help output at 100 characters.
+* Add a realname uiprop option to query=userinfo so a user's realname can be
+ extracted.
+* Add a &watchuser option to ApiBlock.
+* (bug 26541) Generator-ise ApiQueryRecentChanges.
+* action=parse now correctly returns an error for nonexistent pages.
+* (bug 25767) Add userrights properties to allusers and users query lists.
+* (bug 26558) list=allusers auprop=groups does not list groups a user is
+ automatically a member of.
+* (bug 26559) list=allusers auprop=rights does not match
+ list=users usprop=rights.
+* (bug 26560) On allusers if limit < total number of users, last user gets
+ duplicate.
+* (bug 25135) add "normalized" to action=parse.
+* (bug 26460) Add support for listing category members by category pageid.
+* (bug 26482) add a imimages param to prop=images.
+* (bug 26498) allow LinksUpdate with API.
+* (bug 26485) add a elextlinks param to prop=extlinks.
+* (bug 26483) add a iwtitles param to prop=iwlinks.
+* (bug 26484) add a lltitles param to prop=langlinks.
+* (bug 26480) add a pppageprops param to prop=pageprops.
+* (bug 26650) Remove $wgAPICacheHelp in favour of $wgAPICacheHelpTimeout.
+* (bug 24650) Fix API to work with categorylinks changes.
+* Expose list of skins in meta=siteinfo.
+* (bug 26548) Add iiurlparam param to query=imageinfo and query=stashimageinfo.
+* (bug 27205) aiprop=metadata and aiprop=parsedcomment need help text.
+* Add a amtitle param to meta=allmessages.
+* (bug 25832) query=allimages now outputs ns/title as well.
+* (bug 27199) Thumbnail urls can be fetched for old files as well.
+* (bug 27376) when using ApiBase::PARAM_TYPE => 'integer' without a min or
+ max value, API doesn't validate the input is actually an integer.
+* (bug 27479) API error when using both prop=pageprops and
+ prop=info&inprop=displaytitle.
+* (bug 27554) Update API information text to reflect change in bug 26125.
+* (bug 27611) list=blocks: Use ipb_by_text instead of join with user table.
+* (bug 27616) Add userid of blocked user and blocker to list=blocks.
+* (bug 27688) Simplify queries to list user block information.
+* (bug 27708) list=users does not have a property to return user id.
+* (bug 27715) imageinfo didn't respect revdelete.
+* (bug 27862) Useremail module didn't properly return success on success.
+* (bug 27590) prop=imageinfo now allows querying the media type.
+* (bug 27587) list=filearchive now outputs full title info.
+* (bug 27018) Added action=filerevert to revert files to an old version.
+* (bug 27897) list=allusers and list=users list hidden users.
+* (bug 27717) API's exturlusage module does not respect $wgMiserMode.
+* (bug 27588) list=filearchive&faprop=sha1 returns empty attribute.
+* (bug 28010) Passing a non existant user to list=users gives internal error.
+* (bug 27549) action=query&list=users&usprop=groups doesn't show implicit
+ groups if a user doesn't have explicit groups.
+* (bug 27670) Ordering by timestamp (and usage of start and end) isn't as clear
+ in auto generated document, as it is on mediawiki.org.
+* (bug 27182) API: Add filter by prefix for meta=allmessages.
+* (bug 27183) API: Add filter by customisation state for meta=allmessages.
+* (bug 27340) API: Allow listing of "small" categories.
+* (bug 27342) Add audir param to list=allusers.
+* (bug 27203) add fato param to list=filearchive.
+* (bug 27341) Add drto param to list=deletedrevs.
+* (bug 26630) Add API for Special:ActiveUsers.
+* (bug 27020) API: Allow title prefix search of logevents (only when not in
+ miser mode).
+* (bug 26629) add Special:MIMESearch to API.
+* (bug 27585) add pagecount to list=filearchive.
+* (bug 28104) Namespace for local pages in interwiki backlinks (iwbacklinks)
+ is missing.
+* (bug 27343) Add parseddescription to list=filearchive.
+* (bug 27469) label implicit groups in list=allusers&auprop=groups/
+ list=users&usprop=groups.
+* Addition of APIQuerySiteInfoGeneralInfo hook to add extra information to
+ the general site info results.
+* (bug 16288) API: consider making closure status of wikis more clear
+ with meta=siteinfo.
+* (bug 27589) list=allimages&aiprop=archivename is useless.
+* (bug 27586) Remove duplication of props in ApiQueryStashImageInfo
+ by using ApiQueryImageInfo.
+* (bug 28226) prop=extlinks&eloffset should be an integer.
+* (bug 28070) Fix watchlist RSS for databases that store timestamps in a
+ real timestamp field.
+* API upload errors may now return the parameter that needs to be changed and
+ a sessionkey to fix the error.
+* (bug 28249) allow dupes in meta=allmessages&amargs.
+* (bug 28263) cannot import xml with the API, when have not "import" user
+ right, but "importupload".
+* (bug 28365) Added description for uiprop=preferencestoken in meta=userinfo.
+* (bug 28394) Set forgotten parameters types in ApiUnblock.
+* (bug 28395) Set forgotten parameters types in ApiParse.
+* (bug 28368) add hint for multipart/form-data to API information of
+ action=import&xml=.
+* (bug 28391) action=feedwatchlist&allrev should be a bool.
+* (bug 28364) add registration date to meta=userinfo.
+* (bug 28254) action=paraminfo: Extract type from PARAM_DFLT if
+ PARAM_TYPE is not set.
+* (bug 27712) add parent_id to list=deletedrevs.
+* (bug 28455) Add 'toponly' to recentchanges API module.
+* (bug 26873) API: Add 'toponly' filter in usercontribs module.
+* (bug 28586) YAML: strings that are the same as boolean literals.
+* (bug 28591) Update/replace/supplement spyc (YAML parsing library).
+* YAML API output is now 1.2 compliant, using JSON as the formatter.
+* (bug 28672) give information about misermode on API.
+* (bug 28558) Add iw_api and iw_wikiid to meta=siteinfo&siprop=interwikimap
+* (bug 26882) Allow listing of indefinite protections with the API.
+* (bug 27344) add drprefix param to list=deletedrevs.
+* (bug 28560) list=deletedrevs should die, if combination of param is invalid.
+* (bug 28238) paraminfo: output both limits for multi param.
+* (bug 27179) API: List of extension tags through meta=siteinfo.
+* Get a list of function hooks through meta=siteinfo.
+* Get a list of all subscribed hooks, and those subscribers.
+* (bug 28225) Allow hiding of user groups in list=allusers.
+* (bug 27185) API: Add Special:ComparePages.
+* (bug 28265) allow outputting of comments for action=expandtemplates.
+* (bug 27790) Add query type for querymodules to output of ApiParamInfo.
+* (bug 28963) Add langbacklinks query module to the api.
+* (bug 27593) API should return error message when sha1/sha1base36 is invalid.
+* (bug 28578) API's parse module should not silently override invalid
+ title inputs.
+* (bug 20699) Watchlist API should list log-events.
+* (bug 29070) Require a token in API action=watch.
+* (bug 29221) Expose oldrevid in ApiQueryWatchlist output.
+* (bug 29267) Always give the servername for meta=siteinfo&siprop=dbrepllag.
+* (bug 28897) rvparse now respects rvsection for action=query&prop=revisions.
+* (bug 25734) API: Possible issue with revids validation.
+* (bug 28002) Internal error in ApiFormatRaw::getMimeType.
+* (bug 29237) ApiQuery now has an option to output the "iwurl" attribute.
+* (bug 28392) Mark action=undelete&timestamps as type "timestamp".
+* (bug 21346) Make deleted images searchable by hash (disabled in Miser Mode).
+* (bug 27595) sha1 search of list=filearchive does not work.
+* (bug 26763) Make RSS/Atom of user contributions more visible.
+* (bug 25133) Allow redirects also for action=parse&pageid.
+* (bug 29745) Fatal error in API search.
+* (bug 29476) API returns page title instead of sectiontitle for
+ srprop=sectiontitle.
+* Correct the documentation of srprop properties.
+* (bug 28817) Add reference help page link to API Modules.
+* (bug 29935) Improve formatting of examples in ApiParamInfo.
+* (bug 29938) list=users&usprop=rights shows rights the user doesn't have.
+* (bug 24781) The API will include an XML namespace if the includexmlnamespace
+ parameter is set.
+* (bug 29392) Setting the start or end parameter now works with lists blocks,
+ categorymembers, deletedrevs, logevents, protectedtitles, usercontributions
+ and watchlist in Postgres.
+
+=== Languages updated in 1.18 ===
+
+MediaWiki supports over 330 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Angika (anp) (new).
+* Brahui (brh) (new).
+* Central Dusun (dtp) (new).
+* Jamaican Creole English (jam) (new).
+* Khowar (khw) (new).
+* Liv (liv) (new).
+* Kichwa (qug) (new).
+* Tokipona (tp) (removed) 'tokipona' is still valid.
+* (bug 17160) Gender specific display text for User namespace.
+* Link trail added for sl and sh.
+* (bug 27633) Add characters to linkTrail for Portuguese (pt and pt-br).
+* (bug 27426) Set $namespaceGenderAliases for Arabic (ar).
+* (bug 27385) Set Polish $namespaceGenderAliases.
+* (bug 27681) Set $namespaceGenderAliases for Portuguese (pt and pt-br).
+* (bug 27785) Fallback language for Kabardian (kbd) is English now.
+* (bug 27825) Raw watchlist edit message now uses formatted numbers.
+* (bug 28040) Turkish: properly lower case 'I' to 'i' (dotless i) and
+ uppercase 'i' to 'I' (dotted i).
+* Conversion script between Syllabics and Latin for the Inuktitut language.
+* Date formats for Indonesian (id) updated.
+* Bhojpuri (bho) (renamed from "bh").
+* (bug 29031) When translating block log entries, indefinite, infinite, and
+ infinity are now considered the same.
+* Aromanian (rup) (renamed from "rua-rup").
+* Kashmiri (ks) split into Kashmiri (Perso-Arabic) (ks-arab) and Kashmiri
+ (Devanagari) (ks-deva). Defaults to ks-arab.
+* (bug 30864) Use bengali numerals for <ol> for Assamese.
+* (bug 30817) Restored linktrail for kk (Kazakh).
+* (bug 27398) Add $wgExtraGenderNamespaces for configured gendered namespaces.
+* (bug 30846) New LanguageOs class.
+
+=== Other changes in 1.18 ===
+* Removed legacy wgAjaxWatch javascript global object, no longer in use.
+* (bug 28556) Upload support for MacBinary files has been removed (Used by
+ Internet Explorer 5 for Mac OS 9).
+* On wiki farm setups using $wgConf, 'wgCanonicalServer' is now expected to be
+ set for all wikis. This was already the case for 'wgServer'.
== MediaWiki 1.17 ==
@@ -10,8 +801,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
MediaWiki 1.17 is shipping with a completely redesigned installer to fix
a lot of outstanding bugs, cleanup the code quality, and make it easier to
use. Notably, you can now run upgrades from the web without having to move
-LocalSettings.php. Also, configuration script directory has been renamed
-from config/ to mw-config/. The specific bugs are listed below in the
+LocalSettings.php. Also, configuration script directory has been renamed
+from config/ to mw-config/. The specific bugs are listed below in the
general notes.
=== New ResourceLoader in 1.17 ===
@@ -84,12 +875,12 @@ are used instead.
* (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
the footers of skins.
* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy
- used for the file cache. Default value is 2, which matches former behavior
+ used for the file cache. Default value is 2, which matches former behavior
* It's no longer necessary for LocalSettings.php to include DefaultSettings.php.
* It's no longer necessary to set $wgCacheEpoch to the file modification time
- of LocalSettings.php, in LocalSettings.php itself. Instead, this is done
- automatically if $wgInvalidateCacheOnLocalSettingsChange is true (which is
- the default).
+ of LocalSettings.php, in LocalSettings.php itself. Instead, this is done
+ automatically if $wgInvalidateCacheOnLocalSettingsChange is true (which is
+ the default).
* (bug 26253) $wgPostCommitUpdateList has been removed
=== New features in 1.17 ===
@@ -455,7 +1246,7 @@ are used instead.
* Partial workaround for bug 6220: at least make files on shared repositories
show up as (struck-out) bluelinks instead of redlinks on Special:WantedFiles
* rebuildFileCache.php no longer creates inappropriate cache files for redirects
-* (bug 18372) $wgFileExtensions will now override $wgFileBlacklist
+* (bug 18372) $wgFileExtensions will now override $wgFileBlacklist
* (bug 25512) Subcategory list should not include category prefix for members.
* (bug 20244) Installer does not validate SQLite database directory for stable path
* (bug 1379) Installer directory conflicts with some hosts' configuration panel.
@@ -559,7 +1350,7 @@ are used instead.
* (bug 26006) prop=langlinks now allows obtaining full URL
* (bug 26075) ApiDelete.php now calls correctly ArticleDelete hook
* (bug 26089) add block expiration to blockinfo
-* (bug 26125) prop=imageinfo&iiprop=size now returns the page count if the
+* (bug 26125) prop=imageinfo&iiprop=size now returns the page count if the
file is a multi-page file
* (bug 10268) Added linktodiffs parameter on action=feedwatchlist
* (bug 26219) Show API limits for multi values in description
@@ -888,7 +1679,7 @@ changes to languages because of Bugzilla reports.
the return value
* Separate unit test suites under t/ and tests/ were merged and moved to
maintenance/tests/.
-* importImages.php maintenance script can now use the original uploader and
+* importImages.php maintenance script can now use the original uploader and
comment from another wiki.
* Support for Turck MMCache was removed
* (bug 14592) Warn users when they try to move their user page that their
@@ -1325,11 +2116,11 @@ comment from another wiki.
* Truncate summary of page moves in revision comment field to avoid broken
multibyte characters
* (bug 22540) ForeignApiRepos no longer try to store thumbnails that don't exist
-* (bug 22551) Special:Resetpass now has a "Cancel" button that sends the user to
+* (bug 22551) Special:Resetpass now has a "Cancel" button that sends the user to
the page set in the &returnto parameter.
* (bug 19194) Search box in Modern skin doesn't focus with Safari/Chrome
* (bug 17790) Users instantly logged off on HughesNet
-* (bug 21549) Make foreign key constraints DEFERRABLE INITIALLY DEFERRED
+* (bug 21549) Make foreign key constraints DEFERRABLE INITIALLY DEFERRED
when using Postgres as the database backend.
== API changes in 1.16 ==
@@ -1477,7 +2268,7 @@ changes to languages because of Bugzilla reports.
* (bug 12970) Brought back $wgUseImageResize.
* Added $wgRedirectOnLogin to allow specifying a specifc page to redirect users
to upon logging in (ex: "Main Page")
-* Add $wgExportFromNamespaces for enabling/disabling the "export all from
+* Add $wgExportFromNamespaces for enabling/disabling the "export all from
namespace" option (disabled by default)
=== New features in 1.15 ===
@@ -1555,12 +2346,12 @@ changes to languages because of Bugzilla reports.
'mw-editinginterface'
* (bug 17497) Oasis opendocument added to mime.types
* Remove the link to Special:FileDuplicateSearch from the "file history" section
- of image description pages as the list of duplicated files is shown in the
+ of image description pages as the list of duplicated files is shown in the
next section anyway.
* Added $wgRateLimitsExcludedIPs, to allow specific IPs to be whitelisted from
rate limits.
* (bug 14981) Shared repositories can now have display names, located at
- Mediawiki:Shared-repo-name-REPONAME, where REPONAME is the name in
+ Mediawiki:Shared-repo-name-REPONAME, where REPONAME is the name in
$wgForeignFileRepos
* Special:ListUsers: Sort list of usergroups by alphabet
* (bug 16762) Special:Movepage now shows a list of subpages when possible
@@ -1574,12 +2365,12 @@ changes to languages because of Bugzilla reports.
of $wgSpamRegex for edit summary checks. Text checks still use $wgSpamRegex.
* New function to convert content text to specified language (only applies on wiki with
LanguageConverter class)
-* (bug 17844) Redirect users to a specific page when they log in, see
+* (bug 17844) Redirect users to a specific page when they log in, see
$wgRedirectOnLogin
* Added a link to Special:UserRights on Special:Contributions for privileged users
* (bug 10336) Added new magic word {{REVISIONUSER}}, which displays the editor
of the displayed revision's author user name
-* LinkerMakeExternalLink now has an $attribs parameter for link attributes and
+* LinkerMakeExternalLink now has an $attribs parameter for link attributes and
a $linkType parameter for the type of external link being made
* (bug 17785) Dynamic dates surrounded with a <span> tag, fixing sortable tables with
dynamic dates.
@@ -1667,7 +2458,7 @@ changes to languages because of Bugzilla reports.
* (bug 17341) "Powered by MediaWiki" should be on the left on RTL wikis
* (bug 17404) "userrights-interwiki" right was missing in User::$mCoreRights
* (bug 7509) Separation strings should be configurable
-* (bug 17420) Send the correct content type from action=raw when the HTML file
+* (bug 17420) Send the correct content type from action=raw when the HTML file
cache is enabled.
* (bug 12746) Do not allow new password e-mails when wiki is in read-only mode
* (bug 17478) Fixed a PHP Strict standards error in
@@ -1728,7 +2519,7 @@ changes to languages because of Bugzilla reports.
two "page" parameters
* (bug 17972) Special:FileDuplicateSearch form now works correctly on wikis that
don't use PathInfo or short urls
-* (bug 17990) trackback.php now has a trackback.php5 alias and works with
+* (bug 17990) trackback.php now has a trackback.php5 alias and works with
$wgScriptExtension
* (bug 14990) Parser tests works again with PostgreSQL
* (bug 11487) Special:Protectedpages doesn't list protections with pr_expiry
@@ -1785,7 +2576,7 @@ changes to languages because of Bugzilla reports.
* (bug 13209) Added rvdiffto parameter to prop=revisions
* Manual language conversion improve: Now we can include both ";" and ":" in
conversion rules
-* (bug 17795) Don't report views count on meta=siteinfo if $wgDisableCounters
+* (bug 17795) Don't report views count on meta=siteinfo if $wgDisableCounters
is set
* (bug 17774) Don't hide read-restricted modules like action=query from users
without read rights, but throw an error when they try to use them.
@@ -1795,7 +2586,7 @@ changes to languages because of Bugzilla reports.
a POST request
* (bug 18099) Using appendtext to edit a non-existent page causes an interface
message to be included in the page text
-* Fixed the circular template inclusion check, was broken when the loop
+* Fixed the circular template inclusion check, was broken when the loop
involved redirects. Without this, infinite recursion within the parser is
possible.
* (bug 18601) generator=backlinks returns invalid continue parameter
@@ -2413,31 +3204,31 @@ regularly. Below only new and removed languages are listed.
== Changes since 1.13.2 ==
-David Remahl of Apple's Product Security team has identified a number of
+David Remahl of Apple's Product Security team has identified a number of
security issues in previous releases of MediaWiki. Subsequent analysis by the
MediaWiki development team expanded the scope of these vulnerabilities. The
issues with a significant impact are as follows:
* An XSS vulnerability affecting all MediaWiki installations between 1.13.0 and
1.13.2. [CVE-2008-5249]
-* A local script injection vulnerability affecting Internet Explorer clients for
+* A local script injection vulnerability affecting Internet Explorer clients for
all MediaWiki installations with uploads enabled. [CVE-2008-5250]
-* A local script injection vulnerability affecting clients with SVG scripting
- capability (such as Firefox 1.5+), for all MediaWiki installations with SVG
+* A local script injection vulnerability affecting clients with SVG scripting
+ capability (such as Firefox 1.5+), for all MediaWiki installations with SVG
uploads enabled. [CVE-2008-5250]
-* A CSRF vulnerability affecting the Special:Import feature, for all MediaWiki
+* A CSRF vulnerability affecting the Special:Import feature, for all MediaWiki
installations since the feature was introduced in 1.3.0. [CVE-2008-5252]
XSS (cross-site scripting) vulnerabilities allow an attacker to steal an
authorised user's login session, and to act as that user on the wiki. The
authorised user must visit a web page controlled by the attacker in order to
-activate the attack. Intranet wikis are vulnerable if the attacker can
+activate the attack. Intranet wikis are vulnerable if the attacker can
determine the intranet URL.
-Local script injection vulnerabilities are like XSS vulnerabilities, except
-that the attacker must have an account on the local wiki, and there is no
+Local script injection vulnerabilities are like XSS vulnerabilities, except
+that the attacker must have an account on the local wiki, and there is no
external site involved. The attacker uploads a script to the wiki, which another
-user is tricked into executing, with the effect that the attacker is able to act
+user is tricked into executing, with the effect that the attacker is able to act
as the privileged user.
CSRF vulnerabilities allow an attacker to act as an authorised user on the wiki,
@@ -2456,21 +3247,21 @@ David Remahl also reminded us of some security-related configuration issues:
to avoid leaking these images, but these measures are not perfect.
* Set display_errors=off in your php.ini to avoid path disclosure via PHP fatal
errors. This is the default on most shared web hosts.
-* Enabling MediaWiki's debugging features, such as $wgShowExceptionDetails, may
+* Enabling MediaWiki's debugging features, such as $wgShowExceptionDetails, may
lead to path disclosure.
Other changes in this release:
* Avoid fatal error in profileinfo.php when not configured.
-* Add a .htaccess to deleted images directory for additional protection against
- exposure of deleted files with known SHA-1 hashes on default installations.
-* Avoid streaming uploaded files to the user via index.php. This allows
+* Add a .htaccess to deleted images directory for additional protection against
+ exposure of deleted files with known SHA-1 hashes on default installations.
+* Avoid streaming uploaded files to the user via index.php. This allows
security-conscious users to serve uploaded files via a different domain, and
thus client-side scripts executed from that domain cannot access the login
cookies. Affects Special:Undelete, img_auth.php and thumb.php.
-* When streaming files via index.php, use the MIME type detected from the
+* When streaming files via index.php, use the MIME type detected from the
file extension, not from the data. This reduces the XSS attack surface.
-* Blacklist redirects via Special:Filepath. Such redirects exacerbate any
+* Blacklist redirects via Special:Filepath. Such redirects exacerbate any
XSS vulnerabilities involving uploads of files containing scripts.
* Internationalisation updates.
@@ -2478,17 +3269,17 @@ Other changes in this release:
* Security: Work around misconfiguration by requiring strict comparisons for
in_array in User::isAllowed().
-* (bug 14944) Added $wgShellLocale for configuration of an appropriate locale
- to use for LC_CTYPE during shell invocation. For servers that don't have
+* (bug 14944) Added $wgShellLocale for configuration of an appropriate locale
+ to use for LC_CTYPE during shell invocation. For servers that don't have
en_US.utf8. Also added locale detection during install.
* Localisation updates
* Security: Fixed XSS vulnerability in useskin parameter.
== Changes since 1.13.0 ==
-* (bug 15460) Fixed intermittent deadlock errors and poor concurrent
+* (bug 15460) Fixed intermittent deadlock errors and poor concurrent
performance for installations without memcached.
-* (bug 13770) Fixed DOM module detection for installations with both dom
+* (bug 13770) Fixed DOM module detection for installations with both dom
and domxml.
* (bug 15148) Fixed Special:BlockIP for PostgreSQL
* Fixed SQLite support for non-memcached installations
@@ -2497,7 +3288,7 @@ Other changes in this release:
== Changes since 1.13.0rc2 ==
* (bug 13770) Fixed incorrect detection of PHP's DOM module
-* Fix regression from r37834: accesskey tooltip hint should be given for the
+* Fix regression from r37834: accesskey tooltip hint should be given for the
minor edit and watch labels on the edit page.
* Updated Chinese simplified/traditional conversion tables
@@ -2516,10 +3307,10 @@ Other changes in this release:
shown as empty instead of the current time.
* (bug 14904): fragments were lost when redirects were fixed.
* Added magic word __STATICREDIRECT__ to suppress the redirect fixer
-* (bug 15035) Revert English linkTrail to /^([a-z]+)(.*)$/sD, as it was before
- r36253. Multiple reports of breakage due to old (pre-5.0) PCRE libraries,
- both bundled with PHP and packaged with distros such as RHEL.
-* (bug 14944) Shell invocation of external programs such as ImageMagick convert
+* (bug 15035) Revert English linkTrail to /^([a-z]+)(.*)$/sD, as it was before
+ r36253. Multiple reports of breakage due to old (pre-5.0) PCRE libraries,
+ both bundled with PHP and packaged with distros such as RHEL.
+* (bug 14944) Shell invocation of external programs such as ImageMagick convert
was broken in PHP 5.2.6, if the server had a non-UTF-8 locale.
@@ -2542,7 +3333,7 @@ Other changes in this release:
you to use a shared database with a different prefix. Or you can now use a local
database and use prefixes to separate wiki and the shared tables. And the new
$wgSharedTables variable allows you to specify a list of tables to share.
-* Automatic edit summaries can be disabled with $wgUseAutomaticEditSummaries
+* Automatic edit summaries can be disabled with $wgUseAutomaticEditSummaries
* Duplicates of images are now shown on the image page
* $wgRCFilterByAge allows for the list of dates in recent changes special pages to
be filtered to only those within the range of $wgRCMaxAge
@@ -2552,19 +3343,19 @@ Other changes in this release:
image page already exists
* $wgMaximumMovedPages restricts the number of pages that can be moved at once
(default 100) with the new subpage-move functionality of Special:Movepage
-* Hooks display in Special:Version is now disabled by default, use
+* Hooks display in Special:Version is now disabled by default, use
$wgSpecialVersionShowHooks = true; to enable it.
* $wgActiveUserEditCount sets the number of edits that must be performed over
a certain number of days to be considered active
* $wgActiveUserDays is that number of days
-* $wgRateLimitsExcludedGroups has been deprecated in favor of
+* $wgRateLimitsExcludedGroups has been deprecated in favor of
$wgGroupPermissions[]['noratelimit']. The former still works, however.
* New $wgGroupPermissions option 'move-subpages' added to control bulk-moving
subpages along with pages. Assigned to 'user' and 'sysop' by default.
-* New $wgRC2UDPOmitBots allows user to omit bot edits from UDP output.
+* New $wgRC2UDPOmitBots allows user to omit bot edits from UDP output.
Default: false
* Removed $wgEnableCascadingProtection option. Disabling cascading protection
- is no longer possible.
+ is no longer possible.
* $wgMessageCacheType defines now the type of cache used by the MessageCache class,
previously it was choosen based on $wgParserCacheType
* $wgExtensionAliasesFiles option to simplify adding aliases to special pages
@@ -2573,7 +3364,7 @@ Other changes in this release:
with MimeMagic.
* Added $wgDirectoryMode, which allows for setting the default CHMOD value when
creating new directories.
-* (bug 14843) $wgCookiePrefix can be set by LocalSettings now, false defaults
+* (bug 14843) $wgCookiePrefix can be set by LocalSettings now, false defaults
current behavior.
=== New features in 1.13 ===
@@ -2592,7 +3383,7 @@ Other changes in this release:
reduce broken form submissions
* Add --old-redirects-only option to maintenance/refreshLinks.php, to add old
redirects to the redirect table
-* Add links to page and file deletion forms to edit predefined delete reasons
+* Add links to page and file deletion forms to edit predefined delete reasons
* (bug 13269) Added MediaWiki:Uploadfooter to the bottom of Special:Upload
* (bug 2815) Search results for media now use thumbnail instead of text extract
* When a page doesn't exist, the tab should say "create", not "edit"
@@ -2632,7 +3423,7 @@ Other changes in this release:
text from Special:UserLogin title (new message 'nav-login-createaccount')
* Say "log in / create account" if an anonymous user can create an account,
otherwise just "log in", consistently across skins
-* Special:Shortpages and Special:Longpages now returns pages in all content
+* Special:Shortpages and Special:Longpages now returns pages in all content
namespaces, not just NS_MAIN.
* (bug 889) Improve conflict-handling between shared upload repository
and local one
@@ -2641,7 +3432,7 @@ Other changes in this release:
* (bug 709) Cannot rename/move images and other media files [EXPERIMENTAL]
* Custom rollback summaries now accept the same arguments as the default message
* (bug 12542) Added hooks for expansion of Special:Listusers
-* Drop-down AJAX search suggestions (turn on $wgEnableMWSuggest)
+* Drop-down AJAX search suggestions (turn on $wgEnableMWSuggest)
* More relevant search snippets (turn on $wgAdvancedSearchHighlighting)
* (bug 13950) Allow users to watch the user/talk pages of users they block.
* (bug 13970) Allow MonoBook-based skins to specify their own print stylesheet
@@ -2668,9 +3459,9 @@ Other changes in this release:
changed by extensions.
* Add a new hook LinkerMakeExternalLink to allow extensions to modify the output of
external links.
-* (bug 14132) Allow user to disable bot edits from being output to UDP.
-* (bug 14328) jsMsg() within Wikibits now accepts a DOM object, not just a string
-* (bug 14558) New system message (emailuserfooter) is now added to the footer of
+* (bug 14132) Allow user to disable bot edits from being output to UDP.
+* (bug 14328) jsMsg() within Wikibits now accepts a DOM object, not just a string
+* (bug 14558) New system message (emailuserfooter) is now added to the footer of
e-mails sent with Special:Emailuser
* Add support for Hijri (Islamic) calendar
* Add a new hook LinkerMakeExternalImage to allow extensions to modify the output
@@ -2689,7 +3480,7 @@ Other changes in this release:
* Foreign repo file descriptions and thumbnails are now cached.
* (bug 11732) Allow localisation of edit button images
* Allow the search box, toolbox and languages box in the Monobook sidebar to be
- moved around arbitrarily using special sections in [[MediaWiki:Sidebar]]:
+ moved around arbitrarily using special sections in [[MediaWiki:Sidebar]]:
SEARCH, TOOLBOX and LANGUAGES
* Add a new hook NormalizeMessageKey to allow extensions to replace messages before
the database is potentially queried
@@ -2698,7 +3489,7 @@ Other changes in this release:
* Special:Recentchangeslinked now includes changes to transcluded pages and
displayed images; also, the "Show changes to pages linked" checkbox now works on
category pages too, showing all links that are not categorizations
-* (bug 4578) Automatically fix redirects broken by a page move
+* (bug 4578) Automatically fix redirects broken by a page move
=== Bug fixes in 1.13 ===
@@ -2757,7 +3548,7 @@ Other changes in this release:
* (bug 13428) Fix regression in protection form layout HTML validity
* (bug 9403) Sanitize newlines from search term input
* (bug 13429) Separate date and time in message sp-newimages-showfrom
-* (bug 13137) Allow setting 'editprotected' right separately from 'protect',
+* (bug 13137) Allow setting 'editprotected' right separately from 'protect',
so groups may optionally edit protected pages without having 'protect' perms
* Disallow deletion of big pages by means of moving a page to its title and
using the "delete and move" option.
@@ -2893,7 +3684,7 @@ Other changes in this release:
* (bug 14386) Fix subpage namespace oddity when moving a talk page
* (bug 11771) Signup form now not shown if in read-only mode.
* (bug 12859) $wgRateLimitsExcludedGroups has been deprecated in favor of
- $wgGroupPermissions[]['noratelimit'].
+ $wgGroupPermissions[]['noratelimit'].
* (Bug 13828) Split parameter $1 of MediaWiki:Missingarticle into $1 (=title)
and $2 (=revision numbers)
* (bug 14401) Fix Safari access key tooltips for Windows and >3.1 Mac versions
@@ -2928,7 +3719,7 @@ Other changes in this release:
searches instead of the domain root (which may not even be a wiki).
* (bug 3481) Pages moved shortly after creation are shown at their new title
on Special:Newpages.
-* (bug 12716) Trying to unprotect a title that isn't protected no longer
+* (bug 12716) Trying to unprotect a title that isn't protected no longer
generates a log entry.
* (bug 14088) Excessively long block expiry times are rejected as invalid,
keeps the log page from being distorted.
@@ -2980,7 +3771,7 @@ Other changes in this release:
* (bug 13419) Fix gblredirect so it actually works
* (bug 13418) Disable eiredirect because it's useless
* (bug 13395) list=allcategories should use category table
-* (bug 13442) Missing pages in prop=langlinks and prop=extlinks are now
+* (bug 13442) Missing pages in prop=langlinks and prop=extlinks are now
handled properly.
* (bug 13444) Add description to list=watchlist
* (bug 13482) Disabled search types handled properly
@@ -2990,7 +3781,7 @@ Other changes in this release:
* Replaced $wgAPIUCUserPrefixMinLength by the more generic $wgAPIMaxDBRows
* (bug 11719) Remove trailing blanks in YAML output.
* (bug 13541) Added siprop=specialpagealiases to meta=siteinfo
-* Added fallback8bitEncoding and readonly fields to
+* Added fallback8bitEncoding and readonly fields to
meta=siteinfo&siprop=general output
* (bug 13544) Added prop=revid to action=parse
* (bug 13603) Added siprop=usergroups to meta=siteinfo
@@ -3019,7 +3810,7 @@ Other changes in this release:
* (bug 14013) Added rcshow=patrolled to list=recentchanges
* (bug 14028) Added language attribute to interwiki map in meta=siteinfo
* (bug 14022) Added usprop=registration and auprop=blockinfo
-* (bug 14021) Removed titles= support from list=backlinks (has been obsolete
+* (bug 14021) Removed titles= support from list=backlinks (has been obsolete
for ages)
* (bug 13829) Expose parse tree via action=expandtemplates
* (bug 13606) Allow deletion of images
@@ -3041,7 +3832,7 @@ Other changes in this release:
* Added bkip parameter to list=blocks
* (bug 14651) apprefix and similar parameters are now canonicalized
* Added clprop=timestamp to prop=categories
-* (bug 14678) API errors now respects $wgShowExceptionDetails and
+* (bug 14678) API errors now respects $wgShowExceptionDetails and
$wgShowSQLErrors
* (bug 14723) Added time zone and writing direction to meta=siteinfo
* Added APIQueryInfoTokens and APIQueryRevisionsTokens hooks so extensions
@@ -3205,7 +3996,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
and reject interwiki prefixes. PrefixSearch class centralizes this code,
and the backend part can be overridden by the PrefixSearchBackend hook.
* (bug 10365) Localization of Special:Version
-* When installing using Postgres, the Pl/Pgsql language is now checked for
+* When installing using Postgres, the Pl/Pgsql language is now checked for
and installed when at the superuser level.
* The default robot policy for the entire wiki is now configurable via the
$wgDefaultRobotPolicy setting.
@@ -3487,21 +4278,21 @@ expansion within them, but they will be stripped by the following HTML security
pass.
Bug 5678 has been fixed. This has a number of user-visible effects related to
-the removal of this double-parse. Please see the wiki page for examples.
+the removal of this double-parse. Please see the wiki page for examples.
Message transformation mode has been removed, and replaced with "preprocess"
mode. This means that some MediaWiki namespace messages may need to be updated,
especially ones which took advantage of the terribly counterintuitive behaviour
-of the former message mode.
+of the former message mode.
The header identification routines for section edit and for numbering section
edit links have been merged. This removes a significant failure mode and fixes a
whole category of bugs (tracked by bug #4899). Wikitext headings uncovered by
-template expansion will still be rendered into a heading tag, and will get an
-entry in the TOC, but will not have a section edit link. HTML-style headings
-will also not have a section edit link. Valid wikitext headings present in the
-template source text will get a template section edit link. This is a major
-break from previous behaviour, but I believe the effects are almost entirely
+template expansion will still be rendered into a heading tag, and will get an
+entry in the TOC, but will not have a section edit link. HTML-style headings
+will also not have a section edit link. Valid wikitext headings present in the
+template source text will get a template section edit link. This is a major
+break from previous behaviour, but I believe the effects are almost entirely
beneficial.
The main motivation for making these changes was performance. The new two-pass
@@ -3523,7 +4314,7 @@ The new preprocessor syntax has been documented in Backus-Naur Form at:
http://www.mediawiki.org/wiki/Preprocessor_ABNF
-The ExpandTemplates extension now has the ability to generate an XML parse
+The ExpandTemplates extension now has the ability to generate an XML parse
tree from wikitext source. This parse tree corresponds closely to the grammar
documented on that page.
@@ -3658,7 +4449,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* Improved thumb.php error handling
* Display file history on local image description pages of shared images
* Added $wgArticleRobotPolicies
-* (bug 10076) Additional parameter $7 added to MediaWiki:Blockedtext
+* (bug 10076) Additional parameter $7 added to MediaWiki:Blockedtext
containing, the ip, ip range, or username whose block is affecting the
* (bug 7691) Show relevant lines from the deletion log when re-creating a
previously deleted article
@@ -3798,12 +4589,12 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* (bug 11022) Use a more accurate page title for Special:Whatlinkshere and
Special:Recentchangeslinked
* Add link to user contributions in normal watchlist edit mode
-* (bug 9426) Add 'newsectionheaderdefaultlevel' message to allow
- modification of the heading formatting for new sections when section=new
+* (bug 9426) Add 'newsectionheaderdefaultlevel' message to allow
+ modification of the heading formatting for new sections when section=new
argument is supplied
-* (bug 10836) Add 'newsectionsummary' message to allow modification of the
+* (bug 10836) Add 'newsectionsummary' message to allow modification of the
text that prefixes a new section link in Recent Changes
-
+
== Bugfixes since 1.10 ==
* (bug 9712) Use Arabic comma in date/time formats for Arabic and Farsi
@@ -3829,7 +4620,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* (bug 7070) monobook/user.gif has antialias artifacts
* (bug 9123) Safer way when applying $wgLocalTZoffset
* (bug 9896) Documentation for $wgSquidServers and X-FORWARDED-FOR
-* (bug 9417) Uploading new versions of images when using Postgres no longer
+* (bug 9417) Uploading new versions of images when using Postgres no longer
throws warnings.
* (bug 9908) Using tsearch2 with Postgres 8.1 no longer gives an error.
* (bug 1438) Fix for diff table layout on very wide lines.
@@ -3875,7 +4666,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* (bug 9383) Don't set a default value for BLOB column in rc-deleted
database patch
* (bug 10149) Don't show full template list on section-0 edit
-* (bug 9909) Ensure access to binary fields in the math table use encodeBlob()
+* (bug 9909) Ensure access to binary fields in the math table use encodeBlob()
and decodeBlob()
* (bug 6743) Don't link broken image links to the upload form when uploads
are disabled
@@ -3897,7 +4688,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* As intended, *skip* the HTTP proxy purges when doing HTCP purges
* (bug 9696) Fix handling of brace transformations in "pagemovedtext"
* (bug 10325) Fix regression in form action on Special:Listusers
-* Fixed installation on MyISAM or old InnoDB with charset=utf8, was giving
+* Fixed installation on MyISAM or old InnoDB with charset=utf8, was giving
overlong key errors.
* Fixed zero-padding issues with MySQL 5 binary schema
* (bug 10344) Don't follow a redirect after changing its protection level
@@ -4035,7 +4826,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* (bug 8393) <sup> and <sub> need to be preserved (without attributes) for
entries in the table of contents
* (bug 11114) Fix regression in read-only mode error display during editing
-* Force non-MySQL databases to use an ORDER BY in SpecialAllpages to ensure
+* Force non-MySQL databases to use an ORDER BY in SpecialAllpages to ensure
that the first page_title is truly the first page title.
* (bug 10836) Change the summary on creating of new section
* Inclusion of Special:Wantedpages now works again
@@ -4204,7 +4995,7 @@ quarterly snapshot releases. The latest development code is always kept
"ready to run", and in fact runs our own sites on Wikipedia.
Release branches will continue to receive security updates for about a year
-from first release, but nonessential bugfixes and feature developments
+from first release, but nonessential bugfixes and feature developments
will be made on the development trunk and appear in the next quarterly release.
Those wishing to use the latest code instead of a branch release can obtain
@@ -4215,7 +5006,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* A new switch $wgCommandLineDarkBg used by maintenance scripts (parserTests.php).
It lets you specify if your terminal use a dark background, the colorized
output will be made lighter making things easier to read.
-* The minimum permissions needed to edit a page in each namespace can now be
+* The minimum permissions needed to edit a page in each namespace can now be
customized via the $wgNamespaceProtection array. By default, editing pages in
the MediaWiki namespace requires "editinterface" permission, as before.
* Allow restriction of autoconfirmed permission by edit count. New global setting
@@ -4227,7 +5018,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
== New features since 1.9 ==
-* (bug 6937) Introduce "statistics-footer" message, appended to
+* (bug 6937) Introduce "statistics-footer" message, appended to
Special:Statistics
* (bug 6638) List block flags in block log entries
* (bugs 5051, 5376) Tooltips and accesskeys no longer require JavaScript
@@ -4261,7 +5052,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
"semi protected".
* (bug 4133) Allow page protections to be made with an expiry date, in the same
format as block expiry dates. Existing protections are assumed to be infinite,
- as are protections made with the new field left blank.
+ as are protections made with the new field left blank.
* (bug 8535) Allow certain vertical alignment attributes to be used as image
keywords
* (bug 6987) Allow perrow, widths, and heights attributes for <gallery>
@@ -4371,7 +5162,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* (bug 8678) Fix detection of self-links for numeric titles in Parser
* (bug 6171) Magically close tags in tables when not using Tidy.
* Sanitizer now correctly escapes lonely '>' occurring before the first wikitag.
-* Ignore self closing on closing tags ( '</div />' now gives '</div>')
+* Ignore self closing on closing tags ( '</div />' now gives '</div>')
* (bug 8673) Minor fix for web service API content-type header
* Fix API revision list on PHP 5.2.1; bad reference assignment
* (bug 8688) Handle underscores/spaces in Special:Blockip and Special:Ipblocklist
@@ -4532,16 +5323,16 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
instead of sending the user to the main page like they used to
* Fix object variable used for displaying "not-patrolled" CSS class on list
* Fixed interaction of page parameter to ImagePage with the HTML file cache
-* Fixed MIME type for SVG files, will be silently changed from image/svg
+* Fixed MIME type for SVG files, will be silently changed from image/svg
to image/svg+xml after loading from the database.
-* Workaround for djvutoxml bug #1704049 (poor performance). Use djvudump
+* Workaround for djvutoxml bug #1704049 (poor performance). Use djvudump
instead.
* Fixed odd behaviour in ImagePage on DjVu thumbnailing errors
* (bug 5439) "Go" title search will now jump to shared/foreign Image: and
MediaWiki: pages that have not been locally edited.
* (bug 9630) Limits links in Whatlinkshere forgot about namespace filter
* Fixed upgrade for the non-standard MySQL schemas
-* Disable MySQL's strict mode at session start for MySQL 4.1+, to avoid the
+* Disable MySQL's strict mode at session start for MySQL 4.1+, to avoid the
various problems that occur when it is on.
* (bug 9585) Fix regression in tidy usage in Special:Undelete previews
* (bug 3826) Normalize some invalid cookie name characters when setting
@@ -4554,8 +5345,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* (bug 5959) Anchors dropped from stub links
* (bug 3348) Some additional weak password checks: password which is same
as username will now be rejected.
-* (bug 8602) Converted Special:Contributions to use an IndexPager. The
- interpretation of the offset parameter has changed, and the go parameter
+* (bug 8602) Converted Special:Contributions to use an IndexPager. The
+ interpretation of the offset parameter has changed, and the go parameter
has been removed.
* (bug 6204) Fixes for indentation with $wgMaxTocLevel:
- don't emit too many list close tags after an invisible header
@@ -5393,12 +6184,12 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 6586) Regression in "unblocked" subtitle
* Don't put empty-page message into view-source when page text is blank
* (bug 6587) Remove redundant "allnonarticles" message
-* Block improvements: Allow blocks on anonymous users only. Optionally allow
+* Block improvements: Allow blocks on anonymous users only. Optionally allow
or disallow account creation from blocked IP addresses. Prevent duplicate
blocks. Fixed the problem of expiry and unblocking erroneously affecting
multiple blocks. Fixed confusing lack of error message when a blocked user
- attempts to create an account. Fixed inefficiency of Special:Ipblocklist in
- the presence of large numbers of blocks; added indexes and implemented an
+ attempts to create an account. Fixed inefficiency of Special:Ipblocklist in
+ the presence of large numbers of blocks; added indexes and implemented an
indexed pager.
* (bug 6448) Allow filtering of Special:Newpages according to username
* (bug 6618) Improve permissions/error detection in Special:Lockdb
@@ -5436,11 +6227,11 @@ they will be run along with the main tests by maintenance/parserTests.php
* Moved the bulk of the localisation data from the Language*.php files to the
Messages*.php files. Deleted most of the Languages*.php files.
* Introduced "stub global" framework to provide deferred initialisation of core
- modules.
+ modules.
* Removed placeholder values for $wgTitle and $wgArticle, these variables will
now be null during the initialisation process, until they are set by index.php
or another entry point.
-* Added DBA cache type, for BDB-style caches.
+* Added DBA cache type, for BDB-style caches.
* Removed custom date format functions, replacing them with a format string in
the style of PHP's date(). Used string identifiers instead of integer
identifiers, in both the language files and user preferences. Migration should
@@ -5448,25 +6239,25 @@ they will be run along with the main tests by maintenance/parserTests.php
* Simplified the initialisation API for LoadBalancer objects.
* Removed the broken altencoding feature.
* Moved default user options and toggles from Language to User. Language objects
- are still able to define default preference overrides and extra user toggles,
+ are still able to define default preference overrides and extra user toggles,
via a slightly different interface.
* Don't include the date option in the parser cache rendering hash unless
$wgUseDynamicDates is enabled.
-* Merged LanguageUtf8 with Language. Removed LanguageUtf8.php.
+* Merged LanguageUtf8 with Language. Removed LanguageUtf8.php.
* Removed inclusion of language files from the bottom of Language.php. This is
- now consistently done from Language::factory().
+ now consistently done from Language::factory().
* Add the name of the executing maintenance script to the debug log. Start the
profiler during maintenance scripts.
* Added "serialized" directory, for storing precompiled data in serialized form.
* Fix regression in auto-set NS_PROJECT_TALK namespace
* Fix regression in ordering of namespaces
* (bug 6806, 6030) Added several global JS variables for article path, user name,
- page title, etc.
+ page title, etc.
* hooks registered with addOnloadHook are now called at the one of the html body
by all skins.
* Split ajax aided search from core ajax framework. Use wgUseAjax to enable the
framework and wgAjaxSearch to enable the suggest feature for the search box.
-* Added experimental installer for extensions.
+* Added experimental installer for extensions.
See maintenance/installExtension.php
* Added Tajic (tg) language file.
* (bug 6903) Added Cantonese localisation (zh-yue)
@@ -5512,7 +6303,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* Fix bug in wfRunHooks which caused corruption of objects in the hook list
* (bug 4979) Use simplified email addresses when running on Windows
* (bug 4434) Show block log fragment on Special:Blockip
-* [[MediaWiki:Disambiguationspage]] may optionally contain wiki links to any number
+* [[MediaWiki:Disambiguationspage]] may optionally contain wiki links to any number
of disambiguation templates.
* [[Special:Disambiguations]] now shows pages in NS:0 that link to any pages that embed
any of the templates listed at [[MediaWiki:Disambiguationspage]].
@@ -5557,7 +6348,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* Added experimental $wgRevisionCacheExpiry to cache extracted revision text
in $wgMemc, to further reduce hits to external storage.
Set to 0 (disabled) by default.
-* Minor changes to the installer.
+* Minor changes to the installer.
* Remove ":" for 'youremail' and 'yourrealname' in includes/templates/Userlogin.php
so that ":" could be used in i18n for Special:Preferences (like 'username' and 'uid').
* Fix layout for Special:Preferences->Date and Time (position for 'timezonetext').
@@ -5576,13 +6367,13 @@ they will be run along with the main tests by maintenance/parserTests.php
was meant to be banned years ago... For now existing accounts will not be
prevented fromm login.
* (bug 6092) Introduce magic words {{REVISIONDAY}}, {{REVISIONDAY2}, {{REVISIONMONTH}},
- {{REVISIONYEAR}} and {{REVISIONTIMESTAMP}}
+ {{REVISIONYEAR}} and {{REVISIONTIMESTAMP}}
* (bug 7425) Preceeding whitespace in [[...]] breaks subpages
* Try to reconnect after transitory database errors in dumpTextPass.php
* (bug 6023) Fixed mismatch of 0/NULL for wl_notificationtimestamp; now notification
mails are working after 'Mark all pages visited' button on Special:Watchlist is clicked
-* Made {{INT:}} a core parser function instead of a special case. The syntax
- and behaviour is largely unchanged.
+* Made {{INT:}} a core parser function instead of a special case. The syntax
+ and behaviour is largely unchanged.
* (bug 7448) Fixing the native name for Ewe (ee)
* (bug 6864) Replace message 'editing' with new message 'editinguser' in Special:Userrights
to allow better localisation
@@ -5601,9 +6392,9 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 6617) Validate timestamps on Special:Undelete
* Do fewer unnecessary full writes of user rows; only update user_touched
for watch/unwatch, group membership change, and login operations
-* Restructured the languages directory, to avoid problems when people
- untar MW 1.8 over the top of a 1.7 installation.
-* (bug 6890) SQL query error on bad input to Pager lists
+* Restructured the languages directory, to avoid problems when people
+ untar MW 1.8 over the top of a 1.7 installation.
+* (bug 6890) SQL query error on bad input to Pager lists
due to negative LIMIT clause, caused by integer wraparound.
* Fixed various bugs related to table prefixes, especially the interaction
between table prefixes and memcached, which was formerly completely broken.
@@ -5696,7 +6487,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 5536) Use content language for editing help link
* Improvements to German localisation files
* (bug 5570) Problems using <special page>/parameter link form for long titles
-* (bug 3884) Add $user parameter to AddNewUser hook, call it for by-email
+* (bug 3884) Add $user parameter to AddNewUser hook, call it for by-email
registrations as well as self-registrations.
* (bug 4327) Report age of cached data sets in query pages
* (bug 4662) Fix Safari check in wikibits.js
@@ -5713,7 +6504,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 2910) Default view preferences for watchlists
* Add "hide bot edits from the watchlist" user preference
* (bug 5250) Introduce Special:Unusedtemplates
-* Add user preference setting for an extended watchlist, showing all recent
+* Add user preference setting for an extended watchlist, showing all recent
edits up to a certain edit, and not just the latest edit..
* Made MessageRo.php more general
* (bug 5640) Indonesian localisation improvements
@@ -6032,7 +6823,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 6170) Update for Kashubian translation (csb)
* (bug 6191) Update to Indonesian translation (id) #18
* (bug 6114) Update to Walloon localization (wa)
-* Added $wgNamespaceRobotPolicies to allow customisation of robot policies on a
+* Added $wgNamespaceRobotPolicies to allow customisation of robot policies on a
per-namespace basis.
* Add <ol> to the list of block elements for doBlockLevels; avoids <p>s being
interspersed into your ordered lists.
@@ -6060,7 +6851,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 3837) Leave <center> as is instead of doing an unsafe text replacement
to <div class="center">. <center> is perfectly valid in the target doctype
(XHTML 1.0 Transitional), while the replacement didn't catch all cases and
- could even result in invalid output from valid input.
+ could even result in invalid output from valid input.
* (bug 4280) Use 'noindex,nofollow' instead of 'noindex,follow' for default
meta robots tag on diff view and special pages. Should reduce impact of
robots on scrolling special pages, diffs etc on sites where robots.txt
@@ -6121,7 +6912,7 @@ they will be run along with the main tests by maintenance/parserTests.php
in StreamFile
* (bug 6304) Show timestamp for current revision in diff pages
* Vertically align current version with old version header in diff display
-* (bug 6174) Remove redundant "emailforlost" message
+* (bug 6174) Remove redundant "emailforlost" message
* (bug 6189) Show an error to an unprivilleged user trying to create account
* (bug 6365) Show user information in the "old revision" navigation links
* Introduce 'FetchChangesList' hook; see docs/hooks.txt for more information
@@ -6303,7 +7094,7 @@ Database:
* Respect database prefix in dumpHTML.inc
* Removed read-only check from Database::query()
* Added externallinks table, to track links to arbitrary URLs
-* Added job table, for deferred processing of jobs. The immediate application is
+* Added job table, for deferred processing of jobs. The immediate application is
to complete the link table refresh operation when templates are changed.
* Don't change the password of the MySQL root user.
@@ -6365,7 +7156,7 @@ Installer:
* Fixed installer bugs 921 and 3914 (issues with using root and so forth)
* (bug 4258) Use ugly urls for ISAPI by default
patch by Rob Church
-* Improve installer
+* Improve installer
* Use a superuser account (such as root), if specifed, to create tables
* Don't overwrite conservative permissions on the mySQL user with ALL
permissions, if said user exists
@@ -6376,7 +7167,7 @@ Installer:
Maintenance:
* Fix problem reported on mailing list where re-initialising stats didn't work (can't insert
duplicate rows with the same id field)
-* Added --conf option to command line scripts, allowing the user to specify a
+* Added --conf option to command line scripts, allowing the user to specify a
different LocalSettings.php.
* Maintenance script to delete unused text records
* Maintenance script to delete non-current revisions
@@ -6536,7 +7327,7 @@ Parser:
* (bug 1850) Image link to nonexistent file fixed.
* (bug 5167) Add {{SUBPAGENAME}} and {{SUBPAGENAMEE}} variables
* (bug 4949) Missing : in "addedwatchtext" for English and Spanish
-* Allow user-defined functions, which work in a similar way to {{GRAMMAR:}}
+* Allow user-defined functions, which work in a similar way to {{GRAMMAR:}}
etc. Registered via an interface similar to tag hooks.
Upload:
@@ -6574,7 +7365,7 @@ Security:
* Set cookies to secure mode based on use of HTTPS or $wgCookieSecure
* (bug 4371) Disallow tilde character in signatures
* Removed broken wgAllowAnonymousMinor and added new group right minoredit
-* Added detection for WMF files (application/x-msmetafile), added this
+* Added detection for WMF files (application/x-msmetafile), added this
MIME type to the default blacklist. Prevented inline display of images
which are not of known image types. This is in response to
http://en.wikipedia.org/wiki/Windows_Metafile_vulnerability
@@ -6591,7 +7382,7 @@ Special Pages:
* (bug 1956) Hide bot uploads from Special:Newimages
* (bug 3220) Fix escaping of block URLs in Recentchanges
* (bug 3284) Ipblocklist paging, substring search
-* Allow filtering of robot edits in Special:Watchlist by stting
+* Allow filtering of robot edits in Special:Watchlist by stting
$wgFilterRobotsWL = true.
* Fix interlanguage links on special pages when extra namespaces configured
* (bug 3475) anon contrib links on Special:Newpages
@@ -6799,12 +7590,12 @@ fully support the editing toolbar, but was found to be too confusing.
* (bug 912) Search box easier to reach in text browsers (lynx, links)
* $wgParserCacheExpireTime added
* Skip loading of RecentChange.php except where needed
-* Enforce $wgSVGMaxSize when rendering, even for SVGs with a very large source
+* Enforce $wgSVGMaxSize when rendering, even for SVGs with a very large source
size. This is necessary to limit server memory usage.
* Cleanup and error checking on Special:Listredirects
* Clear up some instances of old OutputPage::sysopRequired() function usage
* Improve "upload disabled" notice
-* Move parts of index.php to include/Wiki.php in an attempt to both cleanup index.php
+* Move parts of index.php to include/Wiki.php in an attempt to both cleanup index.php
and create a MediaWiki-class mediaWiki base object
* (bug 4104) Added OutputPageBeforeHTML hook for tweaking primary wiki output
HTML on final output (cached or not)
@@ -6947,7 +7738,7 @@ fully support the editing toolbar, but was found to be too confusing.
would be generated smaller than expected.
* (bug 5062) Width sometimes one pixel short when using maximum heights
* Purge thumbnails and metadata cache for action=purge on an image page
-* (bug 4273) Bounce back with a message when attempting to submit a new comment
+* (bug 4273) Bounce back with a message when attempting to submit a new comment
with an empty main textbox (user probably hit Enter in subject field)
* (bug 5141) Gracefully handle the new account link when createaccount off
* (bug 5150 and related) Fix missing ID attribute in HTML namespace selector
@@ -7021,13 +7812,13 @@ March 2, 2006
MediaWiki 1.5.7 is a bugfix maintenance release.
-Most importantly, a security issue in the installer has been fixed. The bug
-affects new installations of 1.5.6 only. If the user specified the MySQL root
-password, to allow the installer to create an unprivileged account, the
-installer would not only create the new account but also change the root
-password to be equal to the password of the new account.
+Most importantly, a security issue in the installer has been fixed. The bug
+affects new installations of 1.5.6 only. If the user specified the MySQL root
+password, to allow the installer to create an unprivileged account, the
+installer would not only create the new account but also change the root
+password to be equal to the password of the new account.
-Anyone affected by this bug will need to change the root password back
+Anyone affected by this bug will need to change the root password back
manually. For information about how to change passwords in MySQL please see:
http://dev.mysql.com/doc/refman/5.1/en/passwords.html
@@ -7188,7 +7979,7 @@ Schema:
The core table schema has changed significantly. This should make better
use of the database's cache and disk I/O, and make significantly speed up
rename and delete operations on pages with very long edit histories.
-
+
Unfortunately this does mean upgrading a wiki of size from 1.4 will require
some downtime for the schema restructuring, but future storage backend
changes should be able to integrate into the new system more easily.
@@ -7210,13 +8001,13 @@ Editing diff:
Uploads:
It's now possible to specify the final filename of an upload distinct
from the original filename on your disk.
-
+
An image link for a missing file will now take you straight to the upload page.
-
+
More metadata is pre-extracted from uploaded images, which will ease pressure
on disk or NFS volumes used to store images. EXIF metadata is displayed on
the image description page if PHP is configured with the necessary module.
-
+
If .svg files are added to the upload whitelist, you can choose to render
them to rasterized .png images for inline display using one of several
external helper programs. See DefaultSettings.php for SVG options.
@@ -7225,13 +8016,13 @@ User accounts:
There are some changes to the user permissions system, with assignable
groups. Note that this does *not* allow you to make pages which are only
accessible to certain groups.
-
+
For details see: http://www.mediawiki.org/wiki/Manual:User_rights
E-mail:
User-to-user e-mail can now be restricted to require a mail-back confirmation
first to reduce potential for abuse with false addresses.
-
+
Updates to user talk pages and watchlist entries can optionally send e-mail
notifications.
@@ -7249,12 +8040,12 @@ Latin-1:
Wikis must now be encoded in Unicode UTF-8; this has been the default for
some time, but some languages could optionally be installed in Latin-1 mode.
This is no longer supported.
-
+
You can check if your current wiki is in Latin-1 mode by using your browser's
"view source"; look for a line like this:
-
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
+
If it says charset=utf-8, you're ready. If it says charset=iso8859-1,
you may need to convert your data. (English-language wikis avoiding
any accented characters may be able to get away without conversion.)
@@ -7262,7 +8053,7 @@ Latin-1:
MySQL 3.x:
Some optimization hacks for MySQL 3.x have been removed as part of the schema
clean-up (specifically, the inverse_timestamp fields).
-
+
MediaWiki 1.5 may still run on 3.x, but wikis of non-trivial size should
very seriously consider upgrading to a more modern release. MySQL 3.x support
will probably be entirely dropped in the next major release.
@@ -7282,7 +8073,7 @@ Upgrade:
old page text entries, but other metadata fields (titles, comments etc) need
to be pre-converted. The standard upgrade process does not yet fully automate
this, but you can try the alternate partial-upgrader in upgrade1_5.php.
-
+
The upgrade from 1.4 to 1.5 schema has not been tested for all cases, so
it's possible you may experience problems in some combinations.
@@ -7291,7 +8082,7 @@ Backups:
text table on deletion. If you provide public backup dumps of your databases,
you will probably want to use the new XML-format dump generator, available
as maintenance/dumpBackup.php.
-
+
For more information on how we run our own public data dumps at Wikimedia,
see http://meta.wikimedia.org/wiki/Data_dumps
@@ -7605,7 +8396,7 @@ Various bugfixes, small features, and a few experimental things:
* (bug 2394) Undo incompatible breakage to {{msg:}} compatiblity includes
* (bug 1322) Use a shorter cl_sortkey field to avoid breaking on MySQL 4.1
when the default charset is set to utf8
-* (bug 2400) don't send confirmation mail on account creation if
+* (bug 2400) don't send confirmation mail on account creation if
$wgEmailAuthentication is false.
* (bug 2172) Fix problem with nowiki beeing replaced by marker strings
when a template with a gallery was used.
@@ -7785,7 +8576,7 @@ of MediaWiki:Newpagetext) to &action=edit, if page is new.
== Changes since 1.5beta2 ==
* Escaped & correctly in Special:Contributions
-* (bug 2534) Hide edit sections with CSS to make right click to edit section work
+* (bug 2534) Hide edit sections with CSS to make right click to edit section work
* (bug 2708) Avoid undefined notice on cookieless login attempt
* (bug 2188) Correct template namespace for Greek localization
* Fixed number formatting for Dutch
@@ -8050,34 +8841,34 @@ of MediaWiki:Newpagetext) to &action=edit, if page is new.
=== Changes since 1.5.4 ===
* Maintenance script to delete unused user accounts
-* Added detection for WMF files (application/x-msmetafile), added this
+* Added detection for WMF files (application/x-msmetafile), added this
MIME type to the default blacklist. Prevented inline display of images
which are not of known image types. This is in response to
http://en.wikipedia.org/wiki/Windows_Metafile_vulnerability
=== Changes since 1.5.5 ===
-* (bug 4258) When installing under IIS, $wgArticlePath = "$wgScript?title=$1"
+* (bug 4258) When installing under IIS, $wgArticlePath = "$wgScript?title=$1"
should be set
* (bug 4510) Correct Barnes & Noble bookstore URLs
* (bug 4504) Use site language for namespace name resolution
-* Installer fixes from HEAD backported; now uses a more sensible method of
- establishing which mySQL user to use, which clears up bug 921 et al. Minor
+* Installer fixes from HEAD backported; now uses a more sensible method of
+ establishing which mySQL user to use, which clears up bug 921 et al. Minor
changes to installer.
-* Fix problem reported on mailing list where re-initialising stats didn't work
+* Fix problem reported on mailing list where re-initialising stats didn't work
(can't insert duplicate rows with the same id field)
* (bug 1122) gray out 'older revision' when viewing first article revision.
* Respect database prefix in dumpHTML.inc
* Minor improvements to removeUnusedAccounts.php maintenance script
* Fix for single-digit week numbers from {{CURRENTWEEK}}, broken by PHP 4.4.1
* Removed read-only check from Database::query()
-* Added --conf option to command line scripts, allowing the user to specify a
+* Added --conf option to command line scripts, allowing the user to specify a
different LocalSettings.php.
=== Changes since 1.5.6 ===
* Default main page content improved per bug 4690
-* Fix dependence on hardcoded UNIQ_PREFIX in LanguageConverter.php
+* Fix dependence on hardcoded UNIQ_PREFIX in LanguageConverter.php
* Fixed Special:Unlockdb
* Maintenance script to delete unused text records
* Maintenance script to delete non-current revisions
@@ -8427,7 +9218,7 @@ pages for purposes of page relevancy ranking.
* (bug 1193) Fix move-only page protection mode
* Fix zhtable Makefile to include the traditional manual table
* Add memcache timeout for the zh conversion tables
-* Allow user customization of the zh conversion tables through
+* Allow user customization of the zh conversion tables through
Mediawiki:zhconversiontable
* Add zh-min-man (back) to language names list
* Ported $wgCopyrightIcon setting from REL1_3A
@@ -8450,7 +9241,7 @@ pages for purposes of page relevancy ranking.
* (bug 752) Don't insert newline in link title for url with %0a
* Fix missing search box contents in MonoBook skin
* Add option to forward search directly to an external URL (eg google)
-* Correctly highlight the fallback language variant when the selected
+* Correctly highlight the fallback language variant when the selected
variant is disabled. Used in zh: only for now.
=== Beta 5 fixes ===
@@ -8486,7 +9277,7 @@ pages for purposes of page relevancy ranking.
* Memcached data compression fixes
* Several valid XHTML fixes
* (bug 624) Fix IE freezing rendering whilst waiting for CSS with MonoBook
-* (bug 211) Fix tabbed preferences with XHTML MIME type
+* (bug 211) Fix tabbed preferences with XHTML MIME type
* Fix for script execution vulnerability.
=== Beta 6 fixes ===
@@ -8522,7 +9313,7 @@ pages for purposes of page relevancy ranking.
* (bug 1368) Fix SQL error on stopword/short word search w/ MySQL 3.x
* Translated Hebrew namespace names
* (bug 1429) Stop double-escaping of block comments; fix formatting
-* (bug 829) Fix URL-escaping on block success
+* (bug 829) Fix URL-escaping on block success
* (bug 1228) Fix double-escaping on &amp; sequences in [enclosed] URLs
* (bug 1435) Fixed many CSS errors
* (bug 1457) Fix XHTML validation on category column list
@@ -8556,7 +9347,7 @@ pages for purposes of page relevancy ranking.
* convertLinks script fixes
* Corrections to template loop detection
* XHTML encoding fix for usernames containing & in Special:Emailuser
-* (for zh) Search for variant links even when conversion is turned off,
+* (for zh) Search for variant links even when conversion is turned off,
to help prevent duplicate articles.
* Disallow ISO 8859-1 C1 characters and "no-break space" in user names
on Latin-1 wikis.
@@ -8600,7 +9391,7 @@ pages for purposes of page relevancy ranking.
exist" and "wrong password" when using AuthPlugin
* (bug 1532), (bug 1544) Changed language names for
'bn', 'bo', 'dv', 'dz', 'ht', 'ii', 'li', 'lo', 'ng', 'or', 'pa', 'si',
- 'ti', 've'
+ 'ti', 've'
* Fix editing on non-Esperanto wiki with user language pref set to Esperanto
* Make conversion table for zh-sg default to zh-cn, and zh-hk default to zh-tw
* Fix PHP notice in MonoBook when counters disabled
@@ -8669,7 +9460,7 @@ pages for purposes of page relevancy ranking.
* (bug 1963) Fix deletion log link when $wgCapitalLinks is off
* (bug 1970) Don't show move tab for immobile pages
* (bug 1770) Page creation recorded links from the 'newarticletext' message
-* Optional change to the site_stats table. When applied, this removes the need
+* Optional change to the site_stats table. When applied, this removes the need
for expensive queries in Special:Statistics.
diff --git a/INSTALL b/INSTALL
index 1f226fe0..3a2860fe 100644
--- a/INSTALL
+++ b/INSTALL
@@ -8,9 +8,10 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
Required software:
* Web server with PHP 5.2.3 or higher.
* A SQL server, the following types are supported
-** MySQL 4.0.14 or higher
+** MySQL 5.0.2 or higher
** PostgreSQL 8.3 or higher
-** SQLite
+** SQLite 3.3.7 or higher
+** Oracle 9.0.1 or higher
MediaWiki is developed and tested mainly on Unix/Linux platforms, but should
work on Windows as well.
diff --git a/README b/README
index e95b1e76..078f92c9 100644
--- a/README
+++ b/README
@@ -8,8 +8,8 @@ RELEASE-NOTES, INSTALL, and UPGRADE.
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 60000+ requests per second range
-as of November 2008).
+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
@@ -26,7 +26,7 @@ The MediaWiki software was written by:
* Erik Moeller
* Tim Starling
* Gabriel Wicke
-* Ashar Voultoiz
+* Antoine Musso
* Evan Prodromou
* Ævar Arnfjörð Bjarmason
* Niklas Laxström
@@ -45,6 +45,10 @@ The MediaWiki software was written by:
* Trevor Pascal
* Bryan Tong Minh
* Sam Reed
+* Victor Vasiliev
+* Rotem Liss
+* Platonides
+* Antoine Musso
* Several others (view CREDITS for a more complete list)
The contributors hold the copyright to this work, and it is licensed under the
diff --git a/RELEASE-NOTES-1.18 b/RELEASE-NOTES-1.18
deleted file mode 100644
index bec12bf6..00000000
--- a/RELEASE-NOTES-1.18
+++ /dev/null
@@ -1,860 +0,0 @@
-= MediaWiki release notes =
-
-Security reminder: MediaWiki does not require PHP's register_globals
-setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
-
-=== Changes since 1.18.2 ===
-2012-04-25
-
-* (bug 35446) Using "{{nse:}}" with an invalid namespace name no longer throws
- a PHP warning.
-* (bug 35567) The whole password reminder e-mail is now sent in the same language.
-* (bug 35961) Hash comparison should always be strict.
-* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
- on line 598.
-* Fix broken email confirmation expiration caused by MWCryptRand changes.
-
-== MediaWiki 1.18.2 ==
-2012-03-21
-
-This is a maintenance and security release of the MediaWiki 1.18 branch.
-
-=== Changes since 1.18.1 ===
-* (bug 33686) could not get a list of contributor for an article when using
- a SQLite database.
-* (Bug 33865) Exception thrown in action=parse when attempting to use the title
- parameter without setting the text parameter.
-* UserMailer could potentially throw a fatal error when a MailAddress object had
- an empty email address.
-* (Bug 33087) Exchange server rejected mail sent by MediaWiki
-* (bug 34528) Edit section tooltips show correction section name again
-* (bug 34246) MediaWiki:Whatlinkshere-summary message is displayed again in
- Special:Whatlinkshere
-* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in
- core parser functions which operate on strings, such as formatnum.
-* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
- parameter present.
-* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
- CSRF attacks.
-* (bug 35317) CSRF in Special:Upload.
-
-== MediaWiki 1.18.1 ==
-2012-01-11
-
-This a maintenance and security release of the MediaWiki 1.18 branch.
-
-=== Changes since 1.18.0 ===
-* (bug 32712) Fix for search indexing of pages with certain unicode chars following URL.
-* (bug 3901) Lang, hreflang attribs added to sidebar interlanguage links for screen readers.
-* (bug 30774) mediawiki.html: Add support for numbers and booleans in the
- attribute values and element contents.
-* (bug 32473) [[Special:PasswordReset]] can not be used on private wiki.
-* (bug 32853) Fixed CACHE_DBA object cache type.
-* (bug 32786) Backward compatibility for extension using 1.17's Database::newFromType().
-* Fixed exception when using Special:WhatLinksHere on a Media: file.
-* (bug 32709) Private Wiki users were always taken to Special:Badtitle on login.
-* (bug 33240) Sort images are missing but referenced in css.
-* (bug 31921) Magic words REVISIONDAY, REVISIONMONTH and REVISIONYEAR were
- not showing their values on preview.
-* (bug 32702) Removed method Skin::makeGlobalVariablesScript() has been readded
- for backward compatibility.
-* (bug 30172) The check for posix_isatty() in maintenance scripts did not detect
- when the function exists but is disabled. Introduced Maintenance::posix_isatty().
-* (bug 33305) Make mw.util.addCSS resistant to IE's @font-face bug by setting
- cssText after DOM insertion.
-* (bug 29102) Upgrades no longer fail with the error "Unknown character set: 'mysql4'.
-* (bug 25355) Parser generates edit section links for special pages.
-* (bug 33321) Adding a line to MediaWiki:Sidebar that contains a pipe, but doesn't
- have any pipes after being transformed by MessageCache, causes exception on
- all pages.
-* Fixed recentchanges FK violation on page delete and cache purge error in updater
- for Oracle DB.
-* (bug 33117) prop=revisions allows deleted text to be exposed through cache pollution.
-
-== MediaWiki 1.18.0 ==
-2011-11-24
-
-This is the first stable release of the MediaWiki 1.18 branch.
-
-=== Summary of selected changes in 1.18 ===
-
-Selected changes since MediaWiki 1.17 that may be of interest:
-
-* Some of the more commonly used MediaWiki extensions are now included in the
- release tarball. These extensions are ConfirmEdit, Gadgets, Nuke, ParserFunctions,
- Renameuser, Vector and WikiEditor.
-
-* Gender support has been improved, meaning user pages can display the correct gender
- variant of "User" can now be used.
-
-* MediaWiki can now detect the camera orientation of an image from the Exif metadata, and
- can rotate the image thumbnail appropriately. Metadata support has been generally
- improved, and can now extract IPTC and XMP metadata.
-
-* Improved directionality support in 1.18 means that MediaWiki is better to use for
- RTL users.
-
-* MediaWiki now supports protocol - relative URLs in links, interwiki targets and $wgServer
-
-* Math support has been removed from core
-
-=== Changes since 1.18.0rc1 ===
-* (bug 32228) regression in Special:Search which did not conserve profile on new search
-* (bug 32460) Categories were improperly aligned in Simple and CologneBlue
-* (bug 32412) TOC links on [[Special:EditWatchlist]] points to the fieldsets
-* (bug 32582) Fix TOC show/hide link regression on IE 8
-
-=== Changes since 1.18 beta 1 ===
-* (bug 31886) Wrong titles redirecting to Special:Badtitle in the 1.18 deployment.
-* (bug 32051) Fix description for wlprop=sizes.
-* (bug 31913) Special:MostLinkedTemplates had an incorrect GROUP BY clause
- under Microsoft SQL.
-* (bug 32100) installer complains about suhosin GET limit.
-* (bug 31933) fix 1.18 regression in Monobook sidebar: huge spacing between portlets
- on IE 7 and IE 8/9 in compatibility view.
-* (bug 32126) Fix 1.18 regression in watchlist editor when items already removed
- from watchlist.
-* (bug 32183) remove the client-* classes added from user-agent-sniffing onto
- the <html> element.
-* (bug 29912) Unit tests break if parsertest tables are still present.
-* (bug 31694) During installation, tabbing order (cursor focus) goes to logo
- instead of 'continue'.
-* (bug 29102) Upgrade fails "Unknown character set: 'mysql4".
-* (bug 31990) justify paragraphs pref adds extra space to category listing.
-* (bug 20148) Better title for [[Special:Disambiguations]] page.
-* (bug 31502) TOC is missing on Special:EditWatchlist.
-* (bug 32256) API list=search stops at first invalid result.
-* (bug 32047) jquery.tablesorter.js: thead is before caption.
-* (bug 29854) Store protocol-relative links twice in the externallinks table,
- one with http: in el_index and once with https.
-* (bug 31822) Error during upgrade due to output buffer reset in stdout.
-
-=== Configuration changes in 1.18 ===
-* The WantedPages::getSQL hook has been removed and replaced with
- WantedPages::getQueryInfo. This may break older extensions.
-* The SkinTemplateBuildContentActionUrlsAfterSpecialPage,
- SkinTemplateContentActions and SkinTemplateTabs hooks have been removed in
- favor of SkinTemplateNavigation and SkinTemplateNavigation::SpecialPage.
-* $wgUseCombinedLoginLink controls whether to output a combined
- login / create account link in the personal bar, or to output separate login
- and create account links.
-* Skin names are no longer created based on a ucfirst version of the key in
- $wgValidSkinNames but now the value. This means for
- $wgValidSkinNames["monobook"] = "MonoBook"; the skin loader will no longer try
- loading SkinMonobook and will instead load SkinMonoBook.
-* $wgMaxUploadSize may now be set to an array to specify the upload size limit
- per upload type.
-* $wgAPICacheHelp added in 1.16 is now removed. To disable API help caching, set
- $wgAPICacheHelpTimeout = 0;
-* OutputPage::isUserJsAllowed() no longer returns false when scripts are allowed
- by the page, but $wgAllowUserJs is set to false.
-* Pure "Skin" class based custom skins are no longer supported, all custom skins
- should be put together using SkinTemplate and BaseTemplate or QuickTemplate.
-* The transliteration for passwords in case they were migrated from an old
- Latin-1 install (previous to MediaWiki 1.5) is now only done for wikis with
- $wgLegacyEncoding set.
-* (bug 27508) Add $wgSVGMetadataCutoff to limit the maximum amount of an SVG we
- look at when finding metadata to prevent excessive resource usage.
-* $wgSysopUserBans and $wgSysopRangeBans (deprecated in 1.17) are now removed.
- Use $wgBlockCIDRLimit = array( 'IPv4' => 43, 'IPv6' => 128 ) to achieve the
- same functionality as $wgSysopRangeBans; you can use the BlockIp hook to
- replicate $wgSysopUserBans functionality.
-* The options on the block form have been standardised such that checking a box
- makes the block 'more serious'; so while "check to prevent account creation"
- and "check to enable autoblock" remain the same, "check to allow user-talk
- edit" is reversed to "check to *disable* user-talk edit", and "check to block
- anon-only" becomes "check to block logged-in users too". The default settings
- remain the same.
-* Most of the field names on the Special:Block form have been changed, which
- will probably break screen-scraping bots.
-* (bug 26866) The 'trackback' right is no longer granted to sysops by default.
- $wgUseTrackbacks is already false by default.
-* (bug 17009) the hiddenStructure CSS class, a highly hackish way of at least
- *appearing* to hide article elements, has been removed. Use the
- ParserFunctions extension to actually remove unwanted elements from the
- output.
-* (bug 14202) $wgUseTeX has been superseded by the Math extension. To re-enable
- math conversion after upgrading, obtain the Math extension from SVN or from
- http://www.mediawiki.org/wiki/Extension:Math and add to LocalSettings.php:
- require_once "$IP/extensions/Math/Math.php";
-* $wgProfiler is now a configuration array, see StartProfiler.sample for
- details.
-* $wgProfiling has been removed.
-* The spyc library is now no longer included in phase3.
-* (bug 28343) Unused preferences contextlines/contextchars have been removed
-* $wgSkinExtensionFunctions has been removed. Use $wgExtensionFunctions instead.
-* $wgProto has been removed. You now only need to set $wgServer to change the
- URL protocol.
-* $wgRateLimitsExcludedGroups (deprecated in 1.13) has been removed.
-* $wgInputEncoding and $wgOutputEncoding (deprecated in 1.5) have now been removed.
-* $wgAllowUserSkin (deprecated in 1.16) has now been removed.
-* $wgExtraRandompageSQL (deprecated in 1.16) has now been removed.
-* LogReader and LogViewer classes (deprecated in 1.14) have now been removed.
-* (bug 26033) Added $wgArticleCountMethod to select the method to use to say
- whether a page is an article or not. $wgUseCommaCount is now deprecated.
-* $wgEnableDublinCoreRdf and $wgEnableCreativeCommonsRdf no longer work in core,
- and the functionality has been moved to the relevant extensions. See
- http://www.mediawiki.org/wiki/Extension:DublinCoreRdf and
- http://www.mediawiki.org/wiki/Extension:CreativeCommonsRdf as appropriate.
-* (bug 21107) Split error "customcssjsprotected" into separate messages for JS and CSS
-* Removed $wgCheckCopyrightUpload from DefaultSettings, since the relevant feature
- was removed in about 1.5.
-* LogPageValidTypes, LogPageLogName, LogPageLogHeader and LogPageActionText
- hooks have been removed.
-* New hook "Collation::factory" to allow extensions to create custom
- category collations.
-* $wgGroupPermissions now supports per namespace permissions.
-* $wgEnableAutoRotation enables or disables auto-rotation. Leaving it set to
- null will cause MediaWiki to determine if auto-rotation is available.
-
-=== New features in 1.18 ===
-* BREAKING CHANGE: action=watch / action=unwatch now requires a token.
-* BREAKING CHANGE: Article class hierarchy split into WikiPage (backend).
- and Article (frontend) hierarchies. Several hooks now pass a WikiPage object instead
- of an Article object. These hooks all use an $article paramater as documented in hooks.txt.
- Extensions should be updated to account for this, though most won't require any changes.
-* (bug 27860) Minor edit after clicking 'new section' tab
- Now the "This is a minor edit" checkbox is not available when you
- create a page or new section.
-* (bug 8130) Query pages should limit to content namespaces, not just main
- namespace.
-* Special:Contribs now redirects to Special:Contributions.
-* (bug 6672) Images are now autorotated according to their EXIF orientation.
- This only affects thumbnails; the source remains unrotated.
-* (bug 25708) Update case mappings and normalization to Unicode 6.0.0.
-* New hook ArticlePrepareTextForEdit added, called when preparing text to be
- saved.
-* New parser option PreSaveTransform added, allows the pre-save transformation
- to be selectively disabled.
-* Alternative to $wgHooks implemented, using the new Hooks class.
-* Add width parameter to Special:Filepath to allow getting the file path of a
- thumbnail.
-* (bug 26870) Add size to {{filepath:}}.
-* Upload warnings now show a thumbnail of the uploaded file.
-* Introduced the edittools-upload message, which will be inserted under the
- upload form instead of edittools if available.
-* (bug 26285) Extensions will be automatically generated on upload if the user
- specified a filename without extension.
-* (bug 26851) Special:UserRights now allows to prefill the reason field
-* New maintenance script to fix double redirects
- (maintenance/fixDoubleRedirects.php).
-* (bug 23315) New body classes to allow easier styling of special pages.
-* (bug 27159) Make email confirmation code expiration time configurable.
-* (bug 29047) CSS/JS for each user group is imported from MediaWiki:Group-sysop.js,
- MediaWiki:Group-autoconfirmed.css, etc.
-* (bug 24230) Uploads of ZIP types, such as MS Office or OpenOffice can now be
- safely enabled. A ZIP file reader was added which can scan a ZIP file for
- potentially dangerous Java applets. This allows applets to be blocked
- specifically, rather than all ZIP files being blocked.
-* (bug 2429) Allow selection of associated namespace in recent changes.
-* (bug 26217) File size is now checked before uploading in HTML5 browsers.
-* CSS stylesheet MediaWiki:Noscript.css is now loaded for users with JavaScript
- disabled (enclosed in the head in a <noscript> tag).
-* Added UserGetLanguageObject hook to change the language used in $wgLang.
-* (bug 14645) When $wgMiserMode is on, expensive special pages are styled
- differently (italicized by default) on Special:SpecialPages.
-* Added $wgAggregateStatsID, which allows UDP stats to be aggregated over
- several wikis.
-* When $wgAllowMicrodataAttributes is true, all itemtypes are allowed, not just
- the three that were defined in the original specification.
-* (bug 14706) Added support for the Imagick PHP extension.
-* (bug 18691) Added support for SVG rasterization using the Imagick PHP
- extension.
-* (bug 2581, bug 6834) Added links to thumbnail in several resolutions to the
- file description page. The sizes are set by $wgImageLimits.
-* (bug 28031) Add pageCount support to ArchivedFile.
-* (bug 27924) PhpHttpRequest doesn't return response body if HTTP != 200.
-* Added hook BitmapHandlerTransform to allow extension to transform a file
- without overriding the entire handler.
-* The parser now attempts to output markers for editsection tokens and defer the
- rendering of them post-cache to reduce parser cache fragmentation and ensure
- skin customizability of edit section links.
-* (bug 24755) AuthPlugin auto-creation of local accounts can now be aborted by
- other extensions by handling the 'AbortAutoAccount' hook, similar to the
- 'AbortNewAccount' triggered by explicit account creations. (They are separate
- to avoid loops and confusion; auth plugins like CentralAuth need to handle
- AbortNewAccount separately.
-* Special:ListFiles is now transcludable.
-* (bug 13879) Special:Emailuser asks for suitable target user if called without.
-* (bug 16956) IPTC and XMP metadata now extracted from images.
-* (bug 23816) A tracking category is now added for any pages with broken images.
-* (bug 23495) Allow createAndPromote.php to create non-sysop users.
-* (bug 28916) A way to to toggle mw.config legacy globals settings from
- LocalSettings.php has been created by introducing $wgLegacyJavaScriptGlobals.
-* (bug 28503) Support for ircs:// URL protocols.
-* (bug 26033) It is now possible to count all non-redirect pages in content
- namespaces as articles.
-* Images can now be embedded in an XML dump stream using backupDump.php
- --include-files and can be imported using importDump.php --uploads;
- furthermore, it can import files from the filesystem using --image-base-path.
-* Three new hooks in Special:Undelete, 'UndeleteForm::showHistory',
- 'UndeleteForm::showRevision' and 'UndeleteForm::undelete', so that extensions
- may override the usage of PageArchive class and replace it with their own
- class that extends PageArchive.
-* (bug 28915) Implement QUnit test suite for MediaWiki JavaScript.
- Also built-in support for distribution through a TestSwarm instance.
-* (bug 29036) For cascade-protected pages, the mw-textarea-cprotected class is
- added to the textarea on the edit form.
-* mw.util.wikiScript has been implemented (like wfScript in GlobalFunctions.php)
-* (bug 29067) Expose user.tokens (like we do user.options) in ResourceLoader.
-* New 'Debug' hook used by wfDebug() and wfDebugLog().
-* (bug 27655) Require token for watching/unwatching pages)
-* (bug 28904) (bug 29773) Update jQuery version from 1.4.4 to 1.6.2 (the latest version)
-* (bug 29441) Expose CapitalLinks config in JS to allow modules to properly
- handle titles on case-sensitive wikis.
-* (bug 29397) Implement mw.Title module in core.
-* In MySQL 4.1.9+ with replication enabled, fetch the slave lag from SHOW SLAVE
- STATUS instead of SHOW PROCESSLIST. This ensures that lag is reported
- correctly in the case where there are no write events occurring. Note that
- the DB user now needs to have the REPLICATION CLIENT privilege if you are
- using replication.
-* Language codes in $wgDummyLanguageCodes are now excluded on localization
- statistics (maintenance/language/transstat.php).
-* (bug 29586) Make the (next 200) links on categories link directly to
- the relevant section of the category.
-* (bug 29109) Allow the automatic edit summary for redirect creation
- show the first bit of the new redirect page.
-* (bug 29723) mw.util.wikiGetlink() now defaults to wgPageName.
-* (bug 29680) Add GetDefaultSortkey hook to override the default sortkey.
-* (bug 16699) {{#language:}} accepts second parameter to specify the language in
- which the language name is wanted. Coverage depends on the cldr extension.
-* (bug 15802) An easy way to look up messages: language qqx which returns
- the message keys.
-* (bug 29868) Add support for passing parameters to mw.msg in jquery.localize.
-* (bug 29558) $wgMiserMode now disables update.php by default.
-* AjaxCategories: Easily add, edit or delete categories on article pages.
- Suggests possible categories when typing, all saves are done via AJAX.
- Supports editing of multiple categories and then saving them in one batch.
-* $wgAutopromoteOnce was added, allowing for users to be automatically promoted
- to explicit usergroups. If a group is removed from a user via Special:UserRights,
- it will not automatically be re-added. Configuration is similar to
- $wgAutopromote (see DefaultSettings.php).
-* The PerformRetroactiveAutoblock hook was added to allow overriding or complementing
- retroactive autoblock handling. This runs when blocking a user with the 'autoblock' option.
-* MediaWiki now supports using protocol-relative URLs in links, interwiki
- targets and $wgServer.
-* Introduced $wgVaryOnXFPForAPI which will cause the API to send
- Vary: X-Forwarded-Proto headers.
-* New maintenance script to refresh image metadata (maintenance/refreshImageMetadata.php).
-* (bug 16428) Include permalink in printable version.
-* (bug 30722) Add an identity collation that sorts things based on what the
- unicode code point is (aka pre-1.17 behaviour).
-* (bug 30940) Add a hook in User:getDefaultOptions.
- To give extensions a better and more flexible way of providing default
- values for preferences a hook has been introdiced in User:getDefaultOptions().
- Setting preferences in $wgDefaultUserOptions still work fine, but when reading
- them (i.e. with array_keys) to get a list of all preferences, then
- $wgDefaultUserOptions should no longer be used as it will contain those set via
- User:getDefaultOptions().
-* (bug 30497) Add client-nojs and client-js classes on document element
- to let styles easily hide or show things based on general JS availability.
-* (bug 31293) If Special:Userlogin is loaded over HTTPS, display
- MediaWiki:loginend-https instead of MediaWiki:loginend, if it's not empty.
- Same for signupend on the account creation page.
-* (bug 31233) New OutputPage::addJsConfigVars() method to make the output page specific
- mw.config map extendable.
-* mw.util.wikiScript has been implemented (like wfScript in GlobalFunctions.php).
-
-=== Bug fixes in 1.18 ===
-* (bug 27860) Minor edit after clicking 'new section' tab.
-* (bug 23119) WikiError class and subclasses are now marked as deprecated.
-* (bug 10871) Javascript and CSS pages in MediaWiki namespace are no longer
- treated as wikitext on preview.
-* (bug 22753) Output from update.php is more clear when things changed, entries
- indicating nothing changed are now all prefixed by "...".
-* Page existence is now not revealed (in the colour of the tabs) to users who
- cannot read the page in question.
-* (bug 19006) {{REVISIONUSER}} no longer acts like {{CURRENTUSER}} in some
- cases.
-* (bug 16019) $wgArticlePath = "/$1" no longer breaks API edit/watch actions.
-* (bug 18372) File types blacklisted by $wgFileBlacklist will no longer be shown
- as "Permitted file types" on the upload form.
-* (bug 26379) importImages.php gives more descriptive error message on failure.
-* (bug 26410) + signs are no longer treated as spaces in internal links if
- link has a % sign in it.
-* (bug 26412) Search results headers no longer show a bogus edit link.
-* (bug 26540) Fixed wrong call to applyPatch in MysqlUpdater.
-* (bug 26574) Added 'upload' to $wgRestrictionTypes, allowing upload protected
- pages to be queried via the API and Special:ProtectedPages, and allowing
- disabling upload protection by removing it from $wgRestrictionTypes.
-* If an edit summary exceeds 250 bytes and is truncated, add an ellipse.
-* (bug 26638) Database error pages display correctly in RTL languages.
-* (bug 26187) Confirmrecreate no longer parses the edit summary.
-* (bug 26208) Mark directionality of some interlanguage links.
-* (bug 26034) Make the "View / Read" tab in content_navigation style tabs remain
- selected when the action is "purge".
-* (bug 14267) Support a MediaWiki:Mainpage-nstab override for the subject
- namespace tab on the mainpage of a wiki.
-* (bug 10158) Do not mention allowing others to contact you when the feature
- is disabled ($wgEnableUserEmail=false).
-* (bug 26733) Wrap initial table creation in transaction.
-* (bug 26729) Category pages should return 404 if they do not exist and have no
- members.
-* (bug 2585) Image pages should send 404 if no image, no shared image and no
- description page.
-* Custom editintro's using the editintro url parameter will no longer show
- <noinclude> sections on pages they are included on.
-* (bug 26449) Keep underlines from headings outside of tables and thumbs by
- adding overflow:hidden to h1,h2,h3,h4,h5,h6 (also fixes editsection bunching).
-* (bug 26708) Remove background-color:white from tables in Monobook and Vector.
-* (bug 28422) Remove color:black from tables in Monobook and Vector. And add it
- to table.wikitable instead.
-* (bug 26781) {{PAGENAME}} and related parser functions escape their output
- better.
-* (bug 26716) Provide link to instructions for external editor related
- preferences and add a comment to the ini control file explaining what is
- going on.
-* Trying to upload a file with no extension or with a disallowed MIME type now
- gives the right message instead of complaining about a MIME/extension
- mismatch.
-* (bug 26809) Uploading files with multiple extensions where one of the
- extensions is blacklisted now gives the proper extension in the error message.
-* (bug 26961) Hide anon edits in watchlist preference now actually works.
-* (bug 19751) Filesystem is now checked during image undeletion.
-* Send last modified headers for Special:Recentchanges when RC patrol is
- enabled, but user cannot see rc patrol links.
-* (bug 26548) ForeignAPIRepo (InstantCommons) now works with PDF files
- and other multi-paged file formats.
-* Files with a mime type that does not match the extension are now properly
- thumbnailed.
-* (bug 27201) Special:WhatLinksHere output no longer contains duplicate IDs.
-* (bug 15905) Nostalgia skin could become more usable by including a Talk:
- link at the top of the page.
-* (bug 27560) Search queries no longer fail in Walloon language.
-* (bug 27679) Broken embedded files with special characters are no longer
- double HTML escaped.
-* (bug 27700) The upload protection can now also be set for files that do not
- exist.
-* (bug 27763) Article::getParserOutput() no longer throws a fatal given when an
- incorrect revision ID is passed.
-* Trim the form field for uploading by url to remove extra spaces which could
- cause confusing error messages.
-* (bug 27854) Http::isValidURI is way too lax.
-* Do not show enotifminoredits preference, if disabled by $wgEnotifMinorEdits.
-* AbortLogin returning "ABORTED" now handled. Also allows message identifier
- for "ABORTED" reason to be returned and displayed to user.
-* (bug 28034) uploading file to local wiki when file exists on shared repository
- (commons) gives spurious info in the warning message.
-* Usernames get lost when selecting different sorts on Special:listfiles.
-* (bug 14005) editing section 0 of an existing but empty page gives no such
- section error.
-* (bug 26939) Installer does not set $wgMetaNamespace.
-* (bug 28166) UploadBase assumes that 'edit' and 'upload' rights are not per
- page restrictions.
-* Make truncate function automatically consider length of '...' string,
- since length can vary by localization.
-* (bug 28242) Make redirects generated by urls containing a local interwiki
- prefix be a 301 instead of a 302.
-* (bug 15641) blocked administrators are now prevented from deleting or
- protecting their own talk page; and all blocked users are more
- comprehensively prevented from performing other actions.
-* (bug 27893) Edit-on-doubleclick now applies only on view and purge actions;
- no longer triggers unexpectedly on delete, history etc.
-* (bug 28417) Fix PHP notice when importing revision without a listed id.
-* (bug 28430) Make html and TeX output of <math> always be left-to-right.
-* (bug 28306) Fix exposure of suppressed usernames in ForeignDBRepo.
-* (bug 28372) Fix bogus link to suppressed file versions in ForeignDBRepo.
-* (bug 27473) Fix regression: bold, italic no longer interfere with linktrail
- for ca, kaa.
-* (bug 28444) Fix regression: edit-on-doubleclick retains revision id again.
-* &apos; character entity is now allowed in wikitext.
-* UtfNormal::cleanUp on an invalid utf-8 sequence no longer returns false if
- intl installed.
-* (bug 28561) The css class small will no longer make nested elements even
- smaller.
-* (bug 13172) Array type exif data (like GPS) was not being extracted from
- images.
-* (bug 28532) wfMsgExt() and wfMsgWikiHtml() use $wgOut->parse().
-* (bug 16129) Transcluded special pages expose strip markers when they output
- parsed messages.
-* (bug 27249) "Installed software" table in Special:Version should always be
- left-to-right.
-* (bug 28719) Do not call mLinkHolders __destruct explicitly.
-* (bug 21196) Article::getContributors() no longer fails on PostgreSQL.
-* (bug 28752) XCache doesn't work in CLI mode.
-* (bug 28076) Thumbnail height limited to 360 pixels on Special:Listfiles.
-* (bug 22227) Special:Listfiles no longer throws an error on bogus file entries.
-* (bug 19408) user_properties.up_property: 32 bytes is not enough.
-* (bug 25262) Fix for minification of hardcoded data: URIs in CSS.
-* (bug 29263) Add LTR class to the shared CSS to be used for left-to-right text
- such as SQL queries shown in dberrortext and similar messages in RTL
- environments.
-* (bug 14977) Fixed $wgServer detection in cases where an IPv6 address is used
- as the server name.
-* The View X deleted revisions is now shown again on Special:Upload.
-* (bug 29071) mediawiki.action.watch.ajax.js should pass uselang to API.
-* (bug 28868) Show total pages in the subtitle of an image on the
- file description page for multi-paged documents.
-* (bug 28883) Message names for different compression types commonly
- used in Tiff files.
-* When translcuding a special page, do not let it interpret url parameters.
-* (bug 28887) Special page classes are no longer re-used during 1 request.
-* (bug 28888) Searching for something starting with a # sign no longer tells
- the user a page named [[:]] already exists.
-* (bug 23002) Imagelinks table not updated after imagemove.
-* (bug 27864) Transcluding {{Special:Prefix}} with empty prefix now lists all
- pages.
-* (bug 18803) JPEG2000 images should not be uploadable as .jpg files.
-* (bug 11868) If using links to count articles, the checking will now be based
- on the real presence of an internal link instead of the "[[" string.
-* (bug 28287) The "your changes" box for edit conflicts is now read-only.
-* (bug 28940) When making a thumb of an SVG, and only specifying the height
- make the width be the max SVG size, not the natrual width of the SVG.
-* (bug 1780) Uploading files with non-ascii characters are now forbidden on
- Windows.
-* (bug 23464) File: prefixes are now chopped off during uploading.
-* (bug 28174) Message config-logo-help amended to not explicitly assume any
- LTR/RTL screen layout.
-* (bug 28992) Revision numbers in the patrol log are transformed in the user
- language.
-* (bug 27073) ResourceLoaderDynamicStyles marker should be dynamically appended to
- the document head if it doesn't exist.
-* (bug 27023) After the document is ready, mw.loader is broken (calls callback
- before module is parsed).
-* (bug 4330) External URLs without a custom title should be treated as LTR,
- even in RTL text.
-* (bug 29055) Make "don't send email on minor edits" preference apply to
- changes to talk page in addition to watchlist edits.
-* (bug 28272) Special:AllMessages should have only one "Go" button.
-* (bug 29101) Special:FileDuplicateSearch no longer shows silly message.
-* (bug 29048) jQuery.tabIndex: firstTabIndex() should not output the same
- as lastTabIndex().
-* (bug 29332) Warn if user requests mediawiki-announce subscription but does not
- enter an e-mail address.
-* (bug 25375) Add canonical namespaces to "wgNamespaceIds" in mw.config.
-* The class JpegOrTiffHandler was renamed ExifBitmapHandler.
-* (bug 29443) Special:Undelete should use JavaScript to invert all checkboxes
- instead of reloading the page.
-* (bug 29325) Setting $wgStrictFileExtensions to false no longer gives incorrect warning.
-* (bug 29437) Multiple apostrophes in deleted article title cause odd rendering.
-* (bug 29485) RSS feed of Special:RecentChange grouped together multiple
- consecutive edits by same user in included diff, but then linked to
- a single ungrouped diff.
-* Do not try to group together a page creation and edit in the RSS feed of RC.
-* (bug 29342) Patrol preferences shouldn't be visible to users who don't have
- patrol permissions.
-* (bug 29471) Exception no longer thrown for files with invalid date in metadata.
-* (bug 29492) Long-running steps in the installer (such as Upgrade and Install)
- no longer cause timeouts.
-* (bug 29507) Change 'image link' to 'file link' in Special:Whatlinkshere.
-* If the db is really screwed up, and doesn't have a recentchanges table,
- make the updater throw an exception instead of a fatal.
-* wfArrayToCGI() and wfCgiToArray() now handle nested and associative arrays
- correctly.
-* (bug 29567) mw.util.addPortletLink should only wrap link in <span> for
- "vectorTabs" portlets.
-* (bug 8556) Incorrect session failure warning on preview-on-open
- namespaces (categories) when combined with $wgRawHtml.
-* Use content language in formatting of dates in revertpage message
- (rollback revert edit summary) and do not adjust for user timezone.
-* (bug 29277) MediaWiki:Filepage.css is also shown on the local wiki
-* Make sure Backlink cache does not retrieve interwiki redirects when looking for
- redirects to a local page.
-* (bug 6100) Allow different directionality (LTR/RTL) for user interface
- and wiki content, along with many other RTL and directionality improvements
- (such as bugs 28030, 12406, 28349).
-* (bug 29712) Removed broken defaultUserOptionOverrides in MessagesXx files and
- unneeded CSS flipping of quickbar. Instead, introduce option 5 which sets
- left/right according to the directionality of your interface language.
-* (bug 19514) Unordered list list-style-image should be IE6-compatible (8-bit).
-* (bug 27410) The tag filter on a history page is now within a <label> element.
-* (bug 29779) DairikiDiff/WikiDiff <ins> and <del> should undo browser default
- styling (strike/underline).
-* (bug 28630) Add iwlinks, langlinks, redirect to
- RefreshLinks::deleteLinksFromNonexistent.
-* (bug 29797) Error: "Tried to load block with invalid type" when subpages
- are disabled for user pages.
-* (bug 12205) Bidirectional names in action=credits are split and displayed.
- incorrectly when wrapped to the next line.
-* (bug 20781) Move 'mainpagetext' messages to installer's .i18n file.
-* (bug 29737) "MediaWiki:Qbsettings-directionality" should refer to script,
- not language.
-* (bug 26360) $wgSessionHandler was overriding system settings unconditionally.
-* Removed AjaxFunctions.php. The last remaining function js_unescape() was moved
- to the FCKEditor extension.
-* (bug 28762) Resizing to specified height broken for very thin images.
-* (bug 29959) Installer fatal when cURL and allow_url_fopen is disabled and user
- tries to subsribe to mediawiki-announce.
-* (bug 27427) mw.util.getParamValue shouldn't return value from hash even if
- param is only present in hash.
-* Installer checked for magic_quotes_runtime instead of register_globals.
-* (bug 30131) XCache with variable caching disabled no longer used for variable
- caching (CACHE_ACCEL)
-* $wgSVGMaxSize is now applied to the smaller of width or height, making very wide
- pano/timeline/diagram SVGs renderable at saner sizes.
-* (bug 30219) The page shown when LocalSettings.php does not exist was broken on
- Windows servers.
-* (bug 30074) Moving user JS subpages resulted in JS errors because
- #REDIRECT [[Foo]] is invalid JS.
-* (bug 30335) Fix for HTMLForms using GET breaking when non-friendly URLs
- are used.
-* (bug 30264) Changed installer-generated LocalSettings.php to use require_once()
- instead require() for included extensions.
-* Tracking categories are no longer shown in footer for special pages.
-* (bug 30684) Fix bad escaping in mw.message for inexistent messages (i.e. <key>).
-* $wgOverrideSiteFeed no longer double escapes urls.
-* The preprocessor no longer fails with a PHP warning about XML_PARSE_HUGE when
- processing complex pages using newer versions of libxml2.
-* (bug 30907) Special:Unusedcategories should sort ascendingly.
-* (bug 28545) When using the uca-default collation, sortkey's starting with a
- space (U+20) will sort under an invisible header like in 1.16 rather than a U+6DE.
-* (bug 30192) Thumbnails of archived files are now deleted.
-* (bug 30843) mediawiki.Title should not convert extensions (anything after the
- last full stop) to lower case).
-* (bug 31213) Exception thrown when trying to move file cross-namespace.
-* (bug 18424) Special:Prefixindex and Special:Allpages paging links are
- really small, and somewhat inconsistent with each other.
-* (bug 30466) Entries in iwlinks table are now cleared when moving a page over
- redirect.
-* (bug 31674) Can't edit watchlist if it contains special pages.
-* (bug 32100) Installer complains about Suhosin GET limit even if it is
- already set above 1024 bytes.
-
-=== API changes in 1.18 ===
-* BREAKING CHANGE: action=watch now requires POST and token.
-* (bug 26339) Throw warning when truncating an overlarge API result.
-* (bug 14869) Add API module for accessing QueryPage-based special pages.
-* (bug 14020) API for Special:Unwatchedpages.
-* (bug 24287) Wrap API Help output at 100 characters.
-* Add a realname uiprop option to query=userinfo so a user's realname can be
- extracted.
-* Add a &watchuser option to ApiBlock.
-* (bug 26541) Generator-ise ApiQueryRecentChanges.
-* action=parse now correctly returns an error for nonexistent pages.
-* (bug 25767) Add userrights properties to allusers and users query lists.
-* (bug 26558) list=allusers auprop=groups does not list groups a user is
- automatically a member of.
-* (bug 26559) list=allusers auprop=rights does not match
- list=users usprop=rights.
-* (bug 26560) On allusers if limit < total number of users, last user gets
- duplicate.
-* (bug 25135) add "normalized" to action=parse.
-* (bug 26460) Add support for listing category members by category pageid.
-* (bug 26482) add a imimages param to prop=images.
-* (bug 26498) allow LinksUpdate with API.
-* (bug 26485) add a elextlinks param to prop=extlinks.
-* (bug 26483) add a iwtitles param to prop=iwlinks.
-* (bug 26484) add a lltitles param to prop=langlinks.
-* (bug 26480) add a pppageprops param to prop=pageprops.
-* (bug 26650) Remove $wgAPICacheHelp in favour of $wgAPICacheHelpTimeout.
-* (bug 24650) Fix API to work with categorylinks changes.
-* Expose list of skins in meta=siteinfo.
-* (bug 26548) Add iiurlparam param to query=imageinfo and query=stashimageinfo.
-* (bug 27205) aiprop=metadata and aiprop=parsedcomment need help text.
-* Add a amtitle param to meta=allmessages.
-* (bug 25832) query=allimages now outputs ns/title as well.
-* (bug 27199) Thumbnail urls can be fetched for old files as well.
-* (bug 27376) when using ApiBase::PARAM_TYPE => 'integer' without a min or
- max value, API doesn't validate the input is actually an integer.
-* (bug 27479) API error when using both prop=pageprops and
- prop=info&inprop=displaytitle.
-* (bug 27554) Update API information text to reflect change in bug 26125.
-* (bug 27611) list=blocks: Use ipb_by_text instead of join with user table.
-* (bug 27616) Add userid of blocked user and blocker to list=blocks.
-* (bug 27688) Simplify queries to list user block information.
-* (bug 27708) list=users does not have a property to return user id.
-* (bug 27715) imageinfo didn't respect revdelete.
-* (bug 27862) Useremail module didn't properly return success on success.
-* (bug 27590) prop=imageinfo now allows querying the media type.
-* (bug 27587) list=filearchive now outputs full title info.
-* (bug 27018) Added action=filerevert to revert files to an old version.
-* (bug 27897) list=allusers and list=users list hidden users.
-* (bug 27717) API's exturlusage module does not respect $wgMiserMode.
-* (bug 27588) list=filearchive&faprop=sha1 returns empty attribute.
-* (bug 28010) Passing a non existant user to list=users gives internal error.
-* (bug 27549) action=query&list=users&usprop=groups doesn't show implicit
- groups if a user doesn't have explicit groups.
-* (bug 27670) Ordering by timestamp (and usage of start and end) isn't as clear
- in auto generated document, as it is on mediawiki.org.
-* (bug 27182) API: Add filter by prefix for meta=allmessages.
-* (bug 27183) API: Add filter by customisation state for meta=allmessages.
-* (bug 27340) API: Allow listing of "small" categories.
-* (bug 27342) Add audir param to list=allusers.
-* (bug 27203) add fato param to list=filearchive.
-* (bug 27341) Add drto param to list=deletedrevs.
-* (bug 26630) Add API for Special:ActiveUsers.
-* (bug 27020) API: Allow title prefix search of logevents (only when not in
- miser mode).
-* (bug 26629) add Special:MIMESearch to API.
-* (bug 27585) add pagecount to list=filearchive.
-* (bug 28104) Namespace for local pages in interwiki backlinks (iwbacklinks)
- is missing.
-* (bug 27343) Add parseddescription to list=filearchive.
-* (bug 27469) label implicit groups in list=allusers&auprop=groups/
- list=users&usprop=groups.
-* Addition of APIQuerySiteInfoGeneralInfo hook to add extra information to
- the general site info results.
-* (bug 16288) API: consider making closure status of wikis more clear
- with meta=siteinfo.
-* (bug 27589) list=allimages&aiprop=archivename is useless.
-* (bug 27586) Remove duplication of props in ApiQueryStashImageInfo
- by using ApiQueryImageInfo.
-* (bug 28226) prop=extlinks&eloffset should be an integer.
-* (bug 28070) Fix watchlist RSS for databases that store timestamps in a
- real timestamp field.
-* API upload errors may now return the parameter that needs to be changed and
- a sessionkey to fix the error.
-* (bug 28249) allow dupes in meta=allmessages&amargs.
-* (bug 28263) cannot import xml with the API, when have not "import" user
- right, but "importupload".
-* (bug 28365) Added description for uiprop=preferencestoken in meta=userinfo.
-* (bug 28394) Set forgotten parameters types in ApiUnblock.
-* (bug 28395) Set forgotten parameters types in ApiParse.
-* (bug 28368) add hint for multipart/form-data to API information of
- action=import&xml=.
-* (bug 28391) action=feedwatchlist&allrev should be a bool.
-* (bug 28364) add registration date to meta=userinfo.
-* (bug 28254) action=paraminfo: Extract type from PARAM_DFLT if
- PARAM_TYPE is not set.
-* (bug 27712) add parent_id to list=deletedrevs.
-* (bug 28455) Add 'toponly' to recentchanges API module.
-* (bug 26873) API: Add 'toponly' filter in usercontribs module.
-* (bug 28586) YAML: strings that are the same as boolean literals.
-* (bug 28591) Update/replace/supplement spyc (YAML parsing library).
-* YAML API output is now 1.2 compliant, using JSON as the formatter.
-* (bug 28672) give information about misermode on API.
-* (bug 28558) Add iw_api and iw_wikiid to meta=siteinfo&siprop=interwikimap
-* (bug 26882) Allow listing of indefinite protections with the API.
-* (bug 27344) add drprefix param to list=deletedrevs.
-* (bug 28560) list=deletedrevs should die, if combination of param is invalid.
-* (bug 28238) paraminfo: output both limits for multi param.
-* (bug 27179) API: List of extension tags through meta=siteinfo.
-* Get a list of function hooks through meta=siteinfo.
-* Get a list of all subscribed hooks, and those subscribers.
-* (bug 28225) Allow hiding of user groups in list=allusers.
-* (bug 27185) API: Add Special:ComparePages.
-* (bug 28265) allow outputting of comments for action=expandtemplates.
-* (bug 27790) Add query type for querymodules to output of ApiParamInfo.
-* (bug 28963) Add langbacklinks query module to the api.
-* (bug 27593) API should return error message when sha1/sha1base36 is invalid.
-* (bug 28578) API's parse module should not silently override invalid
- title inputs.
-* (bug 20699) Watchlist API should list log-events.
-* (bug 29070) Require a token in API action=watch.
-* (bug 29221) Expose oldrevid in ApiQueryWatchlist output.
-* (bug 29267) Always give the servername for meta=siteinfo&siprop=dbrepllag.
-* (bug 28897) rvparse now respects rvsection for action=query&prop=revisions.
-* (bug 25734) API: Possible issue with revids validation.
-* (bug 28002) Internal error in ApiFormatRaw::getMimeType.
-* (bug 29237) ApiQuery now has an option to output the "iwurl" attribute.
-* (bug 28392) Mark action=undelete&timestamps as type "timestamp".
-* (bug 21346) Make deleted images searchable by hash (disabled in Miser Mode).
-* (bug 27595) sha1 search of list=filearchive does not work.
-* (bug 26763) Make RSS/Atom of user contributions more visible.
-* (bug 25133) Allow redirects also for action=parse&pageid.
-* (bug 29745) Fatal error in API search.
-* (bug 29476) API returns page title instead of sectiontitle for
- srprop=sectiontitle.
-* Correct the documentation of srprop properties.
-* (bug 28817) Add reference help page link to API Modules.
-* (bug 29935) Improve formatting of examples in ApiParamInfo.
-* (bug 29938) list=users&usprop=rights shows rights the user doesn't have.
-* (bug 24781) The API will include an XML namespace if the includexmlnamespace
- parameter is set.
-* (bug 29392) Setting the start or end parameter now works with lists blocks,
- categorymembers, deletedrevs, logevents, protectedtitles, usercontributions
- and watchlist in Postgres.
-
-=== Languages updated in 1.18 ===
-
-MediaWiki supports over 330 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
-
-* Angika (anp) (new).
-* Brahui (brh) (new).
-* Central Dusun (dtp) (new).
-* Jamaican Creole English (jam) (new).
-* Khowar (khw) (new).
-* Liv (liv) (new).
-* Kichwa (qug) (new).
-* Tokipona (tp) (removed) 'tokipona' is still valid.
-* (bug 17160) Gender specific display text for User namespace.
-* Link trail added for sl and sh.
-* (bug 27633) Add characters to linkTrail for Portuguese (pt and pt-br).
-* (bug 27426) Set $namespaceGenderAliases for Arabic (ar).
-* (bug 27385) Set Polish $namespaceGenderAliases.
-* (bug 27681) Set $namespaceGenderAliases for Portuguese (pt and pt-br).
-* (bug 27785) Fallback language for Kabardian (kbd) is English now.
-* (bug 27825) Raw watchlist edit message now uses formatted numbers.
-* (bug 28040) Turkish: properly lower case 'I' to 'i' (dotless i) and
- uppercase 'i' to 'I' (dotted i).
-* Conversion script between Syllabics and Latin for the Inuktitut language.
-* Date formats for Indonesian (id) updated.
-* Bhojpuri (bho) (renamed from "bh").
-* (bug 29031) When translating block log entries, indefinite, infinite, and
- infinity are now considered the same.
-* Aromanian (rup) (renamed from "rua-rup").
-* Kashmiri (ks) split into Kashmiri (Perso-Arabic) (ks-arab) and Kashmiri
- (Devanagari) (ks-deva). Defaults to ks-arab.
-* (bug 30864) Use bengali numerals for <ol> for Assamese.
-* (bug 30817) Restored linktrail for kk (Kazakh).
-* (bug 27398) Add $wgExtraGenderNamespaces for configured gendered namespaces.
-* (bug 30846) New LanguageOs class.
-
-=== Other changes in 1.18 ===
-* Removed legacy wgAjaxWatch javascript global object, no longer in use.
-* (bug 28556) Upload support for MacBinary files has been removed (Used by
- Internet Explorer 5 for Mac OS 9).
-* On wiki farm setups using $wgConf, 'wgCanonicalServer' is now expected to be
- set for all wikis. This was already the case for 'wgServer'.
-
-== Compatibility ==
-
-MediaWiki 1.18 requires PHP 5.2.3. PHP 4 is no longer supported.
-
-MySQL is the recommended DBMS. PostgreSQL, Oracle or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for IBM
-DB2 and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 4.0 or later
-* PostgreSQL 8.3 or later
-* SQLite 3
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.18 has several database changes since 1.17, and will not work without schema
-updates.
-
-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, some major database
-changes are made, and there is a slightly higher chance that things could
-break. Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.17.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):
-
- http://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
- http://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
- http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-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.19 b/RELEASE-NOTES-1.19
new file mode 100644
index 00000000..6c7fa6d2
--- /dev/null
+++ b/RELEASE-NOTES-1.19
@@ -0,0 +1,455 @@
+= MediaWiki release notes =
+
+Security reminder: MediaWiki does not require PHP's register_globals
+setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.19 ==
+
+MediaWiki 1.19 is a large release that contains many new features and bug
+fixes. This is a summary of the major changes of interest to users.
+You can consult the RELEASE-NOTES-1.19 file for the full list of changes in
+this version.
+
+Our thanks go to everyone who helped to improve MediaWiki by testing the beta
+release and submitting bug reports.
+
+=== Changes since 1.19 beta 2 ===
+* Special:Watchlist no longer sets links to feed when the user is anonymous.
+* (bug 35961) Hash comparison should always be strict.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+ on line 598.
+* (bug 36042) 'show' causes a fatal in blocks API.
+
+=== Changes since 1.19 beta 1 ===
+* (bug 35014) Including a special page no longer sets the page's title to the
+ included page
+* (bug 35019) Edit summaries are no longer transformed in notification e-mails
+* (bug 35152) Help message for e-mail is shown again in user preferences
+* (bug 34887) $3 and $4 parameters are now substituted correctly in message
+ "movepage-moved"
+* (bug 34841) Edit links are no longer displayed when display old page versions
+* (bug 34889) User name should be normalized on Special:Contributions
+* (bug 35051) If heading has a trailing space after == then its name is not
+ preloaded into edit summary on section edit
+* (bug 31417) New ID mw-content-text around the actual page text, without categories,
+ contentSub, ... The same div often also contains the class mw-content-ltr/rtl.
+* (bug 35303) Proxy and DNS blacklist blocking works again
+* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in
+ core parser functions which operate on strings, such as padleft.
+* (bug 18295) Don't expose strip markers when a tag appears inside a link
+ inside a heading.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+ parameter present.
+* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
+ CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
+
+=== Configuration changes in 1.19 ===
+* Removed SkinTemplateSetupPageCss hook; use BeforePageDisplay instead.
+* (bug 27132) movefile right granted by default to registered users.
+* Default cookie lifetime ($wgCookieExpiration) is increased to 180 days.
+* (bug 31204) Removed old user.user_options.
+* $wgMaxImageArea now applies to jpeg files if they are not scaled with
+ ImageMagick.
+* Introduced $wgQueryPageDefaultLimit (defaults to 50) for the number of
+ items to show by default on query pages (special pages such as Whatlinkshere).
+* (bug 32470) Increase the length of ug_group.
+* (bug 32239) Removed $wgEnableTooltipsAndAccesskeys.
+* Removed $wgVectorShowVariantName.
+* Removed $wgExtensionAliasesFiles. Use $wgExtensionMessagesFiles.
+* Removed $wgResourceLoaderInlinePrivateModules , now always enabled.
+
+=== New features in 1.19 ===
+* (bug 19838) Add ability to get all interwiki prefixes also if the interwiki
+ cache is used.
+* $wgDnsBlacklistUrls now accepts an array with url and key as the
+ elements to work with DNSBLs that require keys, such as
+ Project Honeypot.
+* (bug 30022) Add support for custom loadScript sources to ResourceLoader.
+* (bug 19052) Unicode space separator characters (Zs) now terminates external
+ links and images links.
+* (bug 30160) Add public method to mw.loader to get module names from registry.
+* (bug 15558) Parameters to special pages included in wikitext can now be passed
+ as with templates.
+* Installer now issues a warning if mod_security is present.
+* (bug 29455) Add support for a filter callback function in jQuery byteLimit
+ plugin.
+* Added two new GetLocalURL hooks to better serve extensions working on a
+ limited type of titles.
+* Added a --no-updates flag to importDump.php that skips updating the links
+ tables.
+* Most presentational html attributes like valign are now converted to inline
+ css style rules. These attributes were removed from html5 and so we clean
+ them up when $wgHtml5 is enabled. This can be disabled using
+ $wgCleanupPresentationalAttributes.
+* Magic words (time and number-formatting ones, plus DIRECTIONMARK, but not
+ NAMESPACE) now depend on the page content language instead of the site
+ language. In theory this sets the right magic words in system messages,
+ although they are not used there.
+* (bug 30451) Add page_props to RefreshLinks::deleteLinksFromNonexistent.
+* (bug 30450) Clear page_props table on page deletion.
+* Hook added to check for exempt from account creation throttle.
+* (bug 30344) Add configuration variable for setting custom priorities when
+ generating sitemaps.
+* (bug 96170) Add array support for space-separated list attributes (like
+ 'class') in the Html helper class.
+* (bug 26470) Add checkered background image on hover on files pages.
+* (bug 30774) mediawiki.html: Add support for numbers and booleans in the
+ attribute values and element contents.
+* Conversion script between Tifinagh and Latin for the Tachelhit language.
+* (bug 16755) Add options 'noreplace' and 'noerror' to {{DEFAULTSORT:...}}
+ to stop it from replace an already existing default sort, and suppress error.
+* (bug 18578) Rewrote revision delete related messages to allow better
+ localisation.
+* (bug 30364) LanguageConverter now depends on the page content language
+ instead of the wiki content language.
+* Jump links will now be usable in CSS-capable browsers instead of only
+ in outdated text browsers.
+* New common*.css files usable by skins instead of having to copy piles
+ of generic styles from MonoBook or Vector's css.
+* Some deprecated presentational html attributes will now be automatically
+ converted to css.
+* (bug 31297) Add support for namespaces in Special:RecentChanges subpage filter
+ syntax.
+* The default user signature now contains a talk link in addition to the user link.
+* (bug 25306) Add link of old page title to MediaWiki:Delete_and_move_reason.
+* Added hook BitmapHandlerCheckImageArea.
+* (bug 30062) Add $wgDBprefix option to cli installer.
+* getUserPermissionsErrors and getUserPermissionsErrorsExpensive hooks are now
+ also called when checking for 'read' permission.
+* Introduce $wgEnableSearchContributorsByIP which controls whether searching
+ for an IP address redirects to the contributions list for that IP.
+* (bug 8859) Database::update should take array of tables too.
+* (bug 19698) Add "Inverse namespaces" option to Special:Contributions.
+* (bug 24037) Add byte length of revision to Special:Contributions.
+* (bug 1672) Added $wgDisableUploadScriptChecks to allow uploading of files
+ containing HTML or JS. DISABLING THESE CHECKS IS VERY DANGEROUS.
+* New path mappings can be added using the WebRequestPathInfoRouter hook
+ and adding paths to the PathRouter.
+* (bug 32666) Special:ActiveUsers now allows a subpage to be used as value for the
+ "target" query parameter (eg. Special:ActiveUsers/Username).
+* New JavaScript variable wgPageContentLanguage.
+* Added new debugging toolbar, enabled with $wgDebugToolbar.
+* Differences in the history page now uses slightly better colors for people
+ perceiving colors differently.
+* (bug 32879) Upgrade jQuery to 1.7.1.
+* jQuery UI upgraded to 1.8.17.
+* Extensions can use the 'Language::getMessagesFileName' hook to define new
+ languages using messages files outside of core.
+* (bug 32512) Add 'Associated namespace' checkbox to Special:Contributions.
+* Added $wgSend404Code, true by default, which can be set to false to send a
+ 200 status code instead of 404 for nonexistent articles.
+* (bug 33447) Link to the broken image tracking category from Special:Wantedfiles.
+* (bug 27724) Add timestamp to job queue.
+* (bug 30339) Implement SpecialPage for running javascript tests. Disabled by default, due to
+ tests potentially being harmful, not to be run on a production wiki.
+ Enable by setting $wgEnableJavaScriptTest to true.
+* Extensions can use the RequestContextCreateSkin hook to override what skin is
+ loaded in some contexts.
+* (bug 33456) Show $wgQueryCacheLimit on cached query pages.
+* (bug 10574) Add an option to allow all pages to be exported by Special:Export.
+* mediawiki.js Message object constructor is now publicly available as mw.Message.
+* (bug 29309) Allow CSS class per tooltip (tipsy).
+* (bug 33565) Add accesskey/tooltip to submit buttons on Special:EditWatchlist.
+* (bug 17959) Inline rendering/thumbnailing for Gimp XCF images.
+* (bug 27775) Namespace has it's own XML tag in the XML dump file.
+* (bug 30513) Redirect tag is now resolved in XML dump file.
+* sha1 xml tag added to XML dump file.
+* (bug 33646) Badtitle error page now emits a 400 HTTP status.
+* Special:MovePage now has a dropdown menu for namespaces.
+* (bug 34420) Special:Version now shows git HEAD sha1 when available.
+* (bug 33952) Refactor mw.toolbar to allow dynamic additions at any time.
+
+=== Bug fixes in 1.19 ===
+* $wgUploadNavigationUrl should be used for file redlinks if.
+ $wgUploadMissingFileUrl is not set. The first was used for this
+ until the second was introduced in 1.17.
+* BREAKING CHANGE: Style rules for wikitable are now more specific and prevent
+ inheritance to nested tables which caused various issues (bug 30485 and bug
+ 33434). If your wiki has overriden rules for ".wikitable", please revise them and
+ adjust where neccecary. For comparison, use the "table.wikitable" section in
+ skins/common/shared.css as base.
+* $wgUploadNavigationUrl is now used for file redlinks if
+ $wgUploadMissingFileUrl is not set. The former was used for this until the
+ second was introduced in 1.17.
+* (bug 27894) Move 'editondblclick' event listener down from body to
+ div#bodyContent.
+* (bug 30172) The check for posix_isatty() in maintenance scripts did not detect
+ when the function exists but is disabled. Introduced
+ Maintenance::posix_isatty().
+* (bug 30264) Changed installer-generated LocalSettings.php to use
+ require_once() instead require() for included extensions.
+* Do not convert text in the user interface language to another script.
+* (bug 26283) Previewing user JS/CSS pages didn't load other user JS/CSS pages.
+* (bug 26486) ResourceLoader modules with paths to nonexistent files cause PHP
+ warnings/notices to be thrown.
+* (bug 30335) Fix for HTMLForms using GET that were breaking when non-friendly
+ URLs are used.
+* (bug 28649) Preventing half truncated multi-byte unicode characters when
+ truncating log comments.
+* Show --batch-size option in help of maintenance scripts that support it.
+* (bug 4381) Magic quotes cleaning was not comprehensive, key strings were not
+ unescaped.
+* (bug 23057) Importers no longer can 'edit' or 'create' a fully-protected page by
+ importing a new revision into it.
+* Allow moving the associated talk pages of subpages even if the base page
+ has no subpage.
+* Per page edit-notices now work in namespaces without subpages enabled.
+* (bug 31081) $wgEnotifUseJobQ is no longer unconditionally enqueueing jobs.
+* (bug 30202) File names are now restricted on upload to 240 bytes, because of
+ restrictions on some of the database fields.
+* Timezones are now recognised in user preferences when offset is different
+ due to DST.
+* (bug 31692) "summary" parameter now also works when undoing revisions.
+* (bug 18823) "move succeeded" text displayed bluelinks even when redirect was
+ suppressed.
+* (bug 19186) Special:UserLogin's title on Special:SpecialPages now says
+ "create account" when the user cannot create an account.
+* (bug 31818) 'usercreated' message now supports GENDER.
+* (bug 32022) Our phpunit.php script can now be executed from another directory.
+* (bug 26020) Setting $wgEmailConfirmToEdit to true no longer removes diffs.
+ from recent changes feeds.
+* (bug 30232) add current time to message wlnote on Special:Watchlist.
+* (bug 29110) $wgFeedDiffCutoff did not affect new pages.
+* (bug 32168) Add wfRemoveDotSegments for use in wfExpandUrl.
+* (bug 32358) Do not display "No higher resolution available" for dimensionless
+ files (like audio files).
+* (bug 32168) Add wfAssembleUrl for use in wfExpandUrl.
+* (bug 32168) fixed - wfExpandUrl expands dot segments now.
+* (bug 31535) Upload comments now truncated properly, and don't have brackets.
+* (bug 32086) Special:PermanentLink now show an error message when no subpage
+ was specified.
+* (bug 30368) Special:Newpages now shows the new page name for moved pages.
+* (bug 1697) The way to search blocked usernames in block log should be clearer.
+* (bug 29747) eAccelerator shared memory caching has been removed since it is
+ now disabled by default and is buggy. APC, XCache and WinCache are not affected.
+* Installer now refuses to install if php was not compiled with Ctype support.
+* (bug 29475) Remove "trackback" feature entirely from core.
+* (bug 32665) Special:BlockList prefills the username in the input field if
+ using the Special:BlockList/username URL.
+* (bug 27721) Make JavaScript variables wgSeparatorTransformTable and
+ wgDigitTransformTable depend on page content language so the sort script
+ sorts correctly more often.
+* (bug 32230) Expose wgRedirectedFrom in JavaScript.
+* (bug 31212) History tab not collapsed when the screen is narrow.
+* (bug 15521) Use new section summary when the action of adding a new section
+ also happens to create the page.
+* (bug 32960) Remove EmailAuthenticationTimestamp from database when a
+ email address is removed.
+* (bug 32414) Empty page get a empty bytes attribute in Export/Dump.
+* (bug 33101) Viewing a User or User talk of username resembling IP ending
+ with .xxx causes Internal error.
+* Warning about undefined index in certain situations when $wgLogRestrictions
+ causes the first log type requested to be removed but not the others.
+* Use separate message ('prefixindex-namespace') for title of
+ Special:PrefixIndex rather then re-using Special:AllPages's allinnamespace.
+* (bug 33156) Special:Block now allows you to confirm you want to block yourself
+ when using non-normalized username.
+* (bug 33246) News icon shown for news:// URLs but not for news: URLs.
+* (bug 33305) Make mw.util.addCSS resistant to IE's @font-face bug by setting
+ cssText after DOM insertion.
+* (bug 30711) When adding a new section to a page with section=new, the text is
+ now always added to the current version of the page.
+* (bug 31719) Fix uploads of SVGs exported by Adobe Illustrator by expanding
+ XML entities correctly.
+* (bug 30914) Embeddable ResourceLoader modules (user.options, user.tokens)
+ should be loaded in <head> for proper dependency resolution.
+* (bug 32702) Removed method Skin::makeGlobalVariablesScript() has been readded
+ for backward compatibility.
+* (bug 31469) Make sure tracking category messages expand variables like
+ {{NAMESPACE}} relative to correct title.
+* (bug 33454) ISO-8601 week-based year number (format character 'o') is now
+ calculated correctly with respect to timezone.
+* (bug 32219) InstantCommons now fetches content from Wikimedia Commons using
+ HTTPS when the local wiki is served over HTTPS.
+* (bug 33525) clearTagHooks doesn't clear function hooks.
+* (bug 33523) Function tag hooks don't appear on Special:Version.
+* Files with IPTC blocks we can't read no longer prevent extraction of exif
+ or other metadata.
+* (bug 33587) Remove action "historysubmit" from history pages.
+* (bug 25800) mw.config wgAction should contain the actually performed action instead
+ of whatever the query value contains.
+* (bug 4438) Add CSS hook for current WikiPage action.
+* (bug 33703) Common border-bottom color for <abbr> should inherit default (text) color.
+* (bug 33819) Display file sizes in appropriate units.
+* (bug 32948) {{REVISIONID}} and related variables are no longer blank after doing
+ a null edit.
+* (bug 33880) $wgUsersNotifiedOnAllChanges should not send e-mail to user who made
+ the edit.
+* (bug 33902) Decoding %2B with mw.Uri.decode results in ' ' instead of +.
+* (bug 33762) QueryPage-based special pages no longer misses *-summary message.
+* Other sizes links are no longer generated for wikis without a 404 thumbnail handler.
+* (bug 29454) Enforce byteLimit for page title input on Special:MovePage.
+* (bug 34114) CSSMin::remap() doesn't respect its $embed parameter.
+* Special:Contributions/newbies now shows the contributions for the user "newbies".
+ New user contributions are obtained using the form or using ?contribs=newbie in URL.
+* It is now possible to delete images that have no corresponding description pages.
+* (bug 33165) GlobalFunctions.php line 1312: Call to a member function
+ getText() on a non-object.
+* (bug 31676) Group dynamically inserted CSS into a single <style> tag, to work
+ around a bug where not all styles were applied in Internet Explorer.
+* (bug 28936, bug 5280) Broken or invalid titles can't be removed from watchlist.
+* (bug 34600) Older skins using useHeadElement=false were broken in 1.18.
+* (bug 34604) [mw.config] wgActionPaths should be an object instead of a numeral
+ array.* (bug 12262) Indents and lists are now aligned
+* (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
+ on Windows
+* (bug 25095) Special:Categories should also include the first relevant item
+ when "from" is filled.
+* (bug 34972) An error occurred while changing your watchlist settings for
+ [[Special:WhatLinksHere/Example]]
+
+=== API changes in 1.19 ===
+* Made action=edit less likely to return "unknownerror", by returning the actual error
+ message (which may have come from a hook call or similar).
+* (bug 19838) siprop=interwikimap can now use the interwiki cache.
+* (bug 29748) Add API search prefix support.
+* (bug 29684) Set forgotten parameter types in ApiQueryIWLinks.
+* (bug 29685) do not output NULL parentid with list=deletedrevs&drprop=parentid.
+* siprop=interwikimap and siprop=languages can use silanguagecode to have
+ a best effort language name translation. Use CLDR extension for best result.
+* (bug 30230) action=expandtemplates should not silently override invalid title
+ inputs.
+* (bug 18634) Create API to fetch MediaWiki's language fallback tree structure.
+* (bug 26885) Allow show/hide of account blocks, temporary blocks and single IP
+ address blocks for list=blocks.
+* (bug 30591) Add support to only return keys in ApiAllMessages.
+* The API now respects $wgShowHostnames and won't share the hostname in
+ severedby if it's set to false.
+* wlexcludeuser parameter added to ApiFeedWatchlist.
+* (bug 7304) Links on redirect pages no longer cause the redirect page to show
+ up as a redirect to the linked page on Special:Whatlinkshere.
+* (bug 32609) API: Move captchaid/captchaword of action=edit from core
+ to Captcha extension(s).
+* Added 'APIGetDescription' hook.
+* (bug 32688) Paraminfo for parameter "generator" of the query module shows too
+ many types.
+* (bug 32415) Empty page get no size attribute in API output.
+* (bug 31759) Undefined property notice in querypages API.
+* (bug 32495) API should allow purge by pageids.
+* (bug 33147) API examples should explain what they do.
+* (bug 33482) Api incorrectly calls ApiBase::parseMultiValue if allowed
+ values is given as an array.
+* (bug 32948) {{REVISIONID}} and related variables are no longer blank after
+ calling action=purge&forcelinkupdate.
+* (bug 34377) action=watch now parses messages using the correct title instead
+ of "API".
+* (bug 35036) WikiLove messages were not automatically updated in JavaScript
+ after having been changed on-wiki due to a bug in core
+
+=== Languages updated in 1.19 ===
+
+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.
+
+* Canadian English (en-ca) (new).
+* Norwegian (bokmål) (nb) (renamed from no).
+* Uighur (Latin) (ug-latn) was incorrectly marked as right-to-left language.
+* (bug 30217) Make pt-br a fallback of pt.
+* (bug 31193) Set fallback language of Assamese from Bengali to English.
+* Update date format for dsb and hsb: month names need the genitive.
+* (bug 28643) Serbian variant conversion improvements (Nikola Smolenski).
+* (bug 29405, bug 30809) Lower diacritics are invisible in titles in Indic
+ languages Assamese, Bengali, Hindi, Malyalam and Odiya.
+* (bug 32826) Titles in indic languages are partially cut.
+* (bug 33367) Gendered namespaces for Czech.
+* (bug 33014) Language::formatSize()/formatBitrate() should be able to deal
+ with larger numbers (tera-yotta).
+
+=== Other changes in 1.19 ===
+* BREAKING CHANGE: Legacy global array 'ta' and global function 'akeytt' have
+ been removed from wikibits.js.
+* jquery.mwPrototypes module was renamed to jquery.mwExtension.
+* The maintenance script populateSha1.php was renamed to the more concise
+ populateImageSha1.php.
+* The Client-IP header is no longer checked for when trying to resolve a client's
+ real IP address.
+* (bug 22096) Although IE5.x and below was already unsupported officially, stylesheets
+ existing exclusively for IE5.0 and IE5.5 have now been removed (which were in skins
+ 'chick' and 'monobook').
+* The constructor for CategoryView has changed, the second parameter is now a
+ Context source and is required.
+* The Title::escape{Local,Full,Canonical}URL methods are deprecated, please use
+ proper html building methods to escape the normal get{...}URL methods instead.
+* The $variant arguments in the Title::get{Local,Full,Link,Canonical}URL methods
+ have been replaced with a secondary query argument.
+* The $variant argument in the hooks for the Title::get{Local,Full,Link,Canonical}URL
+ methods have been removed, the variant is now part of the $query argument.
+* Removed Title::isValidCssJsSubpage(), deprecated since 1.17 in favor of
+ using Title::isCssJsSubpage() or checking Title::isWrongCaseCssJsPage().
+* Support for the deprecated hook MagicWordMagicWords was removed.
+* The Xml::namespaceSelector method has been deprecated, please use
+ Html::namespaceSelector instead (note that the parameters have changed also).
+* (bug 33746) Preload popular ResourceLoader modules (mediawiki.util) as stop-gap
+ for scripts missing dependencies.
+ New configuration variable $wgPreloadJavaScriptMwUtil has been introduced for this
+ (set to false by default for new installations). Set to true if your wiki has a large
+ amount of user/site scripts that are lacking dependency information. In the short to
+ medium term these user/site scripts should be fixed by adding the used modules to the
+ dependencies in the module registry and/or wrapping them in a callback to mw.loader.using.
+
+== Compatibility ==
+
+MediaWiki 1.19 requires PHP 5.2.3. PHP 4 is no longer supported.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for IBM
+DB2 and 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.19 has several database changes since 1.18, and will not work without schema
+updates.
+
+As of 1.19 several JavaScript interfaces that were deprecated or superseeded in
+MediaWiki 1.17, MediaWiki 1.16 or even earlier have been removed. They are
+listed at the top of the "Other changes" list as a "BREAKING CHANGE".
+
+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, some major database
+changes are made, and there is a slightly higher chance that things could
+break. Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.18.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/api.php b/api.php
index 39d27dd6..a5a25799 100644
--- a/api.php
+++ b/api.php
@@ -68,11 +68,13 @@ if ( !$wgEnableAPI ) {
// Selectively allow cross-site AJAX
-/*
+/**
* Helper function to convert wildcard string into a regex
* '*' => '.*?'
* '?' => '.'
- * @ return string
+ *
+ * @param $search string
+ * @return string
*/
function convertWildcard( $search ) {
$search = preg_quote( $search, '/' );
@@ -115,7 +117,7 @@ $processor = new ApiMain( $wgRequest, $wgEnableWriteAPI );
$processor->execute();
// Execute any deferred updates
-wfDoUpdates();
+DeferredUpdates::doUpdates();
// Log what the user did, for book-keeping purposes.
$endtime = microtime( true );
@@ -127,7 +129,7 @@ if ( $wgAPIRequestLog ) {
$items = array(
wfTimestamp( TS_MW ),
$endtime - $starttime,
- wfGetIP(),
+ $wgRequest->getIP(),
$_SERVER['HTTP_USER_AGENT']
);
$items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
diff --git a/docs/design.html b/docs/design.html
deleted file mode 100644
index 064a6976..00000000
--- a/docs/design.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <link rel="stylesheet" href="../skins/common/shared.css" />
-</head>
-<body style="font-size: small;">
-
- <h2>Messages</h2>
- <p class="success">Success message</p>
- <p class="warning">Warning message</p>
- <p class="error">Error message</p>
-
- <h2>Messages box</h2>
- <p class="visualClear successbox">Success message</p>
- <p class="visualClear warningbox">Warning message</p>
- <p class="visualClear errorbox">Error message</p>
-
-</body></html>
diff --git a/docs/design.txt b/docs/design.txt
index 192e8c6a..f95ef0f6 100644
--- a/docs/design.txt
+++ b/docs/design.txt
@@ -89,10 +89,6 @@ Naming/coding conventions:
things will break. New code should use the standard method of setting
visibilities as normal.
- - Member variables are generally "mXxx" to distinguish them. This should make
- it easier to spot errors of forgetting the required "$this->", which PHP
- will happily accept by creating a new local variable rather than complaining.
-
- Globals are particularly evil in PHP; it sets a lot of them automatically
from cookies, query strings, and such, leading to namespace conflicts; when
a variable name is used in a function, it is silently declared as a new
diff --git a/docs/doxygen_first_page.php b/docs/doxygen_first_page.php
new file mode 100644
index 00000000..11db1f58
--- /dev/null
+++ b/docs/doxygen_first_page.php
@@ -0,0 +1,19 @@
+<?php
+die("Not a valid entry point\n");
+/**
+ * This file does not hold any code. It is only there so we can generate
+ * the doxygen documentation main page.
+ *
+ * @file
+ */
+
+/**
+ * @mainpage Introduction
+ *
+ * Welcome on MediaWiki autogenerated documentation system.
+ *
+ * If you are looking to use, install or configure your wiki, you probably
+ * want to look at the main site: http://www.mediawiki.org/
+ *
+ * @note this page is generated from docs/doxygen_first_page.php
+ */
diff --git a/docs/export-0.5.xsd b/docs/export-0.5.xsd
index ca54c938..469446db 100644
--- a/docs/export-0.5.xsd
+++ b/docs/export-0.5.xsd
@@ -12,6 +12,8 @@
Version 0.4 adds per-revision delete flags, log exports,
discussion threading data, a per-page redirect flag, and
per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
The canonical URL to the schema document is:
http://www.mediawiki.org/xml/export-0.5.xsd
diff --git a/docs/export-0.6.xsd b/docs/export-0.6.xsd
new file mode 100644
index 00000000..55428b56
--- /dev/null
+++ b/docs/export-0.6.xsd
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.6.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.6/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.6/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.6/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType"/>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1"/>
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="version" type="string" use="required"/>
+ <attribute ref="xml:lang" use="required"/>
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted"/>
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string"/>
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="positiveInteger"/>
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="string" minOccurs="0"/>
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0"/>
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ <element name="logitem" type="mw:LogItemType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="minor" minOccurs="0" />
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="sha1" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" minOccurs="0"/>
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="mw:CommentType" minOccurs="0"/>
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:TextType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN"/>
+ <attribute name="bytes" use="optional" type="nonNegativeInteger"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0"/>
+ <element name="id" type="positiveInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0"/>
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime"/>
+ <element name="contributor" type="mw:ContributorType"/>
+ <element name="comment" type="string" minOccurs="0"/>
+
+ <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
+ <element name="filename" type="string"/>
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI"/>
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/docs/hooks.txt b/docs/hooks.txt
index aca0844a..a6f53c1a 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -295,6 +295,17 @@ before showing the edit form ( EditPage::edit() ). This is triggered
on &action=edit.
$EditPage: the EditPage object
+'AlternateUserMailer': Called before mail is sent so that mail could
+be logged (or something else) instead of using PEAR or PHP's mail().
+Return false to skip the regular method of sending mail. Return a
+string to return a php-mail-error message containing the error.
+Returning true will continue with sending email in the regular way.
+$headers: Associative array of headers for the email
+$to: MailAddress object or array
+$from: From address
+$subject: Subject of the email
+$body: Body of the message
+
'APIAfterExecute': after calling the execute() method of an API module.
Use this to extend core API modules.
&$module: Module object
@@ -308,12 +319,16 @@ $text : the new text of the article (has yet to be saved)
&$resultArr : data in this array will be added to the API result
'APIGetAllowedParams': use this hook to modify a module's parameters.
-&$module: Module object
+&$module: ApiBase Module object
&$params: Array of parameters
+'APIGetDescription': use this hook to modify a module's description
+&$module: ApiBase Module object
+&$desc: Array of descriptions
+
'APIGetParamDescription': use this hook to modify a module's parameter
descriptions.
-&$module: Module object
+&$module: ApiBase Module object
&$desc: Array of parameter descriptions
'APIQueryAfterExecute': after calling the execute() method of an
@@ -376,7 +391,7 @@ $tokenFunctions: array(action => callback)
'ApiRsdServiceApis': Add or remove APIs from the RSD services list.
Each service should have its own entry in the $apis array and have a
unique name, passed as key for the array that represents the service data.
-In this data array, the key-value-pair identified by the apiLink key is
+In this data array, the key-value-pair identified by the apiLink key is
required.
&$apis: array of services
@@ -397,32 +412,32 @@ Use this to change the content in this area or how it is loaded.
$output: the OutputPage object ($wgOut)
'ArticleDelete': before an article is deleted
-$article: the article (object) being deleted
+$article: the WikiPage (object) being deleted
$user: the user (object) deleting the article
$reason: the reason (string) the article is being deleted
$error: if the deletion was prohibited, the (raw HTML) error message to display
(added in 1.13)
'ArticleDeleteComplete': after an article is deleted
-$article: the article that was deleted
+$article: the WikiPage that was deleted
$user: the user that deleted the article
$reason: the reason the article was deleted
$id: id of the article that was deleted
'ArticleEditUpdateNewTalk': before updating user_newtalk when a user talk page
was changed
-$article: article (object) of the user talk page
+$article: WikiPage (object) of the user talk page
'ArticleEditUpdates': when edit updates (mainly link tracking) are made when an
article has been changed
-$article: the article (object)
+$article: the WikiPage (object)
$editInfo: data holder that includes the parser output ($editInfo->output) for
that page after the change
$changed: bool for if the page was changed
'ArticleEditUpdatesDeleteFromRecentchanges': before deleting old entries from
recentchanges table, return false to not delete old entries
-$article: article (object) being modified
+$article: WikiPage (object) being modified
'ArticleFromTitle': when creating an article object from a title object using
Wiki::articleFromTitle()
@@ -430,7 +445,7 @@ $title: title (object) used to create the article object
$article: article (object) that will be returned
'ArticleInsertComplete': After a new article is created
-$article: Article created
+$article: WikiPage created
$user: User creating the article
$text: New content
$summary: Edit summary/comment
@@ -445,33 +460,33 @@ $targetTitle: target title (object)
$destTitle: destination title (object)
'ArticlePageDataAfter': after loading data of an article from the database
-$article: article (object) whose data were loaded
+$article: WikiPage (object) whose data were loaded
$row: row (object) returned from the database server
'ArticlePageDataBefore': before loading data of an article from the database
-$article: article (object) that data will be loaded
+$article: WikiPage (object) that data will be loaded
$fields: fileds (array) to load from the database
'ArticlePrepareTextForEdit': called when preparing text to be saved
-$article: the article being saved
+$article: the WikiPage being saved
$popts: parser options to be used for pre-save transformation
'ArticleProtect': before an article is protected
-$article: the article being protected
+$article: the WikiPage being protected
$user: the user doing the protection
$protect: boolean whether this is a protect or an unprotect
$reason: Reason for protect
$moveonly: boolean whether this is for move only or not
'ArticleProtectComplete': after an article is protected
-$article: the article that was protected
+$article: the WikiPage that was protected
$user: the user who did the protection
$protect: boolean whether it was a protect or an unprotect
$reason: Reason for protect
$moveonly: boolean whether it was for move only or not
'ArticlePurge': before executing "&action=purge"
-$article: article (object) to purge
+$article: WikiPage (object) to purge
'ArticleRevisionVisibilitySet': called when changing visibility of one or more
revision of an article
@@ -483,13 +498,13 @@ $revision: the revision
$oldPageID: the page ID of the revision when archived (may be null)
'ArticleRollbackComplete': after an article rollback is completed
-$article: the article that was edited
+$article: the WikiPage that was edited
$user: the user who did the rollback
$revision: the revision the page was reverted back to
$current: the reverted revision
'ArticleSave': before an article is saved
-$article: the article (object) being saved
+$article: the WikiPage (object) being saved
$user: the user (object) saving the article
$text: the new article text
$summary: the article summary (comment)
@@ -498,7 +513,7 @@ $iswatch: watch flag
$section: section #
'ArticleSaveComplete': After an article has been updated
-$article: Article modified
+$article: WikiPage modified
$user: User performing the modification
$text: New content
$summary: Edit summary/comment
@@ -507,6 +522,7 @@ $isWatch: (No longer used)
$section: (No longer used)
$flags: Flags passed to Article::doEdit()
$revision: New Revision of the article
+$status: Status object about to be returned by doEdit()
$baseRevId: the rev ID (or false) this edit was based on
'ArticleUndelete': When one or more revisions of an article are restored
@@ -528,12 +544,18 @@ $article: Article object
viewing.
&$article: the article
&$pcache: whether to try the parser cache or not
-&$outputDone: whether the output for this page finished or not
+&$outputDone: whether the output for this page finished or not. Set to a ParserOutput
+object to both indicate that the output is done and what parser output was used.
'ArticleViewRedirect': before setting "Redirected from ..." subtitle when
follwed an redirect
$article: target article (object)
+'ArticleViewCustom': allows to output the text of the article in a different format than wikitext
+$text: text of the page
+$title: title of the page
+$output: reference to $wgOut
+
'AuthPluginAutoCreate': Called when creating a local account for an user logged
in from an external authentication method
$user: User object created locally
@@ -548,6 +570,16 @@ $args: arguments
$user: user
$result: result of checking autopromote condition
+'BacklinkCacheGetPrefix': allows to set prefix for a spefific link table
+$table: table name
+&$prefix: prefix
+
+'BacklinkCacheGetConditions': allows to set conditions for query when links to certain title
+are fetched
+$table: table name
+$title: title of the page to which backlinks are sought
+&$conds: query conditions
+
'BadImage': When checking against the bad image list
$name: Image name being checked
&$bad: Whether or not the image is "bad"
@@ -555,9 +587,14 @@ $name: Image name being checked
Change $bad and return false to override. If an image is "bad", it is not
rendered inline in wiki pages or galleries in category pages.
-'BeforeInitialize': before anything is initialized in performRequestForTitle()
+'BeforeDisplayNoArticleText': before displaying noarticletext or noarticletext-nopermission
+at Article::showMissingArticle()
+
+$article: article object
+
+'BeforeInitialize': before anything is initialized in MediaWiki::performRequest()
&$title: Title being used for request
-&$article: The associated Article object
+$unused: null
&$output: OutputPage object
&$user: User
$request: WebRequest object
@@ -577,10 +614,11 @@ $out: OutputPage object
'BeforeParserFetchFileAndTitle': before an image is rendered by Parser
$parser: Parser object
$nt: the image title
-&$time: the image timestamp (use '0' to force a broken thumbnail)
-&$sha1: image base 36 sha1 (used to specify the file, $nt will be ignored if this is set)
+&$options: array of options to RepoGroup::findFile
&$descQuery: query string to add to thumbnail URL
+If 'broken' is a key in $options then the file will appear as a broken thumbnail.
+
'BeforeParserFetchTemplateAndtitle': before a template is fetched by Parser
$parser: Parser object
$title: title of the template
@@ -591,17 +629,22 @@ $title: title of the template
&$parser: Parser object
&$ig: ImageGallery object
-'BeforeWelcomeCreation': before the welcomecreation message is displayed to a newly created user
+'BeforeWelcomeCreation': before the welcomecreation message is displayed to a newly created user
&$welcome_creation_msg: MediaWiki message name to display on the welcome screen to a newly created user account
-&$injected_html: Any HTML to inject after the "logged in" message of a newly created user account
+&$injected_html: Any HTML to inject after the "logged in" message of a newly created user account
-'BitmapHandlerTransform': before a file is transformed, gives extension the
+'BitmapHandlerTransform': before a file is transformed, gives extension the
possibility to transform it themselves
-$handler: BitmapHandler
+$handler: BitmapHandler
$image: File
-&$scalerParams: Array with scaler parameters
+&$scalerParams: Array with scaler parameters
&$mto: null, set to a MediaTransformOutput
+'BitmapHandlerCheckImageArea': by BitmapHandler::normaliseParams, after all normalizations have been performed, except for the $wgMaxImageArea check
+$image: File
+&$params: Array of parameters
+&$checkImageAreaHookResult: null, set to true or false to override the $wgMaxImageArea check result
+
'PerformRetroactiveAutoblock': called before a retroactive autoblock is applied to a user
$block: Block object (which is set to be autoblocking)
&$blockIds: Array of block IDs of the autoblock
@@ -620,7 +663,7 @@ $output: OutputPage object in use
'CanonicalNamespaces': For extensions adding their own namespaces or altering the defaults
&$namespaces: Array of namespace numbers with corresponding canonical names
-
+
'CategoryPageView': before viewing a categorypage in CategoryPage::view
$catpage: CategoryPage instance
@@ -726,7 +769,7 @@ $editpage_Obj: the current EditPage object
'EditPage::importFormData': allow extensions to read additional data
posted in the form
-$editpage: EditPage instance
+$editpage: EditPage instance
$request: Webrequest
return value is ignored (should always return true)
@@ -830,9 +873,16 @@ $user: The user who is trying to email another user.
$editToken: The user's edit token.
&$hookErr: Out-param for the error. Passed as the parameters to OutputPage::showErrorPage.
+'ExemptFromAccountCreationThrottle': Exemption from the account creation throttle
+$ip: The ip address of the user
+
'ExtensionTypes': called when generating the extensions credits, use this to change the tables headers
&$extTypes: associative array of extensions types
+'ExtractThumbParameters': called when extracting thumbnail parameters from a thumbnail file name
+$thumbname: the base name of the thumbnail file
+&$params: the currently extracted params (has source name, temp or archived zone)
+
'FetchChangesList': When fetching the ChangesList derivative for
a particular user
$user: User the list is being fetched for
@@ -844,7 +894,7 @@ $user: User the list is being fetched for
$file: reference to the deleted file
$oldimage: in case of the deletion of an old image, the name of the old file
$article: in case all revisions of the file are deleted a reference to the
- article associated with the file.
+ WikiFilePage associated with the file.
$user: user who performed the deletion
$reason: reason
@@ -876,7 +926,6 @@ $out: OutputPage object
$title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getCanonicalURL()
-$variant: variant passed to Title::getCanonicalURL()
'GetDefaultSortkey': Override the default sortkey for a page.
$title: Title object that we need to get a sortkey for
@@ -886,13 +935,11 @@ $title: Title object that we need to get a sortkey for
$title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getFullURL()
-$variant: variant passed to Title::getFullURL()
'GetInternalURL': modify fully-qualified URLs used for squid cache purging
$title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getInternalURL()
-$variant: variant passed to Title::getFullURL()
'GetIP': modify the ip of the current user (called only once)
&$ip: string holding the ip as determined so far
@@ -902,18 +949,32 @@ $linkcolour_ids: array of prefixed DB keys of the pages linked to,
indexed by page_id.
&$colours: (output) array of CSS classes, indexed by prefixed DB keys
-'GetLocalURL': modify local URLs as output into page links
+'GetLocalURL': modify local URLs as output into page links. Note that if you
+ are working with internal urls (non-interwiki) then it may be preferable
+ to work with the GetLocalURL::Internal or GetLocalURL::Article hooks as
+ GetLocalURL can be buggy for internal urls on render if you do not
+ re-implement the horrible hack that Title::getLocalURL uses
+ in your own extension.
$title: Title object of page
-$url: string value as output (out parameter, can modify)
+&$url: string value as output (out parameter, can modify)
+$query: query options passed to Title::getLocalURL()
+
+'GetLocalURL::Internal': modify local URLs to internal pages.
+$title: Title object of page
+&$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getLocalURL()
-$variant: variant passed to Title::getLocalURL()
+
+'GetLocalURL::Article': modify local URLs specifically pointing to article paths
+ without any fancy queries or variants.
+$title: Title object of page
+&$url: string value as output (out parameter, can modify)
'GetMetadataVersion': modify the image metadata version currently in use. This is
used when requesting image metadata from a ForiegnApiRepo. Media handlers
that need to have versioned metadata should add an element to the end of
the version array of the form 'handler_name=version'. Most media handlers
won't need to do this unless they broke backwards compatibility with a
- previous version of the media handler metadata output.
+ previous version of the media handler metadata output.
&$version: Array of version strings
'GetPreferences': modify user preferences
@@ -954,7 +1015,7 @@ $result: User permissions error to add. If none, return true.
$imagePage: ImagePage object ($this)
$output: $wgOut
-'ImagePageAfterImageLinks': called after the image links section on an image
+'ImagePageAfterImageLinks': called after the image links section on an image
page is built
$imagePage: ImagePage object ($this)
&$html: HTML for the hook to add
@@ -998,7 +1059,8 @@ Return false to stop further processing of the tag
'ImportHandleRevisionXMLTag': When parsing a XML tag in a page revision
$reader: XMLReader object
-$revInfo: Array of information
+$pageInfo: Array of page information
+$revisionInfo: Array of revision information
Return false to stop further processing of the tag
'ImportHandleToplevelXMLTag': When parsing a top level XML tag
@@ -1020,7 +1082,7 @@ $article: Article object
'InterwikiLoadPrefix': When resolving if a given prefix is an interwiki or not.
Return true without providing an interwiki to continue interwiki search.
$prefix: interwiki prefix we are looking for.
-&$iwData: output array describing the interwiki with keys iw_url, iw_local,
+&$iwData: output array describing the interwiki with keys iw_url, iw_local,
iw_trans and optionally iw_api and iw_wikiid.
'InternalParseBeforeLinks': during Parser's internalParse method before links
@@ -1054,8 +1116,17 @@ $password: The password entered by the user
&$result: Set this and return false to override the internal checks
$user: User the password is being validated for
-'LanguageGetMagic': DEPRECATED, use $magicWords in a file listed in
-$wgExtensionMessagesFiles instead.
+'Language::getMessagesFileName':
+$code: The language code or the language we're looking for a messages file for
+&$file: The messages file path, you can override this to change the location.
+
+'LanguageGetNamespaces': Provide custom ordering for namespaces or
+remove namespaces. Do not use this hook to add namespaces. Use
+CanonicalNamespaces for that.
+&$namespaces: Array of namespaces indexed by their numbers
+
+'LanguageGetMagic': DEPRECATED, use $magicWords in a file listed in
+$wgExtensionMessagesFiles instead.
Use this to define synonyms of magic words depending of the language
$magicExtensions: associative array of magic words synonyms
$lang: laguage code (string)
@@ -1131,19 +1202,48 @@ completed
&updater: A DatabaseUpdater subclass
'LocalFile::getHistory': called before file history query performed
-$file: the file
+$file: the File object
$tables: tables
$fields: select fields
$conds: conditions
$opts: query options
$join_conds: JOIN conditions
+'LocalFilePurgeThumbnails': called before thumbnails for a local file a purged
+$file: the File object
+$archiveName: name of an old file version or false if it's the current one
+
'LocalisationCacheRecache': Called when loading the localisation data into cache
$cache: The LocalisationCache object
$code: language code
&$alldata: The localisation data from core and extensions
-'LoginAuthenticateAudit': a login attempt for a valid user account either
+'LogEventsListShowLogExtract': called before the string is added to OutputPage. Returning false will prevent the string from being added to the OutputPage
+&$s: html string to show for the log extract
+$types: String or Array Log types to show
+$page: String or Title The page title to show log entries for
+$user: String The user who made the log entries
+$param: Associative Array with the following additional options:
+ - lim Integer Limit of items to show, default is 50
+ - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
+ - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty if set to true (default), "No matching items in log" is displayed if loglist is empty
+ - msgKey Array If you want a nice box with a message, set this to the key of the message. First element is the message key, additional optional elements are parameters for the key that are processed with wfMsgExt and option 'parse'
+ - offset Set to overwrite offset parameter in $wgRequest set to '' to unset offset
+ - wrap String Wrap the message in html (usually something like "&lt;div ...>$1&lt;/div>").
+ - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
+
+'LoggableUserIPData': called when IP data for a user action can be logged by extensions like CheckUser.
+This is intended for when users do things that do not already create edits or log entries.
+$context: The context the of the action, which includes the user and request
+$data: Associative array of data for handlers to record. It must include values for:
+ - 'namespace' Integer namespace for target title (NS_SPECIAL is allowed)
+ - 'title' Database key string for target title (empty string if not applicable)
+ - 'pageid' Integer page ID for target title (zero if not applicable)
+ - 'action' Wikitext string in the same format as an edit summary
+ - 'comment' Wikitext string in the same format as an edit summary
+ - 'timestamp' Timestamp when the action occured
+
+LoginAuthenticateAudit': a login attempt for a valid user account either
succeeded or failed. No return data is accepted; this hook is for auditing only.
$user: the User object being authenticated against
$password: the password being submitted and found wanting
@@ -1167,11 +1267,6 @@ $time: timestamp of the log entry (added in 1.12)
'MaintenanceRefreshLinksInit': before executing the refreshLinks.php maintenance script
$refreshLinks: RefreshLinks object
-'MagicWordMagicWords': When defining new magic word.
-DEPRECATED: use $magicWords in a file listed in
-$wgExtensionMessagesFiles instead.
-$magicWords: array of strings
-
'MagicWordwgVariableIDs': When definig new magic words IDs.
$variableIDs: array of strings
@@ -1181,6 +1276,8 @@ depend on the current page/request; static configuration should be added
through ResourceLoaderGetConfigVars instead.
&$vars: variable (or multiple variables) to be added into the output
of Skin::makeVariablesScript
+$out: The OutputPage which called the hook,
+ can be used to get the real title
'MarkPatrolled': before an edit is marked patrolled
$rcid: ID of the revision to be marked patrolled
@@ -1223,8 +1320,8 @@ $db: The database object to be queried.
'MonoBookTemplateToolboxEnd': Called by Monobook skin after toolbox links have
been rendered (useful for adding more)
Note: this is only run for the Monobook skin. This hook is deprecated and
-may be removed in the future. To add items to the toolbox you should use
-the SkinTemplateToolboxEnd hook instead, which works for all
+may be removed in the future. To add items to the toolbox you should use
+the SkinTemplateToolboxEnd hook instead, which works for all
"SkinTemplate"-type skins.
$tools: array of tools
@@ -1239,7 +1336,7 @@ using this hook.
'NewRevisionFromEditComplete': called when a revision was inserted
due to an edit
-$article: the article edited
+$article: the WikiPage edited
$rev: the new revision
$baseID: the revision ID this was based off, if any
$user: the editing user
@@ -1381,6 +1478,17 @@ $title: title object representing the file
$file: file object that will be used to create the image
&$params: 2-D array of parameters
+'ParserSectionCreate': Called each time the parser creates a document section
+from wikitext. Use this to apply per-section modifications to HTML (like
+wrapping the section in a DIV). Caveat: DIVs are valid wikitext, and a DIV
+can begin in one section and end in another. Make sure your code can handle
+that case gracefully. See the EditSectionClearerLink extension for an
+example.
+$parser: the calling Parser instance
+$section: the section number, zero-based, but section 0 is usually empty
+&$sectionContent: ref to the content of the section. modify this.
+$showEditLinks: boolean describing whether this section has an edit link
+
'ParserTestParser': called when creating a new instance of Parser in
maintenance/parserTests.inc
$parser: Parser object created
@@ -1392,7 +1500,6 @@ to ensure that tests continue to run properly.
'PersonalUrls': Alter the user-specific navigation links (e.g. "my page,
my talk page, my contributions" etc).
-
&$personal_urls: Array of link specifiers (see SkinTemplate.php)
&$title: Title object representing the current page
@@ -1403,6 +1510,18 @@ $action : Action being performed
Change $result and return false to give a definitive answer, otherwise
the built-in rate limiting checks are used, if enabled.
+'PlaceNewSection': Override placement of new sections.
+$wikipage : WikiPage object
+$oldtext : the text of the article before editing
+$subject : subject of the new section
+&$text : text of the new section
+Return false and put the merged text into $text to override the default behavior.
+
+'PreferencesGetLegend': Override the text used for the <legend> of a preferences section
+$form: the PreferencesForm object. This is a ContextSource as well
+$key: the section name
+&$legend: the legend text. Defaults to wfMsg( "prefs-$key" ) but may be overridden
+
'PrefixSearchBackend': Override the title prefix search used for OpenSearch and
AJAX search suggestions. Put results into &$results outparam and return false.
$ns : array of int namespace keys to search in
@@ -1426,21 +1545,12 @@ $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
+$errorMsg: an html message string of an error or an array of message name and its parameters
'ProtectionForm::showLogExtract': called after the protection log extract is shown
$article: the page the form is shown for
$out: OutputPage object
-'ResourceLoaderRegisterModules': Right before modules information is required, such as when responding to a resource
-loader request or generating HTML output.
-&$resourceLoader: ResourceLoader object
-
-'ResourceLoaderGetStartupModules': Run once the startup module is being generated. This allows you
-to add modules to the startup module. This hook should be used sparingly since any module added here
-will be loaded on all pages. This hook is useful if you want to make code available to module loader
-scripts.
-
'RawPageViewBeforeOutput': Right before the text is blown out in action=raw
&$obj: RawPage object
&$text: The text that's going to be the output
@@ -1448,12 +1558,36 @@ scripts.
'RecentChange_save': called at the end of RecentChange::save()
$recentChange: RecentChange object
+'RequestContextCreateSkin': Called when RequestContext::getSkin creates a skin instance.
+Can be used by an extension override what skin is used in certain contexts.
+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.
+
'ResourceLoaderGetConfigVars': called at the end of
ResourceLoaderStartUpModule::getConfig(). Use this to export static
configuration variables to JavaScript. Things that depend on the current
page/request state must be added through MakeGlobalVariablesScript instead.
&$vars: array( variable name => value )
+'ResourceLoaderGetStartupModules': Run once the startup module is being generated. This allows you
+to add modules to the startup module. This hook should be used sparingly since any module added here
+will be loaded on all pages. This hook is useful if you want to make code available to module loader
+scripts.
+
+'ResourceLoaderRegisterModules': Right before modules information is required, such as when responding to a resource
+loader request or generating HTML output.
+&$resourceLoader: ResourceLoader object
+
+'ResourceLoaderTestModules': let you add new JavaScript testing modules. This is called after the addition of 'qunit' and MediaWiki testing resources.
+&testModules: array of JavaScript testing modules. The 'qunit' framework, included in core, is fed using tests/qunit/QUnitTestResources.php.
+&ResourceLoader object
+To add a new qunit module named 'myext.tests':
+testModules['qunit']['myext.tests'] = array(
+ 'script' => 'extension/myext/tests.js',
+ 'dependencies' => <any module dependency you might have>
+);
+For qunit framework, the mediawiki.tests.qunit.testrunner dependency will be added to any module.
+
'RevisionInsertComplete': called after a revision is inserted into the DB
&$revision: the Revision
$data: the data stored in old_text. The meaning depends on $flags: if external
@@ -1482,7 +1616,7 @@ $term : Search term string
&$title : Current Title object that is being returned (null if none found).
'SearchEngineReplacePrefixesComplete': Run after SearchEngine::replacePrefixes().
-$searchEngine : The SearchEngine object. Users of this hooks will be interested
+$searchEngine : The SearchEngine object. Users of this hooks will be interested
in the $searchEngine->namespaces array.
$query : Original query.
&$parsed : Resultant query with the prefixes stripped.
@@ -1540,7 +1674,7 @@ $title: displayed page title
$type: 'normal' or 'history' for old/diff views
&$msg: overridable message; usually 'copyright' or 'history_copyright'. This message must be in HTML format, not wikitext!
&$link: overridable HTML link to be passed into the message as $1
-&$forContent: overridable flag if copyright footer is shown in content language.
+&$forContent: overridable flag if copyright footer is shown in content language.
'SkinGetPoweredBy'
&$text: additional 'powered by' icons in HTML.
@@ -1578,9 +1712,6 @@ starts page output
$sktemplate: SkinTemplate object
$res: set to true to prevent active tabs
-'SkinTemplateSetupPageCss': use this to provide per-page CSS
-$out: Css to return
-
'SkinTemplateTabAction': Override SkinTemplate::tabAction().
You can either create your own array, or alter the parameters for
the normal one.
@@ -1666,9 +1797,9 @@ $data: array of data submitted by the user
'SpecialRandomGetRandomTitle': called during the execution of Special:Random,
use this to change some selection criteria or substitute a different title
&$randstr: The random number from wfRandom()
-&$isRedir: Boolean, whether to select a redirect or non-redirect
+&$isRedir: Boolean, whether to select a redirect or non-redirect
&$namespaces: An array of namespace indexes to get the title from
-&$extra: An array of extra SQL statements
+&$extra: An array of extra SQL statements
&$title: If the hook returns false, a Title object to use instead of the
result from the normal query
@@ -1736,10 +1867,10 @@ no matches
$term: string of search term
'SpecialStatsAddExtra': add extra statistic at the end of Special:Statistics
-&$extraStats: Array to save the new stats
+&$extraStats: Array to save the new stats
( $extraStats['<name of statistic>'] => <value>; )
-'SpecialUploadComplete': Called after successfully uploading a file from
+'SpecialUploadComplete': Called after successfully uploading a file from
Special:Upload
$form: The SpecialUpload object
@@ -1773,6 +1904,20 @@ $res: database result used to create the object
$title: The title in question.
&$types: The types of protection available.
+'TitleIsCssOrJsPage': Called when determining if a page is a CSS or JS page
+$title: Title object that is being checked
+$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page. Hooks may change this value to override the return value of Title::isCssOrJsPage()
+
+'TitleIsMovable': Called when determining if it is possible to move a page.
+Note that this hook is not called for interwiki pages or pages in immovable namespaces: for these, isMovable() always returns false.
+$title: Title object that is being checked
+$result: Boolean; whether MediaWiki currently thinks this page is movable. Hooks may change this value to override the return value of Title::isMovable()
+
+'TitleIsWikitextPage': Called when determining if a page is a wikitext or should
+be handled by seperate handler (via ArticleViewCustom)
+$title: Title object that is being checked
+$result: Boolean; whether MediaWiki currently thinks this is a wikitext page. Hooks may change this value to override the return value of Title::isWikitextPage()
+
'TitleMoveComplete': after moving an article (title)
$old: old title
$nt: new title
@@ -1780,6 +1925,13 @@ $user: user who did the move
$pageid: database ID of the page that's been moved
$redirid: database ID of the created redirect
+'TitleReadWhitelist': called at the end of read permissions checks, just before
+ adding the default error message if nothing allows the user to read the page.
+ If a handler wants a title to *not* be whitelisted, it should also return false.
+$title: Title object being checked against
+$user: Current user object
+&$whitelisted: Boolean value of whether this title is whitelisted
+
'UndeleteForm::showHistory': called in UndeleteForm::showHistory, after a
PageArchive object has been created but before any further processing is done.
&$archive: PageArchive object
@@ -1811,15 +1963,11 @@ $article: article "acted on"
'UnwatchArticle': before a watch is removed from an article
$user: user watching
-$article: article object to be removed
-
-'UnwatchArticle': after a watch is removed from an article
-$user: user that was watching
-$article: article object removed
+$page: WikiPage object to be removed
'UnwatchArticleComplete': after a watch is removed from an article
$user: user that watched
-$article: article object that was watched
+$page: WikiPage object that was watched
'UploadForm:initial': before the upload form is generated
$form: UploadForm object
@@ -1832,7 +1980,7 @@ $form: UploadForm object
Lets you poke at member variables like $mUploadDescription before the
file is saved.
Do not use this hook to break upload processing. This will return the user to
-a blank form with no error message; use UploadVerification and
+a blank form with no error message; use UploadVerification and
UploadVerifyFile instead
'UploadCreateFromRequest': when UploadBase::createFromRequest has been called
@@ -1842,19 +1990,19 @@ $type: (string) the requested upload type
'UploadComplete': when Upload completes an upload
&$upload: an UploadBase child instance
-'UploadFormInitDescriptor': after the descriptor for the upload form as been
+'UploadFormInitDescriptor': after the descriptor for the upload form as been
assembled
$descriptor: (array) the HTMLForm descriptor
-'UploadFormSourceDescriptors': after the standard source inputs have been
+'UploadFormSourceDescriptors': after the standard source inputs have been
added to the descriptor
$descriptor: (array) the HTMLForm descriptor
-'UploadVerification': additional chances to reject an uploaded file. Consider
+'UploadVerification': additional chances to reject an uploaded file. Consider
using UploadVerifyFile instead.
string $saveName: destination file name
string $tempName: filesystem path to the temporary file for checks
-string &$error: output: message key for message to show if upload canceled
+string &$error: output: message key for message to show if upload canceled
by returning false. May also be an array, where the first element
is the message key and the remaining elements are used as parameters to
the message.
@@ -1862,7 +2010,7 @@ string &$error: output: message key for message to show if upload canceled
'UploadVerifyFile': extra file verification, based on mime type, etc. Preferred
in most cases over UploadVerification.
object $upload: an instance of UploadBase, with all info about the upload
-string $mime: the uploaded file's mime type, as detected by MediaWiki. Handlers
+string $mime: the uploaded file's mime type, as detected by MediaWiki. Handlers
will typically only apply for specific mime types.
object &$error: output: true if the file is valid. Otherwise, an indexed array
representing the problem with the file, where the first element
@@ -1933,8 +2081,11 @@ $user: User to get groups for
&$rights: Array of rights, which may be added to.
'UserGetDefaultOptions': after fetching the core default, this hook is ran
-right before returning the options to the caller.
-&$defaultOptions: Array of preference keys and their default values.
+right before returning the options to the caller. WARNING: this hook is
+called for every call to User::getDefaultOptions(), which means it's
+potentially called dozens or hundreds of times. You may want to cache
+the results of non-trivial operations in your hook function for this reason.
+&$defaultOptions: Array of preference keys and their default values.
'UserGetEmail': called when getting an user email address
$user: User object
@@ -2048,6 +2199,11 @@ $user: User object
&$timestamp: new timestamp, change this to override local email
authentification timestamp
+'UserToolLinksEdit': Called when generating a list of user tool links, eg "Foobar (Talk | Contribs | Block)"
+$userId: User id of the current user
+$userText: User name of the current user
+&$items: Array of user tool links as HTML fragments
+
'WantedPages::getQueryInfo': called in WantedPagesPage::getQueryInfo(), can be
used to alter the SQL query which gets the list of wanted pages
&$wantedPages: WantedPagesPage object
@@ -2055,11 +2211,11 @@ 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
-$article: article object to be watched
+$page: WikiPage object to be watched
'WatchArticleComplete': after a watch is added to an article
$user: user that watched
-$article: article object watched
+$page: WikiPage object watched
'WatchlistEditorBuildRemoveLine': when building remove lines in
Special:Watchlist/edit
@@ -2068,6 +2224,9 @@ $title: Title object
$redirect: whether the page is a redirect
$skin: Skin object
+'WebRequestPathInfoRouter': While building the PathRouter to parse the REQUEST_URI.
+$router: The PathRouter instance
+
'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
dumps
One, and only one hook should set this, and return false.
@@ -2075,6 +2234,13 @@ One, and only one hook should set this, and return false.
&$opts: Options to use for the query
&$join: Join conditions
+'wfShellMaintenanceCmd': Called when generating a shell-escaped command line
+ string to run a maintenance script.
+&$script: MediaWiki maintenance script path
+&$parameters: Array of arguments and options to the script
+&$options: Associative array of options, may contain the 'php' and 'wrapper'
+ keys
+
'wgQueryPages': called when initialising $wgQueryPages, use this to add new
query pages to be updated with maintenance/updateSpecialPages.php
$query: $wgQueryPages itself
diff --git a/docs/html/.gitignore b/docs/html/.gitignore
new file mode 100644
index 00000000..f8476208
--- /dev/null
+++ b/docs/html/.gitignore
@@ -0,0 +1,3 @@
+*
+!README
+!.gitignore
diff --git a/docs/magicword.txt b/docs/magicword.txt
index 6ecdb569..ceae0262 100644
--- a/docs/magicword.txt
+++ b/docs/magicword.txt
@@ -12,9 +12,6 @@ defined is used by the program, for example, when moving a page and its old name
should include #REDIRECT.
They can be added in several arrays:
-* LanguageGetMagic hook, by adding a new key in $magicWords array. You can get
- language code in the $lang parameter. Use both the localized name and the
- English name.
* By adding a file to $wgExtensionMessagesFiles and defining there $magicWords.
This array is associative with the language code in the first dimension key
and then a "normal" array of magic words.
@@ -27,8 +24,24 @@ the variable with the "ParserGetVariableValueSwitch" hook.
For example to add a new variable:
+Create a file called ExtensionName.i18n.magic.php with the following contents:
+----
+<?php
+
+$magicWords = array();
+
+$magicWords['en'] = array(
+ // Case sensitive.
+ 'mag_custom' => array( 1, 'CUSTOM' ),
+);
+
+$magicWords['es'] = array(
+ 'mag_custom' => array( 1, 'ADUANERO' ),
+);
+----
+
+$wgExtensionMessagesFiles['ExtensionNameMagic'] = dirname( __FILE__ ) . '/ExtensionName.i18n.magic.php';
$wgHooks['MagicWordwgVariableIDs'][] = 'wfAddCustomMagicWordID';
-$wgHooks['LanguageGetMagic'][] = 'wfAddCustomMagicWordLang';
$wgHooks['ParserGetVariableValueSwitch'][] = 'wfGetCustomMagicWordValue';
function wfAddCustomMagicWordID( &$magicWords ) {
@@ -36,17 +49,6 @@ function wfAddCustomMagicWordID( &$magicWords ) {
return true;
}
-function wfAddCustomMagicWordLang( &$magicWords, $langCode ) {
- switch ( $langCode ) {
- case 'es':
- $magicWords['mag_custom'] = array( 1, "ADUANERO", "CUSTOM" );
- break;
- default:
- $magicWords['mag_custom'] = array( 1, "CUSTOM" );
- }
- return true;
-}
-
function wfGetCustomMagicWordValue( &$parser, &$varCache, &$index, &$ret ){
if( $index == 'mag_custom' ){
$ret = $varCache['mag_custom'] = "Custom value";
@@ -56,19 +58,24 @@ function wfGetCustomMagicWordValue( &$parser, &$varCache, &$index, &$ret ){
And to add a new parser function:
-$wgHooks['LanguageGetMagic'][] = 'wfAddCustomMagicWordLang';
-$wgHooks['ParserFirstCallInit'][] = 'wfRegisterCustomMagicWord';
+Create a file called ExtensionName.i18n.magic.php with the following contents:
+----
+<?php
-function wfAddCustomMagicWordLang( &$magicWords, $langCode ) {
- switch ( $langCode ) {
- case 'es':
- $magicWords['mag_custom'] = array( 0, "aduanero", "custom" );
- break;
- default:
- $magicWords['mag_custom'] = array( 0, "custom" );
- }
- return true;
-}
+$magicWords = array();
+
+$magicWords['en'] = array(
+ // Case insensitive.
+ 'mag_custom' => array( 0, 'custom' ),
+);
+
+$magicWords['es'] = array(
+ 'mag_custom' => array( 0, 'aduanero' ),
+);
+----
+
+$wgExtensionMessagesFiles['ExtensionNameMagic'] = dirname( __FILE__ ) . '/ExtensionName.i18n.magic.php';
+$wgHooks['ParserFirstCallInit'][] = 'wfRegisterCustomMagicWord';
function wfRegisterCustomMagicWord( &$parser ){
$parser->setFunctionHook( 'mag_custom', 'wfGetCustomMagicWordValue' );
diff --git a/docs/memcached.txt b/docs/memcached.txt
index d8863c91..f5384f9d 100644
--- a/docs/memcached.txt
+++ b/docs/memcached.txt
@@ -138,7 +138,7 @@ Message Cache:
key: $wgDBname:messages, $wgDBname:messages-hash, $wgDBname:messages-status
ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status
stores: an array where the keys are DB keys and the values are messages
- set in: wfMsg(), Article::editUpdates() both call wfLoadAllMessages()
+ set in: wfMsg(), Article::editUpdates() and Title::moveTo()
expriy: $wgMsgCacheExpiry
cleared by: nothing
@@ -159,7 +159,7 @@ Parser Cache:
$hash: hash of user options applied to the page, see ParserOptions::optionsHash()
ex: wikidb:pcache:idhash:1-0!1!0!!en!2
stores: ParserOutput object
- modified by: Article::editUpdates() or Article::getOutputFromWikitext()
+ modified by: WikiPage::doEditUpdates() or PoolWorkArticleView::doWork()
expiry: $wgParserCacheExpireTime or less if it contains short lived functions
key: $wgDBname:pcache:idoptions:$pageid
diff --git a/docs/uidesign/child-selector-emu.html b/docs/uidesign/child-selector-emu.html
new file mode 100644
index 00000000..8294b6d7
--- /dev/null
+++ b/docs/uidesign/child-selector-emu.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Child selector emulation for IE 6</title>
+ <style type="text/css">
+ /** Common rules **/
+ body { background-color: #CCC; }
+ table { border:1px black solid; }
+ caption {
+ background-color: #98fb98;
+ border:1px solid #40FF40;
+ }
+
+ /** "old" rules" **/
+ table.global th,
+ table.global td
+ {
+ border: 1px red solid;
+ background-color:white;
+ padding:1em;
+ }
+ table.global th
+ {
+ background-color: #ffc0cb;
+ }
+
+ /** second table. Try to emulate child selector */
+ table.childemu th,
+ table.childemu td {
+ border: 1px red solid;
+ background-color:white;
+ padding:1em;
+ }
+ table.childemu th
+ {
+ background-color: #ffc0cb;
+ }
+
+ /** Reset style applied in childemu classes */
+ /** TODO: find the real default value!! */
+ table.childemu tr * th,
+ table.childemu tr * td {
+ border: none;
+ background-color: transparent;
+ padding: 0;
+ }
+
+
+ /** child selector emulation */
+ </style>
+</head>
+<body>
+<p>
+The following table show how nested tables inherit colors from the wikitable class (here it was renamed "global").
+</p>
+<table class="global">
+<caption>Global table</caption>
+<tr>
+ <th>TH: should have pink bg</th>
+</tr>
+<tr>
+ <td>TD: white bg</td>
+</tr>
+<tr>
+ <td>
+ <table class="nested">
+ <caption>Nested table</caption>
+ <tr>
+ <th>Nested TH: transparent</th>
+ <td>Nested TD: transparent</td>
+ </tr>
+ </table>
+ </td>
+</tr>
+</table>
+
+<p>
+With child selector we could limit the wikitable styling to the direct childs of the table. Unfortunately, Internet Explorer 6.0 does not support child selector. See <a href="https://bugzilla.wikimedia.org/show_bug.cgi?id=33752">our bug #33752</a>.
+</p>
+<table class="childemu">
+<caption>Global table</caption>
+<tr>
+ <th>TH: should have pink bg</th>
+</tr>
+<tr>
+ <td>TD: white bg</td>
+</tr>
+<tr>
+ <td>
+ <table class="nested">
+ <caption>Nested table</caption>
+ <tr>
+ <th>Nested TH: transparent</th>
+ <td>Nested TD: transparent</td>
+ </tr>
+ </table>
+ </td>
+</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
new file mode 100644
index 00000000..20dab86e
--- /dev/null
+++ b/docs/uidesign/design.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <link rel="stylesheet" href="../../skins/common/shared.css" />
+</head>
+<body style="font-size: small;">
+
+ <h2>Messages</h2>
+ <p class="success">Success message</p>
+ <p class="warning">Warning message</p>
+ <p class="error">Error message</p>
+
+ <h2>Messages box</h2>
+ <p class="visualClear successbox">Success message</p>
+ <p class="visualClear warningbox">Warning message</p>
+ <p class="visualClear errorbox">Error message</p>
+
+ <br class="visualClear"/>
+ <h2>Various</h2>
+ <span class="comment">span.comment</span>
+ <a class="feedlink">a.feedlink</a>
+ <table class="wikitable">
+ <tr><th colspan="2">table.wikitable</td></tr>
+ <tr><td>cell</td><td>cell</td></tr>
+ <tr><td>cell</td><td>cell</td></tr>
+ </table>
+
+ <table class="mw-datatable">
+ <tr><th colspan="2">table.mw-datatable</td></tr>
+ <tr><td>line with hover</td><td>line with hover</td></tr>
+ <tr><td>line with hover</td><td>line with hover</td></tr>
+ </table>
+
+</body></html>
diff --git a/docs/uidesign/mediawiki.action.history.diff.html b/docs/uidesign/mediawiki.action.history.diff.html
new file mode 100644
index 00000000..fdc54aa3
--- /dev/null
+++ b/docs/uidesign/mediawiki.action.history.diff.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css" />
+</head>
+<body style="background-color: #C0C0C0;">
+<p>
+This show various styles for our diff action, the background being hardcoded to gray (<tt>#C0C0C0</tt>) The reference style sheet is:</p>
+<p>
+<tt><a href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">resources/mediawiki.action/mediawiki.action.history.diff.css</a></tt>.
+</p>
+<p>
+This file might help us fix our diff colors which have been a recurring issues among the community for a loooong time.</p>
+
+<p>
+First, show the diff mostly like it would be chown on a wiki</p>
+<table class="diff">
+<tr>
+ <td class="diff-marker">-</td>
+ <td class="diff-deletedline"><div>
+ Some content <span class="diffchange diffchange-inline">deleted / replaced</span>
+ </div></td>
+ <td class="diff-marker">+</td>
+ <td class="diff-addedline"><div>
+ Some content <span class="diffchange diffchange-inline">added / replacement</span>
+ </div></td>
+</tr>
+</table>
+
+
+<p>
+Below are some basic lines being applied one or two classes. Mainly for debugging purposes</p>
+
+<table class="diff">
+
+ <tr><th>Diff</th></tr>
+
+ <tr><td class="diff-addedline"><tt>diff-addedline</tt>: added line</td></tr>
+ <tr><td class="diff-deletedline"><tt>diff-deletedline</tt>: deleted line</td></tr>
+ <tr><td class="diff-context"><tt>diff-context</tt>: context</td></tr>
+
+
+ <tr><th>Same as above with a <tt>&lt;span&gt;</tt> child element having the <tt>diffchange</tt> class</th></tr>
+
+ <tr><td class="diffchange">Diffchange</td></tr>
+ <tr><td class="diff-addedline">
+ <span class="diffchange">Added line + diffchange</span>
+ </td></tr>
+ <tr><td class="diff-deletedline">
+ <span class="diffchange">Deleted line + diffchange</span>
+ </td></tr>
+ <tr><td class="diff-context">
+ <span class="diffchange">Context + diffchange</span>
+ </td></tr>
+</table>
+
+</body></html>
diff --git a/docs/uidesign/monospace.html b/docs/uidesign/monospace.html
new file mode 100644
index 00000000..84ec13a4
--- /dev/null
+++ b/docs/uidesign/monospace.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <style type="text/css">
+ pre {
+ border: 1px dashed #AAA;
+ background-color: #E0E0E0;
+ color: #000000;
+ margin: 1em 10%;
+ padding: 0.5em;
+ }
+ blockquote {
+ font-style: italic;
+ }
+ </style>
+</head>
+<body>
+<p>
+This page let you test the rendering font-family declaration for monospaced fonts. TODO: add some references here :-)
+</p>
+<p>
+Erwin Dokter had the following explanation on <a href="https://bugzilla.wikimedia.org/33496">Bugzilla #33496</a>:
+</p>
+<blockquote>
+By default, a (Windows) browser has it's default font-sizes set at 16px for
+serif and sans-serif, and 13px for monospace. Except in IE, where you cannot
+set any font-sizes... it uses 16px for all fonts.
+<br/>
+Vector has a base font-size of 0.8em, and most browsers *correctly* scale down
+all fonts, including the monospace font, accordingly. So monospace is shown at
+0.8 x 13px = 10px (which is perceived as 'too small'). But when you assign any
+font besides just "monospace", those browsers will no longer treat it as
+monospace and use 0.8 x 16px = 13px instead.
+</blockquote>
+<p>
+Below are various rendering:
+</p>
+
+<pre style='
+font-family: monospace;'>
+font-family: monospace;
+</pre>
+
+<pre style='
+font-family: "Courier New";'>
+font-family: "Courier New";
+</pre>
+
+<pre style='
+font-family: Courier;'>
+font-family: Courier;
+</pre>
+
+<pre style='
+font-family: monospace, monospace;'>
+font-family: monospace, monospace;
+</pre>
+
+<pre style='
+font-family: monospace, "Courier New";'>
+font-family: monospace, "Courier New";
+</pre>
+
+<pre style='
+font-family: monospace, Courier;'>
+font-family: monospace, Courier;
+</pre>
+
+<pre style='
+font-family: monospace, Verdana;'>
+font-family: monospace, Verdana;
+</pre>
+
+<pre style='
+font-family: monospace, DOESNOTEXISTREALLY;'>
+font-family: monospace, DOESNOTEXISTREALLY;
+</pre>
+
diff --git a/docs/uidesign/table-layout.html b/docs/uidesign/table-layout.html
new file mode 100644
index 00000000..6f538258
--- /dev/null
+++ b/docs/uidesign/table-layout.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <style type="text/css">
+ /** This is just for coloring: */
+ table { border: 1px solid #CC0; }
+ td { border: 1px solid #CCC; }
+
+ table {
+ width: 100%;
+ table-layout: fixed;
+ }
+
+ #first {
+ width: 300px;
+ }
+ </style>
+</head>
+<body>
+
+<p>
+This play with table-layout:fixed; and applying the width to colgroup or col element. Firefox only recongize the width if it is applied on col element!</p>
+<p>
+On a perfect browser, both tables should look the same</p>
+
+<dl>
+ <dt>colgroup</dt>
+ <dd>300 px width is applied to the first colgroup element</dd>
+</dl>
+<div style="width: 400px;">
+<table>
+ <colgroup id="first" /></colgroup>
+ <colgroup id="second"/></colgroup>
+ <colgroup id="third" /></colgroup>
+ <tr>
+ <td>Very long?</td>
+ <td>#</td>
+ <td>$</td>
+ </tr>
+</table>
+</div>
+
+<dl>
+ <dt>col</dt>
+ <dd>Each colgroup has an additional col element. The first col element is applied the 300 px width</dd>
+</dl>
+
+<div style="width: 400px;">
+<table>
+ <colgroup><col id="first" /></colgroup>
+ <colgroup><col id="second"/></colgroup>
+ <colgroup><col id="third" /></colgroup>
+ <tr>
+ <td>Very long?</td>
+ <td>#</td>
+ <td>$</td>
+ </tr>
+</table>
+</div>
+
diff --git a/extensions/.gitignore b/extensions/.gitignore
new file mode 100644
index 00000000..f8476208
--- /dev/null
+++ b/extensions/.gitignore
@@ -0,0 +1,3 @@
+*
+!README
+!.gitignore
diff --git a/extensions/ConfirmEdit/.gitreview b/extensions/ConfirmEdit/.gitreview
new file mode 100644
index 00000000..780d35df
--- /dev/null
+++ b/extensions/ConfirmEdit/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/ConfirmEdit.git
+defaultbranch=master
diff --git a/extensions/ConfirmEdit/Asirra.i18n.php b/extensions/ConfirmEdit/Asirra.i18n.php
index 98ab918b..210f1dda 100644
--- a/extensions/ConfirmEdit/Asirra.i18n.php
+++ b/extensions/ConfirmEdit/Asirra.i18n.php
@@ -66,6 +66,21 @@ $messages['de-formal'] = array(
'asirra-failed' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
);
+/** Spanish (Español)
+ * @author Armando-Martin
+ */
+$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-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-nojs' => "'''Por favor active JavaScript y vuelva a la página.'''",
+ 'asirra-failed' => 'Identifique todas las imágenes de gatos',
+);
+
/** French (Français)
* @author Seb35
*/
@@ -181,6 +196,21 @@ $messages['nl'] = array(
'asirra-failed' => 'Identificeer alle afbeeldingen van katten.',
);
+/** Polish (Polski)
+ * @author BeginaFelicysym
+ */
+$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-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-nojs' => "'''Prosimy włączyć obsługę języka JavaScript i ponowne przesłanie strony.'''",
+ 'asirra-failed' => 'Prosimy wskazać wszystkie obrazy kotów',
+);
+
/** Piedmontese (Piemontèis)
* @author Borichèt
* @author Dragonòt
diff --git a/extensions/ConfirmEdit/Captcha.php b/extensions/ConfirmEdit/Captcha.php
index ef039462..3d6494ff 100644
--- a/extensions/ConfirmEdit/Captcha.php
+++ b/extensions/ConfirmEdit/Captcha.php
@@ -181,7 +181,8 @@ class SimpleCaptcha {
if ( $wgCaptchaWhitelistIP ) {
global $wgRequest;
- $ip = $wgRequest->getIP();
+ // Compat: WebRequest::getIP is only available since MW 1.19.
+ $ip = method_exists( $wgRequest, 'getIP' ) ? $wgRequest->getIP() : wfGetIP();
foreach ( $wgCaptchaWhitelistIP as $range ) {
if ( IP::isInRange( $ip, $range ) ) {
@@ -199,7 +200,9 @@ class SimpleCaptcha {
*/
function badLoginKey() {
global $wgRequest;
- return wfMemcKey( 'captcha', 'badlogin', 'ip', $wgRequest->getIP() );
+ // Compat: WebRequest::getIP is only available since MW 1.19.
+ $ip = method_exists( $wgRequest, 'getIP' ) ? $wgRequest->getIP() : wfGetIP();
+ return wfMemcKey( 'captcha', 'badlogin', 'ip', $ip );
}
/**
@@ -418,7 +421,7 @@ class SimpleCaptcha {
*/
function getLinksFromTracker( $title ) {
$dbr = wfGetDB( DB_SLAVE );
- $id = $title->getArticleId(); // should be zero queries
+ $id = $title->getArticleID(); // should be zero queries
$res = $dbr->select( 'externallinks', array( 'el_to' ),
array( 'el_from' => $id ), __METHOD__ );
$links = array();
diff --git a/extensions/ConfirmEdit/ConfirmEdit.i18n.php b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
index 6188a46d..b53f1071 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.i18n.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
@@ -156,9 +156,9 @@ $messages['am'] = array(
*/
$messages['an'] = array(
'captcha-edit' => 'Ta editar ista pachina, faiga por favor a suma simpla que apareixe contino y escriba a solución en a caixa ([[Special:Captcha/help|más información]]):',
- 'captcha-desc' => 'Implementación de CAPTCHA ta protecher contra o spam y dovinación de contrasenyas.',
+ 'captcha-desc' => 'Implementación de CAPTCHA ta protecher contra o spam y dovinanza de claus.',
'captcha-addurl' => "A suya edición encluye vinclos esternos. Ta aduyar-nos en a proteción contra o spam automatizato, por favor, faiga a suma simpla que s'amuestra contino y escriba a respuesta en a caixa ([[Special:Captcha/help|más información]]):",
- 'captcha-badlogin' => 'Ta aduyar en a protección contra a obtención automatizata de parolas de paso, por favor faiga a suma simpla que amaneixe contino y escriba a respuesta en a caixa ([[Special:Captcha/help|más información]]):',
+ 'captcha-badlogin' => "Ta aduyar-nos en a protección contra a obtención automatizata de claus d'acceso, por favor faiga a suma simpla que amaneixe contino y escriba a respuesta en a caixa ([[Special:Captcha/help|más información]]):",
'captcha-createaccount' => "Ta aduyar-nos en a proteción contra a creyación automatica de cuentas, por favor faiga a suma simpla que s'amuestra contino y escriba a respuesta en a caixa ([[Special:Captcha/help|más información]]):",
'captcha-createaccount-fail' => 'No ha escrito o codigo de confirmación, u iste ye incorreuto.',
'captcha-create' => "Ta creyar a pachina, por favor faiga a suma simpla que s'amuestra contino y escriba a respuesta en a caixa ([[Special:Captcha/help|más información]]):",
@@ -325,6 +325,13 @@ Calca nel botón 'atrás' del to navegador pa volver a la páxina d'edición.",
'right-skipcaptcha' => 'Facer les acciones que requieren captcha ensin tener que lu introducir',
);
+/** Azerbaijani (Azərbaycanca)
+ * @author Vugar 1981
+ */
+$messages['az'] = array(
+ 'captchahelp-title' => 'CAPTCHA kömək',
+);
+
/** Bashkir (БашҡортÑа)
* @author Assele
*/
@@ -454,7 +461,7 @@ $messages['be-tarask'] = array(
# * УÑе непуÑÑ‚Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– зьÑўлÑюцца чаÑткамі Ñ€ÑгулÑрнага выразу, Ñкі будзе выкарыÑтоўвацца толькі
# Ñž дачыненьні да назваў ÑÑрвÑраў у вонкавых ÑпаÑылках
#</pre> <!-- leave this line exactly as it is -->',
- 'right-skipcaptcha' => 'ДоÑтуп да магчымаÑьцÑÑž абароненых пытаньнÑмі Ñž выÑве ці разьвÑзаньнем прыкладаў, без ÑƒÐ¶Ñ‹Ð²Ð°Ð½ÑŒÐ½Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€Ð°Ðº',
+ 'right-skipcaptcha' => 'выкананьне дзеÑньнÑÑž без праверкі CAPTCHA, дзе Ñна патрабуецца',
);
/** Bulgarian (БългарÑки)
@@ -519,10 +526,11 @@ $messages['bn'] = array(
/** Breton (Brezhoneg)
* @author BrokenArrow
* @author Fulup
+ * @author VIGNERON
* @author Y-M D
*/
$messages['br'] = array(
- 'captcha-edit' => "A-raok gellout degas kemmoù war ar bajenn-mañ e c'houlenner ouzhoc'h respont d'ar jedadenn eeun a-is ha lakaat an disoc'h er vaezienn ([[Special:Captcha/help|Petra eo se?]])",
+ 'captcha-edit' => "A-raok gellout kemmañ ar bajenn-mañ e c'houlenner ouzhoc'h respont d'ar jedadenn eeun a-is ha lakaat an disoc'h er vaezienn ([[Special:Captcha/help|Petra eo se?]])",
'captcha-desc' => 'Pourchas a ra teknikoù CAPTCHA evit en em wareziñ diouzh ar strob hag an diskuliañ gerioù-tremen',
'captcha-addurl' => "Liammoù diavaez nevez zo bet ouzhpennet ganeoc'h. A-benn talañ ouzh ar strob emgefre skrivit disoc'h ar jedadennig eeun-mañ er stern : <br />([[Special:Captcha/help|Petra eo se?]])",
'captcha-badlogin' => "A-benn talañ ouzh preizhadur emgefre ar gerioù-tremen gant ar botoù e c'houlenner ouzhoc'h jediñ an tamm oberiadenn ha skrivañ an disoc'h anezhi er vaezienn a-is ([[Special:Captcha/help|Petra eo se ?]]):",
@@ -816,11 +824,12 @@ Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
/** Zazaki (Zazaki)
* @author Aspar
+ * @author Erdemaslancan
* @author Xoser
*/
$messages['diq'] = array(
'captcha-edit' => 'Qe ena pel vurnayîşî, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
- 'captcha-desc' => 'Implementasyonê captacha yê asanî',
+ 'captcha-desc' => 'Rehat CAPTCHA teknoloci u dezgina parola-ezayan',
'captcha-addurl' => 'Vurnayîşanê tu de linkanê harîcîyê newe esto.
Qe otomatik spamî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
'captcha-badlogin' => 'Qe otomatik parola crack kerdişî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
@@ -1409,6 +1418,7 @@ Ins Bearbeitigsfänschter chunnt mer derno eifach wider mit em „Zruck“-Chnop
* @author Ashok modhvadia
* @author Dsvyas
* @author KartikMistry
+ * @author Sushant savla
*/
$messages['gu'] = array(
'captcha-edit' => 'આ લેખમાં ફેરફાર કરવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
@@ -1419,7 +1429,9 @@ $messages['gu'] = array(
'captcha-createaccount' => 'આપોઆપ નવા ખાતા ખà«àª²àª¤àª¾ રોકવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો',
'captcha-createaccount-fail' => 'ખોટી અથવા ખૂટતી ખાતરી સંજà«àªžàª¾.',
'captcha-create' => 'નવà«àª‚ પાનà«àª‚ બનાવવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
+ 'captcha-sendemail' => 'આપોઆપ થતી સà«àªªà«‡àª®àª¿àª‚ગથી બચાવવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
'captcha-sendemail-fail' => 'ખોટી અથવા ખૂટતી ખાતરી સંજà«àªžàª¾.',
+ 'captcha-disabledinapi' => 'આ કà«àª°àª¿àª¯àª¾ માટે કેપà«àªšàª¾àª¨à«€ જરૂર છે, માટે તે API દà«àªµàª¾àª°àª¾ પાર પાડી શકાય તેમ નથી.',
'captchahelp-title' => 'કેપà«àªŸà«àªšàª¾/કેપà«àªšàª¾ (Captcha) મદદ',
'captchahelp-cookies-needed' => 'આ વà«àª¯àªµàª¸à«àª¥àª¿àª¤ રીતે જોઇ શકાય તે માટે તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ કà«àª•à«€àª àªàª¨à«‡àª¬àª² કરેલી હોવી જોઇશે.',
'captchahelp-text' => "આપણી વિકિ જેવી વૅબ સાઇટો કે જે લોકોને યોગદાન કરવાની પરવાનગી આપે છે, તેમનો સà«àªªàª¾àª®àª°à«‹ દà«àªµàª¾àª°àª¾ દà«àª°à«‚પયોગ થતો આવà«àª¯à«‹ છે. આવા સà«àªªàª¾àª®àª°à«‹ તેમની કડીઓ àªàª• સાથે અનેક વૅબ સાઇટો પર મà«àª•àªµàª¾ માટે સà«àªµàªšàª¾àª²àª¿àª¤ સાધનો વાપરે છે. આવી કડીઓ ખરેખર àªàª• દૂષણ છે અને તેને દૂર કરવાના ઉપાય કરવા જોઇàª.
@@ -1743,6 +1755,7 @@ Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid t
/** Icelandic (Ãslenska)
* @author S.Örvarr.S
+ * @author Snævar
*/
$messages['is'] = array(
'captcha-edit' => 'Til að breyta þessari síðu, gjörðu svo vel og finndu summuna að neðan og skrifaðu svarið í
@@ -1758,11 +1771,12 @@ kassann ([[Special:Captcha/help|frekari upplýsinngar]]):',
'captchahelp-cookies-needed' => 'Þú verður að leyfa vefkökur til þess að þetta virki.',
'captchahelp-text' => 'Vefsíður sem að leyfa framlög frá frá almenningi, líkt og þessi wiki-vefur, eru oft misnotaðar af svokölluðum „spömmurum“ sem nota sjálfvirk tól til þess að setja inn tengla á aðrar vefsíður. Aðrir notendur geta fjarlægt þessa tengla en töluverð truflun er af þeim.
-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 notendur af holdi og blóði er þetta lítið mál en sjálfvirk tól ráða ekki við þetta.
+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. Ef þetta kemur í veg fyrir lögmætar breytingar af þinni hálfu getur þú leitað aðstoðar hjá stjórnendum vefsins.
+Þ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.
-Notaðu „back“-hnapp vafrans til að halda áfram.',
+Notaðu „til-baka“-hnapp vafrans til að breyta síðunni.',
);
/** Italian (Italiano)
@@ -1805,11 +1819,12 @@ Fare clic sul pulsante 'back' del browser per tornare alla pagina di modifica.",
* @author Fryed-peach
* @author Hosiryuhosi
* @author JtFuruhata
+ * @author Shirayuki
* @author Whym
*/
$messages['ja'] = array(
- 'captcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã€æ¬„ã«ç­”ãˆã‚’入力ã—ã¦ãã ã•ã„。([[Special:Captcha/help|ヘルプ]])',
- 'captcha-desc' => 'スパムやパスワード推定ã®æ”»æ’ƒã‚’防ããŸã‚ã®CAPTCHA技術をæä¾›ã—ã¾ã™',
+ 'captcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã€æ¬„ã«ç­”ãˆã‚’入力ã—ã¦ãã ã•ã„([[Special:Captcha/help|ヘルプ]]):',
+ 'captcha-desc' => 'スパムやパスワード推定ã®æ”»æ’ƒã‚’防ããŸã‚ã®CAPTCHA技術をæä¾›ã™ã‚‹',
'captcha-addurl' => 'ã‚ãªãŸã®ç·¨é›†ã«ã‚ˆã‚Šæ–°ãŸã«å¤–部リンクãŒè¿½åŠ ã•ã‚Œã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚スパム防止ã®ãŸã‚ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã€æ¬„ã«ç­”ãˆã‚’入力ã—ã¦ãã ã•ã„。([[Special:Captcha/help|ヘルプ]])',
'captcha-badlogin' => '自動化スクリプトã«ã‚ˆã‚‹ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã€æ¬„ã«ç­”ãˆã‚’入力ã—ã¦ãã ã•ã„。([[Special:Captcha/help|ヘルプ]])',
'captcha-createaccount' => 'アカウントã®è‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã€æ¬„ã«ç­”ãˆã‚’入力ã—ã¦ãã ã•ã„。([[Special:Captcha/help|ヘルプ]])',
@@ -1819,20 +1834,24 @@ $messages['ja'] = array(
'captcha-sendemail-fail' => '確èªã‚³ãƒ¼ãƒ‰ãŒé–“é•ã£ã¦ã„ã‚‹ã‹å…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'captcha-disabledinapi' => 'ã“ã®æ“作ã¯ã‚­ãƒ£ãƒ—ãƒãƒ£ã‚’å¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚ã€APIã«ã‚ˆã£ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。',
'captchahelp-title' => 'CAPTCHA(ç”»åƒèªè¨¼)ヘルプ',
- 'captchahelp-cookies-needed' => 'ブラウザã®ã‚¯ãƒƒã‚­ãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
- 'captchahelp-text' => '一般ã‹ã‚‰ã®æŠ•ç¨¿ã‚’å—ã‘付ã‘ã‚‹ã“ã®ã‚¦ã‚£ã‚­ã®ã‚ˆã†ãªã‚¦ã‚§ãƒ–サイトã¯ã€è‡ªå‹•æŠ•ç¨¿ãƒ„ールを使ã£ã¦å¤šãã®ã‚µã‚¤ãƒˆã«ãƒªãƒ³ã‚¯ã‚’å¼µã£ã¦ã¾ã‚るスパマーã«ã‚ˆã‚Šè’らã•ã‚ŒãŒã¡ã§ã™ã€‚ã“ã®ã‚ˆã†ãªã‚¹ãƒ‘ムã¯é™¤åŽ»ã§ãã‚‹ã‚‚ã®ã®ã€ãã®ä½œæ¥­ã¯å¤§å¤‰ã«é¢å€’ãªã‚‚ã®ã§ã™ã€‚
+ 'captchahelp-cookies-needed' => 'ブラウザ㮠Cookie を有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'captchahelp-text' => '一般ã‹ã‚‰ã®æŠ•ç¨¿ã‚’å—ã‘付ã‘ã‚‹ã“ã®ã‚¦ã‚£ã‚­ã®ã‚ˆã†ãªã‚¦ã‚§ãƒ–サイトã¯ã€è‡ªå‹•æŠ•ç¨¿ãƒ„ールを使ã£ã¦å¤šãã®ã‚µã‚¤ãƒˆã«ãƒªãƒ³ã‚¯ã‚’å¼µã£ã¦ã¾ã‚るスパマーã«ã‚ˆã‚Šè’らã•ã‚ŒãŒã¡ã§ã™ã€‚
+ã“ã®ã‚ˆã†ãªã‚¹ãƒ‘ムã¯é™¤åŽ»ã§ãã‚‹ã‚‚ã®ã®ã€ãã®ä½œæ¥­ã¯å¤§å¤‰ã«é¢å€’ãªã‚‚ã®ã§ã™ã€‚
-ã“ã®ãŸã‚ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ã¨ãã©ãã€ç‰¹ã«æ–°ã—ã„外部リンクãŒãƒšãƒ¼ã‚¸ã«è¿½åŠ ã•ã‚ŒãŸã¨ããªã©ã«ã€è‰²ã®ä»˜ã„ãŸã€ã‚ã‚‹ã„ã¯å½¢ã®ã‚†ãŒã‚“ã æ–‡å­—ã®ç”»åƒã‚’æ示ã—ã€ãªã‚“ã¨æ›¸ã„ã¦ã‚ã‚‹ã‹å…¥åŠ›ã‚’ãŠé¡˜ã„ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ä½œæ¥­ã¯è‡ªå‹•åŒ–ãŒé›£ã—ã„ãŸã‚ã€ã‚¹ãƒ‘マーãªã©ã®ãƒ—ログラムを用ã„ãŸæ”»æ’ƒã‚’ã»ã¼é˜»æ­¢ã—ã¤ã¤ã€å¤§åŠã®ç”Ÿèº«ã®äººé–“ã«ã‚ˆã‚‹æŠ•ç¨¿ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚
+ã“ã®ãŸã‚ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ã¨ãã©ãã€ç‰¹ã«æ–°ã—ã„外部リンクãŒãƒšãƒ¼ã‚¸ã«è¿½åŠ ã•ã‚ŒãŸã¨ããªã©ã«ã€è‰²ã®ä»˜ã„ãŸã€ã‚ã‚‹ã„ã¯å½¢ã®ã‚†ãŒã‚“ã æ–‡å­—ã®ç”»åƒã‚’æ示ã—ã€ä½•ã¨æ›¸ã„ã¦ã‚ã‚‹ã‹å…¥åŠ›ã‚’ãŠé¡˜ã„ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚
+ã“ã®ä½œæ¥­ã¯è‡ªå‹•åŒ–ãŒé›£ã—ã„ãŸã‚ã€ã‚¹ãƒ‘マーãªã©ã®ãƒ—ログラムを用ã„ãŸæ”»æ’ƒã‚’ã»ã¼é˜»æ­¢ã—ã¤ã¤ã€å¤§åŠã®ç”Ÿèº«ã®äººé–“ã«ã‚ˆã‚‹æŠ•ç¨¿ãŒã§ãるよã†ã«ã—ã¾ã™ã€‚
-ã—ã‹ã—ã€æ®‹å¿µãªã“ã¨ã«ã€ã“ã®æ–¹æ³•ã«ã‚ˆã‚Šã€è¦–力ã®ä½Žã„利用者やã€ãƒ†ã‚­ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹ã‚ã‚‹ã„ã¯éŸ³å£°ãƒ™ãƒ¼ã‚¹ã®ãƒ–ラウザを使ã£ã¦ã„る利用者ã«ã”ä¸ä¾¿ã‚’ãŠã‹ã‘ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ç¾æ™‚点ã§ã¯ã€éŸ³å£°ã«ã‚ˆã‚‹ä»£æ›¿æ–¹æ³•ã¯ã‚ã‚Šã¾ã›ã‚“。正当ãªæŠ•ç¨¿ã‚’ã™ã‚‹ã«ã‚ãŸã£ã¦æœ¬æ©Ÿèƒ½ãŒéšœå®³ã¨ãªã£ã¦ã„ã‚‹å ´åˆã€[[{{MediaWiki:Grouppage-sysop}}|サイト管ç†è€…]]ã«é€£çµ¡ã—ã¦å”力を求ã‚ã¦ãã ã•ã„。
+ã—ã‹ã—ã€æ®‹å¿µãªã“ã¨ã«ã€ã“ã®æ–¹æ³•ã«ã‚ˆã‚Šã€è¦–力ã®ä½Žã„利用者やã€ãƒ†ã‚­ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹ã‚ã‚‹ã„ã¯éŸ³å£°ãƒ™ãƒ¼ã‚¹ã®ãƒ–ラウザを使ã£ã¦ã„る利用者ã«ã”ä¸ä¾¿ã‚’ãŠã‹ã‘ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
+ç¾æ™‚点ã§ã¯ã€éŸ³å£°ã«ã‚ˆã‚‹ä»£æ›¿æ–¹æ³•ã¯ã‚ã‚Šã¾ã›ã‚“。
+正当ãªæŠ•ç¨¿ã‚’ã™ã‚‹ã«ã‚ãŸã£ã¦æœ¬æ©Ÿèƒ½ãŒéšœå®³ã¨ãªã£ã¦ã„ã‚‹å ´åˆã€[[{{MediaWiki:Grouppage-sysop}}|サイト管ç†è€…]]ã«é€£çµ¡ã—ã¦å”力を求ã‚ã¦ãã ã•ã„。
ページã®ç·¨é›†ã«æˆ»ã‚‹ã«ã¯ã€ãƒ–ラウザã®ã€Œæˆ»ã‚‹ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
'captcha-addurl-whitelist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
-# 構文ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã§ã™:
+# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
# * "#"文字ã‹ã‚‰è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™
-# * 空白をå«ã‚“ã§ã„ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+# * 空白をå«ã¾ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
#</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
- 'right-skipcaptcha' => 'CAPTCHAãŒå¿…è¦ãªå ´é¢ã§CAPTCHAをスキップã—ã¦æ“作を実行ã™ã‚‹',
+ 'right-skipcaptcha' => 'CAPTCHAãŒå¿…è¦ãªå ´é¢ã§CAPTCHAをスキップã—ã¦æ“作を実行',
);
/** Jutish (Jysk)
@@ -1895,16 +1914,40 @@ Pencèten tombol 'back' ing panjlajah wèb panjenengan kanggo bali menyang kaca
);
/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author David1010
* @author ITshnik
*/
$messages['ka'] = array(
'captcha-edit' => 'áƒáƒ› გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბისáƒáƒ—ვის, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'captcha-desc' => 'უზრუნველყáƒáƒ¤áƒ¡ CAPTCHA-ს მეთáƒáƒ“ების გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ¡ სპáƒáƒ›áƒ˜áƒ¡áƒ დრპáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒœáƒáƒ‘ისáƒáƒ’áƒáƒœ დáƒáƒ¡áƒáƒªáƒáƒ•áƒáƒ“',
'captcha-addurl' => 'თქვენი ცვლილებრშეიცáƒáƒ•áƒ¡ áƒáƒ®áƒáƒš გáƒáƒ áƒ” ბმულებს.
áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
'captcha-badlogin' => 'პáƒáƒ áƒáƒšáƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒ¢áƒ”ხვისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
'captcha-createaccount' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ შექმნისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'captcha-createaccount-fail' => 'დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ დáƒáƒ™áƒáƒ áƒ’ულიáƒ.',
'captcha-create' => 'გვერდის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
'captcha-sendemail' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'captcha-sendemail-fail' => 'დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ დáƒáƒ™áƒáƒ áƒ’ულიáƒ.',
+ 'captcha-disabledinapi' => 'ეს მáƒáƒ¥áƒ›áƒ”დებრმáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ CAPTCHA-ს შემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¡ დრáƒáƒ›áƒ˜áƒ¢áƒáƒ› შეუძლებელირმისი შესრულებრAPI-ით.',
+ 'captchahelp-title' => 'CAPTCHA-ს დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
+ 'captchahelp-cookies-needed' => 'თქვენ უნდრჩáƒáƒ áƒ—áƒáƒ— ბრáƒáƒ£áƒ–ერში კუკი, რáƒáƒ—რფუქცირáƒáƒ›áƒáƒ¥áƒ›áƒ”დდეს.',
+ 'captchahelp-text' => 'ვებ-გვერდები, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ—ი შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბისრდრცვლილებების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ იძლევიáƒáƒœ, მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ ეს ვიკიც, ხშირáƒáƒ“ ხდებიáƒáƒœ სპáƒáƒ›áƒ”რების სáƒáƒ›áƒ˜áƒ–ნე, რáƒáƒ›áƒšáƒ”ბიც იყენებენ სáƒáƒ˜áƒ¢áƒ–ე áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ ბმულების დáƒáƒ›áƒáƒ¢áƒ”ბის პრáƒáƒ’რáƒáƒ›áƒ”ბს.
+მიუხედáƒáƒ•áƒáƒ“ იმისáƒ, რáƒáƒ› áƒáƒ¡áƒ”თი ბმულების წáƒáƒ¨áƒšáƒ შეიძლებáƒ, ისინი მáƒáƒ˜áƒœáƒª áƒáƒ áƒ¡áƒ”ბით შემáƒáƒ¤áƒ”რხებელს წáƒáƒ áƒ›áƒáƒ“გენს.
+
+ზáƒáƒ’იერთი ქმედებისáƒáƒ¡Â â€” მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, გვერდზე áƒáƒ®áƒáƒšáƒ˜ ვებ-ბმულის დáƒáƒ›áƒáƒ¢áƒ”ბისáƒáƒ¡Â â€” თქვენ შეგიძლიáƒáƒ— იხილáƒáƒ— სპეციáƒáƒšáƒ£áƒ áƒ˜ სურáƒáƒ—ი ფერáƒáƒ“ი áƒáƒœ დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული ტექსტით დრთქვენ შემáƒáƒ’ეთáƒáƒ•áƒáƒ–ებáƒáƒ— áƒáƒ› დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული ტექსტის შეყვáƒáƒœáƒ.
+რáƒáƒ“გáƒáƒœáƒáƒª დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული ტექსტის áƒáƒ›áƒáƒªáƒœáƒáƒ‘რპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡áƒáƒ—ვის რთულ áƒáƒ›áƒáƒªáƒáƒœáƒáƒ¡ წáƒáƒ áƒ›áƒáƒáƒ“გენს, სპáƒáƒ›áƒ˜áƒ¡áƒ დრვáƒáƒœáƒ“áƒáƒšáƒ£áƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ”ბის უმრáƒáƒ•áƒšáƒ”სáƒáƒ‘ისáƒáƒ—ვის მáƒáƒ—თáƒáƒœ გáƒáƒ›áƒ™áƒšáƒáƒ•áƒ”ბრშეუძლებელი იქნებáƒ, მáƒáƒ¨áƒ˜áƒœ რáƒáƒ“ესáƒáƒª áƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბი მáƒáƒ¡ იáƒáƒšáƒáƒ“ უმკლáƒáƒ•áƒ“ებიáƒáƒœ.
+
+სáƒáƒ›áƒ¬áƒ£áƒ®áƒáƒ áƒáƒ“, მსგáƒáƒ•áƒ¡áƒ›áƒ დáƒáƒªáƒ•áƒáƒ› შეიძლებრდისკáƒáƒ›áƒ¤áƒáƒ áƒ¢áƒ˜ შეუქმნáƒáƒ¡ სუსტი მხედველáƒáƒ‘ის მქáƒáƒœáƒ” áƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბს, áƒáƒœ მáƒáƒ— ვინც იყენებს ტექსტურ áƒáƒœ კითხვáƒáƒ“ ბრáƒáƒ£áƒ–ერებს.
+áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ ჩვენ áƒáƒ  გვáƒáƒ¥áƒ•áƒ¡ áƒáƒ› შემáƒáƒ¬áƒ›áƒ”ბის ხმáƒáƒ•áƒáƒœáƒ˜ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ•áƒ.
+გთხáƒáƒ•áƒ—, თუ მსგáƒáƒ•áƒ¡áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბრხელს გიშლით სáƒáƒ˜áƒ¢áƒ–ე კეთილსინდისიერ მუშáƒáƒáƒ‘áƒáƒ¨áƒ˜, დáƒáƒ®áƒ›áƒáƒ áƒ”ბისáƒáƒ—ვის მიმáƒáƒ áƒ—ეთ [[{{MediaWiki:Grouppage-sysop}}|áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბს]].
+
+თქვენ ბრáƒáƒ£áƒ–ერში დáƒáƒáƒ­áƒ˜áƒ áƒ”თ ღილáƒáƒ™áƒ¡ „უკáƒáƒœâ€œ, რáƒáƒ—რდáƒáƒ£áƒ‘რუნდეთ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ¡.',
+ 'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ:
+# * ყველáƒáƒ¤áƒ”რი, დáƒáƒ¬áƒ§áƒ”ბული "#" სიმბáƒáƒšáƒáƒ“áƒáƒœ - ხáƒáƒ–ის ბáƒáƒšáƒáƒ›áƒ“ე ითვლებრკáƒáƒ›áƒ”ნტáƒáƒ áƒáƒ“
+# * ყველრáƒáƒ áƒáƒªáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–ი ითვლებრURL-ში კვáƒáƒœáƒ«áƒ˜áƒ¡ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სáƒáƒ®áƒ”ლის რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒœáƒáƒ—ქვáƒáƒ›áƒ˜áƒ¡ ფრáƒáƒ’მენტáƒáƒ“
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'right-skipcaptcha' => 'CAPTCHA-შემáƒáƒ¬áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ მáƒáƒ¥áƒ›áƒ”დებების შესრულებრCAPTCHA-ს გáƒáƒ•áƒšáƒ˜áƒ¡ გáƒáƒ áƒ”შე',
);
/** Kara-Kalpak (Qaraqalpaqsha)
@@ -1999,6 +2042,7 @@ Bet öñdewine qaýtw barw üşin «Artqa» degen tüýmesin basıñız.',
*/
$messages['km'] = array(
'captcha-edit' => 'ដើម្បីកែប្រែ​ទំពáŸážšáž“áŸáŸ‡ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
+ 'captcha-desc' => 'ផ្ដល់បច្ចáŸáž€áž‘áŸážŸ CAPTCHA ដើម្បីការពារពីស្ប៉ាមនិងការការទាយពាក្យសំងាážáŸ‹',
'captcha-addurl' => 'កំណែ​របស់អ្នក​មាន​ážáŸ†ážŽáž—្ជាប់ក្រៅ​ážáŸ’មី។ ដើម្បី​ជួយបង្ការ​ស្ប៉ាម​ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
'captcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសំងាážáŸ‹ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយផលបូកážáž¶áž„ក្រោមរួចបញ្ជូលចម្លើយទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
'captcha-createaccount' => 'ដើម្បី​បង្ការការបង្កើážâ€‹áž‚ណនី​ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
@@ -2121,11 +2165,11 @@ $messages['lb'] = array(
'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 jidwerengem 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, mee si sinn trotzdem eng grouss Plo.
+ '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.
-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.
+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.
-Leider kann dëst 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 esou 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.
@@ -3152,22 +3196,26 @@ $messages['sl'] = array(
'captcha-desc' => 'Nudi pristope CAPTCHA za zaÅ¡Äito proti smetju in ugibanju gesel',
'captcha-addurl' => 'VaÅ¡e urejanje vkljuÄuje nove zunanje povezave.
Zaradi zaÅ¡Äite pred samodejno navlako boste morali vpisati besede, ki se pojavijo v okencu ([[Special:Captcha/help|veÄ informacij]]):',
- 'captcha-badlogin' => 'Zaradi zaÅ¡Äite pred samodejnim ugotavljanjem gesel, prosimo reÅ¡ite preprost seÅ¡tevek spodaj in vnesite odgovor v okence ([[Special:Captcha/help|veÄ informacij]]):',
- 'captcha-createaccount' => 'Zaradi zaÅ¡Äite pred samodejnim ustvarjanjem raÄunov, prosimo reÅ¡ite preprost seÅ¡tevek spodaj in vnesite odgovor v okence ([[Special:Captcha/help|veÄ informacij]]):',
+ 'captcha-badlogin' => 'Zaradi zaÅ¡Äite pred samodejnim ugotavljanjem gesel prosimo, da reÅ¡ite preprost seÅ¡tevek spodaj in vnesete odgovor v okence ([[Special:Captcha/help|veÄ informacij]]):',
+ 'captcha-createaccount' => 'Zaradi zaÅ¡Äite pred samodejnim ustvarjanjem raÄunov prosimo, da spodaj reÅ¡ite preprost seÅ¡tevek in vnesete odgovor v okence ([[Special:Captcha/help|veÄ informacij]]):',
'captcha-createaccount-fail' => 'NapaÄna ali manjkajoÄa potrditvena koda.',
'captcha-create' => 'ÄŒe želite ustvariti stran, prosimo izraÄunajte preprost seÅ¡tevek spodaj in odgovor vpiÅ¡ite v polje ([[Special:Captcha/help|veÄ informacij]]):',
'captcha-sendemail' => 'Zaradi zaÅ¡Äite pred samodejnim smetenjem, prosimo reÅ¡ite preprost seÅ¡tevek spodaj in vnesite odgovor v okence ([[Special:Captcha/help|veÄ informacij]]):',
'captcha-sendemail-fail' => 'NapaÄna ali manjkajoÄa potrditvena koda.',
'captcha-disabledinapi' => 'To dejanje zahteva preverjanje captcha, zato ga ni mogoÄe izvesti preko API.',
'captchahelp-title' => 'PomoÄ za captcha',
- 'captchahelp-cookies-needed' => 'Morali boste omogoÄiti piÅ¡kotke v vaÅ¡em brskalnik, Äe želite, da to deluje.',
- 'captchahelp-text' => 'Spletne strani, ki omogoÄajo objavljanje Å¡irÅ¡i javnosti, kot na primer ta wiki, pogosto zlorabljajo spamerji, ki za objavo svojih povezav na mnogih straneh uporabljajo avtomatizirana orodja. ÄŒeprav se te neželene povezave da odstraniti, so precejÅ¡nja nadloga.
+ 'captchahelp-cookies-needed' => 'ÄŒe želite, da to deluje, boste morali v svojem brskalniku omogoÄiti piÅ¡kotke.',
+ 'captchahelp-text' => 'Spletne strani, ki omogoÄajo objavljanje Å¡irÅ¡i javnosti, kot na primer ta wiki, pogosto zlorabljajo spamerji, ki za objavo 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 morda wiki prikazal sliko obarvanega ali popaÄenega besedila in zahteval vpis prikazanih besed. Ker je to opravilo težko avtomatizirati, bo s tem veÄini ljudi objavljanje dovoljeno, spamerji in druge robotski napadalci pa bodo ustavljeni.
+VÄasih, zlasti pri dodajanju novih spletnih povezav na stran, vam bo wiki morda prikazal sliko obarvanega ali popaÄenega besedila in zahteval vpis prikazanih besed.
+Ker je to opravilo težko avtomatizirati, bo s tem veÄini ljudi objavljanje dovoljeno, spamerji in drugi robotski napadalci pa bodo ustavljeni.
-Ž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, se, prosimo, obrnite na [[{{MediaWiki:Grouppage-sysop}}|administratorje spletiÅ¡Äa]].
+Ž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]].
-Za vrnitev v urejevalnik izberite gumb »nazaj« vašega brskalnika.',
+Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
'captcha-addurl-whitelist' => ' #<!-- pustite to vrstico takšno, kot je --> <pre>
# Skladnja je sledeÄa:
# * Vse od znaka »#« do konca vrstice je pripomba
@@ -3352,8 +3400,12 @@ Tryck på bakåtknappen i din webbläsare för att gå tillbaks till sidredigeri
/** Tamil (தமிழà¯)
* @author Shanmugamp7
+ * @author செலà¯à®µà®¾
*/
$messages['ta'] = array(
+ 'captcha-createaccount-fail' => 'தவறான அலà¯à®²à®¤à¯ கà¯à®±à¯ˆà®¯à¯à®Ÿà¯ˆà®¯ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ கà¯à®±à®¿à®¯à¯€à®Ÿà¯.',
+ 'captcha-sendemail-fail' => 'தவறான அலà¯à®²à®¤à¯ கà¯à®±à¯ˆà®¯à¯à®Ÿà¯ˆà®¯ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ கà¯à®±à®¿à®¯à¯€à®Ÿà¯.',
+ 'captcha-disabledinapi' => 'இசà¯à®šà¯†à®¯à®±à¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®±à¯à®•à¯ காபà¯à®šà®¾ (நெளியெழà¯à®¤à¯à®¤à¯) தேவை, ஆகவே இதனை à®à®ªà®¿à® (API) வழியாக செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'captchahelp-title' => 'CAPTCHA உதவி',
);
diff --git a/extensions/ConfirmEdit/ConfirmEdit.php b/extensions/ConfirmEdit/ConfirmEdit.php
index 79bbd59f..b0e71c7b 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.php
@@ -35,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
$wgExtensionFunctions[] = 'confirmEditSetup';
-$wgExtensionCredits['other'][] = array(
+$wgExtensionCredits['antispam'][] = array(
'path' => __FILE__,
'name' => 'ConfirmEdit',
'author' => array( 'Brion Vibber', '...' ),
diff --git a/extensions/ConfirmEdit/FancyCaptcha.class.php b/extensions/ConfirmEdit/FancyCaptcha.class.php
index 3ce5670e..6da3207d 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.class.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.class.php
@@ -97,6 +97,9 @@ class FancyCaptcha extends SimpleCaptcha {
// Check which subdirs are actually present...
$dir = opendir( $directory );
+ if ( !$dir ) {
+ return false;
+ }
while ( false !== ( $entry = readdir( $dir ) ) ) {
if ( ctype_xdigit( $entry ) && strlen( $entry ) == 1 ) {
$dirs[] = $entry;
diff --git a/extensions/ConfirmEdit/FancyCaptcha.i18n.php b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
index 43114d74..8968a148 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
@@ -70,7 +70,7 @@ $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 a protecher contra o trenque automatico de parolas de paso, 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-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]]):",
@@ -428,7 +428,7 @@ $messages['eu'] = array(
* @author Wayiran
*/
$messages['fa'] = array(
- 'fancycaptcha-addurl' => 'ویرایش شما حاوی پیوندهای خارجی جدیدی است.
+ 'fancycaptcha-addurl' => 'ویرایش شما حاوی پیوند به بیرون جدیدی است.
برای Ú©Ù…Ú© به جلوگیری از هرزنگاری خودکار، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'fancycaptcha-badlogin' => 'برای Ú©Ù…Ú© به جلوگیری از سرقت خودکار کلمه عبور، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'fancycaptcha-createaccount' => 'برای Ú©Ù…Ú© به جلوگیری از ایجاد خودکار حساب کاربری، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
@@ -530,6 +530,21 @@ Zum Schutz vor automatisiertem Spamming gib des Wort in s Fäld unten yy. Druck
'fancycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):',
);
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @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-create' => 'પાનà«àª‚ બનાવવા માટે નીચે દેખાતા શબà«àª¦à«‹ ખાનામાં ટાઈપ કરો ([[Special:Captcha/help|વધૠમાહિતી]]):',
+ 'fancycaptcha-edit' => 'આ પાનામાં ફેરફાર કરવા માટે નીચે દેખાતા શબà«àª¦à«‹ ખાનામાં ટાઈપ કરો ([[Special:Captcha/help|વધૠમાહિતી]]):',
+ 'fancycaptcha-sendemail' => 'આપોઆપ થતી સà«àªªà«…મીંગથી બચાવવા માટે નીચે આપેલા શબà«àª¦ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
+);
+
/** Hebrew (עברית)
* @author Amire80
* @author Rotem Liss
@@ -656,9 +671,10 @@ $messages['it'] = array(
* @author Aotake
* @author Fryed-peach
* @author Marine-Blue
+ * @author Shirayuki
*/
$messages['ja'] = array(
- 'fancycaptcha-desc' => 'Confirm Edit 用ã®è£…飾的㪠CAPTCHA 生æˆå™¨',
+ 'fancycaptcha-desc' => 'Confirm Edit 用ã®è£…飾的㪠CAPTCHA ジェãƒãƒ¬ãƒ¼ã‚¿',
'fancycaptcha-addurl' => 'ã‚ãªãŸã®ç·¨é›†ã§æ–°ãŸãªå¤–部リンクãŒè¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚
自動化スクリプトã«ã‚ˆã‚‹ã‚¹ãƒ‘ム行為防止ã®ãŸã‚ã€ä»¥ä¸‹ã®ãƒœãƒƒã‚¯ã‚¹ã«è¡¨ç¤ºã•ã‚Œã‚‹ç¢ºèªç”¨ã®æ–‡å­—列を入力ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'fancycaptcha-badlogin' => '自動化スクリプトã«ã‚ˆã‚‹ãƒ‘スワードクラック攻撃を防止ã™ã‚‹ãŸã‚ã€ä»¥ä¸‹ã®ãƒœãƒƒã‚¯ã‚¹ã«è¡¨ç¤ºã•ã‚Œã‚‹ç¢ºèªç”¨ã®æ–‡å­—列を入力ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
@@ -1178,12 +1194,12 @@ $messages['sk'] = array(
*/
$messages['sl'] = array(
'fancycaptcha-addurl' => 'VaÅ¡e urejanje vkljuÄuje nove zunanje povezave.
-Zaradi zaÅ¡Äite pred samodejnim smetjem, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-badlogin' => 'Zaradi zaÅ¡Äite pred samodejnim ugotavljanjem gesel, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-createaccount' => 'Zaradi zaÅ¡Äite pred samodejnim ustvarjanjem raÄunov, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
+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]]):',
'fancycaptcha-create' => 'ÄŒe želite ustvariti stran, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-edit' => 'ÄŒe želite urejati stran, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-sendemail' => 'Zaradi zaÅ¡Äite pred samodejnim smetenjem, 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]]):',
);
/** Albanian (Shqip)
diff --git a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
index ec76be00..831722df 100644
--- a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
@@ -613,9 +613,10 @@ Fare clic sul pulsante 'indietro' del browser per tornare alla pagina di modific
/** Japanese (日本語)
* @author Aotake
* @author Fryed-peach
+ * @author Shirayuki
*/
$messages['ja'] = array(
- 'questycaptcha-desc' => 'Confirm Edit 用ã®è³ªå•å½¢å¼ CAPTCHA 生æˆå™¨',
+ 'questycaptcha-desc' => 'Confirm Edit 用ã®è³ªå•å½¢å¼ CAPTCHA ジェãƒãƒ¬ãƒ¼ã‚¿',
'questycaptcha-addurl' => 'ã‚ãªãŸã®ç·¨é›†ã§ã¯æ–°ãŸãªå¤–部リンクãŒè¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚自動ã§å®Ÿè¡Œã•ã‚Œã‚‹ã‚¹ãƒ‘ム行為防止ã®ãŸã‚ã€ä»¥ä¸‹ã«è¡¨ç¤ºã•ã‚Œã‚‹ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'questycaptcha-badlogin' => '自動化スクリプトã«ã‚ˆã‚‹ãƒ‘スワードクラック攻撃を防止ã™ã‚‹ãŸã‚ã€ä»¥ä¸‹ã«è¡¨ç¤ºã•ã‚Œã‚‹ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'questycaptcha-createaccount' => '自動化ã•ã‚ŒãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã‚’防止ã™ã‚‹ãŸã‚ã€ä»¥ä¸‹ã«è¡¨ç¤ºã•ã‚Œã‚‹ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
@@ -692,13 +693,13 @@ Fir d'Protectioun géint automatesche Spam ze vergréisseren, beäntwert w.e.g.
'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]]):',
- 'questycaptchahelp-text' => "Websäiten, déi et jidwerengem 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, mee si sinn trotzdem eng grouss Plo.
+ '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.
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.
-Kontaktéiert w.e.g. d'[[{{MediaWiki:Grouppage-sysop}}|Administrateure vun dësem Site]] fir Hëllef wann dëst Iech onerwaarter Wäis vu legitimen Editen ofhält.
+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.
Dréckt op den 'Zréck' Knäppche vun ärem Browser fir an d'Beaarbechtungsfënster zréckzekommen.",
);
@@ -904,6 +905,7 @@ Clique o botão 'voltar' do seu browser para voltar à página de edição.",
);
/** Brazilian Portuguese (Português do Brasil)
+ * @author 555
* @author Eduardo.mps
* @author Giro720
*/
@@ -915,15 +917,15 @@ Para proteção contra spam automático, por favor responda a questão que apare
'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]]):",
- 'questycaptchahelp-text' => "Sítios que aceitam contribuições públicas, como este wiki, são vulneráveis a spammers que utilizam ferramentas automatizadas para inserir as suas ligações em diversos locais.
-Apesar de ser possível emover tais ligações, elas são um incômodo significativo.
+ '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 novas ligações externas a uma página, a wiki pode pedir a você que responda a uma pergunta.
-Uma vez que essa é uma tarefa um 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.
+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.
-Por favor entre em contato com os [[{{MediaWiki:Grouppage-sysop}}|administradores do sítio]] para assistí-lo caso isto esteja impedindo-o de realizar contribuições legítimas.
+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.
-Pressione o botão 'voltar' de seu navegador para retornar à página de edição.\"",
+Clique no botão 'voltar' de seu navegador para retornar ao editor de páginas.",
);
/** Tarandíne (Tarandíne)
@@ -996,6 +998,28 @@ Kontaktujte prosím [[{{MediaWiki:Grouppage-sysop}}|správcov lokality]] ak potr
Späť na úpravu stránky sa vrátite kliknutím na tlaÄidlo „Späť“ vo vaÅ¡om prehliadaÄi.',
);
+/** Slovenian (SlovenÅ¡Äina)
+ * @author Dbc334
+ */
+$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]]):',
+ '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]]):',
+ '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]].
+
+Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
+);
+
/** Serbian (Cyrillic script) (‪СрпÑки (ћирилица)‬)
* @author Rancher
*/
diff --git a/extensions/ConfirmEdit/ReCaptcha.class.php b/extensions/ConfirmEdit/ReCaptcha.class.php
index b0c15fbd..a041aeb1 100644
--- a/extensions/ConfirmEdit/ReCaptcha.class.php
+++ b/extensions/ConfirmEdit/ReCaptcha.class.php
@@ -36,9 +36,12 @@ class ReCaptcha extends SimpleCaptcha {
return false;
}
+ // Compat: WebRequest::getIP is only available since MW 1.19.
+ $ip = method_exists( $wgRequest, 'getIP' ) ? $wgRequest->getIP() : wfGetIP();
+
$recaptcha_response = recaptcha_check_answer(
$wgReCaptchaPrivateKey,
- $wgRequest->getIP(),
+ $ip,
$challenge,
$response
);
diff --git a/extensions/ConfirmEdit/ReCaptcha.i18n.php b/extensions/ConfirmEdit/ReCaptcha.i18n.php
index b9d3263a..e6dd02da 100644
--- a/extensions/ConfirmEdit/ReCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/ReCaptcha.i18n.php
@@ -149,10 +149,12 @@ $messages['es'] = array(
'recaptcha-create' => 'Para protegernos de la creación automática de páginas, escribe las dos palabras que ves en el cuadro de abajo:',
);
-/** French (Français) */
+/** French (Français)
+ * @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-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-createaccount-fail' => 'Réponse de reCAPTCHA fausse ou manquante.',
@@ -242,8 +244,11 @@ $messages['it'] = array(
'recaptcha-create' => 'Per aiutarci a proteggerci dalla creazione automatica di pagine, scrivi le due parole mostrate nel riquadro sottostante:',
);
-/** Japanese (日本語) */
+/** Japanese (日本語)
+ * @author Shirayuki
+ */
$messages['ja'] = array(
+ 'recaptcha-desc' => 'Confirm Edit 用 reCAPTCHA モジュール',
'recaptcha-edit' => '自動編集スパムã‹ã‚‰ã®ä¿è­·ã®ãŸã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ï¼’ã¤ã®è¨€è‘‰ã‚’入力 ã—ã¦ãã ã•ã„。',
'recaptcha-addurl' => 'ã‚ãªãŸã®ç·¨é›†ã¯æ–°ã—ã„外部リンクをå«ã‚“ã§ã„ã¾ã™ã€‚自動スパムã‹ã‚‰ã®ä¿è­·ã®ãŸ ã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ï¼’ã¤ã®è¨€è‘‰ã‚’入力ã—ã¦ãã ã•ã„。',
'recaptcha-badpass' => '自動パスワードクラッキングã‹ã‚‰ã®ä¿è­·ã®ãŸã‚ã«ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ï¼’ ã¤ã®è¨€è‘‰ã‚’入力ã—ã¦ãã ã•ã„。',
@@ -453,14 +458,15 @@ $messages['vi'] = array(
/** Simplified Chinese (‪中文(简体)‬)
* @author Hydra
* @author Hzy980512
+ * @author Onecountry
*/
$messages['zh-hans'] = array(
- 'recaptcha-edit' => 'è¦å¸®åŠ©ä¿æŠ¤å…å—垃圾邮件自动的编辑,请键入您在下é¢çš„框中看到这两个è¯ï¼š',
- 'recaptcha-addurl' => '您的编辑包å«æ–°çš„外部链接。为了帮助防止自动垃圾邮件,请键入您在下é¢çš„框中看到这两个è¯ï¼š',
- 'recaptcha-badpass' => '为帮助防止自动密ç ç ´è§£ï¼Œè¯·é”®å…¥æ‚¨çœ‹åˆ°ä¸‹é¢çš„框中的两个字:',
- 'recaptcha-createaccount' => '为了防止自动程åºåˆ›å»ºè´¦æˆ·ï¼Œè¯·é”®å…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到的两个è¯ï¼š',
- 'recaptcha-createaccount-fail' => 'ä¸æ­£ç¡®æˆ–缺失的 reCAPTCHA 答案。',
- 'recaptcha-create' => '为了防止自动程åºåˆ›å»ºé¡µé¢ï¼Œè¯·è¾“入您在下é¢çš„框中看到的两个è¯ï¼š',
+ 'recaptcha-edit' => '为了é¿å…垃圾用户自动编辑,请键入下é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
+ 'recaptcha-addurl' => '您的编辑包å«æ–°çš„外部链接。为了é¿å…垃圾用户自动编辑,请键入下é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
+ 'recaptcha-badpass' => '为é¿å…自动密ç ç ´è§£ï¼Œè¯·é”®å…¥ä¸‹é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
+ 'recaptcha-createaccount' => '为了é¿å…创建自动垃圾用户,请键入下é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
+ 'recaptcha-createaccount-fail' => 'reCAPTCHA 答案ä¸æ­£ç¡®æˆ–未填写。',
+ 'recaptcha-create' => '为了é¿å…垃圾用户自动创建页é¢ï¼Œè¯·é”®å…¥ä¸‹é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
);
/** Traditional Chinese (‪中文(ç¹é«”)‬) */
diff --git a/extensions/Gadgets/.gitreview b/extensions/Gadgets/.gitreview
new file mode 100644
index 00000000..a1a8ead4
--- /dev/null
+++ b/extensions/Gadgets/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/Gadgets.git
+defaultbranch=master
diff --git a/extensions/Gadgets/ApiQueryGadgetCategories.php b/extensions/Gadgets/ApiQueryGadgetCategories.php
index f4ad5102..d49e000e 100644
--- a/extensions/Gadgets/ApiQueryGadgetCategories.php
+++ b/extensions/Gadgets/ApiQueryGadgetCategories.php
@@ -115,6 +115,6 @@ class ApiQueryGadgetCategories extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryGadgetCategories.php 97890 2011-09-23 06:48:37Z siebrand $';
+ return __CLASS__ . ': $Id$';
}
}
diff --git a/extensions/Gadgets/ApiQueryGadgets.php b/extensions/Gadgets/ApiQueryGadgets.php
index 2a0d4645..c6d90781 100644
--- a/extensions/Gadgets/ApiQueryGadgets.php
+++ b/extensions/Gadgets/ApiQueryGadgets.php
@@ -76,6 +76,9 @@ class ApiQueryGadgets extends ApiQueryBase {
$data = array();
$result = $this->getResult();
+ /**
+ * @var $g Gadget
+ */
foreach ( $gadgets as $g ) {
$row = array();
if ( isset( $this->props['id'] ) ) {
@@ -217,6 +220,6 @@ class ApiQueryGadgets extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryGadgets.php 100509 2011-10-22 19:09:25Z liangent $';
+ return __CLASS__ . ': $Id$';
}
}
diff --git a/extensions/Gadgets/Gadgets.i18n.php b/extensions/Gadgets/Gadgets.i18n.php
index c18ddb4d..fb5f0034 100644
--- a/extensions/Gadgets/Gadgets.i18n.php
+++ b/extensions/Gadgets/Gadgets.i18n.php
@@ -29,6 +29,7 @@ Local administrators can edit the [[MediaWiki:Gadgets-definition|definitions]] a
# for Special:Gadgets
'gadgets' => 'Gadgets',
+ 'gadgets-definition' => '', # do not translate or duplicate this message to other languages
'gadgets-title' => 'Gadgets',
'gadgets-pagetext' => "Below is a list of special gadgets users can enable on their [[Special:Preferences|preferences page]], as defined by the [[MediaWiki:Gadgets-definition|definitions]].
This overview provides easy access to the system message pages that define each gadget's description and code.",
@@ -325,7 +326,7 @@ $messages['be-tarask'] = array(
'gadgets-title' => 'ГаджÑÑ‚Ñ‹',
'gadgets-pagetext' => 'ÐіжÑй знаходзіцца ÑÑŒÐ¿Ñ–Ñ Ð³Ð°Ð´Ð¶Ñтаў, ÑÐºÑ–Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÑ– могуць уключыць у [[Special:Preferences|Ñваіх наладах]], у адпаведнаÑьці Ñа ÑьпіÑам на Ñтаронцы [[MediaWiki:Gadgets-definition|вызначÑньнÑÑž]].
ГÑÑ‚Ñ‹ ÑÑŒÐ¿Ñ–Ñ Ð´Ð°Ð·Ð²Ð°Ð»Ñе лёгка атрымаць доÑтуп да Ñтаронак ÑÑ‹ÑÑ‚Ñмных паведамленьнÑÑž, ÑÐºÑ–Ñ Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ†ÑŒ апіÑаньні Ñ– ÐºÑ€Ñ‹Ð½Ñ–Ñ‡Ð½Ñ‹Ñ ÐºÐ¾Ð´Ñ‹ гаджÑтаў.',
- 'gadgets-uses' => 'ВыкарыÑтаньне',
+ 'gadgets-uses' => 'ВыкарыÑтоўвае',
'gadgets-required-rights' => '{{PLURAL:$2|Патрабуецца права|Патрабуюцца наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹}}:
$1',
@@ -415,7 +416,7 @@ Ar sell hollek-mañ a bourchas ur moned aes d'ar pajennoù kemennadennoù reizhi
$1',
'gadgets-required-skins' => 'Hegerz gant ar {{PLURAL:$2|gwiskadur $1|gwiskadurioù da-heul : $1}}.',
'gadgets-default' => 'Gweredekaet dre ziouer evit an holl.',
- 'gadgets-export' => 'Ezporzh',
+ 'gadgets-export' => 'Ezporzhiañ',
'gadgets-export-title' => 'Ezporzhiañ bitrakoù',
'gadgets-not-found' => 'N\'eo ket bet kavet ar bitrak "$1".',
'gadgets-export-text' => 'Evit ezporzhiañ ar bitrak $1, klikañ war ar bouton "{{int:gadgets-export-download}}", enrollañ ar restr pellgarget,
@@ -661,6 +662,7 @@ Sie müssen über die notwendigen Berechtigungen auf dem für den Import vorgese
);
/** Zazaki (Zazaki)
+ * @author Erdemaslancan
* @author Xoser
*/
$messages['diq'] = array(
@@ -677,6 +679,11 @@ Adminstorê localî eşkenê xacetî [[MediaWiki:Gadgets-definition|definitions
'gadgets-pagetext' => 'Cor de yew listeyê xacetanê xasî estê ke ti eşkenî [[Special:Preferences|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-uses' => 'Karber',
+ 'gadgets-required-rights' => 'Cêrêni icab kenê {{PLURAL:$2|raşti|raşteya}}:
+
+$1',
+ 'gadgets-export' => 'Teber de',
+ 'gadgets-export-download' => 'Ron',
);
/** Lower Sorbian (Dolnoserbski)
@@ -1105,6 +1112,7 @@ Du muesch iber di notwändige Rächt uf em Wiki verfiege, wu fir dr Import vorgs
* @author Sushant savla
*/
$messages['gu'] = array(
+ 'gadgets-desc' => 'સભà«àª¯à«‹àª¨à«‡ [[Special:Preferences|મારી પસંદ]] માં પોતાના [[Special:Gadgets|CSS અને JavaScript ગેજેટà«àª¸]] પસંદ કરવા દે છે.',
'prefs-gadgets' => 'યંતà«àª°à«‹/સાધનો',
'gadgets-prefstext' => "નીચે àªàªµàª¾ વિશેષ સાધનોની યાદી નીચે આપી છે જે તમે તમારા ખાતામાં સકà«àª°àª¿àª¯ કરી શકો છો.
આ સાધનો મહદૠઅંશે જાવા સà«àª•à«àª°àª¿àªªà«àªŸ આધારિત છે માટે તે યોગà«àª¯ રીતે કામ કરે તે માટે આપના બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ જાવા સà«àª•à«àª°àª¿àªªà«àªŸ સકà«àª°àª¿àª¯ (àªàª¨à«‡àª¬àª²) કરેલી હોવી જરૂરી છે.
@@ -1125,6 +1133,10 @@ $1',
'gadgets-export' => 'નિકાસ',
'gadgets-export-title' => 'સાધન નિકાસ',
'gadgets-not-found' => 'સાધન જૂથ "$1" ન મળà«àª¯à«àª‚.',
+ 'gadgets-export-text' => '$1 યંતà«àª°àª¨à«‡ નિકાસિત કરવા, "{{int:gadgets-export-download}}" બટન પર કà«àª²àª¿àª• કરો, અને કાઉનલોડ કરેલી ફાઈલ સાચવો,
+Special:Import નિયોજીત વિકિ પર Special:Import પર જાવ અને અપલોડ કરો. અને પછી નીચેનાને MediaWiki:Gadgets-definition page પર ઉમેરો:
+<pre>$2</pre>
+નોયોજિત વિકિ પર તમને યોગà«àª¯ પરવાનગીઓ હોવી જોઈઠ(સિસà«àªŸàª® સંદેશામાં ફેરફાર કરવા સહિતની) અને ફાઈલ અપલોડ માં આયત વિકલà«àªª સકà«àª°à«€àª¯ હોવો જોઇàª',
'gadgets-export-download' => 'ડાઉનલોડ',
);
@@ -1349,28 +1361,28 @@ 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 gadyets]] idiay [[Special:Preferences|kaykayat da]]',
- 'prefs-gadgets' => 'Gadyets',
- 'gadgets-prefstext' => 'Adda dita baba ti listaan ti naipangruna a gadyets nga usaren idiay pakabilangam.
-Dagitoy a gadyets ket naibasta iti JavaScript, masapul a pakabaelan ti JavaScript idiay "pagbasabasam" tapno agbalin da.
-Saan a mabalin nga usaren dagitoy a gadyets ditoy kaykayat a panid.
-
-Dagitoy a gadyets 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 gadyets.',
- 'gadgets' => 'Gadyets',
- 'gadgets-title' => 'Gadyets',
- 'gadgets-pagetext' => 'Dita baba ket adda listaan dagiti naipangruna a gadyets a dagiti agar-aramat ket mapagbalin da idiay [[Special:Preferences|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 gadyet ken kodigo.',
+ 'gadgets-desc' => 'Mabalin dagiti agar-aramat nga agpili iti [[Special:Gadgets|CSS ken JavaScript gadgets]] idiay [[Special:Preferences|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|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-uses' => 'Usar',
'gadgets-required-rights' => 'Masapul dagiti sumaganad {{PLURAL:$2|a karbengan|dagiti karbengan}}:
$1',
'gadgets-required-skins' => 'Adda mabalin idiay {{PLURAL:$2|$1 a kudil|dagiti sumaganad a kudil: $1}}.',
- 'gadgets-default' => 'Pabaelan a kinasigud iti amin nga agar-aramat.',
+ 'gadgets-default' => 'Pakabaelan a kinasigud iti amin nga agar-aramat.',
'gadgets-export' => 'Agipan',
- 'gadgets-export-title' => 'Agipan ti gadyet',
- 'gadgets-not-found' => 'Saan a nabirukan ti "$1" a gadyet.',
- 'gadgets-export-text' => 'Ti pinag-ipan ti $1 a gadyet, aglatak idiay "{{int:gadgets-export-download}}" a buton, idulin ti inkarga nga agpababa a papeles,
+ '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:
<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.',
@@ -1387,6 +1399,7 @@ $messages['io'] = array(
/** Icelandic (Ãslenska)
* @author Jóna Þórunn
* @author Maxí
+ * @author Snævar
*/
$messages['is'] = array(
'gadgets-desc' => 'Gerir notendum kleift að velja [[Special:Gadgets|CSS og JavaScript-forrit]] í [[Special:Preferences|stillingum sínum]]',
@@ -1396,7 +1409,21 @@ $messages['is'] = array(
Forritin eru ekki hluti af MediaWiki-hugbúnaðinum heldur eru skrifuð og viðhaldin af notendum á þessu wiki-verkefni. Möppudýr geta breytt forritunum á [[MediaWiki:Gadgets-definition]] og [[Special:Gadgets]].',
'gadgets' => 'Smáforrit',
'gadgets-title' => 'Smáforrit',
+ 'gadgets-pagetext' => 'Eftirfarandi er listi yfir smáforrit sem notendur geta virkjað í [[Special:Preferences|stillingunum sínum]] og eru tilgreind á [[MediaWiki:Gadgets-definition]].
+Þessi listi veitir auðveldan aðgang að lýsingum á smáforritunum og kóðanum þeirra.',
'gadgets-uses' => 'Notar',
+ 'gadgets-required-rights' => 'Þarfnast eftifarandi {{PLURAL:$2|réttinda}}:
+
+$1',
+ 'gadgets-required-skins' => 'Aðgengileg með eftirfarandi {{PLURAL:$2|þema|$2 þemum}}: $1',
+ 'gadgets-default' => 'Virkt fyrir alla notendur.',
+ 'gadgets-export' => 'Flytja út',
+ 'gadgets-export-title' => 'Flytja út smától',
+ 'gadgets-not-found' => 'Smátólið "$1" fannst ekki.',
+ 'gadgets-export-text' => 'Til þess að flytja út smátólið $1, smelltu á "{{int:gadgets-export-download}}", vistaðu skránna,
+farðu á þann wiki sem á að flytja smátólið á, farðu á kerfisíðuna Special:Import og hladdu því inn. Síðan bættu eftirfarandi við meldinguna MediaWiki:Gadgets-definition:
+<pre>$2</pre>
+Þú verður af hafa tilskilin réttindi á þeim wiki sem á að færa smátólið á (þar með talið réttindi til að breyta meldingum) og möguleikinn að flytja inn skrár þarf að vera virkur.',
'gadgets-export-download' => 'Hlaða niður',
);
@@ -1434,24 +1461,25 @@ $1',
* @author Fryed-peach
* @author JtFuruhata
* @author Mzm5zbC3
+ * @author Shirayuki
* @author Whym
* @author é’å­å®ˆæ­Œ
*/
$messages['ja'] = array(
'gadgets-desc' => '利用者ãŒ[[Special:Gadgets|CSSã‚„JavaScriptã®ã‚«ã‚¹ã‚¿ãƒ ã‚¬ã‚¸ã‚§ãƒƒãƒˆ]]ã‚’[[Special:Preferences|{{int:preferences}}]]ã§é¸æŠžã§ãるよã†ã«ã™ã‚‹',
'prefs-gadgets' => 'ガジェット',
- 'gadgets-prefstext' => '下記ã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åˆ©ç”¨ã§ãるガジェットã®ä¸€è¦§ã§ã™ã€‚ã“れらã®ã‚¬ã‚¸ã‚§ãƒƒãƒˆã¯ã»ã¨ã‚“ã©ãŒJavaScriptベースã®ãŸã‚ã€å‹•ä½œã•ã›ã‚‹ã«ã¯ãƒ–ラウザ設定ã§JavaScriptを有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ãªãŠã€{{int:preferences}}ページ上ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。
+ 'gadgets-prefstext' => '以下ã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åˆ©ç”¨ã§ãるガジェットã®ä¸€è¦§ã§ã™ã€‚ã“れらã®ã‚¬ã‚¸ã‚§ãƒƒãƒˆã¯ã»ã¨ã‚“ã©ãŒJavaScriptベースã®ãŸã‚ã€å‹•ä½œã•ã›ã‚‹ã«ã¯ãƒ–ラウザ設定ã§JavaScriptを有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ãªãŠã€{{int:preferences}}ページ上ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。
-ã¾ãŸã€ã“れらã®ã‚¬ã‚¸ã‚§ãƒƒãƒˆã¯ MediaWiki ソフトウェアã®ä¸€éƒ¨ã§ã¯ãªãã€é–‹ç™ºã¨ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã¯é€šå¸¸ã‚¦ã‚£ã‚­æ¯Žã®åˆ©ç”¨è€…ã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¦ã„ã‚‹ã“ã¨ã«ã‚‚注æ„ã—ã¦ãã ã•ã„。管ç†è€…ã¯[[MediaWiki:Gadgets-definition|ガジェットã®å®šç¾©]]ã‚„[[Special:Gadgets|ガジェットã®èª¬æ˜Ž]]ã‹ã‚‰åˆ©ç”¨å¯èƒ½ãªã‚¬ã‚¸ã‚§ãƒƒãƒˆã‚’編集ã§ãã¾ã™ã€‚',
+ã¾ãŸã€ã“れらã®ã‚¬ã‚¸ã‚§ãƒƒãƒˆã¯ MediaWiki ソフトウェアã®ä¸€éƒ¨ã§ã¯ãªãã€é€šå¸¸ã¯ãƒ­ãƒ¼ã‚«ãƒ« ウィキã®åˆ©ç”¨è€…ãŒé–‹ç™ºã¨ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã‚’ã—ã¦ã„ã‚‹ã“ã¨ã«ã‚‚注æ„ã—ã¦ãã ã•ã„。管ç†è€…ã¯[[MediaWiki:Gadgets-definition|ガジェットã®å®šç¾©]]ã‚„[[Special:Gadgets|ガジェットã®èª¬æ˜Ž]]ã‹ã‚‰åˆ©ç”¨ã§ãるガジェットを編集ã§ãã¾ã™ã€‚',
'gadgets' => 'ガジェット',
'gadgets-title' => 'ガジェット',
'gadgets-pagetext' => '以下ã¯ã€[[MediaWiki:Gadgets-definition]] 上ã§å®šç¾©ã•ã‚ŒãŸã€åˆ©ç”¨è€…ãŒ[[Special:Preferences|{{int:preferences}}]]ã«ã¦åˆ©ç”¨å¯èƒ½ã«ã™ã‚‹ã“ã¨ãŒã§ãるガジェットã®ä¸€è¦§ã§ã™ã€‚ã“ã®ä¸€è¦§ã¯ã‚¬ã‚¸ã‚§ãƒƒãƒˆã®èª¬æ˜Žã‚„プログラムコードを定義ã—ã¦ã„るシステムメッセージページã¸ã®ç°¡å˜ãªã‚¢ã‚¯ã‚»ã‚¹ã‚‚æä¾›ã—ã¾ã™ã€‚',
'gadgets-uses' => '利用ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«',
- 'gadgets-required-rights' => '以下ã®{{PLURAL:$2|権é™}}ãŒå¿…è¦ã§ã™ã€‚
+ 'gadgets-required-rights' => '以下ã®{{PLURAL:$2|権é™}}ãŒå¿…è¦ã§ã™ï¼š
$1',
'gadgets-required-skins' => '{{PLURAL:$2|$1外装|外装:$1}}ã§åˆ©ç”¨ã¦ãã¾ã™ã€‚',
- 'gadgets-default' => 'デフォルトã§å…¨å“¡ã«æœ‰åŠ¹ã§ã™ã€‚',
+ 'gadgets-default' => '既定ã§ã¯å…¨å“¡ã«æœ‰åŠ¹ã§ã™ã€‚',
'gadgets-export' => 'エクスãƒãƒ¼ãƒˆ',
'gadgets-export-title' => 'ガジェットã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ',
'gadgets-not-found' => 'ガジェット「$1ã€ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
@@ -1499,13 +1527,31 @@ Tinjoan iki mènèhi aksès sing gampang menyang kaca-kaca pesen sistem sing nga
* @author David1010
*/
$messages['ka'] = array(
+ 'gadgets-desc' => 'მáƒáƒ®áƒ›áƒáƒ áƒ”ბლებს სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ«áƒšáƒ”ვთ [[Special:Preferences|კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜]] áƒáƒ˜áƒ áƒ©áƒ˜áƒáƒœ [[Special:Gadgets|CSS დრJavaScript გáƒáƒ¯áƒ”ტები]], რáƒáƒ›áƒ”ლთრჩáƒáƒ áƒ—ვáƒáƒª სურთ',
'prefs-gadgets' => 'გáƒáƒ¯áƒ”ტები',
+ 'gadgets-prefstext' => 'ქვემáƒáƒ— მáƒáƒªáƒ”მულირსპეციáƒáƒšáƒ£áƒ áƒ˜ გáƒáƒ¯áƒ”ტების სიáƒ, რáƒáƒ›áƒ”ლთრჩáƒáƒ áƒ—ვáƒáƒª თქვენ შეგიძლიáƒáƒ— თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡áƒáƒ—ვის.
+ეს გáƒáƒ¯áƒ”ტები უპირáƒáƒ¢áƒ”სáƒáƒ“ დáƒáƒ¤áƒ£áƒ«áƒœáƒ”ბულირJavaScript-ზე, áƒáƒ›áƒ˜áƒ¢áƒáƒ› თქვენ უნდრჩáƒáƒ áƒ—áƒáƒ— JavaScript თქვენ ბრáƒáƒ£áƒ–ერში, რáƒáƒ—რმáƒáƒ— იმუშáƒáƒáƒœ.
+გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› ეს გáƒáƒ¯áƒ”ტები áƒáƒ  მუშáƒáƒáƒ‘ენ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ გვერდზე.
+
+áƒáƒ’რეთვე გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› ეს გáƒáƒ¯áƒ”ტები áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს MediaWiki-ს ნáƒáƒ¬áƒ˜áƒšáƒ¡ დრჩვეულებრივ მუშáƒáƒ•áƒ“ებრდრნáƒáƒ áƒ©áƒ£áƒœáƒ“ებრთქვენი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ ვიკის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მიერ.
+áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბს შეუძლიáƒáƒ— შეცვáƒáƒšáƒáƒœ გáƒáƒ¯áƒ”ტების სირ[[MediaWiki:Gadgets-definition|გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბებისáƒ]] დრ[[Special:Gadgets|áƒáƒ¦áƒ¬áƒ”რების]] გვერდების დáƒáƒ®áƒ›áƒáƒ áƒ”ბით.',
'gadgets' => 'გáƒáƒ¯áƒ”ტები',
'gadgets-title' => 'გáƒáƒ¯áƒ”ტები',
+ 'gadgets-pagetext' => 'ქვემáƒáƒ— მáƒáƒªáƒ”მულირსპეციáƒáƒšáƒ£áƒ áƒ˜ გáƒáƒ¯áƒ”ტების სიáƒ, რáƒáƒ›áƒšáƒ”ბის ჩáƒáƒ áƒ—ვáƒáƒª შეუძლიáƒáƒ— მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს თáƒáƒ•áƒ˜áƒáƒœáƒ—ი [[Special:Preferences|კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ გვერდზე]], სიის შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ [[MediaWiki:Gadgets-definition|გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბების]] გვერდზე.
+ეს სირსáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ იძლევრმáƒáƒ áƒ¢áƒ˜áƒ•áƒáƒ“ მივიღáƒáƒ— სისტემური შეტყáƒáƒ‘ინებების გვერდებთáƒáƒœ წვდáƒáƒ›áƒ, რáƒáƒ›áƒšáƒ”ბიც გáƒáƒœáƒ¡áƒáƒ–ღვრáƒáƒ•áƒ”ნ გáƒáƒ¯áƒ”ტების áƒáƒ¦áƒ¬áƒ”რáƒáƒ¡áƒ დრგáƒáƒ›áƒáƒ•áƒáƒš კáƒáƒ“ებს.',
'gadgets-uses' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ',
+ 'gadgets-required-rights' => '{{PLURAL:$2|სáƒáƒ­áƒ˜áƒ áƒáƒ უფლებáƒ|სáƒáƒ­áƒ˜áƒ áƒáƒ უფლებáƒ}}:
+
+$1',
+ 'gadgets-required-skins' => 'ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ {{PLURAL:$2|გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემისáƒáƒ—ვის $1|შემდეგი გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემებისáƒáƒ—ვის: $1}}.',
+ 'gadgets-default' => 'ჩáƒáƒ áƒ—ულირყველáƒáƒ¡áƒáƒ—ვის ნáƒáƒ’ულისხმევáƒáƒ“.',
'gadgets-export' => 'ექსპáƒáƒ áƒ¢áƒ˜',
'gadgets-export-title' => 'გáƒáƒ¯áƒ”ტის ექსპáƒáƒ áƒ¢áƒ˜',
'gadgets-not-found' => 'გáƒáƒ¯áƒ”ტი "$1" ვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ.',
+ 'gadgets-export-text' => 'გáƒáƒ¯áƒ”ტი $1 ექსპáƒáƒ áƒ¢áƒ˜áƒ¡áƒáƒ—ვის, დáƒáƒáƒ­áƒ˜áƒ áƒ”თ ღილáƒáƒ™áƒ¡ „{{int:gadgets-export-download}}“, შეინáƒáƒ®áƒ”თ ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ˜,
+გáƒáƒ“áƒáƒ“ით გვერდზე Special:Import სáƒáƒ›áƒ˜áƒ–ნრვიკიში დრáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ ფáƒáƒ˜áƒšáƒ˜. შემდეგ დáƒáƒáƒ›áƒáƒ¢áƒ”თ შემდეგი ხáƒáƒ–ები MediaWiki:Gadgets-definition-ის გვერდზე:
+<pre>$2</pre>
+თქვენ უნდრგქáƒáƒœáƒ“ეთ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ უფლებრსáƒáƒ›áƒ˜áƒ–ნრვიკიში (მáƒáƒ— შáƒáƒ áƒ˜áƒ¡ სისტემური შეტყáƒáƒ‘ინებების თáƒáƒ áƒ’მნის უფლებáƒ), áƒáƒ’რეთვე სერვერზე ჩáƒáƒ áƒ—ული უნდრიყáƒáƒ¡ ფáƒáƒ˜áƒšáƒ”ბის იმპáƒáƒ áƒ¢áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები.',
'gadgets-export-download' => 'ჩáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
);
@@ -1618,11 +1664,12 @@ $messages['krc'] = array(
);
/** Colognian (Ripoarisch)
+ * @author Hoo
* @author Purodha
*/
$messages['ksh'] = array(
'gadgets-desc' => 'En iere [[Special:Preferences|Enstellunge]] künne Metmaacher [[Special:Gadgets|CSS- un JavaScrip-Gadgets]] en- un ußschallde.',
- 'prefs-gadgets' => '<i lang="en">Gadgets</i>',
+ 'prefs-gadgets' => 'Gadgets',
'gadgets-prefstext' => 'Hee is en Liss met bestemmpte <i lang="en">Gadgets</i>,
di för jede Metmaacher enjeschalldt wäde könne.
Di boue miets op Javascrip op, drom moß mer\'t em Brauser
@@ -2038,7 +2085,7 @@ Dit overzicht biedt eenvoudige toegang tot de systeemtekstpagina waar de beschri
'gadgets-required-rights' => '{{PLURAL:$2|Het volgende recht is|De volgende rechten zijn}} vereist:
$1.',
- 'gadgets-required-skins' => 'Beschikbaar op de {{PLURAL:$2|vormgeving $1|volgende vormgevingen: $1}}.',
+ 'gadgets-required-skins' => 'Beschikbaar in de {{PLURAL:$2|vormgeving $1|volgende vormgevingen: $1}}.',
'gadgets-default' => 'Standaard ingeschakeld voor iedereen.',
'gadgets-export' => 'Exporteren',
'gadgets-export-title' => 'Uitbreiding exporteren',
@@ -2223,7 +2270,7 @@ A-i é da manca d'avèj ij përmess aproprià an sla wiki ëd destinassion (comp
* @author Khalid Mahmood
*/
$messages['pnb'] = array(
- 'gadgets-desc' => 'ورتن والیاں نوں کسٹم [[Special:Gadgets|CSS and JavaScript gadgets]] چنن دیو اپنیاں [[خاص:تانگاں|تانگاں]] چ',
+ 'gadgets-desc' => 'ورتن والیاں نوں کسٹم [[Special:Gadgets|CSS and JavaScript gadgets]] چنن دیو اپنیاں [[Special:Preferences|تانگاں]] چ',
'prefs-gadgets' => 'گیجٹ',
'gadgets-prefstext' => 'تھلے خاص گیجٹ دی لسٹ اے جینون تسیں اپنے کھاتے ج چلاسکدے او۔
Ø§ÛŒÛ Ú¯ÛŒØ¬Ù¹ جاواسکرپٹ تے چلدے نیں، ایس لئی جاواسکرپٹ تواڈے Ú† چلنا چائیدا اے اوناں نوں چلان لئی۔
@@ -2233,7 +2280,7 @@ $messages['pnb'] = array(
Ù…Ú©Ú¾Û“ تبدیل کرسکدے نیں [[MediaWiki:Gadgets-definition|definitions]] تے [[Special:Gadgets|descriptions]] اپنے کول Ûیگے گیجٹاں Ú†Û”',
'gadgets' => 'گیجٹ',
'gadgets-title' => 'گیجٹ',
- 'gadgets-pagetext' => 'تھلے خاص گیجٹاں دی اک لسٹ جینوں ورتن والے اپنے [[خاص:تانگاں|تانگاں والا صÙÛ]] ØŒ جیویں Ú©Û’ [[میڈیاوکی:گیجٹ ÚˆÛŒÙینیشن|ÚˆÛŒÙینیشن]] Ú† دسیا گیا اے۔
+ 'gadgets-pagetext' => 'تھلے خاص گیجٹاں دی اک لسٹ جینوں ورتن والے اپنے [[Special:Preferences|تانگاں والا صÙÛ]] ØŒ جیویں Ú©Û’ [[MediaWiki:Gadgets-definition|ÚˆÛŒÙینیشن]] Ú† دسیا گیا اے۔
Ø§ÛŒÛ ÙˆÚ©Ú¾Ø§Ù„Û Ø§Ø³Ø§Ù† Ø±Ø§Û Ù¾Ø±Ø¨Ù†Ø¯Ú¾ Ø³Ù†ÛŒØ¹Û Ø¯Ø§ Ø±Ø§Û Ø¯Ø³Ø¯Ø§ اے جیدے Ú† Ûر گیجٹ دا Ú©Ù… کاج تے Ú©ÙˆÚˆ دتا گیا اے۔',
'gadgets-uses' => 'ورتن آلے',
'gadgets-required-rights' => '{{PLURAL:$2|$1 حق|تھلے دتے گۓ حق: $1}} دی لوڑ اے۔',
@@ -2526,23 +2573,25 @@ $1',
/** Slovak (SlovenÄina)
* @author Helix84
+ * @author Teslaton
*/
$messages['sk'] = array(
'gadgets-desc' => 'Umožňuje používateľovi vybrať [[Special:Gadgets|CSS a JavaScriptové nástroje]] vo svojich [[Special:Preferences|nastaveniach]]',
'prefs-gadgets' => 'Nástroje',
- 'gadgets-prefstext' => 'Dolu je zoznam Å¡peciálych nástrojov, ktoré môžete zapnúť v rámci svojho úÄtu.
-Tieto nástroje sú zväÄÅ¡a založené na JavaScripte, takže aby fungovali, musíte maÅ¥ v prehliadaÄi zapnutý JavaScript.
+ 'gadgets-prefstext' => 'Dolu je zoznam Å¡peciálnych nástrojov, ktoré môžete zapnúť v rámci svojho úÄtu.
+Tieto nástroje sú zväÄÅ¡a založené na JavaScripte, takže aby fungovali, musíte maÅ¥ v prehliadaÄi JavaScript zapnutý.
Nástroje nemajú vplyv na túto stránku nastavení.
-Tiež majte na pamäti, že tieto nástroje nie sú súÄasÅ¥ou MediaWiki a zvyÄajne ich vyvíjajú a udržiavajú používatelia vaÅ¡ej lokálnej wiki.
+Majte tiež na pamäti, že tieto nástroje nie sú súÄasÅ¥ou MediaWiki a zvyÄajne ich vyvíjajú a udržiavajú používatelia vaÅ¡ej lokálnej wiki.
Lokálni správcovia môžu upraviť zoznam dostupných nástrojov pomocou [[MediaWiki:Gadgets-definition|definícií]] a [[Special:Gadgets|popisov]].',
'gadgets' => 'Nástroje',
'gadgets-title' => 'Nástroje',
- 'gadgets-pagetext' => 'Dolu je zoznam Å¡peciálych nástrojov, ktoré môžu používatelia zapnúť v rámci svojho úÄtu na svojej stránke [[Special:Preferences|nastavení]]. Tento zoznam definuje stránka [[MediaWiki:Gadgets-definition]]. Tento prehľad poskytuje jednoduchý prístup k systémovým stránkam, ktoré definujú popis a kód každého z nástrojov.',
+ 'gadgets-pagetext' => 'Dolu je zoznam Å¡peciálnych nástrojov, ktoré môžu používatelia zapnúť v rámci svojho úÄtu na svojej stránke [[Special:Preferences|nastavení]]. Tento zoznam definuje stránka [[MediaWiki:Gadgets-definition]]. Tento prehľad poskytuje jednoduchý prístup k systémovým stránkam, ktoré definujú popis a kód každého z nástrojov.',
'gadgets-uses' => 'Použitia',
'gadgets-required-rights' => 'Vyžaduje nasledovné {{PLURAL:$2|právo|práva}}:
$1',
+ 'gadgets-required-skins' => 'Dostupné {{PLURAL:$2|pre tému vzhľadu $1|pre nasledovné témy vzhľadu: $1}}.',
'gadgets-default' => 'Povolené pre každého v predvolenom nastavení.',
'gadgets-export' => 'Exportovať',
'gadgets-export-title' => 'Export nástroja',
@@ -2879,6 +2928,7 @@ Dapat kang mayroong nararapat na mga pahintulot sa kapupuntahang wiki (kasama an
);
/** Turkish (Türkçe)
+ * @author Emperyan
* @author Erkan Yilmaz
* @author Joseph
* @author Karduelis
@@ -2886,15 +2936,14 @@ Dapat kang mayroong nararapat na mga pahintulot sa kapupuntahang wiki (kasama an
*/
$messages['tr'] = array(
'gadgets-desc' => 'Kullanıcıların [[Special:Preferences|tercihlerinde]] özel [[Special:Gadgets|CSS ve JavaScript gadgetlerini]] seçmelerine izin verir',
- 'prefs-gadgets' => 'Gadgetler',
- 'gadgets-prefstext' => 'Aşağıdaki, hesabınız için etkinleştirebileceğiniz özel gadgetlerin listesidir.
-Bu gadgetler çoğunlukla JavaScript temellidir, bu yüzden çalışmaları için tarayıcınızda JavaScript etkinleştirilmelidir.
-Bu gadgetlerin bu tercihler sayfasına bir etkisinin olmayacağını unutmayın.
+ 'prefs-gadgets' => 'Küçük araçlar',
+ 'gadgets-prefstext' => 'Aşağıdaki, hesabınız için etkinleştirebileceğiniz özel araçların listesidir.
+Bu küçük araçlar çoğunlukla JavaScript temellidir, bu yüzden çalışmaları için tarayıcınızda JavaScript etkinleştirilmelidir. Bu küçük araçların tercihler sayfasına bir etkisinin olmayacağını unutmayın.
-Ayrıca unutmayın ki, bu özel gadgetler MedyaViki yazılımının bir parçası değildir, ve genellikle yerel vikinizdeki kullanıcılar tarafından geliştirilip, idame ettirilirler.
-Yerel yöneticiler [[MediaWiki:Gadgets-definition|tanımları]] ve [[Special:Gadgets|açıklamaları]] kullanarak uygun gadgetleri değiştirebilirler.',
+Ayrıca unutmayın ki, bu özel araçlar MedyaViki yazılımının bir parçası değildir ve genellikle yerel vikinizdeki kullanıcılar tarafından geliştirilip, devam ettirilirler.
+Yerel yöneticiler [[MediaWiki:Gadgets-definition|tanımları]] ve [[Special:Gadgets|açıklamaları]] kullanarak uygun araçları değiştirebilirler.',
'gadgets' => 'Küçük araçlar',
- 'gadgets-title' => 'Gadgetler',
+ 'gadgets-title' => 'Küçük araçlar',
'gadgets-pagetext' => "Aşağıdaki, kullanıcıların [[Special:Preferences|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',
@@ -2987,6 +3036,7 @@ $messages['vep'] = array(
'gadgets-title' => 'Gadžetad',
'gadgets-uses' => 'Kävutab',
'gadgets-export' => 'Eksportiruida',
+ 'gadgets-export-title' => 'Gadžetan eksportiruind',
);
/** Vietnamese (Tiếng Việt)
@@ -3031,7 +3081,21 @@ $messages['vo'] = array(
* @author פוילישער
*/
$messages['yi'] = array(
+ 'gadgets-desc' => 'דערמעגלעכט ב×ניצער ×ויסקלייבן [[Special:Gadgets|CSS ×ון JavaScript דזשימדזשיקעס]] ×ין זייערע [[Special:Preferences|פרעפֿערענצן]]',
+ 'prefs-gadgets' => 'דזשימדזשיקעס',
+ 'gadgets' => 'דזשימדזשיקעס',
+ 'gadgets-title' => 'דזשימדזשיקעס',
+ 'gadgets-pagetext' => '×ונטן ××™×– × ×¨×©×™×ž×” פון דזשימדזשיקעס וו×ס ב×ניצער קענען ×קטיוויזירן דורך זיין [[Special:Preferences|פרעפֿערענצן בל×ט]], לויט ווי ×–×™×™ זענען ב×שטימט ×ין די [[MediaWiki:Gadgets-definition|דעפֿיניציעס]].
+דער ×יבערבליק גיט × ×’×¨×™× ×’×Ÿ צוטריט צו די ×¡×™×¡×˜×¢× ×‘×œ×¢×˜×¢×¨ וו×ס דעפֿינירן די שילדערונג ×ון ק×ד פון יעדן דזשימדזשיק.',
+ 'gadgets-uses' => 'ב×ניצט',
+ 'gadgets-required-rights' => 'פֿ×דערט {{PLURAL:$2|ד×ס פֿ×לגנדע רעכט|די פֿ×לגנדע רעכטן}}:
+
+$1',
+ 'gadgets-required-skins' => 'פֿ×ר×ן ביי {{PLURAL:$2|$1 דער ב×ניצער ×ייבערפֿל×ך|פֿ×לגנדע ב×ניצער ×ייבערפֿל×כן: $1}}.',
+ 'gadgets-default' => '×קטיווירט פֿ×ר ×לעמען סט×נד×רדמעסיק.',
'gadgets-export' => 'עקספ×רטירן',
+ 'gadgets-export-title' => 'דזשימדזשיק עקספ×רט',
+ 'gadgets-not-found' => 'דזשימדזשיק "$1" נישט געטר×פֿן.',
'gadgets-export-download' => '×ַר×ָפל×ָדן',
);
diff --git a/extensions/Gadgets/Gadgets_body.php b/extensions/Gadgets/Gadgets_body.php
index e606b231..4869d8c2 100644
--- a/extensions/Gadgets/Gadgets_body.php
+++ b/extensions/Gadgets/Gadgets_body.php
@@ -18,10 +18,11 @@ class GadgetHooks {
* @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->mTitle;
+ $title = $article->getTitle();
if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getText() == 'Gadgets-definition' ) {
Gadget::loadStructuredList( $text );
}
@@ -31,12 +32,18 @@ class GadgetHooks {
/**
* 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;
+ if ( !$gadgets ) {
+ return true;
+ }
- foreach ( $gadgets as $section => $thisSection ) {
+ /**
+ * @var $gadget Gadget
+ */
+ foreach ( $gadgets as $thisSection ) {
foreach ( $thisSection as $gadgetId => $gadget ) {
if ( $gadget->isOnByDefault() ) {
$defaultOptions['gadget-' . $gadgetId] = 1;
@@ -51,10 +58,10 @@ class GadgetHooks {
* 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;
}
@@ -64,6 +71,9 @@ class GadgetHooks {
foreach ( $gadgets as $section => $thisSection ) {
$available = array();
+ /**
+ * @var $gadget Gadget
+ */
foreach ( $thisSection as $gadget ) {
if ( $gadget->isAllowed( $user ) ) {
$gname = $gadget->getName();
@@ -115,14 +125,17 @@ class GadgetHooks {
/**
* 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 ) {
@@ -136,6 +149,7 @@ class GadgetHooks {
/**
* BeforePageDisplay hook handler.
* @param $out OutputPage
+ * @return bool
*/
public static function beforePageDisplay( $out ) {
global $wgUser;
@@ -152,6 +166,9 @@ class GadgetHooks {
$lb->setCaller( __METHOD__ );
$pages = array();
+ /**
+ * @var $gadget Gadget
+ */
foreach ( $gadgets as $gadget ) {
if ( $gadget->isEnabled( $wgUser ) && $gadget->isAllowed( $wgUser ) ) {
if ( $gadget->hasModule() ) {
@@ -212,6 +229,7 @@ class GadgetHooks {
/**
* UnitTestsList hook handler
* @param $files Array: List of extension test files
+ * @return bool
*/
public static function unitTestsList( $files ) {
$files[] = dirname( __FILE__ ) . '/Gadgets_tests.php';
@@ -244,7 +262,7 @@ class Gadget {
/**
* Creates an instance of this class from definition in MediaWiki:Gadgets-definition
* @param $definition String: Gadget definition
- * @return Mixed: Instance of Gadget class or false if $definition is invalid
+ * @return Gadget|bool Instance of Gadget class or false if $definition is invalid
*/
public static function newFromDefinition( $definition ) {
$m = array();
@@ -497,7 +515,7 @@ class Gadget {
}
$gadgets = array();
- foreach ( $struct as $section => $entries ) {
+ foreach ( $struct as $entries ) {
$gadgets = array_merge( $gadgets, $entries );
}
wfProfileOut( __METHOD__ );
@@ -507,13 +525,19 @@ class Gadget {
/**
* Checks whether gadget list from cache can be used.
+ * @param $gadgets array
* @return Boolean
*/
private static function isValidList( $gadgets ) {
- if ( !is_array( $gadgets ) ) return false;
+ if ( !is_array( $gadgets ) ) {
+ return false;
+ }
// Check if we have 1) array of gadgets 2) the gadgets are up to date
// One check is enough
- foreach ( $gadgets as $section => $list ) {
+ /**
+ * @var $g Gadget
+ */
+ foreach ( $gadgets as $list ) {
foreach ( $list as $g ) {
if ( !( $g instanceof Gadget ) || $g->isOutdated() ) {
return false;
@@ -574,8 +598,7 @@ class Gadget {
$m = array();
if ( preg_match( '/^==+ *([^*:\s|]+?)\s*==+\s*$/', $line, $m ) ) {
$section = $m[1];
- }
- else {
+ } else {
$gadget = self::newFromDefinition( $line );
if ( $gadget ) {
$gadgets[$section][$gadget->getName()] = $gadget;
@@ -617,6 +640,7 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
/**
* Overrides the abstract function from ResourceLoaderWikiModule class
+ * @param $context ResourceLoaderContext
* @return Array: $pages passed to __construct()
*/
protected function getPages( ResourceLoaderContext $context ) {
diff --git a/extensions/Gadgets/SpecialGadgets.php b/extensions/Gadgets/SpecialGadgets.php
index 21b2dad4..43bb279f 100644
--- a/extensions/Gadgets/SpecialGadgets.php
+++ b/extensions/Gadgets/SpecialGadgets.php
@@ -20,7 +20,7 @@ class SpecialGadgets extends SpecialPage {
/**
* Main execution function
- * @param $par Parameters passed to the page
+ * @param $par array Parameters passed to the page
*/
function execute( $par ) {
$parts = explode( '/', $par );
@@ -38,8 +38,6 @@ class SpecialGadgets extends SpecialPage {
public function showMainForm() {
global $wgOut, $wgUser, $wgLang, $wgContLang;
- $skin = $wgUser->getSkin();
-
$this->setHeaders();
$wgOut->setPagetitle( wfMsg( "gadgets-title" ) );
$wgOut->addWikiMsg( 'gadgets-pagetext' );
@@ -62,7 +60,7 @@ class SpecialGadgets extends SpecialPage {
$t = Title::makeTitleSafe( NS_MEDIAWIKI, "Gadget-section-$section$lang" );
if ( $editInterfaceAllowed ) {
$lnkTarget = $t
- ? $skin->link( $t, wfMsgHTML( 'edit' ), array(), array( 'action' => 'edit' ) )
+ ? Linker::link( $t, wfMsgHTML( 'edit' ), array(), array( 'action' => 'edit' ) )
: htmlspecialchars( $section );
$lnk = "&#160; &#160; [$lnkTarget]";
} else {
@@ -79,6 +77,9 @@ class SpecialGadgets extends SpecialPage {
$wgOut->addHTML( Html::rawElement( 'h2', array(), $ttext . $lnk ) . "\n" );
}
+ /**
+ * @var $gadget Gadget
+ */
foreach ( $entries as $gadget ) {
$t = Title::makeTitleSafe( NS_MEDIAWIKI, "Gadget-{$gadget->getName()}$lang" );
@@ -88,10 +89,10 @@ class SpecialGadgets extends SpecialPage {
$links = array();
if ( $editInterfaceAllowed ) {
- $links[] = $skin->link( $t, wfMsgHTML( 'edit' ), array(), array( 'action' => 'edit' ) );
+ $links[] = Linker::link( $t, wfMsgHTML( 'edit' ), array(), array( 'action' => 'edit' ) );
}
- $links[] = $skin->link( $this->getTitle( "export/{$gadget->getName()}" ), wfMsgHtml( 'gadgets-export' ) );
+ $links[] = Linker::link( $this->getTitle( "export/{$gadget->getName()}" ), wfMsgHtml( 'gadgets-export' ) );
$ttext = wfMsgExt( "gadget-{$gadget->getName()}", $msgOpt );
@@ -114,7 +115,7 @@ class SpecialGadgets extends SpecialPage {
continue;
}
- $lnk[] = $skin->link( $t, htmlspecialchars( $t->getText() ) );
+ $lnk[] = Linker::link( $t, htmlspecialchars( $t->getText() ) );
}
$wgOut->addHTML( $wgLang->commaList( $lnk ) );
@@ -169,6 +170,9 @@ class SpecialGadgets extends SpecialPage {
return;
}
+ /**
+ * @var $g Gadget
+ */
$g = $gadgets[$gadget];
$this->setHeaders();
$wgOut->setPagetitle( wfMsg( "gadgets-export-title" ) );
diff --git a/extensions/Nuke/.gitreview b/extensions/Nuke/.gitreview
new file mode 100644
index 00000000..c623aede
--- /dev/null
+++ b/extensions/Nuke/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/Nuke.git
+defaultbranch=master
diff --git a/extensions/Nuke/COPYING b/extensions/Nuke/COPYING
new file mode 100644
index 00000000..f1537d13
--- /dev/null
+++ b/extensions/Nuke/COPYING
@@ -0,0 +1,347 @@
+The license text below "----" applies to all files within this distribution, other
+than those that are in a directory which contains files named "LICENSE" or
+"COPYING", or a subdirectory thereof. For those files, the license text contained in
+said file overrides any license information contained in directories of smaller depth.
+Alternative licenses are typically used for software that is provided by external
+parties, and merely packaged with the Semantic MediaWiki release for convenience.
+----
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/extensions/Nuke/INSTALL b/extensions/Nuke/INSTALL
new file mode 100644
index 00000000..5b3b93b9
--- /dev/null
+++ b/extensions/Nuke/INSTALL
@@ -0,0 +1,30 @@
+These is the install file for the Nuke extension.
+
+Extension page on mediawiki.org: https://www.mediawiki.org/wiki/Extension:Nuke
+Latest version of the install file: http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/Nuke/INSTALL?view=co
+
+
+== Requirements ==
+
+Nuke requires:
+
+* MediaWiki 1.18 or above
+
+== Download ==
+
+You can get the code directly from SVN. Tags can be obtained via
+
+ svn checkout http://svn.wikimedia.org/svnroot/mediawiki/tags/extensions/Nuke/REL_version
+
+Where 'version' is the version number of the tag, such as 0_1 (see the available tags at http://svn.wikimedia.org/svnroot/mediawiki/tags/extensions/Nuke/).
+The latest code can be obtained from trunk:
+
+ svn checkout http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/Nuke/
+
+== Installation ==
+
+Once you have downloaded the code, place the ''Nuke'' directory within your MediaWiki
+'extensions' directory. Then add the following code to your [[Manual:LocalSettings.php|LocalSettings.php]] file:
+
+# Nuke
+require_once( "$IP/extensions/Nuke/Nuke.php" );
diff --git a/extensions/Nuke/Nuke.i18n.php b/extensions/Nuke/Nuke.i18n.php
index f1a63f8a..a28bcce4 100644
--- a/extensions/Nuke/Nuke.i18n.php
+++ b/extensions/Nuke/Nuke.i18n.php
@@ -37,6 +37,7 @@ Input the username or IP address to get a list of pages to delete, or leave blan
'nuke-delete-more' => '[[Special:Nuke|Delete more pages]]',
'nuke-pattern' => 'Pattern for the page name:',
'nuke-nopages-global'=> 'There are no new pages in [[Special:RecentChanges|recent changes]].',
+ 'nuke-viewchanges' => 'view changes',
);
/** Message documentation (Message documentation)
@@ -173,19 +174,19 @@ $messages['arz'] = array(
* @author Xuacu
*/
$messages['ast'] = array(
- 'nuke' => 'Esborráu masivu',
+ 'nuke' => 'Desaniciar en masa',
'action-nuke' => 'desaniciar páxines en masa',
- 'nuke-desc' => "Da a los alministradores la capacidá d'[[Special:Nuke|esborrar páxines masivamente]]",
- 'nuke-nopages' => 'Nun hai páxines nueves de [[Special:Contributions/$1|$1]] nos cambeos recientes.',
- 'nuke-list' => 'Les páxines siguientes foron creaes recién por [[Special:Contributions/$1|$1]]; escribi un comentariu y calca nel botón pa esborrales.',
- 'nuke-list-multiple' => "Les páxines darréu se crearon recientemente;
-escribi un comentariu y calca'l botón pa desaniciales.",
- 'nuke-defaultreason' => 'Esborráu masivu de páxines añadíes por $1',
- 'nuke-multiplepeople' => 'Desaniciu en masa de páxines nueves',
- 'nuke-tools' => "Esta ferramienta permite desanicios masivos de páxines añadíes recién por un usuariu o una IP determinada. Escribi'l nome d'usuariu o la IP pa obtener una llista de páxines a desaniciar, o dexa en blanco pa tolos usuarios.",
+ 'nuke-desc' => 'Da a los alministradores la capacidá de [[Special:Nuke|desaniciar páxines en masa]]',
+ 'nuke-nopages' => 'Nun hai páxines nueves de [[Special:Contributions/$1|$1]] nos cambios recientes.',
+ 'nuke-list' => '[[Special:Contributions/$1|$1]] recién creó les páxines siguientes; escribi un comentariu y calca nel botón pa desaniciales.',
+ 'nuke-list-multiple' => 'Les páxines darréu se crearon recién; escribi
+un comentariu y calca nel botón pa desaniciales.',
+ 'nuke-defaultreason' => 'Desaniciu en masa de páxines amestaes por $1',
+ 'nuke-multiplepeople' => 'Desaniciu en masa de páxines recién amestaes',
+ 'nuke-tools' => "Esta ferramienta permite desanicios en masa de páxines añadíes recién por un usuariu o una IP determinada. Escribi'l nome d'usuariu o la IP pa ver una llista de páxines a desaniciar, o dexalo balero pa tolos usuarios.",
'nuke-submit-user' => 'Dir',
'nuke-submit-delete' => 'Desaniciar seleicionaes',
- 'right-nuke' => 'Esborráu masivu de páxines',
+ 'right-nuke' => 'Desaniciu en masa de páxines',
'nuke-select' => 'Seleicionar: $1',
'nuke-userorip' => "Nome d'usuariu, direición IP o en blanco:",
'nuke-maxpages' => 'Máximu númberu de páxines:',
@@ -195,6 +196,7 @@ escribi un comentariu y calca'l botón pa desaniciales.",
'nuke-delete-more' => '[[Special:Nuke|Desaniciar más páxines]]',
'nuke-pattern' => 'Patrón pal nome de páxina:',
'nuke-nopages-global' => 'Nun hai páxines nueves nos [[Special:RecentChanges|cambios recientes]].',
+ 'nuke-viewchanges' => 'ver los cambios',
);
/** Azerbaijani (Azərbaycanca)
@@ -286,6 +288,7 @@ $messages['be-tarask'] = array(
'nuke-delete-more' => '[[Special:Nuke|МаÑавае выдаленьне Ñтаронак]]',
'nuke-pattern' => 'Узор Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ñ‹ Ñтаронкі:',
'nuke-nopages-global' => 'У [[Special:RecentChanges|апошніх зьменах]] больш нÑма новых Ñтаронак.',
+ 'nuke-viewchanges' => 'праглÑдзець зьмены',
);
/** Bulgarian (БългарÑки)
@@ -353,6 +356,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ù",
);
/** Bosnian (Bosanski)
@@ -493,7 +497,7 @@ Gib einen Kommentar bezüglich der Löschung an und klicke auf die Schaltfläche
'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.',
- 'nuke-submit-user' => 'Hole die Liste',
+ 'nuke-submit-user' => 'Abrufen',
'nuke-submit-delete' => 'Ausgewählte Seiten löschen',
'right-nuke' => 'Massenlöschung von Seiten',
'nuke-select' => 'Auswählen: $1',
@@ -505,6 +509,7 @@ Gib die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu löschenden
'nuke-delete-more' => '[[Special:Nuke|Weitere Seiten löschen]]',
'nuke-pattern' => 'Muster für den Seitennamen:',
'nuke-nopages-global' => 'Es gibt keine neuen Seiten unter den [[Special:RecentChanges|letzten Änderungen]].',
+ 'nuke-viewchanges' => 'Änderungen ansehen',
);
/** German (formal address) (‪Deutsch (Sie-Form)‬)
@@ -542,6 +547,7 @@ Silinecek sayfaların listesini almak için kullanıcı adını ya da IPyi girin
*/
$messages['dsb'] = array(
'nuke' => 'Masowe lašowanje',
+ 'action-nuke' => 'Boki z masami lašowaś',
'nuke-desc' => 'Zmóžnja admininistratoram boki [[Special:Nuke|z masami lašowaś]]',
'nuke-nopages' => 'Žedne nowe boki wót [[Special:Contributions/$1|$1]] w aktualnych změnach',
'nuke-list' => 'Slědujuce boki su se nowo napórali wót [[Special:Contributions/$1|$1]];
@@ -549,7 +555,7 @@ zapódaj komentar a klikni na tłocašk, aby je lašował.',
'nuke-list-multiple' => 'Slědujuce boki su se rowno napórali;
zapódaj komentar a klikni na tłocašk, aby je wulašował.',
'nuke-defaultreason' => 'Masowe lašowanje bokow, kótarež $1 jo pśidał.',
- 'nuke-multiplepeople' => 'někotare wužywarje',
+ 'nuke-multiplepeople' => 'Masowe wulašowanje njedawno pśidanych bokow',
'nuke-tools' => 'Toś ten rěd zmóžnja masowe lašowanja bokow, kótarež wěsty wužywaŕ abo IP jo rowno pśidał. Zapódaj wužywarske mě abo IP-adresu, aby dostał lisćinu bokow, kótarež maju se lašowaś abo wóstaj pólo prozne, aby wubrał wšych wužywarjow.',
'nuke-submit-user' => 'W pórěźe',
'nuke-submit-delete' => 'Wubrane wulašowaś',
@@ -561,6 +567,9 @@ zapódaj komentar a klikni na tłocašk, aby je wulašował.',
'nuke-deleted' => "Bok '''$1''' jo se wulašował.",
'nuke-not-deleted' => "Bok [[:$1]] '''njejo dał''' se wulašowaś.",
'nuke-delete-more' => '[[Special:Nuke|Dalšne boki lašowaś]]',
+ 'nuke-pattern' => 'Pśikład za bokowe mě:',
+ 'nuke-nopages-global' => 'Njejsu žedne nowe boki w [[Special:RecentChanges|aktualnych změnach]].',
+ 'nuke-viewchanges' => 'změny pokazaś',
);
/** Ewe (EÊ‹egbe) */
@@ -625,6 +634,7 @@ Enigu la salutnomon aÅ­ IP-adreson por akiri liston de paÄoj forigi, aÅ­ lasu Ä
/** Spanish (Español)
* @author Aleator
+ * @author Armando-Martin
* @author Crazymadlover
* @author DJ Nietzsche
* @author Dferg
@@ -658,6 +668,7 @@ Introduzca el nombre de usuario o la dirección IP para obtener la lista de pág
'nuke-delete-more' => '[[Special:Nuke|Borrar más páginas]]',
'nuke-pattern' => 'Patrón del título de la página:',
'nuke-nopages-global' => 'No hay nuevas páginas en los [[Special:RecentChanges|cambios recientes]].',
+ 'nuke-viewchanges' => 'Mostrar cambios',
);
/** Estonian (Eesti)
@@ -730,6 +741,7 @@ $messages['fa'] = array(
'nuke-delete-more' => '[[Special:Nuke|حذ٠صÙحه‌های بیشتر]]',
'nuke-pattern' => 'الگو برای نام صÙحه:',
'nuke-nopages-global' => 'هیچ صÙحهٔ جدیدی در [[Special:RecentChanges|Ùهرست تغییرات اخیر]] نیست.',
+ 'nuke-viewchanges' => 'نمایش تغییرات',
);
/** Finnish (Suomi)
@@ -775,6 +787,7 @@ Kirjoita käyttäjänimi tai IP-osoite, niin saat listan poistettavista sivuista
* @author Peter17
* @author Seb35
* @author Sherbrooke
+ * @author Wyz
* @author Zetud
*/
$messages['fr'] = array(
@@ -800,6 +813,7 @@ entrez un commentaire et cliquez sur le bouton pour les supprimer.',
'nuke-delete-more' => '[[Special:Nuke|Supprimer plus de pages]]',
'nuke-pattern' => 'Modèle pour le nom de page:',
'nuke-nopages-global' => "Il n'y a pas de nouvelle page dans [[Special:RecentChanges|changements récents]].",
+ 'nuke-viewchanges' => 'voir les modifications',
);
/** Franco-Provençal (Arpetan)
@@ -869,6 +883,7 @@ Introduza o nome do usuario ou enderezo IP para obter unha lista das páxinas pa
'nuke-delete-more' => '[[Special:Nuke|Borrar máis páxinas]]',
'nuke-pattern' => 'Patrón para o nome de páxina:',
'nuke-nopages-global' => 'Non hai páxinas novas nos [[Special:RecentChanges|cambios recentes]].',
+ 'nuke-viewchanges' => 'ollar os cambios',
);
/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
@@ -937,7 +952,7 @@ $messages['he'] = array(
'nuke-list-multiple' => '×”×“×¤×™× ×”×‘××™× × ×•×¦×¨×• ל×חרונה;
×× × ×›×ª×‘×• נימוק למחיקה ולחצו על הכפתור כדי למחוק ×ות×.',
'nuke-defaultreason' => 'הסרה מרובה של ×“×¤×™× ×©× ×•×¡×¤×• על ידי $1',
- 'nuke-multiplepeople' => '×ž×©×ª×ž×©×™× ×ž×¨×•×‘×™×',
+ 'nuke-multiplepeople' => 'מחיקה מרובה של ×“×¤×™× ×©× ×•×¡×¤×• ל×חרונה',
'nuke-tools' => 'כלי ×–×” מ×פשר מחיקות המוניות של ×“×¤×™× ×©× ×•×¡×¤×• ל×חרונה על ידי משתמש ×ו כתובת IP מסוימי×.
כתבו ×ת ×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”Ö¾IP כדי לקבל ×ת רשימת ×”×“×¤×™× ×œ×ž×—×™×§×” ×ו הש×ירו ×ת השדה ×”×–×” ריק עבור כל המשתמשי×.',
'nuke-submit-user' => 'הצגה',
@@ -952,6 +967,7 @@ $messages['he'] = array(
'nuke-delete-more' => '[[Special:Nuke|למחוק עוד דפי×]]',
'nuke-pattern' => 'תבנית עבור ×©× ×”×“×£:',
'nuke-nopages-global' => '×ין ×“×¤×™× ×—×“×©×™× ×‘[[Special:RecentChanges|×©×™× ×•×™×™× ×חרוני×]].',
+ 'nuke-viewchanges' => 'הצגת שינויי×',
);
/** Hindi (हिनà¥à¤¦à¥€)
@@ -1006,7 +1022,7 @@ $messages['hr'] = array(
*/
$messages['hsb'] = array(
'nuke' => 'Masowe wušmórnjenje',
- 'action-nuke' => 'Strony zhašeć',
+ 'action-nuke' => 'Strony z masami zhašeć',
'nuke-desc' => 'Zmóžnja administratoram [[Special:Nuke|masowe wušmórnjenje]] stronow',
'nuke-nopages' => 'W poslednich změnach njejsu nowe strony z [[Special:Contributions/$1|$1]].',
'nuke-list' => 'SlÄ›dowace strony buchu runje pÅ™ez [[Special:Contributions/$1|$1]] wutworjene; zapodaj komentar a klikÅ„ na tłóÄatko wuÅ¡mórnjenja.',
@@ -1027,6 +1043,7 @@ napisaj komentar a klikÅ„ na tłóÄatko, zo by je wuÅ¡mórnyÅ‚.',
'nuke-delete-more' => '[[Special:Nuke|Dalše strony wušmórnyć]]',
'nuke-pattern' => 'Přikład za mjeno strony:',
'nuke-nopages-global' => 'Njejsu žane nowe strony w [[Special:RecentChanges|aktualnych změnach]].',
+ 'nuke-viewchanges' => 'změny pokazać',
);
/** Hungarian (Magyar)
@@ -1082,6 +1099,7 @@ Entra le nomine de usator o adresse IP pro obtener un lista de paginas a deler,
'nuke-delete-more' => '[[Special:Nuke|Deler plus paginas]]',
'nuke-pattern' => 'Patrono pro le nomine de pagina:',
'nuke-nopages-global' => 'Il non ha nove paginas in le [[Special:RecentChanges|modificationes recente]].',
+ 'nuke-viewchanges' => 'vider modificationes',
);
/** Indonesian (Bahasa Indonesia)
@@ -1216,6 +1234,7 @@ Inserisci il nome utente o l'indirizzo IP per la lista delle pagine da cancellar
'nuke-delete-more' => '[[Special:Nuke|Cancella più 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',
);
/** Japanese (日本語)
@@ -1223,32 +1242,39 @@ Inserisci il nome utente o l'indirizzo IP per la lista delle pagine da cancellar
* @author Fievarsty
* @author Hosiryuhosi
* @author JtFuruhata
+ * @author Marine-Blue
* @author Muttley
* @author Ohgi
* @author Schu
+ * @author Shirayuki
* @author é’å­å®ˆæ­Œ
*/
$messages['ja'] = array(
'nuke' => '一括削除',
- 'nuke-desc' => '{{int:group-sysop}}ãŒãƒšãƒ¼ã‚¸ã‚’[[Special:Nuke|一括削除]]ã§ãる機能をæä¾›ã—ã¾ã™ã€‚',
- 'nuke-nopages' => '最近ã®æ›´æ–°ãƒšãƒ¼ã‚¸ã«[[Special:Contributions/$1|$1]]ãŒæ–°è¦ä½œæˆã—ãŸãƒšãƒ¼ã‚¸ã¯ã‚ã‚Šã¾ã›ã‚“。',
- 'nuke-list' => '以下ã¯ã€[[Special:Contributions/$1|$1]] ã«ã‚ˆã£ã¦æœ€è¿‘作æˆã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã®ä¸€è¦§ã§ã™ï¼›
-ç†ç”±ã‚’記入ã—ボタンを押ã™ã¨ã€ã“れらã¯å‰Šé™¤ã•ã‚Œã¾ã™ã€‚',
+ 'action-nuke' => 'ページを一括削除',
+ 'nuke-desc' => '{{int:group-sysop}}ãŒãƒšãƒ¼ã‚¸ã‚’[[Special:Nuke|一括削除]]ã™ã‚‹æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚',
+ 'nuke-nopages' => '最近ã®æ›´æ–°ã«[[Special:Contributions/$1|$1]]ãŒæ–°è¦ä½œæˆã—ãŸãƒšãƒ¼ã‚¸ã¯ã‚ã‚Šã¾ã›ã‚“。',
+ 'nuke-list' => '[[Special:Contributions/$1|$1]] ã¯æœ€è¿‘ã€ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‚’作æˆã—ã¾ã—ãŸï¼›
+ã“れらを削除ã™ã‚‹ã«ã¯ã€ç†ç”±ã‚’記入ã—ã¦ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
'nuke-list-multiple' => '最近作æˆã•ã‚ŒãŸãƒšãƒ¼ã‚¸ãŒè¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚
コメントを入力ã—ã€ãƒœã‚¿ãƒ³ã‚’押ã™ã¨ã€å‰Šé™¤ã•ã‚Œã¾ã™ã€‚',
- 'nuke-defaultreason' => '$1 ã«ã‚ˆã£ã¦åŠ ãˆã‚‰ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’一括削除',
- 'nuke-multiplepeople' => '複数ã®åˆ©ç”¨è€…',
- 'nuke-tools' => 'ã“ã®ãƒ„ールを使ã†ã¨ã€æŒ‡å®šã—ãŸåˆ©ç”¨è€…ã¾ãŸã¯IPアドレスã«ã‚ˆã£ã¦æœ€è¿‘作æˆã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’ã€ã¾ã¨ã‚ã¦å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-利用者åã¾ãŸã¯IPアドレスを入力ã™ã‚‹ã¨ã€å‰Šé™¤å¯¾è±¡ãƒšãƒ¼ã‚¸ã®ä¸€è¦§ãŒç”Ÿæˆã•ã‚Œã¾ã™ã€‚空ã«ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®åˆ©ç”¨è€…ã«ã‚ˆã‚‹ã‚‚ã®ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚',
+ 'nuke-defaultreason' => '$1ãŒè¿½åŠ ã—ãŸãƒšãƒ¼ã‚¸ã®ä¸€æ‹¬å‰Šé™¤',
+ 'nuke-multiplepeople' => '最近追加ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã®ä¸€æ‹¬å‰Šé™¤',
+ 'nuke-tools' => '指定ã—ãŸåˆ©ç”¨è€…ã¾ãŸã¯IPアドレスãŒæœ€è¿‘作æˆã—ãŸãƒšãƒ¼ã‚¸ã‚’ã€ã“ã®ãƒ„ールã§ä¸€æ‹¬å‰Šé™¤ã§ãã¾ã™ã€‚
+利用者åã¾ãŸã¯IPアドレスを入力ã™ã‚‹ã¨ã€å‰Šé™¤å¯¾è±¡ãƒšãƒ¼ã‚¸ã®ä¸€è¦§ãŒç”Ÿæˆã•ã‚Œã¾ã™ã€‚空ã«ã™ã‚‹ã¨å…¨åˆ©ç”¨è€…ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚',
'nuke-submit-user' => '一覧å–å¾—',
'nuke-submit-delete' => 'é¸æŠžã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’削除',
- 'right-nuke' => 'ページã®ä¸€æ‹¬å‰Šé™¤',
+ 'right-nuke' => 'ページを一括削除',
'nuke-select' => 'é¸æŠžï¼š$1',
'nuke-userorip' => '利用者åã€IP アドレスã¾ãŸã¯ç©ºç™½:',
- 'nuke-maxpages' => 'ページã®æœ€å¤§é‡:',
- 'nuke-editby' => '[[Special:Contributions/$1|$1]]ã«ã‚ˆã£ã¦ä½œæˆ',
- 'nuke-deleted' => "ページ '''$1''' ã¯å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚",
- 'nuke-not-deleted' => "Page [[:$1]] ã¯å‰Šé™¤'''出æ¥ã¾ã›ã‚“''' 。",
+ 'nuke-maxpages' => '最大ページ数:',
+ 'nuke-editby' => '[[Special:Contributions/$1|$1]]ãŒä½œæˆ',
+ 'nuke-deleted' => "ページ '''$1''' ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚",
+ 'nuke-not-deleted' => "ページ [[:$1]] を削除'''ã§ãã¾ã›ã‚“ã§ã—ãŸ''' 。",
+ 'nuke-delete-more' => '[[Special:Nuke|ä»–ã®ãƒšãƒ¼ã‚¸ã‚‚削除]]',
+ 'nuke-pattern' => 'ページåã®ãƒ‘ターン:',
+ 'nuke-nopages-global' => '[[Special:RecentChanges|最近ã®æ›´æ–°]]ã«ã¯æ–°ã—ã„ページã¯ã‚ã‚Šã¾ã›ã‚“。',
+ 'nuke-viewchanges' => '差分を表示',
);
/** Jutish (Jysk)
@@ -1285,6 +1311,7 @@ Lebokna jeneng panganggo utawa alamat IP kanggo olèh daftar kaca-kaca sing bisa
/** Georgian (ქáƒáƒ áƒ—ული)
* @author Alsandro
* @author BRUTE
+ * @author David1010
* @author Dawid Deutschland
* @author Sopho
*/
@@ -1301,6 +1328,10 @@ $messages['ka'] = array(
'nuke-submit-delete' => 'áƒáƒ áƒ©áƒ”ულის წáƒáƒ¨áƒšáƒ',
'right-nuke' => 'გვერდების მáƒáƒ¡áƒáƒ‘რივáƒáƒ“ წáƒáƒ¨áƒšáƒ',
'nuke-select' => 'áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ: $1',
+ 'nuke-userorip' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი, IP-მისáƒáƒ›áƒáƒ áƒ—ი (შესáƒáƒ«áƒšáƒ”ბელირცáƒáƒ áƒ˜áƒ”ლის დáƒáƒ¢áƒáƒ•áƒ”ბáƒ):',
+ 'nuke-maxpages' => 'გვერდების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ:',
+ 'nuke-deleted' => "გვერდი '''$1''' წáƒáƒ˜áƒ¨áƒáƒšáƒ.",
+ 'nuke-not-deleted' => "გვერდი [[:$1]] წáƒáƒ¨áƒšáƒ '''შეუძლებელიáƒ'''.",
);
/** Khmer (ភាសាážáŸ’មែរ)
@@ -1431,6 +1462,7 @@ Gitt w.e.g. d'IP-Adress respektiv de Benotzer n fir eng Lescht vun de Säiten ze
'nuke-delete-more' => '[[Special:Nuke|Méi Säite läschen]]',
'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',
);
/** Limburgish (Limburgs)
@@ -1523,6 +1555,7 @@ $messages['mk'] = array(
'nuke-delete-more' => '[[Special:Nuke|Избриши уште Ñтраници]]',
'nuke-pattern' => 'МоÑтра за име на Ñтраница:',
'nuke-nopages-global' => 'Ðема нови Ñтраници во [[Special:RecentChanges|Ñкорешните промени]].',
+ 'nuke-viewchanges' => 'прикажи промени',
);
/** Malayalam (മലയാളം)
@@ -1598,6 +1631,7 @@ Isikan nama pengguna atau alamat IP untuk mendapat senarai laman yang hendak dik
'nuke-delete-more' => '[[Special:Nuke|Hapuskan lebih banyak laman]]',
'nuke-pattern' => 'Pola nama laman:',
'nuke-nopages-global' => 'Tiada laman baru dalam [[Special:RecentChanges|perubahan terkini]].',
+ 'nuke-viewchanges' => 'lihat perubahan',
);
/** Maltese (Malti)
@@ -1734,6 +1768,7 @@ Voer de gebruikersnaam of het IP-adres in voor een lijst van te verwijderen pagi
'nuke-delete-more' => "[[Special:Nuke|Meer pagina's verwijderen]]",
'nuke-pattern' => 'Patroon voor de paginanaam:',
'nuke-nopages-global' => "Er zijn geen nieuwe pagina's in de [[Special:RecentChanges|recente wijzigingen]].",
+ 'nuke-viewchanges' => 'wijzigingen bekijken',
);
/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
@@ -1824,6 +1859,8 @@ $messages['pdc'] = array(
);
/** Polish (Polski)
+ * @author Beau
+ * @author BeginaFelicysym
* @author Derbeth
* @author Leinad
* @author Nux
@@ -1839,7 +1876,7 @@ $messages['pl'] = array(
'nuke-list-multiple' => 'Poniższa lista przedstawia ostatnio dodane strony.
Wpisz powód, a następnie zatwierdź usunięcie stron.',
'nuke-defaultreason' => 'Masowe usunięcie stron dodanych przez $1',
- 'nuke-multiplepeople' => 'Masowe usuwanie ostatnio dodanych stron',
+ '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-submit-user' => 'Dalej',
@@ -1852,8 +1889,9 @@ Wpisz nazwę użytkownika lub adres IP by otrzymać listę stron do usunięcia.
'nuke-deleted' => "Strona '''$1''' została usunięta.",
'nuke-not-deleted' => "Strony [[:$1]] '''nie można''' usunąć.",
'nuke-delete-more' => '[[Special:Nuke|Usuń więcej stron]]',
- 'nuke-pattern' => 'Wzór dla nazwy strony:',
+ 'nuke-pattern' => 'Wzór nazwy strony:',
'nuke-nopages-global' => 'Brak nowych stron w [[Special:RecentChanges|ostatnich zmianach]].',
+ 'nuke-viewchanges' => 'widok zmian',
);
/** Piedmontese (Piemontèis)
@@ -1884,6 +1922,7 @@ ch'a buta un coment e ch'a sgnaca ël boton për scanceleje.",
'nuke-delete-more' => "[[Special:Nuke|Scancelé pì 'd pàgine]]",
'nuke-pattern' => 'Model për ël nòm ëd pàgina:',
'nuke-nopages-global' => "A-i é pa 'd pàgine neuve an [[Special:RecentChanges|ùltime modìfiche]].",
+ 'nuke-viewchanges' => 'varda modìfiche',
);
/** Pashto (پښتو)
@@ -1931,6 +1970,7 @@ introduza um comentário e clique o botão para eliminá-las.',
);
/** Brazilian Portuguese (Português do Brasil)
+ * @author 555
* @author Carla404
* @author Eduardo.mps
* @author Giro720
@@ -1944,7 +1984,7 @@ $messages['pt-br'] = array(
'nuke-list-multiple' => 'As seguintes páginas foram criadas recentemente;
introduza um comentário e clique o botão para eliminá-las.',
'nuke-defaultreason' => 'Eliminação em massa de páginas criadas por $1',
- 'nuke-multiplepeople' => 'vários usuários',
+ 'nuke-multiplepeople' => 'Eliminação em massa de páginas recentemente adicionadas',
'nuke-tools' => 'Esta ferramenta permite a eliminação em massa de páginas criadas recentemente por um usuário ou IP específico.
Forneça o nome de usuário ou o IP para obter a lista de páginas a eliminar, ou deixe em branco para todos os usuários.',
'nuke-submit-user' => 'Ir',
@@ -2045,6 +2085,7 @@ Mitte 'u nome de l'utende o l'indirizze IP pe avè 'n'elenghe de le pàggene de
);
/** Russian (РуÑÑкий)
+ * @author DR
* @author Eugrus
* @author HalanTul
* @author KPu3uC B Poccuu
@@ -2075,6 +2116,7 @@ $messages['ru'] = array(
'nuke-delete-more' => '[[Special:Nuke|МножеÑтвенное удаление Ñтраниц]]',
'nuke-pattern' => 'Шаблон Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñтраницы:',
'nuke-nopages-global' => 'Ð’ [[Special:RecentChanges|недавних изменениÑÑ…]] нет новых Ñтраниц.',
+ 'nuke-viewchanges' => 'ВнеÑённые изменениÑ',
);
/** Rusyn (РуÑиньÑкый)
@@ -2215,6 +2257,7 @@ Vnesite uporabniško ime ali IP, da pridobite seznam strani za izbris, ali pusti
'nuke-delete-more' => '[[Special:Nuke|IzbriÅ¡i veÄ strani]]',
'nuke-pattern' => 'Vzorec imena strani:',
'nuke-nopages-global' => 'V [[Special:RecentChanges|zadnjih spremembah]] ni novih strani.',
+ 'nuke-viewchanges' => 'ogled sprememb',
);
/** Serbian (Cyrillic script) (‪СрпÑки (ћирилица)‬)
@@ -2543,6 +2586,7 @@ Hãy nhập tên thành viên hoặc địa chỉ IP để lấy danh sách các
'nuke-delete-more' => '[[Special:Nuke|Xóa thêm trang]]',
'nuke-pattern' => 'Mẫu tên trang:',
'nuke-nopages-global' => 'Không có trang mới trong các [[Special:RecentChanges|thay đổi gần đây]].',
+ 'nuke-viewchanges' => 'xem thay đổi',
);
/** Volapük (Volapük)
@@ -2592,12 +2636,13 @@ $messages['yue'] = array(
* @author PhiLiP
* @author Shinjiman
* @author Xiaomingyan
+ * @author Yfdyh000
* @author 阿pp
*/
$messages['zh-hans'] = array(
'nuke' => '大é‡åˆ é™¤',
'action-nuke' => '大é‡åˆ é™¤é¡µé¢',
- 'nuke-desc' => '让管ç†å‘˜å¯ä»¥[[Special:Nuke|大é‡åˆ é™¤]]页é¢',
+ 'nuke-desc' => '让管ç†å‘˜å¯ä»¥[[Special:Nuke|批é‡åˆ é™¤]]页é¢',
'nuke-nopages' => '在最近更改中没有[[Special:Contributions/$1|$1]]创建的新页é¢ã€‚',
'nuke-list' => '以下为[[Special:Contributions/$1|$1]]最近创建的页é¢ï¼Œè¯·å¡«å†™æ³¨é‡Šå¹¶ç‚¹å‡»æŒ‰é’®åˆ é™¤å®ƒä»¬ã€‚',
'nuke-list-multiple' => '以下为最近创建的页é¢ï¼Œè¯·å¡«å†™æ³¨é‡Šå¹¶ç‚¹å‡»æŒ‰é’®åˆ é™¤å®ƒä»¬ã€‚',
diff --git a/extensions/Nuke/Nuke.php b/extensions/Nuke/Nuke.php
index 70b31291..64ae4fe3 100644
--- a/extensions/Nuke/Nuke.php
+++ b/extensions/Nuke/Nuke.php
@@ -4,7 +4,7 @@ if( !defined( 'MEDIAWIKI' ) ) {
die( 'Not an entry point.' );
}
-define( 'Nuke_VERSION', '1.1.3' );
+define( 'Nuke_VERSION', '1.1.4' );
$dir = dirname(__FILE__) . '/';
diff --git a/extensions/Nuke/Nuke_body.php b/extensions/Nuke/Nuke_body.php
index 4fdc0809..fbe4f56e 100644
--- a/extensions/Nuke/Nuke_body.php
+++ b/extensions/Nuke/Nuke_body.php
@@ -7,14 +7,18 @@ class SpecialNuke extends SpecialPage {
}
public function execute( $par ) {
- if( !$this->userCanExecute( $this->getUser() ) ) {
+ if ( !$this->userCanExecute( $this->getUser() ) ) {
$this->displayRestrictionError();
- return;
}
-
$this->setHeaders();
$this->outputHeader();
+ if ( $this->getUser()->isBlocked() ) {
+ $block = $this->getUser()->getBlock();
+ throw new UserBlockedError( $block );
+ }
+ $this->checkReadOnly();
+
$req = $this->getRequest();
$target = trim( $req->getText( 'target', $par ) );
@@ -161,15 +165,15 @@ class SpecialNuke extends SpecialPage {
/**
* @var $title Title
*/
- list( $title, $edits, $userName ) = $info;
+ list( $title, $userName ) = $info;
$image = $title->getNamespace() == NS_IMAGE ? wfLocalFile( $title ) : false;
$thumb = $image && $image->exists() ? $image->transform( array( 'width' => 120, 'height' => 120 ), 0 ) : false;
- $changes = wfMsgExt( 'nchanges', 'parsemag', $this->getLanguage()->formatNum( $edits ) );
-
$out->addHTML( '<li>' .
- Xml::check( 'pages[]', true,
+ Xml::check(
+ 'pages[]',
+ true,
array( 'value' => $title->getPrefixedDbKey() )
) .
'&#160;' .
@@ -177,7 +181,12 @@ class SpecialNuke extends SpecialPage {
Linker::linkKnown( $title ) .
'&#160;(' .
( $userName ? wfMsgExt( 'nuke-editby', 'parseinline', $userName ) . ',&#160;' : '' ) .
- Linker::linkKnown( $title, $changes, array(), array('action' => 'history' ) ) .
+ Linker::linkKnown(
+ $title,
+ wfMsg( 'nuke-viewchanges' ),
+ array(),
+ array( 'action' => 'history' )
+ ) .
")</li>\n" );
}
@@ -203,7 +212,6 @@ class SpecialNuke extends SpecialPage {
'rc_namespace',
'rc_title',
'rc_timestamp',
- 'COUNT(*) AS edits'
);
$where = array( "(rc_new = 1) OR (rc_log_type = 'upload' AND rc_log_action = 'upload')" );
@@ -218,6 +226,7 @@ class SpecialNuke extends SpecialPage {
if ( !is_null( $pattern ) && trim( $pattern ) !== '' ) {
$where[] = 'rc_title LIKE ' . $dbr->addQuotes( $pattern );
}
+ $group = implode( ', ', $what );
$result = $dbr->select( 'recentchanges',
$what,
@@ -225,7 +234,7 @@ class SpecialNuke extends SpecialPage {
__METHOD__,
array(
'ORDER BY' => 'rc_timestamp DESC',
- 'GROUP BY' => 'rc_namespace, rc_title',
+ 'GROUP BY' => $group,
'LIMIT' => $limit
)
);
@@ -235,8 +244,7 @@ class SpecialNuke extends SpecialPage {
foreach ( $result as $row ) {
$pages[] = array(
Title::makeTitle( $row->rc_namespace, $row->rc_title ),
- $row->edits,
- $username == '' ? $row->rc_user_text : false
+ $username === '' ? $row->rc_user_text : false
);
}
@@ -255,6 +263,13 @@ class SpecialNuke extends SpecialPage {
foreach( $pages as $page ) {
$title = Title::newFromURL( $page );
$file = $title->getNamespace() == NS_FILE ? wfLocalFile( $title ) : false;
+
+ $permission_errors = $title->getUserPermissionsErrors( 'delete', $this->getUser());
+
+ if ( count( $permission_errors )) {
+ throw new PermissionsError( 'delete', $permission_errors );
+ }
+
if ( $file ) {
$oldimage = null; // Must be passed by reference
$ok = FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, false )->isOK();
@@ -262,6 +277,7 @@ class SpecialNuke extends SpecialPage {
$article = new Article( $title, 0 );
$ok = $article->doDeleteArticle( $reason );
}
+
if ( $ok ) {
$res[] = wfMsgExt( 'nuke-deleted', array( 'parseinline' ), $title->getPrefixedText() );
} else {
diff --git a/extensions/Nuke/RELEASE-NOTES b/extensions/Nuke/RELEASE-NOTES
new file mode 100644
index 00000000..56de5b99
--- /dev/null
+++ b/extensions/Nuke/RELEASE-NOTES
@@ -0,0 +1,40 @@
+These are the release notes for the Nuke extension.
+
+Extension page on mediawiki.org: https://www.mediawiki.org/wiki/Extension:Nuke
+Latest version of the release notes: http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/Nuke/RELEASE-NOTES?view=co
+
+=== Version 1.1.5 ==
+(2012-03-14)
+* (bug 35214) Special:Nuke allows deletions even when blocked
+* (bug 16985) Show number of recent edits in Special:Nuke
+* (bug 23600) Nuke extension w/PostgreSQL: column "recentchanges.rc_timestamp" should be in GROUP BY
+
+=== Version 1.1.4 ===
+(2012-2-12)
+
+* Changed "n changes" links by "view changes" links, since the edit count was broken and cannot be made to work nicely.
+
+=== Version 1.1.3 ===
+(2012-01-11)
+
+* Modernizing of some of the code to make use of newly introduced features.
+
+=== Version 1.1.2 ===
+(2011-11-10)
+
+* Implemented sql like match feature as suggested in bug 5835.
+* Removed inline JavaScript and make use of jQuery loaded via the resource loader instead.
+* Modernizing of some of the code to make use of newly introduced features.
+* Compatibility with MediaWiki < 1.18 broken.
+
+=== Version 1.1.1 ===
+(2011-10-19)
+
+* Do not show author names when filtering on a single author.
+* Added "delete more pages" link.
+* Fixed Special:Nuke/authorname behaviour.
+
+=== Version 1.1 ===
+(2011-2-14)
+
+* Added a changable limit and the option to not filter the recent changes on a single user.
diff --git a/extensions/Nuke/ext.nuke.js b/extensions/Nuke/ext.nuke.js
index c3260946..04677a68 100644
--- a/extensions/Nuke/ext.nuke.js
+++ b/extensions/Nuke/ext.nuke.js
@@ -1,5 +1,5 @@
/**
- * JavasSript for the Nuke MediaWiki extension.
+ * JavaScript for the Nuke MediaWiki extension.
* @see https://www.mediawiki.org/wiki/Extension:Nuke
*
* @licence GNU GPL v2 or later
diff --git a/extensions/ParserFunctions/.gitreview b/extensions/ParserFunctions/.gitreview
new file mode 100644
index 00000000..decb9867
--- /dev/null
+++ b/extensions/ParserFunctions/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/ParserFunctions.git
+defaultbranch=master
diff --git a/extensions/README b/extensions/README
new file mode 100644
index 00000000..ca155855
--- /dev/null
+++ b/extensions/README
@@ -0,0 +1,27 @@
+Extensions (such as the hieroglyphic module WikiHiero) are distributed
+separately. Drop them into this extensions directory and enable as
+per the extension's directions.
+
+If you are a developer, you want to fetch the extension tree in another
+directory and make a symbolic link:
+
+ mediawiki/extensions$ ln -s ../../extensions-trunk/FooBarExt
+
+The extensions are available through svn at:
+ http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/
+
+You can find documentation and additional extensions on MediaWiki website:
+ http://www.mediawiki.org/wiki/Category:Extensions
+
+
+Please note that under POSIX systems (Linux...), parent of a symbolic path
+refers to the link source, NOT to the target! You should check the env
+variable MW_INSTALL_PATH in case the extension is not in the default location.
+
+The following code snippet let you override the default path:
+
+ $IP = getenv( 'MW_INSTALL_PATH' );
+ if( $IP === false ) {
+ $IP = dirname( __FILE__ ) . '/../..';
+ }
+ require_once( "$IP/maintenance/Maintenance.php" ); // a MediaWiki core file
diff --git a/extensions/Renameuser/.gitreview b/extensions/Renameuser/.gitreview
new file mode 100644
index 00000000..0d757141
--- /dev/null
+++ b/extensions/Renameuser/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/Renameuser.git
+defaultbranch=master
diff --git a/extensions/Renameuser/Renameuser.i18n.php b/extensions/Renameuser/Renameuser.i18n.php
index 7b294d07..480d81c1 100644
--- a/extensions/Renameuser/Renameuser.i18n.php
+++ b/extensions/Renameuser/Renameuser.i18n.php
@@ -42,6 +42,7 @@ Please go back and try again.',
'renameuser-log' => '{{PLURAL:$1|1 edit|$1 edits}}. Reason: $2',
'renameuser-move-log' => 'Automatically moved page while renaming the user "[[User:$1|$1]]" to "[[User:$2|$2]]"',
+ 'action-renameuser' => 'rename users',
'right-renameuser' => 'Rename users',
'renameuser-renamed-notice' => 'This user has been renamed.
@@ -271,7 +272,7 @@ $messages['ast'] = array(
'renameuserreserve' => "Bloquiar el nome d'usuariu antiguu pa evitar usalu nun futuru",
'renameuserwarnings' => 'Avisos:',
'renameuserconfirm' => "Sí, renomar l'usuariu",
- 'renameusersubmit' => 'Executar',
+ 'renameusersubmit' => 'Unviar',
'renameusererrordoesnotexist' => 'L\'usuariu "<nowiki>$1</nowiki>" nun esiste.',
'renameusererrorexists' => 'L\'usuariu "<nowiki>$1</nowiki>" yá esiste.',
'renameusererrorinvalid' => 'El nome d\'usuariu "<nowiki>$1</nowiki>" nun ye válidu.',
@@ -281,11 +282,12 @@ $messages['ast'] = array(
'renameuser-page-exists' => 'La páxina $1 yá esiste y nun pue ser sobreescrita automáticamente.',
'renameuser-page-moved' => 'La páxina $1 treslladóse a $2.',
'renameuser-page-unmoved' => 'La páxina $1 nun pudo treslladase a $2.',
- 'renameuserlogpage' => "Rexistru de cambeos de nome d'usuariu",
- 'renameuserlogpagetext' => "Esti ye un rexistru de los cambeos de nomes d'usuariu",
+ 'renameuserlogpage' => "Rexistru de cambios de nome d'usuariu",
+ 'renameuserlogpagetext' => "Esti ye un rexistru de los cambios de nomes d'usuariu",
'renameuserlogentry' => 'renomó a $1 como "$2"',
'renameuser-log' => '{{PLURAL:$1|1 edición|$1 ediciones}}. Motivu: $2',
'renameuser-move-log' => 'Treslladóse la páxina automáticamente al renomar al usuariu "[[User:$1|$1]]" como "[[User:$2|$2]]"',
+ 'action-renameuser' => 'renomar usuarios',
'right-renameuser' => 'Renomar usuarios',
'renameuser-renamed-notice' => "Se renomó esti usuariu.
El rexistru de renomaos s'ufre darréu pa referencia.",
@@ -429,6 +431,7 @@ $messages['be-tarask'] = array(
'renameuserlogentry' => 'перайменаваў $1 у «$2»',
'renameuser-log' => '$1 {{PLURAL:$1|Ñ€Ñдагаваньне|Ñ€Ñдагаваньні|Ñ€ÑдагаваньнÑÑž}}. Прычына: $2',
'renameuser-move-log' => 'Ðўтаматычнае перайменаваньне Ñтаронкі Ñž ÑувÑзі зь перайменаваньнем рахунку ўдзельніка з «[[User:$1|$1]]» у «[[User:$2|$2]]»',
+ 'action-renameuser' => 'пераймÑноўваць удзельнікаў',
'right-renameuser' => 'перайменаваньне ўдзельнікаў',
'renameuser-renamed-notice' => '{{GENDER:$1|ГÑÑ‚Ñ‹ удзельнік быў перайменаваны|ГÑÑ‚Ð°Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–Ñ†Ð° была перайменаванаÑ}}.
Журнал перайменаваньнÑÑž удзельнікаў пададзены ніжÑй Ð´Ð»Ñ Ð´Ð°Ð²ÐµÐ´ÐºÑ–.',
@@ -538,6 +541,7 @@ $messages['br'] = array(
'renameuserlogentry' => 'en deus adanvet $1 e "$2"',
'renameuser-log' => '{{PLURAL:$1|1 degasadenn|$1 degasadenn}}. Abeg : $2',
'renameuser-move-log' => 'Pajenn dilec\'hiet ent emgefreek e-ser adenvel an implijer "[[User:$1|$1]]" e "[[User:$2|$2]]"',
+ 'action-renameuser' => 'Adenvel implijerien',
'right-renameuser' => 'Adenvel implijerien',
'renameuser-renamed-notice' => "Adanvet eo bet an implijer-mañ.
A-is emañ marilh an adanvadurioù, ma'z oc'h dedennet.",
@@ -691,6 +695,7 @@ $messages['cs'] = array(
'renameuserlogentry' => 'přejmenovává $1 na „$2“',
'renameuser-log' => '{{PLURAL:$1|1 editace|$1 editace|$1 editací}}. Zdůvodnění: $2',
'renameuser-move-log' => 'Automatický přesun při přejmenování uživatele „[[User:$1|$1]]“ na „[[User:$2|$2]]“',
+ 'action-renameuser' => 'přejmenovávat uživatele',
'right-renameuser' => 'Přejmenovávání uživatelů',
'renameuser-renamed-notice' => 'Tento uživatel byl přejmenován.
Pro přehled je níže zobrazen výpis z knihy přejmenování uživatelů.',
@@ -833,6 +838,7 @@ $messages['de'] = array(
'renameuserlogentry' => 'hat „$1“ in „$2“ umbenannt',
'renameuser-log' => '{{PLURAL:$1|Eine Bearbeitung|$1 Bearbeitungen}}. Grund: $2',
'renameuser-move-log' => 'Seite während der Benutzerkontoumbenennung von „[[User:$1|$1]]“ in „[[User:$2|$2]]“ automatisch verschoben',
+ 'action-renameuser' => 'Benutzer umzubenennen',
'right-renameuser' => 'Benutzer umbenennen',
'renameuser-renamed-notice' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde umbenannt.
Zur Information folgt das Benutzernamenänderungs-Logbuch.',
@@ -907,6 +913,7 @@ $messages['dsb'] = array(
'renameuserlogentry' => 'jo $1 do "$2" pśemjenił',
'renameuser-log' => '{{PLURAL:&1|1 změna|$1 změnje|$1 změny|$1 změnow}}. Pśicyna: $2',
'renameuser-move-log' => 'Pśi pśemjenjowanju wužywarja "[[User:$1|$1]]" do "[[User:$2|$2]]" awtomatiski pśesunjony bok',
+ 'action-renameuser' => 'wužywarjow pśemjeniś',
'right-renameuser' => 'Wužywarjow pśemjeniś',
'renameuser-renamed-notice' => 'Toś ten wužywaŕ jo se pśemjenił.
Protokol pśemjenjowanjow jo dołojce ako referenca pódany.',
@@ -995,6 +1002,7 @@ Jen la protokolo pri renomigado por via referenco.',
/** Spanish (Español)
* @author Alhen
+ * @author Armando-Martin
* @author Dferg
* @author Diego Grez
* @author Icvav
@@ -1035,6 +1043,7 @@ Por favor, vuelve atrás e inténtalo de nuevo.',
'renameuserlogentry' => 'cambió el nombre de usuario de $1 a «$2»',
'renameuser-log' => '{{PLURAL:$1|1 edición|$1 ediciones}}. Motivo: $2',
'renameuser-move-log' => 'Página trasladada automáticamente al cambiar el nombre de usuario de «[[User:$1|$1]]» a «[[User:$2|$2]]»',
+ 'action-renameuser' => 'Cambiar el nombre de los usuarios',
'right-renameuser' => 'Cambiar el nombre de los usuarios',
'renameuser-renamed-notice' => 'El nombre de este usuario ha sido modificado.
El registro de cambios de nombre de usuario se provee debajo para mayor referencia.',
@@ -1076,6 +1085,7 @@ Palun ürita uuesti.',
'renameuserlogentry' => 'nimetas kasutaja $1 ümber kasutajaks "$2"',
'renameuser-log' => '{{PLURAL:$1|1 redigeerimine|$1 redigeerimist}}. Põhjus: $2',
'renameuser-move-log' => 'Teisaldatud automaatselt, kui kasutaja "[[User:$1|$1]]" nimetati ümber kasutajaks "[[User:$2|$2]]"',
+ 'action-renameuser' => 'kasutajaid ümber nimetadata',
'right-renameuser' => 'Muuta kasutajanimesid',
'renameuser-renamed-notice' => 'Kasutaja on ümbernimetatud.
Allpool on toodud ümbernimetamislogi.',
@@ -1125,8 +1135,8 @@ $messages['fa'] = array(
'renameuserold' => 'نام کاربری کنونی:',
'renameusernew' => 'نام کاربری نو:',
'renameuserreason' => 'علت تغییر نام کاربری:',
- 'renameusermove' => 'صÙحه کاربر Ùˆ صÙحه بحث کاربر (Ùˆ زیر صÙحه‌های آن‌ها) را به نام جدید انتقال بده',
- 'renameusersuppress' => 'تغییر مسیر به نام جدید ایجاد نکن',
+ 'renameusermove' => 'صÙحه‌های کاربری Ùˆ بحث (به همراه زیر صÙحه‌هایشان) به نام جدید منتقل Ú©Ù†',
+ 'renameusersuppress' => 'تغییرمسیر به نام جدید ایجاد نکن',
'renameuserreserve' => 'نام کاربری قبلی را در مقابل استÙادهٔ مجدد Ø­Ùظ Ú©Ù†',
'renameuserwarnings' => 'هشدار:',
'renameuserconfirm' => 'بله، نام کاربر را تغییر بده',
@@ -1221,6 +1231,8 @@ Loggurin fyri navnabroytingina er givin niðanfyri fyri keldu ávísing.',
/** French (Français)
* @author Cedric31
* @author Crochet.david
+ * @author DavidL
+ * @author Gomoko
* @author Grondin
* @author Hégésippe Cormier
* @author IAlex
@@ -1257,7 +1269,8 @@ $messages['fr'] = array(
'renameuserlogentry' => 'a renommé « $1 » en « $2 »',
'renameuser-log' => '$1 modification{{PLURAL:$1||s}}. Motif : $2',
'renameuser-move-log' => 'Page déplacée automatiquement lorsque l’utilisateur « [[User:$1|$1]] » est devenu « [[User:$2|$2]] »',
- 'right-renameuser' => 'Renommer des utilisateurs',
+ 'action-renameuser' => 'renommer les utilisateurs',
+ 'right-renameuser' => 'Renommer les utilisateurs',
'renameuser-renamed-notice' => 'Cet utilisateur a été renommé.
Le journal des renommages est disponible ci-dessous pour information.',
);
@@ -1389,6 +1402,7 @@ Volva atrás e inténteo de novo.',
'renameuserlogentry' => 'mudou o nome de "$1" a "$2"',
'renameuser-log' => '{{PLURAL:$1|1 edición|$1 edicións}}. Razón: $2',
'renameuser-move-log' => 'A páxina moveuse automaticamente cando se mudou o nome do usuario "[[User:$1|$1]]" a "[[User:$2|$2]]"',
+ 'action-renameuser' => 'renomear usuarios',
'right-renameuser' => 'Renomear usuarios',
'renameuser-renamed-notice' => 'Este usuario foi renomeado.
Velaquí está o rexistro de cambios de nome de usuario por se quere consultalo.',
@@ -1433,6 +1447,7 @@ $messages['gsw'] = array(
'renameuserlogentry' => 'het „$1“ in „$2“ umgnännt',
'renameuser-log' => '{{PLURAL:$1|1 Bearbeitig|$1 Bearbeitige}}. Grund: $2',
'renameuser-move-log' => 'dur d Umnännig vu „[[User:$1|$1]]“ noch „[[User:$2|$2]]“ automatisch verschobeni Syte',
+ 'action-renameuser' => 'Benutzer umznänne',
'right-renameuser' => 'Benutzer umnänne',
'renameuser-renamed-notice' => 'Dää Benutzer isch umgnännt wore.
S Umnännigs-Logbuech wird do unte ufgfiert as Quälle.',
@@ -1446,6 +1461,7 @@ $messages['gu'] = array(
'renameuser' => 'સભà«àª¯àª¨àª¾àª® બદલો',
'renameuser-linkoncontribs' => 'સભà«àª¯àª¨àª¾àª® બદલો',
'renameuser-linkoncontribs-text' => 'આ સભà«àª¯àª¨à«àª‚ નામ બદલો',
+ 'renameuser-desc' => "સભà«àª¯àª¨à«àª‚ નામાંતરણ કરવા માટે [[Special:Renameuser|special page]] ઉમેરે છે (''renameuser'' હકà«àª• જરૂરી)",
'renameuserold' => 'હાલનà«àª‚ સભà«àª¯àª¨àª¾àª®:',
'renameusernew' => 'નવà«àª‚ સભà«àª¯àª¨àª¾àª®:',
'renameuserreason' => 'નામ બદલવાનà«àª‚ કારણ:',
@@ -1469,6 +1485,7 @@ $messages['gu'] = array(
'renameuserlogpagetext' => 'સભà«àª¯àª¨àª¾ દà«àªµàª¾àª°àª¾ થયેલા ફેરફરની આ સંપાદન યાદિ છે .',
'renameuserlogentry' => '$1 નà«àª‚ નામ "$2" કરà«àª¯à«àª‚',
'renameuser-log' => '{{PLURAL:$1|૧ ફેરફાર|$1 ફેરફારો}}. કારણ: $2',
+ 'renameuser-move-log' => 'સભà«àª¯ "[[User:$1|$1]]" થી "[[User:$2|$2]]" નામ બદલતી વખતે આપમેળે પાનà«àª‚ ખસેડà«àª¯à«àª‚',
'right-renameuser' => 'સભà«àª¯à«‹àª¨àª¾ નામ બદલો',
'renameuser-renamed-notice' => 'આ સભà«àª¯àª¨à«àª‚ નામ પરિવરà«àª¤àª¨ થયà«àª‚ છે.
નામ પરિવરà«àª¤àª¨ લોગ તમારા સંદરà«àª­ માટે અહીં આપેલ છે',
@@ -1478,6 +1495,7 @@ $messages['gu'] = array(
* @author Amire80
* @author Ofekalef
* @author Rotem Liss
+ * @author Rotemliss
* @author YaronSh
*/
$messages['he'] = array(
@@ -1501,13 +1519,14 @@ $messages['he'] = array(
'renameuser-error-same-user' => '××™× ×›× ×™×›×•×œ×™× ×œ×©× ×•×ª ×ת ×©× ×”×ž×©×ª×ž×© ×œ×©× ×–×”×” לשמו הישן.',
'renameusersuccess' => '×©× ×”×ž×©×ª×ž×© של "<nowiki>$1</nowiki>" שונה ל"<nowiki>$2</nowiki>".',
'renameuser-page-exists' => 'הדף $1 כבר ×§×™×™× ×•×œ× × ×™×ª×Ÿ לדרוס ×ותו ×וטומטית.',
- 'renameuser-page-moved' => 'הדף $1 הועבר ל$2.',
+ 'renameuser-page-moved' => 'הדף $1 הועבר ×œ×©× $2.',
'renameuser-page-unmoved' => '×œ× × ×™×ª×Ÿ ×”×™×” להעביר ×ת הדף $1 ל$2.',
'renameuserlogpage' => 'יומן שינויי שמות משתמש',
'renameuserlogpagetext' => 'זהו יומן ×”×©×™× ×•×™×™× ×‘×©×ž×•×ª המשתמשי×.',
'renameuserlogentry' => 'שינה ×ת ×©× ×”×ž×©×ª×ž×© "$1" ל־"$2"',
'renameuser-log' => '{{PLURAL:$1|עריכה ×חת|$1 עריכות}}. סיבה: $2',
'renameuser-move-log' => 'העברה ×וטומטית בעקבות שינוי ×©× ×”×ž×©×ª×ž×© "[[User:$1|$1]]" ל־"[[User:$2|$2]]"',
+ 'action-renameuser' => 'לשנות שמות משתמש',
'right-renameuser' => 'שינוי שמות משתמש',
'renameuser-renamed-notice' => '×©× ×”×ž×©×ª×ž×© ×”×–×” שונה.
יומן שינויי שמות המשתמש מוצג להלן.',
@@ -1655,6 +1674,7 @@ $messages['hsb'] = array(
'renameuserlogentry' => 'je $1 do "$2" přemjenował',
'renameuser-log' => '{{PLURAL:$1|1 zmÄ›na|$1 zmÄ›nje|$1 zmÄ›ny|$1 zmÄ›now}}. PÅ™iÄina: $2',
'renameuser-move-log' => 'Přez přemjenowanje wužiwarja „[[User:$1|$1]]“ na „[[User:$2|$2]]“ awtomatisce přesunjena strona.',
+ 'action-renameuser' => 'wužiwarjow přemjenować',
'right-renameuser' => 'Wužiwarjow přemjenować',
'renameuser-renamed-notice' => 'Tutón wužiwar je so přemjenował.
Protokol přemjenowanjow je deleka jako referenca podaty.',
@@ -1730,6 +1750,7 @@ Per favor retorna e reproba.',
'renameuserlogentry' => 'renominava $1 verso "$2"',
'renameuser-log' => '{{PLURAL:$1|1 modification|$1 modificationes}}. Motivo: $2',
'renameuser-move-log' => 'Le pagina ha essite automaticamente renominate con le renomination del usator "[[User:$1|$1]]" a "[[User:$2|$2]]"',
+ 'action-renameuser' => 'renominar usatores',
'right-renameuser' => 'Renominar usatores',
'renameuser-renamed-notice' => 'Iste usator ha essite renominate.
Le registro de renominationes es providite ci infra pro referentia.',
@@ -1889,6 +1910,7 @@ Síðasta færsla notandans úr skrá yfir nafnabreytingar notenda er sýnd hér
/** Italian (Italiano)
* @author .anaconda
+ * @author Beta16
* @author BrokenArrow
* @author Darth Kule
* @author Gianfranco
@@ -1924,6 +1946,7 @@ $messages['it'] = array(
'renameuserlogentry' => 'ha rinominato $1 in "$2"',
'renameuser-log' => 'Che ha {{PLURAL:$1|un contributo|$1 contributi}}. Motivo: $2',
'renameuser-move-log' => 'Spostamento automatico della pagina - utente rinominato da "[[User:$1|$1]]" a "[[User:$2|$2]]"',
+ 'action-renameuser' => 'rinominare gli utenti',
'right-renameuser' => 'Rinomina gli utenti',
'renameuser-renamed-notice' => 'Questo utente è stato rinominato.
Il registro delle rinomine è riportato di seguito per informazione.',
@@ -1936,20 +1959,21 @@ Il registro delle rinomine è riportato di seguito per informazione.',
* @author Hosiryuhosi
* @author Marine-Blue
* @author Ohgi
+ * @author Shirayuki
* @author Suisui
* @author é’å­å®ˆæ­Œ
*/
$messages['ja'] = array(
'renameuser' => '利用者åã®å¤‰æ›´',
'renameuser-linkoncontribs' => '利用者å変更',
- 'renameuser-linkoncontribs-text' => 'ã“ã®åˆ©ç”¨è€…ã®åå‰ã‚’変更ã™ã‚‹',
+ 'renameuser-linkoncontribs-text' => 'ã“ã®åˆ©ç”¨è€…ã®åå‰ã‚’変更',
'renameuser-desc' => '利用者å変更ã®ãŸã‚ã®[[Special:Renameuser|特別ページ]]を追加ã™ã‚‹(renameuser権é™ãŒå¿…è¦)',
'renameuserold' => 'ç¾åœ¨ã®åˆ©ç”¨è€…å:',
'renameusernew' => 'æ–°ã—ã„利用者å:',
'renameuserreason' => '変更ç†ç”±:',
- 'renameusermove' => '利用者ページã¨ä¼šè©±ãƒšãƒ¼ã‚¸(ãŠã‚ˆã³ãれらã®ã‚µãƒ–ページ)ã‚’æ–°ã—ã„åå‰ã«ç§»å‹•ã™ã‚‹',
+ 'renameusermove' => '利用者ページã¨ä¼šè©±ãƒšãƒ¼ã‚¸ï¼ˆãŠã‚ˆã³ãれらã®ã‚µãƒ–ページ)を新ã—ã„åå‰ã«ç§»å‹•',
'renameusersuppress' => 'æ–°ã—ã„åå‰ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’作æˆã—ãªã„',
- 'renameuserreserve' => '旧利用者åã®ä»Šå¾Œã®ä½¿ç”¨ã‚’ブロックã™ã‚‹',
+ 'renameuserreserve' => '旧利用者åã®ä»Šå¾Œã®ä½¿ç”¨ã‚’ブロック',
'renameuserwarnings' => '警告:',
'renameuserconfirm' => 'ã¯ã„ã€åˆ©ç”¨è€…åを変更ã—ã¾ã™',
'renameusersubmit' => '変更',
@@ -1967,7 +1991,8 @@ $messages['ja'] = array(
'renameuserlogentry' => '$1 を「$2ã€ã¸åˆ©ç”¨è€…å変更ã—ã¾ã—ãŸ',
'renameuser-log' => '{{PLURAL:$1|投稿数}}$1回。ç†ç”±: $2',
'renameuser-move-log' => 'åå‰ã®å¤‰æ›´ã¨å…±ã«ã€Œ[[User:$1|$1]]ã€ã‚’「[[User:$2|$2]]ã€ã¸è‡ªå‹•çš„ã«ç§»å‹•ã—ã¾ã—ãŸ',
- 'right-renameuser' => '利用者å変更',
+ 'action-renameuser' => '利用者åを変更',
+ 'right-renameuser' => '利用者åを変更',
'renameuser-renamed-notice' => 'ã“ã®åˆ©ç”¨è€…ã¯æ”¹åã—ã¾ã—ãŸã€‚å‚考ã®ãŸã‚ã€æ”¹å記録を以下ã«è¼‰ã›ã¾ã™ã€‚',
);
@@ -2034,14 +2059,17 @@ Mangga balènana lan nyoba manèh.',
/** Georgian (ქáƒáƒ áƒ—ული)
* @author BRUTE
+ * @author David1010
* @author Dawid Deutschland
* @author Malafaya
+ * @author Nodar Kherkheulidze
* @author Sopho
*/
$messages['ka'] = array(
'renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ›áƒáƒªáƒ•áƒšáƒ',
'renameuser-linkoncontribs' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
'renameuser-linkoncontribs-text' => 'áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
+ 'renameuser-desc' => 'áƒáƒ›áƒáƒ¢áƒ”ბს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის [[Special:Renameuser|შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡]] (სáƒáƒ­áƒ˜áƒ áƒáƒ უფლებრ<code>renameuser</code>)',
'renameuserold' => 'áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
'renameusernew' => 'áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
'renameuserreason' => 'სáƒáƒ®áƒ”ლის შეცვლის მიზეზი:',
@@ -2051,20 +2079,21 @@ $messages['ka'] = array(
'renameuserwarnings' => 'გáƒáƒ¤áƒ áƒ—ხილებები:',
'renameuserconfirm' => 'დიáƒáƒ®, მსურს სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
'renameusersubmit' => 'გáƒáƒ’ზáƒáƒ•áƒœáƒ',
- 'renameusererrordoesnotexist' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი "<nowiki>$1</nowiki>" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს',
+ '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>"-ით',
+ 'renameusersuccess' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი — „<nowiki>$1</nowiki>“, შეიცვáƒáƒšáƒ „<nowiki>$2</nowiki>-ით“',
'renameuser-page-exists' => 'გვერდი $1 უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს დრმისი áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ შენáƒáƒªáƒ•áƒšáƒ”ბრშეუძლებელიáƒ.',
'renameuser-page-moved' => 'გვერდი $1 გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ $2-ზე.',
'renameuser-page-unmoved' => 'áƒáƒ  მáƒáƒ®áƒ”რხდრგვერდის $1 გáƒáƒ“áƒáƒ¢áƒáƒœáƒ $2-ზე.',
'renameuserlogpage' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
'renameuserlogpagetext' => 'ეს áƒáƒ áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜, სáƒáƒ“áƒáƒª áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ£áƒšáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლთრცვლილებები',
- 'renameuserlogentry' => 'სáƒáƒ®áƒ”ლი გáƒáƒ“áƒáƒ”რქვრ$1-ს "$2"-ზე',
+ 'renameuserlogentry' => 'სáƒáƒ®áƒ”ლი გáƒáƒ“áƒáƒ”რქვრ$1-ს „$2-ზე“',
'renameuser-log' => '$1 რედáƒáƒ¥áƒªáƒ˜áƒ. მიზეზი: $2',
- 'renameuser-move-log' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნრგáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ გვერდი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის "[[User:$1|$1]]" სáƒáƒ®áƒ”ლის შეცვლისáƒáƒ¡ "[[User:$2|$2]]-ით"',
+ 'renameuser-move-log' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნრგáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ გვერდი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის „[[User:$1|$1]]“ სáƒáƒ®áƒ”ლის შეცვლისáƒáƒ¡ „[[User:$2|$2]]-ით“',
+ 'action-renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
'right-renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
'renameuser-renamed-notice' => 'áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს სáƒáƒ®áƒ”ლი გáƒáƒ“áƒáƒ”რქვáƒ.
ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის ჟურნáƒáƒšáƒ˜.',
@@ -2221,6 +2250,7 @@ $messages['ko'] = array(
'renameuserlogentry' => '$1ì—ì„œ ‘$2’(으)ë¡œ ì´ë¦„ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
'renameuser-log' => '기여 $1ê±´. ì´ìœ : $2',
'renameuser-move-log' => '‘[[User:$1|$1]]’ 사용ìžë¥¼ ‘[[User:$2|$2]]’(으)ë¡œ 바꾸면서 문서를 ìžë™ìœ¼ë¡œ ì´ë™í•¨',
+ 'action-renameuser' => '계정 ì´ë¦„ì„ ë³€ê²½í• ',
'right-renameuser' => '계정 ì´ë¦„ 변경',
'renameuser-renamed-notice' => 'ì´ ì‚¬ìš©ìžì˜ 계정 ì´ë¦„ì´ ë³€ê²½ë˜ì—ˆìŠµë‹ˆë‹¤.
ì•„ëž˜ì˜ ì´ë¦„ 변경 기ë¡ì„ 참고하십시오.',
@@ -2348,6 +2378,7 @@ Gitt w.e.g. zréck a versicht et nach eng Kéier.',
'renameuserlogentry' => 'huet de Benotzer $1 op "$2" ëmbenannt',
'renameuser-log' => '{{PLURAL:$1|1 Ännerung|$1 Ännerungen}}. Grond: $2',
'renameuser-move-log' => 'Duerch d\'Réckele vum Benotzer "[[User:$1|$1]]" op "[[User:$2|$2]]" goufen déi folgend Säiten automatesch matgeréckelt:',
+ 'action-renameuser' => 'Benotzer ëmbenennen',
'right-renameuser' => 'Benotzer ëmbenennen',
'renameuser-renamed-notice' => "Dëse Benotzer gouf ëmbenannt.
D'Logbuch mat den Ëmbenunngen ass hei ënnendrënner.",
@@ -2387,6 +2418,7 @@ $messages['li'] = array(
'renameuserlogentry' => 'haet $1 hernömp nao "$2"',
'renameuser-log' => '{{PLURAL:$1|1 bewerking|$1 bewerkinge}}. Ree: $2',
'renameuser-move-log' => 'Automatisch hernömp bie \'t wiezige van gebroeker "[[User:$1|$1]]" nao "[[User:$2|$2]]"',
+ 'action-renameuser' => 'gebroekers van naam te verangere',
'right-renameuser' => 'Gebroekers hernaome',
'renameuser-renamed-notice' => "Deze gebroeker is herneump.
Relevante regels oet 't logbook staon hieónger.",
@@ -2504,6 +2536,7 @@ $messages['mk'] = array(
'renameuserlogentry' => 'го преименуваше $1 во „$2“',
'renameuser-log' => '{{PLURAL:$1|1 уредување|$1 уредувања}}. Образложение: $2',
'renameuser-move-log' => 'ÐвтоматÑки премеÑтена Ñтраница при преименување на кориÑникот „[[User:$1|$1]]“ во „[[User:$2|$2]]“',
+ 'action-renameuser' => 'преименување на кориÑници',
'right-renameuser' => 'Преименување кориÑници',
'renameuser-renamed-notice' => 'Овој кориÑник е преименуван.
Подолу е приложен дневникот на преименување за Ñпоредба.',
@@ -2541,6 +2574,7 @@ $messages['ml'] = array(
'renameuserlogentry' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† "$2" à´Žà´¨àµà´¨àµ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'renameuser-log' => '{{PLURAL:$1|ഒരൠതിരàµà´¤àµà´¤àµ½|$1 തിരàµà´¤àµà´¤à´²àµà´•àµ¾}}. കാരണം: $2',
'renameuser-move-log' => '"[[User:$1|$1]]" à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† "[[User:$2|$2]]" à´Žà´¨àµà´¨àµ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´ªàµà´ªàµ‹àµ¾ താൾ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ മാറàµà´±à´¿.',
+ 'action-renameuser' => 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚',
'right-renameuser' => 'ഉപയോകàµà´¤àµƒ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚',
'renameuser-renamed-notice' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£ രേഖ അവലംബമായി പരിശോധികàµà´•à´¾à´¨à´¾à´¯à´¿ താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
@@ -2626,6 +2660,7 @@ Sila undur dan cuba lagi.',
'renameuserlogentry' => 'telah menukar nama $1 menjadi "$2"',
'renameuser-log' => '$1 suntingan. Sebab: $2',
'renameuser-move-log' => 'Memindahkan laman secara automatik ketika menukar nama "[[User:$1|$1]]" menjadi "[[User:$2|$2]]"',
+ 'action-renameuser' => 'menukar nama pengguna',
'right-renameuser' => 'Menukar nama pengguna',
'renameuser-renamed-notice' => 'Pengguna ini telah dinamakan semula.
Log penukaran nama ditunjukkan di bawah sebagai rujukan.',
@@ -2821,6 +2856,7 @@ $messages['nl'] = array(
'renameuserlogentry' => 'heeft $1 hernoemd naar "$2"',
'renameuser-log' => '{{PLURAL:$1|1 bewerking|$1 bewerkingen}}. Reden: $2',
'renameuser-move-log' => 'Automatisch hernoemd bij het wijzigen van gebruiker "[[User:$1|$1]]" naar "[[User:$2|$2]]"',
+ 'action-renameuser' => 'gebruikers te hernoemen',
'right-renameuser' => 'Gebruikers hernoemen',
'renameuser-renamed-notice' => 'Deze gebruiker is hernoemd.
Relevante regels uit het logboek gebruikersnaamwijzigingen worden hieronder ter referentie weergegeven.',
@@ -3110,8 +3146,8 @@ $messages['pnb'] = array(
'renameuserlogpage' => 'ورتن Ûور ناں لاگ',
'renameuserlogpagetext' => 'ورتن ناواں چ تبدیلیاں دی اے لاگ اے۔',
'renameuserlogentry' => '$1 بدل کے "$2" رکھیا گیا۔',
- 'renameuser-log' => '{{انیک:$1|1 تبدیلی|$1 تبدیلیاں}}. وجÛ: $2',
- 'renameuser-move-log' => 'اپنے آپ صÙÛ’ ٹرے "[[ورتن والا:$1|$1]]" دا ناں "[[ورتن والا:$2|$2]]" پلٹدیاں Ûویاں',
+ 'renameuser-log' => '{{PLURAL:$1|1 تبدیلی|1$ تبدیلیاں}}. وجÛ: 2$',
+ 'renameuser-move-log' => 'اپنے آپ صÙÛ’ ٹرے "[[User:$1|$1]]" دا ناں "[[User:$2|$2]]" پلٹدیاں Ûویاں',
'right-renameuser' => 'ورتن والے دا Ûور ناں',
'renameuser-renamed-notice' => 'ایس ورتن والے دا ناں بدلیا گیا اے۔
ناں بدلن والی لاگ اتے پتے لئی تھلے دتی گئی اے۔',
@@ -3346,6 +3382,7 @@ L'archivije de le renomenaziune 'u iacchie aqquà sotte cumme referimende.",
/** Russian (РуÑÑкий)
* @author Ahonc
+ * @author DR
* @author EugeneZelenko
* @author Innv
* @author KPu3uC B Poccuu
@@ -3380,6 +3417,7 @@ $messages['ru'] = array(
'renameuserlogentry' => 'переименовал «$1» в «$2»',
'renameuser-log' => '$1 {{PLURAL:$1|правка|правки|правок}}. Причина: $2',
'renameuser-move-log' => 'ÐвтоматичеÑки в ÑвÑзи Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ учётной запиÑи «[[User:$1|$1]]» в «[[User:$2|$2]]»',
+ 'action-renameuser' => 'переименование учаÑтников',
'right-renameuser' => 'переименование учаÑтников',
'renameuser-renamed-notice' => 'Этот учаÑтник был переименован.
Ðиже Ð´Ð»Ñ Ñправки приведён журнал переименований.',
@@ -3628,6 +3666,7 @@ Prosimo, pojdite nazaj in poskusite znova.',
'renameuserlogentry' => '- preimenovanje $1 v »$2«',
'renameuser-log' => '$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}. Razlog: $2',
'renameuser-move-log' => 'Samodejno prestavljanje strani pri preimenovanju uporabnika »[[User:$1|$1]]« v »[[User:$2|$2]]«',
+ 'action-renameuser' => 'preimenovanje uporabnikov',
'right-renameuser' => 'Preimenovanje uporabnikov',
'renameuser-renamed-notice' => 'Ta uporabnik je bil preimenovan.
Dnevnik preimenovanja je naveden spodaj.',
@@ -3827,6 +3866,7 @@ $messages['su'] = array(
* @author Dafer45
* @author Habj
* @author Lejonel
+ * @author Lokal Profil
* @author M.M.S.
* @author Najami
* @author Per
@@ -3859,6 +3899,7 @@ $messages['sv'] = array(
'renameuserlogentry' => 'bytte namn på $1 till "$2"',
'renameuser-log' => '{{PLURAL:$1|1 redigering|$1 redigeringar}}. Anledning: $2',
'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',
'renameuser-renamed-notice' => 'Användaren har fått ett nytt namn.
Som referens återfinns omdöpningsloggen nedan.',
@@ -4298,6 +4339,7 @@ $messages['vi'] = array(
'renameuserlogentry' => 'đã đổi tên $1 thành “$2â€',
'renameuser-log' => 'Äã có {{PLURAL:$1|1 sá»­a đổi|$1 sá»­a đổi}}. Lý do: $2',
'renameuser-move-log' => 'Äã tá»± Ä‘á»™ng di chuyển trang khi đổi tên thành viên “[[User:$1|$1]]†thành “[[User:$2|$2]]â€',
+ 'action-renameuser' => 'đổi tên thành viên',
'right-renameuser' => 'Äổi tên thành viên',
'renameuser-renamed-notice' => 'Thành viên này đã được đổi tên.
Nhật trình đổi tên được ghi ở dưới để tiện theo dõi.',
@@ -4448,36 +4490,37 @@ $messages['yue'] = array(
* @author Liangent
* @author PhiLiP
* @author Xiaomingyan
+ * @author Yfdyh000
*/
$messages['zh-hans'] = array(
- 'renameuser' => 'æ›´å用户',
- 'renameuser-linkoncontribs' => '用户é‡æ–°å‘½å',
- 'renameuser-linkoncontribs-text' => 'é‡å‘½å此用户',
- 'renameuser-desc' => "添加一个[[Special:Renameuser|特殊页é¢]]æ¥é‡å‘½å用户(需è¦''renameuser''æƒé™ï¼‰",
+ 'renameuser' => '更改用户å',
+ 'renameuser-linkoncontribs' => '更改用户å',
+ 'renameuser-linkoncontribs-text' => '更改该用户å',
+ 'renameuser-desc' => "添加更改用户åçš„[[Special:Renameuser|特殊页é¢]](需è¦''renameuser''æƒé™ï¼‰",
'renameuserold' => '当å‰ç”¨æˆ·å:',
- 'renameusernew' => '新用户å:',
- 'renameuserreason' => 'é‡å‘½å的原因:',
- 'renameusermove' => '移动用户页åŠå…¶å¯¹è¯é¡µï¼ˆåŒ…括å„å­é¡µï¼‰åˆ°æ–°çš„åå­—',
- 'renameusersuppress' => 'ä¸è¦åˆ›å»ºé‡å®šå‘到新的å称',
- 'renameuserreserve' => 'å°ç¦æ—§ç”¨æˆ·å,使之ä¸èƒ½åœ¨æ—¥åŽä½¿ç”¨',
- 'renameuserwarnings' => '警告:',
- 'renameuserconfirm' => '是,为用户é‡å‘½å',
+ 'renameusernew' => '新用户å:',
+ '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。',
+ '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。',
'renameuserlogpage' => '用户更å日志',
- 'renameuserlogpagetext' => '本日志记录用户å的更改',
- 'renameuserlogentry' => 'å°†$1æ›´å为“$2â€',
- 'renameuser-log' => '拥有$1次编辑。 ç†ç”±: $2',
- 'renameuser-move-log' => '当由"[[User:$1|$1]]"é‡å‘½å作"[[User:$2|$2]]"时已ç»è‡ªåŠ¨ç§»åŠ¨ç”¨æˆ·é¡µ',
+ 'renameuserlogpagetext' => '这是用户å更改的日志。',
+ 'renameuserlogentry' => 'æ›´å$1为“$2â€',
+ 'renameuser-log' => '$1个编辑。原因:$2',
+ 'renameuser-move-log' => '当更改用户å“[[User:$1|$1]]â€ä¸ºâ€œ[[User:$2|$2]]â€æ—¶è‡ªåŠ¨ç§»åŠ¨é¡µé¢',
+ 'action-renameuser' => '更改用户å',
'right-renameuser' => 'æ›´å用户',
'renameuser-renamed-notice' => '本用户已更å。下é¢æ供更å日志以供å‚考。',
);
@@ -4486,6 +4529,7 @@ $messages['zh-hans'] = array(
* @author Gaoxuewei
* @author Horacewai2
* @author Mark85296341
+ * @author Simon Shek
* @author Waihorace
* @author Wrightbus
*/
@@ -4518,6 +4562,7 @@ $messages['zh-hant'] = array(
'renameuserlogentry' => '已經把 $1 é‡æ–°å‘½å為「$2ã€',
'renameuser-log' => 'æ“有 $1 次編輯。 ç†ç”±ï¼š$2',
'renameuser-move-log' => '當由「[[User:$1|$1]]ã€é‡æ–°å‘½å作「[[User:$2|$2]]ã€æ™‚已經自動移動用戶é ',
+ 'action-renameuser' => '更改用戶å',
'right-renameuser' => 'é‡æ–°å‘½å用戶',
'renameuser-renamed-notice' => '該用戶已被é‡æ–°å‘½å。
以下列出更改用戶å日誌以供åƒè€ƒã€‚',
diff --git a/extensions/Vector/.gitreview b/extensions/Vector/.gitreview
new file mode 100644
index 00000000..8d06d24a
--- /dev/null
+++ b/extensions/Vector/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/Vector.git
+defaultbranch=master
diff --git a/extensions/Vector/Vector.i18n.php b/extensions/Vector/Vector.i18n.php
index 881433dd..904d1d5d 100644
--- a/extensions/Vector/Vector.i18n.php
+++ b/extensions/Vector/Vector.i18n.php
@@ -1,7 +1,7 @@
<?php
/**
* Internationalisation for Vector extension
- *
+ *
* @file
* @ingroup Extensions
*/
@@ -22,6 +22,7 @@ If you are logged in, you can disable this warning in the "Editing" section of y
'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}}.',
);
/** Message documentation (Message documentation)
@@ -40,6 +41,14 @@ $messages['qqq'] = array(
{{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.',
+);
+
+/** Ṫuroyo (Ṫuroyo)
+ * @author Ariyo
+ */
+$messages['tru'] = array(
+ 'vector-simplesearch-search' => 'Kruxyo',
);
/** Afrikaans (Afrikaans)
@@ -153,6 +162,7 @@ Si aniciasti sesión, puedes desactivar esti avisu na seición "Edición" de les
'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}}.",
);
/** Azerbaijani (Azərbaycanca)
@@ -229,6 +239,7 @@ $messages['be-tarask'] = array(
'vector-simplesearch-search' => 'Пошук',
'vector-simplesearch-containing' => 'утрымлівае...',
'vector-noexperiments-preference' => 'Ðе прапаноўваць ÑкÑпÑрымÑÐ½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьці',
+ 'vector-footercleanup-transclusion' => 'ГÑÑ‚Ð°Ñ Ñтаронка ўключае {{PLURAL:$1|адну іншую Ñтаронку|$1 Ñ–Ð½ÑˆÑ‹Ñ Ñтаронкі|$1 іншых Ñтаронак}}.',
);
/** Bulgarian (БългарÑки)
@@ -391,6 +402,7 @@ Pokud jste přihlášeni, můžete si toto varování vypnout na záložce „Ed
'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}}.',
);
/** Kashubian (Kaszëbsczi)
@@ -470,6 +482,7 @@ Als angemeldeter Benutzer kann das Anzeigen dieser Warnung im „Bearbeiten“-B
'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.',
);
/** German (formal address) (‪Deutsch (Sie-Form)‬) */
@@ -508,6 +521,7 @@ $messages['dsb'] = array(
'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}}.',
);
/** Greek (Ελληνικά)
@@ -548,6 +562,7 @@ Se vi ensalutas, vi povas malÅalti ĉi tiun averton en la sekcio "Grandeco de r
);
/** Spanish (Español)
+ * @author Armando-Martin
* @author Crazymadlover
* @author Drini
* @author Fitoschido
@@ -565,13 +580,17 @@ Si has iniciado sesión, puedes desactivar este aviso en la sección «EdiciónÂ
'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}}.',
);
/** Estonian (Eesti)
* @author Pikne
*/
$messages['et'] = array(
+ 'vector' => 'Vector-kujunduse kasutajaliidese täiustused',
+ 'vector-desc' => 'Täiustab Vector-kujunduse kasutajaliidese elemente.',
'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',
@@ -643,6 +662,7 @@ $messages['fo'] = array(
/** French (Français)
* @author IAlex
* @author Jean-Frédéric
+ * @author McDutchie
* @author PieRRoMaN
* @author Sherbrooke
* @author Urhixidur
@@ -658,6 +678,7 @@ Si vous êtes connecté avec votre compte, vous pouvez retirer cet avertissement
'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}}.',
);
/** Franco-Provençal (Arpetan)
@@ -727,6 +748,7 @@ Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "
'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}}.',
);
/** Ancient Greek (ἈÏχαία ἑλληνικὴ) */
@@ -749,6 +771,7 @@ Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „Tekscht-Ygabâ€
'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.',
);
/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
@@ -756,7 +779,13 @@ Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „Tekscht-Ygabâ€
* @author Sushant savla
*/
$messages['gu'] = array(
+ 'vector' => 'વેકà«àªŸàª° માટે UI સà«àª§àª¾àª°àª¾',
+ 'vector-desc' => 'વેકà«àªŸàª° સà«àª•à«€àª¨àª¨àª¾ યà«àªàª° ઈંટરફેઠના તતà«àªµà«‹àª¨à«‡ સà«àª§àª¾àª°à«‡ છે',
+ 'vector-collapsiblenav-preference' => 'વેકà«àªŸàª° સà«àª•à«€àª¨àª¨àª¾ સાઈડ બારમાં કોલેપà«àª¸à«€àª‚ગ સકà«àª°à«€àª¯ કરશે.',
'vector-collapsiblenav-more' => 'વધૠભાષાઓ',
+ 'vector-editwarning-warning' => 'આ પાનà«àª‚ છોડી દેશો તો તમરા ફેરફારો સચવાશે નહીં.
+જો તમે પà«àª°àªµà«‡àª¶ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલà«àªªà«‹ બદલીને બંધ કરી શકો છો.',
+ 'vector-editwarning-preference' => 'સાચવà«àª¯àª¾ વગર જો હà«àª‚ પૃષà«àª  છોડà«àª‚ તો મને ચેતવણી આપો',
'vector-simplesearch-search' => 'શોધો',
'vector-simplesearch-containing' => 'ધરાવતી...',
'vector-noexperiments-preference' => 'મને પà«àª°àª¯à«‹àª—ોમાંથી બકાત રાખો',
@@ -776,6 +805,7 @@ My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd
/** Hebrew (עברית)
* @author Amire80
+ * @author Ofekalef
* @author Rotemliss
* @author YaronSh
* @author Yonidebest
@@ -787,10 +817,11 @@ $messages['he'] = array(
'vector-collapsiblenav-more' => 'דף ×–×” בשפות ×חרות',
'vector-editwarning-warning' => 'עזיבת דף ×–×” עשויה ×œ×’×¨×•× ×œ×ובדן כל ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª×.
×× ××ª× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ, תוכלו לבטל ×זהרה זו בחלק "עריכה" שבהעדפות שלכ×.',
- 'vector-editwarning-preference' => 'הצגת ×זהרה ×× ×× ×™ עומד לעזוב דף עריכה ×¢× ×©×™× ×•×™×™× ×©×˜×¨× × ×©×ž×¨×•',
+ 'vector-editwarning-preference' => 'הצגת ×זהרה בעת עזיבת דף עריכה ×¢× ×©×™× ×•×™×™× ×©×˜×¨× × ×©×ž×¨×•',
'vector-simplesearch-search' => 'חיפוש',
'vector-simplesearch-containing' => 'כולל...',
'vector-noexperiments-preference' => '×ל תכללו ×ותי ×‘× ×™×¡×•×™×™× ×‘×¢×ª×™×“',
+ 'vector-footercleanup-transclusion' => 'הדף ×”×–×” מכליל {{PLURAL:$1|דף ×חד ×חר|$1 ×“×¤×™× ×חרי×}}',
);
/** Hindi (हिनà¥à¤¦à¥€)
@@ -834,6 +865,7 @@ $messages['hsb'] = array(
'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}}.',
);
/** Hungarian (Magyar)
@@ -878,6 +910,7 @@ Si tu ha aperite un session, tu pote disactivar iste aviso in le section "Modifi
'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)
@@ -919,7 +952,7 @@ No nakastrekka, mabalin mo nga ikkaten daytoy a ballaag idiay "Panagurnos" a pas
'vector-editwarning-preference' => 'Pakaunaannak no pumanawak iti inurnos a panid a saan a naidulin dagiti sinukatan',
'vector-simplesearch-search' => 'Biruken',
'vector-simplesearch-containing' => 'naglaon ti...',
- 'vector-noexperiments-preference' => 'Saannak nga iraman kadagiti eksperimentoa langa',
+ 'vector-noexperiments-preference' => 'Saannak nga iraman kadagiti eksperimento a langa',
);
/** Ido (Ido)
@@ -969,19 +1002,20 @@ Se sei loggato, puoi disattivare questo avviso nella sezione "Casella di modific
/** Japanese (日本語)
* @author Fryed-peach
+ * @author Shirayuki
* @author Whym
* @author é’å­å®ˆæ­Œ
*/
$messages['ja'] = array(
'vector' => 'ベクター用ユーザーインターフェイス改良',
- 'vector-desc' => 'ベクター・スキンã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è¦ç´ ã‚’改良ã™ã‚‹ã€‚',
- 'vector-collapsiblenav-preference' => 'ベクター外装ã®ãƒŠãƒ“ゲーションã§ã€é …ç›®ã®æŠ˜ã‚Šç•³ã¿ã‚’有効化ã™ã‚‹',
+ 'vector-desc' => 'ベクター外装ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹è¦ç´ ã‚’改良ã—ã¾ã™ã€‚',
+ 'vector-collapsiblenav-preference' => 'ベクター外装ã®ãƒŠãƒ“ゲーションã§ã€é …ç›®ã®æŠ˜ã‚Šç•³ã¿ã‚’有効ã«ã™ã‚‹',
'vector-collapsiblenav-more' => 'ä»–ã®è¨€èªž',
'vector-editwarning-warning' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’離れるã¨ã€ã‚ãªãŸãŒè¡Œã£ãŸå¤‰æ›´ã¯ã™ã¹ã¦å¤±ã‚ã‚Œã¦ã—ã¾ã†ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ログインã—ã¦ã„ã‚‹å ´åˆã€å€‹äººè¨­å®šã®ã€Œç·¨é›†ã€ã‚¿ãƒ–ã§ã“ã®è­¦å‘Šã‚’表示ã—ãªã„よã†ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
- 'vector-editwarning-preference' => '変更をä¿å­˜ã›ãšã«ç·¨é›†ç”»é¢ã‹ã‚‰é›¢ã‚Œã‚ˆã†ã¨ã—ãŸéš›ã«è­¦å‘Šã™ã‚‹',
+ 'vector-editwarning-preference' => '変更をä¿å­˜ã›ãšã«ç·¨é›†ç”»é¢ã‹ã‚‰é›¢ã‚Œã‚ˆã†ã¨ã—ãŸã‚‰è­¦å‘Š',
'vector-simplesearch-search' => '検索',
'vector-simplesearch-containing' => 'ã“ã®èªžå¥ã‚’全文検索',
- 'vector-noexperiments-preference' => '機能ã«ã¤ã„ã¦ã®å®Ÿé¨“ã‹ã‚‰è‡ªåˆ†ã‚’除外ã™ã‚‹',
+ 'vector-noexperiments-preference' => '開発中ã®æ©Ÿèƒ½ã‹ã‚‰è‡ªåˆ†ã‚’除外',
);
/** Javanese (Basa Jawa) */
@@ -991,6 +1025,7 @@ $messages['jv'] = array(
/** Georgian (ქáƒáƒ áƒ—ული)
* @author BRUTE
+ * @author David1010
* @author ITshnik
* @author გიáƒáƒ áƒ’იმელáƒ
*/
@@ -1004,6 +1039,7 @@ $messages['ka'] = array(
'vector-simplesearch-search' => 'ძიებáƒ',
'vector-simplesearch-containing' => 'შეიცáƒáƒ•áƒ¡...',
'vector-noexperiments-preference' => 'გáƒáƒ›áƒáƒ›áƒ áƒ˜áƒªáƒ®áƒ” შემდგáƒáƒ›áƒ˜ ექსპერიმენტებისგáƒáƒœ.',
+ 'vector-footercleanup-transclusion' => 'ეს გვერდი შეიცáƒáƒ•áƒ¡ {{PLURAL:$1|ერთი სხვრგვერდის|$1 სხვრგვერდის}} {{PLURAL:$1|ჩáƒáƒœáƒáƒ áƒ—ს|ჩáƒáƒœáƒáƒ áƒ—ს}}.',
);
/** Kazakh (Қазақша)
@@ -1173,6 +1209,16 @@ $messages['lt'] = array(
'vector-simplesearch-search' => 'Ieškoti',
);
+/** Lushai (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
@@ -1217,6 +1263,7 @@ $messages['mk'] = array(
'vector-simplesearch-search' => 'Пребарување',
'vector-simplesearch-containing' => 'Ñодржи...',
'vector-noexperiments-preference' => 'Изземи ме од екÑперименти Ño функции',
+ 'vector-footercleanup-transclusion' => 'Оваа Ñтраница Ñодржи {{PLURAL:$1|превметнување|превметнувања}} на уште $1 {{PLURAL:$1|друга Ñтраница|други Ñтраници}}.',
);
/** Malayalam (മലയാളം)
@@ -1234,6 +1281,7 @@ $messages['ml'] = array(
'vector-simplesearch-search' => 'തിരയàµà´•',
'vector-simplesearch-containing' => 'ഉൾപàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´µ...',
'vector-noexperiments-preference' => 'സവിശേഷഗàµà´£à´™àµà´™àµ¾ പരീകàµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ à´Žà´¨àµà´¨àµ† ഒഴിവാകàµà´•àµà´•',
+ 'vector-footercleanup-transclusion' => 'à´ˆ താളിൽ {{PLURAL:$1|മറàµà´±àµŠà´°àµ താൾ|മറàµà´±àµ $1 താളàµà´•àµ¾}} ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
);
/** Mongolian (Монгол) */
@@ -1274,6 +1322,7 @@ Anda boleh melumpuhkan amaran in di bahagian "Menyunting" dalam keutamaan anda.'
'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}}.',
);
/** Maltese (Malti)
@@ -1344,6 +1393,7 @@ Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "Bewe
'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}}.",
);
/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
@@ -1398,6 +1448,7 @@ $messages['pdc'] = array(
);
/** Polish (Polski)
+ * @author BeginaFelicysym
* @author Sp5uhe
*/
$messages['pl'] = array(
@@ -1411,6 +1462,7 @@ Jeśli jesteś zalogowany możesz wyłączyć wyświetlanie tego ostrzeżenia w
'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}}.',
);
/** Piedmontese (Piemontèis)
@@ -1637,6 +1689,7 @@ $messages['si'] = array(
/** Slovak (SlovenÄina)
* @author Helix84
+ * @author Teslaton
*/
$messages['sk'] = array(
'vector' => 'Vylepšenia použ. rozhrania Vector',
@@ -1649,6 +1702,7 @@ Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „Úpravy“ s
'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)
@@ -1665,6 +1719,7 @@ To opozorilo lahko onemogoÄite v razdelku »Urejanje« svojih nastavitev.',
'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}}.',
);
/** Somali (Soomaaliga)
@@ -1918,6 +1973,7 @@ Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “
'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}}.',
);
/** Volapük (Volapük)
@@ -1982,6 +2038,7 @@ $messages['yue'] = array(
* @author Bencmq
* @author Liangent
* @author Onecountry
+ * @author Yfdyh000
* @author 阿pp
*/
$messages['zh-hans'] = array(
@@ -1994,6 +2051,7 @@ $messages['zh-hans'] = array(
'vector-simplesearch-search' => 'æœç´¢',
'vector-simplesearch-containing' => 'å«æœ‰...',
'vector-noexperiments-preference' => '功能实验中排除我',
+ 'vector-footercleanup-transclusion' => '此页{{PLURAL:$1|嵌入包å«}}有{{PLURAL:$1|一个其他页é¢|$1个其他页é¢}}。',
);
/** Traditional Chinese (‪中文(ç¹é«”)‬)
diff --git a/extensions/Vector/Vector.php b/extensions/Vector/Vector.php
index f47e2e93..abe488fb 100644
--- a/extensions/Vector/Vector.php
+++ b/extensions/Vector/Vector.php
@@ -105,6 +105,13 @@ $wgResourceModules += array(
'ext.vector.footerCleanup' => $vectorResourceTemplate + array(
'scripts' => 'ext.vector.footerCleanup.js',
'styles' => 'ext.vector.footerCleanup.css',
+ 'messages' => array (
+ 'vector-footercleanup-transclusion',
+ ),
+ 'dependencies' => array(
+ // The message require plural support at javascript.
+ 'mediawiki.jqueryMsg',
+ )
),
'ext.vector.sectionEditLinks' => $vectorResourceTemplate + array(
'scripts' => 'ext.vector.sectionEditLinks.js',
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.js b/extensions/Vector/modules/ext.vector.collapsibleNav.js
index 6e72ef84..5da57aca 100644
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.js
+++ b/extensions/Vector/modules/ext.vector.collapsibleNav.js
@@ -172,10 +172,14 @@ jQuery( function( $ ) {
) {
$(this)
.addClass( 'expanded' )
+ .removeClass( 'collapsed' )
.find( 'div.body' )
+ .hide() // bug 34450
.show();
} else {
- $(this).addClass( 'collapsed' );
+ $(this)
+ .addClass( 'collapsed' )
+ .removeClass( 'expanded' );
}
// Re-save cookie
if ( state != null ) {
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.js b/extensions/Vector/modules/ext.vector.footerCleanup.js
index 2df26540..66838375 100644
--- a/extensions/Vector/modules/ext.vector.footerCleanup.js
+++ b/extensions/Vector/modules/ext.vector.footerCleanup.js
@@ -43,10 +43,9 @@ jQuery( document ).ready( function( $ ) {
$( '.templatesUsed ul' )
.wrap( '<div id="transclusions-list" class="collapsible-list collapsed"></div>' )
.parent()
- // FIXME: i18n, remove link from message and let community add link to transclusion page if it exists
- .prepend( '<label>This page contains <a href="http://en.wikipedia.org/wiki/transclusion">transclusions</a> of <strong>'
- + transclusionCount
- + '</strong> other pages.</label>' );
+ .prepend( $( '<label>' )
+ .text( mw.msg( 'vector-footercleanup-transclusion', transclusionCount ) )
+ );
$( '.mw-templatesUsedExplanation' ).remove();
$( '.collapsible-list label' )
diff --git a/extensions/Vector/modules/ext.vector.sectionEditLinks.js b/extensions/Vector/modules/ext.vector.sectionEditLinks.js
index 94a154e9..b8e2f601 100644
--- a/extensions/Vector/modules/ext.vector.sectionEditLinks.js
+++ b/extensions/Vector/modules/ext.vector.sectionEditLinks.js
@@ -5,13 +5,13 @@
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 ) );
- var bucket = null;
if ( currentExperiment === null || Number( currentExperiment ) != experiment ) {
$.cookie( cookieBase + 'experiment', experiment );
} else {
@@ -32,7 +32,12 @@ if ( mw.config.get( 'wgVectorSectionEditLinksBucketTest', false ) ) {
}
}
}
-if ( bucket > 0 ) {
+
+if ( bucket <= 0 ) {
+ return;
+}
+
+$(document).ready( function() {
// Transform the targets of section edit links to route through the click tracking API
var session = $.cookie( 'clicktracking-session' );
$( 'span.editsection a, #ca-edit a' ).each( function() {
@@ -70,6 +75,6 @@ if ( bucket > 0 ) {
.remove();
} );
}
-}
+} );
} )( jQuery, mediaWiki );
diff --git a/extensions/Vector/modules/images/closed-ltr.png b/extensions/Vector/modules/images/closed-ltr.png
index c27c9636..063ac6f7 100644
--- a/extensions/Vector/modules/images/closed-ltr.png
+++ b/extensions/Vector/modules/images/closed-ltr.png
Binary files differ
diff --git a/extensions/Vector/modules/images/closed-rtl.png b/extensions/Vector/modules/images/closed-rtl.png
index be968a4a..c3462182 100644
--- a/extensions/Vector/modules/images/closed-rtl.png
+++ b/extensions/Vector/modules/images/closed-rtl.png
Binary files differ
diff --git a/extensions/Vector/modules/images/edit-faded.png b/extensions/Vector/modules/images/edit-faded.png
index 0f622e12..1e2e5d83 100644
--- a/extensions/Vector/modules/images/edit-faded.png
+++ b/extensions/Vector/modules/images/edit-faded.png
Binary files differ
diff --git a/extensions/Vector/modules/images/edit.png b/extensions/Vector/modules/images/edit.png
index ec02a986..fe281252 100644
--- a/extensions/Vector/modules/images/edit.png
+++ b/extensions/Vector/modules/images/edit.png
Binary files differ
diff --git a/extensions/Vector/modules/images/open.png b/extensions/Vector/modules/images/open.png
index bf2d4fb4..0221028e 100644
--- a/extensions/Vector/modules/images/open.png
+++ b/extensions/Vector/modules/images/open.png
Binary files differ
diff --git a/extensions/Vector/modules/images/portal-break.png b/extensions/Vector/modules/images/portal-break.png
index e81b5597..10cd7f83 100644
--- a/extensions/Vector/modules/images/portal-break.png
+++ b/extensions/Vector/modules/images/portal-break.png
Binary files differ
diff --git a/extensions/WikiEditor/.gitreview b/extensions/WikiEditor/.gitreview
new file mode 100644
index 00000000..622413f0
--- /dev/null
+++ b/extensions/WikiEditor/.gitreview
@@ -0,0 +1,6 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/WikiEditor.git
+defaultbranch=master
+defaultrebase=0
diff --git a/extensions/WikiEditor/WikiEditor.hooks.php b/extensions/WikiEditor/WikiEditor.hooks.php
index 7a2c2e41..a840dc4b 100644
--- a/extensions/WikiEditor/WikiEditor.hooks.php
+++ b/extensions/WikiEditor/WikiEditor.hooks.php
@@ -29,6 +29,9 @@ class WikiEditorHooks {
'modules' => array(
'ext.wikiEditor.toolbar',
),
+ 'configurations' => array(
+ 'wgWikiEditorToolbarClickTracking',
+ ),
),
'dialogs' => array(
'preferences' => array(
@@ -214,6 +217,27 @@ class WikiEditorHooks {
}
/**
+ * EditPageBeforeEditToolbar hook
+ *
+ * Disable the old toolbar if the new one is enabled
+ *
+ * @param $toolbar html
+ * @return bool
+ */
+ public static function EditPageBeforeEditToolbar( &$toolbar ) {
+ if ( self::isEnabled( 'toolbar' ) ) {
+ $toolbar = Html::rawElement(
+ 'div', array(
+ 'class' => 'wikiEditor-oldToolbar',
+ 'style' => 'display:none;'
+ ),
+ $toolbar
+ );
+ }
+ return true;
+ }
+
+ /**
* GetPreferences hook
*
* Adds WikiEditor-releated items to the preferences
diff --git a/extensions/WikiEditor/WikiEditor.i18n.php b/extensions/WikiEditor/WikiEditor.i18n.php
index 6e58512c..3ce5c985 100644
--- a/extensions/WikiEditor/WikiEditor.i18n.php
+++ b/extensions/WikiEditor/WikiEditor.i18n.php
@@ -184,6 +184,7 @@ $1:Example.jpg|Caption2",
'wikieditor-toolbar-characters-page-persian' => 'Persian',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebrew',
'wikieditor-toolbar-characters-page-bangla' => 'Bangla',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -266,6 +267,7 @@ $1:Example.jpg|Caption2",
* @author Liangent
* @author Lloffiwr
* @author Mormegil
+ * @author Njardarlogar
* @author Onecountry
* @author Prima klasy4na
* @author Raymond
@@ -421,6 +423,8 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-characters-page-hebrew' => 'This is the name of a script, or alphabet, not a language.',
'wikieditor-toolbar-characters-page-bangla' => 'The name of the [[w:Bengali alphabet|Bangla]] (a.k.a. Bengali) character set (alphabet) on the toolbar.
For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
+ 'wikieditor-toolbar-characters-page-tamil' => 'The name of the [[w:Tamil_Script#Numerals_and_symbols|Tamil]] numerals and symbols on the toolbar.
+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-section-help' => '{{Identical|Help}}',
@@ -1320,9 +1324,9 @@ $messages['ar'] = array(
'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-ulist-example' => 'عنصر قائمة منقطة',
+ 'wikieditor-toolbar-tool-olist' => 'قائمة مرقمة',
+ 'wikieditor-toolbar-tool-olist-example' => 'عنصر قائمة مرقمة',
'wikieditor-toolbar-tool-indent' => 'هامش',
'wikieditor-toolbar-tool-indent-example' => 'سطر بهامش',
'wikieditor-toolbar-tool-nowiki' => 'لا تنسيق ويكي',
@@ -1443,7 +1447,7 @@ $1:Example.jpg|تعليق2',
'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' => 'مل٠مضمّن',
@@ -1508,16 +1512,27 @@ $messages['arc'] = array(
'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' => 'ܫܘÜÜ 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-group-format' => 'ܣܕÜܪܘܬÜ',
'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-newline' => 'Ü£ÜªÜ›Ü ÜšÜ•Ü¬Ü',
@@ -1532,13 +1547,16 @@ $messages['arc'] = array(
'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-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' => 'ܓܘܓÜܪÜÜ›ÜÜÜܬ',
@@ -1551,7 +1569,7 @@ $messages['arc'] = array(
'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' => 'ܡܒܘܥ̈Ü',
@@ -1796,19 +1814,21 @@ $messages['as'] = array(
*/
$messages['ast'] = array(
'wikieditor' => "Interfaz avanzada d'edición de testu wiki",
+ 'wikieditor-desc' => "Ufre una interfaz estensible d'edición de testu wiki y munchos módulos de funciones",
'wikieditor-wikitext-tab' => 'Testu wiki',
'wikieditor-loading' => 'Cargando...',
'wikieditor-preview-preference' => 'Activar la vista previa comparativa',
- 'wikieditor-preview-tab' => 'Entever',
+ 'wikieditor-preview-tab' => 'Vista previa',
'wikieditor-preview-changes-tab' => 'Cambios',
'wikieditor-preview-loading' => 'Cargando...',
'wikieditor-previewDialog-preference' => 'Activar el diálogu de vista previa',
- 'wikieditor-previewDialog-tab' => 'Entever',
+ 'wikieditor-previewDialog-tab' => 'Vista previa',
'wikieditor-previewDialog-loading' => 'Cargando...',
'wikieditor-publish-preference' => 'Activar la publicación pasu a pasu',
'wikieditor-publish-button-publish' => 'Publicar',
'wikieditor-publish-button-cancel' => 'Encaboxar',
'wikieditor-publish-dialog-title' => 'Publicar en {{SITENAME}}',
+ 'wikieditor-publish-dialog-summary' => "Resume d'edición (describe de mou curtiu los cambios que ficisti):",
'wikieditor-publish-dialog-minor' => 'Edición menor',
'wikieditor-publish-dialog-watch' => 'Vixilar esta páxina',
'wikieditor-publish-dialog-publish' => 'Publicar',
@@ -1818,11 +1838,14 @@ $messages['ast'] = array(
'wikieditor-template-editor-dialog-submit' => 'Anovar',
'wikieditor-template-editor-dialog-cancel' => 'Encaboxar',
'wikieditor-templates-preference' => 'Activar el plegáu de plantíes',
+ 'wikieditor-toc-preference' => 'Activar la tabla de conteníu navegable',
'wikieditor-toc-show' => 'Amosar el conteníu',
'wikieditor-toc-hide' => 'Anubrir el conteníu',
'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-hidesig' => 'Anubrir el botón de robla nes páxines del espaciu de nomes principal',
'wikieditor-toolbar-loading' => 'Cargando...',
'wikieditor-toolbar-tool-bold' => 'Negrina',
'wikieditor-toolbar-tool-bold-example' => 'Testu en negrina',
@@ -1846,12 +1869,16 @@ $messages['ast'] = array(
'wikieditor-toolbar-tool-link-cancel' => 'Encaboxar',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'La páxina yá esiste',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'La páxina nun esiste',
- 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Títulu non válidu',
+ '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-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?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Enllaz internu',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Enllaz esternu',
+ 'wikieditor-toolbar-tool-link-empty' => 'Nun escribisti nada pa enllazar.',
+ 'wikieditor-toolbar-tool-file' => 'Ficheru incrustáu',
'wikieditor-toolbar-tool-file-example' => 'Exemplu.jpg',
'wikieditor-toolbar-tool-reference' => 'Referencia',
'wikieditor-toolbar-tool-reference-example' => 'Escribir equí el testu de la nota al pie',
@@ -1886,8 +1913,25 @@ $messages['ast'] = array(
'wikieditor-toolbar-tool-superscript' => 'Superíndiz',
'wikieditor-toolbar-tool-superscript-example' => 'Testu en superíndiz',
'wikieditor-toolbar-tool-subscript' => 'Subíndiz',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Testu en subíndiz',
'wikieditor-toolbar-group-insert' => 'Inxertar',
'wikieditor-toolbar-tool-gallery' => "Galería d'imaxes",
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Exemplu.jpg|Pie1
+$1:Exemplu.jpg|Pie2',
+ 'wikieditor-toolbar-tool-newline' => 'Nueva llinia',
+ 'wikieditor-toolbar-tool-table' => 'Tabla',
+ 'wikieditor-toolbar-tool-table-example-old' => '-
+! testera 1
+! testera 2
+! testera 3
+|-
+| filera 1, caxella 1
+| filera 1, caxella 2
+| filera 1, caxella 3
+|-
+| filera 2, caxella 1
+| filera 2, caxella 2
+| filera 2, caxella 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Testu de la caxella',
'wikieditor-toolbar-tool-table-example-header' => 'Testu de cabecera',
'wikieditor-toolbar-tool-table-title' => 'Inxertar una tabla',
@@ -1900,16 +1944,23 @@ $messages['ast'] = array(
'wikieditor-toolbar-tool-table-preview' => 'Vista previa',
'wikieditor-toolbar-tool-table-insert' => 'Inxertar',
'wikieditor-toolbar-tool-table-cancel' => 'Encaboxar',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Con esti diálogu nun ye posible inxertar una tabla de más de $1 caxelles.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Nun escribisti un númberu válidu de fileres o columnes.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Nun pues inxertar una tabla con cero fileres o columnes.',
'wikieditor-toolbar-tool-replace' => 'Guetar y reemplazar',
'wikieditor-toolbar-tool-replace-title' => 'Guetar y reemplazar',
- 'wikieditor-toolbar-tool-replace-search' => 'Buscar',
+ 'wikieditor-toolbar-tool-replace-search' => 'Buscar:',
'wikieditor-toolbar-tool-replace-replace' => 'Sustituir por:',
'wikieditor-toolbar-tool-replace-case' => 'Distinguir mayúscules',
'wikieditor-toolbar-tool-replace-regex' => 'Tratar la cadena de gueta como una espresión regular',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Alcontrar siguiente',
'wikieditor-toolbar-tool-replace-button-replace' => 'Sustituir',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sustituir toos',
'wikieditor-toolbar-tool-replace-close' => 'Zarrar',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'La to gueta nun alcontró coincidencies.',
'wikieditor-toolbar-tool-replace-success' => '$1 reemplazos fechos',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Nun escribisti nada pa guetar.',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => "La espresión regular qu'escribisti ye inválida: $1",
'wikieditor-toolbar-section-characters' => 'Caráuteres especiales',
'wikieditor-toolbar-characters-page-latin' => 'Llatín',
'wikieditor-toolbar-characters-page-latinextended' => 'Llatín estendíu',
@@ -1918,9 +1969,11 @@ $messages['ast'] = array(
'wikieditor-toolbar-characters-page-greek' => 'Griegu',
'wikieditor-toolbar-characters-page-cyrillic' => 'Cirílicu',
'wikieditor-toolbar-characters-page-arabic' => 'Ãrabe',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Ãrabe estendíu',
'wikieditor-toolbar-characters-page-persian' => 'Persa',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebréu',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalín',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Cingalés',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -1948,6 +2001,32 @@ $messages['ast'] = array(
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Testu en negrina y cursiva'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Testu en negrina &amp; cursiva</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Enllaz internu',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Títulu de la páxina|Etiqueta del enllaz]]<br />[[Títulu de la páxina]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Etiqueta del enllaz</a><br /><a href='#'>Títulu de la páxina</a>",
+ 'wikieditor-toolbar-help-content-xlink-description' => 'Enllaz esternu',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Etiqueta del enllaz]<br />[http://www.example.org]<br />http://www.example.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Etiqueta del enllaz</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' => 'Cabecera de 2ᵘ nivel',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Testu de la cabecera ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Testu de la cabecera</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'Cabecera de 3ᵉʳ nivel',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Testu de la cabecera ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Testu de la cabecera</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'Cabecera de 4ᵘ nivel',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Testu de la cabecera ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Testu de la cabecera</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'Cabecera de 5ᵘ nivel',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Testu de la cabecera =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Testu de la cabecera</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Llista con puntos',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Elementu de la llista<br />* Elementu de la llista',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Elementu de la llista</li><li>Elementu de la llista</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Llista numberada',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Elementu de la llista<br /># Elementu de la llista',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Elementu de la llista</li><li>Elementu de la llista</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'Ficheru incrustáu',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Exemplu.png|thumb|Testu del pie]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Testu del pie' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='extensions/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Ampliar' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Testu del pie</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Referencia',
'wikieditor-toolbar-help-content-reference-syntax' => 'Testu de la páxina&lt;ref name="test"&gt;[http://www.example.org Testu del enllaz], otru testu.&lt;/ref&gt;.',
'wikieditor-toolbar-help-content-reference-result' => "Testu de la páxina.<sup><a href='#'>[1]</a></sup>",
@@ -1982,11 +2061,14 @@ $messages['az'] = array(
'wikieditor-publish-button-publish' => 'Yeniləmə',
'wikieditor-publish-button-cancel' => 'Ləğv et',
'wikieditor-publish-dialog-minor' => 'Kiçik dəyişiklik',
+ 'wikieditor-publish-dialog-watch' => 'Bu səhifəni izlə',
'wikieditor-publish-dialog-publish' => 'Publish',
'wikieditor-publish-dialog-goback' => 'GeriyÉ™',
'wikieditor-template-editor-dialog-title' => 'Åžablonu redaktÉ™ et',
'wikieditor-template-editor-dialog-submit' => 'YenilÉ™',
'wikieditor-template-editor-dialog-cancel' => 'Ləğv et',
+ 'wikieditor-toc-show' => 'Möhtəviyyata bax',
+ 'wikieditor-toc-hide' => 'Möhtəviyyatı gizlət',
'wikieditor-toolbar-loading' => 'Yüklənir…',
'wikieditor-toolbar-tool-bold' => 'Qalın',
'wikieditor-toolbar-tool-bold-example' => 'Qalın mətn',
@@ -2650,8 +2732,8 @@ $messages['be-tarask'] = array(
'wikieditor-toolbar-dialogs-preference' => 'Дазволіць формы Ð´Ð»Ñ ÑžÑтаўкі ÑпаÑылак, табліцаў Ñ– іншых ÑлемÑнтаў',
'wikieditor-toolbar-hidesig' => 'Схаваць кнопку подпіÑу Ñа Ñтаронак у аÑноўнай праÑторы назваў',
'wikieditor-toolbar-loading' => 'Загрузка…',
- 'wikieditor-toolbar-tool-bold' => 'ТлуÑÑ‚Ñ‹',
- 'wikieditor-toolbar-tool-bold-example' => 'ТлуÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚',
+ 'wikieditor-toolbar-tool-bold' => 'ТоўÑÑ‚Ñ‹',
+ 'wikieditor-toolbar-tool-bold-example' => 'ТоўÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚',
'wikieditor-toolbar-tool-italic' => 'КурÑÑ–Ñž',
'wikieditor-toolbar-tool-italic-example' => 'КурÑіўны Ñ‚ÑкÑÑ‚',
'wikieditor-toolbar-tool-ilink' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ ÑпаÑылка',
@@ -2776,6 +2858,7 @@ $1:Прыклад.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-telugu' => 'ТÑлугу',
'wikieditor-toolbar-characters-page-sinhala' => 'СынгальÑкіÑ',
'wikieditor-toolbar-characters-page-gujarati' => 'Гуджараці',
@@ -2796,12 +2879,12 @@ $1:Прыклад.jpg|ПодпіÑ2',
'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-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>",
@@ -2850,6 +2933,7 @@ $1:Прыклад.jpg|ПодпіÑ2',
* @author McDutchie
* @author Spiritia
* @author Turin
+ * @author Wizardist
*/
$messages['bg'] = array(
'wikieditor' => 'Подобрен Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð° редактиране на уикитекÑÑ‚',
@@ -2993,7 +3077,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' => '{{PLURAL:$1|Ðаправена е|Ðаправени Ñа}} $1 {{PLURAL:$1|замÑна|замени}}.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Ðаправени Ñа замени: $1.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ðе Ñте въвели низ за Ñ‚ÑŠÑ€Ñене.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ВъведениÑÑ‚ от Ð²Ð°Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрен израз е невалиден: $1',
'wikieditor-toolbar-section-characters' => 'Специални Ñимволи',
@@ -3445,7 +3529,7 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'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' => 'আপনি যা টাইপ করেছেন',
'wikieditor-toolbar-help-heading-result' => 'আপনি যা দেখতে পাচà§à¦›à§‡à¦¨',
@@ -3905,11 +3989,12 @@ $1:Skouer.jpg|Deskrivadur2',
'wikieditor-toolbar-characters-page-symbols' => 'Arouezennoù',
'wikieditor-toolbar-characters-page-greek' => 'Gresianek',
'wikieditor-toolbar-characters-page-cyrillic' => 'Kirillek',
- 'wikieditor-toolbar-characters-page-arabic' => 'Arabek',
+ 'wikieditor-toolbar-characters-page-arabic' => 'Arabeg',
'wikieditor-toolbar-characters-page-arabicextended' => 'Arabeg astennet',
'wikieditor-toolbar-characters-page-persian' => 'Perseg',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebraek',
'wikieditor-toolbar-characters-page-bangla' => 'Banglaek',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamileg',
'wikieditor-toolbar-characters-page-telugu' => 'Telougou',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -5085,6 +5170,7 @@ $1:Příklad.jpg|Titulek 2',
'wikieditor-toolbar-characters-page-persian' => 'Perština',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebrejské písmo',
'wikieditor-toolbar-characters-page-bangla' => 'Bengálské písmo',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilština',
'wikieditor-toolbar-characters-page-telugu' => 'Telugské písmo',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhálské písmo',
'wikieditor-toolbar-characters-page-gujarati' => 'Gudžarátské písmo',
@@ -5659,6 +5745,7 @@ $1:Eksempel.jpg|Billedtekst2',
'wikieditor-toolbar-characters-page-persian' => 'Persisk',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebraisk',
'wikieditor-toolbar-characters-page-bangla' => 'Bengali',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilsk',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singalesisk',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -5902,6 +5989,7 @@ $1:Beispiel.jpg|Beschreibung2',
'wikieditor-toolbar-characters-page-persian' => 'Persisch',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebräisch',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalisch',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilisch',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singhalesisch',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -6378,6 +6466,7 @@ $1:Pśikład.jpg|Pópisanje2',
'wikieditor-toolbar-characters-page-persian' => 'Persiske',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebrejske',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalšćina',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilšćina',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singalezišćina',
'wikieditor-toolbar-characters-page-gujarati' => 'Guźarati',
@@ -6924,7 +7013,9 @@ $1:Ekzemplo.jpg|Teksto2 pri dosiero',
);
/** Spanish (Español)
+ * @author -jem-
* @author AlimanRuna
+ * @author Armando-Martin
* @author Crazymadlover
* @author Fitoschido
* @author Imre
@@ -7097,6 +7188,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-characters-page-persian' => 'Persa',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebreo',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalí',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugú',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -7124,7 +7216,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Texto en negrita y cursiva'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Texto en negrita &amp; cursiva</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Enlace interno',
- 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Page title|Etiqueta de vínculo]]<br />[[Título de página]]',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Título de la página|Texto del enlace]]<br />[[Título de la página]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Etiqueta de vínculo</a><br /><a href='#'>Título de página</a>",
'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',
@@ -7173,8 +7265,11 @@ $1:Ejemplo.jpg|Descripción2',
* @author WikedKentaur
*/
$messages['et'] = array(
+ 'wikieditor' => 'Vikiteksti laiendatud redigeerimisliides',
+ '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-tab' => 'Eelvaade',
'wikieditor-preview-changes-tab' => 'Muudatused',
'wikieditor-preview-loading' => 'Laadimine...',
@@ -7193,6 +7288,7 @@ $messages['et'] = array(
'wikieditor-template-editor-dialog-title' => 'Muuda malli',
'wikieditor-template-editor-dialog-submit' => 'Uuendus',
'wikieditor-template-editor-dialog-cancel' => 'Loobu',
+ 'wikieditor-templates-preference' => 'Luba mallide kokkulükkamine',
'wikieditor-toc-preference' => 'Kasuta navigeerimist võimaldavat sisukorda',
'wikieditor-toc-show' => 'Näita sisu',
'wikieditor-toc-hide' => 'Peida sisu',
@@ -7200,6 +7296,7 @@ $messages['et'] = array(
'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-hidesig' => 'Peida põhinimeruumi lehekülgedel allkirjanupp',
'wikieditor-toolbar-loading' => 'Laadimine...',
'wikieditor-toolbar-tool-bold' => 'Rasvane',
'wikieditor-toolbar-tool-bold-example' => 'Rasvane kiri',
@@ -7306,6 +7403,7 @@ $1:Näide.jpg|Pildiallkiri2',
'wikieditor-toolbar-tool-replace-search' => 'Otsitav:',
'wikieditor-toolbar-tool-replace-replace' => 'Asendaja:',
'wikieditor-toolbar-tool-replace-case' => 'Tõstutundlik',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Pea otsisõnet regulaaravaldiseks',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Otsi järgmine',
'wikieditor-toolbar-tool-replace-button-replace' => 'Asenda',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Asenda kõik',
@@ -7326,10 +7424,12 @@ $1:Näide.jpg|Pildiallkiri2',
'wikieditor-toolbar-characters-page-persian' => 'Pärsia',
'wikieditor-toolbar-characters-page-hebrew' => 'Heebrea',
'wikieditor-toolbar-characters-page-bangla' => 'Bengali',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamili',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singali',
'wikieditor-toolbar-characters-page-gujarati' => 'Gudžarati',
'wikieditor-toolbar-characters-page-thai' => 'Tai',
+ 'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmeeri',
'wikieditor-toolbar-section-help' => 'Abi',
'wikieditor-toolbar-help-heading-description' => 'Kirjeldus',
@@ -7376,7 +7476,7 @@ $1:Näide.jpg|Pildiallkiri2',
'wikieditor-toolbar-help-content-olist-syntax' => '# Loendi liige<br /># Loendi liige',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Loendi liige</li><li>Loendi liige</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Manusfail',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Näide.png|thumb|Pildiallkiri.]]',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Näide.png|thumb|Pildiallkiri]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Pildiallkiri' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='extensions/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Suurenda' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Pildiallkiri</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Viide',
'wikieditor-toolbar-help-content-reference-syntax' => 'Lehekülje tekst.&lt;ref name="test"&gt;[http://www.näide.ee Lingi tekst], täiendav tekst.&lt;/ref&gt;',
@@ -7649,7 +7749,7 @@ $messages['fa'] = array(
'wikieditor-previewDialog-preference' => 'Ùعال کردن پنجره‌های تعاملی پیش‌نمایش',
'wikieditor-previewDialog-tab' => 'پیش‌نمایش',
'wikieditor-previewDialog-loading' => 'در حال بارگذاری...',
- 'wikieditor-publish-preference' => 'Ùعال‌سازی انتشار قدم به قدم',
+ 'wikieditor-publish-preference' => 'Ùعال‌سازی انتشار گام‌به‌گام',
'wikieditor-publish-button-publish' => 'انتشار',
'wikieditor-publish-button-cancel' => 'لغو',
'wikieditor-publish-dialog-title' => 'انتشار در {{SITENAME}}',
@@ -7660,7 +7760,7 @@ $messages['fa'] = array(
'wikieditor-publish-dialog-goback' => 'بازگشت به عقب',
'wikieditor-template-editor-preference' => 'Ùعال‌سازی ویرایش مبتنی بر Ùرم الگوهای ویکی',
'wikieditor-template-editor-dialog-title' => 'ویرایش الگو',
- 'wikieditor-template-editor-dialog-submit' => 'به روز رسانی',
+ 'wikieditor-template-editor-dialog-submit' => 'به‌روزرسانی',
'wikieditor-template-editor-dialog-cancel' => 'لغو',
'wikieditor-templates-preference' => 'Ùعال‌سازی نهÙتن الگوها',
'wikieditor-toc-preference' => 'Ùعال‌سازی Ùهرست مطالب قابل پیمایش',
@@ -7670,9 +7770,9 @@ $messages['fa'] = array(
'wikieditor-toolbar-desc' => 'نوار ابزار ویرایش صÙحه با استÙاده‌پذیری بالاتر',
'wikieditor-toolbar-preference' => 'Ùعال‌کردن نوارابزار ویرایش پیشرÙته',
'wikieditor-toolbar-dialogs-preference' => 'Ùعال‌سازی پنجره‌های تعاملی برای وارد کردن پیوندها، جدول‌ها Ùˆ غیره',
- 'wikieditor-toolbar-hidesig' => 'نهÙتن دکمهٔ امضا از صÙحات در Ùضای نام اصلی',
+ 'wikieditor-toolbar-hidesig' => 'نهÙتن دکمهٔ امضا از صÙحه‌های Ùضای نام اصلی',
'wikieditor-toolbar-loading' => 'در حال بارگذاری...',
- 'wikieditor-toolbar-tool-bold' => 'ضخیم',
+ 'wikieditor-toolbar-tool-bold' => 'پررنگ',
'wikieditor-toolbar-tool-bold-example' => 'متن پررنگ',
'wikieditor-toolbar-tool-italic' => 'مورب',
'wikieditor-toolbar-tool-italic-example' => 'متن مورب',
@@ -7684,10 +7784,10 @@ $messages['fa'] = array(
'wikieditor-toolbar-tool-link-title' => 'اÙزودن پیوند',
'wikieditor-toolbar-tool-link-int' => 'به یک صÙحهٔ ویکی',
'wikieditor-toolbar-tool-link-int-target' => 'صÙحهٔ هد٠یا نشانی اینترنتی:',
- 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'عنوان صÙغحه یا نشانی اینترنتی',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'عنوان صÙحه یا نشانی اینترنتی',
'wikieditor-toolbar-tool-link-int-text' => 'متن برای نمایش:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'متنی که نمایش می‌یابد',
- 'wikieditor-toolbar-tool-link-ext' => 'به یک صÙحه وب خارج از ویکی',
+ 'wikieditor-toolbar-tool-link-ext' => 'به یک صÙحهٔ وب خارج از ویکی',
'wikieditor-toolbar-tool-link-ext-target' => 'نشانی اینترنتی پیوند:',
'wikieditor-toolbar-tool-link-ext-text' => 'متن پیوند:',
'wikieditor-toolbar-tool-link-insert' => 'اÙزودن پیوند',
@@ -7701,14 +7801,14 @@ $messages['fa'] = array(
'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-link-empty' => 'شما چیزی برای پیونددادن وارد نکردید.',
'wikieditor-toolbar-tool-file' => 'پروندهٔ جاسازی‌شده',
'wikieditor-toolbar-tool-file-example' => 'مثال.jpg',
'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-title' => 'اÙزودن منبع',
+ 'wikieditor-toolbar-tool-reference-insert' => 'اÙزودن',
'wikieditor-toolbar-tool-reference-text' => 'متن منبع',
'wikieditor-toolbar-tool-signature' => 'امضا و برچسب زمان',
'wikieditor-toolbar-section-advanced' => 'پیشرÙته',
@@ -7724,11 +7824,11 @@ $messages['fa'] = array(
'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-indent' => 'تورÙتگی',
+ 'wikieditor-toolbar-tool-indent-example' => 'خط تورÙته',
'wikieditor-toolbar-tool-nowiki' => 'نادیده‌گرÙتن قالب‌بندی ویکی',
'wikieditor-toolbar-tool-nowiki-example' => 'اینجا متن قالب‌بندی‌نشده وارد شود',
- 'wikieditor-toolbar-tool-redirect' => 'تغییر مسیر',
+ 'wikieditor-toolbar-tool-redirect' => 'تغییرمسیر',
'wikieditor-toolbar-tool-redirect-example' => 'نام صÙحه مقصد',
'wikieditor-toolbar-tool-big' => 'بزرگ',
'wikieditor-toolbar-tool-big-example' => 'متن بزرگ',
@@ -7738,7 +7838,7 @@ $messages['fa'] = array(
'wikieditor-toolbar-tool-superscript-example' => 'متن بالانویس',
'wikieditor-toolbar-tool-subscript' => 'زیرنویس',
'wikieditor-toolbar-tool-subscript-example' => 'متن زیرنویس',
- 'wikieditor-toolbar-group-insert' => 'اضاÙÙ‡ کردن',
+ 'wikieditor-toolbar-group-insert' => 'اÙزودن',
'wikieditor-toolbar-tool-gallery' => 'نگارخانهٔ تصویر',
'wikieditor-toolbar-tool-gallery-example' => '$1:مثال.jpg|عنوان ۱
$1:مثال.jpg|عنوان ۲',
@@ -7758,7 +7858,7 @@ $1:مثال.jpg|عنوان ۲',
| ردی٠۲، خانه ۳',
'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' => 'اÙزودن ردی٠سرتیتر',
@@ -7766,7 +7866,7 @@ $1:مثال.jpg|عنوان ۲',
'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' => 'اضاÙÙ‡ کردن جدولی با بیش از $1 خانه توسط این ابزار ممکن نیست.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'شما عدد درستی برای تعداد ردیÙ‌ها Ùˆ ستون‌ها وارد نکرده‌اید.',
@@ -7793,7 +7893,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-characters-page-greek' => 'یونانی',
'wikieditor-toolbar-characters-page-cyrillic' => 'سیریلیک',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
- 'wikieditor-toolbar-characters-page-arabicextended' => 'عربی توسعه یاÙته',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'عربی گسترش‌یاÙته',
'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبری',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
@@ -7817,10 +7917,10 @@ $1:مثال.jpg|عنوان ۲',
'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-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-description' => 'پررنگ و مورب',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''متن پررنگ و مورب'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>متن پررنگ و مورب</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'پیوند داخلی',
@@ -7848,12 +7948,12 @@ $1:مثال.jpg|عنوان ۲',
'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-syntax' => '[[$1:مثال.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='extensions/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;',
'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='#'>متن پیوند</a>ØŒ متن اضاÙÛŒ.</li></ol>",
@@ -7861,9 +7961,9 @@ $1:مثال.jpg|عنوان ۲',
'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>',
+ '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>',
);
/** Finnish (Suomi)
@@ -8106,6 +8206,7 @@ $1:Esimerkki.jpg|Kuvateksti2',
);
/** French (Français)
+ * @author Cquoi
* @author Crochet.david
* @author Gomoko
* @author IAlex
@@ -8278,6 +8379,7 @@ $1:Exemple.jpg|Description 2',
'wikieditor-toolbar-characters-page-persian' => 'persan',
'wikieditor-toolbar-characters-page-hebrew' => 'hébreu',
'wikieditor-toolbar-characters-page-bangla' => 'bengalî',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamoul',
'wikieditor-toolbar-characters-page-telugu' => 'télougou',
'wikieditor-toolbar-characters-page-sinhala' => 'cingalais',
'wikieditor-toolbar-characters-page-gujarati' => 'gujarâtî',
@@ -8998,6 +9100,7 @@ $1:Example.jpg|Pé_de_foto_2',
'wikieditor-toolbar-characters-page-persian' => 'Persa',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebreo',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalí',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Támil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugú',
'wikieditor-toolbar-characters-page-sinhala' => 'Cingalés',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -9205,21 +9308,21 @@ $messages['gsw'] = array(
'wikieditor-toolbar-tool-bold-example' => 'Tekscht fätt',
'wikieditor-toolbar-tool-italic' => 'Kursiv',
'wikieditor-toolbar-tool-italic-example' => 'Tekscht kursiv',
- 'wikieditor-toolbar-tool-ilink' => 'Intärn Gleich (Link)',
+ 'wikieditor-toolbar-tool-ilink' => 'Intärne Link',
'wikieditor-toolbar-tool-ilink-example' => 'Gleichtitel',
- 'wikieditor-toolbar-tool-xlink' => 'Extärn Gleich (Link) (dänk an s Präfix http://)',
+ 'wikieditor-toolbar-tool-xlink' => 'Extärne Link (dänk an s Präfix http://)',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.byschpil.com Gleichtitel',
- 'wikieditor-toolbar-tool-link' => 'Gleich',
- 'wikieditor-toolbar-tool-link-title' => 'Gleich yysetze',
+ 'wikieditor-toolbar-tool-link' => 'Link',
+ 'wikieditor-toolbar-tool-link-title' => 'Link yysetze',
'wikieditor-toolbar-tool-link-int' => 'Zuen eme Wikiartikel/ere Wikisyte',
'wikieditor-toolbar-tool-link-int-target' => 'Artikeltitel:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sytename oder URL',
'wikieditor-toolbar-tool-link-int-text' => 'Gleichtext:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Text yygee, wu soll aazeigt wäre',
'wikieditor-toolbar-tool-link-ext' => 'Zuen ere extärne Netzsyte',
- 'wikieditor-toolbar-tool-link-ext-target' => 'Gleich-URL:',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'URL-Link:',
'wikieditor-toolbar-tool-link-ext-text' => 'Gleichtext:',
- 'wikieditor-toolbar-tool-link-insert' => 'Gleich yysetze',
+ 'wikieditor-toolbar-tool-link-insert' => 'Link yysetze',
'wikieditor-toolbar-tool-link-cancel' => 'Abbräche',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Syte git s scho',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Syte git s nit',
@@ -9227,10 +9330,10 @@ $messages['gsw'] = array(
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Extärne Link',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Am Priefe, eb s Syte git ...',
'wikieditor-toolbar-tool-link-int-invalid' => 'Dr Titel, wu Du aagee hesch, isch nit giltig.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'D URL, wu Du yygee hesch, siht uus wie ne Gleich zuen ere andre Wikisyte.
-Wettsch e intärn Gleich setze?',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intärn Gleich (Link)',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Extärn Gleich (Link)',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'D URL, wu Du yygee hesch, siht uus wie ne Link zuen ere andre Wikisyte.
+Wettsch e intärne Link setze?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intärne Link',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Extärne Link',
'wikieditor-toolbar-tool-link-empty' => 'Du hesch nyt yygee, wu druf cha verwise wäre.',
'wikieditor-toolbar-tool-file' => 'Yygfiegti Datei',
'wikieditor-toolbar-tool-file-example' => 'Byschpil.jpg',
@@ -9308,6 +9411,7 @@ $1:Byschpil.jpg|Bschriftig2',
'wikieditor-toolbar-tool-replace-case' => 'Groß- un Chleibuechstabe unterscheide',
'wikieditor-toolbar-tool-replace-regex' => 'D Zeichechette wu gsuecht soll wäre as reguläre Uusdruck versueche',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Negschti sueche',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Ersetze',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alli ersetze',
'wikieditor-toolbar-tool-replace-close' => 'Zuemache',
'wikieditor-toolbar-tool-replace-nomatch' => 'Zue Dyyre Suech git s kei Träffer.',
@@ -9326,6 +9430,7 @@ $1:Byschpil.jpg|Bschriftig2',
'wikieditor-toolbar-characters-page-persian' => 'Persisch',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebräisch',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalisch',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilisch',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singhalesisch',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -9337,7 +9442,7 @@ $1:Byschpil.jpg|Bschriftig2',
'wikieditor-toolbar-help-heading-syntax' => 'Was Du schrybsch',
'wikieditor-toolbar-help-heading-result' => 'Was Du derby kriegsch',
'wikieditor-toolbar-help-page-format' => 'Formatiere',
- 'wikieditor-toolbar-help-page-link' => 'Gleicher (Links)',
+ 'wikieditor-toolbar-help-page-link' => 'Links',
'wikieditor-toolbar-help-page-heading' => 'Iberschrifte',
'wikieditor-toolbar-help-page-list' => 'Lischte',
'wikieditor-toolbar-help-page-file' => 'Dateie',
@@ -9352,10 +9457,10 @@ $1:Byschpil.jpg|Bschriftig2',
'wikieditor-toolbar-help-content-bolditalic-description' => 'Fett &amp; kursiv',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Fette &amp; kursive Tekscht'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Fette &amp; kursive Tekscht</em></strong>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'Intärn Gleich (Link)',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Intärne Link',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Page title|Gleichname]]<br />[[Page title]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Gleichname</a><br /><a href='#'>Sytetitel</a>",
- 'wikieditor-toolbar-help-content-xlink-description' => 'Extärn Gleich (Link)',
+ 'wikieditor-toolbar-help-content-xlink-description' => 'Extärne Link',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.byschpil.org Gleichname]<br />[http://www.byschpil.org]<br />http://www.byschpil.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Gleichname</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.byschpil.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => 'Iberschrift 2. Ebeni',
@@ -9400,6 +9505,8 @@ $1:Byschpil.jpg|Bschriftig2',
* @author Sushant savla
*/
$messages['gu'] = array(
+ 'wikieditor' => 'ઉચà«àªš વિકિલખાણ ફેરફાર દેખાવ',
+ 'wikieditor-desc' => 'વિસà«àª¤à«ƒàª¤ વિકિલખાણ દેખાવ અને ઘણી સà«àªµàª¿àª§àª¾àª“ વાળા મોડà«àª¯à«àª²à«àª¸ પૂરા પાડે છે',
'wikieditor-wikitext-tab' => 'વિકિલેખન (વિકિટેકà«àª¸à«àªŸ)‌',
'wikieditor-loading' => 'લવાઇ રહà«àª¯à«àª‚ છે...',
'wikieditor-preview-preference' => 'બાજà«àª®àª¾àª‚ પà«àª¨:અવલોકન ચાલૠરાખો',
@@ -9413,20 +9520,24 @@ $messages['gu'] = array(
'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-desc' => 'પૃષà«àª àª¨àª¾ ફેરફાર સાધનો ને વધારેલ વપરાશ સાધનો ધરાવતી પેટી ઉમેરી મà«àª•à«‹',
'wikieditor-toolbar-preference' => 'અદà«àª¯àª¤àª¨ સંપાદન સાધનો સકà«àª°à«€àª¯ કરો',
'wikieditor-toolbar-dialogs-preference' => 'કડીઓ, કોઠા અને અનà«àª¯ વસà«àª¤à«àª“ ઉમેરવા સંભાષણ સકà«àª°à«€àª¯ કરો',
+ 'wikieditor-toolbar-hidesig' => 'મà«àª–à«àª¯ નામ સà«àª¥àª³ પરના પાના પરથી હસà«àª¤àª¾àª•à«àª·àª° બટન હટાવો',
'wikieditor-toolbar-loading' => 'લવાઇ રહà«àª¯à«àª‚ છે...',
'wikieditor-toolbar-tool-bold' => 'ઘાટà«àª‚',
'wikieditor-toolbar-tool-bold-example' => 'ઘાટà«àª‚ લખાણ',
@@ -9454,12 +9565,15 @@ $messages['gu'] = array(
'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-lookslikeinternal-ext' => 'બાહà«àª¯ કડી',
'wikieditor-toolbar-tool-link-empty' => 'તમે શોધવા માટે કંઈ દાખલ કરà«àª¯à«àª‚ નથી.',
'wikieditor-toolbar-tool-file' => 'અંદર વણાયેલી (Embedded) ફાઇલ',
'wikieditor-toolbar-tool-file-example' => 'Example.jpg (ઉદાહરણ)',
'wikieditor-toolbar-tool-reference' => 'સંદરà«àª­',
+ 'wikieditor-toolbar-tool-reference-example' => 'પૃષà«àª àª¨à«€ નીચેના પાયામાં લખવાનà«àª‚ લેખન અહીં લખો',
'wikieditor-toolbar-tool-reference-cancel' => 'રદ કરો',
'wikieditor-toolbar-tool-reference-title' => 'સંદરà«àª­ ઉમેરો',
'wikieditor-toolbar-tool-reference-insert' => 'ઉમેરો',
@@ -9530,6 +9644,7 @@ $1:Example.jpg|Caption2',
'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-button-replace' => 'બદલો',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'બધા બદલો',
@@ -9580,6 +9695,8 @@ $1:Example.jpg|Caption2',
'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 Link label]<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>',
@@ -9600,13 +9717,18 @@ $1:Example.jpg|Caption2',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>વસà«àª¤à« યાદી</li><li>વસà«àª¤à« યાદી</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'અંદર વણાયેલી (Embedded) ફાઇલ',
'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='extensions/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>Caption text</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;',
'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.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>) 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>',
@@ -10018,6 +10140,7 @@ $1:דוגמה.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-telugu' => 'טלוגו',
'wikieditor-toolbar-characters-page-sinhala' => 'סינהלה',
'wikieditor-toolbar-characters-page-gujarati' => "גוג'רטית",
@@ -10090,6 +10213,7 @@ $1:דוגמה.jpg|כותרת 2',
/** Hindi (हिनà¥à¤¦à¥€)
* @author Ansumang
* @author Pooja.srivastava
+ * @author Siddhartha Ghai
*/
$messages['hi'] = array(
'wikieditor' => 'उनà¥à¤¨à¤¤ विकितेकà¥à¤·à¥à¤¤à¥ संपादन इनà¥à¤¤à¥‡à¤°à¥à¤«à¤šà¥‡',
@@ -10105,7 +10229,7 @@ $messages['hi'] = 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-minor' => 'छोटा संपादन',
'wikieditor-publish-dialog-watch' => 'इस पृषà¥à¤  पे धà¥à¤¯à¤¾à¤¨ रखेà¤',
@@ -10711,6 +10835,7 @@ $1:Example.jpg|Popis2',
'wikieditor-toolbar-characters-page-persian' => 'Persiske',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebrejske',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalšćina',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilšćina',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singalezišćina',
'wikieditor-toolbar-characters-page-gujarati' => 'Gudźarati',
@@ -11399,6 +11524,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-characters-page-persian' => 'Persiano',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebreo',
'wikieditor-toolbar-characters-page-bangla' => 'Bengali',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -11798,18 +11924,18 @@ $messages['ig'] = array(
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'wikieditor' => 'Antenamo a wikitext a panagurnos nga interface',
+ 'wikieditor' => 'Napasayaat a wikitext a panagurnos ti interface',
'wikieditor-desc' => 'Agisagana ti maipadakkel a wikitext a panagurnos nga interface ken adu pay kadagiti agisagana ti langa a module',
'wikieditor-wikitext-tab' => 'Wikitext',
'wikieditor-loading' => 'Agkarkarga...',
- 'wikieditor-preview-preference' => 'Pakabaelan na ti bangir-babaen-bangir a panagpadas',
+ 'wikieditor-preview-preference' => 'Pakabaelan na ti agsumbangir a panagpadas',
'wikieditor-preview-tab' => 'Ipadas',
'wikieditor-preview-changes-tab' => 'Dagiti sinukatan',
'wikieditor-preview-loading' => 'Agkarkarga...',
'wikieditor-previewDialog-preference' => 'Pakabaelan ti panagsarsarita ti panagpadas',
'wikieditor-previewDialog-tab' => 'Ipadas',
'wikieditor-previewDialog-loading' => 'Agkarkarga...',
- 'wikieditor-publish-preference' => 'Pakabaelan ti addang-babaen-addang a panagipablaak',
+ 'wikieditor-publish-preference' => 'Pakabaelan ti naiyaddang a panagipablaak',
'wikieditor-publish-button-publish' => 'Ipablaak',
'wikieditor-publish-button-cancel' => 'Ukasen',
'wikieditor-publish-dialog-title' => 'Ipabablaak idiay {{SITENAME}}',
@@ -11833,9 +11959,9 @@ $messages['ilo'] = array(
'wikieditor-toolbar-hidesig' => 'Ilemmeng ti pirma a buton manipud kadagidiay panid iti umuna a nagan ti lugar',
'wikieditor-toolbar-loading' => 'Agkarkarga...',
'wikieditor-toolbar-tool-bold' => 'Napuskol',
- 'wikieditor-toolbar-tool-bold-example' => 'Napuskol a teksto',
+ 'wikieditor-toolbar-tool-bold-example' => 'Napuskol a testo',
'wikieditor-toolbar-tool-italic' => 'Agir-irig',
- 'wikieditor-toolbar-tool-italic-example' => 'Nakairig a teksto',
+ 'wikieditor-toolbar-tool-italic-example' => 'Nakairig a testo',
'wikieditor-toolbar-tool-ilink' => 'Akin-uneg a panilpo',
'wikieditor-toolbar-tool-ilink-example' => 'Titulo ti panilpo',
'wikieditor-toolbar-tool-xlink' => 'Akinruar a panilpo (laglagipen ti http:// a prefix)',
@@ -11845,11 +11971,11 @@ $messages['ilo'] = array(
'wikieditor-toolbar-tool-link-int' => 'Iti panid a wiki',
'wikieditor-toolbar-tool-link-int-target' => 'Puntaan a panid wenno URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titulo ti panid wenno URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'Teksto nga iparang:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Teksto nga iparang',
+ 'wikieditor-toolbar-tool-link-int-text' => 'Testo nga iparang:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Testo nga iparang',
'wikieditor-toolbar-tool-link-ext' => 'Idiay akin-uneg a panid ti sapot',
'wikieditor-toolbar-tool-link-ext-target' => 'Isilpo ti URL:',
- 'wikieditor-toolbar-tool-link-ext-text' => 'Isilpo ti teksto:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Isilpo ti testo:',
'wikieditor-toolbar-tool-link-insert' => 'Isengngat ti panilpo',
'wikieditor-toolbar-tool-link-cancel' => 'Ukasen',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Addaan ti panid',
@@ -11866,11 +11992,11 @@ Kayatmo mga aramiden nga akin-uneg a panilpo?',
'wikieditor-toolbar-tool-file' => 'Naisengngat a papeles',
'wikieditor-toolbar-tool-file-example' => 'Kas pagarigan.jpg',
'wikieditor-toolbar-tool-reference' => 'Pinagibasaran',
- 'wikieditor-toolbar-tool-reference-example' => 'Isengngat ti paammo ti baba a teksto ditoy',
+ 'wikieditor-toolbar-tool-reference-example' => 'Isengngat ti paammo ti baba a testo ditoy',
'wikieditor-toolbar-tool-reference-cancel' => 'Ukasen',
'wikieditor-toolbar-tool-reference-title' => 'Isengngat ti pinagibasaran',
'wikieditor-toolbar-tool-reference-insert' => 'Isengngat',
- 'wikieditor-toolbar-tool-reference-text' => 'Teksto ti pinagibasaran',
+ 'wikieditor-toolbar-tool-reference-text' => 'Testo ti pinagibasaran',
'wikieditor-toolbar-tool-signature' => 'Pirma, petsa ken oras',
'wikieditor-toolbar-section-advanced' => 'Antenamo',
'wikieditor-toolbar-tool-heading' => 'Paulo',
@@ -11879,7 +12005,7 @@ Kayatmo mga aramiden nga akin-uneg a panilpo?',
'wikieditor-toolbar-tool-heading-3' => 'Agpang 3',
'wikieditor-toolbar-tool-heading-4' => 'Agpang 4',
'wikieditor-toolbar-tool-heading-5' => 'Agpang 5',
- 'wikieditor-toolbar-tool-heading-example' => 'Teksto ti paulo',
+ 'wikieditor-toolbar-tool-heading-example' => 'Testo ti paulo',
'wikieditor-toolbar-group-format' => 'Pormat',
'wikieditor-toolbar-tool-ulist' => 'Punglo a listaan',
'wikieditor-toolbar-tool-ulist-example' => 'Punglo a listaan ti banag',
@@ -11888,17 +12014,17 @@ Kayatmo mga aramiden nga akin-uneg a panilpo?',
'wikieditor-toolbar-tool-indent' => 'Lennekan',
'wikieditor-toolbar-tool-indent-example' => 'Nalennekan a linia',
'wikieditor-toolbar-tool-nowiki' => 'Saan a pormaen a kas wiki',
- 'wikieditor-toolbar-tool-nowiki-example' => 'Mangisuldong iti saan a nabuklan a teksto ditoy',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Mangisuldong iti saan a nabuklan a testo ditoy',
'wikieditor-toolbar-tool-redirect' => 'Baw-ing',
'wikieditor-toolbar-tool-redirect-example' => 'Nagan ti puntaan a panid',
'wikieditor-toolbar-tool-big' => 'Dakkel',
- 'wikieditor-toolbar-tool-big-example' => 'Dakkel a teksto',
+ 'wikieditor-toolbar-tool-big-example' => 'Dakkel a testo',
'wikieditor-toolbar-tool-small' => 'Bassit',
- 'wikieditor-toolbar-tool-small-example' => 'Bassit a teksto',
+ 'wikieditor-toolbar-tool-small-example' => 'Bassit a testo',
'wikieditor-toolbar-tool-superscript' => 'Superscript',
- 'wikieditor-toolbar-tool-superscript-example' => 'Teksto ti superscript',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Testo ti superscript',
'wikieditor-toolbar-tool-subscript' => 'Subscript',
- 'wikieditor-toolbar-tool-subscript-example' => 'Teksto ti subscript',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Testo ti subscript',
'wikieditor-toolbar-group-insert' => 'Isengngat',
'wikieditor-toolbar-tool-gallery' => 'Palko ti retrato',
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Naisurat1
@@ -11914,16 +12040,16 @@ $1:Example.jpg|Naisurat2',
| aray 1, cell 2
| aray 1, cell 3
|-
-| aray2, cell 1
-| aray2, cell 2
+| aray 2, cell 1
+| aray 2, cell 2
| aray 2, cell 3',
- 'wikieditor-toolbar-tool-table-example-cell-text' => 'Teksto ti cell',
- 'wikieditor-toolbar-tool-table-example-header' => 'Teksto ti paulo',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Testo ti cell',
+ 'wikieditor-toolbar-tool-table-example-header' => 'Testo ti paulo',
'wikieditor-toolbar-tool-table-title' => 'Isengngat ti tabla',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Ar-aray:',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Tuk-tukol:',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Agnayon to paulo nga aray',
- 'wikieditor-toolbar-tool-table-wikitable' => 'Estilo nga addaan kadagit pagbeddengan',
+ 'wikieditor-toolbar-tool-table-wikitable' => 'Estilo nga addaan kadagiti pagbeddengan',
'wikieditor-toolbar-tool-table-sortable' => 'Aramiden ti tabla tapno mabalin a mailasin',
'wikieditor-toolbar-tool-table-example' => 'Kas pagarigan',
'wikieditor-toolbar-tool-table-preview' => 'Ipadas',
@@ -11946,17 +12072,17 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-tool-replace-success' => '$1 ti naaramid a nasukatan.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Awan ti ikabil mo a biruken.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ti kadawyan a panangisao nga inkabil mo ket imbalido: $1',
- 'wikieditor-toolbar-section-characters' => 'Dagiti napagpagruna a karakter',
- 'wikieditor-toolbar-characters-page-latin' => 'Latin',
- 'wikieditor-toolbar-characters-page-latinextended' => 'Latin napaatiddog',
+ 'wikieditor-toolbar-section-characters' => 'Dagiti naipangpangruna a karakter',
+ 'wikieditor-toolbar-characters-page-latin' => 'Latino',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Latino napaatiddog',
'wikieditor-toolbar-characters-page-ipa' => 'IPA',
- 'wikieditor-toolbar-characters-page-symbols' => 'Dagiti tanda',
+ 'wikieditor-toolbar-characters-page-symbols' => 'Dagiti simbolo',
'wikieditor-toolbar-characters-page-greek' => 'Griego',
- 'wikieditor-toolbar-characters-page-cyrillic' => 'Cyrillic',
- 'wikieditor-toolbar-characters-page-arabic' => 'Arabic',
- 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabic a napaatiddog',
- 'wikieditor-toolbar-characters-page-persian' => 'Persian',
- 'wikieditor-toolbar-characters-page-hebrew' => 'Hebrew',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'Kiriliko',
+ 'wikieditor-toolbar-characters-page-arabic' => 'Arabiko',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabiko a napaatiddog',
+ 'wikieditor-toolbar-characters-page-persian' => 'Persiano',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'Hebreo',
'wikieditor-toolbar-characters-page-bangla' => 'Bangla',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
@@ -11976,14 +12102,14 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-help-page-reference' => 'Pinagibasaran',
'wikieditor-toolbar-help-page-discussion' => 'Pagtungtongan',
'wikieditor-toolbar-help-content-italic-description' => 'Naka-irig',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''Naka-irig a teksto''",
- 'wikieditor-toolbar-help-content-italic-result' => '<em>Naka-irig a teksto</em>',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Naka-irig a testo''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>Naka-irig a testo</em>',
'wikieditor-toolbar-help-content-bold-description' => 'Napuskol',
'wikieditor-toolbar-help-content-bold-syntax' => "'''Napuskol a teksto'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>Napuskol a teksto</strong>',
- 'wikieditor-toolbar-help-content-bolditalic-description' => 'Napuskol&amp; nakairig',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Napuskol &amp; nakairig a teksto'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Nauskol &amp; nakairig a teksto</em></strong>',
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Napuskol a testo</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'Napuskol &amp; nakairig',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Napuskol &amp; nakairig a testo'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Napuskol &amp; nakairig a testo</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Akin-uneg a panilpo',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Titulo ti panid|Etiketa ti panilpo]]<br />[[Titulo ti panid]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Etiketa ti panilpo</a><br /><a href='#'>Titulo ti panid</a>",
@@ -11991,17 +12117,17 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Etiketa ti panilpo]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Etiketa ti panilpo</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' => 'Maika-2 nga agpang a paulo',
- 'wikieditor-toolbar-help-content-heading2-syntax' => '== Teksto ti paulo ==',
- 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Teksto ti paulo</h2>',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Testo ti paulo ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Testo ti paulo</h2>',
'wikieditor-toolbar-help-content-heading3-description' => 'Maika-3 nga agpang a paulo',
- 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Teksto ti paulo ===',
- 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Teksto ti paulo</h3>',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Testo ti paulo ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Testo ti paulo</h3>',
'wikieditor-toolbar-help-content-heading4-description' => 'Maika-4 nga agpang a paulo',
- 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Teksto ti paulo ====',
- 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Teksto ti paulo</h4>',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Testo ti paulo ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Testo ti paulo</h4>',
'wikieditor-toolbar-help-content-heading5-description' => 'Maika-5 nga agpang a paulo',
- 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Teksto ti paulo =====',
- 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Teksto ti paulo</h5>',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Testo ti paulo =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Testo ti paulo</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Punglo a listaan',
'wikieditor-toolbar-help-content-ulist-syntax' => '* Ilista ti banag<br />* Ilista ti banag',
'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Ilista ti banag</li><li>Ilista ti banag</li></ul>',
@@ -12009,22 +12135,22 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-help-content-olist-syntax' => '# Ilista ti banag<br /># Ilista ti banag',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Ilista ti banag</li><li>Ilista ti banag</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Naisengngat a papeles',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Naisurat a tekstot]]',
- 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Naisurat a teksto' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='extensions/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Padakkelen' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Naisurat a teksto</div></div>",
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Naisurat a testo]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Naisurat a testo' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='extensions/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Padakkelen' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Naisurat a testo</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Pinagibasaran',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Teksto ti panid.&lt;ref name="test"&gt;[http://www.example.org Teksto ti panilpo], nainayon a teksto.&lt;/ref&gt;',
- 'wikieditor-toolbar-help-content-reference-result' => "Teksto ti panid.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Testo ti panid.&lt;ref name="test"&gt;[http://www.example.org Testo ti panilpo], nainayon a testo.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Testo ti panid.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => 'Nainayon a panagusar ti agpada pinagibasaran',
- 'wikieditor-toolbar-help-content-rereference-result' => "Teksto ti panid.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-result' => "Testo ti panid.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'Iparang dagiti pinagibasaran',
- '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='#'>Teksto ti panilpo</a>, nainayon a teksto.</li></ol>",
+ '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='#'>Testo ti panilpo</a>, nainayon a testo.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Ti pirmam nga addaan ti oras ken petsa',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nagan ti agar-aramat</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>) 15:54, 10 Hunio 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Pirma',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Nagan ti agar-aramat</a> (<a href='#' title='{{#special:mytalk}}'>patang</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Lennekan',
- 'wikieditor-toolbar-help-content-indent-syntax' => 'Kadawyana teksto<br />:Nalennekan a teksto<br />::Nalennekan a teksto',
- 'wikieditor-toolbar-help-content-indent-result' => 'Kadawyan ateksto<dl><dd>Nalennekan a teksto<dl><dd>Nalennekan a teksto</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Kadawyan a testo<br />:Nalennekan a testo<br />::Nalennekan a testo',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Kadawyan a testo<dl><dd>Nalennekan a testo<dl><dd>Nalennekan a testo</dd></dl></dd></dl>',
);
/** Ingush (ГІалгІай Ğalğaj)
@@ -12110,14 +12236,30 @@ $messages['io'] = array(
/** Icelandic (Ãslenska)
* @author Krun
* @author Maxí
+ * @author Snævar
*/
$messages['is'] = array(
'wikieditor-wikitext-tab' => 'Wiki-texti',
'wikieditor-loading' => 'Hleður...',
'wikieditor-preview-tab' => 'Forskoða',
'wikieditor-preview-changes-tab' => 'Breytingar',
+ 'wikieditor-preview-loading' => 'Hleð...',
+ 'wikieditor-previewDialog-tab' => 'Forskoða',
+ 'wikieditor-previewDialog-loading' => 'Hleð...',
+ 'wikieditor-publish-button-publish' => 'Útgefa',
'wikieditor-publish-button-cancel' => 'Hætta við',
+ 'wikieditor-publish-dialog-title' => 'Útgefa á {{SITENAME}}',
+ 'wikieditor-publish-dialog-summary' => 'Breytingarágrip (lýstu stuttlega þeim breytingum sem þú hefur gert):',
+ 'wikieditor-publish-dialog-minor' => 'Minniháttar breyting',
+ 'wikieditor-publish-dialog-watch' => 'Vakta þessa síðu',
+ 'wikieditor-publish-dialog-publish' => 'Útgefa',
+ 'wikieditor-publish-dialog-goback' => 'Fara til baka',
+ 'wikieditor-template-editor-dialog-submit' => 'Uppfæra',
'wikieditor-template-editor-dialog-cancel' => 'Hætta við',
+ 'wikieditor-toc-show' => 'Sýna efnisyfirlit',
+ 'wikieditor-toc-hide' => 'Fela efnisyfirlit',
+ 'wikieditor-toolbar-hidesig' => 'Fela undirskriftar hnappinn á síðum í aðalnafnrými',
+ 'wikieditor-toolbar-loading' => 'Hleð...',
'wikieditor-toolbar-tool-bold' => 'Feitletrað',
'wikieditor-toolbar-tool-bold-example' => 'Feitletraður texti',
'wikieditor-toolbar-tool-italic' => 'Skáletrað',
@@ -12134,26 +12276,63 @@ $messages['is'] = array(
'wikieditor-toolbar-tool-link-int-text' => 'Texti til birtingar:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Texti sem á að birta',
'wikieditor-toolbar-tool-link-ext' => 'à ytri vefsíðu',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'Vefslóð tengils:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Texti tengils:',
+ 'wikieditor-toolbar-tool-link-insert' => 'Settu inn tengil',
'wikieditor-toolbar-tool-link-cancel' => 'Hætta við',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Síða er til',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Síðan er ekki til',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ógildur titill',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ytri tengill',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Athuga hvort síðan sé til...',
'wikieditor-toolbar-tool-link-int-invalid' => 'Titillinn sem þú gafst upp er ógildur.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Slóðin sem þú gafst upp lítur út eins og hún hafi verið ætluð til að tengja í aðra wiki-síðu.
Viltu gera hana að innri tengli?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Innri tengill',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ytri tengill',
'wikieditor-toolbar-tool-link-empty' => 'Þú slóst ekki inn neitt til að tengja í.',
+ 'wikieditor-toolbar-tool-file' => 'Bæta við mynd',
'wikieditor-toolbar-tool-file-example' => 'Sýnishorn.jpg',
+ 'wikieditor-toolbar-tool-reference' => 'Tilvísanir',
+ 'wikieditor-toolbar-tool-reference-example' => 'Settu tilvísunina hér',
'wikieditor-toolbar-tool-reference-cancel' => 'Hætta við',
+ 'wikieditor-toolbar-tool-reference-title' => 'Setja inn tilvísun',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Setja inn',
+ 'wikieditor-toolbar-tool-reference-text' => 'Tilvísunar texti',
+ 'wikieditor-toolbar-tool-signature' => 'Undirskrift og tímasetning',
'wikieditor-toolbar-section-advanced' => 'Ãtarlegt',
+ 'wikieditor-toolbar-tool-heading' => 'Fyrirsagnir',
+ 'wikieditor-toolbar-tool-heading-1' => '1 stig',
+ 'wikieditor-toolbar-tool-heading-2' => '2 stig',
+ 'wikieditor-toolbar-tool-heading-3' => '3 stig',
+ 'wikieditor-toolbar-tool-heading-4' => '4 stig',
+ 'wikieditor-toolbar-tool-heading-5' => '5 stig',
+ 'wikieditor-toolbar-tool-heading-example' => 'Fyrirsagnartexti',
+ 'wikieditor-toolbar-group-format' => 'Útlitsmótun',
+ 'wikieditor-toolbar-tool-ulist' => 'Punktalisti',
+ 'wikieditor-toolbar-tool-ulist-example' => 'Atriði í punktalista',
+ 'wikieditor-toolbar-tool-olist' => 'Tölusettur listi',
+ 'wikieditor-toolbar-tool-olist-example' => 'Tölusett atriði',
+ 'wikieditor-toolbar-tool-indent' => 'Inndráttur',
+ 'wikieditor-toolbar-tool-indent-example' => 'Inndregin lína',
+ 'wikieditor-toolbar-tool-nowiki' => 'Engin wiki stílviðmið',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Setjið inn ósniðinn texta hér',
+ 'wikieditor-toolbar-tool-redirect' => 'Tilvísun',
+ 'wikieditor-toolbar-tool-redirect-example' => 'Nafn síðu sem tilvísunin beinist að',
'wikieditor-toolbar-tool-big' => 'Stór',
'wikieditor-toolbar-tool-big-example' => 'Stór texti',
'wikieditor-toolbar-tool-small' => 'Lítill',
'wikieditor-toolbar-tool-small-example' => 'Lítill texti',
+ 'wikieditor-toolbar-tool-superscript' => 'Yfirskrift',
+ 'wikieditor-toolbar-tool-superscript-example' => 'texti í yfirskrift',
+ 'wikieditor-toolbar-tool-subscript' => 'Niðurskrift',
+ 'wikieditor-toolbar-tool-subscript-example' => 'texti í niðurskrift',
'wikieditor-toolbar-group-insert' => 'Setja inn',
+ 'wikieditor-toolbar-tool-gallery' => 'Mynda safn',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Myndlýsing1
+$1:Example.jpg|Myndlýsing2',
'wikieditor-toolbar-tool-newline' => 'Ný lína',
- 'wikieditor-toolbar-tool-table' => 'Tafla',
+ 'wikieditor-toolbar-tool-table' => 'Töflu',
'wikieditor-toolbar-tool-table-example-old' => '-
! titill 1
! titill 2
@@ -12166,13 +12345,34 @@ Viltu gera hana að innri tengli?',
| röð 2, reitur 1
| röð 2, reitur 2
| röð 2, reitur 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Texti reitar',
+ 'wikieditor-toolbar-tool-table-example-header' => 'Texti raðar',
+ 'wikieditor-toolbar-tool-table-title' => 'Setja inn töflu',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Raðir',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Dálkar',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Bæta titilröð við',
+ 'wikieditor-toolbar-tool-table-sortable' => 'Gera töfluna raðanlega',
'wikieditor-toolbar-tool-table-example' => 'Dæmi',
'wikieditor-toolbar-tool-table-preview' => 'Forskoðun',
+ 'wikieditor-toolbar-tool-table-insert' => 'Setja inn',
'wikieditor-toolbar-tool-table-cancel' => 'Hætta við',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ekki er hægt að búa til töflu með fleiri en $1 reiti með þessari valmynd.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Ógildur fjöldi raða eða reita.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Taflan getur ekki innihaldið núll raðir eða reiti.',
+ 'wikieditor-toolbar-tool-replace' => 'Leita og skipta út',
+ 'wikieditor-toolbar-tool-replace-title' => 'Leita og skipta út',
+ 'wikieditor-toolbar-tool-replace-search' => 'Leitarstrengur:',
+ 'wikieditor-toolbar-tool-replace-replace' => 'Skipta út fyrir:',
+ 'wikieditor-toolbar-tool-replace-case' => 'Sama stafsetur',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Meðhöndla leitarorð sem reglulega segð',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Finna næstu',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Skipta út',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Skipta út öllum',
+ 'wikieditor-toolbar-tool-replace-close' => 'Loka',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Engar niðurstöður fundust.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 útskiptingar gerðar.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Þú slóst ekki inn neitt til að leita að.',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'Ógild regluleg segð: $1',
'wikieditor-toolbar-section-characters' => 'Sérstafir',
'wikieditor-toolbar-characters-page-latin' => 'Latneskt',
'wikieditor-toolbar-characters-page-latinextended' => 'Aukið latneskt',
@@ -12181,6 +12381,7 @@ Viltu gera hana að innri tengli?',
'wikieditor-toolbar-characters-page-greek' => 'Grískt',
'wikieditor-toolbar-characters-page-cyrillic' => 'Kýrillískt',
'wikieditor-toolbar-characters-page-arabic' => 'Arabískt',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Aukið arabískt',
'wikieditor-toolbar-characters-page-persian' => 'Persneskt',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebreskt',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalskt',
@@ -12192,10 +12393,11 @@ Viltu gera hana að innri tengli?',
'wikieditor-toolbar-help-heading-description' => 'Lýsing',
'wikieditor-toolbar-help-heading-syntax' => 'Það sem þú skrifar',
'wikieditor-toolbar-help-heading-result' => 'Það sem kemur út',
+ 'wikieditor-toolbar-help-page-format' => 'Stílviðmið',
'wikieditor-toolbar-help-page-link' => 'Tenglar',
'wikieditor-toolbar-help-page-heading' => 'Fyrirsagnir',
'wikieditor-toolbar-help-page-list' => 'Listar',
- 'wikieditor-toolbar-help-page-file' => 'Skrár',
+ 'wikieditor-toolbar-help-page-file' => 'Myndir',
'wikieditor-toolbar-help-page-reference' => 'Heimildir',
'wikieditor-toolbar-help-page-discussion' => 'Umræða',
'wikieditor-toolbar-help-content-italic-description' => 'Skáletrað',
@@ -12225,8 +12427,29 @@ Viltu gera hana að innri tengli?',
'wikieditor-toolbar-help-content-heading5-description' => '5. stigs fyrirsögn',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Fyrirsögn =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Fyrirsögn</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Punktalisti',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Lista atriði<br />* Lista atriði',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Lista atriði</li><li>Lista atriði</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Tölusettur listi',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Lista atriði<br /># Lista atriði',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Lista atriði</li><li>Lista atriði</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'Bæta við mynd',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Myndlýsing]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Myndlýsing' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='extensions/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Stækka' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Myndlýsing</div></div>",
+ 'wikieditor-toolbar-help-content-reference-description' => 'Tilvísun',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Texti síðu.&lt;ref name="test"&gt;[http://www.example.org Titill síðu], Skoðað 1. janúar 2010.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Texti síðu.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Ãframhaldandi notkun á sömu tilvísun',
+ 'wikieditor-toolbar-help-content-rereference-result' => "Texti síðu.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Sýna tilvísanir',
+ '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='#'>Texti tengils</a>, viðbótar texti.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Undirskrift þín auk tímasetningar',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Notendanafn</a> (<a href='#' title='{{#special:mytalk}}'>spjall</a>) 15:54, 10. Júní 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Undirskrift',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Notendanafn</a> (<a href='#' title='{{#special:mytalk}}'>spjall</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'Inndráttur',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Venjulegur texti<br />:Inndreginn texti<br />::Inndreginn texti',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Venjulegur texti<dl><dd>Inndreginn texti<dl><dd>Inndreginn texti</dd></dl></dd></dl>',
);
/** Italian (Italiano)
@@ -12477,6 +12700,7 @@ $1:Esempio.jpg|Didascalia2',
* @author Hosiryuhosi
* @author Ohgi
* @author Schu
+ * @author Shirayuki
* @author Whym
* @author é’å­å®ˆæ­Œ
*/
@@ -12484,37 +12708,37 @@ $messages['ja'] = array(
'wikieditor' => '高度ãªã‚¦ã‚£ã‚­ãƒ†ã‚­ã‚¹ãƒˆç·¨é›†ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹',
'wikieditor-desc' => 'æ‹¡å¼µå¯èƒ½ãªã‚¦ã‚£ã‚­ãƒ†ã‚­ã‚¹ãƒˆç·¨é›†ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨å¤šæ•°ã®æ©Ÿèƒ½ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’æä¾›ã™ã‚‹',
'wikieditor-wikitext-tab' => 'ウィキテキスト',
- 'wikieditor-loading' => '読ã¿è¾¼ã¿ä¸­',
- 'wikieditor-preview-preference' => '比較プレビューを有効化ã™ã‚‹',
+ 'wikieditor-loading' => '読ã¿è¾¼ã¿ä¸­...',
+ 'wikieditor-preview-preference' => '比較プレビューを有効ã«ã™ã‚‹',
'wikieditor-preview-tab' => 'プレビュー',
'wikieditor-preview-changes-tab' => '変更',
- 'wikieditor-preview-loading' => '読ã¿è¾¼ã¿ä¸­â€¦',
- 'wikieditor-previewDialog-preference' => 'プレビュー・ダイアログを有効化ã™ã‚‹',
+ 'wikieditor-preview-loading' => '読ã¿è¾¼ã¿ä¸­...',
+ 'wikieditor-previewDialog-preference' => 'プレビューダイアログを有効ã«ã™ã‚‹',
'wikieditor-previewDialog-tab' => 'プレビュー',
- 'wikieditor-previewDialog-loading' => '読ã¿è¾¼ã¿ä¸­â€¦',
- 'wikieditor-publish-preference' => '段階的投稿を有効化ã™ã‚‹',
+ '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-watch' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’ウォッãƒ',
'wikieditor-publish-dialog-publish' => '投稿',
'wikieditor-publish-dialog-goback' => '戻る',
- 'wikieditor-template-editor-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-preference' => '編集用目次を有効ã«ã™ã‚‹',
'wikieditor-toc-show' => '目次を表示',
'wikieditor-toc-hide' => '目次をéžè¡¨ç¤º',
'wikieditor-toolbar' => '編集ツールãƒãƒ¼',
'wikieditor-toolbar-desc' => '使ã„ã‚„ã™ã•ã®å‘上ã—ãŸãƒšãƒ¼ã‚¸ç·¨é›†ãƒ„ールãƒãƒ¼',
'wikieditor-toolbar-preference' => '改良型編集ツールãƒãƒ¼ã‚’有効ã«ã™ã‚‹',
- 'wikieditor-toolbar-dialogs-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' => '斜体',
@@ -12554,7 +12778,7 @@ $messages['ja'] = array(
'wikieditor-toolbar-tool-reference-title' => '出典を挿入',
'wikieditor-toolbar-tool-reference-insert' => '挿入',
'wikieditor-toolbar-tool-reference-text' => '出典情報',
- 'wikieditor-toolbar-tool-signature' => '時刻付ãç½²å',
+ 'wikieditor-toolbar-tool-signature' => '時刻å°ä»˜ãç½²å',
'wikieditor-toolbar-section-advanced' => '上級',
'wikieditor-toolbar-tool-heading' => '見出ã—',
'wikieditor-toolbar-tool-heading-1' => 'レベル1',
@@ -12641,6 +12865,7 @@ $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-telugu' => 'テルグ文字',
'wikieditor-toolbar-characters-page-sinhala' => 'シンãƒãƒ©æ–‡å­—',
'wikieditor-toolbar-characters-page-gujarati' => 'グジャラート文字',
@@ -12701,7 +12926,7 @@ $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-description' => '時刻å°ä»˜ãç½²å',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>利用者å</a> (<a href='#' title='{{#special:mytalk}}'>トーク</a>) 2009å¹´6月10æ—¥ (æ°´) 15:54 (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>)",
@@ -12767,6 +12992,7 @@ $messages['ka'] = array(
'wikieditor-toolbar-desc' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის პáƒáƒœáƒ”ლი გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებული იუზáƒáƒ‘ილითით',
'wikieditor-toolbar-preference' => 'ჩáƒáƒ áƒ—ეთ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებული პáƒáƒœáƒ”ლი',
'wikieditor-toolbar-dialogs-preference' => 'ჩáƒáƒ áƒ—ეთ დიáƒáƒšáƒáƒ’ები ბმულების, ტáƒáƒ‘ულებისრდრსხვრáƒáƒ‘იექტების ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლáƒáƒ“',
+ 'wikieditor-toolbar-hidesig' => 'ხელმáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜áƒ¡ დáƒáƒ›áƒáƒšáƒ•áƒ სáƒáƒ®áƒ”ლთრსივრცის ძირითáƒáƒ“ გვერდებზე',
'wikieditor-toolbar-loading' => 'იტვირთებáƒâ€¦',
'wikieditor-toolbar-tool-bold' => 'მუქი',
'wikieditor-toolbar-tool-bold-example' => 'მუქი ტექსტი',
@@ -12889,9 +13115,11 @@ $1:Example.jpg|áƒáƒ¦áƒ¬áƒ”რáƒ2',
'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' => 'გუჯáƒáƒ áƒáƒ—ი',
@@ -12979,13 +13207,159 @@ $messages['kiu'] = array(
/** Kazakh (Cyrillic script) (‪Қазақша (кирил)‬)
* @author GaiJin
+ * @author Kaztrans
*/
$messages['kk-cyrl'] = 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-button-publish' => 'ЖариÑлау',
+ 'wikieditor-publish-button-cancel' => 'Болдырмау',
+ 'wikieditor-publish-dialog-minor' => 'Шағын өңдеме',
+ 'wikieditor-publish-dialog-watch' => 'Бұл бетті бақылау',
+ 'wikieditor-publish-dialog-publish' => 'ЖариÑлау',
+ 'wikieditor-publish-dialog-goback' => 'Ðртқа',
+ 'wikieditor-template-editor-dialog-submit' => 'Жаңарту',
+ 'wikieditor-template-editor-dialog-cancel' => 'Болдырмау',
+ '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:// енгізуін ұмытпаңыз)',
+ '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-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-lookslikeinternal-int' => 'Ішкі Ñілтеме',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Сыртқы Ñілтеме',
+ 'wikieditor-toolbar-tool-file' => 'Файл орнату',
+ 'wikieditor-toolbar-tool-reference' => 'Дереккөз',
+ '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' => '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-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-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:Example.jpg|СипаттамаÑÑ‹1
+$1:Example.jpg|СипаттамаÑÑ‹2',
+ 'wikieditor-toolbar-tool-newline' => 'Жаңа жол',
+ 'wikieditor-toolbar-tool-table' => 'КеÑте',
+ 'wikieditor-toolbar-tool-table-example-old' => '! тақырыпша 1
+! тақырыпша 2
+! тақырыпша 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' => 'Тақырыпша мәтіні',
+ '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-sortable' => 'Сұрыпталмалы кеÑте жаÑау',
+ 'wikieditor-toolbar-tool-table-example' => 'Ò°Ñшық мәтіні',
+ 'wikieditor-toolbar-tool-table-preview' => 'Қарап шығу',
+ 'wikieditor-toolbar-tool-table-insert' => 'Енгізу',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Болдырмау',
+ '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-button-replace' => 'ÐлмаÑтыру',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барлығын алмаÑтыру',
+ 'wikieditor-toolbar-tool-replace-close' => 'Жабу',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Сіздің Ñұрауыңыз бойынша еш нәрÑе табылмады.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 алмаÑтыру жаÑалды.',
'wikieditor-toolbar-section-characters' => 'Ðрнайы таңбалар',
+ 'wikieditor-toolbar-characters-page-latin' => 'Латын',
+ 'wikieditor-toolbar-characters-page-symbols' => 'Белгілер',
'wikieditor-toolbar-section-help' => 'Ðнықтама',
+ 'wikieditor-toolbar-help-heading-description' => 'СипаттамаÑÑ‹',
+ '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-xlink-description' => 'Сыртқы Ñілтеме',
+ 'wikieditor-toolbar-help-content-heading2-description' => '2-ші деңгейлі бөлім',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Бөлім мәтіні ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Бөлім мәтіні</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => '3-ші деңгейлі бөлім',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Бөлім мәтіні ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Бөлім мәтіні</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => '4-ші деңгейлі бөлім',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Бөлім мәтіні ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Бөлім мәтіні</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => '5-ші деңгейлі бөлім',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Бөлім мәтіні =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Бөлім мәтіні</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Таңбаланған тізім',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Ðөмірленген тізім',
+ '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-showreferences-description' => 'Дереккөзін көрÑету',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Қолтаңба және уақыт',
+ 'wikieditor-toolbar-help-content-signature-description' => 'Қолтаңба',
+ 'wikieditor-toolbar-help-content-indent-description' => 'ШегініÑ',
);
/** Khmer (ភាសាážáŸ’មែរ)
@@ -12999,6 +13373,9 @@ $messages['km'] = array(
'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' => 'បោះផ្សាយក្នុង{{SITENAME}}',
@@ -13125,6 +13502,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។',
'wikieditor-toolbar-tool-replace-emptysearch' => 'អ្នកមិនបានវាយបញ្ចូលពាក្យសំរាប់ស្វែងរកទáŸáŸ”',
'wikieditor-toolbar-section-characters' => 'ážáž½áž¢áž€áŸ’សរពិសáŸážŸáŸ—',
'wikieditor-toolbar-characters-page-latin' => 'អក្សរឡាážáž¶áŸ†áž„',
@@ -13221,6 +13599,7 @@ $messages['kn'] = array(
'wikieditor-toolbar-tool-heading-4' => 'ದರà³à²œà³† ೪',
'wikieditor-toolbar-tool-heading-5' => 'ದರà³à²œà³† ೫',
'wikieditor-toolbar-group-format' => 'ಪಟà³à²Ÿà²¿',
+ 'wikieditor-toolbar-tool-big' => 'ದೊಡà³à²¦',
'wikieditor-toolbar-tool-table' => 'ಪಟà³à²Ÿà²¿',
'wikieditor-toolbar-tool-table-example' => 'ಉದಾಹರಣೆ',
'wikieditor-toolbar-tool-table-preview' => 'ಮà³à²¨à³à²¨à³‹à²Ÿ',
@@ -14501,6 +14880,7 @@ $1:Example.jpg|Beschreiwung2',
'wikieditor-toolbar-characters-page-persian' => 'Persesch',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebräisch',
'wikieditor-toolbar-characters-page-bangla' => 'Bangalesch',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamilesch',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -14754,6 +15134,7 @@ $1:Veurbeildj2|Biesjrif2',
'wikieditor-toolbar-characters-page-persian' => 'Perzisch',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebreeuws',
'wikieditor-toolbar-characters-page-bangla' => 'Bengaals',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Teloegoe',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Goedzjarati',
@@ -15061,6 +15442,97 @@ $messages['ltg'] = array(
'wikieditor-template-editor-dialog-submit' => 'Atjaunynuot',
);
+/** Lushai (Mizo ţawng)
+ * @author RMizo
+ */
+$messages['lus'] = array(
+ 'wikieditor-wikitext-tab' => 'Wikithu',
+ 'wikieditor-toolbar-section-advanced' => 'Ràiril',
+ 'wikieditor-toolbar-tool-redirect' => 'Hruailuhna',
+ 'wikieditor-toolbar-tool-redirect-example' => 'Hruailuhna tùr phêk',
+ 'wikieditor-toolbar-tool-big' => 'Lian',
+ 'wikieditor-toolbar-tool-big-example' => 'Hawrawp lian',
+ 'wikieditor-toolbar-tool-small' => 'Të',
+ 'wikieditor-toolbar-tool-small-example' => 'Hawrawp të',
+ 'wikieditor-toolbar-tool-superscript' => 'Chhîpchhuan',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Thu chhîpchhuan',
+ 'wikieditor-toolbar-tool-subscript' => 'Thu-üaithlà',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Thu üaithlà',
+ 'wikieditor-toolbar-group-insert' => 'Telh rawh le',
+ 'wikieditor-toolbar-tool-gallery' => 'Thlalâk chhuar',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Entirna.jpg|Sawifiahna1
+$1:Entirna.jpg|Sawifiahna2',
+ 'wikieditor-toolbar-tool-newline' => 'Tlar thar',
+ 'wikieditor-toolbar-tool-table' => 'Dawhkan',
+ 'wikieditor-toolbar-tool-table-example-old' => '-
+! thupui1
+! thupui 2
+! thupui 3
+|-
+| tlar 1, pindan 1
+| tlar 1, pindan 2
+| tlar1, pindan 3
+|-
+| tlar 2, pindan 1
+| tlar 2, pindan 2
+| tlar 2, pindan 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Pindan chhunga thu dah tùr',
+ 'wikieditor-toolbar-tool-table-example-header' => 'Thupui',
+ 'wikieditor-toolbar-tool-table-title' => 'Dawhkan telh rawh le',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'Tlar',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Thlur',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Tlar thupui',
+ 'wikieditor-toolbar-tool-table-wikitable' => 'A tlang chhah',
+ 'wikieditor-toolbar-tool-table-sortable' => 'Dawhkan remfel theiha siamna',
+ 'wikieditor-toolbar-tool-table-example' => 'Entirna',
+ 'wikieditor-toolbar-tool-table-preview' => 'Enchhinna',
+ 'wikieditor-toolbar-tool-table-insert' => 'Telh rawh le',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Sûtna',
+ 'wikieditor-toolbar-tool-table-zero' => 'Dawhkan tlar leh thlur nei lo a telh theih loh.',
+ 'wikieditor-toolbar-tool-replace' => 'Zawna thlâkna',
+ 'wikieditor-toolbar-tool-replace-title' => 'Zawng la thlâk rawh',
+ 'wikieditor-toolbar-tool-replace-search' => 'Hei hi zawng rawh:',
+ 'wikieditor-toolbar-tool-replace-replace' => 'Hei hian thlâk rawh:',
+ 'wikieditor-toolbar-tool-replace-case' => 'A hawrawppui inmil thlapin',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'A dawt zawng rawh le',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Thlâk rawh le',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'A vaiin thlâk rawh',
+ 'wikieditor-toolbar-tool-replace-close' => 'Kharna',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'I thil zawnin milpui a nei lo',
+ 'wikieditor-toolbar-tool-replace-success' => 'Vawi $1 thlâk a ni.',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Zawn tùr i ziak miah lo.',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'I thu ziah a dik lo: $1',
+ 'wikieditor-toolbar-section-characters' => 'Hawrawp bîkte',
+ 'wikieditor-toolbar-characters-page-latin' => 'Latin',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Latin säwizàu',
+ 'wikieditor-toolbar-characters-page-ipa' => 'IPA',
+ 'wikieditor-toolbar-characters-page-symbols' => 'Chhinchhiahnate',
+ 'wikieditor-toolbar-characters-page-greek' => 'Grik',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'Sirilik (russia hawrawp ang chi)',
+ 'wikieditor-toolbar-characters-page-arabic' => 'arabik',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabik sâwizàu',
+ 'wikieditor-toolbar-characters-page-persian' => 'Persia',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'Hebrai',
+ 'wikieditor-toolbar-characters-page-bangla' => 'benggawli',
+ 'wikieditor-toolbar-characters-page-telugu' => 'Telegu',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
+ 'wikieditor-toolbar-characters-page-thai' => 'Thaiţawng',
+ 'wikieditor-toolbar-characters-page-lao' => 'Lao',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-section-help' => 'Å¢anpuina',
+ 'wikieditor-toolbar-help-heading-description' => 'Sawifiahna',
+ 'wikieditor-toolbar-help-heading-syntax' => 'I thu ziah',
+ 'wikieditor-toolbar-help-heading-result' => 'I dawn',
+ 'wikieditor-toolbar-help-page-format' => 'Inremphung',
+ 'wikieditor-toolbar-help-page-link' => 'Zawmna',
+ 'wikieditor-toolbar-help-page-heading' => 'Thupuite',
+ 'wikieditor-toolbar-help-page-list' => 'Tlarna',
+ 'wikieditor-toolbar-help-page-file' => 'Taksa',
+ 'wikieditor-toolbar-help-page-reference' => 'Thulâkna',
+ 'wikieditor-toolbar-help-page-discussion' => 'Sawihona',
+);
+
/** Latvian (Latviešu)
* @author Gleb Borisov
* @author GreenZeb
@@ -15684,6 +16156,7 @@ $1:Пример.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-telugu' => 'Телугу',
'wikieditor-toolbar-characters-page-sinhala' => 'СинхалÑки',
'wikieditor-toolbar-characters-page-gujarati' => 'Гуџарати',
@@ -15918,6 +16391,7 @@ $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-telugu' => 'തെലàµà´™àµà´•àµ',
'wikieditor-toolbar-characters-page-sinhala' => 'സിംഹള',
'wikieditor-toolbar-characters-page-gujarati' => 'à´—àµà´œà´±à´¾à´¤àµà´¤à´¿',
@@ -16383,7 +16857,7 @@ $1:Contoh.jpg|Sari kata 2',
'wikieditor-toolbar-tool-table-zero' => 'Anda tidak boleh menyisipkan jadual dengan baris atau lajur sifar.',
'wikieditor-toolbar-tool-replace' => 'Ganti',
'wikieditor-toolbar-tool-replace-title' => 'Cari dan ganti',
- 'wikieditor-toolbar-tool-replace-search' => 'Carikan:',
+ 'wikieditor-toolbar-tool-replace-search' => 'Cari:',
'wikieditor-toolbar-tool-replace-replace' => 'Ganti dengan:',
'wikieditor-toolbar-tool-replace-case' => 'Padankan atur huruf',
'wikieditor-toolbar-tool-replace-regex' => 'Anggap rentetan carian sebagai ungkapan nalar',
@@ -16407,6 +16881,7 @@ $1:Contoh.jpg|Sari kata 2',
'wikieditor-toolbar-characters-page-persian' => 'Parsi',
'wikieditor-toolbar-characters-page-hebrew' => 'Ibrani',
'wikieditor-toolbar-characters-page-bangla' => 'Benggala',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
@@ -17383,6 +17858,7 @@ $messages['ne'] = array(
* @author SPQRobin
* @author Siebrand
* @author Tvdm
+ * @author Wiki13
*/
$messages['nl'] = array(
'wikieditor' => 'Uitgebreide tekstverwerker voor wikitekst',
@@ -17545,6 +18021,7 @@ $1:Voorbeeld.jpg|Bijschrift2',
'wikieditor-toolbar-characters-page-persian' => 'Farsi',
'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',
@@ -18397,7 +18874,31 @@ $messages['pdc'] = array(
'wikieditor-toolbar-help-content-signature-description' => 'Unnerschrift',
);
+/** Pälzisch (Pälzisch)
+ * @author Manuae
+ */
+$messages['pfl'] = array(
+ 'wikieditor-preview-changes-tab' => 'Änarunge',
+ 'wikieditor-toolbar-tool-bold' => 'Fedd',
+ 'wikieditor-toolbar-tool-bold-example' => 'Fedde Tegschd',
+ 'wikieditor-toolbar-tool-italic' => 'Schräsch',
+ 'wikieditor-toolbar-tool-italic-example' => 'Schräscher Tegschd',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Uffhere',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Said gibds schun',
+ 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Said gibds noch ned',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Oifiesche',
+ 'wikieditor-toolbar-tool-big' => 'Groß',
+ 'wikieditor-toolbar-tool-big-example' => 'Großer Tegschd',
+ 'wikieditor-toolbar-tool-small' => 'Klä',
+ 'wikieditor-toolbar-tool-small-example' => 'Kläner Tegschd',
+ 'wikieditor-toolbar-group-insert' => 'Oifiesche',
+ 'wikieditor-toolbar-section-help' => 'Hilf',
+ 'wikieditor-toolbar-help-page-discussion' => 'Dischbediere',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Fedde Tegschd'''",
+);
+
/** Polish (Polski)
+ * @author BeginaFelicysym
* @author Leinad
* @author Marcin Åukasz Kiejzik
* @author Nux
@@ -18542,7 +19043,7 @@ $1:Example.jpg|Podpis2',
'wikieditor-toolbar-tool-table-zero' => 'Nie można wstawić tabeli z zerową liczbą wierszy lub kolumn.',
'wikieditor-toolbar-tool-replace' => 'Wyszukaj i zastÄ…p',
'wikieditor-toolbar-tool-replace-title' => 'Wyszukaj i zamień',
- 'wikieditor-toolbar-tool-replace-search' => 'Szukaj',
+ 'wikieditor-toolbar-tool-replace-search' => 'Szukaj:',
'wikieditor-toolbar-tool-replace-replace' => 'ZastÄ…p przez',
'wikieditor-toolbar-tool-replace-case' => 'Uwzględnij wielkość znaków',
'wikieditor-toolbar-tool-replace-regex' => 'Traktuj wyszukiwany ciąg jako wyrażenie regularne',
@@ -19524,7 +20025,7 @@ $1:Exemplo2.jpg|Legenda2',
'wikieditor-toolbar-help-content-rereference-description' => 'Reutilização da mesma referência',
'wikieditor-toolbar-help-content-rereference-result' => "Texto da página.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'Mostrar referências',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><a title='' href='#'><b>^</b></a> <a rel='nofollow' title=\"http://www.exemplo.org\" class='external text' href='#'>Texto do link</a>, texto adicional.</li></ol>",
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><a title='' href='#'><b>^</b></a> <a rel='nofollow' title=\"http://www.example.org\" class='external text' href='#'>Texto do link</a>, texto adicional.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Assinatura com data e hora',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nome de utilizador</a> (<a href='#' title='{{#special:mytalk}}'>discussão</a>) 15h54min de 10 de junho de 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Assinatura',
@@ -19738,7 +20239,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Título do link</a><br /><a href='#'>Título da página</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Link externo',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Título do link]<br />[http://www.example.org]<br />http://www.example.org',
- 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Texto da ligação</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.exemplo.org</a>",
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Texto do link</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.exemplo.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => 'Subtítulo de nível 2',
'wikieditor-toolbar-help-content-heading2-syntax' => '== Subtítulo ==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Subtítulo</h2>',
@@ -19766,7 +20267,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-help-content-rereference-description' => 'Reutilização da mesma referência',
'wikieditor-toolbar-help-content-rereference-result' => "Texto da página.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'Mostrar referências',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><a title='' href='#'><b>^</b></a> <a rel='nofollow' title=\"http://www.exemplo.org\" class='external text' href='#'>Texto do link</a>, texto adicional.</li></ol>",
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><a title='' href='#'><b>^</b></a> <a rel='nofollow' title=\"http://www.example.org\" class='external text' href='#'>Texto do link</a>, texto adicional.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Assinatura com hora e data',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nome de usuário</a> (<a href='#' title='{{#special:mytalk}}'>discussão</a>) 15h54min de 10 de junho de 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Assinatura',
@@ -21896,6 +22397,7 @@ $1:උදà·à·„රණ.jpg| 2 යටි ලියමන',
* @author Helix84
* @author Jkjk
* @author McDutchie
+ * @author Teslaton
*/
$messages['sk'] = array(
'wikieditor' => 'PokroÄilé rozhranie na úpravu wikitextu',
@@ -22038,6 +22540,7 @@ $1:Príklad.jpg|Popis2',
'wikieditor-toolbar-tool-replace-case' => 'Na veľkosti písmen záleží',
'wikieditor-toolbar-tool-replace-regex' => 'Vyhľadávací reťazec je regulárny výraz',
'wikieditor-toolbar-tool-replace-button-findnext' => 'NájsÅ¥ Äalší',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Nahradiť',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Nahradiť všetky',
'wikieditor-toolbar-tool-replace-close' => 'Zatvoriť',
'wikieditor-toolbar-tool-replace-nomatch' => 'Vyhľadávanie nenašlo vyhovujúce položky.',
@@ -22052,6 +22555,7 @@ $1:Príklad.jpg|Popis2',
'wikieditor-toolbar-characters-page-greek' => 'Grécke',
'wikieditor-toolbar-characters-page-cyrillic' => 'Azbuka',
'wikieditor-toolbar-characters-page-arabic' => 'Arabské',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabské rozšírené',
'wikieditor-toolbar-characters-page-persian' => 'Perzský',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebrejské',
'wikieditor-toolbar-characters-page-bangla' => 'BengálÄina',
@@ -22263,7 +22767,7 @@ $1:Primer 2.jpg|Napis 2',
'wikieditor-toolbar-tool-table-zero' => 'Ne morete vstaviti tabele z niÄ vrsticami ali stolpci.',
'wikieditor-toolbar-tool-replace' => 'Zamenjaj',
'wikieditor-toolbar-tool-replace-title' => 'PoiÅ¡Äi in zamenjaj',
- 'wikieditor-toolbar-tool-replace-search' => 'IÅ¡Äi za:',
+ 'wikieditor-toolbar-tool-replace-search' => 'IÅ¡Äi:',
'wikieditor-toolbar-tool-replace-replace' => 'Zamenjaj z:',
'wikieditor-toolbar-tool-replace-case' => 'Ujemanje velikosti Ärk',
'wikieditor-toolbar-tool-replace-regex' => 'Obravnavaj iskalni niz kot regularni izraz',
@@ -22287,6 +22791,7 @@ $1:Primer 2.jpg|Napis 2',
'wikieditor-toolbar-characters-page-persian' => 'Perzijski',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebrejski',
'wikieditor-toolbar-characters-page-bangla' => 'BengalÅ¡Äina',
+ 'wikieditor-toolbar-characters-page-tamil' => 'tamilÅ¡Äina',
'wikieditor-toolbar-characters-page-telugu' => 'Telugijski',
'wikieditor-toolbar-characters-page-sinhala' => 'SingalÅ¡Äina',
'wikieditor-toolbar-characters-page-gujarati' => 'Gudžarati',
@@ -23723,6 +24228,8 @@ Idadi ya mistari au ya safu si halali.',
);
/** Tamil (தமிழà¯)
+ * @author Karthi.dr
+ * @author Logicwiki
* @author Surya Prakash.S.A.
* @author TRYPPN
* @author செலà¯à®µà®¾
@@ -23779,7 +24286,7 @@ $messages['ta'] = array(
'wikieditor-toolbar-tool-link-ext-target' => 'இணைபà¯à®ªà¯ உரலி:',
'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' => 'தவறான தலைபà¯à®ªà¯',
@@ -23890,6 +24397,7 @@ $1:எடà¯à®¤à¯à®¤à¯à®•à¯à®•à®¾à®Ÿà¯à®Ÿà¯.jpg|படவிளகà¯à®•à®®
'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' => 'கà¯à®šà®°à®¾à®¤à¯à®¤à®¿',
@@ -23942,6 +24450,7 @@ $1:எடà¯à®¤à¯à®¤à¯à®•à¯à®•à®¾à®Ÿà¯à®Ÿà¯.jpg|படவிளகà¯à®•à®®
'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|விரலளவà¯à®ªà¯à®ªà®Ÿà®®à¯|படவிளகà¯à®•à®µà¯à®°à¯ˆ]]',
+ '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='extensions/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="சோதனை"&gt;[http://www.example.org இணைபà¯à®ªà¯ உரை], கூடà¯à®¤à®²à¯ உரை.&lt;/ref&gt;',
@@ -24876,15 +25385,15 @@ $messages['tr'] = array(
'wikieditor' => 'Gelişmiş viki metni düzenleme arayüzü',
'wikieditor-desc' => 'Genişletilebilir bir viki metni düzenleme arayüzü ve birçok özellik sağlayan modüller sağlar',
'wikieditor-wikitext-tab' => 'Vikimetin',
- 'wikieditor-loading' => 'Yükleniyor',
- 'wikieditor-preview-preference' => 'Yan-yana önizlemeyi etkinleştir',
- 'wikieditor-preview-tab' => 'Önizleme',
+ 'wikieditor-loading' => 'Yükleniyor...',
+ 'wikieditor-preview-preference' => 'Yan yana ön izlemeyi etkinleştir',
+ 'wikieditor-preview-tab' => 'Ön izleme',
'wikieditor-preview-changes-tab' => 'DeÄŸiÅŸiklikler',
'wikieditor-preview-loading' => 'Yükleniyor...',
- 'wikieditor-previewDialog-preference' => 'Önizleme iletisini etkinleştir',
- 'wikieditor-previewDialog-tab' => 'Önizleme',
+ 'wikieditor-previewDialog-preference' => 'Ön izleme iletisini etkinleştir',
+ 'wikieditor-previewDialog-tab' => 'Ön izleme',
'wikieditor-previewDialog-loading' => 'Yükleniyor...',
- 'wikieditor-publish-preference' => 'Adım-adım yayınlamayı etkinleştir',
+ 'wikieditor-publish-preference' => 'Adım adım yayınlamayı etkinleştir',
'wikieditor-publish-button-publish' => 'Yayınla',
'wikieditor-publish-button-cancel' => 'Ä°ptal',
'wikieditor-publish-dialog-title' => '{{SITENAME}} bünyesinde yayınla',
@@ -24894,7 +25403,7 @@ $messages['tr'] = array(
'wikieditor-publish-dialog-publish' => 'Yayınla',
'wikieditor-publish-dialog-goback' => 'Geri git',
'wikieditor-template-editor-preference' => 'Viki şablonlarının form-bazlı değiştirilmesini etkinleştir',
- 'wikieditor-template-editor-dialog-title' => 'Åžablonu deÄŸiÅŸtir',
+ 'wikieditor-template-editor-dialog-title' => 'Şablonu düzenle',
'wikieditor-template-editor-dialog-submit' => 'Güncelle',
'wikieditor-template-editor-dialog-cancel' => 'Ä°ptal',
'wikieditor-templates-preference' => 'Şablon daraltmayı etkinleştir',
@@ -24902,15 +25411,15 @@ $messages['tr'] = array(
'wikieditor-toc-show' => 'İçindekileri göster',
'wikieditor-toc-hide' => 'İçindekileri gizle',
'wikieditor-toolbar' => 'Araç çubuğu düzenleme',
- 'wikieditor-toolbar-desc' => 'Gelişmiş kullanılabilirlik ile sayfa araç çubuğunu değiştir',
+ '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-hidesig' => 'Ana ad boşluğundaki sayfalardan imzayı saklama tuşu',
+ 'wikieditor-toolbar-hidesig' => 'Ana ad boşluğundaki sayfalardan imza düğmesini gizle',
'wikieditor-toolbar-loading' => 'Yükleniyor...',
'wikieditor-toolbar-tool-bold' => 'Kalın',
- 'wikieditor-toolbar-tool-bold-example' => 'Kalın yazı',
+ 'wikieditor-toolbar-tool-bold-example' => 'Kalın metin',
'wikieditor-toolbar-tool-italic' => 'EÄŸik',
- 'wikieditor-toolbar-tool-italic-example' => 'Eğik yazı',
+ 'wikieditor-toolbar-tool-italic-example' => 'EÄŸik metin',
'wikieditor-toolbar-tool-ilink' => 'İç bağlantı',
'wikieditor-toolbar-tool-ilink-example' => 'Bağlantı başlığı',
'wikieditor-toolbar-tool-xlink' => 'Dış bağlantı (http:// önekini unutmayın)',
@@ -24918,12 +25427,12 @@ $messages['tr'] = array(
'wikieditor-toolbar-tool-link' => 'Bağlantı',
'wikieditor-toolbar-tool-link-title' => 'Bağlantı ekle',
'wikieditor-toolbar-tool-link-int' => 'Bir viki sayfasına',
- 'wikieditor-toolbar-tool-link-int-target' => 'Sayfa başlığı:',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Hedef sayfa ya da URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sayfa başlığı ya da URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'Bağlantı metni:',
+ 'wikieditor-toolbar-tool-link-int-text' => 'Görüntülenecek metin:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Görüntülenecek metni girin',
'wikieditor-toolbar-tool-link-ext' => 'Harici bir web sayfasına',
- 'wikieditor-toolbar-tool-link-ext-target' => 'Bağlantı URLsi:',
+ 'wikieditor-toolbar-tool-link-ext-target' => "Bağlantı URL'si:",
'wikieditor-toolbar-tool-link-ext-text' => 'Bağlantı metni:',
'wikieditor-toolbar-tool-link-insert' => 'Bağlantı ekle',
'wikieditor-toolbar-tool-link-cancel' => 'Ä°ptal',
@@ -24931,20 +25440,20 @@ $messages['tr'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Sayfa mevcut deÄŸil',
'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 kontrol ediliyor...',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Sayfanın mevcudiyeti denetleniyor...',
'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ı',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Harici bağlantı',
- 'wikieditor-toolbar-tool-link-empty' => 'Bağlantı verecek bir şey girmediniz.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Dış bağlantı',
+ 'wikieditor-toolbar-tool-link-empty' => 'Bağlantı verecek hiçbir şey girmediniz.',
'wikieditor-toolbar-tool-file' => 'Gömülü dosya',
'wikieditor-toolbar-tool-file-example' => 'Örnek.jpg',
'wikieditor-toolbar-tool-reference' => 'Kaynakça',
'wikieditor-toolbar-tool-reference-example' => 'Dipnot metnini buraya ekleyin',
'wikieditor-toolbar-tool-reference-cancel' => 'Ä°ptal',
- 'wikieditor-toolbar-tool-reference-title' => 'Referans ekle',
+ 'wikieditor-toolbar-tool-reference-title' => 'Kaynak ekle',
'wikieditor-toolbar-tool-reference-insert' => 'Ekle',
- 'wikieditor-toolbar-tool-reference-text' => 'Referans metin',
+ 'wikieditor-toolbar-tool-reference-text' => 'Kaynak metin',
'wikieditor-toolbar-tool-signature' => 'İmza ve zaman damgası',
'wikieditor-toolbar-section-advanced' => 'GeliÅŸmiÅŸ',
'wikieditor-toolbar-tool-heading' => 'Başlık',
@@ -24954,7 +25463,7 @@ $messages['tr'] = array(
'wikieditor-toolbar-tool-heading-4' => '4. seviye',
'wikieditor-toolbar-tool-heading-5' => '5. seviye',
'wikieditor-toolbar-tool-heading-example' => 'Başlık metni',
- 'wikieditor-toolbar-group-format' => 'Düzenle',
+ 'wikieditor-toolbar-group-format' => 'Biçim',
'wikieditor-toolbar-tool-ulist' => 'Madde iÅŸaretli liste',
'wikieditor-toolbar-tool-ulist-example' => 'Madde işaretli liste ögesi',
'wikieditor-toolbar-tool-olist' => 'Numaralı liste',
@@ -24974,9 +25483,9 @@ $messages['tr'] = array(
'wikieditor-toolbar-tool-subscript' => 'Alt simge',
'wikieditor-toolbar-tool-subscript-example' => 'Alt simge metni',
'wikieditor-toolbar-group-insert' => 'Ekle',
- 'wikieditor-toolbar-tool-gallery' => 'Resim galerisi',
- 'wikieditor-toolbar-tool-gallery-example' => '$1:Örnek.jpg|Resimyazısı1
-$1:Örnek.jpg|Resimyazısı2',
+ 'wikieditor-toolbar-tool-gallery' => 'Resim sergisi',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Örnek.jpg|Altyazı 1
+$1:Örnek.jpg|Altyazı 2',
'wikieditor-toolbar-tool-newline' => 'Yeni satır',
'wikieditor-toolbar-tool-table' => 'Tablo',
'wikieditor-toolbar-tool-table-example-old' => '-
@@ -24996,11 +25505,11 @@ $1:Örnek.jpg|Resimyazısı2',
'wikieditor-toolbar-tool-table-title' => 'Tablo ekle',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Satırlar',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Sütunlar',
- 'wikieditor-toolbar-tool-table-dimensions-header' => 'Başlık satırını içer',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Başlık satırını ekle',
'wikieditor-toolbar-tool-table-wikitable' => 'Kenarlık ekle',
'wikieditor-toolbar-tool-table-sortable' => 'Tabloyu sıralanabilir yap',
- 'wikieditor-toolbar-tool-table-example' => 'Hücre metni',
- 'wikieditor-toolbar-tool-table-preview' => 'Önizleme',
+ 'wikieditor-toolbar-tool-table-example' => 'Örnek tablo:',
+ 'wikieditor-toolbar-tool-table-preview' => 'Ön izleme',
'wikieditor-toolbar-tool-table-insert' => 'Ekle',
'wikieditor-toolbar-tool-table-cancel' => 'Ä°ptal',
'wikieditor-toolbar-tool-table-toomany' => '$1 hücreliden fazla bir tablo eklemek bu ileti ile mümkün değildir.',
@@ -25010,32 +25519,34 @@ $1:Örnek.jpg|Resimyazısı2',
'wikieditor-toolbar-tool-replace-title' => 'Ara ve deÄŸiÅŸtir',
'wikieditor-toolbar-tool-replace-search' => 'Şunun için ara:',
'wikieditor-toolbar-tool-replace-replace' => 'Åžununla deÄŸiÅŸtir:',
- 'wikieditor-toolbar-tool-replace-case' => 'Büyük-küçük harf duyarlı',
+ 'wikieditor-toolbar-tool-replace-case' => 'Büyük küçük harf duyarlı',
'wikieditor-toolbar-tool-replace-regex' => 'Arama dizesine bir düzenli ifade muamelesi yap',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Sonrakini bul',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'DeÄŸiÅŸtir',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Tümünü değiştir',
'wikieditor-toolbar-tool-replace-close' => 'Kapat',
'wikieditor-toolbar-tool-replace-nomatch' => 'Aramanız hiçbir şeyle uyuşmuyor.',
'wikieditor-toolbar-tool-replace-success' => '$1 değiştirme yapıldı.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Aramak için herhangi birşey girmediniz.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Girdiğiniz düzenli ifade geçersiz: $1',
- 'wikieditor-toolbar-section-characters' => 'Özel karakter',
+ 'wikieditor-toolbar-section-characters' => 'Özel karakterler',
'wikieditor-toolbar-characters-page-latin' => 'Latin',
'wikieditor-toolbar-characters-page-latinextended' => 'GeniÅŸletilmiÅŸ Latince',
'wikieditor-toolbar-characters-page-ipa' => 'UFA',
- 'wikieditor-toolbar-characters-page-symbols' => 'Semboller',
+ 'wikieditor-toolbar-characters-page-symbols' => 'Simgeler',
'wikieditor-toolbar-characters-page-greek' => 'Yunan',
'wikieditor-toolbar-characters-page-cyrillic' => 'Kiril',
- 'wikieditor-toolbar-characters-page-arabic' => 'Arapça',
+ 'wikieditor-toolbar-characters-page-arabic' => 'Arap',
'wikieditor-toolbar-characters-page-arabicextended' => 'Genişletilmiş Arapça',
- 'wikieditor-toolbar-characters-page-persian' => 'Farsça',
- 'wikieditor-toolbar-characters-page-hebrew' => 'Ä°branice',
+ 'wikieditor-toolbar-characters-page-persian' => 'Fars',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'Ä°brani',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalce',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
- 'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'Gücerat',
'wikieditor-toolbar-characters-page-thai' => 'Tay',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Kmer',
'wikieditor-toolbar-section-help' => 'Yardım',
'wikieditor-toolbar-help-heading-description' => 'Açıklama',
'wikieditor-toolbar-help-heading-syntax' => 'Yazdığınız',
@@ -25048,16 +25559,16 @@ $1:Örnek.jpg|Resimyazısı2',
'wikieditor-toolbar-help-page-reference' => 'Kaynakça',
'wikieditor-toolbar-help-page-discussion' => 'Tartışma',
'wikieditor-toolbar-help-content-italic-description' => 'EÄŸik',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''Eğik yazı''",
- 'wikieditor-toolbar-help-content-italic-result' => '<em>Eğik yazı</em>',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''EÄŸik metin''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>EÄŸik metin</em>',
'wikieditor-toolbar-help-content-bold-description' => 'Kalın',
- 'wikieditor-toolbar-help-content-bold-syntax' => "'''Kalın yazı'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>Kalın yazı</strong>',
- 'wikieditor-toolbar-help-content-bolditalic-description' => 'Kalın &amp; eğik',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Kalın &amp; eğik yazı'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Kalın &amp; eğik yazı</em></strong>',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Kalın metin'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Kalın metin</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'Kalın ve eğik',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Kalın ve eğik metin'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Kalın ve eğik metin</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'İç bağlantı',
- 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Sayfa başlığı|Bağlantı başlığı]]<br />[[Sayfa başlığı]]',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Sayfa başlığı|Bağlantı etiketi]]<br />[[Sayfa başlığı]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Bağlantı etiketi</a><br /><a href='#'>Sayfa başlığı</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Dış bağlantı',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ornek.org Bağlantı etiketi]<br />[http://www.ornek.org]<br />http://www.ornek.org',
@@ -25075,14 +25586,14 @@ $1:Örnek.jpg|Resimyazısı2',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Başlık metni =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Başlık metni</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Madde iÅŸaretli liste',
- 'wikieditor-toolbar-help-content-ulist-syntax' => '* Liste öğesi<br />* Liste öğesi',
- 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Liste öğesi</li><li>Liste öğesi</li></ul>',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Liste ögesi<br />* Liste ögesi',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Liste ögesi</li><li>Liste ögesi</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'Numaralı liste',
- 'wikieditor-toolbar-help-content-olist-syntax' => '# Liste öğesi<br /># Liste öğesi',
- 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Liste öğesi</li><li>Liste öğesi</li></ol>',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Liste ögesi<br /># Liste ögesi',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Liste ögesi</li><li>Liste ögesi</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Gömülü dosya',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Örnek.png|thumb|Başlık metni]]',
- '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/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>Resim yazısı</div></div>",
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Altyazı metni' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='extensions/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Büyüt' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Altyazı metni</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Kaynak',
'wikieditor-toolbar-help-content-reference-syntax' => 'Sayfa metni.&lt;ref name="deneme"&gt;[http://www.ornek.org Bağlanı metni], ek metin.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Sayfa metni.<sup><a href='#'>[1]</a></sup>",
@@ -25091,7 +25602,7 @@ $1:Örnek.jpg|Resimyazısı2',
'wikieditor-toolbar-help-content-showreferences-description' => 'Kaynakçayı görüntüle',
'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.ornek.org' class='external text' href='#'>Bağlantı metni</a>, ek metin.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Zaman damgası ile imza',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Kullanıcı adı</a> (<a href='#' title='{{#special:mytalk}}'>mesaj</a>) 15:54, 10 Haziran 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Kullanıcı adı</a> (<a href='#' title='{{#special:mytalk}}'>mesaj</a>) 15.54, 17 Şubat 2012 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Ä°mza',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Kullanıcı adı</a> (<a href='#' title='{{#special:mytalk}}'>mesaj</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Girinti',
@@ -25395,7 +25906,7 @@ $messages['uk'] = 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' => 'ÐеприпуÑтима назва',
@@ -26257,6 +26768,7 @@ $1:Ví dụ.jpg|Chú thích 2',
'wikieditor-toolbar-characters-page-persian' => 'Ba TÆ°',
'wikieditor-toolbar-characters-page-hebrew' => 'Hê-brơ',
'wikieditor-toolbar-characters-page-bangla' => 'Bangla',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarat',
@@ -26314,6 +26826,7 @@ $1:Ví dụ.jpg|Chú thích 2',
'wikieditor-toolbar-help-content-reference-syntax' => 'Nội dung trang&lt;ref name="thử"&gt;[http://www.example.org Văn bản liên kết], văn bản bổ sung.&lt;/ref&gt;.',
'wikieditor-toolbar-help-content-reference-result' => "Ná»™i dung trang<sup><a href='#'>[1]</a></sup>.",
'wikieditor-toolbar-help-content-rereference-description' => 'Sử dụng lại cùng chú thích',
+ 'wikieditor-toolbar-help-content-rereference-syntax' => '&lt;ref name="thá»­" /&gt;',
'wikieditor-toolbar-help-content-rereference-result' => "Ná»™i dung trang<sup><a href='#'>[1]</a></sup>.",
'wikieditor-toolbar-help-content-showreferences-description' => 'Liệt kê các chú thích',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-th.E1.BB.AD-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Văn bản liên kết</a>, văn bản bổ sung.</li></ol>",
@@ -27419,6 +27932,7 @@ $1:Example.jpg|标题2',
* @author KaiesTse
* @author Liangent
* @author Mark85296341
+ * @author Oapbtommy
* @author PhiLiP
* @author Waihorace
* @author Wong128hk
@@ -27612,7 +28126,7 @@ $1:Example.jpg|標題2',
'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' => '您輸入什麼',
'wikieditor-toolbar-help-heading-result' => '您得到什麼',
diff --git a/extensions/WikiEditor/WikiEditor.php b/extensions/WikiEditor/WikiEditor.php
index 0022c7b7..58454f00 100644
--- a/extensions/WikiEditor/WikiEditor.php
+++ b/extensions/WikiEditor/WikiEditor.php
@@ -46,6 +46,10 @@ $wgWikiEditorFeatures = array(
);
+// If set to true and the ClickTracking extension is installed, track clicks
+// on the toolbar buttons
+$wgWikiEditorToolbarClickTracking = false;
+
/* Setup */
$wgExtensionCredits['other'][] = array(
@@ -62,6 +66,7 @@ $wgHooks['EditPage::showEditForm:initial'][] = 'WikiEditorHooks::editPageShowEdi
$wgHooks['GetPreferences'][] = 'WikiEditorHooks::getPreferences';
$wgHooks['ResourceLoaderGetConfigVars'][] = 'WikiEditorHooks::resourceLoaderGetConfigVars';
$wgHooks['MakeGlobalVariablesScript'][] = 'WikiEditorHooks::makeGlobalVariablesScript';
+$wgHooks['EditPageBeforeEditToolbar'][] = 'WikiEditorHooks::EditPageBeforeEditToolbar';
$wikiEditorTpl = array(
'localBasePath' => dirname( __FILE__ ) . '/modules',
@@ -315,6 +320,7 @@ $wgResourceModules += array(
'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',
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.css b/extensions/WikiEditor/modules/ext.wikiEditor.css
index 42de5368..53e320d5 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.css
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.css
@@ -17,6 +17,7 @@ form#editform {
padding: 0;
margin: -1px;
line-height: 1.5em;
+ resize: vertical;
}
.wikiEditor-ui .wikiEditor-ui-text > textarea#wpTextbox1 {
margin: 0;
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
index 53199375..5cdeae57 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
@@ -4,11 +4,14 @@
$( document ).ready( function() {
if ( !$.wikiEditor.isSupported( $.wikiEditor.modules.toolbar ) ) {
+ $( '.wikiEditor-oldToolbar' ).show();
return;
}
// The old toolbar is still in place and needs to be removed so there aren't two toolbars
$( '#toolbar' ).remove();
// Add toolbar module
// TODO: Implement .wikiEditor( 'remove' )
- $( '#wpTextbox1' ).wikiEditor( 'addModule', $.wikiEditor.modules.toolbar.config.getDefaultConfig() );
+ $( '#wpTextbox1' ).wikiEditor(
+ 'addModule', $.wikiEditor.modules.toolbar.config.getDefaultConfig()
+ );
} );
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-error.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-error.png
index a7def768..49571bbe 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-error.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-error.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png
index 76abbba5..1935267d 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png
index 74fc1ada..eb327531 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png
index 04a5aa17..c0645999 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-invalid.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-invalid.png
index b5521b9d..8537d76f 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-invalid.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-invalid.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-notexists.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-notexists.png
index 84eb9d68..09e98835 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-notexists.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-notexists.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/collapse.png b/extensions/WikiEditor/modules/images/templateEditor/collapse.png
index acb42b91..b155a180 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/collapse.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/collapse.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png b/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png
index ce703020..93c5c794 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png b/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png
index 73832e97..5c278cea 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/expand.png b/extensions/WikiEditor/modules/images/templateEditor/expand.png
index 4c96ffd3..a92c4e4e 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/expand.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/expand.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/name-base.png b/extensions/WikiEditor/modules/images/templateEditor/name-base.png
index 4b103085..ae3d62d6 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/name-base.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/name-base.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/text-base.png b/extensions/WikiEditor/modules/images/templateEditor/text-base.png
index 9cb0c74d..d16aa18e 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/text-base.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/text-base.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png b/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png
index ea37e731..ce8cef80 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/close.png b/extensions/WikiEditor/modules/images/toc/close.png
index 511fc4ff..9078c4bf 100644
--- a/extensions/WikiEditor/modules/images/toc/close.png
+++ b/extensions/WikiEditor/modules/images/toc/close.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/grab.png b/extensions/WikiEditor/modules/images/toc/grab.png
index a0d5d7ba..144f0d67 100644
--- a/extensions/WikiEditor/modules/images/toc/grab.png
+++ b/extensions/WikiEditor/modules/images/toc/grab.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/grip.png b/extensions/WikiEditor/modules/images/toc/grip.png
index 05203f38..ad0855ab 100644
--- a/extensions/WikiEditor/modules/images/toc/grip.png
+++ b/extensions/WikiEditor/modules/images/toc/grip.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/open.png b/extensions/WikiEditor/modules/images/toc/open.png
index 459aa39b..2f26a3fd 100644
--- a/extensions/WikiEditor/modules/images/toc/open.png
+++ b/extensions/WikiEditor/modules/images/toc/open.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/arrow-down.png b/extensions/WikiEditor/modules/images/toolbar/arrow-down.png
index bf2d4fb4..0221028e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/arrow-down.png
+++ b/extensions/WikiEditor/modules/images/toolbar/arrow-down.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png b/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png
index c27c9636..063ac6f7 100644
--- a/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png
+++ b/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png b/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png
index 12ca1837..9e61e2f3 100644
--- a/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/base.png b/extensions/WikiEditor/modules/images/toolbar/base.png
index b55ed07b..5c5fb2c9 100644
--- a/extensions/WikiEditor/modules/images/toolbar/base.png
+++ b/extensions/WikiEditor/modules/images/toolbar/base.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/button-sprite.png b/extensions/WikiEditor/modules/images/toolbar/button-sprite.png
index bd8989ff..de825702 100644
--- a/extensions/WikiEditor/modules/images/toolbar/button-sprite.png
+++ b/extensions/WikiEditor/modules/images/toolbar/button-sprite.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/example-image.png b/extensions/WikiEditor/modules/images/toolbar/example-image.png
index a3853683..80a21c6a 100644
--- a/extensions/WikiEditor/modules/images/toolbar/example-image.png
+++ b/extensions/WikiEditor/modules/images/toolbar/example-image.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-big.png b/extensions/WikiEditor/modules/images/toolbar/format-big.png
index 175ea19d..11e6f3f7 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-big.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-big.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png b/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png
index 7e37b40f..de20bd49 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png b/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png
index e24afd88..a21dc787 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold.png b/extensions/WikiEditor/modules/images/toolbar/format-bold.png
index bd8e294c..cc51e326 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-bold.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png b/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png
index 3cc6c945..e94d2007 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-indent.png b/extensions/WikiEditor/modules/images/toolbar/format-indent.png
index cb864df2..14a5e22f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-indent.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-indent.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-italic-ka.png b/extensions/WikiEditor/modules/images/toolbar/format-italic-ka.png
index 2ca7a136..e5a8c080 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-italic-ka.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-italic-ka.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-italic.png b/extensions/WikiEditor/modules/images/toolbar/format-italic.png
index 1b47eeed..eb21ab4e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-italic.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-italic.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-olist-rtl.png b/extensions/WikiEditor/modules/images/toolbar/format-olist-rtl.png
index 1f065399..7d721116 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-olist-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-olist-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-olist.png b/extensions/WikiEditor/modules/images/toolbar/format-olist.png
index abaeae5f..23b4e199 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-olist.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-olist.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-small.png b/extensions/WikiEditor/modules/images/toolbar/format-small.png
index 9f031e8c..b61b008e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-small.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-small.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-subscript.png b/extensions/WikiEditor/modules/images/toolbar/format-subscript.png
index b676d89d..990f21f4 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-subscript.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-subscript.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-superscript.png b/extensions/WikiEditor/modules/images/toolbar/format-superscript.png
index 7220b3c8..26aaf46a 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-superscript.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-superscript.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png b/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png
index 51510157..5e0fc6e4 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-ulist.png b/extensions/WikiEditor/modules/images/toolbar/format-ulist.png
index 3172d4d3..dabd0183 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-ulist.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-ulist.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-file.png b/extensions/WikiEditor/modules/images/toolbar/insert-file.png
index 1e5419ad..4b0d246e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-file.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-file.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png b/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png
index 46a9acc5..d5402094 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png b/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png
index c4010cfe..c5a286e5 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-link.png b/extensions/WikiEditor/modules/images/toolbar/insert-link.png
index a8d2f2f3..287b624c 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-link.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-link.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-newline.png b/extensions/WikiEditor/modules/images/toolbar/insert-newline.png
index 67a517b4..a6fca71e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-newline.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-newline.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png b/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png
index 80889f4d..2f607bfd 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png b/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png
index d0200f6e..6230d9ec 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png b/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png
index 52931264..31137dc9 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-reference.png b/extensions/WikiEditor/modules/images/toolbar/insert-reference.png
index 8c2c4aa7..cc144ccf 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-reference.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-reference.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-signature.png b/extensions/WikiEditor/modules/images/toolbar/insert-signature.png
index 49cdc957..23ad7da7 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-signature.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-signature.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-table.png b/extensions/WikiEditor/modules/images/toolbar/insert-table.png
index 7897e78d..7113ea8c 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-table.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-table.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png b/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png
index 7bf24c46..fd28a57d 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png
index 6fd2d63a..623795f6 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png
index adcba5bd..91d5f1de 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png
index 52d04e6a..e8e95bc7 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png
index 5e60a178..dee5b106 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png
index 429bff1d..5970b4d4 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png
index cd4a9993..d785a20b 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png
index 9f50b490..eea5b71e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png
index 4584a8b2..5781fae0 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png
index 7c14e28e..b3e38798 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png
index 906ee670..3c9e8496 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png
index 13b258d7..b5a96621 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png
index 429bff1d..5970b4d4 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png
index ee834ca6..47881e1f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png
index d2a9182b..3752f8cc 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png
index a74215d6..b47d2b2c 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png
index 4e91bcc8..8e8c55a9 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png
index ee834ca6..47881e1f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png
index 69a3186d..893b187f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png
index 1b6e22d1..9a8b8656 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png
index 3fc0dce5..1e3d778b 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png
index d5e2d90c..6f9a73b8 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png
index 3ddd46cc..33c8f84c 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png
index f872244e..ab9a3752 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png
index 288aa516..22faf0ee 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png
index 9988dbcc..aaaf642f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png
index 0b003916..476a4236 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png
index e506b928..070a3e3c 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png b/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png
index de3a75f8..6c2c6617 100644
--- a/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png
+++ b/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/search-replace.png b/extensions/WikiEditor/modules/images/toolbar/search-replace.png
index cb70b929..cded6728 100644
--- a/extensions/WikiEditor/modules/images/toolbar/search-replace.png
+++ b/extensions/WikiEditor/modules/images/toolbar/search-replace.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
index 15ecb36a..f232da7f 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
@@ -204,7 +204,7 @@ getDefaultConfig: function() {
'periMsg': 'wikieditor-toolbar-tool-heading-example',
'post': ' ==',
'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
- 'regexReplace': "\$1==\$3==\$4",
+ 'regexReplace': "$1==$3==$4",
'ownline': true
}
}
@@ -218,7 +218,7 @@ getDefaultConfig: function() {
'periMsg': 'wikieditor-toolbar-tool-heading-example',
'post': ' ===',
'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
- 'regexReplace': "\$1===\$3===\$4",
+ 'regexReplace': "$1===$3===$4",
'ownline': true
}
}
@@ -232,7 +232,7 @@ getDefaultConfig: function() {
'periMsg': 'wikieditor-toolbar-tool-heading-example',
'post': ' ====',
'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
- 'regexReplace': "\$1====\$3====\$4",
+ 'regexReplace': "$1====$3====$4",
'ownline': true
}
}
@@ -246,7 +246,7 @@ getDefaultConfig: function() {
'periMsg': 'wikieditor-toolbar-tool-heading-example',
'post': ' =====',
'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
- 'regexReplace': "\$1=====\$3=====\$4",
+ 'regexReplace': "$1=====$3=====$4",
'ownline': true
}
}
@@ -678,7 +678,11 @@ getDefaultConfig: function() {
"\u060c", "\u061b", "\u061f", "\u0640",
// digits
"\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667",
- "\u0668", "\u0669", "\u066A", "\u066B", "\u066C", "\u066D"
+ "\u0668", "\u0669",
+ // other special characters
+ "\u066A", "\u066B", "\u066C", "\u066D",
+ // ZWNJ and ZWJ
+ [ "ZWNJ", "\u200C" ], [ "ZWJ", "\u200D" ]
]
},
// Characters for languages other than Arabic.
@@ -757,27 +761,49 @@ getDefaultConfig: function() {
'layout': 'characters',
'direction': 'rtl',
'characters': [
+ // Letters
"\u05d0", "\u05d1", "\u05d2", "\u05d3", "\u05d4", "\u05d5", "\u05d6", "\u05d7", "\u05d8",
"\u05d9", "\u05db", "\u05da", "\u05dc", "\u05de", "\u05dd", "\u05e0", "\u05df", "\u05e1",
"\u05e2", "\u05e4", "\u05e3", "\u05e6", "\u05e5", "\u05e7", "\u05e8", "\u05e9", "\u05ea",
- "\u05f3", "\u05f4", "\u05f0", "\u05f1", "\u05f2", "\u05be",
- [ "\u05b0\u25cc", "\u05b0" ], [ "\u05b1\u25cc", "\u05b1" ], [ "\u05b2\u25cc", "\u05b2" ],
- [ "\u05b3\u25cc", "\u05b3" ], [ "\u05b4\u25cc", "\u05b4" ], [ "\u05b5\u25cc", "\u05b5" ],
- [ "\u05b6\u25cc", "\u05b6" ], [ "\u05b7\u25cc", "\u05b7" ], [ "\u05b8\u25cc", "\u05b8" ],
- [ "\u05b9\u25cc", "\u05b9" ], [ "\u05bb\u25cc", "\u05bb" ], [ "\u05bc\u25cc", "\u05bc" ],
- [ "\u05c1\u25cc", "\u05c1" ], [ "\u05c2\u25cc", "\u05c2" ], [ "\u05c7\u25cc", "\u05c7" ],
- [ "\u0591\u25cc", "\u0591" ], [ "\u0592\u25cc", "\u0592" ], [ "\u0593\u25cc", "\u0593" ],
- [ "\u0594\u25cc", "\u0594" ], [ "\u0595\u25cc", "\u0595" ], [ "\u0596\u25cc", "\u0596" ],
- [ "\u0597\u25cc", "\u0597" ], [ "\u0598\u25cc", "\u0598" ], [ "\u0599\u25cc", "\u0599" ],
- [ "\u059a\u25cc", "\u059a" ], [ "\u059b\u25cc", "\u059b" ], [ "\u059c\u25cc", "\u059c" ],
- [ "\u059d\u25cc", "\u059d" ], [ "\u059e\u25cc", "\u059e" ], [ "\u059f\u25cc", "\u059f" ],
- [ "\u05a0\u25cc", "\u05a0" ], [ "\u05a1\u25cc", "\u05a1" ], [ "\u05a2\u25cc", "\u05a2" ],
- [ "\u05a3\u25cc", "\u05a3" ], [ "\u05a4\u25cc", "\u05a4" ], [ "\u05a5\u25cc", "\u05a5" ],
- [ "\u05a6\u25cc", "\u05a6" ], [ "\u05a7\u25cc", "\u05a7" ], [ "\u05a8\u25cc", "\u05a8" ],
- [ "\u05a9\u25cc", "\u05a9" ], [ "\u05aa\u25cc", "\u05aa" ], [ "\u05ab\u25cc", "\u05ab" ],
- [ "\u05ac\u25cc", "\u05ac" ], [ "\u05ad\u25cc", "\u05ad" ], [ "\u05ae\u25cc", "\u05ae" ],
- [ "\u05af\u25cc", "\u05af" ], [ "\u05bf\u25cc", "\u05bf" ], [ "\u05c0\u25cc", "\u05c0" ],
- [ "\u05c3\u25cc", "\u05c3" ]
+
+ // Yiddish
+ "\u05f0", "\u05f1", "\u05f2",
+
+ // Punctuation
+ "\u05f3", "\u05f4", "\u05be", "\u2013",
+ {
+ 'label': "\u201e\u201d",
+ 'action': {
+ 'type': 'encapsulate', 'options': { 'pre': "\u201e", 'post': "\u201d" }
+ }
+ },
+ {
+ 'label': "\u201a\u2019",
+ 'action': {
+ 'type': 'encapsulate', 'options': { 'pre': "\u201a", 'post': "\u2019" }
+ }
+ },
+
+ // Vowels
+ [ "\u25cc\u05b0", "\u05b0" ], [ "\u25cc\u05b1", "\u05b1" ], [ "\u25cc\u05b2", "\u05b2" ],
+ [ "\u25cc\u05b3", "\u05b3" ], [ "\u25cc\u05b4", "\u05b4" ], [ "\u25cc\u05b5", "\u05b5" ],
+ [ "\u25cc\u05b6", "\u05b6" ], [ "\u25cc\u05b7", "\u05b7" ], [ "\u25cc\u05b8", "\u05b8" ],
+ [ "\u25cc\u05b9", "\u05b9" ], [ "\u25cc\u05bb", "\u05bb" ], [ "\u25cc\u05bc", "\u05bc" ],
+ [ "\u25cc\u05c1", "\u05c1" ], [ "\u25cc\u05c2", "\u05c2" ], [ "\u25cc\u05c7", "\u05c7" ],
+
+ // Cantillation
+ [ "\u25cc\u0591", "\u0591" ], [ "\u25cc\u0592", "\u0592" ], [ "\u25cc\u0593", "\u0593" ],
+ [ "\u25cc\u0594", "\u0594" ], [ "\u25cc\u0595", "\u0595" ], [ "\u25cc\u0596", "\u0596" ],
+ [ "\u25cc\u0597", "\u0597" ], [ "\u25cc\u0598", "\u0598" ], [ "\u25cc\u0599", "\u0599" ],
+ [ "\u25cc\u059a", "\u059a" ], [ "\u25cc\u059b", "\u059b" ], [ "\u25cc\u059c", "\u059c" ],
+ [ "\u25cc\u059d", "\u059d" ], [ "\u25cc\u059e", "\u059e" ], [ "\u25cc\u059f", "\u059f" ],
+ [ "\u25cc\u05a0", "\u05a0" ], [ "\u25cc\u05a1", "\u05a1" ], [ "\u25cc\u05a2", "\u05a2" ],
+ [ "\u25cc\u05a3", "\u05a3" ], [ "\u25cc\u05a4", "\u05a4" ], [ "\u25cc\u05a5", "\u05a5" ],
+ [ "\u25cc\u05a6", "\u05a6" ], [ "\u25cc\u05a7", "\u05a7" ], [ "\u25cc\u05a8", "\u05a8" ],
+ [ "\u25cc\u05a9", "\u05a9" ], [ "\u25cc\u05aa", "\u05aa" ], [ "\u25cc\u05ab", "\u05ab" ],
+ [ "\u25cc\u05ac", "\u05ac" ], [ "\u25cc\u05ad", "\u05ad" ], [ "\u25cc\u05ae", "\u05ae" ],
+ [ "\u25cc\u05af", "\u05af" ], [ "\u25cc\u05bf", "\u05bf" ], [ "\u25cc\u05c0", "\u05c0" ],
+ [ "\u25cc\u05c3", "\u05c3" ]
]
},
'bangla': {
@@ -795,6 +821,16 @@ getDefaultConfig: function() {
"\u09e8", "\u09e9", "\u09ea", "\u09eb", "\u09ec", "\u09ed", "\u09ee", "\u09ef", "\u09e6"
]
},
+ 'tamil': {
+ 'labelMsg': 'wikieditor-toolbar-characters-page-tamil',
+ 'language': 'ta',
+ 'layout': 'characters',
+ 'characters': [
+ "\u0be6", "\u0be7", "\u0be8", "\u0be9", "\u0bea", "\u0beb", "\u0bec", "\u0bed", "\u0bee",
+ "\u0bef", "\u0bf0", "\u0bf1", "\u0bf2", "\u0bf3", "\u0bf4", "\u0bf5", "\u0bf6", "\u0bf7",
+ "\u0bf8", "\u0bf9", "\u0bfa", "\u0bd0"
+ ]
+ },
'telugu': {
'labelMsg': 'wikieditor-toolbar-characters-page-telugu',
'language': 'te',
@@ -838,18 +874,45 @@ getDefaultConfig: function() {
'language': 'gu',
'layout': 'characters',
'characters': [
- "\u0ad0", "\u0a85", "\u0a86", "\u0a87", "\u0a88", "\u0a89", "\u0a8a", "\u0a8b", "\u0ae0",
- "\u0a8c", "\u0ae1", "\u0a8d", "\u0a8f", "\u0a90", "\u0a91", "\u0a93", "\u0a94", "\u0a95",
- "\u0a96", "\u0a97", "\u0a98", "\u0a99", "\u0a9a", "\u0a9b", "\u0a9c", "\u0a9d", "\u0a9e",
- "\u0a9f", "\u0aa0", "\u0aa1", "\u0aa2", "\u0aa3", "\u0aa4", "\u0aa5", "\u0aa6", "\u0aa7",
- "\u0aa8", "\u0aaa", "\u0aab", "\u0aac", "\u0aad", "\u0aae", "\u0aaf", "\u0ab0", "\u0ab2",
- "\u0ab5", "\u0ab6", "\u0ab7", "\u0ab8", "\u0ab9", "\u0ab3", "\u0abd",
- [ "\u25cc\u0abe", "\u0abe" ], [ "\u25cc\u0abf", "\u0abf" ], [ "\u25cc\u0ac0", "\u0ac0" ],
- [ "\u25cc\u0ac1", "\u0ac1" ], [ "\u25cc\u0ac2", "\u0ac2" ], [ "\u25cc\u0ac3", "\u0ac3" ],
- [ "\u25cc\u0ac4", "\u0ac4" ], [ "\u25cc\u0ae2", "\u0ae2" ], [ "\u25cc\u0ae3", "\u0ae3" ],
- [ "\u25cc\u0ac5", "\u0ac5" ], [ "\u25cc\u0ac7", "\u0ac7" ], [ "\u25cc\u0ac8", "\u0ac8" ],
- [ "\u25cc\u0ac9", "\u0ac9" ], [ "\u25cc\u0acb", "\u0acb" ], [ "\u25cc\u0acc", "\u0acc" ],
- [ "\u25cc\u0acd", "\u0acd" ]
+ "\u0ad0", // Om
+ "\u0a81", // Candrabindu
+ "\u0a82", // Anusvara
+ "\u0a83", // Visarga
+ // Vowels
+ "\u0a85", "\u0a86", // A
+ "\u0a87", "\u0a88", // I
+ "\u0a89", "\u0a8a", // U
+ "\u0a8f", "\u0a90", // E
+ "\u0a93", "\u0a94", // O
+ "\u0a85\u0a82", // A with Anusvara
+ "\u0a8b", // Vocalic R
+ "\u0a8d", "\u0a91", // Candra E and O
+ // Special vowels
+ "\u0a8c", // Vocalic L
+ "\u0ae0", // Vocalic RR
+ "\u0ae1", // Vocalic LL
+ // Consonants
+ "\u0a95", "\u0a96", "\u0a97", "\u0a98", "\u0a99",
+ "\u0a9a", "\u0a9b", "\u0a9c", "\u0a9d", "\u0a9e",
+ "\u0a9f", "\u0aa0", "\u0aa1", "\u0aa2", "\u0aa3",
+ "\u0aa4", "\u0aa5", "\u0aa6", "\u0aa7", "\u0aa8",
+ "\u0aaa", "\u0aab", "\u0aac", "\u0aad", "\u0aae",
+ "\u0aaf", "\u0ab0", "\u0ab2", "\u0ab3",
+ "\u0ab5", "\u0ab6", "\u0ab7", "\u0ab8", "\u0ab9",
+ "\u0a95\u0acd\u0ab7", // ksh
+ "\u0a9c\u0acd\u0a9e", // jny
+ "\u0abd", // Avagraha
+ // Vowel signs
+ "\u0abe", "\u0abf", "\u0ac0", "\u0ac0", "\u0ac1", "\u0ac2",
+ "\u0ac3", "\u0ac4", "\u0ac5", "\u0ac7", "\u0ac8", "\u0ac9", "\u0acb", "\u0acc",
+ "\u0ae2", "\u0ae3",
+ // Virama
+ "\u0acd",
+ // Digits
+ "\u0ae6", "\u0ae7", "\u0ae8", "\u0ae9", "\u0aea",
+ "\u0aeb", "\u0aec", "\u0aed", "\u0aee", "\u0aef",
+ // Rupee
+ "\u0af1"
]
},
'thai': {
@@ -1088,4 +1151,4 @@ getDefaultConfig: function() {
} };
}
-}; } ) ( jQuery ); \ No newline at end of file
+}; } ) ( jQuery );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.css b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.css
index aab08ca8..a5903a63 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.css
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.css
@@ -271,7 +271,7 @@
font-size: 1.25em;
}
.wikiEditor-ui-toolbar .page-characters div[dir=rtl] span {
- direction: rtl;
+ /* @noflip */ direction: rtl;
}
.wikiEditor-ui-toolbar .page-characters div span:hover {
background-color: white;
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
index 20d8ecd9..3f7937d8 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
@@ -238,7 +238,7 @@ fn: {
doAction : function( context, action, source ) {
// Verify that this has been called from a source that's within the toolbar
// 'trackAction' defined in click tracking
- if ( $.trackAction !== undefined && source.closest( '.wikiEditor-ui-toolbar' ).size() ) {
+ if ( mw.config.get( 'wgWikiEditorToolbarClickTracking' ) && $.trackAction !== undefined && source.closest( '.wikiEditor-ui-toolbar' ).size() ) {
// Build a unique id for this action by tracking the parent rel attributes up to the toolbar level
var rels = [];
var step = source;
@@ -461,7 +461,7 @@ fn: {
{ expires: 30, path: '/' }
);
// Click tracking
- if ( $.trackAction !== undefined){
+ if ( mw.config.get( 'wgWikiEditorToolbarClickTracking' ) && $.trackAction !== undefined ) {
$.trackAction(section + '.' + $(this).attr('rel'));
}
context.fn.restoreCursorAndScrollTop();
@@ -640,7 +640,7 @@ fn: {
} );
}
// Click tracking
- if ( $.trackAction !== undefined ) {
+ if ( mw.config.get( 'wgWikiEditorToolbarClickTracking' ) && $.trackAction !== undefined ) {
$.trackAction( $section.attr('rel') + '.' + ( show ? 'show': 'hide' ) );
}
// Save the currently visible section
diff --git a/img_auth.php b/img_auth.php
index ed4c6be4..7b09eb64 100644
--- a/img_auth.php
+++ b/img_auth.php
@@ -10,14 +10,15 @@
*
* Optional Parameters
*
- * - Set $wgImgAuthDetails = true if you want the reason the access was denied messages to be displayed
- * instead of just the 403 error (doesn't work on IE anyway), otherwise will only appear in error logs
+ * - Set $wgImgAuthDetails = true if you want the reason the access was denied messages to
+ * be displayed instead of just the 403 error (doesn't work on IE anyway),
+ * otherwise it will only appear in error logs
* - Set $wgImgAuthPublicTest false if you don't want to just check and see if all are public
* must be set to false if using specific restrictions such as LockDown or NSFileRepo
*
- * For security reasons, you usually don't want your user to know *why* access was denied, just that it was.
- * If you want to change this, you can set $wgImgAuthDetails to 'true' in localsettings.php and it will give the user the reason
- * why access was denied.
+ * For security reasons, you usually don't want your user to know *why* access was denied,
+ * just that it was. If you want to change this, you can set $wgImgAuthDetails to 'true'
+ * in localsettings.php and it will give the user the reason why access was denied.
*
* Your server needs to support PATH_INFO; CGI-based configurations usually don't.
*
@@ -32,97 +33,126 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
}
wfProfileIn( 'img_auth.php' );
-require_once( dirname( __FILE__ ) . '/includes/StreamFile.php' );
-
-$wgActionPaths[] = $_SERVER['SCRIPT_NAME'];
-// See if this is a public Wiki (no protections)
-if ( $wgImgAuthPublicTest
- && in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) )
-{
- wfForbidden('img-auth-accessdenied','img-auth-public');
-}
-
-$matches = WebRequest::getPathInfo();
-$path = $matches['title'];
-
-// Check for bug 28235: QUERY_STRING overriding the correct extension
-$dotPos = strrpos( $path, '.' );
-$whitelist = array();
-if ( $dotPos !== false ) {
- $whitelist[] = substr( $path, $dotPos + 1 );
-}
-if ( !$wgRequest->checkUrlExtension( $whitelist ) )
-{
- return;
-}
-
-$filename = realpath( $wgUploadDirectory . $path );
-$realUpload = realpath( $wgUploadDirectory );
-
-// Basic directory traversal check
-if( substr( $filename, 0, strlen( $realUpload ) ) != $realUpload )
- wfForbidden('img-auth-accessdenied','img-auth-notindir');
-
-// Extract the file name and chop off the size specifier
-// (e.g. 120px-Foo.png => Foo.png)
-$name = wfBaseName( $path );
-if( preg_match( '!\d+px-(.*)!i', $name, $m ) )
- $name = $m[1];
-
-// Check to see if the file exists
-if( !file_exists( $filename ) )
- wfForbidden('img-auth-accessdenied','img-auth-nofile',$filename);
-
-// Check to see if tried to access a directory
-if( is_dir( $filename ) )
- wfForbidden('img-auth-accessdenied','img-auth-isdir',$filename);
+# Set action base paths so that WebRequest::getPathInfo()
+# recognizes the "X" as the 'title' in ../image_auth/X urls.
+$wgArticlePath = false; # Don't let a "/*" article path clober our action path
+$wgActionPaths = array( "$wgUploadPath/" );
-$title = Title::makeTitleSafe( NS_FILE, $name );
-
-// See if could create the title object
-if( !$title instanceof Title )
- wfForbidden('img-auth-accessdenied','img-auth-badtitle',$name);
-
-// Run hook
-if (!wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) )
- wfForbidden($result[0],$result[1],array_slice($result,2));
-
-// Check user authorization for this title
-// UserCanRead Checks Whitelist too
-if( !$title->userCanRead() )
- wfForbidden('img-auth-accessdenied','img-auth-noread',$name);
-
-// Stream the requested file
-wfDebugLog( 'img_auth', "Streaming `".$filename."`." );
-wfStreamFile( $filename, array( 'Cache-Control: private', 'Vary: Cookie' ) );
+wfImageAuthMain();
wfLogProfilingData();
+function wfImageAuthMain() {
+ global $wgImgAuthPublicTest, $wgRequest, $wgUploadDirectory;
+
+ // See if this is a public Wiki (no protections).
+ if ( $wgImgAuthPublicTest
+ && in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) )
+ {
+ // This is a public wiki, so disable this script (for private wikis only)
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-public' );
+ return;
+ }
+
+ // Get the requested file path (source file or thumbnail)
+ $matches = WebRequest::getPathInfo();
+ if ( !isset( $matches['title'] ) ) {
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-nopathinfo' );
+ return;
+ }
+ $path = $matches['title'];
+ if ( $path && $path[0] !== '/' ) {
+ // Make sure $path has a leading /
+ $path = "/" . $path;
+ }
+
+ // Check for bug 28235: QUERY_STRING overriding the correct extension
+ $whitelist = array();
+ $dotPos = strrpos( $path, '.' );
+ if ( $dotPos !== false ) {
+ $whitelist[] = substr( $path, $dotPos + 1 );
+ }
+ if ( !$wgRequest->checkUrlExtension( $whitelist ) ) {
+ return;
+ }
+
+ // Get the local file repository
+ $repo = RepoGroup::singleton()->getRepo( 'local' );
+
+ // Get the full file storage path and extract the source file name.
+ // (e.g. 120px-Foo.png => Foo.png or page2-120px-Foo.png => Foo.png).
+ // This only applies to thumbnails, and all thumbnails should
+ // be under a folder that has the source file name.
+ if ( strpos( $path, '/thumb/' ) === 0 ) {
+ $name = wfBaseName( dirname( $path ) ); // file is a thumbnail
+ $filename = $repo->getZonePath( 'thumb' ) . substr( $path, 6 ); // strip "/thumb"
+ } else {
+ $name = wfBaseName( $path ); // file is a source file
+ $filename = $repo->getZonePath( 'public' ) . $path;
+ }
+
+ // Check to see if the file exists
+ if ( !$repo->fileExists( $filename, FileRepo::FILES_ONLY ) ) {
+ wfForbidden( 'img-auth-accessdenied','img-auth-nofile', $filename );
+ return;
+ }
+
+ $title = Title::makeTitleSafe( NS_FILE, $name );
+ if ( !$title instanceof Title ) { // files have valid titles
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-badtitle', $name );
+ return;
+ }
+
+ // Run hook for extension authorization plugins
+ if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
+ wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
+ return;
+ }
+
+ // Check user authorization for this title
+ // Checks Whitelist too
+ if ( !$title->userCan( 'read' ) ) {
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $name );
+ return;
+ }
+
+ // Stream the requested file
+ wfDebugLog( 'img_auth', "Streaming `".$filename."`." );
+ $repo->streamFile( $filename, array( 'Cache-Control: private', 'Vary: Cookie' ) );
+}
+
/**
* Issue a standard HTTP 403 Forbidden header ($msg1-a message index, not a message) and an
* error message ($msg2, also a message index), (both required) then end the script
* subsequent arguments to $msg2 will be passed as parameters only for replacing in $msg2
+ * @param $msg1
+ * @param $msg2
*/
-function wfForbidden($msg1,$msg2) {
+function wfForbidden( $msg1, $msg2 ) {
global $wgImgAuthDetails;
+
$args = func_get_args();
array_shift( $args );
array_shift( $args );
- $MsgHdr = htmlspecialchars(wfMsg($msg1));
- $detailMsg = (htmlspecialchars(wfMsg(($wgImgAuthDetails ? $msg2 : 'badaccess-group0'),$args)));
- wfDebugLog('img_auth', "wfForbidden Hdr:".wfMsgExt( $msg1, array('language' => 'en'))." Msg: ".
- wfMsgExt($msg2,array('language' => 'en'),$args));
+
+ $msgHdr = htmlspecialchars( wfMsg( $msg1 ) );
+ $detailMsgKey = $wgImgAuthDetails ? $msg2 : 'badaccess-group0';
+ $detailMsg = htmlspecialchars( wfMsg( $detailMsgKey, $args ) );
+
+ wfDebugLog( 'img_auth',
+ "wfForbidden Hdr:" . wfMsgExt( $msg1, array( 'language' => 'en' ) ). " Msg: ".
+ wfMsgExt( $msg2, array( 'language' => 'en' ), $args )
+ );
+
header( 'HTTP/1.0 403 Forbidden' );
header( 'Cache-Control: no-cache' );
header( 'Content-Type: text/html; charset=utf-8' );
echo <<<ENDS
<html>
<body>
-<h1>$MsgHdr</h1>
+<h1>$msgHdr</h1>
<p>$detailMsg</p>
</body>
</html>
ENDS;
- wfLogProfilingData();
- exit();
}
diff --git a/includes/Action.php b/includes/Action.php
index d5432b23..37c48488 100644
--- a/includes/Action.php
+++ b/includes/Action.php
@@ -1,5 +1,9 @@
<?php
/**
+ * @defgroup Actions Action done on pages
+ */
+
+/**
* Actions are things which can be done to pages (edit, delete, rollback, etc). They
* are distinct from Special Pages because an action must apply to exactly one page.
*
@@ -27,7 +31,7 @@ abstract class Action {
/**
* Page on which we're performing the action
- * @var Article
+ * @var Page
*/
protected $page;
@@ -72,34 +76,82 @@ abstract class Action {
/**
* Get an appropriate Action subclass for the given action
* @param $action String
- * @param $page Article
+ * @param $page Page
+ * @param $context IContextSource
* @return Action|false|null false if the action is disabled, null
* if it is not recognised
*/
- public final static function factory( $action, Page $page ) {
+ public final static function factory( $action, Page $page, IContextSource $context = null ) {
$class = self::getClass( $action, $page->getActionOverrides() );
if ( $class ) {
- $obj = new $class( $page );
+ $obj = new $class( $page, $context );
return $obj;
}
return $class;
}
/**
+ * Get the action that will be executed, not necessarily the one passed
+ * passed through the "action" request parameter. Actions disabled in
+ * $wgActions will be replaced by "nosuchaction".
+ *
+ * @since 1.19
+ * @param $context IContextSource
+ * @return string: action name
+ */
+ public final static function getActionName( IContextSource $context ) {
+ global $wgActions;
+
+ $request = $context->getRequest();
+ $actionName = $request->getVal( 'action', 'view' );
+
+ // Check for disabled actions
+ if ( isset( $wgActions[$actionName] ) && $wgActions[$actionName] === false ) {
+ $actionName = 'nosuchaction';
+ }
+
+ // Workaround for bug #20966: inability of IE to provide an action dependent
+ // on which submit button is clicked.
+ if ( $actionName === 'historysubmit' ) {
+ if ( $request->getBool( 'revisiondelete' ) ) {
+ $actionName = 'revisiondelete';
+ } else {
+ $actionName = 'view';
+ }
+ } elseif ( $actionName == 'editredlink' ) {
+ $actionName = 'edit';
+ }
+
+ // Trying to get a WikiPage for NS_SPECIAL etc. will result
+ // in WikiPage::factory throwing "Invalid or virtual namespace -1 given."
+ // For SpecialPages et al, default to action=view.
+ if ( !$context->canUseWikiPage() ) {
+ return 'view';
+ }
+
+ $action = Action::factory( $actionName, $context->getWikiPage() );
+ if ( $action instanceof Action ) {
+ return $action->getName();
+ }
+
+ return 'nosuchaction';
+ }
+
+ /**
* Check if a given action is recognised, even if it's disabled
*
* @param $name String: name of an action
* @return Bool
*/
public final static function exists( $name ) {
- return self::getClass( $name ) !== null;
+ return self::getClass( $name, array() ) !== null;
}
/**
* Get the IContextSource in use here
* @return IContextSource
*/
- protected final function getContext() {
+ public final function getContext() {
if ( $this->context instanceof IContextSource ) {
return $this->context;
}
@@ -111,7 +163,7 @@ abstract class Action {
*
* @return WebRequest
*/
- protected final function getRequest() {
+ public final function getRequest() {
return $this->getContext()->getRequest();
}
@@ -120,7 +172,7 @@ abstract class Action {
*
* @return OutputPage
*/
- protected final function getOutput() {
+ public final function getOutput() {
return $this->getContext()->getOutput();
}
@@ -129,7 +181,7 @@ abstract class Action {
*
* @return User
*/
- protected final function getUser() {
+ public final function getUser() {
return $this->getContext()->getUser();
}
@@ -138,34 +190,58 @@ abstract class Action {
*
* @return Skin
*/
- protected final function getSkin() {
+ public final function getSkin() {
return $this->getContext()->getSkin();
}
/**
* Shortcut to get the user Language being used for this instance
*
- * @return Skin
+ * @return Language
+ */
+ public final function getLanguage() {
+ return $this->getContext()->getLanguage();
+ }
+
+ /**
+ * Shortcut to get the user Language being used for this instance
+ *
+ * @deprecated 1.19 Use getLanguage instead
+ * @return Language
*/
- protected final function getLang() {
- return $this->getContext()->getLang();
+ public final function getLang() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->getLanguage();
}
/**
* Shortcut to get the Title object from the page
* @return Title
*/
- protected final function getTitle() {
+ public final function getTitle() {
return $this->page->getTitle();
}
/**
+ * Get a Message object with context set
+ * Parameters are the same as wfMessage()
+ *
+ * @return Message object
+ */
+ public final function msg() {
+ $params = func_get_args();
+ return call_user_func_array( array( $this->getContext(), 'msg' ), $params );
+ }
+
+ /**
* Protected constructor: use Action::factory( $action, $page ) to actually build
* these things in the real world
- * @param Page $page
+ * @param $page Page
+ * @param $context IContextSource
*/
- protected function __construct( Page $page ) {
+ protected function __construct( Page $page, IContextSource $context = null ) {
$this->page = $page;
+ $this->context = $context;
}
/**
@@ -177,8 +253,11 @@ abstract class Action {
/**
* Get the permission required to perform this action. Often, but not always,
* the same as the action name
+ * @return String|null
*/
- public abstract function getRestriction();
+ public function getRestriction() {
+ return null;
+ }
/**
* Checks if the given user (identified by an object) can perform this action. Can be
@@ -189,18 +268,25 @@ abstract class Action {
* @throws ErrorPageError
*/
protected function checkCanExecute( User $user ) {
- if ( $this->requiresWrite() && wfReadOnly() ) {
- throw new ReadOnlyError();
- }
-
- if ( $this->getRestriction() !== null && !$user->isAllowed( $this->getRestriction() ) ) {
- throw new PermissionsError( $this->getRestriction() );
+ $right = $this->getRestriction();
+ if ( $right !== null ) {
+ $errors = $this->getTitle()->getUserPermissionsErrors( $right, $user );
+ if ( count( $errors ) ) {
+ throw new PermissionsError( $right, $errors );
+ }
}
if ( $this->requiresUnblock() && $user->isBlocked() ) {
$block = $user->mBlock;
throw new UserBlockedError( $block );
}
+
+ // This should be checked at the end so that the user won't think the
+ // error is only temporary when he also don't have the rights to execute
+ // this action
+ if ( $this->requiresWrite() && wfReadOnly() ) {
+ throw new ReadOnlyError();
+ }
}
/**
@@ -246,7 +332,7 @@ abstract class Action {
* @return String
*/
protected function getDescription() {
- return wfMsg( strtolower( $this->getName() ) );
+ return wfMsgHtml( strtolower( $this->getName() ) );
}
/**
@@ -259,8 +345,6 @@ abstract class Action {
/**
* Execute the action in a silent fashion: do not display anything or release any errors.
- * @param $data Array values that would normally be in the POST request
- * @param $captureErrors Bool whether to catch exceptions and just return false
* @return Bool whether execution was successful
*/
public abstract function execute();
@@ -279,6 +363,10 @@ abstract class FormAction extends Action {
* @return String HTML which will be sent to $form->addPreText()
*/
protected function preText() { return ''; }
+
+ /**
+ * @return string
+ */
protected function postText() { return ''; }
/**
diff --git a/includes/AjaxResponse.php b/includes/AjaxResponse.php
index b9f80855..e60ca23c 100644
--- a/includes/AjaxResponse.php
+++ b/includes/AjaxResponse.php
@@ -180,11 +180,11 @@ class AjaxResponse {
$this->disable();
$this->mLastModified = $lastmod;
- wfDebug( "$fname: CACHED client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false );
+ wfDebug( "$fname: CACHED client: $ismodsince ; user: {$wgUser->getTouched()} ; page: $timestamp ; site $wgCacheEpoch\n", false );
return true;
} else {
- wfDebug( "$fname: READY client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false );
+ wfDebug( "$fname: READY client: $ismodsince ; user: {$wgUser->getTouched()} ; page: $timestamp ; site $wgCacheEpoch\n", false );
$this->mLastModified = $lastmod;
}
} else {
@@ -193,6 +193,11 @@ class AjaxResponse {
}
}
+ /**
+ * @param $mckey
+ * @param $touched
+ * @return bool
+ */
function loadFromMemcached( $mckey, $touched ) {
global $wgMemc;
@@ -216,6 +221,11 @@ class AjaxResponse {
return false;
}
+ /**
+ * @param $mckey
+ * @param $expiry int
+ * @return bool
+ */
function storeInMemcached( $mckey, $expiry = 86400 ) {
global $wgMemc;
diff --git a/includes/Article.php b/includes/Article.php
index a0cc6a95..b07f309c 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -32,6 +32,11 @@ class Article extends Page {
*/
protected $mPage;
+ /**
+ * @var ParserOptions: ParserOptions object for $wgUser articles
+ */
+ public $mParserOptions;
+
var $mContent; // !<
var $mContentLoaded = false; // !<
var $mOldId; // !<
@@ -69,6 +74,10 @@ class Article extends Page {
$this->mPage = $this->newPage( $title );
}
+ /**
+ * @param $title Title
+ * @return WikiPage
+ */
protected function newPage( Title $title ) {
return new WikiPage( $title );
}
@@ -76,6 +85,7 @@ class Article extends Page {
/**
* Constructor from a page id
* @param $id Int article ID to load
+ * @return Article|null
*/
public static function newFromID( $id ) {
$t = Title::newFromID( $id );
@@ -140,6 +150,7 @@ class Article extends Page {
/**
* Get the title object of the article
+ *
* @return Title object of this page
*/
public function getTitle() {
@@ -147,9 +158,17 @@ class Article extends Page {
}
/**
+ * Get the WikiPage object of this instance
+ *
+ * @since 1.19
+ * @return WikiPage
+ */
+ public function getPage() {
+ return $this->mPage;
+ }
+
+ /**
* Clear the object
- * @todo FIXME: Shouldn't this be public?
- * @private
*/
public function clear() {
$this->mContentLoaded = false;
@@ -164,7 +183,7 @@ class Article extends Page {
/**
* Note that getContent/loadContent do not follow redirects anymore.
* If you need to fetch redirectable content easily, try
- * the shortcut in Article::followRedirect()
+ * the shortcut in WikiPage::getRedirectTarget()
*
* This function has side effects! Do not use this function if you
* only want the real revision text if any.
@@ -191,7 +210,7 @@ class Article extends Page {
return $text;
} else {
- $this->loadContent();
+ $this->fetchContent();
wfProfileOut( __METHOD__ );
return $this->mContent;
@@ -220,27 +239,39 @@ class Article extends Page {
$this->mRedirectUrl = false;
- $oldid = $wgRequest->getVal( 'oldid' );
+ $oldid = $wgRequest->getIntOrNull( 'oldid' );
- if ( isset( $oldid ) ) {
- $oldid = intval( $oldid );
- if ( $wgRequest->getVal( 'direction' ) == 'next' ) {
- $nextid = $this->getTitle()->getNextRevisionID( $oldid );
- if ( $nextid ) {
- $oldid = $nextid;
- } else {
- $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
- }
- } elseif ( $wgRequest->getVal( 'direction' ) == 'prev' ) {
- $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
- if ( $previd ) {
- $oldid = $previd;
+ if ( $oldid === null ) {
+ return 0;
+ }
+
+ if ( $oldid !== 0 ) {
+ # Load the given revision and check whether the page is another one.
+ # In that case, update this instance to reflect the change.
+ $this->mRevision = Revision::newFromId( $oldid );
+ if ( $this->mRevision !== null ) {
+ // Revision title doesn't match the page title given?
+ if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
+ $function = array( get_class( $this->mPage ), 'newFromID' );
+ $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
}
}
}
- if ( !$oldid ) {
- $oldid = 0;
+ if ( $wgRequest->getVal( 'direction' ) == 'next' ) {
+ $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+ if ( $nextid ) {
+ $oldid = $nextid;
+ $this->mRevision = null;
+ } else {
+ $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
+ }
+ } elseif ( $wgRequest->getVal( 'direction' ) == 'prev' ) {
+ $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+ if ( $previd ) {
+ $oldid = $previd;
+ $this->mRevision = null;
+ }
}
return $oldid;
@@ -248,31 +279,31 @@ class Article extends Page {
/**
* Load the revision (including text) into this object
+ *
+ * @deprecated in 1.19; use fetchContent()
*/
function loadContent() {
- if ( $this->mContentLoaded ) {
- return;
- }
-
- wfProfileIn( __METHOD__ );
-
- $this->fetchContent( $this->getOldID() );
-
- wfProfileOut( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.19' );
+ $this->fetchContent();
}
/**
* Get text of an article from database
* Does *NOT* follow redirects.
*
- * @param $oldid Int: 0 for whatever the latest revision is
* @return mixed string containing article contents, or false if null
*/
- function fetchContent( $oldid = 0 ) {
+ function fetchContent() {
if ( $this->mContentLoaded ) {
return $this->mContent;
}
+ wfProfileIn( __METHOD__ );
+
+ $this->mContentLoaded = true;
+
+ $oldid = $this->getOldID();
+
# Pre-fill content with error message so that if something
# fails we'll have something telling us what we intended.
$t = $this->getTitle()->getPrefixedText();
@@ -280,43 +311,39 @@ class Article extends Page {
$this->mContent = wfMsgNoTrans( 'missing-article', $t, $d ) ;
if ( $oldid ) {
- $revision = Revision::newFromId( $oldid );
- if ( !$revision ) {
- wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
- return false;
- }
- // Revision title doesn't match the page title given?
- if ( $this->mPage->getID() != $revision->getPage() ) {
- $function = array( get_class( $this->mPage ), 'newFromID' );
- $this->mPage = call_user_func( $function, $revision->getPage() );
- if ( !$this->mPage->getId() ) {
- wfDebug( __METHOD__ . " failed to get page data linked to revision id $oldid\n" );
+ # $this->mRevision might already be fetched by getOldIDFromRequest()
+ if ( !$this->mRevision ) {
+ $this->mRevision = Revision::newFromId( $oldid );
+ if ( !$this->mRevision ) {
+ wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
+ wfProfileOut( __METHOD__ );
return false;
}
}
} else {
if ( !$this->mPage->getLatest() ) {
wfDebug( __METHOD__ . " failed to find page data for title " . $this->getTitle()->getPrefixedText() . "\n" );
+ wfProfileOut( __METHOD__ );
return false;
}
- $revision = $this->mPage->getRevision();
- if ( !$revision ) {
+ $this->mRevision = $this->mPage->getRevision();
+ if ( !$this->mRevision ) {
wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " . $this->mPage->getLatest() . "\n" );
+ wfProfileOut( __METHOD__ );
return false;
}
}
// @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
// We should instead work with the Revision object when we need it...
- $this->mContent = $revision->getText( Revision::FOR_THIS_USER ); // Loads if user is allowed
-
- $this->mRevIdFetched = $revision->getId();
- $this->mContentLoaded = true;
- $this->mRevision =& $revision;
+ $this->mContent = $this->mRevision->getText( Revision::FOR_THIS_USER ); // Loads if user is allowed
+ $this->mRevIdFetched = $this->mRevision->getId();
wfRunHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+ wfProfileOut( __METHOD__ );
+
return $this->mContent;
}
@@ -325,7 +352,7 @@ class Article extends Page {
* @deprecated since 1.18
*/
public function forUpdate() {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
}
/**
@@ -343,6 +370,19 @@ class Article extends Page {
}
/**
+ * Get the fetched Revision object depending on request parameters or null
+ * on failure.
+ *
+ * @since 1.19
+ * @return Revision|null
+ */
+ public function getRevisionFetched() {
+ $this->fetchContent();
+
+ return $this->mRevision;
+ }
+
+ /**
* Use this to fetch the rev ID used on page views
*
* @return int revision ID of last article revision
@@ -361,14 +401,25 @@ class Article extends Page {
*/
public function view() {
global $wgUser, $wgOut, $wgRequest, $wgParser;
- global $wgUseFileCache, $wgUseETag;
+ global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
wfProfileIn( __METHOD__ );
# Get variables from query string
+ # As side effect this will load the revision and update the title
+ # in a revision ID is passed in the request, so this should remain
+ # the first call of this method even if $oldid is used way below.
$oldid = $this->getOldID();
- # getOldID may want us to redirect somewhere else
+ # Another whitelist check in case getOldID() is altering the title
+ $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $wgUser );
+ if ( count( $permErrors ) ) {
+ wfDebug( __METHOD__ . ": denied on secondary read check\n" );
+ wfProfileOut( __METHOD__ );
+ throw new PermissionsError( 'read', $permErrors );
+ }
+
+ # getOldID() may as well want us to redirect somewhere else
if ( $this->mRedirectUrl ) {
$wgOut->redirect( $this->mRedirectUrl );
wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
@@ -377,10 +428,6 @@ class Article extends Page {
return;
}
- $wgOut->setArticleFlag( true );
- # Set page title (may be overridden by DISPLAYTITLE)
- $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
-
# If we got diff in the query, we want to see a diff page instead of the article.
if ( $wgRequest->getCheck( 'diff' ) ) {
wfDebug( __METHOD__ . ": showing diff page\n" );
@@ -390,22 +437,26 @@ class Article extends Page {
return;
}
+ # Set page title (may be overridden by DISPLAYTITLE)
+ $wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
+
+ $wgOut->setArticleFlag( true );
# Allow frames by default
$wgOut->allowClickjacking();
$parserCache = ParserCache::singleton();
- $parserOptions = $this->mPage->getParserOptions();
+ $parserOptions = $this->getParserOptions();
# Render printable version, use printable version cache
if ( $wgOut->isPrintable() ) {
$parserOptions->setIsPrintable( true );
$parserOptions->setEditSection( false );
- } elseif ( $wgUseETag && !$this->getTitle()->quickUserCan( 'edit' ) ) {
+ } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit' ) ) {
$parserOptions->setEditSection( false );
}
# Try client and file cache
- if ( $oldid === 0 && $this->mPage->checkTouched() ) {
+ if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
if ( $wgUseETag ) {
$wgOut->setETag( $parserCache->getETag( $this, $parserOptions ) );
}
@@ -421,25 +472,21 @@ class Article extends Page {
wfDebug( __METHOD__ . ": done file cache\n" );
# tell wgOut that output is taken care of
$wgOut->disable();
- $this->mPage->viewUpdates();
+ $this->mPage->doViewUpdates( $wgUser );
wfProfileOut( __METHOD__ );
return;
}
}
- if ( !$wgUseETag && !$this->getTitle()->quickUserCan( 'edit' ) ) {
- $parserOptions->setEditSection( false );
- }
-
# Should the parser cache be used?
- $useParserCache = $this->useParserCache( $oldid );
+ $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
if ( $wgUser->getStubThreshold() ) {
wfIncrStats( 'pcache_miss_stub' );
}
- $wasRedirected = $this->showRedirectedFromHeader();
+ $this->showRedirectedFromHeader();
$this->showNamespaceHeader();
# Iterate through the possible ways of constructing the output text.
@@ -454,45 +501,45 @@ class Article extends Page {
wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
break;
case 2:
+ # Early abort if the page doesn't exist
+ if ( !$this->mPage->exists() ) {
+ wfDebug( __METHOD__ . ": showing missing article\n" );
+ $this->showMissingArticle();
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
# Try the parser cache
if ( $useParserCache ) {
$this->mParserOutput = $parserCache->get( $this, $parserOptions );
if ( $this->mParserOutput !== false ) {
- wfDebug( __METHOD__ . ": showing parser cache contents\n" );
+ if ( $oldid ) {
+ wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
+ $this->setOldSubtitle( $oldid );
+ } else {
+ wfDebug( __METHOD__ . ": showing parser cache contents\n" );
+ }
$wgOut->addParserOutput( $this->mParserOutput );
# Ensure that UI elements requiring revision ID have
# the correct version information.
$wgOut->setRevisionId( $this->mPage->getLatest() );
- $outputDone = true;
# Preload timestamp to avoid a DB hit
- if ( isset( $this->mParserOutput->mTimestamp ) ) {
- $this->mPage->setTimestamp( $this->mParserOutput->mTimestamp );
+ $cachedTimestamp = $this->mParserOutput->getTimestamp();
+ if ( $cachedTimestamp !== null ) {
+ $wgOut->setRevisionTimestamp( $cachedTimestamp );
+ $this->mPage->setTimestamp( $cachedTimestamp );
}
+ $outputDone = true;
}
}
break;
case 3:
- $text = $this->getContent();
- if ( $text === false || $this->mPage->getID() == 0 ) {
- wfDebug( __METHOD__ . ": showing missing article\n" );
- $this->showMissingArticle();
- wfProfileOut( __METHOD__ );
- return;
- }
-
- # Another whitelist check in case oldid is altering the title
- if ( !$this->getTitle()->userCanRead() ) {
- wfDebug( __METHOD__ . ": denied on secondary read check\n" );
- $wgOut->loginToUse();
- $wgOut->output();
- $wgOut->disable();
- wfProfileOut( __METHOD__ );
- return;
- }
+ # This will set $this->mRevision if needed
+ $this->fetchContent();
# Are we looking at an old revision
- if ( $oldid && !is_null( $this->mRevision ) ) {
+ if ( $oldid && $this->mRevision ) {
$this->setOldSubtitle( $oldid );
if ( !$this->showDeletedRevisionHeader() ) {
@@ -500,36 +547,29 @@ class Article extends Page {
wfProfileOut( __METHOD__ );
return;
}
-
- # If this "old" version is the current, then try the parser cache...
- if ( $oldid === $this->mPage->getLatest() && $this->useParserCache( false ) ) {
- $this->mParserOutput = $parserCache->get( $this, $parserOptions );
- if ( $this->mParserOutput ) {
- wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );
- $wgOut->addParserOutput( $this->mParserOutput );
- $wgOut->setRevisionId( $this->mPage->getLatest() );
- $outputDone = true;
- break;
- }
- }
}
# Ensure that UI elements requiring revision ID have
# the correct version information.
$wgOut->setRevisionId( $this->getRevIdFetched() );
+ # Preload timestamp to avoid a DB hit
+ $wgOut->setRevisionTimestamp( $this->getTimestamp() );
# Pages containing custom CSS or JavaScript get special treatment
if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
$this->showCssOrJsPage();
$outputDone = true;
+ } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $wgOut ) ) ) {
+ # Allow extensions do their own custom view for certain pages
+ $outputDone = true;
} else {
+ $text = $this->getContent();
$rt = Title::newFromRedirectArray( $text );
if ( $rt ) {
wfDebug( __METHOD__ . ": showing redirect=no page\n" );
# Viewing a redirect page (e.g. with parameter redirect=no)
- # Don't append the subtitle if this was an old revision
- $wgOut->addHTML( $this->viewRedirect( $rt, !$wasRedirected && $this->isCurrent() ) );
+ $wgOut->addHTML( $this->viewRedirect( $rt ) );
# Parse just to get categories, displaytitle, etc.
$this->mParserOutput = $wgParser->parse( $text, $this->getTitle(), $parserOptions );
$wgOut->addParserOutputNoText( $this->mParserOutput );
@@ -541,16 +581,34 @@ class Article extends Page {
# Run the parse, protected by a pool counter
wfDebug( __METHOD__ . ": doing uncached parse\n" );
- $key = $parserCache->getKey( $this, $parserOptions );
- $poolArticleView = new PoolWorkArticleView( $this, $key, $useParserCache, $parserOptions );
+ $poolArticleView = new PoolWorkArticleView( $this, $parserOptions,
+ $this->getRevIdFetched(), $useParserCache, $this->getContent() );
if ( !$poolArticleView->execute() ) {
+ $error = $poolArticleView->getError();
+ if ( $error ) {
+ $wgOut->clearHTML(); // for release() errors
+ $wgOut->enableClientCache( false );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
+
+ $errortext = $error->getWikiText( false, 'view-pool-error' );
+ $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+ }
# Connection or timeout error
wfProfileOut( __METHOD__ );
return;
- } else {
- $outputDone = true;
}
+
+ $this->mParserOutput = $poolArticleView->getParserOutput();
+ $wgOut->addParserOutput( $this->mParserOutput );
+
+ # Don't cache a dirty ParserOutput object
+ if ( $poolArticleView->getIsDirty() ) {
+ $wgOut->setSquidMaxage( 0 );
+ $wgOut->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
+ }
+
+ $outputDone = true;
break;
# Should be unreachable, but just in case...
default:
@@ -558,38 +616,53 @@ class Article extends Page {
}
}
- # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
- if ( $this->mParserOutput ) {
- $titleText = $this->mParserOutput->getTitleText();
+ # Get the ParserOutput actually *displayed* here.
+ # Note that $this->mParserOutput is the *current* version output.
+ $pOutput = ( $outputDone instanceof ParserOutput )
+ ? $outputDone // object fetched by hook
+ : $this->mParserOutput;
- if ( strval( $titleText ) !== '' ) {
- $wgOut->setPageTitle( $titleText );
- }
+ # Adjust title for main page & pages with displaytitle
+ if ( $pOutput ) {
+ $this->adjustDisplayTitle( $pOutput );
}
# For the main page, overwrite the <title> element with the con-
# tents of 'pagetitle-view-mainpage' instead of the default (if
# that's not empty).
# This message always exists because it is in the i18n files
- if ( $this->getTitle()->equals( Title::newMainPage() ) ) {
+ if ( $this->getTitle()->isMainPage() ) {
$msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
if ( !$msg->isDisabled() ) {
$wgOut->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
}
}
- # Now that we've filled $this->mParserOutput, we know whether
- # there are any __NOINDEX__ tags on the page
- $policy = $this->getRobotPolicy( 'view' );
+ # Check for any __NOINDEX__ tags on the page using $pOutput
+ $policy = $this->getRobotPolicy( 'view', $pOutput );
$wgOut->setIndexPolicy( $policy['index'] );
$wgOut->setFollowPolicy( $policy['follow'] );
$this->showViewFooter();
- $this->mPage->viewUpdates();
+ $this->mPage->doViewUpdates( $wgUser );
+
wfProfileOut( __METHOD__ );
}
/**
+ * Adjust title for pages with displaytitle, -{T|}- or language conversion
+ * @param $pOutput ParserOutput
+ */
+ public function adjustDisplayTitle( ParserOutput $pOutput ) {
+ global $wgOut;
+ # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
+ $titleText = $pOutput->getTitleText();
+ if ( strval( $titleText ) !== '' ) {
+ $wgOut->setPageTitle( $titleText );
+ }
+ }
+
+ /**
* Show a diff page according to current request variables. For use within
* Article::view() only, other callers should use the DifferenceEngine class.
*/
@@ -603,14 +676,14 @@ class Article extends Page {
$unhide = $wgRequest->getInt( 'unhide' ) == 1;
$oldid = $this->getOldID();
- $de = new DifferenceEngine( $this->getTitle(), $oldid, $diff, $rcid, $purge, $unhide );
+ $de = new DifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
// DifferenceEngine directly fetched the revision:
$this->mRevIdFetched = $de->mNewid;
$de->showDiffPage( $diffOnly );
if ( $diff == 0 || $diff == $this->mPage->getLatest() ) {
# Run view updates for current revision only
- $this->mPage->viewUpdates();
+ $this->mPage->doViewUpdates( $wgUser );
}
}
@@ -622,10 +695,10 @@ class Article extends Page {
* page views.
*/
protected function showCssOrJsPage() {
- global $wgOut, $wgLang;
+ global $wgOut;
- $dir = $wgLang->getDir();
- $lang = $wgLang->getCode();
+ $dir = $this->getContext()->getLanguage()->getDir();
+ $lang = $this->getContext()->getLanguage()->getCode();
$wgOut->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
'clearyourcache' );
@@ -644,10 +717,11 @@ class Article extends Page {
/**
* Get the robot policy to be used for the current view
* @param $action String the action= GET parameter
+ * @param $pOutput ParserOutput
* @return Array the policy that should be set
* TODO: actions other than 'view'
*/
- public function getRobotPolicy( $action ) {
+ public function getRobotPolicy( $action, $pOutput ) {
global $wgOut, $wgArticleRobotPolicies, $wgNamespaceRobotPolicies;
global $wgDefaultRobotPolicy, $wgRequest;
@@ -695,12 +769,12 @@ class Article extends Page {
self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
);
}
- if ( $this->getTitle()->canUseNoindex() && is_object( $this->mParserOutput ) && $this->mParserOutput->getIndexPolicy() ) {
+ if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
# __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
# a final sanity check that we have really got the parser output.
$policy = array_merge(
$policy,
- array( 'index' => $this->mParserOutput->getIndexPolicy() )
+ array( 'index' => $pOutput->getIndexPolicy() )
);
}
@@ -760,16 +834,14 @@ class Article extends Page {
// This is an internally redirected page view.
// We'll need a backlink to the source page for navigation.
if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
- $redir = Linker::link(
+ $redir = Linker::linkKnown(
$this->mRedirectedFrom,
null,
array(),
- array( 'redirect' => 'no' ),
- array( 'known', 'noclasses' )
+ array( 'redirect' => 'no' )
);
- $s = wfMsgExt( 'redirectedfrom', array( 'parseinline', 'replaceafter' ), $redir );
- $wgOut->setSubtitle( $s );
+ $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
// Set the fragment if one was specified in the redirect
if ( strval( $this->getTitle()->getFragment() ) != '' ) {
@@ -782,6 +854,9 @@ class Article extends Page {
'href' => $this->getTitle()->getLocalURL() )
);
+ // Tell $wgOut the user arrived at this article through a redirect
+ $wgOut->setRedirectedFrom( $this->mRedirectedFrom );
+
return true;
}
} elseif ( $rdfrom ) {
@@ -789,8 +864,7 @@ class Article extends Page {
// If it was reported from a trusted site, supply a backlink.
if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
$redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
- $s = wfMsgExt( 'redirectedfrom', array( 'parseinline', 'replaceafter' ), $redir );
- $wgOut->setSubtitle( $s );
+ $wgOut->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
return true;
}
@@ -817,7 +891,7 @@ class Article extends Page {
* Show the footer section of an ordinary page view
*/
public function showViewFooter() {
- global $wgOut, $wgUseTrackbacks;
+ global $wgOut;
# check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
if ( $this->getTitle()->getNamespace() == NS_USER_TALK && IP::isValid( $this->getTitle()->getText() ) ) {
@@ -828,11 +902,6 @@ class Article extends Page {
# chance to mark this new article as patrolled.
$this->showPatrolFooter();
- # Trackbacks
- if ( $wgUseTrackbacks ) {
- $this->addTrackbacks();
- }
-
wfRunHooks( 'ArticleViewFooter', array( $this ) );
}
@@ -851,7 +920,7 @@ class Article extends Page {
return;
}
- $token = $wgUser->editToken( $rcid );
+ $token = $wgUser->getEditToken( $rcid );
$wgOut->preventClickjacking();
$wgOut->addHTML(
@@ -879,7 +948,7 @@ class Article extends Page {
* namespace, show the default message text. To be called from Article::view().
*/
public function showMissingArticle() {
- global $wgOut, $wgRequest, $wgUser;
+ global $wgOut, $wgRequest, $wgUser, $wgSend404Code;
# Show info in user (talk) namespace. Does the user exist? Is he blocked?
if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
@@ -888,7 +957,7 @@ class Article extends Page {
$user = User::newFromName( $rootPart, false /* allow IP users*/ );
$ip = User::isIP( $rootPart );
- if ( !$user->isLoggedIn() && !$ip ) { # User does not exist
+ if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
$wgOut->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
@@ -919,6 +988,18 @@ class Article extends Page {
'msgKey' => array( 'moveddeleted-notice' ) )
);
+ if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
+ // If there's no backing content, send a 404 Not Found
+ // for better machine handling of broken links.
+ $wgRequest->response()->header( "HTTP/1.1 404 Not Found" );
+ }
+
+ $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
+
+ if ( ! $hookResult ) {
+ return;
+ }
+
# Show error message
$oldid = $this->getOldID();
if ( $oldid ) {
@@ -941,12 +1022,6 @@ class Article extends Page {
}
$text = "<div class='noarticletext'>\n$text\n</div>";
- if ( !$this->mPage->hasViewableContent() ) {
- // If there's no backing content, send a 404 Not Found
- // for better machine handling of broken links.
- $wgRequest->response()->header( "HTTP/1.1 404 Not Found" );
- }
-
$wgOut->addWikiText( $text );
}
@@ -992,63 +1067,126 @@ class Article extends Page {
}
/**
- * Execute the uncached parse for action=view
+ * Generate the navigation links when browsing through an article revisions
+ * It shows the information as:
+ * Revision as of \<date\>; view current revision
+ * \<- Previous version | Next Version -\>
+ *
+ * @param $oldid String: revision ID of this article revision
*/
- public function doViewParse() {
- global $wgOut;
+ public function setOldSubtitle( $oldid = 0 ) {
+ global $wgLang, $wgOut, $wgUser, $wgRequest;
- $oldid = $this->getOldID();
- $parserOptions = $this->mPage->getParserOptions();
+ if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
+ return;
+ }
- # Render printable version, use printable version cache
- $parserOptions->setIsPrintable( $wgOut->isPrintable() );
+ $unhide = $wgRequest->getInt( 'unhide' ) == 1;
- # Don't show section-edit links on old revisions... this way lies madness.
- if ( !$this->isCurrent() || $wgOut->isPrintable() || !$this->getTitle()->quickUserCan( 'edit' ) ) {
- $parserOptions->setEditSection( false );
+ # Cascade unhide param in links for easy deletion browsing
+ $extraParams = array();
+ if ( $wgRequest->getVal( 'unhide' ) ) {
+ $extraParams['unhide'] = 1;
}
- $useParserCache = $this->useParserCache( $oldid );
- $this->outputWikiText( $this->getContent(), $useParserCache, $parserOptions );
-
- return true;
- }
+ $revision = Revision::newFromId( $oldid );
+ $timestamp = $revision->getTimestamp();
- /**
- * Try to fetch an expired entry from the parser cache. If it is present,
- * output it and return true. If it is not present, output nothing and
- * return false. This is used as a callback function for
- * PoolCounter::executeProtected().
- *
- * @return boolean
- */
- public function tryDirtyCache() {
- global $wgOut;
- $parserCache = ParserCache::singleton();
- $options = $this->mPage->getParserOptions();
+ $current = ( $oldid == $this->mPage->getLatest() );
+ $td = $wgLang->timeanddate( $timestamp, true );
+ $tddate = $wgLang->date( $timestamp, true );
+ $tdtime = $wgLang->time( $timestamp, true );
- if ( $wgOut->isPrintable() ) {
- $options->setIsPrintable( true );
- $options->setEditSection( false );
- }
+ # Show user links if allowed to see them. If hidden, then show them only if requested...
+ $userlinks = Linker::revUserTools( $revision, !$unhide );
- $output = $parserCache->getDirty( $this, $options );
+ $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
+ ? 'revision-info-current'
+ : 'revision-info';
- if ( $output ) {
- wfDebug( __METHOD__ . ": sending dirty output\n" );
- wfDebugLog( 'dirty', "dirty output " . $parserCache->getKey( $this, $options ) . "\n" );
- $wgOut->setSquidMaxage( 0 );
- $this->mParserOutput = $output;
- $wgOut->addParserOutput( $output );
- $wgOut->addHTML( "<!-- parser cache is expired, sending anyway due to pool overload-->\n" );
+ $wgOut->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+ $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
+ $tdtime, $revision->getUser() )->parse() . "</div>" );
- return true;
- } else {
- wfDebugLog( 'dirty', "dirty missing\n" );
- wfDebug( __METHOD__ . ": no dirty cache\n" );
+ $lnk = $current
+ ? wfMsgHtml( 'currentrevisionlink' )
+ : Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'currentrevisionlink' ),
+ array(),
+ $extraParams,
+ array( 'known', 'noclasses' )
+ );
+ $curdiff = $current
+ ? wfMsgHtml( 'diff' )
+ : Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'diff' ),
+ array(),
+ array(
+ 'diff' => 'cur',
+ 'oldid' => $oldid
+ ) + $extraParams,
+ array( 'known', 'noclasses' )
+ );
+ $prev = $this->getTitle()->getPreviousRevisionID( $oldid ) ;
+ $prevlink = $prev
+ ? Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'previousrevision' ),
+ array(),
+ array(
+ 'direction' => 'prev',
+ 'oldid' => $oldid
+ ) + $extraParams,
+ array( 'known', 'noclasses' )
+ )
+ : wfMsgHtml( 'previousrevision' );
+ $prevdiff = $prev
+ ? Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'diff' ),
+ array(),
+ array(
+ 'diff' => 'prev',
+ 'oldid' => $oldid
+ ) + $extraParams,
+ array( 'known', 'noclasses' )
+ )
+ : wfMsgHtml( 'diff' );
+ $nextlink = $current
+ ? wfMsgHtml( 'nextrevision' )
+ : Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'nextrevision' ),
+ array(),
+ array(
+ 'direction' => 'next',
+ 'oldid' => $oldid
+ ) + $extraParams,
+ array( 'known', 'noclasses' )
+ );
+ $nextdiff = $current
+ ? wfMsgHtml( 'diff' )
+ : Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'diff' ),
+ array(),
+ array(
+ 'diff' => 'next',
+ 'oldid' => $oldid
+ ) + $extraParams,
+ array( 'known', 'noclasses' )
+ );
- return false;
+ $cdel = Linker::getRevDeleteLink( $wgUser, $revision, $this->getTitle() );
+ if ( $cdel !== '' ) {
+ $cdel .= ' ';
}
+
+ $wgOut->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+ wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
+ $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>" );
}
/**
@@ -1060,19 +1198,24 @@ class Article extends Page {
* @return string containing HMTL with redirect link
*/
public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
- global $wgOut, $wgLang, $wgStylePath;
+ global $wgOut, $wgStylePath;
if ( !is_array( $target ) ) {
$target = array( $target );
}
- $imageDir = $wgLang->getDir();
+ $lang = $this->getTitle()->getPageLanguage();
+ $imageDir = $lang->getDir();
if ( $appendSubtitle ) {
$wgOut->appendSubtitle( wfMsgHtml( 'redirectpagesub' ) );
}
// the loop prepends the arrow image before the link, so the first case needs to be outside
+
+ /**
+ * @var $title Title
+ */
$title = array_shift( $target );
if ( $forceKnown ) {
@@ -1082,7 +1225,7 @@ class Article extends Page {
}
$nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
- $alt = $wgLang->isRTL() ? 'â†' : '→';
+ $alt = $lang->isRTL() ? 'â†' : '→';
// Automatically append redirect=no to each link, since most of them are redirect pages themselves.
foreach ( $target as $rt ) {
$link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
@@ -1100,57 +1243,8 @@ class Article extends Page {
}
/**
- * Builds trackback links for article display if $wgUseTrackbacks is set to true
- */
- public function addTrackbacks() {
- global $wgOut;
-
- $dbr = wfGetDB( DB_SLAVE );
- $tbs = $dbr->select( 'trackbacks',
- array( 'tb_id', 'tb_title', 'tb_url', 'tb_ex', 'tb_name' ),
- array( 'tb_page' => $this->mPage->getID() )
- );
-
- if ( !$dbr->numRows( $tbs ) ) {
- return;
- }
-
- $wgOut->preventClickjacking();
-
- $tbtext = "";
- foreach ( $tbs as $o ) {
- $rmvtxt = "";
-
- if ( $this->getContext()->getUser()->isAllowed( 'trackback' ) ) {
- $delurl = $this->getTitle()->getFullURL( "action=deletetrackback&tbid=" .
- $o->tb_id . "&token=" . urlencode( $this->getContext()->getUser()->editToken() ) );
- $rmvtxt = wfMsg( 'trackbackremove', htmlspecialchars( $delurl ) );
- }
-
- $tbtext .= "\n";
- $tbtext .= wfMsgNoTrans( strlen( $o->tb_ex ) ? 'trackbackexcerpt' : 'trackback',
- $o->tb_title,
- $o->tb_url,
- $o->tb_ex,
- $o->tb_name,
- $rmvtxt );
- }
-
- $wgOut->wrapWikiMsg( "<div id='mw_trackbacks'>\n$1\n</div>\n", array( 'trackbackbox', $tbtext ) );
- }
-
- /**
- * Removes trackback record for current article from trackbacks table
- * @deprecated since 1.18
- */
- public function deletetrackback() {
- return Action::factory( 'deletetrackback', $this )->show();
- }
-
- /**
* Handle action=render
*/
-
public function render() {
global $wgOut;
@@ -1159,62 +1253,6 @@ class Article extends Page {
}
/**
- * Handle action=purge
- */
- public function purge() {
- return Action::factory( 'purge', $this )->show();
- }
-
- /**
- * Mark this particular edit/page as patrolled
- * @deprecated since 1.18
- */
- public function markpatrolled() {
- Action::factory( 'markpatrolled', $this )->show();
- }
-
- /**
- * User-interface handler for the "watch" action.
- * Requires Request to pass a token as of 1.18.
- * @deprecated since 1.18
- */
- public function watch() {
- Action::factory( 'watch', $this )->show();
- }
-
- /**
- * Add this page to $wgUser's watchlist
- *
- * This is safe to be called multiple times
- *
- * @return bool true on successful watch operation
- * @deprecated since 1.18
- */
- public function doWatch() {
- global $wgUser;
- return WatchAction::doWatch( $this->getTitle(), $wgUser );
- }
-
- /**
- * User interface handler for the "unwatch" action.
- * Requires Request to pass a token as of 1.18.
- * @deprecated since 1.18
- */
- public function unwatch() {
- Action::factory( 'unwatch', $this )->show();
- }
-
- /**
- * Stop watching a page
- * @return bool true on successful unwatch
- * @deprecated since 1.18
- */
- public function doUnwatch() {
- global $wgUser;
- return WatchAction::doUnwatch( $this->getTitle(), $wgUser );
- }
-
- /**
* action=protect handler
*/
public function protect() {
@@ -1230,136 +1268,69 @@ class Article extends Page {
}
/**
- * Info about this page
- * Called for ?action=info when $wgAllowPageInfo is on.
- */
- public function info() {
- Action::factory( 'info', $this )->show();
- }
-
- /**
- * Overriden by ImagePage class, only present here to avoid a fatal error
- * Called for ?action=revert
- */
- public function revert() {
- Action::factory( 'revert', $this )->show();
- }
-
- /**
- * User interface for rollback operations
- */
- public function rollback() {
- Action::factory( 'rollback', $this )->show();
- }
-
- /**
- * Output a redirect back to the article.
- * This is typically used after an edit.
- *
- * @deprecated in 1.18; call $wgOut->redirect() directly
- * @param $noRedir Boolean: add redirect=no
- * @param $sectionAnchor String: section to redirect to, including "#"
- * @param $extraQuery String: extra query params
- */
- public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
- wfDeprecated( __METHOD__ );
- global $wgOut;
-
- if ( $noRedir ) {
- $query = 'redirect=no';
- if ( $extraQuery )
- $query .= "&$extraQuery";
- } else {
- $query = $extraQuery;
- }
-
- $wgOut->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
- }
-
- /**
* UI entry point for page deletion
*/
public function delete() {
- global $wgOut, $wgRequest;
+ global $wgOut, $wgRequest, $wgLang;
- $confirm = $wgRequest->wasPosted() &&
- $this->getContext()->getUser()->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) );
-
- $this->DeleteReasonList = $wgRequest->getText( 'wpDeleteReasonList', 'other' );
- $this->DeleteReason = $wgRequest->getText( 'wpReason' );
+ # This code desperately needs to be totally rewritten
- $reason = $this->DeleteReasonList;
+ $title = $this->getTitle();
+ $user = $this->getContext()->getUser();
- if ( $reason != 'other' && $this->DeleteReason != '' ) {
- // Entry from drop down menu + additional comment
- $reason .= wfMsgForContent( 'colon-separator' ) . $this->DeleteReason;
- } elseif ( $reason == 'other' ) {
- $reason = $this->DeleteReason;
+ # Check permissions
+ $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
+ if ( count( $permission_errors ) ) {
+ throw new PermissionsError( 'delete', $permission_errors );
}
- # Flag to hide all contents of the archived revisions
- $suppress = $wgRequest->getVal( 'wpSuppress' ) && $this->getContext()->getUser()->isAllowed( 'suppressrevision' );
-
- # This code desperately needs to be totally rewritten
-
# Read-only check...
if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
-
- return;
+ throw new ReadOnlyError;
}
- # Check permissions
- $permission_errors = $this->getTitle()->getUserPermissionsErrors( 'delete', $this->getContext()->getUser() );
-
- if ( count( $permission_errors ) > 0 ) {
- $wgOut->showPermissionsErrorPage( $permission_errors );
-
- return;
- }
-
- $wgOut->setPagetitle( wfMsg( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
-
# Better double-check that it hasn't been deleted yet!
$dbw = wfGetDB( DB_MASTER );
- $conds = $this->getTitle()->pageCond();
+ $conds = $title->pageCond();
$latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
if ( $latest === false ) {
- $wgOut->showFatalError(
- Html::rawElement(
- 'div',
- array( 'class' => 'error mw-error-cannotdelete' ),
- wfMsgExt( 'cannotdelete', array( 'parse' ),
- wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
- )
- );
+ $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+ $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+ array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
+ );
$wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
LogEventsList::showLogExtract(
$wgOut,
'delete',
- $this->getTitle()->getPrefixedText()
+ $title->getPrefixedText()
);
return;
}
- # Hack for big sites
- $bigHistory = $this->mPage->isBigDeletion();
- if ( $bigHistory && !$this->getTitle()->userCan( 'bigdelete' ) ) {
- global $wgLang, $wgDeleteRevisionsLimit;
-
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
- array( 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
+ $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList', 'other' );
+ $deleteReason = $wgRequest->getText( 'wpReason' );
- return;
+ if ( $deleteReasonList == 'other' ) {
+ $reason = $deleteReason;
+ } elseif ( $deleteReason != '' ) {
+ // Entry from drop down menu + additional comment
+ $reason = $deleteReasonList . wfMsgForContent( 'colon-separator' ) . $deleteReason;
+ } else {
+ $reason = $deleteReasonList;
}
- if ( $confirm ) {
+ if ( $wgRequest->wasPosted() && $user->matchEditToken( $wgRequest->getVal( 'wpEditToken' ),
+ array( 'delete', $this->getTitle()->getPrefixedText() ) ) )
+ {
+ # Flag to hide all contents of the archived revisions
+ $suppress = $wgRequest->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+
$this->doDelete( $reason, $suppress );
- if ( $wgRequest->getCheck( 'wpWatch' ) && $this->getContext()->getUser()->isLoggedIn() ) {
+ if ( $wgRequest->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
$this->doWatch();
- } elseif ( $this->getTitle()->userIsWatching() ) {
+ } elseif ( $title->userIsWatching() ) {
$this->doUnwatch();
}
@@ -1373,21 +1344,19 @@ class Article extends Page {
}
// If the page has a history, insert a warning
- if ( $hasHistory && !$confirm ) {
- global $wgLang;
-
- $revisions = $this->mPage->estimateRevisionCount();
+ if ( $hasHistory ) {
+ $revisions = $this->mTitle->estimateRevisionCount();
// @todo FIXME: i18n issue/patchwork message
$wgOut->addHTML( '<strong class="mw-delete-warning-revisions">' .
wfMsgExt( 'historywarning', array( 'parseinline' ), $wgLang->formatNum( $revisions ) ) .
- wfMsgHtml( 'word-separator' ) . Linker::link( $this->getTitle(),
+ wfMsgHtml( 'word-separator' ) . Linker::link( $title,
wfMsgHtml( 'history' ),
array( 'rel' => 'archives' ),
array( 'action' => 'history' ) ) .
'</strong>'
);
- if ( $bigHistory ) {
+ if ( $this->mTitle->isBigDeletion() ) {
global $wgDeleteRevisionsLimit;
$wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
array( 'delete-warning-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
@@ -1407,14 +1376,16 @@ class Article extends Page {
wfDebug( "Article::confirmDelete\n" );
- $deleteBackLink = Linker::linkKnown( $this->getTitle() );
- $wgOut->setSubtitle( wfMsgHtml( 'delete-backlink', $deleteBackLink ) );
+ $wgOut->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+ $wgOut->addBacklinkSubtitle( $this->getTitle() );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->addWikiMsg( 'confirmdeletetext' );
wfRunHooks( 'ArticleConfirmDelete', array( $this, $wgOut, &$reason ) );
- if ( $this->getContext()->getUser()->isAllowed( 'suppressrevision' ) ) {
+ $user = $this->getContext()->getUser();
+
+ if ( $user->isAllowed( 'suppressrevision' ) ) {
$suppress = "<tr id=\"wpDeleteSuppressRow\">
<td></td>
<td class='mw-input'><strong>" .
@@ -1425,7 +1396,7 @@ class Article extends Page {
} else {
$suppress = '';
}
- $checkWatch = $this->getContext()->getUser()->getBoolOption( 'watchdeletion' ) || $this->getTitle()->userIsWatching();
+ $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $this->getTitle()->userIsWatching();
$form = Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
@@ -1458,7 +1429,7 @@ class Article extends Page {
</tr>";
# Disallow watching if user is not logged in
- if ( $this->getContext()->getUser()->isLoggedIn() ) {
+ if ( $user->isLoggedIn() ) {
$form .= "
<tr>
<td></td>
@@ -1480,10 +1451,10 @@ class Article extends Page {
</tr>" .
Xml::closeElement( 'table' ) .
Xml::closeElement( 'fieldset' ) .
- Html::hidden( 'wpEditToken', $this->getContext()->getUser()->editToken() ) .
+ Html::hidden( 'wpEditToken', $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) ) ) .
Xml::closeElement( 'form' );
- if ( $this->getContext()->getUser()->isAllowed( 'editinterface' ) ) {
+ if ( $user->isAllowed( 'editinterface' ) ) {
$title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
$link = Linker::link(
$title,
@@ -1503,17 +1474,17 @@ class Article extends Page {
/**
* Perform a deletion and output success or failure messages
+ * @param $reason
+ * @param $suppress bool
*/
public function doDelete( $reason, $suppress = false ) {
global $wgOut;
- $id = $this->getTitle()->getArticleID( Title::GAID_FOR_UPDATE );
-
$error = '';
- if ( $this->mPage->doDeleteArticle( $reason, $suppress, $id, $error ) ) {
+ if ( $this->mPage->doDeleteArticle( $reason, $suppress, 0, true, $error ) ) {
$deleted = $this->getTitle()->getPrefixedText();
- $wgOut->setPagetitle( wfMsg( 'actioncomplete' ) );
+ $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$loglink = '[[Special:Log/delete|' . wfMsgNoTrans( 'deletionlog' ) . ']]';
@@ -1521,16 +1492,11 @@ class Article extends Page {
$wgOut->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
$wgOut->returnToMain( false );
} else {
+ $wgOut->setPageTitle( wfMessage( 'cannotdelete-title', $this->getTitle()->getPrefixedText() ) );
if ( $error == '' ) {
- $wgOut->showFatalError(
- Html::rawElement(
- 'div',
- array( 'class' => 'error mw-error-cannotdelete' ),
- wfMsgExt( 'cannotdelete', array( 'parse' ),
- wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
- )
+ $wgOut->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+ array( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) )
);
-
$wgOut->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) );
LogEventsList::showLogExtract(
@@ -1539,156 +1505,11 @@ class Article extends Page {
$this->getTitle()->getPrefixedText()
);
} else {
- $wgOut->showFatalError( $error );
+ $wgOut->addHTML( $error );
}
}
}
- /**
- * Generate the navigation links when browsing through an article revisions
- * It shows the information as:
- * Revision as of \<date\>; view current revision
- * \<- Previous version | Next Version -\>
- *
- * @param $oldid String: revision ID of this article revision
- */
- public function setOldSubtitle( $oldid = 0 ) {
- global $wgLang, $wgOut, $wgUser, $wgRequest;
-
- if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
- return;
- }
-
- $unhide = $wgRequest->getInt( 'unhide' ) == 1;
-
- # Cascade unhide param in links for easy deletion browsing
- $extraParams = array();
- if ( $wgRequest->getVal( 'unhide' ) ) {
- $extraParams['unhide'] = 1;
- }
-
- $revision = Revision::newFromId( $oldid );
- $timestamp = $revision->getTimestamp();
-
- $current = ( $oldid == $this->mPage->getLatest() );
- $td = $wgLang->timeanddate( $timestamp, true );
- $tddate = $wgLang->date( $timestamp, true );
- $tdtime = $wgLang->time( $timestamp, true );
-
- $lnk = $current
- ? wfMsgHtml( 'currentrevisionlink' )
- : Linker::link(
- $this->getTitle(),
- wfMsgHtml( 'currentrevisionlink' ),
- array(),
- $extraParams,
- array( 'known', 'noclasses' )
- );
- $curdiff = $current
- ? wfMsgHtml( 'diff' )
- : Linker::link(
- $this->getTitle(),
- wfMsgHtml( 'diff' ),
- array(),
- array(
- 'diff' => 'cur',
- 'oldid' => $oldid
- ) + $extraParams,
- array( 'known', 'noclasses' )
- );
- $prev = $this->getTitle()->getPreviousRevisionID( $oldid ) ;
- $prevlink = $prev
- ? Linker::link(
- $this->getTitle(),
- wfMsgHtml( 'previousrevision' ),
- array(),
- array(
- 'direction' => 'prev',
- 'oldid' => $oldid
- ) + $extraParams,
- array( 'known', 'noclasses' )
- )
- : wfMsgHtml( 'previousrevision' );
- $prevdiff = $prev
- ? Linker::link(
- $this->getTitle(),
- wfMsgHtml( 'diff' ),
- array(),
- array(
- 'diff' => 'prev',
- 'oldid' => $oldid
- ) + $extraParams,
- array( 'known', 'noclasses' )
- )
- : wfMsgHtml( 'diff' );
- $nextlink = $current
- ? wfMsgHtml( 'nextrevision' )
- : Linker::link(
- $this->getTitle(),
- wfMsgHtml( 'nextrevision' ),
- array(),
- array(
- 'direction' => 'next',
- 'oldid' => $oldid
- ) + $extraParams,
- array( 'known', 'noclasses' )
- );
- $nextdiff = $current
- ? wfMsgHtml( 'diff' )
- : Linker::link(
- $this->getTitle(),
- wfMsgHtml( 'diff' ),
- array(),
- array(
- 'diff' => 'next',
- 'oldid' => $oldid
- ) + $extraParams,
- array( 'known', 'noclasses' )
- );
-
- $cdel = '';
-
- // User can delete revisions or view deleted revisions...
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- if ( $canHide || ( $revision->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) ) {
- if ( !$revision->userCan( Revision::DELETED_RESTRICTED ) ) {
- $cdel = Linker::revDeleteLinkDisabled( $canHide ); // rev was hidden from Sysops
- } else {
- $query = array(
- 'type' => 'revision',
- 'target' => $this->getTitle()->getPrefixedDbkey(),
- 'ids' => $oldid
- );
- $cdel = Linker::revDeleteLink( $query, $revision->isDeleted( File::DELETED_RESTRICTED ), $canHide );
- }
- $cdel .= ' ';
- }
-
- # Show user links if allowed to see them. If hidden, then show them only if requested...
- $userlinks = Linker::revUserTools( $revision, !$unhide );
-
- $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
- ? 'revision-info-current'
- : 'revision-info';
-
- $r = "\n\t\t\t\t<div id=\"mw-{$infomsg}\">" .
- wfMsgExt(
- $infomsg,
- array( 'parseinline', 'replaceafter' ),
- $td,
- $userlinks,
- $revision->getID(),
- $tddate,
- $tdtime,
- $revision->getUser()
- ) .
- "</div>\n" .
- "\n\t\t\t\t<div id=\"mw-revision-nav\">" . $cdel . wfMsgExt( 'revision-nav', array( 'escapenoentities', 'parsemag', 'replaceafter' ),
- $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>\n\t\t\t";
-
- $wgOut->setSubtitle( $r );
- }
-
/* Caching functions */
/**
@@ -1708,10 +1529,10 @@ class Article extends Page {
$called = true;
if ( $this->isFileCacheable() ) {
- $cache = new HTMLFileCache( $this->getTitle() );
- if ( $cache->isFileCacheGood( $this->mPage->getTouched() ) ) {
+ $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
+ if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
wfDebug( "Article::tryFileCache(): about to load file\n" );
- $cache->loadFromFileCache();
+ $cache->loadFromFileCache( $this->getContext() );
return true;
} else {
wfDebug( "Article::tryFileCache(): starting buffer\n" );
@@ -1731,8 +1552,9 @@ class Article extends Page {
public function isFileCacheable() {
$cacheable = false;
- if ( HTMLFileCache::useFileCache() ) {
- $cacheable = $this->mPage->getID() && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
+ if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
+ $cacheable = $this->mPage->getID()
+ && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
// Extension may have reason to disable file caching on some pages.
if ( $cacheable ) {
$cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
@@ -1745,25 +1567,6 @@ class Article extends Page {
/**#@-*/
/**
- * Add the primary page-view wikitext to the output buffer
- * Saves the text into the parser cache if possible.
- * Updates templatelinks if it is out of date.
- *
- * @param $text String
- * @param $cache Boolean
- * @param $parserOptions mixed ParserOptions object, or boolean false
- */
- public function outputWikiText( $text, $cache = true, $parserOptions = false ) {
- global $wgOut;
-
- $this->mParserOutput = $this->getOutputFromWikitext( $text, $cache, $parserOptions );
-
- $this->doCascadeProtectionUpdates( $this->mParserOutput );
-
- $wgOut->addParserOutput( $this->mParserOutput );
- }
-
- /**
* Lightweight method to get the parser output for a page, checking the parser cache
* and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
* consider, so it's not appropriate to use there.
@@ -1775,91 +1578,25 @@ class Article extends Page {
* @return ParserOutput or false if the given revsion ID is not found
*/
public function getParserOutput( $oldid = null, User $user = null ) {
- global $wgEnableParserCache, $wgUser;
- $user = is_null( $user ) ? $wgUser : $user;
-
- wfProfileIn( __METHOD__ );
- // Should the parser cache be used?
- $useParserCache = $wgEnableParserCache &&
- $user->getStubThreshold() == 0 &&
- $this->mPage->exists() &&
- $oldid === null;
-
- wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-
- if ( $user->getStubThreshold() ) {
- wfIncrStats( 'pcache_miss_stub' );
- }
-
- if ( $useParserCache ) {
- $parserOutput = ParserCache::singleton()->get( $this, $this->mPage->getParserOptions() );
- if ( $parserOutput !== false ) {
- wfProfileOut( __METHOD__ );
- return $parserOutput;
- }
- }
+ global $wgUser;
- // Cache miss; parse and output it.
- if ( $oldid === null ) {
- $text = $this->mPage->getRawText();
- } else {
- $rev = Revision::newFromTitle( $this->getTitle(), $oldid );
- if ( $rev === null ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- $text = $rev->getText();
- }
+ $user = is_null( $user ) ? $wgUser : $user;
+ $parserOptions = $this->mPage->makeParserOptions( $user );
- wfProfileOut( __METHOD__ );
- return $this->getOutputFromWikitext( $text, $useParserCache );
+ return $this->mPage->getParserOutput( $parserOptions, $oldid );
}
/**
- * This does all the heavy lifting for outputWikitext, except it returns the parser
- * output instead of sending it straight to $wgOut. Makes things nice and simple for,
- * say, embedding thread pages within a discussion system (LiquidThreads)
- *
- * @param $text string
- * @param $cache boolean
- * @param $parserOptions parsing options, defaults to false
- * @return ParserOutput
+ * Get parser options suitable for rendering the primary article wikitext
+ * @return ParserOptions|false
*/
- public function getOutputFromWikitext( $text, $cache = true, $parserOptions = false ) {
- global $wgParser, $wgEnableParserCache, $wgUseFileCache;
-
- if ( !$parserOptions ) {
- $parserOptions = $this->mPage->getParserOptions();
- }
-
- $time = - wfTime();
- $this->mParserOutput = $wgParser->parse( $text, $this->getTitle(),
- $parserOptions, true, true, $this->getRevIdFetched() );
- $time += wfTime();
-
- # Timing hack
- if ( $time > 3 ) {
- wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
- $this->getTitle()->getPrefixedDBkey() ) );
- }
-
- if ( $wgEnableParserCache && $cache && $this->mParserOutput->isCacheable() ) {
- $parserCache = ParserCache::singleton();
- $parserCache->save( $this->mParserOutput, $this, $parserOptions );
- }
-
- // Make sure file cache is not used on uncacheable content.
- // Output that has magic words in it can still use the parser cache
- // (if enabled), though it will generally expire sooner.
- if ( !$this->mParserOutput->isCacheable() || $this->mParserOutput->containsOldMagic() ) {
- $wgUseFileCache = false;
- }
-
- if ( $this->isCurrent() ) {
- $this->mPage->doCascadeProtectionUpdates( $this->mParserOutput );
+ public function getParserOptions() {
+ global $wgUser;
+ if ( !$this->mParserOptions ) {
+ $this->mParserOptions = $this->mPage->makeParserOptions( $wgUser );
}
-
- return $this->mParserOutput;
+ // Clone to allow modifications of the return value without affecting cache
+ return clone $this->mParserOptions;
}
/**
@@ -1888,6 +1625,119 @@ class Article extends Page {
}
/**
+ * Info about this page
+ * @deprecated since 1.19
+ */
+ public function info() {
+ wfDeprecated( __METHOD__, '1.19' );
+ Action::factory( 'info', $this )->show();
+ }
+
+ /**
+ * Mark this particular edit/page as patrolled
+ * @deprecated since 1.18
+ */
+ public function markpatrolled() {
+ wfDeprecated( __METHOD__, '1.18' );
+ Action::factory( 'markpatrolled', $this )->show();
+ }
+
+ /**
+ * Handle action=purge
+ * @deprecated since 1.19
+ */
+ public function purge() {
+ return Action::factory( 'purge', $this )->show();
+ }
+
+ /**
+ * Handle action=revert
+ * @deprecated since 1.19
+ */
+ public function revert() {
+ wfDeprecated( __METHOD__, '1.19' );
+ Action::factory( 'revert', $this )->show();
+ }
+
+ /**
+ * Handle action=rollback
+ * @deprecated since 1.19
+ */
+ public function rollback() {
+ wfDeprecated( __METHOD__, '1.19' );
+ Action::factory( 'rollback', $this )->show();
+ }
+
+ /**
+ * User-interface handler for the "watch" action.
+ * Requires Request to pass a token as of 1.18.
+ * @deprecated since 1.18
+ */
+ public function watch() {
+ wfDeprecated( __METHOD__, '1.18' );
+ Action::factory( 'watch', $this )->show();
+ }
+
+ /**
+ * Add this page to $wgUser's watchlist
+ *
+ * This is safe to be called multiple times
+ *
+ * @return bool true on successful watch operation
+ * @deprecated since 1.18
+ */
+ public function doWatch() {
+ global $wgUser;
+ wfDeprecated( __METHOD__, '1.18' );
+ return WatchAction::doWatch( $this->getTitle(), $wgUser );
+ }
+
+ /**
+ * User interface handler for the "unwatch" action.
+ * Requires Request to pass a token as of 1.18.
+ * @deprecated since 1.18
+ */
+ public function unwatch() {
+ wfDeprecated( __METHOD__, '1.18' );
+ Action::factory( 'unwatch', $this )->show();
+ }
+
+ /**
+ * Stop watching a page
+ * @return bool true on successful unwatch
+ * @deprecated since 1.18
+ */
+ public function doUnwatch() {
+ global $wgUser;
+ wfDeprecated( __METHOD__, '1.18' );
+ return WatchAction::doUnwatch( $this->getTitle(), $wgUser );
+ }
+
+ /**
+ * Output a redirect back to the article.
+ * This is typically used after an edit.
+ *
+ * @deprecated in 1.18; call $wgOut->redirect() directly
+ * @param $noRedir Boolean: add redirect=no
+ * @param $sectionAnchor String: section to redirect to, including "#"
+ * @param $extraQuery String: extra query params
+ */
+ public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ global $wgOut;
+
+ if ( $noRedir ) {
+ $query = 'redirect=no';
+ if ( $extraQuery )
+ $query .= "&$extraQuery";
+ } else {
+ $query = $extraQuery;
+ }
+
+ $wgOut->redirect( $this->getTitle()->getFullURL( $query ) . $sectionAnchor );
+ }
+
+ /**
* Use PHP's magic __get handler to handle accessing of
* raw WikiPage fields for backwards compatibility.
*
@@ -1898,7 +1748,7 @@ class Article extends Page {
#wfWarn( "Access to raw $fname field " . __CLASS__ );
return $this->mPage->$fname;
}
- trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
+ trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
}
/**
@@ -1907,7 +1757,6 @@ class Article extends Page {
*
* @param $fname String Field name
* @param $fvalue mixed New value
- * @param $args Array Arguments to the method
*/
public function __set( $fname, $fvalue ) {
if ( property_exists( $this->mPage, $fname ) ) {
@@ -1917,7 +1766,7 @@ class Article extends Page {
} elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
$this->mPage->$fname = $fvalue;
} else {
- trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
+ trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
}
}
@@ -1933,109 +1782,121 @@ class Article extends Page {
#wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
return call_user_func_array( array( $this->mPage, $fname ), $args );
}
- trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
+ trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
}
// ****** B/C functions to work-around PHP silliness with __call and references ****** //
+
+ /**
+ * @param $limit array
+ * @param $expiry array
+ * @param $cascade bool
+ * @param $reason string
+ * @param $user User
+ * @return Status
+ */
+ public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
+ return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
+ }
+
+ /**
+ * @param $limit array
+ * @param $reason string
+ * @param $cascade int
+ * @param $expiry array
+ * @return bool
+ */
public function updateRestrictions( $limit = array(), $reason = '', &$cascade = 0, $expiry = array() ) {
return $this->mPage->updateRestrictions( $limit, $reason, $cascade, $expiry );
}
+ /**
+ * @param $reason string
+ * @param $suppress bool
+ * @param $id int
+ * @param $commit bool
+ * @param $error string
+ * @return bool
+ */
public function doDeleteArticle( $reason, $suppress = false, $id = 0, $commit = true, &$error = '' ) {
return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
}
+ /**
+ * @param $fromP
+ * @param $summary
+ * @param $token
+ * @param $bot
+ * @param $resultDetails
+ * @param $user User
+ * @return array
+ */
public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
global $wgUser;
$user = is_null( $user ) ? $wgUser : $user;
return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
}
+ /**
+ * @param $fromP
+ * @param $summary
+ * @param $bot
+ * @param $resultDetails
+ * @param $guser User
+ * @return array
+ */
public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
global $wgUser;
$guser = is_null( $guser ) ? $wgUser : $guser;
return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
}
+ /**
+ * @param $hasHistory bool
+ * @return mixed
+ */
public function generateReason( &$hasHistory ) {
return $this->mPage->getAutoDeleteReason( $hasHistory );
}
// ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
+
+ /**
+ * @return array
+ */
public static function selectFields() {
return WikiPage::selectFields();
}
+ /**
+ * @param $title Title
+ */
public static function onArticleCreate( $title ) {
- return WikiPage::onArticleCreate( $title );
+ WikiPage::onArticleCreate( $title );
}
+ /**
+ * @param $title Title
+ */
public static function onArticleDelete( $title ) {
- return WikiPage::onArticleDelete( $title );
- }
-
- public static function onArticleEdit( $title ) {
- return WikiPage::onArticleEdit( $title );
+ WikiPage::onArticleDelete( $title );
}
- public static function getAutosummary( $oldtext, $newtext, $flags ) {
- return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
- }
- // ******
-}
-
-class PoolWorkArticleView extends PoolCounterWork {
-
/**
- * @var Article
+ * @param $title Title
*/
- private $mArticle;
-
- function __construct( $article, $key, $useParserCache, $parserOptions ) {
- parent::__construct( 'ArticleView', $key );
- $this->mArticle = $article;
- $this->cacheable = $useParserCache;
- $this->parserOptions = $parserOptions;
- }
-
- function doWork() {
- return $this->mArticle->doViewParse();
- }
-
- function getCachedWork() {
- global $wgOut;
-
- $parserCache = ParserCache::singleton();
- $this->mArticle->mParserOutput = $parserCache->get( $this->mArticle, $this->parserOptions );
-
- if ( $this->mArticle->mParserOutput !== false ) {
- wfDebug( __METHOD__ . ": showing contents parsed by someone else\n" );
- $wgOut->addParserOutput( $this->mArticle->mParserOutput );
- # Ensure that UI elements requiring revision ID have
- # the correct version information.
- $wgOut->setRevisionId( $this->mArticle->getLatest() );
- return true;
- }
- return false;
- }
-
- function fallback() {
- return $this->mArticle->tryDirtyCache();
+ public static function onArticleEdit( $title ) {
+ WikiPage::onArticleEdit( $title );
}
/**
- * @param $status Status
+ * @param $oldtext
+ * @param $newtext
+ * @param $flags
+ * @return string
*/
- function error( $status ) {
- global $wgOut;
-
- $wgOut->clearHTML(); // for release() errors
- $wgOut->enableClientCache( false );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
-
- $errortext = $status->getWikiText( false, 'view-pool-error' );
- $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
-
- return false;
+ public static function getAutosummary( $oldtext, $newtext, $flags ) {
+ return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
}
+ // ******
}
diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php
index eebb52d6..2fdba797 100644
--- a/includes/AuthPlugin.php
+++ b/includes/AuthPlugin.php
@@ -67,7 +67,7 @@ class AuthPlugin {
* Modify options in the login template.
*
* @param $template UserLoginTemplate object.
- * @param $type String 'signup' or 'login'.
+ * @param $type String 'signup' or 'login'. Added in 1.16.
*/
public function modifyUITemplate( &$template, &$type ) {
# Override this!
diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php
index d8263ba9..93fac45f 100644
--- a/includes/AutoLoader.php
+++ b/includes/AutoLoader.php
@@ -24,12 +24,13 @@ $wgAutoloadLocalClasses = array(
'AuthPluginUser' => 'includes/AuthPlugin.php',
'Autopromote' => 'includes/Autopromote.php',
'BacklinkCache' => 'includes/BacklinkCache.php',
+ 'BadTitleError' => 'includes/Exception.php',
'BaseTemplate' => 'includes/SkinTemplate.php',
'Block' => 'includes/Block.php',
'Category' => 'includes/Category.php',
'Categoryfinder' => 'includes/Categoryfinder.php',
'CategoryPage' => 'includes/CategoryPage.php',
- 'CategoryViewer' => 'includes/CategoryPage.php',
+ 'CategoryViewer' => 'includes/CategoryViewer.php',
'CdbFunctions' => 'includes/Cdb_PHP.php',
'CdbReader' => 'includes/Cdb.php',
'CdbReader_DBA' => 'includes/Cdb.php',
@@ -46,11 +47,15 @@ $wgAutoloadLocalClasses = array(
'ConfEditor' => 'includes/ConfEditor.php',
'ConfEditorParseError' => 'includes/ConfEditor.php',
'ConfEditorToken' => 'includes/ConfEditor.php',
- 'ContextSource' => 'includes/RequestContext.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',
+ 'DerivativeRequest' => 'includes/WebRequest.php',
'DiffHistoryBlob' => 'includes/HistoryBlob.php',
- 'DjVuImage' => 'includes/DjVuImage.php',
+
'DoubleReplacer' => 'includes/StringUtils.php',
'DummyLinker' => 'includes/Linker.php',
'Dump7ZipOutput' => 'includes/Export.php',
@@ -87,13 +92,10 @@ $wgAutoloadLocalClasses = array(
'FormAction' => 'includes/Action.php',
'FormOptions' => 'includes/FormOptions.php',
'FormSpecialPage' => 'includes/SpecialPage.php',
- 'GenderCache' => 'includes/GenderCache.php',
'HashtableReplacer' => 'includes/StringUtils.php',
'HistoryBlob' => 'includes/HistoryBlob.php',
'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
'HistoryBlobStub' => 'includes/HistoryBlob.php',
- 'HistoryPage' => 'includes/HistoryPage.php',
- 'HistoryPager' => 'includes/HistoryPage.php',
'Hooks' => 'includes/Hooks.php',
'Html' => 'includes/Html.php',
'HTMLCheckField' => 'includes/HTMLForm.php',
@@ -113,8 +115,8 @@ $wgAutoloadLocalClasses = array(
'HTMLTextAreaField' => 'includes/HTMLForm.php',
'HTMLTextField' => 'includes/HTMLForm.php',
'Http' => 'includes/HttpFunctions.php',
+ 'HttpError' => 'includes/Exception.php',
'HttpRequest' => 'includes/HttpFunctions.old.php',
- 'IContextSource' => 'includes/RequestContext.php',
'IcuCollation' => 'includes/Collation.php',
'IdentityCollation' => 'includes/Collation.php',
'ImageGallery' => 'includes/ImageGallery.php',
@@ -128,6 +130,7 @@ $wgAutoloadLocalClasses = array(
'IndexPager' => 'includes/Pager.php',
'Interwiki' => 'includes/interwiki/Interwiki.php',
'IP' => 'includes/IP.php',
+ 'LCStore_Accel' => 'includes/LocalisationCache.php',
'LCStore_CDB' => 'includes/LocalisationCache.php',
'LCStore_DB' => 'includes/LocalisationCache.php',
'LCStore_Null' => 'includes/LocalisationCache.php',
@@ -139,9 +142,6 @@ $wgAutoloadLocalClasses = array(
'LinksUpdate' => 'includes/LinksUpdate.php',
'LocalisationCache' => 'includes/LocalisationCache.php',
'LocalisationCache_BulkLoad' => 'includes/LocalisationCache.php',
- 'LogEventsList' => 'includes/LogEventsList.php',
- 'LogPage' => 'includes/LogPage.php',
- 'LogPager' => 'includes/LogEventsList.php',
'MagicWord' => 'includes/MagicWord.php',
'MagicWordArray' => 'includes/MagicWord.php',
'MailAddress' => 'includes/UserMailer.php',
@@ -150,7 +150,6 @@ $wgAutoloadLocalClasses = array(
'Message' => 'includes/Message.php',
'MessageBlobStore' => 'includes/MessageBlobStore.php',
'MimeMagic' => 'includes/MimeMagic.php',
- 'MWCryptRand' => 'includes/CryptRand.php',
'MWException' => 'includes/Exception.php',
'MWExceptionHandler' => 'includes/Exception.php',
'MWFunction' => 'includes/MWFunction.php',
@@ -160,24 +159,23 @@ $wgAutoloadLocalClasses = array(
'OldChangesList' => 'includes/ChangesList.php',
'OutputPage' => 'includes/OutputPage.php',
'Page' => 'includes/WikiPage.php',
- 'PageHistory' => 'includes/HistoryPage.php',
- 'PageHistoryPager' => 'includes/HistoryPage.php',
'PageQueryPage' => 'includes/PageQueryPage.php',
'Pager' => 'includes/Pager.php',
'PasswordError' => 'includes/User.php',
- 'PatrolLog' => 'includes/PatrolLog.php',
+ 'PathRouter' => 'includes/PathRouter.php',
+ 'PathRouterPatternReplacer' => 'includes/PathRouter.php',
'PermissionsError' => 'includes/Exception.php',
'PhpHttpRequest' => 'includes/HttpFunctions.php',
'PoolCounter' => 'includes/PoolCounter.php',
'PoolCounter_Stub' => 'includes/PoolCounter.php',
'PoolCounterWork' => 'includes/PoolCounter.php',
+ 'PoolWorkArticleView' => 'includes/WikiPage.php',
'Preferences' => 'includes/Preferences.php',
'PreferencesForm' => 'includes/Preferences.php',
'PrefixSearch' => 'includes/PrefixSearch.php',
'ProtectionForm' => 'includes/ProtectionForm.php',
'QueryPage' => 'includes/QueryPage.php',
'QuickTemplate' => 'includes/SkinTemplate.php',
- 'RawPage' => 'includes/RawPage.php',
'RCCacheEntry' => 'includes/ChangesList.php',
'RdfMetaData' => 'includes/Metadata.php',
'ReadOnlyError' => 'includes/Exception.php',
@@ -186,10 +184,9 @@ $wgAutoloadLocalClasses = array(
'RegexlikeReplacer' => 'includes/StringUtils.php',
'ReplacementArray' => 'includes/StringUtils.php',
'Replacer' => 'includes/StringUtils.php',
- 'RequestContext' => 'includes/RequestContext.php',
'ReverseChronologicalPager' => 'includes/Pager.php',
- 'Rev_Item' => 'includes/RevisionList.php',
- 'Rev_List' => 'includes/RevisionList.php',
+ 'RevisionItemBase' => 'includes/RevisionList.php',
+ 'RevisionListBase' => 'includes/RevisionList.php',
'Revision' => 'includes/Revision.php',
'RevisionList' => 'includes/RevisionList.php',
'RSSFeed' => 'includes/Feed.php',
@@ -214,6 +211,7 @@ $wgAutoloadLocalClasses = array(
'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
'Status' => 'includes/Status.php',
+ 'StreamFile' => 'includes/StreamFile.php',
'StringUtils' => 'includes/StringUtils.php',
'StubContLang' => 'includes/StubObject.php',
'StubObject' => 'includes/StubObject.php',
@@ -258,15 +256,26 @@ $wgAutoloadLocalClasses = array(
# includes/actions
'CreditsAction' => 'includes/actions/CreditsAction.php',
- 'DeletetrackbackAction' => 'includes/actions/DeletetrackbackAction.php',
+ 'DeleteAction' => 'includes/actions/DeleteAction.php',
+ 'EditAction' => 'includes/actions/EditAction.php',
+ 'HistoryAction' => 'includes/actions/HistoryAction.php',
+ 'HistoryPage' => 'includes/actions/HistoryAction.php',
+ 'HistoryPager' => 'includes/actions/HistoryAction.php',
'InfoAction' => 'includes/actions/InfoAction.php',
'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
+ 'ProtectAction' => 'includes/actions/ProtectAction.php',
'PurgeAction' => 'includes/actions/PurgeAction.php',
+ 'RawAction' => 'includes/actions/RawAction.php',
+ 'RawPage' => 'includes/actions/RawAction.php',
+ 'RenderAction' => 'includes/actions/RenderAction.php',
'RevertAction' => 'includes/actions/RevertAction.php',
'RevertFileAction' => 'includes/actions/RevertAction.php',
'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
'RollbackAction' => 'includes/actions/RollbackAction.php',
+ 'SubmitAction' => 'includes/actions/EditAction.php',
+ 'UnprotectAction' => 'includes/actions/ProtectAction.php',
'UnwatchAction' => 'includes/actions/WatchAction.php',
+ 'ViewAction' => 'includes/actions/ViewAction.php',
'WatchAction' => 'includes/actions/WatchAction.php',
# includes/api
@@ -359,13 +368,14 @@ $wgAutoloadLocalClasses = array(
'ApiUpload' => 'includes/api/ApiUpload.php',
'ApiUserrights' => 'includes/api/ApiUserrights.php',
'ApiWatch' => 'includes/api/ApiWatch.php',
- 'UsageException' => 'includes/api/ApiMain.php',
# includes/cache
'CacheDependency' => 'includes/cache/CacheDependency.php',
'ConstantDependency' => 'includes/cache/CacheDependency.php',
'DependencyWrapper' => 'includes/cache/CacheDependency.php',
+ 'FileCacheBase' => 'includes/cache/FileCacheBase.php',
'FileDependency' => 'includes/cache/CacheDependency.php',
+ 'GenderCache' => 'includes/cache/GenderCache.php',
'GlobalDependency' => 'includes/cache/CacheDependency.php',
'HTMLCacheUpdate' => 'includes/cache/HTMLCacheUpdate.php',
'HTMLCacheUpdateJob' => 'includes/cache/HTMLCacheUpdate.php',
@@ -373,10 +383,20 @@ $wgAutoloadLocalClasses = array(
'LinkBatch' => 'includes/cache/LinkBatch.php',
'LinkCache' => 'includes/cache/LinkCache.php',
'MessageCache' => 'includes/cache/MessageCache.php',
+ 'ObjectFileCache' => 'includes/cache/ObjectFileCache.php',
+ 'ResourceFileCache' => 'includes/cache/ResourceFileCache.php',
'SquidUpdate' => 'includes/cache/SquidUpdate.php',
'TitleDependency' => 'includes/cache/CacheDependency.php',
'TitleListDependency' => 'includes/cache/CacheDependency.php',
+ 'UsageException' => 'includes/api/ApiMain.php',
+
+ # includes/context
+ 'ContextSource' => 'includes/context/ContextSource.php',
+ 'DerivativeContext' => 'includes/context/DerivativeContext.php',
+ 'IContextSource' => 'includes/context/IContextSource.php',
+ 'RequestContext' => 'includes/context/RequestContext.php',
+
# includes/db
'Blob' => 'includes/db/DatabaseUtility.php',
'ChronologyProtector' => 'includes/db/LBFactory.php',
@@ -419,6 +439,9 @@ $wgAutoloadLocalClasses = array(
'ResultWrapper' => 'includes/db/DatabaseUtility.php',
'SQLiteField' => 'includes/db/DatabaseSqlite.php',
+ # includes/debug
+ 'MWDebug' => 'includes/debug/Debug.php',
+
# includes/diff
'_DiffEngine' => 'includes/diff/DairikiDiff.php',
'_DiffOp' => 'includes/diff/DairikiDiff.php',
@@ -444,24 +467,57 @@ $wgAutoloadLocalClasses = array(
'ExternalUser_vB' => 'includes/extauth/vB.php',
# includes/filerepo
- 'ArchivedFile' => 'includes/filerepo/ArchivedFile.php',
- 'File' => 'includes/filerepo/File.php',
'FileRepo' => 'includes/filerepo/FileRepo.php',
'FileRepoStatus' => 'includes/filerepo/FileRepoStatus.php',
- 'ForeignAPIFile' => 'includes/filerepo/ForeignAPIFile.php',
'ForeignAPIRepo' => 'includes/filerepo/ForeignAPIRepo.php',
- 'ForeignDBFile' => 'includes/filerepo/ForeignDBFile.php',
'ForeignDBRepo' => 'includes/filerepo/ForeignDBRepo.php',
'ForeignDBViaLBRepo' => 'includes/filerepo/ForeignDBViaLBRepo.php',
'FSRepo' => 'includes/filerepo/FSRepo.php',
- 'LocalFile' => 'includes/filerepo/LocalFile.php',
- 'LocalFileDeleteBatch' => 'includes/filerepo/LocalFile.php',
- 'LocalFileMoveBatch' => 'includes/filerepo/LocalFile.php',
- 'LocalFileRestoreBatch' => 'includes/filerepo/LocalFile.php',
'LocalRepo' => 'includes/filerepo/LocalRepo.php',
- 'OldLocalFile' => 'includes/filerepo/OldLocalFile.php',
+ 'NullRepo' => 'includes/filerepo/NullRepo.php',
'RepoGroup' => 'includes/filerepo/RepoGroup.php',
- 'UnregisteredLocalFile' => 'includes/filerepo/UnregisteredLocalFile.php',
+
+ # includes/filerepo/file
+ 'ArchivedFile' => 'includes/filerepo/file/ArchivedFile.php',
+ 'File' => 'includes/filerepo/file/File.php',
+ 'ForeignAPIFile' => 'includes/filerepo/file/ForeignAPIFile.php',
+ 'ForeignDBFile' => 'includes/filerepo/file/ForeignDBFile.php',
+ 'LocalFile' => 'includes/filerepo/file/LocalFile.php',
+ 'LocalFileDeleteBatch' => 'includes/filerepo/file/LocalFile.php',
+ 'LocalFileMoveBatch' => 'includes/filerepo/file/LocalFile.php',
+ 'LocalFileRestoreBatch' => 'includes/filerepo/file/LocalFile.php',
+ 'OldLocalFile' => 'includes/filerepo/file/OldLocalFile.php',
+ 'UnregisteredLocalFile' => 'includes/filerepo/file/UnregisteredLocalFile.php',
+ 'FSFile' => 'includes/filerepo/backend/FSFile.php',
+ 'TempFSFile' => 'includes/filerepo/backend/TempFSFile.php',
+
+ # includes/filerepo/backend
+ 'FileBackendGroup' => 'includes/filerepo/backend/FileBackendGroup.php',
+ 'FileBackend' => 'includes/filerepo/backend/FileBackend.php',
+ 'FileBackendStore' => 'includes/filerepo/backend/FileBackend.php',
+ 'FileBackendMultiWrite' => 'includes/filerepo/backend/FileBackendMultiWrite.php',
+ 'FileBackendStoreShardListIterator' => 'includes/filerepo/backend/FileBackend.php',
+ 'FSFileBackend' => 'includes/filerepo/backend/FSFileBackend.php',
+ 'FSFileBackendFileList' => 'includes/filerepo/backend/FSFileBackend.php',
+ 'SwiftFileBackend' => 'includes/filerepo/backend/SwiftFileBackend.php',
+ 'SwiftFileBackendFileList' => 'includes/filerepo/backend/SwiftFileBackend.php',
+ 'LockManagerGroup' => 'includes/filerepo/backend/lockmanager/LockManagerGroup.php',
+ 'LockManager' => 'includes/filerepo/backend/lockmanager/LockManager.php',
+ 'ScopedLock' => 'includes/filerepo/backend/lockmanager/LockManager.php',
+ 'FSLockManager' => 'includes/filerepo/backend/lockmanager/FSLockManager.php',
+ 'DBLockManager' => 'includes/filerepo/backend/lockmanager/DBLockManager.php',
+ 'LSLockManager' => 'includes/filerepo/backend/lockmanager/LSLockManager.php',
+ 'MySqlLockManager'=> 'includes/filerepo/backend/lockmanager/DBLockManager.php',
+ 'NullLockManager' => 'includes/filerepo/backend/lockmanager/LockManager.php',
+ 'FileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'FileOpScopedPHPTimeout' => 'includes/filerepo/backend/FileOp.php',
+ 'StoreFileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'CopyFileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'MoveFileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'DeleteFileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'ConcatenateFileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'CreateFileOp' => 'includes/filerepo/backend/FileOp.php',
+ 'NullFileOp' => 'includes/filerepo/backend/FileOp.php',
# includes/installer
'CliInstaller' => 'includes/installer/CliInstaller.php',
@@ -527,13 +583,32 @@ $wgAutoloadLocalClasses = array(
'JSMinPlus' => 'includes/libs/jsminplus.php',
'JSParser' => 'includes/libs/jsminplus.php',
+ # includes/logging
+ 'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
+ 'DeleteLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'LogEntry' => 'includes/logging/LogEntry.php',
+ 'LogEventsList' => 'includes/logging/LogEventsList.php',
+ 'LogEntryBase' => 'includes/logging/LogEntry.php',
+ 'LogFormatter' => 'includes/logging/LogFormatter.php',
+ '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',
+ 'PatrolLog' => 'includes/logging/PatrolLog.php',
+ 'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
+
# includes/media
'BitmapHandler' => 'includes/media/Bitmap.php',
'BitmapHandler_ClientOnly' => 'includes/media/Bitmap_ClientOnly.php',
'BitmapMetadataHandler' => 'includes/media/BitmapMetadataHandler.php',
'BmpHandler' => 'includes/media/BMP.php',
'DjVuHandler' => 'includes/media/DjVu.php',
+ 'DjVuImage' => 'includes/media/DjVuImage.php',
'Exif' => 'includes/media/Exif.php',
+ 'ExifBitmapHandler' => 'includes/media/ExifBitmap.php',
'FormatExif' => 'includes/media/FormatMetadata.php',
'FormatMetadata' => 'includes/media/FormatMetadata.php',
'GIFHandler' => 'includes/media/GIF.php',
@@ -542,7 +617,6 @@ $wgAutoloadLocalClasses = array(
'IPTC' => 'includes/media/IPTC.php',
'JpegHandler' => 'includes/media/Jpeg.php',
'JpegMetadataExtractor' => 'includes/media/JpegMetadataExtractor.php',
- 'ExifBitmapHandler' => 'includes/media/ExifBitmap.php',
'MediaHandler' => 'includes/media/Generic.php',
'MediaTransformError' => 'includes/media/MediaTransformOutput.php',
'MediaTransformOutput' => 'includes/media/MediaTransformOutput.php',
@@ -553,6 +627,7 @@ $wgAutoloadLocalClasses = array(
'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
'TiffHandler' => 'includes/media/Tiff.php',
'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
+ 'XCFHandler' => 'includes/media/XCF.php',
'XMPInfo' => 'includes/media/XMPInfo.php',
'XMPReader' => 'includes/media/XMP.php',
'XMPValidate' => 'includes/media/XMPValidate.php',
@@ -564,7 +639,6 @@ $wgAutoloadLocalClasses = array(
'APCBagOStuff' => 'includes/objectcache/APCBagOStuff.php',
'BagOStuff' => 'includes/objectcache/BagOStuff.php',
'DBABagOStuff' => 'includes/objectcache/DBABagOStuff.php',
- 'eAccelBagOStuff' => 'includes/objectcache/eAccelBagOStuff.php',
'EhcacheBagOStuff' => 'includes/objectcache/EhcacheBagOStuff.php',
'EmptyBagOStuff' => 'includes/objectcache/EmptyBagOStuff.php',
'FakeMemCachedClient' => 'includes/objectcache/EmptyBagOStuff.php',
@@ -648,6 +722,7 @@ $wgAutoloadLocalClasses = array(
'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
'ResourceLoaderStartUpModule' => 'includes/resourceloader/ResourceLoaderStartUpModule.php',
+ 'ResourceLoaderUserCSSPrefsModule' => 'includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
'ResourceLoaderUserGroupsModule' => 'includes/resourceloader/ResourceLoaderUserGroupsModule.php',
'ResourceLoaderUserModule' => 'includes/resourceloader/ResourceLoaderUserModule.php',
'ResourceLoaderUserOptionsModule' => 'includes/resourceloader/ResourceLoaderUserOptionsModule.php',
@@ -740,6 +815,7 @@ $wgAutoloadLocalClasses = array(
'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
'SpecialCategories' => 'includes/specials/SpecialCategories.php',
+ 'SpecialChangeEmail' => 'includes/specials/SpecialChangeEmail.php',
'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
'SpecialComparePages' => 'includes/specials/SpecialComparePages.php',
'SpecialContributions' => 'includes/specials/SpecialContributions.php',
@@ -748,6 +824,7 @@ $wgAutoloadLocalClasses = array(
'SpecialExport' => 'includes/specials/SpecialExport.php',
'SpecialFilepath' => 'includes/specials/SpecialFilepath.php',
'SpecialImport' => 'includes/specials/SpecialImport.php',
+ 'SpecialJavaScriptTest' => 'includes/specials/SpecialJavaScriptTest.php',
'SpecialListFiles' => 'includes/specials/SpecialListfiles.php',
'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
'SpecialListUsers' => 'includes/specials/SpecialListusers.php',
@@ -800,12 +877,13 @@ $wgAutoloadLocalClasses = array(
'WithoutInterwikiPage' => 'includes/specials/SpecialWithoutinterwiki.php',
# includes/templates
- 'UsercreateTemplate' => 'includes/templates/Userlogin.php',
'UserloginTemplate' => 'includes/templates/Userlogin.php',
+ 'UsercreateTemplate' => 'includes/templates/Usercreate.php',
# includes/upload
'UploadBase' => 'includes/upload/UploadBase.php',
'UploadFromFile' => 'includes/upload/UploadFromFile.php',
+ 'UploadFromChunks' => 'includes/upload/UploadFromChunks.php',
'UploadFromStash' => 'includes/upload/UploadFromStash.php',
'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
'UploadStash' => 'includes/upload/UploadStash.php',
@@ -816,6 +894,9 @@ $wgAutoloadLocalClasses = array(
'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
'UploadStashNotAvailableException' => 'includes/upload/UploadStash.php',
'UploadStashZeroLengthFileException' => 'includes/upload/UploadStash.php',
+ 'UploadStashNotLoggedInException' => 'includes/upload/UploadStash.php',
+ 'UploadStashWrongOwnerException' => 'includes/upload/UploadStash.php',
+ 'UploadStashNoSuchKeyException' => 'includes/upload/UploadStash.php',
# languages
'FakeConverter' => 'languages/Language.php',
@@ -832,10 +913,13 @@ $wgAutoloadLocalClasses = array(
'Maintenance' => 'maintenance/Maintenance.php',
'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
'PopulateCategory' => 'maintenance/populateCategory.php',
+ 'PopulateImageSha1' => 'maintenance/populateImageSha1.php',
'PopulateLogSearch' => 'maintenance/populateLogSearch.php',
'PopulateLogUsertext' => 'maintenance/populateLogUsertext.php',
'PopulateParentId' => 'maintenance/populateParentId.php',
'PopulateRevisionLength' => 'maintenance/populateRevisionLength.php',
+ 'PopulateRevisionSha1' => 'maintenance/populateRevisionSha1.php',
+ 'RefreshLinks' => 'maintenance/refreshLinks.php',
'SevenZipStream' => 'maintenance/7zip.inc',
'Sqlite' => 'maintenance/sqlite.inc',
'UpdateCollation' => 'maintenance/updateCollation.php',
@@ -844,15 +928,19 @@ $wgAutoloadLocalClasses = array(
# maintenance/language
'csvStatsOutput' => 'maintenance/language/StatOutputs.php',
+ 'languages' => 'maintenance/language/languages.inc',
+ 'MessageWriter' => 'maintenance/language/writeMessagesArray.inc',
'statsOutput' => 'maintenance/language/StatOutputs.php',
'textStatsOutput' => 'maintenance/language/StatOutputs.php',
'wikiStatsOutput' => 'maintenance/language/StatOutputs.php',
+ # maintenance/term
+ 'AnsiTermColorer' => 'maintenance/term/MWTerm.php',
+ 'DummyTermColorer' => 'maintenance/term/MWTerm.php',
+
# tests
- 'AnsiTermColorer' => 'tests/testHelpers.inc',
'DbTestPreviewer' => 'tests/testHelpers.inc',
'DbTestRecorder' => 'tests/testHelpers.inc',
- 'DummyTermColorer' => 'tests/testHelpers.inc',
'TestFileIterator' => 'tests/testHelpers.inc',
'TestRecorder' => 'tests/testHelpers.inc',
diff --git a/includes/Autopromote.php b/includes/Autopromote.php
index 83f3c20b..a2336030 100644
--- a/includes/Autopromote.php
+++ b/includes/Autopromote.php
@@ -166,9 +166,9 @@ class Autopromote {
$groups = array_slice( $cond, 1 );
return count( array_intersect( $groups, $user->getGroups() ) ) == count( $groups );
case APCOND_ISIP:
- return $cond[1] == wfGetIP();
+ return $cond[1] == $user->getRequest()->getIP();
case APCOND_IPINRANGE:
- return IP::isInRange( wfGetIP(), $cond[1] );
+ return IP::isInRange( $user->getRequest()->getIP(), $cond[1] );
case APCOND_BLOCKED:
return $user->isBlocked();
case APCOND_ISBOT:
diff --git a/includes/BacklinkCache.php b/includes/BacklinkCache.php
index 8d1571ec..d17104f8 100644
--- a/includes/BacklinkCache.php
+++ b/includes/BacklinkCache.php
@@ -22,7 +22,7 @@
* @author Tim Starling
* @copyright © 2009, Tim Starling, Domas Mituzas
* @copyright © 2010, Max Sem
- * @copyright © 2011, Ashar Voultoiz
+ * @copyright © 2011, Antoine Musso
*/
class BacklinkCache {
@@ -75,6 +75,8 @@ class BacklinkCache {
* Serialization handler, diasallows to serialize the database to prevent
* failures after this class is deserialized from cache with dead DB
* connection.
+ *
+ * @return array
*/
function __sleep() {
return array( 'partitionCache', 'fullResultCache', 'title' );
@@ -190,7 +192,13 @@ class BacklinkCache {
if ( isset( $prefixes[$table] ) ) {
return $prefixes[$table];
} else {
- throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+ $prefix = null;
+ wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
+ if( $prefix ) {
+ return $prefix;
+ } else {
+ throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+ }
}
}
@@ -237,7 +245,10 @@ class BacklinkCache {
);
break;
default:
- throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+ $conds = null;
+ wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
+ if( !$conds )
+ throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
}
return $conds;
diff --git a/includes/Block.php b/includes/Block.php
index 27181d86..d80edb5e 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -59,7 +59,7 @@ class Block {
*/
function __construct( $address = '', $user = 0, $by = 0, $reason = '',
$timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
- $hideName = 0, $blockEmail = 0, $allowUsertalk = 0 )
+ $hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byText = '' )
{
if( $timestamp === 0 ){
$timestamp = wfTimestampNow();
@@ -71,13 +71,20 @@ class Block {
}
$this->setTarget( $address );
- $this->setBlocker( User::newFromID( $by ) );
+ if ( $this->target instanceof User && $user ) {
+ $this->target->setId( $user ); // needed for foreign users
+ }
+ if ( $by ) { // local user
+ $this->setBlocker( User::newFromID( $by ) );
+ } else { // foreign user
+ $this->setBlocker( $byText );
+ }
$this->mReason = $reason;
$this->mTimestamp = wfTimestamp( TS_MW, $timestamp );
$this->mAuto = $auto;
$this->isHardblock( !$anonOnly );
$this->prevents( 'createaccount', $createAccount );
- if ( $expiry == 'infinity' || $expiry == Block::infinity() ) {
+ if ( $expiry == 'infinity' || $expiry == wfGetDB( DB_SLAVE )->getInfinity() ) {
$this->mExpiry = 'infinity';
} else {
$this->mExpiry = wfTimestamp( TS_MW, $expiry );
@@ -101,6 +108,7 @@ class Block {
* @deprecated since 1.18
*/
public static function newFromDB( $address, $user = 0 ) {
+ wfDeprecated( __METHOD__, '1.18' );
return self::newFromTarget( User::whoIs( $user ), $address );
}
@@ -155,6 +163,7 @@ class Block {
* @deprecated since 1.18
*/
public function clear() {
+ wfDeprecated( __METHOD__, '1.18' );
# Noop
}
@@ -167,7 +176,7 @@ class Block {
* @deprecated since 1.18
*/
public function load( $address = '', $user = 0 ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
if( $user ){
$username = User::whoIs( $user );
$block = self::newFromTarget( $username, $address );
@@ -345,7 +354,11 @@ class Block {
*/
protected function initFromRow( $row ) {
$this->setTarget( $row->ipb_address );
- $this->setBlocker( User::newFromId( $row->ipb_by ) );
+ if ( $row->ipb_by ) { // local user
+ $this->setBlocker( User::newFromID( $row->ipb_by ) );
+ } else { // foreign user
+ $this->setBlocker( $row->ipb_by_text );
+ }
$this->mReason = $row->ipb_reason;
$this->mTimestamp = wfTimestamp( TS_MW, $row->ipb_timestamp );
@@ -418,10 +431,12 @@ class Block {
# Don't collide with expired blocks
Block::purgeExpired();
- $ipb_id = $dbw->nextSequenceValue( 'ipblocks_ipb_id_seq' );
+ $row = $this->getDatabaseArray();
+ $row['ipb_id'] = $dbw->nextSequenceValue("ipblocks_ipb_id_seq");
+
$dbw->insert(
'ipblocks',
- $this->getDatabaseArray(),
+ $row,
__METHOD__,
array( 'IGNORE' )
);
@@ -471,8 +486,8 @@ class Block {
$a = array(
'ipb_address' => (string)$this->target,
'ipb_user' => $this->target instanceof User ? $this->target->getID() : 0,
- 'ipb_by' => $this->getBlocker()->getId(),
- 'ipb_by_text' => $this->getBlocker()->getName(),
+ 'ipb_by' => $this->getBy(),
+ 'ipb_by_text' => $this->getByName(),
'ipb_reason' => $this->mReason,
'ipb_timestamp' => $db->timestamp( $this->mTimestamp ),
'ipb_auto' => $this->mAuto,
@@ -761,11 +776,12 @@ class Block {
/**
* Get the user id of the blocking sysop
*
- * @return Integer
+ * @return Integer (0 for foreign users)
*/
public function getBy() {
- return $this->getBlocker() instanceof User
- ? $this->getBlocker()->getId()
+ $blocker = $this->getBlocker();
+ return ( $blocker instanceof User )
+ ? $blocker->getId()
: 0;
}
@@ -775,9 +791,10 @@ class Block {
* @return String
*/
public function getByName() {
- return $this->getBlocker() instanceof User
- ? $this->getBlocker()->getName()
- : null;
+ $blocker = $this->getBlocker();
+ return ( $blocker instanceof User )
+ ? $blocker->getName()
+ : (string)$blocker; // username
}
/**
@@ -795,6 +812,7 @@ class Block {
* @param $x Bool
*/
public function forUpdate( $x = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
# noop
}
@@ -883,6 +901,7 @@ class Block {
* @deprecated since 1.18; use $dbw->encodeExpiry() instead
*/
public static function encodeExpiry( $expiry, $db ) {
+ wfDeprecated( __METHOD__, '1.18' );
return $db->encodeExpiry( $expiry );
}
@@ -892,9 +911,10 @@ class Block {
* @param $expiry String: Database expiry format
* @param $timestampType Int Requested timestamp format
* @return String
- * @deprecated since 1.18; use $wgLang->decodeExpiry() instead
+ * @deprecated since 1.18; use $wgLang->formatExpiry() instead
*/
public static function decodeExpiry( $expiry, $timestampType = TS_MW ) {
+ wfDeprecated( __METHOD__, '1.18' );
global $wgContLang;
return $wgContLang->formatExpiry( $expiry, $timestampType );
}
@@ -919,6 +939,7 @@ class Block {
* @deprecated since 1.18, call IP::sanitizeRange() directly
*/
public static function normaliseRange( $range ) {
+ wfDeprecated( __METHOD__, '1.18' );
return IP::sanitizeRange( $range );
}
@@ -927,7 +948,8 @@ class Block {
*/
public static function purgeExpired() {
$dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'ipblocks', array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+ $dbw->delete( 'ipblocks',
+ array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
}
/**
@@ -937,6 +959,7 @@ class Block {
* @return String
*/
public static function infinity() {
+ wfDeprecated( __METHOD__, '1.18' );
return wfGetDB( DB_SLAVE )->getInfinity();
}
@@ -948,6 +971,8 @@ class Block {
* @deprecated since 1.18; use $wgLang->formatExpiry() instead
*/
public static function formatExpiry( $encoded_expiry ) {
+ wfDeprecated( __METHOD__, '1.18' );
+
global $wgContLang;
static $msg = null;
@@ -981,7 +1006,7 @@ class Block {
* @deprecated since 1.18 moved to SpecialBlock::parseExpiryInput()
*/
public static function parseExpiryInput( $expiry ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialBlock::parseExpiryInput( $expiry );
}
@@ -1017,7 +1042,7 @@ class Block {
# 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 ) ) ) {
$block = new Block();
$block->fromMaster( $fromMaster );
@@ -1027,12 +1052,9 @@ class Block {
if( $block->newLoad( $vagueTarget ) ){
return $block;
- } else {
- return null;
}
- } else {
- return null;
}
+ return null;
}
/**
@@ -1127,6 +1149,15 @@ class Block {
}
/**
+ * @since 1.19
+ *
+ * @return Mixed|string
+ */
+ public function getExpiry() {
+ return $this->mExpiry;
+ }
+
+ /**
* Set the target for this block, and update $this->type accordingly
* @param $target Mixed
*/
@@ -1136,7 +1167,7 @@ class Block {
/**
* Get the user who implemented this block
- * @return User
+ * @return User|string Local User object or string for a foreign user
*/
public function getBlocker(){
return $this->blocker;
@@ -1144,9 +1175,9 @@ class Block {
/**
* Set the user who implemented (or will implement) this block
- * @param $user User
+ * @param $user User|string Local User object or username string for foriegn users
*/
- public function setBlocker( User $user ){
+ public function setBlocker( $user ){
$this->blocker = $user;
}
}
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index 6a0f6132..eab7a356 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -17,6 +17,10 @@ class CategoryPage extends Article {
# Subclasses can change this to override the viewer class.
protected $mCategoryViewerClass = 'CategoryViewer';
+ /**
+ * @param $title Title
+ * @return WikiCategoryPage
+ */
protected function newPage( Title $title ) {
// Overload mPage with a category-specific page
return new WikiCategoryPage( $title );
@@ -34,26 +38,28 @@ class CategoryPage extends Article {
}
function view() {
- global $wgRequest, $wgUser;
-
- $diff = $wgRequest->getVal( 'diff' );
- $diffOnly = $wgRequest->getBool( 'diffonly', $wgUser->getOption( 'diffonly' ) );
+ $request = $this->getContext()->getRequest();
+ $diff = $request->getVal( 'diff' );
+ $diffOnly = $request->getBool( 'diffonly',
+ $this->getContext()->getUser()->getOption( 'diffonly' ) );
if ( isset( $diff ) && $diffOnly ) {
- return parent::view();
+ parent::view();
+ return;
}
if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
return;
}
- if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
+ $title = $this->getTitle();
+ if ( NS_CATEGORY == $title->getNamespace() ) {
$this->openShowCategory();
}
parent::view();
- if ( NS_CATEGORY == $this->mTitle->getNamespace() ) {
+ if ( NS_CATEGORY == $title->getNamespace() ) {
$this->closeShowCategory();
}
}
@@ -63,18 +69,17 @@ class CategoryPage extends Article {
}
function closeShowCategory() {
- global $wgOut, $wgRequest;
-
// Use these as defaults for back compat --catrope
- $oldFrom = $wgRequest->getVal( 'from' );
- $oldUntil = $wgRequest->getVal( 'until' );
+ $request = $this->getContext()->getRequest();
+ $oldFrom = $request->getVal( 'from' );
+ $oldUntil = $request->getVal( 'until' );
+
+ $reqArray = $request->getValues();
- $reqArray = $wgRequest->getValues();
-
$from = $until = array();
foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
- $from[$type] = $wgRequest->getVal( "{$type}from", $oldFrom );
- $until[$type] = $wgRequest->getVal( "{$type}until", $oldUntil );
+ $from[$type] = $request->getVal( "{$type}from", $oldFrom );
+ $until[$type] = $request->getVal( "{$type}until", $oldUntil );
// Do not want old-style from/until propagating in nav links.
if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
@@ -88,652 +93,7 @@ class CategoryPage extends Article {
unset( $reqArray["from"] );
unset( $reqArray["to"] );
- $viewer = new $this->mCategoryViewerClass( $this->mTitle, $from, $until, $reqArray );
- $wgOut->addHTML( $viewer->getHTML() );
- }
-}
-
-class CategoryViewer {
- var $limit, $from, $until,
- $articles, $articles_start_char,
- $children, $children_start_char,
- $showGallery, $imgsNoGalley,
- $imgsNoGallery_start_char,
- $imgsNoGallery;
-
- /**
- * @var
- */
- var $nextPage;
-
- /**
- * @var Array
- */
- var $flip;
-
- /**
- * @var Title
- */
- var $title;
-
- /**
- * @var Collation
- */
- var $collation;
-
- /**
- * @var ImageGallery
- */
- var $gallery;
-
- /**
- * Category object for this page
- * @var Category
- */
- private $cat;
-
- /**
- * The original query array, to be used in generating paging links.
- * @var array
- */
- private $query;
-
- function __construct( $title, $from = '', $until = '', $query = array() ) {
- global $wgCategoryPagingLimit;
- $this->title = $title;
- $this->from = $from;
- $this->until = $until;
- $this->limit = $wgCategoryPagingLimit;
- $this->cat = Category::newFromTitle( $title );
- $this->query = $query;
- $this->collation = Collation::singleton();
- unset( $this->query['title'] );
- }
-
- /**
- * Format the category data list.
- *
- * @return string HTML output
- */
- public function getHTML() {
- global $wgOut, $wgCategoryMagicGallery, $wgLang, $wgContLang;
- wfProfileIn( __METHOD__ );
-
- $this->showGallery = $wgCategoryMagicGallery && !$wgOut->mNoGallery;
-
- $this->clearCategoryState();
- $this->doCategoryQuery();
- $this->finaliseCategoryState();
-
- $r = $this->getSubcategorySection() .
- $this->getPagesSection() .
- $this->getImageSection();
-
- if ( $r == '' ) {
- // If there is no category content to display, only
- // show the top part of the navigation links.
- // @todo FIXME: Cannot be completely suppressed because it
- // is unknown if 'until' or 'from' makes this
- // give 0 results.
- $r = $r . $this->getCategoryTop();
- } else {
- $r = $this->getCategoryTop() .
- $r .
- $this->getCategoryBottom();
- }
-
- // Give a proper message if category is empty
- if ( $r == '' ) {
- $r = wfMsgExt( 'category-empty', array( 'parse' ) );
- }
-
- $pageLang = $this->title->getPageLanguage();
- $langAttribs = array( 'lang' => $wgLang->getCode(), 'dir' => $wgLang->getDir() );
- # close the previous div, show the headings in user language,
- # then open a new div with the page content language again
- $r = Html::openElement( 'div', $langAttribs ) . $r . '</div>';
-
- wfProfileOut( __METHOD__ );
- return $wgContLang->convert( $r );
- }
-
- function clearCategoryState() {
- $this->articles = array();
- $this->articles_start_char = array();
- $this->children = array();
- $this->children_start_char = array();
- if ( $this->showGallery ) {
- $this->gallery = new ImageGallery();
- $this->gallery->setHideBadImages();
- } else {
- $this->imgsNoGallery = array();
- $this->imgsNoGallery_start_char = array();
- }
- }
-
- /**
- * Add a subcategory to the internal lists, using a Category object
- */
- function addSubcategoryObject( Category $cat, $sortkey, $pageLength ) {
- // Subcategory; strip the 'Category' namespace from the link text.
- $title = $cat->getTitle();
-
- $link = Linker::link( $title, htmlspecialchars( $title->getText() ) );
- if ( $title->isRedirect() ) {
- // This didn't used to add redirect-in-category, but might
- // as well be consistent with the rest of the sections
- // on a category page.
- $link = '<span class="redirect-in-category">' . $link . '</span>';
- }
- $this->children[] = $link;
-
- $this->children_start_char[] =
- $this->getSubcategorySortChar( $cat->getTitle(), $sortkey );
- }
-
- /**
- * Add a subcategory to the internal lists, using a title object
- * @deprecated since 1.17 kept for compatibility, please use addSubcategoryObject instead
- */
- function addSubcategory( Title $title, $sortkey, $pageLength ) {
- $this->addSubcategoryObject( Category::newFromTitle( $title ), $sortkey, $pageLength );
- }
-
- /**
- * Get the character to be used for sorting subcategories.
- * If there's a link from Category:A to Category:B, the sortkey of the resulting
- * entry in the categorylinks table is Category:A, not A, which it SHOULD be.
- * Workaround: If sortkey == "Category:".$title, than use $title for sorting,
- * else use sortkey...
- *
- * @param Title $title
- * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
- */
- function getSubcategorySortChar( $title, $sortkey ) {
- global $wgContLang;
-
- if ( $title->getPrefixedText() == $sortkey ) {
- $word = $title->getDBkey();
- } else {
- $word = $sortkey;
- }
-
- $firstChar = $this->collation->getFirstLetter( $word );
-
- return $wgContLang->convert( $firstChar );
- }
-
- /**
- * Add a page in the image namespace
- */
- function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) {
- global $wgContLang;
- if ( $this->showGallery ) {
- $flip = $this->flip['file'];
- if ( $flip ) {
- $this->gallery->insert( $title );
- } else {
- $this->gallery->add( $title );
- }
- } else {
- $link = Linker::link( $title );
- if ( $isRedirect ) {
- // This seems kind of pointless given 'mw-redirect' class,
- // but keeping for back-compatibility with user css.
- $link = '<span class="redirect-in-category">' . $link . '</span>';
- }
- $this->imgsNoGallery[] = $link;
-
- $this->imgsNoGallery_start_char[] = $wgContLang->convert(
- $this->collation->getFirstLetter( $sortkey ) );
- }
- }
-
- /**
- * Add a miscellaneous page
- */
- function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
- global $wgContLang;
-
- $link = Linker::link( $title );
- if ( $isRedirect ) {
- // This seems kind of pointless given 'mw-redirect' class,
- // but keeping for back-compatiability with user css.
- $link = '<span class="redirect-in-category">' . $link . '</span>';
- }
- $this->articles[] = $link;
-
- $this->articles_start_char[] = $wgContLang->convert(
- $this->collation->getFirstLetter( $sortkey ) );
- }
-
- function finaliseCategoryState() {
- if ( $this->flip['subcat'] ) {
- $this->children = array_reverse( $this->children );
- $this->children_start_char = array_reverse( $this->children_start_char );
- }
- if ( $this->flip['page'] ) {
- $this->articles = array_reverse( $this->articles );
- $this->articles_start_char = array_reverse( $this->articles_start_char );
- }
- if ( !$this->showGallery && $this->flip['file'] ) {
- $this->imgsNoGallery = array_reverse( $this->imgsNoGallery );
- $this->imgsNoGallery_start_char = array_reverse( $this->imgsNoGallery_start_char );
- }
- }
-
- function doCategoryQuery() {
- $dbr = wfGetDB( DB_SLAVE, 'category' );
-
- $this->nextPage = array(
- 'page' => null,
- 'subcat' => null,
- 'file' => null,
- );
- $this->flip = array( 'page' => false, 'subcat' => false, 'file' => false );
-
- foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
- # Get the sortkeys for start/end, if applicable. Note that if
- # the collation in the database differs from the one
- # set in $wgCategoryCollation, pagination might go totally haywire.
- $extraConds = array( 'cl_type' => $type );
- if ( $this->from[$type] !== null ) {
- $extraConds[] = 'cl_sortkey >= '
- . $dbr->addQuotes( $this->collation->getSortKey( $this->from[$type] ) );
- } elseif ( $this->until[$type] !== null ) {
- $extraConds[] = 'cl_sortkey < '
- . $dbr->addQuotes( $this->collation->getSortKey( $this->until[$type] ) );
- $this->flip[$type] = true;
- }
-
- $res = $dbr->select(
- array( 'page', 'categorylinks', 'category' ),
- array( 'page_id', 'page_title', 'page_namespace', 'page_len',
- 'page_is_redirect', 'cl_sortkey', 'cat_id', 'cat_title',
- 'cat_subcats', 'cat_pages', 'cat_files',
- 'cl_sortkey_prefix', 'cl_collation' ),
- array_merge( array( 'cl_to' => $this->title->getDBkey() ), $extraConds ),
- __METHOD__,
- array(
- 'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
- 'LIMIT' => $this->limit + 1,
- 'ORDER BY' => $this->flip[$type] ? 'cl_sortkey DESC' : 'cl_sortkey',
- ),
- array(
- 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
- 'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY )
- )
- );
-
- $count = 0;
- foreach ( $res as $row ) {
- $title = Title::newFromRow( $row );
- if ( $row->cl_collation === '' ) {
- // Hack to make sure that while updating from 1.16 schema
- // and db is inconsistent, that the sky doesn't fall.
- // See r83544. Could perhaps be removed in a couple decades...
- $humanSortkey = $row->cl_sortkey;
- } else {
- $humanSortkey = $title->getCategorySortkey( $row->cl_sortkey_prefix );
- }
-
- if ( ++$count > $this->limit ) {
- # We've reached the one extra which shows that there
- # are additional pages to be had. Stop here...
- $this->nextPage[$type] = $humanSortkey;
- break;
- }
-
- if ( $title->getNamespace() == NS_CATEGORY ) {
- $cat = Category::newFromRow( $row, $title );
- $this->addSubcategoryObject( $cat, $humanSortkey, $row->page_len );
- } elseif ( $title->getNamespace() == NS_FILE ) {
- $this->addImage( $title, $humanSortkey, $row->page_len, $row->page_is_redirect );
- } else {
- $this->addPage( $title, $humanSortkey, $row->page_len, $row->page_is_redirect );
- }
- }
- }
- }
-
- function getCategoryTop() {
- $r = $this->getCategoryBottom();
- return $r === ''
- ? $r
- : "<br style=\"clear:both;\"/>\n" . $r;
- }
-
- function getSubcategorySection() {
- # Don't show subcategories section if there are none.
- $r = '';
- $rescnt = count( $this->children );
- $dbcnt = $this->cat->getSubcatCount();
- $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'subcat' );
-
- if ( $rescnt > 0 ) {
- # Showing subcategories
- $r .= "<div id=\"mw-subcategories\">\n";
- $r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
- $r .= $countmsg;
- $r .= $this->getSectionPagingLinks( 'subcat' );
- $r .= $this->formatList( $this->children, $this->children_start_char );
- $r .= $this->getSectionPagingLinks( 'subcat' );
- $r .= "\n</div>";
- }
- return $r;
- }
-
- function getPagesSection() {
- $ti = htmlspecialchars( $this->title->getText() );
- # Don't show articles section if there are none.
- $r = '';
-
- # @todo FIXME: Here and in the other two sections: we don't need to bother
- # with this rigamarole if the entire category contents fit on one page
- # and have already been retrieved. We can just use $rescnt in that
- # case and save a query and some logic.
- $dbcnt = $this->cat->getPageCount() - $this->cat->getSubcatCount()
- - $this->cat->getFileCount();
- $rescnt = count( $this->articles );
- $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'article' );
-
- if ( $rescnt > 0 ) {
- $r = "<div id=\"mw-pages\">\n";
- $r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
- $r .= $countmsg;
- $r .= $this->getSectionPagingLinks( 'page' );
- $r .= $this->formatList( $this->articles, $this->articles_start_char );
- $r .= $this->getSectionPagingLinks( 'page' );
- $r .= "\n</div>";
- }
- return $r;
- }
-
- function getImageSection() {
- $r = '';
- $rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery );
- if ( $rescnt > 0 ) {
- $dbcnt = $this->cat->getFileCount();
- $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'file' );
-
- $r .= "<div id=\"mw-category-media\">\n";
- $r .= '<h2>' . wfMsg( 'category-media-header', htmlspecialchars( $this->title->getText() ) ) . "</h2>\n";
- $r .= $countmsg;
- $r .= $this->getSectionPagingLinks( 'file' );
- if ( $this->showGallery ) {
- $r .= $this->gallery->toHTML();
- } else {
- $r .= $this->formatList( $this->imgsNoGallery, $this->imgsNoGallery_start_char );
- }
- $r .= $this->getSectionPagingLinks( 'file' );
- $r .= "\n</div>";
- }
- return $r;
- }
-
- /**
- * Get the paging links for a section (subcats/pages/files), to go at the top and bottom
- * of the output.
- *
- * @param $type String: 'page', 'subcat', or 'file'
- * @return String: HTML output, possibly empty if there are no other pages
- */
- private function getSectionPagingLinks( $type ) {
- if ( $this->until[$type] !== null ) {
- return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
- } elseif ( $this->nextPage[$type] !== null || $this->from[$type] !== null ) {
- return $this->pagingLinks( $this->from[$type], $this->nextPage[$type], $type );
- } else {
- return '';
- }
- }
-
- function getCategoryBottom() {
- return '';
- }
-
- /**
- * Format a list of articles chunked by letter, either as a
- * bullet list or a columnar format, depending on the length.
- *
- * @param $articles Array
- * @param $articles_start_char Array
- * @param $cutoff Int
- * @return String
- * @private
- */
- function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
- $list = '';
- if ( count ( $articles ) > $cutoff ) {
- $list = self::columnList( $articles, $articles_start_char );
- } elseif ( count( $articles ) > 0 ) {
- // for short lists of articles in categories.
- $list = self::shortList( $articles, $articles_start_char );
- }
-
- $pageLang = $this->title->getPageLanguage();
- $attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
- 'class' => 'mw-content-'.$pageLang->getDir() );
- $list = Html::rawElement( 'div', $attribs, $list );
-
- return $list;
- }
-
- /**
- * Format a list of articles chunked by letter in a three-column
- * list, ordered vertically.
- *
- * TODO: Take the headers into account when creating columns, so they're
- * more visually equal.
- *
- * More distant TODO: Scrap this and use CSS columns, whenever IE finally
- * supports those.
- *
- * @param $articles Array
- * @param $articles_start_char Array
- * @return String
- * @private
- */
- static function columnList( $articles, $articles_start_char ) {
- $columns = array_combine( $articles, $articles_start_char );
- # Split into three columns
- $columns = array_chunk( $columns, ceil( count( $columns ) / 3 ), true /* preserve keys */ );
-
- $ret = '<table width="100%"><tr valign="top"><td>';
- $prevchar = null;
-
- foreach ( $columns as $column ) {
- $colContents = array();
-
- # Kind of like array_flip() here, but we keep duplicates in an
- # array instead of dropping them.
- foreach ( $column as $article => $char ) {
- if ( !isset( $colContents[$char] ) ) {
- $colContents[$char] = array();
- }
- $colContents[$char][] = $article;
- }
-
- $first = true;
- foreach ( $colContents as $char => $articles ) {
- $ret .= '<h3>' . htmlspecialchars( $char );
- if ( $first && $char === $prevchar ) {
- # We're continuing a previous chunk at the top of a new
- # column, so add " cont." after the letter.
- $ret .= ' ' . wfMsgHtml( 'listingcontinuesabbrev' );
- }
- $ret .= "</h3>\n";
-
- $ret .= '<ul><li>';
- $ret .= implode( "</li>\n<li>", $articles );
- $ret .= '</li></ul>';
-
- $first = false;
- $prevchar = $char;
- }
-
- $ret .= "</td>\n<td>";
- }
-
- $ret .= '</td></tr></table>';
- return $ret;
- }
-
- /**
- * Format a list of articles chunked by letter in a bullet list.
- * @param $articles Array
- * @param $articles_start_char Array
- * @return String
- * @private
- */
- static function shortList( $articles, $articles_start_char ) {
- $r = '<h3>' . htmlspecialchars( $articles_start_char[0] ) . "</h3>\n";
- $r .= '<ul><li>' . $articles[0] . '</li>';
- for ( $index = 1; $index < count( $articles ); $index++ ) {
- if ( $articles_start_char[$index] != $articles_start_char[$index - 1] ) {
- $r .= "</ul><h3>" . htmlspecialchars( $articles_start_char[$index] ) . "</h3>\n<ul>";
- }
-
- $r .= "<li>{$articles[$index]}</li>";
- }
- $r .= '</ul>';
- return $r;
- }
-
- /**
- * Create paging links, as a helper method to getSectionPagingLinks().
- *
- * @param $first String The 'until' parameter for the generated URL
- * @param $last String The 'from' parameter for the genererated URL
- * @param $type String A prefix for parameters, 'page' or 'subcat' or
- * 'file'
- * @return String HTML
- */
- private function pagingLinks( $first, $last, $type = '' ) {
- global $wgLang;
-
- $limitText = $wgLang->formatNum( $this->limit );
-
- $prevLink = wfMsgExt( 'prevn', array( 'escape', 'parsemag' ), $limitText );
-
- if ( $first != '' ) {
- $prevQuery = $this->query;
- $prevQuery["{$type}until"] = $first;
- unset( $prevQuery["{$type}from"] );
- $prevLink = Linker::linkKnown(
- $this->addFragmentToTitle( $this->title, $type ),
- $prevLink,
- array(),
- $prevQuery
- );
- }
-
- $nextLink = wfMsgExt( 'nextn', array( 'escape', 'parsemag' ), $limitText );
-
- if ( $last != '' ) {
- $lastQuery = $this->query;
- $lastQuery["{$type}from"] = $last;
- unset( $lastQuery["{$type}until"] );
- $nextLink = Linker::linkKnown(
- $this->addFragmentToTitle( $this->title, $type ),
- $nextLink,
- array(),
- $lastQuery
- );
- }
-
- return "($prevLink) ($nextLink)";
- }
-
- /**
- * Takes a title, and adds the fragment identifier that
- * corresponds to the correct segment of the category.
- *
- * @param Title $title: The title (usually $this->title)
- * @param String $section: Which section
- */
- private function addFragmentToTitle( $title, $section ) {
- switch ( $section ) {
- case 'page':
- $fragment = 'mw-pages';
- break;
- case 'subcat':
- $fragment = 'mw-subcategories';
- break;
- case 'file':
- $fragment = 'mw-category-media';
- break;
- default:
- throw new MWException( __METHOD__ .
- " Invalid section $section." );
- }
-
- return Title::makeTitle( $title->getNamespace(),
- $title->getDBkey(), $fragment );
- }
- /**
- * What to do if the category table conflicts with the number of results
- * 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 $rescnt Int: The number of items returned by our database query.
- * @param $dbcnt Int: The number of items according to the category table.
- * @param $type String: 'subcat', 'article', or 'file'
- * @return String: A message giving the number of items, to output to HTML.
- */
- private function getCountMessage( $rescnt, $dbcnt, $type ) {
- global $wgLang;
- # 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.
- if ( $type === 'article' ) {
- $pagingType = 'page';
- } else {
- $pagingType = $type;
- }
-
- $fromOrUntil = false;
- if ( $this->from[$pagingType] !== null || $this->until[$pagingType] !== null ) {
- $fromOrUntil = true;
- }
-
- if ( $dbcnt == $rescnt || ( ( $rescnt == $this->limit || $fromOrUntil )
- && $dbcnt > $rescnt ) ) {
- # Case 1: seems sane.
- $totalcnt = $dbcnt;
- } elseif ( $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.
- $totalcnt = $rescnt;
- $this->cat->refreshCounts();
- } else {
- # Case 3: hopeless. Don't give a total count at all.
- return wfMsgExt( "category-$type-count-limited", 'parse',
- $wgLang->formatNum( $rescnt ) );
- }
- return wfMsgExt(
- "category-$type-count",
- 'parse',
- $wgLang->formatNum( $rescnt ),
- $wgLang->formatNum( $totalcnt )
- );
+ $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
new file mode 100644
index 00000000..e8e91423
--- /dev/null
+++ b/includes/CategoryViewer.php
@@ -0,0 +1,677 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) )
+ die( 1 );
+
+class CategoryViewer extends ContextSource {
+ var $limit, $from, $until,
+ $articles, $articles_start_char,
+ $children, $children_start_char,
+ $showGallery, $imgsNoGalley,
+ $imgsNoGallery_start_char,
+ $imgsNoGallery;
+
+ /**
+ * @var Array
+ */
+ var $nextPage;
+
+ /**
+ * @var Array
+ */
+ var $flip;
+
+ /**
+ * @var Title
+ */
+ var $title;
+
+ /**
+ * @var Collation
+ */
+ var $collation;
+
+ /**
+ * @var ImageGallery
+ */
+ var $gallery;
+
+ /**
+ * Category object for this page
+ * @var Category
+ */
+ private $cat;
+
+ /**
+ * The original query array, to be used in generating paging links.
+ * @var array
+ */
+ private $query;
+
+ /**
+ * Constructor
+ *
+ * @since 1.19 $context is a second, required parameter
+ * @param $title Title
+ * @param $context IContextSource
+ * @param $from String
+ * @param $until String
+ * @param $query Array
+ */
+ function __construct( $title, IContextSource $context, $from = '', $until = '', $query = array() ) {
+ global $wgCategoryPagingLimit;
+ $this->title = $title;
+ $this->setContext( $context );
+ $this->from = $from;
+ $this->until = $until;
+ $this->limit = $wgCategoryPagingLimit;
+ $this->cat = Category::newFromTitle( $title );
+ $this->query = $query;
+ $this->collation = Collation::singleton();
+ unset( $this->query['title'] );
+ }
+
+ /**
+ * Format the category data list.
+ *
+ * @return string HTML output
+ */
+ public function getHTML() {
+ global $wgCategoryMagicGallery;
+ wfProfileIn( __METHOD__ );
+
+ $this->showGallery = $wgCategoryMagicGallery && !$this->getOutput()->mNoGallery;
+
+ $this->clearCategoryState();
+ $this->doCategoryQuery();
+ $this->finaliseCategoryState();
+
+ $r = $this->getSubcategorySection() .
+ $this->getPagesSection() .
+ $this->getImageSection();
+
+ if ( $r == '' ) {
+ // If there is no category content to display, only
+ // show the top part of the navigation links.
+ // @todo FIXME: Cannot be completely suppressed because it
+ // is unknown if 'until' or 'from' makes this
+ // give 0 results.
+ $r = $r . $this->getCategoryTop();
+ } else {
+ $r = $this->getCategoryTop() .
+ $r .
+ $this->getCategoryBottom();
+ }
+
+ // Give a proper message if category is empty
+ if ( $r == '' ) {
+ $r = wfMsgExt( 'category-empty', array( 'parse' ) );
+ }
+
+ $lang = $this->getLanguage();
+ $langAttribs = array( 'lang' => $lang->getCode(), 'dir' => $lang->getDir() );
+ # put a div around the headings which are in the user language
+ $r = Html::openElement( 'div', $langAttribs ) . $r . '</div>';
+
+ wfProfileOut( __METHOD__ );
+ return $r;
+ }
+
+ function clearCategoryState() {
+ $this->articles = array();
+ $this->articles_start_char = array();
+ $this->children = array();
+ $this->children_start_char = array();
+ if ( $this->showGallery ) {
+ $this->gallery = new ImageGallery();
+ $this->gallery->setHideBadImages();
+ } else {
+ $this->imgsNoGallery = array();
+ $this->imgsNoGallery_start_char = array();
+ }
+ }
+
+ /**
+ * Add a subcategory to the internal lists, using a Category object
+ * @param $cat Category
+ * @param $sortkey
+ * @param $pageLength
+ */
+ function addSubcategoryObject( Category $cat, $sortkey, $pageLength ) {
+ // Subcategory; strip the 'Category' namespace from the link text.
+ $title = $cat->getTitle();
+
+ $link = Linker::link( $title, htmlspecialchars( $title->getText() ) );
+ if ( $title->isRedirect() ) {
+ // This didn't used to add redirect-in-category, but might
+ // as well be consistent with the rest of the sections
+ // on a category page.
+ $link = '<span class="redirect-in-category">' . $link . '</span>';
+ }
+ $this->children[] = $link;
+
+ $this->children_start_char[] =
+ $this->getSubcategorySortChar( $cat->getTitle(), $sortkey );
+ }
+
+ /**
+ * Add a subcategory to the internal lists, using a title object
+ * @deprecated since 1.17 kept for compatibility, please use addSubcategoryObject instead
+ */
+ function addSubcategory( Title $title, $sortkey, $pageLength ) {
+ wfDeprecated( __METHOD__, '1.17' );
+ $this->addSubcategoryObject( Category::newFromTitle( $title ), $sortkey, $pageLength );
+ }
+
+ /**
+ * Get the character to be used for sorting subcategories.
+ * If there's a link from Category:A to Category:B, the sortkey of the resulting
+ * entry in the categorylinks table is Category:A, not A, which it SHOULD be.
+ * Workaround: If sortkey == "Category:".$title, than use $title for sorting,
+ * else use sortkey...
+ *
+ * @param Title $title
+ * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
+ */
+ function getSubcategorySortChar( $title, $sortkey ) {
+ global $wgContLang;
+
+ if ( $title->getPrefixedText() == $sortkey ) {
+ $word = $title->getDBkey();
+ } else {
+ $word = $sortkey;
+ }
+
+ $firstChar = $this->collation->getFirstLetter( $word );
+
+ return $wgContLang->convert( $firstChar );
+ }
+
+ /**
+ * Add a page in the image namespace
+ * @param $title Title
+ * @param $sortkey
+ * @param $pageLength
+ * @param $isRedirect bool
+ */
+ function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) {
+ global $wgContLang;
+ if ( $this->showGallery ) {
+ $flip = $this->flip['file'];
+ if ( $flip ) {
+ $this->gallery->insert( $title );
+ } else {
+ $this->gallery->add( $title );
+ }
+ } else {
+ $link = Linker::link( $title );
+ if ( $isRedirect ) {
+ // This seems kind of pointless given 'mw-redirect' class,
+ // but keeping for back-compatibility with user css.
+ $link = '<span class="redirect-in-category">' . $link . '</span>';
+ }
+ $this->imgsNoGallery[] = $link;
+
+ $this->imgsNoGallery_start_char[] = $wgContLang->convert(
+ $this->collation->getFirstLetter( $sortkey ) );
+ }
+ }
+
+ /**
+ * Add a miscellaneous page
+ * @param $title
+ * @param $sortkey
+ * @param $pageLength
+ * @param $isRedirect bool
+ */
+ function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
+ global $wgContLang;
+
+ $link = Linker::link( $title );
+ if ( $isRedirect ) {
+ // This seems kind of pointless given 'mw-redirect' class,
+ // but keeping for back-compatiability with user css.
+ $link = '<span class="redirect-in-category">' . $link . '</span>';
+ }
+ $this->articles[] = $link;
+
+ $this->articles_start_char[] = $wgContLang->convert(
+ $this->collation->getFirstLetter( $sortkey ) );
+ }
+
+ function finaliseCategoryState() {
+ if ( $this->flip['subcat'] ) {
+ $this->children = array_reverse( $this->children );
+ $this->children_start_char = array_reverse( $this->children_start_char );
+ }
+ if ( $this->flip['page'] ) {
+ $this->articles = array_reverse( $this->articles );
+ $this->articles_start_char = array_reverse( $this->articles_start_char );
+ }
+ if ( !$this->showGallery && $this->flip['file'] ) {
+ $this->imgsNoGallery = array_reverse( $this->imgsNoGallery );
+ $this->imgsNoGallery_start_char = array_reverse( $this->imgsNoGallery_start_char );
+ }
+ }
+
+ function doCategoryQuery() {
+ $dbr = wfGetDB( DB_SLAVE, 'category' );
+
+ $this->nextPage = array(
+ 'page' => null,
+ 'subcat' => null,
+ 'file' => null,
+ );
+ $this->flip = array( 'page' => false, 'subcat' => false, 'file' => false );
+
+ foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
+ # Get the sortkeys for start/end, if applicable. Note that if
+ # the collation in the database differs from the one
+ # set in $wgCategoryCollation, pagination might go totally haywire.
+ $extraConds = array( 'cl_type' => $type );
+ if ( $this->from[$type] !== null ) {
+ $extraConds[] = 'cl_sortkey >= '
+ . $dbr->addQuotes( $this->collation->getSortKey( $this->from[$type] ) );
+ } elseif ( $this->until[$type] !== null ) {
+ $extraConds[] = 'cl_sortkey < '
+ . $dbr->addQuotes( $this->collation->getSortKey( $this->until[$type] ) );
+ $this->flip[$type] = true;
+ }
+
+ $res = $dbr->select(
+ array( 'page', 'categorylinks', 'category' ),
+ array( 'page_id', 'page_title', 'page_namespace', 'page_len',
+ 'page_is_redirect', 'cl_sortkey', 'cat_id', 'cat_title',
+ 'cat_subcats', 'cat_pages', 'cat_files',
+ 'cl_sortkey_prefix', 'cl_collation' ),
+ array_merge( array( 'cl_to' => $this->title->getDBkey() ), $extraConds ),
+ __METHOD__,
+ array(
+ 'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
+ 'LIMIT' => $this->limit + 1,
+ 'ORDER BY' => $this->flip[$type] ? 'cl_sortkey DESC' : 'cl_sortkey',
+ ),
+ array(
+ 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
+ 'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY )
+ )
+ );
+
+ $count = 0;
+ foreach ( $res as $row ) {
+ $title = Title::newFromRow( $row );
+ if ( $row->cl_collation === '' ) {
+ // Hack to make sure that while updating from 1.16 schema
+ // and db is inconsistent, that the sky doesn't fall.
+ // See r83544. Could perhaps be removed in a couple decades...
+ $humanSortkey = $row->cl_sortkey;
+ } else {
+ $humanSortkey = $title->getCategorySortkey( $row->cl_sortkey_prefix );
+ }
+
+ if ( ++$count > $this->limit ) {
+ # We've reached the one extra which shows that there
+ # are additional pages to be had. Stop here...
+ $this->nextPage[$type] = $humanSortkey;
+ break;
+ }
+
+ if ( $title->getNamespace() == NS_CATEGORY ) {
+ $cat = Category::newFromRow( $row, $title );
+ $this->addSubcategoryObject( $cat, $humanSortkey, $row->page_len );
+ } elseif ( $title->getNamespace() == NS_FILE ) {
+ $this->addImage( $title, $humanSortkey, $row->page_len, $row->page_is_redirect );
+ } else {
+ $this->addPage( $title, $humanSortkey, $row->page_len, $row->page_is_redirect );
+ }
+ }
+ }
+ }
+
+ /**
+ * @return string
+ */
+ function getCategoryTop() {
+ $r = $this->getCategoryBottom();
+ return $r === ''
+ ? $r
+ : "<br style=\"clear:both;\"/>\n" . $r;
+ }
+
+ /**
+ * @return string
+ */
+ function getSubcategorySection() {
+ # Don't show subcategories section if there are none.
+ $r = '';
+ $rescnt = count( $this->children );
+ $dbcnt = $this->cat->getSubcatCount();
+ $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'subcat' );
+
+ if ( $rescnt > 0 ) {
+ # Showing subcategories
+ $r .= "<div id=\"mw-subcategories\">\n";
+ $r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
+ $r .= $countmsg;
+ $r .= $this->getSectionPagingLinks( 'subcat' );
+ $r .= $this->formatList( $this->children, $this->children_start_char );
+ $r .= $this->getSectionPagingLinks( 'subcat' );
+ $r .= "\n</div>";
+ }
+ return $r;
+ }
+
+ /**
+ * @return string
+ */
+ function getPagesSection() {
+ $ti = htmlspecialchars( $this->title->getText() );
+ # Don't show articles section if there are none.
+ $r = '';
+
+ # @todo FIXME: Here and in the other two sections: we don't need to bother
+ # with this rigamarole if the entire category contents fit on one page
+ # and have already been retrieved. We can just use $rescnt in that
+ # case and save a query and some logic.
+ $dbcnt = $this->cat->getPageCount() - $this->cat->getSubcatCount()
+ - $this->cat->getFileCount();
+ $rescnt = count( $this->articles );
+ $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'article' );
+
+ if ( $rescnt > 0 ) {
+ $r = "<div id=\"mw-pages\">\n";
+ $r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
+ $r .= $countmsg;
+ $r .= $this->getSectionPagingLinks( 'page' );
+ $r .= $this->formatList( $this->articles, $this->articles_start_char );
+ $r .= $this->getSectionPagingLinks( 'page' );
+ $r .= "\n</div>";
+ }
+ return $r;
+ }
+
+ /**
+ * @return string
+ */
+ function getImageSection() {
+ $r = '';
+ $rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery );
+ if ( $rescnt > 0 ) {
+ $dbcnt = $this->cat->getFileCount();
+ $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'file' );
+
+ $r .= "<div id=\"mw-category-media\">\n";
+ $r .= '<h2>' . wfMsg( 'category-media-header', htmlspecialchars( $this->title->getText() ) ) . "</h2>\n";
+ $r .= $countmsg;
+ $r .= $this->getSectionPagingLinks( 'file' );
+ if ( $this->showGallery ) {
+ $r .= $this->gallery->toHTML();
+ } else {
+ $r .= $this->formatList( $this->imgsNoGallery, $this->imgsNoGallery_start_char );
+ }
+ $r .= $this->getSectionPagingLinks( 'file' );
+ $r .= "\n</div>";
+ }
+ return $r;
+ }
+
+ /**
+ * Get the paging links for a section (subcats/pages/files), to go at the top and bottom
+ * of the output.
+ *
+ * @param $type String: 'page', 'subcat', or 'file'
+ * @return String: HTML output, possibly empty if there are no other pages
+ */
+ private function getSectionPagingLinks( $type ) {
+ if ( $this->until[$type] !== null ) {
+ return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
+ } elseif ( $this->nextPage[$type] !== null || $this->from[$type] !== null ) {
+ return $this->pagingLinks( $this->from[$type], $this->nextPage[$type], $type );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @return string
+ */
+ function getCategoryBottom() {
+ return '';
+ }
+
+ /**
+ * Format a list of articles chunked by letter, either as a
+ * bullet list or a columnar format, depending on the length.
+ *
+ * @param $articles Array
+ * @param $articles_start_char Array
+ * @param $cutoff Int
+ * @return String
+ * @private
+ */
+ function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
+ $list = '';
+ if ( count ( $articles ) > $cutoff ) {
+ $list = self::columnList( $articles, $articles_start_char );
+ } elseif ( count( $articles ) > 0 ) {
+ // for short lists of articles in categories.
+ $list = self::shortList( $articles, $articles_start_char );
+ }
+
+ $pageLang = $this->title->getPageLanguage();
+ $attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
+ 'class' => 'mw-content-'.$pageLang->getDir() );
+ $list = Html::rawElement( 'div', $attribs, $list );
+
+ return $list;
+ }
+
+ /**
+ * Format a list of articles chunked by letter in a three-column
+ * list, ordered vertically.
+ *
+ * TODO: Take the headers into account when creating columns, so they're
+ * more visually equal.
+ *
+ * More distant TODO: Scrap this and use CSS columns, whenever IE finally
+ * supports those.
+ *
+ * @param $articles Array
+ * @param $articles_start_char Array
+ * @return String
+ * @private
+ */
+ static function columnList( $articles, $articles_start_char ) {
+ $columns = array_combine( $articles, $articles_start_char );
+ # Split into three columns
+ $columns = array_chunk( $columns, ceil( count( $columns ) / 3 ), true /* preserve keys */ );
+
+ $ret = '<table width="100%"><tr valign="top">';
+ $prevchar = null;
+
+ foreach ( $columns as $column ) {
+ $ret .= '<td width="33.3%">';
+ $colContents = array();
+
+ # Kind of like array_flip() here, but we keep duplicates in an
+ # array instead of dropping them.
+ foreach ( $column as $article => $char ) {
+ if ( !isset( $colContents[$char] ) ) {
+ $colContents[$char] = array();
+ }
+ $colContents[$char][] = $article;
+ }
+
+ $first = true;
+ foreach ( $colContents as $char => $articles ) {
+ $ret .= '<h3>' . htmlspecialchars( $char );
+ if ( $first && $char === $prevchar ) {
+ # We're continuing a previous chunk at the top of a new
+ # column, so add " cont." after the letter.
+ $ret .= ' ' . wfMsgHtml( 'listingcontinuesabbrev' );
+ }
+ $ret .= "</h3>\n";
+
+ $ret .= '<ul><li>';
+ $ret .= implode( "</li>\n<li>", $articles );
+ $ret .= '</li></ul>';
+
+ $first = false;
+ $prevchar = $char;
+ }
+
+ $ret .= "</td>\n";
+ }
+
+ $ret .= '</tr></table>';
+ return $ret;
+ }
+
+ /**
+ * Format a list of articles chunked by letter in a bullet list.
+ * @param $articles Array
+ * @param $articles_start_char Array
+ * @return String
+ * @private
+ */
+ static function shortList( $articles, $articles_start_char ) {
+ $r = '<h3>' . htmlspecialchars( $articles_start_char[0] ) . "</h3>\n";
+ $r .= '<ul><li>' . $articles[0] . '</li>';
+ for ( $index = 1; $index < count( $articles ); $index++ ) {
+ if ( $articles_start_char[$index] != $articles_start_char[$index - 1] ) {
+ $r .= "</ul><h3>" . htmlspecialchars( $articles_start_char[$index] ) . "</h3>\n<ul>";
+ }
+
+ $r .= "<li>{$articles[$index]}</li>";
+ }
+ $r .= '</ul>';
+ return $r;
+ }
+
+ /**
+ * Create paging links, as a helper method to getSectionPagingLinks().
+ *
+ * @param $first String The 'until' parameter for the generated URL
+ * @param $last String The 'from' parameter for the genererated URL
+ * @param $type String A prefix for parameters, 'page' or 'subcat' or
+ * 'file'
+ * @return String HTML
+ */
+ private function pagingLinks( $first, $last, $type = '' ) {
+ $prevLink = wfMessage( 'prevn' )->numParams( $this->limit )->escaped();
+
+ if ( $first != '' ) {
+ $prevQuery = $this->query;
+ $prevQuery["{$type}until"] = $first;
+ unset( $prevQuery["{$type}from"] );
+ $prevLink = Linker::linkKnown(
+ $this->addFragmentToTitle( $this->title, $type ),
+ $prevLink,
+ array(),
+ $prevQuery
+ );
+ }
+
+ $nextLink = wfMessage( 'nextn' )->numParams( $this->limit )->escaped();
+
+ if ( $last != '' ) {
+ $lastQuery = $this->query;
+ $lastQuery["{$type}from"] = $last;
+ unset( $lastQuery["{$type}until"] );
+ $nextLink = Linker::linkKnown(
+ $this->addFragmentToTitle( $this->title, $type ),
+ $nextLink,
+ array(),
+ $lastQuery
+ );
+ }
+
+ return "($prevLink) ($nextLink)";
+ }
+
+ /**
+ * Takes a title, and adds the fragment identifier that
+ * corresponds to the correct segment of the category.
+ *
+ * @param Title $title: The title (usually $this->title)
+ * @param String $section: Which section
+ * @return Title
+ */
+ private function addFragmentToTitle( $title, $section ) {
+ switch ( $section ) {
+ case 'page':
+ $fragment = 'mw-pages';
+ break;
+ case 'subcat':
+ $fragment = 'mw-subcategories';
+ break;
+ case 'file':
+ $fragment = 'mw-category-media';
+ break;
+ default:
+ throw new MWException( __METHOD__ .
+ " Invalid section $section." );
+ }
+
+ return Title::makeTitle( $title->getNamespace(),
+ $title->getDBkey(), $fragment );
+ }
+ /**
+ * What to do if the category table conflicts with the number of results
+ * 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 $rescnt Int: The number of items returned by our database query.
+ * @param $dbcnt Int: The number of items according to the category table.
+ * @param $type String: 'subcat', 'article', or 'file'
+ * @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
+
+ // This is a little ugly, but we seem to use different names
+ // for the paging types then for the messages.
+ if ( $type === 'article' ) {
+ $pagingType = 'page';
+ } else {
+ $pagingType = $type;
+ }
+
+ $fromOrUntil = false;
+ if ( $this->from[$pagingType] !== null || $this->until[$pagingType] !== null ) {
+ $fromOrUntil = true;
+ }
+
+ if ( $dbcnt == $rescnt || ( ( $rescnt == $this->limit || $fromOrUntil )
+ && $dbcnt > $rescnt ) ) {
+ # Case 1: seems sane.
+ $totalcnt = $dbcnt;
+ } elseif ( $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.
+ $totalcnt = $rescnt;
+ $this->cat->refreshCounts();
+ } else {
+ # Case 3: hopeless. Don't give a total count at all.
+ return wfMessage( "category-$type-count-limited" )->numParams( $rescnt )->parseAsBlock();
+ }
+ return wfMessage( "category-$type-count" )->numParams( $rescnt, $totalcnt )->parseAsBlock();
+ }
+}
diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php
index 2567de0d..4a8ed709 100644
--- a/includes/Categoryfinder.php
+++ b/includes/Categoryfinder.php
@@ -29,6 +29,10 @@ class Categoryfinder {
var $targets = array(); # Array of DBKEY category names
var $name2id = array();
var $mode; # "AND" or "OR"
+
+ /**
+ * @var DatabaseBase
+ */
var $dbr; # Read-DB slave
/**
diff --git a/includes/Cdb.php b/includes/Cdb.php
index d7a2bca5..94aa1925 100644
--- a/includes/Cdb.php
+++ b/includes/Cdb.php
@@ -72,7 +72,7 @@ abstract class CdbWriter {
*
* @param $fileName string
*
- * @return bool
+ * @return CdbWriter_DBA|CdbWriter_PHP
*/
public static function open( $fileName ) {
if ( CdbReader::haveExtension() ) {
@@ -85,11 +85,15 @@ abstract class CdbWriter {
/**
* Create the object and open the file
+ *
+ * @param $fileName string
*/
abstract function __construct( $fileName );
/**
* Set a key to a given value. The value will be converted to string.
+ * @param $key string
+ * @param $value string
*/
abstract public function set( $key, $value );
@@ -100,7 +104,6 @@ abstract class CdbWriter {
abstract public function close();
}
-
/**
* Reader class which uses the DBA extension
*/
diff --git a/includes/Cdb_PHP.php b/includes/Cdb_PHP.php
index f4029ba5..53175272 100644
--- a/includes/Cdb_PHP.php
+++ b/includes/Cdb_PHP.php
@@ -1,6 +1,6 @@
<?php
/**
- * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
* appears in PHP 5.3. Changes are:
* * Error returns replaced with exceptions
* * Exception thrown if sizes or offsets are between 2GB and 4GB
@@ -50,7 +50,7 @@ class CdbFunctions {
/**
* The CDB hash function.
- *
+ *
* @param $s
*
* @return
@@ -62,7 +62,7 @@ class CdbFunctions {
// Do a 32-bit sum
// Inlined here for speed
$sum = ($h & 0x3fffffff) + ($h5 & 0x3fffffff);
- $h =
+ $h =
(
( $sum & 0x40000000 ? 1 : 0 )
+ ( $h & 0x80000000 ? 2 : 0 )
@@ -82,6 +82,9 @@ class CdbFunctions {
* CDB reader class
*/
class CdbReader_PHP extends CdbReader {
+ /** The filename */
+ var $fileName;
+
/** The file handle */
var $handle;
@@ -104,12 +107,16 @@ class CdbReader_PHP extends CdbReader {
var $dpos;
/* initialized if cdb_findnext() returns 1 */
- var $dlen;
+ var $dlen;
+ /**
+ * @param $fileName string
+ */
function __construct( $fileName ) {
+ $this->fileName = $fileName;
$this->handle = fopen( $fileName, 'rb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open CDB file "' . $fileName . '"' );
+ throw new MWException( 'Unable to open CDB file "' . $this->fileName . '".' );
}
$this->findStart();
}
@@ -157,7 +164,8 @@ class CdbReader_PHP extends CdbReader {
protected function read( $length, $pos ) {
if ( fseek( $this->handle, $pos ) == -1 ) {
// This can easily happen if the internal pointers are incorrect
- throw new MWException( __METHOD__.': seek failed, file may be corrupted.' );
+ throw new MWException(
+ 'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
}
if ( $length == 0 ) {
@@ -166,7 +174,8 @@ class CdbReader_PHP extends CdbReader {
$buf = fread( $this->handle, $length );
if ( $buf === false || strlen( $buf ) !== $length ) {
- throw new MWException( __METHOD__.': read from CDB file failed, file may be corrupted' );
+ throw new MWException(
+ 'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
}
return $buf;
}
@@ -179,7 +188,8 @@ class CdbReader_PHP extends CdbReader {
protected function unpack31( $s ) {
$data = unpack( 'V', $s );
if ( $data[1] > 0x7fffffff ) {
- throw new MWException( __METHOD__.': error in CDB file, integer too big' );
+ throw new MWException(
+ 'Error in CDB file "' . $this->fileName . '", integer too big.' );
}
return $data[1];
}
@@ -257,20 +267,24 @@ class CdbWriter_PHP extends CdbWriter {
var $handle, $realFileName, $tmpFileName;
var $hplist;
- var $numEntries, $pos;
+ var $numentries, $pos;
+ /**
+ * @param $fileName string
+ */
function __construct( $fileName ) {
$this->realFileName = $fileName;
$this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
$this->handle = fopen( $this->tmpFileName, 'wb' );
if ( !$this->handle ) {
- throw new MWException( 'Unable to open CDB file for write "' . $fileName . '"' );
+ $this->throwException(
+ 'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
}
$this->hplist = array();
$this->numentries = 0;
$this->pos = 2048; // leaving space for the pointer array, 256 * 8
if ( fseek( $this->handle, $this->pos ) == -1 ) {
- throw new MWException( __METHOD__.': fseek failed' );
+ $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
}
}
@@ -308,7 +322,7 @@ class CdbWriter_PHP extends CdbWriter {
unlink( $this->realFileName );
}
if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
- throw new MWException( 'Unable to move the new CDB file into place.' );
+ $this->throwException( 'Unable to move the new CDB file into place.' );
}
unset( $this->handle );
}
@@ -320,7 +334,7 @@ class CdbWriter_PHP extends CdbWriter {
protected function write( $buf ) {
$len = fwrite( $this->handle, $buf );
if ( $len !== strlen( $buf ) ) {
- throw new MWException( 'Error writing to CDB file.' );
+ $this->throwException( 'Error writing to CDB file "'.$this->tmpFileName.'".' );
}
}
@@ -331,7 +345,8 @@ class CdbWriter_PHP extends CdbWriter {
protected function posplus( $len ) {
$newpos = $this->pos + $len;
if ( $newpos > 0x7fffffff ) {
- throw new MWException( 'A value in the CDB file is too large' );
+ $this->throwException(
+ 'A value in the CDB file "'.$this->tmpFileName.'" is too large.' );
}
$this->pos = $newpos;
}
@@ -360,10 +375,10 @@ class CdbWriter_PHP extends CdbWriter {
*/
protected function addbegin( $keylen, $datalen ) {
if ( $keylen > 0x7fffffff ) {
- throw new MWException( __METHOD__.': key length too long' );
+ $this->throwException( 'Key length too long in file "'.$this->tmpFileName.'".' );
}
if ( $datalen > 0x7fffffff ) {
- throw new MWException( __METHOD__.': data length too long' );
+ $this->throwException( 'Data length too long in file "'.$this->tmpFileName.'".' );
}
$buf = pack( 'VV', $keylen, $datalen );
$this->write( $buf );
@@ -391,7 +406,7 @@ class CdbWriter_PHP extends CdbWriter {
}
// Excessively clever and indulgent code to simultaneously fill $packedTables
- // with the packed hashtables, and adjust the elements of $starts
+ // with the packed hashtables, and adjust the elements of $starts
// to actually point to the starts instead of the ends.
$packedTables = array_fill( 0, $this->numentries, false );
foreach ( $this->hplist as $item ) {
@@ -416,7 +431,7 @@ class CdbWriter_PHP extends CdbWriter {
// is taken.
for ( $u = 0; $u < $count; ++$u ) {
$hp = $packedTables[$starts[$i] + $u];
- $where = CdbFunctions::unsignedMod(
+ $where = CdbFunctions::unsignedMod(
CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
while ( $hashtable[$where]['p'] )
if ( ++$where == $len )
@@ -426,7 +441,7 @@ class CdbWriter_PHP extends CdbWriter {
// Write the hashtable
for ( $u = 0; $u < $len; ++$u ) {
- $buf = pack( 'vvV',
+ $buf = pack( 'vvV',
$hashtable[$u]['h'] & 0xffff,
CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
$hashtable[$u]['p'] );
@@ -438,8 +453,22 @@ class CdbWriter_PHP extends CdbWriter {
// Write the pointer array at the start of the file
rewind( $this->handle );
if ( ftell( $this->handle ) != 0 ) {
- throw new MWException( __METHOD__.': Error rewinding to start of file' );
+ $this->throwException( 'Error rewinding to start of file "'.$this->tmpFileName.'".' );
}
$this->write( $final );
}
+
+ /**
+ * Clean up the temp file and throw an exception
+ *
+ * @param $msg string
+ * @throws MWException
+ */
+ protected function throwException( $msg ) {
+ if ( $this->handle ) {
+ fclose( $this->handle );
+ unlink( $this->tmpFileName );
+ }
+ throw new MWException( $msg );
+ }
}
diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php
index c8e522df..63d37327 100644
--- a/includes/ChangeTags.php
+++ b/includes/ChangeTags.php
@@ -1,6 +1,23 @@
<?php
-
+/**
+ * Functions related to change tags.
+ *
+ * @file
+ */
class ChangeTags {
+
+ /**
+ * Creates HTML for the given tags
+ *
+ * @param $tags String: Comma-separated list of tags
+ * @param $page String: A label for the type of action which is being displayed,
+ * for example: 'history', 'contributions' or 'newpages'
+ *
+ * @return Array with two items: (html, classes)
+ * - html: String: HTML for displaying the tags (empty string when param $tags is empty)
+ * - classes: Array of strings: CSS classes used in the generated html, one class for each tag
+ *
+ */
static function formatSummaryRow( $tags, $page ) {
if( !$tags )
return array( '', array() );
@@ -18,18 +35,38 @@ class ChangeTags {
);
$classes[] = Sanitizer::escapeClass( "mw-tag-$tag" );
}
-
$markers = '(' . implode( ', ', $displayTags ) . ')';
$markers = Xml::tags( 'span', array( 'class' => 'mw-tag-markers' ), $markers );
+
return array( $markers, $classes );
}
+ /**
+ * Get a short description for a tag
+ *
+ * @param $tag String: tag
+ *
+ * @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 ) {
$msg = wfMessage( "tag-$tag" );
- return $msg->exists() ? $msg->parse() : htmlspecialchars( $tag );
+ return $msg->exists() ? $msg->parse() : htmlspecialchars( $tag );
}
- ## Basic utility method to add tags to a particular change, given its rc_id, rev_id and/or log_id.
+ /**
+ * Add tags to a change given its rc_id, rev_id and/or log_id
+ *
+ * @param $tags String|Array: Tags to add to the change
+ * @param $rc_id int: rc_id of the change to add the tags to
+ * @param $rev_id int: rev_id of the change to add the tags to
+ * @param $log_id int: log_id of the change to add the tags to
+ * @param $params String: params to put in the ct_params field of tabel 'change_tag'
+ *
+ * @return bool: false if no changes are made, otherwise true
+ *
+ * @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 ) {
if ( !is_array( $tags ) ) {
$tags = array( $tags );
@@ -103,6 +140,16 @@ class ChangeTags {
* Applies all tags-related changes to a query.
* Handles selecting tags, and filtering.
* Needs $tables to be set up properly, so we can figure out which join conditions to use.
+ *
+ * @param $tables String|Array: Tabel names, see DatabaseBase::select
+ * @param $fields String|Array: Fields used in query, see DatabaseBase::select
+ * @param $conds String|Array: conditions used in query, see DatabaseBase::select
+ * @param $join_conds Array: join conditions, see DatabaseBase::select
+ * @param $options Array: options, see Database::select
+ * @param $filter_tag String: tag to select on
+ *
+ * @exception MWException when unable to determine appropriate JOIN condition for tagging
+ *
*/
static function modifyDisplayQuery( &$tables, &$fields, &$conds,
&$join_conds, &$options, $filter_tag = false ) {
@@ -178,9 +225,13 @@ class ChangeTags {
}
/**
- *Basically lists defined tags which count even if they aren't applied to anything
+ * Basically lists defined tags which count even if they aren't applied to anything.
+ * Tags on items in table 'change_tag' which are not (or no longer) in table 'valid_tag'
+ * are not included.
+ *
+ * Tries memcached first.
*
- * @return array
+ * @return Array of strings: tags
*/
static function listDefinedTags() {
// Caching...
diff --git a/includes/ChangesFeed.php b/includes/ChangesFeed.php
index c4c4a8a1..bcedf2f3 100644
--- a/includes/ChangesFeed.php
+++ b/includes/ChangesFeed.php
@@ -34,6 +34,11 @@ class ChangesFeed {
return false;
}
+ if( !array_key_exists( $this->format, $wgFeedClasses ) ) {
+ // falling back to atom
+ $this->format = 'atom';
+ }
+
$feedTitle = "$wgSitename - {$title} [$wgLanguageCode]";
return new $wgFeedClasses[$this->format](
$feedTitle, htmlspecialchars( $description ), $url );
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
index 1858dc3a..fd97e0cb 100644
--- a/includes/ChangesList.php
+++ b/includes/ChangesList.php
@@ -67,6 +67,7 @@ class ChangesList extends ContextSource {
* @return ChangesList|EnhancedChangesList|OldChangesList derivative
*/
public static function newFromUser( $unused ) {
+ wfDeprecated( __METHOD__, '1.18' );
return self::newFromContext( RequestContext::getMain() );
}
@@ -193,10 +194,10 @@ class ChangesList extends ContextSource {
$fastCharDiff[$code] = $wgMiserMode || wfMsgNoTrans( 'rc-change-size' ) === '$1';
}
- $formatedSize = $wgLang->formatNum($szdiff);
+ $formattedSize = $wgLang->formatNum($szdiff);
if ( !$fastCharDiff[$code] ) {
- $formatedSize = wfMsgExt( 'rc-change-size', array( 'parsemag', 'escape' ), $formatedSize );
+ $formattedSize = wfMsgExt( 'rc-change-size', array( 'parsemag' ), $formattedSize );
}
if( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
@@ -204,13 +205,23 @@ class ChangesList extends ContextSource {
} else {
$tag = 'span';
}
- if( $szdiff === 0 ) {
- return "<$tag class='mw-plusminus-null'>($formatedSize)</$tag>";
- } elseif( $szdiff > 0 ) {
- return "<$tag class='mw-plusminus-pos'>(+$formatedSize)</$tag>";
- } else {
- return "<$tag class='mw-plusminus-neg'>($formatedSize)</$tag>";
+
+ if ( $szdiff === 0 ) {
+ $formattedSizeClass = 'mw-plusminus-null';
+ }
+ if ( $szdiff > 0 ) {
+ $formattedSize = '+' . $formattedSize;
+ $formattedSizeClass = 'mw-plusminus-pos';
}
+ if ( $szdiff < 0 ) {
+ $formattedSizeClass = 'mw-plusminus-neg';
+ }
+
+ $formattedTotalSize = wfMsgExt( 'rc-change-size-new', 'parsemag', $wgLang->formatNum( $new ) );
+
+ return Html::element( $tag,
+ array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
+ wfMessage( 'parentheses', $formattedSize )->plain() ) . $wgLang->getDirMark();
}
/**
@@ -225,38 +236,9 @@ class ChangesList extends ContextSource {
}
}
- /**
- * @param $s
- * @param $rc RecentChange
- * @return void
- */
- public function insertMove( &$s, $rc ) {
- # Diff
- $s .= '(' . $this->message['diff'] . ') (';
- # Hist
- $s .= Linker::linkKnown(
- $rc->getMovedToTitle(),
- $this->message['hist'],
- array(),
- array( 'action' => 'history' )
- ) . ') . . ';
- # "[[x]] moved to [[y]]"
- $msg = ( $rc->mAttribs['rc_type'] == RC_MOVE ) ? '1movedto2' : '1movedto2_redir';
- $s .= wfMsgHtml(
- $msg,
- Linker::linkKnown(
- $rc->getTitle(),
- null,
- array(),
- array( 'redirect' => 'no' )
- ),
- Linker::linkKnown( $rc->getMovedToTitle() )
- );
- }
-
public function insertDateHeader( &$s, $rc_timestamp ) {
# Make date header if necessary
- $date = $this->getLang()->date( $rc_timestamp, true, true );
+ $date = $this->getLanguage()->date( $rc_timestamp, true, true );
if( $date != $this->lastdate ) {
if( $this->lastdate != '' ) {
$s .= "</ul>\n";
@@ -268,21 +250,21 @@ class ChangesList extends ContextSource {
}
public function insertLog( &$s, $title, $logtype ) {
- $logname = LogPage::logName( $logtype );
- $s .= '(' . Linker::linkKnown( $title, htmlspecialchars( $logname ) ) . ')';
+ $page = new LogPage( $logtype );
+ $logname = $page->getName()->escaped();
+ $s .= '(' . Linker::linkKnown( $title, $logname ) . ')';
}
/**
* @param $s
* @param $rc RecentChange
* @param $unpatrolled
- * @return void
*/
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) ) {
+ } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
$diffLink = $this->message['diff'];
} else {
$query = array(
@@ -321,7 +303,6 @@ class ChangesList extends ContextSource {
* @param $rc RecentChange
* @param $unpatrolled
* @param $watched
- * @return void
*/
public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
# If it's a new article, there is no diff link, but if it hasn't been
@@ -332,28 +313,21 @@ class ChangesList extends ContextSource {
$params['rcid'] = $rc->mAttribs['rc_id'];
}
+ $articlelink = Linker::linkKnown(
+ $rc->getTitle(),
+ null,
+ array(),
+ $params
+ );
if( $this->isDeleted($rc,Revision::DELETED_TEXT) ) {
- $articlelink = Linker::linkKnown(
- $rc->getTitle(),
- null,
- array(),
- $params
- );
$articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
- } else {
- $articlelink = ' '. Linker::linkKnown(
- $rc->getTitle(),
- null,
- array(),
- $params
- );
}
# Bolden pages watched by this user
if( $watched ) {
$articlelink = "<strong class=\"mw-watched\">{$articlelink}</strong>";
}
# RTL/LTR marker
- $articlelink .= $this->getLang()->getDirMark();
+ $articlelink .= $this->getLanguage()->getDirMark();
wfRunHooks( 'ChangesListInsertArticleLink',
array(&$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched) );
@@ -364,51 +338,50 @@ class ChangesList extends ContextSource {
/**
* @param $s
* @param $rc RecentChange
- * @return void
*/
public function insertTimestamp( &$s, $rc ) {
$s .= $this->message['semicolon-separator'] .
- $this->getLang()->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
+ $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
}
- /** Insert links to user page, user talk page and eventually a blocking link
+ /**
+ * Insert links to user page, user talk page and eventually a blocking link
*
- * @param $rc RecentChange
+ * @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">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
} else {
- $s .= Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+ $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
+ /**
+ * Insert a formatted action
*
* @param $rc RecentChange
*/
- public function insertAction( &$s, &$rc ) {
- if( $rc->mAttribs['rc_type'] == RC_LOG ) {
- if( $this->isDeleted( $rc, LogPage::DELETED_ACTION ) ) {
- $s .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-event' ) . '</span>';
- } else {
- $s .= ' '.LogPage::actionText( $rc->mAttribs['rc_log_type'], $rc->mAttribs['rc_log_action'],
- $rc->getTitle(), $this->getSkin(), LogPage::extractParams( $rc->mAttribs['rc_params'] ), true, true );
- }
- }
+ public function insertLogEntry( $rc ) {
+ $formatter = LogFormatter::newFromRow( $rc->mAttribs );
+ $formatter->setShowUserToolLinks( true );
+ $mark = $this->getLanguage()->getDirMark();
+ return $formatter->getActionText() . " $mark" . $formatter->getComment();
}
- /** insert a formatted comment
- *
+ /**
+ * Insert a formatted comment
* @param $rc RecentChange
*/
- public function insertComment( &$s, &$rc ) {
+ 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 ) ) {
- $s .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
+ return ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
} else {
- $s .= Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
+ return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
}
}
}
@@ -430,7 +403,7 @@ class ChangesList extends ContextSource {
if( $count > 0 ) {
if( !isset( $cache[$count] ) ) {
$cache[$count] = wfMsgExt( 'number_of_watching_users_RCview',
- array('parsemag', 'escape' ), $this->getLang()->formatNum( $count ) );
+ array('parsemag', 'escape' ), $this->getLanguage()->formatNum( $count ) );
}
return $cache[$count];
} else {
@@ -453,16 +426,22 @@ class ChangesList extends ContextSource {
* 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 ) {
+ public static function userCan( $rc, $field, User $user = null ) {
if( $rc->mAttribs['rc_type'] == RC_LOG ) {
- return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field );
+ return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
} else {
- return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field );
+ 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>';
@@ -473,7 +452,7 @@ class ChangesList extends ContextSource {
/** Inserts a rollback link
*
- * @param $s
+ * @param $s string
* @param $rc RecentChange
*/
public function insertRollback( &$s, &$rc ) {
@@ -496,10 +475,9 @@ class ChangesList extends ContextSource {
}
/**
- * @param $s
+ * @param $s string
* @param $rc RecentChange
* @param $classes
- * @return
*/
public function insertTags( &$s, &$rc, &$classes ) {
if ( empty($rc->mAttribs['ts_tags']) )
@@ -513,6 +491,18 @@ class ChangesList extends ContextSource {
public function insertExtra( &$s, &$rc, &$classes ) {
## Empty, used for subclassers 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_new'] ) {
+ $unpatrolled = true;
+ }
+ }
+ return $unpatrolled;
+ }
}
@@ -528,8 +518,9 @@ class OldChangesList extends ChangesList {
public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
global $wgRCShowChangedSize;
wfProfileIn( __METHOD__ );
+
# Should patrol-related stuff be shown?
- $unpatrolled = $this->getUser()->useRCPatrol() && !$rc->mAttribs['rc_patrolled'];
+ $unpatrolled = $this->showAsUnpatrolled( $rc );
$dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
$this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
@@ -546,9 +537,8 @@ class OldChangesList extends ChangesList {
}
}
- // Moved pages
+ // Moved pages (very very old, not supported anymore)
if( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
- $this->insertMove( $s, $rc );
// Log entries
} elseif( $rc->mAttribs['rc_log_type'] ) {
$logtitle = Title::newFromText( 'Log/'.$rc->mAttribs['rc_log_type'], NS_SPECIAL );
@@ -583,14 +573,17 @@ class OldChangesList extends ChangesList {
$s .= "$cd . . ";
}
}
- # User tool links
- $this->insertUserRelatedLinks( $s, $rc );
- # LTR/RTL direction mark
- $s .= $this->getLang()->getDirMark();
- # Log action text (if any)
- $this->insertAction( $s, $rc );
- # Edit or log comment
- $this->insertComment( $s, $rc );
+
+ 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
@@ -601,7 +594,7 @@ class OldChangesList extends ChangesList {
# How many users watch this page
if( $rc->numberofWatchingusers > 0 ) {
$s .= ' ' . wfMsgExt( 'number_of_watching_users_RCview',
- array( 'parsemag', 'escape' ), $this->getLang()->formatNum( $rc->numberofWatchingusers ) );
+ array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $rc->numberofWatchingusers ) );
}
if( $this->watchlist ) {
@@ -620,6 +613,9 @@ class OldChangesList extends ChangesList {
* 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
@@ -650,7 +646,7 @@ class EnhancedChangesList extends ChangesList {
$curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
# If it's a new day, add the headline and flush the cache
- $date = $this->getLang()->date( $rc->mAttribs['rc_timestamp'], true );
+ $date = $this->getLanguage()->date( $rc->mAttribs['rc_timestamp'], true );
$ret = '';
if( $date != $this->lastdate ) {
# Process current cache
@@ -661,22 +657,14 @@ class EnhancedChangesList extends ChangesList {
}
# Should patrol-related stuff be shown?
- if( $this->getUser()->useRCPatrol() ) {
- $rc->unpatrolled = !$rc->mAttribs['rc_patrolled'];
- } else {
- $rc->unpatrolled = false;
- }
+ $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
$showdifflinks = true;
# Make article link
$type = $rc->mAttribs['rc_type'];
$logType = $rc->mAttribs['rc_log_type'];
- // Page moves
+ // Page moves, very old style, not supported anymore
if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
- $msg = ( $type == RC_MOVE ) ? "1movedto2" : "1movedto2_redir";
- $clink = wfMsg( $msg, Linker::linkKnown( $rc->getTitle(), null,
- array(), array( 'redirect' => 'no' ) ),
- Linker::linkKnown( $rc->getMovedToTitle() ) );
// New unpatrolled pages
} elseif( $rc->unpatrolled && $type == RC_NEW ) {
$clink = Linker::linkKnown( $rc->getTitle(), null, array(),
@@ -685,34 +673,28 @@ class EnhancedChangesList extends ChangesList {
} elseif( $type == RC_LOG ) {
if( $logType ) {
$logtitle = SpecialPage::getTitleFor( 'Log', $logType );
- $clink = '(' . Linker::linkKnown( $logtitle,
- LogPage::logName( $logType ) ) . ')';
+ $logpage = new LogPage( $logType );
+ $logname = $logpage->getName()->escaped();
+ $clink = '(' . Linker::linkKnown( $logtitle, $logname ) . ')';
} else {
$clink = Linker::link( $rc->getTitle() );
}
$watched = false;
// Log entries (old format) and special pages
} elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
- list( $specialName, $logtype ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
- if ( $specialName == 'Log' ) {
- # Log updates, etc
- $logname = LogPage::logName( $logtype );
- $clink = '(' . Linker::linkKnown( $rc->getTitle(), $logname ) . ')';
- } else {
- wfDebug( "Unexpected special page in recentchanges\n" );
- $clink = '';
- }
+ 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) ) {
+ if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
$showdifflinks = false;
}
- $time = $this->getLang()->time( $rc->mAttribs['rc_timestamp'], true, true );
+ $time = $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true );
$rc->watched = $watched;
$rc->link = $clink;
$rc->timestamp = $time;
@@ -738,13 +720,13 @@ class EnhancedChangesList extends ChangesList {
if ( $type != RC_NEW ) {
$curLink = $this->message['cur'];
} else {
- $curUrl = htmlspecialchars( $rc->getTitle()->getLinkUrl( $querycur ) );
+ $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 ) );
+ $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>";
}
@@ -806,9 +788,11 @@ class EnhancedChangesList extends ChangesList {
# Add the namespace and title of the block as part of the class
if ( $block[0]->mAttribs['rc_log_type'] ) {
# Log entry
- $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-' . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+ $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-'
+ . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
} else {
- $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
+ $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns'
+ . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
}
$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
Html::openElement( 'tr' );
@@ -861,9 +845,9 @@ class EnhancedChangesList extends ChangesList {
$users = array();
foreach( $userlinks as $userlink => $count) {
$text = $userlink;
- $text .= $this->getLang()->getDirMark();
+ $text .= $this->getLanguage()->getDirMark();
if( $count > 1 ) {
- $text .= ' (' . $this->getLang()->formatNum( $count ) . '×)';
+ $text .= ' (' . $this->getLanguage()->formatNum( $count ) . '×)';
}
array_push( $users, $text );
}
@@ -903,20 +887,20 @@ class EnhancedChangesList extends ChangesList {
$this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
}
- $r .= $this->getLang()->getDirMark();
+ $r .= $this->getLanguage()->getDirMark();
$queryParams['curid'] = $curId;
# Changes message
$n = count($block);
static $nchanges = array();
if ( !isset( $nchanges[$n] ) ) {
- $nchanges[$n] = wfMsgExt( 'nchanges', array( 'parsemag', 'escape' ), $this->getLang()->formatNum( $n ) );
+ $nchanges[$n] = wfMsgExt( 'nchanges', array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $n ) );
}
# Total change link
$r .= ' ';
if( !$allLogs ) {
$r .= '(';
- if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT ) ) {
+ if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
$r .= $nchanges[$n];
} elseif( $isnew ) {
$r .= $nchanges[$n];
@@ -1005,7 +989,7 @@ class EnhancedChangesList extends ChangesList {
if( $type == RC_LOG ) {
$link = $rcObj->timestamp;
# Revision link
- } elseif( !ChangesList::userCan($rcObj,Revision::DELETED_TEXT) ) {
+ } elseif( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
$link = '<span class="history-deleted">'.$rcObj->timestamp.'</span> ';
} else {
if ( $rcObj->unpatrolled && $type == RC_NEW) {
@@ -1037,13 +1021,15 @@ class EnhancedChangesList extends ChangesList {
$r .= $rcObj->getCharacterDifference() . ' . . ' ;
}
- # User links
- $r .= $rcObj->userlink;
- $r .= $rcObj->usertalklink;
- // log action
- $this->insertAction( $r, $rcObj );
- // log comment
- $this->insertComment( $r, $rcObj );
+ 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
@@ -1107,7 +1093,7 @@ class EnhancedChangesList extends ChangesList {
* Enhanced RC ungrouped line.
*
* @param $rcObj RecentChange
- * @return String: a HTML formated line (generated using $r)
+ * @return String: a HTML formatted line (generated using $r)
*/
protected function recentChangesBlockLine( $rcObj ) {
global $wgRCShowChangedSize;
@@ -1119,9 +1105,11 @@ class EnhancedChangesList extends ChangesList {
$logType = $rcObj->mAttribs['rc_log_type'];
if( $logType ) {
# Log entry
- $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType . '-' . $rcObj->mAttribs['rc_title'] );
+ $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-'
+ . $logType . '-' . $rcObj->mAttribs['rc_title'] );
} else {
- $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' . $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
+ $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' .
+ $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
}
$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
Html::openElement( 'tr' );
@@ -1163,19 +1151,15 @@ class EnhancedChangesList extends ChangesList {
if( $wgRCShowChangedSize && ($cd = $rcObj->getCharacterDifference()) ) {
$r .= "$cd . . ";
}
- # User/talk
- $r .= ' '.$rcObj->userlink . $rcObj->usertalklink;
- # Log action (if any)
- if( $logType ) {
- if( $this->isDeleted($rcObj,LogPage::DELETED_ACTION) ) {
- $r .= ' <span class="history-deleted">' . wfMsgHtml('rev-deleted-event') . '</span>';
- } else {
- $r .= ' ' . LogPage::actionText( $logType, $rcObj->mAttribs['rc_log_action'], $rcObj->getTitle(),
- $this->getSkin(), LogPage::extractParams( $rcObj->mAttribs['rc_params'] ), true, true );
- }
+
+ if ( $type == RC_LOG ) {
+ $r .= $this->insertLogEntry( $rcObj );
+ } else {
+ $r .= ' '.$rcObj->userlink . $rcObj->usertalklink;
+ $r .= $this->insertComment( $rcObj );
+ $r .= $this->insertRollback( $r, $rcObj );
}
- $this->insertComment( $r, $rcObj );
- $this->insertRollback( $r, $rcObj );
+
# Tags
$classes = explode( ' ', $classes );
$this->insertTags( $r, $rcObj, $classes );
@@ -1219,6 +1203,7 @@ class EnhancedChangesList extends ChangesList {
/**
* 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/Cookie.php b/includes/Cookie.php
index 95a4599f..76739ccc 100644
--- a/includes/Cookie.php
+++ b/includes/Cookie.php
@@ -139,6 +139,10 @@ class Cookie {
return $ret;
}
+ /**
+ * @param $domain
+ * @return bool
+ */
protected function canServeDomain( $domain ) {
if ( $domain == $this->domain
|| ( strlen( $domain ) > strlen( $this->domain )
@@ -151,20 +155,19 @@ class Cookie {
return false;
}
+ /**
+ * @param $path
+ * @return bool
+ */
protected function canServePath( $path ) {
- if ( $this->path && substr_compare( $this->path, $path, 0, strlen( $this->path ) ) == 0 ) {
- return true;
- }
-
- return false;
+ return ( $this->path && substr_compare( $this->path, $path, 0, strlen( $this->path ) ) == 0 );
}
+ /**
+ * @return bool
+ */
protected function isUnExpired() {
- if ( $this->isSessionKey || $this->expires > time() ) {
- return true;
- }
-
- return false;
+ return $this->isSessionKey || $this->expires > time();
}
}
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index 29d98d58..04450348 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -8,10 +8,10 @@
* To customize your installation, edit "LocalSettings.php". If you make
* changes here, they will be lost on next upgrade of MediaWiki!
*
- * Note that since all these string interpolations are expanded
- * before LocalSettings is included, if you localize something
- * like $wgScriptPath, you must also localize everything that
- * depends on it.
+ * In this file, variables whose default values depend on other
+ * variables are set to false. The actual default value of these variables
+ * will only be set in Setup.php, taking into account any custom settings
+ * performed in LocalSettings.php.
*
* Documentation is in the source and on:
* http://www.mediawiki.org/wiki/Manual:Configuration_settings
@@ -33,10 +33,10 @@ $wgConf = new SiteConfiguration;
/** @endcond */
/** MediaWiki version number */
-$wgVersion = '1.18.3';
+$wgVersion = '1.19.0';
/** Name of the site. It must be changed in LocalSettings.php */
-$wgSitename = 'MediaWiki';
+$wgSitename = 'MediaWiki';
/**
* URL of the server.
@@ -49,7 +49,7 @@ $wgSitename = 'MediaWiki';
* This is usually detected correctly by MediaWiki. If MediaWiki detects the
* wrong server, it will redirect incorrectly after you save a page. In that
* case, set this variable to fix it.
- *
+ *
* If you want to use protocol-relative URLs on your wiki, set this to a
* protocol-relative URL like '//example.com' and set $wgCanonicalServer
* to a fully qualified URL.
@@ -57,9 +57,9 @@ $wgSitename = 'MediaWiki';
$wgServer = WebRequest::detectServer();
/**
- * Canonical URL of the server, to use in IRC feeds and notification e-mails.
+ * Canonical URL of the server, to use in IRC feeds and notification e-mails.
* Must be fully qualified, even if $wgServer is protocol-relative.
- *
+ *
* Defaults to $wgServer, expanded to a fully qualified http:// URL if needed.
*/
$wgCanonicalServer = false;
@@ -78,7 +78,7 @@ $wgCanonicalServer = false;
* Other paths will be set to defaults based on it unless they are directly
* set in LocalSettings.php
*/
-$wgScriptPath = '/wiki';
+$wgScriptPath = '/wiki';
/**
* Whether to support URLs like index.php/Page_title These often break when PHP
@@ -113,24 +113,24 @@ $wgScriptExtension = '.php';
/**
* The URL path to index.php.
*
- * Defaults to "{$wgScriptPath}/index{$wgScriptExtension}".
+ * Will default to "{$wgScriptPath}/index{$wgScriptExtension}" in Setup.php
*/
-$wgScript = false;
+$wgScript = false;
/**
* The URL path to redirect.php. This is a script that is used by the Nostalgia
* skin.
*
- * Defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}".
+ * Will default to "{$wgScriptPath}/redirect{$wgScriptExtension}" in Setup.php
*/
-$wgRedirectScript = false; ///< defaults to
+$wgRedirectScript = false;
/**
* The URL path to load.php.
*
* Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
*/
-$wgLoadScript = false;
+$wgLoadScript = false;
/**@}*/
@@ -140,7 +140,6 @@ $wgLoadScript = false;
*
* These various web and file path variables are set to their defaults
* in Setup.php if they are not explicitly set from LocalSettings.php.
- * If you do override them, be sure to set them all!
*
* These will relatively rarely need to be set manually, unless you are
* splitting style sheets or images outside the main document root.
@@ -155,16 +154,16 @@ $wgLoadScript = false;
*/
/**
- * The URL path of the skins directory. Defaults to "{$wgScriptPath}/skins"
+ * The URL path of the skins directory. Will default to "{$wgScriptPath}/skins" in Setup.php
*/
-$wgStylePath = false;
+$wgStylePath = false;
$wgStyleSheetPath = &$wgStylePath;
/**
* The URL path of the skins directory. Should not point to an external domain.
* Defaults to "{$wgScriptPath}/skins".
*/
-$wgLocalStylePath = false;
+$wgLocalStylePath = false;
/**
* The URL path of the extensions directory.
@@ -174,7 +173,7 @@ $wgLocalStylePath = false;
$wgExtensionAssetsPath = false;
/**
- * Filesystem stylesheets directory. Defaults to "{$IP}/skins"
+ * Filesystem stylesheets directory. Will default to "{$IP}/skins" in Setup.php
*/
$wgStyleDirectory = false;
@@ -182,51 +181,56 @@ $wgStyleDirectory = false;
* The URL path for primary article page views. This path should contain $1,
* which is replaced by the article title.
*
- * Defaults to "{$wgScript}/$1" or "{$wgScript}?title=$1", depending on
- * $wgUsePathInfo.
+ * Will default to "{$wgScript}/$1" or "{$wgScript}?title=$1" in Setup.php,
+ * depending on $wgUsePathInfo.
*/
-$wgArticlePath = false;
+$wgArticlePath = false;
/**
- * The URL path for the images directory. Defaults to "{$wgScriptPath}/images"
+ * The URL path for the images directory. Will default to "{$wgScriptPath}/images" in Setup.php
*/
-$wgUploadPath = false;
+$wgUploadPath = false;
+
+/**
+ * The maximum age of temporary (incomplete) uploaded files
+ */
+$wgUploadStashMaxAge = 6 * 3600; // 6 hours
/**
* The filesystem path of the images directory. Defaults to "{$IP}/images".
*/
-$wgUploadDirectory = false;
+$wgUploadDirectory = false;
/**
* The URL path of the wiki logo. The logo size should be 135x135 pixels.
- * Defaults to "{$wgStylePath}/common/images/wiki.png".
+ * Will default to "{$wgStylePath}/common/images/wiki.png" in Setup.php
*/
-$wgLogo = false;
+$wgLogo = false;
/**
* The URL path of the shortcut icon.
*/
-$wgFavicon = '/favicon.ico';
+$wgFavicon = '/favicon.ico';
/**
* The URL path of the icon for iPhone and iPod Touch web app bookmarks.
* Defaults to no icon.
*/
-$wgAppleTouchIcon = false;
+$wgAppleTouchIcon = false;
/**
* The local filesystem path to a temporary directory. This is not required to
* be web accessible.
*
- * Defaults to "{$wgUploadDirectory}/tmp".
+ * Will default to "{$wgUploadDirectory}/tmp" in Setup.php
*/
-$wgTmpDirectory = false;
+$wgTmpDirectory = false;
/**
* If set, this URL is added to the start of $wgUploadPath to form a complete
* upload URL.
*/
-$wgUploadBaseUrl = "";
+$wgUploadBaseUrl = '';
/**
* To enable remote on-demand scaling, set this to the thumbnail base URL.
@@ -277,7 +281,7 @@ $wgDeletedDirectory = false; // Defaults to $wgUploadDirectory/deleted
/**
* Set this to true if you use img_auth and want the user to see details on why access failed.
*/
-$wgImgAuthDetails = false;
+$wgImgAuthDetails = false;
/**
* If this is enabled, img_auth.php will not allow image access unless the wiki
@@ -295,11 +299,19 @@ $wgImgAuthPublicTest = true;
*
* Properties required for all repos:
* - class The class name for the repository. May come from the core or an extension.
- * The core repository classes are LocalRepo, ForeignDBRepo, FSRepo.
+ * The core repository classes are FileRepo, LocalRepo, ForeignDBRepo.
+ * FSRepo is also supported for backwards compatibility.
*
- * - name A unique name for the repository (but $wgLocalFileRepo should be 'local').
+ * - name A unique name for the repository (but $wgLocalFileRepo should be 'local').
+ * The name should consist of alpha-numberic characters.
+ * - backend A file backend name (see $wgFileBackends).
*
* For most core repos:
+ * - zones Associative array of zone names that each map to an array with:
+ * container : backend container name the zone is in
+ * directory : root path within container for the zone
+ * Zones default to using <repo name>-<zone> as the
+ * container name and the container root as the zone directory.
* - url Base public URL
* - hashLevels The number of directory levels for hash-based division of files
* - thumbScriptUrl The URL for thumb.php (optional, not recommended)
@@ -349,6 +361,8 @@ $wgImgAuthPublicTest = true;
* If you set $wgForeignFileRepos to an array of repostory structures, those will
* be searched after the local file repo.
* Otherwise, you will only have access to local media files.
+ *
+ * @see Setup.php for an example usage and default initialization.
*/
$wgLocalFileRepo = false;
@@ -363,6 +377,27 @@ $wgForeignFileRepos = array();
$wgUseInstantCommons = false;
/**
+ * File backend structure configuration.
+ * This is an array of file backend configuration arrays.
+ * Each backend configuration has the following parameters:
+ * 'name' : A unique name for the backend
+ * 'class' : The file backend class to use
+ * 'wikiId' : A unique string that identifies the wiki (container prefix)
+ * 'lockManager' : The name of a lock manager (see $wgLockManagers)
+ * Additional parameters are specific to the class used.
+ */
+$wgFileBackends = array();
+
+/**
+ * Array of configuration arrays for each lock manager.
+ * Each backend configuration has the following parameters:
+ * 'name' : A unique name for the lock manger
+ * 'class' : The lock manger class to use
+ * Additional parameters are specific to the class used.
+ */
+$wgLockManagers = array();
+
+/**
* Show EXIF data, on by default if available.
* Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
*
@@ -426,10 +461,10 @@ $wgAllowAsyncCopyUploads = false;
* for non-specified types.
*
* For example:
- * $wgMaxUploadSize = array(
- * '*' => 250 * 1024,
- * 'url' => 500 * 1024,
- * );
+ * $wgMaxUploadSize = array(
+ * '*' => 250 * 1024,
+ * 'url' => 500 * 1024,
+ * );
* Sets the maximum for all uploads to 250 kB except for upload-by-url, which
* will have a maximum of 500 kB.
*
@@ -474,7 +509,7 @@ $wgSharedThumbnailScriptPath = false;
*
* Note that this variable may be ignored if $wgLocalFileRepo is set.
*/
-$wgHashedUploadDirectory = true;
+$wgHashedUploadDirectory = true;
/**
* Set the following to false especially if you have a set of files that need to
@@ -553,6 +588,13 @@ $wgCheckFileExtensions = true;
*/
$wgStrictFileExtensions = true;
+/**
+ * Setting this to true will disable the upload system's checks for HTML/JavaScript.
+ * THIS IS VERY DANGEROUS on a publicly editable site, so USE wgGroupPermissions
+ * TO RESTRICT UPLOADING to only those that you trust
+ */
+$wgDisableUploadScriptChecks = false;
+
/** Warn if uploaded files are larger than this (in bytes), or false to disable*/
$wgUploadSizeWarning = false;
@@ -586,6 +628,7 @@ $wgMediaHandlers = array(
'image/tiff' => 'TiffHandler',
'image/x-ms-bmp' => 'BmpHandler',
'image/x-bmp' => 'BmpHandler',
+ 'image/x-xcf' => 'XCFHandler',
'image/svg+xml' => 'SvgHandler', // official
'image/svg' => 'SvgHandler', // compat
'image/vnd.djvu' => 'DjVuHandler', // official
@@ -601,9 +644,11 @@ $wgMediaHandlers = array(
*
* Use Image Magick instead of PHP builtin functions.
*/
-$wgUseImageMagick = false;
+$wgUseImageMagick = false;
/** The convert command shipped with ImageMagick */
-$wgImageMagickConvertCommand = '/usr/bin/convert';
+$wgImageMagickConvertCommand = '/usr/bin/convert';
+/** The identify command shipped with ImageMagick */
+$wgImageMagickIdentifyCommand = '/usr/bin/identify';
/** Sharpening parameter to ImageMagick */
$wgSharpenParameter = '0x0.4';
@@ -674,9 +719,17 @@ $wgSVGMetadataCutoff = 262144;
$wgAllowTitlesInSVG = false;
/**
- * Don't thumbnail an image if it will use too much working memory.
- * Default is 50 MB if decompressed to RGBA form, which corresponds to
- * 12.5 million pixels or 3500x3500
+ * The maximum number of pixels a source image can have if it is to be scaled
+ * down by a scaler that requires the full source image to be decompressed
+ * and stored in decompressed form, before the thumbnail is generated.
+ *
+ * This provides a limit on memory usage for the decompression side of the
+ * image scaler. The limit is used when scaling PNGs with any of the
+ * built-in image scalers, such as ImageMagick or GD. It is ignored for
+ * JPEGs with ImageMagick, and when using the VipsScaler extension.
+ *
+ * The default is 50 MB if decompressed to RGBA form, which corresponds to
+ * 12.5 million pixels or 3500x3500.
*/
$wgMaxImageArea = 1.25e7;
/**
@@ -751,7 +804,7 @@ $wgEnableAutoRotation = null;
* $wgAntivirusSetup array. Set this to NULL to disable virus scanning. If not
* null, every file uploaded will be scanned for viruses.
*/
-$wgAntivirus= null;
+$wgAntivirus = null;
/**
* Configuration for different virus scanners. This an associative array of
@@ -864,11 +917,11 @@ $wgTrivialMimeDetection = false;
* array = ( 'rootElement' => 'associatedMimeType' )
*/
$wgXMLMimeTypes = array(
- 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
- 'svg' => 'image/svg+xml',
- 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
- 'http://www.w3.org/1999/xhtml:html' => 'text/html', // application/xhtml+xml?
- 'html' => 'text/html', // application/xhtml+xml?
+ 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
+ 'svg' => 'image/svg+xml',
+ 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
+ 'http://www.w3.org/1999/xhtml:html' => 'text/html', // application/xhtml+xml?
+ 'html' => 'text/html', // application/xhtml+xml?
);
/**
@@ -879,13 +932,14 @@ $wgXMLMimeTypes = array(
* change it if you alter the array (see bug 8858).
* This is the list of settings the user can choose from:
*/
-$wgImageLimits = array (
- array(320,240),
- array(640,480),
- array(800,600),
- array(1024,768),
- array(1280,1024),
- array(10000,10000) );
+$wgImageLimits = array(
+ array( 320, 240 ),
+ array( 640, 480 ),
+ array( 800, 600 ),
+ array( 1024, 768 ),
+ array( 1280, 1024 ),
+ array( 10000, 10000 )
+);
/**
* Adjust thumbnails on image pages according to a user setting. In order to
@@ -1037,7 +1091,7 @@ $wgPasswordReminderResendTime = 24;
/**
* The time, in seconds, when an emailed temporary password expires.
*/
-$wgNewPasswordExpiry = 3600 * 24 * 7;
+$wgNewPasswordExpiry = 3600 * 24 * 7;
/**
* The time, in seconds, when an email confirmation email expires
@@ -1057,7 +1111,7 @@ $wgUserEmailConfirmationTokenExpiry = 7 * 24 * 60 * 60;
* "password" => password
* </code>
*/
-$wgSMTP = false;
+$wgSMTP = false;
/**
* Additional email parameters, will be passed as the last argument to mail() call.
@@ -1069,7 +1123,7 @@ $wgAdditionalMailParams = null;
* True: from page editor if s/he opted-in. False: Enotif mails appear to come
* from $wgEmergencyContact
*/
-$wgEnotifFromEditor = 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
@@ -1081,30 +1135,30 @@ $wgEnotifFromEditor = false;
* highly recommended. It prevents MediaWiki from being used as an open spam
* relay.
*/
-$wgEmailAuthentication = true;
+$wgEmailAuthentication = true;
/**
* Allow users to enable email notification ("enotif") on watchlist changes.
*/
-$wgEnotifWatchlist = false;
+$wgEnotifWatchlist = false;
/**
* Allow users to enable email notification ("enotif") when someone edits their
* user talk page.
*/
-$wgEnotifUserTalk = false;
+$wgEnotifUserTalk = false;
/**
* Set the Reply-to address in notifications to the editor's address, if user
* allowed this in the preferences.
*/
-$wgEnotifRevealEditorAddress = false;
+$wgEnotifRevealEditorAddress = false;
/**
* Send notification mails on minor edits to watchlist pages. This is enabled
* by default. Does not affect user talk notifications.
*/
-$wgEnotifMinorEdits = true;
+$wgEnotifMinorEdits = true;
/**
* Send a generic mail instead of a personalised mail for each user. This
@@ -1134,7 +1188,7 @@ $wgEnotifUseRealName = false;
/**
* Array of usernames who will be sent a notification email for every change
- * which occurs on a wiki.
+ * which occurs on a wiki. Users will not be notified of their own changes.
*/
$wgUsersNotifiedOnAllChanges = array();
@@ -1146,17 +1200,17 @@ $wgUsersNotifiedOnAllChanges = array();
* @{
*/
/** Database host name or IP address */
-$wgDBserver = 'localhost';
+$wgDBserver = 'localhost';
/** Database port number (for PostgreSQL) */
-$wgDBport = 5432;
+$wgDBport = 5432;
/** Name of the database */
-$wgDBname = 'my_wiki';
+$wgDBname = 'my_wiki';
/** Database username */
-$wgDBuser = 'wikiuser';
+$wgDBuser = 'wikiuser';
/** Database user's password */
-$wgDBpassword = '';
+$wgDBpassword = '';
/** Database type */
-$wgDBtype = 'mysql';
+$wgDBtype = 'mysql';
/** Separate username for maintenance tasks. Leave as null to use the default. */
$wgDBadminuser = null;
@@ -1169,12 +1223,12 @@ $wgDBadminpassword = null;
* selected database type (eg SearchMySQL), or set to a class
* name to override to a custom search engine.
*/
-$wgSearchType = null;
+$wgSearchType = null;
/** Table name prefix */
-$wgDBprefix = '';
+$wgDBprefix = '';
/** MySQL table options to use during installation or update */
-$wgDBTableOptions = 'ENGINE=InnoDB';
+$wgDBTableOptions = 'ENGINE=InnoDB';
/**
* SQL Mode - default is turning off all modes, including strict, if set.
@@ -1185,10 +1239,10 @@ $wgDBTableOptions = 'ENGINE=InnoDB';
$wgSQLMode = '';
/** Mediawiki schema */
-$wgDBmwschema = 'mediawiki';
+$wgDBmwschema = 'mediawiki';
/** To override default SQLite data directory ($docroot/../data) */
-$wgSQLiteDataDir = '';
+$wgSQLiteDataDir = '';
/**
* Make all database connections secretly go to localhost. Fool the load balancer
@@ -1215,7 +1269,7 @@ $wgAllDBsAreLocalhost = false;
* $wgSharedPrefix is the table prefix for the shared database. It defaults to
* $wgDBprefix.
*/
-$wgSharedDB = null;
+$wgSharedDB = null;
/** @see $wgSharedDB */
$wgSharedPrefix = false;
@@ -1265,7 +1319,7 @@ $wgSharedTables = array( 'user', 'user_properties' );
* up, we at Wikimedia set read_only=1 in my.cnf on all our DB servers, even
* our masters, and then set read_only=0 on masters at runtime.
*/
-$wgDBservers = false;
+$wgDBservers = false;
/**
* Load balancer factory configuration
@@ -1277,13 +1331,13 @@ $wgDBservers = false;
* The LBFactory_Multi class is provided for this purpose, please see
* includes/db/LBFactory_Multi.php for configuration information.
*/
-$wgLBFactoryConf = array( 'class' => 'LBFactory_Simple' );
+$wgLBFactoryConf = array( 'class' => 'LBFactory_Simple' );
/** How long to wait for a slave to catch up to the master */
$wgMasterWaitTimeout = 10;
/** File to log database errors to */
-$wgDBerrorLog = false;
+$wgDBerrorLog = false;
/** When to give an error message */
$wgDBClusterTimeout = 10;
@@ -1295,10 +1349,7 @@ $wgDBClusterTimeout = 10;
$wgDBAvgStatusPoll = 2000;
/** Set to true if using InnoDB tables */
-$wgDBtransactions = false;
-/** Set to true for compatibility with extensions that might be checking.
- * MySQL 3.23.x is no longer supported. */
-$wgDBmysql4 = true;
+$wgDBtransactions = false;
/**
* Set to true to engage MySQL 4.1/5.0 charset-related features;
@@ -1316,7 +1367,7 @@ $wgDBmysql4 = true;
* characters (those not in the Basic Multilingual Plane) unless MySQL
* has enhanced their Unicode support.
*/
-$wgDBmysql5 = false;
+$wgDBmysql5 = false;
/**
* Other wikis on this site, can be administered from a single developer
@@ -1437,7 +1488,7 @@ $wgAntiLockFlags = 0;
/**
* Maximum article size in kilobytes
*/
-$wgMaxArticleSize = 2048;
+$wgMaxArticleSize = 2048;
/**
* The minimum amount of memory that MediaWiki "needs"; MediaWiki will try to
@@ -1473,7 +1524,7 @@ $wgCacheDirectory = false;
* - CACHE_NONE: Do not cache
* - CACHE_DB: Store cache objects in the DB
* - CACHE_MEMCACHED: MemCached, must specify servers in $wgMemCachedServers
- * - CACHE_ACCEL: eAccelerator, APC, XCache or WinCache
+ * - CACHE_ACCEL: APC, XCache or WinCache
* - CACHE_DBA: Use PHP's DBA extension to store in a DBM-style
* database. This is slow, and is not recommended for
* anything other than debugging.
@@ -1525,7 +1576,6 @@ $wgObjectCaches = array(
CACHE_ACCEL => array( 'factory' => 'ObjectCache::newAccelerator' ),
CACHE_MEMCACHED => array( 'factory' => 'ObjectCache::newMemcached' ),
- 'eaccelerator' => array( 'class' => 'eAccelBagOStuff' ),
'apc' => array( 'class' => 'APCBagOStuff' ),
'xcache' => array( 'class' => 'XCacheBagOStuff' ),
'wincache' => array( 'class' => 'WinCacheBagOStuff' ),
@@ -1560,7 +1610,7 @@ $wgSessionsInMemcached = false;
$wgSessionHandler = null;
/** If enabled, will send MemCached debugging information to $wgDebugLogFile */
-$wgMemCachedDebug = false;
+$wgMemCachedDebug = false;
/** The list of MemCached servers and port numbers */
$wgMemCachedServers = array( '127.0.0.1:11000' );
@@ -1625,7 +1675,7 @@ $wgLocalisationCacheConf = array(
);
/** Allow client-side caching of pages */
-$wgCachePages = true;
+$wgCachePages = true;
/**
* Set this to current time to invalidate all prior cached pages. Affects both
@@ -1647,12 +1697,14 @@ $wgStyleVersion = '303';
* This will cache static pages for non-logged-in users to reduce
* database traffic on public sites.
* Must set $wgShowIPinHeader = false
+ * ResourceLoader requests to default language and skins are cached
+ * as well as single module requests.
*/
$wgUseFileCache = false;
/**
* Directory where the cached page will be saved.
- * Defaults to "$wgCacheDirectory/html".
+ * Will default to "{$wgUploadDirectory}/cache" in Setup.php
*/
$wgFileCacheDirectory = false;
@@ -1861,20 +1913,24 @@ $wgExtraLanguageNames = array();
/**
* List of language codes that don't correspond to an actual language.
- * These codes are leftoffs from renames, or other legacy things.
- * Also, qqq is a dummy "language" for documenting messages.
+ * These codes are mostly leftoffs from renames, or other legacy things.
+ * This array makes them not appear as a selectable language on the installer,
+ * and excludes them when running the transstat.php script.
*/
$wgDummyLanguageCodes = array(
- 'als',
- 'bat-smg',
- 'be-x-old',
- 'fiu-vro',
- 'iu',
- 'nb',
- 'qqq',
- 'qqx',
- 'roa-rup',
- 'simple',
+ 'als' => 'gsw',
+ 'bat-smg' => 'sgs',
+ 'be-x-old' => 'be-tarask',
+ 'bh' => 'bho',
+ 'fiu-vro' => 'vro',
+ 'no' => 'nb',
+ 'qqq' => 'qqq', # Used for message documentation.
+ 'qqx' => 'qqx', # Used for viewing message keys.
+ 'roa-rup' => 'rup',
+ 'simple' => 'en',
+ 'zh-classical' => 'lzh',
+ 'zh-min-nan' => 'nan',
+ 'zh-yue' => 'yue',
);
/**
@@ -1884,7 +1940,7 @@ $wgDummyLanguageCodes = array(
* This historic feature is one of the first that was added by former MediaWiki
* team leader Brion Vibber, and is used to support the Esperanto x-system.
*/
-$wgEditEncoding = '';
+$wgEditEncoding = '';
/**
* Set this to true to replace Arabic presentation forms with their standard
@@ -1929,7 +1985,7 @@ $wgAllUnicodeFixes = false;
* user names, etc still must be converted en masse in the database before
* continuing as a UTF-8 wiki.
*/
-$wgLegacyEncoding = false;
+$wgLegacyEncoding = false;
/**
* Browser Blacklist for unicode non compliant browsers. Contains a list of
@@ -2014,7 +2070,7 @@ $wgUseDatabaseMessages = true;
/**
* Expiry time for the message cache key
*/
-$wgMsgCacheExpiry = 86400;
+$wgMsgCacheExpiry = 86400;
/**
* Maximum entry size in the message cache, in bytes
@@ -2120,6 +2176,17 @@ $wgLocaltimezone = null;
*/
$wgLocalTZoffset = null;
+/**
+ * If set to true, this will roll back a few bug fixes introduced in 1.19,
+ * emulating the 1.18 behaviour, to avoid introducing bug 34832. In 1.19,
+ * language variant conversion is disabled in interface messages. Setting this
+ * to true re-enables it.
+ *
+ * This variable should be removed (implicitly false) in 1.20 or earlier.
+ */
+$wgBug34832TransitionalRollback = true;
+
+
/** @} */ # End of language/charset settings
/*************************************************************************//**
@@ -2188,6 +2255,11 @@ $wgAllowRdfaAttributes = false;
$wgAllowMicrodataAttributes = false;
/**
+ * Cleanup as much presentational html like valign -> css vertical-align as we can
+ */
+$wgCleanupPresentationalAttributes = true;
+
+/**
* Should we try to make our HTML output well-formed XML? If set to false,
* output will be a few bytes shorter, and the HTML will arguably be more
* readable. If set to true, life will be much easier for the authors of
@@ -2221,8 +2293,9 @@ $wgXhtmlNamespaces = array();
/**
* Show IP address, for non-logged in users. It's necessary to switch this off
* for some forms of caching.
+ * Will disable file cache.
*/
-$wgShowIPinHeader = true;
+$wgShowIPinHeader = true;
/**
* Site notice shown at the top of each page
@@ -2320,13 +2393,6 @@ $wgUseSiteJs = true;
$wgUseSiteCss = true;
/**
- * Set to false to disable application of access keys and tooltips,
- * eg to avoid keyboard conflicts with system keys or as a low-level
- * optimization.
- */
-$wgEnableTooltipsAndAccesskeys = true;
-
-/**
* Break out of framesets. This can be used to prevent clickjacking attacks,
* or to prevent external sites from framing your site with ads.
*/
@@ -2403,7 +2469,7 @@ $wgFooterIcons = array(
"poweredby" => array(
"mediawiki" => array(
"src" => null, // Defaults to "$wgStylePath/common/images/poweredby_mediawiki_88x31.png"
- "url" => "http://www.mediawiki.org/",
+ "url" => "//www.mediawiki.org/",
"alt" => "Powered by MediaWiki",
)
),
@@ -2431,11 +2497,6 @@ $wgVectorUseSimpleSearch = false;
$wgVectorUseIconWatch = false;
/**
- * Show the name of the current variant as a label in the variants drop-down menu
- */
-$wgVectorShowVariantName = false;
-
-/**
* Display user edit counts in various prominent places.
*/
$wgEdititis = false;
@@ -2448,6 +2509,18 @@ $wgEdititis = false;
*/
$wgBetterDirectionality = true;
+/**
+ * Some web hosts attempt to rewrite all responses with a 404 (not found)
+ * status code, mangling or hiding MediaWiki's output. If you are using such a
+ * host, you should start looking for a better one. While you're doing that,
+ * set this to false to convert some of MediaWiki's 404 responses to 200 so
+ * that the generated error pages can be seen.
+ *
+ * In cases where for technical reasons it is more important for MediaWiki to
+ * send the correct status code than for the body to be transmitted intact,
+ * this configuration variable is ignored.
+ */
+$wgSend404Code = true;
/** @} */ # End of output format settings }
@@ -2471,7 +2544,20 @@ $wgBetterDirectionality = true;
*/
$wgResourceModules = array();
-/*
+/**
+ * Extensions should register foreign module sources here. 'local' is a
+ * built-in source that is not in this array, but defined by
+ * ResourceLoader::__construct() so that it cannot be unset.
+ *
+ * Example:
+ * $wgResourceLoaderSources['foo'] = array(
+ * 'loadScript' => 'http://example.org/w/load.php',
+ * 'apiScript' => 'http://example.org/w/api.php'
+ * );
+ */
+$wgResourceLoaderSources = array();
+
+/**
* Default 'remoteBasePath' value for resource loader modules.
* If not set, then $wgScriptPath will be used as a fallback.
*/
@@ -2526,6 +2612,19 @@ $wgResourceLoaderMinifierMaxLineLength = 1000;
$wgIncludeLegacyJavaScript = true;
/**
+ * Whether to preload the mediawiki.util module as blocking module in the top queue.
+ * Before MediaWiki 1.19, modules used to load slower/less asynchronous which allowed
+ * modules to lack dependencies on 'popular' modules that were likely loaded already.
+ * This setting is to aid scripts during migration by providing mediawiki.util
+ * unconditionally (which was the most commonly missed dependency).
+ * It doesn't cover all missing dependencies obviously but should fix most of them.
+ * This should be removed at some point after site/user scripts have been fixed.
+ * Enable this if your wiki has a large amount of user/site scripts that are lacking
+ * dependencies.
+ */
+$wgPreloadJavaScriptMwUtil = false;
+
+/**
* Whether or not to assing configuration variables to the global window object.
* If this is set to false, old code using deprecated variables like:
* " if ( window.wgRestrictionEdit ) ..."
@@ -2570,6 +2669,13 @@ $wgResourceLoaderValidateJS = true;
*/
$wgResourceLoaderValidateStaticJS = false;
+/**
+ * If set to true, asynchronous loading of bottom-queue scripts in the <head>
+ * will be enabled. This is an experimental feature that's supposed to make
+ * JavaScript load faster.
+ */
+$wgResourceLoaderExperimentalAsyncLoading = false;
+
/** @} */ # End of resource loader settings }
@@ -2582,7 +2688,7 @@ $wgResourceLoaderValidateStaticJS = false;
* Name of the project namespace. If left set to false, $wgSitename will be
* used instead.
*/
-$wgMetaNamespace = false;
+$wgMetaNamespace = false;
/**
* Name of the project talk namespace.
@@ -2607,12 +2713,12 @@ $wgMetaNamespaceTalk = false;
* Custom namespaces should start at 100 to avoid conflicting with standard
* namespaces, and should always follow the even/odd main/talk pattern.
*/
-#$wgExtraNamespaces =
-# array(100 => "Hilfe",
-# 101 => "Hilfe_Diskussion",
-# 102 => "Aide",
-# 103 => "Discussion_Aide"
-# );
+# $wgExtraNamespaces = array(
+# 100 => "Hilfe",
+# 101 => "Hilfe_Diskussion",
+# 102 => "Aide",
+# 103 => "Discussion_Aide"
+# );
$wgExtraNamespaces = array();
/**
@@ -2670,7 +2776,7 @@ $wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
/**
* The interwiki prefix of the current wiki, or false if it doesn't have one.
*/
-$wgLocalInterwiki = false;
+$wgLocalInterwiki = false;
/**
* Expiry time for cache of interwiki table
@@ -2922,7 +3028,7 @@ $wgTidyInternal = extension_loaded( 'tidy' );
$wgDebugTidy = false;
/** Allow raw, unchecked HTML in <html>...</html> sections.
- * THIS IS VERY DANGEROUS on a publically editable site, so USE wgGroupPermissions
+ * THIS IS VERY DANGEROUS on a publicly editable site, so USE wgGroupPermissions
* TO RESTRICT EDITING to only those that you trust
*/
$wgRawHtml = false;
@@ -2988,7 +3094,7 @@ $wgPreprocessorCacheThreshold = 1000;
$wgEnableScaryTranscluding = false;
/**
- * Expiry time for interwiki transclusion
+ * (see next option $wgGlobalDatabase).
*/
$wgTranscludeCacheExpiry = 3600;
@@ -3074,13 +3180,13 @@ $wgPasswordResetRoutes = array(
/**
* Maximum number of Unicode characters in signature
*/
-$wgMaxSigChars = 255;
+$wgMaxSigChars = 255;
/**
* Maximum number of bytes in username. You want to run the maintenance
* script ./maintenance/checkUsernames.php once you have changed this value.
*/
-$wgMaxNameChars = 255;
+$wgMaxNameChars = 255;
/**
* Array of usernames which may not be registered or logged in from
@@ -3091,6 +3197,7 @@ $wgReservedUsernames = array(
'Conversion script', // Used for the old Wikipedia software upgrade
'Maintenance script', // Maintenance scripts which perform editing, image import script
'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
+ '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
@@ -3260,7 +3367,7 @@ $wgAllowPrefChange = array();
* http://lists.wikimedia.org/pipermail/wikitech-l/2010-October/050065.html
* @since 1.17
*/
-$wgSecureLogin = false;
+$wgSecureLogin = false;
/** @} */ # end user accounts }
@@ -3272,15 +3379,15 @@ $wgSecureLogin = false;
/**
* Number of seconds before autoblock entries expire. Default 86400 = 1 day.
*/
-$wgAutoblockExpiry = 86400;
+$wgAutoblockExpiry = 86400;
/**
* Set this to true to allow blocked users to edit their own user talk page.
*/
-$wgBlockAllowsUTEdit = false;
+$wgBlockAllowsUTEdit = false;
/** Allow sysops to ban users from accessing Emailuser */
-$wgSysopEmailBans = true;
+$wgSysopEmailBans = true;
/**
* Limits on the possible sizes of range blocks.
@@ -3329,6 +3436,12 @@ $wgEmailConfirmToEdit = false;
/**
* Permission keys given to users in each group.
+ * This is an array where the keys are all groups and each value is an
+ * array of the format (right => boolean).
+ *
+ * The second format is used to support per-namespace permissions.
+ * Note that this feature does not fully work for all permission types.
+ *
* All users are implicitly in the '*' group including anonymous visitors;
* logged-in users are all implicitly in the 'user' group. These will be
* combined with the permissions of all groups that a given user is listed
@@ -3342,7 +3455,7 @@ $wgEmailConfirmToEdit = false;
* Functionality to make pages inaccessible has not been extensively tested
* for security. Use at your own risk!
*
- * This replaces wgWhitelistAccount and wgWhitelistEdit
+ * This replaces $wgWhitelistAccount and $wgWhitelistEdit
*/
$wgGroupPermissions = array();
@@ -3360,7 +3473,7 @@ $wgGroupPermissions['*']['writeapi'] = true;
$wgGroupPermissions['user']['move'] = true;
$wgGroupPermissions['user']['move-subpages'] = true;
$wgGroupPermissions['user']['move-rootuserpages'] = true; // can move root userpages
-//$wgGroupPermissions['user']['movefile'] = true; // Disabled for now due to possible bugs and security concerns
+$wgGroupPermissions['user']['movefile'] = true;
$wgGroupPermissions['user']['read'] = true;
$wgGroupPermissions['user']['edit'] = true;
$wgGroupPermissions['user']['createpage'] = true;
@@ -3424,7 +3537,6 @@ $wgGroupPermissions['sysop']['movefile'] = true;
$wgGroupPermissions['sysop']['unblockself'] = true;
$wgGroupPermissions['sysop']['suppressredirect'] = true;
#$wgGroupPermissions['sysop']['mergehistory'] = true;
-#$wgGroupPermissions['sysop']['trackback'] = true;
// Permission to change users' group assignments
$wgGroupPermissions['bureaucrat']['userrights'] = true;
@@ -3602,7 +3714,7 @@ $wgAutopromoteOnce = array(
'onView' => array()
);
-/*
+/**
* Put user rights log entries for autopromotion in recent changes?
* @since 1.18
*/
@@ -3669,6 +3781,7 @@ $wgSummarySpamRegex = array();
* - false : let it through
*
* @deprecated since 1.17 Use hooks. See SpamBlacklist extension.
+ * @var $wgFilterCallback bool|string|Closure
*/
$wgFilterCallback = false;
@@ -3685,7 +3798,20 @@ $wgEnableDnsBlacklist = false;
$wgEnableSorbs = false;
/**
- * List of DNS blacklists to use, if $wgEnableDnsBlacklist is true
+ * List of DNS blacklists to use, if $wgEnableDnsBlacklist is true. This is an
+ * array of either a URL or an array with the URL and a key (should the blacklist
+ * require a key). For example:
+ * @code
+ * $wgDnsBlacklistUrls = array(
+ * // String containing URL
+ * 'http.dnsbl.sorbs.net',
+ * // Array with URL and key, for services that require a key
+ * array( 'dnsbl.httpbl.net', 'mykey' ),
+ * // Array with just the URL. While this works, it is recommended that you
+ * // just use a string as shown above
+ * array( 'opm.tornevall.org' )
+ * );
+ * @endcode
* @since 1.16
*/
$wgDnsBlacklistUrls = array( 'http.dnsbl.sorbs.net.' );
@@ -3751,6 +3877,12 @@ $wgRateLimitsExcludedIPs = array();
$wgPutIPinRC = true;
/**
+ * Integer defining default number of entries to show on
+ * special pages which are query-pages such as Special:Whatlinkshere.
+ */
+$wgQueryPageDefaultLimit = 50;
+
+/**
* Limit password attempts to X attempts per Y seconds per IP per account.
* Requires memcached.
*/
@@ -3796,7 +3928,7 @@ $wgProxyKey = false;
/**
* Default cookie expiration time. Setting to 0 makes all cookies session-only.
*/
-$wgCookieExpiration = 30*86400;
+$wgCookieExpiration = 180*86400;
/**
* Set to set an explicit domain on the login cookies eg, "justthis.domain.org"
@@ -3888,26 +4020,26 @@ $wgUseTeX = false;
* The debug log file should be not be publicly accessible if it is used, as it
* may contain private data.
*/
-$wgDebugLogFile = '';
+$wgDebugLogFile = '';
/**
* Prefix for debug log lines
*/
-$wgDebugLogPrefix = '';
+$wgDebugLogPrefix = '';
/**
* If true, instead of redirecting, show a page with a link to the redirect
* destination. This allows for the inspection of PHP error messages, and easy
* resubmission of form data. For developer use only.
*/
-$wgDebugRedirects = false;
+$wgDebugRedirects = false;
/**
* If true, log debugging data from action=raw and load.php.
* This is normally false to avoid overlapping debug entries due to gen=css and
* gen=js requests.
*/
-$wgDebugRawPage = false;
+$wgDebugRawPage = false;
/**
* Send debug data to an HTML comment in the output.
@@ -3917,12 +4049,12 @@ $wgDebugRawPage = false;
* contains private data for the current user. But it's not ideal for development
* use since data is lost on fatal errors and redirects.
*/
-$wgDebugComments = false;
+$wgDebugComments = false;
/**
* Write SQL queries to the debug log
*/
-$wgDebugDumpSql = false;
+$wgDebugDumpSql = false;
/**
* Set to an array of log group keys to filenames.
@@ -3930,17 +4062,18 @@ $wgDebugDumpSql = false;
* of the regular $wgDebugLogFile. Useful for enabling selective logging
* in production.
*/
-$wgDebugLogGroups = array();
+$wgDebugLogGroups = array();
/**
* Display debug data at the bottom of the main content area.
*
* Useful for developers and technical users trying to working on a closed wiki.
*/
-$wgShowDebug = false;
+$wgShowDebug = false;
/**
* Prefix debug messages with relative timestamp. Very-poor man's profiler.
+ * Since 1.19 also includes memory usage.
*/
$wgDebugTimestamps = false;
@@ -3952,14 +4085,14 @@ $wgDebugPrintHttpHeaders = true;
/**
* Show the contents of $wgHooks in Special:Version
*/
-$wgSpecialVersionShowHooks = false;
+$wgSpecialVersionShowHooks = false;
/**
* Whether to show "we're sorry, but there has been a database error" pages.
* Displaying errors aids in debugging, but may display information useful
* to an attacker.
*/
-$wgShowSQLErrors = false;
+$wgShowSQLErrors = false;
/**
* If set to true, uncaught exceptions will print a complete stack trace
@@ -3985,6 +4118,13 @@ $wgShowHostnames = false;
*/
$wgDevelopmentWarnings = false;
+/**
+ * Release limitation to wfDeprecated warnings, if set to a release number
+ * development warnings will not be generated for deprecations added in releases
+ * after the limit.
+ */
+$wgDeprecationReleaseLimit = '1.17';
+
/** Only record profiling info for pages that took longer than this */
$wgProfileLimit = 0.0;
@@ -4025,7 +4165,7 @@ $wgUDPProfilerPort = '3811';
$wgDebugProfiling = false;
/** Output debug message on every wfProfileIn/wfProfileOut */
-$wgDebugFunctionEntry = 0;
+$wgDebugFunctionEntry = false;
/**
* Destination for wfIncrStats() data...
@@ -4049,14 +4189,6 @@ $wgAggregateStatsID = false;
$wgDisableCounters = false;
/**
- * Support blog-style "trackbacks" for articles. See
- * http://www.sixapart.com/pronet/docs/trackback_spec for details.
- *
- * If enabling this, you also need to grant the 'trackback' right to a group
- */
-$wgUseTrackbacks = false;
-
-/**
* Parser test suite files to be run by parserTests.php when no specific
* filename is passed to it.
*
@@ -4084,6 +4216,36 @@ $wgParserTestFiles = array(
* );
*/
$wgParserTestRemote = false;
+
+/**
+ * Allow running of javascript test suites via [[Special:JavaScriptTest]] (such as QUnit).
+ */
+$wgEnableJavaScriptTest = false;
+
+/**
+ * Configuration for javascript testing.
+ */
+$wgJavaScriptTestConfig = array(
+ 'qunit' => array(
+ 'documentation' => '//www.mediawiki.org/wiki/Manual:JavaScript_unit_testing',
+ ),
+);
+
+
+/**
+ * Overwrite the caching key prefix with custom value.
+ * @since 1.19
+ */
+$wgCachePrefix = false;
+
+/**
+ * Display the new debugging toolbar. This also enables profiling on database
+ * queries and other useful output.
+ * Will disable file cache.
+ *
+ * @since 1.19
+ */
+$wgDebugToolbar = false;
/** @} */ # end of profiling, testing and debugging }
@@ -4174,7 +4336,7 @@ $wgDisableSearchUpdate = false;
* </code>
*/
$wgNamespacesToBeSearchedDefault = array(
- NS_MAIN => true,
+ NS_MAIN => true,
);
/**
@@ -4184,8 +4346,8 @@ $wgNamespacesToBeSearchedDefault = array(
* Same format as $wgNamespacesToBeSearchedDefault
*/
$wgNamespacesToBeSearchedHelp = array(
- NS_PROJECT => true,
- NS_HELP => true,
+ NS_PROJECT => true,
+ NS_HELP => true,
);
/**
@@ -4228,6 +4390,27 @@ $wgUseTwoButtonsSearchForm = true;
*/
$wgSitemapNamespaces = false;
+/**
+ * Custom namespace priorities for sitemaps. Setting this will allow you to
+ * set custom priorities to namsepaces when sitemaps are generated using the
+ * maintenance/generateSitemap.php script.
+ *
+ * This should be a map of namespace IDs to priority
+ * Example:
+ * $wgSitemapNamespacesPriorities = array(
+ * NS_USER => '0.9',
+ * NS_HELP => '0.0',
+ * );
+ */
+$wgSitemapNamespacesPriorities = false;
+
+/**
+ * If true, searches for IP addresses will be redirected to that IP's
+ * contributions page. E.g. searching for "1.2.3.4" will redirect to
+ * [[Special:Contributions/1.2.3.4]]
+ */
+$wgEnableSearchContributorsByIP = true;
+
/** @} */ # end of search settings
/************************************************************************//**
@@ -4252,7 +4435,7 @@ $wgDiff = '/usr/bin/diff';
* can specify namespaces of pages they have special treatment for
*/
$wgPreviewOnOpenNamespaces = array(
- NS_CATEGORY => true
+ NS_CATEGORY => true
);
/**
@@ -4313,16 +4496,16 @@ $wgMaintenanceScripts = array();
* still be possible. To prevent database writes completely, use the read_only
* option in MySQL.
*/
-$wgReadOnly = null;
+$wgReadOnly = null;
/**
* If this lock file exists (size > 0), the wiki will be forced into read-only mode.
* Its contents will be shown to users as part of the read-only warning
* message.
*
- * Defaults to "{$wgUploadDirectory}/lock_yBgMBwiR".
+ * Will default to "{$wgUploadDirectory}/lock_yBgMBwiR" in Setup.php
*/
-$wgReadOnlyFile = false;
+$wgReadOnlyFile = false;
/**
* When you run the web-based upgrade utility, it will tell you what to set
@@ -4363,7 +4546,7 @@ $wgRCFilterByAge = false;
* Special:Recentchangeslinked pages.
*/
$wgRCLinkLimits = array( 50, 100, 250, 500 );
-$wgRCLinkDays = array( 1, 3, 7, 14, 30 );
+$wgRCLinkDays = array( 1, 3, 7, 14, 30 );
/**
* Send recent changes updates via UDP. The updates will be formatted for IRC.
@@ -4454,23 +4637,23 @@ $wgFeedClasses = array(
$wgAdvertisedFeedTypes = array( 'atom' );
/** Show watching users in recent changes, watchlist and page history views */
-$wgRCShowWatchingUsers = false; # UPO
+$wgRCShowWatchingUsers = false; # UPO
/** Show watching users in Page views */
-$wgPageShowWatchingUsers = false;
+$wgPageShowWatchingUsers = false;
/** Show the amount of changed characters in recent changes */
-$wgRCShowChangedSize = true;
+$wgRCShowChangedSize = true;
/**
* If the difference between the character counts of the text
* before and after the edit is below that value, the value will be
* highlighted on the RC page.
*/
-$wgRCChangedSizeThreshold = 500;
+$wgRCChangedSizeThreshold = 500;
/**
* Show "Updated (since my last visit)" marker in RC view, watchlist and history
* view for watched pages with new changes */
-$wgShowUpdatedMarker = true;
+$wgShowUpdatedMarker = true;
/**
* Disable links to talk pages of anonymous users (IPs) in listings on special
@@ -4593,7 +4776,7 @@ $wgExportMaxHistory = 0;
/**
* Return distinct author list (when not returning full history)
*/
-$wgExportAllowListContributors = false ;
+$wgExportAllowListContributors = false;
/**
* If non-zero, Special:Export accepts a "pagelink-depth" parameter
@@ -4613,6 +4796,11 @@ $wgExportMaxLinkDepth = 0;
*/
$wgExportFromNamespaces = false;
+/**
+* Whether to allow exporting the entire wiki into a single file
+*/
+$wgExportAllowAll = false;
+
/** @} */ # end of import/export }
/*************************************************************************//**
@@ -4643,12 +4831,6 @@ $wgExtensionFunctions = array();
$wgExtensionMessagesFiles = array();
/**
- * Aliases for special pages provided by extensions.
- * @deprecated since 1.16 Use $specialPageAliases in a file referred to by $wgExtensionMessagesFiles
- */
-$wgExtensionAliasesFiles = 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.
@@ -4691,13 +4873,13 @@ $wgAutoloadClasses = array();
*
* <code>
* $wgExtensionCredits[$type][] = array(
- * 'name' => 'Example extension',
- * 'version' => 1.9,
- * 'path' => __FILE__,
- * 'author' => 'Foo Barstein',
- * 'url' => 'http://wwww.example.com/Example%20Extension/',
- * 'description' => 'An example extension',
- * 'descriptionmsg' => 'exampleextension-desc',
+ * 'name' => 'Example extension',
+ * 'version' => 1.9,
+ * 'path' => __FILE__,
+ * 'author' => 'Foo Barstein',
+ * 'url' => 'http://wwww.example.com/Example%20Extension/',
+ * 'description' => 'An example extension',
+ * 'descriptionmsg' => 'exampleextension-desc',
* );
* </code>
*
@@ -4709,7 +4891,7 @@ $wgExtensionCredits = array();
/**
* Authentication plugin.
- * @var AuthPlugin
+ * @var $wgAuth AuthPlugin
*/
$wgAuth = null;
@@ -4740,6 +4922,7 @@ $wgJobClasses = array(
);
/**
+
* Jobs that must be explicitly requested, i.e. aren't run by job runners unless special flags are set.
*
* These can be:
@@ -4755,7 +4938,7 @@ $wgJobTypesExcludedFromDefaultQueue = array();
* Expensive Querypages are already updated.
*/
$wgSpecialPageCacheUpdates = array(
- 'Statistics' => array('SiteStatsUpdate','cacheUpdate')
+ 'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' )
);
/**
@@ -4767,7 +4950,6 @@ $wgSpecialPageCacheUpdates = array(
*/
$wgExceptionHooks = array();
-
/**
* Page property link table invalidation lists. When a page property
* changes, this may require other link tables to be updated (eg
@@ -4789,7 +4971,7 @@ $wgPagePropLinkInvalidations = array(
/**
* Use experimental, DMOZ-like category browser
*/
-$wgUseCategoryBrowser = false;
+$wgUseCategoryBrowser = false;
/**
* On category pages, show thumbnail gallery for images belonging to that
@@ -4842,7 +5024,8 @@ $wgCategoryCollation = 'uppercase';
* an action, which is a specific kind of event that can exist in that
* log type.
*/
-$wgLogTypes = array( '',
+$wgLogTypes = array(
+ '',
'block',
'protect',
'rights',
@@ -4895,6 +5078,9 @@ $wgFilterLogTypes = array(
* will be listed in the user interface.
*
* Extensions with custom log types may add to this array.
+ *
+ * Since 1.19, if you follow the naming convention log-name-TYPE,
+ * where TYPE is your log type, yoy don't need to use this array.
*/
$wgLogNames = array(
'' => 'all-logs-page',
@@ -4915,6 +5101,9 @@ $wgLogNames = array(
* top of each log type.
*
* Extensions with custom log types may add to this array.
+ *
+ * Since 1.19, if you follow the naming convention log-description-TYPE,
+ * where TYPE is your log type, yoy don't need to use this array.
*/
$wgLogHeaders = array(
'' => 'alllogstext',
@@ -4946,33 +5135,32 @@ $wgLogActions = array(
'protect/move_prot' => 'movedarticleprotection',
'rights/rights' => 'rightslogentry',
'rights/autopromote' => 'rightslogentry-autopromote',
- 'delete/delete' => 'deletedarticle',
- 'delete/restore' => 'undeletedarticle',
- 'delete/revision' => 'revdelete-logentry',
- 'delete/event' => 'logdelete-logentry',
'upload/upload' => 'uploadedimage',
'upload/overwrite' => 'overwroteimage',
'upload/revert' => 'uploadedimage',
- 'move/move' => '1movedto2',
- 'move/move_redir' => '1movedto2_redir',
'import/upload' => 'import-logentry-upload',
'import/interwiki' => 'import-logentry-interwiki',
'merge/merge' => 'pagemerge-logentry',
- 'suppress/revision' => 'revdelete-logentry',
- 'suppress/file' => 'revdelete-logentry',
- 'suppress/event' => 'logdelete-logentry',
- 'suppress/delete' => 'suppressedarticle',
'suppress/block' => 'blocklogentry',
'suppress/reblock' => 'reblock-logentry',
- 'patrol/patrol' => 'patrol-log-line',
);
/**
* The same as above, but here values are names of functions,
* not messages.
* @see LogPage::actionText
- */
-$wgLogActionsHandlers = array();
+ * @see LogFormatter
+ */
+$wgLogActionsHandlers = array(
+ // move, move_redir
+ 'move/*' => 'MoveLogFormatter',
+ // delete, restore, revision, event
+ 'delete/*' => 'DeleteLogFormatter',
+ 'suppress/revision' => 'DeleteLogFormatter',
+ 'suppress/event' => 'DeleteLogFormatter',
+ 'suppress/delete' => 'DeleteLogFormatter',
+ 'patrol/patrol' => 'PatrolLogFormatter',
+);
/**
* Maintain a log of newusers at Log/newusers?
@@ -5056,6 +5244,7 @@ $wgSpecialPageGroups = array(
'Block' => 'users',
'Unblock' => 'users',
'Preferences' => 'users',
+ 'ChangeEmail' => 'users',
'ChangePassword' => 'users',
'DeletedContributions' => 'users',
'PasswordReset' => 'users',
@@ -5100,6 +5289,7 @@ $wgSpecialPageGroups = array(
'Specialpages' => 'other',
'Blockme' => 'other',
'Booksources' => 'other',
+ 'JavaScriptTest' => 'other',
);
/** Whether or not to sort special pages in Special:Specialpages */
@@ -5136,16 +5326,24 @@ $wgMaxRedirectLinksRetrieved = 500;
* Unsetting core actions will probably cause things to complain loudly.
*/
$wgActions = array(
- 'credits' => true,
- 'deletetrackback' => true,
- 'info' => true,
- 'markpatrolled' => true,
- 'purge' => true,
- 'revert' => true,
+ 'credits' => true,
+ 'delete' => true,
+ 'edit' => true,
+ 'history' => true,
+ 'info' => true,
+ 'markpatrolled' => true,
+ 'protect' => true,
+ 'purge' => true,
+ 'raw' => true,
+ 'render' => true,
+ 'revert' => true,
'revisiondelete' => true,
- 'rollback' => true,
- 'unwatch' => true,
- 'watch' => true,
+ 'rollback' => true,
+ 'submit' => true,
+ 'unprotect' => true,
+ 'unwatch' => true,
+ 'view' => true,
+ 'watch' => true,
);
/**
diff --git a/includes/DeferredUpdates.php b/includes/DeferredUpdates.php
new file mode 100644
index 00000000..262994e3
--- /dev/null
+++ b/includes/DeferredUpdates.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Interface that deferrable updates should implement. Basically required so we
+ * can validate input on DeferredUpdates::addUpdate()
+ *
+ * @since 1.19
+ */
+interface DeferrableUpdate {
+ /**
+ * Perform the actual work
+ */
+ function doUpdate();
+}
+
+/**
+ * Class for mananging the deferred updates.
+ *
+ * @since 1.19
+ */
+class DeferredUpdates {
+ /**
+ * Store of updates to be deferred until the end of the request.
+ */
+ private static $updates = array();
+
+ /**
+ * Add an update to the deferred list
+ * @param $update DeferrableUpdate Some object that implements doUpdate()
+ */
+ public static function addUpdate( DeferrableUpdate $update ) {
+ array_push( self::$updates, $update );
+ }
+
+ /**
+ * HTMLCacheUpdates are the most common deferred update people use. This
+ * is a shortcut method for that.
+ * @see HTMLCacheUpdate::__construct()
+ * @param $title
+ * @param $table
+ */
+ public static function addHTMLCacheUpdate( $title, $table ) {
+ self::addUpdate( new HTMLCacheUpdate( $title, $table ) );
+ }
+
+ /**
+ * Do any deferred updates and clear the list
+ *
+ * @param $commit String: set to 'commit' to commit after every update to
+ * prevent lock contention
+ */
+ public static function doUpdates( $commit = '' ) {
+ global $wgDeferredUpdateList;
+
+ wfProfileIn( __METHOD__ );
+
+ $updates = array_merge( $wgDeferredUpdateList, self::$updates );
+
+ // No need to get master connections in case of empty updates array
+ if ( !count( $updates ) ) {
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $doCommit = $commit == 'commit';
+ if ( $doCommit ) {
+ $dbw = wfGetDB( DB_MASTER );
+ }
+
+ foreach ( $updates as $update ) {
+ $update->doUpdate();
+
+ if ( $doCommit && $dbw->trxLevel() ) {
+ $dbw->commit( __METHOD__ );
+ }
+ }
+
+ self::clearPendingUpdates();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Clear all pending updates without performing them. Generally, you don't
+ * want or need to call this. Unit tests need it though.
+ */
+ public static function clearPendingUpdates() {
+ global $wgDeferredUpdateList;
+ $wgDeferredUpdateList = self::$updates = array();
+ }
+}
diff --git a/includes/Defines.php b/includes/Defines.php
index ff7d7980..26deb2ba 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -2,7 +2,7 @@
/**
* A few constants that might be needed during LocalSettings.php.
*
- * Note: these constants must all be resolvable at compile time by HipHop,
+ * Note: these constants must all be resolvable at compile time by HipHop,
* since this file will not be executed during request startup for a compiled
* MediaWiki.
*
@@ -92,7 +92,7 @@ define( 'CACHE_ANYTHING', -1 ); // Use anything, as long as it works
define( 'CACHE_NONE', 0 ); // Do not cache
define( 'CACHE_DB', 1 ); // Store cache objects in the DB
define( 'CACHE_MEMCACHED', 2 ); // MemCached, must specify servers in $wgMemCacheServers
-define( 'CACHE_ACCEL', 3 ); // eAccelerator
+define( 'CACHE_ACCEL', 3 ); // APC, XCache or WinCache
define( 'CACHE_DBA', 4 ); // Use PHP's DBA extension to store in a DBM-style database
/**@}*/
@@ -149,13 +149,12 @@ define( 'MW_DATE_ISO', 'ISO 8601' );
/**@{
* RecentChange type identifiers
- * This may be obsolete; log items are now used for moves?
*/
define( 'RC_EDIT', 0);
define( 'RC_NEW', 1);
-define( 'RC_MOVE', 2);
+define( 'RC_MOVE', 2); // obsolete
define( 'RC_LOG', 3);
-define( 'RC_MOVE_OVER_REDIRECT', 4);
+define( 'RC_MOVE_OVER_REDIRECT', 4); // obsolete
/**@}*/
/**@{
diff --git a/includes/EditPage.php b/includes/EditPage.php
index e6e7111d..d00d9114 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -15,31 +15,133 @@
* redirects go to, etc. $this->mTitle (as well as $mArticle) is the
* page in the database that is actually being edited. These are
* usually the same, but they are now allowed to be different.
+ *
+ * Surgeon General's Warning: prolonged exposure to this class is known to cause
+ * headaches, which may be fatal.
*/
class EditPage {
+
+ /**
+ * Status: Article successfully updated
+ */
const AS_SUCCESS_UPDATE = 200;
+
+ /**
+ * Status: Article successfully created
+ */
const AS_SUCCESS_NEW_ARTICLE = 201;
+
+ /**
+ * Status: Article update aborted by a hook function
+ */
const AS_HOOK_ERROR = 210;
+
+ /**
+ * Status: The filter function set in $wgFilterCallback returned true (= block it)
+ */
const AS_FILTERING = 211;
+
+ /**
+ * Status: A hook function returned an error
+ */
const AS_HOOK_ERROR_EXPECTED = 212;
+
+ /**
+ * Status: User is blocked from editting this page
+ */
const AS_BLOCKED_PAGE_FOR_USER = 215;
+
+ /**
+ * Status: Content too big (> $wgMaxArticleSize)
+ */
const AS_CONTENT_TOO_BIG = 216;
+
+ /**
+ * Status: User cannot edit? (not used)
+ */
const AS_USER_CANNOT_EDIT = 217;
+
+ /**
+ * Status: this anonymous user is not allowed to edit this page
+ */
const AS_READ_ONLY_PAGE_ANON = 218;
+
+ /**
+ * Status: this logged in user is not allowed to edit this page
+ */
const AS_READ_ONLY_PAGE_LOGGED = 219;
+
+ /**
+ * Status: wiki is in readonly mode (wfReadOnly() == true)
+ */
const AS_READ_ONLY_PAGE = 220;
+
+ /**
+ * Status: rate limiter for action 'edit' was tripped
+ */
const AS_RATE_LIMITED = 221;
+
+ /**
+ * Status: article was deleted while editting and param wpRecreate == false or form
+ * was not posted
+ */
const AS_ARTICLE_WAS_DELETED = 222;
+
+ /**
+ * Status: user tried to create this page, but is not allowed to do that
+ * ( Title->usercan('create') == false )
+ */
const AS_NO_CREATE_PERMISSION = 223;
+
+ /**
+ * Status: user tried to create a blank page
+ */
const AS_BLANK_ARTICLE = 224;
+
+ /**
+ * Status: (non-resolvable) edit conflict
+ */
const AS_CONFLICT_DETECTED = 225;
+
+ /**
+ * Status: no edit summary given and the user has forceeditsummary set and the user is not
+ * editting in his own userspace or talkspace and wpIgnoreBlankSummary == false
+ */
const AS_SUMMARY_NEEDED = 226;
+
+ /**
+ * Status: user tried to create a new section without content
+ */
const AS_TEXTBOX_EMPTY = 228;
+
+ /**
+ * Status: article is too big (> $wgMaxArticleSize), after merging in the new section
+ */
const AS_MAX_ARTICLE_SIZE_EXCEEDED = 229;
+
+ /**
+ * not used
+ */
const AS_OK = 230;
+
+ /**
+ * Status: WikiPage::doEdit() was unsuccessfull
+ */
const AS_END = 231;
+
+ /**
+ * Status: summary contained spam according to one of the regexes in $wgSummarySpamRegex
+ */
const AS_SPAM_ERROR = 232;
+
+ /**
+ * Status: anonymous user is not allowed to upload (User::isAllowed('upload') == false)
+ */
const AS_IMAGE_REDIRECT_ANON = 233;
+
+ /**
+ * Status: logged in user is not allowed to upload (User::isAllowed('upload') == false)
+ */
const AS_IMAGE_REDIRECT_LOGGED = 234;
/**
@@ -52,7 +154,7 @@ class EditPage {
*/
var $mTitle;
private $mContextTitle = null;
- var $action;
+ var $action = 'submit';
var $isConflict = false;
var $isCssJsSubpage = false;
var $isCssSubpage = false;
@@ -88,20 +190,20 @@ class EditPage {
var $save = false, $preview = false, $diff = false;
var $minoredit = false, $watchthis = false, $recreate = false;
var $textbox1 = '', $textbox2 = '', $summary = '', $nosummary = false;
- var $edittime = '', $section = '', $starttime = '';
+ var $edittime = '', $section = '', $sectiontitle = '', $starttime = '';
var $oldid = 0, $editintro = '', $scrolltop = null, $bot = true;
# Placeholders for text injection by hooks (must be HTML)
# extensions should take care to _append_ to the present value
- public $editFormPageTop; // Before even the preview
- public $editFormTextTop;
- public $editFormTextBeforeContent;
- public $editFormTextAfterWarn;
- public $editFormTextAfterTools;
- public $editFormTextBottom;
- public $editFormTextAfterContent;
- public $previewTextAfterContent;
- public $mPreloadText;
+ public $editFormPageTop = ''; // Before even the preview
+ public $editFormTextTop = '';
+ public $editFormTextBeforeContent = '';
+ public $editFormTextAfterWarn = '';
+ public $editFormTextAfterTools = '';
+ public $editFormTextBottom = '';
+ public $editFormTextAfterContent = '';
+ public $previewTextAfterContent = '';
+ public $mPreloadText = '';
/* $didSave should be set to true whenever an article was succesfully altered. */
public $didSave = false;
@@ -110,34 +212,29 @@ class EditPage {
public $suppressIntro = false;
/**
- * @todo document
* @param $article Article
*/
- function __construct( $article ) {
- $this->mArticle =& $article;
+ public function __construct( Article $article ) {
+ $this->mArticle = $article;
$this->mTitle = $article->getTitle();
- $this->action = 'submit';
-
- # Placeholders for text injection by hooks (empty per default)
- $this->editFormPageTop =
- $this->editFormTextTop =
- $this->editFormTextBeforeContent =
- $this->editFormTextAfterWarn =
- $this->editFormTextAfterTools =
- $this->editFormTextBottom =
- $this->editFormTextAfterContent =
- $this->previewTextAfterContent =
- $this->mPreloadText = "";
}
/**
* @return Article
*/
- function getArticle() {
+ public function getArticle() {
return $this->mArticle;
}
/**
+ * @since 1.19
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->mTitle;
+ }
+
+ /**
* Set the context Title object
*
* @param $title Title object or null
@@ -162,193 +259,6 @@ class EditPage {
}
}
- /**
- * Fetch initial editing page content.
- *
- * @param $def_text string
- * @returns mixed string on success, $def_text for invalid sections
- * @private
- */
- function getContent( $def_text = '' ) {
- global $wgOut, $wgRequest, $wgParser;
-
- wfProfileIn( __METHOD__ );
- # Get variables from query string :P
- $section = $wgRequest->getVal( 'section' );
-
- $preload = $wgRequest->getVal( 'preload',
- // Custom preload text for new sections
- $section === 'new' ? 'MediaWiki:addsection-preload' : '' );
- $undoafter = $wgRequest->getVal( 'undoafter' );
- $undo = $wgRequest->getVal( 'undo' );
-
- // For message page not locally set, use the i18n message.
- // For other non-existent articles, use preload text if any.
- if ( !$this->mTitle->exists() ) {
- if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- # If this is a system message, get the default text.
- $text = $this->mTitle->getDefaultMessageText();
- if( $text === false ) {
- $text = $this->getPreloadedText( $preload );
- }
- } else {
- # If requested, preload some text.
- $text = $this->getPreloadedText( $preload );
- }
- // For existing pages, get text based on "undo" or section parameters.
- } else {
- $text = $this->mArticle->getContent();
- if ( $undo > 0 && $undoafter > 0 && $undo < $undoafter ) {
- # If they got undoafter and undo round the wrong way, switch them
- list( $undo, $undoafter ) = array( $undoafter, $undo );
- }
- if ( $undo > 0 && $undo > $undoafter ) {
- # Undoing a specific edit overrides section editing; section-editing
- # doesn't work with undoing.
- if ( $undoafter ) {
- $undorev = Revision::newFromId( $undo );
- $oldrev = Revision::newFromId( $undoafter );
- } else {
- $undorev = Revision::newFromId( $undo );
- $oldrev = $undorev ? $undorev->getPrevious() : null;
- }
-
- # Sanity check, make sure it's the right page,
- # the revisions exist and they were not deleted.
- # Otherwise, $text will be left as-is.
- if ( !is_null( $undorev ) && !is_null( $oldrev ) &&
- $undorev->getPage() == $oldrev->getPage() &&
- $undorev->getPage() == $this->mArticle->getID() &&
- !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
- !$oldrev->isDeleted( Revision::DELETED_TEXT ) ) {
-
- $undotext = $this->mArticle->getUndoText( $undorev, $oldrev );
- if ( $undotext === false ) {
- # Warn the user that something went wrong
- $this->editFormPageTop .= $wgOut->parse( '<div class="error mw-undo-failure">' . wfMsgNoTrans( 'undo-failure' ) . '</div>' );
- } else {
- $text = $undotext;
- # Inform the user of our success and set an automatic edit summary
- $this->editFormPageTop .= $wgOut->parse( '<div class="mw-undo-success">' . wfMsgNoTrans( 'undo-success' ) . '</div>' );
- $firstrev = $oldrev->getNext();
- # If we just undid one rev, use an autosummary
- if ( $firstrev->mId == $undo ) {
- $this->summary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
- $this->undidRev = $undo;
- }
- $this->formtype = 'diff';
- }
- } else {
- // Failed basic sanity checks.
- // Older revisions may have been removed since the link
- // was created, or we may simply have got bogus input.
- $this->editFormPageTop .= $wgOut->parse( '<div class="error mw-undo-norev">' . wfMsgNoTrans( 'undo-norev' ) . '</div>' );
- }
- } elseif ( $section != '' ) {
- if ( $section == 'new' ) {
- $text = $this->getPreloadedText( $preload );
- } else {
- // Get section edit text (returns $def_text for invalid sections)
- $text = $wgParser->getSection( $text, $section, $def_text );
- }
- }
- }
-
- wfProfileOut( __METHOD__ );
- return $text;
- }
-
- /**
- * Use this method before edit() to preload some text into the edit box
- *
- * @param $text string
- */
- public function setPreloadedText( $text ) {
- $this->mPreloadText = $text;
- }
-
- /**
- * Get the contents to be preloaded into the box, either set by
- * an earlier setPreloadText() or by loading the given page.
- *
- * @param $preload String: representing the title to preload from.
- * @return String
- */
- protected function getPreloadedText( $preload ) {
- global $wgUser, $wgParser;
- if ( !empty( $this->mPreloadText ) ) {
- return $this->mPreloadText;
- } elseif ( $preload !== '' ) {
- $title = Title::newFromText( $preload );
- # Check for existence to avoid getting MediaWiki:Noarticletext
- if ( isset( $title ) && $title->exists() && $title->userCanRead() ) {
- $article = new Article( $title );
-
- if ( $article->isRedirect() ) {
- $title = Title::newFromRedirectRecurse( $article->getContent() );
- # Redirects to missing titles are displayed, to hidden pages are followed
- # Copying observed behaviour from ?action=view
- if ( $title->exists() ) {
- if ($title->userCanRead() ) {
- $article = new Article( $title );
- } else {
- return "";
- }
- }
- }
- $parserOptions = ParserOptions::newFromUser( $wgUser );
- return $wgParser->getPreloadText( $article->getContent(), $title, $parserOptions );
- }
- }
- return '';
- }
-
- /**
- * Check if a page was deleted while the user was editing it, before submit.
- * Note that we rely on the logging table, which hasn't been always there,
- * but that doesn't matter, because this only applies to brand new
- * deletes.
- */
- protected function wasDeletedSinceLastEdit() {
- if ( $this->deletedSinceEdit !== null ) {
- return $this->deletedSinceEdit;
- }
-
- $this->deletedSinceEdit = false;
-
- if ( $this->mTitle->isDeletedQuick() ) {
- $this->lastDelete = $this->getLastDelete();
- if ( $this->lastDelete ) {
- $deleteTime = wfTimestamp( TS_MW, $this->lastDelete->log_timestamp );
- if ( $deleteTime > $this->starttime ) {
- $this->deletedSinceEdit = true;
- }
- }
- }
-
- return $this->deletedSinceEdit;
- }
-
- /**
- * Checks whether the user entered a skin name in uppercase,
- * e.g. "User:Example/Monobook.css" instead of "monobook.css"
- *
- * @return bool
- */
- protected function isWrongCaseCssJsPage() {
- if( $this->mTitle->isCssJsSubpage() ) {
- $name = $this->mTitle->getSkinFromCssJsSubpage();
- $skins = array_merge(
- array_keys( Skin::getSkinNames() ),
- array( 'common' )
- );
- return !in_array( $name, $skins )
- && in_array( strtolower( $name ), $skins );
- } else {
- return false;
- }
- }
-
function submit() {
$this->edit();
}
@@ -374,8 +284,12 @@ class EditPage {
wfProfileIn( __METHOD__ );
wfDebug( __METHOD__.": enter\n" );
- // This is not an article
- $wgOut->setArticleFlag( false );
+ // If they used redlink=1 and the page exists, redirect to the main article
+ if ( $wgRequest->getBool( 'redlink' ) && $this->mTitle->exists() ) {
+ $wgOut->redirect( $this->mTitle->getFullURL() );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
$this->importFormData( $wgRequest );
$this->firsttime = false;
@@ -392,45 +306,31 @@ class EditPage {
$this->preview = true;
}
- $wgOut->addModules( array( 'mediawiki.action.edit' ) );
-
- if ( $wgUser->getOption( 'uselivepreview', false ) ) {
- $wgOut->addModules( 'mediawiki.legacy.preview' );
+ if ( $this->save ) {
+ $this->formtype = 'save';
+ } elseif ( $this->preview ) {
+ $this->formtype = 'preview';
+ } elseif ( $this->diff ) {
+ $this->formtype = 'diff';
+ } else { # First time through
+ $this->firsttime = true;
+ if ( $this->previewOnOpen() ) {
+ $this->formtype = 'preview';
+ } else {
+ $this->formtype = 'initial';
+ }
}
- // Bug #19334: textarea jumps when editing articles in IE8
- $wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
$permErrors = $this->getEditPermissionErrors();
if ( $permErrors ) {
+ wfDebug( __METHOD__ . ": User can't edit\n" );
// Auto-block user's IP if the account was "hard" blocked
$wgUser->spreadAnyEditBlock();
- wfDebug( __METHOD__ . ": User can't edit\n" );
- $content = $this->getContent( null );
- $content = $content === '' ? null : $content;
- $this->readOnlyPage( $content, true, $permErrors, 'edit' );
+ $this->displayPermissionsError( $permErrors );
+
wfProfileOut( __METHOD__ );
return;
- } else {
- if ( $this->save ) {
- $this->formtype = 'save';
- } elseif ( $this->preview ) {
- $this->formtype = 'preview';
- } elseif ( $this->diff ) {
- $this->formtype = 'diff';
- } else { # First time through
- $this->firsttime = true;
- if ( $this->previewOnOpen() ) {
- $this->formtype = 'preview';
- } else {
- $this->formtype = 'initial';
- }
- }
- }
-
- // If they used redlink=1 and the page exists, redirect to the main article
- if ( $wgRequest->getBool( 'redlink' ) && $this->mTitle->exists() ) {
- $wgOut->redirect( $this->mTitle->getFullURL() );
}
wfProfileIn( __METHOD__."-business-end" );
@@ -444,29 +344,8 @@ class EditPage {
$this->isNew = !$this->mTitle->exists() || $this->section == 'new';
# Show applicable editing introductions
- if ( $this->formtype == 'initial' || $this->firsttime )
+ if ( $this->formtype == 'initial' || $this->firsttime ) {
$this->showIntro();
-
- if ( $this->mTitle->isTalkPage() ) {
- $wgOut->addWikiMsg( 'talkpagetext' );
- }
-
- # Optional notices on a per-namespace and per-page basis
- $editnotice_ns = 'editnotice-'.$this->mTitle->getNamespace();
- $editnotice_ns_message = wfMessage( $editnotice_ns )->inContentLanguage();
- if ( $editnotice_ns_message->exists() ) {
- $wgOut->addWikiText( $editnotice_ns_message->plain() );
- }
- if ( MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) {
- $parts = explode( '/', $this->mTitle->getDBkey() );
- $editnotice_base = $editnotice_ns;
- while ( count( $parts ) > 0 ) {
- $editnotice_base .= '-'.array_shift( $parts );
- $editnotice_base_msg = wfMessage( $editnotice_base )->inContentLanguage();
- if ( $editnotice_base_msg->exists() ) {
- $wgOut->addWikiText( $editnotice_base_msg->plain() );
- }
- }
}
# Attempt submission here. This will check for edit conflicts,
@@ -527,11 +406,70 @@ class EditPage {
}
/**
+ * Display a permissions error page, like OutputPage::showPermissionsErrorPage(),
+ * but with the following differences:
+ * - If redlink=1, the user will be redirected to the page
+ * - If there is content to display or the error occurs while either saving,
+ * previewing or showing the difference, it will be a
+ * "View source for ..." page displaying the source code after the error message.
+ *
+ * @since 1.19
+ * @param $permErrors Array of permissions errors, as returned by
+ * Title::getUserPermissionsErrors().
+ */
+ protected function displayPermissionsError( array $permErrors ) {
+ global $wgRequest, $wgOut;
+
+ if ( $wgRequest->getBool( 'redlink' ) ) {
+ // 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() );
+ return;
+ }
+
+ $content = $this->getContent();
+
+ # Use the normal message if there's nothing to display
+ if ( $this->firsttime && $content === '' ) {
+ $action = $this->mTitle->exists() ? 'edit' :
+ ( $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage' );
+ throw new PermissionsError( $action, $permErrors );
+ }
+
+ $wgOut->setPageTitle( wfMessage( 'viewsource-title', $this->getContextTitle()->getPrefixedText() ) );
+ $wgOut->addBacklinkSubtitle( $this->getContextTitle() );
+ $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) );
+ $wgOut->addHTML( "<hr />\n" );
+
+ # If the user made changes, preserve them when showing the markup
+ # (This happens when a user is blocked during edit, for instance)
+ if ( !$this->firsttime ) {
+ $content = $this->textbox1;
+ $wgOut->addWikiMsg( 'viewyourtext' );
+ } else {
+ $wgOut->addWikiMsg( 'viewsourcetext' );
+ }
+
+ $this->showTextbox( $content, 'wpTextbox1', array( 'readonly' ) );
+
+ $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
+ Linker::formatTemplates( $this->getTemplates() ) ) );
+
+ if ( $this->mTitle->exists() ) {
+ $wgOut->returnToMain( null, $this->mTitle );
+ }
+ }
+
+ /**
* Show a read-only error
* Parameters are the same as OutputPage:readOnlyPage()
* Redirect to the article page if redlink=1
+ * @deprecated in 1.19; use displayPermissionsError() instead
*/
function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
+ wfDeprecated( __METHOD__, '1.19' );
+
global $wgRequest, $wgOut;
if ( $wgRequest->getBool( 'redlink' ) ) {
// The edit page was reached via a red link.
@@ -574,30 +512,37 @@ class EditPage {
}
/**
- * Does this EditPage class support section editing?
- * This is used by EditPage subclasses to indicate their ui cannot handle section edits
+ * Checks whether the user entered a skin name in uppercase,
+ * e.g. "User:Example/Monobook.css" instead of "monobook.css"
*
* @return bool
*/
- protected function isSectionEditSupported() {
- return true;
+ protected function isWrongCaseCssJsPage() {
+ if( $this->mTitle->isCssJsSubpage() ) {
+ $name = $this->mTitle->getSkinFromCssJsSubpage();
+ $skins = array_merge(
+ array_keys( Skin::getSkinNames() ),
+ array( 'common' )
+ );
+ return !in_array( $name, $skins )
+ && in_array( strtolower( $name ), $skins );
+ } else {
+ return false;
+ }
}
/**
- * Returns the URL to use in the form's action attribute.
- * This is used by EditPage subclasses when simply customizing the action
- * variable in the constructor is not enough. This can be used when the
- * EditPage lives inside of a Special page rather than a custom page action.
+ * Does this EditPage class support section editing?
+ * This is used by EditPage subclasses to indicate their ui cannot handle section edits
*
- * @param $title Title object for which is being edited (where we go to for &action= links)
- * @return string
+ * @return bool
*/
- protected function getActionURL( Title $title ) {
- return $title->getLocalURL( array( 'action' => $this->action ) );
+ protected function isSectionEditSupported() {
+ return true;
}
/**
- * @todo document
+ * This function collects the form data and uses it to populate various member variables.
* @param $request WebRequest
*/
function importFormData( &$request ) {
@@ -627,15 +572,25 @@ class EditPage {
# Truncate for whole multibyte characters. +5 bytes for ellipsis
$this->summary = $wgLang->truncate( $request->getText( 'wpSummary' ), 250 );
- # Remove extra headings from summaries and new sections.
- $this->summary = preg_replace('/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->summary);
+ # If the summary consists of a heading, e.g. '==Foobar==', extract the title from the
+ # header syntax, e.g. 'Foobar'. This is mainly an issue when we are using wpSummary for
+ # section titles.
+ $this->summary = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->summary );
+
+ # Treat sectiontitle the same way as summary.
+ # Note that wpSectionTitle is not yet a part of the actual edit form, as wpSummary is
+ # currently doing double duty as both edit summary and section title. Right now this
+ # is just to allow API edits to work around this limitation, but this should be
+ # incorporated into the actual edit form when EditPage is rewritten (Bugs 18654, 26312).
+ $this->sectiontitle = $wgLang->truncate( $request->getText( 'wpSectionTitle' ), 250 );
+ $this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle );
$this->edittime = $request->getVal( 'wpEdittime' );
$this->starttime = $request->getVal( 'wpStarttime' );
$this->scrolltop = $request->getIntOrNull( 'wpScrolltop' );
- if ($this->textbox1 === '' && $request->getVal( 'wpTextbox1' ) === null) {
+ if ( $this->textbox1 === '' && $request->getVal( 'wpTextbox1' ) === null ) {
// wpTextbox1 field is missing, possibly due to being "too big"
// according to some filter rules such as Suhosin's setting for
// suhosin.request.max_value_length (d'oh)
@@ -702,19 +657,24 @@ class EditPage {
} else {
# Not a posted form? Start with nothing.
wfDebug( __METHOD__ . ": Not a posted form.\n" );
- $this->textbox1 = '';
- $this->summary = '';
- $this->edittime = '';
- $this->starttime = wfTimestampNow();
- $this->edit = false;
- $this->preview = false;
- $this->save = false;
- $this->diff = false;
- $this->minoredit = false;
- $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overriden by request parameters
- $this->recreate = false;
-
+ $this->textbox1 = '';
+ $this->summary = '';
+ $this->sectiontitle = '';
+ $this->edittime = '';
+ $this->starttime = wfTimestampNow();
+ $this->edit = false;
+ $this->preview = false;
+ $this->save = false;
+ $this->diff = false;
+ $this->minoredit = false;
+ $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overriden by request parameters
+ $this->recreate = false;
+
+ // When creating a new section, we can preload a section title by passing it as the
+ // preloadtitle parameter in the URL (Bug 13100)
if ( $this->section == 'new' && $request->getVal( 'preloadtitle' ) ) {
+ $this->sectiontitle = $request->getVal( 'preloadtitle' );
+ // Once wpSummary isn't being use for setting section titles, we should delete this.
$this->summary = $request->getVal( 'preloadtitle' );
}
elseif ( $this->section != 'new' && $request->getVal( 'summary' ) ) {
@@ -729,7 +689,6 @@ class EditPage {
$this->bot = $request->getBool( 'bot', true );
$this->nosummary = $request->getBool( 'nosummary' );
- // @todo FIXME: Unused variable?
$this->oldid = $request->getInt( 'oldid' );
$this->live = $request->getCheck( 'live' );
@@ -756,101 +715,324 @@ class EditPage {
}
/**
- * Make sure the form isn't faking a user's credentials.
+ * Initialise form fields in the object
+ * Called on the first invocation, e.g. when a user clicks an edit link
+ * @return bool -- if the requested section is valid
+ */
+ function initialiseForm() {
+ global $wgUser;
+ $this->edittime = $this->mArticle->getTimestamp();
+ $this->textbox1 = $this->getContent( false );
+ // activate checkboxes if user wants them to be always active
+ # Sort out the "watch" checkbox
+ if ( $wgUser->getOption( 'watchdefault' ) ) {
+ # Watch all edits
+ $this->watchthis = true;
+ } elseif ( $wgUser->getOption( 'watchcreations' ) && !$this->mTitle->exists() ) {
+ # Watch creations
+ $this->watchthis = true;
+ } elseif ( $this->mTitle->userIsWatching() ) {
+ # Already watched
+ $this->watchthis = true;
+ }
+ if ( $wgUser->getOption( 'minordefault' ) && !$this->isNew ) {
+ $this->minoredit = true;
+ }
+ if ( $this->textbox1 === false ) {
+ return false;
+ }
+ wfProxyCheck();
+ return true;
+ }
+
+ /**
+ * Fetch initial editing page content.
*
- * @param $request WebRequest
- * @return bool
+ * @param $def_text string
+ * @return mixed string on success, $def_text for invalid sections
* @private
*/
- function tokenOk( &$request ) {
- global $wgUser;
- $token = $request->getVal( 'wpEditToken' );
- $this->mTokenOk = $wgUser->matchEditToken( $token );
- $this->mTokenOkExceptSuffix = $wgUser->matchEditTokenNoSuffix( $token );
- return $this->mTokenOk;
+ function getContent( $def_text = '' ) {
+ global $wgOut, $wgRequest, $wgParser;
+
+ wfProfileIn( __METHOD__ );
+
+ $text = false;
+
+ // For message page not locally set, use the i18n message.
+ // For other non-existent articles, use preload text if any.
+ if ( !$this->mTitle->exists() || $this->section == 'new' ) {
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && $this->section != 'new' ) {
+ # If this is a system message, get the default text.
+ $text = $this->mTitle->getDefaultMessageText();
+ }
+ if ( $text === false ) {
+ # If requested, preload some text.
+ $preload = $wgRequest->getVal( 'preload',
+ // Custom preload text for new sections
+ $this->section === 'new' ? 'MediaWiki:addsection-preload' : '' );
+ $text = $this->getPreloadedText( $preload );
+ }
+ // For existing pages, get text based on "undo" or section parameters.
+ } else {
+ if ( $this->section != '' ) {
+ // Get section edit text (returns $def_text for invalid sections)
+ $text = $wgParser->getSection( $this->getOriginalContent(), $this->section, $def_text );
+ } else {
+ $undoafter = $wgRequest->getInt( 'undoafter' );
+ $undo = $wgRequest->getInt( 'undo' );
+
+ if ( $undo > 0 && $undoafter > 0 ) {
+ if ( $undo < $undoafter ) {
+ # If they got undoafter and undo round the wrong way, switch them
+ list( $undo, $undoafter ) = array( $undoafter, $undo );
+ }
+
+ $undorev = Revision::newFromId( $undo );
+ $oldrev = Revision::newFromId( $undoafter );
+
+ # Sanity check, make sure it's the right page,
+ # the revisions exist and they were not deleted.
+ # Otherwise, $text will be left as-is.
+ if ( !is_null( $undorev ) && !is_null( $oldrev ) &&
+ $undorev->getPage() == $oldrev->getPage() &&
+ $undorev->getPage() == $this->mTitle->getArticleId() &&
+ !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
+ !$oldrev->isDeleted( Revision::DELETED_TEXT ) ) {
+
+ $text = $this->mArticle->getUndoText( $undorev, $oldrev );
+ if ( $text === false ) {
+ # Warn the user that something went wrong
+ $undoMsg = 'failure';
+ } else {
+ # Inform the user of our success and set an automatic edit summary
+ $undoMsg = 'success';
+
+ # If we just undid one rev, use an autosummary
+ $firstrev = $oldrev->getNext();
+ if ( $firstrev->getId() == $undo ) {
+ $undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
+ if ( $this->summary === '' ) {
+ $this->summary = $undoSummary;
+ } else {
+ $this->summary = $undoSummary . wfMsgForContent( 'colon-separator' ) . $this->summary;
+ }
+ $this->undidRev = $undo;
+ }
+ $this->formtype = 'diff';
+ }
+ } else {
+ // Failed basic sanity checks.
+ // Older revisions may have been removed since the link
+ // was created, or we may simply have got bogus input.
+ $undoMsg = 'norev';
+ }
+
+ $class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
+ $this->editFormPageTop .= $wgOut->parse( "<div class=\"{$class}\">" .
+ wfMsgNoTrans( 'undo-' . $undoMsg ) . '</div>', true, /* interface */true );
+ }
+
+ if ( $text === false ) {
+ $text = $this->getOriginalContent();
+ }
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $text;
}
/**
- * Show all applicable editing introductions
+ * Get the content of the wanted revision, without section extraction.
+ *
+ * The result of this function can be used to compare user's input with
+ * section replaced in its context (using WikiPage::replaceSection())
+ * to the original text of the edit.
+ *
+ * This difers from Article::getContent() that when a missing revision is
+ * encountered the result will be an empty string and not the
+ * 'missing-article' message.
+ *
+ * @since 1.19
+ * @return string
*/
- protected function showIntro() {
- global $wgOut, $wgUser;
- if ( $this->suppressIntro ) {
- return;
+ private function getOriginalContent() {
+ if ( $this->section == 'new' ) {
+ return $this->getCurrentText();
+ }
+ $revision = $this->mArticle->getRevisionFetched();
+ if ( $revision === null ) {
+ return '';
}
+ return $this->mArticle->getContent();
+ }
- $namespace = $this->mTitle->getNamespace();
+ /**
+ * Get the actual text of the page. This is basically similar to
+ * WikiPage::getRawText() except that when the page doesn't exist an empty
+ * string is returned instead of false.
+ *
+ * @since 1.19
+ * @return string
+ */
+ private function getCurrentText() {
+ $text = $this->mArticle->getRawText();
+ if ( $text === false ) {
+ return '';
+ } else {
+ return $text;
+ }
+ }
- if ( $namespace == NS_MEDIAWIKI ) {
- # Show a warning if editing an interface message
- $wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
+ /**
+ * Use this method before edit() to preload some text into the edit box
+ *
+ * @param $text string
+ */
+ public function setPreloadedText( $text ) {
+ $this->mPreloadText = $text;
+ }
+
+ /**
+ * Get the contents to be preloaded into the box, either set by
+ * an earlier setPreloadText() or by loading the given page.
+ *
+ * @param $preload String: representing the title to preload from.
+ * @return String
+ */
+ protected function getPreloadedText( $preload ) {
+ global $wgUser, $wgParser;
+
+ if ( !empty( $this->mPreloadText ) ) {
+ return $this->mPreloadText;
+ }
+
+ if ( $preload === '' ) {
+ return '';
}
- # Show a warning message when someone creates/edits a user (talk) page but the user does not exist
- # Show log extract when the user is currently blocked
- if ( $namespace == NS_USER || $namespace == NS_USER_TALK ) {
- $parts = explode( '/', $this->mTitle->getText(), 2 );
- $username = $parts[0];
- $user = User::newFromName( $username, false /* allow IP users*/ );
- $ip = User::isIP( $username );
- if ( !$user->isLoggedIn() && !$ip ) { # User does not exist
- $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
- array( 'userpage-userdoesnotexist', wfEscapeWikiText( $username ) ) );
- } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
- LogEventsList::showLogExtract(
- $wgOut,
- 'block',
- $user->getUserPage()->getPrefixedText(),
- '',
- array(
- 'lim' => 1,
- 'showIfEmpty' => false,
- 'msgKey' => array(
- 'blocked-notice-logextract',
- $user->getName() # Support GENDER in notice
- )
- )
- );
- }
+ $title = Title::newFromText( $preload );
+ # Check for existence to avoid getting MediaWiki:Noarticletext
+ if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
+ return '';
}
- # Try to add a custom edit intro, or use the standard one if this is not possible.
- if ( !$this->showCustomIntro() && !$this->mTitle->exists() ) {
- if ( $wgUser->isLoggedIn() ) {
- $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletext\">\n$1\n</div>", 'newarticletext' );
- } else {
- $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletextanon\">\n$1\n</div>", 'newarticletextanon' );
+
+ $page = WikiPage::factory( $title );
+ if ( $page->isRedirect() ) {
+ $title = $page->getRedirectTarget();
+ # Same as before
+ if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
+ return '';
}
+ $page = WikiPage::factory( $title );
}
- # Give a notice if the user is editing a deleted/moved page...
- if ( !$this->mTitle->exists() ) {
- LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle->getPrefixedText(),
- '', array( 'lim' => 10,
- 'conds' => array( "log_action != 'revision'" ),
- 'showIfEmpty' => false,
- 'msgKey' => array( 'recreate-moveddeleted-warn') )
- );
- }
+
+ $parserOptions = ParserOptions::newFromUser( $wgUser );
+ return $wgParser->getPreloadText( $page->getRawText(), $title, $parserOptions );
}
/**
- * Attempt to show a custom editing introduction, if supplied
+ * Make sure the form isn't faking a user's credentials.
*
+ * @param $request WebRequest
* @return bool
+ * @private
*/
- protected function showCustomIntro() {
- if ( $this->editintro ) {
- $title = Title::newFromText( $this->editintro );
- if ( $title instanceof Title && $title->exists() && $title->userCanRead() ) {
- global $wgOut;
- // Added using template syntax, to take <noinclude>'s into account.
- $wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
+ function tokenOk( &$request ) {
+ global $wgUser;
+ $token = $request->getVal( 'wpEditToken' );
+ $this->mTokenOk = $wgUser->matchEditToken( $token );
+ $this->mTokenOkExceptSuffix = $wgUser->matchEditTokenNoSuffix( $token );
+ return $this->mTokenOk;
+ }
+
+ /**
+ * Attempt submission
+ * @return bool false if output is done, true if the rest of the form should be displayed
+ */
+ function attemptSave() {
+ global $wgUser, $wgOut;
+
+ $resultDetails = false;
+ # Allow bots to exempt some edits from bot flagging
+ $bot = $wgUser->isAllowed( 'bot' ) && $this->bot;
+ $status = $this->internalAttemptSave( $resultDetails, $bot );
+ // FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
+
+ if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
+ $this->didSave = true;
+ }
+
+ switch ( $status->value ) {
+ case self::AS_HOOK_ERROR_EXPECTED:
+ case self::AS_CONTENT_TOO_BIG:
+ case self::AS_ARTICLE_WAS_DELETED:
+ case self::AS_CONFLICT_DETECTED:
+ case self::AS_SUMMARY_NEEDED:
+ case self::AS_TEXTBOX_EMPTY:
+ case self::AS_MAX_ARTICLE_SIZE_EXCEEDED:
+ case self::AS_END:
return true;
- } else {
+
+ case self::AS_HOOK_ERROR:
+ case self::AS_FILTERING:
return false;
- }
- } else {
- return false;
+
+ case self::AS_SUCCESS_NEW_ARTICLE:
+ $query = $resultDetails['redirect'] ? 'redirect=no' : '';
+ $anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+ $wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
+ return false;
+
+ case self::AS_SUCCESS_UPDATE:
+ $extraQuery = '';
+ $sectionanchor = $resultDetails['sectionanchor'];
+
+ // Give extensions a chance to modify URL query on update
+ wfRunHooks( 'ArticleUpdateBeforeRedirect', array( $this->mArticle, &$sectionanchor, &$extraQuery ) );
+
+ if ( $resultDetails['redirect'] ) {
+ if ( $extraQuery == '' ) {
+ $extraQuery = 'redirect=no';
+ } else {
+ $extraQuery = 'redirect=no&' . $extraQuery;
+ }
+ }
+ $wgOut->redirect( $this->mTitle->getFullURL( $extraQuery ) . $sectionanchor );
+ return false;
+
+ case self::AS_BLANK_ARTICLE:
+ $wgOut->redirect( $this->getContextTitle()->getFullURL() );
+ return false;
+
+ case self::AS_SPAM_ERROR:
+ $this->spamPageWithContent( $resultDetails['spam'] );
+ return false;
+
+ case self::AS_BLOCKED_PAGE_FOR_USER:
+ throw new UserBlockedError( $wgUser->mBlock );
+
+ case self::AS_IMAGE_REDIRECT_ANON:
+ case self::AS_IMAGE_REDIRECT_LOGGED:
+ throw new PermissionsError( 'upload' );
+
+ case self::AS_READ_ONLY_PAGE_ANON:
+ case self::AS_READ_ONLY_PAGE_LOGGED:
+ throw new PermissionsError( 'edit' );
+
+ case self::AS_READ_ONLY_PAGE:
+ throw new ReadOnlyError;
+
+ case self::AS_RATE_LIMITED:
+ throw new ThrottledError();
+
+ case self::AS_NO_CREATE_PERMISSION:
+ $permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
+ throw new PermissionsError( $permission );
+
}
+ return false;
}
/**
@@ -866,9 +1048,9 @@ class EditPage {
* AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
*/
function internalAttemptSave( &$result, $bot = false ) {
- global $wgFilterCallback, $wgUser, $wgParser;
+ global $wgFilterCallback, $wgUser, $wgRequest, $wgParser;
global $wgMaxArticleSize;
-
+
$status = Status::newGood();
wfProfileIn( __METHOD__ );
@@ -891,7 +1073,6 @@ class EditPage {
$status->setResult( false, $code );
wfProfileOut( __METHOD__ . '-checks' );
-
wfProfileOut( __METHOD__ );
return $status;
@@ -904,7 +1085,7 @@ class EditPage {
}
if ( $match !== false ) {
$result['spam'] = $match;
- $ip = wfGetIP();
+ $ip = $wgRequest->getIP();
$pdbk = $this->mTitle->getPrefixedDBkey();
$match = str_replace( "\n", '', $match );
wfDebugLog( 'SpamRegex', "$ip spam regex hit [[$pdbk]]: \"$match\"" );
@@ -914,7 +1095,7 @@ class EditPage {
wfProfileOut( __METHOD__ );
return $status;
}
- if ( $wgFilterCallback && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section, $this->hookError, $this->summary ) ) {
+ if ( $wgFilterCallback && is_callable( $wgFilterCallback ) && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section, $this->hookError, $this->summary ) ) {
# Error messages or other handling should be performed by the filter function
$status->setResult( false, self::AS_FILTERING );
wfProfileOut( __METHOD__ . '-checks' );
@@ -936,6 +1117,7 @@ class EditPage {
wfProfileOut( __METHOD__ );
return $status;
}
+
if ( $wgUser->isBlockedFrom( $this->mTitle, false ) ) {
// Auto-block user's IP if the account was "hard" blocked
$wgUser->spreadAnyEditBlock();
@@ -945,6 +1127,7 @@ class EditPage {
wfProfileOut( __METHOD__ );
return $status;
}
+
$this->kblength = (int)( strlen( $this->textbox1 ) / 1024 );
if ( $this->kblength > $wgMaxArticleSize ) {
// Error will be displayed by showEditForm()
@@ -1044,8 +1227,33 @@ class EditPage {
}
$text = $this->textbox1;
- if ( $this->section == 'new' && $this->summary != '' ) {
- $text = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->summary ) . "\n\n" . $text;
+ $result['sectionanchor'] = '';
+ if ( $this->section == 'new' ) {
+ if ( $this->sectiontitle !== '' ) {
+ // Insert the section title above the content.
+ $text = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->sectiontitle ) . "\n\n" . $text;
+
+ // Jump to the new section
+ $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
+
+ // If no edit summary was specified, create one automatically from the section
+ // title and have it link to the new section. Otherwise, respect the summary as
+ // passed.
+ if ( $this->summary === '' ) {
+ $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
+ $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSectionTitle );
+ }
+ } elseif ( $this->summary !== '' ) {
+ // Insert the section title above the content.
+ $text = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->summary ) . "\n\n" . $text;
+
+ // Jump to the new section
+ $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
+
+ // Create a link to the new section from the edit summary.
+ $cleanSummary = $wgParser->stripSectionName( $this->summary );
+ $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSummary );
+ }
}
$status->value = self::AS_SUCCESS_NEW_ARTICLE;
@@ -1055,10 +1263,11 @@ class EditPage {
# Article exists. Check for edit conflict.
$this->mArticle->clear(); # Force reload of dates, etc.
+ $timestamp = $this->mArticle->getTimestamp();
- wfDebug( "timestamp: {$this->mArticle->getTimestamp()}, edittime: {$this->edittime}\n" );
+ wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
- if ( $this->mArticle->getTimestamp() != $this->edittime ) {
+ if ( $timestamp != $this->edittime ) {
$this->isConflict = true;
if ( $this->section == 'new' ) {
if ( $this->mArticle->getUserText() == $wgUser->getName() &&
@@ -1072,23 +1281,27 @@ class EditPage {
$this->isConflict = false;
wfDebug( __METHOD__ .": conflict suppressed; new section\n" );
}
+ } elseif ( $this->section == '' && $this->userWasLastToEdit( $wgUser->getId(), $this->edittime ) ) {
+ # Suppress edit conflict with self, except for section edits where merging is required.
+ wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
+ $this->isConflict = false;
}
}
- $userid = $wgUser->getId();
-
- # Suppress edit conflict with self, except for section edits where merging is required.
- if ( $this->isConflict && $this->section == '' && $this->userWasLastToEdit( $userid, $this->edittime ) ) {
- wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
- $this->isConflict = false;
+
+ // If sectiontitle is set, use it, otherwise use the summary as the section title (for
+ // backwards compatibility with old forms/bots).
+ if ( $this->sectiontitle !== '' ) {
+ $sectionTitle = $this->sectiontitle;
+ } else {
+ $sectionTitle = $this->summary;
}
-
+
if ( $this->isConflict ) {
- wfDebug( __METHOD__ . ": conflict! getting section '$this->section' for time '$this->edittime' (article time '" .
- $this->mArticle->getTimestamp() . "')\n" );
- $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $this->summary, $this->edittime );
+ wfDebug( __METHOD__ . ": conflict! getting section '$this->section' for time '$this->edittime' (article time '{$timestamp}')\n" );
+ $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $sectionTitle, $this->edittime );
} else {
wfDebug( __METHOD__ . ": getting section '$this->section'\n" );
- $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $this->summary );
+ $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $sectionTitle );
}
if ( is_null( $text ) ) {
wfDebug( __METHOD__ . ": activating conflict; section replace failed.\n" );
@@ -1113,8 +1326,6 @@ class EditPage {
return $status;
}
- $oldtext = $this->mArticle->getContent();
-
// Run post-section-merge edit filter
if ( !wfRunHooks( 'EditFilterMerged', array( $this, $text, &$this->hookError, $this->summary ) ) ) {
# Error messages etc. could be handled within the hook...
@@ -1131,7 +1342,8 @@ class EditPage {
}
# Handle the user preference to force summaries here, but not for null edits
- if ( $this->section != 'new' && !$this->allowBlankSummary && 0 != strcmp( $oldtext, $text )
+ if ( $this->section != 'new' && !$this->allowBlankSummary
+ && $this->getOriginalContent() != $text
&& !Title::newFromRedirect( $text ) ) # check if it's not a redirect
{
if ( md5( $this->summary ) == $this->autoSumm ) {
@@ -1166,7 +1378,16 @@ class EditPage {
wfProfileOut( __METHOD__ );
return $status;
}
- if ( $this->summary != '' ) {
+ if ( $this->sectiontitle !== '' ) {
+ $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
+ // If no edit summary was specified, create one automatically from the section
+ // title and have it link to the new section. Otherwise, respect the summary as
+ // passed.
+ if ( $this->summary === '' ) {
+ $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
+ $this->summary = wfMsgForContent( 'newsectionsummary', $cleanSectionTitle );
+ }
+ } elseif ( $this->summary !== '' ) {
$sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
# This is a new section, so create a link to the new section
# in the revision summary.
@@ -1259,7 +1480,7 @@ class EditPage {
$res = $dbw->select( 'revision',
'rev_user',
array(
- 'rev_page' => $this->mArticle->getId(),
+ 'rev_page' => $this->mTitle->getArticleId(),
'rev_timestamp > '.$dbw->addQuotes( $dbw->timestamp($edittime) )
),
__METHOD__,
@@ -1273,6 +1494,60 @@ class EditPage {
}
/**
+ * @private
+ * @todo document
+ *
+ * @parma $editText string
+ *
+ * @return bool
+ */
+ function mergeChangesInto( &$editText ){
+ wfProfileIn( __METHOD__ );
+
+ $db = wfGetDB( DB_MASTER );
+
+ // This is the revision the editor started from
+ $baseRevision = $this->getBaseRevision();
+ if ( is_null( $baseRevision ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ $baseText = $baseRevision->getText();
+
+ // The current state, we want to merge updates into it
+ $currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
+ if ( is_null( $currentRevision ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ $currentText = $currentRevision->getText();
+
+ $result = '';
+ if ( wfMerge( $baseText, $editText, $currentText, $result ) ) {
+ $editText = $result;
+ wfProfileOut( __METHOD__ );
+ return true;
+ } else {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ }
+
+ /**
+ * @return Revision
+ */
+ function getBaseRevision() {
+ if ( !$this->mBaseRevision ) {
+ $db = wfGetDB( DB_MASTER );
+ $baseRevision = Revision::loadFromTimestamp(
+ $db, $this->mTitle, $this->edittime );
+ return $this->mBaseRevision = $baseRevision;
+ } else {
+ return $this->mBaseRevision;
+ }
+ }
+
+ /**
* Check given input text against $wgSpamRegex, and return the text of the first match.
*
* @param $text string
@@ -1314,48 +1589,27 @@ class EditPage {
return false;
}
- /**
- * Initialise form fields in the object
- * Called on the first invocation, e.g. when a user clicks an edit link
- * @return bool -- if the requested section is valid
- */
- function initialiseForm() {
- global $wgUser;
- $this->edittime = $this->mArticle->getTimestamp();
- $this->textbox1 = $this->getContent( false );
- // activate checkboxes if user wants them to be always active
- # Sort out the "watch" checkbox
- if ( $wgUser->getOption( 'watchdefault' ) ) {
- # Watch all edits
- $this->watchthis = true;
- } elseif ( $wgUser->getOption( 'watchcreations' ) && !$this->mTitle->exists() ) {
- # Watch creations
- $this->watchthis = true;
- } elseif ( $this->mTitle->userIsWatching() ) {
- # Already watched
- $this->watchthis = true;
- }
- if ( $wgUser->getOption( 'minordefault' ) && !$this->isNew ) {
- $this->minoredit = true;
- }
- if ( $this->textbox1 === false ) {
- return false;
+ function setHeaders() {
+ global $wgOut, $wgUser;
+
+ $wgOut->addModules( 'mediawiki.action.edit' );
+
+ if ( $wgUser->getOption( 'uselivepreview', false ) ) {
+ $wgOut->addModules( 'mediawiki.legacy.preview' );
}
- wfProxyCheck();
- return true;
- }
+ // Bug #19334: textarea jumps when editing articles in IE8
+ $wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
- function setHeaders() {
- global $wgOut;
$wgOut->setRobotPolicy( 'noindex,nofollow' );
- if ( $this->formtype == 'preview' ) {
- $wgOut->setPageTitleActionText( wfMsg( 'preview' ) );
- }
+
+ # Enabled article-related sidebar, toplinks, etc.
+ $wgOut->setArticleRelated( true );
+
if ( $this->isConflict ) {
- $wgOut->setPageTitle( wfMsg( 'editconflict', $this->getContextTitle()->getPrefixedText() ) );
+ $wgOut->setPageTitle( wfMessage( 'editconflict', $this->getContextTitle()->getPrefixedText() ) );
} elseif ( $this->section != '' ) {
$msg = $this->section == 'new' ? 'editingcomment' : 'editingsection';
- $wgOut->setPageTitle( wfMsg( $msg, $this->getContextTitle()->getPrefixedText() ) );
+ $wgOut->setPageTitle( wfMessage( $msg, $this->getContextTitle()->getPrefixedText() ) );
} else {
# Use the title defined by DISPLAYTITLE magic word when present
if ( isset( $this->mParserOutput )
@@ -1364,7 +1618,90 @@ class EditPage {
} else {
$title = $this->getContextTitle()->getPrefixedText();
}
- $wgOut->setPageTitle( wfMsg( 'editing', $title ) );
+ $wgOut->setPageTitle( wfMessage( 'editing', $title ) );
+ }
+ }
+
+ /**
+ * Show all applicable editing introductions
+ */
+ protected function showIntro() {
+ global $wgOut, $wgUser;
+ if ( $this->suppressIntro ) {
+ return;
+ }
+
+ $namespace = $this->mTitle->getNamespace();
+
+ if ( $namespace == NS_MEDIAWIKI ) {
+ # Show a warning if editing an interface message
+ $wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
+ }
+
+ # Show a warning message when someone creates/edits a user (talk) page but the user does not exist
+ # Show log extract when the user is currently blocked
+ if ( $namespace == NS_USER || $namespace == NS_USER_TALK ) {
+ $parts = explode( '/', $this->mTitle->getText(), 2 );
+ $username = $parts[0];
+ $user = User::newFromName( $username, false /* allow IP users*/ );
+ $ip = User::isIP( $username );
+ if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
+ $wgOut->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
+ array( 'userpage-userdoesnotexist', wfEscapeWikiText( $username ) ) );
+ } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
+ LogEventsList::showLogExtract(
+ $wgOut,
+ 'block',
+ $user->getUserPage(),
+ '',
+ array(
+ 'lim' => 1,
+ 'showIfEmpty' => false,
+ 'msgKey' => array(
+ 'blocked-notice-logextract',
+ $user->getName() # Support GENDER in notice
+ )
+ )
+ );
+ }
+ }
+ # Try to add a custom edit intro, or use the standard one if this is not possible.
+ if ( !$this->showCustomIntro() && !$this->mTitle->exists() ) {
+ if ( $wgUser->isLoggedIn() ) {
+ $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletext\">\n$1\n</div>", 'newarticletext' );
+ } else {
+ $wgOut->wrapWikiMsg( "<div class=\"mw-newarticletextanon\">\n$1\n</div>", 'newarticletextanon' );
+ }
+ }
+ # Give a notice if the user is editing a deleted/moved page...
+ if ( !$this->mTitle->exists() ) {
+ LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle,
+ '', array( 'lim' => 10,
+ 'conds' => array( "log_action != 'revision'" ),
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'recreate-moveddeleted-warn') )
+ );
+ }
+ }
+
+ /**
+ * Attempt to show a custom editing introduction, if supplied
+ *
+ * @return bool
+ */
+ protected function showCustomIntro() {
+ if ( $this->editintro ) {
+ $title = Title::newFromText( $this->editintro );
+ if ( $title instanceof Title && $title->exists() && $title->userCan( 'read' ) ) {
+ global $wgOut;
+ // Added using template syntax, to take <noinclude>'s into account.
+ $wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
}
}
@@ -1391,24 +1728,11 @@ class EditPage {
$this->setHeaders();
- # Enabled article-related sidebar, toplinks, etc.
- $wgOut->setArticleRelated( true );
-
if ( $this->showHeader() === false ) {
wfProfileOut( __METHOD__ );
return;
}
- $action = htmlspecialchars( $this->getActionURL( $this->getContextTitle() ) );
-
- if ( $wgUser->getOption( 'showtoolbar' ) and !$this->isCssJsSubpage ) {
- # prepare toolbar for edit buttons
- $toolbar = EditPage::getEditToolbar();
- } else {
- $toolbar = '';
- }
-
-
$wgOut->addHTML( $this->editFormPageTop );
if ( $wgUser->getOption( 'previewontop' ) ) {
@@ -1417,26 +1741,21 @@ class EditPage {
$wgOut->addHTML( $this->editFormTextTop );
- $templates = $this->getTemplates();
- $formattedtemplates = Linker::formatTemplates( $templates, $this->preview, $this->section != '');
-
- $hiddencats = $this->mArticle->getHiddenCategories();
- $formattedhiddencats = Linker::formatHiddenCategories( $hiddencats );
-
- if ( $this->wasDeletedSinceLastEdit() && 'save' != $this->formtype ) {
- $wgOut->wrapWikiMsg(
- "<div class='error mw-deleted-while-editing'>\n$1\n</div>",
- 'deletedwhileediting' );
- } elseif ( $this->wasDeletedSinceLastEdit() ) {
- // Hide the toolbar and edit area, user can click preview to get it back
- // Add an confirmation checkbox and explanation.
- $toolbar = '';
- // @todo move this to a cleaner conditional instead of blanking a variable
+ $showToolbar = true;
+ if ( $this->wasDeletedSinceLastEdit() ) {
+ if ( $this->formtype == 'save' ) {
+ // Hide the toolbar and edit area, user can click preview to get it back
+ // Add an confirmation checkbox and explanation.
+ $showToolbar = false;
+ } else {
+ $wgOut->wrapWikiMsg( "<div class='error mw-deleted-while-editing'>\n$1\n</div>",
+ 'deletedwhileediting' );
+ }
}
- $wgOut->addHTML( <<<HTML
-<form id="editform" name="editform" method="post" action="$action" enctype="multipart/form-data">
-HTML
-);
+
+ $wgOut->addHTML( Html::openElement( 'form', array( 'id' => 'editform', 'name' => 'editform',
+ 'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
+ 'enctype' => 'multipart/form-data' ) ) );
if ( is_callable( $formCallback ) ) {
call_user_func_array( $formCallback, array( &$wgOut ) );
@@ -1473,13 +1792,14 @@ HTML
#####
# For a bit more sophisticated detection of blank summaries, hash the
# automatic one and pass that in the hidden field wpAutoSummary.
- if ( $this->missingSummary ||
- ( $this->section == 'new' && $this->nosummary ) )
- $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) );
+ if ( $this->missingSummary || ( $this->section == 'new' && $this->nosummary ) ) {
+ $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) );
+ }
+
$autosumm = $this->autoSumm ? $this->autoSumm : md5( $this->summary );
$wgOut->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) );
- $wgOut->addHTML( Html::hidden( 'oldid', $this->mArticle->getOldID() ) );
+ $wgOut->addHTML( Html::hidden( 'oldid', $this->oldid ) );
if ( $this->section == 'new' ) {
$this->showSummaryInput( true, $this->summary );
@@ -1488,14 +1808,19 @@ HTML
$wgOut->addHTML( $this->editFormTextBeforeContent );
- $wgOut->addHTML( $toolbar );
+ if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) {
+ $wgOut->addHTML( EditPage::getEditToolbar() );
+ }
if ( $this->isConflict ) {
// In an edit conflict bypass the overrideable content form method
// and fallback to the raw wpTextbox1 since editconflicts can't be
// resolved between page source edits and custom ui edits using the
// custom edit ui.
- $this->showTextbox1( null, $this->getContent() );
+ $this->textbox2 = $this->textbox1;
+ $this->textbox1 = $this->getCurrentText();
+
+ $this->showTextbox1();
} else {
$this->showContentForm();
}
@@ -1503,32 +1828,31 @@ HTML
$wgOut->addHTML( $this->editFormTextAfterContent );
$wgOut->addWikiText( $this->getCopywarn() );
- if ( isset($this->editFormTextAfterWarn) && $this->editFormTextAfterWarn !== '' )
- $wgOut->addHTML( $this->editFormTextAfterWarn );
+
+ $wgOut->addHTML( $this->editFormTextAfterWarn );
$this->showStandardInputs();
$this->showFormAfterText();
$this->showTosSummary();
+
$this->showEditTools();
- $wgOut->addHTML( <<<HTML
-{$this->editFormTextAfterTools}
-<div class='templatesUsed'>
-{$formattedtemplates}
-</div>
-<div class='hiddencats'>
-{$formattedhiddencats}
-</div>
-HTML
-);
+ $wgOut->addHTML( $this->editFormTextAfterTools . "\n" );
+
+ $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
+ Linker::formatTemplates( $this->getTemplates(), $this->preview, $this->section != '' ) ) );
+
+ $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'hiddencats' ),
+ Linker::formatHiddenCategories( $this->mArticle->getHiddenCategories() ) ) );
- if ( $this->isConflict )
+ if ( $this->isConflict ) {
$this->showConflict();
+ }
+
+ $wgOut->addHTML( $this->editFormTextBottom . "\n</form>\n" );
- $wgOut->addHTML( $this->editFormTextBottom );
- $wgOut->addHTML( "</form>\n" );
if ( !$wgUser->getOption( 'previewontop' ) ) {
$this->displayPreviewArea( $previewOutput, false );
}
@@ -1536,8 +1860,54 @@ HTML
wfProfileOut( __METHOD__ );
}
+ /**
+ * Extract the section title from current section text, if any.
+ *
+ * @param string $text
+ * @return Mixed|string or false
+ */
+ public static function extractSectionTitle( $text ) {
+ preg_match( "/^(=+)(.+)\\1\\s*(\n|$)/i", $text, $matches );
+ if ( !empty( $matches[2] ) ) {
+ global $wgParser;
+ return $wgParser->stripSectionName(trim($matches[2]));
+ } else {
+ return false;
+ }
+ }
+
protected function showHeader() {
global $wgOut, $wgUser, $wgMaxArticleSize, $wgLang;
+
+ if ( $this->mTitle->isTalkPage() ) {
+ $wgOut->addWikiMsg( 'talkpagetext' );
+ }
+
+ # Optional notices on a per-namespace and per-page basis
+ $editnotice_ns = 'editnotice-'.$this->mTitle->getNamespace();
+ $editnotice_ns_message = wfMessage( $editnotice_ns )->inContentLanguage();
+ if ( $editnotice_ns_message->exists() ) {
+ $wgOut->addWikiText( $editnotice_ns_message->plain() );
+ }
+ if ( MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) {
+ $parts = explode( '/', $this->mTitle->getDBkey() );
+ $editnotice_base = $editnotice_ns;
+ while ( count( $parts ) > 0 ) {
+ $editnotice_base .= '-'.array_shift( $parts );
+ $editnotice_base_msg = wfMessage( $editnotice_base )->inContentLanguage();
+ if ( $editnotice_base_msg->exists() ) {
+ $wgOut->addWikiText( $editnotice_base_msg->plain() );
+ }
+ }
+ } else {
+ # Even if there are no subpages in namespace, we still don't want / in MW ns.
+ $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->mTitle->getDBkey() );
+ $editnoticeMsg = wfMessage( $editnoticeText )->inContentLanguage();
+ if ( $editnoticeMsg->exists() ) {
+ $wgOut->addWikiText( $editnoticeMsg->plain() );
+ }
+ }
+
if ( $this->isConflict ) {
$wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
$this->edittime = $this->mArticle->getTimestamp();
@@ -1551,14 +1921,10 @@ HTML
}
if ( $this->section != '' && $this->section != 'new' ) {
- $matches = array();
if ( !$this->summary && !$this->preview && !$this->diff ) {
- preg_match( "/^(=+)(.+)\\1/mi", $this->textbox1, $matches );
- if ( !empty( $matches[2] ) ) {
- global $wgParser;
- $this->summary = "/* " .
- $wgParser->stripSectionName(trim($matches[2])) .
- " */ ";
+ $sectionTitle = self::extractSectionTitle( $this->textbox1 );
+ if ( $sectionTitle !== false ) {
+ $this->summary = "/* $sectionTitle */ ";
}
}
}
@@ -1583,18 +1949,27 @@ HTML
$wgOut->addWikiMsg( 'nonunicodebrowser' );
}
- if ( isset( $this->mArticle ) && isset( $this->mArticle->mRevision ) ) {
- // Let sysop know that this will make private content public if saved
+ if ( $this->section != 'new' ) {
+ $revision = $this->mArticle->getRevisionFetched();
+ if ( $revision ) {
+ // Let sysop know that this will make private content public if saved
- if ( !$this->mArticle->mRevision->userCan( Revision::DELETED_TEXT ) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
- } elseif ( $this->mArticle->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
- $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
- }
+ if ( !$revision->userCan( Revision::DELETED_TEXT ) ) {
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+ } elseif ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+ $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
+ }
+
+ if ( !$revision->isCurrent() ) {
+ $this->mArticle->setOldSubtitle( $revision->getId() );
+ $wgOut->addWikiMsg( 'editingold' );
+ }
+ } elseif ( $this->mTitle->exists() ) {
+ // Something went wrong
- if ( !$this->mArticle->mRevision->isCurrent() ) {
- $this->mArticle->setOldSubtitle( $this->mArticle->mRevision->getId() );
- $wgOut->addWikiMsg( 'editingold' );
+ $wgOut->wrapWikiMsg( "<div class='errorbox'>\n$1\n</div>\n",
+ array( 'missing-article', $this->mTitle->getPrefixedText(),
+ wfMsgNoTrans( 'missingarticle-rev', $this->oldid ) ) );
}
}
}
@@ -1611,7 +1986,7 @@ HTML
if ( $this->isCssJsSubpage ) {
# Check the skin exists
if ( $this->isWrongCaseCssJsPage ) {
- $wgOut->wrapWikiMsg( "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>", array( 'userinvalidcssjstitle', $this->getContextTitle()->getSkinFromCssJsSubpage() ) );
+ $wgOut->wrapWikiMsg( "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>", array( 'userinvalidcssjstitle', $this->mTitle->getSkinFromCssJsSubpage() ) );
}
if ( $this->formtype !== 'preview' ) {
if ( $this->isCssSubpage )
@@ -1630,7 +2005,7 @@ HTML
# Then it must be protected based on static groups (regular)
$noticeMsg = 'protectedpagewarning';
}
- LogEventsList::showLogExtract( $wgOut, 'protect', $this->mTitle->getPrefixedText(), '',
+ LogEventsList::showLogExtract( $wgOut, 'protect', $this->mTitle, '',
array( 'lim' => 1, 'msgKey' => array( $noticeMsg ) ) );
}
if ( $this->mTitle->isCascadeProtected() ) {
@@ -1648,7 +2023,7 @@ HTML
$wgOut->wrapWikiMsg( $notice, array( 'cascadeprotectedwarning', $cascadeSourcesCount ) );
}
if ( !$this->mTitle->exists() && $this->mTitle->getRestrictions( 'create' ) ) {
- LogEventsList::showLogExtract( $wgOut, 'protect', $this->mTitle->getPrefixedText(), '',
+ LogEventsList::showLogExtract( $wgOut, 'protect', $this->mTitle, '',
array( 'lim' => 1,
'showIfEmpty' => false,
'msgKey' => array( 'titleprotectedwarning' ),
@@ -1788,7 +2163,7 @@ HTML
* include the constant suffix to prevent editing from
* broken text-mangling proxies.
*/
- $wgOut->addHTML( "\n" . Html::hidden( "wpEditToken", $wgUser->editToken() ) . "\n" );
+ $wgOut->addHTML( "\n" . Html::hidden( "wpEditToken", $wgUser->getEditToken() ) . "\n" );
}
/**
@@ -1811,34 +2186,40 @@ HTML
* @param $customAttribs An array of html attributes to use in the textarea
* @param $textoverride String: optional text to override $this->textarea1 with
*/
- protected function showTextbox1($customAttribs = null, $textoverride = null) {
- $classes = array(); // Textarea CSS
- if ( $this->mTitle->getNamespace() != NS_MEDIAWIKI && $this->mTitle->isProtected( 'edit' ) ) {
- # Is the title semi-protected?
- if ( $this->mTitle->isSemiProtected() ) {
- $classes[] = 'mw-textarea-sprotected';
- } else {
- # Then it must be protected based on static groups (regular)
- $classes[] = 'mw-textarea-protected';
+ protected function showTextbox1( $customAttribs = null, $textoverride = null ) {
+ if ( $this->wasDeletedSinceLastEdit() && $this->formtype == 'save' ) {
+ $attribs = array( 'style' => 'display:none;' );
+ } else {
+ $classes = array(); // Textarea CSS
+ if ( $this->mTitle->getNamespace() != NS_MEDIAWIKI && $this->mTitle->isProtected( 'edit' ) ) {
+ # Is the title semi-protected?
+ if ( $this->mTitle->isSemiProtected() ) {
+ $classes[] = 'mw-textarea-sprotected';
+ } else {
+ # Then it must be protected based on static groups (regular)
+ $classes[] = 'mw-textarea-protected';
+ }
+ # Is the title cascade-protected?
+ if ( $this->mTitle->isCascadeProtected() ) {
+ $classes[] = 'mw-textarea-cprotected';
+ }
}
- # Is the title cascade-protected?
- if ( $this->mTitle->isCascadeProtected() ) {
- $classes[] = 'mw-textarea-cprotected';
+
+ $attribs = array( 'tabindex' => 1 );
+
+ if ( is_array( $customAttribs ) ) {
+ $attribs += $customAttribs;
}
- }
- $attribs = array( 'tabindex' => 1 );
- if ( is_array($customAttribs) )
- $attribs += $customAttribs;
- if ( $this->wasDeletedSinceLastEdit() )
- $attribs['type'] = 'hidden';
- if ( !empty( $classes ) ) {
- if ( isset($attribs['class']) )
- $classes[] = $attribs['class'];
- $attribs['class'] = implode( ' ', $classes );
+ if ( count( $classes ) ) {
+ if ( isset( $attribs['class'] ) ) {
+ $classes[] = $attribs['class'];
+ }
+ $attribs['class'] = implode( ' ', $classes );
+ }
}
- $this->showTextbox( isset($textoverride) ? $textoverride : $this->textbox1, 'wpTextbox1', $attribs );
+ $this->showTextbox( $textoverride !== null ? $textoverride : $this->textbox1, 'wpTextbox1', $attribs );
}
protected function showTextbox2() {
@@ -1849,7 +2230,7 @@ HTML
global $wgOut, $wgUser;
$wikitext = $this->safeUnicodeOutput( $content );
- if ( $wikitext !== '' ) {
+ if ( strval($wikitext) !== '' ) {
// Ensure there's a newline at the end, otherwise adding lines
// is awkward.
// But don't add a newline if the ext is empty, or Firefox in XHTML
@@ -1917,6 +2298,40 @@ HTML
}
/**
+ * Get a diff between the current contents of the edit box and the
+ * version of the page we're editing from.
+ *
+ * If this is a section edit, we'll replace the section as for final
+ * save and then make a comparison.
+ */
+ function showDiff() {
+ global $wgUser, $wgContLang, $wgParser, $wgOut;
+
+ $oldtext = $this->mArticle->getRawText();
+ $newtext = $this->mArticle->replaceSection(
+ $this->section, $this->textbox1, $this->summary, $this->edittime );
+
+ wfRunHooks( 'EditPageGetDiffText', array( $this, &$newtext ) );
+
+ $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+ $newtext = $wgParser->preSaveTransform( $newtext, $this->mTitle, $wgUser, $popts );
+
+ if ( $oldtext !== false || $newtext != '' ) {
+ $oldtitle = wfMsgExt( 'currentrev', array( 'parseinline' ) );
+ $newtitle = wfMsgExt( 'yourtext', array( 'parseinline' ) );
+
+ $de = new DifferenceEngine( $this->mArticle->getContext() );
+ $de->setText( $oldtext, $newtext );
+ $difftext = $de->getDiff( $oldtitle, $newtitle );
+ $de->showDiffStyle();
+ } else {
+ $difftext = '';
+ }
+
+ $wgOut->addHTML( '<div id="wikiDiff">' . $difftext . '</div>' );
+ }
+
+ /**
* Give a chance for site and per-namespace customizations of
* terms of service summary link that might exist separately
* from the copyright notice.
@@ -1992,20 +2407,75 @@ HTML
*/
protected function showConflict() {
global $wgOut;
- $this->textbox2 = $this->textbox1;
- $this->textbox1 = $this->getContent();
+
if ( wfRunHooks( 'EditPageBeforeConflictDiff', array( &$this, &$wgOut ) ) ) {
$wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
- $de = new DifferenceEngine( $this->mTitle );
+ $de = new DifferenceEngine( $this->mArticle->getContext() );
$de->setText( $this->textbox2, $this->textbox1 );
- $de->showDiff( wfMsg( "yourtext" ), wfMsg( "storedversion" ) );
+ $de->showDiff( wfMsgExt( 'yourtext', 'parseinline' ), wfMsg( 'storedversion' ) );
$wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
$this->showTextbox2();
}
}
+ /**
+ * @return string
+ */
+ public function getCancelLink() {
+ $cancelParams = array();
+ if ( !$this->isConflict && $this->oldid > 0 ) {
+ $cancelParams['oldid'] = $this->oldid;
+ }
+
+ return Linker::linkKnown(
+ $this->getContextTitle(),
+ wfMsgExt( 'cancel', array( 'parseinline' ) ),
+ array( 'id' => 'mw-editform-cancel' ),
+ $cancelParams
+ );
+ }
+
+ /**
+ * Returns the URL to use in the form's action attribute.
+ * This is used by EditPage subclasses when simply customizing the action
+ * variable in the constructor is not enough. This can be used when the
+ * EditPage lives inside of a Special page rather than a custom page action.
+ *
+ * @param $title Title object for which is being edited (where we go to for &action= links)
+ * @return string
+ */
+ protected function getActionURL( Title $title ) {
+ return $title->getLocalURL( array( 'action' => $this->action ) );
+ }
+
+ /**
+ * Check if a page was deleted while the user was editing it, before submit.
+ * Note that we rely on the logging table, which hasn't been always there,
+ * but that doesn't matter, because this only applies to brand new
+ * deletes.
+ */
+ protected function wasDeletedSinceLastEdit() {
+ if ( $this->deletedSinceEdit !== null ) {
+ return $this->deletedSinceEdit;
+ }
+
+ $this->deletedSinceEdit = false;
+
+ if ( $this->mTitle->isDeletedQuick() ) {
+ $this->lastDelete = $this->getLastDelete();
+ if ( $this->lastDelete ) {
+ $deleteTime = wfTimestamp( TS_MW, $this->lastDelete->log_timestamp );
+ if ( $deleteTime > $this->starttime ) {
+ $this->deletedSinceEdit = true;
+ }
+ }
+ }
+
+ return $this->deletedSinceEdit;
+ }
+
protected function getLastDelete() {
$dbr = wfGetDB( DB_SLAVE );
$data = $dbr->selectRow(
@@ -2043,10 +2513,25 @@ HTML
* @return string
*/
function getPreviewText() {
- global $wgOut, $wgUser, $wgParser;
+ global $wgOut, $wgUser, $wgParser, $wgRawHtml;
wfProfileIn( __METHOD__ );
+ if ( $wgRawHtml && !$this->mTokenOk ) {
+ // Could be an offsite preview attempt. This is very unsafe if
+ // HTML is enabled, as it could be an attack.
+ $parsedNote = '';
+ if ( $this->textbox1 !== '' ) {
+ // Do not put big scary notice, if previewing the empty
+ // string, which happens when you initially edit
+ // a category page, due to automatic preview-on-open.
+ $parsedNote = $wgOut->parse( "<div class='previewnote'>" .
+ wfMsg( 'session_fail_preview_html' ) . "</div>", true, /* interface */true );
+ }
+ wfProfileOut( __METHOD__ );
+ return $parsedNote;
+ }
+
if ( $this->mTriedSave && !$this->mTokenOk ) {
if ( $this->mTokenOkExceptSuffix ) {
$note = wfMsg( 'token_suffix_mismatch' );
@@ -2061,47 +2546,36 @@ HTML
$parserOptions = ParserOptions::newFromUser( $wgUser );
$parserOptions->setEditSection( false );
+ $parserOptions->setTidy( true );
$parserOptions->setIsPreview( true );
$parserOptions->setIsSectionPreview( !is_null($this->section) && $this->section !== '' );
- global $wgRawHtml;
- if ( $wgRawHtml && !$this->mTokenOk ) {
- // Could be an offsite preview attempt. This is very unsafe if
- // HTML is enabled, as it could be an attack.
- $parsedNote = '';
- if ( $this->textbox1 !== '' ) {
- // Do not put big scary notice, if previewing the empty
- // string, which happens when you initially edit
- // a category page, due to automatic preview-on-open.
- $parsedNote = $wgOut->parse( "<div class='previewnote'>" .
- wfMsg( 'session_fail_preview_html' ) . "</div>" );
- }
- wfProfileOut( __METHOD__ );
- return $parsedNote;
- }
-
- # don't parse user css/js, show message about preview
+ # don't parse non-wikitext pages, show message about preview
# XXX: stupid php bug won't let us use $this->getContextTitle()->isCssJsSubpage() here -- This note has been there since r3530. Sure the bug was fixed time ago?
- if ( $this->isCssJsSubpage || $this->mTitle->isCssOrJsPage() ) {
- $level = 'user';
- if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ if ( $this->isCssJsSubpage || !$this->mTitle->isWikitextPage() ) {
+ if( $this->mTitle->isCssJsSubpage() ) {
+ $level = 'user';
+ } elseif( $this->mTitle->isCssOrJsPage() ) {
$level = 'site';
+ } else {
+ $level = false;
}
# Used messages to make sure grep find them:
# Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
- if (preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
- $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
- $class = "mw-code mw-css";
- } elseif (preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
- $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMsg( "{$level}jspreview" ) . "\n</div>";
- $class = "mw-code mw-js";
- } else {
- throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
+ if( $level ) {
+ if (preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
+ $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
+ $class = "mw-code mw-css";
+ } elseif (preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
+ $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMsg( "{$level}jspreview" ) . "\n</div>";
+ $class = "mw-code mw-js";
+ } else {
+ throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
+ }
}
- $parserOptions->setTidy( true );
$parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
$previewHTML = $parserOutput->mText;
$previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
@@ -2115,15 +2589,15 @@ HTML
# If we're adding a comment, we need to show the
# summary as the headline
if ( $this->section == "new" && $this->summary != "" ) {
- $toparse = "== {$this->summary} ==\n\n" . $toparse;
+ $toparse = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->summary ) . "\n\n" . $toparse;
}
wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
- $parserOptions->setTidy( true );
$parserOptions->enableLimitReport();
- $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ),
- $this->mTitle, $parserOptions );
+
+ $toparse = $wgParser->preSaveTransform( $toparse, $this->mTitle, $wgUser, $parserOptions );
+ $parserOutput = $wgParser->parse( $toparse, $this->mTitle, $parserOptions );
$previewHTML = $parserOutput->getText();
$this->mParserOutput = $parserOutput;
@@ -2143,7 +2617,7 @@ HTML
$previewhead = "<div class='previewnote'>\n" .
'<h2 id="mw-previewheader">' . htmlspecialchars( wfMsg( 'preview' ) ) . "</h2>" .
- $wgOut->parse( $note ) . $conflict . "</div>\n";
+ $wgOut->parse( $note, true, /* interface */true ) . $conflict . "</div>\n";
$pageLang = $this->mTitle->getPageLanguage();
$attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
@@ -2170,203 +2644,11 @@ HTML
}
return $templates;
} else {
- return $this->mArticle->getUsedTemplates();
+ return $this->mTitle->getTemplateLinksFrom();
}
}
/**
- * Call the stock "user is blocked" page
- */
- function blockedPage() {
- global $wgOut;
- $wgOut->blockedPage( false ); # Standard block notice on the top, don't 'return'
-
- # If the user made changes, preserve them when showing the markup
- # (This happens when a user is blocked during edit, for instance)
- $first = $this->firsttime || ( !$this->save && $this->textbox1 == '' );
- if ( $first ) {
- $source = $this->mTitle->exists() ? $this->getContent() : false;
- } else {
- $source = $this->textbox1;
- }
-
- # Spit out the source or the user's modified version
- if ( $source !== false ) {
- $wgOut->addHTML( '<hr />' );
- $wgOut->addWikiMsg( $first ? 'blockedoriginalsource' : 'blockededitsource', $this->mTitle->getPrefixedText() );
- $this->showTextbox1( array( 'readonly' ), $source );
- }
- }
-
- /**
- * Produce the stock "please login to edit pages" page
- */
- function userNotLoggedInPage() {
- global $wgOut;
-
- $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
- $loginLink = Linker::linkKnown(
- $loginTitle,
- wfMsgHtml( 'loginreqlink' ),
- array(),
- array( 'returnto' => $this->getContextTitle()->getPrefixedText() )
- );
-
- $wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleRelated( false );
-
- $wgOut->addHTML( wfMessage( 'whitelistedittext' )->rawParams( $loginLink )->parse() );
- $wgOut->returnToMain( false, $this->getContextTitle() );
- }
-
- /**
- * Creates a basic error page which informs the user that
- * they have attempted to edit a nonexistent section.
- */
- function noSuchSectionPage() {
- global $wgOut;
-
- $wgOut->setPageTitle( wfMsg( 'nosuchsectiontitle' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleRelated( false );
-
- $res = wfMsgExt( 'nosuchsectiontext', 'parse', $this->section );
- wfRunHooks( 'EditPageNoSuchSection', array( &$this, &$res ) );
- $wgOut->addHTML( $res );
-
- $wgOut->returnToMain( false, $this->mTitle );
- }
-
- /**
- * Produce the stock "your edit contains spam" page
- *
- * @param $match Text which triggered one or more filters
- * @deprecated since 1.17 Use method spamPageWithContent() instead
- */
- static function spamPage( $match = false ) {
- global $wgOut, $wgTitle;
-
- $wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleRelated( false );
-
- $wgOut->addHTML( '<div id="spamprotected">' );
- $wgOut->addWikiMsg( 'spamprotectiontext' );
- if ( $match ) {
- $wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) );
- }
- $wgOut->addHTML( '</div>' );
-
- $wgOut->returnToMain( false, $wgTitle );
- }
-
- /**
- * Show "your edit contains spam" page with your diff and text
- *
- * @param $match Text which triggered one or more filters
- */
- public function spamPageWithContent( $match = false ) {
- global $wgOut;
- $this->textbox2 = $this->textbox1;
-
- $wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleRelated( false );
-
- $wgOut->addHTML( '<div id="spamprotected">' );
- $wgOut->addWikiMsg( 'spamprotectiontext' );
- if ( $match ) {
- $wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) );
- }
- $wgOut->addHTML( '</div>' );
-
- $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
- $de = new DifferenceEngine( $this->mTitle );
- $de->setText( $this->getContent(), $this->textbox2 );
- $de->showDiff( wfMsg( "storedversion" ), wfMsg( "yourtext" ) );
-
- $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
- $this->showTextbox2();
-
- $wgOut->addReturnTo( $this->getContextTitle(), array( 'action' => 'edit' ) );
- }
-
-
- /**
- * @private
- * @todo document
- *
- * @parma $editText string
- *
- * @return bool
- */
- function mergeChangesInto( &$editText ){
- wfProfileIn( __METHOD__ );
-
- $db = wfGetDB( DB_MASTER );
-
- // This is the revision the editor started from
- $baseRevision = $this->getBaseRevision();
- if ( is_null( $baseRevision ) ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- $baseText = $baseRevision->getText();
-
- // The current state, we want to merge updates into it
- $currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
- if ( is_null( $currentRevision ) ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- $currentText = $currentRevision->getText();
-
- $result = '';
- if ( wfMerge( $baseText, $editText, $currentText, $result ) ) {
- $editText = $result;
- wfProfileOut( __METHOD__ );
- return true;
- } else {
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
-
- /**
- * Check if the browser is on a blacklist of user-agents known to
- * mangle UTF-8 data on form submission. Returns true if Unicode
- * should make it through, false if it's known to be a problem.
- * @return bool
- * @private
- */
- function checkUnicodeCompliantBrowser() {
- global $wgBrowserBlackList;
- if ( empty( $_SERVER["HTTP_USER_AGENT"] ) ) {
- // No User-Agent header sent? Trust it by default...
- return true;
- }
- $currentbrowser = $_SERVER["HTTP_USER_AGENT"];
- foreach ( $wgBrowserBlackList as $browser ) {
- if ( preg_match($browser, $currentbrowser) ) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Format an anchor fragment as it would appear for a given section name
- * @param $text String
- * @return String
- * @private
- */
- function sectionAnchor( $text ) {
- global $wgParser;
- return $wgParser->guessSectionNameFromWikiText( $text );
- }
-
- /**
* Shows a bulletin board style toolbar for common editing functions.
* It can be disabled in the user preferences.
* The necessary JavaScript code can be found in skins/common/edit.js.
@@ -2384,10 +2666,8 @@ HTML
* filename of the button image (without path), the opening
* tag, the closing tag, optionally a sample text that is
* inserted between the two when no selection is highlighted
- * and an option to select which switches the automatic
- * selection of inserted text (default is true, see
- * mw-editbutton-image). The tip text is shown when the user
- * moves the mouse over the button.
+ * and. The tip text is shown when the user moves the mouse
+ * over the button.
*
* Also here: accesskeys (key), which are not used yet until
* someone can figure out a way to make them work in
@@ -2448,7 +2728,6 @@ HTML
'sample' => wfMsg( 'image_sample' ),
'tip' => wfMsg( 'image_tip' ),
'key' => 'D',
- 'select' => true
) : false,
$imagesAvailable ? array(
'image' => $wgLang->getImageFile( 'button-media' ),
@@ -2497,16 +2776,12 @@ HTML
)
);
- $script = '';
+ $script = 'mw.loader.using("mediawiki.action.edit", function() {';
foreach ( $toolarray as $tool ) {
if ( !$tool ) {
continue;
}
- if( !isset( $tool['select'] ) ) {
- $tool['select'] = true;
- }
-
$params = array(
$image = $wgStylePath . '/common/images/' . $tool['image'],
// Note that we use the tip both for the ALT tag and the TITLE tag of the image.
@@ -2522,6 +2797,14 @@ HTML
$script .= Xml::encodeJsCall( 'mw.toolbar.addButton', $params );
}
+
+ // This used to be called on DOMReady from mediawiki.action.edit, which
+ // ended up causing race conditions with the setup code above.
+ $script .= "\n" .
+ "// Create button bar\n" .
+ "$(function() { mw.toolbar.init(); } );\n";
+
+ $script .= '});';
$wgOut->addScript( Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( $script ) ) );
$toolbar = '<div id="toolbar"></div>';
@@ -2663,50 +2946,138 @@ HTML
}
/**
- * @return string
+ * Call the stock "user is blocked" page
+ *
+ * @deprecated in 1.19; throw an exception directly instead
*/
- public function getCancelLink() {
- $cancelParams = array();
- if ( !$this->isConflict && $this->mArticle->getOldID() > 0 ) {
- $cancelParams['oldid'] = $this->mArticle->getOldID();
- }
+ function blockedPage() {
+ wfDeprecated( __METHOD__, '1.19' );
+ global $wgUser;
- return Linker::linkKnown(
- $this->getContextTitle(),
- wfMsgExt( 'cancel', array( 'parseinline' ) ),
- array( 'id' => 'mw-editform-cancel' ),
- $cancelParams
- );
+ throw new UserBlockedError( $wgUser->mBlock );
}
/**
- * Get a diff between the current contents of the edit box and the
- * version of the page we're editing from.
+ * Produce the stock "please login to edit pages" page
*
- * If this is a section edit, we'll replace the section as for final
- * save and then make a comparison.
+ * @deprecated in 1.19; throw an exception directly instead
*/
- function showDiff() {
- $oldtext = $this->mArticle->fetchContent();
- $newtext = $this->mArticle->replaceSection(
- $this->section, $this->textbox1, $this->summary, $this->edittime );
+ function userNotLoggedInPage() {
+ wfDeprecated( __METHOD__, '1.19' );
+ throw new PermissionsError( 'edit' );
+ }
- wfRunHooks( 'EditPageGetDiffText', array( $this, &$newtext ) );
+ /**
+ * Show an error page saying to the user that he has insufficient permissions
+ * to create a new page
+ *
+ * @deprecated in 1.19; throw an exception directly instead
+ */
+ function noCreatePermission() {
+ wfDeprecated( __METHOD__, '1.19' );
+ $permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
+ throw new PermissionsError( $permission );
+ }
- $newtext = $this->mArticle->preSaveTransform( $newtext );
- $oldtitle = wfMsgExt( 'currentrev', array( 'parseinline' ) );
- $newtitle = wfMsgExt( 'yourtext', array( 'parseinline' ) );
- if ( $oldtext !== false || $newtext != '' ) {
- $de = new DifferenceEngine( $this->mTitle );
- $de->setText( $oldtext, $newtext );
- $difftext = $de->getDiff( $oldtitle, $newtitle );
- $de->showDiffStyle();
- } else {
- $difftext = '';
+ /**
+ * Creates a basic error page which informs the user that
+ * they have attempted to edit a nonexistent section.
+ */
+ function noSuchSectionPage() {
+ global $wgOut;
+
+ $wgOut->prepareErrorPage( wfMessage( 'nosuchsectiontitle' ) );
+
+ $res = wfMsgExt( 'nosuchsectiontext', 'parse', $this->section );
+ wfRunHooks( 'EditPageNoSuchSection', array( &$this, &$res ) );
+ $wgOut->addHTML( $res );
+
+ $wgOut->returnToMain( false, $this->mTitle );
+ }
+
+ /**
+ * Produce the stock "your edit contains spam" page
+ *
+ * @param $match Text which triggered one or more filters
+ * @deprecated since 1.17 Use method spamPageWithContent() instead
+ */
+ static function spamPage( $match = false ) {
+ wfDeprecated( __METHOD__, '1.17' );
+
+ global $wgOut, $wgTitle;
+
+ $wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
+
+ $wgOut->addHTML( '<div id="spamprotected">' );
+ $wgOut->addWikiMsg( 'spamprotectiontext' );
+ if ( $match ) {
+ $wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) );
}
+ $wgOut->addHTML( '</div>' );
+ $wgOut->returnToMain( false, $wgTitle );
+ }
+
+ /**
+ * Show "your edit contains spam" page with your diff and text
+ *
+ * @param $match Text which triggered one or more filters
+ */
+ public function spamPageWithContent( $match = false ) {
global $wgOut;
- $wgOut->addHTML( '<div id="wikiDiff">' . $difftext . '</div>' );
+ $this->textbox2 = $this->textbox1;
+
+ $wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
+
+ $wgOut->addHTML( '<div id="spamprotected">' );
+ $wgOut->addWikiMsg( 'spamprotectiontext' );
+ if ( $match ) {
+ $wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) );
+ }
+ $wgOut->addHTML( '</div>' );
+
+ $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
+ $de = new DifferenceEngine( $this->mArticle->getContext() );
+ $de->setText( $this->getCurrentText(), $this->textbox2 );
+ $de->showDiff( wfMsg( "storedversion" ), wfMsgExt( 'yourtext', 'parseinline' ) );
+
+ $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
+ $this->showTextbox2();
+
+ $wgOut->addReturnTo( $this->getContextTitle(), array( 'action' => 'edit' ) );
+ }
+
+ /**
+ * Format an anchor fragment as it would appear for a given section name
+ * @param $text String
+ * @return String
+ * @private
+ */
+ function sectionAnchor( $text ) {
+ global $wgParser;
+ return $wgParser->guessSectionNameFromWikiText( $text );
+ }
+
+ /**
+ * Check if the browser is on a blacklist of user-agents known to
+ * mangle UTF-8 data on form submission. Returns true if Unicode
+ * should make it through, false if it's known to be a problem.
+ * @return bool
+ * @private
+ */
+ function checkUnicodeCompliantBrowser() {
+ global $wgBrowserBlackList;
+ if ( empty( $_SERVER["HTTP_USER_AGENT"] ) ) {
+ // No User-Agent header sent? Trust it by default...
+ return true;
+ }
+ $currentbrowser = $_SERVER["HTTP_USER_AGENT"];
+ foreach ( $wgBrowserBlackList as $browser ) {
+ if ( preg_match($browser, $currentbrowser) ) {
+ return false;
+ }
+ }
+ return true;
}
/**
@@ -2835,117 +3206,4 @@ HTML
// reverse the transform that we made for reversability reasons.
return strtr( $result, array( "&#x0" => "&#x" ) );
}
-
- function noCreatePermission() {
- global $wgOut;
- $wgOut->setPageTitle( wfMsg( 'nocreatetitle' ) );
- $wgOut->addWikiMsg( 'nocreatetext' );
- }
-
- /**
- * Attempt submission
- * @return bool false if output is done, true if the rest of the form should be displayed
- */
- function attemptSave() {
- global $wgUser, $wgOut;
-
- $resultDetails = false;
- # Allow bots to exempt some edits from bot flagging
- $bot = $wgUser->isAllowed( 'bot' ) && $this->bot;
- $status = $this->internalAttemptSave( $resultDetails, $bot );
- // FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
-
- if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
- $this->didSave = true;
- }
-
- switch ( $status->value ) {
- case self::AS_HOOK_ERROR_EXPECTED:
- case self::AS_CONTENT_TOO_BIG:
- case self::AS_ARTICLE_WAS_DELETED:
- case self::AS_CONFLICT_DETECTED:
- case self::AS_SUMMARY_NEEDED:
- case self::AS_TEXTBOX_EMPTY:
- case self::AS_MAX_ARTICLE_SIZE_EXCEEDED:
- case self::AS_END:
- return true;
-
- case self::AS_HOOK_ERROR:
- case self::AS_FILTERING:
- return false;
-
- case self::AS_SUCCESS_NEW_ARTICLE:
- $query = $resultDetails['redirect'] ? 'redirect=no' : '';
- $wgOut->redirect( $this->mTitle->getFullURL( $query ) );
- return false;
-
- case self::AS_SUCCESS_UPDATE:
- $extraQuery = '';
- $sectionanchor = $resultDetails['sectionanchor'];
-
- // Give extensions a chance to modify URL query on update
- wfRunHooks( 'ArticleUpdateBeforeRedirect', array( $this->mArticle, &$sectionanchor, &$extraQuery ) );
-
- if ( $resultDetails['redirect'] ) {
- if ( $extraQuery == '' ) {
- $extraQuery = 'redirect=no';
- } else {
- $extraQuery = 'redirect=no&' . $extraQuery;
- }
- }
- $wgOut->redirect( $this->mTitle->getFullURL( $extraQuery ) . $sectionanchor );
- return false;
-
- case self::AS_SPAM_ERROR:
- $this->spamPageWithContent( $resultDetails['spam'] );
- return false;
-
- case self::AS_BLOCKED_PAGE_FOR_USER:
- $this->blockedPage();
- return false;
-
- case self::AS_IMAGE_REDIRECT_ANON:
- $wgOut->showErrorPage( 'uploadnologin', 'uploadnologintext' );
- return false;
-
- case self::AS_READ_ONLY_PAGE_ANON:
- $this->userNotLoggedInPage();
- return false;
-
- case self::AS_READ_ONLY_PAGE_LOGGED:
- case self::AS_READ_ONLY_PAGE:
- $wgOut->readOnlyPage();
- return false;
-
- case self::AS_RATE_LIMITED:
- $wgOut->rateLimited();
- return false;
-
- case self::AS_NO_CREATE_PERMISSION:
- $this->noCreatePermission();
- return false;
-
- case self::AS_BLANK_ARTICLE:
- $wgOut->redirect( $this->getContextTitle()->getFullURL() );
- return false;
-
- case self::AS_IMAGE_REDIRECT_LOGGED:
- $wgOut->permissionRequired( 'upload' );
- return false;
- }
- }
-
- /**
- * @return Revision
- */
- function getBaseRevision() {
- if ( !$this->mBaseRevision ) {
- $db = wfGetDB( DB_MASTER );
- $baseRevision = Revision::loadFromTimestamp(
- $db, $this->mTitle, $this->edittime );
- return $this->mBaseRevision = $baseRevision;
- } else {
- return $this->mBaseRevision;
- }
- }
}
diff --git a/includes/Exception.php b/includes/Exception.php
index 1f599d66..3bd89b6e 100644
--- a/includes/Exception.php
+++ b/includes/Exception.php
@@ -53,7 +53,7 @@ class MWException extends Exception {
global $wgExceptionHooks;
if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) {
- return; // Just silently ignore
+ return; // Just silently ignore
}
if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
@@ -70,8 +70,9 @@ class MWException extends Exception {
$result = null;
}
- if ( is_string( $result ) )
+ if ( is_string( $result ) ) {
return $result;
+ }
}
}
@@ -118,6 +119,7 @@ class MWException extends Exception {
/**
* If $wgShowExceptionDetails is true, return a text message with a
* backtrace to the error.
+ * @return string
*/
function getText() {
global $wgShowExceptionDetails;
@@ -131,10 +133,12 @@ class MWException extends Exception {
}
}
- /* Return titles of this error page */
+ /**
+ * Return titles of this error page
+ * @return String
+ */
function getPageTitle() {
- global $wgSitename;
- return $this->msg( 'internalerror', "$wgSitename error" );
+ return $this->msg( 'internalerror', "Internal error" );
}
/**
@@ -166,12 +170,7 @@ class MWException extends Exception {
function reportHTML() {
global $wgOut;
if ( $this->useOutputPage() ) {
- $wgOut->setPageTitle( $this->getPageTitle() );
- $wgOut->setRobotPolicy( "noindex,nofollow" );
- $wgOut->setArticleRelated( false );
- $wgOut->enableClientCache( false );
- $wgOut->redirect( '' );
- $wgOut->clearHTML();
+ $wgOut->prepareErrorPage( $this->getPageTitle() );
$hookResult = $this->runHooks( get_class( $this ) );
if ( $hookResult ) {
@@ -182,6 +181,7 @@ class MWException extends Exception {
$wgOut->output();
} else {
+ header( "Content-Type: text/html; charset=utf-8" );
$hookResult = $this->runHooks( get_class( $this ) . "Raw" );
if ( $hookResult ) {
die( $hookResult );
@@ -210,6 +210,10 @@ class MWException extends Exception {
}
}
+ /**
+ * @static
+ * @return bool
+ */
static function isCommandLine() {
return !empty( $GLOBALS['wgCommandLineMode'] );
}
@@ -221,10 +225,17 @@ class MWException extends Exception {
* @ingroup Exception
*/
class FatalError extends MWException {
+
+ /**
+ * @return string
+ */
function getHTML() {
return $this->getMessage();
}
+ /**
+ * @return string
+ */
function getText() {
return $this->getMessage();
}
@@ -255,44 +266,76 @@ class ErrorPageError extends MWException {
function report() {
global $wgOut;
+
$wgOut->showErrorPage( $this->title, $this->msg, $this->params );
$wgOut->output();
}
}
/**
+ * Show an error page on a badtitle.
+ * Similar to ErrorPage, but emit a 400 HTTP error code to let mobile
+ * browser it is not really a valid content.
+ */
+class BadTitleError extends ErrorPageError {
+
+ /**
+ * @param $msg string A message key (default: 'badtitletext')
+ * @param $params Array parameter to wfMsg()
+ */
+ function __construct( $msg = 'badtitletext', $params = null ) {
+ parent::__construct( 'badtitle', $msg, $params );
+ }
+
+ /**
+ * Just like ErrorPageError::report() but additionally set
+ * a 400 HTTP status code (bug 33646).
+ */
+ function report() {
+ global $wgOut;
+
+ // bug 33646: a badtitle error page need to return an error code
+ // to let mobile browser now that it is not a normal page.
+ $wgOut->setStatusCode( 400 );
+ parent::report();
+ }
+
+}
+
+/**
* Show an error when a user tries to do something they do not have the necessary
* permissions for.
* @ingroup Exception
*/
class PermissionsError extends ErrorPageError {
- public $permission;
+ public $permission, $errors;
- function __construct( $permission ) {
+ function __construct( $permission, $errors = array() ) {
global $wgLang;
$this->permission = $permission;
- $groups = array_map(
- array( 'User', 'makeGroupLinkWiki' ),
- User::getGroupsWithPermission( $this->permission )
- );
-
- if( $groups ) {
- parent::__construct(
- 'badaccess',
- 'badaccess-groups',
- array(
- $wgLang->commaList( $groups ),
- count( $groups )
- )
- );
- } else {
- parent::__construct(
- 'badaccess',
- 'badaccess-group0'
+ if ( !count( $errors ) ) {
+ $groups = array_map(
+ array( 'User', 'makeGroupLinkWiki' ),
+ User::getGroupsWithPermission( $this->permission )
);
+
+ if ( $groups ) {
+ $errors[] = array( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
+ } else {
+ $errors[] = array( 'badaccess-group0' );
+ }
}
+
+ $this->errors = $errors;
+ }
+
+ function report() {
+ global $wgOut;
+
+ $wgOut->showPermissionsErrorPage( $this->errors, $this->permission );
+ $wgOut->output();
}
}
@@ -322,6 +365,7 @@ class ThrottledError extends ErrorPageError {
'actionthrottledtext'
);
}
+
public function report(){
global $wgOut;
$wgOut->setStatusCode( 503 );
@@ -335,10 +379,15 @@ class ThrottledError extends ErrorPageError {
*/
class UserBlockedError extends ErrorPageError {
public function __construct( Block $block ){
- global $wgLang;
-
- $blockerUserpage = $block->getBlocker()->getUserPage();
- $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
+ 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 == '' ) {
@@ -355,8 +404,8 @@ class UserBlockedError extends ErrorPageError {
array(
$link,
$reason,
- wfGetIP(),
- $block->getBlocker()->getName(),
+ $wgRequest->getIP(),
+ $block->getByName(),
$block->getId(),
$wgLang->formatExpiry( $block->mExpiry ),
$intended,
@@ -367,6 +416,55 @@ class UserBlockedError extends ErrorPageError {
}
/**
+ * Show an error that looks like an HTTP server error.
+ * Replacement for wfHttpError().
+ *
+ * @ingroup Exception
+ */
+class HttpError extends MWException {
+ private $httpCode, $header, $content;
+
+ /**
+ * Constructor
+ *
+ * @param $httpCode Integer: HTTP status code to send to the client
+ * @param $content String|Message: content of the message
+ * @param $header String|Message: content of the header (\<title\> and \<h1\>)
+ */
+ public function __construct( $httpCode, $content, $header = null ){
+ parent::__construct( $content );
+ $this->httpCode = (int)$httpCode;
+ $this->header = $header;
+ $this->content = $content;
+ }
+
+ public function reportHTML() {
+ $httpMessage = HttpStatus::getMessage( $this->httpCode );
+
+ header( "Status: {$this->httpCode} {$httpMessage}" );
+ header( 'Content-type: text/html; charset=utf-8' );
+
+ if ( $this->header === null ) {
+ $header = $httpMessage;
+ } elseif ( $this->header instanceof Message ) {
+ $header = $this->header->escaped();
+ } else {
+ $header = htmlspecialchars( $this->header );
+ }
+
+ if ( $this->content instanceof Message ) {
+ $content = $this->content->escaped();
+ } else {
+ $content = htmlspecialchars( $this->content );
+ }
+
+ print "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n".
+ "<html><head><title>$header</title></head>\n" .
+ "<body><h1>$header</h1><p>$content</p></body></html>\n";
+ }
+}
+
+/**
* Handler class for MWExceptions
* @ingroup Exception
*/
diff --git a/includes/Export.php b/includes/Export.php
index 87c735c1..7773d03c 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -56,7 +56,7 @@ class WikiExporter {
* make additional queries to pull source data while the
* main query is still running.
*
- * @param $db Database
+ * @param $db DatabaseBase
* @param $history Mixed: one of WikiExporter::FULL, WikiExporter::CURRENT,
* WikiExporter::RANGE or WikiExporter::STABLE,
* or an associative array:
@@ -380,7 +380,7 @@ class XmlDumpWriter {
* @return string
*/
function schemaVersion() {
- return "0.5";
+ return "0.6";
}
/**
@@ -477,10 +477,22 @@ 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( 'id', array(), strval( $row->page_id ) ) . "\n";
if ( $row->page_is_redirect ) {
- $out .= ' ' . Xml::element( 'redirect', array() ) . "\n";
+ $page = WikiPage::factory( $title );
+ $redirect = $page->getRedirectTarget();
+ if ( $redirect instanceOf Title && $redirect->isValidRedirectTarget() ) {
+ $out .= ' ' . Xml::element( 'redirect', array( 'title' => self::canonicalTitle( $redirect ) ) ) . "\n";
+ }
+ }
+
+ if ( $row->rev_sha1 ) {
+ $out .= " " . Xml::element('sha1', null, strval($row->rev_sha1) ) . "\n";
+ } else {
+ $out .= " <sha1/>\n";
}
+
if ( $row->page_restrictions != '' ) {
$out .= ' ' . Xml::element( 'restrictions', array(),
strval( $row->page_restrictions ) ) . "\n";
@@ -538,12 +550,12 @@ class XmlDumpWriter {
// Raw text from the database may have invalid chars
$text = strval( Revision::getRevisionText( $row ) );
$out .= " " . Xml::elementClean( 'text',
- array( 'xml:space' => 'preserve', 'bytes' => $row->rev_len ),
+ array( 'xml:space' => 'preserve', 'bytes' => intval( $row->rev_len ) ),
strval( $text ) ) . "\n";
} else {
// Stub output
$out .= " " . Xml::element( 'text',
- array( 'id' => $row->rev_text_id, 'bytes' => $row->rev_len ),
+ array( 'id' => $row->rev_text_id, 'bytes' => intval( $row->rev_len ) ),
"" ) . "\n";
}
@@ -609,7 +621,7 @@ class XmlDumpWriter {
function writeContributor( $id, $text ) {
$out = " <contributor>\n";
- if ( $id ) {
+ if ( $id || !IP::isValid( $text ) ) {
$out .= " " . Xml::elementClean( 'username', null, strval( $text ) ) . "\n";
$out .= " " . Xml::element( 'id', null, strval( $id ) ) . "\n";
} else {
@@ -677,9 +689,10 @@ class XmlDumpWriter {
* canonical namespace. This skips any special-casing such as gendered
* user namespaces -- which while useful, are not yet listed in the
* XML <siteinfo> data so are unsafe in export.
- *
+ *
* @param Title $title
* @return string
+ * @since 1.18
*/
public static function canonicalTitle( Title $title ) {
if ( $title->getInterwiki() ) {
@@ -689,7 +702,7 @@ class XmlDumpWriter {
global $wgContLang;
$prefix = str_replace( '_', ' ', $wgContLang->getNsText( $title->getNamespace() ) );
- if ($prefix !== '') {
+ if ( $prefix !== '' ) {
$prefix .= ':';
}
@@ -892,8 +905,6 @@ class DumpBZip2Output extends DumpPipeOutput {
* @ingroup Dump
*/
class Dump7ZipOutput extends DumpPipeOutput {
- protected $filename;
-
function __construct( $file ) {
$command = $this->setup7zCommand( $file );
parent::__construct( $command );
@@ -908,10 +919,6 @@ class Dump7ZipOutput extends DumpPipeOutput {
return( $command );
}
- function closeRenameAndReopen( $newname ) {
- $this->closeAndRename( $newname, true );
- }
-
function closeAndRename( $newname, $open = false ) {
$newname = $this->checkRenameArgCount( $newname );
if ( $newname ) {
@@ -919,7 +926,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
proc_close( $this->procOpenResource );
$this->renameOrException( $newname );
if ( $open ) {
- $command = $this->setup7zCommand( $file );
+ $command = $this->setup7zCommand( $this->filename );
$this->startCommand( $command );
}
}
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
index bf97c1a5..b8704758 100644
--- a/includes/ExternalEdit.php
+++ b/includes/ExternalEdit.php
@@ -18,60 +18,99 @@
* and save the modified data back to the server.
*
*/
-class ExternalEdit {
+class ExternalEdit extends ContextSource {
+
/**
- * Title to perform the edit on
- * @var Title
+ * Array of URLs to link to
+ * @var Array
*/
- private $title;
+ private $urls;
/**
- * Mode of editing
- * @var String
+ * Constructor
+ * @param $context IContextSource context to use
+ * @param $urls array
*/
- private $mode;
+ public function __construct( IContextSource $context, array $urls = array() ) {
+ $this->setContext( $context );
+ $this->urls = $urls;
+ }
/**
- * Constructor
- * @param $title Title object we're performing the edit on
- * @param $mode String What mode we're using. Only 'file' has any effect
+ * Check whether external edit or diff should be used.
+ *
+ * @param $context IContextSource context to use
+ * @param $type String can be either 'edit' or 'diff'
+ * @return Bool
*/
- public function __construct( $title, $mode ) {
- $this->title = $title;
- $this->mode = $mode;
+ 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 edit() {
- global $wgOut, $wgScript, $wgScriptPath, $wgCanonicalServer, $wgLang;
- $wgOut->disable();
- header( 'Content-type: application/x-external-editor; charset=utf-8' );
- header( 'Cache-control: no-cache' );
+ 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( $this->mode == "file" ) {
+ if ( count( $this->urls ) ) {
+ $urls = $this->urls;
+ $type = "Diff text";
+ } elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
$type = "Edit file";
- $image = wfLocalFile( $this->title );
- $url = $image->getCanonicalURL();
- $extension = $image->getExtension();
+ $image = wfLocalFile( $this->getTitle() );
+ $urls = array( 'File' => array(
+ 'Extension' => $image->getExtension(),
+ 'URL' => $image->getCanonicalURL()
+ ) );
} else {
$type = "Edit text";
- $url = $this->title->getCanonicalURL(
- array( 'action' => 'edit', 'internaledit' => 'true' ) );
# *.wiki file extension is used by some editors for syntax
# highlighting, so we follow that convention
- $extension = "wiki";
+ $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";
+ }
}
- $special = $wgLang->getNsText( NS_SPECIAL );
+
+ $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 .
+; 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
@@ -80,10 +119,7 @@ Script={$wgCanonicalServer}{$wgScript}
Server={$wgCanonicalServer}
Path={$wgScriptPath}
Special namespace=$special
-
-[File]
-Extension=$extension
-URL=$url
+$files
CONTROL;
echo $control;
}
diff --git a/includes/ExternalStoreDB.php b/includes/ExternalStoreDB.php
index 552c3109..4920a91c 100644
--- a/includes/ExternalStoreDB.php
+++ b/includes/ExternalStoreDB.php
@@ -34,7 +34,7 @@ class ExternalStoreDB {
$wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false;
$lb =& $this->getLoadBalancer( $cluster );
- if ( !in_array( "DB://" . $cluster, $wgDefaultExternalStore ) ) {
+ if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) {
wfDebug( "read only external store" );
$lb->allowLagged(true);
} else {
@@ -120,12 +120,12 @@ class ExternalStoreDB {
wfDebug( "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
$dbr =& $this->getSlave( $cluster );
- $ret = $dbr->selectField( $this->getTable( $dbr ), 'blob_text', array( 'blob_id' => $id ) );
+ $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" );
// Try the master
$dbw =& $this->getMaster( $cluster );
- $ret = $dbw->selectField( $this->getTable( $dbw ), 'blob_text', array( 'blob_id' => $id ) );
+ $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" );
}
diff --git a/includes/FakeTitle.php b/includes/FakeTitle.php
index 515ff387..8415ec08 100644
--- a/includes/FakeTitle.php
+++ b/includes/FakeTitle.php
@@ -31,9 +31,9 @@ class FakeTitle extends Title {
function getPrefixedURL() { $this->error(); }
function getFullURL( $query = '', $variant = false ) { $this->error(); }
function getLocalURL( $query = '', $variant = false ) { $this->error(); }
- function getLinkUrl( $query = array(), $variant = false ) { $this->error(); }
- function escapeLocalURL( $query = '' ) { $this->error(); }
- function escapeFullURL( $query = '' ) { $this->error(); }
+ function getLinkURL( $query = array(), $variant = false ) { $this->error(); }
+ function escapeLocalURL( $query = '', $query2 = false ) { $this->error(); }
+ function escapeFullURL( $query = '', $query2 = false ) { $this->error(); }
function getInternalURL( $query = '', $variant = false ) { $this->error(); }
function getEditURL() { $this->error(); }
function getEscapedText() { $this->error(); }
@@ -42,9 +42,9 @@ class FakeTitle extends Title {
function isProtected( $action = '' ) { $this->error(); }
function isConversionTable() { $this->error(); }
function userIsWatching() { $this->error(); }
- function quickUserCan( $action ) { $this->error(); }
- function isNamespaceProtected() { $this->error(); }
- function userCan( $action, $doExpensiveQueries = true ) { $this->error(); }
+ function quickUserCan( $action, $user = null ) { $this->error(); }
+ function isNamespaceProtected( User $user ) { $this->error(); }
+ function userCan( $action, $user = null, $doExpensiveQueries = true ) { $this->error(); }
function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true, $ignoreErrors = array() ) { $this->error(); }
function updateTitleProtection( $create_perm, $reason, $expiry ) { $this->error(); }
function deleteTitleProtection() { $this->error(); }
@@ -56,7 +56,6 @@ class FakeTitle extends Title {
function getSubpages( $limit = -1 ) { $this->error(); }
function isCssJsSubpage() { $this->error(); }
function isCssOrJsPage() { $this->error(); }
- function isValidCssJsSubpage() { $this->error(); }
function getSkinFromCssJsSubpage() { $this->error(); }
function isCssSubpage() { $this->error(); }
function isJsSubpage() { $this->error(); }
@@ -102,7 +101,7 @@ class FakeTitle extends Title {
function getNextRevisionID( $revId, $flags=0 ) { $this->error(); }
function getFirstRevision( $flags=0 ) { $this->error(); }
function isNewPage() { $this->error(); }
- function getEarliestRevTime() { $this->error(); }
+ function getEarliestRevTime( $flags = 0 ) { $this->error(); }
function countRevisionsBetween( $old, $new ) { $this->error(); }
function equals( Title $title ) { $this->error(); }
function exists() { $this->error(); }
@@ -112,8 +111,6 @@ class FakeTitle extends Title {
function touchLinks() { $this->error(); }
function getTouched( $db = null ) { $this->error(); }
function getNotificationTimestamp( $user = null ) { $this->error(); }
- function trackbackURL() { $this->error(); }
- function trackbackRDF() { $this->error(); }
function getNamespaceKey( $prepend = 'nstab-' ) { $this->error(); }
function isSpecialPage() { $this->error(); }
function isSpecial( $name ) { $this->error(); }
diff --git a/includes/Fallback.php b/includes/Fallback.php
index 2cca1e81..b517cd16 100644
--- a/includes/Fallback.php
+++ b/includes/Fallback.php
@@ -22,7 +22,13 @@
* Fallback functions for PHP installed without mbstring support
*/
class Fallback {
-
+
+ /**
+ * @param $from
+ * @param $to
+ * @param $string
+ * @return string
+ */
public static function iconv( $from, $to, $string ) {
if ( substr( $to, -8 ) == '//IGNORE' ) {
$to = substr( $to, 0, strlen( $to ) - 8 );
@@ -48,7 +54,7 @@ class Fallback {
* Larger offsets are still fairly efficient for Latin text, but
* can be up to 100x slower than native if the text is heavily
* multibyte and we have to slog through a few hundred kb.
- *
+ *
* @param $str
* @param $start
* @param $count string
@@ -60,22 +66,27 @@ class Fallback {
$split = self::mb_substr_split_unicode( $str, intval( $start ) );
$str = substr( $str, $split );
}
-
+
if( $count !== 'end' ) {
$split = self::mb_substr_split_unicode( $str, intval( $count ) );
$str = substr( $str, 0, $split );
}
-
+
return $str;
}
-
+
+ /**
+ * @param $str
+ * @param $splitPos
+ * @return int
+ */
public static function mb_substr_split_unicode( $str, $splitPos ) {
if( $splitPos == 0 ) {
return 0;
}
-
+
$byteLen = strlen( $str );
-
+
if( $splitPos > 0 ) {
if( $splitPos > 256 ) {
// Optimize large string offsets by skipping ahead N bytes.
@@ -90,7 +101,7 @@ class Fallback {
$charPos = 0;
$bytePos = 0;
}
-
+
while( $charPos++ < $splitPos ) {
++$bytePos;
// Move past any tail bytes
@@ -110,10 +121,10 @@ class Fallback {
}
}
}
-
+
return $bytePos;
}
-
+
/**
* Fallback implementation of mb_strlen, hardcoded to UTF-8.
* @param string $str
@@ -123,20 +134,20 @@ class Fallback {
public static function mb_strlen( $str, $enc = '' ) {
$counts = count_chars( $str );
$total = 0;
-
+
// Count ASCII bytes
for( $i = 0; $i < 0x80; $i++ ) {
$total += $counts[$i];
}
-
+
// Count multibyte sequence heads
for( $i = 0xc0; $i < 0xff; $i++ ) {
$total += $counts[$i];
}
return $total;
}
-
-
+
+
/**
* Fallback implementation of mb_strpos, hardcoded to UTF-8.
* @param $haystack String
@@ -147,17 +158,17 @@ class Fallback {
*/
public static function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
$needle = preg_quote( $needle, '/' );
-
+
$ar = array();
preg_match( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
-
+
if( isset( $ar[0][1] ) ) {
return $ar[0][1];
} else {
return false;
}
- }
-
+ }
+
/**
* Fallback implementation of mb_strrpos, hardcoded to UTF-8.
* @param $haystack String
@@ -168,10 +179,10 @@ class Fallback {
*/
public static function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
$needle = preg_quote( $needle, '/' );
-
+
$ar = array();
preg_match_all( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
-
+
if( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
isset( $ar[0][count( $ar[0] ) - 1][1] ) ) {
return $ar[0][count( $ar[0] ) - 1][1];
@@ -196,5 +207,5 @@ class Fallback {
}
return false;
}
-
+
}
diff --git a/includes/Feed.php b/includes/Feed.php
index ef33c78f..351f3572 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -39,42 +39,34 @@ class FeedItem {
/**
* @var Title
*/
- var $Title = 'Wiki';
- var $Description = '';
- var $Url = '';
- var $Date = '';
- var $Author = '';
- var $UniqueId = '';
- var $RSSIsPermalink;
+ var $title;
- /**
- * Constructor
- *
- * @param $Title String|Title Item's title
- * @param $Description String
- * @param $Url String: URL uniquely designating the item.
- * @param $Date String: Item's date
- * @param $Author String: Author's user name
- * @param $Comments String
- */
- function __construct( $Title, $Description, $Url, $Date = '', $Author = '', $Comments = '' ) {
- $this->Title = $Title;
- $this->Description = $Description;
- $this->Url = $Url;
- $this->UniqueId = $Url;
- $this->RSSIsPermalink = false;
- $this->Date = $Date;
- $this->Author = $Author;
- $this->Comments = $Comments;
- }
+ var $description;
+ var $url;
+ var $date;
+ var $author;
+ var $uniqueId;
+ var $comments;
+ var $rssIsPermalink = false;
/**
- * Get the last touched timestamp
+ * Constructor
*
- * @return String last-touched timestamp
- */
- public function getLastMod() {
- return $this->Title->getTouched();
+ * @param $title String|Title Item's title
+ * @param $description String
+ * @param $url String: URL uniquely designating the item.
+ * @param $date String: Item's date
+ * @param $author String: Author's user name
+ * @param $comments String
+ */
+ function __construct( $title, $description, $url, $date = '', $author = '', $comments = '' ) {
+ $this->title = $title;
+ $this->description = $description;
+ $this->url = $url;
+ $this->uniqueId = $url;
+ $this->date = $date;
+ $this->author = $author;
+ $this->comments = $comments;
}
/**
@@ -95,8 +87,8 @@ class FeedItem {
* @return String
*/
public function getUniqueId() {
- if ( $this->UniqueId ) {
- return $this->xmlEncode( $this->UniqueId );
+ if ( $this->uniqueId ) {
+ return $this->xmlEncode( $this->uniqueId );
}
}
@@ -104,11 +96,11 @@ class FeedItem {
* set the unique id of an item
*
* @param $uniqueId String: unique id for the item
- * @param $RSSisPermalink Boolean: set to true if the guid (unique id) is a permalink (RSS feeds only)
+ * @param $rssIsPermalink Boolean: set to true if the guid (unique id) is a permalink (RSS feeds only)
*/
- public function setUniqueId($uniqueId, $RSSisPermalink = false) {
- $this->UniqueId = $uniqueId;
- $this->RSSIsPermalink = $RSSisPermalink;
+ public function setUniqueId( $uniqueId, $rssIsPermalink = false ) {
+ $this->uniqueId = $uniqueId;
+ $this->rssIsPermalink = $rssIsPermalink;
}
/**
@@ -117,17 +109,7 @@ class FeedItem {
* @return String
*/
public function getTitle() {
- return $this->xmlEncode( $this->Title );
- }
-
- /**
- * Get the DB prefixed title
- *
- * @return String the prefixed title, with underscores and
- * any interwiki and namespace prefixes
- */
- public function getDBPrefixedTitle() {
- return $this->Title->getPrefixedDBKey();
+ return $this->xmlEncode( $this->title );
}
/**
@@ -136,7 +118,7 @@ class FeedItem {
* @return String
*/
public function getUrl() {
- return $this->xmlEncode( $this->Url );
+ return $this->xmlEncode( $this->url );
}
/**
@@ -145,7 +127,7 @@ class FeedItem {
* @return String
*/
public function getDescription() {
- return $this->xmlEncode( $this->Description );
+ return $this->xmlEncode( $this->description );
}
/**
@@ -164,7 +146,7 @@ class FeedItem {
* @return String
*/
public function getDate() {
- return $this->Date;
+ return $this->date;
}
/**
@@ -173,7 +155,7 @@ class FeedItem {
* @return String
*/
public function getAuthor() {
- return $this->xmlEncode( $this->Author );
+ return $this->xmlEncode( $this->author );
}
/**
@@ -182,7 +164,7 @@ class FeedItem {
* @return String
*/
public function getComments() {
- return $this->xmlEncode( $this->Comments );
+ return $this->xmlEncode( $this->comments );
}
/**
@@ -325,7 +307,7 @@ class RSSFeed extends ChannelFeed {
<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>
+ <guid<?php if( !$item->rssIsPermalink ) print ' isPermaLink="false"' ?>><?php print $item->getUniqueId() ?></guid>
<description><?php print $item->getDescription() ?></description>
<?php if( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ) ?></pubDate><?php } ?>
<?php if( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor() ?></dc:creator><?php }?>
diff --git a/includes/FeedUtils.php b/includes/FeedUtils.php
index 4502c3a8..cf42329b 100644
--- a/includes/FeedUtils.php
+++ b/includes/FeedUtils.php
@@ -31,16 +31,15 @@ class FeedUtils {
* @return Boolean
*/
public static function checkFeedOutput( $type ) {
- global $wgFeed, $wgFeedClasses;
+ global $wgOut, $wgFeed, $wgFeedClasses;
if ( !$wgFeed ) {
- global $wgOut;
$wgOut->addWikiMsg( 'feed-unavailable' );
return false;
}
if( !isset( $wgFeedClasses[$type] ) ) {
- wfHttpError( 500, "Internal Server Error", "Unsupported feed type." );
+ $wgOut->addWikiMsg( 'feed-invalid' );
return false;
}
@@ -54,24 +53,21 @@ class FeedUtils {
* @return String
*/
public static function formatDiff( $row ) {
- global $wgUser;
-
$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_deleted & LogPage::DELETED_ACTION ) {
- $actiontext = wfMsgHtml('rev-deleted-event');
- } else {
- $actiontext = LogPage::actionText( $row->rc_log_type, $row->rc_log_action,
- $titleObj, $wgUser->getSkin(), LogPage::extractParams($row->rc_params,true,true) );
- }
+ $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) ? wfMsgHtml('rev-deleted-comment') : $row->rc_comment,
- $actiontext );
+ ($row->rc_deleted & Revision::DELETED_COMMENT)
+ ? wfMsgHtml('rev-deleted-comment')
+ : $row->rc_comment,
+ $actiontext
+ );
}
/**
@@ -86,88 +82,109 @@ class FeedUtils {
* @return String
*/
public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext='' ) {
- global $wgFeedDiffCutoff, $wgLang, $wgUser;
+ global $wgFeedDiffCutoff, $wgLang;
wfProfileIn( __METHOD__ );
- $skin = $wgUser->getSkin();
# log enties
$completeText = '<p>' . implode( ' ',
array_filter(
array(
$actiontext,
- $skin->formatComment( $comment ) ) ) ) . "</p>\n";
+ Linker::formatComment( $comment ) ) ) ) . "</p>\n";
- //NOTE: Check permissions for anonymous users, not current user.
- // No "privileged" version should end up in the cache.
- // Most feed readers will not log in anway.
+ // NOTE: Check permissions for anonymous users, not current user.
+ // No "privileged" version should end up in the cache.
+ // Most feed readers will not log in anway.
$anon = new User();
$accErrors = $title->getUserPermissionsErrors( 'read', $anon, true );
- if( $title->getNamespace() >= 0 && !$accErrors && $newid ) {
- if( $oldid ) {
- wfProfileIn( __METHOD__."-dodiff" );
-
- #$diffText = $de->getDiff( wfMsg( 'revisionasof',
- # $wgLang->timeanddate( $timestamp ),
- # $wgLang->date( $timestamp ),
- # $wgLang->time( $timestamp ) ),
- # wfMsg( 'currentrev' ) );
-
- // Don't bother generating the diff if we won't be able to show it
- if ( $wgFeedDiffCutoff > 0 ) {
- $de = new DifferenceEngine( $title, $oldid, $newid );
- $diffText = $de->getDiff(
- wfMsg( 'previousrevision' ), // hack
- wfMsg( 'revisionasof',
- $wgLang->timeanddate( $timestamp ),
- $wgLang->date( $timestamp ),
- $wgLang->time( $timestamp ) ) );
- }
-
- if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
- // Omit large diffs
- $diffLink = $title->escapeFullUrl(
- 'diff=' . $newid .
- '&oldid=' . $oldid );
- $diffText = '<a href="' .
- $diffLink .
- '">' .
- htmlspecialchars( wfMsgForContent( 'showdiff' ) ) .
- '</a>';
- } elseif ( $diffText === false ) {
- // Error in diff engine, probably a missing revision
- $diffText = "<p>Can't load revision $newid</p>";
- } else {
- // Diff output fine, clean up any illegal UTF-8
- $diffText = UtfNormal::cleanUp( $diffText );
- $diffText = self::applyDiffStyle( $diffText );
- }
- wfProfileOut( __METHOD__."-dodiff" );
+ // 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 ) {
+ wfProfileOut( __METHOD__ );
+ return $completeText;
+ }
+
+ if( $oldid ) {
+ wfProfileIn( __METHOD__."-dodiff" );
+
+ #$diffText = $de->getDiff( wfMsg( 'revisionasof',
+ # $wgLang->timeanddate( $timestamp ),
+ # $wgLang->date( $timestamp ),
+ # $wgLang->time( $timestamp ) ),
+ # wfMsg( 'currentrev' ) );
+
+ // Don't bother generating the diff if we won't be able to show it
+ if ( $wgFeedDiffCutoff > 0 ) {
+ $de = new DifferenceEngine( $title, $oldid, $newid );
+ $diffText = $de->getDiff(
+ wfMsg( 'previousrevision' ), // hack
+ wfMsg( 'revisionasof',
+ $wgLang->timeanddate( $timestamp ),
+ $wgLang->date( $timestamp ),
+ $wgLang->time( $timestamp ) ) );
+ }
+
+ if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
+ // Omit large diffs
+ $diffText = self::getDiffLink( $title, $newid, $oldid );
+ } elseif ( $diffText === false ) {
+ // Error in diff engine, probably a missing revision
+ $diffText = "<p>Can't load revision $newid</p>";
+ } else {
+ // Diff output fine, clean up any illegal UTF-8
+ $diffText = UtfNormal::cleanUp( $diffText );
+ $diffText = self::applyDiffStyle( $diffText );
+ }
+ wfProfileOut( __METHOD__."-dodiff" );
+ } else {
+ $rev = Revision::newFromId( $newid );
+ if( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
+ $newtext = '';
+ } else {
+ $newtext = $rev->getText();
+ }
+ if ( $wgFeedDiffCutoff <= 0 || strlen( $newtext ) > $wgFeedDiffCutoff ) {
+ // Omit large new page diffs, bug 29110
+ $diffText = self::getDiffLink( $title, $newid );
} else {
- $rev = Revision::newFromId( $newid );
- if( is_null( $rev ) ) {
- $newtext = '';
- } else {
- $newtext = $rev->getText();
- }
$diffText = '<p><b>' . wfMsg( 'newpage' ) . '</b></p>' .
'<div>' . nl2br( htmlspecialchars( $newtext ) ) . '</div>';
}
- $completeText .= $diffText;
}
+ $completeText .= $diffText;
wfProfileOut( __METHOD__ );
return $completeText;
}
/**
+ * Generates a diff link. Used when the full diff is not wanted for example
+ * when $wgFeedDiffCutoff is 0.
+ *
+ * @param $title Title object: used to generate the diff URL
+ * @param $newid Integer newid for this diff
+ * @param $oldid Integer|null oldid for the diff. Null means it is a new article
+ */
+ protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
+ $queryParameters = ($oldid == null)
+ ? "diff={$newid}"
+ : "diff={$newid}&oldid={$oldid}" ;
+ $diffUrl = $title->getFullUrl( $queryParameters );
+
+ $diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
+ wfMsgForContent( 'showdiff' ) );
+
+ return $diffLink;
+ }
+
+ /**
* Hacky application of diff styles for the feeds.
* Might be 'cleaner' to use DOM or XSLT or something,
* but *gack* it's a pain in the ass.
*
* @param $text String: diff's HTML output
* @return String: modified HTML
- * @private
*/
public static function applyDiffStyle( $text ) {
$styles = array(
diff --git a/includes/FileDeleteForm.php b/includes/FileDeleteForm.php
index 515768ff..11f9aea5 100644
--- a/includes/FileDeleteForm.php
+++ b/includes/FileDeleteForm.php
@@ -8,9 +8,19 @@
*/
class FileDeleteForm {
+ /**
+ * @var Title
+ */
private $title = null;
+
+ /**
+ * @var File
+ */
private $file = null;
+ /**
+ * @var File
+ */
private $oldfile = null;
private $oldimage = '';
@@ -29,30 +39,31 @@ class FileDeleteForm {
* pending authentication, confirmation, etc.
*/
public function execute() {
- global $wgOut, $wgRequest, $wgUser;
- $this->setHeaders();
+ global $wgOut, $wgRequest, $wgUser, $wgUploadMaintenance;
- if( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
+ $permissionErrors = $this->title->getUserPermissionsErrors( 'delete', $wgUser );
+ if ( count( $permissionErrors ) ) {
+ throw new PermissionsError( 'delete', $permissionErrors );
}
- $permission_errors = $this->title->getUserPermissionsErrors('delete', $wgUser);
- if (count($permission_errors)>0) {
- $wgOut->showPermissionsErrorPage( $permission_errors );
- return;
+
+ if ( wfReadOnly() ) {
+ throw new ReadOnlyError;
}
+ if ( $wgUploadMaintenance ) {
+ throw new ErrorPageError( 'filedelete-maintenance-title', 'filedelete-maintenance' );
+ }
+
+ $this->setHeaders();
+
$this->oldimage = $wgRequest->getText( 'oldimage', false );
$token = $wgRequest->getText( 'wpEditToken' );
# Flag to hide all contents of the archived revisions
$suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed('suppressrevision');
- if( $this->oldimage && !self::isValidOldSpec($this->oldimage) ) {
- $wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars( $this->oldimage ) );
- return;
- }
- 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) ) {
$wgOut->addHTML( $this->prepareMessage( 'filedelete-nofile' ) );
@@ -62,26 +73,38 @@ class FileDeleteForm {
// Perform the deletion if appropriate
if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
- $this->DeleteReasonList = $wgRequest->getText( 'wpDeleteReasonList' );
- $this->DeleteReason = $wgRequest->getText( 'wpReason' );
- $reason = $this->DeleteReasonList;
- if ( $reason != 'other' && $this->DeleteReason != '') {
+ $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList' );
+ $deleteReason = $wgRequest->getText( 'wpReason' );
+
+ if ( $deleteReasonList == 'other' ) {
+ $reason = $deleteReason;
+ } elseif ( $deleteReason != '' ) {
// Entry from drop down menu + additional comment
- $reason .= wfMsgForContent( 'colon-separator' ) . $this->DeleteReason;
- } elseif ( $reason == 'other' ) {
- $reason = $this->DeleteReason;
+ $reason = $deleteReasonList . wfMsgForContent( 'colon-separator' ) . $deleteReason;
+ } else {
+ $reason = $deleteReasonList;
}
- $status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress );
+ $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->addHTML( '<span class="error">' );
$wgOut->addWikiText( $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) );
+ $wgOut->addHTML( '</span>' );
+ }
if( $status->ok ) {
- $wgOut->setPagetitle( wfMsg( 'actioncomplete' ) );
+ $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 ( $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn() ) {
+ WatchAction::doWatch( $this->title, $wgUser );
+ } elseif ( $this->title->userIsWatching() ) {
+ WatchAction::doUnwatch( $this->title, $wgUser );
+ }
}
return;
}
@@ -94,17 +117,20 @@ class FileDeleteForm {
* Really delete the file
*
* @param $title Title object
- * @param $file File object
+ * @param File $file: file object
* @param $oldimage String: archive name
* @param $reason String: reason of the deletion
* @param $suppress Boolean: whether to mark all deleted versions as restricted
+ * @param $user User object performing the request
*/
- public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress ) {
- global $wgUser;
- $article = null;
- $status = Status::newFatal( 'error' );
+ public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress, User $user = null ) {
+ if ( $user === null ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
if( $oldimage ) {
+ $page = null;
$status = $file->deleteOld( $oldimage, $reason, $suppress );
if( $status->ok ) {
// Need to do a log item
@@ -116,20 +142,17 @@ class FileDeleteForm {
$log->addEntry( 'delete', $title, $logComment );
}
} else {
- $id = $title->getArticleID( Title::GAID_FOR_UPDATE );
- $article = new Article( $title );
+ $status = Status::newFatal( 'cannotdelete',
+ wfEscapeWikiText( $title->getPrefixedText() )
+ );
+ $page = WikiPage::factory( $title );
$dbw = wfGetDB( DB_MASTER );
try {
// delete the associated article first
- if( $article->doDeleteArticle( $reason, $suppress, $id, false ) ) {
- global $wgRequest;
- if ( $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn() ) {
- WatchAction::doWatch( $title, $wgUser );
- } elseif ( $title->userIsWatching() ) {
- WatchAction::doUnwatch( $title, $wgUser );
- }
+ $error = '';
+ if ( $page->doDeleteArticleReal( $reason, $suppress, 0, false, $error, $user ) >= WikiPage::DELETE_SUCCESS ) {
$status = $file->delete( $reason, $suppress );
- if( $status->ok ) {
+ if( $status->isOK() ) {
$dbw->commit();
} else {
$dbw->rollback();
@@ -141,8 +164,10 @@ class FileDeleteForm {
throw $e;
}
}
- if( $status->isGood() )
- wfRunHooks('FileDeleteComplete', array( &$file, &$oldimage, &$article, &$wgUser, &$reason));
+
+ if ( $status->isOK() ) {
+ wfRunHooks( 'FileDeleteComplete', array( &$file, &$oldimage, &$page, &$user, &$reason ) );
+ }
return $status;
}
@@ -170,7 +195,7 @@ class FileDeleteForm {
'id' => 'mw-img-deleteconfirm' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'filedelete-legend' ) ) .
- Html::hidden( 'wpEditToken', $wgUser->editToken( $this->oldimage ) ) .
+ Html::hidden( 'wpEditToken', $wgUser->getEditToken( $this->oldimage ) ) .
$this->prepareMessage( 'filedelete-intro' ) .
Xml::openElement( 'table', array( 'id' => 'mw-img-deleteconfirm-table' ) ) .
"<tr>
@@ -193,7 +218,7 @@ class FileDeleteForm {
"</td>
</tr>
{$suppress}";
- if( $wgUser->isLoggedIn() ) {
+ if( $wgUser->isLoggedIn() ) {
$form .= "
<tr>
<td></td>
@@ -216,9 +241,8 @@ class FileDeleteForm {
Xml::closeElement( 'form' );
if ( $wgUser->isAllowed( 'editinterface' ) ) {
- $skin = $wgUser->getSkin();
$title = Title::makeTitle( NS_MEDIAWIKI, 'Filedelete-reason-dropdown' );
- $link = $skin->link(
+ $link = Linker::link(
$title,
wfMsgHtml( 'filedelete-edit-reasonlist' ),
array(),
@@ -236,7 +260,7 @@ class FileDeleteForm {
private function showLogEntries() {
global $wgOut;
$wgOut->addHTML( '<h2>' . htmlspecialchars( LogPage::logName( 'delete' ) ) . "</h2>\n" );
- LogEventsList::showLogExtract( $wgOut, 'delete', $this->title->getPrefixedText() );
+ LogEventsList::showLogExtract( $wgOut, 'delete', $this->title );
}
/**
@@ -270,19 +294,10 @@ class FileDeleteForm {
* Set headers, titles and other bits
*/
private function setHeaders() {
- global $wgOut, $wgUser;
- $wgOut->setPageTitle( wfMsg( 'filedelete', $this->title->getText() ) );
+ global $wgOut;
+ $wgOut->setPageTitle( wfMessage( 'filedelete', $this->title->getText() ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setSubtitle( wfMsg(
- 'filedelete-backlink',
- $wgUser->getSkin()->link(
- $this->title,
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- )
- ) );
+ $wgOut->addBacklinkSubtitle( $this->title );
}
/**
@@ -301,6 +316,9 @@ class FileDeleteForm {
* value was provided, does it correspond to an
* existing, local, old version of this file?
*
+ * @param $file File
+ * @param $oldfile File
+ * @param $oldimage File
* @return bool
*/
public static function haveDeletableFile(&$file, &$oldfile, $oldimage) {
diff --git a/includes/ForkController.php b/includes/ForkController.php
index d87dfb1e..9cacef54 100644
--- a/includes/ForkController.php
+++ b/includes/ForkController.php
@@ -34,7 +34,7 @@ class ForkController {
public function __construct( $numProcs, $flags = 0 ) {
if ( php_sapi_name() != 'cli' ) {
- throw new MWException( "MultiProcess cannot be used from the web." );
+ throw new MWException( "ForkController cannot be used from the web." );
}
$this->procsToStart = $numProcs;
$this->flags = $flags;
@@ -119,13 +119,13 @@ class ForkController {
// Don't share DB or memcached connections
wfGetLBFactory()->destroyInstance();
ObjectCache::clear();
- unset( $wgMemc );
+ $wgMemc = null;
}
/**
* Fork a number of worker processes.
*
- * return string
+ * @return string
*/
protected function forkWorkers( $numProcs ) {
$this->prepareEnvironment();
diff --git a/includes/FormOptions.php b/includes/FormOptions.php
index b668ff46..ccc87d8a 100644
--- a/includes/FormOptions.php
+++ b/includes/FormOptions.php
@@ -5,10 +5,10 @@
*
* Copyright © 2008, Niklas Laxstiröm
*
- * Copyright © 2011, Ashar Voultoiz
+ * Copyright © 2011, Antoine Musso
*
* @author Niklas Laxström
- * @author Ashar Voultoiz
+ * @author Antoine Musso
*/
class FormOptions implements ArrayAccess {
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index 8ed79c40..52cd46a5 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -81,6 +81,9 @@ if ( !function_exists( 'istainted' ) ) {
/**
* Like array_diff( $a, $b ) except that it works with two-dimensional arrays.
+ * @param $a array
+ * @param $b array
+ * @return array
*/
function wfArrayDiff2( $a, $b ) {
return array_udiff( $a, $b, 'wfArrayDiff2_cmp' );
@@ -164,7 +167,7 @@ function wfArrayMerge( $array1/* ... */ ) {
* array( array( 'x' ) ),
* array( array( 'x', '2' ) ),
* array( array( 'x' ) ),
- * array( array( 'y') )
+ * array( array( 'y' ) )
* );
* returns:
* array(
@@ -296,9 +299,9 @@ function wfUrlencode( $s ) {
static $needle;
if ( is_null( $s ) ) {
$needle = null;
- return;
+ return '';
}
-
+
if ( is_null( $needle ) ) {
$needle = array( '%3B', '%40', '%24', '%21', '%2A', '%28', '%29', '%2C', '%2F' );
if ( !isset( $_SERVER['SERVER_SOFTWARE'] ) || ( strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/7' ) === false ) ) {
@@ -319,7 +322,7 @@ function wfUrlencode( $s ) {
/**
* This function takes two arrays as input, and returns a CGI-style string, e.g.
* "days=7&limit=100". Options in the first array override options in the second.
- * Options set to "" will not be output.
+ * Options set to null or false will not be output.
*
* @param $array1 Array ( String|Array )
* @param $array2 Array ( String|Array )
@@ -333,7 +336,7 @@ function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
$cgi = '';
foreach ( $array1 as $key => $value ) {
- if ( $value !== '' ) {
+ if ( !is_null($value) && $value !== false ) {
if ( $cgi != '' ) {
$cgi .= '&';
}
@@ -366,8 +369,7 @@ function wfArrayToCGI( $array1, $array2 = null, $prefix = '' ) {
* This is the logical opposite of wfArrayToCGI(): it accepts a query string as
* its argument and returns the same string in array form. This allows compa-
* tibility with legacy functions that accept raw query strings instead of nice
- * arrays. Of course, keys and values are urldecode()d. Don't try passing in-
- * valid query strings, or it will explode.
+ * arrays. Of course, keys and values are urldecode()d.
*
* @param $query String: query string
* @return array Array version of input
@@ -382,7 +384,13 @@ function wfCgiToArray( $query ) {
if ( $bit === '' ) {
continue;
}
- list( $key, $value ) = explode( '=', $bit );
+ if ( strpos( $bit, '=' ) === false ) {
+ // Pieces like &qwerty become 'qwerty' => '' (at least this is what php does)
+ $key = $bit;
+ $value = '';
+ } else {
+ list( $key, $value ) = explode( '=', $bit );
+ }
$key = urldecode( $key );
$value = urldecode( $value );
if ( strpos( $key, '[' ) !== false ) {
@@ -444,8 +452,11 @@ function wfAppendQuery( $url, $query ) {
* like "subdir/foo.html", etc.
*
* @param $url String: either fully-qualified or a local path + query
- * @param $defaultProto Mixed: one of the PROTO_* constants. Determines the protocol to use if $url or $wgServer is protocol-relative
- * @return string Fully-qualified URL
+ * @param $defaultProto Mixed: one of the PROTO_* constants. Determines the
+ * protocol to use if $url or $wgServer is
+ * protocol-relative
+ * @return string Fully-qualified URL, current-path-relative URL or false if
+ * no valid URL can be constructed
*/
function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
global $wgServer, $wgCanonicalServer, $wgInternalServer;
@@ -477,21 +488,170 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
$defaultProtoWithoutSlashes = substr( $defaultProto, 0, -2 );
- if( substr( $url, 0, 2 ) == '//' ) {
- return $defaultProtoWithoutSlashes . $url;
- } elseif( substr( $url, 0, 1 ) == '/' ) {
+ if ( substr( $url, 0, 2 ) == '//' ) {
+ $url = $defaultProtoWithoutSlashes . $url;
+ } elseif ( substr( $url, 0, 1 ) == '/' ) {
// If $serverUrl is protocol-relative, prepend $defaultProtoWithoutSlashes, otherwise leave it alone
- return ( $serverHasProto ? '' : $defaultProtoWithoutSlashes ) . $serverUrl . $url;
- } else {
+ $url = ( $serverHasProto ? '' : $defaultProtoWithoutSlashes ) . $serverUrl . $url;
+ }
+
+ $bits = wfParseUrl( $url );
+ if ( $bits && isset( $bits['path'] ) ) {
+ $bits['path'] = wfRemoveDotSegments( $bits['path'] );
+ return wfAssembleUrl( $bits );
+ } elseif ( $bits ) {
+ # No path to expand
return $url;
+ } elseif ( substr( $url, 0, 1 ) != '/' ) {
+ # URL is a relative path
+ return wfRemoveDotSegments( $url );
+ }
+
+ # Expanded URL is not valid.
+ return false;
+}
+
+/**
+ * This function will reassemble a URL parsed with wfParseURL. This is useful
+ * if you need to edit part of a URL and put it back together.
+ *
+ * This is the basic structure used (brackets contain keys for $urlParts):
+ * [scheme][delimiter][user]:[pass]@[host]:[port][path]?[query]#[fragment]
+ *
+ * @todo Need to integrate this into wfExpandUrl (bug 32168)
+ *
+ * @since 1.19
+ * @param $urlParts Array URL parts, as output from wfParseUrl
+ * @return string URL assembled from its component parts
+ */
+function wfAssembleUrl( $urlParts ) {
+ $result = '';
+
+ if ( isset( $urlParts['delimiter'] ) ) {
+ if ( isset( $urlParts['scheme'] ) ) {
+ $result .= $urlParts['scheme'];
+ }
+
+ $result .= $urlParts['delimiter'];
+ }
+
+ if ( isset( $urlParts['host'] ) ) {
+ if ( isset( $urlParts['user'] ) ) {
+ $result .= $urlParts['user'];
+ if ( isset( $urlParts['pass'] ) ) {
+ $result .= ':' . $urlParts['pass'];
+ }
+ $result .= '@';
+ }
+
+ $result .= $urlParts['host'];
+
+ if ( isset( $urlParts['port'] ) ) {
+ $result .= ':' . $urlParts['port'];
+ }
+ }
+
+ if ( isset( $urlParts['path'] ) ) {
+ $result .= $urlParts['path'];
+ }
+
+ if ( isset( $urlParts['query'] ) ) {
+ $result .= '?' . $urlParts['query'];
+ }
+
+ if ( isset( $urlParts['fragment'] ) ) {
+ $result .= '#' . $urlParts['fragment'];
+ }
+
+ return $result;
+}
+
+/**
+ * Remove all dot-segments in the provided URL path. For example,
+ * '/a/./b/../c/' becomes '/a/c/'. For details on the algorithm, please see
+ * RFC3986 section 5.2.4.
+ *
+ * @todo Need to integrate this into wfExpandUrl (bug 32168)
+ *
+ * @param $urlPath String URL path, potentially containing dot-segments
+ * @return string URL path with all dot-segments removed
+ */
+function wfRemoveDotSegments( $urlPath ) {
+ $output = '';
+ $inputOffset = 0;
+ $inputLength = strlen( $urlPath );
+
+ while ( $inputOffset < $inputLength ) {
+ $prefixLengthOne = substr( $urlPath, $inputOffset, 1 );
+ $prefixLengthTwo = substr( $urlPath, $inputOffset, 2 );
+ $prefixLengthThree = substr( $urlPath, $inputOffset, 3 );
+ $prefixLengthFour = substr( $urlPath, $inputOffset, 4 );
+ $trimOutput = false;
+
+ if ( $prefixLengthTwo == './' ) {
+ # Step A, remove leading "./"
+ $inputOffset += 2;
+ } elseif ( $prefixLengthThree == '../' ) {
+ # Step A, remove leading "../"
+ $inputOffset += 3;
+ } elseif ( ( $prefixLengthTwo == '/.' ) && ( $inputOffset + 2 == $inputLength ) ) {
+ # Step B, replace leading "/.$" with "/"
+ $inputOffset += 1;
+ $urlPath[$inputOffset] = '/';
+ } elseif ( $prefixLengthThree == '/./' ) {
+ # Step B, replace leading "/./" with "/"
+ $inputOffset += 2;
+ } elseif ( $prefixLengthThree == '/..' && ( $inputOffset + 3 == $inputLength ) ) {
+ # Step C, replace leading "/..$" with "/" and
+ # remove last path component in output
+ $inputOffset += 2;
+ $urlPath[$inputOffset] = '/';
+ $trimOutput = true;
+ } elseif ( $prefixLengthFour == '/../' ) {
+ # Step C, replace leading "/../" with "/" and
+ # remove last path component in output
+ $inputOffset += 3;
+ $trimOutput = true;
+ } elseif ( ( $prefixLengthOne == '.' ) && ( $inputOffset + 1 == $inputLength ) ) {
+ # Step D, remove "^.$"
+ $inputOffset += 1;
+ } elseif ( ( $prefixLengthTwo == '..' ) && ( $inputOffset + 2 == $inputLength ) ) {
+ # Step D, remove "^..$"
+ $inputOffset += 2;
+ } else {
+ # Step E, move leading path segment to output
+ if ( $prefixLengthOne == '/' ) {
+ $slashPos = strpos( $urlPath, '/', $inputOffset + 1 );
+ } else {
+ $slashPos = strpos( $urlPath, '/', $inputOffset );
+ }
+ if ( $slashPos === false ) {
+ $output .= substr( $urlPath, $inputOffset );
+ $inputOffset = $inputLength;
+ } else {
+ $output .= substr( $urlPath, $inputOffset, $slashPos - $inputOffset );
+ $inputOffset += $slashPos - $inputOffset;
+ }
+ }
+
+ if ( $trimOutput ) {
+ $slashPos = strrpos( $output, '/' );
+ if ( $slashPos === false ) {
+ $output = '';
+ } else {
+ $output = substr( $output, 0, $slashPos );
+ }
+ }
}
+
+ return $output;
}
/**
* Returns a regular expression of url protocols
*
* @param $includeProtocolRelative bool If false, remove '//' from the returned protocol list.
- * DO NOT USE this directy, use wfUrlProtocolsWithoutProtRel() instead
+ * DO NOT USE this directly, use wfUrlProtocolsWithoutProtRel() instead
* @return String
*/
function wfUrlProtocols( $includeProtocolRelative = true ) {
@@ -537,6 +697,7 @@ function wfUrlProtocols( $includeProtocolRelative = true ) {
* Like wfUrlProtocols(), but excludes '//' from the protocol list. Use this if
* you need a regex that matches all URL protocols but does not match protocol-
* relative URLs
+ * @return String
*/
function wfUrlProtocolsWithoutProtRel() {
return wfUrlProtocols( false );
@@ -554,7 +715,7 @@ function wfUrlProtocolsWithoutProtRel() {
*/
function wfParseUrl( $url ) {
global $wgUrlProtocols; // Allow all protocols defined in DefaultSettings/LocalSettings.php
-
+
// Protocol-relative URLs are handled really badly by parse_url(). It's so bad that the easiest
// way to handle them is to just prepend 'http:' and strip the protocol out later
$wasRelative = substr( $url, 0, 2 ) == '//';
@@ -564,7 +725,9 @@ function wfParseUrl( $url ) {
wfSuppressWarnings();
$bits = parse_url( $url );
wfRestoreWarnings();
- if ( !$bits ) {
+ // parse_url() returns an array without scheme for some invalid URLs, e.g.
+ // parse_url("%0Ahttp://example.com") == array( 'host' => '%0Ahttp', 'path' => 'example.com' )
+ if ( !$bits || !isset( $bits['scheme'] ) ) {
return false;
}
@@ -592,7 +755,7 @@ function wfParseUrl( $url ) {
$bits['path'] = '/' . $bits['path'];
}
}
-
+
// If the URL was protocol-relative, fix scheme and delimiter
if ( $wasRelative ) {
$bits['scheme'] = '';
@@ -717,6 +880,8 @@ function wfDebug( $text, $logonly = false ) {
wfErrorLog( $text, $wgDebugLogFile );
}
}
+
+ MWDebug::debugMsg( $text );
}
/**
@@ -747,20 +912,15 @@ function wfIsDebugRawPage() {
* @return string
*/
function wfDebugTimer() {
- global $wgDebugTimestamps;
+ global $wgDebugTimestamps, $wgRequestTime;
+
if ( !$wgDebugTimestamps ) {
return '';
}
- static $start = null;
- if ( $start === null ) {
- $start = microtime( true );
- $prefix = "\n$start";
- } else {
- $prefix = sprintf( "%6.4f", microtime( true ) - $start );
- }
-
- return $prefix . ' ';
+ $prefix = sprintf( "%6.4f", microtime( true ) - $wgRequestTime );
+ $mem = sprintf( "%5.1fM", ( memory_get_usage( true ) / ( 1024 * 1024 ) ) );
+ return "$prefix $mem ";
}
/**
@@ -788,16 +948,12 @@ function wfDebugMem( $exact = false ) {
* log file is specified, (default true)
*/
function wfDebugLog( $logGroup, $text, $public = true ) {
- global $wgDebugLogGroups, $wgShowHostnames;
+ global $wgDebugLogGroups;
$text = trim( $text ) . "\n";
if( isset( $wgDebugLogGroups[$logGroup] ) ) {
$time = wfTimestamp( TS_DB );
$wiki = wfWikiID();
- if ( $wgShowHostnames ) {
- $host = wfHostname();
- } else {
- $host = '';
- }
+ $host = wfHostname();
if ( wfRunHooks( 'Debug', array( $text, $logGroup ) ) ) {
wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
}
@@ -812,15 +968,98 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
* @param $text String: database error message.
*/
function wfLogDBError( $text ) {
- global $wgDBerrorLog, $wgDBname;
+ global $wgDBerrorLog;
if ( $wgDBerrorLog ) {
- $host = trim(`hostname`);
- $text = date( 'D M j G:i:s T Y' ) . "\t$host\t$wgDBname\t$text";
+ $host = wfHostname();
+ $wiki = wfWikiID();
+ $text = date( 'D M j G:i:s T Y' ) . "\t$host\t$wiki\t$text";
wfErrorLog( $text, $wgDBerrorLog );
}
}
/**
+ * Throws a warning that $function is deprecated
+ *
+ * @param $function String
+ * @param $version String|false: Added in 1.19.
+ * @param $component String|false: Added in 1.19.
+ *
+ * @return null
+ */
+function wfDeprecated( $function, $version = false, $component = false ) {
+ static $functionsWarned = array();
+
+ MWDebug::deprecated( $function, $version, $component );
+
+ if ( !isset( $functionsWarned[$function] ) ) {
+ $functionsWarned[$function] = true;
+
+ if ( $version ) {
+ global $wgDeprecationReleaseLimit;
+
+ if ( $wgDeprecationReleaseLimit && $component === false ) {
+ # Strip -* off the end of $version so that branches can use the
+ # format #.##-branchname to avoid issues if the branch is merged into
+ # a version of MediaWiki later than what it was branched from
+ $comparableVersion = preg_replace( '/-.*$/', '', $version );
+
+ # If the comparableVersion is larger than our release limit then
+ # skip the warning message for the deprecation
+ if ( version_compare( $wgDeprecationReleaseLimit, $comparableVersion, '<' ) ) {
+ return;
+ }
+ }
+
+ $component = $component === false ? 'MediaWiki' : $component;
+ wfWarn( "Use of $function was deprecated in $component $version.", 2 );
+ } else {
+ wfWarn( "Use of $function is deprecated.", 2 );
+ }
+ }
+}
+
+/**
+ * Send a warning either to the debug log or in a PHP error depending on
+ * $wgDevelopmentWarnings
+ *
+ * @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 wfWarn, ...)
+ * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
+ * is true
+ */
+function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
+ global $wgDevelopmentWarnings;
+
+ MWDebug::warning( $msg, $callerOffset + 2 );
+
+ $callers = wfDebugBacktrace();
+ if ( isset( $callers[$callerOffset + 1] ) ) {
+ $callerfunc = $callers[$callerOffset + 1];
+ $callerfile = $callers[$callerOffset];
+ if ( isset( $callerfile['file'] ) && isset( $callerfile['line'] ) ) {
+ $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
+ } else {
+ $file = '(internal function)';
+ }
+ $func = '';
+ if ( isset( $callerfunc['class'] ) ) {
+ $func .= $callerfunc['class'] . '::';
+ }
+ if ( isset( $callerfunc['function'] ) ) {
+ $func .= $callerfunc['function'];
+ }
+ $msg .= " [Called from $func in $file]";
+ }
+
+ if ( $wgDevelopmentWarnings ) {
+ trigger_error( $msg, $level );
+ } else {
+ wfDebug( "$msg\n" );
+ }
+}
+
+/**
* Log to a file without getting "file size exceeded" signals.
*
* Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
@@ -855,21 +1094,22 @@ function wfErrorLog( $text, $file ) {
$text = preg_replace( '/^/m', $prefix . ' ', $text );
// Limit to 64KB
- if ( strlen( $text ) > 65534 ) {
- $text = substr( $text, 0, 65534 );
+ if ( strlen( $text ) > 65506 ) {
+ $text = substr( $text, 0, 65506 );
}
if ( substr( $text, -1 ) != "\n" ) {
$text .= "\n";
}
- } elseif ( strlen( $text ) > 65535 ) {
- $text = substr( $text, 0, 65535 );
+ } elseif ( strlen( $text ) > 65507 ) {
+ $text = substr( $text, 0, 65507 );
}
$sock = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
if ( !$sock ) {
return;
}
+
socket_sendto( $sock, $text, strlen( $text ), 0, $host, $port );
socket_close( $sock );
} else {
@@ -899,8 +1139,7 @@ function wfLogProfilingData() {
// Get total page request time and only show pages that longer than
// $wgProfileLimit time (default is 0)
- $now = wfTime();
- $elapsed = $now - $wgRequestTime;
+ $elapsed = microtime( true ) - $wgRequestTime;
if ( $elapsed <= $wgProfileLimit ) {
return;
}
@@ -962,6 +1201,9 @@ function wfReadOnly() {
return (bool)$wgReadOnly;
}
+/**
+ * @return bool
+ */
function wfReadOnlyReason() {
global $wgReadOnly;
wfReadOnly();
@@ -977,9 +1219,10 @@ function wfReadOnlyReason() {
* 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
- * - a boolean: if it's false then use the current users
- * language (as a fallback for the old parameter
- * functionality), or if it is true then use the wikis
+ * - a boolean: if it's false then use the global object for
+ * the current user's language (as a fallback for the old parameter
+ * functionality), or if it is true then use global object
+ * for the wiki's content language.
* @return Language object
*/
function wfGetLangObj( $langcode = false ) {
@@ -1023,6 +1266,7 @@ function wfGetLangObj( $langcode = false ) {
* @return Language
*/
function wfUILang() {
+ wfDeprecated( __METHOD__, '1.18' );
global $wgLang;
return $wgLang;
}
@@ -1249,7 +1493,8 @@ function wfMsgWikiHtml( $key ) {
$args = func_get_args();
array_shift( $args );
return wfMsgReplaceArgs(
- MessageCache::singleton()->parse( wfMsgGetKey( $key ), null, /* can't be set to false */ true )->getText(),
+ MessageCache::singleton()->parse( wfMsgGetKey( $key ), null,
+ /* can't be set to false */ true, /* interface */ true )->getText(),
$args );
}
@@ -1311,13 +1556,18 @@ function wfMsgExt( $key, $options ) {
}
$messageCache = MessageCache::singleton();
- if( in_array( 'parse', $options, true ) ) {
- $string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj )->getText();
- } elseif ( in_array( 'parseinline', $options, true ) ) {
- $string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj )->getText();
- $m = array();
- if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
- $string = $m[1];
+ $parseInline = in_array( 'parseinline', $options, true );
+ if( in_array( 'parse', $options, true ) || $parseInline ) {
+ $string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj );
+ if ( $string instanceof ParserOutput ) {
+ $string = $string->getText();
+ }
+
+ if ( $parseInline ) {
+ $m = array();
+ if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+ $string = $m[1];
+ }
}
} elseif ( in_array( 'parsemag', $options, true ) ) {
$string = $messageCache->transform( $string,
@@ -1353,7 +1603,7 @@ function wfEmptyMsg( $key ) {
* Throw a debugging exception. This function previously once exited the process,
* but now throws an exception instead, with similar results.
*
- * @param $msg String: message shown when dieing.
+ * @param $msg String: message shown when dying.
*/
function wfDebugDieBacktrace( $msg = '' ) {
throw new MWException( $msg );
@@ -1397,8 +1647,7 @@ function wfHostname() {
function wfReportTime() {
global $wgRequestTime, $wgShowHostnames;
- $now = wfTime();
- $elapsed = $now - $wgRequestTime;
+ $elapsed = microtime( true ) - $wgRequestTime;
return $wgShowHostnames
? sprintf( '<!-- Served by %s in %01.3f secs. -->', wfHostname(), $elapsed )
@@ -1575,80 +1824,40 @@ function wfShowingResults( $offset, $limit ) {
* @param $query String: optional URL query parameter string
* @param $atend Bool: optional param for specified if this is the last page
* @return String
+ * @deprecated in 1.19; use Language::viewPrevNext() instead
*/
function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
+ wfDeprecated( __METHOD__, '1.19' );
+
global $wgLang;
- $fmtLimit = $wgLang->formatNum( $limit );
- // @todo FIXME: Why on earth this needs one message for the text and another one for tooltip?
- # Get prev/next link display text
- $prev = wfMsgExt( 'prevn', array( 'parsemag', 'escape' ), $fmtLimit );
- $next = wfMsgExt( 'nextn', array( 'parsemag', 'escape' ), $fmtLimit );
- # Get prev/next link title text
- $pTitle = wfMsgExt( 'prevn-title', array( 'parsemag', 'escape' ), $fmtLimit );
- $nTitle = wfMsgExt( 'nextn-title', array( 'parsemag', 'escape' ), $fmtLimit );
- # Fetch the title object
+
+ $query = wfCgiToArray( $query );
+
if( is_object( $link ) ) {
- $title =& $link;
+ $title = $link;
} else {
$title = Title::newFromText( $link );
if( is_null( $title ) ) {
return false;
}
}
- # Make 'previous' link
- if( 0 != $offset ) {
- $po = $offset - $limit;
- $po = max( $po, 0 );
- $q = "limit={$limit}&offset={$po}";
- if( $query != '' ) {
- $q .= '&' . $query;
- }
- $plink = '<a href="' . $title->escapeLocalURL( $q ) . "\" title=\"{$pTitle}\" class=\"mw-prevlink\">{$prev}</a>";
- } else {
- $plink = $prev;
- }
- # Make 'next' link
- $no = $offset + $limit;
- $q = "limit={$limit}&offset={$no}";
- if( $query != '' ) {
- $q .= '&' . $query;
- }
- if( $atend ) {
- $nlink = $next;
- } else {
- $nlink = '<a href="' . $title->escapeLocalURL( $q ) . "\" title=\"{$nTitle}\" class=\"mw-nextlink\">{$next}</a>";
- }
- # Make links to set number of items per page
- $nums = $wgLang->pipeList( array(
- wfNumLink( $offset, 20, $title, $query ),
- wfNumLink( $offset, 50, $title, $query ),
- wfNumLink( $offset, 100, $title, $query ),
- wfNumLink( $offset, 250, $title, $query ),
- wfNumLink( $offset, 500, $title, $query )
- ) );
- return wfMsgHtml( 'viewprevnext', $plink, $nlink, $nums );
+
+ return $wgLang->viewPrevNext( $title, $offset, $limit, $query, $atend );
}
/**
- * Generate links for (20|50|100...) items-per-page links
+ * Make a list item, used by various special pages
*
- * @param $offset String
- * @param $limit Integer
- * @param $title Title
- * @param $query String: optional URL query parameter string
+ * @param $page String Page link
+ * @param $details String 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 wfNumLink( $offset, $limit, $title, $query = '' ) {
+function wfSpecialList( $page, $details, $oppositedm = true ) {
global $wgLang;
- if( $query == '' ) {
- $q = '';
- } else {
- $q = $query.'&';
- }
- $q .= "limit={$limit}&offset={$offset}";
- $fmtLimit = $wgLang->formatNum( $limit );
- $lTitle = wfMsgExt( 'shown-title', array( 'parsemag', 'escape' ), $limit );
- $s = '<a href="' . $title->escapeLocalURL( $q ) . "\" title=\"{$lTitle}\" class=\"mw-numlink\">{$fmtLimit}</a>";
- return $s;
+ return $wgLang->specialList( $page, $details, $oppositedm );
}
/**
@@ -1675,7 +1884,7 @@ function wfClientAcceptsGzip( $force = false ) {
$result = false;
return $result;
}
- wfDebug( " accepts gzip\n" );
+ wfDebug( "wfClientAcceptsGzip: client accepts gzip.\n" );
$result = true;
}
}
@@ -1750,6 +1959,8 @@ function wfSetVar( &$dest, $source, $force = false ) {
* @param $dest Int
* @param $bit Int
* @param $state Bool
+ *
+ * @return bool
*/
function wfSetBit( &$dest, $bit, $state = true ) {
$temp = (bool)( $dest & $bit );
@@ -1764,217 +1975,6 @@ function wfSetBit( &$dest, $bit, $state = true ) {
}
/**
- * Windows-compatible version of escapeshellarg()
- * Windows doesn't recognise single-quotes in the shell, but the escapeshellarg()
- * function puts single quotes in regardless of OS.
- *
- * Also fixes the locale problems on Linux in PHP 5.2.6+ (bug backported to
- * earlier distro releases of PHP)
- *
- * @param varargs
- * @return String
- */
-function wfEscapeShellArg( ) {
- wfInitShellLocale();
-
- $args = func_get_args();
- $first = true;
- $retVal = '';
- foreach ( $args as $arg ) {
- if ( !$first ) {
- $retVal .= ' ';
- } else {
- $first = false;
- }
-
- if ( wfIsWindows() ) {
- // Escaping for an MSVC-style command line parser and CMD.EXE
- // Refs:
- // * http://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
- // * http://technet.microsoft.com/en-us/library/cc723564.aspx
- // * Bug #13518
- // * CR r63214
- // Double the backslashes before any double quotes. Escape the double quotes.
- $tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
- $arg = '';
- $iteration = 0;
- foreach ( $tokens as $token ) {
- if ( $iteration % 2 == 1 ) {
- // Delimiter, a double quote preceded by zero or more slashes
- $arg .= str_replace( '\\', '\\\\', substr( $token, 0, -1 ) ) . '\\"';
- } elseif ( $iteration % 4 == 2 ) {
- // ^ in $token will be outside quotes, need to be escaped
- $arg .= str_replace( '^', '^^', $token );
- } else { // $iteration % 4 == 0
- // ^ in $token will appear inside double quotes, so leave as is
- $arg .= $token;
- }
- $iteration++;
- }
- // Double the backslashes before the end of the string, because
- // we will soon add a quote
- $m = array();
- if ( preg_match( '/^(.*?)(\\\\+)$/', $arg, $m ) ) {
- $arg = $m[1] . str_replace( '\\', '\\\\', $m[2] );
- }
-
- // Add surrounding quotes
- $retVal .= '"' . $arg . '"';
- } else {
- $retVal .= escapeshellarg( $arg );
- }
- }
- return $retVal;
-}
-
-/**
- * wfMerge attempts to merge differences between three texts.
- * Returns true for a clean merge and false for failure or a conflict.
- *
- * @param $old String
- * @param $mine String
- * @param $yours String
- * @param $result String
- * @return Bool
- */
-function wfMerge( $old, $mine, $yours, &$result ) {
- global $wgDiff3;
-
- # This check may also protect against code injection in
- # case of broken installations.
- wfSuppressWarnings();
- $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
- wfRestoreWarnings();
-
- if( !$haveDiff3 ) {
- wfDebug( "diff3 not found\n" );
- return false;
- }
-
- # Make temporary files
- $td = wfTempDir();
- $oldtextFile = fopen( $oldtextName = tempnam( $td, 'merge-old-' ), 'w' );
- $mytextFile = fopen( $mytextName = tempnam( $td, 'merge-mine-' ), 'w' );
- $yourtextFile = fopen( $yourtextName = tempnam( $td, 'merge-your-' ), 'w' );
-
- fwrite( $oldtextFile, $old );
- fclose( $oldtextFile );
- fwrite( $mytextFile, $mine );
- fclose( $mytextFile );
- fwrite( $yourtextFile, $yours );
- fclose( $yourtextFile );
-
- # Check for a conflict
- $cmd = $wgDiff3 . ' -a --overlap-only ' .
- wfEscapeShellArg( $mytextName ) . ' ' .
- wfEscapeShellArg( $oldtextName ) . ' ' .
- wfEscapeShellArg( $yourtextName );
- $handle = popen( $cmd, 'r' );
-
- if( fgets( $handle, 1024 ) ) {
- $conflict = true;
- } else {
- $conflict = false;
- }
- pclose( $handle );
-
- # Merge differences
- $cmd = $wgDiff3 . ' -a -e --merge ' .
- wfEscapeShellArg( $mytextName, $oldtextName, $yourtextName );
- $handle = popen( $cmd, 'r' );
- $result = '';
- do {
- $data = fread( $handle, 8192 );
- if ( strlen( $data ) == 0 ) {
- break;
- }
- $result .= $data;
- } while ( true );
- pclose( $handle );
- unlink( $mytextName );
- unlink( $oldtextName );
- unlink( $yourtextName );
-
- if ( $result === '' && $old !== '' && !$conflict ) {
- wfDebug( "Unexpected null result from diff3. Command: $cmd\n" );
- $conflict = true;
- }
- return !$conflict;
-}
-
-/**
- * Returns unified plain-text diff of two texts.
- * Useful for machine processing of diffs.
- *
- * @param $before String: the text before the changes.
- * @param $after String: the text after the changes.
- * @param $params String: command-line options for the diff command.
- * @return String: unified diff of $before and $after
- */
-function wfDiff( $before, $after, $params = '-u' ) {
- if ( $before == $after ) {
- return '';
- }
-
- global $wgDiff;
- wfSuppressWarnings();
- $haveDiff = $wgDiff && file_exists( $wgDiff );
- wfRestoreWarnings();
-
- # This check may also protect against code injection in
- # case of broken installations.
- if( !$haveDiff ) {
- wfDebug( "diff executable not found\n" );
- $diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) );
- $format = new UnifiedDiffFormatter();
- return $format->format( $diffs );
- }
-
- # Make temporary files
- $td = wfTempDir();
- $oldtextFile = fopen( $oldtextName = tempnam( $td, 'merge-old-' ), 'w' );
- $newtextFile = fopen( $newtextName = tempnam( $td, 'merge-your-' ), 'w' );
-
- fwrite( $oldtextFile, $before );
- fclose( $oldtextFile );
- fwrite( $newtextFile, $after );
- fclose( $newtextFile );
-
- // Get the diff of the two files
- $cmd = "$wgDiff " . $params . ' ' . wfEscapeShellArg( $oldtextName, $newtextName );
-
- $h = popen( $cmd, 'r' );
-
- $diff = '';
-
- do {
- $data = fread( $h, 8192 );
- if ( strlen( $data ) == 0 ) {
- break;
- }
- $diff .= $data;
- } while ( true );
-
- // Clean up
- pclose( $h );
- unlink( $oldtextName );
- unlink( $newtextName );
-
- // Kill the --- and +++ lines. They're not useful.
- $diff_lines = explode( "\n", $diff );
- if ( strpos( $diff_lines[0], '---' ) === 0 ) {
- unset( $diff_lines[0] );
- }
- if ( strpos( $diff_lines[1], '+++' ) === 0 ) {
- unset( $diff_lines[1] );
- }
-
- $diff = implode( "\n", $diff_lines );
-
- return $diff;
-}
-
-/**
* A wrapper around the PHP function var_export().
* Either print it or add it to the regular output ($wgOut).
*
@@ -2005,7 +2005,7 @@ function wfHttpError( $code, $label, $desc ) {
$wgOut->sendCacheControl();
header( 'Content-type: text/html; charset=utf-8' );
- print "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">".
+ print "<!doctype html>" .
'<html><head><title>' .
htmlspecialchars( $label ) .
'</title></head><body><h1>' .
@@ -2161,7 +2161,7 @@ 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] != '*' ) {
$ckey = mimeTypeMatch( $type, $cprefs );
@@ -2213,7 +2213,7 @@ function wfSuppressWarnings( $end = false ) {
} else {
if ( !$suppressCount ) {
// E_DEPRECATED is undefined in PHP 5.2
- if( !defined( 'E_DEPRECATED' ) ){
+ if( !defined( 'E_DEPRECATED' ) ) {
define( 'E_DEPRECATED', 8192 );
}
$originalLevel = error_reporting( E_ALL & ~( E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_DEPRECATED ) );
@@ -2313,7 +2313,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
} elseif ( preg_match( '/^-?\d{1,13}$/D', $ts ) ) {
# TS_UNIX
$uts = $ts;
- $strtime = "@$ts"; // Undocumented?
+ $strtime = "@$ts"; // http://php.net/manual/en/datetime.formats.compound.php
} elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
# TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
$strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
@@ -2326,7 +2326,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
# TS_POSTGRES
} elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
# TS_POSTGRES
- } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/',$ts,$da)) {
+ } elseif (preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/', $ts, $da ) ) {
# TS_DB2
} elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
'\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' . # dd Mon yyyy
@@ -2508,8 +2508,12 @@ function wfTempDir() {
function wfMkdirParents( $dir, $mode = null, $caller = null ) {
global $wgDirectoryMode;
+ if ( FileBackend::isStoragePath( $dir ) ) { // sanity
+ throw new MWException( __FUNCTION__ . " given storage path `$dir`.");
+ }
+
if ( !is_null( $caller ) ) {
- wfDebug( "$caller: called wfMkdirParents($dir)" );
+ wfDebug( "$caller: called wfMkdirParents($dir)\n" );
}
if( strval( $dir ) === '' || file_exists( $dir ) ) {
@@ -2586,6 +2590,29 @@ function wfIncrStats( $key, $count = 1 ) {
}
/**
+ * Remove a directory and all its content.
+ * Does not hide error.
+ */
+function wfRecursiveRemoveDir( $dir ) {
+ wfDebug( __FUNCTION__ . "( $dir )\n" );
+ // taken from http://de3.php.net/manual/en/function.rmdir.php#98622
+ if ( is_dir( $dir ) ) {
+ $objects = scandir( $dir );
+ foreach ( $objects as $object ) {
+ if ( $object != "." && $object != ".." ) {
+ if ( filetype( $dir . '/' . $object ) == "dir" ) {
+ wfRecursiveRemoveDir( $dir . '/' . $object );
+ } else {
+ unlink( $dir . '/' . $object );
+ }
+ }
+ }
+ reset( $objects );
+ rmdir( $dir );
+ }
+}
+
+/**
* @param $nr Mixed: the number to format
* @param $acc Integer: the number of digits after the decimal point, default 2
* @param $round Boolean: whether or not to round the value, default true
@@ -2612,23 +2639,6 @@ function in_string( $needle, $str, $insensitive = false ) {
}
/**
- * Make a list item, used by various special pages
- *
- * @param $page String Page link
- * @param $details String Text between brackets
- * @param $oppositedm Boolean Add the direction mark opposite to your
- * language, to display text properly
- * @return String
- */
-function wfSpecialList( $page, $details, $oppositedm = true ) {
- global $wgLang;
- $dirmark = ( $oppositedm ? $wgLang->getDirMark( true ) : '' ) .
- $wgLang->getDirMark();
- $details = $details ? $dirmark . " ($details)" : '';
- return $page . $details;
-}
-
-/**
* Safety wrapper around ini_get() for boolean settings.
* The values returned from ini_get() are pre-normalized for settings
* set via php.ini or php_flag/php_admin_flag... but *not*
@@ -2696,6 +2706,70 @@ function wfDl( $extension, $fileName = null ) {
}
/**
+ * Windows-compatible version of escapeshellarg()
+ * Windows doesn't recognise single-quotes in the shell, but the escapeshellarg()
+ * function puts single quotes in regardless of OS.
+ *
+ * Also fixes the locale problems on Linux in PHP 5.2.6+ (bug backported to
+ * earlier distro releases of PHP)
+ *
+ * @param varargs
+ * @return String
+ */
+function wfEscapeShellArg( ) {
+ wfInitShellLocale();
+
+ $args = func_get_args();
+ $first = true;
+ $retVal = '';
+ foreach ( $args as $arg ) {
+ if ( !$first ) {
+ $retVal .= ' ';
+ } else {
+ $first = false;
+ }
+
+ if ( wfIsWindows() ) {
+ // Escaping for an MSVC-style command line parser and CMD.EXE
+ // Refs:
+ // * http://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
+ // * http://technet.microsoft.com/en-us/library/cc723564.aspx
+ // * Bug #13518
+ // * CR r63214
+ // Double the backslashes before any double quotes. Escape the double quotes.
+ $tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
+ $arg = '';
+ $iteration = 0;
+ foreach ( $tokens as $token ) {
+ if ( $iteration % 2 == 1 ) {
+ // Delimiter, a double quote preceded by zero or more slashes
+ $arg .= str_replace( '\\', '\\\\', substr( $token, 0, -1 ) ) . '\\"';
+ } elseif ( $iteration % 4 == 2 ) {
+ // ^ in $token will be outside quotes, need to be escaped
+ $arg .= str_replace( '^', '^^', $token );
+ } else { // $iteration % 4 == 0
+ // ^ in $token will appear inside double quotes, so leave as is
+ $arg .= $token;
+ }
+ $iteration++;
+ }
+ // Double the backslashes before the end of the string, because
+ // we will soon add a quote
+ $m = array();
+ if ( preg_match( '/^(.*?)(\\\\+)$/', $arg, $m ) ) {
+ $arg = $m[1] . str_replace( '\\', '\\\\', $m[2] );
+ }
+
+ // Add surrounding quotes
+ $retVal .= '"' . $arg . '"';
+ } else {
+ $retVal .= escapeshellarg( $arg );
+ }
+ }
+ return $retVal;
+}
+
+/**
* Execute a shell command, with time and memory limits mirrored from the PHP
* configuration if supported.
* @param $cmd String Command line, properly escaped for shell.
@@ -2805,6 +2879,178 @@ function wfInitShellLocale() {
}
/**
+ * Generate a shell-escaped command line string to run a maintenance script.
+ * Note that $parameters should be a flat array and an option with an argument
+ * should consist of two consecutive items in the array (do not use "--option value").
+ * @param $script string MediaWiki maintenance script path
+ * @param $parameters Array Arguments and options to the script
+ * @param $options Array Associative array of options:
+ * 'php': The path to the php executable
+ * 'wrapper': Path to a PHP wrapper to handle the maintenance script
+ * @return Array
+ */
+function wfShellMaintenanceCmd( $script, array $parameters = array(), array $options = array() ) {
+ global $wgPhpCli;
+ // Give site config file a chance to run the script in a wrapper.
+ // The caller may likely want to call wfBasename() on $script.
+ wfRunHooks( 'wfShellMaintenanceCmd', array( &$script, &$parameters, &$options ) );
+ $cmd = isset( $options['php'] ) ? array( $options['php'] ) : array( $wgPhpCli );
+ if ( isset( $options['wrapper'] ) ) {
+ $cmd[] = $options['wrapper'];
+ }
+ $cmd[] = $script;
+ // Escape each parameter for shell
+ return implode( " ", array_map( 'wfEscapeShellArg', array_merge( $cmd, $parameters ) ) );
+}
+
+/**
+ * wfMerge attempts to merge differences between three texts.
+ * Returns true for a clean merge and false for failure or a conflict.
+ *
+ * @param $old String
+ * @param $mine String
+ * @param $yours String
+ * @param $result String
+ * @return Bool
+ */
+function wfMerge( $old, $mine, $yours, &$result ) {
+ global $wgDiff3;
+
+ # This check may also protect against code injection in
+ # case of broken installations.
+ wfSuppressWarnings();
+ $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
+ wfRestoreWarnings();
+
+ if( !$haveDiff3 ) {
+ wfDebug( "diff3 not found\n" );
+ return false;
+ }
+
+ # Make temporary files
+ $td = wfTempDir();
+ $oldtextFile = fopen( $oldtextName = tempnam( $td, 'merge-old-' ), 'w' );
+ $mytextFile = fopen( $mytextName = tempnam( $td, 'merge-mine-' ), 'w' );
+ $yourtextFile = fopen( $yourtextName = tempnam( $td, 'merge-your-' ), 'w' );
+
+ fwrite( $oldtextFile, $old );
+ fclose( $oldtextFile );
+ fwrite( $mytextFile, $mine );
+ fclose( $mytextFile );
+ fwrite( $yourtextFile, $yours );
+ fclose( $yourtextFile );
+
+ # Check for a conflict
+ $cmd = $wgDiff3 . ' -a --overlap-only ' .
+ wfEscapeShellArg( $mytextName ) . ' ' .
+ wfEscapeShellArg( $oldtextName ) . ' ' .
+ wfEscapeShellArg( $yourtextName );
+ $handle = popen( $cmd, 'r' );
+
+ if( fgets( $handle, 1024 ) ) {
+ $conflict = true;
+ } else {
+ $conflict = false;
+ }
+ pclose( $handle );
+
+ # Merge differences
+ $cmd = $wgDiff3 . ' -a -e --merge ' .
+ wfEscapeShellArg( $mytextName, $oldtextName, $yourtextName );
+ $handle = popen( $cmd, 'r' );
+ $result = '';
+ do {
+ $data = fread( $handle, 8192 );
+ if ( strlen( $data ) == 0 ) {
+ break;
+ }
+ $result .= $data;
+ } while ( true );
+ pclose( $handle );
+ unlink( $mytextName );
+ unlink( $oldtextName );
+ unlink( $yourtextName );
+
+ if ( $result === '' && $old !== '' && !$conflict ) {
+ wfDebug( "Unexpected null result from diff3. Command: $cmd\n" );
+ $conflict = true;
+ }
+ return !$conflict;
+}
+
+/**
+ * Returns unified plain-text diff of two texts.
+ * Useful for machine processing of diffs.
+ *
+ * @param $before String: the text before the changes.
+ * @param $after String: the text after the changes.
+ * @param $params String: command-line options for the diff command.
+ * @return String: unified diff of $before and $after
+ */
+function wfDiff( $before, $after, $params = '-u' ) {
+ if ( $before == $after ) {
+ return '';
+ }
+
+ global $wgDiff;
+ wfSuppressWarnings();
+ $haveDiff = $wgDiff && file_exists( $wgDiff );
+ wfRestoreWarnings();
+
+ # This check may also protect against code injection in
+ # case of broken installations.
+ if( !$haveDiff ) {
+ wfDebug( "diff executable not found\n" );
+ $diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) );
+ $format = new UnifiedDiffFormatter();
+ return $format->format( $diffs );
+ }
+
+ # Make temporary files
+ $td = wfTempDir();
+ $oldtextFile = fopen( $oldtextName = tempnam( $td, 'merge-old-' ), 'w' );
+ $newtextFile = fopen( $newtextName = tempnam( $td, 'merge-your-' ), 'w' );
+
+ fwrite( $oldtextFile, $before );
+ fclose( $oldtextFile );
+ fwrite( $newtextFile, $after );
+ fclose( $newtextFile );
+
+ // Get the diff of the two files
+ $cmd = "$wgDiff " . $params . ' ' . wfEscapeShellArg( $oldtextName, $newtextName );
+
+ $h = popen( $cmd, 'r' );
+
+ $diff = '';
+
+ do {
+ $data = fread( $h, 8192 );
+ if ( strlen( $data ) == 0 ) {
+ break;
+ }
+ $diff .= $data;
+ } while ( true );
+
+ // Clean up
+ pclose( $h );
+ unlink( $oldtextName );
+ unlink( $newtextName );
+
+ // Kill the --- and +++ lines. They're not useful.
+ $diff_lines = explode( "\n", $diff );
+ if ( strpos( $diff_lines[0], '---' ) === 0 ) {
+ unset( $diff_lines[0] );
+ }
+ if ( strpos( $diff_lines[1], '+++' ) === 0 ) {
+ unset( $diff_lines[1] );
+ }
+
+ $diff = implode( "\n", $diff_lines );
+
+ return $diff;
+}
+
+/**
* This function works like "use VERSION" in Perl, the program will die with a
* backtrace if the current version of PHP is less than the version provided
*
@@ -2920,35 +3166,13 @@ function wfRelativePath( $path, $from ) {
/**
* Do any deferred updates and clear the list
*
- * @param $commit String: set to 'commit' to commit after every update to
- * prevent lock contention
+ * @deprecated since 1.19
+ * @see DeferredUpdates::doUpdate()
+ * @param $commit string
*/
function wfDoUpdates( $commit = '' ) {
- global $wgDeferredUpdateList;
-
- wfProfileIn( __METHOD__ );
-
- // No need to get master connections in case of empty updates array
- if ( !count( $wgDeferredUpdateList ) ) {
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $doCommit = $commit == 'commit';
- if ( $doCommit ) {
- $dbw = wfGetDB( DB_MASTER );
- }
-
- foreach ( $wgDeferredUpdateList as $update ) {
- $update->doUpdate();
-
- if ( $doCommit && $dbw->trxLevel() ) {
- $dbw->commit();
- }
- }
-
- $wgDeferredUpdateList = array();
- wfProfileOut( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.19' );
+ DeferredUpdates::doUpdates( $commit );
}
/**
@@ -3043,13 +3267,17 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
*
* @param $name String
* @param $p Array: parameters
+ * @return object
* @deprecated since 1.18, warnings in 1.18, removal in 1.20
*/
function wfCreateObject( $name, $p ) {
- wfDeprecated( __FUNCTION__ );
+ wfDeprecated( __FUNCTION__, '1.18' );
return MWFunction::newObj( $name, $p );
}
+/**
+ * @return bool
+ */
function wfHttpOnlySafe() {
global $wgHttpOnlyBlacklist;
@@ -3164,8 +3392,10 @@ function wfGetPrecompiledData( $name ) {
* @return String
*/
function wfMemcKey( /*... */ ) {
+ global $wgCachePrefix;
+ $prefix = $wgCachePrefix === false ? wfWikiID() : $wgCachePrefix;
$args = func_get_args();
- $key = wfWikiID() . ':' . implode( ':', $args );
+ $key = $prefix . ':' . implode( ':', $args );
$key = str_replace( ' ', '_', $key );
return $key;
}
@@ -3207,7 +3437,8 @@ function wfWikiID() {
* Split a wiki ID into DB name and table prefix
*
* @param $wiki String
- * @param $bits String
+ *
+ * @return array
*/
function wfSplitWikiID( $wiki ) {
$bits = explode( '-', $wiki, 2 );
@@ -3290,14 +3521,23 @@ function wfFindFile( $title, $options = array() ) {
* Get an object referring to a locally registered file.
* Returns a valid placeholder object if the file does not exist.
*
- * @param $title Title or String
- * @return File, or null if passed an invalid Title
+ * @param $title Title|String
+ * @return File|null A File, or null if passed an invalid Title
*/
function wfLocalFile( $title ) {
return RepoGroup::singleton()->getLocalRepo()->newFile( $title );
}
/**
+ * Stream a file to the browser. Back-compat alias for StreamFile::stream()
+ * @deprecated since 1.19
+ */
+function wfStreamFile( $fname, $headers = array() ) {
+ wfDeprecated( __FUNCTION__, '1.19' );
+ StreamFile::stream( $fname, $headers );
+}
+
+/**
* Should low-performance queries be disabled?
*
* @return Boolean
@@ -3364,7 +3604,7 @@ function wfBoolToStr( $value ) {
* @codeCoverageIgnore
*/
function wfLoadExtensionMessages() {
- wfDeprecated( __FUNCTION__ );
+ wfDeprecated( __FUNCTION__, '1.16' );
}
/**
@@ -3379,59 +3619,6 @@ function wfGetNull() {
}
/**
- * Throws a warning that $function is deprecated
- *
- * @param $function String
- * @return null
- */
-function wfDeprecated( $function ) {
- static $functionsWarned = array();
- if ( !isset( $functionsWarned[$function] ) ) {
- $functionsWarned[$function] = true;
- wfWarn( "Use of $function is deprecated.", 2 );
- }
-}
-
-/**
- * Send a warning either to the debug log or in a PHP error depending on
- * $wgDevelopmentWarnings
- *
- * @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 wfWarn, ...)
- * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
- * is true
- */
-function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
- global $wgDevelopmentWarnings;
-
- $callers = wfDebugBacktrace();
- if ( isset( $callers[$callerOffset + 1] ) ) {
- $callerfunc = $callers[$callerOffset + 1];
- $callerfile = $callers[$callerOffset];
- if ( isset( $callerfile['file'] ) && isset( $callerfile['line'] ) ) {
- $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
- } else {
- $file = '(internal function)';
- }
- $func = '';
- if ( isset( $callerfunc['class'] ) ) {
- $func .= $callerfunc['class'] . '::';
- }
- if ( isset( $callerfunc['function'] ) ) {
- $func .= $callerfunc['function'];
- }
- $msg .= " [Called from $func in $file]";
- }
-
- if ( $wgDevelopmentWarnings ) {
- trigger_error( $msg, $level );
- } else {
- wfDebug( "$msg\n" );
- }
-}
-
-/**
* Modern version of wfWaitForSlaves(). Instead of looking at replication lag
* and waiting for it to go down, this waits for the slaves to catch up to the
* master position. Use this when updating very large numbers of rows, as
@@ -3440,7 +3627,6 @@ function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
*
* @param $maxLag Integer (deprecated)
* @param $wiki mixed Wiki identifier accepted by wfGetLB
- * @return null
*/
function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
$lb = wfGetLB( $wiki );
@@ -3458,7 +3644,7 @@ function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
* @deprecated since 1.18, warnings in 1.18, remove in 1.20
*/
function wfOut( $s ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __FUNCTION__, '1.18' );
global $wgCommandLineMode;
if ( $wgCommandLineMode ) {
echo $s;
@@ -3472,6 +3658,7 @@ function wfOut( $s ) {
* Count down from $n to zero on the terminal, with a one-second pause
* between showing each number. For use in command-line scripts.
* @codeCoverageIgnore
+ * @param $n int
*/
function wfCountDown( $n ) {
for ( $i = $n; $i >= 0; $i-- ) {
@@ -3580,7 +3767,7 @@ function wfShorthandToInteger( $string = '' ) {
* See unit test for examples.
*
* @param $code String: The language code.
- * @return $langCode String: The language code which complying with BCP 47 standards.
+ * @return String: The language code which complying with BCP 47 standards.
*/
function wfBCP47( $code ) {
$codeSegment = explode( '-', $code );
@@ -3588,7 +3775,7 @@ function wfBCP47( $code ) {
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') {
+ if( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
$codeBCP[$segNo] = strtolower( $seg );
// ISO 3166 country code
} elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
@@ -3654,7 +3841,7 @@ function wfGetParserCacheStorage() {
*
* @param $event String: event name
* @param $args Array: parameters passed to hook functions
- * @return Boolean
+ * @return Boolean True if no handler aborted the hook
*/
function wfRunHooks( $event, $args = array() ) {
return Hooks::run( $event, $args );
diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index 948de61f..7326bf5c 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -33,10 +33,10 @@
* 'help-message' -- message key for a message to use as a help text.
* can be an array of msg key and then parameters to
* the message.
- * Overwrites 'help-messages'.
- * 'help-messages' -- array of message key. As above, each item can
- * be an array of msg key and then parameters.
- * Overwrites 'help-message'.
+ * Overwrites 'help-messages'.
+ * 'help-messages' -- array of message key. As above, each item can
+ * be an array of msg key and then parameters.
+ * Overwrites 'help-message'.
* 'required' -- passed through to the object, indicating that it
* is a required field.
* 'size' -- the length of text fields
@@ -53,9 +53,9 @@
*
* TODO: Document 'section' / 'subsection' stuff
*/
-class HTMLForm {
+class HTMLForm extends ContextSource {
- # A mapping of 'type' inputs onto standard HTMLFormField subclasses
+ // A mapping of 'type' inputs onto standard HTMLFormField subclasses
static $typeMappings = array(
'text' => 'HTMLTextField',
'textarea' => 'HTMLTextAreaField',
@@ -73,15 +73,18 @@ class HTMLForm {
'hidden' => 'HTMLHiddenField',
'edittools' => 'HTMLEditTools',
- # HTMLTextField will output the correct type="" attribute automagically.
- # There are about four zillion other HTML5 input types, like url, but
- # we don't use those at the moment, so no point in adding all of them.
+ // HTMLTextField will output the correct type="" attribute automagically.
+ // There are about four zillion other HTML5 input types, like url, but
+ // we don't use those at the moment, so no point in adding all of them.
'email' => 'HTMLTextField',
'password' => 'HTMLTextField',
);
protected $mMessagePrefix;
+
+ /** @var HTMLFormField[] */
protected $mFlatFields;
+
protected $mFieldTree;
protected $mShowReset = false;
public $mFieldData;
@@ -102,15 +105,30 @@ class HTMLForm {
protected $mSubmitText;
protected $mSubmitTooltip;
- protected $mContext; // <! IContextSource
protected $mTitle;
protected $mMethod = 'post';
+ /**
+ * Form action URL. false means we will use the URL to set Title
+ * @since 1.19
+ * @var false|string
+ */
+ protected $mAction = false;
+
protected $mUseMultipart = false;
protected $mHiddenFields = array();
protected $mButtons = array();
protected $mWrapperLegend = false;
+
+ /**
+ * If true, sections that contain both fields and subsections will
+ * render their subsections before their fields.
+ *
+ * Subclasses may set this to false to render subsections after fields
+ * instead.
+ */
+ protected $mSubSectionBeforeFields = true;
/**
* Build a new HTMLForm from an array of field attributes
@@ -121,7 +139,7 @@ class HTMLForm {
*/
public function __construct( $descriptor, /*IContextSource*/ $context = null, $messagePrefix = '' ) {
if( $context instanceof IContextSource ){
- $this->mContext = $context;
+ $this->setContext( $context );
$this->mTitle = false; // We don't need them to set a title
$this->mMessagePrefix = $messagePrefix;
} else {
@@ -175,11 +193,12 @@ class HTMLForm {
* done already.
* @deprecated since 1.18 load modules with ResourceLoader instead
*/
- static function addJS() { }
+ static function addJS() { wfDeprecated( __METHOD__, '1.18' ); }
/**
* Initialise a new Object for the field
- * @param $descriptor input Descriptor, as described above
+ * @param $fieldname string
+ * @param $descriptor string input Descriptor, as described above
* @return HTMLFormField subclass
*/
static function loadInputFromParameters( $fieldname, $descriptor ) {
@@ -221,12 +240,27 @@ class HTMLForm {
* @return Status|boolean
*/
function tryAuthorizedSubmit() {
- $editToken = $this->getRequest()->getVal( 'wpEditToken' );
-
$result = false;
- if ( $this->getMethod() != 'post' || $this->getUser()->matchEditToken( $editToken ) ) {
+
+ $submit = false;
+ if ( $this->getMethod() != 'post' ) {
+ $submit = true; // no session check needed
+ } elseif ( $this->getRequest()->wasPosted() ) {
+ $editToken = $this->getRequest()->getVal( 'wpEditToken' );
+ if ( $this->getUser()->isLoggedIn() || $editToken != null ) {
+ // Session tokens for logged-out users have no security value.
+ // However, if the user gave one, check it in order to give a nice
+ // "session expired" error instead of "permission denied" or such.
+ $submit = $this->getUser()->matchEditToken( $editToken );
+ } else {
+ $submit = true;
+ }
+ }
+
+ if ( $submit ) {
$result = $this->trySubmit();
}
+
return $result;
}
@@ -276,7 +310,7 @@ class HTMLForm {
$data = $this->filterDataForSubmit( $this->mFieldData );
- $res = call_user_func( $callback, $data );
+ $res = call_user_func( $callback, $data, $this );
return $res;
}
@@ -306,7 +340,16 @@ class HTMLForm {
* Set the introductory message, overwriting any existing message.
* @param $msg String complete text of message to display
*/
- function setIntro( $msg ) { $this->mPre = $msg; }
+ function setIntro( $msg ) {
+ $this->setPreText( $msg );
+ }
+
+ /**
+ * Set the introductory message, overwriting any existing message.
+ * @since 1.19
+ * @param $msg String complete text of message to display
+ */
+ function setPreText( $msg ) { $this->mPre = $msg; }
/**
* Add introductory text.
@@ -317,7 +360,7 @@ class HTMLForm {
/**
* Add header text, inside the form.
* @param $msg String complete text of message to display
- * @param $section The section to add the header to
+ * @param $section string The section to add the header to
*/
function addHeaderText( $msg, $section = null ) {
if ( is_null( $section ) ) {
@@ -331,6 +374,20 @@ class HTMLForm {
}
/**
+ * Set header text, inside the form.
+ * @since 1.19
+ * @param $msg String complete text of message to display
+ * @param $section The section to add the header to
+ */
+ function setHeaderText( $msg, $section = null ) {
+ if ( is_null( $section ) ) {
+ $this->mHeader = $msg;
+ } else {
+ $this->mSectionHeaders[$section] = $msg;
+ }
+ }
+
+ /**
* Add footer text, inside the form.
* @param $msg String complete text of message to display
* @param $section string The section to add the footer text to
@@ -347,12 +404,32 @@ class HTMLForm {
}
/**
+ * Set footer text, inside the form.
+ * @since 1.19
+ * @param $msg String complete text of message to display
+ * @param $section string The section to add the footer text to
+ */
+ function setFooterText( $msg, $section = null ) {
+ if ( is_null( $section ) ) {
+ $this->mFooter = $msg;
+ } else {
+ $this->mSectionFooters[$section] = $msg;
+ }
+ }
+
+ /**
* Add text to the end of the display.
* @param $msg String complete text of message to display
*/
function addPostText( $msg ) { $this->mPost .= $msg; }
/**
+ * Set text at the end of the display.
+ * @param $msg String complete text of message to display
+ */
+ function setPostText( $msg ) { $this->mPost = $msg; }
+
+ /**
* Add a hidden field to the output
* @param $name String field name. This will be used exactly as entered
* @param $value String field value
@@ -368,11 +445,20 @@ class HTMLForm {
}
/**
- * Display the form (sending to wgOut), with an appropriate error
+ * Display the form (sending to $wgOut), with an appropriate error
* message or stack of messages, and any validation errors, etc.
* @param $submitResult Mixed output from HTMLForm::trySubmit()
*/
function displayForm( $submitResult ) {
+ $this->getOutput()->addHTML( $this->getHTML( $submitResult ) );
+ }
+
+ /**
+ * Returns the raw HTML generated by the form
+ * @param $submitResult Mixed output from HTMLForm::trySubmit()
+ * @return string
+ */
+ function getHTML( $submitResult ) {
# For good measure (it is the default)
$this->getOutput()->preventClickjacking();
$this->getOutput()->addModules( 'mediawiki.htmlform' );
@@ -388,11 +474,7 @@ class HTMLForm {
$html = $this->wrapForm( $html );
- $this->getOutput()->addHTML( ''
- . $this->mPre
- . $html
- . $this->mPost
- );
+ return '' . $this->mPre . $html . $this->mPost;
}
/**
@@ -412,7 +494,7 @@ class HTMLForm {
: 'application/x-www-form-urlencoded';
# Attributes
$attribs = array(
- 'action' => $this->getTitle()->getFullURL(),
+ 'action' => $this->mAction === false ? $this->getTitle()->getFullURL() : $this->mAction,
'method' => $this->mMethod,
'class' => 'visualClear',
'enctype' => $encType,
@@ -433,7 +515,7 @@ class HTMLForm {
$html = '';
if( $this->getMethod() == 'post' ){
- $html .= Html::hidden( 'wpEditToken', $this->getUser()->editToken(), array( 'id' => 'wpEditToken' ) ) . "\n";
+ $html .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken(), array( 'id' => 'wpEditToken' ) ) . "\n";
$html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
}
@@ -506,6 +588,7 @@ class HTMLForm {
/**
* Get the whole body of the form.
+ * @return String
*/
function getBody() {
return $this->displaySection( $this->mFieldTree );
@@ -571,6 +654,15 @@ class HTMLForm {
}
/**
+ * Set the text for the submit button to a message
+ * @since 1.19
+ * @param $msg String message key
+ */
+ public function setSubmitTextMsg( $msg ) {
+ return $this->setSubmitText( $this->msg( $msg )->escaped() );
+ }
+
+ /**
* Get the text for the submit button, either customised or a default.
* @return unknown_type
*/
@@ -609,6 +701,16 @@ class HTMLForm {
public function setWrapperLegend( $legend ) { $this->mWrapperLegend = $legend; }
/**
+ * Prompt the whole form to be wrapped in a <fieldset>, with
+ * this message as its <legend> element.
+ * @since 1.19
+ * @param $msg String message key
+ */
+ public function setWrapperLegendMsg( $msg ) {
+ return $this->setWrapperLegend( $this->msg( $msg )->escaped() );
+ }
+
+ /**
* Set the prefix for various default messages
* TODO: currently only used for the <fieldset> legend on forms
* with multiple sections; should be used elsewhre?
@@ -637,36 +739,6 @@ class HTMLForm {
}
/**
- * @return IContextSource
- */
- public function getContext(){
- return $this->mContext instanceof IContextSource
- ? $this->mContext
- : RequestContext::getMain();
- }
-
- /**
- * @return OutputPage
- */
- public function getOutput(){
- return $this->getContext()->getOutput();
- }
-
- /**
- * @return WebRequest
- */
- public function getRequest(){
- return $this->getContext()->getRequest();
- }
-
- /**
- * @return User
- */
- public function getUser(){
- return $this->getContext()->getUser();
- }
-
- /**
* Set the method used to submit the form
* @param $method String
*/
@@ -680,9 +752,10 @@ class HTMLForm {
/**
* TODO: Document
- * @param $fields array of fields (either arrays or objects)
+ * @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
* @param $sectionName string ID attribute of the <table> tag for this section, ignored if empty
* @param $fieldsetIDPrefix string ID prefix for the <fieldset> tag of each subsection, ignored if empty
+ * @return String
*/
function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
$tableHtml = '';
@@ -696,8 +769,9 @@ class HTMLForm {
: $value->getDefault();
$tableHtml .= $value->getTableRow( $v );
- if ( $value->getLabel() != '&#160;' )
+ if ( $value->getLabel() != '&#160;' ) {
$hasLeftColumn = true;
+ }
} elseif ( is_array( $value ) ) {
$section = $this->displaySection( $value, $key );
$legend = $this->getLegend( $key );
@@ -732,7 +806,11 @@ class HTMLForm {
$tableHtml = Html::rawElement( 'table', $attribs,
Html::rawElement( 'tbody', array(), "\n$tableHtml\n" ) ) . "\n";
- return $subsectionHtml . "\n" . $tableHtml;
+ if ( $this->mSubSectionBeforeFields ) {
+ return $subsectionHtml . "\n" . $tableHtml;
+ } else {
+ return $tableHtml . "\n" . $subsectionHtml;
+ }
}
/**
@@ -789,6 +867,19 @@ class HTMLForm {
public function getLegend( $key ) {
return wfMsg( "{$this->mMessagePrefix}-$key" );
}
+
+ /**
+ * Set the value for the action attribute of the form.
+ * When set to false (which is the default state), the set title is used.
+ *
+ * @since 1.19
+ *
+ * @param string|false $action
+ */
+ public function setAction( $action ) {
+ $this->mAction = $action;
+ }
+
}
/**
@@ -830,20 +921,20 @@ abstract class HTMLFormField {
* @return Mixed Bool true on success, or String error to display.
*/
function validate( $value, $alldata ) {
- if ( isset( $this->mValidationCallback ) ) {
- return call_user_func( $this->mValidationCallback, $value, $alldata );
- }
-
if ( isset( $this->mParams['required'] ) && $value === '' ) {
return wfMsgExt( 'htmlform-required', 'parseinline' );
}
+ if ( isset( $this->mValidationCallback ) ) {
+ return call_user_func( $this->mValidationCallback, $value, $alldata, $this->mParent );
+ }
+
return true;
}
function filter( $value, $alldata ) {
if ( isset( $this->mFilterCallback ) ) {
- $value = call_user_func( $this->mFilterCallback, $value, $alldata );
+ $value = call_user_func( $this->mFilterCallback, $value, $alldata, $this->mParent );
}
return $value;
@@ -934,6 +1025,10 @@ abstract class HTMLFormField {
if ( isset( $params['filter-callback'] ) ) {
$this->mFilterCallback = $params['filter-callback'];
}
+
+ if ( isset( $params['flatlist'] ) ){
+ $this->mClass .= ' mw-htmlform-flatlist';
+ }
}
/**
@@ -1055,7 +1150,7 @@ abstract class HTMLFormField {
/**
* flatten an array of options to a single array, for instance,
* a set of <options> inside <optgroups>.
- * @param $options Associative Array with values either Strings
+ * @param $options array Associative Array with values either Strings
* or Arrays
* @return Array flattened input
*/
@@ -1118,6 +1213,10 @@ class HTMLTextField extends HTMLFormField {
'value' => $value,
) + $this->getTooltipAndAccessKey();
+ if ( $this->mClass !== '' ) {
+ $attribs['class'] = $this->mClass;
+ }
+
if ( isset( $this->mParams['maxlength'] ) ) {
$attribs['maxlength'] = $this->mParams['maxlength'];
}
@@ -1188,7 +1287,10 @@ class HTMLTextAreaField extends HTMLFormField {
'rows' => $this->getRows(),
) + $this->getTooltipAndAccessKey();
-
+ if ( $this->mClass !== '' ) {
+ $attribs['class'] = $this->mClass;
+ }
+
if ( !empty( $this->mParams['disabled'] ) ) {
$attribs['disabled'] = 'disabled';
}
@@ -1295,6 +1397,10 @@ class HTMLCheckField extends HTMLFormField {
if ( !empty( $this->mParams['disabled'] ) ) {
$attr['disabled'] = 'disabled';
}
+
+ if ( $this->mClass !== '' ) {
+ $attr['class'] = $this->mClass;
+ }
return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
@@ -1303,6 +1409,7 @@ class HTMLCheckField extends HTMLFormField {
/**
* For a checkbox, the label goes on the right hand side, and is
* added in getInputHTML(), rather than HTMLFormField::getRow()
+ * @return String
*/
function getLabel() {
return '&#160;';
@@ -1371,6 +1478,10 @@ class HTMLSelectField extends HTMLFormField {
if ( !empty( $this->mParams['disabled'] ) ) {
$select->setAttribute( 'disabled', 'disabled' );
}
+
+ if ( $this->mClass !== '' ) {
+ $select->setAttribute( 'class', $this->mClass );
+ }
$select->addOptions( $this->mParams['options'] );
@@ -1432,6 +1543,10 @@ class HTMLSelectOrOtherField extends HTMLTextField {
if ( isset( $this->mParams['maxlength'] ) ) {
$tbAttribs['maxlength'] = $this->mParams['maxlength'];
}
+
+ if ( $this->mClass !== '' ) {
+ $tbAttribs['class'] = $this->mClass;
+ }
$textbox = Html::input(
$this->mName . '-other',
@@ -1467,13 +1582,6 @@ class HTMLSelectOrOtherField extends HTMLTextField {
*/
class HTMLMultiSelectField extends HTMLFormField {
- public function __construct( $params ){
- parent::__construct( $params );
- if( isset( $params['flatlist'] ) ){
- $this->mClass .= ' mw-htmlform-multiselect-flatlist';
- }
- }
-
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
@@ -1525,7 +1633,7 @@ class HTMLMultiSelectField extends HTMLFormField {
$attribs + $thisAttribs );
$checkbox .= '&#160;' . Html::rawElement( 'label', array( 'for' => "{$this->mID}-$info" ), $label );
- $html .= ' ' . Html::rawElement( 'div', array( 'class' => 'mw-htmlform-multiselect-item' ), $checkbox );
+ $html .= ' ' . Html::rawElement( 'div', array( 'class' => 'mw-htmlform-flatlist-item' ), $checkbox );
}
}
@@ -1655,6 +1763,10 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
'id' => $this->mID . '-other',
'size' => $this->getSize(),
);
+
+ if ( $this->mClass !== '' ) {
+ $textAttribs['class'] = $this->mClass;
+ }
foreach ( array( 'required', 'autofocus', 'multiple', 'disabled' ) as $param ) {
if ( isset( $this->mParams[$param] ) ) {
@@ -1696,7 +1808,17 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
} else {
$final = $this->getDefault();
- $list = $text = '';
+
+ $list = 'other';
+ $text = $final;
+ foreach ( $this->mFlatOptions as $option ) {
+ $match = $option . wfMsgForContent( 'colon-separator' );
+ if( strpos( $text, $match ) === 0 ) {
+ $list = $option;
+ $text = substr( $text, strlen( $match ) );
+ break;
+ }
+ }
}
return array( $final, $list, $text );
}
@@ -1729,6 +1851,8 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
* Radio checkbox fields.
*/
class HTMLRadioField extends HTMLFormField {
+
+
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
@@ -1752,6 +1876,8 @@ class HTMLRadioField extends HTMLFormField {
/**
* This returns a block of all the radio options, in one cell.
* @see includes/HTMLFormField#getInputHTML()
+ * @param $value String
+ * @return String
*/
function getInputHTML( $value ) {
$html = $this->formatOptions( $this->mParams['options'], $value );
@@ -1774,16 +1900,16 @@ class HTMLRadioField extends HTMLFormField {
$html .= $this->formatOptions( $info, $value );
} else {
$id = Sanitizer::escapeId( $this->mID . "-$info" );
- $html .= Xml::radio(
+ $radio = Xml::radio(
$this->mName,
$info,
$info == $value,
$attribs + array( 'id' => $id )
);
- $html .= '&#160;' .
+ $radio .= '&#160;' .
Html::rawElement( 'label', array( 'for' => $id ), $label );
- $html .= "<br />\n";
+ $html .= ' ' . Html::rawElement( 'div', array( 'class' => 'mw-htmlform-flatlist-item' ), $radio );
}
}
@@ -1864,7 +1990,7 @@ class HTMLSubmitField extends HTMLFormField {
return Xml::submitButton(
$value,
array(
- 'class' => 'mw-htmlform-submit',
+ 'class' => 'mw-htmlform-submit ' . $this->mClass,
'name' => $this->mName,
'id' => $this->mID,
)
@@ -1877,6 +2003,9 @@ class HTMLSubmitField extends HTMLFormField {
/**
* Button cannot be invalid
+ * @param $value String
+ * @param $alldata Array
+ * @return Bool
*/
public function validate( $value, $alldata ){
return true;
diff --git a/includes/Hooks.php b/includes/Hooks.php
index dd08d03b..e1c1d50b 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -86,7 +86,7 @@ class Hooks {
*
* @param $event String: event name
* @param $args Array: parameters passed to hook functions
- * @return Boolean
+ * @return Boolean True if no handler aborted the hook
*/
public static function run( $event, $args = array() ) {
global $wgHooks;
@@ -222,9 +222,7 @@ class Hooks {
/* String return is an error; false return means stop processing. */
if ( is_string( $retval ) ) {
- global $wgOut;
- $wgOut->showFatalError( $retval );
- return false;
+ throw new FatalError( $retval );
} elseif( $retval === null ) {
if ( $closure ) {
$prettyFunc = "$event closure";
diff --git a/includes/Html.php b/includes/Html.php
index be9a1e1b..c61a1baf 100644
--- a/includes/Html.php
+++ b/includes/Html.php
@@ -48,7 +48,7 @@
* @since 1.16
*/
class Html {
- # List of void elements from HTML5, section 9.1.2 as of 2009-08-10
+ # List of void elements from HTML5, section 8.1.2 as of 2011-08-12
private static $voidElements = array(
'area',
'base',
@@ -64,16 +64,19 @@ class Html {
'meta',
'param',
'source',
+ 'track',
+ 'wbr',
);
# Boolean attributes, which may have the value omitted entirely. Manually
- # collected from the HTML5 spec as of 2010-06-07.
+ # collected from the HTML5 spec as of 2011-08-12.
private static $boolAttribs = array(
'async',
'autofocus',
'autoplay',
'checked',
'controls',
+ 'default',
'defer',
'disabled',
'formnovalidate',
@@ -82,6 +85,7 @@ class Html {
'itemscope',
'loop',
'multiple',
+ 'muted',
'novalidate',
'open',
'pubdate',
@@ -91,25 +95,40 @@ class Html {
'scoped',
'seamless',
'selected',
+ 'truespeed',
+ 'typemustmatch',
+ # HTML5 Microdata
+ '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
* values. If you're hardcoding all the attributes, or there are none, you
- * should probably type out the string yourself.
+ * should probably just type out the html element yourself.
*
* This is quite similar to Xml::tags(), but it implements some useful
* HTML-specific logic. For instance, there is no $allowShortTag
* parameter: the closing tag is magically omitted if $element has an empty
* content model. If $wgWellFormedXml is false, then a few bytes will be
- * shaved off the HTML output as well. In the future, other HTML-specific
- * features might be added, like allowing arrays for the values of
- * attributes like class= and media=.
+ * shaved off the HTML output as well.
*
* @param $element string The element's name, e.g., 'a'
* @param $attribs array Associative array of attributes, e.g., array(
- * 'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
+ * 'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
* further documentation.
* @param $contents string The raw HTML contents of the element: *not*
* escaped!
@@ -352,6 +371,28 @@ class Html {
* For instance, it will omit quotation marks if $wgWellFormedXml is false,
* and will treat boolean attributes specially.
*
+ * Attributes that should contain space-separated lists (such as 'class') array
+ * values are allowed as well, which will automagically be normalized
+ * and converted to a space-separated string. In addition to a numerical
+ * array, the attribute value may also be an associative array. See the
+ * example below for how that works.
+ *
+ * @par Numerical array
+ * @code
+ * Html::element( 'em', array(
+ * 'class' => array( 'foo', 'bar' )
+ * ) );
+ * // gives '<em class="foo bar"></em>'
+ * @endcode
+ *
+ * @par Associative array
+ * @code
+ * Html::element( 'em', array(
+ * 'class' => array( 'foo', 'bar', 'foo' => false, 'quux' => true )
+ * ) );
+ * // gives '<em class="bar quux"></em>'
+ * @endcode
+ *
* @param $attribs array Associative array of attributes, e.g., array(
* 'href' => 'http://www.mediawiki.org/' ). Values will be HTML-escaped.
* A value of false means to omit the attribute. For boolean attributes,
@@ -381,6 +422,12 @@ class Html {
# and 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
@@ -391,20 +438,53 @@ class Html {
continue;
}
- # Here we're blacklisting some HTML5-only attributes...
- if ( !$wgHtml5 && in_array( $key, array(
- 'autocomplete',
- 'autofocus',
- 'max',
- 'min',
- 'multiple',
- 'pattern',
- 'placeholder',
- 'required',
- 'step',
- 'spellcheck',
- ) ) ) {
- continue;
+ // http://www.w3.org/TR/html401/index/attributes.html ("space-separated")
+ // http://www.w3.org/TR/html5/index.html#attributes-1 ("space-separated")
+ $spaceSeparatedListAttributes = array(
+ 'class', // html4, html5
+ 'accesskey', // as of html5, multiple space-separated values allowed
+ // html4-spec doesn't document rel= as space-separated
+ // but has been used like that and is now documented as such
+ // in the html5-spec.
+ 'rel',
+ );
+
+ # Specific features for attributes that allow a list of space-separated values
+ if ( in_array( $key, $spaceSeparatedListAttributes ) ) {
+ // Apply some normalization and remove duplicates
+
+ // Convert into correct array. Array can contain space-seperated
+ // values. Implode/explode to get those into the main array as well.
+ if ( is_array( $value ) ) {
+ // If input wasn't an array, we can skip this step
+
+ $newValue = array();
+ foreach ( $value as $k => $v ) {
+ if ( is_string( $v ) ) {
+ // String values should be normal `array( 'foo' )`
+ // Just append them
+ if ( !isset( $value[$v] ) ) {
+ // As a special case don't set 'foo' if a
+ // separate 'foo' => true/false exists in the array
+ // keys should be authoritive
+ $newValue[] = $v;
+ }
+ } elseif ( $v ) {
+ // If the value is truthy but not a string this is likely
+ // an array( 'foo' => true ), falsy values don't add strings
+ $newValue[] = $k;
+ }
+ }
+ $value = implode( ' ', $newValue );
+ }
+ $value = explode( ' ', $value );
+
+ // Normalize spacing by fixing up cases where people used
+ // more than 1 space and/or a trailing/leading space
+ $value = array_diff( $value, array( '', ' ' ) );
+
+ // Remove duplicates and create the string
+ $value = implode( ' ', array_unique( $value ) );
}
# See the "Attributes" section in the HTML syntax part of HTML5,
@@ -460,6 +540,7 @@ class Html {
# @todo FIXME: Is this really true?
$map['<'] = '&lt;';
}
+
$ret .= " $key=$quote" . strtr( $value, $map ) . $quote;
}
}
@@ -620,6 +701,77 @@ class Html {
}
return self::element( 'textarea', $attribs, $spacedValue );
}
+ /**
+ * Build a drop-down box for selecting a namespace
+ *
+ * @param $params array:
+ * - selected: [optional] Id of namespace which should be pre-selected
+ * - all: [optional] Value of item for "all namespaces". If null or unset, no <option> is generated to select all namespaces
+ * - label: text for label to add before the field
+ * @param $selectAttribs array HTML attributes for the generated select element.
+ * - id: [optional], default: 'namespace'
+ * - name: [optional], default: 'namespace'
+ * @return string HTML code to select a namespace.
+ */
+ public static function namespaceSelector( Array $params = array(), Array $selectAttribs = array() ) {
+ global $wgContLang;
+
+ // Default 'id' & 'name' <select> attributes
+ $selectAttribs = $selectAttribs + array(
+ 'id' => 'namespace',
+ 'name' => 'namespace',
+ );
+ ksort( $selectAttribs );
+
+ // Is a namespace selected?
+ if ( isset( $params['selected'] ) ) {
+ // If string only contains digits, convert to clean int. Selected could also
+ // be "all" or "" etc. which needs to be left untouched.
+ // PHP is_numeric() has issues with large strings, PHP ctype_digit has other issues
+ // and returns false for already clean ints. Use regex instead..
+ if ( preg_match( '/^\d+$/', $params['selected'] ) ) {
+ $params['selected'] = intval( $params['selected'] );
+ }
+ // else: leaves it untouched for later processing
+ } else {
+ $params['selected'] = '';
+ }
+
+ // Array holding the <option> elements
+ $options = array();
+
+ if ( isset( $params['all'] ) ) {
+ // add an <option> that would let the user select all namespaces.
+ // Value is provided by user, the name shown is localized.
+ $options[$params['all']] = wfMsg( 'namespacesall' );
+ }
+ // Add defaults <option> according to content language
+ $options += $wgContLang->getFormattedNamespaces();
+
+ // Convert $options to HTML
+ $optionsHtml = array();
+ foreach ( $options as $nsId => $nsName ) {
+ if ( $nsId < NS_MAIN ) {
+ continue;
+ }
+ if ( $nsId === 0 ) {
+ $nsName = wfMsg( 'blanknamespace' );
+ }
+ $optionsHtml[] = Xml::option( $nsName, $nsId, $nsId === $params['selected'] );
+ }
+
+ // Forge a <select> element and returns it
+ $ret = '';
+ if ( isset( $params['label'] ) ) {
+ $ret .= Xml::label( $params['label'], $selectAttribs['id'] ) . '&#160;';
+ }
+ $ret .= Html::openElement( 'select', $selectAttribs )
+ . "\n"
+ . implode( "\n", $optionsHtml )
+ . "\n"
+ . Html::closeElement( 'select' );
+ return $ret;
+ }
/**
* Constructs the opening html-tag with necessary doctypes depending on
diff --git a/includes/HttpFunctions.old.php b/includes/HttpFunctions.old.php
index ddfa608e..479b4d23 100644
--- a/includes/HttpFunctions.old.php
+++ b/includes/HttpFunctions.old.php
@@ -9,5 +9,4 @@
* This is for backwards compatibility.
* @since 1.17
*/
-
class HttpRequest extends MWHttpRequest { }
diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php
index a80fec17..147823fe 100644
--- a/includes/HttpFunctions.php
+++ b/includes/HttpFunctions.php
@@ -29,6 +29,8 @@ class Http {
* - followRedirects Whether to follow redirects (defaults to false).
* Note: this should only be used when the target URL is trusted,
* to avoid attacks on intranet services accessible by HTTP.
+ * - userAgent A user agent, if you want to override the default
+ * MediaWiki/$wgVersion
* @return Mixed: (bool)false on failure or a string on success
*/
public static function request( $method, $url, $options = array() ) {
@@ -40,6 +42,9 @@ class Http {
}
$req = MWHttpRequest::factory( $url, $options );
+ if( isset( $options['userAgent'] ) ) {
+ $req->setUserAgent( $options['userAgent'] );
+ }
$status = $req->execute();
if ( $status->isOK() ) {
@@ -53,6 +58,9 @@ class Http {
* Simple wrapper for Http::request( 'GET' )
* @see Http::request()
*
+ * @param $url
+ * @param $timeout string
+ * @param $options array
* @return string
*/
public static function get( $url, $timeout = 'default', $options = array() ) {
@@ -64,6 +72,8 @@ class Http {
* Simple wrapper for Http::request( 'POST' )
* @see Http::request()
*
+ * @param $url
+ * @param $options array
* @return string
*/
public static function post( $url, $options = array() ) {
@@ -124,10 +134,12 @@ class Http {
* protocols, because we only want protocols that both cURL
* and php support.
*
+ * file:// should not be allowed here for security purpose (r67684)
+ *
* @fixme this is wildly inaccurate and fails to actually check most stuff
*
* @param $uri Mixed: URI to check for validity
- * @returns Boolean
+ * @return Boolean
*/
public static function isValidURI( $uri ) {
return preg_match(
@@ -184,9 +196,9 @@ class MWHttpRequest {
global $wgHTTPTimeout;
$this->url = wfExpandUrl( $url, PROTO_HTTP );
- $this->parsedUrl = parse_url( $this->url );
+ $this->parsedUrl = wfParseUrl( $this->url );
- if ( !Http::isValidURI( $this->url ) ) {
+ if ( !$this->parsedUrl || !Http::isValidURI( $this->url ) ) {
$this->status = Status::newFatal( 'http-invalid-url' );
} else {
$this->status = Status::newGood( 100 ); // continue
@@ -221,6 +233,7 @@ class MWHttpRequest {
* Generate a new request object
* @param $url String: url to use
* @param $options Array: (optional) extra params to pass (see Http::request())
+ * @return CurlHttpRequest|PhpHttpRequest
* @see MWHttpRequest::__construct
*/
public static function factory( $url, $options = null ) {
@@ -278,7 +291,7 @@ class MWHttpRequest {
}
if ( Http::isLocalURL( $this->url ) ) {
- $this->proxy = 'http://localhost:80/';
+ $this->proxy = '';
} elseif ( $wgHTTPProxy ) {
$this->proxy = $wgHTTPProxy ;
} elseif ( getenv( "http_proxy" ) ) {
@@ -295,6 +308,7 @@ class MWHttpRequest {
/**
* Set the user agent
+ * @param $UA string
*/
public function setUserAgent( $UA ) {
$this->setHeader( 'User-Agent', $UA );
@@ -302,6 +316,8 @@ class MWHttpRequest {
/**
* Set an arbitrary header
+ * @param $name
+ * @param $value
*/
public function setHeader( $name, $value ) {
// I feel like I should normalize the case here...
@@ -310,6 +326,7 @@ class MWHttpRequest {
/**
* Get an array of the headers
+ * @return array
*/
public function getHeaderList() {
$list = array();
@@ -525,7 +542,7 @@ class MWHttpRequest {
/**
* Returns the cookie jar in use.
*
- * @returns CookieJar
+ * @return CookieJar
*/
public function getCookieJar() {
if ( !$this->respHeaders ) {
@@ -540,6 +557,9 @@ class MWHttpRequest {
* cookies. Used internally after a request to parse the
* Set-Cookie headers.
* @see Cookie::set
+ * @param $name
+ * @param $value null
+ * @param $attr null
*/
public function setCookie( $name, $value = null, $attr = null ) {
if ( !$this->cookieJar ) {
@@ -568,13 +588,48 @@ class MWHttpRequest {
/**
* Returns the final URL after all redirections.
*
- * @return String
+ * Relative values of the "Location" header are incorrect as stated in RFC, however they do happen and modern browsers support them.
+ * This function loops backwards through all locations in order to build the proper absolute URI - Marooned at wikia-inc.com
+ *
+ * Note that the multiple Location: headers are an artifact of CURL -- they
+ * shouldn't actually get returned this way. Rewrite this when bug 29232 is
+ * taken care of (high-level redirect handling rewrite).
+ *
+ * @return string
*/
public function getFinalUrl() {
- $location = $this->getResponseHeader( "Location" );
+ $headers = $this->getResponseHeaders();
+
+ //return full url (fix for incorrect but handled relative 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 ] );
+
+ if ( isset($url[ 'host' ]) ) {
+ $domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
+ break; //found correct URI (with host)
+ } else {
+ $foundRelativeURI = true;
+ }
+ }
- if ( $location ) {
- return $location;
+ if ( $foundRelativeURI ) {
+ if ( $domain ) {
+ return $domain . $locations[ $countLocations - 1 ];
+ } else {
+ $url = parse_url( $this->url );
+ if ( isset($url[ 'host' ]) ) {
+ return $url[ 'scheme' ] . '://' . $url[ 'host' ] . $locations[ $countLocations - 1 ];
+ }
+ }
+ } else {
+ return $locations[ $countLocations - 1 ];
+ }
}
return $this->url;
@@ -583,6 +638,7 @@ class MWHttpRequest {
/**
* Returns true if the backend can follow redirects. Overridden by the
* child classes.
+ * @return bool
*/
public function canFollowRedirects() {
return true;
@@ -603,6 +659,11 @@ class CurlHttpRequest extends MWHttpRequest {
protected $curlOptions = array();
protected $headerText = "";
+ /**
+ * @param $fh
+ * @param $content
+ * @return int
+ */
protected function readHeader( $fh, $content ) {
$this->headerText .= $content;
return strlen( $content );
@@ -694,6 +755,9 @@ class CurlHttpRequest extends MWHttpRequest {
return $this->status;
}
+ /**
+ * @return bool
+ */
public function canFollowRedirects() {
if ( strval( ini_get( 'open_basedir' ) ) !== '' || wfIniGetBool( 'safe_mode' ) ) {
wfDebug( "Cannot follow redirects in safe mode\n" );
@@ -710,6 +774,11 @@ class CurlHttpRequest extends MWHttpRequest {
}
class PhpHttpRequest extends MWHttpRequest {
+
+ /**
+ * @param $url string
+ * @return string
+ */
protected function urlToTcp( $url ) {
$parsedUrl = parse_url( $url );
@@ -797,7 +866,7 @@ class PhpHttpRequest extends MWHttpRequest {
# Check security of URL
$url = $this->getResponseHeader( "Location" );
- if ( substr( $url, 0, 7 ) !== 'http://' ) {
+ if ( !Http::isValidURI( $url ) ) {
wfDebug( __METHOD__ . ": insecure redirection\n" );
break;
}
diff --git a/includes/IP.php b/includes/IP.php
index 1da7cd07..e3f61214 100644
--- a/includes/IP.php
+++ b/includes/IP.php
@@ -18,7 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @author Ashar Voultoiz <hashar at free dot fr>, Aaron Schulz
+ * @author Antoine Musso <hashar at free dot fr>, Aaron Schulz
*/
// Some regex definition to "play" with IP address and IP address blocks
@@ -186,14 +186,14 @@ class IP {
}
/**
- * Given a host/port string, like one might find in the host part of a URL
- * per RFC 2732, split the hostname part and the port part and return an
- * array with an element for each. If there is no port part, the array will
- * have false in place of the port. If the string was invalid in some way,
+ * Given a host/port string, like one might find in the host part of a URL
+ * per RFC 2732, split the hostname part and the port part and return an
+ * array with an element for each. If there is no port part, the array will
+ * have false in place of the port. If the string was invalid in some way,
* false is returned.
*
- * This was easy with IPv4 and was generally done in an ad-hoc way, but
- * with IPv6 it's somewhat more complicated due to the need to parse the
+ * This was easy with IPv4 and was generally done in an ad-hoc way, but
+ * with IPv6 it's somewhat more complicated due to the need to parse the
* square brackets and colons.
*
* A bare IPv6 address is accepted despite the lack of square brackets.
@@ -241,8 +241,13 @@ class IP {
/**
* Given a host name and a port, combine them into host/port string like
* you might find in a URL. If the host contains a colon, wrap it in square
- * brackets like in RFC 2732. If the port matches the default port, omit
+ * brackets like in RFC 2732. If the port matches the default port, omit
* the port specification
+ *
+ * @param $host string
+ * @param $port int
+ * @param $defaultPort bool|int
+ * @return string
*/
public static function combineHostAndPort( $host, $port, $defaultPort = false ) {
if ( strpos( $host, ':' ) !== false ) {
@@ -449,6 +454,10 @@ class IP {
return $n;
}
+ /**
+ * @param $ip
+ * @return String
+ */
private static function toUnsigned6( $ip ) {
return wfBaseConvert( self::IPv6ToRawHex( $ip ), 16, 10 );
}
@@ -548,6 +557,8 @@ class IP {
* Convert a network specification in IPv6 CIDR notation to an
* integer network and a number of bits
*
+ * @param $range
+ *
* @return array(string, int)
*/
private static function parseCIDR6( $range ) {
@@ -585,6 +596,9 @@ class IP {
* 2001:0db8:85a3::7344/96 CIDR
* 2001:0db8:85a3::7344 - 2001:0db8:85a3::7344 Explicit range
* 2001:0db8:85a3::7344/96 Single IP
+ *
+ * @param $range
+ *
* @return array(string, string)
*/
private static function parseRange6( $range ) {
diff --git a/includes/ImageFunctions.php b/includes/ImageFunctions.php
index d048a9dd..4b90e24a 100644
--- a/includes/ImageFunctions.php
+++ b/includes/ImageFunctions.php
@@ -16,10 +16,11 @@
*
* @param $name string the image name to check
* @param $contextTitle Title|bool the page on which the image occurs, if known
+ * @param $blacklist string wikitext of a file blacklist
* @return bool
*/
-function wfIsBadImage( $name, $contextTitle = false ) {
- static $badImages = false;
+function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
+ static $badImageCache = null; // based on bad_image_list msg
wfProfileIn( __METHOD__ );
# Handle redirects
@@ -34,11 +35,17 @@ function wfIsBadImage( $name, $contextTitle = false ) {
wfProfileOut( __METHOD__ );
return $bad;
}
-
- if( !$badImages ) {
+
+ $cacheable = ( $blacklist === null );
+ if( $cacheable && $badImageCache !== null ) {
+ $badImages = $badImageCache;
+ } else { // cache miss
+ if ( $blacklist === null ) {
+ $blacklist = wfMsgForContentNoTrans( 'bad_image_list' ); // site list
+ }
# Build the list now
$badImages = array();
- $lines = explode( "\n", wfMsgForContentNoTrans( 'bad_image_list' ) );
+ $lines = explode( "\n", $blacklist );
foreach( $lines as $line ) {
# List items only
if ( substr( $line, 0, 1 ) !== '*' ) {
@@ -68,6 +75,9 @@ function wfIsBadImage( $name, $contextTitle = false ) {
$badImages[$imageDBkey] = $exceptions;
}
}
+ if ( $cacheable ) {
+ $badImageCache = $badImages;
+ }
}
$contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
@@ -75,20 +85,3 @@ function wfIsBadImage( $name, $contextTitle = false ) {
wfProfileOut( __METHOD__ );
return $bad;
}
-
-/**
- * Calculate the largest thumbnail width for a given original file size
- * such that the thumbnail's height is at most $maxHeight.
- * @param $boxWidth Integer Width of the thumbnail box.
- * @param $boxHeight Integer Height of the thumbnail box.
- * @param $maxHeight Integer Maximum height expected for the thumbnail.
- * @return Integer.
- */
-function wfFitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
- $idealWidth = $boxWidth * $maxHeight / $boxHeight;
- $roundedUp = ceil( $idealWidth );
- if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight )
- return floor( $idealWidth );
- else
- return $roundedUp;
-}
diff --git a/includes/ImageGallery.php b/includes/ImageGallery.php
index 4d5f067c..1106124a 100644
--- a/includes/ImageGallery.php
+++ b/includes/ImageGallery.php
@@ -28,9 +28,9 @@ class ImageGallery {
* Contextual title, used when images are being screened
* against the bad image list
*/
- private $contextTitle = false;
+ protected $contextTitle = false;
- private $mAttribs = array();
+ protected $mAttribs = array();
/**
* Fixed margins
@@ -131,7 +131,7 @@ class ImageGallery {
* @deprecated since 1.18 Not used anymore
*/
function useSkin( $skin ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
/* no op */
}
@@ -249,11 +249,11 @@ class ImageGallery {
# Get the file...
if ( $this->mParser instanceof Parser ) {
# Give extensions a chance to select the file revision for us
- $time = $sha1 = false;
+ $options = array();
wfRunHooks( 'BeforeParserFetchFileAndTitle',
- array( $this->mParser, $nt, &$time, &$sha1, &$descQuery ) );
+ 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, $time, $sha1 );
+ list( $img, $nt ) = $this->mParser->fetchFileAndTitle( $nt, $options );
} else {
$img = wfFindFile( $nt );
}
@@ -314,8 +314,7 @@ class ImageGallery {
if( $this->mShowBytes ) {
if( $img ) {
- $fileSize = wfMsgExt( 'nbytes', array( 'parsemag', 'escape'),
- $wgLang->formatNum( $img->getSize() ) );
+ $fileSize = htmlspecialchars( $wgLang->formatSize( $img->getSize() ) );
} else {
$fileSize = wfMsgHtml( 'filemissing' );
}
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index 956977e0..dcb09a41 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -18,6 +18,10 @@ class ImagePage extends Article {
var $mExtraDescription = false;
+ /**
+ * @param $title Title
+ * @return WikiFilePage
+ */
protected function newPage( Title $title ) {
// Overload mPage with a file-specific page
return new WikiFilePage( $title );
@@ -99,13 +103,11 @@ class ImagePage extends Article {
$wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
$wgOut->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
/* $appendSubtitle */ true, /* $forceKnown */ true ) );
- $this->mPage->viewUpdates();
+ $this->mPage->doViewUpdates( $this->getContext()->getUser() );
return;
}
}
- $this->showRedirectedFromHeader();
-
if ( $wgShowEXIF && $this->displayImg->exists() ) {
// @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
$formattedMetadata = $this->displayImg->formatMetadata();
@@ -136,7 +138,7 @@ class ImagePage extends Article {
# Just need to set the right headers
$wgOut->setArticleFlag( true );
$wgOut->setPageTitle( $this->getTitle()->getPrefixedText() );
- $this->mPage->viewUpdates();
+ $this->mPage->doViewUpdates( $this->getContext()->getUser() );
}
# Show shared description, if needed
@@ -184,6 +186,9 @@ class ImagePage extends Article {
$wgOut->addModuleStyles( 'filepage' );
}
+ /**
+ * @return File
+ */
public function getDisplayedFile() {
$this->loadFile();
return $this->displayImg;
@@ -243,6 +248,7 @@ class ImagePage extends Article {
*
* Omit noarticletext if sharedupload; text will be fetched from the
* shared upload server if possible.
+ * @return string
*/
public function getContent() {
$this->loadFile();
@@ -254,7 +260,7 @@ class ImagePage extends Article {
protected function openShowImage() {
global $wgOut, $wgUser, $wgImageLimits, $wgRequest,
- $wgLang, $wgEnableUploads;
+ $wgLang, $wgEnableUploads, $wgSend404Code;
$this->loadFile();
@@ -322,12 +328,21 @@ class ImagePage extends Article {
}
$msgsmall = wfMessage( 'show-big-image-preview' )->
rawParams( $this->makeSizeLink( $params, $width, $height ) )->
- parse() . ' ' .
- wfMessage( 'show-big-image-other' )->
- rawParams( $wgLang->pipeList( $otherSizes ) )->parse();
+ parse();
+ if ( count( $otherSizes ) && $this->displayImg->getRepo()->canTransformVia404() ) {
+ $msgsmall .= ' ' .
+ Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
+ wfMessage( 'show-big-image-other' )->rawParams( $wgLang->pipeList( $otherSizes ) )->
+ params( count( $otherSizes ) )->parse()
+ );
+ }
+ } elseif ( $width == 0 && $height == 0 ){
+ # Some sort of audio file that doesn't have dimensions
+ # Don't output a no hi res message for such a file
+ $msgsmall = '';
} else {
# Image is small enough to show full size on image page
- $msgsmall = wfMsgExt( 'file-nohires', array( 'parseinline' ) );
+ $msgsmall = wfMessage( 'file-nohires' )->parse();
}
$params['width'] = $width;
@@ -335,7 +350,7 @@ class ImagePage extends Article {
$thumbnail = $this->displayImg->transform( $params );
$showLink = true;
- $anchorclose = '<br />' . $msgsmall;
+ $anchorclose = Html::rawElement( 'div', array( 'class' => 'mw-filepage-resolutioninfo' ), $msgsmall );
$isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
if ( $isMulti ) {
@@ -392,7 +407,7 @@ class ImagePage extends Article {
'action' => $wgScript,
'onchange' => 'document.pageselector.submit();',
);
-
+ $options = array();
for ( $i = 1; $i <= $count; $i++ ) {
$options[] = Xml::option( $wgLang->formatNum( $i ), $i, $i == $page );
}
@@ -407,7 +422,7 @@ class ImagePage extends Article {
wfMsgExt( 'imgmultigoto', array( 'parseinline', 'replaceafter' ), $select ) .
Xml::submitButton( wfMsg( 'imgmultigo' ) ) .
Xml::closeElement( 'form' ) .
- "<hr />$thumb1\n$thumb2<br clear=\"all\" /></div></td></tr></table>"
+ "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
);
}
} else {
@@ -467,7 +482,7 @@ EOT
// by Article::View().
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
- if ( !$this->getID() ) {
+ if ( !$this->getID() && $wgSend404Code ) {
// If there is no image, no shared image, and no description page,
// output a 404, to be consistent with articles.
$wgRequest->response()->header( 'HTTP/1.1 404 Not Found' );
@@ -478,9 +493,10 @@ EOT
/**
* Creates an thumbnail of specified size and returns an HTML link to it
- * @param array $params Scaler parameters
- * @param int $width
- * @param int $height
+ * @param $params array Scaler parameters
+ * @param $width int
+ * @param $height int
+ * @return string
*/
private function makeSizeLink( $params, $width, $height ) {
$params['width'] = $width;
@@ -609,6 +625,11 @@ EOT
}
}
+ /**
+ * @param $target
+ * @param $limit
+ * @return ResultWrapper
+ */
protected function queryImageLinks( $target, $limit ) {
$dbr = wfGetDB( DB_SLAVE );
@@ -741,6 +762,9 @@ EOT
);
$wgOut->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+ /**
+ * @var $file File
+ */
foreach ( $dupes as $file ) {
$fromSrc = '';
if ( $file->isLocal() ) {
@@ -765,29 +789,25 @@ EOT
* Delete the file, or an earlier version of it
*/
public function delete() {
- global $wgUploadMaintenance;
- if ( $wgUploadMaintenance && $this->getTitle() && $this->getTitle()->getNamespace() == NS_FILE ) {
- global $wgOut;
- $wgOut->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n", array( 'filedelete-maintenance' ) );
- return;
- }
-
- $this->loadFile();
- if ( !$this->mPage->getFile()->exists() || !$this->mPage->getFile()->isLocal() || $this->mPage->getFile()->getRedirected() ) {
+ $file = $this->mPage->getFile();
+ if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
// Standard article deletion
parent::delete();
return;
}
- $deleter = new FileDeleteForm( $this->mPage->getFile() );
+
+ $deleter = new FileDeleteForm( $file );
$deleter->execute();
}
/**
* Display an error with a wikitext description
+ *
+ * @param $description String
*/
function showError( $description ) {
global $wgOut;
- $wgOut->setPageTitle( wfMsg( 'internalerror' ) );
+ $wgOut->setPageTitle( wfMessage( 'internalerror' ) );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->setArticleRelated( false );
$wgOut->enableClientCache( false );
@@ -833,6 +853,11 @@ class ImageHistoryList {
*/
protected $imagePage;
+ /**
+ * @var File
+ */
+ protected $current;
+
protected $repo, $showThumb;
protected $preventClickjacking = false;
@@ -848,14 +873,24 @@ class ImageHistoryList {
$this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
}
+ /**
+ * @return ImagePage
+ */
public function getImagePage() {
return $this->imagePage;
}
+ /**
+ * @return File
+ */
public function getFile() {
return $this->img;
}
+ /**
+ * @param $navLinks string
+ * @return string
+ */
public function beginImageHistoryList( $navLinks = '' ) {
global $wgOut, $wgUser;
return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
@@ -873,6 +908,10 @@ class ImageHistoryList {
. "</tr>\n";
}
+ /**
+ * @param $navLinks string
+ * @return string
+ */
public function endImageHistoryList( $navLinks = '' ) {
return "</table>\n$navLinks\n</div>\n";
}
@@ -948,7 +987,7 @@ class ImageHistoryList {
array(
'action' => 'revert',
'oldimage' => $img,
- 'wpEditToken' => $wgUser->editToken( $img )
+ 'wpEditToken' => $wgUser->getEditToken( $img )
),
array( 'known', 'noclasses' )
);
@@ -963,7 +1002,7 @@ class ImageHistoryList {
$row .= "<td $selected style='white-space: nowrap;'>";
if ( !$file->userCan( File::DELETED_FILE ) ) {
# Don't link to unviewable files
- $row .= '<span class="history-deleted">' . $wgLang->timeAndDate( $timestamp, true ) . '</span>';
+ $row .= '<span class="history-deleted">' . $wgLang->timeanddate( $timestamp, true ) . '</span>';
} elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
if ( $local ) {
$this->preventClickjacking();
@@ -971,22 +1010,22 @@ class ImageHistoryList {
# Make a link to review the image
$url = Linker::link(
$revdel,
- $wgLang->timeAndDate( $timestamp, true ),
+ $wgLang->timeanddate( $timestamp, true ),
array(),
array(
'target' => $this->title->getPrefixedText(),
'file' => $img,
- 'token' => $wgUser->editToken( $img )
+ 'token' => $wgUser->getEditToken( $img )
),
array( 'known', 'noclasses' )
);
} else {
- $url = $wgLang->timeAndDate( $timestamp, true );
+ $url = $wgLang->timeanddate( $timestamp, true );
}
$row .= '<span class="history-deleted">' . $url . '</span>';
} else {
$url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
- $row .= Xml::element( 'a', array( 'href' => $url ), $wgLang->timeAndDate( $timestamp, true ) );
+ $row .= Xml::element( 'a', array( 'href' => $url ), $wgLang->timeanddate( $timestamp, true ) );
}
$row .= "</td>";
@@ -1020,7 +1059,7 @@ class ImageHistoryList {
if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
$row .= '<td><span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span></td>';
} else {
- $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::commentBlock( $description, $this->title ) . '</td>';
+ $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::formatComment( $description, $this->title ) . '</td>';
}
$rowClass = null;
@@ -1047,7 +1086,7 @@ class ImageHistoryList {
$thumbnail = $file->transform( $params );
$options = array(
'alt' => wfMsg( 'filehist-thumbtext',
- $wgLang->timeAndDate( $timestamp, true ),
+ $wgLang->timeanddate( $timestamp, true ),
$wgLang->date( $timestamp, true ),
$wgLang->time( $timestamp, true ) ),
'file-link' => true,
@@ -1063,10 +1102,16 @@ class ImageHistoryList {
}
}
+ /**
+ * @param $enable bool
+ */
protected function preventClickjacking( $enable = true ) {
$this->preventClickjacking = $enable;
}
+ /**
+ * @return bool
+ */
public function getPreventClickjacking() {
return $this->preventClickjacking;
}
@@ -1098,6 +1143,9 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
$this->mRange = array( 0, 0 ); // display range
}
+ /**
+ * @return Title
+ */
function getTitle() {
return $this->mTitle;
}
@@ -1106,14 +1154,23 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
return false;
}
+ /**
+ * @return string
+ */
function getIndexField() {
return '';
}
+ /**
+ * @return string
+ */
function formatRow( $row ) {
return '';
}
+ /**
+ * @return string
+ */
function getBody() {
$s = '';
$this->doQuery();
@@ -1217,10 +1274,16 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
$this->mQueryDone = true;
}
+ /**
+ * @param $enable bool
+ */
protected function preventClickjacking( $enable = true ) {
$this->preventClickjacking = $enable;
}
+ /**
+ * @return bool
+ */
public function getPreventClickjacking() {
return $this->preventClickjacking;
}
diff --git a/includes/Import.php b/includes/Import.php
index b874462e..e906c7f0 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -34,11 +34,13 @@ class WikiImporter {
private $reader = null;
private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
private $mSiteInfoCallback, $mTargetNamespace, $mPageOutCallback;
- private $mDebug;
+ private $mNoticeCallback, $mDebug;
private $mImportUploads, $mImageBasePath;
+ private $mNoUpdates = false;
/**
* Creates an ImportXMLReader drawing from the source provided
+ * @param $source
*/
function __construct( $source ) {
$this->reader = new XMLReader();
@@ -47,8 +49,7 @@ class WikiImporter {
$id = UploadSourceAdapter::registerSource( $source );
if (defined( 'LIBXML_PARSEHUGE' ) ) {
$this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
- }
- else {
+ } else {
$this->reader->open( "uploadsource://$id" );
}
@@ -74,24 +75,44 @@ class WikiImporter {
wfDebug( "IMPORT: $data\n" );
}
- private function notice( $data ) {
- global $wgCommandLineMode;
- if( $wgCommandLineMode ) {
- print "$data\n";
- } else {
- global $wgOut;
- $wgOut->addHTML( "<li>" . htmlspecialchars( $data ) . "</li>\n" );
+ private function notice( $msg /*, $param, ...*/ ) {
+ $params = func_get_args();
+ array_shift( $params );
+
+ if ( is_callable( $this->mNoticeCallback ) ) {
+ call_user_func( $this->mNoticeCallback, $msg, $params );
+ } else { # No ImportReporter -> CLI
+ echo wfMessage( $msg, $params )->text() . "\n";
}
}
/**
* Set debug mode...
+ * @param $debug bool
*/
function setDebug( $debug ) {
$this->mDebug = $debug;
}
/**
+ * Set 'no updates' mode. In this mode, the link tables will not be updated by the importer
+ * @param $noupdates bool
+ */
+ function setNoUpdates( $noupdates ) {
+ $this->mNoUpdates = $noupdates;
+ }
+
+ /**
+ * Set a callback that displays notice messages
+ *
+ * @param $callback callback
+ * @return callback
+ */
+ public function setNoticeCallback( $callback ) {
+ return wfSetVar( $this->mNoticeCallback, $callback );
+ }
+
+ /**
* Sets the action to perform as each new page in the stream is reached.
* @param $callback callback
* @return callback
@@ -163,6 +184,8 @@ class WikiImporter {
/**
* Set a target namespace to override the defaults
+ * @param $namespace
+ * @return bool
*/
public function setTargetNamespace( $namespace ) {
if( is_null( $namespace ) ) {
@@ -175,13 +198,17 @@ class WikiImporter {
return false;
}
}
-
+
/**
- *
+ * @param $dir
*/
public function setImageBasePath( $dir ) {
$this->mImageBasePath = $dir;
}
+
+ /**
+ * @param $import
+ */
public function setImportUploads( $import ) {
$this->mImportUploads = $import;
}
@@ -189,6 +216,7 @@ class WikiImporter {
/**
* Default per-revision callback, performs the import.
* @param $revision WikiRevision
+ * @return bool
*/
public function importRevision( $revision ) {
$dbw = wfGetDB( DB_MASTER );
@@ -198,6 +226,7 @@ class WikiImporter {
/**
* Default per-revision callback, performs the import.
* @param $rev WikiRevision
+ * @return bool
*/
public function importLogItem( $rev ) {
$dbw = wfGetDB( DB_MASTER );
@@ -206,6 +235,8 @@ class WikiImporter {
/**
* Dummy for now...
+ * @param $revision
+ * @return bool
*/
public function importUpload( $revision ) {
$dbw = wfGetDB( DB_MASTER );
@@ -214,6 +245,12 @@ class WikiImporter {
/**
* Mostly for hook use
+ * @param $title
+ * @param $origTitle
+ * @param $revCount
+ * @param $sRevCount
+ * @param $pageInfo
+ * @return
*/
public function finishImportPage( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) {
$args = func_get_args();
@@ -403,6 +440,10 @@ class WikiImporter {
return true;
}
+ /**
+ * @return bool
+ * @throws MWException
+ */
private function handleSiteInfo() {
// Site info is useful, but not actually used for dump imports.
// Includes a quick short-circuit to save performance.
@@ -444,6 +485,10 @@ class WikiImporter {
$this->processLogItem( $logInfo );
}
+ /**
+ * @param $logInfo
+ * @return bool|mixed
+ */
private function processLogItem( $logInfo ) {
$revision = new WikiRevision;
@@ -453,6 +498,7 @@ class WikiImporter {
$revision->setTimestamp( $logInfo['timestamp'] );
$revision->setParams( $logInfo['params'] );
$revision->setTitle( Title::newFromText( $logInfo['logtitle'] ) );
+ $revision->setNoUpdates( $this->mNoUpdates );
if ( isset( $logInfo['comment'] ) ) {
$revision->setComment( $logInfo['comment'] );
@@ -522,6 +568,9 @@ class WikiImporter {
$pageInfo );
}
+ /**
+ * @param $pageInfo array
+ */
private function handleRevision( &$pageInfo ) {
$this->debug( "Enter revision handler" );
$revisionInfo = array();
@@ -557,6 +606,11 @@ class WikiImporter {
}
}
+ /**
+ * @param $pageInfo
+ * @param $revisionInfo
+ * @return bool|mixed
+ */
private function processRevision( $pageInfo, $revisionInfo ) {
$revision = new WikiRevision;
@@ -587,10 +641,15 @@ class WikiImporter {
if ( isset( $revisionInfo['contributor']['username'] ) ) {
$revision->setUserName( $revisionInfo['contributor']['username'] );
}
+ $revision->setNoUpdates( $this->mNoUpdates );
return $this->revisionCallback( $revision );
}
+ /**
+ * @param $pageInfo
+ * @return mixed
+ */
private function handleUpload( &$pageInfo ) {
$this->debug( "Enter upload handler" );
$uploadInfo = array();
@@ -627,7 +686,7 @@ class WikiImporter {
$skip = true;
}
}
-
+
if ( $this->mImageBasePath && isset( $uploadInfo['rel'] ) ) {
$path = "{$this->mImageBasePath}/{$uploadInfo['rel']}";
if ( file_exists( $path ) ) {
@@ -640,14 +699,22 @@ class WikiImporter {
return $this->processUpload( $pageInfo, $uploadInfo );
}
}
-
+
+ /**
+ * @param $contents
+ * @return string
+ */
private function dumpTemp( $contents ) {
$filename = tempnam( wfTempDir(), 'importupload' );
file_put_contents( $filename, $contents );
return $filename;
}
-
+ /**
+ * @param $pageInfo
+ * @param $uploadInfo
+ * @return mixed
+ */
private function processUpload( $pageInfo, $uploadInfo ) {
$revision = new WikiRevision;
$text = isset( $uploadInfo['text'] ) ? $uploadInfo['text'] : '';
@@ -677,10 +744,14 @@ class WikiImporter {
if ( isset( $uploadInfo['contributor']['username'] ) ) {
$revision->setUserName( $uploadInfo['contributor']['username'] );
}
+ $revision->setNoUpdates( $this->mNoUpdates );
return call_user_func( $this->mUploadCallback, $revision );
}
+ /**
+ * @return array
+ */
private function handleContributor() {
$fields = array( 'id', 'ip', 'username' );
$info = array();
@@ -701,7 +772,13 @@ class WikiImporter {
return $info;
}
+ /**
+ * @param $text string
+ * @return Array or false
+ */
private function processTitle( $text ) {
+ global $wgCommandLineMode;
+
$workTitle = $text;
$origTitle = Title::newFromText( $workTitle );
@@ -713,11 +790,22 @@ class WikiImporter {
}
if( is_null( $title ) ) {
- // Invalid page title? Ignore the page
- $this->notice( "Skipping invalid page title '$workTitle'" );
+ # Invalid page title? Ignore the page
+ $this->notice( 'import-error-invalid', $workTitle );
+ return false;
+ } elseif( $title->isExternal() ) {
+ $this->notice( 'import-error-interwiki', $title->getPrefixedText() );
+ return false;
+ } elseif( !$title->canExist() ) {
+ $this->notice( 'import-error-special', $title->getPrefixedText() );
+ return false;
+ } 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->getInterwiki() != '' ) {
- $this->notice( "Skipping interwiki page title '$workTitle'" );
+ } 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;
}
@@ -733,6 +821,10 @@ class UploadSourceAdapter {
private $mBuffer;
private $mPosition;
+ /**
+ * @param $source
+ * @return string
+ */
static function registerSource( $source ) {
$id = wfGenerateToken();
@@ -741,6 +833,13 @@ class UploadSourceAdapter {
return $id;
}
+ /**
+ * @param $path
+ * @param $mode
+ * @param $options
+ * @param $opened_path
+ * @return bool
+ */
function stream_open( $path, $mode, $options, &$opened_path ) {
$url = parse_url($path);
$id = $url['host'];
@@ -754,6 +853,10 @@ class UploadSourceAdapter {
return true;
}
+ /**
+ * @param $count
+ * @return string
+ */
function stream_read( $count ) {
$return = '';
$leave = false;
@@ -779,18 +882,31 @@ class UploadSourceAdapter {
return $return;
}
+ /**
+ * @param $data
+ * @return bool
+ */
function stream_write( $data ) {
return false;
}
+ /**
+ * @return mixed
+ */
function stream_tell() {
return $this->mPosition;
}
+ /**
+ * @return bool
+ */
function stream_eof() {
return $this->mSource->atEnd();
}
+ /**
+ * @return array
+ */
function url_stat() {
$result = array();
@@ -813,6 +929,10 @@ class UploadSourceAdapter {
}
class XMLReader2 extends XMLReader {
+
+ /**
+ * @return bool|string
+ */
function nodeContents() {
if( $this->isEmptyElement ) {
return "";
@@ -838,6 +958,10 @@ class XMLReader2 extends XMLReader {
*/
class WikiRevision {
var $importer = null;
+
+ /**
+ * @var Title
+ */
var $title = null;
var $id = 0;
var $timestamp = "20010115000000";
@@ -853,7 +977,13 @@ class WikiRevision {
var $sha1base36 = false;
var $isTemp = false;
var $archiveName = '';
+ var $fileIsTemp;
+ private $mNoUpdates = false;
+ /**
+ * @param $title
+ * @throws MWException
+ */
function setTitle( $title ) {
if( is_object( $title ) ) {
$this->title = $title;
@@ -864,139 +994,253 @@ class WikiRevision {
}
}
+ /**
+ * @param $id
+ */
function setID( $id ) {
$this->id = $id;
}
+ /**
+ * @param $ts
+ */
function setTimestamp( $ts ) {
# 2003-08-05T18:30:02Z
$this->timestamp = wfTimestamp( TS_MW, $ts );
}
+ /**
+ * @param $user
+ */
function setUsername( $user ) {
$this->user_text = $user;
}
+ /**
+ * @param $ip
+ */
function setUserIP( $ip ) {
$this->user_text = $ip;
}
+ /**
+ * @param $text
+ */
function setText( $text ) {
$this->text = $text;
}
+ /**
+ * @param $text
+ */
function setComment( $text ) {
$this->comment = $text;
}
+ /**
+ * @param $minor
+ */
function setMinor( $minor ) {
$this->minor = (bool)$minor;
}
+ /**
+ * @param $src
+ */
function setSrc( $src ) {
$this->src = $src;
}
+
+ /**
+ * @param $src
+ * @param $isTemp
+ */
function setFileSrc( $src, $isTemp ) {
$this->fileSrc = $src;
$this->fileIsTemp = $isTemp;
}
- function setSha1Base36( $sha1base36 ) {
+
+ /**
+ * @param $sha1base36
+ */
+ function setSha1Base36( $sha1base36 ) {
$this->sha1base36 = $sha1base36;
}
+ /**
+ * @param $filename
+ */
function setFilename( $filename ) {
$this->filename = $filename;
}
+
+ /**
+ * @param $archiveName
+ */
function setArchiveName( $archiveName ) {
$this->archiveName = $archiveName;
}
+ /**
+ * @param $size
+ */
function setSize( $size ) {
$this->size = intval( $size );
}
+ /**
+ * @param $type
+ */
function setType( $type ) {
$this->type = $type;
}
+ /**
+ * @param $action
+ */
function setAction( $action ) {
$this->action = $action;
}
+ /**
+ * @param $params
+ */
function setParams( $params ) {
$this->params = $params;
}
/**
+ * @param $noupdates
+ */
+ public function setNoUpdates( $noupdates ) {
+ $this->mNoUpdates = $noupdates;
+ }
+
+ /**
* @return Title
*/
function getTitle() {
return $this->title;
}
+ /**
+ * @return int
+ */
function getID() {
return $this->id;
}
+ /**
+ * @return string
+ */
function getTimestamp() {
return $this->timestamp;
}
+ /**
+ * @return string
+ */
function getUser() {
return $this->user_text;
}
+ /**
+ * @return string
+ */
function getText() {
return $this->text;
}
+ /**
+ * @return string
+ */
function getComment() {
return $this->comment;
}
+ /**
+ * @return bool
+ */
function getMinor() {
return $this->minor;
}
+ /**
+ * @return mixed
+ */
function getSrc() {
return $this->src;
}
+
+ /**
+ * @return bool|String
+ */
function getSha1() {
if ( $this->sha1base36 ) {
return wfBaseConvert( $this->sha1base36, 36, 16 );
}
return false;
}
+
+ /**
+ * @return string
+ */
function getFileSrc() {
return $this->fileSrc;
}
+
+ /**
+ * @return bool
+ */
function isTempSrc() {
return $this->isTemp;
}
+ /**
+ * @return mixed
+ */
function getFilename() {
return $this->filename;
}
+
+ /**
+ * @return string
+ */
function getArchiveName() {
return $this->archiveName;
}
+ /**
+ * @return mixed
+ */
function getSize() {
return $this->size;
}
+ /**
+ * @return string
+ */
function getType() {
return $this->type;
}
+ /**
+ * @return string
+ */
function getAction() {
return $this->action;
}
+ /**
+ * @return string
+ */
function getParams() {
return $this->params;
}
+ /**
+ * @return bool
+ */
function importOldRevision() {
$dbw = wfGetDB( DB_MASTER );
@@ -1016,14 +1260,14 @@ class WikiRevision {
$linkCache = LinkCache::singleton();
$linkCache->clear();
- $article = new Article( $this->title );
- $pageId = $article->getId();
- if( $pageId == 0 ) {
+ $page = WikiPage::factory( $this->title );
+ if( !$page->exists() ) {
# must create the page...
- $pageId = $article->insertOn( $dbw );
+ $pageId = $page->insertOn( $dbw );
$created = true;
$oldcountable = null;
} else {
+ $pageId = $page->getId();
$created = false;
$prior = $dbw->selectField( 'revision', '1',
@@ -1039,7 +1283,7 @@ class WikiRevision {
$this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" );
return false;
}
- $oldcountable = $article->isCountable();
+ $oldcountable = $page->isCountable();
}
# @todo FIXME: Use original rev_id optionally (better for backups)
@@ -1054,16 +1298,19 @@ class WikiRevision {
'minor_edit' => $this->minor,
) );
$revision->insertOn( $dbw );
- $changed = $article->updateIfNewerOn( $dbw, $revision );
+ $changed = $page->updateIfNewerOn( $dbw, $revision );
- if ( $changed !== false ) {
+ if ( $changed !== false && !$this->mNoUpdates ) {
wfDebug( __METHOD__ . ": running updates\n" );
- $article->doEditUpdates( $revision, $userObj, array( 'created' => $created, 'oldcountable' => $oldcountable ) );
+ $page->doEditUpdates( $revision, $userObj, array( 'created' => $created, 'oldcountable' => $oldcountable ) );
}
return true;
}
+ /**
+ * @return mixed
+ */
function importLogItem() {
$dbw = wfGetDB( DB_MASTER );
# @todo FIXME: This will not record autoblocks
@@ -1089,7 +1336,7 @@ class WikiRevision {
if( $prior ) {
wfDebug( __METHOD__ . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp " .
$this->timestamp . "\n" );
- return false;
+ return;
}
$log_id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
$data = array(
@@ -1107,19 +1354,22 @@ class WikiRevision {
$dbw->insert( 'logging', $data, __METHOD__ );
}
+ /**
+ * @return bool
+ */
function importUpload() {
# Construct a file
$archiveName = $this->getArchiveName();
if ( $archiveName ) {
wfDebug( __METHOD__ . "Importing archived file as $archiveName\n" );
- $file = OldLocalFile::newFromArchiveName( $this->getTitle(),
- RepoGroup::singleton()->getLocalRepo(), $archiveName );
+ $file = OldLocalFile::newFromArchiveName( $this->getTitle(),
+ RepoGroup::singleton()->getLocalRepo(), $archiveName );
} else {
$file = wfLocalFile( $this->getTitle() );
wfDebug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" );
if ( $file->exists() && $file->getTimestamp() > $this->getTimestamp() ) {
$archiveName = $file->getTimestamp() . '!' . $file->getName();
- $file = OldLocalFile::newFromArchiveName( $this->getTitle(),
+ $file = OldLocalFile::newFromArchiveName( $this->getTitle(),
RepoGroup::singleton()->getLocalRepo(), $archiveName );
wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" );
}
@@ -1128,7 +1378,7 @@ class WikiRevision {
wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" );
return false;
}
-
+
# Get the file source or download if necessary
$source = $this->getFileSrc();
$flags = $this->isTempSrc() ? File::DELETE_SOURCE : 0;
@@ -1151,16 +1401,16 @@ class WikiRevision {
}
$user = User::newFromName( $this->user_text );
-
+
# Do the actual upload
if ( $archiveName ) {
- $status = $file->uploadOld( $source, $archiveName,
+ $status = $file->uploadOld( $source, $archiveName,
$this->getTimestamp(), $this->getComment(), $user, $flags );
} else {
- $status = $file->upload( $source, $this->getComment(), $this->getComment(),
+ $status = $file->upload( $source, $this->getComment(), $this->getComment(),
$flags, false, $this->getTimestamp(), $user );
}
-
+
if ( $status->isGood() ) {
wfDebug( __METHOD__ . ": Succesful\n" );
return true;
@@ -1170,6 +1420,9 @@ class WikiRevision {
}
}
+ /**
+ * @return bool|string
+ */
function downloadSource() {
global $wgEnableUploads;
if( !$wgEnableUploads ) {
@@ -1211,17 +1464,22 @@ class ImportStringSource {
$this->mRead = false;
}
+ /**
+ * @return bool
+ */
function atEnd() {
return $this->mRead;
}
+ /**
+ * @return bool|string
+ */
function readChunk() {
if( $this->atEnd() ) {
return false;
- } else {
- $this->mRead = true;
- return $this->mString;
}
+ $this->mRead = true;
+ return $this->mString;
}
}
@@ -1234,14 +1492,24 @@ class ImportStreamSource {
$this->mHandle = $handle;
}
+ /**
+ * @return bool
+ */
function atEnd() {
return feof( $this->mHandle );
}
+ /**
+ * @return string
+ */
function readChunk() {
return fread( $this->mHandle, 32768 );
}
+ /**
+ * @param $filename string
+ * @return Status
+ */
static function newFromFile( $filename ) {
wfSuppressWarnings();
$file = fopen( $filename, 'rt' );
@@ -1252,6 +1520,10 @@ class ImportStreamSource {
return Status::newGood( new ImportStreamSource( $file ) );
}
+ /**
+ * @param $fieldname string
+ * @return Status
+ */
static function newFromUpload( $fieldname = "xmlimport" ) {
$upload =& $_FILES[$fieldname];
@@ -1280,6 +1552,11 @@ class ImportStreamSource {
}
}
+ /**
+ * @param $url
+ * @param $method string
+ * @return Status
+ */
static function newFromURL( $url, $method = 'GET' ) {
wfDebug( __METHOD__ . ": opening $url\n" );
# Use the standard HTTP fetch function; it times out
@@ -1298,6 +1575,14 @@ class ImportStreamSource {
}
}
+ /**
+ * @param $interwiki
+ * @param $page
+ * @param $history bool
+ * @param $templates bool
+ * @param $pageLinkDepth int
+ * @return Status
+ */
public static function newFromInterwiki( $interwiki, $page, $history = false, $templates = false, $pageLinkDepth = 0 ) {
if( $page == '' ) {
return Status::newFatal( 'import-noarticle' );
diff --git a/includes/Init.php b/includes/Init.php
index de867282..72c10543 100644
--- a/includes/Init.php
+++ b/includes/Init.php
@@ -23,7 +23,7 @@ class MWInit {
}
/**
- * Returns true if we are running under HipHop, whether in compiled or
+ * Returns true if we are running under HipHop, whether in compiled or
* interpreted mode.
*
* @return bool
@@ -47,10 +47,10 @@ 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
+ * 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.
*
* @param $file string
@@ -94,7 +94,7 @@ class MWInit {
}
/**
- * Register an extension setup file and return its path for compiled
+ * 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:
*
@@ -130,13 +130,13 @@ class MWInit {
/**
* 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.
+ * 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
+ * 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
*
* @param $class string
@@ -153,11 +153,32 @@ class MWInit {
}
/**
- * Determine whether a function exists, using a method which works under
+ * Determine wether 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.
+ *
+ * @param $class string
+ * @param $method string
+ *
+ * @return bool
+ */
+ static function methodExists( $class, $method ) {
+ try {
+ $r = new ReflectionMethod( $class, $method );
+ } catch( ReflectionException $r ) {
+ $r = false;
+ }
+ return $r !== false;
+ }
+
+ /**
+ * Determine whether a function exists, using a method which works under
* HipHop.
*
* @param $function string
- *
+ *
* @return bool
*/
static function functionExists( $function ) {
diff --git a/includes/Licenses.php b/includes/Licenses.php
index 09fa8db3..8a06c6fc 100644
--- a/includes/Licenses.php
+++ b/includes/Licenses.php
@@ -134,6 +134,10 @@ class Licenses extends HTMLFormField {
return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
}
+ /**
+ * @param $str string
+ * @return String
+ */
protected function msg( $str ) {
$msg = wfMessage( $str );
return $msg->exists() ? $msg->text() : $str;
diff --git a/includes/Linker.php b/includes/Linker.php
index e1e554c3..3691d040 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -12,6 +12,7 @@ class Linker {
* Flags for userToolLinks()
*/
const TOOL_LINKS_NOBLOCK = 1;
+ const TOOL_LINKS_EMAIL = 2;
/**
* Get the appropriate HTML attributes to add to the "a" element of an ex-
@@ -22,7 +23,7 @@ class Linker {
* @deprecated since 1.18 Just pass the external class directly to something using Html::expandAttributes
*/
static function getExternalLinkAttributes( $class = 'external' ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
return self::getLinkAttributesInternal( '', $class );
}
@@ -108,7 +109,7 @@ class Linker {
* @param $threshold Integer: user defined threshold
* @return String: CSS class
*/
- static function getLinkColour( $t, $threshold ) {
+ public static function getLinkColour( $t, $threshold ) {
$colour = '';
if ( $t->isRedirect() ) {
# Page is a redirect
@@ -134,9 +135,14 @@ class Linker {
* name of the target).
* link() replaces the old functions in the makeLink() family.
*
+ * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
+ * You can call it using this if you want to keep compat with these:
+ * $linker = class_exists( 'DummyLinker' ) ? new DummyLinker() : new Linker();
+ * $linker->link( ... );
+ *
* @param $target Title Can currently only be a Title, but this may
* change to support Images, literal URLs, etc.
- * @param $text string The HTML contents of the <a> element, i.e.,
+ * @param $html string The HTML contents of the <a> element, i.e.,
* the link text. This is raw HTML and will not be escaped. If null,
* defaults to the prefixed text of the Title; or if the Title is just a
* fragment, the contents of the fragment.
@@ -225,16 +231,18 @@ class Linker {
* Identical to link(), except $options defaults to 'known'.
*/
public static function linkKnown(
- $target, $text = null, $customAttribs = array(),
+ $target, $html = null, $customAttribs = array(),
$query = array(), $options = array( 'known', 'noclasses' ) )
{
- return self::link( $target, $text, $customAttribs, $query, $options );
+ return self::link( $target, $html, $customAttribs, $query, $options );
}
/**
* Returns the Url used to link to a Title
*
* @param $target Title
+ * @param $query Array: query parameters
+ * @param $options Array
*/
private static function linkUrl( $target, $query, $options ) {
wfProfileIn( __METHOD__ );
@@ -249,11 +257,11 @@ class Linker {
# there's already an action specified, or unless 'edit' makes no sense
# (i.e., for a nonexistent special page).
if ( in_array( 'broken', $options ) && empty( $query['action'] )
- && $target->getNamespace() != NS_SPECIAL ) {
+ && !$target->isSpecialPage() ) {
$query['action'] = 'edit';
$query['redlink'] = '1';
}
- $ret = $target->getLinkUrl( $query );
+ $ret = $target->getLinkURL( $query );
wfProfileOut( __METHOD__ );
return $ret;
}
@@ -358,7 +366,7 @@ class Linker {
*/
static function makeSizeLinkObj( $size, $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
global $wgUser;
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
$threshold = $wgUser->getStubThreshold();
$colour = ( $size < $threshold ) ? 'stub' : '';
@@ -375,12 +383,12 @@ class Linker {
*
* @return string
*/
- static function makeSelfLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
- if ( $text == '' ) {
- $text = htmlspecialchars( $nt->getPrefixedText() );
+ public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) {
+ if ( $html == '' ) {
+ $html = htmlspecialchars( $nt->getPrefixedText() );
}
list( $inside, $trail ) = self::splitTrail( $trail );
- return "<strong class=\"selflink\">{$prefix}{$text}{$inside}</strong>{$trail}";
+ return "<strong class=\"selflink\">{$prefix}{$html}{$inside}</strong>{$trail}";
}
/**
@@ -388,7 +396,7 @@ class Linker {
* @return Title
*/
static function normaliseSpecialPage( Title $title ) {
- if ( $title->getNamespace() == NS_SPECIAL ) {
+ if ( $title->isSpecialPage() ) {
list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
if ( !$name ) {
return $title;
@@ -409,7 +417,7 @@ class Linker {
*
* @return string
*/
- static function fnamePart( $url ) {
+ private static function fnamePart( $url ) {
$basename = strrchr( $url, '/' );
if ( false === $basename ) {
$basename = $url;
@@ -428,7 +436,7 @@ class Linker {
*
* @return string
*/
- static function makeExternalImage( $url, $alt = '' ) {
+ public static function makeExternalImage( $url, $alt = '' ) {
if ( $alt == '' ) {
$alt = self::fnamePart( $url );
}
@@ -477,7 +485,7 @@ class Linker {
* @param $widthOption: Used by the parser to remember the user preference thumbnailsize
* @return String: HTML for an image, with links, wrappers, etc.
*/
- static function makeImageLink2( Title $title, $file, $frameParams = array(),
+ public static function makeImageLink2( Title $title, $file, $frameParams = array(),
$handlerParams = array(), $time = false, $query = "", $widthOption = null )
{
$res = null;
@@ -604,7 +612,7 @@ class Linker {
* @param $frameParams The frame parameters
* @param $query An optional query string to add to description page links
*/
- static function getImageLinkMTOParams( $frameParams, $query = '' ) {
+ private static function getImageLinkMTOParams( $frameParams, $query = '' ) {
$mtoParams = array();
if ( isset( $frameParams['link-url'] ) && $frameParams['link-url'] !== '' ) {
$mtoParams['custom-url-link'] = $frameParams['link-url'];
@@ -633,7 +641,7 @@ class Linker {
* @param $framed Boolean
* @param $manualthumb String
*/
- static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
+ public static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
$align = 'right', $params = array(), $framed = false , $manualthumb = "" )
{
$frameParams = array(
@@ -659,7 +667,7 @@ class Linker {
* @param string $query
* @return mixed
*/
- static function makeThumbLink2( Title $title, $file, $frameParams = array(),
+ public static function makeThumbLink2( Title $title, $file, $frameParams = array(),
$handlerParams = array(), $time = false, $query = "" )
{
global $wgStylePath, $wgContLang;
@@ -760,31 +768,31 @@ class Linker {
* Make a "broken" link to an image
*
* @param $title Title object
- * @param $text String: link label in unescaped text form
+ * @param $html String: link label in htmlescaped text form
* @param $query String: query string
* @param $trail String: link trail (HTML fragment)
* @param $prefix String: link prefix (HTML fragment)
* @param $time Boolean: a file of a certain timestamp was requested
* @return String
*/
- public static function makeBrokenImageLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '', $time = false ) {
- global $wgEnableUploads, $wgUploadMissingFileUrl;
+ public static function makeBrokenImageLinkObj( $title, $html = '', $query = '', $trail = '', $prefix = '', $time = false ) {
+ global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
if ( ! $title instanceof Title ) {
- return "<!-- ERROR -->{$prefix}{$text}{$trail}";
+ return "<!-- ERROR -->{$prefix}{$html}{$trail}";
}
wfProfileIn( __METHOD__ );
$currentExists = $time ? ( wfFindFile( $title ) != false ) : false;
list( $inside, $trail ) = self::splitTrail( $trail );
- if ( $text == '' )
- $text = htmlspecialchars( $title->getPrefixedText() );
+ if ( $html == '' )
+ $html = htmlspecialchars( $title->getPrefixedText() );
- if ( ( $wgUploadMissingFileUrl || $wgEnableUploads ) && !$currentExists ) {
+ if ( ( $wgUploadMissingFileUrl || $wgUploadNavigationUrl || $wgEnableUploads ) && !$currentExists ) {
$redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
if ( $redir ) {
wfProfileOut( __METHOD__ );
- return self::linkKnown( $title, "$prefix$text$inside", array(), $query ) . $trail;
+ return self::linkKnown( $title, "$prefix$html$inside", array(), $query ) . $trail;
}
$href = self::getUploadUrl( $title, $query );
@@ -792,10 +800,10 @@ class Linker {
wfProfileOut( __METHOD__ );
return '<a href="' . htmlspecialchars( $href ) . '" class="new" title="' .
htmlspecialchars( $title->getPrefixedText(), ENT_QUOTES ) . '">' .
- "$prefix$text$inside</a>$trail";
+ "$prefix$html$inside</a>$trail";
} else {
wfProfileOut( __METHOD__ );
- return self::linkKnown( $title, "$prefix$text$inside", array(), $query ) . $trail;
+ return self::linkKnown( $title, "$prefix$html$inside", array(), $query ) . $trail;
}
}
@@ -807,13 +815,15 @@ class Linker {
* @return String: urlencoded URL
*/
protected static function getUploadUrl( $destFile, $query = '' ) {
- global $wgUploadMissingFileUrl;
+ global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
$q = 'wpDestFile=' . $destFile->getPartialUrl();
if ( $query != '' )
$q .= '&' . $query;
if ( $wgUploadMissingFileUrl ) {
return wfAppendQuery( $wgUploadMissingFileUrl, $q );
+ } elseif( $wgUploadNavigationUrl ) {
+ return wfAppendQuery( $wgUploadNavigationUrl, $q );
} else {
$upload = SpecialPage::getTitleFor( 'Upload' );
return $upload->getLocalUrl( $q );
@@ -824,13 +834,13 @@ class Linker {
* Create a direct link to a given uploaded file.
*
* @param $title Title object.
- * @param $text String: pre-sanitized HTML
+ * @param $html String: pre-sanitized HTML
* @param $time string: MW timestamp of file creation time
* @return String: HTML
*/
- public static function makeMediaLinkObj( $title, $text = '', $time = false ) {
+ public static function makeMediaLinkObj( $title, $html = '', $time = false ) {
$img = wfFindFile( $title, array( 'time' => $time ) );
- return self::makeMediaLinkFile( $title, $img, $text );
+ return self::makeMediaLinkFile( $title, $img, $html );
}
/**
@@ -839,12 +849,12 @@ class Linker {
*
* @param $title Title object.
* @param $file File|false mixed File object or false
- * @param $text String: pre-sanitized HTML
+ * @param $html String: pre-sanitized HTML
* @return String: HTML
*
* @todo Handle invalid or missing images better.
*/
- public static function makeMediaLinkFile( Title $title, $file, $text = '' ) {
+ public static function makeMediaLinkFile( Title $title, $file, $html = '' ) {
if ( $file && $file->exists() ) {
$url = $file->getURL();
$class = 'internal';
@@ -853,21 +863,21 @@ class Linker {
$class = 'new';
}
$alt = htmlspecialchars( $title->getText(), ENT_QUOTES );
- if ( $text == '' ) {
- $text = $alt;
+ if ( $html == '' ) {
+ $html = $alt;
}
$u = htmlspecialchars( $url );
- return "<a href=\"{$u}\" class=\"$class\" title=\"{$alt}\">{$text}</a>";
+ return "<a href=\"{$u}\" class=\"$class\" title=\"{$alt}\">{$html}</a>";
}
/**
* Make a link to a special page given its name and, optionally,
* a message key from the link text.
- * Usage example: $skin->specialLink( 'recentchanges' )
+ * Usage example: Linker::specialLink( 'Recentchanges' )
*
- * @return bool
+ * @return string
*/
- static function specialLink( $name, $key = '' ) {
+ public static function specialLink( $name, $key = '' ) {
if ( $key == '' ) {
$key = strtolower( $name );
}
@@ -883,12 +893,12 @@ class Linker {
* @param $linktype String: type of external link. Gets added to the classes
* @param $attribs Array of extra attributes to <a>
*/
- static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
+ public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
$class = "external";
- if ( isset($linktype) && $linktype ) {
+ if ( $linktype ) {
$class .= " $linktype";
}
- if ( isset($attribs['class']) && $attribs['class'] ) {
+ if ( isset( $attribs['class'] ) && $attribs['class'] ) {
$class .= " {$attribs['class']}";
}
$attribs['class'] = $class;
@@ -910,17 +920,23 @@ class Linker {
/**
* Make user link (or user contributions for unregistered users)
* @param $userId Integer: user id in database.
- * @param $userText String: user name in database
+ * @param $userName String: user name in database.
+ * @param $altUserName String: text to display instead of the user name (optional)
* @return String: HTML fragment
- * @private
+ * @since 1.19 Method exists for a long time. $displayText was added in 1.19.
*/
- static function userLink( $userId, $userText ) {
+ public static function userLink( $userId, $userName, $altUserName = false ) {
if ( $userId == 0 ) {
- $page = SpecialPage::getTitleFor( 'Contributions', $userText );
+ $page = SpecialPage::getTitleFor( 'Contributions', $userName );
} else {
- $page = Title::makeTitle( NS_USER, $userText );
+ $page = Title::makeTitle( NS_USER, $userName );
}
- return self::link( $page, htmlspecialchars( $userText ), array( 'class' => 'mw-userlink' ) );
+
+ return self::link(
+ $page,
+ htmlspecialchars( $altUserName !== false ? $altUserName : $userName ),
+ array( 'class' => 'mw-userlink' )
+ );
}
/**
@@ -930,7 +946,7 @@ class Linker {
* @param $userText String: user name or IP address
* @param $redContribsWhenNoEdits Boolean: should the contributions link be
* red if the user has no edits?
- * @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK)
+ * @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
* @param $edits Integer: user edit count (optional, for performance)
* @return String: HTML fragment
*/
@@ -939,7 +955,8 @@ class Linker {
) {
global $wgUser, $wgDisableAnonTalk, $wgLang;
$talkable = !( $wgDisableAnonTalk && 0 == $userId );
- $blockable = !$flags & self::TOOL_LINKS_NOBLOCK;
+ $blockable = !( $flags & self::TOOL_LINKS_NOBLOCK );
+ $addEmailLink = $flags & self::TOOL_LINKS_EMAIL && $userId;
$items = array();
if ( $talkable ) {
@@ -962,6 +979,12 @@ class Linker {
$items[] = self::blockLink( $userId, $userText );
}
+ if ( $addEmailLink && $wgUser->canSendEmail() ) {
+ $items[] = self::emailLink( $userId, $userText );
+ }
+
+ wfRunHooks( 'UserToolLinksEdit', array( $userId, $userText, &$items ) );
+
if ( $items ) {
return ' <span class="mw-usertoollinks">(' . $wgLang->pipeList( $items ) . ')</span>';
} else {
@@ -984,9 +1007,8 @@ class Linker {
* @param $userId Integer: user id in database.
* @param $userText String: user name in database.
* @return String: HTML fragment with user talk link
- * @private
*/
- static function userTalkLink( $userId, $userText ) {
+ public static function userTalkLink( $userId, $userText ) {
$userTalkPage = Title::makeTitle( NS_USER_TALK, $userText );
$userTalkLink = self::link( $userTalkPage, wfMsgHtml( 'talkpagelinktext' ) );
return $userTalkLink;
@@ -996,21 +1018,31 @@ class Linker {
* @param $userId Integer: userid
* @param $userText String: user name in database.
* @return String: HTML fragment with block link
- * @private
*/
- static function blockLink( $userId, $userText ) {
+ public static function blockLink( $userId, $userText ) {
$blockPage = SpecialPage::getTitleFor( 'Block', $userText );
$blockLink = self::link( $blockPage, wfMsgHtml( 'blocklink' ) );
return $blockLink;
}
/**
+ * @param $userId Integer: userid
+ * @param $userText String: user name in database.
+ * @return String: HTML fragment with e-mail user link
+ */
+ public static function emailLink( $userId, $userText ) {
+ $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
+ $emailLink = self::link( $emailPage, wfMsgHtml( 'emaillink' ) );
+ return $emailLink;
+ }
+
+ /**
* Generate a user link if the current user is allowed to view it
* @param $rev Revision object.
* @param $isPublic Boolean: show only if all users can see it
* @return String: HTML fragment
*/
- static function revUserLink( $rev, $isPublic = false ) {
+ public static function revUserLink( $rev, $isPublic = false ) {
if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
$link = wfMsgHtml( 'rev-deleted-user' );
} elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
@@ -1031,7 +1063,7 @@ class Linker {
* @param $isPublic Boolean: show only if all users can see it
* @return string HTML
*/
- static function revUserTools( $rev, $isPublic = false ) {
+ public static function revUserTools( $rev, $isPublic = false ) {
if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
$link = wfMsgHtml( 'rev-deleted-user' );
} elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
@@ -1064,7 +1096,7 @@ class Linker {
* @param $title Mixed: Title object (to generate link to the section in autocomment) or null
* @param $local Boolean: whether section links should refer to local page
*/
- static function formatComment( $comment, $title = null, $local = false ) {
+ public static function formatComment( $comment, $title = null, $local = false ) {
wfProfileIn( __METHOD__ );
# Sanitize text a bit:
@@ -1116,6 +1148,7 @@ class Linker {
* @return string
*/
private static function formatAutocommentsCallback( $match ) {
+ global $wgLang;
$title = self::$autocommentTitle;
$local = self::$autocommentLocal;
@@ -1141,23 +1174,22 @@ class Linker {
}
if ( $sectionTitle ) {
$link = self::link( $sectionTitle,
- htmlspecialchars( wfMsgForContent( 'sectionlink' ) ), array(), array(),
+ $wgLang->getArrow(), array(), array(),
'noclasses' );
} else {
$link = '';
}
}
- $auto = "$link$auto";
if ( $pre ) {
# written summary $presep autocomment (summary /* section */)
- $auto = wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) ) . $auto;
+ $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
}
if ( $post ) {
# autocomment $postsep written summary (/* section */ summary)
$auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
}
$auto = '<span class="autocomment">' . $auto . '</span>';
- $comment = $pre . $auto . $post;
+ $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
return $comment;
}
@@ -1266,7 +1298,7 @@ class Linker {
* @param $text
* @return string
*/
- static function normalizeSubpageLink( $contextTitle, $target, &$text ) {
+ public static function normalizeSubpageLink( $contextTitle, $target, &$text ) {
# Valid link forms:
# Foobar -- normal
# :Foobar -- override special treatment of prefix (images, language links)
@@ -1291,7 +1323,7 @@ class Linker {
# bug 7425
$target = trim( $target );
# Look at the first character
- if ( $target != '' && $target { 0 } === '/' ) {
+ if ( $target != '' && $target[0] === '/' ) {
# / at end means we don't want the slash to be shown
$m = array();
$trailingSlashes = preg_match_all( '%(/+)$%', $target, $m );
@@ -1348,7 +1380,7 @@ class Linker {
*
* @return string
*/
- static function commentBlock( $comment, $title = null, $local = false ) {
+ public static function commentBlock( $comment, $title = null, $local = false ) {
// '*' used to be the comment inserted by the software way back
// in antiquity in case none was provided, here for backwards
// compatability, acc. to brion -ævar
@@ -1356,7 +1388,7 @@ class Linker {
return '';
} else {
$formatted = self::formatComment( $comment, $title, $local );
- return " <span class=\"comment\">($formatted)</span>";
+ return " <span class=\"comment\" dir=\"auto\">($formatted)</span>";
}
}
@@ -1369,7 +1401,7 @@ class Linker {
* @param $isPublic Boolean: show only if all users can see it
* @return String: HTML fragment
*/
- static function revComment( Revision $rev, $local = false, $isPublic = false ) {
+ public static function revComment( Revision $rev, $local = false, $isPublic = false ) {
if ( $rev->getRawComment() == "" ) {
return "";
}
@@ -1408,7 +1440,7 @@ class Linker {
*
* @return string
*/
- static function tocIndent() {
+ public static function tocIndent() {
return "\n<ul>";
}
@@ -1417,7 +1449,7 @@ class Linker {
*
* @return string
*/
- static function tocUnindent( $level ) {
+ public static function tocUnindent( $level ) {
return "</li>\n" . str_repeat( "</ul>\n</li>\n", $level > 0 ? $level : 0 );
}
@@ -1426,7 +1458,7 @@ class Linker {
*
* @return string
*/
- static function tocLine( $anchor, $tocline, $tocnumber, $level, $sectionIndex = false ) {
+ public static function tocLine( $anchor, $tocline, $tocnumber, $level, $sectionIndex = false ) {
$classes = "toclevel-$level";
if ( $sectionIndex !== false ) {
$classes .= " tocsection-$sectionIndex";
@@ -1442,7 +1474,7 @@ class Linker {
* tocUnindent() will be used instead if we're ending a line below
* the new level.
*/
- static function tocLineEnd() {
+ public static function tocLineEnd() {
return "</li>\n";
}
@@ -1453,7 +1485,7 @@ class Linker {
* @param $lang mixed: Language code for the toc title
* @return String: full html of the TOC
*/
- static function tocList( $toc, $lang = false ) {
+ public static function tocList( $toc, $lang = false ) {
$title = wfMsgExt( 'toc', array( 'language' => $lang, 'escape' ) );
return
'<table id="toc" class="toc"><tr><td>'
@@ -1498,17 +1530,17 @@ class Linker {
* a space and ending with '>'
* This *must* be at least '>' for no attribs
* @param $anchor String: the anchor to give the headline (the bit after the #)
- * @param $text String: the text of the header
+ * @param $html String: html for the text of the header
* @param $link String: HTML to add for the section edit link
* @param $legacyAnchor Mixed: a second, optional anchor to give for
* backward compatibility (false to omit)
*
* @return String: HTML headline
*/
- public static function makeHeadline( $level, $attribs, $anchor, $text, $link, $legacyAnchor = false ) {
+ public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
$ret = "<h$level$attribs"
. $link
- . " <span class=\"mw-headline\" id=\"$anchor\">$text</span>"
+ . " <span class=\"mw-headline\" id=\"$anchor\">$html</span>"
. "</h$level>";
if ( $legacyAnchor !== false ) {
$ret = "<div id=\"$legacyAnchor\"></div>$ret";
@@ -1547,7 +1579,7 @@ class Linker {
*
* @param $rev Revision object
*/
- static function generateRollback( $rev ) {
+ public static function generateRollback( $rev ) {
return '<span class="mw-rollback-link">['
. self::buildRollbackLink( $rev )
. ']</span>';
@@ -1565,7 +1597,7 @@ class Linker {
$query = array(
'action' => 'rollback',
'from' => $rev->getUserText(),
- 'token' => $wgUser->editToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
+ 'token' => $wgUser->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
);
if ( $wgRequest->getBool( 'bot' ) ) {
$query['bot'] = '1';
@@ -1697,10 +1729,6 @@ class Linker {
* escape), or false for no title attribute
*/
public static function titleAttrib( $name, $options = null ) {
- global $wgEnableTooltipsAndAccesskeys;
- if ( !$wgEnableTooltipsAndAccesskeys )
- return false;
-
wfProfileIn( __METHOD__ );
$message = wfMessage( "tooltip-$name" );
@@ -1769,6 +1797,50 @@ class Linker {
}
/**
+ * Get a revision-deletion link, or disabled link, or nothing, depending
+ * on user permissions & the settings on the revision.
+ *
+ * Will use forward-compatible revision ID in the Special:RevDelete link
+ * if possible, otherwise the timestamp-based ID which may break after
+ * undeletion.
+ *
+ * @param User $user
+ * @param Revision $rev
+ * @param Revision $title
+ * @return string HTML fragment
+ */
+ public static function getRevDeleteLink( User $user, Revision $rev, Title $title ) {
+ $canHide = $user->isAllowed( 'deleterevision' );
+ if ( !$canHide && !( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+ return '';
+ }
+
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+ return Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+ } else {
+ if ( $rev->getId() ) {
+ // RevDelete links using revision ID are stable across
+ // page deletion and undeletion; use when possible.
+ $query = array(
+ 'type' => 'revision',
+ 'target' => $title->getPrefixedDBkey(),
+ 'ids' => $rev->getId()
+ );
+ } else {
+ // Older deleted entries didn't save a revision ID.
+ // We have to refer to these by timestamp, ick!
+ $query = array(
+ 'type' => 'archive',
+ 'target' => $title->getPrefixedDBkey(),
+ 'ids' => $rev->getTimestamp()
+ );
+ }
+ return Linker::revDeleteLink( $query,
+ $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
+ }
+ }
+
+ /**
* Creates a (show/hide) link for deleting revisions/log entries
*
* @param $query Array: query parameters to be passed to link()
@@ -1780,9 +1852,9 @@ class Linker {
*/
public static function revDeleteLink( $query = array(), $restricted = false, $delete = true ) {
$sp = SpecialPage::getTitleFor( 'Revisiondelete' );
- $text = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
+ $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
$tag = $restricted ? 'strong' : 'span';
- $link = self::link( $sp, $text, array(), $query, array( 'known', 'noclasses' ) );
+ $link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), "($link)" );
}
@@ -1795,8 +1867,8 @@ class Linker {
* of appearance with CSS
*/
public static function revDeleteLinkDisabled( $delete = true ) {
- $text = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
- return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), "($text)" );
+ $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
+ return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), "($html)" );
}
/* Deprecated methods */
@@ -1815,6 +1887,8 @@ class Linker {
* the end of the link.
*/
static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
+ wfDeprecated( __METHOD__, '1.16' );
+
$nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
@@ -1841,6 +1915,8 @@ class Linker {
* @param $prefix String: optional prefix. As trail, only before instead of after.
*/
static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
+ # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
+
wfProfileIn( __METHOD__ );
$query = wfCgiToArray( $query );
list( $inside, $trail ) = self::splitTrail( $trail );
@@ -1873,6 +1949,8 @@ class Linker {
static function makeKnownLinkObj(
$title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
) {
+ # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
+
wfProfileIn( __METHOD__ );
if ( $text == '' ) {
@@ -1906,6 +1984,8 @@ class Linker {
* @param $prefix String: Optional prefix
*/
static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
+ wfDeprecated( __METHOD__, '1.16' );
+
wfProfileIn( __METHOD__ );
list( $inside, $trail ) = self::splitTrail( $trail );
@@ -1935,6 +2015,8 @@ class Linker {
* @param $prefix String: Optional prefix
*/
static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
+ wfDeprecated( __METHOD__, '1.16' );
+
if ( $colour != '' ) {
$style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
} else {
@@ -1947,9 +2029,6 @@ class Linker {
* Returns the attributes for the tooltip and access key.
*/
public static function tooltipAndAccesskeyAttribs( $name ) {
- global $wgEnableTooltipsAndAccesskeys;
- if ( !$wgEnableTooltipsAndAccesskeys )
- return array();
# @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output
# no attribute" instead of "output '' as value for attribute", this
# would be three lines.
@@ -1967,13 +2046,9 @@ class Linker {
}
/**
- * @deprecated since 1.14
* Returns raw bits of HTML, use titleAttrib()
*/
public static function tooltip( $name, $options = null ) {
- global $wgEnableTooltipsAndAccesskeys;
- if ( !$wgEnableTooltipsAndAccesskeys )
- return '';
# @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output
# no attribute" instead of "output '' as value for attribute", this
# would be two lines.
@@ -2003,4 +2078,3 @@ class DummyLinker {
return call_user_func_array( array( 'Linker', $fname ), $args );
}
}
-
diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php
index 1fe6118a..27d1dfd2 100644
--- a/includes/LinksUpdate.php
+++ b/includes/LinksUpdate.php
@@ -26,6 +26,7 @@ class LinksUpdate {
*/
var $mId, //!< Page ID of the article linked from
$mTitle, //!< Title object of the article linked from
+ $mParserOutput, //!< Parser output
$mLinks, //!< Map of title strings to IDs for the links in the document
$mImages, //!< DB keys of the images used, in the array key only
$mTemplates, //!< Map of title strings to IDs for the template references, including broken ones
@@ -135,7 +136,7 @@ class LinksUpdate {
# External links
$existing = $this->getExistingExternals();
$this->incrTableUpdate( 'externallinks', 'el', $this->getExternalDeletions( $existing ),
- $this->getExternalInsertions( $existing ) );
+ $this->getExternalInsertions( $existing ) );
# Language links
$existing = $this->getExistingInterlangs();
@@ -241,6 +242,7 @@ class LinksUpdate {
foreach ( $batches as $batch ) {
list( $start, $end ) = $batch;
$params = array(
+ 'table' => 'templatelinks',
'start' => $start,
'end' => $end,
);
@@ -296,27 +298,38 @@ class LinksUpdate {
);
}
+ /**
+ * @param $cats
+ */
function invalidateCategories( $cats ) {
$this->invalidatePages( NS_CATEGORY, array_keys( $cats ) );
}
/**
* Update all the appropriate counts in the category table.
- * @param $added associative array of category name => sort key
- * @param $deleted associative array of category name => sort key
+ * @param $added array associative array of category name => sort key
+ * @param $deleted array associative array of category name => sort key
*/
function updateCategoryCounts( $added, $deleted ) {
- $a = new Article($this->mTitle);
+ $a = WikiPage::factory( $this->mTitle );
$a->updateCategoryCounts(
array_keys( $added ), array_keys( $deleted )
);
}
+ /**
+ * @param $images
+ */
function invalidateImageDescriptions( $images ) {
$this->invalidatePages( NS_FILE, array_keys( $images ) );
}
- function dumbTableUpdate( $table, $insertions, $fromField ) {
+ /**
+ * @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
@@ -328,7 +341,10 @@ class LinksUpdate {
/**
* Update a table by doing a delete query then an insert query
- * @private
+ * @param $table
+ * @param $prefix
+ * @param $deletions
+ * @param $insertions
*/
function incrTableUpdate( $table, $prefix, $deletions, $insertions ) {
if ( $table == 'page_props' ) {
@@ -371,13 +387,13 @@ class LinksUpdate {
}
}
-
/**
* Get an array of pagelinks insertions for passing to the DB
* Skips the titles specified by the 2-D array $existing
- * @private
+ * @param $existing array
+ * @return array
*/
- function getLinkInsertions( $existing = array() ) {
+ private function getLinkInsertions( $existing = array() ) {
$arr = array();
foreach( $this->mLinks as $ns => $dbkeys ) {
$diffs = isset( $existing[$ns] )
@@ -396,9 +412,10 @@ class LinksUpdate {
/**
* Get an array of template insertions. Like getLinkInsertions()
- * @private
+ * @param $existing array
+ * @return array
*/
- function getTemplateInsertions( $existing = array() ) {
+ private function getTemplateInsertions( $existing = array() ) {
$arr = array();
foreach( $this->mTemplates as $ns => $dbkeys ) {
$diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
@@ -416,9 +433,10 @@ class LinksUpdate {
/**
* Get an array of image insertions
* Skips the names specified in $existing
- * @private
+ * @param $existing array
+ * @return array
*/
- function getImageInsertions( $existing = array() ) {
+ private function getImageInsertions( $existing = array() ) {
$arr = array();
$diffs = array_diff_key( $this->mImages, $existing );
foreach( $diffs as $iname => $dummy ) {
@@ -432,9 +450,10 @@ class LinksUpdate {
/**
* Get an array of externallinks insertions. Skips the names specified in $existing
- * @private
+ * @param $existing array
+ * @return array
*/
- function getExternalInsertions( $existing = array() ) {
+ private function getExternalInsertions( $existing = array() ) {
$arr = array();
$diffs = array_diff_key( $this->mExternals, $existing );
foreach( $diffs as $url => $dummy ) {
@@ -452,11 +471,12 @@ class LinksUpdate {
/**
* Get an array of category insertions
*
- * @param $existing Array mapping existing category names to sort keys. If both
+ * @param $existing array mapping existing category names to sort keys. If both
* match a link in $this, the link will be omitted from the output
- * @private
+ *
+ * @return array
*/
- function getCategoryInsertions( $existing = array() ) {
+ private function getCategoryInsertions( $existing = array() ) {
global $wgContLang, $wgCategoryCollation;
$diffs = array_diff_assoc( $this->mCategories, $existing );
$arr = array();
@@ -496,23 +516,26 @@ class LinksUpdate {
* Get an array of interlanguage link insertions
*
* @param $existing Array mapping existing language codes to titles
- * @private
+ *
+ * @return array
*/
- function getInterlangInsertions( $existing = array() ) {
- $diffs = array_diff_assoc( $this->mInterlangs, $existing );
- $arr = array();
- foreach( $diffs as $lang => $title ) {
- $arr[] = array(
- 'll_from' => $this->mId,
- 'll_lang' => $lang,
- 'll_title' => $title
- );
- }
- return $arr;
+ private function getInterlangInsertions( $existing = array() ) {
+ $diffs = array_diff_assoc( $this->mInterlangs, $existing );
+ $arr = array();
+ foreach( $diffs as $lang => $title ) {
+ $arr[] = array(
+ 'll_from' => $this->mId,
+ 'll_lang' => $lang,
+ 'll_title' => $title
+ );
+ }
+ return $arr;
}
/**
* Get an array of page property insertions
+ * @param $existing array
+ * @return array
*/
function getPropertyInsertions( $existing = array() ) {
$diffs = array_diff_assoc( $this->mProperties, $existing );
@@ -530,9 +553,10 @@ class LinksUpdate {
/**
* Get an array of interwiki insertions for passing to the DB
* Skips the titles specified by the 2-D array $existing
- * @private
+ * @param $existing array
+ * @return array
*/
- function getInterwikiInsertions( $existing = array() ) {
+ private function getInterwikiInsertions( $existing = array() ) {
$arr = array();
foreach( $this->mInterwikis as $prefix => $dbkeys ) {
$diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
@@ -550,9 +574,10 @@ class LinksUpdate {
/**
* Given an array of existing links, returns those links which are not in $this
* and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getLinkDeletions( $existing ) {
+ private function getLinkDeletions( $existing ) {
$del = array();
foreach ( $existing as $ns => $dbkeys ) {
if ( isset( $this->mLinks[$ns] ) ) {
@@ -567,9 +592,10 @@ class LinksUpdate {
/**
* Given an array of existing templates, returns those templates which are not in $this
* and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getTemplateDeletions( $existing ) {
+ private function getTemplateDeletions( $existing ) {
$del = array();
foreach ( $existing as $ns => $dbkeys ) {
if ( isset( $this->mTemplates[$ns] ) ) {
@@ -584,42 +610,47 @@ class LinksUpdate {
/**
* Given an array of existing images, returns those images which are not in $this
* and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getImageDeletions( $existing ) {
+ private function getImageDeletions( $existing ) {
return array_diff_key( $existing, $this->mImages );
}
/**
* Given an array of existing external links, returns those links which are not
* in $this and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getExternalDeletions( $existing ) {
+ private function getExternalDeletions( $existing ) {
return array_diff_key( $existing, $this->mExternals );
}
/**
* Given an array of existing categories, returns those categories which are not in $this
* and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getCategoryDeletions( $existing ) {
+ private function getCategoryDeletions( $existing ) {
return array_diff_assoc( $existing, $this->mCategories );
}
/**
* Given an array of existing interlanguage links, returns those links which are not
* in $this and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getInterlangDeletions( $existing ) {
- return array_diff_assoc( $existing, $this->mInterlangs );
+ private function getInterlangDeletions( $existing ) {
+ return array_diff_assoc( $existing, $this->mInterlangs );
}
/**
* Get array of properties which should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
function getPropertyDeletions( $existing ) {
return array_diff_assoc( $existing, $this->mProperties );
@@ -628,9 +659,10 @@ class LinksUpdate {
/**
* Given an array of existing interwiki links, returns those links which are not in $this
* and thus should be deleted.
- * @private
+ * @param $existing array
+ * @return array
*/
- function getInterwikiDeletions( $existing ) {
+ private function getInterwikiDeletions( $existing ) {
$del = array();
foreach ( $existing as $prefix => $dbkeys ) {
if ( isset( $this->mInterwikis[$prefix] ) ) {
@@ -644,9 +676,10 @@ class LinksUpdate {
/**
* Get an array of existing links, as a 2-D array
- * @private
+ *
+ * @return array
*/
- function getExistingLinks() {
+ private function getExistingLinks() {
$res = $this->mDb->select( 'pagelinks', array( 'pl_namespace', 'pl_title' ),
array( 'pl_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -661,9 +694,10 @@ class LinksUpdate {
/**
* Get an array of existing templates, as a 2-D array
- * @private
+ *
+ * @return array
*/
- function getExistingTemplates() {
+ private function getExistingTemplates() {
$res = $this->mDb->select( 'templatelinks', array( 'tl_namespace', 'tl_title' ),
array( 'tl_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -678,9 +712,10 @@ class LinksUpdate {
/**
* Get an array of existing images, image names in the keys
- * @private
+ *
+ * @return array
*/
- function getExistingImages() {
+ private function getExistingImages() {
$res = $this->mDb->select( 'imagelinks', array( 'il_to' ),
array( 'il_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -692,9 +727,10 @@ class LinksUpdate {
/**
* Get an array of existing external links, URLs in the keys
- * @private
+ *
+ * @return array
*/
- function getExistingExternals() {
+ private function getExistingExternals() {
$res = $this->mDb->select( 'externallinks', array( 'el_to' ),
array( 'el_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -706,9 +742,10 @@ class LinksUpdate {
/**
* Get an array of existing categories, with the name in the key and sort key in the value.
- * @private
+ *
+ * @return array
*/
- function getExistingCategories() {
+ private function getExistingCategories() {
$res = $this->mDb->select( 'categorylinks', array( 'cl_to', 'cl_sortkey_prefix' ),
array( 'cl_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -721,9 +758,10 @@ class LinksUpdate {
/**
* Get an array of existing interlanguage links, with the language code in the key and the
* title in the value.
- * @private
+ *
+ * @return array
*/
- function getExistingInterlangs() {
+ private function getExistingInterlangs() {
$res = $this->mDb->select( 'langlinks', array( 'll_lang', 'll_title' ),
array( 'll_from' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -752,9 +790,10 @@ class LinksUpdate {
/**
* Get an array of existing categories, with the name in the key and sort key in the value.
- * @private
+ *
+ * @return array
*/
- function getExistingProperties() {
+ private function getExistingProperties() {
$res = $this->mDb->select( 'page_props', array( 'pp_propname', 'pp_value' ),
array( 'pp_page' => $this->mId ), __METHOD__, $this->mOptions );
$arr = array();
@@ -764,16 +803,26 @@ class LinksUpdate {
return $arr;
}
-
/**
* Return the title object of the page being updated
+ * @return Title
*/
- function getTitle() {
+ public function getTitle() {
return $this->mTitle;
}
/**
+ * Returns parser output
+ * @since 1.19
+ * @return ParserOutput
+ */
+ public function getParserOutput() {
+ return $this->mParserOutput;
+ }
+
+ /**
* Return the list of images used as generated by the parser
+ * @return array
*/
public function getImages() {
return $this->mImages;
@@ -781,8 +830,9 @@ class LinksUpdate {
/**
* Invalidate any necessary link lists related to page property changes
+ * @param $changed
*/
- function invalidateProperties( $changed ) {
+ private function invalidateProperties( $changed ) {
global $wgPagePropLinkInvalidations;
foreach ( $changed as $name => $value ) {
diff --git a/includes/LocalisationCache.php b/includes/LocalisationCache.php
index 6d5882d9..3b1f45cc 100644
--- a/includes/LocalisationCache.php
+++ b/includes/LocalisationCache.php
@@ -1,6 +1,6 @@
<?php
-define( 'MW_LC_VERSION', 1 );
+define( 'MW_LC_VERSION', 2 );
/**
* Class for caching the contents of localisation files, Messages*.php
@@ -40,6 +40,8 @@ class LocalisationCache {
/**
* The persistent store object. An instance of LCStore.
+ *
+ * @var LCStore
*/
var $store;
@@ -88,6 +90,7 @@ class LocalisationCache {
'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
+ 'digitGroupingPattern'
);
/**
@@ -131,6 +134,8 @@ class LocalisationCache {
*/
static public $preloadedKeys = array( 'dateFormats', 'namespaceNames' );
+ var $mergeableKeys = null;
+
/**
* Constructor.
* For constructor parameters, see the documentation in DefaultSettings.php
@@ -154,6 +159,9 @@ class LocalisationCache {
case 'db':
$storeClass = 'LCStore_DB';
break;
+ case 'accel':
+ $storeClass = 'LCStore_Accel';
+ break;
case 'detect':
$storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB';
break;
@@ -179,9 +187,11 @@ class LocalisationCache {
/**
* Returns true if the given key is mergeable, that is, if it is an associative
* array which can be merged through a fallback sequence.
+ * @param $key
+ * @return bool
*/
public function isMergeableKey( $key ) {
- if ( !isset( $this->mergeableKeys ) ) {
+ if ( $this->mergeableKeys === null ) {
$this->mergeableKeys = array_flip( array_merge(
self::$mergeableMapKeys,
self::$mergeableListKeys,
@@ -198,6 +208,9 @@ class LocalisationCache {
*
* Warning: this may be slow for split items (messages), since it will
* need to fetch all of the subitems from the cache individually.
+ * @param $code
+ * @param $key
+ * @return mixed
*/
public function getItem( $code, $key ) {
if ( !isset( $this->loadedItems[$code][$key] ) ) {
@@ -205,23 +218,29 @@ class LocalisationCache {
$this->loadItem( $code, $key );
wfProfileOut( __METHOD__.'-load' );
}
+
if ( $key === 'fallback' && isset( $this->shallowFallbacks[$code] ) ) {
return $this->shallowFallbacks[$code];
}
+
return $this->data[$code][$key];
}
/**
* Get a subitem, for instance a single message for a given language.
+ * @param $code
+ * @param $key
+ * @param $subkey
+ * @return null
*/
public function getSubitem( $code, $key, $subkey ) {
- if ( !isset( $this->loadedSubitems[$code][$key][$subkey] )
- && !isset( $this->loadedItems[$code][$key] ) )
- {
+ if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) &&
+ !isset( $this->loadedItems[$code][$key] ) ) {
wfProfileIn( __METHOD__.'-load' );
$this->loadSubitem( $code, $key, $subkey );
wfProfileOut( __METHOD__.'-load' );
}
+
if ( isset( $this->data[$code][$key][$subkey] ) ) {
return $this->data[$code][$key][$subkey];
} else {
@@ -237,6 +256,9 @@ class LocalisationCache {
*
* Will return null if the item is not found, or false if the item is not an
* array.
+ * @param $code
+ * @param $key
+ * @return bool|null|string
*/
public function getSubitemList( $code, $key ) {
if ( in_array( $key, self::$splitKeys ) ) {
@@ -253,19 +275,24 @@ class LocalisationCache {
/**
* Load an item into the cache.
+ * @param $code
+ * @param $key
*/
protected function loadItem( $code, $key ) {
if ( !isset( $this->initialisedLangs[$code] ) ) {
$this->initLanguage( $code );
}
+
// Check to see if initLanguage() loaded it for us
if ( isset( $this->loadedItems[$code][$key] ) ) {
return;
}
+
if ( isset( $this->shallowFallbacks[$code] ) ) {
$this->loadItem( $this->shallowFallbacks[$code], $key );
return;
}
+
if ( in_array( $key, self::$splitKeys ) ) {
$subkeyList = $this->getSubitem( $code, 'list', $key );
foreach ( $subkeyList as $subkey ) {
@@ -277,30 +304,38 @@ class LocalisationCache {
} else {
$this->data[$code][$key] = $this->store->get( $code, $key );
}
+
$this->loadedItems[$code][$key] = true;
}
/**
* Load a subitem into the cache
+ * @param $code
+ * @param $key
+ * @param $subkey
+ * @return
*/
protected function loadSubitem( $code, $key, $subkey ) {
if ( !in_array( $key, self::$splitKeys ) ) {
$this->loadItem( $code, $key );
return;
}
+
if ( !isset( $this->initialisedLangs[$code] ) ) {
$this->initLanguage( $code );
}
+
// Check to see if initLanguage() loaded it for us
- if ( isset( $this->loadedItems[$code][$key] )
- || isset( $this->loadedSubitems[$code][$key][$subkey] ) )
- {
+ if ( isset( $this->loadedItems[$code][$key] ) ||
+ isset( $this->loadedSubitems[$code][$key][$subkey] ) ) {
return;
}
+
if ( isset( $this->shallowFallbacks[$code] ) ) {
$this->loadSubitem( $this->shallowFallbacks[$code], $key, $subkey );
return;
}
+
$value = $this->store->get( $code, "$key:$subkey" );
$this->data[$code][$key][$subkey] = $value;
$this->loadedSubitems[$code][$key][$subkey] = true;
@@ -316,10 +351,14 @@ class LocalisationCache {
}
$deps = $this->store->get( $code, 'deps' );
- if ( $deps === null ) {
+ $keys = $this->store->get( $code, 'list', 'messages' );
+ $preload = $this->store->get( $code, 'preload' );
+ // Different keys may expire separately, at least in LCStore_Accel
+ if ( $deps === null || $keys === null || $preload === null ) {
wfDebug( __METHOD__."($code): cache missing, need to make one\n" );
return true;
}
+
foreach ( $deps as $dep ) {
// Because we're unserializing stuff from cache, we
// could receive objects of classes that don't exist
@@ -331,16 +370,19 @@ class LocalisationCache {
return true;
}
}
+
return false;
}
/**
* Initialise a language in this object. Rebuild the cache if necessary.
+ * @param $code
*/
protected function initLanguage( $code ) {
if ( isset( $this->initialisedLangs[$code] ) ) {
return;
}
+
$this->initialisedLangs[$code] = true;
# If the code is of the wrong form for a Messages*.php file, do a shallow fallback
@@ -391,6 +433,8 @@ class LocalisationCache {
/**
* Create a fallback from one language to another, without creating a
* complete persistent cache.
+ * @param $primaryCode
+ * @param $fallbackCode
*/
public function initShallowFallback( $primaryCode, $fallbackCode ) {
$this->data[$primaryCode] =& $this->data[$fallbackCode];
@@ -401,6 +445,9 @@ class LocalisationCache {
/**
* Read a PHP file containing localisation data.
+ * @param $_fileName
+ * @param $_fileType
+ * @return array
*/
protected function readPHPFile( $_fileName, $_fileType ) {
// Disable APC caching
@@ -415,12 +462,16 @@ class LocalisationCache {
} else {
throw new MWException( __METHOD__.": Invalid file type: $_fileType" );
}
+
return $data;
}
/**
* Merge two localisation values, a primary and a fallback, overwriting the
* primary value in place.
+ * @param $key
+ * @param $value
+ * @param $fallbackValue
*/
protected function mergeItem( $key, &$value, $fallbackValue ) {
if ( !is_null( $value ) ) {
@@ -435,6 +486,7 @@ class LocalisationCache {
if ( !empty( $value['inherit'] ) ) {
$value = array_merge( $fallbackValue, $value );
}
+
if ( isset( $value['inherit'] ) ) {
unset( $value['inherit'] );
}
@@ -447,6 +499,10 @@ class LocalisationCache {
}
}
+ /**
+ * @param $value
+ * @param $fallbackValue
+ */
protected function mergeMagicWords( &$value, $fallbackValue ) {
foreach ( $fallbackValue as $magicName => $fallbackInfo ) {
if ( !isset( $value[$magicName] ) ) {
@@ -468,6 +524,11 @@ class LocalisationCache {
*
* Returns true if any data from the extension array was used, false
* otherwise.
+ * @param $codeSequence
+ * @param $key
+ * @param $value
+ * @param $fallbackValue
+ * @return bool
*/
protected function mergeExtensionItem( $codeSequence, $key, &$value, $fallbackValue ) {
$used = false;
@@ -477,16 +538,17 @@ class LocalisationCache {
$used = true;
}
}
+
return $used;
}
/**
* Load localisation data for a given language for both core and extensions
* and save it to the persistent cache store and the process cache
+ * @param $code
*/
public function recache( $code ) {
- static $recursionGuard = array();
- global $wgExtensionMessagesFiles, $wgExtensionAliasesFiles;
+ global $wgExtensionMessagesFiles;
wfProfileIn( __METHOD__ );
if ( !$code ) {
@@ -515,6 +577,7 @@ class LocalisationCache {
foreach ( $data as $key => $value ) {
$this->mergeItem( $key, $coreData[$key], $value );
}
+
}
# Fill in the fallback if it's not there already
@@ -522,28 +585,42 @@ class LocalisationCache {
$coreData['fallback'] = $code === 'en' ? false : 'en';
}
- if ( $coreData['fallback'] !== false ) {
- # Guard against circular references
- if ( isset( $recursionGuard[$code] ) ) {
- throw new MWException( "Error: Circular fallback reference in language code $code" );
+ if ( $coreData['fallback'] === false ) {
+ $coreData['fallbackSequence'] = array();
+ } else {
+ $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+ $len = count( $coreData['fallbackSequence'] );
+
+ # Ensure that the sequence ends at en
+ if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
+ $coreData['fallbackSequence'][] = 'en';
}
- $recursionGuard[$code] = true;
# Load the fallback localisation item by item and merge it
- $deps = array_merge( $deps, $this->getItem( $coreData['fallback'], 'deps' ) );
- foreach ( self::$allKeys as $key ) {
- if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
- $fallbackValue = $this->getItem( $coreData['fallback'], $key );
- $this->mergeItem( $key, $coreData[$key], $fallbackValue );
+ foreach ( $coreData['fallbackSequence'] as $fbCode ) {
+ # Load the secondary localisation from the source file to
+ # avoid infinite cycles on cyclic fallbacks
+ $fbFilename = Language::getMessagesFileName( $fbCode );
+
+ if ( !file_exists( $fbFilename ) ) {
+ continue;
+ }
+
+ $deps[] = new FileDependency( $fbFilename );
+ $fbData = $this->readPHPFile( $fbFilename, 'core' );
+
+ foreach ( self::$allKeys as $key ) {
+ if ( !isset( $fbData[$key] ) ) {
+ continue;
+ }
+
+ if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
+ $this->mergeItem( $key, $coreData[$key], $fbData[$key] );
+ }
}
}
- $fallbackSequence = $this->getItem( $coreData['fallback'], 'fallbackSequence' );
- array_unshift( $fallbackSequence, $coreData['fallback'] );
- $coreData['fallbackSequence'] = $fallbackSequence;
- unset( $recursionGuard[$code] );
- } else {
- $coreData['fallbackSequence'] = array();
}
+
$codeSequence = array_merge( array( $code ), $coreData['fallbackSequence'] );
# Load the extension localisations
@@ -554,24 +631,13 @@ class LocalisationCache {
foreach ( $wgExtensionMessagesFiles as $fileName ) {
$data = $this->readPHPFile( $fileName, 'extension' );
$used = false;
+
foreach ( $data as $key => $item ) {
if( $this->mergeExtensionItem( $codeSequence, $key, $allData[$key], $item ) ) {
$used = true;
}
}
- if ( $used ) {
- $deps[] = new FileDependency( $fileName );
- }
- }
- # Load deprecated $wgExtensionAliasesFiles
- foreach ( $wgExtensionAliasesFiles as $fileName ) {
- $data = $this->readPHPFile( $fileName, 'aliases' );
- if ( !isset( $data['aliases'] ) ) {
- continue;
- }
- $used = $this->mergeExtensionItem( $codeSequence, 'specialPageAliases',
- $allData['specialPageAliases'], $data['aliases'] );
if ( $used ) {
$deps[] = new FileDependency( $fileName );
}
@@ -584,7 +650,6 @@ class LocalisationCache {
# Add cache dependencies for any referenced globals
$deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
- $deps['wgExtensionAliasesFiles'] = new GlobalDependency( 'wgExtensionAliasesFiles' );
$deps['version'] = new ConstantDependency( 'MW_LC_VERSION' );
# Add dependencies to the cache entry
@@ -651,12 +716,15 @@ class LocalisationCache {
*
* The preload item will be loaded automatically, improving performance
* for the commonly-requested items it contains.
+ * @param $data
+ * @return array
*/
protected function buildPreload( $data ) {
$preload = array( 'messages' => array() );
foreach ( self::$preloadedKeys as $key ) {
$preload[$key] = $data[$key];
}
+
foreach ( $data['preloadedMessages'] as $subkey ) {
if ( isset( $data['messages'][$subkey] ) ) {
$subitem = $data['messages'][$subkey];
@@ -665,18 +733,21 @@ class LocalisationCache {
}
$preload['messages'][$subkey] = $subitem;
}
+
return $preload;
}
/**
* Unload the data for a given language from the object cache.
* Reduces memory usage.
+ * @param $code
*/
public function unload( $code ) {
unset( $this->data[$code] );
unset( $this->loadedItems[$code] );
unset( $this->loadedSubitems[$code] );
unset( $this->initialisedLangs[$code] );
+
foreach ( $this->shallowFallbacks as $shallowCode => $fbCode ) {
if ( $fbCode === $code ) {
$this->unload( $shallowCode );
@@ -741,9 +812,59 @@ 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
*/
function set( $key, $value );
+}
+
+/**
+ * LCStore implementation which uses PHP accelerator to store data.
+ * This will work if one of XCache, WinCache or APC cacher is configured.
+ * (See ObjectCache.php)
+ */
+class LCStore_Accel implements LCStore {
+ var $currentLang;
+ var $keys;
+ public function __construct() {
+ $this->cache = wfGetCache( CACHE_ACCEL );
+ }
+
+ public function get( $code, $key ) {
+ $k = wfMemcKey( 'l10n', $code, 'k', $key );
+ $r = $this->cache->get( $k );
+ return $r === false ? null : $r;
+ }
+
+ public function startWrite( $code ) {
+ $k = wfMemcKey( 'l10n', $code, 'l' );
+ $keys = $this->cache->get( $k );
+ if ( $keys ) {
+ foreach ( $keys as $k ) {
+ $this->cache->delete( $k );
+ }
+ }
+ $this->currentLang = $code;
+ $this->keys = array();
+ }
+
+ public function finishWrite() {
+ if ( $this->currentLang ) {
+ $k = wfMemcKey( 'l10n', $this->currentLang, 'l' );
+ $this->cache->set( $k, array_keys( $this->keys ) );
+ }
+ $this->currentLang = null;
+ $this->keys = array();
+ }
+
+ public function set( $key, $value ) {
+ if ( $this->currentLang ) {
+ $k = wfMemcKey( 'l10n', $this->currentLang, 'k', $key );
+ $this->keys[$k] = true;
+ $this->cache->set( $k, $value );
+ }
+ }
}
/**
@@ -753,7 +874,12 @@ interface LCStore {
class LCStore_DB implements LCStore {
var $currentLang;
var $writesDone = false;
- var $dbw, $batch;
+
+ /**
+ * @var DatabaseBase
+ */
+ var $dbw;
+ var $batch;
var $readOnly = false;
public function get( $code, $key ) {
@@ -775,9 +901,11 @@ class LCStore_DB implements LCStore {
if ( $this->readOnly ) {
return;
}
+
if ( !$code ) {
throw new MWException( __METHOD__.": Invalid language \"$code\"" );
}
+
$this->dbw = wfGetDB( DB_MASTER );
try {
$this->dbw->begin();
@@ -792,6 +920,7 @@ class LCStore_DB implements LCStore {
throw $e;
}
}
+
$this->currentLang = $code;
$this->batch = array();
}
@@ -800,9 +929,11 @@ class LCStore_DB implements LCStore {
if ( $this->readOnly ) {
return;
}
+
if ( $this->batch ) {
$this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
}
+
$this->dbw->commit();
$this->currentLang = null;
$this->dbw = null;
@@ -814,13 +945,16 @@ class LCStore_DB implements LCStore {
if ( $this->readOnly ) {
return;
}
+
if ( is_null( $this->currentLang ) ) {
throw new MWException( __CLASS__.': must call startWrite() before calling set()' );
}
+
$this->batch[] = array(
'lc_lang' => $this->currentLang,
'lc_key' => $key,
'lc_value' => serialize( $value ) );
+
if ( count( $this->batch ) >= 100 ) {
$this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
$this->batch = array();
@@ -845,6 +979,7 @@ class LCStore_CDB implements LCStore {
function __construct( $conf = array() ) {
global $wgCacheDirectory;
+
if ( isset( $conf['directory'] ) ) {
$this->directory = $conf['directory'];
} else {
@@ -855,16 +990,19 @@ class LCStore_CDB implements LCStore {
public function get( $code, $key ) {
if ( !isset( $this->readers[$code] ) ) {
$fileName = $this->getFileName( $code );
+
if ( !file_exists( $fileName ) ) {
$this->readers[$code] = false;
} else {
$this->readers[$code] = CdbReader::open( $fileName );
}
}
+
if ( !$this->readers[$code] ) {
return null;
} else {
$value = $this->readers[$code]->get( $key );
+
if ( $value === false ) {
return null;
}
@@ -874,15 +1012,17 @@ class LCStore_CDB implements LCStore {
public function startWrite( $code ) {
if ( !file_exists( $this->directory ) ) {
- if ( !wfMkdirParents( $this->directory ) ) {
+ if ( !wfMkdirParents( $this->directory, null, __METHOD__ ) ) {
throw new MWException( "Unable to create the localisation store " .
"directory \"{$this->directory}\"" );
}
}
+
// Close reader to stop permission errors on write
if( !empty($this->readers[$code]) ) {
$this->readers[$code]->close();
}
+
$this->writer = CdbWriter::open( $this->getFileName( $code ) );
$this->currentLang = $code;
}
@@ -946,16 +1086,24 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
*/
var $maxLoadedLangs = 10;
+ /**
+ * @param $fileName
+ * @param $fileType
+ * @return array|mixed
+ */
protected function readPHPFile( $fileName, $fileType ) {
$serialize = $fileType === 'core';
if ( !isset( $this->fileCache[$fileName][$fileType] ) ) {
$data = parent::readPHPFile( $fileName, $fileType );
+
if ( $serialize ) {
$encData = serialize( $data );
} else {
$encData = $data;
}
+
$this->fileCache[$fileName][$fileType] = $encData;
+
return $data;
} elseif ( $serialize ) {
return unserialize( $this->fileCache[$fileName][$fileType] );
@@ -964,18 +1112,32 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
}
}
+ /**
+ * @param $code
+ * @param $key
+ * @return mixed
+ */
public function getItem( $code, $key ) {
unset( $this->mruLangs[$code] );
$this->mruLangs[$code] = true;
return parent::getItem( $code, $key );
}
+ /**
+ * @param $code
+ * @param $key
+ * @param $subkey
+ * @return
+ */
public function getSubitem( $code, $key, $subkey ) {
unset( $this->mruLangs[$code] );
$this->mruLangs[$code] = true;
return parent::getSubitem( $code, $key, $subkey );
}
+ /**
+ * @param $code
+ */
public function recache( $code ) {
parent::recache( $code );
unset( $this->mruLangs[$code] );
@@ -983,6 +1145,9 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
$this->trimCache();
}
+ /**
+ * @param $code
+ */
public function unload( $code ) {
unset( $this->mruLangs[$code] );
parent::unload( $code );
@@ -999,4 +1164,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
$this->unload( $code );
}
}
-}
+} \ No newline at end of file
diff --git a/includes/MWFunction.php b/includes/MWFunction.php
index 53ce446e..0113f917 100644
--- a/includes/MWFunction.php
+++ b/includes/MWFunction.php
@@ -20,6 +20,11 @@
class MWFunction {
+ /**
+ * @param $callback
+ * @return array
+ * @throws MWException
+ */
protected static function cleanCallback( $callback ) {
if( is_string( $callback ) ) {
if ( strpos( $callback, '::' ) !== false ) {
@@ -39,6 +44,10 @@ class MWFunction {
return $callback;
}
+ /**
+ * @param $callback
+ * @return mixed
+ */
public static function call( $callback ) {
$callback = self::cleanCallback( $callback );
@@ -47,11 +56,21 @@ class MWFunction {
return call_user_func_array( 'call_user_func', $args );
}
+ /**
+ * @param $callback
+ * @param $argsarams
+ * @return mixed
+ */
public static function callArray( $callback, $argsarams ) {
$callback = self::cleanCallback( $callback );
return call_user_func_array( $callback, $argsarams );
}
+ /**
+ * @param $class
+ * @param $args array
+ * @return object
+ */
public static function newObj( $class, $args = array() ) {
if( !count( $args ) ) {
return new $class;
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index d1579380..1ba46701 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -10,8 +10,13 @@
/**
* This class encapsulates "magic words" such as #redirect, __NOTOC__, etc.
- * Usage:
- * if (MagicWord::get( 'redirect' )->match( $text ) )
+ *
+ * @par Usage:
+ * @code
+ * if (MagicWord::get( 'redirect' )->match( $text ) ) {
+ * // some code
+ * }
+ * @endcode
*
* Possible future improvements:
* * Simultaneous searching for a number of magic words
@@ -20,8 +25,20 @@
* Please avoid reading the data out of one of these objects and then writing
* special case code. If possible, add another match()-like function here.
*
- * To add magic words in an extension, use the LanguageGetMagic hook. For
- * magic words which are also Parser variables, add a MagicWordwgVariableIDs
+ * To add magic words in an extension, use $magicWords in a file listed in
+ * $wgExtensionMessagesFiles[].
+ *
+ * @par Example:
+ * @code
+ * $magicWords = array();
+ *
+ * $magicWords['en'] = array(
+ * 'magicwordkey' => array( 0, 'case_insensitive_magic_word' ),
+ * 'magicwordkey2' => array( 1, 'CASE_sensitive_magic_word2' ),
+ * );
+ * @endcode
+ *
+ * For magic words which are also Parser variables, add a MagicWordwgVariableIDs
* hook. Use string keys.
*
* @ingroup Parser
@@ -212,13 +229,6 @@ class MagicWord {
*/
static function getVariableIDs() {
if ( !self::$mVariableIDsInitialised ) {
- # Deprecated constant definition hook, available for extensions that need it
- $magicWords = array();
- wfRunHooks( 'MagicWordMagicWords', array( &$magicWords ) );
- foreach ( $magicWords as $word ) {
- define( $word, $word );
- }
-
# Get variable IDs
wfRunHooks( 'MagicWordwgVariableIDs', array( &self::$mVariableIDs ) );
self::$mVariableIDsInitialised = true;
@@ -228,17 +238,19 @@ class MagicWord {
/**
* Get an array of parser substitution modifier IDs
+ * @return array
*/
static function getSubstIDs() {
- return self::$mSubstIDs;
+ return self::$mSubstIDs;
}
/**
* Allow external reads of TTL array
*
+ * @param $id int
* @return array
*/
- static function getCacheTTL($id) {
+ static function getCacheTTL( $id ) {
if ( array_key_exists( $id, self::$mCacheTTLs ) ) {
return self::$mCacheTTLs[$id];
} else {
@@ -309,8 +321,8 @@ class MagicWord {
}
/**
- * A comparison function that returns -1, 0 or 1 depending on whether the
- * first string is longer, the same length or shorter than the second
+ * A comparison function that returns -1, 0 or 1 depending on whether the
+ * first string is longer, the same length or shorter than the second
* string.
*
* @param $s1 string
@@ -383,7 +395,7 @@ class MagicWord {
/**
* Returns true if the text contains the word
*
- * @paran $text string
+ * @param $text string
*
* @return bool
*/
@@ -633,7 +645,7 @@ class MagicWordArray {
/**
* Add a number of magic words by name
*
- * $param $names array
+ * @param $names array
*/
public function addArray( $names ) {
$this->names = array_merge( $this->names, array_values( $names ) );
@@ -712,7 +724,7 @@ class MagicWordArray {
/**
* Get a regex anchored to the start of the string that does not match parameters
*
- * @return string
+ * @return array
*/
function getRegexStart() {
$base = $this->getBaseRegex();
@@ -721,7 +733,7 @@ class MagicWordArray {
$newRegex[0] = "/^(?:{$base[0]})/iuS";
}
if ( $base[1] !== '' ) {
- $newRegex[1] = "/^(?:{$base[1]})/S";
+ $newRegex[1] = "/^(?:{$base[1]})/S";
}
return $newRegex;
}
@@ -729,7 +741,7 @@ class MagicWordArray {
/**
* Get an anchored regex for matching variables with parameters
*
- * @return string
+ * @return array
*/
function getVariableStartToEndRegex() {
$base = $this->getBaseRegex();
@@ -748,7 +760,7 @@ class MagicWordArray {
* Returns array(magic word ID, parameter value)
* If there is no parameter value, that element will be false.
*
- * @param $m arrray
+ * @param $m array
*
* @return array
*/
diff --git a/includes/Message.php b/includes/Message.php
index 87349ff5..3c5d5d7d 100644
--- a/includes/Message.php
+++ b/includes/Message.php
@@ -1,55 +1,137 @@
<?php
/**
- * This class provides methods for fetching interface messages and
- * processing them into variety of formats that are needed in MediaWiki.
- *
- * It is intented to replace the old wfMsg* functions that over time grew
- * unusable.
- *
- * Examples:
- * Fetching a message text for interface message
- * $button = Xml::button( wfMessage( 'submit' )->text() );
- * </pre>
- * Messages can have parameters:
- * wfMessage( 'welcome-to' )->params( $wgSitename )->text();
- * {{GRAMMAR}} and friends work correctly
- * wfMessage( 'are-friends', $user, $friend );
- * wfMessage( 'bad-message' )->rawParams( '<script>...</script>' )->escaped();
- * </pre>
- * Sometimes the message text ends up in the database, so content language is needed.
- * wfMessage( 'file-log', $user, $filename )->inContentLanguage()->text()
- * </pre>
- * Checking if message exists:
+ * The Message class provides methods which fullfil two basic services:
+ * - fetching interface messages
+ * - processing messages into a variety of formats
+ *
+ * First implemented with MediaWiki 1.17, the Message class is intented to
+ * replace the old wfMsg* functions that over time grew unusable.
+ * @see https://www.mediawiki.org/wiki/New_messages_API for equivalences
+ * between old and new functions.
+ *
+ * You should use the wfMessage() global function which acts as a wrapper for
+ * the Message class. The wrapper let you pass parameters as arguments.
+ *
+ * The most basic usage cases would be:
+ *
+ * @code
+ * // Initialize a Message object using the 'some_key' message key
+ * $message = wfMessage( 'some_key' );
+ *
+ * // Using two parameters those values are strings 'value1' and 'value2':
+ * $message = wfMessage( 'some_key',
+ * 'value1', 'value2'
+ * );
+ * @endcode
+ *
+ * @section message_global_fn Global function wrapper:
+ *
+ * Since wfMessage() returns a Message instance, you can chain its call with
+ * a method. Some of them return a Message instance too so you can chain them.
+ * You will find below several examples of wfMessage() usage.
+ *
+ * Fetching a message text for interface message:
+ *
+ * @code
+ * $button = Xml::button(
+ * wfMessage( 'submit' )->text()
+ * );
+ * @endcode
+ *
+ * A Message instance can be passed parameters after it has been constructed,
+ * use the params() method to do so:
+ *
+ * @code
+ * wfMessage( 'welcome-to' )
+ * ->params( $wgSitename )
+ * ->text();
+ * @endcode
+ *
+ * {{GRAMMAR}} and friends work correctly:
+ *
+ * @code
+ * wfMessage( 'are-friends',
+ * $user, $friend
+ * );
+ * wfMessage( 'bad-message' )
+ * ->rawParams( '<script>...</script>' )
+ * ->escaped();
+ * @endcode
+ *
+ * @section message_language Changing language:
+ *
+ * Messages can be requested in a different language or in whatever current
+ * content language is being used. The methods are:
+ * - Message->inContentLanguage()
+ * - Message->inLanguage()
+ *
+ * Sometimes the message text ends up in the database, so content language is
+ * needed:
+ *
+ * @code
+ * wfMessage( 'file-log',
+ * $user, $filename
+ * )->inContentLanguage()->text();
+ * @endcode
+ *
+ * Checking whether a message exists:
+ *
+ * @code
* wfMessage( 'mysterious-message' )->exists()
- * </pre>
+ * // returns a boolean whether the 'mysterious-message' key exist.
+ * @endcode
+ *
* If you want to use a different language:
- * wfMessage( 'email-header' )->inLanguage( $user->getOption( 'language' ) )->plain()
- * Note that you cannot parse the text except in the content or interface
- * languages
- * </pre>
*
+ * @code
+ * $userLanguage = $user->getOption( 'language' );
+ * wfMessage( 'email-header' )
+ * ->inLanguage( $userLanguage )
+ * ->plain();
+ * @endcode
+ *
+ * @note You cannot parse the text except in the content or interface
+ * @note languages
*
- * Comparison with old wfMsg* functions:
+ * @section message_compare_old Comparison with old wfMsg* functions:
*
- * Use full parsing.
+ * Use full parsing:
+ *
+ * @code
+ * // old style:
* wfMsgExt( 'key', array( 'parseinline' ), 'apple' );
- * === wfMessage( 'key', 'apple' )->parse();
- * </pre>
- * Parseinline is used because it is more useful when pre-building html.
+ * // new style:
+ * wfMessage( 'key', 'apple' )->parse();
+ * @endcode
+ *
+ * Parseinline is used because it is more useful when pre-building HTML.
* In normal use it is better to use OutputPage::(add|wrap)WikiMsg.
*
- * Places where html cannot be used. {{-transformation is done.
+ * Places where HTML cannot be used. {{-transformation is done.
+ * @code
+ * // old style:
* wfMsgExt( 'key', array( 'parsemag' ), 'apple', 'pear' );
- * === wfMessage( 'key', 'apple', 'pear' )->text();
- * </pre>
+ * // new style:
+ * wfMessage( 'key', 'apple', 'pear' )->text();
+ * @endcode
*
- * Shortcut for escaping the message too, similar to wfMsgHTML, but
+ * Shortcut for escaping the message too, similar to wfMsgHTML(), but
* parameters are not replaced after escaping by default.
- * $escaped = wfMessage( 'key' )->rawParams( 'apple' )->escaped();
- * </pre>
+ * @code
+ * $escaped = wfMessage( 'key' )
+ * ->rawParams( 'apple' )
+ * ->escaped();
+ * @endcode
+ *
+ * @section message_appendix Appendix:
*
* @todo
* - test, can we have tests?
+ * - this documentation needs to be extended
+ *
+ * @see https://www.mediawiki.org/wiki/WfMessage()
+ * @see https://www.mediawiki.org/wiki/New_messages_API
+ * @see https://www.mediawiki.org/wiki/Localisation
*
* @since 1.17
* @author Niklas Laxström
@@ -60,7 +142,7 @@ class Message {
* means the current interface language, false content language.
*/
protected $interface = true;
-
+
/**
* In which language to get this message. Overrides the $interface
* variable.
@@ -68,7 +150,7 @@ class Message {
* @var Language
*/
protected $language = null;
-
+
/**
* The message key.
*/
@@ -101,6 +183,11 @@ class Message {
protected $title = null;
/**
+ * @var string
+ */
+ protected $message;
+
+ /**
* Constructor.
* @param $key: message key, or array of message keys to try and use the first non-empty message for
* @param $params Array message parameters
@@ -131,7 +218,7 @@ class Message {
* Factory function accepting multiple message keys and returning a message instance
* for the first message which is non-empty. If all messages are empty then an
* instance of the first message key is returned.
- * @param Varargs: message keys
+ * @param Varargs: message keys (or first arg as an array of all the message keys)
* @return Message: $this
*/
public static function newFallbackSequence( /*...*/ ) {
@@ -150,7 +237,7 @@ class Message {
/**
* Adds parameters to the parameter list of this message.
- * @param Varargs: parameters as Strings
+ * @param Varargs: parameters as Strings, or a single argument that is an array of Strings
* @return Message: $this
*/
public function params( /*...*/ ) {
@@ -168,7 +255,7 @@ class Message {
* In other words the parsing process cannot access the contents
* of this type of parameter, and you need to make sure it is
* sanitized beforehand. The parser will see "$n", instead.
- * @param Varargs: raw parameters as Strings
+ * @param Varargs: raw parameters as Strings (or single argument that is an array of raw parameters)
* @return Message: $this
*/
public function rawParams( /*...*/ ) {
@@ -181,11 +268,11 @@ class Message {
}
return $this;
}
-
+
/**
* Add parameters that are numeric and will be passed through
* Language::formatNum before substitution
- * @param Varargs: numeric parameters
+ * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
* @return Message: $this
*/
public function numParams( /*...*/ ) {
@@ -198,7 +285,20 @@ class Message {
}
return $this;
}
-
+
+ /**
+ * Set the language and the title from a context object
+ *
+ * @param $context IContextSource
+ * @return Message: $this
+ */
+ public function setContext( IContextSource $context ) {
+ $this->inLanguage( $context->getLanguage() );
+ $this->title( $context->getTitle() );
+
+ return $this;
+ }
+
/**
* Request the message in any language that is supported.
* As a side effect interface message status is unconditionally
@@ -216,7 +316,7 @@ class Message {
} else {
$type = gettype( $lang );
throw new MWException( __METHOD__ . " must be "
- . "passed a String or Language object; $type given"
+ . "passed a String or Language object; $type given"
);
}
$this->interface = false;
@@ -268,10 +368,10 @@ class Message {
*/
public function toString() {
$string = $this->getMessageText();
-
+
# Replace parameters before text parsing
$string = $this->replaceParameters( $string, 'before' );
-
+
# Maybe transform using the full parser
if( $this->format === 'parse' ) {
$string = $this->parseText( $string );
@@ -287,10 +387,10 @@ class Message {
$string = $this->transformText( $string );
$string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
}
-
+
# Raw parameter replacement
$string = $this->replaceParameters( $string, 'after' );
-
+
return $string;
}
@@ -303,7 +403,7 @@ class Message {
public function __toString() {
return $this->toString();
}
-
+
/**
* Fully parse the text from wikitext to HTML
* @return String parsed HTML
@@ -470,7 +570,10 @@ class Message {
protected function fetchMessage() {
if ( !isset( $this->message ) ) {
$cache = MessageCache::singleton();
- if ( is_array($this->key) ) {
+ if ( is_array( $this->key ) ) {
+ if ( !count( $this->key ) ) {
+ throw new MWException( "Given empty message key array." );
+ }
foreach ( $this->key as $key ) {
$message = $cache->get( $key, $this->useDatabase, $this->language );
if ( $message !== false && $message !== '' ) {
diff --git a/includes/Metadata.php b/includes/Metadata.php
index 2e4ab94c..e5e3296b 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -41,14 +41,13 @@ abstract class RdfMetaData {
$rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) );
if( !$rdftype ){
- wfHttpError( 406, 'Not Acceptable', wfMsg( 'notacceptable' ) );
- return false;
- } else {
- $wgOut->disable();
- $wgRequest->response()->header( "Content-type: {$rdftype}; charset=utf-8" );
- $wgOut->sendCacheControl();
- return true;
+ throw new HttpError( 406, wfMessage( 'notacceptable' ) );
}
+
+ $wgOut->disable();
+ $wgRequest->response()->header( "Content-type: {$rdftype}; charset=utf-8" );
+ $wgOut->sendCacheControl();
+ return true;
}
protected function reallyFullUrl() {
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
index 62325238..f86b6051 100644
--- a/includes/MimeMagic.php
+++ b/includes/MimeMagic.php
@@ -29,6 +29,7 @@ application/ogg ogx ogg ogm ogv oga spx
application/pdf pdf
application/vnd.oasis.opendocument.chart odc
application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
application/vnd.oasis.opendocument.formula odf
application/vnd.oasis.opendocument.formula-template otf
application/vnd.oasis.opendocument.graphics odg
@@ -40,8 +41,8 @@ application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
application/vnd.oasis.opendocument.text odt
-application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-master otm
+application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/x-javascript js
application/x-shockwave-flash swf
@@ -79,6 +80,7 @@ define('MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
application/pdf [OFFICE]
application/vnd.oasis.opendocument.chart [OFFICE]
application/vnd.oasis.opendocument.chart-template [OFFICE]
+application/vnd.oasis.opendocument.database [OFFICE]
application/vnd.oasis.opendocument.formula [OFFICE]
application/vnd.oasis.opendocument.formula-template [OFFICE]
application/vnd.oasis.opendocument.graphics [OFFICE]
diff --git a/includes/Namespace.php b/includes/Namespace.php
index 95c167b2..292559d0 100644
--- a/includes/Namespace.php
+++ b/includes/Namespace.php
@@ -27,7 +27,7 @@ class MWNamespace {
/**
* Throw an exception when trying to get the subject or talk page
* for a given namespace where it does not make sense.
- * Special namespaces are defined in includes/define.php and have
+ * Special namespaces are defined in includes/Defines.php and have
* a value below 0 (ex: NS_SPECIAL = -1 , NS_MEDIA = -2)
*
* @param $index
@@ -36,7 +36,7 @@ class MWNamespace {
* @return true
*/
private static function isMethodValidFor( $index, $method ) {
- if( $index < NS_MAIN ) {
+ if ( $index < NS_MAIN ) {
throw new MWException( "$method does not make any sense for given namespace $index" );
}
return true;
@@ -50,7 +50,7 @@ class MWNamespace {
*/
public static function isMovable( $index ) {
global $wgAllowImageMoving;
- return !( $index < NS_MAIN || ($index == NS_FILE && !$wgAllowImageMoving) || $index == NS_CATEGORY );
+ return !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY );
}
/**
@@ -58,12 +58,22 @@ class MWNamespace {
*
* @param $index Int: namespace index
* @return bool
+ * @since 1.19
*/
- public static function isMain( $index ) {
+ public static function isSubject( $index ) {
return !self::isTalk( $index );
}
/**
+ * @see self::isSubject
+ * @deprecated Please use the more consistently named isSubject (since 1.19)
+ */
+ public static function isMain( $index ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ return self::isSubject( $index );
+ }
+
+ /**
* Is the given namespace a talk namespace?
*
* @param $index Int: namespace index
@@ -96,7 +106,7 @@ class MWNamespace {
*/
public static function getSubject( $index ) {
# Handle special namespaces
- if( $index < NS_MAIN ) {
+ if ( $index < NS_MAIN ) {
return $index;
}
@@ -116,9 +126,9 @@ class MWNamespace {
public static function getAssociated( $index ) {
self::isMethodValidFor( $index, __METHOD__ );
- if( self::isMain( $index ) ) {
+ if ( self::isSubject( $index ) ) {
return self::getTalk( $index );
- } elseif( self::isTalk( $index ) ) {
+ } elseif ( self::isTalk( $index ) ) {
return self::getSubject( $index );
} else {
return null;
@@ -129,8 +139,9 @@ class MWNamespace {
* Returns whether the specified namespace exists
*
* @param $index
- *
+ *
* @return bool
+ * @since 1.19
*/
public static function exists( $index ) {
$nslist = self::getCanonicalNamespaces();
@@ -138,6 +149,39 @@ class MWNamespace {
}
/**
+ * Returns whether the specified namespaces are the same namespace
+ *
+ * @note It's possible that in the future we may start using something
+ * other than just namespace indexes. Under that circumstance making use
+ * of this function rather than directly doing comparison will make
+ * sure that code will not potentially break.
+ *
+ * @param $ns1 int The first namespace index
+ * @param $ns2 int The second namespae index
+ *
+ * @return bool
+ * @since 1.19
+ */
+ public static function equals( $ns1, $ns2 ) {
+ return $ns1 == $ns2;
+ }
+
+ /**
+ * Returns whether the specified namespaces share the same subject.
+ * eg: NS_USER and NS_USER wil return true, as well
+ * NS_USER and NS_USER_TALK will return true.
+ *
+ * @param $ns1 int The first namespace index
+ * @param $ns2 int The second namespae index
+ *
+ * @return bool
+ * @since 1.19
+ */
+ public static function subjectEquals( $ns1, $ns2 ) {
+ return self::getSubject( $ns1 ) == self::getSubject( $ns2 );
+ }
+
+ /**
* Returns array of all defined namespaces with their canonical
* (English) names.
*
@@ -165,7 +209,7 @@ class MWNamespace {
*/
public static function getCanonicalName( $index ) {
$nslist = self::getCanonicalNamespaces();
- if( isset( $nslist[$index] ) ) {
+ if ( isset( $nslist[$index] ) ) {
return $nslist[$index];
} else {
return false;
@@ -184,7 +228,7 @@ class MWNamespace {
if ( $xNamespaces === false ) {
$xNamespaces = array();
foreach ( self::getCanonicalNamespaces() as $i => $text ) {
- $xNamespaces[strtolower($text)] = $i;
+ $xNamespaces[strtolower( $text )] = $i;
}
}
if ( array_key_exists( $name, $xNamespaces ) ) {
@@ -262,7 +306,7 @@ class MWNamespace {
*/
public static function getContentNamespaces() {
global $wgContentNamespaces;
- if( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) {
+ if ( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) {
return NS_MAIN;
} elseif ( !in_array( NS_MAIN, $wgContentNamespaces ) ) {
// always force NS_MAIN to be part of array (to match the algorithm used by isContent)
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 68c771bc..a91d5465 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -13,7 +13,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
*
* @todo FIXME: Another class handles sending the whole page to the client.
*
- * Some comments comes from a pairing session between Zak Greant and Ashar Voultoiz
+ * Some comments comes from a pairing session between Zak Greant and Antoine Musso
* in November 2010.
*
* @todo document
@@ -47,7 +47,13 @@ class OutputPage extends ContextSource {
var $mHTMLtitle = '';
/// Should be private. Is the displayed content related to the source of the corresponding wiki article.
- var $mIsarticle = true;
+ var $mIsarticle = false;
+
+ /**
+ * Should be private. Has get/set methods properly documented.
+ * Stores "article flag" toggle.
+ */
+ var $mIsArticleRelated = true;
/**
* Should be private. We have to set isPrintable(). Some pages should
@@ -61,7 +67,7 @@ class OutputPage extends ContextSource {
* Contains the page subtitle. Special pages usually have some links here.
* Don't confuse with site subtitle added by skins.
*/
- var $mSubtitle = '';
+ private $mSubtitle = array();
var $mRedirect = '';
var $mStatusCode;
@@ -126,9 +132,9 @@ class OutputPage extends ContextSource {
var $mTemplateIds = array();
var $mImageTimeKeys = array();
- var $mRedirectCode = '';
+ var $mRedirectCode = '';
- var $mFeedLinksAppendQuery = null;
+ var $mFeedLinksAppendQuery = null;
# What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
# @see ResourceLoaderModule::$origin
@@ -147,12 +153,9 @@ class OutputPage extends ContextSource {
var $mContainsOldMagic = 0, $mContainsNewMagic = 0;
/**
- * Should be private. Has get/set methods properly documented.
- * Stores "article flag" toggle.
+ * lazy initialised, use parserOptions()
+ * @var ParserOptions
*/
- var $mIsArticleRelated = true;
-
- /// lazy initialised, use parserOptions()
protected $mParserOptions = null;
/**
@@ -194,6 +197,7 @@ class OutputPage extends ContextSource {
/// should be private. To include the variable {{REVISIONID}}
var $mRevisionId = null;
+ private $mRevisionTimestamp = null;
var $mFileVersion = null;
@@ -220,12 +224,25 @@ class OutputPage extends ContextSource {
);
/**
+ * If the current page was reached through a redirect, $mRedirectedFrom contains the Title
+ * of the redirect.
+ *
+ * @var Title
+ */
+ private $mRedirectedFrom = null;
+
+ /**
* 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.
*/
function __construct( IContextSource $context = null ) {
- $this->setContext( $context );
+ if ( $context === null ) {
+ # Extensions should use `new RequestContext` instead of `new OutputPage` now.
+ wfDeprecated( __METHOD__ );
+ } else {
+ $this->setContext( $context );
+ }
}
/**
@@ -464,7 +481,7 @@ class OutputPage extends ContextSource {
*
* @param $filter
* @param $position
- *
+ *
* @return Array of module names
*/
public function getModuleStyles( $filter = false, $position = null ) {
@@ -506,6 +523,15 @@ class OutputPage extends ContextSource {
}
/**
+ * Get an array of head items
+ *
+ * @return Array
+ */
+ function getHeadItemsArray() {
+ return $this->mHeadItems;
+ }
+
+ /**
* Get all header items in a string
*
* @return String
@@ -743,7 +769,11 @@ class OutputPage extends ContextSource {
* @param $name string
*/
public function setHTMLTitle( $name ) {
- $this->mHTMLtitle = $name;
+ if ( $name instanceof Message ) {
+ $this->mHTMLtitle = $name->setContext( $this->getContext() )->text();
+ } else {
+ $this->mHTMLtitle = $name;
+ }
}
/**
@@ -756,21 +786,34 @@ class OutputPage extends ContextSource {
}
/**
+ * Set $mRedirectedFrom, the Title of the page which redirected us to the current page.
+ *
+ * param @t Title
+ */
+ public function setRedirectedFrom( $t ) {
+ $this->mRedirectedFrom = $t;
+ }
+
+ /**
* "Page title" means the contents of \<h1\>. It is stored as a valid HTML fragment.
* This function allows good tags like \<sup\> in the \<h1\> tag, but not bad tags like \<script\>.
* This function automatically sets \<title\> to the same content as \<h1\> but with all tags removed.
* Bad tags that were escaped in \<h1\> will still be escaped in \<title\>, and good tags like \<i\> will be dropped entirely.
*
- * @param $name string
+ * @param $name string|Message
*/
public function setPageTitle( $name ) {
+ if ( $name instanceof Message ) {
+ $name = $name->setContext( $this->getContext() )->text();
+ }
+
# change "<script>foo&bar</script>" to "&lt;script&gt;foo&amp;bar&lt;/script&gt;"
# but leave "<i>foobar</i>" alone
$nameWithTags = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $name ) );
$this->mPagetitle = $nameWithTags;
# change "<i>foo&amp;bar</i>" to "foo&bar"
- $this->setHTMLTitle( wfMsg( 'pagetitle', Sanitizer::stripAllTags( $nameWithTags ) ) );
+ $this->setHTMLTitle( $this->msg( 'pagetitle' )->rawParams( Sanitizer::stripAllTags( $nameWithTags ) ) );
}
/**
@@ -787,7 +830,7 @@ class OutputPage extends ContextSource {
*
* @param $t Title object
*/
- public function setTitle( $t ) {
+ public function setTitle( Title $t ) {
$this->getContext()->setTitle( $t );
}
@@ -795,19 +838,54 @@ class OutputPage extends ContextSource {
/**
* Replace the subtile with $str
*
- * @param $str String: new value of the subtitle
+ * @param $str String|Message: new value of the subtitle
*/
public function setSubtitle( $str ) {
- $this->mSubtitle = /*$this->parse(*/ $str /*)*/; // @bug 2514
+ $this->clearSubtitle();
+ $this->addSubtitle( $str );
}
/**
* Add $str to the subtitle
*
- * @param $str String to add to the subtitle
+ * @deprecated in 1.19; use addSubtitle() instead
+ * @param $str String|Message to add to the subtitle
*/
public function appendSubtitle( $str ) {
- $this->mSubtitle .= /*$this->parse(*/ $str /*)*/; // @bug 2514
+ $this->addSubtitle( $str );
+ }
+
+ /**
+ * Add $str to the subtitle
+ *
+ * @param $str String|Message to add to the subtitle
+ */
+ public function addSubtitle( $str ) {
+ if ( $str instanceof Message ) {
+ $this->mSubtitle[] = $str->setContext( $this->getContext() )->parse();
+ } else {
+ $this->mSubtitle[] = $str;
+ }
+ }
+
+ /**
+ * Add a subtitle containing a backlink to a page
+ *
+ * @param $title Title to link to
+ */
+ public function addBacklinkSubtitle( Title $title ) {
+ $query = array();
+ if ( $title->isRedirect() ) {
+ $query['redirect'] = 'no';
+ }
+ $this->addSubtitle( $this->msg( 'backlinksubtitle' )->rawParams( Linker::link( $title, null, array(), $query ) ) );
+ }
+
+ /**
+ * Clear the subtitles
+ */
+ public function clearSubtitle() {
+ $this->mSubtitle = array();
}
/**
@@ -816,7 +894,7 @@ class OutputPage extends ContextSource {
* @return String
*/
public function getSubtitle() {
- return $this->mSubtitle;
+ return implode( "<br />\n\t\t\t\t", $this->mSubtitle );
}
/**
@@ -1130,9 +1208,11 @@ 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() {
+ wfDeprecated( __METHOD__, '1.18' );
return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >= ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
}
@@ -1189,6 +1269,19 @@ class OutputPage extends ContextSource {
}
/**
+ * Shortcut for adding an Html::element via addHTML.
+ *
+ * @since 1.19
+ *
+ * @param $element string
+ * @param $attribs array
+ * @param $contents string
+ */
+ public function addElement( $element, $attribs = array(), $contents = '' ) {
+ $this->addHTML( Html::element( $element, $attribs, $contents ) );
+ }
+
+ /**
* Clear the body HTML
*/
public function clearHTML() {
@@ -1222,7 +1315,7 @@ class OutputPage extends ContextSource {
*/
public function parserOptions( $options = null ) {
if ( !$this->mParserOptions ) {
- $this->mParserOptions = new ParserOptions;
+ $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() );
$this->mParserOptions->setEditSection( false );
}
return wfSetVar( $this->mParserOptions, $options );
@@ -1250,6 +1343,27 @@ class OutputPage extends ContextSource {
}
/**
+ * Set the timestamp of the revision which will be displayed. This is used
+ * to avoid a extra DB call in Skin::lastModified().
+ *
+ * @param $revid Mixed: string, or null
+ * @return Mixed: previous value
+ */
+ public function setRevisionTimestamp( $timestmap ) {
+ return wfSetVar( $this->mRevisionTimestamp, $timestmap );
+ }
+
+ /**
+ * Get the timestamp of displayed revision.
+ * This will be null if not filled by setRevisionTimestamp().
+ *
+ * @return String or null
+ */
+ public function getRevisionTimestamp() {
+ return $this->mRevisionTimestamp;
+ }
+
+ /**
* Set the displayed file version
*
* @param $file File|false
@@ -1288,7 +1402,7 @@ class OutputPage extends ContextSource {
* @return Array (dbKey => array('time' => MW timestamp or null, 'sha1' => sha1 or ''))
* @since 1.18
*/
- public function getImageTimeKeys() {
+ public function getFileSearchOptions() {
return $this->mImageTimeKeys;
}
@@ -1298,10 +1412,11 @@ class OutputPage extends ContextSource {
*
* @param $text String
* @param $linestart Boolean: is this the start of a line?
+ * @param $interface Boolean: is this text in the user interface language?
*/
- public function addWikiText( $text, $linestart = true ) {
+ public function addWikiText( $text, $linestart = true, $interface = true ) {
$title = $this->getTitle(); // Work arround E_STRICT
- $this->addWikiTextTitle( $text, $title, $linestart );
+ $this->addWikiTextTitle( $text, $title, $linestart, /*tidy*/false, $interface );
}
/**
@@ -1344,16 +1459,17 @@ class OutputPage extends ContextSource {
* @param $title Title object
* @param $linestart Boolean: is this the start of a line?
* @param $tidy Boolean: whether to use tidy
+ * @param $interface Boolean: whether it is an interface message
+ * (for example disables conversion)
*/
- public function addWikiTextTitle( $text, &$title, $linestart, $tidy = false ) {
+ public function addWikiTextTitle( $text, &$title, $linestart, $tidy = false, $interface = false ) {
global $wgParser;
wfProfileIn( __METHOD__ );
- wfIncrStats( 'pcache_not_possible' );
-
$popts = $this->parserOptions();
$oldTidy = $popts->setTidy( $tidy );
+ $popts->setInterfaceMessage( (bool) $interface );
$parserOutput = $wgParser->parse(
$text, $title, $popts,
@@ -1398,7 +1514,7 @@ class OutputPage extends ContextSource {
}
}
// File versioning...
- foreach ( (array)$parserOutput->getImageTimeKeys() as $dbk => $data ) {
+ foreach ( (array)$parserOutput->getFileSearchOptions() as $dbk => $data ) {
$this->mImageTimeKeys[$dbk] = $data;
}
@@ -1446,7 +1562,8 @@ class OutputPage extends ContextSource {
* @param $linestart Boolean: is this the start of a line?
* @param $interface Boolean: use interface language ($wgLang instead of
* $wgContLang) while parsing language sensitive magic
- * words like GRAMMAR and PLURAL
+ * words like GRAMMAR and PLURAL. This also disables
+ * LanguageConverter.
* @param $language Language object: target language object, will override
* $interface
* @return String: HTML
@@ -1636,12 +1753,12 @@ class OutputPage extends ContextSource {
* /w/index.php?title=Main_page&variant=zh-cn should never be served.
*/
function addAcceptLanguage() {
- global $wgContLang;
- if( !$this->getRequest()->getCheck( 'variant' ) && $wgContLang->hasVariants() ) {
- $variants = $wgContLang->getVariants();
+ $lang = $this->getTitle()->getPageLanguage();
+ if( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
+ $variants = $lang->getVariants();
$aloption = array();
foreach ( $variants as $variant ) {
- if( $variant === $wgContLang->getCode() ) {
+ if( $variant === $lang->getCode() ) {
continue;
} else {
$aloption[] = 'string-contains=' . $variant;
@@ -1698,6 +1815,7 @@ class OutputPage extends ContextSource {
} elseif ( $this->mPreventClickjacking && $wgEditPageFrameOptions ) {
return $wgEditPageFrameOptions;
}
+ return false;
}
/**
@@ -1773,7 +1891,7 @@ class OutputPage extends ContextSource {
*
* @param $code Integer: status code
* @return String or null: message or null if $code is not in the list of
- * messages
+ * messages
*
* @deprecated since 1.18 Use HttpStatus::getMessage() instead.
*/
@@ -1861,7 +1979,7 @@ class OutputPage extends ContextSource {
wfRunHooks( 'BeforePageDisplay', array( &$this, &$sk ) );
wfProfileIn( 'Output-skin' );
- $sk->outputPage( $this );
+ $sk->outputPage();
wfProfileOut( 'Output-skin' );
}
@@ -1888,26 +2006,44 @@ class OutputPage extends ContextSource {
}
/**
- * Output a standard error page
+ * Prepare this object to display an error page; disable caching and
+ * indexing, clear the current text and redirect, set the page's title
+ * and optionally an custom HTML title (content of the <title> tag).
*
- * showErrorPage( 'titlemsg', 'pagetextmsg', array( 'param1', 'param2' ) );
- * showErrorPage( 'titlemsg', $messageObject );
- *
- * @param $title String: message key for page title
- * @param $msg Mixed: message key (string) for page text, or a Message object
- * @param $params Array: message parameters; ignored if $msg is a Message object
+ * @param $pageTitle String|Message will be passed directly to setPageTitle()
+ * @param $htmlTitle String|Message will be passed directly to setHTMLTitle();
+ * optional, if not passed the <title> attribute will be
+ * based on $pageTitle
*/
- public function showErrorPage( $title, $msg, $params = array() ) {
+ public function prepareErrorPage( $pageTitle, $htmlTitle = false ) {
if ( $this->getTitle() ) {
$this->mDebugtext .= 'Original title: ' . $this->getTitle()->getPrefixedText() . "\n";
}
- $this->setPageTitle( wfMsg( $title ) );
- $this->setHTMLTitle( wfMsg( 'errorpagetitle' ) );
+
+ $this->setPageTitle( $pageTitle );
+ if ( $htmlTitle !== false ) {
+ $this->setHTMLTitle( $htmlTitle );
+ }
$this->setRobotPolicy( 'noindex,nofollow' );
$this->setArticleRelated( false );
$this->enableClientCache( false );
$this->mRedirect = '';
- $this->mBodytext = '';
+ $this->clearSubtitle();
+ $this->clearHTML();
+ }
+
+ /**
+ * Output a standard error page
+ *
+ * showErrorPage( 'titlemsg', 'pagetextmsg', array( 'param1', 'param2' ) );
+ * showErrorPage( 'titlemsg', $messageObject );
+ *
+ * @param $title String: message key for page title
+ * @param $msg Mixed: message key (string) for page text, or a Message object
+ * @param $params Array: message parameters; ignored if $msg is a Message object
+ */
+ public function showErrorPage( $title, $msg, $params = array() ) {
+ $this->prepareErrorPage( $this->msg( $title ), $this->msg( 'errorpagetitle' ) );
if ( $msg instanceof Message ){
$this->addHTML( $msg->parse() );
@@ -1925,16 +2061,71 @@ class OutputPage extends ContextSource {
* @param $action String: action that was denied or null if unknown
*/
public function showPermissionsErrorPage( $errors, $action = null ) {
- $this->mDebugtext .= 'Original title: ' .
- $this->getTitle()->getPrefixedText() . "\n";
- $this->setPageTitle( wfMsg( 'permissionserrors' ) );
- $this->setHTMLTitle( wfMsg( 'permissionserrors' ) );
- $this->setRobotPolicy( 'noindex,nofollow' );
- $this->setArticleRelated( false );
- $this->enableClientCache( false );
- $this->mRedirect = '';
- $this->mBodytext = '';
- $this->addWikiText( $this->formatPermissionsErrorMessage( $errors, $action ) );
+ global $wgGroupPermissions;
+
+ // For some action (read, edit, create and upload), display a "login to do this action"
+ // error if all of the following conditions are met:
+ // 1. the user is not logged in
+ // 2. the only error is insufficient permissions (i.e. no block or something else)
+ // 3. the error can be avoided simply by logging in
+ if ( in_array( $action, array( 'read', 'edit', 'createpage', 'createtalk', 'upload' ) )
+ && $this->getUser()->isAnon() && count( $errors ) == 1 && isset( $errors[0][0] )
+ && ( $errors[0][0] == 'badaccess-groups' || $errors[0][0] == 'badaccess-group0' )
+ && ( ( isset( $wgGroupPermissions['user'][$action] ) && $wgGroupPermissions['user'][$action] )
+ || ( isset( $wgGroupPermissions['autoconfirmed'][$action] ) && $wgGroupPermissions['autoconfirmed'][$action] ) )
+ ) {
+ $displayReturnto = null;
+
+ # Due to bug 32276, if a user does not have read permissions,
+ # $this->getTitle() will just give Special:Badtitle, which is
+ # not especially useful as a returnto parameter. Use the title
+ # from the request instead, if there was one.
+ $request = $this->getRequest();
+ $returnto = Title::newFromURL( $request->getVal( 'title', '' ) );
+ if ( $action == 'edit' ) {
+ $msg = 'whitelistedittext';
+ $displayReturnto = $returnto;
+ } elseif ( $action == 'createpage' || $action == 'createtalk' ) {
+ $msg = 'nocreatetext';
+ } elseif ( $action == 'upload' ) {
+ $msg = 'uploadnologintext';
+ } else { # Read
+ $msg = 'loginreqpagetext';
+ $displayReturnto = Title::newMainPage();
+ }
+
+ $query = array();
+
+ if ( $returnto ) {
+ $query['returnto'] = $returnto->getPrefixedText();
+
+ if ( !$request->wasPosted() ) {
+ $returntoquery = $request->getValues();
+ unset( $returntoquery['title'] );
+ unset( $returntoquery['returnto'] );
+ unset( $returntoquery['returntoquery'] );
+ $query['returntoquery'] = wfArrayToCGI( $returntoquery );
+ }
+ }
+ $loginLink = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Userlogin' ),
+ $this->msg( 'loginreqlink' )->escaped(),
+ array(),
+ $query
+ );
+
+ $this->prepareErrorPage( $this->msg( 'loginreqtitle' ) );
+ $this->addHTML( $this->msg( $msg )->rawParams( $loginLink )->parse() );
+
+ # Don't return to a page the user can't read otherwise
+ # we'll end up in a pointless loop
+ if ( $displayReturnto && $displayReturnto->userCan( 'read', $this->getUser() ) ) {
+ $this->returnToMain( null, $displayReturnto );
+ }
+ } else {
+ $this->prepareErrorPage( $this->msg( 'permissionserrors' ) );
+ $this->addWikiText( $this->formatPermissionsErrorMessage( $errors, $action ) );
+ }
}
/**
@@ -1944,11 +2135,7 @@ class OutputPage extends ContextSource {
* @param $version Mixed: the version of MediaWiki needed to use the page
*/
public function versionRequired( $version ) {
- $this->setPageTitle( wfMsg( 'versionrequired', $version ) );
- $this->setHTMLTitle( wfMsg( 'versionrequired', $version ) );
- $this->setRobotPolicy( 'noindex,nofollow' );
- $this->setArticleRelated( false );
- $this->mBodytext = '';
+ $this->prepareErrorPage( $this->msg( 'versionrequired', $version ) );
$this->addWikiMsg( 'versionrequiredtext', $version );
$this->returnToMain();
@@ -1965,41 +2152,11 @@ class OutputPage extends ContextSource {
/**
* Produce the stock "please login to use the wiki" page
+ *
+ * @deprecated in 1.19; throw the exception directly
*/
public function loginToUse() {
- global $wgRequest;
-
- if( $this->getUser()->isLoggedIn() ) {
- throw new PermissionsError( 'read' );
- }
-
- $this->setPageTitle( wfMsg( 'loginreqtitle' ) );
- $this->setHtmlTitle( wfMsg( 'errorpagetitle' ) );
- $this->setRobotPolicy( 'noindex,nofollow' );
- $this->setArticleRelated( false );
-
- $returnto = Title::newFromURL( $wgRequest->getVal( 'title', '' ) );
- $returntoquery = array();
- if( $returnto ) {
- $returntoquery = array( 'returnto' => $returnto->getPrefixedText() );
- }
-
- $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
- $loginLink = Linker::linkKnown(
- $loginTitle,
- wfMsgHtml( 'loginreqlink' ),
- array(),
- $returntoquery
- );
- $this->addHTML( wfMessage( 'loginreqpagetext' )->rawParams( $loginLink )->parse() .
- "\n<!--" . $this->getTitle()->getPrefixedUrl() . '-->' );
-
- # Don't return to the main page if the user can't read it
- # otherwise we'll end up in a pointless loop
- $mainPage = Title::newMainPage();
- if( $mainPage->userCanRead() ) {
- $this->returnToMain( null, $mainPage );
- }
+ throw new PermissionsError( 'read' );
}
/**
@@ -2011,14 +2168,14 @@ class OutputPage extends ContextSource {
*/
public function formatPermissionsErrorMessage( $errors, $action = null ) {
if ( $action == null ) {
- $text = wfMsgNoTrans( 'permissionserrorstext', count( $errors ) ) . "\n\n";
+ $text = $this->msg( 'permissionserrorstext', count( $errors ) )->plain() . "\n\n";
} else {
- $action_desc = wfMsgNoTrans( "action-$action" );
- $text = wfMsgNoTrans(
+ $action_desc = $this->msg( "action-$action" )->plain();
+ $text = $this->msg(
'permissionserrorstext-withaction',
count( $errors ),
$action_desc
- ) . "\n\n";
+ )->plain() . "\n\n";
}
if ( count( $errors ) > 1 ) {
@@ -2026,13 +2183,13 @@ class OutputPage extends ContextSource {
foreach( $errors as $error ) {
$text .= '<li>';
- $text .= call_user_func_array( 'wfMsgNoTrans', $error );
+ $text .= call_user_func_array( array( $this, 'msg' ), $error )->plain();
$text .= "</li>\n";
}
$text .= '</ul>';
} else {
$text .= "<div class=\"permissions-errors\">\n" .
- call_user_func_array( 'wfMsgNoTrans', reset( $errors ) ) .
+ call_user_func_array( array( $this, 'msg' ), reset( $errors ) )->plain() .
"\n</div>";
}
@@ -2072,12 +2229,10 @@ class OutputPage extends ContextSource {
if ( !empty( $reasons ) ) {
// Permissions error
if( $source ) {
- $this->setPageTitle( wfMsg( 'viewsource' ) );
- $this->setSubtitle(
- wfMsg( 'viewsourcefor', Linker::linkKnown( $this->getTitle() ) )
- );
+ $this->setPageTitle( $this->msg( 'viewsource-title', $this->getTitle()->getPrefixedText() ) );
+ $this->addBacklinkSubtitle( $this->getTitle() );
} else {
- $this->setPageTitle( wfMsg( 'badaccess' ) );
+ $this->setPageTitle( $this->msg( 'badaccess' ) );
}
$this->addWikiText( $this->formatPermissionsErrorMessage( $reasons, $action ) );
} else {
@@ -2089,18 +2244,20 @@ class OutputPage extends ContextSource {
if( is_string( $source ) ) {
$this->addWikiMsg( 'viewsourcetext' );
+ $pageLang = $this->getTitle()->getPageLanguage();
$params = array(
'id' => 'wpTextbox1',
'name' => 'wpTextbox1',
'cols' => $this->getUser()->getOption( 'cols' ),
'rows' => $this->getUser()->getOption( 'rows' ),
- 'readonly' => 'readonly'
+ 'readonly' => 'readonly',
+ 'lang' => $pageLang->getHtmlCode(),
+ 'dir' => $pageLang->getDir(),
);
$this->addHTML( Html::element( 'textarea', $params, $source ) );
// Show templates used by this article
- $article = new Article( $this->getTitle() );
- $templates = Linker::formatTemplates( $article->getUsedTemplates() );
+ $templates = Linker::formatTemplates( $this->getTitle()->getTemplateLinksFrom() );
$this->addHTML( "<div class='templatesUsed'>
$templates
</div>
@@ -2139,37 +2296,34 @@ $templates
? 'lag-warn-normal'
: 'lag-warn-high';
$wrap = Html::rawElement( 'div', array( 'class' => "mw-{$message}" ), "\n$1\n" );
- $this->wrapWikiMsg( "$wrap\n", array( $message, $this->getContext()->getLang()->formatNum( $lag ) ) );
+ $this->wrapWikiMsg( "$wrap\n", array( $message, $this->getLanguage()->formatNum( $lag ) ) );
}
}
public function showFatalError( $message ) {
- $this->setPageTitle( wfMsg( 'internalerror' ) );
- $this->setRobotPolicy( 'noindex,nofollow' );
- $this->setArticleRelated( false );
- $this->enableClientCache( false );
- $this->mRedirect = '';
- $this->mBodytext = $message;
+ $this->prepareErrorPage( $this->msg( 'internalerror' ) );
+
+ $this->addHTML( $message );
}
public function showUnexpectedValueError( $name, $val ) {
- $this->showFatalError( wfMsg( 'unexpected', $name, $val ) );
+ $this->showFatalError( $this->msg( 'unexpected', $name, $val )->text() );
}
public function showFileCopyError( $old, $new ) {
- $this->showFatalError( wfMsg( 'filecopyerror', $old, $new ) );
+ $this->showFatalError( $this->msg( 'filecopyerror', $old, $new )->text() );
}
public function showFileRenameError( $old, $new ) {
- $this->showFatalError( wfMsg( 'filerenameerror', $old, $new ) );
+ $this->showFatalError( $this->msg( 'filerenameerror', $old, $new )->text() );
}
public function showFileDeleteError( $name ) {
- $this->showFatalError( wfMsg( 'filedeleteerror', $name ) );
+ $this->showFatalError( $this->msg( 'filedeleteerror', $name )->text() );
}
public function showFileNotFoundError( $name ) {
- $this->showFatalError( wfMsg( 'filenotfound', $name ) );
+ $this->showFatalError( $this->msg( 'filenotfound', $name )->text() );
}
/**
@@ -2181,10 +2335,8 @@ $templates
*/
public function addReturnTo( $title, $query = array(), $text = null ) {
$this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL() ) );
- $link = wfMsgHtml(
- 'returnto',
- Linker::link( $title, $text, array(), $query )
- );
+ $link = $this->msg( 'returnto' )->rawParams(
+ Linker::link( $title, $text, array(), $query ) )->escaped();
$this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
}
@@ -2227,19 +2379,19 @@ $templates
* @return String: The doctype, opening <html>, and head element.
*/
public function headElement( Skin $sk, $includeStyle = true ) {
- global $wgContLang, $wgUseTrackbacks;
- $userdir = $this->getLang()->getDir();
+ global $wgContLang;
+
+ $userdir = $this->getLanguage()->getDir();
$sitedir = $wgContLang->getDir();
if ( $sk->commonPrintStylesheet() ) {
$this->addModuleStyles( 'mediawiki.legacy.wikiprintable' );
}
- $sk->setupUserCss( $this );
- $ret = Html::htmlHeader( array( 'lang' => $this->getLang()->getCode(), 'dir' => $userdir, 'class' => 'client-nojs' ) );
+ $ret = Html::htmlHeader( array( 'lang' => $this->getLanguage()->getHtmlCode(), 'dir' => $userdir, 'class' => 'client-nojs' ) );
if ( $this->getHTMLTitle() == '' ) {
- $this->setHTMLTitle( wfMsg( 'pagetitle', $this->getPageTitle() ) );
+ $this->setHTMLTitle( $this->msg( 'pagetitle', $this->getPageTitle() ) );
}
$openHead = Html::openElement( 'head' );
@@ -2251,16 +2403,12 @@ $templates
$ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
$ret .= implode( "\n", array(
- $this->getHeadLinks( $sk, true ),
- $this->buildCssLinks( $sk ),
- $this->getHeadScripts( $sk ),
+ $this->getHeadLinks( null, true ),
+ $this->buildCssLinks(),
+ $this->getHeadScripts(),
$this->getHeadItems()
) );
- if ( $wgUseTrackbacks && $this->isArticleRelated() ) {
- $ret .= $this->getTitle()->trackbackRDF();
- }
-
$closeHead = Html::closeElement( 'head' );
if ( $closeHead ) {
$ret .= "$closeHead\n";
@@ -2268,29 +2416,16 @@ $templates
$bodyAttrs = array();
- # Crazy edit-on-double-click stuff
- $action = $this->getRequest()->getVal( 'action', 'view' );
-
- if (
- $this->getTitle()->getNamespace() != NS_SPECIAL &&
- in_array( $action, array( 'view', 'purge' ) ) &&
- $this->getUser()->getOption( 'editondblclick' )
- )
- {
- $editUrl = $this->getTitle()->getLocalUrl( $sk->editUrlOptions() );
- $bodyAttrs['ondblclick'] = "document.location = '" .
- Xml::escapeJsString( $editUrl ) . "'";
- }
-
# Classes for LTR/RTL directionality support
$bodyAttrs['class'] = "mediawiki $userdir sitedir-$sitedir";
- if ( $this->getContext()->getLang()->capitalizeAllNouns() ) {
+ if ( $this->getLanguage()->capitalizeAllNouns() ) {
# A <body> class is probably not the best way to do this . . .
$bodyAttrs['class'] .= ' 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
wfRunHooks( 'OutputPageBodyAttributes', array( $this, $sk, &$bodyAttrs ) );
@@ -2304,13 +2439,12 @@ $templates
* Add the default ResourceLoader modules to this object
*/
private function addDefaultModules() {
- global $wgIncludeLegacyJavaScript, $wgUseAjax,
+ global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
$wgAjaxWatch, $wgEnableMWSuggest;
// Add base resources
$this->addModules( array(
'mediawiki.user',
- 'mediawiki.util',
'mediawiki.page.startup',
'mediawiki.page.ready',
) );
@@ -2318,6 +2452,12 @@ $templates
$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' );
@@ -2336,6 +2476,11 @@ $templates
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' );
+ }
}
/**
@@ -2352,29 +2497,15 @@ $templates
/**
* TODO: Document
- * @param $skin Skin
- * @param $modules Array/string with the module name
+ * @param $modules Array/string with the module name(s)
* @param $only String ResourceLoaderModule TYPE_ class constant
* @param $useESI boolean
+ * @param $extraQuery Array with extra query parameters to add to each request. array( param => value )
+ * @param $loadCall boolean If true, output an (asynchronous) mw.loader.load() call rather than a <script src="..."> tag
* @return string html <script> and <style> tags
*/
- protected function makeResourceLoaderLink( Skin $skin, $modules, $only, $useESI = false ) {
- global $wgLoadScript, $wgResourceLoaderUseESI;
- // Lazy-load ResourceLoader
- // TODO: Should this be a static function of ResourceLoader instead?
- $baseQuery = array(
- 'lang' => $this->getContext()->getLang()->getCode(),
- 'debug' => ResourceLoader::inDebugMode() ? 'true' : 'false',
- 'skin' => $skin->getSkinName(),
- 'only' => $only,
- );
- // Propagate printable and handheld parameters if present
- if ( $this->isPrintable() ) {
- $baseQuery['printable'] = 1;
- }
- if ( $this->getRequest()->getBool( 'handheld' ) ) {
- $baseQuery['handheld'] = 1;
- }
+ protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
+ global $wgResourceLoaderUseESI;
if ( !count( $modules ) ) {
return '';
@@ -2390,7 +2521,7 @@ $templates
// Recursively call us for every item
$links = '';
foreach ( $modules as $name ) {
- $links .= $this->makeResourceLoaderLink( $skin, $name, $only, $useESI );
+ $links .= $this->makeResourceLoaderLink( $name, $only, $useESI );
}
return $links;
}
@@ -2421,14 +2552,26 @@ $templates
$links = '';
foreach ( $groups as $group => $modules ) {
- $query = $baseQuery;
// Special handling for user-specific groups
+ $user = null;
if ( ( $group === 'user' || $group === 'private' ) && $this->getUser()->isLoggedIn() ) {
- $query['user'] = $this->getUser()->getName();
+ $user = $this->getUser()->getName();
}
// Create a fake request based on the one we are about to make so modules return
// correct timestamp and emptiness data
+ $query = ResourceLoader::makeLoaderQuery(
+ array(), // modules; not determined yet
+ $this->getLanguage()->getCode(),
+ $this->getSkin()->getSkinName(),
+ $user,
+ null, // version; not determined yet
+ ResourceLoader::inDebugMode(),
+ $only === ResourceLoaderModule::TYPE_COMBINED ? null : $only,
+ $this->isPrintable(),
+ $this->getRequest()->getBool( 'handheld' ),
+ $extraQuery
+ );
$context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
// Drop modules that know they're empty
foreach ( $modules as $key => $module ) {
@@ -2441,8 +2584,6 @@ $templates
continue;
}
- $query['modules'] = ResourceLoader::makePackedModulesString( array_keys( $modules ) );
-
// Inline private modules. These can't be loaded through load.php for security
// reasons, see bug 34907. Note that these modules should be loaded from
// getHeadScripts() before the first loader call. Otherwise other modules can't
@@ -2459,6 +2600,7 @@ $templates
)
);
}
+ $links .= "\n";
continue;
}
// Special handling for the user group; because users might change their stuff
@@ -2466,6 +2608,7 @@ $templates
// timestamp of these user-changable modules so we can ensure cache misses on change
// This should NOT be done for the site group (bug 27564) because anons get that too
// and we shouldn't be putting timestamps in Squid-cached HTML
+ $version = null;
if ( $group === 'user' ) {
// Get the maximum timestamp
$timestamp = 1;
@@ -2473,15 +2616,21 @@ $templates
$timestamp = max( $timestamp, $module->getModifiedTime( $context ) );
}
// Add a version parameter so cache will break when things change
- $query['version'] = wfTimestamp( TS_ISO_8601_BASIC, $timestamp );
+ $version = wfTimestamp( TS_ISO_8601_BASIC, $timestamp );
}
- // Make queries uniform in order
- ksort( $query );
- $url = wfAppendQuery( $wgLoadScript, $query );
- // Prevent the IE6 extension check from being triggered (bug 28840)
- // by appending a character that's invalid in Windows extensions ('*')
- $url .= '&*';
+ $url = ResourceLoader::makeLoaderURL(
+ array_keys( $modules ),
+ $this->getLanguage()->getCode(),
+ $this->getSkin()->getSkinName(),
+ $user,
+ $version,
+ ResourceLoader::inDebugMode(),
+ $only === ResourceLoaderModule::TYPE_COMBINED ? null : $only,
+ $this->isPrintable(),
+ $this->getRequest()->getBool( 'handheld' ),
+ $extraQuery
+ );
if ( $useESI && $wgResourceLoaderUseESI ) {
$esi = Xml::element( 'esi:include', array( 'src' => $url ) );
if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
@@ -2493,6 +2642,12 @@ $templates
// Automatically select style/script elements
if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
$link = Html::linkedStyle( $url );
+ } else if ( $loadCall ) {
+ $link = Html::inlineScript(
+ ResourceLoader::makeLoaderConditionalScript(
+ Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
+ )
+ );
} else {
$link = Html::linkedScript( $url );
}
@@ -2511,12 +2666,13 @@ $templates
* JS stuff to put in the <head>. This is the startup module, config
* vars and modules marked with position 'top'
*
- * @param $sk Skin object to use
* @return String: HTML fragment
*/
- function getHeadScripts( Skin $sk ) {
+ function getHeadScripts() {
+ global $wgResourceLoaderExperimentalAsyncLoading;
+
// Startup - this will immediately load jquery and mediawiki modules
- $scripts = $this->makeResourceLoaderLink( $sk, 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
+ $scripts = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
// Load config before anything else
$scripts .= Html::inlineScript(
@@ -2525,10 +2681,16 @@ $templates
)
);
+ // Load embeddable private modules before any loader links
+ // This needs to be TYPE_COMBINED so these modules are properly wrapped
+ // in mw.loader.implement() calls and deferred until mw.user is available
+ $embedScripts = array( 'user.options', 'user.tokens' );
+ $scripts .= $this->makeResourceLoaderLink( $embedScripts, ResourceLoaderModule::TYPE_COMBINED );
+
// Script and Messages "only" requests marked for top inclusion
// Messages should go first
- $scripts .= $this->makeResourceLoaderLink( $sk, $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
- $scripts .= $this->makeResourceLoaderLink( $sk, $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
+ $scripts .= $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
+ $scripts .= $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
// Modules requests - let the client calculate dependencies and batch requests as it likes
// Only load modules that have marked themselves for loading at the top
@@ -2540,25 +2702,37 @@ $templates
)
);
}
+
+ if ( $wgResourceLoaderExperimentalAsyncLoading ) {
+ $scripts .= $this->getScriptsForBottomQueue( true );
+ }
return $scripts;
}
/**
- * JS stuff to put at the bottom of the <body>: modules marked with position 'bottom',
- * legacy scripts ($this->mScripts), user preferences, site JS and user JS
- *
- * @param $sk Skin
+ * JS stuff to put at the 'bottom', which can either be the bottom of the <body>
+ * or the bottom of the <head> depending on $wgResourceLoaderExperimentalAsyncLoading:
+ * modules marked with position 'bottom', legacy scripts ($this->mScripts),
+ * user preferences, site JS and user JS
*
+ * @param $inHead boolean If true, this HTML goes into the <head>, if false it goes into the <body>
* @return string
*/
- function getBottomScripts( Skin $sk ) {
+ function getScriptsForBottomQueue( $inHead ) {
global $wgUseSiteJs, $wgAllowUserJs;
// Script and Messages "only" requests marked for bottom inclusion
+ // If we're in the <head>, use load() calls rather than <script src="..."> tags
// Messages should go first
- $scripts = $this->makeResourceLoaderLink( $sk, $this->getModuleMessages( true, 'bottom' ), ResourceLoaderModule::TYPE_MESSAGES );
- $scripts .= $this->makeResourceLoaderLink( $sk, $this->getModuleScripts( true, 'bottom' ), ResourceLoaderModule::TYPE_SCRIPTS );
+ $scripts = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'bottom' ),
+ ResourceLoaderModule::TYPE_MESSAGES, /* $useESI = */ false, /* $extraQuery = */ array(),
+ /* $loadCall = */ $inHead
+ );
+ $scripts .= $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'bottom' ),
+ ResourceLoaderModule::TYPE_SCRIPTS, /* $useESI = */ false, /* $extraQuery = */ array(),
+ /* $loadCall = */ $inHead
+ );
// Modules requests - let the client calculate dependencies and batch requests as it likes
// Only load modules that have marked themselves for loading at the bottom
@@ -2566,7 +2740,7 @@ $templates
if ( $modules ) {
$scripts .= Html::inlineScript(
ResourceLoader::makeLoaderConditionalScript(
- Xml::encodeJsCall( 'mw.loader.load', array( $modules ) )
+ Xml::encodeJsCall( 'mw.loader.load', array( $modules, null, true ) )
)
);
}
@@ -2574,11 +2748,13 @@ $templates
// Legacy Scripts
$scripts .= "\n" . $this->mScripts;
- $userScripts = array( 'user.options', 'user.tokens' );
+ $userScripts = array();
// Add site JS if enabled
if ( $wgUseSiteJs ) {
- $scripts .= $this->makeResourceLoaderLink( $sk, 'site', ResourceLoaderModule::TYPE_SCRIPTS );
+ $scripts .= $this->makeResourceLoaderLink( 'site', ResourceLoaderModule::TYPE_SCRIPTS,
+ /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+ );
if( $this->getUser()->isLoggedIn() ){
$userScripts[] = 'user.groups';
}
@@ -2586,28 +2762,50 @@ $templates
// Add user JS if enabled
if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() ) {
- $action = $this->getRequest()->getVal( 'action', 'view' );
- if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $sk->userCanPreview( $action ) ) {
+ if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
# XXX: additional security check/prompt?
+ // We're on a preview of a JS subpage
+ // Exclude this page from the user module in case it's in there (bug 26283)
+ $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
+ array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
+ );
+ // Load the previewed JS
$scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
} else {
- # @todo FIXME: This means that User:Me/Common.js doesn't load when previewing
- # User:Me/Vector.js, and vice versa (bug26283)
- $userScripts[] = 'user';
+ // Include the user module normally
+ // We can't do $userScripts[] = 'user'; because the user module would end up
+ // being wrapped in a closure, so load it raw like 'site'
+ $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+ /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+ );
}
}
- $scripts .= $this->makeResourceLoaderLink( $sk, $userScripts, ResourceLoaderModule::TYPE_SCRIPTS );
+ $scripts .= $this->makeResourceLoaderLink( $userScripts, ResourceLoaderModule::TYPE_COMBINED,
+ /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+ );
return $scripts;
}
/**
+ * JS stuff to put at the bottom of the <body>
+ */
+ function getBottomScripts() {
+ global $wgResourceLoaderExperimentalAsyncLoading;
+ if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
+ return $this->getScriptsForBottomQueue( false );
+ } else {
+ return '';
+ }
+ }
+
+ /**
* Add one or more variables to be set in mw.config in JavaScript.
*
* @param $key {String|Array} Key or array of key/value pars.
- * @param $value {Mixed} Value of the configuration variable.
+ * @param $value {Mixed} [optional] Value of the configuration variable.
*/
- public function addJsConfigVars( $keys, $value ) {
+ public function addJsConfigVars( $keys, $value = null ) {
if ( is_array( $keys ) ) {
foreach ( $keys as $key => $value ) {
$this->mJsConfigVars[$key] = $value;
@@ -2626,40 +2824,72 @@ $templates
* This is only public until that function is removed. You have been warned.
*
* Do not add things here which can be evaluated in ResourceLoaderStartupScript
- * - in other words, page-indendent/site-wide variables (without state).
+ * - in other words, page-independent/site-wide variables (without state).
* You will only be adding bloat to the html page and causing page caches to
* have to be purged on configuration changes.
+ * @return array
*/
public function getJSVars() {
- global $wgUseAjax, $wgEnableMWSuggest, $wgContLang;
+ global $wgUseAjax, $wgEnableMWSuggest;
+
+ $latestRevID = 0;
+ $pageID = 0;
+ $canonicalName = false; # bug 21115
$title = $this->getTitle();
$ns = $title->getNamespace();
$nsname = 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() );
- } else {
- $canonicalName = false; # bug 21115
+ } elseif ( $this->canUseWikiPage() ) {
+ $wikiPage = $this->getWikiPage();
+ $latestRevID = $wikiPage->getLatest();
+ $pageID = $wikiPage->getId();
}
+ $lang = $title->getPageLanguage();
+
+ // Pre-process information
+ $separatorTransTable = $lang->separatorTransformTable();
+ $separatorTransTable = $separatorTransTable ? $separatorTransTable : array();
+ $compactSeparatorTransTable = array(
+ implode( "\t", array_keys( $separatorTransTable ) ),
+ implode( "\t", $separatorTransTable ),
+ );
+ $digitTransTable = $lang->digitTransformTable();
+ $digitTransTable = $digitTransTable ? $digitTransTable : array();
+ $compactDigitTransTable = array(
+ implode( "\t", array_keys( $digitTransTable ) ),
+ implode( "\t", $digitTransTable ),
+ );
+
$vars = array(
'wgCanonicalNamespace' => $nsname,
'wgCanonicalSpecialPageName' => $canonicalName,
'wgNamespaceNumber' => $title->getNamespace(),
'wgPageName' => $title->getPrefixedDBKey(),
'wgTitle' => $title->getText(),
- 'wgCurRevisionId' => $title->getLatestRevID(),
- 'wgArticleId' => $title->getArticleId(),
+ 'wgCurRevisionId' => $latestRevID,
+ 'wgArticleId' => $pageID,
'wgIsArticle' => $this->isArticle(),
- 'wgAction' => $this->getRequest()->getText( 'action', 'view' ),
+ 'wgAction' => Action::getActionName( $this->getContext() ),
'wgUserName' => $this->getUser()->isAnon() ? null : $this->getUser()->getName(),
'wgUserGroups' => $this->getUser()->getEffectiveGroups(),
'wgCategories' => $this->getCategories(),
'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
+ 'wgPageContentLanguage' => $lang->getCode(),
+ 'wgSeparatorTransformTable' => $compactSeparatorTransTable,
+ 'wgDigitTransformTable' => $compactDigitTransTable,
+ 'wgRelevantPageName' => $relevantTitle->getPrefixedDBKey(),
);
- if ( $wgContLang->hasVariants() ) {
- $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
- }
+ if ( $lang->hasVariants() ) {
+ $vars['wgUserVariant'] = $lang->getPreferredVariant();
+ }
foreach ( $title->getRestrictionTypes() as $type ) {
$vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
}
@@ -2669,28 +2899,55 @@ $templates
if ( $title->isMainPage() ) {
$vars['wgIsMainPage'] = true;
}
+ if ( $this->mRedirectedFrom ) {
+ $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBKey();
+ }
// Allow extensions to add their custom variables to the mw.config map.
// Use the 'ResourceLoaderGetConfigVars' hook if the variable is not
// page-dependant but site-wide (without state).
// Alternatively, you may want to use OutputPage->addJsConfigVars() instead.
- wfRunHooks( 'MakeGlobalVariablesScript', array( &$vars ) );
+ wfRunHooks( 'MakeGlobalVariablesScript', array( &$vars, $this ) );
// Merge in variables from addJsConfigVars last
return array_merge( $vars, $this->mJsConfigVars );
}
/**
- * @param $sk Skin
+ * To make it harder for someone to slip a user a fake
+ * user-JavaScript or user-CSS preview, a random token
+ * is associated with the login session. If it's not
+ * passed back with the preview request, we won't render
+ * the code.
+ *
+ * @return bool
+ */
+ public function userCanPreview() {
+ if ( $this->getRequest()->getVal( 'action' ) != 'submit'
+ || !$this->getRequest()->wasPosted()
+ || !$this->getUser()->matchEditToken(
+ $this->getRequest()->getVal( 'wpEditToken' ) )
+ ) {
+ return false;
+ }
+ if ( !$this->getTitle()->isJsSubpage() && !$this->getTitle()->isCssSubpage() ) {
+ return false;
+ }
+
+ return !count( $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getUser() ) );
+ }
+
+ /**
+ * @param $unused Unused
* @param $addContentType bool
*
* @return string HTML tag links to be put in the header.
*/
- public function getHeadLinks( Skin $sk, $addContentType = false ) {
+ public function getHeadLinks( $unused = null, $addContentType = false ) {
global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
$wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
$wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
- $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgContLang,
+ $wgDisableLangConversion, $wgCanonicalLanguageLinks,
$wgRightsPage, $wgRightsUrl;
$tags = array();
@@ -2762,11 +3019,12 @@ $templates
}
# Universal edit button
- if ( $wgUniversalEditButton ) {
- if ( $this->isArticleRelated() && $this->getTitle() && $this->getTitle()->quickUserCan( 'edit' )
- && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create' ) ) ) {
+ if ( $wgUniversalEditButton && $this->isArticleRelated() ) {
+ $user = $this->getUser();
+ if ( $this->getTitle()->quickUserCan( 'edit', $user )
+ && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
// Original UniversalEditButton
- $msg = wfMsg( 'edit' );
+ $msg = $this->msg( 'edit' )->text();
$tags[] = Html::element( 'link', array(
'rel' => 'alternate',
'type' => 'application/x-wiki',
@@ -2799,7 +3057,7 @@ $templates
'rel' => 'search',
'type' => 'application/opensearchdescription+xml',
'href' => wfScript( 'opensearch_desc' ),
- 'title' => wfMsgForContent( 'opensearch-desc' ),
+ 'title' => $this->msg( 'opensearch-desc' )->inContentLanguage()->text(),
) );
if ( $wgEnableAPI ) {
@@ -2816,26 +3074,29 @@ $templates
) );
}
- # Language variants
- if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks
- && $wgContLang->hasVariants() ) {
-
- $urlvar = $wgContLang->getURLVariant();
- if ( !$urlvar ) {
- $variants = $wgContLang->getVariants();
- foreach ( $variants as $_v ) {
+ # Language variants
+ if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks ) {
+ $lang = $this->getTitle()->getPageLanguage();
+ if ( $lang->hasVariants() ) {
+
+ $urlvar = $lang->getURLVariant();
+
+ if ( !$urlvar ) {
+ $variants = $lang->getVariants();
+ foreach ( $variants as $_v ) {
+ $tags[] = Html::element( 'link', array(
+ 'rel' => 'alternate',
+ 'hreflang' => $_v,
+ 'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
+ );
+ }
+ } else {
$tags[] = Html::element( 'link', array(
- 'rel' => 'alternate',
- 'hreflang' => $_v,
- 'href' => $this->getTitle()->getLocalURL( '', $_v ) )
- );
+ 'rel' => 'canonical',
+ 'href' => $this->getTitle()->getCanonicalUrl()
+ ) );
}
- } else {
- $tags[] = Html::element( 'link', array(
- 'rel' => 'canonical',
- 'href' => $this->getTitle()->getCanonicalUrl()
- ) );
}
}
@@ -2872,7 +3133,7 @@ $templates
$format,
$link,
# Used messages: 'page-rss-feed' and 'page-atom-feed' (for an easier grep)
- wfMsg( "page-{$format}-feed", $this->getTitle()->getPrefixedText() )
+ $this->msg( "page-{$format}-feed", $this->getTitle()->getPrefixedText() )->text()
);
}
@@ -2883,24 +3144,22 @@ $templates
# like to promote instead of the RC feed (maybe like a "Recent New Articles"
# or "Breaking news" one). For this, we see if $wgOverrideSiteFeed is defined.
# If so, use it instead.
-
- $rctitle = SpecialPage::getTitleFor( 'Recentchanges' );
-
if ( $wgOverrideSiteFeed ) {
foreach ( $wgOverrideSiteFeed as $type => $feedUrl ) {
// Note, this->feedLink escapes the url.
$tags[] = $this->feedLink(
$type,
$feedUrl,
- wfMsg( "site-{$type}-feed", $wgSitename )
+ $this->msg( "site-{$type}-feed", $wgSitename )->text()
);
}
- } elseif ( $this->getTitle()->getPrefixedText() != $rctitle->getPrefixedText() ) {
+ } elseif ( !$this->getTitle()->isSpecial( 'Recentchanges' ) ) {
+ $rctitle = SpecialPage::getTitleFor( 'Recentchanges' );
foreach ( $wgAdvertisedFeedTypes as $format ) {
$tags[] = $this->feedLink(
$format,
$rctitle->getLocalURL( "feed={$format}" ),
- wfMsg( "site-{$format}-feed", $wgSitename ) # For grep: 'site-rss-feed', 'site-atom-feed'.
+ $this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
);
}
}
@@ -2953,10 +3212,10 @@ $templates
/**
* Adds inline CSS styles
* @param $style_css Mixed: inline CSS
- * @param $flip False or String: Set to 'flip' to flip the CSS if needed
+ * @param $flip String: Set to 'flip' to flip the CSS if needed
*/
- public function addInlineStyle( $style_css, $flip = false ) {
- if( $flip === 'flip' && $this->getLang()->isRTL() ) {
+ public function addInlineStyle( $style_css, $flip = 'noflip' ) {
+ 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 );
}
@@ -2966,17 +3225,61 @@ $templates
/**
* Build a set of <link>s for the stylesheets specified in the $this->styles array.
* These will be applied to various media & IE conditionals.
- * @param $sk Skin object
*
* @return string
*/
- public function buildCssLinks( $sk ) {
- $ret = '';
+ public function buildCssLinks() {
+ global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs,
+ $wgLang, $wgContLang;
+
+ $this->getSkin()->setupSkinUserCss( $this );
+
// Add ResourceLoader styles
// Split the styles into four groups
$styles = array( 'other' => array(), 'user' => array(), 'site' => array(), 'private' => array(), 'noscript' => array() );
+ $otherTags = ''; // Tags to append after the normal <link> tags
$resourceLoader = $this->getResourceLoader();
- foreach ( $this->getModuleStyles() as $name ) {
+
+ $moduleStyles = $this->getModuleStyles();
+
+ // Per-site custom styles
+ if ( $wgUseSiteCss ) {
+ $moduleStyles[] = 'site';
+ $moduleStyles[] = 'noscript';
+ if( $this->getUser()->isLoggedIn() ){
+ $moduleStyles[] = 'user.groups';
+ }
+ }
+
+ // Per-user custom styles
+ if ( $wgAllowUserCss ) {
+ if ( $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
+ // We're on a preview of a CSS subpage
+ // Exclude this page from the user module in case it's in there (bug 26283)
+ $otherTags .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
+ array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() )
+ );
+
+ // Load the previewed CSS
+ // If needed, Janus it first. This is user-supplied CSS, so it's
+ // assumed to be right for the content language directionality.
+ $previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
+ if ( $wgLang->getDir() !== $wgContLang->getDir() ) {
+ $previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
+ }
+ $otherTags .= Html::inlineStyle( $previewedCSS );
+ } else {
+ // Load the user styles normally
+ $moduleStyles[] = 'user';
+ }
+ }
+
+ // Per-user preference styles
+ if ( $wgAllowUserCssPrefs ) {
+ $moduleStyles[] = 'user.cssprefs';
+ }
+
+ foreach ( $moduleStyles as $name ) {
$module = $resourceLoader->getModule( $name );
if ( !$module ) {
continue;
@@ -2991,7 +3294,7 @@ $templates
// dynamically added styles to override statically added styles from other modules. So the order
// has to be other, dynamic, site, private, user
// Add statically added styles for other modules
- $ret .= $this->makeResourceLoaderLink( $sk, $styles['other'], ResourceLoaderModule::TYPE_STYLES );
+ $ret = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
// Add normal styles added through addStyle()/addInlineStyle() here
$ret .= implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
// Add marker tag to mark the place where the client-side loader should inject dynamic styles
@@ -3002,15 +3305,28 @@ $templates
// 'private' at present only contains user.options, so put that before 'user'
// Any future private modules will likely have a similar user-specific character
foreach ( array( 'site', 'noscript', 'private', 'user' ) as $group ) {
- $ret .= $this->makeResourceLoaderLink( $sk, $styles[$group],
+ $ret .= $this->makeResourceLoaderLink( $styles[$group],
ResourceLoaderModule::TYPE_STYLES
);
}
+
+ // Add stuff in $otherTags (previewed user CSS if applicable)
+ $ret .= $otherTags;
return $ret;
}
+ /**
+ * @return Array
+ */
public function buildCssLinksArray() {
$links = array();
+
+ // Add any extension CSS
+ foreach ( $this->mExtStyles as $url ) {
+ $this->addStyle( $url );
+ }
+ $this->mExtStyles = array();
+
foreach( $this->styles as $file => $options ) {
$link = $this->styleLink( $file, $options );
if( $link ) {
@@ -3030,7 +3346,7 @@ $templates
*/
protected function styleLink( $style, $options ) {
if( isset( $options['dir'] ) ) {
- if( $this->getLang()->getDir() != $options['dir'] ) {
+ if( $this->getLanguage()->getDir() != $options['dir'] ) {
return '';
}
}
@@ -3118,16 +3434,11 @@ $templates
* Like addWikiMsg() except the parameters are taken as an array
* instead of a variable argument list.
*
- * $options is passed through to wfMsgExt(), see that function for details.
- *
* @param $name string
* @param $args array
- * @param $options array
*/
- public function addWikiMsgArray( $name, $args, $options = array() ) {
- $options[] = 'parse';
- $text = wfMsgExt( $name, $options, $args );
- $this->addHTML( $text );
+ public function addWikiMsgArray( $name, $args ) {
+ $this->addHTML( $this->msg( $name, $args )->parseAsBlock() );
}
/**
diff --git a/includes/PHPVersionError.php b/includes/PHPVersionError.php
index 91502a4c..ec6490a8 100644
--- a/includes/PHPVersionError.php
+++ b/includes/PHPVersionError.php
@@ -7,7 +7,7 @@
*
* Calling this function kills execution immediately.
*
- * @param $entryPoint String Which entry point we're protecting. One of:
+ * @param $type String Which entry point we are protecting. One of:
* - index.php
* - load.php
* - api.php
@@ -17,7 +17,7 @@
* version are hardcoded here
*/
function wfPHPVersionError( $type ){
- $mwVersion = '1.18';
+ $mwVersion = '1.19';
$phpVersion = PHP_VERSION;
$message = "MediaWiki $mwVersion requires at least PHP version 5.2.3, you are using PHP $phpVersion.";
if( $type == 'index.php' ) {
@@ -32,7 +32,7 @@ function wfPHPVersionError( $type ){
header( 'Cache-control: none' );
header( 'Pragma: nocache' );
-$finalOutput = <<<HTML
+ $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'>
<head>
@@ -88,4 +88,4 @@ HTML;
}
echo( "$finalOutput\n" );
die( 1 );
-} \ No newline at end of file
+}
diff --git a/includes/PageQueryPage.php b/includes/PageQueryPage.php
index 8390241f..dc5e971d 100644
--- a/includes/PageQueryPage.php
+++ b/includes/PageQueryPage.php
@@ -21,6 +21,6 @@ abstract class PageQueryPage extends QueryPage {
if ( $title instanceof Title ) {
$text = $wgContLang->convert( $title->getPrefixedText() );
}
- return $skin->link( $title, htmlspecialchars( $text ), array(), array(), array('known', 'noclasses') );
+ return Linker::linkKnown( $title, htmlspecialchars( $text ) );
}
}
diff --git a/includes/Pager.php b/includes/Pager.php
index 81d95593..faae3d2d 100644
--- a/includes/Pager.php
+++ b/includes/Pager.php
@@ -57,7 +57,7 @@ interface Pager {
*
* @ingroup Pager
*/
-abstract class IndexPager implements Pager {
+abstract class IndexPager extends ContextSource implements Pager {
public $mRequest;
public $mLimitsShown = array( 20, 50, 100, 250, 500 );
public $mDefaultLimit = 50;
@@ -67,10 +67,15 @@ abstract class IndexPager implements Pager {
public $mPastTheEndRow;
/**
- * The index to actually be used for ordering. This is a single string
- * even if multiple orderings are supported.
+ * The index to actually be used for ordering. This is a single column,
+ * for one ordering, even if multiple orderings are supported.
*/
protected $mIndexField;
+ /**
+ * An array of secondary columns to order by. These fields are not part of the offset.
+ * This is a column list for one ordering, even if multiple orderings are supported.
+ */
+ protected $mExtraSortFields;
/** For pages that support multiple types of ordering, which one to use.
*/
protected $mOrderType;
@@ -90,6 +95,9 @@ abstract class IndexPager implements Pager {
/** True if the current result set is the first one */
public $mIsFirst;
+ public $mIsLast;
+
+ protected $mLastShown, $mFirstShown, $mPastTheEndIndex, $mDefaultQuery, $mNavigationBar;
/**
* Result object for the query. Warning: seek before use.
@@ -98,9 +106,12 @@ abstract class IndexPager implements Pager {
*/
public $mResult;
- public function __construct() {
- global $wgRequest, $wgUser;
- $this->mRequest = $wgRequest;
+ public function __construct( IContextSource $context = null ) {
+ if ( $context ) {
+ $this->setContext( $context );
+ }
+
+ $this->mRequest = $this->getRequest();
# NB: the offset is quoted, not validated. It is treated as an
# arbitrary string to support the widest variety of index types. Be
@@ -108,25 +119,33 @@ abstract class IndexPager implements Pager {
$this->mOffset = $this->mRequest->getText( 'offset' );
# Use consistent behavior for the limit options
- $this->mDefaultLimit = intval( $wgUser->getOption( 'rclimit' ) );
+ $this->mDefaultLimit = intval( $this->getUser()->getOption( 'rclimit' ) );
list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
$this->mIsBackwards = ( $this->mRequest->getVal( 'dir' ) == 'prev' );
$this->mDb = wfGetDB( DB_SLAVE );
- $index = $this->getIndexField();
+ $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] ) ) {
$this->mOrderType = $order;
$this->mIndexField = $index[$order];
+ $this->mExtraSortFields = isset( $extraSort[$order] )
+ ? (array)$extraSort[$order]
+ : array();
} elseif( is_array( $index ) ) {
# First element is the default
reset( $index );
list( $this->mOrderType, $this->mIndexField ) = each( $index );
+ $this->mExtraSortFields = isset( $extraSort[$this->mOrderType] )
+ ? (array)$extraSort[$this->mOrderType]
+ : array();
} else {
# $index is not an array
$this->mOrderType = null;
$this->mIndexField = $index;
+ $this->mExtraSortFields = (array)$extraSort;
}
if( !isset( $this->mDefaultDirection ) ) {
@@ -173,13 +192,17 @@ abstract class IndexPager implements Pager {
}
/**
- * Set the offset from an other source than $wgRequest
+ * Set the offset from an other source than the request
+ *
+ * @param $offset Int|String
*/
function setOffset( $offset ) {
$this->mOffset = $offset;
}
/**
- * Set the limit from an other source than $wgRequest
+ * Set the limit from an other source than the request
+ *
+ * @param $limit Int|String
*/
function setLimit( $limit ) {
$this->mLimit = $limit;
@@ -269,11 +292,16 @@ abstract class IndexPager implements Pager {
$conds = isset( $info['conds'] ) ? $info['conds'] : array();
$options = isset( $info['options'] ) ? $info['options'] : array();
$join_conds = isset( $info['join_conds'] ) ? $info['join_conds'] : array();
+ $sortColumns = array_merge( array( $this->mIndexField ), $this->mExtraSortFields );
if ( $descending ) {
- $options['ORDER BY'] = $this->mIndexField;
+ $options['ORDER BY'] = implode( ',', $sortColumns );
$operator = '>';
} else {
- $options['ORDER BY'] = $this->mIndexField . ' DESC';
+ $orderBy = array();
+ foreach ( $sortColumns as $col ) {
+ $orderBy[] = $col . ' DESC';
+ }
+ $options['ORDER BY'] = implode( ',', $orderBy );
$operator = '<';
}
if ( $offset != '' ) {
@@ -297,10 +325,16 @@ abstract class IndexPager implements Pager {
*
* @return String
*/
- function getBody() {
+ public function getBody() {
if ( !$this->mQueryDone ) {
$this->doQuery();
}
+
+ if ( $this->mResult->numRows() ) {
+ # Do any special query batches before display
+ $this->doBatchLookups();
+ }
+
# Don't use any extra rows returned by the query
$numRows = min( $this->mResult->numRows(), $this->mLimit );
@@ -348,22 +382,30 @@ abstract class IndexPager implements Pager {
if( $type ) {
$attrs['class'] = "mw-{$type}link";
}
- return $this->getSkin()->link(
+ return Linker::linkKnown(
$this->getTitle(),
$text,
$attrs,
- $query + $this->getDefaultQuery(),
- array( 'noclasses', 'known' )
+ $query + $this->getDefaultQuery()
);
}
/**
+ * Called from getBody(), before getStartBody() is called and
+ * after doQuery() was called. This will be called only if there
+ * are rows in the result set.
+ *
+ * @return void
+ */
+ protected function doBatchLookups() {}
+
+ /**
* Hook into getBody(), allows text to be inserted at the start. This
* will be called even if there are no rows in the result set.
*
* @return String
*/
- function getStartBody() {
+ protected function getStartBody() {
return '';
}
@@ -372,7 +414,7 @@ abstract class IndexPager implements Pager {
*
* @return String
*/
- function getEndBody() {
+ protected function getEndBody() {
return '';
}
@@ -382,34 +424,11 @@ abstract class IndexPager implements Pager {
*
* @return String
*/
- function getEmptyBody() {
+ protected function getEmptyBody() {
return '';
}
/**
- * Title used for self-links. Override this if you want to be able to
- * use a title other than $wgTitle
- *
- * @return Title object
- */
- function getTitle() {
- return $GLOBALS['wgTitle'];
- }
-
- /**
- * Get the current skin. This can be overridden if necessary.
- *
- * @return Skin object
- */
- function getSkin() {
- if ( !isset( $this->mSkin ) ) {
- global $wgUser;
- $this->mSkin = $wgUser->getSkin();
- }
- return $this->mSkin;
- }
-
- /**
* Get an array of query parameters that should be put into self-links.
* By default, all parameters passed in the URL are used, except for a
* short blacklist.
@@ -417,10 +436,8 @@ abstract class IndexPager implements Pager {
* @return Associative array
*/
function getDefaultQuery() {
- global $wgRequest;
-
if ( !isset( $this->mDefaultQuery ) ) {
- $this->mDefaultQuery = $wgRequest->getQueryValues();
+ $this->mDefaultQuery = $this->getRequest()->getQueryValues();
unset( $this->mDefaultQuery['title'] );
unset( $this->mDefaultQuery['dir'] );
unset( $this->mDefaultQuery['offset'] );
@@ -455,7 +472,7 @@ abstract class IndexPager implements Pager {
}
# Don't announce the limit everywhere if it's the default
- $urlLimit = $this->mLimit == $this->mDefaultLimit ? '' : $this->mLimit;
+ $urlLimit = $this->mLimit == $this->mDefaultLimit ? null : $this->mLimit;
if ( $this->mIsFirst ) {
$prev = false;
@@ -502,6 +519,8 @@ abstract class IndexPager implements Pager {
* $linkTexts will be used. Both $linkTexts and $disabledTexts are arrays
* of HTML.
*
+ * @param $linkTexts Array
+ * @param $disabledTexts Array
* @return Array
*/
function getPagingLinks( $linkTexts, $disabledTexts = array() ) {
@@ -524,7 +543,6 @@ abstract class IndexPager implements Pager {
}
function getLimitLinks() {
- global $wgLang;
$links = array();
if ( $this->mIsBackwards ) {
$offset = $this->mPastTheEndIndex;
@@ -533,7 +551,7 @@ abstract class IndexPager implements Pager {
}
foreach ( $this->mLimitsShown as $limit ) {
$links[] = $this->makeLink(
- $wgLang->formatNum( $limit ),
+ $this->getLanguage()->formatNum( $limit ),
array( 'offset' => $offset, 'limit' => $limit ),
'num'
);
@@ -574,10 +592,30 @@ abstract class IndexPager implements Pager {
*
* Needless to say, it's really not a good idea to use a non-unique index
* for this! That won't page right.
+ *
+ * @return string|Array
*/
abstract function getIndexField();
/**
+ * This function should be overridden to return the names of secondary columns
+ * to order by in addition to the column in getIndexField(). These fields will
+ * not be used in the pager offset or in any links for users.
+ *
+ * If getIndexField() returns an array of 'querykey' => 'indexfield' pairs then
+ * this must return a corresponding array of 'querykey' => array( fields...) pairs
+ * in order for a request with &count=querykey to use array( fields...) to sort.
+ *
+ * This is useful for pagers that GROUP BY a unique column (say page_id)
+ * and ORDER BY another (say page_len). Using GROUP BY and ORDER BY both on
+ * page_len,page_id avoids temp tables (given a page_len index). This would
+ * also work if page_id was non-unique but we had a page_len,page_id index.
+ *
+ * @return Array
+ */
+ protected function getExtraSortFields() { return array(); }
+
+ /**
* Return the default sorting direction: false for ascending, true for de-
* scending. You can also have an associative array of ordertype => dir,
* if multiple order types are supported. In this case getIndexField()
@@ -605,30 +643,33 @@ abstract class IndexPager implements Pager {
* @ingroup Pager
*/
abstract class AlphabeticPager extends IndexPager {
+
/**
* Shamelessly stolen bits from ReverseChronologicalPager,
* didn't want to do class magic as may be still revamped
+ *
+ * @return String HTML
*/
function getNavigationBar() {
- global $wgLang;
-
if ( !$this->isNavigationBarShown() ) return '';
if( isset( $this->mNavigationBar ) ) {
return $this->mNavigationBar;
}
+ $lang = $this->getLanguage();
+
$opts = array( 'parsemag', 'escapenoentities' );
$linkTexts = array(
'prev' => wfMsgExt(
'prevn',
$opts,
- $wgLang->formatNum( $this->mLimit )
+ $lang->formatNum( $this->mLimit )
),
'next' => wfMsgExt(
'nextn',
$opts,
- $wgLang->formatNum($this->mLimit )
+ $lang->formatNum($this->mLimit )
),
'first' => wfMsgExt( 'page_first', $opts ),
'last' => wfMsgExt( 'page_last', $opts )
@@ -636,10 +677,10 @@ abstract class AlphabeticPager extends IndexPager {
$pagingLinks = $this->getPagingLinks( $linkTexts );
$limitLinks = $this->getLimitLinks();
- $limits = $wgLang->pipeList( $limitLinks );
+ $limits = $lang->pipeList( $limitLinks );
$this->mNavigationBar =
- "(" . $wgLang->pipeList(
+ "(" . $lang->pipeList(
array( $pagingLinks['first'],
$pagingLinks['last'] )
) . ") " .
@@ -700,13 +741,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
public $mYear;
public $mMonth;
- function __construct() {
- parent::__construct();
- }
-
function getNavigationBar() {
- global $wgLang;
-
if ( !$this->isNavigationBarShown() ) {
return '';
}
@@ -714,7 +749,8 @@ abstract class ReverseChronologicalPager extends IndexPager {
if ( isset( $this->mNavigationBar ) ) {
return $this->mNavigationBar;
}
- $nicenumber = $wgLang->formatNum( $this->mLimit );
+
+ $nicenumber = $this->getLanguage()->formatNum( $this->mLimit );
$linkTexts = array(
'prev' => wfMsgExt(
'pager-newer-n',
@@ -732,7 +768,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
$pagingLinks = $this->getPagingLinks( $linkTexts );
$limitLinks = $this->getLimitLinks();
- $limits = $wgLang->pipeList( $limitLinks );
+ $limits = $this->getLanguage()->pipeList( $limitLinks );
$this->mNavigationBar = "({$pagingLinks['first']}" .
wfMsgExt( 'pipe-separator' , 'escapenoentities' ) .
@@ -746,11 +782,11 @@ abstract class ReverseChronologicalPager extends IndexPager {
}
function getDateCond( $year, $month ) {
- $year = intval($year);
- $month = intval($month);
+ $year = intval( $year );
+ $month = intval( $month );
// Basic validity checks
$this->mYear = $year > 0 ? $year : false;
- $this->mMonth = ($month > 0 && $month < 13) ? $month : false;
+ $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false;
// Given an optional year and month, we need to generate a timestamp
// to use as "WHERE rev_timestamp <= result"
// Examples: year = 2006 equals < 20070101 (+000000)
@@ -801,15 +837,18 @@ abstract class TablePager extends IndexPager {
var $mSort;
var $mCurrentRow;
- function __construct() {
- global $wgRequest;
- $this->mSort = $wgRequest->getText( 'sort' );
+ function __construct( IContextSource $context = null ) {
+ if ( $context ) {
+ $this->setContext( $context );
+ }
+
+ $this->mSort = $this->getRequest()->getText( 'sort' );
if ( !array_key_exists( $this->mSort, $this->getFieldNames() ) ) {
$this->mSort = $this->getDefaultSort();
}
- if ( $wgRequest->getBool( 'asc' ) ) {
+ if ( $this->getRequest()->getBool( 'asc' ) ) {
$this->mDefaultDirection = false;
- } elseif ( $wgRequest->getBool( 'desc' ) ) {
+ } elseif ( $this->getRequest()->getBool( 'desc' ) ) {
$this->mDefaultDirection = true;
} /* Else leave it at whatever the class default is */
@@ -821,7 +860,7 @@ abstract class TablePager extends IndexPager {
$tableClass = htmlspecialchars( $this->getTableClass() );
$sortClass = htmlspecialchars( $this->getSortHeaderClass() );
- $s = "<table style='border:1;' class=\"$tableClass\"><thead><tr>\n";
+ $s = "<table style='border:1;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
$fields = $this->getFieldNames();
# Make table header
@@ -872,9 +911,13 @@ abstract class TablePager extends IndexPager {
return "<tr><td colspan=\"$colspan\">$msgEmpty</td></tr>\n";
}
+ /**
+ * @param $row Array
+ * @return String HTML
+ */
function formatRow( $row ) {
$this->mCurrentRow = $row; # In case formatValue etc need to know
- $s = Xml::openElement( 'tr', $this->getRowAttrs($row) );
+ $s = Xml::openElement( 'tr', $this->getRowAttrs( $row ) );
$fieldNames = $this->getFieldNames();
foreach ( $fieldNames as $field => $name ) {
$value = isset( $row->$field ) ? $row->$field : null;
@@ -902,7 +945,7 @@ abstract class TablePager extends IndexPager {
* Get attributes to be applied to the given row.
*
* @param $row Object: the database result row
- * @return Associative array
+ * @return Array of <attr> => <value>
*/
function getRowAttrs( $row ) {
$class = $this->getRowClass( $row );
@@ -919,9 +962,9 @@ abstract class TablePager extends IndexPager {
* take this as an excuse to hardcode styles; use classes and
* CSS instead. Row context is available in $this->mCurrentRow
*
- * @param $field The column
- * @param $value The cell contents
- * @return Associative array
+ * @param $field String The column
+ * @param $value String The cell contents
+ * @return Array of attr => value
*/
function getCellAttrs( $field, $value ) {
return array( 'class' => 'TablePager_col_' . $field );
@@ -945,9 +988,10 @@ abstract class TablePager extends IndexPager {
/**
* A navigation bar with images
+ * @return String HTML
*/
function getNavigationBar() {
- global $wgStylePath, $wgLang;
+ global $wgStylePath;
if ( !$this->isNavigationBarShown() ) {
return '';
@@ -972,7 +1016,7 @@ abstract class TablePager extends IndexPager {
'next' => 'arrow_disabled_right_25.png',
'last' => 'arrow_disabled_last_25.png',
);
- if( $wgLang->isRTL() ) {
+ if( $this->getLanguage()->isRTL() ) {
$keys = array_keys( $labels );
$images = array_combine( $keys, array_reverse( $images ) );
$disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
@@ -1003,8 +1047,6 @@ abstract class TablePager extends IndexPager {
* @return String: HTML fragment
*/
function getLimitSelect() {
- global $wgLang;
-
# 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 ) ) {
@@ -1018,7 +1060,7 @@ abstract class TablePager extends IndexPager {
# will be a string.
if( is_int( $value ) ){
$limit = $value;
- $text = $wgLang->formatNum( $limit );
+ $text = $this->getLanguage()->formatNum( $limit );
} else {
$limit = $key;
$text = $value;
@@ -1034,13 +1076,12 @@ abstract class TablePager extends IndexPager {
* Resubmits all defined elements of the query string, except for a
* blacklist, passed in the $blacklist parameter.
*
+ * @param $blacklist Array parameters from the request query which should not be resubmitted
* @return String: HTML fragment
*/
function getHiddenFields( $blacklist = array() ) {
- global $wgRequest;
-
$blacklist = (array)$blacklist;
- $query = $wgRequest->getQueryValues();
+ $query = $this->getRequest()->getQueryValues();
foreach ( $blacklist as $name ) {
unset( $query[$name] );
}
@@ -1112,6 +1153,8 @@ abstract class TablePager extends IndexPager {
* An array mapping database field names to a textual description of the
* field name, for use in the table header. The description should be plain
* text, it will be HTML-escaped later.
+ *
+ * @return Array
*/
abstract function getFieldNames();
}
diff --git a/includes/PathRouter.php b/includes/PathRouter.php
new file mode 100644
index 00000000..3e298a58
--- /dev/null
+++ b/includes/PathRouter.php
@@ -0,0 +1,351 @@
+<?php
+/**
+ * PathRouter class.
+ * This class can take patterns such as /wiki/$1 and use them to
+ * parse query parameters out of REQUEST_URI paths.
+ *
+ * $router->add( "/wiki/$1" );
+ * - Matches /wiki/Foo style urls and extracts the title
+ * $router->add( array( 'edit' => "/edit/$1" ), array( 'action' => '$key' ) );
+ * - Matches /edit/Foo style urls and sets action=edit
+ * $router->add( '/$2/$1',
+ * array( 'variant' => '$2' ),
+ * array( '$2' => array( 'zh-hant', 'zh-hans' )
+ * );
+ * - Matches /zh-hant/Foo or /zh-hans/Foo
+ * $router->addStrict( "/foo/Bar", array( 'title' => 'Baz' ) );
+ * - Matches /foo/Bar explicitly and uses "Baz" as the title
+ * $router->add( '/help/$1', array( 'title' => 'Help:$1' ) );
+ * - Matches /help/Foo with "Help:Foo" as the title
+ * $router->add( '/$1', array( 'foo' => array( 'value' => 'bar$2' ) );
+ * - Matches /Foo and sets 'foo' to 'bar$2' without $2 being replaced
+ * $router->add( '/$1', array( 'data:foo' => 'bar' ), array( 'callback' => 'functionname' ) );
+ * - Matches /Foo, adds the key 'foo' with the value 'bar' to the data array
+ * and calls functionname( &$matches, $data );
+ *
+ * Path patterns:
+ * - Paths may contain $# patterns such as $1, $2, etc...
+ * - $1 will match 0 or more while the rest will match 1 or more
+ * - Unless you use addStrict "/wiki" and "/wiki/" will be expanded to "/wiki/$1"
+ *
+ * Params:
+ * - In a pattern $1, $2, etc... will be replaced with the relevant contents
+ * - If you used a keyed array as a path pattern, $key will be replaced with
+ * the relevant contents
+ * - The default behavior is equivalent to `array( 'title' => '$1' )`,
+ * if you don't want the title parameter you can explicitly use `array( 'title' => false )`
+ * - You can specify a value that won't have replacements in it
+ * using `'foo' => array( 'value' => 'bar' );`
+ *
+ * Options:
+ * - The option keys $1, $2, etc... can be specified to restrict the possible values
+ * of that variable. A string can be used for a single value, or an array for multiple.
+ * - When the option key 'strict' is set (Using addStrict is simpler than doing this directly)
+ * the path won't have $1 implicitly added to it.
+ * - The option key 'callback' can specify a callback that will be run when a path is matched.
+ * The callback will have the arguments ( &$matches, $data ) and the matches array can
+ * be modified.
+ *
+ * @since 1.19
+ * @author Daniel Friesen
+ */
+class PathRouter {
+
+ /**
+ * Protected helper to do the actual bulk work of adding a single pattern.
+ * This is in a separate method so that add() can handle the difference between
+ * a single string $path and an array() $path that contains multiple path
+ * patterns each with an associated $key to pass on.
+ */
+ protected function doAdd( $path, $params, $options, $key = null ) {
+ // Make sure all paths start with a /
+ if ( $path[0] !== '/' ) {
+ $path = '/' . $path;
+ }
+
+ if ( !isset( $options['strict'] ) || !$options['strict'] ) {
+ // Unless this is a strict path make sure that the path has a $1
+ if ( strpos( $path, '$1' ) === false ) {
+ if ( substr( $path, -1 ) !== '/' ) {
+ $path .= '/';
+ }
+ $path .= '$1';
+ }
+ }
+
+ // If 'title' is not specified and our path pattern contains a $1
+ // Add a default 'title' => '$1' rule to the parameters.
+ if ( !isset( $params['title'] ) && strpos( $path, '$1' ) !== false ) {
+ $params['title'] = '$1';
+ }
+ // If the user explicitly marked 'title' as false then omit it from the matches
+ if ( isset( $params['title'] ) && $params['title'] === false ) {
+ unset( $params['title'] );
+ }
+
+ // Loop over our parameters and convert basic key => string
+ // patterns into fully descriptive array form
+ foreach ( $params as $paramName => $paramData ) {
+ if ( is_string( $paramData ) ) {
+ if ( preg_match( '/\$(\d+|key)/u', $paramData ) ) {
+ $paramArrKey = 'pattern';
+ } else {
+ // If there's no replacement use a value instead
+ // of a pattern for a little more efficiency
+ $paramArrKey = 'value';
+ }
+ $params[$paramName] = array(
+ $paramArrKey => $paramData
+ );
+ }
+ }
+
+ // Loop over our options and convert any single value $# restrictions
+ // into an array so we only have to do in_array tests.
+ foreach ( $options as $optionName => $optionData ) {
+ if ( preg_match( '/^\$\d+$/u', $optionName ) ) {
+ if ( !is_array( $optionData ) ) {
+ $options[$optionName] = array( $optionData );
+ }
+ }
+ }
+
+ $pattern = (object)array(
+ 'path' => $path,
+ 'params' => $params,
+ 'options' => $options,
+ 'key' => $key,
+ );
+ $pattern->weight = self::makeWeight( $pattern );
+ $this->patterns[] = $pattern;
+ }
+
+ /**
+ * Add a new path pattern to the path router
+ *
+ * @param $path The path pattern to add
+ * @param $params The params for this path pattern
+ * @param $options The options for this path pattern
+ */
+ public function add( $path, $params = array(), $options = array() ) {
+ if ( is_array( $path ) ) {
+ foreach ( $path as $key => $onePath ) {
+ $this->doAdd( $onePath, $params, $options, $key );
+ }
+ } else {
+ $this->doAdd( $path, $params, $options );
+ }
+ }
+
+ /**
+ * Add a new path pattern to the path router with the strict option on
+ * @see self::add
+ */
+ public function addStrict( $path, $params = array(), $options = array() ) {
+ $options['strict'] = true;
+ $this->add( $path, $params, $options );
+ }
+
+ /**
+ * Protected helper to re-sort our patterns so that the most specific
+ * (most heavily weighted) patterns are at the start of the array.
+ */
+ protected function sortByWeight() {
+ $weights = array();
+ foreach( $this->patterns as $key => $pattern ) {
+ $weights[$key] = $pattern->weight;
+ }
+ array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
+ }
+
+ protected static function makeWeight( $pattern ) {
+ # Start with a weight of 0
+ $weight = 0;
+
+ // Explode the path to work with
+ $path = explode( '/', $pattern->path );
+
+ # For each level of the path
+ 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;
+ } elseif ( preg_match( '/\$(\d+|key)/u', $piece ) ) {
+ # For a piece that simply contains a $1 variable add 2 points of weight
+ $weight += 2;
+ } else {
+ # For a solid piece add a full 3 points of weight
+ $weight += 3;
+ }
+ }
+
+ foreach ( $pattern->options as $key => $option ) {
+ if ( preg_match( '/^\$\d+$/u', $key ) ) {
+ # Add 0.5 for restrictions to values
+ # This way given two separate "/$2/$1" patterns the
+ # one with a limited set of $2 values will dominate
+ # the one that'll match more loosely
+ $weight += 0.5;
+ }
+ }
+
+ return $weight;
+ }
+
+ /**
+ * Parse a path and return the query matches for the path
+ *
+ * @param $path The path to parse
+ * @return Array The array of matches for the path
+ */
+ public function parse( $path ) {
+ // Make sure our patterns are sorted by weight so the most specific
+ // matches are tested first
+ $this->sortByWeight();
+
+ $matches = null;
+
+ foreach ( $this->patterns as $pattern ) {
+ $matches = self::extractTitle( $path, $pattern );
+ if ( !is_null( $matches ) ) {
+ break;
+ }
+ }
+
+ // We know the difference between null (no matches) and
+ // array() (a match with no data) but our WebRequest caller
+ // expects array() even when we have no matches so return
+ // a array() when we have null
+ return is_null( $matches ) ? array() : $matches;
+ }
+
+ protected static function extractTitle( $path, $pattern ) {
+ // Convert the path pattern into a regexp we can match with
+ $regexp = preg_quote( $pattern->path, '#' );
+ // .* for the $1
+ $regexp = preg_replace( '#\\\\\$1#u', '(?P<par1>.*)', $regexp );
+ // .+ for the rest of the parameter numbers
+ $regexp = preg_replace( '#\\\\\$(\d+)#u', '(?P<par$1>.+?)', $regexp );
+ $regexp = "#^{$regexp}$#";
+
+ $matches = array();
+ $data = array();
+
+ // Try to match the path we were asked to parse with our regexp
+ if ( preg_match( $regexp, $path, $m ) ) {
+ // Ensure that any $# restriction we have set in our {$option}s
+ // matches properly here.
+ foreach ( $pattern->options as $key => $option ) {
+ if ( preg_match( '/^\$\d+$/u', $key ) ) {
+ $n = intval( substr( $key, 1 ) );
+ $value = rawurldecode( $m["par{$n}"] );
+ if ( !in_array( $value, $option ) ) {
+ // If any restriction does not match return null
+ // to signify that this rule did not match.
+ return null;
+ }
+ }
+ }
+
+ // Give our $data array a copy of every $# that was matched
+ foreach ( $m as $matchKey => $matchValue ) {
+ if ( preg_match( '/^par\d+$/u', $matchKey ) ) {
+ $n = intval( substr( $matchKey, 3 ) );
+ $data['$'.$n] = rawurldecode( $matchValue );
+ }
+ }
+ // If present give our $data array a $key as well
+ if ( isset( $pattern->key ) ) {
+ $data['$key'] = $pattern->key;
+ }
+
+ // Go through our parameters for this match and add data to our matches and data arrays
+ foreach ( $pattern->params as $paramName => $paramData ) {
+ $value = null;
+ // Differentiate data: from normal parameters and keep the correct
+ // array key around (ie: foo for data:foo)
+ if ( preg_match( '/^data:/u', $paramName ) ) {
+ $isData = true;
+ $key = substr( $paramName, 5 );
+ } else {
+ $isData = false;
+ $key = $paramName;
+ }
+
+ if ( isset( $paramData['value'] ) ) {
+ // For basic values just set the raw data as the value
+ $value = $paramData['value'];
+ } elseif ( isset( $paramData['pattern'] ) ) {
+ // For patterns we have to make value replacements on the string
+ $value = $paramData['pattern'];
+ $replacer = new PathRouterPatternReplacer;
+ $replacer->params = $m;
+ if ( isset( $pattern->key ) ) {
+ $replacer->key = $pattern->key;
+ }
+ $value = $replacer->replace( $value );
+ if ( $value === false ) {
+ // Pattern required data that wasn't available, abort
+ return null;
+ }
+ }
+
+ // Send things that start with data: to $data, the rest to $matches
+ if ( $isData ) {
+ $data[$key] = $value;
+ } else {
+ $matches[$key] = $value;
+ }
+ }
+
+ // If this match includes a callback, execute it
+ if ( isset( $pattern->options['callback'] ) ) {
+ call_user_func_array( $pattern->options['callback'], array( &$matches, $data ) );
+ }
+ } else {
+ // Our regexp didn't match, return null to signify no match.
+ return null;
+ }
+ // Fall through, everything went ok, return our matches array
+ return $matches;
+ }
+
+}
+
+class PathRouterPatternReplacer {
+
+ public $key, $params, $error;
+
+ /**
+ * Replace keys inside path router patterns with text.
+ * We do this inside of a replacement callback because after replacement we can't tell the
+ * difference between a $1 that was not replaced and a $1 that was part of
+ * the content a $1 was replaced with.
+ */
+ public function replace( $value ) {
+ $this->error = false;
+ $value = preg_replace_callback( '/\$(\d+|key)/u', array( $this, 'callback' ), $value );
+ if ( $this->error ) {
+ return false;
+ }
+ return $value;
+ }
+
+ protected function callback( $m ) {
+ if ( $m[1] == "key" ) {
+ if ( is_null( $this->key ) ) {
+ $this->error = true;
+ return '';
+ }
+ return $this->key;
+ } else {
+ $d = $m[1];
+ if ( !isset( $this->params["par$d"] ) ) {
+ $this->error = true;
+ return '';
+ }
+ return rawurldecode( $this->params["par$d"] );
+ }
+ }
+
+} \ No newline at end of file
diff --git a/includes/PatrolLog.php b/includes/PatrolLog.php
deleted file mode 100644
index 0df48a85..00000000
--- a/includes/PatrolLog.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-/**
- * Class containing static functions for working with
- * logs of patrol events
- *
- * @author Rob Church <robchur@gmail.com>
- */
-class PatrolLog {
-
- /**
- * Record a log event for a change being patrolled
- *
- * @param $rc Mixed: change identifier or RecentChange object
- * @param $auto Boolean: was this patrol event automatic?
- */
- public static function record( $rc, $auto = false ) {
- if( !( $rc instanceof RecentChange ) ) {
- $rc = RecentChange::newFromId( $rc );
- if( !is_object( $rc ) )
- return false;
- }
- $title = Title::makeTitleSafe( $rc->getAttribute( 'rc_namespace' ), $rc->getAttribute( 'rc_title' ) );
- if( is_object( $title ) ) {
- $params = self::buildParams( $rc, $auto );
- $log = new LogPage( 'patrol', false, $auto ? "skipUDP" : "UDP" ); # False suppresses RC entries
- $log->addEntry( 'patrol', $title, '', $params );
- return true;
- }
- return false;
- }
-
- /**
- * Generate the log action text corresponding to a patrol log item
- *
- * @param $title Title of the page that was patrolled
- * @param $params Array: log parameters (from logging.log_params)
- * @param $lang Language object to use, or false
- * @return String
- */
- public static function makeActionText( $title, $params, $lang ) {
- list( $cur, /* $prev */, $auto ) = $params;
- if( is_object( $lang ) ) {
- # Standard link to the page in question
- $link = Linker::link( $title );
- if( $title->exists() ) {
- # Generate a diff link
- $query = array(
- 'oldid' => $cur,
- 'diff' => 'prev'
- );
-
- $diff = Linker::link(
- $title,
- htmlspecialchars( wfMsg( 'patrol-log-diff', $lang->formatNum( $cur, true ) ) ),
- array(),
- $query,
- array( 'known', 'noclasses' )
- );
- } else {
- # Don't bother with a diff link, it's useless
- $diff = htmlspecialchars( wfMsg( 'patrol-log-diff', $cur ) );
- }
- # Indicate whether or not the patrolling was automatic
- $auto = $auto ? wfMsgHtml( 'patrol-log-auto' ) : '';
- # Put it all together
- return wfMsgHtml( 'patrol-log-line', $diff, $link, $auto );
- } else {
- $text = $title->getPrefixedText();
- return wfMsgForContent( 'patrol-log-line', wfMsgHtml('patrol-log-diff',$cur), "[[$text]]", '' );
- }
- }
-
- /**
- * Prepare log parameters for a patrolled change
- *
- * @param $change RecentChange to represent
- * @param $auto Boolean: whether the patrol event was automatic
- * @return Array
- */
- private static function buildParams( $change, $auto ) {
- return array(
- $change->getAttribute( 'rc_this_oldid' ),
- $change->getAttribute( 'rc_last_oldid' ),
- (int)$auto
- );
- }
-}
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
index 182520e1..83ae0abe 100644
--- a/includes/PoolCounter.php
+++ b/includes/PoolCounter.php
@@ -1,11 +1,11 @@
<?php
/**
- * 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
@@ -15,16 +15,16 @@
* 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 */
const DONE = 3; /* Another worker did the work for you */
-
+
const ERROR = -1; /* Indeterminate error */
const NOT_LOCKED = -2; /* Called release() with no lock held */
const QUEUE_FULL = -3; /* There are already maxqueue workers on this lock */
@@ -33,38 +33,38 @@ abstract class PoolCounter {
/**
* 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
+ * 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
+ * Lets another one grab the lock, and returns the workers
* waiting on acquireForAnyone()
- *
+ *
* @return Released/NotLocked/Error
*/
abstract function release();
-
+
/**
* $key: All workers with the same key share the lock.
- * $workers: It wouldn't be a good idea to have more than this number of
+ * $workers: 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,
+ * $maxqueue: If this number of workers are already working/waiting,
* fail instead of wait.
* $timeout: Maximum time in seconds to wait for the lock.
*/
protected $key, $workers, $maxqueue, $timeout;
-
+
/**
* Create a Pool counter. This should only be called from the PoolWorks.
*
@@ -80,10 +80,10 @@ abstract class PoolCounter {
}
$conf = $wgPoolCounterConf[$type];
$class = $conf['class'];
-
+
return new $class( $conf, $type, $key );
}
-
+
protected function __construct( $conf, $type, $key ) {
$this->key = $key;
$this->workers = $conf['workers'];
@@ -125,7 +125,7 @@ class PoolCounter_Stub extends PoolCounter {
*/
abstract class PoolCounterWork {
protected $cacheable = false; //Does this override getCachedWork() ?
-
+
/**
* Actually perform the work, caching it if needed.
*/
@@ -140,30 +140,34 @@ abstract class PoolCounterWork {
}
/**
- * A work not so good (eg. expired one) but better than an error
+ * A work not so good (eg. expired one) but better than an error
* message.
* @return mixed work result or false
*/
function fallback() {
return false;
}
-
+
/**
* Do something with the error, like showing it to the user.
*/
- function error( $status ) {
+ function error( $status ) {
return false;
}
/**
* Log an error
+ *
+ * @param $status Status
*/
function logError( $status ) {
wfDebugLog( 'poolcounter', $status->getWikiText() );
}
-
+
/**
* Get the result of the work (whatever it is), or false.
+ * @param $skipcache bool
+ * @return bool|mixed
*/
function execute( $skipcache = false ) {
if ( $this->cacheable && !$skipcache ) {
@@ -183,7 +187,7 @@ abstract class PoolCounterWork {
$result = $this->doWork();
$this->poolCounter->release();
return $result;
-
+
case PoolCounter::DONE:
$result = $this->getCachedWork();
if ( $result === false ) {
@@ -193,27 +197,27 @@ abstract class PoolCounterWork {
return $this->execute( true );
}
return $result;
-
+
case PoolCounter::QUEUE_FULL:
case PoolCounter::TIMEOUT:
$result = $this->fallback();
-
+
if ( $result !== false ) {
return $result;
}
/* no break */
-
+
/* These two cases should never be hit... */
case PoolCounter::ERROR:
default:
$errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' );
-
- $status = Status::newFatal( isset($errors[$status->value]) ? $errors[$status->value] : 'pool-errorunknown' );
+
+ $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 );
}
diff --git a/includes/Preferences.php b/includes/Preferences.php
index 91b3326b..ea1efa18 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -39,25 +39,26 @@ class Preferences {
/**
* @throws MWException
* @param $user User
+ * @param $context IContextSource
* @return array|null
*/
- static function getPreferences( $user ) {
+ static function getPreferences( $user, IContextSource $context ) {
if ( self::$defaultPreferences ) {
return self::$defaultPreferences;
}
$defaultPreferences = array();
- self::profilePreferences( $user, $defaultPreferences );
- self::skinPreferences( $user, $defaultPreferences );
- self::filesPreferences( $user, $defaultPreferences );
- self::datetimePreferences( $user, $defaultPreferences );
- self::renderingPreferences( $user, $defaultPreferences );
- self::editingPreferences( $user, $defaultPreferences );
- self::rcPreferences( $user, $defaultPreferences );
- self::watchlistPreferences( $user, $defaultPreferences );
- self::searchPreferences( $user, $defaultPreferences );
- self::miscPreferences( $user, $defaultPreferences );
+ self::profilePreferences( $user, $context, $defaultPreferences );
+ self::skinPreferences( $user, $context, $defaultPreferences );
+ self::filesPreferences( $user, $context, $defaultPreferences );
+ self::datetimePreferences( $user, $context, $defaultPreferences );
+ self::renderingPreferences( $user, $context, $defaultPreferences );
+ self::editingPreferences( $user, $context, $defaultPreferences );
+ self::rcPreferences( $user, $context, $defaultPreferences );
+ self::watchlistPreferences( $user, $context, $defaultPreferences );
+ self::searchPreferences( $user, $context, $defaultPreferences );
+ self::miscPreferences( $user, $context, $defaultPreferences );
wfRunHooks( 'GetPreferences', array( $user, &$defaultPreferences ) );
@@ -127,11 +128,16 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences
* @return void
*/
- static function profilePreferences( $user, &$defaultPreferences ) {
- global $wgLang, $wgUser;
+ static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
+ global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
+ $wgDisableTitleConversion, $wgDisableLangConversion, $wgMaxSigChars,
+ $wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
+ $wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress;
+
## User info #####################################
// Information panel
$defaultPreferences['username'] = array(
@@ -159,23 +165,22 @@ class Preferences {
$groupName = User::getGroupName( $ueg );
$userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
- $memberName = User::getGroupMember( $ueg );
+ $memberName = User::getGroupMember( $ueg, $user->getName() );
$userMembers[] = User::makeGroupLinkHTML( $ueg, $memberName );
}
asort( $userGroups );
asort( $userMembers );
+ $lang = $context->getLanguage();
+
$defaultPreferences['usergroups'] = array(
'type' => 'info',
- 'label' => wfMsgExt(
- 'prefs-memberingroups', 'parseinline',
- $wgLang->formatNum( count( $userGroups ) )
- ),
- 'default' => wfMsgExt(
- 'prefs-memberingroups-type', array(),
- $wgLang->commaList( $userGroups ),
- $wgLang->commaList( $userMembers )
- ),
+ 'label' => $context->msg( 'prefs-memberingroups' )->numParams(
+ count( $userGroups ) )->parse(),
+ 'default' => $context->msg( 'prefs-memberingroups-type',
+ $lang->commaList( $userGroups ),
+ $lang->commaList( $userMembers )
+ )->plain(),
'raw' => true,
'section' => 'personal/info',
);
@@ -183,26 +188,27 @@ class Preferences {
$defaultPreferences['editcount'] = array(
'type' => 'info',
'label-message' => 'prefs-edits',
- 'default' => $wgLang->formatNum( $user->getEditCount() ),
+ 'default' => $lang->formatNum( $user->getEditCount() ),
'section' => 'personal/info',
);
if ( $user->getRegistration() ) {
+ $displayUser = $context->getUser();
+ $userRegistration = $user->getRegistration();
$defaultPreferences['registrationdate'] = array(
'type' => 'info',
'label-message' => 'prefs-registration',
- 'default' => wfMsgExt(
- 'prefs-registration-date-time', 'parsemag',
- $wgLang->timeanddate( $user->getRegistration(), true ),
- $wgLang->date( $user->getRegistration(), true ),
- $wgLang->time( $user->getRegistration(), true )
- ),
+ 'default' => $context->msg(
+ 'prefs-registration-date-time',
+ $lang->userTimeAndDate( $userRegistration, $displayUser ),
+ $lang->userDate( $userRegistration, $displayUser ),
+ $lang->userTime( $userRegistration, $displayUser )
+ )->parse(),
'section' => 'personal/info',
);
}
// Actually changeable stuff
- global $wgAuth;
$defaultPreferences['realname'] = array(
'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
'default' => $user->getRealName(),
@@ -215,17 +221,17 @@ class Preferences {
'type' => 'select',
'section' => 'personal/info',
'options' => array(
- wfMsg( 'gender-male' ) => 'male',
- wfMsg( 'gender-female' ) => 'female',
- wfMsg( 'gender-unknown' ) => 'unknown',
+ $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() ) {
- $link = $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'ChangePassword' ),
- wfMsgHtml( 'prefs-resetpass' ), array(),
+ $link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
+ $context->msg( 'prefs-resetpass' )->escaped(), array(),
array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' ) ) );
$defaultPreferences['password'] = array(
@@ -236,21 +242,16 @@ class Preferences {
'section' => 'personal/info',
);
}
- global $wgCookieExpiration;
if ( $wgCookieExpiration > 0 ) {
$defaultPreferences['rememberpassword'] = array(
'type' => 'toggle',
- 'label' => wfMsgExt(
- 'tog-rememberpassword',
- array( 'parsemag' ),
- $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )
- ),
+ 'label' => $context->msg( 'tog-rememberpassword' )->numParams(
+ ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
'section' => 'personal/info',
);
}
// Language
- global $wgLanguageCode;
$languages = Language::getLanguageNames( false );
if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
$languages[$wgLanguageCode] = $wgLanguageCode;
@@ -269,20 +270,14 @@ class Preferences {
'label-message' => 'yourlanguage',
);
- global $wgContLang, $wgDisableLangConversion;
- global $wgDisableTitleConversion;
/* see if there are multiple language variants to choose from*/
$variantArray = array();
if ( !$wgDisableLangConversion ) {
$variants = $wgContLang->getVariants();
- $languages = Language::getLanguageNames( true );
foreach ( $variants as $v ) {
$v = str_replace( '_', '-', strtolower( $v ) );
- if ( array_key_exists( $v, $languages ) ) {
- // If it doesn't have a name, we'll pretend it doesn't exist
- $variantArray[$v] = $languages[$v];
- }
+ $variantArray[$v] = $wgContLang->getVariantname( $v, false );
}
$options = array();
@@ -297,24 +292,23 @@ class Preferences {
'type' => 'select',
'options' => $options,
'section' => 'personal/i18n',
+ 'help-message' => 'prefs-help-variant',
);
}
}
if ( count( $variantArray ) > 1 && !$wgDisableLangConversion && !$wgDisableTitleConversion ) {
$defaultPreferences['noconvertlink'] =
- array(
+ array(
'type' => 'toggle',
'section' => 'personal/i18n',
'label-message' => 'tog-noconvertlink',
);
}
- global $wgMaxSigChars, $wgOut, $wgParser;
-
// show a preview of the old signature first
- $oldsigWikiText = $wgParser->preSaveTransform( "~~~", new Title, $user, new ParserOptions );
- $oldsigHTML = $wgOut->parseInline( $oldsigWikiText );
+ $oldsigWikiText = $wgParser->preSaveTransform( "~~~", $context->getTitle(), $user, ParserOptions::newFromContext( $context ) );
+ $oldsigHTML = $context->getOutput()->parseInline( $oldsigWikiText, true, true );
$defaultPreferences['oldsig'] = array(
'type' => 'info',
'raw' => true,
@@ -339,11 +333,7 @@ class Preferences {
## Email stuff
- global $wgEnableEmail;
if ( $wgEnableEmail ) {
- global $wgEmailConfirmToEdit;
- global $wgEnableUserEmail;
-
$helpMessages[] = $wgEmailConfirmToEdit
? 'prefs-help-email-required'
: 'prefs-help-email' ;
@@ -353,17 +343,26 @@ class Preferences {
$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' ) ) );
+
+ $emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
+ if ( $wgAuth->allowPropChange( 'emailaddress' ) ) {
+ $emailAddress .= $emailAddress == '' ? $link : " ($link)";
+ }
+
$defaultPreferences['emailaddress'] = array(
- 'type' => $wgAuth->allowPropChange( 'emailaddress' ) ? 'email' : 'info',
- 'default' => $user->getEmail(),
- 'section' => 'personal/email',
+ 'type' => 'info',
+ 'raw' => true,
+ 'default' => $emailAddress,
'label-message' => 'youremail',
+ 'section' => 'personal/email',
'help-messages' => $helpMessages,
- 'validation-callback' => array( 'Preferences', 'validateEmail' ),
);
- global $wgEmailAuthentication;
-
$disableEmailPrefs = false;
if ( $wgEmailAuthentication ) {
@@ -372,29 +371,25 @@ class Preferences {
// date and time are separate parameters to facilitate localisation.
// $time is kept for backward compat reasons.
// 'emailauthenticated' is also used in SpecialConfirmemail.php
- $time = $wgLang->timeAndDate( $user->getEmailAuthenticationTimestamp(), true );
- $d = $wgLang->date( $user->getEmailAuthenticationTimestamp(), true );
- $t = $wgLang->time( $user->getEmailAuthenticationTimestamp(), true );
- $emailauthenticated = wfMsgExt(
- 'emailauthenticated', 'parseinline',
- array( $time, $d, $t )
- ) . '<br />';
+ $displayUser = $context->getUser();
+ $emailTimestamp = $user->getEmailAuthenticationTimestamp();
+ $time = $lang->userTimeAndDate( $emailTimestamp, $displayUser );
+ $d = $lang->userDate( $emailTimestamp, $displayUser );
+ $t = $lang->userTime( $emailTimestamp, $displayUser );
+ $emailauthenticated = $context->msg( 'emailauthenticated',
+ $time, $d, $t )->parse() . '<br />';
$disableEmailPrefs = false;
} else {
$disableEmailPrefs = true;
- $skin = $wgUser->getSkin();
- $emailauthenticated = wfMsgExt( 'emailnotauthenticated', 'parseinline' ) . '<br />' .
- $skin->link(
+ $emailauthenticated = $context->msg( 'emailnotauthenticated' )->parse() . '<br />' .
+ Linker::linkKnown(
SpecialPage::getTitleFor( 'Confirmemail' ),
- wfMsg( 'emailconfirmlink' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ $context->msg( 'emailconfirmlink' )->escaped()
) . '<br />';
}
} else {
$disableEmailPrefs = true;
- $emailauthenticated = wfMsgHtml( 'noemailprefs' );
+ $emailauthenticated = $context->msg( 'noemailprefs' )->escaped();
}
$defaultPreferences['emailauthentication'] = array(
@@ -423,7 +418,6 @@ class Preferences {
);
}
- global $wgEnotifWatchlist;
if ( $wgEnotifWatchlist ) {
$defaultPreferences['enotifwatchlistpages'] = array(
'type' => 'toggle',
@@ -432,7 +426,6 @@ class Preferences {
'disabled' => $disableEmailPrefs,
);
}
- global $wgEnotifUserTalk;
if ( $wgEnotifUserTalk ) {
$defaultPreferences['enotifusertalkpages'] = array(
'type' => 'toggle',
@@ -449,7 +442,6 @@ class Preferences {
'disabled' => $disableEmailPrefs,
);
- global $wgEnotifRevealEditorAddress;
if ( $wgEnotifRevealEditorAddress ) {
$defaultPreferences['enotifrevealaddr'] = array(
'type' => 'toggle',
@@ -464,16 +456,17 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences
* @return void
*/
- static function skinPreferences( $user, &$defaultPreferences ) {
+ static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) {
## Skin #####################################
- global $wgLang, $wgAllowUserCss, $wgAllowUserJs;
+ global $wgAllowUserCss, $wgAllowUserJs;
$defaultPreferences['skin'] = array(
'type' => 'radio',
- 'options' => self::generateSkinOptions( $user ),
+ 'options' => self::generateSkinOptions( $user, $context ),
'label' => '&#160;',
'section' => 'rendering/skin',
);
@@ -482,23 +475,22 @@ class Preferences {
# This code is basically copied from generateSkinOptions(). It'd
# be nice to somehow merge this back in there to avoid redundancy.
if ( $wgAllowUserCss || $wgAllowUserJs ) {
- $sk = $user->getSkin();
$linkTools = array();
if ( $wgAllowUserCss ) {
$cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/common.css' );
- $linkTools[] = $sk->link( $cssPage, wfMsgHtml( 'prefs-custom-css' ) );
+ $linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
}
if ( $wgAllowUserJs ) {
$jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/common.js' );
- $linkTools[] = $sk->link( $jsPage, wfMsgHtml( 'prefs-custom-js' ) );
+ $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
}
$defaultPreferences['commoncssjs'] = array(
'type' => 'info',
'raw' => true,
- 'default' => $wgLang->pipeList( $linkTools ),
+ 'default' => $context->getLanguage()->pipeList( $linkTools ),
'label-message' => 'prefs-common-css-js',
'section' => 'rendering/skin',
);
@@ -506,7 +498,7 @@ class Preferences {
$selectedSkin = $user->getOption( 'skin' );
if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
- $settings = array_flip( $wgLang->getQuickbarSettings() );
+ $settings = array_flip( $context->getLanguage()->getQuickbarSettings() );
$defaultPreferences['quickbar'] = array(
'type' => 'radio',
@@ -519,19 +511,20 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences Array
*/
- static function filesPreferences( $user, &$defaultPreferences ) {
+ static function filesPreferences( $user, IContextSource $context, &$defaultPreferences ) {
## Files #####################################
$defaultPreferences['imagesize'] = array(
'type' => 'select',
- 'options' => self::getImageSizes(),
+ 'options' => self::getImageSizes( $context ),
'label-message' => 'imagemaxsize',
'section' => 'rendering/files',
);
$defaultPreferences['thumbsize'] = array(
'type' => 'select',
- 'options' => self::getThumbSizes(),
+ 'options' => self::getThumbSizes( $context ),
'label-message' => 'thumbsize',
'section' => 'rendering/files',
);
@@ -539,14 +532,13 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences
* @return void
*/
- static function datetimePreferences( $user, &$defaultPreferences ) {
- global $wgLang;
-
+ static function datetimePreferences( $user, IContextSource $context, &$defaultPreferences ) {
## Date and time #####################################
- $dateOptions = self::getDateOptions();
+ $dateOptions = self::getDateOptions( $context );
if ( $dateOptions ) {
$defaultPreferences['date'] = array(
'type' => 'radio',
@@ -558,9 +550,10 @@ class Preferences {
// Info
$now = wfTimestampNow();
+ $lang = $context->getLanguage();
$nowlocal = Xml::element( 'span', array( 'id' => 'wpLocalTime' ),
- $wgLang->time( $now, true ) );
- $nowserver = $wgLang->time( $now, false ) .
+ $lang->time( $now, true ) );
+ $nowserver = $lang->time( $now, false ) .
Html::hidden( 'wpServerTime', (int)substr( $now, 8, 2 ) * 60 + (int)substr( $now, 10, 2 ) );
$defaultPreferences['nowserver'] = array(
@@ -581,18 +574,29 @@ class Preferences {
// Grab existing pref.
$tzOffset = $user->getOption( 'timecorrection' );
- $tz = explode( '|', $tzOffset, 2 );
+ $tz = explode( '|', $tzOffset, 3 );
+
+ $tzOptions = self::getTimezoneOptions( $context );
$tzSetting = $tzOffset;
if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
$minDiff = $tz[1];
$tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
+ } elseif ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
+ !in_array( $tzOffset, HTMLFormField::flattenOptions( $tzOptions ) ) )
+ {
+ # Timezone offset can vary with DST
+ $userTZ = timezone_open( $tz[2] );
+ if ( $userTZ !== false ) {
+ $minDiff = floor( timezone_offset_get( $userTZ, date_create( 'now' ) ) / 60 );
+ $tzSetting = "ZoneInfo|$minDiff|{$tz[2]}";
+ }
}
$defaultPreferences['timecorrection'] = array(
'class' => 'HTMLSelectOrOtherField',
'label-message' => 'timezonelegend',
- 'options' => self::getTimezoneOptions(),
+ 'options' => $tzOptions,
'default' => $tzSetting,
'size' => 20,
'section' => 'datetime/timeoffset',
@@ -601,18 +605,19 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences Array
*/
- static function renderingPreferences( $user, &$defaultPreferences ) {
+ static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
## Page Rendering ##############################
global $wgAllowUserCssPrefs;
if ( $wgAllowUserCssPrefs ) {
$defaultPreferences['underline'] = array(
'type' => 'select',
'options' => array(
- wfMsg( 'underline-never' ) => 0,
- wfMsg( 'underline-always' ) => 1,
- wfMsg( 'underline-default' ) => 2,
+ $context->msg( 'underline-never' )->text() => 0,
+ $context->msg( 'underline-always' )->text() => 1,
+ $context->msg( 'underline-default' )->text() => 2,
),
'label-message' => 'tog-underline',
'section' => 'rendering/advancedrendering',
@@ -620,9 +625,9 @@ class Preferences {
}
$stubThresholdValues = array( 50, 100, 500, 1000, 2000, 5000, 10000 );
- $stubThresholdOptions = array( wfMsg( 'stub-threshold-disabled' ) => 0 );
+ $stubThresholdOptions = array( $context->msg( 'stub-threshold-disabled' )->text() => 0 );
foreach ( $stubThresholdValues as $value ) {
- $stubThresholdOptions[wfMsg( 'size-bytes', $value )] = $value;
+ $stubThresholdOptions[$context->msg( 'size-bytes', $value )->text()] = $value;
}
$defaultPreferences['stubthreshold'] = array(
@@ -630,14 +635,14 @@ class Preferences {
'section' => 'rendering/advancedrendering',
'options' => $stubThresholdOptions,
'size' => 20,
- 'label' => wfMsg( 'stub-threshold' ), // Raw HTML message. Yay?
+ 'label' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
);
if ( $wgAllowUserCssPrefs ) {
$defaultPreferences['highlightbroken'] = array(
'type' => 'toggle',
'section' => 'rendering/advancedrendering',
- 'label' => wfMsg( 'tog-highlightbroken' ), // Raw HTML
+ 'label' => $context->msg( 'tog-highlightbroken' )->text(), // Raw HTML
);
$defaultPreferences['showtoc'] = array(
'type' => 'toggle',
@@ -678,9 +683,10 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences Array
*/
- static function editingPreferences( $user, &$defaultPreferences ) {
+ static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
global $wgUseExternalEditor, $wgAllowUserCssPrefs;
## Editing #####################################
@@ -705,10 +711,10 @@ class Preferences {
'section' => 'editing/advancedediting',
'label-message' => 'editfont-style',
'options' => array(
- wfMsg( 'editfont-default' ) => 'default',
- wfMsg( 'editfont-monospace' ) => 'monospace',
- wfMsg( 'editfont-sansserif' ) => 'sans-serif',
- wfMsg( 'editfont-serif' ) => 'serif',
+ $context->msg( 'editfont-default' )->text() => 'default',
+ $context->msg( 'editfont-monospace' )->text() => 'monospace',
+ $context->msg( 'editfont-sansserif' )->text() => 'sans-serif',
+ $context->msg( 'editfont-serif' )->text() => 'serif',
)
);
}
@@ -783,10 +789,11 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences Array
*/
- static function rcPreferences( $user, &$defaultPreferences ) {
- global $wgRCMaxAge, $wgLang;
+ static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+ global $wgRCMaxAge, $wgRCShowWatchingUsers;
## RecentChanges #####################################
$defaultPreferences['rcdays'] = array(
@@ -795,11 +802,8 @@ class Preferences {
'section' => 'rc/displayrc',
'min' => 1,
'max' => ceil( $wgRCMaxAge / ( 3600 * 24 ) ),
- 'help' => wfMsgExt(
- 'recentchangesdays-max',
- array( 'parsemag' ),
- $wgLang->formatNum( ceil( $wgRCMaxAge / ( 3600 * 24 ) ) )
- )
+ 'help' => $context->msg( 'recentchangesdays-max' )->numParams(
+ ceil( $wgRCMaxAge / ( 3600 * 24 ) ) )->text()
);
$defaultPreferences['rclimit'] = array(
'type' => 'int',
@@ -831,7 +835,6 @@ class Preferences {
);
}
- global $wgRCShowWatchingUsers;
if ( $wgRCShowWatchingUsers ) {
$defaultPreferences['shownumberswatching'] = array(
'type' => 'toggle',
@@ -843,18 +846,22 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences
*/
- static function watchlistPreferences( $user, &$defaultPreferences ) {
- global $wgUseRCPatrol, $wgEnableAPI;
+ static function watchlistPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+ global $wgUseRCPatrol, $wgEnableAPI, $wgRCMaxAge;
+ $watchlistdaysMax = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
+
## Watchlist #####################################
$defaultPreferences['watchlistdays'] = array(
'type' => 'float',
'min' => 0,
- 'max' => 7,
+ 'max' => $watchlistdaysMax,
'section' => 'watchlist/displaywatchlist',
- 'help' => wfMsgHtml( 'prefs-watchlist-days-max' ),
+ 'help' => $context->msg( 'prefs-watchlist-days-max' )->numParams(
+ $watchlistdaysMax )->text(),
'label-message' => 'prefs-watchlist-days',
);
$defaultPreferences['wllimit'] = array(
@@ -862,7 +869,7 @@ class Preferences {
'min' => 0,
'max' => 1000,
'label-message' => 'prefs-watchlist-edits',
- 'help' => wfMsgHtml( 'prefs-watchlist-edits-max' ),
+ 'help' => $context->msg( 'prefs-watchlist-edits-max' )->escaped(),
'section' => 'watchlist/displaywatchlist',
);
$defaultPreferences['extendwatchlist'] = array(
@@ -912,7 +919,7 @@ class Preferences {
'type' => 'text',
'section' => 'watchlist/advancedwatchlist',
'label-message' => 'prefs-watchlist-token',
- 'help' => wfMsgHtml( 'prefs-help-watchlist-token', $hash )
+ 'help' => $context->msg( 'prefs-help-watchlist-token', $hash )->escaped()
);
}
@@ -940,10 +947,11 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences Array
*/
- static function searchPreferences( $user, &$defaultPreferences ) {
- global $wgContLang;
+ static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+ global $wgContLang, $wgEnableMWSuggest, $wgVectorUseSimpleSearch;
## Search #####################################
$defaultPreferences['searchlimit'] = array(
@@ -953,7 +961,6 @@ class Preferences {
'min' => 0,
);
- global $wgEnableMWSuggest;
if ( $wgEnableMWSuggest ) {
$defaultPreferences['disablesuggest'] = array(
'type' => 'toggle',
@@ -962,7 +969,6 @@ class Preferences {
);
}
- global $wgVectorUseSimpleSearch;
if ( $wgVectorUseSimpleSearch ) {
$defaultPreferences['vector-simplesearch'] = array(
'type' => 'toggle',
@@ -987,7 +993,7 @@ class Preferences {
$displayNs = str_replace( '_', ' ', $name );
if ( !$displayNs ) {
- $displayNs = wfMsg( 'blanknamespace' );
+ $displayNs = $context->msg( 'blanknamespace' )->text();
}
$displayNs = htmlspecialchars( $displayNs );
@@ -1005,9 +1011,12 @@ class Preferences {
/**
* @param $user User
+ * @param $context IContextSource
* @param $defaultPreferences Array
*/
- static function miscPreferences( $user, &$defaultPreferences ) {
+ static function miscPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+ global $wgContLang;
+
## Misc #####################################
$defaultPreferences['diffonly'] = array(
'type' => 'toggle',
@@ -1021,8 +1030,6 @@ class Preferences {
);
// Stuff from Language::getExtraUserToggles()
- global $wgContLang;
-
$toggles = $wgContLang->getExtraUserToggles();
foreach ( $toggles as $toggle ) {
@@ -1036,14 +1043,15 @@ class Preferences {
/**
* @param $user User The User object
+ * @param $context IContextSource
* @return Array: text/links to display as key; $skinkey as value
*/
- static function generateSkinOptions( $user ) {
- global $wgDefaultSkin, $wgLang, $wgAllowUserCss, $wgAllowUserJs;
+ static function generateSkinOptions( $user, IContextSource $context ) {
+ global $wgDefaultSkin, $wgAllowUserCss, $wgAllowUserJs;
$ret = array();
$mptitle = Title::newMainPage();
- $previewtext = wfMsgHtml( 'skin-preview' );
+ $previewtext = $context->msg( 'skin-preview' )->text();
# Only show members of Skin::getSkinNames() rather than
# $skinNames (skins is all skin names from Language.php)
@@ -1052,20 +1060,19 @@ class Preferences {
# Sort by UI skin name. First though need to update validSkinNames as sometimes
# the skinkey & UI skinname differ (e.g. "standard" skinkey is "Classic" in the UI).
foreach ( $validSkinNames as $skinkey => &$skinname ) {
- $msg = wfMessage( "skinname-{$skinkey}" );
+ $msg = $context->msg( "skinname-{$skinkey}" );
if ( $msg->exists() ) {
$skinname = htmlspecialchars( $msg->text() );
}
}
asort( $validSkinNames );
- $sk = $user->getSkin();
foreach ( $validSkinNames as $skinkey => $sn ) {
$linkTools = array();
# Mark the default skin
if ( $skinkey == $wgDefaultSkin ) {
- $linkTools[] = wfMsgHtml( 'default' );
+ $linkTools[] = $context->msg( 'default' )->escaped();
}
# Create preview link
@@ -1075,15 +1082,15 @@ class Preferences {
# Create links to user CSS/JS pages
if ( $wgAllowUserCss ) {
$cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.css' );
- $linkTools[] = $sk->link( $cssPage, wfMsgHtml( 'prefs-custom-css' ) );
+ $linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
}
if ( $wgAllowUserJs ) {
$jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/' . $skinkey . '.js' );
- $linkTools[] = $sk->link( $jsPage, wfMsgHtml( 'prefs-custom-js' ) );
+ $linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
}
- $display = $sn . ' ' . wfMsg( 'parentheses', $wgLang->pipeList( $linkTools ) );
+ $display = $sn . ' ' . $context->msg( 'parentheses', $context->getLanguage()->pipeList( $linkTools ) )->text();
$ret[$display] = $skinkey;
}
@@ -1091,11 +1098,12 @@ class Preferences {
}
/**
+ * @param $context IContextSource
* @return array
*/
- static function getDateOptions() {
- global $wgLang;
- $dateopts = $wgLang->getDatePreferences();
+ static function getDateOptions( IContextSource $context ) {
+ $lang = $context->getLanguage();
+ $dateopts = $lang->getDatePreferences();
$ret = array();
@@ -1114,9 +1122,9 @@ class Preferences {
$epoch = wfTimestampNow();
foreach ( $dateopts as $key ) {
if ( $key == 'default' ) {
- $formatted = wfMsgHtml( 'datedefault' );
+ $formatted = $context->msg( 'datedefault' )->escaped();
} else {
- $formatted = htmlspecialchars( $wgLang->timeanddate( $epoch, false, $key ) );
+ $formatted = htmlspecialchars( $lang->timeanddate( $epoch, false, $key ) );
}
$ret[$formatted] = $key;
}
@@ -1125,15 +1133,17 @@ class Preferences {
}
/**
+ * @param $context IContextSource
* @return array
*/
- static function getImageSizes() {
+ static function getImageSizes( IContextSource $context ) {
global $wgImageLimits;
$ret = array();
+ $pixels = $context->msg( 'unit-pixel' )->text();
foreach ( $wgImageLimits as $index => $limits ) {
- $display = "{$limits[0]}×{$limits[1]}" . wfMsg( 'unit-pixel' );
+ $display = "{$limits[0]}×{$limits[1]}" . $pixels;
$ret[$display] = $index;
}
@@ -1141,15 +1151,17 @@ class Preferences {
}
/**
+ * @param $context IContextSource
* @return array
*/
- static function getThumbSizes() {
+ static function getThumbSizes( IContextSource $context ) {
global $wgThumbLimits;
$ret = array();
+ $pixels = $context->msg( 'unit-pixel' )->text();
foreach ( $wgThumbLimits as $index => $size ) {
- $display = $size . wfMsg( 'unit-pixel' );
+ $display = $size . $pixels;
$ret[$display] = $index;
}
@@ -1157,22 +1169,20 @@ class Preferences {
}
/**
- * @param $signature
- * @param $alldata
+ * @param $signature string
+ * @param $alldata array
+ * @param $form HTMLForm
* @return bool|string
*/
- static function validateSignature( $signature, $alldata ) {
- global $wgParser, $wgMaxSigChars, $wgLang;
+ static function validateSignature( $signature, $alldata, $form ) {
+ global $wgParser, $wgMaxSigChars;
if ( mb_strlen( $signature ) > $wgMaxSigChars ) {
return Xml::element( 'span', array( 'class' => 'error' ),
- wfMsgExt( 'badsiglength', 'parsemag',
- $wgLang->formatNum( $wgMaxSigChars )
- )
- );
+ $form->msg( 'badsiglength' )->numParams( $wgMaxSigChars )->text() );
} elseif ( isset( $alldata['fancysig'] ) &&
$alldata['fancysig'] &&
false === $wgParser->validateSig( $signature ) ) {
- return Xml::element( 'span', array( 'class' => 'error' ), wfMsg( 'badsig' ) );
+ return Xml::element( 'span', array( 'class' => 'error' ), $form->msg( 'badsig' )->text() );
} else {
return true;
}
@@ -1181,51 +1191,45 @@ class Preferences {
/**
* @param $signature string
* @param $alldata array
+ * @param $form HTMLForm
* @return string
*/
- static function cleanSignature( $signature, $alldata ) {
- global $wgParser;
+ static function cleanSignature( $signature, $alldata, $form ) {
if ( isset( $alldata['fancysig'] ) && $alldata['fancysig'] ) {
+ global $wgParser;
$signature = $wgParser->cleanSig( $signature );
} else {
// When no fancy sig used, make sure ~{3,5} get removed.
- $signature = $wgParser->cleanSigInSig( $signature );
+ $signature = Parser::cleanSigInSig( $signature );
}
return $signature;
}
/**
- * @param $email
- * @param $alldata
- * @return bool|String
- */
- static function validateEmail( $email, $alldata ) {
- if ( $email && !Sanitizer::validateEmail( $email ) ) {
- return wfMsgExt( 'invalidemailaddress', 'parseinline' );
- }
-
- global $wgEmailConfirmToEdit;
- if ( $wgEmailConfirmToEdit && !$email ) {
- return wfMsgExt( 'noemailtitle', 'parseinline' );
- }
- return true;
- }
-
- /**
* @param $user User
+ * @param $context IContextSource
* @param $formClass string
+ * @param $remove Array: array of items to remove
* @return HtmlForm
*/
- static function getFormObject( $user, $formClass = 'PreferencesForm' ) {
- $formDescriptor = Preferences::getPreferences( $user );
- $htmlForm = new $formClass( $formDescriptor, 'prefs' );
+ static function getFormObject( $user, IContextSource $context, $formClass = 'PreferencesForm', array $remove = array() ) {
+ $formDescriptor = Preferences::getPreferences( $user, $context );
+ if ( count( $remove ) ) {
+ $removeKeys = array_flip( $remove );
+ $formDescriptor = array_diff_key( $formDescriptor, $removeKeys );
+ }
+
+ /**
+ * @var $htmlForm PreferencesForm
+ */
+ $htmlForm = new $formClass( $formDescriptor, $context, 'prefs' );
+ $htmlForm->setModifiedUser( $user );
$htmlForm->setId( 'mw-prefs-form' );
- $htmlForm->setSubmitText( wfMsg( 'saveprefs' ) );
+ $htmlForm->setSubmitText( $context->msg( 'saveprefs' )->text() );
# Used message keys: 'accesskey-preferences-save', 'tooltip-preferences-save'
$htmlForm->setSubmitTooltip( 'preferences-save' );
- $htmlForm->setTitle( SpecialPage::getTitleFor( 'Preferences' ) );
$htmlForm->setSubmitID( 'prefsubmit' );
$htmlForm->setSubmitCallback( array( 'Preferences', 'tryFormSubmit' ) );
@@ -1235,20 +1239,20 @@ class Preferences {
/**
* @return array
*/
- static function getTimezoneOptions() {
+ 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 = wfMsg( 'timezoneuseserverdefault', $wgLocaltimezone );
+ $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $wgLocaltimezone )->text();
} else {
- $tzstring = sprintf( '%+03d:%02d', floor( $wgLocalTZoffset / 60 ), abs( $wgLocalTZoffset ) % 60 );
- $server_tz_msg = wfMsg( 'timezoneuseserverdefault', $tzstring );
+ $tzstring = sprintf( '%+03d:%02d', floor( $wgLocalTZoffset / 60 ), abs( $wgLocalTZoffset ) % 60 );
+ $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $tzstring )->text();
}
$opt[$server_tz_msg] = "System|$wgLocalTZoffset";
- $opt[wfMsg( 'timezoneuseoffset' )] = 'other';
- $opt[wfMsg( 'guesstimezone' )] = 'guess';
+ $opt[$context->msg( 'timezoneuseoffset' )->text()] = 'other';
+ $opt[$context->msg( 'guesstimezone' )->text()] = 'guess';
if ( function_exists( 'timezone_identifiers_list' ) ) {
# Read timezone list
@@ -1256,16 +1260,16 @@ class Preferences {
sort( $tzs );
$tzRegions = array();
- $tzRegions['Africa'] = wfMsg( 'timezoneregion-africa' );
- $tzRegions['America'] = wfMsg( 'timezoneregion-america' );
- $tzRegions['Antarctica'] = wfMsg( 'timezoneregion-antarctica' );
- $tzRegions['Arctic'] = wfMsg( 'timezoneregion-arctic' );
- $tzRegions['Asia'] = wfMsg( 'timezoneregion-asia' );
- $tzRegions['Atlantic'] = wfMsg( 'timezoneregion-atlantic' );
- $tzRegions['Australia'] = wfMsg( 'timezoneregion-australia' );
- $tzRegions['Europe'] = wfMsg( 'timezoneregion-europe' );
- $tzRegions['Indian'] = wfMsg( 'timezoneregion-indian' );
- $tzRegions['Pacific'] = wfMsg( 'timezoneregion-pacific' );
+ $tzRegions['Africa'] = $context->msg( 'timezoneregion-africa' )->text();
+ $tzRegions['America'] = $context->msg( 'timezoneregion-america' )->text();
+ $tzRegions['Antarctica'] = $context->msg( 'timezoneregion-antarctica' )->text();
+ $tzRegions['Arctic'] = $context->msg( 'timezoneregion-arctic' )->text();
+ $tzRegions['Asia'] = $context->msg( 'timezoneregion-asia' )->text();
+ $tzRegions['Atlantic'] = $context->msg( 'timezoneregion-atlantic' )->text();
+ $tzRegions['Australia'] = $context->msg( 'timezoneregion-australia' )->text();
+ $tzRegions['Europe'] = $context->msg( 'timezoneregion-europe' )->text();
+ $tzRegions['Indian'] = $context->msg( 'timezoneregion-indian' )->text();
+ $tzRegions['Pacific'] = $context->msg( 'timezoneregion-pacific' )->text();
asort( $tzRegions );
$prefill = array_fill_keys( array_values( $tzRegions ), array() );
@@ -1338,12 +1342,14 @@ class Preferences {
/**
* @param $formData
+ * @param $form PreferencesForm
* @param $entryPoint string
* @return bool|Status|string
*/
- static function tryFormSubmit( $formData, $entryPoint = 'internal' ) {
- global $wgUser, $wgEmailAuthentication, $wgEnableEmail;
+ static function tryFormSubmit( $formData, $form, $entryPoint = 'internal' ) {
+ global $wgHiddenPrefs;
+ $user = $form->getModifiedUser();
$result = true;
// Filter input
@@ -1360,39 +1366,10 @@ class Preferences {
'emailaddress',
);
- if ( $wgEnableEmail ) {
- $newaddr = $formData['emailaddress'];
- $oldaddr = $wgUser->getEmail();
- if ( ( $newaddr != '' ) && ( $newaddr != $oldaddr ) ) {
- # the user has supplied a new email address on the login page
- # new behaviour: set this new emailaddr from login-page into user database record
- $wgUser->setEmail( $newaddr );
- # but flag as "dirty" = unauthenticated
- $wgUser->invalidateEmail();
- if ( $wgEmailAuthentication ) {
- # Mail a temporary password to the dirty address.
- # User can come back through the confirmation URL to re-enable email.
- $type = $oldaddr != '' ? 'changed' : 'set';
- $result = $wgUser->sendConfirmationMail( $type );
- if ( !$result->isGood() ) {
- return htmlspecialchars( $result->getWikiText( 'mailerror' ) );
- } elseif ( $entryPoint == 'ui' ) {
- $result = 'eauth';
- }
- }
- } else {
- $wgUser->setEmail( $newaddr );
- }
- if ( $oldaddr != $newaddr ) {
- wfRunHooks( 'PrefsEmailAudit', array( $wgUser, $oldaddr, $newaddr ) );
- }
- }
-
// Fortunately, the realname field is MUCH simpler
- global $wgHiddenPrefs;
if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
$realName = $formData['realname'];
- $wgUser->setRealName( $realName );
+ $user->setRealName( $realName );
}
foreach ( $saveBlacklist as $b ) {
@@ -1406,52 +1383,94 @@ class Preferences {
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] = $wgUser->getOption( $pref, null, true );
+ $formData[$pref] = $user->getOption( $pref, null, true );
}
// Keeps old preferences from interfering due to back-compat
// code, etc.
- $wgUser->resetOptions();
+ $user->resetOptions();
foreach ( $formData as $key => $value ) {
- $wgUser->setOption( $key, $value );
+ $user->setOption( $key, $value );
}
- $wgUser->saveSettings();
+ $user->saveSettings();
return $result;
}
/**
* @param $formData
+ * @param $form PreferencesForm
* @return Status
*/
- public static function tryUISubmit( $formData ) {
- $res = self::tryFormSubmit( $formData, 'ui' );
+ public static function tryUISubmit( $formData, $form ) {
+ $res = self::tryFormSubmit( $formData, $form, 'ui' );
if ( $res ) {
- $urlOptions = array( 'success' );
+ $urlOptions = array( 'success' => 1 );
if ( $res === 'eauth' ) {
- $urlOptions[] = 'eauth';
+ $urlOptions['eauth'] = 1;
}
- $queryString = implode( '&', $urlOptions );
+ $urlOptions += $form->getExtraSuccessRedirectParameters();
- $url = SpecialPage::getTitleFor( 'Preferences' )->getFullURL( $queryString );
+ $url = $form->getTitle()->getFullURL( $urlOptions );
- global $wgOut;
- $wgOut->redirect( $url );
+ $form->getContext()->getOutput()->redirect( $url );
}
return Status::newGood();
}
/**
+ * Try to set a user's email address.
+ * This does *not* try to validate the address.
+ * Caller is responsible for checking $wgAuth.
+ * @param $user User
+ * @param $newaddr string New email address
+ * @return Array (true on success or Status on failure, info string)
+ */
+ public static function trySetUserEmail( User $user, $newaddr ) {
+ global $wgEnableEmail, $wgEmailAuthentication;
+ $info = ''; // none
+
+ if ( $wgEnableEmail ) {
+ $oldaddr = $user->getEmail();
+ if ( ( $newaddr != '' ) && ( $newaddr != $oldaddr ) ) {
+ # The user has supplied a new email address on the login page
+ # new behaviour: set this new emailaddr from login-page into user database record
+ $user->setEmail( $newaddr );
+ if ( $wgEmailAuthentication ) {
+ # Mail a temporary password to the dirty address.
+ # User can come back through the confirmation URL to re-enable email.
+ $type = $oldaddr != '' ? 'changed' : 'set';
+ $result = $user->sendConfirmationMail( $type );
+ if ( !$result->isGood() ) {
+ return array( $result, 'mailerror' );
+ }
+ $info = 'eauth';
+ }
+ } elseif ( $newaddr != $oldaddr ) { // if the address is the same, don't change it
+ $user->setEmail( $newaddr );
+ }
+ if ( $oldaddr != $newaddr ) {
+ wfRunHooks( 'PrefsEmailAudit', array( $user, $oldaddr, $newaddr ) );
+ }
+ }
+
+ return array( true, $info );
+ }
+
+ /**
+ * @deprecated in 1.19; will be removed in 1.20.
* @param $user User
* @return array
*/
public static function loadOldSearchNs( $user ) {
+ wfDeprecated( __METHOD__, '1.19' );
+
$searchableNamespaces = SearchEngine::searchableNamespaces();
// Back compat with old format
$arr = array();
@@ -1468,6 +1487,38 @@ class Preferences {
/** Some tweaks to allow js prefs to work */
class PreferencesForm extends HTMLForm {
+ // Override default value from HTMLForm
+ protected $mSubSectionBeforeFields = false;
+
+ private $modifiedUser;
+
+ /**
+ * @param $user User
+ */
+ public function setModifiedUser( $user ) {
+ $this->modifiedUser = $user;
+ }
+
+ /**
+ * @return User
+ */
+ public function getModifiedUser() {
+ if ( $this->modifiedUser === null ) {
+ return $this->getUser();
+ } else {
+ return $this->modifiedUser;
+ }
+ }
+
+ /**
+ * Get extra parameters for the query string when redirecting after
+ * successful save.
+ *
+ * @return array()
+ */
+ public function getExtraSuccessRedirectParameters() {
+ return array();
+ }
/**
* @param $html string
@@ -1485,12 +1536,9 @@ class PreferencesForm extends HTMLForm {
function getButtons() {
$html = parent::getButtons();
- global $wgUser;
-
- $sk = $wgUser->getSkin();
$t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
- $html .= "\n" . $sk->link( $t, wfMsgHtml( 'restoreprefs' ) );
+ $html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
$html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
@@ -1520,10 +1568,24 @@ class PreferencesForm extends HTMLForm {
return $data;
}
+
/**
* Get the whole body of the form.
+ * @return string
*/
function getBody() {
return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
}
+
+ /**
+ * Get the <legend> for a given section key. Normally this is the
+ * prefs-$key message but we'll allow extensions to override it.
+ * @param $key string
+ * @return string
+ */
+ function getLegend( $key ) {
+ $legend = parent::getLegend( $key );
+ wfRunHooks( 'PreferencesGetLegend', array( $this, $key, &$legend ) );
+ return $legend;
+ }
}
diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php
index 71703eb2..dbe06d49 100644
--- a/includes/ProtectionForm.php
+++ b/includes/ProtectionForm.php
@@ -66,8 +66,11 @@ class ProtectionForm {
// Check if the form should be disabled.
// If it is, the form will be available in read-only to show levels.
- $this->mPermErrors = $this->mTitle->getUserPermissionsErrors('protect',$wgUser);
- $this->disabled = wfReadOnly() || $this->mPermErrors != array();
+ $this->mPermErrors = $this->mTitle->getUserPermissionsErrors( 'protect', $wgUser );
+ if ( wfReadOnly() ) {
+ $this->mPermErrors[] = array( 'readonlytext', wfReadOnlyReason() );
+ }
+ $this->disabled = $this->mPermErrors != array();
$this->disabledAttrib = $this->disabled
? array( 'disabled' => 'disabled' )
: array();
@@ -180,6 +183,11 @@ class ProtectionForm {
*/
function execute() {
global $wgRequest, $wgOut;
+
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ throw new ErrorPageError( 'protect-badnamespace-title', 'protect-badnamespace-text' );
+ }
+
if( $wgRequest->wasPosted() ) {
if( $this->save() ) {
$q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
@@ -196,23 +204,17 @@ class ProtectionForm {
* @param $err String: error message or null if there's no error
*/
function show( $err = null ) {
- global $wgOut, $wgUser;
+ global $wgOut;
$wgOut->setRobotPolicy( 'noindex,nofollow' );
- if( is_null( $this->mTitle ) ||
- $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- $wgOut->showFatalError( wfMsg( 'badarticleerror' ) );
- return;
- }
-
- list( $cascadeSources, /* $restrictions */ ) = $this->mTitle->getCascadeProtectionSources();
-
- if ( $err != "" ) {
- $wgOut->setSubtitle( wfMsgHtml( 'formerror' ) );
+ if ( is_array( $err ) ) {
+ $wgOut->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
+ } elseif ( is_string( $err ) ) {
$wgOut->addHTML( "<p class='error'>{$err}</p>\n" );
}
+ list( $cascadeSources, /* $restrictions */ ) = $this->mTitle->getCascadeProtectionSources();
if ( $cascadeSources && count($cascadeSources) > 0 ) {
$titles = '';
@@ -223,26 +225,19 @@ class ProtectionForm {
$wgOut->wrapWikiMsg( "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>", array( 'protect-cascadeon', count($cascadeSources) ) );
}
- $sk = $wgUser->getSkin();
- $titleLink = $sk->link( $this->mTitle );
- $wgOut->setPageTitle( wfMsg( 'protect-title', $this->mTitle->getPrefixedText() ) );
- $wgOut->setSubtitle( wfMsg( 'protect-backlink', $titleLink ) );
-
# Show an appropriate message if the user isn't allowed or able to change
# the protection settings at this time
- if( $this->disabled ) {
- if( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- } elseif( $this->mPermErrors ) {
- $wgOut->showPermissionsErrorPage( $this->mPermErrors );
- }
+ if ( $this->disabled ) {
+ $wgOut->setPageTitle( wfMessage( 'protect-title-notallowed', $this->mTitle->getPrefixedText() ) );
+ $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
} else {
+ $wgOut->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
$wgOut->addWikiMsg( 'protect-text',
wfEscapeWikiText( $this->mTitle->getPrefixedText() ) );
}
+ $wgOut->addBacklinkSubtitle( $this->mTitle );
$wgOut->addHTML( $this->buildForm() );
-
$this->showLogExtract( $wgOut );
}
@@ -252,7 +247,7 @@ class ProtectionForm {
* @return Boolean: success
*/
function save() {
- global $wgRequest, $wgUser;
+ global $wgRequest, $wgUser, $wgOut;
# Permission check!
if ( $this->disabled ) {
@@ -261,8 +256,8 @@ class ProtectionForm {
}
$token = $wgRequest->getVal( 'wpEditToken' );
- if ( !$wgUser->matchEditToken( $token ) ) {
- $this->show( wfMsg( 'sessionfailure' ) );
+ if ( !$wgUser->matchEditToken( $token, array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) ) {
+ $this->show( array( 'sessionfailure' ) );
return false;
}
@@ -280,11 +275,11 @@ class ProtectionForm {
if( empty($this->mRestrictions[$action]) )
continue; // unprotected
if ( !$expiry[$action] ) {
- $this->show( wfMsg( 'protect_expiry_invalid' ) );
+ $this->show( array( 'protect_expiry_invalid' ) );
return false;
}
if ( $expiry[$action] < wfTimestampNow() ) {
- $this->show( wfMsg( 'protect_expiry_old' ) );
+ $this->show( array( 'protect_expiry_old' ) );
return false;
}
}
@@ -299,20 +294,24 @@ class ProtectionForm {
!(isset($wgGroupPermissions[$edit_restriction]['protect']) && $wgGroupPermissions[$edit_restriction]['protect'] ) )
$this->mCascade = false;
- if ($this->mTitle->exists()) {
- $ok = $this->mArticle->updateRestrictions( $this->mRestrictions, $reasonstr, $this->mCascade, $expiry );
- } else {
- $ok = $this->mTitle->updateTitleProtection( $this->mRestrictions['create'], $reasonstr, $expiry['create'] );
- }
+ $status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
- if( !$ok ) {
- throw new FatalError( "Unknown error at restriction save time." );
+ if ( !$status->isOK() ) {
+ $this->show( $wgOut->parseInline( $status->getWikiText() ) );
+ return false;
}
+ /**
+ * Give extensions a change to handle added form items
+ *
+ * @since 1.19 you can (and you should) return false to abort saving;
+ * you can also return an array of message name and its parameters
+ */
$errorMsg = '';
- # Give extensions a change to handle added form items
- if( !wfRunHooks( 'ProtectionForm::save', array($this->mArticle,&$errorMsg) ) ) {
- throw new FatalError( "Unknown hook error at restriction save time." );
+ if( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
+ if ( $errorMsg == '' ) {
+ $errorMsg = array( 'hookaborted' );
+ }
}
if( $errorMsg != '' ) {
$this->show( $errorMsg );
@@ -324,7 +323,7 @@ class ProtectionForm {
} elseif ( $this->mTitle->userIsWatching() ) {
WatchAction::doUnwatch( $this->mTitle, $wgUser );
}
- return $ok;
+ return true;
}
/**
@@ -344,7 +343,6 @@ class ProtectionForm {
$out .= Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->mTitle->getLocalUrl( 'action=protect' ),
'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
- $out .= Html::hidden( 'wpEditToken',$wgUser->editToken() );
}
$out .= Xml::openElement( 'fieldset' ) .
@@ -375,9 +373,9 @@ class ProtectionForm {
$expiryFormOptions = '';
if ( $this->mExistingExpiry[$action] && $this->mExistingExpiry[$action] != 'infinity' ) {
- $timestamp = $wgLang->timeanddate( $this->mExistingExpiry[$action] );
- $d = $wgLang->date( $this->mExistingExpiry[$action] );
- $t = $wgLang->time( $this->mExistingExpiry[$action] );
+ $timestamp = $wgLang->timeanddate( $this->mExistingExpiry[$action], true );
+ $d = $wgLang->date( $this->mExistingExpiry[$action], true );
+ $t = $wgLang->time( $this->mExistingExpiry[$action], true );
$expiryFormOptions .=
Xml::option(
wfMsg( 'protect-existing-expiry', $timestamp, $d, $t ),
@@ -501,7 +499,7 @@ class ProtectionForm {
if ( $wgUser->isAllowed( 'editinterface' ) ) {
$title = Title::makeTitle( NS_MEDIAWIKI, 'Protect-dropdown' );
- $link = $wgUser->getSkin()->link(
+ $link = Linker::link(
$title,
wfMsgHtml( 'protect-edit-reasonlist' ),
array(),
@@ -511,6 +509,7 @@ class ProtectionForm {
}
if ( !$this->disabled ) {
+ $out .= Html::hidden( 'wpEditToken', $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) );
$out .= Xml::closeElement( 'form' );
$wgOut->addScript( $this->buildCleanupScript() );
}
@@ -608,7 +607,7 @@ class ProtectionForm {
function showLogExtract( &$out ) {
# Show relevant lines from the protection log:
$out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'protect' ) ) );
- LogEventsList::showLogExtract( $out, 'protect', $this->mTitle->getPrefixedText() );
+ LogEventsList::showLogExtract( $out, 'protect', $this->mTitle );
# Let extensions add other relevant log extracts
wfRunHooks( 'ProtectionForm::showLogExtract', array($this->mArticle,$out) );
}
diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php
index 99cd65c5..bdab3be2 100644
--- a/includes/ProxyTools.php
+++ b/includes/ProxyTools.php
@@ -7,35 +7,15 @@
/**
* Extracts the XFF string from the request header
- * Checks first for "X-Forwarded-For", then "Client-ip"
* Note: headers are spoofable
+ *
+ * @deprecated in 1.19; use $wgRequest->getHeader( 'X-Forwarded-For' ) instead.
* @return string
*/
function wfGetForwardedFor() {
- $apacheHeaders = function_exists( 'apache_request_headers' ) ? apache_request_headers() : null;
- if( is_array( $apacheHeaders ) ) {
- // More reliable than $_SERVER due to case and -/_ folding
- $set = array();
- foreach ( $apacheHeaders as $tempName => $tempValue ) {
- $set[ strtoupper( $tempName ) ] = $tempValue;
- }
- $index = strtoupper ( 'X-Forwarded-For' );
- $index2 = strtoupper ( 'Client-ip' );
- } else {
- // Subject to spoofing with headers like X_Forwarded_For
- $set = $_SERVER;
- $index = 'HTTP_X_FORWARDED_FOR';
- $index2 = 'CLIENT-IP';
- }
-
- #Try a couple of headers
- if( isset( $set[$index] ) ) {
- return $set[$index];
- } elseif( isset( $set[$index2] ) ) {
- return $set[$index2];
- } else {
- return null;
- }
+ wfDeprecated( __METHOD__, '1.19' );
+ global $wgRequest;
+ return $wgRequest->getHeader( 'X-Forwarded-For' );
}
/**
@@ -46,88 +26,29 @@ function wfGetForwardedFor() {
* @return string
*/
function wfGetAgent() {
- wfDeprecated( __FUNCTION__ );
- if( function_exists( 'apache_request_headers' ) ) {
- // More reliable than $_SERVER due to case and -/_ folding
- $set = array();
- foreach ( apache_request_headers() as $tempName => $tempValue ) {
- $set[ strtoupper( $tempName ) ] = $tempValue;
- }
- $index = strtoupper ( 'User-Agent' );
- } else {
- // Subject to spoofing with headers like X_Forwarded_For
- $set = $_SERVER;
- $index = 'HTTP_USER_AGENT';
- }
- if( isset( $set[$index] ) ) {
- return $set[$index];
- } else {
- return '';
- }
+ wfDeprecated( __METHOD__, '1.18' );
+ global $wgRequest;
+ return $wgRequest->getHeader( 'User-Agent' );
}
/**
* Work out the IP address based on various globals
* For trusted proxies, use the XFF client IP (first of the chain)
+ *
+ * @deprecated in 1.19; call $wgRequest->getIP() directly.
* @return string
*/
function wfGetIP() {
- global $wgUsePrivateIPs, $wgCommandLineMode;
- static $ip = false;
-
- # Return cached result
- if ( !empty( $ip ) ) {
- return $ip;
- }
-
- /* collect the originating ips */
- # Client connecting to this webserver
- if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
- $ip = IP::canonicalize( $_SERVER['REMOTE_ADDR'] );
- } elseif( $wgCommandLineMode ) {
- $ip = '127.0.0.1';
- }
-
- # Append XFF
- $forwardedFor = wfGetForwardedFor();
- if ( $forwardedFor !== null ) {
- $ipchain = array_map( 'trim', explode( ',', $forwardedFor ) );
- $ipchain = array_reverse( $ipchain );
- if ( $ip ) {
- 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)
- 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];
- }
- }
- } else {
- break;
- }
- }
- }
-
- # Allow extensions to improve our guess
- wfRunHooks( 'GetIP', array( &$ip ) );
-
- if( !$ip ) {
- throw new MWException( "Unable to determine IP" );
- }
-
- wfDebug( "IP: $ip\n" );
- return $ip;
+ wfDeprecated( __METHOD__, '1.19' );
+ global $wgRequest;
+ return $wgRequest->getIP();
}
/**
- * Checks if an IP is a trusted proxy providor
- * Useful to tell if X-Fowarded-For data is possibly bogus
- * Squid cache servers for the site and AOL are whitelisted
+ * Checks if an IP is a trusted proxy providor.
+ * Useful to tell if X-Fowarded-For data is possibly bogus.
+ * Squid cache servers for the site are whitelisted.
+ *
* @param $ip String
* @return bool
*/
@@ -146,14 +67,14 @@ function wfIsTrustedProxy( $ip ) {
*/
function wfProxyCheck() {
global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath;
- global $wgMemc, $wgProxyMemcExpiry;
+ global $wgMemc, $wgProxyMemcExpiry, $wgRequest;
global $wgProxyKey;
if ( !$wgBlockOpenProxies ) {
return;
}
- $ip = wfGetIP();
+ $ip = $wgRequest->getIP();
# Get MemCached key
$mcKey = wfMemcKey( 'proxy', 'ip', $ip );
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index b3bb974b..69912cbf 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -437,29 +437,31 @@ abstract class QueryPage extends SpecialPage {
* real, honest-to-gosh query page.
*/
function execute( $par ) {
- global $wgUser, $wgOut, $wgLang, $wgRequest;
+ global $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
- if ( !$this->userCanExecute( $wgUser ) ) {
+ $user = $this->getUser();
+ if ( !$this->userCanExecute( $user ) ) {
$this->displayRestrictionError();
return;
}
- if ( $this->limit == 0 && $this->offset == 0 ) {
- list( $this->limit, $this->offset ) = $wgRequest->getLimitOffset();
- }
- $dbr = wfGetDB( DB_SLAVE );
-
$this->setHeaders();
- $wgOut->setSyndicated( $this->isSyndicated() );
+ $this->outputHeader();
+
+ $out = $this->getOutput();
if ( $this->isCached() && !$this->isCacheable() ) {
- $wgOut->setSyndicated( false );
- $wgOut->addWikiMsg( 'querypage-disabled' );
+ $out->addWikiMsg( 'querypage-disabled' );
return 0;
}
+ $out->setSyndicated( $this->isSyndicated() );
+
+ if ( $this->limit == 0 && $this->offset == 0 ) {
+ list( $this->limit, $this->offset ) = $this->getRequest()->getLimitOffset();
+ }
+
// TODO: Use doQuery()
- // $res = null;
if ( !$this->isCached() ) {
$res = $this->reallyDoQuery( $this->limit, $this->offset );
} else {
@@ -469,50 +471,50 @@ abstract class QueryPage extends SpecialPage {
# Fetch the timestamp of this update
$ts = $this->getCachedTimestamp();
+ $lang = $this->getLanguage();
+ $maxResults = $lang->formatNum( $wgQueryCacheLimit );
if ( $ts ) {
- $updated = $wgLang->timeanddate( $ts, true, true );
- $updateddate = $wgLang->date( $ts, true, true );
- $updatedtime = $wgLang->time( $ts, true, true );
- $wgOut->addMeta( 'Data-Cache-Time', $ts );
- $wgOut->addInlineScript( "var dataCacheTime = '$ts';" );
- $wgOut->addWikiMsg( 'perfcachedts', $updated, $updateddate, $updatedtime );
+ $updated = $lang->userTimeAndDate( $ts, $user );
+ $updateddate = $lang->userDate( $ts, $user );
+ $updatedtime = $lang->userTime( $ts, $user );
+ $out->addMeta( 'Data-Cache-Time', $ts );
+ $out->addInlineScript( "var dataCacheTime = '$ts';" );
+ $out->addWikiMsg( 'perfcachedts', $updated, $updateddate, $updatedtime, $maxResults );
} else {
- $wgOut->addWikiMsg( 'perfcached' );
+ $out->addWikiMsg( 'perfcached', $maxResults );
}
# If updates on this page have been disabled, let the user know
# that the data set won't be refreshed for now
- global $wgDisableQueryPageUpdate;
if ( is_array( $wgDisableQueryPageUpdate ) && in_array( $this->getName(), $wgDisableQueryPageUpdate ) ) {
- $wgOut->addWikiMsg( 'querypage-no-updates' );
+ $out->addWikiMsg( 'querypage-no-updates' );
}
-
}
-
}
- $this->numRows = $dbr->numRows( $res );
+ $this->numRows = $res->numRows();
+ $dbr = wfGetDB( DB_SLAVE );
$this->preprocessResults( $dbr, $res );
- $wgOut->addHTML( Xml::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) );
+ $out->addHTML( Xml::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) );
# Top header and navigation
if ( $this->shownavigation ) {
- $wgOut->addHTML( $this->getPageHeader() );
+ $out->addHTML( $this->getPageHeader() );
if ( $this->numRows > 0 ) {
- $wgOut->addHTML( '<p>' . wfShowingResults( $this->offset, $this->numRows ) . '</p>' );
+ $out->addHTML( $this->msg( 'showingresults' )->numParams(
+ $this->numRows, $this->offset + 1 )->parseAsBlock() );
# Disable the "next" link when we reach the end
- $paging = wfViewPrevNext( $this->offset, $this->limit,
- $this->getTitle( $par ),
- wfArrayToCGI( $this->linkParameters() ), ( $this->numRows < $this->limit ) );
- $wgOut->addHTML( '<p>' . $paging . '</p>' );
+ $paging = $this->getLanguage()->viewPrevNext( $this->getTitle( $par ), $this->offset,
+ $this->limit, $this->linkParameters(), ( $this->numRows < $this->limit ) );
+ $out->addHTML( '<p>' . $paging . '</p>' );
} else {
# No results to show, so don't bother with "showing X of Y" etc.
# -- just let the user know and give up now
- $wgOut->addHTML( '<p>' . wfMsgHtml( 'specialpage-empty' ) . '</p>' );
- $wgOut->addHTML( Xml::closeElement( 'div' ) );
+ $out->addWikiMsg( 'specialpage-empty' );
+ $out->addHTML( Xml::closeElement( 'div' ) );
return;
}
}
@@ -520,7 +522,7 @@ abstract class QueryPage extends SpecialPage {
# The actual results; specialist subclasses will want to handle this
# with more than a straight list, so we hand them the info, plus
# an OutputPage, and let them get on with it
- $this->outputResults( $wgOut,
+ $this->outputResults( $out,
$this->getSkin(),
$dbr, # Should use a ResultWrapper for this
$res,
@@ -529,10 +531,10 @@ abstract class QueryPage extends SpecialPage {
# Repeat the paging links at the bottom
if ( $this->shownavigation ) {
- $wgOut->addHTML( '<p>' . $paging . '</p>' );
+ $out->addHTML( '<p>' . $paging . '</p>' );
}
- $wgOut->addHTML( Xml::closeElement( 'div' ) );
+ $out->addHTML( Xml::closeElement( 'div' ) );
return $this->numRows;
}
@@ -597,10 +599,17 @@ abstract class QueryPage extends SpecialPage {
}
}
+ /**
+ * @param $offset
+ * @return string
+ */
function openList( $offset ) {
return "\n<ol start='" . ( $offset + 1 ) . "' class='special'>\n";
}
+ /**
+ * @return string
+ */
function closeList() {
return "</ol>\n";
}
@@ -617,8 +626,7 @@ abstract class QueryPage extends SpecialPage {
global $wgFeed, $wgFeedClasses;
if ( !$wgFeed ) {
- global $wgOut;
- $wgOut->addWikiMsg( 'feed-unavailable' );
+ $this->getOutput()->addWikiMsg( 'feed-unavailable' );
return;
}
@@ -693,7 +701,7 @@ abstract class QueryPage extends SpecialPage {
}
function feedDesc() {
- return wfMsgExt( 'tagline', 'parsemag' );
+ return $this->msg( 'tagline' )->text();
}
function feedUrl() {
@@ -754,8 +762,8 @@ abstract class WantedQueryPage extends QueryPage {
if ( $title instanceof Title ) {
if ( $this->isCached() || $this->forceExistenceCheck() ) {
$pageLink = $title->isKnown()
- ? '<del>' . $skin->link( $title ) . '</del>'
- : $skin->link(
+ ? '<del>' . Linker::link( $title ) . '</del>'
+ : Linker::link(
$title,
null,
array(),
@@ -763,7 +771,7 @@ abstract class WantedQueryPage extends QueryPage {
array( 'broken' )
);
} else {
- $pageLink = $skin->link(
+ $pageLink = Linker::link(
$title,
null,
array(),
@@ -771,10 +779,9 @@ abstract class WantedQueryPage extends QueryPage {
array( 'broken' )
);
}
- return wfSpecialList( $pageLink, $this->makeWlhLink( $title, $skin, $result ) );
+ return $this->getLanguage()->specialList( $pageLink, $this->makeWlhLink( $title, $result ) );
} else {
- $tsafe = htmlspecialchars( $result->title );
- return wfMsgHtml( 'wantedpages-badtitle', $tsafe );
+ return $this->msg( 'wantedpages-badtitle', $result->title )->escaped();
}
}
@@ -782,15 +789,12 @@ abstract class WantedQueryPage extends QueryPage {
* Make a "what links here" link for a given title
*
* @param $title Title to make the link for
- * @param $skin Skin object to use
* @param $result Object: result row
* @return string
*/
- private function makeWlhLink( $title, $skin, $result ) {
- global $wgLang;
- $wlh = SpecialPage::getTitleFor( 'Whatlinkshere' );
- $label = wfMsgExt( 'nlinks', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->value ) );
- return $skin->link( $wlh, $label, array(), array( 'target' => $title->getPrefixedText() ) );
+ private function makeWlhLink( $title, $result ) {
+ $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
+ $label = $this->msg( 'nlinks' )->numParams( $result->value )->escaped();
+ return Linker::link( $wlh, $label );
}
}
diff --git a/includes/RawPage.php b/includes/RawPage.php
deleted file mode 100644
index 6a552a50..00000000
--- a/includes/RawPage.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-/**
- * Raw page text accessor
- *
- * Copyright © 2004 Gabriel Wicke <wicke@wikidev.net>
- * http://wikidev.net/
- *
- * Based on HistoryPage and SpecialExport
- *
- * License: GPL (http://www.gnu.org/copyleft/gpl.html)
- *
- * @author Gabriel Wicke <wicke@wikidev.net>
- * @file
- */
-
-/**
- * A simple method to retrieve the plain source of an article,
- * using "action=raw" in the GET request string.
- */
-class RawPage {
- var $mArticle, $mTitle, $mRequest;
- var $mOldId, $mGen, $mCharset, $mSection;
- var $mSmaxage, $mMaxage;
- var $mContentType, $mExpandTemplates;
-
- function __construct( Page $article, $request = false ) {
- global $wgRequest, $wgSquidMaxage, $wgJsMimeType, $wgGroupPermissions;
-
- $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
- $this->mArticle = $article;
- $this->mTitle = $article->getTitle();
-
- if( $request === false ) {
- $this->mRequest = $wgRequest;
- } else {
- $this->mRequest = $request;
- }
-
- $ctype = $this->mRequest->getVal( 'ctype' );
- $smaxage = $this->mRequest->getIntOrNull( 'smaxage' );
- $maxage = $this->mRequest->getInt( 'maxage', $wgSquidMaxage );
-
- $this->mExpandTemplates = $this->mRequest->getVal( 'templates' ) === 'expand';
- $this->mUseMessageCache = $this->mRequest->getBool( 'usemsgcache' );
-
- $this->mSection = $this->mRequest->getIntOrNull( 'section' );
-
- $oldid = $this->mRequest->getInt( 'oldid' );
-
- switch( $wgRequest->getText( 'direction' ) ) {
- case 'next':
- # output next revision, or nothing if there isn't one
- if( $oldid ) {
- $oldid = $this->mTitle->getNextRevisionId( $oldid );
- }
- $oldid = $oldid ? $oldid : -1;
- break;
- case 'prev':
- # output previous revision, or nothing if there isn't one
- if( !$oldid ) {
- # get the current revision so we can get the penultimate one
- $this->mArticle->getTouched();
- $oldid = $this->mArticle->getLatest();
- }
- $prev = $this->mTitle->getPreviousRevisionId( $oldid );
- $oldid = $prev ? $prev : -1 ;
- break;
- case 'cur':
- $oldid = 0;
- break;
- }
- $this->mOldId = $oldid;
-
- # special case for 'generated' raw things: user css/js
- $gen = $this->mRequest->getVal( 'gen' );
-
- if( $gen == 'css' ) {
- $this->mGen = $gen;
- if( is_null( $smaxage ) ) {
- $smaxage = $wgSquidMaxage;
- }
- if( $ctype == '' ) {
- $ctype = 'text/css';
- }
- } elseif( $gen == 'js' ) {
- $this->mGen = $gen;
- if( is_null( $smaxage ) ) $smaxage = $wgSquidMaxage;
- if($ctype == '') $ctype = $wgJsMimeType;
- } else {
- $this->mGen = false;
- }
- $this->mCharset = 'UTF-8';
-
- # Force caching for CSS and JS raw content, default: 5 minutes
- if( is_null( $smaxage ) && ( $ctype == 'text/css' || $ctype == $wgJsMimeType ) ) {
- global $wgForcedRawSMaxage;
- $this->mSmaxage = intval( $wgForcedRawSMaxage );
- } else {
- $this->mSmaxage = intval( $smaxage );
- }
- $this->mMaxage = $maxage;
-
- # Output may contain user-specific data;
- # vary generated content for open sessions and private wikis
- if( $this->mGen || !$wgGroupPermissions['*']['read'] ) {
- $this->mPrivateCache = $this->mSmaxage == 0 || session_id() != '';
- } else {
- $this->mPrivateCache = false;
- }
-
- if( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
- $this->mContentType = 'text/x-wiki';
- } else {
- $this->mContentType = $ctype;
- }
- }
-
- function view() {
- global $wgOut, $wgRequest;
-
- if( !$wgRequest->checkUrlExtension() ) {
- $wgOut->disable();
- return;
- }
-
- header( 'Content-type: ' . $this->mContentType . '; charset=' . $this->mCharset );
- # allow the client to cache this for 24 hours
- $mode = $this->mPrivateCache ? 'private' : 'public';
- header( 'Cache-Control: ' . $mode . ', s-maxage=' . $this->mSmaxage . ', max-age=' . $this->mMaxage );
-
- global $wgUseFileCache;
- if( $wgUseFileCache && HTMLFileCache::useFileCache() ) {
- $cache = new HTMLFileCache( $this->mTitle, 'raw' );
- if( $cache->isFileCacheGood( /* Assume up to date */ ) ) {
- $cache->loadFromFileCache();
- $wgOut->disable();
- return;
- } else {
- ob_start( array( &$cache, 'saveToFileCache' ) );
- }
- }
-
- $text = $this->getRawText();
-
- if( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
- wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
- }
-
- echo $text;
- $wgOut->disable();
- }
-
- function getRawText() {
- global $wgOut, $wgUser;
- if( $this->mGen ) {
- $sk = $wgUser->getSkin();
- if( !StubObject::isRealObject( $wgOut ) ) {
- $wgOut->_unstub( 2 );
- }
- $sk->initPage( $wgOut );
- if( $this->mGen == 'css' ) {
- return $sk->generateUserStylesheet();
- } elseif( $this->mGen == 'js' ) {
- return $sk->generateUserJs();
- }
- } else {
- return $this->getArticleText();
- }
- }
-
- function getArticleText() {
- $found = false;
- $text = '';
- if( $this->mTitle ) {
- // If it's a MediaWiki message we can just hit the message cache
- if( $this->mUseMessageCache && $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- $key = $this->mTitle->getDBkey();
- $msg = wfMessage( $key )->inContentLanguage();
- # If the message doesn't exist, return a blank
- $text = !$msg->exists() ? '' : $msg->plain();
- $found = true;
- } else {
- // Get it from the DB
- $rev = Revision::newFromTitle( $this->mTitle, $this->mOldId );
- if( $rev ) {
- $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
- header( "Last-modified: $lastmod" );
-
- if( !is_null( $this->mSection ) ) {
- global $wgParser;
- $text = $wgParser->getSection( $rev->getText(), $this->mSection );
- } else {
- $text = $rev->getText();
- }
- $found = true;
- }
- }
- }
-
- # Bad title or page does not exist
- if( !$found && $this->mContentType == 'text/x-wiki' ) {
- # Don't return a 404 response for CSS or JavaScript;
- # 404s aren't generally cached and it would create
- # extra hits when user CSS/JS are on and the user doesn't
- # have the pages.
- header( 'HTTP/1.0 404 Not Found' );
- }
-
- return $this->parseArticleText( $text );
- }
-
- /**
- * @param $text
- * @return string
- */
- function parseArticleText( $text ) {
- if( $text === '' ) {
- return '';
- } else {
- if( $this->mExpandTemplates ) {
- global $wgParser;
- return $wgParser->preprocess( $text, $this->mTitle, new ParserOptions() );
- } else {
- return $text;
- }
- }
- }
-}
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
index 955986e9..ca0ed955 100644
--- a/includes/RecentChange.php
+++ b/includes/RecentChange.php
@@ -55,15 +55,24 @@ class RecentChange {
*/
var $mMovedToTitle = false;
var $numberofWatchingusers = 0 ; # Dummy to prevent error message in SpecialRecentchangeslinked
+ var $notificationtimestamp;
# Factory methods
+ /**
+ * @param $row
+ * @return RecentChange
+ */
public static function newFromRow( $row ) {
$rc = new RecentChange;
$rc->loadFromRow( $row );
return $rc;
}
+ /**
+ * @param $row
+ * @return RecentChange
+ */
public static function newFromCurRow( $row ) {
$rc = new RecentChange;
$rc->loadFromCurRow( $row );
@@ -96,9 +105,7 @@ class RecentChange {
* @param $fname Mixed: override the method name in profiling/logs
* @return RecentChange
*/
- public static function newFromConds( $conds, $fname = false ) {
- if( $fname === false )
- $fname = __METHOD__;
+ public static function newFromConds( $conds, $fname = __METHOD__ ) {
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select(
'recentchanges',
@@ -116,10 +123,16 @@ class RecentChange {
# Accessors
+ /**
+ * @param $attribs array
+ */
public function setAttribs( $attribs ) {
$this->mAttribs = $attribs;
}
+ /**
+ * @param $extra array
+ */
public function setExtra( $extra ) {
$this->mExtra = $extra;
}
@@ -137,6 +150,9 @@ class RecentChange {
return $this->mTitle;
}
+ /**
+ * @return bool|\Title
+ */
public function getMovedToTitle() {
if( $this->mMovedToTitle === false ) {
$this->mMovedToTitle = Title::makeTitle( $this->mAttribs['rc_moved_to_ns'],
@@ -145,10 +161,12 @@ class RecentChange {
return $this->mMovedToTitle;
}
- # Writes the data in this object to the database
- public function save() {
- global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, $wgRC2UDPOmitBots;
- $fname = 'RecentChange::save';
+ /**
+ * Writes the data in this object to the database
+ * @param $noudp bool
+ */
+ public function save( $noudp = false ) {
+ global $wgLocalInterwiki, $wgPutIPinRC, $wgContLang;
$dbw = wfGetDB( DB_MASTER );
if( !is_array($this->mExtra) ) {
@@ -165,6 +183,9 @@ class RecentChange {
unset( $this->mAttribs['rc_ip'] );
}
+ # Make sure summary is truncated (whole multibyte characters)
+ $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
+
# Fixup database timestamps
$this->mAttribs['rc_timestamp'] = $dbw->timestamp($this->mAttribs['rc_timestamp']);
$this->mAttribs['rc_cur_time'] = $dbw->timestamp($this->mAttribs['rc_cur_time']);
@@ -176,17 +197,17 @@ class RecentChange {
}
# Insert new row
- $dbw->insert( 'recentchanges', $this->mAttribs, $fname );
+ $dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ );
# Set the ID
$this->mAttribs['rc_id'] = $dbw->insertId();
-
+
# Notify extensions
wfRunHooks( 'RecentChange_save', array( &$this ) );
# Notify external application via UDP
- if( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
- self::sendToUDP( $this->getIRCLine() );
+ if ( !$noudp ) {
+ $this->notifyRC2UDP();
}
# E-mail notifications
@@ -194,24 +215,25 @@ class RecentChange {
if( $wgUseEnotif || $wgShowUpdatedMarker ) {
// Users
if( $this->mAttribs['rc_user'] ) {
- $editor = ($wgUser->getId() == $this->mAttribs['rc_user']) ?
+ $editor = ($wgUser->getId() == $this->mAttribs['rc_user']) ?
$wgUser : User::newFromID( $this->mAttribs['rc_user'] );
// Anons
} else {
- $editor = ($wgUser->getName() == $this->mAttribs['rc_user_text']) ?
+ $editor = ($wgUser->getName() == $this->mAttribs['rc_user_text']) ?
$wgUser : User::newFromName( $this->mAttribs['rc_user_text'], false );
}
+ $title = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
+
# @todo FIXME: This would be better as an extension hook
$enotif = new EmailNotification();
- $title = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
- $enotif->notifyOnPageChange( $editor, $title,
+ $status = $enotif->notifyOnPageChange( $editor, $title,
$this->mAttribs['rc_timestamp'],
$this->mAttribs['rc_comment'],
$this->mAttribs['rc_minor'],
$this->mAttribs['rc_last_oldid'] );
}
}
-
+
public function notifyRC2UDP() {
global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
# Notify external application via UDP
@@ -250,7 +272,7 @@ class RecentChange {
}
return false;
}
-
+
/**
* Remove newlines, carriage returns and decode html entites
* @param $text String
@@ -279,7 +301,7 @@ class RecentChange {
}
return $change->doMarkPatrolled( $wgUser, $auto );
}
-
+
/**
* Mark this RecentChange as patrolled
*
@@ -321,7 +343,7 @@ class RecentChange {
wfRunHooks( 'MarkPatrolledComplete', array($this->getAttribute('rc_id'), &$user, false) );
return array();
}
-
+
/**
* Mark this RecentChange patrolled, without error checking
* @return Integer: number of affected rows
@@ -361,8 +383,9 @@ class RecentChange {
*/
public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
$lastTimestamp, $bot, $ip='', $oldSize=0, $newSize=0, $newId=0, $patrol=0 ) {
+ global $wgRequest;
if( !$ip ) {
- $ip = wfGetIP();
+ $ip = $wgRequest->getIP();
if( !$ip ) $ip = '';
}
@@ -424,9 +447,12 @@ class RecentChange {
*/
public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
$ip='', $size=0, $newId=0, $patrol=0 ) {
+ global $wgRequest;
if( !$ip ) {
- $ip = wfGetIP();
- if( !$ip ) $ip = '';
+ $ip = $wgRequest->getIP();
+ if( !$ip ) {
+ $ip = '';
+ }
}
$rc = new RecentChange;
@@ -465,75 +491,24 @@ class RecentChange {
'newSize' => $size
);
$rc->save();
- return $rc;
+ return $rc;
}
- # Makes an entry in the database corresponding to a rename
-
/**
* @param $timestamp
- * @param $oldTitle Title
- * @param $newTitle Title
- * @param $user User
- * @param $comment
+ * @param $title
+ * @param $user
+ * @param $actionComment
* @param $ip string
- * @param $overRedir bool
- * @return void
+ * @param $type
+ * @param $action
+ * @param $target
+ * @param $logComment
+ * @param $params
+ * @param $newId int
+ * @return bool
*/
- public static function notifyMove( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='',
- $overRedir = false ) {
- global $wgRequest;
- if( !$ip ) {
- $ip = wfGetIP();
- if( !$ip ) $ip = '';
- }
-
- $rc = new RecentChange;
- $rc->mAttribs = array(
- 'rc_timestamp' => $timestamp,
- 'rc_cur_time' => $timestamp,
- 'rc_namespace' => $oldTitle->getNamespace(),
- 'rc_title' => $oldTitle->getDBkey(),
- 'rc_type' => $overRedir ? RC_MOVE_OVER_REDIRECT : RC_MOVE,
- 'rc_minor' => 0,
- 'rc_cur_id' => $oldTitle->getArticleID(),
- 'rc_user' => $user->getId(),
- 'rc_user_text' => $user->getName(),
- 'rc_comment' => $comment,
- 'rc_this_oldid' => 0,
- 'rc_last_oldid' => 0,
- 'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot' , true ) : 0,
- 'rc_moved_to_ns' => $newTitle->getNamespace(),
- 'rc_moved_to_title' => $newTitle->getDBkey(),
- 'rc_ip' => $ip,
- 'rc_new' => 0, # obsolete
- 'rc_patrolled' => 1,
- 'rc_old_len' => null,
- 'rc_new_len' => null,
- 'rc_deleted' => 0,
- 'rc_logid' => 0, # notifyMove not used anymore
- 'rc_log_type' => null,
- 'rc_log_action' => '',
- 'rc_params' => ''
- );
-
- $rc->mExtra = array(
- 'prefixedDBkey' => $oldTitle->getPrefixedDBkey(),
- 'lastTimestamp' => 0,
- 'prefixedMoveTo' => $newTitle->getPrefixedDBkey()
- );
- $rc->save();
- }
-
- public static function notifyMoveToNew( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='' ) {
- RecentChange::notifyMove( $timestamp, $oldTitle, $newTitle, $user, $comment, $ip, false );
- }
-
- public static function notifyMoveOverRedirect( $timestamp, &$oldTitle, &$newTitle, &$user, $comment, $ip='' ) {
- RecentChange::notifyMove( $timestamp, $oldTitle, $newTitle, $user, $comment, $ip, true );
- }
-
- public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip='', $type,
+ public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip='', $type,
$action, $target, $logComment, $params, $newId=0 )
{
global $wgLogRestrictions;
@@ -565,7 +540,7 @@ class RecentChange {
$type, $action, $target, $logComment, $params, $newId=0 ) {
global $wgRequest;
if( !$ip ) {
- $ip = wfGetIP();
+ $ip = $wgRequest->getIP();
if( !$ip ) {
$ip = '';
}
@@ -607,14 +582,22 @@ class RecentChange {
return $rc;
}
- # Initialises the members of this object from a mysql row object
+ /**
+ * Initialises the members of this object from a mysql row object
+ *
+ * @param $row
+ */
public function loadFromRow( $row ) {
$this->mAttribs = get_object_vars( $row );
$this->mAttribs['rc_timestamp'] = wfTimestamp(TS_MW, $this->mAttribs['rc_timestamp']);
$this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
}
- # Makes a pseudo-RC entry from a cur row
+ /**
+ * Makes a pseudo-RC entry from a cur row
+ *
+ * @param $row
+ */
public function loadFromCurRow( $row ) {
$this->mAttribs = array(
'rc_timestamp' => wfTimestamp(TS_MW, $row->rev_timestamp),
@@ -656,6 +639,9 @@ class RecentChange {
return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
}
+ /**
+ * @return array
+ */
public function getAttributes() {
return $this->mAttribs;
}
@@ -663,6 +649,8 @@ class RecentChange {
/**
* Gets the end part of the diff URL associated with this object
* Blank if no diff link should be displayed
+ * @param $forceCur
+ * @return string
*/
public function diffLinkTrail( $forceCur ) {
if( $this->mAttribs['rc_type'] == RC_EDIT ) {
@@ -679,6 +667,9 @@ class RecentChange {
return $trail;
}
+ /**
+ * @return string
+ */
public function getIRCLine() {
global $wgUseRCPatrol, $wgUseNPPatrol, $wgRC2UDPInterwikiPrefix, $wgLocalInterwiki,
$wgCanonicalServer, $wgScript;
@@ -708,8 +699,8 @@ class RecentChange {
$url .= $query;
}
- if( isset( $this->mExtra['oldSize'] ) && isset( $this->mExtra['newSize'] ) ) {
- $szdiff = $this->mExtra['newSize'] - $this->mExtra['oldSize'];
+ 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) {
@@ -747,18 +738,21 @@ class RecentChange {
} 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";
-
+ "\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
+ * @param $new int
+ * @return string
*/
public function getCharacterDifference( $old = 0, $new = 0 ) {
if( $old === 0 ) {
diff --git a/includes/RequestContext.php b/includes/RequestContext.php
deleted file mode 100644
index 441a9aec..00000000
--- a/includes/RequestContext.php
+++ /dev/null
@@ -1,424 +0,0 @@
-<?php
-/**
- * Request-dependant objects containers.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.18
- *
- * @author Alexandre Emsenhuber
- * @author Daniel Friesen
- * @file
- */
-
-/**
- * Interface for objects which can provide a context on request.
- */
-interface IContextSource {
-
- /**
- * Get the WebRequest object
- *
- * @return WebRequest
- */
- public function getRequest();
-
- /**
- * Get the Title object
- *
- * @return Title
- */
- public function getTitle();
-
- /**
- * Get the OutputPage object
- *
- * @return OutputPage object
- */
- public function getOutput();
-
- /**
- * Get the User object
- *
- * @return User
- */
- public function getUser();
-
- /**
- * Get the Language object
- *
- * @return Language
- */
- public function getLang();
-
- /**
- * Get the Language object
- *
- * @return Language
- */
- public function getLanguage();
-
- /**
- * Get the Skin object
- *
- * @return Skin
- */
- public function getSkin();
-}
-
-/**
- * Group all the pieces relevant to the context of a request into one instance
- */
-class RequestContext implements IContextSource {
-
- /**
- * @var WebRequest
- */
- private $request;
-
- /**
- * @var Title
- */
- private $title;
-
- /**
- * @var OutputPage
- */
- private $output;
-
- /**
- * @var User
- */
- private $user;
-
- /**
- * @var Language
- */
- private $lang;
-
- /**
- * @var Skin
- */
- private $skin;
-
- /**
- * Set the WebRequest object
- *
- * @param $r WebRequest object
- */
- public function setRequest( WebRequest $r ) {
- $this->request = $r;
- }
-
- /**
- * Get the WebRequest object
- *
- * @return WebRequest
- */
- public function getRequest() {
- if ( $this->request === null ) {
- global $wgRequest; # fallback to $wg till we can improve this
- $this->request = $wgRequest;
- }
- return $this->request;
- }
-
- /**
- * Set the Title object
- *
- * @param $t Title object
- */
- public function setTitle( Title $t ) {
- $this->title = $t;
- }
-
- /**
- * Get the Title object
- *
- * @return Title
- */
- public function getTitle() {
- if ( $this->title === null ) {
- global $wgTitle; # fallback to $wg till we can improve this
- $this->title = $wgTitle;
- }
- return $this->title;
- }
-
- /**
- * @param $o OutputPage
- */
- public function setOutput( OutputPage $o ) {
- $this->output = $o;
- }
-
- /**
- * Get the OutputPage object
- *
- * @return OutputPage object
- */
- public function getOutput() {
- if ( $this->output === null ) {
- $this->output = new OutputPage( $this );
- }
- return $this->output;
- }
-
- /**
- * Set the User object
- *
- * @param $u User
- */
- public function setUser( User $u ) {
- $this->user = $u;
- }
-
- /**
- * Get the User object
- *
- * @return User
- */
- public function getUser() {
- if ( $this->user === null ) {
- $this->user = User::newFromSession( $this->getRequest() );
- }
- return $this->user;
- }
-
- /**
- * Set the Language object
- *
- * @param $l Language
- */
- public function setLang( Language $l ) {
- $this->lang = $l;
- }
-
- /**
- * Get the Language object
- *
- * @return Language
- */
- public function getLang() {
- if ( $this->lang === null ) {
- global $wgLanguageCode, $wgContLang;
- $code = $this->getRequest()->getVal(
- 'uselang',
- $this->getUser()->getOption( 'language' )
- );
- // BCP 47 - letter case MUST NOT carry meaning
- $code = strtolower( $code );
-
- # Validate $code
- if( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) {
- wfDebug( "Invalid user language code\n" );
- $code = $wgLanguageCode;
- }
-
- wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$code ) );
-
- if( $code === $wgLanguageCode ) {
- $this->lang = $wgContLang;
- } else {
- $obj = Language::factory( $code );
- $this->lang = $obj;
- }
- }
- return $this->lang;
- }
-
- /**
- * Get the Language object
- *
- * @return Language
- */
- public function getLanguage() {
- return $this->getLang();
- }
-
- /**
- * Set the Skin object
- *
- * @param $s Skin
- */
- public function setSkin( Skin $s ) {
- $this->skin = clone $s;
- $this->skin->setContext( $this );
- }
-
- /**
- * Get the Skin object
- *
- * @return Skin
- */
- public function getSkin() {
- if ( $this->skin === null ) {
- wfProfileIn( __METHOD__ . '-createskin' );
-
- global $wgHiddenPrefs;
- if( !in_array( 'skin', $wgHiddenPrefs ) ) {
- # get the user skin
- $userSkin = $this->getUser()->getOption( 'skin' );
- $userSkin = $this->getRequest()->getVal( 'useskin', $userSkin );
- } else {
- # if we're not allowing users to override, then use the default
- global $wgDefaultSkin;
- $userSkin = $wgDefaultSkin;
- }
-
- $this->skin = Skin::newFromKey( $userSkin );
- $this->skin->setContext( $this );
- wfProfileOut( __METHOD__ . '-createskin' );
- }
- return $this->skin;
- }
-
- /** Helpful methods **/
-
- /**
- * Get a Message object with context set
- * Parameters are the same as wfMessage()
- *
- * @return Message object
- */
- public function msg() {
- $args = func_get_args();
- return call_user_func_array( 'wfMessage', $args )->inLanguage( $this->getLang() )->title( $this->getTitle() );
- }
-
- /** Static methods **/
-
- /**
- * Get the RequestContext object associated with the main request
- *
- * @return RequestContext object
- */
- public static function getMain() {
- static $instance = null;
- if ( $instance === null ) {
- $instance = new self;
- }
- return $instance;
- }
-}
-
-/**
- * The simplest way of implementing IContextSource is to hold a RequestContext as a
- * member variable and provide accessors to it.
- */
-abstract class ContextSource implements IContextSource {
-
- /**
- * @var IContextSource
- */
- private $context;
-
- /**
- * Get the IContextSource object
- *
- * @return IContextSource
- */
- public function getContext() {
- if ( $this->context === null ) {
- $class = get_class( $this );
- wfDebug( __METHOD__ . " ($class): called and \$context is null. Using RequestContext::getMain() for sanity\n" );
- $this->context = RequestContext::getMain();
- }
- return $this->context;
- }
-
- /**
- * Set the IContextSource object
- *
- * @param $context IContextSource
- */
- public function setContext( IContextSource $context ) {
- $this->context = $context;
- }
-
- /**
- * Get the WebRequest object
- *
- * @return WebRequest
- */
- public function getRequest() {
- return $this->getContext()->getRequest();
- }
-
- /**
- * Get the Title object
- *
- * @return Title
- */
- public function getTitle() {
- return $this->getContext()->getTitle();
- }
-
- /**
- * Get the OutputPage object
- *
- * @return OutputPage object
- */
- public function getOutput() {
- return $this->getContext()->getOutput();
- }
-
- /**
- * Get the User object
- *
- * @return User
- */
- public function getUser() {
- return $this->getContext()->getUser();
- }
-
- /**
- * Get the Language object
- *
- * @return Language
- */
- public function getLang() {
- return $this->getContext()->getLang();
- }
-
- /**
- * Get the Language object
- *
- * @return Language
- */
- public function getLanguage() {
- return $this->getContext()->getLang();
- }
-
- /**
- * Get the Skin object
- *
- * @return Skin
- */
- public function getSkin() {
- return $this->getContext()->getSkin();
- }
-
- /**
- * Get a Message object with context set
- * Parameters are the same as wfMessage()
- *
- * @return Message object
- */
- public function msg( /* $args */ ) {
- return call_user_func_array( array( $this->getContext(), 'msg' ), func_get_args() );
- }
-}
diff --git a/includes/Revision.php b/includes/Revision.php
index b5d776bd..445211c9 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -4,6 +4,23 @@
* @todo document
*/
class Revision {
+ protected $mId;
+ protected $mPage;
+ protected $mUserText;
+ protected $mOrigUserText;
+ protected $mUser;
+ protected $mMinorEdit;
+ protected $mTimestamp;
+ protected $mDeleted;
+ protected $mSize;
+ protected $mSha1;
+ protected $mParentId;
+ protected $mComment;
+ protected $mText;
+ protected $mTextRow;
+ protected $mTitle;
+ protected $mCurrent;
+
const DELETED_TEXT = 1;
const DELETED_COMMENT = 2;
const DELETED_USER = 4;
@@ -23,9 +40,7 @@ class Revision {
* @return Revision or null
*/
public static function newFromId( $id ) {
- return Revision::newFromConds(
- array( 'page_id=rev_page',
- 'rev_id' => intval( $id ) ) );
+ return Revision::newFromConds( array( 'rev_id' => intval( $id ) ) );
}
/**
@@ -57,7 +72,6 @@ class Revision {
// Use a join to get the latest revision
$conds[] = 'rev_id=page_latest';
}
- $conds[] = 'page_id=rev_page';
return Revision::newFromConds( $conds );
}
@@ -85,7 +99,6 @@ class Revision {
} else {
$conds[] = 'rev_id = page_latest';
}
- $conds[] = 'page_id=rev_page';
return Revision::newFromConds( $conds );
}
@@ -101,7 +114,7 @@ class Revision {
*/
public static function newFromArchiveRow( $row, $overrides = array() ) {
$attribs = $overrides + array(
- 'page' => isset( $row->page_id ) ? $row->page_id : null,
+ 'page' => isset( $row->ar_page_id ) ? $row->ar_page_id : null,
'id' => isset( $row->ar_rev_id ) ? $row->ar_rev_id : null,
'comment' => $row->ar_comment,
'user' => $row->ar_user,
@@ -110,7 +123,9 @@ class Revision {
'minor_edit' => $row->ar_minor_edit,
'text_id' => isset( $row->ar_text_id ) ? $row->ar_text_id : null,
'deleted' => $row->ar_deleted,
- 'len' => $row->ar_len);
+ 'len' => $row->ar_len,
+ 'sha1' => isset( $row->ar_sha1 ) ? $row->ar_sha1 : null,
+ );
if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
// Pre-1.5 ar_text row
$attribs['text'] = self::getRevisionText( $row, 'ar_' );
@@ -122,6 +137,8 @@ class Revision {
}
/**
+ * @since 1.19
+ *
* @param $row
* @return Revision
*/
@@ -138,9 +155,7 @@ class Revision {
* @return Revision or null
*/
public static function loadFromId( $db, $id ) {
- return Revision::loadFromConds( $db,
- array( 'page_id=rev_page',
- 'rev_id' => intval( $id ) ) );
+ return Revision::loadFromConds( $db, array( 'rev_id' => intval( $id ) ) );
}
/**
@@ -154,7 +169,7 @@ class Revision {
* @return Revision or null
*/
public static function loadFromPageId( $db, $pageid, $id = 0 ) {
- $conds = array( 'page_id=rev_page','rev_page' => intval( $pageid ), 'page_id'=>intval( $pageid ) );
+ $conds = array( 'rev_page' => intval( $pageid ), 'page_id' => intval( $pageid ) );
if( $id ) {
$conds['rev_id'] = intval( $id );
} else {
@@ -179,12 +194,11 @@ class Revision {
} else {
$matchId = 'page_latest';
}
- return Revision::loadFromConds(
- $db,
+ return Revision::loadFromConds( $db,
array( "rev_id=$matchId",
- 'page_id=rev_page',
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() ) );
+ 'page_title' => $title->getDBkey() )
+ );
}
/**
@@ -198,12 +212,11 @@ class Revision {
* @return Revision or null
*/
public static function loadFromTimestamp( $db, $title, $timestamp ) {
- return Revision::loadFromConds(
- $db,
+ return Revision::loadFromConds( $db,
array( 'rev_timestamp' => $db->timestamp( $timestamp ),
- 'page_id=rev_page',
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() ) );
+ 'page_title' => $title->getDBkey() )
+ );
}
/**
@@ -214,12 +227,12 @@ class Revision {
*/
public static function newFromConds( $conditions ) {
$db = wfGetDB( DB_SLAVE );
- $row = Revision::loadFromConds( $db, $conditions );
- if( is_null( $row ) && wfGetLB()->getServerCount() > 1 ) {
+ $rev = Revision::loadFromConds( $db, $conditions );
+ if( is_null( $rev ) && wfGetLB()->getServerCount() > 1 ) {
$dbw = wfGetDB( DB_MASTER );
- $row = Revision::loadFromConds( $dbw, $conditions );
+ $rev = Revision::loadFromConds( $dbw, $conditions );
}
- return $row;
+ return $rev;
}
/**
@@ -234,7 +247,6 @@ class Revision {
$res = Revision::fetchFromConds( $db, $conditions );
if( $res ) {
$row = $res->fetchObject();
- $res->free();
if( $row ) {
$ret = new Revision( $row );
return $ret;
@@ -257,8 +269,8 @@ class Revision {
wfGetDB( DB_SLAVE ),
array( 'rev_id=page_latest',
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey(),
- 'page_id=rev_page' ) );
+ 'page_title' => $title->getDBkey() )
+ );
}
/**
@@ -271,16 +283,39 @@ class Revision {
* @return ResultWrapper
*/
private static function fetchFromConds( $db, $conditions ) {
- $fields = self::selectFields();
- $fields[] = 'page_namespace';
- $fields[] = 'page_title';
- $fields[] = 'page_latest';
+ $fields = array_merge(
+ self::selectFields(),
+ self::selectPageFields(),
+ self::selectUserFields()
+ );
return $db->select(
- array( 'page', 'revision' ),
+ array( 'revision', 'page', 'user' ),
$fields,
$conditions,
__METHOD__,
- array( 'LIMIT' => 1 ) );
+ array( 'LIMIT' => 1 ),
+ array( 'page' => self::pageJoinCond(), 'user' => self::userJoinCond() )
+ );
+ }
+
+ /**
+ * Return the value of a select() JOIN conds array for the user table.
+ * This will get user table rows for logged-in users.
+ * @since 1.19
+ * @return Array
+ */
+ public static function userJoinCond() {
+ return array( 'LEFT JOIN', array( 'rev_user != 0', 'user_id = rev_user' ) );
+ }
+
+ /**
+ * Return the value of a select() page conds array for the paeg table.
+ * This will assure that the revision(s) are not orphaned from live pages.
+ * @since 1.19
+ * @return Array
+ */
+ public static function pageJoinCond() {
+ return array( 'INNER JOIN', array( 'page_id = rev_page' ) );
}
/**
@@ -294,12 +329,13 @@ class Revision {
'rev_text_id',
'rev_timestamp',
'rev_comment',
- 'rev_user_text,'.
+ 'rev_user_text',
'rev_user',
'rev_minor_edit',
'rev_deleted',
'rev_len',
- 'rev_parent_id'
+ 'rev_parent_id',
+ 'rev_sha1'
);
}
@@ -307,7 +343,7 @@ class Revision {
* Return the list of text fields that should be selected to read the
* revision text
*/
- static function selectTextFields() {
+ public static function selectTextFields() {
return array(
'old_text',
'old_flags'
@@ -317,15 +353,23 @@ class Revision {
/**
* Return the list of page fields that should be selected from page table
*/
- static function selectPageFields() {
+ public static function selectPageFields() {
return array(
'page_namespace',
'page_title',
+ 'page_id',
'page_latest'
);
}
/**
+ * Return the list of user fields that should be selected from user table
+ */
+ public static function selectUserFields() {
+ return array( 'user_name' );
+ }
+
+ /**
* Constructor
*
* @param $row Mixed: either a database row or an array
@@ -337,21 +381,28 @@ class Revision {
$this->mPage = intval( $row->rev_page );
$this->mTextId = intval( $row->rev_text_id );
$this->mComment = $row->rev_comment;
- $this->mUserText = $row->rev_user_text;
$this->mUser = intval( $row->rev_user );
$this->mMinorEdit = intval( $row->rev_minor_edit );
$this->mTimestamp = $row->rev_timestamp;
$this->mDeleted = intval( $row->rev_deleted );
- if( !isset( $row->rev_parent_id ) )
- $this->mParentId = is_null($row->rev_parent_id) ? null : 0;
- else
+ if( !isset( $row->rev_parent_id ) ) {
+ $this->mParentId = is_null( $row->rev_parent_id ) ? null : 0;
+ } else {
$this->mParentId = intval( $row->rev_parent_id );
+ }
- if( !isset( $row->rev_len ) || is_null( $row->rev_len ) )
+ if( !isset( $row->rev_len ) || is_null( $row->rev_len ) ) {
$this->mSize = null;
- else
+ } else {
$this->mSize = intval( $row->rev_len );
+ }
+
+ if ( !isset( $row->rev_sha1 ) ) {
+ $this->mSha1 = null;
+ } else {
+ $this->mSha1 = $row->rev_sha1;
+ }
if( isset( $row->page_latest ) ) {
$this->mCurrent = ( $row->rev_id == $row->page_latest );
@@ -369,9 +420,18 @@ class Revision {
// 'text' table row entry will be lazy-loaded
$this->mTextRow = null;
}
+
+ // Use user_name for users and rev_user_text for IPs...
+ $this->mUserText = null; // lazy load if left null
+ if ( $this->mUser == 0 ) {
+ $this->mUserText = $row->rev_user_text; // IP user
+ } elseif ( isset( $row->user_name ) ) {
+ $this->mUserText = $row->user_name; // logged-in user
+ }
+ $this->mOrigUserText = $row->rev_user_text;
} elseif( is_array( $row ) ) {
// Build a new revision to be saved...
- global $wgUser;
+ global $wgUser; // ugh
$this->mId = isset( $row['id'] ) ? intval( $row['id'] ) : null;
$this->mPage = isset( $row['page'] ) ? intval( $row['page'] ) : null;
@@ -379,10 +439,11 @@ class Revision {
$this->mUserText = isset( $row['user_text'] ) ? strval( $row['user_text'] ) : $wgUser->getName();
$this->mUser = isset( $row['user'] ) ? intval( $row['user'] ) : $wgUser->getId();
$this->mMinorEdit = isset( $row['minor_edit'] ) ? intval( $row['minor_edit'] ) : 0;
- $this->mTimestamp = isset( $row['timestamp'] ) ? strval( $row['timestamp'] ) : wfTimestamp( TS_MW );
+ $this->mTimestamp = isset( $row['timestamp'] ) ? strval( $row['timestamp'] ) : wfTimestampNow();
$this->mDeleted = isset( $row['deleted'] ) ? intval( $row['deleted'] ) : 0;
$this->mSize = isset( $row['len'] ) ? intval( $row['len'] ) : null;
$this->mParentId = isset( $row['parent_id'] ) ? intval( $row['parent_id'] ) : null;
+ $this->mSha1 = isset( $row['sha1'] ) ? strval( $row['sha1'] ) : null;
// Enforce spacing trimming on supplied text
$this->mComment = isset( $row['comment'] ) ? trim( strval( $row['comment'] ) ) : null;
@@ -391,9 +452,14 @@ class Revision {
$this->mTitle = null; # Load on demand if needed
$this->mCurrent = false;
- # If we still have no len_size, see it we have the text to figure it out
- if ( !$this->mSize )
- $this->mSize = is_null( $this->mText ) ? null : strlen( $this->mText );
+ # If we still have no length, see it we have the text to figure it out
+ if ( !$this->mSize ) {
+ $this->mSize = is_null( $this->mText ) ? null : strlen( $this->mText );
+ }
+ # Same for sha1
+ if ( $this->mSha1 === null ) {
+ $this->mSha1 = is_null( $this->mText ) ? null : self::base36Sha1( $this->mText );
+ }
} else {
throw new MWException( 'Revision constructor passed invalid row format.' );
}
@@ -410,6 +476,16 @@ class Revision {
}
/**
+ * Set the revision ID
+ *
+ * @since 1.19
+ * @param $id Integer
+ */
+ public function setId( $id ) {
+ $this->mId = $id;
+ }
+
+ /**
* Get text row ID
*
* @return Integer
@@ -437,6 +513,15 @@ class Revision {
}
/**
+ * Returns the base36 sha1 of the text in this revision, or null if unknown.
+ *
+ * @return String
+ */
+ public function getSha1() {
+ return $this->mSha1;
+ }
+
+ /**
* Returns the title of the page associated with this entry.
*
* @return Title
@@ -448,13 +533,12 @@ class Revision {
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow(
array( 'page', 'revision' ),
- array( 'page_namespace', 'page_title' ),
+ self::selectPageFields(),
array( 'page_id=rev_page',
'rev_id' => $this->mId ),
- 'Revision::getTitle' );
- if( $row ) {
- $this->mTitle = Title::makeTitle( $row->page_namespace,
- $row->page_title );
+ __METHOD__ );
+ if ( $row ) {
+ $this->mTitle = Title::newFromRow( $row );
}
return $this->mTitle;
}
@@ -486,14 +570,14 @@ class Revision {
* Revision::FOR_PUBLIC to be displayed to all users
* Revision::FOR_THIS_USER to be displayed to $wgUser
* Revision::RAW get the ID regardless of permissions
- *
- *
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return Integer
*/
- public function getUser( $audience = self::FOR_PUBLIC ) {
+ public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
return 0;
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER ) ) {
+ } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
return 0;
} else {
return $this->mUser;
@@ -518,16 +602,17 @@ class Revision {
* Revision::FOR_PUBLIC to be displayed to all users
* Revision::FOR_THIS_USER to be displayed to $wgUser
* Revision::RAW get the text regardless of permissions
- *
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return string
*/
- public function getUserText( $audience = self::FOR_PUBLIC ) {
+ public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
return '';
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER ) ) {
+ } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
return '';
} else {
- return $this->mUserText;
+ return $this->getRawUserText();
}
}
@@ -537,6 +622,14 @@ class Revision {
* @return String
*/
public function getRawUserText() {
+ if ( $this->mUserText === null ) {
+ $this->mUserText = User::whoIs( $this->mUser ); // load on demand
+ if ( $this->mUserText === false ) {
+ # This shouldn't happen, but it can if the wiki was recovered
+ # via importing revs and there is no user table entry yet.
+ $this->mUserText = $this->mOrigUserText;
+ }
+ }
return $this->mUserText;
}
@@ -549,13 +642,14 @@ class Revision {
* Revision::FOR_PUBLIC to be displayed to all users
* Revision::FOR_THIS_USER to be displayed to $wgUser
* Revision::RAW get the text regardless of permissions
- *
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return String
*/
- function getComment( $audience = self::FOR_PUBLIC ) {
+ function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
return '';
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT ) ) {
+ } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
return '';
} else {
return $this->mComment;
@@ -600,7 +694,7 @@ class Revision {
}
/**
- * int $field one of DELETED_* bitfield constants
+ * @param $field int one of DELETED_* bitfield constants
*
* @return Boolean
*/
@@ -610,6 +704,8 @@ class Revision {
/**
* Get the deletion bitfield of the revision
+ *
+ * @return int
*/
public function getVisibility() {
return (int)$this->mDeleted;
@@ -624,13 +720,14 @@ class Revision {
* Revision::FOR_PUBLIC to be displayed to all users
* Revision::FOR_THIS_USER to be displayed to $wgUser
* Revision::RAW get the text regardless of permissions
- *
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return String
*/
- public function getText( $audience = self::FOR_PUBLIC ) {
+ public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
return '';
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT ) ) {
+ } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
return '';
} else {
return $this->getRawText();
@@ -644,7 +741,7 @@ class Revision {
* @return String
*/
public function revText() {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
return $this->getText( self::FOR_THIS_USER );
}
@@ -894,8 +991,12 @@ class Revision {
'rev_timestamp' => $dbw->timestamp( $this->mTimestamp ),
'rev_deleted' => $this->mDeleted,
'rev_len' => $this->mSize,
- 'rev_parent_id' => is_null($this->mParentId) ?
- $this->getPreviousRevisionId( $dbw ) : $this->mParentId
+ 'rev_parent_id' => is_null( $this->mParentId )
+ ? $this->getPreviousRevisionId( $dbw )
+ : $this->mParentId,
+ 'rev_sha1' => is_null( $this->mSha1 )
+ ? Revision::base36Sha1( $this->mText )
+ : $this->mSha1
), __METHOD__
);
@@ -908,6 +1009,15 @@ class Revision {
}
/**
+ * Get the base 36 SHA-1 value for a string of text
+ * @param $text String
+ * @return String
+ */
+ public static function base36Sha1( $text ) {
+ return wfBaseConvert( sha1( $text ), 16, 36, 31 );
+ }
+
+ /**
* Lazy-load the revision's text.
* Currently hardcoded to the 'text' table storage engine.
*
@@ -986,7 +1096,7 @@ class Revision {
$current = $dbw->selectRow(
array( 'page', 'revision' ),
- array( 'page_latest', 'rev_text_id', 'rev_len' ),
+ array( 'page_latest', 'rev_text_id', 'rev_len', 'rev_sha1' ),
array(
'page_id' => $pageId,
'page_latest=rev_id',
@@ -1000,7 +1110,8 @@ class Revision {
'minor_edit' => $minor,
'text_id' => $current->rev_text_id,
'parent_id' => $current->page_latest,
- 'len' => $current->rev_len
+ 'len' => $current->rev_len,
+ 'sha1' => $current->rev_sha1
) );
} else {
$revision = null;
@@ -1017,10 +1128,11 @@ class Revision {
* @param $field Integer:one of self::DELETED_TEXT,
* self::DELETED_COMMENT,
* self::DELETED_USER
+ * @param $user User object to check, or null to use $wgUser
* @return Boolean
*/
- public function userCan( $field ) {
- return self::userCanBitfield( $this->mDeleted, $field );
+ public function userCan( $field, User $user = null ) {
+ return self::userCanBitfield( $this->mDeleted, $field, $user );
}
/**
@@ -1032,11 +1144,11 @@ class Revision {
* @param $field Integer: one of self::DELETED_TEXT = File::DELETED_FILE,
* self::DELETED_COMMENT = File::DELETED_COMMENT,
* self::DELETED_USER = File::DELETED_USER
+ * @param $user User object to check, or null to use $wgUser
* @return Boolean
*/
- public static function userCanBitfield( $bitfield, $field ) {
+ public static function userCanBitfield( $bitfield, $field, User $user = null ) {
if( $bitfield & $field ) { // aspect is deleted
- global $wgUser;
if ( $bitfield & self::DELETED_RESTRICTED ) {
$permission = 'suppressrevision';
} elseif ( $field & self::DELETED_TEXT ) {
@@ -1045,7 +1157,11 @@ class Revision {
$permission = 'deletedhistory';
}
wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
- return $wgUser->isAllowed( $permission );
+ if ( $user === null ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
+ return $user->isAllowed( $permission );
} else {
return true;
}
@@ -1106,11 +1222,3 @@ class Revision {
return 0;
}
}
-
-/**
- * Aliases for backwards compatibility with 1.6
- */
-define( 'MW_REV_DELETED_TEXT', Revision::DELETED_TEXT );
-define( 'MW_REV_DELETED_COMMENT', Revision::DELETED_COMMENT );
-define( 'MW_REV_DELETED_USER', Revision::DELETED_USER );
-define( 'MW_REV_DELETED_RESTRICTED', Revision::DELETED_RESTRICTED );
diff --git a/includes/RevisionList.php b/includes/RevisionList.php
index ae067ead..814e2dfa 100644
--- a/includes/RevisionList.php
+++ b/includes/RevisionList.php
@@ -2,15 +2,11 @@
/**
* List for revision table items for a single page
*/
-abstract class Rev_List {
+abstract class RevisionListBase extends ContextSource {
/**
* @var Title
*/
var $title;
- /**
- * @var IContextSource
- */
- var $context;
var $ids, $res, $current;
@@ -20,7 +16,7 @@ abstract class Rev_List {
* @param $title Title
*/
function __construct( IContextSource $context, Title $title ) {
- $this->context = $context;
+ $this->setContext( $context );
$this->title = $title;
}
@@ -104,38 +100,20 @@ abstract class Rev_List {
* @param $row stdclass
*/
abstract public function newItem( $row );
-
- /**
- * Get the language of the user doing the action
- *
- * @return Language object
- */
- public function getLang() {
- return $this->context->getLang();
- }
-
- /**
- * Get the user doing the action
- *
- * @return User object
- */
- public function getUser() {
- return $this->context->getUser();
- }
}
/**
* Abstract base class for revision items
*/
-abstract class Rev_Item {
- /** The parent Rev_List */
+abstract class RevisionItemBase {
+ /** The parent RevisionListBase */
var $list;
/** The DB result row */
var $row;
/**
- * @param $list Rev_List
+ * @param $list RevisionListBase
* @param $row DB result row
*/
public function __construct( $list, $row ) {
@@ -184,19 +162,19 @@ abstract class Rev_Item {
}
/**
- * Get the date, formatted with $wgLang
+ * Get the date, formatted in user's languae
*/
public function formatDate() {
- global $wgLang;
- return $wgLang->date( $this->getTimestamp() );
+ return $this->list->getLanguage()->userDate( $this->getTimestamp(),
+ $this->list->getUser() );
}
/**
- * Get the time, formatted with $wgLang
+ * Get the time, formatted in user's languae
*/
public function formatTime() {
- global $wgLang;
- return $wgLang->time( $this->getTimestamp() );
+ return $this->list->getLanguage()->userTime( $this->getTimestamp(),
+ $this->list->getUser() );
}
/**
@@ -240,7 +218,7 @@ abstract class Rev_Item {
abstract public function getHTML();
}
-class RevisionList extends Rev_List {
+class RevisionList extends RevisionListBase {
public function getType() {
return 'revision';
}
@@ -250,19 +228,19 @@ class RevisionList extends Rev_List {
* @return mixed
*/
public function doQuery( $db ) {
- $conds = array(
- 'rev_page' => $this->title->getArticleID(),
- 'rev_page = page_id'
- );
+ $conds = array( 'rev_page' => $this->title->getArticleID() );
if ( $this->ids !== null ) {
$conds['rev_id'] = array_map( 'intval', $this->ids );
}
return $db->select(
- array( 'revision', 'page' ),
- '*',
+ array( 'revision', 'page', 'user' ),
+ array_merge( Revision::selectFields(), Revision::selectUserFields() ),
$conds,
__METHOD__,
- array( 'ORDER BY' => 'rev_id DESC' )
+ array( 'ORDER BY' => 'rev_id DESC' ),
+ array(
+ 'page' => Revision::pageJoinCond(),
+ 'user' => Revision::userJoinCond() )
);
}
@@ -274,7 +252,7 @@ class RevisionList extends Rev_List {
/**
* Item class for a live revision table row
*/
-class RevisionItem extends Rev_Item {
+class RevisionItem extends RevisionItemBase {
var $revision, $context;
public function __construct( $list, $row ) {
@@ -296,15 +274,15 @@ class RevisionItem extends Rev_Item {
}
public function getAuthorNameField() {
- return 'rev_user_text';
+ return 'user_name'; // see Revision::selectUserFields()
}
public function canView() {
- return $this->revision->userCan( Revision::DELETED_RESTRICTED );
+ return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() );
}
public function canViewContent() {
- return $this->revision->userCan( Revision::DELETED_TEXT );
+ return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() );
}
public function isDeleted() {
@@ -316,7 +294,7 @@ class RevisionItem extends Rev_Item {
* Overridden by RevDel_ArchiveItem.
*/
protected function getRevisionLink() {
- $date = $this->list->getLang()->timeanddate( $this->revision->getTimestamp(), true );
+ $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
if ( $this->isDeleted() && !$this->canViewContent() ) {
return $date;
}
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index d0e46f91..196abd9f 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -33,12 +33,20 @@ class Sanitizer {
* Regular expression to match various types of character references in
* Sanitizer::normalizeCharReferences and Sanitizer::decodeCharReferences
*/
- const CHAR_REFS_REGEX =
+ const CHAR_REFS_REGEX =
'/&([A-Za-z0-9\x80-\xff]+);
|&\#([0-9]+);
|&\#[xX]([0-9A-Fa-f]+);
|(&)/x';
+ /**
+ * Blacklist for evil uris like javascript:
+ * WARNING: DO NOT use this in any place that actually requires blacklisting
+ * for security reasons. There are NUMEROUS[1] ways to bypass blacklisting, the
+ * only way to be secure from javascript: uri based xss vectors is to whitelist
+ * things that you know are safe and deny everything else.
+ * [1]: http://ha.ckers.org/xss.html
+ */
const EVIL_URI_PATTERN = '!(^|\s|\*/\s*)(javascript|vbscript)([^\w]|$)!i';
const XMLNS_ATTRIBUTE_PATTERN = "/^xmlns:[:A-Z_a-z-.0-9]+$/";
@@ -327,7 +335,7 @@ class Sanitizer {
$attribFirst = '[:A-Z_a-z0-9]';
$attrib = '[:A-Z_a-z-.0-9]';
$space = '[\x09\x0a\x0d\x20]';
- self::$attribsRegex =
+ self::$attribsRegex =
"/(?:^|$space)({$attribFirst}{$attrib}*)
($space*=$space*
(?:
@@ -449,16 +457,26 @@ class Sanitizer {
# and see if we find a match below them
$optstack = array();
array_push( $optstack, $ot );
- $ot = @array_pop( $tagstack );
+ wfSuppressWarnings();
+ $ot = array_pop( $tagstack );
+ wfRestoreWarnings();
while ( $ot != $t && isset( $htmlsingleallowed[$ot] ) ) {
array_push( $optstack, $ot );
- $ot = @array_pop( $tagstack );
+ wfSuppressWarnings();
+ $ot = array_pop( $tagstack );
+ wfRestoreWarnings();
}
if ( $t != $ot ) {
# No match. Push the optional elements back again
$badtag = true;
- while ( $ot = @array_pop( $optstack ) ) {
+ wfSuppressWarnings();
+ $ot = array_pop( $optstack );
+ wfRestoreWarnings();
+ while ( $ot ) {
array_push( $tagstack, $ot );
+ wfSuppressWarnings();
+ $ot = array_pop( $optstack );
+ wfRestoreWarnings();
}
}
} else {
@@ -595,6 +613,102 @@ class Sanitizer {
}
/**
+ * Take an array of attribute names and values and fix some deprecated values
+ * for the given element type.
+ * This does not validate properties, so you should ensure that you call
+ * validateTagAttributes AFTER this to ensure that the resulting style rule
+ * this may add is safe.
+ *
+ * - Converts most presentational attributes like align into inline css
+ *
+ * @param $attribs Array
+ * @param $element String
+ * @return Array
+ */
+ static function fixDeprecatedAttributes( $attribs, $element ) {
+ global $wgHtml5, $wgCleanupPresentationalAttributes;
+
+ // presentational attributes were removed from html5, we can leave them
+ // in when html5 is turned off
+ if ( !$wgHtml5 || !$wgCleanupPresentationalAttributes ) {
+ return $attribs;
+ }
+
+ $table = array( 'table' );
+ $cells = array( 'td', 'th' );
+ $colls = array( 'col', 'colgroup' );
+ $tblocks = array( 'tbody', 'tfoot', 'thead' );
+ $h = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' );
+
+ $presentationalAttribs = array(
+ 'align' => array( 'text-align', array_merge( array( 'caption', 'hr', 'div', 'p', 'tr' ), $table, $cells, $colls, $tblocks, $h ) ),
+ 'clear' => array( 'clear', array( 'br' ) ),
+ 'height' => array( 'height', $cells ),
+ 'nowrap' => array( 'white-space', $cells ),
+ 'size' => array( 'height', array( 'hr' ) ),
+ 'type' => array( 'list-style-type', array( 'li', 'ol', 'ul' ) ),
+ 'valign' => array( 'vertical-align', array_merge( $cells, $colls, $tblocks ) ),
+ 'width' => array( 'width', array_merge( array( 'hr', 'pre' ), $table, $cells, $colls ) ),
+ );
+
+ // Ensure that any upper case or mixed case attributes are converted to lowercase
+ foreach ( $attribs as $attribute => $value ) {
+ if ( $attribute !== strtolower( $attribute ) && array_key_exists( strtolower( $attribute ), $presentationalAttribs ) ) {
+ $attribs[strtolower( $attribute )] = $value;
+ unset( $attribs[$attribute] );
+ }
+ }
+
+ $style = "";
+ foreach ( $presentationalAttribs as $attribute => $info ) {
+ list( $property, $elements ) = $info;
+
+ // Skip if this attribute is not relevant to this element
+ if ( !in_array( $element, $elements ) ) {
+ continue;
+ }
+
+ // Skip if the attribute is not used
+ if ( !array_key_exists( $attribute, $attribs ) ) {
+ continue;
+ }
+
+ $value = $attribs[$attribute];
+
+ // For nowrap the value should be nowrap instead of whatever text is in the value
+ if ( $attribute === 'nowrap' ) {
+ $value = 'nowrap';
+ }
+
+ // clear="all" is clear: both; in css
+ if ( $attribute === 'clear' && strtolower( $value ) === 'all' ) {
+ $value = 'both';
+ }
+
+ // Size based properties should have px applied to them if they have no unit
+ if ( in_array( $attribute, array( 'height', 'width', 'size' ) ) ) {
+ if ( preg_match( '/^[\d.]+$/', $value ) ) {
+ $value = "{$value}px";
+ }
+ }
+
+ $style .= " $property: $value;";
+
+ unset( $attribs[$attribute] );
+ }
+
+ if ( $style ) {
+ // Prepend our style rules so that they can be overridden by user css
+ if ( isset($attribs['style']) ) {
+ $style .= " " . $attribs['style'];
+ }
+ $attribs['style'] = trim($style);
+ }
+
+ return $attribs;
+ }
+
+ /**
* Take an array of attribute names and values and normalize or discard
* illegal values for the given element type.
*
@@ -662,7 +776,7 @@ class Sanitizer {
}
//RDFa and microdata properties allow URLs, URIs and/or CURIs. check them for sanity
- if ( $attribute === 'rel' || $attribute === 'rev' ||
+ 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
@@ -670,7 +784,7 @@ class Sanitizer {
//Paranoia. Allow "simple" values but suppress javascript
if ( preg_match( self::EVIL_URI_PATTERN, $value ) ) {
- continue;
+ continue;
}
}
@@ -735,7 +849,7 @@ class Sanitizer {
* returned string may contain character references given certain
* clever input strings. These character references must
* be escaped before the return value is embedded in HTML.
- *
+ *
* @param $value String
* @return String
*/
@@ -757,7 +871,7 @@ class Sanitizer {
$space = '[\\x20\\t\\r\\n\\f]';
$nl = '(?:\\n|\\r\\n|\\r|\\f)';
$backslash = '\\\\';
- $decodeRegex = "/ $backslash
+ $decodeRegex = "/ $backslash
(?:
($nl) | # 1. Line continuation
([0-9A-Fa-f]{1,6})$space? | # 2. character number
@@ -767,7 +881,7 @@ class Sanitizer {
}
$value = preg_replace_callback( $decodeRegex,
array( __CLASS__, 'cssDecodeCallback' ), $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
@@ -841,8 +955,9 @@ class Sanitizer {
return '';
}
- $stripped = Sanitizer::validateTagAttributes(
- Sanitizer::decodeTagAttributes( $text ), $element );
+ $decoded = Sanitizer::decodeTagAttributes( $text );
+ $decoded = Sanitizer::fixDeprecatedAttributes( $decoded, $element );
+ $stripped = Sanitizer::validateTagAttributes( $decoded, $element );
$attribs = array();
foreach( $stripped as $attribute => $value ) {
@@ -1341,7 +1456,7 @@ class Sanitizer {
if ( $wgAllowRdfaAttributes ) {
#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',
) );
}
@@ -1458,7 +1573,7 @@ class Sanitizer {
'th' => array_merge( $common, $tablecell, $tablealign ),
# 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
+ 'a' => array_merge( $common, array( 'href', 'rel', 'rev' ) ), # rel/rev esp. for RDFa
# 13.2
# Not usually allowed, but may be used for extension-style hooks
@@ -1549,7 +1664,7 @@ class Sanitizer {
$url = Sanitizer::decodeCharReferences( $url );
# Escape any control characters introduced by the above step
- $url = preg_replace_callback( '/[\][<>"\\x00-\\x20\\x7F\|]/',
+ $url = preg_replace_callback( '/[\][<>"\\x00-\\x20\\x7F\|]/',
array( __CLASS__, 'cleanUrlCallback' ), $url );
# Validate hostname portion
@@ -1573,7 +1688,7 @@ class Sanitizer {
\xe1\xa0\x8d| # 180d MONGOLIAN FREE VARIATION SELECTOR THREE
\xe2\x80\x8c| # 200c ZERO WIDTH NON-JOINER
\xe2\x80\x8d| # 200d ZERO WIDTH JOINER
- [\xef\xb8\x80-\xef\xb8\x8f] # fe00-fe00f VARIATION SELECTOR-1-16
+ [\xef\xb8\x80-\xef\xb8\x8f] # fe00-fe0f VARIATION SELECTOR-1-16
/xuD";
$host = preg_replace( $strip, '', $host );
@@ -1617,6 +1732,8 @@ class Sanitizer {
* to be liberal enough for wide use. Some invalid addresses will still
* pass validation here.
*
+ * @since 1.18
+ *
* @param $addr String E-mail address
* @return Bool
*/
diff --git a/includes/SeleniumWebSettings.php b/includes/SeleniumWebSettings.php
index 56afa929..34d829ca 100644
--- a/includes/SeleniumWebSettings.php
+++ b/includes/SeleniumWebSettings.php
@@ -201,21 +201,3 @@ function switchToTestResources( $testResourceName, $switchDB = true ) {
$testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
$wgUploadPath = $testUploadPath;
}
-
-function wfRecursiveRemoveDir( $dir ) {
- // taken from http://de3.php.net/manual/en/function.rmdir.php#98622
- if ( is_dir( $dir ) ) {
- $objects = scandir( $dir );
- foreach ( $objects as $object ) {
- if ( $object != "." && $object != ".." ) {
- if ( filetype( $dir . '/' . $object ) == "dir" ) {
- wfRecursiveRemoveDir( $dir . '/' . $object );
- } else {
- unlink( $dir . '/' . $object );
- }
- }
- }
- reset( $objects );
- rmdir( $dir );
- }
-} \ No newline at end of file
diff --git a/includes/Setup.php b/includes/Setup.php
index 815d24eb..3955937c 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -115,6 +115,19 @@ $wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
/**
+ * Initialise $wgLockManagers to include basic FS version
+ */
+$wgLockManagers[] = array(
+ 'name' => 'fsLockManager',
+ 'class' => 'FSLockManager',
+ 'lockDirectory' => "{$wgUploadDirectory}/lockdir",
+);
+$wgLockManagers[] = array(
+ 'name' => 'nullLockManager',
+ 'class' => 'NullLockManager',
+);
+
+/**
* Initialise $wgLocalFileRepo from backwards-compatible settings
*/
if ( !$wgLocalFileRepo ) {
@@ -163,7 +176,7 @@ if ( $wgUseSharedUploads ) {
);
} else {
$wgForeignFileRepos[] = array(
- 'class' => 'FSRepo',
+ 'class' => 'FileRepo',
'name' => 'shared',
'directory' => $wgSharedUploadDirectory,
'url' => $wgSharedUploadPath,
@@ -177,15 +190,33 @@ if ( $wgUseSharedUploads ) {
}
if ( $wgUseInstantCommons ) {
$wgForeignFileRepos[] = array(
- 'class' => 'ForeignAPIRepo',
- 'name' => 'wikimediacommons',
- 'apibase' => 'http://commons.wikimedia.org/w/api.php',
- 'hashLevels' => 2,
- 'fetchDescription' => true,
- 'descriptionCacheExpiry' => 43200,
- 'apiThumbCacheExpiry' => 86400,
+ '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,
+ 'descriptionCacheExpiry' => 43200,
+ 'apiThumbCacheExpiry' => 86400,
);
}
+/*
+ * Add on default file backend config for file repos.
+ * FileBackendGroup will handle initializing the backends.
+ */
+if ( !isset( $wgLocalFileRepo['backend'] ) ) {
+ $wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
+}
+foreach ( $wgForeignFileRepos as &$repo ) {
+ if ( !isset( $repo['directory'] ) && $repo['class'] === 'ForeignAPIRepo' ) {
+ $repo['directory'] = $wgUploadDirectory; // b/c
+ }
+ if ( !isset( $repo['backend'] ) ) {
+ $repo['backend'] = $repo['name'] . '-backend';
+ }
+}
+unset( $repo ); // no global pollution; destroy reference
if ( is_null( $wgEnableAutoRotation ) ) {
// Only enable auto-rotation when the bitmap handler can rotate
@@ -268,8 +299,10 @@ $wgContLanguageCode = $wgLanguageCode;
# Easy to forget to falsify $wgShowIPinHeader for static caches.
# If file cache or squid cache is on, just disable this (DWIMD).
+# Do the same for $wgDebugToolbar.
if ( $wgUseFileCache || $wgUseSquid ) {
$wgShowIPinHeader = false;
+ $wgDebugToolbar = false;
}
# $wgAllowRealName and $wgAllowUserSkin were removed in 1.16
@@ -320,16 +353,21 @@ if ( $wgNewUserLog ) {
$wgLogTypes[] = 'newusers';
$wgLogNames['newusers'] = 'newuserlogpage';
$wgLogHeaders['newusers'] = 'newuserlogpagetext';
- $wgLogActions['newusers/newusers'] = 'newuserlogentry'; // For compatibility with older log entries
- $wgLogActions['newusers/create'] = 'newuserlog-create-entry';
- $wgLogActions['newusers/create2'] = 'newuserlog-create2-entry';
- $wgLogActions['newusers/autocreate'] = 'newuserlog-autocreate-entry';
+ # newusers, create, create2, autocreate
+ $wgLogActionsHandlers['newusers/*'] = 'NewUsersLogFormatter';
}
if ( $wgCookieSecure === 'detect' ) {
$wgCookieSecure = ( substr( $wgServer, 0, 6 ) === 'https:' );
}
+// Disable MWDebug for command line mode, this prevents MWDebug from eating up
+// all the memory from logging SQL queries on maintenance scripts
+global $wgCommandLineMode;
+if ( $wgDebugToolbar && !$wgCommandLineMode ) {
+ MWDebug::init();
+}
+
if ( !defined( 'MW_COMPILED' ) ) {
if ( !MWInit::classExists( 'AutoLoader' ) ) {
require_once( "$IP/includes/AutoLoader.php" );
@@ -375,7 +413,6 @@ if( is_null( $wgLocalTZoffset ) ) {
}
# Useful debug output
-global $wgCommandLineMode;
if ( $wgCommandLineMode ) {
$wgRequest = new FauxRequest( array() );
@@ -466,12 +503,6 @@ $wgTitle = null;
$wgDeferredUpdateList = array();
-// We need to check for safe_mode, because mail() will throw an E_NOTICE
-// on additional parameters
-if( !is_null($wgAdditionalMailParams) && wfIniGetBool('safe_mode') ) {
- $wgAdditionalMailParams = null;
-}
-
wfProfileOut( $fname . '-globals' );
wfProfileIn( $fname . '-extensions' );
diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php
index ebdb08fe..8a977fb3 100644
--- a/includes/SiteConfiguration.php
+++ b/includes/SiteConfiguration.php
@@ -23,12 +23,12 @@ class SiteConfiguration {
* Array of domains that are local and can be handled by the same server
*/
public $localVHosts = array();
-
+
/**
* Optional callback to load full configuration data.
*/
public $fullLoadCallback = null;
-
+
/** Whether or not all data has been loaded */
public $fullLoadDone = false;
@@ -205,10 +205,6 @@ class SiteConfiguration {
return $this->wikis;
}
- /** A no-op */
- function initialise() {
- }
-
/**
* Retrieves the value of a given setting, and places it in a variable passed by reference.
* @param $setting String ID of the setting name to retrieve
@@ -308,7 +304,7 @@ class SiteConfiguration {
}
/**
- * Merge params beetween the ones passed to the function and the ones given
+ * Merge params between the ones passed to the function and the ones given
* by self::$siteParamsCallback for backward compatibility
* Values returned by self::getWikiParams() have the priority.
*
diff --git a/includes/SiteStats.php b/includes/SiteStats.php
index d61d4fc7..abb11306 100644
--- a/includes/SiteStats.php
+++ b/includes/SiteStats.php
@@ -5,7 +5,7 @@
*/
class SiteStats {
static $row, $loaded = false;
- static $admins, $jobs;
+ static $jobs;
static $pageCount = array();
static $groupMemberCounts = array();
@@ -207,7 +207,7 @@ class SiteStats {
}
// Now check for underflow/overflow
foreach( array( 'total_views', 'total_edits', 'good_articles',
- 'total_pages', 'users', 'admins', 'images' ) as $member ) {
+ 'total_pages', 'users', 'images' ) as $member ) {
if(
$row->{"ss_$member"} > 2000000000
|| $row->{"ss_$member"} < 0
@@ -220,9 +220,9 @@ class SiteStats {
}
/**
- *
+ * Class for handling updates to the site_stats table
*/
-class SiteStatsUpdate {
+class SiteStatsUpdate implements DeferrableUpdate {
var $mViews, $mEdits, $mGood, $mPages, $mUsers;
@@ -268,9 +268,9 @@ class SiteStatsUpdate {
$sql = "UPDATE $site_stats SET $updates";
# Need a separate transaction because this a global lock
- $dbw->begin();
+ $dbw->begin( __METHOD__ );
$dbw->query( $sql, __METHOD__ );
- $dbw->commit();
+ $dbw->commit( __METHOD__ );
}
}
@@ -407,9 +407,9 @@ class SiteStatsInit {
/**
* Do all updates and commit them. More or less a replacement
- * for the original initStats, but without the calls to wfOut()
+ * for the original initStats, but without output.
*
- * @param $database Boolean or DatabaseBase:
+ * @param $database DatabaseBase|bool
* - Boolean: whether to use the master DB
* - DatabaseBase: database connection to use
* @param $options Array of options, may contain the following values
diff --git a/includes/Skin.php b/includes/Skin.php
index 83e9ee98..430537d4 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -22,7 +22,7 @@ abstract class Skin extends ContextSource {
/**
* Fetch the set of available skins.
- * @return array of strings
+ * @return associative array of strings
*/
static function getSkinNames() {
global $wgValidSkinNames;
@@ -55,6 +55,18 @@ abstract class Skin extends ContextSource {
}
return $wgValidSkinNames;
}
+
+ /**
+ * Fetch the skinname messages for available skins.
+ * @return array of strings
+ */
+ static function getSkinNameMessages() {
+ $messages = array();
+ foreach( self::getSkinNames() as $skinKey => $skinName ) {
+ $messages[] = "skinname-$skinKey";
+ }
+ return $messages;
+ }
/**
* Fetch the list of usable skins in regards to $wgSkipSkins.
@@ -156,25 +168,22 @@ abstract class Skin extends ContextSource {
}
}
}
- $skin = new $className;
+ $skin = new $className( $key );
return $skin;
}
- /** @return string path to the skin stylesheet */
- function getStylesheet() {
- return 'common/wikistandard.css';
- }
-
/** @return string skin name */
public function getSkinName() {
return $this->skinname;
}
+ /**
+ * @param $out OutputPage
+ */
function initPage( OutputPage $out ) {
wfProfileIn( __METHOD__ );
$this->preloadExistence();
- $this->setMembers();
wfProfileOut( __METHOD__ );
}
@@ -189,7 +198,7 @@ abstract class Skin extends ContextSource {
$titles = array( $user->getUserPage(), $user->getTalkPage() );
// Other tab link
- if ( $this->getTitle()->getNamespace() == NS_SPECIAL ) {
+ if ( $this->getTitle()->isSpecialPage() ) {
// nothing
} elseif ( $this->getTitle()->isTalkPage() ) {
$titles[] = $this->getTitle()->getSubjectPage();
@@ -203,13 +212,6 @@ abstract class Skin extends ContextSource {
}
/**
- * Set some local variables
- */
- protected function setMembers() {
- $this->userpage = $this->getUser()->getUserPage()->getPrefixedText();
- }
-
- /**
* Get the current revision ID
*
* @return Integer
@@ -282,7 +284,7 @@ abstract class Skin extends ContextSource {
$this->mRelevantUser = User::newFromName( $rootUser, false );
} else {
$user = User::newFromName( $rootUser, false );
- if ( $user->isLoggedIn() ) {
+ if ( $user && $user->isLoggedIn() ) {
$this->mRelevantUser = $user;
}
}
@@ -295,8 +297,12 @@ abstract class Skin extends ContextSource {
* Outputs the HTML generated by other functions.
* @param $out OutputPage
*/
- abstract function outputPage( OutputPage $out );
+ abstract function outputPage( OutputPage $out = null );
+ /**
+ * @param $data array
+ * @return string
+ */
static function makeVariablesScript( $data ) {
if ( $data ) {
return Html::inlineScript(
@@ -308,103 +314,9 @@ abstract class Skin extends ContextSource {
}
/**
- * To make it harder for someone to slip a user a fake
- * user-JavaScript or user-CSS preview, a random token
- * is associated with the login session. If it's not
- * passed back with the preview request, we won't render
- * the code.
- *
- * @param $action String: 'edit', 'submit' etc.
- * @return bool
- */
- public function userCanPreview( $action ) {
- if ( $action != 'submit' ) {
- return false;
- }
- if ( !$this->getRequest()->wasPosted() ) {
- return false;
- }
- if ( !$this->getTitle()->userCanEditCssSubpage() ) {
- return false;
- }
- if ( !$this->getTitle()->userCanEditJsSubpage() ) {
- return false;
- }
-
- return $this->getUser()->matchEditToken(
- $this->getRequest()->getVal( 'wpEditToken' ) );
- }
-
- /**
- * Generated JavaScript action=raw&gen=js
- * This used to load MediaWiki:Common.js and the skin-specific style
- * before the ResourceLoader.
- *
- * @deprecated since 1.18 Use the ResourceLoader instead. This may be removed at some
- * point.
- * @param $skinName String: If set, overrides the skin name
- * @return String
- */
- public function generateUserJs( $skinName = null ) {
- return '';
- }
-
- /**
- * Generate user stylesheet for action=raw&gen=css
- *
- * @deprecated since 1.18 Use the ResourceLoader instead. This may be removed at some
- * point.
- * @return String
- */
- public function generateUserStylesheet() {
- return '';
- }
-
- /**
- * @private
- * @todo document
- * @param $out OutputPage
- */
- function setupUserCss( OutputPage $out ) {
- global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs;
-
- wfProfileIn( __METHOD__ );
-
- $this->setupSkinUserCss( $out );
- // Add any extension CSS
- foreach ( $out->getExtStyle() as $url ) {
- $out->addStyle( $url );
- }
-
- // Per-site custom styles
- if ( $wgUseSiteCss ) {
- $out->addModuleStyles( array( 'site', 'noscript' ) );
- if( $this->getUser()->isLoggedIn() ){
- $out->addModuleStyles( 'user.groups' );
- }
- }
-
- // Per-user custom styles
- if ( $wgAllowUserCss ) {
- if ( $this->getTitle()->isCssSubpage() && $this->userCanPreview( $this->getRequest()->getVal( 'action' ) ) ) {
- // @todo FIXME: Properly escape the cdata!
- $out->addInlineStyle( $this->getRequest()->getText( 'wpTextbox1' ) );
- } else {
- $out->addModuleStyles( 'user' );
- }
- }
-
- // Per-user preference styles
- if ( $wgAllowUserCssPrefs ) {
- $out->addModuleStyles( 'user.options' );
- }
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
* Make a <script> tag containing global variables
*
+ * @deprecated in 1.19
* @param $unused Unused
* @return string HTML fragment
*/
@@ -449,10 +361,9 @@ abstract class Skin extends ContextSource {
* @return String
*/
function getPageClasses( $title ) {
- global $wgRequest;
$numeric = 'ns-' . $title->getNamespace();
- if ( $title->getNamespace() == NS_SPECIAL ) {
+ if ( $title->isSpecialPage() ) {
$type = 'ns-special';
// bug 23315: provide a class based on the canonical special page name without subpages
list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
@@ -468,13 +379,8 @@ abstract class Skin extends ContextSource {
}
$name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() );
-
- if ( $wgRequest->getVal('action') ) {
- $action = 'action-' . $wgRequest->getVal('action');
- } else {
- $action = 'action-view';
- }
- return "$numeric $type $name $action";
+
+ return "$numeric $type $name";
}
/**
@@ -497,43 +403,47 @@ abstract class Skin extends ContextSource {
return $wgLogo;
}
+ /**
+ * @return string
+ */
function getCategoryLinks() {
global $wgUseCategoryBrowser;
$out = $this->getOutput();
+ $allCats = $out->getCategoryLinks();
- if ( count( $out->mCategoryLinks ) == 0 ) {
+ if ( !count( $allCats ) ) {
return '';
}
$embed = "<li>";
$pop = "</li>";
- $allCats = $out->getCategoryLinks();
$s = '';
- $colon = wfMsgExt( 'colon-separator', 'escapenoentities' );
+ $colon = $this->msg( 'colon-separator' )->escaped();
if ( !empty( $allCats['normal'] ) ) {
$t = $embed . implode( "{$pop}{$embed}" , $allCats['normal'] ) . $pop;
- $msg = wfMsgExt( 'pagecategories', array( 'parsemag', 'escapenoentities' ), count( $allCats['normal'] ) );
- $s .= '<div id="mw-normal-catlinks">' .
- Linker::link( Title::newFromText( wfMsgForContent( 'pagecategorieslink' ) ), $msg )
+ $msg = $this->msg( 'pagecategories', count( $allCats['normal'] ) )->escaped();
+ $linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text();
+ $s .= '<div id="mw-normal-catlinks" class="mw-normal-catlinks">' .
+ Linker::link( Title::newFromText( $linkPage ), $msg )
. $colon . '<ul>' . $t . '</ul>' . '</div>';
}
# Hidden categories
if ( isset( $allCats['hidden'] ) ) {
if ( $this->getUser()->getBoolOption( 'showhiddencats' ) ) {
- $class = 'mw-hidden-cats-user-shown';
+ $class = ' mw-hidden-cats-user-shown';
} elseif ( $this->getTitle()->getNamespace() == NS_CATEGORY ) {
- $class = 'mw-hidden-cats-ns-shown';
+ $class = ' mw-hidden-cats-ns-shown';
} else {
- $class = 'mw-hidden-cats-hidden';
+ $class = ' mw-hidden-cats-hidden';
}
- $s .= "<div id=\"mw-hidden-catlinks\" class=\"$class\">" .
- wfMsgExt( 'hidden-categories', array( 'parsemag', 'escapenoentities' ), count( $allCats['hidden'] ) ) .
+ $s .= "<div id=\"mw-hidden-catlinks\" class=\"mw-hidden-catlinks$class\">" .
+ $this->msg( 'hidden-categories', count( $allCats['hidden'] ) )->escaped() .
$colon . '<ul>' . $embed . implode( "{$pop}{$embed}" , $allCats['hidden'] ) . $pop . '</ul>' .
'</div>';
}
@@ -577,12 +487,15 @@ abstract class Skin extends ContextSource {
# add our current element to the list
$eltitle = Title::newFromText( $element );
- $return .= Linker::link( $eltitle, $eltitle->getText() );
+ $return .= Linker::link( $eltitle, htmlspecialchars( $eltitle->getText() ) );
}
return $return;
}
+ /**
+ * @return string
+ */
function getCategories() {
$out = $this->getOutput();
@@ -645,15 +558,21 @@ abstract class Skin extends ContextSource {
protected function generateDebugHTML() {
global $wgShowDebug;
+ $html = MWDebug::getDebugHTML( $this->getContext() );
+
if ( $wgShowDebug ) {
$listInternals = $this->formatDebugHTML( $this->getOutput()->mDebugtext );
- return "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">" .
+ $html .= "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">" .
$listInternals . "</ul>\n";
}
- return '';
+ return $html;
}
+ /**
+ * @param $debugText string
+ * @return string
+ */
private function formatDebugHTML( $debugText ) {
global $wgDebugTimestamps;
@@ -665,7 +584,7 @@ abstract class Skin extends ContextSource {
$pre = '';
if ( $wgDebugTimestamps ) {
$matches = array();
- if ( preg_match( '/^(\d+\.\d+\s{2})/', $line, $matches ) ) {
+ if ( preg_match( '/^(\d+\.\d+ {1,3}\d+.\dM\s{2})/', $line, $matches ) ) {
$pre = $matches[1];
$line = substr( $line, strlen( $pre ) );
}
@@ -706,14 +625,14 @@ abstract class Skin extends ContextSource {
/**
* This gets called shortly before the </body> tag.
- * @param $out OutputPage object
+ *
* @return String HTML-wrapped JS code to be put before </body>
*/
- function bottomScripts( $out ) {
+ function bottomScripts() {
// TODO and the suckage continues. This function is really just a wrapper around
// OutputPage::getBottomScripts() which takes a Skin param. This should be cleaned
// up at some point
- $bottomScriptText = $out->getBottomScripts( $this );
+ $bottomScriptText = $this->getOutput()->getBottomScripts();
wfRunHooks( 'SkinAfterBottomScripts', array( $this, &$bottomScriptText ) );
return $bottomScriptText;
@@ -733,9 +652,12 @@ abstract class Skin extends ContextSource {
// oldid not available for non existing pages
$url = htmlspecialchars( $this->getTitle()->getCanonicalURL() );
}
- return wfMsg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' );
+ return $this->msg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' )->text();
}
+ /**
+ * @return String
+ */
function getUndeleteLink() {
$action = $this->getRequest()->getVal( 'action', 'view' );
@@ -751,22 +673,20 @@ abstract class Skin extends ContextSource {
$msg = 'viewdeleted';
}
- return wfMsg(
- $msg,
- Linker::link(
+ return $this->msg( $msg )->rawParams(
+ Linker::linkKnown(
SpecialPage::getTitleFor( 'Undelete', $this->getTitle()->getPrefixedDBkey() ),
- wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $this->getLang()->formatNum( $n ) ),
- array(),
- array(),
- array( 'known', 'noclasses' )
- )
- );
+ $this->msg( 'restorelink' )->numParams( $n )->escaped() )
+ )->text();
}
}
return '';
}
+ /**
+ * @return string
+ */
function subPageSubtitle() {
$out = $this->getOutput();
$subpages = '';
@@ -790,18 +710,15 @@ abstract class Skin extends ContextSource {
$linkObj = Title::newFromText( $growinglink );
if ( is_object( $linkObj ) && $linkObj->exists() ) {
- $getlink = $this->link(
+ $getlink = Linker::linkKnown(
$linkObj,
- htmlspecialchars( $display ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ htmlspecialchars( $display )
);
$c++;
if ( $c > 1 ) {
- $subpages .= wfMsgExt( 'pipe-separator', 'escapenoentities' );
+ $subpages .= $this->msg( 'pipe-separator' )->escaped();
} else {
$subpages .= '&lt; ';
}
@@ -828,22 +745,30 @@ abstract class Skin extends ContextSource {
return $wgShowIPinHeader && session_id() != '';
}
+ /**
+ * @return String
+ */
function getSearchLink() {
$searchPage = SpecialPage::getTitleFor( 'Search' );
return $searchPage->getLocalURL();
}
+ /**
+ * @return string
+ */
function escapeSearchLink() {
return htmlspecialchars( $this->getSearchLink() );
}
+ /**
+ * @param $type string
+ * @return string
+ */
function getCopyright( $type = 'detect' ) {
- global $wgRightsPage, $wgRightsUrl, $wgRightsText;
+ global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgContLang;
if ( $type == 'detect' ) {
- $diff = $this->getRequest()->getVal( 'diff' );
-
- if ( is_null( $diff ) && !$this->isRevisionCurrent() && wfMsgForContent( 'history_copyright' ) !== '-' ) {
+ if ( !$this->isRevisionCurrent() && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() ) {
$type = 'history';
} else {
$type = 'normal';
@@ -856,8 +781,6 @@ abstract class Skin extends ContextSource {
$msg = 'copyright';
}
- $out = '';
-
if ( $wgRightsPage ) {
$title = Title::newFromText( $wgRightsPage );
$link = Linker::linkKnown( $title, $wgRightsText );
@@ -867,7 +790,7 @@ abstract class Skin extends ContextSource {
$link = $wgRightsText;
} else {
# Give up now
- return $out;
+ return '';
}
// Allow for site and per-namespace customization of copyright notice.
@@ -875,15 +798,21 @@ abstract class Skin extends ContextSource {
wfRunHooks( 'SkinCopyrightFooter', array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) );
+ $msgObj = $this->msg( $msg )->rawParams( $link );
if ( $forContent ) {
- $out .= wfMsgForContent( $msg, $link );
+ $msg = $msgObj->inContentLanguage()->text();
+ if ( $this->getLanguage()->getCode() !== $wgContLang->getCode() ) {
+ $msg = Html::rawElement( 'span', array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $msg );
+ }
+ return $msg;
} else {
- $out .= wfMsg( $msg, $link );
+ return $msgObj->text();
}
-
- return $out;
}
+ /**
+ * @return null|string
+ */
function getCopyrightIcon() {
global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon;
@@ -918,7 +847,7 @@ abstract class Skin extends ContextSource {
global $wgStylePath;
$url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
- $text = '<a href="http://www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+ $text = '<a href="//www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
return $text;
}
@@ -926,31 +855,35 @@ abstract class Skin extends ContextSource {
/**
* Get the timestamp of the latest revision, formatted in user language
*
- * @param $article Article object. Used if we're working with the current revision
* @return String
*/
- protected function lastModified( $article ) {
- if ( !$this->isRevisionCurrent() ) {
+ protected function lastModified() {
+ $timestamp = $this->getOutput()->getRevisionTimestamp();
+
+ # No cached timestamp, load it from the database
+ if ( $timestamp === null ) {
$timestamp = Revision::getTimestampFromId( $this->getTitle(), $this->getRevisionId() );
- } else {
- $timestamp = $article->getTimestamp();
}
if ( $timestamp ) {
- $d = $this->getLang()->date( $timestamp, true );
- $t = $this->getLang()->time( $timestamp, true );
- $s = ' ' . wfMsg( 'lastmodifiedat', $d, $t );
+ $d = $this->getLanguage()->userDate( $timestamp, $this->getUser() );
+ $t = $this->getLanguage()->userTime( $timestamp, $this->getUser() );
+ $s = ' ' . $this->msg( 'lastmodifiedat', $d, $t )->text();
} else {
$s = '';
}
if ( wfGetLB()->getLaggedSlaveMode() ) {
- $s .= ' <strong>' . wfMsg( 'laggedslavemode' ) . '</strong>';
+ $s .= ' <strong>' . $this->msg( 'laggedslavemode' )->text() . '</strong>';
}
return $s;
}
+ /**
+ * @param $align string
+ * @return string
+ */
function logoText( $align = '' ) {
if ( $align != '' ) {
$a = " align='{$align}'";
@@ -958,9 +891,9 @@ abstract class Skin extends ContextSource {
$a = '';
}
- $mp = wfMsg( 'mainpage' );
+ $mp = $this->msg( 'mainpage' )->escaped();
$mptitle = Title::newMainPage();
- $url = ( is_object( $mptitle ) ? $mptitle->escapeLocalURL() : '' );
+ $url = ( is_object( $mptitle ) ? htmlspecialchars( $mptitle->getLocalURL() ) : '' );
$logourl = $this->getLogo();
$s = "<a href='{$url}'><img{$a} src='{$logourl}' alt='[{$mp}]' /></a>";
@@ -997,31 +930,33 @@ abstract class Skin extends ContextSource {
* @return string
*/
function mainPageLink() {
- $s = Linker::link(
+ $s = Linker::linkKnown(
Title::newMainPage(),
- wfMsg( 'mainpage' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ $this->msg( 'mainpage' )->escaped()
);
return $s;
}
+ /**
+ * @param $desc
+ * @param $page
+ * @return string
+ */
public function footerLink( $desc, $page ) {
// if the link description has been set to "-" in the default language,
- if ( wfMsgForContent( $desc ) == '-' ) {
+ if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) {
// then it is disabled, for all languages.
return '';
} else {
// Otherwise, we display the link for the user, described in their
// language (which may or may not be the same as the default language),
// but we make the link target be the one site-wide page.
- $title = Title::newFromText( wfMsgForContent( $page ) );
+ $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() );
return Linker::linkKnown(
$title,
- wfMsgExt( $desc, array( 'parsemag', 'escapenoentities' ) )
+ $this->msg( $desc )->escaped()
);
}
}
@@ -1067,8 +1002,16 @@ abstract class Skin extends ContextSource {
return $options;
}
+ /**
+ * @param $id User|int
+ * @return bool
+ */
function showEmailUser( $id ) {
- $targetUser = User::newFromId( $id );
+ if ( $id instanceof User ) {
+ $targetUser = $id;
+ } else {
+ $targetUser = User::newFromId( $id );
+ }
return $this->getUser()->canSendEmail() && # the sending user must have a confirmed email address
$targetUser->canReceiveEmail(); # the target user must have a confirmed email address and allow emails from users
}
@@ -1098,6 +1041,11 @@ abstract class Skin extends ContextSource {
}
/* these are used extensively in SkinTemplate, but also some other places */
+
+ /**
+ * @param $urlaction string
+ * @return String
+ */
static function makeMainPageUrl( $urlaction = '' ) {
$title = Title::newMainPage();
self::checkTitle( $title, '' );
@@ -1105,22 +1053,43 @@ abstract class Skin extends ContextSource {
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $urlaction string
+ * @return String
+ */
static function makeSpecialUrl( $name, $urlaction = '' ) {
$title = SpecialPage::getSafeTitleFor( $name );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $subpage string
+ * @param $urlaction string
+ * @return String
+ */
static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) {
$title = SpecialPage::getSafeTitleFor( $name, $subpage );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $urlaction string
+ * @return String
+ */
static function makeI18nUrl( $name, $urlaction = '' ) {
$title = Title::newFromText( wfMsgForContent( $name ) );
self::checkTitle( $title, $name );
return $title->getLocalURL( $urlaction );
}
+ /**
+ * @param $name string
+ * @param $urlaction string
+ * @return String
+ */
static function makeUrl( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
@@ -1142,7 +1111,13 @@ abstract class Skin extends ContextSource {
}
}
- # this can be passed the NS number as defined in Language.php
+ /**
+ * this can be passed the NS number as defined in Language.php
+ * @param $name
+ * @param $urlaction string
+ * @param $namespace int
+ * @return String
+ */
static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) {
$title = Title::makeTitleSafe( $namespace, $name );
self::checkTitle( $title, $name );
@@ -1150,7 +1125,12 @@ abstract class Skin extends ContextSource {
return $title->getLocalURL( $urlaction );
}
- /* these return an array with the 'href' and boolean 'exists' */
+ /**
+ * these return an array with the 'href' and boolean 'exists'
+ * @param $name
+ * @param $urlaction string
+ * @return array
+ */
static function makeUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
self::checkTitle( $title, $name );
@@ -1177,7 +1157,12 @@ abstract class Skin extends ContextSource {
);
}
- # make sure we have some title to operate on
+ /**
+ * make sure we have some title to operate on
+ *
+ * @param $title Title
+ * @param $name string
+ */
static function checkTitle( &$title, $name ) {
if ( !is_object( $title ) ) {
$title = Title::newFromText( $name );
@@ -1193,13 +1178,13 @@ abstract class Skin extends ContextSource {
* @return array
*/
function buildSidebar() {
- global $parserMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry;
+ global $wgMemc, $wgEnableSidebarCache, $wgSidebarCacheExpiry;
wfProfileIn( __METHOD__ );
- $key = wfMemcKey( 'sidebar', $this->getLang()->getCode() );
+ $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() );
if ( $wgEnableSidebarCache ) {
- $cachedsidebar = $parserMemc->get( $key );
+ $cachedsidebar = $wgMemc->get( $key );
if ( $cachedsidebar ) {
wfProfileOut( __METHOD__ );
return $cachedsidebar;
@@ -1211,7 +1196,7 @@ abstract class Skin extends ContextSource {
wfRunHooks( 'SkinBuildSidebar', array( $this, &$bar ) );
if ( $wgEnableSidebarCache ) {
- $parserMemc->set( $key, $bar, $wgSidebarCacheExpiry );
+ $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry );
}
wfProfileOut( __METHOD__ );
@@ -1223,7 +1208,7 @@ abstract class Skin extends ContextSource {
*
* This is just a wrapper around addToSidebarPlain() for backwards compatibility
*
- * @param &$bar array
+ * @param $bar array
* @param $message String
*/
function addToSidebar( &$bar, $message ) {
@@ -1233,7 +1218,7 @@ abstract class Skin extends ContextSource {
/**
* Add content from plain text
* @since 1.17
- * @param &$bar array
+ * @param $bar array
* @param $text string
* @return Array
*/
@@ -1246,6 +1231,7 @@ abstract class Skin extends ContextSource {
if ( strpos( $line, '*' ) !== 0 ) {
continue;
}
+ $line = rtrim( $line, "\r" ); // for Windows compat
if ( strpos( $line, '**' ) !== 0 ) {
$heading = trim( $line, '* ' );
@@ -1260,13 +1246,13 @@ abstract class Skin extends ContextSource {
$line = array_map( 'trim', explode( '|', $line, 2 ) );
if ( count( $line ) !== 2 ) {
// Second sanity check, could be hit by people doing
- // funky stuff with parserfuncs... (bug 3321)
+ // funky stuff with parserfuncs... (bug 33321)
continue;
}
$extraAttribs = array();
- $msgLink = wfMessage( $line[0] )->inContentLanguage();
+ $msgLink = $this->msg( $line[0] )->inContentLanguage();
if ( $msgLink->exists() ) {
$link = $msgLink->text();
if ( $link == '-' ) {
@@ -1275,7 +1261,7 @@ abstract class Skin extends ContextSource {
} else {
$link = $line[0];
}
- $msgText = wfMessage( $line[1] );
+ $msgText = $this->msg( $line[1] );
if ( $msgText->exists() ) {
$text = $msgText->text();
} else {
@@ -1284,13 +1270,13 @@ abstract class Skin extends ContextSource {
if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $link ) ) {
$href = $link;
-
+
// Parser::getExternalLinkAttribs won't work here because of the Namespace things
global $wgNoFollowLinks, $wgNoFollowDomainExceptions;
if ( $wgNoFollowLinks && !wfMatchesDomainList( $href, $wgNoFollowDomainExceptions ) ) {
$extraAttribs['rel'] = 'nofollow';
}
-
+
global $wgExternalLinkTarget;
if ( $wgExternalLinkTarget) {
$extraAttribs['target'] = $wgExternalLinkTarget;
@@ -1300,7 +1286,7 @@ abstract class Skin extends ContextSource {
if ( $title ) {
$title = $title->fixSpecialName();
- $href = $title->getLocalURL();
+ $href = $title->getLinkURL();
} else {
$href = 'INVALID-TITLE';
}
@@ -1322,10 +1308,9 @@ abstract class Skin extends ContextSource {
}
/**
- * Should we include common/wikiprintable.css? Skins that have their own
+ * 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().)
+ * ugly hack to get Monobook to play nicely with OutputPage::headElement().)
*
* @return bool
*/
@@ -1348,33 +1333,31 @@ abstract class Skin extends ContextSource {
$userTalkTitle = $userTitle->getTalkPage();
if ( !$userTalkTitle->equals( $out->getTitle() ) ) {
- $newMessagesLink = $this->link(
+ $newMessagesLink = Linker::linkKnown(
$userTalkTitle,
- wfMsgHtml( 'newmessageslink' ),
+ $this->msg( 'newmessageslink' )->escaped(),
array(),
- array( 'redirect' => 'no' ),
- array( 'known', 'noclasses' )
+ array( 'redirect' => 'no' )
);
- $newMessagesDiffLink = $this->link(
+ $newMessagesDiffLink = Linker::linkKnown(
$userTalkTitle,
- wfMsgHtml( 'newmessagesdifflink' ),
+ $this->msg( 'newmessagesdifflink' )->escaped(),
array(),
- array( 'diff' => 'cur' ),
- array( 'known', 'noclasses' )
+ array( 'diff' => 'cur' )
);
- $ntl = wfMsg(
+ $ntl = $this->msg(
'youhavenewmessages',
$newMessagesLink,
$newMessagesDiffLink
- );
+ )->text();
# Disable Squid cache
$out->setSquidMaxage( 0 );
}
} elseif ( count( $newtalks ) ) {
// _>" " for BC <= 1.16
- $sep = str_replace( '_', ' ', wfMsgHtml( 'newtalkseparator' ) );
+ $sep = str_replace( '_', ' ', $this->msg( 'newtalkseparator' )->escaped() );
$msgs = array();
foreach ( $newtalks as $newtalk ) {
@@ -1384,7 +1367,7 @@ abstract class Skin extends ContextSource {
);
}
$parts = implode( $sep, $msgs );
- $ntl = wfMsgHtml( 'youhavenewmessagesmulti', $parts );
+ $ntl = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
$out->setSquidMaxage( 0 );
}
@@ -1413,7 +1396,7 @@ abstract class Skin extends ContextSource {
return false;
}
} else {
- $msg = wfMessage( $name )->inContentLanguage();
+ $msg = $this->msg( $name )->inContentLanguage();
if( $msg->isDisabled() ) {
wfProfileOut( __METHOD__ );
return false;
@@ -1441,7 +1424,7 @@ abstract class Skin extends ContextSource {
}
$notice = Html::rawElement( 'div', array( 'id' => 'localNotice',
- 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ), $notice );
+ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $notice );
wfProfileOut( __METHOD__ );
return $notice;
}
diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php
index 53ce6741..77c85a88 100644
--- a/includes/SkinLegacy.php
+++ b/includes/SkinLegacy.php
@@ -183,54 +183,16 @@ class LegacyTemplate extends BaseTemplate {
}
function pageStats() {
- global $wgOut, $wgLang, $wgRequest, $wgUser;
- global $wgDisableCounters, $wgMaxCredits, $wgShowCreditsIfMax, $wgPageShowWatchingUsers;
+ $ret = array();
+ $items = array( 'viewcount', 'credits', 'lastmod', 'numberofwatchingusers', 'copyright' );
- if ( !is_null( $wgRequest->getVal( 'oldid' ) ) || !is_null( $wgRequest->getVal( 'diff' ) ) ) {
- return '';
- }
-
- if ( !$wgOut->isArticle() || !$this->getSkin()->getTitle()->exists() ) {
- return '';
- }
-
- $article = new Article( $this->getSkin()->getTitle(), 0 );
-
- $s = '';
-
- if ( !$wgDisableCounters ) {
- $count = $wgLang->formatNum( $article->getCount() );
-
- if ( $count ) {
- $s = wfMsgExt( 'viewcount', array( 'parseinline' ), $count );
+ foreach( $items as $item ) {
+ if ( $this->data[$item] !== false ) {
+ $ret[] = $this->data[$item];
}
}
- if ( $wgMaxCredits != 0 ) {
- $s .= ' ' . Action::factory( 'credits', $article )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax );
- } else {
- $s .= $this->data['lastmod'];
- }
-
- if ( $wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' ) ) {
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select(
- 'watchlist',
- array( 'COUNT(*) AS n' ),
- array(
- 'wl_title' => $dbr->strencode( $this->getSkin()->getTitle()->getDBkey() ),
- 'wl_namespace' => $this->getSkin()->getTitle()->getNamespace()
- ),
- __METHOD__
- );
- $x = $dbr->fetchObject( $res );
-
- $s .= ' ' . wfMsgExt( 'number_of_watching_users_pageview',
- array( 'parseinline' ), $wgLang->formatNum( $x->n )
- );
- }
-
- return $s . ' ' . $this->getSkin()->getCopyright();
+ return implode( ' ', $ret );
}
function topLinks() {
@@ -269,20 +231,23 @@ class LegacyTemplate extends BaseTemplate {
$s = '';
/* show links to different language variants */
- global $wgDisableLangConversion, $wgLang, $wgContLang;
+ global $wgDisableLangConversion, $wgLang;
- $variants = $wgContLang->getVariants();
+ $title = $this->getSkin()->getTitle();
+ $lang = $title->getPageLanguage();
+ $variants = $lang->getVariants();
- if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
+ if ( !$wgDisableLangConversion && sizeof( $variants ) > 1
+ && !$title->isSpecialPage() ) {
foreach ( $variants as $code ) {
- $varname = $wgContLang->getVariantname( $code );
+ $varname = $lang->getVariantname( $code );
if ( $varname == 'disable' ) {
continue;
}
$s = $wgLang->pipeList( array(
$s,
- '<a href="' . $this->getSkin()->getTitle()->escapeLocalURL( 'variant=' . $code ) . '">' . htmlspecialchars( $varname ) . '</a>'
+ '<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '">' . htmlspecialchars( $varname ) . '</a>'
) );
}
}
@@ -319,7 +284,7 @@ class LegacyTemplate extends BaseTemplate {
}
function bottomLinks() {
- global $wgOut, $wgUser, $wgUseTrackbacks;
+ global $wgOut, $wgUser;
$sep = wfMsgExt( 'pipe-separator', 'escapenoentities' ) . "\n";
$s = '';
@@ -335,16 +300,14 @@ class LegacyTemplate extends BaseTemplate {
$element[] = $this->whatLinksHere();
$element[] = $this->watchPageLinksLink();
- if ( $wgUseTrackbacks ) {
- $element[] = $this->trackbackLink();
- }
+ $title = $this->getSkin()->getTitle();
if (
- $this->getSkin()->getTitle()->getNamespace() == NS_USER ||
- $this->getSkin()->getTitle()->getNamespace() == NS_USER_TALK
+ $title->getNamespace() == NS_USER ||
+ $title->getNamespace() == NS_USER_TALK
) {
- $id = User::idFromName( $this->getSkin()->getTitle()->getText() );
- $ip = User::isIP( $this->getSkin()->getTitle()->getText() );
+ $id = User::idFromName( $title->getText() );
+ $ip = User::isIP( $title->getText() );
# Both anons and non-anons have contributions list
if ( $id || $ip ) {
@@ -358,7 +321,7 @@ class LegacyTemplate extends BaseTemplate {
$s = implode( $element, $sep );
- if ( $this->getSkin()->getTitle()->getArticleId() ) {
+ if ( $title->getArticleId() ) {
$s .= "\n<br />";
// Delete/protect/move links for privileged users
@@ -382,7 +345,7 @@ class LegacyTemplate extends BaseTemplate {
}
function otherLanguages() {
- global $wgOut, $wgContLang, $wgHideInterlanguageLinks;
+ global $wgOut, $wgLang, $wgContLang, $wgHideInterlanguageLinks;
if ( $wgHideInterlanguageLinks ) {
return '';
@@ -397,8 +360,8 @@ class LegacyTemplate extends BaseTemplate {
$s = wfMsg( 'otherlanguages' ) . wfMsg( 'colon-separator' );
$first = true;
- if ( $wgContLang->isRTL() ) {
- $s .= '<span dir="LTR">';
+ if ( $wgLang->isRTL() ) {
+ $s .= '<span dir="ltr">';
}
foreach ( $a as $l ) {
@@ -416,7 +379,7 @@ class LegacyTemplate extends BaseTemplate {
$text == '' ? $l : $text );
}
- if ( $wgContLang->isRTL() ) {
+ if ( $wgLang->isRTL() ) {
$s .= '</span>';
}
@@ -427,34 +390,18 @@ class LegacyTemplate extends BaseTemplate {
* Show a drop-down box of special pages
*/
function specialPagesList() {
- global $wgContLang, $wgServer, $wgRedirectScript;
+ global $wgScript;
+ $select = new XmlSelect( 'title' );
$pages = SpecialPageFactory::getUsablePages();
-
- foreach ( $pages as $name => $page ) {
- $pages[$name] = $page->getDescription();
+ array_unshift( $pages, SpecialPageFactory::getPage( 'SpecialPages' ) );
+ foreach ( $pages as $obj ) {
+ $select->addOption( $obj->getDescription(),
+ $obj->getTitle()->getPrefixedDBkey() );
}
- $go = wfMsg( 'go' );
- $sp = wfMsg( 'specialpages' );
- $spp = $wgContLang->specialPage( 'Specialpages' );
-
- $s = '<form id="specialpages" method="get" ' .
- 'action="' . htmlspecialchars( "{$wgServer}{$wgRedirectScript}" ) . "\">\n";
- $s .= "<select name=\"wpDropdown\">\n";
- $s .= "<option value=\"{$spp}\">{$sp}</option>\n";
-
-
- foreach ( $pages as $name => $desc ) {
- $p = $wgContLang->specialPage( $name );
- $s .= "<option value=\"{$p}\">{$desc}</option>\n";
- }
-
- $s .= "</select>\n";
- $s .= "<input type='submit' value=\"{$go}\" name='redirect' />\n";
- $s .= "</form>\n";
-
- return $s;
+ return Html::rawElement( 'form', array( 'id' => 'specialpages', 'method' => 'get',
+ 'action' => $wgScript ), $select->getHTML() . Xml::submitButton( wfMsg( 'go' ) ) );
}
function pageTitleLinks() {
@@ -464,23 +411,26 @@ class LegacyTemplate extends BaseTemplate {
$diff = $wgRequest->getVal( 'diff' );
$action = $wgRequest->getText( 'action' );
+ $skin = $this->getSkin();
+ $title = $skin->getTitle();
+
$s[] = $this->printableLink();
- $disclaimer = $this->getSkin()->disclaimerLink(); # may be empty
+ $disclaimer = $skin->disclaimerLink(); # may be empty
if ( $disclaimer ) {
$s[] = $disclaimer;
}
- $privacy = $this->getSkin()->privacyLink(); # may be empty too
+ $privacy = $skin->privacyLink(); # may be empty too
if ( $privacy ) {
$s[] = $privacy;
}
if ( $wgOut->isArticleRelated() ) {
- if ( $this->getSkin()->getTitle()->getNamespace() == NS_FILE ) {
- $name = $this->getSkin()->getTitle()->getDBkey();
- $image = wfFindFile( $this->getSkin()->getTitle() );
+ if ( $title->getNamespace() == NS_FILE ) {
+ $name = $title->getDBkey();
+ $image = wfFindFile( $title );
if ( $image ) {
$link = htmlspecialchars( $image->getURL() );
@@ -491,33 +441,28 @@ class LegacyTemplate extends BaseTemplate {
}
if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) {
- $s[] .= Linker::link(
- $this->getSkin()->getTitle(),
- wfMsg( 'currentrev' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ $s[] .= Linker::linkKnown(
+ $title,
+ wfMsg( 'currentrev' )
);
}
if ( $wgUser->getNewtalk() ) {
# do not show "You have new messages" text when we are viewing our
# own talk page
- if ( !$this->getSkin()->getTitle()->equals( $wgUser->getTalkPage() ) ) {
- $tl = Linker::link(
+ if ( !$title->equals( $wgUser->getTalkPage() ) ) {
+ $tl = Linker::linkKnown(
$wgUser->getTalkPage(),
wfMsgHtml( 'newmessageslink' ),
array(),
- array( 'redirect' => 'no' ),
- array( 'known', 'noclasses' )
+ array( 'redirect' => 'no' )
);
- $dl = Linker::link(
+ $dl = Linker::linkKnown(
$wgUser->getTalkPage(),
wfMsgHtml( 'newmessagesdifflink' ),
array(),
- array( 'diff' => 'cur' ),
- array( 'known', 'noclasses' )
+ array( 'diff' => 'cur' )
);
$s[] = '<strong>' . wfMsg( 'youhavenewmessages', $tl, $dl ) . '</strong>';
# disable caching
@@ -526,7 +471,7 @@ class LegacyTemplate extends BaseTemplate {
}
}
- $undelete = $this->getSkin()->getUndeleteLink();
+ $undelete = $skin->getUndeleteLink();
if ( !empty( $undelete ) ) {
$s[] = $undelete;
@@ -541,7 +486,7 @@ class LegacyTemplate extends BaseTemplate {
*/
function pageTitle() {
global $wgOut;
- $s = '<h1 class="pagetitle">' . $wgOut->getPageTitle() . '</h1>';
+ $s = '<h1 class="pagetitle"><span dir="auto">' . $wgOut->getPageTitle() . '</span></h1>';
return $s;
}
@@ -587,6 +532,7 @@ class LegacyTemplate extends BaseTemplate {
* @deprecated in 1.19
*/
function getQuickbarCompensator( $rows = 1 ) {
+ wfDeprecated( __METHOD__, '1.19' );
return "<td width='152' rowspan='{$rows}'>&#160;</td>";
}
@@ -596,20 +542,20 @@ class LegacyTemplate extends BaseTemplate {
if ( !$wgOut->isArticleRelated() ) {
$s = wfMsg( 'protectedpage' );
} else {
- if ( $this->getSkin()->getTitle()->quickUserCan( 'edit' ) && $this->getSkin()->getTitle()->exists() ) {
+ $title = $this->getSkin()->getTitle();
+ if ( $title->quickUserCan( 'edit' ) && $title->exists() ) {
$t = wfMsg( 'editthispage' );
- } elseif ( $this->getSkin()->getTitle()->quickUserCan( 'create' ) && !$this->getSkin()->getTitle()->exists() ) {
+ } elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) {
$t = wfMsg( 'create-this-page' );
} else {
$t = wfMsg( 'viewsource' );
}
- $s = Linker::link(
- $this->getSkin()->getTitle(),
+ $s = Linker::linkKnown(
+ $title,
$t,
array(),
- $this->getSkin()->editUrlOptions(),
- array( 'known', 'noclasses' )
+ $this->getSkin()->editUrlOptions()
);
}
@@ -620,16 +566,16 @@ class LegacyTemplate extends BaseTemplate {
global $wgUser, $wgRequest;
$diff = $wgRequest->getVal( 'diff' );
+ $title = $this->getSkin()->getTitle();
- if ( $this->getSkin()->getTitle()->getArticleId() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
+ if ( $title->getArticleId() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
$t = wfMsg( 'deletethispage' );
- $s = Linker::link(
- $this->getSkin()->getTitle(),
+ $s = Linker::linkKnown(
+ $title,
$t,
array(),
- array( 'action' => 'delete' ),
- array( 'known', 'noclasses' )
+ array( 'action' => 'delete' )
);
} else {
$s = '';
@@ -642,9 +588,10 @@ class LegacyTemplate extends BaseTemplate {
global $wgUser, $wgRequest;
$diff = $wgRequest->getVal( 'diff' );
+ $title = $this->getSkin()->getTitle();
- if ( $this->getSkin()->getTitle()->getArticleId() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) {
- if ( $this->getSkin()->getTitle()->isProtected() ) {
+ if ( $title->getArticleId() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) {
+ if ( $title->isProtected() ) {
$text = wfMsg( 'unprotectthispage' );
$query = array( 'action' => 'unprotect' );
} else {
@@ -652,12 +599,11 @@ class LegacyTemplate extends BaseTemplate {
$query = array( 'action' => 'protect' );
}
- $s = Linker::link(
- $this->getSkin()->getTitle(),
+ $s = Linker::linkKnown(
+ $title,
$text,
array(),
- $query,
- array( 'known', 'noclasses' )
+ $query
);
} else {
$s = '';
@@ -690,12 +636,11 @@ class LegacyTemplate extends BaseTemplate {
$id = 'mw-watch-link' . $this->mWatchLinkNum;
}
- $s = Linker::link(
+ $s = Linker::linkKnown(
$title,
$text,
array( 'id' => $id ),
- $query,
- array( 'known', 'noclasses' )
+ $query
);
} else {
$s = wfMsg( 'notanarticle' );
@@ -706,12 +651,11 @@ class LegacyTemplate extends BaseTemplate {
function moveThisPage() {
if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) {
- return Linker::link(
+ return Linker::linkKnown(
SpecialPage::getTitleFor( 'Movepage' ),
wfMsg( 'movethispage' ),
array(),
- array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() ),
- array( 'known', 'noclasses' )
+ array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() )
);
} else {
// no message if page is protected - would be redundant
@@ -729,32 +673,23 @@ class LegacyTemplate extends BaseTemplate {
}
function whatLinksHere() {
- return Linker::link(
+ return Linker::linkKnown(
SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
- wfMsgHtml( 'whatlinkshere' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( 'whatlinkshere' )
);
}
function userContribsLink() {
- return Linker::link(
+ return Linker::linkKnown(
SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ),
- wfMsgHtml( 'contributions' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( 'contributions' )
);
}
function emailUserLink() {
- return Linker::link(
+ return Linker::linkKnown(
SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ),
- wfMsg( 'emailuser' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( 'emailuser' )
);
}
@@ -764,31 +699,24 @@ class LegacyTemplate extends BaseTemplate {
if ( !$wgOut->isArticleRelated() ) {
return '(' . wfMsg( 'notanarticle' ) . ')';
} else {
- return Linker::link(
+ return Linker::linkKnown(
SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
- wfMsg( 'recentchangeslinked-toolbox' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( 'recentchangeslinked-toolbox' )
);
}
}
- function trackbackLink() {
- return '<a href="' . $this->getSkin()->getTitle()->trackbackURL() . '">'
- . wfMsg( 'trackbacklink' ) . '</a>';
- }
-
function talkLink() {
- if ( NS_SPECIAL == $this->getSkin()->getTitle()->getNamespace() ) {
+ $title = $this->getSkin()->getTitle();
+ if ( NS_SPECIAL == $title->getNamespace() ) {
# No discussion links for special pages
return '';
}
$linkOptions = array();
- if ( $this->getSkin()->getTitle()->isTalkPage() ) {
- $link = $this->getSkin()->getTitle()->getSubjectPage();
+ if ( $title->isTalkPage() ) {
+ $link = $title->getSubjectPage();
switch( $link->getNamespace() ) {
case NS_MAIN:
$text = wfMsg( 'articlepage' );
@@ -821,7 +749,7 @@ class LegacyTemplate extends BaseTemplate {
$text = wfMsg( 'articlepage' );
}
} else {
- $link = $this->getSkin()->getTitle()->getTalkPage();
+ $link = $title->getTalkPage();
$text = wfMsg( 'talkpage' );
}
@@ -833,30 +761,26 @@ class LegacyTemplate extends BaseTemplate {
function commentLink() {
global $wgOut;
- if ( $this->getSkin()->getTitle()->getNamespace() == NS_SPECIAL ) {
+ $title = $this->getSkin()->getTitle();
+ if ( $title->isSpecialPage() ) {
return '';
}
# __NEWSECTIONLINK___ changes behaviour here
# If it is present, the link points to this page, otherwise
# it points to the talk page
- if ( $this->getSkin()->getTitle()->isTalkPage() ) {
- $title = $this->getSkin()->getTitle();
- } elseif ( $wgOut->showNewSectionLink() ) {
- $title = $this->getSkin()->getTitle();
- } else {
- $title = $this->getSkin()->getTitle()->getTalkPage();
+ if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
+ $title = $title->getTalkPage();
}
- return Linker::link(
+ return Linker::linkKnown(
$title,
wfMsg( 'postcomment' ),
array(),
array(
'action' => 'edit',
'section' => 'new'
- ),
- array( 'known', 'noclasses' )
+ )
);
}
@@ -867,26 +791,22 @@ class LegacyTemplate extends BaseTemplate {
# Using an empty class attribute to avoid automatic setting of "external" class
return Linker::makeExternalLink( $wgUploadNavigationUrl, wfMsgHtml( 'upload' ), false, null, array( 'class' => '' ) );
} else {
- return Linker::link(
+ return Linker::linkKnown(
SpecialPage::getTitleFor( 'Upload' ),
- wfMsgHtml( 'upload' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( 'upload' )
);
}
}
function nameAndLogin() {
- global $wgUser, $wgLang, $wgContLang;
-
- $logoutPage = $wgContLang->specialPage( 'Userlogout' );
+ global $wgUser, $wgLang, $wgRequest;
+ $returnTo = $this->getSkin()->getTitle();
$ret = '';
if ( $wgUser->isAnon() ) {
if ( $this->getSkin()->showIPinHeader() ) {
- $name = wfGetIP();
+ $name = $wgRequest->getIP();
$talkLink = Linker::link( $wgUser->getTalkPage(),
$wgLang->getNsText( NS_TALK ) );
@@ -896,11 +816,10 @@ class LegacyTemplate extends BaseTemplate {
$ret .= wfMsg( 'notloggedin' );
}
- $returnTo = $this->getSkin()->getTitle()->getPrefixedDBkey();
$query = array();
- if ( $logoutPage != $returnTo ) {
- $query['returnto'] = $returnTo;
+ if ( !$returnTo->isSpecial( 'Userlogout' ) ) {
+ $query['returnto'] = $returnTo->getPrefixedDBkey();
}
$loginlink = $wgUser->isAllowed( 'createaccount' )
@@ -911,7 +830,6 @@ class LegacyTemplate extends BaseTemplate {
wfMsg( $loginlink ), array(), $query
);
} else {
- $returnTo = $this->getSkin()->getTitle()->getPrefixedDBkey();
$talkLink = Linker::link( $wgUser->getTalkPage(),
$wgLang->getNsText( NS_TALK ) );
@@ -921,7 +839,7 @@ class LegacyTemplate extends BaseTemplate {
$ret .= $wgLang->pipeList( array(
Linker::link(
SpecialPage::getTitleFor( 'Userlogout' ), wfMsg( 'logout' ),
- array(), array( 'returnto' => $returnTo )
+ array(), array( 'returnto' => $returnTo->getPrefixedDBkey() )
),
Linker::specialLink( 'Preferences' ),
) );
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index ef104bd7..e41b5e7d 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -131,23 +131,31 @@ class SkinTemplate extends Skin {
*
* @param $out OutputPage
*/
- function outputPage( OutputPage $out ) {
- global $wgUser, $wgLang, $wgContLang;
+ function outputPage( OutputPage $out=null ) {
+ global $wgContLang;
global $wgScript, $wgStylePath;
- global $wgMimeType, $wgJsMimeType, $wgRequest;
+ global $wgMimeType, $wgJsMimeType;
global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
- global $wgDisableCounters, $wgLogo, $wgHideInterlanguageLinks;
+ global $wgDisableCounters, $wgSitename, $wgLogo, $wgHideInterlanguageLinks;
global $wgMaxCredits, $wgShowCreditsIfMax;
global $wgPageShowWatchingUsers;
- global $wgUseTrackbacks, $wgUseSiteJs, $wgDebugComments;
+ global $wgDebugComments;
global $wgArticlePath, $wgScriptPath, $wgServer;
wfProfileIn( __METHOD__ );
Profiler::instance()->setTemplated( true );
- $oldid = $wgRequest->getVal( 'oldid' );
- $diff = $wgRequest->getVal( 'diff' );
- $action = $wgRequest->getVal( 'action', 'view' );
+ $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 );
@@ -156,24 +164,21 @@ class SkinTemplate extends Skin {
wfProfileOut( __METHOD__ . '-init' );
wfProfileIn( __METHOD__ . '-stuff' );
- $this->thispage = $this->getTitle()->getPrefixedDBkey();
- $this->userpage = $wgUser->getUserPage()->getPrefixedText();
-
+ $this->thispage = $title->getPrefixedDBkey();
+ $this->titletxt = $title->getPrefixedText();
+ $this->userpage = $user->getUserPage()->getPrefixedText();
$query = array();
- if ( !$wgRequest->wasPosted() ) {
- $query = $wgRequest->getValues();
+ if ( !$request->wasPosted() ) {
+ $query = $request->getValues();
unset( $query['title'] );
unset( $query['returnto'] );
unset( $query['returntoquery'] );
}
$this->thisquery = wfArrayToCGI( $query );
- $this->loggedin = $wgUser->isLoggedIn();
- $this->iscontent = ( $this->getTitle()->getNamespace() != NS_SPECIAL );
- $this->iseditable = ( $this->iscontent and !( $action == 'edit' or $action == 'submit' ) );
- $this->username = $wgUser->getName();
-
- if ( $wgUser->isLoggedIn() || $this->showIPinHeader() ) {
+ $this->loggedin = $user->isLoggedIn();
+ $this->username = $user->getName();
+ if ( $this->loggedin || $this->showIPinHeader() ) {
$this->userpageUrlDetails = self::makeUrlDetails( $this->userpage );
} else {
# This won't be used in the standard skins, but we define it to preserve the interface
@@ -181,48 +186,25 @@ class SkinTemplate extends Skin {
$this->userpageUrlDetails = self::makeKnownUrlDetails( $this->userpage );
}
- $this->titletxt = $this->getTitle()->getPrefixedText();
wfProfileOut( __METHOD__ . '-stuff' );
wfProfileIn( __METHOD__ . '-stuff-head' );
- if ( $this->useHeadElement ) {
- $pagecss = $this->setupPageCss();
- if( $pagecss )
- $out->addInlineStyle( $pagecss );
- } else {
- $this->setupUserCss( $out );
-
- $tpl->set( 'pagecss', $this->setupPageCss() );
+ if ( !$this->useHeadElement ) {
+ $tpl->set( 'pagecss', false );
$tpl->set( 'usercss', false );
- $this->userjs = $this->userjsprev = false;
- # @todo FIXME: This is the only use of OutputPage::isUserJsAllowed() anywhere; can we
- # get rid of it? For that matter, why is any of this here at all?
- $this->setupUserJs( $out->isUserJsAllowed() );
- $tpl->setRef( 'userjs', $this->userjs );
- $tpl->setRef( 'userjsprev', $this->userjsprev );
-
- if( $wgUseSiteJs ) {
- $jsCache = $this->loggedin ? '&smaxage=0' : '';
- $tpl->set( 'jsvarurl',
- self::makeUrl( '-',
- "action=raw$jsCache&gen=js&useskin=" .
- urlencode( $this->getSkinName() ) ) );
- } else {
- $tpl->set( 'jsvarurl', false );
- }
+ $tpl->set( 'userjs', false );
+ $tpl->set( 'userjsprev', false );
+
+ $tpl->set( 'jsvarurl', false );
$tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
$tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
$tpl->set( 'html5version', $wgHtml5Version );
- $tpl->set( 'headlinks', $out->getHeadLinks( $this ) );
- $tpl->set( 'csslinks', $out->buildCssLinks( $this ) );
-
- if( $wgUseTrackbacks && $out->isArticleRelated() ) {
- $tpl->set( 'trackbackhtml', $out->getTitle()->trackbackRDF() );
- } else {
- $tpl->set( 'trackbackhtml', null );
- }
+ $tpl->set( 'headlinks', $out->getHeadLinks() );
+ $tpl->set( 'csslinks', $out->buildCssLinks() );
+ $tpl->set( 'pageclass', $this->getPageClasses( $title ) );
+ $tpl->set( 'skinnameclass', ( 'skin-' . Sanitizer::escapeClass( $this->getSkinName() ) ) );
}
wfProfileOut( __METHOD__ . '-stuff-head' );
@@ -230,42 +212,33 @@ class SkinTemplate extends Skin {
$tpl->set( 'title', $out->getPageTitle() );
$tpl->set( 'pagetitle', $out->getHTMLTitle() );
$tpl->set( 'displaytitle', $out->mPageLinkTitle );
- $tpl->set( 'pageclass', $this->getPageClasses( $this->getTitle() ) );
- $tpl->set( 'skinnameclass', ( 'skin-' . Sanitizer::escapeClass( $this->getSkinName() ) ) );
- $nsname = MWNamespace::exists( $this->getTitle()->getNamespace() ) ?
- MWNamespace::getCanonicalName( $this->getTitle()->getNamespace() ) :
- $this->getTitle()->getNsText();
-
- $tpl->set( 'nscanonical', $nsname );
- $tpl->set( 'nsnumber', $this->getTitle()->getNamespace() );
- $tpl->set( 'titleprefixeddbkey', $this->getTitle()->getPrefixedDBKey() );
- $tpl->set( 'titletext', $this->getTitle()->getText() );
- $tpl->set( 'articleid', $this->getTitle()->getArticleId() );
- $tpl->set( 'currevisionid', $this->getTitle()->getLatestRevID() );
+ $tpl->setRef( 'thispage', $this->thispage );
+ $tpl->setRef( 'titleprefixeddbkey', $this->thispage );
+ $tpl->set( 'titletext', $title->getText() );
+ $tpl->set( 'articleid', $title->getArticleId() );
$tpl->set( 'isarticle', $out->isArticle() );
- $tpl->setRef( 'thispage', $this->thispage );
$subpagestr = $this->subPageSubtitle();
- $tpl->set(
- 'subtitle', !empty( $subpagestr ) ?
- '<span class="subpages">' . $subpagestr . '</span>' . $out->getSubtitle() :
- $out->getSubtitle()
- );
+ if ( $subpagestr !== '' ) {
+ $subpagestr = '<span class="subpages">' . $subpagestr . '</span>';
+ }
+ $tpl->set( 'subtitle', $subpagestr . $out->getSubtitle() );
+
$undelete = $this->getUndeleteLink();
- $tpl->set(
- 'undelete', !empty( $undelete ) ?
- '<span class="subpages">' . $undelete . '</span>' :
- ''
- );
+ if ( $undelete === '' ) {
+ $tpl->set( 'undelete', '' );
+ } else {
+ $tpl->set( 'undelete', '<span class="subpages">' . $undelete . '</span>' );
+ }
$tpl->set( 'catlinks', $this->getCategories() );
if( $out->isSyndicated() ) {
$feeds = array();
foreach( $out->getSyndicationLinks() as $format => $link ) {
$feeds[$format] = array(
- 'text' => wfMsg( "feed-$format" ),
+ 'text' => $this->msg( "feed-$format" )->text(),
'href' => $link
);
}
@@ -280,39 +253,40 @@ class SkinTemplate extends Skin {
$tpl->setRef( 'wgScript', $wgScript );
$tpl->setRef( 'skinname', $this->skinname );
$tpl->set( 'skinclass', get_class( $this ) );
+ $tpl->setRef( 'skin', $this );
$tpl->setRef( 'stylename', $this->stylename );
$tpl->set( 'printable', $out->isPrintable() );
- $tpl->set( 'handheld', $wgRequest->getBool( 'handheld' ) );
+ $tpl->set( 'handheld', $request->getBool( 'handheld' ) );
$tpl->setRef( 'loggedin', $this->loggedin );
- $tpl->set( 'notspecialpage', $this->getTitle()->getNamespace() != NS_SPECIAL );
+ $tpl->set( 'notspecialpage', !$title->isSpecialPage() );
/* XXX currently unused, might get useful later
- $tpl->set( 'editable', ( $this->getTitle()->getNamespace() != NS_SPECIAL ) );
- $tpl->set( 'exists', $this->getTitle()->getArticleID() != 0 );
- $tpl->set( 'watch', $this->getTitle()->userIsWatching() ? 'unwatch' : 'watch' );
- $tpl->set( 'protect', count( $this->getTitle()->isProtected() ) ? 'unprotect' : 'protect' );
- $tpl->set( 'helppage', wfMsg( 'helppage' ) );
+ $tpl->set( 'editable', ( !$title->isSpecialPage() ) );
+ $tpl->set( 'exists', $title->getArticleID() != 0 );
+ $tpl->set( 'watch', $title->userIsWatching() ? 'unwatch' : 'watch' );
+ $tpl->set( 'protect', count( $title->isProtected() ) ? 'unprotect' : 'protect' );
+ $tpl->set( 'helppage', $this->msg( 'helppage' )->text() );
*/
$tpl->set( 'searchaction', $this->escapeSearchLink() );
$tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBKey() );
- $tpl->set( 'search', trim( $wgRequest->getVal( 'search' ) ) );
+ $tpl->set( 'search', trim( $request->getVal( 'search' ) ) );
$tpl->setRef( 'stylepath', $wgStylePath );
$tpl->setRef( 'articlepath', $wgArticlePath );
$tpl->setRef( 'scriptpath', $wgScriptPath );
$tpl->setRef( 'serverurl', $wgServer );
$tpl->setRef( 'logopath', $wgLogo );
+ $tpl->setRef( 'sitename', $wgSitename );
- $contentlang = $wgContLang->getCode();
- $contentdir = $wgContLang->getDir();
- $userlang = $wgLang->getCode();
- $userdir = $wgLang->getDir();
+ $lang = $this->getLanguage();
+ $userlang = $lang->getHtmlCode();
+ $userdir = $lang->getDir();
$tpl->set( 'lang', $userlang );
$tpl->set( 'dir', $userdir );
- $tpl->set( 'rtl', $wgLang->isRTL() );
+ $tpl->set( 'rtl', $lang->isRTL() );
- $tpl->set( 'capitalizeallnouns', $wgLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
- $tpl->set( 'showjumplinks', $wgUser->getOption( 'showjumplinks' ) );
- $tpl->set( 'username', $wgUser->isAnon() ? null : $this->username );
+ $tpl->set( 'capitalizeallnouns', $lang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
+ $tpl->set( 'showjumplinks', $user->getOption( 'showjumplinks' ) );
+ $tpl->set( 'username', $this->loggedin ? $this->username : null );
$tpl->setRef( 'userpage', $this->userpage );
$tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] );
$tpl->set( 'userlang', $userlang );
@@ -323,79 +297,52 @@ class SkinTemplate extends Skin {
$tpl->set( 'userlangattributes', '' );
$tpl->set( 'specialpageattributes', '' ); # obsolete
- if ( $userlang !== $contentlang || $userdir !== $contentdir ) {
+ if ( $userlang !== $wgContLang->getHtmlCode() || $userdir !== $wgContLang->getDir() ) {
$attrs = " lang='$userlang' dir='$userdir'";
$tpl->set( 'userlangattributes', $attrs );
}
- $newtalks = $this->getNewtalks( $out );
-
wfProfileOut( __METHOD__ . '-stuff2' );
wfProfileIn( __METHOD__ . '-stuff3' );
- $tpl->setRef( 'newtalk', $newtalks );
- $tpl->setRef( 'skin', $this );
+ $tpl->set( 'newtalk', $this->getNewtalks() );
$tpl->set( 'logo', $this->logoText() );
- if ( $out->isArticle() && ( !isset( $oldid ) || isset( $diff ) ) &&
- $this->getTitle()->exists() )
- {
- $article = new Article( $this->getTitle(), 0 );
- if ( !$wgDisableCounters ) {
- $viewcount = $wgLang->formatNum( $article->getCount() );
- if ( $viewcount ) {
- $tpl->set( 'viewcount', wfMsgExt( 'viewcount', array( 'parseinline' ), $viewcount ) );
- } else {
- $tpl->set( 'viewcount', false );
+
+ $tpl->set( 'copyright', false );
+ $tpl->set( 'viewcount', false );
+ $tpl->set( 'lastmod', false );
+ $tpl->set( 'credits', false );
+ $tpl->set( 'numberofwatchingusers', false );
+ if ( $out->isArticle() && $title->exists() ) {
+ if ( $this->isRevisionCurrent() ) {
+ if ( !$wgDisableCounters ) {
+ $viewcount = $this->getWikiPage()->getCount();
+ if ( $viewcount ) {
+ $tpl->set( 'viewcount', $this->msg( 'viewcount' )->numParams( $viewcount )->parse() );
+ }
}
- } else {
- $tpl->set( 'viewcount', false );
- }
- if( $wgPageShowWatchingUsers ) {
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'watchlist',
- array( 'COUNT(*) AS n' ),
- array( 'wl_title' => $dbr->strencode( $this->getTitle()->getDBkey() ), 'wl_namespace' => $this->getTitle()->getNamespace() ),
- __METHOD__
- );
- $x = $dbr->fetchObject( $res );
- $numberofwatchingusers = $x->n;
- if( $numberofwatchingusers > 0 ) {
- $tpl->set( 'numberofwatchingusers',
- wfMsgExt( 'number_of_watching_users_pageview', array( 'parseinline' ),
- $wgLang->formatNum( $numberofwatchingusers ) )
+ if( $wgPageShowWatchingUsers ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $num = $dbr->selectField( 'watchlist', 'COUNT(*)',
+ array( 'wl_title' => $title->getDBkey(), 'wl_namespace' => $title->getNamespace() ),
+ __METHOD__
);
- } else {
- $tpl->set( 'numberofwatchingusers', false );
+ if( $num > 0 ) {
+ $tpl->set( 'numberofwatchingusers',
+ $this->msg( 'number_of_watching_users_pageview' )->numParams( $num )->parse()
+ );
+ }
}
- } else {
- $tpl->set( 'numberofwatchingusers', false );
- }
- $tpl->set( 'copyright', $this->getCopyright() );
-
- $this->credits = false;
-
- if( $wgMaxCredits != 0 ){
- $this->credits = Action::factory( 'credits', $article )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax );
- } else {
- $tpl->set( 'lastmod', $this->lastModified( $article ) );
+ if ( $wgMaxCredits != 0 ) {
+ $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(),
+ $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) );
+ } else {
+ $tpl->set( 'lastmod', $this->lastModified() );
+ }
}
-
- $tpl->setRef( 'credits', $this->credits );
-
- } elseif ( isset( $oldid ) && !isset( $diff ) ) {
$tpl->set( 'copyright', $this->getCopyright() );
- $tpl->set( 'viewcount', false );
- $tpl->set( 'lastmod', false );
- $tpl->set( 'credits', false );
- $tpl->set( 'numberofwatchingusers', false );
- } else {
- $tpl->set( 'copyright', false );
- $tpl->set( 'viewcount', false );
- $tpl->set( 'lastmod', false );
- $tpl->set( 'credits', false );
- $tpl->set( 'numberofwatchingusers', false );
}
wfProfileOut( __METHOD__ . '-stuff3' );
@@ -446,23 +393,27 @@ class SkinTemplate extends Skin {
$tpl->set( 'debug', '' );
}
- $tpl->set( 'reporttime', wfReportTime() );
$tpl->set( 'sitenotice', $this->getSiteNotice() );
- $tpl->set( 'bottomscripts', $this->bottomScripts( $out ) );
+ $tpl->set( 'bottomscripts', $this->bottomScripts() );
$tpl->set( 'printfooter', $this->printSource() );
- # Add a <div class="mw-content-ltr/rtl"> around the body text
+ # An ID that includes the actual body text; without categories, contentSub, ...
+ $realBodyAttribs = array( 'id' => 'mw-content-text' );
+
+ # Add a mw-content-ltr/rtl class to be able to style based on text direction
+ # when the content is different from the UI language, i.e.:
# not for special pages or file pages AND only when viewing AND if the page exists
# (or is in MW namespace, because that has default content)
- if( !in_array( $this->getTitle()->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
- in_array( $action, array( 'view', 'historysubmit' ) ) &&
- ( $this->getTitle()->exists() || $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) ) {
- $pageLang = $this->getTitle()->getPageLanguage();
- $realBodyAttribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
- 'class' => 'mw-content-'.$pageLang->getDir() );
- $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
+ if( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
+ in_array( $request->getVal( 'action', 'view' ), array( 'view', 'historysubmit' ) ) &&
+ ( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) {
+ $pageLang = $title->getPageLanguage();
+ $realBodyAttribs['lang'] = $pageLang->getHtmlCode();
+ $realBodyAttribs['dir'] = $pageLang->getDir();
+ $realBodyAttribs['class'] = 'mw-content-'.$pageLang->getDir();
}
+ $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
$tpl->setRef( 'bodytext', $out->mBodytext );
# Language links
@@ -496,23 +447,24 @@ class SkinTemplate extends Skin {
wfProfileIn( __METHOD__ . '-stuff5' );
# Personal toolbar
- $tpl->set( 'personal_urls', $this->buildPersonalUrls( $out ) );
- $content_navigation = $this->buildContentNavigationUrls( $out );
+ $tpl->set( 'personal_urls', $this->buildPersonalUrls() );
+ $content_navigation = $this->buildContentNavigationUrls();
$content_actions = $this->buildContentActionUrls( $content_navigation );
$tpl->setRef( 'content_navigation', $content_navigation );
$tpl->setRef( 'content_actions', $content_actions );
$tpl->set( 'sidebar', $this->buildSidebar() );
- $tpl->set( 'nav_urls', $this->buildNavUrls( $out ) );
+ $tpl->set( 'nav_urls', $this->buildNavUrls() );
// Set the head scripts near the end, in case the above actions resulted in added scripts
if ( $this->useHeadElement ) {
$tpl->set( 'headelement', $out->headElement( $this ) );
} else {
- $tpl->set( 'headscripts', $out->getScript() );
+ $tpl->set( 'headscripts', $out->getHeadScripts() . $out->getHeadItems() );
}
$tpl->set( 'debughtml', $this->generateDebugHTML() );
+ $tpl->set( 'reporttime', wfReportTime() );
// original version by hansm
if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
@@ -540,6 +492,10 @@ class SkinTemplate extends Skin {
// result may be an error
$this->printOrError( $res );
+
+ if ( $oldContext ) {
+ $this->setContext( $oldContext );
+ }
wfProfileOut( __METHOD__ );
}
@@ -572,26 +528,25 @@ class SkinTemplate extends Skin {
* build array of urls for personal toolbar
* @return array
*/
- protected function buildPersonalUrls( OutputPage $out ) {
- global $wgRequest;
-
- $title = $out->getTitle();
+ protected function buildPersonalUrls() {
+ $title = $this->getTitle();
+ $request = $this->getRequest();
$pageurl = $title->getLocalURL();
wfProfileIn( __METHOD__ );
/* set up the default links for the personal toolbar */
$personal_urls = array();
-
- # Due to bug 32276, if a user does not have read permissions,
- # $this->getTitle() will just give Special:Badtitle, which is
- # not especially useful as a returnto parameter. Use the title
+
+ # Due to bug 32276, if a user does not have read permissions,
+ # $this->getTitle() will just give Special:Badtitle, which is
+ # not especially useful as a returnto parameter. Use the title
# from the request instead, if there was one.
- $page = Title::newFromURL( $wgRequest->getVal( 'title', '' ) );
- $page = $wgRequest->getVal( 'returnto', $page );
+ $page = Title::newFromURL( $request->getVal( 'title', '' ) );
+ $page = $request->getVal( 'returnto', $page );
$a = array();
if ( strval( $page ) !== '' ) {
$a['returnto'] = $page;
- $query = $wgRequest->getVal( 'returntoquery', $this->thisquery );
+ $query = $request->getVal( 'returntoquery', $this->thisquery );
if( $query != '' ) {
$a['returntoquery'] = $query;
}
@@ -606,20 +561,20 @@ class SkinTemplate extends Skin {
);
$usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage );
$personal_urls['mytalk'] = array(
- 'text' => wfMsg( 'mytalk' ),
+ 'text' => $this->msg( 'mytalk' )->text(),
'href' => &$usertalkUrlDetails['href'],
'class' => $usertalkUrlDetails['exists'] ? false : 'new',
'active' => ( $usertalkUrlDetails['href'] == $pageurl )
);
$href = self::makeSpecialUrl( 'Preferences' );
$personal_urls['preferences'] = array(
- 'text' => wfMsg( 'mypreferences' ),
+ 'text' => $this->msg( 'mypreferences' )->text(),
'href' => $href,
'active' => ( $href == $pageurl )
);
$href = self::makeSpecialUrl( 'Watchlist' );
$personal_urls['watchlist'] = array(
- 'text' => wfMsg( 'mywatchlist' ),
+ 'text' => $this->msg( 'mywatchlist' )->text(),
'href' => $href,
'active' => ( $href == $pageurl )
);
@@ -627,26 +582,26 @@ class SkinTemplate extends Skin {
# We need to do an explicit check for Special:Contributions, as we
# have to match both the title, and the target (which could come
# from request values or be specified in "sub page" form. The plot
- # thickens, because $wgTitle is altered for special pages, so doesn't
- # contain the original alias-with-subpage.
- $origTitle = Title::newFromText( $wgRequest->getText( 'title' ) );
- if( $origTitle instanceof Title && $origTitle->getNamespace() == NS_SPECIAL ) {
+ # thickens, because the Title object is altered for special pages,
+ # so doesn't contain the original alias-with-subpage.
+ $origTitle = Title::newFromText( $request->getText( 'title' ) );
+ if( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() );
$active = $spName == 'Contributions'
&& ( ( $spPar && $spPar == $this->username )
- || $wgRequest->getText( 'target' ) == $this->username );
+ || $request->getText( 'target' ) == $this->username );
} else {
$active = false;
}
$href = self::makeSpecialUrlSubpage( 'Contributions', $this->username );
$personal_urls['mycontris'] = array(
- 'text' => wfMsg( 'mycontris' ),
+ 'text' => $this->msg( 'mycontris' )->text(),
'href' => $href,
'active' => $active
);
$personal_urls['logout'] = array(
- 'text' => wfMsg( 'userlogout' ),
+ 'text' => $this->msg( 'userlogout' )->text(),
'href' => self::makeSpecialUrl( 'Userlogout',
// userlogout link must always contain an & character, otherwise we might not be able
// to detect a buggy precaching proxy (bug 17790)
@@ -655,22 +610,21 @@ class SkinTemplate extends Skin {
'active' => false
);
} else {
- global $wgUser;
$useCombinedLoginLink = $this->useCombinedLoginLink();
- $loginlink = $wgUser->isAllowed( 'createaccount' ) && $useCombinedLoginLink
+ $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink
? 'nav-login-createaccount'
: 'login';
- $is_signup = $wgRequest->getText('type') == "signup";
+ $is_signup = $request->getText('type') == "signup";
# anonlogin & login are the same
$login_url = array(
- 'text' => wfMsg( $loginlink ),
+ 'text' => $this->msg( $loginlink )->text(),
'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == "nav-login-createaccount" || !$is_signup )
);
- if ( $wgUser->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) {
+ if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) {
$createaccount_url = array(
- 'text' => wfMsg( 'createaccount' ),
+ 'text' => $this->msg( 'createaccount' )->text(),
'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
'active' => $title->isSpecial( 'Userlogin' ) && $is_signup
);
@@ -703,7 +657,7 @@ class SkinTemplate extends Skin {
$usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage );
$href = &$usertalkUrlDetails['href'];
$personal_urls['anontalk'] = array(
- 'text' => wfMsg( 'anontalk' ),
+ 'text' => $this->msg( 'anontalk' )->text(),
'href' => $href,
'class' => $usertalkUrlDetails['exists'] ? false : 'new',
'active' => ( $pageurl == $href )
@@ -743,7 +697,7 @@ class SkinTemplate extends Skin {
// wfMessageFallback will nicely accept $message as an array of fallbacks
// or just a single key
- $msg = wfMessageFallback( $message );
+ $msg = wfMessageFallback( $message )->setContext( $this->getContext() );
if ( is_array($message) ) {
// for hook compatibility just keep the last message name
$message = end($message);
@@ -826,8 +780,7 @@ class SkinTemplate extends Skin {
*
* @return array
*/
- protected function buildContentNavigationUrls( OutputPage $out ) {
- global $wgContLang, $wgLang, $wgUser, $wgRequest;
+ protected function buildContentNavigationUrls() {
global $wgDisableLangConversion;
wfProfileIn( __METHOD__ );
@@ -835,6 +788,10 @@ class SkinTemplate extends Skin {
$title = $this->getRelevantTitle(); // Display tabs for the relevant title rather than always the title itself
$onPage = $title->equals($this->getTitle());
+ $out = $this->getOutput();
+ $request = $this->getRequest();
+ $user = $this->getUser();
+
$content_navigation = array(
'namespaces' => array(),
'views' => array(),
@@ -843,11 +800,9 @@ class SkinTemplate extends Skin {
);
// parameters
- $action = $wgRequest->getVal( 'action', 'view' );
- $section = $wgRequest->getVal( 'section' );
+ $action = $request->getVal( 'action', 'view' );
- $userCanRead = $title->userCanRead();
- $skname = $this->skinname;
+ $userCanRead = $title->quickUserCan( 'read', $user );
$preventActiveTabs = false;
wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) );
@@ -870,6 +825,8 @@ class SkinTemplate extends Skin {
$talkId = "{$subjectId}_talk";
}
+ $skname = $this->skinname;
+
// Adds namespace links
$subjectMsg = array( "nstab-$subjectId" );
if ( $subjectPage->isMainPage() ) {
@@ -884,163 +841,175 @@ class SkinTemplate extends Skin {
);
$content_navigation['namespaces'][$talkId]['context'] = 'talk';
- // Adds view view link
- if ( $title->exists() && $userCanRead ) {
- $content_navigation['views']['view'] = $this->tabAction(
- $isTalk ? $talkPage : $subjectPage,
- array( "$skname-view-view", 'view' ),
- ( $onPage && ($action == 'view' || $action == 'purge' ) ), '', true
- );
- $content_navigation['views']['view']['redundant'] = true; // signal to hide this from simple content_actions
- }
+ if ( $userCanRead ) {
+ // Adds view view link
+ if ( $title->exists() ) {
+ $content_navigation['views']['view'] = $this->tabAction(
+ $isTalk ? $talkPage : $subjectPage,
+ array( "$skname-view-view", 'view' ),
+ ( $onPage && ($action == 'view' || $action == 'purge' ) ), '', true
+ );
+ $content_navigation['views']['view']['redundant'] = true; // signal to hide this from simple content_actions
+ }
- wfProfileIn( __METHOD__ . '-edit' );
-
- // Checks if user can...
- if (
- // read and edit the current page
- $userCanRead && $title->quickUserCan( 'edit' ) &&
- (
- // if it exists
- $title->exists() ||
- // or they can create one here
- $title->quickUserCan( 'create' )
- )
- ) {
- // Builds CSS class for talk page links
- $isTalkClass = $isTalk ? ' istalk' : '';
-
- // Determines if we're in edit mode
- $selected = (
- $onPage &&
- ( $action == 'edit' || $action == 'submit' ) &&
- ( $section != 'new' )
- );
- $msgKey = $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ?
- "edit" : "create";
- $content_navigation['views']['edit'] = array(
- 'class' => ( $selected ? 'selected' : '' ) . $isTalkClass,
- 'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->text(),
- 'href' => $title->getLocalURL( $this->editUrlOptions() ),
- 'primary' => true, // don't collapse this in vector
- );
- // Checks if this is a current rev of talk page and we should show a new
- // section link
- if ( ( $isTalk && $this->isRevisionCurrent() ) || ( $out->showNewSectionLink() ) ) {
- // Checks if we should ever show a new section link
- if ( !$out->forceHideNewSectionLink() ) {
+ wfProfileIn( __METHOD__ . '-edit' );
+
+ // Checks if user can edit the current page if it exists or create it otherwise
+ if ( $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) ) ) {
+ // Builds CSS class for talk page links
+ $isTalkClass = $isTalk ? ' istalk' : '';
+ // Whether the user is editing the page
+ $isEditing = $onPage && ( $action == 'edit' || $action == 'submit' );
+ // Whether to show the "Add a new section" tab
+ // Checks if this is a current rev of talk page and is not forced to be hidden
+ $showNewSection = !$out->forceHideNewSectionLink()
+ && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() );
+ $section = $request->getVal( 'section' );
+
+ $msgKey = $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ?
+ "edit" : "create";
+ $content_navigation['views']['edit'] = array(
+ 'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) ? 'selected' : '' ) . $isTalkClass,
+ 'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->setContext( $this->getContext() )->text(),
+ 'href' => $title->getLocalURL( $this->editUrlOptions() ),
+ 'primary' => true, // don't collapse this in vector
+ );
+
+ // section link
+ if ( $showNewSection ) {
// Adds new section link
//$content_navigation['actions']['addsection']
$content_navigation['views']['addsection'] = array(
- 'class' => $section == 'new' ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )->text(),
+ 'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false,
+ 'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )->setContext( $this->getContext() )->text(),
'href' => $title->getLocalURL( 'action=edit&section=new' )
);
}
- }
- // Checks if the page has some kind of viewable content
- } elseif ( $title->hasSourceText() && $userCanRead ) {
- // Adds view source view link
- $content_navigation['views']['viewsource'] = array(
- 'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )->text(),
- 'href' => $title->getLocalURL( $this->editUrlOptions() ),
- 'primary' => true, // don't collapse this in vector
- );
- }
- wfProfileOut( __METHOD__ . '-edit' );
-
- wfProfileIn( __METHOD__ . '-live' );
-
- // Checks if the page exists
- if ( $title->exists() && $userCanRead ) {
- // Adds history view link
- $content_navigation['views']['history'] = array(
- 'class' => ( $onPage && $action == 'history' ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-view-history", 'history_short' )->text(),
- 'href' => $title->getLocalURL( 'action=history' ),
- 'rel' => 'archives',
- );
-
- if( $wgUser->isAllowed( 'delete' ) ) {
- $content_navigation['actions']['delete'] = array(
- 'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-delete", 'delete' )->text(),
- 'href' => $title->getLocalURL( 'action=delete' )
+ // Checks if the page has some kind of viewable content
+ } elseif ( $title->hasSourceText() ) {
+ // Adds view source view link
+ $content_navigation['views']['viewsource'] = array(
+ 'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false,
+ 'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )->setContext( $this->getContext() )->text(),
+ 'href' => $title->getLocalURL( $this->editUrlOptions() ),
+ 'primary' => true, // don't collapse this in vector
);
}
- if ( $title->quickUserCan( 'move' ) ) {
- $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() );
- $content_navigation['actions']['move'] = array(
- 'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-move", 'move' )->text(),
- 'href' => $moveTitle->getLocalURL()
+ wfProfileOut( __METHOD__ . '-edit' );
+
+ wfProfileIn( __METHOD__ . '-live' );
+ // Checks if the page exists
+ if ( $title->exists() ) {
+ // Adds history view link
+ $content_navigation['views']['history'] = array(
+ 'class' => ( $onPage && $action == 'history' ) ? 'selected' : false,
+ 'text' => wfMessageFallback( "$skname-view-history", 'history_short' )->setContext( $this->getContext() )->text(),
+ 'href' => $title->getLocalURL( 'action=history' ),
+ 'rel' => 'archives',
);
+
+ if ( $title->quickUserCan( 'delete', $user ) ) {
+ $content_navigation['actions']['delete'] = array(
+ 'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false,
+ 'text' => wfMessageFallback( "$skname-action-delete", 'delete' )->setContext( $this->getContext() )->text(),
+ 'href' => $title->getLocalURL( 'action=delete' )
+ );
+ }
+
+ if ( $title->quickUserCan( 'move', $user ) ) {
+ $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() );
+ $content_navigation['actions']['move'] = array(
+ 'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false,
+ 'text' => wfMessageFallback( "$skname-action-move", 'move' )->setContext( $this->getContext() )->text(),
+ 'href' => $moveTitle->getLocalURL()
+ );
+ }
+ } else {
+ // article doesn't exist or is deleted
+ if ( $user->isAllowed( 'deletedhistory' ) ) {
+ $n = $title->isDeleted();
+ if( $n ) {
+ $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
+ // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead
+ $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted';
+ $content_navigation['actions']['undelete'] = array(
+ 'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false,
+ 'text' => wfMessageFallback( "$skname-action-$msgKey", "{$msgKey}_short" )
+ ->setContext( $this->getContext() )->numParams( $n )->text(),
+ 'href' => $undelTitle->getLocalURL( array( 'target' => $title->getPrefixedDBkey() ) )
+ );
+ }
+ }
}
- if ( $title->getNamespace() !== NS_MEDIAWIKI && $wgUser->isAllowed( 'protect' ) ) {
- $mode = !$title->isProtected() ? 'protect' : 'unprotect';
+ if ( $title->getNamespace() !== NS_MEDIAWIKI && $title->quickUserCan( 'protect', $user ) ) {
+ $mode = $title->isProtected() ? 'unprotect' : 'protect';
$content_navigation['actions'][$mode] = array(
'class' => ( $onPage && $action == $mode ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-$mode", $mode )->text(),
+ 'text' => wfMessageFallback( "$skname-action-$mode", $mode )->setContext( $this->getContext() )->text(),
'href' => $title->getLocalURL( "action=$mode" )
);
}
- } else {
- // article doesn't exist or is deleted
- if ( $wgUser->isAllowed( 'deletedhistory' ) ) {
- $n = $title->isDeleted();
- if( $n ) {
- $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
- // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead
- $msgKey = $wgUser->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted';
- $content_navigation['actions']['undelete'] = array(
- 'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-$msgKey", "{$msgKey}_short" )
- ->params( $wgLang->formatNum( $n ) )->text(),
- 'href' => $undelTitle->getLocalURL( array( 'target' => $title->getPrefixedDBkey() ) )
- );
- }
- }
- if ( $title->getNamespace() !== NS_MEDIAWIKI && $wgUser->isAllowed( 'protect' ) ) {
- $mode = !$title->getRestrictions( 'create' ) ? 'protect' : 'unprotect';
+ wfProfileOut( __METHOD__ . '-live' );
+
+ // Checks if the user is logged in
+ if ( $this->loggedin ) {
+ /**
+ * The following actions use messages which, if made particular to
+ * the any specific skins, would break the Ajax code which makes this
+ * action happen entirely inline. Skin::makeGlobalVariablesScript
+ * defines a set of messages in a javascript object - and these
+ * messages are assumed to be global for all skins. Without making
+ * a change to that procedure these messages will have to remain as
+ * the global versions.
+ */
+ $mode = $title->userIsWatching() ? 'unwatch' : 'watch';
+ $token = WatchAction::getWatchToken( $title, $user, $mode );
$content_navigation['actions'][$mode] = array(
- 'class' => ( $onPage && $action == $mode ) ? 'selected' : false,
- 'text' => wfMessageFallback( "$skname-action-$mode", $mode )->text(),
- 'href' => $title->getLocalURL( "action=$mode" )
+ 'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false,
+ 'text' => $this->msg( $mode )->text(), // uses 'watch' or 'unwatch' message
+ 'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) )
);
}
}
- wfProfileOut( __METHOD__ . '-live' );
-
- // Checks if the user is logged in
- if ( $this->loggedin ) {
- /**
- * The following actions use messages which, if made particular to
- * the any specific skins, would break the Ajax code which makes this
- * action happen entirely inline. Skin::makeGlobalVariablesScript
- * defines a set of messages in a javascript object - and these
- * messages are assumed to be global for all skins. Without making
- * a change to that procedure these messages will have to remain as
- * the global versions.
- */
- $mode = $title->userIsWatching() ? 'unwatch' : 'watch';
- $token = WatchAction::getWatchToken( $title, $wgUser, $mode );
- $content_navigation['actions'][$mode] = array(
- 'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false,
- 'text' => wfMsg( $mode ), // uses 'watch' or 'unwatch' message
- 'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) )
- );
- }
wfRunHooks( 'SkinTemplateNavigation', array( &$this, &$content_navigation ) );
+
+ if ( $userCanRead && !$wgDisableLangConversion ) {
+ $pageLang = $title->getPageLanguage();
+ // Gets list of language variants
+ $variants = $pageLang->getVariants();
+ // Checks that language conversion is enabled and variants exist
+ // And if it is not in the special namespace
+ if( count( $variants ) > 1 ) {
+ // Gets preferred variant (note that user preference is
+ // only possible for wiki content language variant)
+ $preferred = $pageLang->getPreferredVariant();
+ // Loops over each variant
+ 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 ) )
+ );
+ }
+ }
+ }
} else {
// If it's not content, it's got to be a special page
$content_navigation['namespaces']['special'] = array(
'class' => 'selected',
- 'text' => wfMsg( 'nstab-special' ),
- 'href' => $wgRequest->getRequestURL(), // @bug 2457, 2510
+ 'text' => $this->msg( 'nstab-special' )->text(),
+ 'href' => $request->getRequestURL(), // @bug 2457, 2510
'context' => 'subject'
);
@@ -1048,30 +1017,6 @@ class SkinTemplate extends Skin {
array( &$this, &$content_navigation ) );
}
- // Gets list of language variants
- $variants = $wgContLang->getVariants();
- // Checks that language conversion is enabled and variants exist
- if( !$wgDisableLangConversion && count( $variants ) > 1 ) {
- // Gets preferred variant
- $preferred = $wgContLang->getPreferredVariant();
- // Loops over each variant
- foreach( $variants as $code ) {
- // Gets variant name from language code
- $varname = $wgContLang->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( '', $code )
- );
- }
- }
-
// Equiv to SkinTemplateContentActions
wfRunHooks( 'SkinTemplateNavigation::Universal', array( &$this, &$content_navigation ) );
@@ -1168,36 +1113,42 @@ class SkinTemplate extends Skin {
* @return array
* @private
*/
- protected function buildNavUrls( OutputPage $out ) {
- global $wgUseTrackbacks, $wgUser, $wgRequest;
+ protected function buildNavUrls() {
global $wgUploadNavigationUrl;
wfProfileIn( __METHOD__ );
- $action = $wgRequest->getVal( 'action', 'view' );
+ $out = $this->getOutput();
+ $request = $this->getRequest();
$nav_urls = array();
$nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
if( $wgUploadNavigationUrl ) {
$nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
- } elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ } elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
$nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) );
} else {
$nav_urls['upload'] = false;
}
$nav_urls['specialpages'] = array( 'href' => self::makeSpecialUrl( 'Specialpages' ) );
- // default permalink to being off, will override it as required below.
+ $nav_urls['print'] = false;
$nav_urls['permalink'] = false;
+ $nav_urls['whatlinkshere'] = false;
+ $nav_urls['recentchangeslinked'] = false;
+ $nav_urls['contributions'] = false;
+ $nav_urls['log'] = false;
+ $nav_urls['blockip'] = false;
+ $nav_urls['emailuser'] = false;
// A print stylesheet is attached to all pages, but nobody ever
// figures that out. :) Add a link...
- if( $this->iscontent && ( $action == 'view' || $action == 'purge' ) ) {
+ if( $out->isArticle() ) {
if ( !$out->isPrintable() ) {
$nav_urls['print'] = array(
- 'text' => wfMsg( 'printableversion' ),
+ 'text' => $this->msg( 'printableversion' )->text(),
'href' => $this->getTitle()->getLocalURL(
- $wgRequest->appendQueryValue( 'printable', 'yes', true ) )
+ $request->appendQueryValue( 'printable', 'yes', true ) )
);
}
@@ -1205,7 +1156,7 @@ class SkinTemplate extends Skin {
$revid = $this->getRevisionId();
if ( $revid ) {
$nav_urls['permalink'] = array(
- 'text' => wfMsg( 'permalink' ),
+ 'text' => $this->msg( 'permalink' )->text(),
'href' => $out->getTitle()->getLocalURL( "oldid=$revid" )
);
}
@@ -1215,72 +1166,45 @@ class SkinTemplate extends Skin {
array( &$this, &$nav_urls, &$revid, &$revid ) );
}
- if( $this->getTitle()->getNamespace() != NS_SPECIAL ) {
- $wlhTitle = SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage );
+ if ( $out->isArticleRelated() ) {
$nav_urls['whatlinkshere'] = array(
- 'href' => $wlhTitle->getLocalUrl()
+ 'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
);
- if( $this->getTitle()->getArticleId() ) {
- $rclTitle = SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage );
+ if ( $this->getTitle()->getArticleId() ) {
$nav_urls['recentchangeslinked'] = array(
- 'href' => $rclTitle->getLocalUrl()
+ 'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
);
- } else {
- $nav_urls['recentchangeslinked'] = false;
}
- if( $wgUseTrackbacks )
- $nav_urls['trackbacklink'] = array(
- 'href' => $out->getTitle()->trackbackURL()
- );
}
$user = $this->getRelevantUser();
if ( $user ) {
- $id = $user->getID();
- $ip = $user->isAnon();
$rootUser = $user->getName();
- } else {
- $id = 0;
- $ip = false;
- $rootUser = null;
- }
- if( $id || $ip ) { # both anons and non-anons have contribs list
$nav_urls['contributions'] = array(
'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser )
);
- if( $id ) {
+ if ( $user->isLoggedIn() ) {
$logPage = SpecialPage::getTitleFor( 'Log' );
$nav_urls['log'] = array(
- 'href' => $logPage->getLocalUrl(
- array(
- 'user' => $rootUser
- )
- )
+ 'href' => $logPage->getLocalUrl( array( 'user' => $rootUser ) )
);
- } else {
- $nav_urls['log'] = false;
}
- if ( $wgUser->isAllowed( 'block' ) ) {
+ if ( $this->getUser()->isAllowed( 'block' ) ) {
$nav_urls['blockip'] = array(
'href' => self::makeSpecialUrlSubpage( 'Block', $rootUser )
);
- } else {
- $nav_urls['blockip'] = false;
}
- } else {
- $nav_urls['contributions'] = false;
- $nav_urls['log'] = false;
- $nav_urls['blockip'] = false;
- }
- $nav_urls['emailuser'] = false;
- if( $this->showEmailUser( $id ) ) {
- $nav_urls['emailuser'] = array(
- 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser )
- );
+
+ if ( $this->showEmailUser( $user ) ) {
+ $nav_urls['emailuser'] = array(
+ 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser )
+ );
+ }
}
+
wfProfileOut( __METHOD__ );
return $nav_urls;
}
@@ -1294,41 +1218,6 @@ class SkinTemplate extends Skin {
return $this->getTitle()->getNamespaceKey();
}
- /**
- * @private
- * @todo FIXME: Why is this duplicated in/from OutputPage::getHeadScripts()??
- */
- function setupUserJs( $allowUserJs ) {
- global $wgRequest, $wgJsMimeType;
- wfProfileIn( __METHOD__ );
-
- $action = $wgRequest->getVal( 'action', 'view' );
-
- if( $allowUserJs && $this->loggedin ) {
- if( $this->getTitle()->isJsSubpage() and $this->userCanPreview( $action ) ) {
- # XXX: additional security check/prompt?
- $this->userjsprev = '/*<![CDATA[*/ ' . $wgRequest->getText( 'wpTextbox1' ) . ' /*]]>*/';
- } else {
- $this->userjs = self::makeUrl( $this->userpage . '/' . $this->skinname . '.js', 'action=raw&ctype=' . $wgJsMimeType );
- }
- }
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Code for extensions to hook into to provide per-page CSS, see
- * extensions/PageCSS/PageCSS.php for an implementation of this.
- *
- * @private
- */
- function setupPageCss() {
- wfProfileIn( __METHOD__ );
- $out = false;
- wfRunHooks( 'SkinTemplateSetupPageCss', array( &$out ) );
- wfProfileOut( __METHOD__ );
- return $out;
- }
-
public function commonPrintStylesheet() {
return false;
}
@@ -1418,12 +1307,10 @@ abstract class QuickTemplate {
* @private
*/
function msgWiki( $str ) {
- global $wgParser, $wgOut;
+ global $wgOut;
$text = $this->translator->translate( $str );
- $parserOutput = $wgParser->parse( $text, $wgOut->getTitle(),
- $wgOut->parserOptions(), true );
- echo $parserOutput->getText();
+ echo $wgOut->parse( $text );
}
/**
@@ -1461,6 +1348,28 @@ abstract class QuickTemplate {
abstract class BaseTemplate extends QuickTemplate {
/**
+ * Get a Message object with its context set
+ *
+ * @param $name Str message name
+ * @return Message
+ */
+ public function getMsg( $name ) {
+ return $this->getSkin()->msg( $name );
+ }
+
+ function msg( $str ) {
+ echo $this->getMsg( $str )->escaped();
+ }
+
+ function msgHtml( $str ) {
+ echo $this->getMsg( $str )->text();
+ }
+
+ function msgWiki( $str ) {
+ echo $this->getMsg( $str )->parseAsBlock();
+ }
+
+ /**
* Create an array of common toolbox items from the data in the quicktemplate
* stored by SkinTemplate.
* The resulting array is built acording to a format intended to be passed
@@ -1470,20 +1379,16 @@ abstract class BaseTemplate extends QuickTemplate {
wfProfileIn( __METHOD__ );
$toolbox = array();
- if ( $this->data['notspecialpage'] ) {
+ if ( isset( $this->data['nav_urls']['whatlinkshere'] ) && $this->data['nav_urls']['whatlinkshere'] ) {
$toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere'];
$toolbox['whatlinkshere']['id'] = 't-whatlinkshere';
- if ( $this->data['nav_urls']['recentchangeslinked'] ) {
- $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked'];
- $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox';
- $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked';
- }
}
- if( isset( $this->data['nav_urls']['trackbacklink'] ) && $this->data['nav_urls']['trackbacklink'] ) {
- $toolbox['trackbacklink'] = $this->data['nav_urls']['trackbacklink'];
- $toolbox['trackbacklink']['id'] = 't-trackbacklink';
+ if ( isset( $this->data['nav_urls']['recentchangeslinked'] ) && $this->data['nav_urls']['recentchangeslinked'] ) {
+ $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked'];
+ $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox';
+ $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked';
}
- if ( $this->data['feeds'] ) {
+ if ( isset( $this->data['feeds'] ) && $this->data['feeds'] ) {
$toolbox['feeds']['id'] = 'feedlinks';
$toolbox['feeds']['links'] = array();
foreach ( $this->data['feeds'] as $key => $feed ) {
@@ -1495,17 +1400,17 @@ abstract class BaseTemplate extends QuickTemplate {
}
}
foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', 'upload', 'specialpages' ) as $special ) {
- if ( $this->data['nav_urls'][$special] ) {
+ if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) {
$toolbox[$special] = $this->data['nav_urls'][$special];
$toolbox[$special]['id'] = "t-$special";
}
}
- if ( !empty( $this->data['nav_urls']['print']['href'] ) ) {
+ if ( isset( $this->data['nav_urls']['print'] ) && $this->data['nav_urls']['print'] ) {
$toolbox['print'] = $this->data['nav_urls']['print'];
$toolbox['print']['rel'] = 'alternate';
$toolbox['print']['msg'] = 'printableversion';
}
- if( $this->data['nav_urls']['permalink'] ) {
+ if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) {
$toolbox['permalink'] = $this->data['nav_urls']['permalink'];
if( $toolbox['permalink']['href'] === '' ) {
unset( $toolbox['permalink']['href'] );
@@ -1583,13 +1488,13 @@ abstract class BaseTemplate extends QuickTemplate {
// Search is a special case, skins should custom implement this
$boxes[$boxName] = array(
'id' => "p-search",
- 'header' => wfMessage( 'search' )->text(),
+ 'header' => $this->getMsg( 'search' )->text(),
'generated' => false,
'content' => true,
);
break;
case 'TOOLBOX':
- $msgObj = wfMessage( 'toolbox' );
+ $msgObj = $this->getMsg( 'toolbox' );
$boxes[$boxName] = array(
'id' => "p-tb",
'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
@@ -1599,7 +1504,7 @@ abstract class BaseTemplate extends QuickTemplate {
break;
case 'LANGUAGES':
if ( $this->data['language_urls'] ) {
- $msgObj = wfMessage( 'otherlanguages' );
+ $msgObj = $this->getMsg( 'otherlanguages' );
$boxes[$boxName] = array(
'id' => "p-lang",
'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
@@ -1609,7 +1514,7 @@ abstract class BaseTemplate extends QuickTemplate {
}
break;
default:
- $msgObj = wfMessage( $boxName );
+ $msgObj = $this->getMsg( $boxName );
$boxes[$boxName] = array(
'id' => "p-$boxName",
'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 022ef824..17a36ecf 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -31,7 +31,7 @@ class SpecialPage {
// The canonical name of this special page
// Also used for the default <h1> heading, @see getDescription()
- /*private*/ var $mName;
+ protected $mName;
// The local name of this special page
private $mLocalName;
@@ -67,6 +67,7 @@ class SpecialPage {
* @deprecated since 1.18
*/
static function initList() {
+ wfDeprecated( __METHOD__, '1.18' );
// Noop
}
@@ -74,6 +75,7 @@ class SpecialPage {
* @deprecated since 1.18
*/
static function initAliasList() {
+ wfDeprecated( __METHOD__, '1.18' );
// Noop
}
@@ -86,6 +88,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function resolveAlias( $alias ) {
+ wfDeprecated( __METHOD__, '1.18' );
list( $name, /*...*/ ) = SpecialPageFactory::resolveAlias( $alias );
return $name;
}
@@ -112,7 +115,7 @@ class SpecialPage {
* @deprecated since 1.7, warnings in 1.17, might be removed in 1.20
*/
static function addPage( &$page ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.7' );
SpecialPageFactory::getList()->{$page->mName} = $page;
}
@@ -125,6 +128,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function setGroup( $page, $group ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::setGroup( $page, $group );
}
@@ -136,6 +140,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getGroup( &$page ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getGroup( $page );
}
@@ -148,6 +153,7 @@ class SpecialPage {
* @param $name String the page to remove
*/
static function removePage( $name ) {
+ wfDeprecated( __METHOD__, '1.18' );
unset( SpecialPageFactory::getList()->$name );
}
@@ -159,6 +165,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function exists( $name ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::exists( $name );
}
@@ -170,6 +177,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getPage( $name ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getPage( $name );
}
@@ -182,6 +190,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getPageByAlias( $alias ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getPage( $alias );
}
@@ -189,11 +198,14 @@ class SpecialPage {
* Return categorised listable special pages which are available
* for the current user, and everyone.
*
+ * @param $user User object to check permissions, $wgUser will be used
+ * if not provided
* @return Associative array mapping page's name to its SpecialPage object
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
- static function getUsablePages() {
- return SpecialPageFactory::getUsablePages();
+ static function getUsablePages( User $user = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return SpecialPageFactory::getUsablePages( $user );
}
/**
@@ -203,6 +215,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getRegularPages() {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getRegularPages();
}
@@ -214,6 +227,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getRestrictedPages() {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getRestrictedPages();
}
@@ -232,23 +246,11 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
public static function executePath( &$title, IContextSource &$context, $including = false ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::executePath( $title, $context, $including );
}
/**
- * Just like executePath() except it returns the HTML instead of outputting it
- * Returns false if there was no such special page, or a title object if it was
- * a redirect.
- *
- * @param $title Title
- * @return String: HTML fragment
- * @deprecated since 1.18 call SpecialPageFactory method directly
- */
- static function capturePath( &$title ) {
- return SpecialPageFactory::capturePath( $title );
- }
-
- /**
* Get the local name for a specified canonical name
*
* @param $name String
@@ -258,6 +260,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getLocalNameFor( $name, $subpage = false ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getLocalNameFor( $name, $subpage );
}
@@ -301,6 +304,7 @@ class SpecialPage {
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
static function getTitleForAlias( $alias ) {
+ wfDeprecated( __METHOD__, '1.18' );
return SpecialPageFactory::getTitleForAlias( $alias );
}
@@ -344,12 +348,12 @@ class SpecialPage {
$this->mListed = $listed;
$this->mIncludable = $includable;
if ( !$function ) {
- $this->mFunction = 'wfSpecial'.$name;
+ $this->mFunction = 'wfSpecial' . $name;
} else {
$this->mFunction = $function;
}
if ( $file === 'default' ) {
- $this->mFile = dirname(__FILE__) . "/specials/Special$name.php";
+ $this->mFile = dirname( __FILE__ ) . "/specials/Special$name.php";
} else {
$this->mFile = $file;
}
@@ -364,11 +368,11 @@ class SpecialPage {
* @deprecated since 1.17, call parent::__construct()
*/
public function __call( $fName, $a ) {
- // Sometimes $fName is SpecialPage, sometimes it's specialpage. <3 PHP
- if( strtolower( $fName ) == 'specialpage' ) {
- // Deprecated messages now, remove in 1.18 or 1.20?
- wfDeprecated( __METHOD__ );
+ // Deprecated messages now, remove in 1.19 or 1.20?
+ wfDeprecated( __METHOD__, '1.17' );
+ // Sometimes $fName is SpecialPage, sometimes it's specialpage. <3 PHP
+ if ( strtolower( $fName ) == 'specialpage' ) {
$name = isset( $a[0] ) ? $a[0] : '';
$restriction = isset( $a[1] ) ? $a[1] : '';
$listed = isset( $a[2] ) ? $a[2] : true;
@@ -406,6 +410,7 @@ class SpecialPage {
* @deprecated since 1.18
*/
function getFile() {
+ wfDeprecated( __METHOD__, '1.18' );
return $this->mFile;
}
@@ -433,7 +438,7 @@ class SpecialPage {
* @param $x Bool
* @return Bool
*/
- function listed( $x = null) {
+ function listed( $x = null ) {
return wfSetVar( $this->mListed, $x );
}
@@ -441,7 +446,7 @@ class SpecialPage {
* Whether it's allowed to transclude the special page via {{Special:Foo/params}}
* @return Bool
*/
- public function isIncludable(){
+ public function isIncludable() {
return $this->mIncludable;
}
@@ -452,11 +457,43 @@ class SpecialPage {
* @return Mixed
* @deprecated since 1.18
*/
- function name( $x = null ) { return wfSetVar( $this->mName, $x ); }
- function restriction( $x = null) { return wfSetVar( $this->mRestriction, $x ); }
- function func( $x = null) { return wfSetVar( $this->mFunction, $x ); }
- function file( $x = null) { return wfSetVar( $this->mFile, $x ); }
- function includable( $x = null ) { return wfSetVar( $this->mIncludable, $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
+ * don't use them.
+ * @param $x Mixed
+ * @return Mixed
+ * @deprecated since 1.18
+ */
+ 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
+ * don't use them.
+ * @param $x Mixed
+ * @return Mixed
+ * @deprecated since 1.18
+ */
+ 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
+ * don't use them.
+ * @param $x Mixed
+ * @return Mixed
+ * @deprecated since 1.18
+ */
+ 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
+ * don't use them.
+ * @param $x Mixed
+ * @return Mixed
+ * @deprecated since 1.18
+ */
+ function includable( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mIncludable, $x ); }
/**
* Whether the special page is being evaluated via transclusion
@@ -499,7 +536,7 @@ class SpecialPage {
public function isRestricted() {
global $wgGroupPermissions;
// DWIM: If all anons can do something, then it is not restricted
- return $this->mRestriction != '' && empty($wgGroupPermissions['*'][$this->mRestriction]);
+ return $this->mRestriction != '' && empty( $wgGroupPermissions['*'][$this->mRestriction] );
}
/**
@@ -522,6 +559,29 @@ class SpecialPage {
}
/**
+ * Checks if userCanExecute, and if not throws a PermissionsError
+ *
+ * @since 1.19
+ */
+ public function checkPermissions() {
+ if ( !$this->userCanExecute( $this->getUser() ) ) {
+ $this->displayRestrictionError();
+ }
+ }
+
+ /**
+ * If the wiki is currently in readonly mode, throws a ReadOnlyError
+ *
+ * @since 1.19
+ * @throws ReadOnlyError
+ */
+ public function checkReadOnly() {
+ if ( wfReadOnly() ) {
+ throw new ReadOnlyError;
+ }
+ }
+
+ /**
* Sets headers - this should be called from the execute() method of all derived classes!
*/
function setHeaders() {
@@ -541,18 +601,15 @@ class SpecialPage {
*/
function execute( $par ) {
$this->setHeaders();
+ $this->checkPermissions();
- if ( $this->userCanExecute( $this->getUser() ) ) {
- $func = $this->mFunction;
- // only load file if the function does not exist
- if( !is_callable($func) && $this->mFile ) {
- require_once( $this->mFile );
- }
- $this->outputHeader();
- call_user_func( $func, $par, $this );
- } else {
- $this->displayRestrictionError();
+ $func = $this->mFunction;
+ // only load file if the function does not exist
+ if ( !is_callable( $func ) && $this->mFile ) {
+ require_once( $this->mFile );
}
+ $this->outputHeader();
+ call_user_func( $func, $par, $this );
}
/**
@@ -566,12 +623,12 @@ class SpecialPage {
function outputHeader( $summaryMessageKey = '' ) {
global $wgContLang;
- if( $summaryMessageKey == '' ) {
+ if ( $summaryMessageKey == '' ) {
$msg = $wgContLang->lc( $this->getName() ) . '-summary';
} else {
$msg = $summaryMessageKey;
}
- if ( !wfMessage( $msg )->isBlank() and ! $this->including() ) {
+ if ( !$this->msg( $msg )->isBlank() && !$this->including() ) {
$this->getOutput()->wrapWikiMsg(
"<div class='mw-specialpage-summary'>\n$1\n</div>", $msg );
}
@@ -589,7 +646,7 @@ class SpecialPage {
* @return String
*/
function getDescription() {
- return wfMsg( strtolower( $this->mName ) );
+ return $this->msg( strtolower( $this->mName ) )->text();
}
/**
@@ -615,7 +672,7 @@ class SpecialPage {
/**
* Gets the context this SpecialPage is executed in
*
- * @return IContextSource
+ * @return IContextSource|RequestContext
* @since 1.18
*/
public function getContext() {
@@ -670,20 +727,23 @@ class SpecialPage {
/**
* Shortcut to get user's language
*
+ * @deprecated 1.19 Use getLanguage instead
* @return Language
* @since 1.18
*/
public function getLang() {
- return $this->getContext()->getLang();
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->getLanguage();
}
/**
* Shortcut to get user's language
*
* @return Language
+ * @since 1.19
*/
public function getLanguage() {
- return $this->getContext()->getLang();
+ return $this->getContext()->getLanguage();
}
/**
@@ -717,14 +777,14 @@ class SpecialPage {
* @param $params array
*/
protected function addFeedLinks( $params ) {
- global $wgFeedClasses, $wgOut;
+ global $wgFeedClasses;
$feedTemplate = wfScript( 'api' ) . '?';
- foreach( $wgFeedClasses as $format => $class ) {
+ foreach ( $wgFeedClasses as $format => $class ) {
$theseParams = $params + array( 'feedformat' => $format );
$url = $feedTemplate . wfArrayToCGI( $theseParams );
- $wgOut->addFeedLink( $format, $url );
+ $this->getOutput()->addFeedLink( $format, $url );
}
}
}
@@ -764,9 +824,9 @@ abstract class FormSpecialPage extends SpecialPage {
$form = new HTMLForm( $this->fields, $this->getContext() );
$form->setSubmitCallback( array( $this, 'onSubmit' ) );
- $form->setWrapperLegend( wfMessage( strtolower( $this->getName() ) . '-legend' ) );
+ $form->setWrapperLegend( $this->msg( strtolower( $this->getName() ) . '-legend' ) );
$form->addHeaderText(
- wfMessage( strtolower( $this->getName() ) . '-text' )->parseAsBlock() );
+ $this->msg( strtolower( $this->getName() ) . '-text' )->parseAsBlock() );
// Retain query parameters (uselang etc)
$params = array_diff_key(
@@ -806,7 +866,7 @@ abstract class FormSpecialPage extends SpecialPage {
$this->setHeaders();
// This will throw exceptions if there's a problem
- $this->userCanExecute( $this->getUser() );
+ $this->checkExecutePermissions( $this->getUser() );
$form = $this->getForm();
if ( $form->show() ) {
@@ -818,31 +878,27 @@ abstract class FormSpecialPage extends SpecialPage {
* Maybe do something interesting with the subpage parameter
* @param $par String
*/
- protected function setParameter( $par ){}
+ protected function setParameter( $par ) {}
/**
- * Checks if the given user (identified by an object) can perform this action. Can be
- * overridden by sub-classes with more complicated permissions schemes. Failures here
- * must throw subclasses of ErrorPageError
- *
- * @param $user User: the user to check, or null to use the context user
+ * Called from execute() to check if the given user can perform this action.
+ * Failures here must throw subclasses of ErrorPageError.
+ * @param $user User
* @return Bool true
* @throws ErrorPageError
*/
- public function userCanExecute( User $user ) {
- if ( $this->requiresWrite() && wfReadOnly() ) {
- throw new ReadOnlyError();
- }
-
- if ( $this->getRestriction() !== null && !$user->isAllowed( $this->getRestriction() ) ) {
- throw new PermissionsError( $this->getRestriction() );
- }
+ protected function checkExecutePermissions( User $user ) {
+ $this->checkPermissions();
if ( $this->requiresUnblock() && $user->isBlocked() ) {
$block = $user->mBlock;
throw new UserBlockedError( $block );
}
+ if ( $this->requiresWrite() ) {
+ $this->checkReadOnly();
+ }
+
return true;
}
@@ -872,7 +928,7 @@ class UnlistedSpecialPage extends SpecialPage {
parent::__construct( $name, $restriction, false, $function, $file );
}
- public function isListed(){
+ public function isListed() {
return false;
}
}
@@ -888,7 +944,7 @@ class IncludableSpecialPage extends SpecialPage {
parent::__construct( $name, $restriction, $listed, $function, $file, true );
}
- public function isIncludable(){
+ public function isIncludable() {
return true;
}
}
@@ -905,7 +961,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
// Query parameteres added by redirects
protected $mAddedRedirectParams = array();
- public function execute( $par ){
+ public function execute( $par ) {
$redirect = $this->getRedirect( $par );
$query = $this->getRedirectQuery();
// Redirect to a page title with possible query parameters
@@ -945,13 +1001,13 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
public function getRedirectQuery() {
$params = array();
- foreach( $this->mAllowedRedirectParams as $arg ) {
- if( $this->getRequest()->getVal( $arg, null ) !== null ){
+ foreach ( $this->mAllowedRedirectParams as $arg ) {
+ if ( $this->getRequest()->getVal( $arg, null ) !== null ) {
$params[$arg] = $this->getRequest()->getVal( $arg );
}
}
- foreach( $this->mAddedRedirectParams as $arg => $val ) {
+ foreach ( $this->mAddedRedirectParams as $arg => $val ) {
$params[$arg] = $val;
}
@@ -985,20 +1041,20 @@ abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
}
/**
- * ListAdmins --> ListUsers/admin
+ * ListAdmins --> ListUsers/sysop
*/
class SpecialListAdmins extends SpecialRedirectToSpecial {
- function __construct(){
- parent::__construct( 'ListAdmins', 'ListUsers', 'sysop' );
+ function __construct() {
+ parent::__construct( 'Listadmins', 'Listusers', 'sysop' );
}
}
/**
- * ListBots --> ListUsers/admin
+ * ListBots --> ListUsers/bot
*/
class SpecialListBots extends SpecialRedirectToSpecial {
- function __construct(){
- parent::__construct( 'ListAdmins', 'ListUsers', 'bot' );
+ function __construct() {
+ parent::__construct( 'Listbots', 'Listusers', 'bot' );
}
}
@@ -1007,7 +1063,7 @@ class SpecialListBots extends SpecialRedirectToSpecial {
* @todo FIXME: This (and the rest of the login frontend) needs to die a horrible painful death
*/
class SpecialCreateAccount extends SpecialRedirectToSpecial {
- function __construct(){
+ function __construct() {
parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) );
}
}
@@ -1102,6 +1158,10 @@ class SpecialPermanentLink extends RedirectSpecialPage {
function getRedirect( $subpage ) {
$subpage = intval( $subpage );
+ if ( $subpage === 0 ) {
+ # throw an error page when no subpage was given
+ throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
+ }
$this->mAddedRedirectParams['oldid'] = $subpage;
return true;
}
diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php
index 2a2e6a4c..0a1631b0 100644
--- a/includes/SpecialPageFactory.php
+++ b/includes/SpecialPageFactory.php
@@ -138,6 +138,7 @@ class SpecialPageFactory {
'Blankpage' => 'SpecialBlankpage',
'Blockme' => 'SpecialBlockme',
'Emailuser' => 'SpecialEmailUser',
+ 'JavaScriptTest' => 'SpecialJavaScriptTest',
'Movepage' => 'MovePageForm',
'Mycontributions' => 'SpecialMycontributions',
'Mypage' => 'SpecialMypage',
@@ -160,6 +161,7 @@ class SpecialPageFactory {
static function getList() {
global $wgSpecialPages;
global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
+ global $wgEnableEmail;
if ( !is_object( self::$mList ) ) {
wfProfileIn( __METHOD__ );
@@ -177,6 +179,10 @@ class SpecialPageFactory {
self::$mList['Invalidateemail'] = 'EmailInvalidation';
}
+ if ( $wgEnableEmail ) {
+ self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
+ }
+
// Add extension special pages
self::$mList = array_merge( self::$mList, $wgSpecialPages );
@@ -262,7 +268,7 @@ class SpecialPageFactory {
*/
public static function setGroup( $page, $group ) {
global $wgSpecialPageGroups;
- $name = is_object( $page ) ? $page->mName : $page;
+ $name = is_object( $page ) ? $page->getName() : $page;
$wgSpecialPageGroups[$name] = $group;
}
@@ -272,23 +278,25 @@ class SpecialPageFactory {
* @param $page SpecialPage
*/
public static function getGroup( &$page ) {
+ $name = $page->getName();
+
global $wgSpecialPageGroups;
static $specialPageGroupsCache = array();
- if ( isset( $specialPageGroupsCache[$page->mName] ) ) {
- return $specialPageGroupsCache[$page->mName];
+ if ( isset( $specialPageGroupsCache[$name] ) ) {
+ return $specialPageGroupsCache[$name];
}
- $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $page->mName ) );
+ $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $name ) );
if ( !$msg->isBlank() ) {
$group = $msg->text();
} else {
- $group = isset( $wgSpecialPageGroups[$page->mName] )
- ? $wgSpecialPageGroups[$page->mName]
+ $group = isset( $wgSpecialPageGroups[$name] )
+ ? $wgSpecialPageGroups[$name]
: '-';
}
if ( $group == '-' ) {
$group = 'other';
}
- $specialPageGroupsCache[$page->mName] = $group;
+ $specialPageGroupsCache[$name] = $group;
return $group;
}
@@ -332,16 +340,21 @@ class SpecialPageFactory {
* Return categorised listable special pages which are available
* for the current user, and everyone.
*
+ * @param $user User object to check permissions, $wgUser will be used
+ * if not provided
* @return Array( String => Specialpage )
*/
- public static function getUsablePages() {
- global $wgUser;
+ public static function getUsablePages( User $user = null ) {
$pages = array();
+ if ( $user === null ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
foreach ( self::getList() as $name => $rec ) {
$page = self::getPage( $name );
if ( $page // not null
&& $page->isListed()
- && ( !$page->isRestricted() || $page->userCanExecute( $wgUser ) )
+ && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
) {
$pages[$name] = $page;
}
@@ -417,7 +430,12 @@ class SpecialPageFactory {
if ( !$page ) {
$context->getOutput()->setArticleRelated( false );
$context->getOutput()->setRobotPolicy( 'noindex,nofollow' );
- $context->getOutput()->setStatusCode( 404 );
+
+ global $wgSend404Code;
+ if ( $wgSend404Code ) {
+ $context->getOutput()->setStatusCode( 404 );
+ }
+
$context->getOutput()->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
wfProfileOut( __METHOD__ );
return false;
@@ -462,40 +480,47 @@ class SpecialPageFactory {
}
/**
- * Just like executePath() except it returns the HTML instead of outputting it
- * Returns false if there was no such special page, or a title object if it was
- * a redirect.
+ * Just like executePath() but will override global variables and execute
+ * the page in "inclusion" mode. Returns true if the execution was
+ * successful or false if there was no such special page, or a title object
+ * if it was a redirect.
*
- * Also saves the current $wgTitle, $wgOut, and $wgRequest variables so that
- * the special page will get the context it'd expect on a normal request,
- * and then restores them to their previous values after.
+ * Also saves the current $wgTitle, $wgOut, $wgRequest, $wgUser and $wgLang
+ * variables so that the special page will get the context it'd expect on a
+ * normal request, and then restores them to their previous values after.
*
* @param $title Title
+ * @param $context IContextSource
*
* @return String: HTML fragment
*/
- static function capturePath( &$title ) {
- global $wgOut, $wgTitle, $wgRequest;
+ static function capturePath( Title $title, IContextSource $context ) {
+ global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang;
+ // Save current globals
$oldTitle = $wgTitle;
$oldOut = $wgOut;
$oldRequest = $wgRequest;
+ $oldUser = $wgUser;
+ $oldLang = $wgLang;
- // Don't want special pages interpreting ?feed=atom parameters.
- $wgRequest = new FauxRequest( array() );
-
- $context = new RequestContext;
- $context->setTitle( $title );
- $context->setRequest( $wgRequest );
+ // Set the globals to the current context
+ $wgTitle = $title;
$wgOut = $context->getOutput();
+ $wgRequest = $context->getRequest();
+ $wgUser = $context->getUser();
+ $wgLang = $context->getLanguage();
+ // The useful part
$ret = self::executePath( $title, $context, true );
- if ( $ret === true ) {
- $ret = $wgOut->getHTML();
- }
+
+ // And restore the old globals
$wgTitle = $oldTitle;
$wgOut = $oldOut;
$wgRequest = $oldRequest;
+ $wgUser = $oldUser;
+ $wgLang = $oldLang;
+
return $ret;
}
@@ -510,7 +535,7 @@ class SpecialPageFactory {
static function getLocalNameFor( $name, $subpage = false ) {
global $wgContLang;
$aliases = $wgContLang->getSpecialPageAliases();
-
+
if ( isset( $aliases[$name][0] ) ) {
$name = $aliases[$name][0];
} else {
diff --git a/includes/SquidPurgeClient.php b/includes/SquidPurgeClient.php
index 3de68578..506ada96 100644
--- a/includes/SquidPurgeClient.php
+++ b/includes/SquidPurgeClient.php
@@ -147,7 +147,7 @@ class SquidPurgeClient {
* @param $url string
*/
public function queuePurge( $url ) {
- $url = str_replace( "\n", '', $url );
+ $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
$this->requests[] = "PURGE $url HTTP/1.0\r\n" .
"Connection: Keep-Alive\r\n" .
"Proxy-Connection: Keep-Alive\r\n" .
diff --git a/includes/Status.php b/includes/Status.php
index 6bd94564..e9f3fb91 100644
--- a/includes/Status.php
+++ b/includes/Status.php
@@ -51,7 +51,7 @@ class Status {
/**
* Change operation result
*
- * @param $ok Boolean: whether to operation completed
+ * @param $ok Boolean: whether the operation completed
* @param $value Mixed
*/
function setResult( $ok, $value = null ) {
@@ -294,11 +294,11 @@ class Status {
}
return $result;
}
-
+
/**
* Returns a list of status messages of the given type, with message and
* params left untouched, like a sane version of getStatusArray
- *
+ *
* @param $type String
*
* @return Array
@@ -308,7 +308,7 @@ class Status {
foreach ( $this->errors as $error ) {
if ( $error['type'] === $type ) {
$result[] = $error;
- }
+ }
}
return $result;
}
@@ -329,7 +329,7 @@ class Status {
}
/**
- * If the specified source message exists, replace it with the specified
+ * If the specified source message exists, replace it with the specified
* destination message, but keep the same parameters as in the original error.
*
* Return true if the replacement was done, false otherwise.
diff --git a/includes/StreamFile.php b/includes/StreamFile.php
index d08cfec6..0de03c83 100644
--- a/includes/StreamFile.php
+++ b/includes/StreamFile.php
@@ -4,119 +4,168 @@
*
* @file
*/
+class StreamFile {
+ const READY_STREAM = 1;
+ const NOT_MODIFIED = 2;
-/**
- * @param $fname string
- * @param $headers array
- */
-function wfStreamFile( $fname, $headers = array() ) {
- wfSuppressWarnings();
- $stat = stat( $fname );
- wfRestoreWarnings();
- if ( !$stat ) {
- header( 'HTTP/1.0 404 Not Found' );
- header( 'Cache-Control: no-cache' );
- header( 'Content-Type: text/html; charset=utf-8' );
- $encFile = htmlspecialchars( $fname );
- $encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
- echo "<html><body>
-<h1>File not found</h1>
-<p>Although this PHP script ($encScript) exists, the file requested for output
-($encFile) does not.</p>
-</body></html>
-";
- return;
- }
+ /**
+ * Stream a file to the browser, adding all the headings and fun stuff.
+ * Headers sent include: Content-type, Content-Length, Last-Modified,
+ * and Content-Disposition.
+ *
+ * @param $fname string Full name and path of the file to stream
+ * @param $headers array Any additional headers to send
+ * @param $sendErrors bool Send error messages if errors occur (like 404)
+ * @return bool Success
+ */
+ public static function stream( $fname, $headers = array(), $sendErrors = true ) {
+ wfSuppressWarnings();
+ $stat = stat( $fname );
+ wfRestoreWarnings();
- header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s', $stat['mtime'] ) . ' GMT' );
+ $res = self::prepareForStream( $fname, $stat, $headers, $sendErrors );
+ if ( $res == self::NOT_MODIFIED ) {
+ return true; // use client cache
+ } elseif ( $res == self::READY_STREAM ) {
+ return readfile( $fname );
+ } else {
+ return false; // failed
+ }
+ }
- // Cancel output buffering and gzipping if set
- wfResetOutputBuffers();
+ /**
+ * Call this function used in preparation before streaming a file.
+ * This function does the following:
+ * (a) sends Last-Modified, Content-type, and Content-Disposition headers
+ * (b) cancels any PHP output buffering and automatic gzipping of output
+ * (c) sends Content-Length header based on HTTP_IF_MODIFIED_SINCE check
+ *
+ * @param $path string Storage path or file system path
+ * @param $info Array|false File stat info with 'mtime' and 'size' fields
+ * @param $headers Array Additional headers to send
+ * @param $sendErrors bool Send error messages if errors occur (like 404)
+ * @return int|false READY_STREAM, NOT_MODIFIED, or false on failure
+ */
+ public static function prepareForStream(
+ $path, $info, $headers = array(), $sendErrors = true
+ ) {
+ global $wgLanguageCode;
- $type = wfGetType( $fname );
- if ( $type and $type!="unknown/unknown") {
- header("Content-type: $type");
- } else {
- header('Content-type: application/x-wiki');
- }
+ if ( !is_array( $info ) ) {
+ if ( $sendErrors ) {
+ header( 'HTTP/1.0 404 Not Found' );
+ header( 'Cache-Control: no-cache' );
+ header( 'Content-Type: text/html; charset=utf-8' );
+ $encFile = htmlspecialchars( $path );
+ $encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
+ echo "<html><body>
+ <h1>File not found</h1>
+ <p>Although this PHP script ($encScript) exists, the file requested for output
+ ($encFile) does not.</p>
+ </body></html>
+ ";
+ }
+ return false;
+ }
- // Don't stream it out as text/html if there was a PHP error
- if ( headers_sent() ) {
- echo "Headers already sent, terminating.\n";
- return;
- }
+ // Sent Last-Modified HTTP header for client-side caching
+ header( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $info['mtime'] ) );
- global $wgLanguageCode;
- header( "Content-Disposition: inline;filename*=utf-8'$wgLanguageCode'" . urlencode( basename( $fname ) ) );
+ // Cancel output buffering and gzipping if set
+ wfResetOutputBuffers();
- foreach ( $headers as $header ) {
- header( $header );
- }
+ $type = self::contentTypeFromPath( $path );
+ if ( $type && $type != 'unknown/unknown' ) {
+ header( "Content-type: $type" );
+ } else {
+ // Send a content type which is not known to Internet Explorer, to
+ // avoid triggering IE's content type detection. Sending a standard
+ // unknown content type here essentially gives IE license to apply
+ // whatever content type it likes.
+ header( 'Content-type: application/x-wiki' );
+ }
- if ( !empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
- $modsince = preg_replace( '/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
- $sinceTime = strtotime( $modsince );
- if ( $stat['mtime'] <= $sinceTime ) {
- ini_set('zlib.output_compression', 0);
- header( "HTTP/1.0 304 Not Modified" );
- return;
+ // Don't stream it out as text/html if there was a PHP error
+ if ( headers_sent() ) {
+ echo "Headers already sent, terminating.\n";
+ return false;
}
- }
- header( 'Content-Length: ' . $stat['size'] );
+ header( "Content-Disposition: inline;filename*=utf-8'$wgLanguageCode'" .
+ urlencode( basename( $path ) ) );
- readfile( $fname );
-}
+ // Send additional headers
+ foreach ( $headers as $header ) {
+ header( $header );
+ }
-/**
- * @param $filename string
- * @param $safe bool
- * @return null|string
- */
-function wfGetType( $filename, $safe = true ) {
- global $wgTrivialMimeDetection;
-
- $ext = strrchr($filename, '.');
- $ext = $ext === false ? '' : strtolower( substr( $ext, 1 ) );
-
- # trivial detection by file extension,
- # used for thumbnails (thumb.php)
- if ($wgTrivialMimeDetection) {
- switch ($ext) {
- case 'gif': return 'image/gif';
- case 'png': return 'image/png';
- case 'jpg': return 'image/jpeg';
- case 'jpeg': return 'image/jpeg';
+ // Don't send if client has up to date cache
+ if ( !empty( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) ) {
+ $modsince = preg_replace( '/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
+ if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
+ ini_set( 'zlib.output_compression', 0 );
+ header( "HTTP/1.0 304 Not Modified" );
+ return self::NOT_MODIFIED; // ok
+ }
}
- return 'unknown/unknown';
+ header( 'Content-Length: ' . $info['size'] );
+
+ return self::READY_STREAM; // ok
}
-
- $magic = MimeMagic::singleton();
- // Use the extension only, rather than magic numbers, to avoid opening
- // up vulnerabilities due to uploads of files with allowed extensions
- // but disallowed types.
- $type = $magic->guessTypesForExtension( $ext );
/**
- * Double-check some security settings that were done on upload but might
- * have changed since.
+ * Determine the file type of a file based on the path
+ *
+ * @param $filename string Storage path or file system path
+ * @param $safe bool Whether to do retroactive upload blacklist checks
+ * @return null|string
*/
- if ( $safe ) {
- global $wgFileBlacklist, $wgCheckFileExtensions, $wgStrictFileExtensions,
- $wgFileExtensions, $wgVerifyMimeType, $wgMimeTypeBlacklist;
- list( , $extList ) = UploadBase::splitExtensions( $filename );
- if ( UploadBase::checkFileExtensionList( $extList, $wgFileBlacklist ) ) {
- return 'unknown/unknown';
- }
- if ( $wgCheckFileExtensions && $wgStrictFileExtensions
- && !UploadBase::checkFileExtensionList( $extList, $wgFileExtensions ) )
- {
+ public static function contentTypeFromPath( $filename, $safe = true ) {
+ global $wgTrivialMimeDetection;
+
+ $ext = strrchr( $filename, '.' );
+ $ext = $ext === false ? '' : strtolower( substr( $ext, 1 ) );
+
+ # trivial detection by file extension,
+ # used for thumbnails (thumb.php)
+ if ( $wgTrivialMimeDetection ) {
+ switch ( $ext ) {
+ case 'gif': return 'image/gif';
+ case 'png': return 'image/png';
+ case 'jpg': return 'image/jpeg';
+ case 'jpeg': return 'image/jpeg';
+ }
+
return 'unknown/unknown';
}
- if ( $wgVerifyMimeType && in_array( strtolower( $type ), $wgMimeTypeBlacklist ) ) {
- return 'unknown/unknown';
+
+ $magic = MimeMagic::singleton();
+ // Use the extension only, rather than magic numbers, to avoid opening
+ // up vulnerabilities due to uploads of files with allowed extensions
+ // but disallowed types.
+ $type = $magic->guessTypesForExtension( $ext );
+
+ /**
+ * Double-check some security settings that were done on upload but might
+ * have changed since.
+ */
+ if ( $safe ) {
+ global $wgFileBlacklist, $wgCheckFileExtensions, $wgStrictFileExtensions,
+ $wgFileExtensions, $wgVerifyMimeType, $wgMimeTypeBlacklist;
+ list( , $extList ) = UploadBase::splitExtensions( $filename );
+ if ( UploadBase::checkFileExtensionList( $extList, $wgFileBlacklist ) ) {
+ return 'unknown/unknown';
+ }
+ if ( $wgCheckFileExtensions && $wgStrictFileExtensions
+ && !UploadBase::checkFileExtensionList( $extList, $wgFileExtensions ) )
+ {
+ return 'unknown/unknown';
+ }
+ if ( $wgVerifyMimeType && in_array( strtolower( $type ), $wgMimeTypeBlacklist ) ) {
+ return 'unknown/unknown';
+ }
}
+ return $type;
}
- return $type;
}
diff --git a/includes/StubObject.php b/includes/StubObject.php
index 951cbaea..647ad929 100644
--- a/includes/StubObject.php
+++ b/includes/StubObject.php
@@ -60,6 +60,7 @@ class StubObject {
/**
* Create a new object to replace this stub object.
+ * @return object
*/
function _newObject() {
return MWFunction::newObj( $this->mClass, $this->mParams );
@@ -89,9 +90,10 @@ 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.
-
+ }
+
if ( get_class( $GLOBALS[$this->mGlobal] ) != $this->mClass ) {
$fname = __METHOD__.'-'.$this->mGlobal;
wfProfileIn( $fname );
@@ -116,6 +118,7 @@ class StubObject {
class StubContLang extends StubObject {
function __construct() {
+ wfDeprecated( __CLASS__, '1.18' );
parent::__construct( 'wgContLang' );
}
@@ -123,6 +126,9 @@ class StubContLang extends StubObject {
return $this->_call( $name, $args );
}
+ /**
+ * @return Language
+ */
function _newObject() {
global $wgLanguageCode;
$obj = Language::factory( $wgLanguageCode );
@@ -147,7 +153,10 @@ class StubUserLang extends StubObject {
return $this->_call( $name, $args );
}
+ /**
+ * @return Language
+ */
function _newObject() {
- return RequestContext::getMain()->getLang();
+ return RequestContext::getMain()->getLanguage();
}
}
diff --git a/includes/Title.php b/includes/Title.php
index 02607496..f3cf79d4 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -47,7 +47,6 @@ class Title {
*/
const GAID_FOR_UPDATE = 1;
-
/**
* @name Private member variables
* Please use the accessor functions instead.
@@ -64,6 +63,7 @@ class Title {
var $mFragment; // /< Title fragment (i.e. the bit after the #)
var $mArticleID = -1; // /< Article ID, fetched from the link cache on demand
var $mLatestID = false; // /< ID of most recent revision
+ private $mEstimateRevisions; // /< Estimated number of revisions; null of not loaded
var $mRestrictions = array(); // /< Array of groups allowed to edit this article
var $mOldRestrictions = false;
var $mCascadeRestriction; ///< Cascade restrictions on this page to included templates and images?
@@ -388,8 +388,8 @@ class Title {
$titles = array( $title );
while ( --$recurse > 0 ) {
if ( $title->isRedirect() ) {
- $article = new Article( $title, 0 );
- $newtitle = $article->getRedirectTarget();
+ $page = WikiPage::factory( $title );
+ $newtitle = $page->getRedirectTarget();
} else {
break;
}
@@ -443,10 +443,6 @@ class Title {
return null;
}
-# ----------------------------------------------------------------------------
-# Static functions
-# ----------------------------------------------------------------------------
-
/**
* Get the prefixed DB key associated with an ID
*
@@ -481,6 +477,33 @@ class Title {
}
/**
+ * Returns a simple regex that will match on characters and sequences invalid in titles.
+ * Note that this doesn't pick up many things that could be wrong with titles, but that
+ * replacing this regex with something valid will make many titles valid.
+ *
+ * @return String regex string
+ */
+ static function getTitleInvalidRegex() {
+ static $rxTc = false;
+ if ( !$rxTc ) {
+ # Matching titles will be held as illegal.
+ $rxTc = '/' .
+ # Any character not allowed is forbidden...
+ '[^' . self::legalChars() . ']' .
+ # 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\x80-\xff]+;' .
+ '|&#[0-9]+;' .
+ '|&#x[0-9A-Fa-f]+;' .
+ '/S';
+ }
+
+ return $rxTc;
+ }
+
+ /**
* Get a string representation of a title suitable for
* including in a search index
*
@@ -532,6 +555,36 @@ class Title {
}
/**
+ * Escape a text fragment, say from a link, for a URL
+ *
+ * @param $fragment string containing a URL or link fragment (after the "#")
+ * @return String: escaped string
+ */
+ static function escapeFragmentForURL( $fragment ) {
+ # Note that we don't urlencode the fragment. urlencoded Unicode
+ # fragments appear not to work in IE (at least up to 7) or in at least
+ # one version of Opera 9.x. The W3C validator, for one, doesn't seem
+ # to care if they aren't encoded.
+ return Sanitizer::escapeId( $fragment, 'noninitial' );
+ }
+
+ /**
+ * Callback for usort() to do title sorts by (namespace, title)
+ *
+ * @param $a Title
+ * @param $b Title
+ *
+ * @return Integer: result of string comparison, or namespace comparison
+ */
+ public static function compare( $a, $b ) {
+ if ( $a->getNamespace() == $b->getNamespace() ) {
+ return strcmp( $a->getText(), $b->getText() );
+ } else {
+ return $a->getNamespace() - $b->getNamespace();
+ }
+ }
+
+ /**
* Determine whether the object refers to a page within
* this project.
*
@@ -546,6 +599,24 @@ class Title {
}
/**
+ * Is this Title interwiki?
+ *
+ * @return Bool
+ */
+ public function isExternal() {
+ return ( $this->mInterwiki != '' );
+ }
+
+ /**
+ * Get the interwiki prefix (or null string)
+ *
+ * @return String Interwiki prefix
+ */
+ public function getInterwiki() {
+ return $this->mInterwiki;
+ }
+
+ /**
* Determine whether the object refers to a page within
* this project and is transcludable.
*
@@ -573,51 +644,49 @@ class Title {
}
/**
- * Escape a text fragment, say from a link, for a URL
- *
- * @param $fragment string containing a URL or link fragment (after the "#")
- * @return String: escaped string
- */
- static function escapeFragmentForURL( $fragment ) {
- # Note that we don't urlencode the fragment. urlencoded Unicode
- # fragments appear not to work in IE (at least up to 7) or in at least
- # one version of Opera 9.x. The W3C validator, for one, doesn't seem
- # to care if they aren't encoded.
- return Sanitizer::escapeId( $fragment, 'noninitial' );
- }
-
-# ----------------------------------------------------------------------------
-# Other stuff
-# ----------------------------------------------------------------------------
-
- /** Simple accessors */
- /**
* Get the text form (spaces not underscores) of the main part
*
* @return String Main part of the title
*/
- public function getText() { return $this->mTextform; }
+ public function getText() {
+ return $this->mTextform;
+ }
/**
* Get the URL-encoded form of the main part
*
* @return String Main part of the title, URL-encoded
*/
- public function getPartialURL() { return $this->mUrlform; }
+ public function getPartialURL() {
+ return $this->mUrlform;
+ }
/**
* Get the main part with underscores
*
* @return String: Main part of the title, with underscores
*/
- public function getDBkey() { return $this->mDbkeyform; }
+ public function getDBkey() {
+ return $this->mDbkeyform;
+ }
+
+ /**
+ * Get the DB key with the initial letter case as specified by the user
+ *
+ * @return String DB key
+ */
+ function getUserCaseDBKey() {
+ return $this->mUserCaseDBKey;
+ }
/**
* Get the namespace index, i.e. one of the NS_xxxx constants.
*
* @return Integer: Namespace index
*/
- public function getNamespace() { return $this->mNamespace; }
+ public function getNamespace() {
+ return $this->mNamespace;
+ }
/**
* Get the namespace text
@@ -657,15 +726,6 @@ class Title {
}
/**
- * Get the DB key with the initial letter case as specified by the user
- *
- * @return String DB key
- */
- function getUserCaseDBKey() {
- return $this->mUserCaseDBKey;
- }
-
- /**
* Get the namespace text of the subject (rather than talk) page
*
* @return String Namespace text
@@ -695,18 +755,306 @@ class Title {
}
/**
- * Get the interwiki prefix (or null string)
+ * Is this in a namespace that allows actual pages?
*
- * @return String Interwiki prefix
+ * @return Bool
+ * @internal note -- uses hardcoded namespace index instead of constants
+ */
+ public function canExist() {
+ return $this->mNamespace >= NS_MAIN;
+ }
+
+ /**
+ * Can this title be added to a user's watchlist?
+ *
+ * @return Bool TRUE or FALSE
+ */
+ public function isWatchable() {
+ return !$this->isExternal() && MWNamespace::isWatchable( $this->getNamespace() );
+ }
+
+ /**
+ * Returns true if this is a special page.
+ *
+ * @return boolean
+ */
+ public function isSpecialPage() {
+ return $this->getNamespace() == NS_SPECIAL;
+ }
+
+ /**
+ * Returns true if this title resolves to the named special page
+ *
+ * @param $name String The special page name
+ * @return boolean
*/
- public function getInterwiki() { return $this->mInterwiki; }
+ public function isSpecial( $name ) {
+ if ( $this->isSpecialPage() ) {
+ list( $thisName, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $this->getDBkey() );
+ if ( $name == $thisName ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * If the Title refers to a special page alias which is not the local default, resolve
+ * the alias, and localise the name as necessary. Otherwise, return $this
+ *
+ * @return Title
+ */
+ public function fixSpecialName() {
+ if ( $this->isSpecialPage() ) {
+ list( $canonicalName, $par ) = SpecialPageFactory::resolveAlias( $this->mDbkeyform );
+ if ( $canonicalName ) {
+ $localName = SpecialPageFactory::getLocalNameFor( $canonicalName, $par );
+ if ( $localName != $this->mDbkeyform ) {
+ return Title::makeTitle( NS_SPECIAL, $localName );
+ }
+ }
+ }
+ return $this;
+ }
+
+ /**
+ * Returns true if the title is inside the specified namespace.
+ *
+ * Please make use of this instead of comparing to getNamespace()
+ * This function is much more resistant to changes we may make
+ * to namespaces than code that makes direct comparisons.
+ * @param $ns int The namespace
+ * @return bool
+ * @since 1.19
+ */
+ public function inNamespace( $ns ) {
+ return MWNamespace::equals( $this->getNamespace(), $ns );
+ }
+
+ /**
+ * Returns true if the title is inside one of the specified namespaces.
+ *
+ * @param ...$namespaces The namespaces to check for
+ * @return bool
+ * @since 1.19
+ */
+ public function inNamespaces( /* ... */ ) {
+ $namespaces = func_get_args();
+ if ( count( $namespaces ) > 0 && is_array( $namespaces[0] ) ) {
+ $namespaces = $namespaces[0];
+ }
+
+ foreach ( $namespaces as $ns ) {
+ if ( $this->inNamespace( $ns ) ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns true if the title has the same subject namespace as the
+ * namespace specified.
+ * For example this method will take NS_USER and return true if namespace
+ * is either NS_USER or NS_USER_TALK since both of them have NS_USER
+ * as their subject namespace.
+ *
+ * This is MUCH simpler than individually testing for equivilance
+ * against both NS_USER and NS_USER_TALK, and is also forward compatible.
+ * @since 1.19
+ */
+ public function hasSubjectNamespace( $ns ) {
+ return MWNamespace::subjectEquals( $this->getNamespace(), $ns );
+ }
+
+ /**
+ * Is this Title in a namespace which contains content?
+ * In other words, is this a content page, for the purposes of calculating
+ * statistics, etc?
+ *
+ * @return Boolean
+ */
+ public function isContentPage() {
+ return MWNamespace::isContent( $this->getNamespace() );
+ }
+
+ /**
+ * Would anybody with sufficient privileges be able to move this page?
+ * Some pages just aren't movable.
+ *
+ * @return Bool TRUE or FALSE
+ */
+ public function isMovable() {
+ if ( !MWNamespace::isMovable( $this->getNamespace() ) || $this->getInterwiki() != '' ) {
+ // Interwiki title or immovable namespace. Hooks don't get to override here
+ return false;
+ }
+
+ $result = true;
+ wfRunHooks( 'TitleIsMovable', array( $this, &$result ) );
+ return $result;
+ }
+
+ /**
+ * Is this the mainpage?
+ * @note Title::newFromText seams to be sufficiently optimized by the title
+ * cache that we don't need to over-optimize by doing direct comparisons and
+ * acidentally creating new bugs where $title->equals( Title::newFromText() )
+ * ends up reporting something differently than $title->isMainPage();
+ *
+ * @since 1.18
+ * @return Bool
+ */
+ public function isMainPage() {
+ return $this->equals( Title::newMainPage() );
+ }
+
+ /**
+ * Is this a subpage?
+ *
+ * @return Bool
+ */
+ public function isSubpage() {
+ return MWNamespace::hasSubpages( $this->mNamespace )
+ ? strpos( $this->getText(), '/' ) !== false
+ : false;
+ }
+
+ /**
+ * Is this a conversion table for the LanguageConverter?
+ *
+ * @return Bool
+ */
+ public function isConversionTable() {
+ return $this->getNamespace() == NS_MEDIAWIKI &&
+ strpos( $this->getText(), 'Conversiontable' ) !== false;
+ }
+
+ /**
+ * Does that page contain wikitext, or it is JS, CSS or whatever?
+ *
+ * @return Bool
+ */
+ public function isWikitextPage() {
+ $retval = !$this->isCssOrJsPage() && !$this->isCssJsSubpage();
+ wfRunHooks( 'TitleIsWikitextPage', array( $this, &$retval ) );
+ return $retval;
+ }
+
+ /**
+ * Could this page contain custom CSS or JavaScript, based
+ * on the title?
+ *
+ * @return Bool
+ */
+ public function isCssOrJsPage() {
+ $retval = $this->mNamespace == NS_MEDIAWIKI
+ && preg_match( '!\.(?:css|js)$!u', $this->mTextform ) > 0;
+ wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$retval ) );
+ return $retval;
+ }
+
+ /**
+ * Is this a .css or .js subpage of a user page?
+ * @return Bool
+ */
+ public function isCssJsSubpage() {
+ return ( NS_USER == $this->mNamespace and preg_match( "/\\/.*\\.(?:css|js)$/", $this->mTextform ) );
+ }
+
+ /**
+ * Trim down a .css or .js subpage title to get the corresponding skin name
+ *
+ * @return string containing skin name from .css or .js subpage title
+ */
+ public function getSkinFromCssJsSubpage() {
+ $subpage = explode( '/', $this->mTextform );
+ $subpage = $subpage[ count( $subpage ) - 1 ];
+ $lastdot = strrpos( $subpage, '.' );
+ if ( $lastdot === false )
+ return $subpage; # Never happens: only called for names ending in '.css' or '.js'
+ return substr( $subpage, 0, $lastdot );
+ }
+
+ /**
+ * Is this a .css subpage of a user page?
+ *
+ * @return Bool
+ */
+ public function isCssSubpage() {
+ return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.css$/", $this->mTextform ) );
+ }
+
+ /**
+ * Is this a .js subpage of a user page?
+ *
+ * @return Bool
+ */
+ public function isJsSubpage() {
+ return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.js$/", $this->mTextform ) );
+ }
+
+ /**
+ * Is this a talk page of some sort?
+ *
+ * @return Bool
+ */
+ public function isTalkPage() {
+ return MWNamespace::isTalk( $this->getNamespace() );
+ }
+
+ /**
+ * Get a Title object associated with the talk page of this article
+ *
+ * @return Title the object for the talk page
+ */
+ public function getTalkPage() {
+ return Title::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() );
+ }
+
+ /**
+ * Get a title object associated with the subject page of this
+ * talk page
+ *
+ * @return Title the object for the subject page
+ */
+ public function getSubjectPage() {
+ // Is this the same title?
+ $subjectNS = MWNamespace::getSubject( $this->getNamespace() );
+ if ( $this->getNamespace() == $subjectNS ) {
+ return $this;
+ }
+ return Title::makeTitle( $subjectNS, $this->getDBkey() );
+ }
+
+ /**
+ * Get the default namespace index, for when there is no namespace
+ *
+ * @return Int Default namespace index
+ */
+ public function getDefaultNamespace() {
+ return $this->mDefaultNamespace;
+ }
+
+ /**
+ * Get title for search index
+ *
+ * @return String a stripped-down title string ready for the
+ * search index
+ */
+ public function getIndexTitle() {
+ return Title::indexTitle( $this->mNamespace, $this->mTextform );
+ }
/**
* Get the Title fragment (i.e.\ the bit after the #) in text form
*
* @return String Title fragment
*/
- public function getFragment() { return $this->mFragment; }
+ public function getFragment() {
+ return $this->mFragment;
+ }
/**
* Get the fragment in URL form, including the "#" character if there is one
@@ -721,20 +1069,37 @@ class Title {
}
/**
- * Get the default namespace index, for when there is no namespace
+ * Set the fragment for this title. Removes the first character from the
+ * specified fragment before setting, so it assumes you're passing it with
+ * an initial "#".
*
- * @return Int Default namespace index
+ * Deprecated for public use, use Title::makeTitle() with fragment parameter.
+ * Still in active use privately.
+ *
+ * @param $fragment String text
*/
- public function getDefaultNamespace() { return $this->mDefaultNamespace; }
+ public function setFragment( $fragment ) {
+ $this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
+ }
/**
- * Get title for search index
+ * Prefix some arbitrary text with the namespace or interwiki prefix
+ * of this object
*
- * @return String a stripped-down title string ready for the
- * search index
+ * @param $name String the text
+ * @return String the prefixed text
+ * @private
*/
- public function getIndexTitle() {
- return Title::indexTitle( $this->mNamespace, $this->mTextform );
+ private function prefix( $name ) {
+ $p = '';
+ if ( $this->mInterwiki != '' ) {
+ $p = $this->mInterwiki . ':';
+ }
+
+ if ( 0 != $this->mNamespace ) {
+ $p .= $this->getNsText() . ':';
+ }
+ return $p . $name;
}
/**
@@ -766,6 +1131,15 @@ class Title {
}
/**
+ * Return a string representation of this title
+ *
+ * @return String representation of this title
+ */
+ public function __toString() {
+ return $this->getPrefixedText();
+ }
+
+ /**
* Get the prefixed title with spaces, plus any fragment
* (part beginning with '#')
*
@@ -811,6 +1185,17 @@ class Title {
}
/**
+ * Get the HTML-escaped displayable text form.
+ * Used for the title field in <a> tags.
+ *
+ * @return String the text, including any prefixes
+ */
+ public function getEscapedText() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return htmlspecialchars( $this->getPrefixedText() );
+ }
+
+ /**
* Get a URL-encoded form of the subpage text
*
* @return String URL-encoded subpage name
@@ -833,48 +1218,64 @@ class Title {
}
/**
- * Get a real URL referring to this title, with interwiki link and
- * fragment
+ * Helper to fix up the get{Local,Full,Link,Canonical}URL args
+ * get{Canonical,Full,Link,Local}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
+ * andthe wfArrayToCGI moved to getLocalURL();
*
- * @param $query \twotypes{\string,\array} 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).
- * @param $variant String language variant of url (for sr, zh..)
- * @return String the URL
+ * @since 1.19 (r105919)
*/
- public function getFullURL( $query = '', $variant = false ) {
- global $wgServer, $wgRequest;
-
+ 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 ( is_array( $query ) ) {
$query = wfArrayToCGI( $query );
}
-
- $interwiki = Interwiki::fetch( $this->mInterwiki );
- if ( !$interwiki ) {
- $url = $this->getLocalURL( $query, $variant );
-
- // Ugly quick hack to avoid duplicate prefixes (bug 4571 etc)
- // Correct fix would be to move the prepending elsewhere.
- if ( $wgRequest->getVal( 'action' ) != 'render' ) {
- $url = $wgServer . $url;
+ if ( $query2 ) {
+ if ( is_string( $query2 ) ) {
+ // $query2 is a string, we will consider this to be
+ // a deprecated $variant argument and add it to the query
+ $query2 = wfArrayToCGI( array( 'variant' => $query2 ) );
+ } else {
+ $query2 = wfArrayToCGI( $query2 );
}
- } else {
- $baseUrl = $interwiki->getURL();
-
- $namespace = wfUrlencode( $this->getNsText() );
- if ( $namespace != '' ) {
- # Can this actually happen? Interwikis shouldn't be parsed.
- # Yes! It can in interwiki transclusion. But... it probably shouldn't.
- $namespace .= ':';
+ // If we have $query content add a & to it first
+ if ( $query ) {
+ $query .= '&';
}
- $url = str_replace( '$1', $namespace . $this->mUrlform, $baseUrl );
- $url = wfAppendQuery( $url, $query );
+ // Now append the queries together
+ $query .= $query2;
}
+ return $query;
+ }
+
+ /**
+ * Get a real URL referring to this title, with interwiki link and
+ * fragment
+ *
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
+ * @return String the URL
+ */
+ public function getFullURL( $query = '', $query2 = false ) {
+ $query = self::fixUrlQueryArgs( $query, $query2 );
+
+ # Hand off all the decisions on urls to getLocalURL
+ $url = $this->getLocalURL( $query );
+
+ # Expand the url to make it a full url. Note that getLocalURL has the
+ # potential to output full urls for a variety of reasons, so we use
+ # wfExpandUrl instead of simply prepending $wgServer
+ $url = wfExpandUrl( $url, PROTO_RELATIVE );
# Finally, add the fragment.
$url .= $this->getFragmentForURL();
- wfRunHooks( 'GetFullURL', array( &$this, &$url, $query, $variant ) );
+ wfRunHooks( 'GetFullURL', array( &$this, &$url, $query ) );
return $url;
}
@@ -882,48 +1283,45 @@ class Title {
* Get a URL with no fragment or server name. If this page is generated
* with action=render, $wgServer is prepended.
*
- * @param $query Mixed: an optional query string; if not specified,
- * $wgArticlePath will be used. Can be specified as an associative array
- * as well, e.g., array( 'action' => 'edit' ) (keys and values will be
- * URL-escaped).
- * @param $variant String language variant of url (for sr, zh..)
+
+ * @param $query \twotypes{\string,\array} 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).
+ * Some query patterns will trigger various shorturl path replacements.
+ * @param $query2 Mixed: An optional secondary query array. This one MUST
+ * be an array. If a string is passed it will be interpreted as a deprecated
+ * variant argument and urlencoded into a variant= argument.
+ * This second query argument will be added to the $query
+ * The second parameter is deprecated since 1.19. Pass it as a key,value
+ * pair in the first parameter array instead.
+ *
* @return String the URL
*/
- public function getLocalURL( $query = '', $variant = false ) {
+ public function getLocalURL( $query = '', $query2 = false ) {
global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
- global $wgVariantArticlePath, $wgContLang;
- if ( is_array( $query ) ) {
- $query = wfArrayToCGI( $query );
- }
+ $query = self::fixUrlQueryArgs( $query, $query2 );
- if ( $this->isExternal() ) {
- $url = $this->getFullURL();
- if ( $query ) {
- // This is currently only used for edit section links in the
- // context of interwiki transclusion. In theory we should
- // append the query to the end of any existing query string,
- // but interwiki transclusion is already broken in that case.
- $url .= "?$query";
+ $interwiki = Interwiki::fetch( $this->mInterwiki );
+ if ( $interwiki ) {
+ $namespace = $this->getNsText();
+ if ( $namespace != '' ) {
+ # Can this actually happen? Interwikis shouldn't be parsed.
+ # Yes! It can in interwiki transclusion. But... it probably shouldn't.
+ $namespace .= ':';
}
+ $url = $interwiki->getURL( $namespace . $this->getDBkey() );
+ $url = wfAppendQuery( $url, $query );
} else {
$dbkey = wfUrlencode( $this->getPrefixedDBkey() );
if ( $query == '' ) {
- if ( $variant != false && $wgContLang->hasVariants() ) {
- if ( !$wgVariantArticlePath ) {
- $variantArticlePath = "$wgScript?title=$1&variant=$2"; // default
- } else {
- $variantArticlePath = $wgVariantArticlePath;
- }
- $url = str_replace( '$2', urlencode( $variant ), $variantArticlePath );
- $url = str_replace( '$1', $dbkey, $url );
- } else {
- $url = str_replace( '$1', $dbkey, $wgArticlePath );
- }
+ $url = str_replace( '$1', $dbkey, $wgArticlePath );
+ wfRunHooks( 'GetLocalURL::Article', array( &$this, &$url ) );
} else {
- global $wgActionPaths;
+ global $wgVariantArticlePath, $wgActionPaths;
$url = false;
$matches = array();
+
if ( !empty( $wgActionPaths ) &&
preg_match( '/^(.*&|)action=([^&]*)(&(.*)|)$/', $query, $matches ) )
{
@@ -940,6 +1338,20 @@ class Title {
}
}
+ if ( $url === false &&
+ $wgVariantArticlePath &&
+ $this->getPageLanguage()->hasVariants() &&
+ preg_match( '/^variant=([^&]*)$/', $query, $matches ) )
+ {
+ $variant = urldecode( $matches[1] );
+ if ( $this->getPageLanguage()->hasVariant( $variant ) ) {
+ // Only do the variant replacement if the given variant is a valid
+ // variant for the page's language.
+ $url = str_replace( '$2', urlencode( $variant ), $wgVariantArticlePath );
+ $url = str_replace( '$1', $dbkey, $url );
+ }
+ }
+
if ( $url === false ) {
if ( $query == '-' ) {
$query = '';
@@ -948,6 +1360,8 @@ class Title {
}
}
+ wfRunHooks( 'GetLocalURL::Internal', array( &$this, &$url, $query ) );
+
// @todo FIXME: This causes breakage in various places when we
// actually expected a local URL and end up with dupe prefixes.
if ( $wgRequest->getVal( 'action' ) == 'render' ) {
@@ -968,21 +1382,19 @@ class Title {
* The result obviously should not be URL-escaped, but does need to be
* HTML-escaped if it's being output in HTML.
*
- * @param $query Array of Strings An associative array of key => value pairs for the
- * query string. Keys and values will be escaped.
- * @param $variant String language variant of URL (for sr, zh..). Ignored
- * for external links. Default is "false" (same variant as current page,
- * for anonymous users).
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
* @return String the URL
*/
- public function getLinkUrl( $query = array(), $variant = false ) {
+ public function getLinkURL( $query = '', $query2 = false ) {
wfProfileIn( __METHOD__ );
if ( $this->isExternal() ) {
- $ret = $this->getFullURL( $query );
+ $ret = $this->getFullURL( $query, $query2 );
} elseif ( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
$ret = $this->getFragmentForURL();
} else {
- $ret = $this->getLocalURL( $query, $variant ) . $this->getFragmentForURL();
+ $ret = $this->getLocalURL( $query, $query2 ) . $this->getFragmentForURL();
}
wfProfileOut( __METHOD__ );
return $ret;
@@ -992,49 +1404,50 @@ class Title {
* Get an HTML-escaped version of the URL form, suitable for
* using in a link, without a server name or fragment
*
- * @param $query String an optional query string
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
* @return String the URL
*/
- public function escapeLocalURL( $query = '' ) {
- return htmlspecialchars( $this->getLocalURL( $query ) );
+ public function escapeLocalURL( $query = '', $query2 = false ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ return htmlspecialchars( $this->getLocalURL( $query, $query2 ) );
}
/**
* Get an HTML-escaped version of the URL form, suitable for
* using in a link, including the server name and fragment
*
- * @param $query String an optional query string
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
* @return String the URL
*/
- public function escapeFullURL( $query = '' ) {
- return htmlspecialchars( $this->getFullURL( $query ) );
- }
-
- /**
- * HTML-escaped version of getCanonicalURL()
- */
- public function escapeCanonicalURL( $query = '', $variant = false ) {
- return htmlspecialchars( $this->getCanonicalURL( $query, $variant ) );
+ public function escapeFullURL( $query = '', $query2 = false ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ return htmlspecialchars( $this->getFullURL( $query, $query2 ) );
}
/**
* Get the URL form for an internal link.
* - Used in various Squid-related code, in case we have a different
* internal hostname for the server from the exposed one.
- *
+ *
* This uses $wgInternalServer to qualify the path, or $wgServer
* if $wgInternalServer is not set. If the server variable used is
* protocol-relative, the URL will be expanded to http://
*
- * @param $query String an optional query string
- * @param $variant String language variant of url (for sr, zh..)
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
* @return String the URL
*/
- public function getInternalURL( $query = '', $variant = false ) {
+ public function getInternalURL( $query = '', $query2 = false ) {
global $wgInternalServer, $wgServer;
+ $query = self::fixUrlQueryArgs( $query, $query2 );
$server = $wgInternalServer !== false ? $wgInternalServer : $wgServer;
- $url = wfExpandUrl( $server . $this->getLocalURL( $query, $variant ), PROTO_HTTP );
- wfRunHooks( 'GetInternalURL', array( &$this, &$url, $query, $variant ) );
+ $url = wfExpandUrl( $server . $this->getLocalURL( $query ), PROTO_HTTP );
+ wfRunHooks( 'GetInternalURL', array( &$this, &$url, $query ) );
return $url;
}
@@ -1042,21 +1455,36 @@ class Title {
* Get the URL for a canonical link, for use in things like IRC and
* e-mail notifications. Uses $wgCanonicalServer and the
* GetCanonicalURL hook.
- *
+ *
* NOTE: Unlike getInternalURL(), the canonical URL includes the fragment
- *
- * @param $query string An optional query string
- * @param $variant string Language variant of URL (for sr, zh, ...)
+ *
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
* @return string The URL
+ * @since 1.18
*/
- public function getCanonicalURL( $query = '', $variant = false ) {
- global $wgCanonicalServer;
- $url = wfExpandUrl( $this->getLocalURL( $query, $variant ) . $this->getFragmentForURL(), PROTO_CANONICAL );
- wfRunHooks( 'GetCanonicalURL', array( &$this, &$url, $query, $variant ) );
+ public function getCanonicalURL( $query = '', $query2 = false ) {
+ $query = self::fixUrlQueryArgs( $query, $query2 );
+ $url = wfExpandUrl( $this->getLocalURL( $query ) . $this->getFragmentForURL(), PROTO_CANONICAL );
+ wfRunHooks( 'GetCanonicalURL', array( &$this, &$url, $query ) );
return $url;
}
/**
+ * HTML-escaped version of getCanonicalURL()
+ *
+ * See getLocalURL for the arguments.
+ *
+ * @see self::getLocalURL
+ * @since 1.18
+ */
+ public function escapeCanonicalURL( $query = '', $query2 = false ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ return htmlspecialchars( $this->getCanonicalURL( $query, $query2 ) );
+ }
+
+ /**
* Get the edit URL for this Title
*
* @return String the URL, or a null string if this is an
@@ -1072,100 +1500,6 @@ class Title {
}
/**
- * Get the HTML-escaped displayable text form.
- * Used for the title field in <a> tags.
- *
- * @return String the text, including any prefixes
- */
- public function getEscapedText() {
- return htmlspecialchars( $this->getPrefixedText() );
- }
-
- /**
- * Is this Title interwiki?
- *
- * @return Bool
- */
- public function isExternal() {
- return ( $this->mInterwiki != '' );
- }
-
- /**
- * Is this page "semi-protected" - the *only* protection is autoconfirm?
- *
- * @param $action String 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
- return false;
- }
- }
-
- /**
- * Does the title correspond to a protected article?
- *
- * @param $action String the action the page is protected from,
- * by default checks all actions.
- * @return Bool
- */
- public function isProtected( $action = '' ) {
- global $wgRestrictionLevels;
-
- $restrictionTypes = $this->getRestrictionTypes();
-
- # Special pages have inherent protection
- if( $this->getNamespace() == NS_SPECIAL ) {
- return true;
- }
-
- # Check regular protection levels
- foreach ( $restrictionTypes as $type ) {
- if ( $action == $type || $action == '' ) {
- $r = $this->getRestrictions( $type );
- foreach ( $wgRestrictionLevels as $level ) {
- if ( in_array( $level, $r ) && $level != '' ) {
- return true;
- }
- }
- }
- }
-
- return false;
- }
-
- /**
- * Is this a conversion table for the LanguageConverter?
- *
- * @return Bool
- */
- public function isConversionTable() {
- if(
- $this->getNamespace() == NS_MEDIAWIKI &&
- strpos( $this->getText(), 'Conversiontable' ) !== false
- )
- {
- return true;
- }
-
- return false;
- }
-
- /**
* Is $wgUser watching this page?
*
* @return Bool
@@ -1184,7 +1518,19 @@ class Title {
}
/**
- * Can $wgUser perform $action on this page?
+ * Can $wgUser read this page?
+ *
+ * @deprecated in 1.19; use userCan(), quickUserCan() or getUserPermissionsErrors() instead
+ * @return Bool
+ * @todo fold these checks into userCan()
+ */
+ public function userCanRead() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->userCan( 'read' );
+ }
+
+ /**
+ * Can $user perform $action on this page?
* This skips potentially expensive cascading permission checks
* as well as avoids expensive error formatting
*
@@ -1194,47 +1540,30 @@ class Title {
* May provide false positives, but should never provide a false negative.
*
* @param $action String action that permission needs to be checked for
+ * @param $user User to check (since 1.19); $wgUser will be used if not
+ * provided.
* @return Bool
*/
- public function quickUserCan( $action ) {
- return $this->userCan( $action, false );
+ public function quickUserCan( $action, $user = null ) {
+ return $this->userCan( $action, $user, false );
}
/**
- * Determines if $user is unable to edit this page because it has been protected
- * by $wgNamespaceProtection.
+ * Can $user perform $action on this page?
*
- * @param $user User object, $wgUser will be used if not passed
+ * @param $action String action that permission needs to be checked for
+ * @param $user User to check (since 1.19); $wgUser will be used if not
+ * provided.
+ * @param $doExpensiveQueries Bool Set this to false to avoid doing
+ * unnecessary queries.
* @return Bool
*/
- public function isNamespaceProtected( User $user = null ) {
- global $wgNamespaceProtection;
-
- if ( $user === null ) {
+ public function userCan( $action, $user = null, $doExpensiveQueries = true ) {
+ if ( !$user instanceof User ) {
global $wgUser;
$user = $wgUser;
}
-
- if ( isset( $wgNamespaceProtection[$this->mNamespace] ) ) {
- foreach ( (array)$wgNamespaceProtection[$this->mNamespace] as $right ) {
- if ( $right != '' && !$user->isAllowed( $right ) ) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Can $wgUser perform $action on this page?
- *
- * @param $action String action that permission needs to be checked for
- * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary queries.
- * @return Bool
- */
- public function userCan( $action, $doExpensiveQueries = true ) {
- global $wgUser;
- return ( $this->getUserPermissionsErrorsInternal( $action, $wgUser, $doExpensiveQueries, true ) === array() );
+ return !count( $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries, true ) );
}
/**
@@ -1244,9 +1573,10 @@ class Title {
*
* @param $action String action that permission needs to be checked for
* @param $user User to check
- * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary queries by
- * skipping checks for cascading protections and user blocks.
- * @param $ignoreErrors Array of Strings Set this to a list of message keys whose corresponding errors may be ignored.
+ * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary
+ * queries by skipping checks for cascading protections and user blocks.
+ * @param $ignoreErrors Array of Strings Set this to a list of message keys
+ * whose corresponding errors may be ignored.
* @return Array of arguments to wfMsg to explain permissions problems.
*/
public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true, $ignoreErrors = array() ) {
@@ -1321,24 +1651,7 @@ class Title {
$errors[] = array( 'cant-move-to-user-page' );
}
} elseif ( !$user->isAllowed( $action ) ) {
- // We avoid expensive display logic for quickUserCan's and such
- $groups = false;
- if ( !$short ) {
- $groups = array_map( array( 'User', 'makeGroupLinkWiki' ),
- User::getGroupsWithPermission( $action ) );
- }
-
- if ( $groups ) {
- global $wgLang;
- $return = array(
- 'badaccess-groups',
- $wgLang->commaList( $groups ),
- count( $groups )
- );
- } else {
- $return = array( 'badaccess-group0' );
- }
- $errors[] = $return;
+ $errors[] = $this->missingPermissionError( $action, $short );
}
return $errors;
@@ -1413,7 +1726,7 @@ class Title {
private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
# Only 'createaccount' and 'execute' can be performed on
# special pages, which don't actually exist in the DB.
- $specialOKActions = array( 'createaccount', 'execute' );
+ $specialOKActions = array( 'createaccount', 'execute', 'read' );
if ( NS_SPECIAL == $this->mNamespace && !in_array( $action, $specialOKActions ) ) {
$errors[] = array( 'ns-specialprotected' );
}
@@ -1443,8 +1756,6 @@ class Title {
private function checkCSSandJSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
# Protect css/js subpages of user pages
# XXX: this might be better using restrictions
- # XXX: Find a way to work around the php bug that prevents using $this->userCanEditCssSubpage()
- # and $this->userCanEditJsSubpage() from working
# XXX: right 'editusercssjs' is deprecated, for backward compatibility only
if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' )
&& !preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
@@ -1479,13 +1790,10 @@ class Title {
}
if ( $right != '' && !$user->isAllowed( $right ) ) {
// Users with 'editprotected' permission can edit protected pages
- if ( $action == 'edit' && $user->isAllowed( 'editprotected' ) ) {
- // Users with 'editprotected' permission cannot edit protected pages
- // with cascading option turned on.
- if ( $this->mCascadeRestriction ) {
- $errors[] = array( 'protectedpagetext', $right );
- }
- } else {
+ // without cascading option turned on.
+ if ( $action != 'edit' || !$user->isAllowed( 'editprotected' )
+ || $this->mCascadeRestriction )
+ {
$errors[] = array( 'protectedpagetext', $right );
}
}
@@ -1545,8 +1853,10 @@ class Title {
* @return Array list of errors
*/
private function checkActionPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ global $wgDeleteRevisionsLimit, $wgLang;
+
if ( $action == 'protect' ) {
- if ( $this->getUserPermissionsErrors( 'edit', $user ) != array() ) {
+ if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $doExpensiveQueries, true ) ) ) {
// If they can't edit, they shouldn't protect.
$errors[] = array( 'protect-cantedit' );
}
@@ -1556,7 +1866,9 @@ class Title {
if( $title_protection['pt_create_perm'] == 'sysop' ) {
$title_protection['pt_create_perm'] = 'protect'; // B/C
}
- if( $title_protection['pt_create_perm'] == '' || !$user->isAllowed( $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'] );
}
}
@@ -1567,7 +1879,7 @@ class Title {
$errors[] = array( 'immobile-source-namespace', $this->getNsText() );
} elseif ( !$this->isMovable() ) {
// Less specific message for rarer cases
- $errors[] = array( 'immobile-page' );
+ $errors[] = array( 'immobile-source-page' );
}
} elseif ( $action == 'move-target' ) {
if ( !MWNamespace::isMovable( $this->mNamespace ) ) {
@@ -1575,6 +1887,12 @@ class Title {
} elseif ( !$this->isMovable() ) {
$errors[] = array( 'immobile-target-page' );
}
+ } elseif ( $action == 'delete' ) {
+ if ( $doExpensiveQueries && $wgDeleteRevisionsLimit
+ && !$this->userCan( 'bigdelete', $user ) && $this->isBigDeletion() )
+ {
+ $errors[] = array( 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) );
+ }
}
return $errors;
}
@@ -1591,21 +1909,19 @@ class Title {
* @return Array list of errors
*/
private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
- if( !$doExpensiveQueries ) {
+ // Account creation blocks handled at userlogin.
+ // Unblocking handled in SpecialUnblock
+ if( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
return $errors;
}
global $wgContLang, $wgLang, $wgEmailConfirmToEdit;
- if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount' ) {
+ if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() ) {
$errors[] = array( 'confirmedittext' );
}
- if ( in_array( $action, array( 'read', 'createaccount', 'unblock' ) ) ){
- // Edit blocks should not affect reading.
- // Account creation blocks handled at userlogin.
- // Unblocking handled in SpecialUnblock
- } elseif( ( $action == 'edit' || $action == 'create' ) && !$user->isBlockedFrom( $this ) ){
+ 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 ) {
@@ -1619,7 +1935,7 @@ class Title {
if ( $reason == '' ) {
$reason = wfMsg( 'blockednoreason' );
}
- $ip = wfGetIP();
+ $ip = $user->getRequest()->getIP();
if ( is_numeric( $id ) ) {
$name = User::whoIs( $id );
@@ -1647,6 +1963,127 @@ class Title {
}
/**
+ * Check that the user is allowed to read this page.
+ *
+ * @param $action String the action to check
+ * @param $user User to check
+ * @param $errors Array list of current errors
+ * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
+ * @param $short Boolean short circuit on first error
+ *
+ * @return Array list of errors
+ */
+ private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ global $wgWhitelistRead, $wgGroupPermissions, $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 ( empty( $wgGroupPermissions['*']['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;
+ }
+ }
+ }
+ }
+
+ $whitelisted = false;
+ if ( $useShortcut ) {
+ # Shortcut for public wikis, allows skipping quite a bit of code
+ $whitelisted = true;
+ } elseif ( $user->isAllowed( 'read' ) ) {
+ # If the user is allowed to read pages, he is allowed to read all pages
+ $whitelisted = true;
+ } elseif ( $this->isSpecial( 'Userlogin' )
+ || $this->isSpecial( 'ChangePassword' )
+ || $this->isSpecial( 'PasswordReset' )
+ ) {
+ # Always grant access to the login page.
+ # Even anons need to be able to log in.
+ $whitelisted = true;
+ } elseif ( is_array( $wgWhitelistRead ) && count( $wgWhitelistRead ) ) {
+ # Time to check the whitelist
+ # Only do these checks is there's something to check against
+ $name = $this->getPrefixedText();
+ $dbName = $this->getPrefixedDBKey();
+
+ // Check with and without underscores
+ if ( in_array( $name, $wgWhitelistRead, true ) || in_array( $dbName, $wgWhitelistRead, true ) ) {
+ # Check for explicit whitelisting
+ $whitelisted = true;
+ } elseif ( $this->getNamespace() == NS_MAIN ) {
+ # Old settings might have the title prefixed with
+ # a colon for main-namespace pages
+ if ( in_array( ':' . $name, $wgWhitelistRead ) ) {
+ $whitelisted = true;
+ }
+ } elseif ( $this->isSpecialPage() ) {
+ # If it's a special page, ditch the subpage bit and check again
+ $name = $this->getDBkey();
+ list( $name, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $name );
+ if ( $name !== false ) {
+ $pure = SpecialPage::getTitleFor( $name )->getPrefixedText();
+ if ( in_array( $pure, $wgWhitelistRead, true ) ) {
+ $whitelisted = true;
+ }
+ }
+ }
+ }
+
+ if ( !$whitelisted ) {
+ # If the title is not whitelisted, give extensions a chance to do so...
+ wfRunHooks( 'TitleReadWhitelist', array( $this, $user, &$whitelisted ) );
+ if ( !$whitelisted ) {
+ $errors[] = $this->missingPermissionError( $action, $short );
+ }
+ }
+
+ return $errors;
+ }
+
+ /**
+ * Get a description array when the user doesn't have the right to perform
+ * $action (i.e. when User::isAllowed() returns false)
+ *
+ * @param $action String the action to check
+ * @param $short Boolean short circuit on first error
+ * @return Array list of errors
+ */
+ private function missingPermissionError( $action, $short ) {
+ // We avoid expensive display logic for quickUserCan's and such
+ if ( $short ) {
+ return array( 'badaccess-group0' );
+ }
+
+ $groups = array_map( array( 'User', 'makeGroupLinkWiki' ),
+ User::getGroupsWithPermission( $action ) );
+
+ if ( count( $groups ) ) {
+ global $wgLang;
+ return array(
+ 'badaccess-groups',
+ $wgLang->commaList( $groups ),
+ count( $groups )
+ );
+ } else {
+ return array( 'badaccess-group0' );
+ }
+ }
+
+ /**
* Can $user perform $action on this page? This is an internal function,
* which checks ONLY that previously checked by userCan (i.e. it leaves out
* checks on wfReadOnly() and blocks)
@@ -1660,20 +2097,28 @@ class Title {
protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
wfProfileIn( __METHOD__ );
- $errors = array();
- $checks = array(
- 'checkQuickPermissions',
- 'checkPermissionHooks',
- 'checkSpecialsAndNSPermissions',
- 'checkCSSandJSPermissions',
- 'checkPageRestrictions',
- 'checkCascadingSourcesRestrictions',
- 'checkActionPermissions',
- 'checkUserBlock'
- );
+ # Read has special handling
+ if ( $action == 'read' ) {
+ $checks = array(
+ 'checkPermissionHooks',
+ 'checkReadPermissions',
+ );
+ } else {
+ $checks = array(
+ 'checkQuickPermissions',
+ 'checkPermissionHooks',
+ 'checkSpecialsAndNSPermissions',
+ 'checkCSSandJSPermissions',
+ 'checkPageRestrictions',
+ 'checkCascadingSourcesRestrictions',
+ 'checkActionPermissions',
+ 'checkUserBlock'
+ );
+ }
+ $errors = array();
while( count( $checks ) > 0 &&
- !( $short && count( $errors ) > 0 ) ) {
+ !( $short && count( $errors ) > 0 ) ) {
$method = array_shift( $checks );
$errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
}
@@ -1683,6 +2128,79 @@ 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
+ * titles that do not exist
+ * @return array
+ */
+ public static function getFilteredRestrictionTypes( $exists = true ) {
+ global $wgRestrictionTypes;
+ $types = $wgRestrictionTypes;
+ if ( $exists ) {
+ # Remove the create restriction for existing titles
+ $types = array_diff( $types, array( 'create' ) );
+ } else {
+ # Only the create and upload restrictions apply to non-existing titles
+ $types = array_intersect( $types, array( 'create', 'upload' ) );
+ }
+ return $types;
+ }
+
+ /**
+ * Returns restriction types for the current Title
+ *
+ * @return array applicable restriction types
+ */
+ public function getRestrictionTypes() {
+ if ( $this->isSpecialPage() ) {
+ return array();
+ }
+
+ $types = self::getFilteredRestrictionTypes( $this->exists() );
+
+ if ( $this->getNamespace() != NS_FILE ) {
+ # Remove the upload restriction for non-file titles
+ $types = array_diff( $types, array( 'upload' ) );
+ }
+
+ wfRunHooks( 'TitleGetRestrictionTypes', array( $this, &$types ) );
+
+ wfDebug( __METHOD__ . ': applicable restrictions to [[' .
+ $this->getPrefixedText() . ']] are {' . implode( ',', $types ) . "}\n" );
+
+ return $types;
+ }
+
+ /**
* Is this title subject to title protection?
* Title protection is the one applied against creation of such title.
*
@@ -1715,66 +2233,24 @@ class Title {
/**
* Update the title protection status
*
+ * @deprecated in 1.19; will be removed in 1.20. Use WikiPage::doUpdateRestrictions() instead.
* @param $create_perm String Permission required for creation
* @param $reason String Reason for protection
* @param $expiry String Expiry timestamp
* @return boolean true
*/
public function updateTitleProtection( $create_perm, $reason, $expiry ) {
- global $wgUser, $wgContLang;
-
- if ( $create_perm == implode( ',', $this->getRestrictions( 'create' ) )
- && $expiry == $this->mRestrictionsExpiry['create'] ) {
- // No change
- return true;
- }
-
- list ( $namespace, $title ) = array( $this->getNamespace(), $this->getDBkey() );
-
- $dbw = wfGetDB( DB_MASTER );
-
- $encodedExpiry = $dbw->encodeExpiry( $expiry );
+ wfDeprecated( __METHOD__, '1.19' );
- $expiry_description = '';
- if ( $encodedExpiry != $dbw->getInfinity() ) {
- $expiry_description = ' (' . wfMsgForContent( 'protect-expiring', $wgContLang->timeanddate( $expiry ),
- $wgContLang->date( $expiry ) , $wgContLang->time( $expiry ) ) . ')';
- } else {
- $expiry_description .= ' (' . wfMsgForContent( 'protect-expiry-indefinite' ) . ')';
- }
-
- # Update protection table
- if ( $create_perm != '' ) {
- $this->mTitleProtection = array(
- 'pt_namespace' => $namespace,
- 'pt_title' => $title,
- 'pt_create_perm' => $create_perm,
- 'pt_timestamp' => $dbw->encodeExpiry( wfTimestampNow() ),
- 'pt_expiry' => $encodedExpiry,
- 'pt_user' => $wgUser->getId(),
- 'pt_reason' => $reason,
- );
- $dbw->replace( 'protected_titles', array( array( 'pt_namespace', 'pt_title' ) ),
- $this->mTitleProtection, __METHOD__ );
- } else {
- $dbw->delete( 'protected_titles', array( 'pt_namespace' => $namespace,
- 'pt_title' => $title ), __METHOD__ );
- $this->mTitleProtection = false;
- }
+ global $wgUser;
- # Update the protection log
- if ( $dbw->affectedRows() ) {
- $log = new LogPage( 'protect' );
+ $limit = array( 'create' => $create_perm );
+ $expiry = array( 'create' => $expiry );
- if ( $create_perm ) {
- $params = array( "[create=$create_perm] $expiry_description", '' );
- $log->addEntry( ( isset( $this->mRestrictions['create'] ) && $this->mRestrictions['create'] ) ? 'modify' : 'protect', $this, trim( $reason ), $params );
- } else {
- $log->addEntry( 'unprotect', $this, $reason );
- }
- }
+ $page = WikiPage::factory( $this );
+ $status = $page->doUpdateRestrictions( $limit, $expiry, false, $reason, $wgUser );
- return true;
+ return $status->isOK();
}
/**
@@ -1792,284 +2268,81 @@ class Title {
}
/**
- * Would anybody with sufficient privileges be able to move this page?
- * Some pages just aren't movable.
- *
- * @return Bool TRUE or FALSE
- */
- public function isMovable() {
- return MWNamespace::isMovable( $this->getNamespace() ) && $this->getInterwiki() == '';
- }
-
- /**
- * Can $wgUser read this page?
+ * Is this page "semi-protected" - the *only* protection is autoconfirm?
*
+ * @param $action String Action to check (default: edit)
* @return Bool
- * @todo fold these checks into userCan()
*/
- public function userCanRead() {
- global $wgUser, $wgGroupPermissions;
-
- static $useShortcut = null;
-
- # Initialize the $useShortcut boolean, to determine if we can skip quite a bit of code below
- if ( is_null( $useShortcut ) ) {
- global $wgRevokePermissions;
- $useShortcut = true;
- if ( empty( $wgGroupPermissions['*']['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;
+ 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;
}
- }
-
- $result = null;
- wfRunHooks( 'userCan', array( &$this, &$wgUser, 'read', &$result ) );
- if ( $result !== null ) {
- return $result;
- }
-
- # Shortcut for public wikis, allows skipping quite a bit of code
- if ( $useShortcut ) {
- return true;
- }
-
- if ( $wgUser->isAllowed( 'read' ) ) {
return true;
} else {
- global $wgWhitelistRead;
-
- # Always grant access to the login page.
- # Even anons need to be able to log in.
- if ( $this->isSpecial( 'Userlogin' )
- || $this->isSpecial( 'ChangePassword' )
- || $this->isSpecial( 'PasswordReset' )
- ) {
- return true;
- }
-
- # Bail out if there isn't whitelist
- if ( !is_array( $wgWhitelistRead ) ) {
- return false;
- }
-
- # Check for explicit whitelisting
- $name = $this->getPrefixedText();
- $dbName = $this->getPrefixedDBKey();
- // Check with and without underscores
- if ( in_array( $name, $wgWhitelistRead, true ) || in_array( $dbName, $wgWhitelistRead, true ) )
- return true;
-
- # Old settings might have the title prefixed with
- # a colon for main-namespace pages
- if ( $this->getNamespace() == NS_MAIN ) {
- if ( in_array( ':' . $name, $wgWhitelistRead ) ) {
- return true;
- }
- }
-
- # If it's a special page, ditch the subpage bit and check again
- if ( $this->getNamespace() == NS_SPECIAL ) {
- $name = $this->getDBkey();
- list( $name, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $name );
- if ( $name === false ) {
- # Invalid special page, but we show standard login required message
- return false;
- }
-
- $pure = SpecialPage::getTitleFor( $name )->getPrefixedText();
- if ( in_array( $pure, $wgWhitelistRead, true ) ) {
- return true;
- }
- }
-
+ # If it doesn't exist, it can't be protected
+ return false;
}
- return false;
}
/**
- * Is this the mainpage?
- * @note Title::newFromText seams to be sufficiently optimized by the title
- * cache that we don't need to over-optimize by doing direct comparisons and
- * acidentally creating new bugs where $title->equals( Title::newFromText() )
- * ends up reporting something differently than $title->isMainPage();
- *
- * @return Bool
- */
- public function isMainPage() {
- return $this->equals( Title::newMainPage() );
- }
-
- /**
- * Is this a talk page of some sort?
- *
- * @return Bool
- */
- public function isTalkPage() {
- return MWNamespace::isTalk( $this->getNamespace() );
- }
-
- /**
- * Is this a subpage?
- *
- * @return Bool
- */
- public function isSubpage() {
- return MWNamespace::hasSubpages( $this->mNamespace )
- ? strpos( $this->getText(), '/' ) !== false
- : false;
- }
-
- /**
- * Does this have subpages? (Warning, usually requires an extra DB query.)
+ * Does the title correspond to a protected article?
*
+ * @param $action String the action the page is protected from,
+ * by default checks all actions.
* @return Bool
*/
- public function hasSubpages() {
- if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
- # Duh
- return false;
- }
-
- # We dynamically add a member variable for the purpose of this method
- # alone to cache the result. There's no point in having it hanging
- # around uninitialized in every Title object; therefore we only add it
- # if needed and don't declare it statically.
- if ( isset( $this->mHasSubpages ) ) {
- return $this->mHasSubpages;
- }
+ public function isProtected( $action = '' ) {
+ global $wgRestrictionLevels;
- $subpages = $this->getSubpages( 1 );
- if ( $subpages instanceof TitleArray ) {
- return $this->mHasSubpages = (bool)$subpages->count();
- }
- return $this->mHasSubpages = false;
- }
+ $restrictionTypes = $this->getRestrictionTypes();
- /**
- * Get all subpages of this page.
- *
- * @param $limit Int maximum number of subpages to fetch; -1 for no limit
- * @return mixed TitleArray, or empty array if this page's namespace
- * doesn't allow subpages
- */
- public function getSubpages( $limit = -1 ) {
- if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) {
- return array();
+ # Special pages have inherent protection
+ if( $this->isSpecialPage() ) {
+ return true;
}
- $dbr = wfGetDB( DB_SLAVE );
- $conds['page_namespace'] = $this->getNamespace();
- $conds[] = 'page_title ' . $dbr->buildLike( $this->getDBkey() . '/', $dbr->anyString() );
- $options = array();
- if ( $limit > -1 ) {
- $options['LIMIT'] = $limit;
+ # Check regular protection levels
+ foreach ( $restrictionTypes as $type ) {
+ if ( $action == $type || $action == '' ) {
+ $r = $this->getRestrictions( $type );
+ foreach ( $wgRestrictionLevels as $level ) {
+ if ( in_array( $level, $r ) && $level != '' ) {
+ return true;
+ }
+ }
+ }
}
- return $this->mSubpages = TitleArray::newFromResult(
- $dbr->select( 'page',
- array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' ),
- $conds,
- __METHOD__,
- $options
- )
- );
- }
-
- /**
- * Could this page contain custom CSS or JavaScript, based
- * on the title?
- *
- * @return Bool
- */
- public function isCssOrJsPage() {
- return $this->mNamespace == NS_MEDIAWIKI
- && preg_match( '!\.(?:css|js)$!u', $this->mTextform ) > 0;
- }
-
- /**
- * Is this a .css or .js subpage of a user page?
- * @return Bool
- */
- public function isCssJsSubpage() {
- return ( NS_USER == $this->mNamespace and preg_match( "/\\/.*\\.(?:css|js)$/", $this->mTextform ) );
- }
-
- /**
- * Is this a *valid* .css or .js subpage of a user page?
- *
- * @return Bool
- * @deprecated since 1.17
- */
- public function isValidCssJsSubpage() {
- return $this->isCssJsSubpage();
- }
-
- /**
- * Trim down a .css or .js subpage title to get the corresponding skin name
- *
- * @return string containing skin name from .css or .js subpage title
- */
- public function getSkinFromCssJsSubpage() {
- $subpage = explode( '/', $this->mTextform );
- $subpage = $subpage[ count( $subpage ) - 1 ];
- return( str_replace( array( '.css', '.js' ), array( '', '' ), $subpage ) );
- }
-
- /**
- * Is this a .css subpage of a user page?
- *
- * @return Bool
- */
- public function isCssSubpage() {
- return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.css$/", $this->mTextform ) );
- }
- /**
- * Is this a .js subpage of a user page?
- *
- * @return Bool
- */
- public function isJsSubpage() {
- return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.js$/", $this->mTextform ) );
+ return false;
}
/**
- * Protect css subpages of user pages: can $wgUser edit
- * this page?
+ * Determines if $user is unable to edit this page because it has been protected
+ * by $wgNamespaceProtection.
*
+ * @param $user User object to check permissions
* @return Bool
- * @todo XXX: this might be better using restrictions
*/
- public function userCanEditCssSubpage() {
- global $wgUser;
- return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'editusercss' ) )
- || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
- }
+ public function isNamespaceProtected( User $user ) {
+ global $wgNamespaceProtection;
- /**
- * Protect js subpages of user pages: can $wgUser edit
- * this page?
- *
- * @return Bool
- * @todo XXX: this might be better using restrictions
- */
- public function userCanEditJsSubpage() {
- global $wgUser;
- return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
- || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
+ if ( isset( $wgNamespaceProtection[$this->mNamespace] ) ) {
+ foreach ( (array)$wgNamespaceProtection[$this->mNamespace] as $right ) {
+ if ( $right != '' && !$user->isAllowed( $right ) ) {
+ return true;
+ }
+ }
+ }
+ return false;
}
/**
@@ -2181,6 +2454,34 @@ class Title {
}
/**
+ * Accessor/initialisation for mRestrictions
+ *
+ * @param $action String action that permission needs to be checked for
+ * @return Array of Strings the array of groups allowed to edit this article
+ */
+ public function getRestrictions( $action ) {
+ if ( !$this->mRestrictionsLoaded ) {
+ $this->loadRestrictions();
+ }
+ return isset( $this->mRestrictions[$action] )
+ ? $this->mRestrictions[$action]
+ : array();
+ }
+
+ /**
+ * Get the expiry time for the restriction against a given action
+ *
+ * @return String|Bool 14-char timestamp, or 'infinity' if the page is protected forever
+ * or not protected at all, or false if the action is not recognised.
+ */
+ public function getRestrictionExpiry( $action ) {
+ if ( !$this->mRestrictionsLoaded ) {
+ $this->loadRestrictions();
+ }
+ return isset( $this->mRestrictionsExpiry[$action] ) ? $this->mRestrictionsExpiry[$action] : false;
+ }
+
+ /**
* Returns cascading restrictions for the current article
*
* @return Boolean
@@ -2336,6 +2637,15 @@ class Title {
}
/**
+ * Flush the protection cache in this object and force reload from the database.
+ * This is used when updating protection from WikiPage::doUpdateRestrictions().
+ */
+ public function flushRestrictions() {
+ $this->mRestrictionsLoaded = false;
+ $this->mTitleProtection = null;
+ }
+
+ /**
* Purge expired restrictions from the page_restrictions table
*/
static function purgeExpiredRestrictions() {
@@ -2354,31 +2664,58 @@ class Title {
}
/**
- * Accessor/initialisation for mRestrictions
+ * Does this have subpages? (Warning, usually requires an extra DB query.)
*
- * @param $action String action that permission needs to be checked for
- * @return Array of Strings the array of groups allowed to edit this article
+ * @return Bool
*/
- public function getRestrictions( $action ) {
- if ( !$this->mRestrictionsLoaded ) {
- $this->loadRestrictions();
+ public function hasSubpages() {
+ if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
+ # Duh
+ return false;
}
- return isset( $this->mRestrictions[$action] )
- ? $this->mRestrictions[$action]
- : array();
+
+ # We dynamically add a member variable for the purpose of this method
+ # alone to cache the result. There's no point in having it hanging
+ # around uninitialized in every Title object; therefore we only add it
+ # if needed and don't declare it statically.
+ if ( isset( $this->mHasSubpages ) ) {
+ return $this->mHasSubpages;
+ }
+
+ $subpages = $this->getSubpages( 1 );
+ if ( $subpages instanceof TitleArray ) {
+ return $this->mHasSubpages = (bool)$subpages->count();
+ }
+ return $this->mHasSubpages = false;
}
/**
- * Get the expiry time for the restriction against a given action
+ * Get all subpages of this page.
*
- * @return String|Bool 14-char timestamp, or 'infinity' if the page is protected forever
- * or not protected at all, or false if the action is not recognised.
+ * @param $limit Int maximum number of subpages to fetch; -1 for no limit
+ * @return mixed TitleArray, or empty array if this page's namespace
+ * doesn't allow subpages
*/
- public function getRestrictionExpiry( $action ) {
- if ( !$this->mRestrictionsLoaded ) {
- $this->loadRestrictions();
+ public function getSubpages( $limit = -1 ) {
+ if ( !MWNamespace::hasSubpages( $this->getNamespace() ) ) {
+ return array();
}
- return isset( $this->mRestrictionsExpiry[$action] ) ? $this->mRestrictionsExpiry[$action] : false;
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $conds['page_namespace'] = $this->getNamespace();
+ $conds[] = 'page_title ' . $dbr->buildLike( $this->getDBkey() . '/', $dbr->anyString() );
+ $options = array();
+ if ( $limit > -1 ) {
+ $options['LIMIT'] = $limit;
+ }
+ return $this->mSubpages = TitleArray::newFromResult(
+ $dbr->select( 'page',
+ array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' ),
+ $conds,
+ __METHOD__,
+ $options
+ )
+ );
}
/**
@@ -2521,15 +2858,15 @@ class Title {
* This clears some fields in this object, and clears any associated
* keys in the "bad links" section of the link cache.
*
- * - This is called from Article::doEdit() and Article::insertOn() to allow
+ * - This is called from WikiPage::doEdit() and WikiPage::insertOn() to allow
* loading of the new page_id. It's also called from
- * Article::doDeleteArticle()
+ * WikiPage::doDeleteArticle()
*
* @param $newid Int the new Article ID
*/
public function resetArticleID( $newid ) {
$linkCache = LinkCache::singleton();
- $linkCache->clearBadLink( $this->getPrefixedDBkey() );
+ $linkCache->clearLink( $this );
if ( $newid === false ) {
$this->mArticleID = -1;
@@ -2541,73 +2878,7 @@ class Title {
$this->mRedirect = null;
$this->mLength = -1;
$this->mLatestID = false;
- }
-
- /**
- * Updates page_touched for this page; called from LinksUpdate.php
- *
- * @return Bool true if the update succeded
- */
- public function invalidateCache() {
- if ( wfReadOnly() ) {
- return;
- }
- $dbw = wfGetDB( DB_MASTER );
- $success = $dbw->update(
- 'page',
- array( 'page_touched' => $dbw->timestamp() ),
- $this->pageCond(),
- __METHOD__
- );
- HTMLFileCache::clearFileCache( $this );
- return $success;
- }
-
- /**
- * Prefix some arbitrary text with the namespace or interwiki prefix
- * of this object
- *
- * @param $name String the text
- * @return String the prefixed text
- * @private
- */
- private function prefix( $name ) {
- $p = '';
- if ( $this->mInterwiki != '' ) {
- $p = $this->mInterwiki . ':';
- }
-
- if ( 0 != $this->mNamespace ) {
- $p .= $this->getNsText() . ':';
- }
- return $p . $name;
- }
-
- /**
- * Returns a simple regex that will match on characters and sequences invalid in titles.
- * Note that this doesn't pick up many things that could be wrong with titles, but that
- * replacing this regex with something valid will make many titles valid.
- *
- * @return String regex string
- */
- static function getTitleInvalidRegex() {
- static $rxTc = false;
- if ( !$rxTc ) {
- # Matching titles will be held as illegal.
- $rxTc = '/' .
- # Any character not allowed is forbidden...
- '[^' . Title::legalChars() . ']' .
- # 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\x80-\xff]+;' .
- '|&#[0-9]+;' .
- '|&#x[0-9A-Fa-f]+;' .
- '/S';
- }
-
- return $rxTc;
+ $this->mEstimateRevisions = null;
}
/**
@@ -2811,7 +3082,7 @@ class Title {
: $dbkey;
// Any remaining initial :s are illegal.
- if ( $dbkey !== '' && ':' == $dbkey { 0 } ) {
+ if ( $dbkey !== '' && ':' == $dbkey[0] ) {
return false;
}
@@ -2825,44 +3096,6 @@ class Title {
}
/**
- * Set the fragment for this title. Removes the first character from the
- * specified fragment before setting, so it assumes you're passing it with
- * an initial "#".
- *
- * Deprecated for public use, use Title::makeTitle() with fragment parameter.
- * Still in active use privately.
- *
- * @param $fragment String text
- */
- public function setFragment( $fragment ) {
- $this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
- }
-
- /**
- * Get a Title object associated with the talk page of this article
- *
- * @return Title the object for the talk page
- */
- public function getTalkPage() {
- return Title::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() );
- }
-
- /**
- * Get a title object associated with the subject page of this
- * talk page
- *
- * @return Title the object for the subject page
- */
- public function getSubjectPage() {
- // Is this the same title?
- $subjectNS = MWNamespace::getSubject( $this->getNamespace() );
- if ( $this->getNamespace() == $subjectNS ) {
- return $this;
- }
- return Title::makeTitle( $subjectNS, $this->getDBkey() );
- }
-
- /**
* Get an array of Title objects linking to this Title
* Also stores the IDs in the link cache.
*
@@ -2875,8 +3108,6 @@ class Title {
* @return Array of Title objects linking here
*/
public function getLinksTo( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
- $linkCache = LinkCache::singleton();
-
if ( count( $options ) > 0 ) {
$db = wfGetDB( DB_MASTER );
} else {
@@ -2895,11 +3126,12 @@ class Title {
);
$retVal = array();
- if ( $db->numRows( $res ) ) {
+ if ( $res->numRows() ) {
+ $linkCache = LinkCache::singleton();
foreach ( $res as $row ) {
$titleObj = Title::makeTitle( $row->page_namespace, $row->page_title );
if ( $titleObj ) {
- $linkCache->addGoodLinkObj( $row->page_id, $titleObj, $row->page_len, $row->page_is_redirect, $row->page_latest );
+ $linkCache->addGoodLinkObjFromRow( $titleObj, $row );
$retVal[] = $titleObj;
}
}
@@ -2922,6 +3154,76 @@ class Title {
}
/**
+ * Get an array of Title objects linked from this Title
+ * Also stores the IDs in the link cache.
+ *
+ * WARNING: do not use this function on arbitrary user-supplied titles!
+ * On heavily-used templates it will max out the memory.
+ *
+ * @param $options Array: may be FOR UPDATE
+ * @param $table String: table name
+ * @param $prefix String: fields prefix
+ * @return Array of Title objects linking here
+ */
+ public function getLinksFrom( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
+ $id = $this->getArticleId();
+
+ # If the page doesn't exist; there can't be any link from this page
+ if ( !$id ) {
+ return array();
+ }
+
+ if ( count( $options ) > 0 ) {
+ $db = wfGetDB( DB_MASTER );
+ } else {
+ $db = wfGetDB( DB_SLAVE );
+ }
+
+ $namespaceFiled = "{$prefix}_namespace";
+ $titleField = "{$prefix}_title";
+
+ $res = $db->select(
+ array( $table, 'page' ),
+ array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+ array( "{$prefix}_from" => $id ),
+ __METHOD__,
+ $options,
+ array( 'page' => array( 'LEFT JOIN', array( "page_namespace=$namespaceFiled", "page_title=$titleField" ) ) )
+ );
+
+ $retVal = array();
+ if ( $res->numRows() ) {
+ $linkCache = LinkCache::singleton();
+ foreach ( $res as $row ) {
+ $titleObj = Title::makeTitle( $row->$namespaceFiled, $row->$titleField );
+ if ( $titleObj ) {
+ if ( $row->page_id ) {
+ $linkCache->addGoodLinkObjFromRow( $titleObj, $row );
+ } else {
+ $linkCache->addBadLinkObj( $titleObj );
+ }
+ $retVal[] = $titleObj;
+ }
+ }
+ }
+ return $retVal;
+ }
+
+ /**
+ * Get an array of Title objects used on this Title as a template
+ * Also stores the IDs in the link cache.
+ *
+ * WARNING: do not use this function on arbitrary user-supplied titles!
+ * On heavily-used templates it will max out the memory.
+ *
+ * @param $options Array: may be FOR UPDATE
+ * @return Array of Title the Title objects used here
+ */
+ public function getTemplateLinksFrom( $options = array() ) {
+ return $this->getLinksFrom( $options, 'templatelinks', 'tl' );
+ }
+
+ /**
* Get an array of Title objects referring to non-existent articles linked from this page
*
* @todo check if needed (used only in SpecialBrokenRedirects.php, and should use redirect table in this case)
@@ -3109,7 +3411,7 @@ class Title {
$errors = array();
// wfFindFile( $nt ) / wfLocalFile( $nt ) is not allowed until below
-
+
$file = wfLocalFile( $this );
if ( $file->exists() ) {
if ( $nt->getText() != wfStripIllegalFilenameChars( $nt->getText() ) ) {
@@ -3119,14 +3421,14 @@ class Title {
$errors[] = array( 'imagetypemismatch' );
}
}
-
+
if ( $nt->getNamespace() != NS_FILE ) {
$errors[] = array( 'imagenocrossnamespace' );
- // From here we want to do checks on a file object, so if we can't
+ // From here we want to do checks on a file object, so if we can't
// create one, we must return.
return $errors;
}
-
+
// wfFindFile( $nt ) / wfLocalFile( $nt ) is allowed below here
$destFile = wfLocalFile( $nt );
@@ -3157,8 +3459,8 @@ class Title {
return $err;
}
- // If it is a file, move it first. It is done before all other moving stuff is
- // done because it's hard to revert
+ // If it is a file, move it first.
+ // It is done before all other moving stuff is done because it's hard to revert.
$dbw = wfGetDB( DB_MASTER );
if ( $this->getNamespace() == NS_FILE ) {
$file = wfLocalFile( $this );
@@ -3168,12 +3470,14 @@ class Title {
return $status->getErrorsArray();
}
}
+ // Clear RepoGroup process cache
+ RepoGroup::singleton()->clearCache( $this );
+ RepoGroup::singleton()->clearCache( $nt ); # clear false negative cache
}
$dbw->begin(); # If $file was a LocalFile, its transaction would have closed our own.
$pageid = $this->getArticleID( self::GAID_FOR_UPDATE );
$protected = $this->isProtected();
- $pageCountChange = ( $createRedirect ? 1 : 0 ) - ( $nt->exists() ? 1 : 0 );
// Do the actual move
$err = $this->moveToInternal( $nt, $reason, $createRedirect );
@@ -3183,8 +3487,6 @@ class Title {
return $err;
}
- $redirid = $this->getArticleID();
-
// Refresh the sortkey for this row. Be careful to avoid resetting
// cl_timestamp, which may disturb time-based lists on some sites.
$prefixes = $dbw->select(
@@ -3208,6 +3510,8 @@ class Title {
);
}
+ $redirid = $this->getArticleID();
+
if ( $protected ) {
# Protect the redirect title as the title used to be...
$dbw->insertSelect( 'page_restrictions', 'page_restrictions',
@@ -3243,51 +3547,8 @@ class Title {
WatchedItem::duplicateEntries( $this, $nt );
}
- # Update search engine
- $u = new SearchUpdate( $pageid, $nt->getPrefixedDBkey() );
- $u->doUpdate();
- $u = new SearchUpdate( $redirid, $this->getPrefixedDBkey(), '' );
- $u->doUpdate();
-
$dbw->commit();
- # Update site_stats
- if ( $this->isContentPage() && !$nt->isContentPage() ) {
- # No longer a content page
- # Not viewed, edited, removing
- $u = new SiteStatsUpdate( 0, 1, -1, $pageCountChange );
- } elseif ( !$this->isContentPage() && $nt->isContentPage() ) {
- # Now a content page
- # Not viewed, edited, adding
- $u = new SiteStatsUpdate( 0, 1, + 1, $pageCountChange );
- } elseif ( $pageCountChange ) {
- # Redirect added
- $u = new SiteStatsUpdate( 0, 0, 0, 1 );
- } else {
- # Nothing special
- $u = false;
- }
- if ( $u ) {
- $u->doUpdate();
- }
-
- # Update message cache for interface messages
- if ( $this->getNamespace() == NS_MEDIAWIKI ) {
- # @bug 17860: old article can be deleted, if this the case,
- # delete it from message cache
- if ( $this->getArticleID() === 0 ) {
- MessageCache::singleton()->replace( $this->getDBkey(), false );
- } else {
- $oldarticle = new Article( $this );
- MessageCache::singleton()->replace( $this->getDBkey(), $oldarticle->getContent() );
- }
- }
- if ( $nt->getNamespace() == NS_MEDIAWIKI ) {
- $newarticle = new Article( $nt );
- MessageCache::singleton()->replace( $nt->getDBkey(), $newarticle->getContent() );
- }
-
- global $wgUser;
wfRunHooks( 'TitleMoveComplete', array( &$this, &$nt, &$wgUser, $pageid, $redirid ) );
return true;
}
@@ -3304,11 +3565,28 @@ class Title {
private function moveToInternal( &$nt, $reason = '', $createRedirect = true ) {
global $wgUser, $wgContLang;
- $moveOverRedirect = $nt->exists();
+ if ( $nt->exists() ) {
+ $moveOverRedirect = true;
+ $logType = 'move_redir';
+ } else {
+ $moveOverRedirect = false;
+ $logType = 'move';
+ }
+
+ $redirectSuppressed = !$createRedirect && $wgUser->isAllowed( 'suppressredirect' );
- $commentMsg = ( $moveOverRedirect ? '1movedto2_redir' : '1movedto2' );
- $comment = wfMsgForContent( $commentMsg, $this->getPrefixedText(), $nt->getPrefixedText() );
+ $logEntry = new ManualLogEntry( 'move', $logType );
+ $logEntry->setPerformer( $wgUser );
+ $logEntry->setTarget( $this );
+ $logEntry->setComment( $reason );
+ $logEntry->setParameters( array(
+ '4::target' => $nt->getPrefixedText(),
+ '5::noredir' => $redirectSuppressed ? '1': '0',
+ ) );
+ $formatter = LogFormatter::newFromEntry( $logEntry );
+ $formatter->setContext( RequestContext::newExtraneousContext( $this ) );
+ $comment = $formatter->getPlainActionText();
if ( $reason ) {
$comment .= wfMsgForContent( 'colon-separator' ) . $reason;
}
@@ -3320,38 +3598,18 @@ class Title {
$dbw = wfGetDB( DB_MASTER );
- if ( $moveOverRedirect ) {
- $rcts = $dbw->timestamp( $nt->getEarliestRevTime() );
+ $newpage = WikiPage::factory( $nt );
+ if ( $moveOverRedirect ) {
$newid = $nt->getArticleID();
- $newns = $nt->getNamespace();
- $newdbk = $nt->getDBkey();
# Delete the old redirect. We don't save it to history since
# by definition if we've got here it's rather uninteresting.
# We have to remove it so that the next step doesn't trigger
# a conflict on the unique namespace+title index...
$dbw->delete( 'page', array( 'page_id' => $newid ), __METHOD__ );
- if ( !$dbw->cascadingDeletes() ) {
- $dbw->delete( 'revision', array( 'rev_page' => $newid ), __METHOD__ );
- global $wgUseTrackbacks;
- if ( $wgUseTrackbacks ) {
- $dbw->delete( 'trackbacks', array( 'tb_page' => $newid ), __METHOD__ );
- }
- $dbw->delete( 'pagelinks', array( 'pl_from' => $newid ), __METHOD__ );
- $dbw->delete( 'imagelinks', array( 'il_from' => $newid ), __METHOD__ );
- $dbw->delete( 'categorylinks', array( 'cl_from' => $newid ), __METHOD__ );
- $dbw->delete( 'templatelinks', array( 'tl_from' => $newid ), __METHOD__ );
- $dbw->delete( 'externallinks', array( 'el_from' => $newid ), __METHOD__ );
- $dbw->delete( 'langlinks', array( 'll_from' => $newid ), __METHOD__ );
- $dbw->delete( 'iwlinks', array( 'iwl_from' => $newid ), __METHOD__ );
- $dbw->delete( 'redirect', array( 'rd_from' => $newid ), __METHOD__ );
- }
- // If the target page was recently created, it may have an entry in recentchanges still
- $dbw->delete( 'recentchanges',
- array( 'rc_timestamp' => $rcts, 'rc_namespace' => $newns, 'rc_title' => $newdbk, 'rc_new' => 1 ),
- __METHOD__
- );
+
+ $newpage->doDeleteUpdates( $newid );
}
# Save a null revision in the page's history notifying of the move
@@ -3361,68 +3619,56 @@ class Title {
}
$nullRevId = $nullRevision->insertOn( $dbw );
- $now = wfTimestampNow();
# Change the name of the target page:
$dbw->update( 'page',
/* SET */ array(
- 'page_touched' => $dbw->timestamp( $now ),
'page_namespace' => $nt->getNamespace(),
'page_title' => $nt->getDBkey(),
- 'page_latest' => $nullRevId,
),
/* WHERE */ array( 'page_id' => $oldid ),
__METHOD__
);
+
+ $this->resetArticleID( 0 );
$nt->resetArticleID( $oldid );
- $article = new Article( $nt );
- wfRunHooks( 'NewRevisionFromEditComplete', array( $article, $nullRevision, $latest, $wgUser ) );
- $article->setCachedLastEditTime( $now );
+ $newpage->updateRevisionOn( $dbw, $nullRevision );
+
+ wfRunHooks( 'NewRevisionFromEditComplete',
+ array( $newpage, $nullRevision, $latest, $wgUser ) );
+
+ $newpage->doEditUpdates( $nullRevision, $wgUser, array( 'changed' => false ) );
+
+ if ( !$moveOverRedirect ) {
+ WikiPage::onArticleCreate( $nt );
+ }
# Recreate the redirect, this time in the other direction.
- if ( $createRedirect || !$wgUser->isAllowed( 'suppressredirect' ) ) {
+ if ( $redirectSuppressed ) {
+ WikiPage::onArticleDelete( $this );
+ } else {
$mwRedir = MagicWord::get( 'redirect' );
$redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
- $redirectArticle = new Article( $this );
+ $redirectArticle = WikiPage::factory( $this );
$newid = $redirectArticle->insertOn( $dbw );
- $redirectRevision = new Revision( array(
- 'page' => $newid,
- 'comment' => $comment,
- 'text' => $redirectText ) );
- $redirectRevision->insertOn( $dbw );
- $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $redirectArticle, $redirectRevision, false, $wgUser ) );
-
- # Now, we record the link from the redirect to the new title.
- # It should have no other outgoing links...
- $dbw->delete( 'pagelinks', array( 'pl_from' => $newid ), __METHOD__ );
- $dbw->insert( 'pagelinks',
- array(
- 'pl_from' => $newid,
- 'pl_namespace' => $nt->getNamespace(),
- 'pl_title' => $nt->getDBkey() ),
- __METHOD__ );
- $redirectSuppressed = false;
- } else {
- $this->resetArticleID( 0 );
- $redirectSuppressed = true;
+ if ( $newid ) { // sanity
+ $redirectRevision = new Revision( array(
+ 'page' => $newid,
+ 'comment' => $comment,
+ 'text' => $redirectText ) );
+ $redirectRevision->insertOn( $dbw );
+ $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
+
+ wfRunHooks( 'NewRevisionFromEditComplete',
+ array( $redirectArticle, $redirectRevision, false, $wgUser ) );
+
+ $redirectArticle->doEditUpdates( $redirectRevision, $wgUser, array( 'created' => true ) );
+ }
}
# Log the move
- $log = new LogPage( 'move' );
- $logType = ( $moveOverRedirect ? 'move_redir' : 'move' );
- $log->addEntry( $logType, $this, $reason, array( 1 => $nt->getPrefixedText(), 2 => $redirectSuppressed ) );
-
- # Purge caches for old and new titles
- if ( $moveOverRedirect ) {
- # A simple purge is enough when moving over a redirect
- $nt->purgeSquid();
- } else {
- # Purge caches as per article creation, including any pages that link to this title
- Article::onArticleCreate( $nt );
- }
- $this->purgeSquid();
+ $logid = $logEntry->insert();
+ $logEntry->publish( $logid );
}
/**
@@ -3558,6 +3804,9 @@ class Title {
}
# Get the article text
$rev = Revision::newFromTitle( $nt );
+ if( !is_object( $rev ) ){
+ return false;
+ }
$text = $rev->getText();
# Does the redirect point to the source?
# Or is it a broken self-redirect, usually caused by namespace collisions?
@@ -3579,15 +3828,6 @@ class Title {
}
/**
- * Can this title be added to a user's watchlist?
- *
- * @return Bool TRUE or FALSE
- */
- public function isWatchable() {
- return !$this->isExternal() && MWNamespace::isWatchable( $this->getNamespace() );
- }
-
- /**
* Get categories to which this Title belongs and return an array of
* categories' names.
*
@@ -3748,6 +3988,41 @@ class Title {
}
/**
+ * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
+ *
+ * @return bool
+ */
+ public function isBigDeletion() {
+ global $wgDeleteRevisionsLimit;
+
+ if ( !$wgDeleteRevisionsLimit ) {
+ return false;
+ }
+
+ $revCount = $this->estimateRevisionCount();
+ return $revCount > $wgDeleteRevisionsLimit;
+ }
+
+ /**
+ * Get the approximate revision count of this page.
+ *
+ * @return int
+ */
+ public function estimateRevisionCount() {
+ if ( !$this->exists() ) {
+ return 0;
+ }
+
+ if ( $this->mEstimateRevisions === null ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $this->mEstimateRevisions = $dbr->estimateRowCount( 'revision', '*',
+ array( 'rev_page' => $this->getArticleId() ), __METHOD__ );
+ }
+
+ return $this->mEstimateRevisions;
+ }
+
+ /**
* Get the number of revisions between the given revision.
* Used for diffs and other things that really need it.
*
@@ -3821,28 +4096,15 @@ class Title {
}
/**
- * Callback for usort() to do title sorts by (namespace, title)
- *
- * @param $a Title
- * @param $b Title
- *
- * @return Integer: result of string comparison, or namespace comparison
- */
- public static function compare( $a, $b ) {
- if ( $a->getNamespace() == $b->getNamespace() ) {
- return strcmp( $a->getText(), $b->getText() );
- } else {
- return $a->getNamespace() - $b->getNamespace();
- }
- }
-
- /**
- * Return a string representation of this title
+ * Check if this title is a subpage of another title
*
- * @return String representation of this title
+ * @param $title Title
+ * @return Bool
*/
- public function __toString() {
- return $this->getPrefixedText();
+ public function isSubpageOf( Title $title ) {
+ return $this->getInterwiki() === $title->getInterwiki()
+ && $this->getNamespace() == $title->getNamespace()
+ && strpos( $this->getDBkey(), $title->getDBkey() . '/' ) === 0;
}
/**
@@ -3956,13 +4218,23 @@ class Title {
}
/**
- * Is this in a namespace that allows actual pages?
+ * Updates page_touched for this page; called from LinksUpdate.php
*
- * @return Bool
- * @internal note -- uses hardcoded namespace index instead of constants
+ * @return Bool true if the update succeded
*/
- public function canExist() {
- return $this->mNamespace >= 0 && $this->mNamespace != NS_MEDIA;
+ public function invalidateCache() {
+ if ( wfReadOnly() ) {
+ return false;
+ }
+ $dbw = wfGetDB( DB_MASTER );
+ $success = $dbw->update(
+ 'page',
+ array( 'page_touched' => $dbw->timestamp() ),
+ $this->pageCond(),
+ __METHOD__
+ );
+ HTMLFileCache::clearFileCache( $this );
+ return $success;
}
/**
@@ -4030,46 +4302,6 @@ class Title {
}
/**
- * Get the trackback URL for this page
- *
- * @return String Trackback URL
- */
- public function trackbackURL() {
- global $wgScriptPath, $wgServer, $wgScriptExtension;
-
- return "$wgServer$wgScriptPath/trackback$wgScriptExtension?article="
- . htmlspecialchars( urlencode( $this->getPrefixedDBkey() ) );
- }
-
- /**
- * Get the trackback RDF for this page
- *
- * @return String Trackback RDF
- */
- public function trackbackRDF() {
- $url = htmlspecialchars( $this->getFullURL() );
- $title = htmlspecialchars( $this->getText() );
- $tburl = $this->trackbackURL();
-
- // Autodiscovery RDF is placed in comments so HTML validator
- // won't barf. This is a rather icky workaround, but seems
- // frequently used by this kind of RDF thingy.
- //
- // Spec: http://www.sixapart.com/pronet/docs/trackback_spec
- return "<!--
-<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"
- xmlns:dc=\"http://purl.org/dc/elements/1.1/\"
- xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\">
-<rdf:Description
- rdf:about=\"$url\"
- dc:identifier=\"$url\"
- dc:title=\"$title\"
- trackback:ping=\"$tburl\" />
-</rdf:RDF>
--->";
- }
-
- /**
* Generate strings used for xml 'id' names in monobook tabs
*
* @param $prepend string defaults to 'nstab-'
@@ -4101,61 +4333,6 @@ class Title {
}
/**
- * Returns true if this is a special page.
- *
- * @return boolean
- */
- public function isSpecialPage() {
- return $this->getNamespace() == NS_SPECIAL;
- }
-
- /**
- * Returns true if this title resolves to the named special page
- *
- * @param $name String The special page name
- * @return boolean
- */
- public function isSpecial( $name ) {
- if ( $this->getNamespace() == NS_SPECIAL ) {
- list( $thisName, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $this->getDBkey() );
- if ( $name == $thisName ) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * If the Title refers to a special page alias which is not the local default, resolve
- * the alias, and localise the name as necessary. Otherwise, return $this
- *
- * @return Title
- */
- public function fixSpecialName() {
- if ( $this->getNamespace() == NS_SPECIAL ) {
- list( $canonicalName, $par ) = SpecialPageFactory::resolveAlias( $this->mDbkeyform );
- if ( $canonicalName ) {
- $localName = SpecialPageFactory::getLocalNameFor( $canonicalName, $par );
- if ( $localName != $this->mDbkeyform ) {
- return Title::makeTitle( NS_SPECIAL, $localName );
- }
- }
- }
- return $this;
- }
-
- /**
- * Is this Title in a namespace which contains content?
- * In other words, is this a content page, for the purposes of calculating
- * statistics, etc?
- *
- * @return Boolean
- */
- public function isContentPage() {
- return MWNamespace::isContent( $this->getNamespace() );
- }
-
- /**
* Get all extant redirects to this Title
*
* @param $ns Int|Null Single namespace to consider; NULL to consider all namespaces
@@ -4212,7 +4389,7 @@ class Title {
/**
* Get a backlink cache object
*
- * @return object BacklinkCache
+ * @return BacklinkCache
*/
function getBacklinkCache() {
if ( is_null( $this->mBacklinkCache ) ) {
@@ -4238,50 +4415,6 @@ class Title {
}
/**
- * Returns restriction types for the current Title
- *
- * @return array applicable restriction types
- */
- public function getRestrictionTypes() {
- if ( $this->getNamespace() == NS_SPECIAL ) {
- return array();
- }
-
- $types = self::getFilteredRestrictionTypes( $this->exists() );
-
- if ( $this->getNamespace() != NS_FILE ) {
- # Remove the upload restriction for non-file titles
- $types = array_diff( $types, array( 'upload' ) );
- }
-
- wfRunHooks( 'TitleGetRestrictionTypes', array( $this, &$types ) );
-
- wfDebug( __METHOD__ . ': applicable restriction types for ' .
- $this->getPrefixedText() . ' are ' . implode( ',', $types ) . "\n" );
-
- return $types;
- }
- /**
- * Get a filtered list of all restriction types supported by this wiki.
- * @param bool $exists True to get all restriction types that apply to
- * titles that do exist, False for all restriction types that apply to
- * titles that do not exist
- * @return array
- */
- public static function getFilteredRestrictionTypes( $exists = true ) {
- global $wgRestrictionTypes;
- $types = $wgRestrictionTypes;
- if ( $exists ) {
- # Remove the create restriction for existing titles
- $types = array_diff( $types, array( 'create' ) );
- } else {
- # Only the create and upload restrictions apply to non-existing titles
- $types = array_intersect( $types, array( 'create', 'upload' ) );
- }
- return $types;
- }
-
- /**
* Returns the raw sort key to be used for categories, with the specified
* prefix. This will be fed to Collation::getSortKey() to get a
* binary sortkey that can be used for actual sorting.
@@ -4320,12 +4453,9 @@ class Title {
*/
public function getPageLanguage() {
global $wgLang;
- if ( $this->getNamespace() == NS_SPECIAL ) {
+ if ( $this->isSpecialPage() ) {
// special pages are in the user language
return $wgLang;
- } elseif ( $this->isRedirect() ) {
- // the arrow on a redirect page is aligned according to the user language
- return $wgLang;
} elseif ( $this->isCssOrJsPage() ) {
// css/js should always be LTR and is, in fact, English
return wfGetLangObj( 'en' );
diff --git a/includes/User.php b/includes/User.php
index af05926c..cfba748f 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -142,13 +142,11 @@ class User {
'reupload',
'reupload-shared',
'rollback',
- 'selenium',
'sendemail',
'siteadmin',
'suppressionlog',
'suppressredirect',
'suppressrevision',
- 'trackback',
'unblockself',
'undelete',
'unwatchedpages',
@@ -393,7 +391,7 @@ class User {
* If the code is invalid or has expired, returns NULL.
*
* @param $code String Confirmation code
- * @return User
+ * @return User object, or null
*/
public static function newFromConfirmationCode( $code ) {
$dbr = wfGetDB( DB_SLAVE );
@@ -414,7 +412,7 @@ class User {
*
* @param $request WebRequest object to use; $wgRequest will be used if
* ommited.
- * @return User
+ * @return User object
*/
public static function newFromSession( WebRequest $request = null ) {
$user = new User;
@@ -447,9 +445,9 @@ class User {
/**
* Get the username corresponding to a given user ID
* @param $id Int User ID
- * @return String The corresponding username
+ * @return String|false The corresponding username
*/
- static function whoIs( $id ) {
+ public static function whoIs( $id ) {
$dbr = wfGetDB( DB_SLAVE );
return $dbr->selectField( 'user', 'user_name', array( 'user_id' => $id ), __METHOD__ );
}
@@ -458,7 +456,7 @@ class User {
* Get the real name of a user given their user ID
*
* @param $id Int User ID
- * @return String The corresponding user's real name
+ * @return String|false The corresponding user's real name
*/
public static function whoIsReal( $id ) {
$dbr = wfGetDB( DB_SLAVE );
@@ -550,6 +548,7 @@ class User {
return false;
}
+
// 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 );
@@ -731,6 +730,7 @@ class User {
* @deprecated since 1.18 call Sanitizer::isValidEmail() directly
*/
public static function isValidEmailAddr( $addr ) {
+ wfDeprecated( __METHOD__, '1.18' );
return Sanitizer::validateEmail( $addr );
}
@@ -1049,6 +1049,8 @@ class User {
public function loadFromRow( $row ) {
$all = true;
+ $this->mGroups = null; // deferred
+
if ( isset( $row->user_name ) ) {
$this->mName = $row->user_name;
$this->mFrom = 'name';
@@ -1072,13 +1074,21 @@ class User {
$all = false;
}
+ if ( isset( $row->user_editcount ) ) {
+ $this->mEditCount = $row->user_editcount;
+ } else {
+ $all = false;
+ }
+
if ( isset( $row->user_password ) ) {
$this->mPassword = $row->user_password;
$this->mNewpassword = $row->user_newpassword;
$this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time );
$this->mEmail = $row->user_email;
- $this->decodeOptions( $row->user_options );
- $this->mTouched = wfTimestamp(TS_MW,$row->user_touched);
+ if ( isset( $row->user_options ) ) {
+ $this->decodeOptions( $row->user_options );
+ }
+ $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
$this->mToken = $row->user_token;
if ( $this->mToken == '' ) {
$this->mToken = null;
@@ -1087,7 +1097,6 @@ class User {
$this->mEmailToken = $row->user_email_token;
$this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires );
$this->mRegistration = wfTimestampOrNull( TS_MW, $row->user_registration );
- $this->mEditCount = $row->user_editcount;
} else {
$all = false;
}
@@ -1159,6 +1168,7 @@ class User {
$log->addEntry( 'autopromote',
$this->getUserPage(),
'', // no comment
+ // These group names are "list to texted"-ed in class LogPage.
array( implode( ', ', $oldGroups ), implode( ', ', $newGroups ) )
);
}
@@ -1207,6 +1217,12 @@ class User {
}
$defOpt['skin'] = $wgDefaultSkin;
+ // FIXME: Ideally we'd cache the results of this function so the hook is only run once,
+ // but that breaks the parser tests because they rely on being able to change $wgContLang
+ // mid-request and see that change reflected in the return value of this function.
+ // Which is insane and would never happen during normal MW operation, but is also not
+ // likely to get fixed unless and until we context-ify everything.
+ // See also https://www.mediawiki.org/wiki/Special:Code/MediaWiki/101488#c25275
wfRunHooks( 'UserGetDefaultOptions', array( &$defOpt ) );
return $defOpt;
@@ -1252,44 +1268,47 @@ class User {
// overwriting mBlockedby, surely?
$this->load();
- $this->mBlockedby = 0;
- $this->mHideName = 0;
- $this->mAllowUsertalk = 0;
-
# We only need to worry about passing the IP address to the Block generator if the
# user is not immune to autoblocks/hardblocks, and they are the current user so we
# know which IP address they're actually coming from
if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->getID() == $wgUser->getID() ) {
- $ip = wfGetIP();
+ $ip = $this->getRequest()->getIP();
} else {
$ip = null;
}
# User/IP blocking
- $this->mBlock = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
- if ( $this->mBlock instanceof Block ) {
- wfDebug( __METHOD__ . ": Found block.\n" );
- $this->mBlockedby = $this->mBlock->getByName();
- $this->mBlockreason = $this->mBlock->mReason;
- $this->mHideName = $this->mBlock->mHideName;
- $this->mAllowUsertalk = !$this->mBlock->prevents( 'editownusertalk' );
- }
+ $block = Block::newFromTarget( $this->getName(), $ip, !$bFromSlave );
# Proxy blocking
- if ( $ip !== null && !$this->isAllowed( 'proxyunbannable' ) && !in_array( $ip, $wgProxyWhitelist ) ) {
+ if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
+ && !in_array( $ip, $wgProxyWhitelist ) )
+ {
# Local list
if ( self::isLocallyBlockedProxy( $ip ) ) {
- $this->mBlockedby = wfMsg( 'proxyblocker' );
- $this->mBlockreason = wfMsg( 'proxyblockreason' );
+ $block = new Block;
+ $block->setBlocker( wfMsg( 'proxyblocker' ) );
+ $block->mReason = wfMsg( 'proxyblockreason' );
+ $block->setTarget( $ip );
+ } elseif ( $this->isAnon() && $this->isDnsBlacklisted( $ip ) ) {
+ $block = new Block;
+ $block->setBlocker( wfMsg( 'sorbs' ) );
+ $block->mReason = wfMsg( 'sorbsreason' );
+ $block->setTarget( $ip );
}
+ }
- # DNSBL
- if ( !$this->mBlockedby && !$this->getID() ) {
- if ( $this->isDnsBlacklisted( $ip ) ) {
- $this->mBlockedby = wfMsg( 'sorbs' );
- $this->mBlockreason = wfMsg( 'sorbsreason' );
- }
- }
+ if ( $block instanceof Block ) {
+ wfDebug( __METHOD__ . ": Found block.\n" );
+ $this->mBlock = $block;
+ $this->mBlockedby = $block->getByName();
+ $this->mBlockreason = $block->mReason;
+ $this->mHideName = $block->mHideName;
+ $this->mAllowUsertalk = !$block->prevents( 'editownusertalk' );
+ } else {
+ $this->mBlockedby = '';
+ $this->mHideName = 0;
+ $this->mAllowUsertalk = false;
}
# Extensions
@@ -1337,7 +1356,17 @@ class User {
foreach( (array)$bases as $base ) {
# Make hostname
- $host = "$ipReversed.$base";
+ # 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]}";
+ }
+ } else {
+ $host = "$ipReversed.$base";
+ }
# Send query
$ipList = gethostbynamel( $host );
@@ -1397,7 +1426,7 @@ class User {
*/
public function isPingLimitable() {
global $wgRateLimitsExcludedIPs;
- if( in_array( wfGetIP(), $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.
@@ -1438,7 +1467,7 @@ class User {
$limits = $wgRateLimits[$action];
$keys = array();
$id = $this->getId();
- $ip = wfGetIP();
+ $ip = $this->getRequest()->getIP();
$userLimit = false;
if( isset( $limits['anon'] ) && $id == 0 ) {
@@ -1595,7 +1624,7 @@ class User {
if( IP::isIPAddress( $this->getName() ) ) {
$ip = $this->getName();
} elseif( !$ip ) {
- $ip = wfGetIP();
+ $ip = $this->getRequest()->getIP();
}
$blocked = false;
wfRunHooks( 'UserIsBlockedGlobally', array( &$this, $ip, &$blocked ) );
@@ -1673,7 +1702,7 @@ class User {
$this->load();
if ( $this->mName === false ) {
# Clean up IPs
- $this->mName = IP::sanitizeIP( wfGetIP() );
+ $this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );
}
return $this->mName;
}
@@ -2081,7 +2110,11 @@ class User {
*/
public function setEmail( $str ) {
$this->load();
+ if( $str == $this->mEmail ) {
+ return;
+ }
$this->mEmail = $str;
+ $this->invalidateEmail();
wfRunHooks( 'UserSetEmail', array( $this, &$this->mEmail ) );
}
@@ -2259,7 +2292,7 @@ class User {
* Get the permissions this user has.
* @return Array of String permission names
*/
- function getRights() {
+ public function getRights() {
if ( is_null( $this->mRights ) ) {
$this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
wfRunHooks( 'UserGetRights', array( $this, &$this->mRights ) );
@@ -2276,6 +2309,7 @@ class User {
*/
public function getGroups() {
$this->load();
+ $this->loadGroups();
return $this->mGroups;
}
@@ -2533,6 +2567,7 @@ class User {
* @deprecated since 1.18 Use ->getSkin() in the most relevant outputting context you have
*/
public function getSkin() {
+ wfDeprecated( __METHOD__, '1.18' );
return RequestContext::getMain()->getSkin();
}
@@ -2567,14 +2602,6 @@ class User {
}
/**
- * Cleans up watchlist by removing invalid entries from it
- */
- public function cleanupWatchlist() {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'watchlist', array( 'wl_namespace < 0', 'wl_user' => $this->getId() ), __METHOD__ );
- }
-
- /**
* 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.
@@ -2661,8 +2688,11 @@ class User {
/**
* Set this user's options from an encoded string
* @param $str String Encoded options to import
+ *
+ * @deprecated in 1.19 due to removal of user_options from the user table
*/
private function decodeOptions( $str ) {
+ wfDeprecated( __METHOD__, '1.19' );
if( !$str )
return;
@@ -2798,7 +2828,6 @@ class User {
'user_real_name' => $this->mRealName,
'user_email' => $this->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
- 'user_options' => '',
'user_touched' => $dbw->timestamp( $this->mTouched ),
'user_token' => strval( $this->mToken ),
'user_email_token' => $this->mEmailToken,
@@ -2866,7 +2895,6 @@ class User {
'user_email' => $user->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
'user_real_name' => $user->mRealName,
- 'user_options' => '',
'user_token' => strval( $user->mToken ),
'user_registration' => $dbw->timestamp( $user->mRegistration ),
'user_editcount' => 0,
@@ -2900,7 +2928,6 @@ class User {
'user_email' => $this->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
'user_real_name' => $this->mRealName,
- 'user_options' => '',
'user_token' => strval( $this->mToken ),
'user_registration' => $dbw->timestamp( $this->mRegistration ),
'user_editcount' => 0,
@@ -2943,7 +2970,7 @@ class User {
return false;
}
- return (bool)$userblock->doAutoblock( wfGetIP() );
+ return (bool)$userblock->doAutoblock( $this->getRequest()->getIP() );
}
/**
@@ -2961,11 +2988,12 @@ class User {
* @return String Page rendering hash
*/
public function getPageRenderingHash() {
+ wfDeprecated( __METHOD__, '1.17' );
+
global $wgUseDynamicDates, $wgRenderHashAppend, $wgLang, $wgContLang;
if( $this->mHash ){
return $this->mHash;
}
- wfDeprecated( __METHOD__ );
// stubthreshold is only included below for completeness,
// since it disables the parser cache, its value will always
@@ -3012,7 +3040,7 @@ class User {
# blocked with createaccount disabled, prevent new account creation there even
# when the user is logged in
if( $this->mBlockedFromCreateAccount === false ){
- $this->mBlockedFromCreateAccount = Block::newFromTarget( null, wfGetIP() );
+ $this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
}
return $this->mBlockedFromCreateAccount instanceof Block && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
? $this->mBlockedFromCreateAccount
@@ -3130,16 +3158,31 @@ class User {
}
/**
+ * Alias for getEditToken.
+ * @deprecated since 1.19, use getEditToken instead.
+ *
+ * @param $salt String|Array 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
+ */
+ public function editToken( $salt = '', $request = null ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->getEditToken( $salt, $request );
+ }
+
+ /**
* Initialize (if necessary) and return a session token value
* which can be used in edit forms to show that the user's
* login credentials aren't being hijacked with a foreign form
* submission.
*
+ * @since 1.19
+ *
* @param $salt String|Array 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
*/
- public function editToken( $salt = '', $request = null ) {
+ public function getEditToken( $salt = '', $request = null ) {
if ( $request == null ) {
$request = $this->getRequest();
}
@@ -3181,7 +3224,7 @@ class User {
* @return Boolean: Whether the token matches
*/
public function matchEditToken( $val, $salt = '', $request = null ) {
- $sessionToken = $this->editToken( $salt, $request );
+ $sessionToken = $this->getEditToken( $salt, $request );
if ( $val != $sessionToken ) {
wfDebug( "User::matchEditToken: broken session data\n" );
}
@@ -3198,7 +3241,7 @@ class User {
* @return Boolean: Whether the token matches
*/
public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
- $sessionToken = $this->editToken( $salt, $request );
+ $sessionToken = $this->getEditToken( $salt, $request );
return substr( $sessionToken, 0, 32 ) == substr( $val, 0, 32 );
}
@@ -3227,7 +3270,7 @@ class User {
return $this->sendMail( wfMsg( 'confirmemail_subject' ),
wfMsg( $message,
- wfGetIP(),
+ $this->getRequest()->getIP(),
$this->getName(),
$url,
$wgLang->timeanddate( $expiration, false ),
@@ -3464,15 +3507,12 @@ class User {
* Get the permissions associated with a given list of groups
*
* @param $groups Array of Strings List of internal group names
- * @param $ns int
- *
* @return Array of Strings List of permission key names for given groups combined
*/
public static function getGroupPermissions( $groups ) {
global $wgGroupPermissions, $wgRevokePermissions;
$rights = array();
-
- // Grant every granted permission first
+ // grant every granted permission first
foreach( $groups as $group ) {
if( isset( $wgGroupPermissions[$group] ) ) {
$rights = array_merge( $rights,
@@ -3480,8 +3520,7 @@ class User {
array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
}
}
-
- // Revoke the revoked permissions
+ // now revoke the revoked permissions
foreach( $groups as $group ) {
if( isset( $wgRevokePermissions[$group] ) ) {
$rights = array_diff( $rights,
@@ -3495,9 +3534,6 @@ class User {
* Get all the groups who have a given permission
*
* @param $role String Role to check
- * @param $ns int
- *
- *
* @return Array of Strings List of internal group names with the given permission
*/
public static function getGroupsWithPermission( $role ) {
@@ -3526,10 +3562,11 @@ class User {
* Get the localized descriptive name for a member of a group, if it exists
*
* @param $group String Internal group name
+ * @param $username String Username for gender (since 1.19)
* @return String Localized name for group member
*/
- public static function getGroupMember( $group ) {
- $msg = wfMessage( "group-$group-member" );
+ public static function getGroupMember( $group, $username = '#' ) {
+ $msg = wfMessage( "group-$group-member", $username );
return $msg->isBlank() ? $group : $msg->text();
}
@@ -3872,12 +3909,12 @@ class User {
}
/**
- * Add a newuser log entry for this user
+ * Add a newuser log entry for this user. Before 1.19 the return value was always true.
*
* @param $byEmail Boolean: account made by email?
* @param $reason String: user supplied reason
*
- * @return true
+ * @return int|bool True if not $wgNewUserLog; otherwise ID of log item or 0 on failure
*/
public function addNewUserLogEntry( $byEmail = false, $reason = '' ) {
global $wgUser, $wgContLang, $wgNewUserLog;
@@ -3899,13 +3936,12 @@ class User {
}
}
$log = new LogPage( 'newusers' );
- $log->addEntry(
+ return (int)$log->addEntry(
$action,
$this->getUserPage(),
$reason,
array( $this->getId() )
);
- return true;
}
/**
@@ -3952,6 +3988,7 @@ class User {
__METHOD__
);
+ $this->mOptionOverrides = array();
foreach ( $res as $row ) {
$this->mOptionOverrides[$row->up_property] = $row->up_value;
$this->mOptions[$row->up_property] = $row->up_value;
@@ -4007,10 +4044,8 @@ class User {
}
}
- $dbw->begin();
$dbw->delete( 'user_properties', array( 'up_user' => $this->getId() ), __METHOD__ );
$dbw->insert( 'user_properties', $insert_rows, __METHOD__ );
- $dbw->commit();
}
/**
diff --git a/includes/UserArray.php b/includes/UserArray.php
index 6cce48c0..c5ba0b2b 100644
--- a/includes/UserArray.php
+++ b/includes/UserArray.php
@@ -77,6 +77,9 @@ class UserArrayFromResult extends UserArray {
return $this->res->numRows();
}
+ /**
+ * @return User
+ */
function current() {
return $this->current;
}
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
index 63f5bf2e..5d98d9d2 100644
--- a/includes/UserMailer.php
+++ b/includes/UserMailer.php
@@ -68,7 +68,7 @@ class MailAddress {
return $this->address;
}
} else {
- return '';
+ return "";
}
}
@@ -107,6 +107,39 @@ class UserMailer {
}
/**
+ * Creates a single string from an associative array
+ *
+ * @param $headers Associative Array: keys are header field names,
+ * values are ... values.
+ * @param $endl String: The end of line character. Defaults to "\n"
+ * @return String
+ */
+ static function arrayToHeaderString( $headers, $endl = "\n" ) {
+ foreach( $headers as $name => $value ) {
+ $string[] = "$name: $value";
+ }
+ return implode( $endl, $string );
+ }
+
+ /**
+ * Create a value suitable for the MessageId Header
+ *
+ * @return String
+ */
+ static function makeMsgId() {
+ global $wgSMTP, $wgServer;
+
+ $msgid = uniqid( wfWikiID() . ".", true ); /* true required for cygwin */
+ if ( is_array($wgSMTP) && isset($wgSMTP['IDHost']) && $wgSMTP['IDHost'] ) {
+ $domain = $wgSMTP['IDHost'];
+ } else {
+ $url = wfParseUrl($wgServer);
+ $domain = $url['host'];
+ }
+ return "<$msgid@$domain>";
+ }
+
+ /**
* This function will perform a direct (authenticated) login to
* a SMTP Server to use for mail relaying if 'wgSMTP' specifies an
* array of parameters. It requires PEAR:Mail to do that.
@@ -120,7 +153,7 @@ class UserMailer {
* @param $contentType String: optional custom Content-Type (default: text/plain; charset=UTF-8)
* @return Status object
*/
- public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8') {
+ public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8' ) {
global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams;
if ( !is_array( $to ) ) {
@@ -129,7 +162,73 @@ class UserMailer {
wfDebug( __METHOD__ . ': sending mail to ' . implode( ', ', $to ) . "\n" );
+ # Make sure we have at least one address
+ $has_address = false;
+ foreach ( $to as $u ) {
+ if ( $u->address ) {
+ $has_address = true;
+ break;
+ }
+ }
+ if ( !$has_address ) {
+ return Status::newFatal( 'user-mail-no-addy' );
+ }
+
+ # Forge email headers
+ # -------------------
+ #
+ # WARNING
+ #
+ # DO NOT add To: or Subject: headers at this step. They need to be
+ # handled differently depending upon the mailer we are going to use.
+ #
+ # To:
+ # PHP mail() first argument is the mail receiver. The argument is
+ # used as a recipient destination and as a To header.
+ #
+ # PEAR mailer has a recipient argument which is only used to
+ # send the mail. If no To header is given, PEAR will set it to
+ # to 'undisclosed-recipients:'.
+ #
+ # NOTE: To: is for presentation, the actual recipient is specified
+ # by the mailer using the Rcpt-To: header.
+ #
+ # Subject:
+ # PHP mail() second argument to pass the subject, passing a Subject
+ # as an additional header will result in a duplicate header.
+ #
+ # PEAR mailer should be passed a Subject header.
+ #
+ # -- hashar 20120218
+
+ $headers['From'] = $from->toString();
+ $headers['Return-Path'] = $from->address;
+
+ if ( $replyto ) {
+ $headers['Reply-To'] = $replyto->toString();
+ }
+
+ $headers['Date'] = date( 'r' );
+ $headers['MIME-Version'] = '1.0';
+ $headers['Content-type'] = ( is_null( $contentType ) ?
+ 'text/plain; charset=UTF-8' : $contentType );
+ $headers['Content-transfer-encoding'] = '8bit';
+
+ $headers['Message-ID'] = self::makeMsgId();
+ $headers['X-Mailer'] = 'MediaWiki mailer';
+
+ $ret = wfRunHooks( 'AlternateUserMailer', array( $headers, $to, $from, $subject, $body ) );
+ if ( $ret === false ) {
+ return Status::newGood();
+ } elseif ( $ret !== true ) {
+ return Status::newFatal( 'php-mail-error', $ret );
+ }
+
if ( is_array( $wgSMTP ) ) {
+ #
+ # PEAR MAILER
+ #
+
if ( function_exists( 'stream_resolve_include_path' ) ) {
$found = stream_resolve_include_path( 'Mail.php' );
} else {
@@ -140,43 +239,6 @@ class UserMailer {
}
require_once( 'Mail.php' );
- $msgid = str_replace( " ", "_", microtime() );
- if ( function_exists( 'posix_getpid' ) ) {
- $msgid .= '.' . posix_getpid();
- }
-
- if ( is_array( $to ) ) {
- $dest = array();
- foreach ( $to as $u ) {
- $dest[] = $u->address;
- }
- } else {
- $dest = $to->address;
- }
-
- $headers['From'] = $from->toString();
- $headers['Return-Path'] = $from->address;
-
- if ( count( $to ) > 1 ) {
- $headers['To'] = 'undisclosed-recipients:;';
- }
- else {
- $headers['To'] = $to[0]->toString();
- }
-
- if ( $replyto ) {
- $headers['Reply-To'] = $replyto->toString();
- }
- $headers['Subject'] = self::quotedPrintable( $subject );
- $headers['Date'] = date( 'r' );
- $headers['MIME-Version'] = '1.0';
- $headers['Content-type'] = ( is_null( $contentType ) ?
- 'text/plain; charset=UTF-8' : $contentType );
- $headers['Content-transfer-encoding'] = '8bit';
- // @todo FIXME
- $headers['Message-ID'] = "<$msgid@" . $wgSMTP['IDHost'] . '>';
- $headers['X-Mailer'] = 'MediaWiki mailer';
-
wfSuppressWarnings();
// Create the mail object using the Mail::factory method
@@ -187,10 +249,21 @@ class UserMailer {
return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
}
- wfDebug( "Sending mail via PEAR::Mail to $dest\n" );
- $chunks = array_chunk( (array)$dest, $wgEnotifMaxRecips );
+ wfDebug( "Sending mail via PEAR::Mail\n" );
+
+ $headers['Subject'] = self::quotedPrintable( $subject );
+
+ # When sending only to one recipient, shows it its email using To:
+ if ( count( $to ) == 1 ) {
+ $headers['To'] = $to[0]->toString();
+ }
+
+ # Split jobs since SMTP servers tends to limit the maximum
+ # number of possible recipients.
+ $chunks = array_chunk( $to, $wgEnotifMaxRecips );
foreach ( $chunks as $chunk ) {
$status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
+ # FIXME : some chunks might be sent while others are not!
if ( !$status->isOK() ) {
wfRestoreWarnings();
return $status;
@@ -199,6 +272,10 @@ class UserMailer {
wfRestoreWarnings();
return Status::newGood();
} else {
+ #
+ # PHP mail()
+ #
+
# Line endings need to be different on Unix and Windows due to
# the bug described at http://trac.wordpress.org/ticket/2603
if ( wfIsWindows() ) {
@@ -208,18 +285,10 @@ class UserMailer {
$endl = "\n";
}
- $headers = array(
- "MIME-Version: 1.0",
- "Content-type: $contentType",
- "Content-Transfer-Encoding: 8bit",
- "X-Mailer: MediaWiki mailer",
- "From: " . $from->toString(),
- );
- if ( $replyto ) {
- $headers[] = "Reply-To: " . $replyto->toString();
+ if( count($to) > 1 ) {
+ $headers['To'] = 'undisclosed-recipients:;';
}
-
- $headers = implode( $endl, $headers );
+ $headers = self::arrayToHeaderString( $headers, $endl );
wfDebug( "Sending mail via internal mail() function\n" );
@@ -228,11 +297,13 @@ class UserMailer {
ini_set( 'html_errors', '0' );
set_error_handler( 'UserMailer::errorHandler' );
- if ( !is_array( $to ) ) {
- $to = array( $to );
- }
+ $safeMode = wfIniGetBool( 'safe_mode' );
foreach ( $to as $recip ) {
- $sent = mail( $recip->toString(), self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+ if ( $safeMode ) {
+ $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
+ } else {
+ $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+ }
}
restore_error_handler();
@@ -243,7 +314,7 @@ class UserMailer {
return Status::newFatal( 'php-mail-error', self::$mErrorString );
} elseif ( ! $sent ) {
// mail function only tells if there's an error
- wfDebug( "Error sending mail\n" );
+ wfDebug( "Unknown error sending mail\n" );
return Status::newFatal( 'php-mail-error-unknown' );
} else {
return Status::newGood();
@@ -321,11 +392,21 @@ class UserMailer {
*
*/
class EmailNotification {
- protected $to, $subject, $body, $replyto, $from;
- protected $user, $title, $timestamp, $summary, $minorEdit, $oldid, $composed_common, $editor;
+ protected $subject, $body, $replyto, $from;
+ protected $timestamp, $summary, $minorEdit, $oldid, $composed_common;
protected $mailTargets = array();
/**
+ * @var Title
+ */
+ protected $title;
+
+ /**
+ * @var User
+ */
+ protected $editor;
+
+ /**
* Send emails corresponding to the user $editor editing the page $title.
* Also updates wl_notificationtimestamp.
*
@@ -339,7 +420,8 @@ class EmailNotification {
* @param $oldid (default: false)
*/
public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false ) {
- global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker;
+ global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
+ $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
if ( $title->getNamespace() < 0 ) {
return;
@@ -378,21 +460,39 @@ class EmailNotification {
}
}
+ $sendEmail = true;
+ // If nobody is watching the page, and there are no users notified on all changes
+ // don't bother creating a job/trying to send emails
+ // $watchers deals with $wgEnotifWatchlist
+ if ( !count( $watchers ) && !count( $wgUsersNotifiedOnAllChanges ) ) {
+ $sendEmail = false;
+ // Only send notification for non minor edits, unless $wgEnotifMinorEdits
+ if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+ $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
+ if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
+ $sendEmail = true;
+ }
+ }
+ }
+
+ if ( !$sendEmail ) {
+ return;
+ }
if ( $wgEnotifUseJobQ ) {
$params = array(
- "editor" => $editor->getName(),
- "editorID" => $editor->getID(),
- "timestamp" => $timestamp,
- "summary" => $summary,
- "minorEdit" => $minorEdit,
- "oldid" => $oldid,
- "watchers" => $watchers );
+ 'editor' => $editor->getName(),
+ 'editorID' => $editor->getID(),
+ 'timestamp' => $timestamp,
+ 'summary' => $summary,
+ 'minorEdit' => $minorEdit,
+ 'oldid' => $oldid,
+ 'watchers' => $watchers
+ );
$job = new EnotifNotifyJob( $title, $params );
$job->insert();
} else {
$this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers );
}
-
}
/**
@@ -433,25 +533,11 @@ class EmailNotification {
$userTalkId = false;
if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
- if ( $wgEnotifUserTalk && $isUserTalkPage ) {
+
+ if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
$targetUser = User::newFromName( $title->getText() );
- if ( !$targetUser || $targetUser->isAnon() ) {
- wfDebug( __METHOD__ . ": user talk page edited, but user does not exist\n" );
- } elseif ( $targetUser->getId() == $editor->getId() ) {
- wfDebug( __METHOD__ . ": user edited their own talk page, no notification sent\n" );
- } elseif ( $targetUser->getOption( 'enotifusertalkpages' ) &&
- ( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) ) )
- {
- if ( $targetUser->isEmailConfirmed() ) {
- wfDebug( __METHOD__ . ": sending talk page update notification\n" );
- $this->compose( $targetUser );
- $userTalkId = $targetUser->getId();
- } else {
- wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
- }
- } else {
- wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
- }
+ $this->compose( $targetUser );
+ $userTalkId = $targetUser->getId();
}
if ( $wgEnotifWatchlist ) {
@@ -471,6 +557,10 @@ class EmailNotification {
global $wgUsersNotifiedOnAllChanges;
foreach ( $wgUsersNotifiedOnAllChanges as $name ) {
+ if ( $editor->getName() == $name ) {
+ // No point notifying the user that actually made the change!
+ continue;
+ }
$user = User::newFromName( $name );
$this->compose( $user );
}
@@ -480,6 +570,39 @@ class EmailNotification {
}
/**
+ * @param $editor User
+ * @param $title Title bool
+ * @param $minorEdit
+ * @return bool
+ */
+ private function canSendUserTalkEmail( $editor, $title, $minorEdit ) {
+ global $wgEnotifUserTalk;
+ $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
+
+ if ( $wgEnotifUserTalk && $isUserTalkPage ) {
+ $targetUser = User::newFromName( $title->getText() );
+
+ if ( !$targetUser || $targetUser->isAnon() ) {
+ wfDebug( __METHOD__ . ": user talk page edited, but user does not exist\n" );
+ } elseif ( $targetUser->getId() == $editor->getId() ) {
+ wfDebug( __METHOD__ . ": user edited their own talk page, no notification sent\n" );
+ } elseif ( $targetUser->getOption( 'enotifusertalkpages' ) &&
+ ( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) ) )
+ {
+ if ( $targetUser->isEmailConfirmed() ) {
+ 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" );
+ }
+ }
+ return false;
+ }
+
+ /**
* Generate the generic "this page has been changed" e-mail text.
*/
private function composeCommonMailtext() {
@@ -494,10 +617,17 @@ class EmailNotification {
# simply editing the Meta pages
$keys = array();
+ $postTransformKeys = array();
if ( $this->oldid ) {
- $difflink = $this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid );
- $keys['$NEWPAGE'] = wfMsgForContent( 'enotif_lastvisited', $difflink );
+ if ( $wgEnotifImpersonal ) {
+ // For impersonal mail, show a diff link to the last revision.
+ $keys['$NEWPAGE'] = wfMsgForContent( 'enotif_lastdiff',
+ $this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) );
+ } else {
+ $keys['$NEWPAGE'] = wfMsgForContent( 'enotif_lastvisited',
+ $this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) );
+ }
$keys['$OLDID'] = $this->oldid;
$keys['$CHANGEDORCREATED'] = wfMsgForContent( 'changed' );
} else {
@@ -510,7 +640,6 @@ class EmailNotification {
$keys['$PAGETITLE'] = $this->title->getPrefixedText();
$keys['$PAGETITLE_URL'] = $this->title->getCanonicalUrl();
$keys['$PAGEMINOREDIT'] = $this->minorEdit ? wfMsgForContent( 'minoredit' ) : '';
- $keys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
$keys['$UNWATCHURL'] = $this->title->getCanonicalUrl( 'action=unwatch' );
if ( $this->editor->isAnon() ) {
@@ -525,16 +654,20 @@ class EmailNotification {
$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
$subject = wfMsgExt( 'enotif_subject', 'content' );
$subject = strtr( $subject, $keys );
- $this->subject = MessageCache::singleton()->transform( $subject, false, null, $this->title );
+ $subject = MessageCache::singleton()->transform( $subject, false, null, $this->title );
+ $this->subject = strtr( $subject, $postTransformKeys );
$body = wfMsgExt( 'enotif_body', 'content' );
$body = strtr( $body, $keys );
$body = MessageCache::singleton()->transform( $body, false, null, $this->title );
- $this->body = wordwrap( $body, 72 );
+ $this->body = wordwrap( strtr( $body, $postTransformKeys ), 72 );
# Reveal the page editor's address as REPLY-TO address only if
# the user has not opted-out and the option is enabled at the
@@ -562,6 +695,7 @@ class EmailNotification {
* depending on settings.
*
* Call sendMails() to send any mails that were queued.
+ * @param $user User
*/
function compose( $user ) {
global $wgEnotifImpersonal;
@@ -601,22 +735,18 @@ class EmailNotification {
// Note: The to parameter cannot be an address in the form of "Something <someone@example.com>".
// The mail command will not parse this properly while talking with the MTA.
$to = new MailAddress( $watchingUser );
- $name = $wgEnotifUseRealName ? $watchingUser->getRealName() : $watchingUser->getName();
- $body = str_replace( '$WATCHINGUSERNAME', $name, $this->body );
-
- $timecorrection = $watchingUser->getOption( 'timecorrection' );
# $PAGEEDITDATE is the time and date of the page change
# expressed in terms of individual local time of the notification
# recipient, i.e. watching user
$body = str_replace(
- array( '$PAGEEDITDATEANDTIME',
+ array( '$WATCHINGUSERNAME',
'$PAGEEDITDATE',
'$PAGEEDITTIME' ),
- array( $wgContLang->timeanddate( $this->timestamp, true, false, $timecorrection ),
- $wgContLang->date( $this->timestamp, true, false, $timecorrection ),
- $wgContLang->time( $this->timestamp, true, false, $timecorrection ) ),
- $body );
+ array( $wgEnotifUseRealName ? $watchingUser->getRealName() : $watchingUser->getName(),
+ $wgContLang->userDate( $this->timestamp, $watchingUser ),
+ $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
+ $this->body );
return UserMailer::send( $to, $this->from, $this->subject, $body, $this->replyto );
}
@@ -636,8 +766,8 @@ class EmailNotification {
'$PAGEEDITDATE',
'$PAGEEDITTIME' ),
array( wfMsgForContent( 'enotif_impersonal_salutation' ),
- $wgContLang->date( $this->timestamp, true, false, false ),
- $wgContLang->time( $this->timestamp, true, false, false ) ),
+ $wgContLang->date( $this->timestamp, false, false ),
+ $wgContLang->time( $this->timestamp, false, false ) ),
$this->body );
return UserMailer::send( $addresses, $this->from, $this->subject, $body, $this->replyto );
diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php
index 6c2a5f12..dfce8adf 100644
--- a/includes/UserRightsProxy.php
+++ b/includes/UserRightsProxy.php
@@ -85,6 +85,13 @@ class UserRightsProxy {
return self::newFromLookup( $database, 'user_name', $name, $ignoreInvalidDB );
}
+ /**
+ * @param $database
+ * @param $field
+ * @param $value
+ * @param $ignoreInvalidDB bool
+ * @return null|UserRightsProxy
+ */
private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
$db = self::getDB( $database, $ignoreInvalidDB );
if( $db ) {
@@ -122,10 +129,16 @@ class UserRightsProxy {
return null;
}
+ /**
+ * @return int
+ */
public function getId() {
return $this->id;
}
+ /**
+ * @return bool
+ */
public function isAnon() {
return $this->getId() == 0;
}
@@ -187,14 +200,14 @@ class UserRightsProxy {
),
__METHOD__ );
}
-
+
/**
* Replaces User::setOption()
*/
public function setOption( $option, $value ) {
$this->newOptions[$option] = $value;
}
-
+
public function saveSettings() {
$rows = array();
foreach ( $this->newOptions as $option => $value ) {
diff --git a/includes/ViewCountUpdate.php b/includes/ViewCountUpdate.php
index 0642b630..a30b0f79 100644
--- a/includes/ViewCountUpdate.php
+++ b/includes/ViewCountUpdate.php
@@ -27,7 +27,7 @@
* 'page_counter' field or use the 'hitcounter' table and then collect the data
* from that table to update the 'page_counter' field in a batch operation.
*/
-class ViewCountUpdate {
+class ViewCountUpdate implements DeferrableUpdate {
protected $id;
/**
diff --git a/includes/WebRequest.php b/includes/WebRequest.php
index 44fe6610..39f9cb8e 100644
--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -44,6 +44,12 @@ class WebRequest {
*/
private $response;
+ /**
+ * Cached client IP address
+ * @var String
+ */
+ private $ip;
+
public function __construct() {
/// @todo FIXME: This preemptive de-quoting can interfere with other web libraries
/// and increases our memory footprint. It would be cleaner to do on
@@ -56,15 +62,19 @@ class WebRequest {
}
/**
- * Extract the PATH_INFO variable even when it isn't a reasonable
- * value. On some large webhosts, PATH_INFO includes the script
- * path as well as everything after it.
+ * Extract relevant query arguments from the http request uri's path
+ * to be merged with the normal php provided query arguments.
+ * Tries to use the REQUEST_URI data if available and parses it
+ * according to the wiki's configuration looking for any known pattern.
+ *
+ * If the REQUEST_URI is not provided we'll fall back on the PATH_INFO
+ * provided by the server if any and use that to set a 'title' parameter.
*
* @param $want string: If this is not 'all', then the function
* will return an empty array if it determines that the URL is
* inside a rewrite path.
*
- * @return Array: 'title' key is the title of the article.
+ * @return Array: Any query arguments found in path matches.
*/
static public function getPathInfo( $want = 'all' ) {
// PATH_INFO is mangled due to http://bugs.php.net/bug.php?id=31892
@@ -87,28 +97,42 @@ class WebRequest {
// Abort to keep from breaking...
return $matches;
}
+
+ $router = new PathRouter;
+
// Raw PATH_INFO style
- $matches = self::extractTitle( $path, "$wgScript/$1" );
+ $router->add( "$wgScript/$1" );
+
+ if( isset( $_SERVER['SCRIPT_NAME'] )
+ && preg_match( '/\.php5?/', $_SERVER['SCRIPT_NAME'] ) )
+ {
+ # Check for SCRIPT_NAME, we handle index.php explicitly
+ # But we do have some other .php files such as img_auth.php
+ # Don't let root article paths clober the parsing for them
+ $router->add( $_SERVER['SCRIPT_NAME'] . "/$1" );
+ }
global $wgArticlePath;
- if( !$matches && $wgArticlePath ) {
- $matches = self::extractTitle( $path, $wgArticlePath );
+ if( $wgArticlePath ) {
+ $router->add( $wgArticlePath );
}
global $wgActionPaths;
- if( !$matches && $wgActionPaths ) {
- $matches = self::extractTitle( $path, $wgActionPaths, 'action' );
+ if( $wgActionPaths ) {
+ $router->add( $wgActionPaths, array( 'action' => '$key' ) );
}
global $wgVariantArticlePath, $wgContLang;
- if( !$matches && $wgVariantArticlePath ) {
- $variantPaths = array();
- foreach( $wgContLang->getVariants() as $variant ) {
- $variantPaths[$variant] =
- str_replace( '$2', $variant, $wgVariantArticlePath );
- }
- $matches = self::extractTitle( $path, $variantPaths, 'variant' );
+ if( $wgVariantArticlePath ) {
+ $router->add( $wgVariantArticlePath,
+ array( 'variant' => '$2'),
+ array( '$2' => $wgContLang->getVariants() )
+ );
}
+
+ wfRunHooks( 'WebRequestPathInfoRouter', array( $router ) );
+
+ $matches = $router->parse( $path );
}
} elseif ( isset( $_SERVER['ORIG_PATH_INFO'] ) && $_SERVER['ORIG_PATH_INFO'] != '' ) {
// Mangled PATH_INFO
@@ -158,11 +182,17 @@ class WebRequest {
return $proto . '://' . IP::combineHostAndPort( $host, $port, $stdPort );
}
-
+
+ /**
+ * @return array
+ */
public static function detectProtocolAndStdPort() {
return ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? array( 'https', 443 ) : array( 'http', 80 );
}
-
+
+ /**
+ * @return string
+ */
public static function detectProtocol() {
list( $proto, $stdPort ) = self::detectProtocolAndStdPort();
return $proto;
@@ -192,7 +222,7 @@ class WebRequest {
}
/**
- * Internal URL rewriting function; tries to extract page title and,
+ * URL rewriting function; tries to extract page title and,
* optionally, one other fixed parameter value from a URL path.
*
* @param $path string: the URL path given from the client
@@ -201,7 +231,7 @@ class WebRequest {
* passed on as the value of this URL parameter
* @return array of URL variables to interpolate; empty if no match
*/
- private static function extractTitle( $path, $bases, $key = false ) {
+ static function extractTitle( $path, $bases, $key = false ) {
foreach( (array)$bases as $keyValue => $base ) {
// Find the part after $wgArticlePath
$base = str_replace( '$1', '', $base );
@@ -225,16 +255,24 @@ class WebRequest {
* used for undoing the evil that is magic_quotes_gpc.
*
* @param $arr array: will be modified
+ * @param $topLevel bool Specifies if the array passed is from the top
+ * level of the source. In PHP5 magic_quotes only escapes the first level
+ * of keys that belong to an array.
* @return array the original array
+ * @see http://www.php.net/manual/en/function.get-magic-quotes-gpc.php#49612
*/
- private function &fix_magic_quotes( &$arr ) {
+ private function &fix_magic_quotes( &$arr, $topLevel = true ) {
+ $clean = array();
foreach( $arr as $key => $val ) {
if( is_array( $val ) ) {
- $this->fix_magic_quotes( $arr[$key] );
+ $cleanKey = $topLevel ? stripslashes( $key ) : $key;
+ $clean[$cleanKey] = $this->fix_magic_quotes( $arr[$key], false );
} else {
- $arr[$key] = stripslashes( $val );
+ $cleanKey = stripslashes( $key );
+ $clean[$cleanKey] = stripslashes( $val );
}
}
+ $arr = $clean;
return $arr;
}
@@ -505,7 +543,7 @@ class WebRequest {
* @return Array
*/
public function getQueryValues() {
- return $_GET;
+ return $_GET;
}
/**
@@ -518,7 +556,7 @@ class WebRequest {
* @return Boolean
*/
public function wasPosted() {
- return $_SERVER['REQUEST_METHOD'] == 'POST';
+ return isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] == 'POST';
}
/**
@@ -595,7 +633,7 @@ class WebRequest {
* Return the request URI with the canonical service and hostname, path,
* and query string. This will be suitable for use as an absolute link
* in HTML or other output.
- *
+ *
* If $wgServer is protocol-relative, this will return a fully
* qualified URL with the protocol that was used for this request.
*
@@ -705,6 +743,7 @@ class WebRequest {
* @return integer
*/
public function getFileSize( $key ) {
+ wfDeprecated( __METHOD__, '1.17' );
$file = new WebRequestUpload( $this, $key );
return $file->getSize();
}
@@ -855,10 +894,8 @@ class WebRequest {
return false;
}
}
- wfHttpError( 403, 'Forbidden',
+ throw new HttpError( 403,
'Invalid file extension found in the path info or query string.' );
-
- return false;
}
return true;
}
@@ -913,8 +950,13 @@ HTML;
* if there was no dot before the question mark (bug 28235).
*
* @deprecated Use checkUrlExtension().
+ *
+ * @param $extWhitelist array
+ *
+ * @return bool
*/
public function isPathInfoBad( $extWhitelist = array() ) {
+ wfDeprecated( __METHOD__, '1.17' );
global $wgScriptExtension;
$extWhitelist[] = ltrim( $wgScriptExtension, '.' );
return IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist );
@@ -922,7 +964,7 @@ HTML;
/**
* Parse the Accept-Language header sent by the client into an array
- * @return array( languageCode => q-value ) sorted by q-value in descending order
+ * @return array array( languageCode => q-value ) sorted by q-value in descending order
* May contain the "language" '*', which applies to languages other than those explicitly listed.
* This is aligned with rfc2616 section 14.4
*/
@@ -938,7 +980,7 @@ HTML;
// Break up string into pieces (languages and q factors)
$lang_parse = null;
- preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})?|\*)\s*(;\s*q\s*=\s*(1|0(\.[0-9]+)?)?)?/',
+ preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
$acceptLang, $lang_parse );
if ( !count( $lang_parse[1] ) ) {
@@ -960,6 +1002,77 @@ HTML;
arsort( $langs, SORT_NUMERIC );
return $langs;
}
+
+ /**
+ * Fetch the raw IP from the request
+ *
+ * @since 1.19
+ *
+ * @return String
+ */
+ protected function getRawIP() {
+ if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
+ return IP::canonicalize( $_SERVER['REMOTE_ADDR'] );
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Work out the IP address based on various globals
+ * For trusted proxies, use the XFF client IP (first of the chain)
+ *
+ * @since 1.19
+ *
+ * @return string
+ */
+ public function getIP() {
+ global $wgUsePrivateIPs;
+
+ # Return cached result
+ if ( $this->ip !== null ) {
+ return $this->ip;
+ }
+
+ # collect the originating ips
+ $ip = $this->getRawIP();
+
+ # Append XFF
+ $forwardedFor = $this->getHeader( 'X-Forwarded-For' );
+ if ( $forwardedFor !== false ) {
+ $ipchain = array_map( 'trim', explode( ',', $forwardedFor ) );
+ $ipchain = array_reverse( $ipchain );
+ if ( $ip ) {
+ 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)
+ 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];
+ }
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ # Allow extensions to improve our guess
+ wfRunHooks( 'GetIP', array( &$ip ) );
+
+ if ( !$ip ) {
+ throw new MWException( "Unable to determine IP" );
+ }
+
+ wfDebug( "IP: $ip\n" );
+ $this->ip = $ip;
+ return $ip;
+ }
}
/**
@@ -1091,7 +1204,7 @@ class FauxRequest extends WebRequest {
* @param $wasPosted Bool: whether to treat the data as POST
* @param $session Mixed: session array or null
*/
- public function __construct( $data, $wasPosted = false, $session = null ) {
+ public function __construct( $data = array(), $wasPosted = false, $session = null ) {
if( is_array( $data ) ) {
$this->data = $data;
} else {
@@ -1102,19 +1215,34 @@ class FauxRequest extends WebRequest {
$this->session = $session;
}
+ /**
+ * @param $method string
+ * @throws MWException
+ */
private function notImplemented( $method ) {
throw new MWException( "{$method}() not implemented" );
}
+ /**
+ * @param $name string
+ * @param $default string
+ * @return string
+ */
public function getText( $name, $default = '' ) {
# Override; don't recode since we're using internal data
return (string)$this->getVal( $name, $default );
}
+ /**
+ * @return Array
+ */
public function getValues() {
return $this->data;
}
+ /**
+ * @return array
+ */
public function getQueryValues() {
if ( $this->wasPosted ) {
return array();
@@ -1123,6 +1251,9 @@ class FauxRequest extends WebRequest {
}
}
+ /**
+ * @return bool
+ */
public function wasPosted() {
return $this->wasPosted;
}
@@ -1135,32 +1266,114 @@ class FauxRequest extends WebRequest {
$this->notImplemented( __METHOD__ );
}
+ /**
+ * @param $name
+ * @return bool|string
+ */
public function getHeader( $name ) {
return isset( $this->headers[$name] ) ? $this->headers[$name] : false;
}
+ /**
+ * @param $name string
+ * @param $val string
+ */
public function setHeader( $name, $val ) {
$this->headers[$name] = $val;
}
+ /**
+ * @param $key
+ * @return mixed
+ */
public function getSessionData( $key ) {
if( isset( $this->session[$key] ) )
return $this->session[$key];
}
+ /**
+ * @param $key
+ * @param $data
+ */
public function setSessionData( $key, $data ) {
$this->session[$key] = $data;
}
+ /**
+ * @return array|Mixed|null
+ */
public function getSessionArray() {
return $this->session;
}
+ /**
+ * @param array $extWhitelist
+ * @return bool
+ */
public function isPathInfoBad( $extWhitelist = array() ) {
return false;
}
+ /**
+ * @param array $extWhitelist
+ * @return bool
+ */
public function checkUrlExtension( $extWhitelist = array() ) {
return true;
}
+
+ /**
+ * @return string
+ */
+ protected function getRawIP() {
+ return '127.0.0.1';
+ }
+}
+
+/**
+ * Similar to FauxRequest, but only fakes URL parameters and method
+ * (POST or GET) and use the base request for the remaining stuff
+ * (cookies, session and headers).
+ *
+ * @ingroup HTTP
+ */
+class DerivativeRequest extends FauxRequest {
+ private $base;
+
+ public function __construct( WebRequest $base, $data, $wasPosted = false ) {
+ $this->base = $base;
+ parent::__construct( $data, $wasPosted );
+ }
+
+ public function getCookie( $key, $prefix = null, $default = null ) {
+ return $this->base->getCookie( $key, $prefix, $default );
+ }
+
+ public function checkSessionCookie() {
+ return $this->base->checkSessionCookie();
+ }
+
+ public function getHeader( $name ) {
+ return $this->base->getHeader( $name );
+ }
+
+ public function getAllHeaders() {
+ return $this->base->getAllHeaders();
+ }
+
+ public function getSessionData( $key ) {
+ return $this->base->getSessionData( $key );
+ }
+
+ public function setSessionData( $key, $data ) {
+ return $this->base->setSessionData( $key, $data );
+ }
+
+ public function getAcceptLang() {
+ return $this->base->getAcceptLang();
+ }
+
+ public function getIP() {
+ return $this->base->getIP();
+ }
}
diff --git a/includes/WebResponse.php b/includes/WebResponse.php
index 1101d75d..193101b1 100644
--- a/includes/WebResponse.php
+++ b/includes/WebResponse.php
@@ -131,9 +131,14 @@ class FauxResponse extends WebResponse {
}
/**
+ * @todo document. It just ignore optional parameters.
+ *
* @param $name String: name of cookie
* @param $value String: value to give cookie
- * @param $expire Int: number of seconds til cookie expires
+ * @param $expire Int: number of seconds til cookie expires (Default: 0)
+ * @param $prefix TODO DOCUMENT (Default: null)
+ * @param $domain TODO DOCUMENT (Default: null)
+ *
*/
public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null ) {
$this->cookies[$name] = $value;
diff --git a/includes/WebStart.php b/includes/WebStart.php
index 6cfb4722..17f8216b 100644
--- a/includes/WebStart.php
+++ b/includes/WebStart.php
@@ -26,7 +26,7 @@
# Protect against register_globals
# This must be done before any globals are set by the code
if ( ini_get( 'register_globals' ) ) {
- if ( isset( $_REQUEST['GLOBALS'] ) ) {
+ if ( isset( $_REQUEST['GLOBALS'] ) || isset( $_FILES['GLOBALS'] ) ) {
die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>');
}
$verboten = array(
diff --git a/includes/Wiki.php b/includes/Wiki.php
index f535b981..6ead57c4 100644
--- a/includes/Wiki.php
+++ b/includes/Wiki.php
@@ -33,18 +33,29 @@ class MediaWiki {
*/
private $context;
- public function request( WebRequest $x = null ){
+ /**
+ * @param $x null|WebRequest
+ * @return WebRequest
+ */
+ public function request( WebRequest $x = null ) {
$old = $this->context->getRequest();
$this->context->setRequest( $x );
return $old;
}
- public function output( OutputPage $x = null ){
+ /**
+ * @param $x null|OutputPage
+ * @return OutputPage
+ */
+ public function output( OutputPage $x = null ) {
$old = $this->context->getOutput();
$this->context->setOutput( $x );
return $old;
}
+ /**
+ * @param IContextSource|null $context
+ */
public function __construct( IContextSource $context = null ) {
if ( !$context ) {
$context = RequestContext::getMain();
@@ -65,6 +76,7 @@ class MediaWiki {
$request = $this->context->getRequest();
$curid = $request->getInt( 'curid' );
$title = $request->getVal( 'title' );
+ $action = $request->getVal( 'action', 'view' );
if ( $request->getCheck( 'search' ) ) {
// Compatibility with old search URLs which didn't use Special:Search
@@ -74,7 +86,7 @@ class MediaWiki {
} elseif ( $curid ) {
// URLs like this are generated by RC, because rc_title isn't always accurate
$ret = Title::newFromID( $curid );
- } elseif ( $title == '' && $this->getAction() != 'delete' ) {
+ } elseif ( $title == '' && $action != 'delete' ) {
$ret = Title::newMainPage();
} else {
$ret = Title::newFromURL( $title );
@@ -92,7 +104,7 @@ class MediaWiki {
}
}
// For non-special titles, check for implicit titles
- if ( is_null( $ret ) || $ret->getNamespace() != NS_SPECIAL ) {
+ if ( is_null( $ret ) || !$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,7 +126,7 @@ class MediaWiki {
* Get the Title object that we'll be acting on, as specified in the WebRequest
* @return Title
*/
- public function getTitle(){
+ public function getTitle() {
if( $this->context->getTitle() === null ){
$this->context->setTitle( $this->parseTitle() );
}
@@ -146,34 +158,45 @@ class MediaWiki {
$output->setPrintable();
}
- $pageView = false; // was an article or special page viewed?
+ $unused = null; // To pass it by reference
+ wfRunHooks( 'BeforeInitialize', array( &$title, &$unused, &$output, &$user, $request, $this ) );
- wfRunHooks( 'BeforeInitialize',
- array( &$title, null, &$output, &$user, $request, $this ) );
// Invalid titles. Bug 21776: The interwikis must redirect even if the page name is empty.
if ( is_null( $title ) || ( $title->getDBkey() == '' && $title->getInterwiki() == '' ) ||
$title->isSpecial( 'Badtitle' ) )
{
$this->context->setTitle( SpecialPage::getTitleFor( 'Badtitle' ) );
- // Die now before we mess up $wgArticle and the skin stops working
- throw new ErrorPageError( 'badtitle', 'badtitletext' );
- // If the user is not logged in, the Namespace:title of the article must be in
- // the Read array in order for the user to see it. (We have to check here to
- // catch special pages etc. We check again in Article::view())
- } elseif ( !$title->userCanRead() ) {
- // Bug 32276: allowing the skin to generate output with $wgTitle
- // set to the input title would allow anonymous users to
- // determine whether a page exists, potentially leaking private data. In fact, the
- // curid and oldid request parameters would allow page titles to be enumerated even
- // when they are not guessable. So we reset the title to Special:Badtitle before the
+ wfProfileOut( __METHOD__ );
+ throw new BadTitleError();
+ }
+
+ // Check user's permissions to read this page.
+ // We have to check here to catch special pages etc.
+ // We will check again in Article::view().
+ $permErrors = $title->getUserPermissionsErrors( 'read', $user );
+ if ( count( $permErrors ) ) {
+ // Bug 32276: allowing the skin to generate output with $wgTitle or
+ // $this->context->title set to the input title would allow anonymous users to
+ // determine whether a page exists, potentially leaking private data. In fact, the
+ // curid and oldid request parameters would allow page titles to be enumerated even
+ // when they are not guessable. So we reset the title to Special:Badtitle before the
// permissions error is displayed.
- $badtitle = SpecialPage::getTitleFor( 'Badtitle' );
- $output->setTitle( $badtitle );
- $wgTitle = $badtitle;
+ //
+ // The skin mostly uses $this->context->getTitle() these days, but some extensions
+ // still use $wgTitle.
+
+ $badTitle = SpecialPage::getTitleFor( 'Badtitle' );
+ $this->context->setTitle( $badTitle );
+ $wgTitle = $badTitle;
+
+ wfProfileOut( __METHOD__ );
+ throw new PermissionsError( 'read', $permErrors );
+ }
+
+ $pageView = false; // was an article or special page viewed?
- $output->loginToUse();
// Interwiki redirects
- } elseif ( $title->getInterwiki() != '' ) {
+ if ( $title->getInterwiki() != '' ) {
$rdfrom = $request->getVal( 'rdfrom' );
if ( $rdfrom ) {
$url = $title->getFullURL( 'rdfrom=' . urlencode( $rdfrom ) );
@@ -191,7 +214,7 @@ class MediaWiki {
} else {
$this->context->setTitle( SpecialPage::getTitleFor( 'Badtitle' ) );
wfProfileOut( __METHOD__ );
- throw new ErrorPageError( 'badtitle', 'badtitletext' );
+ throw new BadTitleError();
}
// Redirect loops, no title in URL, $wgUsePathInfo URLs, and URLs with a variant
} elseif ( $request->getVal( 'action', 'view' ) == 'view' && !$request->wasPosted()
@@ -200,7 +223,7 @@ class MediaWiki {
&& !count( $request->getValueNames( array( 'action', 'title' ) ) )
&& wfRunHooks( 'TestCanonicalRedirect', array( $request, $title, $output ) ) )
{
- if ( $title->getNamespace() == NS_SPECIAL ) {
+ if ( $title->isSpecialPage() ) {
list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
if ( $name ) {
$title = SpecialPage::getTitleFor( $name, $subpage );
@@ -228,7 +251,7 @@ class MediaWiki {
"\$wgArticlePath setting and/or toggle \$wgUsePathInfo " .
"to true.";
}
- wfHttpError( 500, "Internal error", $message );
+ throw new HttpError( 500, $message );
} else {
$output->setSquidMaxage( 1200 );
$output->redirect( $targetUrl, '301' );
@@ -245,8 +268,8 @@ class MediaWiki {
if ( is_object( $article ) ) {
$pageView = true;
/**
- * $wgArticle is deprecated, do not use it. This will possibly be removed
- * entirely in 1.20 or 1.21
+ * $wgArticle is deprecated, do not use it.
+ * This will be removed entirely in 1.20.
* @deprecated since 1.18
*/
global $wgArticle;
@@ -278,39 +301,22 @@ class MediaWiki {
* @return Article object
*/
public static function articleFromTitle( $title, IContextSource $context ) {
+ wfDeprecated( __METHOD__, '1.18' );
return Article::newFromTitle( $title, $context );
}
/**
- * Returns the action that will be executed, not necessarily the one passed
- * passed through the "action" parameter. Actions disabled in
- * $wgDisabledActions will be replaced by "nosuchaction"
+ * Returns the name of the action that will be executed.
*
- * @return String: action
+ * @return string: action
*/
public function getAction() {
- global $wgDisabledActions;
-
- $request = $this->context->getRequest();
- $action = $request->getVal( 'action', 'view' );
-
- // Check for disabled actions
- if ( in_array( $action, $wgDisabledActions ) ) {
- return 'nosuchaction';
+ static $action = null;
+
+ if ( $action === null ) {
+ $action = Action::getActionName( $this->context );
}
- // Workaround for bug #20966: inability of IE to provide an action dependent
- // on which submit button is clicked.
- if ( $action === 'historysubmit' ) {
- if ( $request->getBool( 'revisiondelete' ) ) {
- return 'revisiondelete';
- } else {
- return 'view';
- }
- } elseif ( $action == 'editredlink' ) {
- return 'edit';
- }
-
return $action;
}
@@ -325,19 +331,21 @@ class MediaWiki {
wfProfileIn( __METHOD__ );
- $request = $this->context->getRequest();
$title = $this->context->getTitle();
-
- $action = $request->getVal( 'action', 'view' );
$article = Article::newFromTitle( $title, $this->context );
+ $this->context->setWikiPage( $article->getPage() );
// NS_MEDIAWIKI has no redirects.
// It is also used for CSS/JS, so performance matters here...
if ( $title->getNamespace() == NS_MEDIAWIKI ) {
wfProfileOut( __METHOD__ );
return $article;
}
+
+ $request = $this->context->getRequest();
+
// Namespace might change when using redirects
// Check for redirects ...
+ $action = $request->getVal( 'action', 'view' );
$file = ( $title->getNamespace() == NS_FILE ) ? $article->getFile() : null;
if ( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
&& !$request->getVal( 'oldid' ) && // ... and are not old revisions
@@ -372,10 +380,12 @@ class MediaWiki {
$rarticle->setRedirectedFrom( $title );
$article = $rarticle;
$this->context->setTitle( $target );
+ $this->context->setWikiPage( $article->getPage() );
}
}
} else {
$this->context->setTitle( $article->getTitle() );
+ $this->context->setWikiPage( $article->getPage() );
}
}
@@ -395,7 +405,7 @@ class MediaWiki {
// Output everything!
$this->context->getOutput()->output();
// Do any deferred jobs
- wfDoUpdates( 'commit' );
+ DeferredUpdates::doUpdates( 'commit' );
$this->doJobs();
wfProfileOut( __METHOD__ );
}
@@ -421,9 +431,9 @@ class MediaWiki {
while ( $n-- && false != ( $job = Job::pop() ) ) {
$output = $job->toString() . "\n";
- $t = -wfTime();
+ $t = - microtime( true );
$success = $job->run();
- $t += wfTime();
+ $t += microtime( true );
$t = round( $t * 1000 );
if ( !$success ) {
$output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
@@ -450,11 +460,9 @@ class MediaWiki {
/**
* Perform one of the "standard" actions
*
- * @param $article Article
+ * @param $page Page
*/
- private function performAction( Page $article ) {
- global $wgSquidMaxage, $wgUseExternalEditor;
-
+ private function performAction( Page $page ) {
wfProfileIn( __METHOD__ );
$request = $this->context->getRequest();
@@ -463,7 +471,7 @@ class MediaWiki {
$user = $this->context->getUser();
if ( !wfRunHooks( 'MediaWikiPerformAction',
- array( $output, $article, $title, $user, $request, $this ) ) )
+ array( $output, $page, $title, $user, $request, $this ) ) )
{
wfProfileOut( __METHOD__ );
return;
@@ -471,69 +479,17 @@ class MediaWiki {
$act = $this->getAction();
- $action = Action::factory( $act, $article );
+ $action = Action::factory( $act, $page );
if ( $action instanceof Action ) {
$action->show();
wfProfileOut( __METHOD__ );
return;
}
- switch( $act ) {
- case 'view':
- $output->setSquidMaxage( $wgSquidMaxage );
- $article->view();
- break;
- case 'raw': // includes JS/CSS
- wfProfileIn( __METHOD__ . '-raw' );
- $raw = new RawPage( $article );
- $raw->view();
- wfProfileOut( __METHOD__ . '-raw' );
- break;
- case 'delete':
- case 'protect':
- case 'unprotect':
- case 'render':
- $article->$act();
- break;
- case 'submit':
- if ( session_id() == '' ) {
- // Send a cookie so anons get talk message notifications
- wfSetupSession();
- }
- // Continue...
- case 'edit':
- if ( wfRunHooks( 'CustomEditor', array( $article, $user ) ) ) {
- $internal = $request->getVal( 'internaledit' );
- $external = $request->getVal( 'externaledit' );
- $section = $request->getVal( 'section' );
- $oldid = $request->getVal( 'oldid' );
- if ( !$wgUseExternalEditor || $act == 'submit' || $internal ||
- $section || $oldid ||
- ( !$user->getOption( 'externaleditor' ) && !$external ) )
- {
- $editor = new EditPage( $article );
- $editor->submit();
- } elseif ( $wgUseExternalEditor
- && ( $external || $user->getOption( 'externaleditor' ) ) )
- {
- $mode = $request->getVal( 'mode' );
- $extedit = new ExternalEdit( $article->getTitle(), $mode );
- $extedit->edit();
- }
- }
- break;
- case 'history':
- if ( $request->getFullRequestURL() == $title->getInternalURL( 'action=history' ) ) {
- $output->setSquidMaxage( $wgSquidMaxage );
- }
- $history = new HistoryPage( $article );
- $history->history();
- break;
- default:
- if ( wfRunHooks( 'UnknownAction', array( $act, $article ) ) ) {
- $output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
- }
+ if ( wfRunHooks( 'UnknownAction', array( $request->getVal( 'action', 'view' ), $page ) ) ) {
+ $output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
}
+
wfProfileOut( __METHOD__ );
}
@@ -543,7 +499,7 @@ class MediaWiki {
*/
public function run() {
try {
- $this->checkMaxLag( true );
+ $this->checkMaxLag();
$this->main();
$this->restInPeace();
} catch ( Exception $e ) {
@@ -554,38 +510,29 @@ class MediaWiki {
/**
* Checks if the request should abort due to a lagged server,
* for given maxlag parameter.
- *
- * @param boolean $abort True if this class should abort the
- * script execution. False to return the result as a boolean.
- * @return boolean True if we passed the check, false if we surpass the maxlag
+ * @return bool
*/
- private function checkMaxLag( $abort ) {
+ private function checkMaxLag() {
global $wgShowHostnames;
wfProfileIn( __METHOD__ );
$maxLag = $this->context->getRequest()->getVal( 'maxlag' );
if ( !is_null( $maxLag ) ) {
- $lb = wfGetLB(); // foo()->bar() is not supported in PHP4
- list( $host, $lag ) = $lb->getMaxLag();
+ list( $host, $lag ) = wfGetLB()->getMaxLag();
if ( $lag > $maxLag ) {
- if ( $abort ) {
- $resp = $this->context->getRequest()->response();
- $resp->header( 'HTTP/1.1 503 Service Unavailable' );
- $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
- $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
- $resp->header( 'Content-Type: text/plain' );
- if( $wgShowHostnames ) {
- echo "Waiting for $host: $lag seconds lagged\n";
- } else {
- echo "Waiting for a database server: $lag seconds lagged\n";
- }
+ $resp = $this->context->getRequest()->response();
+ $resp->header( 'HTTP/1.1 503 Service Unavailable' );
+ $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
+ $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
+ $resp->header( 'Content-Type: text/plain' );
+ if( $wgShowHostnames ) {
+ echo "Waiting for $host: $lag seconds lagged\n";
+ } else {
+ echo "Waiting for a database server: $lag seconds lagged\n";
}
wfProfileOut( __METHOD__ );
- if ( !$abort ) {
- return false;
- }
exit;
}
}
@@ -598,36 +545,42 @@ class MediaWiki {
wfProfileIn( __METHOD__ );
- # Set title from request parameters
- $wgTitle = $this->getTitle();
- $action = $this->getAction();
- $user = $this->context->getUser();
+ $request = $this->context->getRequest();
+
+ // Send Ajax requests to the Ajax dispatcher.
+ if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
+
+ // Set a dummy title, because $wgTitle == null might break things
+ $title = Title::makeTitle( NS_MAIN, 'AJAX' );
+ $this->context->setTitle( $title );
+ $wgTitle = $title;
- # Send Ajax requests to the Ajax dispatcher.
- if ( $wgUseAjax && $action == 'ajax' ) {
$dispatcher = new AjaxDispatcher();
$dispatcher->performAction();
wfProfileOut( __METHOD__ );
return;
}
- if ( $wgUseFileCache && $wgTitle->getNamespace() != NS_SPECIAL ) {
+ // Get title from request parameters,
+ // is set on the fly by parseTitle the first time.
+ $title = $this->getTitle();
+ $action = $this->getAction();
+ $wgTitle = $title;
+
+ if ( $wgUseFileCache && $title->getNamespace() >= 0 ) {
wfProfileIn( 'main-try-filecache' );
- // Raw pages should handle cache control on their own,
- // even when using file cache. This reduces hits from clients.
- if ( HTMLFileCache::useFileCache() ) {
- /* Try low-level file cache hit */
- $cache = new HTMLFileCache( $wgTitle, $action );
- if ( $cache->isFileCacheGood( /* Assume up to date */ ) ) {
- /* Check incoming headers to see if client has this cached */
- $timestamp = $cache->fileCacheTime();
+ if ( HTMLFileCache::useFileCache( $this->context ) ) {
+ // Try low-level file cache hit
+ $cache = HTMLFileCache::newFromTitle( $title, $action );
+ if ( $cache->isCacheGood( /* Assume up to date */ ) ) {
+ // Check incoming headers to see if client has this cached
+ $timestamp = $cache->cacheTimestamp();
if ( !$this->context->getOutput()->checkLastModified( $timestamp ) ) {
- $cache->loadFromFileCache();
+ $cache->loadFromFileCache( $this->context );
}
- # Do any stats increment/watchlist stuff
- $article = WikiPage::factory( $wgTitle );
- $article->doViewUpdates( $user );
- # Tell OutputPage that output is taken care of
+ // Do any stats increment/watchlist stuff
+ $this->context->getWikiPage()->doViewUpdates( $this->context->getUser() );
+ // Tell OutputPage that output is taken care of
$this->context->getOutput()->disable();
wfProfileOut( 'main-try-filecache' );
wfProfileOut( __METHOD__ );
diff --git a/includes/WikiCategoryPage.php b/includes/WikiCategoryPage.php
index 42c2a6ce..01938cd9 100644
--- a/includes/WikiCategoryPage.php
+++ b/includes/WikiCategoryPage.php
@@ -3,21 +3,13 @@
* Special handling for category pages
*/
class WikiCategoryPage extends WikiPage {
- /**
- * Constructor from a page id
- * @param $id Int article ID to load
- */
- public static function newFromID( $id ) {
- $t = Title::newFromID( $id );
- # @todo FIXME: Doesn't inherit right
- return $t == null ? null : new self( $t );
- # return $t == null ? null : new static( $t ); // PHP 5.3
- }
/**
* Don't return a 404 for categories in use.
* In use defined as: either the actual page exists
* or the category currently has members.
+ *
+ * @return bool
*/
public function hasViewableContent() {
if ( parent::hasViewableContent() ) {
diff --git a/includes/WikiError.php b/includes/WikiError.php
index a634dff6..7c167f61 100644
--- a/includes/WikiError.php
+++ b/includes/WikiError.php
@@ -35,7 +35,7 @@ class WikiError {
* @deprecated since 1.17
*/
function __construct( $message ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
$this->mMessage = $message;
}
@@ -65,7 +65,7 @@ class WikiError {
* @deprecated since 1.17
*/
public static function isError( $object ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
if ( $object instanceof WikiError ) {
return true;
} elseif ( $object instanceof Status ) {
@@ -88,7 +88,7 @@ class WikiErrorMsg extends WikiError {
* @deprecated since 1.17
*/
function __construct( $message/*, ... */ ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
$args = func_get_args();
array_shift( $args );
$this->mMessage = wfMsgReal( $message, $args, true );
@@ -120,7 +120,7 @@ class WikiXmlError extends WikiError {
* @deprecated since 1.17
*/
function __construct( $parser, $message = 'XML parsing error', $context = null, $offset = 0 ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
$this->mXmlError = xml_get_error_code( $parser );
$this->mColumn = xml_get_current_column_number( $parser );
$this->mLine = xml_get_current_line_number( $parser );
diff --git a/includes/WikiFilePage.php b/includes/WikiFilePage.php
index 6727a8cd..8aeaa243 100644
--- a/includes/WikiFilePage.php
+++ b/includes/WikiFilePage.php
@@ -5,12 +5,15 @@
* @ingroup Media
*/
class WikiFilePage extends WikiPage {
+ /**
+ * @var File
+ */
protected $mFile = false; // !< File object
protected $mRepo = null; // !<
protected $mFileLoaded = false; // !<
protected $mDupes = null; // !<
- function __construct( $title ) {
+ public function __construct( $title ) {
parent::__construct( $title );
$this->mDupes = null;
$this->mRepo = null;
@@ -22,13 +25,15 @@ class WikiFilePage extends WikiPage {
/**
* @param $file File:
- * @return void
*/
public function setFile( $file ) {
$this->mFile = $file;
$this->mFileLoaded = true;
}
+ /**
+ * @return bool
+ */
protected function loadFile() {
if ( $this->mFileLoaded ) {
return true;
@@ -43,8 +48,12 @@ class WikiFilePage extends WikiPage {
}
}
$this->mRepo = $this->mFile->getRepo();
+ return true;
}
+ /**
+ * @return mixed|null|Title
+ */
public function getRedirectTarget() {
$this->loadFile();
if ( $this->mFile->isLocal() ) {
@@ -59,6 +68,9 @@ class WikiFilePage extends WikiPage {
return $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
}
+ /**
+ * @return bool|mixed|Title
+ */
public function followRedirect() {
$this->loadFile();
if ( $this->mFile->isLocal() ) {
@@ -72,25 +84,38 @@ class WikiFilePage extends WikiPage {
return Title::makeTitle( NS_FILE, $to );
}
+ /**
+ * @param bool $text
+ * @return bool
+ */
public function isRedirect( $text = false ) {
$this->loadFile();
if ( $this->mFile->isLocal() ) {
return parent::isRedirect( $text );
}
-
+
return (bool)$this->mFile->getRedirected();
}
+ /**
+ * @return bool
+ */
public function isLocal() {
$this->loadFile();
return $this->mFile->isLocal();
}
+ /**
+ * @return bool|File
+ */
public function getFile() {
$this->loadFile();
return $this->mFile;
}
+ /**
+ * @return array|null
+ */
public function getDuplicates() {
$this->loadFile();
if ( !is_null( $this->mDupes ) ) {
@@ -104,6 +129,10 @@ class WikiFilePage extends WikiPage {
// Remove duplicates with self and non matching file sizes
$self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
$size = $this->mFile->getSize();
+
+ /**
+ * @var $file File
+ */
foreach ( $dupes as $index => $file ) {
$key = $file->getRepoName() . ':' . $file->getName();
if ( $key == $self ) {
@@ -127,13 +156,13 @@ class WikiFilePage extends WikiPage {
$update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
$update->doUpdate();
$this->mFile->upgradeRow();
- $this->mFile->purgeCache();
+ $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
} else {
wfDebug( 'ImagePage::doPurge no image for ' . $this->mFile->getName() . "; limiting purge to cache only\n" );
// even if the file supposedly doesn't exist, force any cached information
// to be updated (in case the cached information is wrong)
- $this->mFile->purgeCache();
+ $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
}
- parent::doPurge();
+ return parent::doPurge();
}
}
diff --git a/includes/WikiMap.php b/includes/WikiMap.php
index 458718ee..6c7f23b5 100644
--- a/includes/WikiMap.php
+++ b/includes/WikiMap.php
@@ -17,17 +17,18 @@ class WikiMap {
$wgConf->loadFullData();
list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
- if( isset( $major ) ) {
- $server = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
- array( 'lang' => $minor, 'site' => $major ) );
- $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
- array( 'lang' => $minor, 'site' => $major ) );
- return new WikiReference( $major, $minor, $server, $path );
- } else {
+ 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 ) );
+ $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
+ array( 'lang' => $minor, 'site' => $major ) );
+ return new WikiReference( $major, $minor, $canonicalServer, $path, $server );
}
-
+
/**
* Convenience to get the wiki's display name
*
@@ -86,11 +87,11 @@ class WikiMap {
*/
public static function getForeignURL( $wikiID, $page ) {
$wiki = WikiMap::getWiki( $wikiID );
-
+
if ( $wiki ) {
return $wiki->getUrl( $page );
}
-
+
return false;
}
}
@@ -101,21 +102,27 @@ class WikiMap {
class WikiReference {
private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
private $mMajor; ///< 'wiki', 'wiktionary', etc
- private $mServer; ///< server override, 'www.mediawiki.org'
- private $mPath; ///< path override, '/wiki/$1'
+ private $mCanonicalServer; ///< canonical server URL, e.g. 'http://www.mediawiki.org'
+ private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
+ private $mPath; ///< path, '/wiki/$1'
- public function __construct( $major, $minor, $server, $path ) {
+ public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) {
$this->mMajor = $major;
$this->mMinor = $minor;
- $this->mServer = $server;
+ $this->mCanonicalServer = $canonicalServer;
$this->mPath = $path;
+ $this->mServer = $server === null ? $canonicalServer : $server;
}
+ /**
+ * @return string
+ * @throws MWException
+ */
public function getHostname() {
$prefixes = array( 'http://', 'https://' );
foreach ( $prefixes as $prefix ) {
- if ( substr( $this->mServer, 0, strlen( $prefix ) ) ) {
- return substr( $this->mServer, strlen( $prefix ) );
+ if ( substr( $this->mCanonicalServer, 0, strlen( $prefix ) ) ) {
+ return substr( $this->mCanonicalServer, strlen( $prefix ) );
}
}
throw new MWException( "Invalid hostname for wiki {$this->mMinor}.{$this->mMajor}" );
@@ -150,12 +157,31 @@ class WikiReference {
}
/**
- * Get a URL to a page on this foreign wiki
+ * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
*
* @param $page String: page name (must be normalised before calling this function!)
* @return String: Url
*/
+ public function getCanonicalUrl( $page ) {
+ return $this->mCanonicalServer . $this->getLocalUrl( $page );
+ }
+
+ /**
+ * Alias for getCanonicalUrl(), for backwards compatibility.
+ * @return String
+ */
public function getUrl( $page ) {
+ return $this->getCanonicalUrl( $page );
+ }
+
+ /**
+ * Get a URL based on $wgServer, like Title::getFullUrl() would produce
+ * when called locally on the wiki.
+ *
+ * @param $page String: page name (must be normalized before calling this function!)
+ * @return String: URL
+ */
+ public function getFullUrl( $page ) {
return
$this->mServer .
$this->getLocalUrl( $page );
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
index ae6e4408..acc9831a 100644
--- a/includes/WikiPage.php
+++ b/includes/WikiPage.php
@@ -13,31 +13,68 @@ abstract class Page {}
* @internal documentation reviewed 15 Mar 2010
*/
class WikiPage extends Page {
+ // doDeleteArticleReal() return values. Values less than zero indicate fatal errors,
+ // values greater than zero indicate that there were problems not resulting in page
+ // not being deleted
+
+ /**
+ * Delete operation aborted by hook
+ */
+ const DELETE_HOOK_ABORTED = -1;
+
+ /**
+ * Deletion successful
+ */
+ const DELETE_SUCCESS = 0;
+
+ /**
+ * Page not found
+ */
+ const DELETE_NO_PAGE = 1;
+
+ /**
+ * No revisions found to delete
+ */
+ const DELETE_NO_REVISIONS = 2;
+
/**
* @var Title
- * @protected
*/
public $mTitle = null;
/**@{{
* @protected
*/
- public $mCounter = -1; // !< Integer (-1 means "not loaded")
public $mDataLoaded = false; // !< Boolean
public $mIsRedirect = false; // !< Boolean
- public $mLatest = false; // !< Boolean
- public $mPreparedEdit = false; // !< Array
- public $mRedirectTarget = null; // !< Title object
- public $mLastRevision = null; // !< Revision object
- public $mTimestamp = ''; // !< String
- public $mTouched = '19700101000000'; // !< String
+ public $mLatest = false; // !< Integer (false means "not loaded")
+ public $mPreparedEdit = false; // !< Array
/**@}}*/
/**
- * @protected
- * @var ParserOptions: ParserOptions object for $wgUser articles
+ * @var Title
+ */
+ protected $mRedirectTarget = null;
+
+ /**
+ * @var Revision
+ */
+ protected $mLastRevision = null;
+
+ /**
+ * @var string; timestamp of the current revision or empty string if not loaded
+ */
+ protected $mTimestamp = '';
+
+ /**
+ * @var string
+ */
+ protected $mTouched = '19700101000000';
+
+ /**
+ * @var int|null
*/
- public $mParserOptions;
+ protected $mCounter = null;
/**
* Constructor and clear the article
@@ -79,17 +116,16 @@ class WikiPage extends Page {
/**
* Constructor from a page id
*
- * Always override this for all subclasses (until we use PHP with LSB)
- *
* @param $id Int article ID to load
*
* @return WikiPage
*/
public static function newFromID( $id ) {
$t = Title::newFromID( $id );
- # @todo FIXME: Doesn't inherit right
- return $t == null ? null : new self( $t );
- # return $t == null ? null : new static( $t ); // PHP 5.3
+ if ( $t ) {
+ return self::factory( $t );
+ }
+ return null;
}
/**
@@ -98,6 +134,8 @@ class WikiPage extends Page {
* (and only when) $wgActions[$action] === true. This allows subclasses
* to override the default behavior.
*
+ * @todo: move this UI stuff somewhere else
+ *
* @return Array
*/
public function getActionOverrides() {
@@ -105,125 +143,6 @@ class WikiPage extends Page {
}
/**
- * If this page is a redirect, get its target
- *
- * The target will be fetched from the redirect table if possible.
- * If this page doesn't have an entry there, call insertRedirect()
- * @return Title|mixed object, or null if this page is not a redirect
- */
- public function getRedirectTarget() {
- if ( !$this->mTitle->isRedirect() ) {
- return null;
- }
-
- if ( $this->mRedirectTarget !== null ) {
- return $this->mRedirectTarget;
- }
-
- # Query the redirect table
- $dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow( 'redirect',
- array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
- array( 'rd_from' => $this->getId() ),
- __METHOD__
- );
-
- // rd_fragment and rd_interwiki were added later, populate them if empty
- if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
- return $this->mRedirectTarget = Title::makeTitle(
- $row->rd_namespace, $row->rd_title,
- $row->rd_fragment, $row->rd_interwiki );
- }
-
- # This page doesn't have an entry in the redirect table
- return $this->mRedirectTarget = $this->insertRedirect();
- }
-
- /**
- * Insert an entry for this page into the redirect table.
- *
- * Don't call this function directly unless you know what you're doing.
- * @return Title object or null if not a redirect
- */
- public function insertRedirect() {
- // recurse through to only get the final target
- $retval = Title::newFromRedirectRecurse( $this->getRawText() );
- if ( !$retval ) {
- return null;
- }
- $this->insertRedirectEntry( $retval );
- return $retval;
- }
-
- /**
- * Insert or update the redirect table entry for this page to indicate
- * it redirects to $rt .
- * @param $rt Title redirect target
- */
- public function insertRedirectEntry( $rt ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->replace( 'redirect', array( 'rd_from' ),
- array(
- 'rd_from' => $this->getId(),
- 'rd_namespace' => $rt->getNamespace(),
- 'rd_title' => $rt->getDBkey(),
- 'rd_fragment' => $rt->getFragment(),
- 'rd_interwiki' => $rt->getInterwiki(),
- ),
- __METHOD__
- );
- }
-
- /**
- * Get the Title object or URL this page redirects to
- *
- * @return mixed false, Title of in-wiki target, or string with URL
- */
- public function followRedirect() {
- return $this->getRedirectURL( $this->getRedirectTarget() );
- }
-
- /**
- * Get the Title object or URL to use for a redirect. We use Title
- * objects for same-wiki, non-special redirects and URLs for everything
- * else.
- * @param $rt Title Redirect target
- * @return mixed false, Title object of local target, or string with URL
- */
- public function getRedirectURL( $rt ) {
- if ( $rt ) {
- if ( $rt->getInterwiki() != '' ) {
- if ( $rt->isLocal() ) {
- // Offsite wikis need an HTTP redirect.
- //
- // 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 ) );
- }
- } else {
- if ( $rt->getNamespace() == NS_SPECIAL ) {
- // Gotta handle redirects to special pages differently:
- // Fill the HTTP response "Location" header and ignore
- // the rest of the page we're on.
- //
- // This can be hard to reverse, so they may be disabled.
- if ( $rt->isSpecial( 'Userlogout' ) ) {
- // rolleyes
- } else {
- return $rt->getFullURL();
- }
- }
-
- return $rt;
- }
- }
-
- // No or invalid redirect
- return false;
- }
-
- /**
* Get the title object of the article
* @return Title object of this page
*/
@@ -237,47 +156,17 @@ class WikiPage extends Page {
public function clear() {
$this->mDataLoaded = false;
- $this->mCounter = -1; # Not loaded
+ $this->mCounter = null;
$this->mRedirectTarget = null; # Title object if set
$this->mLastRevision = null; # Latest revision
- $this->mTimestamp = '';
$this->mTouched = '19700101000000';
+ $this->mTimestamp = '';
$this->mIsRedirect = false;
$this->mLatest = false;
$this->mPreparedEdit = false;
}
/**
- * Get the text that needs to be saved in order to undo all revisions
- * between $undo and $undoafter. Revisions must belong to the same page,
- * must exist and must not be deleted
- * @param $undo Revision
- * @param $undoafter Revision Must be an earlier revision than $undo
- * @return mixed string on success, false on failure
- */
- public function getUndoText( Revision $undo, Revision $undoafter = null ) {
- $cur_text = $this->getRawText();
- if ( $cur_text === false ) {
- return false; // no page
- }
- $undo_text = $undo->getText();
- $undoafter_text = $undoafter->getText();
-
- if ( $cur_text == $undo_text ) {
- # No use doing a merge if it's just a straight revert.
- return $undoafter_text;
- }
-
- $undone_text = '';
-
- if ( !wfMerge( $undo_text, $undoafter_text, $cur_text, $undone_text ) ) {
- return false;
- }
-
- return $undone_text;
- }
-
- /**
* Return the list of revision fields that should be selected to create
* a new page.
*
@@ -370,8 +259,7 @@ class WikiPage extends Page {
$lc = LinkCache::singleton();
if ( $data ) {
- $lc->addGoodLinkObj( $data->page_id, $this->mTitle,
- $data->page_len, $data->page_is_redirect, $data->page_latest );
+ $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
$this->mTitle->loadFromRow( $data );
@@ -402,7 +290,7 @@ class WikiPage extends Page {
* @return bool Whether or not the page exists in the database
*/
public function exists() {
- return $this->getId() > 0;
+ return $this->mTitle->exists();
}
/**
@@ -414,75 +302,21 @@ class WikiPage extends Page {
* @return bool
*/
public function hasViewableContent() {
- return $this->exists() || $this->mTitle->isAlwaysKnown();
+ return $this->mTitle->exists() || $this->mTitle->isAlwaysKnown();
}
/**
* @return int The view count for the page
*/
public function getCount() {
- if ( -1 == $this->mCounter ) {
- $id = $this->getId();
-
- if ( $id == 0 ) {
- $this->mCounter = 0;
- } else {
- $dbr = wfGetDB( DB_SLAVE );
- $this->mCounter = $dbr->selectField( 'page',
- 'page_counter',
- array( 'page_id' => $id ),
- __METHOD__
- );
- }
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
}
return $this->mCounter;
}
/**
- * Determine whether a page would be suitable for being counted as an
- * article in the site_stats table based on the title & its content
- *
- * @param $editInfo Object or false: object returned by prepareTextForEdit(),
- * if false, the current database state will be used
- * @return Boolean
- */
- public function isCountable( $editInfo = false ) {
- global $wgArticleCountMethod;
-
- if ( !$this->mTitle->isContentPage() ) {
- return false;
- }
-
- $text = $editInfo ? $editInfo->pst : false;
-
- if ( $this->isRedirect( $text ) ) {
- return false;
- }
-
- switch ( $wgArticleCountMethod ) {
- case 'any':
- return true;
- case 'comma':
- if ( $text === false ) {
- $text = $this->getRawText();
- }
- return strpos( $text, ',' ) !== false;
- case 'link':
- if ( $editInfo ) {
- // ParserOutput::getLinks() is a 2D array of page links, so
- // to be really correct we would need to recurse in the array
- // but the main array should only have items in it if there are
- // links.
- return (bool)count( $editInfo->output->getLinks() );
- } else {
- return (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
- array( 'pl_from' => $this->getId() ), __METHOD__ );
- }
- }
- }
-
- /**
* Tests if the article text represents a redirect
*
* @param $text mixed string containing article contents, or boolean
@@ -501,6 +335,39 @@ class WikiPage extends Page {
}
/**
+ * Loads page_touched and returns a value indicating if it should be used
+ * @return boolean true if not a redirect
+ */
+ public function checkTouched() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return !$this->mIsRedirect;
+ }
+
+ /**
+ * Get the page_touched field
+ * @return string containing GMT timestamp
+ */
+ public function getTouched() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mTouched;
+ }
+
+ /**
+ * Get the page_latest field
+ * @return integer rev_id of current revision
+ */
+ public function getLatest() {
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return (int)$this->mLatest;
+ }
+
+ /**
* Loads everything except the text
* This isn't necessary for all uses, so it's only done if needed.
*/
@@ -653,6 +520,194 @@ class WikiPage extends Page {
}
/**
+ * Get the cached timestamp for the last time the page changed.
+ * This is only used to help handle slave lag by comparing to page_touched.
+ * @return string MW timestamp
+ */
+ protected function getCachedLastEditTime() {
+ global $wgMemc;
+ $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+ return $wgMemc->get( $key );
+ }
+
+ /**
+ * Set the cached timestamp for the last time the page changed.
+ * This is only used to help handle slave lag by comparing to page_touched.
+ * @param $timestamp string
+ * @return void
+ */
+ public function setCachedLastEditTime( $timestamp ) {
+ global $wgMemc;
+ $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+ $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60*15 );
+ }
+
+ /**
+ * Determine whether a page would be suitable for being counted as an
+ * article in the site_stats table based on the title & its content
+ *
+ * @param $editInfo Object or false: object returned by prepareTextForEdit(),
+ * if false, the current database state will be used
+ * @return Boolean
+ */
+ public function isCountable( $editInfo = false ) {
+ global $wgArticleCountMethod;
+
+ if ( !$this->mTitle->isContentPage() ) {
+ return false;
+ }
+
+ $text = $editInfo ? $editInfo->pst : false;
+
+ if ( $this->isRedirect( $text ) ) {
+ return false;
+ }
+
+ switch ( $wgArticleCountMethod ) {
+ case 'any':
+ return true;
+ case 'comma':
+ if ( $text === false ) {
+ $text = $this->getRawText();
+ }
+ return strpos( $text, ',' ) !== false;
+ case 'link':
+ if ( $editInfo ) {
+ // ParserOutput::getLinks() is a 2D array of page links, so
+ // to be really correct we would need to recurse in the array
+ // but the main array should only have items in it if there are
+ // links.
+ return (bool)count( $editInfo->output->getLinks() );
+ } else {
+ return (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+ array( 'pl_from' => $this->getId() ), __METHOD__ );
+ }
+ }
+ }
+
+ /**
+ * If this page is a redirect, get its target
+ *
+ * The target will be fetched from the redirect table if possible.
+ * If this page doesn't have an entry there, call insertRedirect()
+ * @return Title|mixed object, or null if this page is not a redirect
+ */
+ public function getRedirectTarget() {
+ if ( !$this->mTitle->isRedirect() ) {
+ return null;
+ }
+
+ if ( $this->mRedirectTarget !== null ) {
+ return $this->mRedirectTarget;
+ }
+
+ # Query the redirect table
+ $dbr = wfGetDB( DB_SLAVE );
+ $row = $dbr->selectRow( 'redirect',
+ array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
+ array( 'rd_from' => $this->getId() ),
+ __METHOD__
+ );
+
+ // rd_fragment and rd_interwiki were added later, populate them if empty
+ if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
+ return $this->mRedirectTarget = Title::makeTitle(
+ $row->rd_namespace, $row->rd_title,
+ $row->rd_fragment, $row->rd_interwiki );
+ }
+
+ # This page doesn't have an entry in the redirect table
+ return $this->mRedirectTarget = $this->insertRedirect();
+ }
+
+ /**
+ * Insert an entry for this page into the redirect table.
+ *
+ * Don't call this function directly unless you know what you're doing.
+ * @return Title object or null if not a redirect
+ */
+ public function insertRedirect() {
+ // recurse through to only get the final target
+ $retval = Title::newFromRedirectRecurse( $this->getRawText() );
+ if ( !$retval ) {
+ return null;
+ }
+ $this->insertRedirectEntry( $retval );
+ return $retval;
+ }
+
+ /**
+ * Insert or update the redirect table entry for this page to indicate
+ * it redirects to $rt .
+ * @param $rt Title redirect target
+ */
+ public function insertRedirectEntry( $rt ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace( 'redirect', array( 'rd_from' ),
+ array(
+ 'rd_from' => $this->getId(),
+ 'rd_namespace' => $rt->getNamespace(),
+ 'rd_title' => $rt->getDBkey(),
+ 'rd_fragment' => $rt->getFragment(),
+ 'rd_interwiki' => $rt->getInterwiki(),
+ ),
+ __METHOD__
+ );
+ }
+
+ /**
+ * Get the Title object or URL this page redirects to
+ *
+ * @return mixed false, Title of in-wiki target, or string with URL
+ */
+ public function followRedirect() {
+ return $this->getRedirectURL( $this->getRedirectTarget() );
+ }
+
+ /**
+ * Get the Title object or URL to use for a redirect. We use Title
+ * objects for same-wiki, non-special redirects and URLs for everything
+ * else.
+ * @param $rt Title Redirect target
+ * @return mixed false, Title object of local target, or string with URL
+ */
+ public function getRedirectURL( $rt ) {
+ if ( !$rt ) {
+ return false;
+ }
+
+ if ( $rt->isExternal() ) {
+ if ( $rt->isLocal() ) {
+ // Offsite wikis need an HTTP redirect.
+ //
+ // 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 ) );
+ } else {
+ // External pages pages without "local" bit set are not valid
+ // redirect targets
+ return false;
+ }
+ }
+
+ if ( $rt->isSpecialPage() ) {
+ // Gotta handle redirects to special pages differently:
+ // Fill the HTTP response "Location" header and ignore
+ // the rest of the page we're on.
+ //
+ // Some pages are not valid targets
+ if ( $rt->isValidRedirectTarget() ) {
+ return $rt->getFullURL();
+ } else {
+ return false;
+ }
+ }
+
+ return $rt;
+ }
+
+ /**
* Get a list of users who have edited this article, not including the user who made
* the most recent revision, which you can get from $article->getUser() if you want it
* @return UserArrayFromResult
@@ -704,20 +759,131 @@ class WikiPage extends Page {
}
/**
+ * Get the last N authors
+ * @param $num Integer: number of revisions to get
+ * @param $revLatest String: the latest rev_id, selected from the master (optional)
+ * @return array Array of authors, duplicates not removed
+ */
+ public function getLastNAuthors( $num, $revLatest = 0 ) {
+ wfProfileIn( __METHOD__ );
+ // First try the slave
+ // If that doesn't have the latest revision, try the master
+ $continue = 2;
+ $db = wfGetDB( DB_SLAVE );
+
+ do {
+ $res = $db->select( array( 'page', 'revision' ),
+ array( 'rev_id', 'rev_user_text' ),
+ array(
+ 'page_namespace' => $this->mTitle->getNamespace(),
+ 'page_title' => $this->mTitle->getDBkey(),
+ 'rev_page = page_id'
+ ), __METHOD__,
+ array(
+ 'ORDER BY' => 'rev_timestamp DESC',
+ 'LIMIT' => $num
+ )
+ );
+
+ if ( !$res ) {
+ wfProfileOut( __METHOD__ );
+ return array();
+ }
+
+ $row = $db->fetchObject( $res );
+
+ if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
+ $db = wfGetDB( DB_MASTER );
+ $continue--;
+ } else {
+ $continue = 0;
+ }
+ } while ( $continue );
+
+ $authors = array( $row->rev_user_text );
+
+ foreach ( $res as $row ) {
+ $authors[] = $row->rev_user_text;
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $authors;
+ }
+
+ /**
* Should the parser cache be used?
*
- * @param $user User The relevant user
+ * @param $parserOptions ParserOptions to check
+ * @param $oldid int
* @return boolean
*/
- public function isParserCacheUsed( User $user, $oldid ) {
+ public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
global $wgEnableParserCache;
return $wgEnableParserCache
- && $user->getStubThreshold() == 0
- && $this->exists()
- && empty( $oldid )
- && !$this->mTitle->isCssOrJsPage()
- && !$this->mTitle->isCssJsSubpage();
+ && $parserOptions->getStubThreshold() == 0
+ && $this->mTitle->exists()
+ && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
+ && $this->mTitle->isWikitextPage();
+ }
+
+ /**
+ * Get a ParserOutput for the given ParserOptions and revision ID.
+ * 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
+ * get the current revision (default value)
+ * @return ParserOutput or false if the revision was not found
+ */
+ public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
+ wfProfileIn( __METHOD__ );
+
+ $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
+ wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+ if ( $parserOptions->getStubThreshold() ) {
+ wfIncrStats( 'pcache_miss_stub' );
+ }
+
+ if ( $useParserCache ) {
+ $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
+ if ( $parserOutput !== false ) {
+ wfProfileOut( __METHOD__ );
+ return $parserOutput;
+ }
+ }
+
+ if ( $oldid === null || $oldid === 0 ) {
+ $oldid = $this->getLatest();
+ }
+
+ $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
+ $pool->execute();
+
+ wfProfileOut( __METHOD__ );
+
+ return $pool->getParserOutput();
+ }
+
+ /**
+ * Do standard deferred updates after page view
+ * @param $user User The relevant user
+ */
+ public function doViewUpdates( User $user ) {
+ global $wgDisableCounters;
+ if ( wfReadOnly() ) {
+ return;
+ }
+
+ # Don't update page view counters on views from bot users (bug 14044)
+ if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->mTitle->exists() ) {
+ DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
+ }
+
+ # Update newtalk / watchlist notification status
+ $user->clearNotification( $this->mTitle );
}
/**
@@ -745,14 +911,15 @@ class WikiPage extends Page {
}
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- if ( $this->getId() == 0 ) {
- $text = false;
- } else {
+ if ( $this->mTitle->exists() ) {
$text = $this->getRawText();
+ } else {
+ $text = false;
}
MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
}
+ return true;
}
/**
@@ -764,7 +931,6 @@ class WikiPage extends Page {
*
* @param $dbw DatabaseBase
* @return int The newly created page_id key, or false if the title already existed
- * @private
*/
public function insertOn( $dbw ) {
wfProfileIn( __METHOD__ );
@@ -800,7 +966,7 @@ class WikiPage extends Page {
*
* @param $dbw DatabaseBase: object
* @param $revision Revision: For ID number, and text used to set
- length and redirect status fields
+ * length and redirect status fields
* @param $lastRevision Integer: if given, will not overwrite the page field
* when different from the currently set value.
* Giving 0 indicates the new page flag should be set
@@ -814,6 +980,7 @@ class WikiPage extends Page {
wfProfileIn( __METHOD__ );
$text = $revision->getText();
+ $len = strlen( $text );
$rt = Title::newFromRedirectRecurse( $text );
$conditions = array( 'page_id' => $this->getId() );
@@ -830,7 +997,7 @@ class WikiPage extends Page {
'page_touched' => $dbw->timestamp( $now ),
'page_is_new' => ( $lastRevision === 0 ) ? 1 : 0,
'page_is_redirect' => $rt !== null ? 1 : 0,
- 'page_len' => strlen( $text ),
+ 'page_len' => $len,
),
$conditions,
__METHOD__ );
@@ -838,7 +1005,12 @@ class WikiPage extends Page {
$result = $dbw->affectedRows() != 0;
if ( $result ) {
$this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
+ $this->setLastEdit( $revision );
$this->setCachedLastEditTime( $now );
+ $this->mLatest = $revision->getId();
+ $this->mIsRedirect = (bool)$rt;
+ # Update the LinkCache.
+ LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect, $this->mLatest );
}
wfProfileOut( __METHOD__ );
@@ -846,29 +1018,6 @@ class WikiPage extends Page {
}
/**
- * Get the cached timestamp for the last time the page changed.
- * This is only used to help handle slave lag by comparing to page_touched.
- * @return string MW timestamp
- */
- protected function getCachedLastEditTime() {
- global $wgMemc;
- $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
- return $wgMemc->get( $key );
- }
-
- /**
- * Set the cached timestamp for the last time the page changed.
- * This is only used to help handle slave lag by comparing to page_touched.
- * @param $timestamp string
- * @return void
- */
- public function setCachedLastEditTime( $timestamp ) {
- global $wgMemc;
- $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
- $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60*15 );
- }
-
- /**
* Add row to the redirect table if this is a redirect, remove otherwise.
*
* @param $dbw DatabaseBase
@@ -885,7 +1034,7 @@ class WikiPage extends Page {
// Delete if changing from redirect to non-redirect
$isRedirect = !is_null( $redirectTitle );
- if ( !$isRedirect && !is_null( $lastRevIsRedirect ) && $lastRevIsRedirect === $isRedirect ) {
+ if ( !$isRedirect && $lastRevIsRedirect === false ) {
return true;
}
@@ -945,40 +1094,78 @@ class WikiPage extends Page {
}
/**
+ * Get the text that needs to be saved in order to undo all revisions
+ * between $undo and $undoafter. Revisions must belong to the same page,
+ * must exist and must not be deleted
+ * @param $undo Revision
+ * @param $undoafter Revision Must be an earlier revision than $undo
+ * @return mixed string on success, false on failure
+ */
+ public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+ $cur_text = $this->getRawText();
+ if ( $cur_text === false ) {
+ return false; // no page
+ }
+ $undo_text = $undo->getText();
+ $undoafter_text = $undoafter->getText();
+
+ if ( $cur_text == $undo_text ) {
+ # No use doing a merge if it's just a straight revert.
+ return $undoafter_text;
+ }
+
+ $undone_text = '';
+
+ if ( !wfMerge( $undo_text, $undoafter_text, $cur_text, $undone_text ) ) {
+ return false;
+ }
+
+ return $undone_text;
+ }
+
+ /**
* @param $section empty/null/false or a section number (0, 1, 2, T1, T2...)
* @param $text String: new text of the section
- * @param $summary String: new section's subject, only if $section is 'new'
+ * @param $sectionTitle String: new section's subject, only if $section is 'new'
* @param $edittime String: revision timestamp or null to use the current revision
* @return string Complete article text, or null if error
*/
- public function replaceSection( $section, $text, $summary = '', $edittime = null ) {
+ public function replaceSection( $section, $text, $sectionTitle = '', $edittime = null ) {
wfProfileIn( __METHOD__ );
if ( strval( $section ) == '' ) {
// Whole-page edit; let the whole text through
} else {
- if ( is_null( $edittime ) ) {
- $rev = Revision::newFromTitle( $this->mTitle );
+ // Bug 30711: always use current version when adding a new section
+ if ( is_null( $edittime ) || $section == 'new' ) {
+ $oldtext = $this->getRawText();
+ if ( $oldtext === false ) {
+ wfDebug( __METHOD__ . ": no page text\n" );
+ wfProfileOut( __METHOD__ );
+ return null;
+ }
} else {
$dbw = wfGetDB( DB_MASTER );
$rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
- }
- if ( !$rev ) {
- wfDebug( "WikiPage::replaceSection asked for bogus section (page: " .
- $this->getId() . "; section: $section; edittime: $edittime)\n" );
- wfProfileOut( __METHOD__ );
- return null;
- }
+ if ( !$rev ) {
+ wfDebug( "WikiPage::replaceSection asked for bogus section (page: " .
+ $this->getId() . "; section: $section; edittime: $edittime)\n" );
+ wfProfileOut( __METHOD__ );
+ return null;
+ }
- $oldtext = $rev->getText();
+ $oldtext = $rev->getText();
+ }
if ( $section == 'new' ) {
# Inserting a new section
- $subject = $summary ? wfMsgForContent( 'newsectionheaderdefaultlevel', $summary ) . "\n\n" : '';
- $text = strlen( trim( $oldtext ) ) > 0
+ $subject = $sectionTitle ? wfMsgForContent( 'newsectionheaderdefaultlevel', $sectionTitle ) . "\n\n" : '';
+ if ( wfRunHooks( 'PlaceNewSection', array( $this, $oldtext, $subject, &$text ) ) ) {
+ $text = strlen( trim( $oldtext ) ) > 0
? "{$oldtext}\n\n{$subject}{$text}"
: "{$subject}{$text}";
+ }
} else {
# Replacing an existing section; roll out the big guns
global $wgParser;
@@ -1031,7 +1218,7 @@ class WikiPage extends Page {
* Fill in blank summaries with generated text where possible
*
* If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
- * If EDIT_UPDATE is specified and the article doesn't exist, the function will an
+ * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
* edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
* edit-already-exists error will be returned. These two conditions are also possible with
* auto-detection due to MediaWiki's performance-optimised locking strategy.
@@ -1091,6 +1278,8 @@ class WikiPage extends Page {
$oldtext = $this->getRawText(); // current revision
$oldsize = strlen( $oldtext );
+ $oldid = $this->getLatest();
+ $oldIsRedirect = $this->isRedirect();
$oldcountable = $this->isCountable();
# Provide autosummaries if one is not provided and autosummaries are enabled.
@@ -1110,6 +1299,15 @@ class WikiPage extends Page {
# Update article, but only if changed.
$status->value['new'] = false;
+ if ( !$oldid ) {
+ # Article gone missing
+ wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
+ $status->fatal( 'edit-gone-missing' );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
# Make sure the revision is either completely inserted or not inserted at all
if ( !$wgDBtransactions ) {
$userAbort = ignore_user_abort( true );
@@ -1120,7 +1318,7 @@ class WikiPage extends Page {
'comment' => $summary,
'minor_edit' => $isminor,
'text' => $text,
- 'parent_id' => $this->mLatest,
+ 'parent_id' => $oldid,
'user' => $user->getId(),
'user_text' => $user->getName(),
'timestamp' => $now
@@ -1129,15 +1327,6 @@ class WikiPage extends Page {
$changed = ( strcmp( $text, $oldtext ) != 0 );
if ( $changed ) {
- if ( !$this->mLatest ) {
- # Article gone missing
- wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
- $status->fatal( 'edit-gone-missing' );
-
- wfProfileOut( __METHOD__ );
- return $status;
- }
-
$dbw->begin();
$revisionId = $revision->insertOn( $dbw );
@@ -1148,7 +1337,7 @@ class WikiPage extends Page {
# edit conflicts reliably, either by $ok here, or by $article->getTimestamp()
# before this function is called. A previous function used a separate query, this
# creates a window where concurrent edits can cause an ignored edit conflict.
- $ok = $this->updateRevisionOn( $dbw, $revision, $this->mLatest );
+ $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
if ( !$ok ) {
/* Belated edit conflict! Run away!! */
@@ -1171,7 +1360,7 @@ class WikiPage extends Page {
$this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
# Add RC row to the DB
$rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
- $this->mLatest, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+ $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
$revisionId, $patrolled
);
@@ -1183,6 +1372,10 @@ class WikiPage extends Page {
$user->incEditCount();
$dbw->commit();
}
+ } else {
+ // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+ // related variables correctly
+ $revision->setId( $this->getLatest() );
}
if ( !$wgDBtransactions ) {
@@ -1202,8 +1395,6 @@ class WikiPage extends Page {
if ( !$changed ) {
$status->warning( 'edit-no-change' );
$revision = null;
- // Keep the same revision ID, but do some updates on it
- $revisionId = $this->getLatest();
// Update page_touched, this is usually implicit in the page update
// Other cache updates are done in onArticleEdit()
$this->mTitle->invalidateCache();
@@ -1238,11 +1429,6 @@ class WikiPage extends Page {
) );
$revisionId = $revision->insertOn( $dbw );
- $this->mTitle->resetArticleID( $newid );
- # Update the LinkCache. Resetting the Title ArticleID means it will rely on having that already cached
- # @todo FIXME?
- LinkCache::singleton()->addGoodLinkObj( $newid, $this->mTitle, strlen( $text ), (bool)Title::newFromRedirect( $text ), $revisionId );
-
# Update the page record with revision data
$this->updateRevisionOn( $dbw, $revision, 0 );
@@ -1276,7 +1462,7 @@ class WikiPage extends Page {
# Do updates right now unless deferral was requested
if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
- wfDoUpdates();
+ DeferredUpdates::doUpdates();
}
// Return the new revision (or null) to the caller
@@ -1293,7 +1479,210 @@ class WikiPage extends Page {
}
/**
+ * Get parser options suitable for rendering the primary article wikitext
+ * @param User|string $user User object or 'canonical'
+ * @return ParserOptions
+ */
+ public function makeParserOptions( $user ) {
+ global $wgContLang;
+ if ( $user instanceof User ) { // settings per user (even anons)
+ $options = ParserOptions::newFromUser( $user );
+ } else { // canonical settings
+ $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+ }
+ $options->enableLimitReport(); // show inclusion/loop reports
+ $options->setTidy( true ); // fix bad HTML
+ return $options;
+ }
+
+ /**
+ * Prepare text which is about to be saved.
+ * Returns a stdclass with source, pst and output members
+ */
+ public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
+ global $wgParser, $wgContLang, $wgUser;
+ $user = is_null( $user ) ? $wgUser : $user;
+ // @TODO fixme: check $user->getId() here???
+ if ( $this->mPreparedEdit
+ && $this->mPreparedEdit->newText == $text
+ && $this->mPreparedEdit->revid == $revid
+ ) {
+ // Already prepared
+ return $this->mPreparedEdit;
+ }
+
+ $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+ wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
+
+ $edit = (object)array();
+ $edit->revid = $revid;
+ $edit->newText = $text;
+ $edit->pst = $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+ $edit->popts = $this->makeParserOptions( 'canonical' );
+ $edit->output = $wgParser->parse( $edit->pst, $this->mTitle, $edit->popts, true, true, $revid );
+ $edit->oldText = $this->getRawText();
+
+ $this->mPreparedEdit = $edit;
+
+ return $edit;
+ }
+
+ /**
+ * Do standard deferred updates after page edit.
+ * Update links tables, site stats, search index and message cache.
+ * Purges pages that include this page if the text was changed here.
+ * Every 100th edit, prune the recent changes table.
+ *
+ * @private
+ * @param $revision Revision object
+ * @param $user User object that did the revision
+ * @param $options Array of options, following indexes are used:
+ * - changed: boolean, whether the revision changed the content (default true)
+ * - created: boolean, whether the revision created the page (default false)
+ * - oldcountable: boolean or null (default null):
+ * - boolean: whether the page was counted as an article before that
+ * revision, only used in changed is true and created is false
+ * - null: don't change the article count
+ */
+ public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
+ global $wgEnableParserCache;
+
+ wfProfileIn( __METHOD__ );
+
+ $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
+ $text = $revision->getText();
+
+ # Parse the text
+ # Be careful not to double-PST: $text is usually already PST-ed once
+ if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
+ wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
+ $editInfo = $this->prepareTextForEdit( $text, $revision->getId(), $user );
+ } else {
+ wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
+ $editInfo = $this->mPreparedEdit;
+ }
+
+ # Save it to the parser cache
+ if ( $wgEnableParserCache ) {
+ $parserCache = ParserCache::singleton();
+ $parserCache->save( $editInfo->output, $this, $editInfo->popts );
+ }
+
+ # Update the links tables
+ $u = new LinksUpdate( $this->mTitle, $editInfo->output );
+ $u->doUpdate();
+
+ wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
+
+ if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
+ 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 < '$cutoff'" ),
+ __METHOD__
+ );
+ }
+ }
+
+ if ( !$this->mTitle->exists() ) {
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $id = $this->getId();
+ $title = $this->mTitle->getPrefixedDBkey();
+ $shortTitle = $this->mTitle->getDBkey();
+
+ if ( !$options['changed'] ) {
+ $good = 0;
+ $total = 0;
+ } elseif ( $options['created'] ) {
+ $good = (int)$this->isCountable( $editInfo );
+ $total = 1;
+ } elseif ( $options['oldcountable'] !== null ) {
+ $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
+ $total = 0;
+ } else {
+ $good = 0;
+ $total = 0;
+ }
+
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
+ DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $text ) );
+
+ # If this is another user's talk page, update newtalk.
+ # Don't do this if $options['changed'] = false (null-edits) nor if
+ # it's a minor edit and the user doesn't want notifications for those.
+ if ( $options['changed']
+ && $this->mTitle->getNamespace() == NS_USER_TALK
+ && $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 );
+ } elseif ( $other->isLoggedIn() ) {
+ $other->setNewtalk( true );
+ } else {
+ wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+ }
+ }
+ }
+
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ MessageCache::singleton()->replace( $shortTitle, $text );
+ }
+
+ if( $options['created'] ) {
+ self::onArticleCreate( $this->mTitle );
+ } else {
+ self::onArticleEdit( $this->mTitle );
+ }
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Edit an article without doing all that other stuff
+ * The article must already exist; link tables etc
+ * are not updated, caches are not flushed.
+ *
+ * @param $text String: text submitted
+ * @param $user User The relevant user
+ * @param $comment String: comment submitted
+ * @param $minor Boolean: whereas it's a minor modification
+ */
+ public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
+ wfProfileIn( __METHOD__ );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $revision = new Revision( array(
+ 'page' => $this->getId(),
+ 'text' => $text,
+ 'comment' => $comment,
+ 'minor_edit' => $minor ? 1 : 0,
+ ) );
+ $revision->insertOn( $dbw );
+ $this->updateRevisionOn( $dbw, $revision );
+
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
* Update the article's restriction field, and leave a log entry.
+ * This works for protection both existing and non-existing pages.
*
* @param $limit Array: set of restriction keys
* @param $reason String
@@ -1302,30 +1691,16 @@ class WikiPage extends Page {
* @param $user User The user updating the restrictions
* @return bool true on success
*/
- public function updateRestrictions(
- $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
- ) {
- global $wgUser, $wgContLang;
- $user = is_null( $user ) ? $wgUser : $user;
-
- $restrictionTypes = $this->mTitle->getRestrictionTypes();
-
- $id = $this->mTitle->getArticleID();
-
- if ( $id <= 0 ) {
- wfDebug( "updateRestrictions failed: article id $id <= 0\n" );
- return false;
- }
+ public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
+ global $wgContLang;
if ( wfReadOnly() ) {
- wfDebug( "updateRestrictions failed: read-only\n" );
- return false;
+ return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
}
- if ( count( $this->mTitle->getUserPermissionsErrors( 'protect', $user ) ) ) {
- wfDebug( "updateRestrictions failed: insufficient permissions\n" );
- return false;
- }
+ $restrictionTypes = $this->mTitle->getRestrictionTypes();
+
+ $id = $this->mTitle->getArticleID();
if ( !$cascade ) {
$cascade = false;
@@ -1336,151 +1711,182 @@ class WikiPage extends Page {
# @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
# we expect a single selection, but the schema allows otherwise.
- $current = array();
- $updated = self::flattenRestrictions( $limit );
+ $isProtected = false;
+ $protect = false;
$changed = false;
+ $dbw = wfGetDB( DB_MASTER );
+
foreach ( $restrictionTypes as $action ) {
- if ( isset( $expiry[$action] ) ) {
- # Get current restrictions on $action
- $aLimits = $this->mTitle->getRestrictions( $action );
- $current[$action] = implode( '', $aLimits );
- # Are any actual restrictions being dealt with here?
- $aRChanged = count( $aLimits ) || !empty( $limit[$action] );
-
- # If something changed, we need to log it. Checking $aRChanged
- # assures that "unprotecting" a page that is not protected does
- # not log just because the expiry was "changed".
- if ( $aRChanged &&
- $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] )
- {
+ if ( !isset( $expiry[$action] ) ) {
+ $expiry[$action] = $dbw->getInfinity();
+ }
+ if ( !isset( $limit[$action] ) ) {
+ $limit[$action] = '';
+ } elseif ( $limit[$action] != '' ) {
+ $protect = true;
+ }
+
+ # Get current restrictions on $action
+ $current = implode( '', $this->mTitle->getRestrictions( $action ) );
+ if ( $current != '' ) {
+ $isProtected = true;
+ }
+
+ if ( $limit[$action] != $current ) {
+ $changed = true;
+ } elseif ( $limit[$action] != '' ) {
+ # Only check expiry change if the action is actually being
+ # protected, since expiry does nothing on an not-protected
+ # action.
+ if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
$changed = true;
}
}
}
- $current = self::flattenRestrictions( $current );
-
- $changed = ( $changed || $current != $updated );
- $changed = $changed || ( $updated && $this->mTitle->areRestrictionsCascading() != $cascade );
- $protect = ( $updated != '' );
+ if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
+ $changed = true;
+ }
# If nothing's changed, do nothing
- if ( $changed ) {
- if ( wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
- $dbw = wfGetDB( DB_MASTER );
+ if ( !$changed ) {
+ return Status::newGood();
+ }
- # Prepare a null revision to be added to the history
- $modified = $current != '' && $protect;
+ if ( !$protect ) { # No protection at all means unprotection
+ $revCommentMsg = 'unprotectedarticle';
+ $logAction = 'unprotect';
+ } elseif ( $isProtected ) {
+ $revCommentMsg = 'modifiedarticleprotection';
+ $logAction = 'modify';
+ } else {
+ $revCommentMsg = 'protectedarticle';
+ $logAction = 'protect';
+ }
- if ( $protect ) {
- $comment_type = $modified ? 'modifiedarticleprotection' : 'protectedarticle';
+ $encodedExpiry = array();
+ $protectDescription = '';
+ foreach ( $limit as $action => $restrictions ) {
+ $encodedExpiry[$action] = $dbw->encodeExpiry( $expiry[$action] );
+ if ( $restrictions != '' ) {
+ $protectDescription .= $wgContLang->getDirMark() . "[$action=$restrictions] (";
+ if ( $encodedExpiry[$action] != 'infinity' ) {
+ $protectDescription .= wfMsgForContent( 'protect-expiring',
+ $wgContLang->timeanddate( $expiry[$action], false, false ) ,
+ $wgContLang->date( $expiry[$action], false, false ) ,
+ $wgContLang->time( $expiry[$action], false, false ) );
} else {
- $comment_type = 'unprotectedarticle';
+ $protectDescription .= wfMsgForContent( 'protect-expiry-indefinite' );
}
- $comment = $wgContLang->ucfirst( wfMsgForContent( $comment_type, $this->mTitle->getPrefixedText() ) );
-
- # Only restrictions with the 'protect' right can cascade...
- # Otherwise, people who cannot normally protect can "protect" pages via transclusion
- $editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
-
- # The schema allows multiple restrictions
- if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
- $cascade = false;
- }
-
- $cascade_description = '';
+ $protectDescription .= ') ';
+ }
+ }
+ $protectDescription = trim( $protectDescription );
- if ( $cascade ) {
- $cascade_description = ' [' . wfMsgForContent( 'protect-summary-cascade' ) . ']';
- }
+ if ( $id ) { # Protection of existing page
+ if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
+ return Status::newGood();
+ }
- if ( $reason ) {
- $comment .= ": $reason";
- }
+ # Only restrictions with the 'protect' right can cascade...
+ # Otherwise, people who cannot normally protect can "protect" pages via transclusion
+ $editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
- $editComment = $comment;
- $encodedExpiry = array();
- $protect_description = '';
- foreach ( $limit as $action => $restrictions ) {
- if ( !isset( $expiry[$action] ) )
- $expiry[$action] = $dbw->getInfinity();
-
- $encodedExpiry[$action] = $dbw->encodeExpiry( $expiry[$action] );
- if ( $restrictions != '' ) {
- $protect_description .= "[$action=$restrictions] (";
- if ( $encodedExpiry[$action] != 'infinity' ) {
- $protect_description .= wfMsgForContent( 'protect-expiring',
- $wgContLang->timeanddate( $expiry[$action], false, false ) ,
- $wgContLang->date( $expiry[$action], false, false ) ,
- $wgContLang->time( $expiry[$action], false, false ) );
- } else {
- $protect_description .= wfMsgForContent( 'protect-expiry-indefinite' );
- }
+ # The schema allows multiple restrictions
+ if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
+ $cascade = false;
+ }
- $protect_description .= ') ';
- }
+ # Update restrictions table
+ foreach ( $limit as $action => $restrictions ) {
+ if ( $restrictions != '' ) {
+ $dbw->replace( 'page_restrictions', array( array( 'pr_page', 'pr_type' ) ),
+ array( 'pr_page' => $id,
+ 'pr_type' => $action,
+ 'pr_level' => $restrictions,
+ 'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
+ 'pr_expiry' => $encodedExpiry[$action]
+ ),
+ __METHOD__
+ );
+ } else {
+ $dbw->delete( 'page_restrictions', array( 'pr_page' => $id,
+ 'pr_type' => $action ), __METHOD__ );
}
- $protect_description = trim( $protect_description );
+ }
- if ( $protect_description && $protect ) {
- $editComment .= " ($protect_description)";
- }
+ # Prepare a null revision to be added to the history
+ $editComment = $wgContLang->ucfirst( wfMsgForContent( $revCommentMsg, $this->mTitle->getPrefixedText() ) );
+ if ( $reason ) {
+ $editComment .= ": $reason";
+ }
+ if ( $protectDescription ) {
+ $editComment .= " ($protectDescription)";
+ }
+ if ( $cascade ) {
+ $editComment .= ' [' . wfMsgForContent( 'protect-summary-cascade' ) . ']';
+ }
- if ( $cascade ) {
- $editComment .= "$cascade_description";
- }
+ # 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__
+ );
- # Update restrictions table
- foreach ( $limit as $action => $restrictions ) {
- if ( $restrictions != '' ) {
- $dbw->replace( 'page_restrictions', array( array( 'pr_page', 'pr_type' ) ),
- array( 'pr_page' => $id,
- 'pr_type' => $action,
- 'pr_level' => $restrictions,
- 'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
- 'pr_expiry' => $encodedExpiry[$action]
- ),
- __METHOD__
- );
- } else {
- $dbw->delete( 'page_restrictions', array( 'pr_page' => $id,
- 'pr_type' => $action ), __METHOD__ );
- }
- }
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
+ wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
+ } else { # Protection of non-existing page (also known as "title protection")
+ # Cascade protection is meaningless in this case
+ $cascade = false;
- # 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
+ if ( $limit['create'] != '' ) {
+ $dbw->replace( 'protected_titles',
+ array( array( 'pt_namespace', 'pt_title' ) ),
+ array(
+ 'pt_namespace' => $this->mTitle->getNamespace(),
+ 'pt_title' => $this->mTitle->getDBkey(),
+ 'pt_create_perm' => $limit['create'],
+ 'pt_timestamp' => $dbw->encodeExpiry( wfTimestampNow() ),
+ 'pt_expiry' => $encodedExpiry['create'],
+ 'pt_user' => $user->getId(),
+ 'pt_reason' => $reason,
+ ), __METHOD__
+ );
+ } else {
+ $dbw->delete( 'protected_titles',
+ array(
+ 'pt_namespace' => $this->mTitle->getNamespace(),
+ 'pt_title' => $this->mTitle->getDBkey()
), __METHOD__
);
+ }
+ }
- wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
- wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
+ $this->mTitle->flushRestrictions();
- # Update the protection log
- $log = new LogPage( 'protect' );
- if ( $protect ) {
- $params = array( $protect_description, $cascade ? 'cascade' : '' );
- $log->addEntry( $modified ? 'modify' : 'protect', $this->mTitle, trim( $reason ), $params );
- } else {
- $log->addEntry( 'unprotect', $this->mTitle, $reason );
- }
- } # End hook
- } # End "changed" check
+ if ( $logAction == 'unprotect' ) {
+ $logParams = array();
+ } else {
+ $logParams = array( $protectDescription, $cascade ? 'cascade' : '' );
+ }
- return true;
+ # Update the protection log
+ $log = new LogPage( 'protect' );
+ $log->addEntry( $logAction, $this->mTitle, trim( $reason ), $logParams, $user );
+
+ return Status::newGood();
}
/**
@@ -1507,83 +1913,26 @@ class WikiPage extends Page {
}
/**
- * @return bool whether or not the page surpasses $wgDeleteRevisionsLimit revisions
- */
- public function isBigDeletion() {
- global $wgDeleteRevisionsLimit;
-
- if ( $wgDeleteRevisionsLimit ) {
- $revCount = $this->estimateRevisionCount();
-
- return $revCount > $wgDeleteRevisionsLimit;
- }
-
- return false;
- }
-
- /**
- * @return int approximate revision count
- */
- public function estimateRevisionCount() {
- $dbr = wfGetDB( DB_SLAVE );
-
- // For an exact count...
- // return $dbr->selectField( 'revision', 'COUNT(*)',
- // array( 'rev_page' => $this->getId() ), __METHOD__ );
- return $dbr->estimateRowCount( 'revision', '*',
- array( 'rev_page' => $this->getId() ), __METHOD__ );
- }
-
- /**
- * Get the last N authors
- * @param $num Integer: number of revisions to get
- * @param $revLatest String: the latest rev_id, selected from the master (optional)
- * @return array Array of authors, duplicates not removed
+ * Same as doDeleteArticleReal(), but returns more detailed success/failure status
+ * Deletes the article with database consistency, writes logs, purges caches
+ *
+ * @param $reason string delete reason for deletion log
+ * @param $suppress bitfield
+ * Revision::DELETED_TEXT
+ * Revision::DELETED_COMMENT
+ * Revision::DELETED_USER
+ * Revision::DELETED_RESTRICTED
+ * @param $id int article ID
+ * @param $commit boolean defaults to true, triggers transaction end
+ * @param &$error Array of errors to append to
+ * @param $user User The deleting user
+ * @return boolean true if successful
*/
- public function getLastNAuthors( $num, $revLatest = 0 ) {
- wfProfileIn( __METHOD__ );
- // First try the slave
- // If that doesn't have the latest revision, try the master
- $continue = 2;
- $db = wfGetDB( DB_SLAVE );
-
- do {
- $res = $db->select( array( 'page', 'revision' ),
- array( 'rev_id', 'rev_user_text' ),
- array(
- 'page_namespace' => $this->mTitle->getNamespace(),
- 'page_title' => $this->mTitle->getDBkey(),
- 'rev_page = page_id'
- ), __METHOD__,
- array(
- 'ORDER BY' => 'rev_timestamp DESC',
- 'LIMIT' => $num
- )
- );
-
- if ( !$res ) {
- wfProfileOut( __METHOD__ );
- return array();
- }
-
- $row = $db->fetchObject( $res );
-
- if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
- $db = wfGetDB( DB_MASTER );
- $continue--;
- } else {
- $continue = 0;
- }
- } while ( $continue );
-
- $authors = array( $row->rev_user_text );
-
- foreach ( $res as $row ) {
- $authors[] = $row->rev_user_text;
- }
-
- wfProfileOut( __METHOD__ );
- return $authors;
+ public function doDeleteArticle(
+ $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+ ) {
+ return $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user )
+ == WikiPage::DELETE_SUCCESS;
}
/**
@@ -1591,39 +1940,36 @@ class WikiPage extends Page {
* Deletes the article with database consistency, writes logs, purges caches
*
* @param $reason string delete reason for deletion log
- * @param suppress bitfield
+ * @param $suppress bitfield
* Revision::DELETED_TEXT
* Revision::DELETED_COMMENT
* Revision::DELETED_USER
* Revision::DELETED_RESTRICTED
* @param $id int article ID
* @param $commit boolean defaults to true, triggers transaction end
- * @param &$errors Array of errors to append to
- * @param $user User The relevant user
- * @return boolean true if successful
+ * @param &$error Array of errors to append to
+ * @param $user User The deleting user
+ * @return int: One of WikiPage::DELETE_* constants
*/
- public function doDeleteArticle(
+ public function doDeleteArticleReal(
$reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
) {
- global $wgDeferredUpdateList, $wgUseTrackbacks, $wgUser;
+ global $wgUser;
$user = is_null( $user ) ? $wgUser : $user;
wfDebug( __METHOD__ . "\n" );
if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error ) ) ) {
- return false;
+ return WikiPage::DELETE_HOOK_ABORTED;
}
$dbw = wfGetDB( DB_MASTER );
$t = $this->mTitle->getDBkey();
$id = $id ? $id : $this->mTitle->getArticleID( Title::GAID_FOR_UPDATE );
if ( $t === '' || $id == 0 ) {
- return false;
+ return WikiPage::DELETE_NO_PAGE;
}
- $u = new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 );
- array_push( $wgDeferredUpdateList, $u );
-
// Bitfields to further suppress the content
if ( $suppress ) {
$bitfield = 0;
@@ -1657,30 +2003,62 @@ class WikiPage extends Page {
'ar_timestamp' => 'rev_timestamp',
'ar_minor_edit' => 'rev_minor_edit',
'ar_rev_id' => 'rev_id',
+ 'ar_parent_id' => 'rev_parent_id',
'ar_text_id' => 'rev_text_id',
'ar_text' => '\'\'', // Be explicit to appease
'ar_flags' => '\'\'', // MySQL's "strict mode"...
'ar_len' => 'rev_len',
'ar_page_id' => 'page_id',
- 'ar_deleted' => $bitfield
+ 'ar_deleted' => $bitfield,
+ 'ar_sha1' => 'rev_sha1'
), array(
'page_id' => $id,
'page_id = rev_page'
), __METHOD__
);
- # Delete restrictions for it
- $dbw->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
-
# Now that it's safely backed up, delete it
$dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
$ok = ( $dbw->affectedRows() > 0 ); // getArticleId() uses slave, could be laggy
if ( !$ok ) {
$dbw->rollback();
- return false;
+ return WikiPage::DELETE_NO_REVISIONS;
}
+ $this->doDeleteUpdates( $id );
+
+ # Log the deletion, if the page was suppressed, log it at Oversight instead
+ $logtype = $suppress ? 'suppress' : 'delete';
+
+ $logEntry = new ManualLogEntry( $logtype, 'delete' );
+ $logEntry->setPerformer( $user );
+ $logEntry->setTarget( $this->mTitle );
+ $logEntry->setComment( $reason );
+ $logid = $logEntry->insert();
+ $logEntry->publish( $logid );
+
+ if ( $commit ) {
+ $dbw->commit();
+ }
+
+ wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id ) );
+ return WikiPage::DELETE_SUCCESS;
+ }
+
+ /**
+ * Do some database updates after deletion
+ *
+ * @param $id Int: page_id value of the page being deleted
+ */
+ public function doDeleteUpdates( $id ) {
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
+
+ $dbw = wfGetDB( DB_MASTER );
+
+ # Delete restrictions for it
+ $dbw->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
+
# Fix category table counts
$cats = array();
$res = $dbw->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
@@ -1695,18 +2073,16 @@ class WikiPage extends Page {
if ( !$dbw->cascadingDeletes() ) {
$dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
- if ( $wgUseTrackbacks )
- $dbw->delete( 'trackbacks', array( 'tb_page' => $id ), __METHOD__ );
-
# Delete outgoing links
- $dbw->delete( 'pagelinks', array( 'pl_from' => $id ) );
- $dbw->delete( 'imagelinks', array( 'il_from' => $id ) );
- $dbw->delete( 'categorylinks', array( 'cl_from' => $id ) );
- $dbw->delete( 'templatelinks', array( 'tl_from' => $id ) );
- $dbw->delete( 'externallinks', array( 'el_from' => $id ) );
- $dbw->delete( 'langlinks', array( 'll_from' => $id ) );
- $dbw->delete( 'iwlinks', array( 'iwl_from' => $id ) );
- $dbw->delete( 'redirect', array( 'rd_from' => $id ) );
+ $dbw->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
+ $dbw->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
+ $dbw->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
+ $dbw->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
+ $dbw->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
+ $dbw->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
+ $dbw->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
+ $dbw->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+ $dbw->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
}
# If using cleanup triggers, we can skip some manual deletes
@@ -1727,20 +2103,6 @@ class WikiPage extends Page {
# Clear the cached article id so the interface doesn't act like we exist
$this->mTitle->resetArticleID( 0 );
-
- # Log the deletion, if the page was suppressed, log it at Oversight instead
- $logtype = $suppress ? 'suppress' : 'delete';
- $log = new LogPage( $logtype );
-
- # Make sure logging got through
- $log->addEntry( 'delete', $this->mTitle, $reason, array() );
-
- if ( $commit ) {
- $dbw->commit();
- }
-
- wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id ) );
- return true;
}
/**
@@ -1749,6 +2111,8 @@ class WikiPage extends Page {
* roll back to, e.g. user is the sole contributor. This function
* performs permissions checks on $user, then calls commitRollback()
* to do the dirty work
+ *
+ * @todo: seperate the business/permission stuff out from backend code
*
* @param $fromP String: Name of the user whose edits to rollback.
* @param $summary String: Custom summary. Set to default summary if empty.
@@ -1796,7 +2160,7 @@ class WikiPage extends Page {
* and return value documentation
*
* NOTE: This function does NOT check ANY permissions, it just commits the
- * rollback to the DB Therefore, you should only call this function direct-
+ * rollback to the DB. Therefore, you should only call this function direct-
* ly if you want to use custom permissions checks. If you don't, use
* doRollback() instead.
* @param $fromP String: Name of the user whose edits to rollback.
@@ -1816,7 +2180,7 @@ class WikiPage extends Page {
}
# Get the last editor
- $current = Revision::newFromTitle( $this->mTitle );
+ $current = $this->getRevision();
if ( is_null( $current ) ) {
# Something wrong... no page?
return array( array( 'notanarticle' ) );
@@ -1905,7 +2269,7 @@ class WikiPage extends Page {
}
# Actually store the edit
- $status = $this->doEdit( $target->getText(), $summary, $flags, $target->getId() );
+ $status = $this->doEdit( $target->getText(), $summary, $flags, $target->getId(), $guser );
if ( !empty( $status->value['revision'] ) ) {
$revId = $status->value['revision']->getId();
} else {
@@ -1925,281 +2289,6 @@ class WikiPage extends Page {
}
/**
- * Do standard deferred updates after page view
- * @param $user User The relevant user
- */
- public function doViewUpdates( User $user ) {
- global $wgDeferredUpdateList, $wgDisableCounters;
- if ( wfReadOnly() ) {
- return;
- }
-
- # Don't update page view counters on views from bot users (bug 14044)
- if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->getId() ) {
- $wgDeferredUpdateList[] = new ViewCountUpdate( $this->getId() );
- $wgDeferredUpdateList[] = new SiteStatsUpdate( 1, 0, 0 );
- }
-
- # Update newtalk / watchlist notification status
- $user->clearNotification( $this->mTitle );
- }
-
- /**
- * Prepare text which is about to be saved.
- * Returns a stdclass with source, pst and output members
- */
- public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
- global $wgParser, $wgUser;
- $user = is_null( $user ) ? $wgUser : $user;
- // @TODO fixme: check $user->getId() here???
- if ( $this->mPreparedEdit
- && $this->mPreparedEdit->newText == $text
- && $this->mPreparedEdit->revid == $revid
- ) {
- // Already prepared
- return $this->mPreparedEdit;
- }
-
- $popts = ParserOptions::newFromUser( $user );
- wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
-
- $edit = (object)array();
- $edit->revid = $revid;
- $edit->newText = $text;
- $edit->pst = $this->preSaveTransform( $text, $user, $popts );
- $edit->popts = $this->getParserOptions( true );
- $edit->output = $wgParser->parse( $edit->pst, $this->mTitle, $edit->popts, true, true, $revid );
- $edit->oldText = $this->getRawText();
-
- $this->mPreparedEdit = $edit;
-
- return $edit;
- }
-
- /**
- * Do standard deferred updates after page edit.
- * Update links tables, site stats, search index and message cache.
- * Purges pages that include this page if the text was changed here.
- * Every 100th edit, prune the recent changes table.
- *
- * @private
- * @param $revision Revision object
- * @param $user User object that did the revision
- * @param $options Array of options, following indexes are used:
- * - changed: boolean, whether the revision changed the content (default true)
- * - created: boolean, whether the revision created the page (default false)
- * - oldcountable: boolean or null (default null):
- * - boolean: whether the page was counted as an article before that
- * revision, only used in changed is true and created is false
- * - null: don't change the article count
- */
- public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
- global $wgDeferredUpdateList, $wgEnableParserCache;
-
- wfProfileIn( __METHOD__ );
-
- $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
- $text = $revision->getText();
-
- # Parse the text
- # Be careful not to double-PST: $text is usually already PST-ed once
- if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
- wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
- $editInfo = $this->prepareTextForEdit( $text, $revision->getId(), $user );
- } else {
- wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
- $editInfo = $this->mPreparedEdit;
- }
-
- # Save it to the parser cache
- if ( $wgEnableParserCache ) {
- $parserCache = ParserCache::singleton();
- $parserCache->save( $editInfo->output, $this, $editInfo->popts );
- }
-
- # Update the links tables
- $u = new LinksUpdate( $this->mTitle, $editInfo->output );
- $u->doUpdate();
-
- wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
-
- if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
- 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 < '$cutoff'" ),
- __METHOD__
- );
- }
- }
-
- $id = $this->getId();
- $title = $this->mTitle->getPrefixedDBkey();
- $shortTitle = $this->mTitle->getDBkey();
-
- if ( 0 == $id ) {
- wfProfileOut( __METHOD__ );
- return;
- }
-
- if ( !$options['changed'] ) {
- $good = 0;
- $total = 0;
- } elseif ( $options['created'] ) {
- $good = (int)$this->isCountable( $editInfo );
- $total = 1;
- } elseif ( $options['oldcountable'] !== null ) {
- $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
- $total = 0;
- } else {
- $good = 0;
- $total = 0;
- }
-
- $wgDeferredUpdateList[] = new SiteStatsUpdate( 0, 1, $good, $total );
- $wgDeferredUpdateList[] = new SearchUpdate( $id, $title, $text );
-
- # If this is another user's talk page, update newtalk.
- # Don't do this if $options['changed'] = false (null-edits) nor if
- # it's a minor edit and the user doesn't want notifications for those.
- if ( $options['changed']
- && $this->mTitle->getNamespace() == NS_USER_TALK
- && $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 );
- } elseif ( $other->isLoggedIn() ) {
- $other->setNewtalk( true );
- } else {
- wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
- }
- }
- }
-
- if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- MessageCache::singleton()->replace( $shortTitle, $text );
- }
-
- if( $options['created'] ) {
- self::onArticleCreate( $this->mTitle );
- } else {
- self::onArticleEdit( $this->mTitle );
- }
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Perform article updates on a special page creation.
- *
- * @param $rev Revision object
- *
- * @todo This is a shitty interface function. Kill it and replace the
- * other shitty functions like doEditUpdates and such so it's not needed
- * anymore.
- * @deprecated since 1.18, use doEditUpdates()
- */
- public function createUpdates( $rev ) {
- global $wgUser;
- $this->doEditUpdates( $rev, $wgUser, array( 'created' => true ) );
- }
-
- /**
- * This function is called right before saving the wikitext,
- * so we can do things like signatures and links-in-context.
- *
- * @param $text String article contents
- * @param $user User object: user doing the edit
- * @param $popts ParserOptions object: parser options, default options for
- * the user loaded if null given
- * @return string article contents with altered wikitext markup (signatures
- * converted, {{subst:}}, templates, etc.)
- */
- public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
- global $wgParser, $wgUser;
- $user = is_null( $user ) ? $wgUser : $user;
-
- if ( $popts === null ) {
- $popts = ParserOptions::newFromUser( $user );
- }
-
- return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
- }
-
- /**
- * Loads page_touched and returns a value indicating if it should be used
- * @return boolean true if not a redirect
- */
- public function checkTouched() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return !$this->mIsRedirect;
- }
-
- /**
- * Get the page_touched field
- * @return string containing GMT timestamp
- */
- public function getTouched() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return $this->mTouched;
- }
-
- /**
- * Get the page_latest field
- * @return integer rev_id of current revision
- */
- public function getLatest() {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
- return (int)$this->mLatest;
- }
-
- /**
- * Edit an article without doing all that other stuff
- * The article must already exist; link tables etc
- * are not updated, caches are not flushed.
- *
- * @param $text String: text submitted
- * @param $user User The relevant user
- * @param $comment String: comment submitted
- * @param $minor Boolean: whereas it's a minor modification
- */
- public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
- wfProfileIn( __METHOD__ );
-
- $dbw = wfGetDB( DB_MASTER );
- $revision = new Revision( array(
- 'page' => $this->getId(),
- 'text' => $text,
- 'comment' => $comment,
- 'minor_edit' => $minor ? 1 : 0,
- ) );
- $revision->insertOn( $dbw );
- $this->updateRevisionOn( $dbw, $revision );
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
* The onArticle*() functions are supposed to be a kind of hooks
* which should be called whenever any of the specified actions
* are done.
@@ -2262,7 +2351,9 @@ class WikiPage extends Page {
# User talk pages
if ( $title->getNamespace() == NS_USER_TALK ) {
$user = User::newFromName( $title->getText(), false );
- $user->setNewtalk( false );
+ if ( $user ) {
+ $user->setNewtalk( false );
+ }
}
# Image redirects
@@ -2276,13 +2367,12 @@ class WikiPage extends Page {
* @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 ) {
- global $wgDeferredUpdateList;
-
// Invalidate caches of articles which include this page
- $wgDeferredUpdateList[] = new HTMLCacheUpdate( $title, 'templatelinks' );
+ DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
+
// Invalidate the caches of all pages which redirect here
- $wgDeferredUpdateList[] = new HTMLCacheUpdate( $title, 'redirect' );
+ DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
# Purge squid for this page only
$title->purgeSquid();
@@ -2294,35 +2384,6 @@ class WikiPage extends Page {
/**#@-*/
/**
- * Return a list of templates used by this article.
- * Uses the templatelinks table
- *
- * @return Array of Title objects
- */
- public function getUsedTemplates() {
- $result = array();
- $id = $this->mTitle->getArticleID();
-
- if ( $id == 0 ) {
- return array();
- }
-
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( array( 'templatelinks' ),
- array( 'tl_namespace', 'tl_title' ),
- array( 'tl_from' => $id ),
- __METHOD__ );
-
- if ( $res !== false ) {
- foreach ( $res as $row ) {
- $result[] = Title::makeTitle( $row->tl_namespace, $row->tl_title );
- }
- }
-
- return $result;
- }
-
- /**
* Returns a list of hidden categories this page is a member of.
* Uses the page_props and categorylinks tables.
*
@@ -2417,9 +2478,8 @@ class WikiPage extends Page {
public function getAutoDeleteReason( &$hasHistory ) {
global $wgContLang;
- $dbw = wfGetDB( DB_MASTER );
// Get the last revision
- $rev = Revision::newFromTitle( $this->getTitle() );
+ $rev = $this->getRevision();
if ( is_null( $rev ) ) {
return false;
@@ -2440,6 +2500,8 @@ class WikiPage extends Page {
}
}
+ $dbw = wfGetDB( DB_MASTER );
+
// Find out if there was only one contributor
// Only scan the last 20 revisions
$res = $dbw->select( 'revision', 'rev_user_text',
@@ -2502,42 +2564,6 @@ class WikiPage extends Page {
}
/**
- * Get parser options suitable for rendering the primary article wikitext
- * @param $canonical boolean Determines that the generated options must not depend on user preferences (see bug 14404)
- * @return mixed ParserOptions object or boolean false
- */
- public function getParserOptions( $canonical = false ) {
- global $wgUser, $wgLanguageCode;
-
- if ( !$this->mParserOptions || $canonical ) {
- $user = !$canonical ? $wgUser : new User;
- $parserOptions = new ParserOptions( $user );
- $parserOptions->setTidy( true );
- $parserOptions->enableLimitReport();
-
- if ( $canonical ) {
- $parserOptions->setUserLang( $wgLanguageCode ); # Must be set explicitely
- return $parserOptions;
- }
- $this->mParserOptions = $parserOptions;
- }
- // Clone to allow modifications of the return value without affecting cache
- return clone $this->mParserOptions;
- }
-
- /**
- * Get parser options suitable for rendering the primary article wikitext
- * @param User $user
- * @return ParserOptions
- */
- public function makeParserOptions( User $user ) {
- $options = ParserOptions::newFromUser( $user );
- $options->enableLimitReport(); // show inclusion/loop reports
- $options->setTidy( true ); // fix bad HTML
- return $options;
- }
-
- /**
* Update all the appropriate counts in the category table, given that
* we've added the categories $added and deleted the categories $deleted.
*
@@ -2604,7 +2630,7 @@ class WikiPage extends Page {
* Updates cascading protections
*
* @param $parserOutput ParserOutput object for the current version
- **/
+ */
public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
return;
@@ -2651,27 +2677,305 @@ class WikiPage extends Page {
}
}
- /*
- * @deprecated since 1.18
- */
+ /**
+ * Return a list of templates used by this article.
+ * Uses the templatelinks table
+ *
+ * @deprecated in 1.19; use Title::getTemplateLinksFrom()
+ * @return Array of Title objects
+ */
+ public function getUsedTemplates() {
+ return $this->mTitle->getTemplateLinksFrom();
+ }
+
+ /**
+ * Perform article updates on a special page creation.
+ *
+ * @param $rev Revision object
+ *
+ * @todo This is a shitty interface function. Kill it and replace the
+ * other shitty functions like doEditUpdates and such so it's not needed
+ * anymore.
+ * @deprecated since 1.18, use doEditUpdates()
+ */
+ public function createUpdates( $rev ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ global $wgUser;
+ $this->doEditUpdates( $rev, $wgUser, array( 'created' => true ) );
+ }
+
+ /**
+ * This function is called right before saving the wikitext,
+ * so we can do things like signatures and links-in-context.
+ *
+ * @deprecated in 1.19; use Parser::preSaveTransform() instead
+ * @param $text String article contents
+ * @param $user User object: user doing the edit
+ * @param $popts ParserOptions object: parser options, default options for
+ * the user loaded if null given
+ * @return string article contents with altered wikitext markup (signatures
+ * converted, {{subst:}}, templates, etc.)
+ */
+ public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
+ global $wgParser, $wgUser;
+
+ wfDeprecated( __METHOD__, '1.19' );
+
+ $user = is_null( $user ) ? $wgUser : $user;
+
+ if ( $popts === null ) {
+ $popts = ParserOptions::newFromUser( $user );
+ }
+
+ return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+ }
+
+ /**
+ * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
+ *
+ * @deprecated in 1.19; use Title::isBigDeletion() instead.
+ * @return bool
+ */
+ public function isBigDeletion() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->mTitle->isBigDeletion();
+ }
+
+ /**
+ * Get the approximate revision count of this page.
+ *
+ * @deprecated in 1.19; use Title::estimateRevisionCount() instead.
+ * @return int
+ */
+ public function estimateRevisionCount() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->mTitle->estimateRevisionCount();
+ }
+
+ /**
+ * Update the article's restriction field, and leave a log entry.
+ *
+ * @deprecated since 1.19
+ * @param $limit Array: set of restriction keys
+ * @param $reason String
+ * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
+ * @param $expiry Array: per restriction type expiration
+ * @param $user User The user updating the restrictions
+ * @return bool true on success
+ */
+ public function updateRestrictions(
+ $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
+ ) {
+ global $wgUser;
+
+ $user = is_null( $user ) ? $wgUser : $user;
+
+ return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
+ }
+
+ /**
+ * @deprecated since 1.18
+ */
public function quickEdit( $text, $comment = '', $minor = 0 ) {
+ wfDeprecated( __METHOD__, '1.18' );
global $wgUser;
return $this->doQuickEdit( $text, $wgUser, $comment, $minor );
}
- /*
- * @deprecated since 1.18
- */
+ /**
+ * @deprecated since 1.18
+ */
public function viewUpdates() {
+ wfDeprecated( __METHOD__, '1.18' );
global $wgUser;
return $this->doViewUpdates( $wgUser );
}
- /*
- * @deprecated since 1.18
- */
+ /**
+ * @deprecated since 1.18
+ */
public function useParserCache( $oldid ) {
+ wfDeprecated( __METHOD__, '1.18' );
global $wgUser;
- return $this->isParserCacheUsed( $wgUser, $oldid );
+ return $this->isParserCacheUsed( ParserOptions::newFromUser( $wgUser ), $oldid );
+ }
+}
+
+class PoolWorkArticleView extends PoolCounterWork {
+
+ /**
+ * @var Page
+ */
+ private $page;
+
+ /**
+ * @var string
+ */
+ private $cacheKey;
+
+ /**
+ * @var integer
+ */
+ private $revid;
+
+ /**
+ * @var ParserOptions
+ */
+ private $parserOptions;
+
+ /**
+ * @var string|null
+ */
+ private $text;
+
+ /**
+ * @var ParserOutput|false
+ */
+ private $parserOutput = false;
+
+ /**
+ * @var bool
+ */
+ private $isDirty = false;
+
+ /**
+ * @var Status|false
+ */
+ private $error = false;
+
+ /**
+ * Constructor
+ *
+ * @param $page Page
+ * @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
+ * @param $text String: text to parse or null to load it
+ */
+ function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $text = null ) {
+ $this->page = $page;
+ $this->revid = $revid;
+ $this->cacheable = $useParserCache;
+ $this->parserOptions = $parserOptions;
+ $this->text = $text;
+ $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
+ parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
+ }
+
+ /**
+ * Get the ParserOutput from this object, or false in case of failure
+ *
+ * @return ParserOutput
+ */
+ public function getParserOutput() {
+ return $this->parserOutput;
+ }
+
+ /**
+ * Get whether the ParserOutput is a dirty one (i.e. expired)
+ *
+ * @return bool
+ */
+ public function getIsDirty() {
+ return $this->isDirty;
+ }
+
+ /**
+ * Get a Status object in case of error or false otherwise
+ *
+ * @return Status|false
+ */
+ public function getError() {
+ return $this->error;
+ }
+
+ /**
+ * @return bool
+ */
+ function doWork() {
+ global $wgParser, $wgUseFileCache;
+
+ $isCurrent = $this->revid === $this->page->getLatest();
+
+ if ( $this->text !== null ) {
+ $text = $this->text;
+ } elseif ( $isCurrent ) {
+ $text = $this->page->getRawText();
+ } else {
+ $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+ if ( $rev === null ) {
+ return false;
+ }
+ $text = $rev->getText();
+ }
+
+ $time = - microtime( true );
+ $this->parserOutput = $wgParser->parse( $text, $this->page->getTitle(),
+ $this->parserOptions, true, true, $this->revid );
+ $time += microtime( true );
+
+ # Timing hack
+ if ( $time > 3 ) {
+ wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
+ $this->page->getTitle()->getPrefixedDBkey() ) );
+ }
+
+ if ( $this->cacheable && $this->parserOutput->isCacheable() ) {
+ ParserCache::singleton()->save( $this->parserOutput, $this->page, $this->parserOptions );
+ }
+
+ // Make sure file cache is not used on uncacheable content.
+ // Output that has magic words in it can still use the parser cache
+ // (if enabled), though it will generally expire sooner.
+ if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
+ $wgUseFileCache = false;
+ }
+
+ if ( $isCurrent ) {
+ $this->page->doCascadeProtectionUpdates( $this->parserOutput );
+ }
+
+ return true;
+ }
+
+ /**
+ * @return bool
+ */
+ function getCachedWork() {
+ $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
+
+ if ( $this->parserOutput === false ) {
+ wfDebug( __METHOD__ . ": parser cache miss\n" );
+ return false;
+ } else {
+ wfDebug( __METHOD__ . ": parser cache hit\n" );
+ return true;
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ function fallback() {
+ $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
+
+ if ( $this->parserOutput === false ) {
+ wfDebugLog( 'dirty', "dirty missing\n" );
+ wfDebug( __METHOD__ . ": no dirty cache\n" );
+ return false;
+ } else {
+ wfDebug( __METHOD__ . ": sending dirty output\n" );
+ wfDebugLog( 'dirty', "dirty output {$this->cacheKey}\n" );
+ $this->isDirty = true;
+ return true;
+ }
+ }
+
+ /**
+ * @param $status Status
+ */
+ function error( $status ) {
+ $this->error = $status;
+ return false;
}
}
diff --git a/includes/Xml.php b/includes/Xml.php
index 45ee8720..7e5b3cdb 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -117,42 +117,19 @@ class Xml {
* @param $element_name String: value of the "name" attribute of the select tag
* @param $label String: optional label to add to the field
* @return string
+ * @deprecated since 1.19
*/
public static function namespaceSelector( $selected = '', $all = null, $element_name = 'namespace', $label = null ) {
- global $wgContLang;
- $namespaces = $wgContLang->getFormattedNamespaces();
- $options = array();
-
- // Godawful hack... we'll be frequently passed selected namespaces
- // as strings since PHP is such a shithole.
- // But we also don't want blanks and nulls and "all"s matching 0,
- // so let's convert *just* string ints to clean ints.
- if( preg_match( '/^\d+$/', $selected ) ) {
- $selected = intval( $selected );
- }
-
- if( !is_null( $all ) )
- $namespaces = array( $all => wfMsg( 'namespacesall' ) ) + $namespaces;
- foreach( $namespaces as $index => $name ) {
- if( $index < NS_MAIN ) {
- continue;
- }
- if( $index === 0 ) {
- $name = wfMsg( 'blanknamespace' );
- }
- $options[] = self::option( $name, $index, $index === $selected );
- }
-
- $ret = Xml::openElement( 'select', array( 'id' => 'namespace', 'name' => $element_name,
- 'class' => 'namespaceselector' ) )
- . "\n"
- . implode( "\n", $options )
- . "\n"
- . Xml::closeElement( 'select' );
- if ( !is_null( $label ) ) {
- $ret = Xml::label( $label, $element_name ) . '&#160;' . $ret;
- }
- return $ret;
+ wfDeprecated( __METHOD__, '1.19' );
+ return Html::namespaceSelector( array(
+ 'selected' => $selected,
+ 'all' => $all,
+ 'label' => $label,
+ ), array(
+ 'name' => $element_name,
+ 'id' => 'namespace',
+ 'class' => 'namespaceselector',
+ ) );
}
/**
@@ -208,21 +185,39 @@ class Xml {
}
/**
- *
- * @param $selected string The language code of the selected language
- * @param $customisedOnly bool If true only languages which have some content are listed
- * @return array of label and select
+ * Construct a language selector appropriate for use in a form or preferences
+ *
+ * @param string $selected The language code of the selected language
+ * @param boolean $customisedOnly If true only languages which have some content are listed
+ * @param string $language The ISO code of the language to display the select list in (optional)
+ * @return array containing 2 items: label HTML and select list HTML
*/
- public static function languageSelector( $selected, $customisedOnly = true ) {
+ public static function languageSelector( $selected, $customisedOnly = true, $language = null ) {
global $wgLanguageCode;
- /**
- * Make sure the site language is in the list; a custom language code
- * might not have a defined name...
- */
- $languages = Language::getLanguageNames( $customisedOnly );
+
+ // If a specific language was requested and CLDR is installed, use it
+ if ( $language && is_callable( array( 'LanguageNames', 'getNames' ) ) ) {
+ if ( $customisedOnly ) {
+ $listType = LanguageNames::LIST_MW_SUPPORTED; // Only pull names that have localisation in MediaWiki
+ } else {
+ $listType = LanguageNames::LIST_MW; // Pull all languages that are in Names.php
+ }
+ // Retrieve the list of languages in the requested language (via CLDR)
+ $languages = LanguageNames::getNames(
+ $language, // Code of the requested language
+ LanguageNames::FALLBACK_NORMAL, // Use fallback chain
+ $listType
+ );
+ } else {
+ $languages = Language::getLanguageNames( $customisedOnly );
+ }
+
+ // 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 ) ) {
$languages[$wgLanguageCode] = $wgLanguageCode;
}
+
ksort( $languages );
/**
@@ -334,10 +329,10 @@ class Xml {
/**
* Convenience function to build an HTML radio button
- * @param $name value of the name attribute
- * @param $value value of the value attribute
- * @param $checked Whether the checkbox is checked or not
- * @param $attribs other attributes
+ * @param $name String value of the name attribute
+ * @param $value String value of the value attribute
+ * @param $checked Bool Whether the checkbox is checked or not
+ * @param $attribs Array other attributes
* @return string HTML
*/
public static function radio( $name, $value, $checked = false, $attribs = array() ) {
@@ -360,7 +355,7 @@ class Xml {
public static function label( $label, $id, $attribs = array() ) {
$a = array( 'for' => $id );
- # FIXME avoid copy pasting below:
+ # FIXME avoid copy pasting below:
if( isset( $attribs['class'] ) ){
$a['class'] = $attribs['class'];
}
@@ -376,8 +371,8 @@ class Xml {
* @param $label String text of the label
* @param $name String value of the name attribute
* @param $id String id of the input
- * @param $size int value of the size attribute
- * @param $value value of the value attribute
+ * @param $size Int|Bool value of the size attribute
+ * @param $value String|Bool value of the value attribute
* @param $attribs array other attributes
* @return string HTML
*/
@@ -389,11 +384,11 @@ class Xml {
/**
* Same as Xml::inputLabel() but return input and label in an array
*
- * @param $label
- * @param $name
- * @param $id
- * @param $size
- * @param $value
+ * @param $label String
+ * @param $name String
+ * @param $id String
+ * @param $size Int|Bool
+ * @param $value String|Bool
* @param $attribs array
*
* @return array
@@ -466,7 +461,7 @@ class Xml {
if( $selected ) {
$attribs['selected'] = 'selected';
}
- return self::element( 'option', $attribs, $text );
+ return Html::element( 'option', $attribs, $text );
}
/**
@@ -506,19 +501,24 @@ class Xml {
$optgroup = false;
}
}
+
if( $optgroup ) $options .= self::closeElement('optgroup');
$attribs = array();
+
if( $name ) {
$attribs['id'] = $name;
$attribs['name'] = $name;
}
+
if( $class ) {
$attribs['class'] = $class;
}
+
if( $tabindex ) {
$attribs['tabindex'] = $tabindex;
}
+
return Xml::openElement( 'select', $attribs )
. "\n"
. $options
@@ -537,9 +537,11 @@ class Xml {
*/
public static function fieldset( $legend = false, $content = false, $attribs = array() ) {
$s = Xml::openElement( 'fieldset', $attribs ) . "\n";
+
if ( $legend ) {
$s .= Xml::element( 'legend', null, $legend ) . "\n";
}
+
if ( $content !== false ) {
$s .= $content . "\n";
$s .= Xml::closeElement( 'fieldset' ) . "\n";
@@ -600,6 +602,7 @@ class Xml {
"\xe2\x80\x8c" => "\\u200c", // ZERO WIDTH NON-JOINER
"\xe2\x80\x8d" => "\\u200d", // ZERO WIDTH JOINER
);
+
return strtr( $string, $pairs );
}
@@ -627,7 +630,7 @@ class Xml {
$s = '[';
foreach ( $value as $elt ) {
if ( $s != '[' ) {
- $s .= ', ';
+ $s .= ',';
}
$s .= self::encodeJsVar( $elt );
}
@@ -639,9 +642,10 @@ class Xml {
$s = '{';
foreach ( (array)$value as $name => $elt ) {
if ( $s != '{' ) {
- $s .= ', ';
+ $s .= ',';
}
- $s .= '"' . self::escapeJsString( $name ) . '": ' .
+
+ $s .= '"' . self::escapeJsString( $name ) . '":' .
self::encodeJsVar( $elt );
}
$s .= '}';
@@ -666,19 +670,22 @@ class Xml {
public static function encodeJsCall( $name, $args ) {
$s = "$name(";
$first = true;
+
foreach ( $args as $arg ) {
if ( $first ) {
$first = false;
} else {
$s .= ', ';
}
+
$s .= Xml::encodeJsVar( $arg );
}
+
$s .= ");\n";
+
return $s;
}
-
/**
* Check if a string is well-formed XML.
* Must include the surrounding tag.
@@ -702,7 +709,9 @@ class Xml {
xml_parser_free( $parser );
return false;
}
+
xml_parser_free( $parser );
+
return true;
}
@@ -720,6 +729,7 @@ class Xml {
'<html>' .
$text .
'</html>';
+
return Xml::isWellFormed( $html );
}
@@ -765,7 +775,6 @@ class Xml {
$form .= "</tbody></table>";
-
return $form;
}
@@ -778,36 +787,59 @@ class Xml {
*/
public static function buildTable( $rows, $attribs = array(), $headers = null ) {
$s = Xml::openElement( 'table', $attribs );
+
if ( is_array( $headers ) ) {
+ $s .= Xml::openElement( 'thead', $attribs );
+
foreach( $headers as $id => $header ) {
$attribs = array();
- if ( is_string( $id ) ) $attribs['id'] = $id;
+
+ if ( is_string( $id ) ) {
+ $attribs['id'] = $id;
+ }
+
$s .= Xml::element( 'th', $attribs, $header );
}
+ $s .= Xml::closeElement( 'thead' );
}
+
foreach( $rows as $id => $row ) {
$attribs = array();
- if ( is_string( $id ) ) $attribs['id'] = $id;
+
+ if ( is_string( $id ) ) {
+ $attribs['id'] = $id;
+ }
+
$s .= Xml::buildTableRow( $attribs, $row );
}
+
$s .= Xml::closeElement( 'table' );
+
return $s;
}
/**
* Build a row for a table
- * @param $attribs An array of attributes to apply to the tr tag
- * @param $cells An array of strings to put in <td>
+ * @param $attribs array An array of attributes to apply to the tr tag
+ * @param $cells array An array of strings to put in <td>
* @return string
*/
public static function buildTableRow( $attribs, $cells ) {
$s = Xml::openElement( 'tr', $attribs );
+
foreach( $cells as $id => $cell ) {
+
$attribs = array();
- if ( is_string( $id ) ) $attribs['id'] = $id;
+
+ if ( is_string( $id ) ) {
+ $attribs['id'] = $id;
+ }
+
$s .= Xml::element( 'td', $attribs, $cell );
}
+
$s .= Xml::closeElement( 'tr' );
+
return $s;
}
}
@@ -821,9 +853,11 @@ class XmlSelect {
if ( $name ) {
$this->setAttribute( 'name', $name );
}
+
if ( $id ) {
$this->setAttribute( 'id', $id );
}
+
if ( $default !== false ) {
$this->default = $default;
}
@@ -849,7 +883,7 @@ class XmlSelect {
* @return array|null
*/
public function getAttribute( $name ) {
- if ( isset($this->attributes[$name]) ) {
+ if ( isset( $this->attributes[$name] ) ) {
return $this->attributes[$name];
} else {
return null;
@@ -863,6 +897,7 @@ class XmlSelect {
public function addOption( $name, $value = false ) {
// Stab stab stab
$value = ($value !== false) ? $value : $name;
+
$this->options[] = array( $name => $value );
}
@@ -888,10 +923,11 @@ class XmlSelect {
*/
static function formatOptions( $options, $default = false ) {
$data = '';
+
foreach( $options as $label => $value ) {
if ( is_array( $value ) ) {
$contents = self::formatOptions( $value, $default );
- $data .= Xml::tags( 'optgroup', array( 'label' => $label ), $contents ) . "\n";
+ $data .= Html::rawElement( 'optgroup', array( 'label' => $label ), $contents ) . "\n";
} else {
$data .= Xml::option( $label, $value, $value === $default ) . "\n";
}
@@ -905,12 +941,13 @@ class XmlSelect {
*/
public function getHTML() {
$contents = '';
+
foreach ( $this->options as $options ) {
$contents .= self::formatOptions( $options, $this->default );
}
- return Xml::tags( 'select', $this->attributes, rtrim( $contents ) );
- }
+ return Html::rawElement( 'select', $this->attributes, rtrim( $contents ) );
+ }
}
/**
diff --git a/includes/XmlTypeCheck.php b/includes/XmlTypeCheck.php
index 78dd259d..be286f8e 100644
--- a/includes/XmlTypeCheck.php
+++ b/includes/XmlTypeCheck.php
@@ -6,7 +6,7 @@ class XmlTypeCheck {
* well-formed XML. Note that this doesn't check schema validity.
*/
public $wellFormed = false;
-
+
/**
* Will be set to true if the optional element filter returned
* a match at some point.
@@ -31,7 +31,7 @@ class XmlTypeCheck {
$this->filterCallback = $filterCallback;
$this->run( $file );
}
-
+
/**
* Get the root element. Simple accessor to $rootElement
*
@@ -52,21 +52,26 @@ class XmlTypeCheck {
xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
- $file = fopen( $fname, "rb" );
- do {
- $chunk = fread( $file, 32768 );
- $ret = xml_parse( $parser, $chunk, feof( $file ) );
- if( $ret == 0 ) {
- // XML isn't well-formed!
+ if ( file_exists( $fname ) ) {
+ $file = fopen( $fname, "rb" );
+ if ( $file ) {
+ do {
+ $chunk = fread( $file, 32768 );
+ $ret = xml_parse( $parser, $chunk, feof( $file ) );
+ if( $ret == 0 ) {
+ // XML isn't well-formed!
+ fclose( $file );
+ xml_parser_free( $parser );
+ return;
+ }
+ } while( !feof( $file ) );
+
fclose( $file );
- xml_parser_free( $parser );
- return;
}
- } while( !feof( $file ) );
+ }
$this->wellFormed = true;
- fclose( $file );
xml_parser_free( $parser );
}
@@ -77,7 +82,7 @@ class XmlTypeCheck {
*/
private function rootElementOpen( $parser, $name, $attribs ) {
$this->rootElement = $name;
-
+
if( is_callable( $this->filterCallback ) ) {
xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
$this->elementOpen( $parser, $name, $attribs );
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index 8bb36b23..d3d79165 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -41,10 +41,7 @@ class ZhClient {
$errno = $errstr = '';
$this->mFP = fsockopen( $this->mHost, $this->mPort, $errno, $errstr, 30 );
wfRestoreWarnings();
- if ( !$this->mFP ) {
- return false;
- }
- return true;
+ return !$this->mFP;
}
/**
@@ -77,10 +74,7 @@ class ZhClient {
$data .= $str;
}
// data should be of length $len. otherwise something is wrong
- if ( strlen( $data ) != $len ) {
- return false;
- }
- return $data;
+ return strlen( $data ) == $len;
}
/**
@@ -124,6 +118,7 @@ class ZhClient {
}
return $ret;
}
+
/**
* Perform word segmentation
*
diff --git a/includes/ZipDirectoryReader.php b/includes/ZipDirectoryReader.php
index d21cf3b0..37934aea 100644
--- a/includes/ZipDirectoryReader.php
+++ b/includes/ZipDirectoryReader.php
@@ -1,8 +1,8 @@
<?php
/**
- * A class for reading ZIP file directories, for the purposes of upload
- * verification.
+ * A class for reading ZIP file directories, for the purposes of upload
+ * verification.
*
* Only a functional interface is provided: ZipFileReader::read(). No access is
* given to object instances.
@@ -12,7 +12,7 @@ class ZipDirectoryReader {
/**
* Read a ZIP file and call a function for each file discovered in it.
*
- * Because this class is aimed at verification, an error is raised on
+ * Because this class is aimed at verification, an error is raised on
* suspicious or ambiguous input, instead of emulating some standard
* behaviour.
*
@@ -20,7 +20,7 @@ class ZipDirectoryReader {
* @param $callback Array The callback function. It will be called for each file
* with a single associative array each time, with members:
*
- * - name: The file name. Directories conventionally have a trailing
+ * - name: The file name. Directories conventionally have a trailing
* slash.
*
* - mtime: The file modification time, in MediaWiki 14-char format
@@ -30,18 +30,18 @@ class ZipDirectoryReader {
* @param $options Array An associative array of read options, with the option
* name in the key. This may currently contain:
*
- * - zip64: If this is set to true, then we will emulate a
- * library with ZIP64 support, like OpenJDK 7. If it is set to
- * false, then we will emulate a library with no knowledge of
+ * - zip64: If this is set to true, then we will emulate a
+ * library with ZIP64 support, like OpenJDK 7. If it is set to
+ * false, then we will emulate a library with no knowledge of
* ZIP64.
*
- * NOTE: The ZIP64 code is untested and probably doesn't work. It
- * turned out to be easier to just reject ZIP64 archive uploads,
- * since they are likely to be very rare. Confirming safety of a
- * ZIP64 file is fairly complex. What do you do with a file that is
- * ambiguous and broken when read with a non-ZIP64 reader, but valid
- * when read with a ZIP64 reader? This situation is normal for a
- * valid ZIP64 file, and working out what non-ZIP64 readers will make
+ * NOTE: The ZIP64 code is untested and probably doesn't work. It
+ * turned out to be easier to just reject ZIP64 archive uploads,
+ * since they are likely to be very rare. Confirming safety of a
+ * ZIP64 file is fairly complex. What do you do with a file that is
+ * ambiguous and broken when read with a non-ZIP64 reader, but valid
+ * when read with a ZIP64 reader? This situation is normal for a
+ * valid ZIP64 file, and working out what non-ZIP64 readers will make
* of such a file is not trivial.
*
* @return Status object. The following fatal errors are defined:
@@ -50,20 +50,20 @@ class ZipDirectoryReader {
*
* - zip-wrong-format: The file does not appear to be a ZIP file.
*
- * - zip-bad: There was something wrong or ambiguous about the file
+ * - zip-bad: There was something wrong or ambiguous about the file
* data.
*
- * - zip-unsupported: The ZIP file uses features which
+ * - zip-unsupported: The ZIP file uses features which
* ZipDirectoryReader does not support.
*
- * The default messages for those fatal errors are written in a way that
+ * The default messages for those fatal errors are written in a way that
* makes sense for upload verification.
*
- * If a fatal error is returned, more information about the error will be
+ * If a fatal error is returned, more information about the error will be
* available in the debug log.
*
* Note that the callback function may be called any number of times before
- * a fatal error is returned. If this occurs, the data sent to the callback
+ * a fatal error is returned. If this occurs, the data sent to the callback
* function should be discarded.
*/
public static function read( $fileName, $callback, $options = array() ) {
@@ -92,6 +92,8 @@ class ZipDirectoryReader {
/** Stored headers */
var $eocdr, $eocdr64, $eocdr64Locator;
+ var $data;
+
/** The "extra field" ID for ZIP64 central directory entries */
const ZIP64_EXTRA_HEADER = 0x0001;
@@ -104,7 +106,6 @@ class ZipDirectoryReader {
/** The index of the "general field" bit for central directory encryption */
const GENERAL_CD_ENCRYPTED = 13;
-
/**
* Private constructor
*/
@@ -165,8 +166,8 @@ class ZipDirectoryReader {
}
/**
- * Read the header which is at the end of the central directory,
- * unimaginatively called the "end of central directory record" by the ZIP
+ * Read the header which is at the end of the central directory,
+ * unimaginatively called the "end of central directory record" by the ZIP
* spec.
*/
function readEndOfCentralDirectoryRecord() {
@@ -189,7 +190,7 @@ class ZipDirectoryReader {
$block = $this->getBlock( $startPos );
$sigPos = strrpos( $block, "PK\x05\x06" );
if ( $sigPos === false ) {
- $this->error( 'zip-wrong-format',
+ $this->error( 'zip-wrong-format',
"zip file lacks EOCDR signature. It probably isn't a zip file." );
}
@@ -212,7 +213,7 @@ class ZipDirectoryReader {
}
/**
- * Read the header called the "ZIP64 end of central directory locator". An
+ * Read the header called the "ZIP64 end of central directory locator". An
* error will be raised if it does not exist.
*/
function readZip64EndOfCentralDirectoryLocator() {
@@ -224,20 +225,20 @@ class ZipDirectoryReader {
);
$structSize = $this->getStructSize( $info );
- $block = $this->getBlock( $this->getFileLength() - $this->eocdr['EOCDR size']
+ $block = $this->getBlock( $this->getFileLength() - $this->eocdr['EOCDR size']
- $structSize, $structSize );
$this->eocdr64Locator = $data = $this->unpack( $block, $info );
if ( $data['signature'] !== "PK\x06\x07" ) {
- // Note: Java will allow this and continue to read the
- // EOCDR64, so we have to reject the upload, we can't
+ // Note: Java will allow this and continue to read the
+ // EOCDR64, so we have to reject the upload, we can't
// just use the EOCDR header instead.
$this->error( 'zip-bad', 'wrong signature on Zip64 end of central directory locator' );
}
}
/**
- * Read the header called the "ZIP64 end of central directory record". It
+ * Read the header called the "ZIP64 end of central directory record". It
* may replace the regular "end of central directory record" in ZIP64 files.
*/
function readZip64EndOfCentralDirectoryRecord() {
@@ -266,14 +267,14 @@ class ZipDirectoryReader {
$this->error( 'zip-bad', 'wrong signature on Zip64 end of central directory record' );
}
if ( $data['disk'] !== 0
- || $data['CD start disk'] !== 0 )
+ || $data['CD start disk'] !== 0 )
{
$this->error( 'zip-unsupported', 'more than one disk (in EOCDR64)' );
}
}
/**
- * Find the location of the central directory, as would be seen by a
+ * Find the location of the central directory, as would be seen by a
* non-ZIP64 reader.
*
* @return List containing offset, size and end position.
@@ -286,27 +287,27 @@ class ZipDirectoryReader {
// Some readers use the EOCDR position instead of the offset field
// to find the directory, so to be safe, we check if they both agree.
if ( $offset + $size != $endPos ) {
- $this->error( 'zip-bad', 'the central directory does not immediately precede the end ' .
+ $this->error( 'zip-bad', 'the central directory does not immediately precede the end ' .
'of central directory record' );
}
return array( $offset, $size );
}
/**
- * Find the location of the central directory, as would be seen by a
+ * Find the location of the central directory, as would be seen by a
* ZIP64-compliant reader.
*
* @return List containing offset, size and end position.
*/
function findZip64CentralDirectory() {
- // The spec is ambiguous about the exact rules of precedence between the
- // ZIP64 headers and the original headers. Here we follow zip_util.c
+ // The spec is ambiguous about the exact rules of precedence between the
+ // ZIP64 headers and the original headers. Here we follow zip_util.c
// from OpenJDK 7.
$size = $this->eocdr['CD size'];
$offset = $this->eocdr['CD offset'];
$numEntries = $this->eocdr['CD entries total'];
$endPos = $this->eocdr['position'];
- if ( $size == 0xffffffff
+ if ( $size == 0xffffffff
|| $offset == 0xffffffff
|| $numEntries == 0xffff )
{
@@ -324,7 +325,7 @@ class ZipDirectoryReader {
// Some readers use the EOCDR position instead of the offset field
// to find the directory, so to be safe, we check if they both agree.
if ( $offset + $size != $endPos ) {
- $this->error( 'zip-bad', 'the central directory does not immediately precede the end ' .
+ $this->error( 'zip-bad', 'the central directory does not immediately precede the end ' .
'of central directory record' );
}
return array( $offset, $size );
@@ -390,7 +391,7 @@ class ZipDirectoryReader {
}
// Convert the timestamp into MediaWiki format
- // For the format, please see the MS-DOS 2.0 Programmer's Reference,
+ // For the format, please see the MS-DOS 2.0 Programmer's Reference,
// pages 3-5 and 3-6.
$time = $data['mod time'];
$date = $data['mod date'];
@@ -405,8 +406,8 @@ class ZipDirectoryReader {
$year, $month, $day, $hour, $minute, $second );
// Convert the character set in the file name
- if ( !function_exists( 'iconv' )
- || $this->testBit( $data['general bits'], self::GENERAL_UTF8 ) )
+ if ( !function_exists( 'iconv' )
+ || $this->testBit( $data['general bits'], self::GENERAL_UTF8 ) )
{
$name = $data['name'];
} else {
@@ -444,7 +445,7 @@ class ZipDirectoryReader {
while ( $extraPos < strlen( $extraField ) ) {
$extra = $this->unpack( $extraField, $extraHeaderInfo, $extraPos );
$extraPos += $extraHeaderSize;
- $extra += $this->unpack( $extraField,
+ $extra += $this->unpack( $extraField,
array( 'data' => array( 'string', $extra['size'] ) ),
$extraPos );
$extraPos += $extra['size'];
@@ -473,7 +474,7 @@ class ZipDirectoryReader {
* in the file to satisfy the request, an exception will be thrown.
*
* @param $start The byte offset of the start of the block.
- * @param $length The number of bytes to return. If omitted, the remainder
+ * @param $length The number of bytes to return. If omitted, the remainder
* of the file will be returned.
*
* @return string
@@ -500,10 +501,10 @@ class ZipDirectoryReader {
$block .= $this->getSegment( $segIndex );
}
- $block = substr( $block,
+ $block = substr( $block,
$start - $startSeg * self::SEGSIZE,
$length );
-
+
if ( strlen( $block ) < $length ) {
$this->error( 'zip-bad', 'getBlock() returned an unexpectedly small amount of data' );
}
@@ -512,12 +513,12 @@ class ZipDirectoryReader {
}
/**
- * Get a section of the file starting at position $segIndex * self::SEGSIZE,
- * of length self::SEGSIZE. The result is cached. This is a helper function
+ * Get a section of the file starting at position $segIndex * self::SEGSIZE,
+ * of length self::SEGSIZE. The result is cached. This is a helper function
* for getBlock().
*
- * If there are not enough bytes in the file to satsify the request, the
- * return value will be truncated. If a request is made for a segment beyond
+ * If there are not enough bytes in the file to satsify the request, the
+ * return value will be truncated. If a request is made for a segment beyond
* the end of the file, an empty string will be returned.
*/
function getSegment( $segIndex ) {
@@ -556,25 +557,25 @@ class ZipDirectoryReader {
}
/**
- * Unpack a binary structure. This is like the built-in unpack() function
+ * Unpack a binary structure. This is like the built-in unpack() function
* except nicer.
*
* @param $string The binary data input
*
- * @param $struct An associative array giving structure members and their
- * types. In the key is the field name. The value may be either an
- * integer, in which case the field is a little-endian unsigned integer
- * encoded in the given number of bytes, or an array, in which case the
- * first element of the array is the type name, and the subsequent
+ * @param $struct An associative array giving structure members and their
+ * types. In the key is the field name. The value may be either an
+ * integer, in which case the field is a little-endian unsigned integer
+ * encoded in the given number of bytes, or an array, in which case the
+ * first element of the array is the type name, and the subsequent
* elements are type-dependent parameters. Only one such type is defined:
- * - "string": The second array element gives the length of string.
+ * - "string": The second array element gives the length of string.
* Not null terminated.
*
* @param $offset The offset into the string at which to start unpacking.
*
- * @return Unpacked associative array. Note that large integers in the input
- * may be represented as floating point numbers in the return value, so
- * the use of weak comparison is advised.
+ * @return Unpacked associative array. Note that large integers in the input
+ * may be represented as floating point numbers in the return value, so
+ * the use of weak comparison is advised.
*/
function unpack( $string, $struct, $offset = 0 ) {
$size = $this->getStructSize( $struct );
@@ -600,8 +601,8 @@ class ZipDirectoryReader {
$length = intval( $type );
$bytes = substr( $string, $pos, $length );
- // Calculate the value. Use an algorithm which automatically
- // upgrades the value to floating point if necessary.
+ // Calculate the value. Use an algorithm which automatically
+ // upgrades the value to floating point if necessary.
$value = 0;
for ( $i = $length - 1; $i >= 0; $i-- ) {
$value *= 256;
@@ -623,7 +624,7 @@ class ZipDirectoryReader {
}
/**
- * Returns a bit from a given position in an integer value, converted to
+ * Returns a bit from a given position in an integer value, converted to
* boolean.
*
* @param $value integer
@@ -678,6 +679,9 @@ class ZipDirectoryReaderError extends Exception {
parent::__construct( "ZipDirectoryReader error: $code" );
}
+ /**
+ * @return mixed
+ */
function getErrorCode() {
return $this->code;
}
diff --git a/includes/actions/CreditsAction.php b/includes/actions/CreditsAction.php
index 1040085b..cd083c30 100644
--- a/includes/actions/CreditsAction.php
+++ b/includes/actions/CreditsAction.php
@@ -29,12 +29,8 @@ class CreditsAction extends FormlessAction {
return 'credits';
}
- public function getRestriction() {
- return null;
- }
-
protected function getDescription() {
- return wfMsg( 'creditspage' );
+ return wfMsgHtml( 'creditspage' );
}
/**
@@ -46,7 +42,7 @@ class CreditsAction extends FormlessAction {
wfProfileIn( __METHOD__ );
if ( $this->page->getID() == 0 ) {
- $s = wfMsg( 'nocredits' );
+ $s = $this->msg( 'nocredits' )->parse();
} else {
$s = $this->getCredits( -1 );
}
@@ -67,8 +63,8 @@ class CreditsAction extends FormlessAction {
wfProfileIn( __METHOD__ );
$s = '';
- if ( isset( $cnt ) && $cnt != 0 ) {
- $s = self::getAuthor( $this->page );
+ if ( $cnt != 0 ) {
+ $s = $this->getAuthor( $this->page );
if ( $cnt > 1 || $cnt < 0 ) {
$s .= ' ' . $this->getContributors( $cnt - 1, $showIfMax );
}
@@ -83,20 +79,20 @@ class CreditsAction extends FormlessAction {
* @param $article Article object
* @return String HTML
*/
- protected static function getAuthor( Page $article ) {
- global $wgLang;
-
- $user = User::newFromId( $article->getUser() );
+ protected function getAuthor( Page $article ) {
+ $user = User::newFromName( $article->getUserText(), false );
$timestamp = $article->getTimestamp();
if ( $timestamp ) {
- $d = $wgLang->date( $article->getTimestamp(), true );
- $t = $wgLang->time( $article->getTimestamp(), true );
+ $lang = $this->getLanguage();
+ $d = $lang->date( $article->getTimestamp(), true );
+ $t = $lang->time( $article->getTimestamp(), true );
} else {
$d = '';
$t = '';
}
- return wfMessage( 'lastmodifiedatby', $d, $t )->rawParams( self::userLink( $user ) )->params( $user->getName() )->escaped();
+ return $this->msg( 'lastmodifiedatby', $d, $t )->rawParams(
+ $this->userLink( $user ) )->params( $user->getName() )->escaped();
}
/**
@@ -106,7 +102,7 @@ class CreditsAction extends FormlessAction {
* @return String: html
*/
protected function getContributors( $cnt, $showIfMax ) {
- global $wgLang, $wgHiddenPrefs;
+ global $wgHiddenPrefs;
$contributors = $this->page->getContributors();
@@ -116,7 +112,8 @@ class CreditsAction extends FormlessAction {
if ( $cnt > 0 && $contributors->count() > $cnt ) {
$others_link = $this->othersLink();
if ( !$showIfMax )
- return wfMessage( 'othercontribs' )->rawParams( $others_link )->params( $contributors->count() )->escaped();
+ return $this->msg( 'othercontribs' )->rawParams(
+ $others_link )->params( $contributors->count() )->escaped();
}
$real_names = array();
@@ -127,14 +124,14 @@ class CreditsAction extends FormlessAction {
foreach ( $contributors as $user ) {
$cnt--;
if ( $user->isLoggedIn() ) {
- $link = self::link( $user );
+ $link = $this->link( $user );
if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
$real_names[] = $link;
} else {
$user_names[] = $link;
}
} else {
- $anon_ips[] = self::link( $user );
+ $anon_ips[] = $this->link( $user );
}
if ( $cnt == 0 ) {
@@ -142,22 +139,24 @@ class CreditsAction extends FormlessAction {
}
}
+ $lang = $this->getLanguage();
+
if ( count( $real_names ) ) {
- $real = $wgLang->listToText( $real_names );
+ $real = $lang->listToText( $real_names );
} else {
$real = false;
}
# "ThisSite user(s) A, B and C"
if ( count( $user_names ) ) {
- $user = wfMessage( 'siteusers' )->rawParams( $wgLang->listToText( $user_names ) )->params(
+ $user = $this->msg( 'siteusers' )->rawParams( $lang->listToText( $user_names ) )->params(
count( $user_names ) )->escaped();
} else {
$user = false;
}
if ( count( $anon_ips ) ) {
- $anon = wfMessage( 'anonusers' )->rawParams( $wgLang->listToText( $anon_ips ) )->params(
+ $anon = $this->msg( 'anonusers' )->rawParams( $lang->listToText( $anon_ips ) )->params(
count( $anon_ips ) )->escaped();
} else {
$anon = false;
@@ -174,8 +173,8 @@ class CreditsAction extends FormlessAction {
$count = count( $fulllist );
# "Based on work by ..."
return $count
- ? wfMessage( 'othercontribs' )->rawParams(
- $wgLang->listToText( $fulllist ) )->params( $count )->escaped()
+ ? $this->msg( 'othercontribs' )->rawParams(
+ $lang->listToText( $fulllist ) )->params( $count )->escaped()
: '';
}
@@ -184,7 +183,7 @@ class CreditsAction extends FormlessAction {
* @param $user User object
* @return String: html
*/
- protected static function link( User $user ) {
+ protected function link( User $user ) {
global $wgHiddenPrefs;
if ( !in_array( 'realname', $wgHiddenPrefs ) && !$user->isAnon() ) {
$real = $user->getRealName();
@@ -204,32 +203,30 @@ class CreditsAction extends FormlessAction {
* @param $user User object
* @return String: html
*/
- protected static function userLink( User $user ) {
- $link = self::link( $user );
+ protected function userLink( User $user ) {
+ $link = $this->link( $user );
if ( $user->isAnon() ) {
- return wfMsgExt( 'anonuser', array( 'parseinline', 'replaceafter' ), $link );
+ return $this->msg( 'anonuser' )->rawParams( $link )->parse();
} else {
global $wgHiddenPrefs;
if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
return $link;
} else {
- return wfMessage( 'siteuser' )->rawParams( $link )->params( $user->getName() )->escaped();
+ return $this->msg( 'siteuser' )->rawParams( $link )->params( $user->getName() )->escaped();
}
}
}
/**
* Get a link to action=credits of $article page
- * @param $article Article object
- * @return String: html
+ * @return String: HTML link
*/
protected function othersLink() {
- return Linker::link(
+ return Linker::linkKnown(
$this->getTitle(),
- wfMsgHtml( 'others' ),
+ $this->msg( 'others' )->escaped(),
array(),
- array( 'action' => 'credits' ),
- array( 'known' )
+ array( 'action' => 'credits' )
);
}
}
diff --git a/includes/actions/DeletetrackbackAction.php b/includes/actions/DeleteAction.php
index 0efebdf5..5a5a382b 100644
--- a/includes/actions/DeletetrackbackAction.php
+++ b/includes/actions/DeleteAction.php
@@ -1,8 +1,8 @@
<?php
/**
- * Delete a trackback on a page
+ * Handle page deletion
*
- * Copyright © 2011 Alexandre Emsenhuber
+ * Copyright © 2012 Timo Tijhof
*
* This 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,35 +20,23 @@
*
* @file
* @ingroup Actions
+ * @author Timo Tijhof
*/
-class DeletetrackbackAction extends FormlessAction {
+class DeleteAction extends FormlessAction {
public function getName() {
- return 'deletetrackback';
- }
-
- public function getRestriction() {
return 'delete';
}
- protected function getDescription() {
- return '';
+ public function onView(){
+ return null;
}
- protected function checkCanExecute( User $user ) {
- if ( !$user->matchEditToken( $this->getRequest()->getVal( 'token' ) ) ) {
- throw new ErrorPageError( 'sessionfailure-title', 'sessionfailure' );
- }
+ public function show(){
- return parent::checkCanExecute( $user );
- }
+ $this->page->delete();
- public function onView() {
- $db = wfGetDB( DB_MASTER );
- $db->delete( 'trackbacks', array( 'tb_id' => $this->getRequest()->getInt( 'tbid' ) ) );
-
- $this->getOutput()->addWikiMsg( 'trackbackdeleteok' );
- $this->getTitle()->invalidateCache();
}
+
}
diff --git a/includes/actions/EditAction.php b/includes/actions/EditAction.php
new file mode 100644
index 00000000..08a33f4c
--- /dev/null
+++ b/includes/actions/EditAction.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * action=edit / action=submit handler
+ *
+ * Copyright © 2012 Timo Tijhof
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ * @ingroup Actions
+ * @author Timo Tijhof
+ */
+
+class EditAction extends FormlessAction {
+
+ public function getName() {
+ return 'edit';
+ }
+
+ public function onView(){
+ return null;
+ }
+
+ 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();
+ }
+ }
+
+ }
+
+}
+
+class SubmitAction extends EditAction {
+
+ public function getName() {
+ return 'submit';
+ }
+
+ public function show(){
+ if ( session_id() == '' ) {
+ // Send a cookie so anons get talk message notifications
+ wfSetupSession();
+ }
+
+ parent::show();
+ }
+
+}
diff --git a/includes/HistoryPage.php b/includes/actions/HistoryAction.php
index dd5ecd43..457f67ff 100644
--- a/includes/HistoryPage.php
+++ b/includes/actions/HistoryAction.php
@@ -15,38 +15,42 @@
* history.
*
*/
-class HistoryPage {
+class HistoryAction extends FormlessAction {
const DIR_PREV = 0;
const DIR_NEXT = 1;
- /** Contains the Article object. Passed on construction. */
- private $article;
- /** The $article title object. Found on construction. */
- private $title;
- /** Shortcut to the user Skin object. */
- private $skin;
+ public function getName() {
+ return 'history';
+ }
- /**
- * Construct a new HistoryPage.
- *
- * @param $article Article
- */
- function __construct( $article ) {
- global $wgUser;
- $this->article = $article;
- $this->title = $article->getTitle();
- $this->skin = $wgUser->getSkin();
- $this->preCacheMessages();
+ public function requiresWrite() {
+ return false;
}
- /** Get the Article object we are working on. */
- public function getArticle() {
- return $this->article;
+ public function requiresUnblock() {
+ return false;
}
- /** Get the Title object. */
- public function getTitle() {
- return $this->title;
+ protected function getPageTitle() {
+ return $this->msg( 'history-title', $this->getTitle()->getPrefixedText() )->text();
+ }
+
+ protected function getDescription() {
+ // Creation of a subtitle link pointing to [[Special:Log]]
+ return Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Log' ),
+ $this->msg( 'viewpagelogs' )->escaped(),
+ array(),
+ array( 'page' => $this->getTitle()->getPrefixedText() )
+ );
+ }
+
+ /**
+ * Get the Article object we are working on.
+ * @return Page
+ */
+ public function getArticle() {
+ return $this->page;
}
/**
@@ -58,7 +62,7 @@ class HistoryPage {
if ( !isset( $this->message ) ) {
$msgs = array( 'cur', 'last', 'pipe-separator' );
foreach ( $msgs as $msg ) {
- $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
+ $this->message[$msg] = $this->msg( $msg )->escaped();
}
}
}
@@ -67,53 +71,54 @@ class HistoryPage {
* Print the history page for an article.
* @return nothing
*/
- function history() {
- global $wgOut, $wgRequest, $wgScript;
+ function onView() {
+ global $wgScript, $wgUseFileCache, $wgSquidMaxage;
+
+ $out = $this->getOutput();
+ $request = $this->getRequest();
/**
* Allow client caching.
*/
- if ( $wgOut->checkLastModified( $this->article->getTouched() ) )
+ if ( $out->checkLastModified( $this->page->getTouched() ) ) {
return; // Client cache fresh and headers sent, nothing more to do.
+ }
wfProfileIn( __METHOD__ );
- // Setup page variables.
- $wgOut->setPageTitle( wfMsg( 'history-title', $this->title->getPrefixedText() ) );
- $wgOut->setPageTitleActionText( wfMsg( 'history_short' ) );
- $wgOut->setArticleFlag( false );
- $wgOut->setArticleRelated( true );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setSyndicated( true );
- $wgOut->setFeedAppendQuery( 'action=history' );
- $wgOut->addModules( array( 'mediawiki.legacy.history', 'mediawiki.action.history' ) );
+ if ( $request->getFullRequestURL() == $this->getTitle()->getInternalURL( 'action=history' ) ) {
+ $out->setSquidMaxage( $wgSquidMaxage );
+ }
- // Creation of a subtitle link pointing to [[Special:Log]]
- $logPage = SpecialPage::getTitleFor( 'Log' );
- $logLink = $this->skin->link(
- $logPage,
- wfMsgHtml( 'viewpagelogs' ),
- array(),
- array( 'page' => $this->title->getPrefixedText() ),
- array( 'known', 'noclasses' )
- );
- $wgOut->setSubtitle( $logLink );
+ $this->preCacheMessages();
+
+ # Fill in the file cache if not set already
+ if ( $wgUseFileCache && HTMLFileCache::useFileCache( $this->getContext() ) ) {
+ $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'history' );
+ if ( !$cache->isCacheGood( /* Assume up to date */ ) ) {
+ ob_start( array( &$cache, 'saveToFileCache' ) );
+ }
+ }
+
+ // Setup page variables.
+ $out->setFeedAppendQuery( 'action=history' );
+ $out->addModules( array( 'mediawiki.legacy.history', 'mediawiki.action.history' ) );
// Handle atom/RSS feeds.
- $feedType = $wgRequest->getVal( 'feed' );
+ $feedType = $request->getVal( 'feed' );
if ( $feedType ) {
wfProfileOut( __METHOD__ );
return $this->feed( $feedType );
}
// Fail nicely if article doesn't exist.
- if ( !$this->title->exists() ) {
- $wgOut->addWikiMsg( 'nohistory' );
+ if ( !$this->page->exists() ) {
+ $out->addWikiMsg( 'nohistory' );
# show deletion/move log if there is an entry
LogEventsList::showLogExtract(
- $wgOut,
+ $out,
array( 'delete', 'move' ),
- $this->title->getPrefixedText(),
+ $this->getTitle(),
'',
array( 'lim' => 10,
'conds' => array( "log_action != 'revision'" ),
@@ -128,50 +133,50 @@ class HistoryPage {
/**
* Add date selector to quickly get to a certain time
*/
- $year = $wgRequest->getInt( 'year' );
- $month = $wgRequest->getInt( 'month' );
- $tagFilter = $wgRequest->getVal( 'tagfilter' );
+ $year = $request->getInt( 'year' );
+ $month = $request->getInt( 'month' );
+ $tagFilter = $request->getVal( 'tagfilter' );
$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
/**
* Option to show only revisions that have been (partially) hidden via RevisionDelete
*/
- if ( $wgRequest->getBool( 'deleted' ) ) {
+ if ( $request->getBool( 'deleted' ) ) {
$conds = array( "rev_deleted != '0'" );
} else {
$conds = array();
}
- $checkDeleted = Xml::checkLabel( wfMsg( 'history-show-deleted' ),
- 'deleted', 'mw-show-deleted-only', $wgRequest->getBool( 'deleted' ) ) . "\n";
+ $checkDeleted = Xml::checkLabel( $this->msg( 'history-show-deleted' )->text(),
+ 'deleted', 'mw-show-deleted-only', $request->getBool( 'deleted' ) ) . "\n";
// Add the general form
$action = htmlspecialchars( $wgScript );
- $wgOut->addHTML(
+ $out->addHTML(
"<form action=\"$action\" method=\"get\" id=\"mw-history-searchform\">" .
Xml::fieldset(
- wfMsg( 'history-fieldset-title' ),
+ $this->msg( 'history-fieldset-title' )->text(),
false,
array( 'id' => 'mw-history-search' )
) .
- Html::hidden( 'title', $this->title->getPrefixedDBKey() ) . "\n" .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBKey() ) . "\n" .
Html::hidden( 'action', 'history' ) . "\n" .
Xml::dateMenu( $year, $month ) . '&#160;' .
( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
$checkDeleted .
- Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" .
+ Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
'</fieldset></form>'
);
- wfRunHooks( 'PageHistoryBeforeList', array( &$this->article ) );
+ wfRunHooks( 'PageHistoryBeforeList', array( &$this->page ) );
// Create and output the list.
$pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds );
- $wgOut->addHTML(
+ $out->addHTML(
$pager->getNavigationBar() .
$pager->getBody() .
$pager->getNavigationBar()
);
- $wgOut->preventClickjacking( $pager->getPreventClickjacking() );
+ $out->preventClickjacking( $pager->getPreventClickjacking() );
wfProfileOut( __METHOD__ );
}
@@ -201,7 +206,7 @@ class HistoryPage {
$offsets = array();
}
- $page_id = $this->title->getArticleID();
+ $page_id = $this->page->getId();
return $dbr->select( 'revision',
Revision::selectFields(),
@@ -218,21 +223,22 @@ class HistoryPage {
* @param $type String: feed type
*/
function feed( $type ) {
- global $wgFeedClasses, $wgRequest, $wgFeedLimit;
+ global $wgFeedClasses, $wgFeedLimit;
if ( !FeedUtils::checkFeedOutput( $type ) ) {
return;
}
+ $request = $this->getRequest();
$feed = new $wgFeedClasses[$type](
- $this->title->getPrefixedText() . ' - ' .
+ $this->getTitle()->getPrefixedText() . ' - ' .
wfMsgForContent( 'history-feed-title' ),
wfMsgForContent( 'history-feed-description' ),
- $this->title->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 = $wgRequest->getInt( 'limit', 10 );
+ $limit = $request->getInt( 'limit', 10 );
if ( $limit > $wgFeedLimit || $limit < 1 ) {
$limit = 10;
}
@@ -240,7 +246,7 @@ class HistoryPage {
// Generate feed elements enclosed between header and footer.
$feed->outHeader();
- if ( $items ) {
+ if ( $items->numRows() ) {
foreach ( $items as $row ) {
$feed->outItem( $this->feedItem( $row ) );
}
@@ -251,14 +257,13 @@ class HistoryPage {
}
function feedEmpty() {
- global $wgOut;
return new FeedItem(
wfMsgForContent( 'nohistory' ),
- $wgOut->parse( wfMsgForContent( 'history-feed-empty' ) ),
- $this->title->getFullUrl(),
+ $this->getOutput()->parse( wfMsgForContent( 'history-feed-empty' ) ),
+ $this->getTitle()->getFullUrl(),
wfTimestamp( TS_MW ),
'',
- $this->title->getTalkPage()->getFullUrl()
+ $this->getTitle()->getTalkPage()->getFullUrl()
);
}
@@ -272,10 +277,10 @@ class HistoryPage {
*/
function feedItem( $row ) {
$rev = new Revision( $row );
- $rev->setTitle( $this->title );
+ $rev->setTitle( $this->getTitle() );
$text = FeedUtils::formatDiffRow(
- $this->title,
- $this->title->getPreviousRevisionID( $rev->getId() ),
+ $this->getTitle(),
+ $this->getTitle()->getPreviousRevisionID( $rev->getId() ),
$rev->getId(),
$rev->getTimestamp(),
$rev->getComment()
@@ -296,10 +301,10 @@ class HistoryPage {
return new FeedItem(
$title,
$text,
- $this->title->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ),
+ $this->getTitle()->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ),
$rev->getTimestamp(),
$rev->getUserText(),
- $this->title->getTalkPage()->getFullUrl()
+ $this->getTitle()->getTalkPage()->getFullUrl()
);
}
}
@@ -308,14 +313,13 @@ class HistoryPage {
* @ingroup Pager
*/
class HistoryPager extends ReverseChronologicalPager {
- public $lastRow = false, $counter, $historyPage, $title, $buttons, $conds;
+ public $lastRow = false, $counter, $historyPage, $buttons, $conds;
protected $oldIdChecked;
protected $preventClickjacking = false;
function __construct( $historyPage, $year = '', $month = '', $tagFilter = '', $conds = array() ) {
- parent::__construct();
+ parent::__construct( $historyPage->getContext() );
$this->historyPage = $historyPage;
- $this->title = $this->historyPage->getTitle();
$this->tagFilter = $tagFilter;
$this->getDateCond( $year, $month );
$this->conds = $conds;
@@ -326,10 +330,6 @@ class HistoryPager extends ReverseChronologicalPager {
return $this->historyPage->getArticle();
}
- function getTitle() {
- return $this->title;
- }
-
function getSqlComment() {
if ( $this->conds ) {
return 'history page filtered'; // potentially slow, see CR r58153
@@ -340,13 +340,15 @@ class HistoryPager extends ReverseChronologicalPager {
function getQueryInfo() {
$queryInfo = array(
- 'tables' => array( 'revision' ),
- 'fields' => Revision::selectFields(),
+ 'tables' => array( 'revision', 'user' ),
+ 'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
'conds' => array_merge(
- array( 'rev_page' => $this->title->getArticleID() ),
+ array( 'rev_page' => $this->getWikiPage()->getId() ),
$this->conds ),
'options' => array( 'USE INDEX' => array( 'revision' => 'page_timestamp' ) ),
- 'join_conds' => array( 'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ),
+ 'join_conds' => array(
+ 'user' => Revision::userJoinCond(),
+ 'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ),
);
ChangeTags::modifyDisplayQuery(
$queryInfo['tables'],
@@ -370,7 +372,7 @@ class HistoryPager extends ReverseChronologicalPager {
$firstInList = $this->counter == 1;
$this->counter++;
$s = $this->historyLine( $this->lastRow, $row,
- $this->title->getNotificationTimestamp(), $latest, $firstInList );
+ $this->getTitle()->getNotificationTimestamp( $this->getUser() ), $latest, $firstInList );
} else {
$s = '';
}
@@ -378,37 +380,54 @@ class HistoryPager extends ReverseChronologicalPager {
return $s;
}
+ function doBatchLookups() {
+ # Do a link batch query
+ $this->mResult->seek( 0 );
+ $batch = new LinkBatch();
+ foreach ( $this->mResult as $row ) {
+ 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
+ $batch->add( NS_USER, $row->rev_user_text );
+ $batch->add( NS_USER_TALK, $row->rev_user_text );
+ }
+ }
+ $batch->execute();
+ $this->mResult->seek( 0 );
+ }
+
/**
* Creates begin of history list with a submit button
*
* @return string HTML output
*/
function getStartBody() {
- global $wgScript, $wgUser, $wgOut;
+ global $wgScript;
$this->lastRow = false;
$this->counter = 1;
$this->oldIdChecked = 0;
- $wgOut->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
+ $this->getOutput()->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
$s = Html::openElement( 'form', array( 'action' => $wgScript,
'id' => 'mw-history-compare' ) ) . "\n";
- $s .= Html::hidden( 'title', $this->title->getPrefixedDbKey() ) . "\n";
+ $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) . "\n";
$s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
- $s .= '<div>' . $this->submitButton( wfMsg( 'compareselectedversions' ),
- array( 'class' => 'historysubmit' ) ) . "\n";
-
+ // Button container stored in $this->buttons for re-use in getEndBody()
$this->buttons = '<div>';
- $this->buttons .= $this->submitButton( wfMsg( 'compareselectedversions' ),
- array( 'class' => 'historysubmit' )
+ $this->buttons .= $this->submitButton( $this->msg( 'compareselectedversions' )->text(),
+ array( 'class' => 'historysubmit mw-history-compareselectedversions-button' )
+ Linker::tooltipAndAccesskeyAttribs( 'compareselectedversions' )
) . "\n";
- if ( $wgUser->isAllowed( 'deleterevision' ) ) {
- $s .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
+ if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
+ $this->buttons .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
}
$this->buttons .= '</div>';
- $s .= '</div><ul id="pagehistory">' . "\n";
+
+ $s .= $this->buttons;
+ $s .= '<ul id="pagehistory">' . "\n";
return $s;
}
@@ -420,11 +439,10 @@ class HistoryPager extends ReverseChronologicalPager {
'type' => 'submit',
'name' => $name,
'value' => '1',
- 'class' => "mw-history-$name-button",
+ 'class' => "historysubmit mw-history-$name-button",
),
- wfMsg( $msg )
+ $this->msg( $msg )->text()
) . "\n";
- $this->buttons .= $element;
return $element;
}
@@ -445,7 +463,7 @@ class HistoryPager extends ReverseChronologicalPager {
}
$this->counter++;
$s = $this->historyLine( $this->lastRow, $next,
- $this->title->getNotificationTimestamp(), $latest, $firstInList );
+ $this->getTitle()->getNotificationTimestamp( $this->getUser() ), $latest, $firstInList );
} else {
$s = '';
}
@@ -480,7 +498,7 @@ class HistoryPager extends ReverseChronologicalPager {
* @todo document some more, and maybe clean up the code (some params redundant?)
*
* @param $row Object: the database row corresponding to the previous line.
- * @param $next Mixed: the database row corresponding to the next line.
+ * @param $next Mixed: the database row corresponding to the next line. (chronologically previous)
* @param $notificationtimestamp
* @param $latest Boolean: whether this row corresponds to the page's latest revision.
* @param $firstInList Boolean: whether this row corresponds to the first displayed on this history page.
@@ -489,9 +507,15 @@ class HistoryPager extends ReverseChronologicalPager {
function historyLine( $row, $next, $notificationtimestamp = false,
$latest = false, $firstInList = false )
{
- global $wgUser, $wgLang;
$rev = new Revision( $row );
- $rev->setTitle( $this->title );
+ $rev->setTitle( $this->getTitle() );
+
+ if ( is_object( $next ) ) {
+ $prevRev = new Revision( $next );
+ $prevRev->setTitle( $this->getTitle() );
+ } else {
+ $prevRev = null;
+ }
$curlink = $this->curLink( $rev, $latest );
$lastlink = $this->lastLink( $rev, $next );
@@ -507,11 +531,12 @@ class HistoryPager extends ReverseChronologicalPager {
$classes = array();
$del = '';
+ $user = $this->getUser();
// Show checkboxes for each revision
- if ( $wgUser->isAllowed( 'deleterevision' ) ) {
+ if ( $user->isAllowed( 'deleterevision' ) ) {
$this->preventClickjacking();
// If revision was hidden from sysops, disable the checkbox
- if ( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
$del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
// Otherwise, enable the checkbox...
} else {
@@ -519,15 +544,15 @@ class HistoryPager extends ReverseChronologicalPager {
array( 'name' => 'ids[' . $rev->getId() . ']' ) );
}
// User can only view deleted revisions...
- } elseif ( $rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) {
+ } elseif ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) {
// If revision was hidden from sysops, disable the link
- if ( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $cdel = $this->getSkin()->revDeleteLinkDisabled( false );
+ if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+ $cdel = Linker::revDeleteLinkDisabled( false );
// Otherwise, show the link...
} else {
$query = array( 'type' => 'revision',
- 'target' => $this->title->getPrefixedDbkey(), 'ids' => $rev->getId() );
- $del .= $this->getSkin()->revDeleteLink( $query,
+ 'target' => $this->getTitle()->getPrefixedDbkey(), 'ids' => $rev->getId() );
+ $del .= Linker::revDeleteLink( $query,
$rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
}
}
@@ -535,63 +560,65 @@ class HistoryPager extends ReverseChronologicalPager {
$s .= " $del ";
}
- $dirmark = $wgLang->getDirMark();
+ $lang = $this->getLanguage();
+ $dirmark = $lang->getDirMark();
$s .= " $link";
$s .= $dirmark;
$s .= " <span class='history-user'>" .
- $this->getSkin()->revUserTools( $rev, true ) . "</span>";
+ Linker::revUserTools( $rev, true ) . "</span>";
$s .= $dirmark;
if ( $rev->isMinor() ) {
$s .= ' ' . ChangesList::flag( 'minor' );
}
- if ( !is_null( $size = $rev->getSize() ) && !$rev->isDeleted( Revision::DELETED_TEXT ) ) {
- $s .= ' ' . $this->getSkin()->formatRevisionSize( $size );
- }
+ # Size is always public data
+ $prevSize = $prevRev ? $prevRev->getSize() : 0;
+ $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
+ $s .= ' . . ' . $sDiff . ' . . ';
- $s .= $this->getSkin()->revComment( $rev, false, true );
+ $s .= Linker::revComment( $rev, false, true );
if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
- $s .= ' <span class="updatedmarker">' . wfMsgHtml( 'updatedmarker' ) . '</span>';
+ $s .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
}
$tools = array();
# Rollback and undo links
- if ( !is_null( $next ) && is_object( $next ) ) {
- if ( $latest && $this->title->userCan( 'rollback' ) && $this->title->userCan( 'edit' ) ) {
+ if ( $prevRev &&
+ !count( $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getUser() ) ) )
+ {
+ if ( $latest && !count( $this->getTitle()->getUserPermissionsErrors( 'rollback', $this->getUser() ) ) ) {
$this->preventClickjacking();
$tools[] = '<span class="mw-rollback-link">' .
- $this->getSkin()->buildRollbackLink( $rev ) . '</span>';
+ Linker::buildRollbackLink( $rev ) . '</span>';
}
- if ( $this->title->quickUserCan( 'edit' )
- && !$rev->isDeleted( Revision::DELETED_TEXT )
- && !$next->rev_deleted & Revision::DELETED_TEXT )
+ if ( !$rev->isDeleted( Revision::DELETED_TEXT )
+ && !$prevRev->isDeleted( Revision::DELETED_TEXT ) )
{
# Create undo tooltip for the first (=latest) line only
$undoTooltip = $latest
- ? array( 'title' => wfMsg( 'tooltip-undo' ) )
+ ? array( 'title' => $this->msg( 'tooltip-undo' )->text() )
: array();
- $undolink = $this->getSkin()->link(
- $this->title,
- wfMsgHtml( 'editundo' ),
+ $undolink = Linker::linkKnown(
+ $this->getTitle(),
+ $this->msg( 'editundo' )->escaped(),
$undoTooltip,
array(
- 'action' => 'edit',
- 'undoafter' => $next->rev_id,
- 'undo' => $rev->getId()
- ),
- array( 'known', 'noclasses' )
+ 'action' => 'edit',
+ 'undoafter' => $prevRev->getId(),
+ 'undo' => $rev->getId()
+ )
);
$tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
}
}
if ( $tools ) {
- $s .= ' (' . $wgLang->pipeList( $tools ) . ')';
+ $s .= ' (' . $lang->pipeList( $tools ) . ')';
}
# Tags
@@ -616,16 +643,14 @@ class HistoryPager extends ReverseChronologicalPager {
* @return String
*/
function revLink( $rev ) {
- global $wgLang;
- $date = $wgLang->timeanddate( wfTimestamp( TS_MW, $rev->getTimestamp() ), true );
+ $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $this->getUser() );
$date = htmlspecialchars( $date );
- if ( $rev->userCan( Revision::DELETED_TEXT ) ) {
- $link = $this->getSkin()->link(
- $this->title,
+ if ( $rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+ $link = Linker::linkKnown(
+ $this->getTitle(),
$date,
array(),
- array( 'oldid' => $rev->getId() ),
- array( 'known', 'noclasses' )
+ array( 'oldid' => $rev->getId() )
);
} else {
$link = $date;
@@ -645,18 +670,17 @@ class HistoryPager extends ReverseChronologicalPager {
*/
function curLink( $rev, $latest ) {
$cur = $this->historyPage->message['cur'];
- if ( $latest || !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if ( $latest || !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
return $cur;
} else {
- return $this->getSkin()->link(
- $this->title,
+ return Linker::linkKnown(
+ $this->getTitle(),
$cur,
array(),
array(
- 'diff' => $this->title->getLatestRevID(),
+ 'diff' => $this->getWikiPage()->getLatest(),
'oldid' => $rev->getId()
- ),
- array( 'known', 'noclasses' )
+ )
);
}
}
@@ -677,30 +701,28 @@ class HistoryPager extends ReverseChronologicalPager {
return $last;
} elseif ( $next === 'unknown' ) {
# Next row probably exists but is unknown, use an oldid=prev link
- return $this->getSkin()->link(
- $this->title,
+ return Linker::linkKnown(
+ $this->getTitle(),
$last,
array(),
array(
'diff' => $prevRev->getId(),
'oldid' => 'prev'
- ),
- array( 'known', 'noclasses' )
+ )
);
- } elseif ( !$prevRev->userCan( Revision::DELETED_TEXT )
- || !$nextRev->userCan( Revision::DELETED_TEXT ) )
+ } elseif ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+ || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) )
{
return $last;
} else {
- return $this->getSkin()->link(
- $this->title,
+ return Linker::linkKnown(
+ $this->getTitle(),
$last,
array(),
array(
'diff' => $prevRev->getId(),
'oldid' => $next->rev_id
- ),
- array( 'known', 'noclasses' )
+ )
);
}
}
@@ -728,7 +750,7 @@ class HistoryPager extends ReverseChronologicalPager {
$checkmark = array( 'checked' => 'checked' );
} else {
# Check visibility of old revisions
- if ( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
$radio['disabled'] = 'disabled';
$checkmark = array(); // We will check the next possible one
} elseif ( !$this->oldIdChecked ) {
@@ -769,7 +791,14 @@ class HistoryPager extends ReverseChronologicalPager {
}
/**
- * Backwards-compatibility aliases
+ * Backwards-compatibility alias
*/
-class PageHistory extends HistoryPage {}
-class PageHistoryPager extends HistoryPager {}
+class HistoryPage extends HistoryAction {
+ public function __construct( Page $article ) { # Just to make it public
+ parent::__construct( $article );
+ }
+
+ public function history() {
+ $this->onView();
+ }
+}
diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php
index b0b5f259..70edabce 100644
--- a/includes/actions/InfoAction.php
+++ b/includes/actions/InfoAction.php
@@ -29,10 +29,6 @@ class InfoAction extends FormlessAction {
return 'info';
}
- public function getRestriction() {
- return 'read';
- }
-
protected function getDescription() {
return '';
}
@@ -46,7 +42,7 @@ class InfoAction extends FormlessAction {
}
protected function getPageTitle() {
- return wfMsg( 'pageinfo-title', $this->getTitle()->getSubjectPage()->getPrefixedText() );
+ return $this->msg( 'pageinfo-title', $this->getTitle()->getSubjectPage()->getPrefixedText() )->text();
}
public function onView() {
@@ -60,44 +56,44 @@ class InfoAction extends FormlessAction {
return Html::rawElement( 'table', array( 'class' => 'wikitable mw-page-info' ),
Html::rawElement( 'tr', array(),
Html::element( 'th', array(), '' ) .
- Html::element( 'th', array(), wfMsg( 'pageinfo-subjectpage' ) ) .
- Html::element( 'th', array(), wfMsg( 'pageinfo-talkpage' ) )
+ Html::element( 'th', array(), $this->msg( 'pageinfo-subjectpage' )->text() ) .
+ Html::element( 'th', array(), $this->msg( 'pageinfo-talkpage' )->text() )
) .
Html::rawElement( 'tr', array(),
- Html::element( 'th', array( 'colspan' => 3 ), wfMsg( 'pageinfo-header-edits' ) )
+ Html::element( 'th', array( 'colspan' => 3 ), $this->msg( 'pageinfo-header-edits' )->text() )
) .
Html::rawElement( 'tr', array(),
- Html::element( 'td', array(), wfMsg( 'pageinfo-edits' ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( $pageInfo['edits'] ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( $talkInfo['edits'] ) )
+ Html::element( 'td', array(), $this->msg( 'pageinfo-edits' )->text() ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( $pageInfo['edits'] ) ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( $talkInfo['edits'] ) )
) .
Html::rawElement( 'tr', array(),
- Html::element( 'td', array(), wfMsg( 'pageinfo-authors' ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( $pageInfo['authors'] ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( $talkInfo['authors'] ) )
+ Html::element( 'td', array(), $this->msg( 'pageinfo-authors' )->text() ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( $pageInfo['authors'] ) ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( $talkInfo['authors'] ) )
) .
( !$this->getUser()->isAllowed( 'unwatchedpages' ) ? '' :
Html::rawElement( 'tr', array(),
- Html::element( 'th', array( 'colspan' => 3 ), wfMsg( 'pageinfo-header-watchlist' ) )
+ Html::element( 'th', array( 'colspan' => 3 ), $this->msg( 'pageinfo-header-watchlist' )->text() )
) .
Html::rawElement( 'tr', array(),
- Html::element( 'td', array(), wfMsg( 'pageinfo-watchers' ) ) .
- Html::element( 'td', array( 'colspan' => 2 ), $this->getLang()->formatNum( $pageInfo['watchers'] ) )
+ Html::element( 'td', array(), $this->msg( 'pageinfo-watchers' )->text() ) .
+ Html::element( 'td', array( 'colspan' => 2 ), $this->getLanguage()->formatNum( $pageInfo['watchers'] ) )
)
).
( $wgDisableCounters ? '' :
Html::rawElement( 'tr', array(),
- Html::element( 'th', array( 'colspan' => 3 ), wfMsg( 'pageinfo-header-views' ) )
+ Html::element( 'th', array( 'colspan' => 3 ), $this->msg( 'pageinfo-header-views' )->text() )
) .
Html::rawElement( 'tr', array(),
- Html::element( 'td', array(), wfMsg( 'pageinfo-views' ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( $pageInfo['views'] ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( $talkInfo['views'] ) )
+ Html::element( 'td', array(), $this->msg( 'pageinfo-views' )->text() ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( $pageInfo['views'] ) ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( $talkInfo['views'] ) )
) .
Html::rawElement( 'tr', array(),
- Html::element( 'td', array(), wfMsg( 'pageinfo-viewsperedit' ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( sprintf( '%.2f', $pageInfo['edits'] ? $pageInfo['views'] / $pageInfo['edits'] : 0 ) ) ) .
- Html::element( 'td', array(), $this->getLang()->formatNum( sprintf( '%.2f', $talkInfo['edits'] ? $talkInfo['views'] / $talkInfo['edits'] : 0 ) ) )
+ Html::element( 'td', array(), $this->msg( 'pageinfo-viewsperedit' )->text() ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( sprintf( '%.2f', $pageInfo['edits'] ? $pageInfo['views'] / $pageInfo['edits'] : 0 ) ) ) .
+ Html::element( 'td', array(), $this->getLanguage()->formatNum( sprintf( '%.2f', $talkInfo['edits'] ? $talkInfo['views'] / $talkInfo['edits'] : 0 ) ) )
)
)
);
diff --git a/includes/actions/MarkpatrolledAction.php b/includes/actions/MarkpatrolledAction.php
index a5d76627..ae9223f4 100644
--- a/includes/actions/MarkpatrolledAction.php
+++ b/includes/actions/MarkpatrolledAction.php
@@ -28,30 +28,25 @@ class MarkpatrolledAction extends FormlessAction {
return 'markpatrolled';
}
- public function getRestriction() {
- return 'read';
- }
-
protected function getDescription() {
return '';
}
- protected function checkCanExecute( User $user ) {
- if ( !$user->matchEditToken( $this->getRequest()->getVal( 'token' ), $this->getRequest()->getInt( 'rcid' ) ) ) {
- throw new ErrorPageError( 'sessionfailure-title', 'sessionfailure' );
- }
-
- return parent::checkCanExecute( $user );
- }
-
public function onView() {
- $rc = RecentChange::newFromId( $this->getRequest()->getInt( 'rcid' ) );
+ $request = $this->getRequest();
+ $rcId = $request->getInt( 'rcid' );
+ $rc = RecentChange::newFromId( $rcId );
if ( is_null( $rc ) ) {
throw new ErrorPageError( 'markedaspatrollederror', 'markedaspatrollederrortext' );
}
- $errors = $rc->doMarkPatrolled( $this->getUser() );
+ $user = $this->getUser();
+ if ( !$user->matchEditToken( $request->getVal( 'token' ), $rcId ) ) {
+ throw new ErrorPageError( 'sessionfailure-title', 'sessionfailure' );
+ }
+
+ $errors = $rc->doMarkPatrolled( $user );
if ( in_array( array( 'rcpatroldisabled' ), $errors ) ) {
throw new ErrorPageError( 'rcpatroldisabled', 'rcpatroldisabledtext' );
@@ -67,19 +62,18 @@ class MarkpatrolledAction extends FormlessAction {
$return = SpecialPage::getTitleFor( $returnto );
if ( in_array( array( 'markedaspatrollederror-noautopatrol' ), $errors ) ) {
- $this->getOutput()->setPageTitle( wfMsg( 'markedaspatrollederror' ) );
+ $this->getOutput()->setPageTitle( $this->msg( 'markedaspatrollederror' ) );
$this->getOutput()->addWikiMsg( 'markedaspatrollederror-noautopatrol' );
$this->getOutput()->returnToMain( null, $return );
return;
}
- if ( !empty( $errors ) ) {
- $this->getOutput()->showPermissionsErrorPage( $errors );
- return;
+ if ( count( $errors ) ) {
+ throw new PermissionsError( 'patrol', $errors );
}
# Inform the user
- $this->getOutput()->setPageTitle( wfMsg( 'markedaspatrolled' ) );
+ $this->getOutput()->setPageTitle( $this->msg( 'markedaspatrolled' ) );
$this->getOutput()->addWikiMsg( 'markedaspatrolledtext', $rc->getTitle()->getPrefixedText() );
$this->getOutput()->returnToMain( null, $return );
}
diff --git a/includes/actions/ProtectAction.php b/includes/actions/ProtectAction.php
new file mode 100644
index 00000000..f053ede7
--- /dev/null
+++ b/includes/actions/ProtectAction.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * action=protect handler
+ *
+ * Copyright © 2012 Timo Tijhof
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ * @ingroup Actions
+ * @author Timo Tijhof
+ */
+
+class ProtectAction extends FormlessAction {
+
+ public function getName() {
+ return 'protect';
+ }
+
+ public function onView(){
+ return null;
+ }
+
+ public function show(){
+
+ $this->page->protect();
+
+ }
+
+}
+
+class UnprotectAction extends ProtectAction {
+
+ public function getName() {
+ return 'unprotect';
+ }
+
+ public function show(){
+
+ $this->page->unprotect();
+
+ }
+
+}
diff --git a/includes/actions/PurgeAction.php b/includes/actions/PurgeAction.php
index 29cbf3ae..21a6d904 100644
--- a/includes/actions/PurgeAction.php
+++ b/includes/actions/PurgeAction.php
@@ -31,10 +31,6 @@ class PurgeAction extends FormAction {
return 'purge';
}
- public function getRestriction() {
- return null;
- }
-
public function requiresUnblock() {
return false;
}
@@ -52,8 +48,7 @@ class PurgeAction extends FormAction {
}
public function onSubmit( $data ) {
- $this->page->doPurge();
- return true;
+ return $this->page->doPurge();
}
/**
@@ -71,8 +66,9 @@ class PurgeAction extends FormAction {
$this->getRequest()->getQueryValues(),
array( 'title' => null, 'action' => null )
) );
- $this->onSubmit( array() );
- $this->onSuccess();
+ if( $this->onSubmit( array() ) ) {
+ $this->onSuccess();
+ }
} else {
$this->redirectParams = $this->getRequest()->getVal( 'redirectparams', '' );
$form = $this->getForm();
diff --git a/includes/actions/RawAction.php b/includes/actions/RawAction.php
new file mode 100644
index 00000000..e4c6b3e0
--- /dev/null
+++ b/includes/actions/RawAction.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Raw page text accessor
+ *
+ * Copyright © 2004 Gabriel Wicke <wicke@wikidev.net>
+ * http://wikidev.net/
+ *
+ * Based on HistoryPage and SpecialExport
+ *
+ * License: GPL (http://www.gnu.org/copyleft/gpl.html)
+ *
+ * @author Gabriel Wicke <wicke@wikidev.net>
+ * @file
+ */
+
+/**
+ * A simple method to retrieve the plain source of an article,
+ * using "action=raw" in the GET request string.
+ */
+class RawAction extends FormlessAction {
+ private $mGen;
+
+ public function getName() {
+ return 'raw';
+ }
+
+ public function requiresWrite() {
+ return false;
+ }
+
+ public function requiresUnblock() {
+ return false;
+ }
+
+ function onView() {
+ global $wgGroupPermissions, $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+
+ $this->getOutput()->disable();
+ $request = $this->getRequest();
+
+ if ( !$request->checkUrlExtension() ) {
+ return;
+ }
+
+ if ( $this->getOutput()->checkLastModified( $this->page->getTouched() ) ) {
+ return; // Client cache fresh and headers sent, nothing more to do.
+ }
+
+ # special case for 'generated' raw things: user css/js
+ # This is deprecated and will only return empty content
+ $gen = $request->getVal( 'gen' );
+ $smaxage = $request->getIntOrNull( 'smaxage' );
+
+ if ( $gen == 'css' || $gen == 'js' ) {
+ $this->mGen = $gen;
+ if ( $smaxage === null ) {
+ $smaxage = $wgSquidMaxage;
+ }
+ } else {
+ $this->mGen = false;
+ }
+
+ $contentType = $this->getContentType();
+
+ # Force caching for CSS and JS raw content, default: 5 minutes
+ if ( $smaxage === null ) {
+ if ( $contentType == 'text/css' || $contentType == $wgJsMimeType ) {
+ $smaxage = intval( $wgForcedRawSMaxage );
+ } else {
+ $smaxage = 0;
+ }
+ }
+
+ $maxage = $request->getInt( 'maxage', $wgSquidMaxage );
+
+ $response = $request->response();
+
+ $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
+ # Output may contain user-specific data;
+ # vary generated content for open sessions on private wikis
+ $privateCache = !$wgGroupPermissions['*']['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 );
+
+ $text = $this->getRawText();
+
+ if ( $text === false && $contentType == 'text/x-wiki' ) {
+ # Don't return a 404 response for CSS or JavaScript;
+ # 404s aren't generally cached and it would create
+ # extra hits when user CSS/JS are on and the user doesn't
+ # have the pages.
+ $response->header( 'HTTP/1.x 404 Not Found' );
+ }
+
+ if ( !wfRunHooks( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
+ wfDebug( __METHOD__ . ": RawPageViewBeforeOutput hook broke raw page output.\n" );
+ }
+
+ echo $text;
+ }
+
+ /**
+ * Get the text that should be returned, or false if the page or revision
+ * was not found.
+ *
+ * @return String|Bool
+ */
+ public function getRawText() {
+ global $wgParser;
+
+ # No longer used
+ if( $this->mGen ) {
+ return '';
+ }
+
+ $text = false;
+ $title = $this->getTitle();
+ $request = $this->getRequest();
+
+ // If it's a MediaWiki message we can just hit the message cache
+ if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
+ $key = $title->getDBkey();
+ $msg = wfMessage( $key )->inContentLanguage();
+ # If the message doesn't exist, return a blank
+ $text = !$msg->exists() ? '' : $msg->plain();
+ } else {
+ // Get it from the DB
+ $rev = Revision::newFromTitle( $title, $this->getOldId() );
+ if ( $rev ) {
+ $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
+ $request->response()->header( "Last-modified: $lastmod" );
+
+ // Public-only due to cache headers
+ $text = $rev->getText();
+ $section = $request->getIntOrNull( 'section' );
+ if ( $section !== null ) {
+ $text = $wgParser->getSection( $text, $section );
+ }
+ }
+ }
+
+ if ( $text !== false && $text !== '' && $request->getVal( 'templates' ) === 'expand' ) {
+ $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+ }
+
+ return $text;
+ }
+
+ /**
+ * Get the ID of the revision that should used to get the text.
+ *
+ * @return Integer
+ */
+ public function getOldId() {
+ $oldid = $this->getRequest()->getInt( 'oldid' );
+ switch ( $this->getRequest()->getText( 'direction' ) ) {
+ case 'next':
+ # output next revision, or nothing if there isn't one
+ 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 ) {
+ # get the current revision so we can get the penultimate one
+ $oldid = $this->page->getLatest();
+ }
+ $prev = $this->getTitle()->getPreviousRevisionId( $oldid );
+ $oldid = $prev ? $prev : -1 ;
+ break;
+ case 'cur':
+ $oldid = 0;
+ break;
+ }
+ return $oldid;
+ }
+
+ /**
+ * Get the content type to use for the response
+ *
+ * @return String
+ */
+ public function getContentType() {
+ global $wgJsMimeType;
+
+ $ctype = $this->getRequest()->getVal( 'ctype' );
+
+ if ( $ctype == '' ) {
+ $gen = $this->getRequest()->getVal( 'gen' );
+ if ( $gen == 'js' ) {
+ $ctype = $wgJsMimeType;
+ } elseif ( $gen == 'css' ) {
+ $ctype = 'text/css';
+ }
+ }
+
+ $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
+ if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
+ $ctype = 'text/x-wiki';
+ }
+
+ return $ctype;
+ }
+}
+
+/**
+ * Backward compatibility for extensions
+ *
+ * @deprecated in 1.19
+ */
+class RawPage extends RawAction {
+ public $mOldId;
+
+ function __construct( Page $page, $request = false ) {
+ wfDeprecated( __CLASS__, '1.19' );
+ parent::__construct( $page );
+
+ if ( $request !== false ) {
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setRequest( $request );
+ $this->context = $context;
+ }
+ }
+
+ public function view() {
+ $this->onView();
+ }
+
+ public function getOldId() {
+ # Some extensions like to set $mOldId
+ if ( $this->mOldId !== null ) {
+ return $this->mOldId;
+ }
+ return parent::getOldId();
+ }
+}
diff --git a/includes/actions/RenderAction.php b/includes/actions/RenderAction.php
new file mode 100644
index 00000000..80af79cc
--- /dev/null
+++ b/includes/actions/RenderAction.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Handle action=render
+ *
+ * Copyright © 2012 Timo Tijhof
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ * @ingroup Actions
+ * @author Timo Tijhof
+ */
+
+class RenderAction extends FormlessAction {
+
+ public function getName() {
+ return 'render';
+ }
+
+ public function onView(){
+ return null;
+ }
+
+ public function show(){
+
+ $this->page->render();
+
+ }
+
+}
diff --git a/includes/actions/RevertAction.php b/includes/actions/RevertAction.php
index bcb8cd8b..f9497f4b 100644
--- a/includes/actions/RevertAction.php
+++ b/includes/actions/RevertAction.php
@@ -17,7 +17,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
* @file
- * @ingroup Action
+ * @ingroup Actions
* @ingroup Media
* @author Alexandre Emsenhuber
* @author Rob Church <robchur@gmail.com>
@@ -26,7 +26,7 @@
/**
* Dummy class for pages not in NS_FILE
*
- * @ingroup Action
+ * @ingroup Actions
*/
class RevertAction extends Action {
@@ -34,10 +34,6 @@ class RevertAction extends Action {
return 'revert';
}
- public function getRestriction() {
- return 'read';
- }
-
public function show() {
$this->getOutput()->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
}
@@ -48,7 +44,7 @@ class RevertAction extends Action {
/**
* Class for pages in NS_FILE
*
- * @ingroup Action
+ * @ingroup Actions
*/
class RevertFileAction extends FormAction {
protected $oldFile;
@@ -95,7 +91,7 @@ class RevertFileAction extends FormAction {
'vertical-label' => true,
'raw' => true,
'default' => wfMsgExt( 'filerevert-intro', 'parse', $this->getTitle()->getText(),
- $this->getLang()->date( $timestamp, true ), $this->getLang()->time( $timestamp, true ),
+ $this->getLanguage()->date( $timestamp, true ), $this->getLanguage()->time( $timestamp, true ),
wfExpandUrl( $this->page->getFile()->getArchiveUrl( $this->getRequest()->getText( 'oldimage' ) ),
PROTO_CURRENT
) )
@@ -119,8 +115,8 @@ class RevertFileAction extends FormAction {
public function onSuccess() {
$timestamp = $this->oldFile->getTimestamp();
$this->getOutput()->addHTML( wfMsgExt( 'filerevert-success', 'parse', $this->getTitle()->getText(),
- $this->getLang()->date( $timestamp, true ),
- $this->getLang()->time( $timestamp, true ),
+ $this->getLanguage()->date( $timestamp, true ),
+ $this->getLanguage()->time( $timestamp, true ),
wfExpandUrl( $this->page->getFile()->getArchiveUrl( $this->getRequest()->getText( 'oldimage' ) ),
PROTO_CURRENT
) ) );
@@ -132,9 +128,7 @@ class RevertFileAction extends FormAction {
}
protected function getDescription() {
- return wfMsg(
- 'filerevert-backlink',
- Linker::linkKnown( $this->getTitle() )
- );
+ $this->getOutput()->addBacklinkSubtitle( $this->getTitle() );
+ return '';
}
}
diff --git a/includes/actions/RevisiondeleteAction.php b/includes/actions/RevisiondeleteAction.php
index 2ac03d18..f07e493d 100644
--- a/includes/actions/RevisiondeleteAction.php
+++ b/includes/actions/RevisiondeleteAction.php
@@ -29,10 +29,6 @@ class RevisiondeleteAction extends FormlessAction {
return 'revisiondelete';
}
- public function getRestriction() {
- return null;
- }
-
public function requiresUnblock() {
return false;
}
diff --git a/includes/actions/RollbackAction.php b/includes/actions/RollbackAction.php
index 9036ebf5..ebb34c78 100644
--- a/includes/actions/RollbackAction.php
+++ b/includes/actions/RollbackAction.php
@@ -17,13 +17,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
* @file
- * @ingroup Action
+ * @ingroup Actions
*/
/**
* User interface for the rollback action
*
- * @ingroup Action
+ * @ingroup Actions
*/
class RollbackAction extends FormlessAction {
@@ -54,7 +54,7 @@ class RollbackAction extends FormlessAction {
}
if ( isset( $result[0][0] ) && ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' ) ) {
- $this->getOutput()->setPageTitle( wfMsg( 'rollbackfailed' ) );
+ $this->getOutput()->setPageTitle( $this->msg( 'rollbackfailed' ) );
$errArray = $result[0];
$errMsg = array_shift( $errArray );
$this->getOutput()->addWikiMsgArray( $errMsg, $errArray );
@@ -83,9 +83,7 @@ class RollbackAction extends FormlessAction {
$out [] = $error;
}
}
- $this->getOutput()->showPermissionsErrorPage( $out );
-
- return;
+ throw new PermissionsError( 'rollback', $out );
}
if ( $result == array( array( 'readonlytext' ) ) ) {
@@ -95,7 +93,7 @@ class RollbackAction extends FormlessAction {
$current = $details['current'];
$target = $details['target'];
$newId = $details['newid'];
- $this->getOutput()->setPageTitle( wfMsg( 'actioncomplete' ) );
+ $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
$this->getOutput()->setRobotPolicy( 'noindex,nofollow' );
if ( $current->getUserText() === '' ) {
@@ -111,7 +109,7 @@ class RollbackAction extends FormlessAction {
$this->getOutput()->returnToMain( false, $this->getTitle() );
if ( !$request->getBool( 'hidediff', false ) && !$this->getUser()->getBoolOption( 'norollbackdiff', false ) ) {
- $de = new DifferenceEngine( $this->getTitle(), $current->getId(), $newId, false, true );
+ $de = new DifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true );
$de->showDiff( '', '' );
}
}
diff --git a/includes/actions/ViewAction.php b/includes/actions/ViewAction.php
new file mode 100644
index 00000000..4e37381b
--- /dev/null
+++ b/includes/actions/ViewAction.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * An action that views article content
+ *
+ * Copyright © 2012 Timo Tijhof
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * @file
+ * @ingroup Actions
+ * @author Timo Tijhof
+ */
+
+class ViewAction extends FormlessAction {
+
+ public function getName() {
+ return 'view';
+ }
+
+ public function onView(){
+ return null;
+ }
+
+ public function show(){
+ global $wgSquidMaxage;
+
+ $this->getOutput()->setSquidMaxage( $wgSquidMaxage );
+ $this->page->view();
+ }
+
+}
diff --git a/includes/actions/WatchAction.php b/includes/actions/WatchAction.php
index 52e66754..63d9b151 100644
--- a/includes/actions/WatchAction.php
+++ b/includes/actions/WatchAction.php
@@ -26,16 +26,12 @@ class WatchAction extends FormAction {
return 'watch';
}
- public function getRestriction() {
- return 'read';
- }
-
public function requiresUnblock() {
return false;
}
protected function getDescription() {
- return wfMsg( 'addwatch' );
+ return wfMsgHtml( 'addwatch' );
}
/**
@@ -87,7 +83,7 @@ class WatchAction extends FormAction {
}
public static function doWatch( Title $title, User $user ) {
- $page = new Article( $title, 0 );
+ $page = WikiPage::factory( $title );
if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
$user->addWatch( $title );
@@ -97,7 +93,7 @@ class WatchAction extends FormAction {
}
public static function doUnwatch( Title $title, User $user ) {
- $page = new Article( $title, 0 );
+ $page = WikiPage::factory( $title );
if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
$user->removeWatch( $title );
@@ -110,7 +106,7 @@ class WatchAction extends FormAction {
* Get token to watch (or unwatch) a page for a user
*
* @param Title $title Title object of page to watch
- * @param User $title User for whom the action is going to be performed
+ * @param User $user User for whom the action is going to be performed
* @param string $action Optionally override the action to 'unwatch'
* @return string Token
* @since 1.18
@@ -123,14 +119,14 @@ class WatchAction extends FormAction {
// This token stronger salted and not compatible with ApiWatch
// It's title/action specific because index.php is GET and API is POST
- return $user->editToken( $salt );
+ return $user->getEditToken( $salt );
}
/**
* Get token to unwatch (or watch) a page for a user
*
* @param Title $title Title object of page to unwatch
- * @param User $title User for whom the action is going to be performed
+ * @param User $user User for whom the action is going to be performed
* @param string $action Optionally override the action to 'watch'
* @return string Token
* @since 1.18
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index 9fe96199..a586f688 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -39,7 +39,7 @@
*
* @ingroup API
*/
-abstract class ApiBase {
+abstract class ApiBase extends ContextSource {
// These constants allow modules to specify exactly how to treat incoming parameters.
@@ -72,6 +72,10 @@ abstract class ApiBase {
$this->mMainModule = $mainModule;
$this->mModuleName = $moduleName;
$this->mModulePrefix = $modulePrefix;
+
+ if ( !$this->isMain() ) {
+ $this->setContext( $mainModule->getContext() );
+ }
}
/*****************************************************************************
@@ -179,16 +183,12 @@ abstract class ApiBase {
* The object will have the WebRequest and the User object set to the ones
* used in this instance.
*
- * @return RequestContext
+ * @deprecated since 1.19 use getContext to get the current context
+ * @return DerivativeContext
*/
public function createContext() {
- global $wgUser;
-
- $context = new RequestContext;
- $context->setRequest( $this->getMain()->getRequest() );
- $context->setUser( $wgUser ); /// @todo FIXME: we should store the User object
-
- return $context;
+ wfDeprecated( __METHOD__, '1.19' );
+ return new DerivativeContext( $this->getContext() );
}
/**
@@ -236,7 +236,7 @@ abstract class ApiBase {
public function makeHelpMsg() {
static $lnPrfx = "\n ";
- $msg = $this->getDescription();
+ $msg = $this->getFinalDescription();
if ( $msg !== false ) {
@@ -267,7 +267,30 @@ abstract class ApiBase {
$msg .= "Parameters:\n$paramsMsg";
}
- $msg .= $this->makeHelpArrayToString( $lnPrfx, "Example", $this->getExamples() );
+ $examples = $this->getExamples();
+ if ( $examples !== false && $examples !== '' ) {
+ if ( !is_array( $examples ) ) {
+ $examples = array(
+ $examples
+ );
+ }
+ $msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
+ foreach( $examples as $k => $v ) {
+
+ if ( is_numeric( $k ) ) {
+ $msg .= " $v\n";
+ } else {
+ $v .= ":";
+ if ( is_array( $v ) ) {
+ $msgExample = implode( "\n", array_map( array( $this, 'indentExampleText' ), $v ) );
+ } else {
+ $msgExample = " $v";
+ }
+ $msg .= wordwrap( $msgExample, 100, "\n" ) . "\n $k\n";
+ }
+ }
+ }
+
$msg .= $this->makeHelpArrayToString( $lnPrfx, "Help page", $this->getHelpUrls() );
if ( $this->getMain()->getShowVersions() ) {
@@ -292,6 +315,14 @@ abstract class ApiBase {
}
/**
+ * @param $item string
+ * @return string
+ */
+ private function indentExampleText( $item ) {
+ return " " . $item;
+ }
+
+ /**
* @param $prefix string Text to split output items
* @param $title string What is being output
* @param $input string|array
@@ -341,20 +372,20 @@ abstract class ApiBase {
}
$deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] ) ?
- $paramSettings[self::PARAM_DEPRECATED] : false;
+ $paramSettings[self::PARAM_DEPRECATED] : false;
if ( $deprecated ) {
$desc = "DEPRECATED! $desc";
}
$required = isset( $paramSettings[self::PARAM_REQUIRED] ) ?
- $paramSettings[self::PARAM_REQUIRED] : false;
+ $paramSettings[self::PARAM_REQUIRED] : false;
if ( $required ) {
$desc .= $paramPrefix . "This parameter is required";
}
$type = isset( $paramSettings[self::PARAM_TYPE] ) ? $paramSettings[self::PARAM_TYPE] : null;
if ( isset( $type ) ) {
- if ( isset( $paramSettings[self::PARAM_ISMULTI] ) ) {
+ if ( isset( $paramSettings[self::PARAM_ISMULTI] ) && $paramSettings[self::PARAM_ISMULTI] ) {
$prompt = 'Values (separate with \'|\'): ';
} else {
$prompt = 'One value: ';
@@ -411,7 +442,7 @@ abstract class ApiBase {
if ( !$isArray
|| $isArray && count( $paramSettings[self::PARAM_TYPE] ) > self::LIMIT_SML1 ) {
$desc .= $paramPrefix . "Maximum number of values " .
- self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
+ self::LIMIT_SML1 . " (" . self::LIMIT_SML2 . " for bots)";
}
}
}
@@ -437,6 +468,7 @@ abstract class ApiBase {
* Callback for preg_replace_callback() call in makeHelpMsg().
* Replaces a source file name with a link to ViewVC
*
+ * @param $matches array
* @return string
*/
public function makeHelpMsg_callback( $matches ) {
@@ -464,8 +496,8 @@ abstract class ApiBase {
// returning the version string for ApiBase work
if ( $path ) {
return "{$matches[0]}\n https://svn.wikimedia.org/" .
- "viewvc/mediawiki/trunk/" . dirname( $path ) .
- "/{$matches[2]}";
+ "viewvc/mediawiki/trunk/" . dirname( $path ) .
+ "/{$matches[2]}";
}
return $matches[0];
}
@@ -510,6 +542,7 @@ abstract class ApiBase {
/**
* Get final list of parameters, after hooks have had a chance to
* tweak it as needed.
+ *
* @return array or false
*/
public function getFinalParams() {
@@ -519,8 +552,9 @@ abstract class ApiBase {
}
/**
- * Get final description, after hooks have had a chance to tweak it as
+ * Get final parameter descriptions, after hooks have had a chance to tweak it as
* needed.
+ *
* @return array
*/
public function getFinalParamDescription() {
@@ -530,6 +564,18 @@ abstract class ApiBase {
}
/**
+ * Get final module description, after hooks have had a chance to tweak it as
+ * needed.
+ *
+ * @return array
+ */
+ public function getFinalDescription() {
+ $desc = $this->getDescription();
+ wfRunHooks( 'APIGetDescription', array( &$this, &$desc ) );
+ return $desc;
+ }
+
+ /**
* This method mangles parameter name based on the prefix supplied to the constructor.
* Override this method to change parameter name during runtime
* @param $paramName string Parameter name
@@ -586,7 +632,7 @@ abstract class ApiBase {
array_shift( $required );
$intersection = array_intersect( array_keys( array_filter( $params,
- array( $this, "parameterNotEmpty" ) ) ), $required );
+ array( $this, "parameterNotEmpty" ) ) ), $required );
if ( count( $intersection ) > 1 ) {
$this->dieUsage( 'The parameters ' . implode( ', ', $intersection ) . ' can not be used together', 'invalidparammix' );
@@ -621,7 +667,7 @@ abstract class ApiBase {
array_shift( $required );
$intersection = array_intersect( array_keys( array_filter( $params,
- array( $this, "parameterNotEmpty" ) ) ), $required );
+ array( $this, "parameterNotEmpty" ) ) ), $required );
if ( count( $intersection ) > 1 ) {
$this->dieUsage( 'The parameters ' . implode( ', ', $intersection ) . ' can not be used together', 'invalidparammix' );
@@ -655,8 +701,11 @@ abstract class ApiBase {
/**
* @deprecated since 1.17 use MWNamespace::getValidNamespaces()
+ *
+ * @return array
*/
public static function getValidNamespaces() {
+ wfDeprecated( __METHOD__, '1.17' );
return MWNamespace::getValidNamespaces();
}
@@ -672,7 +721,6 @@ abstract class ApiBase {
$userWatching = $titleObj->userIsWatching();
- global $wgUser;
switch ( $watchlist ) {
case 'watch':
return true;
@@ -688,10 +736,10 @@ abstract class ApiBase {
# If no user option was passed, use watchdefault or watchcreation
if ( is_null( $userOption ) ) {
$userOption = $titleObj->exists()
- ? 'watchdefault' : 'watchcreations';
+ ? 'watchdefault' : 'watchcreations';
}
# Watch the article based on the user preference
- return (bool)$wgUser->getOption( $userOption );
+ return (bool)$this->getUser()->getOption( $userOption );
case 'nochange':
return $userWatching;
@@ -713,11 +761,11 @@ abstract class ApiBase {
return;
}
- global $wgUser;
+ $user = $this->getUser();
if ( $value ) {
- WatchAction::doWatch( $titleObj, $wgUser );
+ WatchAction::doWatch( $titleObj, $user );
} else {
- WatchAction::doUnwatch( $titleObj, $wgUser );
+ WatchAction::doUnwatch( $titleObj, $user );
}
}
@@ -765,9 +813,9 @@ abstract class ApiBase {
ApiBase::dieDebug( __METHOD__, "Boolean param $encParamName's default is set to '$default'" );
}
- $value = $this->getMain()->getRequest()->getCheck( $encParamName );
+ $value = $this->getRequest()->getCheck( $encParamName );
} else {
- $value = $this->getMain()->getRequest()->getVal( $encParamName, $default );
+ $value = $this->getRequest()->getVal( $encParamName, $default );
if ( isset( $value ) && $type == 'namespace' ) {
$type = MWNamespace::getValidNamespaces();
@@ -904,13 +952,18 @@ abstract class ApiBase {
// This is a bit awkward, but we want to avoid calling canApiHighLimits() because it unstubs $wgUser
$valuesList = explode( '|', $value, self::LIMIT_SML2 + 1 );
$sizeLimit = count( $valuesList ) > self::LIMIT_SML1 && $this->mMainModule->canApiHighLimits() ?
- self::LIMIT_SML2 : self::LIMIT_SML1;
+ self::LIMIT_SML2 : self::LIMIT_SML1;
if ( self::truncateArray( $valuesList, $sizeLimit ) ) {
$this->setWarning( "Too many values supplied for parameter '$valueName': the limit is $sizeLimit" );
}
if ( !$allowMultiple && count( $valuesList ) != 1 ) {
+ // Bug 33482 - Allow entries with | in them for non-multiple values
+ if ( in_array( $value, $allowedValues ) ) {
+ return $value;
+ }
+
$possibleValues = is_array( $allowedValues ) ? "of '" . implode( "', '", $allowedValues ) . "'" : '';
$this->dieUsage( "Only one $possibleValues is allowed for parameter '$valueName'", "multival_$valueName" );
}
@@ -1037,17 +1090,17 @@ abstract class ApiBase {
*/
public static $messageMap = array(
// This one MUST be present, or dieUsageMsg() will recurse infinitely
- 'unknownerror' => array( 'code' => 'unknownerror', 'info' => "Unknown error: ``\$1''" ),
+ 'unknownerror' => array( 'code' => 'unknownerror', 'info' => "Unknown error: \"\$1\"" ),
'unknownerror-nocode' => array( 'code' => 'unknownerror', 'info' => 'Unknown error' ),
// Messages from Title::getUserPermissionsErrors()
'ns-specialprotected' => array( 'code' => 'unsupportednamespace', 'info' => "Pages in the Special namespace can't be edited" ),
'protectedinterface' => array( 'code' => 'protectednamespace-interface', 'info' => "You're not allowed to edit interface messages" ),
- 'namespaceprotected' => array( 'code' => 'protectednamespace', 'info' => "You're not allowed to edit pages in the ``\$1'' namespace" ),
+ 'namespaceprotected' => array( 'code' => 'protectednamespace', 'info' => "You're not allowed to edit pages in the \"\$1\" namespace" ),
'customcssprotected' => array( 'code' => 'customcssprotected', 'info' => "You're not allowed to edit custom CSS pages" ),
'customjsprotected' => array( 'code' => 'customjsprotected', 'info' => "You're not allowed to edit custom JavaScript pages" ),
'cascadeprotected' => array( 'code' => 'cascadeprotected', 'info' => "The page you're trying to edit is protected because it's included in a cascade-protected page" ),
- 'protectedpagetext' => array( 'code' => 'protectedpage', 'info' => "The ``\$1'' right is required to edit this page" ),
+ 'protectedpagetext' => array( 'code' => 'protectedpage', 'info' => "The \"\$1\" right is required to edit this page" ),
'protect-cantedit' => array( 'code' => 'cantedit', 'info' => "You can't protect this page because you can't edit it" ),
'badaccess-group0' => array( 'code' => 'permissiondenied', 'info' => "Permission denied" ), // Generic permission denied message
'badaccess-groups' => array( 'code' => 'permissiondenied', 'info' => "Permission denied" ),
@@ -1066,7 +1119,7 @@ abstract class ApiBase {
'cantrollback' => array( 'code' => 'onlyauthor', 'info' => "The page you tried to rollback only has one author" ),
'readonlytext' => array( 'code' => 'readonly', 'info' => "The wiki is currently in read-only mode" ),
'sessionfailure' => array( 'code' => 'badtoken', 'info' => "Invalid token" ),
- 'cannotdelete' => array( 'code' => 'cantdelete', 'info' => "Couldn't delete ``\$1''. Maybe it was deleted already by someone else" ),
+ 'cannotdelete' => array( 'code' => 'cantdelete', 'info' => "Couldn't delete \"\$1\". Maybe it was deleted already by someone else" ),
'notanarticle' => array( 'code' => 'missingtitle', 'info' => "The page you requested doesn't exist" ),
'selfmove' => array( 'code' => 'selfmove', 'info' => "Can't move a page to itself" ),
'immobile_namespace' => array( 'code' => 'immobilenamespace', 'info' => "You tried to move pages from or to a namespace that is protected from moving" ),
@@ -1084,7 +1137,7 @@ abstract class ApiBase {
'badipaddress' => array( 'code' => 'invalidip', 'info' => "Invalid IP address specified" ),
'ipb_expiry_invalid' => array( 'code' => 'invalidexpiry', 'info' => "Invalid expiry time" ),
'ipb_already_blocked' => array( 'code' => 'alreadyblocked', 'info' => "The user you tried to block was already blocked" ),
- 'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address ``\$1'' was blocked as part of range ``\$2''. You can't unblock the IP invidually, but you can unblock the range as a whole." ),
+ 'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP invidually, but you can unblock the range as a whole." ),
'ipb_cant_unblock' => array( 'code' => 'cantunblock', 'info' => "The block you specified was not found. It may have been unblocked already" ),
'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed e-mail address, or you are not allowed to send e-mail to other users, so you cannot send e-mail" ),
'ipbblocked' => array( 'code' => 'ipbblocked', 'info' => 'You cannot block or unblock users while you are yourself blocked' ),
@@ -1098,9 +1151,9 @@ abstract class ApiBase {
'delete-toobig' => array( 'code' => 'bigdelete', 'info' => "You can't delete this page because it has more than \$1 revisions" ),
'movenotallowedfile' => array( 'code' => 'cantmovefile', 'info' => "You don't have permission to move files" ),
'userrights-no-interwiki' => array( 'code' => 'nointerwikiuserrights', 'info' => "You don't have permission to change user rights on other wikis" ),
- 'userrights-nodatabase' => array( 'code' => 'nosuchdatabase', 'info' => "Database ``\$1'' does not exist or is not local" ),
- 'nouserspecified' => array( 'code' => 'invaliduser', 'info' => "Invalid username ``\$1''" ),
- 'noname' => array( 'code' => 'invaliduser', 'info' => "Invalid username ``\$1''" ),
+ 'userrights-nodatabase' => array( 'code' => 'nosuchdatabase', 'info' => "Database \"\$1\" does not exist or is not local" ),
+ 'nouserspecified' => array( 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ),
+ 'noname' => array( 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ),
'summaryrequired' => array( 'code' => 'summaryrequired', 'info' => 'Summary required' ),
// API-specific messages
@@ -1108,13 +1161,13 @@ abstract class ApiBase {
'writedisabled' => array( 'code' => 'noapiwrite', 'info' => "Editing of this wiki through the API is disabled. Make sure the \$wgEnableWriteAPI=true; statement is included in the wiki's LocalSettings.php file" ),
'writerequired' => array( 'code' => 'writeapidenied', 'info' => "You're not allowed to edit this wiki through the API" ),
'missingparam' => array( 'code' => 'no$1', 'info' => "The \$1 parameter must be set" ),
- 'invalidtitle' => array( 'code' => 'invalidtitle', 'info' => "Bad title ``\$1''" ),
+ 'invalidtitle' => array( 'code' => 'invalidtitle', 'info' => "Bad title \"\$1\"" ),
'nosuchpageid' => array( 'code' => 'nosuchpageid', 'info' => "There is no page with ID \$1" ),
'nosuchrevid' => array( 'code' => 'nosuchrevid', 'info' => "There is no revision with ID \$1" ),
- 'nosuchuser' => array( 'code' => 'nosuchuser', 'info' => "User ``\$1'' doesn't exist" ),
- 'invaliduser' => array( 'code' => 'invaliduser', 'info' => "Invalid username ``\$1''" ),
- 'invalidexpiry' => array( 'code' => 'invalidexpiry', 'info' => "Invalid expiry time ``\$1''" ),
- 'pastexpiry' => array( 'code' => 'pastexpiry', 'info' => "Expiry time ``\$1'' is in the past" ),
+ 'nosuchuser' => array( 'code' => 'nosuchuser', 'info' => "User \"\$1\" doesn't exist" ),
+ 'invaliduser' => array( 'code' => 'invaliduser', 'info' => "Invalid username \"\$1\"" ),
+ 'invalidexpiry' => array( 'code' => 'invalidexpiry', 'info' => "Invalid expiry time \"\$1\"" ),
+ 'pastexpiry' => array( 'code' => 'pastexpiry', 'info' => "Expiry time \"\$1\" is in the past" ),
'create-titleexists' => array( 'code' => 'create-titleexists', 'info' => "Existing titles can't be protected with 'create'" ),
'missingtitle-createonly' => array( 'code' => 'missingtitle-createonly', 'info' => "Missing titles can only be protected with 'create'" ),
'cantblock' => array( 'code' => 'cantblock', 'info' => "You don't have permission to block users" ),
@@ -1127,9 +1180,9 @@ abstract class ApiBase {
'permdenied-undelete' => array( 'code' => 'permissiondenied', 'info' => "You don't have permission to restore deleted revisions" ),
'createonly-exists' => array( 'code' => 'articleexists', 'info' => "The article you tried to create has been created already" ),
'nocreate-missing' => array( 'code' => 'missingtitle', 'info' => "The article you tried to edit doesn't exist" ),
- 'nosuchrcid' => array( 'code' => 'nosuchrcid', 'info' => "There is no change with rcid ``\$1''" ),
- 'protect-invalidaction' => array( 'code' => 'protect-invalidaction', 'info' => "Invalid protection type ``\$1''" ),
- 'protect-invalidlevel' => array( 'code' => 'protect-invalidlevel', 'info' => "Invalid protection level ``\$1''" ),
+ 'nosuchrcid' => array( 'code' => 'nosuchrcid', 'info' => "There is no change with rcid \"\$1\"" ),
+ 'protect-invalidaction' => array( 'code' => 'protect-invalidaction', 'info' => "Invalid protection type \"\$1\"" ),
+ 'protect-invalidlevel' => array( 'code' => 'protect-invalidlevel', 'info' => "Invalid protection level \"\$1\"" ),
'toofewexpiries' => array( 'code' => 'toofewexpiries', 'info' => "\$1 expiry timestamps were provided where \$2 were needed" ),
'cantimport' => array( 'code' => 'cantimport', 'info' => "You don't have permission to import pages" ),
'cantimport-upload' => array( 'code' => 'cantimport-upload', 'info' => "You don't have permission to import uploaded pages" ),
@@ -1141,17 +1194,19 @@ abstract class ApiBase {
'importcantopen' => array( 'code' => 'cantopenfile', 'info' => "Couldn't open the uploaded file" ),
'import-noarticle' => array( 'code' => 'badinterwiki', 'info' => 'Invalid interwiki title specified' ),
'importbadinterwiki' => array( 'code' => 'badinterwiki', 'info' => 'Invalid interwiki title specified' ),
- 'import-unknownerror' => array( 'code' => 'import-unknownerror', 'info' => "Unknown error on import: ``\$1''" ),
+ 'import-unknownerror' => array( 'code' => 'import-unknownerror', 'info' => "Unknown error on import: \"\$1\"" ),
'cantoverwrite-sharedfile' => array( 'code' => 'cantoverwrite-sharedfile', 'info' => 'The target file exists on a shared repository and you do not have permission to override it' ),
'sharedfile-exists' => array( 'code' => 'fileexists-sharedrepo-perm', 'info' => 'The target file exists on a shared repository. Use the ignorewarnings parameter to override it.' ),
'mustbeposted' => array( 'code' => 'mustbeposted', 'info' => "The \$1 module requires a POST request" ),
'show' => array( 'code' => 'show', 'info' => 'Incorrect parameter - mutually exclusive values may not be supplied' ),
'specialpage-cantexecute' => array( 'code' => 'specialpage-cantexecute', 'info' => "You don't have permission to view the results of this special page" ),
+ 'invalidoldimage' => array( 'code' => 'invalidoldimage', 'info' => 'The oldimage parameter has invalid format' ),
+ 'nodeleteablefile' => array( 'code' => 'nodeleteablefile', 'info' => 'No such old version of the file' ),
// ApiEditPage messages
'noimageredirect-anon' => array( 'code' => 'noimageredirect-anon', 'info' => "Anonymous users can't create image redirects" ),
'noimageredirect-logged' => array( 'code' => 'noimageredirect', 'info' => "You don't have permission to create image redirects" ),
- 'spamdetected' => array( 'code' => 'spamdetected', 'info' => "Your edit was refused because it contained a spam fragment: ``\$1''" ),
+ 'spamdetected' => array( 'code' => 'spamdetected', 'info' => "Your edit was refused because it contained a spam fragment: \"\$1\"" ),
'filtered' => array( 'code' => 'filtered', 'info' => "The filter callback function refused your edit" ),
'contenttoobig' => array( 'code' => 'contenttoobig', 'info' => "The content you supplied exceeds the article size limit of \$1 kilobytes" ),
'noedit-anon' => array( 'code' => 'noedit-anon', 'info' => "Anonymous users can't edit pages" ),
@@ -1162,9 +1217,9 @@ abstract class ApiBase {
'hashcheckfailed' => array( 'code' => 'badmd5', 'info' => "The supplied MD5 hash was incorrect" ),
'missingtext' => array( 'code' => 'notext', 'info' => "One of the text, appendtext, prependtext and undo parameters must be set" ),
'emptynewsection' => array( 'code' => 'emptynewsection', 'info' => 'Creating empty new sections is not possible.' ),
- 'revwrongpage' => array( 'code' => 'revwrongpage', 'info' => "r\$1 is not a revision of ``\$2''" ),
+ 'revwrongpage' => array( 'code' => 'revwrongpage', 'info' => "r\$1 is not a revision of \"\$2\"" ),
'undo-failure' => array( 'code' => 'undofailure', 'info' => 'Undo failed due to conflicting intermediate edits' ),
-
+
// Messages from WikiPage::doEit()
'edit-hook-aborted' => array( 'code' => 'edit-hook-aborted', 'info' => "Your edit was aborted by an ArticleSave hook" ),
'edit-gone-missing' => array( 'code' => 'edit-gone-missing', 'info' => "The page you tried to edit doesn't seem to exist anymore" ),
@@ -1178,8 +1233,11 @@ abstract class ApiBase {
'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
'filename-tooshort' => array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ),
+ 'filename-toolong' => array( 'code' => 'filename-toolong', 'info' => 'The filename is too long' ),
'illegal-filename' => array( 'code' => 'illegal-filename', 'info' => 'The filename is not allowed' ),
'filetype-missing' => array( 'code' => 'filetype-missing', 'info' => 'The file is missing an extension' ),
+
+ 'mustbeloggedin' => array( 'code' => 'mustbeloggedin', 'info' => 'You must be logged in to $1.' )
);
/**
@@ -1211,6 +1269,7 @@ abstract class ApiBase {
* @return array('code' => code, 'info' => info)
*/
public function parseMsg( $error ) {
+ $error = (array)$error; // It seems strings sometimes make their way in here
$key = array_shift( $error );
// Check whether the error array was nested
@@ -1222,8 +1281,8 @@ abstract class ApiBase {
if ( isset( self::$messageMap[$key] ) ) {
return array( 'code' =>
- wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
- 'info' =>
+ wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
+ 'info' =>
wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error )
);
}
@@ -1282,7 +1341,7 @@ abstract class ApiBase {
/**
* Returns the token salt if there is one, '' if the module doesn't require a salt, else false if the module doesn't need a token
- * @return bool
+ * @return bool|string
*/
public function getTokenSalt() {
return false;
@@ -1295,10 +1354,9 @@ abstract class ApiBase {
* @return User
*/
public function getWatchlistUser( $params ) {
- global $wgUser;
if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
$user = User::newFromName( $params['owner'], false );
- if ( !$user->getId() ) {
+ if ( !($user && $user->getId()) ) {
$this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
}
$token = $user->getOption( 'watchlisttoken' );
@@ -1306,10 +1364,10 @@ abstract class ApiBase {
$this->dieUsage( 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences', 'bad_wltoken' );
}
} else {
- if ( !$wgUser->isLoggedIn() ) {
+ if ( !$this->getUser()->isLoggedIn() ) {
$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
}
- $user = $wgUser;
+ $user = $this->getUser();
}
return $user;
}
@@ -1482,6 +1540,13 @@ abstract class ApiBase {
}
/**
+ * @return DatabaseBase
+ */
+ protected function getDB() {
+ return wfGetDB( DB_SLAVE, 'api' );
+ }
+
+ /**
* Debugging function that prints a value and an optional backtrace
* @param $value mixed Value to print
* @param $name string Description of the printed value
diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php
index bb2bb253..351ac6b7 100644
--- a/includes/api/ApiBlock.php
+++ b/includes/api/ApiBlock.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API module that facilitates the blocking of users. Requires API write mode
* to be enabled.
@@ -48,29 +43,29 @@ class ApiBlock extends ApiBase {
* of success. If it fails, the result will specify the nature of the error.
*/
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
$params = $this->extractRequestParams();
if ( $params['gettoken'] ) {
- $res['blocktoken'] = $wgUser->editToken( '', $this->getMain()->getRequest() );
+ $res['blocktoken'] = $user->getEditToken( '', $this->getMain()->getRequest() );
$this->getResult()->addValue( null, $this->getModuleName(), $res );
return;
}
- if ( !$wgUser->isAllowed( 'block' ) ) {
+ if ( !$user->isAllowed( 'block' ) ) {
$this->dieUsageMsg( 'cantblock' );
}
# bug 15810: blocked admins should have limited access here
- if ( $wgUser->isBlocked() ) {
- $status = SpecialBlock::checkUnblockSelf( $params['user'] );
+ if ( $user->isBlocked() ) {
+ $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
if ( $status !== true ) {
$this->dieUsageMsg( array( $status ) );
}
}
- if ( $params['hidename'] && !$wgUser->isAllowed( 'hideuser' ) ) {
+ if ( $params['hidename'] && !$user->isAllowed( 'hideuser' ) ) {
$this->dieUsageMsg( 'canthide' );
}
- if ( $params['noemail'] && !SpecialBlock::canBlockEmail( $wgUser ) ) {
+ if ( $params['noemail'] && !SpecialBlock::canBlockEmail( $user ) ) {
$this->dieUsageMsg( 'cantblock-email' );
}
@@ -87,13 +82,13 @@ class ApiBlock extends ApiBase {
'AutoBlock' => $params['autoblock'],
'DisableEmail' => $params['noemail'],
'HideUser' => $params['hidename'],
- 'DisableUTEdit' => $params['allowusertalk'],
+ 'DisableUTEdit' => !$params['allowusertalk'],
'AlreadyBlocked' => $params['reblock'],
'Watch' => $params['watchuser'],
'Confirm' => true,
);
- $retval = SpecialBlock::processForm( $data );
+ $retval = SpecialBlock::processForm( $data, $this->getContext() );
if ( $retval !== true ) {
// We don't care about multiple errors, just report one of them
$this->dieUsageMsg( $retval );
@@ -208,7 +203,7 @@ class ApiBlock extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=block&user=123.5.5.12&expiry=3%20days&reason=First%20strike',
'api.php?action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail='
diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php
index 59f8555b..4bb94c4a 100644
--- a/includes/api/ApiComparePages.php
+++ b/includes/api/ApiComparePages.php
@@ -35,7 +35,7 @@ class ApiComparePages extends ApiBase {
$rev1 = $this->revisionOrTitle( $params['fromrev'], $params['fromtitle'] );
$rev2 = $this->revisionOrTitle( $params['torev'], $params['totitle'] );
- $de = new DifferenceEngine( null,
+ $de = new DifferenceEngine( $this->getContext(),
$rev1,
$rev2,
null, // rcid
@@ -118,9 +118,9 @@ class ApiComparePages extends ApiBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'api.php?action=compare&fromrev=1&torev=2',
+ 'api.php?action=compare&fromrev=1&torev=2' => 'Create a diff between revision 1 and 2',
);
}
diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php
index d6cc21b3..cfaf6cc1 100644
--- a/includes/api/ApiDelete.php
+++ b/includes/api/ApiDelete.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API module that facilitates deleting pages. The API equivalent of action=delete.
* Requires API write mode to be enabled.
@@ -69,67 +64,56 @@ class ApiDelete extends ApiBase {
}
$reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
+ $pageObj = WikiPage::factory( $titleObj );
+ $user = $this->getUser();
+
if ( $titleObj->getNamespace() == NS_FILE ) {
- $retval = self::deleteFile( $params['token'], $titleObj, $params['oldimage'], $reason, false );
- if ( count( $retval ) ) {
- $this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them
- }
+ $retval = self::deleteFile( $pageObj, $user, $params['token'], $params['oldimage'], $reason, false );
} else {
- $articleObj = new Article( $titleObj );
- $retval = self::delete( $articleObj, $params['token'], $reason );
+ $retval = self::delete( $pageObj, $user, $params['token'], $reason );
+ }
- if ( count( $retval ) ) {
- $this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them
- }
+ if ( count( $retval ) ) {
+ $this->dieUsageMsg( reset( $retval ) ); // We don't care about multiple errors, just report one of them
+ }
- // Deprecated parameters
- if ( $params['watch'] ) {
- $watch = 'watch';
- } elseif ( $params['unwatch'] ) {
- $watch = 'unwatch';
- } else {
- $watch = $params['watchlist'];
- }
- $this->setWatch( $watch, $titleObj, 'watchdeletion' );
+ // Deprecated parameters
+ if ( $params['watch'] ) {
+ $watch = 'watch';
+ } elseif ( $params['unwatch'] ) {
+ $watch = 'unwatch';
+ } else {
+ $watch = $params['watchlist'];
}
+ $this->setWatch( $watch, $titleObj, 'watchdeletion' );
$r = array( 'title' => $titleObj->getPrefixedText(), 'reason' => $reason );
$this->getResult()->addValue( null, $this->getModuleName(), $r );
}
/**
- *
- * @param &$title Title
+ * @param $title Title
+ * @param $user User doing the action
* @param $token String
+ * @return array
*/
- private static function getPermissionsError( &$title, $token ) {
- global $wgUser;
-
+ private static function getPermissionsError( $title, $user, $token ) {
// Check permissions
- $errors = $title->getUserPermissionsErrors( 'delete', $wgUser );
- if ( count( $errors ) > 0 ) {
- return $errors;
- }
-
- return array();
+ return $title->getUserPermissionsErrors( 'delete', $user );
}
/**
* We have our own delete() function, since Article.php's implementation is split in two phases
*
- * @param $article Article object to work on
+ * @param $page WikiPage object to work on
+ * @param $user User doing the action
* @param $token String: delete token (same as edit token)
* @param $reason String: reason for the deletion. Autogenerated if NULL
* @return Title::getUserPermissionsErrors()-like array
*/
- public static function delete( &$article, $token, &$reason = null ) {
- global $wgUser;
- if ( $article->isBigDeletion() && !$wgUser->isAllowed( 'bigdelete' ) ) {
- global $wgDeleteRevisionsLimit;
- return array( array( 'delete-toobig', $wgDeleteRevisionsLimit ) );
- }
- $title = $article->getTitle();
- $errors = self::getPermissionsError( $title, $token );
+ public static function delete( Page $page, User $user, $token, &$reason = null ) {
+ $title = $page->getTitle();
+ $errors = self::getPermissionsError( $title, $user, $token );
if ( count( $errors ) ) {
return $errors;
}
@@ -139,54 +123,58 @@ class ApiDelete extends ApiBase {
// Need to pass a throwaway variable because generateReason expects
// a reference
$hasHistory = false;
- $reason = $article->generateReason( $hasHistory );
+ $reason = $page->getAutoDeleteReason( $hasHistory );
if ( $reason === false ) {
- return array( array( 'cannotdelete' ) );
+ return array( array( 'cannotdelete', $title->getPrefixedText() ) );
}
}
$error = '';
// Luckily, Article.php provides a reusable delete function that does the hard work for us
- if ( $article->doDeleteArticle( $reason, false, 0, true, $error ) ) {
+ if ( $page->doDeleteArticle( $reason, false, 0, true, $error ) ) {
return array();
} else {
- return array( array( 'cannotdelete', $article->getTitle()->getPrefixedText() ) );
+ return array( array( 'cannotdelete', $title->getPrefixedText() ) );
}
}
/**
+ * @param $page WikiPage object to work on
+ * @param $user User doing the action
* @param $token
- * @param $title Title
* @param $oldimage
* @param $reason
* @param $suppress bool
* @return \type|array|Title
*/
- public static function deleteFile( $token, &$title, $oldimage, &$reason = null, $suppress = false ) {
- $errors = self::getPermissionsError( $title, $token );
+ public static function deleteFile( Page $page, User $user, $token, $oldimage, &$reason = null, $suppress = false ) {
+ $title = $page->getTitle();
+ $errors = self::getPermissionsError( $title, $user, $token );
if ( count( $errors ) ) {
return $errors;
}
- if ( $oldimage && !FileDeleteForm::isValidOldSpec( $oldimage ) ) {
- return array( array( 'invalidoldimage' ) );
+ $file = $page->getFile();
+ if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
+ return self::delete( $page, $user, $token, $reason );
}
- $file = wfFindFile( $title, array( 'ignoreRedirect' => true ) );
- $oldfile = false;
-
if ( $oldimage ) {
+ if ( !FileDeleteForm::isValidOldSpec( $oldimage ) ) {
+ return array( array( 'invalidoldimage' ) );
+ }
$oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $oldimage );
+ if ( !$oldfile->exists() || !$oldfile->isLocal() || $oldfile->getRedirected() ) {
+ return array( array( 'nodeleteablefile' ) );
+ }
+ } else {
+ $oldfile = false;
}
- if ( !FileDeleteForm::haveDeletableFile( $file, $oldfile, $oldimage ) ) {
- return self::delete( new Article( $title ), $token, $reason );
- }
if ( is_null( $reason ) ) { // Log and RC don't like null reasons
$reason = '';
}
$status = FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress );
-
if ( !$status->isGood() ) {
return array( array( 'cannotdelete', $title->getPrefixedText() ) );
}
@@ -257,6 +245,10 @@ class ApiDelete extends ApiBase {
array( 'nosuchpageid', 'pageid' ),
array( 'notanarticle' ),
array( 'hookaborted', 'error' ),
+ array( 'delete-toobig', 'limit' ),
+ array( 'cannotdelete', 'title' ),
+ array( 'invalidoldimage' ),
+ array( 'nodeleteablefile' ),
)
);
}
@@ -269,10 +261,10 @@ class ApiDelete extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'api.php?action=delete&title=Main%20Page&token=123ABC',
- 'api.php?action=delete&title=Main%20Page&token=123ABC&reason=Preparing%20for%20move'
+ 'api.php?action=delete&title=Main%20Page&token=123ABC' => 'Delete the Main Page',
+ 'api.php?action=delete&title=Main%20Page&token=123ABC&reason=Preparing%20for%20move' => 'Delete the Main Page with the reason "Preparing for move"',
);
}
diff --git a/includes/api/ApiDisabled.php b/includes/api/ApiDisabled.php
index ad731bb4..55754896 100644
--- a/includes/api/ApiDisabled.php
+++ b/includes/api/ApiDisabled.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API module that dies with an error immediately.
*
@@ -46,7 +41,7 @@ class ApiDisabled extends ApiBase {
}
public function execute() {
- $this->dieUsage( "The ``{$this->getModuleName()}'' module has been disabled.", 'moduledisabled' );
+ $this->dieUsage( "The \"{$this->getModuleName()}\" module has been disabled.", 'moduledisabled' );
}
public function isReadMode() {
@@ -65,7 +60,7 @@ class ApiDisabled extends ApiBase {
return 'This module has been disabled';
}
- protected function getExamples() {
+ public function getExamples() {
return array();
}
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index 2b949ba9..9ed6d08d 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* A module that allows for editing and creating pages.
*
@@ -43,7 +38,7 @@ class ApiEditPage extends ApiBase {
}
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
$params = $this->extractRequestParams();
if ( is_null( $params['text'] ) && is_null( $params['appendtext'] ) &&
@@ -87,10 +82,6 @@ class ApiEditPage extends ApiBase {
}
}
- // Some functions depend on $wgTitle == $ep->mTitle
- global $wgTitle;
- $wgTitle = $titleObj;
-
if ( $params['createonly'] && $titleObj->exists() ) {
$this->dieUsageMsg( 'createonly-exists' );
}
@@ -99,15 +90,16 @@ class ApiEditPage extends ApiBase {
}
// Now let's check whether we're even allowed to do this
- $errors = $titleObj->getUserPermissionsErrors( 'edit', $wgUser );
+ $errors = $titleObj->getUserPermissionsErrors( 'edit', $user );
if ( !$titleObj->exists() ) {
- $errors = array_merge( $errors, $titleObj->getUserPermissionsErrors( 'create', $wgUser ) );
+ $errors = array_merge( $errors, $titleObj->getUserPermissionsErrors( 'create', $user ) );
}
if ( count( $errors ) ) {
$this->dieUsageMsg( $errors[0] );
}
- $articleObj = new Article( $titleObj );
+ $articleObj = Article::newFromTitle( $titleObj, $this->getContext() );
+
$toMD5 = $params['text'];
if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) )
{
@@ -178,41 +170,42 @@ class ApiEditPage extends ApiBase {
$this->dieUsageMsg( 'hashcheckfailed' );
}
- $ep = new EditPage( $articleObj );
- $ep->setContextTitle( $titleObj );
-
// EditPage wants to parse its stuff from a WebRequest
// That interface kind of sucks, but it's workable
- $reqArr = array(
+ $requestArray = array(
'wpTextbox1' => $params['text'],
'wpEditToken' => $params['token'],
'wpIgnoreBlankSummary' => ''
);
if ( !is_null( $params['summary'] ) ) {
- $reqArr['wpSummary'] = $params['summary'];
+ $requestArray['wpSummary'] = $params['summary'];
+ }
+
+ if ( !is_null( $params['sectiontitle'] ) ) {
+ $requestArray['wpSectionTitle'] = $params['sectiontitle'];
}
// Watch out for basetimestamp == ''
// wfTimestamp() treats it as NOW, almost certainly causing an edit conflict
if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' ) {
- $reqArr['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
+ $requestArray['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
} else {
- $reqArr['wpEdittime'] = $articleObj->getTimestamp();
+ $requestArray['wpEdittime'] = $articleObj->getTimestamp();
}
if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
- $reqArr['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
+ $requestArray['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
} else {
- $reqArr['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
+ $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
}
- if ( $params['minor'] || ( !$params['notminor'] && $wgUser->getOption( 'minordefault' ) ) ) {
- $reqArr['wpMinoredit'] = '';
+ if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
+ $requestArray['wpMinoredit'] = '';
}
if ( $params['recreate'] ) {
- $reqArr['wpRecreate'] = '';
+ $requestArray['wpRecreate'] = '';
}
if ( !is_null( $params['section'] ) ) {
@@ -220,9 +213,9 @@ 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" );
}
- $reqArr['wpSection'] = $params['section'];
+ $requestArray['wpSection'] = $params['section'];
} else {
- $reqArr['wpSection'] = '';
+ $requestArray['wpSection'] = '';
}
$watch = $this->getWatchlistValue( $params['watchlist'], $titleObj );
@@ -235,22 +228,23 @@ class ApiEditPage extends ApiBase {
}
if ( $watch ) {
- $reqArr['wpWatchthis'] = '';
+ $requestArray['wpWatchthis'] = '';
}
- $req = new FauxRequest( $reqArr, true );
+ global $wgTitle, $wgRequest;
+
+ $req = new DerivativeRequest( $this->getRequest(), $requestArray, true );
+
+ // Some functions depend on $wgTitle == $ep->mTitle
+ // TODO: Make them not or check if they still do
+ $wgTitle = $titleObj;
+
+ $ep = new EditPage( $articleObj );
+ $ep->setContextTitle( $titleObj );
$ep->importFormData( $req );
// Run hooks
- // Handle CAPTCHA parameters
- global $wgRequest;
- if ( !is_null( $params['captchaid'] ) ) {
- $wgRequest->setVal( 'wpCaptchaId', $params['captchaid'] );
- }
- if ( !is_null( $params['captchaword'] ) ) {
- $wgRequest->setVal( 'wpCaptchaWord', $params['captchaword'] );
- }
-
+ // Handle APIEditBeforeSave parameters
$r = array();
if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $ep->textbox1, &$r ) ) ) {
if ( count( $r ) ) {
@@ -270,7 +264,7 @@ class ApiEditPage extends ApiBase {
$oldRequest = $wgRequest;
$wgRequest = $req;
- $status = $ep->internalAttemptSave( $result, $wgUser->isAllowed( 'bot' ) && $params['bot'] );
+ $status = $ep->internalAttemptSave( $result, $user->isAllowed( 'bot' ) && $params['bot'] );
$wgRequest = $oldRequest;
global $wgMaxArticleSize;
@@ -333,19 +327,14 @@ class ApiEditPage extends ApiBase {
$r['result'] = 'Success';
$r['pageid'] = intval( $titleObj->getArticleID() );
$r['title'] = $titleObj->getPrefixedText();
- // HACK: We create a new Article object here because getRevIdFetched()
- // refuses to be run twice, and because Title::getLatestRevId()
- // won't fetch from the master unless we select for update, which we
- // don't want to do.
- $newArticle = new Article( $titleObj );
- $newRevId = $newArticle->getRevIdFetched();
+ $newRevId = $articleObj->getLatest();
if ( $newRevId == $oldRevId ) {
$r['nochange'] = '';
} else {
$r['oldrevid'] = intval( $oldRevId );
$r['newrevid'] = intval( $newRevId );
$r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
- $newArticle->getTimestamp() );
+ $articleObj->getTimestamp() );
}
break;
@@ -358,7 +347,11 @@ class ApiEditPage extends ApiBase {
$this->dieUsageMsg( $errors[0] ); // TODO: Add new errors to message map
break;
default:
- $this->dieUsageMsg( array( 'unknownerror', $status->value ) );
+ if ( is_string( $status->value ) && strlen( $status->value ) ) {
+ $this->dieUsage( "An unknown return value was returned by Editpage. The code returned was \"{$status->value}\"" , $status->value );
+ } else {
+ $this->dieUsageMsg( array( 'unknownerror', $status->value ) );
+ }
}
$apiResult->addValue( null, $this->getModuleName(), $r );
}
@@ -371,7 +364,7 @@ class ApiEditPage extends ApiBase {
return true;
}
- protected function getDescription() {
+ public function getDescription() {
return 'Create and edit pages.';
}
@@ -412,13 +405,17 @@ class ApiEditPage extends ApiBase {
) );
}
- protected function getAllowedParams() {
+ public function getAllowedParams() {
return array(
'title' => array(
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true
),
'section' => null,
+ 'sectiontitle' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => false,
+ ),
'text' => null,
'token' => null,
'summary' => null,
@@ -430,8 +427,6 @@ class ApiEditPage extends ApiBase {
'recreate' => false,
'createonly' => false,
'nocreate' => false,
- 'captchaword' => null,
- 'captchaid' => null,
'watch' => array(
ApiBase::PARAM_DFLT => false,
ApiBase::PARAM_DEPRECATED => true,
@@ -465,11 +460,12 @@ class ApiEditPage extends ApiBase {
);
}
- protected function getParamDescription() {
+ public function getParamDescription() {
$p = $this->getModulePrefix();
return array(
'title' => 'Page title',
'section' => 'Section number. 0 for the top section, \'new\' for a new section',
+ 'sectiontitle' => 'The title for a new section',
'text' => 'Page content',
'token' => array( 'Edit token. You can get one of these through prop=info.',
'The token should always be sent as the last parameter, or at least, after the text parameter'
@@ -490,10 +486,8 @@ class ApiEditPage extends ApiBase {
'watch' => 'Add the page to your watchlist',
'unwatch' => 'Remove the page from your watchlist',
'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
- 'captchaid' => 'CAPTCHA ID from previous request',
- 'captchaword' => 'Answer to the CAPTCHA',
'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
- 'If set, the edit won\'t be done unless the hash is correct' ),
+ 'If set, the edit won\'t be done unless the hash is correct' ),
'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
'appendtext' => "Add this text to the end of the page. Overrides {$p}text",
'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
@@ -510,14 +504,16 @@ class ApiEditPage extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Edit a page (anonymous user):',
- ' api.php?action=edit&title=Test&summary=test%20summary&text=article%20content&basetimestamp=20070824123454&token=%2B\\',
- 'Prepend __NOTOC__ to a page (anonymous user):',
- ' api.php?action=edit&title=Test&summary=NOTOC&minor=&prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\',
- 'Undo r13579 through r13585 with autosummary (anonymous user):',
- ' api.php?action=edit&title=Test&undo=13585&undoafter=13579&basetimestamp=20070824123454&token=%2B\\',
+
+ 'api.php?action=edit&title=Test&summary=test%20summary&text=article%20content&basetimestamp=20070824123454&token=%2B\\'
+ => 'Edit a page (anonymous user)',
+
+ 'api.php?action=edit&title=Test&summary=NOTOC&minor=&prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\'
+ => 'Prepend __NOTOC__ to a page (anonymous user)',
+ 'api.php?action=edit&title=Test&undo=13585&undoafter=13579&basetimestamp=20070824123454&token=%2B\\'
+ => 'Undo r13579 through r13585 with autosummary (anonymous user)',
);
}
diff --git a/includes/api/ApiEmailUser.php b/includes/api/ApiEmailUser.php
index 46e8d523..d9eed60c 100644
--- a/includes/api/ApiEmailUser.php
+++ b/includes/api/ApiEmailUser.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API Module to facilitate sending of emails to users
* @ingroup API
@@ -40,8 +35,6 @@ class ApiEmailUser extends ApiBase {
}
public function execute() {
- global $wgUser;
-
$params = $this->extractRequestParams();
// Validate target
@@ -51,7 +44,7 @@ class ApiEmailUser extends ApiBase {
}
// Check permissions and errors
- $error = SpecialEmailUser::getPermissionsError( $wgUser, $params['token'] );
+ $error = SpecialEmailUser::getPermissionsError( $this->getUser(), $params['token'] );
if ( $error ) {
$this->dieUsageMsg( array( $error ) );
}
@@ -138,9 +131,9 @@ class ApiEmailUser extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'api.php?action=emailuser&target=WikiSysop&text=Content'
+ 'api.php?action=emailuser&target=WikiSysop&text=Content' => 'Send an email to the User "WikiSysop" with the text "Content"',
);
}
diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php
index dfa520a2..d570534d 100644
--- a/includes/api/ApiExpandTemplates.php
+++ b/includes/api/ApiExpandTemplates.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API module that functions as a shortcut to the wikitext preprocessor. Expands
* any templates in a provided string, and returns the result of this expansion
@@ -52,14 +47,14 @@ class ApiExpandTemplates extends ApiBase {
// Create title for parser
$title_obj = Title::newFromText( $params['title'] );
if ( !$title_obj ) {
- $title_obj = Title::newFromText( 'API' ); // default
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
$result = $this->getResult();
// Parse text
global $wgParser;
- $options = new ParserOptions();
+ $options = ParserOptions::newFromContext( $this->getContext() );
if ( $params['includecomments'] ) {
$options->setRemoveComments( false );
@@ -112,7 +107,13 @@ class ApiExpandTemplates extends ApiBase {
return 'Expands all templates in wikitext';
}
- protected function getExamples() {
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'invalidtitle', 'title' ),
+ ) );
+ }
+
+ public function getExamples() {
return array(
'api.php?action=expandtemplates&text={{Project:Sandbox}}'
);
diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php
index c1e6ff6e..4e70bde2 100644
--- a/includes/api/ApiFeedContributions.php
+++ b/includes/api/ApiFeedContributions.php
@@ -1,5 +1,4 @@
<?php
-
/**
*
*
@@ -36,6 +35,8 @@ class ApiFeedContributions extends ApiBase {
/**
* This module uses a custom feed wrapper printer.
+ *
+ * @return ApiFormatFeedWrapper
*/
public function getCustomPrinter() {
return new ApiFormatFeedWrapper( $this->getMain() );
@@ -73,7 +74,7 @@ class ApiFeedContributions extends ApiBase {
$feedUrl
);
- $pager = new ContribsPager( array(
+ $pager = new ContribsPager( $this->getContext(), array(
'target' => $target,
'namespace' => $params['namespace'],
'year' => $params['year'],
@@ -99,7 +100,7 @@ class ApiFeedContributions extends ApiBase {
if( $title ) {
$date = $row->rev_timestamp;
$comments = $title->getTalkPage()->getFullURL();
- $revision = Revision::newFromRow( $row);
+ $revision = Revision::newFromRow( $row );
return new FeedItem(
$title->getPrefixedText(),
@@ -195,7 +196,7 @@ class ApiFeedContributions extends ApiBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=feedcontributions&user=Reedy',
);
@@ -204,4 +205,4 @@ class ApiFeedContributions extends ApiBase {
public function getVersion() {
return __CLASS__ . ': $Id$';
}
-} \ No newline at end of file
+}
diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php
index dd7e3d8f..eee8fa19 100644
--- a/includes/api/ApiFeedWatchlist.php
+++ b/includes/api/ApiFeedWatchlist.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* This action allows users to get their watchlist items in RSS/Atom formats.
* When executed, it performs a nested call to the API to get the needed data,
@@ -44,6 +39,8 @@ class ApiFeedWatchlist extends ApiBase {
/**
* This module uses a custom feed wrapper printer.
+ *
+ * @return ApiFormatFeedWrapper
*/
public function getCustomPrinter() {
return new ApiFormatFeedWrapper( $this->getMain() );
@@ -68,6 +65,9 @@ class ApiFeedWatchlist extends ApiBase {
if( !isset( $wgFeedClasses[ $params['feedformat'] ] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
+ if ( !is_null( $params['wlexcludeuser'] ) ) {
+ $fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
+ }
// limit to the number of hours going from now back
$endTime = wfTimestamp( TS_MW, time() - intval( $params['hours'] * 60 * 60 ) );
@@ -150,6 +150,10 @@ class ApiFeedWatchlist extends ApiBase {
}
}
+ /**
+ * @param $info array
+ * @return FeedItem
+ */
private function createFeedItem( $info ) {
$titleStr = $info['title'];
$title = Title::newFromText( $titleStr );
@@ -188,6 +192,9 @@ class ApiFeedWatchlist extends ApiBase {
'wltoken' => array(
ApiBase::PARAM_TYPE => 'string'
),
+ 'wlexcludeuser' => array(
+ ApiBase::PARAM_TYPE => 'user'
+ ),
'linktodiffs' => false,
);
}
@@ -197,9 +204,10 @@ class ApiFeedWatchlist extends ApiBase {
'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()}token if it's not you)",
+ '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',
- 'linktodiffs' => 'Link to change differences instead of article pages'
+ 'wlexcludeuser' => 'A user whose edits should not be shown in the watchlist',
+ 'linktodiffs' => 'Link to change differences instead of article pages',
);
}
@@ -214,7 +222,7 @@ class ApiFeedWatchlist extends ApiBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=feedwatchlist',
'api.php?action=feedwatchlist&allrev=&linktodiffs=&hours=6'
diff --git a/includes/api/ApiFileRevert.php b/includes/api/ApiFileRevert.php
index 5ff50512..7ef1da0a 100644
--- a/includes/api/ApiFileRevert.php
+++ b/includes/api/ApiFileRevert.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -47,14 +42,12 @@ class ApiFileRevert extends ApiBase {
}
public function execute() {
- global $wgUser;
-
$this->params = $this->extractRequestParams();
// Extract the file and archiveName from the request parameters
$this->validateParameters();
// Check whether we're allowed to revert this file
- $this->checkPermissions( $wgUser );
+ $this->checkPermissions( $this->getUser() );
$sourceUrl = $this->file->getArchiveVirtualUrl( $this->archiveName );
$status = $this->file->upload( $sourceUrl, $this->params['comment'], $this->params['comment'] );
@@ -176,10 +169,10 @@ class ApiFileRevert extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Revert Wiki.png to the version of 20110305152740:',
- ' api.php?action=filerevert&filename=Wiki.png&comment=Revert&archivename=20110305152740!Wiki.png&token=+\\',
+ 'api.php?action=filerevert&filename=Wiki.png&comment=Revert&archivename=20110305152740!Wiki.png&token=+\\'
+ => 'Revert Wiki.png to the version of 20110305152740',
);
}
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index 8c8235b8..543c90ce 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* This is the abstract base class for API formatters.
*
@@ -235,8 +230,10 @@ See <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
public function getBuffer() {
return $this->mBuffer;
}
+
/**
* Set the flag to buffer the result instead of printing it.
+ * @param $value bool
*/
public function setBufferResult( $value ) {
$this->mBufferResult = $value;
@@ -267,7 +264,7 @@ See <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
// This regex hacks around bug 13218 (&quot; included in the URL)
$text = preg_replace( "#(($protos).*?)(&quot;)?([ \\'\"<>\n]|&lt;|&gt;|&quot;)#", '<a href="\\1">\\1</a>\\3\\4', $text );
// identify requests to api.php
- $text = preg_replace( "#api\\.php\\?[^ \\()<\n\t]+#", '<a href="\\0">\\0</a>', $text );
+ $text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text );
if ( $this->mHelp ) {
// make strings inside * bold
$text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text );
@@ -288,8 +285,11 @@ See <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
return $text;
}
- protected function getExamples() {
- return 'api.php?action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName();
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName()
+ => "Format the query result in the {$this->getModuleName()} format",
+ );
}
public function getHelpUrls() {
@@ -335,6 +335,8 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
/**
* Feed does its own headers
+ *
+ * @return null
*/
public function getMimeType() {
return null;
@@ -342,6 +344,8 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
/**
* Optimization - no need to sanitize data that will not be needed
+ *
+ * @return bool
*/
public function getNeedsRawData() {
return true;
diff --git a/includes/api/ApiFormatDbg.php b/includes/api/ApiFormatDbg.php
index 32f223d7..92619f76 100644
--- a/includes/api/ApiFormatDbg.php
+++ b/includes/api/ApiFormatDbg.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API PHP's var_export() output formatter
* @ingroup API
diff --git a/includes/api/ApiFormatDump.php b/includes/api/ApiFormatDump.php
index bde3e56d..0f055e13 100644
--- a/includes/api/ApiFormatDump.php
+++ b/includes/api/ApiFormatDump.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API PHP's var_dump() output formatter
* @ingroup API
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index e3755d73..e728d057 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API JSON output formatter
* @ingroup API
diff --git a/includes/api/ApiFormatPhp.php b/includes/api/ApiFormatPhp.php
index cfcc2a03..60552c40 100644
--- a/includes/api/ApiFormatPhp.php
+++ b/includes/api/ApiFormatPhp.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API Serialized PHP output formatter
* @ingroup API
diff --git a/includes/api/ApiFormatRaw.php b/includes/api/ApiFormatRaw.php
index 75912871..db81aacd 100644
--- a/includes/api/ApiFormatRaw.php
+++ b/includes/api/ApiFormatRaw.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* Formatter that spits out anything you like with any desired MIME type
* @ingroup API
diff --git a/includes/api/ApiFormatTxt.php b/includes/api/ApiFormatTxt.php
index 54a620fc..e26b82b0 100644
--- a/includes/api/ApiFormatTxt.php
+++ b/includes/api/ApiFormatTxt.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API Text output formatter
* @ingroup API
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
index f5cace21..1bc9d025 100644
--- a/includes/api/ApiFormatWddx.php
+++ b/includes/api/ApiFormatWddx.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API WDDX output formatter
* @ingroup API
@@ -69,6 +64,8 @@ class ApiFormatWddx extends ApiFormatBase {
/**
* Recursively go through the object and output its data in WDDX format.
+ * @param $elemValue
+ * @param $indent int
*/
function slowWddxPrinter( $elemValue, $indent = 0 ) {
$indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
diff --git a/includes/api/ApiFormatXml.php b/includes/api/ApiFormatXml.php
index 06bd9f33..8f4abc15 100644
--- a/includes/api/ApiFormatXml.php
+++ b/includes/api/ApiFormatXml.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API XML output formatter
* @ingroup API
@@ -68,11 +63,15 @@ class ApiFormatXml extends ApiFormatBase {
$this->addXslt();
}
if ( $this->mIncludeNamespace ) {
- $data = array( 'xmlns' => self::$namespace ) + $this->getResultData();
+ // If the result data already contains an 'xmlns' namespace added
+ // for custom XML output types, it will override the one for the
+ // generic API results.
+ // This allows API output of other XML types like Atom, RSS, RSD.
+ $data = $this->getResultData() + array( 'xmlns' => self::$namespace );
} else {
$data = $this->getResultData();
}
-
+
$this->printText(
self::recXmlPrint( $this->mRootElemName,
$data,
@@ -94,7 +93,7 @@ class ApiFormatXml extends ApiFormatBase {
*
* If neither key is found, all keys become element names, and values become element content.
* The method is recursive, so the same rules apply to any sub-arrays.
- *
+ *
* @param $elemName
* @param $elemValue
* @param $indent
@@ -202,7 +201,7 @@ class ApiFormatXml extends ApiFormatBase {
$this->setWarning( 'Stylesheet should have .xsl extension.' );
return;
}
- $this->printText( '<?xml-stylesheet href="' . $nt->escapeLocalURL( 'action=raw' ) . '" type="text/xsl" ?>' );
+ $this->printText( '<?xml-stylesheet href="' . htmlspecialchars( $nt->getLocalURL( 'action=raw' ) ) . '" type="text/xsl" ?>' );
}
public function getAllowedParams() {
diff --git a/includes/api/ApiFormatYaml.php b/includes/api/ApiFormatYaml.php
index ecf35900..dbcdb21c 100644
--- a/includes/api/ApiFormatYaml.php
+++ b/includes/api/ApiFormatYaml.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiFormatBase.php' );
-}
-
/**
* API YAML output formatter
* @ingroup API
diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php
index f2af822a..97da786b 100644
--- a/includes/api/ApiHelp.php
+++ b/includes/api/ApiHelp.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* This is a simple class to handle action=help
*
@@ -139,18 +134,13 @@ class ApiHelp extends ApiBase {
return 'Display this help screen. Or the help screen for the specified module';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Whole help page:',
- ' api.php?action=help',
- 'Module (action) help page:',
- ' api.php?action=help&modules=protect',
- 'Query (list) modules help page:',
- ' api.php?action=help&querymodules=categorymembers',
- 'Query (prop) modules help page:',
- ' api.php?action=help&querymodules=info',
- 'Query (meta) modules help page:',
- ' api.php?action=help&querymodules=siteinfo',
+ 'api.php?action=help' => 'Whole help page',
+ 'api.php?action=help&modules=protect' => 'Module (action) help page',
+ 'api.php?action=help&querymodules=categorymembers' => 'Query (list) modules help page',
+ 'api.php?action=help&querymodules=info' => 'Query (prop) modules help page',
+ 'api.php?action=help&querymodules=siteinfo' => 'Query (meta) modules help page',
);
}
diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php
index ce740efc..ade9f1f3 100644
--- a/includes/api/ApiImport.php
+++ b/includes/api/ApiImport.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* API module that imports an XML file like Special:Import does
*
@@ -41,13 +36,12 @@ class ApiImport extends ApiBase {
}
public function execute() {
- global $wgUser;
-
+ $user = $this->getUser();
$params = $this->extractRequestParams();
$isUpload = false;
if ( isset( $params['interwikisource'] ) ) {
- if ( !$wgUser->isAllowed( 'import' ) ) {
+ if ( !$user->isAllowed( 'import' ) ) {
$this->dieUsageMsg( 'cantimport' );
}
if ( !isset( $params['interwikipage'] ) ) {
@@ -61,7 +55,7 @@ class ApiImport extends ApiBase {
);
} else {
$isUpload = true;
- if ( !$wgUser->isAllowed( 'importupload' ) ) {
+ if ( !$user->isAllowed( 'importupload' ) ) {
$this->dieUsageMsg( 'cantimport-upload' );
}
$source = ImportStreamSource::newFromUpload( 'xml' );
@@ -158,10 +152,10 @@ class ApiImport extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history:',
- ' api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory=&token=123ABC',
+ 'api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory=&token=123ABC'
+ => 'Import [[meta:Help:Parserfunctions]] to namespace 100 with full history',
);
}
diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php
index 1b17e43b..aa570cbc 100644
--- a/includes/api/ApiLogin.php
+++ b/includes/api/ApiLogin.php
@@ -25,11 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* Unit to authenticate log-in attempts to the current wiki.
*
@@ -55,39 +50,45 @@ class ApiLogin extends ApiBase {
$result = array();
- $req = new FauxRequest( array(
- 'wpName' => $params['name'],
- 'wpPassword' => $params['password'],
- 'wpDomain' => $params['domain'],
- 'wpLoginToken' => $params['token'],
- 'wpRemember' => ''
- ) );
-
// Init session if necessary
if ( session_id() == '' ) {
wfSetupSession();
}
- $loginForm = new LoginForm( $req );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setRequest( new DerivativeRequest(
+ $this->getContext()->getRequest(),
+ array(
+ 'wpName' => $params['name'],
+ 'wpPassword' => $params['password'],
+ 'wpDomain' => $params['domain'],
+ 'wpLoginToken' => $params['token'],
+ 'wpRemember' => ''
+ )
+ ) );
+ $loginForm = new LoginForm();
+ $loginForm->setContext( $context );
- global $wgCookiePrefix, $wgUser, $wgPasswordAttemptThrottle;
+ global $wgCookiePrefix, $wgPasswordAttemptThrottle;
$authRes = $loginForm->authenticateUserData();
switch ( $authRes ) {
case LoginForm::SUCCESS:
- $wgUser->setOption( 'rememberpassword', 1 );
- $wgUser->setCookies( $this->getMain()->getRequest() );
+ $user = $context->getUser();
+ $this->getContext()->setUser( $user );
+ $user->setOption( 'rememberpassword', 1 );
+ $user->setCookies( $this->getRequest() );
// Run hooks.
// @todo FIXME: Split back and frontend from this hook.
// @todo FIXME: This hook should be placed in the backend
$injected_html = '';
- wfRunHooks( 'UserLoginComplete', array( &$wgUser, &$injected_html ) );
+ wfRunHooks( 'UserLoginComplete', array( &$user, &$injected_html ) );
$result['result'] = 'Success';
- $result['lguserid'] = intval( $wgUser->getId() );
- $result['lgusername'] = $wgUser->getName();
- $result['lgtoken'] = $wgUser->getToken();
+ $result['lguserid'] = intval( $user->getId() );
+ $result['lgusername'] = $user->getName();
+ $result['lgtoken'] = $user->getToken();
$result['cookieprefix'] = $wgCookiePrefix;
$result['sessionid'] = session_id();
break;
@@ -199,14 +200,14 @@ class ApiLogin extends ApiBase {
array( 'code' => 'NotExists', 'info' => ' The username you provided doesn\'t exist' ),
array( 'code' => 'EmptyPass', 'info' => ' You didn\'t set the lgpassword parameter or you left it empty' ),
array( 'code' => 'WrongPass', 'info' => ' The password you provided is incorrect' ),
- array( 'code' => 'WrongPluginPass', 'info' => 'Same as `WrongPass", returned when an authentication plugin rather than MediaWiki itself rejected the password' ),
+ array( 'code' => 'WrongPluginPass', 'info' => 'Same as "WrongPass", returned when an authentication plugin rather than MediaWiki itself rejected the password' ),
array( 'code' => 'CreateBlocked', 'info' => 'The wiki tried to automatically create a new account for you, but your IP address has been blocked from account creation' ),
array( 'code' => 'Throttled', 'info' => 'You\'ve logged in too many times in a short time' ),
array( 'code' => 'Blocked', 'info' => 'User is blocked' ),
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=login&lgname=user&lgpassword=password'
);
diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php
index b5dd7ac9..81a054a6 100644
--- a/includes/api/ApiLogout.php
+++ b/includes/api/ApiLogout.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* API module to allow users to log out of the wiki. API equivalent of
* Special:Userlogout.
@@ -42,13 +37,13 @@ class ApiLogout extends ApiBase {
}
public function execute() {
- global $wgUser;
- $oldName = $wgUser->getName();
- $wgUser->logout();
+ $user = $this->getUser();
+ $oldName = $user->getName();
+ $user->logout();
// Give extensions to do something after user logout
$injected_html = '';
- wfRunHooks( 'UserLogoutComplete', array( &$wgUser, &$injected_html, $oldName ) );
+ wfRunHooks( 'UserLogoutComplete', array( &$user, &$injected_html, $oldName ) );
}
public function isReadMode() {
@@ -67,9 +62,9 @@ class ApiLogout extends ApiBase {
return 'Log out and clear session data';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'api.php?action=logout'
+ 'api.php?action=logout' => 'Log the current user out',
);
}
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index b7e118cf..fa95cfca 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -25,11 +25,6 @@
* @defgroup API API
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* This is the main API class, used for both external and internal processing.
* When executed, it will create the requested formatter object,
@@ -132,7 +127,7 @@ class ApiMain extends ApiBase {
private $mPrinter;
private $mModules, $mModuleNames, $mFormats, $mFormatNames;
- private $mResult, $mAction, $mShowVersions, $mEnableWrite, $mRequest;
+ private $mResult, $mAction, $mShowVersions, $mEnableWrite;
private $mInternalMode, $mSquidMaxage, $mModule;
private $mCacheMode = 'private';
@@ -141,11 +136,25 @@ class ApiMain extends ApiBase {
/**
* Constructs an instance of ApiMain that utilizes the module and format specified by $request.
*
- * @param $request WebRequest - if this is an instance of FauxRequest, errors are thrown and no printing occurs
+ * @param $context IContextSource|WebRequest - if this is an instance of FauxRequest, errors are thrown and no printing occurs
* @param $enableWrite bool should be set to true if the api may modify data
*/
- public function __construct( $request, $enableWrite = false ) {
- $this->mInternalMode = ( $request instanceof FauxRequest );
+ public function __construct( $context = null, $enableWrite = false ) {
+ if ( $context === null ) {
+ $context = RequestContext::getMain();
+ } elseif ( $context instanceof WebRequest ) {
+ // BC for pre-1.19
+ $request = $context;
+ $context = RequestContext::getMain();
+ }
+ // We set a derivative context so we can change stuff later
+ $this->setContext( new DerivativeContext( $context ) );
+
+ if ( isset( $request ) ) {
+ $this->getContext()->setRequest( $request );
+ }
+
+ $this->mInternalMode = ( $this->getRequest() instanceof FauxRequest );
// Special handling for the main module: $parent === $this
parent::__construct( $this, $this->mInternalMode ? 'main_int' : 'main' );
@@ -156,11 +165,12 @@ class ApiMain extends ApiBase {
// Remove all modules other than login
global $wgUser;
- if ( $request->getVal( 'callback' ) !== null ) {
+ if ( $this->getRequest()->getVal( 'callback' ) !== null ) {
// JSON callback allows cross-site reads.
// For safety, strip user credentials.
wfDebug( "API: stripping user credentials for JSON callback\n" );
$wgUser = new User();
+ $this->getContext()->setUser( $wgUser );
}
}
@@ -175,8 +185,6 @@ class ApiMain extends ApiBase {
$this->mShowVersions = false;
$this->mEnableWrite = $enableWrite;
- $this->mRequest = &$request;
-
$this->mSquidMaxage = - 1; // flag for executeActionWithErrorHandling()
$this->mCommit = false;
}
@@ -190,14 +198,6 @@ class ApiMain extends ApiBase {
}
/**
- * Return the request object that contains client's request
- * @return WebRequest
- */
- public function getRequest() {
- return $this->mRequest;
- }
-
- /**
* Get the ApiResult object associated with current request
*
* @return ApiResult
@@ -286,6 +286,7 @@ class ApiMain extends ApiBase {
* $this->setCacheMode('private')
*/
public function setCachePrivate() {
+ wfDeprecated( __METHOD__, '1.17' );
$this->setCacheMode( 'private' );
}
@@ -314,6 +315,7 @@ class ApiMain extends ApiBase {
* @deprecated since 1.17 Use setCacheMode( 'anon-public-user-private' )
*/
public function setVaryCookie() {
+ wfDeprecated( __METHOD__, '1.17' );
$this->setCacheMode( 'anon-public-user-private' );
}
@@ -399,7 +401,7 @@ class ApiMain extends ApiBase {
}
protected function sendCacheHeaders() {
- global $wgUseXVO, $wgOut, $wgVaryOnXFP;
+ global $wgUseXVO, $wgVaryOnXFP;
$response = $this->getRequest()->response();
if ( $this->mCacheMode == 'private' ) {
@@ -411,11 +413,12 @@ class ApiMain extends ApiBase {
$xfp = $wgVaryOnXFP ? ', X-Forwarded-Proto' : '';
$response->header( 'Vary: Accept-Encoding, Cookie' . $xfp );
if ( $wgUseXVO ) {
+ $out = $this->getOutput();
if ( $wgVaryOnXFP ) {
- $wgOut->addVaryHeader( 'X-Forwarded-Proto' );
+ $out->addVaryHeader( 'X-Forwarded-Proto' );
}
- $response->header( $wgOut->getXVO() );
- if ( $wgOut->haveCacheVaryCookies() ) {
+ $response->header( $out->getXVO() );
+ if ( $out->haveCacheVaryCookies() ) {
// Logged in, mark this request private
$response->header( 'Cache-Control: private' );
return;
@@ -428,7 +431,7 @@ class ApiMain extends ApiBase {
return;
} // else no XVO and anonymous, send public headers below
}
-
+
// Send public headers
if ( $wgVaryOnXFP ) {
$response->header( 'Vary: Accept-Encoding, X-Forwarded-Proto' );
@@ -486,6 +489,8 @@ class ApiMain extends ApiBase {
* @return string
*/
protected function substituteResultWithError( $e ) {
+ global $wgShowHostnames;
+
$result = $this->getResult();
// Printer may not be initialized if the extractRequestParams() fails for the main module
if ( !isset ( $this->mPrinter ) ) {
@@ -533,8 +538,12 @@ class ApiMain extends ApiBase {
if ( !is_null( $requestid ) ) {
$result->addValue( null, 'requestid', $requestid );
}
- // servedby is especially useful when debugging errors
- $result->addValue( null, 'servedby', wfHostName() );
+
+ if ( $wgShowHostnames ) {
+ // servedby is especially useful when debugging errors
+ $result->addValue( null, 'servedby', wfHostName() );
+ }
+
$result->addValue( null, 'error', $errMessage );
return $errMessage['code'];
@@ -545,15 +554,20 @@ class ApiMain extends ApiBase {
* @return array
*/
protected function setupExecuteAction() {
+ global $wgShowHostnames;
+
// First add the id to the top element
$result = $this->getResult();
$requestid = $this->getParameter( 'requestid' );
if ( !is_null( $requestid ) ) {
$result->addValue( null, 'requestid', $requestid );
}
- $servedby = $this->getParameter( 'servedby' );
- if ( $servedby ) {
- $result->addValue( null, 'servedby', wfHostName() );
+
+ if ( $wgShowHostnames ) {
+ $servedby = $this->getParameter( 'servedby' );
+ if ( $servedby ) {
+ $result->addValue( null, 'servedby', wfHostName() );
+ }
}
$params = $this->extractRequestParams();
@@ -591,8 +605,7 @@ class ApiMain extends ApiBase {
if ( !isset( $moduleParams['token'] ) ) {
$this->dieUsageMsg( array( 'missingparam', 'token' ) );
} else {
- global $wgUser;
- if ( !$wgUser->matchEditToken( $moduleParams['token'], $salt, $this->getRequest() ) ) {
+ if ( !$this->getUser()->matchEditToken( $moduleParams['token'], $salt, $this->getRequest() ) ) {
$this->dieUsageMsg( 'sessionfailure' );
}
}
@@ -634,9 +647,9 @@ class ApiMain extends ApiBase {
* @param $module ApiBase An Api module
*/
protected function checkExecutePermissions( $module ) {
- global $wgUser;
+ $user = $this->getUser();
if ( $module->isReadMode() && !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) &&
- !$wgUser->isAllowed( 'read' ) )
+ !$user->isAllowed( 'read' ) )
{
$this->dieUsageMsg( 'readrequired' );
}
@@ -644,7 +657,7 @@ class ApiMain extends ApiBase {
if ( !$this->mEnableWrite ) {
$this->dieUsageMsg( 'writedisabled' );
}
- if ( !$wgUser->isAllowed( 'writeapi' ) ) {
+ if ( !$user->isAllowed( 'writeapi' ) ) {
$this->dieUsageMsg( 'writerequired' );
}
if ( wfReadOnly() ) {
@@ -660,7 +673,7 @@ class ApiMain extends ApiBase {
*/
protected function setupExternalResponse( $module, $params ) {
// Ignore mustBePosted() for internal calls
- if ( $module->mustBePosted() && !$this->mRequest->wasPosted() ) {
+ if ( $module->mustBePosted() && !$this->getRequest()->wasPosted() ) {
$this->dieUsageMsg( array( 'mustbeposted', $this->mAction ) );
}
@@ -807,8 +820,8 @@ class ApiMain extends ApiBase {
'** **',
'** This is an auto-generated MediaWiki API documentation page **',
'** **',
- '** Documentation and Examples: **',
- '** https://www.mediawiki.org/wiki/API **',
+ '** Documentation and Examples: **',
+ '** https://www.mediawiki.org/wiki/API **',
'** **',
'**********************************************************************************************************',
'',
@@ -970,8 +983,7 @@ class ApiMain extends ApiBase {
*/
public function canApiHighLimits() {
if ( !isset( $this->mCanApiHighLimits ) ) {
- global $wgUser;
- $this->mCanApiHighLimits = $wgUser->isAllowed( 'apihighlimits' );
+ $this->mCanApiHighLimits = $this->getUser()->isAllowed( 'apihighlimits' );
}
return $this->mCanApiHighLimits;
diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php
index a0b7bcbe..f0a25e4a 100644
--- a/includes/api/ApiMove.php
+++ b/includes/api/ApiMove.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API Module to move pages
* @ingroup API
@@ -40,7 +35,7 @@ class ApiMove extends ApiBase {
}
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
$params = $this->extractRequestParams();
if ( is_null( $params['reason'] ) ) {
$params['reason'] = '';
@@ -75,9 +70,9 @@ class ApiMove extends ApiBase {
&& !RepoGroup::singleton()->getLocalRepo()->findFile( $toTitle )
&& wfFindFile( $toTitle ) )
{
- if ( !$params['ignorewarnings'] && $wgUser->isAllowed( 'reupload-shared' ) ) {
+ if ( !$params['ignorewarnings'] && $user->isAllowed( 'reupload-shared' ) ) {
$this->dieUsageMsg( 'sharedfile-exists' );
- } elseif ( !$wgUser->isAllowed( 'reupload-shared' ) ) {
+ } elseif ( !$user->isAllowed( 'reupload-shared' ) ) {
$this->dieUsageMsg( 'cantoverwrite-sharedfile' );
}
}
@@ -89,7 +84,7 @@ class ApiMove extends ApiBase {
}
$r = array( 'from' => $fromTitle->getPrefixedText(), 'to' => $toTitle->getPrefixedText(), 'reason' => $params['reason'] );
- if ( !$params['noredirect'] || !$wgUser->isAllowed( 'suppressredirect' ) ) {
+ if ( !$params['noredirect'] || !$user->isAllowed( 'suppressredirect' ) ) {
$r['redirectcreated'] = '';
}
@@ -254,7 +249,7 @@ class ApiMove extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=move&from=Exampel&to=Example&token=123ABC&reason=Misspelled%20title&movetalk=&noredirect='
);
diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php
index 65ee0db9..0727cffd 100644
--- a/includes/api/ApiOpenSearch.php
+++ b/includes/api/ApiOpenSearch.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -116,10 +111,10 @@ class ApiOpenSearch extends ApiBase {
}
public function getDescription() {
- return 'Searches the wiki using the OpenSearch protocol';
+ return 'Search the wiki using the OpenSearch protocol';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=opensearch&search=Te'
);
diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php
index 4718221d..7b84c473 100644
--- a/includes/api/ApiPageSet.php
+++ b/includes/api/ApiPageSet.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* This class contains a list of pages that the client has requested.
* Initially, when the client passes in titles=, pageids=, or revisions=
@@ -57,7 +52,7 @@ class ApiPageSet extends ApiQueryBase {
/**
* Constructor
- * @param $query ApiQuery
+ * @param $query ApiQueryBase
* @param $resolveRedirects bool Whether redirects should be resolved
* @param $convertTitles bool
*/
@@ -464,7 +459,7 @@ class ApiPageSet extends ApiQueryBase {
__METHOD__ );
$this->profileDBOut();
}
-
+
$this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
// Resolve any found redirects
@@ -645,8 +640,8 @@ class ApiPageSet extends ApiQueryBase {
// We found pages that aren't in the redirect table
// Add them
foreach ( $this->mPendingRedirectIDs as $id => $title ) {
- $article = new Article( $title );
- $rt = $article->insertRedirect();
+ $page = WikiPage::factory( $title );
+ $rt = $page->insertRedirect();
if ( !$rt ) {
// What the hell. Let's just ignore this
continue;
@@ -743,7 +738,7 @@ class ApiPageSet extends ApiQueryBase {
return $array;
}
- protected function getAllowedParams() {
+ public function getAllowedParams() {
return array(
'titles' => array(
ApiBase::PARAM_ISMULTI => true
@@ -759,7 +754,7 @@ class ApiPageSet extends ApiQueryBase {
);
}
- protected function getParamDescription() {
+ public function getParamDescription() {
return array(
'titles' => 'A list of titles to work on',
'pageids' => 'A list of page IDs to work on',
diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php
index ad098920..f2263476 100644
--- a/includes/api/ApiParamInfo.php
+++ b/includes/api/ApiParamInfo.php
@@ -24,65 +24,86 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
class ApiParamInfo extends ApiBase {
+ /**
+ * @var ApiQuery
+ */
+ protected $queryObj;
+
public function __construct( $main, $action ) {
parent::__construct( $main, $action );
+ $this->queryObj = new ApiQuery( $this->getMain(), 'query' );
}
public function execute() {
// Get parameters
$params = $this->extractRequestParams();
$result = $this->getResult();
- $queryObj = new ApiQuery( $this->getMain(), 'query' );
- $r = array();
+
+ $res = array();
if ( is_array( $params['modules'] ) ) {
- $modArr = $this->getMain()->getModules();
- $r['modules'] = array();
- foreach ( $params['modules'] as $m ) {
- if ( !isset( $modArr[$m] ) ) {
- $r['modules'][] = array( 'name' => $m, 'missing' => '' );
+ $modules = $this->getMain()->getModules();
+ $res['modules'] = array();
+ foreach ( $params['modules'] as $mod ) {
+ if ( !isset( $modules[$mod] ) ) {
+ $res['modules'][] = array( 'name' => $mod, 'missing' => '' );
continue;
}
- $obj = new $modArr[$m]( $this->getMain(), $m );
- $a = $this->getClassInfo( $obj );
- $a['name'] = $m;
- $r['modules'][] = $a;
+ $obj = new $modules[$mod]( $this->getMain(), $mod );
+
+ $item = $this->getClassInfo( $obj );
+ $item['name'] = $mod;
+ $res['modules'][] = $item;
}
- $result->setIndexedTagName( $r['modules'], 'module' );
+ $result->setIndexedTagName( $res['modules'], 'module' );
}
+
if ( is_array( $params['querymodules'] ) ) {
- $qmodArr = $queryObj->getModules();
- $r['querymodules'] = array();
+ $queryModules = $this->queryObj->getModules();
+ $res['querymodules'] = array();
foreach ( $params['querymodules'] as $qm ) {
- if ( !isset( $qmodArr[$qm] ) ) {
- $r['querymodules'][] = array( 'name' => $qm, 'missing' => '' );
+ if ( !isset( $queryModules[$qm] ) ) {
+ $res['querymodules'][] = array( 'name' => $qm, 'missing' => '' );
continue;
}
- $obj = new $qmodArr[$qm]( $this, $qm );
- $a = $this->getClassInfo( $obj );
- $a['name'] = $qm;
- $a['querytype'] = $queryObj->getModuleType( $qm );
- $r['querymodules'][] = $a;
+ $obj = new $queryModules[$qm]( $this, $qm );
+ $item = $this->getClassInfo( $obj );
+ $item['name'] = $qm;
+ $item['querytype'] = $this->queryObj->getModuleType( $qm );
+ $res['querymodules'][] = $item;
}
- $result->setIndexedTagName( $r['querymodules'], 'module' );
+ $result->setIndexedTagName( $res['querymodules'], 'module' );
}
+
if ( $params['mainmodule'] ) {
- $r['mainmodule'] = $this->getClassInfo( $this->getMain() );
+ $res['mainmodule'] = $this->getClassInfo( $this->getMain() );
}
+
if ( $params['pagesetmodule'] ) {
- $pageSet = new ApiPageSet( $queryObj );
- $r['pagesetmodule'] = $this->getClassInfo( $pageSet );
+ $pageSet = new ApiPageSet( $this->queryObj );
+ $res['pagesetmodule'] = $this->getClassInfo( $pageSet );
+ }
+
+ if ( is_array( $params['formatmodules'] ) ) {
+ $formats = $this->getMain()->getFormats();
+ $res['formatmodules'] = array();
+ foreach ( $params['formatmodules'] as $f ) {
+ if ( !isset( $formats[$f] ) ) {
+ $res['formatmodules'][] = array( 'name' => $f, 'missing' => '' );
+ continue;
+ }
+ $obj = new $formats[$f]( $this, $f );
+ $item = $this->getClassInfo( $obj );
+ $item['name'] = $f;
+ $res['formatmodules'][] = $item;
+ }
+ $result->setIndexedTagName( $res['formatmodules'], 'module' );
}
- $result->addValue( null, $this->getModuleName(), $r );
+ $result->addValue( null, $this->getModuleName(), $res );
}
/**
@@ -92,9 +113,10 @@ class ApiParamInfo extends ApiBase {
function getClassInfo( $obj ) {
$result = $this->getResult();
$retval['classname'] = get_class( $obj );
- $retval['description'] = implode( "\n", (array)$obj->getDescription() );
- $examples = (array)$obj->getExamples();
- $retval['examples'] = implode( "\n", $examples );
+ $retval['description'] = implode( "\n", (array)$obj->getFinalDescription() );
+
+ $retval['examples'] = '';
+
$retval['version'] = implode( "\n", (array)$obj->getVersion() );
$retval['prefix'] = $obj->getModulePrefix();
@@ -122,9 +144,31 @@ class ApiParamInfo extends ApiBase {
}
$result->setIndexedTagName( $retval['helpurls'], 'helpurl' );
- $retval['allexamples'] = $examples;
- if ( isset( $retval['allexamples'][0] ) && $retval['allexamples'][0] === false ) {
- $retval['allexamples'] = array();
+ $examples = $obj->getExamples();
+ $retval['allexamples'] = array();
+ if ( $examples !== false ) {
+ if ( is_string( $examples ) ) {
+ $examples = array( $examples );
+ }
+ foreach( $examples as $k => $v ) {
+ if ( strlen( $retval['examples'] ) ) {
+ $retval['examples'] .= ' ';
+ }
+ $item = array();
+ if ( is_numeric( $k ) ) {
+ $retval['examples'] .= $v;
+ $result->setContent( $item, $v );
+ } else {
+ if ( !is_array( $v ) ) {
+ $item['description'] = $v;
+ } else {
+ $item['description'] = implode( $v, "\n" );
+ }
+ $retval['examples'] .= $item['description'] . ' ' . $k;
+ $result->setContent( $item, $k );
+ }
+ $retval['allexamples'][] = $item;
+ }
}
$result->setIndexedTagName( $retval['allexamples'], 'example' );
@@ -219,15 +263,27 @@ class ApiParamInfo extends ApiBase {
}
public function getAllowedParams() {
+ $modules = array_keys( $this->getMain()->getModules() );
+ sort( $modules );
+ $querymodules = array_keys( $this->queryObj->getModules() );
+ sort( $querymodules );
+ $formatmodules = array_keys( $this->getMain()->getFormats() );
+ sort( $formatmodules );
return array(
'modules' => array(
- ApiBase::PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $modules,
),
'querymodules' => array(
- ApiBase::PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $querymodules,
),
'mainmodule' => false,
'pagesetmodule' => false,
+ 'formatmodules' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $formatmodules,
+ )
);
}
@@ -237,6 +293,7 @@ class ApiParamInfo extends ApiBase {
'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)',
'mainmodule' => 'Get information about the main (top-level) module as well',
'pagesetmodule' => 'Get information about the pageset module (providing titles= and friends) as well',
+ 'formatmodules' => 'List of format module names (value of format= parameter)',
);
}
@@ -244,7 +301,7 @@ class ApiParamInfo extends ApiBase {
return 'Obtain information about certain API parameters and errors';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=paraminfo&modules=parse&querymodules=allpages|siteinfo'
);
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php
index a3159186..893491b9 100644
--- a/includes/api/ApiParse.php
+++ b/includes/api/ApiParse.php
@@ -22,11 +22,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -63,7 +58,8 @@ class ApiParse extends ApiBase {
// The parser needs $wgTitle to be set, apparently the
// $title parameter in Parser::parse isn't enough *sigh*
- global $wgParser, $wgUser, $wgTitle, $wgLang;
+ // TODO: Does this still need $wgTitle?
+ global $wgParser, $wgTitle, $wgLang;
// Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks
$oldLang = null;
@@ -72,7 +68,7 @@ class ApiParse extends ApiBase {
$wgLang = Language::factory( $params['uselang'] );
}
- $popts = new ParserOptions();
+ $popts = ParserOptions::newFromContext( $this->getContext() );
$popts->setTidy( true );
$popts->enableLimitReport( !$params['disablepp'] );
@@ -88,7 +84,7 @@ class ApiParse extends ApiBase {
if ( !$rev ) {
$this->dieUsage( "There is no revision ID $oldid", 'missingrev' );
}
- if ( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
$this->dieUsage( "You don't have permission to view deleted revisions", 'permissiondenied' );
}
@@ -98,22 +94,20 @@ class ApiParse extends ApiBase {
// If for some reason the "oldid" is actually the current revision, it may be cached
if ( $titleObj->getLatestRevID() === intval( $oldid ) ) {
- $articleObj = new Article( $titleObj, 0 );
-
- $p_result = $this->getParsedSectionOrText( $articleObj, $titleObj, $popts, $pageid,
+ // May get from/save to parser cache
+ $p_result = $this->getParsedSectionOrText( $titleObj, $popts, $pageid,
isset( $prop['wikitext'] ) ) ;
} else { // This is an old revision, so get the text differently
- $this->text = $rev->getText( Revision::FOR_THIS_USER );
-
- $wgTitle = $titleObj;
+ $this->text = $rev->getText( Revision::FOR_THIS_USER, $this->getUser() );
if ( $this->section !== false ) {
$this->text = $this->getSectionText( $this->text, 'r' . $rev->getId() );
}
+ // Should we save old revision parses to the parser cache?
$p_result = $wgParser->parse( $this->text, $titleObj, $popts );
}
- } else { // Not $oldid
+ } else { // Not $oldid, but $pageid or $page
if ( $params['redirects'] ) {
$reqParams = array(
'action' => 'query',
@@ -155,12 +149,12 @@ class ApiParse extends ApiBase {
}
$wgTitle = $titleObj;
- $articleObj = new Article( $titleObj, 0 );
if ( isset( $prop['revid'] ) ) {
- $oldid = $articleObj->getRevIdFetched();
+ $oldid = $titleObj->getLatestRevID();
}
- $p_result = $this->getParsedSectionOrText( $articleObj, $titleObj, $popts, $pageid,
+ // Potentially cached
+ $p_result = $this->getParsedSectionOrText( $titleObj, $popts, $pageid,
isset( $prop['wikitext'] ) ) ;
}
} else { // Not $oldid, $pageid, $page. Hence based on $text
@@ -180,10 +174,11 @@ class ApiParse extends ApiBase {
}
if ( $params['pst'] || $params['onlypst'] ) {
- $this->pstText = $wgParser->preSaveTransform( $this->text, $titleObj, $wgUser, $popts );
+ $this->pstText = $wgParser->preSaveTransform( $this->text, $titleObj, $this->getUser(), $popts );
}
if ( $params['onlypst'] ) {
// Build a result and bail out
+ $result_array = array();
$result_array['text'] = array();
$result->setContent( $result_array['text'], $this->pstText );
if ( isset( $prop['wikitext'] ) ) {
@@ -193,6 +188,7 @@ class ApiParse extends ApiBase {
$result->addValue( null, $this->getModuleName(), $result_array );
return;
}
+ // Not cached (save or load)
$p_result = $wgParser->parse( $params['pst'] ? $this->pstText : $this->text, $titleObj, $popts );
}
@@ -215,7 +211,7 @@ class ApiParse extends ApiBase {
if ( !is_null( $params['summary'] ) ) {
$result_array['parsedsummary'] = array();
- $result->setContent( $result_array['parsedsummary'], $wgUser->getSkin()->formatComment( $params['summary'], $titleObj ) );
+ $result->setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
}
if ( isset( $prop['langlinks'] ) ) {
@@ -257,16 +253,16 @@ class ApiParse extends ApiBase {
}
if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) {
- $context = new RequestContext;
+ $context = $this->getContext();
+ $context->setTitle( $titleObj );
$context->getOutput()->addParserOutputNoText( $p_result );
if ( isset( $prop['headitems'] ) ) {
$headItems = $this->formatHeadItems( $p_result->getHeadItems() );
- $context->getSkin()->setupUserCss( $context->getOutput() );
$css = $this->formatCss( $context->getOutput()->buildCssLinksArray() );
- $scripts = array( $context->getOutput()->getHeadScripts( $context->getSkin() ) );
+ $scripts = array( $context->getOutput()->getHeadScripts() );
$result_array['headitems'] = array_merge( $headItems, $css, $scripts );
}
@@ -311,29 +307,29 @@ class ApiParse extends ApiBase {
}
/**
- * @param $articleObj Article
* @param $titleObj Title
* @param $popts ParserOptions
* @param $pageId Int
* @param $getWikitext Bool
* @return ParserOutput
*/
- private function getParsedSectionOrText( $articleObj, $titleObj, $popts, $pageId = null, $getWikitext = false ) {
- if ( $this->section !== false ) {
- global $wgParser;
+ private function getParsedSectionOrText( $titleObj, $popts, $pageId = null, $getWikitext = false ) {
+ global $wgParser;
+
+ $page = WikiPage::factory( $titleObj );
- $this->text = $this->getSectionText( $articleObj->getRawText(), !is_null ( $pageId )
+ if ( $this->section !== false ) {
+ $this->text = $this->getSectionText( $page->getRawText(), !is_null( $pageId )
? 'page id ' . $pageId : $titleObj->getText() );
+ // Not cached (save or load)
return $wgParser->parse( $this->text, $titleObj, $popts );
} else {
// Try the parser cache first
- $pout = $articleObj->getParserOutput();
+ // getParserOutput will save to Parser cache if able
+ $pout = $page->getParserOutput( $popts );
if ( $getWikitext ) {
- $rev = Revision::newFromTitle( $titleObj );
- if ( $rev ) {
- $this->text = $rev->getText();
- }
+ $this->text = $page->getRawText();
}
return $pout;
}
@@ -341,6 +337,7 @@ class ApiParse extends ApiBase {
private function getSectionText( $text, $what ) {
global $wgParser;
+ // Not cached (save or load)
$text = $wgParser->getSection( $text, $this->section, false );
if ( $text === false ) {
$this->dieUsage( "There is no section {$this->section} in " . $what, 'nosuchsection' );
@@ -377,7 +374,7 @@ class ApiParse extends ApiBase {
}
private function categoriesHtml( $categories ) {
- $context = $this->createContext();
+ $context = $this->getContext();
$context->getOutput()->addCategoryLinks( $categories );
return $context->getSkin()->getCategories();
}
@@ -385,8 +382,12 @@ class ApiParse extends ApiBase {
/**
* @deprecated since 1.18 No modern skin generates language links this way, please use language links
* data to generate your own HTML.
+ * @param $languages array
+ * @return string
*/
private function languagesHtml( $languages ) {
+ wfDeprecated( __METHOD__, '1.18' );
+
global $wgContLang, $wgHideInterlanguageLinks;
if ( $wgHideInterlanguageLinks || count( $languages ) == 0 ) {
@@ -584,7 +585,7 @@ class ApiParse extends ApiBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=parse&text={{Project:Sandbox}}'
);
diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php
index 8e6e8738..1332f263 100644
--- a/includes/api/ApiPatrol.php
+++ b/includes/api/ApiPatrol.php
@@ -24,10 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- require_once ( 'ApiBase.php' );
-}
-
/**
* Allows user to patrol pages
* @ingroup API
@@ -42,15 +38,13 @@ class ApiPatrol extends ApiBase {
* Patrols the article or provides the reason the patrol failed.
*/
public function execute() {
- global $wgUser;
-
$params = $this->extractRequestParams();
$rc = RecentChange::newFromID( $params['rcid'] );
if ( !$rc instanceof RecentChange ) {
$this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
}
- $retval = $rc->doMarkPatrolled( $wgUser );
+ $retval = $rc->doMarkPatrolled( $this->getUser() );
if ( $retval ) {
$this->dieUsageMsg( reset( $retval ) );
@@ -104,7 +98,7 @@ class ApiPatrol extends ApiBase {
return 'patrol';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=patrol&token=123abc&rcid=230672766'
);
diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php
index ac1e0736..fb225d86 100644
--- a/includes/api/ApiProtect.php
+++ b/includes/api/ApiProtect.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -39,7 +34,7 @@ class ApiProtect extends ApiBase {
}
public function execute() {
- global $wgUser, $wgRestrictionLevels;
+ global $wgRestrictionLevels;
$params = $this->extractRequestParams();
$titleObj = Title::newFromText( $params['title'] );
@@ -47,7 +42,7 @@ class ApiProtect extends ApiBase {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
- $errors = $titleObj->getUserPermissionsErrors( 'protect', $wgUser );
+ $errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
if ( $errors ) {
// We don't care about multiple errors, just report one of them
$this->dieUsageMsg( reset( $errors ) );
@@ -107,20 +102,16 @@ class ApiProtect extends ApiBase {
}
$cascade = $params['cascade'];
- $articleObj = new Article( $titleObj );
$watch = $params['watch'] ? 'watch' : $params['watchlist'];
$this->setWatch( $watch, $titleObj );
- if ( $titleObj->exists() ) {
- $ok = $articleObj->updateRestrictions( $protections, $params['reason'], $cascade, $expiryarray );
- } else {
- $ok = $titleObj->updateTitleProtection( $protections['create'], $params['reason'], $expiryarray['create'] );
- }
- if ( !$ok ) {
- // This is very weird. Maybe the article was deleted or the user was blocked/desysopped in the meantime?
- // Just throw an unknown error in this case, as it's very likely to be a race condition
- $this->dieUsageMsg( array() );
+ $pageObj = WikiPage::factory( $titleObj );
+ $status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
+
+ if ( !$status->isOK() ) {
+ $errors = $status->getErrorsArray();
+ $this->dieUsageMsg( $errors[0] );
}
$res = array(
'title' => $titleObj->getPrefixedText(),
@@ -217,7 +208,7 @@ class ApiProtect extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never',
'api.php?action=protect&title=Main%20Page&token=123ABC&protections=edit=all|move=all&reason=Lifting%20restrictions'
diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php
index ac5f0207..9e9320fb 100644
--- a/includes/api/ApiPurge.php
+++ b/includes/api/ApiPurge.php
@@ -25,10 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- require_once( 'ApiBase.php' );
-}
-
/**
* API interface for page purging
* @ingroup API
@@ -43,42 +39,58 @@ class ApiPurge extends ApiBase {
* Purges the cache of a page
*/
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
$params = $this->extractRequestParams();
- if ( !$wgUser->isAllowed( 'purge' ) && !$this->getMain()->isInternalMode() &&
- !$this->getMain()->getRequest()->wasPosted() ) {
+ if ( !$user->isAllowed( 'purge' ) && !$this->getMain()->isInternalMode() &&
+ !$this->getRequest()->wasPosted() ) {
$this->dieUsageMsg( array( 'mustbeposted', $this->getModuleName() ) );
}
$forceLinkUpdate = $params['forcelinkupdate'];
+ $pageSet = new ApiPageSet( $this );
+ $pageSet->execute();
$result = array();
- foreach ( $params['titles'] as $t ) {
+ foreach( $pageSet->getInvalidTitles() as $title ) {
$r = array();
- $title = Title::newFromText( $t );
- if ( !$title instanceof Title ) {
- $r['title'] = $t;
- $r['invalid'] = '';
- $result[] = $r;
- continue;
- }
+ $r['title'] = $title;
+ $r['invalid'] = '';
+ $result[] = $r;
+ }
+ foreach( $pageSet->getMissingPageIDs() as $p ) {
+ $page = array();
+ $page['pageid'] = $p;
+ $page['missing'] = '';
+ $result[] = $page;
+ }
+ foreach( $pageSet->getMissingRevisionIDs() as $r ) {
+ $rev = array();
+ $rev['revid'] = $r;
+ $rev['missing'] = '';
+ $result[] = $rev;
+ }
+
+ foreach ( $pageSet->getTitles() as $title ) {
+ $r = array();
+
ApiQueryBase::addTitleInfo( $r, $title );
if ( !$title->exists() ) {
$r['missing'] = '';
$result[] = $r;
continue;
}
- $context = $this->createContext();
- $context->setTitle( $title );
- $article = Article::newFromTitle( $title, $context );
- $article->doPurge(); // Directly purge and skip the UI part of purge().
+
+ $page = WikiPage::factory( $title );
+ $page->doPurge(); // Directly purge and skip the UI part of purge().
$r['purged'] = '';
if( $forceLinkUpdate ) {
- if ( !$wgUser->pingLimiter() ) {
+ if ( !$user->pingLimiter() ) {
global $wgParser, $wgEnableParserCache;
- $popts = new ParserOptions();
- $p_result = $wgParser->parse( $article->getContent(), $title, $popts );
+
+ $popts = ParserOptions::newFromContext( $this->getContext() );
+ $p_result = $wgParser->parse( $page->getRawText(), $title, $popts,
+ true, true, $page->getLatest() );
# Update the links tables
$u = new LinksUpdate( $title, $p_result );
@@ -88,7 +100,7 @@ class ApiPurge extends ApiBase {
if ( $wgEnableParserCache ) {
$pcache = ParserCache::singleton();
- $pcache->save( $p_result, $article, $popts );
+ $pcache->save( $p_result, $page, $popts );
}
} else {
$this->setWarning( $this->parseMsg( array( 'actionthrottledtext' ) ) );
@@ -108,18 +120,15 @@ class ApiPurge extends ApiBase {
}
public function getAllowedParams() {
- return array(
- 'titles' => array(
- ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_REQUIRED => true
- ),
+ $psModule = new ApiPageSet( $this );
+ return $psModule->getAllowedParams() + array(
'forcelinkupdate' => false,
);
}
public function getParamDescription() {
- return array(
- 'titles' => 'A list of titles',
+ $psModule = new ApiPageSet( $this );
+ return $psModule->getParamDescription() + array(
'forcelinkupdate' => 'Update the links tables',
);
}
@@ -131,14 +140,17 @@ class ApiPurge extends ApiBase {
}
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'cantpurge' ),
- ) );
+ $psModule = new ApiPageSet( $this );
+ return array_merge(
+ parent::getPossibleErrors(),
+ array( array( 'cantpurge' ), ),
+ $psModule->getPossibleErrors()
+ );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'api.php?action=purge&titles=Main_Page|API'
+ 'api.php?action=purge&titles=Main_Page|API' => 'Purge the "Main Page" and the "API" page',
);
}
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index 717b43b4..cd54a7da 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* This is the main query class. It behaves similar to ApiMain: based on the
* parameters given, it will create a list of titles to work on (an ApiPageSet
@@ -106,6 +101,8 @@ class ApiQuery extends ApiBase {
private $mSlaveDB = null;
private $mNamedDB = array();
+ protected $mAllowedGenerators = array();
+
public function __construct( $main, $action ) {
parent::__construct( $main, $action );
@@ -119,9 +116,8 @@ class ApiQuery extends ApiBase {
$this->mListModuleNames = array_keys( $this->mQueryListModules );
$this->mMetaModuleNames = array_keys( $this->mQueryMetaModules );
- // Allow the entire list of modules at first,
- // but during module instantiation check if it can be used as a generator.
- $this->mAllowedGenerators = array_merge( $this->mListModuleNames, $this->mPropModuleNames );
+ $this->makeHelpMsgHelper( $this->mQueryPropModules, 'prop' );
+ $this->makeHelpMsgHelper( $this->mQueryListModules, 'list' );
}
/**
@@ -179,7 +175,7 @@ class ApiQuery extends ApiBase {
/**
* Get the array mapping module names to class names
- * @return array(modulename => classname)
+ * @return array array(modulename => classname)
*/
function getModules() {
return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules );
@@ -281,6 +277,8 @@ class ApiQuery extends ApiBase {
* The cache mode may increase in the level of privacy, but public modules
* added to private data do not decrease the level of privacy.
*
+ * @param $cacheMode string
+ * @param $modCacheMode string
* @return string
*/
protected function mergeCacheMode( $cacheMode, $modCacheMode ) {
@@ -441,7 +439,7 @@ class ApiQuery extends ApiBase {
$vals = array();
ApiQueryBase::addTitleInfo( $vals, $title );
$vals['special'] = '';
- if ( $title->getNamespace() == NS_SPECIAL &&
+ if ( $title->isSpecialPage() &&
!SpecialPageFactory::exists( $title->getDbKey() ) ) {
$vals['missing'] = '';
} elseif ( $title->getNamespace() == NS_MEDIA &&
@@ -485,7 +483,7 @@ class ApiQuery extends ApiBase {
$titles = $pageSet->getGoodTitles();
if ( count( $titles ) ) {
foreach ( $titles as $title ) {
- if ( $title->userCanRead() ) {
+ if ( $title->userCan( 'read' ) ) {
$exportTitles[] = $title;
}
}
@@ -634,6 +632,9 @@ class ApiQuery extends ApiBase {
$moduleDescriptions = array();
foreach ( $moduleList as $moduleName => $moduleClass ) {
+ /**
+ * @var $module ApiQueryBase
+ */
$module = new $moduleClass( $this, $moduleName, null );
$msg = ApiMain::makeHelpMsgHeader( $module, $paramName );
@@ -673,7 +674,7 @@ class ApiQuery extends ApiBase {
'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ),
'redirects' => 'Automatically resolve redirects',
'converttitles' => array( "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion.",
- 'Languages that support variant conversion include kk, ku, gan, tg, sr, zh' ),
+ 'Languages that support variant conversion include gan, iu, kk, ku, shi, sr, tg, zh' ),
'indexpageids' => 'Include an additional pageids section listing all returned page IDs',
'export' => 'Export the current revisions of all given or generated pages',
'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
@@ -695,7 +696,7 @@ class ApiQuery extends ApiBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment',
'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions',
diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php
index fc56965e..78367a45 100644
--- a/includes/api/ApiQueryAllCategories.php
+++ b/includes/api/ApiQueryAllCategories.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all categories, even the ones that don't have
* category pages.
@@ -55,7 +50,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
/**
* @param $resultPageSet ApiPageSet
- * @return void
*/
private function run( $resultPageSet = null ) {
$db = $this->getDB();
@@ -196,7 +190,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
return 'Enumerate all categories';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=allcategories&acprop=size',
'api.php?action=query&generator=allcategories&gacprefix=List&prop=info',
diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php
index 822d0136..903f144f 100644
--- a/includes/api/ApiQueryAllLinks.php
+++ b/includes/api/ApiQueryAllLinks.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate links from all pages together.
*
@@ -221,7 +216,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=alllinks&alunique=&alfrom=B',
);
diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php
index 0443269e..ac112ef9 100644
--- a/includes/api/ApiQueryAllUsers.php
+++ b/includes/api/ApiQueryAllUsers.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all registered users.
*
@@ -65,10 +60,15 @@ class ApiQueryAllUsers extends ApiQueryBase {
$from = is_null( $params['from'] ) ? null : $this->keyToTitle( $params['from'] );
$to = is_null( $params['to'] ) ? null : $this->keyToTitle( $params['to'] );
- $this->addWhereRange( 'user_name', $dir, $from, $to );
+ # MySQL doesn't seem to use 'equality propagation' here, so like the
+ # ActiveUsers special page, we have to use rc_user_text for some cases.
+ $userFieldToSort = $params['activeusers'] ? 'rc_user_text' : 'user_name';
+
+ $this->addWhereRange( $userFieldToSort, $dir, $from, $to );
if ( !is_null( $params['prefix'] ) ) {
- $this->addWhere( 'user_name' . $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
+ $this->addWhere( $userFieldToSort .
+ $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
}
if ( !is_null( $params['rights'] ) ) {
@@ -148,7 +148,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
$timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
$this->addWhere( "rc_timestamp >= {$db->addQuotes( $timestamp )}" );
- $this->addOption( 'GROUP BY', 'user_name' );
+ $this->addOption( 'GROUP BY', $userFieldToSort );
}
$this->addOption( 'LIMIT', $sqlLimit );
@@ -235,10 +235,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
}
+ $lastUserObj = User::newFromName( $lastUser );
+
// Add user's group info
if ( $fld_groups ) {
- if ( !isset( $lastUserData['groups'] ) ) {
- $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( User::newFromName( $lastUser ) );
+ if ( !isset( $lastUserData['groups'] ) && $lastUserObj ) {
+ $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
}
if ( !is_null( $row->ug_group2 ) ) {
@@ -247,13 +249,13 @@ class ApiQueryAllUsers extends ApiQueryBase {
$result->setIndexedTagName( $lastUserData['groups'], 'g' );
}
- if ( $fld_implicitgroups && !isset( $lastUserData['implicitgroups'] ) ) {
- $lastUserData['implicitgroups'] = ApiQueryUsers::getAutoGroups( User::newFromName( $lastUser ) );
+ if ( $fld_implicitgroups && !isset( $lastUserData['implicitgroups'] ) && $lastUserObj ) {
+ $lastUserData['implicitgroups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
$result->setIndexedTagName( $lastUserData['implicitgroups'], 'g' );
}
if ( $fld_rights ) {
- if ( !isset( $lastUserData['rights'] ) ) {
- $lastUserData['rights'] = User::getGroupPermissions( User::newFromName( $lastUser )->getAutomaticGroups() );
+ if ( !isset( $lastUserData['rights'] ) && $lastUserObj ) {
+ $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
}
if ( !is_null( $row->ug_group2 ) ) {
$lastUserData['rights'] = array_unique( array_merge( $lastUserData['rights'],
@@ -362,7 +364,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=allusers&aufrom=Y',
);
diff --git a/includes/api/ApiQueryAllimages.php b/includes/api/ApiQueryAllimages.php
index f0fc39e3..ca344f73 100644
--- a/includes/api/ApiQueryAllimages.php
+++ b/includes/api/ApiQueryAllimages.php
@@ -26,11 +26,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all available pages.
*
@@ -249,14 +244,16 @@ class ApiQueryAllimages extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Simple Use',
- ' Show a list of images starting at the letter "B"',
- ' api.php?action=query&list=allimages&aifrom=B',
- 'Using as Generator',
- ' Show info about 4 images starting at the letter "T"',
- ' api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo',
+ 'api.php?action=query&list=allimages&aifrom=B' => array(
+ 'Simple Use',
+ 'Show a list of images starting at the letter "B"',
+ ),
+ 'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
+ 'Using as Generator',
+ 'Show info about 4 images starting at the letter "T"',
+ ),
);
}
diff --git a/includes/api/ApiQueryAllmessages.php b/includes/api/ApiQueryAllmessages.php
index d636c613..44774927 100644
--- a/includes/api/ApiQueryAllmessages.php
+++ b/includes/api/ApiQueryAllmessages.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query action to return messages from site message cache
*
@@ -65,7 +60,18 @@ class ApiQueryAllmessages extends ApiQueryBase {
// Determine which messages should we print
if ( in_array( '*', $params['messages'] ) ) {
- $message_names = array_keys( Language::getMessagesFor( 'en' ) );
+ $message_names = Language::getMessageKeysFor( $langObj->getCode() );
+ if ( $params['includelocal'] ) {
+ global $wgLanguageCode;
+ $message_names = array_unique( array_merge(
+ $message_names,
+ // Pass in the content language code so we get local messages that have a
+ // MediaWiki:msgkey page. We might theoretically miss messages that have no
+ // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
+ // just a stupid case.
+ MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+ ) );
+ }
sort( $message_names );
$messages_target = $message_names;
} else {
@@ -158,7 +164,9 @@ class ApiQueryAllmessages extends ApiQueryBase {
} else {
$msgString = $msg->plain();
}
- ApiResult::setContent( $a, $msgString );
+ if ( !$params['nocontent'] ) {
+ ApiResult::setContent( $a, $msgString );
+ }
if ( isset( $prop['default'] ) ) {
$default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
if ( !$default->exists() ) {
@@ -204,6 +212,8 @@ class ApiQueryAllmessages extends ApiQueryBase {
)
),
'enableparser' => false,
+ 'nocontent' => false,
+ 'includelocal' => false,
'args' => array(
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_ALLOW_DUPLICATES => true,
@@ -230,7 +240,11 @@ class ApiQueryAllmessages extends ApiQueryBase {
'messages' => 'Which messages to output. "*" (default) means all messages',
'prop' => 'Which properties to get',
'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
- 'Will substitute magic words, handle templates etc.' ),
+ 'Will substitute magic words, handle templates etc.' ),
+ 'nocontent' => 'If set, do not include the content of the messages in the output.',
+ 'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
+ "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
+ ),
'title' => 'Page name to use as context when parsing message (for enableparser option)',
'args' => 'Arguments to be substituted into message',
'prefix' => 'Return messages with this prefix',
@@ -246,7 +260,7 @@ class ApiQueryAllmessages extends ApiQueryBase {
return 'Return messages from this site';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&meta=allmessages&amprefix=ipb-',
'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php
index 4a216670..e003ee91 100644
--- a/includes/api/ApiQueryAllpages.php
+++ b/includes/api/ApiQueryAllpages.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all available pages.
*
@@ -312,16 +307,19 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Simple Use',
- ' Show a list of pages starting at the letter "B"',
- ' api.php?action=query&list=allpages&apfrom=B',
- 'Using as Generator',
- ' Show info about 4 pages starting at the letter "T"',
- ' api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info',
- ' Show content of first 2 non-redirect pages begining at "Re"',
- ' api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content'
+ 'api.php?action=query&list=allpages&apfrom=B' => array(
+ 'Simple Use',
+ 'Show a list of pages starting at the letter "B"',
+ ),
+ 'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
+ 'Using as Generator',
+ 'Show info about 4 pages starting at the letter "T"',
+ ),
+ 'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
+ 'Show content of first 2 non-redirect pages begining at "Re"',
+ )
);
}
diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php
index 8e2639f3..381ef550 100644
--- a/includes/api/ApiQueryBacklinks.php
+++ b/includes/api/ApiQueryBacklinks.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* This is a three-in-one module to query:
* * backlinks - links pointing to the given page,
@@ -511,7 +506,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
static $examples = array(
'backlinks' => array(
'api.php?action=query&list=backlinks&bltitle=Main%20Page',
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index 130d0403..4fe82de0 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* This is a base class for all Query modules.
* It provides some common functionality such as constructing various SQL
@@ -40,6 +35,11 @@ abstract class ApiQueryBase extends ApiBase {
private $mQueryModule, $mDb, $tables, $where, $fields, $options, $join_conds;
+ /**
+ * @param $query ApiBase
+ * @param $moduleName string
+ * @param $paramPrefix string
+ */
public function __construct( ApiBase $query, $moduleName, $paramPrefix = '' ) {
parent::__construct( $query->getMain(), $moduleName, $paramPrefix );
$this->mQueryModule = $query;
@@ -55,6 +55,7 @@ abstract class ApiQueryBase extends ApiBase {
* Public caching will only be allowed if *all* the modules that supply
* data for a given request return a cache mode of public.
*
+ * @param $params
* @return string
*/
public function getCacheMode( $params ) {
@@ -213,21 +214,26 @@ abstract class ApiQueryBase extends ApiBase {
if ( $sort ) {
$order = $field . ( $isDirNewer ? '' : ' DESC' );
- if ( !isset( $this->options['ORDER BY'] ) ) {
- $this->addOption( 'ORDER BY', $order );
- } else {
- $this->addOption( 'ORDER BY', $this->options['ORDER BY'] . ', ' . $order );
- }
+ // Append ORDER BY
+ $optionOrderBy = isset( $this->options['ORDER BY'] ) ? (array)$this->options['ORDER BY'] : array();
+ $optionOrderBy[] = $order;
+ $this->addOption( 'ORDER BY', $optionOrderBy );
}
}
+
/**
* Add a WHERE clause corresponding to a range, similar to addWhereRange,
* but converts $start and $end to database timestamps.
* @see addWhereRange
+ * @param $field
+ * @param $dir
+ * @param $start
+ * @param $end
+ * @param $sort bool
*/
protected function addTimestampWhereRange( $field, $dir, $start, $end, $sort = true ) {
$db = $this->getDb();
- return $this->addWhereRange( $field, $dir,
+ return $this->addWhereRange( $field, $dir,
$db->timestampOrNull( $start ), $db->timestampOrNull( $end ), $sort );
}
@@ -502,8 +508,7 @@ abstract class ApiQueryBase extends ApiBase {
* @return void
*/
public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
- global $wgUser;
- $userCanViewHiddenUsers = $wgUser->isAllowed( 'hideuser' );
+ $userCanViewHiddenUsers = $this->getUser()->isAllowed( 'hideuser' );
if ( $showBlockInfo || !$userCanViewHiddenUsers ) {
$this->addTables( 'ipblocks' );
diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php
index cfcaf0b3..bebb5a7d 100644
--- a/includes/api/ApiQueryBlocks.php
+++ b/includes/api/ApiQueryBlocks.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all user blocks
*
@@ -46,7 +41,7 @@ class ApiQueryBlocks extends ApiQueryBase {
}
public function execute() {
- global $wgUser, $wgContLang;
+ global $wgContLang;
$params = $this->extractRequestParams();
$this->requireMaxOneParameter( $params, 'users', 'ip' );
@@ -92,6 +87,7 @@ class ApiQueryBlocks extends ApiQueryBase {
$this->addWhereFld( 'ipb_address', $this->usernames );
$this->addWhereFld( 'ipb_auto', 0 );
}
+ $db = $this->getDB();
if ( isset( $params['ip'] ) ) {
list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
if ( $ip && $range ) {
@@ -105,7 +101,6 @@ class ApiQueryBlocks extends ApiQueryBase {
}
$prefix = substr( $lower, 0, 4 );
- $db = $this->getDB();
$this->addWhere( array(
'ipb_range_start' . $db->buildLike( $prefix, $db->anyString() ),
"ipb_range_start <= '$lower'",
@@ -114,7 +109,29 @@ class ApiQueryBlocks extends ApiQueryBase {
) );
}
- if ( !$wgUser->isAllowed( 'hideuser' ) ) {
+ if ( !is_null( $params['show'] ) ) {
+ $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'] ) )
+ ) {
+ $this->dieUsageMsg( 'show' );
+ }
+
+ $this->addWhereIf( 'ipb_user = 0', isset( $show['!account'] ) );
+ $this->addWhereIf( 'ipb_user != 0', isset( $show['account'] ) );
+ $this->addWhereIf( 'ipb_user != 0 OR ipb_range_end > ipb_range_start', isset( $show['!ip'] ) );
+ $this->addWhereIf( 'ipb_user = 0 AND ipb_range_end = ipb_range_start', isset( $show['ip'] ) );
+ $this->addWhereIf( 'ipb_expiry = '.$db->addQuotes($db->getInfinity()), isset( $show['!temp'] ) );
+ $this->addWhereIf( 'ipb_expiry != '.$db->addQuotes($db->getInfinity()), isset( $show['temp'] ) );
+ $this->addWhereIf( "ipb_range_end = ipb_range_start", isset( $show['!range'] ) );
+ $this->addWhereIf( "ipb_range_end > ipb_range_start", isset( $show['range'] ) );
+ }
+
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
$this->addWhereFld( 'ipb_deleted', 0 );
}
@@ -252,15 +269,29 @@ class ApiQueryBlocks extends ApiQueryBase {
'flags'
),
ApiBase::PARAM_ISMULTI => true
- )
+ ),
+ 'show' => array(
+ ApiBase::PARAM_TYPE => array(
+ 'account',
+ '!account',
+ 'temp',
+ '!temp',
+ 'ip',
+ '!ip',
+ 'range',
+ '!range',
+ ),
+ ApiBase::PARAM_ISMULTI => true
+ ),
);
}
public function getParamDescription() {
+ $p = $this->getModulePrefix();
return array(
'start' => 'The timestamp to start enumerating from',
'end' => 'The timestamp to stop enumerating at',
- 'dir' => $this->getDirectionDescription( $this->getModulePrefix() ),
+ 'dir' => $this->getDirectionDescription( $p ),
'ids' => 'Pipe-separated list of block IDs to list (optional)',
'users' => 'Pipe-separated list of users to search for (optional)',
'ip' => array( 'Get all blocks applying to this IP or CIDR range, including range blocks.',
@@ -279,6 +310,10 @@ class ApiQueryBlocks extends ApiQueryBase {
' range - Adds the range of IPs affected by the block',
' flags - Tags the ban with (autoblock, anononly, etc)',
),
+ 'show' => array(
+ 'Show only items that meet this criteria.',
+ "For example, to see only indefinite blocks on IPs, set {$p}show=ip|!temp"
+ ),
);
}
@@ -292,10 +327,11 @@ class ApiQueryBlocks extends ApiQueryBase {
array( 'code' => 'cidrtoobroad', 'info' => 'CIDR ranges broader than /16 are not accepted' ),
array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
+ array( 'show' ),
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=blocks',
'api.php?action=query&list=blocks&bkusers=Alice|Bob'
diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php
index a6bca698..1c1f1550 100644
--- a/includes/api/ApiQueryCategories.php
+++ b/includes/api/ApiQueryCategories.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to enumerate categories the set of pages belong to.
*
@@ -80,7 +75,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
foreach ( $params['categories'] as $cat ) {
$title = Title::newFromText( $cat );
if ( !$title || $title->getNamespace() != NS_CATEGORY ) {
- $this->setWarning( "``$cat'' is not a category" );
+ $this->setWarning( "\"$cat\" is not a category" );
} else {
$cats[] = $title->getDBkey();
}
@@ -127,11 +122,16 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
}
$this->addOption( 'USE INDEX', array( 'categorylinks' => 'cl_from' ) );
+
+ $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
// Don't order by cl_from if it's constant in the WHERE clause
if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
- $this->addOption( 'ORDER BY', 'cl_to' );
+ $this->addOption( 'ORDER BY', 'cl_to' . $dir );
} else {
- $this->addOption( 'ORDER BY', "cl_from, cl_to" );
+ $this->addOption( 'ORDER BY', array(
+ 'cl_from' . $dir,
+ 'cl_to' . $dir
+ ));
}
$res = $this->select( __METHOD__ );
@@ -213,6 +213,13 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
'categories' => array(
ApiBase::PARAM_ISMULTI => true,
),
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
+ ),
);
}
@@ -228,6 +235,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
'show' => 'Which kind of categories to show',
'continue' => 'When more results are available, use this to continue',
'categories' => 'Only list these categories. Useful for checking whether a certain page is in a certain category',
+ 'dir' => 'The direction in which to list',
);
}
@@ -241,12 +249,10 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get a list of categories [[Albert Einstein]] belongs to:',
- ' api.php?action=query&prop=categories&titles=Albert%20Einstein',
- 'Get information about all categories used in the [[Albert Einstein]]:',
- ' api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info'
+ 'api.php?action=query&prop=categories&titles=Albert%20Einstein' => 'Get a list of categories [[Albert Einstein]] belongs to',
+ 'api.php?action=query&generator=categories&titles=Albert%20Einstein&prop=info' => 'Get information about all categories used in the [[Albert Einstein]]',
);
}
diff --git a/includes/api/ApiQueryCategoryInfo.php b/includes/api/ApiQueryCategoryInfo.php
index 3130140f..c5070e87 100644
--- a/includes/api/ApiQueryCategoryInfo.php
+++ b/includes/api/ApiQueryCategoryInfo.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* This query adds the <categories> subelement to all pages with the list of categories the page is in
*
@@ -115,7 +110,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
return 'Returns information about the given categories';
}
- protected function getExamples() {
+ public function getExamples() {
return 'api.php?action=query&prop=categoryinfo&titles=Category:Foo|Category:Bar';
}
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php
index c916f5c1..4b19b7e8 100644
--- a/includes/api/ApiQueryCategoryMembers.php
+++ b/includes/api/ApiQueryCategoryMembers.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to enumerate pages that belong to a category.
*
@@ -153,7 +148,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
$endsortkey = $params['endsortkeyprefix'] !== null ?
Collation::singleton()->getSortkey( $params['endsortkeyprefix'] ) :
$params['endsortkey'];
-
+
// The below produces ORDER BY cl_sortkey, cl_from, possibly with DESC added to each of them
$this->addWhereRange( 'cl_sortkey',
$dir,
@@ -392,12 +387,10 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
);
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get first 10 pages in [[Category:Physics]]:',
- ' api.php?action=query&list=categorymembers&cmtitle=Category:Physics',
- 'Get page info about first 10 pages in [[Category:Physics]]:',
- ' api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info',
+ 'api.php?action=query&list=categorymembers&cmtitle=Category:Physics' => 'Get first 10 pages in [[Category:Physics]]',
+ 'api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&prop=info' => 'Get page info about first 10 pages in [[Category:Physics]]',
);
}
diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php
index e226070c..0a0cc93d 100644
--- a/includes/api/ApiQueryDeletedrevs.php
+++ b/includes/api/ApiQueryDeletedrevs.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all deleted revisions.
*
@@ -41,9 +36,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
}
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
// Before doing anything at all, let's check permissions
- if ( !$wgUser->isAllowed( 'deletedhistory' ) ) {
+ if ( !$user->isAllowed( 'deletedhistory' ) ) {
$this->dieUsage( 'You don\'t have permission to view deleted revision information', 'permissiondenied' );
}
@@ -58,6 +53,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$fld_parsedcomment = isset ( $prop['parsedcomment'] );
$fld_minor = isset( $prop['minor'] );
$fld_len = isset( $prop['len'] );
+ $fld_sha1 = isset( $prop['sha1'] );
$fld_content = isset( $prop['content'] );
$fld_token = isset( $prop['token'] );
@@ -106,6 +102,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$this->addFieldsIf( 'ar_comment', $fld_comment || $fld_parsedcomment );
$this->addFieldsIf( 'ar_minor_edit', $fld_minor );
$this->addFieldsIf( 'ar_len', $fld_len );
+ $this->addFieldsIf( 'ar_sha1', $fld_sha1 );
if ( $fld_content ) {
$this->addTables( 'text' );
@@ -113,7 +110,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$this->addWhere( 'ar_text_id = old_id' );
// This also means stricter restrictions
- if ( !$wgUser->isAllowed( 'undelete' ) ) {
+ if ( !$user->isAllowed( 'undelete' ) ) {
$this->dieUsage( 'You don\'t have permission to view deleted revision content', 'permissiondenied' );
}
}
@@ -132,7 +129,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
if ( $fld_token ) {
// Undelete tokens are identical for all pages, so we cache one here
- $token = $wgUser->editToken( '', $this->getMain()->getRequest() );
+ $token = $user->getEditToken( '', $this->getMain()->getRequest() );
}
$dir = $params['dir'];
@@ -214,7 +211,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
if ( $fld_revid ) {
$rev['revid'] = intval( $row->ar_rev_id );
}
- if ( $fld_parentid ) {
+ if ( $fld_parentid && !is_null( $row->ar_parent_id ) ) {
$rev['parentid'] = intval( $row->ar_parent_id );
}
if ( $fld_user ) {
@@ -230,7 +227,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
if ( $fld_parsedcomment ) {
- $rev['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->ar_comment, $title );
+ $rev['parsedcomment'] = Linker::formatComment( $row->ar_comment, $title );
}
if ( $fld_minor && $row->ar_minor_edit == 1 ) {
$rev['minor'] = '';
@@ -238,6 +235,13 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
if ( $fld_len ) {
$rev['len'] = $row->ar_len;
}
+ if ( $fld_sha1 ) {
+ if ( $row->ar_sha1 != '' ) {
+ $rev['sha1'] = wfBaseConvert( $row->ar_sha1, 36, 16, 40 );
+ } else {
+ $rev['sha1'] = '';
+ }
+ }
if ( $fld_content ) {
ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
}
@@ -319,6 +323,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
'parsedcomment',
'minor',
'len',
+ 'sha1',
'content',
'token'
),
@@ -345,7 +350,8 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
' comment - Adds the comment of the revision',
' parsedcomment - Adds the parsed comment of the revision',
' minor - Tags if the revision is minor',
- ' len - Adds the length of the revision',
+ ' len - Adds the length (bytes) of the revision',
+ ' sha1 - Adds the SHA-1 (base 16) of the revision',
' content - Adds the content of the revision',
' token - Gives the edit token',
),
@@ -385,16 +391,16 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1):',
- ' api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content',
- 'List the last 50 deleted contributions by Bob (mode 2):',
- ' api.php?action=query&list=deletedrevs&druser=Bob&drlimit=50',
- 'List the first 50 deleted revisions in the main namespace (mode 3):',
- ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50',
- 'List the first 50 deleted pages in the Talk namespace (mode 3):',
- ' api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique=',
+ 'api.php?action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&drprop=user|comment|content'
+ => 'List the last deleted revisions of Main Page and Talk:Main Page, with content (mode 1)',
+ 'api.php?action=query&list=deletedrevs&druser=Bob&drlimit=50'
+ => 'List the last 50 deleted contributions by Bob (mode 2)',
+ 'api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50'
+ => 'List the first 50 deleted revisions in the main namespace (mode 3)',
+ 'api.php?action=query&list=deletedrevs&drdir=newer&drlimit=50&drnamespace=1&drunique='
+ => 'List the first 50 deleted pages in the Talk namespace (mode 3):',
);
}
diff --git a/includes/api/ApiQueryDisabled.php b/includes/api/ApiQueryDisabled.php
index ab08042a..d68480c3 100644
--- a/includes/api/ApiQueryDisabled.php
+++ b/includes/api/ApiQueryDisabled.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API module that does nothing
*
@@ -46,7 +41,7 @@ class ApiQueryDisabled extends ApiQueryBase {
}
public function execute() {
- $this->setWarning( "The ``{$this->getModuleName()}'' module has been disabled." );
+ $this->setWarning( "The \"{$this->getModuleName()}\" module has been disabled." );
}
public function getAllowedParams() {
@@ -63,7 +58,7 @@ class ApiQueryDisabled extends ApiQueryBase {
);
}
- protected function getExamples() {
+ public function getExamples() {
return array();
}
diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php
index a68e178d..beca5879 100644
--- a/includes/api/ApiQueryDuplicateFiles.php
+++ b/includes/api/ApiQueryDuplicateFiles.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to list duplicates of the given file(s)
*
@@ -94,7 +89,8 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
);
}
- $this->addOption( 'ORDER BY', 'i1.img_name' );
+ $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+ $this->addOption( 'ORDER BY', 'i1.img_name' . $dir );
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$res = $this->select( __METHOD__ );
@@ -141,6 +137,13 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
),
'continue' => null,
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
+ ),
);
}
@@ -148,6 +151,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
return array(
'limit' => 'How many files to return',
'continue' => 'When more results are available, use this to continue',
+ 'dir' => 'The direction in which to list',
);
}
@@ -161,7 +165,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles',
'api.php?action=query&generator=allimages&prop=duplicatefiles',
diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php
index a2b2e318..93c71e2f 100644
--- a/includes/api/ApiQueryExtLinksUsage.php
+++ b/includes/api/ApiQueryExtLinksUsage.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* @ingroup API
*/
@@ -247,7 +242,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=exturlusage&euquery=www.mediawiki.org'
);
diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php
index 95297628..a9fbc839 100644
--- a/includes/api/ApiQueryExternalLinks.php
+++ b/includes/api/ApiQueryExternalLinks.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to list all external URLs found on a given set of pages.
*
@@ -148,10 +143,9 @@ class ApiQueryExternalLinks extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get a list of external links on the [[Main Page]]:',
- ' api.php?action=query&prop=extlinks&titles=Main%20Page',
+ 'api.php?action=query&prop=extlinks&titles=Main%20Page' => 'Get a list of external links on the [[Main Page]]',
);
}
diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php
index e746a6c4..be995f30 100644
--- a/includes/api/ApiQueryFilearchive.php
+++ b/includes/api/ApiQueryFilearchive.php
@@ -26,11 +26,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all deleted files.
*
@@ -43,9 +38,9 @@ class ApiQueryFilearchive extends ApiQueryBase {
}
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
// Before doing anything at all, let's check permissions
- if ( !$wgUser->isAllowed( 'deletedhistory' ) ) {
+ if ( !$user->isAllowed( 'deletedhistory' ) ) {
$this->dieUsage( 'You don\'t have permission to view deleted file information', 'permissiondenied' );
}
@@ -110,7 +105,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
}
}
- if ( !$wgUser->isAllowed( 'suppressrevision' ) ) {
+ if ( !$user->isAllowed( 'suppressrevision' ) ) {
// Filter out revisions that the user is not allowed to see. There
// is no way to indicate that we have skipped stuff because the
// continuation parameter is fa_name
@@ -166,7 +161,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
if ( $fld_description ) {
$file['description'] = $row->fa_description;
if ( isset( $prop['parseddescription'] ) ) {
- $file['parseddescription'] = $wgUser->getSkin()->formatComment(
+ $file['parseddescription'] = Linker::formatComment(
$row->fa_description, $title );
}
}
@@ -285,11 +280,12 @@ class ApiQueryFilearchive extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Simple Use',
- ' Show a list of all deleted files',
- ' api.php?action=query&list=filearchive',
+ 'api.php?action=query&list=filearchive' => array(
+ 'Simple Use',
+ 'Show a list of all deleted files',
+ ),
);
}
diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php
index 8b3c8af1..feda1779 100644
--- a/includes/api/ApiQueryIWBacklinks.php
+++ b/includes/api/ApiQueryIWBacklinks.php
@@ -25,11 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* This gives links pointing to the given interwiki
* @ingroup API
@@ -207,7 +202,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks',
'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&iwblprefix=wikibooks&prop=info'
diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php
index 30e44ae4..13256ad8 100644
--- a/includes/api/ApiQueryIWLinks.php
+++ b/includes/api/ApiQueryIWLinks.php
@@ -25,11 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to list all interwiki links on a page
*
@@ -79,20 +74,27 @@ class ApiQueryIWLinks extends ApiQueryBase {
);
}
+ $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
if ( isset( $params['prefix'] ) ) {
$this->addWhereFld( 'iwl_prefix', $params['prefix'] );
if ( isset( $params['title'] ) ) {
$this->addWhereFld( 'iwl_title', $params['title'] );
- $this->addOption( 'ORDER BY', 'iwl_from' );
+ $this->addOption( 'ORDER BY', 'iwl_from' . $dir );
} else {
- $this->addOption( 'ORDER BY', 'iwl_title, iwl_from' );
+ $this->addOption( 'ORDER BY', array(
+ 'iwl_title' . $dir,
+ 'iwl_from' . $dir
+ ));
}
} else {
// Don't order by iwl_from if it's constant in the WHERE clause
if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
- $this->addOption( 'ORDER BY', 'iwl_prefix' );
+ $this->addOption( 'ORDER BY', 'iwl_prefix' . $dir );
} else {
- $this->addOption( 'ORDER BY', 'iwl_from, iwl_prefix' );
+ $this->addOption( 'ORDER BY', array (
+ 'iwl_from' . $dir,
+ 'iwl_prefix' . $dir
+ ));
}
}
@@ -109,7 +111,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
}
$entry = array( 'prefix' => $row->iwl_prefix );
- if ( !is_null( $params['url'] ) ) {
+ if ( $params['url'] ) {
$title = Title::newFromText( "{$row->iwl_prefix}:{$row->iwl_title}" );
if ( $title ) {
$entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
@@ -131,7 +133,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
public function getAllowedParams() {
return array(
- 'url' => null,
+ 'url' => false,
'limit' => array(
ApiBase::PARAM_DFLT => 10,
ApiBase::PARAM_TYPE => 'limit',
@@ -142,6 +144,13 @@ class ApiQueryIWLinks extends ApiQueryBase {
'continue' => null,
'prefix' => null,
'title' => null,
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
+ ),
);
}
@@ -152,6 +161,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
'continue' => 'When more results are available, use this to continue',
'prefix' => 'Prefix for the interwiki',
'title' => "Interwiki link to search for. Must be used with {$this->getModulePrefix()}prefix",
+ 'dir' => 'The direction in which to list',
);
}
@@ -166,10 +176,9 @@ class ApiQueryIWLinks extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get interwiki links from the [[Main Page]]:',
- ' api.php?action=query&prop=iwlinks&titles=Main%20Page',
+ 'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
);
}
diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php
index ab179b9f..03a24821 100644
--- a/includes/api/ApiQueryImageInfo.php
+++ b/includes/api/ApiQueryImageInfo.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query action to get image information and upload history.
*
@@ -318,8 +313,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
$vals['commenthidden'] = '';
} else {
if ( $pcomment ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment(
+ $vals['parsedcomment'] = Linker::formatComment(
$file->getDescription(), $file->getTitle() );
}
if ( $comment ) {
@@ -568,7 +562,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo',
'api.php?action=query&titles=File:Test.jpg&prop=imageinfo&iilimit=50&iiend=20071231235959&iiprop=timestamp|user|url',
diff --git a/includes/api/ApiQueryImages.php b/includes/api/ApiQueryImages.php
index 5fbdc895..f03b2874 100644
--- a/includes/api/ApiQueryImages.php
+++ b/includes/api/ApiQueryImages.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* This query adds an <images> subelement to all pages with the list of images embedded into those pages.
*
@@ -79,11 +74,15 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
);
}
+ $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
// Don't order by il_from if it's constant in the WHERE clause
if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
- $this->addOption( 'ORDER BY', 'il_to' );
+ $this->addOption( 'ORDER BY', 'il_to' . $dir );
} else {
- $this->addOption( 'ORDER BY', 'il_from, il_to' );
+ $this->addOption( 'ORDER BY', array(
+ 'il_from' . $dir,
+ 'il_to' . $dir
+ ));
}
$this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -92,7 +91,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
foreach ( $params['images'] as $img ) {
$title = Title::newFromText( $img );
if ( !$title || $title->getNamespace() != NS_FILE ) {
- $this->setWarning( "``$img'' is not a file" );
+ $this->setWarning( "\"$img\" is not a file" );
} else {
$images[] = $title->getDBkey();
}
@@ -154,7 +153,14 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
'continue' => null,
'images' => array(
ApiBase::PARAM_ISMULTI => true,
- )
+ ),
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
+ ),
);
}
@@ -163,6 +169,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
'limit' => 'How many images to return',
'continue' => 'When more results are available, use this to continue',
'images' => 'Only list these images. Useful for checking whether a certain page has a certain Image.',
+ 'dir' => 'The direction in which to list',
);
}
@@ -176,12 +183,10 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get a list of images used in the [[Main Page]]:',
- ' api.php?action=query&prop=images&titles=Main%20Page',
- 'Get information about all images used in the [[Main Page]]:',
- ' api.php?action=query&generator=images&titles=Main%20Page&prop=info'
+ 'api.php?action=query&prop=images&titles=Main%20Page' => 'Get a list of images used in the [[Main Page]]',
+ 'api.php?action=query&generator=images&titles=Main%20Page&prop=info' => 'Get information about all images used in the [[Main Page]]',
);
}
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index c2f4dc92..f0d0faa3 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query module to show basic page information.
*
@@ -76,7 +71,7 @@ class ApiQueryInfo extends ApiQueryBase {
* Get an array mapping token names to their handler functions.
* The prototype for a token function is func($pageid, $title)
* it should return a token or false (permission denied)
- * @return array(tokenname => function)
+ * @return array array(tokenname => function)
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
@@ -119,7 +114,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedEditToken;
}
- $cachedEditToken = $wgUser->editToken();
+ $cachedEditToken = $wgUser->getEditToken();
return $cachedEditToken;
}
@@ -134,7 +129,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedDeleteToken;
}
- $cachedDeleteToken = $wgUser->editToken();
+ $cachedDeleteToken = $wgUser->getEditToken();
return $cachedDeleteToken;
}
@@ -149,7 +144,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedProtectToken;
}
- $cachedProtectToken = $wgUser->editToken();
+ $cachedProtectToken = $wgUser->getEditToken();
return $cachedProtectToken;
}
@@ -164,7 +159,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedMoveToken;
}
- $cachedMoveToken = $wgUser->editToken();
+ $cachedMoveToken = $wgUser->getEditToken();
return $cachedMoveToken;
}
@@ -179,7 +174,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedBlockToken;
}
- $cachedBlockToken = $wgUser->editToken();
+ $cachedBlockToken = $wgUser->getEditToken();
return $cachedBlockToken;
}
@@ -199,7 +194,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedEmailToken;
}
- $cachedEmailToken = $wgUser->editToken();
+ $cachedEmailToken = $wgUser->getEditToken();
return $cachedEmailToken;
}
@@ -214,7 +209,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedImportToken;
}
- $cachedImportToken = $wgUser->editToken();
+ $cachedImportToken = $wgUser->getEditToken();
return $cachedImportToken;
}
@@ -229,7 +224,7 @@ class ApiQueryInfo extends ApiQueryBase {
return $cachedWatchToken;
}
- $cachedWatchToken = $wgUser->editToken( 'watch' );
+ $cachedWatchToken = $wgUser->getEditToken( 'watch' );
return $cachedWatchToken;
}
@@ -383,7 +378,7 @@ class ApiQueryInfo extends ApiQueryBase {
$pageInfo['fullurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
$pageInfo['editurl'] = wfExpandUrl( $title->getFullURL( 'action=edit' ), PROTO_CURRENT );
}
- if ( $this->fld_readable && $title->userCanRead() ) {
+ if ( $this->fld_readable && $title->userCan( 'read' ) ) {
$pageInfo['readable'] = '';
}
@@ -619,9 +614,9 @@ class ApiQueryInfo extends ApiQueryBase {
* Get information about watched status and put it in $this->watched
*/
private function getWatchedInfo() {
- global $wgUser;
+ $user = $this->getUser();
- if ( $wgUser->isAnon() || count( $this->everything ) == 0 ) {
+ if ( $user->isAnon() || count( $this->everything ) == 0 ) {
return;
}
@@ -635,7 +630,7 @@ class ApiQueryInfo extends ApiQueryBase {
$this->addFields( array( 'wl_title', 'wl_namespace' ) );
$this->addWhere( array(
$lb->constructSet( 'wl', $db ),
- 'wl_user' => $wgUser->getID()
+ 'wl_user' => $user->getID()
) );
$res = $this->select( __METHOD__ );
@@ -721,7 +716,7 @@ class ApiQueryInfo extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&prop=info&titles=Main%20Page',
'api.php?action=query&prop=info&inprop=protection&titles=Main%20Page'
diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php
index 959ee789..15734944 100644
--- a/includes/api/ApiQueryLangBacklinks.php
+++ b/includes/api/ApiQueryLangBacklinks.php
@@ -25,11 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* This gives links pointing to the given interwiki
* @ingroup API
@@ -207,7 +202,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=langbacklinks&lbltitle=Test&lbllang=fr',
'api.php?action=query&generator=langbacklinks&glbltitle=Test&lbllang=fr&prop=info'
diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php
index 942655f4..fdba8465 100644
--- a/includes/api/ApiQueryLangLinks.php
+++ b/includes/api/ApiQueryLangLinks.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to list all langlinks (links to correspanding foreign language pages).
*
@@ -74,20 +69,27 @@ class ApiQueryLangLinks extends ApiQueryBase {
);
}
+ $dir = ( $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' );
+ $this->addOption( 'ORDER BY', 'll_from' . $dir );
} else {
- $this->addOption( 'ORDER BY', 'll_title, ll_from' );
+ $this->addOption( 'ORDER BY', array(
+ 'll_title' . $dir,
+ 'll_from' . $dir
+ ));
}
} else {
// Don't order by ll_from if it's constant in the WHERE clause
if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
- $this->addOption( 'ORDER BY', 'll_lang' );
+ $this->addOption( 'ORDER BY', 'll_lang' . $dir );
} else {
- $this->addOption( 'ORDER BY', 'll_from, ll_lang' );
+ $this->addOption( 'ORDER BY', array(
+ 'll_from' . $dir,
+ 'll_lang' . $dir
+ ));
}
}
@@ -135,6 +137,13 @@ class ApiQueryLangLinks extends ApiQueryBase {
'url' => false,
'lang' => null,
'title' => null,
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
+ ),
);
}
@@ -145,6 +154,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
'url' => 'Whether to get the full URL',
'lang' => 'Language code',
'title' => "Link to search for. Must be used with {$this->getModulePrefix()}lang",
+ 'dir' => 'The direction in which to list',
);
}
@@ -159,10 +169,9 @@ class ApiQueryLangLinks extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get interlanguage links from the [[Main Page]]:',
- ' api.php?action=query&prop=langlinks&titles=Main%20Page&redirects=',
+ 'api.php?action=query&prop=langlinks&titles=Main%20Page&redirects=' => 'Get interlanguage links from the [[Main Page]]',
);
}
diff --git a/includes/api/ApiQueryLinks.php b/includes/api/ApiQueryLinks.php
index 55217e2f..0377eddb 100644
--- a/includes/api/ApiQueryLinks.php
+++ b/includes/api/ApiQueryLinks.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiQueryBase.php" );
-}
-
/**
* A query module to list all wiki links on a given set of pages.
*
@@ -48,6 +43,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
$this->prefix = 'pl';
$this->description = 'link';
$this->titlesParam = 'titles';
+ $this->titlesParamDescription = 'Only list links to these titles. Useful for checking whether a certain page links to a certain title.';
$this->helpUrl = 'https://www.mediawiki.org/wiki/API:Properties#links_.2F_pl';
break;
case self::TEMPLATES:
@@ -55,6 +51,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
$this->prefix = 'tl';
$this->description = 'template';
$this->titlesParam = 'templates';
+ $this->titlesParamDescription = 'Only list these templates. Useful for checking whether a certain page uses a certain template.';
$this->helpUrl = 'https://www.mediawiki.org/wiki/API:Properties#templates_.2F_tl';
break;
default:
@@ -102,7 +99,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
foreach ( $params[$this->titlesParam] as $t ) {
$title = Title::newFromText( $t );
if ( !$title ) {
- $this->setWarning( "``$t'' is not a valid title" );
+ $this->setWarning( "\"$t\" is not a valid title" );
} else {
$lb->addObj( $title );
}
@@ -131,6 +128,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
);
}
+ $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
// Here's some MySQL craziness going on: if you use WHERE foo='bar'
// and later ORDER BY foo MySQL doesn't notice the ORDER BY is pointless
// but instead goes and filesorts, because the index for foo was used
@@ -138,15 +136,15 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
// clause from the ORDER BY clause
$order = array();
if ( count( $this->getPageSet()->getGoodTitles() ) != 1 ) {
- $order[] = "{$this->prefix}_from";
+ $order[] = $this->prefix . '_from' . $dir;
}
if ( count( $params['namespace'] ) != 1 ) {
- $order[] = "{$this->prefix}_namespace";
+ $order[] = $this->prefix . '_namespace' . $dir;
}
- $order[] = "{$this->prefix}_title";
- $this->addOption( 'ORDER BY', implode( ', ', $order ) );
- $this->addOption( 'USE INDEX', "{$this->prefix}_from" );
+ $order[] = $this->prefix . "_title" . $dir;
+ $this->addOption( 'ORDER BY', $order );
+ $this->addOption( 'USE INDEX', $this->prefix . '_from' );
$this->addOption( 'LIMIT', $params['limit'] + 1 );
$res = $this->select( __METHOD__ );
@@ -207,36 +205,38 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
$this->titlesParam => array(
ApiBase::PARAM_ISMULTI => true,
),
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
+ ),
);
}
public function getParamDescription() {
$desc = $this->description;
- $arr = array(
+ return array(
'namespace' => "Show {$desc}s in this namespace(s) only",
'limit' => "How many {$desc}s to return",
'continue' => 'When more results are available, use this to continue',
+ $this->titlesParam => $this->titlesParamDescription,
+ 'dir' => 'The direction in which to list',
);
- if ( $this->getModuleName() == self::LINKS ) {
- $arr[$this->titlesParam] = 'Only list links to these titles. Useful for checking whether a certain page links to a certain title.';
- } elseif ( $this->getModuleName() == self::TEMPLATES ) {
- $arr[$this->titlesParam] = 'Only list these templates. Useful for checking whether a certain page uses a certain template.';
- }
- return $arr;
}
public function getDescription() {
return "Returns all {$this->description}s from the given page(s)";
}
- protected function getExamples() {
+ public function getExamples() {
+ $desc = $this->description;
+ $name = $this->getModuleName();
return array(
- "Get {$this->description}s from the [[Main Page]]:",
- " api.php?action=query&prop={$this->getModuleName()}&titles=Main%20Page",
- "Get information about the {$this->description} pages in the [[Main Page]]:",
- " api.php?action=query&generator={$this->getModuleName()}&titles=Main%20Page&prop=info",
- "Get {$this->description}s from the Main Page in the User and Template namespaces:",
- " api.php?action=query&prop={$this->getModuleName()}&titles=Main%20Page&{$this->prefix}namespace=2|10"
+ "api.php?action=query&prop={$name}&titles=Main%20Page" => "Get {$desc}s from the [[Main Page]]:",
+ "api.php?action=query&generator={$name}&titles=Main%20Page&prop=info" => "Get information about the {$desc} pages in the [[Main Page]]:",
+ "api.php?action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10" => "Get {$desc}s from the Main Page in the User and Template namespaces:",
);
}
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
index 669ab71f..0d07a254 100644
--- a/includes/api/ApiQueryLogEvents.php
+++ b/includes/api/ApiQueryLogEvents.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query action to List the log events, with optional filtering by various parameters.
*
@@ -202,26 +197,44 @@ class ApiQueryLogEvents extends ApiQueryBase {
* @param $ts
* @return array
*/
- public static function addLogParams( $result, &$vals, $params, $type, $action, $ts ) {
- $params = explode( "\n", $params );
+ public static function addLogParams( $result, &$vals, $params, $type, $action, $ts, $legacy = false ) {
switch ( $type ) {
case 'move':
- if ( isset( $params[0] ) ) {
- $title = Title::newFromText( $params[0] );
+ if ( $legacy ){
+ $targetKey = 0;
+ $noredirKey = 1;
+ } else {
+ $targetKey = '4::target';
+ $noredirKey = '5::noredir';
+ }
+
+ if ( isset( $params[ $targetKey ] ) ) {
+ $title = Title::newFromText( $params[ $targetKey ] );
if ( $title ) {
$vals2 = array();
ApiQueryBase::addTitleInfo( $vals2, $title, 'new_' );
$vals[$type] = $vals2;
}
}
- if ( isset( $params[1] ) && $params[1] ) {
+ if ( isset( $params[ $noredirKey ] ) && $params[ $noredirKey ] ) {
$vals[$type]['suppressedredirect'] = '';
}
$params = null;
break;
case 'patrol':
+ if ( $legacy ){
+ $cur = 0;
+ $prev = 1;
+ $auto = 2;
+ } else {
+ $cur = '4::curid';
+ $prev = '5::previd';
+ $auto = '6::auto';
+ }
$vals2 = array();
- list( $vals2['cur'], $vals2['prev'], $vals2['auto'] ) = $params;
+ $vals2['cur'] = $params[$cur];
+ $vals2['prev'] = $params[$prev];
+ $vals2['auto'] = $params[$auto];
$vals[$type] = $vals2;
$params = null;
break;
@@ -255,6 +268,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
private function extractRowInfo( $row ) {
+ $logEntry = DatabaseLogEntry::newFromRow( $row );
$vals = array();
if ( $this->fld_ids ) {
@@ -286,10 +300,11 @@ class ApiQueryLogEvents extends ApiQueryBase {
self::addLogParams(
$this->getResult(),
$vals,
- $row->log_params,
- $row->log_type,
- $row->log_action,
- $row->log_timestamp
+ $logEntry->getParameters(),
+ $logEntry->getType(),
+ $logEntry->getSubtype(),
+ $logEntry->getTimestamp(),
+ $logEntry->isLegacy()
);
}
}
@@ -323,8 +338,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
}
if ( $this->fld_parsedcomment ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->log_comment, $title );
+ $vals['parsedcomment'] = Linker::formatComment( $row->log_comment, $title );
}
}
}
@@ -445,7 +459,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=logevents'
);
diff --git a/includes/api/ApiQueryPageProps.php b/includes/api/ApiQueryPageProps.php
index 56213fa3..1eef67e6 100644
--- a/includes/api/ApiQueryPageProps.php
+++ b/includes/api/ApiQueryPageProps.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query module to show basic page information.
*
@@ -142,7 +137,7 @@ class ApiQueryPageProps extends ApiQueryBase {
return 'Get various properties defined in the page content';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&prop=pageprops&titles=Category:Foo',
);
diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php
index ff703cda..44cc1d32 100644
--- a/includes/api/ApiQueryProtectedTitles.php
+++ b/includes/api/ApiQueryProtectedTitles.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate all create-protected pages.
*
@@ -112,8 +107,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
}
if ( isset( $prop['parsedcomment'] ) ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->pt_reason, $title );
+ $vals['parsedcomment'] = Linker::formatComment( $row->pt_reason, $title );
}
if ( isset( $prop['expiry'] ) ) {
@@ -224,7 +218,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
return 'List all titles protected from creation';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=protectedtitles',
);
diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php
index b38df6b6..5eba0de6 100644
--- a/includes/api/ApiQueryQueryPage.php
+++ b/includes/api/ApiQueryQueryPage.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to get the results of a QueryPage-based special page
*
@@ -73,15 +68,13 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
/**
* @param $resultPageSet ApiPageSet
- * @return void
*/
public function run( $resultPageSet = null ) {
- global $wgUser;
$params = $this->extractRequestParams();
$result = $this->getResult();
$qp = new $this->qpMap[$params['page']]();
- if ( !$qp->userCanExecute( $wgUser ) ) {
+ if ( !$qp->userCanExecute( $this->getUser() ) ) {
$this->dieUsageMsg( 'specialpage-cantexecute' );
}
@@ -98,7 +91,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
}
}
$result->addValue( array( 'query' ), $this->getModuleName(), $r );
-
+
if ( $qp->isCached() && !$qp->isCacheable() ) {
// Disabled query page, don't run the query
return;
@@ -183,10 +176,11 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
+ array( 'specialpage-cantexecute' )
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=querypage&qppage=Ancientpages'
);
diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php
index dea0b0f5..2e9e2dd5 100644
--- a/includes/api/ApiQueryRandom.php
+++ b/includes/api/ApiQueryRandom.php
@@ -25,11 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to get list of random pages
*
@@ -175,7 +170,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
);
}
- protected function getExamples() {
+ public function getExamples() {
return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
}
diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php
index 9ce6688e..bf5bbd9b 100644
--- a/includes/api/ApiQueryRecentChanges.php
+++ b/includes/api/ApiQueryRecentChanges.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query action to enumerate the recent changes that were done to the wiki.
* Various filters are supported.
@@ -52,7 +47,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
* Get an array mapping token names to their handler functions.
* The prototype for a token function is func($pageid, $title, $rc)
* it should return a token or false (permission denied)
- * @return array(tokenname => function)
+ * @return array array(tokenname => function)
*/
protected function getTokenFunctions() {
// Don't call the hooks twice
@@ -89,7 +84,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
// The patrol token is always the same, let's exploit that
static $cachedPatrolToken = null;
if ( is_null( $cachedPatrolToken ) ) {
- $cachedPatrolToken = $wgUser->editToken( 'patrol' );
+ $cachedPatrolToken = $wgUser->getEditToken( 'patrol' );
}
return $cachedPatrolToken;
@@ -129,7 +124,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
* @param $resultPageSet ApiPageSet
*/
public function run( $resultPageSet = null ) {
- global $wgUser;
+ $user = $this->getUser();
/* Get the parameters of the request. */
$params = $this->extractRequestParams();
@@ -163,7 +158,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
// Check permissions
if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
- if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
}
@@ -219,7 +214,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
/* Set up internal members based upon params. */
$this->initProperties( $prop );
- if ( $this->fld_patrolled && !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ if ( $this->fld_patrolled && !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
@@ -410,8 +405,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
}
if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->rc_comment, $title );
+ $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title );
}
if ( $this->fld_redirect ) {
@@ -633,7 +627,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=recentchanges'
);
diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php
index 401406bb..fa58bdf0 100644
--- a/includes/api/ApiQueryRevisions.php
+++ b/includes/api/ApiQueryRevisions.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query action to enumerate revisions of a given page, or show top revisions of multiple pages.
* Various pieces of information may be shown - flags, comments, and the actual wiki markup of the rev.
@@ -84,8 +79,8 @@ class ApiQueryRevisions extends ApiQueryBase {
if ( !$wgUser->isAllowed( 'rollback' ) ) {
return false;
}
- return $wgUser->editToken( array( $title->getPrefixedText(),
- $rev->getUserText() ) );
+ return $wgUser->getEditToken(
+ array( $title->getPrefixedText(), $rev->getUserText() ) );
}
public function execute() {
@@ -159,6 +154,7 @@ class ApiQueryRevisions extends ApiQueryBase {
$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_userid = isset( $prop['userid'] );
$this->fld_user = isset ( $prop['user'] );
$this->token = $params['token'];
@@ -196,7 +192,7 @@ class ApiQueryRevisions extends ApiQueryBase {
if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
// For each page we will request, the user must have read rights for that page
foreach ( $pageSet->getGoodTitles() as $title ) {
- if ( !$title->userCanRead() ) {
+ if ( !$title->userCan( 'read' ) ) {
$this->dieUsage(
'The current user is not allowed to read ' . $title->getPrefixedText(),
'accessdenied' );
@@ -409,8 +405,20 @@ class ApiQueryRevisions extends ApiQueryBase {
$vals['timestamp'] = wfTimestamp( TS_ISO_8601, $revision->getTimestamp() );
}
- if ( $this->fld_size && !is_null( $revision->getSize() ) ) {
- $vals['size'] = intval( $revision->getSize() );
+ if ( $this->fld_size ) {
+ if ( !is_null( $revision->getSize() ) ) {
+ $vals['size'] = intval( $revision->getSize() );
+ } else {
+ $vals['size'] = 0;
+ }
+ }
+
+ if ( $this->fld_sha1 ) {
+ if ( $revision->getSha1() != '' ) {
+ $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
+ } else {
+ $vals['sha1'] = '';
+ }
}
if ( $this->fld_comment || $this->fld_parsedcomment ) {
@@ -424,8 +432,7 @@ class ApiQueryRevisions extends ApiQueryBase {
}
if ( $this->fld_parsedcomment ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $comment, $title );
+ $vals['parsedcomment'] = Linker::formatComment( $comment, $title );
}
}
}
@@ -468,7 +475,7 @@ class ApiQueryRevisions extends ApiQueryBase {
}
if ( $this->fld_content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
if ( $this->generateXML ) {
- $wgParser->startExternalParse( $title, new ParserOptions(), OT_PREPROCESS );
+ $wgParser->startExternalParse( $title, ParserOptions::newFromContext( $this->getContext() ), OT_PREPROCESS );
$dom = $wgParser->preprocessToDom( $text );
if ( is_callable( array( $dom, 'saveXML' ) ) ) {
$xml = $dom->saveXML();
@@ -479,10 +486,10 @@ class ApiQueryRevisions extends ApiQueryBase {
}
if ( $this->expandTemplates && !$this->parseContent ) {
- $text = $wgParser->preprocess( $text, $title, new ParserOptions() );
+ $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
}
if ( $this->parseContent ) {
- $text = $wgParser->parse( $text, $title, new ParserOptions() )->getText();
+ $text = $wgParser->parse( $text, $title, ParserOptions::newFromContext( $this->getContext() ) )->getText();
}
ApiResult::setContent( $vals, $text );
} elseif ( $this->fld_content ) {
@@ -494,11 +501,13 @@ class ApiQueryRevisions extends ApiQueryBase {
static $n = 0; // Number of uncached diffs we've had
if ( $n < $wgAPIMaxUncachedDiffs ) {
$vals['diff'] = array();
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $title );
if ( !is_null( $this->difftotext ) ) {
- $engine = new DifferenceEngine( $title );
+ $engine = new DifferenceEngine( $context );
$engine->setText( $text, $this->difftotext );
} else {
- $engine = new DifferenceEngine( $title, $revision->getID(), $this->diffto );
+ $engine = new DifferenceEngine( $context, $revision->getID(), $this->diffto );
$vals['diff']['from'] = $engine->getOldid();
$vals['diff']['to'] = $engine->getNewid();
}
@@ -537,6 +546,7 @@ class ApiQueryRevisions extends ApiQueryBase {
'user',
'userid',
'size',
+ 'sha1',
'comment',
'parsedcomment',
'content',
@@ -599,7 +609,8 @@ class ApiQueryRevisions extends ApiQueryBase {
' timestamp - The timestamp of the revision',
' user - User that made the revision',
' userid - User id of revision creator',
- ' size - Length of the revision',
+ ' size - Length (bytes) of the revision',
+ ' sha1 - SHA-1 (base 16) of the revision',
' comment - Comment by the user for revision',
' parsedcomment - Parsed comment by the user for the revision',
' content - Text of the revision',
@@ -651,15 +662,15 @@ class ApiQueryRevisions extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Get data with content for the last revision of titles "API" and "Main Page":',
+ 'Get data with content for the last revision of titles "API" and "Main Page"',
' api.php?action=query&prop=revisions&titles=API|Main%20Page&rvprop=timestamp|user|comment|content',
- 'Get last 5 revisions of the "Main Page":',
+ 'Get last 5 revisions of the "Main Page"',
' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment',
- 'Get first 5 revisions of the "Main Page":',
+ 'Get first 5 revisions of the "Main Page"',
' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvdir=newer',
- 'Get first 5 revisions of the "Main Page" made after 2006-05-01:',
+ 'Get first 5 revisions of the "Main Page" made after 2006-05-01',
' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvdir=newer&rvstart=20060501000000',
'Get first 5 revisions of the "Main Page" that were not made made by anonymous user "127.0.0.1"',
' api.php?action=query&prop=revisions&titles=Main%20Page&rvlimit=5&rvprop=timestamp|user|comment&rvexcludeuser=127.0.0.1',
diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php
index 5c133b7d..40aac050 100644
--- a/includes/api/ApiQuerySearch.php
+++ b/includes/api/ApiQuerySearch.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to perform full text search within wiki titles and content
*
@@ -69,6 +64,9 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
$search->setNamespaces( $params['namespace'] );
$search->showRedirects = $params['redirects'];
+ $query = $search->transformSearchTerm( $query );
+ $query = $search->replacePrefixes( $query );
+
// Perform the actual search
if ( $what == 'text' ) {
$matches = $search->searchText( $query );
@@ -293,7 +291,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=search&srsearch=meaning',
'api.php?action=query&list=search&srwhat=text&srsearch=meaning',
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index 56743189..e2580ac6 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* A query action to return meta information about the wiki site.
*
@@ -43,6 +38,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
public function execute() {
$params = $this->extractRequestParams();
$done = array();
+ $fit = false;
foreach ( $params['prop'] as $p ) {
switch ( $p ) {
case 'general':
@@ -138,6 +134,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
$data['rights'] = $GLOBALS['wgRightsText'];
$data['lang'] = $GLOBALS['wgLanguageCode'];
+
+ $fallbacks = array();
+ foreach( $wgContLang->getFallbackLanguages() as $code ) {
+ $fallbacks[] = array( 'code' => $code );
+ }
+ $data['fallback'] = $fallbacks;
+ $this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
+
if ( $wgContLang->isRTL() ) {
$data['rtl'] = '';
}
@@ -256,40 +260,44 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
protected function appendInterwikiMap( $property, $filter ) {
- $this->resetQueryParams();
- $this->addTables( 'interwiki' );
- $this->addFields( array( 'iw_prefix', 'iw_local', 'iw_url', 'iw_wikiid', 'iw_api' ) );
-
+ $local = null;
if ( $filter === 'local' ) {
- $this->addWhere( 'iw_local = 1' );
+ $local = 1;
} elseif ( $filter === '!local' ) {
- $this->addWhere( 'iw_local = 0' );
+ $local = 0;
} elseif ( $filter ) {
ApiBase::dieDebug( __METHOD__, "Unknown filter=$filter" );
}
- $this->addOption( 'ORDER BY', 'iw_prefix' );
+ $params = $this->extractRequestParams();
+ $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
- $res = $this->select( __METHOD__ );
+ if( $langCode ) {
+ $langNames = Language::getTranslatedLanguageNames( $langCode );
+ } else {
+ $langNames = Language::getLanguageNames();
+ }
+ $getPrefixes = Interwiki::getAllPrefixes( $local );
$data = array();
- $langNames = Language::getLanguageNames();
- foreach ( $res as $row ) {
+
+ foreach ( $getPrefixes as $row ) {
+ $prefix = $row['iw_prefix'];
$val = array();
- $val['prefix'] = $row->iw_prefix;
- if ( $row->iw_local == '1' ) {
+ $val['prefix'] = $prefix;
+ if ( $row['iw_local'] == '1' ) {
$val['local'] = '';
}
- // $val['trans'] = intval( $row->iw_trans ); // should this be exposed?
- if ( isset( $langNames[$row->iw_prefix] ) ) {
- $val['language'] = $langNames[$row->iw_prefix];
+ // $val['trans'] = intval( $row['iw_trans'] ); // should this be exposed?
+ if ( isset( $langNames[$prefix] ) ) {
+ $val['language'] = $langNames[$prefix];
}
- $val['url'] = wfExpandUrl( $row->iw_url, PROTO_CURRENT );
- if( isset( $row->iw_wikiid ) ) {
- $val['wikiid'] = $row->iw_wikiid;
+ $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
+ if( isset( $row['iw_wikiid'] ) ) {
+ $val['wikiid'] = $row['iw_wikiid'];
}
- if( isset( $row->iw_api ) ) {
- $val['api'] = $row->iw_api;
+ if( isset( $row['iw_api'] ) ) {
+ $val['api'] = $row['iw_api'];
}
$data[] = $val;
@@ -467,8 +475,18 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
public function appendLanguages( $property ) {
+ $params = $this->extractRequestParams();
+ $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
+
+ if( $langCode ) {
+ $langNames = Language::getTranslatedLanguageNames( $langCode );
+ } else {
+ $langNames = Language::getLanguageNames();
+ }
+
$data = array();
- foreach ( Language::getLanguageNames() as $code => $name ) {
+
+ foreach ( $langNames as $code => $name ) {
$lang = array( 'code' => $code );
ApiResult::setContent( $lang, $name );
$data[] = $lang;
@@ -565,10 +583,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
),
'showalldb' => false,
'numberingroup' => false,
+ 'inlanguagecode' => null,
);
}
public function getParamDescription() {
+ $p = $this->getModulePrefix();
return array(
'prop' => array(
'Which sysinfo properties to get:',
@@ -578,13 +598,13 @@ 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)',
+ " 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',
+ " 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',
@@ -593,6 +613,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
'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)',
);
}
@@ -606,7 +627,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics',
'api.php?action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local',
diff --git a/includes/api/ApiQueryStashImageInfo.php b/includes/api/ApiQueryStashImageInfo.php
index b1903025..4501ec58 100644
--- a/includes/api/ApiQueryStashImageInfo.php
+++ b/includes/api/ApiQueryStashImageInfo.php
@@ -45,6 +45,11 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
$this->dieUsage( "One of filekey or sessionkey must be supplied", 'nofilekey');
}
+ // Alias sessionkey to filekey, but give an existing filekey precedence.
+ if ( !$params['filekey'] && $params['sessionkey'] ) {
+ $params['filekey'] = $params['sessionkey'];
+ }
+
try {
$stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
@@ -122,7 +127,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
return 'Returns image information for stashed images';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&prop=stashimageinfo&siifilekey=124sd34rsdf567',
'api.php?action=query&prop=stashimageinfo&siifilekey=b34edoe3|bceffd4&siiurlwidth=120&siiprop=url',
diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php
index 4ab0c3d1..12cea1d7 100644
--- a/includes/api/ApiQueryTags.php
+++ b/includes/api/ApiQueryTags.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to enumerate change tags.
*
@@ -178,7 +173,7 @@ class ApiQueryTags extends ApiQueryBase {
return 'List change tags';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
);
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php
index f6a9fe46..8e2f20db 100644
--- a/includes/api/ApiQueryUserContributions.php
+++ b/includes/api/ApiQueryUserContributions.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* This query action adds a list of a specified user's contributions to the output.
*
@@ -146,7 +141,7 @@ class ApiQueryContributions extends ApiQueryBase {
// We're after the revision table, and the corresponding page
// row for anything we retrieve. We may also need the
// recentchanges row and/or tag summary row.
- global $wgUser;
+ $user = $this->getUser();
$tables = array( 'page', 'revision' ); // Order may change
$this->addWhere( 'page_id=rev_page' );
@@ -167,7 +162,7 @@ class ApiQueryContributions extends ApiQueryBase {
);
}
- if ( !$wgUser->isAllowed( 'hideuser' ) ) {
+ if ( !$user->isAllowed( 'hideuser' ) ) {
$this->addWhere( $this->getDB()->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
}
// We only want pages by the specified users.
@@ -216,7 +211,7 @@ class ApiQueryContributions extends ApiQueryBase {
if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ||
$this->fld_patrolled ) {
- if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
@@ -275,6 +270,9 @@ class ApiQueryContributions extends ApiQueryBase {
/**
* Extract fields from the database row and append them to a result array
+ *
+ * @param $row
+ * @return array
*/
private function extractRowInfo( $row ) {
$vals = array();
@@ -321,8 +319,7 @@ class ApiQueryContributions extends ApiQueryBase {
}
if ( $this->fld_parsedcomment ) {
- global $wgUser;
- $vals['parsedcomment'] = $wgUser->getSkin()->formatComment( $row->rev_comment, $title );
+ $vals['parsedcomment'] = Linker::formatComment( $row->rev_comment, $title );
}
}
}
@@ -444,7 +441,7 @@ class ApiQueryContributions extends ApiQueryBase {
' tags - Lists tags for the edit',
),
'show' => array( "Show only items that meet this criteria, e.g. non minor edits only: {$p}show=!minor",
- "NOTE: if {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than $wgRCMaxAge won\'t be shown", ),
+ "NOTE: if {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than \$wgRCMaxAge ($wgRCMaxAge) won't be shown", ),
'tag' => 'Only list revisions tagged with this tag',
'toponly' => 'Only list changes which are the latest revision',
);
@@ -463,7 +460,7 @@ class ApiQueryContributions extends ApiQueryBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=usercontribs&ucuser=YurikBot',
'api.php?action=query&list=usercontribs&ucuserprefix=217.121.114.',
diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php
index 2411bee9..a0ee227f 100644
--- a/includes/api/ApiQueryUserInfo.php
+++ b/includes/api/ApiQueryUserInfo.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to get information about the currently logged-in user
*
@@ -55,47 +50,48 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
protected function getCurrentUserInfo() {
- global $wgUser, $wgRequest, $wgHiddenPrefs;
+ global $wgRequest, $wgHiddenPrefs;
+ $user = $this->getUser();
$result = $this->getResult();
$vals = array();
- $vals['id'] = intval( $wgUser->getId() );
- $vals['name'] = $wgUser->getName();
+ $vals['id'] = intval( $user->getId() );
+ $vals['name'] = $user->getName();
- if ( $wgUser->isAnon() ) {
+ if ( $user->isAnon() ) {
$vals['anon'] = '';
}
if ( isset( $this->prop['blockinfo'] ) ) {
- if ( $wgUser->isBlocked() ) {
- $vals['blockedby'] = User::whoIs( $wgUser->blockedBy() );
- $vals['blockreason'] = $wgUser->blockedFor();
+ if ( $user->isBlocked() ) {
+ $vals['blockedby'] = User::whoIs( $user->blockedBy() );
+ $vals['blockreason'] = $user->blockedFor();
}
}
- if ( isset( $this->prop['hasmsg'] ) && $wgUser->getNewtalk() ) {
+ if ( isset( $this->prop['hasmsg'] ) && $user->getNewtalk() ) {
$vals['messages'] = '';
}
if ( isset( $this->prop['groups'] ) ) {
- $autolist = ApiQueryUsers::getAutoGroups( $wgUser );
+ $autolist = ApiQueryUsers::getAutoGroups( $user );
- $vals['groups'] = array_merge( $autolist, $wgUser->getGroups() );
+ $vals['groups'] = array_merge( $autolist, $user->getGroups() );
$result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
}
if ( isset( $this->prop['implicitgroups'] ) ) {
- $vals['implicitgroups'] = ApiQueryUsers::getAutoGroups( $wgUser );
+ $vals['implicitgroups'] = ApiQueryUsers::getAutoGroups( $user );
$result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
}
if ( isset( $this->prop['rights'] ) ) {
// User::getRights() may return duplicate values, strip them
- $vals['rights'] = array_values( array_unique( $wgUser->getRights() ) );
+ $vals['rights'] = array_values( array_unique( $user->getRights() ) );
$result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
}
if ( isset( $this->prop['changeablegroups'] ) ) {
- $vals['changeablegroups'] = $wgUser->changeableGroups();
+ $vals['changeablegroups'] = $user->changeableGroups();
$result->setIndexedTagName( $vals['changeablegroups']['add'], 'g' );
$result->setIndexedTagName( $vals['changeablegroups']['remove'], 'g' );
$result->setIndexedTagName( $vals['changeablegroups']['add-self'], 'g' );
@@ -103,17 +99,17 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
if ( isset( $this->prop['options'] ) ) {
- $vals['options'] = $wgUser->getOptions();
+ $vals['options'] = $user->getOptions();
}
if ( isset( $this->prop['preferencestoken'] ) &&
is_null( $this->getMain()->getRequest()->getVal( 'callback' ) )
) {
- $vals['preferencestoken'] = $wgUser->editToken( '', $this->getMain()->getRequest() );
+ $vals['preferencestoken'] = $user->getEditToken( '', $this->getMain()->getRequest() );
}
if ( isset( $this->prop['editcount'] ) ) {
- $vals['editcount'] = intval( $wgUser->getEditCount() );
+ $vals['editcount'] = intval( $user->getEditCount() );
}
if ( isset( $this->prop['ratelimits'] ) ) {
@@ -121,19 +117,19 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $wgHiddenPrefs ) ) {
- $vals['realname'] = $wgUser->getRealName();
+ $vals['realname'] = $user->getRealName();
}
if ( isset( $this->prop['email'] ) ) {
- $vals['email'] = $wgUser->getEmail();
- $auth = $wgUser->getEmailAuthenticationTimestamp();
+ $vals['email'] = $user->getEmail();
+ $auth = $user->getEmailAuthenticationTimestamp();
if ( !is_null( $auth ) ) {
$vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
}
}
if ( isset( $this->prop['registrationdate'] ) ) {
- $regDate = $wgUser->getRegistration();
+ $regDate = $user->getRegistration();
if ( $regDate !== false ) {
$vals['registrationdate'] = wfTimestamp( TS_ISO_8601, $regDate );
}
@@ -154,25 +150,26 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
protected function getRateLimits() {
- global $wgUser, $wgRateLimits;
- if ( !$wgUser->isPingLimitable() ) {
+ global $wgRateLimits;
+ $user = $this->getUser();
+ if ( !$user->isPingLimitable() ) {
return array(); // No limits
}
// Find out which categories we belong to
$categories = array();
- if ( $wgUser->isAnon() ) {
+ if ( $user->isAnon() ) {
$categories[] = 'anon';
} else {
$categories[] = 'user';
}
- if ( $wgUser->isNewbie() ) {
+ if ( $user->isNewbie() ) {
$categories[] = 'ip';
$categories[] = 'subnet';
- if ( !$wgUser->isAnon() )
+ if ( !$user->isAnon() )
$categories[] = 'newbie';
}
- $categories = array_merge( $categories, $wgUser->getGroups() );
+ $categories = array_merge( $categories, $user->getGroups() );
// Now get the actual limits
$retval = array();
@@ -238,7 +235,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
return 'Get information about the current user';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&meta=userinfo',
'api.php?action=query&meta=userinfo&uiprop=blockinfo|groups|rights|hasmsg',
diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php
index 31437827..31624bdf 100644
--- a/includes/api/ApiQueryUsers.php
+++ b/includes/api/ApiQueryUsers.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* Query module to get information about a list of users
*
@@ -74,7 +69,7 @@ class ApiQueryUsers extends ApiQueryBase {
global $wgUser;
// Since the permissions check for userrights is non-trivial,
// don't bother with it here
- return $wgUser->editToken( $user->getName() );
+ return $wgUser->getEditToken( $user->getName() );
}
public function execute() {
@@ -322,7 +317,7 @@ class ApiQueryUsers extends ApiQueryBase {
return 'Get information about a list of users';
}
- protected function getExamples() {
+ public function getExamples() {
return 'api.php?action=query&list=users&ususers=brion|TimStarling&usprop=groups|editcount|gender';
}
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
index 77ecb90a..ea56fcd9 100644
--- a/includes/api/ApiQueryWatchlist.php
+++ b/includes/api/ApiQueryWatchlist.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* This query action allows clients to retrieve a list of recently modified pages
* that are part of the logged-in user's watchlist.
@@ -159,8 +154,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
// Check permissions.
if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) {
- global $wgUser;
- if ( !$wgUser->useRCPatrol() && !$wgUser->useNPPatrol() ) {
+ $user = $this->getUser();
+ if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
}
@@ -438,7 +433,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=watchlist',
'api.php?action=query&list=watchlist&wlprop=ids|title|timestamp|user|comment',
diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php
index 126f6d89..506944f0 100644
--- a/includes/api/ApiQueryWatchlistRaw.php
+++ b/includes/api/ApiQueryWatchlistRaw.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiQueryBase.php' );
-}
-
/**
* This query action allows clients to retrieve a list of pages
* on the logged-in user's watchlist.
@@ -197,7 +192,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=query&list=watchlistraw',
'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
diff --git a/includes/api/ApiResult.php b/includes/api/ApiResult.php
index a8ca6046..798b2275 100644
--- a/includes/api/ApiResult.php
+++ b/includes/api/ApiResult.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* This class represents the result of the API operations.
* It simply wraps a nested array() structure, adding some functions to simplify array's modifications.
@@ -246,11 +241,12 @@ class ApiResult extends ApiBase {
/**
* Add value to the output data at the given path.
- * Path is an indexed array, each element specifying the branch at which to add the new value
- * Setting $path to array('a','b','c') is equivalent to data['a']['b']['c'] = $value
- * If $name is empty, the $value is added as a next list element data[] = $value
+ * Path can be an indexed array, each element specifying the branch at which to add the new
+ * value. Setting $path to array('a','b','c') is equivalent to data['a']['b']['c'] = $value.
+ * If $path is null, the value will be inserted at the data root.
+ * If $name is empty, the $value is added as a next list element data[] = $value.
*
- * @param $path
+ * @param $path array|string|null
* @param $name string
* @param $value mixed
* @param $overwrite bool
@@ -259,6 +255,7 @@ class ApiResult extends ApiBase {
*/
public function addValue( $path, $name, $value, $overwrite = false ) {
global $wgAPIMaxResultSize;
+
$data = &$this->mData;
if ( $this->mCheckingSize ) {
$newsize = $this->mSize + self::size( $value );
diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php
index 154e5dfb..436c392b 100644
--- a/includes/api/ApiRollback.php
+++ b/includes/api/ApiRollback.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -52,11 +47,11 @@ class ApiRollback extends ApiBase {
$params = $this->extractRequestParams();
// User and title already validated in call to getTokenSalt from Main
- $titleObj = $this->getTitle();
- $articleObj = new Article( $titleObj );
+ $titleObj = $this->getRbTitle();
+ $pageObj = WikiPage::factory( $titleObj );
$summary = ( isset( $params['summary'] ) ? $params['summary'] : '' );
$details = array();
- $retval = $articleObj->doRollback( $this->getUser(), $summary, $params['token'], $params['markbot'], $details );
+ $retval = $pageObj->doRollback( $this->getRbUser(), $summary, $params['token'], $params['markbot'], $details, $this->getUser() );
if ( $retval ) {
// We don't care about multiple errors, just report one of them
@@ -141,10 +136,10 @@ class ApiRollback extends ApiBase {
}
public function getTokenSalt() {
- return array( $this->getTitle()->getPrefixedText(), $this->getUser() );
+ return array( $this->getRbTitle()->getPrefixedText(), $this->getRbUser() );
}
- private function getUser() {
+ private function getRbUser() {
if ( $this->mUser !== null ) {
return $this->mUser;
}
@@ -165,7 +160,7 @@ class ApiRollback extends ApiBase {
/**
* @return Title
*/
- private function getTitle() {
+ private function getRbTitle() {
if ( $this->mTitleObj !== null ) {
return $this->mTitleObj;
}
@@ -184,7 +179,7 @@ class ApiRollback extends ApiBase {
return $this->mTitleObj;
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC',
'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&token=123ABC&summary=Reverting%20vandalism&markbot=1'
diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php
index e4410379..f0e1fad6 100644
--- a/includes/api/ApiRsd.php
+++ b/includes/api/ApiRsd.php
@@ -25,10 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- require_once( 'ApiBase.php' );
-}
-
/**
* API module for sending out RSD information
* @ingroup API
@@ -71,7 +67,7 @@ class ApiRsd extends ApiBase {
return 'Export an RSD (Really Simple Discovery) schema';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=rsd'
);
diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php
index 9c3bcf69..db94fd5b 100644
--- a/includes/api/ApiUnblock.php
+++ b/includes/api/ApiUnblock.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* API module that facilitates the unblocking of users. Requires API write mode
* to be enabled.
@@ -45,11 +40,11 @@ class ApiUnblock extends ApiBase {
* Unblocks the specified user or provides the reason the unblock failed.
*/
public function execute() {
- global $wgUser;
+ $user = $this->getUser();
$params = $this->extractRequestParams();
if ( $params['gettoken'] ) {
- $res['unblocktoken'] = $wgUser->editToken( '', $this->getMain()->getRequest() );
+ $res['unblocktoken'] = $user->getEditToken( '', $this->getMain()->getRequest() );
$this->getResult()->addValue( null, $this->getModuleName(), $res );
return;
}
@@ -61,12 +56,12 @@ class ApiUnblock extends ApiBase {
$this->dieUsageMsg( 'unblock-idanduser' );
}
- if ( !$wgUser->isAllowed( 'block' ) ) {
+ if ( !$user->isAllowed( 'block' ) ) {
$this->dieUsageMsg( 'cantunblock' );
}
# bug 15810: blocked admins should have limited access here
- if ( $wgUser->isBlocked() ) {
- $status = SpecialBlock::checkUnblockSelf( $params['user'] );
+ if ( $user->isBlocked() ) {
+ $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
if ( $status !== true ) {
$this->dieUsageMsg( $status );
}
@@ -77,7 +72,7 @@ class ApiUnblock extends ApiBase {
'Reason' => is_null( $params['reason'] ) ? '' : $params['reason']
);
$block = Block::newFromTarget( $data['Target'] );
- $retval = SpecialUnblock::processUnblock( $data );
+ $retval = SpecialUnblock::processUnblock( $data, $this->getContext() );
if ( $retval !== true ) {
$this->dieUsageMsg( $retval[0] );
}
@@ -141,7 +136,7 @@ class ApiUnblock extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=unblock&id=105',
'api.php?action=unblock&user=Bob&reason=Sorry%20Bob'
diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php
index 2be70108..d3429972 100644
--- a/includes/api/ApiUndelete.php
+++ b/includes/api/ApiUndelete.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -39,14 +34,13 @@ class ApiUndelete extends ApiBase {
}
public function execute() {
- global $wgUser;
$params = $this->extractRequestParams();
- if ( !$wgUser->isAllowed( 'undelete' ) ) {
+ if ( !$this->getUser()->isAllowed( 'undelete' ) ) {
$this->dieUsageMsg( 'permdenied-undelete' );
}
- if ( $wgUser->isBlocked() ) {
+ if ( $this->getUser()->isBlocked() ) {
$this->dieUsageMsg( 'blockedtext' );
}
@@ -74,7 +68,7 @@ class ApiUndelete extends ApiBase {
if ( $retval[1] ) {
wfRunHooks( 'FileUndeleteComplete',
- array( $titleObj, array(), $wgUser, $params['reason'] ) );
+ array( $titleObj, array(), $this->getUser(), $params['reason'] ) );
}
$this->setWatch( $params['watchlist'], $titleObj );
@@ -152,7 +146,7 @@ class ApiUndelete extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=undelete&title=Main%20Page&token=123ABC&reason=Restoring%20main%20page',
'api.php?action=undelete&title=Main%20Page&token=123ABC&timestamps=20070703220045|20070702194856'
diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php
index e9598378..fdc1eff0 100644
--- a/includes/api/ApiUpload.php
+++ b/includes/api/ApiUpload.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -46,18 +41,19 @@ class ApiUpload extends ApiBase {
}
public function execute() {
- global $wgUser;
-
// Check whether upload is enabled
if ( !UploadBase::isEnabled() ) {
$this->dieUsageMsg( 'uploaddisabled' );
}
+ $user = $this->getUser();
+
// Parameter handling
$this->mParams = $this->extractRequestParams();
$request = $this->getMain()->getRequest();
// Add the uploaded file to the params array
$this->mParams['file'] = $request->getFileName( 'file' );
+ $this->mParams['chunk'] = $request->getFileName( 'chunk' );
// Copy the session key to the file key, for backward compatibility.
if( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
@@ -74,7 +70,7 @@ class ApiUpload extends ApiBase {
}
// First check permission to upload
- $this->checkPermissions( $wgUser );
+ $this->checkPermissions( $user );
// Fetch the file
$status = $this->mUpload->fetchFile();
@@ -85,49 +81,26 @@ class ApiUpload extends ApiBase {
}
// Check if the uploaded file is sane
- $this->verifyUpload();
-
-
+ if ( $this->mParams['chunk'] ) {
+ $maxSize = $this->mUpload->getMaxUploadSize( );
+ if( $this->mParams['filesize'] > $maxSize ) {
+ $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
+ }
+ } else {
+ $this->verifyUpload();
+ }
+
// Check if the user has the rights to modify or overwrite the requested title
// (This check is irrelevant if stashing is already requested, since the errors
// can always be fixed by changing the title)
if ( ! $this->mParams['stash'] ) {
- $permErrors = $this->mUpload->verifyTitlePermissions( $wgUser );
+ $permErrors = $this->mUpload->verifyTitlePermissions( $user );
if ( $permErrors !== true ) {
$this->dieRecoverableError( $permErrors[0], 'filename' );
}
}
-
- // Prepare the API result
- $result = array();
-
- $warnings = $this->getApiWarnings();
- if ( $warnings ) {
- $result['result'] = 'Warning';
- $result['warnings'] = $warnings;
- // in case the warnings can be fixed with some further user action, let's stash this upload
- // and return a key they can use to restart it
- try {
- $result['filekey'] = $this->performStash();
- $result['sessionkey'] = $result['filekey']; // backwards compatibility
- } catch ( MWException $e ) {
- $result['warnings']['stashfailed'] = $e->getMessage();
- }
- } elseif ( $this->mParams['stash'] ) {
- // Some uploads can request they be stashed, so as not to publish them immediately.
- // In this case, a failure to stash ought to be fatal
- try {
- $result['result'] = 'Success';
- $result['filekey'] = $this->performStash();
- $result['sessionkey'] = $result['filekey']; // backwards compatibility
- } catch ( MWException $e ) {
- $this->dieUsage( $e->getMessage(), 'stashfailed' );
- }
- } else {
- // This is the most common case -- a normal upload with no warnings
- // $result will be formatted properly for the API already, with a status
- $result = $this->performUpload();
- }
+ // Get the result based on the current upload context:
+ $result = $this->getContextResult();
if ( $result['result'] === 'Success' ) {
$result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
@@ -138,7 +111,93 @@ class ApiUpload extends ApiBase {
// Cleanup any temporary mess
$this->mUpload->cleanupTempFile();
}
-
+ /**
+ * Get an uplaod result based on upload context
+ */
+ private function getContextResult(){
+ $warnings = $this->getApiWarnings();
+ if ( $warnings ) {
+ // Get warnings formated in result array format
+ return $this->getWarningsResult( $warnings );
+ } elseif ( $this->mParams['chunk'] ) {
+ // Add chunk, and get result
+ return $this->getChunkResult();
+ } elseif ( $this->mParams['stash'] ) {
+ // Stash the file and get stash result
+ return $this->getStashResult();
+ }
+ // This is the most common case -- a normal upload with no warnings
+ // performUpload will return a formatted properly for the API with status
+ return $this->performUpload();
+ }
+ /**
+ * Get Stash Result, throws an expetion if the file could not be stashed.
+ */
+ private function getStashResult(){
+ $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 {
+ $result['result'] = 'Success';
+ $result['filekey'] = $this->performStash();
+ $result['sessionkey'] = $result['filekey']; // backwards compatibility
+ } catch ( MWException $e ) {
+ $this->dieUsage( $e->getMessage(), 'stashfailed' );
+ }
+ return $result;
+ }
+ /**
+ * Get Warnings Result
+ * @param $warnings Array of Api upload warnings
+ */
+ private function getWarningsResult( $warnings ){
+ $result = array();
+ $result['result'] = 'Warning';
+ $result['warnings'] = $warnings;
+ // in case the warnings can be fixed with some further user action, let's stash this upload
+ // and return a key they can use to restart it
+ try {
+ $result['filekey'] = $this->performStash();
+ $result['sessionkey'] = $result['filekey']; // backwards compatibility
+ } catch ( MWException $e ) {
+ $result['warnings']['stashfailed'] = $e->getMessage();
+ }
+ return $result;
+ }
+ /**
+ * Get the result of a chunk upload.
+ */
+ private function getChunkResult(){
+ $result = array();
+
+ $result['result'] = 'Continue';
+ $request = $this->getMain()->getRequest();
+ $chunkPath = $request->getFileTempname( 'chunk' );
+ $chunkSize = $request->getUpload( 'chunk' )->getSize();
+ if ($this->mParams['offset'] == 0) {
+ $result['filekey'] = $this->performStash();
+ } else {
+ $status = $this->mUpload->addChunk($chunkPath, $chunkSize,
+ $this->mParams['offset']);
+ if ( !$status->isGood() ) {
+ $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+ return ;
+ }
+ $result['filekey'] = $this->mParams['filekey'];
+ // Check we added the last chunk:
+ if( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+ $status = $this->mUpload->concatenateChunks();
+ if ( !$status->isGood() ) {
+ $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+ return ;
+ }
+ $result['result'] = 'Success';
+ }
+ }
+ $result['offset'] = $this->mParams['offset'] + $chunkSize;
+ return $result;
+ }
+
/**
* Stash the file and return the file key
* Also re-raises exceptions with slightly more informative message strings (useful for API)
@@ -147,7 +206,12 @@ class ApiUpload extends ApiBase {
*/
function performStash() {
try {
- $fileKey = $this->mUpload->stashFile()->getFileKey();
+ $stashFile = $this->mUpload->stashFile();
+
+ if ( !$stashFile ) {
+ throw new MWException( 'Invalid stashed file' );
+ }
+ $fileKey = $stashFile->getFileKey();
} catch ( MWException $e ) {
$message = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage();
wfDebug( __METHOD__ . ' ' . $message . "\n");
@@ -188,9 +252,11 @@ class ApiUpload extends ApiBase {
protected function selectUploadModule() {
$request = $this->getMain()->getRequest();
- // One and only one of the following parameters is needed
- $this->requireOnlyOneParameter( $this->mParams,
- 'filekey', 'file', 'url', 'statuskey' );
+ // chunk or one and only one of the following parameters is needed
+ if( !$this->mParams['chunk'] ) {
+ $this->requireOnlyOneParameter( $this->mParams,
+ 'filekey', 'file', 'url', 'statuskey' );
+ }
if ( $this->mParams['statuskey'] ) {
$this->checkAsyncDownloadEnabled();
@@ -214,17 +280,32 @@ class ApiUpload extends ApiBase {
$this->dieUsageMsg( array( 'missingparam', 'filename' ) );
}
- if ( $this->mParams['filekey'] ) {
+ if ( $this->mParams['chunk'] ) {
+ // Chunk upload
+ $this->mUpload = new UploadFromChunks();
+ if( isset( $this->mParams['filekey'] ) ){
+ // handle new chunk
+ $this->mUpload->continueChunks(
+ $this->mParams['filename'],
+ $this->mParams['filekey'],
+ $request->getUpload( 'chunk' )
+ );
+ } else {
+ // handle first chunk
+ $this->mUpload->initialize(
+ $this->mParams['filename'],
+ $request->getUpload( 'chunk' )
+ );
+ }
+ } elseif ( isset( $this->mParams['filekey'] ) ) {
// Upload stashed in a previous request
if ( !UploadFromStash::isValidKey( $this->mParams['filekey'] ) ) {
$this->dieUsageMsg( 'invalid-file-key' );
}
- // context allows access to the current user without creating new $wgUser references
- $context = $this->createContext();
- $this->mUpload = new UploadFromStash( $context->getUser() );
- $this->mUpload->initialize( $this->mParams['filekey'], $this->mParams['filename'] );
+ $this->mUpload = new UploadFromStash( $this->getUser() );
+ $this->mUpload->initialize( $this->mParams['filekey'], $this->mParams['filename'] );
} elseif ( isset( $this->mParams['file'] ) ) {
$this->mUpload = new UploadFromFile();
$this->mUpload->initialize(
@@ -255,7 +336,6 @@ class ApiUpload extends ApiBase {
$this->mUpload = new UploadFromUrl;
$this->mUpload->initialize( $this->mParams['filename'],
$this->mParams['url'], $async );
-
}
return true;
@@ -300,6 +380,9 @@ class ApiUpload extends ApiBase {
$this->dieRecoverableError( 'illegal-filename', 'filename',
array( 'filename' => $verification['filtered'] ) );
break;
+ case UploadBase::FILENAME_TOO_LONG:
+ $this->dieRecoverableError( 'filename-toolong', 'filename' );
+ break;
case UploadBase::FILETYPE_MISSING:
$this->dieRecoverableError( 'filetype-missing', 'filename' );
break;
@@ -383,10 +466,10 @@ class ApiUpload extends ApiBase {
/**
* Perform the actual upload. Returns a suitable result array on success;
* dies on failure.
+ *
+ * @return array
*/
protected function performUpload() {
- global $wgUser;
-
// Use comment as initial page text by default
if ( is_null( $this->mParams['text'] ) ) {
$this->mParams['text'] = $this->mParams['comment'];
@@ -402,7 +485,7 @@ class ApiUpload extends ApiBase {
// No errors, no warnings: do the upload
$status = $this->mUpload->performUpload( $this->mParams['comment'],
- $this->mParams['text'], $watch, $wgUser );
+ $this->mParams['text'], $watch, $this->getUser() );
if ( !$status->isGood() ) {
$error = $status->getErrorsArray();
@@ -479,6 +562,10 @@ class ApiUpload extends ApiBase {
),
'stash' => false,
+ 'filesize' => null,
+ 'offset' => null,
+ 'chunk' => null,
+
'asyncdownload' => false,
'leavemessage' => false,
'statuskey' => null,
@@ -497,11 +584,15 @@ class ApiUpload extends ApiBase {
'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
'ignorewarnings' => 'Ignore any warnings',
'file' => 'File contents',
- 'url' => 'Url to fetch the file from',
+ 'url' => 'URL to fetch the file from',
'filekey' => 'Key that identifies a previous upload that was stashed temporarily.',
'sessionkey' => 'Same as filekey, maintained for backward compatibility.',
'stash' => 'If set, the server will not add the file to the repository and stash it temporarily.',
+ 'chunk' => 'Chunk contents',
+ 'offset' => 'Offset of chunk in bytes',
+ 'filesize' => 'Filesize of entire upload',
+
'asyncdownload' => 'Make fetching a URL asynchronous',
'leavemessage' => 'If asyncdownload is used, leave a message on the user talk page if finished',
'statuskey' => 'Fetch the upload status for this file key',
@@ -552,12 +643,12 @@ class ApiUpload extends ApiBase {
return '';
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'Upload from a URL:',
- ' api.php?action=upload&filename=Wiki.png&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png',
- 'Complete an upload that failed due to warnings:',
- ' api.php?action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1',
+ 'api.php?action=upload&filename=Wiki.png&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png'
+ => 'Upload from a URL',
+ 'api.php?action=upload&filename=Wiki.png&filekey=filekey&ignorewarnings=1'
+ => 'Complete an upload that failed due to warnings',
);
}
diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php
index 74948ce0..191dd3ec 100644
--- a/includes/api/ApiUserrights.php
+++ b/includes/api/ApiUserrights.php
@@ -25,11 +25,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( "ApiBase.php" );
-}
-
/**
* @ingroup API
*/
@@ -44,7 +39,7 @@ class ApiUserrights extends ApiBase {
public function execute() {
$params = $this->extractRequestParams();
- $user = $this->getUser();
+ $user = $this->getUrUser();
$form = new UserrightsPage;
$r['user'] = $user->getName();
@@ -62,7 +57,7 @@ class ApiUserrights extends ApiBase {
/**
* @return User
*/
- private function getUser() {
+ private function getUrUser() {
if ( $this->mUser !== null ) {
return $this->mUser;
}
@@ -130,10 +125,10 @@ class ApiUserrights extends ApiBase {
}
public function getTokenSalt() {
- return $this->getUser()->getName();
+ return $this->getUrUser()->getName();
}
- protected function getExamples() {
+ public function getExamples() {
return array(
'api.php?action=userrights&user=FooBot&add=bot&remove=sysop|bureaucrat&token=123ABC'
);
diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php
index 27846ab7..fa382b3b 100644
--- a/includes/api/ApiWatch.php
+++ b/includes/api/ApiWatch.php
@@ -24,11 +24,6 @@
* @file
*/
-if ( !defined( 'MEDIAWIKI' ) ) {
- // Eclipse helper - will be ignored in production
- require_once( 'ApiBase.php' );
-}
-
/**
* API module to allow users to watch a page
*
@@ -41,8 +36,8 @@ class ApiWatch extends ApiBase {
}
public function execute() {
- global $wgUser;
- if ( !$wgUser->isLoggedIn() ) {
+ $user = $this->getUser();
+ if ( !$user->isLoggedIn() ) {
$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
}
@@ -53,17 +48,16 @@ class ApiWatch extends ApiBase {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
- $article = new Article( $title, 0 );
$res = array( 'title' => $title->getPrefixedText() );
if ( $params['unwatch'] ) {
$res['unwatched'] = '';
- $res['message'] = wfMsgExt( 'removedwatchtext', array( 'parse' ), $title->getPrefixedText() );
- $success = WatchAction::doUnwatch( $title, $wgUser );
+ $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
+ $success = UnwatchAction::doUnwatch( $title, $user );
} else {
$res['watched'] = '';
- $res['message'] = wfMsgExt( 'addedwatchtext', array( 'parse' ), $title->getPrefixedText() );
- $success = UnwatchAction::doWatch( $title, $wgUser );
+ $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
+ $success = WatchAction::doWatch( $title, $user );
}
if ( !$success ) {
$this->dieUsageMsg( 'hookaborted' );
@@ -118,10 +112,10 @@ class ApiWatch extends ApiBase {
) );
}
- protected function getExamples() {
+ public function getExamples() {
return array(
- 'api.php?action=watch&title=Main_Page',
- 'api.php?action=watch&title=Main_Page&unwatch=',
+ 'api.php?action=watch&title=Main_Page' => 'Watch the page "Main Page"',
+ 'api.php?action=watch&title=Main_Page&unwatch=' => 'Unwatch the page "Main Page"',
);
}
diff --git a/includes/cache/CacheDependency.php b/includes/cache/CacheDependency.php
index aa020664..0df0cd89 100644
--- a/includes/cache/CacheDependency.php
+++ b/includes/cache/CacheDependency.php
@@ -28,6 +28,8 @@ class DependencyWrapper {
/**
* Returns true if any of the dependencies have expired
+ *
+ * @return bool
*/
function isExpired() {
foreach ( $this->deps as $dep ) {
@@ -51,6 +53,7 @@ class DependencyWrapper {
/**
* Get the user-defined value
+ * @return bool|\Mixed
*/
function getValue() {
return $this->value;
@@ -143,6 +146,9 @@ class FileDependency extends CacheDependency {
$this->timestamp = $timestamp;
}
+ /**
+ * @return array
+ */
function __sleep() {
$this->loadDependencyValues();
return array( 'filename', 'timestamp' );
@@ -265,11 +271,15 @@ class TitleListDependency extends CacheDependency {
/**
* Construct a dependency on a list of titles
+ * @param $linkBatch LinkBatch
*/
function __construct( LinkBatch $linkBatch ) {
$this->linkBatch = $linkBatch;
}
+ /**
+ * @return array
+ */
function calculateTimestamps() {
# Initialise values to false
$timestamps = array();
@@ -314,6 +324,9 @@ class TitleListDependency extends CacheDependency {
return array( 'timestamps' );
}
+ /**
+ * @return LinkBatch
+ */
function getLinkBatch() {
if ( !isset( $this->linkBatch ) ) {
$this->linkBatch = new LinkBatch;
@@ -370,6 +383,9 @@ class GlobalDependency extends CacheDependency {
* @return bool
*/
function isExpired() {
+ 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
new file mode 100644
index 00000000..37401655
--- /dev/null
+++ b/includes/cache/FileCacheBase.php
@@ -0,0 +1,249 @@
+<?php
+/**
+ * Contain the FileCacheBase class
+ * @file
+ * @ingroup Cache
+ */
+abstract class FileCacheBase {
+ protected $mKey;
+ protected $mType = 'object';
+ protected $mExt = 'cache';
+ protected $mFilePath;
+ protected $mUseGzip;
+ /* lazy loaded */
+ protected $mCached;
+
+ /* @TODO: configurable? */
+ const MISS_FACTOR = 15; // log 1 every MISS_FACTOR cache misses
+ const MISS_TTL_SEC = 3600; // how many seconds ago is "recent"
+
+ protected function __construct() {
+ global $wgUseGzip;
+
+ $this->mUseGzip = (bool)$wgUseGzip;
+ }
+
+ /**
+ * Get the base file cache directory
+ * @return string
+ */
+ final protected function baseCacheDirectory() {
+ global $wgFileCacheDirectory;
+ return $wgFileCacheDirectory;
+ }
+
+ /**
+ * Get the base cache directory (not specific to this file)
+ * @return string
+ */
+ abstract protected function cacheDirectory();
+
+ /**
+ * Get the path to the cache file
+ * @return string
+ */
+ protected function cachePath() {
+ if ( $this->mFilePath !== null ) {
+ return $this->mFilePath;
+ }
+
+ $dir = $this->cacheDirectory();
+ # Build directories (methods include the trailing "/")
+ $subDirs = $this->typeSubdirectory() . $this->hashSubdirectory();
+ # Avoid extension confusion
+ $key = str_replace( '.', '%2E', urlencode( $this->mKey ) );
+ # Build the full file path
+ $this->mFilePath = "{$dir}/{$subDirs}{$key}.{$this->mExt}";
+ if ( $this->useGzip() ) {
+ $this->mFilePath .= '.gz';
+ }
+
+ return $this->mFilePath;
+ }
+
+ /**
+ * Check if the cache file exists
+ * @return bool
+ */
+ public function isCached() {
+ if ( $this->mCached === null ) {
+ $this->mCached = file_exists( $this->cachePath() );
+ }
+ return $this->mCached;
+ }
+
+ /**
+ * Get the last-modified timestamp of the cache file
+ * @return string|false TS_MW timestamp
+ */
+ public function cacheTimestamp() {
+ $timestamp = filemtime( $this->cachePath() );
+ return ( $timestamp !== false )
+ ? wfTimestamp( TS_MW, $timestamp )
+ : false;
+ }
+
+ /**
+ * Check if up to date cache file exists
+ * @param $timestamp string MW_TS timestamp
+ *
+ * @return bool
+ */
+ public function isCacheGood( $timestamp = '' ) {
+ global $wgCacheEpoch;
+
+ if ( !$this->isCached() ) {
+ return false;
+ }
+
+ $cachetime = $this->cacheTimestamp();
+ $good = ( $timestamp <= $cachetime && $wgCacheEpoch <= $cachetime );
+ wfDebug( __METHOD__ . ": cachetime $cachetime, touched '{$timestamp}' epoch {$wgCacheEpoch}, good $good\n" );
+
+ return $good;
+ }
+
+ /**
+ * Check if the cache is gzipped
+ * @return bool
+ */
+ protected function useGzip() {
+ return $this->mUseGzip;
+ }
+
+ /**
+ * Get the uncompressed text from the cache
+ * @return string
+ */
+ public function fetchText() {
+ // gzopen can transparently read from gziped or plain text
+ $fh = gzopen( $this->cachePath(), 'rb' );
+ return stream_get_contents( $fh );
+ }
+
+ /**
+ * Save and compress text to the cache
+ * @return string compressed text
+ */
+ public function saveText( $text ) {
+ global $wgUseFileCache;
+
+ if ( !$wgUseFileCache ) {
+ return false;
+ }
+
+ if ( $this->useGzip() ) {
+ $text = gzencode( $text );
+ }
+
+ $this->checkCacheDirs(); // build parent dir
+ if ( !file_put_contents( $this->cachePath(), $text, LOCK_EX ) ) {
+ wfDebug( __METHOD__ . "() failed saving ". $this->cachePath() . "\n");
+ $this->mCached = null;
+ return false;
+ }
+
+ $this->mCached = true;
+ return $text;
+ }
+
+ /**
+ * Clear the cache for this page
+ * @return void
+ */
+ public function clearCache() {
+ wfSuppressWarnings();
+ unlink( $this->cachePath() );
+ wfRestoreWarnings();
+ $this->mCached = false;
+ }
+
+ /**
+ * Create parent directors of $this->cachePath()
+ * @return void
+ */
+ protected function checkCacheDirs() {
+ wfMkdirParents( dirname( $this->cachePath() ), null, __METHOD__ );
+ }
+
+ /**
+ * Get the cache type subdirectory (with trailing slash)
+ * An extending class could use that method to alter the type -> directory
+ * mapping. @see HTMLFileCache::typeSubdirectory() for an example.
+ *
+ * @return string
+ */
+ protected function typeSubdirectory() {
+ return $this->mType . '/';
+ }
+
+ /**
+ * Return relative multi-level hash subdirectory (with trailing slash)
+ * or the empty string if not $wgFileCacheDepth
+ * @return string
+ */
+ protected function hashSubdirectory() {
+ global $wgFileCacheDepth;
+
+ $subdir = '';
+ if ( $wgFileCacheDepth > 0 ) {
+ $hash = md5( $this->mKey );
+ for ( $i = 1; $i <= $wgFileCacheDepth; $i++ ) {
+ $subdir .= substr( $hash, 0, $i ) . '/';
+ }
+ }
+
+ return $subdir;
+ }
+
+ /**
+ * Roughly increments the cache misses in the last hour by unique visitors
+ * @param $request WebRequest
+ * @return void
+ */
+ public function incrMissesRecent( WebRequest $request ) {
+ global $wgMemc;
+ if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
+ # Get a large IP range that should include the user even if that
+ # person's IP address changes
+ $ip = $request->getIP();
+ if ( !IP::isValid( $ip ) ) {
+ return;
+ }
+ $ip = IP::isIPv6( $ip )
+ ? IP::sanitizeRange( "$ip/32" )
+ : IP::sanitizeRange( "$ip/16" );
+
+ # Bail out if a request already came from this range...
+ $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
+ if ( $wgMemc->get( $key ) ) {
+ return; // possibly the same user
+ }
+ $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+
+ # Increment the number of cache misses...
+ $key = $this->cacheMissKey();
+ if ( $wgMemc->get( $key ) === false ) {
+ $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+ } else {
+ $wgMemc->incr( $key );
+ }
+ }
+ }
+
+ /**
+ * Roughly gets the cache misses in the last hour by unique visitors
+ * @return int
+ */
+ public function getMissesRecent() {
+ global $wgMemc;
+ return self::MISS_FACTOR * $wgMemc->get( $this->cacheMissKey() );
+ }
+
+ /**
+ * @return string
+ */
+ protected function cacheMissKey() {
+ return wfMemcKey( get_class( $this ), 'misses', $this->mType, $this->mKey );
+ }
+}
diff --git a/includes/GenderCache.php b/includes/cache/GenderCache.php
index a17ac024..342f8dba 100644
--- a/includes/GenderCache.php
+++ b/includes/cache/GenderCache.php
@@ -111,7 +111,7 @@ class GenderCache {
}
if ( count( $users ) === 0 ) {
- return false;
+ return;
}
$dbr = wfGetDB( DB_SLAVE );
diff --git a/includes/cache/HTMLCacheUpdate.php b/includes/cache/HTMLCacheUpdate.php
index d542800d..11e2ae74 100644
--- a/includes/cache/HTMLCacheUpdate.php
+++ b/includes/cache/HTMLCacheUpdate.php
@@ -23,8 +23,7 @@
*
* @ingroup Cache
*/
-class HTMLCacheUpdate
-{
+class HTMLCacheUpdate implements DeferrableUpdate {
/**
* @var Title
*/
@@ -33,6 +32,12 @@ class HTMLCacheUpdate
public $mTable, $mPrefix, $mStart, $mEnd;
public $mRowsPerJob, $mRowsPerQuery;
+ /**
+ * @param $titleTo
+ * @param $table
+ * @param $start bool
+ * @param $end bool
+ */
function __construct( $titleTo, $table, $start = false, $end = false ) {
global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
@@ -138,6 +143,9 @@ class HTMLCacheUpdate
Job::batchInsert( $jobs );
}
+ /**
+ * @return mixed
+ */
protected function insertJobs() {
$batches = $this->mCache->partition( $this->mTable, $this->mRowsPerJob );
if ( !$batches ) {
@@ -157,6 +165,7 @@ class HTMLCacheUpdate
/**
* Invalidate an array (or iterator) of Title objects, right now
+ * @param $titleArray array
*/
protected function invalidateTitles( $titleArray ) {
global $wgUseFileCache, $wgUseSquid;
@@ -179,7 +188,7 @@ class HTMLCacheUpdate
foreach ( $batches as $batch ) {
$dbw->update( 'page',
array( 'page_touched' => $timestamp ),
- array( 'page_id IN (' . $dbw->makeList( $batch ) . ')' ),
+ array( 'page_id' => $batch ),
__METHOD__
);
}
@@ -197,9 +206,9 @@ class HTMLCacheUpdate
}
}
}
-
}
+
/**
* Job wrapper for HTMLCacheUpdate. Gets run whenever a related
* job gets called from the queue.
diff --git a/includes/cache/HTMLFileCache.php b/includes/cache/HTMLFileCache.php
index 1095da2c..92130f69 100644
--- a/includes/cache/HTMLFileCache.php
+++ b/includes/cache/HTMLFileCache.php
@@ -4,170 +4,112 @@
* @file
* @ingroup Cache
*/
-
-/**
- * Handles talking to the file cache, putting stuff in and taking it back out.
- * Mostly called from Article.php for the emergency abort/fallback to cache.
- *
- * Global options that affect this module:
- * - $wgCachePages
- * - $wgCacheEpoch
- * - $wgUseFileCache
- * - $wgCacheDirectory
- * - $wgFileCacheDirectory
- * - $wgUseGzip
- *
- * @ingroup Cache
- */
-class HTMLFileCache {
-
+class HTMLFileCache extends FileCacheBase {
/**
- * @var Title
+ * Construct an ObjectFileCache from a Title and an action
+ * @param $title Title|string Title object or prefixed DB key string
+ * @param $action string
+ * @return HTMLFileCache
*/
- var $mTitle;
- var $mFileCache, $mType;
+ public static function newFromTitle( $title, $action ) {
+ $cache = new self();
- public function __construct( $title, $type = 'view' ) {
- $this->mTitle = $title;
- $this->mType = ($type == 'raw' || $type == 'view' ) ? $type : false;
- $this->fileCacheName(); // init name
- }
-
- public function fileCacheName() {
- if( !$this->mFileCache ) {
- global $wgCacheDirectory, $wgFileCacheDirectory, $wgFileCacheDepth;
-
- if ( $wgFileCacheDirectory ) {
- $dir = $wgFileCacheDirectory;
- } elseif ( $wgCacheDirectory ) {
- $dir = "$wgCacheDirectory/html";
- } else {
- throw new MWException( 'Please set $wgCacheDirectory in LocalSettings.php if you wish to use the HTML file cache' );
- }
-
- # Store raw pages (like CSS hits) elsewhere
- $subdir = ($this->mType === 'raw') ? 'raw/' : '';
-
- $key = $this->mTitle->getPrefixedDbkey();
- if ( $wgFileCacheDepth > 0 ) {
- $hash = md5( $key );
- for ( $i = 1; $i <= $wgFileCacheDepth; $i++ ) {
- $subdir .= substr( $hash, 0, $i ) . '/';
- }
- }
- # Avoid extension confusion
- $key = str_replace( '.', '%2E', urlencode( $key ) );
- $this->mFileCache = "{$dir}/{$subdir}{$key}.html";
+ $allowedTypes = self::cacheablePageActions();
+ if ( !in_array( $action, $allowedTypes ) ) {
+ throw new MWException( "Invalid filecache type given." );
+ }
+ $cache->mKey = ( $title instanceof Title )
+ ? $title->getPrefixedDBkey()
+ : (string)$title;
+ $cache->mType = (string)$action;
+ $cache->mExt = 'html';
- if( $this->useGzip() ) {
- $this->mFileCache .= '.gz';
- }
+ return $cache;
+ }
- wfDebug( __METHOD__ . ": {$this->mFileCache}\n" );
- }
- return $this->mFileCache;
+ /**
+ * Cacheable actions
+ * @return array
+ */
+ protected static function cacheablePageActions() {
+ return array( 'view', 'history' );
}
- public function isFileCached() {
- if( $this->mType === false ) {
- return false;
- }
- return file_exists( $this->fileCacheName() );
+ /**
+ * Get the base file cache directory
+ * @return string
+ */
+ protected function cacheDirectory() {
+ return $this->baseCacheDirectory(); // no subdir for b/c with old cache files
}
- public function fileCacheTime() {
- return wfTimestamp( TS_MW, filemtime( $this->fileCacheName() ) );
+ /**
+ * Get the cache type subdirectory (with the trailing slash) or the empty string
+ * Alter the type -> directory mapping to put action=view cache at the root.
+ *
+ * @return string
+ */
+ protected function typeSubdirectory() {
+ if ( $this->mType === 'view' ) {
+ return ''; // b/c to not skip existing cache
+ } else {
+ return $this->mType . '/';
+ }
}
/**
* Check if pages can be cached for this request/user
+ * @param $context IContextSource
* @return bool
*/
- public static function useFileCache() {
- global $wgUser, $wgUseFileCache, $wgShowIPinHeader, $wgRequest, $wgLang, $wgContLang;
- if( !$wgUseFileCache ) {
+ public static function useFileCache( IContextSource $context ) {
+ global $wgUseFileCache, $wgShowIPinHeader, $wgDebugToolbar, $wgContLang;
+ if ( !$wgUseFileCache ) {
return false;
}
+ if ( $wgShowIPinHeader || $wgDebugToolbar ) {
+ wfDebug( "HTML file cache skipped. Either \$wgShowIPinHeader and/or \$wgDebugToolbar on\n" );
+ return false;
+ }
+
// Get all query values
- $queryVals = $wgRequest->getValues();
- foreach( $queryVals as $query => $val ) {
- if( $query == 'title' || $query == 'curid' ) {
- continue;
+ $queryVals = $context->getRequest()->getValues();
+ foreach ( $queryVals as $query => $val ) {
+ if ( $query === 'title' || $query === 'curid' ) {
+ continue; // note: curid sets title
// Normal page view in query form can have action=view.
- // Raw hits for pages also stored, like .css pages for example.
- } elseif( $query == 'action' && $val == 'view' ) {
- continue;
- } elseif( $query == 'usemsgcache' && $val == 'yes' ) {
+ } elseif ( $query === 'action' && in_array( $val, self::cacheablePageActions() ) ) {
continue;
// Below are header setting params
- } elseif( $query == 'maxage' || $query == 'smaxage' || $query == 'ctype' || $query == 'gen' ) {
+ } elseif ( $query === 'maxage' || $query === 'smaxage' ) {
continue;
- } else {
- return false;
}
+ return false;
}
+ $user = $context->getUser();
// Check for non-standard user language; this covers uselang,
// and extensions for auto-detecting user language.
- $ulang = $wgLang->getCode();
+ $ulang = $context->getLanguage()->getCode();
$clang = $wgContLang->getCode();
// Check that there are no other sources of variation
- return !$wgShowIPinHeader && !$wgUser->getId() && !$wgUser->getNewtalk() && $ulang == $clang;
+ return !$user->getId() && !$user->getNewtalk() && $ulang == $clang;
}
/**
- * Check if up to date cache file exists
- * @param $timestamp string
- *
- * @return bool
+ * Read from cache to context output
+ * @param $context IContextSource
+ * @return void
*/
- public function isFileCacheGood( $timestamp = '' ) {
- global $wgCacheEpoch;
+ public function loadFromFileCache( IContextSource $context ) {
+ global $wgMimeType, $wgLanguageCode;
- if( !$this->isFileCached() ) {
- return false;
- }
-
- $cachetime = $this->fileCacheTime();
- $good = $timestamp <= $cachetime && $wgCacheEpoch <= $cachetime;
-
- wfDebug( __METHOD__ . ": cachetime $cachetime, touched '{$timestamp}' epoch {$wgCacheEpoch}, good $good\n");
- return $good;
- }
-
- public function useGzip() {
- global $wgUseGzip;
- return $wgUseGzip;
- }
-
- /* In handy string packages */
- public function fetchRawText() {
- return file_get_contents( $this->fileCacheName() );
- }
-
- public function fetchPageText() {
- if( $this->useGzip() ) {
- /* Why is there no gzfile_get_contents() or gzdecode()? */
- return implode( '', gzfile( $this->fileCacheName() ) );
- } else {
- return $this->fetchRawText();
- }
- }
-
- /* Working directory to/from output */
- public function loadFromFileCache() {
- global $wgOut, $wgMimeType, $wgLanguageCode;
wfDebug( __METHOD__ . "()\n");
- $filename = $this->fileCacheName();
- // Raw pages should handle cache control on their own,
- // even when using file cache. This reduces hits from clients.
- if( $this->mType !== 'raw' ) {
- $wgOut->sendCacheControl();
- header( "Content-Type: $wgMimeType; charset=UTF-8" );
- header( "Content-Language: $wgLanguageCode" );
- }
-
- if( $this->useGzip() ) {
- if( wfClientAcceptsGzip() ) {
+ $filename = $this->cachePath();
+ $context->getOutput()->sendCacheControl();
+ header( "Content-Type: $wgMimeType; charset=UTF-8" );
+ header( "Content-Language: $wgLanguageCode" );
+ if ( $this->useGzip() ) {
+ if ( wfClientAcceptsGzip() ) {
header( 'Content-Encoding: gzip' );
} else {
/* Send uncompressed */
@@ -176,74 +118,70 @@ class HTMLFileCache {
}
}
readfile( $filename );
- $wgOut->disable(); // tell $wgOut that output is taken care of
- }
-
- protected function checkCacheDirs() {
- $filename = $this->fileCacheName();
- $mydir2 = substr($filename,0,strrpos($filename,'/')); # subdirectory level 2
- $mydir1 = substr($mydir2,0,strrpos($mydir2,'/')); # subdirectory level 1
-
- wfMkdirParents( $mydir1 );
- wfMkdirParents( $mydir2 );
+ $context->getOutput()->disable(); // tell $wgOut that output is taken care of
}
+ /**
+ * Save this cache object with the given text.
+ * Use this as an ob_start() handler.
+ * @param $text string
+ * @return bool Whether $wgUseFileCache is enabled
+ */
public function saveToFileCache( $text ) {
global $wgUseFileCache;
- if( !$wgUseFileCache || strlen( $text ) < 512 ) {
+
+ if ( !$wgUseFileCache || strlen( $text ) < 512 ) {
// Disabled or empty/broken output (OOM and PHP errors)
return $text;
}
wfDebug( __METHOD__ . "()\n", false);
- $this->checkCacheDirs();
+ $now = wfTimestampNow();
+ if ( $this->useGzip() ) {
+ $text = str_replace(
+ '</html>', '<!-- Cached/compressed '.$now." -->\n</html>", $text );
+ } else {
+ $text = str_replace(
+ '</html>', '<!-- Cached '.$now." -->\n</html>", $text );
+ }
- $f = fopen( $this->fileCacheName(), 'w' );
- if($f) {
- $now = wfTimestampNow();
- if( $this->useGzip() ) {
- $rawtext = str_replace( '</html>',
- '<!-- Cached/compressed '.$now." -->\n</html>",
- $text );
- $text = gzencode( $rawtext );
- } else {
- $text = str_replace( '</html>',
- '<!-- Cached '.$now." -->\n</html>",
- $text );
- }
- fwrite( $f, $text );
- fclose( $f );
- if( $this->useGzip() ) {
- if( wfClientAcceptsGzip() ) {
- header( 'Content-Encoding: gzip' );
- return $text;
- } else {
- return $rawtext;
- }
+ // Store text to FS...
+ $compressed = $this->saveText( $text );
+ if ( $compressed === false ) {
+ return $text; // error
+ }
+
+ // gzip output to buffer as needed and set headers...
+ if ( $this->useGzip() ) {
+ // @TODO: ugly wfClientAcceptsGzip() function - use context!
+ if ( wfClientAcceptsGzip() ) {
+ header( 'Content-Encoding: gzip' );
+ return $compressed;
} else {
return $text;
}
+ } else {
+ return $text;
}
- return $text;
}
- public static function clearFileCache( $title ) {
+ /**
+ * Clear the file caches for a page for all actions
+ * @param $title Title
+ * @return bool Whether $wgUseFileCache is enabled
+ */
+ public static function clearFileCache( Title $title ) {
global $wgUseFileCache;
if ( !$wgUseFileCache ) {
return false;
}
- wfSuppressWarnings();
-
- $fc = new self( $title, 'view' );
- unlink( $fc->fileCacheName() );
-
- $fc = new self( $title, 'raw' );
- unlink( $fc->fileCacheName() );
-
- wfRestoreWarnings();
+ foreach ( self::cacheablePageActions() as $type ) {
+ $fc = self::newFromTitle( $title, $type );
+ $fc->clearCache();
+ }
return true;
}
diff --git a/includes/cache/LinkBatch.php b/includes/cache/LinkBatch.php
index 0bd869fc..17e8739b 100644
--- a/includes/cache/LinkBatch.php
+++ b/includes/cache/LinkBatch.php
@@ -86,7 +86,8 @@ class LinkBatch {
/**
* Do the query and add the results to the LinkCache object
- * Return an array mapping PDBK to ID
+ *
+ * @return Array mapping PDBK to ID
*/
public function execute() {
$linkCache = LinkCache::singleton();
@@ -96,12 +97,15 @@ class LinkBatch {
/**
* Do the query and add the results to a given LinkCache object
* Return an array mapping PDBK to ID
+ *
+ * @param $cache LinkCache
+ * @return Array remaining IDs
*/
protected function executeInto( &$cache ) {
wfProfileIn( __METHOD__ );
$res = $this->doQuery();
- $ids = $this->addResultToCache( $cache, $res );
$this->doGenderQuery();
+ $ids = $this->addResultToCache( $cache, $res );
wfProfileOut( __METHOD__ );
return $ids;
}
@@ -112,8 +116,9 @@ class LinkBatch {
* This function *also* stores extra fields of the title used for link
* parsing to avoid extra DB queries.
*
- * @param $cache
+ * @param $cache LinkCache
* @param $res
+ * @return Array of remaining titles
*/
public function addResultToCache( $cache, $res ) {
if ( !$res ) {
@@ -126,7 +131,7 @@ class LinkBatch {
$remaining = $this->data;
foreach ( $res as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $cache->addGoodLinkObj( $row->page_id, $title, $row->page_len, $row->page_is_redirect, $row->page_latest );
+ $cache->addGoodLinkObjFromRow( $title, $row );
$ids[$title->getPrefixedDBkey()] = $row->page_id;
unset( $remaining[$row->page_namespace][$row->page_title] );
}
@@ -144,6 +149,7 @@ class LinkBatch {
/**
* Perform the existence test query, return a ResultWrapper with page_id fields
+ * @return Bool|ResultWrapper
*/
public function doQuery() {
if ( $this->isEmpty() ) {
@@ -168,6 +174,11 @@ class LinkBatch {
return $res;
}
+ /**
+ * Do (and cache) {{GENDER:...}} information for userpages in this LinkBatch
+ *
+ * @return bool whether the query was successful
+ */
public function doGenderQuery() {
if ( $this->isEmpty() ) {
return false;
@@ -180,6 +191,7 @@ class LinkBatch {
$genderCache = GenderCache::singleton();
$genderCache->dolinkBatch( $this->data, $this->caller );
+ return true;
}
/**
diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php
index aeb10eb0..a73eaaa4 100644
--- a/includes/cache/LinkCache.php
+++ b/includes/cache/LinkCache.php
@@ -9,8 +9,10 @@ class LinkCache {
// becomes incompatible with the new version.
private $mClassVer = 4;
- private $mGoodLinks, $mBadLinks;
- private $mForUpdate;
+ private $mGoodLinks = array();
+ private $mGoodLinkFields = array();
+ private $mBadLinks = array();
+ private $mForUpdate = false;
/**
* Get an instance of this class
@@ -25,13 +27,6 @@ class LinkCache {
return $instance;
}
- function __construct() {
- $this->mForUpdate = false;
- $this->mGoodLinks = array();
- $this->mGoodLinkFields = array();
- $this->mBadLinks = array();
- }
-
/**
* General accessor to get/set whether SELECT FOR UPDATE should be used
*
@@ -96,6 +91,23 @@ class LinkCache {
}
/**
+ * Same as above with better interface.
+ * @since 1.19
+ * @param $title Title
+ * @param $row object which has the fields page_id, page_is_redirect,
+ * page_latest
+ */
+ public function addGoodLinkObjFromRow( $title, $row ) {
+ $dbkey = $title->getPrefixedDbKey();
+ $this->mGoodLinks[$dbkey] = intval( $row->page_id );
+ $this->mGoodLinkFields[$dbkey] = array(
+ 'length' => intval( $row->page_len ),
+ 'redirect' => intval( $row->page_is_redirect ),
+ 'revision' => intval( $row->page_latest ),
+ );
+ }
+
+ /**
* @param $title Title
*/
public function addBadLinkObj( $title ) {
@@ -114,15 +126,9 @@ class LinkCache {
*/
public function clearLink( $title ) {
$dbkey = $title->getPrefixedDbKey();
- if( isset($this->mBadLinks[$dbkey]) ) {
- unset($this->mBadLinks[$dbkey]);
- }
- if( isset($this->mGoodLinks[$dbkey]) ) {
- unset($this->mGoodLinks[$dbkey]);
- }
- if( isset($this->mGoodLinkFields[$dbkey]) ) {
- unset($this->mGoodLinkFields[$dbkey]);
- }
+ unset( $this->mBadLinks[$dbkey] );
+ unset( $this->mGoodLinks[$dbkey] );
+ unset( $this->mGoodLinkFields[$dbkey] );
}
public function getGoodLinks() { return $this->mGoodLinks; }
@@ -188,22 +194,13 @@ class LinkCache {
__METHOD__, $options );
# Set fields...
if ( $s !== false ) {
+ $this->addGoodLinkObjFromRow( $nt, $s );
$id = intval( $s->page_id );
- $len = intval( $s->page_len );
- $redirect = intval( $s->page_is_redirect );
- $revision = intval( $s->page_latest );
} else {
+ $this->addBadLinkObj( $nt );
$id = 0;
- $len = -1;
- $redirect = 0;
- $revision = 0;
}
- if ( $id == 0 ) {
- $this->addBadLinkObj( $nt );
- } else {
- $this->addGoodLinkObj( $id, $nt, $len, $redirect, $revision );
- }
wfProfileOut( __METHOD__ );
return $id;
}
diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php
index 79883844..146edd28 100644
--- a/includes/cache/MessageCache.php
+++ b/includes/cache/MessageCache.php
@@ -176,7 +176,7 @@ class MessageCache {
global $wgCacheDirectory;
$filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
- wfMkdirParents( $wgCacheDirectory ); // might fail
+ wfMkdirParents( $wgCacheDirectory, null, __METHOD__ ); // might fail
wfSuppressWarnings();
$file = fopen( $filename, 'w' );
@@ -199,7 +199,7 @@ class MessageCache {
$filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
$tempFilename = $filename . '.tmp';
- wfMkdirParents( $wgCacheDirectory ); // might fail
+ wfMkdirParents( $wgCacheDirectory, null, __METHOD__ ); // might fail
wfSuppressWarnings();
$file = fopen( $tempFilename, 'w' );
@@ -499,10 +499,10 @@ class MessageCache {
$codes = array_keys( Language::getLanguageNames() );
}
- global $parserMemc;
+ global $wgMemc;
foreach ( $codes as $code ) {
$sidebarKey = wfMemcKey( 'sidebar', $code );
- $parserMemc->delete( $sidebarKey );
+ $wgMemc->delete( $sidebarKey );
}
// Update the message in the message blob store
@@ -553,6 +553,8 @@ class MessageCache {
/**
* Represents a write lock on the messages key
*
+ * @param $key string
+ *
* @return Boolean: success
*/
function lock( $key ) {
@@ -585,6 +587,8 @@ class MessageCache {
* fallback).
* @param $isFullKey Boolean: specifies whether $key is a two part key
* "msg/lang".
+ *
+ * @return string|false
*/
function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
global $wgLanguageCode, $wgContLang;
@@ -691,6 +695,8 @@ class MessageCache {
*
* @param $title String: Message cache key with initial uppercase letter.
* @param $code String: code denoting the language to try.
+ *
+ * @return string|false
*/
function getMsgFromNamespace( $title, $code ) {
global $wgAdaptiveMessageCache;
@@ -814,10 +820,9 @@ class MessageCache {
/**
* @param $text string
- * @param $string Title|string
* @param $title Title
- * @param $interface bool
* @param $linestart bool
+ * @param $interface bool
* @param $language
* @return ParserOutput
*/
@@ -828,13 +833,8 @@ class MessageCache {
$parser = $this->getParser();
$popts = $this->getParserOptions();
-
- if ( $interface ) {
- $popts->setInterfaceMessage( true );
- }
- if ( $language !== null ) {
- $popts->setTargetLanguage( $language );
- }
+ $popts->setInterfaceMessage( $interface );
+ $popts->setTargetLanguage( $language );
wfProfileIn( __METHOD__ );
if ( !$title || !$title instanceof Title ) {
@@ -878,6 +878,10 @@ class MessageCache {
$this->mLoadedLanguages = array();
}
+ /**
+ * @param $key
+ * @return array
+ */
public function figureMessage( $key ) {
global $wgLanguageCode;
$pieces = explode( '/', $key );
@@ -935,6 +939,9 @@ class MessageCache {
wfProfileOut( __METHOD__ );
}
+ /**
+ * @return array
+ */
public function getMostUsedMessages() {
wfProfileIn( __METHOD__ );
$cachekey = wfMemcKey( 'message-profiling' );
@@ -968,4 +975,25 @@ class MessageCache {
return array_keys( $list );
}
+ /**
+ * Get all message keys stored in the message cache for a given language.
+ * 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
+ * @return array of message keys (strings)
+ */
+ public function getAllMessageKeys( $code ) {
+ global $wgContLang;
+ $this->load( $code );
+ if ( !isset( $this->mCache[$code] ) ) {
+ // 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
+ // Keys may appear with a capital first letter. lcfirst them.
+ return array_map( array( $wgContLang, 'lcfirst' ), array_keys( $cache ) );
+ }
}
diff --git a/includes/cache/ObjectFileCache.php b/includes/cache/ObjectFileCache.php
new file mode 100644
index 00000000..3356f1fc
--- /dev/null
+++ b/includes/cache/ObjectFileCache.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Contain the ObjectFileCache class
+ * @file
+ * @ingroup Cache
+ */
+class ObjectFileCache extends FileCacheBase {
+ /**
+ * Construct an ObjectFileCache from a key and a type
+ * @param $key string
+ * @param $type string
+ * @return ObjectFileCache
+ */
+ public static function newFromKey( $key, $type ) {
+ $cache = new self();
+
+ $cache->mKey = (string)$key;
+ $cache->mType = (string)$type;
+
+ return $cache;
+ }
+
+ /**
+ * Get the base file cache directory
+ * @return string
+ */
+ protected function cacheDirectory() {
+ return $this->baseCacheDirectory() . '/object';
+ }
+}
diff --git a/includes/cache/ResourceFileCache.php b/includes/cache/ResourceFileCache.php
new file mode 100644
index 00000000..e73fc2d7
--- /dev/null
+++ b/includes/cache/ResourceFileCache.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Contain the ResourceFileCache class
+ * @file
+ * @ingroup Cache
+ */
+class ResourceFileCache extends FileCacheBase {
+ protected $mCacheWorthy;
+
+ /* @TODO: configurable? */
+ const MISS_THRESHOLD = 360; // 6/min * 60 min
+
+ /**
+ * Construct an ResourceFileCache from a context
+ * @param $context ResourceLoaderContext
+ * @return ResourceFileCache
+ */
+ public static function newFromContext( ResourceLoaderContext $context ) {
+ $cache = new self();
+
+ if ( $context->getOnly() === 'styles' ) {
+ $cache->mType = 'css';
+ } else {
+ $cache->mType = 'js';
+ }
+ $modules = array_unique( $context->getModules() ); // remove duplicates
+ sort( $modules ); // normalize the order (permutation => combination)
+ $cache->mKey = sha1( $context->getHash() . implode( '|', $modules ) );
+ if ( count( $modules ) == 1 ) {
+ $cache->mCacheWorthy = true; // won't take up much space
+ }
+
+ return $cache;
+ }
+
+ /**
+ * Check if an RL request can be cached.
+ * Caller is responsible for checking if any modules are private.
+ * @param $context ResourceLoaderContext
+ * @return bool
+ */
+ public static function useFileCache( ResourceLoaderContext $context ) {
+ global $wgUseFileCache, $wgDefaultSkin, $wgLanguageCode;
+ if ( !$wgUseFileCache ) {
+ return false;
+ }
+ // Get all query values
+ $queryVals = $context->getRequest()->getValues();
+ foreach ( $queryVals as $query => $val ) {
+ if ( $query === 'modules' || $query === 'version' || $query === '*' ) {
+ continue; // note: &* added as IE fix
+ } elseif ( $query === 'skin' && $val === $wgDefaultSkin ) {
+ continue;
+ } elseif ( $query === 'lang' && $val === $wgLanguageCode ) {
+ continue;
+ } elseif ( $query === 'only' && in_array( $val, array( 'styles', 'scripts' ) ) ) {
+ continue;
+ } elseif ( $query === 'debug' && $val === 'false' ) {
+ continue;
+ }
+ return false;
+ }
+ return true; // cacheable
+ }
+
+ /**
+ * Get the base file cache directory
+ * @return string
+ */
+ protected function cacheDirectory() {
+ return $this->baseCacheDirectory() . '/resources';
+ }
+
+ /**
+ * Item has many recent cache misses
+ * @return bool
+ */
+ public function isCacheWorthy() {
+ if ( $this->mCacheWorthy === null ) {
+ $this->mCacheWorthy = (
+ $this->isCached() || // even stale cache indicates it was cache worthy
+ $this->getMissesRecent() >= self::MISS_THRESHOLD // many misses
+ );
+ }
+ return $this->mCacheWorthy;
+ }
+}
diff --git a/includes/context/ContextSource.php b/includes/context/ContextSource.php
new file mode 100644
index 00000000..45bd6fff
--- /dev/null
+++ b/includes/context/ContextSource.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ * Request-dependant objects containers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.18
+ *
+ * @author Happy-melon
+ * @file
+ */
+
+/**
+ * The simplest way of implementing IContextSource is to hold a RequestContext as a
+ * member variable and provide accessors to it.
+ */
+abstract class ContextSource implements IContextSource {
+
+ /**
+ * @var IContextSource
+ */
+ private $context;
+
+ /**
+ * Get the RequestContext object
+ * @since 1.18
+ * @return RequestContext
+ */
+ public function getContext() {
+ if ( $this->context === null ) {
+ $class = get_class( $this );
+ wfDebug( __METHOD__ . " ($class): called and \$context is null. Using RequestContext::getMain() for sanity\n" );
+ $this->context = RequestContext::getMain();
+ }
+ return $this->context;
+ }
+
+ /**
+ * Set the IContextSource object
+ *
+ * @since 1.18
+ * @param $context IContextSource
+ */
+ public function setContext( IContextSource $context ) {
+ $this->context = $context;
+ }
+
+ /**
+ * Get the WebRequest object
+ *
+ * @since 1.18
+ * @return WebRequest
+ */
+ public function getRequest() {
+ return $this->getContext()->getRequest();
+ }
+
+ /**
+ * Get the Title object
+ *
+ * @since 1.18
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->getContext()->getTitle();
+ }
+
+ /**
+ * Check whether a WikiPage object can be get with getWikiPage().
+ * Callers should expect that an exception is thrown from getWikiPage()
+ * if this method returns false.
+ *
+ * @since 1.19
+ * @return bool
+ */
+ public function canUseWikiPage() {
+ return $this->getContext()->canUseWikiPage();
+ }
+
+ /**
+ * Get the WikiPage object.
+ * May throw an exception if there's no Title object set or the Title object
+ * belongs to a special namespace that doesn't have WikiPage, so use first
+ * canUseWikiPage() to check whether this method can be called safely.
+ *
+ * @since 1.19
+ * @return WikiPage
+ */
+ public function getWikiPage() {
+ return $this->getContext()->getWikiPage();
+ }
+
+ /**
+ * Get the OutputPage object
+ *
+ * @since 1.18
+ * @return OutputPage object
+ */
+ public function getOutput() {
+ return $this->getContext()->getOutput();
+ }
+
+ /**
+ * Get the User object
+ *
+ * @since 1.18
+ * @return User
+ */
+ public function getUser() {
+ return $this->getContext()->getUser();
+ }
+
+ /**
+ * Get the Language object
+ *
+ * @deprecated 1.19 Use getLanguage instead
+ * @return Language
+ */
+ public function getLang() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->getLanguage();
+ }
+
+ /**
+ * Get the Language object
+ *
+ * @since 1.19
+ * @return Language
+ */
+ public function getLanguage() {
+ return $this->getContext()->getLanguage();
+ }
+
+ /**
+ * Get the Skin object
+ *
+ * @since 1.18
+ * @return Skin
+ */
+ public function getSkin() {
+ return $this->getContext()->getSkin();
+ }
+
+ /**
+ * Get a Message object with context set
+ * Parameters are the same as wfMessage()
+ *
+ * @since 1.18
+ * @return Message object
+ */
+ public function msg( /* $args */ ) {
+ $args = func_get_args();
+ return call_user_func_array( array( $this->getContext(), 'msg' ), $args );
+ }
+
+}
+
diff --git a/includes/context/DerivativeContext.php b/includes/context/DerivativeContext.php
new file mode 100644
index 00000000..5adf3621
--- /dev/null
+++ b/includes/context/DerivativeContext.php
@@ -0,0 +1,286 @@
+<?php
+/**
+ * Request-dependant objects containers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.19
+ *
+ * @author Daniel Friesen
+ * @file
+ */
+
+/**
+ * An IContextSource implementation which will inherit context from another source
+ * but allow individual pieces of context to be changed locally
+ * eg: A ContextSource that can inherit from the main RequestContext but have
+ * a different Title instance set on it.
+ */
+class DerivativeContext extends ContextSource {
+
+ /**
+ * @var WebRequest
+ */
+ private $request;
+
+ /**
+ * @var Title
+ */
+ private $title;
+
+ /**
+ * @var WikiPage
+ */
+ private $wikipage;
+
+ /**
+ * @var OutputPage
+ */
+ private $output;
+
+ /**
+ * @var User
+ */
+ private $user;
+
+ /**
+ * @var Language
+ */
+ private $lang;
+
+ /**
+ * @var Skin
+ */
+ private $skin;
+
+ /**
+ * Constructor
+ * @param $context IContextSource Context to inherit from
+ */
+ public function __construct( IContextSource $context ) {
+ $this->setContext( $context );
+ }
+
+ /**
+ * Set the WebRequest object
+ *
+ * @param $r WebRequest object
+ */
+ public function setRequest( WebRequest $r ) {
+ $this->request = $r;
+ }
+
+ /**
+ * Get the WebRequest object
+ *
+ * @return WebRequest
+ */
+ public function getRequest() {
+ if ( !is_null( $this->request ) ) {
+ return $this->request;
+ } else {
+ return $this->getContext()->getRequest();
+ }
+ }
+
+ /**
+ * Set the Title object
+ *
+ * @param $t Title object
+ */
+ public function setTitle( Title $t ) {
+ $this->title = $t;
+ }
+
+ /**
+ * Get the Title object
+ *
+ * @return Title
+ */
+ public function getTitle() {
+ if ( !is_null( $this->title ) ) {
+ return $this->title;
+ } else {
+ return $this->getContext()->getTitle();
+ }
+ }
+
+ /**
+ * Check whether a WikiPage object can be get with getWikiPage().
+ * Callers should expect that an exception is thrown from getWikiPage()
+ * if this method returns false.
+ *
+ * @since 1.19
+ * @return bool
+ */
+ public function canUseWikiPage() {
+ if ( $this->wikipage !== null ) {
+ return true;
+ } elseif ( $this->title !== null ) {
+ return $this->title->canExist();
+ } else {
+ return $this->getContext()->canUseWikiPage();
+ }
+ }
+
+ /**
+ * Set the WikiPage object
+ *
+ * @since 1.19
+ * @param $p WikiPage object
+ */
+ public function setWikiPage( WikiPage $p ) {
+ $this->wikipage = $p;
+ }
+
+ /**
+ * Get the WikiPage object.
+ * May throw an exception if there's no Title object set or the Title object
+ * belongs to a special namespace that doesn't have WikiPage, so use first
+ * canUseWikiPage() to check whether this method can be called safely.
+ *
+ * @since 1.19
+ * @return WikiPage
+ */
+ public function getWikiPage() {
+ if ( !is_null( $this->wikipage ) ) {
+ return $this->wikipage;
+ } else {
+ return $this->getContext()->getWikiPage();
+ }
+ }
+
+ /**
+ * Set the OutputPage object
+ *
+ * @param $o OutputPage
+ */
+ public function setOutput( OutputPage $o ) {
+ $this->output = $o;
+ }
+
+ /**
+ * Get the OutputPage object
+ *
+ * @return OutputPage object
+ */
+ public function getOutput() {
+ if ( !is_null( $this->output ) ) {
+ return $this->output;
+ } else {
+ return $this->getContext()->getOutput();
+ }
+ }
+
+ /**
+ * Set the User object
+ *
+ * @param $u User
+ */
+ public function setUser( User $u ) {
+ $this->user = $u;
+ }
+
+ /**
+ * Get the User object
+ *
+ * @return User
+ */
+ public function getUser() {
+ if ( !is_null( $this->user ) ) {
+ return $this->user;
+ } else {
+ return $this->getContext()->getUser();
+ }
+ }
+
+ /**
+ * Set the Language object
+ *
+ * @deprecated 1.19 Use setLanguage instead
+ * @param $l Mixed Language instance or language code
+ */
+ public function setLang( $l ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ $this->setLanguage( $l );
+ }
+
+ /**
+ * Set the Language object
+ *
+ * @param $l Mixed Language instance or language code
+ * @since 1.19
+ */
+ public function setLanguage( $l ) {
+ if ( $l instanceof Language ) {
+ $this->lang = $l;
+ } elseif ( is_string( $l ) ) {
+ $l = RequestContext::sanitizeLangCode( $l );
+ $obj = Language::factory( $l );
+ $this->lang = $obj;
+ } else {
+ throw new MWException( __METHOD__ . " was passed an invalid type of data." );
+ }
+ }
+
+ /**
+ * @deprecated 1.19 Use getLanguage instead
+ * @return Language
+ */
+ public function getLang() {
+ wfDeprecated( __METHOD__, '1.19' );
+ $this->getLanguage();
+ }
+
+ /**
+ * Get the Language object
+ *
+ * @return Language
+ * @since 1.19
+ */
+ public function getLanguage() {
+ if ( !is_null( $this->lang ) ) {
+ return $this->lang;
+ } else {
+ return $this->getContext()->getLanguage();
+ }
+ }
+
+ /**
+ * Set the Skin object
+ *
+ * @param $s Skin
+ */
+ public function setSkin( Skin $s ) {
+ $this->skin = clone $s;
+ $this->skin->setContext( $this );
+ }
+
+ /**
+ * Get the Skin object
+ *
+ * @return Skin
+ */
+ public function getSkin() {
+ if ( !is_null( $this->skin ) ) {
+ return $this->skin;
+ } else {
+ return $this->getContext()->getSkin();
+ }
+ }
+
+}
+
diff --git a/includes/context/IContextSource.php b/includes/context/IContextSource.php
new file mode 100644
index 00000000..476035b5
--- /dev/null
+++ b/includes/context/IContextSource.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Request-dependant objects containers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.18
+ *
+ * @author Happy-melon
+ * @file
+ */
+
+/**
+ * Interface for objects which can provide a context on request.
+ */
+interface IContextSource {
+
+ /**
+ * Get the WebRequest object
+ *
+ * @return WebRequest
+ */
+ public function getRequest();
+
+ /**
+ * Get the Title object
+ *
+ * @return Title
+ */
+ public function getTitle();
+
+ /**
+ * Check whether a WikiPage object can be get with getWikiPage().
+ * Callers should expect that an exception is thrown from getWikiPage()
+ * if this method returns false.
+ *
+ * @since 1.19
+ * @return bool
+ */
+ public function canUseWikiPage();
+
+ /**
+ * Get the WikiPage object.
+ * May throw an exception if there's no Title object set or the Title object
+ * belongs to a special namespace that doesn't have WikiPage, so use first
+ * canUseWikiPage() to check whether this method can be called safely.
+ *
+ * @since 1.19
+ * @return WikiPage
+ */
+ public function getWikiPage();
+
+ /**
+ * Get the OutputPage object
+ *
+ * @return OutputPage object
+ */
+ public function getOutput();
+
+ /**
+ * Get the User object
+ *
+ * @return User
+ */
+ public function getUser();
+
+ /**
+ * Get the Language object
+ *
+ * @deprecated 1.19 Use getLanguage instead
+ * @return Language
+ */
+ public function getLang();
+
+ /**
+ * Get the Language object
+ *
+ * @return Language
+ * @since 1.19
+ */
+ public function getLanguage();
+
+ /**
+ * Get the Skin object
+ *
+ * @return Skin
+ */
+ public function getSkin();
+
+ /**
+ * Get a Message object with context set
+ *
+ * @return Message object
+ */
+ public function msg();
+}
+
diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php
new file mode 100644
index 00000000..1ffbc08c
--- /dev/null
+++ b/includes/context/RequestContext.php
@@ -0,0 +1,398 @@
+<?php
+/**
+ * Request-dependant objects containers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.18
+ *
+ * @author Alexandre Emsenhuber
+ * @author Daniel Friesen
+ * @file
+ */
+
+/**
+ * Group all the pieces relevant to the context of a request into one instance
+ */
+class RequestContext implements IContextSource {
+
+ /**
+ * @var WebRequest
+ */
+ private $request;
+
+ /**
+ * @var Title
+ */
+ private $title;
+
+ /**
+ * @var WikiPage
+ */
+ private $wikipage;
+
+ /**
+ * @var OutputPage
+ */
+ private $output;
+
+ /**
+ * @var User
+ */
+ private $user;
+
+ /**
+ * @var Language
+ */
+ private $lang;
+
+ /**
+ * @var Skin
+ */
+ private $skin;
+
+ /**
+ * Set the WebRequest object
+ *
+ * @param $r WebRequest object
+ */
+ public function setRequest( WebRequest $r ) {
+ $this->request = $r;
+ }
+
+ /**
+ * Get the WebRequest object
+ *
+ * @return WebRequest
+ */
+ public function getRequest() {
+ if ( $this->request === null ) {
+ global $wgRequest; # fallback to $wg till we can improve this
+ $this->request = $wgRequest;
+ }
+ return $this->request;
+ }
+
+ /**
+ * Set the Title object
+ *
+ * @param $t Title object
+ */
+ public function setTitle( Title $t ) {
+ $this->title = $t;
+ }
+
+ /**
+ * Get the Title object
+ *
+ * @return Title
+ */
+ public function getTitle() {
+ if ( $this->title === null ) {
+ global $wgTitle; # fallback to $wg till we can improve this
+ $this->title = $wgTitle;
+ }
+ return $this->title;
+ }
+
+ /**
+ * Check whether a WikiPage object can be get with getWikiPage().
+ * Callers should expect that an exception is thrown from getWikiPage()
+ * if this method returns false.
+ *
+ * @since 1.19
+ * @return bool
+ */
+ public function canUseWikiPage() {
+ if ( $this->wikipage !== null ) {
+ # If there's a WikiPage object set, we can for sure get it
+ return true;
+ }
+ $title = $this->getTitle();
+ if ( $title === null ) {
+ # No Title, no WikiPage
+ return false;
+ } else {
+ # Only namespaces whose pages are stored in the database can have WikiPage
+ return $title->canExist();
+ }
+ }
+
+ /**
+ * Set the WikiPage object
+ *
+ * @since 1.19
+ * @param $p WikiPage object
+ */
+ public function setWikiPage( WikiPage $p ) {
+ $this->wikipage = $p;
+ }
+
+ /**
+ * Get the WikiPage object.
+ * May throw an exception if there's no Title object set or the Title object
+ * belongs to a special namespace that doesn't have WikiPage, so use first
+ * canUseWikiPage() to check whether this method can be called safely.
+ *
+ * @since 1.19
+ * @return WikiPage
+ */
+ public function getWikiPage() {
+ if ( $this->wikipage === null ) {
+ $title = $this->getTitle();
+ if ( $title === null ) {
+ throw new MWException( __METHOD__ . ' called without Title object set' );
+ }
+ $this->wikipage = WikiPage::factory( $title );
+ }
+ return $this->wikipage;
+ }
+
+ /**
+ * @param $o OutputPage
+ */
+ public function setOutput( OutputPage $o ) {
+ $this->output = $o;
+ }
+
+ /**
+ * Get the OutputPage object
+ *
+ * @return OutputPage object
+ */
+ public function getOutput() {
+ if ( $this->output === null ) {
+ $this->output = new OutputPage( $this );
+ }
+ return $this->output;
+ }
+
+ /**
+ * Set the User object
+ *
+ * @param $u User
+ */
+ public function setUser( User $u ) {
+ $this->user = $u;
+ }
+
+ /**
+ * Get the User object
+ *
+ * @return User
+ */
+ public function getUser() {
+ if ( $this->user === null ) {
+ $this->user = User::newFromSession( $this->getRequest() );
+ }
+ return $this->user;
+ }
+
+ /**
+ * Accepts a language code and ensures it's sane. Outputs a cleaned up language
+ * code and replaces with $wgLanguageCode if not sane.
+ * @param $code string
+ * @return string
+ */
+ public static function sanitizeLangCode( $code ) {
+ global $wgLanguageCode;
+
+ // BCP 47 - letter case MUST NOT carry meaning
+ $code = strtolower( $code );
+
+ # Validate $code
+ if( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) {
+ wfDebug( "Invalid user language code\n" );
+ $code = $wgLanguageCode;
+ }
+
+ return $code;
+ }
+
+ /**
+ * Set the Language object
+ *
+ * @deprecated 1.19 Use setLanguage instead
+ * @param $l Mixed Language instance or language code
+ */
+ public function setLang( $l ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ $this->setLanguage( $l );
+ }
+
+ /**
+ * Set the Language object
+ *
+ * @param $l Mixed Language instance or language code
+ * @since 1.19
+ */
+ public function setLanguage( $l ) {
+ if ( $l instanceof Language ) {
+ $this->lang = $l;
+ } elseif ( is_string( $l ) ) {
+ $l = self::sanitizeLangCode( $l );
+ $obj = Language::factory( $l );
+ $this->lang = $obj;
+ } else {
+ throw new MWException( __METHOD__ . " was passed an invalid type of data." );
+ }
+ }
+
+ /**
+ * @deprecated 1.19 Use getLanguage instead
+ * @return Language
+ */
+ public function getLang() {
+ wfDeprecated( __METHOD__, '1.19' );
+ return $this->getLanguage();
+ }
+
+ /**
+ * Get the Language object
+ *
+ * @return Language
+ * @since 1.19
+ */
+ public function getLanguage() {
+ if ( $this->lang === null ) {
+ global $wgLanguageCode, $wgContLang;
+ $code = $this->getRequest()->getVal(
+ 'uselang',
+ $this->getUser()->getOption( 'language' )
+ );
+ $code = self::sanitizeLangCode( $code );
+
+ wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$code ) );
+
+ if( $code === $wgLanguageCode ) {
+ $this->lang = $wgContLang;
+ } else {
+ $obj = Language::factory( $code );
+ $this->lang = $obj;
+ }
+ }
+ return $this->lang;
+ }
+
+ /**
+ * Set the Skin object
+ *
+ * @param $s Skin
+ */
+ public function setSkin( Skin $s ) {
+ $this->skin = clone $s;
+ $this->skin->setContext( $this );
+ }
+
+ /**
+ * Get the Skin object
+ *
+ * @return Skin
+ */
+ public function getSkin() {
+ if ( $this->skin === null ) {
+ wfProfileIn( __METHOD__ . '-createskin' );
+
+ $skin = null;
+ wfRunHooks( 'RequestContextCreateSkin', array( $this, &$skin ) );
+
+ // If the hook worked try to set a skin from it
+ if ( $skin instanceof Skin ) {
+ $this->skin = $skin;
+ } elseif ( is_string($skin) ) {
+ $this->skin = Skin::newFromKey( $skin );
+ }
+
+ // If this is still null (the hook didn't run or didn't work)
+ // then go through the normal processing to load a skin
+ if ( $this->skin === null ) {
+ global $wgHiddenPrefs;
+ if( !in_array( 'skin', $wgHiddenPrefs ) ) {
+ # get the user skin
+ $userSkin = $this->getUser()->getOption( 'skin' );
+ $userSkin = $this->getRequest()->getVal( 'useskin', $userSkin );
+ } else {
+ # if we're not allowing users to override, then use the default
+ global $wgDefaultSkin;
+ $userSkin = $wgDefaultSkin;
+ }
+
+ $this->skin = Skin::newFromKey( $userSkin );
+ }
+
+ // After all that set a context on whatever skin got created
+ $this->skin->setContext( $this );
+ wfProfileOut( __METHOD__ . '-createskin' );
+ }
+ return $this->skin;
+ }
+
+ /** Helpful methods **/
+
+ /**
+ * Get a Message object with context set
+ * Parameters are the same as wfMessage()
+ *
+ * @return Message object
+ */
+ public function msg() {
+ $args = func_get_args();
+ return call_user_func_array( 'wfMessage', $args )->setContext( $this );
+ }
+
+ /** Static methods **/
+
+ /**
+ * Get the RequestContext object associated with the main request
+ *
+ * @return RequestContext object
+ */
+ public static function getMain() {
+ static $instance = null;
+ if ( $instance === null ) {
+ $instance = new self;
+ }
+ return $instance;
+ }
+
+ /**
+ * Create a new extraneous context. The context is filled with information
+ * external to the current session.
+ * - Title is specified by argument
+ * - Request is a FauxRequest, or a FauxRequest can be specified by argument
+ * - User is an anonymous user, for separation IPv4 localhost is used
+ * - Language will be based on the anonymous user and request, may be content
+ * language or a uselang param in the fauxrequest data may change the lang
+ * - Skin will be based on the anonymous user, should be the wiki's default skin
+ *
+ * @param $title Title Title to use for the extraneous request
+ * @param $request Mixed A WebRequest or data to use for a FauxRequest
+ * @return RequestContext
+ */
+ public static function newExtraneousContext( Title $title, $request=array() ) {
+ $context = new self;
+ $context->setTitle( $title );
+ if ( $request instanceof WebRequest ) {
+ $context->setRequest( $request );
+ } else {
+ $context->setRequest( new FauxRequest( $request ) );
+ }
+ $context->user = User::newFromName( '127.0.0.1', false );
+ return $context;
+ }
+
+}
+
diff --git a/includes/db/CloneDatabase.php b/includes/db/CloneDatabase.php
index 3357268d..bd0895cf 100644
--- a/includes/db/CloneDatabase.php
+++ b/includes/db/CloneDatabase.php
@@ -93,12 +93,12 @@ class CloneDatabase {
# fix back and forth so tableName() works right.
self::changePrefix( $this->oldTablePrefix );
- $oldTableName = $this->db->tableName( $tbl, false );
+ $oldTableName = $this->db->tableName( $tbl, 'raw' );
self::changePrefix( $this->newTablePrefix );
- $newTableName = $this->db->tableName( $tbl, false );
+ $newTableName = $this->db->tableName( $tbl, 'raw' );
- if( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres' ) ) ) {
+ 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
diff --git a/includes/db/Database.php b/includes/db/Database.php
index d1a3b2bd..9f34f812 100644
--- a/includes/db/Database.php
+++ b/includes/db/Database.php
@@ -224,6 +224,12 @@ abstract class DatabaseBase implements DatabaseType {
protected $mDefaultBigSelects = null;
protected $mSchemaVars = false;
+ protected $preparedArgs;
+
+ protected $htmlErrors;
+
+ protected $delimiter = ';';
+
# ------------------------------------------------------------------------------
# Accessors
# ------------------------------------------------------------------------------
@@ -242,7 +248,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Boolean, controls output of large amounts of debug information.
- * @param $debug:
+ * @param $debug bool|null
* - true to enable debugging
* - false to disable debugging
* - omitted or null to do nothing
@@ -290,7 +296,9 @@ abstract class DatabaseBase implements DatabaseType {
* code should use lastErrno() and lastError() to handle the
* situation as appropriate.
*
- * @return The previous value of the flag.
+ * @param $ignoreErrors bool|null
+ *
+ * @return bool The previous value of the flag.
*/
function ignoreErrors( $ignoreErrors = null ) {
return wfSetBit( $this->mFlags, DBO_IGNORE, $ignoreErrors );
@@ -324,15 +332,17 @@ abstract class DatabaseBase implements DatabaseType {
* @return The previous table prefix.
*/
function tablePrefix( $prefix = null ) {
- return wfSetVar( $this->mTablePrefix, $prefix, true );
+ return wfSetVar( $this->mTablePrefix, $prefix );
}
/**
* Get properties passed down from the server info array of the load
* balancer.
*
- * @param $name The entry of the info array to get, or null to get the
+ * @param $name string The entry of the info array to get, or null to get the
* whole array
+ *
+ * @return LoadBalancer|null
*/
function getLBInfo( $name = null ) {
if ( is_null( $name ) ) {
@@ -353,7 +363,6 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $name
* @param $value
- * @return void
*/
function setLBInfo( $name, $value = null ) {
if ( is_null( $value ) ) {
@@ -365,6 +374,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Set lag time in seconds for a fake slave
+ *
+ * @param $lag int
*/
function setFakeSlaveLag( $lag ) {
$this->mFakeSlaveLag = $lag;
@@ -372,6 +383,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Make this connection a fake master
+ *
+ * @param $enabled bool
*/
function setFakeMaster( $enabled = true ) {
$this->mFakeMaster = $enabled;
@@ -379,6 +392,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database supports (and uses) cascading deletes
+ *
+ * @return bool
*/
function cascadingDeletes() {
return false;
@@ -386,6 +401,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database supports (and uses) triggers (e.g. on the page table)
+ *
+ * @return bool
*/
function cleanupTriggers() {
return false;
@@ -394,6 +411,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database is strict about what can be put into an IP field.
* Specifically, it uses a NULL value instead of an empty string.
+ *
+ * @return bool
*/
function strictIPs() {
return false;
@@ -401,6 +420,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database uses timestamps rather than integers
+ *
+ * @return bool
*/
function realTimestamps() {
return false;
@@ -408,6 +429,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database does an implicit sort when doing GROUP BY
+ *
+ * @return bool
*/
function implicitGroupby() {
return true;
@@ -416,6 +439,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database does an implicit order by when the column has an index
* For example: SELECT page_title FROM page LIMIT 1
+ *
+ * @return bool
*/
function implicitOrderby() {
return true;
@@ -424,6 +449,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database requires that SELECT DISTINCT queries require that all
ORDER BY expressions occur in the SELECT list per the SQL92 standard
+ *
+ * @return bool
*/
function standardSelectDistinct() {
return true;
@@ -432,6 +459,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database can do a native search on IP columns
* e.g. this works as expected: .. WHERE rc_ip = '127.42.12.102/32';
+ *
+ * @return bool
*/
function searchableIPs() {
return false;
@@ -439,6 +468,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if this database can use functional indexes
+ *
+ * @return bool
*/
function functionalIndexes() {
return false;
@@ -452,7 +483,6 @@ abstract class DatabaseBase implements DatabaseType {
return $this->mLastQuery;
}
-
/**
* Returns true if the connection may have been used for write queries.
* Should return true if unsure.
@@ -508,6 +538,10 @@ abstract class DatabaseBase implements DatabaseType {
/**
* General read-only accessor
+ *
+ * @param $name string
+ *
+ * @return string
*/
function getProperty( $name ) {
return $this->$name;
@@ -579,13 +613,27 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Called by serialize. Throw an exception when DB connection is serialized.
+ * This causes problems on some database engines because the connection is
+ * not restored on unserialize.
+ */
+ public function __sleep() {
+ throw new MWException( 'Database serialization may cause problems, since the connection is not restored on wakeup.' );
+ }
+
+ /**
* Same as new DatabaseMysql( ... ), kept for backward compatibility
* @deprecated since 1.17
*
+ * @param $server
+ * @param $user
+ * @param $password
+ * @param $dbName
+ * @param $flags int
* @return DatabaseMysql
*/
static function newFromParams( $server, $user, $password, $dbName, $flags = 0 ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
return new DatabaseMysql( $server, $user, $password, $dbName, $flags );
}
@@ -595,7 +643,7 @@ abstract class DatabaseBase implements DatabaseType {
* @see Database::factory()
*/
public final static function newFromType( $dbType, $p = array() ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
if ( isset( $p['tableprefix'] ) ) {
$p['tablePrefix'] = $p['tableprefix'];
}
@@ -627,9 +675,9 @@ abstract class DatabaseBase implements DatabaseType {
'mysql', 'postgres', 'sqlite', 'oracle', 'mssql', 'ibm_db2'
);
$dbType = strtolower( $dbType );
+ $class = 'Database' . ucfirst( $dbType );
- if( in_array( $dbType, $canonicalDBTypes ) ) {
- $class = 'Database' . ucfirst( $dbType );
+ if( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) {
return new $class(
isset( $p['host'] ) ? $p['host'] : false,
isset( $p['user'] ) ? $p['user'] : false,
@@ -649,6 +697,9 @@ abstract class DatabaseBase implements DatabaseType {
set_error_handler( array( $this, 'connectionErrorHandler' ) );
}
+ /**
+ * @return bool|string
+ */
protected function restoreErrorHandler() {
restore_error_handler();
if ( $this->htmlErrors !== false ) {
@@ -663,6 +714,10 @@ abstract class DatabaseBase implements DatabaseType {
}
}
+ /**
+ * @param $errno
+ * @param $errstr
+ */
protected function connectionErrorHandler( $errno, $errstr ) {
$this->mPHPError = $errstr;
}
@@ -695,7 +750,7 @@ abstract class DatabaseBase implements DatabaseType {
* The DBMS-dependent part of query()
*
* @param $sql String: SQL query.
- * @return Result object to feed to fetchObject, fetchRow, ...; or false on failure
+ * @return ResultWrapper Result object to feed to fetchObject, fetchRow, ...; or false on failure
*/
protected abstract function doQuery( $sql );
@@ -703,6 +758,8 @@ abstract class DatabaseBase implements DatabaseType {
* Determine whether a query writes to the DB.
* Should return true if unsure.
*
+ * @param $sql string
+ *
* @return bool
*/
function isWriteQuery( $sql ) {
@@ -776,8 +833,8 @@ abstract class DatabaseBase implements DatabaseType {
# that would delay transaction initializations to once connection
# is really used by application
$sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
- if ( strpos( $sqlstart, "SHOW " ) !== 0 and strpos( $sqlstart, "SET " ) !== 0 )
- $this->begin();
+ if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 )
+ $this->begin( __METHOD__ . " ($fname)" );
}
if ( $this->debug() ) {
@@ -787,20 +844,21 @@ abstract class DatabaseBase implements DatabaseType {
$sqlx = substr( $commentedSql, 0, 500 );
$sqlx = strtr( $sqlx, "\t\n", ' ' );
- if ( $isMaster ) {
- wfDebug( "Query $cnt (master): $sqlx\n" );
- } else {
- wfDebug( "Query $cnt (slave): $sqlx\n" );
- }
+ $master = $isMaster ? 'master' : 'slave';
+ 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
$ret = $this->doQuery( $commentedSql );
+ MWDebug::queryTime( $queryId );
+
# Try reconnecting if the connection was lost
if ( false === $ret && $this->wasErrorReissuable() ) {
# Transaction is gone, like it or not
@@ -874,6 +932,9 @@ abstract class DatabaseBase implements DatabaseType {
* database classes. The query wrapper functions (select() etc.) should be
* used instead.
*
+ * @param $sql string
+ * @param $func string
+ *
* @return array
*/
function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
@@ -885,6 +946,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Free a prepared query, generated by prepare().
+ * @param $prepared
*/
function freePrepared( $prepared ) {
/* No-op by default */
@@ -959,7 +1021,6 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $matches Array
* @return String
- * @private
*/
function fillPreparedArg( $matches ) {
switch( $matches[1] ) {
@@ -999,6 +1060,12 @@ abstract class DatabaseBase implements DatabaseType {
* This function exists for historical reasons, DatabaseBase::update() has a more standard
* calling convention and feature set
*
+ * @param $table string
+ * @param $var
+ * @param $value
+ * @param $cond
+ * @param $fname string
+ *
* @return bool
*/
function set( $table, $var, $value, $cond, $fname = 'DatabaseBase::set' ) {
@@ -1160,7 +1227,6 @@ abstract class DatabaseBase implements DatabaseType {
* @param $options Array Query options
* @param $join_conds Array Join conditions
*
- *
* @param $table string|array
*
* May be either an array of table names, or a single string holding a table
@@ -1324,7 +1390,7 @@ abstract class DatabaseBase implements DatabaseType {
$from = ' FROM ' . implode( ',', $this->tableNamesWithAlias( $table ) );
}
} elseif ( $table != '' ) {
- if ( $table { 0 } == ' ' ) {
+ if ( $table[0] == ' ' ) {
$from = ' FROM ' . $table;
} else {
$from = ' FROM ' . $this->tableName( $table );
@@ -1364,7 +1430,7 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $table string|array Table name
* @param $vars string|array Field names
- * @param $conds|array Conditions
+ * @param $conds array Conditions
* @param $fname string Caller function name
* @param $options string|array Query options
* @param $join_conds array|string Join conditions
@@ -1404,8 +1470,8 @@ abstract class DatabaseBase implements DatabaseType {
* Takes the same arguments as DatabaseBase::select().
*
* @param $table String: table name
- * @param $vars Array: unused
- * @param $conds Array: filters on the table
+ * @param Array|string $vars : unused
+ * @param Array|string $conds : filters on the table
* @param $fname String: function name for profiling
* @param $options Array: options for select
* @return Integer: row count
@@ -1428,7 +1494,9 @@ abstract class DatabaseBase implements DatabaseType {
* Removes most variables from an SQL query and replaces them with X or N for numbers.
* It's only slightly flawed. Don't use for anything important.
*
- * @param $sql String: A SQL Query
+ * @param $sql String A SQL Query
+ *
+ * @return string
*/
static function generalizeSQL( $sql ) {
# This does the same as the regexp below would do, but in such a way
@@ -1469,6 +1537,10 @@ abstract class DatabaseBase implements DatabaseType {
* Usually throws a DBQueryError on failure
* If errors are explicitly ignored, returns NULL on failure
*
+ * @param $table
+ * @param $index
+ * @param $fname string
+ *
* @return bool|null
*/
function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
@@ -1483,14 +1555,15 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Query whether a given table exists
*
- * @string table
+ * @param $table string
+ * @param $fname string
*
* @return bool
*/
- function tableExists( $table ) {
+ function tableExists( $table, $fname = __METHOD__ ) {
$table = $this->tableName( $table );
$old = $this->ignoreErrors( true );
- $res = $this->query( "SELECT 1 FROM $table LIMIT 1", __METHOD__ );
+ $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname );
$this->ignoreErrors( $old );
return (bool)$res;
@@ -1498,6 +1571,9 @@ abstract class DatabaseBase implements DatabaseType {
/**
* mysql_field_type() wrapper
+ * @param $res
+ * @param $index
+ * @return string
*/
function fieldType( $res, $index ) {
if ( $res instanceof ResultWrapper ) {
@@ -1562,7 +1638,7 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $table String Table name. This will be passed through
* DatabaseBase::tableName().
- * @param $a Array of rows to insert
+ * @param $a Array of rows to insert
* @param $fname String Calling function name (use __METHOD__) for logs/profiling
* @param $options Array of options
*
@@ -1662,7 +1738,7 @@ abstract class DatabaseBase implements DatabaseType {
$opts = $this->makeUpdateOptions( $options );
$sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET );
- if ( $conds != '*' ) {
+ if ( $conds !== array() && $conds !== '*' ) {
$sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
}
@@ -1672,7 +1748,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Makes an encoded list of strings from an array
* @param $a Array containing the data
- * @param $mode:
+ * @param $mode int Constant
* - LIST_COMMA: comma separated, no field names
* - LIST_AND: ANDed WHERE clause (without the WHERE). See
* the documentation for $conds in DatabaseBase::select().
@@ -1800,6 +1876,9 @@ abstract class DatabaseBase implements DatabaseType {
* Change the current database
*
* @todo Explain what exactly will fail if this is not overridden.
+ *
+ * @param $db
+ *
* @return bool Success or failure
*/
function selectDB( $db ) {
@@ -1835,11 +1914,13 @@ abstract class DatabaseBase implements DatabaseType {
* when calling query() directly.
*
* @param $name String: database table name
- * @param $quoted Boolean: Automatically pass the table name through
- * addIdentifierQuotes() so that it can be used in a query.
+ * @param $format String One of:
+ * quoted - Automatically pass the table name through addIdentifierQuotes()
+ * so that it can be used in a query.
+ * raw - Do not add identifier quotes to the table name
* @return String: full database name
*/
- function tableName( $name, $quoted = true ) {
+ function tableName( $name, $format = 'quoted' ) {
global $wgSharedDB, $wgSharedPrefix, $wgSharedTables;
# Skip the entire process when we have a string quoted on both ends.
# Note that we check the end so that we will still quote any use of
@@ -1871,7 +1952,7 @@ abstract class DatabaseBase implements DatabaseType {
}
$prefix = $this->mTablePrefix; # Default prefix
- # A database name has been specified in input. We don't want any
+ # A database name has been specified in input. We don't want any
# prefixes added.
if ( isset( $database ) ) {
$prefix = '';
@@ -1891,11 +1972,11 @@ abstract class DatabaseBase implements DatabaseType {
# Quote the $database and $table and apply the prefix if not quoted.
if ( isset( $database ) ) {
- $database = ( !$quoted || $this->isQuotedIdentifier( $database ) ? $database : $this->addIdentifierQuotes( $database ) );
+ $database = ( $format == 'quoted' || $this->isQuotedIdentifier( $database ) ? $database : $this->addIdentifierQuotes( $database ) );
}
$table = "{$prefix}{$table}";
- if ( $quoted && !$this->isQuotedIdentifier( $table ) ) {
+ if ( $format == 'quoted' && !$this->isQuotedIdentifier( $table ) ) {
$table = $this->addIdentifierQuotes( "{$table}" );
}
@@ -1913,6 +1994,8 @@ abstract class DatabaseBase implements DatabaseType {
* extract($dbr->tableNames('user','watchlist'));
* $sql = "SELECT wl_namespace,wl_title FROM $watchlist,$user
* WHERE wl_user=user_id AND wl_user=$nameWithQuotes";
+ *
+ * @return array
*/
public function tableNames() {
$inArray = func_get_args();
@@ -1933,6 +2016,8 @@ abstract class DatabaseBase implements DatabaseType {
* list( $user, $watchlist ) = $dbr->tableNamesN('user','watchlist');
* $sql = "SELECT wl_namespace,wl_title FROM $watchlist,$user
* WHERE wl_user=user_id AND wl_user=$nameWithQuotes";
+ *
+ * @return array
*/
public function tableNamesN() {
$inArray = func_get_args();
@@ -1950,7 +2035,7 @@ abstract class DatabaseBase implements DatabaseType {
* e.g. tableName AS newTableName
*
* @param $name string Table name, see tableName()
- * @param $alias string Alias (optional)
+ * @param $alias string|bool Alias (optional)
* @return string SQL name for aliased table. Will not alias a table to its own name
*/
public function tableNameWithAlias( $name, $alias = false ) {
@@ -1982,9 +2067,9 @@ abstract class DatabaseBase implements DatabaseType {
* Get the aliased table name clause for a FROM clause
* which might have a JOIN and/or USE INDEX clause
*
- * @param $tables array( [alias] => table )
- * @param $use_index array() Same as for select()
- * @param $join_conds array() Same as for select()
+ * @param $tables array ( [alias] => table )
+ * @param $use_index array Same as for select()
+ * @param $join_conds array Same as for select()
* @return string
*/
protected function tableNamesWithUseIndexOrJOIN(
@@ -2087,6 +2172,8 @@ abstract class DatabaseBase implements DatabaseType {
* Since MySQL is the odd one out here the double quotes are our generic
* and we implement backticks in DatabaseMysql.
*
+ * @param $s string
+ *
* @return string
*/
public function addIdentifierQuotes( $s ) {
@@ -2111,10 +2198,12 @@ abstract class DatabaseBase implements DatabaseType {
* was renamed to addIdentifierQuotes.
* @deprecated since 1.18 use addIdentifierQuotes
*
+ * @param $s string
+ *
* @return string
*/
function quote_ident( $s ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
return $this->addIdentifierQuotes( $s );
}
@@ -2123,12 +2212,20 @@ abstract class DatabaseBase implements DatabaseType {
* WARNING: you should almost never use this function directly,
* instead use buildLike() that escapes everything automatically
* @deprecated since 1.17, warnings in 1.17, removed in ???
+ *
+ * @param $s string
+ *
+ * @return string
*/
public function escapeLike( $s ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.17' );
return $this->escapeLikeInternal( $s );
}
+ /**
+ * @param $s string
+ * @return string
+ */
protected function escapeLikeInternal( $s ) {
$s = str_replace( '\\', '\\\\', $s );
$s = $this->strencode( $s );
@@ -2181,7 +2278,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns a token for buildLike() that denotes a '%' to be used in a LIKE query
*
- * @rerturn LikeMatch
+ * @return LikeMatch
*/
function anyString() {
return new LikeMatch( '%' );
@@ -2191,6 +2288,12 @@ abstract class DatabaseBase implements DatabaseType {
* Returns an appropriately quoted sequence value for inserting a new row.
* MySQL has autoincrement fields, so this is just NULL. But the PostgreSQL
* subclass will return an integer, and save the value for insertId()
+ *
+ * Any implementation of this function should *not* involve reusing
+ * sequence numbers created for rolled-back transactions.
+ * See http://bugs.mysql.com/bug.php?id=30767 for details.
+ * @param $seqName string
+ * @return null
*/
function nextSequenceValue( $seqName ) {
return null;
@@ -2203,6 +2306,8 @@ abstract class DatabaseBase implements DatabaseType {
* which index to pick. Anyway, other databases might have different
* indexes on a given table. So don't bother overriding this unless you're
* MySQL.
+ * @param $index
+ * @return string
*/
function useIndexClause( $index ) {
return '';
@@ -2223,14 +2328,11 @@ abstract class DatabaseBase implements DatabaseType {
* to collide. However if you do this, you run the risk of encountering
* errors which wouldn't have occurred in MySQL.
*
- * @param $rows Can be either a single row to insert, or multiple rows,
+ * @param $table String: The table to replace the row(s) in.
+ * @param $rows array Can be either a single row to insert, or multiple rows,
* in the same format as for DatabaseBase::insert()
- * @param $uniqueIndexes is an array of indexes. Each element may be either
+ * @param $uniqueIndexes array is an array of indexes. Each element may be either
* a field name or an array of field names
- *
- * @param $table String: The table to replace the row(s) in.
- * @param $uniqueIndexes Array: An associative array of indexes
- * @param $rows Array: Array of rows to replace
* @param $fname String: Calling function name (use __METHOD__) for logs/profiling
*/
function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
@@ -2284,9 +2386,11 @@ abstract class DatabaseBase implements DatabaseType {
* REPLACE query wrapper for MySQL and SQLite, which have a native REPLACE
* statement.
*
- * @param $table Table name
- * @param $rows Rows to insert
- * @param $fname Caller function name
+ * @param $table string Table name
+ * @param $rows array Rows to insert
+ * @param $fname string Caller function name
+ *
+ * @return ResultWrapper
*/
protected function nativeReplace( $table, $rows, $fname ) {
$table = $this->tableName( $table );
@@ -2353,6 +2457,11 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns the size of a text field, or -1 for "unlimited"
+ *
+ * @param $table string
+ * @param $field string
+ *
+ * @return int
*/
function textFieldSize( $table, $field ) {
$table = $this->tableName( $table );
@@ -2412,24 +2521,24 @@ abstract class DatabaseBase implements DatabaseType {
* INSERT SELECT wrapper. Takes data from a SELECT query and inserts it
* into another table.
*
- * @param $destTable The table name to insert into
- * @param $srcTable May be either a table name, or an array of table names
+ * @param $destTable string The table name to insert into
+ * @param $srcTable string|array May be either a table name, or an array of table names
* to include in a join.
*
- * @param $varMap must be an associative array of the form
+ * @param $varMap array must be an associative array of the form
* array( 'dest1' => 'source1', ...). Source items may be literals
* rather than field names, but strings should be quoted with
* DatabaseBase::addQuotes()
*
- * @param $conds Condition array. See $conds in DatabaseBase::select() for
+ * @param $conds array Condition array. See $conds in DatabaseBase::select() for
* the details of the format of condition arrays. May be "*" to copy the
* whole table.
*
- * @param $fname The function name of the caller, from __METHOD__
+ * @param $fname string The function name of the caller, from __METHOD__
*
- * @param $insertOptions Options for the INSERT part of the query, see
+ * @param $insertOptions array Options for the INSERT part of the query, see
* DatabaseBase::insert() for details.
- * @param $selectOptions Options for the SELECT part of the query, see
+ * @param $selectOptions array Options for the SELECT part of the query, see
* DatabaseBase::select() for details.
*
* @return ResultWrapper
@@ -2461,7 +2570,10 @@ abstract class DatabaseBase implements DatabaseType {
" FROM $srcTable $useIndex ";
if ( $conds != '*' ) {
- $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
+ if ( is_array( $conds ) ) {
+ $conds = $this->makeList( $conds, LIST_AND );
+ }
+ $sql .= " WHERE $conds";
}
$sql .= " $tailOpts";
@@ -2483,9 +2595,9 @@ abstract class DatabaseBase implements DatabaseType {
* The version provided by default works in MySQL and SQLite. It will very
* likely need to be overridden for most other DBMSes.
*
- * @param $sql String: SQL query we will append the limit too
- * @param $limit Integer: the SQL limit
- * @param $offset Integer the SQL offset (default false)
+ * @param $sql String SQL query we will append the limit too
+ * @param $limit Integer the SQL limit
+ * @param $offset Integer|false the SQL offset (default false)
*
* @return string
*/
@@ -2499,6 +2611,11 @@ abstract class DatabaseBase implements DatabaseType {
. "{$limit} ";
}
+ /**
+ * @param $sql
+ * @param $num
+ * @return string
+ */
function limitResultForUpdate( $sql, $num ) {
return $this->limitResult( $sql, $num, 0 );
}
@@ -2553,6 +2670,16 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Determines how long the server has been up
+ * STUB
+ *
+ * @return int
+ */
+ function getServerUptime() {
+ return 0;
+ }
+
+ /**
* Determines if the last failure was due to a deadlock
* STUB
*
@@ -2563,6 +2690,16 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Determines if the last failure was due to a lock timeout
+ * STUB
+ *
+ * @return bool
+ */
+ function wasLockTimeout() {
+ return false;
+ }
+
+ /**
* Determines if the last query error was something that should be dealt
* with by pinging the connection and reissuing the query.
* STUB
@@ -2598,11 +2735,12 @@ abstract class DatabaseBase implements DatabaseType {
* Returns whatever the callback function returned on its successful,
* iteration, or false on error, for example if the retry limit was
* reached.
+ *
+ * @return bool
*/
function deadlockLoop() {
- $myFname = 'DatabaseBase::deadlockLoop';
- $this->begin();
+ $this->begin( __METHOD__ );
$args = func_get_args();
$function = array_shift( $args );
$oldIgnore = $this->ignoreErrors( true );
@@ -2633,11 +2771,11 @@ abstract class DatabaseBase implements DatabaseType {
$this->ignoreErrors( $oldIgnore );
if ( $tries <= 0 ) {
- $this->rollback( $myFname );
+ $this->rollback( __METHOD__ );
$this->reportQueryError( $error, $errno, $sql, $fname );
return false;
} else {
- $this->commit( $myFname );
+ $this->commit( __METHOD__ );
return $retVal;
}
}
@@ -2654,29 +2792,28 @@ abstract class DatabaseBase implements DatabaseType {
* zero if we timed out.
*/
function masterPosWait( DBMasterPos $pos, $timeout ) {
- $fname = 'DatabaseBase::masterPosWait';
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
if ( !is_null( $this->mFakeSlaveLag ) ) {
$wait = intval( ( $pos->pos - microtime( true ) + $this->mFakeSlaveLag ) * 1e6 );
if ( $wait > $timeout * 1e6 ) {
wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return -1;
} elseif ( $wait > 0 ) {
wfDebug( "Fake slave waiting $wait us\n" );
usleep( $wait );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return 1;
} else {
wfDebug( "Fake slave up to date ($wait us)\n" );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return 0;
}
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
# Real waits are implemented in the subclass.
return 0;
@@ -2713,6 +2850,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Begin a transaction, committing any previously open transaction
+ *
+ * @param $fname string
*/
function begin( $fname = 'DatabaseBase::begin' ) {
$this->query( 'BEGIN', $fname );
@@ -2721,6 +2860,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* End a transaction
+ *
+ * @param $fname string
*/
function commit( $fname = 'DatabaseBase::commit' ) {
if ( $this->mTrxLevel ) {
@@ -2732,6 +2873,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Rollback a transaction.
* No-op on non-transactional databases.
+ *
+ * @param $fname string
*/
function rollback( $fname = 'DatabaseBase::rollback' ) {
if ( $this->mTrxLevel ) {
@@ -2778,6 +2921,8 @@ abstract class DatabaseBase implements DatabaseType {
* The result is unquoted, and needs to be passed through addQuotes()
* before it can be included in raw SQL.
*
+ * @param $ts string|int
+ *
* @return string
*/
function timestamp( $ts = 0 ) {
@@ -2793,6 +2938,8 @@ abstract class DatabaseBase implements DatabaseType {
* The result is unquoted, and needs to be passed through addQuotes()
* before it can be included in raw SQL.
*
+ * @param $ts string|int
+ *
* @return string
*/
function timestampOrNull( $ts = null ) {
@@ -2813,6 +2960,10 @@ abstract class DatabaseBase implements DatabaseType {
* a wrapper. Nowadays, raw database objects are never exposed to external
* callers, so this is unnecessary in external code. For compatibility with
* old code, ResultWrapper objects are passed through unaltered.
+ *
+ * @param $result bool|ResultWrapper
+ *
+ * @return bool|ResultWrapper
*/
function resultObject( $result ) {
if ( empty( $result ) ) {
@@ -2829,6 +2980,11 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Return aggregated value alias
+ *
+ * @param $valuedata
+ * @param $valuename string
+ *
+ * @return string
*/
function aggregateValue ( $valuedata, $valuename = 'value' ) {
return $valuename;
@@ -2860,7 +3016,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Return the maximum number of items allowed in a list, or 0 for unlimited.
*
- * return int
+ * @return int
*/
function maxListLen() {
return 0;
@@ -2871,6 +3027,8 @@ abstract class DatabaseBase implements DatabaseType {
* don't allow simple quoted strings to be inserted. To insert into such
* a field, pass the data through this function before passing it to
* DatabaseBase::insert().
+ * @param $b string
+ * @return string
*/
function encodeBlob( $b ) {
return $b;
@@ -2880,20 +3038,36 @@ abstract class DatabaseBase implements DatabaseType {
* Some DBMSs return a special placeholder object representing blob fields
* in result objects. Pass the object through this function to return the
* original string.
+ * @param $b string
+ * @return string
*/
function decodeBlob( $b ) {
return $b;
}
/**
- * Override database's default connection timeout. May be useful for very
- * long batch queries such as full-wiki dumps, where a single query reads
- * out over hours or days. May or may not be necessary for non-MySQL
- * databases. For most purposes, leaving it as a no-op should be fine.
+ * Override database's default connection timeout
*
* @param $timeout Integer in seconds
+ * @return void
+ * @deprecated since 1.19; use setSessionOptions()
+ */
+ public function setTimeout( $timeout ) {
+ wfDeprecated( __METHOD__, '1.19' );
+ $this->setSessionOptions( array( 'connTimeout' => $timeout ) );
+ }
+
+ /**
+ * Override database's default behavior. $options include:
+ * 'connTimeout' : Set the connection timeout value in seconds.
+ * May be useful for very long batch queries such as
+ * full-wiki dumps, where a single query reads out over
+ * hours or days.
+ *
+ * @param $options Array
+ * @return void
*/
- public function setTimeout( $timeout ) {}
+ public function setSessionOptions( array $options ) {}
/**
* Read and execute SQL commands from a file.
@@ -2906,6 +3080,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param $resultCallback Callback: Optional function called for each MySQL result
* @param $fname String: Calling function name or false if name should be
* generated dynamically using $filename
+ * @return bool|string
*/
function sourceFile( $filename, $lineCallback = false, $resultCallback = false, $fname = false ) {
wfSuppressWarnings();
@@ -2973,56 +3148,42 @@ abstract class DatabaseBase implements DatabaseType {
* @param $lineCallback Callback: Optional function called before reading each line
* @param $resultCallback Callback: Optional function called for each MySQL result
* @param $fname String: Calling function name
+ * @param $inputCallback Callback: Optional function called for each complete line (ended with ;) sent
+ * @return bool|string
*/
- function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
- $fname = 'DatabaseBase::sourceStream' )
+ public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
+ $fname = 'DatabaseBase::sourceStream', $inputCallback = false )
{
- $cmd = "";
- $done = false;
- $dollarquote = false;
+ $cmd = '';
- while ( ! feof( $fp ) ) {
+ while ( !feof( $fp ) ) {
if ( $lineCallback ) {
call_user_func( $lineCallback );
}
$line = trim( fgets( $fp ) );
- $sl = strlen( $line ) - 1;
- if ( $sl < 0 ) {
+ if ( $line == '' ) {
continue;
}
- if ( '-' == $line { 0 } && '-' == $line { 1 } ) {
+ if ( '-' == $line[0] && '-' == $line[1] ) {
continue;
}
- # # Allow dollar quoting for function declarations
- if ( substr( $line, 0, 4 ) == '$mw$' ) {
- if ( $dollarquote ) {
- $dollarquote = false;
- $done = true;
- }
- else {
- $dollarquote = true;
- }
- }
- elseif ( !$dollarquote ) {
- if ( ';' == $line { $sl } && ( $sl < 2 || ';' != $line { $sl - 1 } ) ) {
- $done = true;
- $line = substr( $line, 0, $sl );
- }
- }
-
if ( $cmd != '' ) {
$cmd .= ' ';
}
+ $done = $this->streamStatementEnd( $cmd, $line );
+
$cmd .= "$line\n";
- if ( $done ) {
- $cmd = str_replace( ';;', ";", $cmd );
+ if ( $done || feof( $fp ) ) {
$cmd = $this->replaceVars( $cmd );
+ if ( $inputCallback ) {
+ call_user_func( $inputCallback, $cmd );
+ }
$res = $this->query( $cmd, $fname );
if ( $resultCallback ) {
@@ -3035,7 +3196,6 @@ abstract class DatabaseBase implements DatabaseType {
}
$cmd = '';
- $done = false;
}
}
@@ -3043,6 +3203,24 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Called by sourceStream() to check if we've reached a statement end
+ *
+ * @param $sql String SQL assembled so far
+ * @param $newLine String New line about to be added to $sql
+ * @return Bool Whether $newLine contains end of the statement
+ */
+ public function streamStatementEnd( &$sql, &$newLine ) {
+ if ( $this->delimiter ) {
+ $prev = $newLine;
+ $newLine = preg_replace( '/' . preg_quote( $this->delimiter, '/' ) . '$/', '', $newLine );
+ if ( $newLine != $prev ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Database independent variable replacement. Replaces a set of variables
* in an SQL statement with their contents as given by $this->getSchemaVars().
*
@@ -3096,6 +3274,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Get schema variables. If none have been set via setSchemaVars(), then
* use some defaults from the current object.
+ *
+ * @return array
*/
protected function getSchemaVars() {
if ( $this->mSchemaVars ) {
@@ -3207,9 +3387,10 @@ abstract class DatabaseBase implements DatabaseType {
* @param $tableName string
* @param $fName string
* @return bool|ResultWrapper
+ * @since 1.18
*/
public function dropTable( $tableName, $fName = 'DatabaseBase::dropTable' ) {
- if( !$this->tableExists( $tableName ) ) {
+ if( !$this->tableExists( $tableName, $fName ) ) {
return false;
}
$sql = "DROP TABLE " . $this->tableName( $tableName );
diff --git a/includes/db/DatabaseError.php b/includes/db/DatabaseError.php
index b7fb1b22..836d7814 100644
--- a/includes/db/DatabaseError.php
+++ b/includes/db/DatabaseError.php
@@ -82,11 +82,19 @@ class DBConnectionError extends DBError {
parent::__construct( $db, $msg );
}
+ /**
+ * @return bool
+ */
function useOutputPage() {
// Not likely to work
return false;
}
+ /**
+ * @param $key
+ * @param $fallback
+ * @return string
+ */
function msg( $key, $fallback /*[, params...] */ ) {
global $wgLang;
@@ -100,6 +108,9 @@ class DBConnectionError extends DBError {
return wfMsgReplaceArgs( $message, $args );
}
+ /**
+ * @return bool
+ */
function getLogMessage() {
# Don't send to the exception log
return false;
@@ -171,7 +182,7 @@ class DBConnectionError extends DBError {
}
# We can't, cough and die in the usual fashion
- return parent::reportHTML();
+ parent::reportHTML();
}
/**
@@ -193,7 +204,7 @@ class DBConnectionError extends DBError {
<div style="margin: 1.5em">$usegoogle<br />
<small>$outofdate</small></div>
<!-- SiteSearch Google -->
-<form method="get" action="http://www.google.com/search" id="googlesearch">
+<form method="get" action="//www.google.com/search" id="googlesearch">
<input type="hidden" name="domains" value="$server" />
<input type="hidden" name="num" value="50" />
<input type="hidden" name="ie" value="UTF-8" />
@@ -215,21 +226,28 @@ EOT;
* @return string
*/
private function fileCachedPage() {
- global $wgTitle, $wgOut;
+ global $wgTitle, $wgOut, $wgRequest;
if ( $wgOut->isDisabled() ) {
- return; // Done already?
+ return ''; // Done already?
}
- if ( $wgTitle ) {
- $t =& $wgTitle;
+ if ( $wgTitle ) { // use $wgTitle if we managed to set it
+ $t = $wgTitle->getPrefixedDBkey();
} else {
- $t = Title::newFromText( $this->msg( 'mainpage', 'Main Page' ) );
+ # Fallback to the raw title URL param. We can't use the Title
+ # class is it may hit the interwiki table and give a DB error.
+ # We may get a cache miss due to not sanitizing the title though.
+ $t = str_replace( ' ', '_', $wgRequest->getVal( 'title' ) );
+ if ( $t == '' ) { // fallback to main page
+ $t = Title::newFromText(
+ $this->msg( 'mainpage', 'Main Page' ) )->getPrefixedDBkey();
+ }
}
- $cache = new HTMLFileCache( $t );
- if ( $cache->isFileCached() ) {
- return $cache->fetchPageText();
+ $cache = HTMLFileCache::newFromTitle( $t, 'view' );
+ if ( $cache->isCached() ) {
+ return $cache->fetchText();
} else {
return '';
}
@@ -242,15 +260,18 @@ EOT;
class DBQueryError extends DBError {
public $error, $errno, $sql, $fname;
+ /**
+ * @param $db DatabaseBase
+ * @param $error string
+ * @param $errno int|string
+ * @param $sql string
+ * @param $fname string
+ */
function __construct( DatabaseBase &$db, $error, $errno, $sql, $fname ) {
- $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
+ $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
"Query: $sql\n" .
"Function: $fname\n" .
"Error: $errno $error\n";
- global $wgShowDBErrorBacktrace;
- if( $wgShowDBErrorBacktrace ) {
- $message .= $this->getTraceAsString();
- }
parent::__construct( $db, $message );
$this->error = $error;
@@ -295,6 +316,9 @@ class DBQueryError extends DBError {
}
}
+ /**
+ * @return bool
+ */
function getLogMessage() {
# Don't send to the exception log
return false;
diff --git a/includes/db/DatabaseIbm_db2.php b/includes/db/DatabaseIbm_db2.php
index 147b9d59..fed3b12e 100644
--- a/includes/db/DatabaseIbm_db2.php
+++ b/includes/db/DatabaseIbm_db2.php
@@ -104,6 +104,147 @@ class IBM_DB2Blob {
}
/**
+ * Wrapper to address lack of certain operations in the DB2 driver
+ * ( seek, num_rows )
+ * @ingroup Database
+ * @since 1.19
+ */
+class IBM_DB2Result{
+ private $db;
+ private $result;
+ private $num_rows;
+ private $current_pos;
+ private $columns = array();
+ private $sql;
+
+ private $resultSet = array();
+ private $loadedLines = 0;
+
+ /**
+ * Construct and initialize a wrapper for DB2 query results
+ * @param $db Database
+ * @param $result Object
+ * @param $num_rows Integer
+ * @param $sql String
+ * @param $columns Array
+ */
+ public function __construct( $db, $result, $num_rows, $sql, $columns ){
+ $this->db = $db;
+
+ if( $result instanceof ResultWrapper ){
+ $this->result = $result->result;
+ }
+ else{
+ $this->result = $result;
+ }
+
+ $this->num_rows = $num_rows;
+ $this->current_pos = 0;
+ if ( $this->num_rows > 0 ) {
+ // Make a lower-case list of the column names
+ // By default, DB2 column names are capitalized
+ // while MySQL column names are lowercase
+
+ // Is there a reasonable maximum value for $i?
+ // Setting to 2048 to prevent an infinite loop
+ for( $i = 0; $i < 2048; $i++ ) {
+ $name = db2_field_name( $this->result, $i );
+ if ( $name != false ) {
+ continue;
+ }
+ else {
+ return false;
+ }
+
+ $this->columns[$i] = strtolower( $name );
+ }
+ }
+
+ $this->sql = $sql;
+ }
+
+ /**
+ * Unwrap the DB2 query results
+ * @return mixed Object on success, false on failure
+ */
+ public function getResult() {
+ if ( $this->result ) {
+ return $this->result;
+ }
+ else return false;
+ }
+
+ /**
+ * Get the number of rows in the result set
+ * @return integer
+ */
+ public function getNum_rows() {
+ return $this->num_rows;
+ }
+
+ /**
+ * Return a row from the result set in object format
+ * @return mixed Object on success, false on failure.
+ */
+ public function fetchObject() {
+ if ( $this->result
+ && $this->num_rows > 0
+ && $this->current_pos >= 0
+ && $this->current_pos < $this->num_rows )
+ {
+ $row = $this->fetchRow();
+ $ret = new stdClass();
+
+ foreach ( $row as $k => $v ) {
+ $lc = $this->columns[$k];
+ $ret->$lc = $v;
+ }
+ return $ret;
+ }
+ return false;
+ }
+
+ /**
+ * Return a row form the result set in array format
+ * @return mixed Array on success, false on failure
+ * @throws DBUnexpectedError
+ */
+ public function fetchRow(){
+ if ( $this->result
+ && $this->num_rows > 0
+ && $this->current_pos >= 0
+ && $this->current_pos < $this->num_rows )
+ {
+ if ( $this->loadedLines <= $this->current_pos ) {
+ $row = db2_fetch_array( $this->result );
+ $this->resultSet[$this->loadedLines++] = $row;
+ if ( $this->db->lastErrno() ) {
+ throw new DBUnexpectedError( $this->db, 'Error in fetchRow(): '
+ . htmlspecialchars( $this->db->lastError() ) );
+ }
+ }
+
+ if ( $this->loadedLines > $this->current_pos ){
+ return $this->resultSet[$this->current_pos++];
+ }
+
+ }
+ return false;
+ }
+
+ /**
+ * Free a DB2 result object
+ * @throws DBUnexpectedError
+ */
+ public function freeResult(){
+ unset( $this->resultSet );
+ if ( !@db2_free_result( $this->result ) ) {
+ throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
+ }
+ }
+}
+
+/**
* Primary database interface
* @ingroup Database
*/
@@ -137,6 +278,8 @@ class DatabaseIbm_db2 extends DatabaseBase {
protected $mAffectedRows = null;
/** Number of rows returned by last SELECT */
protected $mNumRows = null;
+ /** Current row number on the cursor of the last SELECT */
+ protected $currentRow = 0;
/** Connection config options - see constructor */
public $mConnOptions = array();
@@ -233,7 +376,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
/**
* Returns a unique string representing the wiki on the server
*/
- function getWikiID() {
+ public function getWikiID() {
if( $this->mSchema ) {
return "{$this->mDBname}-{$this->mSchema}";
} else {
@@ -241,10 +384,22 @@ class DatabaseIbm_db2 extends DatabaseBase {
}
}
- function getType() {
+ /**
+ * Returns the database software identifieir
+ * @return string
+ */
+ public function getType() {
return 'ibm_db2';
}
+ /**
+ * Returns the database connection object
+ * @return Object
+ */
+ public function getDb(){
+ return $this->mConn;
+ }
+
/**
*
* @param $server String: hostname of database server
@@ -268,17 +423,12 @@ class DatabaseIbm_db2 extends DatabaseBase {
}
// configure the connection and statement objects
- /*
- $this->setDB2Option( 'cursor', 'DB2_SCROLLABLE',
- self::CONN_OPTION | self::STMT_OPTION );
- */
$this->setDB2Option( 'db2_attr_case', 'DB2_CASE_LOWER',
self::CONN_OPTION | self::STMT_OPTION );
$this->setDB2Option( 'deferred_prepare', 'DB2_DEFERRED_PREPARE_ON',
self::STMT_OPTION );
$this->setDB2Option( 'rowcount', 'DB2_ROWCOUNT_PREFETCH_ON',
self::STMT_OPTION );
-
parent::__construct( $server, $user, $password, $dbName, DBO_TRX | $flags );
}
@@ -361,8 +511,6 @@ class DatabaseIbm_db2 extends DatabaseBase {
throw new DBConnectionError( $this, $this->lastError() );
}
- // Apply connection config
- db2_set_option( $this->mConn, $this->mConnOptions, 1 );
// Some MediaWiki code is still transaction-less (?).
// The strategy is to keep AutoCommit on for that code
// but switch it off whenever a transaction is begun.
@@ -391,7 +539,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
{
$dsn = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$dbName;CHARSET=UTF-8;HOSTNAME=$server;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
wfSuppressWarnings();
- $this->mConn = db2_pconnect($dsn, "", "", array());
+ $this->mConn = db2_pconnect( $dsn, "", "", array() );
wfRestoreWarnings();
}
@@ -460,16 +608,16 @@ class DatabaseIbm_db2 extends DatabaseBase {
*/
protected function doQuery( $sql ) {
$this->applySchema();
-
+
// Needed to handle any UTF-8 encoding issues in the raw sql
// Note that we fully support prepared statements for DB2
// prepare() and execute() should be used instead of doQuery() whenever possible
- $sql = utf8_decode($sql);
-
+ $sql = utf8_decode( $sql );
+
$ret = db2_exec( $this->mConn, $sql, $this->mStmtOptions );
if( $ret == false ) {
$error = db2_stmt_errormsg();
-
+
$this->installPrint( "<pre>$sql</pre>" );
$this->installPrint( $error );
throw new DBUnexpectedError( $this, 'SQL error: '
@@ -492,10 +640,10 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Queries whether a given table exists
* @return boolean
*/
- public function tableExists( $table ) {
+ public function tableExists( $table, $fname = __METHOD__ ) {
$schema = $this->mSchema;
-
- $sql = "SELECT COUNT( * ) FROM SYSIBM.SYSTABLES ST WHERE ST.NAME = '" .
+
+ $sql = "SELECT COUNT( * ) FROM SYSIBM.SYSTABLES ST WHERE ST.NAME = '" .
strtoupper( $table ) .
"' AND ST.CREATOR = '" .
strtoupper( $schema ) . "'";
@@ -745,10 +893,10 @@ class DatabaseIbm_db2 extends DatabaseBase {
* Handle reserved keyword replacement in table names
*
* @param $name Object
- * @param $name Boolean
+ * @param $format String Ignored parameter Default 'quoted'Boolean
* @return String
*/
- public function tableName( $name, $quoted = true ) {
+ public function tableName( $name, $format = 'quoted' ) {
// we want maximum compatibility with MySQL schema
return $name;
}
@@ -939,14 +1087,14 @@ class DatabaseIbm_db2 extends DatabaseBase {
*/
private function removeNullPrimaryKeys( $table, $args ) {
$schema = $this->mSchema;
-
+
// find out the primary keys
- $keyres = $this->doQuery( "SELECT NAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = '"
- . strtoupper( $table )
- . "' AND TBCREATOR = '"
- . strtoupper( $schema )
+ $keyres = $this->doQuery( "SELECT NAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = '"
+ . strtoupper( $table )
+ . "' AND TBCREATOR = '"
+ . strtoupper( $schema )
. "' AND KEYSEQ > 0" );
-
+
$keys = array();
for (
$row = $this->fetchRow( $keyres );
@@ -1046,7 +1194,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
-
+
if ( $this->mNumRows ) {
return $this->mNumRows;
} else {
@@ -1062,9 +1210,13 @@ class DatabaseIbm_db2 extends DatabaseBase {
*/
public function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
+ return $res = $res->result;
+ }
+ if ( $res instanceof IBM_DB2Result ) {
+ return $res->dataSeek( $row );
}
- return db2_fetch_row( $res, $row );
+ wfDebug( "dataSeek operation in DB2 database\n" );
+ return false;
}
###
@@ -1097,6 +1249,9 @@ class DatabaseIbm_db2 extends DatabaseBase {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
+ if ( $res instanceof IBM_DB2Result ) {
+ $res = $res->getResult();
+ }
return db2_num_fields( $res );
}
@@ -1110,6 +1265,9 @@ class DatabaseIbm_db2 extends DatabaseBase {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
+ if ( $res instanceof IBM_DB2Result ) {
+ $res = $res->getResult();
+ }
return db2_field_name( $res, $n );
}
@@ -1122,7 +1280,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
* @param $fname String: calling function name (use __METHOD__)
* for logs/profiling
* @param $options Associative array of options
- * (e.g. array('GROUP BY' => 'page_title')),
+ * (e.g. array( 'GROUP BY' => 'page_title' )),
* see Database::makeSelectOptions code for list of
* supported stuff
* @param $join_conds Associative array of table join conditions (optional)
@@ -1135,6 +1293,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
{
$res = parent::select( $table, $vars, $conds, $fname, $options,
$join_conds );
+ $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
// We must adjust for offset
if ( isset( $options['LIMIT'] ) && isset ( $options['OFFSET'] ) ) {
@@ -1161,10 +1320,11 @@ class DatabaseIbm_db2 extends DatabaseBase {
$res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
$join_conds );
+
$obj = $this->fetchObject( $res2 );
$this->mNumRows = $obj->num_rows;
-
- return $res;
+
+ return new ResultWrapper( $this, new IBM_DB2Result( $this, $res, $obj->num_rows, $vars, $sql ) );
}
/**
@@ -1332,6 +1492,9 @@ SQL;
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
+ if ( $res instanceof IBM_DB2Result ) {
+ $res = $res->getResult();
+ }
return db2_field_type( $res, $index );
}
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
index cbdf89ca..38be4cbb 100644
--- a/includes/db/DatabaseMssql.php
+++ b/includes/db/DatabaseMssql.php
@@ -631,7 +631,7 @@ class DatabaseMssql extends DatabaseBase {
return $version;
}
- function tableExists ( $table, $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 ) {
diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php
index 6a81f234..c179b724 100644
--- a/includes/db/DatabaseMysql.php
+++ b/includes/db/DatabaseMysql.php
@@ -14,10 +14,18 @@
* @see Database
*/
class DatabaseMysql extends DatabaseBase {
+
+ /**
+ * @return string
+ */
function getType() {
return 'mysql';
}
+ /**
+ * @param $sql string
+ * @return resource
+ */
protected function doQuery( $sql ) {
if( $this->bufferResults() ) {
$ret = mysql_query( $sql, $this->mConn );
@@ -27,6 +35,14 @@ 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;
wfProfileIn( __METHOD__ );
@@ -110,22 +126,19 @@ class DatabaseMysql extends DatabaseBase {
}
if ( $success ) {
- $version = $this->getServerVersion();
- if ( version_compare( $version, '4.1' ) >= 0 ) {
- // Tell the server we're communicating with it in UTF-8.
- // This may engage various charset conversions.
- global $wgDBmysql5;
- if( $wgDBmysql5 ) {
- $this->query( 'SET NAMES utf8', __METHOD__ );
- } else {
- $this->query( 'SET NAMES binary', __METHOD__ );
- }
- // Set SQL mode, default is turning them all off, can be overridden or skipped with null
- global $wgSQLMode;
- if ( is_string( $wgSQLMode ) ) {
- $mode = $this->addQuotes( $wgSQLMode );
- $this->query( "SET sql_mode = $mode", __METHOD__ );
- }
+ // Tell the server we're communicating with it in UTF-8.
+ // This may engage various charset conversions.
+ global $wgDBmysql5;
+ if( $wgDBmysql5 ) {
+ $this->query( 'SET NAMES utf8', __METHOD__ );
+ } else {
+ $this->query( 'SET NAMES binary', __METHOD__ );
+ }
+ // Set SQL mode, default is turning them all off, can be overridden or skipped with null
+ global $wgSQLMode;
+ if ( is_string( $wgSQLMode ) ) {
+ $mode = $this->addQuotes( $wgSQLMode );
+ $this->query( "SET sql_mode = $mode", __METHOD__ );
}
// Turn off strict mode if it is on
@@ -138,6 +151,9 @@ class DatabaseMysql extends DatabaseBase {
return $success;
}
+ /**
+ * @return bool
+ */
function close() {
$this->mOpened = false;
if ( $this->mConn ) {
@@ -150,6 +166,10 @@ class DatabaseMysql extends DatabaseBase {
}
}
+ /**
+ * @param $res ResultWrapper
+ * @throws DBUnexpectedError
+ */
function freeResult( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -162,6 +182,11 @@ class DatabaseMysql extends DatabaseBase {
}
}
+ /**
+ * @param $res ResultWrapper
+ * @return object|stdClass
+ * @throws DBUnexpectedError
+ */
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -175,7 +200,12 @@ class DatabaseMysql extends DatabaseBase {
return $row;
}
- function fetchRow( $res ) {
+ /**
+ * @param $res ResultWrapper
+ * @return array
+ * @throws DBUnexpectedError
+ */
+ function fetchRow( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
}
@@ -188,6 +218,11 @@ class DatabaseMysql extends DatabaseBase {
return $row;
}
+ /**
+ * @throws DBUnexpectedError
+ * @param $res ResultWrapper
+ * @return int
+ */
function numRows( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -201,6 +236,10 @@ class DatabaseMysql extends DatabaseBase {
return $n;
}
+ /**
+ * @param $res ResultWrapper
+ * @return int
+ */
function numFields( $res ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -208,6 +247,11 @@ class DatabaseMysql extends DatabaseBase {
return mysql_num_fields( $res );
}
+ /**
+ * @param $res ResultWrapper
+ * @param $n string
+ * @return string
+ */
function fieldName( $res, $n ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -215,8 +259,18 @@ class DatabaseMysql extends DatabaseBase {
return mysql_field_name( $res, $n );
}
- function insertId() { return mysql_insert_id( $this->mConn ); }
+ /**
+ * @return int
+ */
+ function insertId() {
+ return mysql_insert_id( $this->mConn );
+ }
+ /**
+ * @param $res ResultWrapper
+ * @param $row
+ * @return bool
+ */
function dataSeek( $res, $row ) {
if ( $res instanceof ResultWrapper ) {
$res = $res->result;
@@ -224,6 +278,9 @@ class DatabaseMysql extends DatabaseBase {
return mysql_data_seek( $res, $row );
}
+ /**
+ * @return int
+ */
function lastErrno() {
if ( $this->mConn ) {
return mysql_errno( $this->mConn );
@@ -232,6 +289,9 @@ class DatabaseMysql extends DatabaseBase {
}
}
+ /**
+ * @return string
+ */
function lastError() {
if ( $this->mConn ) {
# Even if it's non-zero, it can still be invalid
@@ -250,8 +310,20 @@ class DatabaseMysql extends DatabaseBase {
return $error;
}
- function affectedRows() { return mysql_affected_rows( $this->mConn ); }
+ /**
+ * @return int
+ */
+ function affectedRows() {
+ return mysql_affected_rows( $this->mConn );
+ }
+ /**
+ * @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 );
}
@@ -260,6 +332,13 @@ class DatabaseMysql extends DatabaseBase {
* 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;
@@ -278,6 +357,11 @@ class DatabaseMysql extends DatabaseBase {
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 );
@@ -297,6 +381,11 @@ class DatabaseMysql extends DatabaseBase {
/**
* 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 false|array
*/
function indexInfo( $table, $index, $fname = 'DatabaseMysql::indexInfo' ) {
# SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
@@ -322,11 +411,20 @@ class DatabaseMysql extends DatabaseBase {
return empty( $result ) ? false : $result;
}
+ /**
+ * @param $db
+ * @return bool
+ */
function selectDB( $db ) {
$this->mDBname = $db;
return mysql_select_db( $db, $this->mConn );
}
+ /**
+ * @param $s string
+ *
+ * @return string
+ */
function strencode( $s ) {
$sQuoted = mysql_real_escape_string( $s, $this->mConn );
@@ -339,15 +437,26 @@ class DatabaseMysql extends DatabaseBase {
/**
* 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 strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
}
+ /**
+ * @return bool
+ */
function ping() {
$ping = mysql_ping( $this->mConn );
if ( $ping ) {
@@ -364,11 +473,9 @@ class DatabaseMysql extends DatabaseBase {
/**
* Returns slave lag.
*
- * On MySQL 4.1.9 and later, this will do a SHOW SLAVE STATUS. On earlier
- * versions of MySQL, it uses SHOW PROCESSLIST, which requires the PROCESS
- * privilege.
+ * This will do a SHOW SLAVE STATUS
*
- * @result int
+ * @return int
*/
function getLag() {
if ( !is_null( $this->mFakeSlaveLag ) ) {
@@ -376,13 +483,12 @@ class DatabaseMysql extends DatabaseBase {
return $this->mFakeSlaveLag;
}
- if ( version_compare( $this->getServerVersion(), '4.1.9', '>=' ) ) {
- return $this->getLagFromSlaveStatus();
- } else {
- return $this->getLagFromProcesslist();
- }
+ return $this->getLagFromSlaveStatus();
}
+ /**
+ * @return bool|int
+ */
function getLagFromSlaveStatus() {
$res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
if ( !$res ) {
@@ -399,7 +505,13 @@ class DatabaseMysql extends DatabaseBase {
}
}
+ /**
+ * @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;
@@ -432,12 +544,13 @@ class DatabaseMysql extends DatabaseBase {
}
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';
@@ -510,31 +623,68 @@ class DatabaseMysql extends DatabaseBase {
}
}
+ /**
+ * @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';
}
+ /**
+ * @return string
+ */
public static function getSoftwareLink() {
return '[http://www.mysql.com/ MySQL]';
}
+ /**
+ * @return bool
+ */
function standardSelectDistinct() {
return false;
}
- public function setTimeout( $timeout ) {
- $this->query( "SET net_read_timeout=$timeout" );
- $this->query( "SET net_write_timeout=$timeout" );
+ /**
+ * @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 );
+ }
+
+ /**
+ * @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 );
@@ -550,6 +700,9 @@ class DatabaseMysql extends DatabaseBase {
/**
* 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 );
@@ -558,6 +711,12 @@ class DatabaseMysql extends DatabaseBase {
return $row->lockstatus;
}
+ /**
+ * @param $read array
+ * @param $write array
+ * @param $method string
+ * @param $lowPriority bool
+ */
public function lockTables( $read, $write, $method, $lowPriority = true ) {
$items = array();
@@ -574,6 +733,9 @@ class DatabaseMysql extends DatabaseBase {
$this->query( $sql, $method );
}
+ /**
+ * @param $method string
+ */
public function unlockTables( $method ) {
$this->query( "UNLOCK TABLES", $method );
}
@@ -588,6 +750,10 @@ class DatabaseMysql extends DatabaseBase {
return 'SearchMySQL';
}
+ /**
+ * @param bool $value
+ * @return mixed
+ */
public function setBigSelects( $value = true ) {
if ( $value === 'default' ) {
if ( $this->mDefaultBigSelects === null ) {
@@ -605,6 +771,13 @@ class DatabaseMysql extends DatabaseBase {
/**
* 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 $fname bool
+ * @return bool|ResultWrapper
*/
function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
if ( !$conds ) {
@@ -623,15 +796,38 @@ class DatabaseMysql extends DatabaseBase {
}
/**
+ * 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;
@@ -639,45 +835,34 @@ class DatabaseMysql extends DatabaseBase {
/**
* 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 ' : '';
- if ( strcmp( $this->getServerVersion(), '4.1' ) < 0 ) {
- # Hack for MySQL versions < 4.1, which don't support
- # "CREATE TABLE ... LIKE". Note that
- # "CREATE TEMPORARY TABLE ... SELECT * FROM ... LIMIT 0"
- # would not create the indexes we need....
- #
- # Note that we don't bother changing around the prefixes here be-
- # cause we know we're using MySQL anyway.
-
- $res = $this->query( 'SHOW CREATE TABLE ' . $this->addIdentifierQuotes( $oldName ) );
- $row = $this->fetchRow( $res );
- $oldQuery = $row[1];
- $query = preg_replace( '/CREATE TABLE `(.*?)`/',
- "CREATE $tmp TABLE " . $this->addIdentifierQuotes( $newName ), $oldQuery );
- if ($oldQuery === $query) {
- # Couldn't do replacement
- throw new MWException( "could not create temporary table $newName" );
- }
- } else {
- $newName = $this->addIdentifierQuotes( $newName );
- $oldName = $this->addIdentifierQuotes( $oldName );
- $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
- }
+ $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 $prefix Only show tables with this prefix, e.g. mw_
* @param $fname String: calling function name
+ * @return array
*/
function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
$result = $this->query( "SHOW TABLES", $fname);
@@ -692,12 +877,17 @@ class DatabaseMysql extends DatabaseBase {
$endArray[] = $table;
}
}
-
+
return $endArray;
}
+ /**
+ * @param $tableName
+ * @param $fName string
+ * @return bool|ResultWrapper
+ */
public function dropTable( $tableName, $fName = 'DatabaseMysql::dropTable' ) {
- if( !$this->tableExists( $tableName ) ) {
+ if( !$this->tableExists( $tableName, $fName ) ) {
return false;
}
return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
@@ -716,6 +906,7 @@ class DatabaseMysql extends DatabaseBase {
/**
* Get status information from SHOW STATUS in an associative array
*
+ * @param $which string
* @return array
*/
function getMysqlStatus( $which = "%" ) {
@@ -733,6 +924,8 @@ class DatabaseMysql extends DatabaseBase {
/**
* Legacy support: Database == DatabaseMysql
+ *
+ * @deprecated in 1.16
*/
class Database extends DatabaseMysql {}
@@ -757,18 +950,30 @@ class MySQLField implements Field {
$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;
}
+ /**
+ * @return bool
+ */
function isNullable() {
return $this->nullable;
}
@@ -777,10 +982,16 @@ class MySQLField implements Field {
return $this->default;
}
+ /**
+ * @return bool
+ */
function isKey() {
return $this->is_key;
}
+ /**
+ * @return bool
+ */
function isMultipleKey() {
return $this->is_multiple;
}
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
index 9d51cf07..855fc831 100644
--- a/includes/db/DatabaseOracle.php
+++ b/includes/db/DatabaseOracle.php
@@ -548,8 +548,9 @@ class DatabaseOracle extends DatabaseBase {
$val = $val->fetch();
}
+ // backward compatibility
if ( preg_match( '/^timestamp.*/i', $col_type ) == 1 && strtolower( $val ) == 'infinity' ) {
- $val = '31-12-2030 12:00:00.000000';
+ $val = $this->getInfinity();
}
$val = ( $wgContLang != null ) ? $wgContLang->checkTitleEncoding( $val ) : $val;
@@ -654,7 +655,7 @@ class DatabaseOracle extends DatabaseBase {
return $retval;
}
- function tableName( $name, $quoted = true ) {
+ function tableName( $name, $format = 'quoted' ) {
/*
Replace reserved words with better ones
Using uppercase because that's the only way Oracle can handle
@@ -669,7 +670,7 @@ class DatabaseOracle extends DatabaseBase {
break;
}
- return parent::tableName( strtoupper( $name ), $quoted );
+ return parent::tableName( strtoupper( $name ), $format );
}
function tableNameInternal( $name ) {
@@ -768,9 +769,9 @@ class DatabaseOracle extends DatabaseBase {
// dirty code ... i know
$endArray = array();
- $endArray[] = $prefix.'MWUSER';
- $endArray[] = $prefix.'PAGE';
- $endArray[] = $prefix.'IMAGE';
+ $endArray[] = strtoupper($prefix.'MWUSER');
+ $endArray[] = strtoupper($prefix.'PAGE');
+ $endArray[] = strtoupper($prefix.'IMAGE');
$fixedOrderTabs = $endArray;
while (($row = $result->fetchRow()) !== false) {
if (!in_array($row['table_name'], $fixedOrderTabs))
@@ -855,7 +856,7 @@ class DatabaseOracle extends DatabaseBase {
/**
* Query whether a given table exists (in the given schema, or the default mw one if not given)
*/
- function tableExists( $table ) {
+ function tableExists( $table, $fname = __METHOD__ ) {
$table = $this->tableName( $table );
$table = $this->addQuotes( strtoupper( $this->removeIdentifierQuotes( $table ) ) );
$owner = $this->addQuotes( strtoupper( $this->mDBname ) );
@@ -969,7 +970,8 @@ class DatabaseOracle extends DatabaseBase {
}
/* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
- function sourceStream( $fp, $lineCallback = false, $resultCallback = false, $fname = 'DatabaseOracle::sourceStream' ) {
+ function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
+ $fname = 'DatabaseOracle::sourceStream', $inputCallback = false ) {
$cmd = '';
$done = false;
$dollarquote = false;
@@ -1023,6 +1025,9 @@ class DatabaseOracle extends DatabaseBase {
}
$cmd = $this->replaceVars( $cmd );
+ if ( $inputCallback ) {
+ call_user_func( $inputCallback, $cmd );
+ }
$res = $this->doQuery( $cmd );
if ( $resultCallback ) {
call_user_func( $resultCallback, $res, $this );
@@ -1210,7 +1215,7 @@ class DatabaseOracle extends DatabaseBase {
$sql .= $sqlSet;
}
- if ( $conds != '*' ) {
+ if ( $conds !== array() && $conds !== '*' ) {
$conds = $this->wrapConditionsForWhere( $table, $conds );
$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
}
@@ -1299,7 +1304,8 @@ class DatabaseOracle extends DatabaseBase {
return 'BITOR(' . $fieldLeft . ', ' . $fieldRight . ')';
}
- function setFakeMaster( $enabled = true ) { }
+ function setFakeMaster( $enabled = true ) {
+ }
function getDBname() {
return $this->mDBname;
@@ -1312,4 +1318,9 @@ class DatabaseOracle extends DatabaseBase {
public function getSearchEngine() {
return 'SearchOracle';
}
+
+ public function getInfinity() {
+ return '31-12-2030 12:00:00.000000';
+ }
+
} // end DatabaseOracle class
diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php
index 742a8b51..98cf3c75 100644
--- a/includes/db/DatabasePostgres.php
+++ b/includes/db/DatabasePostgres.php
@@ -39,7 +39,7 @@ AND relname=%s
AND attname=%s;
SQL;
- $table = $db->tableName( $table, false );
+ $table = $db->tableName( $table, 'raw' );
$res = $db->query(
sprintf( $q,
$db->addQuotes( $wgDBmwschema ),
@@ -200,6 +200,7 @@ class DatabasePostgres extends DatabaseBase {
$this->query( "SET client_encoding='UTF8'", __METHOD__ );
$this->query( "SET datestyle = 'ISO, YMD'", __METHOD__ );
$this->query( "SET timezone = 'GMT'", __METHOD__ );
+ $this->query( "SET standard_conforming_strings = on", __METHOD__ );
global $wgDBmwschema;
if ( $this->schemaExists( $wgDBmwschema ) ) {
@@ -564,7 +565,7 @@ class DatabasePostgres extends DatabaseBase {
$ignore = in_array( 'IGNORE', $insertOptions ) ? 'mw' : '';
if( is_array( $insertOptions ) ) {
- $insertOptions = implode( ' ', $insertOptions );
+ $insertOptions = implode( ' ', $insertOptions ); // FIXME: This is unused
}
if( !is_array( $selectOptions ) ) {
$selectOptions = array( $selectOptions );
@@ -622,18 +623,23 @@ class DatabasePostgres extends DatabaseBase {
return $res;
}
- function tableName( $name, $quoted = true ) {
+ function tableName( $name, $format = 'quoted' ) {
# Replace reserved words with better ones
switch( $name ) {
case 'user':
- return 'mwuser';
+ return $this->realTableName( 'mwuser', $format );
case 'text':
- return 'pagecontent';
+ return $this->realTableName( 'pagecontent', $format );
default:
- return parent::tableName( $name, $quoted );
+ return $this->realTableName( $name, $format );
}
}
+ /* Don't cheat on installer */
+ function realTableName( $name, $format = 'quoted' ) {
+ return parent::tableName( $name, $format );
+ }
+
/**
* Return the next in a sequence, save the value for retrieval via insertId()
*/
@@ -687,6 +693,24 @@ class DatabasePostgres extends DatabaseBase {
return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName (LIKE $oldName INCLUDING DEFAULTS)", $fname );
}
+ function listTables( $prefix = null, $fname = 'DatabasePostgres::listTables' ) {
+ global $wgDBmwschema;
+ $eschema = $this->addQuotes( $wgDBmwschema );
+ $result = $this->query( "SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $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;
+ }
+
function timestamp( $ts = 0 ) {
return wfTimestamp( TS_POSTGRES, $ts );
}
@@ -737,7 +761,7 @@ class DatabasePostgres extends DatabaseBase {
if ( !$schema ) {
$schema = $wgDBmwschema;
}
- $table = $this->tableName( $table, false );
+ $table = $this->realTableName( $table, 'raw' );
$etable = $this->addQuotes( $table );
$eschema = $this->addQuotes( $schema );
$SQL = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n "
@@ -752,7 +776,7 @@ class DatabasePostgres extends DatabaseBase {
* For backward compatibility, this function checks both tables and
* views.
*/
- function tableExists( $table, $schema = false ) {
+ function tableExists( $table, $fname = __METHOD__, $schema = false ) {
return $this->relationExists( $table, array( 'r', 'v' ), $schema );
}
@@ -766,8 +790,8 @@ class DatabasePostgres extends DatabaseBase {
$q = <<<SQL
SELECT 1 FROM pg_class, pg_namespace, pg_trigger
WHERE relnamespace=pg_namespace.oid AND relkind='r'
- AND tgrelid=pg_class.oid
- AND nspname=%s AND relname=%s AND tgname=%s
+ AND tgrelid=pg_class.oid
+ AND nspname=%s AND relname=%s AND tgname=%s
SQL;
$res = $this->query(
sprintf(
@@ -982,4 +1006,17 @@ SQL;
public function getSearchEngine() {
return 'SearchPostgres';
}
+
+ public function streamStatementEnd( &$sql, &$newLine ) {
+ # Allow dollar quoting for function declarations
+ if ( substr( $newLine, 0, 4 ) == '$mw$' ) {
+ if ( $this->delimiter ) {
+ $this->delimiter = false;
+ }
+ else {
+ $this->delimiter = ';';
+ }
+ }
+ return parent::streamStatementEnd( $sql, $newLine );
+ }
} // end DatabasePostgres class
diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php
index e298175d..b2eb1c6b 100644
--- a/includes/db/DatabaseSqlite.php
+++ b/includes/db/DatabaseSqlite.php
@@ -37,7 +37,7 @@ 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( !$user && $dbName ) {
+ if( $dbName ) {
global $wgSharedDB;
if( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
$this->attachDatabase( $wgSharedDB );
@@ -319,15 +319,15 @@ class DatabaseSqlite extends DatabaseBase {
* Use MySQL's naming (accounts for prefix etc) but remove surrounding backticks
*
* @param $name
- * @param bool $quoted
+ * @param $format String
* @return string
*/
- function tableName( $name, $quoted = true ) {
+ function tableName( $name, $format = 'quoted' ) {
// table names starting with sqlite_ are reserved
if ( strpos( $name, 'sqlite_' ) === 0 ) {
return $name;
}
- return str_replace( '"', '', parent::tableName( $name, $quoted ) );
+ return str_replace( '"', '', parent::tableName( $name, $format ) );
}
/**
diff --git a/includes/db/DatabaseUtility.php b/includes/db/DatabaseUtility.php
index d1bced6b..0ea713c8 100644
--- a/includes/db/DatabaseUtility.php
+++ b/includes/db/DatabaseUtility.php
@@ -10,6 +10,9 @@ class DBObject {
$this->mData = $data;
}
+ /**
+ * @return bool
+ */
function isLOB() {
return false;
}
@@ -155,6 +158,9 @@ class ResultWrapper implements Iterator {
$this->currentRow = null;
}
+ /**
+ * @return int
+ */
function current() {
if ( is_null( $this->currentRow ) ) {
$this->next();
@@ -162,16 +168,25 @@ class ResultWrapper implements Iterator {
return $this->currentRow;
}
+ /**
+ * @return int
+ */
function key() {
return $this->pos;
}
+ /**
+ * @return int
+ */
function next() {
$this->pos++;
$this->currentRow = $this->fetchObject();
return $this->currentRow;
}
+ /**
+ * @return bool
+ */
function valid() {
return $this->current() !== false;
}
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
index 22a84960..dec6ae16 100644
--- a/includes/db/LBFactory.php
+++ b/includes/db/LBFactory.php
@@ -42,7 +42,6 @@ abstract class LBFactory {
/**
* Shut down, close connections and destroy the cached instance.
- *
*/
static function destroyInstance() {
if ( self::$instance ) {
@@ -64,6 +63,7 @@ abstract class LBFactory {
/**
* Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
+ * @param $conf
*/
abstract function __construct( $conf );
@@ -110,6 +110,8 @@ abstract class LBFactory {
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
* and $params passed as the subsequent parameters.
+ * @param $callback string|array
+ * @param array $params
*/
abstract function forEachLB( $callback, $params = array() );
@@ -121,6 +123,8 @@ abstract class LBFactory {
/**
* Call a method of each tracked load balancer
+ * @param $methodName string
+ * @param $args array
*/
function forEachLBCallMethod( $methodName, $args = array() ) {
$this->forEachLB( array( $this, 'callMethod' ), array( $methodName, $args ) );
@@ -128,6 +132,9 @@ abstract class LBFactory {
/**
* Private helper for forEachLBCallMethod
+ * @param $loadBalancer
+ * @param $methodName string
+ * @param $args
*/
function callMethod( $loadBalancer, $methodName, $args ) {
call_user_func_array( array( $loadBalancer, $methodName ), $args );
@@ -232,6 +239,8 @@ class LBFactory_Simple extends LBFactory {
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
* and $params passed as the subsequent parameters.
+ * @param $callback
+ * @param $params array
*/
function forEachLB( $callback, $params = array() ) {
if ( isset( $this->mainLB ) ) {
diff --git a/includes/db/LBFactory_Multi.php b/includes/db/LBFactory_Multi.php
index 61e56e78..b7977a21 100644
--- a/includes/db/LBFactory_Multi.php
+++ b/includes/db/LBFactory_Multi.php
@@ -53,13 +53,16 @@ class LBFactory_Multi extends LBFactory {
var $conf, $mainLBs = array(), $extLBs = array();
var $lastWiki, $lastSection;
+ /**
+ * @param $conf array
+ */
function __construct( $conf ) {
$this->chronProt = new ChronologyProtector;
$this->conf = $conf;
$required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
$optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer',
- 'templateOverridesByCluster', 'masterTemplateOverrides',
+ 'templateOverridesByCluster', 'masterTemplateOverrides',
'readOnlyBySection' );
foreach ( $required as $key ) {
@@ -83,6 +86,10 @@ class LBFactory_Multi extends LBFactory {
}
}
+ /**
+ * @param $wiki bool|string
+ * @return string
+ */
function getSectionForWiki( $wiki = false ) {
if ( $this->lastWiki === $wiki ) {
return $this->lastSection;
@@ -99,7 +106,7 @@ class LBFactory_Multi extends LBFactory {
}
/**
- * @param $wiki string
+ * @param $wiki bool|string
* @return LoadBalancer
*/
function newMainLB( $wiki = false ) {
@@ -116,7 +123,7 @@ class LBFactory_Multi extends LBFactory {
}
/**
- * @param $wiki
+ * @param $wiki bool|string
* @return LoadBalancer
*/
function getMainLB( $wiki = false ) {
@@ -165,6 +172,9 @@ class LBFactory_Multi extends LBFactory {
/**
* Make a new load balancer object based on template and load array
*
+ * @param $template
+ * @param $loads array
+ * @param $groupLoads
* @return LoadBalancer
*/
function newLoadBalancer( $template, $loads, $groupLoads ) {
@@ -172,7 +182,7 @@ class LBFactory_Multi extends LBFactory {
$servers = $this->makeServerArray( $template, $loads, $groupLoads );
$lb = new LoadBalancer( array(
'servers' => $servers,
- 'masterWaitTimeout' => $wgMasterWaitTimeout
+ 'masterWaitTimeout' => $wgMasterWaitTimeout
));
return $lb;
}
@@ -180,6 +190,9 @@ class LBFactory_Multi extends LBFactory {
/**
* Make a server array as expected by LoadBalancer::__construct, using a template and load array
*
+ * @param $template
+ * @param $loads array
+ * @param $groupLoads
* @return array
*/
function makeServerArray( $template, $loads, $groupLoads ) {
@@ -220,6 +233,8 @@ class LBFactory_Multi extends LBFactory {
/**
* Take a group load array indexed by group then server, and reindex it by server then group
+ * @param $groupLoads
+ * @return array
*/
function reindexGroupLoads( $groupLoads ) {
$reindexed = array();
@@ -233,6 +248,8 @@ class LBFactory_Multi extends LBFactory {
/**
* Get the database name and prefix based on the wiki ID
+ * @param $wiki bool
+ * @return array
*/
function getDBNameAndPrefix( $wiki = false ) {
if ( $wiki === false ) {
@@ -247,6 +264,8 @@ class LBFactory_Multi extends LBFactory {
* Execute a function for each tracked load balancer
* The callback is called with the load balancer as the first parameter,
* and $params passed as the subsequent parameters.
+ * @param $callback
+ * @param $params array
*/
function forEachLB( $callback, $params = array() ) {
foreach ( $this->mainLBs as $lb ) {
diff --git a/includes/db/LBFactory_Single.php b/includes/db/LBFactory_Single.php
index 89b41321..f80aa4bc 100644
--- a/includes/db/LBFactory_Single.php
+++ b/includes/db/LBFactory_Single.php
@@ -15,7 +15,7 @@ class LBFactory_Single extends LBFactory {
}
/**
- * @param $wiki
+ * @param $wiki bool|string
*
* @return LoadBalancer_Single
*/
@@ -24,7 +24,7 @@ class LBFactory_Single extends LBFactory {
}
/**
- * @param $wiki
+ * @param $wiki bool|string
*
* @return LoadBalancer_Single
*/
@@ -34,7 +34,7 @@ class LBFactory_Single extends LBFactory {
/**
* @param $cluster
- * @param $wiki
+ * @param $wiki bool|string
*
* @return LoadBalancer_Single
*/
@@ -44,7 +44,7 @@ class LBFactory_Single extends LBFactory {
/**
* @param $cluster
- * @param $wiki
+ * @param $wiki bool|string
*
* @return LoadBalancer_Single
*/
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
index c7210c4c..e96c6720 100644
--- a/includes/db/LoadBalancer.php
+++ b/includes/db/LoadBalancer.php
@@ -90,6 +90,8 @@ class LoadBalancer {
/**
* Get or set arbitrary data used by the parent object, usually an LBFactory
+ * @param $x
+ * @return \Mixed
*/
function parentInfo( $x = null ) {
return wfSetVar( $this->mParentInfo, $x );
@@ -99,7 +101,7 @@ class LoadBalancer {
* Given an array of non-normalised probabilities, this function will select
* an element and return the appropriate key
*
- * @param $weights
+ * @param $weights array
*
* @return int
*/
@@ -117,7 +119,7 @@ class LoadBalancer {
return false;
}
$max = mt_getrandmax();
- $rand = mt_rand(0, $max) / $max * $sum;
+ $rand = mt_rand( 0, $max ) / $max * $sum;
$sum = 0;
foreach ( $weights as $i => $w ) {
@@ -130,7 +132,7 @@ class LoadBalancer {
}
/**
- * @param $loads
+ * @param $loads array
* @param $wiki bool
* @return bool|int|string
*/
@@ -140,10 +142,10 @@ class LoadBalancer {
foreach ( $lags as $i => $lag ) {
if ( $i != 0 ) {
if ( $lag === false ) {
- wfDebug( "Server #$i is not replicating\n" );
+ wfDebugLog( 'replication', "Server #$i is not replicating\n" );
unset( $loads[$i] );
} elseif ( isset( $this->mServers[$i]['max lag'] ) && $lag > $this->mServers[$i]['max lag'] ) {
- wfDebug( "Server #$i is excessively lagged ($lag seconds)\n" );
+ wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)\n" );
unset( $loads[$i] );
}
}
@@ -241,6 +243,7 @@ class LoadBalancer {
$i = $this->getRandomNonLagged( $currentLoads, $wiki );
if ( $i === false && count( $currentLoads ) != 0 ) {
# All slaves lagged. Switch to read-only mode
+ 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 );
@@ -333,6 +336,8 @@ class LoadBalancer {
/**
* Wait for a specified number of microseconds, and return the period waited
+ * @param $t int
+ * @return int
*/
function sleep( $t ) {
wfProfileIn( __METHOD__ );
@@ -346,6 +351,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
*/
public function waitFor( $pos ) {
wfProfileIn( __METHOD__ );
@@ -363,6 +369,7 @@ class LoadBalancer {
/**
* Set the master wait position and wait for ALL slaves to catch up to it
+ * @param $pos int
*/
public function waitForAll( $pos ) {
wfProfileIn( __METHOD__ );
@@ -377,7 +384,8 @@ class LoadBalancer {
* Get any open connection to a given server index, local or foreign
* Returns false if there is no connection open
*
- * @return DatabaseBase
+ * @param $i int
+ * @return DatabaseBase|false
*/
function getAnyOpenConnection( $i ) {
foreach ( $this->mConns as $conns ) {
@@ -390,6 +398,9 @@ class LoadBalancer {
/**
* Wait for a given slave to catch up to the master pos stored in $this
+ * @param $index
+ * @param $open bool
+ * @return bool
*/
function doWait( $index, $open = false ) {
# Find a connection to wait on
@@ -662,12 +673,14 @@ class LoadBalancer {
* Returns a Database object whether or not the connection was successful.
* @access private
*
+ * @param $server
+ * @param $dbNameOverride bool
* @return DatabaseBase
*/
function reallyOpenConnection( $server, $dbNameOverride = false ) {
if( !is_array( $server ) ) {
throw new MWException( 'You must update your load-balancing configuration. ' .
- 'See DefaultSettings.php entry for $wgDBservers.' );
+ 'See DefaultSettings.php entry for $wgDBservers.' );
}
$host = $server['host'];
@@ -702,6 +715,10 @@ class LoadBalancer {
return $db;
}
+ /**
+ * @param $conn
+ * @throws DBConnectionError
+ */
function reportConnectionError( &$conn ) {
wfProfileIn( __METHOD__ );
@@ -719,6 +736,9 @@ class LoadBalancer {
wfProfileOut( __METHOD__ );
}
+ /**
+ * @return int
+ */
function getWriterIndex() {
return 0;
}
@@ -726,6 +746,7 @@ class LoadBalancer {
/**
* Returns true if the specified index is a valid server index
*
+ * @param $i
* @return bool
*/
function haveIndex( $i ) {
@@ -735,6 +756,7 @@ class LoadBalancer {
/**
* Returns true if the specified index is valid and has non-zero load
*
+ * @param $i
* @return bool
*/
function isNonZeroLoad( $i ) {
@@ -753,6 +775,8 @@ class LoadBalancer {
/**
* Get the host name or IP address of the server with the specified index
* Prefer a readable name if available.
+ * @param $i
+ * @return string
*/
function getServerName( $i ) {
if ( isset( $this->mServers[$i]['hostName'] ) ) {
@@ -766,6 +790,8 @@ class LoadBalancer {
/**
* Return the server info structure for a given index, or false if the index is invalid.
+ * @param $i
+ * @return bool
*/
function getServerInfo( $i ) {
if ( isset( $this->mServers[$i] ) ) {
@@ -777,6 +803,8 @@ class LoadBalancer {
/**
* Sets the server info structure for the given index. Entry at index $i is created if it doesn't exist
+ * @param $i
+ * @param $serverInfo
*/
function setServerInfo( $i, $serverInfo ) {
$this->mServers[$i] = $serverInfo;
@@ -827,8 +855,10 @@ class LoadBalancer {
* Deprecated function, typo in function name
*
* @deprecated in 1.18
+ * @param $conn
*/
function closeConnecton( $conn ) {
+ wfDeprecated( __METHOD__, '1.18' );
$this->closeConnection( $conn );
}
@@ -836,8 +866,7 @@ class LoadBalancer {
* Close a connection
* Using this function makes sure the LoadBalancer knows the connection is closed.
* If you use $conn->close() directly, the load balancer won't update its state.
- * @param $conn
- * @return void
+ * @param $conn DatabaseBase
*/
function closeConnection( $conn ) {
$done = false;
@@ -883,21 +912,32 @@ class LoadBalancer {
}
foreach ( $conns2[$masterIndex] as $conn ) {
if ( $conn->doneWrites() ) {
- $conn->commit();
+ $conn->commit( __METHOD__ );
}
}
}
}
+ /**
+ * @param $value null
+ * @return Mixed
+ */
function waitTimeout( $value = null ) {
return wfSetVar( $this->mWaitTimeout, $value );
}
+ /**
+ * @return bool
+ */
function getLaggedSlaveMode() {
return $this->mLaggedSlaveMode;
}
- /* Disables/enables lag checks */
+ /**
+ * Disables/enables lag checks
+ * @param $mode null
+ * @return bool
+ */
function allowLagged( $mode = null ) {
if ( $mode === null) {
return $this->mAllowLagged;
@@ -905,6 +945,9 @@ class LoadBalancer {
$this->mAllowLagged = $mode;
}
+ /**
+ * @return bool
+ */
function pingAll() {
$success = true;
foreach ( $this->mConns as $conns2 ) {
@@ -921,6 +964,8 @@ class LoadBalancer {
/**
* Call a function with each open connection object
+ * @param $callback
+ * @param array $params
*/
function forEachOpenConnection( $callback, $params = array() ) {
foreach ( $this->mConns as $conns2 ) {
@@ -936,7 +981,7 @@ class LoadBalancer {
/**
* Get the hostname and lag time of the most-lagged slave.
* This is useful for maintenance scripts that need to throttle their updates.
- * May attempt to open connections to slaves on the default DB. If there is
+ * May attempt to open connections to slaves on the default DB. If there is
* no lag, the maximum lag will be reported as -1.
*
* @param $wiki string Wiki ID, or false for the default database
@@ -988,22 +1033,26 @@ class LoadBalancer {
$this->mLagTimes = array( 0 => 0 );
} else {
# Send the request to the load monitor
- $this->mLagTimes = $this->getLoadMonitor()->getLagTimes(
+ $this->mLagTimes = $this->getLoadMonitor()->getLagTimes(
array_keys( $this->mServers ), $wiki );
}
return $this->mLagTimes;
}
/**
- * Get the lag in seconds for a given connection, or zero if this load
- * balancer does not have replication enabled.
+ * Get the lag in seconds for a given connection, or zero if this load
+ * balancer does not have replication enabled.
*
- * This should be used in preference to Database::getLag() in cases where
- * replication may not be in use, since there is no way to determine if
- * replication is in use at the connection level without running
+ * This should be used in preference to Database::getLag() in cases where
+ * replication may not be in use, since there is no way to determine if
+ * replication is in use at the connection level without running
* potentially restricted queries such as SHOW SLAVE STATUS. Using this
* function instead of Database::getLag() avoids a fatal error in this
* case on many installations.
+ *
+ * @param $conn DatabaseBase
+ *
+ * @return int
*/
function safeGetLag( $conn ) {
if ( $this->getServerCount() == 1 ) {
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index a6370c9e..16a0343f 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -66,12 +66,16 @@ class LoadMonitor_Null implements LoadMonitor {
function postConnectionBackoff( $conn, $threshold ) {
}
+ /**
+ * @param $serverIndexes
+ * @param $wiki
+ * @return array
+ */
function getLagTimes( $serverIndexes, $wiki ) {
return array_fill_keys( $serverIndexes, 0 );
}
}
-
/**
* Basic MySQL load monitor with no external dependencies
* Uses memcached to cache the replication lag for a short time
diff --git a/includes/debug/Debug.php b/includes/debug/Debug.php
new file mode 100644
index 00000000..de50ccac
--- /dev/null
+++ b/includes/debug/Debug.php
@@ -0,0 +1,285 @@
+<?php
+
+/**
+ * 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.
+ *
+ * @todo Profiler support
+ */
+class MWDebug {
+
+ /**
+ * Log lines
+ *
+ * @var array
+ */
+ protected static $log = array();
+
+ /**
+ * Debug messages from wfDebug()
+ *
+ * @var array
+ */
+ protected static $debug = array();
+
+ /**
+ * Queries
+ *
+ * @var array
+ */
+ protected static $query = array();
+
+ /**
+ * Is the debugger enabled?
+ *
+ * @var bool
+ */
+ protected static $enabled = false;
+
+ /**
+ * Array of functions that have already been warned, formatted
+ * function-caller to prevent a buttload of warnings
+ *
+ * @var array
+ */
+ protected static $deprecationWarnings = array();
+
+ /**
+ * Enabled the debugger and load resource module.
+ * This is called by Setup.php when $wgDebugToolbar is true.
+ */
+ public static function init() {
+ self::$enabled = true;
+ }
+
+ /**
+ * Add ResourceLoader modules to the OutputPage object if debugging is
+ * enabled.
+ *
+ * @param $out OutputPage
+ */
+ public static function addModules( OutputPage $out ) {
+ if ( self::$enabled ) {
+ $out->addModules( 'mediawiki.debug.init' );
+ }
+ }
+
+ /**
+ * Adds a line to the log
+ *
+ * @todo Add support for passing objects
+ *
+ * @param $str string
+ */
+ public static function log( $str ) {
+ if ( !self::$enabled ) {
+ return;
+ }
+
+ self::$log[] = array(
+ 'msg' => htmlspecialchars( $str ),
+ 'type' => 'log',
+ 'caller' => wfGetCaller(),
+ );
+ }
+
+ /**
+ * Returns internal log array
+ */
+ public static function getLog() {
+ return self::$log;
+ }
+
+ /**
+ * Clears internal log array and deprecation tracking
+ */
+ public static function clearLog() {
+ self::$log = array();
+ self::$deprecationWarnings = array();
+ }
+
+ /**
+ * Adds a warning entry to the log
+ *
+ * @param $msg
+ * @param int $callerOffset
+ * @return mixed
+ */
+ public static function warning( $msg, $callerOffset = 1 ) {
+ if ( !self::$enabled ) {
+ return;
+ }
+
+ // Check to see if there was already a deprecation notice, so not to
+ // get a duplicate warning
+ $logCount = count( self::$log );
+ if ( $logCount ) {
+ $lastLog = self::$log[ $logCount - 1 ];
+ if ( $lastLog['type'] == 'deprecated' && $lastLog['caller'] == wfGetCaller( $callerOffset + 1 ) ) {
+ return;
+ }
+ }
+
+ self::$log[] = array(
+ 'msg' => htmlspecialchars( $msg ),
+ 'type' => 'warn',
+ 'caller' => wfGetCaller( $callerOffset ),
+ );
+ }
+
+ /**
+ * Adds a depreciation entry to the log, along with a backtrace
+ *
+ * @param $function
+ * @param $version
+ * @param $component
+ * @return mixed
+ */
+ public static function deprecated( $function, $version, $component ) {
+ if ( !self::$enabled ) {
+ return;
+ }
+
+ // Chain: This function -> wfDeprecated -> deprecatedFunction -> caller
+ $caller = wfGetCaller( 4 );
+
+ // Check to see if there already was a warning about this function
+ $functionString = "$function-$caller";
+ if ( in_array( $functionString, self::$deprecationWarnings ) ) {
+ return;
+ }
+
+ $version = $version === false ? '(unknown version)' : $version;
+ $component = $component === false ? 'MediaWiki' : $component;
+ $msg = htmlspecialchars( "Use of function $function was deprecated in $component $version" );
+ $msg .= Html::rawElement( 'div', array( 'class' => 'mw-debug-backtrace' ),
+ Html::element( 'span', array(), 'Backtrace:' )
+ . wfBacktrace()
+ );
+
+ self::$deprecationWarnings[] = $functionString;
+ self::$log[] = array(
+ 'msg' => $msg,
+ 'type' => 'deprecated',
+ 'caller' => $caller,
+ );
+ }
+
+ /**
+ * This is a method to pass messages from wfDebug to the pretty debugger.
+ * Do NOT use this method, use MWDebug::log or wfDebug()
+ *
+ * @param $str string
+ */
+ public static function debugMsg( $str ) {
+ if ( !self::$enabled ) {
+ return;
+ }
+
+ self::$debug[] = trim( $str );
+ }
+
+ /**
+ * Begins profiling on a database query
+ *
+ * @param $sql string
+ * @param $function string
+ * @param $isMaster bool
+ * @return int ID number of the query to pass to queryTime or -1 if the
+ * debugger is disabled
+ */
+ public static function query( $sql, $function, $isMaster ) {
+ if ( !self::$enabled ) {
+ return -1;
+ }
+
+ self::$query[] = array(
+ 'sql' => $sql,
+ 'function' => $function,
+ 'master' => (bool) $isMaster,
+ 'time' => 0.0,
+ '_start' => microtime( true ),
+ );
+
+ return count( self::$query ) - 1;
+ }
+
+ /**
+ * Calculates how long a query took.
+ *
+ * @param $id int
+ */
+ public static function queryTime( $id ) {
+ if ( $id === -1 || !self::$enabled ) {
+ return;
+ }
+
+ self::$query[$id]['time'] = microtime( true ) - self::$query[$id]['_start'];
+ unset( self::$query[$id]['_start'] );
+ }
+
+ /**
+ * Returns a list of files included, along with their size
+ *
+ * @param $context IContextSource
+ * @return array
+ */
+ protected static function getFilesIncluded( IContextSource $context ) {
+ $files = get_included_files();
+ $fileList = array();
+ foreach ( $files as $file ) {
+ $size = filesize( $file );
+ $fileList[] = array(
+ 'name' => $file,
+ 'size' => $context->getLanguage()->formatSize( $size ),
+ );
+ }
+
+ return $fileList;
+ }
+
+ /**
+ * Returns the HTML to add to the page for the toolbar
+ *
+ * @param $context IContextSource
+ * @return string
+ */
+ public static function getDebugHTML( IContextSource $context ) {
+ if ( !self::$enabled ) {
+ return '';
+ }
+
+ global $wgVersion, $wgRequestTime;
+ MWDebug::log( 'MWDebug output complete' );
+ $request = $context->getRequest();
+ $debugInfo = array(
+ 'mwVersion' => $wgVersion,
+ 'phpVersion' => PHP_VERSION,
+ 'time' => microtime( true ) - $wgRequestTime,
+ 'log' => self::$log,
+ 'debugLog' => self::$debug,
+ 'queries' => self::$query,
+ 'request' => array(
+ 'method' => $_SERVER['REQUEST_METHOD'],
+ 'url' => $request->getRequestURL(),
+ 'headers' => $request->getAllHeaders(),
+ 'params' => $request->getValues(),
+ ),
+ 'memory' => $context->getLanguage()->formatSize( memory_get_usage() ),
+ 'memoryPeak' => $context->getLanguage()->formatSize( memory_get_peak_usage() ),
+ 'includes' => self::getFilesIncluded( $context ),
+ );
+
+ // Cannot use OutputPage::addJsConfigVars because those are already outputted
+ // by the time this method is called.
+ $html = Html::inlineScript(
+ ResourceLoader::makeLoaderConditionalScript(
+ ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
+ )
+ );
+
+ return $html;
+ }
+}
diff --git a/includes/diff/DairikiDiff.php b/includes/diff/DairikiDiff.php
index 8f19712b..c935eee2 100644
--- a/includes/diff/DairikiDiff.php
+++ b/includes/diff/DairikiDiff.php
@@ -24,10 +24,16 @@ class _DiffOp {
trigger_error( 'pure virtual', E_USER_ERROR );
}
+ /**
+ * @return int
+ */
function norig() {
return $this->orig ? sizeof( $this->orig ) : 0;
}
+ /**
+ * @return int
+ */
function nclosing() {
return $this->closing ? sizeof( $this->closing ) : 0;
}
@@ -49,6 +55,9 @@ class _DiffOp_Copy extends _DiffOp {
$this->closing = $closing;
}
+ /**
+ * @return _DiffOp_Copy
+ */
function reverse() {
return new _DiffOp_Copy( $this->closing, $this->orig );
}
@@ -67,6 +76,9 @@ class _DiffOp_Delete extends _DiffOp {
$this->closing = false;
}
+ /**
+ * @return _DiffOp_Add
+ */
function reverse() {
return new _DiffOp_Add( $this->orig );
}
@@ -85,6 +97,9 @@ class _DiffOp_Add extends _DiffOp {
$this->orig = false;
}
+ /**
+ * @return _DiffOp_Delete
+ */
function reverse() {
return new _DiffOp_Delete( $this->closing );
}
@@ -103,6 +118,9 @@ class _DiffOp_Change extends _DiffOp {
$this->closing = $closing;
}
+ /**
+ * @return _DiffOp_Change
+ */
function reverse() {
return new _DiffOp_Change( $this->closing, $this->orig );
}
@@ -145,6 +163,11 @@ class _DiffEngine {
protected $lcs = 0;
+ /**
+ * @param $from_lines
+ * @param $to_lines
+ * @return array
+ */
function diff ( $from_lines, $to_lines ) {
wfProfileIn( __METHOD__ );
@@ -199,6 +222,10 @@ class _DiffEngine {
return $edits;
}
+ /**
+ * @param $from_lines
+ * @param $to_lines
+ */
function diff_local ( $from_lines, $to_lines ) {
global $wgExternalDiffEngine;
wfProfileIn( __METHOD__ );
@@ -268,6 +295,8 @@ class _DiffEngine {
/**
* Returns the whole line if it's small enough, or the MD5 hash otherwise
+ * @param $line string
+ * @return string
*/
function _line_hash( $line ) {
if ( strlen( $line ) > self::MAX_XREF_LENGTH ) {
@@ -293,6 +322,12 @@ class _DiffEngine {
* of the two files do not match, and likewise that the last lines do not
* match. The caller must trim matching lines from the beginning and end
* of the portions it is going to specify.
+ * @param $xoff
+ * @param $xlim
+ * @param $yoff
+ * @param $ylim
+ * @param $nchunks
+ * @return array
*/
function _diag( $xoff, $xlim, $yoff, $ylim, $nchunks ) {
$flip = false;
@@ -373,6 +408,10 @@ class _DiffEngine {
return array( $this->lcs, $seps );
}
+ /**
+ * @param $ypos
+ * @return int
+ */
function _lcs_pos( $ypos ) {
$end = $this->lcs;
if ( $end == 0 || $ypos > $this->seq[$end] ) {
@@ -410,6 +449,10 @@ class _DiffEngine {
*
* Note that XLIM, YLIM are exclusive bounds.
* All line numbers are origin-0 and discarded lines are not counted.
+ * @param $xoff
+ * @param $xlim
+ * @param $yoff
+ * @param $ylim
*/
function _compareseq ( $xoff, $xlim, $yoff, $ylim ) {
// Slide down the bottom initial diagonal.
@@ -703,6 +746,8 @@ class Diff {
* Check a Diff for validity.
*
* This is here only for debugging purposes.
+ * @param $from_lines
+ * @param $to_lines
*/
function _check( $from_lines, $to_lines ) {
wfProfileIn( __METHOD__ );
@@ -886,6 +931,13 @@ class DiffFormatter {
return $end;
}
+ /**
+ * @param $xbeg
+ * @param $xlen
+ * @param $ybeg
+ * @param $ylen
+ * @param $edits
+ */
function _block( $xbeg, $xlen, $ybeg, $ylen, &$edits ) {
wfProfileIn( __METHOD__ );
$this->_start_block( $this->_block_header( $xbeg, $xlen, $ybeg, $ylen ) );
@@ -910,12 +962,22 @@ class DiffFormatter {
ob_start();
}
+ /**
+ * @return string
+ */
function _end_diff() {
$val = ob_get_contents();
ob_end_clean();
return $val;
}
+ /**
+ * @param $xbeg
+ * @param $xlen
+ * @param $ybeg
+ * @param $ylen
+ * @return string
+ */
function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
if ( $xlen > 1 ) {
$xbeg .= ',' . ( $xbeg + $xlen - 1 );
@@ -934,23 +996,41 @@ class DiffFormatter {
function _end_block() {
}
+ /**
+ * @param $lines
+ * @param $prefix string
+ */
function _lines( $lines, $prefix = ' ' ) {
foreach ( $lines as $line ) {
echo "$prefix $line\n";
}
}
+ /**
+ * @param $lines
+ */
function _context( $lines ) {
$this->_lines( $lines );
}
+ /**
+ * @param $lines
+ */
function _added( $lines ) {
$this->_lines( $lines, '>' );
}
+
+ /**
+ * @param $lines
+ */
function _deleted( $lines ) {
$this->_lines( $lines, '<' );
}
+ /**
+ * @param $orig
+ * @param $closing
+ */
function _changed( $orig, $closing ) {
$this->_deleted( $orig );
echo "---\n";
@@ -966,16 +1046,36 @@ class UnifiedDiffFormatter extends DiffFormatter {
var $leading_context_lines = 2;
var $trailing_context_lines = 2;
+ /**
+ * @param $lines
+ */
function _added( $lines ) {
$this->_lines( $lines, '+' );
}
+
+ /**
+ * @param $lines
+ */
function _deleted( $lines ) {
$this->_lines( $lines, '-' );
}
+
+ /**
+ * @param $orig
+ * @param $closing
+ */
function _changed( $orig, $closing ) {
$this->_deleted( $orig );
$this->_added( $closing );
}
+
+ /**
+ * @param $xbeg
+ * @param $xlen
+ * @param $ybeg
+ * @param $ylen
+ * @return string
+ */
function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
return "@@ -$xbeg,$xlen +$ybeg,$ylen @@";
}
@@ -986,6 +1086,11 @@ class UnifiedDiffFormatter extends DiffFormatter {
* @ingroup DifferenceEngine
*/
class ArrayDiffFormatter extends DiffFormatter {
+
+ /**
+ * @param $diff
+ * @return array
+ */
function format( $diff ) {
$oldline = 1;
$newline = 1;
@@ -1049,6 +1154,9 @@ class _HWLDF_WordAccumulator {
$this->_tag = '';
}
+ /**
+ * @param $new_tag
+ */
function _flushGroup( $new_tag ) {
if ( $this->_group !== '' ) {
if ( $this->_tag == 'ins' ) {
@@ -1065,6 +1173,9 @@ class _HWLDF_WordAccumulator {
$this->_tag = $new_tag;
}
+ /**
+ * @param $new_tag
+ */
function _flushLine( $new_tag ) {
$this->_flushGroup( $new_tag );
if ( $this->_line != '' ) {
@@ -1076,6 +1187,10 @@ class _HWLDF_WordAccumulator {
$this->_line = '';
}
+ /**
+ * @param $words
+ * @param $tag string
+ */
function addWords ( $words, $tag = '' ) {
if ( $tag != $this->_tag ) {
$this->_flushGroup( $tag );
@@ -1095,6 +1210,9 @@ class _HWLDF_WordAccumulator {
}
}
+ /**
+ * @return array
+ */
function getLines() {
$this->_flushLine( '~done' );
return $this->_lines;
@@ -1109,6 +1227,10 @@ class _HWLDF_WordAccumulator {
class WordLevelDiff extends MappedDiff {
const MAX_LINE_LENGTH = 10000;
+ /**
+ * @param $orig_lines
+ * @param $closing_lines
+ */
function __construct ( $orig_lines, $closing_lines ) {
wfProfileIn( __METHOD__ );
@@ -1120,6 +1242,10 @@ class WordLevelDiff extends MappedDiff {
wfProfileOut( __METHOD__ );
}
+ /**
+ * @param $lines
+ * @return array
+ */
function _split( $lines ) {
wfProfileIn( __METHOD__ );
@@ -1152,6 +1278,9 @@ class WordLevelDiff extends MappedDiff {
return array( $words, $stripped );
}
+ /**
+ * @return array
+ */
function orig() {
wfProfileIn( __METHOD__ );
$orig = new _HWLDF_WordAccumulator;
@@ -1168,6 +1297,9 @@ class WordLevelDiff extends MappedDiff {
return $lines;
}
+ /**
+ * @return array
+ */
function closing() {
wfProfileIn( __METHOD__ );
$closing = new _HWLDF_WordAccumulator;
@@ -1197,6 +1329,11 @@ class TableDiffFormatter extends DiffFormatter {
$this->trailing_context_lines = 2;
}
+ /**
+ * @static
+ * @param $msg
+ * @return mixed
+ */
public static function escapeWhiteSpace( $msg ) {
$msg = preg_replace( '/^ /m', '&#160; ', $msg );
$msg = preg_replace( '/ $/m', ' &#160;', $msg );
@@ -1204,12 +1341,22 @@ class TableDiffFormatter extends DiffFormatter {
return $msg;
}
+ /**
+ * @param $xbeg
+ * @param $xlen
+ * @param $ybeg
+ * @param $ylen
+ * @return string
+ */
function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
$r = '<tr><td colspan="2" class="diff-lineno"><!--LINE ' . $xbeg . "--></td>\n" .
'<td colspan="2" class="diff-lineno"><!--LINE ' . $ybeg . "--></td></tr>\n";
return $r;
}
+ /**
+ * @param $header
+ */
function _start_block( $header ) {
echo $header;
}
@@ -1220,21 +1367,39 @@ class TableDiffFormatter extends DiffFormatter {
function _lines( $lines, $prefix = ' ', $color = 'white' ) {
}
- # HTML-escape parameter before calling this
+ /**
+ * HTML-escape parameter before calling this
+ * @param $line
+ * @return string
+ */
function addedLine( $line ) {
return $this->wrapLine( '+', 'diff-addedline', $line );
}
- # HTML-escape parameter before calling this
+ /**
+ * HTML-escape parameter before calling this
+ * @param $line
+ * @return string
+ */
function deletedLine( $line ) {
return $this->wrapLine( '−', 'diff-deletedline', $line );
}
- # HTML-escape parameter before calling this
+ /**
+ * HTML-escape parameter before calling this
+ * @param $line
+ * @return string
+ */
function contextLine( $line ) {
return $this->wrapLine( '&#160;', 'diff-context', $line );
}
+ /**
+ * @param $marker
+ * @param $class
+ * @param $line
+ * @return string
+ */
private function wrapLine( $marker, $class, $line ) {
if ( $line !== '' ) {
// The <div> wrapper is needed for 'overflow: auto' style to scroll properly
@@ -1243,10 +1408,16 @@ class TableDiffFormatter extends DiffFormatter {
return "<td class='diff-marker'>$marker</td><td class='$class'>$line</td>";
}
+ /**
+ * @return string
+ */
function emptyLine() {
return '<td colspan="2">&#160;</td>';
}
+ /**
+ * @param $lines array
+ */
function _added( $lines ) {
foreach ( $lines as $line ) {
echo '<tr>' . $this->emptyLine() .
@@ -1255,6 +1426,9 @@ class TableDiffFormatter extends DiffFormatter {
}
}
+ /**
+ * @param $lines
+ */
function _deleted( $lines ) {
foreach ( $lines as $line ) {
echo '<tr>' . $this->deletedLine( '<del class="diffchange">' .
@@ -1263,6 +1437,9 @@ class TableDiffFormatter extends DiffFormatter {
}
}
+ /**
+ * @param $lines
+ */
function _context( $lines ) {
foreach ( $lines as $line ) {
echo '<tr>' .
@@ -1271,6 +1448,10 @@ class TableDiffFormatter extends DiffFormatter {
}
}
+ /**
+ * @param $orig
+ * @param $closing
+ */
function _changed( $orig, $closing ) {
wfProfileIn( __METHOD__ );
diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php
index 5902461b..439e3204 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -18,24 +18,25 @@ define( 'MW_DIFF_VERSION', '1.11a' );
* @todo document
* @ingroup DifferenceEngine
*/
-class DifferenceEngine {
+class DifferenceEngine extends ContextSource {
/**#@+
* @private
*/
var $mOldid, $mNewid;
- var $mOldtitle, $mNewtitle, $mPagetitle;
var $mOldtext, $mNewtext;
+ protected $mDiffLang;
/**
* @var Title
*/
- var $mOldPage, $mNewPage, $mTitle;
+ var $mOldPage, $mNewPage;
var $mRcidMarkPatrolled;
/**
* @var Revision
*/
var $mOldRev, $mNewRev;
+ private $mRevisionsIdsLoaded = false; // Have the revisions IDs been loaded
var $mRevisionsLoaded = false; // Have the revisions been loaded
var $mTextLoaded = 0; // How many text blobs have been loaded, 0, 1 or 2?
var $mCacheHit = false; // Was the diff fetched from cache?
@@ -51,49 +52,32 @@ class DifferenceEngine {
// readability and conserve space with many small diffs.
protected $mReducedLineNumbers = false;
+ // Link to action=markpatrolled
+ protected $mMarkPatrolledLink = null;
+
protected $unhide = false; # show rev_deleted content if allowed
/**#@-*/
/**
* Constructor
- * @param $titleObj Title object that the diff is associated with
+ * @param $context IContextSource context to use, anything else will be ignored
* @param $old Integer old ID we want to show and diff with.
* @param $new String either 'prev' or 'next'.
* @param $rcid Integer ??? FIXME (default 0)
* @param $refreshCache boolean If set, refreshes the diff cache
* @param $unhide boolean If set, allow viewing deleted revs
*/
- function __construct( $titleObj = null, $old = 0, $new = 0, $rcid = 0,
+ function __construct( $context = null, $old = 0, $new = 0, $rcid = 0,
$refreshCache = false, $unhide = false )
{
- if ( $titleObj ) {
- $this->mTitle = $titleObj;
- } else {
- global $wgTitle;
- $this->mTitle = $wgTitle; // @TODO: get rid of this
+ if ( $context instanceof IContextSource ) {
+ $this->setContext( $context );
}
+
wfDebug( "DifferenceEngine old '$old' new '$new' rcid '$rcid'\n" );
- if ( 'prev' === $new ) {
- # Show diff between revision $old and the previous one.
- # Get previous one from DB.
- $this->mNewid = intval( $old );
- $this->mOldid = $this->mTitle->getPreviousRevisionID( $this->mNewid );
- } elseif ( 'next' === $new ) {
- # Show diff between revision $old and the next one.
- # Get next one from DB.
- $this->mOldid = intval( $old );
- $this->mNewid = $this->mTitle->getNextRevisionID( $this->mOldid );
- if ( false === $this->mNewid ) {
- # if no result, NewId points to the newest old revision. The only newer
- # revision is cur, which is "0".
- $this->mNewid = 0;
- }
- } else {
- $this->mOldid = intval( $old );
- $this->mNewid = intval( $new );
- wfRunHooks( 'NewDifferenceEngine', array( &$titleObj, &$this->mOldid, &$this->mNewid, $old, $new ) );
- }
+ $this->mOldid = $old;
+ $this->mNewid = $new;
$this->mRcidMarkPatrolled = intval( $rcid ); # force it to be an integer
$this->mRefreshCache = $refreshCache;
$this->unhide = $unhide;
@@ -107,10 +91,14 @@ class DifferenceEngine {
}
/**
- * @return Title
+ * @return Language
*/
- function getTitle() {
- return $this->mTitle;
+ function getDiffLang() {
+ if ( $this->mDiffLang === null ) {
+ # Default language in which the diff text is written.
+ $this->mDiffLang = $this->getTitle()->getPageLanguage();
+ }
+ return $this->mDiffLang;
}
/**
@@ -124,6 +112,7 @@ class DifferenceEngine {
* @return int
*/
function getOldid() {
+ $this->loadRevisionIds();
return $this->mOldid;
}
@@ -131,6 +120,7 @@ class DifferenceEngine {
* @return Bool|int
*/
function getNewid() {
+ $this->loadRevisionIds();
return $this->mNewid;
}
@@ -142,8 +132,7 @@ class DifferenceEngine {
* @return mixed URL or false
*/
function deletedLink( $id ) {
- global $wgUser;
- if ( $wgUser->isAllowed( 'deletedhistory' ) ) {
+ if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow('archive', '*',
array( 'ar_rev_id' => $id ),
@@ -176,281 +165,214 @@ class DifferenceEngine {
}
function showDiffPage( $diffOnly = false ) {
- global $wgUser, $wgOut, $wgUseExternalEditor, $wgUseRCPatrol;
wfProfileIn( __METHOD__ );
# Allow frames except in certain special cases
- $wgOut->allowClickjacking();
-
- # If external diffs are enabled both globally and for the user,
- # we'll use the application/x-external-editor interface to call
- # an external diff tool like kompare, kdiff3, etc.
- if ( $wgUseExternalEditor && $wgUser->getOption( 'externaldiff' ) ) {
- global $wgCanonicalServer, $wgScript, $wgLang;
- $wgOut->disable();
- header ( "Content-type: application/x-external-editor; charset=UTF-8" );
- $url1 = $this->mTitle->getCanonical( array(
- 'action' => 'raw',
- 'oldid' => $this->mOldid
- ) );
- $url2 = $this->mTitle->getCanonical( array(
- 'action' => 'raw',
- 'oldid' => $this->mNewid
- ) );
- $special = $wgLang->getNsText( NS_SPECIAL );
- $control = <<<CONTROL
- [Process]
- Type=Diff text
- Engine=MediaWiki
- Script={$wgCanonicalServer}{$wgScript}
- Special namespace={$special}
-
- [File]
- Extension=wiki
- URL=$url1
-
- [File 2]
- Extension=wiki
- URL=$url2
-CONTROL;
- echo( $control );
-
- wfProfileOut( __METHOD__ );
- return;
- }
+ $out = $this->getOutput();
+ $out->allowClickjacking();
+ $out->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->setArticleFlag( false );
if ( !$this->loadRevisionData() ) {
// Sounds like a deleted revision... Let's see what we can do.
- $t = $this->mTitle->getPrefixedText();
- $d = wfMsgExt( 'missingarticle-diff', array( 'escape' ),
+ $t = $this->getTitle()->getPrefixedText();
+ $d = $this->msg( 'missingarticle-diff',
$this->deletedIdMarker( $this->mOldid ),
- $this->deletedIdMarker( $this->mNewid ) );
- $wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
- $wgOut->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", "<span class='plainlinks'>$d</span>" );
+ $this->deletedIdMarker( $this->mNewid ) )->escaped();
+ $out->setPageTitle( $this->msg( 'errorpagetitle' ) );
+ $out->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", "<span class='plainlinks'>$d</span>" );
wfProfileOut( __METHOD__ );
return;
}
- wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
-
- if ( $this->mNewRev->isCurrent() ) {
- $wgOut->setArticleFlag( true );
+ $user = $this->getUser();
+ $permErrors = $this->mNewPage->getUserPermissionsErrors( 'read', $user );
+ if ( $this->mOldPage ) { # mOldPage might not be set, see below.
+ $permErrors = wfMergeErrorArrays( $permErrors,
+ $this->mOldPage->getUserPermissionsErrors( 'read', $user ) );
}
-
- # mOldid is false if the difference engine is called with a "vague" query for
- # a diff between a version V and its previous version V' AND the version V
- # is the first version of that article. In that case, V' does not exist.
- if ( $this->mOldid === false ) {
- $this->showFirstRevision();
- $this->renderNewRevision(); // should we respect $diffOnly here or not?
+ if ( count( $permErrors ) ) {
wfProfileOut( __METHOD__ );
- return;
+ throw new PermissionsError( 'read', $permErrors );
}
- $oldTitle = $this->mOldPage->getPrefixedText();
- $newTitle = $this->mNewPage->getPrefixedText();
- if ( $oldTitle == $newTitle ) {
- $wgOut->setPageTitle( $newTitle );
- } else {
- $wgOut->setPageTitle( $oldTitle . ', ' . $newTitle );
- }
- if ( $this->mNewPage->equals( $this->mOldPage ) ) {
- $wgOut->setSubtitle( wfMsgExt( 'difference', array( 'parseinline' ) ) );
- } else {
- $wgOut->setSubtitle( wfMsgExt( 'difference-multipage', array( 'parseinline' ) ) );
- }
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
+ # If 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' ) ) {
+ $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();
- if ( !$this->mOldPage->userCanRead() || !$this->mNewPage->userCanRead() ) {
- $wgOut->loginToUse();
- $wgOut->output();
- $wgOut->disable();
wfProfileOut( __METHOD__ );
return;
}
- $sk = $wgUser->getSkin();
- if ( method_exists( $sk, 'suppressQuickbar' ) ) {
- $sk->suppressQuickbar();
+ $rollback = '';
+ $undoLink = '';
+
+ $query = array();
+ # Carry over 'diffonly' param via navigation links
+ if ( $diffOnly != $user->getBoolOption( 'diffonly' ) ) {
+ $query['diffonly'] = $diffOnly;
}
+ # Cascade unhide param in links for easy deletion browsing
+ if ( $this->unhide ) {
+ $query['unhide'] = 1;
+ }
+
+ # Check if one of the revisions is deleted/suppressed
+ $deleted = $suppressed = false;
+ $allowed = $this->mNewRev->userCan( Revision::DELETED_TEXT, $user );
- // Check if page is editable
- $editable = $this->mNewRev->getTitle()->userCan( 'edit' );
- if ( $editable && $this->mNewRev->isCurrent() && $wgUser->isAllowed( 'rollback' ) ) {
- $wgOut->preventClickjacking();
- $rollback = '&#160;&#160;&#160;' . $sk->generateRollback( $this->mNewRev );
+ # mOldRev is false if the difference engine is called with a "vague" query for
+ # a diff between a version V and its previous version V' AND the version V
+ # is the first version of that article. In that case, V' does not exist.
+ if ( $this->mOldRev === false ) {
+ $out->setPageTitle( $this->mNewPage->getPrefixedText() );
+ $out->addSubtitle( $this->msg( 'difference' ) );
+ $samePage = true;
+ $oldHeader = '';
} else {
- $rollback = '';
- }
+ wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
- // Prepare a change patrol link, if applicable
- if ( $wgUseRCPatrol && $this->mTitle->userCan( 'patrol' ) ) {
- // If we've been given an explicit change identifier, use it; saves time
- if ( $this->mRcidMarkPatrolled ) {
- $rcid = $this->mRcidMarkPatrolled;
- $rc = RecentChange::newFromId( $rcid );
- // Already patrolled?
- $rcid = is_object( $rc ) && !$rc->getAttribute( 'rc_patrolled' ) ? $rcid : 0;
+ $sk = $this->getSkin();
+ if ( method_exists( $sk, 'suppressQuickbar' ) ) {
+ $sk->suppressQuickbar();
+ }
+
+ if ( $this->mNewPage->equals( $this->mOldPage ) ) {
+ $out->setPageTitle( $this->mNewPage->getPrefixedText() );
+ $out->addSubtitle( $this->msg( 'difference' ) );
+ $samePage = true;
} 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;
+ $out->setPageTitle( $this->mOldPage->getPrefixedText() . ', ' . $this->mNewPage->getPrefixedText() );
+ $out->addSubtitle( $this->msg( 'difference-multipage' ) );
+ $samePage = false;
+ }
+
+ if ( $samePage && $this->mNewPage->userCan( 'edit', $user ) ) {
+ if ( $this->mNewRev->isCurrent() && $this->mNewPage->userCan( 'rollback', $user ) ) {
+ $out->preventClickjacking();
+ $rollback = '&#160;&#160;&#160;' . Linker::generateRollback( $this->mNewRev );
+ }
+ if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $undoLink = ' ' . $this->msg( 'parentheses' )->rawParams(
+ Html::element( 'a', array(
+ 'href' => $this->mNewPage->getLocalUrl( array(
+ 'action' => 'edit',
+ 'undoafter' => $this->mOldid,
+ 'undo' => $this->mNewid ) ),
+ 'title' => Linker::titleAttrib( 'undo' )
+ ),
+ $this->msg( 'editundo' )->text()
+ ) )->escaped();
}
}
- // Build the link
- if ( $rcid ) {
- $wgOut->preventClickjacking();
- $token = $wgUser->editToken( $rcid );
- $patrol = ' <span class="patrollink">[' . $sk->link(
- $this->mTitle,
- wfMsgHtml( 'markaspatrolleddiff' ),
- array(),
- array(
- 'action' => 'markpatrolled',
- 'rcid' => $rcid,
- 'token' => $token,
- ),
- array(
- 'known',
- 'noclasses'
- )
- ) . ']</span>';
+
+ # Make "previous revision link"
+ if ( $samePage && $this->mOldRev->getPrevious() ) {
+ $prevlink = Linker::linkKnown(
+ $this->mOldPage,
+ $this->msg( 'previousdiff' )->escaped(),
+ array( 'id' => 'differences-prevlink' ),
+ array( 'diff' => 'prev', 'oldid' => $this->mOldid ) + $query
+ );
} else {
- $patrol = '';
+ $prevlink = '&#160;';
}
- } else {
- $patrol = '';
- }
- # Carry over 'diffonly' param via navigation links
- if ( $diffOnly != $wgUser->getBoolOption( 'diffonly' ) ) {
- $query['diffonly'] = $diffOnly;
- }
+ if ( $this->mOldRev->isMinor() ) {
+ $oldminor = ChangesList::flag( 'minor' );
+ } else {
+ $oldminor = '';
+ }
- # Make "previous revision link"
- $query['diff'] = 'prev';
- $query['oldid'] = $this->mOldid;
- # Cascade unhide param in links for easy deletion browsing
- if ( $this->unhide ) {
- $query['unhide'] = 1;
- }
- if ( !$this->mOldRev->getPrevious() ) {
- $prevlink = '&#160;';
- } else {
- $prevlink = $sk->link(
- $this->mTitle,
- wfMsgHtml( 'previousdiff' ),
- array(
- 'id' => 'differences-prevlink'
- ),
- $query,
- array(
- 'known',
- 'noclasses'
- )
- );
+ $ldel = $this->revisionDeleteLink( $this->mOldRev );
+ $oldRevisionHeader = $this->getRevisionHeader( $this->mOldRev, 'complete' );
+
+ $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-otitle4">' . $prevlink . '</div>';
+
+ if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $deleted = true; // old revisions text is hidden
+ if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+ $suppressed = true; // also suppressed
+ }
+ }
+
+ # Check if this user can see the revisions
+ if ( !$this->mOldRev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ $allowed = false;
+ }
}
# Make "next revision link"
- $query['diff'] = 'next';
- $query['oldid'] = $this->mNewid;
# Skip next link on the top revision
- if ( $this->mNewRev->isCurrent() ) {
- $nextlink = '&#160;';
- } else {
- $nextlink = $sk->link(
- $this->mTitle,
- wfMsgHtml( 'nextdiff' ),
- array(
- 'id' => 'differences-nextlink'
- ),
- $query,
- array(
- 'known',
- 'noclasses'
- )
+ if ( $samePage && !$this->mNewRev->isCurrent() ) {
+ $nextlink = Linker::linkKnown(
+ $this->mNewPage,
+ $this->msg( 'nextdiff' )->escaped(),
+ array( 'id' => 'differences-nextlink' ),
+ array( 'diff' => 'next', 'oldid' => $this->mNewid ) + $query
);
+ } else {
+ $nextlink = '&#160;';
}
- $oldminor = '';
- $newminor = '';
-
- if ( $this->mOldRev->isMinor() ) {
- $oldminor = ChangesList::flag( 'minor' );
- }
if ( $this->mNewRev->isMinor() ) {
$newminor = ChangesList::flag( 'minor' );
+ } else {
+ $newminor = '';
}
# Handle RevisionDelete links...
- $ldel = $this->revisionDeleteLink( $this->mOldRev );
$rdel = $this->revisionDeleteLink( $this->mNewRev );
+ $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . $undoLink;
- $oldHeader = '<div id="mw-diff-otitle1"><strong>' . $this->mOldtitle . '</strong></div>' .
- '<div id="mw-diff-otitle2">' .
- $sk->revUserTools( $this->mOldRev, !$this->unhide ) . '</div>' .
- '<div id="mw-diff-otitle3">' . $oldminor .
- $sk->revComment( $this->mOldRev, !$diffOnly, !$this->unhide ) . $ldel . '</div>' .
- '<div id="mw-diff-otitle4">' . $prevlink . '</div>';
- $newHeader = '<div id="mw-diff-ntitle1"><strong>' . $this->mNewtitle . '</strong></div>' .
- '<div id="mw-diff-ntitle2">' . $sk->revUserTools( $this->mNewRev, !$this->unhide ) .
+ $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 .
- $sk->revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
- '<div id="mw-diff-ntitle4">' . $nextlink . $patrol . '</div>';
+ Linker::revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
+ '<div id="mw-diff-ntitle4">' . $nextlink . $this->markPatrolledLink() . '</div>';
- # Check if this user can see the revisions
- $allowed = $this->mOldRev->userCan( Revision::DELETED_TEXT )
- && $this->mNewRev->userCan( Revision::DELETED_TEXT );
- # Check if one of the revisions is deleted/suppressed
- $deleted = $suppressed = false;
- if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $deleted = true; // old revisions text is hidden
- if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) )
- $suppressed = true; // also suppressed
- }
if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
$deleted = true; // new revisions text is hidden
if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) )
$suppressed = true; // also suppressed
}
+
# If the diff cannot be shown due to a deleted revision, then output
# the diff header and links to unhide (if available)...
if ( $deleted && ( !$this->unhide || !$allowed ) ) {
$this->showDiffStyle();
$multi = $this->getMultiNotice();
- $wgOut->addHTML( $this->addHeader( '', $oldHeader, $newHeader, $multi ) );
+ $out->addHTML( $this->addHeader( '', $oldHeader, $newHeader, $multi ) );
if ( !$allowed ) {
$msg = $suppressed ? 'rev-suppressed-no-diff' : 'rev-deleted-no-diff';
# Give explanation for why revision is not visible
- $wgOut->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n",
+ $out->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n",
array( $msg ) );
} else {
# Give explanation and add a link to view the diff...
- $link = $this->mTitle->getFullUrl( array(
- 'diff' => $this->mNewid,
- 'oldid' => $this->mOldid,
- 'unhide' => 1
- ) );
+ $link = $this->getTitle()->getFullUrl( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
$msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
- $wgOut->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
+ $out->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
}
# Otherwise, output a regular diff...
} else {
@@ -458,7 +380,7 @@ CONTROL;
$notice = '';
if ( $deleted ) {
$msg = $suppressed ? 'rev-suppressed-diff-view' : 'rev-deleted-diff-view';
- $notice = "<div id='mw-$msg' class='mw-warning plainlinks'>\n" . wfMsgExt( $msg, 'parseinline' ) . "</div>\n";
+ $notice = "<div id='mw-$msg' class='mw-warning plainlinks'>\n" . $this->msg( $msg )->parse() . "</div>\n";
}
$this->showDiff( $oldHeader, $newHeader, $notice );
if ( !$diffOnly ) {
@@ -469,29 +391,79 @@ CONTROL;
}
/**
- * @param $rev Revision
+ * Get a link to mark the change as patrolled, or '' if there's either no
+ * revision to patrol or the user is not allowed to to it.
+ * Side effect: this method will call OutputPage::preventClickjacking()
+ * when a link is builded.
+ *
* @return String
*/
- protected function revisionDeleteLink( $rev ) {
- global $wgUser;
- $link = '';
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- // Show del/undel link if:
- // (a) the user can delete revisions, or
- // (b) the user can view deleted revision *and* this one is deleted
- if ( $canHide || ( $rev->getVisibility() && $wgUser->isAllowed( 'deletedhistory' ) ) ) {
- $sk = $wgUser->getSkin();
- if ( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $link = $sk->revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+ protected function markPatrolledLink() {
+ global $wgUseRCPatrol;
+
+ if ( $this->mMarkPatrolledLink === null ) {
+ // Prepare a change patrol link, if applicable
+ if ( $wgUseRCPatrol && $this->mNewPage->userCan( '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;
+ } else {
+ // Look for an unpatrolled change corresponding to this diff
+ $db = wfGetDB( DB_SLAVE );
+ $change = RecentChange::newFromConds(
+ array(
+ // Redundant user,timestamp condition so we can use the existing index
+ 'rc_user_text' => $this->mNewRev->getRawUserText(),
+ 'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+ 'rc_this_oldid' => $this->mNewid,
+ 'rc_last_oldid' => $this->mOldid,
+ 'rc_patrolled' => 0
+ ),
+ __METHOD__
+ );
+ if ( $change instanceof RecentChange ) {
+ $rcid = $change->mAttribs['rc_id'];
+ $this->mRcidMarkPatrolled = $rcid;
+ } else {
+ // None found
+ $rcid = 0;
+ }
+ }
+ // Build the link
+ if ( $rcid ) {
+ $this->getOutput()->preventClickjacking();
+ $token = $this->getUser()->getEditToken( $rcid );
+ $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
+ $this->mNewPage,
+ $this->msg( 'markaspatrolleddiff' )->escaped(),
+ array(),
+ array(
+ 'action' => 'markpatrolled',
+ 'rcid' => $rcid,
+ 'token' => $token,
+ )
+ ) . ']</span>';
+ } else {
+ $this->mMarkPatrolledLink = '';
+ }
} else {
- $query = array(
- 'type' => 'revision',
- 'target' => $rev->mTitle->getPrefixedDbkey(),
- 'ids' => $rev->getId()
- );
- $link = $sk->revDeleteLink( $query,
- $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
+ $this->mMarkPatrolledLink = '';
}
+ }
+
+ return $this->mMarkPatrolledLink;
+ }
+
+ /**
+ * @param $rev Revision
+ * @return String
+ */
+ protected function revisionDeleteLink( $rev ) {
+ $link = Linker::getRevDeleteLink( $this->getUser(), $rev, $rev->getTitle() );
+ if ( $link !== '' ) {
$link = '&#160;&#160;&#160;' . $link . ' ';
}
return $link;
@@ -501,156 +473,81 @@ CONTROL;
* Show the new revision of the page.
*/
function renderNewRevision() {
- global $wgOut, $wgUser;
wfProfileIn( __METHOD__ );
+ $out = $this->getOutput();
+ $revHeader = $this->getRevisionHeader( $this->mNewRev );
# Add "current version as of X" title
- $wgOut->addHTML( "<hr class='diff-hr' />
- <h2 class='diff-currentversion-title'>{$this->mPagetitle}</h2>\n" );
+ $out->addHTML( "<hr class='diff-hr' />
+ <h2 class='diff-currentversion-title'>{$revHeader}</h2>\n" );
# Page content may be handled by a hooked call instead...
- if ( wfRunHooks( 'ArticleContentOnDiff', array( $this, $wgOut ) ) ) {
- # Use the current version parser cache if applicable
- $pCache = true;
- if ( !$this->mNewRev->isCurrent() ) {
- $oldEditSectionSetting = $wgOut->parserOptions()->setEditSection( false );
- $pCache = false;
- }
-
+ if ( wfRunHooks( 'ArticleContentOnDiff', array( $this, $out ) ) ) {
$this->loadNewText();
- $wgOut->setRevisionId( $this->mNewRev->getId() );
+ $out->setRevisionId( $this->mNewid );
+ $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
+ $out->setArticleFlag( true );
- if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
+ 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
- if ( wfRunHooks( 'ShowRawCssJs', array( $this->mNewtext, $this->mTitle, $wgOut ) ) ) {
+ if ( wfRunHooks( 'ShowRawCssJs', array( $this->mNewtext, $this->mNewPage, $out ) ) ) {
// Wrap the whole lot in a <pre> and don't parse
$m = array();
- preg_match( '!\.(css|js)$!u', $this->mTitle->getText(), $m );
- $wgOut->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
- $wgOut->addHTML( htmlspecialchars( $this->mNewtext ) );
- $wgOut->addHTML( "\n</pre>\n" );
+ preg_match( '!\.(css|js)$!u', $this->mNewPage->getText(), $m );
+ $out->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
+ $out->addHTML( htmlspecialchars( $this->mNewtext ) );
+ $out->addHTML( "\n</pre>\n" );
}
- } elseif ( $pCache ) {
- $article = new Article( $this->mTitle, 0 );
- $pOutput = ParserCache::singleton()->get( $article, $wgOut->parserOptions() );
- if( $pOutput ) {
- $wgOut->addParserOutput( $pOutput );
+ } elseif ( !wfRunHooks( 'ArticleViewCustom', array( $this->mNewtext, $this->mNewPage, $out ) ) ) {
+ // Handled by extension
+ } else {
+ // Normal page
+ if ( $this->getTitle()->equals( $this->mNewPage ) ) {
+ // If the Title stored in the context is the same as the one
+ // of the new revision, we can use its associated WikiPage
+ // object.
+ $wikiPage = $this->getWikiPage();
} else {
- $article->doViewParse();
+ // Otherwise we need to create our own WikiPage object
+ $wikiPage = WikiPage::factory( $this->mNewPage );
}
- } else {
- $wgOut->addWikiTextTidy( $this->mNewtext );
- }
- if ( !$this->mNewRev->isCurrent() ) {
- $wgOut->parserOptions()->setEditSection( $oldEditSectionSetting );
- }
- }
- # Add redundant patrol link on bottom...
- if ( $this->mRcidMarkPatrolled && $this->mTitle->quickUserCan( 'patrol' ) ) {
- $sk = $wgUser->getSkin();
- $token = $wgUser->editToken( $this->mRcidMarkPatrolled );
- $wgOut->preventClickjacking();
- $wgOut->addHTML(
- "<div class='patrollink'>[" . $sk->link(
- $this->mTitle,
- wfMsgHtml( 'markaspatrolleddiff' ),
- array(),
- array(
- 'action' => 'markpatrolled',
- 'rcid' => $this->mRcidMarkPatrolled,
- 'token' => $token,
- )
- ) . ']</div>'
- );
- }
+ $parserOptions = ParserOptions::newFromContext( $this->getContext() );
+ $parserOptions->enableLimitReport();
+ $parserOptions->setTidy( true );
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Show the first revision of an article. Uses normal diff headers in
- * contrast to normal "old revision" display style.
- */
- function showFirstRevision() {
- global $wgOut, $wgUser;
- wfProfileIn( __METHOD__ );
-
- # Get article text from the DB
- #
- if ( ! $this->loadNewText() ) {
- $t = $this->mTitle->getPrefixedText();
- $d = wfMsgExt( 'missingarticle-diff', array( 'escape' ),
- $this->deletedIdMarker( $this->mOldid ),
- $this->deletedIdMarker( $this->mNewid ) );
- $wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
- $wgOut->addWikiMsg( 'missing-article', "<nowiki>$t</nowiki>", "<span class='plainlinks'>$d</span>" );
- wfProfileOut( __METHOD__ );
- return;
- }
- if ( $this->mNewRev->isCurrent() ) {
- $wgOut->setArticleFlag( true );
- }
-
- # Check if user is allowed to look at this page. If not, bail out.
- #
- if ( !$this->mTitle->userCanRead() ) {
- $wgOut->loginToUse();
- $wgOut->output();
- wfProfileOut( __METHOD__ );
- throw new MWException( "Permission Error: you do not have access to view this page" );
- }
+ if ( !$this->mNewRev->isCurrent() ) {
+ $parserOptions->setEditSection( false );
+ }
- # Prepare the header box
- #
- $sk = $wgUser->getSkin();
+ $parserOutput = $wikiPage->getParserOutput( $parserOptions, $this->mNewid );
- $next = $this->mTitle->getNextRevisionID( $this->mNewid );
- if ( !$next ) {
- $nextlink = '';
- } else {
- $nextlink = '<br />' . $sk->link(
- $this->mTitle,
- wfMsgHtml( 'nextdiff' ),
- array(
- 'id' => 'differences-nextlink'
- ),
- array(
- 'diff' => 'next',
- 'oldid' => $this->mNewid,
- ),
- array(
- 'known',
- 'noclasses'
- )
- );
+ # WikiPage::getParserOutput() should not return false, but just in case
+ if( $parserOutput ) {
+ $out->addParserOutput( $parserOutput );
+ }
+ }
}
- $header = "<div class=\"firstrevisionheader\" style=\"text-align: center\">" .
- $sk->revUserTools( $this->mNewRev ) . "<br />" . $sk->revComment( $this->mNewRev ) . $nextlink . "</div>\n";
-
- $wgOut->addHTML( $header );
-
- $wgOut->setSubtitle( wfMsgExt( 'difference', array( 'parseinline' ) ) );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
+ # Add redundant patrol link on bottom...
+ $out->addHTML( $this->markPatrolledLink() );
wfProfileOut( __METHOD__ );
}
/**
- * Get the diff text, send it to $wgOut
+ * Get the diff text, send it to the OutputPage object
* Returns false if the diff could not be generated, otherwise returns true
*
* @return bool
*/
function showDiff( $otitle, $ntitle, $notice = '' ) {
- global $wgOut;
$diff = $this->getDiff( $otitle, $ntitle, $notice );
if ( $diff === false ) {
- $wgOut->addWikiMsg( 'missing-article', "<nowiki>(fixme, bug)</nowiki>", '' );
+ $this->getOutput()->addWikiMsg( 'missing-article', "<nowiki>(fixme, bug)</nowiki>", '' );
return false;
} else {
$this->showDiffStyle();
- $wgOut->addHTML( $diff );
+ $this->getOutput()->addHTML( $diff );
return true;
}
}
@@ -659,8 +556,7 @@ CONTROL;
* Add style sheets and supporting JS for diff display.
*/
function showDiffStyle() {
- global $wgOut;
- $wgOut->addModuleStyles( 'mediawiki.action.history.diff' );
+ $this->getOutput()->addModuleStyles( 'mediawiki.action.history.diff' );
}
/**
@@ -694,16 +590,17 @@ CONTROL;
if ( !$this->loadRevisionData() ) {
wfProfileOut( __METHOD__ );
return false;
- } elseif ( $this->mOldRev && !$this->mOldRev->userCan( Revision::DELETED_TEXT ) ) {
+ } elseif ( $this->mOldRev && !$this->mOldRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
wfProfileOut( __METHOD__ );
return false;
- } elseif ( $this->mNewRev && !$this->mNewRev->userCan( Revision::DELETED_TEXT ) ) {
+ } elseif ( $this->mNewRev && !$this->mNewRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
wfProfileOut( __METHOD__ );
return false;
}
// Short-circuit
- if ( $this->mOldRev && $this->mNewRev
- && $this->mOldRev->getID() == $this->mNewRev->getID() )
+ // If mOldRev is false, it means that the
+ if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
+ && $this->mOldRev->getID() == $this->mNewRev->getID() ) )
{
wfProfileOut( __METHOD__ );
return '';
@@ -878,9 +775,8 @@ CONTROL;
}
function localiseLineNumbersCb( $matches ) {
- global $wgLang;
if ( $matches[1] === '1' && $this->mReducedLineNumbers ) return '';
- return wfMsgExt( 'lineno', 'escape', $wgLang->formatNum( $matches[1] ) );
+ return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
}
@@ -904,10 +800,10 @@ CONTROL;
$newRev = $this->mNewRev;
}
- $nEdits = $this->mTitle->countRevisionsBetween( $oldRev, $newRev );
+ $nEdits = $this->mNewPage->countRevisionsBetween( $oldRev, $newRev );
if ( $nEdits > 0 ) {
$limit = 100; // use diff-multi-manyusers if too many users
- $numUsers = $this->mTitle->countAuthorsBetween( $oldRev, $newRev, $limit );
+ $numUsers = $this->mNewPage->countAuthorsBetween( $oldRev, $newRev, $limit );
return self::intermediateEditsMsg( $nEdits, $numUsers, $limit );
}
return ''; // nothing
@@ -921,15 +817,63 @@ CONTROL;
* @return string
*/
public static function intermediateEditsMsg( $numEdits, $numUsers, $limit ) {
- global $wgLang;
if ( $numUsers > $limit ) {
$msg = 'diff-multi-manyusers';
$numUsers = $limit;
} else {
$msg = 'diff-multi';
}
- return wfMsgExt( $msg, 'parseinline',
- $wgLang->formatnum( $numEdits ), $wgLang->formatnum( $numUsers ) );
+ return wfMessage( $msg )->numParams( $numEdits, $numUsers )->parse();
+ }
+
+ /**
+ * Get a header for a specified revision.
+ *
+ * @param $rev Revision
+ * @param $complete String: 'complete' to get the header wrapped depending
+ * the visibility of the revision and a link to edit the page.
+ * @return String HTML fragment
+ */
+ private function getRevisionHeader( Revision $rev, $complete = '' ) {
+ $lang = $this->getLanguage();
+ $user = $this->getUser();
+ $revtimestamp = $rev->getTimestamp();
+ $timestamp = $lang->userTimeAndDate( $revtimestamp, $user );
+ $dateofrev = $lang->userDate( $revtimestamp, $user );
+ $timeofrev = $lang->userTime( $revtimestamp, $user );
+
+ $header = $this->msg(
+ $rev->isCurrent() ? 'currentrev-asof' : 'revisionasof',
+ $timestamp,
+ $dateofrev,
+ $timeofrev
+ )->escaped();
+
+ if ( $complete !== 'complete' ) {
+ return $header;
+ }
+
+ $title = $rev->getTitle();
+
+ $header = Linker::linkKnown( $title, $header, array(),
+ array( 'oldid' => $rev->getID() ) );
+
+ if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ $editQuery = array( 'action' => 'edit' );
+ if ( !$rev->isCurrent() ) {
+ $editQuery['oldid'] = $rev->getID();
+ }
+
+ $msg = $this->msg( $title->userCan( 'edit', $user ) ? 'editold' : 'viewsourceold' )->escaped();
+ $header .= ' (' . Linker::linkKnown( $title, $msg, array(), $editQuery ) . ')';
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $header = Html::rawElement( 'span', array( 'class' => 'history-deleted' ), $header );
+ }
+ } else {
+ $header = Html::rawElement( 'span', array( 'class' => 'history-deleted' ), $header );
+ }
+
+ return $header;
}
/**
@@ -938,28 +882,36 @@ CONTROL;
* @return string
*/
function addHeader( $diff, $otitle, $ntitle, $multi = '', $notice = '' ) {
- // shared.css sets diff in interface language/dir,
- // but the actual content should be in the page language/dir
- $pageLang = $this->mTitle->getPageLanguage();
- $tableClass = 'diff diff-contentalign-' . htmlspecialchars( $pageLang->alignStart() );
+ // shared.css sets diff in interface language/dir, but the actual content
+ // is often in a different language, mostly the page content language/dir
+ $tableClass = 'diff diff-contentalign-' . htmlspecialchars( $this->getDiffLang()->alignStart() );
$header = "<table class='$tableClass'>";
- if ( $diff ) { // Safari/Chrome show broken output if cols not used
+
+ if ( !$diff && !$otitle ) {
$header .= "
- <col class='diff-marker' />
- <col class='diff-content' />
- <col class='diff-marker' />
- <col class='diff-content' />";
- $colspan = 2;
- $multiColspan = 4;
+ <tr valign='top'>
+ <td class='diff-ntitle'>{$ntitle}</td>
+ </tr>";
+ $multiColspan = 1;
} else {
- $colspan = 1;
- $multiColspan = 2;
+ if ( $diff ) { // Safari/Chrome show broken output if cols not used
+ $header .= "
+ <col class='diff-marker' />
+ <col class='diff-content' />
+ <col class='diff-marker' />
+ <col class='diff-content' />";
+ $colspan = 2;
+ $multiColspan = 4;
+ } else {
+ $colspan = 1;
+ $multiColspan = 2;
+ }
+ $header .= "
+ <tr valign='top'>
+ <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
+ <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
+ </tr>";
}
- $header .= "
- <tr valign='top'>
- <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
- <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
- </tr>";
if ( $multi != '' ) {
$header .= "<tr><td colspan='{$multiColspan}' align='center' class='diff-multi'>{$multi}</td></tr>";
@@ -982,6 +934,50 @@ CONTROL;
}
/**
+ * Set the language in which the diff text is written
+ * (Defaults to page content language).
+ * @since 1.19
+ */
+ function setTextLanguage( $lang ) {
+ $this->mDiffLang = wfGetLangObj( $lang );
+ }
+
+ /**
+ * Load revision IDs
+ */
+ private function loadRevisionIds() {
+ if ( $this->mRevisionsIdsLoaded ) {
+ return;
+ }
+
+ $this->mRevisionsIdsLoaded = true;
+
+ $old = $this->mOldid;
+ $new = $this->mNewid;
+
+ if ( $new === 'prev' ) {
+ # Show diff between revision $old and the previous one.
+ # Get previous one from DB.
+ $this->mNewid = intval( $old );
+ $this->mOldid = $this->getTitle()->getPreviousRevisionID( $this->mNewid );
+ } elseif ( $new === 'next' ) {
+ # Show diff between revision $old and the next one.
+ # Get next one from DB.
+ $this->mOldid = intval( $old );
+ $this->mNewid = $this->getTitle()->getNextRevisionID( $this->mOldid );
+ if ( $this->mNewid === false ) {
+ # if no result, NewId points to the newest old revision. The only newer
+ # revision is cur, which is "0".
+ $this->mNewid = 0;
+ }
+ } else {
+ $this->mOldid = intval( $old );
+ $this->mNewid = intval( $new );
+ wfRunHooks( 'NewDifferenceEngine', array( $this->getTitle(), &$this->mOldid, &$this->mNewid, $old, $new ) );
+ }
+ }
+
+ /**
* Load revision metadata for the specified articles. If newid is 0, then compare
* the old article in oldid to the current article; if oldid is 0, then
* compare the current article to the immediately previous one (ignoring the
@@ -994,72 +990,27 @@ CONTROL;
* @return bool
*/
function loadRevisionData() {
- global $wgLang, $wgUser;
if ( $this->mRevisionsLoaded ) {
return true;
- } else {
- // Whether it succeeds or fails, we don't want to try again
- $this->mRevisionsLoaded = true;
}
+ // Whether it succeeds or fails, we don't want to try again
+ $this->mRevisionsLoaded = true;
+
+ $this->loadRevisionIds();
+
// Load the new revision object
$this->mNewRev = $this->mNewid
? Revision::newFromId( $this->mNewid )
- : Revision::newFromTitle( $this->mTitle );
+ : Revision::newFromTitle( $this->getTitle() );
+
if ( !$this->mNewRev instanceof Revision ) {
return false;
}
// Update the new revision ID in case it was 0 (makes life easier doing UI stuff)
$this->mNewid = $this->mNewRev->getId();
-
- // Check if page is editable
- $editable = $this->mNewRev->getTitle()->userCan( 'edit' );
-
- // Set assorted variables
- $timestamp = $wgLang->timeanddate( $this->mNewRev->getTimestamp(), true );
- $dateofrev = $wgLang->date( $this->mNewRev->getTimestamp(), true );
- $timeofrev = $wgLang->time( $this->mNewRev->getTimestamp(), true );
$this->mNewPage = $this->mNewRev->getTitle();
- if ( $this->mNewRev->isCurrent() ) {
- $newLink = $this->mNewPage->escapeLocalUrl( array(
- 'oldid' => $this->mNewid
- ) );
- $this->mPagetitle = htmlspecialchars( wfMsg(
- 'currentrev-asof',
- $timestamp,
- $dateofrev,
- $timeofrev
- ) );
- $newEdit = $this->mNewPage->escapeLocalUrl( array(
- 'action' => 'edit'
- ) );
-
- $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>";
- $this->mNewtitle .= " (<a href='$newEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
- } else {
- $newLink = $this->mNewPage->escapeLocalUrl( array(
- 'oldid' => $this->mNewid
- ) );
- $newEdit = $this->mNewPage->escapeLocalUrl( array(
- 'action' => 'edit',
- 'oldid' => $this->mNewid
- ) );
- $this->mPagetitle = htmlspecialchars( wfMsg(
- 'revisionasof',
- $timestamp,
- $dateofrev,
- $timeofrev
- ) );
-
- $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>";
- $this->mNewtitle .= " (<a href='$newEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
- }
- if ( !$this->mNewRev->userCan( Revision::DELETED_TEXT ) ) {
- $this->mNewtitle = "<span class='history-deleted'>{$this->mPagetitle}</span>";
- } elseif ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $this->mNewtitle = "<span class='history-deleted'>{$this->mNewtitle}</span>";
- }
// Load the old revision object
$this->mOldRev = false;
@@ -1083,38 +1034,6 @@ CONTROL;
if ( $this->mOldRev ) {
$this->mOldPage = $this->mOldRev->getTitle();
-
- $t = $wgLang->timeanddate( $this->mOldRev->getTimestamp(), true );
- $dateofrev = $wgLang->date( $this->mOldRev->getTimestamp(), true );
- $timeofrev = $wgLang->time( $this->mOldRev->getTimestamp(), true );
- $oldLink = $this->mOldPage->escapeLocalUrl( array(
- 'oldid' => $this->mOldid
- ) );
- $oldEdit = $this->mOldPage->escapeLocalUrl( array(
- 'action' => 'edit',
- 'oldid' => $this->mOldid
- ) );
- $this->mOldPagetitle = htmlspecialchars( wfMsg( 'revisionasof', $t, $dateofrev, $timeofrev ) );
-
- $this->mOldtitle = "<a href='$oldLink'>{$this->mOldPagetitle}</a>"
- . " (<a href='$oldEdit'>" . wfMsgHtml( $editable ? 'editold' : 'viewsourceold' ) . "</a>)";
- // Add an "undo" link
- if ( $editable && !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $undoLink = Html::element( 'a', array(
- 'href' => $this->mNewPage->getLocalUrl( array(
- 'action' => 'edit',
- 'undoafter' => $this->mOldid,
- 'undo' => $this->mNewid ) ),
- 'title' => $wgUser->getSkin()->titleAttrib( 'undo' )
- ), wfMsg( 'editundo' ) );
- $this->mNewtitle .= ' (' . $undoLink . ')';
- }
-
- if ( !$this->mOldRev->userCan( Revision::DELETED_TEXT ) ) {
- $this->mOldtitle = '<span class="history-deleted">' . $this->mOldPagetitle . '</span>';
- } elseif ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $this->mOldtitle = '<span class="history-deleted">' . $this->mOldtitle . '</span>';
- }
}
return true;
diff --git a/includes/diff/WikiDiff3.php b/includes/diff/WikiDiff3.php
index 27d3d5b8..66727445 100644
--- a/includes/diff/WikiDiff3.php
+++ b/includes/diff/WikiDiff3.php
@@ -546,9 +546,12 @@ class WikiDiff3 {
}
// return the middle diagonal with maximal progress.
- return $max_progress[floor( $num_progress / 2 )];
+ return $max_progress[(int)floor( $num_progress / 2 )];
}
+ /**
+ * @return mixed
+ */
public function getLcsLength() {
if ( $this->heuristicUsed && !$this->lcsLengthCorrectedForHeuristic ) {
$this->lcsLengthCorrectedForHeuristic = true;
diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php
index f516c423..0565a2e3 100644
--- a/includes/extauth/vB.php
+++ b/includes/extauth/vB.php
@@ -103,13 +103,14 @@ class ExternalUser_vB extends ExternalUser {
private function getDb() {
global $wgExternalAuthConf;
- return new Database(
- $wgExternalAuthConf['server'],
- $wgExternalAuthConf['username'],
- $wgExternalAuthConf['password'],
- $wgExternalAuthConf['dbname'],
- 0,
- $wgExternalAuthConf['tablePrefix']
+ return DatabaseBase::factory( 'mysql',
+ array(
+ 'host' => $wgExternalAuthConf['server'],
+ 'user' => $wgExternalAuthConf['username'],
+ 'password' => $wgExternalAuthConf['password'],
+ 'dbname' => $wgExternalAuthConf['dbname'],
+ 'tablePrefix' => $wgExternalAuthConf['tablePrefix'],
+ )
);
}
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
index 2610ac6e..22dbdefc 100644
--- a/includes/filerepo/FSRepo.php
+++ b/includes/filerepo/FSRepo.php
@@ -7,710 +7,50 @@
*/
/**
- * A repository for files accessible via the local filesystem. Does not support
- * database access or registration.
+ * A repository for files accessible via the local filesystem.
+ * Does not support database access or registration.
+ *
+ * This is a mostly a legacy class. New uses should not be added.
+ *
* @ingroup FileRepo
+ * @deprecated since 1.19
*/
class FSRepo extends FileRepo {
- var $directory, $deletedDir, $deletedHashLevels, $fileMode;
- var $fileFactory = array( 'UnregisteredLocalFile', 'newFromTitle' );
- var $oldFileFactory = false;
- var $pathDisclosureProtection = 'simple';
-
- function __construct( $info ) {
- parent::__construct( $info );
-
- // Required settings
- $this->directory = $info['directory'];
- $this->url = $info['url'];
-
- // Optional settings
- $this->hashLevels = isset( $info['hashLevels'] ) ? $info['hashLevels'] : 2;
- $this->deletedHashLevels = isset( $info['deletedHashLevels'] ) ?
- $info['deletedHashLevels'] : $this->hashLevels;
- $this->deletedDir = isset( $info['deletedDir'] ) ? $info['deletedDir'] : false;
- $this->fileMode = isset( $info['fileMode'] ) ? $info['fileMode'] : 0644;
- if ( isset( $info['thumbDir'] ) ) {
- $this->thumbDir = $info['thumbDir'];
- } else {
- $this->thumbDir = "{$this->directory}/thumb";
- }
- if ( isset( $info['thumbUrl'] ) ) {
- $this->thumbUrl = $info['thumbUrl'];
- } else {
- $this->thumbUrl = "{$this->url}/thumb";
- }
- }
-
- /**
- * Get the public root directory of the repository.
- */
- function getRootDirectory() {
- return $this->directory;
- }
-
- /**
- * Get the public root URL of the repository
- */
- function getRootUrl() {
- return $this->url;
- }
-
- /**
- * Returns true if the repository uses a multi-level directory structure
- */
- function isHashed() {
- return (bool)$this->hashLevels;
- }
-
- /**
- * Get the local directory corresponding to one of the three basic zones
- *
- * @param $zone string
- *
- * @return string
- */
- function getZonePath( $zone ) {
- switch ( $zone ) {
- case 'public':
- return $this->directory;
- case 'temp':
- return "{$this->directory}/temp";
- case 'deleted':
- return $this->deletedDir;
- case 'thumb':
- return $this->thumbDir;
- default:
- return false;
- }
- }
-
- /**
- * @see FileRepo::getZoneUrl()
- *
- * @param $zone string
- *
- * @return url
- */
- function getZoneUrl( $zone ) {
- switch ( $zone ) {
- case 'public':
- return $this->url;
- case 'temp':
- return "{$this->url}/temp";
- case 'deleted':
- return parent::getZoneUrl( $zone ); // no public URL
- case 'thumb':
- return $this->thumbUrl;
- default:
- return parent::getZoneUrl( $zone );
- }
- }
-
- /**
- * Get a URL referring to this repository, with the private mwrepo protocol.
- * The suffix, if supplied, is considered to be unencoded, and will be
- * URL-encoded before being returned.
- *
- * @param $suffix string
- *
- * @return string
- */
- function getVirtualUrl( $suffix = false ) {
- $path = 'mwrepo://' . $this->name;
- if ( $suffix !== false ) {
- $path .= '/' . rawurlencode( $suffix );
- }
- return $path;
- }
-
- /**
- * Get the local path corresponding to a virtual URL
- *
- * @param $url string
- *
- * @return string
- */
- function resolveVirtualUrl( $url ) {
- if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
- throw new MWException( __METHOD__.': unknown protocol' );
- }
-
- $bits = explode( '/', substr( $url, 9 ), 3 );
- if ( count( $bits ) != 3 ) {
- 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" );
- }
- $base = $this->getZonePath( $zone );
- if ( !$base ) {
- throw new MWException( __METHOD__.": invalid zone: $zone" );
- }
- return $base . '/' . rawurldecode( $rel );
- }
-
- /**
- * Store a batch of files
- *
- * @param $triplets Array: (src,zone,dest) triplets as per store()
- * @param $flags Integer: bitwise combination of the following flags:
- * self::DELETE_SOURCE Delete the source file after upload
- * self::OVERWRITE Overwrite an existing destination file instead of failing
- * self::OVERWRITE_SAME Overwrite the file if the destination exists and has the
- * same contents as the source
- */
- function storeBatch( $triplets, $flags = 0 ) {
- wfDebug( __METHOD__ . ': Storing ' . count( $triplets ) .
- " triplets; flags: {$flags}\n" );
-
- // Try creating directories
- if ( !wfMkdirParents( $this->directory ) ) {
- return $this->newFatal( 'upload_directory_missing', $this->directory );
- }
- if ( !is_writable( $this->directory ) ) {
- return $this->newFatal( 'upload_directory_read_only', $this->directory );
- }
-
- // Validate each triplet
- $status = $this->newGood();
- foreach ( $triplets as $i => $triplet ) {
- list( $srcPath, $dstZone, $dstRel ) = $triplet;
-
- // Resolve destination path
- $root = $this->getZonePath( $dstZone );
- if ( !$root ) {
- throw new MWException( "Invalid zone: $dstZone" );
- }
- if ( !$this->validateFilename( $dstRel ) ) {
- throw new MWException( 'Validation error in $dstRel' );
- }
- $dstPath = "$root/$dstRel";
- $dstDir = dirname( $dstPath );
-
- // Create destination directories for this triplet
- if ( !is_dir( $dstDir ) ) {
- if ( !wfMkdirParents( $dstDir ) ) {
- return $this->newFatal( 'directorycreateerror', $dstDir );
- }
- if ( $dstZone == 'deleted' ) {
- $this->initDeletedDir( $dstDir );
- }
- }
-
- // Resolve source
- if ( self::isVirtualUrl( $srcPath ) ) {
- $srcPath = $triplets[$i][0] = $this->resolveVirtualUrl( $srcPath );
- }
- if ( !is_file( $srcPath ) ) {
- // Make a list of files that don't exist for return to the caller
- $status->fatal( 'filenotfound', $srcPath );
- continue;
- }
-
- // Check overwriting
- if ( !( $flags & self::OVERWRITE ) && file_exists( $dstPath ) ) {
- if ( $flags & self::OVERWRITE_SAME ) {
- $hashSource = sha1_file( $srcPath );
- $hashDest = sha1_file( $dstPath );
- if ( $hashSource != $hashDest ) {
- $status->fatal( 'fileexistserror', $dstPath );
- }
- } else {
- $status->fatal( 'fileexistserror', $dstPath );
- }
- }
- }
-
- // Windows does not support moving over existing files, so explicitly delete them
- $deleteDest = wfIsWindows() && ( $flags & self::OVERWRITE );
-
- // Abort now on failure
- if ( !$status->ok ) {
- return $status;
- }
-
- // Execute the store operation for each triplet
- foreach ( $triplets as $i => $triplet ) {
- list( $srcPath, $dstZone, $dstRel ) = $triplet;
- $root = $this->getZonePath( $dstZone );
- $dstPath = "$root/$dstRel";
- $good = true;
-
- if ( $flags & self::DELETE_SOURCE ) {
- if ( $deleteDest ) {
- unlink( $dstPath );
- }
- if ( !rename( $srcPath, $dstPath ) ) {
- $status->error( 'filerenameerror', $srcPath, $dstPath );
- $good = false;
- }
- } else {
- if ( !copy( $srcPath, $dstPath ) ) {
- $status->error( 'filecopyerror', $srcPath, $dstPath );
- $good = false;
- }
- if ( !( $flags & self::SKIP_VALIDATION ) ) {
- wfSuppressWarnings();
- $hashSource = sha1_file( $srcPath );
- $hashDest = sha1_file( $dstPath );
- wfRestoreWarnings();
-
- if ( $hashDest === false || $hashSource !== $hashDest ) {
- wfDebug( __METHOD__ . ': File copy validation failed: ' .
- "$srcPath ($hashSource) to $dstPath ($hashDest)\n" );
-
- $status->error( 'filecopyerror', $srcPath, $dstPath );
- $good = false;
- }
- }
- }
- if ( $good ) {
- $this->chmod( $dstPath );
- $status->successCount++;
- } else {
- $status->failCount++;
- }
- $status->success[$i] = $good;
- }
- return $status;
- }
-
- /**
- * Deletes a batch of files. Each file can be a (zone, rel) pairs, a
- * virtual url or a real path. It will try to delete each file, but
- * ignores any errors that may occur
- *
- * @param $pairs array List of files to delete
- */
- function cleanupBatch( $files ) {
- foreach ( $files as $file ) {
- if ( is_array( $file ) ) {
- // This is a pair, extract it
- list( $zone, $rel ) = $file;
- $root = $this->getZonePath( $zone );
- $path = "$root/$rel";
- } else {
- if ( self::isVirtualUrl( $file ) ) {
- // This is a virtual url, resolve it
- $path = $this->resolveVirtualUrl( $file );
- } else {
- // This is a full file name
- $path = $file;
- }
- }
-
- wfSuppressWarnings();
- unlink( $path );
- wfRestoreWarnings();
- }
- }
-
- function append( $srcPath, $toAppendPath, $flags = 0 ) {
- $status = $this->newGood();
-
- // Resolve the virtual URL
- if ( self::isVirtualUrl( $toAppendPath ) ) {
- $toAppendPath = $this->resolveVirtualUrl( $toAppendPath );
- }
- // Make sure the files are there
- if ( !is_file( $toAppendPath ) )
- $status->fatal( 'filenotfound', $toAppendPath );
-
- if ( !is_file( $srcPath ) )
- $status->fatal( 'filenotfound', $srcPath );
-
- if ( !$status->isOk() ) return $status;
-
- // Do the append
- $chunk = file_get_contents( $srcPath );
- if( $chunk === false ) {
- $status->fatal( 'fileappenderrorread', $srcPath );
- }
-
- if( $status->isOk() ) {
- if ( file_put_contents( $toAppendPath, $chunk, FILE_APPEND ) ) {
- $status->value = $toAppendPath;
- } else {
- $status->fatal( 'fileappenderror', $srcPath, $toAppendPath);
- }
- }
-
- if ( $flags & self::DELETE_SOURCE ) {
- unlink( $srcPath );
+ function __construct( array $info ) {
+ if ( !isset( $info['backend'] ) ) {
+ // B/C settings...
+ $directory = $info['directory'];
+ $deletedDir = isset( $info['deletedDir'] )
+ ? $info['deletedDir']
+ : false;
+ $thumbDir = isset( $info['thumbDir'] )
+ ? $info['thumbDir']
+ : "{$directory}/thumb";
+ $fileMode = isset( $info['fileMode'] )
+ ? $info['fileMode']
+ : 0644;
+
+ $repoName = $info['name'];
+ // Get the FS backend configuration
+ $backend = new FSFileBackend( array(
+ 'name' => $info['name'] . '-backend',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ "{$repoName}-public" => "{$directory}",
+ "{$repoName}-temp" => "{$directory}/temp",
+ "{$repoName}-thumb" => $thumbDir,
+ "{$repoName}-deleted" => $deletedDir
+ ),
+ 'fileMode' => $fileMode,
+ ) );
+ // Update repo config to use this backend
+ $info['backend'] = $backend;
}
- return $status;
- }
-
- /* We can actually append to the files, so no-op needed here. */
- function appendFinish( $toAppendPath ) {}
-
- /**
- * Checks existence of specified array of files.
- *
- * @param $files Array: URLs of files to check
- * @param $flags Integer: bitwise combination of the following flags:
- * self::FILES_ONLY Mark file as existing only if it is a file (not directory)
- * @return Either array of files and existence flags, or false
- */
- function fileExistsBatch( $files, $flags = 0 ) {
- if ( !file_exists( $this->directory ) || !is_readable( $this->directory ) ) {
- return false;
- }
- $result = array();
- foreach ( $files as $key => $file ) {
- if ( self::isVirtualUrl( $file ) ) {
- $file = $this->resolveVirtualUrl( $file );
- }
- if( $flags & self::FILES_ONLY ) {
- $result[$key] = is_file( $file );
- } else {
- $result[$key] = file_exists( $file );
- }
- }
-
- return $result;
- }
-
- /**
- * Take all available measures to prevent web accessibility of new deleted
- * directories, in case the user has not configured offline storage
- */
- protected function initDeletedDir( $dir ) {
- // Add a .htaccess file to the root of the deleted zone
- $root = $this->getZonePath( 'deleted' );
- if ( !file_exists( "$root/.htaccess" ) ) {
- file_put_contents( "$root/.htaccess", "Deny from all\n" );
- }
- // Seed new directories with a blank index.html, to prevent crawling
- file_put_contents( "$dir/index.html", '' );
- }
-
- /**
- * Pick a random name in the temp zone and store a file to it.
- * @param $originalName String: the base name of the file as specified
- * by the user. The file extension will be maintained.
- * @param $srcPath String: the current location of the file.
- * @return FileRepoStatus object with the URL in the value.
- */
- function storeTemp( $originalName, $srcPath ) {
- $date = gmdate( "YmdHis" );
- $hashPath = $this->getHashPath( $originalName );
- $dstRel = "$hashPath$date!$originalName";
- $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
-
- $result = $this->store( $srcPath, 'temp', $dstRel );
- $result->value = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
- return $result;
- }
-
- /**
- * Remove a temporary file or mark it for garbage collection
- * @param $virtualUrl String: the virtual URL returned by storeTemp
- * @return Boolean: true on success, false on failure
- */
- function freeTemp( $virtualUrl ) {
- $temp = "mwrepo://{$this->name}/temp";
- if ( substr( $virtualUrl, 0, strlen( $temp ) ) != $temp ) {
- wfDebug( __METHOD__.": Invalid virtual URL\n" );
- return false;
- }
- $path = $this->resolveVirtualUrl( $virtualUrl );
- wfSuppressWarnings();
- $success = unlink( $path );
- wfRestoreWarnings();
- return $success;
- }
-
- /**
- * Publish a batch of files
- * @param $triplets Array: (source,dest,archive) triplets as per publish()
- * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
- * that the source files should be deleted if possible
- */
- function publishBatch( $triplets, $flags = 0 ) {
- // Perform initial checks
- if ( !wfMkdirParents( $this->directory ) ) {
- return $this->newFatal( 'upload_directory_missing', $this->directory );
- }
- if ( !is_writable( $this->directory ) ) {
- return $this->newFatal( 'upload_directory_read_only', $this->directory );
- }
- $status = $this->newGood( array() );
- foreach ( $triplets as $i => $triplet ) {
- list( $srcPath, $dstRel, $archiveRel ) = $triplet;
-
- if ( substr( $srcPath, 0, 9 ) == 'mwrepo://' ) {
- $triplets[$i][0] = $srcPath = $this->resolveVirtualUrl( $srcPath );
- }
- if ( !$this->validateFilename( $dstRel ) ) {
- throw new MWException( 'Validation error in $dstRel' );
- }
- if ( !$this->validateFilename( $archiveRel ) ) {
- throw new MWException( 'Validation error in $archiveRel' );
- }
- $dstPath = "{$this->directory}/$dstRel";
- $archivePath = "{$this->directory}/$archiveRel";
-
- $dstDir = dirname( $dstPath );
- $archiveDir = dirname( $archivePath );
- // Abort immediately on directory creation errors since they're likely to be repetitive
- if ( !is_dir( $dstDir ) && !wfMkdirParents( $dstDir ) ) {
- return $this->newFatal( 'directorycreateerror', $dstDir );
- }
- if ( !is_dir( $archiveDir ) && !wfMkdirParents( $archiveDir ) ) {
- return $this->newFatal( 'directorycreateerror', $archiveDir );
- }
- if ( !is_file( $srcPath ) ) {
- // Make a list of files that don't exist for return to the caller
- $status->fatal( 'filenotfound', $srcPath );
- }
- }
-
- if ( !$status->ok ) {
- return $status;
- }
-
- foreach ( $triplets as $i => $triplet ) {
- list( $srcPath, $dstRel, $archiveRel ) = $triplet;
- $dstPath = "{$this->directory}/$dstRel";
- $archivePath = "{$this->directory}/$archiveRel";
-
- // Archive destination file if it exists
- if( is_file( $dstPath ) ) {
- // Check if the archive file exists
- // This is a sanity check to avoid data loss. In UNIX, the rename primitive
- // unlinks the destination file if it exists. DB-based synchronisation in
- // publishBatch's caller should prevent races. In Windows there's no
- // problem because the rename primitive fails if the destination exists.
- if ( is_file( $archivePath ) ) {
- $success = false;
- } else {
- wfSuppressWarnings();
- $success = rename( $dstPath, $archivePath );
- wfRestoreWarnings();
- }
-
- if( !$success ) {
- $status->error( 'filerenameerror',$dstPath, $archivePath );
- $status->failCount++;
- continue;
- } else {
- wfDebug(__METHOD__.": moved file $dstPath to $archivePath\n");
- }
- $status->value[$i] = 'archived';
- } else {
- $status->value[$i] = 'new';
- }
-
- $good = true;
- wfSuppressWarnings();
- if ( $flags & self::DELETE_SOURCE ) {
- if ( !rename( $srcPath, $dstPath ) ) {
- $status->error( 'filerenameerror', $srcPath, $dstPath );
- $good = false;
- }
- } else {
- if ( !copy( $srcPath, $dstPath ) ) {
- $status->error( 'filecopyerror', $srcPath, $dstPath );
- $good = false;
- }
- }
- wfRestoreWarnings();
-
- if ( $good ) {
- $status->successCount++;
- wfDebug(__METHOD__.": wrote tempfile $srcPath to $dstPath\n");
- // Thread-safe override for umask
- $this->chmod( $dstPath );
- } else {
- $status->failCount++;
- }
- }
- return $status;
- }
-
- /**
- * Move a group of files to the deletion archive.
- * If no valid deletion archive is configured, this may either delete the
- * file or throw an exception, depending on the preference of the repository.
- *
- * @param $sourceDestPairs Array of source/destination pairs. Each element
- * is a two-element array containing the source file path relative to the
- * public root in the first element, and the archive file path relative
- * to the deleted zone root in the second element.
- * @return FileRepoStatus
- */
- function deleteBatch( $sourceDestPairs ) {
- $status = $this->newGood();
- if ( !$this->deletedDir ) {
- throw new MWException( __METHOD__.': no valid deletion archive directory' );
- }
-
- /**
- * Validate filenames and create archive directories
- */
- foreach ( $sourceDestPairs as $pair ) {
- list( $srcRel, $archiveRel ) = $pair;
- if ( !$this->validateFilename( $srcRel ) ) {
- throw new MWException( __METHOD__.':Validation error in $srcRel' );
- }
- if ( !$this->validateFilename( $archiveRel ) ) {
- throw new MWException( __METHOD__.':Validation error in $archiveRel' );
- }
- $archivePath = "{$this->deletedDir}/$archiveRel";
- $archiveDir = dirname( $archivePath );
- if ( !is_dir( $archiveDir ) ) {
- if ( !wfMkdirParents( $archiveDir ) ) {
- $status->fatal( 'directorycreateerror', $archiveDir );
- continue;
- }
- $this->initDeletedDir( $archiveDir );
- }
- // Check if the archive directory is writable
- // This doesn't appear to work on NTFS
- if ( !is_writable( $archiveDir ) ) {
- $status->fatal( 'filedelete-archive-read-only', $archiveDir );
- }
- }
- if ( !$status->ok ) {
- // Abort early
- return $status;
- }
-
- /**
- * Move the files
- * We're now committed to returning an OK result, which will lead to
- * the files being moved in the DB also.
- */
- foreach ( $sourceDestPairs as $pair ) {
- list( $srcRel, $archiveRel ) = $pair;
- $srcPath = "{$this->directory}/$srcRel";
- $archivePath = "{$this->deletedDir}/$archiveRel";
- $good = true;
- if ( file_exists( $archivePath ) ) {
- # A file with this content hash is already archived
- wfSuppressWarnings();
- $good = unlink( $srcPath );
- wfRestoreWarnings();
- if ( !$good ) {
- $status->error( 'filedeleteerror', $srcPath );
- }
- } else{
- wfSuppressWarnings();
- $good = rename( $srcPath, $archivePath );
- wfRestoreWarnings();
- if ( !$good ) {
- $status->error( 'filerenameerror', $srcPath, $archivePath );
- } else {
- $this->chmod( $archivePath );
- }
- }
- if ( $good ) {
- $status->successCount++;
- } else {
- $status->failCount++;
- }
- }
- return $status;
- }
-
- /**
- * Get a relative path for a deletion archive key,
- * e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
- */
- function getDeletedHashPath( $key ) {
- $path = '';
- for ( $i = 0; $i < $this->deletedHashLevels; $i++ ) {
- $path .= $key[$i] . '/';
- }
- return $path;
- }
-
- /**
- * Call a callback function for every file in the repository.
- * Uses the filesystem even in child classes.
- */
- function enumFilesInFS( $callback ) {
- $numDirs = 1 << ( $this->hashLevels * 4 );
- for ( $flatIndex = 0; $flatIndex < $numDirs; $flatIndex++ ) {
- $hexString = sprintf( "%0{$this->hashLevels}x", $flatIndex );
- $path = $this->directory;
- for ( $hexPos = 0; $hexPos < $this->hashLevels; $hexPos++ ) {
- $path .= '/' . substr( $hexString, 0, $hexPos + 1 );
- }
- if ( !file_exists( $path ) || !is_dir( $path ) ) {
- continue;
- }
- $dir = opendir( $path );
- if ($dir) {
- while ( false !== ( $name = readdir( $dir ) ) ) {
- call_user_func( $callback, $path . '/' . $name );
- }
- closedir( $dir );
- }
- }
- }
-
- /**
- * Call a callback function for every file in the repository
- * May use either the database or the filesystem
- */
- function enumFiles( $callback ) {
- $this->enumFilesInFS( $callback );
- }
-
- /**
- * Get properties of a file with a given virtual URL
- * The virtual URL must refer to this repo
- */
- function getFileProps( $virtualUrl ) {
- $path = $this->resolveVirtualUrl( $virtualUrl );
- return File::getPropsFromPath( $path );
- }
-
- /**
- * Path disclosure protection functions
- *
- * Get a callback function to use for cleaning error message parameters
- */
- function getErrorCleanupFunction() {
- switch ( $this->pathDisclosureProtection ) {
- case 'simple':
- $callback = array( $this, 'simpleClean' );
- break;
- default:
- $callback = parent::getErrorCleanupFunction();
- }
- return $callback;
- }
+ parent::__construct( $info );
- function simpleClean( $param ) {
- if ( !isset( $this->simpleCleanPairs ) ) {
- global $IP;
- $this->simpleCleanPairs = array(
- $this->directory => 'public',
- "{$this->directory}/temp" => 'temp',
- $IP => '$IP',
- dirname( __FILE__ ) => '$IP/extensions/WebStore',
- );
- if ( $this->deletedDir ) {
- $this->simpleCleanPairs[$this->deletedDir] = 'deleted';
- }
+ if ( !( $this->backend instanceof FSFileBackend ) ) {
+ throw new MWException( "FSRepo only supports FSFileBackend." );
}
- return strtr( $param, $this->simpleCleanPairs );
}
-
- /**
- * Chmod a file, supressing the warnings.
- * @param $path String: the path to change
- */
- protected function chmod( $path ) {
- wfSuppressWarnings();
- chmod( $path, $this->fileMode );
- wfRestoreWarnings();
- }
-
}
diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php
index 843f09a9..8d4f2bd9 100644
--- a/includes/filerepo/FileRepo.php
+++ b/includes/filerepo/FileRepo.php
@@ -1,5 +1,13 @@
<?php
/**
+ * @defgroup FileRepo File Repository
+ *
+ * @brief This module handles how MediaWiki interacts with filesystems.
+ *
+ * @details
+ */
+
+/**
* Base code for file repositories.
*
* @file
@@ -7,61 +15,244 @@
*/
/**
- * Base class for file repositories.
- * Do not instantiate, use a derived class.
+ * Base class for file repositories
*
* @ingroup FileRepo
*/
-abstract class FileRepo {
+class FileRepo {
const FILES_ONLY = 1;
+
const DELETE_SOURCE = 1;
const OVERWRITE = 2;
const OVERWRITE_SAME = 4;
- const SKIP_VALIDATION = 8;
+ const SKIP_LOCKING = 8;
+
+ /** @var FileBackend */
+ protected $backend;
+ /** @var Array Map of zones to config */
+ protected $zones = array();
var $thumbScriptUrl, $transformVia404;
var $descBaseUrl, $scriptDirUrl, $scriptExtension, $articleUrl;
var $fetchDescription, $initialCapital;
- var $pathDisclosureProtection = 'paranoid';
- var $descriptionCacheExpiry, $hashLevels, $url, $thumbUrl;
+ var $pathDisclosureProtection = 'simple'; // 'paranoid'
+ var $descriptionCacheExpiry, $url, $thumbUrl;
+ var $hashLevels, $deletedHashLevels;
/**
* Factory functions for creating new files
* Override these in the base class
*/
- var $fileFactory = false, $oldFileFactory = false;
+ var $fileFactory = array( 'UnregisteredLocalFile', 'newFromTitle' );
+ var $oldFileFactory = false;
var $fileFactoryKey = false, $oldFileFactoryKey = false;
- function __construct( $info ) {
+ function __construct( Array $info = null ) {
+ // Verify required settings presence
+ if(
+ $info === null
+ || !array_key_exists( 'name', $info )
+ || !array_key_exists( 'backend', $info )
+ ) {
+ throw new MWException( __CLASS__ . " requires an array of options having both 'name' and 'backend' keys.\n" );
+ }
+
// Required settings
$this->name = $info['name'];
+ if ( $info['backend'] instanceof FileBackend ) {
+ $this->backend = $info['backend']; // useful for testing
+ } else {
+ $this->backend = FileBackendGroup::singleton()->get( $info['backend'] );
+ }
- // Optional settings
- $this->initialCapital = MWNamespace::isCapitalized( NS_FILE );
- foreach ( array( 'descBaseUrl', 'scriptDirUrl', 'articleUrl', 'fetchDescription',
- 'thumbScriptUrl', 'initialCapital', 'pathDisclosureProtection',
- 'descriptionCacheExpiry', 'hashLevels', 'url', 'thumbUrl', 'scriptExtension' )
- as $var )
- {
+ // Optional settings that can have no value
+ $optionalSettings = array(
+ 'descBaseUrl', 'scriptDirUrl', 'articleUrl', 'fetchDescription',
+ 'thumbScriptUrl', 'pathDisclosureProtection', 'descriptionCacheExpiry',
+ 'scriptExtension'
+ );
+ foreach ( $optionalSettings as $var ) {
if ( isset( $info[$var] ) ) {
$this->$var = $info[$var];
}
}
+
+ // Optional settings that have a default
+ $this->initialCapital = isset( $info['initialCapital'] )
+ ? $info['initialCapital']
+ : MWNamespace::isCapitalized( NS_FILE );
+ $this->url = isset( $info['url'] )
+ ? $info['url']
+ : false; // a subclass may set the URL (e.g. ForeignAPIRepo)
+ if ( isset( $info['thumbUrl'] ) ) {
+ $this->thumbUrl = $info['thumbUrl'];
+ } else {
+ $this->thumbUrl = $this->url ? "{$this->url}/thumb" : false;
+ }
+ $this->hashLevels = isset( $info['hashLevels'] )
+ ? $info['hashLevels']
+ : 2;
+ $this->deletedHashLevels = isset( $info['deletedHashLevels'] )
+ ? $info['deletedHashLevels']
+ : $this->hashLevels;
$this->transformVia404 = !empty( $info['transformVia404'] );
+ $this->zones = isset( $info['zones'] )
+ ? $info['zones']
+ : array();
+ // Give defaults for the basic zones...
+ foreach ( array( 'public', 'thumb', 'temp', 'deleted' ) as $zone ) {
+ if ( !isset( $this->zones[$zone] ) ) {
+ $this->zones[$zone] = array(
+ 'container' => "{$this->name}-{$zone}",
+ 'directory' => '' // container root
+ );
+ }
+ }
+ }
+
+ /**
+ * Get the file backend instance
+ *
+ * @return FileBackend
+ */
+ public function getBackend() {
+ return $this->backend;
+ }
+
+ /**
+ * Prepare a single zone or list of zones for usage.
+ * See initDeletedDir() for additional setup needed for the 'deleted' zone.
+ *
+ * @param $doZones Array Only do a particular zones
+ * @return Status
+ */
+ protected function initZones( $doZones = array() ) {
+ $status = $this->newGood();
+ foreach ( (array)$doZones as $zone ) {
+ $root = $this->getZonePath( $zone );
+ if ( $root === null ) {
+ throw new MWException( "No '$zone' zone defined in the {$this->name} repo." );
+ }
+ }
+ return $status;
+ }
+
+ /**
+ * Take all available measures to prevent web accessibility of new deleted
+ * directories, in case the user has not configured offline storage
+ *
+ * @param $dir string
+ * @return void
+ */
+ protected function initDeletedDir( $dir ) {
+ $this->backend->secure( // prevent web access & dir listings
+ array( 'dir' => $dir, 'noAccess' => true, 'noListing' => true ) );
}
/**
* Determine if a string is an mwrepo:// URL
*
* @param $url string
- *
* @return bool
*/
- static function isVirtualUrl( $url ) {
+ public static function isVirtualUrl( $url ) {
return substr( $url, 0, 9 ) == 'mwrepo://';
}
/**
+ * Get a URL referring to this repository, with the private mwrepo protocol.
+ * The suffix, if supplied, is considered to be unencoded, and will be
+ * URL-encoded before being returned.
+ *
+ * @param $suffix string
+ * @return string
+ */
+ public function getVirtualUrl( $suffix = false ) {
+ $path = 'mwrepo://' . $this->name;
+ if ( $suffix !== false ) {
+ $path .= '/' . rawurlencode( $suffix );
+ }
+ return $path;
+ }
+
+ /**
+ * Get the URL corresponding to one of the four basic zones
+ *
+ * @param $zone String: one of: public, deleted, temp, thumb
+ * @return String or false
+ */
+ public function getZoneUrl( $zone ) {
+ switch ( $zone ) {
+ case 'public':
+ return $this->url;
+ case 'temp':
+ return "{$this->url}/temp";
+ case 'deleted':
+ return false; // no public URL
+ case 'thumb':
+ return $this->thumbUrl;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Get the backend storage path corresponding to a virtual URL
+ *
+ * @param $url string
+ * @return string
+ */
+ function resolveVirtualUrl( $url ) {
+ if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
+ throw new MWException( __METHOD__.': unknown protocol' );
+ }
+ $bits = explode( '/', substr( $url, 9 ), 3 );
+ if ( count( $bits ) != 3 ) {
+ 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" );
+ }
+ $base = $this->getZonePath( $zone );
+ if ( !$base ) {
+ throw new MWException( __METHOD__.": invalid zone: $zone" );
+ }
+ return $base . '/' . rawurldecode( $rel );
+ }
+
+ /**
+ * The the storage container and base path of a zone
+ *
+ * @param $zone string
+ * @return Array (container, base path) or (null, null)
+ */
+ protected function getZoneLocation( $zone ) {
+ if ( !isset( $this->zones[$zone] ) ) {
+ return array( null, null ); // bogus
+ }
+ return array( $this->zones[$zone]['container'], $this->zones[$zone]['directory'] );
+ }
+
+ /**
+ * Get the storage path corresponding to one of the zones
+ *
+ * @param $zone string
+ * @return string|null
+ */
+ public function getZonePath( $zone ) {
+ list( $container, $base ) = $this->getZoneLocation( $zone );
+ if ( $container === null || $base === null ) {
+ return null;
+ }
+ $backendName = $this->backend->getName();
+ if ( $base != '' ) { // may not be set
+ $base = "/{$base}";
+ }
+ return "mwstore://$backendName/{$container}{$base}";
+ }
+
+ /**
* Create a new File object from the local repository
*
* @param $title Mixed: Title object or string
@@ -70,15 +261,12 @@ abstract class FileRepo {
* instance of the repository's old file class instead of a
* current file. Repositories not supporting version control
* should return false if this parameter is set.
- *
- * @return File
+ * @return File|null A File, or null if passed an invalid Title
*/
- function newFile( $title, $time = false ) {
- if ( !( $title instanceof Title ) ) {
- $title = Title::makeTitleSafe( NS_FILE, $title );
- if ( !is_object( $title ) ) {
- return null;
- }
+ public function newFile( $title, $time = false ) {
+ $title = File::normalizeTitle( $title );
+ if ( !$title ) {
+ return null;
}
if ( $time ) {
if ( $this->oldFileFactory ) {
@@ -107,17 +295,14 @@ abstract class FileRepo {
* private: If true, return restricted (deleted) files if the current
* user is allowed to view them. Otherwise, such files will not
* be found.
- *
* @return File|false
*/
- function findFile( $title, $options = array() ) {
- $time = isset( $options['time'] ) ? $options['time'] : false;
- if ( !($title instanceof Title) ) {
- $title = Title::makeTitleSafe( NS_FILE, $title );
- if ( !is_object( $title ) ) {
- return false;
- }
+ public function findFile( $title, $options = array() ) {
+ $title = File::normalizeTitle( $title );
+ if ( !$title ) {
+ return false;
}
+ $time = isset( $options['time'] ) ? $options['time'] : false;
# First try the current version of the file to see if it precedes the timestamp
$img = $this->newFile( $title );
if ( !$img ) {
@@ -143,12 +328,12 @@ abstract 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 ) {
+ if ( !$img ) {
return false;
}
- if( $img->exists() ) {
+ if ( $img->exists() ) {
$img->redirectedFrom( $title->getDBkey() );
return $img;
}
@@ -158,14 +343,16 @@ abstract class FileRepo {
/**
* Find many files at once.
+ *
* @param $items An array of titles, or an array of findFile() options with
* the "title" option giving the title. Example:
*
* $findItem = array( 'title' => $title, 'private' => true );
* $findBatch = array( $findItem );
* $repo->findFiles( $findBatch );
+ * @return array
*/
- function findFiles( $items ) {
+ public function findFiles( $items ) {
$result = array();
foreach ( $items as $item ) {
if ( is_array( $item ) ) {
@@ -191,8 +378,9 @@ abstract class FileRepo {
*
* @param $sha1 String base 36 SHA-1 hash
* @param $options Option array, same as findFile().
+ * @return File|false
*/
- function findFileFromKey( $sha1, $options = array() ) {
+ public function findFileFromKey( $sha1, $options = array() ) {
$time = isset( $options['time'] ) ? $options['time'] : false;
# First try to find a matching current version of a file...
@@ -219,35 +407,59 @@ abstract class FileRepo {
}
/**
- * Get the URL of thumb.php
+ * Get an array or iterator of file objects for files that have a given
+ * SHA-1 content hash.
+ *
+ * STUB
*/
- function getThumbScriptUrl() {
- return $this->thumbScriptUrl;
+ public function findBySha1( $hash ) {
+ return array();
}
/**
- * Get the URL corresponding to one of the four basic zones
- * @param $zone String: one of: public, deleted, temp, thumb
- * @return String or false
+ * Get the public root URL of the repository
+ *
+ * @return string|false
*/
- function getZoneUrl( $zone ) {
- return false;
+ public function getRootUrl() {
+ return $this->url;
+ }
+
+ /**
+ * Returns true if the repository uses a multi-level directory structure
+ *
+ * @return string
+ */
+ public function isHashed() {
+ return (bool)$this->hashLevels;
+ }
+
+ /**
+ * Get the URL of thumb.php
+ *
+ * @return string
+ */
+ public function getThumbScriptUrl() {
+ return $this->thumbScriptUrl;
}
/**
* Returns true if the repository can transform files via a 404 handler
+ *
+ * @return bool
*/
- function canTransformVia404() {
+ public function canTransformVia404() {
return $this->transformVia404;
}
/**
* Get the name of an image from its title object
+ *
* @param $title Title
*/
- function getNameFromTitle( $title ) {
+ public function getNameFromTitle( Title $title ) {
+ global $wgContLang;
if ( $this->initialCapital != MWNamespace::isCapitalized( NS_FILE ) ) {
- global $wgContLang;
$name = $title->getUserCaseDBKey();
if ( $this->initialCapital ) {
$name = $wgContLang->ucfirst( $name );
@@ -258,6 +470,31 @@ abstract class FileRepo {
return $name;
}
+ /**
+ * Get the public zone root storage directory of the repository
+ *
+ * @return string
+ */
+ public function getRootDirectory() {
+ return $this->getZonePath( 'public' );
+ }
+
+ /**
+ * Get a relative path including trailing slash, e.g. f/fa/
+ * If the repo is not hashed, returns an empty string
+ *
+ * @param $name string
+ * @return string
+ */
+ public function getHashPath( $name ) {
+ return self::getHashPathForLevel( $name, $this->hashLevels );
+ }
+
+ /**
+ * @param $name
+ * @param $levels
+ * @return string
+ */
static function getHashPathForLevel( $name, $levels ) {
if ( $levels == 0 ) {
return '';
@@ -272,17 +509,20 @@ abstract class FileRepo {
}
/**
- * Get a relative path including trailing slash, e.g. f/fa/
- * If the repo is not hashed, returns an empty string
+ * Get the number of hash directory levels
+ *
+ * @return integer
*/
- function getHashPath( $name ) {
- return self::getHashPathForLevel( $name, $this->hashLevels );
+ public function getHashLevels() {
+ return $this->hashLevels;
}
/**
* Get the name of this repository, as specified by $info['name]' to the constructor
+ *
+ * @return string
*/
- function getName() {
+ public function getName() {
return $this->name;
}
@@ -291,11 +531,14 @@ abstract class FileRepo {
*
* @param $query mixed Query string to append
* @param $entry string Entry point; defaults to index
- * @return string
+ * @return string|false
*/
- function makeUrl( $query = '', $entry = 'index' ) {
- $ext = isset( $this->scriptExtension ) ? $this->scriptExtension : '.php';
- return wfAppendQuery( "{$this->scriptDirUrl}/{$entry}{$ext}", $query );
+ public function makeUrl( $query = '', $entry = 'index' ) {
+ if ( isset( $this->scriptDirUrl ) ) {
+ $ext = isset( $this->scriptExtension ) ? $this->scriptExtension : '.php';
+ return wfAppendQuery( "{$this->scriptDirUrl}/{$entry}{$ext}", $query );
+ }
+ return false;
}
/**
@@ -306,8 +549,11 @@ abstract class FileRepo {
*
* In particular, it uses the article paths as specified to the repository
* constructor, whereas local repositories use the local Title functions.
+ *
+ * @param $name string
+ * @return string
*/
- function getDescriptionUrl( $name ) {
+ public function getDescriptionUrl( $name ) {
$encName = wfUrlencode( $name );
if ( !is_null( $this->descBaseUrl ) ) {
# "http://example.com/wiki/Image:"
@@ -337,10 +583,12 @@ abstract class FileRepo {
* MediaWiki this means action=render. This should only be called by the
* repository's file class, since it may return invalid results. User code
* should use File::getDescriptionText().
+ *
* @param $name String: name of image to fetch
* @param $lang String: language to fetch it in, if any.
+ * @return string
*/
- function getDescriptionRenderUrl( $name, $lang = null ) {
+ public function getDescriptionRenderUrl( $name, $lang = null ) {
$query = 'action=render';
if ( !is_null( $lang ) ) {
$query .= '&uselang=' . $lang;
@@ -362,19 +610,21 @@ abstract class FileRepo {
/**
* Get the URL of the stylesheet to apply to description pages
- * @return string
+ *
+ * @return string|false
*/
- function getDescriptionStylesheetUrl() {
- if ( $this->scriptDirUrl ) {
+ public function getDescriptionStylesheetUrl() {
+ if ( isset( $this->scriptDirUrl ) ) {
return $this->makeUrl( 'title=MediaWiki:Filepage.css&' .
wfArrayToCGI( Skin::getDynamicStylesheetQuery() ) );
}
+ return false;
}
/**
* Store a file to a given destination.
*
- * @param $srcPath String: source path or virtual URL
+ * @param $srcPath String: source FS path, storage path, or virtual URL
* @param $dstZone String: destination zone
* @param $dstRel String: destination relative path
* @param $flags Integer: bitwise combination of the following flags:
@@ -382,9 +632,10 @@ abstract class FileRepo {
* self::OVERWRITE Overwrite an existing destination file instead of failing
* self::OVERWRITE_SAME Overwrite the file if the destination exists and has the
* same contents as the source
+ * self::SKIP_LOCKING Skip any file locking when doing the store
* @return FileRepoStatus
*/
- function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
+ public function store( $srcPath, $dstZone, $dstRel, $flags = 0 ) {
$status = $this->storeBatch( array( array( $srcPath, $dstZone, $dstRel ) ), $flags );
if ( $status->successCount == 0 ) {
$status->ok = false;
@@ -395,65 +646,236 @@ abstract class FileRepo {
/**
* Store a batch of files
*
- * @param $triplets Array: (src,zone,dest) triplets as per store()
- * @param $flags Integer: flags as per store
+ * @param $triplets Array: (src, dest zone, dest rel) triplets as per store()
+ * @param $flags Integer: bitwise combination of the following flags:
+ * self::DELETE_SOURCE Delete the source file after upload
+ * self::OVERWRITE Overwrite an existing destination file instead of failing
+ * self::OVERWRITE_SAME Overwrite the file if the destination exists and has the
+ * same contents as the source
+ * self::SKIP_LOCKING Skip any file locking when doing the store
+ * @return FileRepoStatus
*/
- abstract function storeBatch( $triplets, $flags = 0 );
+ public function storeBatch( $triplets, $flags = 0 ) {
+ $backend = $this->backend; // convenience
+
+ $status = $this->newGood();
+
+ $operations = array();
+ $sourceFSFilesToDelete = array(); // cleanup for disk source files
+ // Validate each triplet and get the store operation...
+ foreach ( $triplets as $triplet ) {
+ list( $srcPath, $dstZone, $dstRel ) = $triplet;
+ wfDebug( __METHOD__
+ . "( \$src='$srcPath', \$dstZone='$dstZone', \$dstRel='$dstRel' )\n"
+ );
+
+ // Resolve destination path
+ $root = $this->getZonePath( $dstZone );
+ if ( !$root ) {
+ throw new MWException( "Invalid zone: $dstZone" );
+ }
+ if ( !$this->validateFilename( $dstRel ) ) {
+ throw new MWException( 'Validation error in $dstRel' );
+ }
+ $dstPath = "$root/$dstRel";
+ $dstDir = dirname( $dstPath );
+ // Create destination directories for this triplet
+ if ( !$backend->prepare( array( 'dir' => $dstDir ) )->isOK() ) {
+ return $this->newFatal( 'directorycreateerror', $dstDir );
+ }
+
+ if ( $dstZone == 'deleted' ) {
+ $this->initDeletedDir( $dstDir );
+ }
+
+ // Resolve source to a storage path if virtual
+ if ( self::isVirtualUrl( $srcPath ) ) {
+ $srcPath = $this->resolveVirtualUrl( $srcPath );
+ }
+
+ // Get the appropriate file operation
+ if ( FileBackend::isStoragePath( $srcPath ) ) {
+ $opName = ( $flags & self::DELETE_SOURCE ) ? 'move' : 'copy';
+ } else {
+ $opName = 'store';
+ if ( $flags & self::DELETE_SOURCE ) {
+ $sourceFSFilesToDelete[] = $srcPath;
+ }
+ }
+ $operations[] = array(
+ 'op' => $opName,
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
+ 'overwrite' => $flags & self::OVERWRITE,
+ 'overwriteSame' => $flags & self::OVERWRITE_SAME,
+ );
+ }
+
+ // Execute the store operation for each triplet
+ $opts = array( 'force' => true );
+ if ( $flags & self::SKIP_LOCKING ) {
+ $opts['nonLocking'] = true;
+ }
+ $status->merge( $backend->doOperations( $operations, $opts ) );
+ // Cleanup for disk source files...
+ foreach ( $sourceFSFilesToDelete as $file ) {
+ wfSuppressWarnings();
+ unlink( $file ); // FS cleanup
+ wfRestoreWarnings();
+ }
+
+ return $status;
+ }
+
+ /**
+ * Deletes a batch of files.
+ * Each file can be a (zone, rel) pair, virtual url, storage path, or FS path.
+ * It will try to delete each file, but ignores any errors that may occur.
+ *
+ * @param $pairs array List of files to delete
+ * @param $flags Integer: bitwise combination of the following flags:
+ * self::SKIP_LOCKING Skip any file locking when doing the deletions
+ * @return void
+ */
+ public function cleanupBatch( $files, $flags = 0 ) {
+ $operations = array();
+ $sourceFSFilesToDelete = array(); // cleanup for disk source files
+ foreach ( $files as $file ) {
+ if ( is_array( $file ) ) {
+ // This is a pair, extract it
+ list( $zone, $rel ) = $file;
+ $root = $this->getZonePath( $zone );
+ $path = "$root/$rel";
+ } else {
+ if ( self::isVirtualUrl( $file ) ) {
+ // This is a virtual url, resolve it
+ $path = $this->resolveVirtualUrl( $file );
+ } else {
+ // This is a full file name
+ $path = $file;
+ }
+ }
+ // Get a file operation if needed
+ if ( FileBackend::isStoragePath( $path ) ) {
+ $operations[] = array(
+ 'op' => 'delete',
+ 'src' => $path,
+ );
+ } else {
+ $sourceFSFilesToDelete[] = $path;
+ }
+ }
+ // Actually delete files from storage...
+ $opts = array( 'force' => true );
+ if ( $flags & self::SKIP_LOCKING ) {
+ $opts['nonLocking'] = true;
+ }
+ $this->backend->doOperations( $operations, $opts );
+ // Cleanup for disk source files...
+ foreach ( $sourceFSFilesToDelete as $file ) {
+ wfSuppressWarnings();
+ unlink( $file ); // FS cleanup
+ wfRestoreWarnings();
+ }
+ }
/**
* Pick a random name in the temp zone and store a file to it.
- * Returns a FileRepoStatus object with the URL in the value.
+ * Returns a FileRepoStatus object with the file Virtual URL in the value,
+ * file can later be disposed using FileRepo::freeTemp().
+ *
*
* @param $originalName String: the base name of the file as specified
* by the user. The file extension will be maintained.
* @param $srcPath String: the current location of the file.
+ * @return FileRepoStatus object with the URL in the value.
*/
- abstract function storeTemp( $originalName, $srcPath );
+ public function storeTemp( $originalName, $srcPath ) {
+ $date = gmdate( "YmdHis" );
+ $hashPath = $this->getHashPath( $originalName );
+ $dstRel = "{$hashPath}{$date}!{$originalName}";
+ $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
+ $result = $this->store( $srcPath, 'temp', $dstRel, self::SKIP_LOCKING );
+ $result->value = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
+ return $result;
+ }
/**
- * Append the contents of the source path to the given file, OR queue
- * the appending operation in anticipation of a later appendFinish() call.
- * @param $srcPath String: location of the source file
- * @param $toAppendPath String: path to append to.
- * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
- * that the source file should be deleted if possible
- * @return mixed Status or false
+ * Concatenate a list of files into a target file location.
+ *
+ * @param $srcPaths Array Ordered list of source virtual URLs/storage paths
+ * @param $dstPath String Target file system path
+ * @param $flags Integer: bitwise combination of the following flags:
+ * self::DELETE_SOURCE Delete the source files
+ * @return FileRepoStatus
*/
- abstract function append( $srcPath, $toAppendPath, $flags = 0 );
+ function concatenate( $srcPaths, $dstPath, $flags = 0 ) {
+ $status = $this->newGood();
- /**
- * Finish the append operation.
- * @param $toAppendPath String: path to append to.
- * @return mixed Status or false
- */
- abstract function appendFinish( $toAppendPath );
+ $sources = array();
+ $deleteOperations = array(); // post-concatenate ops
+ foreach ( $srcPaths as $srcPath ) {
+ // Resolve source to a storage path if virtual
+ $source = $this->resolveToStoragePath( $srcPath );
+ $sources[] = $source; // chunk to merge
+ if ( $flags & self::DELETE_SOURCE ) {
+ $deleteOperations[] = array( 'op' => 'delete', 'src' => $source );
+ }
+ }
+
+ // Concatenate the chunks into one FS file
+ $params = array( 'srcs' => $sources, 'dst' => $dstPath );
+ $status->merge( $this->backend->concatenate( $params ) );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ // Delete the sources if required
+ if ( $deleteOperations ) {
+ $opts = array( 'force' => true );
+ $status->merge( $this->backend->doOperations( $deleteOperations, $opts ) );
+ }
+
+ // Make sure status is OK, despite any $deleteOperations fatals
+ $status->setResult( true );
+
+ return $status;
+ }
/**
* Remove a temporary file or mark it for garbage collection
- * @param $virtualUrl String: the virtual URL returned by storeTemp
+ *
+ * @param $virtualUrl String: the virtual URL returned by FileRepo::storeTemp()
* @return Boolean: true on success, false on failure
- * STUB
*/
- function freeTemp( $virtualUrl ) {
- return true;
+ public function freeTemp( $virtualUrl ) {
+ $temp = "mwrepo://{$this->name}/temp";
+ if ( substr( $virtualUrl, 0, strlen( $temp ) ) != $temp ) {
+ wfDebug( __METHOD__.": Invalid temp virtual URL\n" );
+ return false;
+ }
+ $path = $this->resolveVirtualUrl( $virtualUrl );
+ $op = array( 'op' => 'delete', 'src' => $path );
+ $status = $this->backend->doOperation( $op );
+ return $status->isOK();
}
/**
- * Copy or move a file either from the local filesystem or from an mwrepo://
- * virtual URL, into this repository at the specified destination location.
+ * Copy or move a file either from a storage path, virtual URL,
+ * or FS path, into this repository at the specified destination location.
*
* Returns a FileRepoStatus object. On success, the value contains "new" or
* "archived", to indicate whether the file was new with that name.
*
- * @param $srcPath String: the source path or URL
+ * @param $srcPath String: the source FS path, storage path, or URL
* @param $dstRel String: the destination relative path
- * @param $archiveRel String: rhe relative path where the existing file is to
+ * @param $archiveRel String: the relative path where the existing file is to
* be archived, if there is one. Relative to the public zone root.
* @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source file should be deleted if possible
*/
- function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
+ public function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
$status = $this->publishBatch( array( array( $srcPath, $dstRel, $archiveRel ) ), $flags );
if ( $status->successCount == 0 ) {
$status->ok = false;
@@ -468,13 +890,123 @@ abstract class FileRepo {
/**
* Publish a batch of files
- * @param $triplets Array: (source,dest,archive) triplets as per publish()
+ *
+ * @param $triplets Array: (source, dest, archive) triplets as per publish()
* @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source files should be deleted if possible
+ * @return FileRepoStatus
*/
- abstract function publishBatch( $triplets, $flags = 0 );
+ public function publishBatch( $triplets, $flags = 0 ) {
+ $backend = $this->backend; // convenience
+
+ // Try creating directories
+ $status = $this->initZones( 'public' );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ $status = $this->newGood( array() );
+
+ $operations = array();
+ $sourceFSFilesToDelete = array(); // cleanup for disk source files
+ // Validate each triplet and get the store operation...
+ foreach ( $triplets as $i => $triplet ) {
+ list( $srcPath, $dstRel, $archiveRel ) = $triplet;
+ // Resolve source to a storage path if virtual
+ if ( substr( $srcPath, 0, 9 ) == 'mwrepo://' ) {
+ $srcPath = $this->resolveVirtualUrl( $srcPath );
+ }
+ if ( !$this->validateFilename( $dstRel ) ) {
+ throw new MWException( 'Validation error in $dstRel' );
+ }
+ if ( !$this->validateFilename( $archiveRel ) ) {
+ throw new MWException( 'Validation error in $archiveRel' );
+ }
+
+ $publicRoot = $this->getZonePath( 'public' );
+ $dstPath = "$publicRoot/$dstRel";
+ $archivePath = "$publicRoot/$archiveRel";
+
+ $dstDir = dirname( $dstPath );
+ $archiveDir = dirname( $archivePath );
+ // Abort immediately on directory creation errors since they're likely to be repetitive
+ if ( !$backend->prepare( array( 'dir' => $dstDir ) )->isOK() ) {
+ return $this->newFatal( 'directorycreateerror', $dstDir );
+ }
+ if ( !$backend->prepare( array( 'dir' => $archiveDir ) )->isOK() ) {
+ return $this->newFatal( 'directorycreateerror', $archiveDir );
+ }
+
+ // Archive destination file if it exists
+ if ( $backend->fileExists( array( 'src' => $dstPath ) ) ) {
+ // Check if the archive file exists
+ // This is a sanity check to avoid data loss. In UNIX, the rename primitive
+ // unlinks the destination file if it exists. DB-based synchronisation in
+ // publishBatch's caller should prevent races. In Windows there's no
+ // problem because the rename primitive fails if the destination exists.
+ if ( $backend->fileExists( array( 'src' => $archivePath ) ) ) {
+ $operations[] = array( 'op' => 'null' );
+ continue;
+ } else {
+ $operations[] = array(
+ 'op' => 'move',
+ 'src' => $dstPath,
+ 'dst' => $archivePath
+ );
+ }
+ $status->value[$i] = 'archived';
+ } else {
+ $status->value[$i] = 'new';
+ }
+ // Copy (or move) the source file to the destination
+ if ( FileBackend::isStoragePath( $srcPath ) ) {
+ if ( $flags & self::DELETE_SOURCE ) {
+ $operations[] = array(
+ 'op' => 'move',
+ 'src' => $srcPath,
+ 'dst' => $dstPath
+ );
+ } else {
+ $operations[] = array(
+ 'op' => 'copy',
+ 'src' => $srcPath,
+ 'dst' => $dstPath
+ );
+ }
+ } else { // FS source path
+ $operations[] = array(
+ 'op' => 'store',
+ 'src' => $srcPath,
+ 'dst' => $dstPath
+ );
+ if ( $flags & self::DELETE_SOURCE ) {
+ $sourceFSFilesToDelete[] = $srcPath;
+ }
+ }
+ }
+
+ // Execute the operations for each triplet
+ $opts = array( 'force' => true );
+ $status->merge( $backend->doOperations( $operations, $opts ) );
+ // Cleanup for disk source files...
+ foreach ( $sourceFSFilesToDelete as $file ) {
+ wfSuppressWarnings();
+ unlink( $file ); // FS cleanup
+ wfRestoreWarnings();
+ }
- function fileExists( $file, $flags = 0 ) {
+ return $status;
+ }
+
+ /**
+ * Checks existence of a a file
+ *
+ * @param $file Virtual URL (or storage path) of file to check
+ * @param $flags Integer: bitwise combination of the following flags:
+ * self::FILES_ONLY Mark file as existing only if it is a file (not directory)
+ * @return bool
+ */
+ public function fileExists( $file, $flags = 0 ) {
$result = $this->fileExistsBatch( array( $file ), $flags );
return $result[0];
}
@@ -482,12 +1014,44 @@ abstract class FileRepo {
/**
* Checks existence of an array of files.
*
- * @param $files Array: URLs (or paths) of files to check
+ * @param $files Array: Virtual URLs (or storage paths) of files to check
* @param $flags Integer: bitwise combination of the following flags:
* self::FILES_ONLY Mark file as existing only if it is a file (not directory)
* @return Either array of files and existence flags, or false
*/
- abstract function fileExistsBatch( $files, $flags = 0 );
+ public function fileExistsBatch( $files, $flags = 0 ) {
+ $result = array();
+ foreach ( $files as $key => $file ) {
+ if ( self::isVirtualUrl( $file ) ) {
+ $file = $this->resolveVirtualUrl( $file );
+ }
+ if ( FileBackend::isStoragePath( $file ) ) {
+ $result[$key] = $this->backend->fileExists( array( 'src' => $file ) );
+ } else {
+ if ( $flags & self::FILES_ONLY ) {
+ $result[$key] = is_file( $file ); // FS only
+ } else {
+ $result[$key] = file_exists( $file ); // FS only
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Move a file to the deletion archive.
+ * If no valid deletion archive exists, this may either delete the file
+ * or throw an exception, depending on the preference of the repository
+ *
+ * @param $srcRel Mixed: relative path for the file to be deleted
+ * @param $archiveRel Mixed: relative path for the archive location.
+ * Relative to a private archive directory.
+ * @return FileRepoStatus object
+ */
+ public function delete( $srcRel, $archiveRel ) {
+ return $this->deleteBatch( array( array( $srcRel, $archiveRel ) ) );
+ }
/**
* Move a group of files to the deletion archive.
@@ -495,7 +1059,7 @@ abstract class FileRepo {
* If no valid deletion archive is configured, this may either delete the
* file or throw an exception, depending on the preference of the repository.
*
- * The overwrite policy is determined by the repository -- currently FSRepo
+ * The overwrite policy is determined by the repository -- currently LocalRepo
* assumes a naming scheme in the deleted zone based on content hash, as
* opposed to the public zone which is assumed to be unique.
*
@@ -505,41 +1069,210 @@ abstract class FileRepo {
* to the deleted zone root in the second element.
* @return FileRepoStatus
*/
- abstract function deleteBatch( $sourceDestPairs );
+ public function deleteBatch( $sourceDestPairs ) {
+ $backend = $this->backend; // convenience
+
+ // Try creating directories
+ $status = $this->initZones( array( 'public', 'deleted' ) );
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
+ $status = $this->newGood();
+
+ $operations = array();
+ // Validate filenames and create archive directories
+ foreach ( $sourceDestPairs as $pair ) {
+ list( $srcRel, $archiveRel ) = $pair;
+ if ( !$this->validateFilename( $srcRel ) ) {
+ throw new MWException( __METHOD__.':Validation error in $srcRel' );
+ }
+ if ( !$this->validateFilename( $archiveRel ) ) {
+ throw new MWException( __METHOD__.':Validation error in $archiveRel' );
+ }
+
+ $publicRoot = $this->getZonePath( 'public' );
+ $srcPath = "{$publicRoot}/$srcRel";
+
+ $deletedRoot = $this->getZonePath( 'deleted' );
+ $archivePath = "{$deletedRoot}/{$archiveRel}";
+ $archiveDir = dirname( $archivePath ); // does not touch FS
+
+ // Create destination directories
+ if ( !$backend->prepare( array( 'dir' => $archiveDir ) )->isOK() ) {
+ return $this->newFatal( 'directorycreateerror', $archiveDir );
+ }
+ $this->initDeletedDir( $archiveDir );
+
+ $operations[] = array(
+ '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
+ );
+ }
+
+ // Move the files by execute the operations for each pair.
+ // We're now committed to returning an OK result, which will
+ // lead to the files being moved in the DB also.
+ $opts = array( 'force' => true );
+ $status->merge( $backend->doOperations( $operations, $opts ) );
+
+ return $status;
+ }
/**
- * Move a file to the deletion archive.
- * If no valid deletion archive exists, this may either delete the file
- * or throw an exception, depending on the preference of the repository
- * @param $srcRel Mixed: relative path for the file to be deleted
- * @param $archiveRel Mixed: relative path for the archive location.
- * Relative to a private archive directory.
- * @return FileRepoStatus object
+ * Get a relative path for a deletion archive key,
+ * e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
+ *
+ * @return string
*/
- function delete( $srcRel, $archiveRel ) {
- return $this->deleteBatch( array( array( $srcRel, $archiveRel ) ) );
+ public function getDeletedHashPath( $key ) {
+ $path = '';
+ for ( $i = 0; $i < $this->deletedHashLevels; $i++ ) {
+ $path .= $key[$i] . '/';
+ }
+ return $path;
+ }
+
+ /**
+ * If a path is a virtual URL, resolve it to a storage path.
+ * Otherwise, just return the path as it is.
+ *
+ * @param $path string
+ * @return string
+ * @throws MWException
+ */
+ protected function resolveToStoragePath( $path ) {
+ if ( $this->isVirtualUrl( $path ) ) {
+ return $this->resolveVirtualUrl( $path );
+ }
+ return $path;
+ }
+
+ /**
+ * Get a local FS copy of a file with a given virtual URL/storage path.
+ * Temporary files may be purged when the file object falls out of scope.
+ *
+ * @param $virtualUrl string
+ * @return TempFSFile|null Returns null on failure
+ */
+ public function getLocalCopy( $virtualUrl ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ return $this->backend->getLocalCopy( array( 'src' => $path ) );
}
/**
- * Get properties of a file with a given virtual URL
- * The virtual URL must refer to this repo
- * Properties should ultimately be obtained via File::getPropsFromPath()
+ * Get a local FS file with a given virtual URL/storage path.
+ * The file is either an original or a copy. It should not be changed.
+ * Temporary files may be purged when the file object falls out of scope.
+ *
+ * @param $virtualUrl string
+ * @return FSFile|null Returns null on failure.
*/
- abstract function getFileProps( $virtualUrl );
+ public function getLocalReference( $virtualUrl ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ return $this->backend->getLocalReference( array( 'src' => $path ) );
+ }
/**
- * Call a callback function for every file in the repository
- * May use either the database or the filesystem
- * STUB
+ * Get properties of a file with a given virtual URL/storage path.
+ * Properties should ultimately be obtained via FSFile::getProps().
+ *
+ * @param $virtualUrl string
+ * @return Array
*/
- function enumFiles( $callback ) {
- throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
+ public function getFileProps( $virtualUrl ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ return $this->backend->getFileProps( array( 'src' => $path ) );
+ }
+
+ /**
+ * Get the timestamp of a file with a given virtual URL/storage path
+ *
+ * @param $virtualUrl string
+ * @return string|false
+ */
+ public function getFileTimestamp( $virtualUrl ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ return $this->backend->getFileTimestamp( array( 'src' => $path ) );
+ }
+
+ /**
+ * Get the sha1 of a file with a given virtual URL/storage path
+ *
+ * @param $virtualUrl string
+ * @return string|false
+ */
+ public function getFileSha1( $virtualUrl ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ $tmpFile = $this->backend->getLocalReference( array( 'src' => $path ) );
+ if ( !$tmpFile ) {
+ return false;
+ }
+ return $tmpFile->getSha1Base36();
+ }
+
+ /**
+ * Attempt to stream a file with the given virtual URL/storage path
+ *
+ * @param $virtualUrl string
+ * @param $headers Array Additional HTTP headers to send on success
+ * @return bool Success
+ */
+ public function streamFile( $virtualUrl, $headers = array() ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ $params = array( 'src' => $path, 'headers' => $headers );
+ return $this->backend->streamFile( $params )->isOK();
+ }
+
+ /**
+ * Call a callback function for every public regular file in the repository.
+ * This only acts on the current version of files, not any old versions.
+ * May use either the database or the filesystem.
+ *
+ * @param $callback Array|string
+ * @return void
+ */
+ public function enumFiles( $callback ) {
+ $this->enumFilesInStorage( $callback );
+ }
+
+ /**
+ * Call a callback function for every public file in the repository.
+ * May use either the database or the filesystem.
+ *
+ * @param $callback Array|string
+ * @return void
+ */
+ protected function enumFilesInStorage( $callback ) {
+ $publicRoot = $this->getZonePath( 'public' );
+ $numDirs = 1 << ( $this->hashLevels * 4 );
+ // Use a priori assumptions about directory structure
+ // to reduce the tree height of the scanning process.
+ for ( $flatIndex = 0; $flatIndex < $numDirs; $flatIndex++ ) {
+ $hexString = sprintf( "%0{$this->hashLevels}x", $flatIndex );
+ $path = $publicRoot;
+ for ( $hexPos = 0; $hexPos < $this->hashLevels; $hexPos++ ) {
+ $path .= '/' . substr( $hexString, 0, $hexPos + 1 );
+ }
+ $iterator = $this->backend->getFileList( array( 'dir' => $path ) );
+ foreach ( $iterator as $name ) {
+ // Each item returned is a public file
+ call_user_func( $callback, "{$path}/{$name}" );
+ }
+ }
}
/**
* Determine if a relative path is valid, i.e. not blank or involving directory traveral
+ *
+ * @param $filename string
+ * @return bool
*/
- function validateFilename( $filename ) {
+ public function validateFilename( $filename ) {
if ( strval( $filename ) == '' ) {
return false;
}
@@ -550,11 +1283,11 @@ abstract class FileRepo {
* Use the same traversal protection as Title::secureAndSplit()
*/
if ( strpos( $filename, '.' ) !== false &&
- ( $filename === '.' || $filename === '..' ||
- strpos( $filename, './' ) === 0 ||
- strpos( $filename, '../' ) === 0 ||
- strpos( $filename, '/./' ) !== false ||
- strpos( $filename, '/../' ) !== false ) )
+ ( $filename === '.' || $filename === '..' ||
+ strpos( $filename, './' ) === 0 ||
+ strpos( $filename, '../' ) === 0 ||
+ strpos( $filename, '/./' ) !== false ||
+ strpos( $filename, '/../' ) !== false ) )
{
return false;
} else {
@@ -562,29 +1295,65 @@ abstract class FileRepo {
}
}
- /**#@+
- * Path disclosure protection functions
- */
- function paranoidClean( $param ) { return '[hidden]'; }
- function passThrough( $param ) { return $param; }
-
/**
* Get a callback function to use for cleaning error message parameters
+ *
+ * @return Array
*/
function getErrorCleanupFunction() {
switch ( $this->pathDisclosureProtection ) {
case 'none':
$callback = array( $this, 'passThrough' );
break;
+ case 'simple':
+ $callback = array( $this, 'simpleClean' );
+ break;
default: // 'paranoid'
$callback = array( $this, 'paranoidClean' );
}
return $callback;
}
- /**#@-*/
+
+ /**
+ * Path disclosure protection function
+ *
+ * @param $param string
+ * @return string
+ */
+ function paranoidClean( $param ) {
+ return '[hidden]';
+ }
+
+ /**
+ * Path disclosure protection function
+ *
+ * @param $param string
+ * @return string
+ */
+ function simpleClean( $param ) {
+ global $IP;
+ if ( !isset( $this->simpleCleanPairs ) ) {
+ $this->simpleCleanPairs = array(
+ $IP => '$IP', // sanity
+ );
+ }
+ return strtr( $param, $this->simpleCleanPairs );
+ }
+
+ /**
+ * Path disclosure protection function
+ *
+ * @param $param string
+ * @return string
+ */
+ function passThrough( $param ) {
+ return $param;
+ }
/**
* Create a new fatal error
+ *
+ * @return FileRepoStatus
*/
function newFatal( $message /*, parameters...*/ ) {
$params = func_get_args();
@@ -594,6 +1363,8 @@ abstract class FileRepo {
/**
* Create a new good result
+ *
+ * @return FileRepoStatus
*/
function newGood( $value = null ) {
return FileRepoStatus::newGood( $this, $value );
@@ -601,9 +1372,10 @@ abstract class FileRepo {
/**
* Delete files in the deleted directory if they are not referenced in the filearchive table
+ *
* STUB
*/
- function cleanupDeletedBatch( $storageKeys ) {}
+ public function cleanupDeletedBatch( $storageKeys ) {}
/**
* Checks if there is a redirect named as $title. If there is, return the
@@ -613,7 +1385,7 @@ abstract class FileRepo {
* @param $title Title of image
* @return Bool
*/
- function checkRedirect( $title ) {
+ public function checkRedirect( Title $title ) {
return false;
}
@@ -624,20 +1396,11 @@ abstract class FileRepo {
* STUB
* @param $title Title of image
*/
- function invalidateImageRedirect( $title ) {}
+ public function invalidateImageRedirect( Title $title ) {}
/**
- * Get an array or iterator of file objects for files that have a given
- * SHA-1 content hash.
+ * Get the human-readable name of the repo
*
- * STUB
- */
- function findBySha1( $hash ) {
- return array();
- }
-
- /**
- * Get the human-readable name of the repo.
* @return string
*/
public function getDisplayName() {
@@ -654,11 +1417,10 @@ abstract class FileRepo {
*
* @return bool
*/
- function isLocal() {
+ public function isLocal() {
return $this->getName() == 'local';
}
-
/**
* Get a key on the primary cache for this repository.
* Returns false if the repository's cache is not accessible at this site.
@@ -674,6 +1436,8 @@ abstract class FileRepo {
* Get a key for this repo in the local cache domain. These cache keys are
* not shared with remote instances of the repo.
* The parameters are the parts of the key, as for wfMemcKey().
+ *
+ * @return string
*/
function getLocalCacheKey( /*...*/ ) {
$args = func_get_args();
@@ -686,7 +1450,7 @@ abstract class FileRepo {
*
* @return UploadStash
*/
- function getUploadStash() {
+ public function getUploadStash() {
return new UploadStash( $this );
}
}
diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php
index 502b8c1d..e544defb 100644
--- a/includes/filerepo/ForeignAPIRepo.php
+++ b/includes/filerepo/ForeignAPIRepo.php
@@ -32,20 +32,16 @@ class ForeignAPIRepo extends FileRepo {
var $apiThumbCacheExpiry = 86400; /* 24*60*60 */
/* Redownload thumbnail files after a month */
var $fileCacheExpiry = 2592000; /* 86400*30 */
- /* Local image directory */
- var $directory;
- var $thumbDir;
protected $mQueryCache = array();
protected $mFileExists = array();
function __construct( $info ) {
+ global $wgLocalFileRepo;
parent::__construct( $info );
- global $wgUploadDirectory;
// http://commons.wikimedia.org/w/api.php
$this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
- $this->directory = isset( $info['directory'] ) ? $info['directory'] : $wgUploadDirectory;
if( isset( $info['apiThumbCacheExpiry'] ) ) {
$this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
@@ -59,17 +55,11 @@ class ForeignAPIRepo extends FileRepo {
}
// If we can cache thumbs we can guess sane defaults for these
if( $this->canCacheThumbs() && !$this->url ) {
- global $wgLocalFileRepo;
$this->url = $wgLocalFileRepo['url'];
}
if( $this->canCacheThumbs() && !$this->thumbUrl ) {
$this->thumbUrl = $this->url . '/thumb';
}
- if ( isset( $info['thumbDir'] ) ) {
- $this->thumbDir = $info['thumbDir'];
- } else {
- $this->thumbDir = "{$this->directory}/thumb";
- }
}
/**
@@ -97,6 +87,10 @@ class ForeignAPIRepo extends FileRepo {
return false;
}
+ function concatenate( $fileList, $targetPath, $flags = 0 ){
+ return false;
+ }
+
function append( $srcPath, $toAppendPath, $flags = 0 ){
return false;
}
@@ -280,9 +274,9 @@ class ForeignAPIRepo extends FileRepo {
$localFilename = $localPath . "/" . $fileName;
$localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
- if( file_exists( $localFilename ) && isset( $metadata['timestamp'] ) ) {
+ if( $this->fileExists( $localFilename ) && isset( $metadata['timestamp'] ) ) {
wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
- $modified = filemtime( $localFilename );
+ $modified = $this->getFileTimestamp( $localFilename );
$remoteModified = strtotime( $metadata['timestamp'] );
$current = time();
$diff = abs( $modified - $current );
@@ -299,16 +293,12 @@ class ForeignAPIRepo extends FileRepo {
wfDebug( __METHOD__ . " Could not download thumb\n" );
return false;
}
- if ( !is_dir($localPath) ) {
- if( !wfMkdirParents($localPath) ) {
- wfDebug( __METHOD__ . " could not create directory $localPath for thumb\n" );
- return $foreignUrl;
- }
- }
# @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
wfSuppressWarnings();
- if( !file_put_contents( $localFilename, $thumb ) ) {
+ $backend = $this->getBackend();
+ $op = array( 'op' => 'create', 'dst' => $localFilename, 'content' => $thumb );
+ if( !$backend->doOperation( $op )->isOK() ) {
wfRestoreWarnings();
wfDebug( __METHOD__ . " could not write to thumb path\n" );
return $foreignUrl;
@@ -335,17 +325,14 @@ class ForeignAPIRepo extends FileRepo {
}
/**
- * Get the local directory corresponding to one of the three basic zones
+ * Get the local directory corresponding to one of the basic zones
*/
function getZonePath( $zone ) {
- switch ( $zone ) {
- case 'public':
- return $this->directory;
- case 'thumb':
- return $this->thumbDir;
- default:
- return false;
+ $supported = array( 'public', 'thumb' );
+ if ( in_array( $zone, $supported ) ) {
+ return parent::getZonePath( $zone );
}
+ return false;
}
/**
@@ -388,4 +375,8 @@ class ForeignAPIRepo extends FileRepo {
return false;
}
}
+
+ function enumFiles( $callback ) {
+ throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
+ }
}
diff --git a/includes/filerepo/ForeignDBViaLBRepo.php b/includes/filerepo/ForeignDBViaLBRepo.php
index 4c530b51..28b48b5e 100644
--- a/includes/filerepo/ForeignDBViaLBRepo.php
+++ b/includes/filerepo/ForeignDBViaLBRepo.php
@@ -30,6 +30,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
function getSlaveDB() {
return wfGetDB( DB_SLAVE, array(), $this->wiki );
}
+
function hasSharedCache() {
return $this->hasSharedCache;
}
diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php
index 9089f4d7..cc23fa31 100644
--- a/includes/filerepo/LocalRepo.php
+++ b/includes/filerepo/LocalRepo.php
@@ -10,19 +10,20 @@
/**
* A repository that stores files in the local filesystem and registers them
* in the wiki's own database. This is the most commonly used repository class.
+ *
* @ingroup FileRepo
*/
-class LocalRepo extends FSRepo {
- var $fileFactory = array( 'LocalFile', 'newFromTitle' );
- var $fileFactoryKey = array( 'LocalFile', 'newFromKey' );
- var $oldFileFactory = array( 'OldLocalFile', 'newFromTitle' );
- var $oldFileFactoryKey = array( 'OldLocalFile', 'newFromKey' );
- var $fileFromRowFactory = array( 'LocalFile', 'newFromRow' );
- var $oldFileFromRowFactory = array( 'OldLocalFile', 'newFromRow' );
+class LocalRepo extends FileRepo {
+ var $fileFactory = array( 'LocalFile' , 'newFromTitle' );
+ var $fileFactoryKey = array( 'LocalFile' , 'newFromKey' );
+ var $fileFromRowFactory = array( 'LocalFile' , 'newFromRow' );
+ var $oldFileFactory = array( 'OldLocalFile', 'newFromTitle' );
+ var $oldFileFactoryKey = array( 'OldLocalFile', 'newFromKey' );
+ var $oldFileFromRowFactory = array( 'OldLocalFile', 'newFromRow' );
/**
* @throws MWException
- * @param $row
+ * @param $row
* @return File
*/
function newFileFromRow( $row ) {
@@ -55,6 +56,7 @@ class LocalRepo extends FSRepo {
* @return FileRepoStatus
*/
function cleanupDeletedBatch( $storageKeys ) {
+ $backend = $this->backend; // convenience
$root = $this->getZonePath( 'deleted' );
$dbw = $this->getMasterDB();
$status = $this->newGood();
@@ -63,25 +65,14 @@ class LocalRepo extends FSRepo {
$hashPath = $this->getDeletedHashPath( $key );
$path = "$root/$hashPath$key";
$dbw->begin();
- $inuse = $dbw->selectField( 'filearchive', '1',
- array( 'fa_storage_group' => 'deleted', 'fa_storage_key' => $key ),
- __METHOD__, array( 'FOR UPDATE' ) );
- if( !$inuse ) {
- $sha1 = self::getHashFromKey( $key );
- $ext = substr( $key, strcspn( $key, '.' ) + 1 );
- $ext = File::normalizeExtension($ext);
- $inuse = $dbw->selectField( 'oldimage', '1',
- array( 'oi_sha1' => $sha1,
- 'oi_archive_name ' . $dbw->buildLike( $dbw->anyString(), ".$ext" ),
- $dbw->bitAnd('oi_deleted', File::DELETED_FILE) => File::DELETED_FILE ),
- __METHOD__, array( 'FOR UPDATE' ) );
- }
- if ( !$inuse ) {
+ // Check for usage in deleted/hidden files and pre-emptively
+ // lock the key to avoid any future use until we are finished.
+ $deleted = $this->deletedFileHasKey( $key, 'lock' );
+ $hidden = $this->hiddenFileHasKey( $key, 'lock' );
+ if ( !$deleted && !$hidden ) { // not in use now
wfDebug( __METHOD__ . ": deleting $key\n" );
- wfSuppressWarnings();
- $unlink = unlink( $path );
- wfRestoreWarnings();
- if ( !$unlink ) {
+ $op = array( 'op' => 'delete', 'src' => $path );
+ if ( !$backend->doOperation( $op )->isOK() ) {
$status->error( 'undelete-cleanup-error', $path );
$status->failCount++;
}
@@ -95,6 +86,45 @@ class LocalRepo extends FSRepo {
}
/**
+ * Check if a deleted (filearchive) file has this sha1 key
+ *
+ * @param $key String File storage key (base-36 sha1 key with file extension)
+ * @param $lock String|null Use "lock" to lock the row via FOR UPDATE
+ * @return bool File with this key is in use
+ */
+ protected function deletedFileHasKey( $key, $lock = null ) {
+ $options = ( $lock === 'lock' ) ? array( 'FOR UPDATE' ) : array();
+
+ $dbw = $this->getMasterDB();
+ return (bool)$dbw->selectField( 'filearchive', '1',
+ array( 'fa_storage_group' => 'deleted', 'fa_storage_key' => $key ),
+ __METHOD__, $options
+ );
+ }
+
+ /**
+ * Check if a hidden (revision delete) file has this sha1 key
+ *
+ * @param $key String File storage key (base-36 sha1 key with file extension)
+ * @param $lock String|null Use "lock" to lock the row via FOR UPDATE
+ * @return bool File with this key is in use
+ */
+ protected function hiddenFileHasKey( $key, $lock = null ) {
+ $options = ( $lock === 'lock' ) ? array( 'FOR UPDATE' ) : array();
+
+ $sha1 = self::getHashFromKey( $key );
+ $ext = File::normalizeExtension( substr( $key, strcspn( $key, '.' ) + 1 ) );
+
+ $dbw = $this->getMasterDB();
+ return (bool)$dbw->selectField( 'oldimage', '1',
+ array( 'oi_sha1' => $sha1,
+ 'oi_archive_name ' . $dbw->buildLike( $dbw->anyString(), ".$ext" ),
+ $dbw->bitAnd( 'oi_deleted', File::DELETED_FILE ) => File::DELETED_FILE ),
+ __METHOD__, $options
+ );
+ }
+
+ /**
* Gets the SHA1 hash from a storage key
*
* @param string $key
@@ -108,16 +138,12 @@ class LocalRepo extends FSRepo {
* Checks if there is a redirect named as $title
*
* @param $title Title of file
+ * @return bool
*/
- function checkRedirect( $title ) {
+ function checkRedirect( Title $title ) {
global $wgMemc;
- if( is_string( $title ) ) {
- $title = Title::newFromText( $title );
- }
- if( $title instanceof Title && $title->getNamespace() == NS_MEDIA ) {
- $title = Title::makeTitle( NS_FILE, $title->getText() );
- }
+ $title = File::normalizeTitle( $title, 'exception' );
$memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
if ( $memcKey === false ) {
@@ -161,6 +187,7 @@ class LocalRepo extends FSRepo {
/**
* Function link Title::getArticleID().
* We can't say Title object, what database it should use, so we duplicate that function here.
+ *
* @param $title Title
*/
protected function getArticleID( $title ) {
@@ -169,20 +196,23 @@ class LocalRepo extends FSRepo {
}
$dbr = $this->getSlaveDB();
$id = $dbr->selectField(
- 'page', // Table
- 'page_id', //Field
- array( //Conditions
+ 'page', // Table
+ 'page_id', //Field
+ array( //Conditions
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey(),
),
- __METHOD__ //Function name
+ __METHOD__ //Function name
);
return $id;
}
/**
- * Get an array or iterator of file objects for files that have a given
+ * Get an array or iterator of file objects for files that have a given
* SHA-1 content hash.
+ *
+ * @param $hash String a sha1 hash to look for
+ * @return Array
*/
function findBySha1( $hash ) {
$dbr = $this->getSlaveDB();
@@ -219,6 +249,8 @@ class LocalRepo extends FSRepo {
* Get a key on the primary cache for this repository.
* Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
+ *
+ * @return string
*/
function getSharedCacheKey( /*...*/ ) {
$args = func_get_args();
@@ -229,8 +261,9 @@ class LocalRepo extends FSRepo {
* Invalidates image redirect cache related to that image
*
* @param $title Title of page
+ * @return void
*/
- function invalidateImageRedirect( $title ) {
+ function invalidateImageRedirect( Title $title ) {
global $wgMemc;
$memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
if ( $memcKey ) {
diff --git a/includes/filerepo/NullRepo.php b/includes/filerepo/NullRepo.php
index cac3e5d8..65318f40 100644
--- a/includes/filerepo/NullRepo.php
+++ b/includes/filerepo/NullRepo.php
@@ -44,4 +44,7 @@ class NullRepo extends FileRepo {
function findFile( $title, $options = array() ) {
return false;
}
+ function concatenate( $fileList, $targetPath, $flags = 0 ) {
+ return false;
+ }
}
diff --git a/includes/filerepo/README b/includes/filerepo/README
index db46ff8a..885a1ded 100644
--- a/includes/filerepo/README
+++ b/includes/filerepo/README
@@ -42,18 +42,19 @@ Tim Starling, June 2007
Structure:
-File.php defines an abstract class File.
- ForeignAPIFile.php extends File.
- LocalFile.php extends File.
- ForeignDBFile.php extends LocalFile
- Image.php extends LocalFile
- UnregisteredLocalFile.php extends File.
-FileRepo.php defined an abstract class FileRepo.
- ForeignAPIRepo.php extends FileRepo
+File defines an abstract class File.
+ ForeignAPIFile extends File.
+ LocalFile extends File.
+ ForeignDBFile extends LocalFile
+ Image extends LocalFile
+ UnregisteredLocalFile extends File.
+ UploadStashFile extends UnregisteredLocalFile.
+FileRepo defines an abstract class FileRepo.
+ ForeignAPIRepo extends FileRepo
FSRepo extends FileRepo
- LocalRepo.php extends FSRepo
- ForeignDBRepo.php extends LocalRepo
- ForeignDBViaLBRepo.php extends LocalRepo
+ LocalRepo extends FSRepo
+ ForeignDBRepo extends LocalRepo
+ ForeignDBViaLBRepo extends LocalRepo
NullRepo extends FileRepo
Russ Nelson, March 2011
diff --git a/includes/filerepo/RepoGroup.php b/includes/filerepo/RepoGroup.php
index d4875908..334ef2b8 100644
--- a/includes/filerepo/RepoGroup.php
+++ b/includes/filerepo/RepoGroup.php
@@ -7,10 +7,6 @@
*/
/**
- * @defgroup FileRepo FileRepo
- */
-
-/**
* Prioritized list of file repositories
*
* @ingroup FileRepo
@@ -56,6 +52,9 @@ class RepoGroup {
/**
* Set the singleton instance to a given object
+ * Used by extensions which hook into the Repo chain.
+ * It's not enough to just create a superclass ... you have
+ * to get people to call into it even though all they know is RepoGroup::singleton()
*
* @param $instance RepoGroup
*/
@@ -105,22 +104,15 @@ class RepoGroup {
if ( !$this->reposInitialised ) {
$this->initialiseRepos();
}
- if ( !($title instanceof Title) ) {
- $title = Title::makeTitleSafe( NS_FILE, $title );
- if ( !is_object( $title ) ) {
- return false;
- }
- }
-
- if ( $title->getNamespace() != NS_MEDIA && $title->getNamespace() != NS_FILE ) {
- throw new MWException( __METHOD__ . ' received an Title object with incorrect namespace' );
+ $title = File::normalizeTitle( $title );
+ if ( !$title ) {
+ return false;
}
# Check the cache
if ( empty( $options['ignoreRedirect'] )
&& empty( $options['private'] )
- && empty( $options['bypassCache'] )
- && $title->getNamespace() == NS_FILE )
+ && empty( $options['bypassCache'] ) )
{
$useCache = true;
$time = isset( $options['time'] ) ? $options['time'] : '';
@@ -176,10 +168,10 @@ class RepoGroup {
if ( !is_array( $item ) ) {
$item = array( 'title' => $item );
}
- if ( !( $item['title'] instanceof Title ) )
- $item['title'] = Title::makeTitleSafe( NS_FILE, $item['title'] );
- if ( $item['title'] )
+ $item['title'] = File::normalizeTitle( $item['title'] );
+ if ( $item['title'] ) {
$items[$item['title']->getDBkey()] = $item;
+ }
}
$images = $this->localRepo->findFiles( $items );
@@ -198,7 +190,7 @@ class RepoGroup {
/**
* Interface for FileRepo::checkRedirect()
*/
- function checkRedirect( $title ) {
+ function checkRedirect( Title $title ) {
if ( !$this->reposInitialised ) {
$this->initialiseRepos();
}
@@ -370,14 +362,14 @@ class RepoGroup {
$repo = $this->getRepo( $repoName );
return $repo->getFileProps( $fileName );
} else {
- return File::getPropsFromPath( $fileName );
+ return FSFile::getPropsFromPath( $fileName );
}
}
/**
* Limit cache memory
*/
- function trimCache() {
+ protected function trimCache() {
while ( count( $this->cache ) >= self::MAX_CACHE_SIZE ) {
reset( $this->cache );
$key = key( $this->cache );
@@ -385,4 +377,19 @@ class RepoGroup {
unset( $this->cache[$key] );
}
}
+
+ /**
+ * Clear RepoGroup process cache used for finding a file
+ * @param $title Title|null Title of the file or null to clear all files
+ */
+ public function clearCache( Title $title = null ) {
+ if ( $title == null ) {
+ $this->cache = array();
+ } else {
+ $dbKey = $title->getDBkey();
+ if ( isset( $this->cache[$dbKey] ) ) {
+ unset( $this->cache[$dbKey] );
+ }
+ }
+ }
}
diff --git a/includes/filerepo/backend/FSFile.php b/includes/filerepo/backend/FSFile.php
new file mode 100644
index 00000000..54dd1359
--- /dev/null
+++ b/includes/filerepo/backend/FSFile.php
@@ -0,0 +1,233 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ */
+
+/**
+ * Class representing a non-directory file on the file system
+ *
+ * @ingroup FileBackend
+ */
+class FSFile {
+ protected $path; // path to file
+
+ /**
+ * Sets up the file object
+ *
+ * @param String $path Path to temporary file on local disk
+ */
+ public function __construct( $path ) {
+ if ( FileBackend::isStoragePath( $path ) ) {
+ throw new MWException( __METHOD__ . " given storage path `$path`." );
+ }
+ $this->path = $path;
+ }
+
+ /**
+ * Returns the file system path
+ *
+ * @return String
+ */
+ public function getPath() {
+ return $this->path;
+ }
+
+ /**
+ * Checks if the file exists
+ *
+ * @return bool
+ */
+ public function exists() {
+ return is_file( $this->path );
+ }
+
+ /**
+ * Get the file size in bytes
+ *
+ * @return int|false
+ */
+ public function getSize() {
+ return filesize( $this->path );
+ }
+
+ /**
+ * Get the file's last-modified timestamp
+ *
+ * @return string|false TS_MW timestamp or false on failure
+ */
+ public function getTimestamp() {
+ wfSuppressWarnings();
+ $timestamp = filemtime( $this->path );
+ wfRestoreWarnings();
+ if ( $timestamp !== false ) {
+ $timestamp = wfTimestamp( TS_MW, $timestamp );
+ }
+ return $timestamp;
+ }
+
+ /**
+ * Guess the MIME type from the file contents alone
+ *
+ * @return string
+ */
+ public function getMimeType() {
+ return MimeMagic::singleton()->guessMimeType( $this->path, false );
+ }
+
+ /**
+ * 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.
+ * Set it to false to ignore the extension.
+ *
+ * @return array
+ */
+ public function getProps( $ext = true ) {
+ wfProfileIn( __METHOD__ );
+ wfDebug( __METHOD__.": Getting file info for $this->path\n" );
+
+ $info = self::placeholderProps();
+ $info['fileExists'] = $this->exists();
+
+ if ( $info['fileExists'] ) {
+ $magic = MimeMagic::singleton();
+
+ # get the file extension
+ if ( $ext === true ) {
+ $ext = self::extensionFromPath( $this->path );
+ }
+
+ # mime type according to file contents
+ $info['file-mime'] = $this->getMimeType();
+ # logical mime type
+ $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
+
+ list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] );
+ $info['media_type'] = $magic->getMediaType( $this->path, $info['mime'] );
+
+ # Get size in bytes
+ $info['size'] = $this->getSize();
+
+ # Height, width and metadata
+ $handler = MediaHandler::getHandler( $info['mime'] );
+ if ( $handler ) {
+ $tempImage = (object)array();
+ $info['metadata'] = $handler->getMetadata( $tempImage, $this->path );
+ $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] );
+ if ( is_array( $gis ) ) {
+ $info = $this->extractImageSizeInfo( $gis ) + $info;
+ }
+ }
+ $info['sha1'] = $this->getSha1Base36();
+
+ wfDebug(__METHOD__.": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n");
+ } else {
+ wfDebug(__METHOD__.": $this->path NOT FOUND!\n");
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $info;
+ }
+
+ /**
+ * Placeholder file properties to use for files that don't exist
+ *
+ * @return Array
+ */
+ public static function placeholderProps() {
+ $info = array();
+ $info['fileExists'] = false;
+ $info['mime'] = null;
+ $info['media_type'] = MEDIATYPE_UNKNOWN;
+ $info['metadata'] = '';
+ $info['sha1'] = '';
+ $info['width'] = 0;
+ $info['height'] = 0;
+ $info['bits'] = 0;
+ return $info;
+ }
+
+ /**
+ * Exract image size information
+ *
+ * @return Array
+ */
+ protected function extractImageSizeInfo( array $gis ) {
+ $info = array();
+ # NOTE: $gis[2] contains a code for the image type. This is no longer used.
+ $info['width'] = $gis[0];
+ $info['height'] = $gis[1];
+ if ( isset( $gis['bits'] ) ) {
+ $info['bits'] = $gis['bits'];
+ } else {
+ $info['bits'] = 0;
+ }
+ return $info;
+ }
+
+ /**
+ * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case
+ * encoding, zero padded to 31 digits.
+ *
+ * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
+ * fairly neatly.
+ *
+ * @return false|string False on failure
+ */
+ public function getSha1Base36() {
+ wfProfileIn( __METHOD__ );
+
+ wfSuppressWarnings();
+ $hash = sha1_file( $this->path );
+ wfRestoreWarnings();
+ if ( $hash !== false ) {
+ $hash = wfBaseConvert( $hash, 16, 36, 31 );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $hash;
+ }
+
+ /**
+ * Get the final file extension from a file system path
+ *
+ * @param $path string
+ * @return string
+ */
+ public static function extensionFromPath( $path ) {
+ $i = strrpos( $path, '.' );
+ return strtolower( $i ? substr( $path, $i + 1 ) : '' );
+ }
+
+ /**
+ * Get an associative array containing information about a file in the local filesystem.
+ *
+ * @param $path String: absolute local filesystem path
+ * @param $ext Mixed: the file extension, or true to extract it from the filename.
+ * Set it to false to ignore the extension.
+ *
+ * @return array
+ */
+ public static function getPropsFromPath( $path, $ext = true ) {
+ $fsFile = new self( $path );
+ return $fsFile->getProps( $ext );
+ }
+
+ /**
+ * Get a SHA-1 hash of a file in the local filesystem, in base-36 lower case
+ * encoding, zero padded to 31 digits.
+ *
+ * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
+ * fairly neatly.
+ *
+ * @param $path string
+ *
+ * @return false|string False on failure
+ */
+ public static function getSha1Base36FromPath( $path ) {
+ $fsFile = new self( $path );
+ return $fsFile->getSha1Base36();
+ }
+}
diff --git a/includes/filerepo/backend/FSFileBackend.php b/includes/filerepo/backend/FSFileBackend.php
new file mode 100644
index 00000000..1a4c44ad
--- /dev/null
+++ b/includes/filerepo/backend/FSFileBackend.php
@@ -0,0 +1,600 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class for a file system (FS) based file backend.
+ *
+ * All "containers" each map to a directory under the backend's base directory.
+ * For backwards-compatibility, some container paths can be set to custom paths.
+ * The wiki ID will not be used in any custom paths, so this should be avoided.
+ *
+ * Having directories with thousands of files will diminish performance.
+ * Sharding can be accomplished by using FileRepo-style hash paths.
+ *
+ * Status messages should avoid mentioning the internal FS paths.
+ * PHP warnings are assumed to be logged rather than output.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class FSFileBackend extends FileBackendStore {
+ protected $basePath; // string; directory holding the container directories
+ /** @var Array Map of container names to root paths */
+ protected $containerPaths = array(); // for custom container paths
+ protected $fileMode; // integer; file permission mode
+
+ protected $hadWarningErrors = array();
+
+ /**
+ * @see FileBackendStore::__construct()
+ * Additional $config params include:
+ * basePath : File system directory that holds containers.
+ * containerPaths : Map of container names to custom file system directories.
+ * This should only be used for backwards-compatibility.
+ * fileMode : Octal UNIX file permissions to use on files stored.
+ */
+ public function __construct( array $config ) {
+ parent::__construct( $config );
+
+ // Remove any possible trailing slash from directories
+ if ( isset( $config['basePath'] ) ) {
+ $this->basePath = rtrim( $config['basePath'], '/' ); // remove trailing slash
+ } else {
+ $this->basePath = null; // none; containers must have explicit paths
+ }
+
+ if ( isset( $config['containerPaths'] ) ) {
+ $this->containerPaths = (array)$config['containerPaths'];
+ foreach ( $this->containerPaths as &$path ) {
+ $path = rtrim( $path, '/' ); // remove trailing slash
+ }
+ }
+
+ $this->fileMode = isset( $config['fileMode'] )
+ ? $config['fileMode']
+ : 0644;
+ }
+
+ /**
+ * @see FileBackendStore::resolveContainerPath()
+ */
+ protected function resolveContainerPath( $container, $relStoragePath ) {
+ // Check that container has a root directory
+ if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
+ // Check for sane relative paths (assume the base paths are OK)
+ if ( $this->isLegalRelPath( $relStoragePath ) ) {
+ return $relStoragePath;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Sanity check a relative file system path for validity
+ *
+ * @param $path string Normalized relative path
+ * @return bool
+ */
+ protected function isLegalRelPath( $path ) {
+ // Check for file names longer than 255 chars
+ if ( preg_match( '![^/]{256}!', $path ) ) { // ext3/NTFS
+ return false;
+ }
+ if ( wfIsWindows() ) { // NTFS
+ return !preg_match( '![:*?"<>|]!', $path );
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Given the short (unresolved) and full (resolved) name of
+ * a container, return the file system path of the container.
+ *
+ * @param $shortCont string
+ * @param $fullCont string
+ * @return string|null
+ */
+ protected function containerFSRoot( $shortCont, $fullCont ) {
+ if ( isset( $this->containerPaths[$shortCont] ) ) {
+ return $this->containerPaths[$shortCont];
+ } elseif ( isset( $this->basePath ) ) {
+ return "{$this->basePath}/{$fullCont}";
+ }
+ return null; // no container base path defined
+ }
+
+ /**
+ * Get the absolute file system path for a storage path
+ *
+ * @param $storagePath string Storage path
+ * @return string|null
+ */
+ protected function resolveToFSPath( $storagePath ) {
+ list( $fullCont, $relPath ) = $this->resolveStoragePathReal( $storagePath );
+ if ( $relPath === null ) {
+ return null; // invalid
+ }
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $storagePath );
+ $fsPath = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ if ( $relPath != '' ) {
+ $fsPath .= "/{$relPath}";
+ }
+ return $fsPath;
+ }
+
+ /**
+ * @see FileBackendStore::isPathUsableInternal()
+ */
+ public function isPathUsableInternal( $storagePath ) {
+ $fsPath = $this->resolveToFSPath( $storagePath );
+ if ( $fsPath === null ) {
+ return false; // invalid
+ }
+ $parentDir = dirname( $fsPath );
+
+ if ( file_exists( $fsPath ) ) {
+ $ok = is_file( $fsPath ) && is_writable( $fsPath );
+ } else {
+ $ok = is_dir( $parentDir ) && is_writable( $parentDir );
+ }
+
+ return $ok;
+ }
+
+ /**
+ * @see FileBackendStore::doStoreInternal()
+ */
+ protected function doStoreInternal( array $params ) {
+ $status = Status::newGood();
+
+ $dest = $this->resolveToFSPath( $params['dst'] );
+ if ( $dest === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ if ( file_exists( $dest ) ) {
+ if ( !empty( $params['overwrite'] ) ) {
+ $ok = unlink( $dest );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-delete', $params['dst'] );
+ return $status;
+ }
+ } else {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ }
+
+ $ok = copy( $params['src'], $dest );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+ return $status;
+ }
+
+ $this->chmod( $dest );
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doCopyInternal()
+ */
+ protected function doCopyInternal( array $params ) {
+ $status = Status::newGood();
+
+ $source = $this->resolveToFSPath( $params['src'] );
+ if ( $source === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ return $status;
+ }
+
+ $dest = $this->resolveToFSPath( $params['dst'] );
+ if ( $dest === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ if ( file_exists( $dest ) ) {
+ if ( !empty( $params['overwrite'] ) ) {
+ $ok = unlink( $dest );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-delete', $params['dst'] );
+ return $status;
+ }
+ } else {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ }
+
+ $ok = copy( $source, $dest );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ return $status;
+ }
+
+ $this->chmod( $dest );
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doMoveInternal()
+ */
+ protected function doMoveInternal( array $params ) {
+ $status = Status::newGood();
+
+ $source = $this->resolveToFSPath( $params['src'] );
+ if ( $source === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ return $status;
+ }
+
+ $dest = $this->resolveToFSPath( $params['dst'] );
+ if ( $dest === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ if ( file_exists( $dest ) ) {
+ if ( !empty( $params['overwrite'] ) ) {
+ // Windows does not support moving over existing files
+ if ( wfIsWindows() ) {
+ $ok = unlink( $dest );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-delete', $params['dst'] );
+ return $status;
+ }
+ }
+ } else {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ }
+
+ $ok = rename( $source, $dest );
+ clearstatcache(); // file no longer at source
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+ return $status;
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doDeleteInternal()
+ */
+ protected function doDeleteInternal( array $params ) {
+ $status = Status::newGood();
+
+ $source = $this->resolveToFSPath( $params['src'] );
+ if ( $source === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ return $status;
+ }
+
+ if ( !is_file( $source ) ) {
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-delete', $params['src'] );
+ }
+ return $status; // do nothing; either OK or bad status
+ }
+
+ $ok = unlink( $source );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-delete', $params['src'] );
+ return $status;
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doCreateInternal()
+ */
+ protected function doCreateInternal( array $params ) {
+ $status = Status::newGood();
+
+ $dest = $this->resolveToFSPath( $params['dst'] );
+ if ( $dest === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ if ( file_exists( $dest ) ) {
+ if ( !empty( $params['overwrite'] ) ) {
+ $ok = unlink( $dest );
+ if ( !$ok ) {
+ $status->fatal( 'backend-fail-delete', $params['dst'] );
+ return $status;
+ }
+ } else {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ }
+
+ $bytes = file_put_contents( $dest, $params['content'] );
+ if ( $bytes === false ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ }
+
+ $this->chmod( $dest );
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doPrepareInternal()
+ */
+ protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
+ $status = Status::newGood();
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+ if ( !wfMkdirParents( $dir ) ) { // make directory and its parents
+ $status->fatal( 'directorycreateerror', $params['dir'] );
+ } elseif ( !is_writable( $dir ) ) {
+ $status->fatal( 'directoryreadonlyerror', $params['dir'] );
+ } elseif ( !is_readable( $dir ) ) {
+ $status->fatal( 'directorynotreadableerror', $params['dir'] );
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doSecureInternal()
+ */
+ protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
+ $status = Status::newGood();
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+ // Seed new directories with a blank index.html, to prevent crawling...
+ if ( !empty( $params['noListing'] ) && !file_exists( "{$dir}/index.html" ) ) {
+ $bytes = file_put_contents( "{$dir}/index.html", '' );
+ if ( !$bytes ) {
+ $status->fatal( 'backend-fail-create', $params['dir'] . '/index.html' );
+ return $status;
+ }
+ }
+ // Add a .htaccess file to the root of the container...
+ if ( !empty( $params['noAccess'] ) ) {
+ if ( !file_exists( "{$contRoot}/.htaccess" ) ) {
+ $bytes = file_put_contents( "{$contRoot}/.htaccess", "Deny from all\n" );
+ if ( !$bytes ) {
+ $storeDir = "mwstore://{$this->name}/{$shortCont}";
+ $status->fatal( 'backend-fail-create', "{$storeDir}/.htaccess" );
+ return $status;
+ }
+ }
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doCleanInternal()
+ */
+ protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
+ $status = Status::newGood();
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+ wfSuppressWarnings();
+ if ( is_dir( $dir ) ) {
+ rmdir( $dir ); // remove directory if empty
+ }
+ wfRestoreWarnings();
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doFileExists()
+ */
+ protected function doGetFileStat( array $params ) {
+ $source = $this->resolveToFSPath( $params['src'] );
+ if ( $source === null ) {
+ return false; // invalid storage path
+ }
+
+ $this->trapWarnings(); // don't trust 'false' if there were errors
+ $stat = is_file( $source ) ? stat( $source ) : false; // regular files only
+ $hadError = $this->untrapWarnings();
+
+ if ( $stat ) {
+ return array(
+ 'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
+ 'size' => $stat['size']
+ );
+ } elseif ( !$hadError ) {
+ return false; // file does not exist
+ } else {
+ return null; // failure
+ }
+ }
+
+ /**
+ * @see FileBackendStore::doClearCache()
+ */
+ protected function doClearCache( array $paths = null ) {
+ clearstatcache(); // clear the PHP file stat cache
+ }
+
+ /**
+ * @see FileBackendStore::getFileListInternal()
+ */
+ public function getFileListInternal( $fullCont, $dirRel, array $params ) {
+ list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+ $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+ $exists = is_dir( $dir );
+ if ( !$exists ) {
+ wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
+ return array(); // nothing under this dir
+ }
+ $readable = is_readable( $dir );
+ if ( !$readable ) {
+ wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
+ return null; // bad permissions?
+ }
+ return new FSFileBackendFileList( $dir );
+ }
+
+ /**
+ * @see FileBackendStore::getLocalReference()
+ */
+ public function getLocalReference( array $params ) {
+ $source = $this->resolveToFSPath( $params['src'] );
+ if ( $source === null ) {
+ return null;
+ }
+ return new FSFile( $source );
+ }
+
+ /**
+ * @see FileBackendStore::getLocalCopy()
+ */
+ public function getLocalCopy( array $params ) {
+ $source = $this->resolveToFSPath( $params['src'] );
+ if ( $source === null ) {
+ return null;
+ }
+
+ // Create a new temporary file with the same extension...
+ $ext = FileBackend::extensionFromPath( $params['src'] );
+ $tmpFile = TempFSFile::factory( wfBaseName( $source ) . '_', $ext );
+ if ( !$tmpFile ) {
+ return null;
+ }
+ $tmpPath = $tmpFile->getPath();
+
+ // Copy the source file over the temp file
+ $ok = copy( $source, $tmpPath );
+ if ( !$ok ) {
+ return null;
+ }
+
+ $this->chmod( $tmpPath );
+
+ return $tmpFile;
+ }
+
+ /**
+ * Chmod a file, suppressing the warnings
+ *
+ * @param $path string Absolute file system path
+ * @return bool Success
+ */
+ protected function chmod( $path ) {
+ wfSuppressWarnings();
+ $ok = chmod( $path, $this->fileMode );
+ wfRestoreWarnings();
+
+ return $ok;
+ }
+
+ /**
+ * Listen for E_WARNING errors and track whether any happen
+ *
+ * @return bool
+ */
+ protected function trapWarnings() {
+ $this->hadWarningErrors[] = false; // push to stack
+ set_error_handler( array( $this, 'handleWarning' ), E_WARNING );
+ return false; // invoke normal PHP error handler
+ }
+
+ /**
+ * Stop listening for E_WARNING errors and return true if any happened
+ *
+ * @return bool
+ */
+ protected function untrapWarnings() {
+ restore_error_handler(); // restore previous handler
+ return array_pop( $this->hadWarningErrors ); // pop from stack
+ }
+
+ private function handleWarning() {
+ $this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
+ return true; // suppress from PHP handler
+ }
+}
+
+/**
+ * Wrapper around RecursiveDirectoryIterator that catches
+ * exception or does any custom behavoir that we may want.
+ * Do not use this class from places outside FSFileBackend.
+ *
+ * @ingroup FileBackend
+ */
+class FSFileBackendFileList implements Iterator {
+ /** @var RecursiveIteratorIterator */
+ protected $iter;
+ protected $suffixStart; // integer
+ protected $pos = 0; // integer
+
+ /**
+ * @param $dir string file system directory
+ */
+ public function __construct( $dir ) {
+ $dir = realpath( $dir ); // normalize
+ $this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
+ try {
+ # Get an iterator that will return leaf nodes (non-directories)
+ if ( MWInit::classExists( 'FilesystemIterator' ) ) { // PHP >= 5.3
+ # RecursiveDirectoryIterator extends FilesystemIterator.
+ # FilesystemIterator::SKIP_DOTS default is inconsistent in PHP 5.3.x.
+ $flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS;
+ $this->iter = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator( $dir, $flags ) );
+ } else { // PHP < 5.3
+ # RecursiveDirectoryIterator extends DirectoryIterator
+ $this->iter = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator( $dir ) );
+ }
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null; // bad permissions? deleted?
+ }
+ }
+
+ public function current() {
+ // Return only the relative path and normalize slashes to FileBackend-style
+ // Make sure to use the realpath since the suffix is based upon that
+ return str_replace( '\\', '/',
+ substr( realpath( $this->iter->current() ), $this->suffixStart ) );
+ }
+
+ public function key() {
+ return $this->pos;
+ }
+
+ public function next() {
+ try {
+ $this->iter->next();
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null;
+ }
+ ++$this->pos;
+ }
+
+ public function rewind() {
+ $this->pos = 0;
+ try {
+ $this->iter->rewind();
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null;
+ }
+ }
+
+ public function valid() {
+ return $this->iter && $this->iter->valid();
+ }
+}
diff --git a/includes/filerepo/backend/FileBackend.php b/includes/filerepo/backend/FileBackend.php
new file mode 100644
index 00000000..9433bcb4
--- /dev/null
+++ b/includes/filerepo/backend/FileBackend.php
@@ -0,0 +1,1739 @@
+<?php
+/**
+ * @defgroup FileBackend File backend
+ * @ingroup FileRepo
+ *
+ * This module regroup classes meant for MediaWiki to interacts with
+ */
+
+/**
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Base class for all file backend classes (including multi-write backends).
+ *
+ * This class defines the methods as abstract that subclasses must implement.
+ * Outside callers can assume that all backends will have these functions.
+ *
+ * All "storage paths" are of the format "mwstore://backend/container/path".
+ * The paths use UNIX file system (FS) notation, though any particular backend may
+ * not actually be using a local filesystem. Therefore, the paths are only virtual.
+ *
+ * Backend contents are stored under wiki-specific container names by default.
+ * For legacy reasons, this has no effect for the FS backend class, and per-wiki
+ * segregation must be done by setting the container paths appropriately.
+ *
+ * FS-based backends are somewhat more restrictive due to the existence of real
+ * directory files; a regular file cannot have the same name as a directory. Other
+ * backends with virtual directories may not have this limitation. Callers should
+ * store files in such a way that no files and directories are under the same path.
+ *
+ * Methods should avoid throwing exceptions at all costs.
+ * As a corollary, external dependencies should be kept to a minimum.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+abstract class FileBackend {
+ protected $name; // string; unique backend name
+ protected $wikiId; // string; unique wiki name
+ protected $readOnly; // string; read-only explanation message
+ /** @var LockManager */
+ protected $lockManager;
+
+ /**
+ * Create a new backend instance from configuration.
+ * This should only be called from within FileBackendGroup.
+ *
+ * $config includes:
+ * 'name' : The unique name of this backend.
+ * This should consist of alphanumberic, '-', and '_' characters.
+ * This name should not be changed after use.
+ * 'wikiId' : Prefix to container names that is unique to this wiki.
+ * This should consist of alphanumberic, '-', and '_' characters.
+ * 'lockManager' : Registered name of a file lock manager to use.
+ * 'readOnly' : Write operations are disallowed if this is a non-empty string.
+ * It should be an explanation for the backend being read-only.
+ *
+ * @param $config Array
+ */
+ public function __construct( array $config ) {
+ $this->name = $config['name'];
+ if ( !preg_match( '!^[a-zA-Z0-9-_]{1,255}$!', $this->name ) ) {
+ throw new MWException( "Backend name `{$this->name}` is invalid." );
+ }
+ $this->wikiId = isset( $config['wikiId'] )
+ ? $config['wikiId']
+ : wfWikiID(); // e.g. "my_wiki-en_"
+ $this->lockManager = ( $config['lockManager'] instanceof LockManager )
+ ? $config['lockManager']
+ : LockManagerGroup::singleton()->get( $config['lockManager'] );
+ $this->readOnly = isset( $config['readOnly'] )
+ ? (string)$config['readOnly']
+ : '';
+ }
+
+ /**
+ * Get the unique backend name.
+ * We may have multiple different backends of the same type.
+ * For example, we can have two Swift backends using different proxies.
+ *
+ * @return string
+ */
+ final public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * Check if this backend is read-only
+ *
+ * @return bool
+ */
+ final public function isReadOnly() {
+ return ( $this->readOnly != '' );
+ }
+
+ /**
+ * Get an explanatory message if this backend is read-only
+ *
+ * @return string|false Returns falls if the backend is not read-only
+ */
+ final public function getReadOnlyReason() {
+ return ( $this->readOnly != '' ) ? $this->readOnly : false;
+ }
+
+ /**
+ * This is the main entry point into the backend for write operations.
+ * Callers supply an ordered list of operations to perform as a transaction.
+ * Files will be locked, the stat cache cleared, and then the operations attempted.
+ * If any serious errors occur, all attempted operations will be rolled back.
+ *
+ * $ops is an array of arrays. The outer array holds a list of operations.
+ * Each inner array is a set of key value pairs that specify an operation.
+ *
+ * Supported operations and their parameters:
+ * a) Create a new file in storage with the contents of a string
+ * array(
+ * 'op' => 'create',
+ * 'dst' => <storage path>,
+ * 'content' => <string of new file contents>,
+ * 'overwrite' => <boolean>,
+ * 'overwriteSame' => <boolean>
+ * )
+ * b) Copy a file system file into storage
+ * array(
+ * 'op' => 'store',
+ * 'src' => <file system path>,
+ * 'dst' => <storage path>,
+ * 'overwrite' => <boolean>,
+ * 'overwriteSame' => <boolean>
+ * )
+ * c) Copy a file within storage
+ * array(
+ * 'op' => 'copy',
+ * 'src' => <storage path>,
+ * 'dst' => <storage path>,
+ * 'overwrite' => <boolean>,
+ * 'overwriteSame' => <boolean>
+ * )
+ * d) Move a file within storage
+ * array(
+ * 'op' => 'move',
+ * 'src' => <storage path>,
+ * 'dst' => <storage path>,
+ * 'overwrite' => <boolean>,
+ * 'overwriteSame' => <boolean>
+ * )
+ * e) Delete a file within storage
+ * array(
+ * 'op' => 'delete',
+ * 'src' => <storage path>,
+ * 'ignoreMissingSource' => <boolean>
+ * )
+ * f) Do nothing (no-op)
+ * array(
+ * 'op' => 'null',
+ * )
+ *
+ * Boolean flags for operations (operation-specific):
+ * 'ignoreMissingSource' : The operation will simply succeed and do
+ * nothing if the source file does not exist.
+ * '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.
+ *
+ * $opts is an associative of boolean flags, including:
+ * 'force' : Errors that would normally cause a rollback do not.
+ * The remaining operations are still attempted if any fail.
+ * 'nonLocking' : No locks are acquired for the operations.
+ * This can increase performance for non-critical writes.
+ * This has no effect unless the 'force' flag is set.
+ * 'allowStale' : Don't require the latest available data.
+ * This can increase performance for non-critical writes.
+ * This has no effect unless the 'force' flag is set.
+ *
+ * Remarks on locking:
+ * File system paths given to operations should refer to files that are
+ * already locked or otherwise safe from modification from other processes.
+ * Normally these files will be new temp files, which should be adequate.
+ *
+ * Return value:
+ * This returns a Status, which contains all warnings and fatals that occured
+ * during the operation. The 'failCount', 'successCount', and 'success' members
+ * will reflect each operation attempted. The status will be "OK" unless:
+ * a) unexpected operation errors occurred (network partitions, disk full...)
+ * b) significant operation errors occured and 'force' was not set
+ *
+ * @param $ops Array List of operations to execute in order
+ * @param $opts Array Batch operation options
+ * @return Status
+ */
+ final public function doOperations( array $ops, array $opts = array() ) {
+ if ( $this->isReadOnly() ) {
+ return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+ }
+ if ( empty( $opts['force'] ) ) { // sanity
+ unset( $opts['nonLocking'] );
+ unset( $opts['allowStale'] );
+ }
+ return $this->doOperationsInternal( $ops, $opts );
+ }
+
+ /**
+ * @see FileBackend::doOperations()
+ */
+ abstract protected function doOperationsInternal( array $ops, array $opts );
+
+ /**
+ * Same as doOperations() except it takes a single operation.
+ * If you are doing a batch of operations that should either
+ * all succeed or all fail, then use that function instead.
+ *
+ * @see FileBackend::doOperations()
+ *
+ * @param $op Array Operation
+ * @param $opts Array Operation options
+ * @return Status
+ */
+ final public function doOperation( array $op, array $opts = array() ) {
+ return $this->doOperations( array( $op ), $opts );
+ }
+
+ /**
+ * Performs a single create operation.
+ * This sets $params['op'] to 'create' and passes it to doOperation().
+ *
+ * @see FileBackend::doOperation()
+ *
+ * @param $params Array Operation parameters
+ * @param $opts Array Operation options
+ * @return Status
+ */
+ final public function create( array $params, array $opts = array() ) {
+ $params['op'] = 'create';
+ return $this->doOperation( $params, $opts );
+ }
+
+ /**
+ * Performs a single store operation.
+ * This sets $params['op'] to 'store' and passes it to doOperation().
+ *
+ * @see FileBackend::doOperation()
+ *
+ * @param $params Array Operation parameters
+ * @param $opts Array Operation options
+ * @return Status
+ */
+ final public function store( array $params, array $opts = array() ) {
+ $params['op'] = 'store';
+ return $this->doOperation( $params, $opts );
+ }
+
+ /**
+ * Performs a single copy operation.
+ * This sets $params['op'] to 'copy' and passes it to doOperation().
+ *
+ * @see FileBackend::doOperation()
+ *
+ * @param $params Array Operation parameters
+ * @param $opts Array Operation options
+ * @return Status
+ */
+ final public function copy( array $params, array $opts = array() ) {
+ $params['op'] = 'copy';
+ return $this->doOperation( $params, $opts );
+ }
+
+ /**
+ * Performs a single move operation.
+ * This sets $params['op'] to 'move' and passes it to doOperation().
+ *
+ * @see FileBackend::doOperation()
+ *
+ * @param $params Array Operation parameters
+ * @param $opts Array Operation options
+ * @return Status
+ */
+ final public function move( array $params, array $opts = array() ) {
+ $params['op'] = 'move';
+ return $this->doOperation( $params, $opts );
+ }
+
+ /**
+ * Performs a single delete operation.
+ * This sets $params['op'] to 'delete' and passes it to doOperation().
+ *
+ * @see FileBackend::doOperation()
+ *
+ * @param $params Array Operation parameters
+ * @param $opts Array Operation options
+ * @return Status
+ */
+ final public function delete( array $params, array $opts = array() ) {
+ $params['op'] = 'delete';
+ return $this->doOperation( $params, $opts );
+ }
+
+ /**
+ * Concatenate a list of storage files into a single file system file.
+ * The target path should refer to a file that is already locked or
+ * otherwise safe from modification from other processes. Normally,
+ * the file will be a new temp file, which should be adequate.
+ * $params include:
+ * srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
+ * dst : file system path to 0-byte temp file
+ *
+ * @param $params Array Operation parameters
+ * @return Status
+ */
+ abstract public function concatenate( array $params );
+
+ /**
+ * Prepare a storage directory for usage.
+ * This will create any required containers and parent directories.
+ * Backends using key/value stores only need to create the container.
+ *
+ * $params include:
+ * dir : storage directory
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function prepare( array $params ) {
+ if ( $this->isReadOnly() ) {
+ return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+ }
+ return $this->doPrepare( $params );
+ }
+
+ /**
+ * @see FileBackend::prepare()
+ */
+ abstract protected function doPrepare( array $params );
+
+ /**
+ * Take measures to block web access to a storage directory and
+ * the container it belongs to. FS backends might add .htaccess
+ * files whereas key/value store backends might restrict container
+ * access to the auth user that represents end-users in web request.
+ * This is not guaranteed to actually do anything.
+ *
+ * $params include:
+ * dir : storage directory
+ * noAccess : try to deny file access
+ * noListing : try to deny file listing
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function secure( array $params ) {
+ if ( $this->isReadOnly() ) {
+ return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+ }
+ $status = $this->doPrepare( $params ); // dir must exist to restrict it
+ if ( $status->isOK() ) {
+ $status->merge( $this->doSecure( $params ) );
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::secure()
+ */
+ abstract protected function doSecure( array $params );
+
+ /**
+ * Delete a storage directory if it is empty.
+ * Backends using key/value stores may do nothing unless the directory
+ * is that of an empty container, in which case it should be deleted.
+ *
+ * $params include:
+ * dir : storage directory
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function clean( array $params ) {
+ if ( $this->isReadOnly() ) {
+ return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+ }
+ return $this->doClean( $params );
+ }
+
+ /**
+ * @see FileBackend::clean()
+ */
+ abstract protected function doClean( array $params );
+
+ /**
+ * Check if a file exists at a storage path in the backend.
+ * This returns false if only a directory exists at the path.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return bool|null Returns null on failure
+ */
+ abstract public function fileExists( array $params );
+
+ /**
+ * Get the last-modified timestamp of the file at a storage path.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return string|false TS_MW timestamp or false on failure
+ */
+ abstract public function getFileTimestamp( array $params );
+
+ /**
+ * Get the contents of a file at a storage path in the backend.
+ * This should be avoided for potentially large files.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return string|false Returns false on failure
+ */
+ abstract public function getFileContents( array $params );
+
+ /**
+ * Get the size (bytes) of a file at a storage path in the backend.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return integer|false Returns false on failure
+ */
+ abstract public function getFileSize( array $params );
+
+ /**
+ * Get quick information about a file at a storage path in the backend.
+ * If the file does not exist, then this returns false.
+ * Otherwise, the result is an associative array that includes:
+ * mtime : the last-modified timestamp (TS_MW)
+ * size : the file size (bytes)
+ * Additional values may be included for internal use only.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return Array|false|null Returns null on failure
+ */
+ abstract public function getFileStat( array $params );
+
+ /**
+ * Get a SHA-1 hash of the file at a storage path in the backend.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return string|false Hash string or false on failure
+ */
+ abstract public function getFileSha1Base36( array $params );
+
+ /**
+ * Get the properties of the file at a storage path in the backend.
+ * Returns FSFile::placeholderProps() on failure.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return Array
+ */
+ abstract public function getFileProps( array $params );
+
+ /**
+ * Stream the file at a storage path in the backend.
+ * If the file does not exists, a 404 error will be given.
+ * Appropriate HTTP headers (Status, Content-Type, Content-Length)
+ * must be sent if streaming began, while none should be sent otherwise.
+ * Implementations should flush the output buffer before sending data.
+ *
+ * $params include:
+ * src : source storage path
+ * headers : additional HTTP headers to send on success
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return Status
+ */
+ abstract public function streamFile( array $params );
+
+ /**
+ * Returns a file system file, identical to the file at a storage path.
+ * The file returned is either:
+ * a) A local copy of the file at a storage path in the backend.
+ * The temporary copy will have the same extension as the source.
+ * b) An original of the file at a storage path in the backend.
+ * Temporary files may be purged when the file object falls out of scope.
+ *
+ * Write operations should *never* be done on this file as some backends
+ * may do internal tracking or may be instances of FileBackendMultiWrite.
+ * In that later case, there are copies of the file that must stay in sync.
+ * Additionally, further calls to this function may return the same file.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return FSFile|null Returns null on failure
+ */
+ abstract public function getLocalReference( array $params );
+
+ /**
+ * Get a local copy on disk of the file at a storage path in the backend.
+ * The temporary copy will have the same file extension as the source.
+ * Temporary files may be purged when the file object falls out of scope.
+ *
+ * $params include:
+ * src : source storage path
+ * latest : use the latest available data
+ *
+ * @param $params Array
+ * @return TempFSFile|null Returns null on failure
+ */
+ abstract public function getLocalCopy( array $params );
+
+ /**
+ * Get an iterator to list out all stored files under a storage directory.
+ * If the directory is of the form "mwstore://backend/container",
+ * then all files in the container should be listed.
+ * If the directory is of form "mwstore://backend/container/dir",
+ * then all files under that container directory should be listed.
+ * Results should be storage paths relative to the given directory.
+ *
+ * Storage backends with eventual consistency might return stale data.
+ *
+ * $params include:
+ * dir : storage path directory
+ *
+ * @return Traversable|Array|null Returns null on failure
+ */
+ abstract public function getFileList( array $params );
+
+ /**
+ * Invalidate any in-process file existence and property cache.
+ * If $paths is given, then only the cache for those files will be cleared.
+ *
+ * @param $paths Array Storage paths (optional)
+ * @return void
+ */
+ public function clearCache( array $paths = null ) {}
+
+ /**
+ * Lock the files at the given storage paths in the backend.
+ * This will either lock all the files or none (on failure).
+ *
+ * Callers should consider using getScopedFileLocks() instead.
+ *
+ * @param $paths Array Storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @return Status
+ */
+ final public function lockFiles( array $paths, $type ) {
+ return $this->lockManager->lock( $paths, $type );
+ }
+
+ /**
+ * Unlock the files at the given storage paths in the backend.
+ *
+ * @param $paths Array Storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @return Status
+ */
+ final public function unlockFiles( array $paths, $type ) {
+ return $this->lockManager->unlock( $paths, $type );
+ }
+
+ /**
+ * Lock the files at the given storage paths in the backend.
+ * This will either lock all the files or none (on failure).
+ * On failure, the status object will be updated with errors.
+ *
+ * Once the return value goes out scope, the locks will be released and
+ * the status updated. Unlock fatals will not change the status "OK" value.
+ *
+ * @param $paths Array Storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @param $status Status Status to update on lock/unlock
+ * @return ScopedLock|null Returns null on failure
+ */
+ final public function getScopedFileLocks( array $paths, $type, Status $status ) {
+ return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
+ }
+
+ /**
+ * Check if a given path is a "mwstore://" path.
+ * This does not do any further validation or any existence checks.
+ *
+ * @param $path string
+ * @return bool
+ */
+ final public static function isStoragePath( $path ) {
+ return ( strpos( $path, 'mwstore://' ) === 0 );
+ }
+
+ /**
+ * Split a storage path into a backend name, a container name,
+ * and a relative file path. The relative path may be the empty string.
+ * This does not do any path normalization or traversal checks.
+ *
+ * @param $storagePath string
+ * @return Array (backend, container, rel object) or (null, null, null)
+ */
+ final public static function splitStoragePath( $storagePath ) {
+ if ( self::isStoragePath( $storagePath ) ) {
+ // Remove the "mwstore://" prefix and split the path
+ $parts = explode( '/', substr( $storagePath, 10 ), 3 );
+ if ( count( $parts ) >= 2 && $parts[0] != '' && $parts[1] != '' ) {
+ if ( count( $parts ) == 3 ) {
+ return $parts; // e.g. "backend/container/path"
+ } else {
+ return array( $parts[0], $parts[1], '' ); // e.g. "backend/container"
+ }
+ }
+ }
+ return array( null, null, null );
+ }
+
+ /**
+ * Normalize a storage path by cleaning up directory separators.
+ * Returns null if the path is not of the format of a valid storage path.
+ *
+ * @param $storagePath string
+ * @return string|null
+ */
+ final public static function normalizeStoragePath( $storagePath ) {
+ list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
+ if ( $relPath !== null ) { // must be for this backend
+ $relPath = self::normalizeContainerPath( $relPath );
+ if ( $relPath !== null ) {
+ return ( $relPath != '' )
+ ? "mwstore://{$backend}/{$container}/{$relPath}"
+ : "mwstore://{$backend}/{$container}";
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Validate and normalize a relative storage path.
+ * Null is returned if the path involves directory traversal.
+ * Traversal is insecure for FS backends and broken for others.
+ *
+ * @param $path string Storage path relative to a container
+ * @return string|null
+ */
+ final protected static function normalizeContainerPath( $path ) {
+ // Normalize directory separators
+ $path = strtr( $path, '\\', '/' );
+ // Collapse any consecutive directory separators
+ $path = preg_replace( '![/]{2,}!', '/', $path );
+ // Remove any leading directory separator
+ $path = ltrim( $path, '/' );
+ // Use the same traversal protection as Title::secureAndSplit()
+ if ( strpos( $path, '.' ) !== false ) {
+ if (
+ $path === '.' ||
+ $path === '..' ||
+ strpos( $path, './' ) === 0 ||
+ strpos( $path, '../' ) === 0 ||
+ strpos( $path, '/./' ) !== false ||
+ strpos( $path, '/../' ) !== false
+ ) {
+ return null;
+ }
+ }
+ return $path;
+ }
+
+ /**
+ * Get the parent storage directory of a storage path.
+ * This returns a path like "mwstore://backend/container",
+ * "mwstore://backend/container/...", or null if there is no parent.
+ *
+ * @param $storagePath string
+ * @return string|null
+ */
+ final public static function parentStoragePath( $storagePath ) {
+ $storagePath = dirname( $storagePath );
+ list( $b, $cont, $rel ) = self::splitStoragePath( $storagePath );
+ return ( $rel === null ) ? null : $storagePath;
+ }
+
+ /**
+ * Get the final extension from a storage or FS path
+ *
+ * @param $path string
+ * @return string
+ */
+ final public static function extensionFromPath( $path ) {
+ $i = strrpos( $path, '.' );
+ return strtolower( $i ? substr( $path, $i + 1 ) : '' );
+ }
+}
+
+/**
+ * @brief Base class for all backends associated with a particular storage medium.
+ *
+ * This class defines the methods as abstract that subclasses must implement.
+ * Outside callers should *not* use functions with "Internal" in the name.
+ *
+ * The FileBackend operations are implemented using basic functions
+ * such as storeInternal(), copyInternal(), deleteInternal() and the like.
+ * This class is also responsible for path resolution and sanitization.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+abstract class FileBackendStore extends FileBackend {
+ /** @var Array Map of paths to small (RAM/disk) cache items */
+ protected $cache = array(); // (storage path => key => value)
+ protected $maxCacheSize = 100; // integer; max paths with entries
+ /** @var Array Map of paths to large (RAM/disk) cache items */
+ protected $expensiveCache = array(); // (storage path => key => value)
+ protected $maxExpensiveCacheSize = 10; // integer; max paths with entries
+
+ /** @var Array Map of container names to sharding settings */
+ protected $shardViaHashLevels = array(); // (container name => config array)
+
+ protected $maxFileSize = 1000000000; // integer bytes (1GB)
+
+ /**
+ * Get the maximum allowable file size given backend
+ * medium restrictions and basic performance constraints.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * @return integer Bytes
+ */
+ final public function maxFileSizeInternal() {
+ return $this->maxFileSize;
+ }
+
+ /**
+ * Check if a file can be created at a given storage path.
+ * FS backends should check if the parent directory exists and the file is writable.
+ * Backends using key/value stores should check if the container exists.
+ *
+ * @param $storagePath string
+ * @return bool
+ */
+ abstract public function isPathUsableInternal( $storagePath );
+
+ /**
+ * Create a file in the backend with the given contents.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * $params include:
+ * content : the raw file contents
+ * dst : destination storage path
+ * overwrite : overwrite any file that exists at the destination
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function createInternal( array $params ) {
+ wfProfileIn( __METHOD__ );
+ if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
+ $status = Status::newFatal( 'backend-fail-create', $params['dst'] );
+ } else {
+ $status = $this->doCreateInternal( $params );
+ $this->clearCache( array( $params['dst'] ) );
+ }
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::createInternal()
+ */
+ abstract protected function doCreateInternal( array $params );
+
+ /**
+ * Store a file into the backend from a file on disk.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * $params include:
+ * src : source path on disk
+ * dst : destination storage path
+ * overwrite : overwrite any file that exists at the destination
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function storeInternal( array $params ) {
+ wfProfileIn( __METHOD__ );
+ if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
+ $status = Status::newFatal( 'backend-fail-store', $params['dst'] );
+ } else {
+ $status = $this->doStoreInternal( $params );
+ $this->clearCache( array( $params['dst'] ) );
+ }
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::storeInternal()
+ */
+ abstract protected function doStoreInternal( array $params );
+
+ /**
+ * Copy a file from one storage path to another in the backend.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * $params include:
+ * src : source storage path
+ * dst : destination storage path
+ * overwrite : overwrite any file that exists at the destination
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function copyInternal( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = $this->doCopyInternal( $params );
+ $this->clearCache( array( $params['dst'] ) );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::copyInternal()
+ */
+ abstract protected function doCopyInternal( array $params );
+
+ /**
+ * Delete a file at the storage path.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * $params include:
+ * src : source storage path
+ * ignoreMissingSource : do nothing if the source file does not exist
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function deleteInternal( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = $this->doDeleteInternal( $params );
+ $this->clearCache( array( $params['src'] ) );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::deleteInternal()
+ */
+ abstract protected function doDeleteInternal( array $params );
+
+ /**
+ * Move a file from one storage path to another in the backend.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * $params include:
+ * src : source storage path
+ * dst : destination storage path
+ * overwrite : overwrite any file that exists at the destination
+ *
+ * @param $params Array
+ * @return Status
+ */
+ final public function moveInternal( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = $this->doMoveInternal( $params );
+ $this->clearCache( array( $params['src'], $params['dst'] ) );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::moveInternal()
+ */
+ protected function doMoveInternal( array $params ) {
+ // Copy source to dest
+ $status = $this->copyInternal( $params );
+ if ( $status->isOK() ) {
+ // Delete source (only fails due to races or medium going down)
+ $status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
+ $status->setResult( true, $status->value ); // ignore delete() errors
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::concatenate()
+ */
+ final public function concatenate( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = Status::newGood();
+
+ // Try to lock the source files for the scope of this function
+ $scopeLockS = $this->getScopedFileLocks( $params['srcs'], LockManager::LOCK_UW, $status );
+ if ( $status->isOK() ) {
+ // Actually do the concatenation
+ $status->merge( $this->doConcatenate( $params ) );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::concatenate()
+ */
+ protected function doConcatenate( array $params ) {
+ $status = Status::newGood();
+ $tmpPath = $params['dst']; // convenience
+
+ // Check that the specified temp file is valid...
+ wfSuppressWarnings();
+ $ok = ( is_file( $tmpPath ) && !filesize( $tmpPath ) );
+ wfRestoreWarnings();
+ if ( !$ok ) { // not present or not empty
+ $status->fatal( 'backend-fail-opentemp', $tmpPath );
+ return $status;
+ }
+
+ // Build up the temp file using the source chunks (in order)...
+ $tmpHandle = fopen( $tmpPath, 'ab' );
+ if ( $tmpHandle === false ) {
+ $status->fatal( 'backend-fail-opentemp', $tmpPath );
+ return $status;
+ }
+ foreach ( $params['srcs'] as $virtualSource ) {
+ // Get a local FS version of the chunk
+ $tmpFile = $this->getLocalReference( array( 'src' => $virtualSource ) );
+ if ( !$tmpFile ) {
+ $status->fatal( 'backend-fail-read', $virtualSource );
+ return $status;
+ }
+ // Get a handle to the local FS version
+ $sourceHandle = fopen( $tmpFile->getPath(), 'r' );
+ if ( $sourceHandle === false ) {
+ fclose( $tmpHandle );
+ $status->fatal( 'backend-fail-read', $virtualSource );
+ return $status;
+ }
+ // Append chunk to file (pass chunk size to avoid magic quotes)
+ if ( !stream_copy_to_stream( $sourceHandle, $tmpHandle ) ) {
+ fclose( $sourceHandle );
+ fclose( $tmpHandle );
+ $status->fatal( 'backend-fail-writetemp', $tmpPath );
+ return $status;
+ }
+ fclose( $sourceHandle );
+ }
+ if ( !fclose( $tmpHandle ) ) {
+ $status->fatal( 'backend-fail-closetemp', $tmpPath );
+ return $status;
+ }
+
+ clearstatcache(); // temp file changed
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::doPrepare()
+ */
+ final protected function doPrepare( array $params ) {
+ wfProfileIn( __METHOD__ );
+
+ $status = Status::newGood();
+ list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+ if ( $dir === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+ wfProfileOut( __METHOD__ );
+ return $status; // invalid storage path
+ }
+
+ if ( $shard !== null ) { // confined to a single container/shard
+ $status->merge( $this->doPrepareInternal( $fullCont, $dir, $params ) );
+ } else { // directory is on several shards
+ wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+ list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+ $status->merge( $this->doPrepareInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doPrepare()
+ */
+ protected function doPrepareInternal( $container, $dir, array $params ) {
+ return Status::newGood();
+ }
+
+ /**
+ * @see FileBackend::doSecure()
+ */
+ final protected function doSecure( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = Status::newGood();
+
+ list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+ if ( $dir === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+ wfProfileOut( __METHOD__ );
+ return $status; // invalid storage path
+ }
+
+ if ( $shard !== null ) { // confined to a single container/shard
+ $status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
+ } else { // directory is on several shards
+ wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+ list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+ $status->merge( $this->doSecureInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doSecure()
+ */
+ protected function doSecureInternal( $container, $dir, array $params ) {
+ return Status::newGood();
+ }
+
+ /**
+ * @see FileBackend::doClean()
+ */
+ final protected function doClean( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = Status::newGood();
+
+ list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+ if ( $dir === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
+ wfProfileOut( __METHOD__ );
+ return $status; // invalid storage path
+ }
+
+ // Attempt to lock this directory...
+ $filesLockEx = array( $params['dir'] );
+ $scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+ if ( !$status->isOK() ) {
+ wfProfileOut( __METHOD__ );
+ return $status; // abort
+ }
+
+ if ( $shard !== null ) { // confined to a single container/shard
+ $status->merge( $this->doCleanInternal( $fullCont, $dir, $params ) );
+ } else { // directory is on several shards
+ wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+ list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+ $status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doClean()
+ */
+ protected function doCleanInternal( $container, $dir, array $params ) {
+ return Status::newGood();
+ }
+
+ /**
+ * @see FileBackend::fileExists()
+ */
+ final public function fileExists( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $stat = $this->getFileStat( $params );
+ wfProfileOut( __METHOD__ );
+ return ( $stat === null ) ? null : (bool)$stat; // null => failure
+ }
+
+ /**
+ * @see FileBackend::getFileTimestamp()
+ */
+ final public function getFileTimestamp( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $stat = $this->getFileStat( $params );
+ wfProfileOut( __METHOD__ );
+ return $stat ? $stat['mtime'] : false;
+ }
+
+ /**
+ * @see FileBackend::getFileSize()
+ */
+ final public function getFileSize( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $stat = $this->getFileStat( $params );
+ wfProfileOut( __METHOD__ );
+ return $stat ? $stat['size'] : false;
+ }
+
+ /**
+ * @see FileBackend::getFileStat()
+ */
+ final public function getFileStat( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $path = self::normalizeStoragePath( $params['src'] );
+ if ( $path === null ) {
+ return false; // invalid storage path
+ }
+ $latest = !empty( $params['latest'] );
+ if ( isset( $this->cache[$path]['stat'] ) ) {
+ // If we want the latest data, check that this cached
+ // value was in fact fetched with the latest available data.
+ if ( !$latest || $this->cache[$path]['stat']['latest'] ) {
+ wfProfileOut( __METHOD__ );
+ return $this->cache[$path]['stat'];
+ }
+ }
+ $stat = $this->doGetFileStat( $params );
+ if ( is_array( $stat ) ) { // don't cache negatives
+ $this->trimCache(); // limit memory
+ $this->cache[$path]['stat'] = $stat;
+ $this->cache[$path]['stat']['latest'] = $latest;
+ }
+ wfProfileOut( __METHOD__ );
+ return $stat;
+ }
+
+ /**
+ * @see FileBackendStore::getFileStat()
+ */
+ abstract protected function doGetFileStat( array $params );
+
+ /**
+ * @see FileBackend::getFileContents()
+ */
+ public function getFileContents( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $tmpFile = $this->getLocalReference( $params );
+ if ( !$tmpFile ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ wfSuppressWarnings();
+ $data = file_get_contents( $tmpFile->getPath() );
+ wfRestoreWarnings();
+ wfProfileOut( __METHOD__ );
+ return $data;
+ }
+
+ /**
+ * @see FileBackend::getFileSha1Base36()
+ */
+ final public function getFileSha1Base36( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $path = $params['src'];
+ if ( isset( $this->cache[$path]['sha1'] ) ) {
+ wfProfileOut( __METHOD__ );
+ return $this->cache[$path]['sha1'];
+ }
+ $hash = $this->doGetFileSha1Base36( $params );
+ if ( $hash ) { // don't cache negatives
+ $this->trimCache(); // limit memory
+ $this->cache[$path]['sha1'] = $hash;
+ }
+ wfProfileOut( __METHOD__ );
+ return $hash;
+ }
+
+ /**
+ * @see FileBackendStore::getFileSha1Base36()
+ */
+ protected function doGetFileSha1Base36( array $params ) {
+ $fsFile = $this->getLocalReference( $params );
+ if ( !$fsFile ) {
+ return false;
+ } else {
+ return $fsFile->getSha1Base36();
+ }
+ }
+
+ /**
+ * @see FileBackend::getFileProps()
+ */
+ final public function getFileProps( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $fsFile = $this->getLocalReference( $params );
+ $props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
+ wfProfileOut( __METHOD__ );
+ return $props;
+ }
+
+ /**
+ * @see FileBackend::getLocalReference()
+ */
+ public function getLocalReference( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $path = $params['src'];
+ if ( isset( $this->expensiveCache[$path]['localRef'] ) ) {
+ wfProfileOut( __METHOD__ );
+ return $this->expensiveCache[$path]['localRef'];
+ }
+ $tmpFile = $this->getLocalCopy( $params );
+ if ( $tmpFile ) { // don't cache negatives
+ $this->trimExpensiveCache(); // limit memory
+ $this->expensiveCache[$path]['localRef'] = $tmpFile;
+ }
+ wfProfileOut( __METHOD__ );
+ return $tmpFile;
+ }
+
+ /**
+ * @see FileBackend::streamFile()
+ */
+ final public function streamFile( array $params ) {
+ wfProfileIn( __METHOD__ );
+ $status = Status::newGood();
+
+ $info = $this->getFileStat( $params );
+ if ( !$info ) { // let StreamFile handle the 404
+ $status->fatal( 'backend-fail-notexists', $params['src'] );
+ }
+
+ // Set output buffer and HTTP headers for stream
+ $extraHeaders = isset( $params['headers'] ) ? $params['headers'] : array();
+ $res = StreamFile::prepareForStream( $params['src'], $info, $extraHeaders );
+ if ( $res == StreamFile::NOT_MODIFIED ) {
+ // do nothing; client cache is up to date
+ } elseif ( $res == StreamFile::READY_STREAM ) {
+ $status = $this->doStreamFile( $params );
+ } else {
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::streamFile()
+ */
+ protected function doStreamFile( array $params ) {
+ $status = Status::newGood();
+
+ $fsFile = $this->getLocalReference( $params );
+ if ( !$fsFile ) {
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ } elseif ( !readfile( $fsFile->getPath() ) ) {
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @copydoc FileBackend::getFileList()
+ */
+ final public function getFileList( array $params ) {
+ list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+ if ( $dir === null ) { // invalid storage path
+ return null;
+ }
+ if ( $shard !== null ) {
+ // File listing is confined to a single container/shard
+ return $this->getFileListInternal( $fullCont, $dir, $params );
+ } else {
+ wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+ // File listing spans multiple containers/shards
+ list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ return new FileBackendStoreShardListIterator( $this,
+ $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
+ }
+ }
+
+ /**
+ * Do not call this function from places outside FileBackend
+ *
+ * @see FileBackendStore::getFileList()
+ *
+ * @param $container string Resolved container name
+ * @param $dir string Resolved path relative to container
+ * @param $params Array
+ * @return Traversable|Array|null
+ */
+ abstract public function getFileListInternal( $container, $dir, array $params );
+
+ /**
+ * Get the list of supported operations and their corresponding FileOp classes.
+ *
+ * @return Array
+ */
+ protected function supportedOperations() {
+ return array(
+ 'store' => 'StoreFileOp',
+ 'copy' => 'CopyFileOp',
+ 'move' => 'MoveFileOp',
+ 'delete' => 'DeleteFileOp',
+ 'create' => 'CreateFileOp',
+ 'null' => 'NullFileOp'
+ );
+ }
+
+ /**
+ * Return a list of FileOp objects from a list of operations.
+ * Do not call this function from places outside FileBackend.
+ *
+ * The result must have the same number of items as the input.
+ * An exception is thrown if an unsupported operation is requested.
+ *
+ * @param $ops Array Same format as doOperations()
+ * @return Array List of FileOp objects
+ * @throws MWException
+ */
+ final public function getOperations( array $ops ) {
+ $supportedOps = $this->supportedOperations();
+
+ $performOps = array(); // array of FileOp objects
+ // Build up ordered array of FileOps...
+ foreach ( $ops as $operation ) {
+ $opName = $operation['op'];
+ if ( isset( $supportedOps[$opName] ) ) {
+ $class = $supportedOps[$opName];
+ // Get params for this operation
+ $params = $operation;
+ // Append the FileOp class
+ $performOps[] = new $class( $this, $params );
+ } else {
+ throw new MWException( "Operation `$opName` is not supported." );
+ }
+ }
+
+ return $performOps;
+ }
+
+ /**
+ * @see FileBackend::doOperationsInternal()
+ */
+ protected function doOperationsInternal( array $ops, array $opts ) {
+ wfProfileIn( __METHOD__ );
+ $status = Status::newGood();
+
+ // Build up a list of FileOps...
+ $performOps = $this->getOperations( $ops );
+
+ // Acquire any locks as needed...
+ if ( empty( $opts['nonLocking'] ) ) {
+ // Build up a list of files to lock...
+ $filesLockEx = $filesLockSh = array();
+ foreach ( $performOps as $fileOp ) {
+ $filesLockSh = array_merge( $filesLockSh, $fileOp->storagePathsRead() );
+ $filesLockEx = array_merge( $filesLockEx, $fileOp->storagePathsChanged() );
+ }
+ // Optimization: if doing an EX lock anyway, don't also set an SH one
+ $filesLockSh = array_diff( $filesLockSh, $filesLockEx );
+ // Get a shared lock on the parent directory of each path changed
+ $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
+ // Try to lock those files for the scope of this function...
+ $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
+ $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+ if ( !$status->isOK() ) {
+ wfProfileOut( __METHOD__ );
+ return $status; // abort
+ }
+ }
+
+ // Clear any cache entries (after locks acquired)
+ $this->clearCache();
+
+ // Actually attempt the operation batch...
+ $subStatus = FileOp::attemptBatch( $performOps, $opts );
+
+ // Merge errors into status fields
+ $status->merge( $subStatus );
+ $status->success = $subStatus->success; // not done in merge()
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::clearCache()
+ */
+ final public function clearCache( array $paths = null ) {
+ if ( is_array( $paths ) ) {
+ $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
+ $paths = array_filter( $paths, 'strlen' ); // remove nulls
+ }
+ if ( $paths === null ) {
+ $this->cache = array();
+ $this->expensiveCache = array();
+ } else {
+ foreach ( $paths as $path ) {
+ unset( $this->cache[$path] );
+ unset( $this->expensiveCache[$path] );
+ }
+ }
+ $this->doClearCache( $paths );
+ }
+
+ /**
+ * Clears any additional stat caches for storage paths
+ *
+ * @see FileBackend::clearCache()
+ *
+ * @param $paths Array Storage paths (optional)
+ * @return void
+ */
+ protected function doClearCache( array $paths = null ) {}
+
+ /**
+ * Prune the inexpensive cache if it is too big to add an item
+ *
+ * @return void
+ */
+ protected function trimCache() {
+ if ( count( $this->cache ) >= $this->maxCacheSize ) {
+ reset( $this->cache );
+ unset( $this->cache[key( $this->cache )] );
+ }
+ }
+
+ /**
+ * Prune the expensive cache if it is too big to add an item
+ *
+ * @return void
+ */
+ protected function trimExpensiveCache() {
+ if ( count( $this->expensiveCache ) >= $this->maxExpensiveCacheSize ) {
+ reset( $this->expensiveCache );
+ unset( $this->expensiveCache[key( $this->expensiveCache )] );
+ }
+ }
+
+ /**
+ * Check if a container name is valid.
+ * This checks for for length and illegal characters.
+ *
+ * @param $container string
+ * @return bool
+ */
+ final protected static function isValidContainerName( $container ) {
+ // This accounts for Swift and S3 restrictions while leaving room
+ // for things like '.xxx' (hex shard chars) or '.seg' (segments).
+ // This disallows directory separators or traversal characters.
+ // Note that matching strings URL encode to the same string;
+ // in Swift, the length restriction is *after* URL encoding.
+ return preg_match( '/^[a-z0-9][a-z0-9-_]{0,199}$/i', $container );
+ }
+
+ /**
+ * Splits a storage path into an internal container name,
+ * an internal relative file name, and a container shard suffix.
+ * Any shard suffix is already appended to the internal container name.
+ * This also checks that the storage path is valid and within this backend.
+ *
+ * If the container is sharded but a suffix could not be determined,
+ * 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
+ * @return Array (container, path, container suffix) or (null, null, null) if invalid
+ */
+ final protected function resolveStoragePath( $storagePath ) {
+ list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
+ if ( $backend === $this->name ) { // must be for this backend
+ $relPath = self::normalizeContainerPath( $relPath );
+ if ( $relPath !== null ) {
+ // Get shard for the normalized path if this container is sharded
+ $cShard = $this->getContainerShard( $container, $relPath );
+ // Validate and sanitize the relative path (backend-specific)
+ $relPath = $this->resolveContainerPath( $container, $relPath );
+ if ( $relPath !== null ) {
+ // Prepend any wiki ID prefix to the container name
+ $container = $this->fullContainerName( $container );
+ if ( self::isValidContainerName( $container ) ) {
+ // Validate and sanitize the container name (backend-specific)
+ $container = $this->resolveContainerName( "{$container}{$cShard}" );
+ if ( $container !== null ) {
+ return array( $container, $relPath, $cShard );
+ }
+ }
+ }
+ }
+ }
+ return array( null, null, null );
+ }
+
+ /**
+ * Like resolveStoragePath() except null values are returned if
+ * the container is sharded and the shard could not be determined.
+ *
+ * @see FileBackendStore::resolveStoragePath()
+ *
+ * @param $storagePath string
+ * @return Array (container, path) or (null, null) if invalid
+ */
+ final protected function resolveStoragePathReal( $storagePath ) {
+ list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
+ if ( $cShard !== null ) {
+ return array( $container, $relPath );
+ }
+ return array( null, null );
+ }
+
+ /**
+ * Get the container name shard suffix for a given path.
+ * Any empty suffix means the container is not sharded.
+ *
+ * @param $container string Container name
+ * @param $relStoragePath string Storage path relative to the container
+ * @return string|null Returns null if shard could not be determined
+ */
+ final protected function getContainerShard( $container, $relPath ) {
+ list( $levels, $base, $repeat ) = $this->getContainerHashLevels( $container );
+ if ( $levels == 1 || $levels == 2 ) {
+ // Hash characters are either base 16 or 36
+ $char = ( $base == 36 ) ? '[0-9a-z]' : '[0-9a-f]';
+ // Get a regex that represents the shard portion of paths.
+ // The concatenation of the captures gives us the shard.
+ if ( $levels === 1 ) { // 16 or 36 shards per container
+ $hashDirRegex = '(' . $char . ')';
+ } else { // 256 or 1296 shards per container
+ if ( $repeat ) { // verbose hash dir format (e.g. "a/ab/abc")
+ $hashDirRegex = $char . '/(' . $char . '{2})';
+ } else { // short hash dir format (e.g. "a/b/c")
+ $hashDirRegex = '(' . $char . ')/(' . $char . ')';
+ }
+ }
+ // Allow certain directories to be above the hash dirs so as
+ // to work with FileRepo (e.g. "archive/a/ab" or "temp/a/ab").
+ // They must be 2+ chars to avoid any hash directory ambiguity.
+ $m = array();
+ if ( preg_match( "!^(?:[^/]{2,}/)*$hashDirRegex(?:/|$)!", $relPath, $m ) ) {
+ return '.' . implode( '', array_slice( $m, 1 ) );
+ }
+ return null; // failed to match
+ }
+ return ''; // no sharding
+ }
+
+ /**
+ * Get the sharding config for a container.
+ * If greater than 0, then all file storage paths within
+ * the container are required to be hashed accordingly.
+ *
+ * @param $container string
+ * @return Array (integer levels, integer base, repeat flag) or (0, 0, false)
+ */
+ final protected function getContainerHashLevels( $container ) {
+ if ( isset( $this->shardViaHashLevels[$container] ) ) {
+ $config = $this->shardViaHashLevels[$container];
+ $hashLevels = (int)$config['levels'];
+ if ( $hashLevels == 1 || $hashLevels == 2 ) {
+ $hashBase = (int)$config['base'];
+ if ( $hashBase == 16 || $hashBase == 36 ) {
+ return array( $hashLevels, $hashBase, $config['repeat'] );
+ }
+ }
+ }
+ return array( 0, 0, false ); // no sharding
+ }
+
+ /**
+ * Get a list of full container shard suffixes for a container
+ *
+ * @param $container string
+ * @return Array
+ */
+ final protected function getContainerSuffixes( $container ) {
+ $shards = array();
+ list( $digits, $base ) = $this->getContainerHashLevels( $container );
+ if ( $digits > 0 ) {
+ $numShards = pow( $base, $digits );
+ for ( $index = 0; $index < $numShards; $index++ ) {
+ $shards[] = '.' . wfBaseConvert( $index, 10, $base, $digits );
+ }
+ }
+ return $shards;
+ }
+
+ /**
+ * Get the full container name, including the wiki ID prefix
+ *
+ * @param $container string
+ * @return string
+ */
+ final protected function fullContainerName( $container ) {
+ if ( $this->wikiId != '' ) {
+ return "{$this->wikiId}-$container";
+ } else {
+ return $container;
+ }
+ }
+
+ /**
+ * Resolve a container name, checking if it's allowed by the backend.
+ * This is intended for internal use, such as encoding illegal chars.
+ * Subclasses can override this to be more restrictive.
+ *
+ * @param $container string
+ * @return string|null
+ */
+ protected function resolveContainerName( $container ) {
+ return $container;
+ }
+
+ /**
+ * Resolve a relative storage path, checking if it's allowed by the backend.
+ * This is intended for internal use, such as encoding illegal chars or perhaps
+ * getting absolute paths (e.g. FS based backends). Note that the relative path
+ * may be the empty string (e.g. the path is simply to the container).
+ *
+ * @param $container string Container name
+ * @param $relStoragePath string Storage path relative to the container
+ * @return string|null Path or null if not valid
+ */
+ protected function resolveContainerPath( $container, $relStoragePath ) {
+ return $relStoragePath;
+ }
+}
+
+/**
+ * FileBackendStore helper function to handle file listings that span container shards.
+ * Do not use this class from places outside of FileBackendStore.
+ *
+ * @ingroup FileBackend
+ */
+class FileBackendStoreShardListIterator implements Iterator {
+ /* @var FileBackendStore */
+ protected $backend;
+ /* @var Array */
+ protected $params;
+ /* @var Array */
+ protected $shardSuffixes;
+ protected $container; // string
+ protected $directory; // string
+
+ /* @var Traversable */
+ protected $iter;
+ protected $curShard = 0; // integer
+ protected $pos = 0; // integer
+
+ /**
+ * @param $backend FileBackendStore
+ * @param $container string Full storage container name
+ * @param $dir string Storage directory relative to container
+ * @param $suffixes Array List of container shard suffixes
+ * @param $params Array
+ */
+ public function __construct(
+ FileBackendStore $backend, $container, $dir, array $suffixes, array $params
+ ) {
+ $this->backend = $backend;
+ $this->container = $container;
+ $this->directory = $dir;
+ $this->shardSuffixes = $suffixes;
+ $this->params = $params;
+ }
+
+ public function current() {
+ if ( is_array( $this->iter ) ) {
+ return current( $this->iter );
+ } else {
+ return $this->iter->current();
+ }
+ }
+
+ public function key() {
+ return $this->pos;
+ }
+
+ public function next() {
+ ++$this->pos;
+ if ( is_array( $this->iter ) ) {
+ next( $this->iter );
+ } else {
+ $this->iter->next();
+ }
+ // Find the next non-empty shard if no elements are left
+ $this->nextShardIteratorIfNotValid();
+ }
+
+ /**
+ * If the 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() ) {
+ if ( ++$this->curShard >= count( $this->shardSuffixes ) ) {
+ break; // no more container shards
+ }
+ $this->setIteratorFromCurrentShard();
+ }
+ }
+
+ protected function setIteratorFromCurrentShard() {
+ $suffix = $this->shardSuffixes[$this->curShard];
+ $this->iter = $this->backend->getFileListInternal(
+ "{$this->container}{$suffix}", $this->directory, $this->params );
+ }
+
+ public function rewind() {
+ $this->pos = 0;
+ $this->curShard = 0;
+ $this->setIteratorFromCurrentShard();
+ // Find the next non-empty shard if this one has no elements
+ $this->nextShardIteratorIfNotValid();
+ }
+
+ public function valid() {
+ if ( $this->iter == null ) {
+ return false; // some failure?
+ } elseif ( is_array( $this->iter ) ) {
+ return ( current( $this->iter ) !== false ); // no paths can have this value
+ } else {
+ return $this->iter->valid();
+ }
+ }
+}
diff --git a/includes/filerepo/backend/FileBackendGroup.php b/includes/filerepo/backend/FileBackendGroup.php
new file mode 100644
index 00000000..73815cfb
--- /dev/null
+++ b/includes/filerepo/backend/FileBackendGroup.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle file backend registration
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class FileBackendGroup {
+ /**
+ * @var FileBackendGroup
+ */
+ protected static $instance = null;
+
+ /** @var Array (name => ('class' => string, 'config' => array, 'instance' => object)) */
+ protected $backends = array();
+
+ protected function __construct() {}
+ protected function __clone() {}
+
+ /**
+ * @return FileBackendGroup
+ */
+ public static function singleton() {
+ if ( self::$instance == null ) {
+ self::$instance = new self();
+ self::$instance->initFromGlobals();
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Destroy the singleton instance
+ *
+ * @return void
+ */
+ public static function destroySingleton() {
+ self::$instance = null;
+ }
+
+ /**
+ * Register file backends from the global variables
+ *
+ * @return void
+ */
+ protected function initFromGlobals() {
+ global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends;
+
+ // Register explicitly defined backends
+ $this->register( $wgFileBackends );
+
+ $autoBackends = array();
+ // Automatically create b/c backends for file repos...
+ $repos = array_merge( $wgForeignFileRepos, array( $wgLocalFileRepo ) );
+ foreach ( $repos as $info ) {
+ $backendName = $info['backend'];
+ if ( is_object( $backendName ) || isset( $this->backends[$backendName] ) ) {
+ continue; // already defined (or set to the object for some reason)
+ }
+ $repoName = $info['name'];
+ // Local vars that used to be FSRepo members...
+ $directory = $info['directory'];
+ $deletedDir = isset( $info['deletedDir'] )
+ ? $info['deletedDir']
+ : false; // deletion disabled
+ $thumbDir = isset( $info['thumbDir'] )
+ ? $info['thumbDir']
+ : "{$directory}/thumb";
+ $fileMode = isset( $info['fileMode'] )
+ ? $info['fileMode']
+ : 0644;
+ // Get the FS backend configuration
+ $autoBackends[] = array(
+ 'name' => $backendName,
+ 'class' => 'FSFileBackend',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ "{$repoName}-public" => "{$directory}",
+ "{$repoName}-thumb" => $thumbDir,
+ "{$repoName}-deleted" => $deletedDir,
+ "{$repoName}-temp" => "{$directory}/temp"
+ ),
+ 'fileMode' => $fileMode,
+ );
+ }
+
+ // Register implicitly defined backends
+ $this->register( $autoBackends );
+ }
+
+ /**
+ * Register an array of file backend configurations
+ *
+ * @param $configs Array
+ * @return void
+ * @throws MWException
+ */
+ protected function register( array $configs ) {
+ foreach ( $configs as $config ) {
+ if ( !isset( $config['name'] ) ) {
+ throw new MWException( "Cannot register a backend with no name." );
+ }
+ $name = $config['name'];
+ if ( !isset( $config['class'] ) ) {
+ throw new MWException( "Cannot register backend `{$name}` with no class." );
+ }
+ $class = $config['class'];
+
+ unset( $config['class'] ); // backend won't need this
+ $this->backends[$name] = array(
+ 'class' => $class,
+ 'config' => $config,
+ 'instance' => null
+ );
+ }
+ }
+
+ /**
+ * Get the backend object with a given name
+ *
+ * @param $name string
+ * @return FileBackend
+ * @throws MWException
+ */
+ public function get( $name ) {
+ if ( !isset( $this->backends[$name] ) ) {
+ throw new MWException( "No backend defined with the name `$name`." );
+ }
+ // Lazy-load the actual backend instance
+ if ( !isset( $this->backends[$name]['instance'] ) ) {
+ $class = $this->backends[$name]['class'];
+ $config = $this->backends[$name]['config'];
+ $this->backends[$name]['instance'] = new $class( $config );
+ }
+ return $this->backends[$name]['instance'];
+ }
+
+ /**
+ * Get an appropriate backend object from a storage path
+ *
+ * @param $storagePath string
+ * @return FileBackend|null Backend or null on failure
+ */
+ public function backendFromPath( $storagePath ) {
+ list( $backend, $c, $p ) = FileBackend::splitStoragePath( $storagePath );
+ if ( $backend !== null && isset( $this->backends[$backend] ) ) {
+ return $this->get( $backend );
+ }
+ return null;
+ }
+}
diff --git a/includes/filerepo/backend/FileBackendMultiWrite.php b/includes/filerepo/backend/FileBackendMultiWrite.php
new file mode 100644
index 00000000..c0f1ac57
--- /dev/null
+++ b/includes/filerepo/backend/FileBackendMultiWrite.php
@@ -0,0 +1,420 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * This class defines a multi-write backend. Multiple backends can be
+ * registered to this proxy backend and it will act as a single backend.
+ * Use this when all access to those backends is through this proxy backend.
+ * At least one of the backends must be declared the "master" backend.
+ *
+ * Only use this class when transitioning from one storage system to another.
+ *
+ * Read operations are only done on the 'master' backend for consistency.
+ * Write operations are performed on all backends, in the order defined.
+ * If an operation fails on one backend it will be rolled back from the others.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class FileBackendMultiWrite extends FileBackend {
+ /** @var Array Prioritized list of FileBackendStore objects */
+ protected $backends = array(); // array of (backend index => backends)
+ protected $masterIndex = -1; // integer; index of master backend
+ protected $syncChecks = 0; // integer bitfield
+
+ /* Possible internal backend consistency checks */
+ const CHECK_SIZE = 1;
+ const CHECK_TIME = 2;
+
+ /**
+ * Construct a proxy backend that consists of several internal backends.
+ * Additional $config params include:
+ * 'backends' : Array of backend config and multi-backend settings.
+ * Each value is the config used in the constructor of a
+ * FileBackendStore class, but with these additional settings:
+ * 'class' : The name of the backend class
+ * 'isMultiMaster' : This must be set for one backend.
+ * 'syncChecks' : Integer bitfield of internal backend sync checks to perform.
+ * Possible bits include self::CHECK_SIZE and self::CHECK_TIME.
+ * The checks are done before allowing any file operations.
+ * @param $config Array
+ */
+ public function __construct( array $config ) {
+ parent::__construct( $config );
+ $namesUsed = array();
+ // Construct backends here rather than via registration
+ // to keep these backends hidden from outside the proxy.
+ foreach ( $config['backends'] as $index => $config ) {
+ $name = $config['name'];
+ if ( isset( $namesUsed[$name] ) ) { // don't break FileOp predicates
+ throw new MWException( "Two or more backends defined with the name $name." );
+ }
+ $namesUsed[$name] = 1;
+ if ( !isset( $config['class'] ) ) {
+ throw new MWException( 'No class given for a backend config.' );
+ }
+ $class = $config['class'];
+ $this->backends[$index] = new $class( $config );
+ if ( !empty( $config['isMultiMaster'] ) ) {
+ if ( $this->masterIndex >= 0 ) {
+ throw new MWException( 'More than one master backend defined.' );
+ }
+ $this->masterIndex = $index;
+ }
+ }
+ if ( $this->masterIndex < 0 ) { // need backends and must have a master
+ throw new MWException( 'No master backend defined.' );
+ }
+ $this->syncChecks = isset( $config['syncChecks'] )
+ ? $config['syncChecks']
+ : self::CHECK_SIZE;
+ }
+
+ /**
+ * @see FileBackend::doOperationsInternal()
+ */
+ final protected function doOperationsInternal( array $ops, array $opts ) {
+ $status = Status::newGood();
+
+ $performOps = array(); // list of FileOp objects
+ $filesRead = $filesChanged = array(); // storage paths used
+ // Build up a list of FileOps. The list will have all the ops
+ // for one backend, then all the ops for the next, and so on.
+ // These batches of ops are all part of a continuous array.
+ // Also build up a list of files read/changed...
+ foreach ( $this->backends as $index => $backend ) {
+ $backendOps = $this->substOpBatchPaths( $ops, $backend );
+ // Add on the operation batch for this backend
+ $performOps = array_merge( $performOps, $backend->getOperations( $backendOps ) );
+ if ( $index == 0 ) { // first batch
+ // Get the files used for these operations. Each backend has a batch of
+ // the same operations, so we only need to get them from the first batch.
+ foreach ( $performOps as $fileOp ) {
+ $filesRead = array_merge( $filesRead, $fileOp->storagePathsRead() );
+ $filesChanged = array_merge( $filesChanged, $fileOp->storagePathsChanged() );
+ }
+ // Get the paths under the proxy backend's name
+ $filesRead = $this->unsubstPaths( $filesRead );
+ $filesChanged = $this->unsubstPaths( $filesChanged );
+ }
+ }
+
+ // Try to lock those files for the scope of this function...
+ if ( empty( $opts['nonLocking'] ) ) {
+ $filesLockSh = array_diff( $filesRead, $filesChanged ); // optimization
+ $filesLockEx = $filesChanged;
+ // Get a shared lock on the parent directory of each path changed
+ $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
+ // Try to lock those files for the scope of this function...
+ $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
+ $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+ if ( !$status->isOK() ) {
+ return $status; // abort
+ }
+ }
+
+ // Clear any cache entries (after locks acquired)
+ $this->clearCache();
+
+ // Do a consistency check to see if the backends agree
+ if ( count( $this->backends ) > 1 ) {
+ $status->merge( $this->consistencyCheck( array_merge( $filesRead, $filesChanged ) ) );
+ if ( !$status->isOK() ) {
+ return $status; // abort
+ }
+ }
+
+ // Actually attempt the operation batch...
+ $subStatus = FileOp::attemptBatch( $performOps, $opts );
+
+ $success = array();
+ $failCount = $successCount = 0;
+ // Make 'success', 'successCount', and 'failCount' fields reflect
+ // the overall operation, rather than all the batches for each backend.
+ // Do this by only using success values from the master backend's batch.
+ $batchStart = $this->masterIndex * count( $ops );
+ $batchEnd = $batchStart + count( $ops ) - 1;
+ for ( $i = $batchStart; $i <= $batchEnd; $i++ ) {
+ if ( !isset( $subStatus->success[$i] ) ) {
+ break; // failed out before trying this op
+ } elseif ( $subStatus->success[$i] ) {
+ ++$successCount;
+ } else {
+ ++$failCount;
+ }
+ $success[] = $subStatus->success[$i];
+ }
+ $subStatus->success = $success;
+ $subStatus->successCount = $successCount;
+ $subStatus->failCount = $failCount;
+
+ // Merge errors into status fields
+ $status->merge( $subStatus );
+ $status->success = $subStatus->success; // not done in merge()
+
+ return $status;
+ }
+
+ /**
+ * Check that a set of files are consistent across all internal backends
+ *
+ * @param $paths Array
+ * @return Status
+ */
+ public function consistencyCheck( array $paths ) {
+ $status = Status::newGood();
+ if ( $this->syncChecks == 0 ) {
+ return $status; // skip checks
+ }
+
+ $mBackend = $this->backends[$this->masterIndex];
+ foreach ( array_unique( $paths ) as $path ) {
+ $params = array( 'src' => $path, 'latest' => true );
+ // Stat the file on the 'master' backend
+ $mStat = $mBackend->getFileStat( $this->substOpPaths( $params, $mBackend ) );
+ // Check of all clone backends agree with the master...
+ foreach ( $this->backends as $index => $cBackend ) {
+ if ( $index === $this->masterIndex ) {
+ continue; // master
+ }
+ $cStat = $cBackend->getFileStat( $this->substOpPaths( $params, $cBackend ) );
+ if ( $mStat ) { // file is in master
+ if ( !$cStat ) { // file should exist
+ $status->fatal( 'backend-fail-synced', $path );
+ continue;
+ }
+ if ( $this->syncChecks & self::CHECK_SIZE ) {
+ if ( $cStat['size'] != $mStat['size'] ) { // wrong size
+ $status->fatal( 'backend-fail-synced', $path );
+ continue;
+ }
+ }
+ if ( $this->syncChecks & self::CHECK_TIME ) {
+ $mTs = wfTimestamp( TS_UNIX, $mStat['mtime'] );
+ $cTs = wfTimestamp( TS_UNIX, $cStat['mtime'] );
+ if ( abs( $mTs - $cTs ) > 30 ) { // outdated file somewhere
+ $status->fatal( 'backend-fail-synced', $path );
+ continue;
+ }
+ }
+ } else { // file is not in master
+ if ( $cStat ) { // file should not exist
+ $status->fatal( 'backend-fail-synced', $path );
+ }
+ }
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * Substitute the backend name in storage path parameters
+ * for a set of operations with that of a given internal backend.
+ *
+ * @param $ops Array List of file operation arrays
+ * @param $backend FileBackendStore
+ * @return Array
+ */
+ protected function substOpBatchPaths( array $ops, FileBackendStore $backend ) {
+ $newOps = array(); // operations
+ foreach ( $ops as $op ) {
+ $newOp = $op; // operation
+ foreach ( array( 'src', 'srcs', 'dst', 'dir' ) as $par ) {
+ if ( isset( $newOp[$par] ) ) { // string or array
+ $newOp[$par] = $this->substPaths( $newOp[$par], $backend );
+ }
+ }
+ $newOps[] = $newOp;
+ }
+ return $newOps;
+ }
+
+ /**
+ * Same as substOpBatchPaths() but for a single operation
+ *
+ * @param $op File operation array
+ * @param $backend FileBackendStore
+ * @return Array
+ */
+ protected function substOpPaths( array $ops, FileBackendStore $backend ) {
+ $newOps = $this->substOpBatchPaths( array( $ops ), $backend );
+ return $newOps[0];
+ }
+
+ /**
+ * Substitute the backend of storage paths with an internal backend's name
+ *
+ * @param $paths Array|string List of paths or single string path
+ * @param $backend FileBackendStore
+ * @return Array|string
+ */
+ protected function substPaths( $paths, FileBackendStore $backend ) {
+ return preg_replace(
+ '!^mwstore://' . preg_quote( $this->name ) . '/!',
+ StringUtils::escapeRegexReplacement( "mwstore://{$backend->getName()}/" ),
+ $paths // string or array
+ );
+ }
+
+ /**
+ * Substitute the backend of internal storage paths with the proxy backend's name
+ *
+ * @param $paths Array|string List of paths or single string path
+ * @return Array|string
+ */
+ protected function unsubstPaths( $paths ) {
+ return preg_replace(
+ '!^mwstore://([^/]+)!',
+ StringUtils::escapeRegexReplacement( "mwstore://{$this->name}" ),
+ $paths // string or array
+ );
+ }
+
+ /**
+ * @see FileBackend::doPrepare()
+ */
+ public function doPrepare( array $params ) {
+ $status = Status::newGood();
+ foreach ( $this->backends as $backend ) {
+ $realParams = $this->substOpPaths( $params, $backend );
+ $status->merge( $backend->doPrepare( $realParams ) );
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::doSecure()
+ */
+ public function doSecure( array $params ) {
+ $status = Status::newGood();
+ foreach ( $this->backends as $backend ) {
+ $realParams = $this->substOpPaths( $params, $backend );
+ $status->merge( $backend->doSecure( $realParams ) );
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::doClean()
+ */
+ public function doClean( array $params ) {
+ $status = Status::newGood();
+ foreach ( $this->backends as $backend ) {
+ $realParams = $this->substOpPaths( $params, $backend );
+ $status->merge( $backend->doClean( $realParams ) );
+ }
+ return $status;
+ }
+
+ /**
+ * @see FileBackend::getFileList()
+ */
+ 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()
+ */
+ public function fileExists( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->fileExists( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileTimestamp()
+ */
+ public function getFileTimestamp( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileSize()
+ */
+ public function getFileSize( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getFileSize( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileStat()
+ */
+ public function getFileStat( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getFileStat( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileContents()
+ */
+ public function getFileContents( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getFileContents( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileSha1Base36()
+ */
+ public function getFileSha1Base36( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileProps()
+ */
+ public function getFileProps( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getFileProps( $realParams );
+ }
+
+ /**
+ * @see FileBackend::streamFile()
+ */
+ public function streamFile( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->streamFile( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getLocalReference()
+ */
+ public function getLocalReference( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getLocalReference( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getLocalCopy()
+ */
+ public function getLocalCopy( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
+ }
+
+ /**
+ * @see FileBackend::getFileList()
+ */
+ 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;
+ $backend->clearCache( $realPaths );
+ }
+ }
+}
diff --git a/includes/filerepo/backend/FileOp.php b/includes/filerepo/backend/FileOp.php
new file mode 100644
index 00000000..5844c9f2
--- /dev/null
+++ b/includes/filerepo/backend/FileOp.php
@@ -0,0 +1,697 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Helper class for representing operations with transaction support.
+ * Do not use this class from places outside FileBackend.
+ *
+ * Methods called from attemptBatch() should avoid throwing exceptions at all costs.
+ * FileOp objects should be lightweight in order to support large arrays in memory.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+abstract class FileOp {
+ /** @var Array */
+ protected $params = array();
+ /** @var FileBackendStore */
+ protected $backend;
+
+ protected $state = self::STATE_NEW; // integer
+ protected $failed = false; // boolean
+ protected $useLatest = true; // boolean
+
+ protected $sourceSha1; // string
+ protected $destSameAsSource; // boolean
+
+ /* Object life-cycle */
+ const STATE_NEW = 1;
+ const STATE_CHECKED = 2;
+ const STATE_ATTEMPTED = 3;
+
+ /* Timeout related parameters */
+ const MAX_BATCH_SIZE = 1000;
+ const TIME_LIMIT_SEC = 300; // 5 minutes
+
+ /**
+ * Build a new file operation transaction
+ *
+ * @params $backend FileBackendStore
+ * @params $params Array
+ * @throws MWException
+ */
+ final public function __construct( FileBackendStore $backend, array $params ) {
+ $this->backend = $backend;
+ list( $required, $optional ) = $this->allowedParams();
+ foreach ( $required as $name ) {
+ if ( isset( $params[$name] ) ) {
+ $this->params[$name] = $params[$name];
+ } else {
+ throw new MWException( "File operation missing parameter '$name'." );
+ }
+ }
+ foreach ( $optional as $name ) {
+ if ( isset( $params[$name] ) ) {
+ $this->params[$name] = $params[$name];
+ }
+ }
+ $this->params = $params;
+ }
+
+ /**
+ * Allow stale data for file reads and existence checks
+ *
+ * @return void
+ */
+ final protected function allowStaleReads() {
+ $this->useLatest = false;
+ }
+
+ /**
+ * Attempt a series of file operations.
+ * Callers are responsible for handling file locking.
+ *
+ * $opts is an array of options, including:
+ * 'force' : Errors that would normally cause a rollback do not.
+ * The remaining operations are still attempted if any fail.
+ * 'allowStale' : Don't require the latest available data.
+ * This can increase performance for non-critical writes.
+ * This has no effect unless the 'force' flag is set.
+ *
+ * The resulting Status will be "OK" unless:
+ * a) unexpected operation errors occurred (network partitions, disk full...)
+ * b) significant operation errors occured and 'force' was not set
+ *
+ * @param $performOps Array List of FileOp operations
+ * @param $opts Array Batch operation options
+ * @return Status
+ */
+ final public static function attemptBatch( array $performOps, array $opts ) {
+ $status = Status::newGood();
+
+ $allowStale = !empty( $opts['allowStale'] );
+ $ignoreErrors = !empty( $opts['force'] );
+
+ $n = count( $performOps );
+ if ( $n > self::MAX_BATCH_SIZE ) {
+ $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
+ return $status;
+ }
+
+ $predicates = FileOp::newPredicates(); // account for previous op in prechecks
+ // Do pre-checks for each operation; abort on failure...
+ foreach ( $performOps as $index => $fileOp ) {
+ if ( $allowStale ) {
+ $fileOp->allowStaleReads(); // allow potentially stale reads
+ }
+ $subStatus = $fileOp->precheck( $predicates );
+ $status->merge( $subStatus );
+ if ( !$subStatus->isOK() ) { // operation failed?
+ $status->success[$index] = false;
+ ++$status->failCount;
+ if ( !$ignoreErrors ) {
+ return $status; // abort
+ }
+ }
+ }
+
+ if ( $ignoreErrors ) {
+ # Treat all precheck() fatals as merely warnings
+ $status->setResult( true, $status->value );
+ }
+
+ // Restart PHP's execution timer and set the timeout to safe amount.
+ // This handles cases where the operations take a long time or where we are
+ // already running low on time left. The old timeout is restored afterwards.
+ # @TODO: re-enable this for when the number of batches is high.
+ #$scopedTimeLimit = new FileOpScopedPHPTimeout( self::TIME_LIMIT_SEC );
+
+ // Attempt each operation...
+ foreach ( $performOps as $index => $fileOp ) {
+ if ( $fileOp->failed() ) {
+ continue; // nothing to do
+ }
+ $subStatus = $fileOp->attempt();
+ $status->merge( $subStatus );
+ if ( $subStatus->isOK() ) {
+ $status->success[$index] = true;
+ ++$status->successCount;
+ } else {
+ $status->success[$index] = false;
+ ++$status->failCount;
+ // We can't continue (even with $ignoreErrors) as $predicates is wrong.
+ // Log the remaining ops as failed for recovery...
+ for ( $i = ($index + 1); $i < count( $performOps ); $i++ ) {
+ $performOps[$i]->logFailure( 'attempt_aborted' );
+ }
+ return $status; // bail out
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * Get the value of the parameter with the given name
+ *
+ * @param $name string
+ * @return mixed Returns null if the parameter is not set
+ */
+ final public function getParam( $name ) {
+ return isset( $this->params[$name] ) ? $this->params[$name] : null;
+ }
+
+ /**
+ * Check if this operation failed precheck() or attempt()
+ *
+ * @return bool
+ */
+ final public function failed() {
+ return $this->failed;
+ }
+
+ /**
+ * Get a new empty predicates array for precheck()
+ *
+ * @return Array
+ */
+ final public static function newPredicates() {
+ return array( 'exists' => array(), 'sha1' => array() );
+ }
+
+ /**
+ * Check preconditions of the operation without writing anything
+ *
+ * @param $predicates Array
+ * @return Status
+ */
+ final public function precheck( array &$predicates ) {
+ if ( $this->state !== self::STATE_NEW ) {
+ return Status::newFatal( 'fileop-fail-state', self::STATE_NEW, $this->state );
+ }
+ $this->state = self::STATE_CHECKED;
+ $status = $this->doPrecheck( $predicates );
+ if ( !$status->isOK() ) {
+ $this->failed = true;
+ }
+ return $status;
+ }
+
+ /**
+ * Attempt the operation, backing up files as needed; this must be reversible
+ *
+ * @return Status
+ */
+ final public function attempt() {
+ if ( $this->state !== self::STATE_CHECKED ) {
+ return Status::newFatal( 'fileop-fail-state', self::STATE_CHECKED, $this->state );
+ } elseif ( $this->failed ) { // failed precheck
+ return Status::newFatal( 'fileop-fail-attempt-precheck' );
+ }
+ $this->state = self::STATE_ATTEMPTED;
+ $status = $this->doAttempt();
+ if ( !$status->isOK() ) {
+ $this->failed = true;
+ $this->logFailure( 'attempt' );
+ }
+ return $status;
+ }
+
+ /**
+ * Get the file operation parameters
+ *
+ * @return Array (required params list, optional params list)
+ */
+ protected function allowedParams() {
+ return array( array(), array() );
+ }
+
+ /**
+ * Get a list of storage paths read from for this operation
+ *
+ * @return Array
+ */
+ public function storagePathsRead() {
+ return array();
+ }
+
+ /**
+ * Get a list of storage paths written to for this operation
+ *
+ * @return Array
+ */
+ public function storagePathsChanged() {
+ return array();
+ }
+
+ /**
+ * @return Status
+ */
+ protected function doPrecheck( array &$predicates ) {
+ return Status::newGood();
+ }
+
+ /**
+ * @return Status
+ */
+ protected function doAttempt() {
+ return Status::newGood();
+ }
+
+ /**
+ * Check for errors with regards to the destination file already existing.
+ * This also updates the destSameAsSource and sourceSha1 member variables.
+ * A bad status will be returned if there is no chance it can be overwritten.
+ *
+ * @param $predicates Array
+ * @return Status
+ */
+ protected function precheckDestExistence( array $predicates ) {
+ $status = Status::newGood();
+ // Get hash of source file/string and the destination file
+ $this->sourceSha1 = $this->getSourceSha1Base36(); // FS file or data string
+ if ( $this->sourceSha1 === null ) { // file in storage?
+ $this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
+ }
+ $this->destSameAsSource = false;
+ if ( $this->fileExists( $this->params['dst'], $predicates ) ) {
+ if ( $this->getParam( 'overwrite' ) ) {
+ return $status; // OK
+ } elseif ( $this->getParam( 'overwriteSame' ) ) {
+ $dhash = $this->fileSha1( $this->params['dst'], $predicates );
+ // Check if hashes are valid and match each other...
+ if ( !strlen( $this->sourceSha1 ) || !strlen( $dhash ) ) {
+ $status->fatal( 'backend-fail-hashes' );
+ } elseif ( $this->sourceSha1 !== $dhash ) {
+ // Give an error if the files are not identical
+ $status->fatal( 'backend-fail-notsame', $this->params['dst'] );
+ } else {
+ $this->destSameAsSource = true; // OK
+ }
+ return $status; // do nothing; either OK or bad status
+ } else {
+ $status->fatal( 'backend-fail-alreadyexists', $this->params['dst'] );
+ return $status;
+ }
+ }
+ return $status;
+ }
+
+ /**
+ * precheckDestExistence() helper function to get the source file SHA-1.
+ * Subclasses should overwride this iff the source is not in storage.
+ *
+ * @return string|false Returns false on failure
+ */
+ protected function getSourceSha1Base36() {
+ return null; // N/A
+ }
+
+ /**
+ * Check if a file will exist in storage when this operation is attempted
+ *
+ * @param $source string Storage path
+ * @param $predicates Array
+ * @return bool
+ */
+ final protected function fileExists( $source, array $predicates ) {
+ if ( isset( $predicates['exists'][$source] ) ) {
+ return $predicates['exists'][$source]; // previous op assures this
+ } else {
+ $params = array( 'src' => $source, 'latest' => $this->useLatest );
+ return $this->backend->fileExists( $params );
+ }
+ }
+
+ /**
+ * Get the SHA-1 of a file in storage when this operation is attempted
+ *
+ * @param $source string Storage path
+ * @param $predicates Array
+ * @return string|false
+ */
+ final protected function fileSha1( $source, array $predicates ) {
+ if ( isset( $predicates['sha1'][$source] ) ) {
+ return $predicates['sha1'][$source]; // previous op assures this
+ } else {
+ $params = array( 'src' => $source, 'latest' => $this->useLatest );
+ return $this->backend->getFileSha1Base36( $params );
+ }
+ }
+
+ /**
+ * Log a file operation failure and preserve any temp files
+ *
+ * @param $action string
+ * @return void
+ */
+ final protected function logFailure( $action ) {
+ $params = $this->params;
+ $params['failedAction'] = $action;
+ try {
+ wfDebugLog( 'FileOperation',
+ get_class( $this ) . ' failed:' . serialize( $params ) );
+ } catch ( Exception $e ) {
+ // bad config? debug log error?
+ }
+ }
+}
+
+/**
+ * FileOp helper class to expand PHP execution time for a function.
+ * On construction, set_time_limit() is called and set to $seconds.
+ * When the object goes out of scope, the timer is restarted, with
+ * the original time limit minus the time the object existed.
+ */
+class FileOpScopedPHPTimeout {
+ protected $startTime; // float; seconds
+ protected $oldTimeout; // integer; seconds
+
+ protected static $stackDepth = 0; // integer
+ protected static $totalCalls = 0; // integer
+ protected static $totalElapsed = 0; // float; seconds
+
+ /* Prevent callers in infinite loops from running forever */
+ const MAX_TOTAL_CALLS = 1000000;
+ const MAX_TOTAL_TIME = 300; // seconds
+
+ /**
+ * @param $seconds integer
+ */
+ public function __construct( $seconds ) {
+ if ( ini_get( 'max_execution_time' ) > 0 ) { // CLI uses 0
+ if ( self::$totalCalls >= self::MAX_TOTAL_CALLS ) {
+ trigger_error( "Maximum invocations of " . __CLASS__ . " exceeded." );
+ } elseif ( self::$totalElapsed >= self::MAX_TOTAL_TIME ) {
+ trigger_error( "Time limit within invocations of " . __CLASS__ . " exceeded." );
+ } elseif ( self::$stackDepth > 0 ) { // recursion guard
+ trigger_error( "Resursive invocation of " . __CLASS__ . " attempted." );
+ } else {
+ $this->oldTimeout = ini_set( 'max_execution_time', $seconds );
+ $this->startTime = microtime( true );
+ ++self::$stackDepth;
+ ++self::$totalCalls; // proof against < 1us scopes
+ }
+ }
+ }
+
+ /**
+ * Restore the original timeout.
+ * This does not account for the timer value on __construct().
+ */
+ public function __destruct() {
+ if ( $this->oldTimeout ) {
+ $elapsed = microtime( true ) - $this->startTime;
+ // Note: a limit of 0 is treated as "forever"
+ set_time_limit( max( 1, $this->oldTimeout - (int)$elapsed ) );
+ // If each scoped timeout is for less than one second, we end up
+ // restoring the original timeout without any decrease in value.
+ // Thus web scripts in an infinite loop can run forever unless we
+ // take some measures to prevent this. Track total time and calls.
+ self::$totalElapsed += $elapsed;
+ --self::$stackDepth;
+ }
+ }
+}
+
+/**
+ * Store a file into the backend from a file on the file system.
+ * Parameters similar to FileBackendStore::storeInternal(), which include:
+ * src : source path on file system
+ * dst : destination storage path
+ * overwrite : do nothing and pass if an identical file exists at destination
+ * overwriteSame : override any existing file at destination
+ */
+class StoreFileOp extends FileOp {
+ protected function allowedParams() {
+ return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+ }
+
+ protected function doPrecheck( array &$predicates ) {
+ $status = Status::newGood();
+ // Check if the source file exists on the file system
+ if ( !is_file( $this->params['src'] ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ // Check if the source file is too big
+ } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
+ $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+ return $status;
+ // Check if a file can be placed at the destination
+ } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+ $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+ return $status;
+ }
+ // Check if destination file exists
+ $status->merge( $this->precheckDestExistence( $predicates ) );
+ if ( $status->isOK() ) {
+ // Update file existence predicates
+ $predicates['exists'][$this->params['dst']] = true;
+ $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+ }
+ return $status; // safe to call attempt()
+ }
+
+ protected function doAttempt() {
+ $status = Status::newGood();
+ // Store the file at the destination
+ if ( !$this->destSameAsSource ) {
+ $status->merge( $this->backend->storeInternal( $this->params ) );
+ }
+ return $status;
+ }
+
+ protected function getSourceSha1Base36() {
+ wfSuppressWarnings();
+ $hash = sha1_file( $this->params['src'] );
+ wfRestoreWarnings();
+ if ( $hash !== false ) {
+ $hash = wfBaseConvert( $hash, 16, 36, 31 );
+ }
+ return $hash;
+ }
+
+ public function storagePathsChanged() {
+ return array( $this->params['dst'] );
+ }
+}
+
+/**
+ * Create a file in the backend with the given content.
+ * Parameters similar to FileBackendStore::createInternal(), which include:
+ * content : the raw file contents
+ * dst : destination storage path
+ * overwrite : do nothing and pass if an identical file exists at destination
+ * overwriteSame : override any existing file at destination
+ */
+class CreateFileOp extends FileOp {
+ protected function allowedParams() {
+ return array( array( 'content', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+ }
+
+ protected function doPrecheck( array &$predicates ) {
+ $status = Status::newGood();
+ // Check if the source data is too big
+ if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+ $status->fatal( 'backend-fail-create', $this->params['dst'] );
+ return $status;
+ // Check if a file can be placed at the destination
+ } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+ $status->fatal( 'backend-fail-create', $this->params['dst'] );
+ return $status;
+ }
+ // Check if destination file exists
+ $status->merge( $this->precheckDestExistence( $predicates ) );
+ if ( $status->isOK() ) {
+ // Update file existence predicates
+ $predicates['exists'][$this->params['dst']] = true;
+ $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+ }
+ return $status; // safe to call attempt()
+ }
+
+ protected function doAttempt() {
+ $status = Status::newGood();
+ // Create the file at the destination
+ if ( !$this->destSameAsSource ) {
+ $status->merge( $this->backend->createInternal( $this->params ) );
+ }
+ return $status;
+ }
+
+ protected function getSourceSha1Base36() {
+ return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+ }
+
+ public function storagePathsChanged() {
+ return array( $this->params['dst'] );
+ }
+}
+
+/**
+ * Copy a file from one storage path to another in the backend.
+ * Parameters similar to FileBackendStore::copyInternal(), which include:
+ * src : source storage path
+ * dst : destination storage path
+ * overwrite : do nothing and pass if an identical file exists at destination
+ * overwriteSame : override any existing file at destination
+ */
+class CopyFileOp extends FileOp {
+ protected function allowedParams() {
+ return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+ }
+
+ protected function doPrecheck( array &$predicates ) {
+ $status = Status::newGood();
+ // Check if the source file exists
+ if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ // Check if a file can be placed at the destination
+ } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+ $status->fatal( 'backend-fail-copy', $this->params['src'], $this->params['dst'] );
+ return $status;
+ }
+ // Check if destination file exists
+ $status->merge( $this->precheckDestExistence( $predicates ) );
+ if ( $status->isOK() ) {
+ // Update file existence predicates
+ $predicates['exists'][$this->params['dst']] = true;
+ $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+ }
+ return $status; // safe to call attempt()
+ }
+
+ protected function doAttempt() {
+ $status = Status::newGood();
+ // 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 ) {
+ $status->merge( $this->backend->copyInternal( $this->params ) );
+ }
+ }
+ return $status;
+ }
+
+ public function storagePathsRead() {
+ return array( $this->params['src'] );
+ }
+
+ public function storagePathsChanged() {
+ return array( $this->params['dst'] );
+ }
+}
+
+/**
+ * Move a file from one storage path to another in the backend.
+ * Parameters similar to FileBackendStore::moveInternal(), which include:
+ * src : source storage path
+ * dst : destination storage path
+ * overwrite : do nothing and pass if an identical file exists at destination
+ * overwriteSame : override any existing file at destination
+ */
+class MoveFileOp extends FileOp {
+ protected function allowedParams() {
+ return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
+ }
+
+ protected function doPrecheck( array &$predicates ) {
+ $status = Status::newGood();
+ // Check if the source file exists
+ if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ // Check if a file can be placed at the destination
+ } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+ $status->fatal( 'backend-fail-move', $this->params['src'], $this->params['dst'] );
+ return $status;
+ }
+ // Check if destination file exists
+ $status->merge( $this->precheckDestExistence( $predicates ) );
+ if ( $status->isOK() ) {
+ // Update file existence predicates
+ $predicates['exists'][$this->params['src']] = false;
+ $predicates['sha1'][$this->params['src']] = false;
+ $predicates['exists'][$this->params['dst']] = true;
+ $predicates['sha1'][$this->params['dst']] = $this->sourceSha1;
+ }
+ return $status; // safe to call attempt()
+ }
+
+ protected function doAttempt() {
+ $status = Status::newGood();
+ // 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
+ $status->merge( $this->backend->moveInternal( $this->params ) );
+ } else {
+ // Just delete source as the destination needs no changes
+ $params = array( 'src' => $this->params['src'] );
+ $status->merge( $this->backend->deleteInternal( $params ) );
+ }
+ }
+ return $status;
+ }
+
+ public function storagePathsRead() {
+ return array( $this->params['src'] );
+ }
+
+ public function storagePathsChanged() {
+ return array( $this->params['dst'] );
+ }
+}
+
+/**
+ * Delete a file at the given storage path from the backend.
+ * Parameters similar to FileBackendStore::deleteInternal(), which include:
+ * src : source storage path
+ * ignoreMissingSource : don't return an error if the file does not exist
+ */
+class DeleteFileOp extends FileOp {
+ protected function allowedParams() {
+ return array( array( 'src' ), array( 'ignoreMissingSource' ) );
+ }
+
+ protected $needsDelete = true;
+
+ protected function doPrecheck( array &$predicates ) {
+ $status = Status::newGood();
+ // Check if the source file exists
+ if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+ if ( !$this->getParam( 'ignoreMissingSource' ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ }
+ $this->needsDelete = false;
+ }
+ // Update file existence predicates
+ $predicates['exists'][$this->params['src']] = false;
+ $predicates['sha1'][$this->params['src']] = false;
+ return $status; // safe to call attempt()
+ }
+
+ protected function doAttempt() {
+ $status = Status::newGood();
+ if ( $this->needsDelete ) {
+ // Delete the source file
+ $status->merge( $this->backend->deleteInternal( $this->params ) );
+ }
+ return $status;
+ }
+
+ public function storagePathsChanged() {
+ return array( $this->params['src'] );
+ }
+}
+
+/**
+ * Placeholder operation that has no params and does nothing
+ */
+class NullFileOp extends FileOp {}
diff --git a/includes/filerepo/backend/SwiftFileBackend.php b/includes/filerepo/backend/SwiftFileBackend.php
new file mode 100644
index 00000000..a287f488
--- /dev/null
+++ b/includes/filerepo/backend/SwiftFileBackend.php
@@ -0,0 +1,877 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ * @author Russ Nelson
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class for an OpenStack Swift based file backend.
+ *
+ * This requires the SwiftCloudFiles MediaWiki extension, which includes
+ * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
+ * php-cloudfiles requires the curl, fileinfo, and mb_string PHP extensions.
+ *
+ * Status messages should avoid mentioning the Swift account name.
+ * Likewise, error suppression should be used to avoid path disclosure.
+ *
+ * @ingroup FileBackend
+ * @since 1.19
+ */
+class SwiftFileBackend extends FileBackendStore {
+ /** @var CF_Authentication */
+ protected $auth; // Swift authentication handler
+ protected $authTTL; // integer seconds
+ protected $swiftAnonUser; // string; username to handle unauthenticated requests
+ protected $maxContCacheSize = 100; // integer; max containers with entries
+
+ /** @var CF_Connection */
+ protected $conn; // Swift connection handle
+ protected $connStarted = 0; // integer UNIX timestamp
+ protected $connContainers = array(); // container object cache
+
+ /**
+ * @see FileBackendStore::__construct()
+ * Additional $config params include:
+ * swiftAuthUrl : Swift authentication server URL
+ * swiftUser : Swift user used by MediaWiki (account:username)
+ * swiftKey : Swift authentication key for the above user
+ * swiftAuthTTL : Swift authentication TTL (seconds)
+ * swiftAnonUser : Swift user used for end-user requests (account:username)
+ * shardViaHashLevels : Map of container names to sharding config with:
+ * 'base' : base of hash characters, 16 or 36
+ * 'levels' : the number of hash levels (and digits)
+ * 'repeat' : hash subdirectories are prefixed with all the
+ * parent hash directory names (e.g. "a/ab/abc")
+ */
+ public function __construct( array $config ) {
+ parent::__construct( $config );
+ // Required settings
+ $this->auth = new CF_Authentication(
+ $config['swiftUser'],
+ $config['swiftKey'],
+ null, // account; unused
+ $config['swiftAuthUrl']
+ );
+ // Optional settings
+ $this->authTTL = isset( $config['swiftAuthTTL'] )
+ ? $config['swiftAuthTTL']
+ : 120; // some sane number
+ $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
+ ? $config['swiftAnonUser']
+ : '';
+ $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
+ ? $config['shardViaHashLevels']
+ : '';
+ }
+
+ /**
+ * @see FileBackendStore::resolveContainerPath()
+ */
+ protected function resolveContainerPath( $container, $relStoragePath ) {
+ if ( strlen( urlencode( $relStoragePath ) ) > 1024 ) {
+ return null; // too long for Swift
+ }
+ return $relStoragePath;
+ }
+
+ /**
+ * @see FileBackendStore::isPathUsableInternal()
+ */
+ public function isPathUsableInternal( $storagePath ) {
+ list( $container, $rel ) = $this->resolveStoragePathReal( $storagePath );
+ if ( $rel === null ) {
+ return false; // invalid
+ }
+
+ try {
+ $this->getContainer( $container );
+ return true; // container exists
+ } catch ( NoSuchContainerException $e ) {
+ } catch ( InvalidResponseException $e ) {
+ } catch ( Exception $e ) { // some other exception?
+ $this->logException( $e, __METHOD__, array( 'path' => $storagePath ) );
+ }
+
+ return false;
+ }
+
+ /**
+ * @see FileBackendStore::doCreateInternal()
+ */
+ protected function doCreateInternal( array $params ) {
+ $status = Status::newGood();
+
+ list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+ if ( $dstRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ // (a) Check the destination container and object
+ try {
+ $dContObj = $this->getContainer( $dstCont );
+ if ( empty( $params['overwrite'] ) &&
+ $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+ {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ } catch ( NoSuchContainerException $e ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ // (b) Get a SHA-1 hash of the object
+ $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
+
+ // (c) Actually create the object
+ try {
+ // Create a fresh CF_Object with no fields preloaded.
+ // We don't want to preserve headers, metadata, and such.
+ $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+ // Note: metadata keys stored as [Upper case char][[Lower case char]...]
+ $obj->metadata = array( 'Sha1base36' => $sha1Hash );
+ // Manually set the ETag (https://github.com/rackspace/php-cloudfiles/issues/59).
+ // 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'] );
+ // Actually write the object in Swift
+ $obj->write( $params['content'] );
+ } catch ( BadContentTypeException $e ) {
+ $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doStoreInternal()
+ */
+ protected function doStoreInternal( array $params ) {
+ $status = Status::newGood();
+
+ list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+ if ( $dstRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ // (a) Check the destination container and object
+ try {
+ $dContObj = $this->getContainer( $dstCont );
+ if ( empty( $params['overwrite'] ) &&
+ $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+ {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ } catch ( NoSuchContainerException $e ) {
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ return $status;
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ // (b) Get a SHA-1 hash of the object
+ $sha1Hash = sha1_file( $params['src'] );
+ if ( $sha1Hash === false ) { // source doesn't exist?
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ return $status;
+ }
+ $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
+
+ // (c) Actually store the object
+ try {
+ // Create a fresh CF_Object with no fields preloaded.
+ // We don't want to preserve headers, metadata, and such.
+ $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+ // Note: metadata keys stored as [Upper case char][[Lower case char]...]
+ $obj->metadata = array( 'Sha1base36' => $sha1Hash );
+ // 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'] );
+ // Actually write the object in Swift
+ $obj->load_from_filename( $params['src'], True ); // calls $obj->write()
+ } catch ( BadContentTypeException $e ) {
+ $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+ } catch ( IOException $e ) {
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doCopyInternal()
+ */
+ protected function doCopyInternal( array $params ) {
+ $status = Status::newGood();
+
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ return $status;
+ }
+
+ list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+ if ( $dstRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
+ }
+
+ // (a) Check the source/destination containers and destination object
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ $dContObj = $this->getContainer( $dstCont );
+ if ( empty( $params['overwrite'] ) &&
+ $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+ {
+ $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ return $status;
+ }
+ } catch ( NoSuchContainerException $e ) {
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ return $status;
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ // (b) Actually copy the file to the destination
+ try {
+ $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel );
+ } catch ( NoSuchObjectException $e ) { // source object does not exist
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doDeleteInternal()
+ */
+ protected function doDeleteInternal( array $params ) {
+ $status = Status::newGood();
+
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ return $status;
+ }
+
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ $sContObj->delete_object( $srcRel );
+ } catch ( NoSuchContainerException $e ) {
+ $status->fatal( 'backend-fail-delete', $params['src'] );
+ } catch ( NoSuchObjectException $e ) {
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-delete', $params['src'] );
+ }
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doPrepareInternal()
+ */
+ protected function doPrepareInternal( $fullCont, $dir, array $params ) {
+ $status = Status::newGood();
+
+ // (a) Check if container already exists
+ try {
+ $contObj = $this->getContainer( $fullCont );
+ // NoSuchContainerException not thrown: container must exist
+ return $status; // already exists
+ } catch ( NoSuchContainerException $e ) {
+ // NoSuchContainerException thrown: container does not exist
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ // (b) Create container as needed
+ try {
+ $contObj = $this->createContainer( $fullCont );
+ if ( $this->swiftAnonUser != '' ) {
+ // Make container public to end-users...
+ $status->merge( $this->setContainerAccess(
+ $contObj,
+ array( $this->auth->username, $this->swiftAnonUser ), // read
+ array( $this->auth->username ) // write
+ ) );
+ }
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doSecureInternal()
+ */
+ protected function doSecureInternal( $fullCont, $dir, array $params ) {
+ $status = Status::newGood();
+
+ if ( $this->swiftAnonUser != '' ) {
+ // Restrict container from end-users...
+ try {
+ // doPrepareInternal() should have been called,
+ // so the Swift container should already exist...
+ $contObj = $this->getContainer( $fullCont ); // normally a cache hit
+ // NoSuchContainerException not thrown: container must exist
+ if ( !isset( $contObj->mw_wasSecured ) ) {
+ $status->merge( $this->setContainerAccess(
+ $contObj,
+ array( $this->auth->username ), // read
+ array( $this->auth->username ) // write
+ ) );
+ // @TODO: when php-cloudfiles supports container
+ // metadata, we can make use of that to avoid RTTs
+ $contObj->mw_wasSecured = true; // avoid useless RTTs
+ }
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doCleanInternal()
+ */
+ protected function doCleanInternal( $fullCont, $dir, array $params ) {
+ $status = Status::newGood();
+
+ // Only containers themselves can be removed, all else is virtual
+ if ( $dir != '' ) {
+ return $status; // nothing to do
+ }
+
+ // (a) Check the container
+ try {
+ $contObj = $this->getContainer( $fullCont, true );
+ } catch ( NoSuchContainerException $e ) {
+ return $status; // ok, nothing to do
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ // (b) Delete the container if empty
+ if ( $contObj->object_count == 0 ) {
+ try {
+ $this->deleteContainer( $fullCont );
+ } catch ( NoSuchContainerException $e ) {
+ return $status; // race?
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-internal', $this->name );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::doFileExists()
+ */
+ protected function doGetFileStat( array $params ) {
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ return false; // invalid storage path
+ }
+
+ $stat = false;
+ try {
+ $contObj = $this->getContainer( $srcCont );
+ $srcObj = $contObj->get_object( $srcRel, $this->headersFromParams( $params ) );
+ $this->addMissingMetadata( $srcObj, $params['src'] );
+ $stat = array(
+ // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
+ 'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
+ 'size' => $srcObj->content_length,
+ 'sha1' => $srcObj->metadata['Sha1base36']
+ );
+ } catch ( NoSuchContainerException $e ) {
+ } catch ( NoSuchObjectException $e ) {
+ } catch ( InvalidResponseException $e ) {
+ $stat = null;
+ } catch ( Exception $e ) { // some other exception?
+ $stat = null;
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $stat;
+ }
+
+ /**
+ * Fill in any missing object metadata and save it to Swift
+ *
+ * @param $obj CF_Object
+ * @param $path string Storage path to object
+ * @return bool Success
+ * @throws Exception cloudfiles exceptions
+ */
+ protected function addMissingMetadata( CF_Object $obj, $path ) {
+ if ( isset( $obj->metadata['Sha1base36'] ) ) {
+ return true; // nothing to do
+ }
+ $status = Status::newGood();
+ $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
+ if ( $status->isOK() ) {
+ $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1 ) );
+ if ( $tmpFile ) {
+ $hash = $tmpFile->getSha1Base36();
+ if ( $hash !== false ) {
+ $obj->metadata['Sha1base36'] = $hash;
+ $obj->sync_metadata(); // save to Swift
+ return true; // success
+ }
+ }
+ }
+ $obj->metadata['Sha1base36'] = false;
+ return false; // failed
+ }
+
+ /**
+ * @see FileBackend::getFileContents()
+ */
+ public function getFileContents( array $params ) {
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ return false; // invalid storage path
+ }
+
+ if ( !$this->fileExists( $params ) ) {
+ return null;
+ }
+
+ $data = false;
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD request
+ $data = $obj->read( $this->headersFromParams( $params ) );
+ } catch ( NoSuchContainerException $e ) {
+ } catch ( InvalidResponseException $e ) {
+ } catch ( Exception $e ) { // some other exception?
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $data;
+ }
+
+ /**
+ * @see FileBackendStore::getFileListInternal()
+ */
+ public function getFileListInternal( $fullCont, $dir, array $params ) {
+ return new SwiftFileBackendFileList( $this, $fullCont, $dir );
+ }
+
+ /**
+ * Do not call this function outside of SwiftFileBackendFileList
+ *
+ * @param $fullCont string Resolved container name
+ * @param $dir string Resolved storage directory with no trailing slash
+ * @param $after string Storage path of file to list items after
+ * @param $limit integer Max number of items to list
+ * @return Array
+ */
+ public function getFileListPageInternal( $fullCont, $dir, $after, $limit ) {
+ $files = array();
+
+ try {
+ $container = $this->getContainer( $fullCont );
+ $prefix = ( $dir == '' ) ? null : "{$dir}/";
+ $files = $container->list_objects( $limit, $after, $prefix );
+ } catch ( NoSuchContainerException $e ) {
+ } catch ( NoSuchObjectException $e ) {
+ } catch ( InvalidResponseException $e ) {
+ } catch ( Exception $e ) { // some other exception?
+ $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
+ }
+
+ return $files;
+ }
+
+ /**
+ * @see FileBackendStore::doGetFileSha1base36()
+ */
+ public function doGetFileSha1base36( array $params ) {
+ $stat = $this->getFileStat( $params );
+ if ( $stat ) {
+ return $stat['sha1'];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @see FileBackendStore::doStreamFile()
+ */
+ protected function doStreamFile( array $params ) {
+ $status = Status::newGood();
+
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ }
+
+ try {
+ $cont = $this->getContainer( $srcCont );
+ } catch ( NoSuchContainerException $e ) {
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ return $status;
+ } catch ( InvalidResponseException $e ) {
+ $status->fatal( 'backend-fail-connect', $this->name );
+ return $status;
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ $this->logException( $e, __METHOD__, $params );
+ return $status;
+ }
+
+ try {
+ $output = fopen( 'php://output', 'wb' );
+ $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD request
+ $obj->stream( $output, $this->headersFromParams( $params ) );
+ } catch ( InvalidResponseException $e ) { // 404? connection problem?
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ } catch ( Exception $e ) { // some other exception?
+ $status->fatal( 'backend-fail-stream', $params['src'] );
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::getLocalCopy()
+ */
+ public function getLocalCopy( array $params ) {
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ return null;
+ }
+
+ if ( !$this->fileExists( $params ) ) {
+ return null;
+ }
+
+ $tmpFile = null;
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+ // Get source file extension
+ $ext = FileBackend::extensionFromPath( $srcRel );
+ // Create a new temporary file...
+ $tmpFile = TempFSFile::factory( wfBaseName( $srcRel ) . '_', $ext );
+ if ( $tmpFile ) {
+ $handle = fopen( $tmpFile->getPath(), 'wb' );
+ if ( $handle ) {
+ $obj->stream( $handle, $this->headersFromParams( $params ) );
+ fclose( $handle );
+ } else {
+ $tmpFile = null; // couldn't open temp file
+ }
+ }
+ } catch ( NoSuchContainerException $e ) {
+ $tmpFile = null;
+ } catch ( InvalidResponseException $e ) {
+ $tmpFile = null;
+ } catch ( Exception $e ) { // some other exception?
+ $tmpFile = null;
+ $this->logException( $e, __METHOD__, $params );
+ }
+
+ return $tmpFile;
+ }
+
+ /**
+ * Get headers to send to Swift when reading a file based
+ * on a FileBackend params array, e.g. that of getLocalCopy().
+ * $params is currently only checked for a 'latest' flag.
+ *
+ * @param $params Array
+ * @return Array
+ */
+ protected function headersFromParams( array $params ) {
+ $hdrs = array();
+ if ( !empty( $params['latest'] ) ) {
+ $hdrs[] = 'X-Newest: true';
+ }
+ return $hdrs;
+ }
+
+ /**
+ * Set read/write permissions for a Swift container
+ *
+ * @param $contObj CF_Container Swift container
+ * @param $readGrps Array Swift users who can read (account:user)
+ * @param $writeGrps Array Swift users who can write (account:user)
+ * @return Status
+ */
+ protected function setContainerAccess(
+ CF_Container $contObj, array $readGrps, array $writeGrps
+ ) {
+ $creds = $contObj->cfs_auth->export_credentials();
+
+ $url = $creds['storage_url'] . '/' . rawurlencode( $contObj->name );
+
+ // Note: 10 second timeout consistent with php-cloudfiles
+ $req = new CurlHttpRequest( $url, array( 'method' => 'POST', 'timeout' => 10 ) );
+ $req->setHeader( 'X-Auth-Token', $creds['auth_token'] );
+ $req->setHeader( 'X-Container-Read', implode( ',', $readGrps ) );
+ $req->setHeader( 'X-Container-Write', implode( ',', $writeGrps ) );
+
+ return $req->execute(); // should return 204
+ }
+
+ /**
+ * Get a connection to the Swift proxy
+ *
+ * @return CF_Connection|false
+ * @throws InvalidResponseException
+ */
+ protected function getConnection() {
+ if ( $this->conn === false ) {
+ throw new InvalidResponseException; // failed last attempt
+ }
+ // Session keys expire after a while, so we renew them periodically
+ if ( $this->conn && ( time() - $this->connStarted ) > $this->authTTL ) {
+ $this->conn->close(); // close active cURL connections
+ $this->conn = null;
+ }
+ // Authenticate with proxy and get a session key...
+ if ( $this->conn === null ) {
+ $this->connContainers = array();
+ try {
+ $this->auth->authenticate();
+ $this->conn = new CF_Connection( $this->auth );
+ $this->connStarted = time();
+ } catch ( AuthenticationException $e ) {
+ $this->conn = false; // don't keep re-trying
+ } catch ( InvalidResponseException $e ) {
+ $this->conn = false; // don't keep re-trying
+ }
+ }
+ if ( !$this->conn ) {
+ throw new InvalidResponseException; // auth/connection problem
+ }
+ return $this->conn;
+ }
+
+ /**
+ * @see FileBackendStore::doClearCache()
+ */
+ protected function doClearCache( array $paths = null ) {
+ $this->connContainers = array(); // clear container object cache
+ }
+
+ /**
+ * Get a Swift container object, possibly from process cache.
+ * Use $reCache if the file count or byte count is needed.
+ *
+ * @param $container string Container name
+ * @param $reCache bool Refresh the process cache
+ * @return CF_Container
+ */
+ protected function getContainer( $container, $reCache = false ) {
+ $conn = $this->getConnection(); // Swift proxy connection
+ if ( $reCache ) {
+ unset( $this->connContainers[$container] ); // purge cache
+ }
+ if ( !isset( $this->connContainers[$container] ) ) {
+ $contObj = $conn->get_container( $container );
+ // NoSuchContainerException not thrown: container must exist
+ if ( count( $this->connContainers ) >= $this->maxContCacheSize ) { // trim cache?
+ reset( $this->connContainers );
+ $key = key( $this->connContainers );
+ unset( $this->connContainers[$key] );
+ }
+ $this->connContainers[$container] = $contObj; // cache it
+ }
+ return $this->connContainers[$container];
+ }
+
+ /**
+ * Create a Swift container
+ *
+ * @param $container string Container name
+ * @return CF_Container
+ */
+ protected function createContainer( $container ) {
+ $conn = $this->getConnection(); // Swift proxy connection
+ $contObj = $conn->create_container( $container );
+ $this->connContainers[$container] = $contObj; // cache it
+ return $contObj;
+ }
+
+ /**
+ * Delete a Swift container
+ *
+ * @param $container string Container name
+ * @return void
+ */
+ protected function deleteContainer( $container ) {
+ $conn = $this->getConnection(); // Swift proxy connection
+ $conn->delete_container( $container );
+ unset( $this->connContainers[$container] ); // purge cache
+ }
+
+ /**
+ * Log an unexpected exception for this backend
+ *
+ * @param $e Exception
+ * @param $func string
+ * @param $params Array
+ * @return void
+ */
+ protected function logException( Exception $e, $func, array $params ) {
+ wfDebugLog( 'SwiftBackend',
+ get_class( $e ) . " in '{$func}' (given '" . serialize( $params ) . "')" .
+ ( $e instanceof InvalidResponseException
+ ? ": {$e->getMessage()}"
+ : ""
+ )
+ );
+ }
+}
+
+/**
+ * SwiftFileBackend helper class to page through object listings.
+ * Swift also has a listing limit of 10,000 objects for sanity.
+ * Do not use this class from places outside SwiftFileBackend.
+ *
+ * @ingroup FileBackend
+ */
+class SwiftFileBackendFileList implements Iterator {
+ /** @var Array */
+ protected $bufferIter = array();
+ protected $bufferAfter = null; // string; list items *after* this path
+ protected $pos = 0; // integer
+
+ /** @var SwiftFileBackend */
+ protected $backend;
+ protected $container; //
+ protected $dir; // string storage directory
+ protected $suffixStart; // integer
+
+ const PAGE_SIZE = 5000; // file listing buffer size
+
+ /**
+ * @param $backend SwiftFileBackend
+ * @param $fullCont string Resolved container name
+ * @param $dir string Resolved directory relative to container
+ */
+ public function __construct( SwiftFileBackend $backend, $fullCont, $dir ) {
+ $this->backend = $backend;
+ $this->container = $fullCont;
+ $this->dir = $dir;
+ if ( substr( $this->dir, -1 ) === '/' ) {
+ $this->dir = substr( $this->dir, 0, -1 ); // remove trailing slash
+ }
+ if ( $this->dir == '' ) { // whole container
+ $this->suffixStart = 0;
+ } else { // dir within container
+ $this->suffixStart = strlen( $this->dir ) + 1; // size of "path/to/dir/"
+ }
+ }
+
+ public function current() {
+ return substr( current( $this->bufferIter ), $this->suffixStart );
+ }
+
+ public function key() {
+ return $this->pos;
+ }
+
+ public function next() {
+ // Advance to the next file in the page
+ next( $this->bufferIter );
+ ++$this->pos;
+ // Check if there are no files left in this page and
+ // advance to the next page if this page was not empty.
+ if ( !$this->valid() && count( $this->bufferIter ) ) {
+ $this->bufferAfter = end( $this->bufferIter );
+ $this->bufferIter = $this->backend->getFileListPageInternal(
+ $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
+ );
+ }
+ }
+
+ public function rewind() {
+ $this->pos = 0;
+ $this->bufferAfter = null;
+ $this->bufferIter = $this->backend->getFileListPageInternal(
+ $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
+ );
+ }
+
+ public function valid() {
+ return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+ }
+}
diff --git a/includes/filerepo/backend/TempFSFile.php b/includes/filerepo/backend/TempFSFile.php
new file mode 100644
index 00000000..7843d6cd
--- /dev/null
+++ b/includes/filerepo/backend/TempFSFile.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * @file
+ * @ingroup FileBackend
+ */
+
+/**
+ * This class is used to hold the location and do limited manipulation
+ * of files stored temporarily (usually this will be $wgTmpDirectory)
+ *
+ * @ingroup FileBackend
+ */
+class TempFSFile extends FSFile {
+ protected $canDelete = false; // bool; garbage collect the temp file
+
+ /** @var Array of active temp files to purge on shutdown */
+ protected static $instances = array();
+
+ /**
+ * 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
+ * @return TempFSFile|null
+ */
+ public static function factory( $prefix, $extension = '' ) {
+ $base = wfTempDir() . '/' . $prefix . dechex( mt_rand( 0, 99999999 ) );
+ $ext = ( $extension != '' ) ? ".{$extension}" : "";
+ for ( $attempt = 1; true; $attempt++ ) {
+ $path = "{$base}-{$attempt}{$ext}";
+ wfSuppressWarnings();
+ $newFileHandle = fopen( $path, 'x' );
+ wfRestoreWarnings();
+ if ( $newFileHandle ) {
+ fclose( $newFileHandle );
+ break; // got it
+ }
+ if ( $attempt >= 15 ) {
+ return null; // give up
+ }
+ }
+ $tmpFile = new self( $path );
+ $tmpFile->canDelete = true; // safely instantiated
+ return $tmpFile;
+ }
+
+ /**
+ * Purge this file off the file system
+ *
+ * @return bool Success
+ */
+ public function purge() {
+ $this->canDelete = false; // done
+ wfSuppressWarnings();
+ $ok = unlink( $this->path );
+ wfRestoreWarnings();
+ return $ok;
+ }
+
+ /**
+ * Clean up the temporary file only after an object goes out of scope
+ *
+ * @param $object Object
+ * @return void
+ */
+ public function bind( $object ) {
+ if ( is_object( $object ) ) {
+ $object->tempFSFileReferences[] = $this;
+ }
+ }
+
+ /**
+ * Set flag to not clean up after the temporary file
+ *
+ * @return void
+ */
+ public function preserve() {
+ $this->canDelete = false;
+ }
+
+ /**
+ * Cleans up after the temporary file by deleting it
+ */
+ function __destruct() {
+ if ( $this->canDelete ) {
+ wfSuppressWarnings();
+ unlink( $this->path );
+ wfRestoreWarnings();
+ }
+ }
+}
diff --git a/includes/filerepo/backend/lockmanager/DBLockManager.php b/includes/filerepo/backend/lockmanager/DBLockManager.php
new file mode 100644
index 00000000..045056ea
--- /dev/null
+++ b/includes/filerepo/backend/lockmanager/DBLockManager.php
@@ -0,0 +1,469 @@
+<?php
+
+/**
+ * Version of LockManager based on using DB table locks.
+ * This is meant for multi-wiki systems that may share files.
+ * All locks are blocking, so it might be useful to set a small
+ * lock-wait timeout via server config to curtail 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 DBs, each on their
+ * own server, all having the filelocks.sql tables (with row-level locking).
+ * A majority of peer DBs must agree for a lock to be acquired.
+ *
+ * Caching is used to avoid hitting servers that are down.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class DBLockManager extends LockManager {
+ /** @var Array Map of DB names to server config */
+ protected $dbServers; // (DB name => server config array)
+ /** @var Array Map of bucket indexes to peer DB lists */
+ protected $dbsByBucket; // (bucket index => (ldb1, ldb2, ...))
+ /** @var BagOStuff */
+ protected $statusCache;
+
+ protected $lockExpiry; // integer number of seconds
+ protected $safeDelay; // integer number of seconds
+
+ protected $session = 0; // random integer
+ /** @var Array Map Database connections (DB name => Database) */
+ protected $conns = array();
+
+ /**
+ * Construct a new instance from configuration.
+ *
+ * $config paramaters include:
+ * 'dbServers' : Associative array of DB names to server configuration.
+ * Configuration is an associative array that includes:
+ * 'host' - DB server name
+ * 'dbname' - DB name
+ * 'type' - DB type (mysql,postgres,...)
+ * 'user' - DB user
+ * 'password' - DB user password
+ * 'tablePrefix' - DB table prefix
+ * 'flags' - DB flags (see DatabaseBase)
+ * 'dbsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
+ * each having an odd-numbered list of DB names (peers) as values.
+ * Any DB named 'localDBMaster' will automatically use the DB master
+ * settings for this wiki (without the need for a dbServers entry).
+ * 'lockExpiry' : Lock timeout (seconds) for dropped connections. [optional]
+ * This tells the DB server how long to wait before assuming
+ * connection failure and releasing all the locks for a session.
+ *
+ * @param Array $config
+ */
+ public function __construct( array $config ) {
+ $this->dbServers = isset( $config['dbServers'] )
+ ? $config['dbServers']
+ : array(); // likely just using 'localDBMaster'
+ // Sanitize dbsByBucket config to prevent PHP errors
+ $this->dbsByBucket = array_filter( $config['dbsByBucket'], 'is_array' );
+ $this->dbsByBucket = array_values( $this->dbsByBucket ); // consecutive
+
+ if ( isset( $config['lockExpiry'] ) ) {
+ $this->lockExpiry = $config['lockExpiry'];
+ } else {
+ $met = ini_get( 'max_execution_time' );
+ $this->lockExpiry = $met ? $met : 60; // use some sane amount if 0
+ }
+ $this->safeDelay = ( $this->lockExpiry <= 0 )
+ ? 60 // pick a safe-ish number to match DB timeout default
+ : $this->lockExpiry; // cover worst case
+
+ foreach ( $this->dbsByBucket as $bucket ) {
+ if ( count( $bucket ) > 1 ) {
+ // Tracks peers that couldn't be queried recently to avoid lengthy
+ // connection timeouts. This is useless if each bucket has one peer.
+ $this->statusCache = wfGetMainCache();
+ break;
+ }
+ }
+
+ $this->session = '';
+ for ( $i = 0; $i < 5; $i++ ) {
+ $this->session .= mt_rand( 0, 2147483647 );
+ }
+ $this->session = wfBaseConvert( sha1( $this->session ), 16, 36, 31 );
+ }
+
+ /**
+ * @see LockManager::doLock()
+ */
+ protected function doLock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ $pathsToLock = array();
+ // Get locks that need to be acquired (buckets => locks)...
+ foreach ( $paths as $path ) {
+ if ( isset( $this->locksHeld[$path][$type] ) ) {
+ ++$this->locksHeld[$path][$type];
+ } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+ $this->locksHeld[$path][$type] = 1;
+ } else {
+ $bucket = $this->getBucketFromKey( $path );
+ $pathsToLock[$bucket][] = $path;
+ }
+ }
+
+ $lockedPaths = array(); // files locked in this attempt
+ // Attempt to acquire these locks...
+ foreach ( $pathsToLock as $bucket => $paths ) {
+ // Try to acquire the locks for this bucket
+ $res = $this->doLockingQueryAll( $bucket, $paths, $type );
+ if ( $res === 'cantacquire' ) {
+ // Resources already locked by another process.
+ // Abort and unlock everything we just locked.
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ return $status;
+ } elseif ( $res !== true ) {
+ // Couldn't contact any DBs for this bucket.
+ // Abort and unlock everything we just locked.
+ $status->fatal( 'lockmanager-fail-db-bucket', $bucket );
+ $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ return $status;
+ }
+ // Record these locks as active
+ foreach ( $paths as $path ) {
+ $this->locksHeld[$path][$type] = 1; // locked
+ }
+ // Keep track of what locks were made in this attempt
+ $lockedPaths = array_merge( $lockedPaths, $paths );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see LockManager::doUnlock()
+ */
+ protected function doUnlock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ foreach ( $paths as $path ) {
+ if ( !isset( $this->locksHeld[$path] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } else {
+ --$this->locksHeld[$path][$type];
+ if ( $this->locksHeld[$path][$type] <= 0 ) {
+ unset( $this->locksHeld[$path][$type] );
+ }
+ if ( !count( $this->locksHeld[$path] ) ) {
+ unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+ }
+ }
+ }
+
+ // Reference count the locks held and COMMIT when zero
+ if ( !count( $this->locksHeld ) ) {
+ $status->merge( $this->finishLockTransactions() );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Get a connection to a lock DB and acquire locks on $paths.
+ * This does not use GET_LOCK() per http://bugs.mysql.com/bug.php?id=1118.
+ *
+ * @param $lockDb string
+ * @param $paths Array
+ * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @return bool Resources able to be locked
+ * @throws DBError
+ */
+ protected function doLockingQuery( $lockDb, array $paths, $type ) {
+ if ( $type == self::LOCK_EX ) { // writer locks
+ $db = $this->getConnection( $lockDb );
+ if ( !$db ) {
+ return false; // bad config
+ }
+ $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+ # Build up values for INSERT clause
+ $data = array();
+ foreach ( $keys as $key ) {
+ $data[] = array( 'fle_key' => $key );
+ }
+ # Wait on any existing writers and block new ones if we get in
+ $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
+ }
+ return true;
+ }
+
+ /**
+ * Attempt to acquire locks with the peers for a bucket.
+ * This should avoid throwing any exceptions.
+ *
+ * @param $bucket integer
+ * @param $paths Array List of resource keys to lock
+ * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @return bool|string One of (true, 'cantacquire', 'dberrors')
+ */
+ protected function doLockingQueryAll( $bucket, array $paths, $type ) {
+ $yesVotes = 0; // locks made on trustable DBs
+ $votesLeft = count( $this->dbsByBucket[$bucket] ); // remaining DBs
+ $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+ // Get votes for each DB, in order, until we have enough...
+ foreach ( $this->dbsByBucket[$bucket] as $lockDb ) {
+ // Check that DB is not *known* to be down
+ if ( $this->cacheCheckFailures( $lockDb ) ) {
+ try {
+ // Attempt to acquire the lock on this DB
+ if ( !$this->doLockingQuery( $lockDb, $paths, $type ) ) {
+ return 'cantacquire'; // vetoed; resource locked
+ }
+ ++$yesVotes; // success for this peer
+ if ( $yesVotes >= $quorum ) {
+ return true; // lock obtained
+ }
+ } catch ( DBConnectionError $e ) {
+ $this->cacheRecordFailure( $lockDb );
+ } catch ( DBError $e ) {
+ if ( $this->lastErrorIndicatesLocked( $lockDb ) ) {
+ return 'cantacquire'; // vetoed; resource locked
+ }
+ }
+ }
+ --$votesLeft;
+ $votesNeeded = $quorum - $yesVotes;
+ if ( $votesNeeded > $votesLeft ) {
+ // In "trust cache" mode we don't have to meet the quorum
+ break; // short-circuit
+ }
+ }
+ // At this point, we must not have meet the quorum
+ return 'dberrors'; // not enough votes to ensure correctness
+ }
+
+ /**
+ * Get (or reuse) a connection to a lock DB
+ *
+ * @param $lockDb string
+ * @return Database
+ * @throws DBError
+ */
+ protected function getConnection( $lockDb ) {
+ if ( !isset( $this->conns[$lockDb] ) ) {
+ $db = null;
+ if ( $lockDb === 'localDBMaster' ) {
+ $lb = wfGetLBFactory()->newMainLB();
+ $db = $lb->getConnection( DB_MASTER );
+ } elseif ( isset( $this->dbServers[$lockDb] ) ) {
+ $config = $this->dbServers[$lockDb];
+ $db = DatabaseBase::factory( $config['type'], $config );
+ }
+ if ( !$db ) {
+ return null; // config error?
+ }
+ $this->conns[$lockDb] = $db;
+ $this->conns[$lockDb]->clearFlag( DBO_TRX );
+ # If the connection drops, try to avoid letting the DB rollback
+ # and release the locks before the file operations are finished.
+ # This won't handle the case of DB server restarts however.
+ $options = array();
+ if ( $this->lockExpiry > 0 ) {
+ $options['connTimeout'] = $this->lockExpiry;
+ }
+ $this->conns[$lockDb]->setSessionOptions( $options );
+ $this->initConnection( $lockDb, $this->conns[$lockDb] );
+ }
+ if ( !$this->conns[$lockDb]->trxLevel() ) {
+ $this->conns[$lockDb]->begin(); // start transaction
+ }
+ return $this->conns[$lockDb];
+ }
+
+ /**
+ * Do additional initialization for new lock DB connection
+ *
+ * @param $lockDb string
+ * @param $db DatabaseBase
+ * @return void
+ * @throws DBError
+ */
+ protected function initConnection( $lockDb, DatabaseBase $db ) {}
+
+ /**
+ * Commit all changes to lock-active databases.
+ * This should avoid throwing any exceptions.
+ *
+ * @return Status
+ */
+ protected function finishLockTransactions() {
+ $status = Status::newGood();
+ foreach ( $this->conns as $lockDb => $db ) {
+ if ( $db->trxLevel() ) { // in transaction
+ try {
+ $db->rollback(); // finish transaction and kill any rows
+ } catch ( DBError $e ) {
+ $status->fatal( 'lockmanager-fail-db-release', $lockDb );
+ }
+ }
+ }
+ return $status;
+ }
+
+ /**
+ * Check if the last DB error for $lockDb indicates
+ * that a requested resource was locked by another process.
+ * This should avoid throwing any exceptions.
+ *
+ * @param $lockDb string
+ * @return bool
+ */
+ protected function lastErrorIndicatesLocked( $lockDb ) {
+ if ( isset( $this->conns[$lockDb] ) ) { // sanity
+ $db = $this->conns[$lockDb];
+ return ( $db->wasDeadlock() || $db->wasLockTimeout() );
+ }
+ return false;
+ }
+
+ /**
+ * Checks if the DB has not recently had connection/query errors.
+ * This just avoids wasting time on doomed connection attempts.
+ *
+ * @param $lockDb string
+ * @return bool
+ */
+ protected function cacheCheckFailures( $lockDb ) {
+ if ( $this->statusCache && $this->safeDelay > 0 ) {
+ $path = $this->getMissKey( $lockDb );
+ $misses = $this->statusCache->get( $path );
+ return !$misses;
+ }
+ return true;
+ }
+
+ /**
+ * Log a lock request failure to the cache
+ *
+ * @param $lockDb string
+ * @return bool Success
+ */
+ protected function cacheRecordFailure( $lockDb ) {
+ if ( $this->statusCache && $this->safeDelay > 0 ) {
+ $path = $this->getMissKey( $lockDb );
+ $misses = $this->statusCache->get( $path );
+ if ( $misses ) {
+ return $this->statusCache->incr( $path );
+ } else {
+ return $this->statusCache->add( $path, 1, $this->safeDelay );
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Get a cache key for recent query misses for a DB
+ *
+ * @param $lockDb string
+ * @return string
+ */
+ protected function getMissKey( $lockDb ) {
+ return 'lockmanager:querymisses:' . str_replace( ' ', '_', $lockDb );
+ }
+
+ /**
+ * Get the bucket for resource path.
+ * This should avoid throwing any exceptions.
+ *
+ * @param $path string
+ * @return integer
+ */
+ protected function getBucketFromKey( $path ) {
+ $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
+ return intval( base_convert( $prefix, 16, 10 ) ) % count( $this->dbsByBucket );
+ }
+
+ /**
+ * Make sure remaining locks get cleared for sanity
+ */
+ function __destruct() {
+ foreach ( $this->conns as $lockDb => $db ) {
+ if ( $db->trxLevel() ) { // in transaction
+ try {
+ $db->rollback(); // finish transaction and kill any rows
+ } catch ( DBError $e ) {
+ // oh well
+ }
+ }
+ $db->close();
+ }
+ }
+}
+
+/**
+ * MySQL version of DBLockManager that supports shared locks.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * @ingroup LockManager
+ */
+class MySqlLockManager extends DBLockManager {
+ /** @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
+ );
+
+ protected function initConnection( $lockDb, DatabaseBase $db ) {
+ # Let this transaction see lock rows from other transactions
+ $db->query( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" );
+ }
+
+ protected function doLockingQuery( $lockDb, array $paths, $type ) {
+ $db = $this->getConnection( $lockDb );
+ if ( !$db ) {
+ return false;
+ }
+ $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+ # Build up values for INSERT clause
+ $data = array();
+ foreach ( $keys as $key ) {
+ $data[] = array( 'fls_key' => $key, 'fls_session' => $this->session );
+ }
+ # Block new writers...
+ $db->insert( 'filelocks_shared', $data, __METHOD__, array( 'IGNORE' ) );
+ # Actually do the locking queries...
+ if ( $type == self::LOCK_SH ) { // reader locks
+ # Bail if there are any existing writers...
+ $blocked = $db->selectField( 'filelocks_exclusive', '1',
+ array( 'fle_key' => $keys ),
+ __METHOD__
+ );
+ # Prospective writers that haven't yet updated filelocks_exclusive
+ # will recheck filelocks_shared after doing so and bail due to our entry.
+ } else { // writer locks
+ $encSession = $db->addQuotes( $this->session );
+ # Bail if there are any existing writers...
+ # The may detect readers, but the safe check for them is below.
+ # Note: if two writers come at the same time, both bail :)
+ $blocked = $db->selectField( 'filelocks_shared', '1',
+ array( 'fls_key' => $keys, "fls_session != $encSession" ),
+ __METHOD__
+ );
+ if ( !$blocked ) {
+ # Build up values for INSERT clause
+ $data = array();
+ foreach ( $keys as $key ) {
+ $data[] = array( 'fle_key' => $key );
+ }
+ # Block new readers/writers...
+ $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
+ # Bail if there are any existing readers...
+ $blocked = $db->selectField( 'filelocks_shared', '1',
+ array( 'fls_key' => $keys, "fls_session != $encSession" ),
+ __METHOD__
+ );
+ }
+ }
+ return !$blocked;
+ }
+}
diff --git a/includes/filerepo/backend/lockmanager/FSLockManager.php b/includes/filerepo/backend/lockmanager/FSLockManager.php
new file mode 100644
index 00000000..42074fd3
--- /dev/null
+++ b/includes/filerepo/backend/lockmanager/FSLockManager.php
@@ -0,0 +1,202 @@
+<?php
+
+/**
+ * Simple version of LockManager based on using FS lock files.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * This should work fine for small sites running off one server.
+ * Do not use this with 'lockDirectory' set to an NFS mount unless the
+ * NFS client is at least version 2.6.12. Otherwise, the BSD flock()
+ * locks will be ignored; see http://nfs.sourceforge.net/#section_d.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class FSLockManager extends LockManager {
+ /** @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
+ );
+
+ protected $lockDir; // global dir for all servers
+
+ /** @var Array Map of (locked key => lock type => lock file handle) */
+ protected $handles = array();
+
+ /**
+ * Construct a new instance from configuration.
+ *
+ * $config includes:
+ * 'lockDirectory' : Directory containing the lock files
+ *
+ * @param array $config
+ */
+ function __construct( array $config ) {
+ parent::__construct( $config );
+ $this->lockDir = $config['lockDirectory'];
+ }
+
+ protected function doLock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ $lockedPaths = array(); // files locked in this attempt
+ foreach ( $paths as $path ) {
+ $status->merge( $this->doSingleLock( $path, $type ) );
+ if ( $status->isOK() ) {
+ $lockedPaths[] = $path;
+ } else {
+ // Abort and unlock everything
+ $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ return $status;
+ }
+ }
+
+ return $status;
+ }
+
+ protected function doUnlock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ foreach ( $paths as $path ) {
+ $status->merge( $this->doSingleUnlock( $path, $type ) );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Lock a single resource key
+ *
+ * @param $path string
+ * @param $type integer
+ * @return Status
+ */
+ protected function doSingleLock( $path, $type ) {
+ $status = Status::newGood();
+
+ if ( isset( $this->locksHeld[$path][$type] ) ) {
+ ++$this->locksHeld[$path][$type];
+ } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+ $this->locksHeld[$path][$type] = 1;
+ } else {
+ wfSuppressWarnings();
+ $handle = fopen( $this->getLockPath( $path ), 'a+' );
+ wfRestoreWarnings();
+ if ( !$handle ) { // lock dir missing?
+ wfMkdirParents( $this->lockDir );
+ $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
+ }
+ if ( $handle ) {
+ // Either a shared or exclusive lock
+ $lock = ( $type == self::LOCK_SH ) ? LOCK_SH : LOCK_EX;
+ if ( flock( $handle, $lock | LOCK_NB ) ) {
+ // Record this lock as active
+ $this->locksHeld[$path][$type] = 1;
+ $this->handles[$path][$type] = $handle;
+ } else {
+ fclose( $handle );
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ } else {
+ $status->fatal( 'lockmanager-fail-openlock', $path );
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * Unlock a single resource key
+ *
+ * @param $path string
+ * @param $type integer
+ * @return Status
+ */
+ protected function doSingleUnlock( $path, $type ) {
+ $status = Status::newGood();
+
+ if ( !isset( $this->locksHeld[$path] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } else {
+ $handlesToClose = array();
+ --$this->locksHeld[$path][$type];
+ if ( $this->locksHeld[$path][$type] <= 0 ) {
+ unset( $this->locksHeld[$path][$type] );
+ // If a LOCK_SH comes in while we have a LOCK_EX, we don't
+ // actually add a handler, so check for handler existence.
+ if ( isset( $this->handles[$path][$type] ) ) {
+ // Mark this handle to be unlocked and closed
+ $handlesToClose[] = $this->handles[$path][$type];
+ unset( $this->handles[$path][$type] );
+ }
+ }
+ // Unlock handles to release locks and delete
+ // any lock files that end up with no locks on them...
+ if ( wfIsWindows() ) {
+ // Windows: for any process, including this one,
+ // calling unlink() on a locked file will fail
+ $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
+ $status->merge( $this->pruneKeyLockFiles( $path ) );
+ } else {
+ // Unix: unlink() can be used on files currently open by this
+ // process and we must do so in order to avoid race conditions
+ $status->merge( $this->pruneKeyLockFiles( $path ) );
+ $status->merge( $this->closeLockHandles( $path, $handlesToClose ) );
+ }
+ }
+
+ return $status;
+ }
+
+ private function closeLockHandles( $path, array $handlesToClose ) {
+ $status = Status::newGood();
+ foreach ( $handlesToClose as $handle ) {
+ wfSuppressWarnings();
+ if ( !flock( $handle, LOCK_UN ) ) {
+ $status->fatal( 'lockmanager-fail-releaselock', $path );
+ }
+ if ( !fclose( $handle ) ) {
+ $status->warning( 'lockmanager-fail-closelock', $path );
+ }
+ wfRestoreWarnings();
+ }
+ return $status;
+ }
+
+ private function pruneKeyLockFiles( $path ) {
+ $status = Status::newGood();
+ if ( !count( $this->locksHeld[$path] ) ) {
+ wfSuppressWarnings();
+ # No locks are held for the lock file anymore
+ if ( !unlink( $this->getLockPath( $path ) ) ) {
+ $status->warning( 'lockmanager-fail-deletelock', $path );
+ }
+ wfRestoreWarnings();
+ unset( $this->locksHeld[$path] );
+ unset( $this->handles[$path] );
+ }
+ return $status;
+ }
+
+ /**
+ * Get the path to the lock file for a key
+ * @param $path string
+ * @return string
+ */
+ protected function getLockPath( $path ) {
+ $hash = self::sha1Base36( $path );
+ return "{$this->lockDir}/{$hash}.lock";
+ }
+
+ function __destruct() {
+ // Make sure remaining locks get cleared for sanity
+ foreach ( $this->locksHeld as $path => $locks ) {
+ $this->doSingleUnlock( $path, self::LOCK_EX );
+ $this->doSingleUnlock( $path, self::LOCK_SH );
+ }
+ }
+}
diff --git a/includes/filerepo/backend/lockmanager/LSLockManager.php b/includes/filerepo/backend/lockmanager/LSLockManager.php
new file mode 100644
index 00000000..b7ac743c
--- /dev/null
+++ b/includes/filerepo/backend/lockmanager/LSLockManager.php
@@ -0,0 +1,295 @@
+<?php
+
+/**
+ * Manage locks using a lock daemon server.
+ *
+ * Version of LockManager based on using lock daemon 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 LockServerDaemon.php, listening on a designated TCP port.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class LSLockManager extends LockManager {
+ /** @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 Array Map of server names to server config */
+ protected $lockServers; // (server name => server config array)
+ /** @var Array Map of bucket indexes to peer server lists */
+ protected $srvsByBucket; // (bucket index => (lsrv1, lsrv2, ...))
+
+ /** @var Array Map Server connections (server name => resource) */
+ protected $conns = array();
+
+ protected $connTimeout; // float number of seconds
+ protected $session = ''; // random SHA-1 string
+
+ /**
+ * Construct a new instance from configuration.
+ *
+ * $config paramaters include:
+ * 'lockServers' : Associative array of server names to configuration.
+ * Configuration is an associative array that includes:
+ * 'host' - IP address/hostname
+ * 'port' - TCP port
+ * 'authKey' - Secret string the lock server uses
+ * 'srvsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
+ * each having an odd-numbered list of server names (peers) as values.
+ * 'connTimeout' : Lock server connection attempt timeout. [optional]
+ *
+ * @param Array $config
+ */
+ public function __construct( array $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
+
+ if ( isset( $config['connTimeout'] ) ) {
+ $this->connTimeout = $config['connTimeout'];
+ } else {
+ $this->connTimeout = 3; // use some sane amount
+ }
+
+ $this->session = '';
+ for ( $i = 0; $i < 5; $i++ ) {
+ $this->session .= mt_rand( 0, 2147483647 );
+ }
+ $this->session = wfBaseConvert( sha1( $this->session ), 16, 36, 31 );
+ }
+
+ protected function doLock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ $pathsToLock = array();
+ // Get locks that need to be acquired (buckets => locks)...
+ foreach ( $paths as $path ) {
+ if ( isset( $this->locksHeld[$path][$type] ) ) {
+ ++$this->locksHeld[$path][$type];
+ } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+ $this->locksHeld[$path][$type] = 1;
+ } else {
+ $bucket = $this->getBucketFromKey( $path );
+ $pathsToLock[$bucket][] = $path;
+ }
+ }
+
+ $lockedPaths = array(); // files locked in this attempt
+ // Attempt to acquire these locks...
+ foreach ( $pathsToLock as $bucket => $paths ) {
+ // Try to acquire the locks for this bucket
+ $res = $this->doLockingRequestAll( $bucket, $paths, $type );
+ if ( $res === 'cantacquire' ) {
+ // Resources already locked by another process.
+ // Abort and unlock everything we just locked.
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ return $status;
+ } elseif ( $res !== true ) {
+ // Couldn't contact any servers for this bucket.
+ // Abort and unlock everything we just locked.
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ return $status;
+ }
+ // Record these locks as active
+ foreach ( $paths as $path ) {
+ $this->locksHeld[$path][$type] = 1; // locked
+ }
+ // Keep track of what locks were made in this attempt
+ $lockedPaths = array_merge( $lockedPaths, $paths );
+ }
+
+ return $status;
+ }
+
+ protected function doUnlock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ foreach ( $paths as $path ) {
+ if ( !isset( $this->locksHeld[$path] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } else {
+ --$this->locksHeld[$path][$type];
+ if ( $this->locksHeld[$path][$type] <= 0 ) {
+ unset( $this->locksHeld[$path][$type] );
+ }
+ if ( !count( $this->locksHeld[$path] ) ) {
+ unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+ }
+ }
+ }
+
+ // Reference count the locks held and release locks when zero
+ if ( !count( $this->locksHeld ) ) {
+ $status->merge( $this->releaseLocks() );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Get a connection to a lock server and acquire locks on $paths
+ *
+ * @param $lockSrv string
+ * @param $paths Array
+ * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @return bool Resources able to be locked
+ */
+ protected function doLockingRequest( $lockSrv, array $paths, $type ) {
+ if ( $type == self::LOCK_SH ) { // reader locks
+ $type = 'SH';
+ } elseif ( $type == self::LOCK_EX ) { // writer locks
+ $type = 'EX';
+ } else {
+ return true; // ok...
+ }
+
+ // Send out the command and get the response...
+ $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+ $response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
+
+ return ( $response === 'ACQUIRED' );
+ }
+
+ /**
+ * Send a command and get back the response
+ *
+ * @param $lockSrv string
+ * @param $action string
+ * @param $type string
+ * @param $values Array
+ * @return string|false
+ */
+ protected function sendCommand( $lockSrv, $action, $type, $values ) {
+ $conn = $this->getConnection( $lockSrv );
+ if ( !$conn ) {
+ return false; // no connection
+ }
+ $authKey = $this->lockServers[$lockSrv]['authKey'];
+ // Build of the command as a flat string...
+ $values = implode( '|', $values );
+ $key = sha1( $this->session . $action . $type . $values . $authKey );
+ // Send out the command...
+ if ( fwrite( $conn, "{$this->session}:$key:$action:$type:$values\n" ) === false ) {
+ return false;
+ }
+ // Get the response...
+ $response = fgets( $conn );
+ if ( $response === false ) {
+ return false;
+ }
+ return trim( $response );
+ }
+
+ /**
+ * Attempt to acquire locks with the peers for a bucket
+ *
+ * @param $bucket integer
+ * @param $paths Array List of resource keys to lock
+ * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @return bool|string One of (true, 'cantacquire', 'srverrors')
+ */
+ protected function doLockingRequestAll( $bucket, array $paths, $type ) {
+ $yesVotes = 0; // locks made on trustable servers
+ $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+ $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+ // Get votes for each peer, in order, until we have enough...
+ foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+ // Attempt to acquire the lock on this peer
+ if ( !$this->doLockingRequest( $lockSrv, $paths, $type ) ) {
+ return 'cantacquire'; // vetoed; resource locked
+ }
+ ++$yesVotes; // success for this peer
+ if ( $yesVotes >= $quorum ) {
+ return true; // lock obtained
+ }
+ --$votesLeft;
+ $votesNeeded = $quorum - $yesVotes;
+ if ( $votesNeeded > $votesLeft ) {
+ // In "trust cache" mode we don't have to meet the quorum
+ break; // short-circuit
+ }
+ }
+ // At this point, we must not have meet the quorum
+ return 'srverrors'; // not enough votes to ensure correctness
+ }
+
+ /**
+ * Get (or reuse) a connection to a lock server
+ *
+ * @param $lockSrv string
+ * @return resource
+ */
+ protected function getConnection( $lockSrv ) {
+ if ( !isset( $this->conns[$lockSrv] ) ) {
+ $cfg = $this->lockServers[$lockSrv];
+ wfSuppressWarnings();
+ $errno = $errstr = '';
+ $conn = fsockopen( $cfg['host'], $cfg['port'], $errno, $errstr, $this->connTimeout );
+ wfRestoreWarnings();
+ if ( $conn === false ) {
+ return null;
+ }
+ $sec = floor( $this->connTimeout );
+ $usec = floor( ( $this->connTimeout - floor( $this->connTimeout ) ) * 1e6 );
+ stream_set_timeout( $conn, $sec, $usec );
+ $this->conns[$lockSrv] = $conn;
+ }
+ return $this->conns[$lockSrv];
+ }
+
+ /**
+ * Release all locks that this session is holding
+ *
+ * @return Status
+ */
+ protected function releaseLocks() {
+ $status = Status::newGood();
+ foreach ( $this->conns as $lockSrv => $conn ) {
+ $response = $this->sendCommand( $lockSrv, 'RELEASE_ALL', '', array() );
+ if ( $response !== 'RELEASED_ALL' ) {
+ $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+ }
+ }
+ return $status;
+ }
+
+ /**
+ * Get the bucket for resource path.
+ * This should avoid throwing any exceptions.
+ *
+ * @param $path string
+ * @return integer
+ */
+ protected function getBucketFromKey( $path ) {
+ $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
+ return intval( base_convert( $prefix, 16, 10 ) ) % count( $this->srvsByBucket );
+ }
+
+ /**
+ * Make sure remaining locks get cleared for sanity
+ */
+ function __destruct() {
+ $this->releaseLocks();
+ foreach ( $this->conns as $conn ) {
+ fclose( $conn );
+ }
+ }
+}
diff --git a/includes/filerepo/backend/lockmanager/LockManager.php b/includes/filerepo/backend/lockmanager/LockManager.php
new file mode 100644
index 00000000..23603a4f
--- /dev/null
+++ b/includes/filerepo/backend/lockmanager/LockManager.php
@@ -0,0 +1,182 @@
+<?php
+/**
+ * @defgroup LockManager Lock management
+ * @ingroup FileBackend
+ */
+
+/**
+ * @file
+ * @ingroup LockManager
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class for handling resource locking.
+ *
+ * Locks on resource keys can either be shared or exclusive.
+ *
+ * Implementations must keep track of what is locked by this proccess
+ * in-memory and support nested locking calls (using reference counting).
+ * At least LOCK_UW and LOCK_EX must be implemented. LOCK_SH can be a no-op.
+ * Locks should either be non-blocking or have low wait timeouts.
+ *
+ * Subclasses should avoid throwing exceptions at all costs.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+abstract class LockManager {
+ /** @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_EX, // subclasses may use self::LOCK_SH
+ self::LOCK_EX => self::LOCK_EX
+ );
+
+ /** @var Array Map of (resource path => lock type => count) */
+ protected $locksHeld = array();
+
+ /* 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)
+
+ /**
+ * Construct a new instance from configuration
+ *
+ * @param $config Array
+ */
+ public function __construct( array $config ) {}
+
+ /**
+ * Lock the resources at the given abstract paths
+ *
+ * @param $paths Array List of resource names
+ * @param $type integer LockManager::LOCK_* constant
+ * @return Status
+ */
+ final public function lock( array $paths, $type = self::LOCK_EX ) {
+ return $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+ }
+
+ /**
+ * Unlock the resources at the given abstract paths
+ *
+ * @param $paths Array List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @return Status
+ */
+ final public function unlock( array $paths, $type = self::LOCK_EX ) {
+ return $this->doUnlock( array_unique( $paths ), $this->lockTypeMap[$type] );
+ }
+
+ /**
+ * Get the base 36 SHA-1 of a string, padded to 31 digits
+ *
+ * @param $path string
+ * @return string
+ */
+ final protected static function sha1Base36( $path ) {
+ return wfBaseConvert( sha1( $path ), 16, 36, 31 );
+ }
+
+ /**
+ * Lock resources with the given keys and lock type
+ *
+ * @param $paths Array List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @return string
+ */
+ abstract protected function doLock( array $paths, $type );
+
+ /**
+ * Unlock resources with the given keys and lock type
+ *
+ * @param $paths Array List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @return string
+ */
+ abstract protected function doUnlock( array $paths, $type );
+}
+
+/**
+ * Self releasing locks
+ *
+ * LockManager helper class to handle scoped locks, which
+ * release when an object is destroyed or goes out of scope.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class ScopedLock {
+ /** @var LockManager */
+ protected $manager;
+ /** @var Status */
+ protected $status;
+ /** @var Array List of resource paths*/
+ protected $paths;
+
+ protected $type; // integer lock type
+
+ /**
+ * @param $manager LockManager
+ * @param $paths Array List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @param $status Status
+ */
+ protected function __construct(
+ LockManager $manager, array $paths, $type, Status $status
+ ) {
+ $this->manager = $manager;
+ $this->paths = $paths;
+ $this->status = $status;
+ $this->type = $type;
+ }
+
+ protected function __clone() {}
+
+ /**
+ * Get a ScopedLock object representing a lock on resource paths.
+ * Any locks are released once this object goes out of scope.
+ * The status object is updated with any errors or warnings.
+ *
+ * @param $manager LockManager
+ * @param $paths Array List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @param $status Status
+ * @return ScopedLock|null Returns null on failure
+ */
+ public static function factory(
+ LockManager $manager, array $paths, $type, Status $status
+ ) {
+ $lockStatus = $manager->lock( $paths, $type );
+ $status->merge( $lockStatus );
+ if ( $lockStatus->isOK() ) {
+ return new self( $manager, $paths, $type, $status );
+ }
+ return null;
+ }
+
+ function __destruct() {
+ $wasOk = $this->status->isOK();
+ $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
+ if ( $wasOk ) {
+ // Make sure status is OK, despite any unlockFiles() fatals
+ $this->status->setResult( true, $this->status->value );
+ }
+ }
+}
+
+/**
+ * Simple version of LockManager that does nothing
+ * @since 1.19
+ */
+class NullLockManager extends LockManager {
+ protected function doLock( array $paths, $type ) {
+ return Status::newGood();
+ }
+
+ protected function doUnlock( array $paths, $type ) {
+ return Status::newGood();
+ }
+}
diff --git a/includes/filerepo/backend/lockmanager/LockManagerGroup.php b/includes/filerepo/backend/lockmanager/LockManagerGroup.php
new file mode 100644
index 00000000..11e77972
--- /dev/null
+++ b/includes/filerepo/backend/lockmanager/LockManagerGroup.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Class to handle file lock manager registration
+ *
+ * @ingroup LockManager
+ * @author Aaron Schulz
+ * @since 1.19
+ */
+class LockManagerGroup {
+
+ /**
+ * @var LockManagerGroup
+ */
+ protected static $instance = null;
+
+ /** @var Array of (name => ('class' =>, 'config' =>, 'instance' =>)) */
+ protected $managers = array();
+
+ protected function __construct() {}
+ protected function __clone() {}
+
+ /**
+ * @return LockManagerGroup
+ */
+ public static function singleton() {
+ if ( self::$instance == null ) {
+ self::$instance = new self();
+ self::$instance->initFromGlobals();
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Register lock managers from the global variables
+ *
+ * @return void
+ */
+ protected function initFromGlobals() {
+ global $wgLockManagers;
+
+ $this->register( $wgLockManagers );
+ }
+
+ /**
+ * Register an array of file lock manager configurations
+ *
+ * @param $configs Array
+ * @return void
+ * @throws MWException
+ */
+ protected function register( array $configs ) {
+ foreach ( $configs as $config ) {
+ if ( !isset( $config['name'] ) ) {
+ throw new MWException( "Cannot register a lock manager with no name." );
+ }
+ $name = $config['name'];
+ if ( !isset( $config['class'] ) ) {
+ throw new MWException( "Cannot register lock manager `{$name}` with no class." );
+ }
+ $class = $config['class'];
+ unset( $config['class'] ); // lock manager won't need this
+ $this->managers[$name] = array(
+ 'class' => $class,
+ 'config' => $config,
+ 'instance' => null
+ );
+ }
+ }
+
+ /**
+ * Get the lock manager object with a given name
+ *
+ * @param $name string
+ * @return LockManager
+ * @throws MWException
+ */
+ public function get( $name ) {
+ if ( !isset( $this->managers[$name] ) ) {
+ throw new MWException( "No lock manager defined with the name `$name`." );
+ }
+ // Lazy-load the actual lock manager instance
+ if ( !isset( $this->managers[$name]['instance'] ) ) {
+ $class = $this->managers[$name]['class'];
+ $config = $this->managers[$name]['config'];
+ $this->managers[$name]['instance'] = new $class( $config );
+ }
+ return $this->managers[$name]['instance'];
+ }
+}
diff --git a/includes/filerepo/ArchivedFile.php b/includes/filerepo/file/ArchivedFile.php
index 0d9e349b..3b9bd7f0 100644
--- a/includes/filerepo/ArchivedFile.php
+++ b/includes/filerepo/file/ArchivedFile.php
@@ -3,13 +3,13 @@
* Deleted file in the 'filearchive' table
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
* Class representing a row of the 'filearchive' table
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class ArchivedFile {
/**#@+
@@ -73,8 +73,8 @@ class ArchivedFile {
$this->dataLoaded = false;
$this->exists = false;
- if( is_object( $title ) ) {
- $this->title = $title;
+ if( $title instanceof Title ) {
+ $this->title = File::normalizeTitle( $title, 'exception' );
$this->name = $title->getDBkey();
}
@@ -86,7 +86,7 @@ class ArchivedFile {
$this->key = $key;
}
- if ( !$id && !$key && !is_object( $title ) ) {
+ if ( !$id && !$key && !( $title instanceof Title ) ) {
throw new MWException( "No specifications provided to ArchivedFile constructor." );
}
}
@@ -177,6 +177,9 @@ class ArchivedFile {
/**
* Loads a file object from the filearchive table
+ *
+ * @param $row
+ *
* @return ArchivedFile
*/
public static function newFromRow( $row ) {
@@ -205,6 +208,8 @@ class ArchivedFile {
/**
* Return the associated title object
+ *
+ * @return Title
*/
public function getTitle() {
return $this->title;
@@ -212,16 +217,24 @@ class ArchivedFile {
/**
* Return the file name
+ *
+ * @return string
*/
public function getName() {
return $this->name;
}
+ /**
+ * @return int
+ */
public function getID() {
$this->load();
return $this->id;
}
+ /**
+ * @return bool
+ */
public function exists() {
$this->load();
return $this->exists;
@@ -229,6 +242,7 @@ class ArchivedFile {
/**
* Return the FileStore key
+ * @return string
*/
public function getKey() {
$this->load();
@@ -237,6 +251,7 @@ class ArchivedFile {
/**
* Return the FileStore key (overriding base File class)
+ * @return string
*/
public function getStorageKey() {
return $this->getKey();
@@ -244,6 +259,7 @@ class ArchivedFile {
/**
* Return the FileStore storage group
+ * @return string
*/
public function getGroup() {
return $this->group;
@@ -251,6 +267,7 @@ class ArchivedFile {
/**
* Return the width of the image
+ * @return int
*/
public function getWidth() {
$this->load();
@@ -259,6 +276,7 @@ class ArchivedFile {
/**
* Return the height of the image
+ * @return int
*/
public function getHeight() {
$this->load();
@@ -267,6 +285,7 @@ class ArchivedFile {
/**
* Get handler-specific metadata
+ * @return string
*/
public function getMetadata() {
$this->load();
@@ -275,6 +294,7 @@ class ArchivedFile {
/**
* Return the size of the image file, in bytes
+ * @return int
*/
public function getSize() {
$this->load();
@@ -283,6 +303,7 @@ class ArchivedFile {
/**
* Return the bits of the image file, in bytes
+ * @return int
*/
public function getBits() {
$this->load();
@@ -291,6 +312,7 @@ class ArchivedFile {
/**
* Returns the mime type of the file.
+ * @return string
*/
public function getMimeType() {
$this->load();
@@ -326,6 +348,7 @@ class ArchivedFile {
/**
* Return the type of the media in the file.
* Use the value returned by this function with the MEDIATYPE_xxx constants.
+ * @return string
*/
public function getMediaType() {
$this->load();
@@ -334,6 +357,8 @@ class ArchivedFile {
/**
* Return upload timestamp.
+ *
+ * @return string
*/
public function getTimestamp() {
$this->load();
@@ -342,6 +367,8 @@ class ArchivedFile {
/**
* Return the user ID of the uploader.
+ *
+ * @return int
*/
public function getUser() {
$this->load();
@@ -354,6 +381,8 @@ class ArchivedFile {
/**
* Return the user name of the uploader.
+ *
+ * @return string
*/
public function getUserText() {
$this->load();
@@ -366,6 +395,8 @@ class ArchivedFile {
/**
* Return upload description.
+ *
+ * @return string
*/
public function getDescription() {
$this->load();
@@ -378,6 +409,8 @@ class ArchivedFile {
/**
* Return the user ID of the uploader.
+ *
+ * @return int
*/
public function getRawUser() {
$this->load();
@@ -386,6 +419,8 @@ class ArchivedFile {
/**
* Return the user name of the uploader.
+ *
+ * @return string
*/
public function getRawUserText() {
$this->load();
@@ -394,6 +429,8 @@ class ArchivedFile {
/**
* Return upload description.
+ *
+ * @return string
*/
public function getRawDescription() {
$this->load();
@@ -424,10 +461,11 @@ class ArchivedFile {
* Determine if the current user is allowed to view a particular
* field of this FileStore image file, if it's marked as deleted.
* @param $field Integer
+ * @param $user User object to check, or null to use $wgUser
* @return bool
*/
- public function userCan( $field ) {
+ public function userCan( $field, User $user = null ) {
$this->load();
- return Revision::userCanBitfield( $this->deleted, $field );
+ return Revision::userCanBitfield( $this->deleted, $field, $user );
}
}
diff --git a/includes/filerepo/File.php b/includes/filerepo/file/File.php
index 1fd6d452..f74fb678 100644
--- a/includes/filerepo/File.php
+++ b/includes/filerepo/file/File.php
@@ -1,9 +1,16 @@
<?php
/**
+ * @defgroup FileAbstraction File abstraction
+ * @ingroup FileRepo
+ *
+ * Represents files in a repository.
+ */
+
+/**
* Base code for files.
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
@@ -23,14 +30,21 @@
* The convenience functions wfLocalFile() and wfFindFile() should be sufficient
* in most cases.
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
abstract class File {
const DELETED_FILE = 1;
const DELETED_COMMENT = 2;
const DELETED_USER = 4;
const DELETED_RESTRICTED = 8;
- const RENDER_NOW = 1;
+
+ /** Force rendering in the current process */
+ const RENDER_NOW = 1;
+ /**
+ * Force rendering even if thumbnail already exist and using RENDER_NOW
+ * I.e. you have to pass both flags: File::RENDER_NOW | File::RENDER_FORCE
+ */
+ const RENDER_FORCE = 2;
const DELETE_SOURCE = 1;
@@ -54,30 +68,88 @@ abstract class File {
*/
/**
- * @var LocalRepo
+ * @var FileRepo|false
*/
var $repo;
/**
- * @var Title
+ * @var Title|false
*/
var $title;
var $lastError, $redirected, $redirectedTitle;
/**
+ * @var FSFile|false
+ */
+ protected $fsFile;
+
+ /**
* @var MediaHandler
*/
protected $handler;
/**
- * Call this constructor from child classes
+ * @var string
+ */
+ protected $url, $extension, $name, $path, $hashPath, $pageCount, $transformScript;
+
+ /**
+ * @var bool
+ */
+ protected $canRender, $isSafeFile;
+
+ /**
+ * @var string Required Repository class type
+ */
+ protected $repoClass = 'FileRepo';
+
+ /**
+ * Call this constructor from child classes.
+ *
+ * Both $title and $repo are optional, though some functions
+ * may return false or throw exceptions if they are not set.
+ * Most subclasses will want to call assertRepoDefined() here.
+ *
+ * @param $title Title|string|false
+ * @param $repo FileRepo|false
*/
function __construct( $title, $repo ) {
+ if ( $title !== false ) { // subclasses may not use MW titles
+ $title = self::normalizeTitle( $title, 'exception' );
+ }
$this->title = $title;
$this->repo = $repo;
}
+ /**
+ * Given a string or Title object return either a
+ * valid Title object with namespace NS_FILE or null
+ *
+ * @param $title Title|string
+ * @param $exception string|false Use 'exception' to throw an error on bad titles
+ * @return Title|null
+ */
+ static function normalizeTitle( $title, $exception = false ) {
+ $ret = $title;
+ if ( $ret instanceof Title ) {
+ # Normalize NS_MEDIA -> NS_FILE
+ if ( $ret->getNamespace() == NS_MEDIA ) {
+ $ret = Title::makeTitleSafe( NS_FILE, $ret->getDBkey() );
+ # Sanity check the title namespace
+ } elseif ( $ret->getNamespace() !== NS_FILE ) {
+ $ret = null;
+ }
+ } else {
+ # Convert strings to Title objects
+ $ret = Title::makeTitleSafe( NS_FILE, (string)$ret );
+ }
+ if ( !$ret && $exception !== false ) {
+ throw new MWException( "`$title` is not a valid file title." );
+ }
+ return $ret;
+ }
+
function __get( $name ) {
$function = array( $this, 'get' . ucfirst( $name ) );
if ( !is_callable( $function ) ) {
@@ -123,8 +195,7 @@ abstract class File {
static function checkExtensionCompatibility( File $old, $new ) {
$oldMime = $old->getMimeType();
$n = strrpos( $new, '.' );
- $newExt = self::normalizeExtension(
- $n ? substr( $new, $n + 1 ) : '' );
+ $newExt = self::normalizeExtension( $n ? substr( $new, $n + 1 ) : '' );
$mimeMagic = MimeMagic::singleton();
return $mimeMagic->isMatchingExtension( $newExt, $oldMime );
}
@@ -158,6 +229,7 @@ abstract class File {
*/
public function getName() {
if ( !isset( $this->name ) ) {
+ $this->assertRepoDefined();
$this->name = $this->repo->getNameFromTitle( $this->title );
}
return $this->name;
@@ -179,9 +251,12 @@ abstract class File {
/**
* Return the associated title object
- * @return Title
+ *
+ * @return Title|false
*/
- public function getTitle() { return $this->title; }
+ public function getTitle() {
+ return $this->title;
+ }
/**
* Return the title used to find this file
@@ -202,6 +277,7 @@ abstract class File {
*/
public function getUrl() {
if ( !isset( $this->url ) ) {
+ $this->assertRepoDefined();
$this->url = $this->repo->getZoneUrl( 'public' ) . '/' . $this->getUrlRel();
}
return $this->url;
@@ -218,6 +294,9 @@ abstract class File {
return wfExpandUrl( $this->getUrl(), PROTO_RELATIVE );
}
+ /**
+ * @return string
+ */
public function getCanonicalUrl() {
return wfExpandUrl( $this->getUrl(), PROTO_CANONICAL );
}
@@ -226,11 +305,12 @@ abstract class File {
* @return string
*/
function getViewURL() {
- if( $this->mustRender()) {
- if( $this->canRender() ) {
+ if ( $this->mustRender() ) {
+ if ( $this->canRender() ) {
return $this->createThumb( $this->getWidth() );
} else {
- wfDebug(__METHOD__.': supposed to render '.$this->getName().' ('.$this->getMimeType()."), but can't!\n");
+ wfDebug( __METHOD__.': supposed to render ' . $this->getName() .
+ ' (' . $this->getMimeType() . "), but can't!\n" );
return $this->getURL(); #hm... return NULL?
}
} else {
@@ -239,7 +319,7 @@ abstract class File {
}
/**
- * Return the full filesystem path to the file. Note that this does
+ * Return the storage path to the file. Note that this does
* not mean that a file actually exists under that location.
*
* This path depends on whether directory hashing is active or not,
@@ -253,21 +333,30 @@ abstract class File {
*/
public function getPath() {
if ( !isset( $this->path ) ) {
- $this->path = $this->repo->getZonePath('public') . '/' . $this->getRel();
+ $this->assertRepoDefined();
+ $this->path = $this->repo->getZonePath( 'public' ) . '/' . $this->getRel();
}
return $this->path;
}
/**
- * Alias for getPath()
- *
- * @deprecated since 1.18 Use getPath().
+ * Get an FS copy or original of this file and return the path.
+ * Returns false on failure. Callers must not alter the file.
+ * Temporary files are cleared automatically.
*
- * @return string
+ * @return string|false
*/
- public function getFullPath() {
- wfDeprecated( __METHOD__ );
- return $this->getPath();
+ public function getLocalRefPath() {
+ $this->assertRepoDefined();
+ if ( !isset( $this->fsFile ) ) {
+ $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
+ if ( !$this->fsFile ) {
+ $this->fsFile = false; // null => false; cache negative hits
+ }
+ }
+ return ( $this->fsFile )
+ ? $this->fsFile->getPath()
+ : false;
}
/**
@@ -292,6 +381,8 @@ abstract class File {
* STUB
* Overridden by LocalFile, UnregisteredLocalFile
*
+ * @param $page int
+ *
* @return false|number
*/
public function getHeight( $page = 1 ) {
@@ -357,7 +448,7 @@ abstract class File {
public function convertMetadataVersion($metadata, $version) {
$handler = $this->getHandler();
if ( !is_array( $metadata ) ) {
- //just to make the return type consistant
+ // Just to make the return type consistent
$metadata = unserialize( $metadata );
}
if ( $handler ) {
@@ -402,7 +493,9 @@ abstract class File {
* Overridden by LocalFile,
* STUB
*/
- function getMediaType() { return MEDIATYPE_UNKNOWN; }
+ function getMediaType() {
+ return MEDIATYPE_UNKNOWN;
+ }
/**
* Checks if the output of transform() for this file is likely
@@ -488,6 +581,8 @@ abstract class File {
* @return bool
*/
protected function _getIsSafeFile() {
+ global $wgTrustedMediaFormats;
+
if ( $this->allowInlineDisplay() ) {
return true;
}
@@ -495,8 +590,6 @@ abstract class File {
return true;
}
- global $wgTrustedMediaFormats;
-
$type = $this->getMediaType();
$mime = $this->getMimeType();
#wfDebug("LocalFile::isSafeFile: type= $type, mime= $mime\n");
@@ -532,7 +625,7 @@ abstract class File {
* @return bool
*/
function isTrustedFile() {
- #this could be implemented to check a flag in the databas,
+ #this could be implemented to check a flag in the database,
#look for signatures, etc
return false;
}
@@ -545,7 +638,7 @@ abstract class File {
* @return boolean Whether file exists in the repository.
*/
public function exists() {
- return $this->getPath() && file_exists( $this->path );
+ return $this->getPath() && $this->repo->fileExists( $this->path );
}
/**
@@ -617,7 +710,8 @@ abstract class File {
return null;
}
$extension = $this->getExtension();
- list( $thumbExt, $thumbMime ) = $this->handler->getThumbType( $extension, $this->getMimeType(), $params );
+ list( $thumbExt, $thumbMime ) = $this->handler->getThumbType(
+ $extension, $this->getMimeType(), $params );
$thumbName = $this->handler->makeParamString( $params ) . '-' . $name;
if ( $thumbExt != $extension ) {
$thumbName .= ".$thumbExt";
@@ -648,85 +742,147 @@ abstract class File {
$params['height'] = $height;
}
$thumb = $this->transform( $params );
- if( is_null( $thumb ) || $thumb->isError() ) return '';
+ if ( is_null( $thumb ) || $thumb->isError() ) {
+ return '';
+ }
return $thumb->getUrl();
}
/**
+ * Return either a MediaTransformError or placeholder thumbnail (if $wgIgnoreImageErrors)
+ *
+ * @param $thumbPath string Thumbnail storage path
+ * @param $thumbUrl string Thumbnail URL
+ * @param $params Array
+ * @param $flags integer
+ * @return MediaTransformOutput
+ */
+ protected function transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags ) {
+ global $wgIgnoreImageErrors;
+
+ if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+ return $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ } else {
+ return new MediaTransformError( 'thumbnail_error',
+ $params['width'], 0, wfMsg( 'thumbnail-dest-create' ) );
+ }
+ }
+
+ /**
* Transform a media file
*
* @param $params Array: an associative array of handler-specific parameters.
* Typical keys are width, height and page.
* @param $flags Integer: a bitfield, may contain self::RENDER_NOW to force rendering
- * @return MediaTransformOutput | false
+ * @return MediaTransformOutput|false
*/
function transform( $params, $flags = 0 ) {
- global $wgUseSquid, $wgIgnoreImageErrors, $wgThumbnailEpoch, $wgServer;
+ global $wgUseSquid, $wgIgnoreImageErrors, $wgThumbnailEpoch;
wfProfileIn( __METHOD__ );
do {
if ( !$this->canRender() ) {
- // not a bitmap or renderable image, don't try.
$thumb = $this->iconThumb();
- break;
+ break; // not a bitmap or renderable image, don't try
}
// Get the descriptionUrl to embed it as comment into the thumbnail. Bug 19791.
- $descriptionUrl = $this->getDescriptionUrl();
+ $descriptionUrl = $this->getDescriptionUrl();
if ( $descriptionUrl ) {
$params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
}
$script = $this->getTransformScript();
- if ( $script && !($flags & self::RENDER_NOW) ) {
+ if ( $script && !( $flags & self::RENDER_NOW ) ) {
// Use a script to transform on client request, if possible
$thumb = $this->handler->getScriptedTransform( $this, $script, $params );
- if( $thumb ) {
+ if ( $thumb ) {
break;
}
}
$normalisedParams = $params;
$this->handler->normaliseParams( $this, $normalisedParams );
+
$thumbName = $this->thumbName( $normalisedParams );
- $thumbPath = $this->getThumbPath( $thumbName );
$thumbUrl = $this->getThumbUrl( $thumbName );
+ $thumbPath = $this->getThumbPath( $thumbName ); // final thumb path
- if ( $this->repo && $this->repo->canTransformVia404() && !($flags & self::RENDER_NOW ) ) {
- $thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
- break;
- }
-
- wfDebug( __METHOD__.": Doing stat for $thumbPath\n" );
- $this->migrateThumbFile( $thumbName );
- if ( file_exists( $thumbPath )) {
- $thumbTime = filemtime( $thumbPath );
- if ( $thumbTime !== FALSE &&
- gmdate( 'YmdHis', $thumbTime ) >= $wgThumbnailEpoch ) {
-
+ if ( $this->repo ) {
+ // Defer rendering if a 404 handler is set up...
+ if ( $this->repo->canTransformVia404() && !( $flags & self::RENDER_NOW ) ) {
+ wfDebug( __METHOD__ . " transformation deferred." );
+ // 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 = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
break;
}
+ // Clean up broken thumbnails as needed
+ $this->migrateThumbFile( $thumbName );
+ // Check if an up-to-date thumbnail already exists...
+ wfDebug( __METHOD__.": Doing stat for $thumbPath\n" );
+ if ( $this->repo->fileExists( $thumbPath ) && !( $flags & self::RENDER_FORCE ) ) {
+ $timestamp = $this->repo->getFileTimestamp( $thumbPath );
+ if ( $timestamp !== false && $timestamp >= $wgThumbnailEpoch ) {
+ // 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 = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ $thumb->setStoragePath( $thumbPath );
+ break;
+ }
+ } elseif ( $flags & self::RENDER_FORCE ) {
+ wfDebug( __METHOD__ . " forcing rendering per flag File::RENDER_FORCE\n" );
+ }
+ }
+
+ // Create a temp FS file with the same extension and the thumbnail
+ $thumbExt = FileBackend::extensionFromPath( $thumbPath );
+ $tmpFile = TempFSFile::factory( 'transform_', $thumbExt );
+ if ( !$tmpFile ) {
+ $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
+ break;
}
- $thumb = $this->handler->doTransform( $this, $thumbPath, $thumbUrl, $params );
+ $tmpThumbPath = $tmpFile->getPath(); // path of 0-byte temp file
- // Ignore errors if requested
- if ( !$thumb ) {
+ // Actually render the thumbnail...
+ $thumb = $this->handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $params );
+ $tmpFile->bind( $thumb ); // keep alive with $thumb
+
+ if ( !$thumb ) { // bad params?
$thumb = null;
- } elseif ( $thumb->isError() ) {
+ } elseif ( $thumb->isError() ) { // transform error
$this->lastError = $thumb->toText();
- if ( $wgIgnoreImageErrors && !($flags & self::RENDER_NOW) ) {
- $thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ // Ignore errors if requested
+ if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+ $thumb = $this->handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
+ }
+ } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
+ $backend = $this->repo->getBackend();
+ // Copy the thumbnail from the file system into storage. This avoids using
+ // FileRepo::store(); getThumbPath() uses a different zone in some subclasses.
+ $backend->prepare( array( 'dir' => dirname( $thumbPath ) ) );
+ $status = $backend->store(
+ array( 'src' => $tmpThumbPath, 'dst' => $thumbPath, 'overwrite' => 1 ),
+ array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1 )
+ );
+ if ( $status->isOK() ) {
+ $thumb->setStoragePath( $thumbPath );
+ } else {
+ $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
}
}
// Purge. Useful in the event of Core -> Squid connection failure or squid
// purge collisions from elsewhere during failure. Don't keep triggering for
// "thumbs" which have the main image URL though (bug 13776)
- if ( $wgUseSquid && ( !$thumb || $thumb->isError() || $thumb->getUrl() != $this->getURL()) ) {
- SquidUpdate::purge( array( $thumbUrl ) );
+ if ( $wgUseSquid ) {
+ if ( !$thumb || $thumb->isError() || $thumb->getUrl() != $this->getURL() ) {
+ SquidUpdate::purge( array( $thumbUrl ) );
+ }
}
- } while (false);
+ } while ( false );
wfProfileOut( __METHOD__ );
return is_object( $thumb ) ? $thumb : false;
@@ -741,6 +897,7 @@ abstract class File {
/**
* Get a MediaHandler instance for this file
+ *
* @return MediaHandler
*/
function getHandler() {
@@ -752,16 +909,17 @@ abstract class File {
/**
* Get a ThumbnailImage representing a file type icon
+ *
* @return ThumbnailImage
*/
function iconThumb() {
global $wgStylePath, $wgStyleDirectory;
$try = array( 'fileicon-' . $this->getExtension() . '.png', 'fileicon.png' );
- foreach( $try as $icon ) {
+ foreach ( $try as $icon ) {
$path = '/common/images/icons/' . $icon;
$filepath = $wgStyleDirectory . $path;
- if( file_exists( $filepath ) ) {
+ if ( file_exists( $filepath ) ) { // always FS
return new ThumbnailImage( $this, $wgStylePath . $path, 120, 120 );
}
}
@@ -789,8 +947,10 @@ abstract class File {
* Purge shared caches such as thumbnails and DB data caching
* STUB
* Overridden by LocalFile
+ * @param $options Array Options, which include:
+ * 'forThumbRefresh' : The purging is only to refresh thumbnails
*/
- function purgeCache() {}
+ function purgeCache( $options = array() ) {}
/**
* Purge the file description page, but don't go after
@@ -866,13 +1026,15 @@ abstract class File {
*/
function getHashPath() {
if ( !isset( $this->hashPath ) ) {
+ $this->assertRepoDefined();
$this->hashPath = $this->repo->getHashPath( $this->getName() );
}
return $this->hashPath;
}
/**
- * Get the path of the file relative to the public zone root
+ * Get the path of the file relative to the public zone root.
+ * This function is overriden in OldLocalFile to be like getArchiveRel().
*
* @return string
*/
@@ -881,16 +1043,7 @@ abstract class File {
}
/**
- * Get urlencoded relative path of the file
- *
- * @return string
- */
- function getUrlRel() {
- return $this->getHashPath() . rawurlencode( $this->getName() );
- }
-
- /**
- * Get the relative path for an archived file
+ * Get the path of an archived file relative to the public zone root
*
* @param $suffix bool|string if not false, the name of an archived thumbnail file
*
@@ -907,11 +1060,39 @@ abstract class File {
}
/**
- * Get the relative path for an archived file's thumbs directory
+ * Get the path, relative to the thumbnail zone root, of the
+ * thumbnail directory or a particular file if $suffix is specified
+ *
+ * @param $suffix bool|string if not false, the name of a thumbnail file
+ *
+ * @return string
+ */
+ function getThumbRel( $suffix = false ) {
+ $path = $this->getRel();
+ if ( $suffix !== false ) {
+ $path .= '/' . $suffix;
+ }
+ return $path;
+ }
+
+ /**
+ * Get urlencoded path of the file relative to the public zone root.
+ * This function is overriden in OldLocalFile to be like getArchiveUrl().
+ *
+ * @return string
+ */
+ function getUrlRel() {
+ return $this->getHashPath() . rawurlencode( $this->getName() );
+ }
+
+ /**
+ * Get the path, relative to the thumbnail zone root, for an archived file's thumbs directory
* or a specific thumb if the $suffix is given.
*
* @param $archiveName string the timestamped name of an archived image
* @param $suffix bool|string if not false, the name of a thumbnail file
+ *
+ * @return string
*/
function getArchiveThumbRel( $archiveName, $suffix = false ) {
$path = 'archive/' . $this->getHashPath() . $archiveName . "/";
@@ -931,11 +1112,12 @@ abstract class File {
* @return string
*/
function getArchivePath( $suffix = false ) {
+ $this->assertRepoDefined();
return $this->repo->getZonePath( 'public' ) . '/' . $this->getArchiveRel( $suffix );
}
/**
- * Get the path of the archived file's thumbs, or a particular thumb if $suffix is specified
+ * Get the path of an archived file's thumbs, or a particular thumb if $suffix is specified
*
* @param $archiveName string the timestamped name of an archived image
* @param $suffix bool|string if not false, the name of a thumbnail file
@@ -943,7 +1125,9 @@ abstract class File {
* @return string
*/
function getArchiveThumbPath( $archiveName, $suffix = false ) {
- return $this->repo->getZonePath( 'thumb' ) . '/' . $this->getArchiveThumbRel( $archiveName, $suffix );
+ $this->assertRepoDefined();
+ return $this->repo->getZonePath( 'thumb' ) . '/' .
+ $this->getArchiveThumbRel( $archiveName, $suffix );
}
/**
@@ -954,11 +1138,8 @@ abstract class File {
* @return string
*/
function getThumbPath( $suffix = false ) {
- $path = $this->repo->getZonePath( 'thumb' ) . '/' . $this->getRel();
- if ( $suffix !== false ) {
- $path .= '/' . $suffix;
- }
- return $path;
+ $this->assertRepoDefined();
+ return $this->repo->getZonePath( 'thumb' ) . '/' . $this->getThumbRel( $suffix );
}
/**
@@ -969,7 +1150,8 @@ abstract class File {
* @return string
*/
function getArchiveUrl( $suffix = false ) {
- $path = $this->repo->getZoneUrl('public') . '/archive/' . $this->getHashPath();
+ $this->assertRepoDefined();
+ $path = $this->repo->getZoneUrl( 'public' ) . '/archive/' . $this->getHashPath();
if ( $suffix === false ) {
$path = substr( $path, 0, -1 );
} else {
@@ -987,7 +1169,9 @@ abstract class File {
* @return string
*/
function getArchiveThumbUrl( $archiveName, $suffix = false ) {
- $path = $this->repo->getZoneUrl('thumb') . '/archive/' . $this->getHashPath() . rawurlencode( $archiveName ) . "/";
+ $this->assertRepoDefined();
+ $path = $this->repo->getZoneUrl( 'thumb' ) . '/archive/' .
+ $this->getHashPath() . rawurlencode( $archiveName ) . "/";
if ( $suffix === false ) {
$path = substr( $path, 0, -1 );
} else {
@@ -1004,7 +1188,8 @@ abstract class File {
* @return path
*/
function getThumbUrl( $suffix = false ) {
- $path = $this->repo->getZoneUrl('thumb') . '/' . $this->getUrlRel();
+ $this->assertRepoDefined();
+ $path = $this->repo->getZoneUrl( 'thumb' ) . '/' . $this->getUrlRel();
if ( $suffix !== false ) {
$path .= '/' . rawurlencode( $suffix );
}
@@ -1012,46 +1197,49 @@ abstract class File {
}
/**
- * Get the virtual URL for an archived file's thumbs, or a specific thumb.
+ * Get the public zone virtual URL for a current version source file
*
* @param $suffix bool|string if not false, the name of a thumbnail file
*
* @return string
*/
- function getArchiveVirtualUrl( $suffix = false ) {
- $path = $this->repo->getVirtualUrl() . '/public/archive/' . $this->getHashPath();
- if ( $suffix === false ) {
- $path = substr( $path, 0, -1 );
- } else {
- $path .= rawurlencode( $suffix );
+ function getVirtualUrl( $suffix = false ) {
+ $this->assertRepoDefined();
+ $path = $this->repo->getVirtualUrl() . '/public/' . $this->getUrlRel();
+ if ( $suffix !== false ) {
+ $path .= '/' . rawurlencode( $suffix );
}
return $path;
}
/**
- * Get the virtual URL for a thumbnail file or directory
+ * Get the public zone virtual URL for an archived version source file
*
* @param $suffix bool|string if not false, the name of a thumbnail file
*
* @return string
*/
- function getThumbVirtualUrl( $suffix = false ) {
- $path = $this->repo->getVirtualUrl() . '/thumb/' . $this->getUrlRel();
- if ( $suffix !== false ) {
- $path .= '/' . rawurlencode( $suffix );
+ function getArchiveVirtualUrl( $suffix = false ) {
+ $this->assertRepoDefined();
+ $path = $this->repo->getVirtualUrl() . '/public/archive/' . $this->getHashPath();
+ if ( $suffix === false ) {
+ $path = substr( $path, 0, -1 );
+ } else {
+ $path .= rawurlencode( $suffix );
}
return $path;
}
/**
- * Get the virtual URL for the file itself
+ * Get the virtual URL for a thumbnail file or directory
*
* @param $suffix bool|string if not false, the name of a thumbnail file
*
* @return string
*/
- function getVirtualUrl( $suffix = false ) {
- $path = $this->repo->getVirtualUrl() . '/public/' . $this->getUrlRel();
+ function getThumbVirtualUrl( $suffix = false ) {
+ $this->assertRepoDefined();
+ $path = $this->repo->getVirtualUrl() . '/thumb/' . $this->getUrlRel();
if ( $suffix !== false ) {
$path .= '/' . rawurlencode( $suffix );
}
@@ -1062,6 +1250,7 @@ abstract class File {
* @return bool
*/
function isHashed() {
+ $this->assertRepoDefined();
return $this->repo->isHashed();
}
@@ -1125,8 +1314,7 @@ abstract class File {
* @return bool
*/
function isLocal() {
- $repo = $this->getRepo();
- return $repo && $repo->isLocal();
+ return $this->repo && $this->repo->isLocal();
}
/**
@@ -1141,7 +1329,7 @@ abstract class File {
/**
* Returns the repository
*
- * @return FileRepo
+ * @return FileRepo|false
*/
function getRepo() {
return $this->repo;
@@ -1306,7 +1494,11 @@ abstract class File {
* @return string
*/
function getDescriptionUrl() {
- return $this->repo->getDescriptionUrl( $this->getName() );
+ if ( $this->repo ) {
+ return $this->repo->getDescriptionUrl( $this->getName() );
+ } else {
+ return false;
+ }
}
/**
@@ -1316,7 +1508,7 @@ abstract class File {
*/
function getDescriptionText() {
global $wgMemc, $wgLang;
- if ( !$this->repo->fetchDescription ) {
+ if ( !$this->repo || !$this->repo->fetchDescription ) {
return false;
}
$renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgLang->getCode() );
@@ -1354,17 +1546,13 @@ abstract class File {
}
/**
- * Get the 14-character timestamp of the file upload, or false if
- * it doesn't exist
+ * Get the 14-character timestamp of the file upload
*
- * @return string
+ * @return string|false TS_MW timestamp or false on failure
*/
function getTimestamp() {
- $path = $this->getPath();
- if ( !file_exists( $path ) ) {
- return false;
- }
- return wfTimestamp( TS_MW, filemtime( $path ) );
+ $this->assertRepoDefined();
+ return $this->repo->getFileTimestamp( $this->getPath() );
}
/**
@@ -1373,7 +1561,8 @@ abstract class File {
* @return string
*/
function getSha1() {
- return self::sha1Base36( $this->getPath() );
+ $this->assertRepoDefined();
+ return $this->repo->getFileSha1( $this->getPath() );
}
/**
@@ -1396,9 +1585,10 @@ abstract class File {
* field of this file, if it's marked as deleted.
* STUB
* @param $field Integer
+ * @param $user User object to check, or null to use $wgUser
* @return Boolean
*/
- function userCan( $field ) {
+ function userCan( $field, User $user = null ) {
return true;
}
@@ -1412,67 +1602,11 @@ abstract class File {
* @return array
*/
static function getPropsFromPath( $path, $ext = true ) {
- wfProfileIn( __METHOD__ );
wfDebug( __METHOD__.": Getting file info for $path\n" );
- $info = array(
- 'fileExists' => file_exists( $path ) && !is_dir( $path )
- );
- $gis = false;
- if ( $info['fileExists'] ) {
- $magic = MimeMagic::singleton();
-
- if ( $ext === true ) {
- $i = strrpos( $path, '.' );
- $ext = strtolower( $i ? substr( $path, $i + 1 ) : '' );
- }
-
- # mime type according to file contents
- $info['file-mime'] = $magic->guessMimeType( $path, false );
- # logical mime type
- $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
+ wfDeprecated( __METHOD__, '1.19' );
- list( $info['major_mime'], $info['minor_mime'] ) = self::splitMime( $info['mime'] );
- $info['media_type'] = $magic->getMediaType( $path, $info['mime'] );
-
- # Get size in bytes
- $info['size'] = filesize( $path );
-
- # Height, width and metadata
- $handler = MediaHandler::getHandler( $info['mime'] );
- if ( $handler ) {
- $tempImage = (object)array();
- $info['metadata'] = $handler->getMetadata( $tempImage, $path );
- $gis = $handler->getImageSize( $tempImage, $path, $info['metadata'] );
- } else {
- $gis = false;
- $info['metadata'] = '';
- }
- $info['sha1'] = self::sha1Base36( $path );
-
- wfDebug(__METHOD__.": $path loaded, {$info['size']} bytes, {$info['mime']}.\n");
- } else {
- $info['mime'] = null;
- $info['media_type'] = MEDIATYPE_UNKNOWN;
- $info['metadata'] = '';
- $info['sha1'] = '';
- wfDebug(__METHOD__.": $path NOT FOUND!\n");
- }
- if( $gis ) {
- # NOTE: $gis[2] contains a code for the image type. This is no longer used.
- $info['width'] = $gis[0];
- $info['height'] = $gis[1];
- if ( isset( $gis['bits'] ) ) {
- $info['bits'] = $gis['bits'];
- } else {
- $info['bits'] = 0;
- }
- } else {
- $info['width'] = 0;
- $info['height'] = 0;
- $info['bits'] = 0;
- }
- wfProfileOut( __METHOD__ );
- return $info;
+ $fsFile = new FSFile( $path );
+ return $fsFile->getProps();
}
/**
@@ -1487,14 +1621,10 @@ abstract class File {
* @return false|string False on failure
*/
static function sha1Base36( $path ) {
- wfSuppressWarnings();
- $hash = sha1_file( $path );
- wfRestoreWarnings();
- if ( $hash === false ) {
- return false;
- } else {
- return wfBaseConvert( $hash, 16, 36, 31 );
- }
+ wfDeprecated( __METHOD__, '1.19' );
+
+ $fsFile = new FSFile( $path );
+ return $fsFile->getSha1Base36();
}
/**
@@ -1566,11 +1696,24 @@ abstract class File {
function isMissing() {
return false;
}
+
+ /**
+ * Assert that $this->repo is set to a valid FileRepo instance
+ * @throws MWException
+ */
+ protected function assertRepoDefined() {
+ if ( !( $this->repo instanceof $this->repoClass ) ) {
+ throw new MWException( "A {$this->repoClass} object is not set for this File.\n" );
+ }
+ }
+
+ /**
+ * Assert that $this->title is set to a Title
+ * @throws MWException
+ */
+ protected function assertTitleDefined() {
+ if ( !( $this->title instanceof Title ) ) {
+ throw new MWException( "A Title object is not set for this File.\n" );
+ }
+ }
}
-/**
- * Aliases for backwards compatibility with 1.6
- */
-define( 'MW_IMG_DELETED_FILE', File::DELETED_FILE );
-define( 'MW_IMG_DELETED_COMMENT', File::DELETED_COMMENT );
-define( 'MW_IMG_DELETED_USER', File::DELETED_USER );
-define( 'MW_IMG_DELETED_RESTRICTED', File::DELETED_RESTRICTED );
diff --git a/includes/filerepo/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php
index 53c4a3bd..681544fd 100644
--- a/includes/filerepo/ForeignAPIFile.php
+++ b/includes/filerepo/file/ForeignAPIFile.php
@@ -3,43 +3,47 @@
* Foreign file accessible through api.php requests.
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
* Foreign file accessible through api.php requests.
* Very hacky and inefficient, do not use :D
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class ForeignAPIFile extends File {
-
private $mExists;
+ protected $repoClass = 'ForeignApiRepo';
+
/**
- * @param $title
- * @param $repo ForeignApiRepo
- * @param $info
+ * @param $title
+ * @param $repo ForeignApiRepo
+ * @param $info
* @param bool $exists
*/
function __construct( $title, $repo, $info, $exists = false ) {
parent::__construct( $title, $repo );
+
$this->mInfo = $info;
$this->mExists = $exists;
+
+ $this->assertRepoDefined();
}
/**
- * @param $title Title
- * @param $repo ForeignApiRepo
+ * @param $title Title
+ * @param $repo ForeignApiRepo
* @return ForeignAPIFile|null
*/
- static function newFromTitle( $title, $repo ) {
+ 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 );
@@ -49,31 +53,31 @@ class ForeignAPIFile extends File {
: -1;
if( $lastRedirect >= 0 ) {
$newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
- $img = new ForeignAPIFile( $newtitle, $repo, $info, true );
+ $img = new self( $newtitle, $repo, $info, true );
if( $img ) {
$img->redirectedFrom( $title->getDBkey() );
}
} else {
- $img = new ForeignAPIFile( $title, $repo, $info, true );
+ $img = new self( $title, $repo, $info, true );
}
return $img;
} else {
return null;
}
}
-
+
/**
* Get the property string for iiprop and aiprop
*/
static function getProps() {
return 'timestamp|user|comment|url|size|sha1|metadata|mime';
}
-
+
// Dummy functions...
public function exists() {
return $this->mExists;
}
-
+
public function getPath() {
return false;
}
@@ -100,18 +104,22 @@ class ForeignAPIFile extends File {
public function getWidth( $page = 1 ) {
return isset( $this->mInfo['width'] ) ? intval( $this->mInfo['width'] ) : 0;
}
-
+
+ /**
+ * @param $page int
+ * @return int
+ */
public function getHeight( $page = 1 ) {
return isset( $this->mInfo['height'] ) ? intval( $this->mInfo['height'] ) : 0;
}
-
+
public function getMetadata() {
if ( isset( $this->mInfo['metadata'] ) ) {
return serialize( self::parseMetadata( $this->mInfo['metadata'] ) );
}
return null;
}
-
+
public static function parseMetadata( $metadata ) {
if( !is_array( $metadata ) ) {
return $metadata;
@@ -122,11 +130,11 @@ class ForeignAPIFile extends File {
}
return $ret;
}
-
+
public function getSize() {
return isset( $this->mInfo['size'] ) ? intval( $this->mInfo['size'] ) : null;
}
-
+
public function getUrl() {
return isset( $this->mInfo['url'] ) ? strval( $this->mInfo['url'] ) : null;
}
@@ -134,25 +142,25 @@ class ForeignAPIFile extends File {
public function getUser( $method='text' ) {
return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null;
}
-
+
public function getDescription() {
return isset( $this->mInfo['comment'] ) ? strval( $this->mInfo['comment'] ) : null;
}
function getSha1() {
- return isset( $this->mInfo['sha1'] ) ?
- wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 ) :
- null;
+ return isset( $this->mInfo['sha1'] )
+ ? wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
+ : null;
}
-
+
function getTimestamp() {
- return wfTimestamp( TS_MW,
- isset( $this->mInfo['timestamp'] ) ?
- strval( $this->mInfo['timestamp'] ) :
- null
+ return wfTimestamp( TS_MW,
+ isset( $this->mInfo['timestamp'] )
+ ? strval( $this->mInfo['timestamp'] )
+ : null
);
}
-
+
function getMimeType() {
if( !isset( $this->mInfo['mime'] ) ) {
$magic = MimeMagic::singleton();
@@ -160,19 +168,19 @@ class ForeignAPIFile extends File {
}
return $this->mInfo['mime'];
}
-
+
/// @todo FIXME: May guess wrong on file types that can be eg audio or video
function getMediaType() {
$magic = MimeMagic::singleton();
return $magic->getMediaType( null, $this->getMimeType() );
}
-
+
function getDescriptionUrl() {
return isset( $this->mInfo['descriptionurl'] )
? $this->mInfo['descriptionurl']
: false;
}
-
+
/**
* Only useful if we're locally caching thumbs anyway...
*/
@@ -187,47 +195,58 @@ class ForeignAPIFile extends File {
return null;
}
}
-
+
function getThumbnails() {
- $files = array();
$dir = $this->getThumbPath( $this->getName() );
- if ( is_dir( $dir ) ) {
- $handle = opendir( $dir );
- if ( $handle ) {
- while ( false !== ( $file = readdir($handle) ) ) {
- if ( $file[0] != '.' ) {
- $files[] = $file;
- }
- }
- closedir( $handle );
- }
+ $iter = $this->repo->getBackend()->getFileList( array( 'dir' => $dir ) );
+
+ $files = array();
+ foreach ( $iter as $file ) {
+ $files[] = $file;
}
+
return $files;
}
-
- function purgeCache() {
- $this->purgeThumbnails();
+
+ /**
+ * @see File::purgeCache()
+ */
+ function purgeCache( $options = array() ) {
+ $this->purgeThumbnails( $options );
$this->purgeDescriptionPage();
}
-
+
function purgeDescriptionPage() {
global $wgMemc, $wgContLang;
+
$url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
$key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5($url) );
+
$wgMemc->delete( $key );
}
-
- function purgeThumbnails() {
+
+ function purgeThumbnails( $options = array() ) {
global $wgMemc;
+
$key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
$wgMemc->delete( $key );
+
$files = $this->getThumbnails();
+ // Give media handler a chance to filter the purge list
+ $handler = $this->getHandler();
+ if ( $handler ) {
+ $handler->filterThumbnailPurgeList( $files, $options );
+ }
+
$dir = $this->getThumbPath( $this->getName() );
+ $purgeList = array();
foreach ( $files as $file ) {
- unlink( $dir . $file );
- }
- if ( is_dir( $dir ) ) {
- rmdir( $dir ); // Might have already gone away, spews errors if we don't.
+ $purgeList[] = "{$dir}{$file}";
}
+
+ # Delete the thumbnails
+ $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+ # Clear out the thumbnail directory if empty
+ $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
}
}
diff --git a/includes/filerepo/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php
index 09bee39c..191a712d 100644
--- a/includes/filerepo/ForeignDBFile.php
+++ b/includes/filerepo/file/ForeignDBFile.php
@@ -3,13 +3,13 @@
* Foreign file with an accessible MediaWiki database
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
* Foreign file with an accessible MediaWiki database
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class ForeignDBFile extends LocalFile {
diff --git a/includes/filerepo/LocalFile.php b/includes/filerepo/file/LocalFile.php
index 14da9122..0f8b4754 100644
--- a/includes/filerepo/LocalFile.php
+++ b/includes/filerepo/file/LocalFile.php
@@ -3,7 +3,7 @@
* Local file in the wiki's own database
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
@@ -26,7 +26,7 @@ define( 'MW_FILE_VERSION', 8 );
* The convenience functions wfLocalFile() and wfFindFile() should be sufficient
* in most cases.
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class LocalFile extends File {
/**#@+
@@ -58,6 +58,8 @@ class LocalFile extends File {
/**#@-*/
+ protected $repoClass = 'LocalRepo';
+
/**
* Create a LocalFile from a title
* Do not call this except from inside a repo class.
@@ -144,16 +146,15 @@ class LocalFile extends File {
* Do not call this except from inside a repo class.
*/
function __construct( $title, $repo ) {
- if ( !is_object( $title ) ) {
- throw new MWException( __CLASS__ . ' constructor given bogus title.' );
- }
-
parent::__construct( $title, $repo );
$this->metadata = '';
$this->historyLine = 0;
$this->historyRes = null;
$this->dataLoaded = false;
+
+ $this->assertRepoDefined();
+ $this->assertTitleDefined();
}
/**
@@ -233,7 +234,8 @@ class LocalFile extends File {
* Load metadata from the file itself
*/
function loadFromFile() {
- $this->setProps( self::getPropsFromPath( $this->getPath() ) );
+ $props = $this->repo->getFileProps( $this->getVirtualUrl() );
+ $this->setProps( $props );
}
function getCacheFields( $prefix = 'img_' ) {
@@ -383,6 +385,8 @@ class LocalFile extends File {
function upgradeRow() {
wfProfileIn( __METHOD__ );
+ $this->lock(); // begin
+
$this->loadFromFile();
# Don't destroy file info of missing files
@@ -403,19 +407,23 @@ class LocalFile extends File {
$dbw->update( 'image',
array(
- 'img_width' => $this->width,
- 'img_height' => $this->height,
- 'img_bits' => $this->bits,
+ '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,
- ), array( 'img_name' => $this->getName() ),
+ 'img_metadata' => $this->metadata,
+ 'img_sha1' => $this->sha1,
+ ),
+ array( 'img_name' => $this->getName() ),
__METHOD__
);
$this->saveToCache();
+
+ $this->unlock(); // done
+
wfProfileOut( __METHOD__ );
}
@@ -456,7 +464,7 @@ class LocalFile extends File {
function isMissing() {
if ( $this->missing === null ) {
- list( $fileExists ) = $this->repo->fileExistsBatch( array( $this->getVirtualUrl() ), FileRepo::FILES_ONLY );
+ list( $fileExists ) = $this->repo->fileExists( $this->getVirtualUrl(), FileRepo::FILES_ONLY );
$this->missing = !$fileExists;
}
return $this->missing;
@@ -581,8 +589,9 @@ class LocalFile extends File {
*/
function migrateThumbFile( $thumbName ) {
$thumbDir = $this->getThumbPath();
- $thumbPath = "$thumbDir/$thumbName";
+ /* Old code for bug 2532
+ $thumbPath = "$thumbDir/$thumbName";
if ( is_dir( $thumbPath ) ) {
// Directory where file should be
// This happened occasionally due to broken migration code in 1.5
@@ -597,12 +606,11 @@ class LocalFile extends File {
// Doesn't exist anymore
clearstatcache();
}
+ */
- if ( is_file( $thumbDir ) ) {
- // File where directory should be
- unlink( $thumbDir );
- // Doesn't exist anymore
- clearstatcache();
+ if ( $this->repo->fileExists( $thumbDir, FileRepo::FILES_ONLY ) ) {
+ // Delete file where directory should be
+ $this->repo->cleanupBatch( array( $thumbDir ) );
}
}
@@ -623,21 +631,12 @@ class LocalFile extends File {
} else {
$dir = $this->getThumbPath();
}
- $files = array();
- $files[] = $dir;
-
- if ( is_dir( $dir ) ) {
- $handle = opendir( $dir );
- if ( $handle ) {
- while ( false !== ( $file = readdir( $handle ) ) ) {
- if ( $file { 0 } != '.' ) {
- $files[] = $file;
- }
- }
-
- closedir( $handle );
- }
+ $backend = $this->repo->getBackend();
+ $files = array( $dir );
+ $iterator = $backend->getFileList( array( 'dir' => $dir ) );
+ foreach ( $iterator as $file ) {
+ $files[] = $file;
}
return $files;
@@ -674,36 +673,30 @@ class LocalFile extends File {
/**
* Delete all previously generated thumbnails, refresh metadata in memcached and purge the squid
*/
- function purgeCache() {
+ function purgeCache( $options = array() ) {
// Refresh metadata cache
$this->purgeMetadataCache();
// Delete thumbnails
- $this->purgeThumbnails();
+ $this->purgeThumbnails( $options );
// Purge squid cache for this file
SquidUpdate::purge( array( $this->getURL() ) );
}
/**
- * Delete cached transformed files for archived files
+ * Delete cached transformed files for an archived version only.
* @param $archiveName string name of the archived file
*/
function purgeOldThumbnails( $archiveName ) {
global $wgUseSquid;
- // get a list of old thumbnails and URLs
+ // Get a list of old thumbnails and URLs
$files = $this->getThumbnails( $archiveName );
$dir = array_shift( $files );
$this->purgeThumbList( $dir, $files );
- // Directory should be empty, delete it too. This will probably suck on
- // something like NFS or if the directory isn't actually empty, so hide
- // the warnings :D
- wfSuppressWarnings();
- if( !rmdir( $dir ) ) {
- wfDebug( __METHOD__ . ": unable to remove archive directory: $dir\n" );
- }
- wfRestoreWarnings();
+ // Purge any custom thumbnail caches
+ wfRunHooks( 'LocalFilePurgeThumbnails', array( $this, $archiveName ) );
// Purge the squid
if ( $wgUseSquid ) {
@@ -715,17 +708,29 @@ class LocalFile extends File {
}
}
-
/**
* Delete cached transformed files for the current version only.
*/
- function purgeThumbnails() {
+ function purgeThumbnails( $options = array() ) {
global $wgUseSquid;
- // get a list of thumbnails and URLs
+
+ // Delete thumbnails
$files = $this->getThumbnails();
+
+ // Give media handler a chance to filter the purge list
+ if ( !empty( $options['forThumbRefresh'] ) ) {
+ $handler = $this->getHandler();
+ if ( $handler ) {
+ $handler->filterThumbnailPurgeList( $files, $options );
+ }
+ }
+
$dir = array_shift( $files );
$this->purgeThumbList( $dir, $files );
+ // Purge any custom thumbnail caches
+ wfRunHooks( 'LocalFilePurgeThumbnails', array( $this, false ) );
+
// Purge the squid
if ( $wgUseSquid ) {
$urls = array();
@@ -741,19 +746,26 @@ class LocalFile extends File {
* @param $dir string base dir of the files.
* @param $files array of strings: relative filenames (to $dir)
*/
- function purgeThumbList($dir, $files) {
- global $wgExcludeFromThumbnailPurge;
+ protected function purgeThumbList( $dir, $files ) {
+ $fileListDebug = strtr(
+ var_export( $files, true ),
+ array("\n"=>'')
+ );
+ wfDebug( __METHOD__ . ": $fileListDebug\n" );
- wfDebug( __METHOD__ . ": " . var_export( $files, true ) . "\n" );
+ $purgeList = array();
foreach ( $files as $file ) {
# Check that the base file name is part of the thumb name
# This is a basic sanity check to avoid erasing unrelated directories
if ( strpos( $file, $this->getName() ) !== false ) {
- wfSuppressWarnings();
- unlink( "$dir/$file" );
- wfRestoreWarnings();
+ $purgeList[] = "{$dir}/{$file}";
}
}
+
+ # Delete the thumbnails
+ $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+ # Clear out the thumbnail directory if empty
+ $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
}
/** purgeDescription inherited */
@@ -858,7 +870,6 @@ class LocalFile extends File {
}
}
- /** getFullPath inherited */
/** getHashPath inherited */
/** getRel inherited */
/** getUrlRel inherited */
@@ -873,7 +884,7 @@ class LocalFile extends File {
/**
* Upload a file and record it in the DB
- * @param $srcPath String: source path or virtual URL
+ * @param $srcPath String: source storage path or virtual URL
* @param $comment String: upload description
* @param $pageText String: text to use for the new description page,
* if a new description page is created
@@ -888,16 +899,24 @@ class LocalFile extends File {
* archive name, or an empty string if it was a new file.
*/
function upload( $srcPath, $comment, $pageText, $flags = 0, $props = false, $timestamp = false, $user = null ) {
- $this->lock();
+ global $wgContLang;
+ // truncate nicely or the DB will do it for us
+ // non-nicely (dangling multi-byte chars, non-truncated
+ // version in cache).
+ $comment = $wgContLang->truncate( $comment, 255 );
+ $this->lock(); // begin
$status = $this->publish( $srcPath, $flags );
- if ( $status->ok ) {
+ if ( $status->successCount > 0 ) {
+ # Essentially we are displacing any existing current file and saving
+ # a new current file at the old location. If just the first succeeded,
+ # we still need to displace the current DB entry and put in a new one.
if ( !$this->recordUpload2( $status->value, $comment, $pageText, $props, $timestamp, $user ) ) {
$status->fatal( 'filenotfound', $srcPath );
}
}
- $this->unlock();
+ $this->unlock(); // done
return $status;
}
@@ -968,82 +987,94 @@ 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' => $this->metadata,
+ 'img_sha1' => $this->sha1
),
__METHOD__,
'IGNORE'
);
if ( $dbw->affectedRows() == 0 ) {
+ if ( $oldver == '' ) { // XXX
+ # (bug 34993) publish() can displace the current file and yet fail to save
+ # a new one. The next publish attempt will treat the file as a brand new file
+ # and pass an empty $oldver. Allow this bogus value so we can displace the
+ # `image` row to `oldimage`, leaving room for the new current file `image` row.
+ #throw new MWException( "Empty oi_archive_name. Database and storage out of sync?" );
+ }
$reupload = true;
-
# Collision, this is an update of a file
# Insert previous contents into oldimage
$dbw->insertSelect( 'oldimage', 'image',
array(
- 'oi_name' => 'img_name',
+ 'oi_name' => 'img_name',
'oi_archive_name' => $dbw->addQuotes( $oldver ),
- 'oi_size' => 'img_size',
- 'oi_width' => 'img_width',
- 'oi_height' => 'img_height',
- 'oi_bits' => 'img_bits',
- 'oi_timestamp' => 'img_timestamp',
- 'oi_description' => 'img_description',
- 'oi_user' => 'img_user',
- 'oi_user_text' => 'img_user_text',
- 'oi_metadata' => 'img_metadata',
- 'oi_media_type' => 'img_media_type',
- 'oi_major_mime' => 'img_major_mime',
- 'oi_minor_mime' => 'img_minor_mime',
- 'oi_sha1' => 'img_sha1'
- ), array( 'img_name' => $this->getName() ), __METHOD__
+ 'oi_size' => 'img_size',
+ 'oi_width' => 'img_width',
+ 'oi_height' => 'img_height',
+ 'oi_bits' => 'img_bits',
+ 'oi_timestamp' => 'img_timestamp',
+ 'oi_description' => 'img_description',
+ 'oi_user' => 'img_user',
+ 'oi_user_text' => 'img_user_text',
+ 'oi_metadata' => 'img_metadata',
+ 'oi_media_type' => 'img_media_type',
+ 'oi_major_mime' => 'img_major_mime',
+ 'oi_minor_mime' => 'img_minor_mime',
+ 'oi_sha1' => 'img_sha1'
+ ),
+ array( 'img_name' => $this->getName() ),
+ __METHOD__
);
# Update the current image row
$dbw->update( 'image',
array( /* SET */
- '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_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
- ), array( /* WHERE */
- 'img_name' => $this->getName()
- ), __METHOD__
+ 'img_user' => $user->getId(),
+ 'img_user_text' => $user->getName(),
+ 'img_metadata' => $this->metadata,
+ 'img_sha1' => $this->sha1
+ ),
+ array( 'img_name' => $this->getName() ),
+ __METHOD__
);
} else {
# This is a new file
# Update the image count
- $dbw->begin();
- $site_stats = $dbw->tableName( 'site_stats' );
- $dbw->query( "UPDATE $site_stats SET ss_images=ss_images+1", __METHOD__ );
- $dbw->commit();
+ $dbw->begin( __METHOD__ );
+ $dbw->update(
+ 'site_stats',
+ array( 'ss_images = ss_images+1' ),
+ '*',
+ __METHOD__
+ );
+ $dbw->commit( __METHOD__ );
}
$descTitle = $this->getTitle();
- $article = new ImagePage( $descTitle );
- $article->setFile( $this );
+ $wikiPage = new WikiFilePage( $descTitle );
+ $wikiPage->setFile( $this );
# Add the log entry
$log = new LogPage( 'upload' );
@@ -1059,11 +1090,12 @@ class LocalFile extends File {
$log->getRcComment(),
false
);
- $nullRevision->insertOn( $dbw );
-
- wfRunHooks( 'NewRevisionFromEditComplete', array( $article, $nullRevision, $latest, $user ) );
- $article->updateRevisionOn( $dbw, $nullRevision );
+ if (!is_null($nullRevision)) {
+ $nullRevision->insertOn( $dbw );
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $wikiPage, $nullRevision, $latest, $user ) );
+ $wikiPage->updateRevisionOn( $dbw, $nullRevision );
+ }
# Invalidate the cache for the description page
$descTitle->invalidateCache();
$descTitle->purgeSquid();
@@ -1071,7 +1103,7 @@ class LocalFile extends File {
# New file; create the description page.
# There's already a log entry, so don't make a second RC entry
# Squid and file cache for the description page are purged by doEdit.
- $article->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC );
+ $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
}
# Commit the transaction now, in case something goes wrong later
@@ -1135,7 +1167,7 @@ class LocalFile extends File {
* archive name, or an empty string if it was a new file.
*/
function publishTo( $srcPath, $dstRel, $flags = 0 ) {
- $this->lock();
+ $this->lock(); // begin
$archiveName = wfTimestamp( TS_MW ) . '!'. $this->getName();
$archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
@@ -1148,7 +1180,7 @@ class LocalFile extends File {
$status->value = $archiveName;
}
- $this->unlock();
+ $this->unlock(); // done
return $status;
}
@@ -1172,7 +1204,7 @@ class LocalFile extends File {
*/
function move( $target ) {
wfDebugLog( 'imagemove', "Got request to move {$this->name} to " . $target->getText() );
- $this->lock();
+ $this->lock(); // begin
$batch = new LocalFileMoveBatch( $this, $target );
$batch->addCurrent();
@@ -1182,7 +1214,7 @@ class LocalFile extends File {
wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
$this->purgeEverything();
- $this->unlock();
+ $this->unlock(); // done
if ( $status->isOk() ) {
// Now switch the object
@@ -1210,7 +1242,7 @@ class LocalFile extends File {
* @return FileRepoStatus object.
*/
function delete( $reason, $suppress = false ) {
- $this->lock();
+ $this->lock(); // begin
$batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
$batch->addCurrent();
@@ -1233,7 +1265,7 @@ class LocalFile extends File {
$this->purgeEverything();
}
- $this->unlock();
+ $this->unlock(); // done
return $status;
}
@@ -1253,14 +1285,14 @@ class LocalFile extends File {
* @return FileRepoStatus object.
*/
function deleteOld( $archiveName, $reason, $suppress = false ) {
- $this->lock();
+ $this->lock(); // begin
$batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
$batch->addOld( $archiveName );
$this->purgeOldThumbnails( $archiveName );
$status = $batch->execute();
- $this->unlock();
+ $this->unlock(); // done
if ( $status->ok ) {
$this->purgeDescription();
@@ -1345,7 +1377,9 @@ class LocalFile extends File {
$this->load();
// Initialise now if necessary
if ( $this->sha1 == '' && $this->fileExists ) {
- $this->sha1 = File::sha1Base36( $this->getPath() );
+ $this->lock(); // begin
+
+ $this->sha1 = $this->repo->getFileSha1( $this->getPath() );
if ( !wfReadOnly() && strval( $this->sha1 ) != '' ) {
$dbw = $this->repo->getMasterDB();
$dbw->update( 'image',
@@ -1354,6 +1388,8 @@ class LocalFile extends File {
__METHOD__ );
$this->saveToCache();
}
+
+ $this->unlock(); // done
}
return $this->sha1;
@@ -1403,7 +1439,7 @@ class LocalFile extends File {
/**
* Helper class for file deletion
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class LocalFileDeleteBatch {
@@ -1704,7 +1740,7 @@ class LocalFileDeleteBatch {
$files[$src] = $this->file->repo->getVirtualUrl( 'public' ) . '/' . rawurlencode( $src );
}
- $result = $this->file->repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
+ $result = $this->file->repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
foreach ( $batch as $batchItem ) {
if ( $result[$batchItem[0]] ) {
@@ -1720,7 +1756,7 @@ class LocalFileDeleteBatch {
/**
* Helper class for file undeletion
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class LocalFileRestoreBatch {
/**
@@ -1992,7 +2028,7 @@ class LocalFileRestoreBatch {
foreach ( $triplets as $file )
$files[$file[0]] = $file[0];
- $result = $this->file->repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
+ $result = $this->file->repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
foreach ( $triplets as $file ) {
if ( $result[$file[0]] ) {
@@ -2015,7 +2051,7 @@ class LocalFileRestoreBatch {
rawurlencode( $repo->getDeletedHashPath( $file ) . $file );
}
- $result = $repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
+ $result = $repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
foreach ( $batch as $file ) {
if ( $result[$file] ) {
@@ -2068,10 +2104,21 @@ class LocalFileRestoreBatch {
/**
* Helper class for file movement
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class LocalFileMoveBatch {
- var $file, $cur, $olds, $oldCount, $archive, $target, $db;
+
+ /**
+ * @var File
+ */
+ var $file;
+
+ /**
+ * @var Title
+ */
+ var $target;
+
+ var $cur, $olds, $oldCount, $archive, $db;
function __construct( File $file, Title $target ) {
$this->file = $file;
@@ -2148,7 +2195,7 @@ class LocalFileMoveBatch {
// Copy the files into their new location
$statusMove = $repo->storeBatch( $triplets );
- wfDebugLog( 'imagemove', "Moved files for {$this->file->name}: {$statusMove->successCount} successes, {$statusMove->failCount} failures" );
+ wfDebugLog( 'imagemove', "Moved files for {$this->file->getName()}: {$statusMove->successCount} successes, {$statusMove->failCount} failures" );
if ( !$statusMove->isGood() ) {
wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
$this->cleanupTarget( $triplets );
@@ -2158,7 +2205,7 @@ class LocalFileMoveBatch {
$this->db->begin();
$statusDb = $this->doDBUpdates();
- wfDebugLog( 'imagemove', "Renamed {$this->file->name} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
+ wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
if ( !$statusDb->isGood() ) {
$this->db->rollback();
// Something went wrong with the DB updates, so remove the target files
@@ -2227,7 +2274,7 @@ class LocalFileMoveBatch {
}
/**
- * Generate triplets for FSRepo::storeBatch().
+ * Generate triplets for FileRepo::storeBatch().
*/
function getMoveTriplets() {
$moves = array_merge( array( $this->cur ), $this->olds );
@@ -2237,7 +2284,7 @@ class LocalFileMoveBatch {
// $move: (oldRelativePath, newRelativePath)
$srcUrl = $this->file->repo->getVirtualUrl() . '/public/' . rawurlencode( $move[0] );
$triplets[] = array( $srcUrl, 'public', $move[1] );
- wfDebugLog( 'imagemove', "Generated move triplet for {$this->file->name}: {$srcUrl} :: public :: {$move[1]}" );
+ wfDebugLog( 'imagemove', "Generated move triplet for {$this->file->getName()}: {$srcUrl} :: public :: {$move[1]}" );
}
return $triplets;
@@ -2253,7 +2300,7 @@ class LocalFileMoveBatch {
$files[$file[0]] = $file[0];
}
- $result = $this->file->repo->fileExistsBatch( $files, FSRepo::FILES_ONLY );
+ $result = $this->file->repo->fileExistsBatch( $files, FileRepo::FILES_ONLY );
$filteredTriplets = array();
foreach ( $triplets as $file ) {
diff --git a/includes/filerepo/OldLocalFile.php b/includes/filerepo/file/OldLocalFile.php
index bcb22c17..ebd83c4d 100644
--- a/includes/filerepo/OldLocalFile.php
+++ b/includes/filerepo/file/OldLocalFile.php
@@ -3,13 +3,13 @@
* Old file in the oldimage table
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
* Class to represent a file in the oldimage table
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class OldLocalFile extends LocalFile {
var $requestedTime, $archive_name;
@@ -212,11 +212,12 @@ class OldLocalFile extends LocalFile {
* field of this image file, if it's marked as deleted.
*
* @param $field Integer
+ * @param $user User object to check, or null to use $wgUser
* @return bool
*/
- function userCan( $field ) {
+ function userCan( $field, User $user = null ) {
$this->load();
- return Revision::userCanBitfield( $this->deleted, $field );
+ return Revision::userCanBitfield( $this->deleted, $field, $user );
}
/**
@@ -261,7 +262,7 @@ class OldLocalFile extends LocalFile {
$dbw->begin();
$dstPath = $this->repo->getZonePath( 'public' ) . '/' . $this->getRel();
- $props = self::getPropsFromPath( $dstPath );
+ $props = $this->repo->getFileProps( $dstPath );
if ( !$props['fileExists'] ) {
return false;
}
diff --git a/includes/filerepo/UnregisteredLocalFile.php b/includes/filerepo/file/UnregisteredLocalFile.php
index 2df9a9b5..cd9d3d02 100644
--- a/includes/filerepo/UnregisteredLocalFile.php
+++ b/includes/filerepo/file/UnregisteredLocalFile.php
@@ -3,12 +3,12 @@
* File without associated database record
*
* @file
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
/**
* A file object referring to either a standalone local file, or a file in a
- * local repository with no database, for example an FSRepo repository.
+ * local repository with no database, for example an FileRepo repository.
*
* Read-only.
*
@@ -16,7 +16,7 @@
* lots of functions missing. It is used by the WebStore extension in the
* standalone role.
*
- * @ingroup FileRepo
+ * @ingroup FileAbstraction
*/
class UnregisteredLocalFile extends File {
var $title, $path, $mime, $dims;
@@ -27,12 +27,12 @@ class UnregisteredLocalFile extends File {
var $handler;
/**
- * @param $path
- * @param $mime
+ * @param $path string Storage path
+ * @param $mime string
* @return UnregisteredLocalFile
*/
static function newFromPath( $path, $mime ) {
- return new UnregisteredLocalFile( false, false, $path, $mime );
+ return new self( false, false, $path, $mime );
}
/**
@@ -41,13 +41,16 @@ class UnregisteredLocalFile extends File {
* @return UnregisteredLocalFile
*/
static function newFromTitle( $title, $repo ) {
- return new UnregisteredLocalFile( $title, $repo, false, false );
+ return new self( $title, $repo, false, false );
}
/**
+ * Create an UnregisteredLocalFile based on a path or a (title,repo) pair.
+ * A FileRepo object is not required here, unlike most other File classes.
+ *
* @throws MWException
- * @param $title string
- * @param $repo FSRepo
+ * @param $title Title|false
+ * @param $repo FileRepo
* @param $path string
* @param $mime string
*/
@@ -55,18 +58,20 @@ class UnregisteredLocalFile extends File {
if ( !( $title && $repo ) && !$path ) {
throw new MWException( __METHOD__.': not enough parameters, must specify title and repo, or a full path' );
}
- if ( $title ) {
- $this->title = $title;
+ if ( $title instanceof Title ) {
+ $this->title = File::normalizeTitle( $title, 'exception' );
$this->name = $repo->getNameFromTitle( $title );
} else {
$this->name = basename( $path );
- $this->title = Title::makeTitleSafe( NS_FILE, $this->name );
+ $this->title = File::normalizeTitle( $this->name, 'exception' );
}
$this->repo = $repo;
if ( $path ) {
$this->path = $path;
} else {
- $this->path = $repo->getRootDirectory() . '/' . $repo->getHashPath( $this->name ) . $this->name;
+ $this->assertRepoDefined();
+ $this->path = $repo->getRootDirectory() . '/' .
+ $repo->getHashPath( $this->name ) . $this->name;
}
if ( $mime ) {
$this->mime = $mime;
@@ -74,7 +79,7 @@ class UnregisteredLocalFile extends File {
$this->dims = array();
}
- function getPageDimensions( $page = 1 ) {
+ private function cachePageDimensions( $page = 1 ) {
if ( !isset( $this->dims[$page] ) ) {
if ( !$this->getHandler() ) {
return false;
@@ -85,19 +90,19 @@ class UnregisteredLocalFile extends File {
}
function getWidth( $page = 1 ) {
- $dim = $this->getPageDimensions( $page );
+ $dim = $this->cachePageDimensions( $page );
return $dim['width'];
}
function getHeight( $page = 1 ) {
- $dim = $this->getPageDimensions( $page );
+ $dim = $this->cachePageDimensions( $page );
return $dim['height'];
}
function getMimeType() {
if ( !isset( $this->mime ) ) {
$magic = MimeMagic::singleton();
- $this->mime = $magic->guessMimeType( $this->path );
+ $this->mime = $magic->guessMimeType( $this->getLocalRefPath() );
}
return $this->mime;
}
@@ -106,7 +111,7 @@ class UnregisteredLocalFile extends File {
if ( !$this->getHandler() ) {
return false;
}
- return $this->handler->getImageSize( $this, $this->getPath() );
+ return $this->handler->getImageSize( $this, $this->getLocalRefPath() );
}
function getMetadata() {
@@ -114,7 +119,7 @@ class UnregisteredLocalFile extends File {
if ( !$this->getHandler() ) {
$this->metadata = false;
} else {
- $this->metadata = $this->handler->getMetadata( $this, $this->getPath() );
+ $this->metadata = $this->handler->getMetadata( $this, $this->getLocalRefPath() );
}
}
return $this->metadata;
@@ -122,17 +127,19 @@ class UnregisteredLocalFile extends File {
function getURL() {
if ( $this->repo ) {
- return $this->repo->getZoneUrl( 'public' ) . '/' . $this->repo->getHashPath( $this->name ) . rawurlencode( $this->name );
+ return $this->repo->getZoneUrl( 'public' ) . '/' .
+ $this->repo->getHashPath( $this->name ) . rawurlencode( $this->name );
} else {
return false;
}
}
function getSize() {
- if ( file_exists( $this->path ) ) {
- return filesize( $this->path );
- } else {
- return false;
+ $this->assertRepoDefined();
+ $props = $this->repo->getFileProps( $this->path );
+ if ( isset( $props['size'] ) ) {
+ return $props['size'];
}
+ return false; // doesn't exist
}
}
diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php
index 41392207..f9afbb20 100644
--- a/includes/installer/CliInstaller.php
+++ b/includes/installer/CliInstaller.php
@@ -24,11 +24,7 @@ class CliInstaller extends Installer {
'dbprefix' => 'wgDBprefix',
'dbtableoptions' => 'wgDBTableOptions',
'dbmysql5' => 'wgDBmysql5',
- 'dbserver' => 'wgDBserver',
'dbport' => 'wgDBport',
- 'dbname' => 'wgDBname',
- 'dbuser' => 'wgDBuser',
- 'dbpass' => 'wgDBpassword',
'dbschema' => 'wgDBmwschema',
'dbpath' => 'wgSQLiteDataDir',
'server' => 'wgServer',
@@ -88,6 +84,9 @@ class CliInstaller extends Installer {
$option['installdbuser'] );
$this->setVar( '_InstallPassword',
isset( $option['installdbpass'] ) ? $option['installdbpass'] : "" );
+
+ // Assume that if we're given the installer user, we'll create the account.
+ $this->setVar( '_CreateDBAccount', true );
}
if ( isset( $option['pass'] ) ) {
@@ -184,11 +183,8 @@ class CliInstaller extends Installer {
return parent::envCheckPath();
}
- protected function envCheckServer( $srv = null ) {
- if ( $this->getVar( 'wgServer' ) ) {
- $srv = $this->getVar( 'wgServer' );
- }
- return parent::envCheckServer( $srv );
+ protected function envGetDefaultServer() {
+ return $this->getVar( 'wgServer' );
}
public function dirIsExecutable( $dir, $url ) {
diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php
index aadd6b49..ab77e2d3 100644
--- a/includes/installer/DatabaseInstaller.php
+++ b/includes/installer/DatabaseInstaller.php
@@ -55,6 +55,15 @@ abstract class DatabaseInstaller {
public abstract function isCompiled();
/**
+ * Checks for installation prerequisites other than those checked by isCompiled()
+ * @since 1.19
+ * @return Status
+ */
+ public function checkPrerequisites() {
+ return Status::newGood();
+ }
+
+ /**
* Get HTML for a web form that configures this database. Configuration
* at this time should be the minimum needed to connect and test
* whether install or upgrade is required.
@@ -148,7 +157,7 @@ abstract class DatabaseInstaller {
}
$this->db->selectDB( $this->getVar( 'wgDBname' ) );
- if( $this->db->tableExists( 'user' ) ) {
+ if( $this->db->tableExists( 'archive', __METHOD__ ) ) {
$status->warning( 'config-install-tables-exist' );
$this->enableLB();
return $status;
@@ -281,6 +290,7 @@ abstract class DatabaseInstaller {
/**
* Construct and initialise parent.
* This is typically only called from Installer::getDBInstaller()
+ * @param $parent
*/
public function __construct( $parent ) {
$this->parent = $parent;
@@ -291,6 +301,8 @@ abstract class DatabaseInstaller {
* Check if a named extension is present.
*
* @see wfDl
+ * @param $name
+ * @return bool
*/
protected static function checkExtension( $name ) {
wfSuppressWarnings();
@@ -323,6 +335,9 @@ abstract class DatabaseInstaller {
/**
* Get a variable, taking local defaults into account.
+ * @param $var string
+ * @param $default null
+ * @return mixed
*/
public function getVar( $var, $default = null ) {
$defaults = $this->getGlobalDefaults();
@@ -337,6 +352,8 @@ abstract class DatabaseInstaller {
/**
* Convenience alias for $this->parent->setVar()
+ * @param $name string
+ * @param $value mixed
*/
public function setVar( $name, $value ) {
$this->parent->setVar( $name, $value );
@@ -345,6 +362,10 @@ abstract class DatabaseInstaller {
/**
* Get a labelled text box to configure a local variable.
*
+ * @param $var string
+ * @param $label string
+ * @param $attribs array
+ * @param $helpData string
* @return string
*/
public function getTextBox( $var, $label, $attribs = array(), $helpData = "" ) {
@@ -367,6 +388,10 @@ abstract class DatabaseInstaller {
* Get a labelled password box to configure a local variable.
* Implements password hiding.
*
+ * @param $var string
+ * @param $label string
+ * @param $attribs array
+ * @param $helpData string
* @return string
*/
public function getPasswordBox( $var, $label, $attribs = array(), $helpData = "" ) {
@@ -450,7 +475,7 @@ abstract class DatabaseInstaller {
if ( !$this->db->selectDB( $this->getVar( 'wgDBname' ) ) ) {
return false;
}
- return $this->db->tableExists( 'cur' ) || $this->db->tableExists( 'revision' );
+ return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ );
}
/**
@@ -462,8 +487,8 @@ abstract class DatabaseInstaller {
return
Html::openElement( 'fieldset' ) .
Html::element( 'legend', array(), wfMsg( 'config-db-install-account' ) ) .
- $this->getTextBox( '_InstallUser', 'config-db-username', array(), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
- $this->getPasswordBox( '_InstallPassword', 'config-db-password', array(), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
+ $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' );
}
diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php
index 89fb16eb..f2e36aec 100644
--- a/includes/installer/DatabaseUpdater.php
+++ b/includes/installer/DatabaseUpdater.php
@@ -8,7 +8,7 @@
require_once( dirname(__FILE__) . '/../../maintenance/Maintenance.php' );
-/*
+/**
* Class for handling database updates. Roughly based off of updaters.inc, with
* a few improvements :)
*
@@ -41,6 +41,9 @@ abstract class DatabaseUpdater {
protected $postDatabaseUpdateMaintenance = array(
'DeleteDefaultMessages',
+ 'PopulateRevisionLength',
+ 'PopulateRevisionSha1',
+ 'PopulateImageSha1',
'FixExtLinksProtocolRelative',
);
@@ -150,6 +153,8 @@ abstract class DatabaseUpdater {
* Add a new update coming from an extension. This should be called by
* extensions while executing the LoadExtensionSchemaUpdates hook.
*
+ * @since 1.17
+ *
* @param $update Array: the update to run. Format is the following:
* first item is the callback function, it also can be a
* simple string with the name of a function in this class,
@@ -164,6 +169,9 @@ abstract class DatabaseUpdater {
/**
* Convenience wrapper for addExtensionUpdate() when adding a new table (which
* is the most common usage of updaters in an extension)
+ *
+ * @since 1.18
+ *
* @param $tableName String Name of table to create
* @param $sqlPath String Full path to the schema file
*/
@@ -172,6 +180,40 @@ abstract class DatabaseUpdater {
}
/**
+ * @since 1.19
+ *
+ * @param $tableName string
+ * @param $indexName string
+ * @param $sqlPath string
+ */
+ public function addExtensionIndex( $tableName, $indexName, $sqlPath ) {
+ $this->extensionUpdates[] = array( 'addIndex', $tableName, $indexName, $sqlPath, true );
+ }
+
+ /**
+ *
+ * @since 1.19
+ *
+ * @param $tableName string
+ * @param $columnName string
+ * @param $sqlPath string
+ */
+ public function addExtensionField( $tableName, $columnName, $sqlPath ) {
+ $this->extensionUpdates[] = array( 'addField', $tableName, $columnName, $sqlPath, true );
+ }
+
+ /**
+ * Add a maintenance script to be run after the database updates are complete.
+ *
+ * @since 1.19
+ *
+ * @param $class string Name of a Maintenance subclass
+ */
+ public function addPostDatabaseUpdateMaintenance( $class ) {
+ $this->postDatabaseUpdateMaintenance[] = $class;
+ }
+
+ /**
* Get the list of extension-defined updates
*
* @return Array
@@ -180,6 +222,11 @@ abstract class DatabaseUpdater {
return $this->extensionUpdates;
}
+ /**
+ * @since 1.17
+ *
+ * @return array
+ */
public function getPostDatabaseUpdateMaintenance() {
return $this->postDatabaseUpdateMaintenance;
}
@@ -203,6 +250,10 @@ abstract class DatabaseUpdater {
$this->setAppliedUpdates( $wgVersion, $this->updates );
+ if ( isset( $what['stats'] ) ) {
+ $this->checkStats();
+ }
+
if ( isset( $what['purge'] ) ) {
$this->purgeCache();
@@ -210,9 +261,6 @@ abstract class DatabaseUpdater {
$this->rebuildLocalisationCache();
}
}
- if ( isset( $what['stats'] ) ) {
- $this->checkStats();
- }
}
/**
@@ -236,6 +284,10 @@ abstract class DatabaseUpdater {
$this->updates = array_merge( $this->updates, $updates );
}
+ /**
+ * @param $version
+ * @param $updates array
+ */
protected function setAppliedUpdates( $version, $updates = array() ) {
$this->db->clearFlag( DBO_DDLMODE );
if( !$this->canUseNewUpdatelog() ) {
@@ -253,6 +305,8 @@ abstract class DatabaseUpdater {
* Obviously, only use this for updates that occur after the updatelog table was
* created!
* @param $key String Name of the key to check for
+ *
+ * @return bool
*/
public function updateRowExists( $key ) {
$row = $this->db->selectRow(
@@ -290,8 +344,8 @@ abstract class DatabaseUpdater {
* @return boolean
*/
protected function canUseNewUpdatelog() {
- return $this->db->tableExists( 'updatelog' ) &&
- $this->db->fieldExists( 'updatelog', 'ul_value' );
+ return $this->db->tableExists( 'updatelog', __METHOD__ ) &&
+ $this->db->fieldExists( 'updatelog', 'ul_value', __METHOD__ );
}
/**
@@ -299,6 +353,8 @@ abstract class DatabaseUpdater {
* $wgExtNewTables/Fields/Indexes. This is nasty :) We refactored a lot
* of this in 1.17 but we want to remain back-compatible for a while. So
* load up these old global-based things into our update list.
+ *
+ * @return array
*/
protected function getOldGlobalUpdates() {
global $wgExtNewFields, $wgExtNewTables, $wgExtModifiedFields,
@@ -372,12 +428,12 @@ abstract class DatabaseUpdater {
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
*/
protected function addTable( $name, $patch, $fullpath = false ) {
- if ( $this->db->tableExists( $name ) ) {
+ if ( $this->db->tableExists( $name, __METHOD__ ) ) {
$this->output( "...$name table already exists.\n" );
} else {
$this->output( "Creating $name table..." );
$this->applyPatch( $patch, $fullpath );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
}
}
@@ -389,14 +445,14 @@ abstract class DatabaseUpdater {
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
*/
protected function addField( $table, $field, $patch, $fullpath = false ) {
- if ( !$this->db->tableExists( $table ) ) {
- $this->output( "...$table table does not exist, skipping new field patch\n" );
- } elseif ( $this->db->fieldExists( $table, $field ) ) {
+ if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+ $this->output( "...$table table does not exist, skipping new field patch.\n" );
+ } elseif ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
$this->output( "...have $field field in $table table.\n" );
} else {
$this->output( "Adding $field field to table $table..." );
$this->applyPatch( $patch, $fullpath );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
}
}
@@ -408,12 +464,12 @@ abstract class DatabaseUpdater {
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
*/
protected function addIndex( $table, $index, $patch, $fullpath = false ) {
- if ( $this->db->indexExists( $table, $index ) ) {
- $this->output( "...$index key already set on $table table.\n" );
+ if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+ $this->output( "...index $index already set on $table table.\n" );
} else {
- $this->output( "Adding $index key to table $table... " );
+ $this->output( "Adding index $index to table $table... " );
$this->applyPatch( $patch, $fullpath );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
}
}
@@ -426,10 +482,10 @@ abstract class DatabaseUpdater {
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
*/
protected function dropField( $table, $field, $patch, $fullpath = false ) {
- if ( $this->db->fieldExists( $table, $field ) ) {
+ if ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
$this->output( "Table $table contains $field field. Dropping... " );
$this->applyPatch( $patch, $fullpath );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
} else {
$this->output( "...$table table does not contain $field field.\n" );
}
@@ -444,16 +500,31 @@ abstract class DatabaseUpdater {
* @param $fullpath Boolean: Whether to treat $patch path as a relative or not
*/
protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
- if ( $this->db->indexExists( $table, $index ) ) {
- $this->output( "Dropping $index from table $table... " );
+ if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+ $this->output( "Dropping $index index from table $table... " );
$this->applyPatch( $patch, $fullpath );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
} else {
$this->output( "...$index key doesn't exist.\n" );
}
}
/**
+ * @param $table string
+ * @param $patch string
+ * @param $fullpath bool
+ */
+ protected function dropTable( $table, $patch, $fullpath = false ) {
+ if ( $this->db->tableExists( $table, __METHOD__ ) ) {
+ $this->output( "Dropping table $table... " );
+ $this->applyPatch( $patch, $fullpath );
+ $this->output( "done.\n" );
+ } else {
+ $this->output( "...$table doesn't exist.\n" );
+ }
+ }
+
+ /**
* Modify an existing field
*
* @param $table String: name of the table to which the field belongs
@@ -463,17 +534,17 @@ abstract class DatabaseUpdater {
*/
public function modifyField( $table, $field, $patch, $fullpath = false ) {
$updateKey = "$table-$field-$patch";
- if ( !$this->db->tableExists( $table ) ) {
- $this->output( "...$table table does not exist, skipping modify field patch\n" );
- } elseif ( !$this->db->fieldExists( $table, $field ) ) {
- $this->output( "...$field field does not exist in $table table, skipping modify field patch\n" );
+ 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 in table $table already modified by patch $patch\n" );
+ $this->output( "...$field in table $table already modified by patch $patch.\n" );
} else {
$this->output( "Modifying $field field of table $table..." );
$this->applyPatch( $patch, $fullpath );
$this->insertUpdateRow( $updateKey );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
}
}
@@ -492,7 +563,7 @@ abstract class DatabaseUpdater {
* Check the site_stats table is not properly populated.
*/
protected function checkStats() {
- $this->output( "Checking site_stats row..." );
+ $this->output( "...site_stats is populated..." );
$row = $this->db->selectRow( 'site_stats', '*', array( 'ss_row_id' => 1 ), __METHOD__ );
if ( $row === false ) {
$this->output( "data is missing! rebuilding...\n" );
@@ -507,6 +578,9 @@ abstract class DatabaseUpdater {
# Common updater functions
+ /**
+ * Sets the number of active users in the site_stats table
+ */
protected function doActiveUsersInit() {
$activeUsers = $this->db->selectField( 'site_stats', 'ss_active_users', false, __METHOD__ );
if ( $activeUsers == -1 ) {
@@ -522,36 +596,41 @@ abstract class DatabaseUpdater {
$this->output( "...ss_active_users user count set...\n" );
}
+ /**
+ * Populates the log_user_text field in the logging table
+ */
protected function doLogUsertextPopulation() {
- if ( $this->updateRowExists( 'populate log_usertext' ) ) {
- $this->output( "...log_user_text field already populated.\n" );
- return;
- }
-
- $this->output(
+ 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" );
- $task = $this->maintenance->runChild( 'PopulateLogUsertext' );
- $task->execute();
- $this->output( "Done populating log_user_text field.\n" );
+
+ $task = $this->maintenance->runChild( 'PopulateLogUsertext' );
+ $task->execute();
+ $this->output( "done.\n" );
+ }
}
+ /**
+ * Migrate log params to new table and index for searching
+ */
protected function doLogSearchPopulation() {
- if ( $this->updateRowExists( 'populate log_search' ) ) {
- $this->output( "...log_search table already populated.\n" );
- return;
+ if ( !$this->updateRowExists( 'populate log_search' ) ) {
+ $this->output(
+ "Populating log_search table, printing progress markers. For large\n" .
+ "databases, you may want to hit Ctrl-C and do this manually with\n" .
+ "maintenance/populateLogSearch.php.\n" );
+
+ $task = $this->maintenance->runChild( 'PopulateLogSearch' );
+ $task->execute();
+ $this->output( "done.\n" );
}
-
- $this->output(
- "Populating log_search table, printing progress markers. For large\n" .
- "databases, you may want to hit Ctrl-C and do this manually with\n" .
- "maintenance/populateLogSearch.php.\n" );
- $task = $this->maintenance->runChild( 'PopulateLogSearch' );
- $task->execute();
- $this->output( "Done populating log_search table.\n" );
}
+ /**
+ * Updates the timestamps in the transcache table
+ */
protected function doUpdateTranscacheField() {
if ( $this->updateRowExists( 'convert transcache field' ) ) {
$this->output( "...transcache tc_time already converted.\n" );
@@ -560,9 +639,12 @@ abstract class DatabaseUpdater {
$this->output( "Converting tc_time from UNIX epoch to MediaWiki timestamp... " );
$this->applyPatch( 'patch-tc-timestamp.sql' );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
}
+ /**
+ * Update CategoryLinks collation
+ */
protected function doCollationUpdate() {
global $wgCategoryCollation;
if ( $this->db->selectField(
@@ -575,10 +657,24 @@ abstract class DatabaseUpdater {
return;
}
+ $this->output( "Updating category collations..." );
$task = $this->maintenance->runChild( 'UpdateCollation' );
$task->execute();
+ $this->output( "...done.\n" );
}
+ /**
+ * Migrates user options from the user table blob to user_properties
+ */
+ protected function doMigrateUserOptions() {
+ $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
+ $cl->execute();
+ $this->output( "done.\n" );
+ }
+
+ /**
+ * Rebuilds the localisation cache
+ */
protected function rebuildLocalisationCache() {
/**
* @var $cl RebuildLocalisationCache
@@ -587,6 +683,6 @@ abstract class DatabaseUpdater {
$this->output( "Rebuilding localisation cache...\n" );
$cl->setForce();
$cl->execute();
- $this->output( "Rebuilding localisation cache done.\n" );
+ $this->output( "done.\n" );
}
}
diff --git a/includes/installer/Ibm_db2Installer.php b/includes/installer/Ibm_db2Installer.php
index 78e607fb..a6c4fd65 100644
--- a/includes/installer/Ibm_db2Installer.php
+++ b/includes/installer/Ibm_db2Installer.php
@@ -144,6 +144,9 @@ class Ibm_db2Installer extends DatabaseInstaller {
if ( !$status->isOK() ) {
return $status;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
$dbName = $this->getVar( 'wgDBname' );
if( !$conn->selectDB( $dbName ) ) {
@@ -213,15 +216,16 @@ class Ibm_db2Installer extends DatabaseInstaller {
$this->db->selectDB( $this->getVar( 'wgDBname' ) );
try {
- $result = $this->db->query( 'SELECT PAGESIZE FROM SYSCAT.TABLESPACES' );
+ $result = $this->db->query( 'SELECT PAGESIZE FROM SYSCAT.TABLESPACES FOR READ ONLY' );
if( $result == false ) {
$status->fatal( 'config-connection-error', '' );
- }
- else {
- while ( $row = $this->db->fetchRow( $result ) ) {
+ } else {
+ $row = $this->db->fetchRow( $result );
+ while ( $row ) {
if( $row[0] >= 32768 ) {
return $status;
}
+ $row = $this->db->fetchRow( $result );
}
$status->fatal( 'config-ibm_db2-low-db-pagesize', '' );
}
@@ -245,7 +249,7 @@ class Ibm_db2Installer extends DatabaseInstaller {
\$wgDBport = \"{$port}\";";
}
- public function __construct($parent) {
- parent::__construct($parent);
+ public function __construct( $parent ) {
+ parent::__construct( $parent );
}
}
diff --git a/includes/installer/Ibm_db2Updater.php b/includes/installer/Ibm_db2Updater.php
index 39a9fb79..03540bb0 100644
--- a/includes/installer/Ibm_db2Updater.php
+++ b/includes/installer/Ibm_db2Updater.php
@@ -45,25 +45,30 @@ class Ibm_db2Updater extends DatabaseUpdater {
array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
- array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
-
- // Tables
- array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ),
- array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
- array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
-
- // Indexes
array( 'addIndex', 'msg_resource_links', 'uq61_msg_resource_links', 'patch-uq_61_msg_resource_links.sql' ),
array( 'addIndex', 'msg_resource', 'uq81_msg_resource', 'patch-uq_81_msg_resource.sql' ),
+ array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
array( 'addIndex', 'module_deps', 'uq96_module_deps', 'patch-uq_96_module_deps.sql' ),
-
- // Fields
+ array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api-field.sql' ),
+ array( 'addField', 'interwiki', 'iw_wikiid', 'patch-iw_wikiid-field.sql' ),
array( 'addField', 'categorylinks', 'cl_sortkey_prefix', 'patch-cl_sortkey_prefix-field.sql' ),
array( 'addField', 'categorylinks', 'cl_collation', 'patch-cl_collation-field.sql' ),
array( 'addField', 'categorylinks', 'cl_type', 'patch-cl_type-field.sql' ),
- array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api-field.sql' ),
- array( 'addField', 'interwiki', 'iw_wikiid', 'patch-iw_wikiid-field.sql' )
+
+ //1.18
+ array( 'doUserNewTalkTimestampNotNull' ),
+ 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( 'doRebuildLocalisationCache' ),
+
+ // 1.19
+ array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.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' )
);
}
-} \ No newline at end of file
+}
diff --git a/includes/installer/Installer.i18n.php b/includes/installer/Installer.i18n.php
index e9ede6f9..4f044097 100644
--- a/includes/installer/Installer.i18n.php
+++ b/includes/installer/Installer.i18n.php
@@ -103,6 +103,7 @@ The following database types are supported: $1.
If you are on shared hosting, ask your hosting provider to install a suitable database driver.
If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
+ 'config-outdated-sqlite' => "'''Warning''': you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
'config-no-fts3' => "'''Warning''': SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
'config-register-globals' => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
'''Disable it if you can.'''
@@ -132,13 +133,13 @@ MediaWiki requires UTF-8 support to function correctly.",
'config-memory-bad' => "'''Warning:''' PHP's <code>memory_limit</code> is $1.
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-xcache' => '[http://xcache.lighttpd.net/ XCache] is installed',
'config-apc' => '[http://www.php.net/apc APC] is installed',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] is installed',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is installed',
- 'config-no-cache' => "'''Warning:''' Could not find [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Warning:''' Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
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.
+ '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-imagemagick' => 'Found ImageMagick: <code>$1</code>.
@@ -217,7 +218,7 @@ In '''UTF-8 mode''', MySQL will know what character set your data is in, and can
but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
'config-mysql-old' => 'MySQL $1 or later is required, you have $2.',
'config-db-port' => 'Database port:',
- 'config-db-schema' => 'Schema for MediaWiki',
+ 'config-db-schema' => 'Schema for MediaWiki:',
'config-db-schema-help' => 'This schema will usually be fine.
Only change it if you know you need to.',
'config-pg-test-error' => "Cannot connect to database '''$1''': $2",
@@ -462,7 +463,7 @@ If you do not want a logo, leave this box blank.",
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.
In order to do this, MediaWiki requires access to the Internet.
-For more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].',
+For more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].',
'config-cc-error' => 'The Creative Commons license chooser gave no result.
Enter the license name manually.',
'config-cc-again' => 'Pick again...',
@@ -472,7 +473,7 @@ Enter the license name manually.',
'config-cache-help' => 'Object caching is used to improve the speed of MediaWiki by caching frequently used data.
Medium to large sites are highly encouraged to enable this, and small sites will see benefits as well.',
'config-cache-none' => 'No caching (no functionality is removed, but speed may be impacted on larger wiki sites)',
- 'config-cache-accel' => 'PHP object caching (APC, eAccelerator, XCache or WinCache)',
+ 'config-cache-accel' => 'PHP object caching (APC, XCache or WinCache)',
'config-cache-memcached' => 'Use Memcached (requires additional setup and configuration)',
'config-memcached-servers' => 'Memcached servers:',
'config-memcached-help' => 'List of IP addresses to use for Memcached.
@@ -564,6 +565,7 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
* @author EugeneZelenko
* @author Kghbln
* @author McDutchie
+ * @author Mormegil
* @author Nike
* @author Platonides
* @author Purodha
@@ -604,20 +606,24 @@ Parameters:
* $2 is the value to which <code>memory_limit</code> was raised.',
'config-memory-bad' => 'Parameters:
* $1 is the configured <code>memory_limit</code>.',
+ 'config-ctype' => 'Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP',
'config-xcache' => 'Message indicates if this program is available',
'config-apc' => 'Message indicates if this program is available',
- 'config-eaccel' => 'Message indicates if this program is available',
'config-wincache' => 'Message indicates if this program is available',
'config-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-no-cli-uploads-check' => 'CLI = Call Level Interface',
- 'config-suhosin-max-value-length' => 'Message shown when PHP parameter suhosin.get.max_value_length is between 0 and 1023 (that max value is hard set in MediaWiki software',
+ '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-suhosin-max-value-length' => 'Message shown when PHP parameter suhosin.get.max_value_length is between 0 and 1023 (that max value is hard set in MediaWiki software)',
'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
'config-db-wiki-settings' => 'This is more acurate: "Enter identifying or distinguishing data for this wiki" since a MySQL database can host tables of several wikis.',
'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
+ 'config-type-mysql' => '{{optional}}',
+ 'config-type-postgres' => '{{optional}}',
+ 'config-type-sqlite' => '{{optional}}',
+ 'config-type-oracle' => '{{optional}}',
'config-support-mysql' => 'Parameters:
* $1 - a link to the MySQL home page having the anchor text "MySQL".',
'config-support-postgres' => 'Parameters:
@@ -630,9 +636,7 @@ Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
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-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
- 'config-can-upgrade' => 'Should we no use an {{int:xxx}} construct for "continue" ?
-
-Parameters:
+ 'config-can-upgrade' => 'Parameters:
* $1 - Version or Revision indicator.',
'config-show-table-status' => '{{doc-important|"SHOW TABLE STATUS" is a MySQL command. Do not translate this.}}',
'config-ns-generic' => '{{Identical|Project}}',
@@ -677,6 +681,13 @@ This message refers to a block of HTML being embedded into the installer page. I
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.',
);
+/** Goan Konkani (Latin script) (Konknni)
+ * @author The Discoverer
+ */
+$messages['gom-latn'] = array(
+ 'config-page-language' => 'Bhas',
+);
+
/** Magyar (magázó) (Magyar (magázó))
* @author Dani
* @author Glanthor Reviol
@@ -737,7 +748,7 @@ Adjon meg egy másik felhasználónevet.',
'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.
-A funkcióról és hogy hogyan állítható be más wikik esetén [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.',
+A funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.',
'config-install-done' => "'''Gratulálunk!'''
Sikeresen telepítette a MediaWikit.
@@ -1309,6 +1320,7 @@ You should have received <doclink href=Copying>a copy of the GNU General Public
Калі вы выкарыÑтоўваеце агульны хоÑтынг, запытайцеÑÑ Ñž Ñвайго хоÑтынг-правайдÑра наконт уÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµÐ¼Ð°Ð³Ð° драйвÑру базы зьвеÑтак.
Калі Ð’Ñ‹ кампілÑвалі PHP ÑамаÑтойна, пераканфігуруйце Ñ– ÑабÑрыце Ñго з дазволеным кліентам базаў зьвеÑтак, напрыклад, <code>./configure --with-mysql</code>.
Калі Ð’Ñ‹ ÑžÑталёўвалі PHP з пакетаў Debian ці Ubuntu, то Вам Ñ‚Ñ€Ñба ÑžÑталÑваць дадаткова модуль <code>php5-mysql</code>.',
+ '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>.'''
'''Ðдключыце Ñе, калі можаце.'''
@@ -1332,17 +1344,17 @@ MediaWiki патрÑÐ±Ð½Ñ‹Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ– з гÑтага модулю, там
Калі Ð’Ñ‹ выкарыÑтоўваеце Mandrake, уÑталюйце пакет php-xml.',
'config-pcre' => 'ÐÑ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹ модуль падтрымкі PCRE.
MediaWiki Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†Ñ‹ патрабуюцца функцыі Ñ€ÑгулÑрных выразаў у Ñтылі Perl.',
- 'config-pcre-no-utf8' => "'''ÐšÑ€Ñ‹Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°''': модуль PCRE Ð´Ð»Ñ PHP ÑкампілÑваны без падтрымкі PCRE_UTF8.
+ 'config-pcre-no-utf8' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°''': модуль PCRE Ð´Ð»Ñ PHP ÑкампілÑваны без падтрымкі PCRE_UTF8.
MediaWiki патрабуе падтрымкі UTF-8 Ð´Ð»Ñ Ñлушнай працы.",
'config-memory-raised' => 'Ðбмежаваньне на даÑтупную Ð´Ð»Ñ PHP памÑць <code>memory_limit</code> было падвышанае з $1 да $2.',
'config-memory-bad' => "'''ПапÑÑ€Ñджаньне:''' памер PHP <code>memory_limit</code> Ñкладае $1.
Верагодна, гÑта вельмі мала.
УÑталÑваньне можа быць нÑўдалым!",
+ 'config-ctype' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°''': PHP муÑіць быць ÑкампілÑваны з падтрымкай [http://www.php.net/manual/en/ctype.installation.php пашырÑÐ½ÑŒÐ½Ñ Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] уÑталÑваны',
'config-apc' => '[http://www.php.net/apc APC] уÑталÑваны',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] уÑталÑваны',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] уÑталÑваны',
- 'config-no-cache' => "'''ПапÑÑ€Ñджаньне:''' немагчыма знайÑьці [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ці [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''ПапÑÑ€Ñджаньне:''' немагчыма знайÑьці [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ці [http://www.iis.net/download/WinCacheForPhp WinCache].
Ðб’ектнае кÑшаваньне Ð½Ñ ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ðµ.",
'config-mod-security' => "'''ПапÑÑ€Ñджаньне''': на Вашым ÑžÑб-ÑÑрверы ўключаны [http://modsecurity.org/ mod_security]. У выпадку нÑÑлушнай наладцы, ён можа Ñтаць прычынай праблемаў Ð´Ð»Ñ MediaWiki ці іншага праграмнага забеÑьпÑчÑньнÑ, Ñкое дазвалÑе ўдзельнікам даÑылаць на ÑÑрвÑÑ€ любы зьмеÑÑ‚.
ГлÑдзіце [http://modsecurity.org/documentation/ дакумÑнтацыю mod_security] ці зьвÑрніцеÑÑ Ñž падтрымку Вашага хоÑту, калі Ñž Ð’Ð°Ñ ÑƒÐ·ÑŒÐ½Ñ–ÐºÐ°ÑŽÑ†ÑŒ Ð²Ñ‹Ð¿Ð°Ð´ÐºÐ¾Ð²Ñ‹Ñ Ð¿Ñ€Ð°Ð±Ð»ÐµÐ¼Ñ‹.",
@@ -1373,9 +1385,11 @@ MediaWiki патрабуе падтрымкі UTF-8 Ð´Ð»Ñ Ñлушнай пра
'config-db-host' => 'ХоÑÑ‚ базы зьвеÑтак:',
'config-db-host-help' => 'Калі ÑÑрвÑÑ€ Вашай базы зьвеÑтак знаходзіцца на іншым ÑÑрвÑры, увÑдзіце тут Ñ–Ð¼Ñ Ñ…Ð¾Ñта ці IP-адраÑ.
-Калі Ð’Ñ‹ набываеце shared-хоÑтынг, Ваш хоÑтынг-правайдÑÑ€ муÑіць даць Вам Ñлушнае Ñ–Ð¼Ñ Ñ…Ð¾Ñта базы зьвеÑтак у Ñваёй дакумÑнтацыі.
+Калі Ð’Ñ‹ карыÑтаецеÑÑ shared-хоÑтынгам, Ваш хоÑтынг-правайдÑÑ€ муÑіць даць Вам Ñлушнае Ñ–Ð¼Ñ Ñ…Ð¾Ñта базы зьвеÑтак у Ñваёй дакумÑнтацыі.
-Калі Ð’Ñ‹ уÑталёўваеце ÑÑрвÑÑ€ Windows з выкарыÑтаньнем MySQL, выкарыÑтаньне «localhost» можа не працаваць Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ñ‹ ÑÑрвÑра. У гÑтым выпадку паÑпрабуйце пазначыць «127.0.0.1» Ð´Ð»Ñ Ð»Ñкальнага IP-адраÑа.',
+Калі Ð’Ñ‹ уÑталёўваеце ÑÑрвÑÑ€ Windows з выкарыÑтаньнем MySQL, выкарыÑтаньне «localhost» можа не працаваць Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ñ‹ ÑÑрвÑра. У гÑтым выпадку паÑпрабуйце пазначыць «127.0.0.1» Ð´Ð»Ñ Ð»Ñкальнага IP-адраÑа.
+
+Калі Ð’Ñ‹ выкарыÑтоўваеце 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-wiki-settings' => 'ІдÑÐ½Ñ‚Ñ‹Ñ„Ñ–ÐºÐ°Ñ†Ñ‹Ñ Ð³Ñтай вікі',
@@ -1662,7 +1676,7 @@ chmod a+w $3</pre>',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымаÑьць, ÑÐºÐ°Ñ Ð´Ð°Ð·Ð²Ð°Ð»Ñе вікі выкарыÑтоўваць выÑвы, гукі Ñ– Ñ–Ð½ÑˆÑ‹Ñ Ð¼ÑдыÑ, ÑÐºÑ–Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñцца на Ñайце [//commons.wikimedia.org/ Wikimedia Commons].
Каб гÑта зрабіць, MediaWiki патрабуе доÑтупу да ІнтÑрнÑту.
-Каб даведацца болей пра гÑтую магчымаÑьць, уключаючы інÑтрукцыю пра тое, Ñк Ñе ÑžÑтанавіць Ñž любой вікі, Ð°ÐºÑ€Ð°Ð¼Ñ Wikimedia Commons, глÑдзіце [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos дакумÑнтацыю].',
+Каб даведацца болей пра гÑтую магчымаÑьць, уключаючы інÑтрукцыю пра тое, Ñк Ñе ÑžÑтанавіць Ñž любой вікі, Ð°ÐºÑ€Ð°Ð¼Ñ Wikimedia Commons, глÑдзіце [//mediawiki.org/wiki/Manual:$wgForeignFileRepos дакумÑнтацыю].',
'config-cc-error' => 'Выбар ліцÑнзіі Creative Commons Ð½Ñ Ð´Ð°Ñž вынікаў.
УвÑдзіце назву ліцÑнзіі ўручную.',
'config-cc-again' => 'Выберыце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·â€¦',
@@ -1672,7 +1686,7 @@ chmod a+w $3</pre>',
'config-cache-help' => 'КÑшаваньне аб’ектаў павÑлічвае хуткаÑьць працы MediaWiki праз кÑшаваньне зьвеÑтак, ÑÐºÑ–Ñ Ñ‡Ð°Ñта выкарыÑтоўваюцца.
Вельмі Ñ€ÑкамÑндуем уключыць гÑта Ð´Ð»Ñ ÑÑÑ€Ñдніх Ñ– буйных Ñайтаў, такÑама будзе карыÑна Ð´Ð»Ñ Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ñ… Ñайтаў.',
'config-cache-none' => 'Без кÑÑˆÐ°Ð²Ð°Ð½ÑŒÐ½Ñ (ніÑÐºÑ–Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьці не Ñтрачваюцца, але хуткаÑьць працы буйных Ñайтаў можа зьнізіцца)',
- 'config-cache-accel' => 'КÑшаваньне аб’ектаў PHP (APC, eAccelerator, XCache ці WinCache)',
+ 'config-cache-accel' => 'КÑшаваньне аб’ектаў PHP (APC, XCache ці WinCache)',
'config-cache-memcached' => 'ВыкарыÑтоўваць Memcached (патрабуе дадатковай канфігурацыі)',
'config-memcached-servers' => 'СÑрвÑры memcached:',
'config-memcached-help' => 'Ð¡ÑŒÐ¿Ñ–Ñ IP-адраÑоў, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ выкарыÑтоўвацца Memcached.
@@ -1882,11 +1896,11 @@ $1
'config-memory-bad' => "'''Предупреждение:''' <code>memory_limit</code> на PHP е $1.
СтойноÑтта вероÑтно е твърде ниÑка.
Възможно е инÑталациÑта да Ñе провали!",
+ 'config-ctype' => "'''Фатално''': Ðеобходимо е PHP да бъде компилиран Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на [http://www.php.net/manual/en/ctype.installation.php разширението Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] е инÑталиран',
'config-apc' => '[http://www.php.net/apc APC] е инÑталиран',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] е инÑталиран',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инÑталиран',
- 'config-no-cache' => "'''Предупреждение:''' Ðе бÑха открити [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC] [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
+ '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-imagemagick' => 'Открит е ImageMagick: <code>$1</code>.
@@ -1970,7 +1984,7 @@ $1
$1
Ðко не виждате желаната за използване ÑиÑтема в ÑпиÑъка по-долу, Ñледвайте инÑтрукциите за активиране на поддръжка по-горе.',
- 'config-support-mysql' => '* $1 е най-фобре поддържата ÑиÑтема за база от данни, най-добре поддържана от МедиÑУики ([http://www.php.net/manual/en/mysql.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на MySQL])',
+ 'config-support-mysql' => '* $1 е най-добре поддържаната ÑиÑтема за база от данни, Ñ Ð½Ð°Ð¹-добра поддръжка от МедиÑУики ([http://www.php.net/manual/en/mysql.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на MySQL])',
'config-support-postgres' => '* $1 е популÑрна ÑиÑтема за бази от данни Ñ Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½ изходен код, коÑто е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на PostgreSQL]). Възможно е вÑе още да има грешки, затова не Ñе препоръчва да Ñе използва в общодоÑтъпна Ñреда.',
'config-support-sqlite' => '* $1 е лека ÑиÑтема за база от данни, коÑто е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на SQLite], използва PDO)',
'config-support-oracle' => '* $1 е комерÑиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на OCI8])',
@@ -2184,7 +2198,7 @@ chmod a+w $3</pre>',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалноÑÑ‚, коÑто позволÑва на уикитата да използват картинки, звуци и друга медиа от Ñайта на Ð£Ð¸ÐºÐ¸Ð¼ÐµÐ´Ð¸Ñ [//commons.wikimedia.org/ ОбщомедиÑ].
За да е възможно това, МедиÑУики изиÑква доÑтъп до Интернет.
-Повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° тази функционалноÑÑ‚, както и инÑтрукции за наÑтройване за други уикита, различни от ОбщомедиÑ, е налична в [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos наръчника].',
+Повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° тази функционалноÑÑ‚, както и инÑтрукции за наÑтройване за други уикита, различни от ОбщомедиÑ, е налична в [//mediawiki.org/wiki/Manual:$wgForeignFileRepos наръчника].',
'config-cc-error' => 'Избирането на лиценз на Криейтив ÐšÐ¾Ð¼ÑŠÐ½Ñ Ð½Ðµ даде резултат.
Ðеобходимо е името на лиценза да бъде въведено ръчно.',
'config-cc-again' => 'Повторно избиране...',
@@ -2194,7 +2208,7 @@ chmod a+w $3</pre>',
'config-cache-help' => 'Обектното кеширане Ñе използва за подобрÑване на ÑкороÑтта на МедиÑУики чрез кеширане на чеÑто използваните данни.
Силно препоръчително е на Ñредните и големите Ñайтове да включат тази наÑтройка, но малките Ñъщо могат да Ñе възползват от неÑ.',
'config-cache-none' => 'Без кеширане (не Ñе премахва от функционалноÑтта, но това влиÑе на ÑкороÑтта на по-големи уикита)',
- 'config-cache-accel' => 'PHP обектно кеширане (APC, eAccelerator, XCache или WinCache)',
+ 'config-cache-accel' => 'PHP обектно кеширане (APC, XCache или WinCache)',
'config-cache-memcached' => 'Използване на Memcached (изиÑква допълнителни наÑтройки и конфигуриране)',
'config-memcached-servers' => 'Memcached Ñървъри:',
'config-memcached-help' => 'СпиÑък Ñ IP адреÑи за използване за Memcached.
@@ -2548,9 +2562,8 @@ Re izel eo moarvat.
Marteze e c'hwito ar staliadenn !",
'config-xcache' => 'Staliet eo [http://xcache.lighttpd.net/ XCache]',
'config-apc' => 'Staliet eo [http://www.php.net/apc APC]',
- 'config-eaccel' => 'Staliet eo [http://eaccelerator.sourceforge.net/ eAccelerator]',
'config-wincache' => 'Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]',
- 'config-no-cache' => "'''Diwallit:''' N'eus ket bet gallet kavout [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] pe [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Diwallit:''' N'eus ket bet gallet kavout [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] pe [http://www.iis.net/download/WinCacheForPhp WinCache].
N'eo ket gweredekaet ar c'hrubuilhañ traezoù.",
'config-diff3-bad' => "N'eo ket bet kavet GNU diff3.",
'config-imagemagick' => "ImageMagick kavet : <code>$1</code>.
@@ -2721,6 +2734,7 @@ Gellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
'config-license' => 'Copyright hag aotre-implijout:',
'config-license-none' => 'Aotre ebet en traoñ pajenn',
'config-license-cc-by-sa' => 'Creative Commons Deroadenn Kenrannañ heñvel',
+ 'config-license-cc-by' => 'Creative Commons Deroadenn',
'config-license-cc-by-nc-sa' => 'Creative Commons Deroadenn Angenwerzhel Kenrannañ heñvel',
'config-license-cc-0' => 'Creative Commons Zero (Domani foran)',
'config-license-pd' => 'Domani foran',
@@ -2753,7 +2767,7 @@ Merkit anv an aotre-implijout gant an dorn.",
'config-cc-not-chosen' => 'Dibabit an aotre-implijout Creative Commons a fell deoc\'h ober gantañ ha klikit war "kenderc\'hel".',
'config-advanced-settings' => 'Kefluniadur araokaet',
'config-cache-options' => 'Arventennoù evit krubuilhañ traezoù :',
- 'config-cache-accel' => 'Krubuilhañ traezoù PHP (APC, eAccelerator, XCache pe WinCache)',
+ 'config-cache-accel' => 'Krubuilhañ traezoù PHP (APC, XCache pe WinCache)',
'config-cache-memcached' => 'Implijout Memcached (en deus ezhomm bezañ staliet ha kefluniet)',
'config-memcached-servers' => 'Servijerioù Memcached :',
'config-memcached-help' => "Roll ar chomlec'hioù IP da implijout evit Memcached.
@@ -2984,22 +2998,542 @@ $messages['crh-cyrl'] = array(
/** Czech (ÄŒesky)
* @author Danny B.
+ * @author Mormegil
*/
$messages['cs'] = array(
+ 'config-desc' => 'InstalaÄní program pro MediaWiki',
+ 'config-title' => 'Instalace MediaWiki $1',
'config-information' => 'Informace',
+ 'config-localsettings-upgrade' => 'Byl nalezen soubor <code>LocalSettings.php</code>.
+Pokud chcete stávající instalaci aktualizovat, zadejte hodnotu <code>$wgUpgradeKey</code>, kterou naleznete v souboru LocalSettings.php, do následujícího rámeÄku.',
+ 'config-localsettings-cli-upgrade' => 'Byl detekován soubor <code>LocalSettings.php</code>
+Pro aktualizaci spusťte místo instalace skript <code>update.php</code>.',
+ 'config-localsettings-key' => 'KlÃ­Ä pro aktualizaci:',
+ 'config-localsettings-badkey' => 'Zadaný klÃ­Ä je nesprávný.',
+ 'config-upgrade-key-missing' => 'Byla detekována existující instalace MediaWiki.
+Pokud ji chcete aktualizovat, přidejte následující řádku na konec souboru LocalSettings.php:
+
+$1',
+ 'config-localsettings-incomplete' => 'Existující soubor LocalSettings.php vypadá neúplný.
+Není nastavena proměnná $1.
+Upravte soubor LocalSettings.php tak, aby tuto promÄ›nnou obsahoval, a kliknÄ›te na „PokraÄovat“.',
+ 'config-localsettings-connection-error' => 'Při připojování k databázi s využitím nastavení uvedených v LocalSettings.php nebo AdminSettings.php došlo k chybě. Opravte tato nastavení a zkuste to znovu.
+
+$1',
+ 'config-session-error' => 'Nepodařilo se inicializovat relaci: $1',
+ 'config-session-expired' => 'Platnost dat vašeho sezení patrně vypršela.
+Sezení má nastavenu životnost $1.
+Prodloužit ji můžete nastavením <code>session.gc_maxlifetime</code> v php.ini.
+SpusÅ¥te instalaÄní proces od zaÄátku.',
+ 'config-no-session' => 'Data vašeho sezení se ztratila!
+Zkontrolujte svůj soubor php.ini a ujistěte se, že <code>session.save_path</code> je nastaveno na odpovídající adresář.',
+ 'config-your-language' => 'Váš jazyk:',
+ 'config-your-language-help' => 'Zvolte jazyk, který se má použít v průběhu instalace.',
+ 'config-wiki-language' => 'Jazyk wiki:',
+ 'config-wiki-language-help' => 'Zvolte jazyk, ve kterém bude většina obsahu wiki.',
+ 'config-back' => '↠Zpět',
'config-continue' => 'PokraÄovat →',
'config-page-language' => 'Jazyk',
+ 'config-page-welcome' => 'Vítejte v MediaWiki!',
+ 'config-page-dbconnect' => 'Připojení k databázi',
+ 'config-page-upgrade' => 'Aktualizace existující instalace',
+ 'config-page-dbsettings' => 'Nastavení databáze',
'config-page-name' => 'Název',
'config-page-options' => 'Nastavení',
'config-page-install' => 'Instalovat',
+ 'config-page-complete' => 'Hotovo!',
+ 'config-page-restart' => 'Restartovat instalaci',
+ 'config-page-readme' => 'Soubor ÄŒti mÄ›',
+ 'config-page-releasenotes' => 'Poznámky k vydání',
+ 'config-page-copying' => 'Licence',
+ 'config-page-upgradedoc' => 'Upgrade',
+ 'config-page-existingwiki' => 'Existující wiki',
+ '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ů.',
+ 'config-copyright' => "=== Licence a podmínky ===
+$1
+
+Tento program 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.
+
+Tento program je distribuován v nadÄ›ji, že bude užiteÄný, avÅ¡ak '''bez jakékoli záruky'''; neposkytují se ani odvozené záruky '''prodejnosti''' anebo '''vhodnosti pro urÄitý úÄel'''.
+Podrobnosti se doÄtete v textu GNU General Public License.
+
+<doclink href=Copying>Kopii GNU General Public License</doclink> jste mÄ›li obdržet spolu s tímto programem; pokud ne, napiÅ¡te na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [http://www.gnu.org/copyleft/gpl.html si ji pÅ™eÄtÄ›te online].",
+ 'config-sidebar' => '* [//www.mediawiki.org Oficiální web MediaWiki]
+* [//www.mediawiki.org/wiki/Help:Contents Uživatelská příruÄka]
+* [//www.mediawiki.org/wiki/Manual:Contents Administrátorská příruÄka]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>ÄŒti mÄ›</doclink>
+* <doclink href=ReleaseNotes>Poznámky k vydání</doclink>
+* <doclink href=Copying>Licence</doclink>
+* <doclink href=UpgradeDoc>Upgrade</doclink>',
+ 'config-env-good' => 'Prostředí bylo zkontrolováno.
+Můžete nainstalovat MediaWiki.',
+ 'config-env-bad' => 'Prostředí bylo zkontrolováno.
+MediaWiki nelze nainstalovat.',
+ 'config-env-php' => 'Je nainstalováno PHP $1.',
+ 'config-env-php-toolow' => 'Je nainstalováno PHP $1.
+MediaWiki ale vyžaduje PHP $2 nebo vyšší.',
+ 'config-unicode-using-utf8' => 'Pro normalizaci Unicode se používá utf8_normalize.so Briona Vibbera.',
+ 'config-unicode-using-intl' => 'Pro normalizaci Unicode se používá [http://pecl.php.net/intl PECL rozšíření intl].',
+ 'config-unicode-pure-php-warning' => "'''UpozornÄ›ní''': Není dostupné [http://pecl.php.net/intl PECL rozšíření intl] pro normalizaci Unicode, bude se využívat pomalá implementace v Äistém PHP.
+Pokud provozujete wiki s velkým provozem, mÄ›li byste si pÅ™eÄíst nÄ›co o [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalizaci Unicode].",
+ 'config-unicode-update-warning' => "'''Upozornění''': Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].
+Pokud vám aspoň trochu záleží na používání Unicode, měli byste [//www.mediawiki.org/wiki/Unicode_normalization_considerations ji aktualizovat].",
+ 'config-no-db' => 'NepodaÅ™ilo se nalézt vhodný databázový ovladaÄ! Musíte do PHP nainstalovat databázový ovladaÄ.
+Jsou podporovány následující typy databází: $1.
+
+Pokud jste na sdíleném hostingu, požádejte svého poskytovale o instalaci vhodného databázového ovladaÄe.
+Pokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.
+Pokud jste PHP nainstalovali z balíÄku Debian Äi Ubuntu, potÅ™ebujete nainstalovat také modul php5-mysql.',
+ 'config-outdated-sqlite' => "'''Upozornění''': Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
+ 'config-no-fts3' => "'''Upozornění''': SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
+ 'config-register-globals' => "'''Upozornění: Je zapnuta PHP volba <code>[http://php.net/register_globals register_globals]</code>.'''
+'''Pokud můžete, vypněte ji.'''
+MediaWiki bude fungovat, ale váš server je vystaven potenciálním bezpeÄnostním hrozbám.",
+ 'config-magic-quotes-runtime' => "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''
+Toto nastavení nepředvídatelně poškozuje vstupní data.
+MediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
+ 'config-magic-quotes-sybase' => "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''
+Toto nastavení nepředvídatelně poškozuje vstupní data.
+MediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
+ 'config-mbstring' => "'''Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''
+Toto nastavení způsobuje chyby a může nepředvídatelně poškozovat vstupní data.
+MediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
+ 'config-ze1' => "'''Kritická chyba: Je zapnut [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''
+Toto nastavení způsobuje s MediaWiki příšerné chyby.
+MediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.",
+ 'config-safe-mode' => "'''UpozornÄ›ní:''' Je aktivní [http://www.php.net/features.safe-mode bezpeÄný režim] PHP.
+Může způsobovat potíže, zejména pÅ™i použití naÄítání souborů a podpory <code>math</code>.",
+ 'config-xml-bad' => 'Chybí XML modul pro PHP.
+MediaWiki potřebuje funkce v tomto modulu a v této konfiguraci nebude fungovat.
+Pokud běžíte na Mandrake, nainstalujte balíÄek php-xml.',
+ 'config-pcre' => 'Zdá se, že modul s podporou PCRE chybí.
+MediaWiki ke své Äinnosti potÅ™ebuje funkce pro Perl-kompatibilní regulární výrazy.',
+ 'config-pcre-no-utf8' => "'''Kritická chyba''': PHP modul PCRE byl zřejmě přeložen bez podpory PCRE_UTF8.
+MediaWiki vyžaduje ke správné funkci podporu UTF-8.",
+ 'config-memory-raised' => '<code>memory_limit</code> v PHP byl nastaven na $1, zvýšen na $2.',
+ 'config-memory-bad' => "'''Upozornění:''' <code>memory_limit</code> je v PHP nastaven na $1.
+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-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]',
+ 'config-no-cache' => "'''Upozornění:''' Nebylo nalezeno [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], ani [http://www.iis.net/download/WinCacheForPhp WinCache].
+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-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.
+Pokud povolíte naÄítání souborů, bude zapnuto vytváření náhledů.',
+ 'config-no-scaling' => 'Nebyla nalezena knihovna GD ani ImageMagick.
+Vytváření náhledů bude vypnuto.',
+ 'config-no-uri' => "'''Chyba:''' NepodaÅ™ilo se urÄit aktuální URI.
+Instalace přerušena.",
+ 'config-no-cli-uri' => "'''Upozornění''': Nebylo uvedeno --scriptpath, používá se implicitní hodnota: <code>$1</code>.",
+ 'config-using-server' => 'Použito jméno serveru „<nowiki>$1</nowiki>“.',
+ 'config-using-uri' => 'Použito URL serveru „<nowiki>$1$2</nowiki>“.',
+ 'config-uploads-not-safe' => "'''UpozornÄ›ní:''' Váš implicitní adresář pro naÄítání souborů <code>$1</code> umožňuje provádÄ›ní libovolných skriptů.
+PÅ™estože MediaWiki vÅ¡echny naÄítané soubory kontroluje proti bezpeÄnostním hrozbám, je důraznÄ› doporuÄeno [//www.mediawiki.org/wiki/Manual:Security#Upload_security tuto bezpeÄnostní díru zacelit] pÅ™ed povolením naÄítání souborů.",
+ 'config-no-cli-uploads-check' => "'''UpozornÄ›ní:''' Váš implicitní adresář pro naÄítané soubory (<code>$1</code>) se pÅ™i instalaci z příkazového řádku nekontroluje na bezpeÄnostní hrozbu provádÄ›ní libovolných skriptů.",
+ 'config-brokenlibxml' => 'Váš systém obsahuje kombinaci verzí PHP a libxml2, která je chybná a může v MediaWiki a dalších webových aplikacích způsobovat skryté poškozování dat.
+Aktualizujte na PHP 5.2.9 nebo novější a libxml2 2.7.3 nebo novější ([//bugs.php.net/bug.php?id=45996 chyba evidovaná u PHP]).
+Instalace přerušena.',
+ 'config-using531' => 'MediaWiki nelze používat na PHP $1 kvůli chybě při předávání parametrů odkazem do <code>__call()</code>.
+Pro vyřešení upgradujte na PHP 5.3.2 nebo vyšší nebo downgradujte na PHP 5.3.0.
+Instalace přerušena.',
+ 'config-suhosin-max-value-length' => 'Je nainstalován Suhosin, který omezuje délku parametrů GET na $1 bajtů. Komponenta ResourceLoader z MediaWiki dokáže s tímto omezením pracovat, ale sníží to výkon. Pokud to je alespoň trochu možné, měli byste v php.ini nastavit suhosin.get.max_value_length na 1024 nebo vyšší a na stejnou hodnotu nastavit v LocalSettings.php proměnnou $wgResourceLoaderMaxQueryLength.',
+ 'config-db-type' => 'Typ databáze:',
+ 'config-db-host' => 'Databázový server:',
+ 'config-db-host-help' => 'Pokud je váš databázový server na jiném poÄítaÄi, zadejte zde jméno stroje nebo IP adresu.
+
+Pokud používáte sdílený webový hosting, váš poskytovatel by vám měl v dokumentaci sdělit správné jméno stroje.
+
+Pokud instalujete na server běžící na Windows a používáte MySQL, jméno „localhost“ nemusí fungovat. V takovém případě zkuste jako místní IP adresu zadat „127.0.0.1“.
+
+Pokud používáte PostgreSQL, můžete se připojit Unixovými sockety tak, že toto pole necháte prázdné.',
+ 'config-db-host-oracle' => 'Databázové TNS:',
+ 'config-db-host-oracle-help' => 'Zadejte platné [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; tato instalace musí vidět soubor tnsnames.ora.<br />Pokud používáte klientské knihovny verze 10g nebo novější, můžete také používat názvy [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identifikace této wiki',
+ 'config-db-name' => 'Jméno databáze:',
+ 'config-db-name-help' => 'Zvolte jméno, které oznaÄuje vaÅ¡i wiki.
+Nemělo by obsahovat mezery.
+
+Pokud používáte sdílený webový hosting, váš poskytovatel vám buÄ sdÄ›lí konkrétní jméno databáze, nebo vás nechá vytvářet databáze pomocí nÄ›jakého ovládacího panelu.',
+ 'config-db-name-oracle' => 'Databázové schéma:',
+ 'config-db-account-oracle-warn' => 'Existují tři podporované možnosti pro instalaci s použitím databáze Oracle.
+
+Pokud chcete v rámci instalace založit databázový úÄet, zadejte jako databázový úÄet pro instalaci úÄet s rolí SYSDBA a uveÄte požadované údaje pro úÄet pro webový přístup, jinak můžete vytvoÅ™it úÄet pro webový přístup ruÄnÄ› a zadat pouze tento úÄet (pokud má dostateÄná oprávnÄ›ní k zakládání objektů schématu) nebo poskytnout dva různé úÄty, jeden s oprávnÄ›ními k zakládání, druhý omezený pro webový přístup.
+
+Skript pro založení úÄtu s potÅ™ebnými privilegii můžete v této instalaci nalézt v adresáři „maintenance/oracle/“. Nezapomeňte, že použití omezeného úÄtu znepřístupní veÅ¡keré možnosti údržby pÅ™es implicitní úÄet.',
+ 'config-db-install-account' => 'Uživatelský úÄet pro instalaci',
+ 'config-db-username' => 'Databázové uživatelské jméno:',
+ 'config-db-password' => 'Databázové heslo:',
+ 'config-db-password-empty' => 'Zadejte heslo pro nového databázového uživatele: $1.
+PÅ™estože může jít zakládat nové uživatele i bez hesel, není to bezpeÄné.',
+ 'config-db-install-username' => 'Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.
+Toto není jméno uživatelského úÄtu MediaWiki; toto je uživatelské jméno k vaší databázi.',
+ 'config-db-install-password' => 'Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.
+Toto není heslo uživatelského úÄtu MediaWiki; toto je heslo k vaší databázi.',
+ 'config-db-install-help' => 'Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.',
+ 'config-db-account-lock' => 'Použít stejné uživatelské jméno a heslo pro běžnou Äinnost',
+ 'config-db-wiki-account' => 'Uživatelský úÄet pro běžnou Äinnost',
+ 'config-db-wiki-help' => 'Zadejte uživatelské jméno a heslo, které se bude používat pro připojení k databázi za běžného provozu wiki.
+Pokud úÄet neexistuje a instalaÄní úÄet má dostateÄná oprávnÄ›ní, bude tento uživatelský úÄet založen s minimálními oprávnÄ›ními potÅ™ebnými k provozu wiki.',
+ 'config-db-prefix' => 'Prefix databázových tabulek:',
+ 'config-db-prefix-help' => 'Pokud potřebujete sdílet jednu databázi mezi vícero wiki, případně mezi MediaWiki a další webovou aplikací, můžete přidat k názvu každé tabulky prefix, abyste se vyhnuli konfliktům.
+Nepoužívejte mezery.
+
+Toto pole se zpravidla ponechává prázdné.',
+ 'config-db-charset' => 'Znaková sada databáze',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binární',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 zpětně kompatibilní UTF-8',
+ 'config-charset-help' => "'''UpozornÄ›ní:''' Pokud použijete '''zpÄ›tnÄ› kompatibilní UTF-8''' na MySQL 4.1+ a následnÄ› zazálohujete databázi pomocí <code>mysqldump</code>, může to zniÄit vÅ¡echny ne-ASCII znaky, což nevratnÄ› poÅ¡kodí vaÅ¡e zálohy!
+
+V '''binárním režimu''' ukládá MediaWiki text v UTF-8 do databáze v binárních sloupcích.
+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-mysql-old' => 'Je vyžadováno MySQL $1 nebo novější, vy máte $2.',
+ 'config-db-port' => 'Databázový port:',
+ 'config-db-schema' => 'Schéma pro MediaWiki:',
+ 'config-db-schema-help' => 'Toto schéma zpravidla staÄí.
+Měňte ho, jen pokud víte, že je to potřeba.',
+ 'config-pg-test-error' => "Nelze se připojit k databázi '''$1''': $2",
+ 'config-sqlite-dir' => 'Adresář pro data SQLite:',
+ 'config-sqlite-dir-help' => "SQLite ukládá veškerá data v jediném souboru.
+
+Zadaný adresář musí být v průběhu instalace být přístupný pro zápis.
+
+'''Neměl by''' být dostupný z webu, proto ho nedáváme tam, kde jsou vaše PHP soubory.
+
+Instalátor do adresáře přidá soubor <code>.htaccess</code>, ale pokud to selže, mohl by někdo získat přístup k vaší holé databázi.
+To zahrnuje syrová uživatelská data (e-mailové adresy, hašovaná hesla), jako i smazané revize a další data s omezeným přístupem z vaší wiki.
+
+Zvažte umístění databáze někam zcela jinam, například do <code>/var/lib/mediawiki/mojewiki</code>.",
+ 'config-oracle-def-ts' => 'Implicitní tabulkový prostor:',
+ 'config-oracle-temp-ts' => 'DoÄasný tabulkový prostor:',
'config-type-mysql' => 'MySQL',
'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
+
+Pokud v nabídce níže nevidíte databázový systém, který chcete použít, musíte pro zapnutí podpory následovat instrukce odkázané výše.',
+ 'config-support-mysql' => '* $1 je pro MediaWiki hlavní platformou a je podporováno nejlépe ([http://www.php.net/manual/en/mysql.installation.php jak zkompilovat PHP s podporou MySQL])',
+ '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.',
+ '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 (.).',
+ '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“.
+Používejte pouze ASCII písmena (a-z, A-Z), Äísla (0-9), podtržítko (_) a spojovník (-).',
+ 'config-connection-error' => '$1.
+
+Zkontrolujte server, uživatelské jméno a heslo a zkuste to znovu.',
+ 'config-invalid-schema' => 'Neplatné schéma pro MediaWiki „$1“.
+Používejte pouze ASCII písmena (a-z, A-Z), Äísla (0-9) a podtržítko (_).',
+ 'config-db-sys-create-oracle' => 'Instalátor podporuje zakládání nového úÄtu pouze prostÅ™ednictvím úÄtu SYSDBA.',
+ 'config-db-sys-user-exists-oracle' => 'Uživatelský úÄet „$1“ již existuje. SYSDBA lze použít pouze pro založení nového úÄtu!',
+ 'config-postgres-old' => 'Je vyžadován PostgreSQL $1 nebo novější, vy máte $2.',
+ 'config-sqlite-name-help' => 'Zvolte jméno, které oznaÄuje vaÅ¡i wiki.
+Nepoužívejte mezery a spojovníky.
+Použije se jako název souboru s daty SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Nelze vytvořit datový adresář <code><nowiki>$1</nowiki></code>, protože do nadřazeného adresáře <code><nowiki>$2</nowiki></code> nemá webový server právo zapisovat.
+
+Instalátor zjistil uživatele, pod kterým váš webový server běží.
+Abyste mohli pokraÄovat, umožnÄ›te mu zapisovat do adresáře <code><nowiki>$3</nowiki></code>.
+Na systémech Unix/Linux proveÄte:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Nelze vytvořit datový adresář <code><nowiki>$1</nowiki></code>, protože do nadřazeného adresáře <code><nowiki>$2</nowiki></code> nemá webový server právo zapisovat.
+
+Instalátoru se nepodařilo zjistit uživatele, pod kterým váš webový server běží.
+Abyste mohli pokraÄovat, umožnÄ›te zápis do <code><nowiki>$3</nowiki></code> vÅ¡em uživatelům.
+Na systémech Unix/Linux proveÄte:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Chyba při vytváření datového adresáře „$1“.
+Zkontrolujte umístění a zkuste to znovu.',
+ 'config-sqlite-dir-unwritable' => 'Nelze zapisovat do adresáře „$1“.
+Změňte na něm oprávnění, aby do něj mohl webový server zapisovat, a zkuste to znovu.',
+ 'config-sqlite-connection-error' => '$1.
+
+Zkontrolujte datový adresář a jméno databáze níže a zkuste to znovu.',
+ 'config-sqlite-readonly' => 'Do souboru <code>$1</code> nelze zapisovat.',
+ 'config-sqlite-cant-create-db' => 'Nepodařilo se vytvořit databázový soubor <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP neobsahuje podporu FTS3, downgradují se tabulky',
+ 'config-can-upgrade' => "V této databázi jsou tabulky MediaWiki.
+Pokud je chcete aktualizovat na MediaWiki $1, kliknÄ›te na '''PokraÄovat'''.",
+ 'config-upgrade-done' => "Aktualizace byla dokonÄena.
+
+Svou wiki teÄ můžete [$1 zaÄít používat].
+
+Pokud chcete pÅ™egenerovat soubor <code>LocalSettings.php</code>, kliknÄ›te na tlaÄítko níže.
+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 LocalSettings.php →',
+ 'config-show-table-status' => 'Dotaz SHOW TABLE STATUS 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',
+ 'config-db-web-help' => 'Zvolte uživatelské jméno a heslo, které bude webový server používat pro připojení k databázovému serveru při běžném provozu wiki.',
+ 'config-db-web-account-same' => 'Použít stejný úÄet jako pro instalaci',
+ 'config-db-web-create' => 'Založit úÄet, pokud zatím neexistuje',
+ 'config-db-web-no-create-privs' => 'ÚÄet uvedený pro instalaci nemá oprávnÄ›ní dostateÄná pro založení nového úÄtu.
+ÚÄet, který zde uvedete, již musí existovat.',
+ 'config-mysql-engine' => 'Typ úložiště:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-myisam-dep' => "'''UpozornÄ›ní''': Jako typ úložiÅ¡tÄ› pro MySQL jste zvolili MyISAM, které není pro použití v MediaWiki doporuÄeno, neboÅ¥:
+* stěží podporuje souÄasný přístup kvůli zamykání tabulek,
+* je náchylnější na poškození dat než jiná úložiště,
+* kód MediaWiki nepodporuje MyISAM vždy tak dobře, jak by měl.
+
+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-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í.
+Databáze MyISAM bývají poÅ¡kozeny ÄastÄ›ji než databáze InnoDB.",
+ 'config-mysql-charset' => 'Znaková sada databáze:',
+ 'config-mysql-binary' => 'Binární',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "V '''binárním režimu''' ukládá MediaWiki text v UTF-8 do databáze v binárních sloupcích.
+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.',
+ 'config-project-namespace' => 'Jmenný prostor projektu:',
+ 'config-ns-generic' => 'Projekt',
+ 'config-ns-site-name' => 'Stejný jako název wiki: $1',
+ 'config-ns-other' => 'Jiný (uveÄte)',
+ 'config-ns-other-default' => 'MojeWiki',
+ 'config-project-namespace-help' => "Po vzoru Wikipedie udržuje mnoho wiki stránky se svými pravidly odděleně od stránek s vlastním obsahem, v „'''jmenném prostoru projektu'''“.
+Názvy vÅ¡ech stránek v tomto jmenném prostoru zaÄínají jistým prefixem, který zde můžete nastavit.
+Zvykem je odvozovat tento prefix z názvu wiki, ale nesmí obsahovat jisté interpunkÄní znaky jako „#“ nebo „:“.",
+ 'config-ns-invalid' => 'Uvedený jmenný prostor „<nowiki>$1</nowiki>“ je neplatný.
+Zadejte jiný jmenný prostor projektu.',
+ 'config-ns-conflict' => 'Uvedený jmenný prostor „<nowiki>$1</nowiki>“ koliduje se standardním jmenným prostorem MediaWiki.
+Zadejte jiný jmenný prostor projektu.',
+ 'config-admin-box' => 'Správcovský úÄet',
'config-admin-name' => 'Vaše jméno:',
+ 'config-admin-password' => 'Heslo:',
+ 'config-admin-password-confirm' => 'Heslo ještě jednou:',
+ 'config-admin-help' => 'Zde zadejte své požadované uživatelské jméno, například „Pepa Novák“.
+Tímto jménem se budete do wiki hlásit.',
+ 'config-admin-name-blank' => 'Zadejte uživatelské jméno správce.',
+ 'config-admin-name-invalid' => 'Uvedené uživatelské jméno „<nowiki>$1</nowiki>“ není platné.
+Zadejte jiné uživatelské jméno.',
+ 'config-admin-password-blank' => 'Zadejte heslo ke správcovskému úÄtu.',
+ 'config-admin-password-same' => 'Heslo nesmí být stejné jako uživatelské jméno.',
+ 'config-admin-password-mismatch' => 'Uvedená hesla se neshodují.',
'config-admin-email' => 'E-mailová adresa:',
+ 'config-admin-email-help' => 'Zde zadejte e-mailovou adresu, která vám umožní přijímat e-maily od ostatních uživatelů wiki, získat nové heslo a přijímat notifikace o změnách sledovaných stránek. Tohle pole můžete nechat prázdné.',
+ 'config-admin-error-user' => 'Vnitřní chyba při vytváření správce se jménem „<nowiki>$1</nowiki>“.',
+ 'config-admin-error-password' => 'Vnitřní chyba při nastavování hesla správci se jménem „<nowiki>$1</nowiki>“: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Zadali jste neplatnou e-mailovou adresu.',
+ 'config-subscribe' => 'Přihlásit se k odběru [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-mailové konference pro oznamování nových verzí].',
+ 'config-subscribe-help' => 'Tohle je e-mailová konference s nízkým provozem, na které se oznamují nové verze, vÄetnÄ› důležitých bezpeÄnostních oznámení.
+Měli byste se do ní přihlásit a při vydání nových verzí aktualizovat svou instalaci MediaWiki.',
+ 'config-subscribe-noemail' => 'Pokusili jste se přihlásit k odběru e-mailové konference pro oznamování nových verzí, aniž byste poskytli e-mailovou adresu.
+Pokud se chcete přihlásit k odběru, zadejte e-mailovou adresu.',
+ 'config-almost-done' => 'Už jsme skoro hotovi!
+Zbývající konfiguraci už můžete pÅ™eskoÄit a nainstalovat wiki hned teÄ.',
+ 'config-optional-continue' => 'Ptejte se mě dál.',
+ 'config-optional-skip' => 'Už mě to nudí, prostě nainstalujte wiki.',
+ 'config-profile' => 'Profil uživatelských práv:',
+ 'config-profile-wiki' => 'TradiÄní wiki',
+ 'config-profile-no-anon' => 'Vyžadována registrace uživatelů',
+ 'config-profile-fishbowl' => 'Editace jen pro vybrané',
+ 'config-profile-private' => 'Soukromá wiki',
+ 'config-profile-help' => "Wiki fungují nejlépe, když je necháte editovat co nejvÄ›tším možným poÄtem lidí.
+V MediaWiki můžete snadno kontrolovat poslední změny a vracet zpět libovolnou škodu způsobenou hloupými nebo zlými uživateli.
+
+Mnoho lidí vÅ¡ak zjistilo, že je MediaWiki užiteÄné v Å¡irokém spektru rolí a nÄ›kdy není snadné vÅ¡echny pÅ™esvÄ›dÄit o výhodách wikizvyklostí.
+Takže si můžete vybrat.
+
+'''{{int:config-profile-wiki}}''' dovoluje editovat všem, aniž by se museli přihlašovat.
+Na wiki, kde je '''{{int:config-profile-no-anon}}''', se lépe řídí zodpovědnost, ale může to odradit náhodné přispěvatele.
+
+Profil '''{{int:config-profile-fishbowl}}''' umožňuje schváleným uživatelům editovat, ale veÅ™ejnost si může stránky prohlížet vÄetnÄ› jejich historie.
+'''{{int:config-profile-private}}''' dovoluje stránky prohlížet jen schváleným uživatelům, kteří je i mohou editovat.
+
+Po instalaci je možná komplexní konfigurace uživatelských práv; vizte [//www.mediawiki.org/wiki/Manual:User_rights odpovídající stránku příruÄky].",
+ 'config-license' => 'Autorská práva a licence:',
+ 'config-license-none' => 'Bez patiÄky s licencí',
+ 'config-license-cc-by-sa' => 'Creative Commons UveÄte autora-Zachovejte licenci',
+ 'config-license-cc-by' => 'Creative Commons UveÄte autora',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons UveÄte autora-Nevyužívejte dílo komerÄnÄ›-Zachovejte licenci',
+ 'config-license-cc-0' => 'Creative Commons Zero (volné dílo)',
+ 'config-license-gfdl' => 'GNU Free Documentation License 1.3 nebo novější',
+ 'config-license-pd' => 'Volné dílo',
+ 'config-license-cc-choose' => 'Zvolit vlastní licenci Creative Commons',
+ 'config-license-help' => "Mnoho veřejných wiki všechny příspěvky zveřejňuje pod některou [http://freedomdefined.org/Definition/Cs svobodnou licencí].
+To pomáhá vytvořit duch komunitního vlastnictví a povzbuzuje dlouhodobé přispívání.
+To obecně není potřeba u soukromé nebo firemní wiki.
+
+Pokud chcete být schopni používat text z Wikipedie a chcete, aby Wikipedie byla schopna pÅ™ijímat text okopírovaný z vaší wiki, mÄ›li byste zvolit '''Creative Commons UveÄte autora-Zachovejte licenci'''.
+
+Dříve Wikipedie používala GNU Free Documentation License.
+GFDL je platná licence, ale složité jí porozumět.
+Také je komplikované používat obsah licencovaný pod GFDL.",
'config-email-settings' => 'Nastavení e-mailu',
+ 'config-enable-email' => 'Zapnout odchozí e-mail',
+ 'config-enable-email-help' => 'Pokud chcete, aby e-mail fungoval, je potřeba správně nakonfigurovat [http://www.php.net/manual/en/mail.configuration.php e-mailová nastavení PHP].
+Pokud nechcete žádné e-mailové funkce, můžete je zde vypnout.',
+ 'config-email-user' => 'Umožnit vzájemné e-maily mezi uživateli',
+ 'config-email-user-help' => 'Umožní všem uživatelům posílat si navzájem e-maily, pokud si to zapnout v uživatelském nastavení.',
+ 'config-email-usertalk' => 'Umožnit notifikace k uživatelským diskusím',
+ 'config-email-usertalk-help' => 'Umožní uživatelům přijímat notifikace o změnách uživatelských diskusí, pokud si to zapnou v nastavení.',
+ 'config-email-watchlist' => 'Umožnit notifikace ke sledovaným stránkám',
+ 'config-email-watchlist-help' => 'Umožní uživatelům přijímat notifikace o změnách sledovaných stránek, pokud si to zapnou v nastavení.',
+ 'config-email-auth' => 'Zapnout ověřování e-mailů',
+ 'config-email-auth-help' => "Pokud je tato volba vybrána, uživatelé musí potvrdit svou e-mailovou adresu pomocí odkazu, který je jim poslán, kdykoli si ji nastaví nebo změní.
+Jen potvrzené e-mailové adresy mohou přijímat e-maily od ostatních uživatelů a e-maily s notifikacemi o změnách.
+Nastavení této volby je '''doporuÄeno''' pro veÅ™ejné wiki kvůli možnosti zneužití e-mailových funkcí.",
+ 'config-email-sender' => 'Návratová e-mailová adresa:',
+ 'config-email-sender-help' => 'Zadejte e-mailovou adresu, která se má použít jako návratová na odchozích e-mailech.
+Sem budou zasílány nedoruÄitelné zprávy.
+Mnoho mailových serverů vyžaduje, aby byla pÅ™inejmenším Äást s doménovým jménem platná.',
+ 'config-upload-settings' => 'Obrázky a naÄítání souborů',
+ 'config-upload-enable' => 'Povolit naÄítání souborů',
+ 'config-upload-help' => 'NaÄítání souborů potenciálnÄ› vystavuje váš server bezpeÄnostním rizikům.
+Více informací naleznete v [//www.mediawiki.org/wiki/Manual:Security Äásti o bezpeÄnosti] v příruÄce.
+
+Pro umožnÄ›ní naÄítání souborů změňte práva na podadresáři <code>images</code> pod koÅ™enovým adresářem MediaWiki, aby do nÄ›j mohl webový server zapisovat.
+Poté zapněte tuto volbu.',
+ 'config-upload-deleted' => 'Adresář pro smazané soubory:',
+ 'config-upload-deleted-help' => 'Zvolte adresář, do kterého se mají archivovat smazané soubory.
+Tento adresář by ideálně neměl být dostupný z webu.',
+ 'config-logo' => 'URL loga:',
+ '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 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].
+Aby to bylo možné, potřebuje mít MediaWiki přístup k internetu.
+
+Více informací o této funkci, vÄetnÄ› instrukcí, jak ji nastavit pro jiné wiki než Wikimedia Commons, najdete v [//mediawiki.org/wiki/Manual:$wgForeignFileRepos příruÄce].',
+ 'config-cc-error' => 'VoliÄ licence Creative Commons nevrátil žádný výsledek.
+Zadejte název licence ruÄnÄ›.',
+ 'config-cc-again' => 'Zvolit znovu…',
+ 'config-cc-not-chosen' => 'Zvolte si požadovanou licenci Creative Commons a kliknÄ›te na tlaÄítko.',
+ 'config-advanced-settings' => 'PokroÄilá konfigurace',
+ 'config-cache-options' => 'Nastavení cachování objektů:',
+ 'config-cache-help' => 'Cachování objektů se používá pro vylepÅ¡ení rychlosti MediaWiki tím, že se cachují Äasto používaná data.
+StÅ™edním až velkým serverům se jeho zapnutí důraznÄ› doporuÄuje, i menší servery pocítí jeho výhody.',
+ 'config-cache-none' => 'Bez cachování (o žádnou funkcionalitu nepřijdete, na větších wiki však může dojít ke zhoršení rychlosti)',
+ 'config-cache-accel' => 'Cachování PHP objektů (APC, XCache nebo WinCache)',
+ 'config-cache-memcached' => 'Použít Memcached (vyžaduje další nastavení a konfiguraci)',
+ 'config-memcached-servers' => 'Servery Memcached:',
+ 'config-memcached-help' => 'Seznam IP adres, které se mají používat pro Memcached.
+UveÄte jednu na řádek spolu s portem. Například:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Jako typ cache jste zvolili Memcached, ale neuvedli jste žádné servery.',
+ 'config-memcache-badip' => 'Zadali jste neplatnou IP adresu pro Memcached: $1.',
+ 'config-memcache-noport' => 'Nezadali jste port serveru Memcached: $1.
+Pokud port neznáte, implicitní je 11211.',
+ 'config-memcache-badport' => 'Čísla portů pro Memcached by měla být mezi $1 a $2.',
+ 'config-extensions' => 'Rozšíření',
+ 'config-extensions-help' => 'Výše uvedená rozšíření byla nalezena ve vašem adresáři <code>./extensions</code>.
+
+Mohou vyžadovat dodateÄnou konfiguraci, ale teÄ je můžete povolit.',
+ 'config-install-alreadydone' => "'''UpozornÄ›ní:''' Vypadá to, že jste MediaWiki již nainstalovali a teÄ se o to pokoušíte znovu.
+PokraÄujte na další stránku.",
+ 'config-install-begin' => 'Stisknutím „{{int:config-continue}}“ spustíte instalaci MediaWiki.
+Pokud jeÅ¡tÄ› chcete udÄ›lat nÄ›jaké zmÄ›ny, stisknÄ›te tlaÄítko zpÄ›t.',
+ 'config-install-step-done' => 'hotovo',
'config-install-step-failed' => 'selhaly',
+ 'config-install-extensions' => 'Vkládají se rozšíření',
+ 'config-install-database' => 'Připravuje se databáze',
+ 'config-install-schema' => 'Vytváří se schéma',
+ 'config-install-pg-schema-not-exist' => 'Schéma PostgreSQL neexistuje.',
+ 'config-install-pg-schema-failed' => 'Založení tabulek se nezdařilo.
+Ujistěte se, že uživatel „$1“ může zapisovat do schématu „$2“.',
+ 'config-install-pg-commit' => 'Potvrzují se změny',
+ 'config-install-pg-plpgsql' => 'Kontroluje se jazyk PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Musíte do databáze $1 nainstalovat jazyk PL/pgSQL',
+ 'config-pg-no-create-privs' => 'ÚÄet zadaný pro instalaci nemá oprávnÄ›ní k založení uživatelského úÄtu.',
+ 'config-pg-not-in-role' => 'ÚÄet zadaný pro webového uživatele již existuje
+ÚÄet zadaný pro instalaci není superuživatelský a není Älenem role webového uživatele, takže nemůže zakládat objekty vlastnÄ›né webovým uživatelem.
+
+MediaWiki v souÄasné dobÄ› vyžaduje, aby byl vlastníkem tabulek webový uživatel. UveÄte jiný název úÄtu webového uživatele nebo kliknÄ›te na „zpÄ›t“ a zadejte instalaÄního uživatele s odpovídajícími oprávnÄ›ními.',
+ 'config-install-user' => 'Vytváří se databázový uživatel',
+ 'config-install-user-alreadyexists' => 'Uživatel „$1“ už existuje',
+ 'config-install-user-create-failed' => 'Vytváření uživatele „$1“ selhalo: $2',
+ 'config-install-user-grant-failed' => 'Uživateli „$1“ se nepodařilo přidělit oprávnění: $2',
+ 'config-install-user-missing' => 'Zadaný uživatel „$1“ neexistuje.',
+ 'config-install-user-missing-create' => 'Zadaný uživatel „$1“ neexistuje.
+Pokud ho chcete založit, zaÅ¡krtnÄ›te možnost „založit úÄet“ níže.',
+ 'config-install-tables' => 'Vytvářejí se tabulky',
+ 'config-install-tables-exist' => "'''Upozornění''': Vypadá to, že tabulky MediaWiki již existují.
+Přeskakuje se jejich zakládání.",
+ 'config-install-tables-failed' => "'''Chyba''': Vytvoření tabulek selhalo s následující chybou: $1",
+ 'config-install-interwiki' => 'Tabulka interwiki se plní implicitními položkami',
+ 'config-install-interwiki-list' => 'Nelze pÅ™eÄíst soubor <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Upozornění''': Vypadá to, že tabulka interwiki již obsahuje nějaké záznamy.
+Přeskakuje se implicitní seznam.",
+ 'config-install-stats' => 'Inicializují se statistiky',
+ 'config-install-keys' => 'Vytvářejí se tajné klíÄe',
+ 'config-insecure-keys' => "'''UpozornÄ›ní:''' {{PLURAL:$2|Tajný klíÄ|Tajné klíÄe}} ($1) vytvoÅ™ené v průbÄ›hu instalace {{PLURAL:$2|není|nejsou}} zcela {{PLURAL:$2|bezpeÄný|bezpeÄné}}. Zvažte {{PLURAL:$2|jeho|jejich}} ruÄní zmÄ›nu.",
+ 'config-install-sysop' => 'Zakládá se uživatelský úÄet správce',
+ 'config-install-subscribe-fail' => 'Nelze se přihlásit k odběru mediawiki-announce: $1',
+ 'config-install-subscribe-notpossible' => 'Není nainstalován cURL a není dostupné allow_url_fopen.',
+ 'config-install-mainpage' => 'Vytváří se poÄáteÄní obsah hlavní strany',
+ 'config-install-extension-tables' => 'Vytvářejí se tabulky pro zapnutá rozšíření',
+ 'config-install-mainpage-failed' => 'Nepodařilo se vložit hlavní stranu: $1',
+ 'config-install-done' => "'''Gratulujeme!'''
+Úspěšně jste nainstalovali MediaWiki.
+
+Instalátor vytvořil soubor <code>LocalSettings.php</code>.
+Ten obsahuje veškerou vaši konfiguraci.
+
+Budete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.
+
+Pokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:
+
+$3
+
+'''Poznámka''': Pokud to neudÄ›láte hned, tento vygenerovaný konfiguraÄní soubor nebude pozdÄ›ji dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.
+
+Až to dokonÄíte, můžete '''[$2 vstoupit do své wiki]'''.",
+ 'config-download-localsettings' => 'Stáhnout LocalSettings.php',
+ 'config-help' => 'nápověda',
'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.
@@ -3038,10 +3572,17 @@ $messages['cy'] = array(
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]',
);
-/** Danish (Dansk) */
+/** Danish (Dansk)
+ * @author Peter Alberti
+ */
$messages['da'] = array(
'mainpagetext' => "'''MediaWiki er nu installeret.'''",
- 'mainpagedocfooter' => 'Se vores engelsksprogede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentation om tilpasning af brugergrænsefladen] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide brugervejledningen] for oplysninger om opsætning og anvendelse.',
+ 'mainpagedocfooter' => 'Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.
+
+== 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]',
);
/** German (Deutsch)
@@ -3082,14 +3623,14 @@ Die Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt we
'config-your-language' => 'Sprache:',
'config-your-language-help' => 'Bitte die Sprache auswählen, die während des Installationsvorgangs verwendet werden soll.',
'config-wiki-language' => 'Sprache des Wikis:',
- 'config-wiki-language-help' => 'Bitte die Hauptbearbeitungssprache des Wikis auswählen',
+ 'config-wiki-language-help' => 'Bitte die Hauptbearbeitungssprache des Wikis auswählen.',
'config-back' => '↠Zurück',
'config-continue' => 'Weiter →',
'config-page-language' => 'Sprache',
'config-page-welcome' => 'Willkommen bei MediaWiki!',
'config-page-dbconnect' => 'Mit der Datenbank verbinden',
'config-page-upgrade' => 'Eine vorhandene Installation aktualisieren',
- 'config-page-dbsettings' => 'Datenbankeinstellungen',
+ 'config-page-dbsettings' => 'Einstellungen zur Datenbank',
'config-page-name' => 'Name',
'config-page-options' => 'Optionen',
'config-page-install' => 'Installieren',
@@ -3114,10 +3655,10 @@ 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.",
- 'config-sidebar' => '* [//www.mediawiki.org Website von MediaWiki]
-* [//www.mediawiki.org/wiki/Help:Contents Benutzeranleitung]
-* [//www.mediawiki.org/wiki/Manual:Contents Administratorenanleitung]
-* [//www.mediawiki.org/wiki/Manual:FAQ Häufig gestellte Fragen]
+ '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]
+* [//www.mediawiki.org/wiki/Manual:FAQ/de Häufig gestellte Fragen]
----
* <doclink href=Readme>Lies mich</doclink>
* <doclink href=ReleaseNotes>Versionsinformationen</doclink>
@@ -3142,20 +3683,21 @@ Die folgenden Datenbanksysteme werden unterstützt: $1
Sofern ein gemeinschaftlich genutzter Server für das Hosting verwendet wird, muss der Hoster gefragt werden einen adäquaten Datenbanktreiber zu installieren.
Sofern PHP selbst kompiliert wurde, muss es mit es neu konfiguriert werden, wobei der Datenbankclient zu aktivierten ist. Hierzu kann beispielsweise <code>./configure --with-mysql</code> ausgeführt werden.
Sofern PHP über die Paketverwaltung einer Debian- oder Ubuntu-Installation installiert wurde, muss das „php5-mysql“-Paket nachinstalliert werden.',
- 'config-no-fts3' => "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen zur Verfügung stehen.",
+ 'config-outdated-sqlite' => "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
+ 'config-no-fts3' => "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen zur Verfügung stehen werden.",
'config-register-globals' => "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''
'''Sie sollte deaktiviert werden, sofern dies möglich ist.'''
Die MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
- 'config-magic-quotes-runtime' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]</code> von PHP ist aktiviert!'''
+ 'config-magic-quotes-runtime' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/function.set-magic-quotes-runtime.php set_magic_quotes_runtime]</code> von PHP ist aktiviert!'''
Diese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.
MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
- 'config-magic-quotes-sybase' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!'''
+ 'config-magic-quotes-sybase' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/sybase.configuration.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!'''
Diese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.
MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
'config-mbstring' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]</code> von PHP ist aktiviert!'''
Diese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.
MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
- 'config-ze1' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]</code> von PHP ist aktiviert!'''
+ 'config-ze1' => "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/ini.core.php zend.ze1_compatibility_mode]</code> von PHP ist aktiviert!'''
Diese Einstellung führt zu großen Fehlern bei MediaWiki.
MediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
'config-safe-mode' => "'''Warnung:''' Der Funktion <code>[http://www.php.net/features.safe-mode Safe Mode]</code> von PHP ist aktiviert.
@@ -3165,18 +3707,18 @@ MediaWiki benötigt Funktionen, die dieses Modul bereitstellt und wird in der be
Sofern Mandriva genutzt wird, muss noch das „php-xml“-Paket installiert werden.',
'config-pcre' => 'Das PHP-Modul für die PCRE-Unterstützung wurde nicht gefunden.
MediaWiki benötigt allerdings perl-kompatible reguläre Ausdrücke, um lauffähig zu sein.',
- 'config-pcre-no-utf8' => "'''Fataler Fehler: Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.'''
+ 'config-pcre-no-utf8' => "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.
MediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.",
'config-memory-raised' => 'Der PHP-Parameter <code>memory_limit</code> betrug $1 und wurde auf $2 erhöht.',
'config-memory-bad' => "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.
Dieser Wert ist wahrscheinlich zu niedrig.
Der Installationsvorgang könnte daher scheitern!",
+ 'config-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-xcache' => '[http://xcache.lighttpd.net/ XCache] ist installiert',
'config-apc' => '[http://www.php.net/apc APC] ist installiert',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] ist installiert',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
- 'config-no-cache' => "'''Warnung:''' [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] konnten nicht gefunden werden.
-Das Objektcaching ist daher nicht aktiviert.",
+ '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.
+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.',
@@ -3193,13 +3735,13 @@ Der Installationsvorgang wurde daher abgebrochen.",
'config-using-uri' => 'Verwende Server-URL „<nowiki>$1$2</nowiki>“.',
'config-uploads-not-safe' => "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.
Obwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen diese [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
- 'config-no-cli-uploads-check' => "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird nicht auf Sicherheitsanfälligkeiten bezüglich willkürlicher Skriptausführungen während der Installation des ''Call Level Interface'' (CLI) geprüft.",
+ 'config-no-cli-uploads-check' => "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.",
'config-brokenlibxml' => 'Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.
PHP muss auf Version 5.2.9 oder später sowie libxml2 auf die Version 2.7.3 oder später aktualisiert werden, um das Problem zu lösen. Installationsabbruch ([//bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).',
'config-using531' => 'MediaWiki kann nicht zusammen mit PHP $1 verwendet werden. Grund hierfür ist ein Fehler im Zusammenhang mit den Verweisparametern zu <code>__call()</code>.
PHP muss auf Version 5.3.2 oder höher oder 5.3.0 oder niedriger aktualisiert werden, um das Problem zu beheben.
Die Installation wurde abgebrochen.',
- 'config-suhosin-max-value-length' => 'Suhosin ist installiert, was die Länge des GET-Parameters auf $1 Bytes beschränkt. Der ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit. Sofern möglich sollte der Parameter suhosin.get.max_value_length in der Datei php.ini auf 1024 oder höher festgelegt werden. Gleichzeitig muß der Parameter $wgResourceLoaderMaxQueryLength in der Datei LocalSettings.php auf den selben Wert eingestellt werden.',
+ 'config-suhosin-max-value-length' => 'Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes. Der ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit. Sofern möglich sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei php.ini auf 1024 oder höher festgelegt werden. Gleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei LocalSettings.php auf den selben Wert eingestellt werden.',
'config-db-type' => 'Datenbanksystem:',
'config-db-host' => 'Datenbankserver:',
'config-db-host-help' => 'Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.
@@ -3208,7 +3750,7 @@ Sofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster d
Sofern auf einem Windows-Server installiert und MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.
-Sofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verwinden.',
+Sofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verbinden.',
'config-db-host-oracle' => 'Datenbank-TNS:',
'config-db-host-oracle-help' => 'Einen gültigen [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm „Local Connect“-Namen] angeben. Die „tnsnames.ora“-Datei muss von dieser Installation erkannt werden können.<br />Sofern die Client-Bibliotheken für Version 10g oder neuer verwendet werden, kann auch [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm „Easy Connect“] zur Namensgebung genutzt werden.',
'config-db-wiki-settings' => 'Bitte Daten zur eindeutigen Identifikation dieses Wikis angeben',
@@ -3248,8 +3790,8 @@ Gewöhnlich bleibt dieses Datenfeld leer.',
Im '''binären Modus''' speichert MediaWiki UTF-8 Texte in der Datenbank in binär kodierte Datenfelder.
Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwendung jeglicher Unicode-Zeichen.
-Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,
-allerdings können keine Zeichen außerhalb des [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
+Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren.
+Es können allerdings 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-mysql-old' => 'MySQL $1 oder höher wird benötigt. MySQL $2 ist momentan vorhanden.',
'config-db-port' => 'Datenbankport:',
'config-db-schema' => 'Datenschema für MediaWiki',
@@ -3356,10 +3898,10 @@ Das Wiki kann nun [$1 genutzt werden].',
'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
'config-db-web-help' => 'Bitte Benutzernamen und Passwort auswählen, die der Webserver während des Normalbetriebes dazu verwenden soll, eine Verbindung zum Datenbankserver herzustellen.',
- 'config-db-web-account-same' => 'Dasselbe Konto wie während des Installationsvorgangs verwenden',
+ 'config-db-web-account-same' => 'Dasselbe Datenbankkonto wie während des Installationsvorgangs verwenden',
'config-db-web-create' => 'Sofern nicht bereits vorhanden, muss nun das Konto erstellt werden',
- 'config-db-web-no-create-privs' => 'Das angegebene und für den Installationsvorgang vorgesehene Konto verfügt nicht über ausreichend Berechtigungen, um ein Konto zu erstellen.
-Das hier angegebene Konto muss bereits vorhanden sein.',
+ 'config-db-web-no-create-privs' => 'Das angegebene und für den Installationsvorgang vorgesehene Datenbankkonto verfügt nicht über ausreichend Berechtigungen, um ein weiteres Datenbankkonto zu erstellen.
+Das hier angegebene Datenbankkonto muss daher bereits vorhanden sein.',
'config-mysql-engine' => 'Speicher-Engine:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
@@ -3421,7 +3963,7 @@ Diese Mailingliste sollte abonniert werden. Zudem sollte die MediaWiki-Installat
'config-subscribe-noemail' => 'Beim Abonnieren der Mailingliste mit Mitteilungen zu Versionsveröffentlichungen wurde keine E-Mail-Adresse angegeben.
Bitte eine E-Mail-Adresse angeben, sofern die Mailingliste abonniert werden soll.',
'config-almost-done' => 'Der Vorgang ist fast abgeschlossen!
-Die verbliebenen Konfigurationseinstellungen können übersprungen und das Wiki umgehend installiert werden.',
+Die verbleibenden Konfigurationseinstellungen können übersprungen und das Wiki umgehend installiert werden.',
'config-optional-continue' => 'Ja, es sollen weitere Konfigurationseinstellungen vorgenommen werden.',
'config-optional-skip' => 'Nein, das Wiki soll nun installiert werden.',
'config-profile' => 'Profil der Benutzerberechtigungen:',
@@ -3435,7 +3977,7 @@ Mit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrau
Allerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es zudem nicht einfach alle Beteiligten von den Vorteilen des „Wiki-Prinzips†zu überzeugen. Darum ist diese Auswahl möglich.
Ein '''{{int:config-profile-wiki}}''' ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.
-Ein Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen, die nur gelegentlich Bearbeitungen vornehmen wollen, abschrecken. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.
+Ein Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen abschrecken, die nur gelegentlich Bearbeitungen vornehmen wollen. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern, Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.
Komplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [//www.mediawiki.org/wiki/Manual:User_rights entsprechenden Anleitung].",
'config-license' => 'Lizenz:',
@@ -3477,9 +4019,9 @@ Bei viele E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe k
'config-upload-settings' => 'Hochladen von Bildern und Dateien',
'config-upload-enable' => 'Das Hochladen von Dateien ermöglichen',
'config-upload-help' => 'Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.
-Weitere Informationen hierzu sollen im [//www.mediawiki.org/wiki/Manual:Security Abschnitt Sicherheit] der Anleitung gelesen werden.
+Weitere Informationen hierzu können im [//www.mediawiki.org/wiki/Manual:Security Abschnitt Sicherheit] der Anleitung nachgelesen werden.
-Um das Hochladen von Dateien zu ermöglichen, muss der Zugriff auf das Unterverzeichnis <code>./images</code> so geändert werden, das es für den Webserver beschreibbar ist.
+Um das Hochladen von Dateien zu ermöglichen, muss der Zugriff auf das Unterverzeichnis <code>./images</code> so geändert werden, das dieses für den Webserver beschreibbar ist.
Hernach kann diese Option aktiviert werden.',
'config-upload-deleted' => 'Verzeichnis für gelöschte Dateien:',
'config-upload-deleted-help' => 'Bitte ein Verzeichnis auswählen, in dem gelöschte Dateien archiviert werden sollen.
@@ -3491,25 +4033,25 @@ Bitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an di
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.
-Um diese Funktion zu nutzen, muss MediaWiki eine Verbindung ins Internet herstellen können.
+Um diese Funktion nutzen zu können, muss das Wiki über eine Verbindung zum Internet verfügen.
-Weitere Informationen zu dieser Funktion, einschließlich der Anleitung, wie andere Wikis als Wikimedia Commons eingerichtet werden können, gibt es im [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbuch].',
+Weitere Informationen zu dieser Funktion, einschließlich der Anleitung, wie hierfür andere Wikis als Wikimedia Commons eingerichtet werden können, gibt es im [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbuch].',
'config-cc-error' => 'Der Creativ-Commons-Lizenzassistent konnte keine Lizenz ermitteln.
Die Lizenz ist daher jetzt manuell einzugeben.',
'config-cc-again' => 'Erneut auswählen …',
'config-cc-not-chosen' => 'Die gewünschte Creative-Commons-Lizenz auswählen und dann auf „weiter“ klicken.',
'config-advanced-settings' => 'Erweiterte Konfiguration',
'config-cache-options' => 'Einstellungen für die Zwischenspeicherung von Objekten:',
- 'config-cache-help' => 'Objektcaching wird dazu genutzt die Geschwindigkeit von MediaWiki zu verbessern, indem häufig genutzte Daten zwischengespeichert werden.
-Mittelgroße bis große Wikis werden sehr ermutigt dies zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Vorteile.',
- 'config-cache-none' => 'Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann die Geschwindigkeit größerer Wikis beeinflusst werden)',
- 'config-cache-accel' => 'Objektcaching von PHP (APC, eAccelerator, XCache or WinCache)',
+ 'config-cache-help' => 'Das Objektcaching wird dazu genutzt die Geschwindigkeit von MediaWiki zu verbessern, indem häufig genutzte Daten zwischengespeichert werden.
+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-memcached-servers' => 'Memcached Cacheserver',
'config-memcached-help' => 'Liste der für Memcached nutzbaren IP-Adressen.
Es sollte eine je Zeile mitsamt des vorgesehenen Ports angegeben werden. Beispiele:
-127.0.0.1:11211
-192.168.1.25:1234',
+127.0.0.1:11211 oder
+192.168.1.25:1234 usw.',
'config-memcache-needservers' => 'Memcached wurde als Cacheserver ausgewählt. Dabei wurde allerdings kein Server angegeben.',
'config-memcache-badip' => 'Es wurde für Memcached eine ungültige IP-Adresse angegeben: $1',
'config-memcache-noport' => 'Es wurde kein Port zur Nutzung durch den Memcached Cacheserver angegeben: $1
@@ -3518,14 +4060,14 @@ Sofern der Port unbekannt ist, ist 11211 die Standardangabe.',
'config-extensions' => 'Erweiterungen',
'config-extensions-help' => 'Die obig angegebenen Erweiterungen wurden im Verzeichnis <code>./extensions</code> gefunden.
-Sie könnten zusätzliche Konfigurierung erfordern, können aber bereits jetzt aktiviert werden.',
+Es könnten zusätzliche Konfigurierungen zu einzelnen Erweiterungen erforderlich sein, dennoch können sie aber bereits jetzt aktiviert werden.',
'config-install-alreadydone' => "'''Warnung:''' Es wurde eine vorhandene MediaWiki-Installation gefunden.
Es muss daher mit den nächsten Seite weitergemacht werden.",
'config-install-begin' => 'Durch Drücken von „{{int:config-continue}}“ wird die Installation von MediaWiki gestartet.
Sofern Änderungen vorgenommen werden sollen, kann man auf „↠Zurück“ klicken.',
'config-install-step-done' => 'erledigt',
'config-install-step-failed' => 'gescheitert',
- 'config-install-extensions' => 'Einschließlich Erweiterungen',
+ 'config-install-extensions' => 'Softwareerweiterungen',
'config-install-database' => 'Datenbank wird eingerichtet',
'config-install-schema' => 'Datenschema wird erstellt',
'config-install-pg-schema-not-exist' => 'Das PostgesSQL-Datenschema ist nicht vorhanden',
@@ -3535,10 +4077,10 @@ Es muss sichergestellt sein, dass der Benutzer „$1“ Schreibzugriff auf das D
'config-install-pg-plpgsql' => 'Suche nach der Datenbanksprache PL/pgSQL',
'config-pg-no-plpgsql' => 'Für Datenbank $1 muss die Datenbanksprache PL/pgSQL installiert werden',
'config-pg-no-create-privs' => 'Das für die Installation angegeben Konto verfügt nicht über ausreichende Berechtigungen, um ein Datenbanknutzerkonto zu erstellen.',
- 'config-pg-not-in-role' => 'Das für den Wikibenutzer angegebene Benutzerkonto ist bereits vorhanden.
-Das für den Installationsvorgang angegebene Benutzerkonto ist kein Supernutzer und nicht Mitglied der Benutzergruppe der Wikibenutzer, so dass keine dem Wikibenutzer zugeordneten Datenobjekte erstellt werden konnten.
+ 'config-pg-not-in-role' => 'Das für den Webbenutzer angegebene Benutzerkonto ist bereits vorhanden.
+Das für den Installationsvorgang angegebene Benutzerkonto ist kein Superbenutzer und nicht Mitglied der Benutzergruppe der Webbenutzer, so dass keine dem Webbenutzer zugeordneten Datenobjekte erstellt werden können.
-Für MediaWiki ist es momentan erforderlich, dass die Tabellen dem Wikibenutzer zugeordnet sind. Bitte einen anderen Namen für den Wikibenutzer angeben oder „zurück“ anklicken, um einen ausreichend berechtigten Benutzer für den Installationsvorgang anzugeben.',
+Für MediaWiki ist es momentan erforderlich, dass die Tabellen dem Webbenutzer rechtemäßig zugeordnet sind. Bitte einen anderen Namen für den Wikibenutzer angeben oder „↠Zurück“ anklicken, um einen ausreichend berechtigten Benutzer für den Installationsvorgang anzugeben.',
'config-install-user' => 'Datenbankbenutzer wird erstellt',
'config-install-user-alreadyexists' => 'Datenbankbenutzer „$1“ ist bereits vorhanden',
'config-install-user-create-failed' => 'Das Anlegen des Datenbankbenutzers „$1“ ist gescheitert: $2',
@@ -3551,12 +4093,12 @@ Bitte das Auswahlkästchen „Benutzerkonto erstellen“ anklicken, sofern diese
Die Erstellung wurde übersprungen.",
'config-install-tables-failed' => "'''Fehler:''' Die Erstellung der Datentabellen ist aufgrund des folgenden Fehlers gescheitert: $1",
'config-install-interwiki' => 'Interwikitabellen werden eingerichtet',
- 'config-install-interwiki-list' => 'Die Datei <code>interwiki.list</code> konnte nicht gefunden werden.',
+ 'config-install-interwiki-list' => 'Die Datei <code>interwiki.list</code> konnte nicht gelesen werden.',
'config-install-interwiki-exists' => "'''Warnung:''' Es wurden Interwikitabellen mit Daten gefunden.
Die Standardliste wird übersprungen.",
'config-install-stats' => 'Statistiken werden initialisiert',
'config-install-keys' => 'Geheimschlüssel werden erstellt',
- 'config-insecure-keys' => "'''Warnung:''' {{PLURAL:$2|Der Geheimschlüssel|Die Geheimschlüssel}} $1 {{PLURAL:$2|der|die}} während des Installationsvorgangs generiert wurde, ist nicht sehr sicher. {{PLURAL:$2|Er sollte|Sie sollten}} manuell geändert werden.",
+ 'config-insecure-keys' => "'''Warnung:''' {{PLURAL:$2|Der Geheimschlüssel|Die Geheimschlüssel}} $1, {{PLURAL:$2|der|die}} während des Installationsvorgangs generiert {{PLURAL:$2|wurde, ist|wurden, sind}} nicht sehr sicher. {{PLURAL:$2|Er sollte|Sie sollten}} manuell geändert werden.",
'config-install-sysop' => 'Administratorkonto wird erstellt',
'config-install-subscribe-fail' => 'Abonnieren von „mediawiki-announce“ ist gescheitert: $1',
'config-install-subscribe-notpossible' => 'cURL ist nicht installiert und allow_url_fopen ist nicht verfügbar.',
@@ -3567,7 +4109,7 @@ Die Standardliste wird übersprungen.",
MediaWiki wurde erfolgreich installiert.
Das Installationsprogramm hat die Datei <code>LocalSettings.php</code> erzeugt.
-Sie enthält alle Konfigurationseinstellungen.
+Sie enthält alle vorgenommenen Konfigurationseinstellungen.
Diese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei <code>index.php</code> befindet. Das Herunterladen sollte inzwischen automatisch gestartet worden sein.
@@ -3575,9 +4117,9 @@ Sofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann
$3
-'''Hinweis:''' Sofern das Herunterladen der Konfigurationsdatei nicht jetzt durchgeführt wird, wird sie zu einem späteren Zeitpunkt nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.
+'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.
-Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß mit dem Wiki.",
+Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
'config-download-localsettings' => 'LocalSettings.php herunterladen',
'config-help' => 'Hilfe',
'mainpagetext' => "'''MediaWiki wurde erfolgreich installiert.'''",
@@ -3782,9 +4324,8 @@ Probablemente este valor es demasiado bajo.
¡La instalación podrá fallar!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] está instalado',
'config-apc' => '[http://www.php.net/apc APC] está instalado',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] está instalado',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
- 'config-no-cache' => "'''Advertencia:''' No pudo encontrarse [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Advertencia:''' No pudo encontrarse [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
El caché de objetos no está habilitado.",
'config-diff3-bad' => 'GNU diff3 no se encuentra.',
'config-imagemagick' => 'ImageMagick encontrado: <code>$1</code>.
@@ -3956,7 +4497,7 @@ Escribe el nombre de la licencia manualmente.',
'config-cache-help' => 'El almacenamiento en caché de objetos se utiliza para mejorar la velocidad de MediaWiki mediante el almacenamiento en caché los datos usados más frecuentemente.
A los sitios medianos y grandes se les recomienda que permitirlo. También es beneficioso para los sitios pequeños.',
'config-cache-none' => 'Sin almacenamiento en caché (no se pierde ninguna funcionalidad, pero la velocidad puede resentirse en sitios grandes)',
- 'config-cache-accel' => 'Almacenamiento en caché de objetos PHP (APC, eAccelerator, XCache o WinCache)',
+ 'config-cache-accel' => 'Almacenamiento en caché de objetos PHP (APC, XCache o WinCache)',
'config-cache-memcached' => 'Utilizar Memcached (necesita ser instalado y configurado aparte)',
'config-memcached-servers' => 'Servidores Memcached:',
'config-memcached-help' => 'Lista de direcciones IP que serán usadas por Memcached.
@@ -4157,11 +4698,16 @@ $messages['fi'] = array(
'config-desc' => 'MediaWiki-asennin',
'config-title' => 'MediaWikin version $1 asennus',
'config-information' => 'Tiedot',
- 'config-localsettings-upgrade' => '<code>LocalSettings.php</code>-tiedosto on havaittu.
-Syötä kohdan <code>$wgUpgradeKey</code> arvo alla olevaan kenttään päivittääksesi asennuksen.
+ 'config-localsettings-upgrade' => '<code>LocalSettings.php</code>-tiedosto havaittiin.
+Kirjoita muuttujan <code>$wgUpgradeKey</code> arvo alla olevaan kenttään päivittääksesi asennuksen.
Löydät sen LocalSettings.php-tiedostosta.',
+ 'config-localsettings-cli-upgrade' => 'LocalSettings.php-tiedosto havaittiin.
+Päivitä asennus suorittamalla update.php.',
'config-localsettings-key' => 'Päivitysavain',
'config-localsettings-badkey' => 'Antamasi avain on virheellinen.',
+ 'config-localsettings-incomplete' => 'Nykyinen LocalSettings.php-tiedosto näyttää olevan puutteellinen.
+Muuttujaa $1 ei ole asetettu.
+Muuta LocalSettings.php-tiedostoa siten, että muuttuja on asetettu ja napsauta »Jatka».',
'config-session-error' => 'Istunnon aloittaminen epäonnistui: $1',
'config-session-expired' => 'Istuntotietosi näyttävät olevan vanhentuneita.
Istuntojen elinajaksi on määritelty $1.
@@ -4207,6 +4753,8 @@ Voit asentaa MediaWikin.',
'config-env-bad' => 'Asennusympäristö on tarkastettu.
Et voi asentaa MediaWikiä.',
'config-env-php' => 'PHP $1 on asennettu.',
+ 'config-env-php-toolow' => 'PHP $1 on asennettu.
+MediaWiki vaatii PHP:n version $2 tai uudemman.',
'config-no-db' => 'Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.
Seuraavat tietokantatyypit ovat tuettuja: $1.',
'config-safe-mode' => "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.
@@ -4218,7 +4766,6 @@ Tämä on luultavasti liian alhainen.
Asennus saattaa epäonnistua!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] on asennettu',
'config-apc' => '[http://www.php.net/apc APC] on asennettu.',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] on asennettu',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] on asennettu',
'config-diff3-bad' => 'GNU diff3:a ei löytynyt.',
'config-db-type' => 'Tietokannan tyyppi',
@@ -4232,6 +4779,7 @@ Asennus saattaa epäonnistua!",
'config-charset-mysql5-binary' => 'MySQL 4.1/5.0, binääri',
'config-charset-mysql5' => 'MySQL 4.1/5.0, UTF-8',
'config-charset-mysql4' => 'MySQL 4.0, taaksepäin yhteensopiva UTF-8',
+ 'config-mysql-old' => 'MediaWiki tarvitsee MySQL:n version $1 tai uudemman. Nykyinen versio on $2.',
'config-type-mysql' => 'MySQL',
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
@@ -4254,7 +4802,7 @@ Käytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavu
Älä käytä välilyöntejä tai viivoja.
Nimeä käytetään SQLite-tietokannan tiedostonimessä.',
'config-sqlite-dir-unwritable' => 'Hakemistoon â€$1†kirjoittaminen epäonnistui.
-Muuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja koita uudelleen.',
+Muuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja yritä uudelleen.',
'config-sqlite-readonly' => 'Tiedostoon <code>$1</code> ei voi kirjoittaa.',
'config-sqlite-fts3-downgrade' => 'PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.',
'config-upgrade-done' => "Päivitys valmis.
@@ -4274,6 +4822,7 @@ Voit [$1 aloittaa wikin käytön].',
'config-mysql-binary' => 'Binääri',
'config-mysql-utf8' => 'UTF-8',
'config-site-name' => 'Wikin nimi',
+ 'config-site-name-blank' => 'Kirjoita sivuston nimi.',
'config-project-namespace' => 'Projektinimiavaruus',
'config-ns-generic' => 'Projekti',
'config-ns-site-name' => 'Sama kuin wikin nimi: $1',
@@ -4283,17 +4832,21 @@ Voit [$1 aloittaa wikin käytön].',
'config-admin-password-confirm' => 'Salasana uudelleen',
'config-admin-name-blank' => 'Anna ylläpitäjän käyttäjänimi.',
'config-admin-email' => 'Sähköpostiosoite',
+ 'config-admin-error-bademail' => 'Annoit virheellisen sähköpostiosoitteen.',
'config-almost-done' => 'Olet jo lähes valmis!
Voit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.',
'config-profile-wiki' => 'Perinteinen wiki',
'config-profile-no-anon' => 'Tunnuksen luonti vaaditaan',
'config-profile-private' => 'Yksityinen wiki',
+ 'config-license-pd' => 'Public domain',
'config-email-settings' => 'Sähköpostiasetukset',
'config-logo' => 'Logon URL-osoite',
'config-cc-again' => 'Valitse uudelleen...',
'config-extensions' => 'Laajennukset',
- 'config-install-step-done' => 'tehty',
+ 'config-install-step-done' => 'valmis',
'config-install-step-failed' => 'epäonnistui',
+ 'config-install-user-alreadyexists' => 'Käyttäjä $1 on jo olemassa',
+ 'config-install-interwiki-list' => 'Tiedostoa <code>interwiki.list</code> ei voitu lukea.',
'config-download-localsettings' => 'Lataa LocalSettings.php',
'config-help' => 'ohje',
'mainpagetext' => "'''MediaWiki on onnistuneesti asennettu.'''",
@@ -4307,13 +4860,13 @@ Voit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.',
=== Asetukset ===
-Tarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset LocalSettings.php:hen seuraavasti:
+Tarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:
\$wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';
\$wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';
\$wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';
\$wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';
\$wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';
-Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) — {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) — {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) — {{GRAMMAR:illative|{{SITENAME}}}} (yöhön).",
+Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön).",
);
/** Faroese (Føroyskt) */
@@ -4428,6 +4981,7 @@ Vous devriez faire une [//www.mediawiki.org/wiki/Unicode_normalization_considera
Si vous êtes sur un site partagé, demandez à votre hébergeur d'installer un pilote de base de données approprié. Si vous avez compilé PHP, le configurer avec client de base de données activé, par exemple en insérant la directive <code>./configure --with-mysql</code>.
Si vous avez installé PHP d'une distribution Debian ou Ubuntu, vous devez aussi installer le module <code>php5-mysql</code>.",
+ 'config-outdated-sqlite' => "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
'config-no-fts3' => "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
'config-register-globals' => "'''Attention : l'option <code>[http://php.net/register_globals register_globals]</code> de PHP est activée.'''
'''Désactivez-la si vous le pouvez.'''
@@ -4457,11 +5011,11 @@ MédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
'config-memory-bad' => "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.
Cette valeur est probablement trop faible.
Il est possible que l’installation échoue !",
+ 'config-ctype' => "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] est installé',
'config-apc' => '[http://www.php.net/apc APC] est installé',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] est installé',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] est installé',
- 'config-no-cache' => "'''Attention :''' Impossible de trouver [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Attention :''' Impossible de trouver [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].
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.",
@@ -4725,7 +5279,7 @@ Des configurations de droits d’utilisateurs plus complexes sont disponibles ap
'config-license-none' => 'Aucune licence en bas de page',
'config-license-cc-by-sa' => "Creative Commons attribution partage à l'identique",
'config-license-cc-by' => 'Creative Commons Attribution',
- 'config-license-cc-by-nc-sa' => "Creative Commons attribution non commercial partage à l'identique",
+ 'config-license-cc-by-nc-sa' => 'Creative Commons paternité – non commercial – partage à l’identique',
'config-license-cc-0' => 'Creative Commons Zero (domaine public)',
'config-license-gfdl' => 'GNU Free Documentation License 1.3 ou ultérieure',
'config-license-pd' => 'Domaine public',
@@ -4775,7 +5329,7 @@ Si vous ne voulez pas d'un logo, laissez cette case vide.",
'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.
-Pour plus d'informations sur ce service, y compris les instructions sur la façon de le configurer pour d'autres wikis que Wikimedia Commons, consultez le [http://mediawiki.org/wiki/Manual:\$wgForeignFileRepos manuel] (en anglais).",
+Pour plus d'informations sur ce service, y compris les instructions sur la façon de le configurer pour d'autres wikis que Wikimedia Commons, consultez le [//mediawiki.org/wiki/Manual:\$wgForeignFileRepos manuel] (en anglais).",
'config-cc-error' => "Le sélection d'une licence ''Creative Commons'' n'a donné aucun résultat.
Entrez le nom de la licence manuellement.",
'config-cc-again' => 'Choisissez à nouveau...',
@@ -4785,7 +5339,7 @@ Entrez le nom de la licence manuellement.",
'config-cache-help' => "La mise en cache des objets améliore la vitesse de MediaWiki en mettant en cache les données fréquemment utilisées.
Les sites de taille moyenne à grande sont fortement encouragés à l'activer. Les petits sites y verront également des avantages.",
'config-cache-none' => 'Aucune mise en cache (aucune fonctionnalité supprimée, mais la vitesse peut changer sur les wikis importants)',
- 'config-cache-accel' => 'Mise en cache des objets PHP (APC, eAccelerator, XCache ou WinCache)',
+ 'config-cache-accel' => 'Mise en cache des objets PHP (APC, XCache ou WinCache)',
'config-cache-memcached' => 'Utiliser Memcached (nécessite une installation et une configuration supplémentaires)',
'config-memcached-servers' => 'serveurs pour Memcached :',
'config-memcached-help' => 'Liste des adresses IP à utiliser pour Memcached.
@@ -4914,7 +5468,6 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-memory-raised' => 'Lo paramètre <code>memory_limit</code> de PHP ére a $1, portâ a $2.',
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] est enstalâ',
'config-apc' => '[http://www.php.net/apc APC] est enstalâ',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] est enstalâ',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] est enstalâ',
'config-diff3-bad' => 'GNU diff3 entrovâblo.',
'config-db-type' => 'Tipo de bâsa de balyês :',
@@ -4923,10 +5476,10 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-db-wiki-settings' => 'Identifiar cél vouiqui',
'config-db-name' => 'Nom de la bâsa de balyês :',
'config-db-name-oracle' => 'Plan de bâsa de balyês :',
- 'config-db-install-account' => 'Compto utilisator por l’enstalacion',
- 'config-db-username' => 'Nom d’utilisator de la bâsa de balyês :',
- 'config-db-password' => 'Mot de pâssa de la bâsa de balyês :',
- 'config-db-wiki-account' => 'Compto utilisator por l’opèracion normala',
+ 'config-db-install-account' => 'Compto usanciér por l’enstalacion',
+ 'config-db-username' => 'Nom d’usanciér de la bâsa de balyês :',
+ 'config-db-password' => 'Contresegno de la bâsa de balyês :',
+ 'config-db-wiki-account' => 'Compto usanciér por l’opèracion normala',
'config-db-prefix' => 'Prèfixo de les trâbles de la bâsa de balyês :',
'config-db-charset' => 'Juè de caractèros de la bâsa de balyês',
'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binèro',
@@ -4969,16 +5522,16 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-ns-other-default' => 'MonVouiqui',
'config-admin-box' => 'Compto administrator',
'config-admin-name' => 'Voutron nom :',
- 'config-admin-password' => 'Mot de pâssa :',
- 'config-admin-password-confirm' => 'Tornar buchiér lo mot de pâssa :',
+ 'config-admin-password' => 'Contresegno :',
+ 'config-admin-password-confirm' => 'Tornar buchiér lo contresegno :',
'config-admin-name-blank' => 'Buchiéd un nom d’administrator.',
- 'config-admin-password-blank' => 'Buchiéd un mot de pâssa por lo compto administrator.',
+ 'config-admin-password-blank' => 'Buchiéd un contresegno por lo compto administrator.',
'config-admin-email' => 'Adrèce èlèctronica :',
'config-optional-continue' => 'Mè posar més de quèstions.',
- 'config-profile' => 'Profil des drêts d’utilisator :',
+ 'config-profile' => 'Profil des drêts d’usanciér :',
'config-profile-wiki' => 'Vouiqui tradicionâl',
'config-profile-no-anon' => 'Crèacion de compto nècèssèra',
- 'config-profile-fishbowl' => 'Ren que los èditors ôtorisâs',
+ 'config-profile-fishbowl' => 'Solament los èditors ôtorisâs',
'config-profile-private' => 'Vouiqui privâ',
'config-license' => 'Drêts d’ôtor et licence :',
'config-license-none' => 'Gins de licence d’avâl la pâge',
@@ -4986,13 +5539,13 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-license-cc-by' => 'Creative Commons patèrnitât',
'config-license-cc-by-nc-sa' => 'Creative Commons patèrnitât pas comèrciâla - partâjo a l’identico',
'config-license-cc-0' => 'Creative Commons Zero (domêno publico)',
- 'config-license-gfdl' => 'Licence de documentacion abada GNU 1.3 ou ben ples novèla',
+ 'config-license-gfdl' => 'Licence de documentacion libra GNU 1.3 ou ben ples novèla',
'config-license-pd' => 'Domêno publico',
'config-license-cc-choose' => 'Chouèsir una licence Creative Commons pèrsonalisâ',
'config-email-settings' => 'Paramètres de mèssageria èlèctronica',
'config-enable-email' => 'Activar los mèssâjos que sôrtont',
- 'config-email-user' => 'Activar los mèssâjos d’utilisator a utilisator',
- 'config-email-usertalk' => 'Activar la notificacion de les pâges de discussion ux utilisators',
+ 'config-email-user' => 'Activar los mèssâjos d’usanciér a usanciér',
+ 'config-email-usertalk' => 'Activar la notificacion de les pâges de discussion ux usanciérs',
'config-email-watchlist' => 'Activar la notificacion de la lista de survelyence',
'config-email-auth' => 'Activar l’ôtenticacion per mèssageria èlèctronica',
'config-email-sender' => 'Adrèce èlèctronica de retôrn :',
@@ -5004,7 +5557,7 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-cc-again' => 'Tornâd chouèsir...',
'config-advanced-settings' => 'Configuracion avanciê',
'config-cache-options' => 'Paramètres por la misa en cache de les chouses :',
- 'config-cache-accel' => 'Misa en cache de les chouses PHP (APC, eAccelerator, XCache ou ben WinCache)',
+ 'config-cache-accel' => 'Misa en cache de les chouses PHP (APC, XCache ou ben WinCache)',
'config-memcached-servers' => 'Sèrvors por memcached :',
'config-extensions' => 'Èxtensions',
'config-install-step-done' => 'fêt',
@@ -5015,10 +5568,10 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-install-pg-schema-not-exist' => 'Lo plan PostgreSQL ègziste pas',
'config-install-pg-commit' => 'Validacion des changements',
'config-install-pg-plpgsql' => 'Contrôlo du lengâjo PL/pgSQL',
- 'config-install-user' => 'Crèacion d’un utilisator de la bâsa de balyês',
- 'config-install-user-alreadyexists' => 'L’utilisator « $1 » ègziste ja',
- 'config-install-user-create-failed' => 'Falyita pendent la crèacion a l’utilisator « $1 » : $2',
- 'config-install-user-grant-failed' => 'Falyita pendent l’aponsa de pèrmissions a l’utilisator « $1 » : $2',
+ 'config-install-user' => 'Crèacion d’un usanciér de la bâsa de balyês',
+ 'config-install-user-alreadyexists' => 'L’usanciér « $1 » ègziste ja',
+ 'config-install-user-create-failed' => 'Falyita pendent la crèacion de l’usanciér « $1 » : $2',
+ 'config-install-user-grant-failed' => 'Falyita pendent l’aponsa de pèrmissions a l’usanciér « $1 » : $2',
'config-install-tables' => 'Crèacion de les trâbles',
'config-install-interwiki' => 'Remplissâjo per dèfôt de la trâbla des entèrvouiquis',
'config-install-interwiki-list' => 'Empossiblo de trovar lo fichiér <code>interwiki.list</code>.',
@@ -5032,7 +5585,7 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-download-localsettings' => 'Tèlèchargiér LocalSettings.php',
'config-help' => 'éde',
'mainpagetext' => "'''MediaWiki at étâ enstalâ avouéc reusséta.'''",
- 'mainpagedocfooter' => 'Vêde lo [//meta.wikimedia.org/wiki/Aide:Contenu guido d’utilisator] por més d’enformacions sur l’usâjo de la programeria vouiqui.
+ 'mainpagedocfooter' => 'Vêde lo [//meta.wikimedia.org/wiki/Aide:Contenu guido d’usanciér] por més d’enformacions sur l’usâjo de la programeria vouiqui.
== Emmodar avouéc MediaWiki ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista des paramètres de configuracion]
@@ -5204,7 +5757,7 @@ Debería recibir <doclink href=Copying>unha copia da licenza pública xeral GNU<
* <doclink href=Readme>Léame</doclink>
* <doclink href=ReleaseNotes>Notas de lanzamento</doclink>
* <doclink href=Copying>Copia</doclink>
-* <doclink href=UpgradeDoc>Actualización</doclink>',
+* <doclink href=UpgradeDoc>Actualizacións</doclink>',
'config-env-good' => 'Rematou a comprobación da contorna.
Pode instalar MediaWiki.',
'config-env-bad' => 'Rematou a comprobación da contorna.
@@ -5224,6 +5777,7 @@ Os tipos de base de datos admitidos son os seguintes: $1.
Se está nun aloxamento compartido, pregunte ao seu provedor de hospedaxe para instalar un controlador de base de datos axeitado.
Se compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando <code>./configure --with-mysql</code>.
Se instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar o módulo php5-mysql.',
+ 'config-outdated-sqlite' => "'''Atención:''' Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.",
'config-no-fts3' => "'''Atención:''' O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.",
'config-register-globals' => "'''Atención: A opción PHP <code>[http://php.net/register_globals register_globals]</code> está activada.'''
'''Desactívea se pode.'''
@@ -5253,11 +5807,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-xcache' => '[http://xcache.lighttpd.net/ XCache] está instalado',
'config-apc' => '[http://www.php.net/apc APC] está instalado',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] está instalado',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
- 'config-no-cache' => "'''Atención:''' Non se puido atopar [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Atención:''' Non se puido atopar [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].
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.",
@@ -5282,7 +5836,7 @@ Instalación abortada.',
'config-using531' => 'O PHP $1 non é compatible con MediaWiki debido a un erro que afecta aos parámetros de referencia de <code>__call()</code>.
Actualice o sistema á versión 5.3.2 ou posterior do PHP ou volva á versión 5.3.0 do PHP para arranxar o problema.
Instalación abortada.',
- 'config-suhosin-max-value-length' => 'Suhosin está instalado e limita a lonxitude do parámetro GET a $1 bytes. O compoñente ResourceLoader (Cargador de recursos) de MediaWiki traballa neste límite, pero este prexudica o rendemento. Se é posible, debería establecer suhosin.get.max_value_length no valor 1024 ou superior en php.ini e establecer $wgResourceLoaderMaxQueryLength no mesmo valor en LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin está instalado e limita a lonxitude do parámetro GET a $1 bytes. O compoñente ResourceLoader (xestor de recursos) de MediaWiki traballa neste límite, pero este prexudica o rendemento. Se é posible, debería establecer suhosin.get.max_value_length no valor 1024 ou superior en php.ini e establecer $wgResourceLoaderMaxQueryLength no mesmo valor en LocalSettings.php.',
'config-db-type' => 'Tipo de base de datos:',
'config-db-host' => 'Servidor da base de datos:',
'config-db-host-help' => 'Se o servidor da súa base de datos está nun servidor diferente, escriba o nome do servidor ou o enderezo IP aquí.
@@ -5578,7 +6132,7 @@ Se non quere un logo, deixe esta caixa en branco.',
'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].
Para facer isto, MediaWiki necesita acceso á internet.
-Para obter máis información sobre esta característica, incluíndo as instrucións sobre como configuralo para outros wikis que non sexan a Wikimedia Commons, consulte [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos o manual].',
+Para obter máis información sobre esta característica, incluíndo as instrucións sobre como configuralo para outros wikis que non sexan a Wikimedia Commons, consulte [//mediawiki.org/wiki/Manual:$wgForeignFileRepos o manual].',
'config-cc-error' => 'A escolla da licenza Creative Commons non deu resultados.
Escriba o nome da licenza manualmente.',
'config-cc-again' => 'Escolla outra vez...',
@@ -5588,7 +6142,7 @@ Escriba o nome da licenza manualmente.',
'config-cache-help' => 'A caché de obxectos emprégase para mellorar a velocidade de MediaWiki mediante a memorización de datos usados con frecuencia.
É amplamente recomendable a súa activación nos sitios de tamaño medio e grande; os sitios pequenos obterán tamén beneficios.',
'config-cache-none' => 'Sen caché (non se elimina ningunha funcionalidade, pero pode afectar á velocidade en wikis grandes)',
- 'config-cache-accel' => 'Caché de obxectos do PHP (APC, eAccelerator, XCache ou WinCache)',
+ 'config-cache-accel' => 'Caché de obxectos do PHP (APC, XCache ou WinCache)',
'config-cache-memcached' => 'Empregar o Memcached (necesita unha instalación e configuración adicional)',
'config-memcached-servers' => 'Servidores da memoria caché:',
'config-memcached-help' => 'Lista de enderezos IP para Memcached.
@@ -5787,9 +6341,8 @@ Dää Wärt isch wahrschyns z nider.
Dr Inschtallationsvorgang chennt wäge däm fählschlaa!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] isch inschtalliert',
'config-apc' => '[http://www.php.net/apc APC] isch inschtalliert',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] isch inschtalliert',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] isch inschtalliert',
- 'config-no-cache' => "'''Warnig:''' [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] hän nit chenne gfunde wäre.
+ 'config-no-cache' => "'''Warnig:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] hän nit chenne gfunde wäre.
S Objäktcaching isch wäge däm nit aktiviert.",
'config-diff3-bad' => 'GNU diff3 isch nit gfunde wore.',
'config-imagemagick' => 'ImageMagick isch gfunde wore: <code>$1</code>.
@@ -5837,6 +6390,7 @@ $messages['haw'] = array(
/** Hebrew (עברית)
* @author Amire80
* @author YaronSh
+ * @author ערן
*/
$messages['he'] = array(
'config-desc' => 'תכנית ההתקנה של מדיה־ויקי',
@@ -5929,6 +6483,7 @@ $1
×× ××ª× ×ž×©×ª×ž×©×™× ×‘×ירוח משותף, בקשו מספק ×”×ירוח ×©×œ×›× ×œ×”×ª×§×™×Ÿ דרייבר מסד × ×ª×•× ×™× ×ž×ª××™×.
×× ×§Ö´×ž×¤×œ×ª× ×ת PHP בעצמכ×, הגדירו ×ותו מחדש והפעילו ×ת לקוח מסד נתוני×, למשל ב×מצעות <code dir="ltr">./configure --with-mysql</code>.
×× ×”×ª×§× ×ª× ×ת PHP כחבילה של דבי×ן ×ו של ×ובונטו, יש להתקין ×ת המודול php5-mysql.',
+ 'config-outdated-sqlite' => "'''×זהרה''': במערכת מתוקן SQLite $1. גרסה זו ×œ× × ×ª×ž×›×ª ולשימוש ב SQLite נדרשת גרסה $2 ומעלה. מסיבה זו ×”×פשרות SQLite ×œ× ×ž×ופשרת.",
'config-no-fts3' => "'''×זהרה''': SQLite מקומפל ×œ×œ× [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש ×œ× ×™×”×™×• זמינות בהתקנה ×”×–×ת.",
'config-register-globals' => "'''×זהרה: ×”×פשרות <code>[http://php.net/register_globals register_globals]</code> של PHP מופעלת.'''
'''כבו ×ותה ×× ××ª× ×™×›×•×œ×™×.'''
@@ -5958,11 +6513,11 @@ $1
'config-memory-bad' => "'''×זהרה:''' ערך ×”×פשרות <code>memory_limit</code> של PHP ×”×•× $1.
×–×” כנר××” נמוך מדי.
ההתקנה עשויה להיכשל!",
+ 'config-ctype' => "'''שגי××” סופנית''': נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] מותקן',
'config-apc' => '[http://www.php.net/apc APC] מותקן',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] מותקן',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] מותקן',
- 'config-no-cache' => "'''×זהרה:''' ×חת מהתוכנות הב×ות ×œ× × ×ž×¦××”: [http://eaccelerator.sourceforge.net eAccelerator]&rlm;, [http://www.php.net/apc APC]&rlm;, [http://xcache.lighttpd.net/ XCache] ×ו [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''×זהרה:''' ×חת מהתוכנות הב×ות ×œ× × ×ž×¦××”: [http://www.php.net/apc APC]&rlm;, [http://xcache.lighttpd.net/ XCache] ×ו [http://www.iis.net/download/WinCacheForPhp WinCache].
מטמון ×¢×¦×ž×™× ×œ× ×ž×•×¤×¢×œ.",
'config-mod-security' => "'''×זהרה''': בשרת הווב ×©×œ×›× ×ž×•×¤×¢×œ [http://modsecurity.org/ mod_security]. ×× ×”×•× ×œ× ×ž×•×’×“×¨ טוב, ×–×” יכול ×œ×’×¨×•× ×œ×‘×¢×™×•×ª במדיה־ויקי ובתכנה ×חרת שמ×פשרת ×œ×ž×©×ª×ž×©×™× ×œ×©×œ×•×— תוכן שרירותי.
קר×ו ×ת [http://modsecurity.org/documentation/ התיעוד של mod_security] ×ו צרו קשר ×¢× ×נשי התמיכה של שירותי ×”×ירוח ×©×œ×›× ×× ××ª× × ×ª×§×œ×™× ×‘×©×’×™×ות ×קר×יות.",
@@ -6279,7 +6834,7 @@ chmod a+w $3</pre></div>',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] ×”×™× ×ª×›×•× ×” שמ×פשרת ל×תרי ויקי להשתמש בתמונות, ×‘×¦×œ×™×œ×™× ×•×‘×ž×“×™×” ×חרת שנמצ×ת ב×תר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).
כדי לעשות ×ת ×–×”, מדיה־ויקי צריך לגשת ל×ינטרנט.
-למידע נוסף על התכונה ×”×–×ת, כולל הור×ות ×יך להפעיל ×ת ×–×” ל×תרי ויקי ש××™× × ×•×™×§×™×©×™×ª×•×£, ר׳ [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos ×ת ספר ההדרכה].',
+למידע נוסף על התכונה ×”×–×ת, כולל הור×ות ×יך להפעיל ×ת ×–×” ל×תרי ויקי ש××™× × ×•×™×§×™×©×™×ª×•×£, ר׳ [//mediawiki.org/wiki/Manual:$wgForeignFileRepos ×ת ספר ההדרכה].',
'config-cc-error' => 'בורר רישיונות קרי×ייטיב קומונז ×œ× ×”×—×–×™×¨ ×©×•× ×ª×•×¦××”.
הקלידו ×ת ×©× ×”×¨×™×©×™×•×Ÿ ידנית.',
'config-cc-again' => '× × ×œ×‘×—×•×¨ שוב...',
@@ -6289,7 +6844,7 @@ chmod a+w $3</pre></div>',
'config-cache-help' => 'מטמון ×¢×¦×ž×™× ×ž×©×ž×© לשיפור המהירות של מדיה־ויקי על־ידי שמירה של × ×ª×•× ×™× ×©×”×©×™×ž×•×© ×‘×”× × ×¤×•×¥ במטמון.
ל××ª×¨×™× ×‘×™× ×•× ×™×™× ×•×’×“×•×œ×™× ×›×“××™ מ×וד להפעיל ×ת ×–×”, ×•×’× ××ª×¨×™× ×§×˜× ×™× ×™×™×”× ×• מזה.',
'config-cache-none' => '×œ×œ× ×ž×˜×ž×•×Ÿ (×©×•× ×™×›×•×œ×ª ××™× ×” מוסרת, ×בל ×”×‘×™×¦×•×¢×™× ×‘××ª×¨×™× ×’×“×•×œ×™× ×™×™×¤×’×¢×•)',
- 'config-cache-accel' => 'מטמון ×¢×¦×ž×™× (object caching) של PHP&rlm; (APC&rlm;, eAccelerator&rlm;, XCache ×ו WinCache)',
+ 'config-cache-accel' => 'מטמון ×¢×¦×ž×™× (object caching) של PHP&rlm; (APC&rlm;, XCache ×ו WinCache)',
'config-cache-memcached' => 'להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)',
'config-memcached-servers' => 'שרתי Memcached:',
'config-memcached-help' => 'רשימת כתובות IP ש־Memcached ישתמש בהן.
@@ -6515,7 +7070,6 @@ To je najskerje přeniske.
Instalacija móhła so njeporadźić!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] je instalowany',
'config-apc' => '[http://www.php.net/apc APC] je instalowany',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] je instalowany',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] je instalowany',
'config-diff3-bad' => 'GNU diff3 njenamakany.',
'config-no-uri' => "'''Zmylk:''' Aktualny URI njeda so postajić.
@@ -6548,6 +7102,7 @@ To njeje hesło konta MediaWiki; to je hesło za twoju datowu banku.',
'config-db-schema' => 'Å ema za MediaWiki',
'config-db-schema-help' => 'Tuta šema da so zwjetša derje wužiwać.
Změń ju jenož, jeli su pÅ™eswÄ›dÄiwe pÅ™iÄiny za to.',
+ 'config-pg-test-error' => "Zwisk z datowej banku '''$1''' móžno njeje: $2",
'config-sqlite-dir' => 'Zapis SQLite-datow:',
'config-oracle-def-ts' => 'Standardny tabelowy rum:',
'config-oracle-temp-ts' => 'Nachwilny tabelowy rum:',
@@ -6555,12 +7110,15 @@ Změń ju jenož, jeli su pÅ™eswÄ›dÄiwe pÅ™iÄiny za to.',
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
+ 'config-type-ibm_db2' => 'IBM DB2',
'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju PHP z MySQL-podpěru])',
'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórÅ‚a jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpÄ›ru PostgreSQL]). MóhÅ‚o hišće nÄ›kotre zmylki eksistować, a njeporuÄa so jón w produktiwnej wokolinje wužiwać.',
+ 'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka.',
'config-header-mysql' => 'Nastajenja MySQL',
'config-header-postgres' => 'Nastajenja PostgreSQL',
'config-header-sqlite' => 'Nastajenja SQLite',
'config-header-oracle' => 'Nastajenja Oracle',
+ 'config-header-ibm_db2' => 'Nastajenja IBM DB2',
'config-invalid-db-type' => 'Njepłaćiwy typ datoweje banki',
'config-missing-db-name' => 'Dyrbiš hódnotu za "Mjeno datoweje banki" zapodać',
'config-missing-db-host' => 'Dyrbiš hódnotu za "Database host" zapodać',
@@ -6654,8 +7212,10 @@ MóžeÅ¡ nÄ›tko zbytnu konfiguraciju pÅ™eskoÄić a wiki hnydom instalować.',
'config-license' => 'Awtorske prawo a licenca:',
'config-license-none' => 'Žane licencne podaća w nohowej lince',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by' => 'Creative Commons Attribution',
'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
'config-license-cc-0' => 'Creative Commons Zero (zjawnosći přistupny)',
+ 'config-license-gfdl' => 'GNU-licenca za swobodnu dokumentaciju 1.3 abo nowša',
'config-license-pd' => 'Powšitkownosći přistupny',
'config-license-cc-choose' => 'Swójsku licencu Creative Commons wubrać',
'config-email-settings' => 'E-mejlowe nastajenja',
@@ -6684,7 +7244,7 @@ Zapodaj licencne mjeno manuelnje.',
'config-advanced-settings' => 'Rozšěrjena konfiguraćija',
'config-cache-options' => 'Nastajenja za objektowe pufrowanje:',
'config-cache-none' => 'Žane pufrowanje (žana funkcionalnosć so njewotstronja, ale spěšnosć móže so na wjetšich wikijowych sydłach wobwliwować)',
- 'config-cache-accel' => 'Objektowe pufrowanje PHP (APC, eAccelerator, XCache abo WinCache)',
+ 'config-cache-accel' => 'Objektowe pufrowanje PHP (APC, XCache abo WinCache)',
'config-cache-memcached' => 'Memcached wužiwać (wužaduje sej přidatnu instalaciju a konfiguraciju)',
'config-memcached-servers' => 'Serwery memcached:',
'config-memcached-help' => 'Lisćina IP-adresow, kotrež maja so za Memcached wužiwać.
@@ -6708,6 +7268,7 @@ Jeli hišće chceš něšto změnić, klikń na "Wróćo".',
'config-install-step-failed' => 'njeporadźiło',
'config-install-extensions' => 'Inkluziwnje rozšěrjenja',
'config-install-database' => 'Datowa banka so připrawja',
+ 'config-install-schema' => 'Datowa Å¡ema so twori',
'config-install-pg-schema-not-exist' => 'Å ema PostgreSQL njeeksistuje',
'config-install-pg-schema-failed' => 'Wutworjenje tabelow je so njeporadźiło.
Zawěsć, zo wužiwar "$1" móže do šemy "$2" pisać.',
@@ -6719,6 +7280,9 @@ Zawěsć, zo wužiwar "$1" móže do šemy "$2" pisać.',
'config-install-user-alreadyexists' => 'Wužiwar "$1" hižo eksistuje',
'config-install-user-create-failed' => 'Wutworjenje wužiwarja "$1" je so njeporadźiło: $2',
'config-install-user-grant-failed' => 'Prawo njeda so wužiwarjej "$1" dać: $2',
+ 'config-install-user-missing' => 'Podaty wužiwar "$1" njeeksistuje.',
+ 'config-install-user-missing-create' => 'Podaty wužiwar "$1" njeeksistuje.
+Prošu klikń na slědowacy kontrolny kašćik "konto załožić", jeli chceš jo wutworić.',
'config-install-tables' => 'Tworjenje tabelow',
'config-install-tables-exist' => "'''Warnowanje''': Zda so, zo tabele MediaWiki hižo eksistuja.
Wutworjenje so přeskakuje.",
@@ -6731,6 +7295,7 @@ Standardna lisćina sp přeskakuje.",
'config-install-keys' => 'Tajne kluÄe so tworja',
'config-install-sysop' => 'Tworjenje administratoroweho wužiwarskeho konta',
'config-install-subscribe-fail' => 'Abonowanje "mediawiki-announce" njemóžno: $1',
+ 'config-install-subscribe-notpossible' => 'cURL njeje instalowany a allow_url_fopen k dispoziciji njesteji.',
'config-install-mainpage' => 'HÅ‚owna strona so ze standardnym wobsahom wutworja',
'config-install-extension-tables' => 'Tabele za zmóžnjene rozšěrjenja so tworja',
'config-install-mainpage-failed' => 'Powěsć njeda so zasunyć: $1',
@@ -6884,9 +7449,8 @@ A MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.",
Ez az érték valószínűleg túl kevés, a telepítés sikertelen lehet.",
'config-xcache' => 'Az [http://xcache.lighttpd.net/ XCache] telepítve van',
'config-apc' => 'Az [http://www.php.net/apc APC] telepítve van',
- 'config-eaccel' => 'Az [http://eaccelerator.sourceforge.net/ eAccelerator] telepítve van',
'config-wincache' => 'A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van',
- 'config-no-cache' => "'''Figyelmeztetés:''' Nem található [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] és [http://www.iis.net/download/WinCacheForPhp WinCache] sem.
+ 'config-no-cache' => "'''Figyelmeztetés:''' Nem található [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] és [http://www.iis.net/download/WinCacheForPhp WinCache] sem.
Objektum-gyorsítótárazás nem lesz engedélyezve.",
'config-diff3-bad' => 'GNU diff3 nem található.',
'config-imagemagick' => 'Az ImageMagick megtalálható a rendszeren: <code>$1</code>.
@@ -7193,7 +7757,7 @@ Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.',
'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.
-A funkcióról és hogy hogyan állítható be más wikik esetén [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhatsz további információkat.',
+A funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhatsz további információkat.',
'config-cc-error' => 'A Creative Commons-licencválasztó nem tért vissza eredménnyel.
Add meg kézzel a licencet.',
'config-cc-again' => 'Válassz újra…',
@@ -7203,7 +7767,7 @@ Add meg kézzel a licencet.',
'config-cache-help' => 'Az objektumgyorsítótárazás célja, hogy felgyorsítsa a MediaWiki működését a gyakran használt adatok gyorsítótárazásával.
Közepes vagy nagyobb oldalak esetén erősen ajánlott a használata, de kisebb oldalak esetén is hasznos lehet.',
'config-cache-none' => 'Nincs gyorsítótárazás (minden funkció működik, de nagyobb wiki esetében lassabb működést eredményezhet)',
- 'config-cache-accel' => 'PHP-objektumok gyorsítótárazása (APC, eAccelerator, XCache or WinCache)',
+ 'config-cache-accel' => 'PHP-objektumok gyorsítótárazása (APC, XCache or WinCache)',
'config-cache-memcached' => 'Memcached használata (további telepítés és konfigurálás szükséges)',
'config-memcached-servers' => 'Memcached-szerverek:',
'config-memcached-help' => 'Azon IP-címek listája, melyeket a Memcached használhat.
@@ -7391,6 +7955,7 @@ Le sequente typos de base de datos es supportate: $1.
Si tu sito usa un servitor dividite (shared hosting), demanda a tu providitor de installar un driver de base de datos appropriate.
Si tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo usante <code>./configure --with-mysql</code>.
Si tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe installar equalmente le modulo php5-mysql.',
+ 'config-outdated-sqlite' => "'''Attention''': tu ha SQLite $1, que es inferior al version minimal requirite, $2. SQLite essera indisponibile.",
'config-no-fts3' => "'''Attention''': SQLite es compilate sin [//sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.",
'config-register-globals' => "'''Attention: le option <code>[http://php.net/register_globals register_globals]</code> de PHP es activate.'''
'''Disactiva lo si tu pote.'''
@@ -7420,11 +7985,11 @@ MediaWiki require supporto de UTF-8 pro functionar correctemente.",
'config-memory-bad' => "'''Aviso:''' Le <code>memory_limit</code> de PHP es $1.
Isto es probabilemente troppo basse.
Le installation pote faller!",
+ 'config-ctype' => "'''Fatal''': PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] es installate',
'config-apc' => '[http://www.php.net/apc APC] es installate',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] es installate',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] es installate',
- 'config-no-cache' => "'''Aviso:''' Non poteva trovar [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Aviso:''' Non poteva trovar [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
Le cache de objectos non es activate.",
'config-mod-security' => "'''Attention''': [http://modsecurity.org/ mod_security] es active in tu servitor web. Si mal configurate, isto pote causar problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari.
Consulta le [http://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu host si tu incontra estranie errores.",
@@ -7746,7 +8311,7 @@ Si tu non vole un logotypo, lassa iste quadro vacue.',
'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].
Pro poter facer isto, MediaWiki require accesso a Internet.
-Pro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos le manual].',
+Pro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [//mediawiki.org/wiki/Manual:$wgForeignFileRepos le manual].',
'config-cc-error' => 'Le selector de licentia Creative Commons non dava un resultato.
Entra le nomine del licentia manualmente.',
'config-cc-again' => 'Selige de novo…',
@@ -7756,7 +8321,7 @@ Entra le nomine del licentia manualmente.',
'config-cache-help' => 'Le cache de objectos es usate pro meliorar le rapiditate de MediaWiki per immagazinar le datos frequentemente usate.
Le sitos medie o grande es multo incoragiate de activar isto, ma anque le sitos parve percipera le beneficios.',
'config-cache-none' => 'Nulle cache (nulle functionalitate es removite, ma le rapiditate pote diminuer in grande sitos wiki)',
- 'config-cache-accel' => 'Cache de objectos de PHP (APC, eAccelerator, XCache o WinCache)',
+ 'config-cache-accel' => 'Cache de objectos de PHP (APC, XCache o WinCache)',
'config-cache-memcached' => 'Usar Memcached (require additional installation e configuration)',
'config-memcached-servers' => 'Servitores Memcached:',
'config-memcached-help' => 'Lista de adresses IP a usar pro Memcached.
@@ -7971,9 +8536,8 @@ Ini terlalu rendah.
Instalasi terancam gagal!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] telah diinstal',
'config-apc' => '[http://www.php.net/apc APC] telah diinstal',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] telah diinstal',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal',
- 'config-no-cache' => "'''Peringatan:''' Tidak dapat menemukan [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], atau [http://www.iis.net/download/WinCacheForPhp WinCache]. Pinggahan obyek tidak dinonaktifkan.",
+ 'config-no-cache' => "'''Peringatan:''' Tidak dapat menemukan [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], atau [http://www.iis.net/download/WinCacheForPhp WinCache]. Pinggahan obyek tidak dinonaktifkan.",
'config-diff3-bad' => 'GNU diff3 tidak ditemukan.',
'config-imagemagick' => 'ImageMagick ditemukan: <code>$1</code> .
Pembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.',
@@ -8274,7 +8838,7 @@ Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.',
'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.
-Untuk informasi lebih lanjut tentang fitur ini, termasuk petunjuk tentang cara untuk mengatur untuk wiki selain Wikimedia Commons, baca [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos manual].',
+Untuk informasi lebih lanjut tentang fitur ini, termasuk petunjuk tentang cara untuk mengatur untuk wiki selain Wikimedia Commons, baca [//mediawiki.org/wiki/Manual:$wgForeignFileRepos manual].',
'config-cc-error' => 'Pemilih lisensi Creative Commons tidak memberikan hasil.
Masukkan nama lisensi secara manual.',
'config-cc-again' => 'Pilih lagi...',
@@ -8284,7 +8848,7 @@ Masukkan nama lisensi secara manual.',
'config-cache-help' => 'Penyinggahan objek digunakan untuk meningkatkan kecepatan MediaWiki dengan menyinggahkan data yang sering digunakan.
Situs berukuran sedang hingga besar sangat dianjurkan untuk mengaktifkan fitur ini, dan situs kecil juga akan merasakan manfaatnya.',
'config-cache-none' => 'Tidak ada penyinggahan (tidak ada fungsi yang dibuang, tetapi kecepatan dapat terpengaruh pada situs wiki yang besar)',
- 'config-cache-accel' => 'Penyinggahan objek PHP (APC, eAccelerator, XCache atau WinCache)',
+ 'config-cache-accel' => 'Penyinggahan objek PHP (APC, XCache atau WinCache)',
'config-cache-memcached' => 'Gunakan Memcached (memerlukan setup dan konfigurasi tambahan)',
'config-memcached-servers' => 'Server Memcached:',
'config-memcached-help' => 'Daftar alamat IP yang digunakan untuk Memcached.
@@ -8661,9 +9225,8 @@ MediaWikiã«ã¯UTF-8サãƒãƒ¼ãƒˆã®é–¢æ•°ãŒå¿…è¦ã§ã™ã€‚",
インストールãŒå¤±æ•—ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ï¼",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
'config-apc' => '[http://www.php.net/apc APC]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿',
- 'config-no-cache' => "'''警告:'''[http://eaccelerator.sourceforge.net eAccelerator]ã€[http://www.php.net/apc APC]ã€[http://xcache.lighttpd.net/ XCache]ã‚ã‚‹ã„ã¯[http://www.iis.net/download/WinCacheForPhp WinCache]ã®ã„ãšã‚Œã‚‚見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ '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-imagemagick' => 'ImageMagickãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼š<code>$1</code>。
@@ -8854,8 +9417,9 @@ chmod a+w $3</pre>',
'config-ns-site-name' => 'ウィキåã¨åŒã˜ï¼š$1',
'config-ns-other' => 'ãã®ä»–(指定ã—ã¦ãã ã•ã„)',
'config-ns-other-default' => 'マイウィキ',
- 'config-project-namespace-help' => "ウィキペディアã®ä¾‹ã«å¾“ãˆã°ã€å¤šãã®ã‚¦ã‚£ã‚­ã¯ã€Œ'''プロジェクトã®åå‰ç©ºé–“'''ã€ã«ãŠã„ã¦ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ãƒšãƒ¼ã‚¸ã¨ã¯åˆ†é›¢ã—ãŸç‹¬è‡ªã®ãƒãƒªã‚·ãƒ¼ãƒšãƒ¼ã‚¸ã‚’æŒã¤ã€‚
-ä¼çµ±çš„ã«ã¯ã“ã®æŽ¥é ­è¾žã¯ã‚¦ã‚£ã‚­ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ´¾ç”Ÿã•ã‚Œã‚‹ã€‚ã—ã‹ã—ã€\"#\" ã‚„ \":\"ã®ã‚ˆã†ãªå¥åˆ‡ã‚Šè¨˜å·ã¯å«ã‚“ã§ã„ãªã„。",
+ 'config-project-namespace-help' => "ウィキペディアã®ä¾‹ã«å¾“ã„ã€å¤šãã®ã‚¦ã‚£ã‚­ã¯ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ãƒšãƒ¼ã‚¸ã¨ã¯åˆ†é›¢ã—ãŸãƒãƒªã‚·ãƒ¼ãƒšãƒ¼ã‚¸ã‚’「'''プロジェクトã®åå‰ç©ºé–“'''ã€ã«æŒã£ã¦ã„ã¾ã™ã€‚
+ã“ã®åå‰ç©ºé–“ã®ãƒšãƒ¼ã‚¸ã®ã‚¿ã‚¤ãƒˆãƒ«ã¯ã™ã¹ã¦ã€ã‚る接頭辞ã§å§‹ã¾ã‚Šã¾ã™ã€‚ãれをã“ã“ã§æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ã“ã®æŽ¥é ­è¾žã¯ã‚¦ã‚£ã‚­ã®åå‰ã«ç”±æ¥ã™ã‚‹ã®ãŒä¼çµ±çš„ã§ã™ãŒã€ã€Œ#ã€ã‚„「:ã€ã®ã‚ˆã†ãªåŒºåˆ‡ã‚Šè¨˜å·ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
'config-ns-invalid' => '"<nowiki>$1</nowiki>"ã®ã‚ˆã†ã«æŒ‡å®šã•ã‚ŒãŸåå‰ç©ºé–“ã¯ç„¡åŠ¹ã§ã™ã€‚
é•ã†ãƒ—ロジェクトåå‰ç©ºé–“を指定ã—ã¦ãã ã•ã„。',
'config-admin-box' => '管ç†ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ',
@@ -8942,15 +9506,15 @@ GNUフリー文書利用許諾契約書ã¯ã‚¦ã‚£ã‚­ãƒšãƒ‡ã‚£ã‚¢ãŒæŽ¡ç”¨ã—ã¦ã
'config-upload-deleted-help' => '削除ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。
ã“ã‚ŒãŒã‚¦ã‚§ãƒ–ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã“ã¨ãŒç†æƒ³ã§ã™ã€‚',
'config-logo' => 'ロゴã®URL:',
- 'config-logo-help' => 'メディアウィキã®åˆæœŸã®ã‚¹ã‚­ãƒ³ã¯æœ€ä¸Šéƒ¨å·¦è§’ã«ã‚ã‚‹135x160ピクセルã®ãƒ­ã‚´ã®ãŸã‚ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚
-é©åˆ‡ãªã‚µã‚¤ã‚ºã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’アップロードã—ã€ã“ã“ã«URLを入力ã—ã¦ãã ã•ã„。
+ 'config-logo-help' => 'MediaWikiã®æœªè¨­å®šçŠ¶æ…‹ã®ã‚¹ã‚­ãƒ³ã§ã¯ã€ã‚µã‚¤ãƒ‰ãƒãƒ¼ä¸Šéƒ¨ã«135x160ピクセルã®ãƒ­ã‚´ç”¨ã®ä½™ç™½ãŒã‚ã‚Šã¾ã™ã€‚
+é©åˆ‡ãªã‚µã‚¤ã‚ºã®ç”»åƒã‚’アップロードã—ã€ãã®URLã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
-ã‚‚ã—ã€ãƒ­ã‚´ã‚’望ã¾ãªã„ãªã‚‰ã°ã€ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’空白状態ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。',
+ã‚‚ã—ロゴãŒè¦ã‚‰ãªã„ãªã‚‰ã°ã€ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’空白ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。',
'config-instantcommons' => 'InstantCommons機能を有効ã«ã™ã‚‹',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]ã¯ã€[//commons.wikimedia.org/ ウィキメディア・コモンズ]ã®ã‚µã‚¤ãƒˆã§è¦‹ã¤ã‹ã£ãŸç”»åƒã‚„音声ã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ウィキ上ã§åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹æ©Ÿèƒ½ã§ã™ã€‚
ã“れを有効化ã™ã‚‹ã«ã¯ã€MediaWikiã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã§ããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
-ウィキメディアコモンズ以外ã®ã‚¦ã‚£ã‚­ã‚’åŒã˜ã‚ˆã†ã«è¨­å®šã™ã‚‹æ–¹æ³•ãªã©ã€ã“ã®æ©Ÿèƒ½ã«é–¢ã™ã‚‹è©³ç´°ãªæƒ…å ±ã¯ã€[http://mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]ã‚’ã”覧ãã ã•ã„。',
+ウィキメディアコモンズ以外ã®ã‚¦ã‚£ã‚­ã‚’åŒã˜ã‚ˆã†ã«è¨­å®šã™ã‚‹æ–¹æ³•ãªã©ã€ã“ã®æ©Ÿèƒ½ã«é–¢ã™ã‚‹è©³ç´°ãªæƒ…å ±ã¯ã€[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]ã‚’ã”覧ãã ã•ã„。',
'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスã®é¸æŠžå™¨ã‹ã‚‰çµæžœãŒå¾—られã¾ã›ã‚“ã§ã—ãŸã€‚
ライセンスã®åå‰ã‚’手動ã§å…¥åŠ›ã—ã¦ãã ã•ã„。',
'config-cc-again' => 'ã‚‚ã†ä¸€åº¦é¸æŠžã—ã¦ãã ã•ã„...',
@@ -8960,7 +9524,7 @@ GNUフリー文書利用許諾契約書ã¯ã‚¦ã‚£ã‚­ãƒšãƒ‡ã‚£ã‚¢ãŒæŽ¡ç”¨ã—ã¦ã
'config-cache-help' => 'オブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯ã€ä½¿ç”¨ã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’é »ç¹ã«ã‚­ãƒ£ãƒƒã‚·ãƒ³ã‚°ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã€ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¦ã‚£ã‚­ã®ã‚¹ãƒ”ード改善ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚
中〜大サイトã«ãŠã„ã¦ã¯ã€ã“れを有効ã«ã™ã‚‹ãŸã‚ã«å¤§å¤‰æœ›ã¾ã—ã„ã“ã¨ã§ã™ã€‚ã¾ãŸå°ã•ãªã‚µã‚¤ãƒˆã«ãŠã„ã¦ã‚‚åŒæ§˜ãªåˆ©ç‚¹ã‚’ã‚‚ãŸã‚‰ã™ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚',
'config-cache-none' => 'キャッシングã—ãªã„(機能ã¯å–り払ã‚ã‚Œã¾ã™ã€ã—ã‹ã‚‚より大ããªã‚¦ã‚£ã‚­ã‚µã‚¤ãƒˆä¸Šã§ã‚¹ãƒ”ードã®å•é¡ŒãŒç™ºç”Ÿã—ã¾ã™)',
- 'config-cache-accel' => 'PHPオブジェクトキャッシング(APCã€eAcceleratorã€XCacheã‚ã‚‹ã„ã¯WinCache)',
+ 'config-cache-accel' => 'PHPオブジェクトキャッシング(APCã€XCacheã‚ã‚‹ã„ã¯WinCache)',
'config-cache-memcached' => 'Memcachedを使用(追加ã®è¨­å®šãŒå¿…è¦ã§ã™ï¼‰',
'config-memcached-servers' => 'メモリをキャッシュã•ã‚ŒãŸã‚µãƒ¼ãƒ:',
'config-memcached-help' => 'Memcachedを使用ã™ã‚‹IPアドレスã®ä¸€è¦§ã€‚
@@ -9211,6 +9775,7 @@ $messages['krc'] = array(
);
/** Colognian (Ripoarisch)
+ * @author Mormegil
* @author Purodha
*/
$messages['ksh'] = array(
@@ -9341,16 +9906,13 @@ MediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
'config-memory-bad' => "'''Opjepaß:''' Dem PHP singe Parameeter <code lang=\"en\">memory_limit</code> es \$1.
Dat es wall ze winnisch.
Et Enreeschte kunnt doh draan kappott jon!",
+ 'config-ctype' => "'''Fähler:''' <i lang=\"en\">PHP</i> moß met dä Ongerschtözong för der [http://www.php.net/manual/en/ctype.installation.php <code lang=\"en\">Ctype</code> Zohsaz] övversaz woode sin.",
'config-xcache' => 'Dä <code lang="en">[http://xcache.lighttpd.net/ XCache]</code> es ennjeresht.',
'config-apc' => 'Dä <code lang="en">[http://www.php.net/apc APC]</code> es ennjeresht.',
- 'config-eaccel' => 'Dä <code lang="en">[http://eaccelerator.sourceforge.net/ eAccelerator]</code> es ennjeresht.',
'config-wincache' => 'Dä <code lang="en">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> es ennjeresht.',
- 'config-no-cache' => '\'\'\'Opjepaß:\'\'\' Mer kunnte dä <code lang="en">[http://eaccelerator.sourceforge.net eAccelerator]</code>, dä <code lang="en">[http://www.php.net/apc APC]</code>, dä <code lang="en">[http://xcache.lighttpd.net/ XCache]</code> un dä <code lang="en">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> nit fenge.
+ 'config-no-cache' => '\'\'\'Opjepaß:\'\'\' Mer kunnte dä <code lang="en">[http://www.php.net/apc APC]</code>, dä <code lang="en">[http://xcache.lighttpd.net/ XCache]</code> un dä <code lang="en">[http://www.iis.net/download/WinCacheForPhp WinCache]</code> nit fenge.
Et <i lang="en">object caching</i> es nit müjjelesh un ußjeschalldt.',
- 'config-mod-security' => "'''Opjepaß''': Dinge Webßööver hät <code lang=\"en\">[http://modsecurity.org/ mod_security]</code> enjeschalldt. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
-Refer to <code lang=\"en\">[http://modsecurity.org/documentation/ mod_security documentation]</code> udder contact your host's support if you encounter zohfälleje Fähler.
-
-",
+ '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-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ß.',
@@ -9374,7 +9936,7 @@ 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"ResouceLoader</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.',
'config-db-type' => 'De Zoot Daatebangk:',
'config-db-host' => 'Dä Name vun däm Rääschner met dä Daatebangk:',
- 'config-db-host-help' => 'Wann Dinge ẞööver för de Daatebangk ob enem andere Rääschner es, donn heh dämm singe Name udder <i lang="en">IP</i>-Addräß enjävve.
+ '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.
Wann De ob enem Meetẞööver beß, weet Der Dinge Provaider odder däm sing Dokemäntazjuhn saare, wat De endraare moß.
@@ -9538,14 +10100,13 @@ Dä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!',
'config-mysql-engine' => 'De Zoot udder et Fommaat vun de Tabälle:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-myisam-dep' => '\'\'\'Opjepaß:\'\'\' <i lang="en">MyISAM</i> es als Speicher för <i lang="en">MySQL</i> nit joot för et Zosammeschpell met MediaWiki nit zo ämfähle:
-* sie unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen
+ 'config-mysql-myisam-dep' => '\'\'\'Opjepaß:\'\'\' <i lang="en">MyISAM</i> es als Speicher för <i lang="en">MySQL</i> nit besönders joot för et Zosammeschpell met MediaWiki zo bruche:
+* Dorj_et kumplätte Sperre vun Tabälle, künne koum ens Saache parrallel en dä Daatebangk jedonn wääde.
* Dat Fomaat es anfällesch för Probleme met de Daate.
-* Et weed vun MediaWiki nit immer passend ongerschtöz.
+* Et weed vun MediaWiki nit ėmmer zopaß ongerschtöz.
-Wann Ding <i lang="en">MySQL</i> et schpeischere en <i lang="en">InnoDB</i>-Datteije nit ongerschtöz, wird deren Verwendung eindringlich empfohlen.
-Sofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden op dämm ẞööver.
-',
+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-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.
@@ -9623,6 +10184,7 @@ Noch ander un un opwändijere Enshtellunge för de Rääschte sin müjjelesch, w
'config-license' => 'Urhävverrääsch un Lizänz:',
'config-license-none' => 'Kein Fooßreih övver de Lizänz',
'config-license-cc-by-sa' => '<i lang="en">Creative Commons</i> Der Name moß jenannt sin, et Wiggerjävve es zohjelohße onger dersellve Bedengunge',
+ 'config-license-cc-by' => 'De <i lang="en">Creative Commons</i> ier Lizänz met Namensnännong',
'config-license-cc-by-nc-sa' => '<i lang="en">Creative Commons</i> Nit för e Jeschäff ze maache, et Wiggerjävve es zohjelohße unger dersellve Bedengunge',
'config-license-cc-0' => '<i lang="en">Creative Commons</i> „Noll“ (jemeinfrei udder Pablic Domain)',
'config-license-gfdl' => 'De <i lang="en">GNU</i>-Lizänz för frei Dokemäntazjuhne, Version 1.3 udder en späädere',
@@ -9671,7 +10233,7 @@ 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.
-Mieh Aanjaabe doh drövver un en Aanleidung, wi mer och ander Wikis ußer de <i lang="en">Wikimedia Commons</i> doför enreeschte kann, fengk mer em [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbooch].',
+Mieh Aanjaabe doh drövver un en Aanleidung, wi mer och ander Wikis ußer de <i lang="en">Wikimedia Commons</i> doför enreeschte kann, fengk mer em [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbooch].',
'config-cc-error' => 'Et Ußsöhke övver de <i lang="en">Creative Commons</i> iehr Projramm zum Lizänzbeshtemme hät nix jebraat.
Donn de Lizänz sellver beshtemme.',
'config-cc-again' => 'Noch ens neu ußsöhke&nbsp;…',
@@ -9681,7 +10243,7 @@ Donn de Lizänz sellver beshtemme.',
'config-cache-help' => 'Objäkte em Zwescheshpeisher faßhallde, dat heiß öff jebruchte Daate en der <i lang="en">cache</i> donn, bruche mer, öm MediaWiki flöcker ze maache,
Meddlere un jruuße Wiki-ẞaits sullte dat onbedengk ußnoze, un och bei klein Wikis weed mer et jood merke.',
'config-cache-none' => 'Keine Zweschshpeijsher (Et jeid_em Wiki nix verloore, ußer velleish Schnälleshkeid wann vill loss es)',
- 'config-cache-accel' => 'Ene Objäk<i lang="en">cache</i> vum PHP (<i lang="en">APC</i>, <i lang="en">eAccelerator</i>, <i lang="en">XCache</i>, udder <i lang="en">WinCache</i>)',
+ 'config-cache-accel' => 'Ene Objäk<i lang="en">cache</i> vum PHP (<i lang="en">APC</i>, <i lang="en">XCache</i>, udder <i lang="en">WinCache</i>)',
'config-cache-memcached' => 'Donn der <code lang="en">memcached</code> ẞööver nämme (Määt extra Enshtellunge un Opsäze nüüdesch)',
'config-memcached-servers' => 'De <code lang="en">memcached</code> ßöövere:',
'config-memcached-help' => 'Donn de Leß aanhjävve, met de <i lang="en">IP</i>-Addräße för der <code lang="en">memcached</code> ẞööver ze bruche.
@@ -9714,12 +10276,17 @@ Donn doför sorrje, dat dä Daatebangk-Aanwänder „$1“ en dämm Daatebangksc
'config-install-pg-plpgsql' => 'Ben noh dä Daatebangkshprooch <code lang="en">PL/pgSQL</code> aam söhke.',
'config-pg-no-plpgsql' => 'Do moß de Daatebangkshprooch <code lang="en">PL/pgSQL</code> en dä Daatebangk $1 enreeschte.',
'config-pg-no-create-privs' => 'Dä Daatebangk-Aanwänder för et Enreeschte hät nit jenooch Rääschde, öm ene andere Daatebangk-Aanwänder en dä Daatebangk aanzelääje.',
+ 'config-pg-not-in-role' => 'Dä aanjejovve Zohjang för et Web jiddet ald.
+Dä aanjejovve Zohjang för et Enschtalleere es keine <i lang="en">superuser<i> un es nit en de Web-Jropp, dröm kam_mer domet kein Dateije aanlääje, di däm Zohjang för et Web jehüüre.
+
+För MeedijaWiki mößße dämm ävver em Momang di Tabälle jehüüre.
+Dröm donn ene andere Name för dä Zohjang zom Wäb nämme, udder donn „retuur“ klicke, un jivv ene Zohjang för et Enschtalleere aan, dä jenooch Rääschte hät.',
'config-install-user' => 'Ben unse Daatebangk-Aanwänder en de Daatebangk am aanlääje.',
'config-install-user-alreadyexists' => 'Dä Aanwender „$1“ för dä Zohjref op de Daatebangk kann nit aanjelaat wääde, et jidd_en alld.',
'config-install-user-create-failed' => 'Dä Aanwender „$1“ för dä Zohjref op de Daatebangk kunnt nit aanjelaat wääde, wäje: <code lang="en">$2</code>',
'config-install-user-grant-failed' => 'Däm Daatebangk-Aanwänder sing Beräschtijunge ze säze däät nit fluppe wääje: $2',
'config-install-user-missing' => 'Dä aanjejovve Metmaacher „$1“ jidd_et nit.',
- 'config-install-user-missing-create' => '{{int:Config-install-user-missing}}
+ 'config-install-user-missing-create' => '{{int:Config-install-user-missing}}<!-- $1 -->
Donn e Höhksche en et Käßje „{{int:Createaccount}}“ onge, wann De dä aanlääje wells.',
'config-install-tables' => 'Ben de Daatebangk-Tabälle aam aanlääje.',
'config-install-tables-exist' => "'''Opjepaß''': Et schingk, dem MediaWiki sing Tabälle sin alt doh.
@@ -9807,6 +10374,8 @@ Dir fannt en am LocalSettings.php.",
'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
'config-session-error' => 'Feeler beim Starte vun der Sessioun: $1',
+ 'config-no-session' => "D'Donnéeë vun ärer Sessioun si verluergaangen!
+Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code> op adequate REpertoire agestallt ass.",
'config-your-language' => 'Är Sprooch',
'config-your-language-help' => 'Sicht déi Sprooch eraus déi Dir während der Installatioun benotze wëllt',
'config-wiki-language' => 'Sprooch vun der Wiki:',
@@ -9856,9 +10425,11 @@ 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-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.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ass installéiert',
'config-apc' => '[http://www.php.net/apc APC] ass installéiert',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] ass installéiert',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert',
'config-diff3-bad' => 'GNU diff3 gouf net fonnt.',
'config-no-uri' => "'''Feeler:''' Déi aktuell URI konnt net festgestallt ginn.
@@ -9885,7 +10456,10 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
'config-db-schema' => 'Schema fir MediaWiki',
'config-db-schema-help' => "D'Schemaen hei driwwer si gewéinlech korrekt.
Ännert se nëmme wann Dir wësst datt et néideg ass.",
+ 'config-pg-test-error' => "Et ass net méiglech d'Datebank '''$1''' ze kontaktéieren: $2",
'config-sqlite-dir' => 'Repertoire vun den SQLite-Donnéeën',
+ 'config-oracle-def-ts' => "Standard 'tablespace':",
+ 'config-oracle-temp-ts' => "Temporären 'tablespace':",
'config-type-mysql' => 'MySQL',
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
@@ -10301,6 +10875,7 @@ $1
Ðко Ñте на заедничко (Ñподелено) вдомување, побарајте му на вдомителот да инÑталира Ñоодветен двигател за базата.
Ðко вие Ñамите го ÑоÑтавивте ова PHP, Ñменете ги поÑтавките така што ќе овозможите клиент на базата - на пр. Ñо кодот <code>./configure --with-mysql</code>.
Ðко инÑталиравте PHP од пакет на Debian или Ubuntu, тогаш ќе треба да го инÑталирате и модулот php5-mysql.',
+ 'config-outdated-sqlite' => "'''Предупредување''': имате SQLite $1. ÐајÑтарата допуштена верзија е $2. Затоа, SQLite ќе биде недоÑтапен.",
'config-no-fts3' => "'''Предупредување''': SQLite iе ÑоÑтавен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можноÑÑ‚ за пребарување.",
'config-register-globals' => "'''Предупредување: МожноÑта <code>[http://php.net/register_globals register_globals]</code> за PHP е овозможена.'''
'''Оневозможете ја ако е можно.'''
@@ -10330,11 +10905,11 @@ $1
'config-memory-bad' => "'''Предупредување:''' <code>memory_limit</code> за PHP изнеÑува $1.
Ова е веројатно премалку.
ИнÑталацијата може да не уÑпее!",
+ 'config-ctype' => "'''Фатална грешка''': PHP мора да Ñе ÑоÑтави Ñо поддршка за [http://www.php.net/manual/en/ctype.installation.php додатокот Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] е инÑталиран',
'config-apc' => '[http://www.php.net/apc APC] е инÑталиран',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] е инÑталиран',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инÑталиран',
- 'config-no-cache' => "'''Предупредување:''' Ðе можев да го најдам [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Предупредување:''' Ðе можев да го најдам [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
Кеширањето на објекти не е овозможено.",
'config-mod-security' => "'''Предупредување''': на вашиот опÑлужувач има овозможено [http://modsecurity.org/ mod_security]. Ðко не е поÑтавено како што треба, ова може да предизвика проблеми кај МедијаВики и други програми што им овозможуваат на кориÑниците да објавуваат произволни Ñодржини.
Погледнете ја [http://modsecurity.org/documentation/ mod_security документацијата] или обратете Ñе кај домаќинот ако наидете на Ñлучајни грешки.",
@@ -10654,7 +11229,7 @@ chmod a+w $3</pre>',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да кориÑтат Ñлики, звучни запиÑи и други мултимедијални Ñодржини од [//commons.wikimedia.org/ Заедничката Ризница].
За да може ова да работи, МедијаВики бара приÑтап до интернет.
-За повеќе информации за оваа функција и напатÑтвија за нејзино поÑтавување на вики (Ñите други оÑвен Ризницата), коноÑултирајте го [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].',
+За повеќе информации за оваа функција и напатÑтвија за нејзино поÑтавување на вики (Ñите други оÑвен Ризницата), коноÑултирајте го [//mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].',
'config-cc-error' => 'Изборникот на Creative Commons лиценца не даде резултати.
ВнеÑете го името на лиценцата рачно.',
'config-cc-again' => 'Одберете повторно...',
@@ -10664,7 +11239,7 @@ chmod a+w $3</pre>',
'config-cache-help' => 'Кеширањето на објекти Ñе кориÑти за зголемување на брзината на МедијаВики Ñо кеширање на чеÑто употребуваните податоци.
Ова многу Ñе препорачува на Ñредни до големи викија, но од тоа ќе имаат полза и малите викија.',
'config-cache-none' => 'Без кеширање (не Ñе оÑтранува ниедна функција, но може да влијае на брзината кај поголеми викија)',
- 'config-cache-accel' => 'Кеширање на PHP-објекти (APC, eAccelerator, XCache или WinCache)',
+ 'config-cache-accel' => 'Кеширање на PHP-објекти (APC, XCache или WinCache)',
'config-cache-memcached' => 'КориÑти Memcached (бара дополнително поÑтавување и нагодување)',
'config-memcached-servers' => 'Memcached-опÑлужувачи:',
'config-memcached-help' => 'СпиÑок на IP-адреÑи за употреба во Memcached.
@@ -10995,6 +11570,18 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
* @author Chrisportelli
*/
$messages['mt'] = array(
+ 'config-page-language' => 'Lingwa',
+ 'config-page-welcome' => 'Merħba fuq MediaWiki!',
+ 'config-page-dbconnect' => 'Aqbad mad-databażi',
+ 'config-page-upgrade' => 'Aġġorna l-installazzjoni eżistenti',
+ 'config-page-dbsettings' => 'Impostazzjonijiet tad-databażi',
+ 'config-page-name' => 'Isem',
+ 'config-page-options' => 'Għażliet',
+ 'config-page-install' => 'Installa',
+ 'config-page-complete' => 'Lesta!',
+ 'config-page-restart' => "Erġa' ibda l-installazzjoni",
+ 'config-page-readme' => 'Aqrani',
+ 'config-page-releasenotes' => 'Noti tal-verżjoni',
'mainpagetext' => "'''MediaWiki ġie installat b'suċċess.'''",
'mainpagedocfooter' => "Ikkonsulta l-[//meta.wikimedia.org/wiki/Help:Contents Gwida għall-utenti] sabiex tikseb iktar informazzjoni dwar kif tuża' s-softwer tal-wiki.
@@ -11051,6 +11638,454 @@ $messages['nan'] = array(
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
);
+/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
+ * @author Event
+ * @author Jon Harald Søby
+ * @author Nghtwlkr
+ */
+$messages['nb'] = array(
+ 'config-desc' => 'Installasjonsprogrammet for MediaWiki',
+ 'config-title' => 'Installasjon av MediaWiki $1',
+ 'config-information' => 'Informasjon',
+ 'config-localsettings-upgrade' => 'En <code>LocalSettings.php</code>-fil har blitt oppdaget.
+For å oppgradere denne installasjonen, skriv inn verdien av <code>$wgUpgradeKey</code> i boksen nedenfor.
+Du finner denne i LocalSettings.php.',
+ 'config-localsettings-cli-upgrade' => "Filen ''LocalSettings.php'' er funnet.
+For å oppgradere denne installasjonen, vennligst kjør ''update.php'' i stedet",
+ 'config-localsettings-key' => 'Oppgraderingsnøkkel:',
+ 'config-localsettings-badkey' => 'Nøkkelen du oppga er feil.',
+ 'config-upgrade-key-missing' => "En eksisterende installasjon av MediaWiki er funnet.
+For å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''LocalSettings.php''-fil:
+
+$1",
+ 'config-localsettings-incomplete' => "Den eksisterende ''LocalSettings.php'' ser ut til å være ufullstendig.
+Variabelen $1 har ingen verdi.
+Vær vennlig å endre ''LocalSettings.php'' slik at variabelen får en verdi, og klikk ''Fortsett''.",
+ 'config-localsettings-connection-error' => "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''LocalSettings.php'' eller ''AdminSettings.php''. Vær vennlig å rette opp disse innstillingene og prøv igjen.
+
+$1",
+ 'config-session-error' => 'Feil under oppstart av økt: $1',
+ 'config-session-expired' => 'Dine øktdata ser ut til å ha utløpt.
+Økter er konfigurert for en levetid på $1.
+Du kan øke dette ved å sette <code>session.gc_maxlifetime</code> i php.ini.
+Start installasjonsprosessen på nytt.',
+ 'config-no-session' => 'Dine øktdata ble tapt!
+Sjekk din php.ini og sørg for at <code>session.save_path</code> er satt til en passende mappe.',
+ 'config-your-language' => 'Ditt språk:',
+ 'config-your-language-help' => 'Velg et språk å bruke under installasjonsprosessen.',
+ 'config-wiki-language' => 'Wikispråk:',
+ 'config-wiki-language-help' => 'Velg språket som wikien hovedsakelig vil bli skrevet i.',
+ 'config-back' => '↠Tilbake',
+ 'config-continue' => 'Fortsett →',
+ 'config-page-language' => 'Språk',
+ 'config-page-welcome' => 'Velkommen til MediaWiki!',
+ 'config-page-dbconnect' => 'Koble til database',
+ 'config-page-upgrade' => 'Oppgrader eksisterende innstallasjon',
+ 'config-page-dbsettings' => 'Databaseinnstillinger',
+ 'config-page-name' => 'Navn',
+ 'config-page-options' => 'Valg',
+ 'config-page-install' => 'Innstaller',
+ 'config-page-complete' => 'Ferdig!',
+ 'config-page-restart' => 'Start installasjonen på nytt',
+ 'config-page-readme' => 'Les meg',
+ 'config-page-releasenotes' => 'Utgivelsesnotat',
+ 'config-page-copying' => 'Kopiering',
+ 'config-page-upgradedoc' => 'Oppgradering',
+ 'config-page-existingwiki' => 'Eksisterende wiki',
+ 'config-help-restart' => 'Ønsker du å fjerne alle lagrede data som du har skrevet inn og starte installasjonsprosessen på nytt?',
+ 'config-restart' => 'Ja, start på nytt',
+ 'config-welcome' => '=== Miljøsjekker ===
+Grunnleggende sjekker utføres for å se om dette miljøet er egnet for en MediaWiki-installasjon.
+Du bør oppgi resultatene fra disse sjekkene om du trenger hjelp under installasjonen.',
+ 'config-copyright' => "=== Opphavsrett og vilkår ===
+
+$1
+
+MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
+
+Dette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.
+Se GNU General Public License for flere detaljer.
+
+Du skal ha mottatt <doclink href=Copying>en kopi av GNU General Public License</doclink> sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [http://www.gnu.org/copyleft/gpl.html les det på nettet].",
+ 'config-sidebar' => '* [//www.mediawiki.org MediaWiki hjem]
+* [//www.mediawiki.org/wiki/Help:Contents Brukerguide]
+* [//www.mediawiki.org/wiki/Manual:Contents Administratorguide]
+* [//www.mediawiki.org/wiki/Manual:FAQ OSS]
+----
+* <doclink href=Readme>Les meg</doclink>
+* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>
+* <doclink href=Copying>Kopiering</doclink>
+* <doclink href=UpgradeDoc>Oppgradering</doclink>',
+ 'config-env-good' => 'Miljøet har blitt sjekket.
+Du kan installere MediaWiki.',
+ 'config-env-bad' => 'Miljøet har blitt sjekket.
+Du kan installere MediaWiki.',
+ 'config-env-php' => 'PHP $1 er innstallert.',
+ 'config-env-php-toolow' => 'PHP $1 er installert.
+MediaWiki krever imidlertid PHP $2 eller høyere.',
+ 'config-unicode-using-utf8' => 'Bruker Brion Vibbers utf8_normalize.so for Unicode-normalisering.',
+ 'config-unicode-using-intl' => 'Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.',
+ 'config-unicode-pure-php-warning' => "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.
+Om du kjører et nettsted med høy trafikk bør du lese litt om [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisering].",
+ 'config-unicode-update-warning' => "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.
+Du bør [//www.mediawiki.org/wiki/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
+ 'config-no-db' => 'Fant ikke en passende databasedriver! Du må installere en databasedriver for PHP.
+Følgende databasetyper er støttet: $1
+
+Om du er på delt vertsskap, spør din vertsleverandør om å installere en passende databasedriver.
+Om du kompilerte PHP selv, rekonfigirer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.
+Om du installerte PHP fra en Debian- eller Ubuntu-pakke må du også installere modulen php5-mysql.',
+ 'config-no-fts3' => "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
+ 'config-register-globals' => "'''Advarsel: PHPs <code>[http://php.net/register_globals register_globals]</code>-alternativ er aktivert.'''
+'''Deaktiver det om du kan.'''
+MediaWiki vil fungere, men tjeneren din er utsatt for potensielle sikkerhetssårbarheter.",
+ 'config-magic-quotes-runtime' => "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''
+Dette alternativet ødelegger inndata på en uforutsigbar måte.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-magic-quotes-sybase' => "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''
+Dette alternativet ødelegger inndata på en uforutsigbar måte.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-mbstring' => "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''
+Dette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-ze1' => "'''Kritisk: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] er aktiv!'''
+Dette alternativet fører til horrible feil med MediaWiki.
+Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
+ 'config-safe-mode' => "'''Advarsel:''' PHPs [http://www.php.net/features.safe-mode safe mode] er aktiv.
+Det kan føre til problem, spesielt hvis du bruker støtte for filopplastinger og <code>math</code>.",
+ 'config-xml-bad' => 'PHPs XML-modul mangler.
+MediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.
+Hvis du kjører Mandrak, installer pakken php-xml.',
+ 'config-pcre' => 'PCRE-støttemodulen ser ut til å mangle.
+MediaWiki krever funksjonene for de Perl-kompatible regulære uttrykkene for å virke.',
+ 'config-pcre-no-utf8' => "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.
+MediaWiki krever UTF-8-støtte for å fungere riktig.",
+ 'config-memory-raised' => 'PHPs <code>memory_limit</code> er $1, økt til $2.',
+ 'config-memory-bad' => "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.
+Dette er sannsynligvis for lavt.
+Installasjonen kan mislykkes!",
+ 'config-xcache' => '[http://xcache.lighttpd.net/ XCache] er innstallert',
+ 'config-apc' => '[http://www.php.net/apc APC] er innstallert',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] er installert',
+ 'config-no-cache' => "'''Advarsel:''' Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].
+Objekthurtiglagring er ikke aktivert.",
+ 'config-mod-security' => "'''Advarsel''': Din web-tjener har [http://modsecurity.org/ mod_security] påslått. Hvis denne er feilinnstilt, kan det gi problemer for MediaWiki eller annen programvare som tillater brukere å poste vilkårlig innhold.
+Sjekk [http://modsecurity.org/documentation/ mod_security-dokumentasjonen] eller ta kontakt med din nettleverandør hvis du opplever tilfeldige feil.",
+ 'config-diff3-bad' => 'GNU diff3 ikke funnet.',
+ 'config-imagemagick' => 'Fant ImageMagick: <code>$1</code>.
+Bildeminiatyrisering vil aktiveres om du aktiverer opplastinger.',
+ 'config-gd' => 'Fant innebygd GD-grafikkbibliotek.
+Bildeminiatyrisering vil aktiveres om du aktiverer opplastinger.',
+ 'config-no-scaling' => 'Kunne ikke finne GD-bibliotek eller ImageMagick.
+Bildeminiatyrisering vil være deaktivert.',
+ 'config-no-uri' => "'''Feil:''' Kunne ikke bestemme gjeldende URI.
+Installasjon avbrutt.",
+ 'config-no-cli-uri' => "'''Advarsel''': Ingen --scriptpath er angitt; bruker standard: <code>$1</code>.",
+ 'config-using-server' => 'Bruker servernavnet "<nowiki>$1</nowiki>".',
+ 'config-using-uri' => 'Bruker server-URL "<nowiki>$1$2</nowiki>".',
+ 'config-uploads-not-safe' => "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.
+Selv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [//www.mediawiki.org/wiki/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
+ 'config-no-cli-uploads-check' => "'''Advarsel:''' Din standard-katalog for opplastinger (<code>$1</code>) er ikke kontrollert for sårbarhet overfor vilkårlig skript-kjøring under CLI-installasjonen.",
+ 'config-brokenlibxml' => 'Ditt system har en kombinasjon av PHP- og libxml2-versjoner som er feilaktige og kan forårsake skjult dataødeleggelse i MediaWiki og andre web-applikasjoner.
+Oppgrader til PHP 5.2.9 eller nyere og libxml 2 2.7.3 eller nyere ([//bugs.php.net/bug.php?id=45996 Feil-liste for PHP]).
+Installasjon abortert.',
+ 'config-using531' => 'MediaWiki kan ikke brukes med PHP $1 på grunn av en feil med referanseparametere til <code>__call()</code>.
+Oppgrader til PHP 5.3.2 eller høyere, eller nedgrader til PHP 5.3.0 for å løse dette.
+Installasjonen avbrutt.',
+ 'config-suhosin-max-value-length' => 'Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki\'s ResourceLoader-komponent klarer å komme rundt denne begrensningen, med med redusert ytelse. På mulig bør du sette suhosin.get.max_value_length til minst 1024 i php.ini, og sette $wgResourceLoaderMaxQueryLength til samme verdi i LocalSettings.php.',
+ 'config-db-type' => 'Databasetype:',
+ 'config-db-host' => 'Databasevert:',
+ 'config-db-host-help' => 'Hvis databasetjeneren er på en annen tjener, skriv inn vertsnavnet eller IP-adressen her.
+
+Hvis du bruker en delt nettvert bør verten din oppgi det korrekte vertsnavnet i deres dokumentasjon.
+
+Hvis du installerer på en Windowstjener og bruker MySQL kan det hende at «localhost» ikke virker som tjenernavnet. Hvis ikke, prøv «127.0.0.1» for den lokale IP-adressen.',
+ 'config-db-host-oracle' => 'Database TNS:',
+ 'config-db-host-oracle-help' => 'Skriv inn et gyldig [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; en tnsnames.ora-fil må være synlig for installasjonsprosessen.<br />Hvis du bruker klientbibliotek 10g eller nyere kan du også bruke navngivingsmetoden [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Identifiser denne wikien',
+ 'config-db-name' => 'Databasenavn:',
+ 'config-db-name-help' => 'Velg et navn som identifiserer wikien din.
+Det bør ikke inneholde mellomrom.
+
+Hvis du bruker en delt nettvert vil verten din enten gi deg et spesifikt databasenavn å bruke, eller la deg opprette databaser via kontrollpanelet.',
+ 'config-db-name-oracle' => 'Databaseskjema:',
+ 'config-db-install-account' => 'Brukerkonto for installasjon',
+ 'config-db-username' => 'Databasebrukernavn:',
+ 'config-db-password' => 'Databasepassord:',
+ 'config-db-password-empty' => 'Skriv inn et passord for den nye databasebrukeren: $1.
+Det er mulig å opprette brukere uten passord, men dette er ikke sikkert.',
+ 'config-db-install-username' => 'Skriv inn brukernavnet som vil bli brukt til å koble til databasen under installasjonsprosessen.
+Dette er ikke brukernavnet på MediaWiki-kontoen; dette er brukernavnet for databasen din.',
+ 'config-db-install-password' => 'Skriv inn passordet som vil bli brukt til å koble til databasen under installasjonsprosessen.
+Dette er ikke passordet på MediaWiki-kontoen; dette er passordet for databasen din.',
+ 'config-db-install-help' => 'Skriv inn brukernavnet og passordet som vil bli brukt for å koble til databasen under installasjonsprosessen.',
+ 'config-db-account-lock' => 'Bruk det samme brukernavnet og passordet under normal drift',
+ 'config-db-wiki-account' => 'Brukerkonto for normal drift',
+ 'config-db-wiki-help' => 'Skriv inn brukernavnet og passordet som vil bli brukt til å koble til databasen under normal wikidrift.
+Hvis kontoen ikke finnes, og installasjonskontoen har tilstrekkelige privilegier, vil denne brukerkontoen bli opprettet med et minimum av privilegier, tilstrekkelig for å operere wikien.',
+ 'config-db-prefix' => 'Databasetabellprefiks:',
+ 'config-db-prefix-help' => 'Hvis du trenger å dele en database mellom flere wikier, eller mellom MediaWiki og andre nettapplikasjoner, kan du velge å legge til et prefiks til alle tabellnavnene for å unngå konflikter.
+Ikke bruk mellomrom.
+
+Dette feltet er vanligvis tomt.',
+ 'config-db-charset' => 'Databasetegnsett',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binær',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 bakoverkompatibel UTF-8',
+ 'config-charset-help' => "'''Advarsel:''' Hvis du bruker '''bakoverkompatibel UTF-8''' på MySQL 4.1+, og deretter sikkerhetskopierer databasen med <code>mysqldump</code> kan det ødelegge alle ikke-ASCII tegn og irreversibelt ødelegge dine sikkerhetskopier!
+
+I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.
+Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.
+I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
+men det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
+ 'config-mysql-old' => 'MySQL $1 eller senere kreves, du har $2.',
+ 'config-db-port' => 'Databaseport:',
+ 'config-db-schema' => 'Skjema for MediaWiki',
+ 'config-db-schema-help' => 'Dette skjemaet er som regel riktig.
+Bare endre det hvis du vet at du trenger det.',
+ 'config-sqlite-dir' => 'SQLite datamappe:',
+ 'config-sqlite-dir-help' => "SQLite lagrer alle data i en enkelt fil.
+
+Mappen du oppgir må være skrivbar for nettjeneren under installasjonen.
+
+Den bør '''ikke''' være tilgjengelig fra nettet, dette er grunnen til at vi ikke legger det der PHP-filene dine er.
+
+Installasjonsprogrammet vil skrive en <code>.htaccess</code>-fil sammen med det, men om det mislykkes kan noen få tilgang til din råe database. Dette inkluderer rå brukerdata (e-postadresser, hashede passord) samt slettede revisjoner og andre begrensede data på wikien.
+
+Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'Standard tabellrom:',
+ 'config-oracle-temp-ts' => 'Midlertidig tabellrom:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-support-info' => 'MediaWiki støtter følgende databasesystem:
+
+$1
+
+Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg instruksjonene det er lenket til over for å aktivere støtte.',
+ 'config-support-mysql' => '* $1 er det primære målet for MediaWiki og er best støttet ([http://www.php.net/manual/en/mysql.installation.php hvordan kompilere PHP med MySQL-støtte])',
+ 'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). 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.',
+ '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»',
+ 'config-missing-db-server-oracle' => 'Du må skrive inn en verdi for «Database TNS»',
+ 'config-invalid-db-server-oracle' => 'Ugyldig database-TNS «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_) og punktum (.).',
+ 'config-invalid-db-name' => 'Ugyldig databasenavn «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).',
+ 'config-invalid-db-prefix' => 'Ugyldig databaseprefiks «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).',
+ 'config-connection-error' => '$1.
+
+Sjekk verten, brukernavnet og passordet nedenfor og prøv igjen.',
+ 'config-invalid-schema' => 'Ugyldig skjema for MediaWiki «$1».
+Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_).',
+ 'config-db-sys-create-oracle' => 'Installasjonsprogrammet støtter kun bruk av en SYSDBA-konto for opprettelse av en ny konto.',
+ 'config-db-sys-user-exists-oracle' => 'Brukerkontoen «$1» finnes allerede. SYSDBA kan kun brukes for oppretting av nye kontoer!',
+ 'config-postgres-old' => 'PostgreSQL $1 eller senere kreves, du har $2.',
+ 'config-sqlite-name-help' => 'Velg et navn som identifiserer wikien din.
+Ikke bruk mellomrom eller bindestreker.
+Dette vil bli brukt til SQLite-datafilnavnet.',
+ 'config-sqlite-parent-unwritable-group' => 'Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.
+
+Installasjonsprogrammet har bestemt brukeren nettjeneren din kjører som.
+Gjør <code><nowiki>$3</nowiki></code>-mappen skrivbar for denne for å fortsette.
+På et Unix/Linux-system, gjør:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.
+
+Installasjonsprogrammet kunne ikke bestemme brukeren nettjeneren din kjører som.
+Gjør <code><nowiki>$3</nowiki></code>-mappen globalt skrivbar for denne (og andre!) for å fortsette.
+På et Unix/Linux-system, gjør:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Feil under oppretting av datamappen «$1».
+Sjekk plasseringen og prøv igjen.',
+ 'config-sqlite-dir-unwritable' => 'Kan ikke skrive til mappen «$1».
+Endre dens tilganger slik at nettjeneren kan skrive til den og prøv igjen.',
+ 'config-sqlite-connection-error' => '$1.
+
+Sjekk datamappen og databasenavnet nedenfor og prøv igjen.',
+ 'config-sqlite-readonly' => 'Filen <code>$1</code> er ikke skrivbar.',
+ 'config-sqlite-cant-create-db' => 'Kunne ikke opprette databasefilen <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP mangler FTS3-støtte, nedgraderer tabeller',
+ 'config-can-upgrade' => "Det er MediaWiki-tabeller i denne databasen.
+For å oppgradere dem til MediaWiki $1, klikk '''Fortsett'''.",
+ 'config-upgrade-done' => "Oppgradering fullført.
+
+Du kan nå [$1 begynne å bruke wikien din].
+
+Hvis du ønsker å regenerere <code>LocalSettings.php</code>-filen din, klikk på knappen nedenfor.
+Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
+ 'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
+
+Du kan nå [$1 begynne å bruke wikien din].',
+ 'config-regenerate' => 'Regenerer LocalSettings.php →',
+ 'config-show-table-status' => 'SHOW TABLE STATUS etterspørselen mislyktes!',
+ 'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
+ 'config-db-web-account' => 'Databasekonto for nettilgang',
+ 'config-db-web-help' => 'Velg brukernavnet og passordet som nettjeneren skal bruke for å koble til databasetjeneren under ordinær drift av wikien.',
+ 'config-db-web-account-same' => 'Bruk samme konto som for installasjonen',
+ 'config-db-web-create' => 'Opprett kontoen om den ikke finnes allerede',
+ 'config-db-web-no-create-privs' => 'Kontoen du oppga for installasjonen har ikke nok privilegier til å opprette en konto.
+Kontoen du oppgir her må finnes allerede.',
+ 'config-mysql-engine' => 'Lagringsmotor:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-engine-help' => "'''InnoDB''' er nesten alltid det beste alternativet siden den har god støtte for samtidighet («concurrency»).
+
+'''MyISAM''' kan være raskere i enbruker- eller les-bare-installasjoner.
+MyISAM-databaser har en tendens til å bli ødelagt oftere enn InnoDB-databaser.",
+ 'config-mysql-charset' => 'Databasetegnsett:',
+ 'config-mysql-binary' => 'Binær',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.
+Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.
+
+I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
+men det vil ikke la deg lagre tegn over «[//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.',
+ 'config-project-namespace' => 'Prosjektnavnerom:',
+ 'config-ns-generic' => 'Prosjekt',
+ 'config-ns-site-name' => 'Samme som wikinavnet: $1',
+ 'config-ns-other' => 'Annet (spesifiser)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => "Etter Wikipedias eksempel holder mange wikier deres sider med retningslinjer atskilt fra sine innholdssider, i et «'''prosjektnavnerom'''».
+Alle sidetitler i dette navnerommet starter med et gitt prefiks som du kan angi her.
+Tradisjonelt er dette prefikset avledet fra navnet på wikien, men det kan ikke innholde punkttegn som «#» eller «:».",
+ 'config-ns-invalid' => 'Det angitte navnerommet «<nowiki>$1</nowiki>» er ugyldig.
+Angi et annet prosjektnavnerom.',
+ 'config-ns-conflict' => 'Det angitte navnerommet «<nowiki>$1</nowiki>» er i konflikt med et standard MediaWiki-navnerom.
+Angi et annet prosjekt-navnerom.',
+ 'config-admin-box' => 'Administratorkonto',
+ 'config-admin-name' => 'Ditt navn:',
+ 'config-admin-password' => 'Passord:',
+ 'config-admin-password-confirm' => 'Passord igjen:',
+ 'config-admin-help' => 'Skriv inn ditt ønskede brukernavn her, for eksempel «Joe Bloggs».
+Dette er navnet du vil bruke for å logge inn på denne wikien.',
+ 'config-admin-name-blank' => 'Skriv inn et administratorbrukernavn.',
+ 'config-admin-name-invalid' => 'Det angitte brukernavnet «<nowiki>$1</nowiki>» er ugyldig.
+Angi et annet brukernavn.',
+ 'config-admin-password-blank' => 'Skriv inn et passord for administratorkontoen.',
+ 'config-admin-password-same' => 'Passordet skal ikke være det samme som brukernavnet.',
+ 'config-admin-password-mismatch' => 'De to passordene du skrev inn samsvarte ikke.',
+ 'config-admin-email' => 'E-postadresse:',
+ 'config-admin-email-help' => 'Skriv inn en e-postadresse her for at du skal kunne motta e-post fra andre brukere på wikien, tilbakestille passordet ditt, og bli varslet om endringer på sider på overvåkningslisten din. Du kan la dette feltet stå tomt.',
+ 'config-admin-error-user' => 'Intern feil ved opprettelse av en admin med navnet «<nowiki>$1</nowiki>».',
+ 'config-admin-error-password' => 'Intern feil ved opprettelse av passord for admin «<nowiki>$1</nowiki>»: <pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Du har skrevet inn en ugyldig e-postadresse.',
+ 'config-subscribe' => 'Abonner på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlisten for utgivelsesannonseringer].',
+ 'config-subscribe-help' => 'Dette er en lav-volums e-postliste brukt til utgivelsesannonseringer, herunder viktige sikkerhetsannonseringer.
+Du bør abonnere på den og oppdatere MediaWikiinstallasjonen din når nye versjoner kommer ut.',
+ 'config-almost-done' => 'Du er nesten ferdig!
+Du kan hoppe over de resterende konfigurasjonene og installere wikien nå.',
+ 'config-optional-continue' => 'Spør meg flere spørsmål.',
+ 'config-optional-skip' => 'Jeg er lei, bare installer wikien.',
+ 'config-profile' => 'Brukerrettighetsprofil:',
+ 'config-profile-wiki' => 'Tradisjonell wiki',
+ 'config-profile-no-anon' => 'Kontoopprettelse påkrevd',
+ 'config-profile-fishbowl' => 'Kun autoriserte bidragsytere',
+ 'config-profile-private' => 'Privat wiki',
+ 'config-profile-help' => "Wikier fungerer best når du lar så mange mennesker som mulig redigere den.
+I MediaWiki er det lett å revidere siste endringer og tilbakestille eventuell skade som er gjort av naive eller ondsinnede brukere.
+
+Imidlertid har mange funnet at MediaWiki er nyttig i mange roller, og av og til er det ikke lett å overbevise alle om fordelene med wikimåten.
+SÃ¥ du har valget.
+
+En '''{{int:config-profile-wiki}}''' tillater alle å redigere, selv uten å logge inn.
+En wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men kan avskrekke tilfeldige bidragsytere.
+
+'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.
+En '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, den samme gruppen som får lov til å redigere dem.
+
+Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [//www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].",
+ 'config-license' => 'Opphavsrett og lisens:',
+ 'config-license-cc-by-sa' => 'Creative Commons Navngivelse Del på samme vilkår',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår',
+ 'config-license-cc-0' => 'Creative Commons Zero',
+ 'config-license-pd' => 'Offentlig rom',
+ 'config-license-cc-choose' => 'Velg en egendefinert Creative Commons-lisens',
+ 'config-email-settings' => 'E-postinnstillinger',
+ 'config-enable-email' => 'Aktiver utgående e-post',
+ 'config-enable-email-help' => 'Hvis du vil at e-post skal virke må [http://www.php.net/manual/en/mail.configuration.php PHPs e-postinnstillinger] bli konfigurert riktig.
+Hvis du ikke ønsker noen e-postfunksjoner kan du deaktivere dem her.',
+ 'config-email-user' => 'Aktiver e-post mellom brukere',
+ 'config-email-user-help' => 'Tillat alle brukere å sende hverandre e-post hvis de har aktivert det i deres innstillinger.',
+ 'config-email-usertalk' => 'Aktiver brukerdiskusjonssidevarsler',
+ 'config-email-usertalk-help' => 'Tillat brukere å motta varsler ved endringer på deres brukerdiskusjonsside hvis de har aktivert dette i deres innstillinger.',
+ 'config-email-watchlist' => 'Aktiver overvåkningslistevarsler',
+ 'config-email-watchlist-help' => 'Tillat brukere å motta varsler ved endringer på deres overvåkede sider hvis de har aktivert dette i deres innstillinger.',
+ 'config-email-auth' => 'Aktiver e-postautentisering',
+ 'config-email-auth-help' => "Om dette alternativet er aktivert må brukere bekrefte sin e-postadresse ved å bruke en lenke som blir sendt til dem når de setter eller endrer adressen sin.
+Kun autentiserte e-postadresser kan motta e-post fra andre brukere eller endringsvarsel.
+Å sette dette valget er '''anbefalt''' for offentlige wikier på grunn av potensiell misbruk av e-postfunksjonene.",
+ 'config-email-sender' => 'Svar-e-postadresse:',
+ 'config-email-sender-help' => 'Skriv inn e-postadressen som skal brukes som svar-adresse ved utgående e-post.
+Det er hit returmeldinger vil bli sendt.
+Mange e-posttjenere krever at minst domenenavnet må være gyldig.',
+ 'config-upload-settings' => 'Bilde- og filopplastinger',
+ 'config-upload-enable' => 'Aktiver filopplastinger',
+ 'config-upload-help' => 'Filopplastinger kan potensielt utsette tjeneren din for sikkerhetsrisikoer.
+For mer informasjon, les [//www.mediawiki.org/wiki/Manual:Security sikkerhetsseksjonen] i manualen.
+
+For å aktivere filopplastinger, endre modusen i <code>images</code>-undermappen i MediaWikis rotmappe slik at nettjeneren kan skrive til den.
+Aktiver så dette alternativet.',
+ 'config-upload-deleted' => 'Mappe for slettede filer:',
+ 'config-upload-deleted-help' => 'Velg en mappe for å arkivere slettede filer.
+Ideelt burde ikke denne være tilgjengelig for nettet.',
+ 'config-logo' => 'Logo-URL:',
+ 'config-logo-help' => 'MediaWikis standarddrakt inkluderer plass til en 135x160 pikslers logo i øvre venstre hjørne.
+Last opp et bilde i passende størrelse og skriv inn nettadressen her.
+
+Hvis du ikke ønsker en logo, la denne boksen være tom.',
+ 'config-instantcommons' => 'Aktiver Instant Commons',
+ 'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [//commons.wikimedia.org/ Wikimedia Commons].
+For å gjøre dette krever MediaWiki tilgang til internett.
+
+For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man setter opp dette for andre wikier enn Wikimedia Commons, konsulter [//mediawiki.org/wiki/Manual:$wgForeignFileRepos manualen].',
+ 'config-cc-again' => 'Velg igjen...',
+ 'config-cc-not-chosen' => 'Velg hvilken Creative Commons-lisens du ønsker og klikk «fortsett».',
+ 'config-advanced-settings' => 'Avansert konfigurasjon',
+ 'config-extensions' => 'Utvidelser',
+ 'config-install-step-done' => 'ferdig',
+ 'config-install-step-failed' => 'mislyktes',
+ 'config-install-extensions' => 'Inkludert utvidelser',
+ 'config-install-database' => 'Setter opp database',
+ 'config-install-user' => 'Oppretter databasebruker',
+ 'config-install-user-alreadyexists' => 'Brukeren «$1» finnes allerede',
+ 'config-install-user-create-failed' => 'Opprettelse av brukeren «$1» mislyktes: $2',
+ 'config-install-user-grant-failed' => 'Å gi tillatelse til brukeren «$1» mislyktes: $2',
+ 'config-install-tables' => 'Oppretter tabeller',
+ 'config-install-mainpage-failed' => 'Kunne ikke sette inn hovedside: $1',
+ 'config-help' => 'hjelp',
+ 'mainpagetext' => "'''MediaWiki-programvaren er nå installert.'''",
+ 'mainpagedocfooter' => 'Se [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for informasjon om hvordan du bruker wiki-programvaren.
+
+==Ã… starte==
+*[//www.mediawiki.org/wiki/Manual:Configuration_settings Oppsettsliste]
+*[//www.mediawiki.org/wiki/Manual:FAQ Ofte stilte spørsmål]
+*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]',
+);
+
/** Low German (Plattdüütsch) */
$messages['nds'] = array(
'mainpagetext' => "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
@@ -11186,6 +12221,7 @@ De volgende databases worden ondersteund: $1.
Als u op een gedeelde omgeving zit, vraag dan aan uw hostingprovider een geschikte databasedriver te installeren.
Als u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.
Als u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.',
+ 'config-outdated-sqlite' => "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
'config-no-fts3' => "'''Waarschuwing''': SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; er zijn geen zoekfuncties niet beschikbaar.",
'config-register-globals' => "'''Waarschuwing: De PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''
'''Schakel deze uit als dat mogelijk is.'''
@@ -11216,11 +12252,11 @@ MediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
'config-memory-bad' => "'''Waarschuwing:''' PHP's <code>memory_limit</code> is $1.
Dit is waarschijnlijk te laag.
De installatie kan mislukken!",
+ 'config-ctype' => "'''Fataal:''' PHP moet gecompileerd zijn met ondersteuning voor de [http://www.php.net/manual/en/ctype.installation.php extensie Ctype].",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd',
'config-apc' => '[http://www.php.net/apc APC] is op dit moment geïnstalleerd',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] is op dit moment geïnstalleerd',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd',
- 'config-no-cache' => "'''Waarschuwing:''' [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC] of [http://trac.lighttpd.net/ xcache / XCache] is niet aangetroffen.
+ 'config-no-cache' => "'''Waarschuwing:''' [http://www.php.net/apc APC] of [http://trac.lighttpd.net/ xcache / XCache] is niet aangetroffen.
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.",
@@ -11544,7 +12580,7 @@ Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.',
'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].
Hiervoor heeft MediaWiki toegang nodig tot Internet.
-Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s dan Wikimedia Commons is te vinden in de [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos handleiding].',
+Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s dan Wikimedia Commons is te vinden in de [//mediawiki.org/wiki/Manual:$wgForeignFileRepos handleiding].',
'config-cc-error' => 'De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.
Voer de licentie handmatig in.',
'config-cc-again' => 'Opnieuw kiezen...',
@@ -11555,7 +12591,7 @@ Voer de licentie handmatig in.',
Middelgrote tot grote websites wordt geadviseerd dit in te schakelen en ook kleine sites merken de voordelen.',
'config-cache-none' => 'Niets cachen.
Er gaat geen functionaliteit verloren, maar dit kan invloed hebben op de snelheid.',
- 'config-cache-accel' => 'Cachen van objecten via PHP (APC, eAccelerator, XCache of WinCache)',
+ 'config-cache-accel' => 'Cachen van objecten via PHP (APC, XCache of WinCache)',
'config-cache-memcached' => 'Memcached gebruiken (dit vereist aanvullende instellingen)',
'config-memcached-servers' => 'Memcachedservers:',
'config-memcached-help' => 'Lijst met IP-adressen te gebruiken voor Memcached.
@@ -11695,455 +12731,6 @@ Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]',
);
-/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
- * @author Event
- * @author Jon Harald Søby
- * @author Nghtwlkr
- */
-$messages['no'] = array(
- 'config-desc' => 'Installasjonsprogrammet for MediaWiki',
- 'config-title' => 'Installasjon av MediaWiki $1',
- 'config-information' => 'Informasjon',
- 'config-localsettings-upgrade' => 'En <code>LocalSettings.php</code>-fil har blitt oppdaget.
-For å oppgradere denne installasjonen, skriv inn verdien av <code>$wgUpgradeKey</code> i boksen nedenfor.
-Du finner denne i LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => "Filen ''LocalSettings.php'' er funnet.
-For å oppgradere denne installasjonen, vennligst kjør ''update.php'' i stedet",
- 'config-localsettings-key' => 'Oppgraderingsnøkkel:',
- 'config-localsettings-badkey' => 'Nøkkelen du oppga er feil.',
- 'config-upgrade-key-missing' => "En eksisterende installasjon av MediaWiki er funnet.
-For å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''LocalSettings.php''-fil:
-
-$1",
- 'config-localsettings-incomplete' => "Den eksisterende ''LocalSettings.php'' ser ut til å være ufullstendig.
-Variabelen $1 har ingen verdi.
-Vær vennlig å endre ''LocalSettings.php'' slik at variabelen får en verdi, og klikk ''Fortsett''.",
- 'config-localsettings-connection-error' => "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''LocalSettings.php'' eller ''AdminSettings.php''. Vær vennlig å rette opp disse innstillingene og prøv igjen.
-
-$1",
- 'config-session-error' => 'Feil under oppstart av økt: $1',
- 'config-session-expired' => 'Dine øktdata ser ut til å ha utløpt.
-Økter er konfigurert for en levetid på $1.
-Du kan øke dette ved å sette <code>session.gc_maxlifetime</code> i php.ini.
-Start installasjonsprosessen på nytt.',
- 'config-no-session' => 'Dine øktdata ble tapt!
-Sjekk din php.ini og sørg for at <code>session.save_path</code> er satt til en passende mappe.',
- 'config-your-language' => 'Ditt språk:',
- 'config-your-language-help' => 'Velg et språk å bruke under installasjonsprosessen.',
- 'config-wiki-language' => 'Wikispråk:',
- 'config-wiki-language-help' => 'Velg språket som wikien hovedsakelig vil bli skrevet i.',
- 'config-back' => '↠Tilbake',
- 'config-continue' => 'Fortsett →',
- 'config-page-language' => 'Språk',
- 'config-page-welcome' => 'Velkommen til MediaWiki!',
- 'config-page-dbconnect' => 'Koble til database',
- 'config-page-upgrade' => 'Oppgrader eksisterende innstallasjon',
- 'config-page-dbsettings' => 'Databaseinnstillinger',
- 'config-page-name' => 'Navn',
- 'config-page-options' => 'Valg',
- 'config-page-install' => 'Innstaller',
- 'config-page-complete' => 'Ferdig!',
- 'config-page-restart' => 'Start installasjonen på nytt',
- 'config-page-readme' => 'Les meg',
- 'config-page-releasenotes' => 'Utgivelsesnotat',
- 'config-page-copying' => 'Kopiering',
- 'config-page-upgradedoc' => 'Oppgradering',
- 'config-page-existingwiki' => 'Eksisterende wiki',
- 'config-help-restart' => 'Ønsker du å fjerne alle lagrede data som du har skrevet inn og starte installasjonsprosessen på nytt?',
- 'config-restart' => 'Ja, start på nytt',
- 'config-welcome' => '=== Miljøsjekker ===
-Grunnleggende sjekker utføres for å se om dette miljøet er egnet for en MediaWiki-installasjon.
-Du bør oppgi resultatene fra disse sjekkene om du trenger hjelp under installasjonen.',
- 'config-copyright' => "=== Opphavsrett og vilkår ===
-
-$1
-
-MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
-
-Dette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.
-Se GNU General Public License for flere detaljer.
-
-Du skal ha mottatt <doclink href=Copying>en kopi av GNU General Public License</doclink> sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [http://www.gnu.org/copyleft/gpl.html les det på nettet].",
- 'config-sidebar' => '* [//www.mediawiki.org MediaWiki hjem]
-* [//www.mediawiki.org/wiki/Help:Contents Brukerguide]
-* [//www.mediawiki.org/wiki/Manual:Contents Administratorguide]
-* [//www.mediawiki.org/wiki/Manual:FAQ OSS]
-----
-* <doclink href=Readme>Les meg</doclink>
-* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>
-* <doclink href=Copying>Kopiering</doclink>
-* <doclink href=UpgradeDoc>Oppgradering</doclink>',
- 'config-env-good' => 'Miljøet har blitt sjekket.
-Du kan installere MediaWiki.',
- 'config-env-bad' => 'Miljøet har blitt sjekket.
-Du kan installere MediaWiki.',
- 'config-env-php' => 'PHP $1 er innstallert.',
- 'config-env-php-toolow' => 'PHP $1 er installert.
-MediaWiki krever imidlertid PHP $2 eller høyere.',
- 'config-unicode-using-utf8' => 'Bruker Brion Vibbers utf8_normalize.so for Unicode-normalisering.',
- 'config-unicode-using-intl' => 'Bruker [http://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.',
- 'config-unicode-pure-php-warning' => "'''Advarsel''': [http://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.
-Om du kjører et nettsted med høy trafikk bør du lese litt om [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisering].",
- 'config-unicode-update-warning' => "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.
-Du bør [//www.mediawiki.org/wiki/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
- 'config-no-db' => 'Fant ikke en passende databasedriver! Du må installere en databasedriver for PHP.
-Følgende databasetyper er støttet: $1
-
-Om du er på delt vertsskap, spør din vertsleverandør om å installere en passende databasedriver.
-Om du kompilerte PHP selv, rekonfigirer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.
-Om du installerte PHP fra en Debian- eller Ubuntu-pakke må du også installere modulen php5-mysql.',
- 'config-no-fts3' => "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
- 'config-register-globals' => "'''Advarsel: PHPs <code>[http://php.net/register_globals register_globals]</code>-alternativ er aktivert.'''
-'''Deaktiver det om du kan.'''
-MediaWiki vil fungere, men tjeneren din er utsatt for potensielle sikkerhetssårbarheter.",
- 'config-magic-quotes-runtime' => "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] er aktiv!'''
-Dette alternativet ødelegger inndata på en uforutsigbar måte.
-Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
- 'config-magic-quotes-sybase' => "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''
-Dette alternativet ødelegger inndata på en uforutsigbar måte.
-Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
- 'config-mbstring' => "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''
-Dette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.
-Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
- 'config-ze1' => "'''Kritisk: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] er aktiv!'''
-Dette alternativet fører til horrible feil med MediaWiki.
-Du kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
- 'config-safe-mode' => "'''Advarsel:''' PHPs [http://www.php.net/features.safe-mode safe mode] er aktiv.
-Det kan føre til problem, spesielt hvis du bruker støtte for filopplastinger og <code>math</code>.",
- 'config-xml-bad' => 'PHPs XML-modul mangler.
-MediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.
-Hvis du kjører Mandrak, installer pakken php-xml.',
- 'config-pcre' => 'PCRE-støttemodulen ser ut til å mangle.
-MediaWiki krever funksjonene for de Perl-kompatible regulære uttrykkene for å virke.',
- 'config-pcre-no-utf8' => "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.
-MediaWiki krever UTF-8-støtte for å fungere riktig.",
- 'config-memory-raised' => 'PHPs <code>memory_limit</code> er $1, økt til $2.',
- 'config-memory-bad' => "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.
-Dette er sannsynligvis for lavt.
-Installasjonen kan mislykkes!",
- 'config-xcache' => '[http://xcache.lighttpd.net/ XCache] er innstallert',
- 'config-apc' => '[http://www.php.net/apc APC] er innstallert',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] er innstallert',
- 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] er installert',
- 'config-no-cache' => "'''Advarsel:''' Kunne ikke finne [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].
-Objekthurtiglagring er ikke aktivert.",
- 'config-mod-security' => "'''Advarsel''': Din web-tjener har [http://modsecurity.org/ mod_security] påslått. Hvis denne er feilinnstilt, kan det gi problemer for MediaWiki eller annen programvare som tillater brukere å poste vilkårlig innhold.
-Sjekk [http://modsecurity.org/documentation/ mod_security-dokumentasjonen] eller ta kontakt med din nettleverandør hvis du opplever tilfeldige feil.",
- 'config-diff3-bad' => 'GNU diff3 ikke funnet.',
- 'config-imagemagick' => 'Fant ImageMagick: <code>$1</code>.
-Bildeminiatyrisering vil aktiveres om du aktiverer opplastinger.',
- 'config-gd' => 'Fant innebygd GD-grafikkbibliotek.
-Bildeminiatyrisering vil aktiveres om du aktiverer opplastinger.',
- 'config-no-scaling' => 'Kunne ikke finne GD-bibliotek eller ImageMagick.
-Bildeminiatyrisering vil være deaktivert.',
- 'config-no-uri' => "'''Feil:''' Kunne ikke bestemme gjeldende URI.
-Installasjon avbrutt.",
- 'config-no-cli-uri' => "'''Advarsel''': Ingen --scriptpath er angitt; bruker standard: <code>$1</code>.",
- 'config-using-server' => 'Bruker servernavnet "<nowiki>$1</nowiki>".',
- 'config-using-uri' => 'Bruker server-URL "<nowiki>$1$2</nowiki>".',
- 'config-uploads-not-safe' => "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.
-Selv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [//www.mediawiki.org/wiki/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
- 'config-no-cli-uploads-check' => "'''Advarsel:''' Din standard-katalog for opplastinger (<code>$1</code>) er ikke kontrollert for sårbarhet overfor vilkårlig skript-kjøring under CLI-installasjonen.",
- 'config-brokenlibxml' => 'Ditt system har en kombinasjon av PHP- og libxml2-versjoner som er feilaktige og kan forårsake skjult dataødeleggelse i MediaWiki og andre web-applikasjoner.
-Oppgrader til PHP 5.2.9 eller nyere og libxml 2 2.7.3 eller nyere ([//bugs.php.net/bug.php?id=45996 Feil-liste for PHP]).
-Installasjon abortert.',
- 'config-using531' => 'MediaWiki kan ikke brukes med PHP $1 på grunn av en feil med referanseparametere til <code>__call()</code>.
-Oppgrader til PHP 5.3.2 eller høyere, eller nedgrader til PHP 5.3.0 for å løse dette.
-Installasjonen avbrutt.',
- 'config-suhosin-max-value-length' => 'Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki\'s ResourceLoader-komponent klarer å komme rundt denne begrensningen, med med redusert ytelse. På mulig bør du sette suhosin.get.max_value_length til minst 1024 i php.ini, og sette $wgResourceLoaderMaxQueryLength til samme verdi i LocalSettings.php.',
- 'config-db-type' => 'Databasetype:',
- 'config-db-host' => 'Databasevert:',
- 'config-db-host-help' => 'Hvis databasetjeneren er på en annen tjener, skriv inn vertsnavnet eller IP-adressen her.
-
-Hvis du bruker en delt nettvert bør verten din oppgi det korrekte vertsnavnet i deres dokumentasjon.
-
-Hvis du installerer på en Windowstjener og bruker MySQL kan det hende at «localhost» ikke virker som tjenernavnet. Hvis ikke, prøv «127.0.0.1» for den lokale IP-adressen.',
- 'config-db-host-oracle' => 'Database TNS:',
- 'config-db-host-oracle-help' => 'Skriv inn et gyldig [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; en tnsnames.ora-fil må være synlig for installasjonsprosessen.<br />Hvis du bruker klientbibliotek 10g eller nyere kan du også bruke navngivingsmetoden [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
- 'config-db-wiki-settings' => 'Identifiser denne wikien',
- 'config-db-name' => 'Databasenavn:',
- 'config-db-name-help' => 'Velg et navn som identifiserer wikien din.
-Det bør ikke inneholde mellomrom.
-
-Hvis du bruker en delt nettvert vil verten din enten gi deg et spesifikt databasenavn å bruke, eller la deg opprette databaser via kontrollpanelet.',
- 'config-db-name-oracle' => 'Databaseskjema:',
- 'config-db-install-account' => 'Brukerkonto for installasjon',
- 'config-db-username' => 'Databasebrukernavn:',
- 'config-db-password' => 'Databasepassord:',
- 'config-db-password-empty' => 'Skriv inn et passord for den nye databasebrukeren: $1.
-Det er mulig å opprette brukere uten passord, men dette er ikke sikkert.',
- 'config-db-install-username' => 'Skriv inn brukernavnet som vil bli brukt til å koble til databasen under installasjonsprosessen.
-Dette er ikke brukernavnet på MediaWiki-kontoen; dette er brukernavnet for databasen din.',
- 'config-db-install-password' => 'Skriv inn passordet som vil bli brukt til å koble til databasen under installasjonsprosessen.
-Dette er ikke passordet på MediaWiki-kontoen; dette er passordet for databasen din.',
- 'config-db-install-help' => 'Skriv inn brukernavnet og passordet som vil bli brukt for å koble til databasen under installasjonsprosessen.',
- 'config-db-account-lock' => 'Bruk det samme brukernavnet og passordet under normal drift',
- 'config-db-wiki-account' => 'Brukerkonto for normal drift',
- 'config-db-wiki-help' => 'Skriv inn brukernavnet og passordet som vil bli brukt til å koble til databasen under normal wikidrift.
-Hvis kontoen ikke finnes, og installasjonskontoen har tilstrekkelige privilegier, vil denne brukerkontoen bli opprettet med et minimum av privilegier, tilstrekkelig for å operere wikien.',
- 'config-db-prefix' => 'Databasetabellprefiks:',
- 'config-db-prefix-help' => 'Hvis du trenger å dele en database mellom flere wikier, eller mellom MediaWiki og andre nettapplikasjoner, kan du velge å legge til et prefiks til alle tabellnavnene for å unngå konflikter.
-Ikke bruk mellomrom.
-
-Dette feltet er vanligvis tomt.',
- 'config-db-charset' => 'Databasetegnsett',
- 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binær',
- 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
- 'config-charset-mysql4' => 'MySQL 4.0 bakoverkompatibel UTF-8',
- 'config-charset-help' => "'''Advarsel:''' Hvis du bruker '''bakoverkompatibel UTF-8''' på MySQL 4.1+, og deretter sikkerhetskopierer databasen med <code>mysqldump</code> kan det ødelegge alle ikke-ASCII tegn og irreversibelt ødelegge dine sikkerhetskopier!
-
-I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.
-Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.
-I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
-men det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
- 'config-mysql-old' => 'MySQL $1 eller senere kreves, du har $2.',
- 'config-db-port' => 'Databaseport:',
- 'config-db-schema' => 'Skjema for MediaWiki',
- 'config-db-schema-help' => 'Dette skjemaet er som regel riktig.
-Bare endre det hvis du vet at du trenger det.',
- 'config-sqlite-dir' => 'SQLite datamappe:',
- 'config-sqlite-dir-help' => "SQLite lagrer alle data i en enkelt fil.
-
-Mappen du oppgir må være skrivbar for nettjeneren under installasjonen.
-
-Den bør '''ikke''' være tilgjengelig fra nettet, dette er grunnen til at vi ikke legger det der PHP-filene dine er.
-
-Installasjonsprogrammet vil skrive en <code>.htaccess</code>-fil sammen med det, men om det mislykkes kan noen få tilgang til din råe database. Dette inkluderer rå brukerdata (e-postadresser, hashede passord) samt slettede revisjoner og andre begrensede data på wikien.
-
-Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/mediawiki/yourwiki</code>.",
- 'config-oracle-def-ts' => 'Standard tabellrom:',
- 'config-oracle-temp-ts' => 'Midlertidig tabellrom:',
- 'config-type-mysql' => 'MySQL',
- 'config-type-postgres' => 'PostgreSQL',
- 'config-type-sqlite' => 'SQLite',
- 'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
- 'config-support-info' => 'MediaWiki støtter følgende databasesystem:
-
-$1
-
-Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg instruksjonene det er lenket til over for å aktivere støtte.',
- 'config-support-mysql' => '* $1 er det primære målet for MediaWiki og er best støttet ([http://www.php.net/manual/en/mysql.installation.php hvordan kompilere PHP med MySQL-støtte])',
- 'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). 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.',
- '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»',
- 'config-missing-db-server-oracle' => 'Du må skrive inn en verdi for «Database TNS»',
- 'config-invalid-db-server-oracle' => 'Ugyldig database-TNS «$1».
-Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_) og punktum (.).',
- 'config-invalid-db-name' => 'Ugyldig databasenavn «$1».
-Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).',
- 'config-invalid-db-prefix' => 'Ugyldig databaseprefiks «$1».
-Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).',
- 'config-connection-error' => '$1.
-
-Sjekk verten, brukernavnet og passordet nedenfor og prøv igjen.',
- 'config-invalid-schema' => 'Ugyldig skjema for MediaWiki «$1».
-Bruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9) og undestreker (_).',
- 'config-db-sys-create-oracle' => 'Installasjonsprogrammet støtter kun bruk av en SYSDBA-konto for opprettelse av en ny konto.',
- 'config-db-sys-user-exists-oracle' => 'Brukerkontoen «$1» finnes allerede. SYSDBA kan kun brukes for oppretting av nye kontoer!',
- 'config-postgres-old' => 'PostgreSQL $1 eller senere kreves, du har $2.',
- 'config-sqlite-name-help' => 'Velg et navn som identifiserer wikien din.
-Ikke bruk mellomrom eller bindestreker.
-Dette vil bli brukt til SQLite-datafilnavnet.',
- 'config-sqlite-parent-unwritable-group' => 'Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.
-
-Installasjonsprogrammet har bestemt brukeren nettjeneren din kjører som.
-Gjør <code><nowiki>$3</nowiki></code>-mappen skrivbar for denne for å fortsette.
-På et Unix/Linux-system, gjør:
-
-<pre>cd $2
-mkdir $3
-chgrp $4 $3
-chmod g+w $3</pre>',
- 'config-sqlite-parent-unwritable-nogroup' => 'Kan ikke opprette datamappen <code><nowiki>$1</nowiki></code> fordi foreldremappen <code><nowiki>$2</nowiki></code> ikke er skrivbar for nettjeneren.
-
-Installasjonsprogrammet kunne ikke bestemme brukeren nettjeneren din kjører som.
-Gjør <code><nowiki>$3</nowiki></code>-mappen globalt skrivbar for denne (og andre!) for å fortsette.
-På et Unix/Linux-system, gjør:
-
-<pre>cd $2
-mkdir $3
-chmod a+w $3</pre>',
- 'config-sqlite-mkdir-error' => 'Feil under oppretting av datamappen «$1».
-Sjekk plasseringen og prøv igjen.',
- 'config-sqlite-dir-unwritable' => 'Kan ikke skrive til mappen «$1».
-Endre dens tilganger slik at nettjeneren kan skrive til den og prøv igjen.',
- 'config-sqlite-connection-error' => '$1.
-
-Sjekk datamappen og databasenavnet nedenfor og prøv igjen.',
- 'config-sqlite-readonly' => 'Filen <code>$1</code> er ikke skrivbar.',
- 'config-sqlite-cant-create-db' => 'Kunne ikke opprette databasefilen <code>$1</code>.',
- 'config-sqlite-fts3-downgrade' => 'PHP mangler FTS3-støtte, nedgraderer tabeller',
- 'config-can-upgrade' => "Det er MediaWiki-tabeller i denne databasen.
-For å oppgradere dem til MediaWiki $1, klikk '''Fortsett'''.",
- 'config-upgrade-done' => "Oppgradering fullført.
-
-Du kan nå [$1 begynne å bruke wikien din].
-
-Hvis du ønsker å regenerere <code>LocalSettings.php</code>-filen din, klikk på knappen nedenfor.
-Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
- 'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
-
-Du kan nå [$1 begynne å bruke wikien din].',
- 'config-regenerate' => 'Regenerer LocalSettings.php →',
- 'config-show-table-status' => 'SHOW TABLE STATUS etterspørselen mislyktes!',
- 'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
- 'config-db-web-account' => 'Databasekonto for nettilgang',
- 'config-db-web-help' => 'Velg brukernavnet og passordet som nettjeneren skal bruke for å koble til databasetjeneren under ordinær drift av wikien.',
- 'config-db-web-account-same' => 'Bruk samme konto som for installasjonen',
- 'config-db-web-create' => 'Opprett kontoen om den ikke finnes allerede',
- 'config-db-web-no-create-privs' => 'Kontoen du oppga for installasjonen har ikke nok privilegier til å opprette en konto.
-Kontoen du oppgir her må finnes allerede.',
- 'config-mysql-engine' => 'Lagringsmotor:',
- 'config-mysql-innodb' => 'InnoDB',
- 'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-engine-help' => "'''InnoDB''' er nesten alltid det beste alternativet siden den har god støtte for samtidighet («concurrency»).
-
-'''MyISAM''' kan være raskere i enbruker- eller les-bare-installasjoner.
-MyISAM-databaser har en tendens til å bli ødelagt oftere enn InnoDB-databaser.",
- 'config-mysql-charset' => 'Databasetegnsett:',
- 'config-mysql-binary' => 'Binær',
- 'config-mysql-utf8' => 'UTF-8',
- 'config-mysql-charset-help' => "I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.
-Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.
-
-I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
-men det vil ikke la deg lagre tegn over «[//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.',
- 'config-project-namespace' => 'Prosjektnavnerom:',
- 'config-ns-generic' => 'Prosjekt',
- 'config-ns-site-name' => 'Samme som wikinavnet: $1',
- 'config-ns-other' => 'Annet (spesifiser)',
- 'config-ns-other-default' => 'MyWiki',
- 'config-project-namespace-help' => "Etter Wikipedias eksempel holder mange wikier deres sider med retningslinjer atskilt fra sine innholdssider, i et «'''prosjektnavnerom'''».
-Alle sidetitler i dette navnerommet starter med et gitt prefiks som du kan angi her.
-Tradisjonelt er dette prefikset avledet fra navnet på wikien, men det kan ikke innholde punkttegn som «#» eller «:».",
- 'config-ns-invalid' => 'Det angitte navnerommet «<nowiki>$1</nowiki>» er ugyldig.
-Angi et annet prosjektnavnerom.',
- 'config-ns-conflict' => 'Det angitte navnerommet «<nowiki>$1</nowiki>» er i konflikt med et standard MediaWiki-navnerom.
-Angi et annet prosjekt-navnerom.',
- 'config-admin-box' => 'Administratorkonto',
- 'config-admin-name' => 'Ditt navn:',
- 'config-admin-password' => 'Passord:',
- 'config-admin-password-confirm' => 'Passord igjen:',
- 'config-admin-help' => 'Skriv inn ditt ønskede brukernavn her, for eksempel «Joe Bloggs».
-Dette er navnet du vil bruke for å logge inn på denne wikien.',
- 'config-admin-name-blank' => 'Skriv inn et administratorbrukernavn.',
- 'config-admin-name-invalid' => 'Det angitte brukernavnet «<nowiki>$1</nowiki>» er ugyldig.
-Angi et annet brukernavn.',
- 'config-admin-password-blank' => 'Skriv inn et passord for administratorkontoen.',
- 'config-admin-password-same' => 'Passordet skal ikke være det samme som brukernavnet.',
- 'config-admin-password-mismatch' => 'De to passordene du skrev inn samsvarte ikke.',
- 'config-admin-email' => 'E-postadresse:',
- 'config-admin-email-help' => 'Skriv inn en e-postadresse her for at du skal kunne motta e-post fra andre brukere på wikien, tilbakestille passordet ditt, og bli varslet om endringer på sider på overvåkningslisten din. Du kan la dette feltet stå tomt.',
- 'config-admin-error-user' => 'Intern feil ved opprettelse av en admin med navnet «<nowiki>$1</nowiki>».',
- 'config-admin-error-password' => 'Intern feil ved opprettelse av passord for admin «<nowiki>$1</nowiki>»: <pre>$2</pre>',
- 'config-admin-error-bademail' => 'Du har skrevet inn en ugyldig e-postadresse.',
- 'config-subscribe' => 'Abonner på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlisten for utgivelsesannonseringer].',
- 'config-subscribe-help' => 'Dette er en lav-volums e-postliste brukt til utgivelsesannonseringer, herunder viktige sikkerhetsannonseringer.
-Du bør abonnere på den og oppdatere MediaWikiinstallasjonen din når nye versjoner kommer ut.',
- 'config-almost-done' => 'Du er nesten ferdig!
-Du kan hoppe over de resterende konfigurasjonene og installere wikien nå.',
- 'config-optional-continue' => 'Spør meg flere spørsmål.',
- 'config-optional-skip' => 'Jeg er lei, bare installer wikien.',
- 'config-profile' => 'Brukerrettighetsprofil:',
- 'config-profile-wiki' => 'Tradisjonell wiki',
- 'config-profile-no-anon' => 'Kontoopprettelse påkrevd',
- 'config-profile-fishbowl' => 'Kun autoriserte bidragsytere',
- 'config-profile-private' => 'Privat wiki',
- 'config-profile-help' => "Wikier fungerer best når du lar så mange mennesker som mulig redigere den.
-I MediaWiki er det lett å revidere siste endringer og tilbakestille eventuell skade som er gjort av naive eller ondsinnede brukere.
-
-Imidlertid har mange funnet at MediaWiki er nyttig i mange roller, og av og til er det ikke lett å overbevise alle om fordelene med wikimåten.
-SÃ¥ du har valget.
-
-En '''{{int:config-profile-wiki}}''' tillater alle å redigere, selv uten å logge inn.
-En wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men kan avskrekke tilfeldige bidragsytere.
-
-'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.
-En '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, den samme gruppen som får lov til å redigere dem.
-
-Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [//www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].",
- 'config-license' => 'Opphavsrett og lisens:',
- 'config-license-cc-by-sa' => 'Creative Commons Navngivelse Del på samme vilkår',
- 'config-license-cc-by-nc-sa' => 'Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår',
- 'config-license-cc-0' => 'Creative Commons Zero',
- 'config-license-pd' => 'Offentlig rom',
- 'config-license-cc-choose' => 'Velg en egendefinert Creative Commons-lisens',
- 'config-email-settings' => 'E-postinnstillinger',
- 'config-enable-email' => 'Aktiver utgående e-post',
- 'config-enable-email-help' => 'Hvis du vil at e-post skal virke må [http://www.php.net/manual/en/mail.configuration.php PHPs e-postinnstillinger] bli konfigurert riktig.
-Hvis du ikke ønsker noen e-postfunksjoner kan du deaktivere dem her.',
- 'config-email-user' => 'Aktiver e-post mellom brukere',
- 'config-email-user-help' => 'Tillat alle brukere å sende hverandre e-post hvis de har aktivert det i deres innstillinger.',
- 'config-email-usertalk' => 'Aktiver brukerdiskusjonssidevarsler',
- 'config-email-usertalk-help' => 'Tillat brukere å motta varsler ved endringer på deres brukerdiskusjonsside hvis de har aktivert dette i deres innstillinger.',
- 'config-email-watchlist' => 'Aktiver overvåkningslistevarsler',
- 'config-email-watchlist-help' => 'Tillat brukere å motta varsler ved endringer på deres overvåkede sider hvis de har aktivert dette i deres innstillinger.',
- 'config-email-auth' => 'Aktiver e-postautentisering',
- 'config-email-auth-help' => "Om dette alternativet er aktivert må brukere bekrefte sin e-postadresse ved å bruke en lenke som blir sendt til dem når de setter eller endrer adressen sin.
-Kun autentiserte e-postadresser kan motta e-post fra andre brukere eller endringsvarsel.
-Å sette dette valget er '''anbefalt''' for offentlige wikier på grunn av potensiell misbruk av e-postfunksjonene.",
- 'config-email-sender' => 'Svar-e-postadresse:',
- 'config-email-sender-help' => 'Skriv inn e-postadressen som skal brukes som svar-adresse ved utgående e-post.
-Det er hit returmeldinger vil bli sendt.
-Mange e-posttjenere krever at minst domenenavnet må være gyldig.',
- 'config-upload-settings' => 'Bilde- og filopplastinger',
- 'config-upload-enable' => 'Aktiver filopplastinger',
- 'config-upload-help' => 'Filopplastinger kan potensielt utsette tjeneren din for sikkerhetsrisikoer.
-For mer informasjon, les [//www.mediawiki.org/wiki/Manual:Security sikkerhetsseksjonen] i manualen.
-
-For å aktivere filopplastinger, endre modusen i <code>images</code>-undermappen i MediaWikis rotmappe slik at nettjeneren kan skrive til den.
-Aktiver så dette alternativet.',
- 'config-upload-deleted' => 'Mappe for slettede filer:',
- 'config-upload-deleted-help' => 'Velg en mappe for å arkivere slettede filer.
-Ideelt burde ikke denne være tilgjengelig for nettet.',
- 'config-logo' => 'Logo-URL:',
- 'config-logo-help' => 'MediaWikis standarddrakt inkluderer plass til en 135x160 pikslers logo i øvre venstre hjørne.
-Last opp et bilde i passende størrelse og skriv inn nettadressen her.
-
-Hvis du ikke ønsker en logo, la denne boksen være tom.',
- 'config-instantcommons' => 'Aktiver Instant Commons',
- 'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [//commons.wikimedia.org/ Wikimedia Commons].
-For å gjøre dette krever MediaWiki tilgang til internett.
-
-For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man setter opp dette for andre wikier enn Wikimedia Commons, konsulter [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos manualen].',
- 'config-cc-again' => 'Velg igjen...',
- 'config-cc-not-chosen' => 'Velg hvilken Creative Commons-lisens du ønsker og klikk «fortsett».',
- 'config-advanced-settings' => 'Avansert konfigurasjon',
- 'config-extensions' => 'Utvidelser',
- 'config-install-step-done' => 'ferdig',
- 'config-install-step-failed' => 'mislyktes',
- 'config-install-extensions' => 'Inkludert utvidelser',
- 'config-install-database' => 'Setter opp database',
- 'config-install-user' => 'Oppretter databasebruker',
- 'config-install-user-alreadyexists' => 'Brukeren «$1» finnes allerede',
- 'config-install-user-create-failed' => 'Opprettelse av brukeren «$1» mislyktes: $2',
- 'config-install-user-grant-failed' => 'Å gi tillatelse til brukeren «$1» mislyktes: $2',
- 'config-install-tables' => 'Oppretter tabeller',
- 'config-install-mainpage-failed' => 'Kunne ikke sette inn hovedside: $1',
- 'config-help' => 'hjelp',
- 'mainpagetext' => "'''MediaWiki-programvaren er nå installert.'''",
- 'mainpagedocfooter' => 'Se [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for informasjon om hvordan du bruker wiki-programvaren.
-
-==Ã… starte==
-*[//www.mediawiki.org/wiki/Manual:Configuration_settings Oppsettsliste]
-*[//www.mediawiki.org/wiki/Manual:FAQ Ofte stilte spørsmål]
-*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]',
-);
-
/** Occitan (Occitan) */
$messages['oc'] = array(
'mainpagetext' => "'''MediaWiki es estat installat amb succès.'''",
@@ -12156,6 +12743,18 @@ $messages['oc'] = array(
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]",
);
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
+ */
+$messages['or'] = array(
+ 'config-back' => '↠ପଛକà­',
+ 'config-continue' => 'ଚାଲà­à¬°à¬–ିବେ →',
+ 'config-page-language' => 'ଭାଷା',
+ 'config-page-welcome' => 'ମେଡିଆଉଇକିକୠଆପଣଙà­à¬•à­ ସà­à¬µà¬¾à¬—ତ',
+ 'config-page-name' => 'ନାମ',
+ 'config-page-options' => 'ପସନà­à¬¦à¬¸à¬®à­‚ହ',
+);
+
/** Ossetic (Ирон)
* @author Amikeco
*/
@@ -12189,6 +12788,11 @@ $messages['pcd'] = array(
* @author Xqt
*/
$messages['pdc'] = array(
+ 'config-continue' => 'Weider →',
+ 'config-page-language' => 'Schprooch',
+ 'config-admin-password' => 'Paesswatt:',
+ 'config-install-step-done' => 'geduh',
+ 'config-help' => 'Hilf',
'mainpagedocfooter' => "Hilf fer's Yuuse unn Konfiguriere vun de Wiki-Software kansch finne im [//meta.wikimedia.org/wiki/Help:Contents Handbuch fer Yuuser].
== Hilf zum Schtaerte ==
@@ -12327,9 +12931,8 @@ To jest prawdopodobnie zbyt mało.
Instalacja może się nie udać!",
'config-xcache' => '[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany',
'config-apc' => '[Http://www.php.net/apc APC] jest zainstalowany',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] jest zainstalowany',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany',
- 'config-no-cache' => "'''Uwaga:''' Nie można odnaleźć [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] lub [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Uwaga:''' Nie można odnaleźć [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] lub [http://www.iis.net/download/WinCacheForPhp WinCache].
Buforowanie obiektów nie będzie możliwe.",
'config-diff3-bad' => 'Nie znaleziono GNU diff3.',
'config-imagemagick' => 'Odnaleziono ImageMagick <code>$1</code>.
@@ -12532,7 +13135,7 @@ Wpisz nazwę licencji ręcznie.',
'config-advanced-settings' => 'Konfiguracja zaawansowana',
'config-cache-options' => 'Ustawienia buforowania obiektów',
'config-cache-none' => 'Brak buforowania (wszystkie funkcje będą działać, ale mogą wystąpić kłopoty z wydajnością na dużych witrynach wiki)',
- 'config-cache-accel' => 'Buforowania obiektów PHP (APC, eAccelerator, XCache lub WinCache)',
+ 'config-cache-accel' => 'Buforowania obiektów PHP (APC, XCache lub WinCache)',
'config-cache-memcached' => 'Użyj Memcached (wymaga dodatkowej instalacji i konfiguracji)',
'config-memcached-servers' => 'Serwery Memcached:',
'config-memcached-help' => 'Lista adresów IP do wykorzystania przez Memcached.
@@ -12686,9 +13289,8 @@ Sossì a l'é probabilment tròp bass.
L'instalassion a peul falì!",
'config-xcache' => "[http://xcache.lighttpd.net/ XCache] a l'é instalà",
'config-apc' => "[http://www.php.net/apc APC] a l'é instalà",
- 'config-eaccel' => "[http://eaccelerator.sourceforge.net/ eAccelerator] a l'é instalà",
'config-wincache' => "[http://www.iis.net/download/WinCacheForPhp WinCache] a l'é instalà",
- 'config-no-cache' => "'''Avis:''' As treuva pa [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache]. Ël buté d'oget an memòria local a l'é pa abilità.",
+ 'config-no-cache' => "'''Avis:''' As treuva pa [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache]. Ël buté d'oget an memòria local a l'é pa abilità.",
'config-diff3-bad' => 'GNU diff3 pa trovà.',
'config-imagemagick' => "Trovà ImageMagick: <code>$1</code>.
La miniaturisassion ëd figure a sarà abilità s'it abìlite le carie.",
@@ -12949,7 +13551,7 @@ S'a veul gnun-e marche, ch'a lassa ës camp bianch.",
'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à.
-Për pi d'anformassion su sta funsion, comprèise j'istrussion ëd com ampostela për wiki diferente da Wikimedia Commons, ch'a consulta [http://mediawiki.org/wiki/Manual:\$wgForeignFileRepos ël manual].",
+Për pi d'anformassion su sta funsion, comprèise j'istrussion ëd com ampostela për wiki diferente da Wikimedia Commons, ch'a consulta [//mediawiki.org/wiki/Manual:\$wgForeignFileRepos ël manual].",
'config-cc-error' => "La selession ëd la licensa Creative Commons a l'ha dàit gnun arzultà.
Ch'a anserissa ël nòm dla licensa a man.",
'config-cc-again' => 'Torna cheuje...',
@@ -12959,7 +13561,7 @@ Ch'a anserissa ël nòm dla licensa a man.",
'config-cache-help' => "La memorisassion loca d'oget a l'é dovrà për amelioré l'andi ëd MediaWiki an butant an local dij dat dovrà 'd soens.
Ij sit da mesan a gròss a son motobin ancoragià a abilité sòn, e ij sit cit a l'avran ëdcò dij benefissi.",
'config-cache-none' => "Gnun-a memorisassion local (gnun-a funsionalità gavà, ma l'andi a peul esse anfluensà an sij sit ëd wiki gròsse)",
- 'config-cache-accel' => "Memorisassion local d'oget PHP (APC, eAccelerator, XCache o WinCache)",
+ 'config-cache-accel' => "Memorisassion local d'oget PHP (APC, XCache o WinCache)",
'config-cache-memcached' => "Dovré Memcached (a ciama n'ampostassion e na configurassion adissionaj)",
'config-memcached-servers' => 'Servent Memcached:',
'config-memcached-help' => "Lista d'adrësse IP da dovré për Memcached.
@@ -13020,7 +13622,7 @@ $messages['pnt'] = array(
*/
$messages['prg'] = array(
'mainpagetext' => "'''MediaWiki's instalaciÅni izpalla.'''",
- 'mainpagedocfooter' => 'WÄ«dais [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] kÄi gaÅ«lai informaciÅnei ezze wiki prÅgramijas tÄ“rpausnan.
+ 'mainpagedocfooter' => 'WÄ«dais [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] kÄi gaÅ«lai infÅrmaciÅnei ezze wiki prÅgramijas tÄ“rpausnan.
== En pagaūseņu ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
@@ -13079,6 +13681,7 @@ $messages['ps'] = array(
/** Portuguese (Português)
* @author Crazymadlover
* @author Hamilton Abreu
+ * @author Mormegil
* @author Platonides
* @author SandroHc
* @author Waldir
@@ -13205,9 +13808,8 @@ Isto é provavelmente demasiado baixo.
A instalação poderá falhar!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] instalada',
'config-apc' => '[http://www.php.net/apc APC] instalada',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] instalado',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalada',
- 'config-no-cache' => "'''Aviso:''' Não foram encontrados [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] nem [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Aviso:''' Não foram encontrados [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.",
'config-diff3-bad' => 'O GNU diff3 não foi encontrado.',
'config-imagemagick' => 'Foi encontrado o ImageMagick: <code>$1</code>.
@@ -13525,7 +14127,7 @@ Se não pretende usar um logótipo, deixe este campo em branco.',
'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.
-Para mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos Manual Técnico].',
+Para mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Manual Técnico].',
'config-cc-error' => 'O auxiliar de escolha de licenças da Creative Commons não produziu resultados.
Introduza o nome da licença manualmente.',
'config-cc-again' => 'Escolha outra vez...',
@@ -13535,7 +14137,7 @@ Introduza o nome da licença manualmente.',
'config-cache-help' => 'A cache de objectos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.
Sites de tamanho médio ou grande são altamente encorajados a activar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.',
'config-cache-none' => 'Sem cache (não é removida nenhuma funcionalidade, mas a velocidade de operação pode ser afectada nas wikis grandes)',
- 'config-cache-accel' => 'Cache de objectos do PHP (APC, eAccelerator, XCache ou WinCache)',
+ 'config-cache-accel' => 'Cache de objectos 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.
@@ -13933,9 +14535,8 @@ MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ Ñ€
УÑтановка может потерпеть неудачу!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] уÑтановлен',
'config-apc' => '[http://www.php.net/apc APC] уÑтановлен',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] уÑтановлен',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] уÑтановлен',
- 'config-no-cache' => "'''Внимание:''' Ðе найдены [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Внимание:''' Ðе найдены [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] или [http://www.iis.net/download/WinCacheForPhp WinCache].
КÑширование объектов будет отключено.",
'config-mod-security' => "'''Внимание''': на вашем веб-Ñервере включен [http://modsecurity.org/ mod_security]. При неправильной наÑтройке он может вызывать проблемы Ð´Ð»Ñ MediaWiki или другого ПО, позволÑющего пользователÑм отправлÑÑ‚ÑŒ на Ñервер произвольный текÑÑ‚.
ОбратитеÑÑŒ к [http://modsecurity.org/documentation/ документации mod_security] или в поддержку вашего хоÑтера, еÑли при работе возникают непонÑтные ошибки.",
@@ -14251,7 +14852,7 @@ GFDL может быть иÑпользована, но она Ñложна дл
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — Ñто функциÑ, позволÑÑŽÑ‰Ð°Ñ Ð¸Ñпользовать изображениÑ, звуки и другие медиафайлы Ñ Ð’Ð¸ÐºÐ¸Ñклада ([//commons.wikimedia.org/ Wikimedia Commons]).
Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñтой функции MediaWiki необходим доÑтуп к Интернету.
-Дополнительную информацию об Instant Commons, в том чиÑле ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾ том, как её наÑтроить Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… вики, отличных от ВикиÑклада, можно найти в [http://mediawiki.org/wiki/Manual:$wgForeignFileRepos руководÑтве].',
+Дополнительную информацию об Instant Commons, в том чиÑле ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾ том, как её наÑтроить Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… вики, отличных от ВикиÑклада, можно найти в [//mediawiki.org/wiki/Manual:$wgForeignFileRepos руководÑтве].',
'config-cc-error' => 'Механизм выбора лицензии Creative Commons не вернул результата.
Введите название лицензии вручную.',
'config-cc-again' => 'Выберите ещё раз…',
@@ -14261,7 +14862,7 @@ GFDL может быть иÑпользована, но она Ñложна дл
'config-cache-help' => 'КÑширование объектов иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÑкороÑти MediaWiki путем кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñто иÑпользуемых данных.
Ð”Ð»Ñ Ñредних и больших Ñайтов кеширование наÑтоÑтельно рекомендуетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒ, а Ð´Ð»Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ñ… Ñайтов кеширование может показать преимущеÑтво.',
'config-cache-none' => 'Без кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (никакой функционал не терÑетÑÑ, но крупные вики-Ñайты могут работать медленнее)',
- 'config-cache-accel' => 'PHP кÑширование объектов (APC, eAccelerator, XCache или WinCache)',
+ 'config-cache-accel' => 'PHP кÑширование объектов (APC, XCache или WinCache)',
'config-cache-memcached' => 'ИÑпользовать Memcached (требует дополнительной наÑтройки)',
'config-memcached-servers' => 'Сервера Memcached:',
'config-memcached-help' => 'СпиÑок IP-адреÑов, иÑпользуемых Memcached.
@@ -14546,7 +15147,6 @@ Vendar pa MediaWiki zahteva PHP $2 ali višji.',
'config-memory-raised' => 'PHP-jev <code>memory_limit</code> je $1, dvignjen na $2.',
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] je nameÅ¡Äen',
'config-apc' => '[http://www.php.net/apc APC] je nameÅ¡Äen',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] je nameÅ¡Äen',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] je nameÅ¡Äen',
'config-diff3-bad' => 'GNU diff3 ni bilo mogoÄe najti.',
'config-db-type' => 'Vrsta zbirke podatkov:',
@@ -14675,7 +15275,7 @@ Vnesite ime dovoljenja roÄno.',
'config-cc-again' => 'Izberi ponovno ...',
'config-cc-not-chosen' => 'Izberite dovoljenje Creative Commons, ki ga želite dodati, in kliknite »proceed«.',
'config-advanced-settings' => 'Napredna konfiguracija',
- 'config-cache-accel' => 'Predpomnjenje predmetov PHP (APC, eAccelerator, XCache ali WinCache)',
+ 'config-cache-accel' => 'Predpomnjenje predmetov PHP (APC, XCache ali WinCache)',
'config-cache-memcached' => 'Uporabi Memcached (zahteva dodatno namestitev in konfiguracijo)',
'config-memcached-servers' => 'Strežniki Memcached:',
'config-memcache-badip' => 'Vnesli ste neveljaven IP-naslov za Memcached: $1',
@@ -14751,6 +15351,12 @@ $messages['sr-ec'] = array(
/** Serbian (Latin script) (‪Srpski (latinica)‬) */
$messages['sr-el'] = array(
+ 'config-continue' => 'Nastavi →',
+ 'config-page-language' => 'Jezik',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
'mainpagetext' => "'''MedijaViki je uspešno instaliran.'''",
'mainpagedocfooter' => 'Molimo vidite [//meta.wikimedia.org/wiki/Help:Contents korisniÄki vodiÄ] za informacije o upotrebi viki softvera.
@@ -14843,12 +15449,15 @@ Du kan inte installera MediaWiki.',
MediaWiki kräver PHP $2 eller högre.',
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] är installerad',
'config-apc' => '[http://www.php.net/apc APC] är installerad',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] är installerad',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] är installerad',
+ 'config-diff3-bad' => 'GNU diff3 hittades inte.',
+ 'config-using-server' => 'Använder servernamn "<nowiki>$1</nowiki>".',
+ 'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
'config-db-wiki-settings' => 'Identifiera denna wiki',
'config-db-name' => 'Databasnamn:',
'config-db-username' => 'Databas-användarnamn:',
'config-db-password' => 'Databas-lösenord:',
+ 'config-db-schema' => 'Schema för MediaWiki',
'config-header-mysql' => 'MySQL-inställningar',
'config-header-postgres' => 'PostgreSQL-inställningar',
'config-header-sqlite' => 'SQLite-inställningar',
@@ -14865,6 +15474,19 @@ 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-upgrade-done' => "Uppgraderingen slutfördes.
+
+Du kan nu [$1 börja använda din wiki].
+
+Om du vill förnya din <code>LocalSettings.php</code>-fil, klicka på knappen nedan.
+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-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Namnet på wikin:',
+ 'config-site-name-blank' => 'Ange ett sidnamn.',
+ 'config-ns-generic' => 'Projekt',
'mainpagetext' => "'''MediaWiki har installerats utan problem.'''",
'mainpagedocfooter' => 'Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].
@@ -15145,9 +15767,8 @@ Ito ay maaaring napakababa.
Maaaring mabigo ang pagluluklok!",
'config-xcache' => 'Ininstala na ang [http://xcache.lighttpd.net/ XCache]',
'config-apc' => 'Ininstala na ang [http://www.php.net/apc APC]',
- 'config-eaccel' => 'Ininstala na ang [http://eaccelerator.sourceforge.net/ eAccelerator]',
'config-wincache' => 'Ininstala na ang [http://www.iis.net/download/WinCacheForPhp WinCache]',
- 'config-no-cache' => "'''Babala:''' Hindi mahanap ang [http://eaccelerator.sourceforge.net eAccelerator], [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
+ 'config-no-cache' => "'''Babala:''' Hindi mahanap ang [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
Hindi pinapagana ang pagbabaon ng mga bagay.",
'config-diff3-bad' => 'Hindi natagpuan ang GNU diff3.',
'config-imagemagick' => 'Natagpuan ang ImageMagick: <code>$1</code>.
@@ -15465,7 +16086,6 @@ $messages['uk'] = array(
Якщо уÑтановлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні вÑтановити php5-mysql модуль.',
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] вÑтановлено',
'config-apc' => '[http://www.php.net/apc APC] вÑтановлено',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] вÑтановлено',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] вÑтановлено',
'config-db-type' => 'Тип бази даних:',
'config-db-host' => 'ХоÑÑ‚ бази даних:',
@@ -15501,6 +16121,7 @@ $messages['uk'] = array(
'config-install-step-done' => 'виконано',
'config-install-step-failed' => 'не вдалоÑÑ',
'config-install-interwiki-list' => 'Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл <code>interwiki.list</code>.',
+ 'config-help' => 'допомога',
'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 поÑібнику кориÑтувача].
@@ -15650,6 +16271,8 @@ $messages['xal'] = array(
* @author פוילישער
*/
$messages['yi'] = array(
+ 'config-back' => '→ צוריק',
+ 'config-page-language' => 'שפר×ַך',
'config-admin-name' => '×ײַער × ×ָמען:',
'mainpagetext' => "'''מעדיעוויקי ×ינסט×לירט מיט דערפ×לג.'''",
'mainpagedocfooter' => "גיט זיך ×ן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents ב×ניצער'ס וועגווײַזער] פֿ×ר ×ינפֿ×רמ×ציע ווי×זוי זיך ב×נוצן מיט וויקי ווייכוו×ַרג.
@@ -15698,6 +16321,7 @@ $messages['zea'] = array(
/** Simplified Chinese (‪中文(简体)‬)
* @author Hydra
+ * @author Hzy980512
* @author PhiLiP
* @author Xiaomingyan
* @author 阿pp
@@ -15774,28 +16398,30 @@ $1',
'config-no-db' => '找ä¸åˆ°åˆé€‚çš„æ•°æ®åº“驱动ï¼æ‚¨éœ€è¦ä¸ºPHP安装数æ®åº“驱动。目å‰æ”¯æŒä»¥ä¸‹æ•°æ®åº“:$1。
如果您正在使用共享主机,请å‘您的主机æ供商申请安装åˆé€‚çš„æ•°æ®åº“驱动。如果您通过自行编译安装的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>选项被å¯ç”¨ã€‚请尽é‡ç¦ç”¨è¯¥åŠŸèƒ½ï¼Œ'''虽然ä¸ä¼šå½±å“MediaWikiçš„è¿è¡Œï¼Œä½†æ‚¨çš„æœåŠ¡å™¨ä¼šè¢«æš´éœ²ç»™æ½œåœ¨çš„安全æ¼æ´žã€‚",
- 'config-magic-quotes-runtime' => "'''致命错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被å¯ç”¨ï¼'''
+ 'config-magic-quotes-runtime' => "'''æ¯ç­æ€§é”™è¯¯ï¼š[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]å·²å¯ç”¨ï¼'''
此选项会无法预测地破å输入的数æ®ï¼Œè¯·å°†å…¶ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
- 'config-magic-quotes-sybase' => "'''致命错误:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]被å¯ç”¨ï¼'''
+ 'config-magic-quotes-sybase' => "'''æ¯ç­æ€§é”™è¯¯ï¼š[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]å·²å¯ç”¨ï¼'''
此选项会无法预测地破å输入的数æ®ï¼Œè¯·å°†å…¶ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
- 'config-mbstring' => "'''致命错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]被å¯ç”¨ï¼'''
+ 'config-mbstring' => "'''æ¯ç­æ€§é”™è¯¯ï¼š[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]å·²å¯ç”¨ï¼'''
此选项会导致错误并ä¸å¯é¢„测地破åæ•°æ®ï¼Œè¯·å°†å…¶ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
- 'config-ze1' => "'''致命错误:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]被å¯ç”¨ï¼'''
+ 'config-ze1' => "'''æ¯ç­æ€§é”™è¯¯ï¼š[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]å·²å¯ç”¨ï¼'''
此选项将导致MediaWiki出现æžå…¶ä¸¥é‡çš„故障,请将其ç¦ç”¨ï¼Œå¦åˆ™æ‚¨å°†ä¸èƒ½å®‰è£…或使用MediaWiki。",
'config-safe-mode' => "'''警告:'''PHPçš„[http://www.php.net/features.safe-mode 安全模å¼]å·²å¯ç”¨ã€‚它å¯èƒ½ä¼šå¯¼è‡´ä¸€äº›é—®é¢˜ï¼Œå°¤å…¶åœ¨å¯¹æ–‡ä»¶ä¸Šä¼ å’Œæ•°å­¦å…¬å¼<code>math</code>的支æŒæ–¹é¢ã€‚",
'config-xml-bad' => '缺少PHPçš„XML模å—。MediaWiki需è¦ä½¿ç”¨è¯¥æ¨¡å—æ供的函数,在当å‰é…置下将无法工作。如果您正在使用Mandrake Linux,请安装php-xml包。',
'config-pcre' => 'å¯èƒ½ç¼ºå°‘PCRE的支æŒæ¨¡å—。MediaWikiçš„è¿è¡Œéœ€è¦å…¼å®¹äºŽPerl的正则表达å¼å‡½æ•°ã€‚',
- 'config-pcre-no-utf8' => "'''致命错误''':PHPçš„PCRE模å—在编译时å¯èƒ½æ²¡æœ‰åŒ…å«PCRE_UTF8支æŒã€‚MediaWiki需è¦UTF-8支æŒæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚",
+ 'config-pcre-no-utf8' => "'''æ¯ç­æ€§é”™è¯¯''':PHPçš„PCRE模å—在编译时å¯èƒ½æ²¡æœ‰åŒ…å«PCRE_UTF8支æŒã€‚MediaWiki需è¦UTF-8支æŒæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚",
'config-memory-raised' => 'PHP的内存使用上é™<code>memory_limit</code>为$1,自动æå‡åˆ°$2。',
'config-memory-bad' => "'''警告:'''PHP的内存使用上é™<code>memory_limit</code>为$1。该设定å¯èƒ½è¿‡ä½Žï¼Œå¹¶å¯¼è‡´å®‰è£…失败ï¼",
+ 'config-ctype' => "'''æ¯ç­æ€§é”™è¯¯''':PHP必须有[http://www.php.net/manual/en/ctype.installation.php Ctype 扩展]æ¥æ”¯æŒç¼–译。",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache]已安装',
'config-apc' => '[http://www.php.net/apc APC]已安装',
- 'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator]已安装',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]已安装',
- 'config-no-cache' => "'''警告:'''找ä¸åˆ°[http://eaccelerator.sourceforge.net eAccelerator]ã€[http://www.php.net/apc APC]ã€[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],无法å¯ç”¨å¯¹è±¡ç¼“存。
+ 'config-no-cache' => "'''警告:'''找ä¸åˆ°[http://www.php.net/apc APC]ã€[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],无法å¯ç”¨å¯¹è±¡ç¼“存。
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-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你å¯ç”¨äº†ä¸Šä¼ åŠŸèƒ½ï¼Œç¼©ç•¥å›¾åŠŸèƒ½ä¹Ÿå°†è¢«å¯ç”¨ã€‚',
'config-gd' => '已找到内建的GD图形库。如果你å¯ç”¨äº†ä¸Šä¼ åŠŸèƒ½ï¼Œç¼©ç•¥å›¾åŠŸèƒ½ä¹Ÿå°†è¢«å¯ç”¨ã€‚',
@@ -15811,11 +16437,13 @@ Object caching is not enabled.",
'config-suhosin-max-value-length' => 'Suhosinå·²ç»å®‰è£…并将GET请求的å‚数长度é™åˆ¶åœ¨$1字节。MediaWikiçš„ResourceLoader部件å¯ä»¥åœ¨æ­¤é™åˆ¶ä¸‹æ­£å¸¸å·¥ä½œï¼Œä½†å…¶æ€§èƒ½ä¼šè¢«é™ä½Žã€‚如果å¯èƒ½ï¼Œè¯·åœ¨php.ini中将suhosin.get.max_value_length设为1024或更高值,并在LocalSettings.php中将$wgResourceLoaderMaxQueryLength设为åŒä¸€å€¼ã€‚',
'config-db-type' => 'æ•°æ®åº“类型:',
'config-db-host' => 'æ•°æ®åº“主机:',
- 'config-db-host-help' => '如果您的数æ®åº“ä½äºŽå¦ä¸€å°æœåŠ¡å™¨ä¸Šï¼Œåœ¨æ­¤è¾“入主机å或IP地å€ã€‚
+ 'config-db-host-help' => '如果您的数æ®åº“在别的æœåŠ¡å™¨ä¸Šï¼Œè¯·åœ¨è¿™é‡Œè¾“入它的域å或IP地å€ã€‚
-如果您使用的是共享web主机,您的主机æ供商应会在他们的文档中给出正确的主机å称。
+如果您在使用共享网站套é¤ï¼Œæ‚¨çš„网站商应该已在他们的控制é¢æ¿ä¸­ç»™æ‚¨æ•°æ®åº“ä¿¡æ¯äº†ã€‚
-如果您使用了WindowsæœåŠ¡å™¨å’ŒMySQLæ•°æ®åº“,使用“localhostâ€å¯èƒ½æ— æ³•è¯†åˆ«åˆ°æœ¬åœ°æœåŠ¡å™¨ã€‚如果是这样的è¯ï¼Œè¯·å°è¯•æŒ‡å®šæœ¬åœ°æœåŠ¡å™¨çš„IP地å€ä¸ºâ€œ127.0.0.1â€ã€‚',
+如果您在Windows中安装并且使用MySQL,“localhostâ€å¯èƒ½æ— æ•ˆã€‚如果确实无效,请输入“127.0.0.1â€ä½œä¸ºIP地å€ã€‚
+
+如果您在使用PostgreSQL,并且è¦ç”¨Unix socketæ¥è¿žæŽ¥ï¼Œè¯·ç•™ç©ºã€‚',
'config-db-host-oracle' => 'æ•°æ®åº“é€æ˜Žç½‘络底层(TNS):',
'config-db-host-oracle-help' => '请输入åˆæ³•çš„[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地连接å],并确ä¿tnsnames.ora文件对本安装程åºå¯è§ã€‚<br />如果您使用的客户端库为10g或更新的版本,您还å¯ä»¥ä½¿ç”¨[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 简å•è¿žæŽ¥å方法](easy connect naming method)。',
'config-db-wiki-settings' => '标识本wiki',
@@ -15933,7 +16561,7 @@ chmod a+w $3</pre>',
现在您å¯ä»¥[$1 开始使用您的wiki]了。',
'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
- 'config-show-table-status' => '查询SHOW TABLE STATUS失败ï¼',
+ 'config-show-table-status' => 'SHOW TABLE STATUS语å¥æ‰§è¡Œå¤±è´¥ï¼',
'config-unknown-collation' => "'''警告:'''æ•°æ®åº“使用了无法识别的整ç†ã€‚",
'config-db-web-account' => '供网页访问使用的数æ®åº“å¸å·',
'config-db-web-help' => '请指定在wiki执行普通æ“作时,网页æœåŠ¡å™¨ç”¨äºŽè¿žæŽ¥æ•°æ®åº“æœåŠ¡å™¨çš„用户å和密ç ã€‚',
@@ -16047,7 +16675,7 @@ GNU自由文档许å¯è¯æ˜¯ç»´åŸºç™¾ç§‘曾ç»ä½¿ç”¨è¿‡çš„许å¯è¯ï¼Œå¹¶è¿„今æœ
'config-instantcommons' => 'å¯ç”¨å³æ—¶å…±äº«èµ„æº',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons å³æ—¶å…±äº«èµ„æº]å¯ä»¥è®©wiki使用æ¥è‡ª[//commons.wikimedia.org/ 维基共享资æº]网站的图åƒã€éŸ³é¢‘和其他媒体文件。è¦å¯ç”¨è¯¥åŠŸèƒ½ï¼ŒMediaWiki必须能够访问互è”网。
-有关此功能的详细信æ¯ï¼ŒåŒ…括如何将其他wiki网站设为具有类似共享功能的方法,请å‚考[http://mediawiki.org/wiki/Manual:$wgForeignFileRepos 手册]。',
+有关此功能的详细信æ¯ï¼ŒåŒ…括如何将其他wiki网站设为具有类似共享功能的方法,请å‚考[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 手册]。',
'config-cc-error' => '知识共享许å¯è¯æŒ‘选器无法找到结果,请手动输入许å¯è¯çš„å称。',
'config-cc-again' => 'é‡æ–°æŒ‘选……',
'config-cc-not-chosen' => '选择您希望使用的知识共享许å¯è¯ï¼Œå¹¶ç‚¹å‡»â€œç»§ç»­â€ã€‚',
@@ -16055,7 +16683,7 @@ GNU自由文档许å¯è¯æ˜¯ç»´åŸºç™¾ç§‘曾ç»ä½¿ç”¨è¿‡çš„许å¯è¯ï¼Œå¹¶è¿„今æœ
'config-cache-options' => '对象缓存设置:',
'config-cache-help' => '对象缓存å¯é€šè¿‡ç¼“存频ç¹ä½¿ç”¨çš„æ•°æ®æ¥æ高MediaWiki的速度。高度推è中到大型的网站å¯ç”¨è¯¥åŠŸèƒ½ï¼Œå°åž‹ç½‘站亦能从其中å—益。',
'config-cache-none' => '无缓存(ä¸å½±å“功能,但对较大型的wiki网站会有速度影å“)',
- 'config-cache-accel' => 'PHP对象缓存(APCã€eAcceleratorã€XCache或WinCache)',
+ 'config-cache-accel' => 'PHP对象缓存(APCã€XCache或WinCache)',
'config-cache-memcached' => '使用Memcached(需è¦å¦å¤–安装并é…置)',
'config-memcached-servers' => 'MemcachedæœåŠ¡å™¨ï¼š',
'config-memcached-help' => '用于Memcachedçš„IP地å€åˆ—表。请ä¿æŒæ¯è¡Œä¸€æ¡ï¼Œå¹¶æŒ‡å®šè¦ä½¿ç”¨çš„端å£ã€‚例如:
@@ -16133,13 +16761,31 @@ $3
);
/** Traditional Chinese (‪中文(ç¹é«”)‬)
+ * @author Hzy980512
* @author Mark85296341
*/
$messages['zh-hant'] = array(
+ 'config-desc' => 'MediaWiki安è£ç¨‹åº',
+ 'config-title' => 'MediaWiki $1é…ç½®',
'config-information' => '資訊',
+ 'config-localsettings-upgrade' => '已檢測到<code>LocalSettings.php</code>文件。è¦å‡ç´šè©²é…置,請在下é¢çš„框中輸入<code>$wgUpgradeKey</code>的值。您å¯ä»¥åœ¨LocalSettings.php中找到它。',
+ 'config-localsettings-cli-upgrade' => '已檢測到LocalSettings.php文件。è¦å‡ç´šè©²é…置,請直接執行update.php。',
+ 'config-localsettings-key' => 'å‡ç´šå¯†é‘°ï¼š',
+ 'config-localsettings-badkey' => '您æ供的密鑰ä¸æ­£ç¢ºã€‚',
+ 'config-upgrade-key-missing' => '檢測到MediaWikiçš„é…置已經存在。若è¦å‡ç´šè©²é…置,請將下é¢ä¸€è¡Œæ–‡æœ¬æ·»åŠ åˆ°LocalSettings.php的底部:
+
+$1',
+ 'config-localsettings-incomplete' => '當å‰çš„LocalSettings.phpå¯èƒ½ä¸¦ä¸å®Œæ•´ï¼Œå› ç‚ºè®Šé‡$1沒有設置。請在LocalSettings.php設置該變é‡ï¼Œä¸¦å–®æ“Šâ€œç¹¼çºŒâ€ã€‚',
+ 'config-localsettings-connection-error' => '在使用LocalSettings.php或AdminSettings.php中指定的設置連接數據庫時發生錯誤。請修復相應設置並é‡è©¦ã€‚
+
+$1',
+ 'config-session-error' => '啟動會話出錯:$1',
+ 'config-session-expired' => '您的會話數據å¯èƒ½å·²ç¶“éŽæœŸï¼Œç•¶å‰æœƒè©±çš„使用期é™è¢«è¨­å®šç‚º$1。您å¯ä»¥åœ¨php.ini中設置<code>session.gc_maxlifetime</code>來延長此期é™ï¼Œä¸¦é‡æ–°å•Ÿå‹•æœ¬é…置程åºã€‚',
+ 'config-no-session' => '您的會話數據丟失了ï¼è«‹æª¢æŸ¥php.ini並確ä¿<code>session.save_path</code>被設置為é©ç•¶çš„目錄。',
'config-your-language' => '您的語言:',
'config-your-language-help' => 'é¸æ“‡ä¸€å€‹è¦ä½¿ç”¨çš„語言在安è£éŽç¨‹ä¸­ã€‚',
'config-wiki-language' => 'Wiki 語言:',
+ 'config-wiki-language-help' => 'é¸æ“‡å°‡è¦å®‰è£çš„wiki在多數情æ³ä¸‹ä½¿ç”¨çš„語言。',
'config-back' => 'â†è¿”回',
'config-continue' => '繼續→',
'config-page-language' => '語言',
@@ -16153,47 +16799,385 @@ $messages['zh-hant'] = array(
'config-page-complete' => '完æˆï¼',
'config-page-restart' => 'é‡æ–°å®‰è£',
'config-page-readme' => '讀我',
+ 'config-page-releasenotes' => '發布說明',
'config-page-copying' => '複製',
'config-page-upgradedoc' => 'å‡ç´š',
+ 'config-page-existingwiki' => '已有wiki',
+ 'config-help-restart' => '是å¦è¦æ¸…除所有已輸入且ä¿å­˜çš„數據,並é‡æ–°å•Ÿå‹•å®‰è£éŽç¨‹å—Žï¼Ÿ',
'config-restart' => '是的,é‡æ–°å•Ÿå‹•',
+ 'config-welcome' => '=== 環境檢查 ===
+å°ç•¶å‰ç’°å¢ƒæ˜¯å¦é©åˆå®‰è£MediaWiki作基本的檢查。如果您在安è£éŽç¨‹ä¸­éœ€è¦å¹«åŠ©ï¼Œè«‹æ供這些檢查的çµæžœã€‚',
+ 'config-copyright' => "=== 版權和æ¢æ¬¾ ===
+
+\$1
+
+本程åºç‚ºè‡ªç”±è»Ÿä»¶ï¼›æ‚¨å¯ä¾æ“šè‡ªç”±è»Ÿä»¶åŸºé‡‘會所發表的GNU通用公共授權æ¢æ¬¾è¦å®šï¼Œå°±æœ¬ç¨‹åºå†ç‚ºç™¼å¸ƒèˆ‡ï¼æˆ–修改;無論您ä¾æ“šçš„是本授權的第二版或(您自行é¸æ“‡çš„)任一日後發行的版本。
+
+本程åºæ˜¯åŸºæ–¼ä½¿ç”¨ç›®çš„而加以發布,然而'''ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»''';亦無å°'''é©å”®æ€§'''或'''特定目的é©ç”¨æ€§'''所為的默示性擔ä¿ã€‚詳情請åƒç…§GNU通用公共授權。
+
+您應已收到附隨於本程åºçš„<doclink href=\"Copying\">GNU通用公共授權的副本</doclink>;如果沒有,請寫信至自由軟件基金會:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在線閱讀]。",
+ 'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki/zh-hans MediaWiki首é ]
+* [//www.mediawiki.org/wiki/Help:Contents/zh-hans 用戶指å—]
+* [//www.mediawiki.org/wiki/Manual:Contents 管ç†å“¡æŒ‡å—]
+* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans 常見å•é¡Œè§£ç­”]
+----
+* <doclink href=Readme>自述文件</doclink>
+* <doclink href=ReleaseNotes>發行說明</doclink>
+* <doclink href=Copying>å”議副本</doclink>
+* <doclink href=UpgradeDoc>å‡ç´š</doclink>',
+ 'config-env-good' => '環境檢查已經完æˆã€‚您å¯ä»¥å®‰è£MediaWiki。',
+ 'config-env-bad' => '環境檢查已經完æˆã€‚您ä¸èƒ½å®‰è£MediaWiki。',
+ 'config-env-php' => 'PHP $1已安è£ã€‚',
+ 'config-env-php-toolow' => '已安è£PHP $1;但是,MediaWiki需è¦PHP $2或更高版本。',
+ 'config-unicode-using-utf8' => '使用Brion Vibberçš„utf8_normalize.so實ç¾Unicode正常化。',
+ 'config-unicode-using-intl' => '使用[http://pecl.php.net/intl intl PECL擴展]實ç¾Unicode正常化。',
+ 'config-unicode-pure-php-warning' => "'''警告''':[http://pecl.php.net/intl intl PECL擴展]無法處ç†Unicode正常化,故åªèƒ½é€€è€ŒæŽ¡ç”¨é‹è¡Œè¼ƒæ…¢çš„ç´”PHP實ç¾çš„方法。如果您é‹è¡Œç€ä¸€å€‹é«˜æµé‡çš„站點,請åƒé–±[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正常化]一文。",
+ 'config-unicode-update-warning' => "'''警告''':Unicode正常化å°è£å™¨çš„已安è£ç‰ˆæœ¬ä½¿ç”¨äº†èˆŠç‰ˆæœ¬çš„[http://site.icu-project.org/ ICUé …ç›®]庫。如果您需è¦ä½¿ç”¨Unicode,請將其[//www.mediawiki.org/wiki/Unicode_normalization_considerations å‡ç´š]。",
+ 'config-no-db' => '找ä¸åˆ°åˆé©çš„數據庫驅動ï¼æ‚¨éœ€è¦ç‚ºPHP安è£æ•¸æ“šåº«é©…動。目å‰æ”¯æŒä»¥ä¸‹æ•¸æ“šåº«ï¼š$1。
+
+如果您正在使用共享主機,請å‘您的主機æ供商申請安è£åˆé©çš„數據庫驅動。如果您通éŽè‡ªè¡Œç·¨è­¯å®‰è£çš„PHP,請å°å…¶é€²è¡Œé‡æ–°é…置以啟用數據庫客戶端,例如使用<code>./configure --with-mysql</code>。如果您通éŽDebian或Ubuntu包安è£çš„PHP,您還需è¦å®‰è£php5-mysql模塊。',
+ 'config-no-fts3' => "'''警告''':已編譯的SQLiteä¸åŒ…å«[//sqlite.org/fts3.html FTS3模塊],後å°æœç´¢åŠŸèƒ½å°‡ä¸å¯ç”¨ã€‚",
+ 'config-register-globals' => "'''警告:PHPçš„<code>[http://php.net/register_globals register_globals]</code>é¸é …被啟用。請盡é‡ç¦ç”¨è©²åŠŸèƒ½ï¼Œ'''雖然ä¸æœƒå½±éŸ¿MediaWikiçš„é‹è¡Œï¼Œä½†æ‚¨çš„æœå‹™å™¨æœƒè¢«æš´éœ²çµ¦æ½›åœ¨çš„安全æ¼æ´žã€‚",
+ 'config-magic-quotes-runtime' => "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被啟用ï¼'''
+æ­¤é¸é …會無法é æ¸¬åœ°ç ´å£žè¼¸å…¥çš„數據,請將其ç¦ç”¨ï¼Œå¦å‰‡æ‚¨å°‡ä¸èƒ½å®‰è£æˆ–使用MediaWiki。",
+ 'config-magic-quotes-sybase' => "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]被啟用ï¼'''
+æ­¤é¸é …會無法é æ¸¬åœ°ç ´å£žè¼¸å…¥çš„數據,請將其ç¦ç”¨ï¼Œå¦å‰‡æ‚¨å°‡ä¸èƒ½å®‰è£æˆ–使用MediaWiki。",
+ 'config-mbstring' => "'''致命錯誤:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]被啟用ï¼'''
+æ­¤é¸é …會導致錯誤並ä¸å¯é æ¸¬åœ°ç ´å£žæ•¸æ“šï¼Œè«‹å°‡å…¶ç¦ç”¨ï¼Œå¦å‰‡æ‚¨å°‡ä¸èƒ½å®‰è£æˆ–使用MediaWiki。",
+ 'config-ze1' => "'''致命錯誤:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]被啟用ï¼'''
+æ­¤é¸é …將導致MediaWiki出ç¾æ¥µå…¶åš´é‡çš„故障,請將其ç¦ç”¨ï¼Œå¦å‰‡æ‚¨å°‡ä¸èƒ½å®‰è£æˆ–使用MediaWiki。",
+ 'config-safe-mode' => "'''警告:'''PHPçš„[http://www.php.net/features.safe-mode 安全模å¼]已啟用。它å¯èƒ½æœƒå°Žè‡´ä¸€äº›å•é¡Œï¼Œå°¤å…¶åœ¨å°æ–‡ä»¶ä¸Šå‚³å’Œæ•¸å­¸å…¬å¼<code>math</code>的支æŒæ–¹é¢ã€‚",
+ 'config-xml-bad' => '缺少PHPçš„XML模塊。MediaWiki需è¦ä½¿ç”¨è©²æ¨¡å¡Šæ供的函數,在當å‰é…置下將無法工作。如果您正在使用Mandrake Linux,請安è£php-xml包。',
+ 'config-pcre' => 'å¯èƒ½ç¼ºå°‘PCRE的支æŒæ¨¡å¡Šã€‚MediaWikiçš„é‹è¡Œéœ€è¦å…¼å®¹æ–¼Perl的正則表é”å¼å‡½æ•¸ã€‚',
+ 'config-pcre-no-utf8' => "'''致命錯誤''':PHPçš„PCRE模塊在編譯時å¯èƒ½æ²’有包å«PCRE_UTF8支æŒã€‚MediaWiki需è¦UTF-8支æŒæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚",
+ 'config-memory-raised' => 'PHP的內存使用上é™<code>memory_limit</code>為$1,自動æå‡åˆ°$2。',
+ 'config-memory-bad' => "'''警告:'''PHP的內存使用上é™<code>memory_limit</code>為$1。該設定å¯èƒ½éŽä½Žï¼Œä¸¦å°Žè‡´å®‰è£å¤±æ•—ï¼",
+ 'config-xcache' => '[http://xcache.lighttpd.net/ XCache]已安è£',
+ 'config-apc' => '[http://www.php.net/apc APC]已安è£',
+ 'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]已安è£',
+ 'config-no-cache' => "'''警告:'''找ä¸åˆ°[http://www.php.net/apc APC]ã€[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],無法啟用å°è±¡ç·©å­˜ã€‚
+Object caching is not enabled.",
+ 'config-diff3-bad' => '找ä¸åˆ°GNU diff3。',
+ 'config-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你啟用了上傳功能,縮略圖功能也將被啟用。',
+ 'config-gd' => '已找到內建的GD圖形庫。如果你啟用了上傳功能,縮略圖功能也將被啟用。',
+ 'config-no-scaling' => '找ä¸åˆ°GD庫或ImageMagick。縮略圖功能將ä¸å¯ç”¨ã€‚',
+ 'config-no-uri' => "'''錯誤:'''無法確定當å‰çš„URI。安è£å·²ä¸­æ–·ã€‚",
+ 'config-no-cli-uri' => "'''警告''':未指定--scriptpathåƒæ•¸ï¼Œä½¿ç”¨é»˜èªå€¼ï¼š<code>$1</code>。",
+ 'config-using-server' => '使用æœå‹™å™¨å“<nowiki>$1</nowiki>â€ã€‚',
+ 'config-using-uri' => '使用æœå‹™å™¨URL“<nowiki>$1$2</nowiki>â€ã€‚',
+ 'config-uploads-not-safe' => "'''警告:'''您的默èªä¸Šå‚³ç›®éŒ„<code>$1</code>存在å…許執行任æ„腳本的æ¼æ´žã€‚儘管MediaWiki會å°æ‰€æœ‰å·²ä¸Šå‚³çš„文件進行安全檢查,但我們ä»ç„¶å¼·çƒˆå»ºè­°æ‚¨åœ¨å•Ÿç”¨ä¸Šå‚³åŠŸèƒ½å‰[//www.mediawiki.org/wiki/Manual:Security#Upload_security 關閉該安全æ¼æ´ž]。",
+ '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部件å¯ä»¥åœ¨æ­¤é™åˆ¶ä¸‹æ­£å¸¸å·¥ä½œï¼Œä½†å…¶æ€§èƒ½æœƒè¢«é™ä½Žã€‚如果å¯èƒ½ï¼Œè«‹åœ¨php.ini中將suhosin.get.max_value_length設為1024或更高值,並在LocalSettings.php中將$wgResourceLoaderMaxQueryLength設為åŒä¸€å€¼ã€‚',
'config-db-type' => '資料庫類型:',
'config-db-host' => '資料庫主機:',
'config-db-host-oracle' => '資料庫的 TNS:',
+ 'config-db-host-oracle-help' => '請輸入åˆæ³•çš„[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地連接å],並確ä¿tnsnames.ora文件å°æœ¬å®‰è£ç¨‹åºå¯è¦‹ã€‚<br />如果您使用的客戶端庫為10g或更新的版本,您還å¯ä»¥ä½¿ç”¨[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡單連接å方法](easy connect naming method)。',
'config-db-wiki-settings' => '識別這個 Wiki',
'config-db-name' => '資料庫å稱:',
+ 'config-db-name-help' => '請輸入一個å¯ä»¥æ¨™è­˜æ‚¨çš„wikiçš„å稱。請勿使用空格。
+
+如果您正在使用共享web主機,您的主機æ供商或會給您指定一個數據庫å稱,或會讓您通éŽæŽ§åˆ¶é¢æ¿å‰µå»ºæ•¸æ“šåº«ã€‚',
'config-db-name-oracle' => '資料庫架構:',
+ 'config-db-account-oracle-warn' => 'ç¾æœ‰ä¸‰ç¨®å·²æ”¯æŒæ–¹æ¡ˆå¯ä»¥å°‡Oracle設置為後端數據庫:
+
+如果您希望在安è£éŽç¨‹ä¸­å‰µå»ºæ•¸æ“šåº«å¸³æˆ¶ï¼Œè«‹ç‚ºå®‰è£ç¨‹åºæ供具有SYSDBA角色的數據庫帳戶,並為web訪å•å¸³æˆ¶æŒ‡å®šæ‰€éœ€èº«ä»½è­‰æ˜Žï¼›å¦å‰‡æ‚¨å¯ä»¥æ‰‹å‹•å‰µå»ºweb訪å•çš„賬戶並僅須æ供該帳戶(確ä¿å¸³æˆ¶å·²æœ‰å‰µå»ºæ–¹æ¡ˆå°è±¡ï¼ˆschema object)的所需權é™ï¼‰ï¼›æˆ–æ供兩個ä¸åŒçš„帳戶,其一具有創建權é™ï¼Œå¦ä¸€å‰‡è¢«é™åˆ¶ç‚ºweb訪å•ã€‚
+
+具有所需權é™è³¬æˆ¶çš„創建腳本存放於本程åºçš„“maintenance/oracle/â€ç›®éŒ„下。請注æ„,使用å—é™åˆ¶çš„帳戶將ç¦ç”¨é»˜èªå¸³æˆ¶çš„所有維護性功能。',
+ 'config-db-install-account' => '用於安è£çš„用戶帳號',
'config-db-username' => '資料庫使用者å稱:',
'config-db-password' => '資料庫密碼:',
+ 'config-db-password-empty' => '請為新數據庫用戶$1輸入密碼。儘管您å¯ä»¥å‰µå»ºä¸ä½¿ç”¨å¯†ç¢¼çš„用戶,但這樣åšä¸¦ä¸å®‰å…¨ã€‚',
+ 'config-db-install-username' => '請輸入在安è£éŽç¨‹ä¸­ç”¨æ–¼é€£æŽ¥æ•¸æ“šåº«çš„用戶å。請勿輸入MediaWiki帳號的用戶å,請輸入您數據庫的用戶å。',
+ 'config-db-install-password' => '請輸入在安è£éŽç¨‹ä¸­ç”¨æ–¼é€£æŽ¥æ•¸æ“šåº«çš„密碼。請勿輸入MediaWiki帳號的密碼,請輸入您數據庫的密碼。',
+ 'config-db-install-help' => '請輸入在安è£éŽç¨‹ä¸­ç”¨æ–¼é€£æŽ¥æ•¸æ“šåº«çš„用戶å和密碼。',
+ 'config-db-account-lock' => '在普通æ“作中使用相åŒçš„用戶å和密碼',
+ 'config-db-wiki-account' => '用於普通æ“作的用戶帳號',
+ 'config-db-wiki-help' => '輸入在普通的wikiæ“作中(安è£å®Œæˆå¾Œï¼‰å°‡ç”¨æ–¼é€£æŽ¥æ•¸æ“šåº«çš„用戶å和密碼。如果該帳號並ä¸å­˜åœ¨ï¼Œè€Œå®‰è£å¸³è™Ÿå…·æœ‰è¶³å¤ çš„權é™ï¼Œè©²ç”¨æˆ¶å¸³è™Ÿæœƒè¢«è‡ªå‹•å‰µå»ºï¼Œä¸¦è¢«è³¦äºˆè¶³ä»¥é‹è¡Œæ­¤wiki的最低權é™ã€‚',
+ 'config-db-prefix' => '數據庫表å‰ç¶´ï¼š',
+ 'config-db-prefix-help' => '如果您需è¦åœ¨å¤šå€‹wiki之間(或在MediaWiki與其他web應用程åºä¹‹é–“)共享一個數據庫,您å¯ä»¥é€šéŽæ·»åŠ å‰ç¶´çš„æ–¹å¼ä¾†é¿å…出ç¾è¡¨å稱的è¡çªã€‚請勿使用空格。
+
+此字段通常å¯ç•™ç©ºã€‚',
+ 'config-db-charset' => '數據庫字符集',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 二進制',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-charset-mysql4' => 'MySQL 4.0 UTF-8(å‘後兼容)',
+ 'config-charset-help' => "'''警告:'''如果您在MySQL 4.1+中使用'''å‘後兼容的UTF-8'''字符集,並在之後使用<code>mysqldump</code>備份了數據庫,則å¯èƒ½æ壞所有的éžASCII字符,從而ä¸å¯é€†åœ°ç ´å£žæ‚¨çš„備份ï¼
+
+在'''二進制模å¼'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相å°æ–¼MySQLçš„UTF-8模å¼ï¼Œé€™ç¨®æ–¹æ³•æ•ˆçŽ‡æ›´é«˜ï¼Œä¸¦å…許您使用全範åœçš„Unicode字符。
+
+在'''UTF-8模å¼'''下,MySQL將知é“您數據使用的字符集,並能é©ç•¶åœ°æ供和轉æ›å…§å®¹ã€‚但這樣åšæ‚¨å°‡ç„¡æ³•åœ¨æ•¸æ“šåº«ä¸­å­˜å„²[//zh.wikipedia.org/wiki/åŸºæœ¬å¤šæ–‡ç¨®å¹³é¢ åŸºæœ¬å¤šæ–‡ç¨®å¹³é¢]以外的字符。",
+ 'config-mysql-old' => '需è¦MySQL $1或更新的版本,您的版本為$2。',
+ 'config-db-port' => '數據庫端å£ï¼š',
+ 'config-db-schema' => 'MediaWiki的數據庫模å¼',
+ 'config-db-schema-help' => '此數據庫模å¼é€šå¸¸æ˜¯æ­£ç¢ºçš„,請在有明確需求時æ‰æ”¹å‹•ä¹‹ã€‚',
+ 'config-pg-test-error' => "無法連接到數據庫'''$1''':$2",
'config-sqlite-dir' => 'SQLite 的資料目錄:',
+ 'config-sqlite-dir-help' => "SQLite會將所有的數據存儲於單一文件中。
+
+您所æ供的目錄必須在安è£éŽç¨‹ä¸­å°ç¶²é æœå‹™å™¨å¯å¯«ã€‚
+
+該目錄'''ä¸æ‡‰'''å…許通éŽweb訪å•ï¼Œå› æ­¤æˆ‘們ä¸æœƒå°‡æ•¸æ“šæ–‡ä»¶å’ŒPHP文件放在一起。
+
+安è£ç¨‹åºåœ¨å‰µå»ºæ•¸æ“šæ–‡ä»¶æ™‚,亦會在相åŒç›®éŒ„下創建<code>.htaccess</code>以控制權é™ã€‚å‡è‹¥æ­¤ç­‰æŽ§åˆ¶å¤±æ•ˆï¼Œå‰‡å¯èƒ½æœƒå°‡æ‚¨çš„數據文件暴露於公共空間,讓他人å¯ä»¥ç²å–用戶數據(電å­éƒµä»¶åœ°å€ã€é›œæ¹Šå¾Œçš„密碼)ã€è¢«åˆªé™¤çš„版本以åŠå…¶ä»–在wiki上被é™åˆ¶è¨ªå•çš„數據。
+
+請考慮將數據庫統一放置在æŸè™•ï¼Œå¦‚<code>/var/lib/mediawiki/yourwiki</code>下。",
+ 'config-oracle-def-ts' => '默èªè¡¨ç©ºé–“:',
+ 'config-oracle-temp-ts' => '臨時表空間:',
+ 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-support-info' => 'MediaWiki支æŒä»¥ä¸‹æ•¸æ“šåº«ç³»çµ±ï¼š
+
+$1
+
+如果您在下é¢åˆ—出的數據庫系統中沒有找到您希望使用的系統,請根據上方éˆå‘的指引啟用支æŒã€‚',
+ 'config-support-mysql' => '* $1是MediaWiki的首é¸æ•¸æ“šåº«ï¼Œå°å®ƒçš„支æŒæœ€ç‚ºå®Œå‚™ï¼ˆ[http://www.php.net/manual/en/mysql.installation.php 如何將å°MySQL的支æŒç·¨è­¯é€²PHP中])',
+ 'config-support-postgres' => '* $1是一種æµè¡Œçš„é–‹æºæ•¸æ“šåº«ç³»çµ±ï¼Œå¯ä½œç‚ºMySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將å°PostgreSQL的支æŒç·¨è­¯é€²PHP中])。本程åºä¸­å¯èƒ½ä¾ç„¶å­˜åœ¨ä¸€äº›å°è€Œæ˜Žé¡¯çš„錯誤,因此並ä¸å»ºè­°åœ¨ç”Ÿç”¢ç’°å¢ƒä¸­ä½¿ç”¨è©²æ•¸æ“šåº«ç³»çµ±ã€‚',
+ 'config-support-sqlite' => '* $1是一種輕é‡ç´šçš„數據庫系統,能被良好地支æŒã€‚([http://www.php.net/manual/en/pdo.installation.php 如何將å°SQLite的支æŒç·¨è­¯é€²PHP中],須使用PDO)',
+ 'config-support-oracle' => '* $1是一種商用ä¼æ¥­ç´šçš„數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將å°OCI8的支æŒç·¨è­¯é€²PHP中])',
+ 'config-support-ibm_db2' => '* $1是一種商用ä¼æ¥­ç´šæ•¸æ“šåº«ã€‚',
'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-invalid-db-server-oracle' => '無效的數據庫TNS“$1â€ã€‚è«‹åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•¸å­—(0-9)ã€ä¸‹åŠƒç·šï¼ˆ_)和點號(.)。',
+ 'config-invalid-db-name' => '無效的數據庫å稱“$1â€ã€‚è«‹åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•¸å­—(0-9)ã€ä¸‹åŠƒç·šï¼ˆ_)和連字號(-)。',
+ 'config-invalid-db-prefix' => '無效的數據庫å‰ç¶´â€œ$1â€ã€‚è«‹åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•¸å­—(0-9)ã€ä¸‹åŠƒç·šï¼ˆ_)和連字號(-)。',
+ 'config-connection-error' => '$1。
+
+請檢查下列的主機ã€ç”¨æˆ¶å和密碼設置後é‡è©¦ã€‚',
+ 'config-invalid-schema' => '無效的MediaWiki數據庫模å¼â€œ$1â€ã€‚è«‹åªä½¿ç”¨ASCIIå­—æ¯ï¼ˆa-zã€A-Z)ã€æ•¸å­—(0-9)和下劃線(_)。',
+ 'config-db-sys-create-oracle' => '安è£ç¨‹åºåƒ…支æŒä½¿ç”¨SYSDBA帳戶創建新帳戶。',
+ 'config-db-sys-user-exists-oracle' => '用戶帳戶“$1â€å·²ç¶“存在。SYSDBA僅å¯ç”¨æ–¼å‰µå»ºæ–°å¸³æˆ¶ï¼',
+ 'config-postgres-old' => '需è¦PostgreSQL $1或更新的版本,您的版本為$2。',
+ 'config-sqlite-name-help' => '請為您的wiki指定一個用於標識的å稱。請勿使用空格或連字號,該å稱將被用作SQLite的數據文件å。',
+ 'config-sqlite-parent-unwritable-group' => '由於父目錄<code><nowiki>$2</nowiki></code>å°ç¶²é æœå‹™å™¨ä¸å¯å¯«ï¼Œç„¡æ³•å‰µå»ºæ•¸æ“šç›®éŒ„<code><nowiki>$1</nowiki></code>。
+
+安è£ç¨‹åºå·²ç¢ºå®šæ‚¨ç¶²é æœå‹™å™¨æ‰€ä½¿ç”¨çš„用戶。請將<code><nowiki>$3</nowiki></code>目錄設為å°è©²ç”¨æˆ¶å¯å¯«ä»¥ç¹¼çºŒå®‰è£éŽç¨‹ã€‚在Unix/Linux系統中,您å¯ä»¥é€è¡Œè¼¸å…¥ä¸‹åˆ—命令:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => '由於父目錄<code><nowiki>$2</nowiki></code>å°ç¶²é æœå‹™å™¨ä¸å¯å¯«ï¼Œç„¡æ³•å‰µå»ºæ•¸æ“šç›®éŒ„<code><nowiki>$1</nowiki></code>。
+
+安è£ç¨‹åºç„¡æ³•ç¢ºå®šæ‚¨ç¶²é æœå‹™å™¨æ‰€ä½¿ç”¨çš„用戶。請將<code><nowiki>$3</nowiki></code>目錄設為全局å¯å¯«ï¼ˆå°æ‰€æœ‰ç”¨æˆ¶ï¼‰ä»¥ç¹¼çºŒå®‰è£éŽç¨‹ã€‚在Unix/Linux系統中,您å¯ä»¥é€è¡Œè¼¸å…¥ä¸‹åˆ—命令:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => '創建數據目錄“$1â€æ™‚發生錯誤。請檢查路徑後é‡è©¦ã€‚',
+ 'config-sqlite-dir-unwritable' => '無法寫入目錄“$1â€ã€‚請修改該目錄的權é™ï¼Œä½¿å…¶å°ç¶²é æœå‹™å™¨å¯å¯«å¾Œé‡è©¦ã€‚',
+ 'config-sqlite-connection-error' => '$1。
+
+請檢查下列的數據目錄和數據庫å稱後é‡è©¦ã€‚',
+ 'config-sqlite-readonly' => '文件<code>$1</code>ä¸å¯å¯«ã€‚',
+ 'config-sqlite-cant-create-db' => '無法創建數據文件<code>$1</code>。',
+ 'config-sqlite-fts3-downgrade' => 'PHP缺少FTS3支æŒï¼Œæ­£åœ¨é™ç´šæ•¸æ“šè¡¨',
+ 'config-can-upgrade' => "在數據庫中發ç¾äº†MediaWiki的數據表。è¦å°‡å®ƒå€‘å‡ç´šè‡³MediaWiki $1,請點擊'''繼續'''。",
+ 'config-upgrade-done' => "å‡ç´šå®Œæˆã€‚
+
+ç¾åœ¨æ‚¨å¯ä»¥[$1 開始使用您的wiki]了。
+
+如果您需è¦é‡æ–°ç”Ÿæˆ<code>LocalSettings.php</code>文件,請點擊下é¢çš„按鈕。除éžæ‚¨çš„wiki出ç¾äº†å•é¡Œï¼Œæˆ‘們'''ä¸æŽ¨è–¦'''您執行此æ“作。",
+ 'config-upgrade-done-no-regenerate' => 'å‡ç´šå®Œæˆã€‚
+
+ç¾åœ¨æ‚¨å¯ä»¥[$1 開始使用您的wiki]了。',
+ 'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
+ 'config-show-table-status' => '查詢SHOW TABLE STATUS失敗ï¼',
+ 'config-unknown-collation' => "'''警告:'''數據庫使用了無法識別的整ç†ã€‚",
+ 'config-db-web-account' => '供網é è¨ªå•ä½¿ç”¨çš„數據庫帳號',
+ 'config-db-web-help' => '請指定在wiki執行普通æ“作時,網é æœå‹™å™¨ç”¨æ–¼é€£æŽ¥æ•¸æ“šåº«æœå‹™å™¨çš„用戶å和密碼。',
+ 'config-db-web-account-same' => '使用和安è£ç¨‹åºç›¸åŒçš„帳號',
'config-db-web-create' => '建立帳號,如果它ä¸å­˜åœ¨',
+ 'config-db-web-no-create-privs' => '您指定給安è£ç¨‹åºçš„帳號缺少創建帳號的權é™ï¼Œå› æ­¤æ‚¨æŒ‡å®šçš„帳號必須已經存在。',
+ 'config-mysql-engine' => '存儲引擎:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-myisam-dep' => "'''警告''':您é¸æ“‡äº†MyISAM作為MySQL的存儲引擎,MediaWiki並ä¸æŽ¨è–¦æ‚¨é€™éº¼åšï¼Œå› ç‚ºï¼š
+* 它僅能通éŽè¡¨éŽ–定來勉強支æŒä¸¦ç™¼
+* 與其他引擎相比,它更容易被æ壞
+* MediaWiki代碼庫並ä¸ç¸½æœƒåŽ»è™•ç†MyISAM
+
+如果您的MySQL程åºæ”¯æŒInnoDB,我們高度推薦您使用該引擎替代MyISAM。
+如果您的MySQL程åºä¸æ”¯æŒInnoDB,請考慮å‡ç´šã€‚",
+ 'config-mysql-engine-help' => "'''InnoDB'''通常是最佳é¸é …,因為它å°ä¸¦ç™¼æ“作有ç€è‰¯å¥½çš„支æŒã€‚
+
+'''MyISAM'''在單用戶或åªè®€ç’°å¢ƒä¸‹å¯èƒ½æœƒæœ‰æ›´å¿«çš„性能表ç¾ã€‚但MyISAM數據庫出錯的概率一般è¦å¤§æ–¼InnoDB數據庫。",
'config-mysql-charset' => '資料庫字符集:',
+ 'config-mysql-binary' => '二進制',
'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "在'''二進制模å¼'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相å°æ–¼MySQLçš„UTF-8模å¼ï¼Œé€™ç¨®æ–¹æ³•æ•ˆçŽ‡æ›´é«˜ï¼Œä¸¦å…許您使用全範åœçš„Unicode字符。
+
+在'''UTF-8模å¼'''下,MySQL將知é“您數據使用的字符集,並能é©ç•¶åœ°æ供和轉æ›å…§å®¹ã€‚但這樣åšæ‚¨å°‡ç„¡æ³•åœ¨æ•¸æ“šåº«ä¸­å­˜å„²[//zh.wikipedia.org/wiki/åŸºæœ¬å¤šæ–‡ç¨®å¹³é¢ åŸºæœ¬å¤šæ–‡ç¨®å¹³é¢]以外的字符。",
+ 'config-ibm_db2-low-db-pagesize' => "您的DB2數據庫默èªè¡¨ç©ºé–“çš„é é•·ï¼ˆpagesize)ä¸è¶³ã€‚至少需è¦'''32K'''或更大的é é•·ã€‚",
+ 'config-site-name' => 'Wikiçš„å稱:',
+ 'config-site-name-help' => '填入的內容會出ç¾åœ¨ç€è¦½å™¨çš„標題欄以åŠå…¶ä»–多處ä½ç½®ä¸­ã€‚',
'config-site-name-blank' => '輸入站點å稱。',
+ 'config-project-namespace' => 'é …ç›®å字空間:',
+ 'config-ns-generic' => 'é …ç›®',
+ 'config-ns-site-name' => '與wikiå稱相åŒï¼š$1',
'config-ns-other' => '其他(請註明)',
+ 'config-ns-other-default' => '我的Wiki',
+ 'config-project-namespace-help' => "ä¾å¾ªç¶­åŸºç™¾ç§‘å½¢æˆçš„慣例,許多wiki將他們的方é‡é é¢å­˜æ”¾åœ¨èˆ‡å…§å®¹é é¢ä¸åŒçš„“'''é …ç›®å字空間'''â€ä¸­ã€‚所有ä½æ–¼è©²å字空間下的é é¢æ¨™é¡Œéƒ½æœƒè¢«å† ä»¥å›ºå®šçš„å‰ç¶´ï¼Œæ‚¨å¯ä»¥åœ¨æ­¤è™•æŒ‡å®šé€™ä¸€å‰ç¶´ã€‚傳統上,這一å‰ç¶´æ‡‰èˆ‡wiki的命åä¿æŒä¸€è‡´ï¼Œä½†è«‹å‹¿åœ¨å…¶ä¸­ä½¿ç”¨æ¨™é»žç¬¦è™Ÿï¼Œå¦‚“#â€æˆ–“:â€ã€‚",
+ 'config-ns-invalid' => '指定的å字空間“<nowiki>$1</nowiki>â€ç„¡æ•ˆï¼Œè«‹ç‚ºé …ç›®å字空間指定其他å稱。',
+ 'config-ns-conflict' => '指定的å字空間“<nowiki>$1</nowiki>â€èˆ‡é»˜èªçš„MediaWikiå字空間è¡çªã€‚請指定一個ä¸åŒçš„é …ç›®å字空間。',
+ 'config-admin-box' => '管ç†å“¡å¸³è™Ÿ',
+ 'config-admin-name' => '您的å字:',
'config-admin-password' => '密碼:',
'config-admin-password-confirm' => 'å†æ¬¡è¼¸å…¥å¯†ç¢¼ï¼š',
+ 'config-admin-help' => '在此輸入您想使用的用戶å,例如“喬幫主â€ã€‚您將使用該å稱登錄本wiki。',
'config-admin-name-blank' => '輸入管ç†å“¡çš„使用者å稱。',
+ 'config-admin-name-invalid' => '指定的用戶å“<nowiki>$1</nowiki>â€ç„¡æ•ˆï¼Œè«‹æŒ‡å®šå…¶ä»–用戶å。',
'config-admin-password-blank' => '輸入管ç†å“¡å¸³è™Ÿå¯†ç¢¼ã€‚',
'config-admin-password-same' => '密碼ä¸èƒ½èˆ‡ä½¿ç”¨è€…å稱相åŒã€‚',
+ 'config-admin-password-mismatch' => '兩次輸入的密碼並ä¸ç›¸åŒã€‚',
'config-admin-email' => 'E-mail 地å€ï¼š',
+ 'config-admin-email-help' => '輸入電å­éƒµä»¶åœ°å€å¾Œï¼Œæ‚¨å¯ä»¥æ”¶åˆ°æ­¤wiki上其他用戶發來的電å­éƒµä»¶ï¼Œä¸¦èƒ½é‡ç½®æ‚¨çš„密碼,還å¯åœ¨ç›£è¦–列表中é é¢è¢«æ›´æ”¹æ™‚收到郵件通知。您å¯ä»¥å°‡æ­¤å­—段留空。',
+ 'config-admin-error-user' => '在創建用戶å為“<nowiki>$1</nowiki>â€çš„管ç†å“¡å¸³è™Ÿæ™‚發生內部錯誤。',
+ 'config-admin-error-password' => '在為管ç†å“¡â€œ<nowiki>$1</nowiki>â€è¨­ç½®å¯†ç¢¼æ™‚發生內部錯誤:<pre>$2</pre>',
'config-admin-error-bademail' => '你輸入了一個無效的電å­éƒµä»¶åœ°å€ã€‚',
+ 'config-subscribe' => '訂閱[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發行公告郵件列表]。',
+ 'config-subscribe-help' => '此低æµé‡çš„郵件列表僅用於發行公告,其中包括é‡è¦å®‰å…¨å…¬å‘Šã€‚請訂閱該列表以便在新的版本推出時å‡ç´šæ‚¨çš„MediaWiki。',
+ 'config-subscribe-noemail' => '您é¸æ“‡äº†è¨‚閱發行公告郵件列表,但沒有æ供電å­éƒµä»¶åœ°å€ã€‚è«‹æ供一個電å­éƒµä»¶åœ°å€ä»¥è¨‚閱郵件列表。',
+ 'config-almost-done' => '您幾乎已經完æˆäº†ï¼ç¾åœ¨æ‚¨å¯ä»¥è·³éŽå‰©ä¸‹çš„é…ç½®æµç¨‹ä¸¦ç«‹å³å®‰è£wiki。',
+ 'config-optional-continue' => '多å•æˆ‘一些å•é¡Œå§ã€‚',
+ 'config-optional-skip' => '我已經ä¸è€ç…©äº†ï¼Œè¶•ç·Šå®‰è£æˆ‘çš„wiki。',
+ 'config-profile' => '用戶權é™é…置:',
+ 'config-profile-wiki' => '傳統wiki',
+ 'config-profile-no-anon' => '需è¦è¨»å†Šå¸³è™Ÿ',
+ 'config-profile-fishbowl' => '編輯å—é™',
+ 'config-profile-private' => 'éžå…¬é–‹wiki',
+ 'config-profile-help' => "如果您å…許盡é‡å¤šçš„人編寫wiki,網站上的內容會更加è±å¯Œã€‚在MediaWiki中,您å¯ä»¥è¼•é¬†åœ°å¯©æŸ¥æœ€è¿‘更改,並輕易回退掉新手或破壞者造æˆçš„æ害。
+
+然而,許多人覺得讓MediaWiki存在多種角色將更加好用;åŒæ™‚,è¦èªªæœæ‰€æœ‰äººéƒ½é¡˜ä»¥wikiçš„æ–¹å¼ä½œè²¢ç»ä¸¦éžä¸€ä»¶æ˜“事。因此,您å¯ä»¥æœ‰ä»¥ä¸‹é¸æ“‡ï¼š
+
+'''{{int:config-profile-wiki}}'''å…許包括未登錄用戶在內的所有人編輯。'''{{int:config-profile-no-anon}}'''çš„wiki需è¦é¡å¤–的註冊æµç¨‹ï¼Œé€™æœ‰å¯èƒ½æœƒé˜»ç¤™éš¨æ„è²¢ç»è€…。
+
+'''{{int:config-profile-fishbowl}}'''模å¼åªå…許ç²æ‰¹å‡†çš„用戶編輯,但å°å…¬çœ¾é–‹æ”¾é é¢ç€è¦½ï¼ˆåŒ…括歷å²è¨˜éŒ„)。'''{{int:config-profile-private}}'''則åªå…許ç²æ‰¹å‡†çš„用戶ç€è¦½ã€ç·¨è¼¯é é¢ã€‚
+
+安è£å®Œæˆå¾Œï¼Œæ‚¨é‚„å¯ä»¥å°ç”¨æˆ¶æ¬Šé™é€²è¡Œæ›´å¤šã€æ›´è¤‡é›œçš„é…置,åƒè¦‹[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。",
'config-license' => '版權和許å¯è­‰ï¼š',
+ 'config-license-none' => 'é è…³ç„¡è¨±å¯è­‰',
+ 'config-license-cc-by-sa' => '知識共享署å-相åŒæ–¹å¼åˆ†äº«',
+ 'config-license-cc-by' => '知識共享署å',
+ 'config-license-cc-by-nc-sa' => '知識共享署å-éžå•†æ¥­æ€§ä½¿ç”¨-相åŒæ–¹å¼å…±äº«',
+ 'config-license-cc-0' => '知識共享Zero(公有領域)',
+ 'config-license-gfdl' => 'GNU自由文檔許å¯è­‰1.3或更高版本',
'config-license-pd' => '公共領域',
+ 'config-license-cc-choose' => 'é¸æ“‡è‡ªå®šç¾©çš„知識共享許å¯è­‰',
+ 'config-license-help' => "許多公共wiki會以[http://freedomdefined.org/Definition 自由許å¯è­‰]çš„æ–¹å¼é‡‹æ”¾å‡ºç·¨è€…的所有貢ç»ã€‚這有助於構建社å€çš„主人ç¿æ„識,並能鼓勵長期貢ç»ã€‚å°æ–¼éžå…¬å…±wiki或公å¸wiki,這並éžå¿…è¦æ¢ä»¶ã€‚
+
+如果您希望使用來自維基百科的內容,並希望維基百科能接å—複製自您的wiki的內容,請é¸æ“‡'''知識共享署å-相åŒæ–¹å¼å…±äº«'''。
+
+GNU自由文檔許å¯è­‰æ˜¯ç¶­åŸºç™¾ç§‘曾經使用éŽçš„許å¯è­‰ï¼Œä¸¦è¿„今有效。然而,該許å¯è­‰é›£ä»¥ç†è§£ï¼Œä¸¦æœƒå¢žåŠ é‡ç”¨å…§å®¹çš„難度。",
'config-email-settings' => 'E-mail 設定',
+ 'config-enable-email' => '啟用出站電å­éƒµä»¶',
+ 'config-enable-email-help' => '如果您希望使用電å­éƒµä»¶åŠŸèƒ½ï¼Œè«‹æ­£ç¢ºé…ç½®[http://www.php.net/manual/en/mail.configuration.php PHP的郵件設定]。如果您ä¸éœ€è¦ä»»ä½•é›»å­éƒµä»¶åŠŸèƒ½ï¼Œè«‹åœ¨æ­¤è™•ç¦ç”¨å®ƒã€‚',
+ 'config-email-user' => '啟用用戶到用戶的電å­éƒµä»¶',
+ 'config-email-user-help' => 'å…許所有用戶互發郵件,å‡è‹¥ä»–們啟用了該功能。',
+ 'config-email-usertalk' => '啟用用戶討論é é€šçŸ¥',
+ 'config-email-usertalk-help' => 'å…許用戶收到用戶討論é è¢«ä¿®æ”¹çš„通知,å‡è‹¥ä»–們啟用了該功能。',
+ 'config-email-watchlist' => '啟用監視列表通知',
+ 'config-email-watchlist-help' => 'å…許用戶收到與其監視列表有關的通知,å‡è‹¥ä»–們啟用了該功能。',
'config-email-auth' => '啟用電å­éƒµä»¶èªè­‰',
+ 'config-email-auth-help' => "如果啟用此é¸é …,在用戶設置或修改電å­éƒµä»¶åœ°å€æ™‚,就會收到一å°éƒµä»¶ï¼Œå…§å«ç¢ºèªé›»å­åœ°å€çš„éˆæŽ¥ã€‚åªæœ‰ç¶“éŽèº«ä»½é©—證的電å­éƒµä»¶åœ°å€ï¼Œæ‰èƒ½æ”¶åˆ°ä¾†è‡ªå…¶ä»–用戶的電å­éƒµä»¶ï¼Œæˆ–任何修改通知的郵件。'''建議'''公開wiki啟用本é¸é …,以防å°é›»å­éƒµä»¶åŠŸèƒ½çš„濫用。",
'config-email-sender' => '返回電å­éƒµä»¶åœ°å€ï¼š',
+ 'config-email-sender-help' => '輸入è¦ç”¨ä¾†ç™¼é€å‡ºç«™é›»å­éƒµä»¶çš„地å€ï¼Œè©²åœ°å€å°‡æœƒæ”¶åˆ°è¢«æ‹’收的郵件。許多郵件æœå‹™å™¨è¦æ±‚域å部分必須有效。',
'config-upload-settings' => '圖片和檔案上傳',
'config-upload-enable' => '啟用檔案上傳',
+ 'config-upload-help' => '文件上傳å¯èƒ½æœƒå°‡æ‚¨çš„æœå‹™å™¨æš´éœ²åœ¨å®‰å…¨é¢¨éšªä¸‹ã€‚有關更多的信æ¯ï¼Œè«‹åƒé–±æ‰‹å†Šçš„[//www.mediawiki.org/wiki/Manual:Security 安全部分]。
+
+è¦å•Ÿç”¨æ–‡ä»¶ä¸Šå‚³ï¼Œè«‹å…ˆå°‡MediaWiki根目錄下的<code>images</code>å­ç›®éŒ„更改為å°webæœå‹™å™¨å¯å¯«ï¼Œç„¶å¾Œå†å•Ÿç”¨æ­¤é¸é …。',
+ 'config-upload-deleted' => '已刪除文件的目錄:',
+ 'config-upload-deleted-help' => '指定用於存放被刪除文件的目錄。ç†æƒ³æƒ…æ³ä¸‹ï¼Œè©²ç›®éŒ„ä¸æ‡‰èƒ½é€šéŽweb訪å•ã€‚',
+ 'config-logo' => '標誌URL:',
+ 'config-logo-help' => '在MediaWiki的默èªå¤–觀中,左å´æ¬„èœå–®ä¹‹ä¸Šæœ‰ä¸€å¡Š135x160åƒç´ çš„標誌å€ã€‚請上傳一幅相應大å°çš„圖åƒï¼Œä¸¦åœ¨æ­¤è¼¸å…¥URL。
+
+如果您ä¸å¸Œæœ›ä½¿ç”¨æ¨™èªŒï¼Œè«‹å°‡æœ¬è™•ç•™ç©ºã€‚',
+ 'config-instantcommons' => '啟用å³æ™‚共享資æº',
+ 'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons å³æ™‚共享資æº]å¯ä»¥è®“wiki使用來自[//commons.wikimedia.org/ 維基共享資æº]網站的圖åƒã€éŸ³é »å’Œå…¶ä»–媒體文件。è¦å•Ÿç”¨è©²åŠŸèƒ½ï¼ŒMediaWiki必須能夠訪å•äº’è¯ç¶²ã€‚
+
+有關此功能的詳細信æ¯ï¼ŒåŒ…括如何將其他wiki網站設為具有類似共享功能的方法,請åƒè€ƒ[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 手冊]。',
+ 'config-cc-error' => '知識共享許å¯è­‰æŒ‘é¸å™¨ç„¡æ³•æ‰¾åˆ°çµæžœï¼Œè«‹æ‰‹å‹•è¼¸å…¥è¨±å¯è­‰çš„å稱。',
'config-cc-again' => 'é‡æ–°é¸å–......',
+ 'config-cc-not-chosen' => 'é¸æ“‡æ‚¨å¸Œæœ›ä½¿ç”¨çš„知識共享許å¯è­‰ï¼Œä¸¦é»žæ“Šâ€œç¹¼çºŒâ€ã€‚',
'config-advanced-settings' => '進階é…ç½®',
+ 'config-cache-options' => 'å°è±¡ç·©å­˜è¨­ç½®ï¼š',
+ 'config-cache-help' => 'å°è±¡ç·©å­˜å¯é€šéŽç·©å­˜é »ç¹ä½¿ç”¨çš„數據來æ高MediaWiki的速度。高度推薦中到大型的網站啟用該功能,å°åž‹ç¶²ç«™äº¦èƒ½å¾žå…¶ä¸­å—益。',
+ 'config-cache-none' => '無緩存(ä¸å½±éŸ¿åŠŸèƒ½ï¼Œä½†å°è¼ƒå¤§åž‹çš„wiki網站會有速度影響)',
+ 'config-cache-accel' => 'PHPå°è±¡ç·©å­˜ï¼ˆAPCã€XCache或WinCache)',
+ 'config-cache-memcached' => '使用Memcached(需è¦å¦å¤–安è£ä¸¦é…置)',
+ 'config-memcached-servers' => 'Memcachedæœå‹™å™¨ï¼š',
+ 'config-memcached-help' => '用於Memcachedçš„IP地å€åˆ—表。請ä¿æŒæ¯è¡Œä¸€æ¢ï¼Œä¸¦æŒ‡å®šè¦ä½¿ç”¨çš„端å£ã€‚例如:
+127.0.0.1:11211
+192.168.1.25:1234',
+ 'config-memcache-needservers' => '您é¸æ“‡äº†Memcached作為您的緩存,但並未指定任何æœå‹™å™¨ã€‚',
+ 'config-memcache-badip' => '您為Memcached輸入了無效的IP地å€ï¼š$1。',
+ 'config-memcache-noport' => '您沒有指定Memcachedæœå‹™å™¨çš„端å£ï¼š$1。如果您ä¸æ¸…楚端å£æ˜¯å¤šå°‘,默èªå€¼ç‚º11211。',
+ 'config-memcache-badport' => 'Memcached的端å£è™Ÿæ‡‰è©²åœ¨$1到$2之間。',
'config-extensions' => '擴充套件',
+ 'config-extensions-help' => '已在您的<code>./extensions</code>目錄中發ç¾ä¸‹åˆ—擴展。
+
+您å¯èƒ½è¦å°å®ƒå€‘進行é¡å¤–çš„é…置,但您ç¾åœ¨å¯ä»¥å•Ÿç”¨å®ƒå€‘。',
+ 'config-install-alreadydone' => "'''警告:'''您似乎已經安è£äº†MediaWiki,並試圖é‡æ–°å®‰è£å®ƒã€‚è«‹å‰å¾€ä¸‹ä¸€å€‹é é¢ã€‚",
+ 'config-install-begin' => '點擊“{{int:config-continue}}â€å¾Œï¼Œæ‚¨å°‡é–‹å§‹å®‰è£MediaWiki。如果您還想å°é…置作一些修改,請點擊後退。',
'config-install-step-done' => '完æˆ',
'config-install-step-failed' => '失敗',
+ 'config-install-extensions' => '正在啟用擴展',
+ 'config-install-database' => '正在é…置數據庫',
+ 'config-install-schema' => '創建架構',
+ 'config-install-pg-schema-not-exist' => 'PostgreSQL 架構ä¸å­˜åœ¨',
+ 'config-install-pg-schema-failed' => '創建數據表失敗。請確ä¿ç”¨æˆ¶â€œ$1â€æ“有寫入模å¼â€œ$2â€çš„權é™ã€‚',
'config-install-pg-commit' => 'æ交更改',
+ 'config-install-pg-plpgsql' => '正在檢查PL/pgSQL語言',
+ 'config-pg-no-plpgsql' => '您需è¦ç‚ºæ•¸æ“šåº«$1安è£PL/pgSQL語言',
+ 'config-pg-no-create-privs' => '為安è£ç¨‹åºæŒ‡å®šçš„帳號缺少創建帳號的權é™ã€‚',
+ 'config-pg-not-in-role' => '您指定為web用戶的帳戶已經存在。
+您給本程åºæŒ‡å®šçš„帳戶ä¸æ˜¯è¶…級用戶,也ä¸æ˜¯web用戶角色的æˆå“¡ï¼Œæ‰€ä»¥å®ƒä¸èƒ½å‰µå»ºweb用戶所æ“有的å°è±¡ã€‚
+
+MediaWiki當å‰éœ€è¦ä½¿ç”¨ç”±web用戶所有的表。請指定å¦ä¸€å€‹web帳戶å稱,或點擊“後退â€ä¸¦æŒ‡å®šå…·æœ‰é©ç•¶æ¬Šé™çš„安è£ç”¨æˆ¶ã€‚',
+ 'config-install-user' => '正在創建數據庫用戶',
+ 'config-install-user-alreadyexists' => '用戶“$1â€å·²å­˜åœ¨',
+ 'config-install-user-create-failed' => '創建用戶“$1â€å¤±æ•—:$2',
+ 'config-install-user-grant-failed' => '授予用戶“$1â€æ¬Šé™å¤±æ•—:$2',
+ 'config-install-user-missing' => '指定的用戶“$1â€ä¸å­˜åœ¨ã€‚',
+ 'config-install-user-missing-create' => '指定的用戶“$1â€ä¸å­˜åœ¨ã€‚如果您想è¦å‰µå»ºä¸€å,請點é¸â€œå‰µå»ºå¸³æˆ¶â€ä¸‹é¢çš„複é¸æ¡†ã€‚',
+ 'config-install-tables' => '正在創建數據表',
+ 'config-install-tables-exist' => "'''警告''':MediaWiki的數據表似乎已經存在,跳éŽå‰µå»ºã€‚",
+ 'config-install-tables-failed' => "'''錯誤''':創建數據表出錯,下為錯誤信æ¯ï¼š$1",
+ 'config-install-interwiki' => '正在填充默èªçš„è·¨wiki數據表',
+ 'config-install-interwiki-list' => '找ä¸åˆ°æ–‡ä»¶<code>interwiki.list</code>。',
+ 'config-install-interwiki-exists' => "'''警告''':跨wiki數據表似乎已有內容,跳éŽé»˜èªåˆ—表。",
+ 'config-install-stats' => 'åˆå§‹åŒ–統計',
+ 'config-install-keys' => '生æˆå¯†é‘°ä¸­',
+ 'config-insecure-keys' => "'''警告''':在安è£éŽç¨‹ä¸­ç”Ÿæˆçš„{{PLURAL:$2|安全密鑰|安全密鑰}}($1){{PLURAL:$2|並|並}}ä¸ä¸€å®šå®‰å…¨ã€‚請考慮手動更改{{PLURAL:$2|它|它們}}。",
+ 'config-install-sysop' => '正在創建管ç†å“¡ç”¨æˆ¶å¸³è™Ÿ',
+ 'config-install-subscribe-fail' => '無法訂閱mediawiki-announce:$1',
+ 'config-install-subscribe-notpossible' => '沒有安è£cURL,allow_url_fopen也ä¸å¯ç”¨ã€‚',
+ 'config-install-mainpage' => '正在創建顯示默èªå…§å®¹çš„首é ',
+ 'config-install-extension-tables' => '正在為已啟用擴展創建數據表',
+ 'config-install-mainpage-failed' => '無法æ’入首é :$1',
+ 'config-install-done' => "'''æ­å–œï¼'''
+您已經æˆåŠŸåœ°å®‰è£äº†MediaWiki。
+
+安è£ç¨‹åºå·²ç¶“生æˆäº†<code>LocalSettings.php</code>文件,其中包å«äº†æ‚¨æ‰€æœ‰çš„é…置。
+
+您需è¦ä¸‹è¼‰è©²æ–‡ä»¶ï¼Œä¸¦å°‡å…¶æ”¾åœ¨æ‚¨wiki的根目錄(index.phpçš„åŒç´šç›®éŒ„)中。ç¨å¾Œä¸‹è¼‰å°‡è‡ªå‹•é–‹å§‹ã€‚
+
+如果ç€è¦½å™¨æ²’有æ示您下載,或者您å–消了下載,您å¯ä»¥é»žæ“Šä¸‹é¢çš„éˆæŽ¥é‡æ–°é–‹å§‹ä¸‹è¼‰ï¼š
+
+$3
+
+'''注æ„''':如果您ç¾åœ¨ä¸å®Œæˆæœ¬æ­¥é©Ÿï¼Œè€Œæ˜¯æ²’有下載便退出了安è£éŽç¨‹ï¼Œæ­¤å¾Œæ‚¨å°‡ç„¡æ³•ç²å¾—自動生æˆçš„é…置文件。
+
+當本步驟完æˆå¾Œï¼Œæ‚¨å¯ä»¥ '''[$2 進入您的wiki]'''。",
+ 'config-download-localsettings' => '下載LocalSettings.php',
'config-help' => '說明',
'mainpagetext' => "'''å·²æˆåŠŸå®‰è£ MediaWiki。'''",
'mainpagedocfooter' => 'è«‹åƒé–±[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以ç²å¾—使用此 wiki 軟體的訊æ¯ï¼
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
index dc31dfea..43683e82 100644
--- a/includes/installer/Installer.php
+++ b/includes/installer/Installer.php
@@ -97,6 +97,7 @@ abstract class Installer {
'envCheckPCRE',
'envCheckMemory',
'envCheckCache',
+ 'envCheckModSecurity',
'envCheckDiff3',
'envCheckGraphics',
'envCheckServer',
@@ -106,6 +107,7 @@ abstract class Installer {
'envCheckUploadsDirectory',
'envCheckLibicu',
'envCheckSuhosinMaxValueLength',
+ 'envCheckCtype',
);
/**
@@ -204,7 +206,6 @@ abstract class Installer {
protected $objectCaches = array(
'xcache' => 'xcache_get',
'apc' => 'apc_fetch',
- 'eaccel' => 'eaccelerator_get',
'wincache' => 'wincache_ucache_get'
);
@@ -295,11 +296,13 @@ abstract class Installer {
* The parameters are like parameters to wfMsg().
* The messages will be in wikitext format, which will be converted to an
* output format such as HTML or text before being sent to the user.
+ * @param $msg
*/
public abstract function showMessage( $msg /*, ... */ );
/**
* Same as showMessage(), but for displaying errors
+ * @param $msg
*/
public abstract function showError( $msg /*, ... */ );
@@ -601,7 +604,6 @@ abstract class Installer {
'ss_good_articles' => 0,
'ss_total_pages' => 0,
'ss_users' => 0,
- 'ss_admins' => 0,
'ss_images' => 0 ),
__METHOD__, 'IGNORE' );
return Status::newGood();
@@ -620,6 +622,7 @@ abstract class Installer {
/**
* Environment check for DB types.
+ * @return bool
*/
protected function envCheckDB() {
global $wgLang;
@@ -630,19 +633,32 @@ abstract class Installer {
$allNames[] = wfMsg( "config-type-$name" );
}
- if ( !$this->getVar( '_CompiledDBs' ) ) {
- $this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
- // @todo FIXME: This only works for the web installer!
- return false;
+ // cache initially available databases to make sure that everything will be displayed correctly
+ // after a refresh on env checks page
+ $databases = $this->getVar( '_CompiledDBs-preFilter' );
+ if ( !$databases ) {
+ $databases = $this->getVar( '_CompiledDBs' );
+ $this->setVar( '_CompiledDBs-preFilter', $databases );
}
- // Check for FTS3 full-text search module
- $sqlite = $this->getDBInstaller( 'sqlite' );
- if ( $sqlite->isCompiled() ) {
- if( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
- $this->showMessage( 'config-no-fts3' );
+ $databases = array_flip ( $databases );
+ foreach ( array_keys( $databases ) as $db ) {
+ $installer = $this->getDBInstaller( $db );
+ $status = $installer->checkPrerequisites();
+ if ( !$status->isGood() ) {
+ $this->showStatusMessage( $status );
+ }
+ if ( !$status->isOK() ) {
+ unset( $databases[$db] );
}
}
+ $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;
+ }
+ $this->setVar( '_CompiledDBs', $databases );
}
/**
@@ -803,6 +819,15 @@ abstract class Installer {
}
/**
+ * Scare user to death if they have mod_security
+ */
+ protected function envCheckModSecurity() {
+ if ( self::apacheModulePresent( 'mod_security' ) ) {
+ $this->showMessage( 'config-mod-security' );
+ }
+ }
+
+ /**
* Search for GNU diff3.
*/
protected function envCheckDiff3() {
@@ -842,25 +867,27 @@ abstract class Installer {
/**
* Environment check for the server hostname.
*/
- protected function envCheckServer( $srv = null ) {
- if ( $srv ) {
- // wgServer was pre-defined, perhaps by the cli installer
- $server = $srv;
- } else {
- $server = WebRequest::detectServer();
- }
+ protected function envCheckServer() {
+ $server = $this->envGetDefaultServer();
$this->showMessage( 'config-using-server', $server );
$this->setVar( 'wgServer', $server );
}
/**
+ * Helper function to be called from envCheckServer()
+ * @return String
+ */
+ protected abstract function envGetDefaultServer();
+
+ /**
* Environment check for setting $IP and $wgScriptPath.
+ * @return bool
*/
protected function envCheckPath() {
global $IP;
$IP = dirname( dirname( dirname( __FILE__ ) ) );
-
$this->setVar( 'IP', $IP );
+
$this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
return true;
}
@@ -880,6 +907,7 @@ abstract class Installer {
/**
* TODO: document
+ * @return bool
*/
protected function envCheckShellLocale() {
$os = php_uname( 's' );
@@ -1036,7 +1064,7 @@ abstract class Installer {
*/
if( $utf8 ) {
$useNormalizer = 'utf8';
- $utf8 = utf8_normalize( $not_normal_c, UNORM_NFC );
+ $utf8 = utf8_normalize( $not_normal_c, UtfNormal::UNORM_NFC );
if ( $utf8 !== $normal_c ) $needsUpdate = true;
}
if( $intl ) {
@@ -1056,6 +1084,13 @@ abstract class Installer {
}
}
+ protected function envCheckCtype() {
+ if ( !function_exists( 'ctype_digit' ) ) {
+ $this->showError( 'config-ctype' );
+ return false;
+ }
+ }
+
/**
* Get an array of likely places we can find executables. Check a bunch
* of known Unix-like defaults, as well as the PATH environment variable
@@ -1116,6 +1151,9 @@ abstract class Installer {
/**
* Same as locateExecutable(), but checks in getPossibleBinPaths() by default
* @see locateExecutable()
+ * @param $names
+ * @param $versionInfo bool
+ * @return bool|string
*/
public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
foreach( self::getPossibleBinPaths() as $path ) {
@@ -1174,17 +1212,36 @@ abstract class Installer {
}
/**
+ * Checks for presence of an Apache module. Works only if PHP is running as an Apache module, too.
+ *
+ * @param $moduleName String: Name of module to check.
+ * @return bool
+ */
+ public static function apacheModulePresent( $moduleName ) {
+ if ( function_exists( 'apache_get_modules' ) && in_array( $moduleName, apache_get_modules() ) ) {
+ return true;
+ }
+ // try it the hard way
+ ob_start();
+ phpinfo( INFO_MODULES );
+ $info = ob_get_clean();
+ return strpos( $info, $moduleName ) !== false;
+ }
+
+ /**
* ParserOptions are constructed before we determined the language, so fix it
*
* @param $lang Language
*/
public function setParserLanguage( $lang ) {
$this->parserOptions->setTargetLanguage( $lang );
- $this->parserOptions->setUserLang( $lang->getCode() );
+ $this->parserOptions->setUserLang( $lang );
}
/**
* Overridden by WebInstaller to provide lastPage parameters.
+ * @param $page string
+ * @return string
*/
protected function getDocUrl( $page ) {
return "{$_SERVER['PHP_SELF']}?page=" . urlencode( $page );
@@ -1213,6 +1270,7 @@ abstract class Installer {
$exts[] = $file;
}
}
+ natcasesort( $exts );
return $exts;
}
@@ -1241,7 +1299,7 @@ abstract class Installer {
require( "$IP/includes/DefaultSettings.php" );
foreach( $exts as $e ) {
- require_once( "$IP/extensions/$e/$e.php" );
+ require_once( "$IP/extensions/$e/$e.php" );
}
$hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
@@ -1432,6 +1490,9 @@ abstract class Installer {
return $status;
}
+ /**
+ * @param $s Status
+ */
private function subscribeToMediaWikiAnnounce( Status $s ) {
$params = array(
'email' => $this->getVar( '_AdminEmail' ),
@@ -1461,18 +1522,19 @@ abstract class Installer {
/**
* Insert Main Page with default content.
*
+ * @param $installer DatabaseInstaller
* @return Status
*/
protected function createMainpage( DatabaseInstaller $installer ) {
$status = Status::newGood();
try {
- $article = new Article( Title::newMainPage() );
- $article->doEdit( wfMsgForContent( 'mainpagetext' ) . "\n\n" .
- wfMsgForContent( 'mainpagedocfooter' ),
- '',
- EDIT_NEW,
- false,
- User::newFromName( 'MediaWiki default' ) );
+ $page = WikiPage::factory( Title::newMainPage() );
+ $page->doEdit( wfMsgForContent( 'mainpagetext' ) . "\n\n" .
+ wfMsgForContent( 'mainpagedocfooter' ),
+ '',
+ EDIT_NEW,
+ false,
+ User::newFromName( 'MediaWiki default' ) );
} catch (MWException $e) {
//using raw, because $wgShowExceptionDetails can not be set yet
$status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php
index a3ab21ea..89154e58 100644
--- a/includes/installer/LocalSettingsGenerator.php
+++ b/includes/installer/LocalSettingsGenerator.php
@@ -44,7 +44,7 @@ class LocalSettingsGenerator {
'wgLanguageCode', 'wgEnableEmail', 'wgEnableUserEmail', 'wgDiff3',
'wgEnotifUserTalk', 'wgEnotifWatchlist', 'wgEmailAuthentication',
'wgDBtype', 'wgSecretKey', 'wgRightsUrl', 'wgSitename', 'wgRightsIcon',
- 'wgRightsText', 'wgRightsCode', 'wgMainCacheType', 'wgEnableUploads',
+ 'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength'
@@ -187,7 +187,7 @@ class LocalSettingsGenerator {
$locale = '';
}
- $rightsUrl = $this->values['wgRightsUrl'] ? '' : '#';
+ //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // TODO: Fixme, I'm unused!
$hashedUploads = $this->safeMode ? '' : '#';
$metaNamespace = '';
if( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
@@ -329,7 +329,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
\$wgRightsText = \"{$this->values['wgRightsText']}\";
\$wgRightsIcon = \"{$this->values['wgRightsIcon']}\";
-# \$wgRightsCode = \"{$this->values['wgRightsCode']}\"; # Not yet used
# Path to the GNU diff3 utility. Used for conflict resolution.
\$wgDiff3 = \"{$this->values['wgDiff3']}\";
diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php
index 0c197e6b..7585fe7a 100644
--- a/includes/installer/MysqlInstaller.php
+++ b/includes/installer/MysqlInstaller.php
@@ -32,7 +32,7 @@ class MysqlInstaller extends DatabaseInstaller {
public $supportedEngines = array( 'InnoDB', 'MyISAM' );
- public $minimumVersion = '4.0.14';
+ public $minimumVersion = '5.0.2';
public $webUserPrivs = array(
'DELETE',
@@ -75,8 +75,8 @@ class MysqlInstaller extends DatabaseInstaller {
$this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
Html::openElement( 'fieldset' ) .
Html::element( 'legend', array(), wfMsg( 'config-db-wiki-settings' ) ) .
- $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
- $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array(), $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
+ $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();
}
@@ -113,6 +113,9 @@ class MysqlInstaller extends DatabaseInstaller {
if ( !$status->isOK() ) {
return $status;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
// Check version
@@ -154,11 +157,14 @@ class MysqlInstaller extends DatabaseInstaller {
$this->parent->showStatusError( $status );
return;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
$conn->selectDB( $this->getVar( 'wgDBname' ) );
# Determine existing default character set
- if ( $conn->tableExists( "revision" ) ) {
+ if ( $conn->tableExists( "revision", __METHOD__ ) ) {
$revision = $conn->buildLike( $this->getVar( 'wgDBprefix' ) . 'revision' );
$res = $conn->query( "SHOW TABLE STATUS $revision", __METHOD__ );
$row = $conn->fetchObject( $res );
@@ -207,18 +213,12 @@ class MysqlInstaller extends DatabaseInstaller {
* @return array
*/
public function getEngines() {
- $engines = array( 'InnoDB', 'MyISAM' );
$status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $engines;
- }
- $conn = $status->value;
- $version = $conn->getServerVersion();
- if ( version_compare( $version, "4.1.2", "<" ) ) {
- // No SHOW ENGINES in this version
- return $engines;
- }
+ /**
+ * @var $conn DatabaseBase
+ */
+ $conn = $status->value;
$engines = array();
$res = $conn->query( 'SHOW ENGINES', __METHOD__ );
@@ -237,16 +237,7 @@ class MysqlInstaller extends DatabaseInstaller {
* @return array
*/
public function getCharsets() {
- $status = $this->getConnection();
- $mysql5 = array( 'binary', 'utf8' );
- $mysql4 = array( 'mysql4' );
- if ( !$status->isOK() ) {
- return $mysql5;
- }
- if ( version_compare( $status->value->getServerVersion(), '4.1.0', '>=' ) ) {
- return $mysql5;
- }
- return $mysql4;
+ return array( 'binary', 'utf8' );
}
/**
@@ -259,13 +250,11 @@ class MysqlInstaller extends DatabaseInstaller {
if ( !$status->isOK() ) {
return false;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
- // Check version, need INFORMATION_SCHEMA and CREATE USER
- if ( version_compare( $conn->getServerVersion(), '5.0.2', '<' ) ) {
- return false;
- }
-
// Get current account name
$currentName = $conn->selectField( '', 'CURRENT_USER()', '', __METHOD__ );
$parts = explode( '@', $currentName );
@@ -637,7 +626,7 @@ class MysqlInstaller extends DatabaseInstaller {
# MySQL table options to use during installation or update
\$wgDBTableOptions = \"{$tblOpts}\";
-# Experimental charset support for MySQL 4.1/5.0.
+# Experimental charset support for MySQL 5.0.
\$wgDBmysql5 = {$dbmysql5};";
}
}
diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php
index 761d2338..9e7869ec 100644
--- a/includes/installer/MysqlUpdater.php
+++ b/includes/installer/MysqlUpdater.php
@@ -66,7 +66,6 @@ class MysqlUpdater extends DatabaseUpdater {
array( 'addTable', 'user_newtalk', 'patch-usernewtalk2.sql' ),
array( 'addTable', 'transcache', 'patch-transcache.sql' ),
array( 'addField', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ),
- array( 'addTable', 'trackbacks', 'patch-trackbacks.sql' ),
// 1.6
array( 'doWatchlistNull' ),
@@ -158,7 +157,6 @@ class MysqlUpdater extends DatabaseUpdater {
array( 'doUpdateTranscacheField' ),
array( 'renameEuWikiId' ),
array( 'doUpdateMimeMinorField' ),
- array( 'doPopulateRevLen' ),
// 1.17
array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
@@ -182,6 +180,18 @@ class MysqlUpdater extends DatabaseUpdater {
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'),
+
+ // 1.19
+ 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( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase.sql' ),
+ array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+ array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
);
}
@@ -220,12 +230,12 @@ class MysqlUpdater extends DatabaseUpdater {
if ( $info ) {
foreach ( $info as $row ) {
if ( $row->Column_name == $field ) {
- $this->output( "...index $index on table $table includes field $field\n" );
+ $this->output( "...index $index on table $table includes field $field.\n" );
return true;
}
}
}
- $this->output( "...index $index on table $table has no field $field; adding\n" );
+ $this->output( "...index $index on table $table has no field $field; added.\n" );
return false;
}
@@ -235,14 +245,14 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doInterwikiUpdate() {
global $IP;
- if ( $this->db->tableExists( "interwiki" ) ) {
+ if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
$this->output( "...already have interwiki table\n" );
return;
}
$this->output( 'Creating interwiki table...' );
$this->applyPatch( 'patch-interwiki.sql' );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
$this->output( 'Adding default interwiki definitions...' );
$this->applyPatch( "$IP/maintenance/interwiki.sql", true );
$this->output( "done.\n" );
@@ -257,7 +267,7 @@ class MysqlUpdater extends DatabaseUpdater {
throw new MWException( 'Missing rc_timestamp field of recentchanges table. Should not happen.' );
}
if ( $meta->isMultipleKey() ) {
- $this->output( "...indexes seem up to 20031107 standards\n" );
+ $this->output( "...indexes seem up to 20031107 standards.\n" );
return;
}
@@ -291,7 +301,7 @@ class MysqlUpdater extends DatabaseUpdater {
$talk = $this->db->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', __METHOD__ );
$nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ );
if ( $talk == $nontalk ) {
- $this->output( "...watchlist talk page rows already present\n" );
+ $this->output( "...watchlist talk page rows already present.\n" );
return;
}
@@ -307,7 +317,7 @@ class MysqlUpdater extends DatabaseUpdater {
}
function doSchemaRestructuring() {
- if ( $this->db->tableExists( 'page' ) ) {
+ if ( $this->db->tableExists( 'page', __METHOD__ ) ) {
$this->output( "...page table already exists.\n" );
return;
}
@@ -498,7 +508,7 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doPagelinksUpdate() {
- if ( $this->db->tableExists( 'pagelinks' ) ) {
+ if ( $this->db->tableExists( 'pagelinks', __METHOD__ ) ) {
$this->output( "...already have pagelinks table.\n" );
return;
}
@@ -547,18 +557,18 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doUserGroupsUpdate() {
- if ( $this->db->tableExists( 'user_groups' ) ) {
+ if ( $this->db->tableExists( 'user_groups', __METHOD__ ) ) {
$info = $this->db->fieldInfo( 'user_groups', 'ug_group' );
if ( $info->type() == 'int' ) {
$oldug = $this->db->tableName( 'user_groups' );
$newug = $this->db->tableName( 'user_groups_bogus' );
$this->output( "user_groups table exists but is in bogus intermediate format. Renaming to $newug... " );
$this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
$this->output( "Re-adding fresh user_groups table... " );
$this->applyPatch( 'patch-user_groups.sql' );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
$this->output( "***\n" );
$this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
@@ -572,13 +582,13 @@ class MysqlUpdater extends DatabaseUpdater {
$this->output( "Adding user_groups table... " );
$this->applyPatch( 'patch-user_groups.sql' );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
- if ( !$this->db->tableExists( 'user_rights' ) ) {
- if ( $this->db->fieldExists( 'user', 'user_rights' ) ) {
+ if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) {
+ if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) {
$this->output( "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion..." );
$this->db->applyPatch( 'patch-user_rights.sql' );
- $this->output( "ok\n" );
+ $this->output( "done.\n" );
} else {
$this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
$this->output( "*** You may need to manually configure some sysops by manipulating\n" );
@@ -643,7 +653,7 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doTemplatelinksUpdate() {
- if ( $this->db->tableExists( 'templatelinks' ) ) {
+ if ( $this->db->tableExists( 'templatelinks', __METHOD__ ) ) {
$this->output( "...templatelinks table already exists\n" );
return;
}
@@ -701,7 +711,7 @@ class MysqlUpdater extends DatabaseUpdater {
* -- Andrew Garrett, January 2007.
*/
protected function doRestrictionsUpdate() {
- if ( $this->db->tableExists( 'page_restrictions' ) ) {
+ if ( $this->db->tableExists( 'page_restrictions', __METHOD__ ) ) {
$this->output( "...page_restrictions table already exists.\n" );
return;
}
@@ -741,19 +751,21 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doPopulateParentId() {
- if ( $this->updateRowExists( 'populate rev_parent_id' ) ) {
- $this->output( "...rev_parent_id column already populated.\n" );
- return;
- }
+ if ( !$this->updateRowExists( 'populate rev_parent_id' ) ) {
+ $this->output(
+ "Populating rev_parent_id fields, printing progress markers. For large\n" .
+ "databases, you may want to hit Ctrl-C and do this manually with\n" .
+ "maintenance/populateParentId.php.\n" );
- $task = $this->maintenance->runChild( 'PopulateParentId' );
- $task->execute();
+ $task = $this->maintenance->runChild( 'PopulateParentId' );
+ $task->execute();
+ }
}
protected function doMaybeProfilingMemoryUpdate() {
- if ( !$this->db->tableExists( 'profiling' ) ) {
+ if ( !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
// Simply ignore
- } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory' ) ) {
+ } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
$this->output( "...profiling table has pf_memory field.\n" );
} else {
$this->output( "Adding pf_memory field to table profiling..." );
@@ -784,7 +796,7 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function renameEuWikiId() {
- if ( $this->db->fieldExists( 'external_user', 'eu_local_id' ) ) {
+ if ( $this->db->fieldExists( 'external_user', 'eu_local_id', __METHOD__ ) ) {
$this->output( "...eu_wiki_id already renamed to eu_local_id.\n" );
return;
}
@@ -805,16 +817,6 @@ class MysqlUpdater extends DatabaseUpdater {
$this->output( "done.\n" );
}
- protected function doPopulateRevLen() {
- if ( $this->updateRowExists( 'populate rev_len' ) ) {
- $this->output( "...rev_len column already populated.\n" );
- return;
- }
-
- $task = $this->maintenance->runChild( 'PopulateRevisionLength' );
- $task->execute();
- }
-
protected function doClFieldsUpdate() {
if ( $this->updateRowExists( 'cl_fields_update' ) ) {
$this->output( "...categorylinks up-to-date.\n" );
diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php
index a8015832..51e6d4a2 100644
--- a/includes/installer/OracleInstaller.php
+++ b/includes/installer/OracleInstaller.php
@@ -117,6 +117,10 @@ class OracleInstaller extends DatabaseInstaller {
return $statusIS3;
}
}
+
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
// Check version
diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php
index 964660c5..c4c52ee2 100644
--- a/includes/installer/OracleUpdater.php
+++ b/includes/installer/OracleUpdater.php
@@ -31,16 +31,30 @@ class OracleUpdater extends DatabaseUpdater {
array( 'doInsertPage0' ),
array( 'doRemoveNotNullEmptyDefaults' ),
array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
-
+
//1.18
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( 'addTable', 'globaltemplatelinks', 'patch-globaltemplatelinks.sql' ),
+ array( 'addTable', 'globalnamespaces', 'patch-globalnamespaces.sql' ),
+ array( 'addTable', 'globalinterwiki', 'patch-globalinterwiki.sql' ),
+ array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ),
+ array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ),
+ array( 'doRemoveNotNullEmptyDefaults2' ),
+ array( 'addIndex', 'page', 'i03', 'patch-page_redirect_namespace_len.sql' ),
+ array( 'modifyField', 'user', 'ug_group', 'patch-ug_group-length-increase.sql' ),
+ array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-us_chunk_inx_field.sql' ),
+ array( 'addField', 'job', 'job_timestamp', 'patch-job_timestamp_field.sql' ),
+ array( 'addIndex', 'job', 'i02', 'patch-job_timestamp_index.sql' ),
+
// KEEP THIS AT THE BOTTOM!!
array( 'doRebuildDuplicateFunction' ),
-
+
);
}
@@ -136,6 +150,16 @@ class OracleUpdater extends DatabaseUpdater {
$this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false );
$this->output( "ok\n" );
}
+ protected function doRemoveNotNullEmptyDefaults2() {
+ $this->output( "Removing not null empty constraints ... " );
+ $meta = $this->db->fieldInfo( 'ipblocks' , 'ipb_by_text' );
+ if ( $meta->isNullable() ) {
+ $this->output( "constraints seem to be removed\n" );
+ return;
+ }
+ $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false );
+ $this->output( "ok\n" );
+ }
/**
* Removed forcing of invalid state on recentchanges_fk2.
diff --git a/includes/installer/PhpBugTests.php b/includes/installer/PhpBugTests.php
index bb1f7d11..773debe0 100644
--- a/includes/installer/PhpBugTests.php
+++ b/includes/installer/PhpBugTests.php
@@ -18,8 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @defgroup PHPBugTests
- * @ingroup PHPBugTests
+ * @defgroup PHPBugTests PHP known bugs tests
*/
/**
diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php
index 7c4a6a80..fea012e2 100644
--- a/includes/installer/PostgresInstaller.php
+++ b/includes/installer/PostgresInstaller.php
@@ -80,6 +80,9 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !$status->isOK() ) {
return $status;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
// Check version
@@ -139,6 +142,9 @@ class PostgresInstaller extends DatabaseInstaller {
$status = $this->openPgConnection( $type );
if ( $status->isOK() ) {
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
$conn->clearFlag( DBO_TRX );
$conn->commit();
@@ -186,6 +192,9 @@ class PostgresInstaller extends DatabaseInstaller {
case 'create-tables':
$status = $this->openPgConnection( 'create-schema' );
if ( $status->isOK() ) {
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
$safeRole = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
$conn->query( "SET ROLE $safeRole" );
@@ -204,6 +213,7 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !in_array( $this->getVar( 'wgDBname' ), $dbs ) ) {
array_unshift( $dbs, $this->getVar( 'wgDBname' ) );
}
+ $conn = false;
$status = Status::newGood();
foreach ( $dbs as $db ) {
try {
@@ -233,6 +243,9 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !$status->isOK() ) {
return false;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
$superuser = $this->getVar( '_InstallUser' );
@@ -383,6 +396,10 @@ class PostgresInstaller extends DatabaseInstaller {
}
public function preInstall() {
+ $createDbAccount = array(
+ 'name' => 'user',
+ 'callback' => array( $this, 'setupUser' ),
+ );
$commitCB = array(
'name' => 'pg-commit',
'callback' => array( $this, 'commitChanges' ),
@@ -395,15 +412,13 @@ class PostgresInstaller extends DatabaseInstaller {
'name' => 'schema',
'callback' => array( $this, 'setupSchema' )
);
+
+ if( $this->getVar( '_CreateDBAccount' ) ) {
+ $this->parent->addInstallStep( $createDbAccount, 'database' );
+ }
$this->parent->addInstallStep( $commitCB, 'interwiki' );
$this->parent->addInstallStep( $plpgCB, 'database' );
$this->parent->addInstallStep( $schemaCB, 'database' );
- if( $this->getVar( '_CreateDBAccount' ) ) {
- $this->parent->addInstallStep( array(
- 'name' => 'user',
- 'callback' => array( $this, 'setupUser' ),
- ) );
- }
}
function setupDatabase() {
@@ -414,10 +429,10 @@ class PostgresInstaller extends DatabaseInstaller {
$conn = $status->value;
$dbName = $this->getVar( 'wgDBname' );
- $schema = $this->getVar( 'wgDBmwschema' );
- $user = $this->getVar( 'wgDBuser' );
- $safeschema = $conn->addIdentifierQuotes( $schema );
- $safeuser = $conn->addIdentifierQuotes( $user );
+ //$schema = $this->getVar( 'wgDBmwschema' );
+ //$user = $this->getVar( 'wgDBuser' );
+ //$safeschema = $conn->addIdentifierQuotes( $schema );
+ //$safeuser = $conn->addIdentifierQuotes( $user );
$exists = $conn->selectField( '"pg_catalog"."pg_database"', '1',
array( 'datname' => $dbName ), __METHOD__ );
@@ -461,7 +476,7 @@ class PostgresInstaller extends DatabaseInstaller {
}
function commitChanges() {
- $this->db->query( 'COMMIT' );
+ $this->db->commit();
return Status::newGood();
}
@@ -476,10 +491,10 @@ class PostgresInstaller extends DatabaseInstaller {
}
$conn = $status->value;
- $schema = $this->getVar( 'wgDBmwschema' );
+ //$schema = $this->getVar( 'wgDBmwschema' );
$safeuser = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
$safepass = $conn->addQuotes( $this->getVar( 'wgDBpassword' ) );
- $safeschema = $conn->addIdentifierQuotes( $schema );
+ //$safeschema = $conn->addIdentifierQuotes( $schema );
// Check if the user already exists
$userExists = $conn->roleExists( $this->getVar( 'wgDBuser' ) );
@@ -530,10 +545,15 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !$status->isOK() ) {
return $status;
}
+
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
if( $conn->tableExists( 'user' ) ) {
$status->warning( 'config-install-tables-exist' );
+ $this->enableLB();
return $status;
}
@@ -565,6 +585,9 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !$status->isOK() ) {
return $status;
}
+ /**
+ * @var $conn DatabaseBase
+ */
$conn = $status->value;
$exists = $conn->selectField( '"pg_catalog"."pg_language"', 1,
diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php
index ade46ac8..023cb300 100644
--- a/includes/installer/PostgresUpdater.php
+++ b/includes/installer/PostgresUpdater.php
@@ -16,11 +16,21 @@
class PostgresUpdater extends DatabaseUpdater {
/**
+ * @var DatabasePostgres
+ */
+ protected $db;
+
+ /**
* @todo FIXME: Postgres should use sequential updates like Mysql, Sqlite
* and everybody else. It never got refactored like it should've.
*/
protected function getCoreUpdateList() {
return array(
+ # rename tables 1.7.3
+ # r15791 Change reserved word table names "user" and "text"
+ array( 'renameTable', 'user', 'mwuser'),
+ array( 'renameTable', 'text', 'pagecontent'),
+
# new sequences
array( 'addSequence', 'logging_log_id_seq' ),
array( 'addSequence', 'page_restrictions_pr_id_seq' ),
@@ -55,7 +65,8 @@ class PostgresUpdater extends DatabaseUpdater {
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', 'uploadstash', 'patch-uploadstash.sql' ),
+ array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
# Needed before new field
array( 'convertArchive2' ),
@@ -108,6 +119,10 @@ class PostgresUpdater extends DatabaseUpdater {
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" ),
# type changes
array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ),
@@ -175,6 +190,7 @@ class PostgresUpdater extends DatabaseUpdater {
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( 'checkOiNameConstraint' ),
array( 'checkPageDeletedTrigger' ),
@@ -208,7 +224,6 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'changeFkeyDeferrable', 'revision', 'rev_page', 'page (page_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'revision', 'rev_user', 'mwuser(user_id) ON DELETE RESTRICT' ),
array( 'changeFkeyDeferrable', 'templatelinks', 'tl_from', 'page(page_id) ON DELETE CASCADE' ),
- array( 'changeFkeyDeferrable', 'trackbacks', 'tb_page', 'page(page_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'user_groups', 'ug_user', 'mwuser(user_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'user_newtalk', 'user_id', 'mwuser(user_id) ON DELETE CASCADE' ),
array( 'changeFkeyDeferrable', 'user_properties', 'up_user', 'mwuser(user_id) ON DELETE CASCADE' ),
@@ -387,6 +402,10 @@ END;
}
protected function renameSequence( $old, $new ) {
+ if ( $this->db->sequenceExists( $new ) ) {
+ $this->output( "...sequence $new already exists.\n" );
+ return;
+ }
if ( $this->db->sequenceExists( $old ) ) {
$this->output( "Renaming sequence $old to $new\n" );
$this->db->query( "ALTER SEQUENCE $old RENAME TO $new" );
@@ -396,7 +415,8 @@ END;
protected function renameTable( $old, $new ) {
if ( $this->db->tableExists( $old ) ) {
$this->output( "Renaming table $old to $new\n" );
- $old = $this->db->addQuotes( $old );
+ $old = $this->db->realTableName( $old, "quoted" );
+ $new = $this->db->realTableName( $new, "quoted" );
$this->db->query( "ALTER TABLE $old RENAME TO $new" );
}
}
@@ -404,7 +424,7 @@ END;
protected function addPgField( $table, $field, $type ) {
$fi = $this->db->fieldInfo( $table, $field );
if ( !is_null( $fi ) ) {
- $this->output( "... column '$table.$field' already exists\n" );
+ $this->output( "...column '$table.$field' already exists\n" );
return;
} else {
$this->output( "Adding column '$table.$field'\n" );
@@ -415,12 +435,12 @@ END;
protected function changeField( $table, $field, $newtype, $default ) {
$fi = $this->db->fieldInfo( $table, $field );
if ( is_null( $fi ) ) {
- $this->output( "... error: expected column $table.$field to exist\n" );
+ $this->output( "...ERROR: expected column $table.$field to exist\n" );
exit( 1 );
}
if ( $fi->type() === $newtype )
- $this->output( "... column '$table.$field' is already of type '$newtype'\n" );
+ $this->output( "...column '$table.$field' is already of type '$newtype'\n" );
else {
$this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" );
$sql = "ALTER TABLE $table ALTER $field TYPE $newtype";
@@ -433,15 +453,16 @@ END;
}
$sql .= " USING $default";
}
- $sql .= ";\nCOMMIT;\n";
+ $this->db->begin( __METHOD__ );
$this->db->query( $sql );
+ $this->db->commit( __METHOD__ );
}
}
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" );
+ $this->output( "...ERROR: expected column $table.$field to exist\n" );
exit( 1 );
}
if ( $fi->isNullable() ) {
@@ -450,7 +471,7 @@ END;
$this->output( "Changing '$table.$field' to not allow NULLs\n" );
$this->db->query( "ALTER TABLE $table ALTER $field SET NOT NULL" );
} else {
- $this->output( "... column '$table.$field' is already set as NULL\n" );
+ $this->output( "...column '$table.$field' is already set as NULL\n" );
}
} else {
# # It's NOT NULL - does it need to be NULL?
@@ -459,14 +480,14 @@ END;
$this->db->query( "ALTER TABLE $table ALTER $field DROP NOT NULL" );
}
else {
- $this->output( "... column '$table.$field' is already set as NOT NULL\n" );
+ $this->output( "...column '$table.$field' is already set as NOT NULL\n" );
}
}
}
public function addPgIndex( $table, $index, $type ) {
if ( $this->db->indexExists( $table, $index ) ) {
- $this->output( "... index '$index' on table '$table' already exists\n" );
+ $this->output( "...index '$index' on table '$table' already exists\n" );
} else {
$this->output( "Creating index '$index' on table '$table' $type\n" );
$this->db->query( "CREATE INDEX $index ON $table $type" );
@@ -475,7 +496,7 @@ END;
public function addPgExtIndex( $table, $index, $type ) {
if ( $this->db->indexExists( $table, $index ) ) {
- $this->output( "... index '$index' on table '$table' already exists\n" );
+ $this->output( "...index '$index' on table '$table' already exists\n" );
} else {
$this->output( "Creating index '$index' on table '$table'\n" );
if ( preg_match( '/^\(/', $type ) ) {
@@ -516,7 +537,7 @@ END;
}
$this->applyPatch( 'patch-remove-archive2.sql' );
} else {
- $this->output( "... obsolete table 'archive2' does not exist\n" );
+ $this->output( "...obsolete table 'archive2' does not exist\n" );
}
}
@@ -527,13 +548,13 @@ END;
$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" );
+ $this->output( "...column 'oldimage.oi_deleted' is already of type 'smallint'\n" );
}
}
protected function checkOiNameConstraint() {
if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascaded" ) ) {
- $this->output( "... table 'oldimage' has correct cascading delete/update foreign key to image\n" );
+ $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" );
@@ -552,7 +573,7 @@ END;
$this->output( "Adding function and trigger 'page_deleted' to table 'page'\n" );
$this->applyPatch( 'patch-page_deleted.sql' );
} else {
- $this->output( "... table 'page' has 'page_deleted' trigger\n" );
+ $this->output( "...table 'page' has 'page_deleted' trigger\n" );
}
}
@@ -562,7 +583,7 @@ END;
$this->output( "Removing NOT NULL constraint from 'recentchanges.rc_cur_id'\n" );
$this->applyPatch( 'patch-rc_cur_id-not-null.sql' );
} else {
- $this->output( "... column 'recentchanges.rc_cur_id' has a NOT NULL constraint\n" );
+ $this->output( "...column 'recentchanges.rc_cur_id' has a NOT NULL constraint\n" );
}
}
@@ -573,20 +594,20 @@ END;
$this->db->query( 'DROP INDEX pagelink_unique' );
$pu = null;
} else {
- $this->output( "... obsolete version of index 'pagelink_unique index' does not exist\n" );
+ $this->output( "...obsolete version of index 'pagelink_unique index' does not exist\n" );
}
if ( is_null( $pu ) ) {
$this->output( "Creating index 'pagelink_unique index'\n" );
$this->db->query( 'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' );
} else {
- $this->output( "... index 'pagelink_unique_index' already exists\n" );
+ $this->output( "...index 'pagelink_unique_index' already exists\n" );
}
}
protected function checkRevUserFkey() {
if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
- $this->output( "... constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
+ $this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
} else {
$this->output( "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT\n" );
$this->applyPatch( 'patch-revision_rev_user_fkey.sql' );
@@ -599,7 +620,7 @@ END;
$this->db->query( 'DROP INDEX ipb_address' );
}
if ( $this->db->indexExists( 'ipblocks', 'ipb_address_unique' ) ) {
- $this->output( "... have ipb_address_unique\n" );
+ $this->output( "...have ipb_address_unique\n" );
} else {
$this->output( "Adding ipb_address_unique index\n" );
$this->applyPatch( 'patch-ipb_address_unique.sql' );
@@ -616,12 +637,14 @@ END;
protected function tsearchFixes() {
# Tweak the page_title tsearch2 trigger to filter out slashes
# This is create or replace, so harmless to call if not needed
+ $this->output( "Refreshing ts2_page_title()...\n" );
$this->applyPatch( 'patch-ts2pagetitle.sql' );
# If the server is 8.3 or higher, rewrite the tsearch2 triggers
# in case they have the old 'default' versions
# Gather version numbers in case we need them
if ( $this->db->getServerVersion() >= 8.3 ) {
+ $this->output( "Rewriting tsearch2 triggers...\n" );
$this->applyPatch( 'patch-tsearch2funcs.sql' );
}
}
diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php
index 144e710d..658a3b16 100644
--- a/includes/installer/SqliteInstaller.php
+++ b/includes/installer/SqliteInstaller.php
@@ -13,6 +13,7 @@
* @since 1.17
*/
class SqliteInstaller extends DatabaseInstaller {
+ const MINIMUM_VERSION = '3.3.7';
/**
* @var DatabaseSqlite
@@ -32,6 +33,24 @@ class SqliteInstaller extends DatabaseInstaller {
return self::checkExtension( 'pdo_sqlite' );
}
+ /**
+ *
+ * @return Status:
+ */
+ public function checkPrerequisites() {
+ $result = Status::newGood();
+ // Bail out if SQLite is too old
+ $db = new DatabaseSqliteStandalone( ':memory:' );
+ if ( version_compare( $db->getServerVersion(), self::MINIMUM_VERSION, '<' ) ) {
+ $result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), self::MINIMUM_VERSION );
+ }
+ // Check for FTS3 full-text search module
+ if( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
+ $result->warning( 'config-no-fts3' );
+ }
+ return $result;
+ }
+
public function getGlobalDefaults() {
if ( isset( $_SERVER['DOCUMENT_ROOT'] ) ) {
$path = str_replace(
@@ -102,7 +121,7 @@ class SqliteInstaller extends DatabaseInstaller {
# if it's still writable
if ( $create ) {
wfSuppressWarnings();
- $ok = wfMkdirParents( $dir, 0700 );
+ $ok = wfMkdirParents( $dir, 0700, __METHOD__ );
wfRestoreWarnings();
if ( !$ok ) {
return Status::newFatal( 'config-sqlite-mkdir-error', $dir );
diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php
index 6b819f8e..e1bc2926 100644
--- a/includes/installer/SqliteUpdater.php
+++ b/includes/installer/SqliteUpdater.php
@@ -42,13 +42,13 @@ class SqliteUpdater extends DatabaseUpdater {
array( 'sqliteSetupSearchindex' ),
// 1.17
- array( 'addTable', 'iwlinks', 'patch-iwlinks.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', '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', '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( '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' ),
@@ -59,12 +59,24 @@ class SqliteUpdater extends DatabaseUpdater {
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( '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( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase.sql' ),
+ array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+ array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ug_group-length-increase.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' ) ) {
+ if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name', __METHOD__ ) ) {
$this->output( "...have initial indexes\n" );
return;
}
diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php
index 40726437..1ff77db7 100644
--- a/includes/installer/WebInstaller.php
+++ b/includes/installer/WebInstaller.php
@@ -355,6 +355,7 @@ class WebInstaller extends Installer {
/**
* Show an error message in a box. Parameters are like wfMsg().
+ * @param $msg
*/
public function showError( $msg /*...*/ ) {
$args = func_get_args();
@@ -366,6 +367,8 @@ class WebInstaller extends Installer {
/**
* Temporary error handler for session start debugging.
+ * @param $errno
+ * @param $errstr string
*/
public function errorHandler( $errno, $errstr ) {
$this->phpErrors[] = $errstr;
@@ -469,7 +472,6 @@ class WebInstaller extends Installer {
$this->setVar( '_UserLang', $wgLanguageCode );
} else {
$wgLanguageCode = $this->getVar( 'wgLanguageCode' );
- $wgLang = Language::factory( $this->getVar( '_UserLang' ) );
$wgContLang = Language::factory( $wgLanguageCode );
}
}
@@ -630,6 +632,7 @@ class WebInstaller extends Installer {
* Get small text indented help for a preceding form field.
* Parameters like wfMsg().
*
+ * @param $msg
* @return string
*/
public function getHelpBox( $msg /*, ... */ ) {
@@ -637,13 +640,12 @@ class WebInstaller extends Installer {
array_shift( $args );
$args = array_map( 'htmlspecialchars', $args );
$text = wfMsgReal( $msg, $args, false, false, false );
- $html = htmlspecialchars( $text );
$html = $this->parse( $text, true );
return "<div class=\"mw-help-field-container\">\n" .
- "<span class=\"mw-help-field-hint\">" . wfMsgHtml( 'config-help' ) . "</span>\n" .
- "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
- "</div>\n";
+ "<span class=\"mw-help-field-hint\">" . wfMsgHtml( 'config-help' ) . "</span>\n" .
+ "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
+ "</div>\n";
}
/**
@@ -675,18 +677,20 @@ class WebInstaller extends Installer {
* @param $status Status
*/
public function showStatusMessage( Status $status ) {
- $text = $status->getWikiText();
- $this->output->addWikiText(
- "<div class=\"config-message\">\n" .
- $text .
- "</div>"
- );
+ $errors = array_merge( $status->getErrorsArray(), $status->getWarningsArray() );
+ foreach ( $errors as $error ) {
+ call_user_func_array( array( $this, 'showMessage' ), $error );
+ }
}
/**
* Label a control by wrapping a config-input div around it and putting a
* label before it.
*
+ * @param $msg
+ * @param $forId
+ * @param $contents
+ * @param $helpData string
* @return string
*/
public function label( $msg, $forId, $contents, $helpData = "" ) {
@@ -1013,6 +1017,7 @@ class WebInstaller extends Installer {
/**
* Helper for Installer::docLink()
*
+ * @param $page
* @return string
*/
protected function getDocUrl( $page ) {
@@ -1028,6 +1033,9 @@ class WebInstaller extends Installer {
/**
* Extension tag hook for a documentation link.
*
+ * @param $linkText
+ * @param $attribs
+ * @param $parser
* @return string
*/
public function docLink( $linkText, $attribs, $parser ) {
@@ -1040,6 +1048,9 @@ class WebInstaller extends Installer {
/**
* Helper for "Download LocalSettings" link on WebInstall_Complete
*
+ * @param $text
+ * @param $attribs
+ * @param $parser
* @return String Html for download link
*/
public function downloadLinkHook( $text, $attribs, $parser ) {
@@ -1054,6 +1065,9 @@ class WebInstaller extends Installer {
return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
}
+ /**
+ * @return bool
+ */
public function envCheckPath( ) {
// PHP_SELF isn't available sometimes, such as when PHP is CGI but
// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
@@ -1071,9 +1085,10 @@ class WebInstaller extends Installer {
$this->showError( 'config-no-uri' );
return false;
}
-
-
return parent::envCheckPath();
}
+ protected function envGetDefaultServer() {
+ return WebRequest::detectServer();
+ }
}
diff --git a/includes/installer/WebInstallerOutput.php b/includes/installer/WebInstallerOutput.php
index 9eb2c2c6..ac97b37d 100644
--- a/includes/installer/WebInstallerOutput.php
+++ b/includes/installer/WebInstallerOutput.php
@@ -144,11 +144,7 @@ class WebInstallerOutput {
*/
public function getDir() {
global $wgLang;
- if( !is_object( $wgLang ) || !$wgLang->isRtl() ) {
- return 'ltr';
- } else {
- return 'rtl';
- }
+ return is_object( $wgLang ) ? $wgLang->getDir() : 'ltr';
}
/**
@@ -156,11 +152,7 @@ class WebInstallerOutput {
*/
public function getLanguageCode() {
global $wgLang;
- if( !is_object( $wgLang ) ) {
- return 'en';
- } else {
- return $wgLang->getCode();
- }
+ return is_object( $wgLang ) ? $wgLang->getCode() : 'en';
}
/**
@@ -240,7 +232,6 @@ class WebInstallerOutput {
href="http://www.mediawiki.org/"
title="Main Page"></a>
</div>
- <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<div class="portal"><div class="body">
<?php
echo $this->parent->parse( wfMsgNoTrans( 'config-sidebar' ), true );
diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php
index dc9c6d27..ff8185a1 100644
--- a/includes/installer/WebInstallerPage.php
+++ b/includes/installer/WebInstallerPage.php
@@ -69,7 +69,8 @@ abstract class WebInstallerPage {
if ( $continue ) {
// Fake submit button for enter keypress (bug 26267)
$s .= Xml::submitButton( wfMsg( "config-$continue" ),
- array( 'name' => "enter-$continue", 'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
+ array( 'name' => "enter-$continue", 'style' =>
+ 'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
}
if ( $back ) {
@@ -122,7 +123,7 @@ abstract class WebInstallerPage {
/**
* Get the end tag of a fieldset.
*
- * @returns string
+ * @return string
*/
protected function getFieldsetEnd() {
return "</fieldset>\n";
@@ -133,9 +134,11 @@ abstract class WebInstallerPage {
*/
protected function startLiveBox() {
$this->addHTML(
- '<div id="config-spinner" style="display:none;"><img src="../skins/common/images/ajax-loader.gif" /></div>' .
+ '<div id="config-spinner" style="display:none;">' .
+ '<img src="../skins/common/images/ajax-loader.gif" /></div>' .
'<script>jQuery( "#config-spinner" ).show();</script>' .
- '<div id="config-live-log"><textarea name="LiveLog" rows="10" cols="30" readonly="readonly">'
+ '<div id="config-live-log">' .
+ '<textarea name="LiveLog" rows="10" cols="30" readonly="readonly">'
);
$this->parent->output->flush();
}
@@ -155,9 +158,10 @@ class WebInstaller_Language extends WebInstallerPage {
public function execute() {
global $wgLang;
$r = $this->parent->request;
- $userLang = $r->getVal( 'UserLang' );
+ $userLang = $r->getVal( 'uselang' );
$contLang = $r->getVal( 'ContLang' );
+ $languages = Language::getLanguageNames();
$lifetime = intval( ini_get( 'session.gc_maxlifetime' ) );
if ( !$lifetime ) {
$lifetime = 1440; // PHP default
@@ -178,7 +182,6 @@ class WebInstaller_Language extends WebInstallerPage {
}
$this->parent->showError( $msg, $wgLang->formatTimePeriod( $lifetime ) );
} else {
- $languages = Language::getLanguageNames();
if ( isset( $languages[$userLang] ) ) {
$this->setVar( '_UserLang', $userLang );
}
@@ -190,7 +193,8 @@ class WebInstaller_Language extends WebInstallerPage {
} elseif ( $this->parent->showSessionWarning ) {
# The user was knocked back from another page to the start
# This probably indicates a session expiry
- $this->parent->showError( 'config-session-expired', $wgLang->formatTimePeriod( $lifetime ) );
+ $this->parent->showError( 'config-session-expired',
+ $wgLang->formatTimePeriod( $lifetime ) );
}
$this->parent->setSession( 'test', true );
@@ -203,8 +207,10 @@ class WebInstaller_Language extends WebInstallerPage {
}
$this->startForm();
$s = Html::hidden( 'LanguageRequestTime', time() ) .
- $this->getLanguageSelector( 'UserLang', 'config-your-language', $userLang, $this->parent->getHelpBox( 'config-your-language-help' ) ) .
- $this->getLanguageSelector( 'ContLang', 'config-wiki-language', $contLang, $this->parent->getHelpBox( 'config-wiki-language-help' ) );
+ $this->getLanguageSelector( 'uselang', 'config-your-language', $userLang,
+ $this->parent->getHelpBox( 'config-your-language-help' ) ) .
+ $this->getLanguageSelector( 'ContLang', 'config-wiki-language', $contLang,
+ $this->parent->getHelpBox( 'config-wiki-language-help' ) );
$this->addHTML( $s );
$this->endForm( 'continue', false );
}
@@ -212,6 +218,10 @@ class WebInstaller_Language extends WebInstallerPage {
/**
* Get a <select> for selecting languages.
*
+ * @param $name
+ * @param $label
+ * @param $selectedCode
+ * @param $helpHtml string
* @return string
*/
public function getLanguageSelector( $name, $label, $selectedCode, $helpHtml = '' ) {
@@ -219,13 +229,13 @@ class WebInstaller_Language extends WebInstallerPage {
$s = $helpHtml;
- $s .= Html::openElement( 'select', array( 'id' => $name, 'name' => $name, 'tabindex' => $this->parent->nextTabIndex() ) ) . "\n";
+ $s .= Html::openElement( 'select', array( 'id' => $name, 'name' => $name,
+ 'tabindex' => $this->parent->nextTabIndex() ) ) . "\n";
$languages = Language::getLanguageNames();
ksort( $languages );
- $dummies = array_flip( $wgDummyLanguageCodes );
foreach ( $languages as $code => $lang ) {
- if ( isset( $dummies[$code] ) ) continue;
+ if ( isset( $wgDummyLanguageCodes[$code] ) ) continue;
$s .= "\n" . Xml::option( "$code - $lang", $code, $code == $selectedCode );
}
$s .= "\n</select>\n";
@@ -270,7 +280,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
$this->startForm();
$this->addHTML( $this->parent->getInfoBox(
wfMsgNoTrans( 'config-upgrade-key-missing',
- "<pre>\$wgUpgradeKey = '" . $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )
+ "<pre dir=\"ltr\">\$wgUpgradeKey = '" . $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )
) );
$this->endForm( 'continue' );
return 'output';
@@ -336,7 +346,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
*/
protected function handleExistingUpgrade( $vars ) {
// Check $wgDBtype
- if ( !isset( $vars['wgDBtype'] ) || !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
+ if ( !isset( $vars['wgDBtype'] ) ||
+ !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
return Status::newFatal( 'config-localsettings-connection-error', '' );
}
@@ -447,12 +458,13 @@ class WebInstaller_DBConnect extends WebInstallerPage {
"</li>\n";
$settings .=
- Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type, 'class' => 'dbWrapper' ) ) .
+ Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
+ 'class' => 'dbWrapper' ) ) .
Html::element( 'h3', array(), wfMsg( 'config-header-' . $type ) ) .
$installer->getConnectForm() .
"</div>\n";
}
- $types .= "</ul><br clear=\"left\"/>\n";
+ $types .= "</ul><br style=\"clear: left\"/>\n";
$this->addHTML(
$this->parent->label( 'config-db-type', false, $types ) .
@@ -620,7 +632,8 @@ class WebInstaller_Name extends WebInstallerPage {
'label' => 'config-project-namespace',
'itemLabelPrefix' => 'config-ns-',
'values' => array( 'site-name', 'generic', 'other' ),
- 'commonAttribs' => array( 'class' => 'enableForOther', 'rel' => 'config_wgMetaNamespace' ),
+ 'commonAttribs' => array( 'class' => 'enableForOther',
+ 'rel' => 'config_wgMetaNamespace' ),
'help' => $this->parent->getHelpBox( 'config-project-namespace-help' )
) ) .
$this->parent->getTextBox( array(
@@ -894,12 +907,14 @@ class WebInstaller_Options extends WebInstallerPage {
$this->parent->getTextBox( array(
'var' => 'wgDeletedDirectory',
'label' => 'config-upload-deleted',
+ 'attribs' => array( 'dir' => 'ltr' ),
'help' => $this->parent->getHelpBox( 'config-upload-deleted-help' )
) ) .
'</div>' .
$this->parent->getTextBox( array(
'var' => 'wgLogo',
'label' => 'config-logo',
+ 'attribs' => array( 'dir' => 'ltr' ),
'help' => $this->parent->getHelpBox( 'config-logo-help' )
) )
);
@@ -1174,10 +1189,12 @@ class WebInstaller_Complete extends WebInstallerPage {
// 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 ) {
+ 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" );
+ $this->addHtml( "\n<script type=\"" . $GLOBALS['wgJsMimeType'] .
+ '">jQuery( document ).ready( function() { document.location=' .
+ Xml::encodeJsVar( $lsUrl) . "; } );</script>\n" );
} else {
$this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
}
diff --git a/includes/interwiki/Interwiki.php b/includes/interwiki/Interwiki.php
index 71bd9725..3aaa1c52 100644
--- a/includes/interwiki/Interwiki.php
+++ b/includes/interwiki/Interwiki.php
@@ -136,7 +136,7 @@ class Interwiki {
/**
* Load the interwiki, trying first memcached then the DB
*
- * @param $prefix The interwiki prefix
+ * @param $prefix string The interwiki prefix
* @return Boolean: the prefix is valid
*/
protected static function load( $prefix ) {
@@ -150,6 +150,9 @@ class Interwiki {
if ( !$iwData ) {
$key = wfMemcKey( 'interwiki', $prefix );
$iwData = $wgMemc->get( $key );
+ if ( $iwData === '!NONEXISTENT' ) {
+ return false; // negative cache hit
+ }
}
if( $iwData && is_array( $iwData ) ) { // is_array is hack for old keys
@@ -173,6 +176,8 @@ class Interwiki {
);
$wgMemc->add( $key, $mc, $wgInterwikiExpiry );
return $iw;
+ } else {
+ $wgMemc->add( $key, '!NONEXISTENT', $wgInterwikiExpiry ); // negative cache hit
}
return false;
@@ -181,8 +186,8 @@ class Interwiki {
/**
* Fill in member variables from an array (e.g. memcached result, Database::fetchRow, etc)
*
- * @param $mc Associative array: row from the interwiki table
- * @return Boolean: whether everything was there
+ * @param $mc array Associative array: row from the interwiki table
+ * @return Boolean|Interwiki whether everything was there
*/
protected static function loadFromArray( $mc ) {
if( isset( $mc['iw_url'] ) ) {
@@ -199,15 +204,130 @@ class Interwiki {
}
/**
+ * Fetch all interwiki prefixes from interwiki cache
+ *
+ * @param $local null|string If not null, limits output to local/non-local interwikis
+ * @return Array List of prefixes
+ * @since 1.19
+ */
+ protected static function getAllPrefixesCached( $local ) {
+ global $wgInterwikiCache, $wgInterwikiScopes, $wgInterwikiFallbackSite;
+ static $db, $site;
+
+ wfDebug( __METHOD__ . "()\n" );
+ if( !$db ) {
+ $db = CdbReader::open( $wgInterwikiCache );
+ }
+ /* Resolve site name */
+ if( $wgInterwikiScopes >= 3 && !$site ) {
+ $site = $db->get( '__sites:' . wfWikiID() );
+ if ( $site == '' ) {
+ $site = $wgInterwikiFallbackSite;
+ }
+ }
+
+ // List of interwiki sources
+ $sources = array();
+ // Global Level
+ if ( $wgInterwikiScopes >= 2 ) {
+ $sources[] = '__global';
+ }
+ // Site level
+ if ( $wgInterwikiScopes >= 3 ) {
+ $sources[] = '_' . $site;
+ }
+ $sources[] = wfWikiID();
+
+ $data = array();
+
+ foreach( $sources as $source ) {
+ $list = $db->get( "__list:{$source}" );
+ foreach ( explode( ' ', $list ) as $iw_prefix ) {
+ $row = $db->get( "{$source}:{$iw_prefix}" );
+ if( !$row ) {
+ continue;
+ }
+
+ list( $iw_local, $iw_url ) = explode( ' ', $row );
+
+ if ( $local !== null && $local != $iw_local ) {
+ continue;
+ }
+
+ $data[$iw_prefix] = array(
+ 'iw_prefix' => $iw_prefix,
+ 'iw_url' => $iw_url,
+ 'iw_local' => $iw_local,
+ );
+ }
+ }
+
+ ksort( $data );
+
+ return array_values( $data );
+ }
+
+ /**
+ * Fetch all interwiki prefixes from DB
+ *
+ * @param $local string|null If not null, limits output to local/non-local interwikis
+ * @return Array List of prefixes
+ * @since 1.19
+ */
+ protected static function getAllPrefixesDB( $local ) {
+ $db = wfGetDB( DB_SLAVE );
+
+ $where = array();
+
+ if ( $local !== null ) {
+ if ( $local == 1 ) {
+ $where['iw_local'] = 1;
+ } elseif ( $local == 0 ) {
+ $where['iw_local'] = 0;
+ }
+ }
+
+ $res = $db->select( 'interwiki',
+ array( 'iw_prefix', 'iw_url', 'iw_api', 'iw_wikiid', 'iw_local', 'iw_trans' ),
+ $where, __METHOD__, array( 'ORDER BY' => 'iw_prefix' )
+ );
+ $retval = array();
+ foreach ( $res as $row ) {
+ $retval[] = (array)$row;
+ }
+ return $retval;
+ }
+
+ /**
+ * Returns all interwiki prefixes
+ *
+ * @param $local string|null If set, limits output to local/non-local interwikis
+ * @return Array List of prefixes
+ * @since 1.19
+ */
+ public static function getAllPrefixes( $local = null ) {
+ global $wgInterwikiCache;
+
+ if ( $wgInterwikiCache ) {
+ return self::getAllPrefixesCached( $local );
+ } else {
+ return self::getAllPrefixesDB( $local );
+ }
+ }
+
+ /**
* Get the URL for a particular title (or with $1 if no title given)
*
* @param $title String: what text to put for the article name
* @return String: the URL
+ * @note Prior to 1.19 The getURL with an argument was broken.
+ * If you if you use this arg in an extension that supports MW earlier
+ * than 1.19 please wfUrlencode and substitute $1 on your own.
*/
public function getURL( $title = null ) {
$url = $this->mURL;
- if( $title != null ) {
- $url = str_replace( "$1", $title, $url );
+ if( $title !== null ) {
+ $url = str_replace( "$1", wfUrlencode( $title ), $url );
}
return $url;
}
diff --git a/includes/job/DoubleRedirectJob.php b/includes/job/DoubleRedirectJob.php
index d7991f5e..2b7cd7c8 100644
--- a/includes/job/DoubleRedirectJob.php
+++ b/includes/job/DoubleRedirectJob.php
@@ -19,7 +19,7 @@ class DoubleRedirectJob extends Job {
*/
static $user;
- /**
+ /**
* Insert jobs into the job queue to fix redirects to the given title
* @param $reason String: the reason for the fix, see message double-redirect-fixed-<reason>
* @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
@@ -28,10 +28,10 @@ class DoubleRedirectJob extends Job {
public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
# Need to use the master to get the redirect table updated in the same transaction
$dbw = wfGetDB( DB_MASTER );
- $res = $dbw->select(
- array( 'redirect', 'page' ),
- array( 'page_namespace', 'page_title' ),
- array(
+ $res = $dbw->select(
+ array( 'redirect', 'page' ),
+ array( 'page_namespace', 'page_title' ),
+ array(
'page_id = rd_from',
'rd_namespace' => $redirTitle->getNamespace(),
'rd_title' => $redirTitle->getDBkey()
@@ -46,7 +46,7 @@ class DoubleRedirectJob extends Job {
continue;
}
- $jobs[] = new self( $title, array(
+ $jobs[] = new self( $title, array(
'reason' => $reason,
'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
# Avoid excessive memory usage
@@ -65,6 +65,9 @@ class DoubleRedirectJob extends Job {
$this->destTitleText = !empty( $params['destTitle'] ) ? $params['destTitle'] : '';
}
+ /**
+ * @return bool
+ */
function run() {
if ( !$this->redirTitle ) {
$this->setLastError( 'Invalid title' );
@@ -103,13 +106,13 @@ class DoubleRedirectJob extends Job {
}
# Preserve fragment (bug 14904)
- $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
+ $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
$currentDest->getFragment() );
# Fix the text
# Remember that redirect pages can have categories, templates, etc.,
# so the regex has to be fairly general
- $newText = preg_replace( '/ \[ \[ [^\]]* \] \] /x',
+ $newText = preg_replace( '/ \[ \[ [^\]]* \] \] /x',
'[[' . $newTitle->getFullText() . ']]',
$text, 1 );
@@ -122,10 +125,10 @@ class DoubleRedirectJob extends Job {
global $wgUser;
$oldUser = $wgUser;
$wgUser = $this->getUser();
- $article = new Article( $this->title );
- $reason = wfMsgForContent( 'double-redirect-fixed-' . $this->reason,
+ $article = WikiPage::factory( $this->title );
+ $reason = wfMsgForContent( 'double-redirect-fixed-' . $this->reason,
$this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText() );
- $article->doEdit( $newText, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC );
+ $article->doEdit( $newText, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
$wgUser = $oldUser;
return true;
@@ -152,10 +155,10 @@ class DoubleRedirectJob extends Job {
}
$seenTitles[$titleText] = true;
- $row = $dbw->selectRow(
+ $row = $dbw->selectRow(
array( 'redirect', 'page' ),
array( 'rd_namespace', 'rd_title' ),
- array(
+ array(
'rd_from=page_id',
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey()
@@ -172,10 +175,12 @@ class DoubleRedirectJob extends Job {
/**
* Get a user object for doing edits, from a request-lifetime cache
+ * @return User
*/
function getUser() {
if ( !self::$user ) {
self::$user = User::newFromName( wfMsgForContent( 'double-redirect-fixer' ), false );
+ # FIXME: newFromName could return false on a badly configured wiki.
if ( !self::$user->isLoggedIn() ) {
self::$user->addToDatabase();
}
diff --git a/includes/job/EnotifNotifyJob.php b/includes/job/EnotifNotifyJob.php
index 5d2a08ea..eb154ece 100644
--- a/includes/job/EnotifNotifyJob.php
+++ b/includes/job/EnotifNotifyJob.php
@@ -20,10 +20,11 @@ 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 {
+ # FIXME: newFromName could return false on a badly configured wiki.
$editor = User::newFromName( $this->params['editor'], false );
}
$enotif->actuallyNotifyOnPageChange(
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
index 0d917ba3..e7c66719 100644
--- a/includes/job/JobQueue.php
+++ b/includes/job/JobQueue.php
@@ -213,6 +213,10 @@ abstract class Job {
throw new MWException( "Invalid job command `{$command}`" );
}
+ /**
+ * @param $params
+ * @return string
+ */
static function makeBlob( $params ) {
if ( $params !== false ) {
return serialize( $params );
@@ -221,6 +225,10 @@ abstract class Job {
}
}
+ /**
+ * @param $blob
+ * @return bool|mixed
+ */
static function extractBlob( $blob ) {
if ( (string)$blob !== '' ) {
return unserialize( $blob );
@@ -244,6 +252,10 @@ abstract class Job {
}
$dbw = wfGetDB( DB_MASTER );
$rows = array();
+
+ /**
+ * @var $job Job
+ */
foreach ( $jobs as $job ) {
$rows[] = $job->insertFields();
if ( count( $rows ) >= 50 ) {
@@ -323,13 +335,16 @@ abstract class Job {
if ( $this->removeDuplicates ) {
$res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
if ( $dbw->numRows( $res ) ) {
- return;
+ return true;
}
}
wfIncrStats( 'job-insert' );
return $dbw->insert( 'job', $fields, __METHOD__ );
}
+ /**
+ * @return array
+ */
protected function insertFields() {
$dbw = wfGetDB( DB_MASTER );
return array(
@@ -337,6 +352,7 @@ abstract class Job {
'job_cmd' => $this->command,
'job_namespace' => $this->title->getNamespace(),
'job_title' => $this->title->getDBkey(),
+ 'job_timestamp' => $dbw->timestamp(),
'job_params' => Job::makeBlob( $this->params )
);
}
@@ -362,6 +378,9 @@ abstract class Job {
}
}
+ /**
+ * @return string
+ */
function toString() {
$paramString = '';
if ( $this->params ) {
diff --git a/includes/job/RefreshLinksJob.php b/includes/job/RefreshLinksJob.php
index 910f0c58..1aa206f0 100644
--- a/includes/job/RefreshLinksJob.php
+++ b/includes/job/RefreshLinksJob.php
@@ -22,7 +22,7 @@ class RefreshLinksJob extends Job {
* @return boolean success
*/
function run() {
- global $wgParser;
+ global $wgParser, $wgContLang;
wfProfileIn( __METHOD__ );
$linkCache = LinkCache::singleton();
@@ -42,7 +42,7 @@ class RefreshLinksJob extends Job {
}
wfProfileIn( __METHOD__.'-parse' );
- $options = new ParserOptions;
+ $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
$parserOutput = $wgParser->parse( $revision->getText(), $this->title, $options, true, true, $revision->getId() );
wfProfileOut( __METHOD__.'-parse' );
wfProfileIn( __METHOD__.'-update' );
@@ -71,7 +71,7 @@ class RefreshLinksJob2 extends Job {
* @return boolean success
*/
function run() {
- global $wgParser;
+ global $wgParser, $wgContLang;
wfProfileIn( __METHOD__ );
@@ -88,8 +88,10 @@ class RefreshLinksJob2 extends Job {
wfProfileOut( __METHOD__ );
return false;
}
+ // Back compat for pre-r94435 jobs
+ $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
$titles = $this->title->getBacklinkCache()->getLinks(
- 'templatelinks', $this->params['start'], $this->params['end']);
+ $table, $this->params['start'], $this->params['end']);
# Not suitable for page load triggered job running!
# Gracefully switch to refreshLinks jobs if this happens.
@@ -103,6 +105,7 @@ class RefreshLinksJob2 extends Job {
wfProfileOut( __METHOD__ );
return true;
}
+ $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
# Re-parse each page that transcludes this page and update their tracking links...
foreach ( $titles as $title ) {
$revision = Revision::newFromTitle( $title );
@@ -112,7 +115,6 @@ class RefreshLinksJob2 extends Job {
return false;
}
wfProfileIn( __METHOD__.'-parse' );
- $options = new ParserOptions;
$parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
wfProfileOut( __METHOD__.'-parse' );
wfProfileIn( __METHOD__.'-update' );
diff --git a/includes/job/UploadFromUrlJob.php b/includes/job/UploadFromUrlJob.php
index 3f915245..26f6e4ba 100644
--- a/includes/job/UploadFromUrlJob.php
+++ b/includes/job/UploadFromUrlJob.php
@@ -61,24 +61,24 @@ class UploadFromUrlJob extends Job {
if ( !$this->params['ignoreWarnings'] ) {
$warnings = $this->upload->checkWarnings();
if ( $warnings ) {
- wfSetupSession( $this->params['sessionId'] );
+
+ # Stash the upload
+ $key = $this->upload->stashFile();
if ( $this->params['leaveMessage'] ) {
$this->user->leaveUserMessage(
wfMsg( 'upload-warning-subj' ),
wfMsg( 'upload-warning-msg',
- $this->params['sessionKey'],
+ $key,
$this->params['url'] )
);
} else {
+ wfSetupSession( $this->params['sessionId'] );
$this->storeResultInSession( 'Warning',
'warnings', $warnings );
+ session_write_close();
}
- # Stash the upload in the session
- $this->upload->stashSession( $this->params['sessionKey'] );
- session_write_close();
-
return true;
}
}
@@ -151,6 +151,10 @@ class UploadFromUrlJob extends Job {
$$session['result'] = 'Queued';
}
+ /**
+ * @param $key
+ * @return mixed
+ */
public static function &getSessionData( $key ) {
if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
$_SESSION[self::SESSION_KEYNAME][$key] = array();
diff --git a/includes/json/FormatJson.php b/includes/json/FormatJson.php
index 006f7720..f7373e45 100644
--- a/includes/json/FormatJson.php
+++ b/includes/json/FormatJson.php
@@ -11,11 +11,14 @@ if ( !defined( 'MEDIAWIKI' ) ) {
require_once dirname( __FILE__ ) . '/Services_JSON.php';
+/**
+ * JSON formatter wrapper class
+ */
class FormatJson {
-
+
/**
* Returns the JSON representation of a value.
- *
+ *
* @param $value Mixed: the value being encoded. Can be any type except a resource.
* @param $isHtml Boolean
*
@@ -23,7 +26,7 @@ class FormatJson {
* map to a parameter labeled "pretty-print output with indents and
* newlines" in Services_JSON::encode(), which has no string relation
* to HTML output.
- *
+ *
* @return string
*/
public static function encode( $value, $isHtml = false ) {
@@ -40,10 +43,10 @@ class FormatJson {
/**
* Decodes a JSON string.
- *
+ *
* @param $value String: the json string being decoded.
* @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
- *
+ *
* @return Mixed: the value encoded in json in appropriate PHP type.
* Values true, false and null (case-insensitive) are returned as true, false
* and &null; respectively. &null; is returned if the json cannot be
@@ -51,15 +54,13 @@ class FormatJson {
*/
public static function decode( $value, $assoc = false ) {
if ( !function_exists( 'json_decode' ) ) {
- if( $assoc )
- $json = new Services_JSON( SERVICES_JSON_LOOSE_TYPE );
- else
- $json = new Services_JSON();
+ $json = $assoc ? new Services_JSON( SERVICES_JSON_LOOSE_TYPE ) :
+ new Services_JSON();
$jsonDec = $json->decode( $value );
return $jsonDec;
} else {
return json_decode( $value, $assoc );
}
}
-
+
}
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
index 29cc3617..b2090dce 100644
--- a/includes/json/Services_JSON.php
+++ b/includes/json/Services_JSON.php
@@ -136,7 +136,7 @@ class Services_JSON
{
$this->use = $use;
}
-
+
private static $mHavePear = null;
/**
* Returns cached result of class_exists('pear'), to avoid calling AutoLoader numerous times
@@ -872,7 +872,7 @@ if (class_exists('PEAR_Error')) {
{
$this->message = $message;
}
-
+
function __toString()
{
return $this->message;
diff --git a/includes/libs/CSSJanus.php b/includes/libs/CSSJanus.php
index aa04bc49..c8fc296b 100644
--- a/includes/libs/CSSJanus.php
+++ b/includes/libs/CSSJanus.php
@@ -22,7 +22,9 @@
* written for LTR to RTL.
*
* The original Python version of CSSJanus is Copyright 2008 by Google Inc. and
- * is distributed under the Apache license.
+ * is distributed under the Apache license. This PHP port is Copyright 2010 by
+ * Roan Kattouw and is dual-licensed under the GPL (as in the comment above) and
+ * the Apache (as in the original code) licenses.
*
* Original code: http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus.py
* License of original code: http://code.google.com/p/cssjanus/source/browse/trunk/LICENSE
@@ -111,8 +113,8 @@ class CSSJanus {
$patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}/i";
// The two regexes below are parenthesized differently then in the original implementation to make the
// callback's job more straightforward
- $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)({$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
- $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)({$patterns['num']})(%)/";
+ $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)(-?{$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
+ $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)(-?{$patterns['num']})(%)/";
}
/**
@@ -173,6 +175,8 @@ class CSSJanus {
*
* See http://code.google.com/p/cssjanus/issues/detail?id=15 and
* TODO: URL
+ * @param $css string
+ * @return string
*/
private static function fixDirection( $css ) {
$css = preg_replace( self::$patterns['direction_ltr'],
@@ -185,6 +189,8 @@ class CSSJanus {
/**
* Replace 'ltr' with 'rtl' and vice versa in background URLs
+ * @param $css string
+ * @return string
*/
private static function fixLtrRtlInURL( $css ) {
$css = preg_replace( self::$patterns['ltr_in_url'], self::$patterns['tmpToken'], $css );
@@ -196,6 +202,8 @@ class CSSJanus {
/**
* Replace 'left' with 'right' and vice versa in background URLs
+ * @param $css string
+ * @return string
*/
private static function fixLeftRightInURL( $css ) {
$css = preg_replace( self::$patterns['left_in_url'], self::$patterns['tmpToken'], $css );
@@ -207,6 +215,8 @@ class CSSJanus {
/**
* Flip rules like left: , padding-right: , etc.
+ * @param $css string
+ * @return string
*/
private static function fixLeftAndRight( $css ) {
$css = preg_replace( self::$patterns['left'], self::$patterns['tmpToken'], $css );
@@ -218,6 +228,8 @@ class CSSJanus {
/**
* Flip East and West in rules like cursor: nw-resize;
+ * @param $css string
+ * @return string
*/
private static function fixCursorProperties( $css ) {
$css = preg_replace( self::$patterns['cursor_east'],
@@ -237,6 +249,8 @@ class CSSJanus {
* and four-part color rules with multiple whitespace characters between
* colors are not recognized.
* See http://code.google.com/p/cssjanus/issues/detail?id=16
+ * @param $css string
+ * @return string
*/
private static function fixFourPartNotation( $css ) {
$css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$7$4$5$6$3', $css );
@@ -247,6 +261,8 @@ class CSSJanus {
/**
* Flip horizontal background percentages.
+ * @param $css string
+ * @return string
*/
private static function fixBackgroundPosition( $css ) {
$css = preg_replace_callback( self::$patterns['bg_horizontal_percentage'],
@@ -259,6 +275,8 @@ class CSSJanus {
/**
* Callback for calculateNewBackgroundPosition()
+ * @param $matches array
+ * @return string
*/
private static function calculateNewBackgroundPosition( $matches ) {
return $matches[1] . ( 100 - $matches[2] ) . $matches[3];
@@ -295,6 +313,10 @@ class CSSJanus_Tokenizer {
return preg_replace_callback( $this->regex, array( $this, 'tokenizeCallback' ), $str );
}
+ /**
+ * @param $matches array
+ * @return string
+ */
private function tokenizeCallback( $matches ) {
$this->originals[] = $matches[0];
return $this->token;
@@ -314,6 +336,10 @@ class CSSJanus_Tokenizer {
array( $this, 'detokenizeCallback' ), $str );
}
+ /**
+ * @param $matches
+ * @return mixed
+ */
private function detokenizeCallback( $matches ) {
$retval = current( $this->originals );
next( $this->originals );
diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php
index 4012b695..4f4b28bb 100644
--- a/includes/libs/CSSMin.php
+++ b/includes/libs/CSSMin.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Copyright 2010 Wikimedia Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -79,6 +79,10 @@ class CSSMin {
return $files;
}
+ /**
+ * @param $file string
+ * @return bool|string
+ */
protected static function getMimeType( $file ) {
$realpath = realpath( $file );
// Try a couple of different ways to get the mime-type of a file, in order of
@@ -112,10 +116,10 @@ class CSSMin {
* @param $source string CSS data to remap
* @param $local string File path where the source was read from
* @param $remote string URL path to the file
- * @param $embed ???
+ * @param $embedData bool If false, never do any data URI embedding, even if / * @embed * / is found
* @return string Remapped CSS data
*/
- public static function remap( $source, $local, $remote, $embed = true ) {
+ public static function remap( $source, $local, $remote, $embedData = true ) {
$pattern = '/((?P<embed>\s*\/\*\s*\@embed\s*\*\/)(?P<pre>[^\;\}]*))?' .
self::URL_REGEX . '(?P<post>[^;]*)[\;]?/';
$offset = 0;
@@ -162,7 +166,7 @@ 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 ( $embed ) {
+ if ( $embedData && $embed ) {
$type = self::getMimeType( $file );
// Detect when URLs were preceeded with embed tags, and also verify file size is
// below the limit
diff --git a/includes/libs/IEContentAnalyzer.php b/includes/libs/IEContentAnalyzer.php
index a2ef1a09..01e72e68 100644
--- a/includes/libs/IEContentAnalyzer.php
+++ b/includes/libs/IEContentAnalyzer.php
@@ -1,19 +1,19 @@
<?php
/**
- * This class simulates Microsoft Internet Explorer's terribly broken and
+ * This class simulates Microsoft Internet Explorer's terribly broken and
* insecure MIME type detection algorithm. It can be used to check web uploads
- * with an apparently safe type, to see if IE will reinterpret them to produce
+ * with an apparently safe type, to see if IE will reinterpret them to produce
* something dangerous.
*
- * It is full of bugs and strange design choices should not under any
- * circumstances be used to determine a MIME type to present to a user or
+ * It is full of bugs and strange design choices should not under any
+ * circumstances be used to determine a MIME type to present to a user or
* client. (Apple Safari developers, this means you too.)
*
- * This class is based on a disassembly of IE 5.0, 6.0 and 7.0. Although I have
- * attempted to ensure that this code works in exactly the same way as Internet
- * Explorer, it does not share any source code, or creative choices such as
- * variable names, thus I (Tim Starling) claim copyright on it.
+ * This class is based on a disassembly of IE 5.0, 6.0 and 7.0. Although I have
+ * attempted to ensure that this code works in exactly the same way as Internet
+ * Explorer, it does not share any source code, or creative choices such as
+ * variable names, thus I (Tim Starling) claim copyright on it.
*
* It may be redistributed without restriction. To aid reuse, this class does
* not depend on any MediaWiki module.
@@ -24,8 +24,8 @@ class IEContentAnalyzer {
*/
protected $baseTypeTable = array(
'ambiguous' /*1*/ => array(
- 'text/plain',
- 'application/octet-stream',
+ 'text/plain',
+ 'application/octet-stream',
'application/x-netcdf', // [sic]
),
'text' /*3*/ => array(
@@ -34,8 +34,8 @@ class IEContentAnalyzer {
),
'binary' /*4*/ => array(
'application/pdf', 'audio/x-aiff', 'audio/basic', 'audio/wav', 'image/gif',
- 'image/pjpeg', 'image/jpeg', 'image/tiff', 'image/x-png', 'image/png', 'image/bmp',
- 'image/x-jg', 'image/x-art', 'image/x-emf', 'image/x-wmf', 'video/avi',
+ 'image/pjpeg', 'image/jpeg', 'image/tiff', 'image/x-png', 'image/png', 'image/bmp',
+ 'image/x-jg', 'image/x-art', 'image/x-emf', 'image/x-wmf', 'video/avi',
'video/x-msvideo', 'video/mpeg', 'application/x-compressed',
'application/x-zip-compressed', 'application/x-gzip-compressed', 'application/java',
'application/x-msdownload'
@@ -293,21 +293,21 @@ class IEContentAnalyzer {
'.xsl' => 'text/xml',
);
- /**
- * IE versions which have been analysed to bring you this class, and for
- * which some substantive difference exists. These will appear as keys
+ /**
+ * IE versions which have been analysed to bring you this class, and for
+ * which some substantive difference exists. These will appear as keys
* in the return value of getRealMimesFromData(). The names are chosen to sort correctly.
*/
protected $versions = array( 'ie05', 'ie06', 'ie07', 'ie07.strict', 'ie07.nohtml' );
/**
- * Type table with versions expanded
+ * Type table with versions expanded
*/
protected $typeTable = array();
/** constructor */
function __construct() {
- // Construct versioned type arrays from the base type array plus additions
+ // Construct versioned type arrays from the base type array plus additions
$types = $this->baseTypeTable;
foreach ( $this->versions as $version ) {
if ( isset( $this->addedTypes[$version] ) ) {
@@ -320,7 +320,7 @@ class IEContentAnalyzer {
}
/**
- * Get the MIME types from getMimesFromData(), but convert the result from IE's
+ * Get the MIME types from getMimesFromData(), but convert the result from IE's
* idiosyncratic private types into something other apps will understand.
*
* @param $fileName String: the file name (unused at present)
@@ -338,6 +338,8 @@ class IEContentAnalyzer {
/**
* Translate a MIME type from IE's idiosyncratic private types into
* more commonly understood type strings
+ * @param $type
+ * @return string
*/
public function translateMimeType( $type ) {
static $table = array(
@@ -375,6 +377,11 @@ class IEContentAnalyzer {
/**
* Get the MIME type for a given named version
+ * @param $version
+ * @param $fileName
+ * @param $chunk
+ * @param $proposed
+ * @return bool|string
*/
protected function getMimeTypeForVersion( $version, $fileName, $chunk, $proposed ) {
// Strip text after a semicolon
@@ -397,8 +404,8 @@ class IEContentAnalyzer {
// Truncate chunk at 255 bytes
$chunk = substr( $chunk, 0, 255 );
- // IE does the Check*Headers() calls last, and instead does the following image
- // type checks by directly looking for the magic numbers. What I do here should
+ // IE does the Check*Headers() calls last, and instead does the following image
+ // type checks by directly looking for the magic numbers. What I do here should
// have the same effect since the magic number checks are identical in both cases.
$result = $this->sampleData( $version, $chunk );
$sampleFound = $result['found'];
@@ -413,7 +420,7 @@ class IEContentAnalyzer {
return 'image/gif';
}
if ( ( $proposed == 'image/pjpeg' || $proposed == 'image/jpeg' )
- && $binaryType == 'image/pjpeg' )
+ && $binaryType == 'image/pjpeg' )
{
return $proposed;
}
@@ -430,7 +437,7 @@ class IEContentAnalyzer {
return 'application/x-cdf';
}
- // RSS and Atom were added in IE 7 so they won't be in $sampleFound for
+ // RSS and Atom were added in IE 7 so they won't be in $sampleFound for
// previous versions
if ( isset( $sampleFound['rss'] ) ) {
return 'application/rss+xml';
@@ -483,8 +490,8 @@ class IEContentAnalyzer {
// Freaky heuristics to determine if the data is text or binary
// The heuristic is of course broken for non-ASCII text
- if ( $counters['ctrl'] != 0 && ( $counters['ff'] + $counters['low'] )
- < ( $counters['ctrl'] + $counters['high'] ) * 16 )
+ if ( $counters['ctrl'] != 0 && ( $counters['ff'] + $counters['low'] )
+ < ( $counters['ctrl'] + $counters['high'] ) * 16 )
{
$kindOfBinary = true;
$type = $binaryType ? $binaryType : $textType;
@@ -529,8 +536,8 @@ class IEContentAnalyzer {
return $this->registry[$ext];
}
- // TODO: If the extension has an application registered to it, IE will return
- // application/octet-stream. We'll skip that, so we could erroneously
+ // TODO: If the extension has an application registered to it, IE will return
+ // application/octet-stream. We'll skip that, so we could erroneously
// return text/plain or application/x-netcdf where application/octet-stream
// would be correct.
@@ -540,6 +547,9 @@ class IEContentAnalyzer {
/**
* Check for text headers at the start of the chunk
* Confirmed same in 5 and 7.
+ * @param $version
+ * @param $chunk
+ * @return bool|string
*/
private function checkTextHeaders( $version, $chunk ) {
$chunk2 = substr( $chunk, 0, 2 );
@@ -563,6 +573,9 @@ class IEContentAnalyzer {
/**
* Check for binary headers at the start of the chunk
* Confirmed same in 5 and 7.
+ * @param $version
+ * @param $chunk
+ * @return bool|string
*/
private function checkBinaryHeaders( $version, $chunk ) {
$chunk2 = substr( $chunk, 0, 2 );
@@ -578,13 +591,13 @@ class IEContentAnalyzer {
return 'image/pjpeg'; // actually plain JPEG but this is what IE returns
}
- if ( $chunk2 == 'BM'
+ if ( $chunk2 == 'BM'
&& substr( $chunk, 6, 2 ) == "\000\000"
&& substr( $chunk, 8, 2 ) == "\000\000" )
{
return 'image/bmp'; // another non-standard MIME
}
- if ( $chunk4 == 'RIFF'
+ if ( $chunk4 == 'RIFF'
&& substr( $chunk, 8, 4 ) == 'WAVE' )
{
return 'audio/wav';
@@ -661,6 +674,9 @@ class IEContentAnalyzer {
/**
* Do heuristic checks on the bulk of the data sample.
* Search for HTML tags.
+ * @param $version
+ * @param $chunk
+ * @return array
*/
protected function sampleData( $version, $chunk ) {
$found = array();
@@ -774,7 +790,7 @@ class IEContentAnalyzer {
}
if ( !strncasecmp( $remainder, $rdfPurl, strlen( $rdfPurl ) ) ) {
- if ( isset( $found['rdf-tag'] )
+ if ( isset( $found['rdf-tag'] )
&& isset( $found['rdf-url'] ) ) // [sic]
{
break;
@@ -808,6 +824,11 @@ class IEContentAnalyzer {
return array( 'found' => $found, 'counters' => $counters );
}
+ /**
+ * @param $version
+ * @param $type
+ * @return int|string
+ */
protected function getDataFormat( $version, $type ) {
$types = $this->typeTable[$version];
if ( $type == '(null)' || strval( $type ) === '' ) {
diff --git a/includes/libs/IEUrlExtension.php b/includes/libs/IEUrlExtension.php
index 100454d4..e00e6663 100644
--- a/includes/libs/IEUrlExtension.php
+++ b/includes/libs/IEUrlExtension.php
@@ -1,31 +1,31 @@
<?php
/**
- * Internet Explorer derives a cache filename from a URL, and then in certain
- * circumstances, uses the extension of the resulting file to determine the
- * content type of the data, ignoring the Content-Type header.
+ * Internet Explorer derives a cache filename from a URL, and then in certain
+ * circumstances, uses the extension of the resulting file to determine the
+ * content type of the data, ignoring the Content-Type header.
*
* This can be a problem, especially when non-HTML content is sent by MediaWiki,
* and Internet Explorer interprets it as HTML, exposing an XSS vulnerability.
*
- * Usually the script filename (e.g. api.php) is present in the URL, and this
+ * Usually the script filename (e.g. api.php) is present in the URL, and this
* makes Internet Explorer think the extension is a harmless script extension.
- * But Internet Explorer 6 and earlier allows the script extension to be
- * obscured by encoding the dot as "%2E".
+ * But Internet Explorer 6 and earlier allows the script extension to be
+ * obscured by encoding the dot as "%2E".
*
- * This class contains functions which help in detecting and dealing with this
+ * This class contains functions which help in detecting and dealing with this
* situation.
*
- * Checking the URL for a bad extension is somewhat complicated due to the fact
+ * Checking the URL for a bad extension is somewhat complicated due to the fact
* that CGI doesn't provide a standard method to determine the URL. Instead it
- * is necessary to pass a subset of $_SERVER variables, which we then attempt
+ * is necessary to pass a subset of $_SERVER variables, which we then attempt
* to use to guess parts of the URL.
*/
class IEUrlExtension {
/**
* Check a subset of $_SERVER (or the whole of $_SERVER if you like)
- * to see if it indicates that the request was sent with a bad file
- * extension. Returns true if the request should be denied or modified,
+ * to see if it indicates that the request was sent with a bad file
+ * extension. Returns true if the request should be denied or modified,
* false otherwise. The relevant $_SERVER elements are:
*
* - SERVER_SOFTWARE
@@ -37,6 +37,7 @@ class IEUrlExtension {
*
* @param $vars A subset of $_SERVER.
* @param $extWhitelist Extensions which are allowed, assumed harmless.
+ * @return bool
*/
public static function areServerVarsBad( $vars, $extWhitelist = array() ) {
// Check QUERY_STRING or REQUEST_URI
@@ -55,7 +56,7 @@ class IEUrlExtension {
return true;
}
- // Some servers have PATH_INFO but not REQUEST_URI, so we check both
+ // Some servers have PATH_INFO but not REQUEST_URI, so we check both
// to be on the safe side.
if ( isset( $vars['PATH_INFO'] )
&& self::isUrlExtensionBad( $vars['PATH_INFO'], $extWhitelist ) )
@@ -71,7 +72,7 @@ class IEUrlExtension {
* Given a right-hand portion of a URL, determine whether IE would detect
* a potentially harmful file extension.
*
- * @param $urlPart The right-hand portion of a URL
+ * @param $urlPart string The right-hand portion of a URL
* @param $extWhitelist An array of file extensions which may occur in this
* URL, and which should be allowed.
* @return bool
@@ -97,10 +98,10 @@ class IEUrlExtension {
}
if ( !preg_match( '/^[a-zA-Z0-9_-]+$/', $extension ) ) {
- // Non-alphanumeric extension, unlikely to be registered.
+ // Non-alphanumeric extension, unlikely to be registered.
//
// The regex above is known to match all registered file extensions
- // in a default Windows XP installation. It's important to allow
+ // in a default Windows XP installation. It's important to allow
// extensions with ampersands and percent signs, since that reduces
// the number of false positives substantially.
return false;
@@ -111,8 +112,11 @@ class IEUrlExtension {
}
/**
- * Returns a variant of $url which will pass isUrlExtensionBad() but has the
+ * Returns a variant of $url which will pass isUrlExtensionBad() but has the
* same GET parameters, or false if it can't figure one out.
+ * @param $url
+ * @param $extWhitelist array
+ * @return bool|string
*/
public static function fixUrlForIE6( $url, $extWhitelist = array() ) {
$questionPos = strpos( $url, '?' );
@@ -127,7 +131,7 @@ class IEUrlExtension {
$query = substr( $url, $questionPos + 1 );
}
- // Multiple question marks cause problems. Encode the second and
+ // Multiple question marks cause problems. Encode the second and
// subsequent question mark.
$query = str_replace( '?', '%3E', $query );
// Append an invalid path character so that IE6 won't see the end of the
@@ -153,16 +157,16 @@ class IEUrlExtension {
* insecure.
*
* The criteria for finding an extension are as follows:
- * - a possible extension is a dot followed by one or more characters not
+ * - a possible extension is a dot followed by one or more characters not
* in <>\"/:|?.#
- * - if we find a possible extension followed by the end of the string or
+ * - if we find a possible extension followed by the end of the string or
* a #, that's our extension
* - if we find a possible extension followed by a ?, that's our extension
- * - UNLESS it's exe, dll or cgi, in which case we ignore it and continue
+ * - UNLESS it's exe, dll or cgi, in which case we ignore it and continue
* searching for another possible extension
- * - if we find a possible extension followed by a dot or another illegal
+ * - if we find a possible extension followed by a dot or another illegal
* character, we ignore it and continue searching
- *
+ *
* @param $url string URL
* @return mixed Detected extension (string), or false if none found
*/
@@ -182,7 +186,7 @@ class IEUrlExtension {
// End of string, we're done
return false;
}
-
+
// We found a dot. Skip past it
$pos++;
$remainingLength = $urlLength - $pos;
@@ -220,12 +224,12 @@ class IEUrlExtension {
* with %2E not decoded to ".". On such a server, it is possible to detect
* whether the script filename has been obscured.
*
- * The function returns false if the server is not known to have this
+ * The function returns false if the server is not known to have this
* behaviour. Microsoft IIS in particular is known to decode escaped script
* filenames.
*
* SERVER_SOFTWARE typically contains either a plain string such as "Zeus",
- * or a specification in the style of a User-Agent header, such as
+ * or a specification in the style of a User-Agent header, such as
* "Apache/1.3.34 (Unix) mod_ssl/2.8.25 OpenSSL/0.9.8a PHP/4.4.2"
*
* @param $serverSoftware
@@ -234,8 +238,8 @@ class IEUrlExtension {
*/
public static function haveUndecodedRequestUri( $serverSoftware ) {
static $whitelist = array(
- 'Apache',
- 'Zeus',
+ 'Apache',
+ 'Zeus',
'LiteSpeed' );
if ( preg_match( '/^(.*?)($|\/| )/', $serverSoftware, $m ) ) {
return in_array( $m[1], $whitelist );
diff --git a/includes/libs/JavaScriptMinifier.php b/includes/libs/JavaScriptMinifier.php
index a991d915..baf93385 100644
--- a/includes/libs/JavaScriptMinifier.php
+++ b/includes/libs/JavaScriptMinifier.php
@@ -484,22 +484,42 @@ class JavaScriptMinifier {
$end++;
}
} elseif(
+ $ch === '0'
+ && ($pos + 1 < $length) && ($s[$pos + 1] === 'x' || $s[$pos + 1] === 'X' )
+ ) {
+ // Hex numeric literal
+ $end++; // x or X
+ $len = strspn( $s, '0123456789ABCDEFabcdef', $end );
+ if ( !$len ) {
+ return self::parseError($s, $pos, 'Expected a hexadecimal number but found ' . substr( $s, $pos, 5 ) . '...' );
+ }
+ $end += $len;
+ } elseif(
ctype_digit( $ch )
|| ( $ch === '.' && $pos + 1 < $length && ctype_digit( $s[$pos + 1] ) )
) {
- // Numeric literal. Search for the end of it, but don't care about [+-]exponent
- // at the end, as the results of "numeric [+-] numeric" and "numeric" are
- // identical to our state machine.
- $end += strspn( $s, '0123456789ABCDEFabcdefXx.', $end );
- while( $s[$end - 1] === '.' ) {
- // Special case: When a numeric ends with a dot, we have to check the
- // literal for proper syntax
- $decimal = strspn( $s, '0123456789', $pos, $end - $pos - 1 );
- if( $decimal === $end - $pos - 1 ) {
- break;
- } else {
- $end--;
+ $end += strspn( $s, '0123456789', $end );
+ $decimal = strspn( $s, '.', $end );
+ if ($decimal) {
+ if ( $decimal > 2 ) {
+ return self::parseError($s, $end, 'The number has too many decimal points' );
+ }
+ $end += strspn( $s, '0123456789', $end + 1 ) + $decimal;
+ }
+ $exponent = strspn( $s, 'eE', $end );
+ if( $exponent ) {
+ if ( $exponent > 1 ) {
+ return self::parseError($s, $end, 'Number with several E' );
+ }
+ $end++;
+
+ // + sign is optional; - sign is required.
+ $end += strspn( $s, '-+', $end );
+ $len = strspn( $s, '0123456789', $end );
+ if ( !$len ) {
+ return self::parseError($s, $pos, 'No decimal digits after e, how many zeroes should be added?' );
}
+ $end += $len;
}
} elseif( isset( $opChars[$ch] ) ) {
// Punctuation character. Search for the longest matching operator.
@@ -576,4 +596,9 @@ class JavaScriptMinifier {
}
return $out;
}
+
+ static function parseError($fullJavascript, $position, $errorMsg) {
+ // TODO: Handle the error: trigger_error, throw exception, return false...
+ return false;
+ }
}
diff --git a/includes/libs/jsminplus.php b/includes/libs/jsminplus.php
index bab4ff49..8ed08d74 100644
--- a/includes/libs/jsminplus.php
+++ b/includes/libs/jsminplus.php
@@ -1,7 +1,7 @@
<?php
/**
- * JSMinPlus version 1.3
+ * JSMinPlus version 1.4
*
* Minifies a javascript file using a javascript parser
*
@@ -15,8 +15,10 @@
* Usage: $minified = JSMinPlus::minify($script [, $filename])
*
* Versionlog (see also changelog.txt):
- * 19-07-2011 - expanded operator and keyword defines. Fixes the notices when creating several JSTokenizer
- * 17-05-2009 - fixed hook:colon precedence, fixed empty body in loop and if-constructs
+ * 23-07-2011 - remove dynamic creation of OP_* and KEYWORD_* defines and declare them on top
+ * reduce memory footprint by minifying by block-scope
+ * some small byte-saving and performance improvements
+ * 12-05-2009 - fixed hook:colon precedence, fixed empty body in loop and if-constructs
* 18-04-2009 - fixed crashbug in PHP 5.2.9 and several other bugfixes
* 12-04-2009 - some small bugfixes and performance improvements
* 09-04-2009 - initial open sourced version 1.0
@@ -46,7 +48,7 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Tino Zijdel <crisp@tweakers.net>
- * PHP port, modifications and minifier routine are (C) 2009
+ * PHP port, modifications and minifier routine are (C) 2009-2011
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -86,6 +88,8 @@ define('JS_SETTER', 111);
define('JS_GROUP', 112);
define('JS_LIST', 113);
+define('JS_MINIFIED', 999);
+
define('DECLARED_FORM', 0);
define('EXPRESSED_FORM', 1);
define('STATEMENT_FORM', 2);
@@ -188,7 +192,7 @@ class JSMinPlus
private function __construct()
{
- $this->parser = new JSParser();
+ $this->parser = new JSParser($this);
}
public static function minify($js, $filename='')
@@ -217,22 +221,18 @@ class JSMinPlus
return false;
}
- private function parseTree($n, $noBlockGrouping = false)
+ public function parseTree($n, $noBlockGrouping = false)
{
$s = '';
switch ($n->type)
{
- case KEYWORD_FUNCTION:
- $s .= 'function' . ($n->name ? ' ' . $n->name : '') . '(';
- $params = $n->params;
- for ($i = 0, $j = count($params); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $params[$i];
- $s .= '){' . $this->parseTree($n->body, true) . '}';
+ case JS_MINIFIED:
+ $s = $n->value;
break;
case JS_SCRIPT:
- // we do nothing with funDecls or varDecls
+ // we do nothing yet with funDecls or varDecls
$noBlockGrouping = true;
// FALL THROUGH
@@ -279,6 +279,14 @@ class JSMinPlus
}
break;
+ case KEYWORD_FUNCTION:
+ $s .= 'function' . ($n->name ? ' ' . $n->name : '') . '(';
+ $params = $n->params;
+ for ($i = 0, $j = count($params); $i < $j; $i++)
+ $s .= ($i ? ',' : '') . $params[$i];
+ $s .= '){' . $this->parseTree($n->body, true) . '}';
+ break;
+
case KEYWORD_IF:
$s = 'if(' . $this->parseTree($n->condition) . ')';
$thenPart = $this->parseTree($n->thenPart);
@@ -385,19 +393,14 @@ class JSMinPlus
break;
case KEYWORD_THROW:
- $s = 'throw ' . $this->parseTree($n->exception);
- break;
-
case KEYWORD_RETURN:
- $s = 'return';
+ $s = $n->type;
if ($n->value)
{
$t = $this->parseTree($n->value);
if (strlen($t))
{
- if ( $t[0] != '(' && $t[0] != '[' && $t[0] != '{' &&
- $t[0] != '"' && $t[0] != "'" && $t[0] != '/'
- )
+ if ($this->isWordChar($t[0]) || $t[0] == '\\')
$s .= ' ';
$s .= $t;
@@ -423,6 +426,40 @@ class JSMinPlus
}
break;
+ case KEYWORD_IN:
+ case KEYWORD_INSTANCEOF:
+ $left = $this->parseTree($n->treeNodes[0]);
+ $right = $this->parseTree($n->treeNodes[1]);
+
+ $s = $left;
+
+ if ($this->isWordChar(substr($left, -1)))
+ $s .= ' ';
+
+ $s .= $n->type;
+
+ if ($this->isWordChar($right[0]) || $right[0] == '\\')
+ $s .= ' ';
+
+ $s .= $right;
+ break;
+
+ case KEYWORD_DELETE:
+ case KEYWORD_TYPEOF:
+ $right = $this->parseTree($n->treeNodes[0]);
+
+ $s = $n->type;
+
+ if ($this->isWordChar($right[0]) || $right[0] == '\\')
+ $s .= ' ';
+
+ $s .= $right;
+ break;
+
+ case KEYWORD_VOID:
+ $s = 'void(' . $this->parseTree($n->treeNodes[0]) . ')';
+ break;
+
case KEYWORD_DEBUGGER:
throw new Exception('NOT IMPLEMENTED: DEBUGGER');
break;
@@ -497,26 +534,6 @@ class JSMinPlus
}
break;
- case KEYWORD_IN:
- $s = $this->parseTree($n->treeNodes[0]) . ' in ' . $this->parseTree($n->treeNodes[1]);
- break;
-
- case KEYWORD_INSTANCEOF:
- $s = $this->parseTree($n->treeNodes[0]) . ' instanceof ' . $this->parseTree($n->treeNodes[1]);
- break;
-
- case KEYWORD_DELETE:
- $s = 'delete ' . $this->parseTree($n->treeNodes[0]);
- break;
-
- case KEYWORD_VOID:
- $s = 'void(' . $this->parseTree($n->treeNodes[0]) . ')';
- break;
-
- case KEYWORD_TYPEOF:
- $s = 'typeof ' . $this->parseTree($n->treeNodes[0]);
- break;
-
case OP_NOT:
case OP_BITWISE_NOT:
case OP_UNARY_PLUS:
@@ -606,13 +623,33 @@ class JSMinPlus
$s .= '}';
break;
+ case TOKEN_NUMBER:
+ $s = $n->value;
+ if (preg_match('/^([1-9]+)(0{3,})$/', $s, $m))
+ $s = $m[1] . 'e' . strlen($m[2]);
+ break;
+
case KEYWORD_NULL: case KEYWORD_THIS: case KEYWORD_TRUE: case KEYWORD_FALSE:
- case TOKEN_IDENTIFIER: case TOKEN_NUMBER: case TOKEN_STRING: case TOKEN_REGEXP:
+ case TOKEN_IDENTIFIER: case TOKEN_STRING: case TOKEN_REGEXP:
$s = $n->value;
break;
case JS_GROUP:
- $s = '(' . $this->parseTree($n->treeNodes[0]) . ')';
+ if (in_array(
+ $n->treeNodes[0]->type,
+ array(
+ JS_ARRAY_INIT, JS_OBJECT_INIT, JS_GROUP,
+ TOKEN_NUMBER, TOKEN_STRING, TOKEN_REGEXP, TOKEN_IDENTIFIER,
+ KEYWORD_NULL, KEYWORD_THIS, KEYWORD_TRUE, KEYWORD_FALSE
+ )
+ ))
+ {
+ $s = $this->parseTree($n->treeNodes[0]);
+ }
+ else
+ {
+ $s = '(' . $this->parseTree($n->treeNodes[0]) . ')';
+ }
break;
default:
@@ -626,11 +663,17 @@ class JSMinPlus
{
return preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $string) && !in_array($string, $this->reserved);
}
+
+ private function isWordChar($char)
+ {
+ return $char == '_' || $char == '$' || ctype_alnum($char);
+ }
}
class JSParser
{
private $t;
+ private $minifier;
private $opPrecedence = array(
';' => 0,
@@ -680,8 +723,9 @@ class JSParser
TOKEN_CONDCOMMENT_START => 1, TOKEN_CONDCOMMENT_END => 1
);
- public function __construct()
+ public function __construct($minifier=null)
{
+ $this->minifier = $minifier;
$this->t = new JSTokenizer();
}
@@ -705,6 +749,19 @@ class JSParser
$n->funDecls = $x->funDecls;
$n->varDecls = $x->varDecls;
+ // minify by scope
+ if ($this->minifier)
+ {
+ $n->value = $this->minifier->parseTree($n);
+
+ // clear tree from node to save memory
+ $n->treeNodes = null;
+ $n->funDecls = null;
+ $n->varDecls = null;
+
+ $n->type = JS_MINIFIED;
+ }
+
return $n;
}
@@ -963,7 +1020,7 @@ class JSParser
case KEYWORD_THROW:
$n = new JSNode($this->t);
- $n->exception = $this->Expression($x);
+ $n->value = $this->Expression($x);
break;
case KEYWORD_RETURN:
@@ -1678,44 +1735,11 @@ class JSTokenizer
);
private $opTypeNames = array(
- ';' => 'SEMICOLON',
- ',' => 'COMMA',
- '?' => 'HOOK',
- ':' => 'COLON',
- '||' => 'OR',
- '&&' => 'AND',
- '|' => 'BITWISE_OR',
- '^' => 'BITWISE_XOR',
- '&' => 'BITWISE_AND',
- '===' => 'STRICT_EQ',
- '==' => 'EQ',
- '=' => 'ASSIGN',
- '!==' => 'STRICT_NE',
- '!=' => 'NE',
- '<<' => 'LSH',
- '<=' => 'LE',
- '<' => 'LT',
- '>>>' => 'URSH',
- '>>' => 'RSH',
- '>=' => 'GE',
- '>' => 'GT',
- '++' => 'INCREMENT',
- '--' => 'DECREMENT',
- '+' => 'PLUS',
- '-' => 'MINUS',
- '*' => 'MUL',
- '/' => 'DIV',
- '%' => 'MOD',
- '!' => 'NOT',
- '~' => 'BITWISE_NOT',
- '.' => 'DOT',
- '[' => 'LEFT_BRACKET',
- ']' => 'RIGHT_BRACKET',
- '{' => 'LEFT_CURLY',
- '}' => 'RIGHT_CURLY',
- '(' => 'LEFT_PAREN',
- ')' => 'RIGHT_PAREN',
- '@*/' => 'CONDCOMMENT_END'
+ ';', ',', '?', ':', '||', '&&', '|', '^',
+ '&', '===', '==', '=', '!==', '!=', '<<', '<=',
+ '<', '>>>', '>>', '>=', '>', '++', '--', '+',
+ '-', '*', '/', '%', '!', '~', '.', '[',
+ ']', '{', '}', '(', ')', '@*/'
);
private $assignOps = array('|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%');
@@ -1723,7 +1747,7 @@ class JSTokenizer
public function __construct()
{
- $this->opRegExp = '#^(' . implode('|', array_map('preg_quote', array_keys($this->opTypeNames))) . ')#';
+ $this->opRegExp = '#^(' . implode('|', array_map('preg_quote', $this->opTypeNames)) . ')#';
}
public function init($source, $filename = '', $lineno = 1)
@@ -1874,22 +1898,38 @@ class JSTokenizer
{
switch ($input[0])
{
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- if (preg_match('/^\d+\.\d*(?:[eE][-+]?\d+)?|^\d+(?:\.\d*)?[eE][-+]?\d+/', $input, $match))
+ case '0':
+ // hexadecimal
+ if (($input[1] == 'x' || $input[1] == 'X') && preg_match('/^0x[0-9a-f]+/i', $input, $match))
{
$tt = TOKEN_NUMBER;
+ break;
}
- else if (preg_match('/^0[xX][\da-fA-F]+|^0[0-7]*|^\d+/', $input, $match))
+ // FALL THROUGH
+
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ // should always match
+ preg_match('/^\d+(?:\.\d*)?(?:[eE][-+]?\d+)?/', $input, $match);
+ $tt = TOKEN_NUMBER;
+ break;
+
+ case "'":
+ if (preg_match('/^\'(?:[^\\\\\'\r\n]++|\\\\(?:.|\r?\n))*\'/', $input, $match))
{
- // this should always match because of \d+
- $tt = TOKEN_NUMBER;
+ $tt = TOKEN_STRING;
+ }
+ else
+ {
+ if ($chunksize)
+ return $this->get(null); // retry with a full chunk fetch
+
+ throw $this->newSyntaxError('Unterminated string literal');
}
break;
case '"':
- case "'":
- if (preg_match('/^"(?:\\\\(?:.|\r?\n)|[^\\\\"\r\n]+)*"|^\'(?:\\\\(?:.|\r?\n)|[^\\\\\'\r\n]+)*\'/', $input, $match))
+ if (preg_match('/^"(?:[^\\\\"\r\n]++|\\\\(?:.|\r?\n))*"/', $input, $match))
{
$tt = TOKEN_STRING;
}
@@ -2091,4 +2131,3 @@ class JSToken
public $lineno;
public $assignOp;
}
-
diff --git a/includes/logging/LogEntry.php b/includes/logging/LogEntry.php
new file mode 100644
index 00000000..4aa6a826
--- /dev/null
+++ b/includes/logging/LogEntry.php
@@ -0,0 +1,518 @@
+<?php
+/**
+ * Contain classes for dealing with individual log entries
+ *
+ * This is how I see the log system history:
+ * - appending to plain wiki pages
+ * - formatting log entries based on database fields
+ * - user is now part of the action message
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.19
+ */
+
+/**
+ * Interface for log entries. Every log entry has these methods.
+ * @since 1.19
+ */
+interface LogEntry {
+
+ /**
+ * The main log type.
+ * @return string
+ */
+ public function getType();
+
+ /**
+ * The log subtype.
+ * @return string
+ */
+ public function getSubtype();
+
+ /**
+ * The full logtype in format maintype/subtype.
+ * @return string
+ */
+ public function getFullType();
+
+ /**
+ * Get the extra parameters stored for this message.
+ * @return array
+ */
+ public function getParameters();
+
+ /**
+ * Get the user for performed this action.
+ * @return User
+ */
+ public function getPerformer();
+
+ /**
+ * Get the target page of this action.
+ * @return Title
+ */
+ public function getTarget();
+
+ /**
+ * Get the timestamp when the action was executed.
+ * @return string
+ */
+ public function getTimestamp();
+
+ /**
+ * Get the user provided comment.
+ * @return string
+ */
+ public function getComment();
+
+ /**
+ * Get the access restriction.
+ * @return string
+ */
+ public function getDeleted();
+
+ /**
+ * @param $field Integer: one of LogPage::DELETED_* bitfield constants
+ * @return Boolean
+ */
+ public function isDeleted( $field );
+}
+
+/**
+ * Extends the LogEntryInterface with some basic functionality
+ * @since 1.19
+ */
+abstract class LogEntryBase implements LogEntry {
+
+ public function getFullType() {
+ return $this->getType() . '/' . $this->getSubtype();
+ }
+
+ public function isDeleted( $field ) {
+ return ( $this->getDeleted() & $field ) === $field;
+ }
+
+ /**
+ * Whether the parameters for this log are stored in new or
+ * old format.
+ */
+ public function isLegacy() {
+ return false;
+ }
+
+}
+
+/**
+ * This class wraps around database result row.
+ * @since 1.19
+ */
+class DatabaseLogEntry extends LogEntryBase {
+ // Static->
+
+ /**
+ * Returns array of information that is needed for querying
+ * log entries. Array contains the following keys:
+ * tables, fields, conds, options and join_conds
+ * @return array
+ */
+ public static function getSelectQueryData() {
+ $tables = array( 'logging', 'user' );
+ $fields = array(
+ 'log_id', 'log_type', 'log_action', 'log_timestamp',
+ 'log_user', 'log_user_text',
+ 'log_namespace', 'log_title', // unused log_page
+ 'log_comment', 'log_params', 'log_deleted',
+ 'user_id', 'user_name', 'user_editcount',
+ );
+
+ $joins = array(
+ // IP's don't have an entry in user table
+ 'user' => array( 'LEFT JOIN', 'log_user=user_id' ),
+ );
+
+ return array(
+ 'tables' => $tables,
+ 'fields' => $fields,
+ 'conds' => array(),
+ 'options' => array(),
+ 'join_conds' => $joins,
+ );
+ }
+
+ /**
+ * Constructs new LogEntry from database result row.
+ * Supports rows from both logging and recentchanges table.
+ * @param $row
+ * @return DatabaseLogEntry
+ */
+ public static function newFromRow( $row ) {
+ if ( is_array( $row ) && isset( $row['rc_logid'] ) ) {
+ return new RCDatabaseLogEntry( (object) $row );
+ } else {
+ return new self( $row );
+ }
+ }
+
+ // Non-static->
+
+ /// Database result row.
+ protected $row;
+
+ protected function __construct( $row ) {
+ $this->row = $row;
+ }
+
+ /**
+ * Returns the unique database id.
+ * @return int
+ */
+ public function getId() {
+ return (int)$this->row->log_id;
+ }
+
+ /**
+ * Returns whatever is stored in the database field.
+ * @return string
+ */
+ protected function getRawParameters() {
+ return $this->row->log_params;
+ }
+
+ // LogEntryBase->
+
+ public function isLegacy() {
+ // This does the check
+ $this->getParameters();
+ return $this->legacy;
+ }
+
+ // LogEntry->
+
+ public function getType() {
+ return $this->row->log_type;
+ }
+
+ public function getSubtype() {
+ return $this->row->log_action;
+ }
+
+ public function getParameters() {
+ if ( !isset( $this->params ) ) {
+ $blob = $this->getRawParameters();
+ wfSuppressWarnings();
+ $params = unserialize( $blob );
+ wfRestoreWarnings();
+ if ( $params !== false ) {
+ $this->params = $params;
+ $this->legacy = false;
+ } else {
+ $this->params = $blob === '' ? array() : explode( "\n", $blob );
+ $this->legacy = true;
+ }
+ }
+ return $this->params;
+ }
+
+ public function getPerformer() {
+ $userId = (int) $this->row->log_user;
+ if ( $userId !== 0 ) { // logged-in users
+ if ( isset( $this->row->user_name ) ) {
+ return User::newFromRow( $this->row );
+ } else {
+ return User::newFromId( $userId );
+ }
+ } else { // IP users
+ $userText = $this->row->log_user_text;
+ return User::newFromName( $userText, false );
+ }
+ }
+
+ public function getTarget() {
+ $namespace = $this->row->log_namespace;
+ $page = $this->row->log_title;
+ $title = Title::makeTitle( $namespace, $page );
+ return $title;
+ }
+
+ public function getTimestamp() {
+ return wfTimestamp( TS_MW, $this->row->log_timestamp );
+ }
+
+ public function getComment() {
+ return $this->row->log_comment;
+ }
+
+ public function getDeleted() {
+ return $this->row->log_deleted;
+ }
+
+}
+
+class RCDatabaseLogEntry extends DatabaseLogEntry {
+
+ public function getId() {
+ return $this->row->rc_logid;
+ }
+
+ protected function getRawParameters() {
+ return $this->row->rc_params;
+ }
+
+ // LogEntry->
+
+ public function getType() {
+ return $this->row->rc_log_type;
+ }
+
+ public function getSubtype() {
+ return $this->row->rc_log_action;
+ }
+
+ public function getPerformer() {
+ $userId = (int) $this->row->rc_user;
+ if ( $userId !== 0 ) {
+ return User::newFromId( $userId );
+ } else {
+ $userText = $this->row->rc_user_text;
+ // Might be an IP, don't validate the username
+ return User::newFromName( $userText, false );
+ }
+ }
+
+ public function getTarget() {
+ $namespace = $this->row->rc_namespace;
+ $page = $this->row->rc_title;
+ $title = Title::makeTitle( $namespace, $page );
+ return $title;
+ }
+
+ public function getTimestamp() {
+ return wfTimestamp( TS_MW, $this->row->rc_timestamp );
+ }
+
+ public function getComment() {
+ return $this->row->rc_comment;
+ }
+
+ public function getDeleted() {
+ return $this->row->rc_deleted;
+ }
+
+}
+
+/**
+ * Class for creating log entries manually, for
+ * example to inject them into the database.
+ * @since 1.19
+ */
+class ManualLogEntry extends LogEntryBase {
+ protected $type; ///!< @var string
+ protected $subtype; ///!< @var string
+ protected $parameters = array(); ///!< @var array
+ protected $performer; ///!< @var User
+ protected $target; ///!< @var Title
+ protected $timestamp; ///!< @var string
+ protected $comment = ''; ///!< @var string
+ protected $deleted; ///!< @var int
+
+ /**
+ * Constructor.
+ *
+ * @since 1.19
+ *
+ * @param string $type
+ * @param string $subtype
+ */
+ public function __construct( $type, $subtype ) {
+ $this->type = $type;
+ $this->subtype = $subtype;
+ }
+
+ /**
+ * Set extra log parameters.
+ * You can pass params to the log action message
+ * by prefixing the keys with a number and colon.
+ * The numbering should start with number 4, the
+ * first three parameters are hardcoded for every
+ * message. Example:
+ * $entry->setParameters(
+ * '4:color' => 'blue',
+ * 'animal' => 'dog'
+ * );
+ *
+ * @since 1.19
+ *
+ * @param $parameters Associative array
+ */
+ public function setParameters( $parameters ) {
+ $this->parameters = $parameters;
+ }
+
+ /**
+ * Set the user that performed the action being logged.
+ *
+ * @since 1.19
+ *
+ * @param User $performer
+ */
+ public function setPerformer( User $performer ) {
+ $this->performer = $performer;
+ }
+
+ /**
+ * Set the title of the object changed.
+ *
+ * @since 1.19
+ *
+ * @param Title $target
+ */
+ public function setTarget( Title $target ) {
+ $this->target = $target;
+ }
+
+ /**
+ * Set the timestamp of when the logged action took place.
+ *
+ * @since 1.19
+ *
+ * @param string $timestamp
+ */
+ public function setTimestamp( $timestamp ) {
+ $this->timestamp = $timestamp;
+ }
+
+ /**
+ * Set a comment associated with the action being logged.
+ *
+ * @since 1.19
+ *
+ * @param string $comment
+ */
+ public function setComment( $comment ) {
+ $this->comment = $comment;
+ }
+
+ /**
+ * TODO: document
+ *
+ * @since 1.19
+ *
+ * @param integer $deleted
+ */
+ public function setDeleted( $deleted ) {
+ $this->deleted = $deleted;
+ }
+
+ /**
+ * Inserts the entry into the logging table.
+ * @return int If of the log entry
+ */
+ public function insert() {
+ global $wgContLang;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
+
+ if ( $this->timestamp === null ) {
+ $this->timestamp = wfTimestampNow();
+ }
+
+ # Truncate for whole multibyte characters.
+ $comment = $wgContLang->truncate( $this->getComment(), 255 );
+
+ $data = array(
+ 'log_id' => $id,
+ 'log_type' => $this->getType(),
+ 'log_action' => $this->getSubtype(),
+ 'log_timestamp' => $dbw->timestamp( $this->getTimestamp() ),
+ 'log_user' => $this->getPerformer()->getId(),
+ 'log_user_text' => $this->getPerformer()->getName(),
+ 'log_namespace' => $this->getTarget()->getNamespace(),
+ 'log_title' => $this->getTarget()->getDBkey(),
+ 'log_page' => $this->getTarget()->getArticleId(),
+ 'log_comment' => $comment,
+ 'log_params' => serialize( (array) $this->getParameters() ),
+ );
+ $dbw->insert( 'logging', $data, __METHOD__ );
+ $this->id = !is_null( $id ) ? $id : $dbw->insertId();
+ return $this->id;
+ }
+
+ /**
+ * Publishes the log entry.
+ * @param $newId int id of the log entry.
+ * @param $to string: rcandudp (default), rc, udp
+ */
+ public function publish( $newId, $to = 'rcandudp' ) {
+ $log = new LogPage( $this->getType() );
+ if ( $log->isRestricted() ) {
+ return;
+ }
+
+ $formatter = LogFormatter::newFromEntry( $this );
+ $context = RequestContext::newExtraneousContext( $this->getTarget() );
+ $formatter->setContext( $context );
+
+ $logpage = SpecialPage::getTitleFor( 'Log', $this->getType() );
+ $user = $this->getPerformer();
+ $rc = RecentChange::newLogEntry(
+ $this->getTimestamp(),
+ $logpage,
+ $user,
+ $formatter->getIRCActionText(), // Used for IRC feeds
+ $user->isAnon() ? $user->getName() : '',
+ $this->getType(),
+ $this->getSubtype(),
+ $this->getTarget(),
+ $this->getComment(),
+ serialize( (array) $this->getParameters() ),
+ $newId
+ );
+
+ if ( $to === 'rc' || $to === 'rcandudp' ) {
+ $rc->save( 'pleasedontudp' );
+ }
+
+ if ( $to === 'udp' || $to === 'rcandudp' ) {
+ $rc->notifyRC2UDP();
+ }
+ }
+
+ // LogEntry->
+
+ public function getType() {
+ return $this->type;
+ }
+
+ public function getSubtype() {
+ return $this->subtype;
+ }
+
+ public function getParameters() {
+ return $this->parameters;
+ }
+
+ public function getPerformer() {
+ return $this->performer;
+ }
+
+ public function getTarget() {
+ return $this->target;
+ }
+
+ public function getTimestamp() {
+ $ts = $this->timestamp !== null ? $this->timestamp : wfTimestampNow();
+ return wfTimestamp( TS_MW, $ts );
+ }
+
+ public function getComment() {
+ return $this->comment;
+ }
+
+ public function getDeleted() {
+ return (int) $this->deleted;
+ }
+
+}
diff --git a/includes/LogEventsList.php b/includes/logging/LogEventsList.php
index 744a60ce..437670d0 100644
--- a/includes/LogEventsList.php
+++ b/includes/logging/LogEventsList.php
@@ -74,13 +74,16 @@ class LogEventsList {
/**
* Set page title and show header for this log type
* @param $type Array
+ * @deprecated in 1.19
*/
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] : '';
if( LogPage::isLogType( $headerType ) ) {
- $this->out->setPageTitle( LogPage::logName( $headerType ) );
- $this->out->addHTML( LogPage::logHeader( $headerType ) );
+ $page = new LogPage( $headerType );
+ $this->out->setPageTitle( $page->getName()->text() );
+ $this->out->addHTML( $page->getDescription()->parseAsBlock() );
} else {
$this->out->addHTML( wfMsgExt('alllogstext',array('parseinline')) );
}
@@ -210,52 +213,53 @@ class LogEventsList {
return $this->out->getTitle();
}
+ public function getContext() {
+ return $this->out->getContext();
+ }
+
/**
* @param $queryTypes Array
* @return String: Formatted HTML
*/
private function getTypeMenu( $queryTypes ) {
- global $wgLogRestrictions, $wgUser;
+ $queryType = count($queryTypes) == 1 ? $queryTypes[0] : '';
+ $selector = $this->getTypeSelector();
+ $selector->setDefault( $queryType );
+ return $selector->getHtml();
+ }
- $html = "<select name='type'>\n";
+ /**
+ * Returns log page selector.
+ * @return XmlSelect
+ * @since 1.19
+ */
+ public function getTypeSelector() {
+ global $wgUser;
- $validTypes = LogPage::validTypes();
$typesByName = array(); // Temporary array
-
// First pass to load the log names
- foreach( $validTypes as $type ) {
- $text = LogPage::logName( $type );
- $typesByName[$type] = $text;
+ foreach( LogPage::validTypes() as $type ) {
+ $page = new LogPage( $type );
+ $restriction = $page->getRestriction();
+ if ( $wgUser->isAllowed( $restriction ) ) {
+ $typesByName[$type] = $page->getName()->text();
+ }
}
// Second pass to sort by name
asort($typesByName);
- // Note the query type
- $queryType = count($queryTypes) == 1 ? $queryTypes[0] : '';
-
// Always put "All public logs" on top
- if ( isset( $typesByName[''] ) ) {
- $all = $typesByName[''];
- unset( $typesByName[''] );
- $typesByName = array( '' => $all ) + $typesByName;
- }
+ $public = $typesByName[''];
+ unset( $typesByName[''] );
+ $typesByName = array( '' => $public ) + $typesByName;
- // Third pass generates sorted XHTML content
- foreach( $typesByName as $type => $text ) {
- $selected = ($type == $queryType);
- // Restricted types
- if ( isset($wgLogRestrictions[$type]) ) {
- if ( $wgUser->isAllowed( $wgLogRestrictions[$type] ) ) {
- $html .= Xml::option( $text, $type, $selected ) . "\n";
- }
- } else {
- $html .= Xml::option( $text, $type, $selected ) . "\n";
- }
+ $select = new XmlSelect( 'type' );
+ foreach( $typesByName as $type => $name ) {
+ $select->addOption( $name, $type );
}
- $html .= '</select>';
- return $html;
+ return $select;
}
/**
@@ -279,7 +283,8 @@ class LogEventsList {
}
/**
- * @return boolean Checkbox
+ * @param $pattern
+ * @return string Checkbox
*/
private function getTitlePattern( $pattern ) {
return '<span style="white-space: nowrap">' .
@@ -287,6 +292,10 @@ class LogEventsList {
'</span>';
}
+ /**
+ * @param $types
+ * @return string
+ */
private function getExtraInputs( $types ) {
global $wgRequest;
$offender = $wgRequest->getVal('offender');
@@ -301,10 +310,16 @@ class LogEventsList {
return '';
}
+ /**
+ * @return string
+ */
public function beginLogEventsList() {
return "<ul>\n";
}
+ /**
+ * @return string
+ */
public function endLogEventsList() {
return "</ul>\n";
}
@@ -314,18 +329,19 @@ class LogEventsList {
* @return String: Formatted HTML list item
*/
public function logLine( $row ) {
- $classes = array( 'mw-logline-' . $row->log_type );
- $title = Title::makeTitle( $row->log_namespace, $row->log_title );
- // Log time
- $time = $this->logTimestamp( $row );
- // User links
- $userLink = $this->logUserLinks( $row );
+ $entry = DatabaseLogEntry::newFromRow( $row );
+ $formatter = LogFormatter::newFromEntry( $entry );
+ $formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) );
+
+ $action = $formatter->getActionText();
+ $comment = $formatter->getComment();
+
+ $classes = array( 'mw-logline-' . $entry->getType() );
+ $title = $entry->getTarget();
+ $time = $this->logTimestamp( $entry );
+
// Extract extra parameters
$paramArray = LogPage::extractParams( $row->log_params );
- // Event description
- $action = $this->logAction( $row, $title, $paramArray );
- // Log comment
- $comment = $this->logComment( $row );
// Add review/revert links and such...
$revert = $this->logActionLinks( $row, $title, $paramArray, $comment );
@@ -338,53 +354,15 @@ class LogEventsList {
$classes = array_merge( $classes, $newClasses );
return Xml::tags( 'li', array( "class" => implode( ' ', $classes ) ),
- $del . "$time $userLink $action $comment $revert $tagDisplay" ) . "\n";
+ $del . "$time $action $comment $revert $tagDisplay" ) . "\n";
}
- private function logTimestamp( $row ) {
+ private function logTimestamp( LogEntry $entry ) {
global $wgLang;
- $time = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->log_timestamp ), true );
+ $time = $wgLang->timeanddate( wfTimestamp( TS_MW, $entry->getTimestamp() ), true );
return htmlspecialchars( $time );
}
- private function logUserLinks( $row ) {
- if( self::isDeleted( $row, LogPage::DELETED_USER ) ) {
- $userLinks = '<span class="history-deleted">' .
- wfMsgHtml( 'rev-deleted-user' ) . '</span>';
- } else {
- $userLinks = Linker::userLink( $row->log_user, $row->user_name );
- // Talk|Contribs links...
- if( !( $this->flags & self::NO_EXTRA_USER_LINKS ) ) {
- $userLinks .= Linker::userToolLinks(
- $row->log_user, $row->user_name, true, 0, $row->user_editcount );
- }
- }
- return $userLinks;
- }
-
- private function logAction( $row, $title, $paramArray ) {
- if( self::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
- $action = '<span class="history-deleted">' .
- wfMsgHtml( 'rev-deleted-event' ) . '</span>';
- } else {
- $action = LogPage::actionText(
- $row->log_type, $row->log_action, $title, $this->skin, $paramArray, true );
- }
- return $action;
- }
-
- private function logComment( $row ) {
- if( self::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
- $comment = '<span class="history-deleted">' .
- wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
- } else {
- global $wgLang;
- $comment = $wgLang->getDirMark() .
- Linker::commentBlock( $row->log_comment );
- }
- return $comment;
- }
-
/**
* @TODO: split up!
*
@@ -487,7 +465,7 @@ class LogEventsList {
// If an edit was hidden from a page give a review link to the history
} elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'revision', 'deletedhistory' ) ) {
$revert = RevisionDeleter::getLogLinks( $title, $paramArray,
- $this->skin, $this->message );
+ $this->message );
// Hidden log items, give review link
} elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'event', 'deletedhistory' ) ) {
if( count($paramArray) >= 1 ) {
@@ -507,19 +485,6 @@ class LogEventsList {
array( 'known', 'noclasses' )
) . ')';
}
- // Self-created users
- } elseif( self::typeAction( $row, 'newusers', 'create2' ) ) {
- if( isset( $paramArray[0] ) ) {
- $revert = Linker::userToolLinks( $paramArray[0], $title->getDBkey(), true );
- } else {
- # Fall back to a blue contributions link
- $revert = Linker::userToolLinks( 1, $title->getDBkey() );
- }
- if( wfTimestamp( TS_MW, $row->log_timestamp ) < '20080129000000' ) {
- # Suppress $comment from old entries (before 2008-01-29),
- # not needed and can contain incorrect links
- $comment = '';
- }
// Do nothing. The implementation is handled by the hook modifiying the passed-by-ref parameters.
} else {
wfRunHooks( 'LogLine', array( $row->log_type, $row->log_action, $title, $paramArray,
@@ -591,10 +556,11 @@ class LogEventsList {
*
* @param $row Row
* @param $field Integer
+ * @param $user User object to check, or null to use $wgUser
* @return Boolean
*/
- public static function userCan( $row, $field ) {
- return self::userCanBitfield( $row->log_deleted, $field );
+ public static function userCan( $row, $field, User $user = null ) {
+ return self::userCanBitfield( $row->log_deleted, $field, $user );
}
/**
@@ -603,19 +569,22 @@ class LogEventsList {
*
* @param $bitfield Integer (current field)
* @param $field Integer
+ * @param $user User object to check, or null to use $wgUser
* @return Boolean
*/
- public static function userCanBitfield( $bitfield, $field ) {
+ public static function userCanBitfield( $bitfield, $field, User $user = null ) {
if( $bitfield & $field ) {
- global $wgUser;
-
if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
$permission = 'suppressrevision';
} else {
$permission = 'deletedhistory';
}
wfDebug( "Checking for $permission due to $field match on $bitfield\n" );
- return $wgUser->isAllowed( $permission );
+ if ( $user === null ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
+ return $user->isAllowed( $permission );
} else {
return true;
}
@@ -634,8 +603,8 @@ class LogEventsList {
* Show log extract. Either with text and a box (set $msgKey) or without (don't set $msgKey)
*
* @param $out OutputPage|String-by-reference
- * @param $types String or Array
- * @param $page String The page title to show log entries for
+ * @param $types String|Array Log types to show
+ * @param $page String|Title The page title to show log entries for
* @param $user String The user who made the log entries
* @param $param Associative Array with the following additional options:
* - lim Integer Limit of items to show, default is 50
@@ -644,7 +613,7 @@ class LogEventsList {
* if set to true (default), "No matching items in log" is displayed if loglist is empty
* - msgKey Array If you want a nice box with a message, set this to the key of the message.
* First element is the message key, additional optional elements are parameters for the key
- * that are processed with wgMsgExt and option 'parse'
+ * that are processed with wfMsgExt and option 'parse'
* - offset Set to overwrite offset parameter in $wgRequest
* set to '' to unset offset
* - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
@@ -654,7 +623,6 @@ class LogEventsList {
public static function showLogExtract(
&$out, $types=array(), $page='', $user='', $param = array()
) {
- global $wgUser, $wgOut;
$defaultParameters = array(
'lim' => 25,
'conds' => array(),
@@ -676,8 +644,15 @@ class LogEventsList {
if ( !is_array( $msgKey ) ) {
$msgKey = array( $msgKey );
}
+
+ if ( $out instanceof OutputPage ) {
+ $context = $out->getContext();
+ } else {
+ $context = RequestContext::getMain();
+ }
+
# Insert list of top 50 (or top $lim) items
- $loglist = new LogEventsList( $wgUser->getSkin(), $wgOut, $flags );
+ $loglist = new LogEventsList( $context->getSkin(), $context->getOutput(), $flags );
$pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
if ( isset( $param['offset'] ) ) { # Tell pager to ignore $wgRequest offset
$pager->setOffset( $param['offset'] );
@@ -701,14 +676,18 @@ class LogEventsList {
$logBody .
$loglist->endLogEventsList();
} else {
- if ( $showIfEmpty )
+ if ( $showIfEmpty ) {
$s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
wfMsgExt( 'logempty', array( 'parseinline' ) ) );
+ }
}
if( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
$urlParam = array();
- if ( $page != '')
+ if ( $page instanceof Title ) {
+ $urlParam['page'] = $page->getPrefixedDBkey();
+ } elseif ( $page != '' ) {
$urlParam['page'] = $page;
+ }
if ( $user != '')
$urlParam['user'] = $user;
if ( !is_array( $types ) ) # Make it an array, if it isn't
@@ -727,23 +706,27 @@ class LogEventsList {
$s .= '</div>';
}
- if ( $wrap!='' ) { // Wrap message in html
+ if ( $wrap != '' ) { // Wrap message in html
$s = str_replace( '$1', $s, $wrap );
}
- // $out can be either an OutputPage object or a String-by-reference
- if( $out instanceof OutputPage ){
- $out->addHTML( $s );
- } else {
- $out = $s;
+ /* hook can return false, if we don't want the message to be emitted (Wikia BugId:7093) */
+ if ( wfRunHooks( 'LogEventsListShowLogExtract', array( &$s, $types, $page, $user, $param ) ) ) {
+ // $out can be either an OutputPage object or a String-by-reference
+ if ( $out instanceof OutputPage ){
+ $out->addHTML( $s );
+ } else {
+ $out = $s;
+ }
}
+
return $pager->getNumRows();
}
/**
* SQL clause to skip forbidden log types for this user
*
- * @param $db Database
+ * @param $db DatabaseBase
* @param $audience string, public/user
* @return Mixed: string or false
*/
@@ -765,308 +748,4 @@ class LogEventsList {
}
return false;
}
-}
-
-/**
- * @ingroup Pager
- */
-class LogPager extends ReverseChronologicalPager {
- private $types = array(), $user = '', $title = '', $pattern = '';
- private $typeCGI = '';
- public $mLogEventsList;
-
- /**
- * Constructor
- *
- * @param $list LogEventsList
- * @param $types String or Array: log types to show
- * @param $user String: the user who made the log entries
- * @param $title String: the page title the log entries are for
- * @param $pattern String: do a prefix search rather than an exact title match
- * @param $conds Array: extra conditions for the query
- * @param $year Integer: the year to start from
- * @param $month Integer: the month to start from
- * @param $tagFilter String: tag
- */
- public function __construct( $list, $types = array(), $user = '', $title = '', $pattern = '',
- $conds = array(), $year = false, $month = false, $tagFilter = '' ) {
- parent::__construct();
- $this->mConds = $conds;
-
- $this->mLogEventsList = $list;
-
- $this->limitType( $types ); // also excludes hidden types
- $this->limitUser( $user );
- $this->limitTitle( $title, $pattern );
- $this->getDateCond( $year, $month );
- $this->mTagFilter = $tagFilter;
- }
-
- public function getDefaultQuery() {
- $query = parent::getDefaultQuery();
- $query['type'] = $this->typeCGI; // arrays won't work here
- $query['user'] = $this->user;
- $query['month'] = $this->mMonth;
- $query['year'] = $this->mYear;
- return $query;
- }
-
- function getTitle() {
- return $this->mLogEventsList->getDisplayTitle();
- }
-
- // Call ONLY after calling $this->limitType() already!
- public function getFilterParams() {
- global $wgFilterLogTypes, $wgUser, $wgRequest;
- $filters = array();
- if( count($this->types) ) {
- return $filters;
- }
- foreach( $wgFilterLogTypes as $type => $default ) {
- // Avoid silly filtering
- if( $type !== 'patrol' || $wgUser->useNPPatrol() ) {
- $hide = $wgRequest->getInt( "hide_{$type}_log", $default );
- $filters[$type] = $hide;
- if( $hide )
- $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
- }
- }
- return $filters;
- }
-
- /**
- * Set the log reader to return only entries of the given type.
- * Type restrictions enforced here
- *
- * @param $types String or array: Log types ('upload', 'delete', etc);
- * empty string means no restriction
- */
- private function limitType( $types ) {
- global $wgLogRestrictions, $wgUser;
- // If $types is not an array, make it an array
- $types = ($types === '') ? array() : (array)$types;
- // Don't even show header for private logs; don't recognize it...
- foreach ( $types as $type ) {
- if( isset( $wgLogRestrictions[$type] )
- && !$wgUser->isAllowed($wgLogRestrictions[$type])
- ) {
- $types = array_diff( $types, array( $type ) );
- }
- }
- $this->types = $types;
- // Don't show private logs to unprivileged users.
- // Also, only show them upon specific request to avoid suprises.
- $audience = $types ? 'user' : 'public';
- $hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience );
- if( $hideLogs !== false ) {
- $this->mConds[] = $hideLogs;
- }
- if( count($types) ) {
- $this->mConds['log_type'] = $types;
- // Set typeCGI; used in url param for paging
- if( count($types) == 1 ) $this->typeCGI = $types[0];
- }
- }
-
- /**
- * Set the log reader to return only entries by the given user.
- *
- * @param $name String: (In)valid user name
- */
- private function limitUser( $name ) {
- if( $name == '' ) {
- return false;
- }
- $usertitle = Title::makeTitleSafe( NS_USER, $name );
- if( is_null($usertitle) ) {
- return false;
- }
- /* Fetch userid at first, if known, provides awesome query plan afterwards */
- $userid = User::idFromName( $name );
- 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";
- } else {
- global $wgUser;
- $this->mConds['log_user'] = $userid;
- // Paranoia: avoid brute force searches (bug 17342)
- if( !$wgUser->isAllowed( 'deletedhistory' ) ) {
- $this->mConds[] = $this->mDb->bitAnd('log_deleted', LogPage::DELETED_USER) . ' = 0';
- } elseif( !$wgUser->isAllowed( 'suppressrevision' ) ) {
- $this->mConds[] = $this->mDb->bitAnd('log_deleted', LogPage::SUPPRESSED_USER) .
- ' != ' . LogPage::SUPPRESSED_USER;
- }
- $this->user = $usertitle->getText();
- }
- }
-
- /**
- * Set the log reader to return only entries affecting the given page.
- * (For the block and rights logs, this is a user page.)
- *
- * @param $page String: Title name as text
- * @param $pattern String
- */
- private function limitTitle( $page, $pattern ) {
- global $wgMiserMode, $wgUser;
-
- $title = Title::newFromText( $page );
- if( strlen( $page ) == 0 || !$title instanceof Title ) {
- return false;
- }
-
- $this->title = $title->getPrefixedText();
- $ns = $title->getNamespace();
- $db = $this->mDb;
-
- # Using the (log_namespace, log_title, log_timestamp) index with a
- # range scan (LIKE) on the first two parts, instead of simple equality,
- # makes it unusable for sorting. Sorted retrieval using another index
- # would be possible, but then we might have to scan arbitrarily many
- # nodes of that index. Therefore, we need to avoid this if $wgMiserMode
- # is on.
- #
- # This is not a problem with simple title matches, because then we can
- # 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 ) {
- $this->mConds['log_namespace'] = $ns;
- $this->mConds[] = 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() );
- $this->pattern = $pattern;
- } else {
- $this->mConds['log_namespace'] = $ns;
- $this->mConds['log_title'] = $title->getDBkey();
- }
- // Paranoia: avoid brute force searches (bug 17342)
- if( !$wgUser->isAllowed( 'deletedhistory' ) ) {
- $this->mConds[] = $db->bitAnd('log_deleted', LogPage::DELETED_ACTION) . ' = 0';
- } elseif( !$wgUser->isAllowed( 'suppressrevision' ) ) {
- $this->mConds[] = $db->bitAnd('log_deleted', LogPage::SUPPRESSED_ACTION) .
- ' != ' . LogPage::SUPPRESSED_ACTION;
- }
- }
-
- public function getQueryInfo() {
- $tables = array( 'logging', 'user' );
- $this->mConds[] = 'user_id = log_user';
- $index = array();
- $options = array();
- # 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 ) ) {
- $tables[] = 'log_search';
- $index['log_search'] = 'ls_field_val';
- $index['logging'] = 'PRIMARY';
- if ( !$this->hasEqualsClause( 'ls_field' )
- || !$this->hasEqualsClause( 'ls_value' ) )
- {
- # Since (ls_field,ls_value,ls_logid) is unique, if the condition is
- # to match a specific (ls_field,ls_value) tuple, then there will be
- # 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->user ) {
- $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;
- # Don't show duplicate rows when using log_search
- $info = array(
- 'tables' => $tables,
- 'fields' => array( 'log_type', 'log_action', 'log_user', 'log_namespace',
- 'log_title', 'log_params', 'log_comment', 'log_id', 'log_deleted',
- 'log_timestamp', 'user_name', 'user_editcount' ),
- 'conds' => $this->mConds,
- 'options' => $options,
- 'join_conds' => array(
- 'user' => array( 'INNER JOIN', 'user_id=log_user' ),
- 'log_search' => array( 'INNER JOIN', 'ls_log_id=log_id' )
- )
- );
- # Add ChangeTags filter query
- ChangeTags::modifyDisplayQuery( $info['tables'], $info['fields'], $info['conds'],
- $info['join_conds'], $info['options'], $this->mTagFilter );
- return $info;
- }
-
- // Checks if $this->mConds has $field matched to a *single* value
- protected function hasEqualsClause( $field ) {
- return (
- array_key_exists( $field, $this->mConds ) &&
- ( !is_array( $this->mConds[$field] ) || count( $this->mConds[$field] ) == 1 )
- );
- }
-
- function getIndexField() {
- return 'log_timestamp';
- }
-
- public function getStartBody() {
- wfProfileIn( __METHOD__ );
- # Do a link batch query
- if( $this->getNumRows() > 0 ) {
- $lb = new LinkBatch;
- foreach ( $this->mResult as $row ) {
- $lb->add( $row->log_namespace, $row->log_title );
- $lb->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
- $lb->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
- }
- $lb->execute();
- $this->mResult->seek( 0 );
- }
- wfProfileOut( __METHOD__ );
- return '';
- }
-
- public function formatRow( $row ) {
- return $this->mLogEventsList->logLine( $row );
- }
-
- public function getType() {
- return $this->types;
- }
-
- public function getUser() {
- return $this->user;
- }
-
- public function getPage() {
- return $this->title;
- }
-
- public function getPattern() {
- return $this->pattern;
- }
-
- public function getYear() {
- return $this->mYear;
- }
-
- public function getMonth() {
- return $this->mMonth;
- }
-
- public function getTagFilter() {
- return $this->mTagFilter;
- }
-
- public function doQuery() {
- // Workaround MySQL optimizer bug
- $this->mDb->setBigSelects();
- parent::doQuery();
- $this->mDb->setBigSelects( 'default' );
- }
-}
-
+ }
diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php
new file mode 100644
index 00000000..24490eed
--- /dev/null
+++ b/includes/logging/LogFormatter.php
@@ -0,0 +1,673 @@
+<?php
+/**
+ * Contains classes for formatting log entries
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.19
+ */
+
+/**
+ * Implements the default log formatting.
+ * Can be overridden by subclassing and setting
+ * $wgLogActionsHandlers['type/subtype'] = 'class'; or
+ * $wgLogActionsHandlers['type/*'] = 'class';
+ * @since 1.19
+ */
+class LogFormatter {
+ // Audience options for viewing usernames, comments, and actions
+ const FOR_PUBLIC = 1;
+ const FOR_THIS_USER = 2;
+
+ // Static->
+
+ /**
+ * Constructs a new formatter suitable for given entry.
+ * @param $entry LogEntry
+ * @return LogFormatter
+ */
+ public static function newFromEntry( LogEntry $entry ) {
+ global $wgLogActionsHandlers;
+ $fulltype = $entry->getFullType();
+ $wildcard = $entry->getType() . '/*';
+ $handler = '';
+
+ if ( isset( $wgLogActionsHandlers[$fulltype] ) ) {
+ $handler = $wgLogActionsHandlers[$fulltype];
+ } elseif ( isset( $wgLogActionsHandlers[$wildcard] ) ) {
+ $handler = $wgLogActionsHandlers[$wildcard];
+ }
+
+ if ( $handler !== '' && is_string( $handler ) && class_exists( $handler ) ) {
+ return new $handler( $entry );
+ }
+
+ return new LegacyLogFormatter( $entry );
+ }
+
+ /**
+ * Handy shortcut for constructing a formatter directly from
+ * database row.
+ * @param $row
+ * @see DatabaseLogEntry::getSelectQueryData
+ * @return LogFormatter
+ */
+ public static function newFromRow( $row ) {
+ return self::newFromEntry( DatabaseLogEntry::newFromRow( $row ) );
+ }
+
+ // Nonstatic->
+
+ /// @var LogEntry
+ protected $entry;
+
+ /// Integer constant for handling log_deleted
+ protected $audience = self::FOR_PUBLIC;
+
+ /// Whether to output user tool links
+ protected $linkFlood = false;
+
+ /**
+ * Set to true if we are constructing a message text that is going to
+ * be included in page history or send to IRC feed. Links are replaced
+ * with plaintext or with [[pagename]] kind of syntax, that is parsed
+ * by page histories and IRC feeds.
+ * @var boolean
+ */
+ protected $plaintext = false;
+
+ protected $irctext = false;
+
+ protected function __construct( LogEntry $entry ) {
+ $this->entry = $entry;
+ $this->context = RequestContext::getMain();
+ }
+
+ /**
+ * Replace the default context
+ * @param $context IContextSource
+ */
+ public function setContext( IContextSource $context ) {
+ $this->context = $context;
+ }
+
+ /**
+ * Set the visibility restrictions for displaying content.
+ * If set to public, and an item is deleted, then it will be replaced
+ * with a placeholder even if the context user is allowed to view it.
+ * @param $audience integer self::FOR_THIS_USER or self::FOR_PUBLIC
+ */
+ public function setAudience( $audience ) {
+ $this->audience = ( $audience == self::FOR_THIS_USER )
+ ? self::FOR_THIS_USER
+ : self::FOR_PUBLIC;
+ }
+
+ /**
+ * Check if a log item can be displayed
+ * @param $field integer LogPage::DELETED_* constant
+ * @return bool
+ */
+ protected function canView( $field ) {
+ if ( $this->audience == self::FOR_THIS_USER ) {
+ return LogEventsList::userCanBitfield(
+ $this->entry->getDeleted(), $field, $this->context->getUser() );
+ } else {
+ return !$this->entry->isDeleted( $field );
+ }
+ }
+
+ /**
+ * If set to true, will produce user tool links after
+ * the user name. This should be replaced with generic
+ * CSS/JS solution.
+ * @param $value boolean
+ */
+ public function setShowUserToolLinks( $value ) {
+ $this->linkFlood = $value;
+ }
+
+ /**
+ * Ugly hack to produce plaintext version of the message.
+ * Usually you also want to set extraneous request context
+ * to avoid formatting for any particular user.
+ * @see getActionText()
+ * @return string text
+ */
+ public function getPlainActionText() {
+ $this->plaintext = true;
+ $text = $this->getActionText();
+ $this->plaintext = false;
+ return $text;
+ }
+
+ /**
+ * Even uglier hack to maintain backwards compatibilty with IRC bots
+ * (bug 34508).
+ * @see getActionText()
+ * @return string text
+ */
+ public function getIRCActionText() {
+ $this->plaintext = true;
+ $text = $this->getActionText();
+
+ $entry = $this->entry;
+ $parameters = $entry->getParameters();
+ // @see LogPage::actionText()
+ $msgOpts = array( 'parsemag', 'escape', 'replaceafter', 'content' );
+ // Text of title the action is aimed at.
+ $target = $entry->getTarget()->getPrefixedText() ;
+ $text = null;
+ switch( $entry->getType() ) {
+ case 'move':
+ switch( $entry->getSubtype() ) {
+ case 'move':
+ $movesource = $parameters['4::target'];
+ $text = wfMsgExt( '1movedto2', $msgOpts, $target, $movesource );
+ break;
+ case 'move_redir':
+ $movesource = $parameters['4::target'];
+ $text = wfMsgExt( '1movedto2_redir', $msgOpts, $target, $movesource );
+ break;
+ case 'move-noredirect':
+ break;
+ case 'move_redir-noredirect':
+ break;
+ }
+ break;
+
+ case 'delete':
+ switch( $entry->getSubtype() ) {
+ case 'delete':
+ $text = wfMsgExt( 'deletedarticle', $msgOpts, $target );
+ break;
+ case 'restore':
+ $text = wfMsgExt( 'undeletedarticle', $msgOpts, $target );
+ break;
+ //case 'revision': // Revision deletion
+ //case 'event': // Log deletion
+ // see https://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/LogPage.php?&pathrev=97044&r1=97043&r2=97044
+ //default:
+ }
+ break;
+
+ case 'patrol':
+ // https://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/PatrolLog.php?&pathrev=97495&r1=97494&r2=97495
+ // Create a diff link to the patrolled revision
+ if ( $entry->getSubtype() === 'patrol' ) {
+ $diffLink = htmlspecialchars(
+ wfMsgForContent( 'patrol-log-diff', $parameters['4::curid'] ) );
+ $text = wfMsgForContent( 'patrol-log-line', $diffLink, "[[$target]]", "" );
+ } else {
+ // broken??
+ }
+ break;
+
+ case 'newusers':
+ switch( $entry->getSubtype() ) {
+ case 'newusers':
+ case 'create':
+ $text = wfMsgExt( 'newuserlog-create-entry', $msgOpts /* no params */ );
+ break;
+ case 'create2':
+ $text = wfMsgExt( 'newuserlog-create2-entry', $msgOpts, $target );
+ break;
+ case 'autocreate':
+ $text = wfMsgExt( 'newuserlog-autocreate-entry', $msgOpts /* no params */ );
+ break;
+ }
+ break;
+
+ case 'upload':
+ switch( $entry->getSubtype() ) {
+ case 'upload':
+ $text = wfMsgExt( 'uploadedimage', $msgOpts, $target );
+ break;
+ case 'overwrite':
+ $text = wfMsgExt( 'overwroteimage', $msgOpts, $target );
+ break;
+ }
+ break;
+
+ // case 'suppress' --private log -- aaron (sign your messages so we know who to blame in a few years :-D)
+ // default:
+ }
+ if( is_null( $text ) ) {
+ $text = $this->getPlainActionText();
+ }
+
+ $this->plaintext = false;
+ return $text;
+ }
+
+ /**
+ * Gets the log action, including username.
+ * @return string HTML
+ */
+ public function getActionText() {
+ if ( $this->canView( LogPage::DELETED_ACTION ) ) {
+ $element = $this->getActionMessage();
+ if ( $element instanceof Message ) {
+ $element = $this->plaintext ? $element->text() : $element->escaped();
+ }
+ if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+ $element = $this->styleRestricedElement( $element );
+ }
+ } else {
+ $performer = $this->getPerformerElement() . $this->msg( 'word-separator' )->text();
+ $element = $performer . $this->getRestrictedElement( 'rev-deleted-event' );
+ }
+
+ return $element;
+ }
+
+ /**
+ * Returns a sentence describing the log action. Usually
+ * a Message object is returned, but old style log types
+ * and entries might return pre-escaped html string.
+ * @return Message|pre-escaped html
+ */
+ protected function getActionMessage() {
+ $message = $this->msg( $this->getMessageKey() );
+ $message->params( $this->getMessageParameters() );
+ return $message;
+ }
+
+ /**
+ * Returns a key to be used for formatting the action sentence.
+ * Default is logentry-TYPE-SUBTYPE for modern logs. Legacy log
+ * types will use custom keys, and subclasses can also alter the
+ * key depending on the entry itself.
+ * @return string message key
+ */
+ protected function getMessageKey() {
+ $type = $this->entry->getType();
+ $subtype = $this->entry->getSubtype();
+
+ return "logentry-$type-$subtype";
+ }
+
+ /**
+ * Extracts the optional extra parameters for use in action messages.
+ * The array indexes start from number 3.
+ * @return array
+ */
+ protected function extractParameters() {
+ $entry = $this->entry;
+ $params = array();
+
+ if ( $entry->isLegacy() ) {
+ foreach ( $entry->getParameters() as $index => $value ) {
+ $params[$index + 3] = $value;
+ }
+ }
+
+ // Filter out parameters which are not in format #:foo
+ foreach ( $entry->getParameters() as $key => $value ) {
+ if ( strpos( $key, ':' ) === false ) continue;
+ list( $index, $type, $name ) = explode( ':', $key, 3 );
+ $params[$index - 1] = $value;
+ }
+
+ /* Message class doesn't like non consecutive numbering.
+ * Fill in missing indexes with empty strings to avoid
+ * incorrect renumbering.
+ */
+ if ( count( $params ) ) {
+ $max = max( array_keys( $params ) );
+ for ( $i = 4; $i < $max; $i++ ) {
+ if ( !isset( $params[$i] ) ) {
+ $params[$i] = '';
+ }
+ }
+ }
+ return $params;
+ }
+
+ /**
+ * Formats parameters intented for action message from
+ * array of all parameters. There are three hardcoded
+ * parameters (array is zero-indexed, this list not):
+ * - 1: user name with premade link
+ * - 2: usable for gender magic function
+ * - 3: target page with premade link
+ * @return array
+ */
+ protected function getMessageParameters() {
+ if ( isset( $this->parsedParameters ) ) {
+ return $this->parsedParameters;
+ }
+
+ $entry = $this->entry;
+ $params = $this->extractParameters();
+ $params[0] = Message::rawParam( $this->getPerformerElement() );
+ $params[1] = $entry->getPerformer()->getName();
+ $params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
+
+ // Bad things happens if the numbers are not in correct order
+ ksort( $params );
+ return $this->parsedParameters = $params;
+ }
+
+ /**
+ * Helper to make a link to the page, taking the plaintext
+ * value in consideration.
+ * @param $title Title the page
+ * @param $parameters array query parameters
+ * @return String
+ */
+ protected function makePageLink( Title $title = null, $parameters = array() ) {
+ if ( !$this->plaintext ) {
+ $link = Linker::link( $title, null, array(), $parameters );
+ } else {
+ if ( !$title instanceof Title ) {
+ throw new MWException( "Expected title, got null" );
+ }
+ $link = '[[' . $title->getPrefixedText() . ']]';
+ }
+ return $link;
+ }
+
+ /**
+ * Provides the name of the user who performed the log action.
+ * Used as part of log action message or standalone, depending
+ * which parts of the log entry has been hidden.
+ */
+ public function getPerformerElement() {
+ if ( $this->canView( LogPage::DELETED_USER ) ) {
+ $performer = $this->entry->getPerformer();
+ $element = $this->makeUserLink( $performer );
+ if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
+ $element = $this->styleRestricedElement( $element );
+ }
+ } else {
+ $element = $this->getRestrictedElement( 'rev-deleted-user' );
+ }
+
+ return $element;
+ }
+
+ /**
+ * Gets the luser provided comment
+ * @return string HTML
+ */
+ public function getComment() {
+ if ( $this->canView( LogPage::DELETED_COMMENT ) ) {
+ $comment = Linker::commentBlock( $this->entry->getComment() );
+ // No hard coded spaces thanx
+ $element = ltrim( $comment );
+ if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
+ $element = $this->styleRestricedElement( $element );
+ }
+ } else {
+ $element = $this->getRestrictedElement( 'rev-deleted-comment' );
+ }
+
+ return $element;
+ }
+
+ /**
+ * Helper method for displaying restricted element.
+ * @param $message string
+ * @return string HTML or wikitext
+ */
+ protected function getRestrictedElement( $message ) {
+ if ( $this->plaintext ) {
+ return $this->msg( $message )->text();
+ }
+
+ $content = $this->msg( $message )->escaped();
+ $attribs = array( 'class' => 'history-deleted' );
+ return Html::rawElement( 'span', $attribs, $content );
+ }
+
+ /**
+ * Helper method for styling restricted element.
+ * @param $content string
+ * @return string HTML or wikitext
+ */
+ protected function styleRestricedElement( $content ) {
+ if ( $this->plaintext ) {
+ return $content;
+ }
+ $attribs = array( 'class' => 'history-deleted' );
+ return Html::rawElement( 'span', $attribs, $content );
+ }
+
+ /**
+ * Shortcut for wfMessage which honors local context.
+ * @todo Would it be better to require replacing the global context instead?
+ * @param $key string
+ * @return Message
+ */
+ protected function msg( $key ) {
+ return wfMessage( $key )
+ ->inLanguage( $this->context->getLanguage() )
+ ->title( $this->context->getTitle() );
+ }
+
+ protected function makeUserLink( User $user ) {
+ if ( $this->plaintext ) {
+ $element = $user->getName();
+ } else {
+ $element = Linker::userLink(
+ $user->getId(),
+ $user->getName()
+ );
+
+ if ( $this->linkFlood ) {
+ $element .= Linker::userToolLinks(
+ $user->getId(),
+ $user->getName(),
+ true, // Red if no edits
+ 0, // Flags
+ $user->getEditCount()
+ );
+ }
+ }
+ return $element;
+ }
+
+ /**
+ * @return Array of titles that should be preloaded with LinkBatch.
+ */
+ public function getPreloadTitles() {
+ return array();
+ }
+
+}
+
+/**
+ * This class formats all log entries for log types
+ * which have not been converted to the new system.
+ * This is not about old log entries which store
+ * parameters in a different format - the new
+ * LogFormatter classes have code to support formatting
+ * those too.
+ * @since 1.19
+ */
+class LegacyLogFormatter extends LogFormatter {
+ protected function getActionMessage() {
+ $entry = $this->entry;
+ $action = LogPage::actionText(
+ $entry->getType(),
+ $entry->getSubtype(),
+ $entry->getTarget(),
+ $this->plaintext ? null : $this->context->getSkin(),
+ (array)$entry->getParameters(),
+ !$this->plaintext // whether to filter [[]] links
+ );
+
+ $performer = $this->getPerformerElement();
+ return $performer . $this->msg( 'word-separator' )->text() . $action;
+ }
+
+}
+
+/**
+ * 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;
+ }
+}
+
+/**
+ * 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' ) ) ) {
+ if (
+ ($subtype === 'event' && count( $params ) === 6 ) ||
+ ($subtype === 'revision' && isset( $params[3] ) && $params[3] === 'revision' )
+ ) {
+ $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;
+ }
+ }
+}
+
+/**
+ * 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();
+ $newParams = array_slice( $params, 0, 3 );
+
+ $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 );
+ }
+
+ $newParams[3] = Message::rawParam( $revlink );
+ return $newParams;
+ }
+}
+
+/**
+ * This class formats new user log entries.
+ * @since 1.19
+ */
+class NewUsersLogFormatter extends LogFormatter {
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ if ( $this->entry->getSubtype() === 'create2' ) {
+ 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();
+ }
+}
diff --git a/includes/LogPage.php b/includes/logging/LogPage.php
index 5155d9a5..bbb4de8f 100644
--- a/includes/LogPage.php
+++ b/includes/logging/LogPage.php
@@ -96,6 +96,7 @@ class LogPage {
# And update recentchanges
if( $this->updateRecentChanges ) {
$titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
+
RecentChange::notifyLog(
$now, $titleObj, $this->doer, $this->getRcComment(), '',
$this->type, $this->action, $this->target, $this->comment,
@@ -106,6 +107,7 @@ class LogPage {
if( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
return true;
}
+
# Notify external application via UDP.
# We send this to IRC but do not want to add it the RC table.
$titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
@@ -121,9 +123,12 @@ class LogPage {
/**
* Get the RC comment from the last addEntry() call
+ *
+ * @return string
*/
public function getRcComment() {
$rcComment = $this->actionText;
+
if( $this->comment != '' ) {
if ( $rcComment == '' ) {
$rcComment = $this->comment;
@@ -131,6 +136,7 @@ class LogPage {
$rcComment .= wfMsgForContent( 'colon-separator' ) . $this->comment;
}
}
+
return $rcComment;
}
@@ -166,8 +172,10 @@ class LogPage {
*
* @param $type String: logtype
* @return String: log name
+ * @deprecated in 1.19, warnings in 1.21. Use getName()
*/
public static function logName( $type ) {
+ wfDeprecated( __METHOD__, '1.19' );
global $wgLogNames;
if( isset( $wgLogNames[$type] ) ) {
@@ -184,14 +192,17 @@ class LogPage {
* @todo handle missing log types
* @param $type String: logtype
* @return String: headertext of this logtype
+ * @deprecated in 1.19, warnings in 1.21. Use getDescription()
*/
public static function logHeader( $type ) {
+ wfDeprecated( __METHOD__, '1.19' );
global $wgLogHeaders;
return wfMsgExt( $wgLogHeaders[$type], array( 'parseinline' ) );
}
/**
- * Generate text for a log entry
+ * Generate text for a log entry.
+ * Only LogFormatter should call this function.
*
* @param $type String: log type
* @param $action String: log action
@@ -216,17 +227,16 @@ class LogPage {
}
$key = "$type/$action";
- # Defer patrol log to PatrolLog class
- if( $key == 'patrol/patrol' ) {
- return PatrolLog::makeActionText( $title, $params, $langObjOrNull );
- }
+
if( isset( $wgLogActions[$key] ) ) {
if( is_null( $title ) ) {
$rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'language' => $langObj ) );
} else {
$titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
+
if( preg_match( '/^rights\/(rights|autopromote)/', $key ) ) {
$rightsnone = wfMsgExt( 'rightsnone', array( 'parsemag', 'language' => $langObj ) );
+
if( $skin ) {
foreach ( $params as &$param ) {
$groupArray = array_map( 'trim', explode( ',', $param ) );
@@ -234,18 +244,22 @@ class LogPage {
$param = $wgLang->listToText( $groupArray );
}
}
+
if( !isset( $params[0] ) || trim( $params[0] ) == '' ) {
$params[0] = $rightsnone;
}
+
if( !isset( $params[1] ) || trim( $params[1] ) == '' ) {
$params[1] = $rightsnone;
}
}
+
if( count( $params ) == 0 ) {
$rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $titleLink );
} else {
$details = '';
array_unshift( $params, $titleLink );
+
// User suppression
if ( preg_match( '/^(block|suppress)\/(block|reblock)$/', $key ) ) {
if ( $skin ) {
@@ -254,9 +268,9 @@ class LogPage {
} else {
$params[1] = $wgContLang->translateBlockExpiry( $params[1] );
}
+
$params[2] = isset( $params[2] ) ?
self::formatBlockFlags( $params[2], $langObj ) : '';
-
// Page protections
} elseif ( $type == 'protect' && count($params) == 3 ) {
// Restrictions and expiries
@@ -265,30 +279,11 @@ class LogPage {
} else {
$details .= " {$params[1]}";
}
+
// Cascading flag...
if( $params[2] ) {
$details .= ' [' . wfMsgExt( 'protect-summary-cascade', array( 'parsemag', 'language' => $langObj ) ) . ']';
}
-
- // Page moves
- } elseif ( $type == 'move' && count( $params ) == 3 ) {
- if( $params[2] ) {
- $details .= ' [' . wfMsgExt( 'move-redirect-suppressed', array( 'parsemag', 'language' => $langObj ) ) . ']';
- }
-
- // Revision deletion
- } elseif ( preg_match( '/^(delete|suppress)\/revision$/', $key ) && count( $params ) == 5 ) {
- $count = substr_count( $params[2], ',' ) + 1; // revisions
- $ofield = intval( substr( $params[3], 7 ) ); // <ofield=x>
- $nfield = intval( substr( $params[4], 7 ) ); // <nfield=x>
- $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, $langObj, false );
-
- // Log deletion
- } elseif ( preg_match( '/^(delete|suppress)\/event$/', $key ) && count( $params ) == 4 ) {
- $count = substr_count( $params[1], ',' ) + 1; // log items
- $ofield = intval( substr( $params[2], 7 ) ); // <ofield=x>
- $nfield = intval( substr( $params[3], 7 ) ); // <nfield=x>
- $details .= ': ' . RevisionDeleter::getLogMessage( $count, $nfield, $ofield, $langObj, true );
}
$rv = wfMsgExt( $wgLogActions[$key], array( 'parsemag', 'escape', 'replaceafter', 'language' => $langObj ), $params ) . $details;
@@ -296,6 +291,7 @@ class LogPage {
}
} else {
global $wgLogActionsHandlers;
+
if( isset( $wgLogActionsHandlers[$key] ) ) {
$args = func_get_args();
$rv = call_user_func_array( $wgLogActionsHandlers[$key], $args );
@@ -319,6 +315,7 @@ class LogPage {
$rv = str_replace( '[[', '', $rv );
$rv = str_replace( ']]', '', $rv );
}
+
return $rv;
}
@@ -332,9 +329,11 @@ class LogPage {
*/
protected static function getTitleLink( $type, $lang, $title, &$params ) {
global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
if( !$lang ) {
return $title->getPrefixedText();
}
+
switch( $type ) {
case 'move':
$titleLink = Linker::link(
@@ -343,7 +342,9 @@ class LogPage {
array(),
array( 'redirect' => 'no' )
);
+
$targetTitle = Title::newFromText( $params[0] );
+
if ( !$targetTitle ) {
# Workaround for broken database
$params[0] = htmlspecialchars( $params[0] );
@@ -358,7 +359,7 @@ class LogPage {
if( substr( $title->getText(), 0, 1 ) == '#' ) {
$titleLink = $title->getText();
} else {
- // TODO: Store the user identifier in the parameters
+ // @todo Store the user identifier in the parameters
// to make this faster for future log entries
$id = User::idFromName( $title->getText() );
$titleLink = Linker::userLink( $id, $title->getText() )
@@ -368,9 +369,11 @@ class LogPage {
case 'rights':
$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 ) {
break;
}
@@ -391,8 +394,9 @@ class LogPage {
$params[1] = $lang->timeanddate( $params[1] );
break;
default:
- if( $title->getNamespace() == NS_SPECIAL ) {
+ if( $title->isSpecialPage() ) {
list( $name, $par ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+
# Use the language name for log titles, rather than Log/X
if( $name == 'Log' ) {
$titleLink = '(' . Linker::link( $title, LogPage::logName( $par ) ) . ')';
@@ -403,6 +407,7 @@ class LogPage {
$titleLink = Linker::link( $title );
}
}
+
return $titleLink;
}
@@ -414,8 +419,13 @@ class LogPage {
* @param $comment String: description associated
* @param $params Array: parameters passed later to wfMsg.* functions
* @param $doer User object: the user doing the action
+ *
+ * @return bool|int|null
+ * @TODO: make this use LogEntry::saveContent()
*/
public function addEntry( $action, $target, $comment, $params = array(), $doer = null ) {
+ global $wgContLang;
+
if ( !is_array( $params ) ) {
$params = array( $params );
}
@@ -424,6 +434,9 @@ class LogPage {
$comment = '';
}
+ # Truncate for whole multibyte characters.
+ $comment = $wgContLang->truncate( $comment, 255 );
+
$this->action = $action;
$this->target = $target;
$this->comment = $comment;
@@ -438,7 +451,16 @@ class LogPage {
$this->doer = $doer;
- $this->actionText = LogPage::actionText( $this->type, $action, $target, null, $params );
+ $logEntry = new ManualLogEntry( $this->type, $action );
+ $logEntry->setTarget( $target );
+ $logEntry->setPerformer( $doer );
+ $logEntry->setParameters( $params );
+
+ $formatter = LogFormatter::newFromEntry( $logEntry );
+ $context = RequestContext::newExtraneousContext( $target );
+ $formatter->setContext( $context );
+
+ $this->actionText = $formatter->getPlainActionText();
return $this->saveContent();
}
@@ -455,7 +477,9 @@ class LogPage {
if( !strlen( $field ) || empty( $values ) ) {
return false; // nothing
}
+
$data = array();
+
foreach( $values as $value ) {
$data[] = array(
'ls_field' => $field,
@@ -463,8 +487,10 @@ class LogPage {
'ls_log_id' => $logid
);
}
+
$dbw = wfGetDB( DB_MASTER );
$dbw->insert( 'log_search', $data, __METHOD__, 'IGNORE' );
+
return true;
}
@@ -502,6 +528,7 @@ class LogPage {
*/
public static function formatBlockFlags( $flags, $lang ) {
$flags = explode( ',', trim( $flags ) );
+
if( count( $flags ) > 0 ) {
for( $i = 0; $i < count( $flags ); $i++ ) {
$flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
@@ -521,22 +548,87 @@ class LogPage {
*/
public static function formatBlockFlag( $flag, $lang ) {
static $messages = array();
+
if( !isset( $messages[$flag] ) ) {
$messages[$flag] = htmlspecialchars( $flag ); // Fallback
+ // For grepping. The following core messages can be used here:
+ // * block-log-flags-angry-autoblock
+ // * block-log-flags-anononly
+ // * block-log-flags-hiddenname
+ // * block-log-flags-noautoblock
+ // * block-log-flags-nocreate
+ // * block-log-flags-noemail
+ // * block-log-flags-nousertalk
$msg = wfMessage( 'block-log-flags-' . $flag )->inLanguage( $lang );
+
if ( $msg->exists() ) {
$messages[$flag] = $msg->escaped();
}
}
+
return $messages[$flag];
}
-}
-/**
- * Aliases for backwards compatibility with 1.6
- */
-define( 'MW_LOG_DELETED_ACTION', LogPage::DELETED_ACTION );
-define( 'MW_LOG_DELETED_USER', LogPage::DELETED_USER );
-define( 'MW_LOG_DELETED_COMMENT', LogPage::DELETED_COMMENT );
-define( 'MW_LOG_DELETED_RESTRICTED', LogPage::DELETED_RESTRICTED );
+
+ /**
+ * Name of the log.
+ * @return Message
+ * @since 1.19
+ */
+ public function getName() {
+ global $wgLogNames;
+
+ // BC
+ if ( isset( $wgLogNames[$this->type] ) ) {
+ $key = $wgLogNames[$this->type];
+ } else {
+ $key = 'log-name-' . $this->type;
+ }
+
+ return wfMessage( $key );
+ }
+
+ /**
+ * Description of this log type.
+ * @return Message
+ * @since 1.19
+ */
+ public function getDescription() {
+ global $wgLogHeaders;
+ // BC
+ if ( isset( $wgLogHeaders[$this->type] ) ) {
+ $key = $wgLogHeaders[$this->type];
+ } else {
+ $key = 'log-description-' . $this->type;
+ }
+ return wfMessage( $key );
+ }
+
+ /**
+ * Returns the right needed to read this log type.
+ * @return string
+ * @since 1.19
+ */
+ public function getRestriction() {
+ global $wgLogRestrictions;
+ if ( isset( $wgLogRestrictions[$this->type] ) ) {
+ $restriction = $wgLogRestrictions[$this->type];
+ } else {
+ // '' always returns true with $user->isAllowed()
+ $restriction = '';
+ }
+ return $restriction;
+ }
+
+ /**
+ * Tells if this log is not viewable by all.
+ * @return bool
+ * @since 1.19
+ */
+ public function isRestricted() {
+ $restriction = $this->getRestriction();
+ return $restriction !== '' && $restriction !== '*';
+ }
+
+}
diff --git a/includes/logging/LogPager.php b/includes/logging/LogPager.php
new file mode 100644
index 00000000..16781a6e
--- /dev/null
+++ b/includes/logging/LogPager.php
@@ -0,0 +1,356 @@
+<?php
+/**
+ * Contain classes to list log entries
+ *
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Pager
+ */
+class LogPager extends ReverseChronologicalPager {
+ private $types = array(), $performer = '', $title = '', $pattern = '';
+ private $typeCGI = '';
+ public $mLogEventsList;
+
+ /**
+ * Constructor
+ *
+ * @param $list LogEventsList
+ * @param $types String or Array: log types to show
+ * @param $performer String: the user who made the log entries
+ * @param $title String|Title: the page title the log entries are for
+ * @param $pattern String: do a prefix search rather than an exact title match
+ * @param $conds Array: extra conditions for the query
+ * @param $year Integer: the year to start from
+ * @param $month Integer: the month to start from
+ * @param $tagFilter String: tag
+ */
+ public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
+ $conds = array(), $year = false, $month = false, $tagFilter = '' ) {
+ parent::__construct( $list->getContext() );
+ $this->mConds = $conds;
+
+ $this->mLogEventsList = $list;
+
+ $this->limitType( $types ); // also excludes hidden types
+ $this->limitPerformer( $performer );
+ $this->limitTitle( $title, $pattern );
+ $this->getDateCond( $year, $month );
+ $this->mTagFilter = $tagFilter;
+ }
+
+ public function getDefaultQuery() {
+ $query = parent::getDefaultQuery();
+ $query['type'] = $this->typeCGI; // arrays won't work here
+ $query['user'] = $this->performer;
+ $query['month'] = $this->mMonth;
+ $query['year'] = $this->mYear;
+ return $query;
+ }
+
+ // Call ONLY after calling $this->limitType() already!
+ public function getFilterParams() {
+ global $wgFilterLogTypes;
+ $filters = array();
+ if( count($this->types) ) {
+ return $filters;
+ }
+ foreach( $wgFilterLogTypes as $type => $default ) {
+ // Avoid silly filtering
+ if( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
+ $hide = $this->getRequest()->getInt( "hide_{$type}_log", $default );
+ $filters[$type] = $hide;
+ if( $hide )
+ $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
+ }
+ }
+ return $filters;
+ }
+
+ /**
+ * Set the log reader to return only entries of the given type.
+ * Type restrictions enforced here
+ *
+ * @param $types String or array: Log types ('upload', 'delete', etc);
+ * empty string means no restriction
+ */
+ private function limitType( $types ) {
+ global $wgLogRestrictions;
+ // If $types is not an array, make it an array
+ $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] )
+ && !$this->getUser()->isAllowed($wgLogRestrictions[$type])
+ ) {
+ $needReindex = true;
+ $types = array_diff( $types, array( $type ) );
+ }
+ }
+ if ( $needReindex ) {
+ // Lots of this code makes assumptions that
+ // the first entry in the array is $types[0].
+ $types = array_values( $types );
+ }
+ $this->types = $types;
+ // Don't show private logs to unprivileged users.
+ // Also, only show them upon specific request to avoid suprises.
+ $audience = $types ? 'user' : 'public';
+ $hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience );
+ if( $hideLogs !== false ) {
+ $this->mConds[] = $hideLogs;
+ }
+ if( count($types) ) {
+ $this->mConds['log_type'] = $types;
+ // Set typeCGI; used in url param for paging
+ if( count($types) == 1 ) $this->typeCGI = $types[0];
+ }
+ }
+
+ /**
+ * Set the log reader to return only entries by the given user.
+ *
+ * @param $name String: (In)valid user name
+ */
+ private function limitPerformer( $name ) {
+ if( $name == '' ) {
+ return false;
+ }
+ $usertitle = Title::makeTitleSafe( NS_USER, $name );
+ if( is_null($usertitle) ) {
+ return false;
+ }
+ /* Fetch userid at first, if known, provides awesome query plan afterwards */
+ $userid = User::idFromName( $name );
+ 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";
+ } else {
+ $this->mConds['log_user'] = $userid;
+ // Paranoia: avoid brute force searches (bug 17342)
+ $user = $this->getUser();
+ if( !$user->isAllowed( 'deletedhistory' ) ) {
+ $this->mConds[] = $this->mDb->bitAnd('log_deleted', LogPage::DELETED_USER) . ' = 0';
+ } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+ $this->mConds[] = $this->mDb->bitAnd('log_deleted', LogPage::SUPPRESSED_USER) .
+ ' != ' . LogPage::SUPPRESSED_USER;
+ }
+ $this->performer = $usertitle->getText();
+ }
+ }
+
+ /**
+ * Set the log reader to return only entries affecting the given page.
+ * (For the block and rights logs, this is a user page.)
+ *
+ * @param $page String or Title object: Title name
+ * @param $pattern String
+ */
+ private function limitTitle( $page, $pattern ) {
+ global $wgMiserMode;
+
+ if ( $page instanceof Title ) {
+ $title = $page;
+ } else {
+ $title = Title::newFromText( $page );
+ if( strlen( $page ) == 0 || !$title instanceof Title ) {
+ return false;
+ }
+ }
+
+ $this->title = $title->getPrefixedText();
+ $ns = $title->getNamespace();
+ $db = $this->mDb;
+
+ # Using the (log_namespace, log_title, log_timestamp) index with a
+ # range scan (LIKE) on the first two parts, instead of simple equality,
+ # makes it unusable for sorting. Sorted retrieval using another index
+ # would be possible, but then we might have to scan arbitrarily many
+ # nodes of that index. Therefore, we need to avoid this if $wgMiserMode
+ # is on.
+ #
+ # This is not a problem with simple title matches, because then we can
+ # 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 ) {
+ $this->mConds['log_namespace'] = $ns;
+ $this->mConds[] = 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() );
+ $this->pattern = $pattern;
+ } else {
+ $this->mConds['log_namespace'] = $ns;
+ $this->mConds['log_title'] = $title->getDBkey();
+ }
+ // 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) .
+ ' != ' . LogPage::SUPPRESSED_ACTION;
+ }
+ }
+
+ /**
+ * Constructs the most part of the query. Extra conditions are sprinkled in
+ * all over this class.
+ * @return array
+ */
+ public function getQueryInfo() {
+ $basic = DatabaseLogEntry::getSelectQueryData();
+
+ $tables = $basic['tables'];
+ $fields = $basic['fields'];
+ $conds = $basic['conds'];
+ $options = $basic['options'];
+ $joins = $basic['join_conds'];
+
+ $index = array();
+ # 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 ) ) {
+ $tables[] = 'log_search';
+ $index['log_search'] = 'ls_field_val';
+ $index['logging'] = 'PRIMARY';
+ if ( !$this->hasEqualsClause( 'ls_field' )
+ || !$this->hasEqualsClause( 'ls_value' ) )
+ {
+ # Since (ls_field,ls_value,ls_logid) is unique, if the condition is
+ # to match a specific (ls_field,ls_value) tuple, then there will be
+ # 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;
+ # 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,
+ 'join_conds' => $joins,
+ );
+ # Add ChangeTags filter query
+ ChangeTags::modifyDisplayQuery( $info['tables'], $info['fields'], $info['conds'],
+ $info['join_conds'], $info['options'], $this->mTagFilter );
+ return $info;
+ }
+
+ /**
+ * Checks if $this->mConds has $field matched to a *single* value
+ * @param $field
+ * @return bool
+ */
+ protected function hasEqualsClause( $field ) {
+ return (
+ array_key_exists( $field, $this->mConds ) &&
+ ( !is_array( $this->mConds[$field] ) || count( $this->mConds[$field] ) == 1 )
+ );
+ }
+
+ function getIndexField() {
+ return 'log_timestamp';
+ }
+
+ public function getStartBody() {
+ wfProfileIn( __METHOD__ );
+ # Do a link batch query
+ if( $this->getNumRows() > 0 ) {
+ $lb = new LinkBatch;
+ foreach ( $this->mResult as $row ) {
+ $lb->add( $row->log_namespace, $row->log_title );
+ $lb->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
+ $lb->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
+ $formatter = LogFormatter::newFromRow( $row );
+ foreach ( $formatter->getPreloadTitles() as $title ) {
+ $lb->addObj( $title );
+ }
+ }
+ $lb->execute();
+ $this->mResult->seek( 0 );
+ }
+ wfProfileOut( __METHOD__ );
+ return '';
+ }
+
+ public function formatRow( $row ) {
+ return $this->mLogEventsList->logLine( $row );
+ }
+
+ public function getType() {
+ return $this->types;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPerformer() {
+ return $this->performer;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPage() {
+ return $this->title;
+ }
+
+ public function getPattern() {
+ return $this->pattern;
+ }
+
+ public function getYear() {
+ return $this->mYear;
+ }
+
+ public function getMonth() {
+ return $this->mMonth;
+ }
+
+ public function getTagFilter() {
+ return $this->mTagFilter;
+ }
+
+ public function doQuery() {
+ // Workaround MySQL optimizer bug
+ $this->mDb->setBigSelects();
+ parent::doQuery();
+ $this->mDb->setBigSelects( 'default' );
+ }
+}
diff --git a/includes/logging/PatrolLog.php b/includes/logging/PatrolLog.php
new file mode 100644
index 00000000..04fdc4f2
--- /dev/null
+++ b/includes/logging/PatrolLog.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Class containing static functions for working with
+ * logs of patrol events
+ *
+ * @author Rob Church <robchur@gmail.com>
+ * @author Niklas Laxström
+ */
+class PatrolLog {
+
+ /**
+ * Record a log event for a change being patrolled
+ *
+ * @param $rc Mixed: change identifier or RecentChange object
+ * @param $auto Boolean: was this patrol event automatic?
+ *
+ * @return bool
+ */
+ public static function record( $rc, $auto = false ) {
+ if ( !$rc instanceof RecentChange ) {
+ $rc = RecentChange::newFromId( $rc );
+ if ( !is_object( $rc ) ) {
+ return false;
+ }
+ }
+
+ $title = Title::makeTitleSafe( $rc->getAttribute( 'rc_namespace' ), $rc->getAttribute( 'rc_title' ) );
+ if( $title ) {
+ $entry = new ManualLogEntry( 'patrol', 'patrol' );
+ $entry->setTarget( $title );
+ $entry->setParameters( self::buildParams( $rc, $auto ) );
+ $entry->setPerformer( User::newFromName( $rc->getAttribute( 'rc_user_text' ), false ) );
+ $logid = $entry->insert();
+ if ( !$auto ) {
+ $entry->publish( $logid, 'udp' );
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Prepare log parameters for a patrolled change
+ *
+ * @param $change RecentChange to represent
+ * @param $auto Boolean: whether the patrol event was automatic
+ * @return Array
+ */
+ private static function buildParams( $change, $auto ) {
+ return array(
+ '4::curid' => $change->getAttribute( 'rc_this_oldid' ),
+ '5::previd' => $change->getAttribute( 'rc_last_oldid' ),
+ '6::auto' => (int)$auto
+ );
+ }
+
+}
diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php
index 3a66d8c9..619485cc 100644
--- a/includes/media/Bitmap.php
+++ b/includes/media/Bitmap.php
@@ -12,7 +12,6 @@
* @ingroup Media
*/
class BitmapHandler extends ImageHandler {
-
/**
* @param $image File
* @param $params array Transform parameters. Entries with the keys 'width'
@@ -21,12 +20,10 @@ class BitmapHandler extends ImageHandler {
* @return bool
*/
function normaliseParams( $image, &$params ) {
- global $wgMaxImageArea;
if ( !parent::normaliseParams( $image, $params ) ) {
return false;
}
- $mimeType = $image->getMimeType();
# Obtain the source, pre-rotation dimensions
$srcWidth = $image->getWidth( $params['page'] );
$srcHeight = $image->getHeight( $params['page'] );
@@ -43,19 +40,27 @@ class BitmapHandler extends ImageHandler {
}
}
- # Don't thumbnail an image so big that it will fill hard drives and send servers into swap
- # JPEG has the handy property of allowing thumbnailing without full decompression, so we make
- # an exception for it.
- # @todo FIXME: This actually only applies to ImageMagick
- if ( $mimeType !== 'image/jpeg' &&
- $srcWidth * $srcHeight > $wgMaxImageArea )
- {
- return false;
+ # Check if the file is smaller than the maximum image area for thumbnailing
+ $checkImageAreaHookResult = null;
+ wfRunHooks( 'BitmapHandlerCheckImageArea', array( $image, &$params, &$checkImageAreaHookResult ) );
+ if ( is_null( $checkImageAreaHookResult ) ) {
+ global $wgMaxImageArea;
+
+ if ( $srcWidth * $srcHeight > $wgMaxImageArea &&
+ !( $image->getMimeType() == 'image/jpeg' &&
+ self::getScalerType( false, false ) == 'im' ) ) {
+ # Only ImageMagick can efficiently downsize jpg images without loading
+ # the entire file in memory
+ return false;
+ }
+ } else {
+ return $checkImageAreaHookResult;
}
return true;
}
+
/**
* Extracts the width/height if the image will be scaled before rotating
*
@@ -81,10 +86,15 @@ 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.
- function getImageArea( $image, $width, $height ) {
- return $width * $height;
+ /**
+ * 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();
}
/**
@@ -115,12 +125,14 @@ class BitmapHandler extends ImageHandler {
'srcWidth' => $image->getWidth(),
'srcHeight' => $image->getHeight(),
'mimeType' => $image->getMimeType(),
- 'srcPath' => $image->getPath(),
'dstPath' => $dstPath,
'dstUrl' => $dstUrl,
);
- wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} thumbnail at $dstPath\n" );
+ # Determine scaler type
+ $scaler = self::getScalerType( $dstPath );
+
+ wfDebug( __METHOD__ . ": creating {$scalerParams['physicalDimensions']} thumbnail at $dstPath using scaler $scaler\n" );
if ( !$image->mustRender() &&
$scalerParams['physicalWidth'] == $scalerParams['srcWidth']
@@ -131,9 +143,6 @@ class BitmapHandler extends ImageHandler {
return $this->getClientScalingThumbnailImage( $image, $scalerParams );
}
- # Determine scaler type
- $scaler = self::getScalerType( $dstPath );
- wfDebug( __METHOD__ . ": scaler $scaler\n" );
if ( $scaler == 'client' ) {
# Client-side image scaling, use the source URL
@@ -144,15 +153,18 @@ class BitmapHandler extends ImageHandler {
if ( $flags & self::TRANSFORM_LATER ) {
wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
return new ThumbnailImage( $image, $dstUrl, $scalerParams['clientWidth'],
- $scalerParams['clientHeight'], $dstPath );
+ $scalerParams['clientHeight'], false );
}
# Try to make a target path for the thumbnail
- if ( !wfMkdirParents( dirname( $dstPath ) ) ) {
+ if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
wfDebug( __METHOD__ . ": Unable to create thumbnail destination directory, falling back to client scaling\n" );
return $this->getClientScalingThumbnailImage( $image, $scalerParams );
}
+ # Transform functions and binaries need a FS source file
+ $scalerParams['srcPath'] = $image->getLocalRefPath();
+
# Try a hook
$mto = null;
wfRunHooks( 'BitmapHandlerTransform', array( $this, $image, &$scalerParams, &$mto ) );
@@ -223,13 +235,6 @@ class BitmapHandler extends ImageHandler {
} else {
$scaler = 'client';
}
-
- if ( $scaler != 'client' && $dstPath ) {
- if ( !wfMkdirParents( dirname( $dstPath ) ) ) {
- # Unable to create a path for the thumbnail
- return 'client';
- }
- }
return $scaler;
}
@@ -245,7 +250,7 @@ class BitmapHandler extends ImageHandler {
*/
protected function getClientScalingThumbnailImage( $image, $params ) {
return new ThumbnailImage( $image, $image->getURL(),
- $params['clientWidth'], $params['clientHeight'], $params['srcPath'] );
+ $params['clientWidth'], $params['clientHeight'], null );
}
/**
@@ -276,15 +281,16 @@ class BitmapHandler extends ImageHandler {
< $wgSharpenReductionThreshold ) {
$sharpen = "-sharpen " . wfEscapeShellArg( $wgSharpenParameter );
}
- // JPEG decoder hint to reduce memory, available since IM 6.5.6-2
- $decoderHint = "-define jpeg:size={$params['physicalDimensions']}";
+ if ( version_compare( $this->getMagickVersion(), "6.5.6" ) >= 0 ) {
+ // JPEG decoder hint to reduce memory, available since IM 6.5.6-2
+ $decoderHint = "-define jpeg:size={$params['physicalDimensions']}";
+ }
} elseif ( $params['mimeType'] == 'image/png' ) {
$quality = "-quality 95"; // zlib 9, adaptive filtering
} elseif ( $params['mimeType'] == 'image/gif' ) {
- if ( $this->getImageArea( $image, $params['srcWidth'],
- $params['srcHeight'] ) > $wgMaxAnimatedGifArea ) {
+ if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
// Extract initial frame only; we're so big it'll
// be a total drag. :P
$scene = 0;
@@ -298,6 +304,8 @@ class BitmapHandler extends ImageHandler {
$animation_post = '-fuzz 5% -layers optimizeTransparency';
}
}
+ } elseif ( $params['mimeType'] == 'image/x-xcf' ) {
+ $animation_post = '-layers merge';
}
// Use one thread only, to avoid deadlock bugs on OOM
@@ -372,8 +380,7 @@ class BitmapHandler extends ImageHandler {
} elseif( $params['mimeType'] == 'image/png' ) {
$im->setCompressionQuality( 95 );
} elseif ( $params['mimeType'] == 'image/gif' ) {
- if ( $this->getImageArea( $image, $params['srcWidth'],
- $params['srcHeight'] ) > $wgMaxAnimatedGifArea ) {
+ if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
// Extract initial frame only; we're so big it'll
// be a total drag. :P
$im->setImageScene( 0 );
@@ -502,7 +509,7 @@ class BitmapHandler extends ImageHandler {
if ( !isset( $typemap[$params['mimeType']] ) ) {
$err = 'Image type not supported';
wfDebug( "$err\n" );
- $errMsg = wfMsg ( 'thumbnail_image-type' );
+ $errMsg = wfMsg( 'thumbnail_image-type' );
return $this->getMediaTransformError( $params, $errMsg );
}
list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
@@ -510,14 +517,14 @@ class BitmapHandler extends ImageHandler {
if ( !function_exists( $loader ) ) {
$err = "Incomplete GD library configuration: missing function $loader";
wfDebug( "$err\n" );
- $errMsg = wfMsg ( 'thumbnail_gd-library', $loader );
+ $errMsg = wfMsg( 'thumbnail_gd-library', $loader );
return $this->getMediaTransformError( $params, $errMsg );
}
if ( !file_exists( $params['srcPath'] ) ) {
$err = "File seems to be missing: {$params['srcPath']}";
wfDebug( "$err\n" );
- $errMsg = wfMsg ( 'thumbnail_image-missing', $params['srcPath'] );
+ $errMsg = wfMsg( 'thumbnail_image-missing', $params['srcPath'] );
return $this->getMediaTransformError( $params, $errMsg );
}
diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php
index d1caa67a..746dddda 100644
--- a/includes/media/BitmapMetadataHandler.php
+++ b/includes/media/BitmapMetadataHandler.php
@@ -32,7 +32,15 @@ class BitmapMetadataHandler {
* @param String $app13 String containing app13 block from jpeg file
*/
private function doApp13 ( $app13 ) {
- $this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
+ try {
+ $this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
+ } catch ( MWException $e ) {
+ // Error reading the iptc hash information.
+ // This probably means the App13 segment is something other than what we expect.
+ // However, still try to read it, and treat it as if the hash didn't exist.
+ wfDebug( "Error parsing iptc data of file: " . $e->getMessage() . "\n" );
+ $this->iptcType = 'iptc-no-hash';
+ }
$iptc = IPTC::parse( $app13 );
$this->addMetadata( $iptc, $this->iptcType );
@@ -44,7 +52,10 @@ class BitmapMetadataHandler {
* Basically what used to be in BitmapHandler::getMetadata().
* Just calls stuff in the Exif class.
*
+ * Parameters are passed to the Exif class.
+ *
* @param $filename string
+ * @param $byteOrder string
*/
function getExif ( $filename, $byteOrder ) {
global $wgShowEXIF;
@@ -122,8 +133,10 @@ class BitmapMetadataHandler {
if ( isset( $seg['COM'] ) && isset( $seg['COM'][0] ) ) {
$meta->addMetadata( Array( 'JPEGFileComment' => $seg['COM'] ), 'native' );
}
- if ( isset( $seg['PSIR'] ) ) {
- $meta->doApp13( $seg['PSIR'] );
+ if ( isset( $seg['PSIR'] ) && count( $seg['PSIR'] ) > 0 ) {
+ foreach( $seg['PSIR'] as $curPSIRValue ) {
+ $meta->doApp13( $curPSIRValue );
+ }
}
if ( isset( $seg['XMP'] ) && $showXMP ) {
$xmp = new XMPReader();
diff --git a/includes/media/Bitmap_ClientOnly.php b/includes/media/Bitmap_ClientOnly.php
index 50679229..3c5d9738 100644
--- a/includes/media/Bitmap_ClientOnly.php
+++ b/includes/media/Bitmap_ClientOnly.php
@@ -38,6 +38,6 @@ class BitmapHandler_ClientOnly extends BitmapHandler {
return new TransformParameterError( $params );
}
return new ThumbnailImage( $image, $image->getURL(), $params['width'],
- $params['height'], $image->getPath() );
+ $params['height'], $image->getLocalRefPath() );
}
}
diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php
index 2833f683..dedbee0d 100644
--- a/includes/media/DjVu.php
+++ b/includes/media/DjVu.php
@@ -131,7 +131,7 @@ class DjVuHandler extends ImageHandler {
}
$width = $params['width'];
$height = $params['height'];
- $srcPath = $image->getPath();
+ $srcPath = $image->getLocalRefPath();
$page = $params['page'];
if ( $page > $this->pageCount( $image ) ) {
return new MediaTransformError( 'thumbnail_error', $width, $height, wfMsg( 'djvu_page_error' ) );
@@ -141,13 +141,13 @@ class DjVuHandler extends ImageHandler {
return new ThumbnailImage( $image, $dstUrl, $width, $height, $dstPath, $page );
}
- if ( !wfMkdirParents( dirname( $dstPath ) ) ) {
+ if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
return new MediaTransformError( 'thumbnail_error', $width, $height, wfMsg( 'thumbnail_dest_directory' ) );
}
# Use a subshell (brackets) to aggregate stderr from both pipeline commands
# before redirecting it to the overall stdout. This works in both Linux and Windows XP.
- $cmd = '(' . wfEscapeShellArg( $wgDjvuRenderer ) . " -format=ppm -page={$page}" .
+ $cmd = '(' . wfEscapeShellArg( $wgDjvuRenderer ) . " -format=ppm -page={$page}" .
" -size={$params['physicalWidth']}x{$params['physicalHeight']} " .
wfEscapeShellArg( $srcPath );
if ( $wgDjvuPostProcessor ) {
@@ -190,6 +190,7 @@ class DjVuHandler extends ImageHandler {
/**
* Cache a document tree for the DjVu XML metadata
* @param $image File
+ * @param $gettext Boolean: DOCUMENT (Default: false)
*/
function getMetaTree( $image , $gettext = false ) {
if ( isset( $image->dejaMetaTree ) ) {
@@ -222,7 +223,7 @@ class DjVuHandler extends ImageHandler {
$image->dejaMetaTree = $tree;
}
} catch( Exception $e ) {
- wfDebug( "Bogus multipage XML metadata on '$image->name'\n" );
+ wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
}
wfRestoreWarnings();
wfProfileOut( __METHOD__ );
diff --git a/includes/DjVuImage.php b/includes/media/DjVuImage.php
index 80b7408c..80b7408c 100644
--- a/includes/DjVuImage.php
+++ b/includes/media/DjVuImage.php
diff --git a/includes/media/Exif.php b/includes/media/Exif.php
index 345a6f19..a4acdfe0 100644
--- a/includes/media/Exif.php
+++ b/includes/media/Exif.php
@@ -101,6 +101,7 @@ class Exif {
* Constructor
*
* @param $file String: filename.
+ * @param $byteOrder String Type of byte ordering either 'BE' (Big Endian) or 'LE' (Little Endian). Default ''.
* @todo FIXME: The following are broke:
* SubjectArea. Need to test the more obscure tags.
*
@@ -537,7 +538,7 @@ class Exif {
* @deprecated since 1.18
*/
function makeFormattedData( ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
$this->mFormattedExifData = FormatMetadata::getFormattedData(
$this->mFilteredExifData );
}
@@ -569,7 +570,7 @@ class Exif {
* @deprecated since 1.18
*/
function getFormattedData() {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
if (!$this->mFormattedExifData) {
$this->makeFormattedData();
}
diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php
index 05ce161b..7b9867f7 100644
--- a/includes/media/ExifBitmap.php
+++ b/includes/media/ExifBitmap.php
@@ -34,8 +34,8 @@ class ExifBitmapHandler extends BitmapHandler {
// Treat Software as a special case because in can contain
// an array of (SoftwareName, Version).
- if (isset( $metadata['Software'] )
- && is_array( $metadata['Software'] )
+ if (isset( $metadata['Software'] )
+ && is_array( $metadata['Software'] )
&& is_array( $metadata['Software'][0])
&& isset( $metadata['Software'][0][0] )
&& isset( $metadata['Software'][0][1])
@@ -136,8 +136,8 @@ class ExifBitmapHandler extends BitmapHandler {
function getImageSize( $image, $path ) {
global $wgEnableAutoRotation;
$gis = parent::getImageSize( $image, $path );
-
- // Don't just call $image->getMetadata(); File::getPropsFromPath() calls us with a bogus object.
+
+ // Don't just call $image->getMetadata(); FSFile::getPropsFromPath() calls us with a bogus object.
// This may mean we read EXIF data twice on initial upload.
if ( $wgEnableAutoRotation ) {
$meta = $this->getMetadata( $image, $path );
@@ -171,7 +171,7 @@ class ExifBitmapHandler extends BitmapHandler {
if ( !$wgEnableAutoRotation ) {
return 0;
}
-
+
$data = $file->getMetadata();
return $this->getRotationForExif( $data );
}
diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php
index 47fc1adc..91cb6914 100644
--- a/includes/media/FormatMetadata.php
+++ b/includes/media/FormatMetadata.php
@@ -233,10 +233,19 @@ class FormatMetadata {
if ( $val == '0000:00:00 00:00:00' || $val == ' : : : : ' ) {
$val = wfMsg( 'exif-unknowndate' );
} elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d):(?:\d\d)$/D', $val ) ) {
+ // Full date.
$time = wfTimestamp( TS_MW, $val );
if ( $time && intval( $time ) > 0 ) {
$val = $wgLang->timeanddate( $time );
}
+ } elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d)$/D', $val ) ) {
+ // No second field. Still format the same
+ // since timeanddate doesn't include seconds anyways,
+ // but second still available in api
+ $time = wfTimestamp( TS_MW, $val . ':00' );
+ if ( $time && intval( $time ) > 0 ) {
+ $val = $wgLang->timeanddate( $time );
+ }
} elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d)$/D', $val ) ) {
// If only the date but not the time is filled in.
$time = wfTimestamp( TS_MW, substr( $val, 0, 4 )
@@ -1174,7 +1183,7 @@ class FormatMetadata {
* Format a coordinate value, convert numbers from floating point
* into degree minute second representation.
*
- * @param $coords Array: degrees, minutes and seconds
+ * @param $coord Array: degrees, minutes and seconds
* @param $type String: latitude or longitude (for if its a NWS or E)
* @return mixed A floating point number or whatever we were fed
*/
diff --git a/includes/media/GIF.php b/includes/media/GIF.php
index 3bfa45a1..32618e94 100644
--- a/includes/media/GIF.php
+++ b/includes/media/GIF.php
@@ -14,7 +14,7 @@
class GIFHandler extends BitmapHandler {
const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
-
+
function getMetadata( $image, $filename ) {
try {
$parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
@@ -50,17 +50,16 @@ class GIFHandler extends BitmapHandler {
/**
* @param $image File
- * @param $width
- * @param $height
- * @return
+ * @todo unittests
+ * @return bool
*/
- function getImageArea( $image, $width, $height ) {
+ function getImageArea( $image ) {
$ser = $image->getMetadata();
if ( $ser ) {
$metadata = unserialize( $ser );
- return $width * $height * $metadata['frameCount'];
+ return $image->getWidth() * $image->getHeight() * $metadata['frameCount'];
} else {
- return $width * $height;
+ return $image->getWidth() * $image->getHeight();
}
}
@@ -118,7 +117,7 @@ class GIFHandler extends BitmapHandler {
wfSuppressWarnings();
$metadata = unserialize($image->getMetadata());
wfRestoreWarnings();
-
+
if (!$metadata || $metadata['frameCount'] <= 1) {
return $original;
}
@@ -126,19 +125,19 @@ class GIFHandler extends BitmapHandler {
/* Preserve original image info string, but strip the last char ')' so we can add even more */
$info = array();
$info[] = $original;
-
+
if ( $metadata['looped'] ) {
$info[] = wfMsgExt( 'file-info-gif-looped', 'parseinline' );
}
-
+
if ( $metadata['frameCount'] > 1 ) {
$info[] = wfMsgExt( 'file-info-gif-frames', 'parseinline', $metadata['frameCount'] );
}
-
+
if ( $metadata['duration'] ) {
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
}
-
+
return $wgLang->commaList( $info );
}
}
diff --git a/includes/media/Generic.php b/includes/media/Generic.php
index 6ef21e1e..271d3a8d 100644
--- a/includes/media/Generic.php
+++ b/includes/media/Generic.php
@@ -89,7 +89,7 @@ abstract class MediaHandler {
*
* @param $image File: the image object, or false if there isn't one
* @param $path String: the filename
- * @return Array
+ * @return Array Follow the format of PHP getimagesize() internal function. See http://www.php.net/getimagesize
*/
abstract function getImageSize( $image, $path );
@@ -97,7 +97,7 @@ abstract class MediaHandler {
* Get handler-specific metadata which will be saved in the img_metadata field.
*
* @param $image File: the image object, or false if there isn't one.
- * Warning, File::getPropsFromPath might pass an (object)array() instead (!)
+ * Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
* @param $path String: the filename
* @return String
*/
@@ -187,7 +187,7 @@ abstract class MediaHandler {
* @param $dstUrl String: Destination URL to use in output HTML
* @param $params Array: Arbitrary set of parameters validated by $this->validateParam()
*/
- function getTransform( $image, $dstPath, $dstUrl, $params ) {
+ final function getTransform( $image, $dstPath, $dstUrl, $params ) {
return $this->doTransform( $image, $dstPath, $dstUrl, $params, self::TRANSFORM_LATER );
}
@@ -200,6 +200,8 @@ abstract class MediaHandler {
* @param $dstUrl String: destination URL to use in output HTML
* @param $params Array: arbitrary set of parameters validated by $this->validateParam()
* @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
+ *
+ * @return MediaTransformOutput
*/
abstract function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 );
@@ -258,7 +260,7 @@ abstract class MediaHandler {
* @param $image File
*/
function getPageDimensions( $image, $page ) {
- $gis = $this->getImageSize( $image, $image->getPath() );
+ $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
return array(
'width' => $gis[0],
'height' => $gis[1]
@@ -362,7 +364,7 @@ abstract class MediaHandler {
* @param &$array Array An array containing elements for each type of visibility
* and each of those elements being an array of metadata items. This function adds
* a value to that array.
- * @param $visbility string ('visible' or 'collapsed') if this value is hidden
+ * @param $visibility string ('visible' or 'collapsed') if this value is hidden
* by default.
* @param $type String type of metadata tag (currently always 'exif')
* @param $id String the name of the metadata tag (like 'artist' for example).
@@ -378,8 +380,10 @@ abstract class MediaHandler {
* Note, everything here is passed through the parser later on (!)
*/
protected static function addMeta( &$array, $visibility, $type, $id, $value, $param = false ) {
- $msgName = "$type-$id";
- if ( wfEmptyMsg( $msgName ) ) {
+ $msg = wfMessage( "$type-$id", $param );
+ if ( $msg->exists() ) {
+ $name = $msg->text();
+ } else {
// This is for future compatibility when using instant commons.
// So as to not display as ugly a name if a new metadata
// property is defined that we don't know about
@@ -387,8 +391,6 @@ abstract class MediaHandler {
// by default).
wfDebug( __METHOD__ . ' Unknown metadata name: ' . $id . "\n" );
$name = wfEscapeWikiText( $id );
- } else {
- $name = wfMsg( $msgName, $param );
}
$array[$visibility][] = array(
'id' => "$type-$id",
@@ -403,9 +405,7 @@ abstract class MediaHandler {
*/
function getShortDesc( $file ) {
global $wgLang;
- $nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $file->getSize() ) );
- return "$nbytes";
+ return htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
}
/**
@@ -414,9 +414,8 @@ abstract class MediaHandler {
*/
function getLongDesc( $file ) {
global $wgLang;
- return wfMsgExt( 'file-info', 'parseinline',
- $wgLang->formatSize( $file->getSize() ),
- $file->getMimeType() );
+ return wfMessage( 'file-info', htmlspecialchars( $wgLang->formatSize( $file->getSize() ) ),
+ $file->getMimeType() )->parse();
}
/**
@@ -425,9 +424,7 @@ abstract class MediaHandler {
*/
static function getGeneralShortDesc( $file ) {
global $wgLang;
- $nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $file->getSize() ) );
- return "$nbytes";
+ return $wgLang->formatSize( $file->getSize() );
}
/**
@@ -436,9 +433,26 @@ abstract class MediaHandler {
*/
static function getGeneralLongDesc( $file ) {
global $wgLang;
- return wfMsgExt( 'file-info', 'parseinline',
- $wgLang->formatSize( $file->getSize() ),
- $file->getMimeType() );
+ return wfMessage( 'file-info', $wgLang->formatSize( $file->getSize() ),
+ $file->getMimeType() )->parse();
+ }
+
+ /**
+ * Calculate the largest thumbnail width for a given original file size
+ * such that the thumbnail's height is at most $maxHeight.
+ * @param $boxWidth Integer Width of the thumbnail box.
+ * @param $boxHeight Integer Height of the thumbnail box.
+ * @param $maxHeight Integer Maximum height expected for the thumbnail.
+ * @return Integer.
+ */
+ public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
+ $idealWidth = $boxWidth * $maxHeight / $boxHeight;
+ $roundedUp = ceil( $idealWidth );
+ if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
+ return floor( $idealWidth );
+ } else {
+ return $roundedUp;
+ }
}
function getDimensionsString( $file ) {
@@ -476,15 +490,32 @@ abstract class MediaHandler {
if( file_exists( $dstPath ) ) {
$thumbstat = stat( $dstPath );
if( $thumbstat['size'] == 0 || $retval != 0 ) {
- wfDebugLog( 'thumbnail',
- sprintf( 'Removing bad %d-byte thumbnail "%s"',
- $thumbstat['size'], $dstPath ) );
- unlink( $dstPath );
+ $result = unlink( $dstPath );
+
+ if ( $result ) {
+ wfDebugLog( 'thumbnail',
+ sprintf( 'Removing bad %d-byte thumbnail "%s". unlink() succeeded',
+ $thumbstat['size'], $dstPath ) );
+ } else {
+ wfDebugLog( 'thumbnail',
+ sprintf( 'Removing bad %d-byte thumbnail "%s". unlink() failed',
+ $thumbstat['size'], $dstPath ) );
+ }
return true;
}
}
return false;
}
+
+ /**
+ * Remove files from the purge list
+ *
+ * @param array $files
+ * @param array $options
+ */
+ public function filterThumbnailPurgeList( &$files, $options ) {
+ // Do nothing
+ }
}
/**
@@ -575,7 +606,7 @@ abstract class ImageHandler extends MediaHandler {
# Height & width were both set
if ( $params['width'] * $srcHeight > $params['height'] * $srcWidth ) {
# Height is the relative smaller dimension, so scale width accordingly
- $params['width'] = wfFitBoxWidth( $srcWidth, $srcHeight, $params['height'] );
+ $params['width'] = self::fitBoxWidth( $srcWidth, $srcHeight, $params['height'] );
if ( $params['width'] == 0 ) {
# Very small image, so we need to rely on client side scaling :(
@@ -614,13 +645,6 @@ abstract class ImageHandler extends MediaHandler {
}
/**
- * Get a transform output object without actually doing the transform
- */
- function getTransform( $image, $dstPath, $dstUrl, $params ) {
- return $this->doTransform( $image, $dstPath, $dstUrl, $params, self::TRANSFORM_LATER );
- }
-
- /**
* Validate thumbnail parameters and fill in the correct height
*
* @param $width Integer: specified width (input/output)
@@ -686,9 +710,8 @@ abstract class ImageHandler extends MediaHandler {
*/
function getShortDesc( $file ) {
global $wgLang;
- $nbytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $file->getSize() ) );
- $widthheight = wfMsgHtml( 'widthheight', $wgLang->formatNum( $file->getWidth() ) ,$wgLang->formatNum( $file->getHeight() ) );
+ $nbytes = htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
+ $widthheight = wfMessage( 'widthheight' )->numParams( $file->getWidth(), $file->getHeight() )->escaped();
return "$widthheight ($nbytes)";
}
@@ -700,19 +723,15 @@ abstract class ImageHandler extends MediaHandler {
function getLongDesc( $file ) {
global $wgLang;
$pages = $file->pageCount();
+ $size = htmlspecialchars( $wgLang->formatSize( $file->getSize() ) );
if ( $pages === false || $pages <= 1 ) {
- $msg = wfMsgExt('file-info-size', 'parseinline',
- $wgLang->formatNum( $file->getWidth() ),
- $wgLang->formatNum( $file->getHeight() ),
- $wgLang->formatSize( $file->getSize() ),
- $file->getMimeType() );
+ $msg = wfMessage( 'file-info-size' )->numParams( $file->getWidth(),
+ $file->getHeight() )->params( $size,
+ $file->getMimeType() )->parse();
} else {
- $msg = wfMsgExt('file-info-size-pages', 'parseinline',
- $wgLang->formatNum( $file->getWidth() ),
- $wgLang->formatNum( $file->getHeight() ),
- $wgLang->formatSize( $file->getSize() ),
- $file->getMimeType(),
- $wgLang->formatNum( $pages ) );
+ $msg = wfMessage( 'file-info-size-pages' )->numParams( $file->getWidth(),
+ $file->getHeight() )->params( $size,
+ $file->getMimeType() )->numParams( $pages )->parse();
}
return $msg;
}
@@ -722,16 +741,11 @@ abstract class ImageHandler extends MediaHandler {
* @return string
*/
function getDimensionsString( $file ) {
- global $wgLang;
$pages = $file->pageCount();
- $width = $wgLang->formatNum( $file->getWidth() );
- $height = $wgLang->formatNum( $file->getHeight() );
- $pagesFmt = $wgLang->formatNum( $pages );
-
if ( $pages > 1 ) {
- return wfMsgExt( 'widthheightpage', 'parsemag', $width, $height, $pagesFmt );
+ return wfMessage( 'widthheightpage' )->numParams( $file->getWidth(), $file->getHeight(), $pages )->text();
} else {
- return wfMsg( 'widthheight', $width, $height );
+ return wfMessage( 'widthheight' )->numParams( $file->getWidth(), $file->getHeight() )->text();
}
}
}
diff --git a/includes/media/JpegMetadataExtractor.php b/includes/media/JpegMetadataExtractor.php
index 4769bf8e..224b4a2b 100644
--- a/includes/media/JpegMetadataExtractor.php
+++ b/includes/media/JpegMetadataExtractor.php
@@ -31,6 +31,7 @@ class JpegMetadataExtractor {
$segments = array(
'XMP_ext' => array(),
'COM' => array(),
+ 'PSIR' => array(),
);
if ( !$filename ) {
@@ -122,7 +123,7 @@ class JpegMetadataExtractor {
// APP13 - PSIR. IPTC and some photoshop stuff
$temp = self::jpegExtractMarker( $fh );
if ( substr( $temp, 0, 14 ) === "Photoshop 3.0\x00" ) {
- $segments["PSIR"] = $temp;
+ $segments["PSIR"][] = $temp;
}
} elseif ( $buffer === "\xD9" || $buffer === "\xDA" ) {
// EOI - end of image or SOS - start of scan. either way we're past any interesting segments
@@ -162,11 +163,12 @@ class JpegMetadataExtractor {
* This should generally be called by BitmapMetadataHandler::doApp13()
*
* @param String $app13 photoshop psir app13 block from jpg.
+ * @throws MWException (It gets caught next level up though)
* @return String if the iptc hash is good or not.
*/
public static function doPSIR ( $app13 ) {
if ( !$app13 ) {
- return;
+ throw new MWException( "No App13 segment given" );
}
// First compare hash with real thing
// 0x404 contains IPTC, 0x425 has hash
@@ -218,8 +220,8 @@ class JpegMetadataExtractor {
// this should not happen, but check.
if ( $lenData['len'] + $offset > $appLen ) {
- wfDebug( __METHOD__ . " PSIR data too long.\n" );
- return 'iptc-no-hash';
+ throw new MWException( "PSIR data too long. (item length=" . $lenData['len']
+ . "; offset=$offset; total length=$appLen)" );
}
if ( $valid ) {
diff --git a/includes/media/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php
index f170bb9d..fcfb2f45 100644
--- a/includes/media/MediaTransformOutput.php
+++ b/includes/media/MediaTransformOutput.php
@@ -18,33 +18,42 @@ abstract class MediaTransformOutput {
var $file;
var $width, $height, $url, $page, $path;
+ protected $storagePath = false;
/**
* Get the width of the output box
*/
- function getWidth() {
+ public function getWidth() {
return $this->width;
}
/**
* Get the height of the output box
*/
- function getHeight() {
+ public function getHeight() {
return $this->height;
}
/**
* @return string The thumbnail URL
*/
- function getUrl() {
+ public function getUrl() {
return $this->url;
}
/**
- * @return String: destination file path (local filesystem)
+ * @return string|false The permanent thumbnail storage path
*/
- function getPath() {
- return $this->path;
+ public function getStoragePath() {
+ return $this->storagePath;
+ }
+
+ /**
+ * @param $storagePath string The permanent storage path
+ * @return void
+ */
+ public function setStoragePath( $storagePath ) {
+ $this->storagePath = $storagePath;
}
/**
@@ -67,16 +76,66 @@ abstract class MediaTransformOutput {
*
* @return string
*/
- abstract function toHtml( $options = array() );
+ abstract public function toHtml( $options = array() );
/**
* This will be overridden to return true in error classes
*/
- function isError() {
+ public function isError() {
return false;
}
/**
+ * Check if an output thumbnail file actually exists.
+ * This will return false if there was an error, the
+ * thumbnail is to be handled client-side only, or if
+ * transformation was deferred via TRANSFORM_LATER.
+ *
+ * @return Bool
+ */
+ public function hasFile() {
+ // If TRANSFORM_LATER, $this->path will be false.
+ // Note: a null path means "use the source file".
+ return ( !$this->isError() && ( $this->path || $this->path === null ) );
+ }
+
+ /**
+ * Check if the output thumbnail is the same as the source.
+ * This can occur if the requested width was bigger than the source.
+ *
+ * @return Bool
+ */
+ public function fileIsSource() {
+ return ( !$this->isError() && $this->path === null );
+ }
+
+ /**
+ * Get the path of a file system copy of the thumbnail.
+ * Callers should never write to this path.
+ *
+ * @return string|false Returns false if there isn't one
+ */
+ public function getLocalCopyPath() {
+ if ( $this->isError() ) {
+ return false;
+ } elseif ( $this->path === null ) {
+ return $this->file->getLocalRefPath();
+ } else {
+ return $this->path; // may return false
+ }
+ }
+
+ /**
+ * Stream the file if there were no errors
+ *
+ * @param $headers Array Additional HTTP headers to send on success
+ * @return Bool success
+ */
+ public function streamFile( $headers = array() ) {
+ return $this->path && StreamFile::stream( $this->getLocalCopyPath(), $headers );
+ }
+
+ /**
* Wrap some XHTML text in an anchor tag with the given attributes
*
* @param $linkAttribs array
@@ -97,7 +156,7 @@ abstract class MediaTransformOutput {
* @param $params array
* @return array
*/
- function getDescLinkAttribs( $title = null, $params = '' ) {
+ public function getDescLinkAttribs( $title = null, $params = '' ) {
$query = $this->page ? ( 'page=' . urlencode( $this->page ) ) : '';
if( $params ) {
$query .= $query ? '&'.$params : $params;
@@ -119,13 +178,16 @@ abstract class MediaTransformOutput {
* @ingroup Media
*/
class ThumbnailImage extends MediaTransformOutput {
-
/**
+ * Get a thumbnail object from a file and parameters.
+ * If $path is set to null, the output file is treated as a source copy.
+ * If $path is set to false, no output file will be created.
+ *
* @param $file File object
* @param $url String: URL path to the thumb
* @param $width Integer: file's width
* @param $height Integer: file's height
- * @param $path String: filesystem path to the thumb
+ * @param $path String|false|null: filesystem path to the thumb
* @param $page Integer: page number, for multipage files
* @private
*/
@@ -185,7 +247,7 @@ class ThumbnailImage extends MediaTransformOutput {
} elseif ( !empty( $options['custom-title-link'] ) ) {
$title = $options['custom-title-link'];
$linkAttribs = array(
- 'href' => $title->getLinkUrl(),
+ 'href' => $title->getLinkURL(),
'title' => empty( $options['title'] ) ? $title->getFullText() : $options['title']
);
} elseif ( !empty( $options['desc-link'] ) ) {
diff --git a/includes/media/SVG.php b/includes/media/SVG.php
index ceffd7c3..aac838e1 100644
--- a/includes/media/SVG.php
+++ b/includes/media/SVG.php
@@ -93,13 +93,13 @@ class SvgHandler extends ImageHandler {
$clientHeight = $params['height'];
$physicalWidth = $params['physicalWidth'];
$physicalHeight = $params['physicalHeight'];
- $srcPath = $image->getPath();
+ $srcPath = $image->getLocalRefPath();
if ( $flags & self::TRANSFORM_LATER ) {
return new ThumbnailImage( $image, $dstUrl, $clientWidth, $clientHeight, $dstPath );
}
- if ( !wfMkdirParents( dirname( $dstPath ) ) ) {
+ if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
wfMsg( 'thumbnail_dest_directory' ) );
}
@@ -119,7 +119,7 @@ class SvgHandler extends ImageHandler {
* @param string $dstPath
* @param string $width
* @param string $height
- * @returns TRUE/MediaTransformError
+ * @return true|MediaTransformError
*/
public function rasterize( $srcPath, $dstPath, $width, $height ) {
global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
@@ -129,7 +129,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 ),
array_slice( $wgSVGConverters[$wgSVGConverter], 1 ) );
if ( !is_callable( $func ) ) {
throw new MWException( "$func is not callable" );
@@ -161,13 +161,13 @@ class SvgHandler extends ImageHandler {
}
return true;
}
-
+
public static function rasterizeImagickExt( $srcPath, $dstPath, $width, $height ) {
$im = new Imagick( $srcPath );
$im->setImageFormat( 'png' );
$im->setBackgroundColor( 'transparent' );
$im->setImageDepth( 8 );
-
+
if ( !$im->thumbnailImage( intval( $width ), intval( $height ), /* fit */ false ) ) {
return 'Could not resize image';
}
diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php
index 22ef8e61..db9f05fd 100644
--- a/includes/media/SVGMetadataExtractor.php
+++ b/includes/media/SVGMetadataExtractor.php
@@ -68,6 +68,12 @@ class SVGReader {
$this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING );
}
+ // Expand entities, since Adobe Illustrator uses them for xmlns
+ // attributes (bug 31719). Note that libxml2 has some protection
+ // against large recursive entity expansions so this is not as
+ // insecure as it might appear to be.
+ $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
+
$this->metadata['width'] = self::DEFAULT_WIDTH;
$this->metadata['height'] = self::DEFAULT_HEIGHT;
@@ -166,7 +172,7 @@ class SVGReader {
}
}
- /*
+ /**
* Read an XML snippet from an element
*
* @param String $metafield that we will fill with the result
diff --git a/includes/media/XCF.php b/includes/media/XCF.php
new file mode 100644
index 00000000..806db73c
--- /dev/null
+++ b/includes/media/XCF.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Handler for the Gimp's native file format (XCF)
+ *
+ * Overview:
+ * http://en.wikipedia.org/wiki/XCF_(file_format)
+ * Specification in Gnome repository:
+ * http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup
+ *
+ * @file
+ * @ingroup Media
+ */
+
+/**
+ * Handler for the Gimp's native file format; getimagesize() doesn't
+ * support these files
+ *
+ * @ingroup Media
+ */
+class XCFHandler extends BitmapHandler {
+
+ /**
+ * @param $file
+ * @return bool
+ */
+ function mustRender( $file ) {
+ return true;
+ }
+
+ /**
+ * Render files as PNG
+ *
+ * @param $ext
+ * @param $mime
+ * @param $params
+ * @return array
+ */
+ function getThumbType( $ext, $mime, $params = null ) {
+ return array( 'png', 'image/png' );
+ }
+
+ /**
+ * Get width and height from the XCF header.
+ *
+ * @param $image
+ * @param $filename
+ * @return array
+ */
+ function getImageSize( $image, $filename ) {
+ return self::getXCFMetaData( $filename );
+ }
+
+ /**
+ * Metadata for a given XCF file
+ *
+ * Will return false if file magic signature is not recognized
+ * @author Hexmode
+ * @author Hashar
+ *
+ * @param $filename String Full path to a XCF file
+ * @return false|metadata array just like PHP getimagesize()
+ */
+ static function getXCFMetaData( $filename ) {
+ # Decode master structure
+ $f = fopen( $filename, 'rb' );
+ if( !$f ) {
+ return false;
+ }
+ # The image structure always starts at offset 0 in the XCF file.
+ # So we just read it :-)
+ $binaryHeader = fread( $f, 26 );
+ fclose($f);
+
+ # Master image structure:
+ #
+ # byte[9] "gimp xcf " File type magic
+ # byte[4] version XCF version
+ # "file" - version 0
+ # "v001" - version 1
+ # "v002" - version 2
+ # byte 0 Zero-terminator for version tag
+ # uint32 width With of canvas
+ # uint32 height Height of canvas
+ # uint32 base_type Color mode of the image; one of
+ # 0: RGB color
+ # 1: Grayscale
+ # 2: Indexed color
+ # (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
+ try {
+ $header = wfUnpack(
+ "A9magic" # A: space padded
+ . "/a5version" # a: zero padded
+ . "/Nwidth" # \
+ . "/Nheight" # N: unsigned long 32bit big endian
+ . "/Nbase_type" # /
+ , $binaryHeader
+ );
+ } catch( MWException $mwe ) {
+ return false;
+ }
+
+ # Check values
+ if( $header['magic'] !== 'gimp xcf' ) {
+ wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
+ return false;
+ }
+ # TODO: we might want to check for sane values of width and height
+
+ wfDebug( __METHOD__ . ": canvas size of '$filename' is {$header['width']} x {$header['height']} px\n" );
+
+ # Forge a return array containing metadata information just like getimagesize()
+ # See PHP documentation at: http://www.php.net/getimagesize
+ $metadata = array();
+ $metadata[0] = $header['width'];
+ $metadata[1] = $header['height'];
+ $metadata[2] = null; # IMAGETYPE constant, none exist for XCF.
+ $metadata[3] = sprintf(
+ 'height="%s" width="%s"', $header['height'], $header['width']
+ );
+ $metadata['mime'] = 'image/x-xcf';
+ $metadata['channels'] = null;
+ $metadata['bits'] = 8; # Always 8-bits per color
+
+ assert( '7 == count($metadata); # return array must contains 7 elements just like getimagesize() return' );
+
+ return $metadata;
+ }
+
+ /**
+ * Must use "im" for XCF
+ *
+ * @return string
+ */
+ protected static function getScalerType( $dstPath, $checkDstPath = true ) {
+ return "im";
+ }
+}
diff --git a/includes/media/XMP.php b/includes/media/XMP.php
index 1e578582..0dbf5632 100644
--- a/includes/media/XMP.php
+++ b/includes/media/XMP.php
@@ -210,9 +210,9 @@ class XMPReader {
* Also catches any errors during processing, writes them to
* debug log, blanks result array and returns false.
*
- * @param String: $content XMP data
- * @param Boolean: $allOfIt If this is all the data (true) or if its split up (false). Default true
- * @param Boolean: $reset - does xml parser need to be reset. Default false
+ * @param $content String: XMP data
+ * @param $allOfIt Boolean: If this is all the data (true) or if its split up (false). Default true
+ * @param $reset Boolean: does xml parser need to be reset. Default false
* @return Boolean success.
*/
public function parse( $content, $allOfIt = true, $reset = false ) {
diff --git a/includes/media/XMPInfo.php b/includes/media/XMPInfo.php
index 1d580ff7..156d9b50 100644
--- a/includes/media/XMPInfo.php
+++ b/includes/media/XMPInfo.php
@@ -631,12 +631,23 @@ class XMPInfo {
'validate' => 'validateClosed',
'choices' => array( '1' => true, '2' => true ),
),
- 'YCbCrSubSampling' => array(
- 'map_group' => 'exif',
- 'mode' => XMPReader::MODE_SEQ,
- 'validate' => 'validateClosed',
- 'choices' => array( '1' => true, '2' => true ),
- ),
+ /********
+ * Disable extracting this property (bug 31944)
+ * Several files have a string instead of a Seq
+ * for this property. XMPReader doesn't handle
+ * mismatched types very gracefully (it marks
+ * the entire file as invalid, instead of just
+ * the relavent prop). Since this prop
+ * doesn't communicate all that useful information
+ * just disable this prop for now, until such
+ * XMPReader is more graceful (bug 32172)
+ * 'YCbCrSubSampling' => array(
+ * 'map_group' => 'exif',
+ * 'mode' => XMPReader::MODE_SEQ,
+ * 'validate' => 'validateClosed',
+ * 'choices' => array( '1' => true, '2' => true ),
+ * ),
+ */
),
'http://ns.adobe.com/exif/1.0/aux/' => array(
'Lens' => array(
diff --git a/includes/media/XMPValidate.php b/includes/media/XMPValidate.php
index 0f1d375c..600d99de 100644
--- a/includes/media/XMPValidate.php
+++ b/includes/media/XMPValidate.php
@@ -201,10 +201,20 @@ class XMPValidate {
}
/**
- * function to validate date properties, and convert to Exif format.
+ * function to validate date properties, and convert to (partial) Exif format.
+ *
+ * Dates can be one of the following formats:
+ * YYYY
+ * YYYY-MM
+ * YYYY-MM-DD
+ * YYYY-MM-DDThh:mmTZD
+ * YYYY-MM-DDThh:mm:ssTZD
+ * YYYY-MM-DDThh:mm:ss.sTZD
*
* @param $info Array information about current property
* @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
+ * in cases where there's only a partial date, it will give things like
+ * 2011:04.
* @param $standalone Boolean if this is a simple property or array
*/
public static function validateDate( $info, &$val, $standalone ) {
@@ -240,25 +250,41 @@ class XMPValidate {
$val = null;
return;
}
- //if month, etc unspecified, full out as 01.
- $res[2] = isset( $res[2] ) ? $res[2] : '01'; //month
- $res[3] = isset( $res[3] ) ? $res[3] : '01'; //day
+
if ( !isset( $res[4] ) ) { //hour
- //just have the year month day
- $val = $res[1] . ':' . $res[2] . ':' . $res[3];
+ //just have the year month day (if that)
+ $val = $res[1];
+ if ( isset( $res[2] ) ) {
+ $val .= ':' . $res[2];
+ }
+ if ( isset( $res[3] ) ) {
+ $val .= ':' . $res[3];
+ }
return;
}
- //if hour is set, so is minute or regex above will fail.
- //Extra check for empty string necessary due to TZ but no second case.
- $res[6] = isset( $res[6] ) && $res[6] != '' ? $res[6] : '00';
if ( !isset( $res[7] ) || $res[7] === 'Z' ) {
+ //if hour is set, then minute must also be or regex above will fail.
$val = $res[1] . ':' . $res[2] . ':' . $res[3]
- . ' ' . $res[4] . ':' . $res[5] . ':' . $res[6];
+ . ' ' . $res[4] . ':' . $res[5];
+ if ( isset( $res[6] ) && $res[6] !== '' ) {
+ $val .= ':' . $res[6];
+ }
return;
}
- //do timezone processing. We've already done the case that tz = Z.
+
+ // Extra check for empty string necessary due to TZ but no second case.
+ $stripSeconds = false;
+ if ( !isset( $res[6] ) || $res[6] === '' ) {
+ $res[6] = '00';
+ $stripSeconds = true;
+ }
+
+ // Do timezone processing. We've already done the case that tz = Z.
+
+ // We know that if we got to this step, year, month day hour and min must be set
+ // by virtue of regex not failing.
$unix = wfTimestamp( TS_UNIX, $res[1] . $res[2] . $res[3] . $res[4] . $res[5] . $res[6] );
$offset = intval( substr( $res[7], 1, 2 ) ) * 60 * 60;
@@ -267,6 +293,11 @@ class XMPValidate {
$offset = -$offset;
}
$val = wfTimestamp( TS_EXIF, $unix + $offset );
+
+ if ( $stripSeconds ) {
+ // If seconds weren't specified, remove the trailing ':00'.
+ $val = substr( $val, 0, -3 );
+ }
}
}
diff --git a/includes/mime.info b/includes/mime.info
index d705715d..f7576e41 100644
--- a/includes/mime.info
+++ b/includes/mime.info
@@ -13,12 +13,12 @@ image/jpeg [BITMAP]
image/jp2 [BITMAP]
image/xbm [BITMAP]
image/tiff [BITMAP]
-image/x-icon [BITMAP]
+image/x-icon image/x-ico [BITMAP]
image/x-rgb [BITMAP]
image/x-portable-pixmap [BITMAP]
image/x-portable-graymap image/x-portable-greymap [BITMAP]
image/x-bmp image/x-ms-bmp image/bmp application/x-bmp application/bmp [BITMAP]
-image/x-photoshop image/psd image/x-psd image/photoshop [BITMAP]
+image/x-photoshop image/psd image/x-psd image/photoshop image/vnd.adobe.photoshop [BITMAP]
image/vnd.djvu image/x.djvu image/x-djvu [BITMAP]
image/webp [BITMAP]
diff --git a/includes/mime.types b/includes/mime.types
index 9e640322..5b64201f 100644
--- a/includes/mime.types
+++ b/includes/mime.types
@@ -57,9 +57,9 @@ application/x-wais-source src
application/x-xpinstall xpi
application/xhtml+xml xhtml xht
application/xslt+xml xslt
-application/xml xml xsl xsd
+application/xml xml xsl xsd kml
application/xml-dtd dtd
-application/zip zip jar xpi sxc stc sxd std sxi sti sxm stm sxw stw
+application/zip zip jar xpi sxc stc sxd std sxi sti sxm stm sxw stw
application/x-rar rar
audio/basic au snd
audio/midi mid midi kar
@@ -115,6 +115,7 @@ text/vnd.wap.wml wml
text/vnd.wap.wmlscript wmls
text/xml xml xsl xslt rss rdf
text/x-setext etx
+text/x-sawfish jl
video/mpeg mpeg mpg mpe
video/ogg ogv ogm ogg
video/quicktime qt mov
@@ -126,21 +127,22 @@ video/x-msvideo avi
video/x-ogg ogv ogm ogg
video/x-sgi-movie movie
x-conference/x-cooltalk ice
-application/vnd.oasis.opendocument.text odt
-application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template otf
application/vnd.oasis.opendocument.graphics odg
application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
application/vnd.oasis.opendocument.presentation odp
application/vnd.oasis.opendocument.presentation-template otp
application/vnd.oasis.opendocument.spreadsheet ods
application/vnd.oasis.opendocument.spreadsheet-template ots
-application/vnd.oasis.opendocument.chart odc
-application/vnd.oasis.opendocument.chart-template otc
-application/vnd.oasis.opendocument.image odi
-application/vnd.oasis.opendocument.image-template oti
-application/vnd.oasis.opendocument.formula odf
-application/vnd.oasis.opendocument.formula-template otf
+application/vnd.oasis.opendocument.text odt
application/vnd.oasis.opendocument.text-master odm
+application/vnd.oasis.opendocument.text-template ott
application/vnd.oasis.opendocument.text-web oth
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
index f2ec460e..d96cb09a 100644
--- a/includes/normal/RandomTest.php
+++ b/includes/normal/RandomTest.php
@@ -54,7 +54,7 @@ function donorm( $str ) {
# UnicodeString constructor fails if the string ends with a head byte.
# Add a junk char at the end, we'll strip it off
- return rtrim( utf8_normalize( $str . "\x01", UNORM_NFC ), "\x01" );
+ return rtrim( utf8_normalize( $str . "\x01", UtfNormal::UNORM_NFC ), "\x01" );
}
function wfMsg($x) {
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
index 919278c9..b5aad301 100644
--- a/includes/normal/UtfNormal.php
+++ b/includes/normal/UtfNormal.php
@@ -28,17 +28,6 @@
* @defgroup UtfNormal UtfNormal
*/
-/**
- * For using the ICU wrapper
- */
-define( 'UNORM_NONE', 1 );
-define( 'UNORM_NFD', 2 );
-define( 'UNORM_NFKD', 3 );
-define( 'UNORM_NFC', 4 );
-define( 'UNORM_DEFAULT', UNORM_NFC );
-define( 'UNORM_NFKC', 5 );
-define( 'UNORM_FCD', 6 );
-
define( 'NORMALIZE_ICU', function_exists( 'utf8_normalize' ) );
define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
@@ -57,6 +46,17 @@ define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
* @ingroup UtfNormal
*/
class UtfNormal {
+ /**
+ * For using the ICU wrapper
+ */
+ const UNORM_NONE = 1;
+ const UNORM_NFD = 2;
+ const UNORM_NFKD = 3;
+ const UNORM_NFC = 4;
+ const UNORM_NFKC = 5;
+ const UNORM_FCD = 6;
+ const UNORM_DEFAULT = self::UNORM_NFC;
+
static $utfCombiningClass = null;
static $utfCanonicalComp = null;
static $utfCanonicalDecomp = null;
@@ -82,7 +82,7 @@ class UtfNormal {
# UnicodeString constructor fails if the string ends with a
# head byte. Add a junk char at the end, we'll strip it off.
- return rtrim( utf8_normalize( $string . "\x01", UNORM_NFC ), "\x01" );
+ return rtrim( utf8_normalize( $string . "\x01", self::UNORM_NFC ), "\x01" );
} elseif( NORMALIZE_INTL ) {
$string = self::replaceForNativeNormalize( $string );
$norm = normalizer_normalize( $string, Normalizer::FORM_C );
@@ -121,7 +121,7 @@ class UtfNormal {
if( NORMALIZE_INTL )
return normalizer_normalize( $string, Normalizer::FORM_C );
elseif( NORMALIZE_ICU )
- return utf8_normalize( $string, UNORM_NFC );
+ return utf8_normalize( $string, self::UNORM_NFC );
elseif( UtfNormal::quickIsNFC( $string ) )
return $string;
else
@@ -139,7 +139,7 @@ class UtfNormal {
if( NORMALIZE_INTL )
return normalizer_normalize( $string, Normalizer::FORM_D );
elseif( NORMALIZE_ICU )
- return utf8_normalize( $string, UNORM_NFD );
+ return utf8_normalize( $string, self::UNORM_NFD );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
return UtfNormal::NFD( $string );
else
@@ -158,7 +158,7 @@ class UtfNormal {
if( NORMALIZE_INTL )
return normalizer_normalize( $string, Normalizer::FORM_KC );
elseif( NORMALIZE_ICU )
- return utf8_normalize( $string, UNORM_NFKC );
+ return utf8_normalize( $string, self::UNORM_NFKC );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
return UtfNormal::NFKC( $string );
else
@@ -177,7 +177,7 @@ class UtfNormal {
if( NORMALIZE_INTL )
return normalizer_normalize( $string, Normalizer::FORM_KD );
elseif( NORMALIZE_ICU )
- return utf8_normalize( $string, UNORM_NFKD );
+ return utf8_normalize( $string, self::UNORM_NFKD );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
return UtfNormal::NFKD( $string );
else
diff --git a/includes/objectcache/BagOStuff.php b/includes/objectcache/BagOStuff.php
index 97b6cb2c..81ad6621 100644
--- a/includes/objectcache/BagOStuff.php
+++ b/includes/objectcache/BagOStuff.php
@@ -92,11 +92,15 @@ abstract class BagOStuff {
}
/**
- * Delete all objects expiring before a certain date.
+ * Delete all objects expiring before a certain date.
+ * @param $date The reference date in MW format
+ * @param $progressCallback Optional, a function which will be called
+ * regularly during long-running operations with the percentage progress
+ * as the first parameter.
*
* @return true on success, false if unimplemented
*/
- public function deleteObjectsExpiringBefore( $date ) {
+ public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
// stub
return false;
}
diff --git a/includes/objectcache/DBABagOStuff.php b/includes/objectcache/DBABagOStuff.php
index a273a4f7..ade8c0a9 100644
--- a/includes/objectcache/DBABagOStuff.php
+++ b/includes/objectcache/DBABagOStuff.php
@@ -187,8 +187,10 @@ class DBABagOStuff extends BagOStuff {
$result[] = $k1;
- while ( $key = dba_nextkey( $reader ) ) {
+ $key = dba_nextkey( $reader );
+ while ( $key ) {
$result[] = $key;
+ $key = dba_nextkey( $reader );
}
return $result;
diff --git a/includes/objectcache/EmptyBagOStuff.php b/includes/objectcache/EmptyBagOStuff.php
index e956e2ee..2aee6b12 100644
--- a/includes/objectcache/EmptyBagOStuff.php
+++ b/includes/objectcache/EmptyBagOStuff.php
@@ -19,7 +19,7 @@ class EmptyBagOStuff extends BagOStuff {
}
}
-/**
+/**
* Backwards compatibility alias for EmptyBagOStuff
* @deprecated since 1.18
*/
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
index dd4401a8..868ad69f 100644
--- a/includes/objectcache/MemcachedClient.php
+++ b/includes/objectcache/MemcachedClient.php
@@ -396,7 +396,7 @@ class MWMemcached {
/**
* Retrieves the value associated with the key from the memcache server
*
- * @param $key Mixed: key to retrieve
+ * @param $key array|string key to retrieve
*
* @return Mixed
*/
@@ -419,6 +419,7 @@ class MWMemcached {
return false;
}
+ $key = is_array( $key ) ? $key[1] : $key;
if ( isset( $this->stats['get'] ) ) {
$this->stats['get']++;
} else {
@@ -826,9 +827,9 @@ class MWMemcached {
/**
* Perform increment/decriment on $key
*
- * @param $cmd String: command to perform
- * @param $key String: key to perform it on
- * @param $amt Integer: amount to adjust
+ * @param $cmd String command to perform
+ * @param $key String|array key to perform it on
+ * @param $amt Integer amount to adjust
*
* @return Integer: new value of $key
* @access private
@@ -958,10 +959,13 @@ class MWMemcached {
} else {
$this->stats[$cmd] = 1;
}
-
- // Memcached doesn't seem to handle very high TTL values very well,
- // so clamp them at 30 days
- if ( $exp > 2592000 ) {
+
+ // TTLs higher than 30 days will be detected as absolute TTLs
+ // (UNIX timestamps), and will result in the cache entry being
+ // discarded immediately because the expiry is in the past.
+ // Clamp expiries >30d at 30d, unless they're >=1e9 in which
+ // case they are likely to really be absolute (1e9 = 2011-09-09)
+ if ( $exp > 2592000 && $exp < 1000000000 ) {
$exp = 2592000;
}
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
index 2b88b427..0d95a846 100644
--- a/includes/objectcache/MultiWriteBagOStuff.php
+++ b/includes/objectcache/MultiWriteBagOStuff.php
@@ -101,10 +101,10 @@ class MultiWriteBagOStuff extends BagOStuff {
*
* Succeed if any of the child caches succeed.
*/
- public function deleteObjectsExpiringBefore( $date ) {
+ public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
$ret = false;
foreach ( $this->caches as $cache ) {
- if ( $cache->deleteObjectsExpiringBefore( $date ) ) {
+ if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
$ret = true;
}
}
diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php
index 99e38953..77ca8371 100644
--- a/includes/objectcache/ObjectCache.php
+++ b/includes/objectcache/ObjectCache.php
@@ -43,7 +43,7 @@ class ObjectCache {
global $wgObjectCaches;
if ( !isset( $wgObjectCaches[$id] ) ) {
- throw new MWException( "Invalid object cache type \"$id\" requested. " .
+ throw new MWException( "Invalid object cache type \"$id\" requested. " .
"It is not present in \$wgObjectCaches." );
}
@@ -89,9 +89,7 @@ class ObjectCache {
* @return ObjectCache
*/
static function newAccelerator( $params ) {
- if ( function_exists( 'eaccelerator_get' ) ) {
- $id = 'eaccelerator';
- } elseif ( function_exists( 'apc_fetch') ) {
+ if ( function_exists( 'apc_fetch') ) {
$id = 'apc';
} elseif( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
$id = 'xcache';
@@ -106,11 +104,11 @@ class ObjectCache {
/**
* Factory function that creates a memcached client object.
- * The idea of this is that it might eventually detect and automatically
+ * The idea of this is that it might eventually detect and automatically
* support the PECL extension, assuming someone can get it to compile.
*
* @param $params array
- *
+ *
* @return MemcachedPhpBagOStuff
*/
static function newMemcached( $params ) {
diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php
index 78817d0b..93d22f11 100644
--- a/includes/objectcache/SqlBagOStuff.php
+++ b/includes/objectcache/SqlBagOStuff.php
@@ -24,24 +24,24 @@ class SqlBagOStuff extends BagOStuff {
/**
* Constructor. Parameters are:
- * - server: A server info structure in the format required by each
+ * - server: A server info structure in the format required by each
* element in $wgDBServers.
*
- * - purgePeriod: The average number of object cache requests in between
- * garbage collection operations, where expired entries
- * are removed from the database. Or in other words, the
- * reciprocal of the probability of purging on any given
- * request. If this is set to zero, purging will never be
+ * - purgePeriod: The average number of object cache requests in between
+ * garbage collection operations, where expired entries
+ * are removed from the database. Or in other words, the
+ * reciprocal of the probability of purging on any given
+ * request. If this is set to zero, purging will never be
* done.
*
* - tableName: The table name to use, default is "objectcache".
*
- * - shards: The number of tables to use for data storage. If this is
- * more than 1, table names will be formed in the style
- * objectcacheNNN where NNN is the shard index, between 0 and
- * shards-1. The number of digits will be the minimum number
- * required to hold the largest shard index. Data will be
- * distributed across all tables by key hash. This is for
+ * - shards: The number of tables to use for data storage. If this is
+ * more than 1, table names will be formed in the style
+ * objectcacheNNN where NNN is the shard index, between 0 and
+ * shards-1. The number of digits will be the minimum number
+ * required to hold the largest shard index. Data will be
+ * distributed across all tables by key hash. This is for
* MySQL bugs 61735 and 61736.
*
* @param $params array
@@ -108,7 +108,7 @@ class SqlBagOStuff extends BagOStuff {
protected function getTableByShard( $index ) {
if ( $this->shards > 1 ) {
$decimals = strlen( $this->shards - 1 );
- return $this->tableName .
+ return $this->tableName .
sprintf( "%0{$decimals}d", $index );
} else {
return $this->tableName;
@@ -133,7 +133,7 @@ class SqlBagOStuff extends BagOStuff {
if ( $this->isExpired( $row->exptime ) ) {
$this->debug( "get: key has expired, deleting" );
try {
- $db->begin();
+ $db->begin( __METHOD__ );
# Put the expiry time in the WHERE condition to avoid deleting a
# newly-inserted value
$db->delete( $tableName,
@@ -141,7 +141,7 @@ class SqlBagOStuff extends BagOStuff {
'keyname' => $key,
'exptime' => $row->exptime
), __METHOD__ );
- $db->commit();
+ $db->commit( __METHOD__ );
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
}
@@ -170,18 +170,18 @@ class SqlBagOStuff extends BagOStuff {
$encExpiry = $db->timestamp( $exptime );
}
try {
- $db->begin();
+ $db->begin( __METHOD__ );
// (bug 24425) use a replace if the db supports it instead of
// delete/insert to avoid clashes with conflicting keynames
- $db->replace(
- $this->getTableByKey( $key ),
+ $db->replace(
+ $this->getTableByKey( $key ),
array( 'keyname' ),
array(
'keyname' => $key,
'value' => $db->encodeBlob( $this->serialize( $value ) ),
'exptime' => $encExpiry
), __METHOD__ );
- $db->commit();
+ $db->commit( __METHOD__ );
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
@@ -195,12 +195,12 @@ class SqlBagOStuff extends BagOStuff {
$db = $this->getDB();
try {
- $db->begin();
- $db->delete(
- $this->getTableByKey( $key ),
- array( 'keyname' => $key ),
+ $db->begin( __METHOD__ );
+ $db->delete(
+ $this->getTableByKey( $key ),
+ array( 'keyname' => $key ),
__METHOD__ );
- $db->commit();
+ $db->commit( __METHOD__ );
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
@@ -216,23 +216,23 @@ class SqlBagOStuff extends BagOStuff {
$step = intval( $step );
try {
- $db->begin();
- $row = $db->selectRow(
- $tableName,
+ $db->begin( __METHOD__ );
+ $row = $db->selectRow(
+ $tableName,
array( 'value', 'exptime' ),
- array( 'keyname' => $key ),
- __METHOD__,
+ array( 'keyname' => $key ),
+ __METHOD__,
array( 'FOR UPDATE' ) );
if ( $row === false ) {
// Missing
- $db->commit();
+ $db->commit( __METHOD__ );
return null;
}
$db->delete( $tableName, array( 'keyname' => $key ), __METHOD__ );
if ( $this->isExpired( $row->exptime ) ) {
// Expired, do not reinsert
- $db->commit();
+ $db->commit( __METHOD__ );
return null;
}
@@ -245,12 +245,12 @@ class SqlBagOStuff extends BagOStuff {
'value' => $db->encodeBlob( $this->serialize( $newValue ) ),
'exptime' => $row->exptime
), __METHOD__, 'IGNORE' );
-
+
if ( $db->affectedRows() == 0 ) {
// Race condition. See bug 28611
$newValue = null;
}
- $db->commit();
+ $db->commit( __METHOD__ );
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
@@ -265,7 +265,7 @@ class SqlBagOStuff extends BagOStuff {
$result = array();
for ( $i = 0; $i < $this->shards; $i++ ) {
- $res = $db->select( $this->getTableByShard( $i ),
+ $res = $db->select( $this->getTableByShard( $i ),
array( 'keyname' ), false, __METHOD__ );
foreach ( $res as $row ) {
$result[] = $row->keyname;
@@ -311,18 +311,67 @@ class SqlBagOStuff extends BagOStuff {
/**
* Delete objects from the database which expire before a certain date.
*/
- public function deleteObjectsExpiringBefore( $timestamp ) {
+ public function deleteObjectsExpiringBefore( $timestamp, $progressCallback = false ) {
$db = $this->getDB();
$dbTimestamp = $db->timestamp( $timestamp );
+ $totalSeconds = false;
+ $baseConds = array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) );
try {
for ( $i = 0; $i < $this->shards; $i++ ) {
- $db->begin();
- $db->delete(
- $this->getTableByShard( $i ),
- array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) ),
- __METHOD__ );
- $db->commit();
+ $maxExpTime = false;
+ while ( true ) {
+ $conds = $baseConds;
+ if ( $maxExpTime !== false ) {
+ $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime );
+ }
+ $rows = $db->select(
+ $this->getTableByShard( $i ),
+ array( 'keyname', 'exptime' ),
+ $conds,
+ __METHOD__,
+ array( 'LIMIT' => 100, 'ORDER BY' => 'exptime' ) );
+ if ( !$rows->numRows() ) {
+ break;
+ }
+ $keys = array();
+ $row = $rows->current();
+ $minExpTime = $row->exptime;
+ if ( $totalSeconds === false ) {
+ $totalSeconds = wfTimestamp( TS_UNIX, $timestamp )
+ - wfTimestamp( TS_UNIX, $minExpTime );
+ }
+ foreach ( $rows as $row ) {
+ $keys[] = $row->keyname;
+ $maxExpTime = $row->exptime;
+ }
+
+ $db->begin( __METHOD__ );
+ $db->delete(
+ $this->getTableByShard( $i ),
+ array(
+ 'exptime >= ' . $db->addQuotes( $minExpTime ),
+ 'exptime < ' . $db->addQuotes( $dbTimestamp ),
+ 'keyname' => $keys
+ ),
+ __METHOD__ );
+ $db->commit( __METHOD__ );
+
+ if ( $progressCallback ) {
+ if ( intval( $totalSeconds ) === 0 ) {
+ $percent = 0;
+ } else {
+ $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp )
+ - wfTimestamp( TS_UNIX, $maxExpTime );
+ if ( $remainingSeconds > $totalSeconds ) {
+ $totalSeconds = $remainingSeconds;
+ }
+ $percent = ( $i + $remainingSeconds / $totalSeconds )
+ / $this->shards * 100;
+ }
+ call_user_func( $progressCallback, $percent );
+ }
+ }
}
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
@@ -335,9 +384,9 @@ class SqlBagOStuff extends BagOStuff {
try {
for ( $i = 0; $i < $this->shards; $i++ ) {
- $db->begin();
+ $db->begin( __METHOD__ );
$db->delete( $this->getTableByShard( $i ), '*', __METHOD__ );
- $db->commit();
+ $db->commit( __METHOD__ );
}
} catch ( DBQueryError $e ) {
$this->handleWriteError( $e );
@@ -415,12 +464,12 @@ class SqlBagOStuff extends BagOStuff {
}
for ( $i = 0; $i < $this->shards; $i++ ) {
- $db->begin();
+ $db->begin( __METHOD__ );
$db->query(
'CREATE TABLE ' . $db->tableName( $this->getTableByShard( $i ) ) .
' LIKE ' . $db->tableName( 'objectcache' ),
__METHOD__ );
- $db->commit();
+ $db->commit( __METHOD__ );
}
}
}
diff --git a/includes/objectcache/eAccelBagOStuff.php b/includes/objectcache/eAccelBagOStuff.php
deleted file mode 100644
index 30d24e80..00000000
--- a/includes/objectcache/eAccelBagOStuff.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/**
- * This is a wrapper for eAccelerator's shared memory functions.
- *
- * This is basically identical to the deceased Turck MMCache version,
- * mostly because eAccelerator is based on Turck MMCache.
- *
- * @ingroup Cache
- */
-class eAccelBagOStuff extends BagOStuff {
- public function get( $key ) {
- $val = eaccelerator_get( $key );
-
- if ( is_string( $val ) ) {
- $val = unserialize( $val );
- }
-
- return $val;
- }
-
- public function set( $key, $value, $exptime = 0 ) {
- eaccelerator_put( $key, serialize( $value ), $exptime );
-
- return true;
- }
-
- public function delete( $key, $time = 0 ) {
- eaccelerator_rm( $key );
-
- return true;
- }
-
- public function lock( $key, $waitTimeout = 0 ) {
- eaccelerator_lock( $key );
-
- return true;
- }
-
- public function unlock( $key ) {
- eaccelerator_unlock( $key );
-
- return true;
- }
-}
-
diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php
index 5dffd978..0e5702b7 100644
--- a/includes/parser/CoreParserFunctions.php
+++ b/includes/parser/CoreParserFunctions.php
@@ -97,7 +97,7 @@ class CoreParserFunctions {
static function intFunction( $parser, $part1 = '' /*, ... */ ) {
if ( strval( $part1 ) !== '' ) {
$args = array_slice( func_get_args(), 2 );
- $message = wfMessage( $part1, $args )->inLanguage( $parser->getOptions()->getUserLang() )->plain();
+ $message = wfMessage( $part1, $args )->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
return array( $message, 'noparse' => false );
} else {
return array( 'found' => false );
@@ -279,7 +279,14 @@ class CoreParserFunctions {
*/
static function gender( $parser, $username ) {
wfProfileIn( __METHOD__ );
- $forms = array_slice( func_get_args(), 2);
+ $forms = array_slice( func_get_args(), 2 );
+
+ // Some shortcuts to avoid loading user data unnecessarily
+ if ( count( $forms ) === 0 ) {
+ return '';
+ } elseif ( count( $forms ) === 1 ) {
+ return $forms[0];
+ }
$username = trim( $username );
@@ -564,7 +571,11 @@ class CoreParserFunctions {
* 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
* run one query for each call?
+ * @todo Document parameters
+ *
* @param $parser Parser
+ * @param $page String TODO DOCUMENT (Default: empty string)
+ * @param $raw TODO DOCUMENT (Default: null)
*/
static function pagesize( $parser, $page = '', $raw = null ) {
static $cache = array();
@@ -625,7 +636,7 @@ class CoreParserFunctions {
/**
* Unicode-safe str_pad with the restriction that $length is forced to be <= 500
- */
+ */
static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
$padding = $parser->killMarkers( $padding );
$lengthOfPadding = mb_strlen( $padding );
@@ -680,23 +691,36 @@ class CoreParserFunctions {
/**
* @param $parser Parser
- * @param $text
+ * @param $text String The sortkey to use
+ * @param $uarg String Either "noreplace" or "noerror" (in en)
+ * both suppress errors, and noreplace does nothing if
+ * a default sortkey already exists.
* @return string
*/
- public static function defaultsort( $parser, $text ) {
+ public static function defaultsort( $parser, $text, $uarg = '' ) {
+ static $magicWords = null;
+ if ( is_null( $magicWords ) ) {
+ $magicWords = new MagicWordArray( array( 'defaultsort_noerror', 'defaultsort_noreplace' ) );
+ }
+ $arg = $magicWords->matchStartToEnd( $uarg );
+
$text = trim( $text );
if( strlen( $text ) == 0 )
return '';
$old = $parser->getCustomDefaultSort();
- $parser->setDefaultSort( $text );
- if( $old === false || $old == $text )
+ if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
+ $parser->setDefaultSort( $text );
+ }
+
+ if( $old === false || $old == $text || $arg ) {
return '';
- else
+ } else {
return( '<span class="error">' .
wfMsgForContent( 'duplicate-defaultsort',
htmlspecialchars( $old ),
htmlspecialchars( $text ) ) .
'</span>' );
+ }
}
// Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}}
@@ -724,7 +748,7 @@ class CoreParserFunctions {
if ( $file ) {
$url = $file->getFullUrl();
- // If a size is requested...
+ // If a size is requested...
if ( is_integer( $size ) ) {
$mto = $file->transform( array( 'width' => $size ) );
// ... and we can
diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php
index 5418b6e5..fb013047 100644
--- a/includes/parser/LinkHolderArray.php
+++ b/includes/parser/LinkHolderArray.php
@@ -320,7 +320,7 @@ class LinkHolderArray {
foreach ( $res as $s ) {
$title = Title::makeTitle( $s->page_namespace, $s->page_title );
$pdbk = $title->getPrefixedDBkey();
- $linkCache->addGoodLinkObj( $s->page_id, $title, $s->page_len, $s->page_is_redirect, $s->page_latest );
+ $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
@@ -490,7 +490,7 @@ class LinkHolderArray {
// construct query
$dbr = wfGetDB( DB_SLAVE );
$varRes = $dbr->select( 'page',
- array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len' ),
+ array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
$linkBatch->constructSet( 'page', $dbr ),
__METHOD__
);
@@ -507,7 +507,7 @@ class LinkHolderArray {
$holderKeys = array();
if( isset( $variantMap[$varPdbk] ) ) {
$holderKeys = $variantMap[$varPdbk];
- $linkCache->addGoodLinkObj( $s->page_id, $variantTitle, $s->page_len, $s->page_is_redirect );
+ $linkCache->addGoodLinkObjFromRow( $variantTitle, $s );
$output->addLink( $variantTitle, $s->page_id );
}
diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index 939d9e3f..2abf1b93 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -32,9 +32,9 @@
* Removes <noinclude> sections, and <includeonly> tags.
*
* Globals used:
- * objects: $wgLang, $wgContLang
+ * object: $wgContLang
*
- * NOT $wgUser or $wgTitle. Keep them away!
+ * NOT $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away!
*
* settings:
* $wgUseDynamicDates*, $wgInterwikiMagic*,
@@ -68,9 +68,11 @@ class Parser {
# 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';
+ # \p{Zs} is unicode 'separator, space' category. It covers the space 0x20
+ # as well as U+3000 is IDEOGRAPHIC SPACE for bug 19052
+ const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
+ const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
+ \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
# State constants for the definition list colon extraction
const COLON_STATE_TEXT = 0;
@@ -146,6 +148,7 @@ class Parser {
var $mTplExpandCache; # empty-frame expansion cache
var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
var $mExpensiveFunctionCount; # number of expensive parser function calls
+ var $mShowToc, $mForceTocPosition;
/**
* @var User
@@ -179,12 +182,14 @@ class Parser {
/**
* Constructor
+ *
+ * @param $conf array
*/
public function __construct( $conf = array() ) {
$this->mConf = $conf;
$this->mUrlProtocols = wfUrlProtocols();
$this->mExtLinkBracketedRegex = '/\[((' . wfUrlProtocols() . ')'.
- '[^][<>"\\x00-\\x20\\x7F]+) *([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/S';
+ self::EXT_LINK_URL_CLASS.'+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
if ( isset( $conf['preprocessorClass'] ) ) {
$this->mPreprocessorClass = $conf['preprocessorClass'];
} elseif ( defined( 'MW_COMPILED' ) ) {
@@ -316,7 +321,7 @@ class Parser {
* to internalParse() which does all the real work.
*/
- global $wgUseTidy, $wgAlwaysUseTidy, $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion;
+ global $wgUseTidy, $wgAlwaysUseTidy, $wgDisableLangConversion, $wgDisableTitleConversion;
$fname = __METHOD__.'-' . wfGetCaller();
wfProfileIn( __METHOD__ );
wfProfileIn( $fname );
@@ -345,7 +350,7 @@ class Parser {
$fixtags = array(
# french spaces, last one Guillemet-left
# only if there is something before the space
- '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;\\2',
+ '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;',
# french spaces, Guillemet-right
'/(\\302\\253) /' => '\\1&#160;',
'/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
@@ -357,20 +362,24 @@ class Parser {
$this->replaceLinkHolders( $text );
/**
- * The page doesn't get language converted if
+ * The input doesn't get language converted if
* a) It's disabled
* b) Content isn't converted
* c) It's a conversion table
+ * d) it is an interface message (which is in the user language)
*/
if ( !( $wgDisableLangConversion
|| isset( $this->mDoubleUnderscores['nocontentconvert'] )
- || $this->mTitle->isConversionTable() ) ) {
-
- # The position of the convert() call should not be changed. it
- # assumes that the links are all replaced and the only thing left
- # is the <nowiki> mark.
-
- $text = $wgContLang->convert( $text );
+ || $this->mTitle->isConversionTable() ) )
+ {
+ # Run convert unconditionally in 1.18-compatible mode
+ global $wgBug34832TransitionalRollback;
+ if ( $wgBug34832TransitionalRollback || !$this->mOptions->getInterfaceMessage() ) {
+ # The position of the convert() call should not be changed. it
+ # assumes that the links are all replaced and the only thing left
+ # is the <nowiki> mark.
+ $text = $this->getConverterLanguage()->convert( $text );
+ }
}
/**
@@ -386,11 +395,11 @@ class Parser {
|| isset( $this->mDoubleUnderscores['notitleconvert'] )
|| $this->mOutput->getDisplayTitle() !== false ) )
{
- $convruletitle = $wgContLang->getConvRuleTitle();
+ $convruletitle = $this->getConverterLanguage()->getConvRuleTitle();
if ( $convruletitle ) {
$this->mOutput->setTitleText( $convruletitle );
} else {
- $titleText = $wgContLang->convertTitle( $title );
+ $titleText = $this->getConverterLanguage()->convertTitle( $title );
$this->mOutput->setTitleText( $titleText );
}
}
@@ -504,10 +513,32 @@ class Parser {
}
/**
+ * Recursive parser entry point that can be called from an extension tag
+ * hook.
+ *
+ * @param $text String: text to be expanded
+ * @param $frame PPFrame: The frame to use for expanding any template variables
+ * @return String
+ * @since 1.19
+ */
+ public function recursivePreprocess( $text, $frame = false ) {
+ wfProfileIn( __METHOD__ );
+ $text = $this->replaceVariables( $text, $frame );
+ $text = $this->mStripState->unstripBoth( $text );
+ wfProfileOut( __METHOD__ );
+ return $text;
+ }
+
+ /**
* Process the wikitext for the ?preload= feature. (bug 5210)
*
* <noinclude>, <includeonly> etc. are parsed as for template transclusion,
* comments, templates, arguments, tags hooks and parser functions are untouched.
+ *
+ * @param $text String
+ * @param $title Title
+ * @param $options ParserOptions
+ * @return String
*/
public function getPreloadText( $text, Title $title, ParserOptions $options ) {
# Parser (re)initialisation
@@ -664,15 +695,23 @@ class Parser {
}
/**
+ * Get a language object for use in parser functions such as {{FORMATNUM:}}
* @return Language
*/
function getFunctionLang() {
+ return $this->getTargetLanguage();
+ }
+
+ /**
+ * Get the target language for the content being parsed. This is usually the
+ * language that the content is in.
+ */
+ function getTargetLanguage() {
$target = $this->mOptions->getTargetLanguage();
if ( $target !== null ) {
return $target;
} elseif( $this->mOptions->getInterfaceMessage() ) {
- global $wgLang;
- return $wgLang;
+ return $this->mOptions->getUserLangObj();
} elseif( is_null( $this->mTitle ) ) {
throw new MWException( __METHOD__.': $this->mTitle is null' );
}
@@ -680,6 +719,18 @@ class Parser {
}
/**
+ * Get the language object for language conversion
+ */
+ function getConverterLanguage() {
+ global $wgBug34832TransitionalRollback, $wgContLang;
+ if ( $wgBug34832TransitionalRollback ) {
+ return $wgContLang;
+ } else {
+ return $this->getTargetLanguage();
+ }
+ }
+
+ /**
* Get a User object either from $this->mUser, if set, or from the
* ParserOptions object otherwise
*
@@ -797,6 +848,10 @@ class Parser {
* Add an item to the strip state
* Returns the unique tag which must be inserted into the stripped text
* The tag will be replaced with the original text in unstrip()
+ *
+ * @param $text string
+ *
+ * @return string
*/
function insertStripItem( $text ) {
$rnd = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}-" . self::MARKER_SUFFIX;
@@ -1005,8 +1060,14 @@ class Parser {
* HTML. Only called for $mOutputType == self::OT_HTML.
*
* @private
+ *
+ * @param $text string
+ * @param $isMain bool
+ * @param $frame bool
+ *
+ * @return string
*/
- function internalParse( $text, $isMain = true, $frame=false ) {
+ function internalParse( $text, $isMain = true, $frame = false ) {
wfProfileIn( __METHOD__ );
$origText = $text;
@@ -1072,6 +1133,10 @@ class Parser {
*
* DML
* @private
+ *
+ * @param $text string
+ *
+ * @return string
*/
function doMagicLinks( $text ) {
wfProfileIn( __METHOD__ );
@@ -1088,7 +1153,7 @@ class Parser {
(?: [0-9] [\ \-]? ){9} # 9 digits with opt. delimiters
[0-9Xx] # check digit
\b)
- )!x', array( &$this, 'magicLinkCallback' ), $text );
+ )!xu', array( &$this, 'magicLinkCallback' ), $text );
wfProfileOut( __METHOD__ );
return $text;
}
@@ -1136,7 +1201,7 @@ class Parser {
));
$titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
return'<a href="' .
- $titleObj->escapeLocalUrl() .
+ htmlspecialchars( $titleObj->getLocalUrl() ) .
"\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
} else {
return $m[0];
@@ -1145,11 +1210,13 @@ class Parser {
/**
* Make a free external link, given a user-supplied URL
- * @return HTML
+ *
+ * @param $url string
+ *
+ * @return string HTML
* @private
*/
function makeFreeExternalLink( $url ) {
- global $wgContLang;
wfProfileIn( __METHOD__ );
$trail = '';
@@ -1182,7 +1249,8 @@ class Parser {
$text = $this->maybeMakeExternalImage( $url );
if ( $text === false ) {
# Not an image, make a link
- $text = Linker::makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free',
+ $text = Linker::makeExternalLink( $url,
+ $this->getConverterLanguage()->markNoConversion($url), true, 'free',
$this->getExternalLinkAttribs( $url ) );
# Register it in the output object...
# Replace unnecessary URL escape codes with their equivalent characters
@@ -1198,6 +1266,10 @@ class Parser {
* Parse headers and return html
*
* @private
+ *
+ * @param $text string
+ *
+ * @return string
*/
function doHeadings( $text ) {
wfProfileIn( __METHOD__ );
@@ -1213,6 +1285,9 @@ class Parser {
/**
* Replace single quotes with HTML markup
* @private
+ *
+ * @param $text string
+ *
* @return string the altered text
*/
function doAllQuotes( $text ) {
@@ -1229,6 +1304,10 @@ class Parser {
/**
* Helper function for doAllQuotes()
+ *
+ * @param $text string
+ *
+ * @return string
*/
public function doQuotes( $text ) {
$arr = preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
@@ -1393,9 +1472,12 @@ class Parser {
* Make sure to run maintenance/parserTests.php if you change this code.
*
* @private
+ *
+ * @param $text string
+ *
+ * @return string
*/
function replaceExternalLinks( $text ) {
- global $wgContLang;
wfProfileIn( __METHOD__ );
$bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
@@ -1432,7 +1514,7 @@ class Parser {
# No link text, e.g. [http://domain.tld/some.link]
if ( $text == '' ) {
# Autonumber
- $langObj = $this->getFunctionLang();
+ $langObj = $this->getTargetLanguage();
$text = '[' . $langObj->formatNum( ++$this->mAutonumber ) . ']';
$linktype = 'autonumber';
} else {
@@ -1441,7 +1523,7 @@ class Parser {
list( $dtrail, $trail ) = Linker::splitTrail( $trail );
}
- $text = $wgContLang->markNoConversion( $text );
+ $text = $this->getConverterLanguage()->markNoConversion( $text );
$url = Sanitizer::cleanUrl( $url );
@@ -1469,9 +1551,9 @@ class Parser {
* (depending on configuration, namespace, and the URL's domain) and/or a
* target attribute (depending on configuration).
*
- * @param $url String: optional URL, to extract the domain from for rel =>
+ * @param $url String|bool optional URL, to extract the domain from for rel =>
* nofollow if appropriate
- * @return Array: associative array of HTML attributes
+ * @return Array associative array of HTML attributes
*/
function getExternalLinkAttribs( $url = false ) {
$attribs = array();
@@ -1507,6 +1589,10 @@ class Parser {
/**
* Callback function used in replaceUnusualEscapes().
* Replaces unusual URL escape codes with their equivalent character
+ *
+ * @param $matches array
+ *
+ * @return string
*/
private static function replaceUnusualEscapesCallback( $matches ) {
$char = urldecode( $matches[0] );
@@ -1525,6 +1611,10 @@ class Parser {
* make an image if it's allowed, either through the global
* option, through the exception, or through the on-wiki whitelist
* @private
+ *
+ * $param $url string
+ *
+ * @return string
*/
function maybeMakeExternalImage( $url ) {
$imagesfrom = $this->mOptions->getAllowExternalImagesFrom();
@@ -1571,6 +1661,9 @@ class Parser {
/**
* Process [[ ]] wikilinks
+ *
+ * @param $s string
+ *
* @return String: processed text
*
* @private
@@ -1587,8 +1680,6 @@ class Parser {
* @private
*/
function replaceInternalLinks2( &$s ) {
- global $wgContLang;
-
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__.'-setup' );
@@ -1612,7 +1703,7 @@ class Parser {
$line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void"
$s = substr( $s, 1 );
- $useLinkPrefixExtension = $wgContLang->linkPrefixExtension();
+ $useLinkPrefixExtension = $this->getTargetLanguage()->linkPrefixExtension();
$e2 = null;
if ( $useLinkPrefixExtension ) {
# Match the end of a line for a word that's not followed by whitespace,
@@ -1638,8 +1729,9 @@ class Parser {
$prefix = '';
}
- if ( $wgContLang->hasVariants() ) {
- $selflink = $wgContLang->autoConvertToAllVariants( $this->mTitle->getPrefixedText() );
+ if ( $this->getConverterLanguage()->hasVariants() ) {
+ $selflink = $this->getConverterLanguage()->autoConvertToAllVariants(
+ $this->mTitle->getPrefixedText() );
} else {
$selflink = array( $this->mTitle->getPrefixedText() );
}
@@ -1807,6 +1899,7 @@ class Parser {
# Link not escaped by : , create the various objects
if ( $noforce ) {
+ global $wgContLang;
# Interwikis
wfProfileIn( __METHOD__."-interwiki" );
@@ -1856,7 +1949,7 @@ class Parser {
}
$sortkey = Sanitizer::decodeCharReferences( $sortkey );
$sortkey = str_replace( "\n", '', $sortkey );
- $sortkey = $wgContLang->convertCategoryKey( $sortkey );
+ $sortkey = $this->getConverterLanguage()->convertCategoryKey( $sortkey );
$this->mOutput->addCategory( $nt->getDBkey(), $sortkey );
/**
@@ -1883,11 +1976,12 @@ class Parser {
if ( $ns == NS_MEDIA ) {
wfProfileIn( __METHOD__."-media" );
# Give extensions a chance to select the file revision for us
- $time = $sha1 = $descQuery = false;
+ $options = array();
+ $descQuery = false;
wfRunHooks( 'BeforeParserFetchFileAndTitle',
- array( $this, $nt, &$time, &$sha1, &$descQuery ) );
+ array( $this, $nt, &$options, &$descQuery ) );
# Fetch and register the file (file title may be different via hooks)
- list( $file, $nt ) = $this->fetchFileAndTitle( $nt, $time, $sha1 );
+ list( $file, $nt ) = $this->fetchFileAndTitle( $nt, $options );
# Cloak with NOPARSE to avoid replacement in replaceExternalLinks
$s .= $prefix . $this->armorLinks(
Linker::makeMediaLinkFile( $nt, $file, $text ) ) . $trail;
@@ -1999,6 +2093,11 @@ class Parser {
* getCommon() returns the length of the longest common substring
* of both arguments, starting at the beginning of both.
* @private
+ *
+ * @param $st1 string
+ * @param $st2 string
+ *
+ * @return int
*/
function getCommon( $st1, $st2 ) {
$fl = strlen( $st1 );
@@ -2020,6 +2119,8 @@ class Parser {
* element appropriate to the prefix character passed into them.
* @private
*
+ * @param $char char
+ *
* @return string
*/
function openList( $char ) {
@@ -2283,10 +2384,10 @@ class Parser {
* Split up a string on ':', ignoring any occurences inside tags
* to prevent illegal overlapping.
*
- * @param $str String: the string to split
- * @param &$before String: set to everything before the ':'
- * @param &$after String: set to everything after the ':'
- * return String: the position of the ':', or false if none found
+ * @param $str String the string to split
+ * @param &$before String set to everything before the ':'
+ * @param &$after String set to everything after the ':'
+ * @return String the position of the ':', or false if none found
*/
function findColonNoLinks( $str, &$before, &$after ) {
wfProfileIn( __METHOD__ );
@@ -2451,11 +2552,22 @@ class Parser {
*
* @param $index integer
* @param $frame PPFrame
+ *
+ * @return string
*/
- function getVariableValue( $index, $frame=false ) {
+ function getVariableValue( $index, $frame = false ) {
global $wgContLang, $wgSitename, $wgServer;
global $wgArticlePath, $wgScriptPath, $wgStylePath;
+ if ( is_null( $this->mTitle ) ) {
+ // If no title set, bad things are going to happen
+ // later. Title should always be set since this
+ // should only be called in the middle of a parse
+ // operation (but the unit-tests do funky stuff)
+ throw new MWException( __METHOD__ . ' Should only be '
+ . ' called while parsing (no title set)' );
+ }
+
/**
* Some of these require message or data lookups and can be
* expensive to check many times.
@@ -2490,48 +2602,50 @@ class Parser {
date_default_timezone_set( $oldtz );
}
+ $pageLang = $this->getFunctionLang();
+
switch ( $index ) {
case 'currentmonth':
- $value = $wgContLang->formatNum( gmdate( 'm', $ts ) );
+ $value = $pageLang->formatNum( gmdate( 'm', $ts ) );
break;
case 'currentmonth1':
- $value = $wgContLang->formatNum( gmdate( 'n', $ts ) );
+ $value = $pageLang->formatNum( gmdate( 'n', $ts ) );
break;
case 'currentmonthname':
- $value = $wgContLang->getMonthName( gmdate( 'n', $ts ) );
+ $value = $pageLang->getMonthName( gmdate( 'n', $ts ) );
break;
case 'currentmonthnamegen':
- $value = $wgContLang->getMonthNameGen( gmdate( 'n', $ts ) );
+ $value = $pageLang->getMonthNameGen( gmdate( 'n', $ts ) );
break;
case 'currentmonthabbrev':
- $value = $wgContLang->getMonthAbbreviation( gmdate( 'n', $ts ) );
+ $value = $pageLang->getMonthAbbreviation( gmdate( 'n', $ts ) );
break;
case 'currentday':
- $value = $wgContLang->formatNum( gmdate( 'j', $ts ) );
+ $value = $pageLang->formatNum( gmdate( 'j', $ts ) );
break;
case 'currentday2':
- $value = $wgContLang->formatNum( gmdate( 'd', $ts ) );
+ $value = $pageLang->formatNum( gmdate( 'd', $ts ) );
break;
case 'localmonth':
- $value = $wgContLang->formatNum( $localMonth );
+ $value = $pageLang->formatNum( $localMonth );
break;
case 'localmonth1':
- $value = $wgContLang->formatNum( $localMonth1 );
+ $value = $pageLang->formatNum( $localMonth1 );
break;
case 'localmonthname':
- $value = $wgContLang->getMonthName( $localMonthName );
+ $value = $pageLang->getMonthName( $localMonthName );
break;
case 'localmonthnamegen':
- $value = $wgContLang->getMonthNameGen( $localMonthName );
+ $value = $pageLang->getMonthNameGen( $localMonthName );
break;
case 'localmonthabbrev':
- $value = $wgContLang->getMonthAbbreviation( $localMonthName );
+ $value = $pageLang->getMonthAbbreviation( $localMonthName );
break;
case 'localday':
- $value = $wgContLang->formatNum( $localDay );
+ $value = $pageLang->formatNum( $localDay );
break;
case 'localday2':
- $value = $wgContLang->formatNum( $localDay2 );
+ $value = $pageLang->formatNum( $localDay2 );
break;
case 'pagename':
$value = wfEscapeWikiText( $this->mTitle->getText() );
@@ -2656,68 +2770,68 @@ class Parser {
$value = ( wfUrlencode( $this->mTitle->getSubjectNsText() ) );
break;
case 'currentdayname':
- $value = $wgContLang->getWeekdayName( gmdate( 'w', $ts ) + 1 );
+ $value = $pageLang->getWeekdayName( gmdate( 'w', $ts ) + 1 );
break;
case 'currentyear':
- $value = $wgContLang->formatNum( gmdate( 'Y', $ts ), true );
+ $value = $pageLang->formatNum( gmdate( 'Y', $ts ), true );
break;
case 'currenttime':
- $value = $wgContLang->time( wfTimestamp( TS_MW, $ts ), false, false );
+ $value = $pageLang->time( wfTimestamp( TS_MW, $ts ), false, false );
break;
case 'currenthour':
- $value = $wgContLang->formatNum( gmdate( 'H', $ts ), true );
+ $value = $pageLang->formatNum( gmdate( 'H', $ts ), true );
break;
case 'currentweek':
# @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
# int to remove the padding
- $value = $wgContLang->formatNum( (int)gmdate( 'W', $ts ) );
+ $value = $pageLang->formatNum( (int)gmdate( 'W', $ts ) );
break;
case 'currentdow':
- $value = $wgContLang->formatNum( gmdate( 'w', $ts ) );
+ $value = $pageLang->formatNum( gmdate( 'w', $ts ) );
break;
case 'localdayname':
- $value = $wgContLang->getWeekdayName( $localDayOfWeek + 1 );
+ $value = $pageLang->getWeekdayName( $localDayOfWeek + 1 );
break;
case 'localyear':
- $value = $wgContLang->formatNum( $localYear, true );
+ $value = $pageLang->formatNum( $localYear, true );
break;
case 'localtime':
- $value = $wgContLang->time( $localTimestamp, false, false );
+ $value = $pageLang->time( $localTimestamp, false, false );
break;
case 'localhour':
- $value = $wgContLang->formatNum( $localHour, true );
+ $value = $pageLang->formatNum( $localHour, true );
break;
case 'localweek':
# @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
# int to remove the padding
- $value = $wgContLang->formatNum( (int)$localWeek );
+ $value = $pageLang->formatNum( (int)$localWeek );
break;
case 'localdow':
- $value = $wgContLang->formatNum( $localDayOfWeek );
+ $value = $pageLang->formatNum( $localDayOfWeek );
break;
case 'numberofarticles':
- $value = $wgContLang->formatNum( SiteStats::articles() );
+ $value = $pageLang->formatNum( SiteStats::articles() );
break;
case 'numberoffiles':
- $value = $wgContLang->formatNum( SiteStats::images() );
+ $value = $pageLang->formatNum( SiteStats::images() );
break;
case 'numberofusers':
- $value = $wgContLang->formatNum( SiteStats::users() );
+ $value = $pageLang->formatNum( SiteStats::users() );
break;
case 'numberofactiveusers':
- $value = $wgContLang->formatNum( SiteStats::activeUsers() );
+ $value = $pageLang->formatNum( SiteStats::activeUsers() );
break;
case 'numberofpages':
- $value = $wgContLang->formatNum( SiteStats::pages() );
+ $value = $pageLang->formatNum( SiteStats::pages() );
break;
case 'numberofadmins':
- $value = $wgContLang->formatNum( SiteStats::numberingroup( 'sysop' ) );
+ $value = $pageLang->formatNum( SiteStats::numberingroup( 'sysop' ) );
break;
case 'numberofedits':
- $value = $wgContLang->formatNum( SiteStats::edits() );
+ $value = $pageLang->formatNum( SiteStats::edits() );
break;
case 'numberofviews':
- $value = $wgContLang->formatNum( SiteStats::views() );
+ $value = $pageLang->formatNum( SiteStats::views() );
break;
case 'currenttimestamp':
$value = wfTimestamp( TS_MW, $ts );
@@ -2742,7 +2856,7 @@ class Parser {
case 'stylepath':
return $wgStylePath;
case 'directionmark':
- return $wgContLang->getDirMark();
+ return $pageLang->getDirMark();
case 'contentlanguage':
global $wgLanguageCode;
return $wgLanguageCode;
@@ -2755,8 +2869,9 @@ class Parser {
}
}
- if ( $index )
+ if ( $index ) {
$this->mVarCache[$index] = $value;
+ }
return $value;
}
@@ -2808,6 +2923,8 @@ class Parser {
/**
* Return a three-element array: leading whitespace, string contents, trailing whitespace
*
+ * @param $s string
+ *
* @return array
*/
public static function splitWhitespace( $s ) {
@@ -2833,11 +2950,11 @@ class Parser {
* self::OT_PREPROCESS: templates but not extension tags
* self::OT_HTML: all templates and extension tags
*
- * @param $text String: the text to transform
+ * @param $text String the text to transform
* @param $frame PPFrame Object describing the arguments passed to the template.
* Arguments may also be provided as an associative array, as was the usual case before MW1.12.
* Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
- * @param $argsOnly Boolean: only do argument (triple-brace) expansion, not double-brace expansion
+ * @param $argsOnly Boolean only do argument (triple-brace) expansion, not double-brace expansion
* @private
*
* @return string
@@ -2867,6 +2984,8 @@ class Parser {
/**
* Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
*
+ * @param $args array
+ *
* @return array
*/
static function createAssocArgs( $args ) {
@@ -2929,7 +3048,7 @@ class Parser {
* @private
*/
function braceSubstitution( $piece, $frame ) {
- global $wgContLang, $wgNonincludableNamespaces;
+ global $wgNonincludableNamespaces, $wgContLang;
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__.'-setup' );
@@ -2957,7 +3076,8 @@ class Parser {
# @todo FIXME: If piece['parts'] is null then the call to getLength() below won't work b/c this $args isn't an object
$args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
wfProfileOut( __METHOD__.'-setup' );
- wfProfileIn( __METHOD__."-title-$originalTitle" );
+
+ $titleProfileIn = null; // profile templates
# SUBST
wfProfileIn( __METHOD__.'-modifiers' );
@@ -3039,6 +3159,7 @@ class Parser {
}
}
if ( $function ) {
+ wfProfileIn( __METHOD__ . '-pfunc-' . $function );
list( $callback, $flags ) = $this->mFunctionHooks[$function];
$initialArgs = array( &$this );
$funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
@@ -3060,6 +3181,7 @@ class Parser {
# Workaround for PHP bug 35229 and similar
if ( !is_callable( $callback ) ) {
+ wfProfileOut( __METHOD__ . '-pfunc-' . $function );
wfProfileOut( __METHOD__ . '-pfunc' );
wfProfileOut( __METHOD__ );
throw new MWException( "Tag hook for $function is not callable\n" );
@@ -3085,6 +3207,7 @@ class Parser {
$text = $this->preprocessToDom( $text, $preprocessFlags );
$isChildObj = true;
}
+ wfProfileOut( __METHOD__ . '-pfunc-' . $function );
}
}
wfProfileOut( __METHOD__ . '-pfunc' );
@@ -3104,8 +3227,8 @@ class Parser {
if ( $title ) {
$titleText = $title->getPrefixedText();
# Check for language variants if the template is not found
- if ( $wgContLang->hasVariants() && $title->getArticleID() == 0 ) {
- $wgContLang->findVariantLink( $part1, $title, true );
+ if ( $this->getConverterLanguage()->hasVariants() && $title->getArticleID() == 0 ) {
+ $this->getConverterLanguage()->findVariantLink( $part1, $title, true );
}
# Do recursion depth check
$limit = $this->mOptions->getMaxTemplateDepth();
@@ -3120,14 +3243,37 @@ class Parser {
# Load from database
if ( !$found && $title ) {
+ $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+ wfProfileIn( $titleProfileIn ); // template in
wfProfileIn( __METHOD__ . '-loadtpl' );
if ( !$title->isExternal() ) {
- if ( $title->getNamespace() == NS_SPECIAL
+ if ( $title->isSpecialPage()
&& $this->mOptions->getAllowSpecialInclusion()
&& $this->ot['html'] )
{
- $text = SpecialPageFactory::capturePath( $title );
- if ( is_string( $text ) ) {
+ // Pass the template arguments as URL parameters.
+ // "uselang" will have no effect since the Language object
+ // is forced to the one defined in ParserOptions.
+ $pageArgs = array();
+ for ( $i = 0; $i < $args->getLength(); $i++ ) {
+ $bits = $args->item( $i )->splitArg();
+ if ( strval( $bits['index'] ) === '' ) {
+ $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
+ $value = trim( $frame->expand( $bits['value'] ) );
+ $pageArgs[$name] = $value;
+ }
+ }
+
+ // Create a new context to execute the special page
+ $context = new RequestContext;
+ $context->setTitle( $title );
+ $context->setRequest( new FauxRequest( $pageArgs ) );
+ $context->setUser( $this->getUser() );
+ $context->setLanguage( $this->mOptions->getUserLangObj() );
+ $ret = SpecialPageFactory::capturePath( $title, $context );
+ if ( $ret ) {
+ $text = $context->getOutput()->getHTML();
+ $this->mOutput->addOutputPageMetadata( $context->getOutput() );
$found = true;
$isHTML = true;
$this->disableCache();
@@ -3176,7 +3322,9 @@ class Parser {
# Recover the source wikitext and return it
if ( !$found ) {
$text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args );
- wfProfileOut( __METHOD__."-title-$originalTitle" );
+ if ( $titleProfileIn ) {
+ wfProfileOut( $titleProfileIn ); // template out
+ }
wfProfileOut( __METHOD__ );
return array( 'object' => $text );
}
@@ -3206,6 +3354,10 @@ class Parser {
$isLocalObj = false;
}
+ if ( $titleProfileIn ) {
+ wfProfileOut( $titleProfileIn ); // template out
+ }
+
# Replace raw HTML by a placeholder
# Add a blank line preceding, to prevent it from mucking up
# immediately preceding headings
@@ -3245,7 +3397,6 @@ class Parser {
$ret = array( 'text' => $text );
}
- wfProfileOut( __METHOD__."-title-$originalTitle" );
wfProfileOut( __METHOD__ );
return $ret;
}
@@ -3254,6 +3405,8 @@ class Parser {
* Get the semi-parsed DOM representation of a template with a given title,
* and its redirect destination title. Cached.
*
+ * @param $title Title
+ *
* @return array
*/
function getTemplateDom( $title ) {
@@ -3320,6 +3473,9 @@ class Parser {
* Static function to get a template
* Can be overridden via ParserOptions::setTemplateCallback().
*
+ * @parma $title Title
+ * @param $parser Parser
+ *
* @return array
*/
static function statelessFetchTemplate( $title, $parser = false ) {
@@ -3394,30 +3550,30 @@ class Parser {
/**
* Fetch a file and its title and register a reference to it.
+ * If 'broken' is a key in $options then the file will appear as a broken thumbnail.
* @param Title $title
- * @param string $time MW timestamp
- * @param string $sha1 base 36 SHA-1
- * @return mixed File or false
+ * @param Array $options Array of options to RepoGroup::findFile
+ * @return File|false
*/
- function fetchFile( $title, $time = false, $sha1 = false ) {
- $res = $this->fetchFileAndTitle( $title, $time, $sha1 );
+ function fetchFile( $title, $options = array() ) {
+ $res = $this->fetchFileAndTitle( $title, $options );
return $res[0];
}
/**
* Fetch a file and its title and register a reference to it.
+ * If 'broken' is a key in $options then the file will appear as a broken thumbnail.
* @param Title $title
- * @param string $time MW timestamp
- * @param string $sha1 base 36 SHA-1
+ * @param Array $options Array of options to RepoGroup::findFile
* @return Array ( File or false, Title of file )
*/
- function fetchFileAndTitle( $title, $time = false, $sha1 = false ) {
- if ( $time === '0' ) {
+ function fetchFileAndTitle( $title, $options = array() ) {
+ if ( isset( $options['broken'] ) ) {
$file = false; // broken thumbnail forced by hook
- } elseif ( $sha1 ) { // get by (sha1,timestamp)
- $file = RepoGroup::singleton()->findFileFromKey( $sha1, array( 'time' => $time ) );
+ } elseif ( isset( $options['sha1'] ) ) { // get by (sha1,timestamp)
+ $file = RepoGroup::singleton()->findFileFromKey( $options['sha1'], $options );
} else { // get by (name,timestamp)
- $file = wfFindFile( $title, array( 'time' => $time ) );
+ $file = wfFindFile( $title, $options );
}
$time = $file ? $file->getTimestamp() : false;
$sha1 = $file ? $file->getSha1() : false;
@@ -3660,6 +3816,10 @@ class Parser {
/**
* Strip double-underscore items like __NOGALLERY__ and __NOTOC__
* Fills $this->mDoubleUnderscores, returns the modified text
+ *
+ * @param $text string
+ *
+ * @return string
*/
function doDoubleUnderscore( $text ) {
wfProfileIn( __METHOD__ );
@@ -3719,12 +3879,16 @@ class Parser {
* @param $msg String: message key
* @return Boolean: whether the addition was successful
*/
- protected function addTrackingCategory( $msg ) {
+ public function addTrackingCategory( $msg ) {
if ( $this->mTitle->getNamespace() === NS_SPECIAL ) {
wfDebug( __METHOD__.": Not adding tracking category $msg to special page!\n" );
return false;
}
- $cat = wfMsgForContent( $msg );
+ // Important to parse with correct title (bug 31469)
+ $cat = wfMessage( $msg )
+ ->title( $this->getTitle() )
+ ->inContentLanguage()
+ ->text();
# Allow tracking categories to be disabled by setting them to "-"
if ( $cat === '-' ) {
@@ -3761,8 +3925,9 @@ class Parser {
# Inhibit editsection links if requested in the page
if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
- $showEditLink = 0;
+ $maybeShowEditLink = $showEditLink = false;
} else {
+ $maybeShowEditLink = true; /* Actual presence will depend on ParserOptions option */
$showEditLink = $this->mOptions->getEditSection();
}
if ( $showEditLink ) {
@@ -3894,24 +4059,28 @@ class Parser {
if ( $dot ) {
$numbering .= '.';
}
- $numbering .= $this->getFunctionLang()->formatNum( $sublevelCount[$i] );
+ $numbering .= $this->getTargetLanguage()->formatNum( $sublevelCount[$i] );
$dot = 1;
}
}
# The safe header is a version of the header text safe to use for links
- # Avoid insertion of weird stuff like <math> by expanding the relevant sections
- $safeHeadline = $this->mStripState->unstripBoth( $headline );
# Remove link placeholders by the link text.
# <!--LINK number-->
# turns into
# link text with suffix
- $safeHeadline = $this->replaceLinkHoldersText( $safeHeadline );
+ # Do this before unstrip since link text can contain strip markers
+ $safeHeadline = $this->replaceLinkHoldersText( $headline );
- # Strip out HTML (other than plain <sup> and <sub>: bug 8393)
+ # Avoid insertion of weird stuff like <math> by expanding the relevant sections
+ $safeHeadline = $this->mStripState->unstripBoth( $safeHeadline );
+
+ # Strip out HTML (first regex removes any tag not allowed)
+ # Allowed tags are <sup> and <sub> (bug 8393), <i> (bug 26375) and <b> (r105284)
+ # We strip any parameter from accepted tags (second regex)
$tocline = preg_replace(
- array( '#<(?!/?(sup|sub)).*?'.'>#', '#<(/?(sup|sub)).*?'.'>#' ),
+ array( '#<(?!/?(sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(sup|sub|i|b))(?: .*?)?'.'>#' ),
array( '', '<$1>' ),
$safeHeadline
);
@@ -4017,7 +4186,7 @@ class Parser {
);
# give headline the correct <h#> tag
- if ( $sectionIndex !== false ) {
+ if ( $maybeShowEditLink && $sectionIndex !== false ) {
// Output edit section links as markers with styles that can be customized by skins
if ( $isTemplate ) {
# Put a T flag in the section identifier, to indicate to extractSections()
@@ -4061,7 +4230,7 @@ class Parser {
if ( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) {
$toc .= Linker::tocUnindent( $prevtoclevel - 1 );
}
- $toc = Linker::tocList( $toc, $this->mOptions->getUserLang() );
+ $toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
$this->mOutput->setTOCHTML( $toc );
}
@@ -4070,30 +4239,42 @@ class Parser {
}
# split up and insert constructed headlines
-
$blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
$i = 0;
+ // build an array of document sections
+ $sections = array();
foreach ( $blocks as $block ) {
- if ( $showEditLink && $headlineCount > 0 && $i == 0 && $block !== "\n" ) {
- # This is the [edit] link that appears for the top block of text when
- # section editing is enabled
-
- # Disabled because it broke block formatting
- # For example, a bullet point in the top line
- # $full .= $sk->editSectionLink(0);
- }
- $full .= $block;
- if ( $enoughToc && !$i && $isMain && !$this->mForceTocPosition ) {
- # Top anchor now in skin
- $full = $full.$toc;
+ // $head is zero-based, sections aren't.
+ if ( empty( $head[$i - 1] ) ) {
+ $sections[$i] = $block;
+ } else {
+ $sections[$i] = $head[$i - 1] . $block;
}
- if ( !empty( $head[$i] ) ) {
- $full .= $head[$i];
- }
+ /**
+ * Send a hook, one per section.
+ * The idea here is to be able to make section-level DIVs, but to do so in a
+ * lower-impact, more correct way than r50769
+ *
+ * $this : caller
+ * $section : the section number
+ * &$sectionContent : ref to the content of the section
+ * $showEditLinks : boolean describing whether this section has an edit link
+ */
+ wfRunHooks( 'ParserSectionCreate', array( $this, $i, &$sections[$i], $showEditLink ) );
+
$i++;
}
+
+ if ( $enoughToc && $isMain && !$this->mForceTocPosition ) {
+ // append the TOC at the beginning
+ // Top anchor now in skin
+ $sections[0] = $sections[0] . $toc . "\n";
+ }
+
+ $full .= join( '', $sections );
+
if ( $this->mForceTocPosition ) {
return str_replace( '<!--MWTOC-->', $toc, $full );
} else {
@@ -4133,6 +4314,11 @@ class Parser {
/**
* Pre-save transform helper function
* @private
+ *
+ * @param $text string
+ * @param $user User
+ *
+ * @return string
*/
function pstPass2( $text, $user ) {
global $wgContLang, $wgLocaltimezone;
@@ -4188,9 +4374,9 @@ class Parser {
$tc = "[$wgLegalTitleChars]";
$nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
- $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( \\($tc+\\))\\|]]/"; # [[ns:page (context)|]]
- $p4 = "/\[\[(:?$nc+:|:|)($tc+?)(($tc+))\\|]]/"; # [[ns:page(context)|]]
- $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( \\($tc+\\)|)(, $tc+|)\\|]]/"; # [[ns:page (context), context|]]
+ $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/"; # [[ns:page (context)|]]
+ $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/"; # [[ns:page(context)|]]
+ $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)(, $tc+|)\\|]]/"; # [[ns:page (context), context|]]
$p2 = "/\[\[\\|($tc+)]]/"; # [[|page]]
# try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
@@ -4224,8 +4410,8 @@ class Parser {
* as it may have changed if it's the $wgParser.
*
* @param $user User
- * @param $nickname String: nickname to use or false to use user's default nickname
- * @param $fancySig Boolean: whether the nicknname is the complete signature
+ * @param $nickname String|bool nickname to use or false to use user's default nickname
+ * @param $fancySig Boolean|null whether the nicknname is the complete signature
* or null to use default value
* @return string
*/
@@ -4260,7 +4446,7 @@ class Parser {
}
# Make sure nickname doesnt get a sig in a sig
- $nickname = $this->cleanSigInSig( $nickname );
+ $nickname = self::cleanSigInSig( $nickname );
# If we're still here, make it a link to the user page
$userText = wfEscapeWikiText( $username );
@@ -4287,16 +4473,13 @@ class Parser {
* 2) Substitute all transclusions
*
* @param $text String
- * @param $parsing Whether we're cleaning (preferences save) or parsing
+ * @param $parsing bool Whether we're cleaning (preferences save) or parsing
* @return String: signature text
*/
- function cleanSig( $text, $parsing = false ) {
+ public function cleanSig( $text, $parsing = false ) {
if ( !$parsing ) {
global $wgTitle;
- $this->mOptions = new ParserOptions;
- $this->clearState();
- $this->setTitle( $wgTitle );
- $this->setOutputType = self::OT_PREPROCESS;
+ $this->startParse( $wgTitle, new ParserOptions, self::OT_PREPROCESS, true );
}
# Option to disable this feature
@@ -4311,7 +4494,7 @@ class Parser {
$substText = '{{' . $substWord->getSynonym( 0 );
$text = preg_replace( $substRegex, $substText, $text );
- $text = $this->cleanSigInSig( $text );
+ $text = self::cleanSigInSig( $text );
$dom = $this->preprocessToDom( $text );
$frame = $this->getPreprocessor()->newFrame();
$text = $frame->expand( $dom );
@@ -4329,7 +4512,7 @@ class Parser {
* @param $text String
* @return String: signature text with /~{3,5}/ removed
*/
- function cleanSigInSig( $text ) {
+ public static function cleanSigInSig( $text ) {
$text = preg_replace( '/~{3,5}/', '', $text );
return $text;
}
@@ -4337,11 +4520,22 @@ class Parser {
/**
* Set up some variables which are usually set up in parse()
* so that an external function can call some class members with confidence
+ *
+ * @param $title Title|null
+ * @param $options ParserOptions
+ * @param $outputType
+ * @param $clearState bool
*/
public function startExternalParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
$this->startParse( $title, $options, $outputType, $clearState );
}
+ /**
+ * @param $title Title|null
+ * @param $options ParserOptions
+ * @param $outputType
+ * @param $clearState bool
+ */
private function startParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
$this->setTitle( $title );
$this->mOptions = $options;
@@ -4450,6 +4644,7 @@ class Parser {
*/
function clearTagHooks() {
$this->mTagHooks = array();
+ $this->mFunctionTagHooks = array();
$this->mStripList = $this->mDefaultStripList;
}
@@ -4559,7 +4754,11 @@ class Parser {
* @todo FIXME: Update documentation. makeLinkObj() is deprecated.
* Replace <!--LINK--> link placeholders with actual links, in the buffer
* Placeholders created in Skin::makeLinkObj()
- * Returns an array of link CSS classes, indexed by PDBK.
+ *
+ * @param $text string
+ * @param $options int
+ *
+ * @return array of link CSS classes, indexed by PDBK.
*/
function replaceLinkHolders( &$text, $options = 0 ) {
return $this->mLinkHolders->replace( $text );
@@ -4586,7 +4785,7 @@ class Parser {
* 'A tree'.
*
* @param string $text
- * @param array $param
+ * @param array $params
* @return string HTML
*/
function renderImageGallery( $text, $params ) {
@@ -4671,6 +4870,10 @@ class Parser {
return $ig->toHTML();
}
+ /**
+ * @param $handler
+ * @return array
+ */
function getImageParams( $handler ) {
if ( $handler ) {
$handlerClass = get_class( $handler );
@@ -4716,7 +4919,7 @@ class Parser {
*
* @param $title Title
* @param $options String
- * @param $holders LinkHolderArray
+ * @param $holders LinkHolderArray|false
* @return string HTML
*/
function makeImage( $title, $options, $holders = false ) {
@@ -4748,11 +4951,12 @@ class Parser {
$parts = StringUtils::explode( "|", $options );
# Give extensions a chance to select the file revision for us
- $time = $sha1 = $descQuery = false;
+ $options = array();
+ $descQuery = false;
wfRunHooks( 'BeforeParserFetchFileAndTitle',
- array( $this, $title, &$time, &$sha1, &$descQuery ) );
+ array( $this, $title, &$options, &$descQuery ) );
# Fetch and register the file (file title may be different via hooks)
- list( $file, $title ) = $this->fetchFileAndTitle( $title, $time, $sha1 );
+ list( $file, $title ) = $this->fetchFileAndTitle( $title, $options );
# Get parameter map
$handler = $file ? $file->getHandler() : false;
@@ -4820,7 +5024,7 @@ class Parser {
$value = true;
$validated = true;
} elseif ( preg_match( "/^$prots/", $value ) ) {
- if ( preg_match( "/^($prots)$chars+$/", $value, $m ) ) {
+ if ( preg_match( "/^($prots)$chars+$/u", $value, $m ) ) {
$paramName = 'link-url';
$this->mOutput->addExternalLink( $value );
if ( $this->mOptions->getExternalLinkTarget() ) {
@@ -4912,6 +5116,7 @@ class Parser {
wfRunHooks( 'ParserMakeImageParams', array( $title, $file, &$params ) );
# Linker does the rest
+ $time = isset( $options['time'] ) ? $options['time'] : false;
$ret = Linker::makeImageLink2( $title, $file, $params['frame'], $params['handler'],
$time, $descQuery, $this->mOptions->getThumbSize() );
@@ -4953,6 +5158,10 @@ class Parser {
*/
function disableCache() {
wfDebug( "Parser output marked as uncacheable.\n" );
+ if ( !$this->mOutput ) {
+ throw new MWException( __METHOD__ .
+ " can only be called when actually parsing something" );
+ }
$this->mOutput->setCacheTime( -1 ); // old style, for compatibility
$this->mOutput->updateCacheExpiry( 0 ); // new style, for consistency
}
@@ -4977,7 +5186,7 @@ class Parser {
* @return array
*/
function getTags() {
- return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ) );
+ return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ), array_keys( $this->mFunctionTagHooks ) );
}
/**
@@ -4985,6 +5194,10 @@ class Parser {
*
* Transparent tag hooks are like regular XML-style tag hooks, except they
* operate late in the transformation sequence, on HTML instead of wikitext.
+ *
+ * @param $text string
+ *
+ * @return string
*/
function replaceTransparentTags( $text ) {
$matches = array();
@@ -5026,7 +5239,7 @@ class Parser {
* not found, $mode=get will return $newtext, and $mode=replace will return $text.
*
* Section 0 is always considered to exist, even if it only contains the empty
- * string. If $text is the empty string and section 0 is replaced, $newText is
+ * string. If $text is the empty string and section 0 is replaced, $newText is
* returned.
*
* @param $mode String: one of "get" or "replace"
@@ -5161,7 +5374,7 @@ class Parser {
/**
* This function returns $oldtext after the content of the section
- * specified by $section has been replaced with $text. If the target
+ * specified by $section has been replaced with $text. If the target
* section does not exist, $oldtext is returned unchanged.
*
* @param $oldtext String: former text of the article
@@ -5287,6 +5500,10 @@ class Parser {
* Try to guess the section anchor name based on a wikitext fragment
* presumably extracted from a heading, for example "Header" from
* "== Header ==".
+ *
+ * @param $text string
+ *
+ * @return string
*/
public function guessSectionNameFromWikiText( $text ) {
# Strip out wikitext links(they break the anchor)
@@ -5346,6 +5563,11 @@ class Parser {
/**
* strip/replaceVariables/unstrip for preprocessor regression testing
*
+ * @param $text string
+ * @param $title Title
+ * @param $options ParserOptions
+ * @param $outputType int
+ *
* @return string
*/
function testSrvus( $text, Title $title, ParserOptions $options, $outputType = self::OT_HTML ) {
@@ -5357,10 +5579,22 @@ class Parser {
return $text;
}
+ /**
+ * @param $text string
+ * @param $title Title
+ * @param $options ParserOptions
+ * @return string
+ */
function testPst( $text, Title $title, ParserOptions $options ) {
return $this->preSaveTransform( $text, $title, $options->getUser(), $options );
}
+ /**
+ * @param $text
+ * @param $title Title
+ * @param $options ParserOptions
+ * @return string
+ */
function testPreprocess( $text, Title $title, ParserOptions $options ) {
return $this->testSrvus( $text, $title, $options, self::OT_PREPROCESS );
}
@@ -5376,6 +5610,9 @@ class Parser {
* two strings will be replaced with the value returned by the callback in
* each case.
*
+ * @param $s string
+ * @param $callback
+ *
* @return string
*/
function markerSkipCallback( $s, $callback ) {
@@ -5424,6 +5661,8 @@ class Parser {
* unserializeHalfParsedText(). The text can then be safely incorporated into
* the return value of a parser hook.
*
+ * @param $text string
+ *
* @return array
*/
function serializeHalfParsedText( $text ) {
diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php
index dcbf7a4d..8b043290 100644
--- a/includes/parser/ParserCache.php
+++ b/includes/parser/ParserCache.php
@@ -15,6 +15,8 @@ class ParserCache {
/**
* Get an instance of this object
+ *
+ * @return ParserCache
*/
public static function singleton() {
static $instance;
@@ -78,7 +80,7 @@ class ParserCache {
*/
function getETag( $article, $popts ) {
return 'W/"' . $this->getParserOutputKey( $article,
- $popts->optionsHash( ParserOptions::legacyOptions() ) ) .
+ $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) ) .
"--" . $article->getTouched() . '"';
}
@@ -98,6 +100,8 @@ class ParserCache {
* It would be preferable to have this code in get()
* instead of having Article looking in our internals.
*
+ * @todo Document parameter $useOutdated
+ *
* @param $article Article
* @param $popts ParserOptions
*/
@@ -128,7 +132,7 @@ class ParserCache {
$usedOptions = ParserOptions::legacyOptions();
}
- return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions ) );
+ return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions, $article->getTitle() ) );
}
/**
@@ -156,6 +160,7 @@ class ParserCache {
$parserOutputKey = $this->getKey( $article, $popts, $useOutdated );
if ( $parserOutputKey === false ) {
+ wfIncrStats( 'pcache_miss_absent' );
wfProfileOut( __METHOD__ );
return false;
}
@@ -163,18 +168,19 @@ class ParserCache {
$value = $this->mMemc->get( $parserOutputKey );
if ( self::try116cache && !$value && strpos( $value, '*' ) !== -1 ) {
wfDebug( "New format parser cache miss.\n" );
- $parserOutputKey = $this->getParserOutputKey( $article, $popts->optionsHash( ParserOptions::legacyOptions() ) );
+ $parserOutputKey = $this->getParserOutputKey( $article,
+ $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) );
$value = $this->mMemc->get( $parserOutputKey );
}
if ( !$value ) {
- wfDebug( "Parser cache miss.\n" );
+ wfDebug( "ParserOutput cache miss.\n" );
wfIncrStats( "pcache_miss_absent" );
wfProfileOut( __METHOD__ );
return false;
}
- wfDebug( "Found.\n" );
-
+ wfDebug( "ParserOutput cache found.\n" );
+
// The edit section preference may not be the appropiate one in
// the ParserOutput, as we are not storing it in the parsercache
// key. Force it here. See bug 31445.
@@ -197,7 +203,6 @@ class ParserCache {
* @param $parserOutput ParserOutput
* @param $article Article
* @param $popts ParserOptions
- * @return void
*/
public function save( $parserOutput, $article, $popts ) {
$expire = $parserOutput->getCacheExpiry();
@@ -215,10 +220,10 @@ class ParserCache {
$optionsKey->setContainsOldMagic( $parserOutput->containsOldMagic() );
$parserOutputKey = $this->getParserOutputKey( $article,
- $popts->optionsHash( $optionsKey->mUsedOptions ) );
+ $popts->optionsHash( $optionsKey->mUsedOptions, $article->getTitle() ) );
// Save the timestamp so that we don't have to load the revision row on view
- $parserOutput->mTimestamp = $article->getTimestamp();
+ $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" );
diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php
index 07752768..57d3a7eb 100644
--- a/includes/parser/ParserOptions.php
+++ b/includes/parser/ParserOptions.php
@@ -1,58 +1,188 @@
<?php
/**
- * Options for the PHP parser
+ * \brief Options for the PHP parser
*
* @file
* @ingroup Parser
*/
/**
- * Set options of the Parser
- * @todo document
+ * \brief Set options of the Parser
+ *
+ * All member variables are supposed to be private in theory, although in practise this is not the case.
+ *
* @ingroup Parser
*/
class ParserOptions {
- # All variables are supposed to be private in theory, although in practise this is not the case.
- var $mUseDynamicDates; # Use DateFormatter to format dates
- var $mInterwikiMagic; # Interlanguage links are removed and returned in an array
- var $mAllowExternalImages; # Allow external images inline
- var $mAllowExternalImagesFrom; # If not, any exception?
- var $mEnableImageWhitelist; # If not or it doesn't match, should we check an on-wiki whitelist?
- var $mDateFormat = null; # Date format index
- var $mEditSection = true; # Create "edit section" links
- var $mAllowSpecialInclusion; # Allow inclusion of special pages
- var $mTidy = false; # Ask for tidy cleanup
- var $mInterfaceMessage = false; # Which lang to call for PLURAL and GRAMMAR
- var $mTargetLanguage = null; # Overrides above setting with arbitrary language
- var $mMaxIncludeSize; # Maximum size of template expansions, in bytes
- var $mMaxPPNodeCount; # Maximum number of nodes touched by PPFrame::expand()
- var $mMaxPPExpandDepth; # Maximum recursion depth in PPFrame::expand()
- var $mMaxTemplateDepth; # Maximum recursion depth for templates within templates
- var $mRemoveComments = true; # Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
- var $mTemplateCallback = # Callback for template fetching
+
+ /**
+ * Use DateFormatter to format dates
+ */
+ var $mUseDynamicDates;
+
+ /**
+ * Interlanguage links are removed and returned in an array
+ */
+ var $mInterwikiMagic;
+
+ /**
+ * Allow external images inline?
+ */
+ var $mAllowExternalImages;
+
+ /**
+ * If not, any exception?
+ */
+ var $mAllowExternalImagesFrom;
+
+ /**
+ * If not or it doesn't match, should we check an on-wiki whitelist?
+ */
+ var $mEnableImageWhitelist;
+
+ /**
+ * Date format index
+ */
+ var $mDateFormat = null;
+
+ /**
+ * Create "edit section" links?
+ */
+ var $mEditSection = true;
+
+ /**
+ * Allow inclusion of special pages?
+ */
+ var $mAllowSpecialInclusion;
+
+ /**
+ * Use tidy to cleanup output HTML?
+ */
+ var $mTidy = false;
+
+ /**
+ * Which lang to call for PLURAL and GRAMMAR
+ */
+ var $mInterfaceMessage = false;
+
+ /**
+ * Overrides $mInterfaceMessage with arbitrary language
+ */
+ var $mTargetLanguage = null;
+
+ /**
+ * Maximum size of template expansions, in bytes
+ */
+ var $mMaxIncludeSize;
+
+ /**
+ * Maximum number of nodes touched by PPFrame::expand()
+ */
+ var $mMaxPPNodeCount;
+
+ /**
+ * Maximum recursion depth in PPFrame::expand()
+ */
+ var $mMaxPPExpandDepth;
+
+ /**
+ * Maximum recursion depth for templates within templates
+ */
+ var $mMaxTemplateDepth;
+
+ /**
+ * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
+ */
+ var $mRemoveComments = true;
+
+ /**
+ * Callback for template fetching. Used as first argument to call_user_func().
+ */
+ var $mTemplateCallback =
array( 'Parser', 'statelessFetchTemplate' );
- var $mEnableLimitReport = false; # Enable limit report in an HTML comment on output
- var $mTimestamp; # Timestamp used for {{CURRENTDAY}} etc.
- var $mExternalLinkTarget; # Target attribute for external links
- var $mCleanSignatures; #
- var $mPreSaveTransform = true; # Transform wiki markup when saving the page.
+
+ /**
+ * Enable limit report in an HTML comment on output
+ */
+ var $mEnableLimitReport = false;
+
+ /**
+ * Timestamp used for {{CURRENTDAY}} etc.
+ */
+ var $mTimestamp;
+
+ /**
+ * Target attribute for external links
+ */
+ var $mExternalLinkTarget;
+
+ /**
+ * Clean up signature texts?
+ *
+ * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
+ * 2) Substitute all transclusions
+ */
+ var $mCleanSignatures;
+
+ /**
+ * Transform wiki markup when saving the page?
+ */
+ var $mPreSaveTransform = true;
- var $mNumberHeadings; # Automatically number headings
- var $mMath; # User math preference (as integer)
- var $mThumbSize; # Thumb size preferred by the user.
- private $mStubThreshold; # Maximum article size of an article to be marked as "stub"
- var $mUserLang; # Language code of the User language.
+ /**
+ * Automatically number headings?
+ */
+ var $mNumberHeadings;
+
+ /**
+ * User math preference (as integer). Not used (1.19)
+ */
+ var $mMath;
+
+ /**
+ * Thumb size preferred by the user.
+ */
+ var $mThumbSize;
+
+ /**
+ * Maximum article size of an article to be marked as "stub"
+ */
+ private $mStubThreshold;
+
+ /**
+ * Language object of the User language.
+ */
+ var $mUserLang;
/**
- * @var User
+ * @var User
+ * Stored user object
+ */
+ var $mUser;
+
+ /**
+ * Parsing the page for a "preview" operation?
+ */
+ var $mIsPreview = false;
+
+ /**
+ * Parsing the page for a "preview" operation on a single section?
+ */
+ var $mIsSectionPreview = false;
+
+ /**
+ * Parsing the printable version of the page?
*/
- var $mUser; # Stored user object
- var $mIsPreview = false; # Parsing the page for a "preview" operation
- var $mIsSectionPreview = false; # Parsing the page for a "preview" operation on a single section
- var $mIsPrintable = false; # Parsing the printable version of the page
+ var $mIsPrintable = false;
- var $mExtraKey = ''; # Extra key that should be present in the caching key.
+ /**
+ * Extra key that should be present in the caching key.
+ */
+ var $mExtraKey = '';
+ /**
+ * Function to be called when an option is accessed.
+ */
protected $onAccessCallback = null;
function getUseDynamicDates() { return $this->mUseDynamicDates; }
@@ -96,7 +226,7 @@ class ParserOptions {
* @deprecated since 1.18 Use Linker::* instead
*/
function getSkin( $title = null ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
return new DummyLinker;
}
@@ -119,12 +249,23 @@ class ParserOptions {
* 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).
+ *
+ * @return Language object
+ * @since 1.19
+ */
+ function getUserLangObj() {
+ $this->optionUsed( 'userlang' );
+ return $this->mUserLang;
+ }
+
+ /**
+ * Same as getUserLangObj() but returns a string instead.
+ *
* @return String Language code
* @since 1.17
*/
function getUserLang() {
- $this->optionUsed( 'userlang' );
- return $this->mUserLang;
+ return $this->getUserLangObj()->getCode();
}
function setUseDynamicDates( $x ) { return wfSetVar( $this->mUseDynamicDates, $x ); }
@@ -137,7 +278,9 @@ class ParserOptions {
function setNumberHeadings( $x ) { return wfSetVar( $this->mNumberHeadings, $x ); }
function setAllowSpecialInclusion( $x ) { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
function setTidy( $x ) { return wfSetVar( $this->mTidy, $x ); }
- function setSkin( $x ) { $this->mSkin = $x; }
+
+ /** @deprecated in 1.19; will be removed in 1.20 */
+ function setSkin( $x ) { wfDeprecated( __METHOD__, '1.19' ); }
function setInterfaceMessage( $x ) { return wfSetVar( $this->mInterfaceMessage, $x ); }
function setTargetLanguage( $x ) { return wfSetVar( $this->mTargetLanguage, $x, true ); }
function setMaxIncludeSize( $x ) { return wfSetVar( $this->mMaxIncludeSize, $x ); }
@@ -151,8 +294,8 @@ class ParserOptions {
function setExternalLinkTarget( $x ) { return wfSetVar( $this->mExternalLinkTarget, $x ); }
function setMath( $x ) { return wfSetVar( $this->mMath, $x ); }
function setUserLang( $x ) {
- if ( $x instanceof Language ) {
- $x = $x->getCode();
+ if ( is_string( $x ) ) {
+ $x = Language::factory( $x );
}
return wfSetVar( $this->mUserLang, $x );
}
@@ -171,41 +314,75 @@ class ParserOptions {
$this->mExtraKey .= '!' . $key;
}
- function __construct( $user = null ) {
- $this->initialiseFromUser( $user );
+ /**
+ * Constructor
+ * @param $user User object
+ * @param $lang Language object
+ */
+ function __construct( $user = null, $lang = null ) {
+ if ( $user === null ) {
+ global $wgUser;
+ if ( $wgUser === null ) {
+ $user = new User;
+ } else {
+ $user = $wgUser;
+ }
+ }
+ if ( $lang === null ) {
+ global $wgLang;
+ if ( !StubObject::isRealObject( $wgLang ) ) {
+ $wgLang->_unstub();
+ }
+ $lang = $wgLang;
+ }
+ $this->initialiseFromUser( $user, $lang );
}
/**
- * Get parser options
+ * Get a ParserOptions object from a given user.
+ * Language will be taken from $wgLang.
*
* @param $user User object
* @return ParserOptions object
*/
- static function newFromUser( $user ) {
+ public static function newFromUser( $user ) {
return new ParserOptions( $user );
}
- /** Get user options */
- function initialiseFromUser( $userInput ) {
- global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages;
- global $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion, $wgMaxArticleSize;
- global $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth, $wgCleanSignatures;
- global $wgExternalLinkTarget, $wgLang;
+ /**
+ * Get a ParserOptions object from a given user and language
+ *
+ * @param $user User object
+ * @param $lang Language object
+ * @return ParserOptions object
+ */
+ public static function newFromUserAndLang( User $user, Language $lang ) {
+ return new ParserOptions( $user, $lang );
+ }
- wfProfileIn( __METHOD__ );
+ /**
+ * Get a ParserOptions object from a IContextSource object
+ *
+ * @param $context IContextSource object
+ * @return ParserOptions object
+ */
+ public static function newFromContext( IContextSource $context ) {
+ return new ParserOptions( $context->getUser(), $context->getLanguage() );
+ }
- if ( !$userInput ) {
- global $wgUser;
- if ( isset( $wgUser ) ) {
- $user = $wgUser;
- } else {
- $user = new User;
- }
- } else {
- $user =& $userInput;
- }
+ /**
+ * Get user options
+ *
+ * @param $user User object
+ * @param $lang Language object
+ */
+ private function initialiseFromUser( $user, $lang ) {
+ global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages,
+ $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion,
+ $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
+ $wgCleanSignatures, $wgExternalLinkTarget;
- $this->mUser = $user;
+ wfProfileIn( __METHOD__ );
$this->mUseDynamicDates = $wgUseDynamicDates;
$this->mInterwikiMagic = $wgInterwikiMagic;
@@ -220,11 +397,12 @@ class ParserOptions {
$this->mCleanSignatures = $wgCleanSignatures;
$this->mExternalLinkTarget = $wgExternalLinkTarget;
+ $this->mUser = $user;
$this->mNumberHeadings = $user->getOption( 'numberheadings' );
$this->mMath = $user->getOption( 'math' );
$this->mThumbSize = $user->getOption( 'thumbsize' );
$this->mStubThreshold = $user->getStubThreshold();
- $this->mUserLang = $wgLang->getCode();
+ $this->mUserLang = $lang;
wfProfileOut( __METHOD__ );
}
@@ -274,10 +452,12 @@ class ParserOptions {
* settings.
*
* @since 1.17
- * @return \string Page rendering hash
+ * @param $forOptions Array
+ * @param $title Title: used to get the content language of the page (since r97636)
+ * @return string Page rendering hash
*/
- public function optionsHash( $forOptions ) {
- global $wgContLang, $wgRenderHashAppend;
+ public function optionsHash( $forOptions, $title = null ) {
+ global $wgRenderHashAppend;
$confstr = '';
@@ -308,7 +488,7 @@ class ParserOptions {
}
if ( in_array( 'userlang', $forOptions ) ) {
- $confstr .= '!' . $this->mUserLang;
+ $confstr .= '!' . $this->mUserLang->getCode();
} else {
$confstr .= '!*';
}
@@ -321,7 +501,12 @@ class ParserOptions {
// add in language specific options, if any
// @todo FIXME: This is just a way of retrieving the url/user preferred variant
- $confstr .= $wgContLang->getExtraHashOptions();
+ if( !is_null( $title ) ) {
+ $confstr .= $title->getPageLanguage()->getExtraHashOptions();
+ } else {
+ global $wgContLang;
+ $confstr .= $wgContLang->getExtraHashOptions();
+ }
$confstr .= $wgRenderHashAppend;
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index 403b6625..2d99a3b5 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -5,7 +5,7 @@
* @file
* @ingroup Parser
*/
-
+
/**
* @todo document
* @ingroup Parser
@@ -16,7 +16,7 @@ class CacheTime {
$mCacheTime = '', # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
$mCacheExpiry = null, # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
$mContainsOldMagic; # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
-
+
function getCacheTime() { return $this->mCacheTime; }
function containsOldMagic() { return $this->mContainsOldMagic; }
@@ -30,17 +30,17 @@ class CacheTime {
*/
function setCacheTime( $t ) { return wfSetVar( $this->mCacheTime, $t ); }
- /**
+ /**
* Sets the number of seconds after which this object should expire.
* This value is used with the ParserCache.
- * If called with a value greater than the value provided at any previous call,
+ * If called with a value greater than the value provided at any previous call,
* the new call has no effect. The value returned by getCacheExpiry is smaller
- * or equal to the smallest number that was provided as an argument to
+ * or equal to the smallest number that was provided as an argument to
* updateCacheExpiry().
*
* @param $seconds number
*/
- function updateCacheExpiry( $seconds ) {
+ function updateCacheExpiry( $seconds ) {
$seconds = (int)$seconds;
if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
@@ -52,23 +52,23 @@ class CacheTime {
$this->mCacheTime = -1;
}
}
-
+
/**
* Returns the number of seconds after which this object should expire.
* This method is used by ParserCache to determine how long the ParserOutput can be cached.
* The timestamp of expiry can be calculated by adding getCacheExpiry() to getCacheTime().
- * The value returned by getCacheExpiry is smaller or equal to the smallest number
+ * The value returned by getCacheExpiry is smaller or equal to the smallest number
* that was provided to a call of updateCacheExpiry(), and smaller or equal to the
* value of $wgParserCacheExpireTime.
*/
- function getCacheExpiry() {
+ function getCacheExpiry() {
global $wgParserCacheExpireTime;
if ( $this->mCacheTime < 0 ) {
return 0;
} // old-style marker for "not cachable"
- $expire = $this->mCacheExpiry;
+ $expire = $this->mCacheExpiry;
if ( $expire === null ) {
$expire = $wgParserCacheExpireTime;
@@ -78,7 +78,7 @@ class CacheTime {
if( $this->containsOldMagic() ) { //compatibility hack
$expire = min( $expire, 3600 ); # 1 hour
- }
+ }
if ( $expire <= 0 ) {
return 0; // not cachable
@@ -90,7 +90,7 @@ class CacheTime {
/**
* @return bool
*/
- function isCacheable() {
+ function isCacheable() {
return $this->getCacheExpiry() > 0;
}
@@ -105,14 +105,14 @@ class CacheTime {
public function expired( $touched ) {
global $wgCacheEpoch;
return !$this->isCacheable() || // parser says it's uncacheable
- $this->getCacheTime() < $touched ||
- $this->getCacheTime() <= $wgCacheEpoch ||
- $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
- !isset( $this->mVersion ) ||
- version_compare( $this->mVersion, Parser::VERSION, "lt" );
- }
+ $this->getCacheTime() < $touched ||
+ $this->getCacheTime() <= $wgCacheEpoch ||
+ $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
+ !isset( $this->mVersion ) ||
+ version_compare( $this->mVersion, Parser::VERSION, "lt" );
+ }
}
-
+
class ParserOutput extends CacheTime {
var $mText, # The output text
$mLanguageLinks, # List of the full text of language links, in the order they appear
@@ -122,7 +122,7 @@ class ParserOutput extends CacheTime {
$mTemplates = array(), # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
$mTemplateIds = array(), # 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken.
$mImages = array(), # DB keys of the images used, in the array key only
- $mImageTimeKeys = array(), # DB keys of the images used mapped to sha1 and MW timestamp
+ $mFileSearchOptions = array(), # DB keys of the images used mapped to sha1 and MW timestamp
$mExternalLinks = array(), # External link URLs, in the key only
$mInterwikiLinks = array(), # 2-D map of prefix/DBK (in keys only) for the inline interwiki links in the document.
$mNewSection = false, # Show a new section link?
@@ -138,8 +138,9 @@ class ParserOutput extends CacheTime {
$mSections = array(), # Table of contents
$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
- private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change.
+ $mTOCHTML = '', # HTML of the TOC
+ $mTimestamp; # Timestamp of the revision
+ private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change.
private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -158,12 +159,10 @@ class ParserOutput extends CacheTime {
if ( $this->mEditSectionTokens ) {
return preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
array( &$this, 'replaceEditSectionLinksCallback' ), $this->mText );
- } else {
- return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText );
}
- return $this->mText;
+ return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText );
}
-
+
/**
* callback used by getText to replace editsection tokens
* @private
@@ -195,7 +194,7 @@ class ParserOutput extends CacheTime {
function &getTemplates() { return $this->mTemplates; }
function &getTemplateIds() { return $this->mTemplateIds; }
function &getImages() { return $this->mImages; }
- function &getImageTimeKeys() { return $this->mImageTimeKeys; }
+ function &getFileSearchOptions() { return $this->mFileSearchOptions; }
function &getExternalLinks() { return $this->mExternalLinks; }
function getNoGallery() { return $this->mNoGallery; }
function getHeadItems() { return $this->mHeadItems; }
@@ -207,6 +206,7 @@ class ParserOutput extends CacheTime {
function getWarnings() { return array_keys( $this->mWarnings ); }
function getIndexPolicy() { return $this->mIndexPolicy; }
function getTOCHTML() { return $this->mTOCHTML; }
+ function getTimestamp() { return $this->mTimestamp; }
function setText( $text ) { return wfSetVar( $this->mText, $text ); }
function setLanguageLinks( $ll ) { return wfSetVar( $this->mLanguageLinks, $ll ); }
@@ -217,6 +217,7 @@ class ParserOutput extends CacheTime {
function setEditSectionTokens( $t ) { return wfSetVar( $this->mEditSectionTokens, $t ); }
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 addCategory( $c, $sort ) { $this->mCategories[$c] = $sort; }
function addLanguageLink( $t ) { $this->mLanguageLinks[] = $t; }
@@ -243,7 +244,7 @@ class ParserOutput extends CacheTime {
# We don't register links pointing to our own server, unless... :-)
global $wgServer, $wgRegisterInternalExternals;
if( $wgRegisterInternalExternals or stripos($url,$wgServer.'/')!==0)
- $this->mExternalLinks[$url] = 1;
+ $this->mExternalLinks[$url] = 1;
}
/**
@@ -284,13 +285,13 @@ class ParserOutput extends CacheTime {
* Register a file dependency for this output
* @param $name string Title dbKey
* @param $timestamp string MW timestamp of file creation (or false if non-existing)
- * @param $sha string base 36 SHA-1 of file (or false if non-existing)
+ * @param $sha1 string base 36 SHA-1 of file (or false if non-existing)
* @return void
*/
function addImage( $name, $timestamp = null, $sha1 = null ) {
$this->mImages[$name] = 1;
if ( $timestamp !== null && $sha1 !== null ) {
- $this->mImageTimeKeys[$name] = array( 'time' => $timestamp, 'sha1' => $sha1 );
+ $this->mFileSearchOptions[$name] = array( 'time' => $timestamp, 'sha1' => $sha1 );
}
}
@@ -313,7 +314,7 @@ class ParserOutput extends CacheTime {
}
$this->mTemplateIds[$ns][$dbk] = $rev_id; // For versioning
}
-
+
/**
* @param $title Title object, must be an interwiki link
* @throws MWException if given invalid input
@@ -341,7 +342,7 @@ class ParserOutput extends CacheTime {
$this->mHeadItems[] = $section;
}
}
-
+
public function addModules( $modules ) {
$this->mModules = array_merge( $this->mModules, (array) $modules );
}
@@ -359,6 +360,20 @@ class ParserOutput extends CacheTime {
}
/**
+ * Copy items from the OutputPage object into this one
+ *
+ * @param $out OutputPage object
+ */
+ public function addOutputPageMetadata( OutputPage $out ) {
+ $this->addModules( $out->getModules() );
+ $this->addModuleScripts( $out->getModuleScripts() );
+ $this->addModuleStyles( $out->getModuleStyles() );
+ $this->addModuleMessages( $out->getModuleMessages() );
+
+ $this->mHeadItems = array_merge( $this->mHeadItems, $out->getHeadItemsArray() );
+ }
+
+ /**
* Override the title to be used for display
* -- this is assumed to have been validated
* (check equal normalisation, etc.)
@@ -411,10 +426,10 @@ class ParserOutput extends CacheTime {
}
return $this->mProperties;
}
-
-
+
+
/**
- * Returns the options from its ParserOptions which have been taken
+ * Returns the options from its ParserOptions which have been taken
* into account to produce this output or false if not available.
* @return mixed Array
*/
@@ -424,7 +439,7 @@ class ParserOutput extends CacheTime {
}
return array_keys( $this->mAccessedOptions );
}
-
+
/**
* Callback passed by the Parser to the ParserOptions to keep track of which options are used.
* @access private
diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php
index d6328aa7..ae088fdb 100644
--- a/includes/parser/Preprocessor.php
+++ b/includes/parser/Preprocessor.php
@@ -27,7 +27,7 @@ interface Preprocessor {
* Create a new custom frame for programmatic use of parameter replacement as used in some extensions
*
* @param $args array
- *
+ *
* @return PPFrame
*/
function newCustomFrame( $args );
@@ -44,7 +44,7 @@ interface Preprocessor {
*
* @param $text
* @param $flags
- *
+ *
* @return PPNode
*/
function preprocessToObj( $text, $flags = 0 );
@@ -138,6 +138,13 @@ interface PPFrame {
* Return true if the frame is a template frame
*/
function isTemplate();
+
+ /**
+ * Get a title of frame
+ *
+ * @return Title
+ */
+ function getTitle();
}
/**
diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php
index 755563a0..066589f6 100644
--- a/includes/parser/Preprocessor_DOM.php
+++ b/includes/parser/Preprocessor_DOM.php
@@ -81,7 +81,7 @@ class Preprocessor_DOM implements Preprocessor {
*/
function memCheck() {
if ( $this->memoryLimit === false ) {
- return;
+ return true;
}
$usage = memory_get_usage();
if ( $usage > $this->memoryLimit * 0.9 ) {
@@ -543,7 +543,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 );
@@ -957,8 +957,7 @@ class PPFrame_DOM implements PPFrame {
return $root;
}
- if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() )
- {
+ if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
return '<span class="error">Node-count limit exceeded</span>';
}
@@ -1340,6 +1339,15 @@ class PPFrame_DOM implements PPFrame {
function isTemplate() {
return false;
}
+
+ /**
+ * Get a title of frame
+ *
+ * @return Title
+ */
+ function getTitle() {
+ return $this->title;
+ }
}
/**
diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php
index c2d7d3d8..2934181a 100644
--- a/includes/parser/Preprocessor_Hash.php
+++ b/includes/parser/Preprocessor_Hash.php
@@ -498,7 +498,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 );
@@ -1268,6 +1268,15 @@ class PPFrame_Hash implements PPFrame {
function isTemplate() {
return false;
}
+
+ /**
+ * Get a title of frame
+ *
+ * @return Title
+ */
+ function getTitle() {
+ return $this->title;
+ }
}
/**
diff --git a/includes/parser/Preprocessor_HipHop.hphp b/includes/parser/Preprocessor_HipHop.hphp
index dc404f7c..f5af0154 100644
--- a/includes/parser/Preprocessor_HipHop.hphp
+++ b/includes/parser/Preprocessor_HipHop.hphp
@@ -260,8 +260,8 @@ class Preprocessor_HipHop implements Preprocessor {
if ( $found === 'angle' ) {
$matches = false;
// Handle </onlyinclude>
- if ( $enableOnlyinclude
- && substr( $text, $i, strlen( '</onlyinclude>' ) ) === '</onlyinclude>' )
+ if ( $enableOnlyinclude
+ && substr( $text, $i, strlen( '</onlyinclude>' ) ) === '</onlyinclude>' )
{
$findOnlyinclude = true;
continue;
@@ -362,7 +362,7 @@ class Preprocessor_HipHop implements Preprocessor {
}
$tagStartPos = $i;
- $inner = $close = '';
+ $close = '';
if ( $text[$tagEndPos-1] === '/' ) {
// Short end tag
$attrEnd = $tagEndPos - 1;
@@ -1008,7 +1008,6 @@ class PPFrame_HipHop implements PPFrame {
*/
var $depth;
-
/**
* Construct a new preprocessor frame.
* @param $preprocessor Preprocessor: the parent preprocessor
@@ -1426,6 +1425,15 @@ class PPFrame_HipHop implements PPFrame {
function isTemplate() {
return false;
}
+
+ /**
+ * Get a title of frame
+ *
+ * @return Title
+ */
+ function getTitle() {
+ return $this->title;
+ }
}
/**
diff --git a/includes/parser/StripState.php b/includes/parser/StripState.php
index a6eff70e..7ad80fa1 100644
--- a/includes/parser/StripState.php
+++ b/includes/parser/StripState.php
@@ -11,6 +11,9 @@ class StripState {
protected $tempType, $tempMergePrefix;
+ /**
+ * @param $prefix string
+ */
function __construct( $prefix ) {
$this->prefix = $prefix;
$this->data = array(
@@ -170,6 +173,10 @@ class StripState {
return $texts;
}
+ /**
+ * @param $m
+ * @return string
+ */
protected function mergeCallback( $m ) {
$key = $m[1];
return "{$this->prefix}{$this->tempMergePrefix}-$key" . Parser::MARKER_SUFFIX;
diff --git a/includes/parser/Tidy.php b/includes/parser/Tidy.php
index 3a6d3e9c..2b98f01d 100644
--- a/includes/parser/Tidy.php
+++ b/includes/parser/Tidy.php
@@ -11,7 +11,7 @@
* we may create a real postprocessor or something that will replace this.
* It's called wrapper because for now it basically takes over MWTidy::tidy's task
* of wrapping the text in a xhtml block
- *
+ *
* This re-uses some of the parser's UNIQ tricks, though some of it is private so it's
* duplicated. Perhaps we should create an abstract marker hiding class.
*/
@@ -40,7 +40,7 @@ class MWTidyWrapper {
$this->mUniqPrefix = "\x7fUNIQ" .
dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) );
$this->mMarkerIndex = 0;
-
+
$wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
array( &$this, 'replaceEditSectionLinksCallback' ), $text );
@@ -126,7 +126,7 @@ class MWTidy {
*/
public static function checkErrors( $text, &$errorStr = null ) {
global $wgTidyInternal;
-
+
$retval = 0;
if( $wgTidyInternal ) {
$errorStr = self::execInternalTidy( $text, true, $retval );
@@ -166,7 +166,7 @@ class MWTidy {
2 => array( 'file', wfGetNull(), 'a' )
);
}
-
+
$readpipe = $stderr ? 2 : 1;
$pipes = array();
@@ -217,7 +217,7 @@ class MWTidy {
if ( !MWInit::classExists( 'tidy' ) ) {
wfWarn( "Unable to load internal tidy class." );
$retval = -1;
-
+
wfProfileOut( __METHOD__ );
return null;
}
@@ -245,7 +245,7 @@ class MWTidy {
"\n-->";
}
}
-
+
wfProfileOut( __METHOD__ );
return $cleansource;
}
diff --git a/includes/profiler/Profiler.php b/includes/profiler/Profiler.php
index 93b03f59..0fe18c25 100644
--- a/includes/profiler/Profiler.php
+++ b/includes/profiler/Profiler.php
@@ -34,26 +34,28 @@ function wfProfileOut( $functionname = 'missing' ) {
* @todo document
*/
class Profiler {
- var $mStack = array (), $mWorkStack = array (), $mCollated = array ();
- var $mCalls = array (), $mTotals = array ();
- var $mTemplated = false;
- var $mTimeMetric = 'wall';
- private $mCollateDone = false;
- protected $mProfileID = false;
+ 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;
function __construct( $params ) {
+ if ( isset( $params['timeMetric'] ) ) {
+ $this->mTimeMetric = $params['timeMetric'];
+ }
+ if ( isset( $params['profileID'] ) ) {
+ $this->mProfileID = $params['profileID'];
+ }
+
// Push an entry for the pre-profile setup time onto the stack
- global $wgRequestTime;
- if ( !empty( $wgRequestTime ) ) {
- $this->mWorkStack[] = array( '-total', 0, $wgRequestTime, 0 );
- $this->mStack[] = array( '-setup', 1, $wgRequestTime, 0, microtime(true), 0 );
+ $initial = $this->getInitialTime();
+ if ( $initial !== null ) {
+ $this->mWorkStack[] = array( '-total', 0, $initial, 0 );
+ $this->mStack[] = array( '-setup', 1, $initial, 0, $this->getTime(), 0 );
} else {
$this->profileIn( '-total' );
}
- if ( isset( $params['timeMetric'] ) ) {
- $this->mTimeMetric = $params['timeMetric'];
- }
}
/**
@@ -64,11 +66,19 @@ class Profiler {
if( is_null( self::$__instance ) ) {
global $wgProfiler;
if( is_array( $wgProfiler ) ) {
- $class = isset( $wgProfiler['class'] ) ? $wgProfiler['class'] : 'ProfilerStub';
+ if( !isset( $wgProfiler['class'] ) ) {
+ wfDebug( __METHOD__ . " called without \$wgProfiler['class']"
+ . " set, falling back to ProfilerStub for safety\n" );
+ $class = 'ProfilerStub';
+ } else {
+ $class = $wgProfiler['class'];
+ }
self::$__instance = new $class( $wgProfiler );
} 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 );
}
}
@@ -141,12 +151,12 @@ class Profiler {
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 );
+ $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 );
+ $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
}
//}
$bit[] = $time;
@@ -256,13 +266,31 @@ class Profiler {
if ( $this->mTimeMetric === 'user' ) {
return $this->getUserTime();
} else {
- return microtime(true);
+ return microtime( true );
}
}
function getUserTime() {
$ru = getrusage();
- return $ru['ru_utime.tv_sec'].' '.$ru['ru_utime.tv_usec'] / 1e6;
+ return $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
+ }
+
+ private function getInitialTime() {
+ global $wgRequestTime, $wgRUstart;
+
+ if ( $this->mTimeMetric === 'user' ) {
+ if ( count( $wgRUstart ) ) {
+ return $wgRUstart['ru_utime.tv_sec'] + $wgRUstart['ru_utime.tv_usec'] / 1e6;
+ } else {
+ return null;
+ }
+ } else {
+ if ( empty( $wgRequestTime ) ) {
+ return null;
+ } else {
+ return $wgRequestTime;
+ }
+ }
}
protected function collateData() {
@@ -344,7 +372,8 @@ class Profiler {
/**
* Returns a list of profiled functions.
- * Also log it into the database if $wgProfileToDatabase is set to true.
+ *
+ * @return string
*/
function getFunctionReport() {
$this->collateData();
diff --git a/includes/profiler/ProfilerSimple.php b/includes/profiler/ProfilerSimple.php
index bbdbec8e..055a0ea0 100644
--- a/includes/profiler/ProfilerSimple.php
+++ b/includes/profiler/ProfilerSimple.php
@@ -115,13 +115,4 @@ class ProfilerSimple extends Profiler {
return 0;
}
}
-
- /* If argument is passed, it assumes that it is dual-format time string, returns proper float time value */
- function getTime($time=null) {
- if ($time==null) {
- return microtime(true);
- }
- list($a,$b)=explode(" ",$time);
- return (float)($a+$b);
- }
}
diff --git a/includes/profiler/ProfilerSimpleText.php b/includes/profiler/ProfilerSimpleText.php
index ef9049fa..3621a41f 100644
--- a/includes/profiler/ProfilerSimpleText.php
+++ b/includes/profiler/ProfilerSimpleText.php
@@ -41,7 +41,6 @@ class ProfilerSimpleText extends ProfilerSimple {
}
}
- /* dense is good */
static function sort( $a, $b ) {
return $a['real'] < $b['real']; /* sort descending by time elapsed */
}
diff --git a/includes/profiler/ProfilerSimpleTrace.php b/includes/profiler/ProfilerSimpleTrace.php
index ba41babc..784609f5 100644
--- a/includes/profiler/ProfilerSimpleTrace.php
+++ b/includes/profiler/ProfilerSimpleTrace.php
@@ -10,7 +10,6 @@
* @ingroup Profiler
*/
class ProfilerSimpleTrace extends ProfilerSimple {
- var $mMinimumTime = 0;
var $trace = "";
var $memory = 0;
@@ -36,7 +35,7 @@ class ProfilerSimpleTrace extends ProfilerSimple {
$this->debug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
}
- list( $ofname, /* $ocount */ , $ortime, $octime ) = array_pop( $this->mWorkStack );
+ list( $ofname, /* $ocount */ , $ortime ) = array_pop( $this->mWorkStack );
if ( !$ofname ) {
$this->trace .= "Profiling error: $functionname\n";
diff --git a/includes/profiler/ProfilerSimpleUDP.php b/includes/profiler/ProfilerSimpleUDP.php
index ed49d5a2..ae607aa6 100644
--- a/includes/profiler/ProfilerSimpleUDP.php
+++ b/includes/profiler/ProfilerSimpleUDP.php
@@ -20,22 +20,34 @@ class ProfilerSimpleUDP extends ProfilerSimple {
return;
}
+ if ( !MWInit::functionExists( 'socket_create' ) ) {
+ # Sockets are not enabled
+ return;
+ }
+
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
- $plength=0;
- $packet="";
- foreach ($this->mCollated as $entry=>$pfdata) {
- $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);
- $length=strlen($pfline);
+ $plength = 0;
+ $packet = "";
+ foreach ( $this->mCollated as $entry => $pfdata ) {
+ 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);
+ $length = strlen( $pfline );
/* printf("<!-- $pfline -->"); */
- if ($length+$plength>1400) {
- socket_sendto($sock,$packet,$plength,0,$wgUDPProfilerHost,$wgUDPProfilerPort);
- $packet="";
- $plength=0;
+ if ( $length + $plength > 1400 ) {
+ socket_sendto( $sock, $packet, $plength, 0, $wgUDPProfilerHost, $wgUDPProfilerPort );
+ $packet = "";
+ $plength = 0;
}
- $packet.=$pfline;
- $plength+=$length;
+ $packet .= $pfline;
+ $plength += $length;
}
- socket_sendto($sock,$packet,$plength,0x100,$wgUDPProfilerHost,$wgUDPProfilerPort);
+ socket_sendto( $sock, $packet, $plength, 0x100, $wgUDPProfilerHost, $wgUDPProfilerPort );
}
}
diff --git a/includes/profiler/ProfilerStub.php b/includes/profiler/ProfilerStub.php
index 58c1975c..1a0933c4 100644
--- a/includes/profiler/ProfilerStub.php
+++ b/includes/profiler/ProfilerStub.php
@@ -12,4 +12,6 @@ class ProfilerStub extends Profiler {
public function profileOut( $fn ) {}
public function getOutput() {}
public function close() {}
+ public function logData() {}
+ public function getCurrentSection() { return ''; }
}
diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php
index 01b70e8e..9175b10d 100644
--- a/includes/resourceloader/ResourceLoader.php
+++ b/includes/resourceloader/ResourceLoader.php
@@ -29,12 +29,21 @@
class ResourceLoader {
/* Protected Static Members */
- protected static $filterCacheVersion = 4;
+ protected static $filterCacheVersion = 7;
+ protected static $requiredSourceProperties = array( 'loadScript' );
/** Array: List of module name/ResourceLoaderModule object pairs */
protected $modules = array();
+
/** Associative array mapping module name to info associative array */
protected $moduleInfos = array();
+
+ /** Associative array mapping framework ids to a list of names of test suite modules */
+ /** like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) */
+ protected $testModuleNames = array();
+
+ /** array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) **/
+ protected $sources = array();
/* Protected Methods */
@@ -178,16 +187,27 @@ class ResourceLoader {
* Registers core modules and runs registration hooks.
*/
public function __construct() {
- global $IP, $wgResourceModules;
+ global $IP, $wgResourceModules, $wgResourceLoaderSources, $wgLoadScript, $wgEnableJavaScriptTest;
wfProfileIn( __METHOD__ );
+ // Add 'local' source first
+ $this->addSource( 'local', array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) ) );
+
+ // Add other sources
+ $this->addSource( $wgResourceLoaderSources );
+
// Register core modules
$this->register( include( "$IP/resources/Resources.php" ) );
// Register extension modules
wfRunHooks( 'ResourceLoaderRegisterModules', array( &$this ) );
$this->register( $wgResourceModules );
+ if ( $wgEnableJavaScriptTest === true ) {
+ $this->registerTestModules();
+ }
+
+
wfProfileOut( __METHOD__ );
}
@@ -208,49 +228,114 @@ class ResourceLoader {
wfProfileIn( __METHOD__ );
// Allow multiple modules to be registered in one call
- if ( is_array( $name ) ) {
- foreach ( $name as $key => $value ) {
- $this->register( $key, $value );
+ $registrations = is_array( $name ) ? $name : array( $name => $info );
+ foreach ( $registrations as $name => $info ) {
+ // Disallow duplicate registrations
+ if ( isset( $this->moduleInfos[$name] ) ) {
+ // A module has already been registered by this name
+ throw new MWException(
+ 'ResourceLoader duplicate registration error. ' .
+ 'Another module has already been registered as ' . $name
+ );
+ }
+
+ // Check $name for illegal characters
+ if ( preg_match( '/[|,!]/', $name ) ) {
+ throw new MWException( "ResourceLoader module name '$name' is invalid. Names may not contain pipes (|), commas (,) or exclamation marks (!)" );
+ }
+
+ // Attach module
+ if ( is_object( $info ) ) {
+ // Old calling convention
+ // Validate the input
+ if ( !( $info instanceof ResourceLoaderModule ) ) {
+ throw new MWException( 'ResourceLoader invalid module error. ' .
+ 'Instances of ResourceLoaderModule expected.' );
+ }
+
+ $this->moduleInfos[$name] = array( 'object' => $info );
+ $info->setName( $name );
+ $this->modules[$name] = $info;
+ } else {
+ // New calling convention
+ $this->moduleInfos[$name] = $info;
}
- wfProfileOut( __METHOD__ );
- return;
}
- // Disallow duplicate registrations
- if ( isset( $this->moduleInfos[$name] ) ) {
- // A module has already been registered by this name
- throw new MWException(
- 'ResourceLoader duplicate registration error. ' .
- 'Another module has already been registered as ' . $name
- );
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ */
+ public function registerTestModules() {
+ 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.' );
}
- // Check $name for illegal characters
- if ( preg_match( '/[|,!]/', $name ) ) {
- throw new MWException( "ResourceLoader module name '$name' is invalid. Names may not contain pipes (|), commas (,) or exclamation marks (!)" );
+ wfProfileIn( __METHOD__ );
+
+ // Get core test suites
+ $testModules = array();
+ $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';
}
- // Attach module
- if ( is_object( $info ) ) {
- // Old calling convention
- // Validate the input
- if ( !( $info instanceof ResourceLoaderModule ) ) {
- throw new MWException( 'ResourceLoader invalid module error. ' .
- 'Instances of ResourceLoaderModule expected.' );
- }
+ foreach( $testModules as $id => $names ) {
+ // Register test modules
+ $this->register( $testModules[$id] );
- $this->moduleInfos[$name] = array( 'object' => $info );
- $info->setName( $name );
- $this->modules[$name] = $info;
- } else {
- // New calling convention
- $this->moduleInfos[$name] = $info;
+ // Keep track of their names so that they can be loaded together
+ $this->testModuleNames[$id] = array_keys( $testModules[$id] );
}
wfProfileOut( __METHOD__ );
}
- /**
+ /**
+ * Add a foreign source of modules.
+ *
+ * Source properties:
+ * 'loadScript': URL (either fully-qualified or protocol-relative) of load.php for this source
+ *
+ * @param $id Mixed: source ID (string), or array( id1 => props1, id2 => props2, ... )
+ * @param $properties Array: source properties
+ */
+ public function addSource( $id, $properties = null) {
+ // Allow multiple sources to be registered in one call
+ if ( is_array( $id ) ) {
+ foreach ( $id as $key => $value ) {
+ $this->addSource( $key, $value );
+ }
+ return;
+ }
+
+ // Disallow duplicates
+ if ( isset( $this->sources[$id] ) ) {
+ throw new MWException(
+ 'ResourceLoader duplicate source addition error. ' .
+ 'Another source has already been registered as ' . $id
+ );
+ }
+
+ // Validate properties
+ foreach ( self::$requiredSourceProperties as $prop ) {
+ if ( !isset( $properties[$prop] ) ) {
+ throw new MWException( "Required property $prop missing from source ID $id" );
+ }
+ }
+
+ $this->sources[$id] = $properties;
+ }
+
+ /**
* Get a list of module names
*
* @return Array: List of module names
@@ -258,6 +343,25 @@ class ResourceLoader {
public function getModuleNames() {
return array_keys( $this->moduleInfos );
}
+
+ /**
+ * Get a list of test module names for one (or all) frameworks.
+ * If the given framework id is unknkown, or if the in-object variable is not an array,
+ * then it will return an empty array.
+ *
+ * @param $framework String: Optional. Get only the test module names for one
+ * particular framework.
+ * @return Array
+ */
+ public function getTestModuleNames( $framework = 'all' ) {
+ if ( $framework == 'all' ) {
+ return $this->testModuleNames;
+ } elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
+ return $this->testModuleNames[$framework];
+ } else {
+ return array();
+ }
+ }
/**
* Get the ResourceLoaderModule object for a given module name.
@@ -292,12 +396,29 @@ class ResourceLoader {
}
/**
+ * Get the list of sources
+ *
+ * @return Array: array( id => array of properties, .. )
+ */
+ public function getSources() {
+ return $this->sources;
+ }
+
+ /**
* Outputs a response to a resource load-request, including a content-type header.
*
* @param $context ResourceLoaderContext: Context in which a response should be formed
*/
public function respond( ResourceLoaderContext $context ) {
- global $wgResourceLoaderMaxage, $wgCacheEpoch;
+ global $wgCacheEpoch, $wgUseFileCache;
+
+ // Use file cache if enabled and available...
+ if ( $wgUseFileCache ) {
+ $fileCache = ResourceFileCache::newFromContext( $context );
+ if ( $this->tryRespondFromFileCache( $fileCache, $context ) ) {
+ return; // output handled
+ }
+ }
// Buffer output to catch warnings. Normally we'd use ob_clean() on the
// top-level output buffer to clear warnings, but that breaks when ob_gzhandler
@@ -329,19 +450,6 @@ class ResourceLoader {
}
}
- // If a version wasn't specified we need a shorter expiry time for updates
- // to propagate to clients quickly
- if ( is_null( $context->getVersion() ) ) {
- $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
- $smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
- }
- // If a version was specified we can use a longer expiry time since changing
- // version numbers causes cache misses
- else {
- $maxage = $wgResourceLoaderMaxage['versioned']['client'];
- $smaxage = $wgResourceLoaderMaxage['versioned']['server'];
- }
-
// Preload information needed to the mtime calculation below
try {
$this->preloadModuleInfo( array_keys( $modules ), $context );
@@ -356,6 +464,9 @@ class ResourceLoader {
// the last modified time
$mtime = wfTimestamp( TS_UNIX, $wgCacheEpoch );
foreach ( $modules as $module ) {
+ /**
+ * @var $module ResourceLoaderModule
+ */
try {
// Calculate maximum modified time
$mtime = max( $mtime, $module->getModifiedTime( $context ) );
@@ -367,6 +478,65 @@ class ResourceLoader {
wfProfileOut( __METHOD__.'-getModifiedTime' );
+ // Send content type and cache related headers
+ $this->sendResponseHeaders( $context, $mtime );
+
+ // If there's an If-Modified-Since header, respond with a 304 appropriately
+ if ( $this->tryRespondLastModified( $context, $mtime ) ) {
+ wfProfileOut( __METHOD__ );
+ return; // output handled (buffers cleared)
+ }
+
+ // Generate a response
+ $response = $this->makeModuleResponse( $context, $modules, $missing );
+
+ // Prepend comments indicating exceptions
+ $response = $errors . $response;
+
+ // Capture any PHP warnings from the output buffer and append them to the
+ // response in a comment if we're in debug mode.
+ if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
+ $response = $this->makeComment( $warnings ) . $response;
+ }
+
+ // Remove the output buffer and output the response
+ ob_end_clean();
+ echo $response;
+
+ // Save response to file cache unless there are errors
+ if ( isset( $fileCache ) && !$errors && !$missing ) {
+ // Cache single modules...and other requests if there are enough hits
+ if ( ResourceFileCache::useFileCache( $context ) ) {
+ if ( $fileCache->isCacheWorthy() ) {
+ $fileCache->saveText( $response );
+ } else {
+ $fileCache->incrMissesRecent( $context->getRequest() );
+ }
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Send content type and last modified headers to the client.
+ * @param $context ResourceLoaderContext
+ * @param $mtime string TS_MW timestamp to use for last-modified
+ * @return void
+ */
+ protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime ) {
+ global $wgResourceLoaderMaxage;
+ // If a version wasn't specified we need a shorter expiry time for updates
+ // to propagate to clients quickly
+ if ( is_null( $context->getVersion() ) ) {
+ $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
+ $smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
+ // If a version was specified we can use a longer expiry time since changing
+ // version numbers causes cache misses
+ } else {
+ $maxage = $wgResourceLoaderMaxage['versioned']['client'];
+ $smaxage = $wgResourceLoaderMaxage['versioned']['server'];
+ }
if ( $context->getOnly() === 'styles' ) {
header( 'Content-Type: text/css; charset=utf-8' );
} else {
@@ -382,7 +552,16 @@ class ResourceLoader {
$exp = min( $maxage, $smaxage );
header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) );
}
+ }
+ /**
+ * If there's an If-Modified-Since header, respond with a 304 appropriately
+ * and clear out the output buffer. If the client cache is too old then do nothing.
+ * @param $context ResourceLoaderContext
+ * @param $mtime string The TS_MW timestamp to check the header against
+ * @return bool True iff 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
// Some clients send "timestamp;length=123". Strip the part after the first ';'
// so we get a valid timestamp.
@@ -410,28 +589,61 @@ class ResourceLoader {
header( 'HTTP/1.0 304 Not Modified' );
header( 'Status: 304 Not Modified' );
- wfProfileOut( __METHOD__ );
- return;
+ return true;
}
}
+ return false;
+ }
- // Generate a response
- $response = $this->makeModuleResponse( $context, $modules, $missing );
-
- // Prepend comments indicating exceptions
- $response = $errors . $response;
-
- // Capture any PHP warnings from the output buffer and append them to the
- // response in a comment if we're in debug mode.
- if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
- $response = $this->makeComment( $warnings ) . $response;
+ /**
+ * Send out code for a response from file cache if possible
+ *
+ * @param $fileCache ObjectFileCache: Cache object for this request URL
+ * @param $context ResourceLoaderContext: Context in which to generate a response
+ * @return bool If this found a cache file and handled the response
+ */
+ protected function tryRespondFromFileCache(
+ ResourceFileCache $fileCache, ResourceLoaderContext $context
+ ) {
+ global $wgResourceLoaderMaxage;
+ // Buffer output to catch warnings.
+ ob_start();
+ // Get the maximum age the cache can be
+ $maxage = is_null( $context->getVersion() )
+ ? $wgResourceLoaderMaxage['unversioned']['server']
+ : $wgResourceLoaderMaxage['versioned']['server'];
+ // Minimum timestamp the cache file must have
+ $good = $fileCache->isCacheGood( wfTimestamp( TS_MW, time() - $maxage ) );
+ 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
+ $good = $fileCache->isCacheGood(); // cache existence check
+ }
}
-
- // Remove the output buffer and output the response
+ if ( $good ) {
+ $ts = $fileCache->cacheTimestamp();
+ // Send content type and cache headers
+ $this->sendResponseHeaders( $context, $ts, false );
+ // If there's an If-Modified-Since header, respond with a 304 appropriately
+ if ( $this->tryRespondLastModified( $context, $ts ) ) {
+ return false; // output handled (buffers cleared)
+ }
+ $response = $fileCache->fetchText();
+ // Capture any PHP warnings from the output buffer and append them to the
+ // response in a comment if we're in debug mode.
+ if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
+ $response = "/*\n$warnings\n*/\n" . $response;
+ }
+ // Remove the output buffer and output the response
+ ob_end_clean();
+ echo $response . "\n/* Cached {$ts} */";
+ return true; // cache hit
+ }
+ // Clear buffer
ob_end_clean();
- echo $response;
- wfProfileOut( __METHOD__ );
+ return false; // cache miss
}
protected function makeComment( $text ) {
@@ -471,6 +683,10 @@ class ResourceLoader {
// Generate output
foreach ( $modules as $name => $module ) {
+ /**
+ * @var $module ResourceLoaderModule
+ */
+
wfProfileIn( __METHOD__ . '-' . $name );
try {
$scripts = '';
@@ -509,8 +725,10 @@ class ResourceLoader {
switch ( $context->getOnly() ) {
case 'scripts':
if ( is_string( $scripts ) ) {
+ // Load scripts raw...
$out .= $scripts;
} elseif ( is_array( $scripts ) ) {
+ // ...except when $scripts is an array of URLs
$out .= self::makeLoaderImplementScript( $name, $scripts, array(), array() );
}
break;
@@ -676,30 +894,31 @@ class ResourceLoader {
* @param $version Integer: Module version number as a timestamp
* @param $dependencies Array: List of module names on which this module depends
* @param $group String: Group which the module is in.
+ * @param $source String: Source of the module, or 'local' if not foreign.
* @param $script String: JavaScript code
*
* @return string
*/
- public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $script ) {
+ public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $source, $script ) {
$script = str_replace( "\n", "\n\t", trim( $script ) );
return Xml::encodeJsCall(
- "( function( name, version, dependencies, group ) {\n\t$script\n} )",
- array( $name, $version, $dependencies, $group ) );
+ "( function( name, version, dependencies, group, source ) {\n\t$script\n} )",
+ array( $name, $version, $dependencies, $group, $source ) );
}
/**
* Returns JS code which calls mw.loader.register with the given
* parameters. Has three calling conventions:
*
- * - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group ):
+ * - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group, $source ):
* Register a single module.
*
* - ResourceLoader::makeLoaderRegisterScript( array( $name1, $name2 ) ):
* Register modules with the given names.
*
* - ResourceLoader::makeLoaderRegisterScript( array(
- * array( $name1, $version1, $dependencies1, $group1 ),
- * array( $name2, $version2, $dependencies1, $group2 ),
+ * array( $name1, $version1, $dependencies1, $group1, $source1 ),
+ * array( $name2, $version2, $dependencies1, $group2, $source2 ),
* ...
* ) ):
* Registers modules with the given names and parameters.
@@ -708,18 +927,42 @@ class ResourceLoader {
* @param $version Integer: Module version number as a timestamp
* @param $dependencies Array: List of module names on which this module depends
* @param $group String: group which the module is in.
+ * @param $source String: source of the module, or 'local' if not foreign
*
* @return string
*/
public static function makeLoaderRegisterScript( $name, $version = null,
- $dependencies = null, $group = 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;
return Xml::encodeJsCall( 'mw.loader.register',
- array( $name, $version, $dependencies, $group ) );
+ array( $name, $version, $dependencies, $group, $source ) );
+ }
+ }
+
+ /**
+ * Returns JS code which calls mw.loader.addSource() with the given
+ * parameters. Has two calling conventions:
+ *
+ * - ResourceLoader::makeLoaderSourcesScript( $id, $properties ):
+ * Register a single source
+ *
+ * - ResourceLoader::makeLoaderSourcesScript( array( $id1 => $props1, $id2 => $props2, ... ) );
+ * Register sources with the given IDs and properties.
+ *
+ * @param $id String: source ID
+ * @param $properties Array: source properties (see addSource())
+ *
+ * @return string
+ */
+ public static function makeLoaderSourcesScript( $id, $properties = null ) {
+ if ( is_array( $id ) ) {
+ return Xml::encodeJsCall( 'mw.loader.addSource', array( $id ) );
+ } else {
+ return Xml::encodeJsCall( 'mw.loader.addSource', array( $id, $properties ) );
}
}
@@ -732,8 +975,7 @@ class ResourceLoader {
* @return string
*/
public static function makeLoaderConditionalScript( $script ) {
- $script = str_replace( "\n", "\n\t", trim( $script ) );
- return "if(window.mw){\n\t$script\n}\n";
+ return "if(window.mw){\n".trim( $script )."\n}";
}
/**
@@ -809,7 +1051,7 @@ class ResourceLoader {
$query = self::makeLoaderQuery( $modules, $lang, $skin, $user, $version, $debug,
$only, $printable, $handheld, $extraQuery
);
-
+
// Prevent the IE6 extension check from being triggered (bug 28840)
// by appending a character that's invalid in Windows extensions ('*')
return wfExpandUrl( wfAppendQuery( $wgLoadScript, $query ) . '&*', PROTO_RELATIVE );
@@ -844,7 +1086,7 @@ class ResourceLoader {
$query['handheld'] = 1;
}
$query += $extraQuery;
-
+
// Make queries uniform in order
ksort( $query );
return $query;
diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php
index 326b7c4a..dd69bb01 100644
--- a/includes/resourceloader/ResourceLoaderContext.php
+++ b/includes/resourceloader/ResourceLoaderContext.php
@@ -21,7 +21,7 @@
*/
/**
- * Object passed around to modules which contains information about the state
+ * Object passed around to modules which contains information about the state
* of a specific loader request
*/
class ResourceLoaderContext {
@@ -42,7 +42,11 @@ class ResourceLoaderContext {
/* Methods */
- public function __construct( ResourceLoader $resourceLoader, WebRequest $request ) {
+ /**
+ * @param $resourceLoader ResourceLoader
+ * @param $request WebRequest
+ */
+ public function __construct( $resourceLoader, WebRequest $request ) {
global $wgDefaultSkin, $wgResourceLoaderDebug;
$this->resourceLoader = $resourceLoader;
@@ -59,11 +63,13 @@ class ResourceLoaderContext {
$this->only = $request->getVal( 'only' );
$this->version = $request->getVal( 'version' );
- if ( !$this->skin ) {
+ $skinnames = Skin::getSkinNames();
+ // If no skin is specified, or we don't recognize the skin, use the default skin
+ if ( !$this->skin || !isset( $skinnames[$this->skin] ) ) {
$this->skin = $wgDefaultSkin;
}
}
-
+
/**
* Expand a string of the form jquery.foo,bar|jquery.ui.baz,quux to
* an array of module names like array( 'jquery.foo', 'jquery.bar',
@@ -101,6 +107,14 @@ class ResourceLoaderContext {
}
/**
+ * Return a dummy ResourceLoaderContext object suitable for passing into things that don't "really" need a context
+ * @return ResourceLoaderContext
+ */
+ public static function newDummyContext() {
+ return new self( null, new FauxRequest( array() ) );
+ }
+
+ /**
* @return ResourceLoader
*/
public function getResourceLoader() {
@@ -150,14 +164,14 @@ class ResourceLoaderContext {
}
/**
- * @return string
+ * @return string|null
*/
public function getSkin() {
return $this->skin;
}
/**
- * @return string
+ * @return string|null
*/
public function getUser() {
return $this->user;
@@ -171,14 +185,14 @@ class ResourceLoaderContext {
}
/**
- * @return String
+ * @return String|null
*/
public function getOnly() {
return $this->only;
}
/**
- * @return String
+ * @return String|null
*/
public function getVersion() {
return $this->version;
@@ -211,7 +225,7 @@ class ResourceLoaderContext {
public function getHash() {
if ( !isset( $this->hash ) ) {
$this->hash = implode( '|', array(
- $this->getLanguage(), $this->getDirection(), $this->skin, $this->user,
+ $this->getLanguage(), $this->getDirection(), $this->skin, $this->user,
$this->debug, $this->only, $this->version
) );
}
diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php
index f38c60ae..3d657e1c 100644
--- a/includes/resourceloader/ResourceLoaderFileModule.php
+++ b/includes/resourceloader/ResourceLoaderFileModule.php
@@ -33,47 +33,74 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
protected $remoteBasePath = '';
/**
* Array: List of paths to JavaScript files to always include
- * @example array( [file-path], [file-path], ... )
+ * @par Usage:
+ * @code
+ * array( [file-path], [file-path], ... )
+ * @endcode
*/
protected $scripts = array();
/**
* Array: List of JavaScript files to include when using a specific language
- * @example array( [language-code] => array( [file-path], [file-path], ... ), ... )
+ * @par Usage:
+ * @code
+ * array( [language-code] => array( [file-path], [file-path], ... ), ... )
+ * @endcode
*/
protected $languageScripts = array();
/**
* Array: List of JavaScript files to include when using a specific skin
- * @example array( [skin-name] => array( [file-path], [file-path], ... ), ... )
+ * @par Usage:
+ * @code
+ * array( [skin-name] => array( [file-path], [file-path], ... ), ... )
+ * @endcode
*/
protected $skinScripts = array();
/**
* Array: List of paths to JavaScript files to include in debug mode
- * @example array( [skin-name] => array( [file-path], [file-path], ... ), ... )
+ * @par Usage:
+ * @code
+ * array( [skin-name] => array( [file-path], [file-path], ... ), ... )
+ * @endcode
*/
protected $debugScripts = array();
/**
* Array: List of paths to JavaScript files to include in the startup module
- * @example array( [file-path], [file-path], ... )
+ * @par Usage:
+ * @code
+ * array( [file-path], [file-path], ... )
+ * @endcode
*/
protected $loaderScripts = array();
/**
* Array: List of paths to CSS files to always include
- * @example array( [file-path], [file-path], ... )
+ * @par Usage:
+ * @code
+ * array( [file-path], [file-path], ... )
+ * @endcode
*/
protected $styles = array();
/**
* Array: List of paths to CSS files to include when using specific skins
- * @example array( [file-path], [file-path], ... )
+ * @par Usage:
+ * @code
+ * array( [file-path], [file-path], ... )
+ * @endcode
*/
protected $skinStyles = array();
/**
* Array: List of modules this module depends on
- * @example array( [file-path], [file-path], ... )
+ * @par Usage:
+ * @code
+ * array( [file-path], [file-path], ... )
+ * @endcode
*/
protected $dependencies = array();
/**
* Array: List of message keys used by this module
- * @example array( [message-key], [message-key], ... )
+ * @par Usage:
+ * @code
+ * array( [message-key], [message-key], ... )
+ * @endcode
*/
protected $messages = array();
/** String: Name of group to load this module in */
@@ -84,12 +111,18 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
protected $debugRaw = true;
/**
* Array: Cache for mtime
- * @example array( [hash] => [mtime], [hash] => [mtime], ... )
+ * @par Usage:
+ * @code
+ * array( [hash] => [mtime], [hash] => [mtime], ... )
+ * @endcode
*/
protected $modifiedTime = array();
/**
* Array: Place where readStyleFile() tracks file dependencies
- * @example array( [file-path], [file-path], ... )
+ * @par Usage:
+ * @code
+ * array( [file-path], [file-path], ... )
+ * @endcode
*/
protected $localFileRefs = array();
@@ -106,6 +139,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
* to $wgScriptPath
*
* Below is a description for the $options array:
+ * @par Construction options:
* @code
* array(
* // Base path to prepend to all local paths in $options. Defaults to $IP
@@ -223,7 +257,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
$files = $this->getScriptFiles( $context );
return $this->readScriptFiles( $files );
}
-
+
+ /**
+ * @param $context ResourceLoaderContext
+ * @return array
+ */
public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
$urls = array();
foreach ( $this->getScriptFiles( $context ) as $file ) {
@@ -232,6 +270,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
return $urls;
}
+ /**
+ * @return bool
+ */
public function supportsURLLoading() {
return $this->debugRaw;
}
@@ -275,6 +316,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
return $styles;
}
+ /**
+ * @param $context ResourceLoaderContext
+ * @return array
+ */
public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
$urls = array();
foreach ( $this->getStyleFiles( $context ) as $mediaType => $list ) {
@@ -377,7 +422,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
wfProfileIn( __METHOD__.'-filemtime' );
- $filesMtime = max( array_map( 'filemtime', $files ) );
+ $filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
wfProfileOut( __METHOD__.'-filemtime' );
$this->modifiedTime[$context->getHash()] = max(
$filesMtime,
@@ -503,10 +548,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
$js = '';
foreach ( array_unique( $scripts ) as $fileName ) {
$localPath = $this->getLocalPath( $fileName );
- $contents = file_get_contents( $localPath );
- if ( $contents === false ) {
+ if ( !file_exists( $localPath ) ) {
throw new MWException( __METHOD__.": script file not found: \"$localPath\"" );
}
+ $contents = file_get_contents( $localPath );
if ( $wgResourceLoaderValidateStaticJS ) {
// Static files don't really need to be checked as often; unlike
// on-wiki module they shouldn't change unexpectedly without
@@ -552,17 +597,18 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
*
* This method can be used as a callback for array_map()
*
- * @param $path String: File path of script file to read
+ * @param $path String: File path of style file to read
* @param $flip bool
*
* @return String: CSS data in script file
+ * @throws MWException if the file doesn't exist
*/
protected function readStyleFile( $path, $flip ) {
$localPath = $this->getLocalPath( $path );
- $style = file_get_contents( $localPath );
- if ( $style === false ) {
+ if ( !file_exists( $localPath ) ) {
throw new MWException( __METHOD__.": style file not found: \"$localPath\"" );
}
+ $style = file_get_contents( $localPath );
if ( $flip ) {
$style = CSSJanus::transform( $style, true, false );
}
@@ -583,6 +629,23 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
/**
+ * Safe version of filemtime(), which doesn't throw a PHP warning if the file doesn't exist
+ * but returns 1 instead.
+ * @param $filename string File name
+ * @return int UNIX timestamp, or 1 if the file doesn't exist
+ */
+ protected static function safeFilemtime( $filename ) {
+ if ( file_exists( $filename ) ) {
+ return filemtime( $filename );
+ } else {
+ // We only ever map this function on an array if we're gonna call max() after,
+ // so return our standard minimum timestamps here. This is 1, not 0, because
+ // wfTimestamp(0) == NOW
+ return 1;
+ }
+ }
+
+ /**
* Get whether CSS for this module should be flipped
* @param $context ResourceLoaderContext
* @return bool
diff --git a/includes/resourceloader/ResourceLoaderFilePageModule.php b/includes/resourceloader/ResourceLoaderFilePageModule.php
index fc9aef1b..e3b719bb 100644
--- a/includes/resourceloader/ResourceLoaderFilePageModule.php
+++ b/includes/resourceloader/ResourceLoaderFilePageModule.php
@@ -1,8 +1,13 @@
<?php
-/*
+/**
* ResourceLoader definition for MediaWiki:Filepage.css
*/
class ResourceLoaderFilePageModule extends ResourceLoaderWikiModule {
+
+ /**
+ * @param $context ResourceLoaderContext
+ * @return array
+ */
protected function getPages( ResourceLoaderContext $context ) {
return array(
'MediaWiki:Filepage.css' => array( 'type' => 'style' ),
diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php
index ae1be5af..1a232ec2 100644
--- a/includes/resourceloader/ResourceLoaderModule.php
+++ b/includes/resourceloader/ResourceLoaderModule.php
@@ -52,11 +52,11 @@ abstract class ResourceLoaderModule {
# limit the types of scripts and styles we allow to load on, say, sensitive special
# pages like Special:UserLogin and Special:Preferences
protected $origin = self::ORIGIN_CORE_SITEWIDE;
-
+
/* Protected Members */
protected $name = null;
-
+
// In-object cache for file dependencies
protected $fileDeps = array();
// In-object cache for message blob mtime
@@ -126,35 +126,36 @@ abstract class ResourceLoaderModule {
// Stub, override expected
return '';
}
-
+
/**
* Get the URL or URLs to load for this module's JS in debug mode.
* The default behavior is to return a load.php?only=scripts URL for
* the module, but file-based modules will want to override this to
* load the files directly.
- *
+ *
* This function is called only when 1) we're in debug mode, 2) there
* is no only= parameter and 3) supportsURLLoading() returns true.
* #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
*/
public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
- global $wgLoadScript; // TODO factor out to ResourceLoader static method and deduplicate from makeResourceLoaderLink()
- $query = array(
- 'modules' => $this->getName(),
- 'only' => 'scripts',
- 'skin' => $context->getSkin(),
- 'user' => $context->getUser(),
- 'debug' => 'true',
- 'version' => $context->getVersion()
+ $url = ResourceLoader::makeLoaderURL(
+ array( $this->getName() ),
+ $context->getLanguage(),
+ $context->getSkin(),
+ $context->getUser(),
+ $context->getVersion(),
+ true, // debug
+ 'scripts', // only
+ $context->getRequest()->getBool( 'printable' ),
+ $context->getRequest()->getBool( 'handheld' )
);
- ksort( $query );
- return array( wfAppendQuery( $wgLoadScript, $query ) . '&*' );
+ return array( $url );
}
-
+
/**
* Whether this module supports URL loading. If this function returns false,
* getScript() will be used even in cases (debug mode, no only param) where
@@ -175,28 +176,29 @@ abstract class ResourceLoaderModule {
// Stub, override expected
return array();
}
-
+
/**
* Get the URL or URLs to load for this module's CSS in debug mode.
* The default behavior is to return a load.php?only=styles URL for
* 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, ... ), ... )
*/
public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
- global $wgLoadScript; // TODO factor out to ResourceLoader static method and deduplicate from makeResourceLoaderLink()
- $query = array(
- 'modules' => $this->getName(),
- 'only' => 'styles',
- 'skin' => $context->getSkin(),
- 'user' => $context->getUser(),
- 'debug' => 'true',
- 'version' => $context->getVersion()
+ $url = ResourceLoader::makeLoaderURL(
+ array( $this->getName() ),
+ $context->getLanguage(),
+ $context->getSkin(),
+ $context->getUser(),
+ $context->getVersion(),
+ true, // debug
+ 'styles', // only
+ $context->getRequest()->getBool( 'printable' ),
+ $context->getRequest()->getBool( 'handheld' )
);
- ksort( $query );
- return array( 'all' => array( wfAppendQuery( $wgLoadScript, $query ) . '&*' ) );
+ return array( 'all' => array( $url ) );
}
/**
@@ -210,17 +212,27 @@ abstract class ResourceLoaderModule {
// Stub, override expected
return array();
}
-
+
/**
* Get the group this module is in.
- *
+ *
* @return String: Group name
*/
public function getGroup() {
// Stub, override expected
return null;
}
-
+
+ /**
+ * Get the origin of this module. Should only be overridden for foreign modules.
+ *
+ * @return String: Origin name, 'local' for local modules
+ */
+ public function getSource() {
+ // Stub, override expected
+ return 'local';
+ }
+
/**
* Where on the HTML page should this module's JS be loaded?
* 'top': in the <head>
@@ -261,7 +273,7 @@ abstract class ResourceLoaderModule {
// Stub, override expected
return array();
}
-
+
/**
* Get the files this module depends on indirectly for a given skin.
* Currently these are only image files referenced by the module's CSS.
@@ -288,7 +300,7 @@ abstract class ResourceLoaderModule {
}
return $this->fileDeps[$skin];
}
-
+
/**
* Set preloaded file dependency information. Used so we can load this
* information for all modules at once.
@@ -298,7 +310,7 @@ abstract class ResourceLoaderModule {
public function setFileDependencies( $skin, $deps ) {
$this->fileDeps[$skin] = $deps;
}
-
+
/**
* Get the last modification timestamp of the message blob for this
* module in a given language.
@@ -309,7 +321,7 @@ abstract class ResourceLoaderModule {
if ( !isset( $this->msgBlobMtime[$lang] ) ) {
if ( !count( $this->getMessages() ) )
return 0;
-
+
$dbr = wfGetDB( DB_SLAVE );
$msgBlobMtime = $dbr->selectField( 'msg_resource', 'mr_timestamp', array(
'mr_resource' => $this->getName(),
@@ -325,7 +337,7 @@ abstract class ResourceLoaderModule {
}
return $this->msgBlobMtime[$lang];
}
-
+
/**
* Set a preloaded message blob last modification timestamp. Used so we
* can load this information for all modules at once.
@@ -335,9 +347,9 @@ abstract class ResourceLoaderModule {
public function setMsgBlobMtime( $lang, $mtime ) {
$this->msgBlobMtime[$lang] = $mtime;
}
-
+
/* Abstract Methods */
-
+
/**
* Get this module's last modification timestamp for a given
* combination of language, skin and debug mode flag. This is typically
@@ -345,6 +357,10 @@ abstract class ResourceLoaderModule {
* timestamps. Whenever anything happens that changes the module's
* contents for these parameters, the mtime should increase.
*
+ * NOTE: The mtime of the module's messages is NOT automatically included.
+ * 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
*/
@@ -352,7 +368,7 @@ abstract class ResourceLoaderModule {
// 0 would mean now
return 1;
}
-
+
/**
* Check whether this module is known to be empty. If a child class
* has an easy and cheap way to determine that this module is
@@ -400,7 +416,7 @@ abstract class ResourceLoaderModule {
$err = $e->getMessage();
$result = "throw new Error(" . Xml::encodeJsVar("JavaScript parse error: $err") . ");";
}
-
+
$cache->set( $key, $result );
return $result;
} else {
@@ -408,6 +424,9 @@ abstract class ResourceLoaderModule {
}
}
+ /**
+ * @return JSParser
+ */
protected static function javaScriptParser() {
if ( !self::$jsParser ) {
self::$jsParser = new JSParser();
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php
index 43f1dbd2..5dbce439 100644
--- a/includes/resourceloader/ResourceLoaderStartUpModule.php
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -38,21 +38,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
$wgVariantArticlePath, $wgActionPaths, $wgUseAjax, $wgVersion,
$wgEnableAPI, $wgEnableWriteAPI, $wgDBname, $wgEnableMWSuggest,
$wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
- $wgCookiePrefix, $wgResourceLoaderMaxQueryLength, $wgLegacyJavaScriptGlobals;
+ $wgCookiePrefix, $wgResourceLoaderMaxQueryLength;
- // Pre-process information
- $separatorTransTable = $wgContLang->separatorTransformTable();
- $separatorTransTable = $separatorTransTable ? $separatorTransTable : array();
- $compactSeparatorTransTable = array(
- implode( "\t", array_keys( $separatorTransTable ) ),
- implode( "\t", $separatorTransTable ),
- );
- $digitTransTable = $wgContLang->digitTransformTable();
- $digitTransTable = $digitTransTable ? $digitTransTable : array();
- $compactDigitTransTable = array(
- implode( "\t", array_keys( $digitTransTable ) ),
- implode( "\t", $digitTransTable ),
- );
$mainPage = Title::newMainPage();
/**
@@ -81,7 +68,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
'wgScriptExtension' => $wgScriptExtension,
'wgScript' => $wgScript,
'wgVariantArticlePath' => $wgVariantArticlePath,
- 'wgActionPaths' => $wgActionPaths,
+ // Force object to avoid "empty" associative array from
+ // becoming [] instead of {} in JS (bug 34604)
+ 'wgActionPaths' => (object)$wgActionPaths,
'wgServer' => $wgServer,
'wgUserLanguage' => $context->getLanguage(),
'wgContentLanguage' => $wgContLang->getCode(),
@@ -91,8 +80,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
'wgDefaultDateFormat' => $wgContLang->getDefaultDateFormat(),
'wgMonthNames' => $wgContLang->getMonthNamesArray(),
'wgMonthNamesShort' => $wgContLang->getMonthAbbreviationsArray(),
- 'wgSeparatorTransformTable' => $compactSeparatorTransTable,
- 'wgDigitTransformTable' => $compactDigitTransTable,
'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
'wgNamespaceIds' => $namespaceIds,
@@ -107,7 +94,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
// MediaWiki sets cookies to have this prefix by default
'wgCookiePrefix' => $wgCookiePrefix,
'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
- 'wgLegacyJavaScriptGlobals' => $wgLegacyJavaScriptGlobals,
'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
);
if ( $wgUseAjax && $wgEnableMWSuggest ) {
@@ -132,6 +118,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
$out = '';
$registrations = array();
$resourceLoader = $context->getResourceLoader();
+
+ // Register sources
+ $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
+
+ // Register modules
foreach ( $resourceLoader->getModuleNames() as $name ) {
$module = $resourceLoader->getModule( $name );
// Support module loader scripts
@@ -139,9 +130,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
if ( $loader !== false ) {
$deps = $module->getDependencies();
$group = $module->getGroup();
+ $source = $module->getSource();
$version = wfTimestamp( TS_ISO_8601_BASIC,
$module->getModifiedTime( $context ) );
- $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $loader );
+ $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
}
// Automatically register module
else {
@@ -149,23 +141,29 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
// seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
$moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
$mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
- // Modules without dependencies or a group pass two arguments (name, timestamp) to
+ // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
// mw.loader.register()
- if ( !count( $module->getDependencies() && $module->getGroup() === null ) ) {
+ if ( !count( $module->getDependencies() && $module->getGroup() === null && $module->getSource() === 'local' ) ) {
$registrations[] = array( $name, $mtime );
}
- // Modules with dependencies but no group pass three arguments
+ // Modules with dependencies but no group or foreign source pass three arguments
// (name, timestamp, dependencies) to mw.loader.register()
- elseif ( $module->getGroup() === null ) {
+ elseif ( $module->getGroup() === null && $module->getSource() === 'local' ) {
$registrations[] = array(
$name, $mtime, $module->getDependencies() );
}
- // Modules with dependencies pass four arguments (name, timestamp, dependencies, group)
+ // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
// to mw.loader.register()
- else {
+ elseif ( $module->getSource() === 'local' ) {
$registrations[] = array(
$name, $mtime, $module->getDependencies(), $module->getGroup() );
}
+ // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+ // to mw.loader.register()
+ else {
+ $registrations[] = array(
+ $name, $mtime, $module->getDependencies(), $module->getGroup(), $module->getSource() );
+ }
}
}
$out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
@@ -229,6 +227,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
return $out;
}
+ /**
+ * @return bool
+ */
public function supportsURLLoading() {
return false;
}
diff --git a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
new file mode 100644
index 00000000..02693d3e
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Trevor Parscal
+ * @author Roan Kattouw
+ */
+
+/**
+ * Module for user preference customizations
+ */
+class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
+
+ /* Protected Members */
+
+ protected $modifiedTime = array();
+
+ protected $origin = self::ORIGIN_CORE_INDIVIDUAL;
+
+ /* Methods */
+
+ /**
+ * @param $context ResourceLoaderContext
+ * @return array|int|Mixed
+ */
+ public function getModifiedTime( ResourceLoaderContext $context ) {
+ $hash = $context->getHash();
+ if ( isset( $this->modifiedTime[$hash] ) ) {
+ return $this->modifiedTime[$hash];
+ }
+
+ global $wgUser;
+ return $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $wgUser->getTouched() );
+ }
+
+ /**
+ * @param $context ResourceLoaderContext
+ * @return array
+ */
+ public function getStyles( ResourceLoaderContext $context ) {
+ global $wgAllowUserCssPrefs, $wgUser;
+
+ if ( $wgAllowUserCssPrefs ) {
+ $options = $wgUser->getOptions();
+
+ // 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(fa),a:lang(kk-arab), ' .
+ 'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
+ }
+ if ( $options['highlightbroken'] ) {
+ $rules[] = "a.new, #quickbar a.new { color: #ba0000; }\n";
+ } else {
+ $rules[] = "a.new, #quickbar a.new, a.stub, #quickbar a.stub { color: inherit; }";
+ $rules[] = "a.new:after, #quickbar a.new:after { content: '?'; color: #ba0000; }";
+ $rules[] = "a.stub:after, #quickbar a.stub:after { content: '!'; color: #772233; }";
+ }
+ if ( $options['justify'] ) {
+ $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
+ }
+ if ( !$options['showtoc'] ) {
+ $rules[] = "#toc { display: none; }\n";
+ }
+ if ( !$options['editsection'] ) {
+ $rules[] = ".editsection { display: none; }\n";
+ }
+ if ( $options['editfont'] !== 'default' ) {
+ $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
+ }
+ $style = implode( "\n", $rules );
+ if ( $this->getFlip( $context ) ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ return array( 'all' => $style );
+ }
+ return array();
+ }
+
+ /**
+ * @return string
+ */
+ public function getGroup() {
+ return 'private';
+ }
+
+ /**
+ * @return array
+ */
+ public function getDependencies() {
+ return array( 'mediawiki.user' );
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php
index 892e8462..338b6322 100644
--- a/includes/resourceloader/ResourceLoaderUserModule.php
+++ b/includes/resourceloader/ResourceLoaderUserModule.php
@@ -34,15 +34,30 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
*/
protected function getPages( ResourceLoaderContext $context ) {
if ( $context->getUser() ) {
+ // Get the normalized title of the user's user page
$username = $context->getUser();
- return array(
- "User:$username/common.js" => array( 'type' => 'script' ),
- "User:$username/" . $context->getSkin() . '.js' =>
+ $userpageTitle = Title::makeTitleSafe( NS_USER, $username );
+ $userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
+
+ $pages = array(
+ "$userpage/common.js" => array( 'type' => 'script' ),
+ "$userpage/" . $context->getSkin() . '.js' =>
array( 'type' => 'script' ),
- "User:$username/common.css" => array( 'type' => 'style' ),
- "User:$username/" . $context->getSkin() . '.css' =>
+ "$userpage/common.css" => array( 'type' => 'style' ),
+ "$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
+ // parameter will be set to the name of the page we need to exclude.
+ $excludepage = $context->getRequest()->getVal( 'excludepage' );
+ if ( isset( $pages[$excludepage] ) ) {
+ // This works because $excludepage is generated with getPrefixedDBkey(),
+ // just like the keys in $pages[] above
+ unset( $pages[$excludepage] );
+ }
+ return $pages;
}
return array();
}
diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
index 78548416..7b162205 100644
--- a/includes/resourceloader/ResourceLoaderUserOptionsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
@@ -42,9 +42,8 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
if ( isset( $this->modifiedTime[$hash] ) ) {
return $this->modifiedTime[$hash];
}
-
+
global $wgUser;
-
return $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $wgUser->getTouched() );
}
@@ -54,59 +53,11 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
*/
public function getScript( ResourceLoaderContext $context ) {
global $wgUser;
- return Xml::encodeJsCall( 'mw.user.options.set',
+ return Xml::encodeJsCall( 'mw.user.options.set',
array( $wgUser->getOptions() ) );
}
/**
- * @param $context ResourceLoaderContext
- * @return array
- */
- public function getStyles( ResourceLoaderContext $context ) {
- global $wgAllowUserCssPrefs, $wgUser;
-
- if ( $wgAllowUserCssPrefs ) {
- $options = $wgUser->getOptions();
-
- // Build CSS rules
- $rules = array();
- 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['highlightbroken'] ) {
- $rules[] = "a.new, #quickbar a.new { color: #ba0000; }\n";
- } else {
- $rules[] = "a.new, #quickbar a.new, a.stub, #quickbar a.stub { color: inherit; }";
- $rules[] = "a.new:after, #quickbar a.new:after { content: '?'; color: #ba0000; }";
- $rules[] = "a.stub:after, #quickbar a.stub:after { content: '!'; color: #772233; }";
- }
- if ( $options['justify'] ) {
- $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
- }
- if ( !$options['showtoc'] ) {
- $rules[] = "#toc { display: none; }\n";
- }
- if ( !$options['editsection'] ) {
- $rules[] = ".editsection { display: none; }\n";
- }
- if ( $options['editfont'] !== 'default' ) {
- $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
- }
- $style = implode( "\n", $rules );
- if ( $this->getFlip( $context ) ) {
- $style = CSSJanus::transform( $style, true, false );
- }
- return array( 'all' => $style );
- }
- return array();
- }
-
- /**
* @return string
*/
public function getGroup() {
diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php
index 9403534c..e1a52388 100644
--- a/includes/resourceloader/ResourceLoaderUserTokensModule.php
+++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php
@@ -32,7 +32,7 @@ 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
*/
@@ -40,7 +40,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
global $wgUser;
return array(
- 'editToken' => $wgUser->edittoken(),
+ 'editToken' => $wgUser->getEditToken(),
'watchToken' => ApiQueryInfo::getWatchToken(null, null),
);
}
@@ -50,7 +50,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
* @return string
*/
public function getScript( ResourceLoaderContext $context ) {
- return Xml::encodeJsCall( 'mw.user.tokens.set',
+ return Xml::encodeJsCall( 'mw.user.tokens.set',
array( $this->contextUserTokens( $context ) ) );
}
diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php
index bad61cb9..91a51f89 100644
--- a/includes/resourceloader/ResourceLoaderWikiModule.php
+++ b/includes/resourceloader/ResourceLoaderWikiModule.php
@@ -24,28 +24,47 @@ defined( 'MEDIAWIKI' ) || die( 1 );
/**
* Abstraction for resource loader modules which pull from wiki pages
- *
- * This can only be used for wiki pages in the MediaWiki and User namespaces,
- * because of its dependence on the functionality of
- * Title::isValidCssJsSubpage.
+ *
+ * This can only be used for wiki pages in the MediaWiki and User namespaces,
+ * because of its dependence on the functionality of
+ * Title::isCssJsSubpage.
*/
abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
-
+
/* Protected Members */
# Origin is user-supplied code
protected $origin = self::ORIGIN_USER_SITEWIDE;
-
+
// In-object cache for title mtimes
protected $titleMtimes = array();
-
+
/* Abstract Protected Methods */
-
+
+ /**
+ * @abstract
+ * @param $context ResourceLoaderContext
+ */
abstract protected function getPages( ResourceLoaderContext $context );
-
+
/* Protected Methods */
/**
+ * Get the Database object used in getTitleMTimes(). Defaults to the local slave DB
+ * but subclasses may want to override this to return a remote DB object, or to return
+ * null if getTitleMTimes() shouldn't access the DB at all.
+ *
+ * NOTE: This ONLY works for getTitleMTimes() and getModifiedTime(), NOT FOR ANYTHING ELSE.
+ * In particular, it doesn't work for getting the content of JS and CSS pages. That functionality
+ * will use the local DB irrespective of the return value of this method.
+ *
+ * @return DatabaseBase|null
+ */
+ protected function getDB() {
+ return wfGetDB( DB_SLAVE );
+ }
+
+ /**
* @param $title Title
* @return null|string
*/
@@ -54,7 +73,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
$message = wfMessage( $title->getDBkey() )->inContentLanguage();
return $message->exists() ? $message->plain() : '';
}
- if ( !$title->isCssJsSubpage() ) {
+ if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
return null;
}
$revision = Revision::newFromTitle( $title );
@@ -63,7 +82,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
}
return $revision->getRawText();
}
-
+
/* Methods */
/**
@@ -98,7 +117,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
*/
public function getStyles( ResourceLoaderContext $context ) {
global $wgScriptPath;
-
+
$styles = array();
foreach ( $this->getPages( $context ) as $titleText => $options ) {
if ( $options['type'] !== 'style' ) {
@@ -107,7 +126,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
$title = Title::newFromText( $titleText );
if ( !$title || $title->isRedirect() ) {
continue;
- }
+ }
$media = isset( $options['media'] ) ? $options['media'] : 'all';
$style = $this->getContent( $title );
if ( strval( $style ) === '' ) {
@@ -138,6 +157,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
if ( count( $mtimes ) ) {
$modifiedTime = max( $modifiedTime, max( $mtimes ) );
}
+ $modifiedTime = max( $modifiedTime, $this->getMsgBlobMtime( $context->getLanguage() ) );
return $modifiedTime;
}
@@ -156,19 +176,24 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
* @return array( prefixed DB key => UNIX timestamp ), nonexistent titles are dropped
*/
protected function getTitleMtimes( ResourceLoaderContext $context ) {
+ $dbr = $this->getDB();
+ if ( !$dbr ) {
+ // We're dealing with a subclass that doesn't have a DB
+ return array();
+ }
+
$hash = $context->getHash();
if ( isset( $this->titleMtimes[$hash] ) ) {
return $this->titleMtimes[$hash];
}
-
+
$this->titleMtimes[$hash] = array();
$batch = new LinkBatch;
foreach ( $this->getPages( $context ) as $titleText => $options ) {
$batch->addObj( Title::newFromText( $titleText ) );
}
-
+
if ( !$batch->isEmpty() ) {
- $dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'page',
array( 'page_namespace', 'page_title', 'page_touched' ),
$batch->constructSet( 'page', $dbr ),
diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php
index b329fc4b..6cee6246 100644
--- a/includes/revisiondelete/RevisionDelete.php
+++ b/includes/revisiondelete/RevisionDelete.php
@@ -25,14 +25,18 @@ class RevDel_RevisionList extends RevDel_List {
*/
public function doQuery( $db ) {
$ids = array_map( 'intval', $this->ids );
- $live = $db->select( array('revision','page'), '*',
+ $live = $db->select(
+ array( 'revision', 'page', 'user' ),
+ array_merge( Revision::selectFields(), Revision::selectUserFields() ),
array(
'rev_page' => $this->title->getArticleID(),
'rev_id' => $ids,
- 'rev_page = page_id'
),
__METHOD__,
- array( 'ORDER BY' => 'rev_id DESC' )
+ array( 'ORDER BY' => 'rev_id DESC' ),
+ array(
+ 'page' => Revision::pageJoinCond(),
+ 'user' => Revision::userJoinCond() )
);
if ( $live->numRows() >= count( $ids ) ) {
@@ -128,19 +132,19 @@ class RevDel_RevisionItem extends RevDel_Item {
}
public function getAuthorNameField() {
- return 'rev_user_text';
+ return 'user_name'; // see Revision::selectUserFields()
}
public function canView() {
- return $this->revision->userCan( Revision::DELETED_RESTRICTED );
+ return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->list->getUser() );
}
public function canViewContent() {
- return $this->revision->userCan( Revision::DELETED_TEXT );
+ return $this->revision->userCan( Revision::DELETED_TEXT, $this->list->getUser() );
}
public function getBits() {
- return $this->revision->mDeleted;
+ return $this->revision->getVisibility();
}
public function setBits( $bits ) {
@@ -189,7 +193,7 @@ class RevDel_RevisionItem extends RevDel_Item {
* Overridden by RevDel_ArchiveItem.
*/
protected function getRevisionLink() {
- $date = $this->list->getLang()->timeanddate( $this->revision->getTimestamp(), true );
+ $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
if ( $this->isDeleted() && !$this->canViewContent() ) {
return $date;
}
@@ -336,7 +340,7 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
protected function getRevisionLink() {
$undelete = SpecialPage::getTitleFor( 'Undelete' );
- $date = $this->list->getLang()->timeanddate( $this->revision->getTimestamp(), true );
+ $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
if ( $this->isDeleted() && !$this->canViewContent() ) {
return $date;
}
@@ -509,11 +513,11 @@ class RevDel_FileItem extends RevDel_Item {
}
public function canView() {
- return $this->file->userCan( File::DELETED_RESTRICTED );
+ return $this->file->userCan( File::DELETED_RESTRICTED, $this->list->getUser() );
}
public function canViewContent() {
- return $this->file->userCan( File::DELETED_FILE );
+ return $this->file->userCan( File::DELETED_FILE, $this->list->getUser() );
}
public function getBits() {
@@ -567,7 +571,7 @@ class RevDel_FileItem extends RevDel_Item {
* Overridden by RevDel_ArchivedFileItem.
*/
protected function getLink() {
- $date = $this->list->getLang()->timeanddate( $this->file->getTimestamp(), true );
+ $date = $this->list->getLanguage()->timeanddate( $this->file->getTimestamp(), true );
if ( $this->isDeleted() ) {
# Hidden files...
if ( !$this->canViewContent() ) {
@@ -580,7 +584,7 @@ class RevDel_FileItem extends RevDel_Item {
array(
'target' => $this->list->title->getPrefixedText(),
'file' => $this->file->getArchiveName(),
- 'token' => $this->list->getUser()->editToken(
+ 'token' => $this->list->getUser()->getEditToken(
$this->file->getArchiveName() )
)
);
@@ -596,7 +600,7 @@ class RevDel_FileItem extends RevDel_Item {
* @return string HTML
*/
protected function getUserTools() {
- if( $this->file->userCan( Revision::DELETED_USER ) ) {
+ 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 {
@@ -615,7 +619,7 @@ class RevDel_FileItem extends RevDel_Item {
* @return string HTML
*/
protected function getComment() {
- if( $this->file->userCan( File::DELETED_COMMENT ) ) {
+ if( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
$block = Linker::commentBlock( $this->file->description );
} else {
$block = ' ' . wfMsgHtml( 'rev-deleted-comment' );
@@ -630,11 +634,11 @@ class RevDel_FileItem extends RevDel_Item {
$data =
wfMsg(
'widthheight',
- $this->list->getLang()->formatNum( $this->file->getWidth() ),
- $this->list->getLang()->formatNum( $this->file->getHeight() )
+ $this->list->getLanguage()->formatNum( $this->file->getWidth() ),
+ $this->list->getLanguage()->formatNum( $this->file->getHeight() )
) .
' (' .
- wfMsgExt( 'nbytes', 'parsemag', $this->list->getLang()->formatNum( $this->file->getSize() ) ) .
+ wfMsgExt( 'nbytes', 'parsemag', $this->list->getLanguage()->formatNum( $this->file->getSize() ) ) .
')';
return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
@@ -718,7 +722,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
}
protected function getLink() {
- $date = $this->list->getLang()->timeanddate( $this->file->getTimestamp(), true );
+ $date = $this->list->getLanguage()->timeanddate( $this->file->getTimestamp(), true );
$undelete = SpecialPage::getTitleFor( 'Undelete' );
$key = $this->file->getKey();
# Hidden files...
@@ -729,7 +733,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
array(
'target' => $this->list->title->getPrefixedText(),
'file' => $key,
- 'token' => $this->list->getUser()->editToken( $key )
+ 'token' => $this->list->getUser()->getEditToken( $key )
)
);
}
@@ -807,7 +811,7 @@ class RevDel_LogItem extends RevDel_Item {
}
public function canView() {
- return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED );
+ return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED, $this->list->getUser() );
}
public function canViewContent() {
@@ -843,9 +847,10 @@ class RevDel_LogItem extends RevDel_Item {
}
public function getHTML() {
- $date = htmlspecialchars( $this->list->getLang()->timeanddate( $this->row->log_timestamp ) );
- $paramArray = LogPage::extractParams( $this->row->log_params );
+ $date = htmlspecialchars( $this->list->getLanguage()->timeanddate( $this->row->log_timestamp ) );
$title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title );
+ $formatter = LogFormatter::newFromRow( $this->row );
+ $formatter->setAudience( LogFormatter::FOR_THIS_USER );
// Log link for this page
$loglink = Linker::link(
@@ -854,27 +859,14 @@ class RevDel_LogItem extends RevDel_Item {
array(),
array( 'page' => $title->getPrefixedText() )
);
- // Action text
- if( !$this->canView() ) {
- $action = '<span class="history-deleted">' . wfMsgHtml('rev-deleted-event') . '</span>';
- } else {
- $skin = $this->list->getUser()->getSkin();
- $action = LogPage::actionText( $this->row->log_type, $this->row->log_action,
- $title, $skin, $paramArray, true, true );
- if( $this->row->log_deleted & LogPage::DELETED_ACTION )
- $action = '<span class="history-deleted">' . $action . '</span>';
- }
- // User links
- $userLink = Linker::userLink( $this->row->log_user,
- User::WhoIs( $this->row->log_user ) );
- if( LogEventsList::isDeleted($this->row,LogPage::DELETED_USER) ) {
- $userLink = '<span class="history-deleted">' . $userLink . '</span>';
- }
+ // User links and action text
+ $action = $formatter->getActionText();
// Comment
- $comment = $this->list->getLang()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
+ $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
if( LogEventsList::isDeleted($this->row,LogPage::DELETED_COMMENT) ) {
$comment = '<span class="history-deleted">' . $comment . '</span>';
}
- return "<li>($loglink) $date $userLink $action $comment</li>";
+
+ return "<li>($loglink) $date $action $comment</li>";
}
}
diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php
index 73af1e5f..dc7af194 100644
--- a/includes/revisiondelete/RevisionDeleteAbstracts.php
+++ b/includes/revisiondelete/RevisionDeleteAbstracts.php
@@ -6,7 +6,7 @@
* relevant rows, to return RevDel_Item subclasses wrapping them, and
* to wrap bulk update operations.
*/
-abstract class RevDel_List extends Rev_List {
+abstract class RevDel_List extends RevisionListBase {
function __construct( IContextSource $context, Title $title, array $ids ) {
parent::__construct( $context, $title );
$this->ids = $ids;
@@ -242,7 +242,7 @@ abstract class RevDel_List extends Rev_List {
/**
* Abstract base class for deletable items
*/
-abstract class RevDel_Item extends Rev_Item {
+abstract class RevDel_Item extends RevisionItemBase {
/**
* Returns true if the item is "current", and the operation to set the given
* bits can't be executed for that reason
diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php
index bde586c5..59a9fa82 100644
--- a/includes/revisiondelete/RevisionDeleter.php
+++ b/includes/revisiondelete/RevisionDeleter.php
@@ -28,18 +28,24 @@ class RevisionDeleter {
}
/**
- * Gets an array of message keys describing the changes made to the visibility
- * of the revision. If the resulting array is $arr, then $arr[0] will contain an
- * array of strings describing the items that were hidden, $arr[2] will contain
- * an array of strings describing the items that were unhidden, and $arr[3] will
- * contain an array with a single string, which can be one of "applied
- * restrictions to sysops", "removed restrictions from sysops", or null.
+ * Gets an array of message keys describing the changes made to the
+ * visibility of the revision.
+ *
+ * If the resulting array is $arr, then $arr[0] will contain an array of
+ * keys describing the items that were hidden, $arr[1] will contain
+ * an array of keys describing the items that were unhidden, and $arr[2]
+ * will contain an array with a single message key, which can be one of
+ * "revdelete-restricted", "revdelete-unrestricted" indicating (un)suppression
+ * or null to indicate nothing in particular.
+ * You can turn the keys in $arr[0] and $arr[1] into message keys by
+ * appending -hid and and -unhid to the keys respectively.
*
* @param $n Integer: the new bitfield.
* @param $o Integer: the old bitfield.
* @return An array as described above.
+ * @since 1.19 public
*/
- protected static function getChanges( $n, $o ) {
+ public static function getChanges( $n, $o ) {
$diff = $n ^ $o;
$ret = array( 0 => array(), 1 => array(), 2 => array() );
// Build bitfield changes in language
@@ -59,51 +65,11 @@ class RevisionDeleter {
return $ret;
}
- /**
- * Gets a log message to describe the given revision visibility change. This
- * message will be of the form "[hid {content, edit summary, username}];
- * [unhid {...}][applied restrictions to sysops] for $count revisions: $comment".
- *
- * @param $count Integer: The number of effected revisions.
- * @param $nbitfield Integer: The new bitfield for the revision.
- * @param $obitfield Integer: The old bitfield for the revision.
- * @param $language Language object to use
- * @param $isForLog Boolean
+ /** Get DB field name for URL param...
+ * Future code for other things may also track
+ * other types of revision-specific changes.
+ * @return string One of log_id/rev_id/fa_id/ar_timestamp/oi_archive_name
*/
- public static function getLogMessage( $count, $nbitfield, $obitfield, $language, $isForLog = false ) {
- $changes = self::getChanges( $nbitfield, $obitfield );
- array_walk( $changes, array( __CLASS__, 'expandMessageArray' ), $language );
-
- $changesText = array();
-
- if( count( $changes[0] ) ) {
- $changesText[] = wfMsgExt( 'revdelete-hid', array( 'parsemag', 'language' => $language ), $language->commaList( $changes[0] ) );
- }
- if( count( $changes[1] ) ) {
- $changesText[] = wfMsgExt( 'revdelete-unhid', array( 'parsemag', 'language' => $language ), $language->commaList( $changes[1] ) );
- }
-
- $s = $language->semicolonList( $changesText );
- if( count( $changes[2] ) ) {
- $s .= $s ? ' (' . $changes[2][0] . ')' : ' ' . $changes[2][0];
- }
-
- $msg = $isForLog ? 'logdelete-log-message' : 'revdelete-log-message';
- return wfMsgExt( $msg, array( 'parsemag', 'language' => $language ), $s, $language->formatNum($count) );
- }
-
- private static function expandMessageArray( &$msg, $key, $language ) {
- if ( is_array ( $msg ) ) {
- array_walk( $msg, array( __CLASS__, 'expandMessageArray' ), $language );
- } else {
- $msg = wfMsgExt( $msg, array( 'parsemag', 'language' => $language ) );
- }
- }
-
- // Get DB field name for URL param...
- // Future code for other things may also track
- // other types of revision-specific changes.
- // @returns string One of log_id/rev_id/fa_id/ar_timestamp/oi_archive_name
public static function getRelationType( $typeName ) {
if ( isset( SpecialRevisionDelete::$deprecatedTypeMap[$typeName] ) ) {
$typeName = SpecialRevisionDelete::$deprecatedTypeMap[$typeName];
@@ -147,16 +113,15 @@ class RevisionDeleter {
*
* @param $title Title
* @param $paramArray Array
- * @param $skin Skin
* @param $messages
* @return String
*/
- public static function getLogLinks( $title, $paramArray, $skin, $messages ) {
+ public static function getLogLinks( $title, $paramArray, $messages ) {
global $wgLang;
if ( count( $paramArray ) >= 2 ) {
// Different revision types use different URL params...
- $originalKey = $key = $paramArray[0];
+ $key = $paramArray[0];
// $paramArray[1] is a CSV of the IDs
$Ids = explode( ',', $paramArray[1] );
@@ -166,19 +131,18 @@ class RevisionDeleter {
if ( count( $Ids ) == 1 ) {
// Live revision diffs...
if ( in_array( $key, array( 'oldid', 'revision' ) ) ) {
- $revert[] = $skin->link(
+ $revert[] = Linker::linkKnown(
$title,
$messages['diff'],
array(),
array(
'diff' => intval( $Ids[0] ),
'unhide' => 1
- ),
- array( 'known', 'noclasses' )
+ )
);
// Deleted revision diffs...
} elseif ( in_array( $key, array( 'artimestamp','archive' ) ) ) {
- $revert[] = $skin->link(
+ $revert[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Undelete' ),
$messages['diff'],
array(),
@@ -186,14 +150,13 @@ class RevisionDeleter {
'target' => $title->getPrefixedDBKey(),
'diff' => 'prev',
'timestamp' => $Ids[0]
- ),
- array( 'known', 'noclasses' )
+ )
);
}
}
// View/modify link...
- $revert[] = $skin->link(
+ $revert[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Revisiondelete' ),
$messages['revdel-restore'],
array(),
@@ -201,8 +164,7 @@ class RevisionDeleter {
'target' => $title->getPrefixedText(),
'type' => $key,
'ids' => implode(',', $Ids),
- ),
- array( 'known', 'noclasses' )
+ )
);
// Pipe links
diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php
index 40b992de..2f7dfd7e 100644
--- a/includes/search/SearchEngine.php
+++ b/includes/search/SearchEngine.php
@@ -67,6 +67,7 @@ class SearchEngine {
* @deprecated since 1.18 Call supports( 'list-redirects' );
*/
function acceptListRedirects() {
+ wfDeprecated( __METHOD__, '1.18' );
return $this->supports( 'list-redirects' );
}
@@ -148,7 +149,7 @@ class SearchEngine {
* Really find the title match.
*/
private static function getNearMatchInternal( $searchterm ) {
- global $wgContLang;
+ global $wgContLang, $wgEnableSearchContributorsByIP;
$allSearchTerms = array( $searchterm );
@@ -161,8 +162,6 @@ class SearchEngine {
return $titleResult;
}
- $context = new RequestContext;
-
foreach ( $allSearchTerms as $term ) {
# Exact match? No need to look further.
@@ -171,14 +170,13 @@ class SearchEngine {
return null;
}
- if ( $title->getNamespace() == NS_SPECIAL || $title->isExternal() || $title->exists() ) {
+ if ( $title->isSpecialPage() || $title->isExternal() || $title->exists() ) {
return $title;
}
# See if it still otherwise has content is some sane sense
- $context->setTitle( $title );
- $article = Article::newFromTitle( $title, $context );
- if ( $article->hasViewableContent() ) {
+ $page = WikiPage::factory( $title );
+ if ( $page->hasViewableContent() ) {
return $title;
}
@@ -218,10 +216,13 @@ class SearchEngine {
$title = Title::newFromText( $searchterm );
+
# Entering an IP address goes to the contributions page
- if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
- || User::isIP( trim( $searchterm ) ) ) {
- return SpecialPage::getTitleFor( 'Contributions', $title->getDBkey() );
+ if ( $wgEnableSearchContributorsByIP ) {
+ if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
+ || User::isIP( trim( $searchterm ) ) ) {
+ return SpecialPage::getTitleFor( 'Contributions', $title->getDBkey() );
+ }
}
@@ -343,20 +344,22 @@ class SearchEngine {
public static function userNamespaces( $user ) {
global $wgSearchEverythingOnlyLoggedIn;
- // get search everything preference, that can be set to be read for logged-in users
- $searcheverything = false;
- if ( ( $wgSearchEverythingOnlyLoggedIn && $user->isLoggedIn() )
- || !$wgSearchEverythingOnlyLoggedIn )
- $searcheverything = $user->getOption( 'searcheverything' );
-
- // searcheverything overrides other options
- if ( $searcheverything )
- return array_keys( SearchEngine::searchableNamespaces() );
-
- $arr = Preferences::loadOldSearchNs( $user );
$searchableNamespaces = SearchEngine::searchableNamespaces();
- $arr = array_intersect( $arr, array_keys( $searchableNamespaces ) ); // Filter
+ // get search everything preference, that can be set to be read for logged-in users
+ // it overrides other options
+ if ( !$wgSearchEverythingOnlyLoggedIn || $user->isLoggedIn() ) {
+ if ( $user->getOption( 'searcheverything' ) ) {
+ return array_keys( $searchableNamespaces );
+ }
+ }
+
+ $arr = array();
+ foreach ( $searchableNamespaces as $ns => $name ) {
+ if ( $user->getOption( 'searchNs' . $ns ) ) {
+ $arr[] = $ns;
+ }
+ }
return $arr;
}
@@ -1098,7 +1101,7 @@ class SearchHighlighter {
} else {
// if begin of the article contains the whole phrase, show only that !!
if ( array_key_exists( $first, $snippets ) && preg_match( $pat1, $snippets[$first] )
- && $offsets[$first] < $contextchars * 2 ) {
+ && $offsets[$first] < $contextchars * 2 ) {
$snippets = array ( $first => $snippets[$first] );
}
@@ -1119,10 +1122,10 @@ class SearchHighlighter {
// add more lines
$add = $index + 1;
while ( $len < $targetchars - 20
- && array_key_exists( $add, $all )
- && !array_key_exists( $add, $snippets ) ) {
- $offsets[$add] = 0;
- $tt = "\n" . $this->extract( $all[$add], 0, $targetchars - $len, $offsets[$add] );
+ && array_key_exists( $add, $all )
+ && !array_key_exists( $add, $snippets ) ) {
+ $offsets[$add] = 0;
+ $tt = "\n" . $this->extract( $all[$add], 0, $targetchars - $len, $offsets[$add] );
$extended[$add] = $tt;
$len += strlen( $tt );
$add++;
@@ -1152,7 +1155,7 @@ class SearchHighlighter {
if ( ! isset( $processed[$term] ) ) {
$pat3 = "/$patPre(" . $term . ")$patPost/ui"; // highlight word
$extract = preg_replace( $pat3,
- "\\1<span class='searchmatch'>\\2</span>\\3", $extract );
+ "\\1<span class='searchmatch'>\\2</span>\\3", $extract );
$processed[$term] = true;
}
}
@@ -1187,8 +1190,9 @@ class SearchHighlighter {
global $wgContLang;
if ( strlen( $matches[0] ) > 1 ) {
return '[' . $wgContLang->lc( $matches[0] ) . $wgContLang->uc( $matches[0] ) . ']';
- } else
+ } else {
return $matches[0];
+ }
}
/**
@@ -1202,22 +1206,27 @@ class SearchHighlighter {
* @return String
*/
function extract( $text, $start, $end, &$posStart = null, &$posEnd = null ) {
- if ( $start != 0 )
+ if ( $start != 0 ) {
$start = $this->position( $text, $start, 1 );
- if ( $end >= strlen( $text ) )
+ }
+ if ( $end >= strlen( $text ) ) {
$end = strlen( $text );
- else
+ } else {
$end = $this->position( $text, $end );
+ }
- if ( !is_null( $posStart ) )
+ if ( !is_null( $posStart ) ) {
$posStart = $start;
- if ( !is_null( $posEnd ) )
+ }
+ if ( !is_null( $posEnd ) ) {
$posEnd = $end;
+ }
- if ( $end > $start )
+ if ( $end > $start ) {
return substr( $text, $start, $end - $start );
- else
+ } else {
return '';
+ }
}
/**
@@ -1342,61 +1351,61 @@ class SearchHighlighter {
}
/**
- * Simple & fast snippet extraction, but gives completely unrelevant
- * snippets
- *
- * @param $text String
- * @param $terms Array
- * @param $contextlines Integer
- * @param $contextchars Integer
- * @return String
- */
- public function highlightSimple( $text, $terms, $contextlines, $contextchars ) {
- global $wgContLang;
- $fname = __METHOD__;
-
- $lines = explode( "\n", $text );
-
- $terms = implode( '|', $terms );
- $max = intval( $contextchars ) + 1;
- $pat1 = "/(.*)($terms)(.{0,$max})/i";
-
- $lineno = 0;
-
- $extract = "";
- wfProfileIn( "$fname-extract" );
- foreach ( $lines as $line ) {
- if ( 0 == $contextlines ) {
- break;
- }
- ++$lineno;
- $m = array();
- if ( ! preg_match( $pat1, $line, $m ) ) {
- continue;
- }
- --$contextlines;
- // truncate function changes ... to relevant i18n message.
- $pre = $wgContLang->truncate( $m[1], - $contextchars, '...', false );
-
- if ( count( $m ) < 3 ) {
- $post = '';
- } else {
- $post = $wgContLang->truncate( $m[3], $contextchars, '...', false );
- }
-
- $found = $m[2];
-
- $line = htmlspecialchars( $pre . $found . $post );
- $pat2 = '/(' . $terms . ")/i";
- $line = preg_replace( $pat2,
- "<span class='searchmatch'>\\1</span>", $line );
-
- $extract .= "${line}\n";
- }
- wfProfileOut( "$fname-extract" );
-
- return $extract;
- }
+ * Simple & fast snippet extraction, but gives completely unrelevant
+ * snippets
+ *
+ * @param $text String
+ * @param $terms Array
+ * @param $contextlines Integer
+ * @param $contextchars Integer
+ * @return String
+ */
+ public function highlightSimple( $text, $terms, $contextlines, $contextchars ) {
+ global $wgContLang;
+ $fname = __METHOD__;
+
+ $lines = explode( "\n", $text );
+
+ $terms = implode( '|', $terms );
+ $max = intval( $contextchars ) + 1;
+ $pat1 = "/(.*)($terms)(.{0,$max})/i";
+
+ $lineno = 0;
+
+ $extract = "";
+ wfProfileIn( "$fname-extract" );
+ foreach ( $lines as $line ) {
+ if ( 0 == $contextlines ) {
+ break;
+ }
+ ++$lineno;
+ $m = array();
+ if ( ! preg_match( $pat1, $line, $m ) ) {
+ continue;
+ }
+ --$contextlines;
+ // truncate function changes ... to relevant i18n message.
+ $pre = $wgContLang->truncate( $m[1], - $contextchars, '...', false );
+
+ if ( count( $m ) < 3 ) {
+ $post = '';
+ } else {
+ $post = $wgContLang->truncate( $m[3], $contextchars, '...', false );
+ }
+
+ $found = $m[2];
+
+ $line = htmlspecialchars( $pre . $found . $post );
+ $pat2 = '/(' . $terms . ")/i";
+ $line = preg_replace( $pat2,
+ "<span class='searchmatch'>\\1</span>", $line );
+
+ $extract .= "${line}\n";
+ }
+ wfProfileOut( "$fname-extract" );
+
+ return $extract;
+ }
}
diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php
index c52c9e5b..af8f3875 100644
--- a/includes/search/SearchMySQL.php
+++ b/includes/search/SearchMySQL.php
@@ -45,7 +45,7 @@ class SearchMySQL extends SearchEngine {
* become part of a WHERE clause
*
* @param $filteredText string
- * @param $fullText string
+ * @param $fulltext string
*
* @return string
*/
@@ -290,6 +290,7 @@ class SearchMySQL extends SearchEngine {
/**
* Get the base part of the search query.
*
+ * @param &$query Search query array
* @param $filteredTerm String
* @param $fulltext Boolean
* @since 1.18 (changed)
diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php
index 85337ca1..2d6fc3e2 100644
--- a/includes/search/SearchOracle.php
+++ b/includes/search/SearchOracle.php
@@ -257,9 +257,9 @@ class SearchOracle extends SearchEngine {
// ALTER SESSION SET CURRENT_SCHEMA = ...
// was used.
$dbw->query( "CALL ctx_ddl.sync_index(" .
- $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_text_idx', false ) ) . ")" );
+ $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_text_idx', 'raw' ) ) . ")" );
$dbw->query( "CALL ctx_ddl.sync_index(" .
- $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_title_idx', false ) ) . ")" );
+ $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_title_idx', 'raw' ) ) . ")" );
}
/**
diff --git a/includes/search/SearchUpdate.php b/includes/search/SearchUpdate.php
index f79092cb..a162d2b3 100644
--- a/includes/search/SearchUpdate.php
+++ b/includes/search/SearchUpdate.php
@@ -13,7 +13,7 @@
*
* @ingroup Search
*/
-class SearchUpdate {
+class SearchUpdate implements DeferrableUpdate {
private $mId = 0, $mNamespace, $mTitle, $mText;
private $mTitleWords;
@@ -37,7 +37,7 @@ class SearchUpdate {
global $wgContLang, $wgDisableSearchUpdate;
if( $wgDisableSearchUpdate || !$this->mId ) {
- return false;
+ return;
}
wfProfileIn( __METHOD__ );
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
index e4bf42d3..617a8026 100644
--- a/includes/specials/SpecialActiveusers.php
+++ b/includes/specials/SpecialActiveusers.php
@@ -42,10 +42,18 @@ class ActiveUsersPager extends UsersPager {
*/
protected $groups;
- function __construct( $group = null ) {
- global $wgRequest, $wgActiveUserDays;
+ /**
+ * @param $context IContextSource
+ * @param $group null Unused
+ * @param $par string Parameter passed to the page
+ */
+ function __construct( IContextSource $context = null, $group = null, $par = null ) {
+ global $wgActiveUserDays;
+
+ parent::__construct( $context );
+
$this->RCMaxAge = $wgActiveUserDays;
- $un = $wgRequest->getText( 'username' );
+ $un = $this->getRequest()->getText( 'username', $par );
$this->requestedUser = '';
if ( $un != '' ) {
$username = Title::makeTitleSafe( NS_USER, $un );
@@ -55,23 +63,15 @@ class ActiveUsersPager extends UsersPager {
}
$this->setupOptions();
-
- parent::__construct();
- }
-
- function getTitle() {
- return SpecialPage::getTitleFor( 'Activeusers' );
}
public function setupOptions() {
- global $wgRequest;
-
$this->opts = new FormOptions();
$this->opts->add( 'hidebots', false, FormOptions::BOOL );
$this->opts->add( 'hidesysops', false, FormOptions::BOOL );
- $this->opts->fetchValuesFromRequest( $wgRequest );
+ $this->opts->fetchValuesFromRequest( $this->getRequest() );
$this->groups = array();
if ( $this->opts->getValue( 'hidebots' ) == 1 ) {
@@ -119,29 +119,26 @@ class ActiveUsersPager extends UsersPager {
}
function formatRow( $row ) {
- global $wgLang;
$userName = $row->user_name;
- $ulinks = $this->getSkin()->userLink( $row->user_id, $userName );
- $ulinks .= $this->getSkin()->userToolLinks( $row->user_id, $userName );
+ $ulinks = Linker::userLink( $row->user_id, $userName );
+ $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
+
+ $lang = $this->getLanguage();
$list = array();
foreach( self::getGroups( $row->user_id ) as $group ) {
if ( isset( $this->groups[$group] ) ) {
return;
}
- $list[] = self::buildGroupLink( $group );
+ $list[] = self::buildGroupLink( $group, $userName );
}
- $groups = $wgLang->commaList( $list );
-
- $item = wfSpecialList( $ulinks, $groups );
- $count = wfMsgExt( 'activeusers-count',
- array( 'parsemag' ),
- $wgLang->formatNum( $row->recentedits ),
- $userName,
- $wgLang->formatNum ( $this->RCMaxAge )
- );
- $blocked = $row->blocked ? ' ' . wfMsgExt( 'listusers-blocked', array( 'parsemag' ), $userName ) : '';
+ $groups = $lang->commaList( $list );
+
+ $item = $lang->specialList( $ulinks, $groups );
+ $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
+ ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
+ $blocked = $row->blocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
}
@@ -153,16 +150,19 @@ class ActiveUsersPager extends UsersPager {
$limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
$out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
- $out .= Xml::fieldset( wfMsg( 'activeusers' ) ) . "\n";
+ $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
$out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
- $out .= Xml::inputLabel( wfMsg( 'activeusers-from' ), 'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
+ $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
+ 'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
- $out .= Xml::checkLabel( wfMsg('activeusers-hidebots'), 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ) );
+ $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
+ 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ) );
- $out .= Xml::checkLabel( wfMsg('activeusers-hidesysops'), 'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
+ $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
+ 'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
- $out .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n";# Submit button and form bottom
+ $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n";# Submit button and form bottom
$out .= Xml::closeElement( 'fieldset' );
$out .= Xml::closeElement( 'form' );
@@ -188,30 +188,30 @@ class SpecialActiveUsers extends SpecialPage {
* @param $par Mixed: parameter passed to the page or null
*/
public function execute( $par ) {
- global $wgOut, $wgLang, $wgActiveUserDays;
+ global $wgActiveUserDays;
$this->setHeaders();
$this->outputHeader();
- $up = new ActiveUsersPager();
+ $out = $this->getOutput();
+ $out->wrapWikiMsg( "<div class='mw-activeusers-intro'>\n$1\n</div>",
+ array( 'activeusers-intro', $this->getLanguage()->formatNum( $wgActiveUserDays ) ) );
+
+ $up = new ActiveUsersPager( $this->getContext(), null, $par );
# getBody() first to check, if empty
$usersbody = $up->getBody();
- $s = Html::rawElement( 'div', array( 'class' => 'mw-activeusers-intro' ),
- wfMsgExt( 'activeusers-intro', array( 'parsemag', 'escape' ), $wgLang->formatNum( $wgActiveUserDays ) )
- );
-
- $s .= $up->getPageHeader();
- if( $usersbody ) {
- $s .= $up->getNavigationBar();
- $s .= Html::rawElement( 'ul', array(), $usersbody );
- $s .= $up->getNavigationBar();
+ $out->addHTML( $up->getPageHeader() );
+ if ( $usersbody ) {
+ $out->addHTML(
+ $up->getNavigationBar() .
+ Html::rawElement( 'ul', array(), $usersbody ) .
+ $up->getNavigationBar()
+ );
} else {
- $s .= Html::element( 'p', array(), wfMsg( 'activeusers-noresult' ) );
+ $out->addWikiMsg( 'activeusers-noresult' );
}
-
- $wgOut->addHTML( $s );
}
}
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
index 24815825..2bfea4c3 100644
--- a/includes/specials/SpecialAllmessages.php
+++ b/includes/specials/SpecialAllmessages.php
@@ -100,22 +100,22 @@ class AllmessagesTablePager extends TablePager {
public $custom;
function __construct( $page, $conds, $langObj = null ) {
- parent::__construct();
+ parent::__construct( $page->getContext() );
$this->mIndexField = 'am_title';
$this->mPage = $page;
$this->mConds = $conds;
$this->mDefaultDirection = true; // always sort ascending
$this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
- global $wgLang, $wgContLang, $wgRequest;
+ global $wgContLang;
- $this->talk = htmlspecialchars( wfMsg( 'talkpagelinktext' ) );
+ $this->talk = $this->msg( 'talkpagelinktext' )->escaped();
$this->lang = ( $langObj ? $langObj : $wgContLang );
$this->langcode = $this->lang->getCode();
$this->foreign = $this->langcode != $wgContLang->getCode();
- $request = $wgRequest;
+ $request = $this->getRequest();
$this->filter = $request->getVal( 'filter', 'all' );
if( $this->filter === 'all' ){
@@ -124,8 +124,8 @@ class AllmessagesTablePager extends TablePager {
$this->custom = ($this->filter == 'unmodified');
}
- $prefix = $wgLang->ucfirst( $wgRequest->getVal( 'prefix', '' ) );
- $prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $wgRequest->getVal( 'prefix', null ) ) : null;
+ $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
+ $prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : null;
if( $prefix !== null ){
$this->displayPrefix = $prefix->getDBkey();
$this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
@@ -150,12 +150,12 @@ class AllmessagesTablePager extends TablePager {
ksort( $languages );
$out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-allmessages-form' ) ) .
- Xml::fieldset( wfMsg( 'allmessages-filter-legend' ) ) .
+ Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
'<tr>
<td class="mw-label">' .
- Xml::label( wfMsg( 'allmessages-prefix' ), 'mw-allmessages-form-prefix' ) .
+ 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' ) ) .
@@ -163,22 +163,22 @@ class AllmessagesTablePager extends TablePager {
</tr>
<tr>\n
<td class='mw-label'>" .
- wfMsg( 'allmessages-filter' ) .
+ $this->msg( 'allmessages-filter' )->escaped() .
"</td>\n
<td class='mw-input'>" .
- Xml::radioLabel( wfMsg( 'allmessages-filter-unmodified' ),
+ Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
'filter',
'unmodified',
'mw-allmessages-form-filter-unmodified',
( $this->filter == 'unmodified' )
) .
- Xml::radioLabel( wfMsg( 'allmessages-filter-all' ),
+ Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
'filter',
'all',
'mw-allmessages-form-filter-all',
( $this->filter == 'all' )
) .
- Xml::radioLabel( wfMsg( 'allmessages-filter-modified' ),
+ Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
'filter',
'modified',
'mw-allmessages-form-filter-modified',
@@ -188,7 +188,7 @@ class AllmessagesTablePager extends TablePager {
</tr>
<tr>\n
<td class=\"mw-label\">" .
- Xml::label( wfMsg( 'allmessages-language' ), 'mw-allmessages-form-lang' ) .
+ Xml::label( $this->msg( 'allmessages-language' )->text(), 'mw-allmessages-form-lang' ) .
"</td>\n
<td class=\"mw-input\">" .
Xml::openElement( 'select', array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' ) );
@@ -203,7 +203,7 @@ class AllmessagesTablePager extends TablePager {
'<tr>
<td class="mw-label">' .
- Xml::label( wfMsg( 'table_pager_limit_label'), 'mw-table_pager_limit_label' ) .
+ Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
'</td>
<td class="mw-input">' .
$this->getLimitSelect() .
@@ -211,7 +211,7 @@ class AllmessagesTablePager extends TablePager {
<tr>
<td></td>
<td>' .
- Xml::submitButton( wfMsg( 'allmessages-filter-submit' ) ) .
+ Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
"</td>\n
</tr>" .
@@ -247,8 +247,10 @@ class AllmessagesTablePager extends TablePager {
* @param array $messageNames
* @param string $langcode What language code
* @param bool $foreign Whether the $langcode is not the content language
+ * @return array: a 'pages' and 'talks' array with the keys of existing pages
*/
public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
+ // FIXME: This function should be moved to Language:: or something.
wfProfileIn( __METHOD__ . '-db' );
$dbr = wfGetDB( DB_SLAVE );
@@ -263,18 +265,20 @@ class AllmessagesTablePager extends TablePager {
$pageFlags = $talkFlags = array();
foreach ( $res as $s ) {
- if( $s->page_namespace == NS_MEDIAWIKI ) {
- if( $foreign ) {
- $title = explode( '/', $s->page_title );
- if( count( $title ) === 2 && $langcode == $title[1]
- && isset( $xNames[$title[0]] ) ) {
- $pageFlags["{$title[0]}"] = true;
- }
- } elseif( isset( $xNames[$s->page_title] ) ) {
- $pageFlags[$s->page_title] = true;
+ $exists = false;
+ if( $foreign ) {
+ $title = explode( '/', $s->page_title );
+ if( count( $title ) === 2 && $langcode == $title[1]
+ && isset( $xNames[$title[0]] ) ) {
+ $exists = $title[0];
}
- } elseif( $s->page_namespace == NS_MEDIAWIKI_TALK ){
- $talkFlags[$s->page_title] = true;
+ } elseif( isset( $xNames[$s->page_title] ) ) {
+ $exists = $s->page_title;
+ }
+ if( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
+ $pageFlags[$exists] = true;
+ } elseif( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
+ $talkFlags[$exists] = true;
}
}
@@ -319,24 +323,23 @@ class AllmessagesTablePager extends TablePager {
}
function getStartBody() {
- return Xml::openElement( 'table', array( 'class' => 'TablePager', 'id' => 'mw-allmessagestable' ) ) . "\n" .
+ return Xml::openElement( 'table', array( 'class' => 'mw-datatable TablePager', 'id' => 'mw-allmessagestable' ) ) . "\n" .
"<thead><tr>
<th rowspan=\"2\">" .
- wfMsg( 'allmessagesname' ) . "
+ $this->msg( 'allmessagesname' )->escaped() . "
</th>
<th>" .
- wfMsg( 'allmessagesdefault' ) .
+ $this->msg( 'allmessagesdefault' )->escaped() .
"</th>
</tr>\n
<tr>
<th>" .
- wfMsg( 'allmessagescurrent' ) .
+ $this->msg( 'allmessagescurrent' )->escaped() .
"</th>
</tr></thead><tbody>\n";
}
function formatValue( $field, $value ){
- global $wgLang;
switch( $field ){
case 'am_title' :
@@ -345,11 +348,11 @@ class AllmessagesTablePager extends TablePager {
$talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
if( $this->mCurrentRow->am_customised ){
- $title = Linker::linkKnown( $title, $wgLang->lcfirst( $value ) );
+ $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
} else {
$title = Linker::link(
$title,
- $wgLang->lcfirst( $value ),
+ $this->getLanguage()->lcfirst( $value ),
array(),
array(),
array( 'broken' )
@@ -394,12 +397,11 @@ class AllmessagesTablePager extends TablePager {
function getRowAttrs( $row, $isSecond = false ){
$arr = array();
- global $wgLang;
if( $row->am_customised ){
$arr['class'] = 'allmessages-customised';
}
if( !$isSecond ){
- $arr['id'] = Sanitizer::escapeId( 'msg_' . $wgLang->lcfirst( $row->am_title ) );
+ $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
}
return $arr;
}
@@ -407,7 +409,7 @@ class AllmessagesTablePager extends TablePager {
function getCellAttrs( $field, $value ){
if( $this->mCurrentRow->am_customised && $field == 'am_title' ){
return array( 'rowspan' => '2', 'class' => $field );
- } else if( $field == 'am_title' ) {
+ } elseif( $field == 'am_title' ) {
return array( 'class' => $field );
} else {
return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
@@ -417,8 +419,8 @@ class AllmessagesTablePager extends TablePager {
// This is not actually used, as getStartBody is overridden above
function getFieldNames() {
return array(
- 'am_title' => wfMsg( 'allmessagesname' ),
- 'am_default' => wfMsg( 'allmessagesdefault' )
+ 'am_title' => $this->msg( 'allmessagesname' )->text(),
+ 'am_default' => $this->msg( 'allmessagesdefault' )->text()
);
}
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
index a9cbf3ab..960a327a 100644
--- a/includes/specials/SpecialAllpages.php
+++ b/includes/specials/SpecialAllpages.php
@@ -73,16 +73,16 @@ class SpecialAllpages extends IncludableSpecialPage {
$namespaces = $wgContLang->getNamespaces();
- $out->setPagetitle(
+ $out->setPageTitle(
( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ?
- wfMsg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
- wfMsg( 'allarticles' )
+ $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+ $this->msg( 'allarticles' )
);
$out->addModuleStyles( 'mediawiki.special' );
- if( isset($par) ) {
+ if( $par !== null ) {
$this->showChunk( $namespace, $par, $to );
- } elseif( isset($from) && !isset($to) ) {
+ } elseif( $from !== null && $to === null ) {
$this->showChunk( $namespace, $from, $to );
} else {
$this->showToplevel( $namespace, $from, $to );
@@ -104,11 +104,11 @@ class SpecialAllpages extends IncludableSpecialPage {
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$out .= Html::hidden( 'title', $t->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
- $out .= Xml::element( 'legend', null, wfMsg( 'allpages' ) );
+ $out .= Xml::element( 'legend', null, $this->msg( 'allpages' )->text() );
$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
$out .= "<tr>
<td class='mw-label'>" .
- Xml::label( wfMsg( 'allpagesfrom' ), 'nsfrom' ) .
+ Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
" </td>
<td class='mw-input'>" .
Xml::input( 'from', 30, str_replace('_',' ',$from), array( 'id' => 'nsfrom' ) ) .
@@ -116,7 +116,7 @@ class SpecialAllpages extends IncludableSpecialPage {
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( wfMsg( 'allpagesto' ), 'nsto' ) .
+ Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
" </td>
<td class='mw-input'>" .
Xml::input( 'to', 30, str_replace('_',' ',$to), array( 'id' => 'nsto' ) ) .
@@ -124,11 +124,14 @@ class SpecialAllpages extends IncludableSpecialPage {
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( wfMsg( 'namespace' ), 'namespace' ) .
+ Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
" </td>
<td class='mw-input'>" .
- Xml::namespaceSelector( $namespace, null ) . ' ' .
- Xml::submitButton( wfMsg( 'allpagessubmit' ) ) .
+ Html::namespaceSelector(
+ array( 'selected' => $namespace ),
+ array( 'name' => 'namespace', 'id' => 'namespace' )
+ ) . ' ' .
+ Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
" </td>
</tr>";
$out .= Xml::closeElement( 'table' );
@@ -249,7 +252,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$nsForm .
'</td>
<td class="mw-allpages-nav">' .
- $this->getSkin()->link( $this->getTitle(), wfMsgHtml ( 'allpages' ),
+ Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
array(), array(), 'known' ) .
"</td>
</tr>" .
@@ -278,12 +281,12 @@ class SpecialAllpages extends IncludableSpecialPage {
$queryparams = $namespace ? "namespace=$namespace&" : '';
$special = $this->getTitle();
- $link = $special->escapeLocalUrl( $queryparams . 'from=' . urlencode($inpoint) . '&to=' . urlencode($outpoint) );
+ $link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode($inpoint) . '&to=' . urlencode($outpoint) ) );
- $out = wfMsgHtml( 'alphaindexline',
+ $out = $this->msg( 'alphaindexline' )->rawParams(
"<a href=\"$link\">$inpointf</a></td><td>",
"</td><td><a href=\"$link\">$outpointf</a>"
- );
+ )->escaped();
return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
}
@@ -293,9 +296,8 @@ class SpecialAllpages extends IncludableSpecialPage {
* @param $to String: list all pages to this name (default FALSE)
*/
function showChunk( $namespace = NS_MAIN, $from = false, $to = false ) {
- global $wgContLang, $wgLang;
+ global $wgContLang;
$output = $this->getOutput();
- $sk = $this->getSkin();
$fromList = $this->getNamespaceKeyAndText($namespace, $from);
$toList = $this->getNamespaceKeyAndText( $namespace, $to );
@@ -303,10 +305,10 @@ class SpecialAllpages extends IncludableSpecialPage {
$n = 0;
if ( !$fromList || !$toList ) {
- $out = wfMsgExt( 'allpagesbadtitle', 'parse' );
+ $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
} elseif ( !in_array( $namespace, array_keys( $namespaces ) ) ) {
// Show errormessage and reset to NS_MAIN
- $out = wfMsgExt( 'allpages-bad-ns', array( 'parseinline' ), $namespace );
+ $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
$namespace = NS_MAIN;
} else {
list( $namespace, $fromKey, $from ) = $fromList;
@@ -338,7 +340,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$t = Title::newFromRow( $s );
if( $t ) {
$link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
- $sk->link( $t ) .
+ Linker::link( $t ) .
($s->page_is_redirect ? '</div>' : '' );
} else {
$link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
@@ -411,7 +413,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$nsForm .
'</td>
<td class="mw-allpages-nav">' .
- $sk->link( $self, wfMsgHtml ( 'allpages' ) );
+ Linker::link( $self, $this->msg( 'allpages' )->escaped() );
# Do we put a previous link ?
if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
@@ -420,13 +422,13 @@ class SpecialAllpages extends IncludableSpecialPage {
if( $namespace )
$query['namespace'] = $namespace;
- $prevLink = $sk->linkKnown(
+ $prevLink = Linker::linkKnown(
$self,
- wfMessage( 'prevpage', $pt )->escaped(),
+ $this->msg( 'prevpage', $pt )->escaped(),
array(),
$query
);
- $out2 = $wgLang->pipeList( array( $out2, $prevLink ) );
+ $out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
}
if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
@@ -437,13 +439,13 @@ class SpecialAllpages extends IncludableSpecialPage {
if( $namespace )
$query['namespace'] = $namespace;
- $nextLink = $sk->linkKnown(
+ $nextLink = Linker::linkKnown(
$self,
- wfMessage( 'nextpage', $t->getText() )->escaped(),
+ $this->msg( 'nextpage', $t->getText() )->escaped(),
array(),
$query
);
- $out2 = $wgLang->pipeList( array( $out2, $nextLink ) );
+ $out2 = $this->getLanguage()->pipeList( array( $out2, $nextLink ) );
}
$out2 .= "</td></tr></table>";
}
@@ -458,7 +460,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$output->addHTML(
Html::element( 'hr' ) .
Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
- $wgLang->pipeList( $links )
+ $this->getLanguage()->pipeList( $links )
) );
}
diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php
index cbb5df80..1203e1fd 100644
--- a/includes/specials/SpecialAncientpages.php
+++ b/includes/specials/SpecialAncientpages.php
@@ -59,14 +59,14 @@ class AncientPagesPage extends QueryPage {
}
function formatResult( $skin, $result ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
- $d = $wgLang->timeanddate( wfTimestamp( TS_MW, $result->value ), true );
+ $d = $this->getLanguage()->userTimeAndDate( $result->value, $this->getUser() );
$title = Title::makeTitle( $result->namespace, $result->title );
- $link = $skin->linkKnown(
+ $link = Linker::linkKnown(
$title,
htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
);
- return wfSpecialList( $link, htmlspecialchars($d) );
+ return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
}
}
diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php
index f1fe8386..7d93cc75 100644
--- a/includes/specials/SpecialBlock.php
+++ b/includes/specials/SpecialBlock.php
@@ -27,8 +27,7 @@
*
* @ingroup SpecialPage
*/
-class SpecialBlock extends SpecialPage {
-
+class SpecialBlock extends FormSpecialPage {
/** The maximum number of edits a user can have and still be hidden
* TODO: config setting? */
const HIDEUSER_CONTRIBLIMIT = 1000;
@@ -56,65 +55,66 @@ class SpecialBlock extends SpecialPage {
parent::__construct( 'Block', 'block' );
}
- public function execute( $par ) {
- global $wgUser, $wgOut, $wgRequest;
-
- # Permission check
- if( !$this->userCanExecute( $wgUser ) ) {
- $this->displayRestrictionError();
- return;
- }
+ /**
+ * Checks that the user can unblock themselves if they are trying to do so
+ *
+ * @param User $user
+ * @throws ErrorPageError
+ */
+ protected function checkExecutePermissions( User $user ) {
+ parent::checkExecutePermissions( $user );
- # Can't block when the database is locked
- if( wfReadOnly() ) {
- throw new ReadOnlyError;
+ # bug 15810: blocked admins should have limited access here
+ $status = self::checkUnblockSelf( $this->target, $user );
+ if ( $status !== true ) {
+ throw new ErrorPageError( 'badaccess', $status );
}
+ }
+ /**
+ * Handle some magic here
+ *
+ * @param $par String
+ */
+ protected function setParameter( $par ) {
# Extract variables from the request. Try not to get into a situation where we
# need to extract *every* variable from the form just for processing here, but
# there are legitimate uses for some variables
- list( $this->target, $this->type ) = self::getTargetAndType( $par, $wgRequest );
+ $request = $this->getRequest();
+ list( $this->target, $this->type ) = self::getTargetAndType( $par, $request );
if ( $this->target instanceof User ) {
# Set the 'relevant user' in the skin, so it displays links like Contributions,
# User logs, UserRights, etc.
$this->getSkin()->setRelevantUser( $this->target );
}
- list( $this->previousTarget, /*...*/ ) = Block::parseTarget( $wgRequest->getVal( 'wpPreviousTarget' ) );
- $this->requestedHideUser = $wgRequest->getBool( 'wpHideUser' );
-
- # bug 15810: blocked admins should have limited access here
- $status = self::checkUnblockSelf( $this->target );
- if ( $status !== true ) {
- throw new ErrorPageError( 'badaccess', $status );
- }
-
- $wgOut->setPageTitle( wfMsg( 'blockip-title' ) );
- $wgOut->addModules( 'mediawiki.special', 'mediawiki.special.block' );
-
- $out = $this->getOutput();
- $out->setPageTitle( wfMsg( 'blockip-title' ) );
- $out->addModules( array( 'mediawiki.special', 'mediawiki.special.block' ) );
-
- $fields = $this->getFormFields();
- $this->maybeAlterFormDefaults( $fields );
-
- $form = new HTMLForm( $fields, $this->getContext() );
- $form->setWrapperLegend( wfMsg( 'blockip-legend' ) );
- $form->setSubmitCallback( array( __CLASS__, 'processForm' ) );
+ list( $this->previousTarget, /*...*/ ) = Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
+ $this->requestedHideUser = $request->getBool( 'wpHideUser' );
+ }
- $t = $this->alreadyBlocked
- ? wfMsg( 'ipb-change-block' )
- : wfMsg( 'ipbsubmit' );
- $form->setSubmitText( $t );
+ /**
+ * Customizes the HTMLForm a bit
+ *
+ * @param $form HTMLForm
+ */
+ protected function alterForm( HTMLForm $form ) {
+ $form->setWrapperLegendMsg( 'blockip-legend' );
+ $form->setHeaderText( '' );
+ $form->setSubmitCallback( array( __CLASS__, 'processUIForm' ) );
- $this->doPreText( $form );
- $this->doHeadertext( $form );
- $this->doPostText( $form );
+ $msg = $this->alreadyBlocked ? 'ipb-change-block' : 'ipbsubmit';
+ $form->setSubmitTextMsg( $msg );
- if( $form->show() ){
- $wgOut->setPageTitle( wfMsg( 'blockipsuccesssub' ) );
- $wgOut->addWikiMsg( 'blockipsuccesstext', $this->target );
+ # Don't need to do anything if the form has been posted
+ if( !$this->getRequest()->wasPosted() && $this->preErrors ){
+ $s = HTMLForm::formatErrors( $this->preErrors );
+ if( $s ){
+ $form->addHeaderText( Html::rawElement(
+ 'div',
+ array( 'class' => 'error' ),
+ $s
+ ) );
+ }
}
}
@@ -122,8 +122,10 @@ class SpecialBlock extends SpecialPage {
* Get the HTMLForm descriptor array for the block form
* @return Array
*/
- protected static function getFormFields(){
- global $wgUser, $wgBlockAllowsUTEdit;
+ protected function getFormFields(){
+ global $wgBlockAllowsUTEdit;
+
+ $user = $this->getUser();
$a = array(
'Target' => array(
@@ -141,7 +143,7 @@ class SpecialBlock extends SpecialPage {
'required' => true,
'tabindex' => '2',
'options' => self::getSuggestedDurations(),
- 'other' => wfMsg( 'ipbother' ),
+ 'other' => $this->msg( 'ipbother' )->text(),
),
'Reason' => array(
'type' => 'selectandother',
@@ -155,7 +157,7 @@ class SpecialBlock extends SpecialPage {
),
);
- if( self::canBlockEmail( $wgUser ) ) {
+ if( self::canBlockEmail( $user ) ) {
$a['DisableEmail'] = array(
'type' => 'check',
'label-message' => 'ipbemailban',
@@ -177,7 +179,7 @@ class SpecialBlock extends SpecialPage {
);
# Allow some users to hide name from block log, blocklist and listusers
- if( $wgUser->isAllowed( 'hideuser' ) ) {
+ if( $user->isAllowed( 'hideuser' ) ) {
$a['HideUser'] = array(
'type' => 'check',
'label-message' => 'ipbhidename',
@@ -186,7 +188,7 @@ class SpecialBlock extends SpecialPage {
}
# Watchlist their user page? (Only if user is logged in)
- if( $wgUser->isLoggedIn() ) {
+ if( $user->isLoggedIn() ) {
$a['Watch'] = array(
'type' => 'check',
'label-message' => 'ipbwatchuser',
@@ -213,19 +215,19 @@ class SpecialBlock extends SpecialPage {
'label-message' => 'ipb-confirm',
);
+ $this->maybeAlterFormDefaults( $a );
+
return $a;
}
/**
* If the user has already been blocked with similar settings, load that block
* and change the defaults for the form fields to match the existing settings.
- * @param &$fields Array HTMLForm descriptor array
+ * @param $fields Array HTMLForm descriptor array
* @return Bool whether fields were altered (that is, whether the target is
* already blocked)
*/
protected function maybeAlterFormDefaults( &$fields ){
- global $wgRequest, $wgUser;
-
# This will be overwritten by request data
$fields['Target']['default'] = (string)$this->target;
@@ -242,18 +244,22 @@ class SpecialBlock extends SpecialPage {
$fields['HardBlock']['default'] = $block->isHardblock();
$fields['CreateAccount']['default'] = $block->prevents( 'createaccount' );
$fields['AutoBlock']['default'] = $block->isAutoblocking();
+
if( isset( $fields['DisableEmail'] ) ){
$fields['DisableEmail']['default'] = $block->prevents( 'sendemail' );
}
+
if( isset( $fields['HideUser'] ) ){
$fields['HideUser']['default'] = $block->mHideName;
}
+
if( isset( $fields['DisableUTEdit'] ) ){
$fields['DisableUTEdit']['default'] = $block->prevents( 'editownusertalk' );
}
+
$fields['Reason']['default'] = $block->mReason;
- if( $wgRequest->wasPosted() ){
+ if( $this->getRequest()->wasPosted() ){
# Ok, so we got a POST submission asking us to reblock a user. So show the
# confirm checkbox; the user will only see it if they haven't previously
$fields['Confirm']['type'] = 'check';
@@ -282,7 +288,7 @@ class SpecialBlock extends SpecialPage {
}
# Or if the user is trying to block themselves
- if( (string)$this->target === $wgUser->getName() ){
+ if( (string)$this->target === $this->getUser()->getName() ){
$fields['Confirm']['type'] = 'check';
unset( $fields['Confirm']['default'] );
$this->preErrors[] = 'ipb-blockingself';
@@ -291,11 +297,9 @@ class SpecialBlock extends SpecialPage {
/**
* Add header elements like block log entries, etc.
- * @param $form HTMLForm
- * @return void
*/
- protected function doPreText( HTMLForm &$form ){
- $form->addPreText( wfMsgExt( 'blockiptext', 'parse' ) );
+ protected function preText(){
+ $text = $this->msg( 'blockiptext' )->parse();
$otherBlockMessages = array();
if( $this->target !== null ) {
@@ -306,65 +310,48 @@ class SpecialBlock extends SpecialPage {
$s = Html::rawElement(
'h2',
array(),
- wfMsgExt( 'ipb-otherblocks-header', 'parseinline', count( $otherBlockMessages ) )
+ $this->msg( 'ipb-otherblocks-header', count( $otherBlockMessages ) )->parse()
) . "\n";
+
$list = '';
+
foreach( $otherBlockMessages as $link ) {
$list .= Html::rawElement( 'li', array(), $link ) . "\n";
}
+
$s .= Html::rawElement(
'ul',
array( 'class' => 'mw-blockip-alreadyblocked' ),
$list
) . "\n";
- $form->addPreText( $s );
- }
- }
- }
- /**
- * Add header text inside the form, just underneath where the errors would go
- * @param $form HTMLForm
- * @return void
- */
- protected function doHeaderText( HTMLForm &$form ){
- global $wgRequest;
- # Don't need to do anything if the form has been posted
- if( !$wgRequest->wasPosted() && $this->preErrors ){
- $s = HTMLForm::formatErrors( $this->preErrors );
- if( $s ){
- $form->addHeaderText( Html::rawElement(
- 'div',
- array( 'class' => 'error' ),
- $s
- ) );
+ $text .= $s;
}
}
+
+ return $text;
}
/**
* Add footer elements to the form
- * @param $form HTMLForm
- * @return void
+ * @return string
*/
- protected function doPostText( HTMLForm &$form ){
- global $wgUser, $wgLang;
-
+ protected function postText(){
# Link to the user's contributions, if applicable
if( $this->target instanceof User ){
$contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
$links[] = Linker::link(
$contribsPage,
- wfMsgExt( 'ipb-blocklist-contribs', 'escape', $this->target->getName() )
+ $this->msg( 'ipb-blocklist-contribs', $this->target->getName() )->escaped()
);
}
# Link to unblock the specified user, or to a blank unblock form
if( $this->target instanceof User ) {
- $message = wfMsgExt( 'ipb-unblock-addr', array( 'parseinline' ), $this->target->getName() );
+ $message = $this->msg( 'ipb-unblock-addr', $this->target->getName() )->parse();
$list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
} else {
- $message = wfMsgExt( 'ipb-unblock', array( 'parseinline' ) );
+ $message = $this->msg( 'ipb-unblock' )->parse();
$list = SpecialPage::getTitleFor( 'Unblock' );
}
$links[] = Linker::linkKnown( $list, $message, array() );
@@ -372,24 +359,26 @@ class SpecialBlock extends SpecialPage {
# Link to the block list
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'BlockList' ),
- wfMsg( 'ipb-blocklist' )
+ $this->msg( 'ipb-blocklist' )->escaped()
);
+ $user = $this->getUser();
+
# Link to edit the block dropdown reasons, if applicable
- if ( $wgUser->isAllowed( 'editinterface' ) ) {
+ if ( $user->isAllowed( 'editinterface' ) ) {
$links[] = Linker::link(
Title::makeTitle( NS_MEDIAWIKI, 'Ipbreason-dropdown' ),
- wfMsgHtml( 'ipb-edit-dropdown' ),
+ $this->msg( 'ipb-edit-dropdown' )->escaped(),
array(),
array( 'action' => 'edit' )
);
}
- $form->addPostText( Html::rawElement(
+ $text = Html::rawElement(
'p',
array( 'class' => 'mw-ipb-conveniencelinks' ),
- $wgLang->pipeList( $links )
- ) );
+ $this->getLanguage()->pipeList( $links )
+ );
if( $this->target instanceof User ){
# Get relevant extracts from the block and suppression logs, if possible
@@ -399,7 +388,7 @@ class SpecialBlock extends SpecialPage {
LogEventsList::showLogExtract(
$out,
'block',
- $userpage->getPrefixedText(),
+ $userpage,
'',
array(
'lim' => 10,
@@ -407,14 +396,14 @@ class SpecialBlock extends SpecialPage {
'showIfEmpty' => false
)
);
- $form->addPostText( $out );
+ $text .= $out;
# Add suppression block entries if allowed
- if( $wgUser->isAllowed( 'suppressionlog' ) ) {
+ if( $user->isAllowed( 'suppressionlog' ) ) {
LogEventsList::showLogExtract(
$out,
'suppress',
- $userpage->getPrefixedText(),
+ $userpage,
'',
array(
'lim' => 10,
@@ -423,9 +412,12 @@ class SpecialBlock extends SpecialPage {
'showIfEmpty' => false
)
);
- $form->addPostText( $out );
+
+ $text .= $out;
}
}
+
+ return $text;
}
/**
@@ -434,11 +426,12 @@ class SpecialBlock extends SpecialPage {
* @param $par String subpage parameter passed to setup, or data value from
* the HTMLForm
* @param $request WebRequest optionally try and get data from a request too
- * @return void
+ * @return array( User|string|null, Block::TYPE_ constant|null )
*/
public static function getTargetAndType( $par, WebRequest $request = null ){
$i = 0;
$target = null;
+
while( true ){
switch( $i++ ){
case 0:
@@ -467,11 +460,14 @@ class SpecialBlock extends SpecialPage {
case 4:
break 2;
}
+
list( $target, $type ) = Block::parseTarget( $target );
+
if( $type !== null ){
return array( $target, $type );
}
}
+
return array( null, null );
}
@@ -480,9 +476,10 @@ class SpecialBlock extends SpecialPage {
* @since 1.18
* @param $value String
* @param $alldata Array
+ * @param $form HTMLForm
* @return Message
*/
- public static function validateTargetField( $value, $alldata = null ) {
+ public static function validateTargetField( $value, $alldata, $form ) {
global $wgBlockCIDRLimit;
list( $target, $type ) = self::getTargetAndType( $value );
@@ -490,13 +487,13 @@ class SpecialBlock extends SpecialPage {
if( $type == Block::TYPE_USER ){
# TODO: why do we not have a User->exists() method?
if( !$target->getId() ){
- return wfMessage( 'nosuchusershort',
+ return $form->msg( 'nosuchusershort',
wfEscapeWikiText( $target->getName() ) );
}
- $status = self::checkUnblockSelf( $target );
+ $status = self::checkUnblockSelf( $target, $form->getUser() );
if ( $status !== true ) {
- return wfMessage( 'badaccess', $status );
+ return $form->msg( 'badaccess', $status );
}
} elseif( $type == Block::TYPE_RANGE ){
@@ -506,41 +503,52 @@ class SpecialBlock extends SpecialPage {
|| ( IP::isIPv6( $ip ) && $wgBlockCIDRLimit['IPv6'] == 128 ) )
{
# Range block effectively disabled
- return wfMessage( 'range_block_disabled' );
+ return $form->msg( 'range_block_disabled' );
}
if( ( IP::isIPv4( $ip ) && $range > 32 )
|| ( IP::isIPv6( $ip ) && $range > 128 ) )
{
# Dodgy range
- return wfMessage( 'ip_range_invalid' );
+ return $form->msg( 'ip_range_invalid' );
}
if( IP::isIPv4( $ip ) && $range < $wgBlockCIDRLimit['IPv4'] ) {
- return wfMessage( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv4'] );
+ return $form->msg( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv4'] );
}
if( IP::isIPv6( $ip ) && $range < $wgBlockCIDRLimit['IPv6'] ) {
- return wfMessage( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv6'] );
+ return $form->msg( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv6'] );
}
-
} elseif( $type == Block::TYPE_IP ){
# All is well
-
} else {
- return wfMessage( 'badipaddress' );
+ return $form->msg( 'badipaddress' );
}
return true;
}
/**
+ * Submit callback for an HTMLForm object, will simply pass
+ * @param $data array
+ * @param $form HTMLForm
+ * @return Bool|String
+ */
+ public static function processUIForm( array $data, HTMLForm $form ) {
+ return self::processForm( $data, $form->getContext() );
+ }
+
+ /**
* Given the form data, actually implement a block
* @param $data Array
+ * @param $context IContextSource
* @return Bool|String
*/
- public static function processForm( array $data ){
- global $wgUser, $wgBlockAllowsUTEdit;
+ public static function processForm( array $data, IContextSource $context ){
+ global $wgBlockAllowsUTEdit;
+
+ $performer = $context->getUser();
// Handled by field validator callback
// self::validateTargetField( $data['Target'] );
@@ -557,20 +565,21 @@ class SpecialBlock extends SpecialPage {
# Give admins a heads-up before they go and block themselves. Much messier
# to do this for IPs, but it's pretty unlikely they'd ever get the 'block'
- # permission anyway, although the code does allow for it
- if( $target === $wgUser->getName() &&
- ( $data['PreviousTarget'] !== $data['Target'] || !$data['Confirm'] ) )
+ # permission anyway, although the code does allow for it.
+ # Note: Important to use $target instead of $data['Target']
+ # since both $data['PreviousTarget'] and $target are normalized
+ # but $data['target'] gets overriden by (non-normalized) request variable
+ # from previous request.
+ if( $target === $performer->getName() &&
+ ( $data['PreviousTarget'] !== $target || !$data['Confirm'] ) )
{
return array( 'ipb-blockingself' );
}
-
} elseif( $type == Block::TYPE_RANGE ){
$userId = 0;
-
} elseif( $type == Block::TYPE_IP ){
$target = $target->getName();
$userId = 0;
-
} else {
# This should have been caught in the form field validation
return array( 'badipaddress' );
@@ -591,8 +600,9 @@ class SpecialBlock extends SpecialPage {
if( !isset( $data['HideUser'] ) ){
$data['HideUser'] = false;
}
+
if( $data['HideUser'] ) {
- if( !$wgUser->isAllowed('hideuser') ){
+ if( !$performer->isAllowed('hideuser') ){
# this codepath is unreachable except by a malicious user spoofing forms,
# or by race conditions (user has oversight and sysop, loads block form,
# and is de-oversighted before submission); so need to fail completely
@@ -603,16 +613,13 @@ class SpecialBlock extends SpecialPage {
# Recheck params here...
if( $type != Block::TYPE_USER ) {
$data['HideUser'] = false; # IP users should not be hidden
-
} elseif( !in_array( $data['Expiry'], array( 'infinite', 'infinity', 'indefinite' ) ) ) {
# Bad expiry.
return array( 'ipb_expiry_temp' );
-
} elseif( $user->getEditCount() > self::HIDEUSER_CONTRIBLIMIT ) {
# Typically, the user should have a handful of edits.
# Disallow hiding users with many edits for performance.
return array( 'ipb_hide_invalid' );
-
} elseif( !$data['Confirm'] ){
return array( 'ipb-confirmhideuser' );
}
@@ -621,7 +628,7 @@ class SpecialBlock extends SpecialPage {
# Create block object.
$block = new Block();
$block->setTarget( $target );
- $block->setBlocker( $wgUser );
+ $block->setBlocker( $performer );
$block->mReason = $data['Reason'][0];
$block->mExpiry = self::parseExpiryInput( $data['Expiry'] );
$block->prevents( 'createaccount', $data['CreateAccount'] );
@@ -631,7 +638,7 @@ class SpecialBlock extends SpecialPage {
$block->isAutoblocking( $data['AutoBlock'] );
$block->mHideName = $data['HideUser'];
- if( !wfRunHooks( 'BlockIp', array( &$block, &$wgUser ) ) ) {
+ if( !wfRunHooks( 'BlockIp', array( &$block, &$performer ) ) ) {
return array( 'hookaborted' );
}
@@ -655,7 +662,7 @@ class SpecialBlock extends SpecialPage {
# If the name was hidden and the blocking user cannot hide
# names, then don't allow any block changes...
- if( $currentBlock->mHideName && !$wgUser->isAllowed( 'hideuser' ) ) {
+ if( $currentBlock->mHideName && !$performer->isAllowed( 'hideuser' ) ) {
return array( 'cant-see-hidden-user' );
}
@@ -677,7 +684,7 @@ class SpecialBlock extends SpecialPage {
$logaction = 'block';
}
- wfRunHooks( 'BlockIpComplete', array( $block, $wgUser ) );
+ wfRunHooks( 'BlockIpComplete', array( $block, $performer ) );
# Set *_deleted fields if requested
if( $data['HideUser'] ) {
@@ -686,7 +693,7 @@ class SpecialBlock extends SpecialPage {
# Can't watch a rangeblock
if( $type != Block::TYPE_RANGE && $data['Watch'] ) {
- $wgUser->addWatch( Title::makeTitle( NS_USER, $target ) );
+ $performer->addWatch( Title::makeTitle( NS_USER, $target ) );
}
# Block constructor sanitizes certain block options on insert
@@ -737,9 +744,11 @@ class SpecialBlock extends SpecialPage {
if( strpos( $option, ':' ) === false ){
$option = "$option:$option";
}
+
list( $show, $value ) = explode( ':', $option );
$a[htmlspecialchars( $show )] = htmlspecialchars( $value );
}
+
return $a;
}
@@ -754,15 +763,19 @@ class SpecialBlock extends SpecialPage {
if( $infinity == null ){
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
+
if ( $expiry == 'infinite' || $expiry == 'indefinite' ) {
$expiry = $infinity;
} else {
$expiry = strtotime( $expiry );
+
if ( $expiry < 0 || $expiry === false ) {
return false;
}
+
$expiry = wfTimestamp( TS_MW, $expiry );
}
+
return $expiry;
}
@@ -773,6 +786,7 @@ class SpecialBlock extends SpecialPage {
*/
public static function canBlockEmail( $user ) {
global $wgEnableUserEmail, $wgSysopEmailBans;
+
return ( $wgEnableUserEmail && $wgSysopEmailBans && $user->isAllowed( 'blockemail' ) );
}
@@ -781,22 +795,23 @@ class SpecialBlock extends SpecialPage {
* others, and probably shouldn't be able to unblock themselves
* either.
* @param $user User|Int|String
+ * @param $performer User user doing the request
* @return Bool|String true or error message key
*/
- public static function checkUnblockSelf( $user ) {
- global $wgUser;
+ public static function checkUnblockSelf( $user, User $performer ) {
if ( is_int( $user ) ) {
$user = User::newFromId( $user );
} elseif ( is_string( $user ) ) {
$user = User::newFromName( $user );
}
- if( $wgUser->isBlocked() ){
- if( $user instanceof User && $user->getId() == $wgUser->getId() ) {
+
+ if( $performer->isBlocked() ){
+ if( $user instanceof User && $user->getId() == $performer->getId() ) {
# User is trying to unblock themselves
- if ( $wgUser->isAllowed( 'unblockself' ) ) {
+ if ( $performer->isAllowed( 'unblockself' ) ) {
return true;
# User blocked themselves and is now trying to reverse it
- } elseif ( $wgUser->blockedBy() === $wgUser->getName() ) {
+ } elseif ( $performer->blockedBy() === $performer->getName() ) {
return true;
} else {
return 'ipbnounblockself';
@@ -814,7 +829,7 @@ class SpecialBlock extends SpecialPage {
* Return a comma-delimited list of "flags" to be passed to the log
* reader for this block, to provide more information in the logs
* @param $data Array from HTMLForm data
- * @param $type Block::TYPE_ constant
+ * @param $type Block::TYPE_ constant (USER, RANGE, or IP)
* @return array
*/
protected static function blockLogFlags( array $data, $type ) {
@@ -823,32 +838,58 @@ class SpecialBlock extends SpecialPage {
# when blocking a user the option 'anononly' is not available/has no effect -> do not write this into log
if( !$data['HardBlock'] && $type != Block::TYPE_USER ){
+ // For grepping: message block-log-flags-anononly
$flags[] = 'anononly';
}
if( $data['CreateAccount'] ){
+ // For grepping: message block-log-flags-nocreate
$flags[] = 'nocreate';
}
# Same as anononly, this is not displayed when blocking an IP address
- if( !$data['AutoBlock'] && $type != Block::TYPE_IP ){
+ if( !$data['AutoBlock'] && $type == Block::TYPE_USER ){
+ // For grepping: message block-log-flags-noautoblock
$flags[] = 'noautoblock';
}
if( $data['DisableEmail'] ){
+ // For grepping: message block-log-flags-noemail
$flags[] = 'noemail';
}
if( $wgBlockAllowsUTEdit && $data['DisableUTEdit'] ){
+ // For grepping: message block-log-flags-nousertalk
$flags[] = 'nousertalk';
}
if( $data['HideUser'] ){
+ // For grepping: message block-log-flags-hiddenname
$flags[] = 'hiddenname';
}
return implode( ',', $flags );
}
+
+ /**
+ * Process the form on POST submission.
+ * @param $data Array
+ * @return Bool|Array true for success, false for didn't-try, array of errors on failure
+ */
+ public function onSubmit( array $data ) {
+ // This isn't used since we need that HTMLForm that's passed in the
+ // second parameter. See alterForm for the real function
+ }
+
+ /**
+ * Do something exciting on successful processing of the form, most likely to show a
+ * confirmation message
+ */
+ public function onSuccess() {
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
+ $out->addWikiMsg( 'blockipsuccesstext', $this->target );
+ }
}
# BC @since 1.18
diff --git a/includes/specials/SpecialBlockList.php b/includes/specials/SpecialBlockList.php
index 04787a65..0a3a28fe 100644
--- a/includes/specials/SpecialBlockList.php
+++ b/includes/specials/SpecialBlockList.php
@@ -40,24 +40,25 @@ class SpecialBlockList extends SpecialPage {
* @param $par String title fragment
*/
public function execute( $par ) {
- global $wgOut, $wgRequest, $wgLang;
-
$this->setHeaders();
$this->outputHeader();
- $wgOut->setPageTitle( wfMsg( 'ipblocklist' ) );
- $wgOut->addModuleStyles( 'mediawiki.special' );
+ $out = $this->getOutput();
+ $lang = $this->getLanguage();
+ $out->setPageTitle( $this->msg( 'ipblocklist' ) );
+ $out->addModuleStyles( 'mediawiki.special' );
- $par = $wgRequest->getVal( 'ip', $par );
- $this->target = trim( $wgRequest->getVal( 'wpTarget', $par ) );
+ $request = $this->getRequest();
+ $par = $request->getVal( 'ip', $par );
+ $this->target = trim( $request->getVal( 'wpTarget', $par ) );
- $this->options = $wgRequest->getArray( 'wpOptions', array() );
+ $this->options = $request->getArray( 'wpOptions', array() );
- $action = $wgRequest->getText( 'action' );
+ $action = $request->getText( 'action' );
- if( $action == 'unblock' || $action == 'submit' && $wgRequest->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 );
- $wgOut->redirect( $title->getFullUrl() );
+ $out->redirect( $title->getFullUrl() );
return;
}
@@ -68,13 +69,15 @@ class SpecialBlockList extends SpecialPage {
'label-message' => 'ipadressorusername',
'tabindex' => '1',
'size' => '45',
+ 'default' => $this->target,
),
'Options' => array(
'type' => 'multiselect',
'options' => array(
- wfMsg( 'blocklist-userblocks' ) => 'userblocks',
- wfMsg( 'blocklist-tempblocks' ) => 'tempblocks',
- wfMsg( 'blocklist-addressblocks' ) => 'addressblocks',
+ $this->msg( 'blocklist-userblocks' )->text() => 'userblocks',
+ $this->msg( 'blocklist-tempblocks' )->text() => 'tempblocks',
+ $this->msg( 'blocklist-addressblocks' )->text() => 'addressblocks',
+ $this->msg( 'blocklist-rangeblocks' )->text() => 'rangeblocks',
),
'flatlist' => true,
),
@@ -82,11 +85,11 @@ class SpecialBlockList extends SpecialPage {
'class' => 'HTMLBlockedUsersItemSelect',
'label-message' => 'table_pager_limit_label',
'options' => array(
- $wgLang->formatNum( 20 ) => 20,
- $wgLang->formatNum( 50 ) => 50,
- $wgLang->formatNum( 100 ) => 100,
- $wgLang->formatNum( 250 ) => 250,
- $wgLang->formatNum( 500 ) => 500,
+ $lang->formatNum( 20 ) => 20,
+ $lang->formatNum( 50 ) => 50,
+ $lang->formatNum( 100 ) => 100,
+ $lang->formatNum( 250 ) => 250,
+ $lang->formatNum( 500 ) => 500,
),
'name' => 'limit',
'default' => 50,
@@ -94,8 +97,8 @@ class SpecialBlockList extends SpecialPage {
);
$form = new HTMLForm( $fields, $this->getContext() );
$form->setMethod( 'get' );
- $form->setWrapperLegend( wfMsg( 'ipblocklist-legend' ) );
- $form->setSubmitText( wfMsg( 'ipblocklist-submit' ) );
+ $form->setWrapperLegendMsg( 'ipblocklist-legend' );
+ $form->setSubmitTextMsg( 'ipblocklist-submit' );
$form->prepareForm();
$form->displayForm( '' );
@@ -103,8 +106,6 @@ class SpecialBlockList extends SpecialPage {
}
function showList() {
- global $wgOut, $wgUser;
-
# Purge expired entries on one in every 10 queries
if ( !mt_rand( 0, 10 ) ) {
Block::purgeExpired();
@@ -112,7 +113,7 @@ class SpecialBlockList extends SpecialPage {
$conds = array();
# Is the user allowed to see hidden blocks?
- if ( !$wgUser->isAllowed( 'hideuser' ) ){
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ){
$conds['ipb_deleted'] = 0;
}
@@ -121,6 +122,7 @@ class SpecialBlockList extends SpecialPage {
switch( $type ){
case Block::TYPE_ID:
+ case Block::TYPE_AUTO:
$conds['ipb_id'] = $target;
break;
@@ -155,51 +157,52 @@ class SpecialBlockList extends SpecialPage {
if( in_array( 'addressblocks', $this->options ) ) {
$conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
}
+ if( in_array( 'rangeblocks', $this->options ) ) {
+ $conds[] = "ipb_range_end = ipb_range_start";
+ }
# Check for other blocks, i.e. global/tor blocks
$otherBlockLink = array();
wfRunHooks( 'OtherBlockLogLink', array( &$otherBlockLink, $this->target ) );
+ $out = $this->getOutput();
+
# 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 ) ) {
- $wgOut->addHTML(
- Html::rawElement( 'h2', array(), wfMsg( 'ipblocklist-localblock' ) ) . "\n"
+ $out->addHTML(
+ Html::element( 'h2', array(), $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
);
}
$pager = new BlockListPager( $this, $conds );
if ( $pager->getNumRows() ) {
- $wgOut->addHTML(
+ $out->addHTML(
$pager->getNavigationBar() .
$pager->getBody().
$pager->getNavigationBar()
);
} elseif ( $this->target ) {
- $wgOut->addWikiMsg( 'ipblocklist-no-results' );
+ $out->addWikiMsg( 'ipblocklist-no-results' );
} else {
- $wgOut->addWikiMsg( 'ipblocklist-empty' );
+ $out->addWikiMsg( 'ipblocklist-empty' );
}
if( count( $otherBlockLink ) ) {
- $wgOut->addHTML(
+ $out->addHTML(
Html::rawElement(
'h2',
array(),
- wfMsgExt(
- 'ipblocklist-otherblocks',
- 'parseinline',
- count( $otherBlockLink )
- )
+ $this->msg( 'ipblocklist-otherblocks', count( $otherBlockLink ) )->parse()
) . "\n"
);
$list = '';
foreach( $otherBlockLink as $link ) {
$list .= Html::rawElement( 'li', array(), $link ) . "\n";
}
- $wgOut->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
+ $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
}
}
}
@@ -208,11 +211,15 @@ class BlockListPager extends TablePager {
protected $conds;
protected $page;
+ /**
+ * @param $page SpecialPage
+ * @param $conds Array
+ */
function __construct( $page, $conds ) {
$this->page = $page;
$this->conds = $conds;
$this->mDefaultDirection = true;
- parent::__construct();
+ parent::__construct( $page->getContext() );
}
function getFieldNames() {
@@ -227,18 +234,17 @@ class BlockListPager extends TablePager {
'ipb_params' => 'blocklist-params',
'ipb_reason' => 'blocklist-reason',
);
- $headers = array_map( 'wfMsg', $headers );
+ foreach( $headers as $key => $val ) {
+ $headers[$key] = $this->msg( $val )->text();
+ }
}
return $headers;
}
function formatValue( $name, $value ) {
- global $wgLang, $wgUser;
-
- static $sk, $msg;
- if ( empty( $sk ) ) {
- $sk = $this->getSkin();
+ static $msg = null;
+ if ( $msg === null ) {
$msg = array(
'anononlyblock',
'createaccountblock',
@@ -249,27 +255,29 @@ class BlockListPager extends TablePager {
'change-blocklink',
'infiniteblock',
);
- $msg = array_combine( $msg, array_map( 'wfMessage', $msg ) );
+ $msg = array_combine( $msg, array_map( array( $this, 'msg' ), $msg ) );
}
+ /** @var $row object */
$row = $this->mCurrentRow;
+
$formatted = '';
switch( $name ) {
case 'ipb_timestamp':
- $formatted = $wgLang->timeanddate( $value, /* User preference timezone */ true );
+ $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
break;
case 'ipb_target':
if( $row->ipb_auto ){
- $formatted = wfMessage( 'autoblockid', $row->ipb_id )->parse();
+ $formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
} else {
list( $target, $type ) = Block::parseTarget( $row->ipb_address );
switch( $type ){
case Block::TYPE_USER:
case Block::TYPE_IP:
- $formatted = $sk->userLink( $target->getId(), $target );
- $formatted .= $sk->userToolLinks(
+ $formatted = Linker::userLink( $target->getId(), $target );
+ $formatted .= Linker::userToolLinks(
$target->getId(),
$target,
false,
@@ -283,21 +291,21 @@ class BlockListPager extends TablePager {
break;
case 'ipb_expiry':
- $formatted = $wgLang->formatExpiry( $value, /* User preference timezone */ true );
- if( $wgUser->isAllowed( 'block' ) ){
+ $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */ true );
+ if( $this->getUser()->isAllowed( 'block' ) ){
if( $row->ipb_auto ){
- $links[] = $sk->linkKnown(
+ $links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Unblock' ),
$msg['unblocklink'],
array(),
array( 'wpTarget' => "#{$row->ipb_id}" )
);
} else {
- $links[] = $sk->linkKnown(
+ $links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Unblock', $row->ipb_address ),
$msg['unblocklink']
);
- $links[] = $sk->linkKnown(
+ $links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Block', $row->ipb_address ),
$msg['change-blocklink']
);
@@ -305,21 +313,23 @@ class BlockListPager extends TablePager {
$formatted .= ' ' . Html::rawElement(
'span',
array( 'class' => 'mw-blocklist-actions' ),
- wfMsg( 'parentheses', $wgLang->pipeList( $links ) )
+ $this->msg( 'parentheses' )->rawParams(
+ $this->getLanguage()->pipeList( $links ) )->escaped()
);
}
break;
case 'ipb_by':
- $user = User::newFromId( $value );
- if( $user instanceof User ){
- $formatted = $sk->userLink( $user->getId(), $user->getName() );
- $formatted .= $sk->userToolLinks( $user->getId(), $user->getName() );
+ if ( isset( $row->by_user_name ) ) {
+ $formatted = Linker::userLink( $value, $row->by_user_name );
+ $formatted .= Linker::userToolLinks( $value, $row->by_user_name );
+ } else {
+ $formatted = htmlspecialchars( $row->ipb_by_text ); // foreign user?
}
break;
case 'ipb_reason':
- $formatted = $sk->commentBlock( $value );
+ $formatted = Linker::commentBlock( $value );
break;
case 'ipb_params':
@@ -342,7 +352,7 @@ class BlockListPager extends TablePager {
$properties[] = $msg['blocklist-nousertalk'];
}
- $formatted = $wgLang->commaList( $properties );
+ $formatted = $this->getLanguage()->commaList( $properties );
break;
default:
@@ -355,12 +365,14 @@ class BlockListPager extends TablePager {
function getQueryInfo() {
$info = array(
- 'tables' => array( 'ipblocks' ),
+ 'tables' => array( 'ipblocks', 'user' ),
'fields' => array(
'ipb_id',
'ipb_address',
'ipb_user',
'ipb_by',
+ 'ipb_by_text',
+ 'user_name AS by_user_name',
'ipb_reason',
'ipb_timestamp',
'ipb_auto',
@@ -375,12 +387,12 @@ class BlockListPager extends TablePager {
'ipb_allow_usertalk',
),
'conds' => $this->conds,
+ 'join_conds' => array( 'user' => array( 'LEFT JOIN', 'user_id = ipb_by' ) )
);
- global $wgUser;
# Is the user allowed to see hidden blocks?
- if ( !$wgUser->isAllowed( 'hideuser' ) ){
- $conds['ipb_deleted'] = 0;
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ){
+ $info['conds']['ipb_deleted'] = 0;
}
return $info;
@@ -402,8 +414,37 @@ class BlockListPager extends TablePager {
return false;
}
- function getTitle() {
- return $this->page->getTitle();
+ /**
+ * Do a LinkBatch query to minimise database load when generating all these links
+ * @param $result
+ */
+ function preprocessResults( $result ){
+ wfProfileIn( __METHOD__ );
+ # Do a link batch query
+ $lb = new LinkBatch;
+ $lb->setCaller( __METHOD__ );
+
+ $userids = array();
+
+ foreach ( $result as $row ) {
+ $userids[] = $row->ipb_by;
+
+ # Usernames and titles are in fact related by a simple substitution of space -> underscore
+ # The last few lines of Title::secureAndSplit() tell the story.
+ $name = str_replace( ' ', '_', $row->ipb_address );
+ $lb->add( NS_USER, $name );
+ $lb->add( NS_USER_TALK, $name );
+ }
+
+ $ua = UserArray::newFromIDs( $userids );
+ foreach( $ua as $user ){
+ $name = str_replace( ' ', '_', $user->getName() );
+ $lb->add( NS_USER, $name );
+ $lb->add( NS_USER_TALK, $name );
+ }
+
+ $lb->execute();
+ wfProfileOut( __METHOD__ );
}
}
diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php
index 40747667..3840b2ff 100644
--- a/includes/specials/SpecialBlockme.php
+++ b/includes/specials/SpecialBlockme.php
@@ -33,18 +33,19 @@ class SpecialBlockme extends UnlistedSpecialPage {
}
function execute( $par ) {
- global $wgRequest, $wgOut, $wgBlockOpenProxies, $wgProxyKey;
+ global $wgBlockOpenProxies, $wgProxyKey;
$this->setHeaders();
$this->outputHeader();
- $ip = wfGetIP();
- if( !$wgBlockOpenProxies || $wgRequest->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
- $wgOut->addWikiMsg( 'proxyblocker-disabled' );
+ $ip = $this->getRequest()->getIP();
+ if( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
+ $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
return;
}
- $user = User::newFromName( wfMsgForContent( 'proxyblocker' ) );
+ $user = User::newFromName( $this->msg( 'proxyblocker' )->inContentLanguage()->text() );
+ # FIXME: newFromName could return false on a badly configured wiki.
if ( !$user->isLoggedIn() ) {
$user->addToDatabase();
}
@@ -52,10 +53,10 @@ class SpecialBlockme extends UnlistedSpecialPage {
$block = new Block();
$block->setTarget( $ip );
$block->setBlocker( $user );
- $block->mReason = wfMsg( 'proxyblockreason' );
+ $block->mReason = $this->msg( 'proxyblockreason' )->inContentLanguage()->text();
$block->insert();
- $wgOut->addWikiMsg( 'proxyblocksuccess' );
+ $this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
}
}
diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php
index 20819329..48ca4f05 100644
--- a/includes/specials/SpecialBooksources.php
+++ b/includes/specials/SpecialBooksources.php
@@ -115,11 +115,11 @@ class SpecialBookSources extends SpecialPage {
private function makeForm() {
global $wgScript;
- $form = '<fieldset><legend>' . wfMsgHtml( 'booksources-search-legend' ) . '</legend>';
+ $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( wfMsg( 'booksources-isbn' ), 'isbn', 'isbn', 20, $this->isbn );
- $form .= '&#160;' . Xml::submitButton( wfMsg( 'booksources-go' ) ) . '</p>';
+ $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>';
return $form;
@@ -139,7 +139,8 @@ class SpecialBookSources extends SpecialPage {
wfRunHooks( 'BookInformation', array( $this->isbn, $this->getOutput() ) );
# Check for a local page such as Project:Book_sources and use that if available
- $title = Title::makeTitleSafe( NS_PROJECT, wfMsgForContent( 'booksources' ) ); # Show list in content language
+ $page = $this->msg( 'booksources' )->inContentLanguage()->text();
+ $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
if( is_object( $title ) && $title->exists() ) {
$rev = Revision::newFromTitle( $title );
$this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $rev->getText() ) );
diff --git a/includes/specials/SpecialBrokenRedirects.php b/includes/specials/SpecialBrokenRedirects.php
index 2330c896..b8dbe9e8 100644
--- a/includes/specials/SpecialBrokenRedirects.php
+++ b/includes/specials/SpecialBrokenRedirects.php
@@ -22,7 +22,7 @@
*/
/**
- * A special page listing redirects tonon existent page. Those should be
+ * A special page listing redirects to non existent page. Those should be
* fixed to point to an existing page.
*
* @ingroup SpecialPage
@@ -38,7 +38,7 @@ class BrokenRedirectsPage extends PageQueryPage {
function sortDescending() { return false; }
function getPageHeader() {
- return wfMsgExt( 'brokenredirectstext', array( 'parse' ) );
+ return $this->msg( 'brokenredirectstext' )->parseAsBlock();
}
function getQueryInfo() {
@@ -47,6 +47,7 @@ class BrokenRedirectsPage extends PageQueryPage {
'p2' => 'page' ),
'fields' => array( 'p1.page_namespace AS namespace',
'p1.page_title AS title',
+ 'p1.page_title AS value',
'rd_namespace',
'rd_title'
),
@@ -77,8 +78,6 @@ class BrokenRedirectsPage extends PageQueryPage {
* @return String
*/
function formatResult( $skin, $result ) {
- global $wgUser, $wgLang;
-
$fromObj = Title::makeTitle( $result->namespace, $result->title );
if ( isset( $result->rd_title ) ) {
$toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title );
@@ -93,43 +92,43 @@ class BrokenRedirectsPage extends PageQueryPage {
// $toObj may very easily be false if the $result list is cached
if ( !is_object( $toObj ) ) {
- return '<del>' . $skin->link( $fromObj ) . '</del>';
+ return '<del>' . Linker::link( $fromObj ) . '</del>';
}
- $from = $skin->linkKnown(
+ $from = Linker::linkKnown(
$fromObj,
null,
array(),
array( 'redirect' => 'no' )
);
$links = array();
- $links[] = $skin->linkKnown(
+ $links[] = Linker::linkKnown(
$fromObj,
- wfMsgHtml( 'brokenredirects-edit' ),
+ $this->msg( 'brokenredirects-edit' )->escaped(),
array(),
array( 'action' => 'edit' )
);
- $to = $skin->link(
+ $to = Linker::link(
$toObj,
null,
array(),
array(),
array( 'broken' )
);
- $arr = $wgLang->getArrow();
+ $arr = $this->getLanguage()->getArrow();
- $out = $from . wfMsg( 'word-separator' );
+ $out = $from . $this->msg( 'word-separator' )->escaped();
- if( $wgUser->isAllowed( 'delete' ) ) {
- $links[] = $skin->linkKnown(
+ if( $this->getUser()->isAllowed( 'delete' ) ) {
+ $links[] = Linker::linkKnown(
$fromObj,
- wfMsgHtml( 'brokenredirects-delete' ),
+ $this->msg( 'brokenredirects-delete' )->escaped(),
array(),
array( 'action' => 'delete' )
);
}
- $out .= wfMsg( 'parentheses', $wgLang->pipeList( $links ) );
+ $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
$out .= " {$arr} {$to}";
return $out;
}
diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php
index 91d98b86..338cd706 100644
--- a/includes/specials/SpecialCategories.php
+++ b/includes/specials/SpecialCategories.php
@@ -31,20 +31,18 @@ class SpecialCategories extends SpecialPage {
}
function execute( $par ) {
- global $wgOut, $wgRequest;
-
$this->setHeaders();
$this->outputHeader();
- $wgOut->allowClickjacking();
+ $this->getOutput()->allowClickjacking();
- $from = $wgRequest->getText( 'from', $par );
+ $from = $this->getRequest()->getText( 'from', $par );
- $cap = new CategoryPager( $from );
+ $cap = new CategoryPager( $this->getContext(), $from );
$cap->doQuery();
- $wgOut->addHTML(
+ $this->getOutput()->addHTML(
Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
- wfMsgExt( 'categoriespagetext', array( 'parse' ), $cap->getNumRows() ) .
+ $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
$cap->getStartForm( $from ) .
$cap->getNavigationBar() .
'<ul>' . $cap->getBody() . '</ul>' .
@@ -61,12 +59,16 @@ class SpecialCategories extends SpecialPage {
* @ingroup SpecialPage Pager
*/
class CategoryPager extends AlphabeticPager {
- function __construct( $from ) {
- parent::__construct();
+ private $conds = array( 'cat_pages > 0' );
+
+ function __construct( IContextSource $context, $from ) {
+ parent::__construct( $context );
$from = str_replace( ' ', '_', $from );
if( $from !== '' ) {
$from = Title::capitalize( $from, NS_CATEGORY );
- $this->mOffset = $from;
+ $dbr = wfGetDB( DB_SLAVE );
+ $this->conds[] = 'cat_title >= ' . $dbr->addQuotes( $from );
+ $this->setOffset( '' );
}
}
@@ -74,15 +76,11 @@ class CategoryPager extends AlphabeticPager {
return array(
'tables' => array( 'category' ),
'fields' => array( 'cat_title','cat_pages' ),
- 'conds' => array( 'cat_pages > 0' ),
+ 'conds' => $this->conds,
'options' => array( 'USE INDEX' => 'cat_title' ),
);
}
- function getTitle() {
- return SpecialPage::getTitleFor( 'Categories' );
- }
-
function getIndexField() {
# return array( 'abc' => 'cat_title', 'count' => 'cat_pages' );
return 'cat_title';
@@ -118,12 +116,10 @@ class CategoryPager extends AlphabeticPager {
}
function formatRow($result) {
- global $wgLang;
$title = Title::makeTitle( NS_CATEGORY, $result->cat_title );
$titleText = Linker::link( $title, htmlspecialchars( $title->getText() ) );
- $count = wfMsgExt( 'nmembers', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->cat_pages ) );
- return Xml::tags('li', null, wfSpecialList( $titleText, $count ) ) . "\n";
+ $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
+ return Xml::tags( 'li', null, $this->getLanguage()->specialList( $titleText, $count ) ) . "\n";
}
public function getStartForm( $from ) {
@@ -132,10 +128,10 @@ class CategoryPager extends AlphabeticPager {
return
Xml::tags( 'form', array( 'method' => 'get', 'action' => $wgScript ),
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::fieldset( wfMsg( 'categories' ),
- Xml::inputLabel( wfMsg( 'categoriesfrom' ),
+ Xml::fieldset( $this->msg( 'categories' )->text(),
+ Xml::inputLabel( $this->msg( 'categoriesfrom' )->text(),
'from', 'from', 20, $from ) .
' ' .
- Xml::submitButton( wfMsg( 'allpagessubmit' ) ) ) );
+ Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) ) );
}
}
diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php
new file mode 100644
index 00000000..0f85f516
--- /dev/null
+++ b/includes/specials/SpecialChangeEmail.php
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Implements Special:ChangeEmail
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to 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 change their email address.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialChangeEmail extends UnlistedSpecialPage {
+ public function __construct() {
+ parent::__construct( 'ChangeEmail' );
+ }
+
+ function isListed() {
+ global $wgAuth;
+ return $wgAuth->allowPropChange( 'emailaddress' );
+ }
+
+ /**
+ * Main execution point
+ */
+ function execute( $par ) {
+ global $wgAuth;
+
+ $this->checkReadOnly();
+
+ $this->setHeaders();
+ $this->outputHeader();
+
+ if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
+ $this->error( 'cannotchangeemail' );
+ return;
+ }
+
+ $user = $this->getUser();
+ $request = $this->getRequest();
+
+ if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
+ $this->error( 'changeemail-no-info' );
+ return;
+ }
+
+ if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
+ $this->doReturnTo();
+ return;
+ }
+
+ $out = $this->getOutput();
+ $out->disallowUserJs();
+ $out->addModules( 'mediawiki.special.changeemail' );
+
+ $this->mPassword = $request->getVal( 'wpPassword' );
+ $this->mNewEmail = $request->getVal( 'wpNewEmail' );
+
+ if ( $request->wasPosted()
+ && $user->matchEditToken( $request->getVal( 'token' ) ) )
+ {
+ $info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail );
+ if ( $info === true ) {
+ $this->doReturnTo();
+ } elseif ( $info === 'eauth' ) {
+ # Notify user that a confirmation email has been sent...
+ $out->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
+ 'eauthentsent', $user->getName() );
+ $this->doReturnTo( 'soft' ); // just show the link to go back
+ return; // skip form
+ }
+ }
+
+ $this->showForm();
+ }
+
+ protected function doReturnTo( $type = 'hard' ) {
+ $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
+ if ( !$titleObj instanceof Title ) {
+ $titleObj = Title::newMainPage();
+ }
+ if ( $type == 'hard' ) {
+ $this->getOutput()->redirect( $titleObj->getFullURL() );
+ } else {
+ $this->getOutput()->addReturnTo( $titleObj );
+ }
+ }
+
+ protected function error( $msg ) {
+ $this->getOutput()->wrapWikiMsg( "<p class='error'>\n$1\n</p>", $msg );
+ }
+
+ protected function showForm() {
+ $user = $this->getUser();
+
+ $oldEmailText = $user->getEmail()
+ ? $user->getEmail()
+ : $this->msg( 'changeemail-none' )->text();
+
+ $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" .
+ $this->pretty( array(
+ array( 'wpName', 'username', 'text', $user->getName() ),
+ array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
+ array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
+ array( 'wpPassword', 'yourpassword', 'password', $this->mPassword ),
+ ) ) . "\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' ) ) .
+ "</td>\n" .
+ "</tr>\n" .
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'fieldset' ) . "\n"
+ );
+ }
+
+ protected function pretty( $fields ) {
+ $out = '';
+ foreach ( $fields as $list ) {
+ list( $name, $label, $type, $value ) = $list;
+ if( $type == 'text' ) {
+ $field = htmlspecialchars( $value );
+ } else {
+ $attribs = array( 'id' => $name );
+ if ( $name == 'wpPassword' ) {
+ $attribs[] = 'autofocus';
+ }
+ $field = Html::input( $name, $value, $type, $attribs );
+ }
+ $out .= "<tr>\n";
+ $out .= "\t<td class='mw-label'>";
+ if ( $type != 'text' ) {
+ $out .= Xml::label( $this->msg( $label )->text(), $name );
+ } else {
+ $out .= $this->msg( $label )->escaped();
+ }
+ $out .= "</td>\n";
+ $out .= "\t<td class='mw-input'>";
+ $out .= $field;
+ $out .= "</td>\n";
+ $out .= "</tr>";
+ }
+ return $out;
+ }
+
+ /**
+ * @return bool|string true or string on success, false on failure
+ */
+ protected function attemptChange( User $user, $pass, $newaddr ) {
+ if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
+ $this->error( 'invalidemailaddress' );
+ return false;
+ }
+
+ $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
+ if ( $throttleCount === true ) {
+ $this->error( 'login-throttled' );
+ return false;
+ }
+
+ if ( !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
+ $this->error( 'wrongpassword' );
+ return false;
+ }
+
+ if ( $throttleCount ) {
+ LoginForm::clearLoginThrottle( $user->getName() );
+ }
+
+ list( $status, $info ) = Preferences::trySetUserEmail( $user, $newaddr );
+ if ( $status !== true ) {
+ if ( $status instanceof Status ) {
+ $this->getOutput()->addHTML(
+ '<p class="error">' .
+ $this->getOutput()->parseInline( $status->getWikiText( $info ) ) .
+ '</p>' );
+ }
+ return false;
+ }
+
+ $user->saveSettings();
+ return $info ? $info : true;
+ }
+}
diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php
index 46562b36..f6482ef5 100644
--- a/includes/specials/SpecialChangePassword.php
+++ b/includes/specials/SpecialChangePassword.php
@@ -26,7 +26,7 @@
*
* @ingroup SpecialPage
*/
-class SpecialChangePassword extends SpecialPage {
+class SpecialChangePassword extends UnlistedSpecialPage {
public function __construct() {
parent::__construct( 'ChangePassword' );
}
@@ -35,47 +35,46 @@ class SpecialChangePassword extends SpecialPage {
* Main execution point
*/
function execute( $par ) {
- global $wgUser, $wgAuth, $wgOut, $wgRequest;
+ global $wgAuth;
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
+ $this->checkReadOnly();
- $this->mUserName = $wgRequest->getVal( 'wpName' );
- $this->mOldpass = $wgRequest->getVal( 'wpPassword' );
- $this->mNewpass = $wgRequest->getVal( 'wpNewPassword' );
- $this->mRetype = $wgRequest->getVal( 'wpRetype' );
- $this->mDomain = $wgRequest->getVal( 'wpDomain' );
+ $request = $this->getRequest();
+ $this->mUserName = trim( $request->getVal( 'wpName' ) );
+ $this->mOldpass = $request->getVal( 'wpPassword' );
+ $this->mNewpass = $request->getVal( 'wpNewPassword' );
+ $this->mRetype = $request->getVal( 'wpRetype' );
+ $this->mDomain = $request->getVal( 'wpDomain' );
$this->setHeaders();
$this->outputHeader();
- $wgOut->disallowUserJs();
+ $this->getOutput()->disallowUserJs();
- if( !$wgRequest->wasPosted() && !$wgUser->isLoggedIn() ) {
- $this->error( wfMsg( 'resetpass-no-info' ) );
+ $user = $this->getUser();
+ if( !$request->wasPosted() && !$user->isLoggedIn() ) {
+ $this->error( $this->msg( 'resetpass-no-info' )->text() );
return;
}
- if( $wgRequest->wasPosted() && $wgRequest->getBool( 'wpCancel' ) ) {
+ if( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
$this->doReturnTo();
return;
}
- if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getVal( 'token' ) ) ) {
+ if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
try {
if ( isset( $_SESSION['wsDomain'] ) ) {
$this->mDomain = $_SESSION['wsDomain'];
}
$wgAuth->setDomain( $this->mDomain );
if( !$wgAuth->allowPasswordChange() ) {
- $this->error( wfMsg( 'resetpass_forbidden' ) );
+ $this->error( $this->msg( 'resetpass_forbidden' )->text() );
return;
}
$this->attemptReset( $this->mNewpass, $this->mRetype );
- $wgOut->addWikiMsg( 'resetpass_success' );
- if( !$wgUser->isLoggedIn() ) {
+ $this->getOutput()->addWikiMsg( 'resetpass_success' );
+ if( !$user->isLoggedIn() ) {
LoginForm::setLoginToken();
$token = LoginForm::getLoginToken();
$data = array(
@@ -84,12 +83,13 @@ class SpecialChangePassword extends SpecialPage {
'wpDomain' => $this->mDomain,
'wpLoginToken' => $token,
'wpPassword' => $this->mNewpass,
- 'returnto' => $wgRequest->getVal( 'returnto' ),
+ 'returnto' => $request->getVal( 'returnto' ),
);
- if( $wgRequest->getCheck( 'wpRemember' ) ) {
+ if( $request->getCheck( 'wpRemember' ) ) {
$data['wpRemember'] = 1;
}
$login = new LoginForm( new FauxRequest( $data, true ) );
+ $login->setContext( $this->getContext() );
$login->execute( null );
}
$this->doReturnTo();
@@ -101,36 +101,33 @@ class SpecialChangePassword extends SpecialPage {
}
function doReturnTo() {
- global $wgRequest, $wgOut;
- $titleObj = Title::newFromText( $wgRequest->getVal( 'returnto' ) );
+ $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
if ( !$titleObj instanceof Title ) {
$titleObj = Title::newMainPage();
}
- $wgOut->redirect( $titleObj->getFullURL() );
+ $this->getOutput()->redirect( $titleObj->getFullURL() );
}
function error( $msg ) {
- global $wgOut;
- $wgOut->addHTML( Xml::element('p', array( 'class' => 'error' ), $msg ) );
+ $this->getOutput()->addHTML( Xml::element('p', array( 'class' => 'error' ), $msg ) );
}
function showForm() {
- global $wgOut, $wgUser, $wgRequest;
+ global $wgCookieExpiration;
- $self = $this->getTitle();
+ $user = $this->getUser();
if ( !$this->mUserName ) {
- $this->mUserName = $wgUser->getName();
+ $this->mUserName = $user->getName();
}
$rememberMe = '';
- if ( !$wgUser->isLoggedIn() ) {
- global $wgCookieExpiration, $wgLang;
+ if ( !$user->isLoggedIn() ) {
$rememberMe = '<tr>' .
'<td></td>' .
'<td class="mw-input">' .
Xml::checkLabel(
- wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+ $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
'wpRemember', 'wpRemember',
- $wgRequest->getCheck( 'wpRemember' ) ) .
+ $this->getRequest()->getCheck( 'wpRemember' ) ) .
'</td>' .
'</tr>';
$submitMsg = 'resetpass_submit';
@@ -139,18 +136,18 @@ class SpecialChangePassword extends SpecialPage {
$oldpassMsg = 'oldpassword';
$submitMsg = 'resetpass-submit-loggedin';
}
- $wgOut->addHTML(
- Xml::fieldset( wfMsg( 'resetpass_header' ) ) .
+ $this->getOutput()->addHTML(
+ Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
Xml::openElement( 'form',
array(
'method' => 'post',
- 'action' => $self->getLocalUrl(),
+ 'action' => $this->getTitle()->getLocalUrl(),
'id' => 'mw-resetpass-form' ) ) . "\n" .
- Html::hidden( 'token', $wgUser->editToken() ) . "\n" .
+ Html::hidden( 'token', $user->getEditToken() ) . "\n" .
Html::hidden( 'wpName', $this->mUserName ) . "\n" .
Html::hidden( 'wpDomain', $this->mDomain ) . "\n" .
- Html::hidden( 'returnto', $wgRequest->getVal( 'returnto' ) ) . "\n" .
- wfMsgExt( 'resetpass_text', array( 'parse' ) ) . "\n" .
+ Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
+ $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
$this->pretty( array(
array( 'wpName', 'username', 'text', $this->mUserName ),
@@ -162,8 +159,8 @@ class SpecialChangePassword extends SpecialPage {
"<tr>\n" .
"<td></td>\n" .
'<td class="mw-input">' .
- Xml::submitButton( wfMsg( $submitMsg ) ) .
- Xml::submitButton( wfMsg( 'resetpass-submit-cancel' ), 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' ) .
@@ -192,9 +189,9 @@ class SpecialChangePassword extends SpecialPage {
$out .= "<tr>\n";
$out .= "\t<td class='mw-label'>";
if ( $type != 'text' )
- $out .= Xml::label( wfMsg( $label ), $name );
+ $out .= Xml::label( $this->msg( $label )->text(), $name );
else
- $out .= wfMsgHtml( $label );
+ $out .= $this->msg( $label )->escaped();
$out .= "</td>\n";
$out .= "\t<td class='mw-input'>";
$out .= $field;
@@ -210,22 +207,22 @@ class SpecialChangePassword extends SpecialPage {
protected function attemptReset( $newpass, $retype ) {
$user = User::newFromName( $this->mUserName );
if( !$user || $user->isAnon() ) {
- throw new PasswordError( wfMsg( 'nosuchusershort', $this->mUserName ) );
+ throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
}
if( $newpass !== $retype ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
- throw new PasswordError( wfMsg( 'badretype' ) );
+ throw new PasswordError( $this->msg( 'badretype' )->text() );
}
$throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
if ( $throttleCount === true ) {
- throw new PasswordError( wfMsg( 'login-throttled' ) );
+ throw new PasswordError( $this->msg( 'login-throttled' )->text() );
}
if( !$user->checkTemporaryPassword($this->mOldpass) && !$user->checkPassword($this->mOldpass) ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
- throw new PasswordError( wfMsg( 'resetpass-wrong-oldpass' ) );
+ throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
}
// Please reset throttle for successful logins, thanks!
diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php
index 6b9ef0a9..9e3c52b9 100644
--- a/includes/specials/SpecialComparePages.php
+++ b/includes/specials/SpecialComparePages.php
@@ -57,6 +57,7 @@ class SpecialComparePages extends SpecialPage {
'label-message' => 'compare-page1',
'size' => '40',
'section' => 'page1',
+ 'validation-callback' => array( $this, 'checkExistingTitle' ),
),
'Revision1' => array(
'type' => 'int',
@@ -64,6 +65,7 @@ class SpecialComparePages extends SpecialPage {
'label-message' => 'compare-rev1',
'size' => '8',
'section' => 'page1',
+ 'validation-callback' => array( $this, 'checkExistingRevision' ),
),
'Page2' => array(
'type' => 'text',
@@ -71,6 +73,7 @@ class SpecialComparePages extends SpecialPage {
'label-message' => 'compare-page2',
'size' => '40',
'section' => 'page2',
+ 'validation-callback' => array( $this, 'checkExistingTitle' ),
),
'Revision2' => array(
'type' => 'int',
@@ -78,6 +81,7 @@ class SpecialComparePages extends SpecialPage {
'label-message' => 'compare-rev2',
'size' => '8',
'section' => 'page2',
+ 'validation-callback' => array( $this, 'checkExistingRevision' ),
),
'Action' => array(
'type' => 'hidden',
@@ -87,29 +91,33 @@ class SpecialComparePages extends SpecialPage {
'type' => 'hidden',
'name' => 'diffonly',
),
- ), 'compare' );
- $form->setSubmitText( wfMsg( 'compare-submit' ) );
+ 'Unhide' => array(
+ 'type' => 'hidden',
+ 'name' => 'unhide',
+ ),
+ ), $this->getContext(), 'compare' );
+ $form->setSubmitTextMsg( 'compare-submit' );
$form->suppressReset();
$form->setMethod( 'get' );
- $form->setTitle( $this->getTitle() );
+ $form->setSubmitCallback( array( __CLASS__, 'showDiff' ) );
$form->loadData();
$form->displayForm( '' );
-
- self::showDiff( $form->mFieldData );
+ $form->trySubmit();
}
- public static function showDiff( $data ){
+ public static function showDiff( $data, HTMLForm $form ){
$rev1 = self::revOrTitle( $data['Revision1'], $data['Page1'] );
$rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
if( $rev1 && $rev2 ) {
- $de = new DifferenceEngine( null,
+ $de = new DifferenceEngine( $form->getContext(),
$rev1,
$rev2,
null, // rcid
- ( $data["Action"] == 'purge' ),
- false );
+ ( $data['Action'] == 'purge' ),
+ ( $data['Unhide'] == '1' )
+ );
$de->showDiffPage( true );
}
}
@@ -125,4 +133,29 @@ class SpecialComparePages extends SpecialPage {
}
return null;
}
+
+ public function checkExistingTitle( $value, $alldata ) {
+ if ( $value === '' || $value === null ) {
+ return true;
+ }
+ $title = Title::newFromText( $value );
+ if ( !$title instanceof Title ) {
+ return $this->msg( 'compare-invalid-title' )->parseAsBlock();
+ }
+ if ( !$title->exists() ) {
+ return $this->msg( 'compare-title-not-exists' )->parseAsBlock();
+ }
+ return true;
+ }
+
+ public function checkExistingRevision( $value, $alldata ) {
+ if ( $value === '' || $value === null ) {
+ return true;
+ }
+ $revision = Revision::newFromId( $value );
+ 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 70bbfe39..912f7733 100644
--- a/includes/specials/SpecialConfirmemail.php
+++ b/includes/specials/SpecialConfirmemail.php
@@ -46,11 +46,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
function execute( $code ) {
$this->setHeaders();
- if ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
+ $this->checkReadOnly();
- if( empty( $code ) ) {
+ if( $code === null || $code === '' ) {
if( $this->getUser()->isLoggedIn() ) {
if( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
$this->showRequestForm();
@@ -60,11 +58,11 @@ class EmailConfirmation extends UnlistedSpecialPage {
} else {
$llink = Linker::linkKnown(
SpecialPage::getTitleFor( 'Userlogin' ),
- wfMsgHtml( 'loginreqlink' ),
+ $this->msg( 'loginreqlink' )->escaped(),
array(),
array( 'returnto' => $this->getTitle()->getPrefixedText() )
);
- $this->getOutput()->addHTML( wfMessage( 'confirmemail_needlogin' )->rawParams( $llink )->parse() );
+ $this->getOutput()->addHTML( $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse() );
}
} else {
$this->attemptConfirm( $code );
@@ -89,9 +87,11 @@ class EmailConfirmation extends UnlistedSpecialPage {
// date and time are separate parameters to facilitate localisation.
// $time is kept for backward compat reasons.
// 'emailauthenticated' is also used in SpecialPreferences.php
- $time = $this->getLang()->timeAndDate( $user->mEmailAuthenticated, true );
- $d = $this->getLang()->date( $user->mEmailAuthenticated, true );
- $t = $this->getLang()->time( $user->mEmailAuthenticated, true );
+ $lang = $this->getLanguage();
+ $emailAuthenticated = $user->getEmailAuthenticationTimestamp();
+ $time = $lang->userTimeAndDate( $emailAuthenticated, $user );
+ $d = $lang->userDate( $emailAuthenticated, $user );
+ $t = $lang->userTime( $emailAuthenticated, $user );
$out->addWikiMsg( 'emailauthenticated', $time, $d, $t );
}
if( $user->isEmailConfirmationPending() ) {
@@ -99,8 +99,8 @@ class EmailConfirmation extends UnlistedSpecialPage {
}
$out->addWikiMsg( 'confirmemail_text' );
$form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
- $form .= Html::hidden( 'token', $user->editToken() );
- $form .= Xml::submitButton( wfMsg( 'confirmemail_send' ) );
+ $form .= Html::hidden( 'token', $user->getEditToken() );
+ $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
$form .= Xml::closeElement( 'form' );
$out->addHTML( $form );
}
diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php
index fea27bfd..31df4a9b 100644
--- a/includes/specials/SpecialContributions.php
+++ b/includes/specials/SpecialContributions.php
@@ -36,86 +36,96 @@ class SpecialContributions extends SpecialPage {
}
public function execute( $par ) {
- global $wgUser, $wgOut, $wgRequest;
-
$this->setHeaders();
$this->outputHeader();
- $wgOut->addModuleStyles( 'mediawiki.special' );
+ $out = $this->getOutput();
+ $out->addModuleStyles( 'mediawiki.special' );
$this->opts = array();
+ $request = $this->getRequest();
- if( $par == 'newbies' ) {
+ if ( $par == 'newbies' ) {
$target = 'newbies';
$this->opts['contribs'] = 'newbie';
- } elseif( isset( $par ) ) {
+ } elseif ( $par !== null ) {
$target = $par;
} else {
- $target = $wgRequest->getVal( 'target' );
+ $target = $request->getVal( 'target' );
}
// check for radiobox
- if( $wgRequest->getVal( 'contribs' ) == 'newbie' ) {
+ if ( $request->getVal( 'contribs' ) == 'newbie' ) {
$target = 'newbies';
$this->opts['contribs'] = 'newbie';
+ } else {
+ $this->opts['contribs'] = 'user';
}
- $this->opts['deletedOnly'] = $wgRequest->getBool( 'deletedOnly' );
+ $this->opts['deletedOnly'] = $request->getBool( 'deletedOnly' );
- if( !strlen( $target ) ) {
- $wgOut->addHTML( $this->getForm() );
+ if ( !strlen( $target ) ) {
+ $out->addHTML( $this->getForm() );
return;
}
- $this->opts['limit'] = $wgRequest->getInt( 'limit', $wgUser->getOption('rclimit') );
+ $user = $this->getUser();
+
+ $this->opts['limit'] = $request->getInt( 'limit', $user->getOption( 'rclimit' ) );
$this->opts['target'] = $target;
- $this->opts['topOnly'] = $wgRequest->getBool( 'topOnly' );
+ $this->opts['topOnly'] = $request->getBool( 'topOnly' );
$nt = Title::makeTitleSafe( NS_USER, $target );
- if( !$nt ) {
- $wgOut->addHTML( $this->getForm() );
+ if ( !$nt ) {
+ $out->addHTML( $this->getForm() );
return;
}
- $id = User::idFromName( $nt->getText() );
+ $userObj = User::newFromName( $nt->getText(), false );
+ if ( !$userObj ) {
+ $out->addHTML( $this->getForm() );
+ return;
+ }
+ $id = $userObj->getID();
- if( $target != 'newbies' ) {
+ if ( $this->opts['contribs'] != 'newbie' ) {
$target = $nt->getText();
- $wgOut->setSubtitle( $this->contributionsSub( $nt, $id ) );
- $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsgExt( 'contributions-title', array( 'parsemag' ),$target ) ) );
- $user = User::newFromName( $target, false );
- if ( is_object( $user ) ) {
- $this->getSkin()->setRelevantUser( $user );
- }
+ $out->addSubtitle( $this->contributionsSub( $userObj ) );
+ $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'contributions-title', $target )->plain() ) );
+ $this->getSkin()->setRelevantUser( $userObj );
} else {
- $wgOut->setSubtitle( wfMsgHtml( 'sp-contributions-newbies-sub') );
- $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsg( 'sp-contributions-newbies-title' ) ) );
+ $out->addSubtitle( $this->msg( 'sp-contributions-newbies-sub' ) );
+ $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'sp-contributions-newbies-title' )->plain() ) );
}
- if( ( $ns = $wgRequest->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+ if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
$this->opts['namespace'] = intval( $ns );
} else {
$this->opts['namespace'] = '';
}
- $this->opts['tagFilter'] = (string) $wgRequest->getVal( 'tagFilter' );
+ $this->opts['associated'] = $request->getBool( 'associated' );
+
+ $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
- if( $wgUser->isAllowed( 'markbotedits' ) && $wgRequest->getBool( 'bot' ) ) {
+ if ( $user->isAllowed( 'markbotedits' ) && $request->getBool( 'bot' ) ) {
$this->opts['bot'] = '1';
}
- $skip = $wgRequest->getText( 'offset' ) || $wgRequest->getText( 'dir' ) == 'prev';
+ $skip = $request->getText( 'offset' ) || $request->getText( 'dir' ) == 'prev';
# Offset overrides year/month selection
- if( $skip ) {
+ if ( $skip ) {
$this->opts['year'] = '';
$this->opts['month'] = '';
} else {
- $this->opts['year'] = $wgRequest->getIntOrNull( 'year' );
- $this->opts['month'] = $wgRequest->getIntOrNull( 'month' );
+ $this->opts['year'] = $request->getIntOrNull( 'year' );
+ $this->opts['month'] = $request->getIntOrNull( 'month' );
}
- $feedType = $wgRequest->getVal( 'feed' );
- if( $feedType ) {
+ $feedType = $request->getVal( 'feed' );
+ if ( $feedType ) {
// Maintain some level of backwards compatability
// If people request feeds using the old parameters, redirect to API
$apiParams = array(
@@ -129,8 +139,8 @@ class SpecialContributions extends SpecialPage {
if ( $this->opts['deletedOnly'] ) {
$apiParams['deletedonly'] = true;
}
- if ( $this->opts['tagFilter'] !== '' ) {
- $apiParams['tagfilter'] = $this->opts['tagFilter'];
+ if ( $this->opts['tagfilter'] !== '' ) {
+ $apiParams['tagfilter'] = $this->opts['tagfilter'];
}
if ( $this->opts['namespace'] !== '' ) {
$apiParams['namespace'] = $this->opts['namespace'];
@@ -144,7 +154,7 @@ class SpecialContributions extends SpecialPage {
$url = wfScript( 'api' ) . '?' . wfArrayToCGI( $apiParams );
- $wgOut->redirect( $url, '301' );
+ $out->redirect( $url, '301' );
return;
}
@@ -153,47 +163,49 @@ class SpecialContributions extends SpecialPage {
if ( wfRunHooks( 'SpecialContributionsBeforeMainOutput', array( $id ) ) ) {
- $wgOut->addHTML( $this->getForm() );
+ $out->addHTML( $this->getForm() );
- $pager = new ContribsPager( array(
+ $pager = new ContribsPager( $this->getContext(), array(
'target' => $target,
+ 'contribs' => $this->opts['contribs'],
'namespace' => $this->opts['namespace'],
'year' => $this->opts['year'],
'month' => $this->opts['month'],
'deletedOnly' => $this->opts['deletedOnly'],
'topOnly' => $this->opts['topOnly'],
+ 'nsInvert' => $this->opts['nsInvert'],
+ 'associated' => $this->opts['associated'],
) );
- if( !$pager->getNumRows() ) {
- $wgOut->addWikiMsg( 'nocontribs', $target );
+ if ( !$pager->getNumRows() ) {
+ $out->addWikiMsg( 'nocontribs', $target );
} else {
# Show a message about slave lag, if applicable
$lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
- if( $lag > 0 )
- $wgOut->showLagWarning( $lag );
+ if ( $lag > 0 )
+ $out->showLagWarning( $lag );
- $wgOut->addHTML(
+ $out->addHTML(
'<p>' . $pager->getNavigationBar() . '</p>' .
$pager->getBody() .
'<p>' . $pager->getNavigationBar() . '</p>'
);
}
- $wgOut->preventClickjacking( $pager->getPreventClickjacking() );
+ $out->preventClickjacking( $pager->getPreventClickjacking() );
# Show the appropriate "footer" message - WHOIS tools, etc.
- if( $target != 'newbies' ) {
+ if ( $this->opts['contribs'] != 'newbie' ) {
$message = 'sp-contributions-footer';
if ( IP::isIPAddress( $target ) ) {
$message = 'sp-contributions-footer-anon';
} else {
- $user = User::newFromName( $target );
- if ( !$user || $user->isAnon() ) {
+ if ( $userObj->isAnon() ) {
// No message for non-existing users
return;
}
}
- if( !wfMessage( $message, $target )->isDisabled() ) {
- $wgOut->wrapWikiMsg(
+ if ( !$this->msg( $message, $target )->isDisabled() ) {
+ $out->wrapWikiMsg(
"<div class='mw-contributions-footer'>\n$1\n</div>",
array( $message, $target ) );
}
@@ -203,33 +215,29 @@ class SpecialContributions extends SpecialPage {
/**
* Generates the subheading with links
- * @param $nt Title object for the target
- * @param $id Integer: User ID for the target
+ * @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.
*/
- protected function contributionsSub( $nt, $id ) {
- global $wgLang, $wgUser, $wgOut;
-
- $sk = $this->getSkin();
-
- if ( $id === null ) {
- $user = htmlspecialchars( $nt->getText() );
+ protected function contributionsSub( $userObj ) {
+ if ( $userObj->isAnon() ) {
+ $user = htmlspecialchars( $userObj->getName() );
} else {
- $user = $sk->link( $nt, htmlspecialchars( $nt->getText() ) );
+ $user = Linker::link( $userObj->getUserPage(), htmlspecialchars( $userObj->getName() ) );
}
- $userObj = User::newFromName( $nt->getText(), /* check for username validity not needed */ false );
- $talk = $nt->getTalkPage();
- if( $talk ) {
- $tools = self::getUserLinks( $nt, $talk, $userObj, $wgUser );
- $links = $wgLang->pipeList( $tools );
+ $nt = $userObj->getUserPage();
+ $talk = $userObj->getTalkPage();
+ if ( $talk ) {
+ $tools = $this->getUserLinks( $nt, $talk, $userObj );
+ $links = $this->getLanguage()->pipeList( $tools );
// Show a note if the user is blocked and display the last block log entry.
if ( $userObj->isBlocked() ) {
+ $out = $this->getOutput(); // showLogExtract() wants first parameter by reference
LogEventsList::showLogExtract(
- $wgOut,
+ $out,
'block',
- $nt->getPrefixedText(),
+ $nt,
'',
array(
'lim' => 1,
@@ -238,9 +246,9 @@ class SpecialContributions extends SpecialPage {
$userObj->isAnon() ?
'sp-contributions-blocked-notice-anon' :
'sp-contributions-blocked-notice',
- $nt->getText() # Support GENDER in 'sp-contributions-blocked-notice'
+ $userObj->getName() # Support GENDER in 'sp-contributions-blocked-notice'
),
- 'offset' => '' # don't use $wgRequest parameter offset
+ 'offset' => '' # don't use WebRequest parameter offset
)
);
}
@@ -250,10 +258,11 @@ class SpecialContributions extends SpecialPage {
// 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'.
- if( wfEmptyMsg( 'contribsub' ) ) {
- return wfMsgHtml( 'contribsub2', $user, $links );
+ $oldMsg = $this->msg( 'contribsub' );
+ if ( $oldMsg->exists() ) {
+ return $oldMsg->rawParams( "$user ($links)" );
} else {
- return wfMsgHtml( 'contribsub', "$user ($links)" );
+ return $this->msg( 'contribsub2' )->rawParams( $user, $links );
}
}
@@ -262,38 +271,37 @@ class SpecialContributions extends SpecialPage {
* @param $userpage Title: Target user page
* @param $talkpage Title: Talk page
* @param $target User: Target user object
- * @param $subject User: The viewing user ($wgUser is still checked in some cases, like userrights page!!)
+ * @return array
*/
- public static function getUserLinks( Title $userpage, Title $talkpage, User $target, User $subject ) {
+ public function getUserLinks( Title $userpage, Title $talkpage, User $target ) {
- $sk = $subject->getSkin();
$id = $target->getId();
$username = $target->getName();
- $tools[] = $sk->link( $talkpage, wfMsgHtml( 'sp-contributions-talk' ) );
+ $tools[] = Linker::link( $talkpage, $this->msg( 'sp-contributions-talk' )->escaped() );
- if( ( $id !== null ) || ( $id === null && IP::isIPAddress( $username ) ) ) {
- if( $subject->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+ if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $username ) ) ) {
+ if ( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
if ( $target->isBlocked() ) {
- $tools[] = $sk->linkKnown( # Change block link
+ $tools[] = Linker::linkKnown( # Change block link
SpecialPage::getTitleFor( 'Block', $username ),
- wfMsgHtml( 'change-blocklink' )
+ $this->msg( 'change-blocklink' )->escaped()
);
- $tools[] = $sk->linkKnown( # Unblock link
+ $tools[] = Linker::linkKnown( # Unblock link
SpecialPage::getTitleFor( 'Unblock', $username ),
- wfMsgHtml( 'unblocklink' )
+ $this->msg( 'unblocklink' )->escaped()
);
} else { # User is not blocked
- $tools[] = $sk->linkKnown( # Block link
+ $tools[] = Linker::linkKnown( # Block link
SpecialPage::getTitleFor( 'Block', $username ),
- wfMsgHtml( 'blocklink' )
+ $this->msg( 'blocklink' )->escaped()
);
}
}
# Block log link
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log', 'block' ),
- wfMsgHtml( 'sp-contributions-blocklog' ),
+ $this->msg( 'sp-contributions-blocklog' )->escaped(),
array(),
array(
'page' => $userpage->getPrefixedText()
@@ -301,31 +309,32 @@ class SpecialContributions extends SpecialPage {
);
}
# Uploads
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Listfiles', $username ),
- wfMsgHtml( 'sp-contributions-uploads' )
+ $this->msg( 'sp-contributions-uploads' )->escaped()
);
# Other logs link
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log', $username ),
- wfMsgHtml( 'sp-contributions-logs' )
+ $this->msg( 'sp-contributions-logs' )->escaped()
);
# Add link to deleted user contributions for priviledged users
- if( $subject->isAllowed( 'deletedhistory' ) ) {
- $tools[] = $sk->linkKnown(
+ if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'DeletedContributions', $username ),
- wfMsgHtml( 'sp-contributions-deleted' )
+ $this->msg( 'sp-contributions-deleted' )->escaped()
);
}
# Add a link to change user rights for privileged users
$userrightsPage = new UserrightsPage();
- if( $id !== null && $userrightsPage->userCanChangeRights( $target ) ) {
- $tools[] = $sk->linkKnown(
+ $userrightsPage->setContext( $this->getContext() );
+ if ( $id !== null && $userrightsPage->userCanChangeRights( $target ) ) {
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Userrights', $username ),
- wfMsgHtml( 'sp-contributions-userrights' )
+ $this->msg( 'sp-contributions-userrights' )->escaped()
);
}
@@ -341,82 +350,185 @@ class SpecialContributions extends SpecialPage {
global $wgScript;
$this->opts['title'] = $this->getTitle()->getPrefixedText();
- if( !isset( $this->opts['target'] ) ) {
+ if ( !isset( $this->opts['target'] ) ) {
$this->opts['target'] = '';
} else {
$this->opts['target'] = str_replace( '_' , ' ' , $this->opts['target'] );
}
- if( !isset( $this->opts['namespace'] ) ) {
+ if ( !isset( $this->opts['namespace'] ) ) {
$this->opts['namespace'] = '';
}
- if( !isset( $this->opts['contribs'] ) ) {
+ if ( !isset( $this->opts['nsInvert'] ) ) {
+ $this->opts['nsInvert'] = '';
+ }
+
+ if ( !isset( $this->opts['associated'] ) ) {
+ $this->opts['associated'] = false;
+ }
+
+ if ( !isset( $this->opts['contribs'] ) ) {
$this->opts['contribs'] = 'user';
}
- if( !isset( $this->opts['year'] ) ) {
+ if ( !isset( $this->opts['year'] ) ) {
$this->opts['year'] = '';
}
- if( !isset( $this->opts['month'] ) ) {
+ if ( !isset( $this->opts['month'] ) ) {
$this->opts['month'] = '';
}
- if( $this->opts['contribs'] == 'newbie' ) {
+ if ( $this->opts['contribs'] == 'newbie' ) {
$this->opts['target'] = '';
}
- if( !isset( $this->opts['tagFilter'] ) ) {
- $this->opts['tagFilter'] = '';
+ if ( !isset( $this->opts['tagfilter'] ) ) {
+ $this->opts['tagfilter'] = '';
}
- if( !isset( $this->opts['topOnly'] ) ) {
+ if ( !isset( $this->opts['topOnly'] ) ) {
$this->opts['topOnly'] = false;
}
- $f = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+ $form = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
# Add hidden params for tracking except for parameters in $skipParameters
- $skipParameters = array( 'namespace', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly' );
+ $skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
foreach ( $this->opts as $name => $value ) {
- if( in_array( $name, $skipParameters ) ) {
+ if ( in_array( $name, $skipParameters ) ) {
continue;
}
- $f .= "\t" . Html::hidden( $name, $value ) . "\n";
+ $form .= "\t" . Html::hidden( $name, $value ) . "\n";
}
- $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagFilter'] );
+ $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
- $f .= Xml::fieldset( wfMsg( 'sp-contributions-search' ) ) .
- Xml::radioLabel( wfMsgExt( 'sp-contributions-newbies', array( 'parsemag' ) ),
- 'contribs', 'newbie' , 'newbie', $this->opts['contribs'] == 'newbie' ) . '<br />' .
- Xml::radioLabel( wfMsgExt( 'sp-contributions-username', array( 'parsemag' ) ),
- 'contribs' , 'user', 'user', $this->opts['contribs'] == 'user' ) . ' ' .
- Html::input( 'target', $this->opts['target'], 'text', array(
- 'size' => '20',
- 'required' => ''
- ) + ( $this->opts['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
+ if ( $tagFilter ) {
+ $filterSelection =
+ Xml::tags( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
+ Xml::tags( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+ } else {
+ $filterSelection = Xml::tags( 'td', array( 'colspan' => 2 ), '' );
+ }
+
+ $targetSelection = Xml::tags( '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' => '20', 'required' => '', 'class' => 'mw-input' ) +
+ ( $this->opts['target'] ? array() : array( 'autofocus' )
+ )
+ ) . ' '
+ ) ;
+
+ $namespaceSelection =
+ Xml::tags( 'td', array( 'class' => 'mw-label' ),
+ Xml::label(
+ $this->msg( 'namespace' )->text(),
+ 'namespace',
+ ''
+ )
+ ) .
+ Xml::tags( 'td', null,
+ Xml::namespaceSelector( $this->opts['namespace'], '' ) . '&#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' )
+ ) . '&#160;'
+ ) .
+ Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+ Xml::checkLabel(
+ $this->msg( 'namespace_association' )->text(),
+ 'associated',
+ 'associated',
+ $this->opts['associated'],
+ array( 'title' => $this->msg( 'tooltip-namespace_association' )->text(), 'class' => 'mw-input' )
+ ) . '&#160;'
+ )
+ ) ;
+
+ $extraOptions = Xml::tags( 'td', array( 'colspan' => 2 ),
Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
- Xml::label( wfMsg( 'namespace' ), 'namespace' ) . ' ' .
- Xml::namespaceSelector( $this->opts['namespace'], '' )
+ Xml::checkLabel(
+ $this->msg( 'history-show-deleted' )->text(),
+ 'deletedOnly',
+ 'mw-show-deleted-only',
+ $this->opts['deletedOnly'],
+ array( 'class' => 'mw-input' )
+ )
) .
- Xml::checkLabel( wfMsg( 'history-show-deleted' ),
- 'deletedOnly', 'mw-show-deleted-only', $this->opts['deletedOnly'] ) . '<br />' .
- Xml::tags( 'p', null, Xml::checkLabel( wfMsg( 'sp-contributions-toponly' ),
- 'topOnly', 'mw-show-top-only', $this->opts['topOnly'] ) ) .
- ( $tagFilter ? Xml::tags( 'p', null, implode( '&#160;', $tagFilter ) ) : '' ) .
- Html::rawElement( 'p', array( 'style' => 'white-space: nowrap' ),
- Xml::dateMenu( $this->opts['year'], $this->opts['month'] ) . ' ' .
- Xml::submitButton( wfMsg( 'sp-contributions-submit' ) )
- ) . ' ';
- $explain = wfMessage( 'sp-contributions-explain' );
+ 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' )
+ )
+ )
+ ) ;
+
+ $dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
+ Xml::dateMenu(
+ $this->opts['year'],
+ $this->opts['month']
+ ) . ' ' .
+ Xml::submitButton(
+ $this->msg( 'sp-contributions-submit' )->text(),
+ array( 'class' => 'mw-submit' )
+ )
+ ) ;
+
+ $form .=
+ Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
+ Xml::openElement( 'table', array( 'class' => 'mw-contributions-table' ) ) .
+ Xml::openElement( 'tr' ) .
+ $targetSelection .
+ Xml::closeElement( 'tr' ) .
+ Xml::openElement( 'tr' ) .
+ $namespaceSelection .
+ Xml::closeElement( 'tr' ) .
+ Xml::openElement( 'tr' ) .
+ $filterSelection .
+ Xml::closeElement( 'tr' ) .
+ Xml::openElement( 'tr' ) .
+ $extraOptions .
+ Xml::closeElement( 'tr' ) .
+ Xml::openElement( 'tr' ) .
+ $dateSelectionAndSubmit .
+ Xml::closeElement( 'tr' ) .
+ Xml::closeElement( 'table' );
+
+ $explain = $this->msg( 'sp-contributions-explain' );
if ( $explain->exists() ) {
- $f .= "<p id='mw-sp-contributions-explain'>{$explain}</p>";
+ $form .= "<p id='mw-sp-contributions-explain'>{$explain}</p>";
}
- $f .= Xml::closeElement('fieldset' ) .
+ $form .= Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' );
- return $f;
+ return $form;
}
}
@@ -430,18 +542,21 @@ class ContribsPager extends ReverseChronologicalPager {
var $namespace = '', $mDb;
var $preventClickjacking = false;
- function __construct( $options ) {
- parent::__construct();
+ function __construct( IContextSource $context, array $options ) {
+ parent::__construct( $context );
$msgs = array( 'uctop', 'diff', 'newarticle', 'rollbacklink', 'diff', 'hist', 'rev-delundel', 'pipe-separator' );
- foreach( $msgs as $msg ) {
- $this->messages[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
+ foreach ( $msgs as $msg ) {
+ $this->messages[$msg] = $this->msg( $msg )->escaped();
}
$this->target = isset( $options['target'] ) ? $options['target'] : '';
+ $this->contribs = isset( $options['contribs'] ) ? $options['contribs'] : 'users';
$this->namespace = isset( $options['namespace'] ) ? $options['namespace'] : '';
- $this->tagFilter = isset( $options['tagFilter'] ) ? $options['tagFilter'] : false;
+ $this->tagFilter = isset( $options['tagfilter'] ) ? $options['tagfilter'] : false;
+ $this->nsInvert = isset( $options['nsInvert'] ) ? $options['nsInvert'] : false;
+ $this->associated = isset( $options['associated'] ) ? $options['associated'] : false;
$this->deletedOnly = !empty( $options['deletedOnly'] );
$this->topOnly = !empty( $options['topOnly'] );
@@ -459,33 +574,35 @@ class ContribsPager extends ReverseChronologicalPager {
return $query;
}
- function getTitle() {
- return SpecialPage::getTitleFor( 'Contributions' );
- }
-
function getQueryInfo() {
- global $wgUser;
list( $tables, $index, $userCond, $join_cond ) = $this->getUserCond();
+ $user = $this->getUser();
$conds = array_merge( $userCond, $this->getNamespaceCond() );
+
// Paranoia: avoid brute force searches (bug 17342)
- if( !$wgUser->isAllowed( 'deletedhistory' ) ) {
- $conds[] = $this->mDb->bitAnd('rev_deleted',Revision::DELETED_USER) . ' = 0';
- } elseif( !$wgUser->isAllowed( 'suppressrevision' ) ) {
- $conds[] = $this->mDb->bitAnd('rev_deleted',Revision::SUPPRESSED_USER) .
+ if ( !$user->isAllowed( 'deletedhistory' ) ) {
+ $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
+ } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+ $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::SUPPRESSED_USER ) .
' != ' . Revision::SUPPRESSED_USER;
}
- $join_cond['page'] = array( 'INNER JOIN', 'page_id=rev_page' );
+
+ # Don't include orphaned revisions
+ $join_cond['page'] = Revision::pageJoinCond();
+ # Get the current user name for accounts
+ $join_cond['user'] = Revision::userJoinCond();
$queryInfo = array(
- 'tables' => $tables,
- 'fields' => array(
- 'page_namespace', 'page_title', 'page_is_new', 'page_latest', 'page_is_redirect',
- 'page_len','rev_id', 'rev_page', 'rev_text_id', 'rev_timestamp', 'rev_comment',
- 'rev_minor_edit', 'rev_user', 'rev_user_text', 'rev_parent_id', 'rev_deleted'
+ '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
);
@@ -505,31 +622,52 @@ class ContribsPager extends ReverseChronologicalPager {
function getUserCond() {
$condition = array();
$join_conds = array();
- if( $this->target == 'newbies' ) {
- $tables = array( 'user_groups', 'page', 'revision' );
+ $tables = array( 'revision', 'page', 'user' );
+ if ( $this->contribs == 'newbie' ) {
+ $tables[] = 'user_groups';
$max = $this->mDb->selectField( 'user', 'max(user_id)', false, __METHOD__ );
- $condition[] = 'rev_user >' . (int)($max - $max / 100);
+ $condition[] = 'rev_user >' . (int)( $max - $max / 100 );
$condition[] = 'ug_group IS NULL';
$index = 'user_timestamp';
# @todo FIXME: Other groups may have 'bot' rights
$join_conds['user_groups'] = array( 'LEFT JOIN', "ug_user = rev_user AND ug_group = 'bot'" );
} else {
- $tables = array( 'page', 'revision' );
- $condition['rev_user_text'] = $this->target;
- $index = 'usertext_timestamp';
+ if ( IP::isIPAddress( $this->target ) ) {
+ $condition['rev_user_text'] = $this->target;
+ $index = 'usertext_timestamp';
+ } else {
+ $condition['rev_user'] = User::idFromName( $this->target );
+ $index = 'user_timestamp';
+ }
}
- if( $this->deletedOnly ) {
+ if ( $this->deletedOnly ) {
$condition[] = "rev_deleted != '0'";
}
- if( $this->topOnly ) {
+ if ( $this->topOnly ) {
$condition[] = "rev_id = page_latest";
}
return array( $tables, $index, $condition, $join_conds );
}
function getNamespaceCond() {
- if( $this->namespace !== '' ) {
- return array( 'page_namespace' => (int)$this->namespace );
+ if ( $this->namespace !== '' ) {
+ $selectedNS = $this->mDb->addQuotes( $this->namespace );
+ $eq_op = $this->nsInvert ? '!=' : '=';
+ $bool_op = $this->nsInvert ? 'AND' : 'OR';
+
+ 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();
}
@@ -539,10 +677,62 @@ class ContribsPager extends ReverseChronologicalPager {
return 'rev_timestamp';
}
+ function doBatchLookups() {
+ $this->mResult->rewind();
+ $revIds = array();
+ foreach ( $this->mResult as $row ) {
+ if( $row->rev_parent_id ) {
+ $revIds[] = $row->rev_parent_id;
+ }
+ }
+ $this->mParentLens = $this->getParentLengths( $revIds );
+ $this->mResult->rewind(); // reset
+
+ # Do a link batch query
+ $this->mResult->seek( 0 );
+ $batch = new LinkBatch();
+ # Give some pointers to make (last) links
+ foreach ( $this->mResult as $row ) {
+ if ( $this->contribs === 'newbie' ) { // multiple users
+ $batch->add( NS_USER, $row->user_name );
+ $batch->add( NS_USER_TALK, $row->user_name );
+ }
+ $batch->add( $row->page_namespace, $row->page_title );
+ }
+ $batch->execute();
+ $this->mResult->seek( 0 );
+ }
+
+ /**
+ * Do a batched query to get the parent revision lengths
+ */
+ private function getParentLengths( array $revIds ) {
+ $revLens = array();
+ if ( !$revIds ) {
+ return $revLens; // empty
+ }
+ wfProfileIn( __METHOD__ );
+ $res = $this->getDatabase()->select( 'revision',
+ array( 'rev_id', 'rev_len' ),
+ array( 'rev_id' => $revIds ),
+ __METHOD__ );
+ foreach ( $res as $row ) {
+ $revLens[$row->rev_id] = $row->rev_len;
+ }
+ wfProfileOut( __METHOD__ );
+ return $revLens;
+ }
+
+ /**
+ * @return string
+ */
function getStartBody() {
return "<ul>\n";
}
+ /**
+ * @return string
+ */
function getEndBody() {
return "</ul>\n";
}
@@ -558,15 +748,13 @@ class ContribsPager extends ReverseChronologicalPager {
* @todo This would probably look a lot nicer in a table.
*/
function formatRow( $row ) {
- global $wgUser, $wgLang;
wfProfileIn( __METHOD__ );
- $sk = $this->getSkin();
$rev = new Revision( $row );
$classes = array();
$page = Title::newFromRow( $row );
- $link = $sk->link(
+ $link = Linker::link(
$page,
htmlspecialchars( $page->getPrefixedText() ),
array(),
@@ -574,19 +762,20 @@ class ContribsPager extends ReverseChronologicalPager {
);
# Mark current revisions
$topmarktext = '';
- if( $row->rev_id == $row->page_latest ) {
+ if ( $row->rev_id == $row->page_latest ) {
$topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
# Add rollback link
- if( !$row->page_is_new && $page->quickUserCan( 'rollback' )
+ if ( !$row->page_is_new && $page->quickUserCan( 'rollback' )
&& $page->quickUserCan( 'edit' ) )
{
$this->preventClickjacking();
- $topmarktext .= ' '.$sk->generateRollback( $rev );
+ $topmarktext .= ' ' . Linker::generateRollback( $rev );
}
}
+ $user = $this->getUser();
# Is there a visible previous revision?
- if( $rev->userCan( Revision::DELETED_TEXT ) && $rev->getParentId() !== 0 ) {
- $difftext = $sk->linkKnown(
+ if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
+ $difftext = Linker::linkKnown(
$page,
$this->messages['diff'],
array(),
@@ -598,77 +787,78 @@ class ContribsPager extends ReverseChronologicalPager {
} else {
$difftext = $this->messages['diff'];
}
- $histlink = $sk->linkKnown(
+ $histlink = Linker::linkKnown(
$page,
$this->messages['hist'],
array(),
array( 'action' => 'history' )
);
- $comment = $wgLang->getDirMark() . $sk->revComment( $rev, false, true );
- $date = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->rev_timestamp ), true );
- if( $rev->userCan( Revision::DELETED_TEXT ) ) {
- $d = $sk->linkKnown(
+ if ( $row->rev_parent_id === null ) {
+ // 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 = ' . . ' . Linker::formatRevisionSize( $row->rev_len ) . ' . . ';
+ } else {
+ $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
+ $chardiff = ' . . ' . ChangesList::showCharacterDifference(
+ $parentLen, $row->rev_len ) . ' . . ';
+ }
+
+ $lang = $this->getLanguage();
+ $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true );
+ $date = $lang->userTimeAndDate( $row->rev_timestamp, $user );
+ if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ $d = Linker::linkKnown(
$page,
- htmlspecialchars($date),
+ htmlspecialchars( $date ),
array(),
array( 'oldid' => intval( $row->rev_id ) )
);
} else {
$d = htmlspecialchars( $date );
}
- if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
$d = '<span class="history-deleted">' . $d . '</span>';
}
- if( $this->target == 'newbies' ) {
- $userlink = ' . . ' . $sk->userLink( $row->rev_user, $row->rev_user_text );
- $userlink .= ' ' . wfMsg( 'parentheses', $sk->userTalkLink( $row->rev_user, $row->rev_user_text ) ) . ' ';
+ # 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 .= ' ' . $this->msg( 'parentheses' )->rawParams(
+ Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
} else {
$userlink = '';
}
- if( $rev->getParentId() === 0 ) {
+ if ( $rev->getParentId() === 0 ) {
$nflag = ChangesList::flag( 'newpage' );
} else {
$nflag = '';
}
- if( $rev->isMinor() ) {
+ if ( $rev->isMinor() ) {
$mflag = ChangesList::flag( 'minor' );
} else {
$mflag = '';
}
- // Don't show useless link to people who cannot hide revisions
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- if( $canHide || ($rev->getVisibility() && $wgUser->isAllowed('deletedhistory')) ) {
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $del = $this->mSkin->revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
- } else {
- $query = array(
- 'type' => 'revision',
- 'target' => $page->getPrefixedDbkey(),
- 'ids' => $rev->getId()
- );
- $del = $this->mSkin->revDeleteLink( $query,
- $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
- }
+ $del = Linker::getRevDeleteLink( $user, $rev, $page );
+ if ( $del !== '' ) {
$del .= ' ';
- } else {
- $del = '';
}
$diffHistLinks = '(' . $difftext . $this->messages['pipe-separator'] . $histlink . ')';
- $ret = "{$del}{$d} {$diffHistLinks} {$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
+ $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
# Denote if username is redacted for this edit
- if( $rev->isDeleted( Revision::DELETED_USER ) ) {
- $ret .= " <strong>" . wfMsgHtml('rev-deleted-user-contribs') . "</strong>";
+ if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+ $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";
diff --git a/includes/specials/SpecialDeadendpages.php b/includes/specials/SpecialDeadendpages.php
index f8ef4d44..1266a0ce 100644
--- a/includes/specials/SpecialDeadendpages.php
+++ b/includes/specials/SpecialDeadendpages.php
@@ -33,7 +33,7 @@ class DeadendPagesPage extends PageQueryPage {
}
function getPageHeader() {
- return wfMsgExt( 'deadendpagestext', array( 'parse' ) );
+ return $this->msg( 'deadendpagestext' )->parseAsBlock();
}
/**
diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php
index 65858482..3498a16d 100644
--- a/includes/specials/SpecialDeletedContributions.php
+++ b/includes/specials/SpecialDeletedContributions.php
@@ -31,11 +31,11 @@ class DeletedContribsPager extends IndexPager {
var $messages, $target;
var $namespace = '', $mDb;
- function __construct( $target, $namespace = false ) {
- parent::__construct();
+ function __construct( IContextSource $context, $target, $namespace = false ) {
+ parent::__construct( $context );
$msgs = array( 'deletionlog', 'undeleteviewlink', 'diff' );
foreach( $msgs as $msg ) {
- $this->messages[$msg] = wfMsgExt( $msg, array( 'escapenoentities') );
+ $this->messages[$msg] = $this->msg( $msg )->escaped();
}
$this->target = $target;
$this->namespace = $namespace;
@@ -49,13 +49,13 @@ class DeletedContribsPager extends IndexPager {
}
function getQueryInfo() {
- global $wgUser;
list( $index, $userCond ) = $this->getUserCond();
$conds = array_merge( $userCond, $this->getNamespaceCond() );
+ $user = $this->getUser();
// Paranoia: avoid brute force searches (bug 17792)
- if( !$wgUser->isAllowed( 'deletedhistory' ) ) {
+ if( !$user->isAllowed( 'deletedhistory' ) ) {
$conds[] = $this->mDb->bitAnd('ar_deleted',Revision::DELETED_USER) . ' = 0';
- } elseif( !$wgUser->isAllowed( 'suppressrevision' ) ) {
+ } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
$conds[] = $this->mDb->bitAnd('ar_deleted',Revision::SUPPRESSED_USER) .
' != ' . Revision::SUPPRESSED_USER;
}
@@ -92,25 +92,24 @@ class DeletedContribsPager extends IndexPager {
}
function getNavigationBar() {
- global $wgLang;
-
if ( isset( $this->mNavigationBar ) ) {
return $this->mNavigationBar;
}
- $fmtLimit = $wgLang->formatNum( $this->mLimit );
+ $lang = $this->getLanguage();
+ $fmtLimit = $lang->formatNum( $this->mLimit );
$linkTexts = array(
- 'prev' => wfMsgExt( 'pager-newer-n', array( 'escape', 'parsemag' ), $fmtLimit ),
- 'next' => wfMsgExt( 'pager-older-n', array( 'escape', 'parsemag' ), $fmtLimit ),
- 'first' => wfMsgHtml( 'histlast' ),
- 'last' => wfMsgHtml( 'histfirst' )
+ 'prev' => $this->msg( 'pager-newer-n', $fmtLimit )->escaped(),
+ 'next' => $this->msg( 'pager-older-n', $fmtLimit )->escaped(),
+ 'first' => $this->msg( 'histlast' )->escaped(),
+ 'last' => $this->msg( 'histfirst' )->escaped()
);
$pagingLinks = $this->getPagingLinks( $linkTexts );
$limitLinks = $this->getLimitLinks();
- $limits = $wgLang->pipeList( $limitLinks );
+ $limits = $lang->pipeList( $limitLinks );
- $this->mNavigationBar = "(" . $wgLang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
- wfMsgExt( 'viewprevnext', array( 'parsemag', 'escape', 'replaceafter' ), $pagingLinks['prev'], $pagingLinks['next'], $limits );
+ $this->mNavigationBar = "(" . $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
+ $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
return $this->mNavigationBar;
}
@@ -133,11 +132,8 @@ class DeletedContribsPager extends IndexPager {
* @todo This would probably look a lot nicer in a table.
*/
function formatRow( $row ) {
- global $wgUser, $wgLang;
wfProfileIn( __METHOD__ );
- $sk = $this->getSkin();
-
$rev = new Revision( array(
'id' => $row->ar_rev_id,
'comment' => $row->ar_comment,
@@ -153,7 +149,7 @@ class DeletedContribsPager extends IndexPager {
$undelete = SpecialPage::getTitleFor( 'Undelete' );
$logs = SpecialPage::getTitleFor( 'Log' );
- $dellog = $sk->linkKnown(
+ $dellog = Linker::linkKnown(
$logs,
$this->messages['deletionlog'],
array(),
@@ -163,13 +159,15 @@ class DeletedContribsPager extends IndexPager {
)
);
- $reviewlink = $sk->linkKnown(
+ $reviewlink = Linker::linkKnown(
SpecialPage::getTitleFor( 'Undelete', $page->getPrefixedDBkey() ),
$this->messages['undeleteviewlink']
);
- if( $wgUser->isAllowed('deletedtext') ) {
- $last = $sk->linkKnown(
+ $user = $this->getUser();
+
+ if( $user->isAllowed('deletedtext') ) {
+ $last = Linker::linkKnown(
$undelete,
$this->messages['diff'],
array(),
@@ -183,13 +181,13 @@ class DeletedContribsPager extends IndexPager {
$last = $this->messages['diff'];
}
- $comment = $sk->revComment( $rev );
- $date = htmlspecialchars( $wgLang->timeanddate( $rev->getTimestamp(), true ) );
+ $comment = Linker::revComment( $rev );
+ $date = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ) );
- if( !$wgUser->isAllowed('undelete') || !$rev->userCan(Revision::DELETED_TEXT) ) {
+ if( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
$link = $date; // unusable link
} else {
- $link = $sk->linkKnown(
+ $link = Linker::linkKnown(
$undelete,
$date,
array(),
@@ -204,7 +202,7 @@ class DeletedContribsPager extends IndexPager {
$link = '<span class="history-deleted">' . $link . '</span>';
}
- $pagelink = $sk->link( $page );
+ $pagelink = Linker::link( $page );
if( $rev->isMinor() ) {
$mflag = ChangesList::flag( 'minor' );
@@ -213,33 +211,21 @@ class DeletedContribsPager extends IndexPager {
}
// Revision delete link
- $canHide = $wgUser->isAllowed( 'deleterevision' );
- if( $canHide || ($rev->getVisibility() && $wgUser->isAllowed('deletedhistory')) ) {
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $del = $this->mSkin->revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
- } else {
- $query = array(
- 'type' => 'archive',
- 'target' => $page->getPrefixedDbkey(),
- 'ids' => $rev->getTimestamp() );
- $del = $this->mSkin->revDeleteLink( $query,
- $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide ) . ' ';
- }
- } else {
- $del = '';
- }
+ $del = Linker::getRevDeleteLink( $user, $rev, $page );
+ if ( $del ) $del .= ' ';
$tools = Html::rawElement(
'span',
array( 'class' => 'mw-deletedcontribs-tools' ),
- wfMsg( 'parentheses', $wgLang->pipeList( array( $last, $dellog, $reviewlink ) ) )
+ $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList(
+ array( $last, $dellog, $reviewlink ) ) )->escaped()
);
$ret = "{$del}{$link} {$tools} . . {$mflag} {$pagelink} {$comment}";
# Denote if username is redacted for this edit
if( $rev->isDeleted( Revision::DELETED_USER ) ) {
- $ret .= " <strong>" . wfMsgHtml('rev-deleted-user-contribs') . "</strong>";
+ $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
}
$ret = Html::rawElement( 'li', array(), $ret ) . "\n";
@@ -272,64 +258,65 @@ class DeletedContributionsPage extends SpecialPage {
* @param $par String: (optional) user name of the user for which to show the contributions
*/
function execute( $par ) {
- global $wgUser;
+ global $wgQueryPageDefaultLimit;
$this->setHeaders();
- if ( !$this->userCanExecute( $wgUser ) ) {
+ $user = $this->getUser();
+
+ if ( !$this->userCanExecute( $user ) ) {
$this->displayRestrictionError();
return;
}
- global $wgOut, $wgRequest;
-
- $wgOut->setPageTitle( wfMsgExt( 'deletedcontributions-title', array( 'parsemag' ) ) );
+ $request = $this->getRequest();
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'deletedcontributions-title' ) );
$options = array();
- if ( isset( $par ) ) {
+ if ( $par !== null ) {
$target = $par;
} else {
- $target = $wgRequest->getVal( 'target' );
+ $target = $request->getVal( 'target' );
}
if ( !strlen( $target ) ) {
- $wgOut->addHTML( $this->getForm( '' ) );
+ $out->addHTML( $this->getForm( '' ) );
return;
}
- $options['limit'] = $wgRequest->getInt( 'limit', 50 );
+ $options['limit'] = $request->getInt( 'limit', $wgQueryPageDefaultLimit );
$options['target'] = $target;
- $nt = Title::makeTitleSafe( NS_USER, $target );
- if ( !$nt ) {
- $wgOut->addHTML( $this->getForm( '' ) );
+ $userObj = User::newFromName( $target, false );
+ if ( !$userObj ) {
+ $out->addHTML( $this->getForm( '' ) );
return;
}
- $id = User::idFromName( $nt->getText() );
- $target = $nt->getText();
- $wgOut->setSubtitle( $this->getSubTitle( $nt, $id ) );
+ $target = $userObj->getName();
+ $out->addSubtitle( $this->getSubTitle( $userObj ) );
- if ( ( $ns = $wgRequest->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+ if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
$options['namespace'] = intval( $ns );
} else {
$options['namespace'] = '';
}
- $wgOut->addHTML( $this->getForm( $options ) );
+ $out->addHTML( $this->getForm( $options ) );
- $pager = new DeletedContribsPager( $target, $options['namespace'] );
+ $pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
if ( !$pager->getNumRows() ) {
- $wgOut->addWikiMsg( 'nocontribs' );
+ $out->addWikiMsg( 'nocontribs' );
return;
}
# Show a message about slave lag, if applicable
$lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
if( $lag > 0 )
- $wgOut->showLagWarning( $lag );
+ $out->showLagWarning( $lag );
- $wgOut->addHTML(
+ $out->addHTML(
'<p>' . $pager->getNavigationBar() . '</p>' .
$pager->getBody() .
'<p>' . $pager->getNavigationBar() . '</p>' );
@@ -341,44 +328,40 @@ class DeletedContributionsPage extends SpecialPage {
? 'sp-contributions-footer-anon'
: 'sp-contributions-footer';
- if( !wfMessage( $message )->isDisabled() ) {
- $wgOut->wrapWikiMsg( "<div class='mw-contributions-footer'>\n$1\n</div>", array( $message, $target ) );
+ if( !$this->msg( $message )->isDisabled() ) {
+ $out->wrapWikiMsg( "<div class='mw-contributions-footer'>\n$1\n</div>", array( $message, $target ) );
}
}
}
/**
* Generates the subheading with links
- * @param $nt Title object for the target
- * @param $id Integer: User ID for the target
+ * @param $userObj User object for the target
* @return String: appropriately-escaped HTML to be output literally
* @todo FIXME: Almost the same as contributionsSub in SpecialContributions.php. Could be combined.
*/
- function getSubTitle( $nt, $id ) {
- global $wgLang, $wgUser, $wgOut;
-
- $sk = $this->getSkin();
-
- if ( $id === null ) {
- $user = htmlspecialchars( $nt->getText() );
+ function getSubTitle( $userObj ) {
+ if ( $userObj->isAnon() ) {
+ $user = htmlspecialchars( $userObj->getName() );
} else {
- $user = $sk->link( $nt, htmlspecialchars( $nt->getText() ) );
+ $user = Linker::link( $userObj->getUserPage(), htmlspecialchars( $userObj->getName() ) );
}
- $userObj = User::newFromName( $nt->getText(), /* check for username validity not needed */ false );
+ $nt = $userObj->getUserPage();
+ $id = $userObj->getID();
$talk = $nt->getTalkPage();
if( $talk ) {
# Talk page link
- $tools[] = $sk->link( $talk, wfMsgHtml( 'sp-contributions-talk' ) );
+ $tools[] = Linker::link( $talk, $this->msg( 'sp-contributions-talk' )->escaped() );
if( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
- if( $wgUser->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+ if( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
if ( $userObj->isBlocked() ) {
- $tools[] = $sk->linkKnown( # Change block link
+ $tools[] = Linker::linkKnown( # Change block link
SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
- wfMsgHtml( 'change-blocklink' )
+ $this->msg( 'change-blocklink' )->escaped()
);
- $tools[] = $sk->linkKnown( # Unblock link
+ $tools[] = Linker::linkKnown( # Unblock link
SpecialPage::getTitleFor( 'BlockList' ),
- wfMsgHtml( 'unblocklink' ),
+ $this->msg( 'unblocklink' )->escaped(),
array(),
array(
'action' => 'unblock',
@@ -387,16 +370,16 @@ class DeletedContributionsPage extends SpecialPage {
);
}
else { # User is not blocked
- $tools[] = $sk->linkKnown( # Block link
+ $tools[] = Linker::linkKnown( # Block link
SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
- wfMsgHtml( 'blocklink' )
+ $this->msg( 'blocklink' )->escaped()
);
}
}
# Block log link
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log' ),
- wfMsgHtml( 'sp-contributions-blocklog' ),
+ $this->msg( 'sp-contributions-blocklog' )->escaped(),
array(),
array(
'type' => 'block',
@@ -405,37 +388,39 @@ class DeletedContributionsPage extends SpecialPage {
);
}
# Other logs link
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log' ),
- wfMsgHtml( 'sp-contributions-logs' ),
+ $this->msg( 'sp-contributions-logs' )->escaped(),
array(),
array( 'user' => $nt->getText() )
);
# Link to contributions
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Contributions', $nt->getDBkey() ),
- wfMsgHtml( 'sp-deletedcontributions-contribs' )
+ $this->msg( 'sp-deletedcontributions-contribs' )->escaped()
);
# Add a link to change user rights for privileged users
$userrightsPage = new UserrightsPage();
+ $userrightsPage->setContext( $this->getContext() );
if( $id !== null && $userrightsPage->userCanChangeRights( User::newFromId( $id ) ) ) {
- $tools[] = $sk->linkKnown(
+ $tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ),
- wfMsgHtml( 'sp-contributions-userrights' )
+ $this->msg( 'sp-contributions-userrights' )->escaped()
);
}
wfRunHooks( 'ContributionsToolLinks', array( $id, $nt, &$tools ) );
- $links = $wgLang->pipeList( $tools );
+ $links = $this->getLanguage()->pipeList( $tools );
// 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(
- $wgOut,
+ $out,
'block',
- $nt->getPrefixedText(),
+ $nt,
'',
array(
'lim' => 1,
@@ -444,7 +429,7 @@ class DeletedContributionsPage extends SpecialPage {
'sp-contributions-blocked-notice',
$nt->getText() # Support GENDER in 'sp-contributions-blocked-notice'
),
- 'offset' => '' # don't use $wgRequest parameter offset
+ 'offset' => '' # don't use $this->getRequest() parameter offset
)
);
}
@@ -454,10 +439,11 @@ class DeletedContributionsPage extends SpecialPage {
// 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'.
- if( wfEmptyMsg( 'contribsub' ) ) {
- return wfMsgHtml( 'contribsub2', $user, $links );
+ $oldMsg = $this->msg( 'contribsub' );
+ if ( $oldMsg->exists() ) {
+ return $oldMsg->rawParams( "$user ($links)" );
} else {
- return wfMsgHtml( 'contribsub', "$user ($links)" );
+ return $this->msg( 'contribsub2' )->rawParams( $user, $links );
}
}
@@ -468,7 +454,7 @@ class DeletedContributionsPage extends SpecialPage {
function getForm( $options ) {
global $wgScript;
- $options['title'] = SpecialPage::getTitleFor( 'DeletedContributions' )->getPrefixedText();
+ $options['title'] = $this->getTitle()->getPrefixedText();
if ( !isset( $options['target'] ) ) {
$options['target'] = '';
} else {
@@ -497,15 +483,15 @@ class DeletedContributionsPage extends SpecialPage {
}
$f .= Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', array(), wfMsg( 'sp-contributions-search' ) ) .
- Xml::tags( 'label', array( 'for' => 'target' ), wfMsgExt( 'sp-contributions-username', 'parseinline' ) ) . ' ' .
+ 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(
'size' => '20',
'required' => ''
) + ( $options['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
- Xml::label( wfMsg( 'namespace' ), 'namespace' ) . ' ' .
+ Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) . ' ' .
Xml::namespaceSelector( $options['namespace'], '' ) . ' ' .
- Xml::submitButton( wfMsg( 'sp-contributions-submit' ) ) .
+ Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' );
return $f;
diff --git a/includes/specials/SpecialDisambiguations.php b/includes/specials/SpecialDisambiguations.php
index 431dfe76..2b05fb6b 100644
--- a/includes/specials/SpecialDisambiguations.php
+++ b/includes/specials/SpecialDisambiguations.php
@@ -36,12 +36,12 @@ class DisambiguationsPage extends PageQueryPage {
function isSyndicated() { return false; }
function getPageHeader() {
- return wfMsgExt( 'disambiguations-text', array( 'parse' ) );
+ return $this->msg( 'disambiguations-text' )->parseAsBlock();
}
function getQueryInfo() {
$dbr = wfGetDB( DB_SLAVE );
- $dMsgText = wfMsgForContent( 'disambiguationspage' );
+ $dMsgText = $this->msg( 'disambiguationspage' )->inContentLanguage()->text();
$linkBatch = new LinkBatch;
# If the text can be treated as a title, use it verbatim.
@@ -122,16 +122,14 @@ class DisambiguationsPage extends PageQueryPage {
}
function formatResult( $skin, $result ) {
- global $wgLang;
-
$title = Title::newFromID( $result->value );
$dp = Title::makeTitle( $result->namespace, $result->title );
- $from = $skin->link( $title );
- $edit = $skin->link( $title, wfMsgExt( 'parentheses', array( 'escape' ), wfMsg( 'editlink' ) ) ,
+ $from = Linker::link( $title );
+ $edit = Linker::link( $title, $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
array(), array( 'redirect' => 'no', 'action' => 'edit' ) );
- $arr = $wgLang->getArrow();
- $to = $skin->link( $dp );
+ $arr = $this->getLanguage()->getArrow();
+ $to = Linker::link( $dp );
return "$from $edit $arr $to";
}
diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php
index ec899d8a..a6df66f6 100644
--- a/includes/specials/SpecialDoubleRedirects.php
+++ b/includes/specials/SpecialDoubleRedirects.php
@@ -38,7 +38,7 @@ class DoubleRedirectsPage extends PageQueryPage {
function sortDescending() { return false; }
function getPageHeader() {
- return wfMsgExt( 'doubleredirectstext', array( 'parse' ) );
+ return $this->msg( 'doubleredirectstext' )->parseAsBlock();
}
function reallyGetQueryInfo( $namespace = null, $title = null ) {
@@ -49,6 +49,7 @@ class DoubleRedirectsPage extends PageQueryPage {
'pb' => 'page', 'pc' => 'page' ),
'fields' => array ( 'pa.page_namespace AS namespace',
'pa.page_title AS title',
+ 'pa.page_title AS value',
'pb.page_namespace AS nsb',
'pb.page_title AS tb',
'pc.page_namespace AS nsc',
@@ -76,8 +77,6 @@ class DoubleRedirectsPage extends PageQueryPage {
}
function formatResult( $skin, $result ) {
- global $wgLang;
-
$titleA = Title::makeTitle( $result->namespace, $result->title );
if ( $result && !isset( $result->nsb ) ) {
@@ -91,35 +90,40 @@ class DoubleRedirectsPage extends PageQueryPage {
}
}
if ( !$result ) {
- return '<del>' . $skin->link( $titleA, null, array(), array( 'redirect' => 'no' ) ) . '</del>';
+ return '<del>' . Linker::link( $titleA, null, array(), array( 'redirect' => 'no' ) ) . '</del>';
}
$titleB = Title::makeTitle( $result->nsb, $result->tb );
$titleC = Title::makeTitle( $result->nsc, $result->tc );
- $linkA = $skin->linkKnown(
+ $linkA = Linker::linkKnown(
$titleA,
null,
array(),
array( 'redirect' => 'no' )
);
- $edit = $skin->linkKnown(
+
+ $edit = Linker::linkKnown(
$titleA,
- wfMsgExt( 'parentheses', array( 'escape' ), wfMsg( 'editlink' ) ),
+ $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
array(),
array(
'redirect' => 'no',
'action' => 'edit'
)
);
- $linkB = $skin->linkKnown(
+
+ $linkB = Linker::linkKnown(
$titleB,
null,
array(),
array( 'redirect' => 'no' )
);
- $linkC = $skin->linkKnown( $titleC );
- $arr = $wgLang->getArrow() . $wgLang->getDirMark();
+
+ $linkC = Linker::linkKnown( $titleC );
+
+ $lang = $this->getLanguage();
+ $arr = $lang->getArrow() . $lang->getDirMark();
return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
}
diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php
index bb2ecd80..9c9689ae 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -20,6 +20,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
protected $toc;
+ private $badItems = array();
+
public function __construct(){
parent::__construct( 'EditWatchlist' );
}
@@ -30,32 +32,29 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* @param $mode int
*/
public function execute( $mode ) {
- if( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
+ $this->setHeaders();
$out = $this->getOutput();
# Anons don't get a watchlist
if( $this->getUser()->isAnon() ) {
- $out->setPageTitle( wfMsg( 'watchnologin' ) );
+ $out->setPageTitle( $this->msg( 'watchnologin' ) );
$llink = Linker::linkKnown(
SpecialPage::getTitleFor( 'Userlogin' ),
- wfMsgHtml( 'loginreqlink' ),
+ $this->msg( 'loginreqlink' )->escaped(),
array(),
array( 'returnto' => $this->getTitle()->getPrefixedText() )
);
- $out->addHTML( wfMessage( 'watchlistanontext' )->rawParams( $llink )->parse() );
+ $out->addHTML( $this->msg( 'watchlistanontext' )->rawParams( $llink )->parse() );
return;
}
- $sub = wfMsgExt(
- 'watchlistfor2',
- array( 'parseinline', 'replaceafter' ),
- $this->getUser()->getName(),
- SpecialEditWatchlist::buildTools( null )
- );
- $out->setSubtitle( $sub );
+ $this->checkPermissions();
+
+ $this->outputHeader();
+
+ $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
@@ -73,7 +72,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
// Pass on to the raw editor, from which it's very easy to clear.
case self::EDIT_RAW:
- $out->setPageTitle( wfMsg( 'watchlistedit-raw-title' ) );
+ $out->setPageTitle( $this->msg( 'watchlistedit-raw-title' ) );
$form = $this->getRawForm();
if( $form->show() ){
$out->addHTML( $this->successMessage );
@@ -83,7 +82,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
case self::EDIT_NORMAL:
default:
- $out->setPageTitle( wfMsg( 'watchlistedit-normal-title' ) );
+ $out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
$form = $this->getNormalForm();
if( $form->show() ){
$out->addHTML( $this->successMessage );
@@ -132,33 +131,34 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$this->getUser()->invalidateCache();
if( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ){
- $this->successMessage = wfMessage( 'watchlistedit-raw-done' )->parse();
+ $this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
} else {
return false;
}
if( count( $toWatch ) > 0 ) {
- $this->successMessage .= wfMessage(
- 'watchlistedit-raw-added',
- $this->getLang()->formatNum( count( $toWatch ) )
- );
+ $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-added'
+ )->numParams( count( $toWatch ) )->parse();
$this->showTitles( $toWatch, $this->successMessage );
}
if( count( $toUnwatch ) > 0 ) {
- $this->successMessage .= wfMessage(
- 'watchlistedit-raw-removed',
- $this->getLang()->formatNum( count( $toUnwatch ) )
- );
+ $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
+ )->numParams( count( $toUnwatch ) )->parse();
$this->showTitles( $toUnwatch, $this->successMessage );
}
} else {
$this->clearWatchlist();
$this->getUser()->invalidateCache();
- $this->successMessage .= wfMessage(
- 'watchlistedit-raw-removed',
- $this->getLang()->formatNum( count( $current ) )
- );
+
+ 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->showTitles( $current, $this->successMessage );
}
return true;
@@ -174,7 +174,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* @param $output String
*/
private function showTitles( $titles, &$output ) {
- $talk = wfMsgHtml( 'talkpagelinktext' );
+ $talk = $this->msg( 'talkpagelinktext' )->escaped();
// Do a batch existence check
$batch = new LinkBatch();
foreach( $titles as $title ) {
@@ -223,18 +223,21 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
if( $res->numRows() > 0 ) {
foreach ( $res as $row ) {
$title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
- if( $title instanceof Title && !$title->isTalkPage() )
+ if ( $this->checkTitle( $title, $row->wl_namespace, $row->wl_title )
+ && !$title->isTalkPage()
+ ) {
$list[] = $title->getPrefixedText();
+ }
}
$res->free();
}
+ $this->cleanupWatchlist();
return $list;
}
/**
* Get a list of titles on a user's watchlist, excluding talk pages,
- * and return as a two-dimensional array with namespace, title and
- * redirect status
+ * and return as a two-dimensional array with namespace and title.
*
* @return array
*/
@@ -243,46 +246,80 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$dbr = wfGetDB( DB_MASTER );
$res = $dbr->select(
- array( 'watchlist', 'page' ),
- array(
- 'wl_namespace',
- 'wl_title',
- 'page_id',
- 'page_len',
- 'page_is_redirect',
- 'page_latest'
- ),
+ array( 'watchlist' ),
+ array( 'wl_namespace', 'wl_title' ),
array( 'wl_user' => $this->getUser()->getId() ),
__METHOD__,
- array( 'ORDER BY' => 'wl_namespace, wl_title' ),
- array( 'page' => array(
- 'LEFT JOIN',
- 'wl_namespace = page_namespace AND wl_title = page_title'
- ) )
+ array( 'ORDER BY' => 'wl_namespace, wl_title' )
);
- if( $res && $dbr->numRows( $res ) > 0 ) {
- $cache = LinkCache::singleton();
- foreach ( $res as $row ) {
- $title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
- if( $title instanceof Title ) {
- // Update the link cache while we're at it
- if( $row->page_id ) {
- $cache->addGoodLinkObj( $row->page_id, $title, $row->page_len, $row->page_is_redirect, $row->page_latest );
- } else {
- $cache->addBadLinkObj( $title );
- }
- // Ignore non-talk
- if( !$title->isTalkPage() ) {
- $titles[$row->wl_namespace][$row->wl_title] = $row->page_is_redirect;
- }
- }
+ $lb = new LinkBatch();
+ foreach ( $res as $row ) {
+ $lb->add( $row->wl_namespace, $row->wl_title );
+ if ( !MWNamespace::isTalk( $row->wl_namespace ) ) {
+ $titles[$row->wl_namespace][$row->wl_title] = 1;
}
}
+
+ $lb->execute();
return $titles;
}
/**
+ * Validates watchlist entry
+ *
+ * @param Title $title
+ * @param int $namespace
+ * @param String $dbKey
+ * @return bool: Whether this item is valid
+ */
+ private function checkTitle( $title, $namespace, $dbKey ) {
+ if ( $title
+ && ( $title->isExternal()
+ || $title->getNamespace() < 0
+ )
+ ) {
+ $title = false; // unrecoverable
+ }
+ if ( !$title
+ || $title->getNamespace() != $namespace
+ || $title->getDBkey() != $dbKey
+ ) {
+ $this->badItems[] = array( $title, $namespace, $dbKey );
+ }
+ return (bool)$title;
+ }
+
+ /**
+ * Attempts to clean up broken items
+ */
+ private function cleanupWatchlist() {
+ if ( count( $this->badItems ) ) {
+ $dbw = wfGetDB( DB_MASTER );
+ }
+ foreach ( $this->badItems as $row ) {
+ list( $title, $namespace, $dbKey ) = $row;
+ wfDebug( "User {$this->getUser()} has broken watchlist item ns($namespace):$dbKey, "
+ . ( $title ? 'cleaning up' : 'deleting' ) . ".\n"
+ );
+
+ $dbw->delete( 'watchlist',
+ array(
+ 'wl_user' => $this->getUser()->getId(),
+ 'wl_namespace' => $namespace,
+ 'wl_title' => $dbKey,
+ ),
+ __METHOD__
+ );
+
+ // Can't just do an UPDATE instead of DELETE/INSERT due to unique index
+ if ( $title ) {
+ $this->getUser()->addWatch( $title );
+ }
+ }
+ }
+
+ /**
* Remove all titles from a user's watchlist
*/
private function clearWatchlist() {
@@ -360,8 +397,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
),
__METHOD__
);
- $article = new Article( $title, 0 );
- wfRunHooks( 'UnwatchArticleComplete', array( $this->getUser(), &$article ) );
+ $page = WikiPage::factory( $title );
+ wfRunHooks( 'UnwatchArticleComplete', array( $this->getUser(), &$page ) );
}
}
}
@@ -375,10 +412,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
}
if( count( $removed ) > 0 ) {
- $this->successMessage = wfMessage(
- 'watchlistedit-normal-done',
- $this->getLang()->formatNum( count( $removed ) )
- );
+ $this->successMessage = $this->msg( 'watchlistedit-normal-done'
+ )->numParams( count( $removed ) )->parse();
$this->showTitles( $removed, $this->successMessage );
return true;
} else {
@@ -397,40 +432,39 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$fields = array();
$count = 0;
- $haveInvalidNamespaces = false;
foreach( $this->getWatchlistInfo() as $namespace => $pages ){
- if ( $namespace < 0 ) {
- $haveInvalidNamespaces = true;
- continue;
+ if ( $namespace >= 0 ) {
+ $fields['TitlesNs'.$namespace] = array(
+ 'class' => 'EditWatchlistCheckboxSeriesField',
+ 'options' => array(),
+ 'section' => "ns$namespace",
+ );
}
- $fields['TitlesNs'.$namespace] = array(
- 'class' => 'EditWatchlistCheckboxSeriesField',
- 'options' => array(),
- 'section' => "ns$namespace",
- );
-
- foreach( $pages as $dbkey => $redirect ){
+ foreach( array_keys( $pages ) as $dbkey ){
$title = Title::makeTitleSafe( $namespace, $dbkey );
- $text = $this->buildRemoveLine( $title, $redirect );
- $fields['TitlesNs'.$namespace]['options'][$text] = $title->getEscapedText();
- $count++;
+ if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
+ $text = $this->buildRemoveLine( $title );
+ $fields['TitlesNs'.$namespace]['options'][$text] = $title->getEscapedText();
+ $count++;
+ }
}
}
- if ( $haveInvalidNamespaces ) {
- wfDebug( "User {$this->getContext()->getUser()->getId()} has invalid watchlist entries, clening up...\n" );
- $this->getContext()->getUser()->cleanupWatchlist();
- }
+ $this->cleanupWatchlist();
if ( count( $fields ) > 1 && $count > 30 ) {
$this->toc = Linker::tocIndent();
$tocLength = 0;
foreach( $fields as $key => $data ) {
+
+ # strip out the 'ns' prefix from the section name:
$ns = substr( $data['section'], 2 );
- $nsText = $ns == NS_MAIN
- ? wfMsgHtml( 'blanknamespace' )
+
+ $nsText = ($ns == NS_MAIN)
+ ? $this->msg( 'blanknamespace' )->escaped()
: htmlspecialchars( $wgContLang->getFormattedNsText( $ns ) );
- $this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText, ++$tocLength, 1 ) . Linker::tocLineEnd();
+ $this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText,
+ $this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd();
}
$this->toc = Linker::tocList( $this->toc );
} else {
@@ -439,9 +473,11 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$form = new EditWatchlistNormalHTMLForm( $fields, $this->getContext() );
$form->setTitle( $this->getTitle() );
- $form->setSubmitText( wfMessage( 'watchlistedit-normal-submit' )->text() );
- $form->setWrapperLegend( wfMessage( 'watchlistedit-normal-legend' )->text() );
- $form->addHeaderText( wfMessage( 'watchlistedit-normal-explain' )->parse() );
+ $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;
}
@@ -450,19 +486,19 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* Build the label for a checkbox, with a link to the title, and various additional bits
*
* @param $title Title
- * @param $redirect bool
* @return string
*/
- private function buildRemoveLine( $title, $redirect ) {
+ private function buildRemoveLine( $title ) {
$link = Linker::link( $title );
- if( $redirect ) {
+ if( $title->isRedirect() ) {
+ // Linker already makes class mw-redirect, so this is redundant
$link = '<span class="watchlistredir">' . $link . '</span>';
}
- $tools[] = Linker::link( $title->getTalkPage(), wfMsgHtml( 'talkpagelinktext' ) );
+ $tools[] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
if( $title->exists() ) {
$tools[] = Linker::linkKnown(
$title,
- wfMsgHtml( 'history_short' ),
+ $this->msg( 'history_short' )->escaped(),
array(),
array( 'action' => 'history' )
);
@@ -470,13 +506,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
if( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
$tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
- wfMsgHtml( 'contributions' )
+ $this->msg( 'contributions' )->escaped()
);
}
- wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $redirect, $this->getSkin() ) );
+ wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $title->isRedirect(), $this->getSkin() ) );
- return $link . " (" . $this->getLang()->pipeList( $tools ) . ")";
+ return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
}
/**
@@ -493,11 +529,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
'default' => $titles,
),
);
- $form = new HTMLForm( $fields );
+ $form = new HTMLForm( $fields, $this->getContext() );
$form->setTitle( $this->getTitle( 'raw' ) );
- $form->setSubmitText( wfMessage( 'watchlistedit-raw-submit' )->text() );
- $form->setWrapperLegend( wfMessage( 'watchlistedit-raw-legend' )->text() );
- $form->addHeaderText( wfMessage( 'watchlistedit-raw-explain' )->parse() );
+ $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;
}
@@ -569,8 +607,8 @@ class EditWatchlistNormalHTMLForm extends HTMLForm {
public function getLegend( $namespace ){
$namespace = substr( $namespace, 2 );
return $namespace == NS_MAIN
- ? wfMsgHtml( 'blanknamespace' )
- : htmlspecialchars( $this->getContext()->getLang()->getFormattedNsText( $namespace ) );
+ ? $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 7c2ba570..314da727 100644
--- a/includes/specials/SpecialEmailuser.php
+++ b/includes/specials/SpecialEmailuser.php
@@ -34,14 +34,13 @@ class SpecialEmailUser extends UnlistedSpecialPage {
}
protected function getFormFields() {
- global $wgUser;
return array(
'From' => array(
'type' => 'info',
'raw' => 1,
- 'default' => $this->getSkin()->link(
- $wgUser->getUserPage(),
- htmlspecialchars( $wgUser->getName() )
+ 'default' => Linker::link(
+ $this->getUser()->getUserPage(),
+ htmlspecialchars( $this->getUser()->getName() )
),
'label-message' => 'emailfrom',
'id' => 'mw-emailuser-sender',
@@ -49,7 +48,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
'To' => array(
'type' => 'info',
'raw' => 1,
- 'default' => $this->getSkin()->link(
+ 'default' => Linker::link(
$this->mTargetObj->getUserPage(),
htmlspecialchars( $this->mTargetObj->getName() )
),
@@ -62,7 +61,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
),
'Subject' => array(
'type' => 'text',
- 'default' => wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ) ),
+ 'default' => wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ), $this->getUser()->getName() ),
'label-message' => 'emailsubject',
'maxlength' => 200,
'size' => 60,
@@ -78,59 +77,53 @@ class SpecialEmailUser extends UnlistedSpecialPage {
'CCMe' => array(
'type' => 'check',
'label-message' => 'emailccme',
- 'default' => $wgUser->getBoolOption( 'ccmeonemails' ),
+ 'default' => $this->getUser()->getBoolOption( 'ccmeonemails' ),
),
);
}
public function execute( $par ) {
- global $wgRequest, $wgOut, $wgUser;
-
$this->setHeaders();
$this->outputHeader();
- $wgOut->addModuleStyles( 'mediawiki.special' );
+ $out = $this->getOutput();
+ $out->addModuleStyles( 'mediawiki.special' );
$this->mTarget = is_null( $par )
- ? $wgRequest->getVal( 'wpTarget', $wgRequest->getVal( 'target', '' ) )
+ ? $this->getRequest()->getVal( 'wpTarget', $this->getRequest()->getVal( 'target', '' ) )
: $par;
// error out if sending user cannot do this
- $error = self::getPermissionsError( $wgUser, $wgRequest->getVal( 'wpEditToken' ) );
+ $error = self::getPermissionsError( $this->getUser(), $this->getRequest()->getVal( 'wpEditToken' ) );
switch ( $error ) {
case null:
# Wahey!
break;
case 'badaccess':
- $wgOut->permissionRequired( 'sendemail' );
- return;
+ throw new PermissionsError( 'sendemail' );
case 'blockedemailuser':
- $wgOut->blockedPage();
- return;
+ throw new UserBlockedError( $this->getUser()->mBlock );
case 'actionthrottledtext':
- $wgOut->rateLimited();
- return;
+ throw new ThrottledError;
case 'mailnologin':
case 'usermaildisabled':
- $wgOut->showErrorPage( $error, "{$error}text" );
- return;
+ throw new ErrorPageError( $error, "{$error}text" );
default:
# It's a hook error
list( $title, $msg, $params ) = $error;
- $wgOut->showErrorPage( $title, $msg, $params );
- return;
+ 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 != '' ) {
$ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' );
- $wgOut->wrapWikiMsg( "<p class='error'>$1</p>", $ret );
+ $out->wrapWikiMsg( "<p class='error'>$1</p>", $ret );
}
- $wgOut->addHTML( self::userForm( $this->mTarget ) );
+ $out->addHTML( $this->userForm( $this->mTarget ) );
return false;
}
$this->mTargetObj = $ret;
- $form = new HTMLForm( $this->getFormFields() );
+ $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
$form->addPreText( wfMsgExt( 'emailpagetext', 'parseinline' ) );
$form->setSubmitText( wfMsg( 'emailsend' ) );
$form->setTitle( $this->getTitle() );
@@ -142,13 +135,13 @@ class SpecialEmailUser extends UnlistedSpecialPage {
return false;
}
- $wgOut->setPageTitle( wfMsg( 'emailpage' ) );
+ $out->setPageTitle( $this->msg( 'emailpage' ) );
$result = $form->show();
if( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
- $wgOut->setPageTitle( wfMsg( 'emailsent' ) );
- $wgOut->addWikiMsg( 'emailsenttext' );
- $wgOut->returnToMain( false, $this->mTargetObj->getUserPage() );
+ $out->setPageTitle( $this->msg( 'emailsent' ) );
+ $out->addWikiMsg( 'emailsenttext' );
+ $out->returnToMain( false, $this->mTargetObj->getUserPage() );
}
}
@@ -226,17 +219,16 @@ class SpecialEmailUser extends UnlistedSpecialPage {
* @param $name String: user name submitted.
* @return String: form asking for user name.
*/
-
- function userForm( $name ) {
- global $wgScript ;
+ protected function userForm( $name ) {
+ global $wgScript;
$string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::openElement( 'fieldset' ) .
- Html::rawElement( 'legend', null, wfMessage( 'emailtarget' )->parse() ) .
- Xml::inputLabel( wfMessage( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
- Xml::submitButton( wfMessage( 'emailusernamesubmit' )->text() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' ) . "\n";
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ Xml::openElement( 'fieldset' ) .
+ Html::rawElement( 'legend', null, wfMessage( 'emailtarget' )->parse() ) .
+ Xml::inputLabel( wfMessage( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+ Xml::submitButton( wfMessage( 'emailusernamesubmit' )->text() ) .
+ Xml::closeElement( 'fieldset' ) .
+ Xml::closeElement( 'form' ) . "\n";
return $string;
}
diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php
index 50754b6a..d061389e 100644
--- a/includes/specials/SpecialExport.php
+++ b/includes/specials/SpecialExport.php
@@ -38,9 +38,9 @@ class SpecialExport extends SpecialPage {
}
public function execute( $par ) {
- global $wgOut, $wgRequest, $wgSitename, $wgExportAllowListContributors;
+ global $wgSitename, $wgExportAllowListContributors, $wgExportFromNamespaces;
global $wgExportAllowHistory, $wgExportMaxHistory, $wgExportMaxLinkDepth;
- global $wgExportFromNamespaces;
+ global $wgExportAllowAll;
$this->setHeaders();
$this->outputHeader();
@@ -48,16 +48,18 @@ class SpecialExport extends SpecialPage {
// Set some variables
$this->curonly = true;
$this->doExport = false;
- $this->templates = $wgRequest->getCheck( 'templates' );
- $this->images = $wgRequest->getCheck( 'images' ); // Doesn't do anything yet
+ $request = $this->getRequest();
+ $this->templates = $request->getCheck( 'templates' );
+ $this->images = $request->getCheck( 'images' ); // Doesn't do anything yet
$this->pageLinkDepth = $this->validateLinkDepth(
- $wgRequest->getIntOrNull( 'pagelink-depth' )
+ $request->getIntOrNull( 'pagelink-depth' )
);
$nsindex = '';
+ $exportall = false;
- if ( $wgRequest->getCheck( 'addcat' ) ) {
- $page = $wgRequest->getText( 'pages' );
- $catname = $wgRequest->getText( 'catname' );
+ if ( $request->getCheck( 'addcat' ) ) {
+ $page = $request->getText( 'pages' );
+ $catname = $request->getText( 'catname' );
if ( $catname !== '' && $catname !== null && $catname !== false ) {
$t = Title::makeTitleSafe( NS_MAIN, $catname );
@@ -74,9 +76,9 @@ class SpecialExport extends SpecialPage {
}
}
}
- elseif( $wgRequest->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
- $page = $wgRequest->getText( 'pages' );
- $nsindex = $wgRequest->getText( 'nsindex', '' );
+ elseif( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
+ $page = $request->getText( 'pages' );
+ $nsindex = $request->getText( 'nsindex', '' );
if ( strval( $nsindex ) !== '' ) {
/**
@@ -88,10 +90,14 @@ class SpecialExport extends SpecialPage {
}
}
}
- elseif( $wgRequest->wasPosted() && $par == '' ) {
- $page = $wgRequest->getText( 'pages' );
- $this->curonly = $wgRequest->getCheck( 'curonly' );
- $rawOffset = $wgRequest->getVal( 'offset' );
+ elseif( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
+ $this->doExport = true;
+ $exportall = true;
+ }
+ elseif( $request->wasPosted() && $par == '' ) {
+ $page = $request->getText( 'pages' );
+ $this->curonly = $request->getCheck( 'curonly' );
+ $rawOffset = $request->getVal( 'offset' );
if( $rawOffset ) {
$offset = wfTimestamp( TS_MW, $rawOffset );
@@ -99,14 +105,14 @@ class SpecialExport extends SpecialPage {
$offset = null;
}
- $limit = $wgRequest->getInt( 'limit' );
- $dir = $wgRequest->getVal( 'dir' );
+ $limit = $request->getInt( 'limit' );
+ $dir = $request->getVal( 'dir' );
$history = array(
'dir' => 'asc',
'offset' => false,
'limit' => $wgExportMaxHistory,
);
- $historyCheck = $wgRequest->getCheck( 'history' );
+ $historyCheck = $request->getCheck( 'history' );
if ( $this->curonly ) {
$history = WikiExporter::CURRENT;
@@ -127,8 +133,8 @@ class SpecialExport extends SpecialPage {
}
} else {
// Default to current-only for GET requests.
- $page = $wgRequest->getText( 'pages', $par );
- $historyCheck = $wgRequest->getCheck( 'history' );
+ $page = $request->getText( 'pages', $par );
+ $historyCheck = $request->getCheck( 'history' );
if( $historyCheck ) {
$history = WikiExporter::FULL;
@@ -146,31 +152,32 @@ class SpecialExport extends SpecialPage {
$history = WikiExporter::CURRENT;
}
- $list_authors = $wgRequest->getCheck( 'listauthors' );
+ $list_authors = $request->getCheck( 'listauthors' );
if ( !$this->curonly || !$wgExportAllowListContributors ) {
$list_authors = false ;
}
if ( $this->doExport ) {
- $wgOut->disable();
+ $this->getOutput()->disable();
// Cancel output buffering and gzipping if set
// This should provide safer streaming for pages with history
wfResetOutputBuffers();
- $wgRequest->response()->header( "Content-type: application/xml; charset=utf-8" );
+ $request->response()->header( "Content-type: application/xml; charset=utf-8" );
- if( $wgRequest->getCheck( 'wpDownload' ) ) {
+ if( $request->getCheck( 'wpDownload' ) ) {
// Provide a sane filename suggestion
$filename = urlencode( $wgSitename . '-' . wfTimestampNow() . '.xml' );
- $wgRequest->response()->header( "Content-disposition: attachment;filename={$filename}" );
+ $request->response()->header( "Content-disposition: attachment;filename={$filename}" );
}
- $this->doExport( $page, $history, $list_authors );
+ $this->doExport( $page, $history, $list_authors, $exportall );
return;
}
- $wgOut->addWikiMsg( 'exporttext' );
+ $out = $this->getOutput();
+ $out->addWikiMsg( 'exporttext' );
$form = Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalUrl( 'action=submit' ) ) );
@@ -182,6 +189,15 @@ class SpecialExport extends SpecialPage {
$form .= Xml::submitButton( wfMsg( 'export-addns' ), array( 'name' => 'addns' ) ) . '<br />';
}
+ if ( $wgExportAllowAll ) {
+ $form .= Xml::checkLabel(
+ wfMsg( 'exportall' ),
+ 'exportall',
+ 'exportall',
+ $request->wasPosted() ? $request->getCheck( 'exportall' ) : false
+ ) . '<br />';
+ }
+
$form .= Xml::element( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ), $page, false );
$form .= '<br />';
@@ -190,17 +206,17 @@ class SpecialExport extends SpecialPage {
wfMsg( 'exportcuronly' ),
'curonly',
'curonly',
- $wgRequest->wasPosted() ? $wgRequest->getCheck( 'curonly' ) : true
+ $request->wasPosted() ? $request->getCheck( 'curonly' ) : true
) . '<br />';
} else {
- $wgOut->addHTML( wfMsgExt( 'exportnohistory', 'parse' ) );
+ $out->addHTML( wfMsgExt( 'exportnohistory', 'parse' ) );
}
$form .= Xml::checkLabel(
wfMsg( 'export-templates' ),
'templates',
'wpExportTemplates',
- $wgRequest->wasPosted() ? $wgRequest->getCheck( 'templates' ) : false
+ $request->wasPosted() ? $request->getCheck( 'templates' ) : false
) . '<br />';
if( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
@@ -212,18 +228,29 @@ class SpecialExport extends SpecialPage {
wfMsg( 'export-download' ),
'wpDownload',
'wpDownload',
- $wgRequest->wasPosted() ? $wgRequest->getCheck( 'wpDownload' ) : true
+ $request->wasPosted() ? $request->getCheck( 'wpDownload' ) : true
) . '<br />';
+ if ( $wgExportAllowListContributors ) {
+ $form .= Xml::checkLabel(
+ wfMsg( 'exportlistauthors' ),
+ 'listauthors',
+ 'listauthors',
+ $request->wasPosted() ? $request->getCheck( 'listauthors' ) : false
+ ) . '<br />';
+ }
+
$form .= Xml::submitButton( wfMsg( 'export-submit' ), Linker::tooltipAndAccesskeyAttribs( 'export' ) );
$form .= Xml::closeElement( 'form' );
- $wgOut->addHTML( $form );
+ $out->addHTML( $form );
}
+ /**
+ * @return bool
+ */
private function userCanOverrideExportDepth() {
- global $wgUser;
- return $wgUser->isAllowed( 'override-export-depth' );
+ return $this->getUser()->isAllowed( 'override-export-depth' );
}
/**
@@ -233,47 +260,55 @@ class SpecialExport extends SpecialPage {
* @param $history Mixed: one of the WikiExporter history export constants
* @param $list_authors Boolean: Whether to add distinct author list (when
* not returning full history)
+ * @param $exportall Boolean: Whether to export everything
*/
- private function doExport( $page, $history, $list_authors ) {
- $pageSet = array(); // Inverted index of all pages to look up
-
- // Split up and normalize input
- foreach( explode( "\n", $page ) as $pageName ) {
- $pageName = trim( $pageName );
- $title = Title::newFromText( $pageName );
- if( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
- // Only record each page once!
- $pageSet[$title->getPrefixedText()] = true;
+ private function doExport( $page, $history, $list_authors, $exportall ) {
+
+ // If we are grabbing everything, enable full history and ignore the rest
+ if ( $exportall ) {
+ $history = WikiExporter::FULL;
+ } else {
+
+ $pageSet = array(); // Inverted index of all pages to look up
+
+ // Split up and normalize input
+ foreach( explode( "\n", $page ) as $pageName ) {
+ $pageName = trim( $pageName );
+ $title = Title::newFromText( $pageName );
+ if( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
+ // Only record each page once!
+ $pageSet[$title->getPrefixedText()] = true;
+ }
}
- }
- // Set of original pages to pass on to further manipulation...
- $inputPages = array_keys( $pageSet );
+ // Set of original pages to pass on to further manipulation...
+ $inputPages = array_keys( $pageSet );
- // Look up any linked pages if asked...
- if( $this->templates ) {
- $pageSet = $this->getTemplates( $inputPages, $pageSet );
- }
- $linkDepth = $this->pageLinkDepth;
- if( $linkDepth ) {
- $pageSet = $this->getPageLinks( $inputPages, $pageSet, $linkDepth );
- }
+ // Look up any linked pages if asked...
+ if( $this->templates ) {
+ $pageSet = $this->getTemplates( $inputPages, $pageSet );
+ }
+ $linkDepth = $this->pageLinkDepth;
+ if( $linkDepth ) {
+ $pageSet = $this->getPageLinks( $inputPages, $pageSet, $linkDepth );
+ }
- /*
- // Enable this when we can do something useful exporting/importing image information. :)
- if( $this->images ) ) {
- $pageSet = $this->getImages( $inputPages, $pageSet );
- }
- */
+ /*
+ // Enable this when we can do something useful exporting/importing image information. :)
+ if( $this->images ) ) {
+ $pageSet = $this->getImages( $inputPages, $pageSet );
+ }
+ */
- $pages = array_keys( $pageSet );
+ $pages = array_keys( $pageSet );
- // Normalize titles to the same format and remove dupes, see bug 17374
- foreach( $pages as $k => $v ) {
- $pages[$k] = str_replace( " ", "_", $v );
- }
+ // Normalize titles to the same format and remove dupes, see bug 17374
+ foreach( $pages as $k => $v ) {
+ $pages[$k] = str_replace( " ", "_", $v );
+ }
- $pages = array_unique( $pages );
+ $pages = array_unique( $pages );
+ }
/* Ok, let's get to it... */
if( $history == WikiExporter::CURRENT ) {
@@ -296,7 +331,10 @@ class SpecialExport extends SpecialPage {
$exporter->list_authors = $list_authors;
$exporter->openStream();
- foreach( $pages as $page ) {
+ if ( $exportall ) {
+ $exporter->allPages();
+ } else {
+ foreach( $pages as $page ) {
/*
if( $wgExportMaxHistory && !$this->curonly ) {
$title = Title::newFromText( $page );
@@ -310,15 +348,16 @@ class SpecialExport extends SpecialPage {
}
}*/
#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( !$title->userCanRead() ) {
- continue; #TODO: perhaps output an <error> tag or something.
- }
+ $title = Title::newFromText( $page );
+ if( is_null( $title ) ) {
+ continue; #TODO: perhaps output an <error> tag or something.
+ }
+ if( !$title->userCan( 'read', $this->getUser() ) ) {
+ continue; #TODO: perhaps output an <error> tag or something.
+ }
- $exporter->pageByTitle( $title );
+ $exporter->pageByTitle( $title );
+ }
}
$exporter->closeStream();
@@ -328,6 +367,10 @@ class SpecialExport extends SpecialPage {
}
}
+ /**
+ * @param $title Title
+ * @return array
+ */
private function getPagesFromCategory( $title ) {
global $wgContLang;
@@ -356,6 +399,10 @@ class SpecialExport extends SpecialPage {
return $pages;
}
+ /**
+ * @param $nsindex int
+ * @return array
+ */
private function getPagesFromNamespace( $nsindex ) {
global $wgContLang;
@@ -399,6 +446,8 @@ class SpecialExport extends SpecialPage {
/**
* Validate link depth setting, if available.
+ * @param $depth int
+ * @return int
*/
private function validateLinkDepth( $depth ) {
global $wgExportMaxLinkDepth;
@@ -421,7 +470,13 @@ class SpecialExport extends SpecialPage {
return intval( min( $depth, 5 ) );
}
- /** Expand a list of pages to include pages linked to from that page. */
+ /**
+ * Expand a list of pages to include pages linked to from that page.
+ * @param $inputPages array
+ * @param $pageSet array
+ * @param $depth int
+ * @return array
+ */
private function getPageLinks( $inputPages, $pageSet, $depth ) {
for( ; $depth > 0; --$depth ) {
$pageSet = $this->getLinks(
diff --git a/includes/specials/SpecialFewestrevisions.php b/includes/specials/SpecialFewestrevisions.php
index 6d621a2e..27d17f63 100644
--- a/includes/specials/SpecialFewestrevisions.php
+++ b/includes/specials/SpecialFewestrevisions.php
@@ -70,30 +70,26 @@ class FewestrevisionsPage extends QueryPage {
* @param $result Object: database row
*/
function formatResult( $skin, $result ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
$nt = Title::makeTitleSafe( $result->namespace, $result->title );
if( !$nt ) {
return '<!-- bad title -->';
}
- $text = $wgContLang->convert( $nt->getPrefixedText() );
+ $text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
+ $plink = Linker::linkKnown( $nt, $text );
- $plink = $skin->linkKnown(
- $nt,
- $text
- );
-
- $nl = wfMsgExt( 'nrevisions', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->value ) );
- $redirect = $result->redirect ? ' - ' . wfMsgHtml( 'isredirect' ) : '';
- $nlink = $skin->linkKnown(
+ $nl = $this->msg( 'nrevisions' )->numParams( $result->value )->escaped();
+ $redirect = isset( $result->redirect ) && $result->redirect ?
+ ' - ' . wfMsgHtml( 'isredirect' ) : '';
+ $nlink = Linker::linkKnown(
$nt,
$nl,
array(),
array( 'action' => 'history' )
) . $redirect;
- return wfSpecialList( $plink, $nlink );
+ return $this->getLanguage()->specialList( $plink, $nlink );
}
}
diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php
index a296fd95..18d19db8 100644
--- a/includes/specials/SpecialFileDuplicateSearch.php
+++ b/includes/specials/SpecialFileDuplicateSearch.php
@@ -62,19 +62,16 @@ class FileDuplicateSearchPage extends QueryPage {
* @param $dupes Array of File objects
*/
function showList( $dupes ) {
- global $wgOut;
- $skin = $this->getSkin();
-
$html = array();
$html[] = $this->openList( 0 );
foreach ( $dupes as $dupe ) {
- $line = $this->formatResult( $skin, $dupe );
+ $line = $this->formatResult( null, $dupe );
$html[] = "<li>" . $line . "</li>";
}
$html[] = $this->closeList();
- $wgOut->addHtml( implode( "\n", $html ) );
+ $this->getOutput()->addHtml( implode( "\n", $html ) );
}
function getQueryInfo() {
@@ -91,12 +88,12 @@ class FileDuplicateSearchPage extends QueryPage {
}
function execute( $par ) {
- global $wgRequest, $wgOut, $wgLang, $wgScript;
+ global $wgScript;
$this->setHeaders();
$this->outputHeader();
- $this->filename = isset( $par ) ? $par : $wgRequest->getText( 'filename' );
+ $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
$this->file = null;
$this->hash = '';
$title = Title::newFromText( $this->filename, NS_FILE );
@@ -104,14 +101,16 @@ class FileDuplicateSearchPage extends QueryPage {
$this->file = wfFindFile( $title );
}
+ $out = $this->getOutput();
+
# Create the input form
- $wgOut->addHTML(
+ $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, wfMsg( 'fileduplicatesearch-legend' ) ) .
- Xml::inputLabel( wfMsg( 'fileduplicatesearch-filename' ), 'filename', 'filename', 50, $this->filename ) . ' ' .
- Xml::submitButton( wfMsg( 'fileduplicatesearch-submit' ) ) .
+ 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' )
);
@@ -119,7 +118,7 @@ class FileDuplicateSearchPage extends QueryPage {
if( $this->file ) {
$this->hash = $this->file->getSha1();
} elseif( $this->filename !== '' ) {
- $wgOut->wrapWikiMsg(
+ $out->wrapWikiMsg(
"<p class='mw-fileduplicatesearch-noresults'>\n$1\n</p>",
array( 'fileduplicatesearch-noresults', wfEscapeWikiText( $this->filename ) )
);
@@ -131,14 +130,12 @@ class FileDuplicateSearchPage extends QueryPage {
if ( $img ) {
$thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
if( $thumb ) {
- $wgOut->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
+ $out->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
$thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' .
- wfMsgExt( 'fileduplicatesearch-info', array( 'parse' ),
- $wgLang->formatNum( $img->getWidth() ),
- $wgLang->formatNum( $img->getHeight() ),
- $wgLang->formatSize( $img->getSize() ),
- $img->getMimeType()
- ) .
+ $this->msg( 'fileduplicatesearch-info' )->numParams(
+ $img->getWidth(), $img->getHeight() )->params(
+ $this->getLanguage()->formatSize( $img->getSize() ),
+ $img->getMimeType() )->parseAsBlock() .
'</div>' );
}
}
@@ -148,15 +145,15 @@ class FileDuplicateSearchPage extends QueryPage {
# Show a short summary
if( $numRows == 1 ) {
- $wgOut->wrapWikiMsg(
+ $out->wrapWikiMsg(
"<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>",
array( 'fileduplicatesearch-result-1', wfEscapeWikiText( $this->filename ) )
);
} elseif ( $numRows ) {
- $wgOut->wrapWikiMsg(
+ $out->wrapWikiMsg(
"<p class='mw-fileduplicatesearch-result-n'>\n$1\n</p>",
array( 'fileduplicatesearch-result-n', wfEscapeWikiText( $this->filename ),
- $wgLang->formatNum( $numRows - 1 ) )
+ $this->getLanguage()->formatNum( $numRows - 1 ) )
);
}
@@ -171,18 +168,18 @@ class FileDuplicateSearchPage extends QueryPage {
* @return string
*/
function formatResult( $skin, $result ) {
- global $wgContLang, $wgLang;
+ global $wgContLang;
$nt = $result->getTitle();
$text = $wgContLang->convert( $nt->getText() );
- $plink = $skin->link(
+ $plink = Linker::link(
Title::newFromText( $nt->getPrefixedText() ),
$text
);
$userText = $result->getUser( 'text' );
- $user = $skin->link( Title::makeTitle( NS_USER, $userText ), $userText );
- $time = $wgLang->timeanddate( $result->getTimestamp() );
+ $user = Linker::link( Title::makeTitle( NS_USER, $userText ), $userText );
+ $time = $this->getLanguage()->userTimeAndDate( $result->getTimestamp(), $this->getUser() );
return "$plink . . $user . . $time";
}
diff --git a/includes/specials/SpecialFilepath.php b/includes/specials/SpecialFilepath.php
index 08f90fd2..101a33f4 100644
--- a/includes/specials/SpecialFilepath.php
+++ b/includes/specials/SpecialFilepath.php
@@ -33,12 +33,11 @@ class SpecialFilepath extends SpecialPage {
}
function execute( $par ) {
- global $wgRequest, $wgOut;
-
$this->setHeaders();
$this->outputHeader();
- $file = !is_null( $par ) ? $par : $wgRequest->getText( 'file' );
+ $request = $this->getRequest();
+ $file = !is_null( $par ) ? $par : $request->getText( 'file' );
$title = Title::newFromText( $file, NS_FILE );
@@ -50,8 +49,8 @@ class SpecialFilepath extends SpecialPage {
if ( $file && $file->exists() ) {
// Default behaviour: Use the direct link to the file.
$url = $file->getURL();
- $width = $wgRequest->getInt( 'width', -1 );
- $height = $wgRequest->getInt( 'height', -1 );
+ $width = $request->getInt( 'width', -1 );
+ $height = $request->getInt( 'height', -1 );
// If a width is requested...
if ( $width != -1 ) {
@@ -62,9 +61,9 @@ class SpecialFilepath extends SpecialPage {
$url = $mto->getURL();
}
}
- $wgOut->redirect( $url );
+ $this->getOutput()->redirect( $url );
} else {
- $wgOut->setStatusCode( 404 );
+ $this->getOutput()->setStatusCode( 404 );
$this->showForm( $title );
}
}
@@ -74,9 +73,9 @@ class SpecialFilepath extends SpecialPage {
* @param $title Title
*/
function showForm( $title ) {
- global $wgOut, $wgScript;
+ global $wgScript;
- $wgOut->addHTML(
+ $this->getOutput()->addHTML(
Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'specialfilepath' ) ) .
Html::openElement( 'fieldset' ) .
Html::element( 'legend', null, wfMsg( 'filepath' ) ) .
diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php
index fc904a23..a2380fbe 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -52,18 +52,12 @@ class SpecialImport extends SpecialPage {
* Execute
*/
function execute( $par ) {
- global $wgRequest, $wgUser, $wgOut;
-
$this->setHeaders();
$this->outputHeader();
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
-
- if( !$wgUser->isAllowedAny( 'import', 'importupload' ) ) {
- return $wgOut->permissionRequired( 'import' );
+ $user = $this->getUser();
+ if ( !$user->isAllowedAny( 'import', 'importupload' ) ) {
+ throw new PermissionsError( 'import' );
}
# @todo Allow Title::getUserPermissionsErrors() to take an array
@@ -71,21 +65,23 @@ class SpecialImport extends SpecialPage {
# getUserPermissionsErrors() might actually be used for, hence the 'ns-specialprotected'
$errors = wfMergeErrorArrays(
$this->getTitle()->getUserPermissionsErrors(
- 'import', $wgUser, true,
+ 'import', $user, true,
array( 'ns-specialprotected', 'badaccess-group0', 'badaccess-groups' )
),
$this->getTitle()->getUserPermissionsErrors(
- 'importupload', $wgUser, true,
+ 'importupload', $user, true,
array( 'ns-specialprotected', 'badaccess-group0', 'badaccess-groups' )
)
);
- if( $errors ){
- $wgOut->showPermissionsErrorPage( $errors );
- return;
+ if ( $errors ) {
+ throw new PermissionsError( 'import', $errors );
}
- if ( $wgRequest->wasPosted() && $wgRequest->getVal( 'action' ) == 'submit' ) {
+ $this->checkReadOnly();
+
+ $request = $this->getRequest();
+ if ( $request->wasPosted() && $request->getVal( 'action' ) == 'submit' ) {
$this->doImport();
}
$this->showForm();
@@ -95,34 +91,37 @@ class SpecialImport extends SpecialPage {
* Do the actual import
*/
private function doImport() {
- global $wgOut, $wgRequest, $wgUser, $wgImportSources, $wgExportMaxLinkDepth;
+ global $wgImportSources, $wgExportMaxLinkDepth;
+
$isUpload = false;
- $this->namespace = $wgRequest->getIntOrNull( 'namespace' );
- $sourceName = $wgRequest->getVal( "source" );
+ $request = $this->getRequest();
+ $this->namespace = $request->getIntOrNull( 'namespace' );
+ $sourceName = $request->getVal( "source" );
- $this->logcomment = $wgRequest->getText( 'log-comment' );
- $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $wgRequest->getIntOrNull( 'pagelink-depth' );
+ $this->logcomment = $request->getText( 'log-comment' );
+ $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' );
- if ( !$wgUser->matchEditToken( $wgRequest->getVal( 'editToken' ) ) ) {
+ $user = $this->getUser();
+ if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
$source = Status::newFatal( 'import-token-mismatch' );
} elseif ( $sourceName == 'upload' ) {
$isUpload = true;
- if( $wgUser->isAllowed( 'importupload' ) ) {
+ if( $user->isAllowed( 'importupload' ) ) {
$source = ImportStreamSource::newFromUpload( "xmlimport" );
} else {
- return $wgOut->permissionRequired( 'importupload' );
+ throw new PermissionsError( 'importupload' );
}
} elseif ( $sourceName == "interwiki" ) {
- if( !$wgUser->isAllowed( 'import' ) ){
- return $wgOut->permissionRequired( 'import' );
+ if( !$user->isAllowed( 'import' ) ){
+ throw new PermissionsError( 'import' );
}
- $this->interwiki = $wgRequest->getVal( 'interwiki' );
+ $this->interwiki = $request->getVal( 'interwiki' );
if ( !in_array( $this->interwiki, $wgImportSources ) ) {
$source = Status::newFatal( "import-invalid-interwiki" );
} else {
- $this->history = $wgRequest->getCheck( 'interwikiHistory' );
- $this->frompage = $wgRequest->getText( "frompage" );
- $this->includeTemplates = $wgRequest->getCheck( 'interwikiTemplates' );
+ $this->history = $request->getCheck( 'interwikiHistory' );
+ $this->frompage = $request->getText( "frompage" );
+ $this->includeTemplates = $request->getCheck( 'interwikiTemplates' );
$source = ImportStreamSource::newFromInterwiki(
$this->interwiki,
$this->frompage,
@@ -134,16 +133,18 @@ class SpecialImport extends SpecialPage {
$source = Status::newFatal( "importunknownsource" );
}
+ $out = $this->getOutput();
if( !$source->isGood() ) {
- $wgOut->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
+ $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
} else {
- $wgOut->addWikiMsg( "importstart" );
+ $out->addWikiMsg( "importstart" );
$importer = new WikiImporter( $source->value );
if( !is_null( $this->namespace ) ) {
$importer->setTargetNamespace( $this->namespace );
}
$reporter = new ImportReporter( $importer, $isUpload, $this->interwiki , $this->logcomment);
+ $reporter->setContext( $this->getContext() );
$exception = false;
$reporter->open();
@@ -156,26 +157,28 @@ class SpecialImport extends SpecialPage {
if ( $exception ) {
# No source or XML parse error
- $wgOut->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $exception->getMessage() ) );
+ $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $exception->getMessage() ) );
} elseif( !$result->isGood() ) {
# Zero revisions
- $wgOut->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!
- $wgOut->addWikiMsg( 'importsuccess' );
+ $out->addWikiMsg( 'importsuccess' );
}
- $wgOut->addHTML( '<hr />' );
+ $out->addHTML( '<hr />' );
}
}
private function showForm() {
- global $wgUser, $wgOut, $wgImportSources, $wgExportMaxLinkDepth;
+ global $wgImportSources, $wgExportMaxLinkDepth;
$action = $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) );
+ $user = $this->getUser();
+ $out = $this->getOutput();
- if( $wgUser->isAllowed( 'importupload' ) ) {
- $wgOut->addWikiMsg( "importtext" );
- $wgOut->addHTML(
+ if( $user->isAllowed( 'importupload' ) ) {
+ $out->addWikiMsg( "importtext" );
+ $out->addHTML(
Xml::fieldset( wfMsg( 'import-upload' ) ).
Xml::openElement( 'form', array( 'enctype' => 'multipart/form-data', 'method' => 'post',
'action' => $action, 'id' => 'mw-import-upload-form' ) ) .
@@ -207,17 +210,17 @@ class SpecialImport extends SpecialPage {
"</td>
</tr>" .
Xml::closeElement( 'table' ).
- Html::hidden( 'editToken', $wgUser->editToken() ) .
+ Html::hidden( 'editToken', $user->getEditToken() ) .
Xml::closeElement( 'form' ) .
Xml::closeElement( 'fieldset' )
);
} else {
if( empty( $wgImportSources ) ) {
- $wgOut->addWikiMsg( 'importnosources' );
+ $out->addWikiMsg( 'importnosources' );
}
}
- if( $wgUser->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
+ if( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
# Show input field for import depth only if $wgExportMaxLinkDepth > 0
$importDepth = '';
if( $wgExportMaxLinkDepth > 0 ) {
@@ -231,13 +234,13 @@ class SpecialImport extends SpecialPage {
</tr>";
}
- $wgOut->addHTML(
+ $out->addHTML(
Xml::fieldset( wfMsg( 'importinterwiki' ) ) .
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'mw-import-interwiki-form' ) ) .
wfMsgExt( 'import-interwiki-text', array( 'parse' ) ) .
Html::hidden( 'action', 'submit' ) .
Html::hidden( 'source', 'interwiki' ) .
- Html::hidden( 'editToken', $wgUser->editToken() ) .
+ Html::hidden( 'editToken', $user->getEditToken() ) .
Xml::openElement( 'table', array( 'id' => 'mw-import-table' ) ) .
"<tr>
<td class='mw-label'>" .
@@ -248,10 +251,10 @@ class SpecialImport extends SpecialPage {
);
foreach( $wgImportSources as $prefix ) {
$selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : '';
- $wgOut->addHTML( Xml::option( $prefix, $prefix, $selected ) );
+ $out->addHTML( Xml::option( $prefix, $prefix, $selected ) );
}
- $wgOut->addHTML(
+ $out->addHTML(
Xml::closeElement( 'select' ) .
Xml::input( 'frompage', 50, $this->frompage ) .
"</td>
@@ -307,7 +310,7 @@ class SpecialImport extends SpecialPage {
* Reporting callback
* @ingroup SpecialPage
*/
-class ImportReporter {
+class ImportReporter extends ContextSource {
private $reason=false;
private $mOriginalLogCallback = null;
private $mOriginalPageOutCallback = null;
@@ -318,6 +321,7 @@ class ImportReporter {
$importer->setPageOutCallback( array( $this, 'reportPage' ) );
$this->mOriginalLogCallback =
$importer->setLogItemCallback( array( $this, 'reportLogItem' ) );
+ $importer->setNoticeCallback( array( $this, 'reportNotice' ) );
$this->mPageCount = 0;
$this->mIsUpload = $upload;
$this->mInterwiki = $interwiki;
@@ -325,8 +329,11 @@ class ImportReporter {
}
function open() {
- global $wgOut;
- $wgOut->addHTML( "<ul>\n" );
+ $this->getOutput()->addHTML( "<ul>\n" );
+ }
+
+ function reportNotice( $msg, array $params ) {
+ $this->getOutput()->addHTML( Html::element( 'li', array(), $this->msg( $msg, $params )->text() ) );
}
function reportLogItem( /* ... */ ) {
@@ -345,18 +352,23 @@ class ImportReporter {
* @return void
*/
function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
- global $wgOut, $wgUser, $wgLang, $wgContLang;
+ global $wgContLang;
$args = func_get_args();
call_user_func_array( $this->mOriginalPageOutCallback, $args );
+ if ( $title === null ) {
+ # Invalid or non-importable title; a notice is already displayed
+ return;
+ }
+
$this->mPageCount++;
- $localCount = $wgLang->formatNum( $successCount );
+ $localCount = $this->getLanguage()->formatNum( $successCount );
$contentCount = $wgContLang->formatNum( $successCount );
if( $successCount > 0 ) {
- $wgOut->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
+ $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
wfMsgExt( 'import-revision-count', array( 'parsemag', 'escape' ), $localCount ) .
"</li>\n"
);
@@ -384,29 +396,30 @@ class ImportReporter {
$dbw = wfGetDB( DB_MASTER );
$latest = $title->getLatestRevID();
$nullRevision = Revision::newNullRevision( $dbw, $title->getArticleId(), $comment, true );
- $nullRevision->insertOn( $dbw );
- $article = new Article( $title );
- # Update page record
- $article->updateRevisionOn( $dbw, $nullRevision );
- wfRunHooks( 'NewRevisionFromEditComplete', array($article, $nullRevision, $latest, $wgUser) );
+ if (!is_null($nullRevision)) {
+ $nullRevision->insertOn( $dbw );
+ $page = WikiPage::factory( $title );
+ # Update page record
+ $page->updateRevisionOn( $dbw, $nullRevision );
+ wfRunHooks( 'NewRevisionFromEditComplete', array( $page, $nullRevision, $latest, $this->getUser() ) );
+ }
} else {
- $wgOut->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
+ $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
wfMsgHtml( 'import-nonewrevisions' ) . "</li>\n" );
}
}
function close() {
- global $wgOut, $wgLang;
-
+ $out = $this->getOutput();
if ( $this->mLogItemCount > 0 ) {
$msg = wfMsgExt( 'imported-log-entries', 'parseinline',
- $wgLang->formatNum( $this->mLogItemCount ) );
- $wgOut->addHTML( Xml::tags( 'li', null, $msg ) );
+ $this->getLanguage()->formatNum( $this->mLogItemCount ) );
+ $out->addHTML( Xml::tags( 'li', null, $msg ) );
} elseif( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
- $wgOut->addHTML( "</ul>\n" );
+ $out->addHTML( "</ul>\n" );
return Status::newFatal( 'importnopages' );
}
- $wgOut->addHTML( "</ul>\n" );
+ $out->addHTML( "</ul>\n" );
return Status::newGood( $this->mPageCount );
}
diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php
new file mode 100644
index 00000000..d7e1655f
--- /dev/null
+++ b/includes/specials/SpecialJavaScriptTest.php
@@ -0,0 +1,142 @@
+<?php
+
+class SpecialJavaScriptTest extends SpecialPage {
+
+ /**
+ * @var $frameworks Array: Mapping of framework ids and their initilizer methods
+ * in this class. If a framework is requested but not in this array,
+ * the 'unknownframework' error is served.
+ */
+ static $frameworks = array(
+ 'qunit' => 'initQUnitTesting',
+ );
+
+ public function __construct() {
+ parent::__construct( 'JavaScriptTest' );
+ }
+
+ public function execute( $par ) {
+ global $wgEnableJavaScriptTest;
+
+ $out = $this->getOutput();
+
+ $this->setHeaders();
+ $out->disallowUserJs();
+
+ // Abort early if we're disabled
+ if ( $wgEnableJavaScriptTest !== true ) {
+ $out->addWikiMsg( 'javascripttest-disabled' );
+ return;
+ }
+
+ $out->addModules( 'mediawiki.special.javaScriptTest' );
+
+ // Determine framework
+ $pars = explode( '/', $par );
+ $framework = strtolower( $pars[0] );
+
+ // No framework specified
+ if ( $par == '' ) {
+ $out->setPagetitle( wfMsgHtml( 'javascripttest' ) );
+ $summary = $this->wrapSummaryHtml(
+ wfMsgHtml( 'javascripttest-pagetext-noframework' ) . $this->getFrameworkListHtml(),
+ 'noframework'
+ );
+ $out->addHtml( $summary );
+
+ // Matched! Display proper title and initialize the framework
+ } elseif ( isset( self::$frameworks[$framework] ) ) {
+ $out->setPagetitle( wfMsgHtml( 'javascripttest-title', wfMsgHtml( "javascripttest-$framework-name" ) ) );
+ $out->setSubtitle(
+ wfMessage( 'javascripttest-backlink' )->rawParams( Linker::linkKnown( $this->getTitle() ) )->escaped()
+ );
+ $this->{self::$frameworks[$framework]}();
+
+ // Framework not found, display error
+ } else {
+ $out->setPagetitle( wfMsgHtml( 'javascripttest' ) );
+ $summary = $this->wrapSummaryHtml( '<p class="error">'
+ . wfMsgHtml( 'javascripttest-pagetext-unknownframework', $par )
+ . '</p>'
+ . $this->getFrameworkListHtml(),
+ 'unknownframework'
+ );
+ $out->addHtml( $summary );
+ }
+ }
+
+ /**
+ * 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 ) {
+ $list .= Html::rawElement(
+ 'li',
+ array(),
+ Linker::link( $this->getTitle( $framework ), wfMsgHtml( "javascripttest-$framework-name" ) )
+ );
+ }
+ $list .= '</ul>';
+ $msg = wfMessage( 'javascripttest-pagetext-frameworks' )->rawParams( $list )->parseAsBlock();
+
+ return $msg;
+ }
+
+ /**
+ * Function to wrap the summary.
+ * It must be given a valid state as a second parameter or an exception will
+ * be thrown.
+ * @param $html String: The raw HTML.
+ * @param $state String: State, one of 'noframework', 'unknownframework' or 'frameworkfound'
+ */
+ private function wrapSummaryHtml( $html, $state ) {
+ $validStates = array( 'noframework', 'unknownframework', 'frameworkfound' );
+ if( !in_array( $state, $validStates ) ) {
+ throw new MWException( __METHOD__
+ . ' given an invalid state. Must be one of "'
+ . join( '", "', $validStates) . '".'
+ );
+ }
+ return "<div id=\"mw-javascripttest-summary\" class=\"mw-javascripttest-$state\">$html</div>";
+ }
+
+ /**
+ * Initialize the page for QUnit.
+ */
+ private function initQUnitTesting() {
+ global $wgJavaScriptTestConfig, $wgLang;
+
+ $out = $this->getOutput();
+
+ $out->addModules( 'mediawiki.tests.qunit.testrunner' );
+ $qunitTestModules = $out->getResourceLoader()->getTestModuleNames( 'qunit' );
+ $out->addModules( $qunitTestModules );
+
+ $summary = wfMessage( 'javascripttest-qunit-intro' )
+ ->params( $wgJavaScriptTestConfig['qunit']['documentation'] )
+ ->parseAsBlock();
+ $header = wfMessage( 'javascripttest-qunit-heading' )->escaped();
+ $userDir = $wgLang->getDir();
+
+ $baseHtml = <<<HTML
+<div class="mw-content-ltr">
+<div id="qunit-header"><span dir="$userDir">$header</span></div>
+<div id="qunit-banner"></div>
+<div id="qunit-testrunner-toolbar"></div>
+<div id="qunit-userAgent"></div>
+<ol id="qunit-tests"></ol>
+<div id="qunit-fixture">test markup, will be hidden</div>
+</div>
+HTML;
+ $out->addHtml( $this->wrapSummaryHtml( $summary, 'frameworkfound' ) . $baseHtml );
+
+ }
+
+ public function isListed(){
+ global $wgEnableJavaScriptTest;
+ return $wgEnableJavaScriptTest === true;
+ }
+
+}
diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php
index 53db6f87..d3ab2f04 100644
--- a/includes/specials/SpecialLinkSearch.php
+++ b/includes/specials/SpecialLinkSearch.php
@@ -56,7 +56,6 @@ class LinkSearchPage extends QueryPage {
$namespace = $request->getIntorNull( 'namespace', null );
$protocols_list = array();
-
foreach( $wgUrlProtocols as $prot ) {
if ( $prot !== '//' ) {
$protocols_list[] = $prot;
@@ -85,8 +84,7 @@ class LinkSearchPage extends QueryPage {
$protocol = '';
}
- $out->addWikiMsg( 'linksearch-text', '<nowiki>' . $this->getLang()->commaList( $wgUrlProtocols ) . '</nowiki>' );
-
+ $out->addWikiMsg( 'linksearch-text', '<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>' );
$s = Xml::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $GLOBALS['wgScript'] ) ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
'<fieldset>' .
diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php
index 427de167..b5754991 100644
--- a/includes/specials/SpecialListfiles.php
+++ b/includes/specials/SpecialListfiles.php
@@ -28,7 +28,6 @@ class SpecialListFiles extends IncludableSpecialPage {
}
public function execute( $par ){
- global $wgOut, $wgRequest;
$this->setHeaders();
$this->outputHeader();
@@ -36,11 +35,11 @@ class SpecialListFiles extends IncludableSpecialPage {
$userName = $par;
$search = '';
} else {
- $userName = $wgRequest->getText( 'user', $par );
- $search = $wgRequest->getText( 'ilsearch', '' );
+ $userName = $this->getRequest()->getText( 'user', $par );
+ $search = $this->getRequest()->getText( 'ilsearch', '' );
}
- $pager = new ImageListPager( $userName, $search, $this->including() );
+ $pager = new ImageListPager( $this->getContext(), $userName, $search, $this->including() );
if ( $this->including() ) {
$html = $pager->getBody();
@@ -50,7 +49,7 @@ class SpecialListFiles extends IncludableSpecialPage {
$nav = $pager->getNavigationBar();
$html = "$form<br />\n$body<br />\n$nav";
}
- $wgOut->addHTML( $html );
+ $this->getOutput()->addHTML( $html );
}
}
@@ -64,8 +63,8 @@ class ImageListPager extends TablePager {
var $mSearch = '';
var $mIncluding = false;
- function __construct( $userName = null, $search = '', $including = false ) {
- global $wgRequest, $wgMiserMode;
+ function __construct( IContextSource $context, $userName = null, $search = '', $including = false ) {
+ global $wgMiserMode;
$this->mIncluding = $including;
@@ -89,7 +88,7 @@ class ImageListPager extends TablePager {
}
if ( !$including ) {
- if ( $wgRequest->getText( 'sort', 'img_date' ) == 'img_date' ) {
+ if ( $context->getRequest()->getText( 'sort', 'img_date' ) == 'img_date' ) {
$this->mDefaultDirection = true;
} else {
$this->mDefaultDirection = false;
@@ -98,11 +97,7 @@ class ImageListPager extends TablePager {
$this->mDefaultDirection = true;
}
- parent::__construct();
- }
-
- function getTitle() {
- return SpecialPage::getTitleFor( 'Listfiles' );
+ parent::__construct( $context );
}
/**
@@ -197,14 +192,13 @@ class ImageListPager extends TablePager {
}
function formatValue( $field, $value ) {
- global $wgLang;
switch ( $field ) {
case 'thumb':
$file = wfLocalFile( $value );
$thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
return $thumb->toHtml( array( 'desc-link' => true ) );
case 'img_timestamp':
- return htmlspecialchars( $wgLang->timeanddate( $value, true ) );
+ return htmlspecialchars( $this->getLanguage()->timeanddate( $value, true ) );
case 'img_name':
static $imgfile = null;
if ( $imgfile === null ) $imgfile = wfMsg( 'imgfile' );
@@ -212,7 +206,7 @@ class ImageListPager extends TablePager {
// Weird files can maybe exist? Bug 22227
$filePage = Title::makeTitleSafe( NS_FILE, $value );
if( $filePage ) {
- $link = $this->getSkin()->linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
+ $link = Linker::linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
$download = Xml::element( 'a',
array( 'href' => wfLocalFile( $filePage )->getURL() ),
$imgfile
@@ -223,7 +217,7 @@ class ImageListPager extends TablePager {
}
case 'img_user_text':
if ( $this->mCurrentRow->img_user ) {
- $link = $this->getSkin()->link(
+ $link = Linker::link(
Title::makeTitle( NS_USER, $value ),
htmlspecialchars( $value )
);
@@ -232,9 +226,9 @@ class ImageListPager extends TablePager {
}
return $link;
case 'img_size':
- return $this->getSkin()->formatSize( $value );
+ return htmlspecialchars( $this->getLanguage()->formatSize( $value ) );
case 'img_description':
- return $this->getSkin()->commentBlock( $value );
+ return Linker::commentBlock( $value );
case 'count':
return intval( $value ) + 1;
}
diff --git a/includes/specials/SpecialListgrouprights.php b/includes/specials/SpecialListgrouprights.php
index 07e08e77..91d8ed87 100644
--- a/includes/specials/SpecialListgrouprights.php
+++ b/includes/specials/SpecialListgrouprights.php
@@ -44,10 +44,11 @@ class SpecialListGroupRights extends SpecialPage {
global $wgImplicitGroups;
global $wgGroupPermissions, $wgRevokePermissions, $wgAddGroups, $wgRemoveGroups;
global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
- $out = $this->getOutput();
$this->setHeaders();
$this->outputHeader();
+
+ $out = $this->getOutput();
$out->addModuleStyles( 'mediawiki.special' );
$out->addHTML(
@@ -96,20 +97,16 @@ class SpecialListGroupRights extends SpecialPage {
if ( $group === 'user' ) {
// Link to Special:listusers for implicit group 'user'
- $grouplink = '<br />' . Linker::link(
+ $grouplink = '<br />' . Linker::linkKnown(
SpecialPage::getTitleFor( 'Listusers' ),
- wfMsgHtml( 'listgrouprights-members' ),
- array(),
- array(),
- array( 'known', 'noclasses' )
+ wfMsgHtml( 'listgrouprights-members' )
);
} elseif ( !in_array( $group, $wgImplicitGroups ) ) {
- $grouplink = '<br />' . Linker::link(
+ $grouplink = '<br />' . Linker::linkKnown(
SpecialPage::getTitleFor( 'Listusers' ),
wfMsgHtml( 'listgrouprights-members' ),
array(),
- array( 'group' => $group ),
- array( 'known', 'noclasses' )
+ array( 'group' => $group )
);
} else {
// No link to Special:listusers for other implicit groups as they are unlistable
@@ -127,7 +124,8 @@ class SpecialListGroupRights extends SpecialPage {
"
<td>$grouppage$grouplink</td>
<td>" .
- self::formatPermissions( $permissions, $revoke, $addgroups, $removegroups, $addgroupsSelf, $removegroupsSelf ) .
+ $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
+ $addgroupsSelf, $removegroupsSelf ) .
'</td>
'
) );
@@ -149,9 +147,7 @@ class SpecialListGroupRights extends SpecialPage {
* @param $removeSelf Array of group this group is allowed to remove from self or true
* @return string List of all granted permissions, separated by comma separator
*/
- private static function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
- global $wgLang;
-
+ private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
$r = array();
foreach( $permissions as $permission => $granted ) {
//show as granted only if it isn't revoked to prevent duplicate display of permissions
@@ -173,29 +169,42 @@ class SpecialListGroupRights extends SpecialPage {
}
}
sort( $r );
+ $lang = $this->getLanguage();
if( $add === true ){
$r[] = wfMsgExt( 'listgrouprights-addgroup-all', array( 'escape' ) );
} elseif( is_array( $add ) && count( $add ) ) {
$add = array_values( array_unique( $add ) );
- $r[] = wfMsgExt( 'listgrouprights-addgroup', array( 'parseinline' ), $wgLang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $add ) ), count( $add ) );
+ $r[] = wfMsgExt( 'listgrouprights-addgroup', array( 'parseinline' ),
+ $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $add ) ),
+ count( $add )
+ );
}
if( $remove === true ){
$r[] = wfMsgExt( 'listgrouprights-removegroup-all', array( 'escape' ) );
} elseif( is_array( $remove ) && count( $remove ) ) {
$remove = array_values( array_unique( $remove ) );
- $r[] = wfMsgExt( 'listgrouprights-removegroup', array( 'parseinline' ), $wgLang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ), count( $remove ) );
+ $r[] = wfMsgExt( 'listgrouprights-removegroup', array( 'parseinline' ),
+ $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
+ count( $remove )
+ );
}
if( $addSelf === true ){
$r[] = wfMsgExt( 'listgrouprights-addgroup-self-all', array( 'escape' ) );
} elseif( is_array( $addSelf ) && count( $addSelf ) ) {
$addSelf = array_values( array_unique( $addSelf ) );
- $r[] = wfMsgExt( 'listgrouprights-addgroup-self', array( 'parseinline' ), $wgLang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ), count( $addSelf ) );
+ $r[] = wfMsgExt( 'listgrouprights-addgroup-self', array( 'parseinline' ),
+ $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
+ count( $addSelf )
+ );
}
if( $removeSelf === true ){
$r[] = wfMsgExt( 'listgrouprights-removegroup-self-all', array( 'escape' ) );
} elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
$removeSelf = array_values( array_unique( $removeSelf ) );
- $r[] = wfMsgExt( 'listgrouprights-removegroup-self', array( 'parseinline' ), $wgLang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ), count( $removeSelf ) );
+ $r[] = wfMsgExt( 'listgrouprights-removegroup-self', array( 'parseinline' ),
+ $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
+ count( $removeSelf )
+ );
}
if( empty( $r ) ) {
return '';
diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php
index acf5fbd9..f9cf3e6e 100644
--- a/includes/specials/SpecialListredirects.php
+++ b/includes/specials/SpecialListredirects.php
@@ -43,6 +43,7 @@ class ListredirectsPage extends QueryPage {
'tables' => array( 'p1' => 'page', 'redirect', 'p2' => 'page' ),
'fields' => array( 'p1.page_namespace AS namespace',
'p1.page_title AS title',
+ 'p1.page_title AS value',
'rd_namespace',
'rd_title',
'rd_fragment',
@@ -90,7 +91,7 @@ class ListredirectsPage extends QueryPage {
);
} else {
$title = Title::makeTitle( $row->namespace, $row->title );
- $article = new Article( $title );
+ $article = WikiPage::factory( $title );
return $article->getRedirectTarget();
}
}
@@ -98,7 +99,7 @@ class ListredirectsPage extends QueryPage {
function formatResult( $skin, $result ) {
# Make a link to the redirect itself
$rd_title = Title::makeTitle( $result->namespace, $result->title );
- $rd_link = $skin->link(
+ $rd_link = Linker::link(
$rd_title,
null,
array(),
@@ -108,10 +109,10 @@ class ListredirectsPage extends QueryPage {
# Find out where the redirect leads
$target = $this->getRedirectTarget( $result );
if( $target ) {
- global $wgLang;
# Make a link to the destination page
- $arr = $wgLang->getArrow() . $wgLang->getDirMark();
- $targetLink = $skin->link( $target );
+ $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 0531444a..d743712d 100644
--- a/includes/specials/SpecialListusers.php
+++ b/includes/specials/SpecialListusers.php
@@ -3,7 +3,7 @@
* Implements Special:Listusers
*
* Copyright © 2004 Brion Vibber, lcrocker, Tim Starling,
- * Domas Mituzas, Ashar Voultoiz, Jens Frank, Zhengzhu,
+ * Domas Mituzas, Antoine Musso, Jens Frank, Zhengzhu,
* 2006 Rob Church <robchur@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -34,25 +34,30 @@
*/
class UsersPager extends AlphabeticPager {
- function __construct( $par=null ) {
- global $wgRequest;
- $parms = explode( '/', ($par = ( $par !== null ) ? $par : '' ) );
+ function __construct( IContextSource $context = null, $par = null ) {
+ if ( $context ) {
+ $this->setContext( $context );
+ }
+
+ $request = $this->getRequest();
+ $par = ( $par !== null ) ? $par : '';
+ $parms = explode( '/', $par );
$symsForAll = array( '*', 'user' );
if ( $parms[0] != '' && ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) ) ) {
$this->requestedGroup = $par;
- $un = $wgRequest->getText( 'username' );
+ $un = $request->getText( 'username' );
} elseif ( count( $parms ) == 2 ) {
$this->requestedGroup = $parms[0];
$un = $parms[1];
} else {
- $this->requestedGroup = $wgRequest->getVal( 'group' );
- $un = ( $par != '' ) ? $par : $wgRequest->getText( 'username' );
+ $this->requestedGroup = $request->getVal( 'group' );
+ $un = ( $par != '' ) ? $par : $request->getText( 'username' );
}
if ( in_array( $this->requestedGroup, $symsForAll ) ) {
$this->requestedGroup = '';
}
- $this->editsOnly = $wgRequest->getBool( 'editsOnly' );
- $this->creationSort = $wgRequest->getBool( 'creationSort' );
+ $this->editsOnly = $request->getBool( 'editsOnly' );
+ $this->creationSort = $request->getBool( 'creationSort' );
$this->requestedUser = '';
if ( $un != '' ) {
@@ -64,20 +69,15 @@ class UsersPager extends AlphabeticPager {
parent::__construct();
}
- function getTitle() {
- return SpecialPage::getTitleFor( 'Listusers' );
- }
-
function getIndexField() {
return $this->creationSort ? 'user_id' : 'user_name';
}
function getQueryInfo() {
- global $wgUser;
$dbr = wfGetDB( DB_SLAVE );
$conds = array();
// Don't show hidden names
- if( !$wgUser->isAllowed('hideuser') ) {
+ if( !$this->getUser()->isAllowed('hideuser') ) {
$conds[] = 'ipb_deleted IS NULL';
}
@@ -126,32 +126,32 @@ class UsersPager extends AlphabeticPager {
}
function formatRow( $row ) {
- global $wgLang;
-
if ($row->user_id == 0) #Bug 16487
return '';
$userPage = Title::makeTitle( NS_USER, $row->user_name );
$name = Linker::link( $userPage, htmlspecialchars( $userPage->getText() ) );
+ $lang = $this->getLanguage();
+
$groups_list = self::getGroups( $row->user_id );
if( count( $groups_list ) > 0 ) {
$list = array();
foreach( $groups_list as $group )
- $list[] = self::buildGroupLink( $group );
- $groups = $wgLang->commaList( $list );
+ $list[] = self::buildGroupLink( $group, $userPage->getText() );
+ $groups = $lang->commaList( $list );
} else {
$groups = '';
}
- $item = wfSpecialList( $name, $groups );
+ $item = $lang->specialList( $name, $groups );
if( $row->ipb_deleted ) {
$item = "<span class=\"deleted\">$item</span>";
}
global $wgEdititis;
if ( $wgEdititis ) {
- $editCount = $wgLang->formatNum( $row->edits );
+ $editCount = $lang->formatNum( $row->edits );
$edits = ' [' . wfMsgExt( 'usereditcount', array( 'parsemag', 'escape' ), $editCount ) . ']';
} else {
$edits = '';
@@ -160,10 +160,9 @@ class UsersPager extends AlphabeticPager {
$created = '';
# Some rows may be NULL
if( $row->creation ) {
- $d = $wgLang->date( wfTimestamp( TS_MW, $row->creation ), true );
- $t = $wgLang->time( wfTimestamp( TS_MW, $row->creation ), true );
- $created = ' (' . wfMsg( 'usercreated', $d, $t ) . ')';
- $created = htmlspecialchars( $created );
+ $d = $lang->date( wfTimestamp( TS_MW, $row->creation ), true );
+ $t = $lang->time( wfTimestamp( TS_MW, $row->creation ), true );
+ $created = ' (' . wfMsgExt( 'usercreated', array( 'parsemag', 'escape' ), $d, $t, $row->user_name ) . ')';
}
wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
@@ -186,12 +185,13 @@ class UsersPager extends AlphabeticPager {
function getPageHeader( ) {
global $wgScript;
- $self = $this->getTitle();
+ // @todo Add a PrefixedBaseDBKey
+ list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
# Form tag
$out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
Xml::fieldset( wfMsg( 'listusers' ) ) .
- Html::hidden( 'title', $self->getPrefixedDbKey() );
+ Html::hidden( 'title', $self );
# Username field
$out .= Xml::label( wfMsg( 'listusersfrom' ), 'offset' ) . ' ' .
@@ -264,13 +264,11 @@ class UsersPager extends AlphabeticPager {
* Format a link to a group description page
*
* @param $group String: group name
+ * @param $username String Username
* @return string
*/
- protected static function buildGroupLink( $group ) {
- static $cache = array();
- if( !isset( $cache[$group] ) )
- $cache[$group] = User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupMember( $group ) ) );
- return $cache[$group];
+ protected static function buildGroupLink( $group, $username ) {
+ return User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupMember( $group, $username ) ) );
}
}
@@ -292,12 +290,10 @@ class SpecialListUsers extends SpecialPage {
* @param $par string (optional) A group to list users from
*/
public function execute( $par ) {
- global $wgOut;
-
$this->setHeaders();
$this->outputHeader();
- $up = new UsersPager( $par );
+ $up = new UsersPager( $this->getContext(), $par );
# getBody() first to check, if empty
$usersbody = $up->getBody();
@@ -311,6 +307,6 @@ class SpecialListUsers extends SpecialPage {
$s .= wfMessage( 'listusers-noresult' )->parseAsBlock();
}
- $wgOut->addHTML( $s );
+ $this->getOutput()->addHTML( $s );
}
}
diff --git a/includes/specials/SpecialLockdb.php b/includes/specials/SpecialLockdb.php
index 5c861b31..c1453518 100644
--- a/includes/specials/SpecialLockdb.php
+++ b/includes/specials/SpecialLockdb.php
@@ -26,89 +26,53 @@
*
* @ingroup SpecialPage
*/
-class SpecialLockdb extends SpecialPage {
+class SpecialLockdb extends FormSpecialPage {
var $reason = '';
public function __construct() {
parent::__construct( 'Lockdb', 'siteadmin' );
}
- public function execute( $par ) {
- global $wgUser, $wgRequest;
-
- $this->setHeaders();
-
- # Permission check
- if( !$this->userCanExecute( $wgUser ) ) {
- $this->displayRestrictionError();
- return;
- }
-
- $this->outputHeader();
+ public function requiresWrite() {
+ return false;
+ }
- # If the lock file isn't writable, we can do sweet bugger all
+ public function checkExecutePermissions( User $user ) {
global $wgReadOnlyFile;
- if( !is_writable( dirname( $wgReadOnlyFile ) ) ) {
- self::notWritable();
- return;
- }
- $action = $wgRequest->getVal( 'action' );
- $this->reason = $wgRequest->getVal( 'wpLockReason', '' );
-
- if ( $action == 'success' ) {
- $this->showSuccess();
- } elseif ( $action == 'submit' && $wgRequest->wasPosted() &&
- $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- $this->doSubmit();
- } else {
- $this->showForm();
+ parent::checkExecutePermissions( $user );
+ # If the lock file isn't writable, we can do sweet bugger all
+ if ( !is_writable( dirname( $wgReadOnlyFile ) ) ) {
+ throw new ErrorPageError( 'lockdb', 'lockfilenotwritable' );
}
}
- private function showForm( $err = '' ) {
- global $wgOut, $wgUser;
-
- $wgOut->addWikiMsg( 'lockdbtext' );
-
- if ( $err != '' ) {
- $wgOut->setSubtitle( wfMsg( 'formerror' ) );
- $wgOut->addHTML( '<p class="error">' . htmlspecialchars( $err ) . "</p>\n" );
- }
-
- $wgOut->addHTML(
- Html::openElement( 'form', array( 'id' => 'lockdb', 'method' => 'POST',
- 'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) ). "\n" .
- wfMsgHtml( 'enterlockreason' ) . ":\n" .
- Html::textarea( 'wpLockReason', $this->reason, array( 'rows' => 4 ) ). "
-<table>
- <tr>
- " . Html::openElement( 'td', array( 'style' => 'text-align:right' ) ) . "
- " . Html::input( 'wpLockConfirm', null, 'checkbox' ) . "
- </td>
- " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) .
- wfMsgHtml( 'lockconfirm' ) . "</td>
- </tr>
- <tr>
- <td>&#160;</td>
- " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) . "
- " . Html::input( 'wpLock', wfMsg( 'lockbtn' ), 'submit' ) . "
- </td>
- </tr>
-</table>\n" .
- Html::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n" .
- Html::closeElement( 'form' )
+ protected function getFormFields() {
+ return array(
+ 'Reason' => array(
+ 'type' => 'textarea',
+ 'rows' => 4,
+ 'vertical-label' => true,
+ 'label-message' => 'enterlockreason',
+ ),
+ 'Confirm' => array(
+ 'type' => 'toggle',
+ 'label-message' => 'lockconfirm',
+ ),
);
+ }
+ protected function alterForm( HTMLForm $form ) {
+ $form->setWrapperLegend( false );
+ $form->setHeaderText( $this->msg( 'lockdbtext' )->parseAsBlock() );
+ $form->setSubmitTextMsg( 'lockbtn' );
}
- private function doSubmit() {
- global $wgOut, $wgUser, $wgContLang, $wgRequest;
- global $wgReadOnlyFile;
+ public function onSubmit( array $data ) {
+ global $wgContLang, $wgReadOnlyFile;
- if ( ! $wgRequest->getCheck( 'wpLockConfirm' ) ) {
- $this->showForm( wfMsg( 'locknoconfirm' ) );
- return;
+ if ( !$data['Confirm'] ) {
+ return Status::newFatal( 'locknoconfirm' );
}
wfSuppressWarnings();
@@ -119,33 +83,25 @@ class SpecialLockdb extends SpecialPage {
# This used to show a file not found error, but the likeliest reason for fopen()
# to fail at this point is insufficient permission to write to the file...good old
# is_writable() is plain wrong in some cases, it seems...
- self::notWritable();
- return;
+ return Status::newFatal( 'lockfilenotwritable' );
}
- fwrite( $fp, $this->reason );
+ fwrite( $fp, $data['Reason'] );
$timestamp = wfTimestampNow();
fwrite( $fp, "\n<p>" . wfMsgExt(
'lockedbyandtime',
array( 'content', 'parsemag' ),
- $wgUser->getName(),
+ $this->getUser()->getName(),
$wgContLang->date( $timestamp ),
$wgContLang->time( $timestamp )
) . "</p>\n" );
fclose( $fp );
- $wgOut->redirect( $this->getTitle()->getFullURL( 'action=success' ) );
- }
-
- private function showSuccess() {
- global $wgOut;
-
- $wgOut->setPagetitle( wfMsg( 'lockdb' ) );
- $wgOut->setSubtitle( wfMsg( 'lockdbsuccesssub' ) );
- $wgOut->addWikiMsg( 'lockdbsuccesstext' );
+ return Status::newGood();
}
- public static function notWritable() {
- global $wgOut;
- $wgOut->showErrorPage( 'lockdb', 'lockfilenotwritable' );
+ public function onSuccess() {
+ $out = $this->getOutput();
+ $out->addSubtitle( $this->msg( 'lockdbsuccesssub' ) );
+ $out->addWikiMsg( 'lockdbsuccesstext' );
}
}
diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php
index d8f6d8cf..64190df1 100644
--- a/includes/specials/SpecialLog.php
+++ b/includes/specials/SpecialLog.php
@@ -30,13 +30,24 @@
*/
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
+ * Title user instead.
+ */
+ private $typeOnUser = array(
+ 'block',
+ 'newusers',
+ 'rights',
+ );
+
public function __construct() {
parent::__construct( 'Log' );
}
public function execute( $par ) {
- global $wgRequest;
-
+ global $wgLogRestrictions;
+
$this->setHeaders();
$this->outputHeader();
@@ -53,7 +64,7 @@ class SpecialLog extends SpecialPage {
$opts->add( 'offender', '' );
// Set values
- $opts->fetchValuesFromRequest( $wgRequest );
+ $opts->fetchValuesFromRequest( $this->getRequest() );
if ( $par ) {
$this->parseParams( $opts, (string)$par );
}
@@ -64,6 +75,16 @@ 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
+ $type = $opts->getValue( 'type' );
+ if ( !LogPage::isLogType( $type )
+ || ( isset( $wgLogRestrictions[$type] )
+ && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) )
+ ) {
+ $opts->setValue( 'type', '' );
+ }
+
# Handle type-specific inputs
$qc = array();
if ( $opts->getValue( 'type' ) == 'suppress' ) {
@@ -75,6 +96,20 @@ 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 ) ) {
+ # ok we have a type of log which expect a user title.
+ $target = Title::newFromText( $opts->getValue( 'page' ) );
+ 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' ) )
+ );
+ }
+ }
+
$this->show( $opts, $qc );
}
@@ -95,30 +130,27 @@ class SpecialLog extends SpecialPage {
}
private function show( FormOptions $opts, array $extraConds ) {
- global $wgOut;
-
# Create a LogPager item to get the results and a LogEventsList item to format them...
- $loglist = new LogEventsList( $this->getSkin(), $wgOut, 0 );
+ $loglist = new LogEventsList( $this->getSkin(), $this->getOutput(), 0 );
$pager = new LogPager( $loglist, $opts->getValue( 'type' ), $opts->getValue( 'user' ),
$opts->getValue( 'page' ), $opts->getValue( 'pattern' ), $extraConds, $opts->getValue( 'year' ),
$opts->getValue( 'month' ), $opts->getValue( 'tagfilter' ) );
- # Set title and add header
- $loglist->showHeader( $pager->getType() );
+ $this->addHeader( $opts->getValue( 'type' ) );
# Set relevant user
- if ( $pager->getUser() ) {
- $this->getSkin()->setRelevantUser( User::newFromName( $pager->getUser() ) );
+ if ( $pager->getPerformer() ) {
+ $this->getSkin()->setRelevantUser( User::newFromName( $pager->getPerformer() ) );
}
# Show form options
- $loglist->showOptions( $pager->getType(), $pager->getUser(), $pager->getPage(), $pager->getPattern(),
+ $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 ) {
- $wgOut->addHTML(
+ $this->getOutput()->addHTML(
$pager->getNavigationBar() .
$loglist->beginLogEventsList() .
$logBody .
@@ -126,7 +158,19 @@ class SpecialLog extends SpecialPage {
$pager->getNavigationBar()
);
} else {
- $wgOut->addWikiMsg( 'logempty' );
+ $this->getOutput()->addWikiMsg( 'logempty' );
}
}
+
+ /**
+ * Set page title and show header for this log type
+ * @param $type string
+ * @since 1.19
+ */
+ protected function addHeader( $type ) {
+ $page = new LogPage( $type );
+ $this->getOutput()->setPageTitle( $page->getName()->text() );
+ $this->getOutput()->addHTML( $page->getDescription()->parseAsBlock() );
+ }
+
}
diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php
index aefe7bf5..2213ffa4 100644
--- a/includes/specials/SpecialMIMEsearch.php
+++ b/includes/specials/SpecialMIMEsearch.php
@@ -59,12 +59,11 @@ class MIMEsearchPage extends QueryPage {
}
function execute( $par ) {
- global $wgRequest, $wgOut;
- $mime = $par ? $par : $wgRequest->getText( 'mime' );
+ $mime = $par ? $par : $this->getRequest()->getText( 'mime' );
$this->setHeaders();
$this->outputHeader();
- $wgOut->addHTML(
+ $this->getOutput()->addHTML(
Xml::openElement( 'form', array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => SpecialPage::getTitleFor( 'MIMEsearch' )->getLocalUrl() ) ) .
Xml::openElement( 'fieldset' ) .
Html::hidden( 'title', SpecialPage::getTitleFor( 'MIMEsearch' )->getPrefixedText() ) .
@@ -85,24 +84,24 @@ class MIMEsearchPage extends QueryPage {
function formatResult( $skin, $result ) {
- global $wgContLang, $wgLang;
+ global $wgContLang;
$nt = Title::makeTitle( $result->namespace, $result->title );
$text = $wgContLang->convert( $nt->getText() );
- $plink = $skin->link(
+ $plink = Linker::link(
Title::newFromText( $nt->getPrefixedText() ),
htmlspecialchars( $text )
);
- $download = $skin->makeMediaLinkObj( $nt, wfMsgHtml( 'download' ) );
- $bytes = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->img_size ) );
+ $download = Linker::makeMediaLinkObj( $nt, wfMsgHtml( 'download' ) );
+ $lang = $this->getLanguage();
+ $bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
$dimensions = htmlspecialchars( wfMsg( 'widthheight',
- $wgLang->formatNum( $result->img_width ),
- $wgLang->formatNum( $result->img_height )
+ $lang->formatNum( $result->img_width ),
+ $lang->formatNum( $result->img_height )
) );
- $user = $skin->link( Title::makeTitle( NS_USER, $result->img_user_text ), htmlspecialchars( $result->img_user_text ) );
- $time = htmlspecialchars( $wgLang->timeanddate( $result->img_timestamp ) );
+ $user = Linker::link( Title::makeTitle( NS_USER, $result->img_user_text ), htmlspecialchars( $result->img_user_text ) );
+ $time = htmlspecialchars( $lang->timeanddate( $result->img_timestamp ) );
return "($download) $plink . . $dimensions . . $bytes . . $user . . $time";
}
diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php
index 88e90ee5..19650da9 100644
--- a/includes/specials/SpecialMergeHistory.php
+++ b/includes/specials/SpecialMergeHistory.php
@@ -40,12 +40,10 @@ class SpecialMergeHistory extends SpecialPage {
}
/**
- * @param $request WebRequest
* @return void
*/
- private function loadRequestParams( $request ) {
- global $wgUser;
-
+ private function loadRequestParams() {
+ $request = $this->getRequest();
$this->mAction = $request->getVal( 'action' );
$this->mTarget = $request->getVal( 'target' );
$this->mDest = $request->getVal( 'dest' );
@@ -59,7 +57,7 @@ class SpecialMergeHistory extends SpecialPage {
}
$this->mComment = $request->getText( 'wpComment' );
- $this->mMerge = $request->wasPosted() && $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
+ $this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
// target page
if( $this->mSubmitted ) {
$this->mTargetObj = Title::newFromURL( $this->mTarget );
@@ -83,19 +81,10 @@ class SpecialMergeHistory extends SpecialPage {
}
public function execute( $par ) {
- global $wgOut, $wgRequest, $wgUser;
-
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
-
- if( !$this->userCanExecute( $wgUser ) ) {
- $this->displayRestrictionError();
- return;
- }
+ $this->checkPermissions();
+ $this->checkReadOnly();
- $this->loadRequestParams( $wgRequest );
+ $this->loadRequestParams();
$this->setHeaders();
$this->outputHeader();
@@ -132,7 +121,7 @@ class SpecialMergeHistory extends SpecialPage {
if ( count( $errors ) ) {
$this->showMergeForm();
- $wgOut->addHTML( implode( "\n", $errors ) );
+ $this->getOutput()->addHTML( implode( "\n", $errors ) );
} else {
$this->showHistory();
}
@@ -140,11 +129,11 @@ class SpecialMergeHistory extends SpecialPage {
}
function showMergeForm() {
- global $wgOut, $wgScript;
+ global $wgScript;
- $wgOut->addWikiMsg( 'mergehistory-header' );
+ $this->getOutput()->addWikiMsg( 'mergehistory-header' );
- $wgOut->addHTML(
+ $this->getOutput()->addHTML(
Xml::openElement( 'form', array(
'method' => 'get',
'action' => $wgScript ) ) .
@@ -171,12 +160,6 @@ class SpecialMergeHistory extends SpecialPage {
}
private function showHistory() {
- global $wgUser, $wgOut;
-
- $this->sk = $this->getSkin();
-
- $wgOut->setPageTitle( wfMsg( 'mergehistory' ) );
-
$this->showMergeForm();
# List all stored revisions
@@ -185,6 +168,7 @@ class SpecialMergeHistory extends SpecialPage {
);
$haveRevisions = $revisions && $revisions->getNumRows() > 0;
+ $out = $this->getOutput();
$titleObj = $this->getTitle();
$action = $titleObj->getLocalURL( array( 'action' => 'submit' ) );
# Start the form here
@@ -196,7 +180,7 @@ class SpecialMergeHistory extends SpecialPage {
'id' => 'merge'
)
);
- $wgOut->addHTML( $top );
+ $out->addHTML( $top );
if( $haveRevisions ) {
# Format the user-visible controls (comment field, submission button)
@@ -223,27 +207,27 @@ class SpecialMergeHistory extends SpecialPage {
Xml::closeElement( 'table' ) .
Xml::closeElement( 'fieldset' );
- $wgOut->addHTML( $table );
+ $out->addHTML( $table );
}
- $wgOut->addHTML(
+ $out->addHTML(
'<h2 id="mw-mergehistory">' .
wfMsgHtml( 'mergehistory-list' ) . "</h2>\n"
);
if( $haveRevisions ) {
- $wgOut->addHTML( $revisions->getNavigationBar() );
- $wgOut->addHTML( '<ul>' );
- $wgOut->addHTML( $revisions->getBody() );
- $wgOut->addHTML( '</ul>' );
- $wgOut->addHTML( $revisions->getNavigationBar() );
+ $out->addHTML( $revisions->getNavigationBar() );
+ $out->addHTML( '<ul>' );
+ $out->addHTML( $revisions->getBody() );
+ $out->addHTML( '</ul>' );
+ $out->addHTML( $revisions->getNavigationBar() );
} else {
- $wgOut->addWikiMsg( 'mergehistory-empty' );
+ $out->addWikiMsg( 'mergehistory-empty' );
}
# Show relevant lines from the deletion log:
- $wgOut->addHTML( '<h2>' . htmlspecialchars( LogPage::logName( 'merge' ) ) . "</h2>\n" );
- LogEventsList::showLogExtract( $wgOut, 'merge', $this->mTargetObj->getPrefixedText() );
+ $out->addHTML( '<h2>' . htmlspecialchars( LogPage::logName( 'merge' ) ) . "</h2>\n" );
+ LogEventsList::showLogExtract( $out, 'merge', $this->mTargetObj );
# When we submit, go by page ID to avoid some nasty but unlikely collisions.
# Such would happen if a page was renamed after the form loaded, but before submit
@@ -251,16 +235,14 @@ class SpecialMergeHistory extends SpecialPage {
$misc .= Html::hidden( 'destID', $this->mDestObj->getArticleID() );
$misc .= Html::hidden( 'target', $this->mTarget );
$misc .= Html::hidden( 'dest', $this->mDest );
- $misc .= Html::hidden( 'wpEditToken', $wgUser->editToken() );
+ $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
$misc .= Xml::closeElement( 'form' );
- $wgOut->addHTML( $misc );
+ $out->addHTML( $misc );
return true;
}
function formatRevisionRow( $row ) {
- global $wgLang;
-
$rev = new Revision( $row );
$stxt = '';
@@ -269,9 +251,9 @@ class SpecialMergeHistory extends SpecialPage {
$ts = wfTimestamp( TS_MW, $row->rev_timestamp );
$checkBox = Xml::radio( 'mergepoint', $ts, false );
- $pageLink = $this->sk->linkKnown(
+ $pageLink = Linker::linkKnown(
$rev->getTitle(),
- htmlspecialchars( $wgLang->timeanddate( $ts ) ),
+ htmlspecialchars( $this->getLanguage()->timeanddate( $ts ) ),
array(),
array( 'oldid' => $rev->getId() )
);
@@ -280,10 +262,10 @@ class SpecialMergeHistory extends SpecialPage {
}
# Last link
- if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
$last = $this->message['last'];
} elseif( isset( $this->prevId[$row->rev_id] ) ) {
- $last = $this->sk->linkKnown(
+ $last = Linker::linkKnown(
$rev->getTitle(),
$this->message['last'],
array(),
@@ -294,46 +276,18 @@ class SpecialMergeHistory extends SpecialPage {
);
}
- $userLink = $this->sk->revUserTools( $rev );
+ $userLink = Linker::revUserTools( $rev );
$size = $row->rev_len;
if( !is_null( $size ) ) {
- $stxt = $this->sk->formatRevisionSize( $size );
+ $stxt = Linker::formatRevisionSize( $size );
}
- $comment = $this->sk->revComment( $rev );
+ $comment = Linker::revComment( $rev );
return "<li>$checkBox ($last) $pageLink . . $userLink $stxt $comment</li>";
}
- /**
- * Fetch revision text link if it's available to all users
- * @return string
- */
- function getPageLink( $row, $titleObj, $ts, $target ) {
- global $wgLang;
-
- if( !$this->userCan( $row, Revision::DELETED_TEXT ) ) {
- return '<span class="history-deleted">' .
- $wgLang->timeanddate( $ts, true ) . '</span>';
- } else {
- $link = $this->sk->linkKnown(
- $titleObj,
- $wgLang->timeanddate( $ts, true ),
- array(),
- array(
- 'target' => $target,
- 'timestamp' => $ts
- )
- );
- if( $this->isDeleted( $row, Revision::DELETED_TEXT ) ) {
- $link = '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
- }
- }
-
function merge() {
- global $wgOut;
# Get the titles directly from the IDs, in case the target page params
# were spoofed. The queries are done based on the IDs, so it's best to
# keep it consistent...
@@ -359,7 +313,7 @@ class SpecialMergeHistory extends SpecialPage {
);
# Destination page must exist with revisions
if( !$maxtimestamp ) {
- $wgOut->addWikiMsg( 'mergehistory-fail' );
+ $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
return false;
}
# Get the latest timestamp of the source
@@ -371,7 +325,7 @@ class SpecialMergeHistory extends SpecialPage {
);
# $this->mTimestamp must be older than $maxtimestamp
if( $this->mTimestamp >= $maxtimestamp ) {
- $wgOut->addWikiMsg( 'mergehistory-fail' );
+ $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
return false;
}
# Update the revisions
@@ -416,13 +370,13 @@ class SpecialMergeHistory extends SpecialPage {
}
$mwRedir = MagicWord::get( 'redirect' );
$redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destTitle->getPrefixedText() . "]]\n";
- $redirectArticle = new Article( $targetTitle );
+ $redirectPage = WikiPage::factory( $targetTitle );
$redirectRevision = new Revision( array(
'page' => $this->mTargetID,
'comment' => $comment,
'text' => $redirectText ) );
$redirectRevision->insertOn( $dbw );
- $redirectArticle->updateRevisionOn( $dbw, $redirectRevision );
+ $redirectPage->updateRevisionOn( $dbw, $redirectRevision );
# Now, we record the link from the redirect to the new title.
# It should have no other outgoing links...
@@ -440,7 +394,7 @@ class SpecialMergeHistory extends SpecialPage {
$destTitle->invalidateCache(); // update histories
# Check if this did anything
if( !$count ) {
- $wgOut->addWikiMsg( 'mergehistory-fail' );
+ $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
return false;
}
# Update our logs
@@ -450,7 +404,7 @@ class SpecialMergeHistory extends SpecialPage {
array( $destTitle->getPrefixedText(), $timestampLimit )
);
- $wgOut->addHTML(
+ $this->getOutput()->addHTML(
wfMsgExt( 'mergehistory-success', array('parseinline'),
$targetTitle->getPrefixedText(), $destTitle->getPrefixedText(), $count ) );
@@ -478,11 +432,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
);
$this->maxTimestamp = $maxtimestamp;
- parent::__construct();
- }
-
- function getTitle() {
- return SpecialPage::getTitleFor( 'Contributions' );
+ parent::__construct( $form->getContext() );
}
function getStartBody() {
@@ -493,8 +443,8 @@ class MergeHistoryPager extends ReverseChronologicalPager {
# Give some pointers to make (last) links
$this->mForm->prevId = array();
foreach ( $this->mResult as $row ) {
- $batch->addObj( Title::makeTitleSafe( NS_USER, $row->rev_user_text ) );
- $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->rev_user_text ) );
+ $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) );
+ $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 ) {
@@ -520,16 +470,14 @@ class MergeHistoryPager extends ReverseChronologicalPager {
function getQueryInfo() {
$conds = $this->mConds;
$conds['rev_page'] = $this->articleID;
- $conds[] = 'page_id = rev_page';
$conds[] = "rev_timestamp < {$this->maxTimestamp}";
return array(
- 'tables' => array( 'revision', 'page' ),
- 'fields' => array(
- 'rev_minor_edit', 'rev_timestamp', 'rev_user', 'rev_user_text',
- 'rev_comment', 'rev_id', 'rev_page', 'rev_parent_id',
- 'rev_text_id', 'rev_len', 'rev_deleted'
- ),
- 'conds' => $conds
+ 'tables' => array( 'revision', 'page', 'user' ),
+ 'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
+ 'conds' => $conds,
+ 'join_conds' => array(
+ 'page' => Revision::pageJoinCond(),
+ 'user' => Revision::userJoinCond() )
);
}
diff --git a/includes/specials/SpecialMostcategories.php b/includes/specials/SpecialMostcategories.php
index 2e437196..98b73675 100644
--- a/includes/specials/SpecialMostcategories.php
+++ b/includes/specials/SpecialMostcategories.php
@@ -58,11 +58,10 @@ class MostcategoriesPage extends QueryPage {
* @return string
*/
function formatResult( $skin, $result ) {
- global $wgLang;
$title = Title::makeTitleSafe( $result->namespace, $result->title );
- $count = wfMsgExt( 'ncategories', array( 'parsemag', 'escape' ), $wgLang->formatNum( $result->value ) );
- $link = $skin->link( $title );
- return wfSpecialList( $link, $count );
+ $count = $this->msg( 'ncategories' )->numParams( $result->value )->escaped();
+ $link = Linker::link( $title );
+ return $this->getLanguage()->specialList( $link, $count );
}
}
diff --git a/includes/specials/SpecialMostimages.php b/includes/specials/SpecialMostimages.php
index ac2b5206..7805e53e 100644
--- a/includes/specials/SpecialMostimages.php
+++ b/includes/specials/SpecialMostimages.php
@@ -50,9 +50,7 @@ class MostimagesPage extends ImageQueryPage {
}
function getCellHtml( $row ) {
- global $wgLang;
- return wfMsgExt( 'nimagelinks', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $row->value ) ) . '<br />';
+ return $this->msg( 'nimagelinks' )->numParams( $row->value )->escaped() . '<br />';
}
}
diff --git a/includes/specials/SpecialMostlinked.php b/includes/specials/SpecialMostlinked.php
index 58f686e8..a16f0872 100644
--- a/includes/specials/SpecialMostlinked.php
+++ b/includes/specials/SpecialMostlinked.php
@@ -77,12 +77,11 @@ class MostlinkedPage extends QueryPage {
*
* @param $title Title being queried
* @param $caption String: text to display on the link
- * @param $skin Skin to use
* @return String
*/
- function makeWlhLink( &$title, $caption, &$skin ) {
+ function makeWlhLink( $title, $caption ) {
$wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
- return $skin->linkKnown( $wlh, $caption );
+ return Linker::linkKnown( $wlh, $caption );
}
/**
@@ -93,15 +92,13 @@ class MostlinkedPage extends QueryPage {
* @return string
*/
function formatResult( $skin, $result ) {
- global $wgLang;
$title = Title::makeTitleSafe( $result->namespace, $result->title );
if ( !$title ) {
return '<!-- ' . htmlspecialchars( "Invalid title: [[$title]]" ) . ' -->';
}
- $link = $skin->link( $title );
+ $link = Linker::link( $title );
$wlh = $this->makeWlhLink( $title,
- wfMsgExt( 'nlinks', array( 'parsemag', 'escape'),
- $wgLang->formatNum( $result->value ) ), $skin );
- return wfSpecialList( $link, $wlh );
+ $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 195282f7..7fb9dea9 100644
--- a/includes/specials/SpecialMostlinkedcategories.php
+++ b/includes/specials/SpecialMostlinkedcategories.php
@@ -25,7 +25,7 @@
*/
/**
- * A querypage to show categories ordered in descending order by the pages in them
+ * A querypage to show categories ordered in descending order by the pages in them
*
* @ingroup SpecialPage
*/
@@ -35,16 +35,14 @@ class MostlinkedCategoriesPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
function isSyndicated() { return false; }
function getQueryInfo() {
return array (
- 'tables' => array ( 'categorylinks' ),
- 'fields' => array ( 'cl_to AS title',
+ 'tables' => array ( 'category' ),
+ 'fields' => array ( 'cat_title AS title',
NS_CATEGORY . ' AS namespace',
- 'COUNT(*) AS value' ),
- 'options' => array ( 'GROUP BY' => 'cl_to' )
+ 'cat_pages AS value' ),
);
}
@@ -76,15 +74,14 @@ class MostlinkedCategoriesPage extends QueryPage {
* @return string
*/
function formatResult( $skin, $result ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
$nt = Title::makeTitle( NS_CATEGORY, $result->title );
$text = $wgContLang->convert( $nt->getText() );
- $plink = $skin->link( $nt, htmlspecialchars( $text ) );
+ $plink = Linker::link( $nt, htmlspecialchars( $text ) );
- $nlinks = wfMsgExt( 'nmembers', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->value ) );
- return wfSpecialList( $plink, $nlinks );
+ $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 69771925..6fb09426 100644
--- a/includes/specials/SpecialMostlinkedtemplates.php
+++ b/includes/specials/SpecialMostlinkedtemplates.php
@@ -98,9 +98,9 @@ class MostlinkedTemplatesPage extends QueryPage {
public function formatResult( $skin, $result ) {
$title = Title::makeTitle( $result->namespace, $result->title );
- return wfSpecialList(
- $skin->link( $title ),
- $this->makeWlhLink( $title, $skin, $result )
+ return $this->getLanguage()->specialList(
+ Linker::link( $title ),
+ $this->makeWlhLink( $title, $result )
);
}
@@ -108,16 +108,13 @@ class MostlinkedTemplatesPage extends QueryPage {
* Make a "what links here" link for a given title
*
* @param $title Title to make the link for
- * @param $skin Skin to use
* @param $result Result row
* @return String
*/
- private function makeWlhLink( $title, $skin, $result ) {
- global $wgLang;
- $wlh = SpecialPage::getTitleFor( 'Whatlinkshere' );
- $label = wfMsgExt( 'ntransclusions', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->value ) );
- return $skin->link( $wlh, $label, array(), array( 'target' => $title->getPrefixedText() ) );
+ 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 ec7f4024..d7ebd310 100644
--- a/includes/specials/SpecialMovepage.php
+++ b/includes/specials/SpecialMovepage.php
@@ -42,103 +42,104 @@ class MovePageForm extends UnlistedSpecialPage {
}
public function execute( $par ) {
- global $wgUser, $wgOut, $wgRequest;
-
- # Check for database lock
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
+ $this->checkReadOnly();
$this->setHeaders();
$this->outputHeader();
- $target = !is_null( $par ) ? $par : $wgRequest->getVal( 'target' );
+ $request = $this->getRequest();
+ $target = !is_null( $par ) ? $par : $request->getVal( 'target' );
// Yes, the use of getVal() and getText() is wanted, see bug 20365
- $oldTitleText = $wgRequest->getVal( 'wpOldTitle', $target );
- $newTitleText = $wgRequest->getText( 'wpNewTitle' );
+ $oldTitleText = $request->getVal( 'wpOldTitle', $target );
$this->oldTitle = Title::newFromText( $oldTitleText );
- $this->newTitle = Title::newFromText( $newTitleText );
+
+ $newTitleTextMain = $request->getText( 'wpNewTitleMain' );
+ $newTitleTextNs = $request->getInt( 'wpNewTitleNs', $this->oldTitle->getNamespace() );
+ // Backwards compatibility for forms submitting here from other sources
+ // which is more common than it should be..
+ $newTitleText_bc = $request->getText( 'wpNewTitle' );
+ $this->newTitle = strlen( $newTitleText_bc ) > 0
+ ? Title::newFromText( $newTitleText_bc )
+ : Title::makeTitleSafe( $newTitleTextNs, $newTitleTextMain );
if( is_null( $this->oldTitle ) ) {
- $wgOut->showErrorPage( 'notargettitle', 'notargettext' );
- return;
+ throw new ErrorPageError( 'notargettitle', 'notargettext' );
}
if( !$this->oldTitle->exists() ) {
- $wgOut->showErrorPage( 'nopagetitle', 'nopagetext' );
- return;
+ throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
}
+ $user = $this->getUser();
+
# Check rights
- $permErrors = $this->oldTitle->getUserPermissionsErrors( 'move', $wgUser );
- if( !empty( $permErrors ) ) {
+ $permErrors = $this->oldTitle->getUserPermissionsErrors( 'move', $user );
+ if ( count( $permErrors ) ) {
// Auto-block user's IP if the account was "hard" blocked
- $wgUser->spreadAnyEditBlock();
- $this->getOutput()->showPermissionsErrorPage( $permErrors );
- return;
+ $user->spreadAnyEditBlock();
+ throw new PermissionsError( 'move', $permErrors );
}
- $def = !$wgRequest->wasPosted();
+ $def = !$request->wasPosted();
- $this->reason = $wgRequest->getText( 'wpReason' );
- $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', $def );
- $this->fixRedirects = $wgRequest->getBool( 'wpFixRedirects', $def );
- $this->leaveRedirect = $wgRequest->getBool( 'wpLeaveRedirect', $def );
- $this->moveSubpages = $wgRequest->getBool( 'wpMovesubpages', false );
- $this->deleteAndMove = $wgRequest->getBool( 'wpDeleteAndMove' ) && $wgRequest->getBool( 'wpConfirm' );
- $this->moveOverShared = $wgRequest->getBool( 'wpMoveOverSharedFile', false );
- $this->watch = $wgRequest->getCheck( 'wpWatch' ) && $wgUser->isLoggedIn();
+ $this->reason = $request->getText( 'wpReason' );
+ $this->moveTalk = $request->getBool( 'wpMovetalk', $def );
+ $this->fixRedirects = $request->getBool( 'wpFixRedirects', $def );
+ $this->leaveRedirect = $request->getBool( 'wpLeaveRedirect', $def );
+ $this->moveSubpages = $request->getBool( 'wpMovesubpages', false );
+ $this->deleteAndMove = $request->getBool( 'wpDeleteAndMove' ) && $request->getBool( 'wpConfirm' );
+ $this->moveOverShared = $request->getBool( 'wpMoveOverSharedFile', false );
+ $this->watch = $request->getCheck( 'wpWatch' ) && $user->isLoggedIn();
- if ( 'submit' == $wgRequest->getVal( 'action' ) && $wgRequest->wasPosted()
- && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
+ if ( 'submit' == $request->getVal( 'action' ) && $request->wasPosted()
+ && $user->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
$this->doSubmit();
} else {
- $this->showForm( '' );
+ $this->showForm( array() );
}
}
/**
* Show the form
*
- * @param $err Mixed: error message. May either be a string message name or
- * array message name and parameters, like the second argument to
- * OutputPage::wrapWikiMsg().
+ * @param $err Array: error messages. Each item is an error message.
+ * It may either be a string message name or array message name and
+ * parameters, like the second argument to OutputPage::wrapWikiMsg().
*/
function showForm( $err ) {
- global $wgOut, $wgUser, $wgContLang, $wgFixDoubleRedirects;
-
- $skin = $this->getSkin();
+ global $wgContLang, $wgFixDoubleRedirects, $wgMaximumMovedPages;
- $oldTitleLink = $skin->link( $this->oldTitle );
+ $this->getSkin()->setRelevantTitle( $this->oldTitle );
- $wgOut->setPagetitle( wfMsg( 'move-page', $this->oldTitle->getPrefixedText() ) );
- $skin->setRelevantTitle( $this->oldTitle );
+ $oldTitleLink = Linker::link( $this->oldTitle );
- $wgOut->addModules( 'mediawiki.special.movePage' );
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'move-page', $this->oldTitle->getPrefixedText() ) );
+ $out->addModules( 'mediawiki.special.movePage' );
$newTitle = $this->newTitle;
- if( !$newTitle ) {
+ if ( !$newTitle ) {
# Show the current title as a default
# when the form is first opened.
$newTitle = $this->oldTitle;
- }
- else {
- if( empty($err) ) {
- # If a title was supplied, probably from the move log revert
- # link, check for validity. We can then show some diagnostic
- # information and save a click.
- $newerr = $this->oldTitle->isValidMoveOperation( $newTitle );
- if( $newerr ) {
- $err = $newerr[0];
- }
+ } elseif ( !count( $err ) ) {
+ # If a title was supplied, probably from the move log revert
+ # link, check for validity. We can then show some diagnostic
+ # information and save a click.
+ $newerr = $this->oldTitle->isValidMoveOperation( $newTitle );
+ if( is_array( $newerr ) ) {
+ $err = $newerr;
}
}
- if ( !empty($err) && $err[0] == 'articleexists' && $wgUser->isAllowed( 'delete' ) ) {
- $wgOut->addWikiMsg( 'delete_and_move_text', $newTitle->getPrefixedText() );
+ $user = $this->getUser();
+
+ if ( count( $err ) == 1 && isset( $err[0][0] ) && $err[0][0] == 'articleexists'
+ && $newTitle->quickUserCan( 'delete', $user )
+ ) {
+ $out->addWikiMsg( 'delete_and_move_text', $newTitle->getPrefixedText() );
$movepagebtn = wfMsg( 'delete_and_move' );
$submitVar = 'wpDeleteAndMove';
$confirm = "
@@ -148,26 +149,38 @@ class MovePageForm extends UnlistedSpecialPage {
Xml::checkLabel( wfMsg( 'delete_and_move_confirm' ), 'wpConfirm', 'wpConfirm' ) .
"</td>
</tr>";
- $err = '';
+ $err = array();
} else {
if ($this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
- $wgOut->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' );
}
- $wgOut->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
+ $out->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
'movepagetext-noredirectfixer' );
$movepagebtn = wfMsg( 'movepagebtn' );
$submitVar = 'wpMove';
$confirm = false;
}
- if ( !empty($err) && $err[0] == 'file-exists-sharedrepo' && $wgUser->isAllowed( 'reupload-shared' ) ) {
- $wgOut->addWikiMsg( 'move-over-sharedrepo', $newTitle->getPrefixedText() );
+ if ( count( $err ) == 1 && isset( $err[0][0] ) && $err[0][0] == 'file-exists-sharedrepo'
+ && $user->isAllowed( 'reupload-shared' )
+ ) {
+ $out->addWikiMsg( 'move-over-sharedrepo', $newTitle->getPrefixedText() );
$submitVar = 'wpMoveOverSharedFile';
- $err = '';
+ $err = array();
}
$oldTalk = $this->oldTitle->getTalkPage();
- $considerTalk = ( !$this->oldTitle->isTalkPage() && $oldTalk->exists() );
+ $oldTitleSubpages = $this->oldTitle->hasSubpages();
+ $oldTitleTalkSubpages = $this->oldTitle->getTalkPage()->hasSubpages();
+
+ $canMoveSubpage = ( $oldTitleSubpages || $oldTitleTalkSubpages ) &&
+ !count( $this->oldTitle->getUserPermissionsErrors( 'move-subpages', $user ) );
+
+ # We also want to be able to move assoc. subpage talk-pages even if base page
+ # has no associated talk page, so || with $oldTitleTalkSubpages.
+ $considerTalk = !$this->oldTitle->isTalkPage() &&
+ ( $oldTalk->exists()
+ || ( $oldTitleTalkSubpages && $canMoveSubpage ) );
$dbr = wfGetDB( DB_SLAVE );
if ( $wgFixDoubleRedirects ) {
@@ -181,20 +194,36 @@ class MovePageForm extends UnlistedSpecialPage {
}
if ( $considerTalk ) {
- $wgOut->addWikiMsg( 'movepagetalktext' );
+ $out->addWikiMsg( 'movepagetalktext' );
}
- $token = htmlspecialchars( $wgUser->editToken() );
+ if ( count( $err ) ) {
+ $out->addHTML( "<div class='error'>\n" );
+ $action_desc = $this->msg( 'action-move' )->plain();
+ $out->addWikiMsg( 'permissionserrorstext-withaction', count( $err ), $action_desc );
- if ( !empty($err) ) {
- $wgOut->setSubtitle( wfMsg( 'formerror' ) );
- if( $err[0] == 'hookaborted' ) {
- $hookErr = $err[1];
- $errMsg = "<p><strong class=\"error\">$hookErr</strong></p>\n";
- $wgOut->addHTML( $errMsg );
+ if ( count( $err ) == 1 ) {
+ $errMsg = $err[0];
+ $errMsgName = array_shift( $errMsg );
+ if ( $errMsgName == 'hookaborted' ) {
+ $out->addHTML( "<p>{$errMsg[0]}</p>\n" );
+ } else {
+ $out->addWikiMsgArray( $errMsgName, $errMsg );
+ }
} else {
- $wgOut->wrapWikiMsg( "<p><strong class=\"error\">\n$1\n</strong></p>", $err );
+ $errStr = array();
+ foreach( $err as $errMsg ) {
+ if( $errMsg[0] == 'hookaborted' ) {
+ $errStr[] = $errMsg[1];
+ } else {
+ $errMsgName = array_shift( $errMsg );
+ $errStr[] = $this->msg( $errMsgName, $errMsg )->parse();
+ }
+ }
+
+ $out->addHTML( '<ul><li>' . implode( "</li>\n<li>", $errStr ) . "</li></ul>\n" );
}
+ $out->addHTML( "</div>\n" );
}
if ( $this->oldTitle->isProtected( 'move' ) ) {
@@ -207,13 +236,16 @@ class MovePageForm extends UnlistedSpecialPage {
$noticeMsg = 'protectedpagemovewarning';
$classes[] = 'mw-textarea-protected';
}
- $wgOut->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" );
- $wgOut->addWikiMsg( $noticeMsg );
- LogEventsList::showLogExtract( $wgOut, 'protect', $this->oldTitle->getPrefixedText(), '', array( 'lim' => 1 ) );
- $wgOut->addHTML( "</div>\n" );
+ $out->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" );
+ $out->addWikiMsg( $noticeMsg );
+ LogEventsList::showLogExtract( $out, 'protect', $this->oldTitle, '', array( 'lim' => 1 ) );
+ $out->addHTML( "</div>\n" );
}
- $wgOut->addHTML(
+ // Byte limit (not string length limit) for wpReason and wpNewTitleMain
+ // is enforced in the mediawiki.special.movePage module
+
+ $out->addHTML(
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, wfMsg( 'move-page-legend' ) ) .
@@ -228,10 +260,18 @@ class MovePageForm extends UnlistedSpecialPage {
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( wfMsg( 'newtitle' ), 'wpNewTitle' ) .
+ Xml::label( wfMsg( 'newtitle' ), 'wpNewTitleMain' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'wpNewTitle', 40, $wgContLang->recodeForEdit( $newTitle->getPrefixedText() ), array( 'type' => 'text', 'id' => 'wpNewTitle' ) ) .
+ Html::namespaceSelector(
+ array( 'selected' => $newTitle->getNamespace() ),
+ 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() ) .
"</td>
</tr>
@@ -241,13 +281,13 @@ class MovePageForm extends UnlistedSpecialPage {
"</td>
<td class='mw-input'>" .
Html::element( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2,
- 'maxlength' => 200 ), $this->reason ) . // maxlength byte limit is enforce in mediawiki.special.movePage.js
+ 'maxlength' => 200 ), $this->reason ) .
"</td>
</tr>"
);
if( $considerTalk ) {
- $wgOut->addHTML( "
+ $out->addHTML( "
<tr>
<td></td>
<td class='mw-input'>" .
@@ -257,8 +297,8 @@ class MovePageForm extends UnlistedSpecialPage {
);
}
- if ( $wgUser->isAllowed( 'suppressredirect' ) ) {
- $wgOut->addHTML( "
+ if ( $user->isAllowed( 'suppressredirect' ) ) {
+ $out->addHTML( "
<tr>
<td></td>
<td class='mw-input' >" .
@@ -270,7 +310,7 @@ class MovePageForm extends UnlistedSpecialPage {
}
if ( $hasRedirects ) {
- $wgOut->addHTML( "
+ $out->addHTML( "
<tr>
<td></td>
<td class='mw-input' >" .
@@ -281,12 +321,8 @@ class MovePageForm extends UnlistedSpecialPage {
);
}
- if( ($this->oldTitle->hasSubpages() || $this->oldTitle->getTalkPage()->hasSubpages())
- && $this->oldTitle->userCan( 'move-subpages' ) )
- {
- global $wgMaximumMovedPages, $wgLang;
-
- $wgOut->addHTML( "
+ if( $canMoveSubpage ) {
+ $out->addHTML( "
<tr>
<td></td>
<td class=\"mw-input\">" .
@@ -303,7 +339,7 @@ class MovePageForm extends UnlistedSpecialPage {
? 'move-subpages'
: 'move-talk-subpages' ),
array( 'parseinline' ),
- $wgLang->formatNum( $wgMaximumMovedPages ),
+ $this->getLanguage()->formatNum( $wgMaximumMovedPages ),
# $2 to allow use of PLURAL in message.
$wgMaximumMovedPages
)
@@ -313,11 +349,11 @@ class MovePageForm extends UnlistedSpecialPage {
);
}
- $watchChecked = $wgUser->isLoggedIn() && ($this->watch || $wgUser->getBoolOption( 'watchmoves' )
+ $watchChecked = $user->isLoggedIn() && ($this->watch || $user->getBoolOption( 'watchmoves' )
|| $this->oldTitle->userIsWatching());
# Don't allow watching if user is not logged in
- if( $wgUser->isLoggedIn() ) {
- $wgOut->addHTML( "
+ if( $user->isLoggedIn() ) {
+ $out->addHTML( "
<tr>
<td></td>
<td class='mw-input'>" .
@@ -326,7 +362,7 @@ class MovePageForm extends UnlistedSpecialPage {
</tr>");
}
- $wgOut->addHTML( "
+ $out->addHTML( "
{$confirm}
<tr>
<td>&#160;</td>
@@ -335,69 +371,74 @@ class MovePageForm extends UnlistedSpecialPage {
"</td>
</tr>" .
Xml::closeElement( 'table' ) .
- Html::hidden( 'wpEditToken', $token ) .
+ Html::hidden( 'wpEditToken', $user->getEditToken() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' ) .
"\n"
);
- $this->showLogFragment( $this->oldTitle, $wgOut );
- $this->showSubpages( $this->oldTitle, $wgOut );
+ $this->showLogFragment( $this->oldTitle );
+ $this->showSubpages( $this->oldTitle );
}
function doSubmit() {
- global $wgOut, $wgUser, $wgMaximumMovedPages, $wgLang;
- global $wgFixDoubleRedirects;
+ global $wgMaximumMovedPages, $wgFixDoubleRedirects, $wgDeleteRevisionsLimit;
- if ( $wgUser->pingLimiter( 'move' ) ) {
- $wgOut->rateLimited();
- return;
+ $user = $this->getUser();
+
+ if ( $user->pingLimiter( 'move' ) ) {
+ throw new ThrottledError;
}
$ot = $this->oldTitle;
$nt = $this->newTitle;
- # Delete to make way if requested
- if ( $wgUser->isAllowed( 'delete' ) && $this->deleteAndMove ) {
- $article = new Article( $nt );
-
- # Disallow deletions of big articles
- $bigHistory = $article->isBigDeletion();
- if( $bigHistory && !$nt->userCan( 'bigdelete' ) ) {
- global $wgDeleteRevisionsLimit;
- $this->showForm( array('delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ) );
- return;
- }
-
- // Delete an associated image if there is
- $file = wfLocalFile( $nt );
- if( $file->exists() ) {
- $file->delete( wfMsgForContent( 'delete_and_move_reason' ), false );
- }
-
- // This may output an error message and exit
- $article->doDelete( wfMsgForContent( 'delete_and_move_reason' ) );
- }
-
# don't allow moving to pages with # in
if ( !$nt || $nt->getFragment() != '' ) {
- $this->showForm( 'badtitletext' );
+ $this->showForm( array( array( 'badtitletext' ) ) );
return;
}
# Show a warning if the target file exists on a shared repo
if ( $nt->getNamespace() == NS_FILE
- && !( $this->moveOverShared && $wgUser->isAllowed( 'reupload-shared' ) )
+ && !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
&& !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
&& wfFindFile( $nt ) )
{
- $this->showForm( array('file-exists-sharedrepo') );
+ $this->showForm( array( array( 'file-exists-sharedrepo' ) ) );
return;
}
- if ( $wgUser->isAllowed( 'suppressredirect' ) ) {
+ # Delete to make way if requested
+ if ( $this->deleteAndMove ) {
+ $permErrors = $nt->getUserPermissionsErrors( 'delete', $user );
+ if ( count( $permErrors ) ) {
+ # Only show the first error
+ $this->showForm( $permErrors );
+ return;
+ }
+
+ $reason = wfMessage( 'delete_and_move_reason', $ot )->inContentLanguage()->text();
+
+ // Delete an associated image if there is
+ if ( $nt->getNamespace() == NS_FILE ) {
+ $file = wfLocalFile( $nt );
+ if ( $file->exists() ) {
+ $file->delete( $reason, false );
+ }
+ }
+
+ $error = ''; // passed by ref
+ $page = WikiPage::factory( $nt );
+ if ( !$page->doDeleteArticle( $reason, false, 0, true, $error, $user ) ) {
+ $this->showForm( array( array( 'cannotdelete', wfEscapeWikiText( $nt->getPrefixedText() ) ) ) );
+ return;
+ }
+ }
+
+ if ( $user->isAllowed( 'suppressredirect' ) ) {
$createRedirect = $this->leaveRedirect;
} else {
$createRedirect = true;
@@ -406,8 +447,7 @@ class MovePageForm extends UnlistedSpecialPage {
# Do the actual move.
$error = $ot->moveTo( $nt, true, $this->reason, $createRedirect );
if ( $error !== true ) {
- # @todo FIXME: Show all the errors in a list, not just the first one
- $this->showForm( reset( $error ) );
+ $this->showForm( $error );
return;
}
@@ -417,18 +457,23 @@ class MovePageForm extends UnlistedSpecialPage {
wfRunHooks( 'SpecialMovepageAfterMove', array( &$this, &$ot, &$nt ) );
- $wgOut->setPagetitle( wfMsg( 'pagemovedsub' ) );
+ $out = $this->getOutput();
+ $out->setPagetitle( wfMsg( 'pagemovedsub' ) );
- $oldUrl = $ot->getFullUrl( 'redirect=no' );
- $newUrl = $nt->getFullUrl();
+ $oldLink = Linker::link(
+ $ot,
+ null,
+ array(),
+ array( 'redirect' => 'no' )
+ );
+ $newLink = Linker::linkKnown( $nt );
$oldText = $ot->getPrefixedText();
$newText = $nt->getPrefixedText();
- $oldLink = "<span class='plainlinks'>[$oldUrl $oldText]</span>";
- $newLink = "<span class='plainlinks'>[$newUrl $newText]</span>";
$msgName = $createRedirect ? 'movepage-moved-redirect' : 'movepage-moved-noredirect';
- $wgOut->addWikiMsg( 'movepage-moved', $oldLink, $newLink, $oldText, $newText );
- $wgOut->addWikiMsg( $msgName );
+ $out->addHTML( wfMessage( 'movepage-moved' )->rawParams( $oldLink,
+ $newLink )->params( $oldText, $newText )->parseAsBlock() );
+ $out->addWikiMsg( $msgName );
# 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
@@ -437,7 +482,7 @@ class MovePageForm extends UnlistedSpecialPage {
$this->moveTalk = false;
}
- if( !$ot->userCan( 'move-subpages' ) ) {
+ if ( count( $ot->getUserPermissionsErrors( 'move-subpages', $user ) ) ) {
$this->moveSubpages = false;
}
@@ -494,7 +539,6 @@ class MovePageForm extends UnlistedSpecialPage {
}
$extraOutput = array();
- $skin = $this->getSkin();
$count = 1;
foreach( $extraPages as $oldSubpage ) {
if( $ot->equals( $oldSubpage ) ) {
@@ -516,7 +560,7 @@ class MovePageForm extends UnlistedSpecialPage {
# be longer than 255 characters.
$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
if( !$newSubpage ) {
- $oldLink = $skin->linkKnown( $oldSubpage );
+ $oldLink = Linker::linkKnown( $oldSubpage );
$extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink,
htmlspecialchars(Title::makeName( $newNs, $newPageName )));
continue;
@@ -524,7 +568,7 @@ class MovePageForm extends UnlistedSpecialPage {
# This was copy-pasted from Renameuser, bleh.
if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) {
- $link = $skin->linkKnown( $newSubpage );
+ $link = Linker::linkKnown( $newSubpage );
$extraOutput []= wfMsgHtml( 'movepage-page-exists', $link );
} else {
$success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
@@ -532,22 +576,22 @@ class MovePageForm extends UnlistedSpecialPage {
if ( $this->fixRedirects ) {
DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage );
}
- $oldLink = $skin->linkKnown(
+ $oldLink = Linker::link(
$oldSubpage,
null,
array(),
array( 'redirect' => 'no' )
);
- $newLink = $skin->linkKnown( $newSubpage );
+ $newLink = Linker::linkKnown( $newSubpage );
$extraOutput []= wfMsgHtml( 'movepage-page-moved', $oldLink, $newLink );
++$count;
if( $count >= $wgMaximumMovedPages ) {
- $extraOutput []= wfMsgExt( 'movepage-max-pages', array( 'parsemag', 'escape' ), $wgLang->formatNum( $wgMaximumMovedPages ) );
+ $extraOutput []= wfMsgExt( 'movepage-max-pages', array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $wgMaximumMovedPages ) );
break;
}
} else {
- $oldLink = $skin->linkKnown( $oldSubpage );
- $newLink = $skin->link( $newSubpage );
+ $oldLink = Linker::linkKnown( $oldSubpage );
+ $newLink = Linker::link( $newSubpage );
$extraOutput []= wfMsgHtml( 'movepage-page-unmoved', $oldLink, $newLink );
}
}
@@ -555,16 +599,16 @@ class MovePageForm extends UnlistedSpecialPage {
}
if( $extraOutput !== array() ) {
- $wgOut->addHTML( "<ul>\n<li>" . implode( "</li>\n<li>", $extraOutput ) . "</li>\n</ul>" );
+ $out->addHTML( "<ul>\n<li>" . implode( "</li>\n<li>", $extraOutput ) . "</li>\n</ul>" );
}
# Deal with watches (we don't watch subpages)
- if( $this->watch && $wgUser->isLoggedIn() ) {
- $wgUser->addWatch( $ot );
- $wgUser->addWatch( $nt );
+ if( $this->watch && $user->isLoggedIn() ) {
+ $user->addWatch( $ot );
+ $user->addWatch( $nt );
} else {
- $wgUser->removeWatch( $ot );
- $wgUser->removeWatch( $nt );
+ $user->removeWatch( $ot );
+ $user->removeWatch( $nt );
}
# Re-clear the file redirect cache, which may have been polluted by
@@ -575,20 +619,20 @@ class MovePageForm extends UnlistedSpecialPage {
}
}
- function showLogFragment( $title, &$out ) {
+ function showLogFragment( $title ) {
+ $out = $this->getOutput();
$out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'move' ) ) );
- LogEventsList::showLogExtract( $out, 'move', $title->getPrefixedText() );
+ LogEventsList::showLogExtract( $out, 'move', $title );
}
- function showSubpages( $title, $out ) {
- global $wgLang;
-
+ function showSubpages( $title ) {
if( !MWNamespace::hasSubpages( $title->getNamespace() ) )
return;
$subpages = $title->getSubpages();
$count = $subpages instanceof TitleArray ? $subpages->count() : 0;
+ $out = $this->getOutput();
$out->wrapWikiMsg( '== $1 ==', array( 'movesubpage', $count ) );
# No subpages.
@@ -597,15 +641,13 @@ class MovePageForm extends UnlistedSpecialPage {
return;
}
- $out->addWikiMsg( 'movesubpagetext', $wgLang->formatNum( $count ) );
- $skin = $this->getSkin();
+ $out->addWikiMsg( 'movesubpagetext', $this->getLanguage()->formatNum( $count ) );
$out->addHTML( "<ul>\n" );
foreach( $subpages as $subpage ) {
- $link = $skin->link( $subpage );
+ $link = Linker::link( $subpage );
$out->addHTML( "<li>$link</li>\n" );
}
$out->addHTML( "</ul>\n" );
}
}
-
diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php
index ea20c2f7..b88123dc 100644
--- a/includes/specials/SpecialNewimages.php
+++ b/includes/specials/SpecialNewimages.php
@@ -30,7 +30,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
$this->setHeaders();
$this->outputHeader();
- $pager = new NewFilesPager( $par );
+ $pager = new NewFilesPager( $this->getContext(), $par );
if ( !$this->including() ) {
$form = $pager->getForm();
@@ -50,18 +50,16 @@ class SpecialNewFiles extends IncludableSpecialPage {
*/
class NewFilesPager extends ReverseChronologicalPager {
- function __construct( $par = null ) {
- global $wgRequest;
+ /**
+ * @var ImageGallery
+ */
+ var $gallery;
- $this->like = $wgRequest->getText( 'like' );
- $this->showbots = $wgRequest->getBool( 'showbots' , 0 );
- $this->skin = $this->getSkin();
+ function __construct( IContextSource $context, $par = null ) {
+ $this->like = $context->getRequest()->getText( 'like' );
+ $this->showbots = $context->getRequest()->getBool( 'showbots' , 0 );
- parent::__construct();
- }
-
- function getTitle() {
- return SpecialPage::getTitleFor( 'Newimages' );
+ parent::__construct( $context );
}
function getQueryInfo() {
@@ -105,7 +103,10 @@ class NewFilesPager extends ReverseChronologicalPager {
}
function getStartBody(){
- $this->gallery = new ImageGallery();
+ if ( !$this->gallery ) {
+ $this->gallery = new ImageGallery();
+ }
+ return '';
}
function getEndBody(){
@@ -113,24 +114,22 @@ class NewFilesPager extends ReverseChronologicalPager {
}
function formatRow( $row ) {
- global $wgLang;
-
$name = $row->img_name;
$user = User::newFromId( $row->img_user );
$title = Title::makeTitle( NS_FILE, $name );
- $ul = $this->skin->link( $user->getUserpage(), $user->getName() );
+ $ul = Linker::link( $user->getUserpage(), $user->getName() );
$this->gallery->add(
$title,
"$ul<br />\n<i>"
- . htmlspecialchars( $wgLang->timeanddate( $row->img_timestamp, true ) )
+ . htmlspecialchars( $this->getLanguage()->timeanddate( $row->img_timestamp, true ) )
. "</i><br />\n"
);
}
function getForm() {
- global $wgRequest, $wgMiserMode;
+ global $wgMiserMode;
$fields = array(
'like' => array(
@@ -142,16 +141,16 @@ class NewFilesPager extends ReverseChronologicalPager {
'type' => 'check',
'label' => wfMessage( 'showhidebots', wfMsg( 'show' ) ),
'name' => 'showbots',
- # 'default' => $wgRequest->getBool( 'showbots', 0 ),
+ # 'default' => $this->getRequest()->getBool( 'showbots', 0 ),
),
'limit' => array(
'type' => 'hidden',
- 'default' => $wgRequest->getText( 'limit' ),
+ 'default' => $this->getRequest()->getText( 'limit' ),
'name' => 'limit',
),
'offset' => array(
'type' => 'hidden',
- 'default' => $wgRequest->getText( 'offset' ),
+ 'default' => $this->getRequest()->getText( 'offset' ),
'name' => 'offset',
),
);
@@ -160,7 +159,7 @@ class NewFilesPager extends ReverseChronologicalPager {
unset( $fields['like'] );
}
- $form = new HTMLForm( $fields );
+ $form = new HTMLForm( $fields, $this->getContext() );
$form->setTitle( $this->getTitle() );
$form->setSubmitText( wfMsg( 'ilsubmit' ) );
$form->setMethod( 'get' );
diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php
index bf9fb9f7..54bcb97f 100644
--- a/includes/specials/SpecialNewpages.php
+++ b/includes/specials/SpecialNewpages.php
@@ -78,7 +78,6 @@ class SpecialNewpages extends IncludableSpecialPage {
}
protected function parseParams( $par ) {
- global $wgLang;
$bits = preg_split( '/\s*,\s*/', trim( $par ) );
foreach ( $bits as $bit ) {
if ( 'shownav' == $bit ) {
@@ -112,7 +111,7 @@ class SpecialNewpages extends IncludableSpecialPage {
$this->opts->setValue( 'username', $m[1] );
}
if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
- $ns = $wgLang->getNsIndex( $m[1] );
+ $ns = $this->getLanguage()->getNsIndex( $m[1] );
if( $ns !== false ) {
$this->opts->setValue( 'namespace', $ns );
}
@@ -139,11 +138,12 @@ class SpecialNewpages extends IncludableSpecialPage {
// Settings
$this->form();
- $this->setSyndicated();
$feedType = $this->opts->getValue( 'feed' );
if( $feedType ) {
return $this->feed( $feedType );
}
+
+ $out->setFeedAppendQuery( wfArrayToCGI( $this->opts->getAllValues() ) );
}
$pager = new NewPagesPager( $this, $this->opts );
@@ -162,7 +162,7 @@ class SpecialNewpages extends IncludableSpecialPage {
}
protected function filterLinks() {
- global $wgGroupPermissions, $wgLang;
+ global $wgGroupPermissions;
// show/hide links
$showhide = array( wfMsgHtml( 'show' ), wfMsgHtml( 'hide' ) );
@@ -194,13 +194,13 @@ class SpecialNewpages extends IncludableSpecialPage {
$self = $this->getTitle();
foreach ( $filters as $key => $msg ) {
$onoff = 1 - $this->opts->getValue( $key );
- $link = $this->getSkin()->link( $self, $showhide[$onoff], array(),
+ $link = Linker::link( $self, $showhide[$onoff], array(),
array( $key => $onoff ) + $changed
);
$links[$key] = wfMsgHtml( $msg, $link );
}
- return $wgLang->pipeList( $links );
+ return $this->getLanguage()->pipeList( $links );
}
protected function form() {
@@ -276,12 +276,6 @@ class SpecialNewpages extends IncludableSpecialPage {
$this->getOutput()->addHTML( $form );
}
- protected function setSyndicated() {
- $out = $this->getOutput();
- $out->setSyndicated( true );
- $out->setFeedAppendQuery( wfArrayToCGI( $this->opts->getAllValues() ) );
- }
-
/**
* Format a row, providing the timestamp, links to the page/history, size, user links, and a comment
*
@@ -289,8 +283,6 @@ class SpecialNewpages extends IncludableSpecialPage {
* @return String
*/
public function formatRow( $result ) {
- global $wgLang;
-
# Revision deletion works on revisions, so we should cast one
$row = array(
'comment' => $result->rc_comment,
@@ -302,11 +294,19 @@ class SpecialNewpages extends IncludableSpecialPage {
$classes = array();
- $dm = $wgLang->getDirMark();
+ $lang = $this->getLanguage();
+ $dm = $lang->getDirMark();
- $title = Title::makeTitleSafe( $result->rc_namespace, $result->rc_title );
- $time = Html::element( 'span', array( 'class' => 'mw-newpages-time' ),
- $wgLang->timeAndDate( $result->rc_timestamp, true )
+ $title = Title::newFromRow( $result );
+ $spanTime = Html::element( 'span', array( 'class' => 'mw-newpages-time' ),
+ $lang->timeanddate( $result->rc_timestamp, true )
+ );
+ $time = Linker::linkKnown(
+ $title,
+ $spanTime,
+ array(),
+ array( 'oldid' => $result->rc_this_oldid ),
+ array()
);
$query = array( 'redirect' => 'no' );
@@ -315,14 +315,14 @@ class SpecialNewpages extends IncludableSpecialPage {
$query['rcid'] = $result->rc_id;
}
- $plink = $this->getSkin()->linkKnown(
+ $plink = Linker::linkKnown(
$title,
null,
array( 'class' => 'mw-newpages-pagename' ),
$query,
array( 'known' ) // Set explicitly to avoid the default of 'known','noclasses'. This breaks the colouration for stubs
);
- $histLink = $this->getSkin()->linkKnown(
+ $histLink = Linker::linkKnown(
$title,
wfMsgHtml( 'hist' ),
array(),
@@ -330,13 +330,12 @@ class SpecialNewpages extends IncludableSpecialPage {
);
$hist = Html::rawElement( 'span', array( 'class' => 'mw-newpages-history' ), wfMsg( 'parentheses', $histLink ) );
- $length = Html::rawElement( 'span', array( 'class' => 'mw-newpages-length' ),
- '[' . wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ), $wgLang->formatNum( $result->length ) ) .
- ']'
+ $length = Html::element( 'span', array( 'class' => 'mw-newpages-length' ),
+ '[' . $this->msg( 'nbytes' )->numParams( $result->length )->text() . ']'
);
- $ulink = $this->getSkin()->revUserTools( $rev );
- $comment = $this->getSkin()->revComment( $rev );
+ $ulink = Linker::revUserTools( $rev );
+ $comment = Linker::revComment( $rev );
if ( $this->patrollable( $result ) ) {
$classes[] = 'not-patrolled';
@@ -357,7 +356,14 @@ class SpecialNewpages extends IncludableSpecialPage {
$css = count( $classes ) ? ' class="' . implode( ' ', $classes ) . '"' : '';
- return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay}</li>\n";
+ # Display the old title if the namespace has been changed
+ $oldTitleText = '';
+ if ( $result->page_namespace !== $result->rc_namespace ) {
+ $oldTitleText = wfMessage( 'rc-old-title' )->params( Title::makeTitle( $result->rc_namespace, $result->rc_title )
+ ->getPrefixedText() )->escaped();
+ }
+
+ return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
}
/**
@@ -461,33 +467,11 @@ class NewPagesPager extends ReverseChronologicalPager {
protected $mForm;
function __construct( $form, FormOptions $opts ) {
- parent::__construct();
+ parent::__construct( $form->getContext() );
$this->mForm = $form;
$this->opts = $opts;
}
- /**
- * @return Title
- */
- function getTitle() {
- static $title = null;
- if ( $title === null ) {
- $title = $this->mForm->getTitle();
- }
- return $title;
- }
-
- /**
- * @return User
- */
- function getUser() {
- static $user = null;
- if ( $user === null ) {
- $user = $this->mForm->getUser();
- }
- return $user;
- }
-
function getQueryInfo() {
global $wgEnableNewpagesUserFilter, $wgGroupPermissions;
$conds = array();
@@ -531,7 +515,8 @@ class NewPagesPager extends ReverseChronologicalPager {
$fields = array(
'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text',
'rc_comment', 'rc_timestamp', 'rc_patrolled','rc_id', 'rc_deleted',
- 'page_len AS length', 'page_latest AS rev_id', 'ts_tags'
+ 'page_len AS length', 'page_latest AS rev_id', 'ts_tags', 'rc_this_oldid',
+ 'page_namespace', 'page_title'
);
$join_conds = array( 'page' => array( 'INNER JOIN', 'page_id=rc_cur_id' ) );
diff --git a/includes/specials/SpecialPasswordReset.php b/includes/specials/SpecialPasswordReset.php
index db5268d6..62731e98 100644
--- a/includes/specials/SpecialPasswordReset.php
+++ b/includes/specials/SpecialPasswordReset.php
@@ -1,6 +1,6 @@
<?php
/**
- * Implements Special:Blankpage
+ * Implements Special:PasswordReset
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -28,19 +28,33 @@
*/
class SpecialPasswordReset extends FormSpecialPage {
+ /**
+ * @var Message
+ */
+ private $email;
+
+ /**
+ * @var Status
+ */
+ private $result;
+
public function __construct() {
parent::__construct( 'PasswordReset' );
}
public function userCanExecute( User $user ) {
+ return $this->canChangePassword( $user ) === true && parent::userCanExecute( $user );
+ }
+
+ public function checkExecutePermissions( User $user ) {
$error = $this->canChangePassword( $user );
if ( is_string( $error ) ) {
throw new ErrorPageError( 'internalerror', $error );
- } else if ( !$error ) {
+ } elseif ( !$error ) {
throw new ErrorPageError( 'internalerror', 'resetpass_forbidden' );
}
- return parent::userCanExecute( $user );
+ return parent::checkExecutePermissions( $user );
}
protected function getFormFields() {
@@ -69,6 +83,14 @@ class SpecialPasswordReset extends FormSpecialPage {
);
}
+ if( $this->getUser()->isAllowed( 'passwordreset' ) ){
+ $a['Capture'] = array(
+ 'type' => 'check',
+ 'label-message' => 'passwordreset-capture',
+ 'help-message' => 'passwordreset-capture-help',
+ );
+ }
+
return $a;
}
@@ -109,6 +131,16 @@ 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
+ throw new PermissionsError( 'passwordreset' );
+ }
+
+ /**
+ * @var $firstUser User
+ * @var $users User[]
+ */
+
if ( isset( $data['Username'] ) && $data['Username'] !== '' ) {
$method = 'username';
$users = array( User::newFromName( $data['Username'] ) );
@@ -183,7 +215,7 @@ class SpecialPasswordReset extends FormSpecialPage {
// We need to have a valid IP address for the hook, but per bug 18347, we should
// send the user's name if they're logged in.
- $ip = wfGetIP();
+ $ip = $this->getRequest()->getIP();
if ( !$ip ) {
return array( 'badipaddress' );
}
@@ -207,8 +239,8 @@ class SpecialPasswordReset extends FormSpecialPage {
}
$passwordBlock = implode( "\n\n", $passwords );
- $body = wfMessage( $msg )->inLanguage( $userLanguage );
- $body->params(
+ $this->email = wfMessage( $msg )->inLanguage( $userLanguage );
+ $this->email->params(
$username,
$passwordBlock,
count( $passwords ),
@@ -218,28 +250,49 @@ class SpecialPasswordReset extends FormSpecialPage {
$title = wfMessage( 'passwordreset-emailtitle' );
- $result = $firstUser->sendMail( $title->text(), $body->text() );
+ $this->result = $firstUser->sendMail( $title->escaped(), $this->email->escaped() );
+
+ // Blank the email if the user is not supposed to see it
+ if( !isset( $data['Capture'] ) || !$data['Capture'] ) {
+ $this->email = null;
+ }
- if ( $result->isGood() ) {
+ if ( $this->result->isGood() ) {
+ return true;
+ } 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... :(
- return array( array( 'mailerror', $result->getMessage() ) );
+ return array( array( 'mailerror', $this->result->getMessage() ) );
}
}
public function onSuccess() {
+ if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ){
+ // @todo: Logging
+
+ if( $this->result->isGood() ){
+ $this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture' );
+ } else {
+ $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture', $this->result->getMessage() );
+ }
+
+ $this->getOutput()->addHTML( Html::rawElement( 'pre', array(), $this->email->escaped() ) );
+ }
+
$this->getOutput()->addWikiMsg( 'passwordreset-emailsent' );
$this->getOutput()->returnToMain();
}
- function canChangePassword(User $user) {
+ protected function canChangePassword( User $user ) {
global $wgPasswordResetRoutes, $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';
}
@@ -257,15 +310,12 @@ class SpecialPasswordReset extends FormSpecialPage {
return true;
}
-
/**
* Hide the password reset page if resets are disabled.
* @return Bool
*/
function isListed() {
- global $wgUser;
-
- if ( $this->canChangePassword( $wgUser ) === true ) {
+ if ( $this->canChangePassword( $this->getUser() ) === true ) {
return parent::isListed();
}
diff --git a/includes/specials/SpecialPopularpages.php b/includes/specials/SpecialPopularpages.php
index 7c7190ad..803f03e7 100644
--- a/includes/specials/SpecialPopularpages.php
+++ b/includes/specials/SpecialPopularpages.php
@@ -36,6 +36,7 @@ class PopularPagesPage extends QueryPage {
# page_counter is not indexed
return true;
}
+
function isSyndicated() { return false; }
function getQueryInfo() {
@@ -54,17 +55,13 @@ class PopularPagesPage extends QueryPage {
* @return string
*/
function formatResult( $skin, $result ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
$title = Title::makeTitle( $result->namespace, $result->title );
- $link = $skin->linkKnown(
+ $link = Linker::linkKnown(
$title,
htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
);
- $nv = wfMsgExt(
- 'nviews',
- array( 'parsemag', 'escape'),
- $wgLang->formatNum( $result->value )
- );
- return wfSpecialList($link, $nv);
+ $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 edc26bc1..946112bf 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -31,70 +31,60 @@ class SpecialPreferences extends SpecialPage {
parent::__construct( 'Preferences' );
}
- function execute( $par ) {
- global $wgOut, $wgUser, $wgRequest;
-
+ public function execute( $par ) {
$this->setHeaders();
$this->outputHeader();
- $wgOut->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
+ $out = $this->getOutput();
+ $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
- if ( $wgUser->isAnon() ) {
- $wgOut->showErrorPage( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
- return;
- }
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
+ $user = $this->getUser();
+ if ( $user->isAnon() ) {
+ $out->showErrorPage( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
return;
}
+ $this->checkReadOnly();
if ( $par == 'reset' ) {
$this->showResetForm();
return;
}
- $wgOut->addModules( 'mediawiki.special.preferences' );
+ $out->addModules( 'mediawiki.special.preferences' );
- if ( $wgRequest->getCheck( 'success' ) ) {
- $wgOut->wrapWikiMsg(
+ if ( $this->getRequest()->getCheck( 'success' ) ) {
+ $out->wrapWikiMsg(
"<div class=\"successbox\"><strong>\n$1\n</strong></div><div id=\"mw-pref-clear\"></div>",
'savedprefs'
);
}
- if ( $wgRequest->getCheck( 'eauth' ) ) {
- $wgOut->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
- 'eauthentsent', $wgUser->getName() );
- }
-
- $htmlForm = Preferences::getFormObject( $wgUser );
+ $htmlForm = Preferences::getFormObject( $user, $this->getContext() );
$htmlForm->setSubmitCallback( array( 'Preferences', 'tryUISubmit' ) );
$htmlForm->show();
}
- function showResetForm() {
- global $wgOut;
-
- $wgOut->addWikiMsg( 'prefs-reset-intro' );
+ private function showResetForm() {
+ $this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
$htmlForm = new HTMLForm( array(), $this->getContext(), 'prefs-restore' );
$htmlForm->setSubmitText( wfMsg( 'restoreprefs' ) );
$htmlForm->setTitle( $this->getTitle( 'reset' ) );
- $htmlForm->setSubmitCallback( array( __CLASS__, 'submitReset' ) );
+ $htmlForm->setSubmitCallback( array( $this, 'submitReset' ) );
$htmlForm->suppressReset();
$htmlForm->show();
}
- static function submitReset( $formData ) {
- global $wgUser, $wgOut;
- $wgUser->resetOptions();
- $wgUser->saveSettings();
+ public function submitReset( $formData ) {
+ $user = $this->getUser();
+ $user->resetOptions();
+ $user->saveSettings();
$url = SpecialPage::getTitleFor( 'Preferences' )->getFullURL( 'success' );
- $wgOut->redirect( $url );
+ $this->getOutput()->redirect( $url );
return true;
}
diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php
index 28be4daf..495f15f7 100644
--- a/includes/specials/SpecialPrefixindex.php
+++ b/includes/specials/SpecialPrefixindex.php
@@ -38,23 +38,26 @@ class SpecialPrefixindex extends SpecialAllpages {
* @param $par String: becomes "FOO" when called like Special:Prefixindex/FOO (default null)
*/
function execute( $par ) {
- global $wgRequest, $wgOut, $wgContLang;
+ global $wgContLang;
$this->setHeaders();
$this->outputHeader();
- $wgOut->addModuleStyles( 'mediawiki.special' );
+
+ $out = $this->getOutput();
+ $out->addModuleStyles( 'mediawiki.special' );
# GET values
- $from = $wgRequest->getVal( 'from', '' );
- $prefix = $wgRequest->getVal( 'prefix', '' );
- $ns = $wgRequest->getIntOrNull( 'namespace' );
+ $request = $this->getRequest();
+ $from = $request->getVal( 'from', '' );
+ $prefix = $request->getVal( 'prefix', '' );
+ $ns = $request->getIntOrNull( 'namespace' );
$namespace = (int)$ns; // if no namespace given, use 0 (NS_MAIN).
$namespaces = $wgContLang->getNamespaces();
- $wgOut->setPagetitle(
+ $out->setPageTitle(
( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) )
- ? wfMsg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) )
- : wfMsg( 'prefixindex' )
+ ? $this->msg( 'prefixindex-namespace', str_replace( '_', ' ', $namespaces[$namespace] ) )
+ : $this->msg( 'prefixindex' )
);
$showme = '';
@@ -62,8 +65,9 @@ class SpecialPrefixindex extends SpecialAllpages {
$showme = $par;
} elseif( $prefix != '' ) {
$showme = $prefix;
- } elseif( $from != '' ) {
+ } 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;
}
@@ -71,7 +75,7 @@ class SpecialPrefixindex extends SpecialAllpages {
if ( $this->including() || $showme != '' || $ns !== null ) {
$this->showPrefixChunk( $namespace, $showme, $from );
} else {
- $wgOut->addHTML( $this->namespacePrefixForm( $namespace, null ) );
+ $out->addHTML( $this->namespacePrefixForm( $namespace, null ) );
}
}
@@ -82,11 +86,10 @@ class SpecialPrefixindex extends SpecialAllpages {
*/
function namespacePrefixForm( $namespace = NS_MAIN, $from = '' ) {
global $wgScript;
- $t = $this->getTitle();
$out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
- $out .= Html::hidden( 'title', $t->getPrefixedText() );
+ $out .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
$out .= Xml::element( 'legend', null, wfMsg( 'allpages' ) );
$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
@@ -120,11 +123,11 @@ class SpecialPrefixindex extends SpecialAllpages {
* @param $from String: list all pages from this name (default FALSE)
*/
function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null ) {
- global $wgOut, $wgContLang, $wgLang;
-
- $sk = $this->getSkin();
+ global $wgContLang;
- if (!isset($from)) $from = $prefix;
+ if ( $from === null ) {
+ $from = $prefix;
+ }
$fromList = $this->getNamespaceKeyAndText($namespace, $from);
$prefixList = $this->getNamespaceKeyAndText($namespace, $prefix);
@@ -169,7 +172,7 @@ class SpecialPrefixindex extends SpecialAllpages {
$t = Title::makeTitle( $s->page_namespace, $s->page_title );
if( $t ) {
$link = ($s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
- $sk->linkKnown(
+ Linker::linkKnown(
$t,
htmlspecialchars( $t->getText() )
) .
@@ -214,10 +217,11 @@ class SpecialPrefixindex extends SpecialAllpages {
'prefix' => $prefix
);
- if( $namespace ) {
+ 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,
wfMsgHtml( 'nextpage', str_replace( '_',' ', htmlspecialchars( $s->page_title ) ) ),
diff --git a/includes/specials/SpecialProtectedpages.php b/includes/specials/SpecialProtectedpages.php
index b1f61f09..eec974fe 100644
--- a/includes/specials/SpecialProtectedpages.php
+++ b/includes/specials/SpecialProtectedpages.php
@@ -36,8 +36,6 @@ class SpecialProtectedpages extends SpecialPage {
}
public function execute( $par ) {
- global $wgOut, $wgRequest;
-
$this->setHeaders();
$this->outputHeader();
@@ -46,17 +44,18 @@ class SpecialProtectedpages extends SpecialPage {
Title::purgeExpiredRestrictions();
}
- $type = $wgRequest->getVal( $this->IdType );
- $level = $wgRequest->getVal( $this->IdLevel );
- $sizetype = $wgRequest->getVal( 'sizetype' );
- $size = $wgRequest->getIntOrNull( 'size' );
- $NS = $wgRequest->getIntOrNull( 'namespace' );
- $indefOnly = $wgRequest->getBool( 'indefonly' ) ? 1 : 0;
- $cascadeOnly = $wgRequest->getBool('cascadeonly') ? 1 : 0;
+ $request = $this->getRequest();
+ $type = $request->getVal( $this->IdType );
+ $level = $request->getVal( $this->IdLevel );
+ $sizetype = $request->getVal( 'sizetype' );
+ $size = $request->getIntOrNull( 'size' );
+ $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 );
- $wgOut->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size, $indefOnly, $cascadeOnly ) );
+ $this->getOutput()->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size, $indefOnly, $cascadeOnly ) );
if( $pager->getNumRows() ) {
$s = $pager->getNavigationBar();
@@ -67,7 +66,7 @@ class SpecialProtectedpages extends SpecialPage {
} else {
$s = '<p>' . wfMsgHtml( 'protectedpagesempty' ) . '</p>';
}
- $wgOut->addHTML( $s );
+ $this->getOutput()->addHTML( $s );
}
/**
@@ -76,19 +75,16 @@ class SpecialProtectedpages extends SpecialPage {
* @return string Formatted <li> element
*/
public function formatRow( $row ) {
- global $wgUser, $wgLang;
-
wfProfileIn( __METHOD__ );
- static $skin = null, $infinity = null;
+ static $infinity = null;
- if( is_null( $skin ) ){
- $skin = $wgUser->getSkin();
+ if( is_null( $infinity ) ){
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- $link = $skin->link( $title );
+ $link = Linker::link( $title );
$description_items = array ();
@@ -101,27 +97,28 @@ class SpecialProtectedpages extends SpecialPage {
}
$stxt = '';
+ $lang = $this->getLanguage();
- $expiry = $wgLang->formatExpiry( $row->pr_expiry, TS_MW );
+ $expiry = $lang->formatExpiry( $row->pr_expiry, TS_MW );
if( $expiry != $infinity ) {
$expiry_description = wfMsg(
- 'protect-expiring',
- $wgLang->timeanddate( $expiry ),
- $wgLang->date( $expiry ),
- $wgLang->time( $expiry )
+ 'protect-expiring-local',
+ $lang->timeanddate( $expiry, true ),
+ $lang->date( $expiry, true ),
+ $lang->time( $expiry, true )
);
$description_items[] = htmlspecialchars($expiry_description);
}
if(!is_null($size = $row->page_len)) {
- $stxt = $wgLang->getDirMark() . ' ' . $skin->formatRevisionSize( $size );
+ $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( $wgUser->isAllowed( 'protect' ) ) {
- $changeProtection = ' (' . $skin->linkKnown(
+ if( $this->getUser()->isAllowed( 'protect' ) ) {
+ $changeProtection = ' (' . Linker::linkKnown(
$title,
wfMsgHtml( 'protect_change' ),
array(),
@@ -129,7 +126,7 @@ class SpecialProtectedpages extends SpecialPage {
) . ')';
} else {
$ltitle = SpecialPage::getTitleFor( 'Log' );
- $changeProtection = ' (' . $skin->linkKnown(
+ $changeProtection = ' (' . Linker::linkKnown(
$ltitle,
wfMsgHtml( 'protectlogpage' ),
array(),
@@ -145,7 +142,7 @@ class SpecialProtectedpages extends SpecialPage {
return Html::rawElement(
'li',
array(),
- wfSpecialList( $link . $stxt, $wgLang->commaList( $description_items ), false ) . $changeProtection ) . "\n";
+ $lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) . $changeProtection ) . "\n";
}
/**
@@ -160,7 +157,7 @@ class SpecialProtectedpages extends SpecialPage {
*/
protected function showOptions( $namespace, $type='edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
global $wgScript;
- $title = SpecialPage::getTitleFor( 'Protectedpages' );
+ $title = $this->getTitle();
return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', array(), wfMsg( 'protectedpages' ) ) .
@@ -306,7 +303,7 @@ class ProtectedPagesPager extends AlphabeticPager {
$this->size = intval($size);
$this->indefonly = (bool)$indefonly;
$this->cascadeonly = (bool)$cascadeonly;
- parent::__construct();
+ parent::__construct( $form->getContext() );
}
function getStartBody() {
@@ -319,10 +316,6 @@ class ProtectedPagesPager extends AlphabeticPager {
return '';
}
- function getTitle() {
- return SpecialPage::getTitleFor( 'Protectedpages' );
- }
-
function formatRow( $row ) {
return $this->mForm->formatRow( $row );
}
diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php
index 5fb91af7..982feb66 100644
--- a/includes/specials/SpecialProtectedtitles.php
+++ b/includes/specials/SpecialProtectedtitles.php
@@ -36,8 +36,6 @@ class SpecialProtectedtitles extends SpecialPage {
}
function execute( $par ) {
- global $wgOut, $wgRequest;
-
$this->setHeaders();
$this->outputHeader();
@@ -46,15 +44,16 @@ class SpecialProtectedtitles extends SpecialPage {
Title::purgeExpiredRestrictions();
}
- $type = $wgRequest->getVal( $this->IdType );
- $level = $wgRequest->getVal( $this->IdLevel );
- $sizetype = $wgRequest->getVal( 'sizetype' );
- $size = $wgRequest->getIntOrNull( 'size' );
- $NS = $wgRequest->getIntOrNull( 'namespace' );
+ $request = $this->getRequest();
+ $type = $request->getVal( $this->IdType );
+ $level = $request->getVal( $this->IdLevel );
+ $sizetype = $request->getVal( 'sizetype' );
+ $size = $request->getIntOrNull( 'size' );
+ $NS = $request->getIntOrNull( 'namespace' );
$pager = new ProtectedTitlesPager( $this, array(), $type, $level, $NS, $sizetype, $size );
- $wgOut->addHTML( $this->showOptions( $NS, $type, $level ) );
+ $this->getOutput()->addHTML( $this->showOptions( $NS, $type, $level ) );
if ( $pager->getNumRows() ) {
$s = $pager->getNavigationBar();
@@ -65,7 +64,7 @@ class SpecialProtectedtitles extends SpecialPage {
} else {
$s = '<p>' . wfMsgHtml( 'protectedtitlesempty' ) . '</p>';
}
- $wgOut->addHTML( $s );
+ $this->getOutput()->addHTML( $s );
}
/**
@@ -74,19 +73,16 @@ class SpecialProtectedtitles extends SpecialPage {
* @return string
*/
function formatRow( $row ) {
- global $wgLang;
-
wfProfileIn( __METHOD__ );
- static $skin = null, $infinity = null;
+ static $infinity = null;
- if( is_null( $skin ) ){
- $skin = $this->getSkin();
+ if( is_null( $infinity ) ){
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
$title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
- $link = $skin->link( $title );
+ $link = Linker::link( $title );
$description_items = array ();
@@ -94,17 +90,22 @@ class SpecialProtectedtitles extends SpecialPage {
$description_items[] = $protType;
- $expiry = strlen( $row->pt_expiry ) ? $wgLang->formatExpiry( $row->pt_expiry, TS_MW ) : $infinity;
+ $lang = $this->getLanguage();
+ $expiry = strlen( $row->pt_expiry ) ? $lang->formatExpiry( $row->pt_expiry, TS_MW ) : $infinity;
if( $expiry != $infinity ) {
-
- $expiry_description = wfMsg( 'protect-expiring', $wgLang->timeanddate( $expiry ) , $wgLang->date( $expiry ) , $wgLang->time( $expiry ) );
+ $expiry_description = wfMsg(
+ 'protect-expiring-local',
+ $lang->timeanddate( $expiry, true ),
+ $lang->date( $expiry, true ),
+ $lang->time( $expiry, true )
+ );
$description_items[] = htmlspecialchars($expiry_description);
}
wfProfileOut( __METHOD__ );
- return '<li>' . wfSpecialList( $link, implode( $description_items, ', ' ) ) . "</li>\n";
+ return '<li>' . $lang->specialList( $link, implode( $description_items, ', ' ) ) . "</li>\n";
}
/**
@@ -116,7 +117,7 @@ class SpecialProtectedtitles extends SpecialPage {
function showOptions( $namespace, $type='edit', $level ) {
global $wgScript;
$action = htmlspecialchars( $wgScript );
- $title = SpecialPage::getTitleFor( 'Protectedtitles' );
+ $title = $this->getTitle();
$special = htmlspecialchars( $title->getPrefixedDBkey() );
return "<form action=\"$action\" method=\"get\">\n" .
'<fieldset>' .
@@ -189,7 +190,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
$this->level = $level;
$this->namespace = $namespace;
$this->size = intval($size);
- parent::__construct();
+ parent::__construct( $form->getContext() );
}
function getStartBody() {
@@ -207,6 +208,9 @@ class ProtectedTitlesPager extends AlphabeticPager {
return '';
}
+ /**
+ * @return Title
+ */
function getTitle() {
return SpecialPage::getTitleFor( 'Protectedtitles' );
}
@@ -215,6 +219,9 @@ class ProtectedTitlesPager extends AlphabeticPager {
return $this->mForm->formatRow( $row );
}
+ /**
+ * @return array
+ */
function getQueryInfo() {
$conds = $this->mConds;
$conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php
index e299dc77..0b6239bb 100644
--- a/includes/specials/SpecialRandompage.php
+++ b/includes/specials/SpecialRandompage.php
@@ -33,8 +33,7 @@ class RandomPage extends SpecialPage {
protected $extra = array(); // Extra SQL statements
public function __construct( $name = 'Randompage' ){
- global $wgContentNamespaces;
- $this->namespaces = $wgContentNamespaces;
+ $this->namespaces = MWNamespace::getContentNamespaces();
parent::__construct( $name );
}
@@ -55,9 +54,9 @@ class RandomPage extends SpecialPage {
}
public function execute( $par ) {
- global $wgOut, $wgContLang, $wgRequest;
+ global $wgContLang;
- if ($par) {
+ if ( $par ) {
$this->setNamespace( $wgContLang->getNsIndex( $par ) );
}
@@ -65,15 +64,15 @@ class RandomPage extends SpecialPage {
if( is_null( $title ) ) {
$this->setHeaders();
- $wgOut->addWikiMsg( strtolower( $this->mName ) . '-nopages',
+ $this->getOutput()->addWikiMsg( strtolower( $this->getName() ) . '-nopages',
$this->getNsList(), count( $this->namespaces ) );
return;
}
$redirectParam = $this->isRedirect() ? array( 'redirect' => 'no' ) : array();
- $query = array_merge( $wgRequest->getValues(), $redirectParam );
+ $query = array_merge( $this->getRequest()->getValues(), $redirectParam );
unset( $query['title'] );
- $wgOut->redirect( $title->getFullUrl( $query ) );
+ $this->getOutput()->redirect( $title->getFullUrl( $query ) );
}
/**
diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php
index 6c78ced0..daf47f62 100644
--- a/includes/specials/SpecialRecentchanges.php
+++ b/includes/specials/SpecialRecentchanges.php
@@ -73,9 +73,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
public function setup( $parameters ) {
$opts = $this->getDefaultOptions();
- $this->customFilters = array();
- wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
- foreach( $this->customFilters as $key => $params ) {
+ foreach( $this->getCustomFilters() as $key => $params ) {
$opts->add( $key, $params['default'] );
}
@@ -91,6 +89,19 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
/**
+ * Get custom show/hide filters
+ *
+ * @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;
+ }
+
+ /**
* Create a FormOptions object specific for feed requests and return it
*
* @return FormOptions
@@ -232,6 +243,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
if( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
$opts['days'] = $m[1];
}
+ if( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
+ $opts['namespace'] = $m[1];
+ }
}
}
@@ -617,7 +631,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
* @param $opts FormOptions
*/
function setTopText( FormOptions $opts ) {
- $this->getOutput()->addWikiText( wfMsgForContentNoTrans( 'recentchangestext' ) );
+ global $wgContLang;
+ $this->getOutput()->addWikiText(
+ Html::rawElement( 'p',
+ array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+ "\n" . wfMsgForContentNoTrans( 'recentchangestext' ) . "\n"
+ ),
+ /* $lineStart */ false,
+ /* $interface */ false
+ );
}
/**
@@ -636,7 +658,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
* @return String
*/
protected function namespaceFilterForm( FormOptions $opts ) {
- $nsSelect = Xml::namespaceSelector( $opts['namespace'], '' );
+ $nsSelect = Html::namespaceSelector(
+ array( 'selected' => $opts['namespace'], 'all' => '' ),
+ array( 'name' => 'namespace', 'id' => 'namespace' )
+ );
$nsLabel = Xml::label( wfMsg( 'namespace' ), 'namespace' );
$invert = Xml::checkLabel(
wfMsg( 'invert' ), 'invert', 'nsinvert',
@@ -766,10 +791,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
if( $options['from'] ) {
$note .= wfMsgExt( 'rcnotefrom', array( 'parseinline' ),
- $this->getLang()->formatNum( $options['limit'] ),
- $this->getLang()->timeanddate( $options['from'], true ),
- $this->getLang()->date( $options['from'], true ),
- $this->getLang()->time( $options['from'], true ) ) . '<br />';
+ $this->getLanguage()->formatNum( $options['limit'] ),
+ $this->getLanguage()->timeanddate( $options['from'], true ),
+ $this->getLanguage()->date( $options['from'], true ),
+ $this->getLanguage()->time( $options['from'], true ) ) . '<br />';
}
# Sort data for display and make sure it's unique after we've added user data.
@@ -782,30 +807,30 @@ class SpecialRecentChanges extends IncludableSpecialPage {
// limit links
foreach( $wgRCLinkLimits as $value ) {
- $cl[] = $this->makeOptionsLink( $this->getLang()->formatNum( $value ),
+ $cl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
}
- $cl = $this->getLang()->pipeList( $cl );
+ $cl = $this->getLanguage()->pipeList( $cl );
// day links, reset 'from' to none
foreach( $wgRCLinkDays as $value ) {
- $dl[] = $this->makeOptionsLink( $this->getLang()->formatNum( $value ),
+ $dl[] = $this->makeOptionsLink( $this->getLanguage()->formatNum( $value ),
array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
}
- $dl = $this->getLang()->pipeList( $dl );
+ $dl = $this->getLanguage()->pipeList( $dl );
// show/hide links
$showhide = array( wfMsg( 'show' ), wfMsg( 'hide' ) );
$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->customFilters as $key => $params ) {
+ foreach ( $this->getCustomFilters() as $key => $params ) {
$filters[$key] = $params['msg'];
}
// Disable some if needed
@@ -822,13 +847,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
// show from this onward link
$timestamp = wfTimestampNow();
- $now = $this->getLang()->timeanddate( $timestamp, true );
+ $now = $this->getLanguage()->timeanddate( $timestamp, true );
$tl = $this->makeOptionsLink(
$now, array( 'from' => $timestamp ), $nondefaults
);
$rclinks = wfMsgExt( 'rclinks', array( 'parseinline', 'replaceafter' ),
- $cl, $dl, $this->getLang()->pipeList( $links ) );
+ $cl, $dl, $this->getLanguage()->pipeList( $links ) );
$rclistfrom = wfMsgExt( 'rclistfrom', array( 'parseinline', 'replaceafter' ), $tl );
return "{$note}$rclinks<br />$rclistfrom";
}
diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php
index 8b8369b5..1f556f89 100644
--- a/includes/specials/SpecialRecentchangeslinked.php
+++ b/includes/specials/SpecialRecentchangeslinked.php
@@ -69,13 +69,14 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
if ( $target === '' ) {
return false;
}
+ $outputPage = $this->getOutput();
$title = Title::newFromURL( $target );
if( !$title || $title->getInterwiki() != '' ){
- $this->getOutput()->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
+ $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
return false;
}
- $this->getOutput()->setPageTitle( wfMsg( 'recentchangeslinked-title', $title->getPrefixedText() ) );
+ $outputPage->setPageTitle( $this->msg( 'recentchangeslinked-title', $title->getPrefixedText() ) );
/*
* Ordinary links are in the pagelinks table, while transclusions are
@@ -113,8 +114,9 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$query_options, $opts['tagfilter'] );
}
- if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) )
+ if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) ) {
return false;
+ }
if( $ns == NS_CATEGORY && !$showlinkedto ) {
// special handling for categories
@@ -125,11 +127,14 @@ 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 ) $link_tables[] = 'imagelinks';
+ 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
+ }
// field name prefixes for all the various tables we might want to join with
$prefix = array( 'pagelinks' => 'pl', 'templatelinks' => 'tl', 'categorylinks' => 'cl', 'imagelinks' => 'il' );
@@ -140,14 +145,20 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$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' ) $link_ns = NS_FILE;
- elseif( $link_table == 'categorylinks' ) $link_ns = NS_CATEGORY;
- else $link_ns = 0;
+ if( $link_table == 'imagelinks' ) {
+ $link_ns = NS_FILE;
+ } elseif( $link_table == 'categorylinks' ) {
+ $link_ns = NS_CATEGORY;
+ } else {
+ $link_ns = 0;
+ }
if( $showlinkedto ) {
// find changes to pages linking to this page
if( $link_ns ) {
- if( $ns != $link_ns ) continue; // should never happen, but check anyway
+ if( $ns != $link_ns ) {
+ continue;
+ } // should never happen, but check anyway
$subconds = array( "{$pfx}_to" => $dbkey );
} else {
$subconds = array( "{$pfx}_namespace" => $ns, "{$pfx}_title" => $dbkey );
@@ -164,11 +175,11 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
}
}
- if( $dbr->unionSupportsOrderAndLimit())
+ if( $dbr->unionSupportsOrderAndLimit()) {
$order = array( 'ORDER BY' => 'rc_timestamp DESC' );
- else
+ } else {
$order = array();
-
+ }
$query = $dbr->selectSQLText(
array_merge( $tables, array( $link_table ) ),
@@ -185,11 +196,12 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$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 {
+ } else {
// need to resort and relimit after union
$sql = $dbr->unionQueries($subsql, false).' ORDER BY rc_timestamp DESC';
$sql = $dbr->limitResult($sql, $limit, false);
@@ -197,12 +209,17 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$res = $dbr->query( $sql, __METHOD__ );
- if( $res->numRows() == 0 )
+ if( $res->numRows() == 0 ) {
$this->mResultEmpty = true;
+ }
return $res;
}
+ /**
+ * @param $opts FormOptions
+ * @return array
+ */
function getExtraOptions( $opts ){
$opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
$extraOpts = array();
@@ -212,8 +229,9 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
Xml::check( 'showlinkedto', $opts['showlinkedto'], array('id' => 'showlinkedto') ) . ' ' .
Xml::label( wfMsg("recentchangeslinked-to"), 'showlinkedto' ) );
$tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
- if ($tagFilter)
+ if ($tagFilter) {
$extraOpts['tagfilter'] = $tagFilter;
+ }
return $extraOpts;
}
@@ -235,8 +253,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
function setTopText( FormOptions $opts ) {
$target = $this->getTargetTitle();
if( $target ) {
- $this->getOutput()->setSubtitle( wfMsg( 'recentchangeslinked-backlink', Linker::link( $target,
- $target->getPrefixedText(), array(), array( 'redirect' => 'no' ) ) ) );
+ $this->getOutput()->addBacklinkSubtitle( $target );
}
}
diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php
index 3c643253..df60a26a 100644
--- a/includes/specials/SpecialRevisiondelete.php
+++ b/includes/specials/SpecialRevisiondelete.php
@@ -111,15 +111,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
}
public function execute( $par ) {
+ $this->checkPermissions();
+ $this->checkReadOnly();
+
$output = $this->getOutput();
$user = $this->getUser();
- if( !$user->isAllowed( 'deletedhistory' ) ) {
- $output->permissionRequired( 'deletedhistory' );
- return;
- } elseif( wfReadOnly() ) {
- $output->readOnlyPage();
- return;
- }
+
$this->mIsAllowed = $user->isAllowed('deleterevision'); // for changes
$this->setHeaders();
$this->outputHeader();
@@ -137,7 +134,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
// $this->ids = array_map( 'intval', $this->ids );
$this->ids = array_unique( array_filter( $this->ids ) );
- if ( $request->getVal( 'action' ) == 'historysubmit' ) {
+ if ( $request->getVal( 'action' ) == 'historysubmit' || $request->getVal( 'action' ) == 'revisiondelete' ) {
// For show/hide form submission from history page
// Since we are access through index.php?title=XXX&action=historysubmit
// getFullTitle() will contain the target title and not our title
@@ -206,12 +203,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
# Show relevant lines from the deletion log
$output->addHTML( "<h2>" . htmlspecialchars( LogPage::logName( 'delete' ) ) . "</h2>\n" );
LogEventsList::showLogExtract( $output, 'delete',
- $this->targetObj->getPrefixedText(), '', array( 'lim' => 25, 'conds' => $qc ) );
+ $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
# Show relevant lines from the suppression log
if( $user->isAllowed( 'suppressionlog' ) ) {
$output->addHTML( "<h2>" . htmlspecialchars( LogPage::logName( 'suppress' ) ) . "</h2>\n" );
LogEventsList::showLogExtract( $output, 'suppress',
- $this->targetObj->getPrefixedText(), '', array( 'lim' => 25, 'conds' => $qc ) );
+ $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
}
}
@@ -228,7 +225,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
array(),
array( 'page' => $this->targetObj->getPrefixedText() )
);
- if ( $this->targetObj->getNamespace() != NS_SPECIAL ) {
+ if ( !$this->targetObj->isSpecialPage() ) {
# Give a link to the page history
$links[] = Linker::linkKnown(
$this->targetObj,
@@ -248,7 +245,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
}
}
# Logs themselves don't have histories or archived revisions
- $this->getOutput()->setSubtitle( '<p>' . $this->getLang()->pipeList( $links ) . '</p>' );
+ $this->getOutput()->addSubtitle( $this->getLanguage()->pipeList( $links ) );
}
}
@@ -278,7 +275,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->getOutput()->addWikiMsg( 'revdelete-no-file' );
return;
}
- if( !$oimage->userCan(File::DELETED_FILE) ) {
+ if( !$oimage->userCan( File::DELETED_FILE, $this->getUser() ) ) {
if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
$this->getOutput()->permissionRequired( 'suppressrevision' );
} else {
@@ -289,15 +286,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
if ( !$this->getUser()->matchEditToken( $this->token, $archiveName ) ) {
$this->getOutput()->addWikiMsg( 'revdelete-show-file-confirm',
$this->targetObj->getText(),
- $this->getLang()->date( $oimage->getTimestamp() ),
- $this->getLang()->time( $oimage->getTimestamp() ) );
+ $this->getLanguage()->date( $oimage->getTimestamp() ),
+ $this->getLanguage()->time( $oimage->getTimestamp() ) );
$this->getOutput()->addHTML(
Xml::openElement( 'form', array(
'method' => 'POST',
'action' => $this->getTitle()->getLocalUrl(
'target=' . urlencode( $oimage->getName() ) .
'&file=' . urlencode( $archiveName ) .
- '&token=' . urlencode( $this->getUser()->editToken( $archiveName ) ) )
+ '&token=' . urlencode( $this->getUser()->getEditToken( $archiveName ) ) )
)
) .
Xml::submitButton( wfMsg( 'revdelete-show-file-submit' ) ) .
@@ -314,12 +311,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->getRequest()->response()->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
$this->getRequest()->response()->header( 'Pragma: no-cache' );
- # Stream the file to the client
- global $IP;
- require_once( "$IP/includes/StreamFile.php" );
$key = $oimage->getStorageKey();
$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
- wfStreamFile( $path );
+ $repo->streamFile( $path );
}
/**
@@ -341,7 +335,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$UserAllowed = true;
if ( $this->typeName == 'logging' ) {
- $this->getOutput()->addWikiMsg( 'logdelete-selected', $this->getLang()->formatNum( count($this->ids) ) );
+ $this->getOutput()->addWikiMsg( 'logdelete-selected', $this->getLanguage()->formatNum( count($this->ids) ) );
} else {
$this->getOutput()->addWikiMsg( 'revdelete-selected',
$this->targetObj->getPrefixedText(), count( $this->ids ) );
@@ -410,7 +404,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
'</td>' .
"</tr>\n" .
Xml::closeElement( 'table' ) .
- Html::hidden( 'wpEditToken', $this->getUser()->editToken() ) .
+ Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ) .
Html::hidden( 'target', $this->targetObj->getPrefixedText() ) .
Html::hidden( 'type', $this->typeName ) .
Html::hidden( 'ids', implode( ',', $this->ids ) ) .
@@ -541,7 +535,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
* Report that the submit operation succeeded
*/
protected function success() {
- $this->getOutput()->setPagetitle( wfMsg( 'actioncomplete' ) );
+ $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
$this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeInfo['success'] );
$this->list->reloadFromMaster();
$this->showForm();
@@ -551,7 +545,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
* Report that the submit operation failed
*/
protected function failure( $status ) {
- $this->getOutput()->setPagetitle( wfMsg( 'actionfailed' ) );
+ $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
$this->getOutput()->addWikiText( $status->getWikiText( $this->typeInfo['failure'] ) );
$this->showForm();
}
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php
index ba9d378a..3fa86875 100644
--- a/includes/specials/SpecialSearch.php
+++ b/includes/specials/SpecialSearch.php
@@ -35,8 +35,9 @@ class SpecialSearch extends SpecialPage {
* string when applicable. Extensions can add new profiles with hooks
* with custom search options just for that profile.
* null|string
- */
+ */
protected $profile;
+ function getProfile() { return $this->profile; }
/// Search engine
protected $searchEngine;
@@ -47,6 +48,27 @@ class SpecialSearch extends SpecialPage {
/// No idea, apparently used by some other classes
protected $mPrefix;
+ /**
+ * @var int
+ */
+ protected $limit, $offset;
+
+ /**
+ * @var array
+ */
+ protected $namespaces;
+ function getNamespaces() { return $this->namespaces; }
+
+ /**
+ * @var bool
+ */
+ protected $searchRedirects;
+
+ /**
+ * @var string
+ */
+ protected $didYouMeanHtml, $fulltext;
+
const NAMESPACES_CURRENT = 'sense';
public function __construct() {
@@ -59,25 +81,26 @@ class SpecialSearch extends SpecialPage {
* @param $par String or null
*/
public function execute( $par ) {
- global $wgRequest, $wgUser, $wgOut;
-
$this->setHeaders();
$this->outputHeader();
- $wgOut->allowClickjacking();
- $wgOut->addModuleStyles( 'mediawiki.special' );
+ $out = $this->getOutput();
+ $out->allowClickjacking();
+ $out->addModuleStyles( 'mediawiki.special' );
// Strip underscores from title parameter; most of the time we'll want
// text form here. But don't strip underscores from actual text params!
$titleParam = str_replace( '_', ' ', $par );
+ $request = $this->getRequest();
+
// Fetch the search term
- $search = str_replace( "\n", " ", $wgRequest->getText( 'search', $titleParam ) );
+ $search = str_replace( "\n", " ", $request->getText( 'search', $titleParam ) );
- $this->load( $wgRequest, $wgUser );
+ $this->load();
- if ( $wgRequest->getVal( 'fulltext' )
- || !is_null( $wgRequest->getVal( 'offset' ) )
- || !is_null( $wgRequest->getVal( 'searchx' ) ) )
+ if ( $request->getVal( 'fulltext' )
+ || !is_null( $request->getVal( 'offset' ) )
+ || !is_null( $request->getVal( 'searchx' ) ) )
{
$this->showResults( $search );
} else {
@@ -87,33 +110,39 @@ class SpecialSearch extends SpecialPage {
/**
* Set up basic search parameters from the request and user settings.
- * Typically you'll pass $wgRequest and $wgUser.
*
- * @param $request WebRequest
- * @param $user User
+ * @see tests/phpunit/includes/specials/SpecialSearchTest.php
*/
- public function load( &$request, &$user ) {
+ public function load() {
+ $request = $this->getRequest();
list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, 'searchlimit' );
$this->mPrefix = $request->getVal( 'prefix', '' );
+ $user = $this->getUser();
# Extract manually requested namespaces
$nslist = $this->powerSearch( $request );
- $this->profile = $profile = $request->getVal( 'profile', null );
+ if ( !count( $nslist ) ) {
+ # Fallback to user preference
+ $nslist = SearchEngine::userNamespaces( $user );
+ }
+
+ $profile = null;
+ if ( !count( $nslist ) ) {
+ $profile = 'default';
+ }
+
+ $profile = $request->getVal( 'profile', $profile );
$profiles = $this->getSearchProfiles();
- if ( $profile === null) {
+ if ( $profile === null ) {
// BC with old request format
- $this->profile = 'advanced';
- if ( count( $nslist ) ) {
- foreach( $profiles as $key => $data ) {
- if ( $nslist === $data['namespaces'] && $key !== 'advanced') {
- $this->profile = $key;
- }
+ $profile = 'advanced';
+ foreach( $profiles as $key => $data ) {
+ if ( $nslist === $data['namespaces'] && $key !== 'advanced') {
+ $profile = $key;
}
- $this->namespaces = $nslist;
- } else {
- $this->namespaces = SearchEngine::userNamespaces( $user );
}
+ $this->namespaces = $nslist;
} elseif ( $profile === 'advanced' ) {
$this->namespaces = $nslist;
} else {
@@ -121,7 +150,7 @@ class SpecialSearch extends SpecialPage {
$this->namespaces = $profiles[$profile]['namespaces'];
} else {
// Unknown profile requested
- $this->profile = 'default';
+ $profile = 'default';
$this->namespaces = $profiles['default']['namespaces'];
}
}
@@ -129,9 +158,9 @@ class SpecialSearch extends SpecialPage {
// Redirects defaults to true, but we don't know whether it was ticked of or just missing
$default = $request->getBool( 'profile' ) ? 0 : 1;
$this->searchRedirects = $request->getBool( 'redirs', $default ) ? 1 : 0;
- $this->sk = $this->getSkin();
$this->didYouMeanHtml = ''; # html of did you mean... link
$this->fulltext = $request->getVal('fulltext');
+ $this->profile = $profile;
}
/**
@@ -140,7 +169,6 @@ class SpecialSearch extends SpecialPage {
* @param $term String
*/
public function goResult( $term ) {
- global $wgOut;
$this->setupPage( $term );
# Try to go to page as entered.
$t = Title::newFromText( $term );
@@ -157,7 +185,7 @@ class SpecialSearch extends SpecialPage {
}
if( !is_null( $t ) ) {
- $wgOut->redirect( $t->getFullURL() );
+ $this->getOutput()->redirect( $t->getFullURL() );
return;
}
# No match, generate an edit URL
@@ -169,7 +197,7 @@ class SpecialSearch extends SpecialPage {
# If the feature is enabled, go straight to the edit page
if( $wgGoToEdit ) {
- $wgOut->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
+ $this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
return;
}
}
@@ -180,11 +208,9 @@ class SpecialSearch extends SpecialPage {
* @param $term String
*/
public function showResults( $term ) {
- global $wgOut, $wgDisableTextSearch, $wgContLang, $wgScript;
+ global $wgDisableTextSearch, $wgSearchForwardUrl, $wgContLang, $wgScript;
wfProfileIn( __METHOD__ );
- $sk = $this->getSkin();
-
$search = $this->getSearchEngine();
$search->setLimitOffset( $this->limit, $this->offset );
$search->setNamespaces( $this->namespaces );
@@ -197,25 +223,25 @@ class SpecialSearch extends SpecialPage {
$this->setupPage( $term );
- if( $wgDisableTextSearch ) {
- global $wgSearchForwardUrl;
- if( $wgSearchForwardUrl ) {
+ $out = $this->getOutput();
+
+ if ( $wgDisableTextSearch ) {
+ if ( $wgSearchForwardUrl ) {
$url = str_replace( '$1', urlencode( $term ), $wgSearchForwardUrl );
- $wgOut->redirect( $url );
- wfProfileOut( __METHOD__ );
- return;
+ $out->redirect( $url );
+ } else {
+ $out->addHTML(
+ Xml::openElement( 'fieldset' ) .
+ Xml::element( 'legend', null, wfMsg( 'search-external' ) ) .
+ Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), wfMsg( 'searchdisabled' ) ) .
+ wfMsg( 'googlesearch',
+ htmlspecialchars( $term ),
+ htmlspecialchars( 'UTF-8' ),
+ htmlspecialchars( wfMsg( 'searchbutton' ) )
+ ) .
+ Xml::closeElement( 'fieldset' )
+ );
}
- $wgOut->addHTML(
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsg( 'search-external' ) ) .
- Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), wfMsg( 'searchdisabled' ) ) .
- wfMsg( 'googlesearch',
- htmlspecialchars( $term ),
- htmlspecialchars( 'UTF-8' ),
- htmlspecialchars( wfMsg( 'searchbutton' ) )
- ) .
- Xml::closeElement( 'fieldset' )
- );
wfProfileOut( __METHOD__ );
return;
}
@@ -226,8 +252,9 @@ class SpecialSearch extends SpecialPage {
$rewritten = $search->replacePrefixes($term);
$titleMatches = $search->searchTitle( $rewritten );
- if( !($titleMatches instanceof SearchResultTooMany))
+ if( !( $titleMatches instanceof SearchResultTooMany ) ) {
$textMatches = $search->searchText( $rewritten );
+ }
// did you mean... suggestions
if( $textMatches && $textMatches->hasSuggestion() ) {
@@ -236,8 +263,9 @@ class SpecialSearch extends SpecialPage {
# mirror Go/Search behaviour of original request ..
$didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
- if($this->fulltext != null)
+ if( $this->fulltext != null ) {
$didYouMeanParams['fulltext'] = $this->fulltext;
+ }
$stParams = array_merge(
$didYouMeanParams,
@@ -246,10 +274,11 @@ class SpecialSearch extends SpecialPage {
$suggestionSnippet = $textMatches->getSuggestionSnippet();
- if( $suggestionSnippet == '' )
+ if( $suggestionSnippet == '' ) {
$suggestionSnippet = null;
+ }
- $suggestLink = $sk->linkKnown(
+ $suggestLink = Linker::linkKnown(
$st,
$suggestionSnippet,
array(),
@@ -259,7 +288,7 @@ class SpecialSearch extends SpecialPage {
$this->didYouMeanHtml = '<div class="searchdidyoumean">'.wfMsg('search-suggest',$suggestLink).'</div>';
}
// start rendering the page
- $wgOut->addHtml(
+ $out->addHtml(
Xml::openElement(
'form',
array(
@@ -269,7 +298,7 @@ class SpecialSearch extends SpecialPage {
)
)
);
- $wgOut->addHtml(
+ $out->addHtml(
Xml::openElement( 'table', array( 'id'=>'mw-search-top-table', 'border'=>0, 'cellpadding'=>0, 'cellspacing'=>0 ) ) .
Xml::openElement( 'tr' ) .
Xml::openElement( 'td' ) . "\n" .
@@ -281,16 +310,16 @@ class SpecialSearch extends SpecialPage {
// Sometimes the search engine knows there are too many hits
if( $titleMatches instanceof SearchResultTooMany ) {
- $wgOut->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
+ $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
wfProfileOut( __METHOD__ );
return;
}
$filePrefix = $wgContLang->getFormattedNsText(NS_FILE).':';
if( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
- $wgOut->addHTML( $this->formHeader( $term, 0, 0 ) );
- $wgOut->addHtml( $this->getProfileForm( $this->profile, $term ) );
- $wgOut->addHTML( '</form>' );
+ $out->addHTML( $this->formHeader( $term, 0, 0 ) );
+ $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
+ $out->addHTML( '</form>' );
// Empty query -- straight view of search form
wfProfileOut( __METHOD__ );
return;
@@ -316,33 +345,32 @@ class SpecialSearch extends SpecialPage {
$totalRes += $textMatches->getTotalHits();
// show number of results and current offset
- $wgOut->addHTML( $this->formHeader( $term, $num, $totalRes ) );
- $wgOut->addHtml( $this->getProfileForm( $this->profile, $term ) );
+ $out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
+ $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
- $wgOut->addHtml( Xml::closeElement( 'form' ) );
- $wgOut->addHtml( "<div class='searchresults'>" );
+ $out->addHtml( Xml::closeElement( 'form' ) );
+ $out->addHtml( "<div class='searchresults'>" );
// prev/next links
if( $num || $this->offset ) {
// Show the create link ahead
$this->showCreateLink( $t );
- $prevnext = wfViewPrevNext( $this->offset, $this->limit,
- SpecialPage::getTitleFor( 'Search' ),
- wfArrayToCGI( $this->powerSearchOptions(), array( 'search' => $term ) ),
+ $prevnext = $this->getLanguage()->viewPrevNext( $this->getTitle(), $this->offset, $this->limit,
+ $this->powerSearchOptions() + array( 'search' => $term ),
max( $titleMatchesNum, $textMatchesNum ) < $this->limit
);
- //$wgOut->addHTML( "<p class='mw-search-pager-top'>{$prevnext}</p>\n" );
+ //$out->addHTML( "<p class='mw-search-pager-top'>{$prevnext}</p>\n" );
wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
} else {
wfRunHooks( 'SpecialSearchNoResults', array( $term ) );
}
- $wgOut->parserOptions()->setEditSection( false );
+ $out->parserOptions()->setEditSection( false );
if( $titleMatches ) {
if( $numTitleMatches > 0 ) {
- $wgOut->wrapWikiMsg( "==$1==\n", 'titlematches' );
- $wgOut->addHTML( $this->showMatches( $titleMatches ) );
+ $out->wrapWikiMsg( "==$1==\n", 'titlematches' );
+ $out->addHTML( $this->showMatches( $titleMatches ) );
}
$titleMatches->free();
}
@@ -350,37 +378,38 @@ class SpecialSearch extends SpecialPage {
// output appropriate heading
if( $numTextMatches > 0 && $numTitleMatches > 0 ) {
// if no title matches the heading is redundant
- $wgOut->wrapWikiMsg( "==$1==\n", 'textmatches' );
+ $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
} elseif( $totalRes == 0 ) {
# Don't show the 'no text matches' if we received title matches
- # $wgOut->wrapWikiMsg( "==$1==\n", 'notextmatches' );
+ # $out->wrapWikiMsg( "==$1==\n", 'notextmatches' );
}
// show interwiki results if any
if( $textMatches->hasInterwikiResults() ) {
- $wgOut->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
+ $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
}
// show results
if( $numTextMatches > 0 ) {
- $wgOut->addHTML( $this->showMatches( $textMatches ) );
+ $out->addHTML( $this->showMatches( $textMatches ) );
}
$textMatches->free();
}
if( $num === 0 ) {
- $wgOut->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
+ $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
$this->showCreateLink( $t );
}
- $wgOut->addHtml( "</div>" );
+ $out->addHtml( "</div>" );
if( $num || $this->offset ) {
- $wgOut->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
+ $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
}
wfProfileOut( __METHOD__ );
}
+ /**
+ * @param $t Title
+ */
protected function showCreateLink( $t ) {
- global $wgOut;
-
// show direct page/create link if applicable
// Check DBkey !== '' in case of fragment link only.
@@ -390,7 +419,7 @@ class SpecialSearch extends SpecialPage {
$this->getOutput()->addHtml( '<p></p>' );
return;
}
- $messageName = '';
+
if( $t->isKnown() ) {
$messageName = 'searchmenu-exists';
} elseif( $t->userCan( 'create' ) ) {
@@ -406,24 +435,23 @@ class SpecialSearch extends SpecialPage {
$this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", $params );
} else {
// preserve the paragraph for margins etc...
- $wgOut->addHtml( '<p></p>' );
+ $this->getOutput()->addHtml( '<p></p>' );
}
}
/**
- *
+ * @param $term string
*/
protected function setupPage( $term ) {
- global $wgOut;
-
# Should advanced UI be used?
$this->searchAdvanced = ($this->profile === 'advanced');
+ $out = $this->getOutput();
if( strval( $term ) !== '' ) {
- $wgOut->setPageTitle( wfMsg( 'searchresults') );
- $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsg( 'searchresults-title', $term ) ) );
+ $out->setPageTitle( $this->msg( 'searchresults' ) );
+ $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'searchresults-title', $term )->plain() ) );
}
// add javascript specific to special:search
- $wgOut->addModules( 'mediawiki.special.search' );
+ $out->addModules( 'mediawiki.special.search' );
}
/**
@@ -466,6 +494,8 @@ class SpecialSearch extends SpecialPage {
* Show whole set of results
*
* @param $matches SearchResultSet
+ *
+ * @return string
*/
protected function showMatches( &$matches ) {
global $wgContLang;
@@ -479,8 +509,10 @@ class SpecialSearch extends SpecialPage {
$out .= "\n<!-- {$infoLine} -->\n";
}
$out .= "<ul class='mw-search-results'>\n";
- while( $result = $matches->next() ) {
+ $result = $matches->next();
+ while( $result ) {
$out .= $this->showHit( $result, $terms );
+ $result = $matches->next();
}
$out .= "</ul>\n";
@@ -495,9 +527,10 @@ class SpecialSearch extends SpecialPage {
*
* @param $result SearchResult
* @param $terms Array: terms to highlight
+ *
+ * @return string
*/
protected function showHit( $result, $terms ) {
- global $wgLang;
wfProfileIn( __METHOD__ );
if( $result->isBrokenTitle() ) {
@@ -505,7 +538,6 @@ class SpecialSearch extends SpecialPage {
return "<!-- Broken link in search result -->\n";
}
- $sk = $this->getSkin();
$t = $result->getTitle();
$titleSnippet = $result->getTitleSnippet($terms);
@@ -518,7 +550,7 @@ class SpecialSearch extends SpecialPage {
wfRunHooks( 'ShowSearchHitTitle',
array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
- $link = $this->sk->linkKnown(
+ $link = Linker::linkKnown(
$link_t,
$titleSnippet
);
@@ -526,7 +558,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->userCanRead() ) {
+ if( !$t->userCan( 'read' ) ) {
wfProfileOut( __METHOD__ );
return "<li>{$link}</li>\n";
}
@@ -553,7 +585,7 @@ class SpecialSearch extends SpecialPage {
$redirect = "<span class='searchalttitle'>" .
wfMsg(
'search-redirect',
- $this->sk->linkKnown(
+ Linker::linkKnown(
$redirectTitle,
$redirectText
)
@@ -569,7 +601,7 @@ class SpecialSearch extends SpecialPage {
$section = "<span class='searchalttitle'>" .
wfMsg(
- 'search-section', $this->sk->linkKnown(
+ 'search-section', Linker::linkKnown(
$sectionTitle,
$sectionText
)
@@ -580,13 +612,15 @@ class SpecialSearch extends SpecialPage {
// format text extract
$extract = "<div class='searchresult'>".$result->getTextSnippet($terms)."</div>";
+ $lang = $this->getLanguage();
+
// format score
if( is_null( $result->getScore() ) ) {
// Search engine doesn't report scoring info
$score = '';
} else {
$percent = sprintf( '%2.1f', $result->getScore() * 100 );
- $score = wfMsg( 'search-result-score', $wgLang->formatNum( $percent ) )
+ $score = wfMsg( 'search-result-score', $lang->formatNum( $percent ) )
. ' - ';
}
@@ -597,8 +631,8 @@ class SpecialSearch extends SpecialPage {
$size = wfMsgExt(
'search-result-size',
array( 'parsemag', 'escape' ),
- $wgLang->formatSize( $byteSize ),
- $wgLang->formatNum( $wordCount )
+ $lang->formatSize( $byteSize ),
+ $lang->formatNum( $wordCount )
);
if( $t->getNamespace() == NS_CATEGORY ) {
@@ -606,13 +640,13 @@ class SpecialSearch extends SpecialPage {
$size = wfMsgExt(
'search-result-category-size',
array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $cat->getPageCount() ),
- $wgLang->formatNum( $cat->getSubcatCount() ),
- $wgLang->formatNum( $cat->getFileCount() )
+ $lang->formatNum( $cat->getPageCount() ),
+ $lang->formatNum( $cat->getSubcatCount() ),
+ $lang->formatNum( $cat->getFileCount() )
);
}
- $date = $wgLang->timeanddate( $timestamp );
+ $date = $lang->timeanddate( $timestamp );
// link to related articles if supported
$related = '';
@@ -626,7 +660,7 @@ class SpecialSearch extends SpecialPage {
)
);
- $related = ' -- ' . $sk->linkKnown(
+ $related = ' -- ' . Linker::linkKnown(
$st,
wfMsg('search-relatedarticle'),
array(),
@@ -675,6 +709,8 @@ class SpecialSearch extends SpecialPage {
*
* @param $matches SearchResultSet
* @param $query String
+ *
+ * @return string
*/
protected function showInterwiki( &$matches, $query ) {
global $wgContLang;
@@ -695,9 +731,11 @@ class SpecialSearch extends SpecialPage {
}
$prev = null;
- while( $result = $matches->next() ) {
+ $result = $matches->next();
+ while( $result ) {
$out .= $this->showInterwikiHit( $result, $prev, $terms, $query, $customCaptions );
$prev = $result->getInterwikiPrefix();
+ $result = $matches->next();
}
// TODO: should support paging in a non-confusing way (not sure how though, maybe via ajax)..
$out .= "</ul></div>\n";
@@ -716,6 +754,8 @@ class SpecialSearch extends SpecialPage {
* @param $terms Array
* @param $query String
* @param $customCaptions Array: iw prefix -> caption
+ *
+ * @return string
*/
protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) {
wfProfileIn( __METHOD__ );
@@ -732,7 +772,7 @@ class SpecialSearch extends SpecialPage {
if( $titleSnippet == '' )
$titleSnippet = null;
- $link = $this->sk->linkKnown(
+ $link = Linker::linkKnown(
$t,
$titleSnippet
);
@@ -748,7 +788,7 @@ class SpecialSearch extends SpecialPage {
$redirect = "<span class='searchalttitle'>" .
wfMsg(
'search-redirect',
- $this->sk->linkKnown(
+ Linker::linkKnown(
$redirectTitle,
$redirectText
)
@@ -770,7 +810,7 @@ class SpecialSearch extends SpecialPage {
}
// "more results" link (special page stuff could be localized, but we might not know target lang)
$searchTitle = Title::newFromText($t->getInterwiki().":Special:Search");
- $searchLink = $this->sk->linkKnown(
+ $searchLink = Linker::linkKnown(
$searchTitle,
wfMsg('search-interwiki-more'),
array(),
@@ -788,6 +828,11 @@ class SpecialSearch extends SpecialPage {
return $out;
}
+ /**
+ * @param $profile
+ * @param $term
+ * @return String
+ */
protected function getProfileForm( $profile, $term ) {
// Hidden stuff
$opts = array();
@@ -807,6 +852,7 @@ class SpecialSearch extends SpecialPage {
* Generates the power search box at [[Special:Search]]
*
* @param $term String: search term
+ * @param $opts array
* @return String: HTML form
*/
protected function powerSearchBox( $term, $opts ) {
@@ -900,6 +946,9 @@ class SpecialSearch extends SpecialPage {
Xml::closeElement( 'fieldset' );
}
+ /**
+ * @return array
+ */
protected function getSearchProfiles() {
// Builds list of Search Types (profiles)
$nsAllSet = array_keys( SearchEngine::searchableNamespaces() );
@@ -948,9 +997,13 @@ class SpecialSearch extends SpecialPage {
return $profiles;
}
+ /**
+ * @param $term
+ * @param $resultsShown
+ * @param $totalNum
+ * @return string
+ */
protected function formHeader( $term, $resultsShown, $totalNum ) {
- global $wgLang;
-
$out = Xml::openElement('div', array( 'class' => 'mw-search-formheader' ) );
$bareterm = $term;
@@ -960,6 +1013,7 @@ class SpecialSearch extends SpecialPage {
}
$profiles = $this->getSearchProfiles();
+ $lang = $this->getLanguage();
// Outputs XML for Search Types
$out .= Xml::openElement( 'div', array( 'class' => 'search-types' ) );
@@ -971,7 +1025,7 @@ class SpecialSearch extends SpecialPage {
$profile['parameters']['profile'] = $id;
$tooltipParam = isset( $profile['namespace-messages'] ) ?
- $wgLang->commaList( $profile['namespace-messages'] ) : null;
+ $lang->commaList( $profile['namespace-messages'] ) : null;
$out .= Xml::tags(
'li',
array(
@@ -993,19 +1047,22 @@ class SpecialSearch extends SpecialPage {
if ( $resultsShown > 0 ) {
if ( $totalNum > 0 ){
$top = wfMsgExt( 'showingresultsheader', array( 'parseinline' ),
- $wgLang->formatNum( $this->offset + 1 ),
- $wgLang->formatNum( $this->offset + $resultsShown ),
- $wgLang->formatNum( $totalNum ),
+ $lang->formatNum( $this->offset + 1 ),
+ $lang->formatNum( $this->offset + $resultsShown ),
+ $lang->formatNum( $totalNum ),
wfEscapeWikiText( $term ),
- $wgLang->formatNum( $resultsShown )
+ $lang->formatNum( $resultsShown )
);
} elseif ( $resultsShown >= $this->limit ) {
- $top = wfShowingResults( $this->offset, $this->limit );
+ $top = wfMsgExt( 'showingresults', array( 'parseinline' ),
+ $lang->formatNum( $this->limit ),
+ $lang->formatNum( $this->offset + 1 )
+ );
} else {
$top = wfMsgExt( 'showingresultsnum', array( 'parseinline' ),
- $wgLang->formatNum( $this->limit ),
- $wgLang->formatNum( $this->offset + 1 ),
- $wgLang->formatNum( $resultsShown )
+ $lang->formatNum( $this->limit ),
+ $lang->formatNum( $this->offset + 1 ),
+ $lang->formatNum( $resultsShown )
);
}
$out .= Xml::tags( 'div', array( 'class' => 'results-info' ),
@@ -1019,6 +1076,10 @@ class SpecialSearch extends SpecialPage {
return $out;
}
+ /**
+ * @param $term string
+ * @return string
+ */
protected function shortDialog( $term ) {
$out = Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
$out .= Html::hidden( 'profile', $this->profile ) . "\n";
@@ -1102,6 +1163,8 @@ class SpecialSearch extends SpecialPage {
/**
* @since 1.18
+ *
+ * @return SearchEngine
*/
public function getSearchEngine() {
if ( $this->searchEngine === null ) {
@@ -1115,6 +1178,9 @@ class SpecialSearch extends SpecialPage {
* add more params to links to not lose selection when
* user navigates search results.
* @since 1.18
+ *
+ * @param $key
+ * @param $value
*/
public function setExtraParam( $key, $value ) {
$this->extraParams[$key] = $value;
diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php
index 3b785018..c176f913 100644
--- a/includes/specials/SpecialShortpages.php
+++ b/includes/specials/SpecialShortpages.php
@@ -33,14 +33,6 @@ class ShortPagesPage extends QueryPage {
parent::__construct( $name );
}
- // inexpensive?
- /**
- * This query is indexed as of 1.5
- */
- function isExpensive() {
- return true;
- }
-
function isSyndicated() {
return false;
}
@@ -51,9 +43,9 @@ class ShortPagesPage extends QueryPage {
'fields' => array ( 'page_namespace AS namespace',
'page_title AS title',
'page_len AS value' ),
- 'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces(),
+ 'conds' => array ( 'page_namespace' => NS_MAIN,
'page_is_redirect' => 0 ),
- 'options' => array ( 'USE INDEX' => 'page_len' )
+ 'options' => array ( 'USE INDEX' => 'page_redirect_namespace_len' )
);
}
@@ -86,23 +78,22 @@ class ShortPagesPage extends QueryPage {
}
function formatResult( $skin, $result ) {
- global $wgLang;
- $dm = $wgLang->getDirMark();
+ $dm = $this->getLanguage()->getDirMark();
$title = Title::makeTitle( $result->namespace, $result->title );
if ( !$title ) {
return '<!-- Invalid title ' . htmlspecialchars( "{$result->namespace}:{$result->title}" ). '-->';
}
- $hlink = $skin->linkKnown(
+ $hlink = Linker::linkKnown(
$title,
wfMsgHtml( 'hist' ),
array(),
array( 'action' => 'history' )
);
$plink = $this->isCached()
- ? $skin->link( $title )
- : $skin->linkKnown( $title );
- $size = wfMessage( 'nbytes', $wgLang->formatNum( $result->value ) )->escaped();
+ ? Linker::link( $title )
+ : Linker::linkKnown( $title );
+ $size = $this->msg( 'nbytes' )->numParams( $result->value )->escaped();
return $title->exists()
? "({$hlink}) {$dm}{$plink} {$dm}[{$size}]"
diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php
index 13bc4c2b..e973ddc8 100644
--- a/includes/specials/SpecialSpecialpages.php
+++ b/includes/specials/SpecialSpecialpages.php
@@ -51,7 +51,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
private function getPageGroups() {
global $wgSortSpecialPages;
- $pages = SpecialPageFactory::getUsablePages();
+ $pages = SpecialPageFactory::getUsablePages( $this->getUser() );
if( !count( $pages ) ) {
# Yeah, that was pointless. Thanks for coming.
diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php
index 5def4da5..b9c092b6 100644
--- a/includes/specials/SpecialStatistics.php
+++ b/includes/specials/SpecialStatistics.php
@@ -138,15 +138,17 @@ class SpecialStatistics extends SpecialPage {
return Xml::openElement( 'tr' ) .
Xml::tags( 'th', array( 'colspan' => '2' ), wfMsgExt( 'statistics-header-pages', array( 'parseinline' ) ) ) .
Xml::closeElement( 'tr' ) .
- $this->formatRow( wfMsgExt( 'statistics-articles', array( 'parseinline' ) ),
- $this->getLang()->formatNum( $this->good ),
+ $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'Allpages' ),
+ wfMsgExt( 'statistics-articles', array( 'parseinline' ) ) ),
+ $this->getLanguage()->formatNum( $this->good ),
array( 'class' => 'mw-statistics-articles' ) ) .
$this->formatRow( wfMsgExt( 'statistics-pages', array( 'parseinline' ) ),
- $this->getLang()->formatNum( $this->total ),
+ $this->getLanguage()->formatNum( $this->total ),
array( 'class' => 'mw-statistics-pages' ),
'statistics-pages-desc' ) .
- $this->formatRow( wfMsgExt( 'statistics-files', array( 'parseinline' ) ),
- $this->getLang()->formatNum( $this->images ),
+ $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'Listfiles' ),
+ wfMsgExt( 'statistics-files', array( 'parseinline' ) ) ),
+ $this->getLanguage()->formatNum( $this->images ),
array( 'class' => 'mw-statistics-files' ) );
}
private function getEditStats() {
@@ -154,10 +156,10 @@ class SpecialStatistics extends SpecialPage {
Xml::tags( 'th', array( 'colspan' => '2' ), wfMsgExt( 'statistics-header-edits', array( 'parseinline' ) ) ) .
Xml::closeElement( 'tr' ) .
$this->formatRow( wfMsgExt( 'statistics-edits', array( 'parseinline' ) ),
- $this->getLang()->formatNum( $this->edits ),
+ $this->getLanguage()->formatNum( $this->edits ),
array( 'class' => 'mw-statistics-edits' ) ) .
$this->formatRow( wfMsgExt( 'statistics-edits-average', array( 'parseinline' ) ),
- $this->getLang()->formatNum( sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 ) ),
+ $this->getLanguage()->formatNum( sprintf( '%.2f', $this->total ? $this->edits / $this->total : 0 ) ),
array( 'class' => 'mw-statistics-edits-average' ) );
}
@@ -167,17 +169,17 @@ class SpecialStatistics extends SpecialPage {
Xml::tags( 'th', array( 'colspan' => '2' ), wfMsgExt( 'statistics-header-users', array( 'parseinline' ) ) ) .
Xml::closeElement( 'tr' ) .
$this->formatRow( wfMsgExt( 'statistics-users', array( 'parseinline' ) ),
- $this->getLang()->formatNum( $this->users ),
+ $this->getLanguage()->formatNum( $this->users ),
array( 'class' => 'mw-statistics-users' ) ) .
$this->formatRow( wfMsgExt( 'statistics-users-active', array( 'parseinline' ) ) . ' ' .
Linker::linkKnown(
SpecialPage::getTitleFor( 'Activeusers' ),
wfMsgHtml( 'listgrouprights-members' )
),
- $this->getLang()->formatNum( $this->activeUsers ),
+ $this->getLanguage()->formatNum( $this->activeUsers ),
array( 'class' => 'mw-statistics-users-active' ),
'statistics-users-active-desc',
- $this->getLang()->formatNum( $wgActiveUserDays ) );
+ $this->getLanguage()->formatNum( $wgActiveUserDays ) );
}
private function getGroupStats() {
@@ -219,7 +221,7 @@ class SpecialStatistics extends SpecialPage {
$classZero = ' statistics-group-zero';
}
$text .= $this->formatRow( $grouppage . ' ' . $grouplink,
- $this->getLang()->formatNum( $countUsers ),
+ $this->getLanguage()->formatNum( $countUsers ),
array( 'class' => 'statistics-group-' . Sanitizer::escapeClass( $group ) . $classZero ) );
}
return $text;
@@ -230,10 +232,10 @@ class SpecialStatistics extends SpecialPage {
Xml::tags( 'th', array( 'colspan' => '2' ), wfMsgExt( 'statistics-header-views', array( 'parseinline' ) ) ) .
Xml::closeElement( 'tr' ) .
$this->formatRow( wfMsgExt( 'statistics-views-total', array( 'parseinline' ) ),
- $this->getLang()->formatNum( $this->views ),
+ $this->getLanguage()->formatNum( $this->views ),
array ( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
$this->formatRow( wfMsgExt( 'statistics-views-peredit', array( 'parseinline' ) ),
- $this->getLang()->formatNum( sprintf( '%.2f', $this->edits ?
+ $this->getLanguage()->formatNum( sprintf( '%.2f', $this->edits ?
$this->views / $this->edits : 0 ) ),
array ( 'class' => 'mw-statistics-views-peredit' ) );
}
@@ -266,7 +268,7 @@ class SpecialStatistics extends SpecialPage {
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
if( $title instanceof Title ) {
$text .= $this->formatRow( Linker::link( $title ),
- $this->getLang()->formatNum( $row->page_counter ) );
+ $this->getLanguage()->formatNum( $row->page_counter ) );
}
}
@@ -287,7 +289,7 @@ class SpecialStatistics extends SpecialPage {
$name = htmlspecialchars( $name );
$number = htmlspecialchars( $number );
- $return .= $this->formatRow( $name, $this->getLang()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+ $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
}
return $return;
diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php
index 66a89e94..adfc7441 100644
--- a/includes/specials/SpecialTags.php
+++ b/includes/specials/SpecialTags.php
@@ -36,10 +36,12 @@ class SpecialTags extends SpecialPage {
}
function execute( $par ) {
- global $wgOut;
+ $this->setHeaders();
+ $this->outputHeader();
- $wgOut->setPageTitle( wfMsg( 'tags-title' ) );
- $wgOut->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'tags-title' ) );
+ $out->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
// Write the headers
$html = Xml::tags( 'tr', null, Xml::tags( 'th', null, wfMsgExt( 'tags-tag', 'parseinline' ) ) .
@@ -59,35 +61,30 @@ class SpecialTags extends SpecialPage {
$html .= $this->doTagRow( $tag, 0 );
}
- $wgOut->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable mw-tags-table' ), $html ) );
+ $out->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable mw-tags-table' ), $html ) );
}
function doTagRow( $tag, $hitcount ) {
- static $sk = null, $doneTags = array();
- if ( !$sk ) {
- $sk = $this->getSkin();
- }
+ static $doneTags = array();
if ( in_array( $tag, $doneTags ) ) {
return '';
}
- global $wgLang;
-
$newRow = '';
$newRow .= Xml::tags( 'td', null, Xml::element( 'tt', null, $tag ) );
$disp = ChangeTags::tagDescription( $tag );
- $disp .= ' (' . $sk->link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), wfMsgHtml( 'tags-edit' ) ) . ')';
+ $disp .= ' (' . Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), wfMsgHtml( 'tags-edit' ) ) . ')';
$newRow .= Xml::tags( 'td', null, $disp );
$msg = wfMessage( "tag-$tag-description" );
$desc = !$msg->exists() ? '' : $msg->parse();
- $desc .= ' (' . $sk->link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), wfMsgHtml( 'tags-edit' ) ) . ')';
+ $desc .= ' (' . Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), wfMsgHtml( 'tags-edit' ) ) . ')';
$newRow .= Xml::tags( 'td', null, $desc );
- $hitcount = wfMsgExt( 'tags-hitcount', array( 'parsemag' ), $wgLang->formatNum( $hitcount ) );
- $hitcount = $sk->link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcount, array(), array( 'tagfilter' => $tag ) );
+ $hitcount = wfMsgExt( 'tags-hitcount', array( 'parsemag' ), $this->getLanguage()->formatNum( $hitcount ) );
+ $hitcount = Linker::link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcount, array(), array( 'tagfilter' => $tag ) );
$newRow .= Xml::tags( 'td', null, $hitcount );
$doneTags[] = $tag;
diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php
index 521c1775..47944309 100644
--- a/includes/specials/SpecialUnblock.php
+++ b/includes/specials/SpecialUnblock.php
@@ -35,35 +35,22 @@ class SpecialUnblock extends SpecialPage {
}
public function execute( $par ){
- global $wgUser, $wgOut, $wgRequest;
+ $this->checkPermissions();
+ $this->checkReadOnly();
- # Check permissions
- if( !$this->userCanExecute( $wgUser ) ) {
- $this->displayRestrictionError();
- return;
- }
-
- # Check for database lock
- if( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
-
- list( $this->target, $this->type ) = SpecialBlock::getTargetAndType( $par, $wgRequest );
+ list( $this->target, $this->type ) = SpecialBlock::getTargetAndType( $par, $this->getRequest() );
$this->block = Block::newFromTarget( $this->target );
- # bug 15810: blocked admins should have limited access here. This won't allow sysops
- # to remove autoblocks on themselves, but they should have ipblock-exempt anyway
- $status = SpecialBlock::checkUnblockSelf( $this->target );
- if ( $status !== true ) {
- throw new ErrorPageError( 'badaccess', $status );
- }
+ $this->setHeaders();
+ $this->outputHeader();
- $wgOut->setPageTitle( wfMsg( 'unblockip' ) );
- $wgOut->addModules( 'mediawiki.special' );
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'unblockip' ) );
+ $out->addModules( 'mediawiki.special' );
$form = new HTMLForm( $this->getFields(), $this->getContext() );
$form->setWrapperLegend( wfMsg( 'unblockip' ) );
- $form->setSubmitCallback( array( __CLASS__, 'processUnblock' ) );
+ $form->setSubmitCallback( array( __CLASS__, 'processUIUnblock' ) );
$form->setSubmitText( wfMsg( 'ipusubmit' ) );
$form->addPreText( wfMsgExt( 'unblockiptext', 'parse' ) );
@@ -71,14 +58,14 @@ class SpecialUnblock extends SpecialPage {
switch( $this->type ){
case Block::TYPE_USER:
case Block::TYPE_IP:
- $wgOut->addWikiMsg( 'unblocked', $this->target );
+ $out->addWikiMsg( 'unblocked', $this->target );
break;
case Block::TYPE_RANGE:
- $wgOut->addWikiMsg( 'unblocked-range', $this->target );
+ $out->addWikiMsg( 'unblocked-range', $this->target );
break;
case Block::TYPE_ID:
case Block::TYPE_AUTO:
- $wgOut->addWikiMsg( 'unblocked-id', $this->target );
+ $out->addWikiMsg( 'unblocked-id', $this->target );
break;
}
}
@@ -120,8 +107,7 @@ class SpecialUnblock extends SpecialPage {
switch( $type ){
case Block::TYPE_USER:
case Block::TYPE_IP:
- $skin = $this->getSkin();
- $fields['Name']['default'] = $skin->link(
+ $fields['Name']['default'] = Linker::link(
$target->getUserPage(),
$target->getName()
);
@@ -149,12 +135,21 @@ class SpecialUnblock extends SpecialPage {
}
/**
+ * Submit callback for an HTMLForm object
+ */
+ public static function processUIUnblock( array $data, HTMLForm $form ) {
+ return self::processUnblock( $data, $form->getContext() );
+ }
+
+ /**
* Process the form
+ *
+ * @param $data Array
+ * @param $context IContextSource
* @return Array( Array(message key, parameters) ) on failure, True on success
*/
- public static function processUnblock( array $data ){
- global $wgUser;
-
+ public static function processUnblock( array $data, IContextSource $context ){
+ $performer = $context->getUser();
$target = $data['Target'];
$block = Block::newFromTarget( $data['Target'] );
@@ -162,6 +157,14 @@ class SpecialUnblock extends SpecialPage {
return array( array( 'ipb_cant_unblock', $target ) );
}
+ # bug 15810: blocked admins should have limited access here. This
+ # won't allow sysops to remove autoblocks on themselves, but they
+ # should have ipblock-exempt anyway
+ $status = SpecialBlock::checkUnblockSelf( $target, $performer );
+ if ( $status !== true ) {
+ throw new ErrorPageError( 'badaccess', $status );
+ }
+
# 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 );
@@ -172,7 +175,7 @@ class SpecialUnblock extends SpecialPage {
# If the name was hidden and the blocking user cannot hide
# names, then don't allow any block removals...
- if( !$wgUser->isAllowed( 'hideuser' ) && $block->mHideName ) {
+ if( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
return array( 'unblock-hideuser' );
}
diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php
index d4636e74..5d8b17b7 100644
--- a/includes/specials/SpecialUndelete.php
+++ b/includes/specials/SpecialUndelete.php
@@ -116,7 +116,7 @@ class PageArchive {
$res = $dbr->select( 'archive',
array(
'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
- 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id'
+ 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1'
),
array( 'ar_namespace' => $this->title->getNamespace(),
'ar_title' => $this->title->getDBkey() ),
@@ -187,10 +187,12 @@ class PageArchive {
'ar_flags',
'ar_text_id',
'ar_deleted',
- 'ar_len' ),
+ 'ar_len',
+ 'ar_sha1',
+ ),
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 ) {
return Revision::newFromArchiveRow( $row, array( 'page' => $this->title->getArticleId() ) );
@@ -398,18 +400,17 @@ class PageArchive {
$dbw = wfGetDB( DB_MASTER );
# Does this page already exist? We'll have to update it...
- $article = new Article( $this->title );
+ $article = WikiPage::factory( $this->title );
# Load latest data for the current page (bug 31179)
$article->loadPageData( 'fromdbmaster' );
$oldcountable = $article->isCountable();
- $options = 'FOR UPDATE'; // lock page
$page = $dbw->selectRow( 'page',
array( 'page_id', 'page_latest' ),
array( 'page_namespace' => $this->title->getNamespace(),
'page_title' => $this->title->getDBkey() ),
__METHOD__,
- $options
+ array( 'FOR UPDATE' ) // lock page
);
if( $page ) {
$makepage = false;
@@ -460,7 +461,8 @@ class PageArchive {
'ar_text_id',
'ar_deleted',
'ar_page_id',
- 'ar_len' ),
+ 'ar_len',
+ 'ar_sha1' ),
/* WHERE */ array(
'ar_namespace' => $this->title->getNamespace(),
'ar_title' => $this->title->getDBkey(),
@@ -580,12 +582,20 @@ class SpecialUndelete extends SpecialPage {
parent::__construct( 'Undelete', 'deletedhistory' );
}
- function loadRequest() {
+ function loadRequest( $par ) {
$request = $this->getRequest();
$user = $this->getUser();
$this->mAction = $request->getVal( 'action' );
- $this->mTarget = $request->getVal( 'target' );
+ if ( $par !== null && $par !== '' ) {
+ $this->mTarget = $par;
+ } 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 ) : '';
@@ -597,6 +607,7 @@ class SpecialUndelete extends SpecialPage {
$this->mInvert = $request->getCheck( 'invert' ) && $posted;
$this->mPreview = $request->getCheck( 'preview' ) && $posted;
$this->mDiff = $request->getCheck( 'diff' );
+ $this->mDiffOnly = $request->getBool( 'diffonly', $this->getUser()->getOption( 'diffonly' ) );
$this->mComment = $request->getText( 'wpComment' );
$this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && $user->isAllowed( 'suppressrevision' );
$this->mToken = $request->getVal( 'token' );
@@ -607,6 +618,7 @@ class SpecialUndelete extends SpecialPage {
} elseif ( $user->isAllowed( 'deletedtext' ) ) {
$this->mAllowed = false; // user cannot restore
$this->mCanView = true; // user can view content
+ $this->mRestore = false;
} else { // user can only view the list of revisions
$this->mAllowed = false;
$this->mCanView = false;
@@ -633,104 +645,84 @@ class SpecialUndelete extends SpecialPage {
}
function execute( $par ) {
+ $this->checkPermissions();
+ $user = $this->getUser();
+
$this->setHeaders();
- if ( !$this->userCanExecute( $this->getUser() ) ) {
- $this->displayRestrictionError();
- return;
- }
$this->outputHeader();
- $this->loadRequest();
+ $this->loadRequest( $par );
$out = $this->getOutput();
- if ( $this->mAllowed ) {
- $out->setPageTitle( wfMsg( 'undeletepage' ) );
- } else {
- $out->setPageTitle( wfMsg( 'viewdeletedpage' ) );
- }
+ if ( is_null( $this->mTargetObj ) ) {
+ $out->addWikiMsg( 'undelete-header' );
- if( $par != '' ) {
- $this->mTarget = $par;
- }
- if ( $this->mTarget !== '' ) {
- $this->mTargetObj = Title::newFromURL( $this->mTarget );
- $this->getSkin()->setRelevantTitle( $this->mTargetObj );
- } else {
- $this->mTargetObj = null;
- }
-
- if( is_null( $this->mTargetObj ) ) {
# Not all users can just browse every deleted page from the list
- if( $this->getUser()->isAllowed( 'browsearchive' ) ) {
+ if ( $user->isAllowed( 'browsearchive' ) ) {
$this->showSearchForm();
-
- # List undeletable articles
- if( $this->mSearchPrefix ) {
- $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
- $this->showList( $result );
- }
- } else {
- $out->addWikiMsg( 'undelete-header' );
}
return;
}
- if( $this->mTimestamp !== '' ) {
- return $this->showRevision( $this->mTimestamp );
+
+ if ( $this->mAllowed ) {
+ $out->setPageTitle( $this->msg( 'undeletepage' ) );
+ } else {
+ $out->setPageTitle( $this->msg( 'viewdeletedpage' ) );
}
- if( $this->mFilename !== null ) {
+
+ $this->getSkin()->setRelevantTitle( $this->mTargetObj );
+
+ if ( $this->mTimestamp !== '' ) {
+ $this->showRevision( $this->mTimestamp );
+ } elseif ( $this->mFilename !== null ) {
$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 );
- return;
- } elseif( !$file->userCan( File::DELETED_FILE ) ) {
+ } elseif ( !$file->userCan( File::DELETED_FILE, $user ) ) {
if( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
- $out->permissionRequired( 'suppressrevision' );
+ throw new PermissionsError( 'suppressrevision' );
} else {
- $out->permissionRequired( 'deletedtext' );
+ throw new PermissionsError( 'deletedtext' );
}
- return false;
- } elseif ( !$this->getUser()->matchEditToken( $this->mToken, $this->mFilename ) ) {
+ } elseif ( !$user->matchEditToken( $this->mToken, $this->mFilename ) ) {
$this->showFileConfirmationForm( $this->mFilename );
- return false;
} else {
- return $this->showFile( $this->mFilename );
- }
- }
- if( $this->mRestore && $this->mAction == 'submit' ) {
- global $wgUploadMaintenance;
- if( $wgUploadMaintenance && $this->mTargetObj && $this->mTargetObj->getNamespace() == NS_FILE ) {
- $out->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n", array( 'filedelete-maintenance' ) );
- return;
+ $this->showFile( $this->mFilename );
}
- return $this->undelete();
- }
- if( $this->mInvert && $this->mAction == 'submit' ) {
- return $this->showHistory();
+ } elseif ( $this->mRestore && $this->mAction == 'submit' ) {
+ $this->undelete();
+ } else {
+ $this->showHistory();
}
- return $this->showHistory();
}
function showSearchForm() {
global $wgScript;
- $this->getOutput()->addWikiMsg( 'undelete-header' );
-
- $this->getOutput()->addHTML(
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'undelete-search-title' ) );
+ $out->addHTML(
Xml::openElement( 'form', array(
'method' => 'get',
'action' => $wgScript ) ) .
- Xml::fieldset( wfMsg( 'undelete-search-box' ) ) .
+ Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
Html::hidden( 'title',
$this->getTitle()->getPrefixedDbKey() ) .
- Xml::inputLabel( wfMsg( 'undelete-search-prefix' ),
+ Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
'prefix', 'prefix', 20,
$this->mSearchPrefix ) . ' ' .
- Xml::submitButton( wfMsg( 'undelete-search-submit' ) ) .
+ Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' )
);
+
+ # List undeletable articles
+ if( $this->mSearchPrefix ) {
+ $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
+ $this->showList( $result );
+ }
}
/**
@@ -747,7 +739,7 @@ class SpecialUndelete extends SpecialPage {
return;
}
- $out->addWikiMsg( 'undeletepagetext', $this->getLang()->formatNum( $result->numRows() ) );
+ $out->addWikiMsg( 'undeletepagetext', $this->getLanguage()->formatNum( $result->numRows() ) );
$undelete = $this->getTitle();
$out->addHTML( "<ul>\n" );
@@ -759,9 +751,7 @@ class SpecialUndelete extends SpecialPage {
array(),
array( 'target' => $title->getPrefixedText() )
);
- $revs = wfMsgExt( 'undeleterevisions',
- array( 'parseinline' ),
- $this->getLang()->formatNum( $row->count ) );
+ $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
$out->addHTML( "<li>{$link} ({$revs})</li>\n" );
}
$result->free();
@@ -771,8 +761,6 @@ class SpecialUndelete extends SpecialPage {
}
private function showRevision( $timestamp ) {
- $out = $this->getOutput();
-
if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
return 0;
}
@@ -781,13 +769,16 @@ class SpecialUndelete extends SpecialPage {
wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) );
$rev = $archive->getRevision( $timestamp );
+ $out = $this->getOutput();
+ $user = $this->getUser();
+
if( !$rev ) {
$out->addWikiMsg( 'undeleterevision-missing' );
return;
}
if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
- if( !$rev->userCan( 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 {
@@ -797,13 +788,11 @@ class SpecialUndelete extends SpecialPage {
}
}
- $out->setPageTitle( wfMsg( 'undeletepage' ) );
-
if( $this->mDiff ) {
$previousRev = $archive->getPreviousRevision( $timestamp );
if( $previousRev ) {
$this->showDiff( $previousRev, $rev );
- if( $this->getUser()->getOption( 'diffonly' ) ) {
+ if( $this->mDiffOnly ) {
return;
} else {
$out->addHTML( '<hr />' );
@@ -818,12 +807,14 @@ class SpecialUndelete extends SpecialPage {
htmlspecialchars( $this->mTargetObj->getPrefixedText() )
);
+ $lang = $this->getLanguage();
+
// date and time are separate parameters to facilitate localisation.
// $time is kept for backward compat reasons.
- $time = $this->getLang()->timeAndDate( $timestamp, true );
- $d = $this->getLang()->date( $timestamp, true );
- $t = $this->getLang()->time( $timestamp, true );
- $user = Linker::revUserTools( $rev );
+ $time = $lang->userTimeAndDate( $timestamp, $user );
+ $d = $lang->userDate( $timestamp, $user );
+ $t = $lang->userTime( $timestamp, $user );
+ $userLink = Linker::revUserTools( $rev );
if( $this->mPreview ) {
$openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
@@ -834,14 +825,14 @@ class SpecialUndelete extends SpecialPage {
// Revision delete links
if ( !$this->mDiff ) {
- $revdel = $this->revDeleteLink( $rev );
+ $revdel = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
if ( $revdel ) {
- $out->addHTML( $revdel );
+ $out->addHTML( "$revdel " );
}
}
- $out->addHTML( wfMessage( 'undelete-revision' )->rawParams( $link )->params(
- $time )->rawParams( $user )->params( $d, $t )->parse() . '</div>' );
+ $out->addHTML( $this->msg( 'undelete-revision' )->rawParams( $link )->params(
+ $time )->rawParams( $userLink )->params( $d, $t )->parse() . '</div>' );
wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) );
if( $this->mPreview ) {
@@ -849,15 +840,15 @@ class SpecialUndelete extends SpecialPage {
$popts = $out->parserOptions();
$popts->setEditSection( false );
$out->parserOptions( $popts );
- $out->addWikiTextTitleTidy( $rev->getText( Revision::FOR_THIS_USER ), $this->mTargetObj, true );
+ $out->addWikiTextTitleTidy( $rev->getText( Revision::FOR_THIS_USER, $user ), $this->mTargetObj, true );
}
$out->addHTML(
Xml::element( 'textarea', array(
'readonly' => 'readonly',
- 'cols' => intval( $this->getUser()->getOption( 'cols' ) ),
- 'rows' => intval( $this->getUser()->getOption( 'rows' ) ) ),
- $rev->getText( Revision::FOR_THIS_USER ) . "\n" ) .
+ 'cols' => intval( $user->getOption( 'cols' ) ),
+ 'rows' => intval( $user->getOption( 'rows' ) ) ),
+ $rev->getText( Revision::FOR_THIS_USER, $user ) . "\n" ) .
Xml::openElement( 'div' ) .
Xml::openElement( 'form', array(
'method' => 'post',
@@ -873,62 +864,20 @@ class SpecialUndelete extends SpecialPage {
Xml::element( 'input', array(
'type' => 'hidden',
'name' => 'wpEditToken',
- 'value' => $this->getUser()->editToken() ) ) .
+ 'value' => $user->getEditToken() ) ) .
Xml::element( 'input', array(
'type' => 'submit',
'name' => 'preview',
- 'value' => wfMsg( 'showpreview' ) ) ) .
+ 'value' => $this->msg( 'showpreview' )->text() ) ) .
Xml::element( 'input', array(
'name' => 'diff',
'type' => 'submit',
- 'value' => wfMsg( 'showdiff' ) ) ) .
+ 'value' => $this->msg( 'showdiff' )->text() ) ) .
Xml::closeElement( 'form' ) .
Xml::closeElement( 'div' ) );
}
/**
- * Get a revision-deletion link, or disabled link, or nothing, depending
- * on user permissions & the settings on the revision.
- *
- * Will use forward-compatible revision ID in the Special:RevDelete link
- * if possible, otherwise the timestamp-based ID which may break after
- * undeletion.
- *
- * @param Revision $rev
- * @return string HTML fragment
- */
- function revDeleteLink( $rev ) {
- $canHide = $this->getUser()->isAllowed( 'deleterevision' );
- if( $canHide || ( $rev->getVisibility() && $this->getUser()->isAllowed( 'deletedhistory' ) ) ) {
- if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
- $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
- } else {
- if ( $rev->getId() ) {
- // RevDelete links using revision ID are stable across
- // page deletion and undeletion; use when possible.
- $query = array(
- 'type' => 'revision',
- 'target' => $this->mTargetObj->getPrefixedDBkey(),
- 'ids' => $rev->getId()
- );
- } else {
- // Older deleted entries didn't save a revision ID.
- // We have to refer to these by timestamp, ick!
- $query = array(
- 'type' => 'archive',
- 'target' => $this->mTargetObj->getPrefixedDBkey(),
- 'ids' => $rev->getTimestamp()
- );
- }
- return Linker::revDeleteLink( $query,
- $rev->isDeleted( File::DELETED_RESTRICTED ), $canHide );
- }
- } else {
- return '';
- }
- }
-
- /**
* Build a diff display between this and the previous either deleted
* or non-deleted edit.
*
@@ -937,7 +886,7 @@ class SpecialUndelete extends SpecialPage {
* @return String: HTML
*/
function showDiff( $previousRev, $currentRev ) {
- $diffEngine = new DifferenceEngine( $previousRev->getTitle() );
+ $diffEngine = new DifferenceEngine( $this->getContext() );
$diffEngine->showDiffStyle();
$this->getOutput()->addHTML(
"<div>" .
@@ -981,18 +930,20 @@ class SpecialUndelete extends SpecialPage {
$targetQuery = array( 'oldid' => $rev->getId() );
}
// Add show/hide deletion links if available
- $del = $this->revDeleteLink( $rev );
+ $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,
- wfMsgExt(
+ $this->msg(
'revisionasof',
- array( 'escape' ),
- $this->getLang()->timeanddate( $rev->getTimestamp(), true ),
- $this->getLang()->date( $rev->getTimestamp(), true ),
- $this->getLang()->time( $rev->getTimestamp(), true )
- ),
+ $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
+ $lang->userDate( $rev->getTimestamp(), $user ),
+ $lang->userTime( $rev->getTimestamp(), $user )
+ )->escaped(),
array(),
$targetQuery
) .
@@ -1001,7 +952,7 @@ class SpecialUndelete extends SpecialPage {
Linker::revUserTools( $rev ) . '<br />' .
'</div>' .
'<div id="mw-diff-'.$prefix.'title3">' .
- Linker::revComment( $rev ) . $del . '<br />' .
+ Linker::revComment( $rev ) . $rdel . '<br />' .
'</div>';
}
@@ -1009,21 +960,24 @@ class SpecialUndelete extends SpecialPage {
* Show a form confirming whether a tokenless user really wants to see a file
*/
private function showFileConfirmationForm( $key ) {
+ $out = $this->getOutput();
+ $lang = $this->getLanguage();
+ $user = $this->getUser();
$file = new ArchivedFile( $this->mTargetObj, '', $this->mFilename );
- $this->getOutput()->addWikiMsg( 'undelete-show-file-confirm',
+ $out->addWikiMsg( 'undelete-show-file-confirm',
$this->mTargetObj->getText(),
- $this->getLang()->date( $file->getTimestamp() ),
- $this->getLang()->time( $file->getTimestamp() ) );
- $this->getOutput()->addHTML(
+ $lang->userDate( $file->getTimestamp(), $user ),
+ $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( $this->getUser()->editToken( $key ) ) )
+ '&token=' . urlencode( $user->getEditToken( $key ) ) )
)
) .
- Xml::submitButton( wfMsg( 'undelete-show-file-submit' ) ) .
+ Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
'</form>'
);
}
@@ -1043,20 +997,15 @@ class SpecialUndelete extends SpecialPage {
$response->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
$response->header( 'Pragma: no-cache' );
- global $IP;
- require_once( "$IP/includes/StreamFile.php" );
$repo = RepoGroup::singleton()->getLocalRepo();
$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
- wfStreamFile( $path );
+ $repo->streamFile( $path );
}
private function showHistory() {
$out = $this->getOutput();
if( $this->mAllowed ) {
$out->addModules( 'mediawiki.special.undelete' );
- $out->setPageTitle( wfMsg( 'undeletepage' ) );
- } else {
- $out->setPageTitle( wfMsg( 'viewdeletedpage' ) );
}
$out->wrapWikiMsg(
"<div class='mw-undelete-pagetitle'>\n$1\n</div>\n",
@@ -1117,11 +1066,11 @@ class SpecialUndelete extends SpecialPage {
# Show relevant lines from the deletion log:
$out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'delete' ) ) . "\n" );
- LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj->getPrefixedText() );
+ LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
# Show relevant lines from the suppression log:
if( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
$out->addHTML( Xml::element( 'h2', null, LogPage::logName( 'suppress' ) ) . "\n" );
- LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj->getPrefixedText() );
+ LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
}
if( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
@@ -1132,24 +1081,24 @@ class SpecialUndelete extends SpecialPage {
"<tr>
<td>&#160;</td>
<td class='mw-input'>" .
- Xml::checkLabel( wfMsg( 'revdelete-unsuppress' ), '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( wfMsg( 'undelete-fieldset-title' ) ) .
+ Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
"<tr>
<td colspan='2' class='mw-undelete-extrahelp'>" .
- wfMsgExt( 'undeleteextrahelp', 'parse' ) .
+ $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
"</td>
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( wfMsg( 'undeletecomment' ), 'wpComment' ) .
+ Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
"</td>
<td class='mw-input'>" .
Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
@@ -1158,8 +1107,8 @@ class SpecialUndelete extends SpecialPage {
<tr>
<td>&#160;</td>
<td class='mw-submit'>" .
- Xml::submitButton( wfMsg( 'undeletebtn' ), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
- Xml::submitButton( wfMsg( 'undeleteinvert' ), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
+ 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 .
@@ -1169,7 +1118,7 @@ class SpecialUndelete extends SpecialPage {
$out->addHTML( $table );
}
- $out->addHTML( Xml::element( 'h2', null, wfMsg( 'history' ) ) . "\n" );
+ $out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" );
if( $haveRevisions ) {
# The page's stored (deleted) history:
@@ -1188,7 +1137,7 @@ class SpecialUndelete extends SpecialPage {
}
if( $haveFiles ) {
- $out->addHTML( Xml::element( 'h2', null, wfMsg( 'filehist' ) ) . "\n" );
+ $out->addHTML( Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n" );
$out->addHTML( '<ul>' );
foreach ( $files as $row ) {
$out->addHTML( $this->formatFileRow( $row ) );
@@ -1200,7 +1149,7 @@ class SpecialUndelete extends SpecialPage {
if ( $this->mAllowed ) {
# Slip in the hidden controls here
$misc = Html::hidden( 'target', $this->mTarget );
- $misc .= Html::hidden( 'wpEditToken', $this->getUser()->editToken() );
+ $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
$misc .= Xml::closeElement( 'form' );
$out->addHTML( $misc );
}
@@ -1227,18 +1176,19 @@ class SpecialUndelete extends SpecialPage {
} else {
$checkBox = '';
}
+ $user = $this->getUser();
// Build page & diff links...
if( $this->mCanView ) {
$titleObj = $this->getTitle();
# Last link
- if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
- $pageLink = htmlspecialchars( $this->getLang()->timeanddate( $ts, true ) );
- $last = wfMsgHtml( 'diff' );
+ 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 ) ) {
$pageLink = $this->getPageLink( $rev, $titleObj, $ts );
$last = Linker::linkKnown(
$titleObj,
- wfMsgHtml( 'diff' ),
+ $this->msg( 'diff' )->escaped(),
array(),
array(
'target' => $this->mTargetObj->getPrefixedText(),
@@ -1248,11 +1198,11 @@ class SpecialUndelete extends SpecialPage {
);
} else {
$pageLink = $this->getPageLink( $rev, $titleObj, $ts );
- $last = wfMsgHtml( 'diff' );
+ $last = $this->msg( 'diff' )->escaped();
}
} else {
- $pageLink = htmlspecialchars( $this->getLang()->timeanddate( $ts, true ) );
- $last = wfMsgHtml( 'diff' );
+ $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
+ $last = $this->msg( 'diff' )->escaped();
}
// User links
$userLink = Linker::revUserTools( $rev );
@@ -1264,7 +1214,7 @@ class SpecialUndelete extends SpecialPage {
// Edit summary
$comment = Linker::revComment( $rev );
// Revision delete links
- $revdlink = $this->revDeleteLink( $rev );
+ $revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
return "<li>$checkBox $revdlink ($last) $pageLink . . $userLink $stxt $comment</li>";
}
@@ -1272,28 +1222,25 @@ class SpecialUndelete extends SpecialPage {
$file = ArchivedFile::newFromRow( $row );
$ts = wfTimestamp( TS_MW, $row->fa_timestamp );
+ $user = $this->getUser();
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 );
} else {
$checkBox = '';
- $pageLink = $this->getLang()->timeanddate( $ts, true );
+ $pageLink = $this->getLanguage()->userTimeAndDate( $ts, $user );
}
$userLink = $this->getFileUser( $file );
- $data =
- wfMsg( 'widthheight',
- $this->getLang()->formatNum( $row->fa_width ),
- $this->getLang()->formatNum( $row->fa_height ) ) .
- ' (' .
- wfMsg( 'nbytes', $this->getLang()->formatNum( $row->fa_size ) ) .
- ')';
+ $data = $this->msg( 'widthheight' )->numParams( $row->fa_width, $row->fa_height )->text() .
+ ' (' . $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() . ')';
$data = htmlspecialchars( $data );
$comment = $this->getFileComment( $file );
+
// Add show/hide deletion links if available
- $canHide = $this->getUser()->isAllowed( 'deleterevision' );
- if( $canHide || ( $file->getVisibility() && $this->getUser()->isAllowed( 'deletedhistory' ) ) ) {
- if( !$file->userCan( File::DELETED_RESTRICTED ) ) {
+ $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
} else {
$query = array(
@@ -1307,6 +1254,7 @@ class SpecialUndelete extends SpecialPage {
} else {
$revdlink = '';
}
+
return "<li>$checkBox $revdlink $pageLink . . $userLink $data $comment</li>\n";
}
@@ -1314,17 +1262,20 @@ class SpecialUndelete extends SpecialPage {
* Fetch revision text link if it's available to all users
*
* @param $rev Revision
+ * @param $titleObj Title
+ * @param $ts Timestamp
* @return string
*/
function getPageLink( $rev, $titleObj, $ts ) {
- $time = htmlspecialchars( $this->getLang()->timeanddate( $ts, true ) );
+ $user = $this->getUser();
+ $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
- if( !$rev->userCan( Revision::DELETED_TEXT ) ) {
+ if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
return '<span class="history-deleted">' . $time . '</span>';
} else {
$link = Linker::linkKnown(
$titleObj,
- $time,
+ htmlspecialchars( $time ),
array(),
array(
'target' => $this->mTargetObj->getPrefixedText(),
@@ -1342,20 +1293,27 @@ class SpecialUndelete extends SpecialPage {
* Fetch image view link if it's available to all users
*
* @param $file File
+ * @param $titleObj Title
+ * @param $ts A timestamp
+ * @param $key String: a storage key
+ *
* @return String: HTML fragment
*/
function getFileLink( $file, $titleObj, $ts, $key ) {
- if( !$file->userCan( File::DELETED_FILE ) ) {
- return '<span class="history-deleted">' . $this->getLang()->timeanddate( $ts, true ) . '</span>';
+ $user = $this->getUser();
+ $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
+
+ if( !$file->userCan( File::DELETED_FILE, $user ) ) {
+ return '<span class="history-deleted">' . $time . '</span>';
} else {
$link = Linker::linkKnown(
$titleObj,
- $this->getLang()->timeanddate( $ts, true ),
+ htmlspecialchars( $time ),
array(),
array(
'target' => $this->mTargetObj->getPrefixedText(),
'file' => $key,
- 'token' => $this->getUser()->editToken( $key )
+ 'token' => $user->getEditToken( $key )
)
);
if( $file->isDeleted( File::DELETED_FILE ) ) {
@@ -1372,8 +1330,8 @@ class SpecialUndelete extends SpecialPage {
* @return String: HTML fragment
*/
function getFileUser( $file ) {
- if( !$file->userCan( File::DELETED_USER ) ) {
- return '<span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+ 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() );
@@ -1391,9 +1349,9 @@ class SpecialUndelete extends SpecialPage {
* @return String: HTML fragment
*/
function getFileComment( $file ) {
- if( !$file->userCan( File::DELETED_COMMENT ) ) {
+ if( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
return '<span class="history-deleted"><span class="comment">' .
- wfMsgHtml( 'rev-deleted-comment' ) . '</span></span>';
+ $this->msg( 'rev-deleted-comment' )->escaped() . '</span></span>';
} else {
$link = Linker::commentBlock( $file->getRawDescription() );
if( $file->isDeleted( File::DELETED_COMMENT ) ) {
@@ -1404,41 +1362,44 @@ class SpecialUndelete extends SpecialPage {
}
function undelete() {
+ global $wgUploadMaintenance;
+
+ if ( $wgUploadMaintenance && $this->mTargetObj->getNamespace() == NS_FILE ) {
+ throw new ErrorPageError( 'undelete-error', 'filedelete-maintenance' );
+ }
+
if ( wfReadOnly() ) {
throw new ReadOnlyError;
}
- if( !is_null( $this->mTargetObj ) ) {
- $archive = new PageArchive( $this->mTargetObj );
- wfRunHooks( 'UndeleteForm::undelete', array( &$archive, $this->mTargetObj ) );
- $ok = $archive->undelete(
- $this->mTargetTimestamp,
- $this->mComment,
- $this->mFileVersions,
- $this->mUnsuppress );
-
- if( is_array( $ok ) ) {
- if ( $ok[1] ) { // Undeleted file count
- wfRunHooks( 'FileUndeleteComplete', array(
- $this->mTargetObj, $this->mFileVersions,
- $this->getUser(), $this->mComment ) );
- }
-
- $link = Linker::linkKnown( $this->mTargetObj );
- $this->getOutput()->addHTML( wfMessage( 'undeletedpage' )->rawParams( $link )->parse() );
- } else {
- $this->getOutput()->showFatalError( wfMsg( 'cannotundelete' ) );
- $this->getOutput()->addWikiMsg( 'undeleterevdel' );
+ $out = $this->getOutput();
+ $archive = new PageArchive( $this->mTargetObj );
+ wfRunHooks( 'UndeleteForm::undelete', array( &$archive, $this->mTargetObj ) );
+ $ok = $archive->undelete(
+ $this->mTargetTimestamp,
+ $this->mComment,
+ $this->mFileVersions,
+ $this->mUnsuppress );
+
+ if( is_array( $ok ) ) {
+ if ( $ok[1] ) { // Undeleted file count
+ wfRunHooks( 'FileUndeleteComplete', array(
+ $this->mTargetObj, $this->mFileVersions,
+ $this->getUser(), $this->mComment ) );
}
- // Show file deletion warnings and errors
- $status = $archive->getFileStatus();
- if( $status && !$status->isGood() ) {
- $this->getOutput()->addWikiText( $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) );
- }
+ $link = Linker::linkKnown( $this->mTargetObj );
+ $out->addHTML( $this->msg( 'undeletedpage' )->rawParams( $link )->parse() );
} else {
- $this->getOutput()->showFatalError( wfMsg( 'cannotundelete' ) );
+ $out->setPageTitle( $this->msg( 'undelete-error' ) );
+ $out->addWikiMsg( 'cannotundelete' );
+ $out->addWikiMsg( 'undeleterevdel' );
+ }
+
+ // Show file deletion warnings and errors
+ $status = $archive->getFileStatus();
+ if( $status && !$status->isGood() ) {
+ $out->addWikiText( $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) );
}
- return false;
}
}
diff --git a/includes/specials/SpecialUnlockdb.php b/includes/specials/SpecialUnlockdb.php
index 95ad0bf5..2e772540 100644
--- a/includes/specials/SpecialUnlockdb.php
+++ b/includes/specials/SpecialUnlockdb.php
@@ -26,102 +26,62 @@
*
* @ingroup SpecialPage
*/
-class SpecialUnlockdb extends SpecialPage {
+class SpecialUnlockdb extends FormSpecialPage {
public function __construct() {
parent::__construct( 'Unlockdb', 'siteadmin' );
}
- public function execute( $par ) {
- global $wgUser, $wgRequest;
-
- $this->setHeaders();
-
- # Permission check
- if( !$this->userCanExecute( $wgUser ) ) {
- $this->displayRestrictionError();
- return;
- }
-
- $this->outputHeader();
-
- $action = $wgRequest->getVal( 'action' );
-
- if ( $action == 'success' ) {
- $this->showSuccess();
- } elseif ( $action == 'submit' && $wgRequest->wasPosted() &&
- $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
- $this->doSubmit();
- } else {
- $this->showForm();
- }
+ public function requiresWrite() {
+ return false;
}
- private function showForm( $err = '' ) {
- global $wgOut, $wgUser;
-
+ public function checkExecutePermissions( User $user ) {
global $wgReadOnlyFile;
- if( !file_exists( $wgReadOnlyFile ) ) {
- $wgOut->addWikiMsg( 'databasenotlocked' );
- return;
- }
-
- $wgOut->addWikiMsg( 'unlockdbtext' );
- if ( $err != '' ) {
- $wgOut->setSubtitle( wfMsg( 'formerror' ) );
- $wgOut->addHTML( '<p class="error">' . htmlspecialchars( $err ) . "</p>\n" );
+ parent::checkExecutePermissions( $user );
+ # If the lock file isn't writable, we can do sweet bugger all
+ if ( !file_exists( $wgReadOnlyFile ) ) {
+ throw new ErrorPageError( 'lockdb', 'databasenotlocked' );
}
+ }
- $wgOut->addHTML(
- Html::openElement( 'form', array( 'id' => 'unlockdb', 'method' => 'POST',
- 'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) ) . "
-<table>
- <tr>
- " . Html::openElement( 'td', array( 'style' => 'text-align:right' ) ) . "
- " . Html::input( 'wpLockConfirm', null, 'checkbox' ) . "
- </td>
- " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) .
- wfMsgHtml( 'unlockconfirm' ) . "</td>
- </tr>
- <tr>
- <td>&#160;</td>
- " . Html::openElement( 'td', array( 'style' => 'text-align:left' ) ) . "
- " . Html::input( 'wpLock', wfMsg( 'unlockbtn' ), 'submit' ) . "
- </td>
- </tr>
-</table>\n" .
- Html::hidden( 'wpEditToken', $wgUser->editToken() ) . "\n" .
- Html::closeElement( 'form' )
+ protected function getFormFields() {
+ return array(
+ 'Confirm' => array(
+ 'type' => 'toggle',
+ 'label-message' => 'unlockconfirm',
+ ),
);
+ }
+ protected function alterForm( HTMLForm $form ) {
+ $form->setWrapperLegend( false );
+ $form->setHeaderText( $this->msg( 'unlockdbtext' )->parseAsBlock() );
+ $form->setSubmitTextMsg( 'unlockbtn' );
}
- private function doSubmit() {
- global $wgOut, $wgRequest, $wgReadOnlyFile;
+ public function onSubmit( array $data ) {
+ global $wgReadOnlyFile;
- $wpLockConfirm = $wgRequest->getCheck( 'wpLockConfirm' );
- if ( !$wpLockConfirm ) {
- $this->showForm( wfMsg( 'locknoconfirm' ) );
- return;
+ if ( !$data['Confirm'] ) {
+ return Status::newFatal( 'locknoconfirm' );
}
wfSuppressWarnings();
$res = unlink( $wgReadOnlyFile );
wfRestoreWarnings();
- if ( !$res ) {
- $wgOut->showFileDeleteError( $wgReadOnlyFile );
- return;
+ if ( $res ) {
+ return Status::newGood();
+ } else {
+ return Status::newFatal( 'filedeleteerror', $wgReadOnlyFile );
}
-
- $wgOut->redirect( $this->getTitle()->getFullURL( 'action=success' ) );
}
- private function showSuccess() {
- global $wgOut;
-
- $wgOut->setSubtitle( wfMsg( 'unlockdbsuccesssub' ) );
- $wgOut->addWikiMsg( 'unlockdbsuccesstext' );
+ public function onSuccess() {
+ $out = $this->getOutput();
+ $out->addSubtitle( $this->msg( 'unlockdbsuccesssub' ) );
+ $out->addWikiMsg( 'unlockdbsuccesstext' );
}
}
diff --git a/includes/specials/SpecialUnusedcategories.php b/includes/specials/SpecialUnusedcategories.php
index e4b8e544..48a93e8d 100644
--- a/includes/specials/SpecialUnusedcategories.php
+++ b/includes/specials/SpecialUnusedcategories.php
@@ -33,7 +33,7 @@ class UnusedCategoriesPage extends QueryPage {
}
function getPageHeader() {
- return wfMsgExt( 'unusedcategoriestext', array( 'parse' ) );
+ return $this->msg( 'unusedcategoriestext' )->parseAsBlock();
}
function getQueryInfo() {
@@ -59,6 +59,6 @@ class UnusedCategoriesPage extends QueryPage {
function formatResult( $skin, $result ) {
$title = Title::makeTitle( NS_CATEGORY, $result->title );
- return $skin->link( $title, $title->getText() );
+ return Linker::link( $title, htmlspecialchars( $title->getText() ) );
}
}
diff --git a/includes/specials/SpecialUnusedtemplates.php b/includes/specials/SpecialUnusedtemplates.php
index da501605..e5c55b83 100644
--- a/includes/specials/SpecialUnusedtemplates.php
+++ b/includes/specials/SpecialUnusedtemplates.php
@@ -61,19 +61,19 @@ class UnusedtemplatesPage extends QueryPage {
*/
function formatResult( $skin, $result ) {
$title = Title::makeTitle( NS_TEMPLATE, $result->title );
- $pageLink = $skin->linkKnown(
+ $pageLink = Linker::linkKnown(
$title,
null,
array(),
array( 'redirect' => 'no' )
);
- $wlhLink = $skin->linkKnown(
+ $wlhLink = Linker::linkKnown(
SpecialPage::getTitleFor( 'Whatlinkshere' ),
wfMsgHtml( 'unusedtemplateswlh' ),
array(),
array( 'target' => $title->getPrefixedText() )
);
- return wfSpecialList( $pageLink, $wlhLink );
+ return $this->getLanguage()->specialList( $pageLink, $wlhLink );
}
function getPageHeader() {
diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php
index 0f11140b..22c64858 100644
--- a/includes/specials/SpecialUnwatchedpages.php
+++ b/includes/specials/SpecialUnwatchedpages.php
@@ -83,6 +83,6 @@ class UnwatchedpagesPage extends QueryPage {
array( 'action' => 'watch', 'token' => $token )
);
- return wfSpecialList( $plink, $wlink );
+ return $this->getLanguage()->specialList( $plink, $wlink );
}
}
diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php
index 33013e08..d6a76d02 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -35,11 +35,7 @@ class SpecialUpload extends SpecialPage {
* @param $request WebRequest : data posted.
*/
public function __construct( $request = null ) {
- global $wgRequest;
-
parent::__construct( 'Upload', 'upload' );
-
- $this->loadRequest( is_null( $request ) ? $wgRequest : $request );
}
/** Misc variables **/
@@ -83,13 +79,9 @@ class SpecialUpload extends SpecialPage {
/**
* Initialize instance variables from request and create an Upload handler
- *
- * @param $request WebRequest: the request to extract variables from
*/
- protected function loadRequest( $request ) {
- global $wgUser;
-
- $this->mRequest = $request;
+ protected function loadRequest() {
+ $this->mRequest = $request = $this->getRequest();
$this->mSourceType = $request->getVal( 'wpSourceType', 'file' );
$this->mUpload = UploadBase::createFromRequest( $request );
$this->mUploadClicked = $request->wasPosted()
@@ -108,7 +100,7 @@ class SpecialUpload extends SpecialPage {
$this->mDestWarningAck = $request->getText( 'wpDestFileWarningAck' );
$this->mIgnoreWarning = $request->getCheck( 'wpIgnoreWarning' )
|| $request->getCheck( 'wpUploadIgnoreWarning' );
- $this->mWatchthis = $request->getBool( 'wpWatchthis' ) && $wgUser->isLoggedIn();
+ $this->mWatchthis = $request->getBool( 'wpWatchthis' ) && $this->getUser()->isLoggedIn();
$this->mCopyrightStatus = $request->getText( 'wpUploadCopyStatus' );
$this->mCopyrightSource = $request->getText( 'wpUploadSource' );
@@ -119,7 +111,7 @@ class SpecialUpload extends SpecialPage {
// If it was posted check for the token (no remote POST'ing with user credentials)
$token = $request->getVal( 'wpEditToken' );
- $this->mTokenOk = $wgUser->matchEditToken( $token );
+ $this->mTokenOk = $this->getUser()->matchEditToken( $token );
$this->uploadFormTextTop = '';
$this->uploadFormTextAfterSummary = '';
@@ -141,42 +133,30 @@ class SpecialUpload extends SpecialPage {
* Special page entry point
*/
public function execute( $par ) {
- global $wgUser, $wgOut;
-
$this->setHeaders();
$this->outputHeader();
# Check uploading enabled
if( !UploadBase::isEnabled() ) {
- $wgOut->showErrorPage( 'uploaddisabled', 'uploaddisabledtext' );
- return;
+ throw new ErrorPageError( 'uploaddisabled', 'uploaddisabledtext' );
}
# Check permissions
- global $wgGroupPermissions;
- $permissionRequired = UploadBase::isAllowed( $wgUser );
+ $user = $this->getUser();
+ $permissionRequired = UploadBase::isAllowed( $user );
if( $permissionRequired !== true ) {
- if( !$wgUser->isLoggedIn() && ( $wgGroupPermissions['user']['upload']
- || $wgGroupPermissions['autoconfirmed']['upload'] ) ) {
- // Custom message if logged-in users without any special rights can upload
- $wgOut->showErrorPage( 'uploadnologin', 'uploadnologintext' );
- } else {
- $wgOut->permissionRequired( $permissionRequired );
- }
- return;
+ throw new PermissionsError( $permissionRequired );
}
# Check blocks
- if( $wgUser->isBlocked() ) {
- $wgOut->blockedPage();
- return;
+ if( $user->isBlocked() ) {
+ throw new UserBlockedError( $user->mBlock );
}
# Check whether we actually want to allow changing stuff
- if( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
+ $this->checkReadOnly();
+
+ $this->loadRequest();
# Unsave the temporary file in case this was a cancelled upload
if ( $this->mCancelUpload ) {
@@ -190,8 +170,7 @@ class SpecialUpload extends SpecialPage {
if (
$this->mTokenOk && !$this->mCancelUpload &&
( $this->mUpload && $this->mUploadClicked )
- )
- {
+ ) {
$this->processUpload();
} else {
# Backwards compatibility hook
@@ -199,8 +178,6 @@ class SpecialUpload extends SpecialPage {
wfDebug( "Hook 'UploadForm:initial' broke output of the upload form" );
return;
}
-
-
$this->showUploadForm( $this->getUploadForm() );
}
@@ -224,8 +201,7 @@ class SpecialUpload extends SpecialPage {
if ( $form instanceof HTMLForm ) {
$form->show();
} else {
- global $wgOut;
- $wgOut->addHTML( $form );
+ $this->getOutput()->addHTML( $form );
}
}
@@ -239,8 +215,6 @@ class SpecialUpload extends SpecialPage {
* @return UploadForm
*/
protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
- global $wgOut;
-
# Initialize form
$form = new UploadForm( array(
'watch' => $this->getWatchCheck(),
@@ -253,15 +227,14 @@ class SpecialUpload extends SpecialPage {
'texttop' => $this->uploadFormTextTop,
'textaftersummary' => $this->uploadFormTextAfterSummary,
'destfile' => $this->mDesiredDestName,
- ) );
+ ), $this->getContext() );
$form->setTitle( $this->getTitle() );
# Check the token, but only if necessary
if(
!$this->mTokenOk && !$this->mCancelUpload &&
( $this->mUpload && $this->mUploadClicked )
- )
- {
+ ) {
$form->addPreText( wfMsgExt( 'session_fail_preview', 'parseinline' ) );
}
@@ -271,7 +244,7 @@ class SpecialUpload extends SpecialPage {
$delNotice = ''; // empty by default
if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
LogEventsList::showLogExtract( $delNotice, array( 'delete', 'move' ),
- $desiredTitleObj->getPrefixedText(),
+ $desiredTitleObj,
'', array( 'lim' => 10,
'conds' => array( "log_action != 'revision'" ),
'showIfEmpty' => false,
@@ -291,33 +264,31 @@ class SpecialUpload extends SpecialPage {
$uploadFooter = wfMessage( 'uploadfooter' );
if ( !$uploadFooter->isDisabled() ) {
$form->addPostText( '<div id="mw-upload-footer-message">'
- . $wgOut->parse( $uploadFooter->plain() ) . "</div>\n" );
+ . $this->getOutput()->parse( $uploadFooter->plain() ) . "</div>\n" );
}
return $form;
-
}
/**
* Shows the "view X deleted revivions link""
*/
protected function showViewDeletedLinks() {
- global $wgOut, $wgUser;
-
$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 ) {
$count = $title->isDeleted();
- if ( $count > 0 && $wgUser->isAllowed( 'deletedhistory' ) ) {
+ if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
$link = wfMsgExt(
- $wgUser->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted',
+ $user->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted',
array( 'parse', 'replaceafter' ),
- $this->getSkin()->linkKnown(
+ Linker::linkKnown(
SpecialPage::getTitleFor( 'Undelete', $title->getPrefixedText() ),
wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $count )
)
);
- $wgOut->addHTML( "<div id=\"contentSub2\">{$link}</div>" );
+ $this->getOutput()->addHTML( "<div id=\"contentSub2\">{$link}</div>" );
}
}
}
@@ -402,7 +373,7 @@ class SpecialUpload extends SpecialPage {
/**
* Show the upload form with error message, but do not stash the file.
*
- * @param $message HTML string
+ * @param $message string HTML string
*/
protected function showUploadError( $message ) {
$message = '<h2>' . wfMsgHtml( 'uploadwarning' ) . "</h2>\n" .
@@ -415,12 +386,10 @@ class SpecialUpload extends SpecialPage {
* Checks are made in SpecialUpload::execute()
*/
protected function processUpload() {
- global $wgUser, $wgOut;
-
// Fetch the file if required
$status = $this->mUpload->fetchFile();
if( !$status->isOK() ) {
- $this->showUploadError( $wgOut->parse( $status->getWikiText() ) );
+ $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
return;
}
@@ -442,7 +411,7 @@ class SpecialUpload extends SpecialPage {
}
// Verify permissions for this title
- $permErrors = $this->mUpload->verifyTitlePermissions( $wgUser );
+ $permErrors = $this->mUpload->verifyTitlePermissions( $this->getUser() );
if( $permErrors !== true ) {
$code = array_shift( $permErrors[0] );
$this->showRecoverableUploadError( wfMsgExt( $code,
@@ -467,25 +436,31 @@ class SpecialUpload extends SpecialPage {
} else {
$pageText = false;
}
- $status = $this->mUpload->performUpload( $this->mComment, $pageText, $this->mWatchthis, $wgUser );
+ $status = $this->mUpload->performUpload( $this->mComment, $pageText, $this->mWatchthis, $this->getUser() );
if ( !$status->isGood() ) {
- $this->showUploadError( $wgOut->parse( $status->getWikiText() ) );
+ $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
return;
}
// Success, redirect to description page
$this->mUploadSuccessful = true;
wfRunHooks( 'SpecialUploadComplete', array( &$this ) );
- $wgOut->redirect( $this->mLocalFile->getTitle()->getFullURL() );
+ $this->getOutput()->redirect( $this->mLocalFile->getTitle()->getFullURL() );
}
/**
* Get the initial image page text based on a comment and optional file status information
+ * @param $comment string
+ * @param $license string
+ * @param $copyStatus string
+ * @param $source string
+ * @return string
*/
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.
@@ -529,10 +504,10 @@ class SpecialUpload extends SpecialPage {
*
* Note that the page target can be changed *on the form*, so our check
* state can get out of sync.
+ * @return Bool|String
*/
protected function getWatchCheck() {
- global $wgUser;
- if( $wgUser->getOption( 'watchdefault' ) ) {
+ if( $this->getUser()->getOption( 'watchdefault' ) ) {
// Watch all edits!
return true;
}
@@ -544,7 +519,7 @@ class SpecialUpload extends SpecialPage {
return $local->getTitle()->userIsWatching();
} else {
// New page should get watched if that's our option.
- return $wgUser->getOption( 'watchcreations' );
+ return $this->getUser()->getOption( 'watchcreations' );
}
}
@@ -555,7 +530,7 @@ class SpecialUpload extends SpecialPage {
* @param $details Array: result of UploadBase::verifyUpload
*/
protected function processVerificationError( $details ) {
- global $wgFileExtensions, $wgLang;
+ global $wgFileExtensions;
switch( $details['status'] ) {
@@ -567,6 +542,9 @@ class SpecialUpload extends SpecialPage {
$this->showRecoverableUploadError( wfMsgExt( 'illegalfilename',
'parseinline', $details['filtered'] ) );
break;
+ case UploadBase::FILENAME_TOO_LONG:
+ $this->showRecoverableUploadError( wfMsgHtml( 'filename-toolong' ) );
+ break;
case UploadBase::FILETYPE_MISSING:
$this->showRecoverableUploadError( wfMsgExt( 'filetype-missing',
'parseinline' ) );
@@ -586,11 +564,11 @@ class SpecialUpload extends SpecialPage {
case UploadBase::FILETYPE_BADTYPE:
$msg = wfMessage( 'filetype-banned-type' );
if ( isset( $details['blacklistedExt'] ) ) {
- $msg->params( $wgLang->commaList( $details['blacklistedExt'] ) );
+ $msg->params( $this->getLanguage()->commaList( $details['blacklistedExt'] ) );
} else {
$msg->params( $details['finalExt'] );
}
- $msg->params( $wgLang->commaList( $wgFileExtensions ),
+ $msg->params( $this->getLanguage()->commaList( $wgFileExtensions ),
count( $wgFileExtensions ) );
// Add PLURAL support for the first parameter. This results
@@ -631,13 +609,12 @@ class SpecialUpload extends SpecialPage {
* @return Boolean: success
*/
protected function unsaveUploadedFile() {
- global $wgOut;
if ( !( $this->mUpload instanceof UploadFromStash ) ) {
return true;
}
$success = $this->mUpload->unsaveUploadedFile();
if ( !$success ) {
- $wgOut->showFileDeleteError( $this->mUpload->getTempPath() );
+ $this->getOutput()->showFileDeleteError( $this->mUpload->getTempPath() );
return false;
} else {
return true;
@@ -654,8 +631,6 @@ class SpecialUpload extends SpecialPage {
* @return String: empty string if there is no warning or an HTML fragment
*/
public static function getExistsWarning( $exists ) {
- global $wgUser;
-
if ( !$exists ) {
return '';
}
@@ -664,8 +639,6 @@ class SpecialUpload extends SpecialPage {
$filename = $file->getTitle()->getPrefixedText();
$warning = '';
- $sk = $wgUser->getSkin();
-
if( $exists['warning'] == 'exists' ) {
// Exact match
$warning = wfMsgExt( 'fileexists', 'parseinline', $filename );
@@ -689,7 +662,7 @@ class SpecialUpload extends SpecialPage {
} elseif ( $exists['warning'] == 'was-deleted' ) {
# If the file existed before and was deleted, warn the user of this
$ltitle = SpecialPage::getTitleFor( 'Log' );
- $llink = $sk->linkKnown(
+ $llink = Linker::linkKnown(
$ltitle,
wfMsgHtml( 'deletionlog' ),
array(),
@@ -730,10 +703,12 @@ class SpecialUpload extends SpecialPage {
/**
* Construct a warning and a gallery from an array of duplicate files.
+ * @param $dupes array
+ * @return string
*/
public static function getDupeWarning( $dupes ) {
+ global $wgOut;
if( $dupes ) {
- global $wgOut;
$msg = '<gallery>';
foreach( $dupes as $file ) {
$title = $file->getTitle();
@@ -771,7 +746,9 @@ class UploadForm extends HTMLForm {
protected $mMaxFileSize = array();
- public function __construct( $options = array() ) {
+ protected $mMaxUploadSize = array();
+
+ public function __construct( array $options = array(), IContextSource $context = null ) {
$this->mWatch = !empty( $options['watch'] );
$this->mForReUpload = !empty( $options['forreupload'] );
$this->mSessionKey = isset( $options['sessionkey'] )
@@ -795,7 +772,7 @@ class UploadForm extends HTMLForm {
+ $this->getOptionsSection();
wfRunHooks( 'UploadFormInitDescriptor', array( &$descriptor ) );
- parent::__construct( $descriptor, 'upload' );
+ parent::__construct( $descriptor, $context, 'upload' );
# Set some form properties
$this->setSubmitText( wfMsg( 'uploadbtn' ) );
@@ -821,8 +798,6 @@ class UploadForm extends HTMLForm {
* @return Array: descriptor array
*/
protected function getSourceSection() {
- global $wgLang, $wgUser, $wgRequest;
-
if ( $this->mSessionKey ) {
return array(
'SessionKey' => array(
@@ -836,9 +811,9 @@ class UploadForm extends HTMLForm {
);
}
- $canUploadByUrl = UploadFromUrl::isEnabled() && $wgUser->isAllowed( 'upload_by_url' );
+ $canUploadByUrl = UploadFromUrl::isEnabled() && UploadFromUrl::isAllowed( $this->getUser() );
$radio = $canUploadByUrl;
- $selectedSourceType = strtolower( $wgRequest->getText( 'wpSourceType', 'File' ) );
+ $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
$descriptor = array();
if ( $this->mTextTop ) {
@@ -868,7 +843,7 @@ class UploadForm extends HTMLForm {
'radio' => &$radio,
'help' => wfMsgExt( 'upload-maxfilesize',
array( 'parseinline', 'escapenoentities' ),
- $wgLang->formatSize( $this->mMaxUploadSize['file'] )
+ $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
) . ' ' . wfMsgHtml( 'upload_source_file' ),
'checked' => $selectedSourceType == 'file',
);
@@ -883,7 +858,7 @@ class UploadForm extends HTMLForm {
'radio' => &$radio,
'help' => wfMsgExt( 'upload-maxfilesize',
array( 'parseinline', 'escapenoentities' ),
- $wgLang->formatSize( $this->mMaxUploadSize['url'] )
+ $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
) . ' ' . wfMsgHtml( 'upload_source_url' ),
'checked' => $selectedSourceType == 'url',
);
@@ -907,7 +882,7 @@ class UploadForm extends HTMLForm {
protected function getExtensionsMessage() {
# Print a list of allowed file extensions, if so configured. We ignore
# MIME type here, it's incomprehensible to most people and too long.
- global $wgLang, $wgCheckFileExtensions, $wgStrictFileExtensions,
+ global $wgCheckFileExtensions, $wgStrictFileExtensions,
$wgFileExtensions, $wgFileBlacklist;
if( $wgCheckFileExtensions ) {
@@ -915,16 +890,16 @@ class UploadForm extends HTMLForm {
# Everything not permitted is banned
$extensionsList =
'<div id="mw-upload-permitted">' .
- wfMsgExt( 'upload-permitted', 'parse', $wgLang->commaList( $wgFileExtensions ) ) .
+ wfMsgExt( 'upload-permitted', 'parse', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) ) .
"</div>\n";
} else {
# We have to list both preferred and prohibited
$extensionsList =
'<div id="mw-upload-preferred">' .
- wfMsgExt( 'upload-preferred', 'parse', $wgLang->commaList( $wgFileExtensions ) ) .
+ wfMsgExt( 'upload-preferred', 'parse', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) ) .
"</div>\n" .
'<div id="mw-upload-prohibited">' .
- wfMsgExt( 'upload-prohibited', 'parse', $wgLang->commaList( $wgFileBlacklist ) ) .
+ wfMsgExt( 'upload-prohibited', 'parse', $this->getContext()->getLanguage()->commaList( $wgFileBlacklist ) ) .
"</div>\n";
}
} else {
@@ -941,8 +916,6 @@ class UploadForm extends HTMLForm {
* @return Array: descriptor array
*/
protected function getDescriptionSection() {
- global $wgUser;
-
if ( $this->mSessionKey ) {
$stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
try {
@@ -982,7 +955,7 @@ class UploadForm extends HTMLForm {
? 'filereuploadsummary'
: 'fileuploadsummary',
'default' => $this->mComment,
- 'cols' => intval( $wgUser->getOption( 'cols' ) ),
+ 'cols' => intval( $this->getUser()->getOption( 'cols' ) ),
'rows' => 8,
)
);
@@ -1041,16 +1014,15 @@ class UploadForm extends HTMLForm {
* @return Array: descriptor array
*/
protected function getOptionsSection() {
- global $wgUser;
-
- if ( $wgUser->isLoggedIn() ) {
+ $user = $this->getUser();
+ if ( $user->isLoggedIn() ) {
$descriptor = array(
'Watchthis' => array(
'type' => 'check',
'id' => 'wpWatchthis',
'label-message' => 'watchthisupload',
'section' => 'options',
- 'default' => $wgUser->getOption( 'watchcreations' ),
+ 'default' => $user->getOption( 'watchcreations' ),
)
);
}
@@ -1089,11 +1061,10 @@ class UploadForm extends HTMLForm {
}
/**
- * Add upload JS to $wgOut
+ * Add upload JS to the OutputPage
*/
protected function addUploadJS() {
global $wgUseAjax, $wgAjaxUploadDestCheck, $wgAjaxLicensePreview, $wgEnableAPI, $wgStrictFileExtensions;
- global $wgOut;
$useAjaxDestCheck = $wgUseAjax && $wgAjaxUploadDestCheck;
$useAjaxLicensePreview = $wgUseAjax && $wgAjaxLicensePreview && $wgEnableAPI;
@@ -1112,10 +1083,11 @@ class UploadForm extends HTMLForm {
'wgMaxUploadSize' => $this->mMaxUploadSize,
);
- $wgOut->addScript( Skin::makeVariablesScript( $scriptVars ) );
+ $out = $this->getOutput();
+ $out->addJsConfigVars( $scriptVars );
- $wgOut->addModules( array(
+ $out->addModules( array(
'mediawiki.action.edit', // For <charinsert> support
'mediawiki.legacy.upload', // Old form stuff...
'mediawiki.special.upload', // Newer extras for thumbnail preview.
@@ -1137,6 +1109,11 @@ class UploadForm extends HTMLForm {
* A form field that contains a radio box in the label
*/
class UploadSourceField extends HTMLTextField {
+
+ /**
+ * @param $cellAttributes array
+ * @return string
+ */
function getLabelHtml( $cellAttributes = array() ) {
$id = "wpSourceType{$this->mParams['upload-type']}";
$label = Html::rawElement( 'label', array( 'for' => $id ), $this->mLabel );
@@ -1157,6 +1134,9 @@ class UploadSourceField extends HTMLTextField {
return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes, $label );
}
+ /**
+ * @return int
+ */
function getSize() {
return isset( $this->mParams['size'] )
? $this->mParams['size']
diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php
index 20a37f0b..121b6a44 100644
--- a/includes/specials/SpecialUploadStash.php
+++ b/includes/specials/SpecialUploadStash.php
@@ -35,7 +35,6 @@ class SpecialUploadStash extends UnlistedSpecialPage {
try {
$this->stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
} catch ( UploadStashNotAvailableException $e ) {
- return null;
}
}
@@ -46,21 +45,14 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* @return Boolean: success
*/
public function execute( $subPage ) {
- global $wgUser;
+ $this->checkPermissions();
- if ( !$this->userCanExecute( $wgUser ) ) {
- $this->displayRestrictionError();
- return;
- }
-
- if ( !isset( $subPage ) || $subPage === '' ) {
+ if ( $subPage === null || $subPage === '' ) {
return $this->showUploads();
}
-
return $this->showUpload( $subPage );
}
-
/**
* If file available in stash, cats it out to the client as a simple HTTP response.
* n.b. Most sanity checking done in UploadStashLocalFile, so this is straightforward.
@@ -68,10 +60,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* @param $key String: the key of a particular requested file
*/
public function showUpload( $key ) {
- global $wgOut;
-
// prevent callers from doing standard HTML output -- we'll take it from here
- $wgOut->disable();
+ $this->getOutput()->disable();
try {
$params = $this->parseKey( $key );
@@ -97,8 +87,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
$message = $e->getMessage();
}
- wfHttpError( $code, HttpStatus::getMessage( $code ), $message );
- return false;
+ throw new HttpError( $code, $message );
}
/**
@@ -177,14 +166,15 @@ class SpecialUploadStash extends UnlistedSpecialPage {
}
// we should have just generated it locally
- if ( ! $thumbnailImage->getPath() ) {
+ if ( !$thumbnailImage->getStoragePath() ) {
throw new UploadStashFileNotFoundException( "no local path for scaled item" );
}
// now we should construct a File, so we can get mime and other such info in a standard way
// n.b. mimetype may be different from original (ogx original -> jpeg thumb)
- $thumbFile = new UnregisteredLocalFile( false, $this->stash->repo, $thumbnailImage->getPath(), false );
- if ( ! $thumbFile ) {
+ $thumbFile = new UnregisteredLocalFile( false,
+ $this->stash->repo, $thumbnailImage->getStoragePath(), false );
+ if ( !$thumbFile ) {
throw new UploadStashFileNotFoundException( "couldn't create local file object for thumbnail" );
}
@@ -210,12 +200,20 @@ class SpecialUploadStash extends UnlistedSpecialPage {
// this global probably looks something like 'http://upload.wikimedia.org/wikipedia/test/thumb/temp'
// do not use trailing slash
global $wgUploadStashScalerBaseUrl;
+ $scalerBaseUrl = $wgUploadStashScalerBaseUrl;
+
+ 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.
+ $scalerBaseUrl = wfExpandUrl( $scalerBaseUrl, PROTO_CANONICAL );
+ }
// We need to use generateThumbName() instead of thumbName(), because
// the suffix needs to match the file name for the remote thumbnailer
// to work
$scalerThumbName = $file->generateThumbName( $file->getName(), $params );
- $scalerThumbUrl = $wgUploadStashScalerBaseUrl . '/' . $file->getUrlRel() .
+ $scalerThumbUrl = $scalerBaseUrl . '/' . $file->getUrlRel() .
'/' . rawurlencode( $scalerThumbName );
// make a curl call to the scaler to create a thumbnail
@@ -241,18 +239,17 @@ class SpecialUploadStash extends UnlistedSpecialPage {
/**
* Output HTTP response for file
* Side effect: writes HTTP response to STDOUT.
- * XXX could use wfStreamfile (in includes/Streamfile.php), but for consistency with outputContents() doing it this way.
- * XXX is mimeType really enough, or do we need encoding for full Content-Type header?
*
* @param $file File object with a local path (e.g. UnregisteredLocalFile, LocalFile. Oddly these don't share an ancestor!)
*/
- private function outputLocalFile( $file ) {
+ private function outputLocalFile( File $file ) {
if ( $file->getSize() > self::MAX_SERVE_BYTES ) {
throw new SpecialUploadStashTooLargeException();
}
- self::outputFileHeaders( $file->getMimeType(), $file->getSize() );
- readfile( $file->getPath() );
- return true;
+ return $file->getRepo()->streamFile( $file->getPath(),
+ array( 'Content-Transfer-Encoding: binary',
+ 'Expires: Sun, 17-Jan-2038 19:14:07 GMT' )
+ );
}
/**
@@ -309,7 +306,6 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* @param Status : $status - the result of processRequest
*/
private function showUploads( $status = null ) {
- global $wgOut;
if ( $status === null ) {
$status = Status::newGood();
}
@@ -327,7 +323,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
'default' => true,
'name' => 'clear',
)
- ), 'clearStashedUploads' );
+ ), $this->getContext(), 'clearStashedUploads' );
$form->setSubmitCallback( array( __CLASS__ , 'tryClearStashedUploads' ) );
$form->setTitle( $this->getTitle() );
$form->setSubmitText( wfMsg( 'uploadstash-clear' ) );
@@ -340,7 +336,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
array( 'href' => $this->getTitle()->getLocalURL() ),
wfMsg( 'uploadstash-refresh' ) );
$files = $this->stash->listFiles();
- if ( count( $files ) ) {
+ if ( $files && count( $files ) ) {
sort( $files );
$fileListItemsHtml = '';
foreach ( $files as $file ) {
@@ -350,11 +346,11 @@ class SpecialUploadStash extends UnlistedSpecialPage {
$this->getTitle( "file/$file" )->getLocalURL() ), $file )
);
}
- $wgOut->addHtml( Html::rawElement( 'ul', array(), $fileListItemsHtml ) );
+ $this->getOutput()->addHtml( Html::rawElement( 'ul', array(), $fileListItemsHtml ) );
$form->displayForm( $formResult );
- $wgOut->addHtml( Html::rawElement( 'p', array(), $refreshHtml ) );
+ $this->getOutput()->addHtml( Html::rawElement( 'p', array(), $refreshHtml ) );
} else {
- $wgOut->addHtml( Html::rawElement( 'p', array(),
+ $this->getOutput()->addHtml( Html::rawElement( 'p', array(),
Html::element( 'span', array(), wfMsg( 'uploadstash-nofiles' ) )
. ' '
. $refreshHtml
diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php
index 0e5baa2d..13ea5def 100644
--- a/includes/specials/SpecialUserlogin.php
+++ b/includes/specials/SpecialUserlogin.php
@@ -49,6 +49,7 @@ class LoginForm extends SpecialPage {
var $mSkipCookieCheck, $mReturnToQuery, $mToken, $mStickHTTPS;
var $mType, $mReason, $mRealName;
var $mAbortLoginErrorMsg = 'login-abort-generic';
+ private $mLoaded = false;
/**
* @var ExternalUser
@@ -56,27 +57,36 @@ class LoginForm extends SpecialPage {
private $mExtUser = null;
/**
+ * @ var WebRequest
+ */
+ private $mOverrideRequest = null;
+
+ /**
* @param WebRequest $request
*/
public function __construct( $request = null ) {
parent::__construct( 'Userlogin' );
- if ( $request === null ) {
- global $wgRequest;
- $this->load( $wgRequest );
- } else {
- $this->load( $request );
- }
+ $this->mOverrideRequest = $request;
}
/**
* Loader
- *
- * @param $request WebRequest object
*/
- function load( $request ) {
+ function load() {
global $wgAuth, $wgHiddenPrefs, $wgEnableEmail, $wgRedirectOnLogin;
+ if ( $this->mLoaded ) {
+ return;
+ }
+ $this->mLoaded = true;
+
+ if ( $this->mOverrideRequest === null ) {
+ $request = $this->getRequest();
+ } else {
+ $request = $this->mOverrideRequest;
+ }
+
$this->mType = $request->getText( 'type' );
$this->mUsername = $request->getText( 'wpName' );
$this->mPassword = $request->getText( 'wpPassword' );
@@ -115,7 +125,11 @@ class LoginForm extends SpecialPage {
}
if( !$wgAuth->validDomain( $this->mDomain ) ) {
- $this->mDomain = 'invaliddomain';
+ if ( isset( $_SESSION['wsDomain'] ) ) {
+ $this->mDomain = $_SESSION['wsDomain'];
+ } else {
+ $this->mDomain = 'invaliddomain';
+ }
}
$wgAuth->setDomain( $this->mDomain );
@@ -127,11 +141,19 @@ class LoginForm extends SpecialPage {
}
}
+ function getDescription() {
+ return $this->msg( $this->getUser()->isAllowed( 'createaccount' ) ?
+ 'userlogin' : 'userloginnocreate' )->text();
+ }
+
public function execute( $par ) {
if ( session_id() == '' ) {
wfSetupSession();
}
+ $this->load();
+ $this->setHeaders();
+
if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
$this->mType = 'signup';
}
@@ -155,10 +177,8 @@ class LoginForm extends SpecialPage {
* @private
*/
function addNewAccountMailPassword() {
- global $wgOut;
-
if ( $this->mEmail == '' ) {
- $this->mainLoginForm( wfMsgExt( 'noemailcreate', array( 'parsemag', 'escape' ) ) );
+ $this->mainLoginForm( $this->msg( 'noemailcreate' )->escaped() );
return;
}
@@ -176,13 +196,14 @@ class LoginForm extends SpecialPage {
wfRunHooks( 'AddNewAccount', array( $u, true ) );
$u->addNewUserLogEntry( true, $this->mReason );
- $wgOut->setPageTitle( wfMsg( 'accmailtitle' ) );
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'accmailtitle' ) );
if( !$result->isGood() ) {
- $this->mainLoginForm( wfMsg( 'mailerror', $result->getWikiText() ) );
+ $this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
} else {
- $wgOut->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
- $wgOut->returnToMain( false );
+ $out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
+ $out->returnToMain( false );
}
}
@@ -190,7 +211,7 @@ class LoginForm extends SpecialPage {
* @private
*/
function addNewAccount() {
- global $wgUser, $wgEmailAuthentication, $wgOut;
+ global $wgUser, $wgEmailAuthentication, $wgLoginLanguageSelector;
# Create the account and abort if there's a problem doing so
$u = $this->addNewAccountInternal();
@@ -200,18 +221,19 @@ class LoginForm extends SpecialPage {
# If we showed up language selection links, and one was in use, be
# smart (and sensible) and save that language as the user's preference
- global $wgLoginLanguageSelector;
if( $wgLoginLanguageSelector && $this->mLanguage ) {
$u->setOption( 'language', $this->mLanguage );
}
+ $out = $this->getOutput();
+
# Send out an email authentication message if needed
if( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
$status = $u->sendConfirmationMail();
if( $status->isGood() ) {
- $wgOut->addWikiMsg( 'confirmemail_oncreate' );
+ $out->addWikiMsg( 'confirmemail_oncreate' );
} else {
- $wgOut->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
+ $out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
}
}
@@ -221,15 +243,15 @@ 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( $wgUser->isAnon() ) {
+ if( $this->getUser()->isAnon() ) {
+ $u->setCookies();
$wgUser = $u;
- $wgUser->setCookies();
// This should set it for OutputPage and the Skin
// which is needed or the personal links will be
// wrong.
- RequestContext::getMain()->setUser( $u );
- wfRunHooks( 'AddNewAccount', array( $wgUser, false ) );
- $wgUser->addNewUserLogEntry();
+ $this->getContext()->setUser( $u );
+ wfRunHooks( 'AddNewAccount', array( $u, false ) );
+ $u->addNewUserLogEntry();
if( $this->hasSessionCookie() ) {
return $this->successfulCreation();
} else {
@@ -237,10 +259,9 @@ class LoginForm extends SpecialPage {
}
} else {
# Confirm that the account was created
- $self = SpecialPage::getTitleFor( 'Userlogin' );
- $wgOut->setPageTitle( wfMsgHtml( 'accountcreated' ) );
- $wgOut->addWikiMsg( 'accountcreatedtext', $u->getName() );
- $wgOut->returnToMain( false, $self );
+ $out->setPageTitle( $this->msg( 'accountcreated' ) );
+ $out->addWikiMsg( 'accountcreatedtext', $u->getName() );
+ $out->returnToMain( false, $this->getTitle() );
wfRunHooks( 'AddNewAccount', array( $u, false ) );
$u->addNewUserLogEntry( false, $this->mReason );
return true;
@@ -251,14 +272,12 @@ class LoginForm extends SpecialPage {
* @private
*/
function addNewAccountInternal() {
- global $wgUser, $wgOut;
- global $wgMemc, $wgAccountCreationThrottle;
- global $wgAuth, $wgMinimalPasswordLength;
- global $wgEmailConfirmToEdit;
+ global $wgAuth, $wgMemc, $wgAccountCreationThrottle,
+ $wgMinimalPasswordLength, $wgEmailConfirmToEdit;
// If the user passes an invalid domain, something is fishy
if( !$wgAuth->validDomain( $this->mDomain ) ) {
- $this->mainLoginForm( wfMsg( 'wrongpassword' ) );
+ $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
return false;
}
@@ -270,47 +289,46 @@ class LoginForm extends SpecialPage {
if( 'local' != $this->mDomain && $this->mDomain != '' ) {
if( !$wgAuth->canCreateAccounts() && ( !$wgAuth->userExists( $this->mUsername )
|| !$wgAuth->authenticate( $this->mUsername, $this->mPassword ) ) ) {
- $this->mainLoginForm( wfMsg( 'wrongpassword' ) );
+ $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
return false;
}
}
if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return false;
+ throw new ReadOnlyError;
}
# Request forgery checks.
if ( !self::getCreateaccountToken() ) {
self::setCreateaccountToken();
- $this->mainLoginForm( wfMsgExt( 'nocookiesfornew', array( 'parseinline' ) ) );
+ $this->mainLoginForm( $this->msg( 'nocookiesfornew' )->parse() );
return false;
}
# The user didn't pass a createaccount token
if ( !$this->mToken ) {
- $this->mainLoginForm( wfMsg( 'sessionfailure' ) );
+ $this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
return false;
}
# Validate the createaccount token
if ( $this->mToken !== self::getCreateaccountToken() ) {
- $this->mainLoginForm( wfMsg( 'sessionfailure' ) );
+ $this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
return false;
}
# Check permissions
- if ( !$wgUser->isAllowed( 'createaccount' ) ) {
- $wgOut->permissionRequired( 'createaccount' );
- return false;
- } elseif ( $wgUser->isBlockedFromCreateAccount() ) {
- $this->userBlockedMessage( $wgUser->isBlockedFromCreateAccount() );
+ $currentUser = $this->getUser();
+ if ( !$currentUser->isAllowed( 'createaccount' ) ) {
+ throw new PermissionsError( 'createaccount' );
+ } elseif ( $currentUser->isBlockedFromCreateAccount() ) {
+ $this->userBlockedMessage( $currentUser->isBlockedFromCreateAccount() );
return false;
}
- $ip = wfGetIP();
- if ( $wgUser->isDnsBlacklisted( $ip, true /* check $wgProxyWhitelist */ ) ) {
- $this->mainLoginForm( wfMsg( 'sorbs_create_account_reason' ) . ' (' . htmlspecialchars( $ip ) . ')' );
+ $ip = $this->getRequest()->getIP();
+ if ( $currentUser->isDnsBlacklisted( $ip, true /* check $wgProxyWhitelist */ ) ) {
+ $this->mainLoginForm( $this->msg( 'sorbs_create_account_reason' )->text() . ' (' . htmlspecialchars( $ip ) . ')' );
return false;
}
@@ -318,17 +336,17 @@ class LoginForm extends SpecialPage {
$name = trim( $this->mUsername );
$u = User::newFromName( $name, 'creatable' );
if ( !is_object( $u ) ) {
- $this->mainLoginForm( wfMsg( 'noname' ) );
+ $this->mainLoginForm( $this->msg( 'noname' )->text() );
return false;
}
if ( 0 != $u->idForName() ) {
- $this->mainLoginForm( wfMsg( 'userexists' ) );
+ $this->mainLoginForm( $this->msg( 'userexists' )->text() );
return false;
}
if ( 0 != strcmp( $this->mPassword, $this->mRetype ) ) {
- $this->mainLoginForm( wfMsg( 'badretype' ) );
+ $this->mainLoginForm( $this->msg( 'badretype' )->text() );
return false;
}
@@ -343,7 +361,7 @@ class LoginForm extends SpecialPage {
$message = $valid;
$params = array( $wgMinimalPasswordLength );
}
- $this->mainLoginForm( wfMsgExt( $message, array( 'parsemag' ), $params ) );
+ $this->mainLoginForm( $this->msg( $message, $params )->text() );
return false;
} else {
# do not force a password for account creation by email
@@ -355,12 +373,12 @@ class LoginForm extends SpecialPage {
# if you need a confirmed email address to edit, then obviously you
# need an email address.
if ( $wgEmailConfirmToEdit && empty( $this->mEmail ) ) {
- $this->mainLoginForm( wfMsg( 'noemailtitle' ) );
+ $this->mainLoginForm( $this->msg( 'noemailtitle' )->text() );
return false;
}
if( !empty( $this->mEmail ) && !Sanitizer::validateEmail( $this->mEmail ) ) {
- $this->mainLoginForm( wfMsg( 'invalidemailaddress' ) );
+ $this->mainLoginForm( $this->msg( 'invalidemailaddress' )->text() );
return false;
}
@@ -377,21 +395,26 @@ class LoginForm extends SpecialPage {
return false;
}
- if ( $wgAccountCreationThrottle && $wgUser->isPingLimitable() ) {
- $key = wfMemcKey( 'acctcreate', 'ip', $ip );
- $value = $wgMemc->get( $key );
- if ( !$value ) {
- $wgMemc->set( $key, 0, 86400 );
- }
- if ( $value >= $wgAccountCreationThrottle ) {
- $this->throttleHit( $wgAccountCreationThrottle );
- return false;
+ // Hook point to check for exempt from account creation throttle
+ if ( !wfRunHooks( 'ExemptFromAccountCreationThrottle', array( $ip ) ) ) {
+ wfDebug( "LoginForm::exemptFromAccountCreationThrottle: a hook allowed account creation w/o throttle\n" );
+ } else {
+ if ( ( $wgAccountCreationThrottle && $currentUser->isPingLimitable() ) ) {
+ $key = wfMemcKey( 'acctcreate', 'ip', $ip );
+ $value = $wgMemc->get( $key );
+ if ( !$value ) {
+ $wgMemc->set( $key, 0, 86400 );
+ }
+ if ( $value >= $wgAccountCreationThrottle ) {
+ $this->throttleHit( $wgAccountCreationThrottle );
+ return false;
+ }
+ $wgMemc->incr( $key );
}
- $wgMemc->incr( $key );
}
if( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
- $this->mainLoginForm( wfMsg( 'externaldberror' ) );
+ $this->mainLoginForm( $this->msg( 'externaldberror' )->text() );
return false;
}
@@ -451,6 +474,8 @@ class LoginForm extends SpecialPage {
public function authenticateUserData() {
global $wgUser, $wgAuth;
+ $this->load();
+
if ( $this->mUsername == '' ) {
return self::NO_NAME;
}
@@ -480,13 +505,13 @@ class LoginForm extends SpecialPage {
return self::WRONG_TOKEN;
}
- // Load $wgUser now, and check to see if we're logging in as the same
- // name. This is necessary because loading $wgUser (say by calling
- // getName()) calls the UserLoadFromSession hook, which potentially
- // creates the user in the database. Until we load $wgUser, checking
- // for user existence using User::newFromName($name)->getId() below
+ // Load the current user now, and check to see if we're logging in as
+ // the same name. This is necessary because loading the current user
+ // (say by calling getName()) calls the UserLoadFromSession hook, which
+ // potentially creates the user in the database. Until we load $wgUser,
+ // checking for user existence using User::newFromName($name)->getId() below
// will effectively be using stale data.
- if ( $wgUser->getName() === $this->mUsername ) {
+ if ( $this->getUser()->getName() === $this->mUsername ) {
wfDebug( __METHOD__ . ": already logged in as {$this->mUsername}\n" );
return self::SUCCESS;
}
@@ -567,7 +592,7 @@ class LoginForm extends SpecialPage {
// This should set it for OutputPage and the Skin
// which is needed or the personal links will be
// wrong.
- RequestContext::getMain()->setUser( $u );
+ $this->getContext()->setUser( $u );
// Please reset throttle for successful logins, thanks!
if ( $throttleCount ) {
@@ -576,7 +601,7 @@ class LoginForm extends SpecialPage {
if ( $isAutoCreated ) {
// Must be run after $wgUser is set, for correct new user log
- wfRunHooks( 'AuthPluginAutoCreate', array( $wgUser ) );
+ wfRunHooks( 'AuthPluginAutoCreate', array( $u ) );
}
$retval = self::SUCCESS;
@@ -585,18 +610,19 @@ class LoginForm extends SpecialPage {
return $retval;
}
- /*
+ /**
* Increment the login attempt throttle hit count for the (username,current IP)
* tuple unless the throttle was already reached.
* @param $username string The user name
* @return Bool|Integer The integer hit count or True if it is already at the limit
*/
public static function incLoginThrottle( $username ) {
- global $wgPasswordAttemptThrottle, $wgMemc;
+ global $wgPasswordAttemptThrottle, $wgMemc, $wgRequest;
+ $username = trim( $username ); // sanity
$throttleCount = 0;
if ( is_array( $wgPasswordAttemptThrottle ) ) {
- $throttleKey = wfMemcKey( 'password-throttle', wfGetIP(), md5( $username ) );
+ $throttleKey = wfMemcKey( 'password-throttle', $wgRequest->getIP(), md5( $username ) );
$count = $wgPasswordAttemptThrottle['count'];
$period = $wgPasswordAttemptThrottle['seconds'];
@@ -613,15 +639,16 @@ class LoginForm extends SpecialPage {
return $throttleCount;
}
- /*
+ /**
* Clear the login attempt throttle hit count for the (username,current IP) tuple.
* @param $username string The user name
* @return void
*/
public static function clearLoginThrottle( $username ) {
- global $wgMemc;
+ global $wgMemc, $wgRequest;
+ $username = trim( $username ); // sanity
- $throttleKey = wfMemcKey( 'password-throttle', wfGetIP(), md5( $username ) );
+ $throttleKey = wfMemcKey( 'password-throttle', $wgRequest->getIP(), md5( $username ) );
$wgMemc->delete( $throttleKey );
}
@@ -634,9 +661,9 @@ class LoginForm extends SpecialPage {
* @return integer Status code
*/
function attemptAutoCreate( $user ) {
- global $wgAuth, $wgUser, $wgAutocreatePolicy;
+ global $wgAuth, $wgAutocreatePolicy;
- if ( $wgUser->isBlockedFromCreateAccount() ) {
+ if ( $this->getUser()->isBlockedFromCreateAccount() ) {
wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
return self::CREATE_BLOCKED;
}
@@ -684,32 +711,34 @@ class LoginForm extends SpecialPage {
}
function processLogin() {
- global $wgUser;
+ global $wgMemc, $wgLang;
switch ( $this->authenticateUserData() ) {
case self::SUCCESS:
# We've verified now, update the real record
- if( (bool)$this->mRemember != (bool)$wgUser->getOption( 'rememberpassword' ) ) {
- $wgUser->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
- $wgUser->saveSettings();
+ $user = $this->getUser();
+ if( (bool)$this->mRemember != (bool)$user->getOption( 'rememberpassword' ) ) {
+ $user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
+ $user->saveSettings();
} else {
- $wgUser->invalidateCache();
+ $user->invalidateCache();
}
- $wgUser->setCookies();
+ $user->setCookies();
self::clearLoginToken();
// Reset the throttle
- $key = wfMemcKey( 'password-throttle', wfGetIP(), md5( $this->mUsername ) );
- global $wgMemc;
+ $request = $this->getRequest();
+ $key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
$wgMemc->delete( $key );
if( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
/* Replace the language object to provide user interface in
* correct language immediately on this first page load.
*/
- global $wgLang, $wgRequest;
- $code = $wgRequest->getVal( 'uselang', $wgUser->getOption( 'language' ) );
- $wgLang = Language::factory( $code );
+ $code = $request->getVal( 'uselang', $user->getOption( 'language' ) );
+ $userLang = Language::factory( $code );
+ $wgLang = $userLang;
+ $this->getContext()->setLanguage( $userLang );
return $this->successfulLogin();
} else {
return $this->cookieRedirectCheck( 'login' );
@@ -717,48 +746,48 @@ class LoginForm extends SpecialPage {
break;
case self::NEED_TOKEN:
- $this->mainLoginForm( wfMsgExt( 'nocookiesforlogin', array( 'parseinline' ) ) );
+ $this->mainLoginForm( $this->msg( 'nocookiesforlogin' )->parse() );
break;
case self::WRONG_TOKEN:
- $this->mainLoginForm( wfMsg( 'sessionfailure' ) );
+ $this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
break;
case self::NO_NAME:
case self::ILLEGAL:
- $this->mainLoginForm( wfMsg( 'noname' ) );
+ $this->mainLoginForm( $this->msg( 'noname' )->text() );
break;
case self::WRONG_PLUGIN_PASS:
- $this->mainLoginForm( wfMsg( 'wrongpassword' ) );
+ $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
break;
case self::NOT_EXISTS:
- if( $wgUser->isAllowed( 'createaccount' ) ) {
- $this->mainLoginForm( wfMsgExt( 'nosuchuser', 'parseinline',
- wfEscapeWikiText( $this->mUsername ) ) );
+ if( $this->getUser()->isAllowed( 'createaccount' ) ) {
+ $this->mainLoginForm( $this->msg( 'nosuchuser',
+ wfEscapeWikiText( $this->mUsername ) )->parse() );
} else {
- $this->mainLoginForm( wfMsg( 'nosuchusershort',
- wfEscapeWikiText( $this->mUsername ) ) );
+ $this->mainLoginForm( $this->msg( 'nosuchusershort',
+ wfEscapeWikiText( $this->mUsername ) )->text() );
}
break;
case self::WRONG_PASS:
- $this->mainLoginForm( wfMsg( 'wrongpassword' ) );
+ $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
break;
case self::EMPTY_PASS:
- $this->mainLoginForm( wfMsg( 'wrongpasswordempty' ) );
+ $this->mainLoginForm( $this->msg( 'wrongpasswordempty' )->text() );
break;
case self::RESET_PASS:
- $this->resetLoginForm( wfMsg( 'resetpass_announce' ) );
+ $this->resetLoginForm( $this->msg( 'resetpass_announce' )->text() );
break;
case self::CREATE_BLOCKED:
- $this->userBlockedMessage( $wgUser->mBlock );
+ $this->userBlockedMessage( $this->getUser()->mBlock );
break;
case self::THROTTLED:
- $this->mainLoginForm( wfMsg( 'login-throttled' ) );
+ $this->mainLoginForm( $this->msg( 'login-throttled' )->text() );
break;
case self::USER_BLOCKED:
- $this->mainLoginForm( wfMsgExt( 'login-userblocked',
- array( 'parsemag', 'escape' ), $this->mUsername ) );
+ $this->mainLoginForm( $this->msg( 'login-userblocked',
+ $this->mUsername )->escaped() );
break;
case self::ABORTED:
- $this->mainLoginForm( wfMsg( $this->mAbortLoginErrorMsg ) );
+ $this->mainLoginForm( $this->msg( $this->mAbortLoginErrorMsg )->text() );
break;
default:
throw new MWException( 'Unhandled case value' );
@@ -766,9 +795,9 @@ class LoginForm extends SpecialPage {
}
function resetLoginForm( $error ) {
- global $wgOut;
- $wgOut->addHTML( Xml::element('p', array( 'class' => 'error' ), $error ) );
+ $this->getOutput()->addHTML( Xml::element('p', array( 'class' => 'error' ), $error ) );
$reset = new SpecialChangePassword();
+ $reset->setContext( $this->getContext() );
$reset->execute( null );
}
@@ -778,28 +807,28 @@ class LoginForm extends SpecialPage {
* @param $emailTitle String: message name of email title
* @param $emailText String: message name of email text
* @return Status object
- * @private
*/
function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle', $emailText = 'passwordremindertext' ) {
- global $wgServer, $wgScript, $wgUser, $wgNewPasswordExpiry;
+ global $wgServer, $wgScript, $wgNewPasswordExpiry;
if ( $u->getEmail() == '' ) {
return Status::newFatal( 'noemail', $u->getName() );
}
- $ip = wfGetIP();
+ $ip = $this->getRequest()->getIP();
if( !$ip ) {
return Status::newFatal( 'badipaddress' );
}
- wfRunHooks( 'User::mailPasswordInternal', array( &$wgUser, &$ip, &$u ) );
+ $currentUser = $this->getUser();
+ wfRunHooks( 'User::mailPasswordInternal', array( &$currentUser, &$ip, &$u ) );
$np = $u->randomPassword();
$u->setNewpassword( $np, $throttle );
$u->saveSettings();
$userLanguage = $u->getOption( 'language' );
- $m = wfMsgExt( $emailText, array( 'parsemag', 'language' => $userLanguage ), $ip, $u->getName(), $np,
- $wgServer . $wgScript, round( $wgNewPasswordExpiry / 86400 ) );
- $result = $u->sendMail( wfMsgExt( $emailTitle, array( 'parsemag', 'language' => $userLanguage ) ), $m );
+ $m = $this->msg( $emailText, $ip, $u->getName(), $np, $wgServer . $wgScript,
+ round( $wgNewPasswordExpiry / 86400 ) )->inLanguage( $userLanguage )->text();
+ $result = $u->sendMail( $this->msg( $emailTitle )->inLanguage( $userLanguage )->text(), $m );
return $result;
}
@@ -816,11 +845,10 @@ class LoginForm extends SpecialPage {
* @private
*/
function successfulLogin() {
- global $wgUser, $wgOut;
-
# Run any hooks; display injected HTML if any, else redirect
+ $currentUser = $this->getUser();
$injected_html = '';
- wfRunHooks( 'UserLoginComplete', array( &$wgUser, &$injected_html ) );
+ wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
if( $injected_html !== '' ) {
$this->displaySuccessfulLogin( 'loginsuccess', $injected_html );
@@ -834,7 +862,7 @@ class LoginForm extends SpecialPage {
if( $wgSecureLogin && !$this->mStickHTTPS ) {
$redirectUrl = preg_replace( '/^https:/', 'http:', $redirectUrl );
}
- $wgOut->redirect( $redirectUrl );
+ $this->getOutput()->redirect( $redirectUrl );
}
}
@@ -845,14 +873,18 @@ class LoginForm extends SpecialPage {
* @private
*/
function successfulCreation() {
- global $wgUser;
# Run any hooks; display injected HTML
+ $currentUser = $this->getUser();
$injected_html = '';
$welcome_creation_msg = 'welcomecreation';
- wfRunHooks( 'UserLoginComplete', array( &$wgUser, &$injected_html ) );
+ wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
- //let any extensions change what message is shown
+ /**
+ * Let any extensions change what message is shown.
+ * @see https://www.mediawiki.org/wiki/Manual:Hooks/BeforeWelcomeCreation
+ * @since 1.18
+ */
wfRunHooks( 'BeforeWelcomeCreation', array( &$welcome_creation_msg, &$injected_html ) );
$this->displaySuccessfulLogin( $welcome_creation_msg, $injected_html );
@@ -862,19 +894,18 @@ class LoginForm extends SpecialPage {
* Display a "login successful" page.
*/
private function displaySuccessfulLogin( $msgname, $injected_html ) {
- global $wgOut, $wgUser;
-
- $wgOut->setPageTitle( wfMsg( 'loginsuccesstitle' ) );
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'loginsuccesstitle' ) );
if( $msgname ){
- $wgOut->addWikiMsg( $msgname, wfEscapeWikiText( $wgUser->getName() ) );
+ $out->addWikiMsg( $msgname, wfEscapeWikiText( $this->getUser()->getName() ) );
}
- $wgOut->addHTML( $injected_html );
+ $out->addHTML( $injected_html );
if ( !empty( $this->mReturnTo ) ) {
- $wgOut->returnToMain( null, $this->mReturnTo, $this->mReturnToQuery );
+ $out->returnToMain( null, $this->mReturnTo, $this->mReturnToQuery );
} else {
- $wgOut->returnToMain( null );
+ $out->returnToMain( null );
}
}
@@ -886,8 +917,6 @@ class LoginForm extends SpecialPage {
* @param $block Block the block causing this error
*/
function userBlockedMessage( Block $block ) {
- global $wgOut;
-
# Let's be nice about this, it's likely that this feature will be used
# for blocking large numbers of innocent people, e.g. range blocks on
# schools. Don't blame it on the user. There's a small chance that it
@@ -896,56 +925,56 @@ class LoginForm extends SpecialPage {
# evade it, but we'll leave that to their guilty conscience to figure
# out.
- $wgOut->setPageTitle( wfMsg( 'cantcreateaccounttitle' ) );
+ $out = $this->getOutput();
+ $out->setPageTitle( $this->msg( 'cantcreateaccounttitle' ) );
$block_reason = $block->mReason;
if ( strval( $block_reason ) === '' ) {
- $block_reason = wfMsg( 'blockednoreason' );
+ $block_reason = $this->msg( 'blockednoreason' )->text();
}
- $wgOut->addWikiMsg(
+ $out->addWikiMsg(
'cantcreateaccount-text',
$block->getTarget(),
$block_reason,
- $block->getBlocker()->getName()
+ $block->getByName()
);
- $wgOut->returnToMain( false );
+ $out->returnToMain( false );
}
/**
* @private
*/
function mainLoginForm( $msg, $msgtype = 'error' ) {
- global $wgUser, $wgOut, $wgHiddenPrefs;
global $wgEnableEmail, $wgEnableUserEmail;
- global $wgRequest, $wgLoginLanguageSelector;
+ global $wgHiddenPrefs, $wgLoginLanguageSelector;
global $wgAuth, $wgEmailConfirmToEdit, $wgCookieExpiration;
global $wgSecureLogin, $wgPasswordResetRoutes;
- $titleObj = SpecialPage::getTitleFor( 'Userlogin' );
+ $titleObj = $this->getTitle();
+ $user = $this->getUser();
if ( $this->mType == 'signup' ) {
// Block signup here if in readonly. Keeps user from
// going through the process (filling out data, etc)
// and being informed later.
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- } elseif ( $wgUser->isBlockedFromCreateAccount() ) {
- $this->userBlockedMessage( $wgUser->isBlockedFromCreateAccount() );
- return;
- } elseif ( count( $permErrors = $titleObj->getUserPermissionsErrors( 'createaccount', $wgUser, true ) )>0 ) {
- $wgOut->showPermissionsErrorPage( $permErrors, 'createaccount' );
+ $permErrors = $titleObj->getUserPermissionsErrors( 'createaccount', $user, true );
+ if ( count( $permErrors ) ) {
+ throw new PermissionsError( 'createaccount', $permErrors );
+ } elseif ( $user->isBlockedFromCreateAccount() ) {
+ $this->userBlockedMessage( $user->isBlockedFromCreateAccount() );
return;
+ } elseif ( wfReadOnly() ) {
+ throw new ReadOnlyError;
}
}
if ( $this->mUsername == '' ) {
- if ( $wgUser->isLoggedIn() ) {
- $this->mUsername = $wgUser->getName();
+ if ( $user->isLoggedIn() ) {
+ $this->mUsername = $user->getName();
} else {
- $this->mUsername = $wgRequest->getCookie( 'UserName' );
+ $this->mUsername = $this->getRequest()->getCookie( 'UserName' );
}
}
@@ -971,18 +1000,16 @@ class LoginForm extends SpecialPage {
$linkq .= $returnto;
}
- # Pass any language selection on to the mode switch link
- if( $wgLoginLanguageSelector && $this->mLanguage ) {
- $linkq .= '&uselang=' . $this->mLanguage;
- }
-
- $link = '<a href="' . htmlspecialchars ( $titleObj->getLocalURL( $linkq ) ) . '">';
- $link .= wfMsgHtml( $linkmsg . 'link' ); # Calling either 'gotaccountlink' or 'nologinlink'
- $link .= '</a>';
-
# Don't show a "create account" link if the user can't
- if( $this->showCreateOrLoginLink( $wgUser ) ) {
- $template->set( 'link', wfMsgExt( $linkmsg, array( 'parseinline', 'replaceafter' ), $link ) );
+ if( $this->showCreateOrLoginLink( $user ) ) {
+ # Pass any language selection on to the mode switch link
+ 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() );
} else {
$template->set( 'link', '' );
}
@@ -1003,7 +1030,7 @@ class LoginForm extends SpecialPage {
$template->set( 'action', $titleObj->getLocalURL( $q ) );
$template->set( 'message', $msg );
$template->set( 'messagetype', $msgtype );
- $template->set( 'createemail', $wgEnableEmail && $wgUser->isLoggedIn() );
+ $template->set( 'createemail', $wgEnableEmail && $user->isLoggedIn() );
$template->set( 'userealname', !in_array( 'realname', $wgHiddenPrefs ) );
$template->set( 'useemail', $wgEnableEmail );
$template->set( 'emailrequired', $wgEmailConfirmToEdit );
@@ -1011,8 +1038,8 @@ class LoginForm extends SpecialPage {
$template->set( 'canreset', $wgAuth->allowPasswordChange() );
$template->set( 'resetlink', $resetLink );
$template->set( 'canremember', ( $wgCookieExpiration > 0 ) );
- $template->set( 'usereason', $wgUser->isLoggedIn() );
- $template->set( 'remember', $wgUser->getOption( 'rememberpassword' ) || $this->mRemember );
+ $template->set( 'usereason', $user->isLoggedIn() );
+ $template->set( 'remember', $user->getOption( 'rememberpassword' ) || $this->mRemember );
$template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
$template->set( 'stickHTTPS', $this->mStickHTTPS );
@@ -1031,24 +1058,25 @@ class LoginForm extends SpecialPage {
# Prepare language selection links as needed
if( $wgLoginLanguageSelector ) {
$template->set( 'languages', $this->makeLanguageSelector() );
- if( $this->mLanguage )
+ if( $this->mLanguage ) {
$template->set( 'uselang', $this->mLanguage );
+ }
}
-
+
// Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
// Ditto for signupend
$usingHTTPS = WebRequest::detectProtocol() == 'https';
- $loginendHTTPS = wfMessage( 'loginend-https' );
- $signupendHTTPS = wfMessage( 'signupend-https' );
+ $loginendHTTPS = $this->msg( 'loginend-https' );
+ $signupendHTTPS = $this->msg( 'signupend-https' );
if ( $usingHTTPS && !$loginendHTTPS->isBlank() ) {
$template->set( 'loginend', $loginendHTTPS->parse() );
} else {
- $template->set( 'loginend', wfMessage( 'loginend' )->parse() );
+ $template->set( 'loginend', $this->msg( 'loginend' )->parse() );
}
if ( $usingHTTPS && !$signupendHTTPS->isBlank() ) {
$template->set( 'signupend', $signupendHTTPS->parse() );
} else {
- $template->set( 'signupend', wfMessage( 'signupend' )->parse() );
+ $template->set( 'signupend', $this->msg( 'signupend' )->parse() );
}
// Give authentication and captcha plugins a chance to modify the form
@@ -1059,15 +1087,9 @@ class LoginForm extends SpecialPage {
wfRunHooks( 'UserLoginForm', array( &$template ) );
}
- // Changes the title depending on permissions for creating account
- if ( $wgUser->isAllowed( 'createaccount' ) ) {
- $wgOut->setPageTitle( wfMsg( 'userlogin' ) );
- } else {
- $wgOut->setPageTitle( wfMsg( 'userloginnocreate' ) );
- }
-
- $wgOut->disallowUserJs(); // just in case...
- $wgOut->addTemplate( $template );
+ $out = $this->getOutput();
+ $out->disallowUserJs(); // just in case...
+ $out->addTemplate( $template );
}
/**
@@ -1097,8 +1119,8 @@ class LoginForm extends SpecialPage {
* @private
*/
function hasSessionCookie() {
- global $wgDisableCookieCheck, $wgRequest;
- return $wgDisableCookieCheck ? true : $wgRequest->checkSessionCookie();
+ global $wgDisableCookieCheck;
+ return $wgDisableCookieCheck ? true : $this->getRequest()->checkSessionCookie();
}
/**
@@ -1155,8 +1177,6 @@ class LoginForm extends SpecialPage {
* @private
*/
function cookieRedirectCheck( $type ) {
- global $wgOut;
-
$titleObj = SpecialPage::getTitleFor( 'Userlogin' );
$query = array( 'wpCookieCheck' => $type );
if ( $this->mReturnTo ) {
@@ -1164,7 +1184,7 @@ class LoginForm extends SpecialPage {
}
$check = $titleObj->getFullURL( $query );
- return $wgOut->redirect( $check );
+ return $this->getOutput()->redirect( $check );
}
/**
@@ -1173,12 +1193,12 @@ class LoginForm extends SpecialPage {
function onCookieRedirectCheck( $type ) {
if ( !$this->hasSessionCookie() ) {
if ( $type == 'new' ) {
- return $this->mainLoginForm( wfMsgExt( 'nocookiesnew', array( 'parseinline' ) ) );
+ return $this->mainLoginForm( $this->msg( 'nocookiesnew' )->parse() );
} elseif ( $type == 'login' ) {
- return $this->mainLoginForm( wfMsgExt( 'nocookieslogin', array( 'parseinline' ) ) );
+ return $this->mainLoginForm( $this->msg( 'nocookieslogin' )->parse() );
} else {
# shouldn't happen
- return $this->mainLoginForm( wfMsg( 'error' ) );
+ return $this->mainLoginForm( $this->msg( 'error' )->text() );
}
} else {
return $this->successfulLogin();
@@ -1189,7 +1209,7 @@ class LoginForm extends SpecialPage {
* @private
*/
function throttleHit( $limit ) {
- $this->mainLoginForm( wfMsgExt( 'acct_creation_throttle_hit', array( 'parseinline' ), $limit ) );
+ $this->mainLoginForm( $this->msg( 'acct_creation_throttle_hit' )->numParams( $limit )->parse() );
}
/**
@@ -1199,9 +1219,7 @@ class LoginForm extends SpecialPage {
* @return string
*/
function makeLanguageSelector() {
- global $wgLang;
-
- $msg = wfMessage( 'loginlanguagelinks' )->inContentLanguage();
+ $msg = $this->msg( 'loginlanguagelinks' )->inContentLanguage();
if( !$msg->isBlank() ) {
$langs = explode( "\n", $msg->text() );
$links = array();
@@ -1212,7 +1230,8 @@ class LoginForm extends SpecialPage {
$links[] = $this->makeLanguageSelectorLink( $parts[0], trim( $parts[1] ) );
}
}
- return count( $links ) > 0 ? wfMsgHtml( 'loginlanguagelabel', $wgLang->pipeList( $links ) ) : '';
+ return count( $links ) > 0 ? $this->msg( 'loginlanguagelabel' )->rawParams(
+ $this->getLanguage()->pipeList( $links ) )->escaped() : '';
} else {
return '';
}
@@ -1226,7 +1245,6 @@ class LoginForm extends SpecialPage {
* @param $lang Language code
*/
function makeLanguageSelectorLink( $text, $lang ) {
- $self = SpecialPage::getTitleFor( 'Userlogin' );
$attr = array( 'uselang' => $lang );
if( $this->mType == 'signup' ) {
$attr['type'] = 'signup';
@@ -1235,7 +1253,7 @@ class LoginForm extends SpecialPage {
$attr['returnto'] = $this->mReturnTo;
}
return Linker::linkKnown(
- $self,
+ $this->getTitle(),
htmlspecialchars( $text ),
array(),
$attr
diff --git a/includes/specials/SpecialUserlogout.php b/includes/specials/SpecialUserlogout.php
index 39b5b284..d747448f 100644
--- a/includes/specials/SpecialUserlogout.php
+++ b/includes/specials/SpecialUserlogout.php
@@ -1,6 +1,6 @@
<?php
/**
- * Implements Special:Upload
+ * Implements Special:Userlogout
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,31 +33,30 @@ class SpecialUserlogout extends UnlistedSpecialPage {
}
function execute( $par ) {
- global $wgUser, $wgOut;
-
/**
* Some satellite ISPs use broken precaching schemes that log people out straight after
* they're logged in (bug 17790). Luckily, there's a way to detect such requests.
*/
if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
wfDebug( "Special:Userlogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
- wfHttpError( 400, wfMsg( 'loginerror' ), wfMsg( 'suspicious-userlogout' ) );
- return;
+ throw new HttpError( 400, wfMessage( 'suspicious-userlogout' ), wfMessage( 'loginerror' ) );
}
$this->setHeaders();
$this->outputHeader();
- $oldName = $wgUser->getName();
- $wgUser->logout();
+ $user = $this->getUser();
+ $oldName = $user->getName();
+ $user->logout();
- $wgOut->addWikiMsg( 'logouttext' );
+ $out = $this->getOutput();
+ $out->addWikiMsg( 'logouttext' );
// Hook.
$injected_html = '';
- wfRunHooks( 'UserLogoutComplete', array( &$wgUser, &$injected_html, $oldName ) );
- $wgOut->addHTML( $injected_html );
+ wfRunHooks( 'UserLogoutComplete', array( &$user, &$injected_html, $oldName ) );
+ $out->addHTML( $injected_html );
- $wgOut->returnToMain();
+ $out->returnToMain();
}
}
diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php
index 4de048c0..e2e0f38b 100644
--- a/includes/specials/SpecialUserrights.php
+++ b/includes/specials/SpecialUserrights.php
@@ -63,22 +63,24 @@ class UserrightsPage extends SpecialPage {
public function execute( $par ) {
// If the visitor doesn't have permissions to assign or remove
// any groups, it's a bit silly to give them the user search prompt.
- global $wgUser, $wgRequest, $wgOut;
- if( $par !== null ) {
- $this->mTarget = $par;
- } else {
- $this->mTarget = $wgRequest->getVal( 'user' );
- }
+ $user = $this->getUser();
/*
* If the user is blocked and they only have "partial" access
* (e.g. they don't have the userrights permission), then don't
* allow them to use Special:UserRights.
*/
- if( $wgUser->isBlocked() && !$wgUser->isAllowed( 'userrights' ) ) {
- $wgOut->blockedPage();
- return;
+ if( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
+ throw new UserBlockedError( $user->mBlock );
+ }
+
+ $request = $this->getRequest();
+
+ if( $par !== null ) {
+ $this->mTarget = $par;
+ } else {
+ $this->mTarget = $request->getVal( 'user' );
}
$available = $this->changeableGroups();
@@ -90,49 +92,44 @@ class UserrightsPage extends SpecialPage {
* target.
*/
if ( !count( $available['add'] ) && !count( $available['remove'] ) )
- $this->mTarget = $wgUser->getName();
+ $this->mTarget = $user->getName();
}
- if ( User::getCanonicalName( $this->mTarget ) == $wgUser->getName() ) {
+ if ( User::getCanonicalName( $this->mTarget ) == $user->getName() ) {
$this->isself = true;
}
- if( !$this->userCanChangeRights( $wgUser, true ) ) {
+ if( !$this->userCanChangeRights( $user, true ) ) {
// @todo FIXME: There may be intermediate groups we can mention.
- $wgOut->showPermissionsErrorPage( array( array(
- $wgUser->isAnon()
- ? 'userrights-nologin'
- : 'userrights-notallowed' ) ) );
- return;
+ $msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
+ throw new PermissionsError( null, array( array( $msg ) ) );
}
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
+ $this->checkReadOnly();
- $this->outputHeader();
- $wgOut->addModuleStyles( 'mediawiki.special' );
$this->setHeaders();
+ $this->outputHeader();
+
+ $out = $this->getOutput();
+ $out->addModuleStyles( 'mediawiki.special' );
// show the general form
if ( count( $available['add'] ) || count( $available['remove'] ) ) {
$this->switchForm();
}
- if( $wgRequest->wasPosted() ) {
+ if( $request->wasPosted() ) {
// save settings
- if( $wgRequest->getCheck( 'saveusergroups' ) ) {
- $reason = $wgRequest->getVal( 'user-reason' );
- $tok = $wgRequest->getVal( 'wpEditToken' );
- if( $wgUser->matchEditToken( $tok, $this->mTarget ) ) {
+ if( $request->getCheck( 'saveusergroups' ) ) {
+ $reason = $request->getVal( 'user-reason' );
+ $tok = $request->getVal( 'wpEditToken' );
+ if( $user->matchEditToken( $tok, $this->mTarget ) ) {
$this->saveUserGroups(
$this->mTarget,
$reason
);
- $url = $this->getSuccessURL();
- $wgOut->redirect( $url );
+ $out->redirect( $this->getSuccessURL() );
return;
}
}
@@ -157,11 +154,9 @@ class UserrightsPage extends SpecialPage {
* @return null
*/
function saveUserGroups( $username, $reason = '' ) {
- global $wgRequest, $wgOut;
-
$status = $this->fetchUser( $username );
if( !$status->isOK() ) {
- $wgOut->addWikiText( $status->getWikiText() );
+ $this->getOutput()->addWikiText( $status->getWikiText() );
return;
} else {
$user = $status->value;
@@ -176,7 +171,7 @@ class UserrightsPage extends SpecialPage {
foreach ( $allgroups as $group ) {
// We'll tell it to remove all unchecked groups, and add all checked groups.
// Later on, this gets filtered for what can actually be removed
- if ( $wgRequest->getCheck( "wpGroup-$group" ) ) {
+ if ( $this->getRequest()->getCheck( "wpGroup-$group" ) ) {
$addgroup[] = $group;
} else {
$removegroup[] = $group;
@@ -196,10 +191,8 @@ class UserrightsPage extends SpecialPage {
* @return Array: Tuple of added, then removed groups
*/
function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
- global $wgUser;
-
// Validate input set...
- $isself = ( $user->getName() == $wgUser->getName() );
+ $isself = ( $user->getName() == $this->getUser()->getName() );
$groups = $user->getGroups();
$changeable = $this->changeableGroups();
$addable = array_merge( $changeable['add'], $isself ? $changeable['add-self'] : array() );
@@ -265,11 +258,9 @@ class UserrightsPage extends SpecialPage {
* @param $username String: name of the user.
*/
function editUserGroupsForm( $username ) {
- global $wgOut;
-
$status = $this->fetchUser( $username );
if( !$status->isOK() ) {
- $wgOut->addWikiText( $status->getWikiText() );
+ $this->getOutput()->addWikiText( $status->getWikiText() );
return;
} else {
$user = $status->value;
@@ -281,7 +272,7 @@ class UserrightsPage extends SpecialPage {
// This isn't really ideal logging behavior, but let's not hide the
// interwiki logs if we're using them as is.
- $this->showLogFragment( $user, $wgOut );
+ $this->showLogFragment( $user, $this->getOutput() );
}
/**
@@ -292,7 +283,7 @@ class UserrightsPage extends SpecialPage {
* @return Status object
*/
public function fetchUser( $username ) {
- global $wgUser, $wgUserrightsInterwikiDelimiter;
+ global $wgUserrightsInterwikiDelimiter;
$parts = explode( $wgUserrightsInterwikiDelimiter, $username );
if( count( $parts ) < 2 ) {
@@ -304,7 +295,7 @@ class UserrightsPage extends SpecialPage {
if( $database == wfWikiID() ) {
$database = '';
} else {
- if( !$wgUser->isAllowed( 'userrights-interwiki' ) ) {
+ if( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
return Status::newFatal( 'userrights-no-interwiki' );
}
if( !UserRightsProxy::validDatabase( $database ) ) {
@@ -372,8 +363,8 @@ class UserrightsPage extends SpecialPage {
* Output a form to allow searching for a user
*/
function switchForm() {
- global $wgOut, $wgScript;
- $wgOut->addHTML(
+ global $wgScript;
+ $this->getOutput()->addHTML(
Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::fieldset( wfMsg( 'userrights-lookup-user' ) ) .
@@ -414,8 +405,6 @@ class UserrightsPage extends SpecialPage {
* @param $groups Array: Array of groups the user is in
*/
protected function showEditUserGroupsForm( $user, $groups ) {
- global $wgOut, $wgUser, $wgLang, $wgRequest;
-
$list = array();
foreach( $groups as $group ) {
$list[] = self::buildGroupLink( $group );
@@ -432,30 +421,38 @@ class UserrightsPage extends SpecialPage {
$count = count( $list );
if( $count > 0 ) {
$grouplist = wfMessage( 'userrights-groupsmember', $count)->parse();
- $grouplist = '<p>' . $grouplist . ' ' . $wgLang->listToText( $list ) . "</p>\n";
+ $grouplist = '<p>' . $grouplist . ' ' . $this->getLanguage()->listToText( $list ) . "</p>\n";
}
$count = count( $autolist );
if( $count > 0 ) {
$autogrouplistintro = wfMessage( 'userrights-groupsmember-auto', $count)->parse();
- $grouplist .= '<p>' . $autogrouplistintro . ' ' . $wgLang->listToText( $autolist ) . "</p>\n";
+ $grouplist .= '<p>' . $autogrouplistintro . ' ' . $this->getLanguage()->listToText( $autolist ) . "</p>\n";
}
- $wgOut->addHTML(
+
+ $userToolLinks = Linker::userToolLinks(
+ $user->getId(),
+ $user->getName(),
+ false, /* default for redContribsWhenNoEdits */
+ Linker::TOOL_LINKS_EMAIL /* Add "send e-mail" link */
+ );
+
+ $this->getOutput()->addHTML(
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'name' => 'editGroup', 'id' => 'mw-userrights-form2' ) ) .
Html::hidden( 'user', $this->mTarget ) .
- Html::hidden( 'wpEditToken', $wgUser->editToken( $this->mTarget ) ) .
+ Html::hidden( 'wpEditToken', $this->getUser()->getEditToken( $this->mTarget ) ) .
Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', array(), wfMsg( 'userrights-editusergroup' ) ) .
- wfMsgExt( 'editinguser', array( 'parse' ), wfEscapeWikiText( $user->getName() ) ) .
- wfMsgExt( 'userrights-groups-help', array( 'parse' ) ) .
+ Xml::element( 'legend', array(), wfMessage( 'userrights-editusergroup', $user->getName() )->text() ) .
+ wfMessage( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )->rawParams( $userToolLinks )->parse() .
+ wfMessage( 'userrights-groups-help', $user->getName() )->parse() .
$grouplist .
- Xml::tags( 'p', null, $this->groupCheckboxes( $groups ) ) .
+ Xml::tags( 'p', null, $this->groupCheckboxes( $groups, $user ) ) .
Xml::openElement( 'table', array( 'border' => '0', 'id' => 'mw-userrights-table-outer' ) ) .
"<tr>
<td class='mw-label'>" .
Xml::label( wfMsg( 'userrights-reason' ), 'wpReason' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'user-reason', 60, $wgRequest->getVal( 'user-reason', false ),
+ Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ),
array( 'id' => 'wpReason', 'maxlength' => 255 ) ) .
"</td>
</tr>
@@ -496,10 +493,12 @@ class UserrightsPage extends SpecialPage {
/**
* Adds a table with checkboxes where you can select what groups to add/remove
*
+ * @todo Just pass the username string?
* @param $usergroups Array: groups the user belongs to
+ * @param $user User a user object
* @return string XHTML table element with checkboxes
*/
- private function groupCheckboxes( $usergroups ) {
+ private function groupCheckboxes( $usergroups, $user ) {
$allgroups = $this->getAllGroups();
$ret = '';
@@ -547,11 +546,11 @@ class UserrightsPage extends SpecialPage {
foreach( $column as $group => $checkbox ) {
$attr = $checkbox['disabled'] ? array( 'disabled' => 'disabled' ) : array();
+ $member = User::getGroupMember( $group, $user->getName() );
if ( $checkbox['irreversible'] ) {
- $text = htmlspecialchars( wfMsg( 'userrights-irreversible-marker',
- User::getGroupMember( $group ) ) );
+ $text = wfMessage( 'userrights-irreversible-marker', $member )->escaped();
} else {
- $text = htmlspecialchars( User::getGroupMember( $group ) );
+ $text = htmlspecialchars( $member );
}
$checkboxHtml = Xml::checkLabel( $text, "wpGroup-" . $group,
"wpGroup-" . $group, $checkbox['set'], $attr );
@@ -588,13 +587,12 @@ class UserrightsPage extends SpecialPage {
}
/**
- * Returns $wgUser->changeableGroups()
+ * Returns $this->getUser()->changeableGroups()
*
* @return Array array( 'add' => array( addablegroups ), 'remove' => array( removablegroups ) , 'add-self' => array( addablegroups to self), 'remove-self' => array( removable groups from self) )
*/
function changeableGroups() {
- global $wgUser;
- return $wgUser->changeableGroups();
+ return $this->getUser()->changeableGroups();
}
/**
@@ -605,6 +603,6 @@ class UserrightsPage extends SpecialPage {
*/
protected function showLogFragment( $user, $output ) {
$output->addHTML( Xml::element( 'h2', null, LogPage::logName( 'rights' ) . "\n" ) );
- LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage()->getPrefixedText() );
+ LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage() );
}
}
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php
index 0331f056..8185fe88 100644
--- a/includes/specials/SpecialVersion.php
+++ b/includes/specials/SpecialVersion.php
@@ -37,8 +37,7 @@ class SpecialVersion extends SpecialPage {
protected static $viewvcUrls = array(
'svn+ssh://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki',
'http://svn.wikimedia.org/svnroot/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki',
- # Doesn't work at the time of writing but maybe some day:
- 'https://svn.wikimedia.org/viewvc/mediawiki' => 'http://svn.wikimedia.org/viewvc/mediawiki',
+ 'https://svn.wikimedia.org/viewvc/mediawiki' => 'https://svn.wikimedia.org/viewvc/mediawiki',
);
public function __construct(){
@@ -49,11 +48,12 @@ class SpecialVersion extends SpecialPage {
* main()
*/
public function execute( $par ) {
- global $wgOut, $wgSpecialVersionShowHooks, $wgRequest;
+ global $wgSpecialVersionShowHooks;
$this->setHeaders();
$this->outputHeader();
- $wgOut->allowClickjacking();
+ $out = $this->getOutput();
+ $out->allowClickjacking();
$text =
$this->getMediaWikiCredits() .
@@ -63,10 +63,10 @@ class SpecialVersion extends SpecialPage {
$text .= $this->getWgHooks();
}
- $wgOut->addWikiText( $text );
- $wgOut->addHTML( $this->IPInfo() );
+ $out->addWikiText( $text );
+ $out->addHTML( $this->IPInfo() );
- if ( $wgRequest->getVal( 'easteregg' ) ) {
+ if ( $this->getRequest()->getVal( 'easteregg' ) ) {
if ( $this->showEasterEgg() ) {
// TODO: put something interesting here
}
@@ -106,7 +106,7 @@ class SpecialVersion extends SpecialPage {
'Aryeh Gregor', 'Aaron Schulz', 'Andrew Garrett', 'Raimond Spekking',
'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
- 'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Ashar Voultoiz',
+ 'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
wfMsg( 'version-poweredby-others' )
);
@@ -126,7 +126,7 @@ class SpecialVersion extends SpecialPage {
// be loaded here, so feel free to use wfMsg*() in the 'name'. Raw HTML or wikimarkup
// can be used.
$software = array();
- $software['[http://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
+ $software['[https://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
$software['[http://www.php.net/ PHP]'] = phpversion() . " (" . php_sapi_name() . ")";
$software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
@@ -143,7 +143,7 @@ class SpecialVersion extends SpecialPage {
foreach( $software as $name => $version ) {
$out .= "<tr>
<td>" . $name . "</td>
- <td class=\"ltr\">" . $version . "</td>
+ <td dir=\"ltr\">" . $version . "</td>
</tr>\n";
}
@@ -153,6 +153,7 @@ class SpecialVersion extends SpecialPage {
/**
* Return a string of the MediaWiki version with SVN revision if available.
*
+ * @param $flags String
* @return mixed
*/
public static function getVersion( $flags = '' ) {
@@ -357,18 +358,17 @@ class SpecialVersion extends SpecialPage {
* Callback to sort extensions by type.
*/
function compare( $a, $b ) {
- global $wgLang;
if( $a['name'] === $b['name'] ) {
return 0;
} else {
- return $wgLang->lc( $a['name'] ) > $wgLang->lc( $b['name'] )
+ return $this->getLanguage()->lc( $a['name'] ) > $this->getLanguage()->lc( $b['name'] )
? 1
: -1;
}
}
/**
- * Creates and formats the creidts for a single extension and returns this.
+ * Creates and formats the credits for a single extension and returns this.
*
* @param $extension Array
*
@@ -502,7 +502,7 @@ class SpecialVersion extends SpecialPage {
* @return String: HTML fragment
*/
private function IPInfo() {
- $ip = str_replace( '--', ' - ', htmlspecialchars( wfGetIP() ) );
+ $ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) );
return "<!-- visited from $ip -->\n" .
"<span style='display:none'>visited from $ip</span>";
}
@@ -542,11 +542,10 @@ class SpecialVersion extends SpecialPage {
} elseif ( $cnt == 0 ) {
return '';
} else {
- global $wgLang;
if ( $sort ) {
sort( $list );
}
- return $wgLang->listToText( array_map( array( __CLASS__, 'arrayToString' ), $list ) );
+ return $this->getLanguage()->listToText( array_map( array( __CLASS__, 'arrayToString' ), $list ) );
}
}
diff --git a/includes/specials/SpecialWantedcategories.php b/includes/specials/SpecialWantedcategories.php
index 800e940a..f497e4e2 100644
--- a/includes/specials/SpecialWantedcategories.php
+++ b/includes/specials/SpecialWantedcategories.php
@@ -54,14 +54,14 @@ class WantedCategoriesPage extends WantedQueryPage {
* @return string
*/
function formatResult( $skin, $result ) {
- global $wgLang, $wgContLang;
+ global $wgContLang;
$nt = Title::makeTitle( $result->namespace, $result->title );
$text = htmlspecialchars( $wgContLang->convert( $nt->getText() ) );
$plink = $this->isCached() ?
- $skin->link( $nt, $text ) :
- $skin->link(
+ Linker::link( $nt, $text ) :
+ Linker::link(
$nt,
$text,
array(),
@@ -69,8 +69,7 @@ class WantedCategoriesPage extends WantedQueryPage {
array( 'broken' )
);
- $nlinks = wfMsgExt( 'nmembers', array( 'parsemag', 'escape'),
- $wgLang->formatNum( $result->value ) );
- return wfSpecialList($plink, $nlinks);
+ $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
+ return $this->getLanguage()->specialList( $plink, $nlinks );
}
}
diff --git a/includes/specials/SpecialWantedfiles.php b/includes/specials/SpecialWantedfiles.php
index 8a4fe56f..ec0912df 100644
--- a/includes/specials/SpecialWantedfiles.php
+++ b/includes/specials/SpecialWantedfiles.php
@@ -35,6 +35,32 @@ class WantedFilesPage extends WantedQueryPage {
parent::__construct( $name );
}
+ function getPageHeader() {
+ # Specifically setting to use "Wanted Files" (NS_MAIN) as title, so as to get what
+ # category would be used on main namespace pages, for those tricky wikipedia
+ # admins who like to do {{#ifeq:{{NAMESPACE}}|foo|bar|....}}.
+ $catMessage = wfMessage( 'broken-file-category' )
+ ->title( Title::newFromText( "Wanted Files", NS_MAIN ) )
+ ->inContentLanguage();
+
+ if ( !$catMessage->isDisabled() ) {
+ $category = Title::makeTitleSafe( NS_CATEGORY, $catMessage->text() );
+ } else {
+ $category = false;
+ }
+
+ if ( $category ) {
+ return $this
+ ->msg( 'wantedfiletext-cat' )
+ ->params( $category->getFullText() )
+ ->parseAsBlock();
+ } else {
+ return $this
+ ->msg( 'wantedfiletext-nocat' )
+ ->parseAsBlock();
+ }
+ }
+
/**
* KLUGE: The results may contain false positives for files
* that exist e.g. in a shared repo. Setting this at least
diff --git a/includes/specials/SpecialWantedpages.php b/includes/specials/SpecialWantedpages.php
index a4233155..4624b355 100644
--- a/includes/specials/SpecialWantedpages.php
+++ b/includes/specials/SpecialWantedpages.php
@@ -27,9 +27,10 @@
* @ingroup SpecialPage
*/
class WantedPagesPage extends WantedQueryPage {
+
function __construct( $name = 'Wantedpages' ) {
parent::__construct( $name );
- $this->includable( true );
+ $this->mIncludable = true;
}
function execute( $par ) {
@@ -39,12 +40,12 @@ class WantedPagesPage extends WantedQueryPage {
$parts = explode( '/', $par, 2 );
$this->limit = (int)$parts[0];
// @todo FIXME: nlinks is ignored
- $nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
+ //$nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
$this->offset = 0;
} else {
- $nlinks = true;
+ //$nlinks = true;
}
- $this->setListOutput( $inc );
+ $this->setListoutput( $inc );
$this->shownavigation = !$inc;
parent::execute( $par );
}
diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php
index fd562be4..fef54911 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -40,6 +40,20 @@ class SpecialWatchlist extends SpecialPage {
$user = $this->getUser();
$output = $this->getOutput();
+ # Anons don't get a watchlist
+ if( $user->isAnon() ) {
+ $output->setPageTitle( $this->msg( 'watchnologin' ) );
+ $output->setRobotPolicy( 'noindex,nofollow' );
+ $llink = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Userlogin' ),
+ $this->msg( 'loginreqlink' )->escaped(),
+ array(),
+ array( 'returnto' => $this->getTitle()->getPrefixedText() )
+ );
+ $output->addHTML( $this->msg( 'watchlistanontext' )->rawParams( $llink )->parse() );
+ return;
+ }
+
// Add feed links
$wlToken = $user->getOption( 'watchlisttoken' );
if ( !$wlToken ) {
@@ -51,31 +65,11 @@ class SpecialWatchlist extends SpecialPage {
$this->addFeedLinks( array( 'action' => 'feedwatchlist', 'allrev' => 'allrev',
'wlowner' => $user->getName(), 'wltoken' => $wlToken ) );
- $output->setRobotPolicy( 'noindex,nofollow' );
-
- # Anons don't get a watchlist
- if( $user->isAnon() ) {
- $output->setPageTitle( wfMsg( 'watchnologin' ) );
- $llink = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Userlogin' ),
- wfMsgHtml( 'loginreqlink' ),
- array(),
- array( 'returnto' => $this->getTitle()->getPrefixedText() )
- );
- $output->addHTML( wfMessage( 'watchlistanontext' )->rawParams( $llink )->parse() );
- return;
- }
-
$this->setHeaders();
$this->outputHeader();
- $sub = wfMsgExt(
- 'watchlistfor2',
- array( 'parseinline', 'replaceafter' ),
- $user->getName(),
- SpecialEditWatchlist::buildTools( $this->getSkin() )
- );
- $output->setSubtitle( $sub );
+ $output->addSubtitle( $this->msg( 'watchlistfor2', $user->getName()
+ )->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
$request = $this->getRequest();
@@ -245,23 +239,21 @@ class SpecialWatchlist extends SpecialPage {
$output->showLagWarning( $lag );
}
- $lang = $this->getLang();
-
# Create output form
- $form = Xml::fieldset( wfMsg( 'watchlist-options' ), false, array( 'id' => 'mw-watchlist-options' ) );
+ $form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
# Show watchlist header
- $form .= wfMsgExt( 'watchlist-details', array( 'parseinline' ), $lang->formatNum( $nitems ) );
+ $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse();
if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
- $form .= wfMsgExt( 'wlheader-enotif', 'parse' ) . "\n";
+ $form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
}
if( $wgShowUpdatedMarker ) {
$form .= Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalUrl(),
'id' => 'mw-watchlist-resetbutton' ) ) .
- wfMsgExt( 'wlheader-showupdated', array( 'parseinline' ) ) . ' ' .
- Xml::submitButton( wfMsg( 'enotif_reset' ), array( 'name' => 'dummy' ) ) .
+ $this->msg( 'wlheader-showupdated' )->parse() . ' ' .
+ Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) .
Html::hidden( 'reset', 'all' ) .
Xml::closeElement( 'form' );
}
@@ -297,21 +289,12 @@ class SpecialWatchlist extends SpecialPage {
/* Start bottom header */
+ $lang = $this->getLanguage();
$wlInfo = '';
- if( $values['days'] >= 1 ) {
+ if( $values['days'] > 0 ) {
$timestamp = wfTimestampNow();
- $wlInfo = wfMsgExt( 'rcnote', 'parseinline',
- $lang->formatNum( $numRows ),
- $lang->formatNum( $values['days'] ),
- $lang->timeAndDate( $timestamp, true ),
- $lang->date( $timestamp, true ),
- $lang->time( $timestamp, true )
- ) . '<br />';
- } elseif( $values['days'] > 0 ) {
- $wlInfo = wfMsgExt( 'wlnote', 'parseinline',
- $lang->formatNum( $numRows ),
- $lang->formatNum( round( $values['days'] * 24 ) )
- ) . '<br />';
+ $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
+ $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . '<br />';
}
$cutofflinks = "\n" . $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
@@ -344,10 +327,10 @@ class SpecialWatchlist extends SpecialPage {
$form .= $lang->pipeList( $links );
$form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) );
$form .= '<hr /><p>';
- $form .= Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&#160;';
+ $form .= Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) . '&#160;';
$form .= Xml::namespaceSelector( $nameSpace, '' ) . '&#160;';
- $form .= Xml::checkLabel( wfMsg('invert'), 'invert', 'nsinvert', $invert ) . '&#160;';
- $form .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . '</p>';
+ $form .= Xml::checkLabel( $this->msg( 'invert' )->text(), 'invert', 'nsinvert', $invert ) . '&#160;';
+ $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . '</p>';
$form .= Html::hidden( 'days', $values['days'] );
foreach ( $filters as $key => $msg ) {
if ( $values[$key] ) {
@@ -416,13 +399,10 @@ class SpecialWatchlist extends SpecialPage {
}
protected function showHideLink( $options, $message, $name, $value ) {
- $showLinktext = wfMsgHtml( 'show' );
- $hideLinktext = wfMsgHtml( 'hide' );
-
- $label = $value ? $showLinktext : $hideLinktext;
+ $label = $this->msg( $value ? 'show' : 'hide' )->escaped();
$options[$name] = 1 - (int) $value;
- return wfMsgHtml( $message, Linker::linkKnown( $this->getTitle(), $label, array(), $options ) );
+ return $this->msg( $message )->rawParams( Linker::linkKnown( $this->getTitle(), $label, array(), $options ) )->escaped();
}
protected function hoursLink( $h, $options = array() ) {
@@ -430,7 +410,7 @@ class SpecialWatchlist extends SpecialPage {
return Linker::linkKnown(
$this->getTitle(),
- $this->getLang()->formatNum( $h ),
+ $this->getLanguage()->formatNum( $h ),
array(),
$options
);
@@ -438,7 +418,7 @@ class SpecialWatchlist extends SpecialPage {
protected function daysLink( $d, $options = array() ) {
$options['days'] = $d;
- $message = ( $d ? $this->getLang()->formatNum( $d ) : wfMsgHtml( 'watchlistall2' ) );
+ $message = ( $d ? $this->getLanguage()->formatNum( $d ) : $this->msg( 'watchlistall2' )->escaped() );
return Linker::linkKnown(
$this->getTitle(),
@@ -464,11 +444,10 @@ class SpecialWatchlist extends SpecialPage {
foreach( $days as $d ) {
$days[$i++] = $this->daysLink( $d, $options );
}
- return wfMsgExt('wlshowlast',
- array('parseinline', 'replaceafter'),
- $this->getLang()->pipeList( $hours ),
- $this->getLang()->pipeList( $days ),
- $this->daysLink( 0, $options ) );
+ return $this->msg( 'wlshowlast' )->rawParams(
+ $this->getLanguage()->pipeList( $hours ),
+ $this->getLanguage()->pipeList( $days ),
+ $this->daysLink( 0, $options ) )->parse();
}
/**
diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php
index f7d7bfef..d5129bf6 100644
--- a/includes/specials/SpecialWhatlinkshere.php
+++ b/includes/specials/SpecialWhatlinkshere.php
@@ -47,8 +47,9 @@ class SpecialWhatLinksHere extends SpecialPage {
}
function execute( $par ) {
+ global $wgQueryPageDefaultLimit;
$out = $this->getOutput();
-
+
$this->setHeaders();
$this->outputHeader();
@@ -56,7 +57,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$opts->add( 'target', '' );
$opts->add( 'namespace', '', FormOptions::INTNULL );
- $opts->add( 'limit', 50 );
+ $opts->add( 'limit', $wgQueryPageDefaultLimit );
$opts->add( 'from', 0 );
$opts->add( 'back', 0 );
$opts->add( 'hideredirs', false );
@@ -83,11 +84,10 @@ class SpecialWhatLinksHere extends SpecialPage {
$this->getSkin()->setRelevantTitle( $this->target );
-
$this->selfTitle = $this->getTitle( $this->target->getPrefixedDBkey() );
- $out->setPageTitle( wfMsg( 'whatlinkshere-title', $this->target->getPrefixedText() ) );
- $out->setSubtitle( wfMsg( 'whatlinkshere-backlink', Linker::link( $this->target, $this->target->getPrefixedText(), array(), array( 'redirect' => 'no' ) ) ) );
+ $out->setPageTitle( $this->msg( 'whatlinkshere-title', $this->target->getPrefixedText() ) );
+ $out->addBacklinkSubtitle( $this->target );
$this->showIndirectLinks( 0, $this->target, $opts->getValue( 'limit' ),
$opts->getValue( 'from' ), $opts->getValue( 'back' ) );
@@ -120,9 +120,9 @@ class SpecialWhatLinksHere extends SpecialPage {
'pl_title' => $target->getDBkey(),
);
if( $hideredirs ) {
- $plConds['page_is_redirect'] = 0;
+ $plConds['rd_from'] = null;
} elseif( $hidelinks ) {
- $plConds['page_is_redirect'] = 1;
+ $plConds[] = 'rd_from is NOT NULL';
}
$tlConds = array(
@@ -157,24 +157,34 @@ class SpecialWhatLinksHere extends SpecialPage {
$options[] = 'STRAIGHT_JOIN';
$options['LIMIT'] = $queryLimit;
- $fields = array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' );
+ $fields = array( 'page_id', 'page_namespace', 'page_title', 'rd_from' );
+
+ $joinConds = array( 'redirect' => array( 'LEFT JOIN', array(
+ 'rd_from = page_id',
+ 'rd_namespace' => $target->getNamespace(),
+ 'rd_title' => $target->getDBkey(),
+ '(rd_interwiki is NULL) or (rd_interwiki = \'\')'
+ )));
if( $fetchlinks ) {
$options['ORDER BY'] = 'pl_from';
- $plRes = $dbr->select( array( 'pagelinks', 'page' ), $fields,
- $plConds, __METHOD__, $options );
+ $plRes = $dbr->select( array( 'pagelinks', 'page', 'redirect' ), $fields,
+ $plConds, __METHOD__, $options,
+ $joinConds);
}
if( !$hidetrans ) {
$options['ORDER BY'] = 'tl_from';
- $tlRes = $dbr->select( array( 'templatelinks', 'page' ), $fields,
- $tlConds, __METHOD__, $options );
+ $tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
+ $tlConds, __METHOD__, $options,
+ $joinConds);
}
if( !$hideimages ) {
$options['ORDER BY'] = 'il_from';
- $ilRes = $dbr->select( array( 'imagelinks', 'page' ), $fields,
- $ilConds, __METHOD__, $options );
+ $ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
+ $ilConds, __METHOD__, $options,
+ $joinConds);
}
if( ( !$fetchlinks || !$dbr->numRows($plRes) ) && ( $hidetrans || !$dbr->numRows($tlRes) ) && ( $hideimages || !$dbr->numRows($ilRes) ) ) {
@@ -248,7 +258,7 @@ class SpecialWhatLinksHere extends SpecialPage {
foreach ( $rows as $row ) {
$nt = Title::makeTitle( $row->page_namespace, $row->page_title );
- if ( $row->page_is_redirect && $level < 2 ) {
+ if ( $row->rd_from && $level < 2 ) {
$out->addHTML( $this->listItem( $row, $nt, true ) );
$this->showIndirectLinks( $level + 1, $nt, $wgMaxRedirectLinksRetrieved );
$out->addHTML( Xml::closeElement( 'li' ) );
@@ -269,8 +279,7 @@ class SpecialWhatLinksHere extends SpecialPage {
}
protected function listItem( $row, $nt, $notClose = false ) {
- global $wgLang;
- $dirmark = $wgLang->getDirMark();
+ $dirmark = $this->getLanguage()->getDirMark();
# local message cache
static $msgcache = null;
@@ -283,7 +292,7 @@ class SpecialWhatLinksHere extends SpecialPage {
}
}
- if( $row->page_is_redirect ) {
+ if( $row->rd_from ) {
$query = array( 'redirect' => 'no' );
} else {
$query = array();
@@ -299,7 +308,7 @@ class SpecialWhatLinksHere extends SpecialPage {
// Display properties (redirect or template)
$propsText = '';
$props = array();
- if ( $row->page_is_redirect )
+ if ( $row->rd_from )
$props[] = $msgcache['isredirect'];
if ( $row->is_template )
$props[] = $msgcache['istemplate'];
@@ -346,11 +355,9 @@ class SpecialWhatLinksHere extends SpecialPage {
}
function getPrevNext( $prevId, $nextId ) {
- global $wgLang;
$currentLimit = $this->opts->getValue( 'limit' );
- $fmtLimit = $wgLang->formatNum( $currentLimit );
- $prev = wfMsgExt( 'whatlinkshere-prev', array( 'parsemag', 'escape' ), $fmtLimit );
- $next = wfMsgExt( 'whatlinkshere-next', array( 'parsemag', 'escape' ), $fmtLimit );
+ $prev = wfMessage( 'whatlinkshere-prev' )->numParams( $currentLimit )->escaped();
+ $next = wfMessage( 'whatlinkshere-next' )->numParams( $currentLimit )->escaped();
$changed = $this->opts->getChangedValues();
unset($changed['target']); // Already in the request title
@@ -365,13 +372,14 @@ class SpecialWhatLinksHere extends SpecialPage {
}
$limitLinks = array();
+ $lang = $this->getLanguage();
foreach ( $this->limits as $limit ) {
- $prettyLimit = $wgLang->formatNum( $limit );
+ $prettyLimit = htmlspecialchars( $lang->formatNum( $limit ) );
$overrides = array( 'limit' => $limit );
$limitLinks[] = $this->makeSelfLink( $prettyLimit, array_merge( $changed, $overrides ) );
}
- $nums = $wgLang->pipeList( $limitLinks );
+ $nums = $lang->pipeList( $limitLinks );
return wfMsgHtml( 'viewprevnext', $prev, $next, $nums );
}
@@ -425,7 +433,6 @@ class SpecialWhatLinksHere extends SpecialPage {
* @return string HTML fieldset and filter panel with the show/hide links
*/
function getFilterPanel() {
- global $wgLang;
$show = wfMsgHtml( 'show' );
$hide = wfMsgHtml( 'hide' );
@@ -445,6 +452,6 @@ class SpecialWhatLinksHere extends SpecialPage {
$overrides = array( $type => !$chosen );
$links[] = wfMsgHtml( "whatlinkshere-{$type}", $this->makeSelfLink( $msg, array_merge( $changed, $overrides ) ) );
}
- return Xml::fieldset( wfMsg( 'whatlinkshere-filters' ), $wgLang->pipeList( $links ) );
+ return Xml::fieldset( wfMsg( 'whatlinkshere-filters' ), $this->getLanguage()->pipeList( $links ) );
}
}
diff --git a/includes/specials/SpecialWithoutinterwiki.php b/includes/specials/SpecialWithoutinterwiki.php
index 9d91b833..89dae203 100644
--- a/includes/specials/SpecialWithoutinterwiki.php
+++ b/includes/specials/SpecialWithoutinterwiki.php
@@ -35,8 +35,8 @@ class WithoutInterwikiPage extends PageQueryPage {
}
function execute( $par ) {
- global $wgRequest;
- $this->prefix = Title::capitalize( $wgRequest->getVal( 'prefix', $par ), NS_MAIN );
+ $this->prefix = Title::capitalize(
+ $this->getRequest()->getVal( 'prefix', $par ), NS_MAIN );
parent::execute( $par );
}
@@ -84,7 +84,7 @@ class WithoutInterwikiPage extends PageQueryPage {
'page_title AS title',
'page_title AS value' ),
'conds' => array ( 'll_title IS NULL',
- 'page_namespace' => NS_MAIN,
+ 'page_namespace' => MWNamespace::getContentNamespaces(),
'page_is_redirect' => 0 ),
'join_conds' => array ( 'langlinks' => array (
'LEFT JOIN', 'll_from = page_id' ) )
diff --git a/includes/templates/NoLocalSettings.php b/includes/templates/NoLocalSettings.php
index facb6167..59284af0 100644
--- a/includes/templates/NoLocalSettings.php
+++ b/includes/templates/NoLocalSettings.php
@@ -10,6 +10,7 @@ if ( !isset( $wgVersion ) ) {
$wgVersion = 'VERSION';
}
+# bug 30219 : can not use pathinfo() on URLs since slashes do not match
$matches = array();
$ext = 'php';
$path = '/';
diff --git a/includes/templates/Usercreate.php b/includes/templates/Usercreate.php
new file mode 100644
index 00000000..c93b02cc
--- /dev/null
+++ b/includes/templates/Usercreate.php
@@ -0,0 +1,238 @@
+<?php
+/**
+ * Html form for account creation
+ *
+ * @file
+ * @ingroup Templates
+ */
+
+/**
+ * @defgroup Templates Templates
+ */
+
+if( !defined( 'MEDIAWIKI' ) ) die( -1 );
+
+/**
+ * @ingroup Templates
+ */
+class UsercreateTemplate extends QuickTemplate {
+ function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
+ $this->data['extraInput'][] = array(
+ 'name' => $name,
+ 'value' => $value,
+ 'type' => $type,
+ 'msg' => $msg,
+ 'helptext' => $helptext,
+ );
+ }
+
+ function execute() {
+ 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>
+ <div class="visualClear"></div>
+<?php } ?>
+
+<div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
+<div id="userlogin">
+
+<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text('action') ?>">
+ <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">
+ <?php
+ echo Html::input( 'wpName', $this->data['name'], 'text', array(
+ 'class' => 'loginText',
+ 'id' => 'wpName2',
+ 'tabindex' => '1',
+ 'size' => '20',
+ 'required',
+ 'autofocus'
+ ) ); ?>
+ </td>
+ </tr>
+ <tr>
+ <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' => '2',
+ 'size' => '20'
+ ) + User::passwordChangeInputAttribs() ); ?>
+ </td>
+ </tr>
+ <?php if( $this->data['usedomain'] ) {
+ $doms = "";
+ foreach( $this->data['domainnames'] as $dom ) {
+ $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+ }
+ ?>
+ <tr>
+ <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 } ?>
+ <tr>
+ <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
+ <td class="mw-input">
+ <?php
+ echo Html::input( 'wpRetype', null, 'password', array(
+ 'class' => 'loginPassword',
+ 'id' => 'wpRetype',
+ 'tabindex' => '4',
+ '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">
+ <?php
+ echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+ 'class' => 'loginText',
+ 'id' => 'wpEmail',
+ 'tabindex' => '5',
+ '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');
+ } ?>
+ </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="6"
+ value="<?php $this->text('realname') ?>" size='20' />
+ <div class="prefsectiontip">
+ <?php $this->msgWiki('prefs-help-realname'); ?>
+ </div>
+ </td>
+ <?php } ?>
+ <?php if( $this->data['usereason'] ) { ?>
+ </tr>
+ <tr>
+ <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
+ <td class="mw-input">
+ <input type='text' class='loginText' name="wpReason" id="wpReason"
+ tabindex="7"
+ value="<?php $this->text('reason') ?>" size='20' />
+ </td>
+ <?php } ?>
+ </tr>
+ <?php if( $this->data['canremember'] ) { ?>
+ <tr>
+ <td></td>
+ <td class="mw-input">
+ <?php
+ global $wgCookieExpiration, $wgLang;
+ echo Xml::checkLabel(
+ wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
+ 'wpRemember',
+ 'wpRemember',
+ $this->data['remember'],
+ array( 'tabindex' => '8' )
+ )
+ ?>
+ </td>
+ </tr>
+<?php }
+
+ $tabIndex = 9;
+ 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'] ) ) {
+ ?>
+ <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
+ $this->msgHtml( $inputItem['msg'] ) ?></label><?php
+ }
+ if( $inputItem['helptext'] !== false ) {
+ ?>
+ <div class="prefsectiontip">
+ <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+ </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') ?>" />
+ <?php if( $this->data['createemail'] ) { ?>
+ <input type='submit' name="wpCreateaccountMail" id="wpCreateaccountMail"
+ tabindex="<?php echo $tabIndex++; ?>"
+ value="<?php $this->msg('createaccountmail') ?>" />
+ <?php } ?>
+ </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>
+</div>
+<div id="signupend"><?php $this->html( 'signupend' ); ?></div>
+<?php
+
+ }
+}
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index 0bfd9737..efe826f4 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -1,6 +1,6 @@
<?php
/**
- * Html forms for user login and account creation
+ * Html form for user login
*
* @file
* @ingroup Templates
@@ -157,228 +157,3 @@ class UserloginTemplate extends QuickTemplate {
}
}
-
-/**
- * @ingroup Templates
- */
-class UsercreateTemplate extends QuickTemplate {
- function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
- $this->data['extraInput'][] = array(
- 'name' => $name,
- 'value' => $value,
- 'type' => $type,
- 'msg' => $msg,
- 'helptext' => $helptext,
- );
- }
-
- function execute() {
- 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>
- <div class="visualClear"></div>
-<?php } ?>
-
-<div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
-<div id="userlogin">
-
-<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text('action') ?>">
- <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">
- <?php
- echo Html::input( 'wpName', $this->data['name'], 'text', array(
- 'class' => 'loginText',
- 'id' => 'wpName2',
- 'tabindex' => '1',
- 'size' => '20',
- 'required',
- 'autofocus'
- ) ); ?>
- </td>
- </tr>
- <tr>
- <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' => '2',
- 'size' => '20'
- ) + User::passwordChangeInputAttribs() ); ?>
- </td>
- </tr>
- <?php if( $this->data['usedomain'] ) {
- $doms = "";
- foreach( $this->data['domainnames'] as $dom ) {
- $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
- }
- ?>
- <tr>
- <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 } ?>
- <tr>
- <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
- <td class="mw-input">
- <?php
- echo Html::input( 'wpRetype', null, 'password', array(
- 'class' => 'loginPassword',
- 'id' => 'wpRetype',
- 'tabindex' => '4',
- '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">
- <?php
- echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
- 'class' => 'loginText',
- 'id' => 'wpEmail',
- 'tabindex' => '5',
- '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');
- } ?>
- </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="6"
- value="<?php $this->text('realname') ?>" size='20' />
- <div class="prefsectiontip">
- <?php $this->msgWiki('prefs-help-realname'); ?>
- </div>
- </td>
- <?php } ?>
- <?php if( $this->data['usereason'] ) { ?>
- </tr>
- <tr>
- <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
- <td class="mw-input">
- <input type='text' class='loginText' name="wpReason" id="wpReason"
- tabindex="7"
- value="<?php $this->text('reason') ?>" size='20' />
- </td>
- <?php } ?>
- </tr>
- <?php if( $this->data['canremember'] ) { ?>
- <tr>
- <td></td>
- <td class="mw-input">
- <?php
- global $wgCookieExpiration, $wgLang;
- echo Xml::checkLabel(
- wfMsgExt( 'remembermypassword', 'parsemag', $wgLang->formatNum( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) ) ),
- 'wpRemember',
- 'wpRemember',
- $this->data['remember'],
- array( 'tabindex' => '8' )
- )
- ?>
- </td>
- </tr>
-<?php }
-
- $tabIndex = 9;
- 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'] ) ) {
- ?>
- <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
- $this->msgHtml( $inputItem['msg'] ) ?></label><?php
- }
- if( $inputItem['helptext'] !== false ) {
- ?>
- <div class="prefsectiontip">
- <?php $this->msgWiki( $inputItem['helptext'] ); ?>
- </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') ?>" />
- <?php if( $this->data['createemail'] ) { ?>
- <input type='submit' name="wpCreateaccountMail" id="wpCreateaccountMail"
- tabindex="<?php echo $tabIndex++; ?>"
- value="<?php $this->msg('createaccountmail') ?>" />
- <?php } ?>
- </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>
-</div>
-<div id="signupend"><?php $this->html( 'signupend' ); ?></div>
-<?php
-
- }
-}
diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
index a97edbc7..32eeeb38 100644
--- a/includes/upload/UploadBase.php
+++ b/includes/upload/UploadBase.php
@@ -1,7 +1,10 @@
<?php
/**
- * @file
- * @ingroup upload
+ * @defgroup Upload
+ */
+
+/**
+ * @ingroup Upload
*
* UploadBase and subclasses are the backend of MediaWiki's file uploads.
* The frontends are formed by ApiUpload and SpecialUpload.
@@ -12,7 +15,6 @@
* @author Bryan Tong Minh
* @author Michael Dale
*/
-
abstract class UploadBase {
protected $mTempPath;
protected $mDesiredDestName, $mDestName, $mRemoveTempFile, $mSourceType;
@@ -37,6 +39,7 @@ abstract class UploadBase {
const HOOK_ABORTED = 11;
const FILE_TOO_LARGE = 12;
const WINDOWS_NONASCII_FILENAME = 13;
+ const FILENAME_TOO_LONG = 14;
public function getVerificationErrorCode( $error ) {
$code_to_status = array(self::EMPTY_FILE => 'empty-file',
@@ -49,6 +52,7 @@ abstract class UploadBase {
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] ) ) {
return $code_to_status[$error];
@@ -161,6 +165,9 @@ abstract class UploadBase {
*/
public function initializePathInfo( $name, $tempPath, $fileSize, $removeTempFile = false ) {
$this->mDesiredDestName = $name;
+ if ( FileBackend::isStoragePath( $tempPath ) ) {
+ throw new MWException( __METHOD__ . " given storage path `$tempPath`." );
+ }
$this->mTempPath = $tempPath;
$this->mFileSize = $fileSize;
$this->mRemoveTempFile = $removeTempFile;
@@ -195,39 +202,17 @@ abstract class UploadBase {
}
/**
- * Append a file to the Repo file
- *
- * @param $srcPath String: path to source file
- * @param $toAppendPath String: path to the Repo file that will be appended to.
- * @return Status Status
- */
- protected function appendToUploadFile( $srcPath, $toAppendPath ) {
- $repo = RepoGroup::singleton()->getLocalRepo();
- $status = $repo->append( $srcPath, $toAppendPath );
- return $status;
- }
-
- /**
- * Finish appending to the Repo file
- *
- * @param $toAppendPath String: path to the Repo file that will be appended to.
- * @return Status Status
- */
- protected function appendFinish( $toAppendPath ) {
- $repo = RepoGroup::singleton()->getLocalRepo();
- $status = $repo->appendFinish( $toAppendPath );
- return $status;
- }
-
-
- /**
* @param $srcPath String: the source path
* @return the real path if it was a virtual URL
*/
function getRealPath( $srcPath ) {
$repo = RepoGroup::singleton()->getLocalRepo();
if ( $repo->isVirtualUrl( $srcPath ) ) {
- return $repo->resolveVirtualUrl( $srcPath );
+ // @TODO: just make uploads work with storage paths
+ // UploadFromStash loads files via virtuals URLs
+ $tmpFile = $repo->getLocalCopy( $srcPath );
+ $tmpFile->bind( $this ); // keep alive with $thumb
+ return $tmpFile->getPath();
}
return $srcPath;
}
@@ -355,12 +340,12 @@ abstract class UploadBase {
* @return mixed true of the file is verified, array otherwise.
*/
protected function verifyFile() {
- global $wgAllowJavaUploads;
+ global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
# get the title, even though we are doing nothing with it, because
# we need to populate mFinalExtension
$this->getTitle();
- $this->mFileProps = File::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
+ $this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
# check mime type, if desired
$mime = $this->mFileProps[ 'file-mime' ];
@@ -370,13 +355,15 @@ abstract class UploadBase {
}
# check for htmlish code and javascript
- if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
- return array( 'uploadscripted' );
- }
- if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
- if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+ if ( !$wgDisableUploadScriptChecks ) {
+ if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
return array( 'uploadscripted' );
}
+ if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
+ if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+ return array( 'uploadscripted' );
+ }
+ }
}
# Check for Java applets, which if uploaded can bypass cross-site
@@ -445,7 +432,7 @@ abstract class UploadBase {
}
/**
- * Alias for verifyTitlePermissions. The function was originally 'verifyPermissions'
+ * Alias for verifyTitlePermissions. The function was originally 'verifyPermissions'
* but that suggests it's checking the user, when it's really checking the title + user combination.
* @param $user User object to verify the permissions against
* @return mixed An array as returned by getUserPermissionsErrors or true
@@ -478,7 +465,7 @@ abstract class UploadBase {
$permErrors = $nt->getUserPermissionsErrors( 'edit', $user );
$permErrorsUpload = $nt->getUserPermissionsErrors( 'upload', $user );
if ( !$nt->exists() ) {
- $permErrorsCreate = $nt->getUserPermissionsErrors( 'createpage', $user );
+ $permErrorsCreate = $nt->getUserPermissionsErrors( 'create', $user );
} else {
$permErrorsCreate = array();
}
@@ -544,7 +531,7 @@ abstract class UploadBase {
}
// Check dupes against existing files
- $hash = File::sha1Base36( $this->mTempPath );
+ $hash = FSFile::getSha1Base36FromPath( $this->mTempPath );
$dupes = RepoGroup::singleton()->findBySha1( $hash );
$title = $this->getTitle();
// Remove all matches against self
@@ -589,7 +576,7 @@ abstract class UploadBase {
if ( $watch ) {
$user->addWatch( $this->getLocalFile()->getTitle() );
}
-
+
wfRunHooks( 'UploadComplete', array( &$this ) );
}
@@ -606,7 +593,7 @@ 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.
*/
@@ -617,6 +604,13 @@ abstract class UploadBase {
$this->mFilteredName = $this->mDesiredDestName;
}
+ # oi_archive_name is max 255 bytes, which include a timestamp and an
+ # exclamation mark, so restrict file name to 240 bytes.
+ if ( strlen( $this->mFilteredName ) > 240 ) {
+ $this->mTitleError = self::FILENAME_TOO_LONG;
+ return $this->mTitle = null;
+ }
+
/**
* Chop off any directories in the given filename. Then
* filter out illegal characters, and try to make a legible name
@@ -631,6 +625,8 @@ abstract class UploadBase {
}
$this->mFilteredName = $nt->getDBkey();
+
+
/**
* We'll want to blacklist against *any* 'extension', and use
* only the final one for the whitelist.
@@ -677,7 +673,7 @@ abstract class UploadBase {
$this->mTitleError = self::FILETYPE_BADTYPE;
return $this->mTitle = null;
}
-
+
// Windows may be broken with special characters, see bug XXX
if ( wfIsWindows() && !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() ) ) {
$this->mTitleError = self::WINDOWS_NONASCII_FILENAME;
@@ -742,14 +738,12 @@ abstract class UploadBase {
* This method returns the file object, which also has a 'fileKey' property which can be passed through a form or
* API request to find this stashed file again.
*
- * @param $key String: (optional) the file key used to find the file info again. If not supplied, a key will be autogenerated.
* @return UploadStashFile stashed file
*/
- public function stashFile( $key = null ) {
+ public function stashFile() {
// was stashSessionFile
$stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
-
- $file = $stash->stashFile( $this->mTempPath, $this->getSourceType(), $key );
+ $file = $stash->stashFile( $this->mTempPath, $this->getSourceType() );
$this->mLocalFile = $file;
return $file;
}
@@ -757,21 +751,19 @@ abstract class UploadBase {
/**
* Stash a file in a temporary directory, returning a key which can be used to find the file again. See stashFile().
*
- * @param $key String: (optional) the file key used to find the file info again. If not supplied, a key will be autogenerated.
* @return String: file key
*/
- public function stashFileGetKey( $key = null ) {
- return $this->stashFile( $key )->getFileKey();
+ public function stashFileGetKey() {
+ return $this->stashFile()->getFileKey();
}
- /**
+ /**
* alias for stashFileGetKey, for backwards compatibility
*
- * @param $key String: (optional) the file key used to find the file info again. If not supplied, a key will be autogenerated.
* @return String: file key
*/
- public function stashSession( $key = null ) {
- return $this->stashFileGetKey( $key );
+ public function stashSession() {
+ return $this->stashFileGetKey();
}
/**
diff --git a/includes/upload/UploadFromChunks.php b/includes/upload/UploadFromChunks.php
new file mode 100644
index 00000000..ec83f7d3
--- /dev/null
+++ b/includes/upload/UploadFromChunks.php
@@ -0,0 +1,276 @@
+<?php
+/**
+ * Implements uploading from chunks
+ *
+ * @ingroup Upload
+ * @author Michael Dale
+ */
+class UploadFromChunks extends UploadFromFile {
+ protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
+
+ /**
+ * Setup local pointers to stash, repo and user ( similar to UploadFromStash )
+ *
+ * @param $user User
+ * @param $stash UploadStash
+ * @param $repo FileRepo
+ */
+ public function __construct( $user = false, $stash = false, $repo = false ) {
+ // user object. sometimes this won't exist, as when running from cron.
+ $this->user = $user;
+
+ if( $repo ) {
+ $this->repo = $repo;
+ } else {
+ $this->repo = RepoGroup::singleton()->getLocalRepo();
+ }
+
+ if( $stash ) {
+ $this->stash = $stash;
+ } else {
+ if( $user ) {
+ wfDebug( __METHOD__ . " creating new UploadFromChunks instance for " . $user->getId() . "\n" );
+ } else {
+ wfDebug( __METHOD__ . " creating new UploadFromChunks instance with no user\n" );
+ }
+ $this->stash = new UploadStash( $this->repo, $this->user );
+ }
+
+ return true;
+ }
+ /**
+ * Calls the parent stashFile and updates the uploadsession table to handle "chunks"
+ *
+ * @return UploadStashFile stashed file
+ */
+ public function stashFile() {
+ // Stash file is the called on creating a new chunk session:
+ $this->mChunkIndex = 0;
+ $this->mOffset = 0;
+ // Create a local stash target
+ $this->mLocalFile = parent::stashFile();
+ // Update the initial file offset ( based on file size )
+ $this->mOffset = $this->mLocalFile->getSize();
+ $this->mFileKey = $this->mLocalFile->getFileKey();
+
+ // Output a copy of this first to chunk 0 location:
+ $status = $this->outputChunk( $this->mLocalFile->getPath() );
+
+ // Update db table to reflect initial "chunk" state
+ $this->updateChunkStatus();
+ return $this->mLocalFile;
+ }
+
+ /**
+ * Continue chunk uploading
+ */
+ public function continueChunks( $name, $key, $webRequestUpload ) {
+ $this->mFileKey = $key;
+ $this->mUpload = $webRequestUpload;
+ // Get the chunk status form the db:
+ $this->getChunkStatus();
+
+ $metadata = $this->stash->getMetadata( $key );
+ $this->initializePathInfo( $name,
+ $this->getRealPath( $metadata['us_path'] ),
+ $metadata['us_size'],
+ false
+ );
+ }
+
+ /**
+ * Append the final chunk and ready file for parent::performUpload()
+ * @return FileRepoStatus
+ */
+ public function concatenateChunks() {
+ wfDebug( __METHOD__ . " concatenate {$this->mChunkIndex} chunks:" .
+ $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
+
+ // 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++ ){
+ $fileList[] = $this->getVirtualChunkLocation( $i );
+ }
+
+ // Get the file extension from the last chunk
+ $ext = FileBackend::extensionFromPath( $this->mVirtualTempPath );
+ // Get a 0-byte temp file to perform the concatenation at
+ $tmpFile = TempFSFile::factory( 'chunkedupload_', $ext );
+ $tmpPath = $tmpFile
+ ? $tmpFile->getPath()
+ : false; // fail in concatenate()
+ // Concatenate the chunks at the temp file
+ $status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
+ if( !$status->isOk() ){
+ return $status;
+ }
+ // Update the mTempPath and mLocalFile
+ // ( for FileUpload or normal Stash to take over )
+ $this->mTempPath = $tmpPath; // file system path
+ $this->mLocalFile = parent::stashFile();
+
+ return $status;
+ }
+
+ /**
+ * Perform the upload, then remove the temp copy afterward
+ * @param $comment string
+ * @param $pageText string
+ * @param $watch bool
+ * @param $user User
+ * @return Status
+ */
+ public function performUpload( $comment, $pageText, $watch, $user ) {
+ $rv = parent::performUpload( $comment, $pageText, $watch, $user );
+ return $rv;
+ }
+
+ /**
+ * Returns the virtual chunk location:
+ * @param unknown_type $index
+ */
+ function getVirtualChunkLocation( $index ){
+ return $this->repo->getVirtualUrl( 'temp' ) .
+ '/' .
+ $this->repo->getHashPath(
+ $this->getChunkFileKey( $index )
+ ) .
+ $this->getChunkFileKey( $index );
+ }
+ /**
+ * Add a chunk to the temporary directory
+ *
+ * @param $chunkPath path to temporary chunk file
+ * @param $chunkSize size of the current chunk
+ * @param $offset offset of current chunk ( mutch match database chunk offset )
+ * @return Status
+ */
+ public function addChunk( $chunkPath, $chunkSize, $offset ) {
+ // Get the offset before we add the chunk to the file system
+ $preAppendOffset = $this->getOffset();
+
+ 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.
+ if ( $preAppendOffset == $offset ) {
+ // Update local chunk index for the current chunk
+ $this->mChunkIndex++;
+ $status = $this->outputChunk( $chunkPath );
+ if( $status->isGood() ){
+ // Update local offset:
+ $this->mOffset = $preAppendOffset + $chunkSize;
+ // Update chunk table status db
+ $this->updateChunkStatus();
+ }
+ } else {
+ $status = Status::newFatal( 'invalid-chunk-offset' );
+ }
+ }
+ return $status;
+ }
+
+ /**
+ * Update the chunk db table with the current status:
+ */
+ private function updateChunkStatus(){
+ wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
+ $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
+
+ $dbw = $this->repo->getMasterDb();
+ $dbw->update(
+ 'uploadstash',
+ array(
+ 'us_status' => 'chunks',
+ 'us_chunk_inx' => $this->getChunkIndex(),
+ 'us_size' => $this->getOffset()
+ ),
+ array( 'us_key' => $this->mFileKey ),
+ __METHOD__
+ );
+ }
+ /**
+ * Get the chunk db state and populate update relevant local values
+ */
+ private function getChunkStatus(){
+ // get Master db to avoid race conditions.
+ // Otherwise, if chunk upload time < replag there will be spurious errors
+ $dbw = $this->repo->getMasterDb();
+ $row = $dbw->selectRow(
+ 'uploadstash',
+ array(
+ 'us_chunk_inx',
+ 'us_size',
+ 'us_path',
+ ),
+ array( 'us_key' => $this->mFileKey ),
+ __METHOD__
+ );
+ // Handle result:
+ if ( $row ) {
+ $this->mChunkIndex = $row->us_chunk_inx;
+ $this->mOffset = $row->us_size;
+ $this->mVirtualTempPath = $row->us_path;
+ }
+ }
+ /**
+ * Get the current Chunk index
+ * @return Integer index of the current chunk
+ */
+ private function getChunkIndex(){
+ if( $this->mChunkIndex !== null ){
+ return $this->mChunkIndex;
+ }
+ return 0;
+ }
+
+ /**
+ * Gets the current offset in fromt the stashedupload table
+ * @return Integer current byte offset of the chunk file set
+ */
+ private function getOffset(){
+ if ( $this->mOffset !== null ){
+ return $this->mOffset;
+ }
+ return 0;
+ }
+
+ /**
+ * Output the chunk to disk
+ *
+ * @param $chunkPath string
+ */
+ private function outputChunk( $chunkPath ){
+ // Key is fileKey + chunk index
+ $fileKey = $this->getChunkFileKey();
+
+ // Store the chunk per its indexed fileKey:
+ $hashPath = $this->repo->getHashPath( $fileKey );
+ $storeStatus = $this->repo->store( $chunkPath, 'temp', "$hashPath$fileKey" );
+
+ // Check for error in stashing the chunk:
+ if ( ! $storeStatus->isOK() ) {
+ $error = $storeStatus->getErrorsArray();
+ $error = reset( $error );
+ if ( ! count( $error ) ) {
+ $error = $storeStatus->getWarningsArray();
+ $error = reset( $error );
+ if ( ! count( $error ) ) {
+ $error = array( 'unknown', 'no error recorded' );
+ }
+ }
+ throw new UploadChunkFileException( "error storing file in '$chunkPath': " . implode( '; ', $error ) );
+ }
+ return $storeStatus;
+ }
+ private function getChunkFileKey( $index = null ){
+ if( $index === null ){
+ $index = $this->getChunkIndex();
+ }
+ return $this->mFileKey . '.' . $index ;
+ }
+}
+
+class UploadChunkZeroLengthFileException extends MWException {};
+class UploadChunkFileException extends MWException {};
diff --git a/includes/upload/UploadFromFile.php b/includes/upload/UploadFromFile.php
index c2ab6467..23ec2ef4 100644
--- a/includes/upload/UploadFromFile.php
+++ b/includes/upload/UploadFromFile.php
@@ -2,11 +2,9 @@
/**
* Implements regular file uploads
*
- * @file
- * @ingroup upload
+ * @ingroup Upload
* @author Bryan Tong Minh
*/
-
class UploadFromFile extends UploadBase {
/**
@@ -75,12 +73,4 @@ class UploadFromFile extends UploadBase {
return parent::verifyUpload();
}
-
- /**
- * Get the path to the file underlying the upload
- * @return String path to file
- */
- public function getFileTempname() {
- return $this->mUpload->getTempname();
- }
}
diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php
index f34f156d..f7589bd2 100644
--- a/includes/upload/UploadFromStash.php
+++ b/includes/upload/UploadFromStash.php
@@ -2,11 +2,9 @@
/**
* Implements uploading from previously stored file.
*
- * @file
- * @ingroup upload
+ * @ingroup Upload
* @author Bryan Tong Minh
*/
-
class UploadFromStash extends UploadBase {
protected $mFileKey, $mVirtualTempPath, $mFileProps, $mSourceType;
diff --git a/includes/upload/UploadFromUrl.php b/includes/upload/UploadFromUrl.php
index 8178988f..da772fe2 100644
--- a/includes/upload/UploadFromUrl.php
+++ b/includes/upload/UploadFromUrl.php
@@ -2,27 +2,28 @@
/**
* Implements uploading from a HTTP resource.
*
- * @file
- * @ingroup upload
+ * @ingroup Upload
* @author Bryan Tong Minh
* @author Michael Dale
*/
-
class UploadFromUrl extends UploadBase {
protected $mAsync, $mUrl;
protected $mIgnoreWarnings = true;
- protected $mTempPath;
+ protected $mTempPath, $mTmpHandle;
/**
* Checks if the user is allowed to use the upload-by-URL feature. If the
* user is allowed, pass on permissions checking to the parent.
*
* @param $user User
+ *
+ * @return bool
*/
public static function isAllowed( $user ) {
- if ( !$user->isAllowed( 'upload_by_url' ) )
+ if ( !$user->isAllowed( 'upload_by_url' ) ) {
return 'upload_by_url';
+ }
return parent::isAllowed( $user );
}
@@ -64,8 +65,9 @@ class UploadFromUrl extends UploadBase {
*/
public function initializeFromRequest( &$request ) {
$desiredDestName = $request->getText( 'wpDestFile' );
- if ( !$desiredDestName )
+ if ( !$desiredDestName ) {
$desiredDestName = $request->getText( 'wpUploadFileURL' );
+ }
return $this->initialize(
$desiredDestName,
trim( $request->getVal( 'wpUploadFileURL' ) ),
@@ -75,6 +77,7 @@ class UploadFromUrl extends UploadBase {
/**
* @param $request WebRequest object
+ * @return bool
*/
public static function isValidRequest( $request ) {
global $wgUser;
@@ -85,8 +88,14 @@ class UploadFromUrl extends UploadBase {
&& $wgUser->isAllowed( 'upload_by_url' );
}
+ /**
+ * @return string
+ */
public function getSourceType() { return 'url'; }
+ /**
+ * @return Status
+ */
public function fetchFile() {
if ( !Http::isValidURI( $this->mUrl ) ) {
return Status::newFatal( 'http-invalid-url' );
@@ -130,6 +139,7 @@ class UploadFromUrl extends UploadBase {
/**
* Download the file, save it to the temporary file and update the file
* size and set $mRemoveTempFile to true.
+ * @return Status
*/
protected function reallyFetchFile() {
if ( $this->mTempPath === false ) {
@@ -209,9 +219,7 @@ class UploadFromUrl extends UploadBase {
if ( $this->mAsync ) {
$sessionKey = $this->insertJob( $comment, $pageText, $watch, $user );
- $status = new Status;
- $status->error( 'async', $sessionKey );
- return $status;
+ return Status::newFatal( 'async', $sessionKey );
}
return parent::performUpload( $comment, $pageText, $watch, $user );
diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php
index 217b84dc..ad153d2f 100644
--- a/includes/upload/UploadStash.php
+++ b/includes/upload/UploadStash.php
@@ -16,6 +16,8 @@
* UploadStash represents the entire stash of temporary files.
* UploadStashFile is a filestore for the actual physical disk files.
* UploadFromStash extends UploadBase, and represents a single stashed file as it is moved from the stash to the regular file repository
+ *
+ * @ingroup Upload
*/
class UploadStash {
@@ -48,7 +50,7 @@ class UploadStash {
*
* @param $repo FileRepo
*/
- public function __construct( $repo, $user = null ) {
+ public function __construct( FileRepo $repo, $user = null ) {
// this might change based on wiki's configuration.
$this->repo = $repo;
@@ -106,10 +108,7 @@ class UploadStash {
// fetch fileprops
$path = $this->fileMetadata[$key]['us_path'];
- if ( $this->repo->isVirtualUrl( $path ) ) {
- $path = $this->repo->resolveVirtualUrl( $path );
- }
- $this->fileProps[$key] = File::getPropsFromPath( $path );
+ $this->fileProps[$key] = $this->repo->getFileProps( $path );
}
if ( ! $this->files[$key]->exists() ) {
@@ -163,7 +162,7 @@ class UploadStash {
wfDebug( __METHOD__ . " tried to stash file at '$path', but it doesn't exist\n" );
throw new UploadStashBadPathException( "path doesn't exist" );
}
- $fileProps = File::getPropsFromPath( $path );
+ $fileProps = FSFile::getPropsFromPath( $path );
wfDebug( __METHOD__ . " stashing file at '$path'\n" );
// we will be initializing from some tmpnam files that don't have extensions.
@@ -215,7 +214,8 @@ class UploadStash {
$error = array( 'unknown', 'no error recorded' );
}
}
- throw new UploadStashFileException( "error storing file in '$path': " . implode( '; ', $error ) );
+ // at this point, $error should contain the single "most important" error, plus any parameters.
+ throw new UploadStashFileException( "Error storing file in '$path': " . wfMessage( $error )->text() );
}
$stashPath = $storeStatus->value;
@@ -233,7 +233,7 @@ class UploadStash {
'us_user' => $this->userId,
'us_key' => $key,
'us_orig_path' => $path,
- 'us_path' => $stashPath,
+ 'us_path' => $stashPath, // virtual URL
'us_size' => $fileProps['size'],
'us_sha1' => $fileProps['sha1'],
'us_mime' => $fileProps['mime'],
@@ -334,13 +334,13 @@ class UploadStash {
$dbw = $this->repo->getMasterDb();
// this gets its own transaction since it's called serially by the cleanupUploadStash maintenance script
- $dbw->begin();
+ $dbw->begin( __METHOD__ );
$dbw->delete(
'uploadstash',
array( 'us_key' => $key ),
__METHOD__
);
- $dbw->commit();
+ $dbw->commit( __METHOD__ );
// TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed)
// for now, ignore.
@@ -475,7 +475,7 @@ class UploadStashFile extends UnregisteredLocalFile {
* A LocalFile wrapper around a file that has been temporarily stashed, so we can do things like create thumbnails for it
* Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
*
- * @param $repo FSRepo: repository where we should find the path
+ * @param $repo FileRepo: repository where we should find the path
* @param $path String: path to file
* @param $key String: key to store the path and any stashed data under
* @throws UploadStashBadPathException
diff --git a/index.php b/index.php
index 8b53e2ca..e14823af 100644
--- a/index.php
+++ b/index.php
@@ -36,17 +36,18 @@
* @file
*/
-// Bail on old versions of PHP. Pretty much every other file in the codebase
-// has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in PHP 4.
-// Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and 5.1, respectively.
+# Bail on old versions of PHP. Pretty much every other file in the codebase
+# has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in
+# PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
+# 5.1, respectively.
if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.2.3' ) < 0 ) {
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
+# 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 {
diff --git a/index.php5 b/index.php5
index 58f32337..a738b066 100644
--- a/index.php5
+++ b/index.php5
@@ -1 +1 @@
-<?php require './index.php'; \ No newline at end of file
+<?php require './index.php';
diff --git a/languages/Language.php b/languages/Language.php
index ac921403..bb9abf16 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -33,6 +33,7 @@ class FakeConverter {
function __construct( $langobj ) { $this->mLang = $langobj; }
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 getVariants() { return array( $this->mLang->getCode() ); }
function getPreferredVariant() { return $this->mLang->getCode(); }
@@ -53,13 +54,21 @@ class FakeConverter {
* @ingroup Language
*/
class Language {
- var $mConverter, $mVariants, $mCode, $mLoaded = false;
+
+ /**
+ * @var LanguageConverter
+ */
+ var $mConverter;
+
+ var $mVariants, $mCode, $mLoaded = false;
var $mMagicExtensions = array(), $mMagicHookDone = false;
+ private $mHtmlCode = null;
- var $mNamespaceIds, $namespaceNames, $namespaceAliases;
var $dateFormatStrings = array();
var $mExtendedSpecialPageAliases;
+ protected $namespaceNames, $mNamespaceIds, $namespaceAliases;
+
/**
* ReplacementArray object caches
*/
@@ -148,9 +157,6 @@ class Language {
* @return Language
*/
protected static function newFromCode( $code ) {
- global $IP;
- static $recursionLevel = 0;
-
// Protect against path traversal below
if ( !Language::isValidCode( $code )
|| strcspn( $code, ":/\\\000" ) !== strlen( $code ) )
@@ -166,35 +172,31 @@ class Language {
return $lang;
}
- if ( $code == 'en' ) {
- $class = 'Language';
- } else {
- $class = 'Language' . str_replace( '-', '_', ucfirst( $code ) );
- if ( !defined( 'MW_COMPILED' ) ) {
- // Preload base classes to work around APC/PHP5 bug
- if ( file_exists( "$IP/languages/classes/$class.deps.php" ) ) {
- include_once( "$IP/languages/classes/$class.deps.php" );
- }
- if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
- include_once( "$IP/languages/classes/$class.php" );
- }
- }
+ // Check if there is a language class for the code
+ $class = self::classFromCode( $code );
+ self::preloadLanguageClass( $class );
+ if ( MWInit::classExists( $class ) ) {
+ $lang = new $class;
+ return $lang;
}
- if ( $recursionLevel > 5 ) {
- throw new MWException( "Language fallback loop detected when creating class $class\n" );
- }
+ // Keep trying the fallback list until we find an existing class
+ $fallbacks = Language::getFallbacksFor( $code );
+ foreach ( $fallbacks as $fallbackCode ) {
+ if ( !Language::isValidBuiltInCode( $fallbackCode ) ) {
+ throw new MWException( "Invalid fallback '$fallbackCode' in fallback sequence for '$code'" );
+ }
- if ( !MWInit::classExists( $class ) ) {
- $fallback = Language::getFallbackFor( $code );
- ++$recursionLevel;
- $lang = Language::newFromCode( $fallback );
- --$recursionLevel;
- $lang->setCode( $code );
- } else {
- $lang = new $class;
+ $class = self::classFromCode( $fallbackCode );
+ self::preloadLanguageClass( $class );
+ if ( MWInit::classExists( $class ) ) {
+ $lang = Language::newFromCode( $fallbackCode );
+ $lang->setCode( $code );
+ return $lang;
+ }
}
- return $lang;
+
+ throw new MWException( "Invalid fallback sequence for language '$code'" );
}
/**
@@ -222,7 +224,42 @@ class Language {
* @return bool
*/
public static function isValidBuiltInCode( $code ) {
- return preg_match( '/^[a-z0-9-]*$/i', $code );
+ return preg_match( '/^[a-z0-9-]+$/i', $code );
+ }
+
+ /**
+ * @param $code
+ * @return String Name of the language class
+ */
+ public static function classFromCode( $code ) {
+ if ( $code == 'en' ) {
+ return 'Language';
+ } else {
+ return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
+ }
+ }
+
+ /**
+ * Includes language class files
+ *
+ * @param $class string Name of the language class
+ */
+ public static function preloadLanguageClass( $class ) {
+ global $IP;
+
+ if ( $class === 'Language' ) {
+ return;
+ }
+
+ if ( !defined( 'MW_COMPILED' ) ) {
+ // Preload base classes to work around APC/PHP5 bug
+ if ( file_exists( "$IP/languages/classes/$class.deps.php" ) ) {
+ include_once( "$IP/languages/classes/$class.deps.php" );
+ }
+ if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
+ include_once( "$IP/languages/classes/$class.php" );
+ }
+ }
}
/**
@@ -266,14 +303,21 @@ class Language {
function initContLang() { }
/**
+ * Same as getFallbacksFor for current language.
* @return array|bool
+ * @deprecated in 1.19
*/
function getFallbackLanguageCode() {
- if ( $this->mCode === 'en' ) {
- return false;
- } else {
- return self::$dataCache->getItem( $this->mCode, 'fallback' );
- }
+ wfDeprecated( __METHOD__ );
+ return self::getFallbackFor( $this->mCode );
+ }
+
+ /**
+ * @return array
+ * @since 1.19
+ */
+ function getFallbackLanguages() {
+ return self::getFallbacksFor( $this->mCode );
}
/**
@@ -287,7 +331,7 @@ class Language {
/**
* @return array
*/
- function getNamespaces() {
+ public function getNamespaces() {
if ( is_null( $this->namespaceNames ) ) {
global $wgMetaNamespace, $wgMetaNamespaceTalk, $wgExtraNamespaces;
@@ -306,7 +350,7 @@ class Language {
}
# Sometimes a language will be localised but not actually exist on this wiki.
- foreach( $this->namespaceNames as $key => $text ) {
+ foreach ( $this->namespaceNames as $key => $text ) {
if ( !isset( $validNamespaces[$key] ) ) {
unset( $this->namespaceNames[$key] );
}
@@ -315,11 +359,21 @@ class Language {
# The above mixing may leave namespaces out of canonical order.
# Re-order by namespace ID number...
ksort( $this->namespaceNames );
+
+ wfRunHooks( 'LanguageGetNamespaces', array( &$this->namespaceNames ) );
}
return $this->namespaceNames;
}
/**
+ * Arbitrarily set all of the namespace names at once. Mainly used for testing
+ * @param $namespaces Array of namespaces (id => name)
+ */
+ public function setNamespaces( array $namespaces ) {
+ $this->namespaceNames = $namespaces;
+ }
+
+ /**
* A convenience function that returns the same thing as
* getNamespaces() except with the array values changed to ' '
* where it found '_', useful for producing output to be displayed
@@ -373,7 +427,7 @@ class Language {
*/
function getGenderNsText( $index, $gender ) {
global $wgExtraGenderNamespaces;
-
+
$ns = $wgExtraGenderNamespaces + self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
return isset( $ns[$index][$gender] ) ? $ns[$index][$gender] : $this->getNsText( $index );
}
@@ -389,7 +443,7 @@ class Language {
if ( count( $wgExtraGenderNamespaces ) > 0 ) {
// $wgExtraGenderNamespaces overrides everything
return true;
- } elseif( isset( $wgExtraNamespaces[NS_USER] ) && isset( $wgExtraNamespaces[NS_USER_TALK] ) ) {
+ } elseif ( isset( $wgExtraNamespaces[NS_USER] ) && isset( $wgExtraNamespaces[NS_USER_TALK] ) ) {
/// @todo There may be other gender namespace than NS_USER & NS_USER_TALK in the future
// $wgExtraNamespaces overrides any gender aliases specified in i18n files
return false;
@@ -471,7 +525,6 @@ class Language {
return $this->mNamespaceIds;
}
-
/**
* Get a namespace key by value, case insensitive. Canonical namespace
* names override custom ones defined for the current language.
@@ -481,7 +534,8 @@ class Language {
*/
function getNsIndex( $text ) {
$lctext = $this->lc( $text );
- if ( ( $ns = MWNamespace::getCanonicalIndex( $lctext ) ) !== null ) {
+ $ns = MWNamespace::getCanonicalIndex( $lctext );
+ if ( $ns !== null ) {
return $ns;
}
$ids = $this->getNamespaceIds();
@@ -492,10 +546,22 @@ class Language {
* short names for language variants used for language conversion links.
*
* @param $code String
+ * @param $usemsg bool Use the "variantname-xyz" message if it exists
* @return string
*/
- function getVariantname( $code ) {
- return $this->getMessageFromDB( "variantname-$code" );
+ function getVariantname( $code, $usemsg = true ) {
+ $msg = "variantname-$code";
+ list( $rootCode ) = explode( '-', $code );
+ if ( $usemsg && wfMessage( $msg )->exists() ) {
+ return $this->getMessageFromDB( $msg );
+ }
+ $name = self::getLanguageName( $code );
+ if ( $name ) {
+ return $name; # if it's defined as a language name, show that
+ } else {
+ # otherwise, output the language code
+ return $code;
+ }
}
/**
@@ -570,7 +636,7 @@ class Language {
* @return array
*/
function getExtraUserToggles() {
- return self::$dataCache->getItem( $this->mCode, 'extraUserToggles' );
+ return (array)self::$dataCache->getItem( $this->mCode, 'extraUserToggles' );
}
/**
@@ -582,7 +648,8 @@ class Language {
}
/**
- * Get language names, indexed by code.
+ * Get native language names, indexed by code.
+ * Only those defined in MediaWiki, no other data like CLDR.
* If $customisedOnly is true, only returns codes with a messages file
*
* @param $customisedOnly bool
@@ -602,16 +669,14 @@ class Language {
return $allNames;
}
- global $IP;
$names = array();
- $dir = opendir( "$IP/languages/messages" );
- while ( false !== ( $file = readdir( $dir ) ) ) {
- $code = self::getCodeFromFileName( $file, 'Messages' );
- if ( $code && isset( $allNames[$code] ) ) {
+ // We do this using a foreach over the codes instead of a directory
+ // loop so that messages files in extensions will work correctly.
+ foreach ( $allNames as $code => $value ) {
+ if ( is_readable( self::getMessagesFileName( $code ) ) ) {
$names[$code] = $allNames[$code];
}
}
- closedir( $dir );
return $names;
}
@@ -645,6 +710,8 @@ class Language {
}
/**
+ * Get the native language name of $code.
+ * Only if defined in MediaWiki, no other data like CLDR.
* @param $code string
* @return string
*/
@@ -669,7 +736,7 @@ class Language {
*/
function getMonthNamesArray() {
$monthNames = array( '' );
- for ( $i=1; $i < 13; $i++ ) {
+ for ( $i = 1; $i < 13; $i++ ) {
$monthNames[] = $this->getMonthName( $i );
}
return $monthNames;
@@ -696,7 +763,7 @@ class Language {
*/
function getMonthAbbreviationsArray() {
$monthNames = array( '' );
- for ( $i=1; $i < 13; $i++ ) {
+ for ( $i = 1; $i < 13; $i++ ) {
$monthNames[] = $this->getMonthAbbreviation( $i );
}
return $monthNames;
@@ -751,82 +818,6 @@ class Language {
}
/**
- * Used by date() and time() to adjust the time output.
- *
- * @param $ts Int the time in date('YmdHis') format
- * @param $tz Mixed: adjust the time by this amount (default false, mean we
- * get user timecorrection setting)
- * @return int
- */
- function userAdjust( $ts, $tz = false ) {
- global $wgUser, $wgLocalTZoffset;
-
- if ( $tz === false ) {
- $tz = $wgUser->getOption( 'timecorrection' );
- }
-
- $data = explode( '|', $tz, 3 );
-
- if ( $data[0] == 'ZoneInfo' ) {
- wfSuppressWarnings();
- $userTZ = timezone_open( $data[2] );
- wfRestoreWarnings();
- if ( $userTZ !== false ) {
- $date = date_create( $ts, timezone_open( 'UTC' ) );
- date_timezone_set( $date, $userTZ );
- $date = date_format( $date, 'YmdHis' );
- return $date;
- }
- # Unrecognized timezone, default to 'Offset' with the stored offset.
- $data[0] = 'Offset';
- }
-
- $minDiff = 0;
- if ( $data[0] == 'System' || $tz == '' ) {
- #  Global offset in minutes.
- if ( isset( $wgLocalTZoffset ) ) {
- $minDiff = $wgLocalTZoffset;
- }
- } elseif ( $data[0] == 'Offset' ) {
- $minDiff = intval( $data[1] );
- } else {
- $data = explode( ':', $tz );
- if ( count( $data ) == 2 ) {
- $data[0] = intval( $data[0] );
- $data[1] = intval( $data[1] );
- $minDiff = abs( $data[0] ) * 60 + $data[1];
- if ( $data[0] < 0 ) {
- $minDiff = -$minDiff;
- }
- } else {
- $minDiff = intval( $data[0] ) * 60;
- }
- }
-
- # No difference ? Return time unchanged
- if ( 0 == $minDiff ) {
- return $ts;
- }
-
- wfSuppressWarnings(); // E_STRICT system time bitching
- # Generate an adjusted date; take advantage of the fact that mktime
- # will normalize out-of-range values so we don't have to split $minDiff
- # into hours and minutes.
- $t = mktime( (
- (int)substr( $ts, 8, 2 ) ), # Hours
- (int)substr( $ts, 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();
-
- return $date;
- }
-
- /**
* This is a workalike of PHP's date() function, but with better
* internationalisation, a reduced set of format characters, and a better
* escaping format.
@@ -845,6 +836,7 @@ class Language {
* xij j (day number) in Iranian calendar
* xiF F (month name) in Iranian calendar
* xin n (month number) in Iranian calendar
+ * xiy y (two digit year) in Iranian calendar
* xiY Y (full year) in Iranian calendar
*
* xjj j (day number) in Hebrew calendar
@@ -1063,7 +1055,7 @@ class Language {
if ( !$unix ) {
$unix = wfTimestamp( TS_UNIX, $ts );
}
- $num = date( 'o', $unix );
+ $num = gmdate( 'o', $unix );
break;
case 'Y':
$num = substr( $ts, 0, 4 );
@@ -1107,6 +1099,12 @@ class Language {
case 'y':
$num = substr( $ts, 2, 2 );
break;
+ case 'xiy':
+ if ( !$iranian ) {
+ $iranian = self::tsToIranian( $ts );
+ }
+ $num = substr( $iranian[0], -2 );
+ break;
case 'a':
$s .= intval( substr( $ts, 8, 2 ) ) < 12 ? 'am' : 'pm';
break;
@@ -1222,7 +1220,6 @@ class Language {
- floor( ( $gy + 99 ) / 100 )
+ floor( ( $gy + 399 ) / 400 );
-
// Add days of the past months of this year
for ( $i = 0; $i < $gm; $i++ ) {
$gDayNo += self::$GREG_DAYS[$i];
@@ -1234,7 +1231,7 @@ class Language {
}
// Days passed in current month
- $gDayNo += $gd;
+ $gDayNo += (int)$gd;
$jDayNo = $gDayNo - 79;
@@ -1264,7 +1261,7 @@ class Language {
*
* Based on a PHP-Nuke block by Sharjeel which is released under GNU/GPL license
*
- * @link http://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
+ * @see http://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
*
* @param $ts string
*
@@ -1595,7 +1592,7 @@ class Language {
$s = '';
for ( $pow10 = 1000, $i = 3; $i >= 0; $pow10 /= 10, $i-- ) {
if ( $num >= $pow10 ) {
- $s .= $table[$i][floor( $num / $pow10 )];
+ $s .= $table[$i][(int)floor( $num / $pow10 )];
}
$num = $num % $pow10;
}
@@ -1666,6 +1663,82 @@ class Language {
}
/**
+ * Used by date() and time() to adjust the time output.
+ *
+ * @param $ts Int the time in date('YmdHis') format
+ * @param $tz Mixed: adjust the time by this amount (default false, mean we
+ * get user timecorrection setting)
+ * @return int
+ */
+ function userAdjust( $ts, $tz = false ) {
+ global $wgUser, $wgLocalTZoffset;
+
+ if ( $tz === false ) {
+ $tz = $wgUser->getOption( 'timecorrection' );
+ }
+
+ $data = explode( '|', $tz, 3 );
+
+ if ( $data[0] == 'ZoneInfo' ) {
+ wfSuppressWarnings();
+ $userTZ = timezone_open( $data[2] );
+ wfRestoreWarnings();
+ if ( $userTZ !== false ) {
+ $date = date_create( $ts, timezone_open( 'UTC' ) );
+ date_timezone_set( $date, $userTZ );
+ $date = date_format( $date, 'YmdHis' );
+ return $date;
+ }
+ # Unrecognized timezone, default to 'Offset' with the stored offset.
+ $data[0] = 'Offset';
+ }
+
+ $minDiff = 0;
+ if ( $data[0] == 'System' || $tz == '' ) {
+ #  Global offset in minutes.
+ if ( isset( $wgLocalTZoffset ) ) {
+ $minDiff = $wgLocalTZoffset;
+ }
+ } elseif ( $data[0] == 'Offset' ) {
+ $minDiff = intval( $data[1] );
+ } else {
+ $data = explode( ':', $tz );
+ if ( count( $data ) == 2 ) {
+ $data[0] = intval( $data[0] );
+ $data[1] = intval( $data[1] );
+ $minDiff = abs( $data[0] ) * 60 + $data[1];
+ if ( $data[0] < 0 ) {
+ $minDiff = -$minDiff;
+ }
+ } else {
+ $minDiff = intval( $data[0] ) * 60;
+ }
+ }
+
+ # No difference ? Return time unchanged
+ if ( 0 == $minDiff ) {
+ return $ts;
+ }
+
+ wfSuppressWarnings(); // E_STRICT system time bitching
+ # Generate an adjusted date; take advantage of the fact that mktime
+ # will normalize out-of-range values so we don't have to split $minDiff
+ # into hours and minutes.
+ $t = mktime( (
+ (int)substr( $ts, 8, 2 ) ), # Hours
+ (int)substr( $ts, 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();
+
+ return $date;
+ }
+
+ /**
* This is meant to be used by time(), date(), and timeanddate() to get
* the date preference they're supposed to use, it should be used in
* all children.
@@ -1786,6 +1859,114 @@ class Language {
}
/**
+ * Internal helper function for userDate(), userTime() and userTimeAndDate()
+ *
+ * @param $type String: can be 'date', 'time' or 'both'
+ * @param $ts Mixed: the time format which needs to be turned into a
+ * date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+ * @param $user User object used to get preferences for timezone and format
+ * @param $options Array, can contain the following keys:
+ * - 'timecorrection': time correction, can have the following values:
+ * - true: use user's preference
+ * - false: don't use time correction
+ * - integer: value of time correction in minutes
+ * - 'format': format to use, can have the following values:
+ * - true: use user's preference
+ * - false: use default preference
+ * - string: format to use
+ * @since 1.19
+ * @return String
+ */
+ private function internalUserTimeAndDate( $type, $ts, User $user, array $options ) {
+ $ts = wfTimestamp( TS_MW, $ts );
+ $options += array( 'timecorrection' => true, 'format' => true );
+ if ( $options['timecorrection'] !== false ) {
+ if ( $options['timecorrection'] === true ) {
+ $offset = $user->getOption( 'timecorrection' );
+ } else {
+ $offset = $options['timecorrection'];
+ }
+ $ts = $this->userAdjust( $ts, $offset );
+ }
+ if ( $options['format'] === true ) {
+ $format = $user->getDatePreference();
+ } else {
+ $format = $options['format'];
+ }
+ $df = $this->getDateFormatString( $type, $this->dateFormat( $format ) );
+ return $this->sprintfDate( $df, $ts );
+ }
+
+ /**
+ * Get the formatted date for the given timestamp and formatted for
+ * the given user.
+ *
+ * @param $ts Mixed: the time format which needs to be turned into a
+ * date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+ * @param $user User object used to get preferences for timezone and format
+ * @param $options Array, can contain the following keys:
+ * - 'timecorrection': time correction, can have the following values:
+ * - true: use user's preference
+ * - false: don't use time correction
+ * - integer: value of time correction in minutes
+ * - 'format': format to use, can have the following values:
+ * - true: use user's preference
+ * - false: use default preference
+ * - string: format to use
+ * @since 1.19
+ * @return String
+ */
+ public function userDate( $ts, User $user, array $options = array() ) {
+ return $this->internalUserTimeAndDate( 'date', $ts, $user, $options );
+ }
+
+ /**
+ * Get the formatted time for the given timestamp and formatted for
+ * the given user.
+ *
+ * @param $ts Mixed: the time format which needs to be turned into a
+ * date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+ * @param $user User object used to get preferences for timezone and format
+ * @param $options Array, can contain the following keys:
+ * - 'timecorrection': time correction, can have the following values:
+ * - true: use user's preference
+ * - false: don't use time correction
+ * - integer: value of time correction in minutes
+ * - 'format': format to use, can have the following values:
+ * - true: use user's preference
+ * - false: use default preference
+ * - string: format to use
+ * @since 1.19
+ * @return String
+ */
+ public function userTime( $ts, User $user, array $options = array() ) {
+ return $this->internalUserTimeAndDate( 'time', $ts, $user, $options );
+ }
+
+ /**
+ * Get the formatted date and time for the given timestamp and formatted for
+ * the given user.
+ *
+ * @param $ts Mixed: the time format which needs to be turned into a
+ * date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+ * @param $user User object used to get preferences for timezone and format
+ * @param $options Array, can contain the following keys:
+ * - 'timecorrection': time correction, can have the following values:
+ * - true: use user's preference
+ * - false: don't use time correction
+ * - integer: value of time correction in minutes
+ * - 'format': format to use, can have the following values:
+ * - true: use user's preference
+ * - false: use default preference
+ * - string: format to use
+ * @since 1.19
+ * @return String
+ */
+ public function userTimeAndDate( $ts, User $user, array $options = array() ) {
+ return $this->internalUserTimeAndDate( 'both', $ts, $user, $options );
+ }
+
+ /**
* @param $key string
* @return array|null
*/
@@ -2372,7 +2553,7 @@ class Language {
function getDirMark( $opposite = false ) {
$rtl = "\xE2\x80\x8F";
$ltr = "\xE2\x80\x8E";
- if( $opposite ) { return $this->isRTL() ? $ltr : $rtl; }
+ if ( $opposite ) { return $this->isRTL() ? $ltr : $rtl; }
return $this->isRTL() ? $rtl : $ltr;
}
@@ -2451,15 +2632,7 @@ class Language {
* @param $newWords array
*/
function addMagicWordsByLang( $newWords ) {
- $code = $this->getCode();
- $fallbackChain = array();
- while ( $code && !in_array( $code, $fallbackChain ) ) {
- $fallbackChain[] = $code;
- $code = self::getFallbackFor( $code );
- }
- if ( !in_array( 'en', $fallbackChain ) ) {
- $fallbackChain[] = 'en';
- }
+ $fallbackChain = $this->getFallbackLanguages();
$fallbackChain = array_reverse( $fallbackChain );
foreach ( $fallbackChain as $code ) {
if ( isset( $newWords[$code] ) ) {
@@ -2498,7 +2671,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 sutable for all
+ * point twohundredthirtyfive. However this is not suitable for all
* languages, some such as Pakaran want ੨੯੩,੨੯੫.੨੩੫ and others such as
* Icelandic just want to use commas instead of dots, and dots instead
* of commas like "293.291,235".
@@ -2519,7 +2692,7 @@ class Language {
* @param $nocommafy Bool: set to true for special numbers like dates
* @return string
*/
- function formatNum( $number, $nocommafy = false ) {
+ public function formatNum( $number, $nocommafy = false ) {
global $wgTranslateNumerals;
if ( !$nocommafy ) {
$number = $this->commafy( $number );
@@ -2560,12 +2733,63 @@ class Language {
/**
* Adds commas to a given number
- *
+ * @since 1.19
* @param $_ mixed
* @return string
*/
function commafy( $_ ) {
- return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+ $digitGroupingPattern = $this->digitGroupingPattern();
+ if ( $_ === null ) {
+ return '';
+ }
+
+ if ( !$digitGroupingPattern || $digitGroupingPattern === "###,###,###" ) {
+ // default grouping is at thousands, use the same for ###,###,### pattern too.
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+ } else {
+ // Ref: http://cldr.unicode.org/translation/number-patterns
+ $sign = "";
+ if ( intval( $_ ) < 0 ) {
+ // For negative numbers apply the algorithm like positive number and add sign.
+ $sign = "-";
+ $_ = substr( $_, 1 );
+ }
+ $numberpart = array();
+ $decimalpart = array();
+ $numMatches = preg_match_all( "/(#+)/", $digitGroupingPattern, $matches );
+ preg_match( "/\d+/", $_, $numberpart );
+ preg_match( "/\.\d*/", $_, $decimalpart );
+ $groupedNumber = ( count( $decimalpart ) > 0 ) ? $decimalpart[0]:"";
+ if ( $groupedNumber === $_ ) {
+ // the string does not have any number part. Eg: .12345
+ return $sign . $groupedNumber;
+ }
+ $start = $end = strlen( $numberpart[0] );
+ while ( $start > 0 ) {
+ $match = $matches[0][$numMatches -1] ;
+ $matchLen = strlen( $match );
+ $start = $end - $matchLen;
+ if ( $start < 0 ) {
+ $start = 0;
+ }
+ $groupedNumber = substr( $_ , $start, $end -$start ) . $groupedNumber ;
+ $end = $start;
+ if ( $numMatches > 1 ) {
+ // use the last pattern for the rest of the number
+ $numMatches--;
+ }
+ if ( $start > 0 ) {
+ $groupedNumber = "," . $groupedNumber;
+ }
+ }
+ return $sign . $groupedNumber;
+ }
+ }
+ /**
+ * @return String
+ */
+ function digitGroupingPattern() {
+ return self::$dataCache->getItem( $this->mCode, 'digitGroupingPattern' );
}
/**
@@ -2590,7 +2814,7 @@ class Language {
* @param $l Array
* @return string
*/
- function listToText( $l ) {
+ function listToText( array $l ) {
$s = '';
$m = count( $l ) - 1;
if ( $m == 1 ) {
@@ -2615,13 +2839,13 @@ class Language {
* @param $list array of strings to put in a comma list
* @return string
*/
- function commaList( $list ) {
+ function commaList( array $list ) {
return implode(
- $list,
wfMsgExt(
'comma-separator',
array( 'parsemag', 'escapenoentities', 'language' => $this )
- )
+ ),
+ $list
);
}
@@ -2631,13 +2855,13 @@ class Language {
* @param $list array of strings to put in a semicolon list
* @return string
*/
- function semicolonList( $list ) {
+ function semicolonList( array $list ) {
return implode(
- $list,
wfMsgExt(
'semicolon-separator',
array( 'parsemag', 'escapenoentities', 'language' => $this )
- )
+ ),
+ $list
);
}
@@ -2646,13 +2870,13 @@ class Language {
* @param $list array of strings to put in a pipe list
* @return string
*/
- function pipeList( $list ) {
+ function pipeList( array $list ) {
return implode(
- $list,
wfMsgExt(
'pipe-separator',
array( 'escapenoentities', 'language' => $this )
- )
+ ),
+ $list
);
}
@@ -2905,10 +3129,10 @@ class Language {
* truncateHtml() helper function
* (a) push or pop $tag from $openTags as needed
* (b) clear $tag value
- * @param String &$tag Current HTML tag name we are looking at
- * @param int $tagType (0-open tag, 1-close tag)
- * @param char $lastCh Character before the '>' that ended this tag
- * @param array &$openTags Open tag stack (not accounting for $tag)
+ * @param &$tag string Current HTML tag name we are looking at
+ * @param $tagType int (0-open tag, 1-close tag)
+ * @param $lastCh char|string Character before the '>' that ended this tag
+ * @param &$openTags array Open tag stack (not accounting for $tag)
*/
private function truncate_endBracket( &$tag, $tagType, $lastCh, &$openTags ) {
$tag = ltrim( $tag );
@@ -2945,8 +3169,14 @@ class Language {
* Usage {{gender:username|masculine|feminine|neutral}}.
* username is optional, in which case the gender of current user is used,
* but only in (some) interface messages; otherwise default gender is used.
- * If second or third parameter are not specified, masculine is used.
- * These details may be overriden per language.
+ *
+ * If no forms are given, an empty string is returned. If only one form is
+ * given, it will be returned unconditionally. These details are implied by
+ * the caller and cannot be overridden in subclasses.
+ *
+ * If more than one form is given, the default is to use the neutral one
+ * if it is specified, and to use the masculine one otherwise. These
+ * details can be overridden in subclasses.
*
* @param $gender string
* @param $forms array
@@ -3019,7 +3249,7 @@ class Language {
*/
function translateBlockExpiry( $str ) {
$duration = SpecialBlock::getSuggestedDurations( $this );
- foreach( $duration as $show => $value ){
+ foreach ( $duration as $show => $value ) {
if ( strcmp( $str, $value ) == 0 ) {
return htmlspecialchars( trim( $show ) );
}
@@ -3029,7 +3259,7 @@ class Language {
// equivalents if still here.
$indefs = array( 'infinite', 'infinity', 'indefinite' );
if ( in_array( $str, $indefs ) ) {
- foreach( $indefs as $val ) {
+ foreach ( $indefs as $val ) {
$show = array_search( $val, $duration, true );
if ( $show !== false ) {
return htmlspecialchars( trim( $show ) );
@@ -3047,7 +3277,7 @@ class Language {
* @param $text String
* @return String
*/
- function segmentForDiff( $text ) {
+ public function segmentForDiff( $text ) {
return $text;
}
@@ -3057,17 +3287,27 @@ class Language {
* @param $text String
* @return String
*/
- function unsegmentForDiff( $text ) {
+ public function unsegmentForDiff( $text ) {
return $text;
}
/**
+ * Return the LanguageConverter used in the Language
+ *
+ * @since 1.19
+ * @return LanguageConverter
+ */
+ public function getConverter() {
+ return $this->mConverter;
+ }
+
+ /**
* convert text to all supported variants
*
* @param $text string
* @return array
*/
- function autoConvertToAllVariants( $text ) {
+ public function autoConvertToAllVariants( $text ) {
return $this->mConverter->autoConvertToAllVariants( $text );
}
@@ -3077,18 +3317,17 @@ class Language {
* @param $text string
* @return string
*/
- function convert( $text ) {
+ public function convert( $text ) {
return $this->mConverter->convert( $text );
}
-
/**
* Convert a Title object to a string in the preferred variant
*
* @param $title Title
* @return string
*/
- function convertTitle( $title ) {
+ public function convertTitle( $title ) {
return $this->mConverter->convertTitle( $title );
}
@@ -3097,17 +3336,28 @@ class Language {
*
* @return bool
*/
- function hasVariants() {
+ public function hasVariants() {
return sizeof( $this->getVariants() ) > 1;
}
/**
+ * Check if the language has the specific variant
+ *
+ * @since 1.19
+ * @param $variant string
+ * @return bool
+ */
+ public function hasVariant( $variant ) {
+ return (bool)$this->mConverter->validateVariant( $variant );
+ }
+
+ /**
* Put custom tags (e.g. -{ }-) around math to prevent conversion
*
* @param $text string
* @return string
*/
- function armourMath( $text ) {
+ public function armourMath( $text ) {
return $this->mConverter->armourMath( $text );
}
@@ -3118,7 +3368,7 @@ class Language {
* @return string
* @todo this should get integrated somewhere sane
*/
- function convertHtml( $text, $isTitle = false ) {
+ public function convertHtml( $text, $isTitle = false ) {
return htmlspecialchars( $this->convert( $text, $isTitle ) );
}
@@ -3126,7 +3376,7 @@ class Language {
* @param $key string
* @return string
*/
- function convertCategoryKey( $key ) {
+ public function convertCategoryKey( $key ) {
return $this->mConverter->convertCategoryKey( $key );
}
@@ -3136,28 +3386,28 @@ class Language {
*
* @return array an array of language codes
*/
- function getVariants() {
+ public function getVariants() {
return $this->mConverter->getVariants();
}
/**
* @return string
*/
- function getPreferredVariant() {
+ public function getPreferredVariant() {
return $this->mConverter->getPreferredVariant();
}
/**
* @return string
*/
- function getDefaultVariant() {
+ public function getDefaultVariant() {
return $this->mConverter->getDefaultVariant();
}
/**
* @return string
*/
- function getURLVariant() {
+ public function getURLVariant() {
return $this->mConverter->getURLVariant();
}
@@ -3173,7 +3423,7 @@ class Language {
* we need to transclude a template or update a category's link
* @return null the input parameters may be modified upon return
*/
- function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
+ public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
$this->mConverter->findVariantLink( $link, $nt, $ignoreOtherCond );
}
@@ -3188,7 +3438,7 @@ class Language {
*
* @return string
*/
- function convertLinkToAllVariants( $text ) {
+ public function convertLinkToAllVariants( $text ) {
return $this->mConverter->convertLinkToAllVariants( $text );
}
@@ -3209,7 +3459,7 @@ class Language {
*
* @return string
*/
- function getParsedTitle() {
+ public function getParsedTitle() {
return $this->mConverter->getParsedTitle();
}
@@ -3221,7 +3471,7 @@ class Language {
* @param $noParse bool
* @return string the tagged text
*/
- function markNoConversion( $text, $noParse = false ) {
+ public function markNoConversion( $text, $noParse = false ) {
return $this->mConverter->markNoConversion( $text, $noParse );
}
@@ -3231,7 +3481,7 @@ class Language {
*
* @return string
*/
- function linkTrail() {
+ public function linkTrail() {
return self::$dataCache->getItem( $this->mCode, 'linkTrail' );
}
@@ -3247,15 +3497,30 @@ class Language {
*
* @return string
*/
- function getCode() {
+ public function getCode() {
return $this->mCode;
}
/**
+ * Get the code in Bcp47 format which we can use
+ * inside of html lang="" tags.
+ * @since 1.19
+ * @return string
+ */
+ public function getHtmlCode() {
+ if ( is_null( $this->mHtmlCode ) ) {
+ $this->mHtmlCode = wfBCP47( $this->getCode() );
+ }
+ return $this->mHtmlCode;
+ }
+
+ /**
* @param $code string
*/
- function setCode( $code ) {
+ public function setCode( $code ) {
$this->mCode = $code;
+ // Ensure we don't leave an incorrect html code lying around
+ $this->mHtmlCode = null;
}
/**
@@ -3265,7 +3530,7 @@ class Language {
* @param $suffix string Append this to the filename
* @return string $prefix . $mangledCode . $suffix
*/
- static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
+ public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
// Protect against path traversal
if ( !Language::isValidCode( $code )
|| strcspn( $code, ":/\\\000" ) !== strlen( $code ) )
@@ -3283,7 +3548,7 @@ class Language {
* @param $suffix string Suffix after the language code
* @return string Language code, or false if $prefix or $suffix isn't found
*/
- static function getCodeFromFileName( $filename, $prefix = 'Language', $suffix = '.php' ) {
+ public static function getCodeFromFileName( $filename, $prefix = 'Language', $suffix = '.php' ) {
$m = null;
preg_match( '/' . preg_quote( $prefix, '/' ) . '([A-Z][a-z_]+)' .
preg_quote( $suffix, '/' ) . '/', $filename, $m );
@@ -3297,45 +3562,69 @@ class Language {
* @param $code string
* @return string
*/
- static function getMessagesFileName( $code ) {
+ public static function getMessagesFileName( $code ) {
global $IP;
- return self::getFileName( "$IP/languages/messages/Messages", $code, '.php' );
+ $file = self::getFileName( "$IP/languages/messages/Messages", $code, '.php' );
+ wfRunHooks( 'Language::getMessagesFileName', array( $code, &$file ) );
+ return $file;
}
/**
* @param $code string
* @return string
*/
- static function getClassFileName( $code ) {
+ public static function getClassFileName( $code ) {
global $IP;
return self::getFileName( "$IP/languages/classes/Language", $code, '.php' );
}
/**
- * Get the fallback for a given language
+ * Get the first fallback for a given language.
*
* @param $code string
*
* @return false|string
*/
- static function getFallbackFor( $code ) {
- if ( $code === 'en' ) {
- // Shortcut
+ public static function getFallbackFor( $code ) {
+ if ( $code === 'en' || !Language::isValidBuiltInCode( $code ) ) {
return false;
} else {
- return self::getLocalisationCache()->getItem( $code, 'fallback' );
+ $fallbacks = self::getFallbacksFor( $code );
+ $first = array_shift( $fallbacks );
+ return $first;
+ }
+ }
+
+ /**
+ * Get the ordered list of fallback languages.
+ *
+ * @since 1.19
+ * @param $code string Language code
+ * @return array
+ */
+ public static function getFallbacksFor( $code ) {
+ if ( $code === 'en' || !Language::isValidBuiltInCode( $code ) ) {
+ return array();
+ } else {
+ $v = self::getLocalisationCache()->getItem( $code, 'fallback' );
+ $v = array_map( 'trim', explode( ',', $v ) );
+ if ( $v[count( $v ) - 1] !== 'en' ) {
+ $v[] = 'en';
+ }
+ return $v;
}
}
/**
* Get all messages for a given language
- * WARNING: this may take a long time
+ * 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().
*
* @param $code string
*
* @return array
*/
- static function getMessagesFor( $code ) {
+ public static function getMessagesFor( $code ) {
return self::getLocalisationCache()->getItem( $code, 'messages' );
}
@@ -3347,11 +3636,23 @@ class Language {
*
* @return string
*/
- static function getMessageFor( $key, $code ) {
+ public static function getMessageFor( $key, $code ) {
return self::getLocalisationCache()->getSubitem( $code, 'messages', $key );
}
/**
+ * Get all message keys for a given language. This is a faster alternative to
+ * array_keys( Language::getMessagesFor( $code ) )
+ *
+ * @since 1.19
+ * @param $code string Language code
+ * @return array of message keys (strings)
+ */
+ public static function getMessageKeysFor( $code ) {
+ return self::getLocalisationCache()->getSubItemList( $code, 'messages' );
+ }
+
+ /**
* @param $talk
* @return mixed
*/
@@ -3412,7 +3713,7 @@ class Language {
*/
public function formatExpiry( $expiry, $format = true ) {
static $infinity, $infinityMsg;
- if( $infinity === null ){
+ if ( $infinity === null ) {
$infinityMsg = wfMessage( 'infiniteblock' );
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
@@ -3431,18 +3732,38 @@ class Language {
/**
* @todo Document
* @param $seconds int|float
- * @param $format String Optional, one of ("avoidseconds","avoidminutes"):
- * "avoidseconds" - don't mention seconds if $seconds >= 1 hour
- * "avoidminutes" - don't mention seconds/minutes if $seconds > 48 hours
+ * @param $format Array Optional
+ * If $format['avoid'] == 'avoidseconds' - don't mention seconds if $seconds >= 1 hour
+ * If $format['avoid'] == 'avoidminutes' - don't mention seconds/minutes if $seconds > 48 hours
+ * If $format['noabbrevs'] is true - use 'seconds' and friends instead of 'seconds-abbrev' and friends
+ * For backwards compatibility, $format may also be one of the strings 'avoidseconds' or 'avoidminutes'
* @return string
*/
- function formatTimePeriod( $seconds, $format = false ) {
+ function formatTimePeriod( $seconds, $format = array() ) {
+ if ( !is_array( $format ) ) {
+ $format = array( 'avoid' => $format ); // For backwards compatibility
+ }
+ if ( !isset( $format['avoid'] ) ) {
+ $format['avoid'] = false;
+ }
+ if ( !isset( $format['noabbrevs' ] ) ) {
+ $format['noabbrevs'] = false;
+ }
+ $secondsMsg = wfMessage(
+ $format['noabbrevs'] ? 'seconds' : 'seconds-abbrev' )->inLanguage( $this );
+ $minutesMsg = wfMessage(
+ $format['noabbrevs'] ? 'minutes' : 'minutes-abbrev' )->inLanguage( $this );
+ $hoursMsg = wfMessage(
+ $format['noabbrevs'] ? 'hours' : 'hours-abbrev' )->inLanguage( $this );
+ $daysMsg = wfMessage(
+ $format['noabbrevs'] ? 'days' : 'days-abbrev' )->inLanguage( $this );
+
if ( round( $seconds * 10 ) < 100 ) {
$s = $this->formatNum( sprintf( "%.1f", round( $seconds * 10 ) / 10 ) );
- $s .= $this->getMessageFromDB( 'seconds-abbrev' );
+ $s = $secondsMsg->params( $s )->text();
} elseif ( round( $seconds ) < 60 ) {
$s = $this->formatNum( round( $seconds ) );
- $s .= $this->getMessageFromDB( 'seconds-abbrev' );
+ $s = $secondsMsg->params( $s )->text();
} elseif ( round( $seconds ) < 3600 ) {
$minutes = floor( $seconds / 60 );
$secondsPart = round( fmod( $seconds, 60 ) );
@@ -3450,10 +3771,10 @@ class Language {
$secondsPart = 0;
$minutes++;
}
- $s = $this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' );
+ $s = $minutesMsg->params( $this->formatNum( $minutes ) )->text();
$s .= ' ';
- $s .= $this->formatNum( $secondsPart ) . $this->getMessageFromDB( 'seconds-abbrev' );
- } elseif ( round( $seconds ) <= 2*86400 ) {
+ $s .= $secondsMsg->params( $this->formatNum( $secondsPart ) )->text();
+ } elseif ( round( $seconds ) <= 2 * 86400 ) {
$hours = floor( $seconds / 3600 );
$minutes = floor( ( $seconds - $hours * 3600 ) / 60 );
$secondsPart = round( $seconds - $hours * 3600 - $minutes * 60 );
@@ -3465,25 +3786,24 @@ class Language {
$minutes = 0;
$hours++;
}
- $s = $this->formatNum( $hours ) . $this->getMessageFromDB( 'hours-abbrev' );
+ $s = $hoursMsg->params( $this->formatNum( $hours ) )->text();
$s .= ' ';
- $s .= $this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' );
- if ( !in_array( $format, array( 'avoidseconds', 'avoidminutes' ) ) ) {
- $s .= ' ' . $this->formatNum( $secondsPart ) .
- $this->getMessageFromDB( 'seconds-abbrev' );
+ $s .= $minutesMsg->params( $this->formatNum( $minutes ) )->text();
+ if ( !in_array( $format['avoid'], array( 'avoidseconds', 'avoidminutes' ) ) ) {
+ $s .= ' ' . $secondsMsg->params( $this->formatNum( $secondsPart ) )->text();
}
} else {
$days = floor( $seconds / 86400 );
- if ( $format === 'avoidminutes' ) {
+ if ( $format['avoid'] === 'avoidminutes' ) {
$hours = round( ( $seconds - $days * 86400 ) / 3600 );
if ( $hours == 24 ) {
$hours = 0;
$days++;
}
- $s = $this->formatNum( $days ) . $this->getMessageFromDB( 'days-abbrev' );
+ $s = $daysMsg->params( $this->formatNum( $days ) )->text();
$s .= ' ';
- $s .= $this->formatNum( $hours ) . $this->getMessageFromDB( 'hours-abbrev' );
- } elseif ( $format === 'avoidseconds' ) {
+ $s .= $hoursMsg->params( $this->formatNum( $hours ) )->text();
+ } elseif ( $format['avoid'] === 'avoidseconds' ) {
$hours = floor( ( $seconds - $days * 86400 ) / 3600 );
$minutes = round( ( $seconds - $days * 86400 - $hours * 3600 ) / 60 );
if ( $minutes == 60 ) {
@@ -3494,13 +3814,13 @@ class Language {
$hours = 0;
$days++;
}
- $s = $this->formatNum( $days ) . $this->getMessageFromDB( 'days-abbrev' );
+ $s = $daysMsg->params( $this->formatNum( $days ) )->text();
$s .= ' ';
- $s .= $this->formatNum( $hours ) . $this->getMessageFromDB( 'hours-abbrev' );
+ $s .= $hoursMsg->params( $this->formatNum( $hours ) )->text();
$s .= ' ';
- $s .= $this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' );
+ $s .= $minutesMsg->params( $this->formatNum( $minutes ) )->text();
} else {
- $s = $this->formatNum( $days ) . $this->getMessageFromDB( 'days-abbrev' );
+ $s = $daysMsg->params( $this->formatNum( $days ) )->text();
$s .= ' ';
$s .= $this->formatTimePeriod( $seconds - $days * 86400, $format );
}
@@ -3509,55 +3829,143 @@ class Language {
}
/**
+ * Format a bitrate for output, using an appropriate
+ * unit (bps, kbps, Mbps, Gbps, Tbps, Pbps, Ebps, Zbps or Ybps) according to the magnitude in question
+ *
+ * This use base 1000. For base 1024 use formatSize(), for another base
+ * see formatComputingNumbers()
+ *
* @param $bps int
* @return string
*/
function formatBitrate( $bps ) {
- $units = array( 'bps', 'kbps', 'Mbps', 'Gbps' );
- if ( $bps <= 0 ) {
- return $this->formatNum( $bps ) . $units[0];
- }
- $unitIndex = floor( log10( $bps ) / 3 );
- $mantissa = $bps / pow( 1000, $unitIndex );
- if ( $mantissa < 10 ) {
- $mantissa = round( $mantissa, 1 );
- } else {
- $mantissa = round( $mantissa );
+ return $this->formatComputingNumbers( $bps, 1000, "bitrate-$1bits" );
+ }
+
+ /**
+ * @param $size int Size of the unit
+ * @param $boundary int Size boundary (1000, or 1024 in most cases)
+ * @param $messageKey string Message key to be uesd
+ * @return string
+ */
+ function formatComputingNumbers( $size, $boundary, $messageKey ) {
+ if ( $size <= 0 ) {
+ return str_replace( '$1', $this->formatNum( $size ),
+ $this->getMessageFromDB( str_replace( '$1', '', $messageKey ) )
+ );
+ }
+ $sizes = array( '', 'kilo', 'mega', 'giga', 'tera', 'peta', 'exa', 'zeta', 'yotta' );
+ $index = 0;
+
+ $maxIndex = count( $sizes ) - 1;
+ while ( $size >= $boundary && $index < $maxIndex ) {
+ $index++;
+ $size /= $boundary;
+ }
+
+ // For small sizes no decimal places necessary
+ $round = 0;
+ if ( $index > 1 ) {
+ // For MB and bigger two decimal places are smarter
+ $round = 2;
}
- return $this->formatNum( $mantissa ) . $units[$unitIndex];
+ $msg = str_replace( '$1', $sizes[$index], $messageKey );
+
+ $size = round( $size, $round );
+ $text = $this->getMessageFromDB( $msg );
+ return str_replace( '$1', $this->formatNum( $size ), $text );
}
/**
* Format a size in bytes for output, using an appropriate
- * unit (B, KB, MB or GB) according to the magnitude in question
+ * unit (B, KB, MB, GB, TB, PB, EB, ZB or YB) according to the magnitude in question
*
- * @param $size Size to format
+ * This method use base 1024. For base 1000 use formatBitrate(), for
+ * another base see formatComputingNumbers()
+ *
+ * @param $size int Size to format
* @return string Plain text (not HTML)
*/
function formatSize( $size ) {
- // For small sizes no decimal places necessary
- $round = 0;
- if ( $size > 1024 ) {
- $size = $size / 1024;
- if ( $size > 1024 ) {
- $size = $size / 1024;
- // For MB and bigger two decimal places are smarter
- $round = 2;
- if ( $size > 1024 ) {
- $size = $size / 1024;
- $msg = 'size-gigabytes';
- } else {
- $msg = 'size-megabytes';
- }
- } else {
- $msg = 'size-kilobytes';
- }
+ return $this->formatComputingNumbers( $size, 1024, "size-$1bytes" );
+ }
+
+ /**
+ * Make a list item, used by various special pages
+ *
+ * @param $page String Page link
+ * @param $details String Text between brackets
+ * @param $oppositedm Boolean Add the direction mark opposite to your
+ * language, to display text properly
+ * @return String
+ */
+ function specialList( $page, $details, $oppositedm = true ) {
+ $dirmark = ( $oppositedm ? $this->getDirMark( true ) : '' ) .
+ $this->getDirMark();
+ $details = $details ? $dirmark . $this->getMessageFromDB( 'word-separator' ) .
+ wfMsgExt( 'parentheses', array( 'escape', 'replaceafter', 'language' => $this ), $details ) : '';
+ return $page . $details;
+ }
+
+ /**
+ * Generate (prev x| next x) (20|50|100...) type links for paging
+ *
+ * @param $title Title object to link
+ * @param $offset Integer offset parameter
+ * @param $limit Integer limit parameter
+ * @param $query String optional URL query parameter string
+ * @param $atend Bool optional param for specified if this is the last page
+ * @return String
+ */
+ public function viewPrevNext( Title $title, $offset, $limit, array $query = array(), $atend = false ) {
+ // @todo FIXME: Why on earth this needs one message for the text and another one for tooltip?
+
+ # Make 'previous' link
+ $prev = wfMessage( 'prevn' )->inLanguage( $this )->title( $title )->numParams( $limit )->text();
+ if ( $offset > 0 ) {
+ $plink = $this->numLink( $title, max( $offset - $limit, 0 ), $limit,
+ $query, $prev, 'prevn-title', 'mw-prevlink' );
} else {
- $msg = 'size-bytes';
+ $plink = htmlspecialchars( $prev );
}
- $size = round( $size, $round );
- $text = $this->getMessageFromDB( $msg );
- return str_replace( '$1', $this->formatNum( $size ), $text );
+
+ # Make 'next' link
+ $next = wfMessage( 'nextn' )->inLanguage( $this )->title( $title )->numParams( $limit )->text();
+ if ( $atend ) {
+ $nlink = htmlspecialchars( $next );
+ } else {
+ $nlink = $this->numLink( $title, $offset + $limit, $limit,
+ $query, $next, 'prevn-title', 'mw-nextlink' );
+ }
+
+ # Make links to set number of items per page
+ $numLinks = array();
+ foreach ( array( 20, 50, 100, 250, 500 ) as $num ) {
+ $numLinks[] = $this->numLink( $title, $offset, $num,
+ $query, $this->formatNum( $num ), 'shown-title', 'mw-numlink' );
+ }
+
+ return wfMessage( 'viewprevnext' )->inLanguage( $this )->title( $title
+ )->rawParams( $plink, $nlink, $this->pipeList( $numLinks ) )->escaped();
+ }
+
+ /**
+ * Helper function for viewPrevNext() that generates links
+ *
+ * @param $title Title object to link
+ * @param $offset Integer offset parameter
+ * @param $limit Integer limit parameter
+ * @param $query Array extra query parameters
+ * @param $link String text to use for the link; will be escaped
+ * @param $tooltipMsg String name of the message to use as tooltip
+ * @param $class String value of the "class" attribute of the link
+ * @return String HTML fragment
+ */
+ private function numLink( Title $title, $offset, $limit, array $query, $link, $tooltipMsg, $class ) {
+ $query = array( 'limit' => $limit, 'offset' => $offset ) + $query;
+ $tooltip = wfMessage( $tooltipMsg )->inLanguage( $this )->title( $title )->numParams( $limit )->text();
+ return Html::element( 'a', array( 'href' => $title->getLocalURL( $query ),
+ 'title' => $tooltip, 'class' => $class ), $link );
}
/**
@@ -3565,7 +3973,7 @@ class Language {
*
* @return string
*/
- function getConvRuleTitle() {
+ public function getConvRuleTitle() {
return $this->mConverter->getConvRuleTitle();
}
}
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php
index ba89be74..5e4bce8d 100644
--- a/languages/LanguageConverter.php
+++ b/languages/LanguageConverter.php
@@ -117,7 +117,7 @@ class LanguageConverter {
* in this case. Right now this is only used by zh.
*
* @param $variant String: the language code of the variant
- * @return String: The code of the fallback language or the
+ * @return String|array: The code of the fallback language or the
* main code if there is no fallback
*/
public function getVariantFallbacks( $variant ) {
@@ -158,7 +158,7 @@ class LanguageConverter {
// not memoized (i.e. there return value is not cached) since
// new information might appear during processing after this
// is first called.
- if ( $req ) {
+ if ( $this->validateVariant( $req ) ) {
return $req;
}
return $this->mMainLanguageCode;
@@ -189,7 +189,7 @@ class LanguageConverter {
* @param $variant String: the variant to validate
* @return Mixed: returns the variant if it is valid, null otherwise
*/
- protected function validateVariant( $variant = null ) {
+ public function validateVariant( $variant = null ) {
if ( $variant !== null && in_array( $variant, $this->mVariants ) ) {
return $variant;
}
@@ -322,6 +322,11 @@ class LanguageConverter {
}
}
+ if( $this->guessVariant( $text, $toVariant ) ) {
+ wfProfileOut( __METHOD__ );
+ return $text;
+ }
+
/* we convert everything except:
1. HTML markups (anything between < and >)
2. HTML entities
@@ -368,11 +373,11 @@ class LanguageConverter {
$sourceBlob .= substr( $text, $startPos, $elementPos - $startPos ) . "\000";
// Advance to the next position
- $startPos = $elementPos + strlen( $element );
+ $startPos = $elementPos + strlen( $element );
// Translate any alt or title attributes inside the matched element
- if ( $element !== '' && preg_match( '/^(<[^>\s]*)\s([^>]*)(.*)$/', $element,
- $elementMatches ) )
+ if ( $element !== '' && preg_match( '/^(<[^>\s]*)\s([^>]*)(.*)$/', $element,
+ $elementMatches ) )
{
$attrs = Sanitizer::decodeTagAttributes( $elementMatches[2] );
$changed = false;
@@ -385,7 +390,7 @@ class LanguageConverter {
if ( !strpos( $attr, '://' ) ) {
$attr = $this->translate( $attr, $toVariant );
}
-
+
// Remove HTML tags to avoid disrupting the layout
$attr = preg_replace( '/<[^>]+>/', '', $attr );
if ( $attr !== $attrs[$attrName] ) {
@@ -394,7 +399,7 @@ class LanguageConverter {
}
}
if ( $changed ) {
- $element = $elementMatches[1] . Html::expandAttributes( $attrs ) .
+ $element = $elementMatches[1] . Html::expandAttributes( $attrs ) .
$elementMatches[3];
}
}
@@ -571,7 +576,7 @@ class LanguageConverter {
*/
public function convertTo( $text, $variant ) {
global $wgDisableLangConversion;
- if ( $wgDisableLangConversion ) {
+ if ( $wgDisableLangConversion || $this->guessVariant( $text, $variant ) ) {
return $text;
}
return $this->recursiveConvertTopLevel( $text, $variant );
@@ -773,6 +778,20 @@ class LanguageConverter {
}
/**
+ * Guess if a text is written in a variant. This should be implemented in subclasses.
+ *
+ * @param string $text the text to be checked
+ * @param string $variant language code of the variant to be checked for
+ * @return bool true if $text appears to be written in $variant, false if not
+ *
+ * @author Nikola Smolenski <smolensk@eunet.rs>
+ * @since 1.19
+ */
+ public function guessVariant($text, $variant) {
+ return false;
+ }
+
+ /**
* Load default conversion tables.
* This method must be implemented in derived class.
*
@@ -870,26 +889,26 @@ class LanguageConverter {
return array();
}
- if ( strpos( $code, '/' ) === false ) {
- $txt = MessageCache::singleton()->get( 'Conversiontable', true, $code );
- if ( $txt === false ) {
- # @todo FIXME: This method doesn't seem to be expecting
- # this possible outcome...
- $txt = '&lt;Conversiontable&gt;';
- }
+ $parsed[$key] = true;
+
+ if ( $subpage === '' ) {
+ $txt = MessageCache::singleton()->get( 'conversiontable', true, $code );
} else {
- $title = Title::makeTitleSafe(
- NS_MEDIAWIKI,
- "Conversiontable/$code"
- );
+ $txt = false;
+ $title = Title::makeTitleSafe( NS_MEDIAWIKI, $key );
if ( $title && $title->exists() ) {
- $article = new Article( $title );
- $txt = $article->getContents();
- } else {
- $txt = '';
+ $revision = Revision::newFromTitle( $title );
+ if ( $revision ) {
+ $txt = $revision->getRawText();
+ }
}
}
+ # Nothing to parse if there's no text
+ if ( $txt === false || $txt === null || $txt === '' ) {
+ return array();
+ }
+
// get all subpage links of the form
// [[MediaWiki:Conversiontable/zh-xx/...|...]]
$linkhead = $this->mLangObj->getNsText( NS_MEDIAWIKI ) .
@@ -938,7 +957,6 @@ class LanguageConverter {
$ret[trim( $m[0] )] = trim( $tt[0] );
}
}
- $parsed[$key] = true;
// recursively parse the subpages
if ( $recursive ) {
@@ -1364,19 +1382,21 @@ class ConverterRule {
if ( isset( $this->mVariantFlags[$variant] ) ) {
// then convert <text to convert> to current language
$this->mRules = $this->mConverter->autoConvert( $this->mRules,
- $variant );
+ $variant );
} else { // if current variant no in flags,
// then we check its fallback variants.
$variantFallbacks =
$this->mConverter->getVariantFallbacks( $variant );
- foreach ( $variantFallbacks as $variantFallback ) {
- // if current variant's fallback exist in flags
- if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
- // then convert <text to convert> to fallback language
- $this->mRules =
- $this->mConverter->autoConvert( $this->mRules,
- $variantFallback );
- break;
+ if( is_array( $variantFallbacks ) ) {
+ foreach ( $variantFallbacks as $variantFallback ) {
+ // if current variant's fallback exist in flags
+ if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
+ // then convert <text to convert> to fallback language
+ $this->mRules =
+ $this->mConverter->autoConvert( $this->mRules,
+ $variantFallback );
+ break;
+ }
}
}
}
diff --git a/languages/Names.php b/languages/Names.php
index adf758f7..e9e0e157 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -86,7 +86,8 @@
'el' => 'Ελληνικά', # Greek
'eml' => 'Emiliàn e rumagnòl', # Emiliano-Romagnolo / Sammarinese
'en' => 'English', # English
- 'en-gb' => 'British English', # British English
+ 'en-ca' => 'Canadian English', # Canadian English
+ 'en-gb' => 'British English', # British English
'eo' => 'Esperanto', # Esperanto
'es' => 'Español', # Spanish
'et' => 'Eesti', # Estonian
@@ -179,9 +180,9 @@
'krc' => 'Къарачай-Малкъар', # Karachay-Balkar
'kri' => 'Krio', # Krio
'krj' => 'Kinaray-a', # Kinaray-a
- 'ks' => 'कशà¥à¤®à¥€à¤°à¥€ - (كشميري)', # Kashmiri (multiple scripts - defaults to Perso-Arabic)
- 'ks-arab' => 'كشميري', # Kashmiri (Perso-Arabic script)
- 'ks-deva' => 'कशà¥à¤®à¥€à¤°à¥€', # Kashmiri (Devanagari script)
+ 'ks' => 'कॉशà¥à¤° - کٲشÙر', # Kashmiri (multiple scripts - defaults to Perso-Arabic)
+ 'ks-arab' => 'کٲشÙر', # Kashmiri (Perso-Arabic script)
+ 'ks-deva' => 'कॉशà¥à¤°', # Kashmiri (Devanagari script)
'ksh' => 'Ripoarisch', # Ripuarian
'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
'ku-latn' => "\xE2\x80\xAAKurdî (latînî)\xE2\x80\xAC", # Northern Kurdish (Latin script)
@@ -243,7 +244,7 @@
'nl' => 'Nederlands', # Dutch
'nl-informal' => "\xE2\x80\xAANederlands (informeel)\xE2\x80\xAC", # Dutch (informal address ("je"))
'nn' => "\xE2\x80\xAANorsk (nynorsk)\xE2\x80\xAC", # Norwegian (Nynorsk)
- 'no' => "\xE2\x80\xAANorsk (bokmål)\xE2\x80\xAC", # Norwegian
+ 'no' => "\xE2\x80\xAANorsk (bokmål)\xE2\x80\xAC", # Norwegian (falls back to nb).
'nov' => 'Novial', # Novial
'nrm' => 'Nouormand', # Norman
'nso' => 'Sesotho sa Leboa', # Northern Sotho
@@ -289,7 +290,7 @@
# 'ruq-grek' => 'Βλαεστε', # Megleno-Romanian (Greek script)
'ruq-latn' => 'Vlăheşte', # Megleno-Romanian (Latin script)
'rw' => 'Kinyarwanda', # Kinyarwanda, should possibly be Kinyarwandi
- 'sa' => 'संसà¥à¤•à¥ƒà¤¤', # Sanskrit
+ 'sa' => 'संसà¥à¤•à¥ƒà¤¤à¤®à¥', # Sanskrit
'sah' => 'Саха тыла', # Sakha
'sc' => 'Sardu', # Sardinian
'scn' => 'Sicilianu', # Sicilian
@@ -301,7 +302,9 @@
'sg' => 'Sängö', # Sango/Sangho
'sgs' => 'Žemaitėška', # Samogitian
'sh' => 'Srpskohrvatski / СрпÑкохрватÑки', # Serbocroatian
- 'shi' => 'Tašlḥiyt', # Tachelhit
+ 'shi' => 'TaÅ¡lḥiyt/ⵜⴰⵛâµâµƒâµ‰âµœ', # Tachelhit (multiple scripts - defaults to Latin)
+ 'shi-tfng' => 'ⵜⴰⵛâµâµƒâµ‰âµœ', # Tachelhit (Tifinagh script)
+ 'shi-latn' => 'Tašlḥiyt', # Tachelhit (Latin script)
'si' => 'සිංහල', # Sinhalese
'simple' => 'Simple English', # Simple English
'sk' => 'SlovenÄina', # Slovak
@@ -334,6 +337,7 @@
'ti' => 'ትáŒáˆ­áŠ›', # Tigrinya
'tk' => 'Türkmençe', # Turkmen
'tl' => 'Tagalog', # Tagalog
+ 'tly' => 'толышә зывон', # Talysh
'tn' => 'Setswana', # Setswana
'to' => 'lea faka-Tonga', # Tonga (Tonga Islands)
'tokipona' => 'Toki Pona', # Toki Pona
@@ -356,7 +360,7 @@
'uz' => 'O\'zbek', # Uzbek
've' => 'Tshivenda', # Venda
'vec' => 'Vèneto', # Venetian
- 'vep' => 'Vepsan kel\'', # Veps
+ 'vep' => 'Vepsän kel\'', # Veps
'vi' => 'Tiếng Việt', # Vietnamese
'vls' => 'West-Vlams', # West Flemish
'vmf' => 'Mainfränkisch', # Upper Franconian, Main-Franconian
diff --git a/languages/classes/LanguageBe.php b/languages/classes/LanguageBe.php
index bb0ba9e8..7d881ac9 100644
--- a/languages/classes/LanguageBe.php
+++ b/languages/classes/LanguageBe.php
@@ -7,7 +7,7 @@
* @ingroup Language
*
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @link http://be.wikipedia.org/wiki/Talk:LanguageBe.php
+ * @see http://be.wikipedia.org/wiki/Talk:LanguageBe.php
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
* @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
*/
diff --git a/languages/classes/LanguageBe_tarask.php b/languages/classes/LanguageBe_tarask.php
index 25c3f700..0e07a71c 100644
--- a/languages/classes/LanguageBe_tarask.php
+++ b/languages/classes/LanguageBe_tarask.php
@@ -4,7 +4,7 @@
* @ingroup Language
*
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @link http://be-x-old.wikipedia.org/wiki/Project_talk:LanguageBe_tarask.php
+ * @see http://be-x-old.wikipedia.org/wiki/Project_talk:LanguageBe_tarask.php
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
* @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
*/
@@ -27,7 +27,10 @@ class LanguageBe_tarask extends Language {
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 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];
// @todo FIXME: CLDR defines 4 plural forms instead of 3
diff --git a/languages/classes/LanguageBs.php b/languages/classes/LanguageBs.php
index c501b35a..7c13037e 100644
--- a/languages/classes/LanguageBs.php
+++ b/languages/classes/LanguageBs.php
@@ -30,9 +30,10 @@ class LanguageBs extends Language {
}
}
- # Convert from the nominative form of a noun to some other case
- # Invoked with {{GRAMMAR:case|word}}
/**
+ * Convert from the nominative form of a noun to some other case
+ * Invoked with {{GRAMMAR:case|word}}
+ *
* Cases: genitiv, dativ, akuzativ, vokativ, instrumental, lokativ
*
* @param $word string
diff --git a/languages/classes/LanguageCy.php b/languages/classes/LanguageCy.php
index a3a28689..1b0863ac 100644
--- a/languages/classes/LanguageCy.php
+++ b/languages/classes/LanguageCy.php
@@ -15,8 +15,6 @@ class LanguageCy extends Language {
function convertPlural( $count, $forms ) {
if ( !count( $forms ) ) { return ''; }
- // @todo FIXME: CLDR defines 4 plural forms; very different, actually.
- // See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#cy
$forms = $this->preConvertPlural( $forms, 6 );
$count = abs( $count );
if ( $count >= 0 && $count <= 3 ) {
diff --git a/languages/classes/LanguageGd.php b/languages/classes/LanguageGd.php
index 5fe3d058..737cddae 100644
--- a/languages/classes/LanguageGd.php
+++ b/languages/classes/LanguageGd.php
@@ -29,13 +29,13 @@ class LanguageGd extends Language {
$forms = $this->preConvertPlural( $forms, 6 );
$count = abs( $count );
- if ( $count === 1 ) {
+ if ( $count == 1 ) {
return $forms[0];
- } elseif ( $count === 2 ) {
+ } elseif ( $count == 2 ) {
return $forms[1];
- } elseif ( $count === 11 ) {
+ } elseif ( $count == 11 ) {
return $forms[2];
- } elseif ( $count === 12 ) {
+ } elseif ( $count == 12 ) {
return $forms[3];
} elseif ( ($count >= 3 && $count <= 10) || ($count >= 13 && $count <= 19) ) {
return $forms[4];
diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php
index e65feee9..87483c65 100644
--- a/languages/classes/LanguageHe.php
+++ b/languages/classes/LanguageHe.php
@@ -39,7 +39,7 @@ class LanguageHe extends Language {
$word = substr( $word, 2 );
}
- # Add a hyphen if non-Hebrew letters
+ # Add a hyphen (maqaf) if non-Hebrew letters
if ( substr( $word, 0, 2 ) < "×" || substr( $word, 0, 2 ) > "ת" ) {
$word = "Ö¾" . $word;
}
@@ -59,12 +59,12 @@ class LanguageHe extends Language {
if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
- if ( $count == '1' ) {
- return $forms[0];
- } elseif ( $count == '2' && isset( $forms[2] ) ) {
- return $forms[2];
+ if ( $count == 1 ) {
+ return $forms[0]; // Singular
+ } elseif ( $count == 2 ) {
+ return $forms[2]; // Dual or plural if dual is not provided (filled in preConvertPlural)
} else {
- return $forms[1];
+ return $forms[1]; // Plural
}
}
}
diff --git a/languages/classes/LanguageHu.php b/languages/classes/LanguageHu.php
index f82bab2f..dbb6f5bb 100644
--- a/languages/classes/LanguageHu.php
+++ b/languages/classes/LanguageHu.php
@@ -25,5 +25,6 @@ class LanguageHu extends Language {
case 'k':
return $word . 'k';
}
+ return '';
}
}
diff --git a/languages/classes/LanguageIu.php b/languages/classes/LanguageIu.php
index c6221dee..72f6af13 100644
--- a/languages/classes/LanguageIu.php
+++ b/languages/classes/LanguageIu.php
@@ -7,7 +7,7 @@
* Conversion script between Latin and Syllabics for Inuktitut.
* - Syllabics -> lowercase Latin
* - lowercase/uppercase Latin -> Syllabics
-*
+*
*
* Based on:
* - http://commons.wikimedia.org/wiki/Image:Inuktitut.png
@@ -21,6 +21,8 @@ require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
*
*/
class IuConverter extends LanguageConverter {
+
+ protected $mDoContentConvert;
var $mToLatin = array(
'á¦' => 'h', 'áƒ' => 'i', 'á„' => 'ii', 'á…' => 'u', 'á†' => 'uu', 'áŠ' => 'a', 'á‹' => 'aa',
'ᑉ' => 'p', 'á±' => 'pi', 'á²' => 'pii', 'á³' => 'pu', 'á´' => 'puu', 'á¸' => 'pa', 'á¹' => 'paa',
@@ -111,10 +113,7 @@ class IuConverter extends LanguageConverter {
* @return string
*/
function parserConvert( $text, &$parser ) {
- if ( is_object( $parser->getTitle() ) && $parser->getTitle()->isTalkPage() )
- $this->mDoContentConvert = false;
- else
- $this->mDoContentConvert = true;
+ $this->mDoContentConvert = !( is_object( $parser->getTitle() ) && $parser->getTitle()->isTalkPage() );
return parent::parserConvert( $text, $parser );
}
diff --git a/languages/classes/LanguageKk_cyrl.php b/languages/classes/LanguageKk_cyrl.php
index ba84bf93..30f74e6e 100644
--- a/languages/classes/LanguageKk_cyrl.php
+++ b/languages/classes/LanguageKk_cyrl.php
@@ -12,7 +12,7 @@ class LanguageKk_cyrl extends Language {
* Cases: genitive, dative, accusative, locative, ablative, comitative + possessive forms
*
* @param $word string
- * @param $case stirng
+ * @param $case string
*
* @return string
*/
diff --git a/languages/classes/LanguageLt.php b/languages/classes/LanguageLt.php
index 09cacae0..af38b6ae 100644
--- a/languages/classes/LanguageLt.php
+++ b/languages/classes/LanguageLt.php
@@ -12,6 +12,7 @@ class LanguageLt extends Language {
*/
/**
+ * Lithuanian plural forms as per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lt
* @param $count int
* @param $forms array
*
@@ -20,12 +21,13 @@ class LanguageLt extends Language {
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 the number is not mentioned in message, then use $form[0] for singular and $form[1] for plural or zero
if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
$forms = $this->preConvertPlural( $forms, 3 );
-
+ // Form[0] if n mod 10 is 1 and n mod 100 not in 11..19;
if ( $count % 10 == 1 && $count % 100 != 11 ) return $forms[0];
+ // Forms[1] if n mod 10 in 2..9 and n mod 100 not in 11..19;
if ( $count % 10 >= 2 && ( $count % 100 < 10 || $count % 100 >= 20 ) ) return $forms[1];
return $forms[2];
}
diff --git a/languages/classes/LanguageMk.php b/languages/classes/LanguageMk.php
index 4ae7f412..4e3b576f 100644
--- a/languages/classes/LanguageMk.php
+++ b/languages/classes/LanguageMk.php
@@ -17,7 +17,7 @@ class LanguageMk extends Language {
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 {
diff --git a/languages/classes/LanguageMo.php b/languages/classes/LanguageMo.php
index 5d78a502..2fa48e95 100644
--- a/languages/classes/LanguageMo.php
+++ b/languages/classes/LanguageMo.php
@@ -14,13 +14,14 @@ class LanguageMo extends Language {
function convertPlural( $count, $forms ) {
// Plural rules per
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mo
+ // Identical to Romanian (ro).
if ( !count( $forms ) ) { return ''; }
$forms = $this->preConvertPlural( $forms, 3 );
if ( $count == 1 ) {
$index = 0;
- } elseif ( $count == 0 || $count % 100 < 20 ) {
+ } elseif ( $count == 0 || ( $count % 100 > 0 && $count % 100 < 20 ) ) {
$index = 1;
} else {
$index = 2;
diff --git a/languages/classes/LanguageMt.php b/languages/classes/LanguageMt.php
index ef143da5..5cf40ce5 100644
--- a/languages/classes/LanguageMt.php
+++ b/languages/classes/LanguageMt.php
@@ -19,8 +19,8 @@ class LanguageMt extends Language {
$forms = $this->preConvertPlural( $forms, 4 );
- if ( $count === 1 ) $index = 0;
- elseif ( $count === 0 || ( $count % 100 > 1 && $count % 100 < 11 ) ) $index = 1;
+ 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/LanguageQqx.php b/languages/classes/LanguageQqx.php
index 88d38f59..6798b24c 100644
--- a/languages/classes/LanguageQqx.php
+++ b/languages/classes/LanguageQqx.php
@@ -9,6 +9,10 @@
* @ingroup Language
*/
class LanguageQqx extends Language {
+ /**
+ * @param $key string
+ * @return string
+ */
function getMessage( $key ) {
return "($key)";
}
diff --git a/languages/classes/LanguageRo.php b/languages/classes/LanguageRo.php
index 9cfd8b57..ce3e5159 100644
--- a/languages/classes/LanguageRo.php
+++ b/languages/classes/LanguageRo.php
@@ -20,7 +20,7 @@ class LanguageRo extends Language {
if ( $count == 1 ) {
$index = 0;
- } elseif ( $count == 0 || $count % 100 < 20 ) {
+ } elseif ( $count == 0 || ( $count % 100 > 0 && $count % 100 < 20 ) ) {
$index = 1;
} else {
$index = 2;
diff --git a/languages/classes/LanguageRu.php b/languages/classes/LanguageRu.php
index e16761ad..b5371d2e 100644
--- a/languages/classes/LanguageRu.php
+++ b/languages/classes/LanguageRu.php
@@ -72,8 +72,10 @@ class LanguageRu extends Language {
* Examples:
* message with number
* "Сделано $1 {{PLURAL:$1|изменение|изменениÑ|изменений}}"
+ * ("$1 change[s] were made)
* message without number
* "ДейÑтвие не может быть выполнено по {{PLURAL:$1|Ñледующей причине|Ñледующим причинам}}:"
+ * ("The action cannot be performed for the following reason[s]")
* @param $count int
* @param $forms array
*
@@ -82,7 +84,10 @@ class LanguageRu extends Language {
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 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];
// @todo FIXME: CLDR defines 4 plural forms. Form with decimals missing.
diff --git a/languages/classes/LanguageSgs.php b/languages/classes/LanguageSgs.php
index 8c10182d..d47863d0 100644
--- a/languages/classes/LanguageSgs.php
+++ b/languages/classes/LanguageSgs.php
@@ -17,7 +17,7 @@ class LanguageSgs extends Language {
$forms = $this->preConvertPlural( $forms, 4 );
$count = abs( $count );
- if ( $count === 0 || ( $count % 100 === 0 || ( $count % 100 >= 10 && $count % 100 < 20 ) ) ) {
+ if ( $count == 0 || ( $count % 100 === 0 || ( $count % 100 >= 10 && $count % 100 < 20 ) ) ) {
return $forms[2];
} elseif ( $count % 10 === 1 ) {
return $forms[0];
diff --git a/languages/classes/LanguageSr_el.deps.php b/languages/classes/LanguageShi.deps.php
index 67154c20..3b78d875 100644
--- a/languages/classes/LanguageSr_el.deps.php
+++ b/languages/classes/LanguageShi.deps.php
@@ -1,8 +1,8 @@
<?php
// This file exists to ensure that base classes are preloaded before
-// LanguageSr_el.php is compiled, working around a bug in the APC opcode
+// LanguageIu.php is compiled, working around a bug in the APC opcode
// cache on PHP 5, where cached code can break if the include order
// changed on a subsequent page view.
// see http://mail.wikipedia.org/pipermail/wikitech-l/2006-January/033660.html
-require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
+require_once( dirname(__FILE__).'/../LanguageConverter.php' );
diff --git a/languages/classes/LanguageShi.php b/languages/classes/LanguageShi.php
new file mode 100644
index 00000000..08a06d67
--- /dev/null
+++ b/languages/classes/LanguageShi.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * @addtogroup Language
+ */
+
+/*
+* Conversion script between Latin and Tifinagh for Tachelhit.
+* - Tifinagh -> lowercase Latin
+* - lowercase/uppercase Latin -> Tifinagh
+*
+*
+* Based on:
+* - http://en.wikipedia.org/wiki/Shilha_language
+* - LanguageSr.php
+*
+* @ingroup Language
+*/
+require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
+
+/**
+ *
+ */
+class ShiConverter extends LanguageConverter {
+
+ protected $mDoContentConvert;
+
+ var $mToLatin = array(
+ 'â´°' => 'a', 'â´±' => 'b', 'â´³' => 'g', 'â´·' => 'd', 'â´¹' => 'á¸', 'â´»' => 'e',
+ 'ⴼ' => 'f', 'ⴽ' => 'k', 'ⵀ' => 'h', 'ⵃ' => 'ḥ', 'ⵄ' => 'ε', 'ⵅ' => 'x',
+ 'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j', 'âµ' => 'l', 'ⵎ' => 'm', 'âµ' => 'n',
+ 'ⵓ' => 'u', 'ⵔ' => 'r', 'ⵕ' => 'ṛ', 'ⵖ' => 'γ', 'ⵙ' => 's', 'ⵚ' => 'ṣ',
+ 'ⵛ' => 'š', 'ⵜ' => 't', 'ⵟ' => 'ṭ', 'ⵡ' => 'w', 'ⵢ' => 'y', 'ⵣ' => 'z',
+ 'ⵥ' => 'ẓ', 'ⵯ' => 'ʷ', 'ⵖ' => 'ɣ', 'ⵠ' => 'v', 'ⵒ' => 'p',
+ );
+
+ var $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',
+ 'Z' => 'z', 'Æ”' => 'É£',
+ );
+
+ var $mToTifinagh = array(
+ 'a' => 'â´°', 'b' => 'â´±', 'g' => 'â´³', 'd' => 'â´·', 'á¸' => 'â´¹', 'e' => 'â´»',
+ 'f' => 'ⴼ', 'k' => 'ⴽ', 'h' => 'ⵀ', 'ḥ' => 'ⵃ', 'ε' => 'ⵄ', 'x' => 'ⵅ',
+ 'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ', 'l' => 'âµ', 'm' => 'ⵎ', 'n' => 'âµ',
+ 'u' => 'ⵓ', 'r' => 'ⵔ', 'ṛ' => 'ⵕ', 'γ' => 'ⵖ', 's' => 'ⵙ', 'ṣ' => 'ⵚ',
+ 'š' => 'ⵛ', 't' => 'ⵜ', 'ṭ' => 'ⵟ', 'w' => 'ⵡ', 'y' => 'ⵢ', 'z' => 'ⵣ',
+ 'ẓ' => 'ⵥ', 'ʷ' => 'ⵯ', 'ɣ' => 'ⵖ', 'v' => 'ⵠ', 'p' => 'ⵒ',
+ );
+
+ function loadDefaultTables() {
+ $this->mTables = array(
+ 'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
+ 'shi-tfng' => new ReplacementArray( $this->mToTifinagh ),
+ 'shi-latn' => new ReplacementArray( $this->mToLatin ),
+ 'shi' => new ReplacementArray()
+ );
+ }
+
+ /**
+ * rules should be defined as -{Tifinagh | Latin-} -or-
+ * -{code:text | code:text | ...}-
+ * update: delete all rule parsing because it's not used
+ * currently, and just produces a couple of bugs
+ *
+ * @param $rule string
+ * @param $flags array
+ * @return array
+ */
+ function parseManualRule( $rule, $flags = array() ) {
+ if ( in_array( 'T', $flags ) ) {
+ return parent::parseManualRule( $rule, $flags );
+ }
+
+ $carray = array();
+ // otherwise ignore all formatting
+ foreach ( $this->mVariants as $v ) {
+ $carray[$v] = $rule;
+ }
+
+ return $carray;
+ }
+
+ /**
+ * Do not convert content on talk pages
+ *
+ * @param $text string
+ * @param $parser Parser
+ * @return string
+ */
+ function parserConvert( $text, &$parser ) {
+ $this->mDoContentConvert = !( is_object( $parser->getTitle() ) && $parser->getTitle()->isTalkPage() );
+
+ return parent::parserConvert( $text, $parser );
+ }
+
+ /**
+ * A function wrapper:
+ * - if there is no selected variant, leave the link
+ * names as they were
+ * - do not try to find variants for usernames
+ *
+ * @param $link string
+ * @param $nt Title
+ * @param $ignoreOtherCond bool
+ */
+ function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
+ // check for user namespace
+ if ( is_object( $nt ) ) {
+ $ns = $nt->getNamespace();
+ if ( $ns == NS_USER || $ns == NS_USER_TALK )
+ return;
+ }
+
+ $oldlink = $link;
+ parent::findVariantLink( $link, $nt, $ignoreOtherCond );
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ $link = $oldlink;
+ }
+
+ /**
+ * We want our external link captions to be converted in variants,
+ * so we return the original text instead -{$text}-, except for URLs
+ *
+ * @param $text string
+ * @param $noParse bool
+ *
+ * @return string
+ */
+ function markNoConversion( $text, $noParse = false ) {
+ if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
+ return parent::markNoConversion( $text );
+ return $text;
+ }
+
+ /**
+ * An ugly function wrapper for parsing Image titles
+ * (to prevent image name conversion)
+ *
+ * @param $text string
+ * @param $toVariant bool
+ *
+ * @return string
+ */
+ function autoConvert( $text, $toVariant = false ) {
+ global $wgTitle;
+ if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+ $imagename = $wgTitle->getNsText();
+ if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+ }
+ return parent::autoConvert( $text, $toVariant );
+ }
+
+ /**
+ * It translates text into variant
+ *
+ * @param $text string
+ * @param $toVariant string
+ *
+ * @return string
+ */
+ function translate( $text, $toVariant ) {
+ // If $text is empty or only includes spaces, do nothing
+ // Otherwise translate it
+ if ( trim( $text ) ) {
+ $this->loadTables();
+ // To Tifinagh, first translate uppercase to lowercase Latin
+ if( $toVariant == 'shi-tfng' ) {
+ $text = $this->mTables['lowercase']->replace( $text );
+ }
+ $text = $this->mTables[$toVariant]->replace( $text );
+ }
+ return $text;
+ }
+}
+
+/**
+ * Tachelhit
+ *
+ * @ingroup Language
+ */
+class LanguageShi extends Language {
+ function __construct() {
+ global $wgHooks;
+
+ parent::__construct();
+
+ $variants = array( 'shi', 'shi-tfng', 'shi-latn' );
+ $variantfallbacks = array(
+ 'shi' => 'shi-tfng',
+ 'shi-tfng' => 'shi',
+ 'shi-latn' => 'shi',
+ );
+
+ $flags = array();
+ $this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
+ $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ }
+}
diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php
index b26a2543..2e1fb276 100644
--- a/languages/classes/LanguageSr.php
+++ b/languages/classes/LanguageSr.php
@@ -173,6 +173,32 @@ class SrConverter extends LanguageConverter {
return $ret;
}
+
+ /**
+ * Guess if a text is written in Cyrillic or Latin.
+ * Overrides LanguageConverter::guessVariant()
+ *
+ * @param string $text The text to be checked
+ * @param string $variant Language code of the variant to be checked for
+ * @return bool true if $text appears to be written in $variant
+ *
+ * @author Nikola Smolenski <smolensk@eunet.rs>
+ * @since 1.19
+ */
+ public function guessVariant( $text, $variant ) {
+ $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);
+ } else {
+ return false;
+ }
+
+ }
+
}
/**
@@ -212,7 +238,10 @@ class LanguageSr extends LanguageSr_ec {
return '';
}
- // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
+ // 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];
}
diff --git a/languages/classes/LanguageTr.php b/languages/classes/LanguageTr.php
index cbc1b7e4..b6acea4b 100644
--- a/languages/classes/LanguageTr.php
+++ b/languages/classes/LanguageTr.php
@@ -17,7 +17,7 @@ class LanguageTr extends Language {
* @return string
*/
function ucfirst ( $string ) {
- if ( !empty( $string ) && $string[0] == 'i' ) {
+ if ( strlen( $string ) && $string[0] == 'i' ) {
return 'Ä°' . substr( $string, 1 );
} else {
return parent::ucfirst( $string );
@@ -29,7 +29,7 @@ class LanguageTr extends Language {
* @return mixed|string
*/
function lcfirst ( $string ) {
- if ( !empty( $string ) && $string[0] == 'I' ) {
+ if ( strlen( $string ) && $string[0] == 'I' ) {
return 'ı' . substr( $string, 1 );
} else {
return parent::lcfirst( $string );
diff --git a/languages/classes/LanguageUk.php b/languages/classes/LanguageUk.php
index 206c5aa3..14e5d272 100644
--- a/languages/classes/LanguageUk.php
+++ b/languages/classes/LanguageUk.php
@@ -71,7 +71,10 @@ class LanguageUk extends Language {
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 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];
// @todo FIXME: CLDR defines 4 plural forms. Form for decimals is missing/
diff --git a/languages/messages/MessagesAb.php b/languages/messages/MessagesAb.php
index a5dd75b3..d177278b 100644
--- a/languages/messages/MessagesAb.php
+++ b/languages/messages/MessagesAb.php
@@ -56,6 +56,9 @@ $namespaceAliases = array(
'ОбÑуждение_категории' => NS_CATEGORY_TALK
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$specialPageAliases = array(
'Categories' => array( 'Ðкатегориақәа' ),
'Mycontributions' => array( 'Ðрхиарақәа' ),
@@ -71,9 +74,9 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'language' => array( '0', '#ÐБЫЗШӘÐ:', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'special' => array( '0', 'цаÑтәи', 'ÑлужебнаÑ', 'special' ),
- 'index' => array( '1', '__ÐИÐДЕКС__', '__ИÐДЕКС__', '__INDEX__' ),
+ 'language' => array( '0', '#ÐБЫЗШӘÐ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'цаÑтәи', 'ÑлужебнаÑ', 'special' ),
+ 'index' => array( '1', '__ÐИÐДЕКС__', '__ИÐДЕКС__', '__INDEX__' ),
);
$messages = array(
diff --git a/languages/messages/MessagesAce.php b/languages/messages/MessagesAce.php
index a3209216..f2fb1d5e 100644
--- a/languages/messages/MessagesAce.php
+++ b/languages/messages/MessagesAce.php
@@ -410,7 +410,6 @@ Meunyo kön nyoë sababjih, Droëneuh kadang ka neuteumèë saboh bug lam softwa
'badtitle' => 'Nan hana sah',
'badtitletext' => 'Nan ôn nyang neulakèë hana sah, soh, atawa nan antarabahsa atawa antarawiki nyang salah sambông.',
'viewsource' => 'Eu nè',
-'viewsourcefor' => 'keu $1',
'viewsourcetext' => 'Droëneuh jeuët neu’eu',
# Login and logout pages
@@ -763,8 +762,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
'linksearch-ok' => 'Mita',
# Special:Log/newusers
-'newuserlogpage' => 'ureuëng nguy barô',
-'newuserlog-create-entry' => 'dapeuta jeuët anggèëta',
+'newuserlogpage' => 'ureuëng nguy barô',
# Special:ListGroupRights
'listgrouprights-members' => '(dapeuta anggèëta)',
@@ -794,7 +792,6 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
'confirmdeletetext' => 'Droëneuh neuk neusampôh ôn atawa beureukah nyoë keu sabé. Meunan cit ban mandum riwayatjih nibak basis data. Neupeupaseuti meunyo Droëneuh cit keubiët meung neusampôh, neutupeuë ban mandum akébatjih, ngön peuë nyang neupeulaku nyoë nakeuh meunurôt [[{{MediaWiki:Policy-url}}|kebijakan{{SITENAME}}]].',
'actioncomplete' => 'Seuleusoë',
'deletedtext' => '"$1" ka geusampôh. Eu $2 keu log paléng barô bak ôn nyang ka geusampôh.',
-'deletedarticle' => 'sampôh "[[$1]]"',
'dellogpage' => 'Log seunampoh',
'deletecomment' => 'Choë:',
'deleteotherreason' => 'Nyang la’én/choë la’én:',
@@ -831,7 +828,6 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
# Undelete
'undeletebtn' => 'Peuriwang!',
'undeletelink' => 'eu/peuriwang',
-'undeletedarticle' => '"$1" ka geupeuriwang',
'undelete-search-submit' => 'Mita',
# Namespace form on various pages
@@ -909,8 +905,6 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabÃ
'talkexists' => 'Ôn nyan ka geupeupinah, tapi ôn peugah haba bak ôn nyan h‘an jeuët geupeupinah kareuna ka na ôn peugah haba bak nan barô. Neupeusapat mantöng ôn ôn peugah haba nyan keudroë.',
'movedto' => 'geupeupinah u',
'movetalk' => 'Peupinah ôn peugah haba nyang na hubôngan.',
-'1movedto2' => 'peupinah [[$1]] u [[$2]]',
-'1movedto2_redir' => 'pupinah [[$1]] u [[$2]] röt peuninah',
'movelogpage' => 'Log pinah',
'movereason' => 'Choë:',
'revertmove' => 'peuriwang',
@@ -991,7 +985,7 @@ Hubông teutap keu revisi ôn nyoë',
# Media information
'file-info-size' => '$1 × $2 piksel, rayek beureukah: $3, MIME jeunèh: $4',
-'file-nohires' => '<small>Hana resolusi nyang leubèh manyang.</small>',
+'file-nohires' => 'Hana resolusi nyang leubèh manyang.',
'svg-long-desc' => 'Beureukah SVG, nominal $1 x $2 piksel, rayek beureukah: $3',
'show-big-image' => 'Resolusi peunoh',
diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php
index 6d9e5ef8..d90e5a3e 100644
--- a/languages/messages/MessagesAf.php
+++ b/languages/messages/MessagesAf.php
@@ -20,6 +20,7 @@
* @author SPQRobin
* @author Spacebirdy
* @author Xethron
+ * @author පසිඳු කà·à·€à·’න්ද
*/
$namespaceNames = array(
@@ -47,65 +48,65 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#AANSTUUR', '#REDIRECT' ),
- 'notoc' => array( '0', '__GEENIO__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__GEENGALERY__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__DWINGIO__', '__FORCETOC__' ),
- 'toc' => array( '0', '__IO__', '__TOC__' ),
- 'noeditsection' => array( '0', '__GEENNUWEAFDELING__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__GEENOPSKRIF__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'HUIDIGEMAAND', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'HUIDIGEJAAR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HUIDIGETYD', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HUIDIGEUUR', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'AANTALBLADSYE', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'AANTALARTIKELS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'AANTALLêERS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'AANTALAKTIEWEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'AANTALWYSIGINGS', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'AANTALKEERGESIEN', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'BLADSYNAAM', 'PAGENAME' ),
- 'namespace' => array( '1', 'NAAMSPASIE', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'BESPREKINGSBLADSY', 'TALKSPACE' ),
- 'fullpagename' => array( '1', 'VOLBLADSYNAAM', 'FULLPAGENAME' ),
- 'img_thumbnail' => array( '1', 'duimnael', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'regs', 'right' ),
- 'img_left' => array( '1', 'links', 'left' ),
- 'img_none' => array( '1', 'geen', 'none' ),
- 'img_center' => array( '1', 'senter', 'center', 'centre' ),
- 'img_framed' => array( '1', 'omraam', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'raamloos', 'frameless' ),
- 'img_border' => array( '1', 'raam', 'border' ),
- 'img_top' => array( '1', 'bo', 'top' ),
- 'img_text_top' => array( '1', 'teks-bo', 'text-top' ),
- 'img_middle' => array( '1', 'middel', 'middle' ),
- 'img_bottom' => array( '1', 'onder', 'bottom' ),
- 'img_text_bottom' => array( '1', 'teks-onder', 'text-bottom' ),
- 'img_link' => array( '1', 'skakel=$1', 'link=$1' ),
- 'sitename' => array( '1', 'WERFNAAM', 'SITENAME' ),
- 'server' => array( '0', 'BEDIENER', 'SERVER' ),
- 'servername' => array( '0', 'BEDIENERNAAM', 'SERVERNAME' ),
- 'gender' => array( '0', 'GESLAG:', 'GENDER:' ),
- 'localweek' => array( '1', 'HUIDIGEWEEK', 'LOCALWEEK' ),
- 'plural' => array( '0', 'MEERVOUD', 'PLURAL:' ),
- 'fullurl' => array( '0', 'VOLURL', 'FULLURL:' ),
- 'displaytitle' => array( '1', 'VERTOONTITEL', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'HUIDIGEWEERGAWE', 'CURRENTVERSION' ),
- 'language' => array( '0', '#TAAL:', '#LANGUAGE:' ),
- 'special' => array( '0', 'spesiaal', 'special' ),
- 'filepath' => array( '0', 'LêERPAD:', 'FILEPATH:' ),
- 'tag' => array( '0', 'etiket', 'tag' ),
- 'pagesize' => array( '1', 'BLADSYGROOTTE', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEKS__', '__INDEX__' ),
- 'noindex' => array( '1', '__GEENINDEKS__', '__NOINDEX__' ),
- 'url_path' => array( '0', 'PAD', 'PATH' ),
+ 'redirect' => array( '0', '#AANSTUUR', '#REDIRECT' ),
+ 'notoc' => array( '0', '__GEENIO__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__GEENGALERY__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__DWINGIO__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__IO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__GEENNUWEAFDELING__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__GEENOPSKRIF__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'HUIDIGEMAAND', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'HUIDIGEJAAR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HUIDIGETYD', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HUIDIGEUUR', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'AANTALBLADSYE', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'AANTALARTIKELS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'AANTALLêERS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AANTALAKTIEWEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'AANTALWYSIGINGS', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'AANTALKEERGESIEN', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'BLADSYNAAM', 'PAGENAME' ),
+ 'namespace' => array( '1', 'NAAMSPASIE', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'BESPREKINGSBLADSY', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'VOLBLADSYNAAM', 'FULLPAGENAME' ),
+ 'img_thumbnail' => array( '1', 'duimnael', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'regs', 'right' ),
+ 'img_left' => array( '1', 'links', 'left' ),
+ 'img_none' => array( '1', 'geen', 'none' ),
+ 'img_center' => array( '1', 'senter', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'omraam', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'raamloos', 'frameless' ),
+ 'img_border' => array( '1', 'raam', 'border' ),
+ 'img_top' => array( '1', 'bo', 'top' ),
+ 'img_text_top' => array( '1', 'teks-bo', 'text-top' ),
+ 'img_middle' => array( '1', 'middel', 'middle' ),
+ 'img_bottom' => array( '1', 'onder', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'teks-onder', 'text-bottom' ),
+ 'img_link' => array( '1', 'skakel=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'WERFNAAM', 'SITENAME' ),
+ 'server' => array( '0', 'BEDIENER', 'SERVER' ),
+ 'servername' => array( '0', 'BEDIENERNAAM', 'SERVERNAME' ),
+ 'gender' => array( '0', 'GESLAG:', 'GENDER:' ),
+ 'localweek' => array( '1', 'HUIDIGEWEEK', 'LOCALWEEK' ),
+ 'plural' => array( '0', 'MEERVOUD', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'VOLURL', 'FULLURL:' ),
+ 'displaytitle' => array( '1', 'VERTOONTITEL', 'DISPLAYTITLE' ),
+ 'currentversion' => array( '1', 'HUIDIGEWEERGAWE', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#TAAL:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'spesiaal', 'special' ),
+ 'filepath' => array( '0', 'LêERPAD:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'etiket', 'tag' ),
+ 'pagesize' => array( '1', 'BLADSYGROOTTE', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKS__', '__INDEX__' ),
+ 'noindex' => array( '1', '__GEENINDEKS__', '__NOINDEX__' ),
+ 'url_path' => array( '0', 'PAD', 'PATH' ),
);
$specialPageAliases = array(
@@ -566,22 +567,24 @@ Indien dit nie die geval is nie, het u moontlik 'n fout in die sagteware ontdek.
'badarticleerror' => 'Die aksie kon nie op hierdie bladsy uitgevoer word nie.',
'cannotdelete' => 'Die bladsy of lêer "$1" kon nie skrap word nie.
Iemand anders het dit moontlik reeds geskrap.',
+'cannotdelete-title' => 'Bladsy "$1" kan nie verwyder word nie',
'badtitle' => 'Ongeldige titel',
'badtitletext' => "Die bladsytitel waarvoor gevra is, is ongeldig, leeg, of
'n verkeerd geskakelde tussen-taal of tussen-wiki titel.",
-'perfcached' => "Die volgende inligting is 'n gekaste kopie en mag dalk nie volledig op datum wees nie.",
-'perfcachedts' => 'Die volgende data is gekas. Laaste opdatering: $1',
+'perfcached' => "Die volgende inligting is gekas en mag dalk nie op datum wees nie. 'n Maksimum van {{PLURAL:$1|een resultaat|$1 resultate}} is in die kas beskikbaar.",
+'perfcachedts' => "Die volgende data is gekas en is laas op $1 bygewerk. 'n Maksimum van {{PLURAL:$4|een resultaat|$4 resultate}} is in die kas beskikbaar.",
'querypage-no-updates' => 'Opdatering van hierdie bladsy is huidiglik afgeskakel. Inligting hier sal nie tans verfris word nie.',
'wrong_wfQuery_params' => 'Foutiewe parameters na wfQuery()<br />
Funksie: $1<br />
Navraag: $2',
'viewsource' => 'Bekyk bronteks',
-'viewsourcefor' => 'vir $1',
+'viewsource-title' => 'Wys bron van $1',
'actionthrottled' => 'Outo-rem op aksie uitgevoer',
'actionthrottledtext' => "As 'n teen-strooi aksie, word u beperk om hierdie aksie te veel keer in 'n kort tyd uit te voer, en u het hierdie limiet oorskry.
Probeer asseblief weer oor 'n paar minute.",
'protectedpagetext' => 'Hierdie bladsy is beskerm om redigering te verhoed.',
'viewsourcetext' => 'U mag die bronteks van hierdie bladsy lees en kopieer:',
+'viewyourtext' => "U kan '''u wysigings''' aan die bronteks van hierdie bladsy bekyk en kopieer:",
'protectedinterface' => 'Hierdie bladsy verskaf teks vir die koppelvlak van die sagteware, en is beskerm om misbruik te voorkom.',
'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)',
@@ -679,6 +682,7 @@ Om misbruik te voorkom, word slegs een wagwoordwenk per {{PLURAL:$1|uur|$1 ure}}
'emailconfirmlink' => 'Bevestig u e-posadres',
'invalidemailaddress' => "Die e-posadres is nie aanvaar nie, aangesien dit 'n ongeldige formaat blyk te hê.
Voer asseblief 'n geldige e-posadres in, of laat die veld leeg.",
+'cannotchangeemail' => "Die e-posadres vir 'n gebruiker kan nie op hierdie wiki gewysig word nie.",
'accountcreated' => 'Rekening geskep',
'accountcreatedtext' => 'Die rekening vir gebruiker $1 is geskep.',
'createaccount-title' => 'Rekeningskepping vir {{SITENAME}}',
@@ -695,6 +699,7 @@ Wag asseblief alvorens u weer probeer.",
# E-mail sending
'php-mail-error-unknown' => 'Onbekende fout in PHP se mail()-funksie',
+'user-mail-no-addy' => "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
# Change password dialog
'resetpass' => 'Verander wagwoord',
@@ -716,32 +721,47 @@ U het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
'resetpass-temp-password' => 'Tydelike wagwoord:',
# Special:PasswordReset
-'passwordreset' => 'Wagwoord herstel',
-'passwordreset-text' => "Voltooi hierdie vorm om 'n e-pos herinnering van jou rekening besonderhede te ontvang.",
-'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-username' => 'Gebruiker:',
-'passwordreset-domain' => 'Domein:',
-'passwordreset-email' => 'E-posadres:',
-'passwordreset-emailtitle' => 'Gebruiker se details op {{site name}}',
-'passwordreset-emailtext-ip' => 'Iemand, waarskynlik u vanaf die IP-adres $1, het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.
+'passwordreset' => 'Wagwoord herstel',
+'passwordreset-text' => "Voltooi hierdie vorm om 'n e-pos herinnering van jou rekening besonderhede te ontvang.",
+'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-username' => 'Gebruiker:',
+'passwordreset-domain' => 'Domein:',
+'passwordreset-capture' => 'Wys resulterende e-pos?',
+'passwordreset-capture-help' => 'As u die boks merk, word die e-pos (met die tydelike wagwoord) aan u getoon en aan die gebruiker gestuur.',
+'passwordreset-email' => 'E-posadres:',
+'passwordreset-emailtitle' => 'Gebruiker se details op {{site name}}',
+'passwordreset-emailtext-ip' => 'Iemand, waarskynlik u vanaf die IP-adres $1, het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.
Die volgende {{PLURAL:$3|gebruiker is|gebruikers is}} aan die e-posadres gekoppel:
$2
{{PLURAL:$3|Die tydelike wagwoord verval|Hierdie tydelike wagwoorde verval}} oor {{PLURAL:$5|een dag|$5 dae}}.
Meld asseblief nou aan en wysig u wagwoord. As u dit nie versoek het nie, of as u die oorspronklike wagwoord nog ken en dit nie wil verander nie, ignoreer die berig en hou aan om u ou wagwoord te gebruik.',
-'passwordreset-emailtext-user' => 'Gebruiker $1 op die webtuiste {{SITENAME}} het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.
+'passwordreset-emailtext-user' => 'Gebruiker $1 op die webtuiste {{SITENAME}} het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.
Die volgende {{PLURAL:$3|gebruiker is|gebruikers is}} aan die e-posadres gekoppel:
$2
{{PLURAL:$3|Die tydelike wagwoord verval|Hierdie tydelike wagwoorde verval}} oor {{PLURAL:$5|een dag|$5 dae}}.
Meld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of as u die oorspronklike wagwoord nog ken en dit nie wil verander nie, ignoreer die berig en hou aan om u ou wagwoord te gebruik.',
-'passwordreset-emailelement' => 'Gebruikersnaam: $1
+'passwordreset-emailelement' => 'Gebruikersnaam: $1
Tydelike wagwoord: $2',
-'passwordreset-emailsent' => "'n E-pos ter herhindering is gestuur.",
+'passwordreset-emailsent' => "'n E-pos ter herhindering is gestuur.",
+'passwordreset-emailsent-capture' => "'n E-pos ter herinnering is gestuur en word hieronder vertoon.",
+'passwordreset-emailerror-capture' => "'n E-pos ter herinnering is geskep en word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Wysig E-posadres',
+'changeemail-header' => 'Wysig rekening se e-posadres',
+'changeemail-text' => 'Voltooi die vorm om u e-posadres te verander. U sal u wagwoord moet insleutel om die verandering te bevestig.',
+'changeemail-no-info' => 'U moet aangemeld wees om regstreeks toegang tot die bladsy te kry.',
+'changeemail-oldemail' => 'Huidige e-posadres:',
+'changeemail-newemail' => 'Nuwe e-posadres:',
+'changeemail-none' => '(geen)',
+'changeemail-submit' => 'Wysig E-posadres',
+'changeemail-cancel' => 'Kanselleer',
# Edit page toolbar
'bold_sample' => 'Vetgedrukte teks',
@@ -811,9 +831,6 @@ Neem kennis dat u slegs die 'e-pos die gebruiker' funksionaliteit kan gebruik as
U huidige IP-adres is $3 en die blokkadenommer is #$5.
Vermeld asseblief die bovermelde bloknommer as u die saak rapporteer,",
'blockednoreason' => 'geen rede verskaf nie',
-'blockedoriginalsource' => "Die bronteks van '''$1''' word onder gewys:",
-'blockededitsource' => "Die teks van '''u wysigings''' aan '''$1''' word hier onder vertoon:",
-'whitelistedittitle' => 'U moet aangeteken wees om te kan redigeer.',
'whitelistedittext' => 'U moet $1 om bladsye te wysig.',
'confirmedittext' => 'U moet u e-posadres bevestig voor u bladsye wysig. Verstel en bevestig asseblief u e-posadres by u [[Special:Preferences|voorkeure]].',
'nosuchsectiontitle' => 'Kan nie die afdeling vind nie',
@@ -896,8 +913,8 @@ Hierdeur beloof u ons dat u die byvoegings self geskryf het, of gekopieer het va
'copyrightwarning2' => "Enige bydraes op {{SITENAME}} mag genadeloos gewysig of selfs verwyder word; indien u dit nie met u bydrae wil toelaat nie, moenie dit hier bylas nie.<br />
Deur enigiets hier te plaas, beloof u dat u dit self geskryf het, of dat dit gekopieer is vanuit \"publieke domein\" of soortgelyke vrye bronne (sien \$1 vir details).
'''MOENIE WERK WAT DEUR KOPIEREG BESKERM WORD HIER PLAAS SONDER TOESTEMMING NIE!'''",
-'longpageerror' => "'''FOUT: die teks wat u bygevoeg het is $1 kilogrepe groot, wat groter is as die maximum van $2 kilogrepe.
-Die bladsy kan nie gestoor word nie.'''",
+'longpageerror' => "'''Fout: die teks wat u bygevoeg het is {{PLURAL:$1|een kilogreep|$1 kilogrepe}} groot, wat groter is as die maksimum van {{PLURAL:$2|een kilogreep|$2 kilogrepe}}.'''
+Die bladsy kan nie gestoor word nie.",
'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie. Dalk wil u die teks plak in 'n lêer en stoor vir later.'''
Een administrateur het die databasis geblokkeer vir hierdie rede: $1",
@@ -1065,8 +1082,6 @@ Ander administrateurs van {{SITENAME}} kan steeds die verborge inhoud sien en di
'revdelete-unsuppress' => 'Verwyder beperkinge op herstelde weergawes',
'revdelete-log' => 'Rede:',
'revdelete-submit' => 'Pas op gekose {{PLURAL:$1|weergawe|weergawes}} toe',
-'revdelete-logentry' => 'sigbaarheid van weergawe is gewysig vir [[$1]]',
-'logdelete-logentry' => 'verander sigbaarheid van gebeurtenis [[$1]]',
'revdelete-success' => "'''Die sigbaarheid van die wysiging is suksesvol opgedateer.'''",
'revdelete-failure' => "'''Die sigbaarheid van die wysiging kon nie opgedateer word nie:'''
$1",
@@ -1078,15 +1093,6 @@ $1",
'revdel-restore-visible' => 'sigbare wysigings',
'pagehist' => 'Bladsy geskiedenis',
'deletedhist' => 'Verwyderde geskiedenis',
-'revdelete-content' => 'inhoud',
-'revdelete-summary' => 'redigeringsopsomming',
-'revdelete-uname' => 'gebruikersnaam',
-'revdelete-restricted' => 'beperkings is aan administrateurs opgelê',
-'revdelete-unrestricted' => 'beperkings vir administrateurs is opgehef',
-'revdelete-hid' => '$1 verskuil',
-'revdelete-unhid' => '$1 onverskuil',
-'revdelete-log-message' => '$1 vir $2 {{PLURAL:$2|weergawe|weergawes}}',
-'logdelete-log-message' => '$1 vir $2 {{PLURAL:$2|gebeurtenis|gebeurtenisse}}',
'revdelete-hide-current' => 'Fout met die wegsteek van die item gedateer $2 om $1 uur: hierdie is die huidige weergawe. Dit kan nie versteek word nie.',
'revdelete-show-no-access' => 'Fout met die vertoon van die item gedateer $2 om $1 uur: hierdie item is as "beskermd" gemerk.
U het nie toegang tot die item nie.',
@@ -1243,12 +1249,14 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
'prefs-rc' => 'Onlangse wysigings',
'prefs-watchlist' => 'Dophoulys',
'prefs-watchlist-days' => 'Aantal dae om in dophoulys te wys:',
-'prefs-watchlist-days-max' => 'Maksimum 7 dae',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|dag|dae}}',
'prefs-watchlist-edits' => 'Aantal wysigings om in uitgebreide dophoulys te wys:',
'prefs-watchlist-edits-max' => 'Maksimum aantal: 1000',
'prefs-watchlist-token' => 'Dophoulys-sleutel:',
'prefs-misc' => 'Allerlei',
'prefs-resetpass' => 'Verander wagwoord',
+'prefs-changeemail' => 'Wysig E-posadres',
+'prefs-setemail' => "Stel 'n e-posadres",
'prefs-email' => 'E-posopsies',
'prefs-rendering' => 'Voorkoms',
'saveprefs' => 'Stoor voorkeure',
@@ -1308,6 +1316,7 @@ Die aksie kan nie ongedaan gemaak word nie.',
'yourrealname' => 'Regte naam:',
'yourlanguage' => 'Taal:',
'yourvariant' => 'Taalvariant vir inhoud:',
+'prefs-help-variant' => 'U voorkeursvariant of -spelling om die inhoudsbladsye van hierdie wiki in weer te gee.',
'yournick' => 'Bynaam (vir handtekening)',
'prefs-help-signature' => 'Kommentaar op besprekingsbladsye moet met "<nowiki>~~~~</nowiki>" onderteken word.
Die tildes word in u handtekening omgeskakel en die datum en tyd word insluit.',
@@ -1349,7 +1358,7 @@ Die inligting is vir ander gebruikers sigbaar.',
'userrights-lookup-user' => 'Beheer gebruikersgroepe',
'userrights-user-editname' => 'Voer gebruikersnaam in:',
'editusergroup' => 'Wysig gebruikersgroepe',
-'editinguser' => "Besig om gebruikersregte van gebruiker '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) te wysig",
+'editinguser' => "Besig om gebruikersregte van gebruiker '''[[User:$1|$1]]''' $2 te wysig",
'userrights-editusergroup' => 'Wysig gebruikersgroepe',
'saveusergroups' => 'Stoor gebruikersgroepe',
'userrights-groupsmember' => 'Lid van:',
@@ -1443,13 +1452,13 @@ Die inligting is vir ander gebruikers sigbaar.',
'right-autopatrol' => 'Laat eie wysigings outomaties as gekontroleerd merk',
'right-patrolmarks' => 'Wys kontroleermerke in onlangse wysigings',
'right-unwatchedpages' => 'Wys lys van bladsye wat nie dopgehou word nie',
-'right-trackback' => "Verskaf 'n terugverwysende bladsy",
'right-mergehistory' => 'Versmelt die geskiedenis van bladsye',
'right-userrights' => 'Wysig alle gebruiker regte',
'right-userrights-interwiki' => 'Wysig gebruikersregte van gebruikers op ander wikis',
'right-siteadmin' => 'Sluit en ontsluit die datbasis',
'right-override-export-depth' => "Eksporteer bladsye insluitend geskakelde bladsye tot 'n diepte van 5",
'right-sendemail' => 'Stuur e-pos aan ander gebruikers',
+'right-passwordreset' => 'Wys e-posse vir herstel van wagwoord',
# User rights log
'rightslog' => 'Gebruikersregtelogboek',
@@ -1483,16 +1492,17 @@ Die inligting is vir ander gebruikers sigbaar.',
'action-suppressionlog' => 'na die privaat logboek te kyk nie',
'action-block' => 'blokkeer die gebruiker om wysigings te maak',
'action-protect' => 'verander veiligheidsvlak van die bladsy',
+'action-rollback' => "rol die wysigings van die laatste gebruiker wat 'n bladsy gewysig het vinnig terug",
'action-import' => "hierdie bladsy van 'n ander wiki te importeer nie",
'action-importupload' => "die bladsy van 'n opgelaaide lêer te importeer nie",
'action-patrol' => 'wysigings van andere as gekontroleer te merk nie',
'action-autopatrol' => 'eie wysiging as gekontroleerd te laat merk',
'action-unwatchedpages' => 'wys die lys van blaaie wat deur niemand dopgehou word nie',
-'action-trackback' => "verskaf 'n terugverwysende bladsy",
'action-mergehistory' => 'versmelt die geskiedenis van die bladsy',
'action-userrights' => 'Wysig alle gebruikersregte',
'action-userrights-interwiki' => 'wysig gebruikersregte van gebruikers op ander wikis',
'action-siteadmin' => 'sluit of ontsluit die databasis',
+'action-sendemail' => 'stuur e-posse',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
@@ -1524,6 +1534,7 @@ Die inligting is vir ander gebruikers sigbaar.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|gebruiker|gebruikers}} hou die bladsy dop]',
'rc_categories' => 'Beperk tot kategorië (skei met "|")',
'rc_categories_any' => 'Enige',
+'rc-change-size-new' => '$1 {{PLURAL:$1|greep|grepe}} na die wysiging',
'newsectionsummary' => '/* $1 */ nuwe afdeling',
'rc-enhanced-expand' => 'Wys details (benodig JavaScript)',
'rc-enhanced-hide' => 'Steek details weg',
@@ -1585,6 +1596,7 @@ Om die lêer in 'n artikel te gebruik, plaas 'n skakel in een van die volgende f
'ignorewarnings' => 'Ignoreer enige waarskuwings',
'minlength1' => 'Prentname moet ten minste een letter lank wees.',
'illegalfilename' => 'Die lêernaam "$1" bevat karakters wat nie toegelaat word in bladsytitels nie. Verander asseblief die naam en probeer die lêer weer laai.',
+'filename-toolong' => 'Lêername mag nie langer as 240 grepe wees nie.',
'badfilename' => 'Prentnaam is verander na "$1".',
'filetype-mime-mismatch' => 'Lêer-uitbreiding ".$1" stem nie met die MIME-tipe van die lêer ($2) ooreen nie.',
'filetype-badmime' => 'Lêers met MIME-tipe "$1" word nie toegelaat nie.',
@@ -1687,6 +1699,23 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
'upload-unknown-size' => 'Onbekende grootte',
'upload-http-error' => "'n HTTP-fout het voorgekom: $1",
+# File backend
+'backend-fail-stream' => 'Kon nie die lêer $1 uitstroom nie.',
+'backend-fail-backup' => "Kon nie 'n rugsteunkopie van die lêer $1 maak nie.",
+'backend-fail-notexists' => 'Die lêer $1 bestaan nie.',
+'backend-fail-notsame' => "'n Nie-identiese lêer bestaan al reeds by $1.",
+'backend-fail-invalidpath' => "$1 is nie 'n geldige stoorplek nie.",
+'backend-fail-delete' => 'Die lêer $1 kon nie geskrap word nie.',
+'backend-fail-alreadyexists' => 'Die lêer $1 bestaan al reeds.',
+'backend-fail-store' => 'Kon nie lêer $1 in $2 stoor nie.',
+'backend-fail-copy' => 'Kon nie lêer $1 na $2 kopieer nie.',
+'backend-fail-move' => 'Kon nie lêer $1 na $2 skuif nie.',
+'backend-fail-opentemp' => 'Kon nie tydelike lêer oopmaak nie.',
+'backend-fail-writetemp' => 'Kon nie na tydelike lêer skryf nie.',
+'backend-fail-closetemp' => 'Kon nie tydelike lêer sluit nie.',
+'backend-fail-read' => 'Kon nie lêer $1 lees nie.',
+'backend-fail-create' => 'Kon nie lêer $1 skep nie.',
+
# ZipDirectoryReader
'zip-file-open-error' => "'n Fout het voorgekom met die opening van die lêer vir ZIP toetsing.",
'zip-wrong-format' => "Die gespesifiseerde lêer was nie 'n zip-lêer nie.",
@@ -1703,6 +1732,7 @@ Dit kan nie behoorlik vir sekuriteit nagegaan word nie.",
'uploadstash-badtoken' => 'Uitvoering van die aksie het misluk, moontlik omdat u "editing credentials" verstryk het. Probeer asseblief weer.',
'uploadstash-errclear' => 'Die skoonmaak van lêers het misluk.',
'uploadstash-refresh' => 'Verfris die lys van lêers',
+'invalid-chunk-offset' => 'Ongeldige "chunk offset"',
# img_auth script messages
'img-auth-accessdenied' => 'Toegang geweier',
@@ -1812,23 +1842,24 @@ Die beskrywing op die [$2 lêer se inligtingsblad] word hieronder weergegee.',
'filerevert-badversion' => 'Daar is geen vorige plaaslike weergawe van die lêer vir die gespesifiseerde tydstip nie.',
# File deletion
-'filedelete' => 'Skrap $1',
-'filedelete-legend' => 'Skrap lêer',
-'filedelete-intro' => "U is op die punt om die lêer '''[[Media:$1|$1]]''' te verwyder, inklusief alle ouer weergawes daarvan.",
-'filedelete-intro-old' => "U is besig om die weergawe van '''[[Media:$1|$1]]''' van [$4 $3, $2] te verwyder.",
-'filedelete-comment' => 'Rede:',
-'filedelete-submit' => 'Skrap',
-'filedelete-success' => "'''$1''' is geskrap.",
-'filedelete-success-old' => "Die weergawe van '''[[Media:$1|$1]]''' op $3, $2 is geskrap.",
-'filedelete-nofile' => "'''$1''' bestaan nie.",
-'filedelete-nofile-old' => "Daar is geen weergawe van '''$1''' in die argief met die aangegewe eienskappe nie.",
-'filedelete-otherreason' => 'Ander/ekstra rede:',
-'filedelete-reason-otherlist' => 'Andere rede',
-'filedelete-reason-dropdown' => '*Algemene skrappingsredes:
+'filedelete' => 'Skrap $1',
+'filedelete-legend' => 'Skrap lêer',
+'filedelete-intro' => "U is op die punt om die lêer '''[[Media:$1|$1]]''' te verwyder, inklusief alle ouer weergawes daarvan.",
+'filedelete-intro-old' => "U is besig om die weergawe van '''[[Media:$1|$1]]''' van [$4 $3, $2] te verwyder.",
+'filedelete-comment' => 'Rede:',
+'filedelete-submit' => 'Skrap',
+'filedelete-success' => "'''$1''' is geskrap.",
+'filedelete-success-old' => "Die weergawe van '''[[Media:$1|$1]]''' op $3, $2 is geskrap.",
+'filedelete-nofile' => "'''$1''' bestaan nie.",
+'filedelete-nofile-old' => "Daar is geen weergawe van '''$1''' in die argief met die aangegewe eienskappe nie.",
+'filedelete-otherreason' => 'Ander/ekstra rede:',
+'filedelete-reason-otherlist' => 'Andere rede',
+'filedelete-reason-dropdown' => '*Algemene skrappingsredes:
** Kopieregskending
** Duplikaatlêer',
-'filedelete-edit-reasonlist' => 'Wysig skrap redes',
-'filedelete-maintenance' => 'Die verwydering en terugplasing van lêers is tydelik opgeskort weens onderhoud.',
+'filedelete-edit-reasonlist' => 'Wysig skrap redes',
+'filedelete-maintenance' => 'Die verwydering en terugplasing van lêers is tydelik opgeskort weens onderhoud.',
+'filedelete-maintenance-title' => 'Kan nie die lêer skrap nie.',
# MIME search
'mimesearch' => 'MIME-soek',
@@ -1933,6 +1964,7 @@ Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reÃ
'mostimages' => 'Beelde met meeste skakels daarheen',
'mostrevisions' => 'Artikels met meeste wysigings',
'prefixindex' => 'Alle bladsye (voorvoegselindeks)',
+'prefixindex-namespace' => 'Alle bladsye met die voorvoegsel (naamruimte $1)',
'shortpages' => 'Kort bladsye',
'longpages' => 'Lang bladsye',
'deadendpages' => 'Doodloopbladsye',
@@ -2043,12 +2075,8 @@ Ondersteunde protokolle: <tt>$1</tt>',
'activeusers-noresult' => 'Geen gebruikers gevind nie.',
# Special:Log/newusers
-'newuserlogpage' => 'Logboek van nuwe gebruikers',
-'newuserlogpagetext' => "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
-'newuserlog-byemail' => 'wagwoord is per e-pos versend',
-'newuserlog-create-entry' => 'Nuwe gebruiker',
-'newuserlog-create2-entry' => 'het gebruiker $1 geskep',
-'newuserlog-autocreate-entry' => 'Gebruiker outomaties geskep',
+'newuserlogpage' => 'Logboek van nuwe gebruikers',
+'newuserlogpagetext' => "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
# Special:ListGroupRights
'listgrouprights' => 'Gebruikersgroepregte',
@@ -2076,7 +2104,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
'emailpage' => 'Stuur e-pos na gebruiker',
'emailpagetext' => 'As dié gebruiker \'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm \'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verkyn as die "Van"-adres van die pos. Dus sal die ontvanger kan terug antwoord.',
'usermailererror' => 'Fout met versending van e-pos:',
-'defemailsubject' => '{{SITENAME}}-epos',
+'defemailsubject' => 'E-pos van {{SITENAME}}-gebruiker "$1"',
'usermaildisabled' => 'E-pos deur gebruikers is gedeaktiveer.',
'usermaildisabledtext' => 'U kan nie e-pos aan ander gebruikers op hierdie wiki stuur nie',
'noemailtitle' => 'Geen e-posadres',
@@ -2132,7 +2160,7 @@ As u die bladsy later van u dophoulys wil verwyder, kliek \"verwyder van dophoul
'watchmethod-list' => 'kontroleer bladsye op dophoulys vir wysigings',
'watchlistcontains' => 'U dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
'iteminvalidname' => "Probleem met item '$1', ongeldige naam...",
-'wlnote' => "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}.",
+'wlnote' => "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
'wlshowlast' => 'Wys afgelope $1 ure, $2 dae of $3',
'watchlist-options' => 'Opsies vir dophoulys',
@@ -2197,8 +2225,6 @@ Bevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit d
'actionfailed' => 'Aksie het gefaal',
'deletedtext' => '"$1" is geskrap.
Kyk na $2 vir \'n rekord van onlangse skrappings.',
-'deletedarticle' => '"[[$1]]" geskrap',
-'suppressedarticle' => 'het "[[$1]]" verberg',
'dellogpage' => 'Skraplogboek',
'dellogpagetext' => "Hier onder is 'n lys van die mees onlangse skrappings. Alle tye is bedienertyd (UGT).",
'deletionlog' => 'skrappings-logboek',
@@ -2247,7 +2273,10 @@ Sien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye
'unprotectedarticle' => 'het beskerming van [[$1]] verwyder',
'movedarticleprotection' => 'het beskermings-instellings vanaf "[[$2]]" na "[[$1]]" geskuif',
'protect-title' => 'Beskerm "$1"',
+'protect-title-notallowed' => 'Wys berkermingsvlak vir "$1"',
'prot_1movedto2' => 'het [[$1]] geskuif na [[$2]]',
+'protect-badnamespace-title' => 'Nie-beskermde naamruimte',
+'protect-badnamespace-text' => 'Bladsye in hierdie naamruimte kan nie beskerm word nie.',
'protect-legend' => 'Bevestig beskerming',
'protectcomment' => 'Rede:',
'protectexpiry' => 'Verval:',
@@ -2268,6 +2297,7 @@ Hier is die huidige verstellings vir bladsy '''$1''':",
'protect-level-sysop' => 'Slegs administrateurs',
'protect-summary-cascade' => 'kaskade',
'protect-expiring' => 'verval op $2 om $3 (UTC)',
+'protect-expiring-local' => 'verval op $1',
'protect-expiry-indefinite' => 'verval nie',
'protect-cascade' => 'Beveilig bladsye insluitend die bladsy (kaskade effek)',
'protect-cantedit' => 'U kan nie die veiligheidsvlak van die blad verander nie, want u het nie regte om dit te wysig nie.',
@@ -2327,7 +2357,6 @@ U mag moontlik 'n foutiewe skakel hê, of die weergawe is reeds herstel of uit d
'undeletereset' => 'Herinstel',
'undeleteinvert' => 'Omgekeerde seleksie',
'undeletecomment' => 'Rede:',
-'undeletedarticle' => 'het "$1" herstel',
'undeletedrevisions' => '{{PLURAL:$1|1 weergawe|$1 weergawes}} herstel',
'undeletedrevisions-files' => '{{PLURAL:$1|1 weergawe|$1 weergawes}} en {{PLURAL:$2|1 lêer|$2 lêers}} herstel',
'undeletedfiles' => '{{PLURAL:$1|1 lêer|$1 lêers}} herstel',
@@ -2336,6 +2365,7 @@ U mag moontlik 'n foutiewe skakel hê, of die weergawe is reeds herstel of uit d
Konsulteer die [[Special:Log/delete|verwyderingslogboek]] vir 'n rekord van onlangse verwyderings en terugplasings.",
'undelete-header' => 'Sien die [[Special:Log/delete|skraplogboek]] vir onlangs verwyderde bladsye.',
+'undelete-search-title' => 'Soek verwyderde bladsye',
'undelete-search-box' => 'Soek verwyderde bladsye',
'undelete-search-prefix' => 'Wys bladsye wat begin met:',
'undelete-search-submit' => 'Soek',
@@ -2345,6 +2375,7 @@ Konsulteer die [[Special:Log/delete|verwyderingslogboek]] vir 'n rekord van onla
'undelete-cleanup-error' => 'Fout met die herstel van die ongebruikte argieflêer "$1".',
'undelete-missing-filearchive' => 'Nie in staat om ID $1 terug te plaas nie omdat dit nie in die databasis is nie.
Miskien is dit reeds teruggeplaas.',
+'undelete-error' => "'n Fout het voorgekom met die verwydering van die bladsy",
'undelete-error-short' => 'Fout met herstel van lêer: $1',
'undelete-error-long' => 'Foute het voorgekom tydens die herstel van die lêer:
@@ -2465,6 +2496,7 @@ Sien die [[Special:BlockList|IP-bloklys]] vir 'n oorsig van blokkerings.",
'blocklist-userblocks' => 'Versteek geblokkeerde gebruikers',
'blocklist-tempblocks' => 'Versteek tydelike blokkades',
'blocklist-addressblocks' => 'Versteek blokkades met een IP-adres',
+'blocklist-rangeblocks' => 'Versteek blokke IP-adresse',
'blocklist-timestamp' => 'Tydstip',
'blocklist-target' => 'Doel',
'blocklist-expiry' => 'Verval',
@@ -2487,6 +2519,7 @@ Sien die [[Special:BlockList|IP-bloklys]] vir 'n oorsig van blokkerings.",
'unblocklink' => 'maak oop',
'change-blocklink' => 'versperring wysig',
'contribslink' => 'bydraes',
+'emaillink' => 'Stuur E-pos',
'autoblocker' => "Outomaties geblokkeer omdat u IP-adres ooreenkom met die van [[User:\$1|\$1]], wat om die volgende rede geblokkeer is: \"'''\$2'''\"",
'blocklogpage' => 'Blokkeer-logboek',
'blocklog-showlog' => 'Hierdie gebruiker is al vantevore geblokkeer.
@@ -2613,9 +2646,6 @@ Kies asseblief 'n ander naam.",
'movepage-page-moved' => 'Die bladsy $1 was na $2 geskuif.',
'movepage-page-unmoved' => 'Die bladsy $1 kon nie na $2 geskuif word nie.',
'movepage-max-pages' => 'Die maksimum van $1 {{PLURAL:$1|bladsy|bladsye}} is geskuif. Die oorblywende bladsye na nie outomaties geskuif word nie.',
-'1movedto2' => 'het [[$1]] geskuif na [[$2]]',
-'1movedto2_redir' => 'het [[$1]] geskuif na [[$2]] oor bestaande aanstuur',
-'move-redirect-suppressed' => 'aanstuur is onderdruk',
'movelogpage' => 'Skuiflogboek',
'movelogpagetext' => "Hier onder is 'n lys van geskuifde bladsye.",
'movesubpage' => '{{PLURAL:$1|Subbladsy|Subbladsye}}',
@@ -2628,7 +2658,7 @@ Kies asseblief 'n ander naam.",
Die teikenartikel "[[:$1]]" bestaan reeds. Wil u dit skrap om plek te maak vir die skuif?',
'delete_and_move_confirm' => 'Ja, skrap die bladsy',
-'delete_and_move_reason' => 'Geskrap om plek te maak vir skuif',
+'delete_and_move_reason' => 'Geskrap om plek te maak vir skuif vanaf "[[$1]]"',
'selfmove' => 'Bron- en teikentitels is dieselfde; kan nie bladsy oor homself skuif nie.',
'immobile-source-namespace' => 'Bladsye in naamruimte "$1" kan nie geskuif word nie',
'immobile-target-namespace' => 'Bladsye kan nie na naamruimte "$1" geskuif word nie',
@@ -2657,9 +2687,11 @@ Die eksportlêer kan daarna geïmporteer word na enige ander MediaWiki webwerf v
Verskaf die name van die bladsye wat geëksporteer moet word in die onderstaande veld, een bladsy per lyn, en kies of u alle weergawes (met geskiedenis) of slegs die nuutste weergawe soek.
In die laatste geval kan u ook \'n verwysing gebruik, byvoorbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] vir die bladsy "{{MediaWiki:Mainpage}}".',
+'exportall' => 'Eksporteer alle bladsye',
'exportcuronly' => 'Slegs die nuutste weergawes, sonder volledige geskiedenis',
'exportnohistory' => "----
'''Let op:''' as gevolg van werkverrigting is die uitvoer volledige geskiedenis gedeaktiveer.",
+'exportlistauthors' => "Sluit 'n volledige lys van outeurs op elke bladsy in",
'export-submit' => 'Eksporteer',
'export-addcattext' => 'Voeg bladsye by van kategorie:',
'export-addcat' => 'Voeg by',
@@ -2692,6 +2724,8 @@ Gaan na [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [//tran
'thumbnail_error' => 'Fout met die skep van duimnaelsketse: $1',
'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.",
+'thumbnail-dest-create' => 'Kon nie die duimnael na die pad stoor nie.',
'thumbnail_invalid_params' => 'Ongeldige parameters vir duimnaelskets',
'thumbnail_dest_directory' => 'Nie in staat om die gids te skep nie',
'thumbnail_image-type' => 'Die lêertipe word nie ondersteun nie',
@@ -2739,6 +2773,8 @@ Die lêer is slegs gedeeltelik opgelaai.',
'import-upload' => 'Laai XML-data op',
'import-token-mismatch' => 'Sessiegegewens is verloor. Probeer asseblief weer.',
'import-invalid-interwiki' => 'Kan nie vanaf die gespesifiseerde importeer nie.',
+'import-error-edit' => 'Die bladsy "$1" is nie geïmporteer nie omdat u nie die regte het om dit te wysig nie.',
+'import-error-create' => 'Die bladsy "$1" is nie geïmporteer nie omdat u nie die regte het om dit te skep nie.',
# Import log
'importlogpage' => 'Invoer logboek',
@@ -2748,73 +2784,80 @@ Die lêer is slegs gedeeltelik opgelaai.',
'import-logentry-interwiki' => 'importeer $1 via transwiki',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|weergawe|weergawes}} vanaf $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript toetsing',
+'javascripttest-disabled' => 'Die funksie is gedeaktiveer.',
+'javascripttest-title' => 'Voer toetse uit vir $1',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'U gebruikerbladsy',
-'tooltip-pt-anonuserpage' => 'Die gebruikerbladsy vir die IP-adres waaronder u redigeer',
-'tooltip-pt-mytalk' => 'U besprekingsbladsy',
-'tooltip-pt-anontalk' => 'Bespreking oor bydraes van hierdie IP-adres',
-'tooltip-pt-preferences' => 'My voorkeure',
-'tooltip-pt-watchlist' => 'Die lys bladsye wat u vir veranderinge dophou',
-'tooltip-pt-mycontris' => 'Lys van u bydraes',
-'tooltip-pt-login' => 'U word aangemoedig om in te teken; dit is egter nie verpligtend nie.',
-'tooltip-pt-anonlogin' => 'U word aangemoedig om in te teken; dit is egter nie verpligtend nie.',
-'tooltip-pt-logout' => 'Teken uit',
-'tooltip-ca-talk' => 'Bespreking oor die inhoudsbladsy',
-'tooltip-ca-edit' => 'U kan hierdie bladsy redigeer. Gebruik asseblief die voorskouknop vóór u dit stoor.',
-'tooltip-ca-addsection' => 'Nuwe afdeling',
-'tooltip-ca-viewsource' => 'Hierdie bladsy is beskerm. U kan die bronteks besigtig.',
-'tooltip-ca-history' => 'Ouer weergawes van hierdie bladsy.',
-'tooltip-ca-protect' => 'Beskerm hierdie bladsy',
-'tooltip-ca-unprotect' => 'Wysig beskerming van die bladsy',
-'tooltip-ca-delete' => 'Skrap hierdie bladsy',
-'tooltip-ca-undelete' => 'Herstel die bydraes aan hierdie bladsy voordat dit geskrap is',
-'tooltip-ca-move' => 'Skuif hierdie bladsy',
-'tooltip-ca-watch' => 'Voeg hierdie bladsy by u dophoulys',
-'tooltip-ca-unwatch' => 'Verwyder hierdie bladsy van u dophoulys',
-'tooltip-search' => 'Deursoek {{SITENAME}}',
-'tooltip-search-go' => "Gaan na 'n bladsy met hierdie naam indien dit bestaan",
-'tooltip-search-fulltext' => 'Deursoek bladsye vir hierdie teks',
-'tooltip-p-logo' => 'Besoek die tuisblad',
-'tooltip-n-mainpage' => 'Besoek die Tuisblad',
-'tooltip-n-mainpage-description' => 'Gaan na die tuisblad',
-'tooltip-n-portal' => 'Meer oor die projek, wat u kan doen, nuttige skakels',
-'tooltip-n-currentevents' => "'n Plek waar almal gesellig kan verkeer",
-'tooltip-n-recentchanges' => "'n Lys van onlangse wysigings",
-'tooltip-n-randompage' => "Laai 'n lukrake bladsye",
-'tooltip-n-help' => 'Vind meer uit oor iets',
-'tooltip-t-whatlinkshere' => "'n Lys bladsye wat hierheen skakel",
-'tooltip-t-recentchangeslinked' => 'Onlangse wysigings aan bladsye wat vanaf hierdie bladsy geskakel is',
-'tooltip-feed-rss' => 'RSS-voed vir hierdie bladsy',
-'tooltip-feed-atom' => 'Atom-voed vir hierdie bladsy',
-'tooltip-t-contributions' => "Bekyk 'n lys van bydraes deur hierdie gebruiker",
-'tooltip-t-emailuser' => "Stuur 'n e-pos aan hierdie gebruiker",
-'tooltip-t-upload' => 'Laai lêers op',
-'tooltip-t-specialpages' => "'n Lys van al die spesiale bladsye",
-'tooltip-t-print' => 'Drukbare weergawe van hierdie bladsy',
-'tooltip-t-permalink' => "'n Permanente skakel na hierdie weergawe van die bladsy",
-'tooltip-ca-nstab-main' => 'Bekyk die inhoudbladsy',
-'tooltip-ca-nstab-user' => 'Bekyk die gebruikerbladsy',
-'tooltip-ca-nstab-media' => 'Bekyk die mediabladsy',
-'tooltip-ca-nstab-special' => "Hierdie is 'n spesiale bladsy; u kan dit nie wysig nie",
-'tooltip-ca-nstab-project' => 'Bekyk die projekbladsy',
-'tooltip-ca-nstab-image' => 'Bekyk die leêrbladsy',
-'tooltip-ca-nstab-mediawiki' => 'Bekyk die stelselboodskap',
-'tooltip-ca-nstab-template' => 'Bekyk die sjabloon',
-'tooltip-ca-nstab-help' => 'Bekyk die hulpbladsy',
-'tooltip-ca-nstab-category' => 'Bekyk die kategoriebladsy',
-'tooltip-minoredit' => "Dui aan hierdie is 'n klein wysiging",
-'tooltip-save' => 'Stoor u wysigings',
-'tooltip-preview' => "Sien 'n voorskou van u wysigings, gebruik dit voor u die blad stoor!",
-'tooltip-diff' => 'Wys watter veranderinge u aan die teks gemaak het.',
-'tooltip-compareselectedversions' => 'Vergelyk die twee gekose weergawes van hierdie blad.',
-'tooltip-watch' => 'Voeg hierdie blad by u dophoulys',
-'tooltip-recreate' => 'Herskep hierdie bladsy al is dit voorheen geskrap',
-'tooltip-upload' => 'Begin oplaai',
-'tooltip-rollback' => '"Terugrol" rol met een kliek wysiging(s) terug wat die laaste gebruiker aan hierdie bladsy aangebring het.',
-'tooltip-undo' => 'Met "ongedaan maak" maak u hierdie wysiging ongedaan en land u in die wysigingsvenster.
+'tooltip-pt-userpage' => 'U gebruikerbladsy',
+'tooltip-pt-anonuserpage' => 'Die gebruikerbladsy vir die IP-adres waaronder u redigeer',
+'tooltip-pt-mytalk' => 'U besprekingsbladsy',
+'tooltip-pt-anontalk' => 'Bespreking oor bydraes van hierdie IP-adres',
+'tooltip-pt-preferences' => 'My voorkeure',
+'tooltip-pt-watchlist' => 'Die lys bladsye wat u vir veranderinge dophou',
+'tooltip-pt-mycontris' => 'Lys van u bydraes',
+'tooltip-pt-login' => 'U word aangemoedig om in te teken; dit is egter nie verpligtend nie.',
+'tooltip-pt-anonlogin' => 'U word aangemoedig om in te teken; dit is egter nie verpligtend nie.',
+'tooltip-pt-logout' => 'Teken uit',
+'tooltip-ca-talk' => 'Bespreking oor die inhoudsbladsy',
+'tooltip-ca-edit' => 'U kan hierdie bladsy redigeer. Gebruik asseblief die voorskouknop vóór u dit stoor.',
+'tooltip-ca-addsection' => 'Nuwe afdeling',
+'tooltip-ca-viewsource' => 'Hierdie bladsy is beskerm. U kan die bronteks besigtig.',
+'tooltip-ca-history' => 'Ouer weergawes van hierdie bladsy.',
+'tooltip-ca-protect' => 'Beskerm hierdie bladsy',
+'tooltip-ca-unprotect' => 'Wysig beskerming van die bladsy',
+'tooltip-ca-delete' => 'Skrap hierdie bladsy',
+'tooltip-ca-undelete' => 'Herstel die bydraes aan hierdie bladsy voordat dit geskrap is',
+'tooltip-ca-move' => 'Skuif hierdie bladsy',
+'tooltip-ca-watch' => 'Voeg hierdie bladsy by u dophoulys',
+'tooltip-ca-unwatch' => 'Verwyder hierdie bladsy van u dophoulys',
+'tooltip-search' => 'Deursoek {{SITENAME}}',
+'tooltip-search-go' => "Gaan na 'n bladsy met hierdie naam indien dit bestaan",
+'tooltip-search-fulltext' => 'Deursoek bladsye vir hierdie teks',
+'tooltip-p-logo' => 'Besoek die tuisblad',
+'tooltip-n-mainpage' => 'Besoek die Tuisblad',
+'tooltip-n-mainpage-description' => 'Gaan na die tuisblad',
+'tooltip-n-portal' => 'Meer oor die projek, wat u kan doen, nuttige skakels',
+'tooltip-n-currentevents' => "'n Plek waar almal gesellig kan verkeer",
+'tooltip-n-recentchanges' => "'n Lys van onlangse wysigings",
+'tooltip-n-randompage' => "Laai 'n lukrake bladsye",
+'tooltip-n-help' => 'Vind meer uit oor iets',
+'tooltip-t-whatlinkshere' => "'n Lys bladsye wat hierheen skakel",
+'tooltip-t-recentchangeslinked' => 'Onlangse wysigings aan bladsye wat vanaf hierdie bladsy geskakel is',
+'tooltip-feed-rss' => 'RSS-voed vir hierdie bladsy',
+'tooltip-feed-atom' => 'Atom-voed vir hierdie bladsy',
+'tooltip-t-contributions' => "Bekyk 'n lys van bydraes deur hierdie gebruiker",
+'tooltip-t-emailuser' => "Stuur 'n e-pos aan hierdie gebruiker",
+'tooltip-t-upload' => 'Laai lêers op',
+'tooltip-t-specialpages' => "'n Lys van al die spesiale bladsye",
+'tooltip-t-print' => 'Drukbare weergawe van hierdie bladsy',
+'tooltip-t-permalink' => "'n Permanente skakel na hierdie weergawe van die bladsy",
+'tooltip-ca-nstab-main' => 'Bekyk die inhoudbladsy',
+'tooltip-ca-nstab-user' => 'Bekyk die gebruikerbladsy',
+'tooltip-ca-nstab-media' => 'Bekyk die mediabladsy',
+'tooltip-ca-nstab-special' => "Hierdie is 'n spesiale bladsy; u kan dit nie wysig nie",
+'tooltip-ca-nstab-project' => 'Bekyk die projekbladsy',
+'tooltip-ca-nstab-image' => 'Bekyk die leêrbladsy',
+'tooltip-ca-nstab-mediawiki' => 'Bekyk die stelselboodskap',
+'tooltip-ca-nstab-template' => 'Bekyk die sjabloon',
+'tooltip-ca-nstab-help' => 'Bekyk die hulpbladsy',
+'tooltip-ca-nstab-category' => 'Bekyk die kategoriebladsy',
+'tooltip-minoredit' => "Dui aan hierdie is 'n klein wysiging",
+'tooltip-save' => 'Stoor u wysigings',
+'tooltip-preview' => "Sien 'n voorskou van u wysigings, gebruik dit voor u die blad stoor!",
+'tooltip-diff' => 'Wys watter veranderinge u aan die teks gemaak het.',
+'tooltip-compareselectedversions' => 'Vergelyk die twee gekose weergawes van hierdie blad.',
+'tooltip-watch' => 'Voeg hierdie blad by u dophoulys',
+'tooltip-watchlistedit-normal-submit' => 'Verwyder bladsye',
+'tooltip-watchlistedit-raw-submit' => 'Opdateer dophoulys',
+'tooltip-recreate' => 'Herskep hierdie bladsy al is dit voorheen geskrap',
+'tooltip-upload' => 'Begin oplaai',
+'tooltip-rollback' => '"Terugrol" rol met een kliek wysiging(s) terug wat die laaste gebruiker aan hierdie bladsy aangebring het.',
+'tooltip-undo' => 'Met "ongedaan maak" maak u hierdie wysiging ongedaan en land u in die wysigingsvenster.
U kan daar \'n wysigingsopsomming byvoeg.',
-'tooltip-preferences-save' => 'Stoor voorkeure',
-'tooltip-summary' => "Verskaf 'n kort opsomming",
+'tooltip-preferences-save' => 'Stoor voorkeure',
+'tooltip-summary' => "Verskaf 'n kort opsomming",
# Stylesheets
'common.css' => '/** Gemeenskaplike CSS vir alle omslae */',
@@ -2875,9 +2918,6 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
# Patrol log
'patrol-log-page' => 'Kontroleringslogboek',
'patrol-log-header' => 'Die logboek wys weergawes wat as gekontroleer gemerk is.',
-'patrol-log-line' => 'merk $1 van $2 as gekontroleer $3',
-'patrol-log-auto' => '(outomaties)',
-'patrol-log-diff' => 'weergawe $1',
'log-show-hide-patrol' => 'Nasienlogboek $1',
# Image deletion
@@ -2903,11 +2943,11 @@ $1',
'file-info' => 'lêergrootte: $1, MIME-tipe: $2',
'file-info-size' => '$1 × $2 pixels, lêergrootte: $3, MIME type: $4',
'file-info-size-pages' => '$1 × $2 pikels, lêergrootte: $3, MIME-tipe: $4, $5 {{PLURAL:$5|bladsy|bladsye}}',
-'file-nohires' => '<small>Geen hoër resolusie is beskikbaar nie.</small>',
+'file-nohires' => 'Geen hoër resolusie is beskikbaar nie.',
'svg-long-desc' => 'SVG-lêer, nominaal $1 × $2 pixels, lêergrootte: $3',
'show-big-image' => 'Volle resolusie',
-'show-big-image-preview' => '<small>Grootte van hierdie voorskou: $1.</small>',
-'show-big-image-other' => '<small>Ander resolusies: $1.</small>',
+'show-big-image-preview' => 'Grootte van hierdie voorskou: $1.',
+'show-big-image-other' => 'Ander {{PLURAL:$2|resolusie|resolusies}}: $1.',
'show-big-image-size' => '$1 × $2 piksels',
'file-info-gif-looped' => 'herhalend',
'file-info-gif-frames' => '$1 {{PLURAL:$1|raam|rame}}',
@@ -2927,6 +2967,13 @@ $1',
'bydate' => 'volgens datum',
'sp-newimages-showfrom' => 'Wys nuwe lêers vanaf $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekonde|$1 sekondes}}',
+'minutes' => '{{PLURAL:$1|$1 minuut|$1 minute}}',
+'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
+'ago' => '$1 gelede',
+
# Bad image list
'bad_image_list' => "Die formaat is as volg:
@@ -3419,13 +3466,6 @@ Die bevestigingskode sal om $4 verval.',
'scarytranscludefailed' => '[Sjabloon $1 kon nie gelaai word nie]',
'scarytranscludetoolong' => '[Die URL is te lank]',
-# Trackbacks
-'trackbackbox' => 'Terugverwysende bladsye vir die blad:<br />
-$1',
-'trackbackremove' => '([$1 Skrap])',
-'trackbacklink' => 'Verwysende bladsy',
-'trackbackdeleteok' => 'Die verwysende bladsy is suksesvol verwyder.',
-
# Delete conflict
'deletedwhileediting' => "'''Let op''': die bladsy is verwyder terwyl u besig was om dit te wysig!",
'confirmrecreate' => "Gebruiker [[User:$1|$1]] ([[User talk:$1|bespreek]]) het hierdie blad uitgevee ná u begin redigeer het met rede: : ''$2''
@@ -3514,6 +3554,9 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
'watchlisttools-edit' => 'Bekyk en wysig dophoulys',
'watchlisttools-raw' => 'Wysig bronkode',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bespreek]])',
+
# Core parser functions
'unknown_extension_tag' => 'Onbekende etiket "$1"',
'duplicate-defaultsort' => 'Waarskuwing: Die standaardsortering "$2" kry voorrang voor die sortering "$1".',
@@ -3612,13 +3655,16 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'tags-hitcount' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
# Special:ComparePages
-'comparepages' => 'Vergelyk bladsye',
-'compare-selector' => 'Vergelyk bladsyweergawes',
-'compare-page1' => 'Bladsy 1',
-'compare-page2' => 'Bladsy 2',
-'compare-rev1' => 'Weergawe 1',
-'compare-rev2' => 'Weergawe 2',
-'compare-submit' => 'Vergelyk',
+'comparepages' => 'Vergelyk bladsye',
+'compare-selector' => 'Vergelyk bladsyweergawes',
+'compare-page1' => 'Bladsy 1',
+'compare-page2' => 'Bladsy 2',
+'compare-rev1' => 'Weergawe 1',
+'compare-rev2' => 'Weergawe 2',
+'compare-submit' => 'Vergelyk',
+'compare-invalid-title' => 'Die titel wat u verskaf het is ongeldig.',
+'compare-title-not-exists' => 'Die titel wat u verskaf het bestaan ​​nie.',
+'compare-revision-not-exists' => 'Die hersiening wat u verskaf het bestaan ​​nie.',
# Database error messages
'dberr-header' => "Die wiki het 'n probleem",
@@ -3645,4 +3691,80 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'sqlite-has-fts' => 'Weergawe $1 met ondersteuning vir vol-teks soektogte ("full-text search")',
'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
+# New logging system
+'logentry-delete-delete' => '$1 het die bladsy $3 verwyder',
+'logentry-delete-restore' => '$1 het die bladsy $3 teruggeplaas',
+'logentry-delete-event' => "$1 het die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-delete-revision' => "$1 het die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
+'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-delete-revision-legacy' => '$1 het die sigbaarheid van weergawes van die bladsy $3 gewysig.',
+'logentry-suppress-delete' => '$1 het die bladsy $3 onderdruk',
+'logentry-suppress-revision' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
+'logentry-suppress-event-legacy' => '$1 het in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-suppress-revision-legacy' => '$1 het in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
+'revdelete-content-hid' => 'inhoud versteek',
+'revdelete-summary-hid' => 'wysigingsopsomming versteek',
+'revdelete-uname-hid' => 'gebruikersnaam versteek',
+'revdelete-content-unhid' => 'inhoud sigbaar gemaak',
+'revdelete-summary-unhid' => 'wysigingsopsomming sigbaar gemaak',
+'revdelete-uname-unhid' => 'gebruikersnaam sigbaar gemaak',
+'revdelete-restricted' => 'beperkings is aan administrateurs opgelê',
+'revdelete-unrestricted' => 'beperkings vir administrateurs is opgehef',
+'logentry-move-move' => '$1 het bladsy $3 na $4 geskuif',
+'logentry-move-move-noredirect' => "$1 het bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
+'logentry-move-move_redir' => "$1 het bladsy $3 na $4 oor 'n aanstuur geskuif",
+'logentry-move-move_redir-noredirect' => "$1 het bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
+'logentry-patrol-patrol' => '$1 het weergawe $4 van bladsy $3 as gekontroleerd gemerk',
+'logentry-patrol-patrol-auto' => '$1 het weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
+'logentry-newusers-newusers' => "$1 het 'n gebruiker geskep",
+'logentry-newusers-create' => "$1 het 'n gebruiker geskep",
+'logentry-newusers-create2' => "$1 het 'n gebruiker $3 geskep",
+'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
+'newuserlog-byemail' => 'wagwoord is per e-pos versend',
+
+# Feedback
+'feedback-subject' => 'Onderwerp:',
+'feedback-message' => 'Boodskap:',
+'feedback-cancel' => 'Kanselleer',
+'feedback-submit' => 'Stuur terugvoer',
+'feedback-adding' => 'U terugvoer word op die bladsy geplaas...',
+'feedback-error1' => 'Fout: onbekende resultaat van die API',
+'feedback-error2' => 'Fout: Wysiging het gefaal',
+'feedback-error3' => 'Fout: Geen reaksie van API',
+'feedback-thanks' => 'Dankie! U terugvoer is op die bladsy "[$2 $1]" geplaas.',
+'feedback-close' => 'Gedoen',
+'feedback-bugcheck' => 'Gaaf! Kontroleer of dit nie dalk een van die [$1 bekende foute] is nie.',
+'feedback-bugnew' => "Ek het gekontroleer. Rapporteer 'n nuwe fout.",
+
+# API errors
+'api-error-badaccess-groups' => 'U word nie toegelaat om lêers te laai op hierdie wiki.',
+'api-error-badtoken' => 'Interne fout: slegte teken.',
+'api-error-duplicate-archive-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}} wat al verwyder is.',
+'api-error-duplicate-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}}',
+'api-error-empty-file' => 'Die lêer wat u probeer oplaai is leeg.',
+'api-error-emptypage' => 'Die skep van leë nuwe bladsye word nie toegelaat nie.',
+'api-error-file-too-large' => 'Die lêer wat u probeer oplaai is te groot.',
+'api-error-filename-tooshort' => 'Die lêernaam is te kort.',
+'api-error-filetype-banned' => 'Hierdie tipe lêer is verban en word nie toegelaat nie.',
+'api-error-filetype-missing' => "Die lêer het nie 'n uitbreiding nie.",
+'api-error-hookaborted' => "Die wysiging wat jy probeer maak, is deur 'n uitbreiding haak geaborteer.",
+'api-error-http' => "Interne fout: Kan nie 'n verbinding met die bediener maak nie.",
+'api-error-illegal-filename' => 'Die lêernaam word nie toegelaat nie.',
+'api-error-internal-error' => 'Interne fout: daar is iets verkeerd gegaan het met die verwerking van die oplaai van die lêer op die wiki.',
+'api-error-missingparam' => 'Interne fout: ontbrekende parameters op aanvraag.',
+'api-error-missingresult' => 'Interne fout: Kon nie bepaal of die kopie daarin geslaag.',
+'api-error-mustbeloggedin' => 'U moet ingeteken wees om lêers te kan laai.',
+'api-error-noimageinfo' => 'Die oplaai daarin geslaag, maar die bediener het ons nie enige inligting oor die lêer.',
+'api-error-ok-but-empty' => 'Interne fout: geen reaksie van die bediener.',
+'api-error-overwrite' => "'N bestaande lêer vervang word nie toegelaat nie.",
+'api-error-stashfailed' => 'Interne fout: Server nie tydelike lêer te stoor.',
+'api-error-timeout' => 'Die bediener het nie reageer binne die verwagte tyd.',
+'api-error-unclassified' => "'n Onbekende fout het voorgekom.",
+'api-error-unknown-code' => 'Onbekende fout: "$1"',
+'api-error-unknown-error' => 'Interne fout: daar is iets verkeerd geloop het toe probeer om jou lêer te laai.',
+'api-error-unknown-warning' => 'Onbekende waarskuwing: $1',
+'api-error-unknownerror' => 'Onbekende fout: "$1"',
+'api-error-uploaddisabled' => 'Oplaai is afgeskakel op hierdie wiki.',
+'api-error-verification-error' => 'Hierdie lêer kan beskadig of het die verkeerde uitbreiding.',
+
);
diff --git a/languages/messages/MessagesAln.php b/languages/messages/MessagesAln.php
index 3041e865..189e11c6 100644
--- a/languages/messages/MessagesAln.php
+++ b/languages/messages/MessagesAln.php
@@ -49,16 +49,16 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'currentmonth' => array( '1', 'MUEJIAKTUAL', 'MUEJIAKTUAL2', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MUEJIAKTUAL1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'EMNIMUEJITAKTUAL', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
- 'currenttime' => array( '1', 'KOHATASH', 'KOHATANI', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORATASH', 'ORATANI', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MUEJILOKAL', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'img_center' => array( '1', 'qendër', 'qendrore', 'qëndër', 'qëndrore', 'center', 'centre' ),
- 'img_baseline' => array( '1', 'vijabazë', 'linjabazë', 'baseline' ),
- 'servername' => array( '0', 'EMNISERVERIT', 'EMRIISERVERIT', 'SERVERNAME' ),
- 'currentweek' => array( '1', 'JAVAAKTUALE', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
+ 'currentmonth' => array( '1', 'MUEJIAKTUAL', 'MUEJIAKTUAL2', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MUEJIAKTUAL1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'EMNIMUEJITAKTUAL', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
+ 'currenttime' => array( '1', 'KOHATASH', 'KOHATANI', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORATASH', 'ORATANI', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MUEJILOKAL', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'img_center' => array( '1', 'qendër', 'qendrore', 'qëndër', 'qëndrore', 'center', 'centre' ),
+ 'img_baseline' => array( '1', 'vijabazë', 'linjabazë', 'baseline' ),
+ 'servername' => array( '0', 'EMNISERVERIT', 'EMRIISERVERIT', 'SERVERNAME' ),
+ 'currentweek' => array( '1', 'JAVAAKTUALE', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
);
$messages = array(
@@ -415,15 +415,14 @@ Ndodh që âsht fshi prej dikujt tjetër.',
'badtitle' => 'Titull i keq',
'badtitletext' => 'Titulli i faqes që kërkuet ishte jovalid, bosh, apo ishte nji vegëz gabim e lidhun ndërgjuhesisht apo ndër-wiki.
Ndodh që ka shêja që nuk munden me u përdorë në titull.',
-'perfcached' => 'Informacioni i mâposhtëm âsht kopje e memorizueme, por mundet mos me qenë verzioni i fundit:',
-'perfcachedts' => 'Shenimi i mâposhtëm âsht kopje e memorizueme dhe âsht rifreskue së fundit me $1.',
+'perfcached' => 'Informacioni i mâposhtëm âsht kopje e memorizueme, por mundet mos me qenë verzioni i fundit. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Shenimi i mâposhtëm âsht kopje e memorizueme dhe âsht rifreskue së fundit me $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Redaktimi i kësaj faqeje âsht ndalue për momentin.
Shenimet këtu nuk do të rifreskohen.',
'wrong_wfQuery_params' => 'Parametra gabim te wfQuery()<br />
Funksioni: $1<br />
Kërkesa: $2',
'viewsource' => 'Shih kodin',
-'viewsourcefor' => 'e $1',
'actionthrottled' => 'Veprimi âsht i kufizuem',
'actionthrottledtext' => 'Si masë kunder spamit, jeni të kufizuem me kry këtë veprim shumë herë për nji kohë shumë të shkurtë, dhe e keni tejkalue këtë kufizim.
Ju lutemi provoni prap mbas disa minutave.',
@@ -640,9 +639,6 @@ Nuk mundeni me shfrytëzue funksionin 'dërgo email këtij përdoruesi' përveç
Adresa juej aktuale e IP âsht $3, dhe ID e bllokimit âsht #$5.
Ju lutemi përfshini këto shenime në të gjitha shkresat që i bâni.",
'blockednoreason' => 'nuk âsht dhânë arsye',
-'blockedoriginalsource' => "Kodi burimor i '''$1''' âsht mâ poshtë:",
-'blockededitsource' => "Teksti i '''redaktimeve tueja''' të '''$1''' âsht mâ poshtë:",
-'whitelistedittitle' => 'Lypet kyçje për me mujtë me redaktue',
'whitelistedittext' => 'Duheni me u $1 për me redaktue artikuj.',
'confirmedittext' => 'Duheni me vërtetue adresën tuej të emailit para se me redaktue.
Ju lutemi vërtetoni adresën tuej të emailit përmjet [[Special:Preferences|parapëlqimeve]] tueja.',
@@ -842,22 +838,11 @@ Shiko tek [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} regjistr
'revdelete-unsuppress' => 'Hiq kufizimet nga versionet e restauruara',
'revdelete-log' => 'Arsyeja:',
'revdelete-submit' => 'Apliko te versionet e zgjedhura',
-'revdelete-logentry' => 'Pamja e versionit u ndryshua për [[$1]]',
-'logdelete-logentry' => 'u ndryshua dukshmëria e ngjarjes së [[$1]]',
'revdelete-success' => "'''Dukshmëria e versioneve u vendos me sukses.'''",
'logdelete-success' => "'''Dukshmëria e regjistrave u vendos me sukses.'''",
'revdel-restore' => 'ndrro dukshmëninë',
'pagehist' => 'Historiku i faqes',
'deletedhist' => 'Historiku i grisjeve',
-'revdelete-content' => 'përmbajtja',
-'revdelete-summary' => 'përmbledhja redaktimit',
-'revdelete-uname' => 'përdoruesi',
-'revdelete-restricted' => 'u vendosën kufizime për administruesit',
-'revdelete-unrestricted' => 'u hoqën kufizimet për administruesit',
-'revdelete-hid' => 'u fsheh $1',
-'revdelete-unhid' => 'u tregua $1',
-'revdelete-log-message' => '$1 për $2 {{PLURAL:$2|version|versione}}',
-'logdelete-log-message' => '$1 për $2 {{PLURAL:$2|ngjarje|ngjarje}}',
'revdelete-edit-reasonlist' => 'Arsye grisjeje për redaktimet',
# Suppression log
@@ -993,7 +978,7 @@ Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të
'prefs-rc' => 'Ndryshimet e freskëta',
'prefs-watchlist' => 'Lista e mbikëqyrjeve',
'prefs-watchlist-days' => 'Numri i ditëve me i tregue në listën e mbikëqyrjeve:',
-'prefs-watchlist-days-max' => 'Maksimalisht 7 ditë',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Numri maksimal i ndryshimeve që tregohen në listën e zgjânueme të mbikëqyrjes:',
'prefs-watchlist-edits-max' => 'Numri maksimal: 1000',
'prefs-misc' => 'Të ndryshme',
@@ -1149,6 +1134,7 @@ Mundeni me zgjedhe që të tjerët me ju kontaktue përmjet faqe së diskutimit
'right-unwatchedpages' => 'Shiko listën e faqeve të pa vëzhguara',
'right-mergehistory' => 'Bashko historinë e faqeve',
'right-userrights' => 'Redakto të gjitha të drejtat e përdoruesit',
+'right-passwordreset' => 'Fjalëkalimi Reset e një përdoruesi ([[Special:PasswordReset|faqe veçantë]])',
# User rights log
'rightslog' => 'Regjsitri i tagrit të përdoruesve',
@@ -1293,8 +1279,7 @@ Faqet në [[Special:Watchlist|listën tuej të mbikëqyrjes]] janë '''të theks
'linksearch' => 'Vegzat e jashtme',
# Special:Log/newusers
-'newuserlogpage' => 'Regjistri i krijimit të përdoruesve',
-'newuserlog-create-entry' => 'Përdorues i ri',
+'newuserlogpage' => 'Regjistri i krijimit të përdoruesve',
# Special:ListGroupRights
'listgrouprights-members' => '(lista e antarëve)',
@@ -1326,7 +1311,6 @@ Ju lutemi konfirmoni që kjo âsht ajo që deshtët me bâ, që i keni të njoft
'actioncomplete' => 'Veprimi u kry',
'deletedtext' => '"$1" âsht fshi.
Shih $2 për regjistrin e fshimjeve të fundit.',
-'deletedarticle' => 'grisi "[[$1]]"',
'dellogpage' => 'Regjistri i fshimjeve',
'deletecomment' => 'Arsyeja:',
'deleteotherreason' => 'Arsyet tjera/shtesë:',
@@ -1362,7 +1346,6 @@ Mundeni me ndryshue nivelin e mbrojtjes për këtë faqe, por kjo nuk ka me prek
# Undelete
'undeletelink' => 'shih/kthe',
'undeleteviewlink' => 'shih',
-'undeletedarticle' => 'u rikthye "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Hapësira:',
@@ -1453,8 +1436,6 @@ Ju lutemi zgjedhni nji titull tjetër.',
Ju lutemi bashkoni manualisht.'''",
'movedto' => 'zhvendosur te',
'movetalk' => 'Zhvendos faqen gjegjëse të diskutimeve',
-'1movedto2' => '[[$1]] u zhvendos në [[$2]]',
-'1movedto2_redir' => '[[$1]] u zhvendos te [[$2]] përmjet përcjelljes',
'movelogpage' => 'Regjistri i zhvendosjeve',
'movereason' => 'Arsyeja:',
'revertmove' => 'kthe mbrapsht',
@@ -1572,7 +1553,7 @@ Lejon dhânien e arsyes në përmbledhje.',
# Media information
'file-info-size' => '$1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4',
-'file-nohires' => '<small>Rezolucioni i plotë.</small>',
+'file-nohires' => 'Rezolucioni i plotë.',
'svg-long-desc' => 'skeda SVG, $1 × $2 pixela, madhësia: $3',
'show-big-image' => 'Rezolucion i plotë',
@@ -1634,4 +1615,8 @@ Tjerat kanë me mbetë të mshefuna.
# Special:SpecialPages
'specialpages' => 'Faqet e posaçme',
+# New logging system
+'revdelete-restricted' => 'u vendosën kufizime për administruesit',
+'revdelete-unrestricted' => 'u hoqën kufizimet për administruesit',
+
);
diff --git a/languages/messages/MessagesAls.php b/languages/messages/MessagesAls.php
index 604f49fc..867d2a88 100644
--- a/languages/messages/MessagesAls.php
+++ b/languages/messages/MessagesAls.php
@@ -9,4 +9,4 @@
* @comment Deprecated code. Falls back to 'gsw'.
*/
-$fallback = 'gsw';
+$fallback = 'gsw, de';
diff --git a/languages/messages/MessagesAm.php b/languages/messages/MessagesAm.php
index 518fd265..d0999fbb 100644
--- a/languages/messages/MessagesAm.php
+++ b/languages/messages/MessagesAm.php
@@ -362,14 +362,13 @@ $1',
'cannotdelete' => 'የተወሰáŠá‹ ገጽ ወይሠá‹á‹­áˆ ለማጥá‹á‰µ አáˆá‰°á‰»áˆˆáˆá¢ (áˆáŠ“áˆá‰£á‰µ በሌላ ሰዠእጅ ገና ጠáቷáˆá¢)',
'badtitle' => 'መጥᎠአርዕስት',
'badtitletext' => 'የáˆáˆˆáŒ‰á‰µ አርዕስት áˆáŠ­ አáˆáŠá‰ áˆ¨áˆá¢ áˆáŠ“áˆá‰£á‰µ ለአርዕስት የማይሆን የáŠá‹°áˆ áˆáˆáŠ­á‰µ አለበትá¢',
-'perfcached' => 'ማስታወቂያᡠይህ መረጃ በየጊዜ የሚታደስ ስለሆአዘመናዊ ሳይሆን የቆየ ሊሆን ይችላáˆá¢',
+'perfcached' => 'ማስታወቂያᡠይህ መረጃ በየጊዜ የሚታደስ ስለሆአዘመናዊ ሳይሆን የቆየ ሊሆን ይችላáˆá¢ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
'perfcachedts' => 'የሚቀጥለዠመረጃ ተቆጥቧáˆá£ መጨረሻ የታደሠዠ$1 እ.ኤ.አ. áŠá‹á¢',
'querypage-no-updates' => 'ይህ ገጽ አáˆáŠ• የታደሠ አይደለáˆá¢ ወደáŠá‰µáˆ መታደሱ ቀርቷáˆá¢ በቅርብ áŒá‹œ አይታደስáˆá¢',
'wrong_wfQuery_params' => 'ለwfQuery() ትክክለኛ á‹«áˆáˆ†áŠ áŒá‰¤á‰µ<br />
ተáŒá‰£áˆ­á¦ $1<br />
ጥያቄᦠ$2',
'viewsource' => 'áˆáŠ•áŒ©áŠ• ተመáˆáŠ¨á‰µ',
-'viewsourcefor' => 'ለ«$1»',
'actionthrottled' => 'ተáŒá‰£áˆ© ተቋረጠ',
'actionthrottledtext' => 'የስá“ሠመብዛት ለመቃወáˆá£ በአጭር ጊዜ á‹áˆµáŒ¥ ይህን ተáŒá‰£áˆ­ ብዙ ጊዜ ከመáˆáŒ½áˆ ተክለክለዋáˆá¢ አáˆáŠ•áˆ ከመጠኑ በላይ በáˆáŒ á‹‹áˆá¢ እባክዎ ከጥቂት ደቂቃ በኋላ እንደገና ይሞክሩá¢',
'protectedpagetext' => 'ይኸዠገጽ እንዳይታረሠተጠብቋáˆá¢',
@@ -530,9 +529,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
የማገጃዎ á‰áŒ¥áˆ­ # $5 áŠá‹á¢ እባክዎ በማንኛá‹áˆ ጥያቄ ይህን á‰áŒ¥áˆ­ ይሰጡá¢",
'blockednoreason' => 'áˆáŠ•áˆ áˆáŠ­áŠ•á‹«á‰µ አáˆá‰°áˆ°áŒ áˆ',
-'blockedoriginalsource' => "የ'''$1''' ጥሬ ኮድ áˆáŠ•áŒ­ ከዚህ ታች ይታያáˆá¦",
-'blockededitsource' => "በ'''$1''' ላይ '''የእርስዎ ለá‹áŒ¦á‰½''' ጽሕáˆá‰µ ከዚህ ታች ይታያሉá¦",
-'whitelistedittitle' => 'ለማዘጋጀት መáŒá‰£á‰µ አስቀድሞ ያስáˆáˆáŒ‹áˆ',
'whitelistedittext' => 'ገጾችን ለማዘጋጀት $1 አስቀድሞ ያስáˆáˆáŒá‹Žá‰³áˆá¢',
'confirmedittext' => 'ገጽ ማዘጋጀት ሳይችሉᣠአስቀድመዠየኢ-ሜሠአድራሻዎን ማረጋገጥ አለብዎትᢠእባክዎᣠበ[[Special:Preferences|áˆáˆ­áŒ«á‹Žá‰½á‹Ž]] በኩሠኢ-ሜሠአድራሻዎን ያረጋáŒáŒ¡á¢',
'nosuchsectiontitle' => 'የማይኖር ክááˆ',
@@ -670,12 +666,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'revdelete-submit' => 'በተመረጠዠዕትሠይደረáŒ',
'revdel-restore' => 'እይታን ለማስተካከáˆ',
'pagehist' => 'የገጽ ታሪክ',
-'revdelete-content' => 'ይዞታ',
-'revdelete-summary' => 'ማጠቃለያ',
-'revdelete-uname' => 'ያባሠስáˆ',
-'revdelete-hid' => '$1 ደበቀ',
-'revdelete-unhid' => '$1 ገለጸ',
-'revdelete-log-message' => '$1 ለ$2 {{PLURAL:$2|እትáˆ|እትሞች}}',
# Suppression log
'suppressionlog' => 'የመከáˆáŠ¨áˆ መá‹áŒˆá‰¥',
@@ -790,7 +780,7 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'prefs-rc' => 'የቅርቡ ለá‹áŒ¦á‰½ á‹áˆ­á‹áˆ­',
'prefs-watchlist' => 'የሚከታተሉ ገጾች',
'prefs-watchlist-days' => 'በሚከታተሉት ገጾች á‹áˆ­á‹áˆ­ ስንት ቀን ይታይá¤',
-'prefs-watchlist-days-max' => '(ከ7 ቀን አይበáˆáŒ¥áˆ)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'በተደረáŒá‰µ á‹áˆ­á‹áˆ­ ስንት ለá‹áŒ¥ ይታይá¤',
'prefs-watchlist-edits-max' => '(ከ1,000 ለá‹áŒ¥ በላይ አይሆንáˆ)',
'prefs-misc' => 'áˆá‹© áˆá‹© áˆáˆ­áŒ«á‹Žá‰½',
@@ -918,7 +908,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'right-import' => 'ከሌላ ዊኪ ገጾችን ለማስገባት',
'right-patrol' => 'የሰዠለá‹áŒ¦á‰½ የተሣለበሆáŠá‹ ለማመáˆáŠ¨á‰µ',
'right-autopatrol' => 'የራሱ ለá‹áŒ¦á‰½ በቀጥታ የተሣለበሆáŠá‹ መመáˆáŠ¨á‰µ',
-'right-trackback' => 'trackback ለማቅረብ',
'right-mergehistory' => 'የገጾች እትሞችን ታሪክ ለመዋáˆá‹µ',
'right-userrights' => 'ያባላት áˆáˆ‰ መብቶች ለማስተካከáˆ',
@@ -950,7 +939,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'action-import' => 'ይህን ገጽ ከሌላ ዊኪ ለማስገባት',
'action-patrol' => 'የሰዠለá‹áŒ¦á‰½ የተሣለበሆáŠá‹ ለማመáˆáŠ¨á‰µ',
'action-autopatrol' => 'የራስዎ ለá‹áŒ¥ የተሣለሠሆኖ መመáˆáŠ¨á‰µ',
-'action-trackback' => 'trackback ለማቅረብ',
'action-mergehistory' => 'የዚáˆáŠ• ገጽ ዕትሞች ታሪክ ለማዋáˆá‹µ',
'action-userrights' => 'ያባላት áˆáˆ‰ መብቶች ለማስተካከáˆ',
@@ -1312,11 +1300,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'ማንሠተጠቃሚ አáˆá‰°áŒˆáŠ˜áˆá¢',
# Special:Log/newusers
-'newuserlogpage' => 'የአባáˆáŠá‰µ መá‹áŒˆá‰¥ (user log)',
-'newuserlogpagetext' => 'ይህ መá‹áŒˆá‰¥ ወደ አባáˆáŠá‰µ የገቡትን ብዕር ስሞች ይዘርá‹áˆ«áˆá¢',
-'newuserlog-byemail' => 'ማለáŠá‹«-ቃሠበኤ-መáˆá‹•áŠ­á‰µ ተáˆáŠ³áˆ',
-'newuserlog-create-entry' => 'አዲስ አባáˆ',
-'newuserlog-create2-entry' => 'ለ$1 አባáˆáŠá‰µ ተáˆáŒ¥áˆ¯áˆ',
+'newuserlogpage' => 'የአባáˆáŠá‰µ መá‹áŒˆá‰¥ (user log)',
+'newuserlogpagetext' => 'ይህ መá‹áŒˆá‰¥ ወደ አባáˆáŠá‰µ የገቡትን ብዕር ስሞች ይዘርá‹áˆ«áˆá¢',
# Special:ListGroupRights
'listgrouprights' => 'የተጠቃሚ ስብስባ መብቶች',
@@ -1427,8 +1412,6 @@ $NEWPAGE
'deletedtext' => '«$1» ጠáቷáˆá¢
(የጠá‰á‰µáŠ• ገጾች áˆáˆ‰ ለመመáˆáŠ¨á‰µ $2 á‹­á‹©á¢)',
-'deletedarticle' => '«[[$1]]» አጠá‹',
-'suppressedarticle' => '"[[$1]]"ን ከለከለ',
'dellogpage' => 'የማጥá‹á‰µ መá‹áŒˆá‰¥',
'dellogpagetext' => 'በቅርቡ የጠá‰á‰µ ገጾች ከዚህ ታች የዘረá‹áˆ«áˆ‰á¢',
'deletionlog' => 'የማጥá‹á‰µ መá‹áŒˆá‰¥',
@@ -1521,7 +1504,6 @@ $NEWPAGE
'undeletelink' => 'አሳይ/ወደ áŠá‰ áˆ¨á‰ á‰µ መáˆáˆµ',
'undeletereset' => 'ባዶ ይደረáŒ',
'undeletecomment' => 'ማጠቃáˆá‹«á¦',
-'undeletedarticle' => '«[[$1]]»ን መለሰ',
'undeletedrevisions' => '{{PLURAL:$1|1 ዕትáˆ|$1 ዕትሞች}} መለሰ',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ዕትáˆ|$1 ዕትሞች}} እና {{PLURAL:$2|1 á‹á‹­áˆ|$2 á‹á‹­áˆŽá‰½}} መለሰ',
'undeletedfiles' => '{{PLURAL:$1|1 á‹á‹­áˆ|$1 á‹á‹­áˆŽá‰½}} መለሰ',
@@ -1712,9 +1694,6 @@ $1',
'move-talk-subpages' => 'የá‹á‹­á‹­á‰± ገጽ ንዑስ ገጾች á‹°áŒáˆž ይዛወሩ',
'movepage-page-moved' => 'ገጹ $1 ወደ $2 ተዛá‹áˆ¯áˆá¢',
'movepage-page-unmoved' => 'ገጹ $1 ወደ $2 ሊዛወር አáˆá‰°á‰»áˆˆáˆá¢',
-'1movedto2' => '«$1» ወደ «[[$2]]» አዛወረ',
-'1movedto2_redir' => '«[[$1]]» ወደ «[[$2]]» አዛወረ -- በመáˆáˆªá‹« መንገድ áˆáŠ•á‰³',
-'move-redirect-suppressed' => 'መáˆáˆªá‹« መንገድ ተከለከለ',
'movelogpage' => 'የማዛወር መá‹áŒˆá‰¥',
'movelogpagetext' => 'ይህ መá‹áŒˆá‰¥ ገጽ ሲዛወር ይመá‹áŒˆá‰£áˆá¢ <ይመለስ> ቢጫኑ ኖሮ መዛወሩን ይገለብጣáˆ!',
'movereason' => 'áˆáŠ­áŠ•á‹«á‰µ:',
@@ -1873,8 +1852,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => 'የማሳለáŠá‹« መá‹áŒˆá‰¥',
-'patrol-log-line' => 'እትሠ$1 ከ$2 የተመለከተ ሆኖ አሳለሠ$3',
-'patrol-log-auto' => '(በቀጥታ)',
# Image deletion
'deletedrevision' => 'የቆየዠዕትሠ$1 አጠá‹',
@@ -1896,7 +1873,7 @@ $1',
'widthheightpage' => '$1 በ$2ᣠ$3 ገጾች',
'file-info' => 'የá‹á‹­áˆ መጠንᦠ$1ᣠየMIME አይáŠá‰µá¦ $2',
'file-info-size' => '$1 × $2 á’ክስáˆá¤ መጠንᦠ$3ᤠየMIME á‹“á‹­áŠá‰µá¦ $4',
-'file-nohires' => '<small>ከዚህ በላይ ማጉላት አይቻáˆáˆá¢</small>',
+'file-nohires' => 'ከዚህ በላይ ማጉላት አይቻáˆáˆá¢',
'svg-long-desc' => 'የSVG á‹á‹­áˆá¡ በተáŒá‰£áˆ­ $1 × $2 á’ክስáˆá¤ መጠንᦠ$3',
'show-big-image' => 'በሙሉ ጒáˆáˆ…áŠá‰µ ለመመáˆáŠ¨á‰µ',
@@ -2173,9 +2150,6 @@ $3
# Scary transclusion
'scarytranscludetoolong' => '[URL ከመጠን በላይ የረዘመ áŠá‹]',
-# Trackbacks
-'trackbackremove' => '([$1 ማጥá‹á‰µ])',
-
# Delete conflict
'deletedwhileediting' => "'''ማስጠንቀቂያ'''ᦠመዘጋጀት ከጀመሩ በኋላ ገጹ ጠáቷáˆ!",
'confirmrecreate' => "መዘጋጀት ከጀመሩ በኋላᣠተጠቃሚዠ[[User:$1|$1]] ([[User talk:$1|á‹á‹­á‹­á‰µ]]) ገጹን አጠáተዠይህን áˆáŠ­áŠ•á‹«á‰µ አቀረቡá¦
@@ -2292,4 +2266,34 @@ $3
# Special:BlankPage
'blankpage' => 'ባዶ ገጽ',
+# New logging system
+'newuserlog-byemail' => 'ማለáŠá‹«-ቃሠበኤ-መáˆá‹•áŠ­á‰µ ተáˆáŠ³áˆ',
+
+# API errors
+'api-error-badaccess-groups' => 'እርስዎ በዚህ á‹áŠª ላይ á‹á‹­áˆ እንድሊኩ አáˆá‰°áˆá‰€á‹°áˆá¢',
+'api-error-badtoken' => 'የá‹áˆµáŒ¥ ስህተት: መጥᎠጥቅáˆá¢',
+'api-error-copyuploaddisabled' => 'በሰáŠá‹µ አድራሻ መላክ በዚህ አቅራቢ ላይ አáˆá‰°áˆá‰€á‹°áˆá¢',
+'api-error-duplicate' => 'በዚህ ድረ ገጽ ላይ የዚህ á‹“á‹­áŠá‰µ ይዞታ {{PLURAL:$1| [$2 ያለዠá‹á‹­áˆ አለá¢] | [$2 ያላቸዠáይሎች አሉá¢]}}',
+'api-error-duplicate-popup-title' => 'አንድ አይáŠá‰µ {{PLURAL:$1|á‹á‹­áˆ|á‹á‹­áˆŽá‰½}}',
+'api-error-empty-file' => 'የላኩት á‹á‹­áˆ ባዶ áŠá‰ áˆ­á¢',
+'api-error-fetchfileerror' => 'የá‹áˆµáŒ¥ ስህተት: áይሉ ሲመጣ ችáŒáˆ­ ተáˆáŒ áˆ¨á¢',
+'api-error-file-too-large' => 'የላኩት á‹á‹­áˆ በጣሠትáˆá‰… áŠá‰ áˆ­á¢',
+'api-error-filename-tooshort' => 'የá‹á‹­áˆ‰ ስሠበጣሠትንሽ áŠá‹á¢',
+'api-error-filetype-banned' => 'የዚህ á‹“á‹­áŠá‰µ á‹á‹­áˆ ተከáˆáŠ­áˆáˆá¢',
+'api-error-filetype-missing' => 'á‹á‹­áˆ‰ ቅጥያ ይጎለዋáˆá¢',
+'api-error-illegal-filename' => 'የá‹á‹­áˆ‰ ስሠየተáˆá‰€á‹° አይደለáˆá¢',
+'api-error-invalid-file-key' => 'የá‹áˆµáŒ¥ ስህተት: áይሉ የጊዜያዊ ማስቀመጫ á‹áˆµáŒ¥ አáˆá‰°áŒˆáŠ˜áˆá¢',
+'api-error-missingparam' => 'የá‹áˆµáŒ¥ ስህተት: ጥያቄዠáŒá‰¤á‰¶á‰½ ይጎሉታáˆá¢',
+'api-error-missingresult' => 'የá‹áˆµáŒ¥ ስህተት: መቅዳቱ እንደተሳካ ማረጋገጥ አáˆá‰°á‰»áˆˆáˆá¢',
+'api-error-mustbeloggedin' => 'á‹á‹­áˆ ለመላክ ተዘáŒá‰¦ መáŒá‰£á‰µ ያስáˆáˆáŒ‹áˆá¢',
+'api-error-noimageinfo' => 'á‹á‹­áˆ መላኩ ተሳክቷሠáŒáŠ• አቅራቢዠáˆáŠ•áˆ á‹“á‹­áŠá‰µ መረጃ ስለ á‹á‹­áˆ‰ አáˆáˆ°áŒ áˆá¢',
+'api-error-overwrite' => 'እንድን á‹á‹­áˆ á‹°áˆáˆµáˆ¶ መጻá አáˆá‰°áˆá‰€á‹°áˆá¢',
+'api-error-stashfailed' => 'የá‹áˆµáŒ¥ ስህተት: አቅራቢዠጊዜያዊ áይሉን አላስቀመጠáˆá¢',
+'api-error-timeout' => 'በሚገባ ጊዜ á‹áˆµáŒ¥ አቅራቢዠመáˆáˆµ አáˆáˆ°áŒ áˆá¢',
+'api-error-unknown-code' => 'á‹«áˆá‰³á‹ˆá‰€ ስህተት: "$1"',
+'api-error-unknown-error' => 'የá‹áˆµáŒ¥ ስህተት: የእርስዎን á‹á‹­áˆ ለመላክ ሲሞከር ችáŒáˆ­ ተáˆáŒ áˆ¨á¢',
+'api-error-unknown-warning' => 'á‹«áˆá‰³á‹ˆá‰€ ማስጠንቀቂያ $1',
+'api-error-uploaddisabled' => 'á‹á‹­áˆ መላክ በዚህ á‹áŠª ላይ አáˆá‰°áˆá‰€á‹°áˆá¢',
+'api-error-verification-error' => 'ይህ á‹á‹­áˆ የተበላሸ ወይሠትክክሠያáˆáˆ†áŠ ቅጥያ ያለዠሊሆን ይችላáˆá¢',
+
);
diff --git a/languages/messages/MessagesAn.php b/languages/messages/MessagesAn.php
index b5e9775a..439bb62d 100644
--- a/languages/messages/MessagesAn.php
+++ b/languages/messages/MessagesAn.php
@@ -44,16 +44,16 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
- 'namespace' => array( '1', 'ESPACIODENOMBRES', 'ESPACIODENOMBRE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESPACIODENOMBRESE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
- 'img_right' => array( '1', 'dreita', 'derecha', 'dcha', 'der', 'right' ),
- 'img_left' => array( '1', 'cucha', 'zurda', 'izquierda', 'izda', 'izq', 'left' ),
- 'ns' => array( '0', 'EN:', 'EDN:', 'NS:' ),
- 'displaytitle' => array( '1', 'TÃTOL', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'BERSIÓNAUTUAL', 'BERSIONAUTUAL', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
- 'language' => array( '0', '#LUENGA:', '#IDIOMA:', '#LANGUAGE:' ),
- 'special' => array( '0', 'especial', 'espezial', 'special' ),
+ 'redirect' => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+ 'namespace' => array( '1', 'ESPACIODENOMBRES', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESPACIODENOMBRESE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+ 'img_right' => array( '1', 'dreita', 'derecha', 'dcha', 'der', 'right' ),
+ 'img_left' => array( '1', 'cucha', 'zurda', 'izquierda', 'izda', 'izq', 'left' ),
+ 'ns' => array( '0', 'EN:', 'EDN:', 'NS:' ),
+ 'displaytitle' => array( '1', 'TÃTOL', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
+ 'currentversion' => array( '1', 'BERSIÓNAUTUAL', 'BERSIONAUTUAL', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#LUENGA:', '#IDIOMA:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'especial', 'espezial', 'special' ),
);
$specialPageAliases = array(
@@ -486,20 +486,22 @@ Por favor, comunique-lo a un [[Special:ListUsers/sysop|almenistrador]] indicando
'formerror' => 'Error: no se podió ninviar o formulario',
'badarticleerror' => 'Ista acción no se puede no se puede reyalizar en ista pachina.',
'cannotdelete' => 'No s\'ha puesto borrar pachina u fichero "$1". Talment belatro usuario l\'ha borrato dinantes.',
+'cannotdelete-title' => 'No se puede borrar a pachina «$1»',
'badtitle' => 'Títol incorrecto',
'badtitletext' => "O títol d'a pachina demandata ye buedo, incorrecto, u tiene un vinclo interwiki mal feito. Puede contener uno u más caracters que no se pueden fer servir en títols.",
-'perfcached' => 'Os datos que siguen son en caché, y podrían no estar esviellatos:',
-'perfcachedts' => 'Istos datos se troban en a caché, que estió esviellata por zaguer vegada o $1.',
+'perfcached' => 'Os datos siguients son en caché, y talment no son esviellatos. I hai un maximo de {{PLURAL:$1|un resultau disponible|$1 resultaus disponibles}} en a caché.',
+'perfcachedts' => "Os datos siguients se troban en a caché, que estió esviellata por zaguer vegada o $1. I hai un maximo {{PLURAL:$4|d'un resultau disponible|de $4 resultaus disponibles}} en a caché.",
'querypage-no-updates' => "S'han desactivato as actualizacions d'ista pachina. Por ixo, no s'esta esviellando os datos.",
'wrong_wfQuery_params' => 'Parametros incorrectos ta wfQuery()<br />
Función: $1<br />
Consulta: $2',
'viewsource' => 'Veyer o codigo fuent',
-'viewsourcefor' => 'ta $1',
+'viewsource-title' => 'Veyer o codigo fuent de «$1»',
'actionthrottled' => 'acción afogata',
'actionthrottledtext' => 'Como mesura contra lo "spam", bi ha un limite en o numero de vegadas que puede fer ista acción en un curto espacio de tiempo, y ha brincato d\'ixe limite. Aguarde bells menutos y prebe de fer-lo de nuevas.',
'protectedpagetext' => 'Ista pachina ha estato protechita ta aprevenir a suya edición.',
'viewsourcetext' => "Puede veyer y copiar o codigo fuent d'ista pachina:",
+'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)',
@@ -590,6 +592,7 @@ Por ixo, no se pueden creyar más cuentas por agora dende ixa adreza IP.",
'noemailprefs' => 'Escriba una adreza de correu-e ta activar istas caracteristicas.',
'emailconfirmlink' => 'Confirme a suya adreza de correu-e',
'invalidemailaddress' => "No se puet acceptar l'adreza de correu-e pues pareix que tien un formato no conforme. Escriba una adreza bien formateyata, u deixe buedo ixe campo.",
+'cannotchangeemail' => "As adrezas de correu electronico d'as cuentas d'usuario no se pueden cambiar en ista wiki.",
'accountcreated' => 'Cuenta creyata',
'accountcreatedtext' => "S'ha creyato a cuenta d'usuario de $1.",
'createaccount-title' => 'Creyar una cuenta en {{SITENAME}}',
@@ -604,6 +607,7 @@ Si a cuenta s\'ha creyato por error, simplament ignore iste mensache.',
# E-mail sending
'php-mail-error-unknown' => 'Error desconoixito en a función mail() de PHP',
+'user-mail-no-addy' => 'Ha mirau de ninviar un mensache de correu sin una adreza de correu electronico.',
# Change password dialog
'resetpass' => 'Cambiar a clau',
@@ -624,28 +628,43 @@ Talment ya ha cambiato a suya clau u ha demandato una nueva clau temporal.',
'resetpass-temp-password' => '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-email' => 'Adreza de correu electronico:',
-'passwordreset-emailtitle' => "Detalles d'a cuenta en {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Belún (probablement vusté, dende l'adreza IP $1) ha demandau un recordatorio d'a información d'a suya cuenta en {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:
+'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?',
+'passwordreset-capture-help' => "Si marca ista caixeta, se li amostrará o correu electronico (con a clau temporal) amás de ninviar-lo ta l'usuario.",
+'passwordreset-email' => 'Adreza de correu electronico:',
+'passwordreset-emailtitle' => "Detalles d'a cuenta en {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Belún (probablement vusté, dende l'adreza IP $1) ha demandau un recordatorio d'a información d'a suya cuenta en {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:
$2
{{PLURAL:$3|Ista clau temporal circumducirá|Istas claus temporals circumducirán}} en {{PLURAL:$5|un día|$5 días}}. Habría de connectar-se agora y trigar una nueva clau. Si ista demanda no dimana de vusté, u ya se'n ha acordau d'a suya clau inicial y ya no deseya modificar-la, puet ignorar iste mensache y continar emplegando a suya viella clau.",
-'passwordreset-emailtext-user' => "L'usuario $1 en {{SITENAME}} ha demandau un recordatorio d'a información d'a suya cuenta en {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:
+'passwordreset-emailtext-user' => "L'usuario $1 en {{SITENAME}} ha demandau un recordatorio d'a información d'a suya cuenta en {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:
$2
{{PLURAL:$3|Ista clau d'acceso temporal circumducirá|Istas claus d'acceso temporals circumducirán}} en {{PLURAL:$5|un día|$5 días}}. Habría de connectar-se agora y trigar una nueva clau. Si ista demanda no dimana de vusté, u ya se'n ha acordau d'a suya clau inicial y ya no deseya modificar-la, puet ignorar iste mensache y continar emplegando a suya viella clau.",
-'passwordreset-emailelement' => "Nombre de usuario: $1
+'passwordreset-emailelement' => "Nombre de usuario: $1
Clau d'acceso temporal: $2",
-'passwordreset-emailsent' => "S'ha ninviau un recordatorio por correu-e.",
+'passwordreset-emailsent' => "S'ha ninviau un recordatorio por correu-e.",
+'passwordreset-emailsent-capture' => "Se le ha ninviau un recordatorio por correu electronico, que s'amuestra contino.",
+'passwordreset-emailerror-capture' => "S'ha chenerau un recordatorio por correu electronico, que s'amuestra contino, pero o ninvío ta l'usuario ha fallau: $1",
+
+# Special:ChangeEmail
+'changeemail' => "Cambiar l'adreza de correu-e",
+'changeemail-header' => "Cambiar l'adreza de correu-e d'a cuenta",
+'changeemail-text' => "Replene iste formulario ta cambiar a suya adreza de correu electronico. Habrá d'introducir a clau ta confirmar iste cambeo.",
+'changeemail-no-info' => 'Debe identificar-se como usuario ta poder acceder dreitament ta ista pachina.',
+'changeemail-oldemail' => 'Adreza de correu-e actual:',
+'changeemail-newemail' => 'No bi ha garra adreza de correu electronico',
+'changeemail-none' => '(garra)',
+'changeemail-submit' => 'Cambiar adreza de correu-e',
+'changeemail-cancel' => 'Cancelar',
# Edit page toolbar
'bold_sample' => 'Texto en negreta',
@@ -712,9 +731,6 @@ Pare cuenta que no puede emplegar a función \"Ninviar correu electronico ta ist
A suya adreza IP actual ye \$3, y o identificador de bloqueyo ye #\$5. Por favor incluiga os datos anteriors quan faga qualsiquier consulta.",
'blockednoreason' => "No s'ha dato garra causa",
-'blockedoriginalsource' => "Contino s'amuestra o codigo fuent de '''$1''':",
-'blockededitsource' => "Contino s'amuestra o texto d'as suyas '''edicions''' a '''$1''':",
-'whitelistedittitle' => 'Cal encetar una sesión ta poder editar.',
'whitelistedittext' => 'Ha de $1 ta poder editar pachinas.',
'confirmedittext' => "Ha de confirmar a suya adreza de correu-e antis de poder editar pachinas. Por favor, estableixca y confirme una adreza de correu-e a traviés d'as suyas [[Special:Preferences|preferencias d'usuario]].",
'nosuchsectiontitle' => 'No se puede trobar ixa sección',
@@ -788,7 +804,7 @@ Habrá d'incorporar os suyos cambeos en o texto existent.
'''NO COPIE SIN PREMISO ESCRITOS CON DREITOS D'AUTOR!'''<br />",
'copyrightwarning2' => "Por favor, pare cuenta que todas as contrebucions a {{SITENAME}} pueden estar editatas, cambiatas u borratas por atros colaboradors. Si no deseya que atra chent corricha os suyos escritos sin piedat y los destribuiga librement, alavez, no debería meter-los aquí. <br /> En publicar aquí, tamién ye declarando que vusté mesmo escribió iste texto y ye o duenyo d'os dreitos d'autor, u bien lo copió dende o dominio publico u qualsiquier atra fuent libre (veyer $1 ta más información). <br />
'''NO COPIE SIN PREMISO ESCRITOS CON DREITOS D'AUTOR!'''",
-'longpageerror' => "'''ERROR: O texto que ha escrito ye de $1 kilobytes, que ye mayor que a grandaria maxima de $2 kilobytes. No se puede alzar.'''",
+'longpageerror' => "'''ERROR: O texto que ha escrito ye {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}}, que ye mas gran que a mida maxima {{PLURAL:$2|d'un kilobyte|de $2 kilobytes}}. No se puede alzar.'''",
'readonlywarning' => "'''Pare cuenta: A base de datos ye bloqueyata por custions de mantenimiento. Por ixo, en iste inte ye imposible d'alzar as suyas edicions. Puede copiar y apegar o texto en un fichero y alzar-lo ta dimpués.'''
A esplicación ufierta por l'almenistrador que bloqueyó a base de datos ye ista: $1",
@@ -953,8 +969,6 @@ Atros admenistradors de {{SITENAME}} encara podrán acceder t'o conteniu amagato
'revdelete-unsuppress' => "Sacar restriccions d'as versions restauradas",
'revdelete-log' => 'Razón:',
'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la versión trigata|las versions trigatas}}',
-'revdelete-logentry' => "S'ha cambiato a visibilidat d'a versión de [[$1]]",
-'logdelete-logentry' => "S'ha cambiato a visibilidat d'escaicimientos de [[$1]]",
'revdelete-success' => "'''S'ha cambiato correctament a visibilidat d'as versions.'''",
'revdelete-failure' => "'''La visibilidat d'a versión no s'ha puesto esviellar:'''
$1",
@@ -966,15 +980,6 @@ $1",
'revdel-restore-visible' => 'versions visibles',
'pagehist' => 'Historial',
'deletedhist' => 'Historial de borrau',
-'revdelete-content' => 'conteniu',
-'revdelete-summary' => 'editar resumen',
-'revdelete-uname' => "nombre d'usuario",
-'revdelete-restricted' => "S'han aplicato as restriccions ta administradors",
-'revdelete-unrestricted' => "S'han borrato as restriccions ta administradors",
-'revdelete-hid' => 'amagar $1',
-'revdelete-unhid' => 'amostrar $1',
-'revdelete-log-message' => '$1 ta $2 {{PLURAL:$2|versión|versions}}',
-'logdelete-log-message' => '$1 ta $2 {{PLURAL:$2|esdevenimiento|esdevenimientos}}',
'revdelete-hide-current' => "Error en amagar l'obchecto de calendata $2 y $1: ista ye a versión actual.
No se puet amagar.",
'revdelete-show-no-access' => 'Error amostrando l\'obchecto de calendata $2, $1: iste obchecto s\'ha marcau como "restrinchiu".
@@ -1129,12 +1134,14 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'prefs-rc' => 'Zaguers cambeos',
'prefs-watchlist' => 'Lista de seguimiento',
'prefs-watchlist-days' => "Numero de días que s'amostrarán en a lista de seguimiento:",
-'prefs-watchlist-days-max' => 'Masimo 7 diyas',
+'prefs-watchlist-days-max' => 'Maximo $1 {{PLURAL:$1|día|días}}',
'prefs-watchlist-edits' => "Numero d'edicions que s'amostrarán en a lista ixamplata:",
'prefs-watchlist-edits-max' => 'Numero masimo: 1000',
'prefs-watchlist-token' => 'Ficha de lista de seguimiento:',
'prefs-misc' => 'Atras preferencias',
'prefs-resetpass' => 'Cambiar a clau',
+'prefs-changeemail' => "Cambiar l'adreza de correu-e",
+'prefs-setemail' => 'Establir una adreza de correu-e',
'prefs-email' => 'Opcions de correu electronico',
'prefs-rendering' => 'Apariencia',
'saveprefs' => 'Alzar preferencias',
@@ -1196,6 +1203,7 @@ No se podrá desfer iste cambio.",
'yourrealname' => 'Nombre reyal:',
'yourlanguage' => 'Luenga:',
'yourvariant' => "Variant linguistica d'o conteniu:",
+'prefs-help-variant' => "A suya variant u ortografía preferida ta amostrar as pachinas de conteniu d'iste wiki.",
'yournick' => 'Sinyatura:',
'prefs-help-signature' => 'Os comentarios en pachina de discusión s\'han de sinyar con "<nowiki>~~~~</nowiki>", que se tornará en a suya sinyatura y calendata.',
'badsig' => 'A suya sinyadura no ye conforme; comprebe as etiquetas HTML.',
@@ -1235,7 +1243,7 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'userrights-lookup-user' => "Confegurar collas d'usuarios",
'userrights-user-editname' => "Escriba un nombre d'usuario:",
'editusergroup' => "Editar as collas d'usuarios",
-'editinguser' => "S'esta cambiando os dreitos de l'usuario '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "S'está cambiando os permisos de l'usuario '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Editar as collas d'usuarios",
'saveusergroups' => "Alzar as collas d'usuarios",
'userrights-groupsmember' => 'Miembro de:',
@@ -1329,13 +1337,13 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'right-autopatrol' => 'Sinyalar automaticament as edicions como patrullatas',
'right-patrolmarks' => 'Amostrar os sinyals de patrullache en os zaguers cambeos',
'right-unwatchedpages' => 'Amostrar una lista de pachinas sin cosirar',
-'right-trackback' => 'Adhibir un trackback',
'right-mergehistory' => "Fusionar l'historial d'as pachinas",
'right-userrights' => "Editar totz os dreitos d'usuario",
'right-userrights-interwiki' => "Editar os dreitos d'usuario d'os usuarios d'atros wikis",
'right-siteadmin' => 'Trancar y destrancar a base de datos',
'right-override-export-depth' => 'Exporta pachinas que incluigan as enlazadas dica un fundaria de 5',
'right-sendemail' => 'Ninviar un correu electronico a atros usuarios',
+'right-passwordreset' => 'Veyer os correus electronicos de restabimiento de claus',
# User rights log
'rightslog' => "Rechistro de cambios en os dreitos d'os usuarios",
@@ -1369,16 +1377,17 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'action-suppressionlog' => 'veyer iste rechistro privato',
'action-block' => 'bloqueyar iste usuario ta que no pueda editar',
'action-protect' => "cambiar os livels de protección d'ista pachina",
+'action-rollback' => "Desfer a escape as edicions d'o zaguer usuario que cambió una pachina determinada",
'action-import' => 'importar ista pachina dende atro wiki',
'action-importupload' => 'importar ista pachina dende un fichero cargato',
'action-patrol' => "sinyalar as edicions d'atros como patrulladas",
'action-autopatrol' => 'sinyalar as edicions propias como patrulladas',
'action-unwatchedpages' => 'veyer a lista de pachinas no cosiratas',
-'action-trackback' => "ninviar información d'una referencia",
'action-mergehistory' => "fusionar l'historial d'ista pachina",
'action-userrights' => "cambiar totz os dreitos d'usuario",
'action-userrights-interwiki' => "cambiar os dreitos d'usuario en atros wikis",
'action-siteadmin' => 'bloqueyar u desbloqueyar a base de datos',
+'action-sendemail' => 'ninviar correus electronicos',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cambeo|cambeos}}',
@@ -1410,6 +1419,7 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usuario|usuarios}} cosirando]',
'rc_categories' => 'Limite ta las categorías (deseparatas por "|")',
'rc_categories_any' => 'Todas',
+'rc-change-size-new' => "$1 {{PLURAL:$1|byte|bytes}} dimpués d'o cambio",
'newsectionsummary' => 'Nueva sección: /* $1 */',
'rc-enhanced-expand' => 'Amostrar detalles (cal JavaScript)',
'rc-enhanced-hide' => 'Amagar detalles',
@@ -1461,6 +1471,7 @@ Ta incluyir un fichero en una pachina, emplegue un vinclo d'una d'istas trazas
'ignorewarnings' => 'Ignorar qualsiquier aviso',
'minlength1' => 'Os nombres de fichero han de tener a lo menos una letra.',
'illegalfilename' => "O nombre de fichero «$1» tiene carácters no premititos en títols de pachinas. Por favor, cambee o nombre d'o fichero y mire de tornar a cargarlo.",
+'filename-toolong' => 'Os nombres de fichero no pueden tener mas de 240 bytes.',
'badfilename' => 'O nombre d\'a imachen s\'ha cambiato por "$1".',
'filetype-mime-mismatch' => 'A extensión ".$1" no coincide con o tipo MIME detectato en o fichero ($2).',
'filetype-badmime' => 'No se premite cargar fichers de tipo MIME "$1".',
@@ -1561,6 +1572,41 @@ $1',
'upload-unknown-size' => 'Grandaria desconoixid',
'upload-http-error' => 'Ha ocorriu una error HTTP: $1',
+# File backend
+'backend-fail-stream' => "No s'ha puesto transmitir o fichero «$1».",
+'backend-fail-backup' => "No s'ha puesto fer copia de seguranza d'o fichero «$1».",
+'backend-fail-notexists' => 'O fichero $1 no existe.',
+'backend-fail-hashes' => "No s'han puesto obtener os hashes d'os fichers ta comparar-los.",
+'backend-fail-notsame' => 'Ya existe un fichero diferent en $1.',
+'backend-fail-invalidpath' => "$1 no ye una rota d'almagazenamiento valida",
+'backend-fail-delete' => "No s'ha puesto borrar o fichero «$1».",
+'backend-fail-alreadyexists' => 'O fichero $1 ya existe.',
+'backend-fail-store' => 'No se podió almagazenar o fichero $1 en $2.',
+'backend-fail-copy' => 'No s\'ha puesto cambiar o nombre d\'o fichero "$1" a "$2".',
+'backend-fail-move' => 'No se podió mover o fichero $1 ta $2.',
+'backend-fail-opentemp' => "No s'ha puesto ubrir un fichero temporal.",
+'backend-fail-writetemp' => "No s'ha puesto escribir en o fichero temporal.",
+'backend-fail-closetemp' => "No s'ha puesto zarrar o fichero temporal.",
+'backend-fail-read' => "No s'ha puesto leyer o fichero «$1».",
+'backend-fail-create' => "No s'ha puesto creyar o fichero «$1».",
+'backend-fail-readonly' => 'O backend d\'almagazenamiento "$1" ye agora nomás de lectura. A razón dada estió: "$2"',
+'backend-fail-synced' => 'O fichero "$1" ye en un estau inconsistent en os backends d\'almagazenamiento internos',
+'backend-fail-connect' => 'No s\'ha puesto connectar ta o backend d\'almagazenamiento "$1".',
+'backend-fail-internal' => 'S\'ha produciu una error desconoixida en o fichero de backend d\'almagazenamiento "$1".',
+'backend-fail-contenttype' => 'No s\'ha puesto determinar a mena de contenius d\'o fichero a almagazenar en "$1".',
+'backend-fail-batchsize' => "O backend d'almagazenamiento ha recibiu un lot {{PLURAL:$1|d'$1 operación|de $1 operacions}} de fichero; o limite ye de $2 {{PLURAL:$2|operación|operacions}}",
+
+# Lock manager
+'lockmanager-notlocked' => 'No s\'ha puesto desbloquiar "$1": no se trobaba bloquiau.',
+'lockmanager-fail-closelock' => 'No s\'ha puest zarrar o fichero de bloqueyo de "$1".',
+'lockmanager-fail-deletelock' => 'No s\'ha puesto borrar o fichero "$1".',
+'lockmanager-fail-acquirelock' => 'No s\'ha puesto adquirir o bloqueyo de "$1".',
+'lockmanager-fail-openlock' => 'No s\'hapuesto ubrir o fichero de bloqueyo de "$1".',
+'lockmanager-fail-releaselock' => 'No s\'ha puesto liberra o bloqueyo de "$1".',
+'lockmanager-fail-db-bucket' => "No s'ha puesto contactar con suficients bases de datos d'o conchunto $1.",
+'lockmanager-fail-db-release' => "No s'han puesto liberar os bloqueyos rechistraus en a base de datos $1.",
+'lockmanager-fail-svr-release' => "No s'han puesto liberar os bloqueos rechistraus en o servidor $1.",
+
# ZipDirectoryReader
'zip-file-open-error' => "S'ha trobato una error en ubrir o ficherto ta fer-ie comprebacions ZIP.",
'zip-wrong-format' => 'O fichero especificau no ye un fichero ZIP.',
@@ -1577,6 +1623,7 @@ A suya seguranza no puede comprebar-se adequadament.',
'uploadstash-badtoken' => "No s'ha puesto executar ixa operación, tal vez porque as suyas credenciales d'edición son circumducitas. Intente-lo de nuevas.",
'uploadstash-errclear' => "O borrau d'os fichers no s'ha feito correctament.",
'uploadstash-refresh' => 'Esviellar a lista de fichers',
+'invalid-chunk-offset' => "Desplazamiento invalido d'o fragmento",
# img_auth script messages
'img-auth-accessdenied' => 'Acceso refusau',
@@ -1683,23 +1730,24 @@ Debaixo s'amuestra a descripción d'a suya [$2 pachina de descripción].",
'filerevert-badversion' => "No bi ha garra versión antiga d'o fichero con ixa calendata y hora.",
# File deletion
-'filedelete' => 'Borrar $1',
-'filedelete-legend' => 'Borrar fichero',
-'filedelete-intro' => "Ye en momentos de borrar o fichero '''[[Media:$1|$1]]''' chunto con toda a suya historia.",
-'filedelete-intro-old' => "Ye en momentos de borrar a versión de '''[[Media:$1|$1]]''' de [$4 $3, $2].",
-'filedelete-comment' => 'Razón:',
-'filedelete-submit' => 'Borrar',
-'filedelete-success' => "S'ha borrato '''$1'''.",
-'filedelete-success-old' => "S'ha borrato a versión de '''[[Media:$1|$1]]''' de $2 a las $3.",
-'filedelete-nofile' => "'''$1''' no existe.",
-'filedelete-nofile-old' => "No bi ha garra versión alzata de '''$1''' con os atributos especificatos.",
-'filedelete-otherreason' => 'Atras razons:',
-'filedelete-reason-otherlist' => 'Atra razón',
-'filedelete-reason-dropdown' => "*Razons comuns ta borrar fichers
+'filedelete' => 'Borrar $1',
+'filedelete-legend' => 'Borrar fichero',
+'filedelete-intro' => "Ye en momentos de borrar o fichero '''[[Media:$1|$1]]''' chunto con toda a suya historia.",
+'filedelete-intro-old' => "Ye en momentos de borrar a versión de '''[[Media:$1|$1]]''' de [$4 $3, $2].",
+'filedelete-comment' => 'Razón:',
+'filedelete-submit' => 'Borrar',
+'filedelete-success' => "S'ha borrato '''$1'''.",
+'filedelete-success-old' => "S'ha borrato a versión de '''[[Media:$1|$1]]''' de $2 a las $3.",
+'filedelete-nofile' => "'''$1''' no existe.",
+'filedelete-nofile-old' => "No bi ha garra versión alzata de '''$1''' con os atributos especificatos.",
+'filedelete-otherreason' => 'Atras razons:',
+'filedelete-reason-otherlist' => 'Atra razón',
+'filedelete-reason-dropdown' => "*Razons comuns ta borrar fichers
** Dreitos d'autor no respetatos
** Archivo duplicato",
-'filedelete-edit-reasonlist' => "Editar as razons d'o borrau",
-'filedelete-maintenance' => 'O borramiento y recuperación de fichers ye desactivau temporalment entre que dura o mantenimiento.',
+'filedelete-edit-reasonlist' => "Editar as razons d'o borrau",
+'filedelete-maintenance' => 'O borramiento y recuperación de fichers ye desactivau temporalment entre que dura o mantenimiento.',
+'filedelete-maintenance-title' => 'No se puet borrar o fichero',
# MIME search
'mimesearch' => 'Mirar por tipo MIME',
@@ -1795,6 +1843,8 @@ Cada ringlera contién o vinclo t'a primer y segunda reendreceras, y tamién o d
'wantedpages' => 'Pachinas requiestas',
'wantedpages-badtitle' => 'Títol no conforme en o conchunto de resultaus: $1',
'wantedfiles' => 'Fichers requiestos',
+'wantedfiletext-cat' => "Os fichers siguients s'emplegan en as pachinas pero no existen. Ye posible que s'amuestren fichers d'atros repostes externos encara que existan. Qualsiquer falso positivo d'ixa mena se <del>tachará</del>. Antiparte, as pachinas que fan referencia a fichers que no existen se listan en [[:$1]].",
+'wantedfiletext-nocat' => "Os fichers siguients s'emplegan en as pachinas pero no existen. Ye posible que s'amuestren fichers d'atros repostes externos encara que existan. Qualsiquer falso positivo d'ixa mena se <del>tachará</del>.",
'wantedtemplates' => 'Plantillas requiestas',
'mostlinked' => 'Pachinas más enlazadas',
'mostlinkedcategories' => 'Categorías más enlazadas',
@@ -1803,6 +1853,7 @@ Cada ringlera contién o vinclo t'a primer y segunda reendreceras, y tamién o d
'mostimages' => 'Fichers más emplegatos',
'mostrevisions' => 'Pachinas con más edicions',
'prefixindex' => 'Todas as pachinas con prefixo',
+'prefixindex-namespace' => 'Todas as pachinas con o prefixo (espacio de nombres $1)',
'shortpages' => 'Pachinas más curtas',
'longpages' => 'Pachinas más largas',
'deadendpages' => 'Pachinas sin salida',
@@ -1819,7 +1870,7 @@ Cada ringlera contién o vinclo t'a primer y segunda reendreceras, y tamién o d
'listusers-editsonly' => 'Amostrar nomás usuarios con edicions',
'listusers-creationsort' => 'Ordenato por calendata de creyación',
'usereditcount' => '$1 {{PLURAL:$1|edición|edicions}}',
-'usercreated' => 'Creyato o $1 a las $2',
+'usercreated' => '{{GENDER:$3|Creyato}} en $1 a las $2',
'newpages' => 'Pachinas nuevas',
'newpages-username' => "Nombre d'usuario",
'ancientpages' => 'Pachinas más viellas',
@@ -1912,12 +1963,8 @@ Protocolos suportados: <tt>$1</tt> (no los adhiba en a suya busca).',
'activeusers-noresult' => "No s'han trobato usuarios.",
# Special:Log/newusers
-'newuserlogpage' => 'Rechistro de nuevos usuarios',
-'newuserlogpagetext' => "Isto ye un rechistro de creyación d'usuarios.",
-'newuserlog-byemail' => 'Clau ninviata por correu electronico',
-'newuserlog-create-entry' => 'Nuevo usuario',
-'newuserlog-create2-entry' => "s'ha creyato a nueva cuenta $1",
-'newuserlog-autocreate-entry' => 'Cuenta creyata automaticament',
+'newuserlogpage' => 'Rechistro de nuevos usuarios',
+'newuserlogpagetext' => "Isto ye un rechistro de creyación d'usuarios.",
# Special:ListGroupRights
'listgrouprights' => "Dreitos d'a colla d'usuarios",
@@ -1945,7 +1992,7 @@ Protocolos suportados: <tt>$1</tt> (no los adhiba en a suya busca).',
'emailpagetext' => 'Puede fer servir o formulario que bi ye contino ta ninviar un correu electronico a iste usuario.
L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias d\'usuario]] amaneixerá en o campo "Remitent" ta que o destinatario pueda responder-le.',
'usermailererror' => "L'obchecto de correu retornó una error:",
-'defemailsubject' => 'Correu de {{SITENAME}}',
+'defemailsubject' => "Correu de {{SITENAME}} de l'usuario $1",
'usermaildisabled' => "S'ha desactivau o ninvío de correus electronicos a os usuarios",
'usermaildisabledtext' => 'En ista wiki no puet ninviar un correu-e a atros usuarios',
'noemailtitle' => 'No bi ha garra adreza de correu electronico',
@@ -1998,7 +2045,7 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
'watchmethod-list' => 'mirando edicions recients en as pachinas cosiratas',
'watchlistcontains' => 'A suya lista de seguimiento tiene $1 {{PLURAL:$1|pachina|pachinas}}.',
'iteminvalidname' => "Bi ha un problema con l'articlo '$1', o nombre no ye conforme...",
-'wlnote' => "Contino se i {{PLURAL:$1|amuestra o solo cambeo|amuestran os zaguers '''$1''' cambeos}} en {{PLURAL:$2|a zaguer hora|as zagueras '''$2''' horas}}.",
+'wlnote' => "Contino se i {{PLURAL:$1|amuestra o solo cambeo|amuestran os zaguers '''$1''' cambeos}} feitos en {{PLURAL:$2|a zaguer hora|as zagueras '''$2''' horas}}, o $3 a las $4.",
'wlshowlast' => 'Amostrar as zagueras $1 horas, $2 días u $3',
'watchlist-options' => "Opcions d'a lista de seguimiento",
@@ -2062,8 +2109,6 @@ Por favor, confirme que reyalment ye mirando de fer ixo, que entiende as conseqÃ
'actionfailed' => "L'acción ha feito fallita",
'deletedtext' => 'S\'ha borrau "$1".
Se veiga en $2 un rechistro d\'os borraus recients.',
-'deletedarticle' => 'ha borrato "[[$1]]"',
-'suppressedarticle' => 's\'ha supreso "[[$1]]"',
'dellogpage' => 'Rechistro de borraus',
'dellogpagetext' => "Contino se i amuestra una lista d'os borraus más recients.",
'deletionlog' => 'rechistro de borraus',
@@ -2108,7 +2153,10 @@ Se veiga a [[Special:ProtectedPages|lista de pachinas protechitas]] ta conoixer
'unprotectedarticle' => 'Ha desprotechito [[$1]]',
'movedarticleprotection' => 'camiatos os parametros de protección de "[[$2]]" a "[[$1]]"',
'protect-title' => 'Protechendo "$1"',
+'protect-title-notallowed' => 'Veyer o ran de protección de «$1»',
'prot_1movedto2' => '[[$1]] tresladada a [[$2]]',
+'protect-badnamespace-title' => 'Espacio de nombres no protechible',
+'protect-badnamespace-text' => "As pachinas d'iste espacio de nombres no se pueden protecher",
'protect-legend' => 'Confirmar protección',
'protectcomment' => 'Razón:',
'protectexpiry' => 'Calendata de circumducción:',
@@ -2127,6 +2175,7 @@ Contino se i amuestran as opcions actuals d'a pachina '''$1''':",
'protect-level-sysop' => 'Sólo almenistradors',
'protect-summary-cascade' => 'en cascada',
'protect-expiring' => 'caduca o $1 (UTC)',
+'protect-expiring-local' => 'circumduce o $1',
'protect-expiry-indefinite' => 'indefinito',
'protect-cascade' => 'Protección en cascada - protecher totas as pachinas incluyidas en ista.',
'protect-cantedit' => "No puet cambiar os livels de protección d'ista pachina, porque no tiene premiso ta editar-la.",
@@ -2182,7 +2231,6 @@ Si s'ha creyato una nueva pachina con o mesmo nombre dende que se borró a orich
'undeletereset' => 'Prencipiar',
'undeleteinvert' => 'Contornar selección',
'undeletecomment' => 'Razón:',
-'undeletedarticle' => 'ha restaurato "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|Una edición restaurata|$1 edicions restauratas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revisón|revisions}} y $2 {{PLURAL:$2|fichero|fichers}} restauratos',
'undeletedfiles' => '$1 {{PLURAL:$1|fichero restaurato|fichers restauratos}}',
@@ -2191,6 +2239,7 @@ Si s'ha creyato una nueva pachina con o mesmo nombre dende que se borró a orich
Consulte o [[Special:Log/delete|rechistro de borraus]] ta veyer una lista d'os zaguers borraus y restauracions.",
'undelete-header' => 'En o [[Special:Log/delete|rechistro de borraus]] se listan as pachina borratas fa poco tiempo.',
+'undelete-search-title' => 'Mirar pachinas borratas',
'undelete-search-box' => 'Mirar en as pachinas borratas',
'undelete-search-prefix' => 'Amostrar as pachinas que prencipien por:',
'undelete-search-submit' => 'Mirar',
@@ -2199,6 +2248,7 @@ Consulte o [[Special:Log/delete|rechistro de borraus]] ta veyer una lista d'os z
'undelete-bad-store-key' => "No se puede restaurar a versión d'o fichero con calendata $1: o fichero ya no se i trobaba antis d'o borrau.",
'undelete-cleanup-error' => 'Bi habió una error mientres se borraba o fichero "$1".',
'undelete-missing-filearchive' => "No ye posible restaurar o fichero con ID $1 porque no bi ye en a base de datos. Puede que ya s'aiga restaurato.",
+'undelete-error' => 'Error en restaurar a pachina',
'undelete-error-short' => 'Error mientres se restauraba o fichero: $1',
'undelete-error-long' => "S'han trobato errors mientres se borraban os fichers:
@@ -2321,6 +2371,7 @@ as pachinas que s'han vandalizato).",
'blocklist-userblocks' => 'Amagar bloqueyos de cuenta',
'blocklist-tempblocks' => 'Amagar bloqueyos temporals',
'blocklist-addressblocks' => "Amagar bloqueyos d'una sola adreza IP",
+'blocklist-rangeblocks' => 'Amagar bloqueyos de rango',
'blocklist-timestamp' => 'Marca de tiempo',
'blocklist-target' => 'Destín',
'blocklist-expiry' => 'Circumducción:',
@@ -2343,6 +2394,7 @@ as pachinas que s'han vandalizato).",
'unblocklink' => 'desbloqueyar',
'change-blocklink' => 'cambear bloqueyo',
'contribslink' => 'contrebucions',
+'emaillink' => 'ninviar correu electronico',
'autoblocker' => 'Ye bloqueyato automaticament porque a suya adreza IP l\'ha feito servir recientement "[[User:$1|$1]]". A razón data ta bloqueyar a "[[User:$1|$1]]" estió "$2".',
'blocklogpage' => 'Rechistro de bloqueyos',
'blocklog-showlog' => "Iste usuario ya ha estau bloqueyau.
@@ -2461,9 +2513,6 @@ En ixos casos, si lo deseya, habrá de tresladar u combinar manualment o conteni
'movepage-page-moved' => "S'ha tresladato a pachina $1 ta $2.",
'movepage-page-unmoved' => "No s'ha puesto tresladar a pachina $1 ta $2.",
'movepage-max-pages' => "S'han tresladato o masimo posible de $1 {{PLURAL:$1|pachina|pachinas}} y no se tresladarán más automaticament.",
-'1movedto2' => '[[$1]] tresladada a [[$2]]',
-'1movedto2_redir' => '[[$1]] tresladada a [[$2]] sobre una reendrecera',
-'move-redirect-suppressed' => 'reendrecera eliminata',
'movelogpage' => 'Rechistro de treslatos',
'movelogpagetext' => 'Contino se i amuestra una lista de pachinas tresladatas.',
'movesubpage' => '{{PLURAL:$1|Subpachina|Subpachinas}}',
@@ -2476,7 +2525,7 @@ En ixos casos, si lo deseya, habrá de tresladar u combinar manualment o conteni
A pachina de destino ("[[:$1]]") ya existe. Quiere borrar-la ta premitir o treslau?',
'delete_and_move_confirm' => 'Sí, borrar a pachina',
-'delete_and_move_reason' => 'Borrata ta premitir o treslau',
+'delete_and_move_reason' => 'Borrata ta permitir o treslau de "[[$1]]"',
'selfmove' => "Os títols d'orichen y destino son os mesmos. No se puede tresladar una pachina ta ella mesma.",
'immobile-source-namespace' => 'No puede tresladar pachinas en o espacio de nombres "$1"',
'immobile-target-namespace' => 'No puede tresladar pachinas enta o espacio de nombres "$1"',
@@ -2502,9 +2551,11 @@ A pachina de destino ("[[:$1]]") ya existe. Quiere borrar-la ta premitir o tresl
Ta exportar pachinas, escriba os títols en a caixa de texto que bi ha más ta baixo, metendo un títol en cada linia, y esliya si quiere exportar a versión actual con as versions anteriors y as linias de l'historial u nomás a versión actual con a información sobre a zaguer edición.
En iste zaguer caso tamién puede usar un vinclo, por eixemplo [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] t'a pachina \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Exportar todas as pachinas',
'exportcuronly' => "Incluyir nomás a versión actual, no pas l'historial de versions completo.",
'exportnohistory' => "----
'''Nota:''' A exportación de historials de pachinas a traviés d'iste formulario ye desactivata por problemas en o rendimiento d'o servidor.",
+'exportlistauthors' => 'Incluir una lista completa de colaboradors ta cada pachina',
'export-submit' => 'Exportar',
'export-addcattext' => 'Adhibir pachinas dende a categoría:',
'export-addcat' => 'Adhibir',
@@ -2537,6 +2588,8 @@ Vesite por favor [//www.mediawiki.org/wiki/Localisation a pachina sobre localiza
'thumbnail_error' => "S'ha producito una error en creyar a miniatura: $1",
'djvu_page_error' => "Pachina DjVu difuera d'o rango",
'djvu_no_xml' => "No s'ha puesto replegar o XML ta o fichero DjVu",
+'thumbnail-temp-create' => "No s'ha puesto creyar o fichero temporal d'a miniatura",
+'thumbnail-dest-create' => "No s'ha puesto alzar a miniatura",
'thumbnail_invalid_params' => "Os parametros d'as miniatura no son correctos",
'thumbnail_dest_directory' => "No s'ha puesto creyar o directorio de destino",
'thumbnail_image-type' => "Mena d'imachen no prevista",
@@ -2581,6 +2634,11 @@ Alce-lo en o suyo ordenador y cargue-lo aquí.",
'import-upload' => 'Datos XML cargatos',
'import-token-mismatch' => "S'han perdito os datos d'a sesión. Por favor, prebe unatra vegada.",
'import-invalid-interwiki' => 'No se puet importar dende o wiki especificato.',
+'import-error-edit' => 'A pachina "$1" no s\'ha importau porque vusté no tiene permisos ta editar-la.',
+'import-error-create' => 'A pachina "$1" no s\'ha importau porque vusté no tiene permisos ta creyar-la.',
+'import-error-interwiki' => 'A pachina "$1" no s\'ha importau porque o suyo nombre ye reservau ta vinclos externos (interwiki).',
+'import-error-special' => 'A pachina "$1" no s\'ha importau porque perteneix a un espacio de nombres especial que no permite pachinas.',
+'import-error-invalid' => 'A pachina "$1" no s\'ha importau porque o suyo nombre ye invalido.',
# Import log
'importlogpage' => "Rechistro d'importacions",
@@ -2590,73 +2648,86 @@ Alce-lo en o suyo ordenador y cargue-lo aquí.",
'import-logentry-interwiki' => 'Importata $1 entre wikis',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versión|versions}} dende $2',
+# JavaScriptTest
+'javascripttest' => 'Prebatinas de JavaScript',
+'javascripttest-disabled' => 'Ista función ye desactivata.',
+'javascripttest-title' => 'Fendo as prebas de $1',
+'javascripttest-pagetext-noframework' => 'Ista pachina ye reservada ta fer as prebas de JavaScrip.',
+'javascripttest-pagetext-unknownframework' => 'Bastida de prebas "$1" desconoixida.',
+'javascripttest-pagetext-frameworks' => "Por favor, trigue una d'as siguients bastidas de prebas: $1",
+'javascripttest-pagetext-skins' => 'Trigue una apariencia ta fer as prebas con ella:',
+'javascripttest-qunit-intro' => 'Mire-se [$1 a documentación de prebatinas] en mediawiki.org',
+'javascripttest-qunit-heading' => 'Suite de prebas MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => "A suya pachina d'usuario",
-'tooltip-pt-anonuserpage' => "A pachina d'usuario de l'adreza IP dende a que ye editando",
-'tooltip-pt-mytalk' => 'A suya pachina de descusión',
-'tooltip-pt-anontalk' => 'Descusión sobre edicions feitas dende ista adreza IP',
-'tooltip-pt-preferences' => 'As suyas preferencias',
-'tooltip-pt-watchlist' => 'A lista de pachinas que en ye cosirando os cambeos',
-'tooltip-pt-mycontris' => "Lista d'as suyas contrebucions",
-'tooltip-pt-login' => 'Le recomendamos que se rechistre, encara que no ye obligatorio',
-'tooltip-pt-anonlogin' => 'Li alentamos a rechistrar-se, anque no ye obligatorio',
-'tooltip-pt-logout' => 'Rematar a sesión',
-'tooltip-ca-talk' => "Descusión sobre l'articlo",
-'tooltip-ca-edit' => 'Puede editar ista pachina. Por favor, faiga servir o botón de visualización previa antes de grabar.',
-'tooltip-ca-addsection' => 'Encetar una nueva sección',
-'tooltip-ca-viewsource' => 'Ista pachina ye protechit.
+'tooltip-pt-userpage' => "A suya pachina d'usuario",
+'tooltip-pt-anonuserpage' => "A pachina d'usuario de l'adreza IP dende a que ye editando",
+'tooltip-pt-mytalk' => 'A suya pachina de descusión',
+'tooltip-pt-anontalk' => 'Descusión sobre edicions feitas dende ista adreza IP',
+'tooltip-pt-preferences' => 'As suyas preferencias',
+'tooltip-pt-watchlist' => 'A lista de pachinas que en ye cosirando os cambeos',
+'tooltip-pt-mycontris' => "Lista d'as suyas contrebucions",
+'tooltip-pt-login' => 'Le recomendamos que se rechistre, encara que no ye obligatorio',
+'tooltip-pt-anonlogin' => 'Li alentamos a rechistrar-se, anque no ye obligatorio',
+'tooltip-pt-logout' => 'Rematar a sesión',
+'tooltip-ca-talk' => "Descusión sobre l'articlo",
+'tooltip-ca-edit' => 'Puede editar ista pachina. Por favor, faiga servir o botón de visualización previa antes de grabar.',
+'tooltip-ca-addsection' => 'Encetar una nueva sección',
+'tooltip-ca-viewsource' => 'Ista pachina ye protechit.
Puede veyer-ne, manimenos, o codigo fuent.',
-'tooltip-ca-history' => "Versions anteriors d'ista pachina.",
-'tooltip-ca-protect' => 'Protecher ista pachina',
-'tooltip-ca-unprotect' => "Cambiar a protección d'ista pachina",
-'tooltip-ca-delete' => 'Borrar ista pachina',
-'tooltip-ca-undelete' => 'Restaurar as edicions feitas a ista pachina antis que no estase borrata',
-'tooltip-ca-move' => 'Tresladar (renombrar) ista pachina',
-'tooltip-ca-watch' => 'Adhibir ista pachina a la suya lista de seguimiento',
-'tooltip-ca-unwatch' => "Borrar ista pachina d'a suya lista de seguimiento",
-'tooltip-search' => 'Mirar en {{SITENAME}}',
-'tooltip-search-go' => "Ir t'a pachina con iste títol exacto, si existe",
-'tooltip-search-fulltext' => 'Mirar iste texto en as pachinas',
-'tooltip-p-logo' => 'Portalada',
-'tooltip-n-mainpage' => 'Vesitar a Portalada',
-'tooltip-n-mainpage-description' => 'Vesitar a pachina prencipal',
-'tooltip-n-portal' => 'Sobre o prochecto, que puede fer, aon trobar as cosas',
-'tooltip-n-currentevents' => 'Trobar información cheneral sobre escaicimientos actuals',
-'tooltip-n-recentchanges' => "A lista d'os zaguers cambeos en o wiki",
-'tooltip-n-randompage' => 'Cargar una pachina aleatoriament',
-'tooltip-n-help' => 'O puesto ta saber más.',
-'tooltip-t-whatlinkshere' => "Lista de todas as pachinas d'o wiki vinculatas con ista",
-'tooltip-t-recentchangeslinked' => 'Zaguers cambeos en as pachinas que tienen vinclos enta ista',
-'tooltip-feed-rss' => "Canal RSS d'ista pachina",
-'tooltip-feed-atom' => "Canal Atom d'ista pachina",
-'tooltip-t-contributions' => "Veyer a lista de contrebucions d'iste usuario",
-'tooltip-t-emailuser' => 'Ninviar un correu electronico ta iste usuario',
-'tooltip-t-upload' => 'Lista de todas as pachinas especials',
-'tooltip-t-specialpages' => 'Lista de todas as pachinas especials',
-'tooltip-t-print' => "Versión d'ista pachina ta imprentar",
-'tooltip-t-permalink' => "Vinclo permanent ta ista versión d'a pachina",
-'tooltip-ca-nstab-main' => 'Veyer a pachina',
-'tooltip-ca-nstab-user' => "Veyer a pachina d'usuario",
-'tooltip-ca-nstab-media' => "Veyer a pachina d'o elemento multimedia",
-'tooltip-ca-nstab-special' => 'Ista ye una pachina especial, y no puede editar-la',
-'tooltip-ca-nstab-project' => "Veyer a pachina d'o prochecto",
-'tooltip-ca-nstab-image' => "Veyer a pachina d'o fichero",
-'tooltip-ca-nstab-mediawiki' => 'Veyer o mensache de sistema',
-'tooltip-ca-nstab-template' => 'Veyer a plantilla',
-'tooltip-ca-nstab-help' => "Veyer a pachina d'aduya",
-'tooltip-ca-nstab-category' => "Veyer a pachina d'a categoría",
-'tooltip-minoredit' => 'Sinyalar ista edición como menor',
-'tooltip-save' => 'Alzar os cambeos',
-'tooltip-preview' => 'Revise os suyos cambeos, por favor, faiga servir isto antes de grabar!',
-'tooltip-diff' => 'Amuestra os cambeos que ha feito en o texto.',
-'tooltip-compareselectedversions' => "Veyer as esferencias entre as dos versions trigatas d'ista pachina.",
-'tooltip-watch' => 'Adhibir ista pachina a la suya lista de seguimiento',
-'tooltip-recreate' => 'Recreya una pachina mesmo si ya ha estato borrata dinantes',
-'tooltip-upload' => 'Prencipia a carga',
-'tooltip-rollback' => '"Revertir" revierte todas as zagueras edicions d\'un mesmo usuario en ista pachina nomás con un clic.',
-'tooltip-undo' => '"Desfer" revierte a edición trigata y ubre a pachina d\'edición en o modo de previsualización. Deixa escribir una razón en o resumen d\'edición.',
-'tooltip-preferences-save' => 'Alzar as preferencias',
-'tooltip-summary' => 'Escribir un breu resumen',
+'tooltip-ca-history' => "Versions anteriors d'ista pachina.",
+'tooltip-ca-protect' => 'Protecher ista pachina',
+'tooltip-ca-unprotect' => "Cambiar a protección d'ista pachina",
+'tooltip-ca-delete' => 'Borrar ista pachina',
+'tooltip-ca-undelete' => 'Restaurar as edicions feitas a ista pachina antis que no estase borrata',
+'tooltip-ca-move' => 'Tresladar (renombrar) ista pachina',
+'tooltip-ca-watch' => 'Adhibir ista pachina a la suya lista de seguimiento',
+'tooltip-ca-unwatch' => "Borrar ista pachina d'a suya lista de seguimiento",
+'tooltip-search' => 'Mirar en {{SITENAME}}',
+'tooltip-search-go' => "Ir t'a pachina con iste títol exacto, si existe",
+'tooltip-search-fulltext' => 'Mirar iste texto en as pachinas',
+'tooltip-p-logo' => 'Portalada',
+'tooltip-n-mainpage' => 'Vesitar a Portalada',
+'tooltip-n-mainpage-description' => 'Vesitar a pachina prencipal',
+'tooltip-n-portal' => 'Sobre o prochecto, que puede fer, aon trobar as cosas',
+'tooltip-n-currentevents' => 'Trobar información cheneral sobre escaicimientos actuals',
+'tooltip-n-recentchanges' => "A lista d'os zaguers cambeos en o wiki",
+'tooltip-n-randompage' => 'Cargar una pachina aleatoriament',
+'tooltip-n-help' => 'O puesto ta saber más.',
+'tooltip-t-whatlinkshere' => "Lista de todas as pachinas d'o wiki vinculatas con ista",
+'tooltip-t-recentchangeslinked' => 'Zaguers cambeos en as pachinas que tienen vinclos enta ista',
+'tooltip-feed-rss' => "Canal RSS d'ista pachina",
+'tooltip-feed-atom' => "Canal Atom d'ista pachina",
+'tooltip-t-contributions' => "Veyer a lista de contrebucions d'iste usuario",
+'tooltip-t-emailuser' => 'Ninviar un correu electronico ta iste usuario',
+'tooltip-t-upload' => 'Lista de todas as pachinas especials',
+'tooltip-t-specialpages' => 'Lista de todas as pachinas especials',
+'tooltip-t-print' => "Versión d'ista pachina ta imprentar",
+'tooltip-t-permalink' => "Vinclo permanent ta ista versión d'a pachina",
+'tooltip-ca-nstab-main' => 'Veyer a pachina',
+'tooltip-ca-nstab-user' => "Veyer a pachina d'usuario",
+'tooltip-ca-nstab-media' => "Veyer a pachina d'o elemento multimedia",
+'tooltip-ca-nstab-special' => 'Ista ye una pachina especial, y no puede editar-la',
+'tooltip-ca-nstab-project' => "Veyer a pachina d'o prochecto",
+'tooltip-ca-nstab-image' => "Veyer a pachina d'o fichero",
+'tooltip-ca-nstab-mediawiki' => 'Veyer o mensache de sistema',
+'tooltip-ca-nstab-template' => 'Veyer a plantilla',
+'tooltip-ca-nstab-help' => "Veyer a pachina d'aduya",
+'tooltip-ca-nstab-category' => "Veyer a pachina d'a categoría",
+'tooltip-minoredit' => 'Sinyalar ista edición como menor',
+'tooltip-save' => 'Alzar os cambeos',
+'tooltip-preview' => 'Revise os suyos cambeos, por favor, faiga servir isto antes de grabar!',
+'tooltip-diff' => 'Amuestra os cambeos que ha feito en o texto.',
+'tooltip-compareselectedversions' => "Veyer as esferencias entre as dos versions trigatas d'ista pachina.",
+'tooltip-watch' => 'Adhibir ista pachina a la suya lista de seguimiento',
+'tooltip-watchlistedit-normal-submit' => 'Borrar os titols',
+'tooltip-watchlistedit-raw-submit' => 'Esviellar a lista de seguimiento',
+'tooltip-recreate' => 'Recreya una pachina mesmo si ya ha estato borrata dinantes',
+'tooltip-upload' => 'Prencipia a carga',
+'tooltip-rollback' => '"Revertir" revierte todas as zagueras edicions d\'un mesmo usuario en ista pachina nomás con un clic.',
+'tooltip-undo' => '"Desfer" revierte a edición trigata y ubre a pachina d\'edición en o modo de previsualización. Deixa escribir una razón en o resumen d\'edición.',
+'tooltip-preferences-save' => 'Alzar as preferencias',
+'tooltip-summary' => 'Escribir un breu resumen',
# Stylesheets
'common.css' => '/* Os estilos CSS definius aquí aplicarán a todas as apariencias (skins) */',
@@ -2754,9 +2825,6 @@ Puede veyer-ne, manimenos, o codigo fuent.',
# Patrol log
'patrol-log-page' => 'Rechistro de control de revisions',
'patrol-log-header' => 'Iste ye un rechistro de revisions patrullatas.',
-'patrol-log-line' => "s'ha sinyalato a versión $1 de $2 como revisata $3",
-'patrol-log-auto' => '(automatico)',
-'patrol-log-diff' => 'versión $1',
'log-show-hide-patrol' => '$1 o rechistro de patrullache',
# Image deletion
@@ -2775,23 +2843,25 @@ $1',
'nextdiff' => "Ir t'a edición siguient →",
# Media information
-'mediawarning' => "'''Pare cuenta!''': Iste tipo de fichero puet contener codigo endino.
+'mediawarning' => "'''Pare cuenta!''': Iste tipo de fichero puet contener codigo endino.
En executar-lo, podría meter en un contornillo a seguridat d'o suyo sistema.",
-'imagemaxsize' => "Limite de grandaria d'as imáchens:<br />''(ta pachinas de descripción de fichers)''",
-'thumbsize' => "Midas d'a miniatura:",
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pachina|pachinas}}',
-'file-info' => "grandaria d'o fichero: $1; tipo MIME: $2",
-'file-info-size' => "$1 × $2 píxels; grandaria d'o fichero: $3; tipo MIME: $4",
-'file-info-size-pages' => "$1 × $2 pixels, grandaria d'o fichero: $3, tipo MIME: $4, $5 {{PLURAL:$5|pachina|pachinas}}",
-'file-nohires' => '<small>No bi ha garra versión con resolución más gran.</small>',
-'svg-long-desc' => 'fichero SVG, nominalment $1 × $2 píxels, grandaria: $3',
-'show-big-image' => 'Imachen en a maxima resolución',
-'show-big-image-size' => '$1 × $2 pixels',
-'file-info-gif-looped' => 'embuclau',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|imachen|imáchens}}',
-'file-info-png-looped' => 'embuclau',
-'file-info-png-repeat' => 'reproducito $1 {{PLURAL:$1|vegada|vegadas}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|imáchens|imáchens}}',
+'imagemaxsize' => "Limite de grandaria d'as imáchens:<br />''(ta pachinas de descripción de fichers)''",
+'thumbsize' => "Midas d'a miniatura:",
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pachina|pachinas}}',
+'file-info' => "grandaria d'o fichero: $1; tipo MIME: $2",
+'file-info-size' => "$1 × $2 píxels; grandaria d'o fichero: $3; tipo MIME: $4",
+'file-info-size-pages' => "$1 × $2 pixels, grandaria d'o fichero: $3, tipo MIME: $4, $5 {{PLURAL:$5|pachina|pachinas}}",
+'file-nohires' => 'No bi ha garra versión con resolución más gran.',
+'svg-long-desc' => 'fichero SVG, nominalment $1 × $2 píxels, grandaria: $3',
+'show-big-image' => 'Imachen en a maxima resolución',
+'show-big-image-preview' => "Grandaria d'ista previsualización: $1.",
+'show-big-image-other' => '{{PLURAL:$2|Unatra resolución|Atras resolucions}}: $1.',
+'show-big-image-size' => '$1 × $2 pixels',
+'file-info-gif-looped' => 'embuclau',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|imachen|imáchens}}',
+'file-info-png-looped' => 'embuclau',
+'file-info-png-repeat' => 'reproducito $1 {{PLURAL:$1|vegada|vegadas}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|imáchens|imáchens}}',
# Special:NewFiles
'newimages' => 'Galería de nuevas imachens',
@@ -2805,6 +2875,13 @@ En executar-lo, podría meter en un contornillo a seguridat d'o suyo sistema.",
'bydate' => 'por a calendata',
'sp-newimages-showfrom' => "Amostrar fichers nuevos dende as $2 d'o $1",
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|un segundo|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
+'days' => '{{PLURAL:$1|un día|$1 días}}',
+'ago' => 'fa $1',
+
# Bad image list
'bad_image_list' => "O formato ha d'estar o siguient:
@@ -3292,13 +3369,6 @@ Iste codigo de confirmación circumducirá o $4.",
'scarytranscludefailed' => "[Ha fallato a recuperación d'a plantilla ta $1]",
'scarytranscludetoolong' => '[O URL ye masiau largo]',
-# Trackbacks
-'trackbackbox' => 'Retrovinclos (trackbacks) ta ista pachina:<br />
-$1',
-'trackbackremove' => '([$1 Borrar])',
-'trackbacklink' => 'Retrovinclo (Trackback)',
-'trackbackdeleteok' => "O retrovinclo (trackback) s'ha borrato correctament.",
-
# Delete conflict
'deletedwhileediting' => "Pare cuenta: Ista pachina s'ha borrato dimpués de que vusté prencipiase a editar!",
'confirmrecreate' => "L'usuario [[User:$1|$1]] ([[User talk:$1|descusión]]) ha borrato iste articlo dimpués que vusté prencipase a editar-lo, y ha dato a siguient razón:
@@ -3382,6 +3452,9 @@ Tamién puede fer servir o [[Special:EditWatchlist|editor estándar]].",
'watchlisttools-edit' => 'Veyer y editar a lista de seguimiento',
'watchlisttools-raw' => 'Editar a lista de seguimiento en formato texto',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discusión]])',
+
# Core parser functions
'unknown_extension_tag' => 'Etiqueta d\'estensión "$1" esconoixita',
'duplicate-defaultsort' => "Pare cuenta: A clau d'ordenación por defecto «$2» anula l'anterior clau d'ordenación por defecto «$1».",
@@ -3479,13 +3552,16 @@ As imachens s'amuestran en resolución completa, a resta de fichers fan encetar
'tags-hitcount' => '$1 {{PLURAL:$1|cambeo|cambeos}}',
# Special:ComparePages
-'comparepages' => 'Contimparar pachinas',
-'compare-selector' => "Contimparar as versions d'as pachinas",
-'compare-page1' => 'Pachina 1',
-'compare-page2' => 'Pachina 2',
-'compare-rev1' => 'Versión 1',
-'compare-rev2' => 'Versión 2',
-'compare-submit' => 'Contimparar',
+'comparepages' => 'Contimparar pachinas',
+'compare-selector' => "Contimparar as versions d'as pachinas",
+'compare-page1' => 'Pachina 1',
+'compare-page2' => 'Pachina 2',
+'compare-rev1' => 'Versión 1',
+'compare-rev2' => 'Versión 2',
+'compare-submit' => 'Contimparar',
+'compare-invalid-title' => 'O titol especificau ye invalido.',
+'compare-title-not-exists' => 'O titol especificau no existe.',
+'compare-revision-not-exists' => 'A revisión especificada no existe.',
# Database error messages
'dberr-header' => 'Iste wiki tiene un problema',
@@ -3512,4 +3588,91 @@ As imachens s'amuestran en resolución completa, a resta de fichers fan encetar
'sqlite-has-fts' => '$1, con soporte de busca de texto integro',
'sqlite-no-fts' => '$1, sin soporte de busca de texto integro',
+# New logging system
+'logentry-delete-delete' => '$1 borró a pachina $3',
+'logentry-delete-restore' => '$1 restauró a pachina $3',
+'logentry-delete-event' => "$1 modificó a visibilidat de {{PLURAL:$5|un evento d'o rechistro|$5 eventos d'o rechistro}} en $3: $4",
+'logentry-delete-revision' => '$1 modificó a visibilidat de {{PLURAL:$5|una edición|$5 edicions}} en a pachina $3: $4',
+'logentry-delete-event-legacy' => "$1 modificó a visibilidat d'os eventos d'o rechistro en $3",
+'logentry-delete-revision-legacy' => "$1 modificó a visibilidat d'as edicions en a pachina $3",
+'logentry-suppress-delete' => '$1 borró a pachina $3',
+'logentry-suppress-event' => "$1 modificó secretament a visibilidat de {{PLURAL:$5|un evento d'o rechistro|$5 eventos d'o rechistro}} en $3: $4",
+'logentry-suppress-revision' => '$1 modificó secretament a visibilidat de {{PLURAL:$5|una edición|$5 edicions}} en a pachina $3: $4',
+'logentry-suppress-event-legacy' => "$1 modificó secretament a visibilidat d'os eventos d'o rechistro en $3",
+'logentry-suppress-revision-legacy' => "$1 modificó secretament a visibilidat d'as edicions en a pachina $3",
+'revdelete-content-hid' => 'conteniu amagau',
+'revdelete-summary-hid' => "resumen d'edición amagau",
+'revdelete-uname-hid' => "nombre d'usuario amagau",
+'revdelete-content-unhid' => 'conteniu amostrau',
+'revdelete-summary-unhid' => "resumen d'edición amostrau",
+'revdelete-uname-unhid' => "nombre d'usuario amostrau",
+'revdelete-restricted' => "S'han aplicato as restriccions ta administradors",
+'revdelete-unrestricted' => "S'han borrato as restriccions ta administradors",
+'logentry-move-move' => '$1 tresladó a pachina $3 ta $4',
+'logentry-move-move-noredirect' => '$1 tresladó a pachina $3 ta $4 sin deixar una reendrecera',
+'logentry-move-move_redir' => '$1 movió a pachina $3 ta $4 sobre una reendrecera',
+'logentry-move-move_redir-noredirect' => '$1 tresladó a pachina $3 ta $4 sobre una reendrecera, sin deixar una reendrecera',
+'logentry-patrol-patrol' => "$1 marcó a edición $4 d'a pachina $3 como patrullada",
+'logentry-patrol-patrol-auto' => "$1 marcó automaticament a edición $4 d'a pachina $3 como patrullada",
+'logentry-newusers-newusers' => "$1 creyó una cuenta d'usuario",
+'logentry-newusers-create' => "$1 creyó una cuenta d'usuario",
+'logentry-newusers-create2' => "$1 creyó una cuenta d'usuario $3",
+'logentry-newusers-autocreate' => "S'ha creyau automaticament a cuenta $1",
+'newuserlog-byemail' => 'Clau ninviata por correu electronico',
+
+# Feedback
+'feedback-bugornote' => "Si creye que puede describir en detalle un problema tecnico, [$1 informe d'un bug] por favor.
+
+Si no, puet usar o siguient formulario. O suyo comentario será adhibiu a la pachina [$3 $2], de conchunta con o suyo nombre d'usuario y o navegador que fa servir.",
+'feedback-subject' => 'Afer:',
+'feedback-message' => 'Mensache:',
+'feedback-cancel' => 'Cancelar',
+'feedback-submit' => 'Ninviar comentarios',
+'feedback-adding' => 'Adhibindo comentarios ta la pachina...',
+'feedback-error1' => "Error: No se reconoixe o resultau de l'API",
+'feedback-error2' => 'Error: Ha fallato a edición',
+'feedback-error3' => "Error: No i hai respuesta de l'API",
+'feedback-thanks' => "Gracias! O suyo comentario s'ha publicau en a pachina [$2 $1].",
+'feedback-close' => 'Feito',
+'feedback-bugcheck' => 'Perfecto! Comprebe nomás que no sía un [$1 fallo conoixiu].',
+'feedback-bugnew' => "L'he comprebau. Informar d'un nuevo fallo.",
+
+# API errors
+'api-error-badaccess-groups' => 'No puetz cargar fichers en iste wiki.',
+'api-error-badtoken' => 'Error interna: Simbolo incorrecto.',
+'api-error-copyuploaddisabled' => 'A puyada por URL ye desactivada en iste servidor.',
+'api-error-duplicate' => 'Ya existe{{PLURAL:$1| [$2 unatro fichero]|[$2 belatros fichers]}} en o puesto con o mesmo conteniu.',
+'api-error-duplicate-archive' => 'Ya {{PLURAL:$1|existiba [$2 unatro fichero]|existiban [$2 atros fichers]}} en o puesto con o mesmo conteniu, pero {{PLURAL:$1|estió|estioron}} {{PLURAL:$1|eliminau|eliminaus}}.',
+'api-error-duplicate-archive-popup-title' => "{{PLURAL:$1|Fichero|Fichers}} {{PLURAL:$1|duplicau|duplicaus}} que ya s'han eliminau",
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Fichero|Fichers}} {{PLURAL:$1|duplicau|duplicaus}}',
+'api-error-empty-file' => 'O fichero que ninvió yera vuedo.',
+'api-error-emptypage' => 'No se permite a creyación de pachinas nuevas en blanco.',
+'api-error-fetchfileerror' => "Error interna: Bella cosa salió malament mientres s'obteneba o fichero.",
+'api-error-file-too-large' => 'O fichero que ninvió yera masiau gran.',
+'api-error-filename-tooshort' => 'O nombre de fichero ye masiau corto.',
+'api-error-filetype-banned' => 'Iste tipo de fichero ye vedau.',
+'api-error-filetype-missing' => 'O fichero no tiene extensión de fichero.',
+'api-error-hookaborted' => "A modificación que intentés fer estió cancelada por un gancho d'extensión.",
+'api-error-http' => 'Error interna: No se puede connectar ta o servidor.',
+'api-error-illegal-filename' => 'O nombre de fichero no ye permitiu.',
+'api-error-internal-error' => 'Error interna: Bella cosa salió malament en procesar a tuya carga en o wiki.',
+'api-error-invalid-file-key' => "Error interna: No se trobó o fichero en l'almagazenamiento temporal.",
+'api-error-missingparam' => 'Error interna: Faltan parametros en a demanda.',
+'api-error-missingresult' => 'Error interna: No se podió determinar si la copia estió correcta.',
+'api-error-mustbeloggedin' => "Ha d'encetar una sesión ta cargar fichers.",
+'api-error-mustbeposted' => 'Error interna: a suya demanda requiere HTTP POST.',
+'api-error-noimageinfo' => 'La carga se realizó correctament, pero o servidor no nos dio garra información sobre o fichero.',
+'api-error-nomodule' => 'Error interna: No i hai garra modulo de carga configurau.',
+'api-error-ok-but-empty' => "Error interna: No i hai garra respuesta d'o servidor.",
+'api-error-overwrite' => 'No se premite de sobrescribir un fichero existent.',
+'api-error-stashfailed' => 'Error interna: O servidor no podió almagazenar o fichero temporal.',
+'api-error-timeout' => 'O servidor no respondió en o plazo previsto.',
+'api-error-unclassified' => 'Ocurrió una error desconoixida.',
+'api-error-unknown-code' => 'Error desconoixida: «$1»',
+'api-error-unknown-error' => 'Error interna: Bella cosa salió malament en intentar cargar o fichero.',
+'api-error-unknown-warning' => 'Alvertencia desconoixida: $1',
+'api-error-unknownerror' => 'Error desconoixida: «$1».',
+'api-error-uploaddisabled' => 'As cargas de fichers son desactivadas en iste wiki.',
+'api-error-verification-error' => 'Iste fichero puede estar danyau, u tiene una extensión incorrecta.',
+
);
diff --git a/languages/messages/MessagesAng.php b/languages/messages/MessagesAng.php
index f908bab5..e478822f 100644
--- a/languages/messages/MessagesAng.php
+++ b/languages/messages/MessagesAng.php
@@ -444,7 +444,6 @@ ScÄ“awa þīne wrÄ«tunge eft, oþþe brÅ«c Ã¾Ä cartan þe is hÄ“runder tÅ [[Sp
'showdiff' => 'Hƿearfas sēon',
'summary-preview' => 'Scortnesse forescēaƿe:',
'blockednoreason' => 'nÄnu racu Èiefen',
-'whitelistedittitle' => 'Inmeldunge behÅfed to Ädihtenne',
'whitelistedittext' => 'Þū scealt $1 to Ädihtenne sÄ«dan.',
'nosuchsectiontitle' => 'Ne mÃ¦È dÇ£l findan',
'loginreqtitle' => 'Inmeldung Äbeden',
@@ -528,9 +527,6 @@ folcliÄ‹um Ägnunge oþþe ÈelÄ«Ä‹um frÄ“om horde (sÄ“o $1 for Äscungum).
'revdelete-radio-unset' => 'NÄ',
'revdel-restore' => 'scēaƿnesse hƿeorfan',
'pagehist' => 'Sīdan stǣr',
-'revdelete-content' => 'innoþ',
-'revdelete-summary' => 'Ädihtscortnes',
-'revdelete-uname' => 'brūcendnama',
'revdelete-reasonotherlist' => 'Ōðru racu',
# History merging
@@ -848,8 +844,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'activeusers' => 'HÆ¿ata brÅ«cenda Èetalu',
# Special:Log/newusers
-'newuserlogpage' => 'BrÅ«cenda Èesceaft Èetalu',
-'newuserlog-create-entry' => 'Nīƿe brūcend',
+'newuserlogpage' => 'BrÅ«cenda Èesceaft Èetalu',
# Special:ListGroupRights
'listgrouprights-group' => 'Clīeƿen',
@@ -903,7 +898,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'exblank' => 'tramet wæs ǣmtig',
'historywarning' => 'Warnung: Se tramet, þone þu Äfeorsian teohhast, hæfþ stÇ£re:',
'actioncomplete' => 'Ç·eorcdÇ£d fuldÅn',
-'deletedarticle' => 'Äfeorsode "[[$1]]"',
'dellogpage' => 'Ä€feorsunge Æ¿Ä«sbÅc',
'deletionlog' => 'Äfeorsunge wisbÅc',
'deletecomment' => 'Racu:',
@@ -955,7 +949,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'undeletebtn' => 'Edstaðola!',
'undeletelink' => 'sēon/nīƿian',
'undeleteviewlink' => 'sēon',
-'undeletedarticle' => 'edstaðolod "[[$1]]"',
'undelete-search-submit' => 'SÄ“Ä‹an',
# Namespace form on various pages
@@ -1021,22 +1014,20 @@ Also see [[Special:WantedCategories|wanted categories]].',
'proxyblocksuccess' => 'ÈœedÅn.',
# Move page
-'movearticle' => 'SÄ«dan Èeferan:',
-'newtitle' => 'To nīƿum name:',
-'move-watch' => 'Frumasīdan and endesīdan ƿæccan',
-'movepagebtn' => 'SÄ«dan Èeferan',
-'pagemovedsub' => 'ÈœefÅr spÄ“dde',
-'movepage-moved' => '\'\'\'"$1" ƿæs to "$2"\'\'\' Èefered',
-'articleexists' => 'Tramet on þǣm naman ǣr stendeþ, oþþe þone
+'movearticle' => 'SÄ«dan Èeferan:',
+'newtitle' => 'To nīƿum name:',
+'move-watch' => 'Frumasīdan and endesīdan ƿæccan',
+'movepagebtn' => 'SÄ«dan Èeferan',
+'pagemovedsub' => 'ÈœefÅr spÄ“dde',
+'movepage-moved' => '\'\'\'"$1" ƿæs to "$2"\'\'\' Èefered',
+'articleexists' => 'Tramet on þǣm naman ǣr stendeþ, oþþe þone
naman þu cēas nis andfenge.
Bidde cÄ“os Åðerne naman.',
-'movedto' => 'Èefered to',
-'movetalk' => 'Èœesibbed ÈespreÄ‹sÄ«dan Èeferan',
-'1movedto2' => '[[$1]] Èefered to [[$2]]',
-'1movedto2_redir' => '[[$1]] Èefered to [[$2]] ofer edlÇ£dunge',
-'movelogpage' => 'Èœeferan ealdhord',
-'movereason' => 'Racu:',
-'revertmove' => 'UndÅn',
+'movedto' => 'Èefered to',
+'movetalk' => 'Èœesibbed ÈespreÄ‹sÄ«dan Èeferan',
+'movelogpage' => 'Èœeferan ealdhord',
+'movereason' => 'Racu:',
+'revertmove' => 'UndÅn',
# Export
'export' => 'SÄ«dan Å«tsendan',
@@ -1127,10 +1118,6 @@ Bidde cÄ“os Åðerne naman.',
'others' => 'Åðru',
'anonusers' => '{{SITENAME}} {{PLURAL:$2|uncūþ brūcend|uncūðe brūcendas}} $1',
-# Patrol log
-'patrol-log-auto' => '(selffremmende)',
-'patrol-log-diff' => 'nīƿung $1',
-
# Browsing diffs
'previousdiff' => '↠Ieldra Ädiht',
'nextdiff' => 'NÄ«Æ¿ra Ädiht',
@@ -1139,7 +1126,7 @@ Bidde cÄ“os Åðerne naman.',
'imagemaxsize' => 'Settan biliðu on biliþgemearcungtrametum tÅ:',
'thumbsize' => 'Þumannæglmicelnes:',
'file-info-size' => '$1 × $2 pixels, fīlmiċelu: $3, MIMEcynn: $4',
-'file-nohires' => '<small>Þǣr nis nÇ£niÈ mÄ miÄ‹elu.</small>',
+'file-nohires' => 'Þǣr nis nÇ£niÈ mÄ miÄ‹elu.',
'svg-long-desc' => 'SVG fīl, rihte $1 × $2 pixels, fīlmiċelu: $3',
'show-big-image' => 'Fulmiċelu',
diff --git a/languages/messages/MessagesAnp.php b/languages/messages/MessagesAnp.php
index 11a4dbb4..28f6ad46 100644
--- a/languages/messages/MessagesAnp.php
+++ b/languages/messages/MessagesAnp.php
@@ -411,8 +411,7 @@ Hindi (hi)फ़िलहाल इस पनà¥à¤¨à¥‡ पर कोई साà¤
'linksearch' => 'बाहरी कड़ी',
# Special:Log/newusers
-'newuserlogpage' => 'नया सदसà¥à¤¯à¥Š के सूची',
-'newuserlog-create-entry' => 'नवीन सदसà¥à¤¯',
+'newuserlogpage' => 'नया सदसà¥à¤¯à¥Š के सूची',
# Special:ListGroupRights
'listgrouprights-members' => '(सदसà¥à¤¯ सूची)',
@@ -447,8 +446,6 @@ Hindi (hi)फ़िलहाल इस पनà¥à¤¨à¥‡ पर कोई साà¤
'actionfailed' => 'कà¥à¤°à¤¿à¤¯à¤¾ विफल',
'deletedtext' => '"$1" कॆ हटैलॊ गेलॊ छै.
हाल में हटैलॊ गेलॊ लेखॊ के सूची लेली $2 देखॊ.',
-'deletedarticle' => '"[[$1]]" कॆ हटैलॊ गेलॊ छै.',
-'suppressedarticle' => 'दबैलॊ "[[$1]]"',
'dellogpage' => 'हटाबै के सूची',
'dellogpagetext' => 'नीचॆ हाल मॆं हटैलॊ गेलॊ पनà¥à¤¨à¤¾ के सूची छै.',
'deletionlog' => 'हटाबै के सूची',
@@ -534,7 +531,6 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
'undeletepagetitle' => "'''नीचे [[:$1]] केरॊ हटैलॊ गेलॊ अवतरण भी दरà¥à¤¶à¥ˆà¤²à¥Š गेलॊ छै.'''",
'viewdeletedpage' => 'हटैलॊ पनà¥à¤¨à¤¾ वापस लानॊ',
'undeletelink' => 'देखॊ/पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करॊ',
-'undeletedarticle' => '"[[$1]]" पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करलॊ गेलै',
# Namespace form on various pages
'namespace' => 'नामसà¥à¤¥à¤¾à¤¨:',
@@ -619,8 +615,6 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
कृपया à¤à¤•à¤°à¤¾ सà¥à¤µà¤¯à¤‚ बदली दहॊ'''",
'movedto' => ' सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करलॊ गेलै',
'movetalk' => 'संबंधित वारà¥à¤¤à¤¾ पृषà¥à¤  भी बदलॊ',
-'1movedto2' => '[[$1]] सॆ[[$2]] पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करलॊ गेलै',
-'1movedto2_redir' => '[[$1]] इ लेख के नाम बदली कॆ [[$2]] करी देलॊ गेलॊ छै (अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤)',
'movelogpage' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण सूची',
'movereason' => 'कारण:',
'revertmove' => 'पà¥à¤°à¤¾à¤¨à¥Š अवतरण पर लॆ चलॊ (रिवरà¥à¤Ÿ)',
@@ -692,7 +686,7 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
# Media information
'file-info-size' => '$1 × $2 चितà¥à¤°à¤¤à¤¤à¥à¤µ, संचिका के आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4',
-'file-nohires' => '<small>सॆं जà¥à¤¯à¤¾à¤¦à¤¾ रिज़ोलà¥à¤¯à¥‚शन उपलबà¥à¤§ नै छै.</small>',
+'file-nohires' => 'सॆं जà¥à¤¯à¤¾à¤¦à¤¾ रिज़ोलà¥à¤¯à¥‚शन उपलबà¥à¤§ नै छै.',
'svg-long-desc' => 'SVG फ़ाईल, साधारणत: $1 × $2 पीकà¥à¤¸à¥‡à¤²à¥à¤¸, फ़ाईल केरॊ आकार: $3',
'show-big-image' => 'संपूरà¥à¤£ रिजोलà¥à¤¯à¥‚शन',
diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php
index b507f453..d92317ff 100644
--- a/languages/messages/MessagesAr.php
+++ b/languages/messages/MessagesAr.php
@@ -10,7 +10,9 @@
* @author ;Hiba;1
* @author Abanima
* @author AhmadSherif
+ * @author Aiman titi
* @author Alexknight12
+ * @author Ali1
* @author Alnokta
* @author Antime
* @author Bassem JARKAS
@@ -45,14 +47,17 @@
* @author Tarawneh
* @author TheEgyptian
* @author Uwe a
+ * @author Zack wadghiri
* @author Zanatos
* @author ترجمان05
* @author خالد حسني
+ * @author روخو
* @author زكريا
* @author عصام بايزيدي
* @author عمرو
* @author محمد الجداوي
* @author نصوح
+ * @author وهراني
*/
$linkPrefixExtension = true;
@@ -179,154 +184,158 @@ $namespaceGenderAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#تحويل', '#REDIRECT' ),
- 'notoc' => array( '0', '__لاÙهرس__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__لامعرض__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__لصق_Ùهرس__', '__FORCETOC__' ),
- 'toc' => array( '0', '__Ùهرس__', '__TOC__' ),
- 'noeditsection' => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__لاعنوان__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'شهر_حالي', 'شهر_حالي2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'يوم_حالي', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'يوم_حالي2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'عام_حالي', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'وقت_حالي', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'شهر_محلي', 'شهر_محلي2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'شهر_محلي1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'اسم_الشهر_المحلي', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'اسم_الشهر_المحلي_المولد', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'اختصار_الشهر_المحلي', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'يوم_محلي', 'LOCALDAY' ),
- 'localday2' => array( '1', 'يوم_محلي2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'اسم_اليوم_المحلي', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'عام_محلي', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'وقت_محلي', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'عدد_الصÙحات', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'عدد_الملÙات', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'اسم_الصÙحة', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'عنوان_الصÙحة', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'نطاق', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'اسم_الصÙحة_الكامل', 'اسم_صÙحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'عنوان_الصÙحة_الكامل', 'عنوان_صÙحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'اسم_الصÙحة_الÙرعي', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'عنوان_الصÙحة_الÙرعي', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'اسم_الصÙحة_الأساسي', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'عنوان_الصÙحة_الأساسي', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'اسم_صÙحة_النقاش', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'عنوان_صÙحة_النقاش', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'اسم_صÙحة_الموضوع', 'اسم_صÙحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'عنوان_صÙحة_الموضوع', 'عنوان_صÙحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'رسالة:', 'MSG:' ),
- 'subst' => array( '0', 'نسخ:', 'SUBST:' ),
- 'safesubst' => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'تصغير', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'يمين', 'right' ),
- 'img_left' => array( '1', 'يسار', 'left' ),
- 'img_none' => array( '1', 'بدون', 'بلا', 'none' ),
- 'img_width' => array( '1', '$1بك', '$1عن', '$1px' ),
- 'img_center' => array( '1', 'مركز', 'center', 'centre' ),
- 'img_framed' => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'لاإطار', 'frameless' ),
- 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'حدود', 'border' ),
- 'img_baseline' => array( '1', 'خط_أساسي', 'baseline' ),
- 'img_sub' => array( '1', 'Ùرعي', 'sub' ),
- 'img_super' => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
- 'img_top' => array( '1', 'أعلى', 'top' ),
- 'img_text_top' => array( '1', 'نص_أعلى', 'text-top' ),
- 'img_middle' => array( '1', 'وسط', 'middle' ),
- 'img_bottom' => array( '1', 'أسÙÙ„', 'bottom' ),
- 'img_text_bottom' => array( '1', 'نص_أسÙÙ„', 'text-bottom' ),
- 'img_link' => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'بديل=$1', 'alt=$1' ),
- 'int' => array( '0', 'محتوى:', 'INT:' ),
- 'sitename' => array( '1', 'اسم_الموقع', 'SITENAME' ),
- 'ns' => array( '0', 'نط:', 'NS:' ),
- 'nse' => array( '0', 'نطم:', 'NSE:' ),
- 'localurl' => array( '0', 'مسار_محلي:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'مسار_المقالة', 'ARTICLEPATH' ),
- 'server' => array( '0', 'خادم', 'SERVER' ),
- 'servername' => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
- 'grammar' => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'نوع:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'أسبوع_حالي', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'يوم_حالي_مأ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'أسبوع_محلي', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'يوم_محلي_مأ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
- 'revisionday' => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
- 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'عنوان_كامل:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'مسار_كامل:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
- 'lc' => array( '0', 'صغير:', 'LC:' ),
- 'uc' => array( '0', 'كبير:', 'UC:' ),
- 'raw' => array( '0', 'خام:', 'RAW:' ),
- 'displaytitle' => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'أر', 'آر', 'R' ),
- 'newsectionlink' => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'كود_المسار:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#لغة:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'صÙحات_ÙÙŠ_نطاق:', 'صÙحات_ÙÙŠ_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
- 'padleft' => array( '0', 'باد_يسار', 'PADLEFT' ),
- 'padright' => array( '0', 'باد_يمين', 'PADRIGHT' ),
- 'special' => array( '0', 'خاص', 'special' ),
- 'defaultsort' => array( '1', 'ترتيب_اÙتراضي:', 'Ù…Ùتاح_ترتيب_اÙتراضي:', 'ترتيب_تصنيÙ_اÙتراضي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'مسار_الملÙ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'وسم', 'tag' ),
- 'hiddencat' => array( '1', '__تصنيÙ_مخÙÙŠ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'صÙحات_ÙÙŠ_التصنيÙ', 'صÙحات_ÙÙŠ_تصنيÙ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'حجم_الصÙحة', 'PAGESIZE' ),
- 'index' => array( '1', '__Ùهرسة__', '__INDEX__' ),
- 'noindex' => array( '1', '__لاÙهرسة__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'عدد_ÙÙŠ_المجموعة', 'عدد_ÙÙŠ_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'مسار', 'PATH' ),
- 'url_wiki' => array( '0', 'ويكي', 'WIKI' ),
- 'url_query' => array( '0', 'استعلام', 'QUERY' ),
+ 'redirect' => array( '0', '#تحويل', '#REDIRECT' ),
+ 'notoc' => array( '0', '__لاÙهرس__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__لامعرض__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__لصق_Ùهرس__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__Ùهرس__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__لاعنوان__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'شهر_حالي', 'شهر_حالي2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'يوم_حالي', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'يوم_حالي2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'عام_حالي', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'وقت_حالي', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'شهر_محلي', 'شهر_محلي2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'شهر_محلي1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'اسم_الشهر_المحلي', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'اسم_الشهر_المحلي_المولد', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'اختصار_الشهر_المحلي', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'يوم_محلي', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'يوم_محلي2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'اسم_اليوم_المحلي', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'عام_محلي', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'وقت_محلي', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'عدد_الصÙحات', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'عدد_الملÙات', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'اسم_الصÙحة', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'عنوان_الصÙحة', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'نطاق', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'اسم_الصÙحة_الكامل', 'اسم_صÙحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'عنوان_الصÙحة_الكامل', 'عنوان_صÙحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'اسم_الصÙحة_الÙرعي', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'عنوان_الصÙحة_الÙرعي', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'اسم_الصÙحة_الأساسي', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'عنوان_الصÙحة_الأساسي', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'اسم_صÙحة_النقاش', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'عنوان_صÙحة_النقاش', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'اسم_صÙحة_الموضوع', 'اسم_صÙحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'عنوان_صÙحة_الموضوع', 'عنوان_صÙحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'رسالة:', 'MSG:' ),
+ 'subst' => array( '0', 'نسخ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'تصغير', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'يمين', 'right' ),
+ 'img_left' => array( '1', 'يسار', 'left' ),
+ 'img_none' => array( '1', 'بدون', 'بلا', 'none' ),
+ 'img_width' => array( '1', '$1بك', '$1عن', '$1px' ),
+ 'img_center' => array( '1', 'مركز', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'لاإطار', 'frameless' ),
+ 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'حدود', 'border' ),
+ 'img_baseline' => array( '1', 'خط_أساسي', 'baseline' ),
+ 'img_sub' => array( '1', 'Ùرعي', 'sub' ),
+ 'img_super' => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
+ 'img_top' => array( '1', 'أعلى', 'top' ),
+ 'img_text_top' => array( '1', 'نص_أعلى', 'text-top' ),
+ 'img_middle' => array( '1', 'وسط', 'middle' ),
+ 'img_bottom' => array( '1', 'أسÙÙ„', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'نص_أسÙÙ„', 'text-bottom' ),
+ 'img_link' => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'بديل=$1', 'alt=$1' ),
+ 'int' => array( '0', 'محتوى:', 'INT:' ),
+ 'sitename' => array( '1', 'اسم_الموقع', 'SITENAME' ),
+ 'ns' => array( '0', 'نط:', 'NS:' ),
+ 'nse' => array( '0', 'نطم:', 'NSE:' ),
+ 'localurl' => array( '0', 'مسار_محلي:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'مسار_المقالة', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'خادم', 'SERVER' ),
+ 'servername' => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'نوع:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'أسبوع_حالي', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'يوم_حالي_مأ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'أسبوع_محلي', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'يوم_محلي_مأ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'عنوان_كامل:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'مسار_كامل:', 'FULLURLE:' ),
+ 'canonicalurl' => array( '0', 'عنوان_قاعدة:', 'CANONICALURL:' ),
+ 'canonicalurle' => array( '0', 'مسار_قاعدة:', 'CANONICALURLE:' ),
+ 'lcfirst' => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'صغير:', 'LC:' ),
+ 'uc' => array( '0', 'كبير:', 'UC:' ),
+ 'raw' => array( '0', 'خام:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'أر', 'آر', 'R' ),
+ 'newsectionlink' => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'كود_المسار:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#لغة:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'صÙحات_ÙÙŠ_نطاق:', 'صÙحات_ÙÙŠ_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'باد_يسار', 'PADLEFT' ),
+ 'padright' => array( '0', 'باد_يمين', 'PADRIGHT' ),
+ 'special' => array( '0', 'خاص', 'special' ),
+ 'defaultsort' => array( '1', 'ترتيب_اÙتراضي:', 'Ù…Ùتاح_ترتيب_اÙتراضي:', 'ترتيب_تصنيÙ_اÙتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'مسار_الملÙ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'وسم', 'tag' ),
+ 'hiddencat' => array( '1', '__تصنيÙ_مخÙÙŠ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'صÙحات_ÙÙŠ_التصنيÙ', 'صÙحات_ÙÙŠ_تصنيÙ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'حجم_الصÙحة', 'PAGESIZE' ),
+ 'index' => array( '1', '__Ùهرسة__', '__INDEX__' ),
+ 'noindex' => array( '1', '__لاÙهرسة__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'عدد_ÙÙŠ_المجموعة', 'عدد_ÙÙŠ_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'مسار', 'PATH' ),
+ 'url_wiki' => array( '0', 'ويكي', 'WIKI' ),
+ 'url_query' => array( '0', 'استعلام', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', 'لاخطأ', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', 'لاتستبدل', 'noreplace' ),
);
$specialPageAliases = array(
@@ -334,12 +343,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'كل_الرسائل' ),
'Allpages' => array( 'كل_الصÙحات' ),
'Ancientpages' => array( 'صÙحات_قديمة' ),
+ 'Badtitle' => array( 'عنوان_سيئ' ),
'Blankpage' => array( 'صÙحة_Ùارغة' ),
'Block' => array( 'منع', 'منع_أيبي', 'منع_مستخدم' ),
'Blockme' => array( 'منعي' ),
'Booksources' => array( 'مصادر_كتاب' ),
'BrokenRedirects' => array( 'تحويلات_مكسورة' ),
'Categories' => array( 'تصنيÙات' ),
+ 'ChangeEmail' => array( 'تغيير_البريد' ),
'ChangePassword' => array( 'تغيير_كلمة_السر', 'ضبط_كلمة_السر' ),
'ComparePages' => array( 'مقارنة_الصÙحات' ),
'Confirmemail' => array( 'تأكيد_البريد' ),
@@ -804,23 +815,25 @@ $1',
'badarticleerror' => 'لا يمكن إجراء هذا الÙعل على هذه الصÙحة.',
'cannotdelete' => 'تعذر حذ٠الصÙحة أو المل٠"$1".
ربما حذÙها شحص آخر.',
+'cannotdelete-title' => 'لا يمكن حذ٠الصÙحة "$1"',
'badtitle' => 'عنوان سيء',
'badtitletext' => 'عنوان الصÙحة المطلوب إما غير صحيح أو Ùارغ، وربما الوصلة بين اللغات أو بين المشاريع خاطئة.
ومن الممكن وجود رموز لا تصلح للاستخدام ÙÙŠ العناوين.',
-'perfcached' => 'البيانات التالية مختزنة وقد لا تكون محدثة.',
-'perfcachedts' => 'البيانات التالية مختزنة، آخر تحديث لها كان ÙÙŠ $1.',
+'perfcached' => 'البيانات التالية مختزنة وقد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مختزنة|مختزنتان|مختزنة}}.',
+'perfcachedts' => 'البيانات التالية مختزنة وكان آخر تحديث لها ÙÙŠ $1. {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}} على الأكثر {{PLURAL:$4||مختزنة|مختزنتان|مختزنة}}.',
'querypage-no-updates' => 'التحديثات لهذه الصÙحة معطلة حاليا.
البيانات هنا لن يتم تحديثها حاليا.',
'wrong_wfQuery_params' => 'محددات خاطئة ÙÙŠ wfQuery()<br />
الدالة: $1<br />
الاستعلام: $2',
'viewsource' => 'اعرض المصدر',
-'viewsourcefor' => 'Ù„$1',
+'viewsource-title' => 'إظهار مصدر $1',
'actionthrottled' => 'لا يمكن عمل المزيد من هذا الÙعل',
'actionthrottledtext' => 'كإجراء ضد السبام، أنت ممنوع من إجراء هذا الÙعل عدد كبير من المرات ÙÙŠ Ùترة زمنية قصيرة، ولقد تجاوزت هذا الحد.
من Ùضلك حاول مرة ثانية خلال عدة دقائق.',
'protectedpagetext' => 'هذه الصÙحة تمت حمايتها لمنع التعديل.',
'viewsourcetext' => 'يمكنك رؤية ونسخ مصدر هذه الصÙحة:',
+'viewyourtext' => "يمكنك رؤية ونسخ مصدر ''' تعديلاتك ''' ÙÙŠ هذه الصÙحة:",
'protectedinterface' => 'هذه الصÙحة توÙر نص الواجهة للبرنامج، وهي مقÙلة لمنع التخريب.',
'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صÙحة تستخدم ÙÙŠ الواجهة النصية للبرنامج.
سو٠تؤثر التغييرات على هذه الصÙحة على مظهر واجهة المستخدم للمستخدمين الآخرين.
@@ -929,6 +942,7 @@ $2',
'emailconfirmlink' => 'أكد عنوان بريدك الإلكتروني',
'invalidemailaddress' => 'لا يمكن قبول عنوان البريد الإلكتروني حيث تبدو صيغته خاطئة.
ضع عنوانا مضبوطا أو Ø£Ùرغ هذا الحقل.',
+'cannotchangeemail' => 'تغيير عنوان البريد الإلكتروني لهذا الحساب غير ممكن على هذا الويكي',
'accountcreated' => 'تم إنشاء الحساب',
'accountcreatedtext' => 'تم إنشاء الحساب الخاص ب$1.',
'createaccount-title' => 'إنشاء حساب ÙÙŠ {{SITENAME}}',
@@ -945,6 +959,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => "خطأ غير معرو٠ÙÙŠ وظيÙØ© البريد PHP's mail()",
+'user-mail-no-addy' => 'لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.',
# Change password dialog
'resetpass' => 'تغيير كلمة السر',
@@ -966,32 +981,47 @@ $2',
'resetpass-temp-password' => 'كلمة سر مؤقتة:',
# Special:PasswordReset
-'passwordreset' => 'تمت إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتÙاصيل حسابك.',
-'passwordreset-legend' => 'إعادة تعيين كلمة السر',
-'passwordreset-disabled' => 'عÙطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
-'passwordreset-username' => 'اسم المستخدم:',
-'passwordreset-domain' => 'النطاق:',
-'passwordreset-email' => 'عنوان البريد الإلكتروني:',
-'passwordreset-emailtitle' => 'تÙاصيل حساب {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'احد ما (قد يكون انت$1)طلب مذكرة تÙاصيل الحساب Ù„{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
+'passwordreset' => 'تمت إعادة ضبط كلمة السر',
+'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتÙاصيل حسابك.',
+'passwordreset-legend' => 'إعادة تعيين كلمة السر',
+'passwordreset-disabled' => 'عÙطّلت إعادة تعيين كلمة السر على هذه الويكي.',
+'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
+'passwordreset-username' => 'اسم المستخدم:',
+'passwordreset-domain' => 'النطاق:',
+'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
+'passwordreset-capture-help' => 'إذا علّمت هذا الصندوق Ùسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.',
+'passwordreset-email' => 'عنوان البريد الإلكتروني:',
+'passwordreset-emailtitle' => 'تÙاصيل حساب {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'احد ما (قد يكون انت$1)طلب مذكرة تÙاصيل الحساب Ù„{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
$2
{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي ÙÙŠ {{PLURAL:$5|يوم|ايام$5 }}
من الاÙضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
إذا قام شخص آخر بهذا الطلب، أو إذا تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب ÙÙŠ تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة المرورالقديمة.',
-'passwordreset-emailtext-user' => 'احد ما (قد يكون انت$1)طلب مذكرة تÙاصيل الحساب Ù„{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
+'passwordreset-emailtext-user' => 'احد ما (قد يكون انت$1)طلب مذكرة تÙاصيل الحساب Ù„{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
$2
{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي ÙÙŠ {{PLURAL:$5|يوم|ايام$5 }}
من الاÙضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
إذا قام شخص آخر بهذا الطلب، أو إذا تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب ÙÙŠ تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة المرورالقديمة.',
-'passwordreset-emailelement' => 'اسم المستخدم: $1
+'passwordreset-emailelement' => 'اسم المستخدم: $1
كلمة السر المؤقتة: $2',
-'passwordreset-emailsent' => 'أرسل بريد إلكتروني تذكيري',
+'passwordreset-emailsent' => 'أرسل بريد إلكتروني تذكيري',
+'passwordreset-emailsent-capture' => 'أرسل بريد إلكتروني تذكيري وهو معروض بالأسÙÙ„.',
+'passwordreset-emailerror-capture' => 'ولّد بريد إلكتروني تذكيري وهو معروض بالأسÙÙ„ لكن Ùشل إرساله للمستخدم: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'تغيير عنوان البريد الإلكتروني',
+'changeemail-header' => 'تغيير عنوان البريد الإلكتروني للحساب',
+'changeemail-text' => 'أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سو٠تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.',
+'changeemail-no-info' => 'يجب تسجيل الدخول للوصول إلى هذه الصÙحة مباشرة.',
+'changeemail-oldemail' => 'عنوان البريد الإلكتروني الحالي:',
+'changeemail-newemail' => 'عنوان البريد الإلكتروني الجديد:',
+'changeemail-none' => '(لا شيء)',
+'changeemail-submit' => 'تغيير البريد الإلكتروني',
+'changeemail-cancel' => 'إلغاء',
# Edit page toolbar
'bold_sample' => 'نص غليظ',
@@ -1061,9 +1091,6 @@ $2
عنوان آيبيك الحالي $3، ورقم المنع #$5.
من Ùضلك اذكر كل التÙاصيل بالأعلى ÙÙŠ أي استعلامات تقوم بها.',
'blockednoreason' => 'لا سبب معطى',
-'blockedoriginalsource' => "مصدر '''$1''' معروض بالأسÙÙ„:",
-'blockededitsource' => "نص '''تعديلاتك''' ÙÙŠ '''$1''' معروض بالأسÙÙ„:",
-'whitelistedittitle' => 'تسجيل الدخول مطلوب للتحرير',
'whitelistedittext' => 'يجب عليك $1 لتتمكن من تعديل الصÙحات.',
'confirmedittext' => 'يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصÙحات.
من Ùضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تÙضيلاتك]].',
@@ -1326,8 +1353,6 @@ $2
'revdelete-unsuppress' => 'إزالة الضوابط من المراجعات المسترجعة',
'revdelete-log' => 'السبب:',
'revdelete-submit' => 'طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}',
-'revdelete-logentry' => 'غير رؤية المراجعة ل[[$1]]',
-'logdelete-logentry' => 'غير رؤية الحدث ل[[$1]]',
'revdelete-success' => "'''تم تحديث رؤية المراجعات بنجاح.'''",
'revdelete-failure' => "'''تعذر تحديث رؤية المراجعة:'''
$1",
@@ -1339,15 +1364,6 @@ $1",
'revdel-restore-visible' => 'مراجعات مرئية',
'pagehist' => 'تاريخ الصÙحة',
'deletedhist' => 'التاريخ المحذوÙ',
-'revdelete-content' => 'محتوى',
-'revdelete-summary' => 'ملخص التعديل',
-'revdelete-uname' => 'اسم المستخدم',
-'revdelete-restricted' => 'طبق الضوابط لمديري النظام',
-'revdelete-unrestricted' => 'أزال الضوابط لمديري النظام',
-'revdelete-hid' => 'أخÙÙ‰ $1',
-'revdelete-unhid' => 'أظهر $1',
-'revdelete-log-message' => '$1 ل$2 {{PLURAL:$2|مراجعة|مراجعة}}',
-'logdelete-log-message' => '$1 ل$2 {{PLURAL:$2|حدث|حدث}}',
'revdelete-hide-current' => 'خطأ عند إحÙاء العنصر المؤرخ ÙÙŠ $2 $1: هذه هي المراجعة الحالية.
لا يمكن إخÙاؤها.',
'revdelete-show-no-access' => 'خطأ ÙÙŠ إظهار العنصر ذا التاريخ $2 $1: هذا العنصر معلم Ùƒ"مقيد".
@@ -1508,12 +1524,14 @@ $1",
'prefs-rc' => 'أحدث التغييرات',
'prefs-watchlist' => 'قائمة المراقبة',
'prefs-watchlist-days' => 'عدد الأيام للعرض ÙÙŠ قائمة المراقبة:',
-'prefs-watchlist-days-max' => '7 أيام كحد أقصى',
+'prefs-watchlist-days-max' => 'الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}',
'prefs-watchlist-edits' => 'عدد التعديلات التي تعرض ÙÙŠ قائمة المراقبة الموسعة:',
'prefs-watchlist-edits-max' => 'العدد الأقصى: 1000',
'prefs-watchlist-token' => 'Ù…Ùتاح قائمة المراقبة:',
'prefs-misc' => 'متÙرقات',
'prefs-resetpass' => 'غير كلمة السر',
+'prefs-changeemail' => 'تغيير البريد الإلكتروني',
+'prefs-setemail' => 'تعيين عنوان البريد الإلكتروني',
'prefs-email' => 'خيارات البريد الإلكتروني',
'prefs-rendering' => 'المظهر',
'saveprefs' => 'احÙظ',
@@ -1613,7 +1631,7 @@ $1",
'userrights-lookup-user' => 'أدÙر مجموعات المستخدم',
'userrights-user-editname' => 'أدخل اسم مستخدم:',
'editusergroup' => 'عدل مجموعات المستخدم',
-'editinguser' => "تغيير صلاحيات المستخدم '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "تغيير صلاحيات المستخدم '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'تعديل مجموعات المستخدم',
'saveusergroups' => 'احÙظ مجموعات المستخدم',
'userrights-groupsmember' => 'عضو ÙÙŠ:',
@@ -1707,13 +1725,13 @@ $1",
'right-autopatrol' => 'علم تعديلات المستخدم مراجعة تلقائيا',
'right-patrolmarks' => 'رؤية علامات المراجعة ÙÙŠ أحدث التغييرات',
'right-unwatchedpages' => 'رؤية قائمة بالصÙحات غير المراقبة',
-'right-trackback' => 'تنÙيذ تراكباك',
'right-mergehistory' => 'دمج تاريخ الصÙحات',
'right-userrights' => 'تعديل كل صلاحيات المستخدمين',
'right-userrights-interwiki' => 'تعديل صلاحيات المستخدم للمستخدمين ÙÙŠ الويكيات الأخرى',
'right-siteadmin' => 'غلق ورÙع غلق قاعدة البيانات',
'right-override-export-depth' => 'تصدير الصÙحات متضمنة الصÙحات الموصولة حتى عمق 5',
'right-sendemail' => 'إرسال رسائل بريد إلكتروني إلى مستخدمين آخرين',
+'right-passwordreset' => 'عرض رسائل إعادة ضبط كلمات السر',
# User rights log
'rightslog' => 'سجل صلاحيات المستخدمين',
@@ -1752,11 +1770,11 @@ $1",
'action-patrol' => 'التعليم على تعديلات الآخرين كمراجعة',
'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع',
'action-unwatchedpages' => 'رؤية قائمة الصÙحات غير المراقبة',
-'action-trackback' => 'تنÙيذ تراكباك',
'action-mergehistory' => 'دمج تاريخ هذه الصÙحة',
'action-userrights' => 'تعديل كل صلاحيات المستخدم',
'action-userrights-interwiki' => 'تعديل صلاحيات المستخدم للمستخدمين ÙÙŠ الويكيات الأخرى',
'action-siteadmin' => 'غلق أو رÙع غلق قاعدة البيانات',
+'action-sendemail' => 'إرسال رسائل بريد إلكتروني',
# Recent changes
'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
@@ -1785,7 +1803,6 @@ $1",
'minoreditletter' => 'Ø·',
'newpageletter' => 'ج‌',
'boteditletter' => 'ب',
-'sectionlink' => 'â†',
'number_of_watching_users_pageview' => '[{{PLURAL:$1|لا مستخدمون يراقبون|مستخدم واحد يراقب|مستخدمان يراقبان|$1 مستخدمين يراقبون|$1 مستخدما يراقب|$1 مستخدم يراقب}}]',
'rc_categories' => 'حصر لتصنيÙات (Ù…Ùرقة برمز "|")',
'rc_categories_any' => 'أي',
@@ -1843,6 +1860,7 @@ $1",
'minlength1' => 'أسماء الملÙات يجب أن تتكون من حر٠واحد على الأقل.',
'illegalfilename' => 'اسم المل٠"$1" يحتوي على حرو٠غير مسموح بها ÙÙŠ عناوين الصÙحات.
من Ùضلك أعد تسمية المل٠وحاول رÙعه مرة أخرى.',
+'filename-toolong' => 'طول أسماء الملÙات يجب أن لا يتجاوز 240 حر٠(بايت)',
'badfilename' => 'تم تغيير اسم المل٠إلى "$1".',
'filetype-mime-mismatch' => 'امتداد المل٠".$1" لا يطابق نوع MIME للمل٠($2).',
'filetype-badmime' => 'من غير المسموح به رÙع ملÙات من النوع "$1".',
@@ -1954,6 +1972,12 @@ $1',
'upload-unknown-size' => 'حجم غير معروÙ',
'upload-http-error' => 'صود٠خطأ HTTP: $1',
+# File backend
+'backend-fail-notexists' => 'المل٠$1 غير موجود.',
+'backend-fail-opentemp' => 'تعذّر Ùتح مل٠مؤقت.',
+'backend-fail-writetemp' => 'تعذّرت كتابة مل٠مؤقت.',
+'backend-fail-closetemp' => 'تعذّر إغلاق مل٠مؤقت.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'صود٠خطأ أثناء Ùتح المل٠لÙحوصات ZIP.',
'zip-wrong-format' => 'المل٠المحدد ليس مل٠ZIP.',
@@ -2081,23 +2105,24 @@ $1',
'filerevert-badversion' => 'لا توجد نسخة محلية سابقة لهذا المل٠بالتاريخ المعطى.',
# File deletion
-'filedelete' => 'احذ٠$1',
-'filedelete-legend' => 'احذ٠الملÙ',
-'filedelete-intro' => "أنت على وشك حذ٠المل٠'''[[Media:$1|$1]]''' مع كل تاريخه.",
-'filedelete-intro-old' => "أنت تحذ٠نسخة '''[[Media:$1|$1]]''' بتاريخ [$4 $3، $2].",
-'filedelete-comment' => 'السبب:',
-'filedelete-submit' => 'احذÙ',
-'filedelete-success' => "'''$1''' تم حذÙÙ‡.",
-'filedelete-success-old' => "نسخة '''[[Media:$1|$1]]''' بتاريخ $3ØŒ $2 تم حذÙها.",
-'filedelete-nofile' => "'''$1''' غير موجود.",
-'filedelete-nofile-old' => "لا توجد نسخة مؤرشÙØ© من '''$1''' بالعناصر المحددة.",
-'filedelete-otherreason' => 'سبب إضاÙÙŠ/آخر:',
-'filedelete-reason-otherlist' => 'سبب آخر',
-'filedelete-reason-dropdown' => '*أسباب الحذ٠الشائعة
+'filedelete' => 'احذ٠$1',
+'filedelete-legend' => 'احذ٠الملÙ',
+'filedelete-intro' => "أنت على وشك حذ٠المل٠'''[[Media:$1|$1]]''' مع كل تاريخه.",
+'filedelete-intro-old' => "أنت تحذ٠نسخة '''[[Media:$1|$1]]''' بتاريخ [$4 $3، $2].",
+'filedelete-comment' => 'السبب:',
+'filedelete-submit' => 'احذÙ',
+'filedelete-success' => "'''$1''' تم حذÙÙ‡.",
+'filedelete-success-old' => "نسخة '''[[Media:$1|$1]]''' بتاريخ $3ØŒ $2 تم حذÙها.",
+'filedelete-nofile' => "'''$1''' غير موجود.",
+'filedelete-nofile-old' => "لا توجد نسخة مؤرشÙØ© من '''$1''' بالعناصر المحددة.",
+'filedelete-otherreason' => 'سبب إضاÙÙŠ/آخر:',
+'filedelete-reason-otherlist' => 'سبب آخر',
+'filedelete-reason-dropdown' => '*أسباب الحذ٠الشائعة
** خرق حقوق النشر
** مل٠مكرر',
-'filedelete-edit-reasonlist' => 'عدل أسباب الحذÙ',
-'filedelete-maintenance' => 'حذ٠واسترجاع الملÙات معطل مؤقتا خلال الصيانة.',
+'filedelete-edit-reasonlist' => 'عدل أسباب الحذÙ',
+'filedelete-maintenance' => 'حذ٠واسترجاع الملÙات معطل مؤقتا خلال الصيانة.',
+'filedelete-maintenance-title' => 'لا يمكن حذ٠الملÙ',
# MIME search
'mimesearch' => 'بحث MIME',
@@ -2220,7 +2245,7 @@ $1',
'listusers-editsonly' => 'اعرض المستخدمين الذين قاموا بتعديلات Ùقط',
'listusers-creationsort' => 'رتب حسب تاريخ الإنشاء',
'usereditcount' => '{{PLURAL:$1|لا تعديلات|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديلًا|$1 تعديل}}',
-'usercreated' => 'تم إنشاؤه ÙÙŠ $1 الساعة $2',
+'usercreated' => '{{GENDER:$3|أنشأه|أنشأته}} ÙÙŠ $1 الساعة $2',
'newpages' => 'صÙحات جديدة',
'newpages-username' => 'اسم المستخدم:',
'ancientpages' => 'أقدم الصÙحات',
@@ -2314,12 +2339,8 @@ $1',
'activeusers-noresult' => 'لا مستخدمون تم إيجادهم.',
# Special:Log/newusers
-'newuserlogpage' => 'سجل إنشاء المستخدمين',
-'newuserlogpagetext' => 'هذا سجل بعمليات إنشاء المستخدمين.',
-'newuserlog-byemail' => 'كلمة السر تم إرسالها بواسطة البريد الإلكتروني',
-'newuserlog-create-entry' => 'مستخدم جديد',
-'newuserlog-create2-entry' => 'أنشأ حسابا جديدا $1',
-'newuserlog-autocreate-entry' => 'الحساب تم إنشاؤه تلقائيا',
+'newuserlogpage' => 'سجل إنشاء المستخدمين',
+'newuserlogpagetext' => 'هذا سجل بعمليات إنشاء المستخدمين.',
# Special:ListGroupRights
'listgrouprights' => 'صلاحيات مجموعات المستخدمين',
@@ -2348,7 +2369,7 @@ $1',
'emailpagetext' => 'يمكنك استخدام الاستمارة بالأسÙÙ„ لإرسال رسالة بريد إلكتروني إلى هذا المستخدم.
عنوان البريد الإلكتروني الذي قمت أنت بإدخاله ÙÙŠ [[Special:Preferences|تÙضيلاتك]]ØŒ سيظهر كعنوان المرسل ÙÙŠ البريد الإلكتروني، حتى يصبح المتلقي قادرا على الرد عليك مباشرة.',
'usermailererror' => 'جسم البريد أرجع خطأ:',
-'defemailsubject' => 'رسالة من {{SITENAME}}',
+'defemailsubject' => 'رسالة {{SITENAME}} من المستخدم "$1"',
'usermaildisabled' => 'بريد المستخدم الإلكتروني معطل',
'usermaildisabledtext' => 'لا يمكنك إرسال بريد إلكتروني إلى مستخدمين آخرين على هذه الويكي',
'noemailtitle' => 'لا يوجد عنوان بريد إلكتروني',
@@ -2402,7 +2423,7 @@ $1',
'watchmethod-list' => 'Ùحص الصÙحات المراقبة للتعديلات الحديثة',
'watchlistcontains' => 'تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صÙحات|صÙحة واحدة|صÙحتان|$1 صÙحات|$1 صÙحة}}.',
'iteminvalidname' => "مشكلة ÙÙŠ المدخل '$1'ØŒ اسم غير صحيح...",
-'wlnote' => "بالأسÙÙ„ {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} ÙÙŠ {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}}.",
+'wlnote' => "بالأسÙÙ„ {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} ÙÙŠ {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} ÙˆÙقا Ù„$3ØŒ $4.",
'wlshowlast' => 'عرض آخر $1 ساعات $2 أيام $3',
'watchlist-options' => 'خيارات قائمة المراقبة',
@@ -2464,8 +2485,6 @@ $UNWATCHURL
'actionfailed' => 'الÙعل Ùشل',
'deletedtext' => '"$1" تم حذÙها.
انظر ÙÙŠ $2 لسجل آخر عمليات الحذÙ.',
-'deletedarticle' => 'حذ٠"[[$1]]"',
-'suppressedarticle' => 'أخÙÙ‰ "[[$1]]"',
'dellogpage' => 'سجل الحذÙ',
'dellogpagetext' => 'بالأسÙÙ„ قائمة بأحدث عمليات الحذÙ.',
'deletionlog' => 'سجل الحذÙ',
@@ -2516,6 +2535,7 @@ $UNWATCHURL
'unprotectedarticle' => 'أزال الحماية من "[[$1]]"',
'movedarticleprotection' => 'نقل إعدادات الحماية من "[[$2]]" إلى "[[$1]]"',
'protect-title' => 'ضبط مستوى الحماية ل"$1"',
+'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"',
'prot_1movedto2' => 'Ù†Ùقلت [[$1]] إلى [[$2]]',
'protect-legend' => 'تأكيد الحماية',
'protectcomment' => 'السبب:',
@@ -2538,6 +2558,7 @@ $UNWATCHURL
'protect-level-sysop' => 'الإداريون Ùقط',
'protect-summary-cascade' => 'مضمنة',
'protect-expiring' => 'تنتهي ÙÙŠ $1 (UTC)',
+'protect-expiring-local' => 'ينتهي $1',
'protect-expiry-indefinite' => 'غير محدد',
'protect-cascade' => 'احم الصÙحات المضمنة ÙÙŠ هذه الصÙحة (حماية مضمنة)',
'protect-cantedit' => 'لا يمكنك تغيير مستويات الحماية لهذه الصÙحة، لأنك لا تمتلك الصلاحية لتعديلها.',
@@ -2598,7 +2619,6 @@ $UNWATCHURL
'undeletereset' => 'أعد الضبط',
'undeleteinvert' => 'اعكس الاختيار',
'undeletecomment' => 'السبب:',
-'undeletedarticle' => 'استرجع "[[$1]]"',
'undeletedrevisions' => 'تم استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
'undeletedrevisions-files' => 'أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} Ùˆ{{PLURAL:$2||مل٠واحد|ملÙان|$2 ملÙات|$2 ملÙًا|$2 ملÙ}}',
'undeletedfiles' => 'أسترجع {{PLURAL:$1||مل٠واحد|ملÙان|$1 ملÙات|$1 ملÙًا|$1 ملÙ}}',
@@ -2608,6 +2628,7 @@ $UNWATCHURL
راجع [[Special:Log/delete|سجل الحدÙ]] لمعاينة عمليات الحذ٠والاسترجاعات الحديثة.",
'undelete-header' => 'انظر الصÙحات المحذوÙØ© حديثا ÙÙŠ [[Special:Log/delete|سجل الحذÙ]].',
+'undelete-search-title' => 'البحث ÙÙŠ الصÙحات المحذوÙØ©',
'undelete-search-box' => 'ابحث ÙÙŠ الصÙحات المحذوÙØ©',
'undelete-search-prefix' => 'عرض الصÙحات التي تبدأ بـ:',
'undelete-search-submit' => 'ابحث',
@@ -2736,6 +2757,7 @@ $1',
'blocklist-userblocks' => 'أخÙ٠منع الحسابات',
'blocklist-tempblocks' => 'أخÙ٠المنع المؤقت',
'blocklist-addressblocks' => 'أخÙ٠منع عنوان آيبي واحد',
+'blocklist-rangeblocks' => 'أخÙ٠منع النطاقات',
'blocklist-timestamp' => 'الزمن',
'blocklist-target' => 'الهدÙ',
'blocklist-expiry' => 'ينتهي ÙÙŠ',
@@ -2758,6 +2780,7 @@ $1',
'unblocklink' => 'ارÙع المنع',
'change-blocklink' => 'تغيير المنع',
'contribslink' => 'مساهمات',
+'emaillink' => 'أرسل بريدًا إلكترونيًا',
'autoblocker' => 'تم منعك تلقائيا لأن الأيبي الخاص بك تم استخدامه مؤخرا بواسطة "[[User:$1|$1]]".
السبب المعطى لمنع $1 هو: "$2"',
'blocklogpage' => 'سجل المنع',
@@ -2889,9 +2912,6 @@ $1',
'movepage-page-moved' => 'Ù†ÙÙ‚Ùلت صÙحة $1 إلى $2.',
'movepage-page-unmoved' => 'لم يمكن نقل صÙحة $1 إلى $2.',
'movepage-max-pages' => 'تم نقل الحد الأقصى وهو {{PLURAL:$1||صÙحة واحدة|صÙحتان|$1 صÙحات|$1 صÙحة}} ولن يتم نقل المزيد تلقائيا.',
-'1movedto2' => '[[$1]] تم نقلها إلى [[$2]]',
-'1movedto2_redir' => '[[$1]] تم نقلها إلى [[$2]] Ùوق التحويلة',
-'move-redirect-suppressed' => 'تم التغاضي عن التحويلة',
'movelogpage' => 'سجل النقل',
'movelogpagetext' => 'بالأسÙÙ„ قائمة بالصÙحات التي تم نقلها.',
'movesubpage' => '{{PLURAL:$1||الصÙحة الÙرعية|الصÙحتان الÙرعيتان|الصÙحات الÙرعية}}',
@@ -2904,7 +2924,7 @@ $1',
الصÙحة الهد٠"[[:$1]]" موجودة بالÙعل.
هل تريد حذÙها لإÙساح المجال للنقل؟',
'delete_and_move_confirm' => 'نعم، احذ٠الصÙحة',
-'delete_and_move_reason' => 'تم الحذ٠لإÙساح مجال للنقل',
+'delete_and_move_reason' => 'Ø­ÙØ°ÙÙت لإÙساح مجال لنقل "[[$1]]"',
'selfmove' => 'لا يوجد اختلا٠ÙÙŠ عنوان المصدر والهدÙØ›
لا يمكن نقل الصÙحة على Ù†Ùسها.',
'immobile-source-namespace' => 'غير قادر على نقل الصÙحات ÙÙŠ النطاق "$1"',
@@ -2934,6 +2954,7 @@ $1',
لتصدير صÙحات، أدخل العناوين ÙÙŠ الصندوق أسÙله، عنوان واحد ÙÙŠ كل سطر، مع اختيار ما إذا كنت ترغب ÙÙŠ النسخة الحالية بالإضاÙØ© إلى النسخ القديمة كاملة، أو مع معلومات تاريخ الصÙحة عنها، أو Ùقط النسخة الحالية مع معلومات عن التعديل الأخير.
ÙÙŠ الحالة الأخيرة يمكنك أيضا استخدام وصلة، على سبيل المثال [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] للصÙحة "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'صدّر كل الصÙحات',
'exportcuronly' => 'ضمن المراجعة الحالية Ùقط، وليس التاريخ الكامل',
'exportnohistory' => "----
ملاحظة:''' تصدير التاريخ الكامل للصÙحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء'''",
@@ -3015,6 +3036,8 @@ $1',
'import-upload' => 'رÙع بيانات XML',
'import-token-mismatch' => 'Ùقد لبيانات الجلسة. من Ùضلك حاول مرة أخرى.',
'import-invalid-interwiki' => 'لم يمكن الاستيراد من الويكي المحدد.',
+'import-error-edit' => 'الصÙحة "$1" لم يتم استيرادها لأنه لا يمكن لك تحريرها.',
+'import-error-create' => 'الصÙحة "$1" لم يتم استيرادها لأنه لا يمكن لك استحداثها أصلا.',
# Import log
'importlogpage' => 'سجل الاستيراد',
@@ -3024,74 +3047,79 @@ $1',
'import-logentry-interwiki' => 'استورد عبر الويكي $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} من $2',
+# JavaScriptTest
+'javascripttest' => 'اختبار جاÙاسكربت',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'صÙحة المستخدم الخاصة بك',
-'tooltip-pt-anonuserpage' => 'صÙحة المستخدم للأيبي الذي تقوم بالتحرير من خلاله',
-'tooltip-pt-mytalk' => 'صÙحة نقاشك',
-'tooltip-pt-anontalk' => 'نقاش حول التعديلات من عنوان الأيبي هذا',
-'tooltip-pt-preferences' => 'تÙضيلاتي',
-'tooltip-pt-watchlist' => 'قائمة الصÙحات التي تراقب التغييرات التي تحدث بها',
-'tooltip-pt-mycontris' => 'قائمة مساهماتك',
-'tooltip-pt-login' => 'ÙŠÙضل أن تسجل الدخول، لكنه ليس إلزاميا.',
-'tooltip-pt-anonlogin' => 'من المÙضل أن تقوم بتسجيل الدخول، هذا ليس إلزاميا.',
-'tooltip-pt-logout' => 'خروج',
-'tooltip-ca-talk' => 'نقاش عن صÙحة المحتوى',
-'tooltip-ca-edit' => 'يمكنك تعديل هذه الصÙحة.
+'tooltip-pt-userpage' => 'صÙحة المستخدم الخاصة بك',
+'tooltip-pt-anonuserpage' => 'صÙحة المستخدم للأيبي الذي تقوم بالتحرير من خلاله',
+'tooltip-pt-mytalk' => 'صÙحة نقاشك',
+'tooltip-pt-anontalk' => 'نقاش حول التعديلات من عنوان الأيبي هذا',
+'tooltip-pt-preferences' => 'تÙضيلاتي',
+'tooltip-pt-watchlist' => 'قائمة الصÙحات التي تراقب التغييرات التي تحدث بها',
+'tooltip-pt-mycontris' => 'قائمة مساهماتك',
+'tooltip-pt-login' => 'ÙŠÙضل أن تسجل الدخول، لكنه ليس إلزاميا.',
+'tooltip-pt-anonlogin' => 'من المÙضل أن تقوم بتسجيل الدخول، هذا ليس إلزاميا.',
+'tooltip-pt-logout' => 'خروج',
+'tooltip-ca-talk' => 'نقاش عن صÙحة المحتوى',
+'tooltip-ca-edit' => 'يمكنك تعديل هذه الصÙحة.
من Ùضلك استخدم زر العرض المسبق قبل الحÙظ.',
-'tooltip-ca-addsection' => 'ابدأ قسما جديدا',
-'tooltip-ca-viewsource' => 'هذه الصÙحة محمية.
+'tooltip-ca-addsection' => 'ابدأ قسما جديدا',
+'tooltip-ca-viewsource' => 'هذه الصÙحة محمية.
يمكنك رؤية مصدرها.',
-'tooltip-ca-history' => 'النسخ السابقة لهذه الصÙحة',
-'tooltip-ca-protect' => 'احم هذه الصÙحة',
-'tooltip-ca-unprotect' => 'غير حماية هذه الصÙحة',
-'tooltip-ca-delete' => 'احذ٠هذه الصÙحة',
-'tooltip-ca-undelete' => 'استرجع التعديلات التي تمت على هذه الصÙحة قبل حذÙها',
-'tooltip-ca-move' => 'انقل هذه الصÙحة',
-'tooltip-ca-watch' => 'أض٠هذه الصÙحة إلى قائمة مراقبتك',
-'tooltip-ca-unwatch' => 'أزل هذه الصÙحة من قائمة مراقبتك',
-'tooltip-search' => 'ابحث ÙÙŠ {{SITENAME}}',
-'tooltip-search-go' => 'اذهب إلى صÙحة بالاسم Ù†Ùسه إن وجدت',
-'tooltip-search-fulltext' => 'ابحث ÙÙŠ الصÙحات عن هذا النص',
-'tooltip-p-logo' => 'الصÙحة الرئيسية',
-'tooltip-n-mainpage' => 'زر الصÙحة الرئيسية',
-'tooltip-n-mainpage-description' => 'زر الصÙحة الرئيسية',
-'tooltip-n-portal' => 'حول المشروع، ماذا يمكن أن تÙعل، أين يمكن أن تجد ما تحتاجه',
-'tooltip-n-currentevents' => 'مطالعة سريعة لأهم الأحداث الجارية',
-'tooltip-n-recentchanges' => 'قائمة أحدث التغييرات ÙÙŠ الويكي.',
-'tooltip-n-randompage' => 'حمل صÙحة عشوائية',
-'tooltip-n-help' => 'المكان للمساعدة',
-'tooltip-t-whatlinkshere' => 'قائمة بكل صÙحات الويكي التي تصل هنا',
-'tooltip-t-recentchangeslinked' => 'أحدث التغييرات ÙÙŠ الصÙحات الموصولة من هذه الصÙحة',
-'tooltip-feed-rss' => 'تلقيم أر إس إس لهذه الصÙحة',
-'tooltip-feed-atom' => 'تلقيم أتوم لهذه الصÙحة',
-'tooltip-t-contributions' => 'رؤية قائمة مساهمات هذا المستخدم',
-'tooltip-t-emailuser' => 'أرسل رسالة لهذا المستخدم',
-'tooltip-t-upload' => 'ارÙع ملÙات',
-'tooltip-t-specialpages' => 'قائمة بكل الصÙحات الخاصة',
-'tooltip-t-print' => 'نسخة للطباعة لهذه الصÙحة',
-'tooltip-t-permalink' => 'وصلة دائمة لهذه النسخة من الصÙحة',
-'tooltip-ca-nstab-main' => 'رؤية صÙحة المحتوى',
-'tooltip-ca-nstab-user' => 'اعرض صÙحة المستخدم',
-'tooltip-ca-nstab-media' => 'رؤية صÙحة الميديا',
-'tooltip-ca-nstab-special' => 'هذه صÙحة خاصة، لا تستطيع أن تعدل الصÙحة Ù†Ùسها',
-'tooltip-ca-nstab-project' => 'رؤية صÙحة المشروع',
-'tooltip-ca-nstab-image' => 'رؤية صÙحة الملÙ',
-'tooltip-ca-nstab-mediawiki' => 'رؤية رسالة النظام',
-'tooltip-ca-nstab-template' => 'رؤية القالب',
-'tooltip-ca-nstab-help' => 'رؤية صÙحة المساعدة',
-'tooltip-ca-nstab-category' => 'رؤية صÙحة التصنيÙ',
-'tooltip-minoredit' => 'علم على هذا كتعديل Ø·ÙÙŠÙ',
-'tooltip-save' => 'احÙظ تغييراتك',
-'tooltip-preview' => 'اعرض تغييراتك، من Ùضلك استخدم هذا قبل الحÙظ!',
-'tooltip-diff' => 'اعرض التغييرات التي قمت بها للنص.',
-'tooltip-compareselectedversions' => 'شاهد الÙروق بين النسختين المختارتين من هذه الصÙحة.',
-'tooltip-watch' => 'أض٠هذه الصÙحة إلى قائمة مراقبتك',
-'tooltip-recreate' => 'أعد إنشاء الصÙحة رغم كونها حذÙت',
-'tooltip-upload' => 'ابدأ الرÙع',
-'tooltip-rollback' => '"استرجاع" تسترجع التعديل (التعديلات) ÙÙŠ هذه الصÙحة للمساهم الأخير بضغطة واحدة.',
-'tooltip-undo' => '"رجوع" تسترجع هذا التعديل وتÙتح ناÙذة التعديل ÙÙŠ نمط العرض المسبق. تسمح بإضاÙØ© سبب ÙÙŠ الملخص.',
-'tooltip-preferences-save' => 'احÙظ التغييرات',
-'tooltip-summary' => 'أدخل ملخصا قصيرا',
+'tooltip-ca-history' => 'النسخ السابقة لهذه الصÙحة',
+'tooltip-ca-protect' => 'احم هذه الصÙحة',
+'tooltip-ca-unprotect' => 'غير حماية هذه الصÙحة',
+'tooltip-ca-delete' => 'احذ٠هذه الصÙحة',
+'tooltip-ca-undelete' => 'استرجع التعديلات التي تمت على هذه الصÙحة قبل حذÙها',
+'tooltip-ca-move' => 'انقل هذه الصÙحة',
+'tooltip-ca-watch' => 'أض٠هذه الصÙحة إلى قائمة مراقبتك',
+'tooltip-ca-unwatch' => 'أزل هذه الصÙحة من قائمة مراقبتك',
+'tooltip-search' => 'ابحث ÙÙŠ {{SITENAME}}',
+'tooltip-search-go' => 'اذهب إلى صÙحة بالاسم Ù†Ùسه إن وجدت',
+'tooltip-search-fulltext' => 'ابحث ÙÙŠ الصÙحات عن هذا النص',
+'tooltip-p-logo' => 'الصÙحة الرئيسية',
+'tooltip-n-mainpage' => 'زر الصÙحة الرئيسية',
+'tooltip-n-mainpage-description' => 'زر الصÙحة الرئيسية',
+'tooltip-n-portal' => 'حول المشروع، ماذا يمكن أن تÙعل، أين يمكن أن تجد ما تحتاجه',
+'tooltip-n-currentevents' => 'مطالعة سريعة لأهم الأحداث الجارية',
+'tooltip-n-recentchanges' => 'قائمة أحدث التغييرات ÙÙŠ الويكي.',
+'tooltip-n-randompage' => 'حمل صÙحة عشوائية',
+'tooltip-n-help' => 'المكان للمساعدة',
+'tooltip-t-whatlinkshere' => 'قائمة بكل صÙحات الويكي التي تصل هنا',
+'tooltip-t-recentchangeslinked' => 'أحدث التغييرات ÙÙŠ الصÙحات الموصولة من هذه الصÙحة',
+'tooltip-feed-rss' => 'تلقيم أر إس إس لهذه الصÙحة',
+'tooltip-feed-atom' => 'تلقيم أتوم لهذه الصÙحة',
+'tooltip-t-contributions' => 'رؤية قائمة مساهمات هذا المستخدم',
+'tooltip-t-emailuser' => 'أرسل رسالة لهذا المستخدم',
+'tooltip-t-upload' => 'ارÙع ملÙات',
+'tooltip-t-specialpages' => 'قائمة بكل الصÙحات الخاصة',
+'tooltip-t-print' => 'نسخة للطباعة لهذه الصÙحة',
+'tooltip-t-permalink' => 'وصلة دائمة لهذه النسخة من الصÙحة',
+'tooltip-ca-nstab-main' => 'رؤية صÙحة المحتوى',
+'tooltip-ca-nstab-user' => 'اعرض صÙحة المستخدم',
+'tooltip-ca-nstab-media' => 'رؤية صÙحة الميديا',
+'tooltip-ca-nstab-special' => 'هذه صÙحة خاصة، لا تستطيع أن تعدل الصÙحة Ù†Ùسها',
+'tooltip-ca-nstab-project' => 'رؤية صÙحة المشروع',
+'tooltip-ca-nstab-image' => 'رؤية صÙحة الملÙ',
+'tooltip-ca-nstab-mediawiki' => 'رؤية رسالة النظام',
+'tooltip-ca-nstab-template' => 'رؤية القالب',
+'tooltip-ca-nstab-help' => 'رؤية صÙحة المساعدة',
+'tooltip-ca-nstab-category' => 'رؤية صÙحة التصنيÙ',
+'tooltip-minoredit' => 'علم على هذا كتعديل Ø·ÙÙŠÙ',
+'tooltip-save' => 'احÙظ تغييراتك',
+'tooltip-preview' => 'اعرض تغييراتك، من Ùضلك استخدم هذا قبل الحÙظ!',
+'tooltip-diff' => 'اعرض التغييرات التي قمت بها للنص.',
+'tooltip-compareselectedversions' => 'شاهد الÙروق بين النسختين المختارتين من هذه الصÙحة.',
+'tooltip-watch' => 'أض٠هذه الصÙحة إلى قائمة مراقبتك',
+'tooltip-watchlistedit-normal-submit' => 'أزل العناوين',
+'tooltip-watchlistedit-raw-submit' => 'حدث قائمة المراقبة',
+'tooltip-recreate' => 'أعد إنشاء الصÙحة رغم كونها حذÙت',
+'tooltip-upload' => 'ابدأ الرÙع',
+'tooltip-rollback' => '"استرجاع" تسترجع التعديل (التعديلات) ÙÙŠ هذه الصÙحة للمساهم الأخير بضغطة واحدة.',
+'tooltip-undo' => '"رجوع" تسترجع هذا التعديل وتÙتح ناÙذة التعديل ÙÙŠ نمط العرض المسبق. تسمح بإضاÙØ© سبب ÙÙŠ الملخص.',
+'tooltip-preferences-save' => 'احÙظ التغييرات',
+'tooltip-summary' => 'أدخل ملخصا قصيرا',
# Stylesheets
'common.css' => '/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */',
@@ -3190,9 +3218,6 @@ $1',
# Patrol log
'patrol-log-page' => 'سجل الخÙر',
'patrol-log-header' => 'هذا سجل بالمراجعات المراجعة.',
-'patrol-log-line' => 'علم على $1 من $2 كمراجعة $3',
-'patrol-log-auto' => '(تلقائيا)',
-'patrol-log-diff' => 'Ù†$1',
'log-show-hide-patrol' => '$1 سجل الخÙر',
# Image deletion
@@ -3218,11 +3243,11 @@ $1',
'file-info' => 'حجم الملÙ: $1ØŒ نوع MIME: $2',
'file-info-size' => '$1 × $2 بكسل حجم الملÙ: $3ØŒ نوع MIME: $4',
'file-info-size-pages' => '$1 × $2 بكسل, حجم المل٠: $3 ØŒ نوع المل٠: $4 ØŒ $5 {{PLURAL:$5| صÙحة | صÙحات}}',
-'file-nohires' => '<small>لا توجد دقة أعلى متوÙرة.</small>',
+'file-nohires' => 'لا توجد دقة أعلى متوÙرة.',
'svg-long-desc' => 'مل٠SVGØŒ أبعاده $1 × $2 بكسل، حجم الملÙ: $3',
'show-big-image' => 'دقة كاملة',
-'show-big-image-preview' => '<small>حجم هذه المعاينة: $1.</small>',
-'show-big-image-other' => '<small>الأبعاد الأخرى: $1.</small>',
+'show-big-image-preview' => 'حجم هذه المعاينة: $1.',
+'show-big-image-other' => '{{PLURAL:$2||البعد الآخر|البعدان الآخران|الأبعاد الأخرى}}: $1.',
'show-big-image-size' => '$1 × $2 بكسل',
'file-info-gif-looped' => 'ملÙÙˆÙ',
'file-info-gif-frames' => '{{PLURAL:$1||إطار واحد|إطاران|$1 إطارات|$1 إطارا|$1 إطار}}',
@@ -3244,9 +3269,14 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1، $2×$3',
-'seconds-abbrev' => 'Ø«',
-'minutes-abbrev' => 'د',
-'hours-abbrev' => 'س',
+'seconds-abbrev' => '$1Ø«',
+'minutes-abbrev' => '$1د',
+'hours-abbrev' => '$1س',
+'seconds' => '{{PLURAL:$1||ثانية واحدة|ثانيتين|$1 ثوانÙ|$1 ثانية}}',
+'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
+'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
+'days' => '{{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}}',
+'ago' => 'قبل $1',
# Bad image list
'bad_image_list' => 'الصيغة كالتالي:
@@ -3780,13 +3810,6 @@ $5
'scarytranscludefailed' => '[البحث عن القالب Ùشل Ù„$1]',
'scarytranscludetoolong' => '[المسار طويل للغاية]',
-# Trackbacks
-'trackbackbox' => 'المتابعات لهذه الصÙحة:<br />
-$1',
-'trackbackremove' => '([$1 حذÙ])',
-'trackbacklink' => 'متابعة',
-'trackbackdeleteok' => 'المتابعة تم حذÙها بنجاح.',
-
# Delete conflict
'deletedwhileediting' => "'''تحذير''': هذه الصÙحة تم حذÙها بعد أن بدأت أنت بتعديلها!",
'confirmrecreate' => "حذ٠المستخدم [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصÙحة بعد أن بدأت أنت بتحريرها للسبب التالي:
@@ -3939,6 +3962,7 @@ $1',
'hebrew-calendar-m12-gen' => 'أيلول',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])',
'timezone-utc' => 'ت ع م',
# Core parser functions
@@ -4040,13 +4064,16 @@ $1',
'tags-hitcount' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
# Special:ComparePages
-'comparepages' => 'قارن صÙحات',
-'compare-selector' => 'قارن مراجعات الصÙحة',
-'compare-page1' => 'صÙحة 1',
-'compare-page2' => 'صÙحة 2',
-'compare-rev1' => 'مراجعة 1',
-'compare-rev2' => 'مراجعة 2',
-'compare-submit' => 'قارن',
+'comparepages' => 'قارن صÙحات',
+'compare-selector' => 'قارن مراجعات الصÙحة',
+'compare-page1' => 'صÙحة 1',
+'compare-page2' => 'صÙحة 2',
+'compare-rev1' => 'مراجعة 1',
+'compare-rev2' => 'مراجعة 2',
+'compare-submit' => 'قارن',
+'compare-invalid-title' => 'العنوان الذي حددته غير متاح.',
+'compare-title-not-exists' => 'العنوان الذي حددته غير موجود.',
+'compare-revision-not-exists' => 'المراجعة التي حددتها غير موجودة.',
# Database error messages
'dberr-header' => 'هذا الويكي به مشكلة',
@@ -4073,4 +4100,84 @@ $1',
'sqlite-has-fts' => '$1 بدعم البحث ÙÙŠ كامل النص',
'sqlite-no-fts' => '$1 بدون دعم البحث ÙÙŠ كامل النص',
+# New logging system
+'logentry-delete-delete' => 'حذ٠$1 صÙحة $3',
+'logentry-delete-restore' => 'استعاد $1 صÙحة $3',
+'logentry-delete-event' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} ÙÙŠ سجل $3: $4',
+'logentry-delete-revision' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} ÙÙŠ صÙحة $3: $4',
+'logentry-delete-event-legacy' => 'غيّر $1 إمكانية رؤية أحداث سجل $3',
+'logentry-delete-revision-legacy' => 'غيّر $1 إمكانية رؤية مراجعات صÙحة $3',
+'logentry-suppress-delete' => '$1 suppressed صÙحة $3',
+'logentry-suppress-event' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} ÙÙŠ سجل $3: $4',
+'logentry-suppress-revision' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} ÙÙŠ صÙحة $3: $4',
+'logentry-suppress-event-legacy' => 'غيّر $1 بسرية إمكانية رؤية أحداث سجل $3',
+'logentry-suppress-revision-legacy' => 'غيّر $1 بسرية إمكانية رؤية مراجعات صÙحة $3',
+'revdelete-content-hid' => 'محتوى مخÙÙŠ',
+'revdelete-summary-hid' => 'ملخص التحرير مخÙÙŠ',
+'revdelete-uname-hid' => 'اسم المستخدم مخÙÙŠ',
+'revdelete-content-unhid' => 'محتوى غير مخÙÙŠ',
+'revdelete-summary-unhid' => 'ملخص التحرير غير مخÙÙŠ',
+'revdelete-uname-unhid' => 'اسم المستخدم غير مخÙÙŠ',
+'revdelete-restricted' => 'طبق الضوابط لمديري النظام',
+'revdelete-unrestricted' => 'أزال الضوابط لمديري النظام',
+'logentry-move-move' => 'نقل $1 صÙحة $3 إلى $4',
+'logentry-move-move-noredirect' => 'نقل $1 صÙحة $3 إلى $4 دون ترك تحويلة',
+'logentry-move-move_redir' => 'نقل $1 صÙحة $3 إلى التحويلة $4',
+'logentry-move-move_redir-noredirect' => 'نقل $1 صÙحة $3 إلى التحويلة $4 دون ترك تحويلة',
+'logentry-newusers-newusers' => 'أنشأ $1 حساب مستخدم',
+'logentry-newusers-create' => 'أنشأ $1 حساب مستخدم',
+'logentry-newusers-create2' => 'أنشأ $1 حساب المستخدم $3',
+'logentry-newusers-autocreate' => 'أنشئ حساب $1 تلقائياً',
+'newuserlog-byemail' => 'كلمة السر تم إرسالها بواسطة البريد الإلكتروني',
+
+# Feedback
+'feedback-subject' => 'الموضوع:',
+'feedback-message' => 'الرسالة:',
+'feedback-cancel' => 'ألغÙ',
+'feedback-submit' => 'أرسل الملاحظات',
+'feedback-adding' => 'إضاÙØ© تعليقات إلى الصÙحة...',
+'feedback-error1' => 'خطأ: لا يمكن التعر٠عليها من API',
+'feedback-error2' => 'خطأ: Ùشل ÙÙŠ تحرير',
+'feedback-error3' => 'خطأ : لا توجد استجابة من API',
+'feedback-thanks' => 'شكرا! Ø£Ùرسلت ملاحظاتك لصÙحة "[$2 $1]".',
+'feedback-close' => 'تم',
+'feedback-bugcheck' => 'رائع! تحقق من أن هذه ليست إحدى [$1 العلل المعروÙØ©].',
+'feedback-bugnew' => 'لقد تحققت. بلّغ عن علة جديدة.',
+
+# API errors
+'api-error-badaccess-groups' => 'لا يسمح لك بتحميل الملÙات إلى هذه الويكي.',
+'api-error-badtoken' => 'خطأ داخلي: رمز مميز غير صحيح.',
+'api-error-copyuploaddisabled' => 'تم تعطيل تحميل من رابط على هذا الخادم.',
+'api-error-duplicate' => 'هناك {{PLURAL:$1|هو [$2 مل٠آخر [|كذلك]$2 بعض الملÙات الأخرى]}} مسبقاً على الموقع بنÙس المضمون.',
+'api-error-duplicate-archive' => 'هناك {{PLURAL:$1|كان [$2 مل٠آخر] |كذلك [$2 بعض الملÙات الأخرى]}} مسبقاً على الموقع بنÙس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذ٠لها.',
+'api-error-duplicate-archive-popup-title' => 'تكرار {{PLURAL:$1|ملÙ|ملÙات}} قد تم حذÙÙ‡ مسبقاً',
+'api-error-duplicate-popup-title' => 'ارÙع {{PLURAL:$1|الملÙ|الملÙ|الملÙين|الملÙات|الملÙات|الملÙات}}',
+'api-error-empty-file' => 'كان مل٠الذي قمت بإرسال Ùارغة.',
+'api-error-fetchfileerror' => 'خطأ داخلي: قد حدث خطأ أثناء إحضار الملÙ.',
+'api-error-file-too-large' => 'المل٠الذي أرسلته كان كبيرا جدا.',
+'api-error-filename-tooshort' => 'اسم المل٠قصير جدا.',
+'api-error-filetype-banned' => 'نوع المل٠هذا ممنوع.',
+'api-error-filetype-missing' => 'ÙŠÙتقد الملÙÙ‘ ملحق نوعيّته.',
+'api-error-hookaborted' => 'التعديل الذي تحاول أن تقوم به تم إحباطه',
+'api-error-http' => 'خطأ داخلي: تعذر الاتصال بالخادوم.',
+'api-error-illegal-filename' => 'اسم المل٠غير مسموح به.',
+'api-error-internal-error' => 'خطأ داخلي: حدث خطأ عند معالجة التحميل الخاص بك على الويكي.',
+'api-error-invalid-file-key' => 'خطأ داخلي: لم يتم العثور على المل٠ÙÙŠ التخزين المؤقت.',
+'api-error-missingparam' => 'خطأ داخلي : متغيرات Ù…Ùقودة ضمن الطلب.',
+'api-error-missingresult' => 'خطأ داخلي : لا يمكن التحديد ما إذا كان النسخ ناجحاً.',
+'api-error-mustbeloggedin' => 'يجب أن تكون مسجلا ÙÙŠ لتحميل الملÙات.',
+'api-error-mustbeposted' => 'خطأ داخلي: يتطلب طلب HTTP POST.',
+'api-error-noimageinfo' => 'نجح التحميل، ولكن الخادم لم يقدم لنا أي معلومات حول الملÙ.',
+'api-error-nomodule' => 'خطأ داخلي: لم يتم تعيين تحميل الوحدة النمطية.',
+'api-error-ok-but-empty' => 'خطأ داخلي : لم يكن هناك استجابة من الملقم.',
+'api-error-overwrite' => 'لا يسمح بالكتابة Ùوق مل٠موجود.',
+'api-error-stashfailed' => 'خطأ داخلي: Ùشل الملقم ÙÙŠ تخزين الملÙات المؤقتة.',
+'api-error-timeout' => 'لم يستجب الملقم ÙÙŠ الوقت المتوقع.',
+'api-error-unclassified' => 'حدث خطأ غير معروÙ',
+'api-error-unknown-code' => 'خطأ غير معرو٠: " $1 "',
+'api-error-unknown-error' => 'خطأ داخلي: قد حدث خطأ عند محاولة تحميل المل٠الخاص بك.',
+'api-error-unknown-warning' => 'تحذير غير معروÙ:$1',
+'api-error-uploaddisabled' => 'تم تعطيل تحميل على هذا الويكي.',
+'api-error-verification-error' => 'هذا المل٠قد يكون معطوباً أو يحتوي على ملحق غير صحيح.',
+
);
diff --git a/languages/messages/MessagesArc.php b/languages/messages/MessagesArc.php
index 3ee96141..c36d2deb 100644
--- a/languages/messages/MessagesArc.php
+++ b/languages/messages/MessagesArc.php
@@ -69,30 +69,30 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ܨܘÜÜ’Ü', '#REDIRECT' ),
- 'numberofpages' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܦÜܬܬ̈Ü', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܡܠܘÜ̈Ü', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܠܦܦ̈Ü', 'NUMBEROFFILES' ),
- 'pagename' => array( '1', 'Ü«Ü¡Ü_ܕܦÜܬÜ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ܟܘܢÜÜ_ܕܦÜܬÜ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ܚܩܠÜ', 'NAMESPACE' ),
- 'msg' => array( '0', 'ÜܓܪܬÜ:', 'MSG:' ),
- 'img_thumbnail' => array( '1', 'ܙܥܘܪܬÜ', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'ܙܥܘܪܬÜ=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'ÜÜ¡ÜÜ¢Ü', 'right' ),
- 'img_left' => array( '1', 'ܣܡܠÜ', 'left' ),
- 'img_none' => array( '1', 'Ü Ü_Ü¡Ü•Ü¡', 'none' ),
- 'img_center' => array( '1', 'ܡܨܥÜ', 'center', 'centre' ),
- 'img_page' => array( '1', 'ܦÜܬÜ=$1', 'ܦÜÜ¬Ü $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'ܬܚܘܡÜ', 'border' ),
- 'img_baseline' => array( '1', 'ܣܪܛÜ_ܫܪܫÜÜ', 'baseline' ),
- 'img_sub' => array( '1', 'ܦܪܥÜÜ', 'sub' ),
- 'grammar' => array( '0', 'ܬܘܪܨ_Ü¡Ü¡Ü Ü Ü:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ܓܢܣÜ:', 'GENDER:' ),
- 'language' => array( '0', '#Ü Ü«Ü¢Ü:', '#LANGUAGE:' ),
- 'special' => array( '0', 'Ü•ÜܠܢÜÜ', 'special' ),
- 'url_path' => array( '0', 'Ü«Ü’ÜÜ Ü', 'PATH' ),
- 'url_wiki' => array( '0', 'ܘÜÜ©Ü', 'WIKI' ),
+ 'redirect' => array( '0', '#ܨܘÜÜ’Ü', '#REDIRECT' ),
+ 'numberofpages' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܦÜܬܬ̈Ü', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܡܠܘÜ̈Ü', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Ü¡Ü¢ÜÜ¢Ü_ܕܠܦܦ̈Ü', 'NUMBEROFFILES' ),
+ 'pagename' => array( '1', 'Ü«Ü¡Ü_ܕܦÜܬÜ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ܟܘܢÜÜ_ܕܦÜܬÜ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ܚܩܠÜ', 'NAMESPACE' ),
+ 'msg' => array( '0', 'ÜܓܪܬÜ:', 'MSG:' ),
+ 'img_thumbnail' => array( '1', 'ܙܥܘܪܬÜ', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'ܙܥܘܪܬÜ=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'ÜÜ¡ÜÜ¢Ü', 'right' ),
+ 'img_left' => array( '1', 'ܣܡܠÜ', 'left' ),
+ 'img_none' => array( '1', 'Ü Ü_Ü¡Ü•Ü¡', 'none' ),
+ 'img_center' => array( '1', 'ܡܨܥÜ', 'center', 'centre' ),
+ 'img_page' => array( '1', 'ܦÜܬÜ=$1', 'ܦÜÜ¬Ü $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'ܬܚܘܡÜ', 'border' ),
+ 'img_baseline' => array( '1', 'ܣܪܛÜ_ܫܪܫÜÜ', 'baseline' ),
+ 'img_sub' => array( '1', 'ܦܪܥÜÜ', 'sub' ),
+ 'grammar' => array( '0', 'ܬܘܪܨ_Ü¡Ü¡Ü Ü Ü:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ܓܢܣÜ:', 'GENDER:' ),
+ 'language' => array( '0', '#Ü Ü«Ü¢Ü:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'Ü•ÜܠܢÜÜ', 'special' ),
+ 'url_path' => array( '0', 'Ü«Ü’ÜÜ Ü', 'PATH' ),
+ 'url_wiki' => array( '0', 'ܘÜÜ©Ü', 'WIKI' ),
);
$messages = array(
@@ -352,7 +352,6 @@ $1',
'internalerror_info' => 'Ü¦Ü˜Ü•Ü Ü“Ü˜ÜÜ: $1',
'badtitle' => 'ܟܘܢÜÜ Ü Ü Ü›Ü’Ü',
'viewsource' => 'ÜšÜ™Ü Ü¡Ü’Ü˜Ü¥Ü',
-'viewsourcefor' => 'Ü• $1',
'actionthrottled' => 'Ü Ü Ü˜ÜªÜ• ܠܡܥܒܕ ÜܬÜܪ Ü¡Ü¢ ÜÜ—Ü Ü¥Ü’Ü•Ü',
'viewsourcetext' => 'Ü¡Ü¨Ü Üܢܬ ܠܚܙÜÜ Ü˜Ü¢Ü£ÜšÜ Ü Ü¡Ü’Ü˜Ü¥ÌˆÜ Ü•ÜÜ—Ü Ü¦ÜܬÜ:',
'protectedinterface' => 'ÜÜ—Ü Ü¦ÜÜ¬Ü Ü¡Ü˜Ü¬ÜªÜ ÜŸÜ¬ÜÜ’Ü¬Ü Ü•Ü¦ÜÜ¬Ü Ü ÜšÜ˜ÜªÜ™Ü, ܘÜÜÜ Ü— Ü¢Ü›ÜªÜ¬Ü Ü Ü¡Ü˜Ü¢Ü¥Ü ÜšÜªÜ’Ü.',
@@ -453,7 +452,6 @@ $1',
'summary-preview' => 'ÜšÜÜªÜ Ü©Ü•Ü¡ÜÜ Ü•Ü¦Ü£ÜÜ©Ü¬ÌˆÜ :',
'blockedtitle' => 'Ü¡Ü¦Ü ÜšÜ¢Ü Ü—Ü˜ ܡܚܪܡÜ',
'blockednoreason' => 'Ü Üܬ Ü¥Ü Ü¬Ü ÜÜ—ÜܒܬÜ',
-'blockedoriginalsource' => "Ü¡Ü’Ü˜Ü¥Ü Ü•'''$1''' Ü“Ü ÜÜšÜ Ü Ü¬ÜšÜ¬:",
'nosuchsectiontitle' => 'Ü Ü Ü¡Ü¨Ü ÜÜ«ÜŸÜš ܡܢܬÜ',
'loginreqlink' => 'ܥܘܠ',
'accmailtitle' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü«Ü•ÜªÜ¬',
@@ -531,11 +529,6 @@ $1',
'revdel-restore-visible' => 'ܬܢÜÜ¬ÌˆÜ Ü¡Ü¬ÜšÜ™ÜÜ¢Üܬ̈Ü',
'pagehist' => 'ܬܫܥÜÜ¬Ü Ü•Ü¦ÜܬÜ',
'deletedhist' => 'ܬܫܥÜÜ¬Ü Ü«ÜܦܬÜ',
-'revdelete-content' => 'ܚܒÜܫܬ̈Ü',
-'revdelete-summary' => 'ܫܚܠܦ ܦܣÜܩܬ̈Ü',
-'revdelete-uname' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
-'revdelete-log-message' => '$1 Ü  $2 {{PLURAL:$2|ܬܢÜܬÜ|ܬܢÜܬ̈Ü}}',
-'logdelete-log-message' => '$1 Ü  $2 {{PLURAL:$2|Ü“Ü•Ü«Ü|ܓܕ̈ܫÜ}}',
'revdelete-otherreason' => 'Ü¥Ü Ü¬Ü ÜܚܪܬÜ/ܢܩÜܦܬÜ:',
'revdelete-reasonotherlist' => 'Ü¥Ü Ü¬Ü ÜܚܪܬÜ',
'revdelete-edit-reasonlist' => 'ܫܚܠܦ Ü¥Ü Ü Ü¬ÌˆÜ Ü•Ü«ÜܦÜ',
@@ -637,7 +630,7 @@ $1',
'prefs-rc' => 'Ü«Ü˜ÜšÜ Ü¦ÌˆÜ ÜšÜ•ÌˆÜ¬Ü',
'prefs-watchlist' => 'ܪ̈ܗÜܬÜ',
'prefs-watchlist-days' => 'ÜÜ˜Ü¡Ü¬ÌˆÜ Ü ÜšÜ™ÜÜ Ü’ÜªÌˆÜ—ÜܬÜ:',
-'prefs-watchlist-days-max' => 'Ü Ü¡Ü¬ÜšÜ Ü¥Ü ÜÜ Ü•7 Üܘܡܬ̈Ü',
+'prefs-watchlist-days-max' => 'Ü Ü¡Ü¬ÜšÜ Ü¥Ü ÜÜ Ü• $1 {{PLURAL:$1|ÜܘܡÜ|Üܘܡܬ̈Ü}}',
'prefs-misc' => 'ܦܪ̈ÜܫܬÜ',
'prefs-resetpass' => 'ܫܚܠܦ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü',
'prefs-email' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
@@ -971,7 +964,7 @@ $1',
'listusers-editsonly' => 'ÜšÜ˜Ü Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü¥Ü¡ Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü’Ü ÜšÜ˜Ü•',
'listusers-creationsort' => 'ܛܟܣ ÜÜÜŸ Ü£ÜÜ©Ü˜Ü¡Ü Ü•Ü’ÜªÜÜ',
'usereditcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦÜ|ܫܘܚܠܦ̈Ü}}',
-'usercreated' => 'Ü’ÜªÜ Ü’Ü£Üܩܘܡ $1 Ü«Ü¥Ü¬Ü $2',
+'usercreated' => '{{ܓܢܣÜ:$3|ܒܪÜ}} Ü’Ü£Üܩܘܡ $1 Ü’Ü«Ü¥Ü¬Ü $2',
'newpages' => 'ܦÜÜ¬Ü¬ÌˆÜ ÜšÜ•ÌˆÜ¬Ü¬Ü',
'newpages-username' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
'ancientpages' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü¥Ü¬ÜÜ© Ü¡Ü¢ ÜŸÜ ',
@@ -1042,10 +1035,7 @@ $1',
'activeusers-noresult' => 'Ü Ü Ü¡Ü¦Ü ÜšÜ¢Ü Üܫܬܟܚ.',
# Special:Log/newusers
-'newuserlogpage' => 'Ü£Ü“Ü Ü Ü•Ü’ÜªÜÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
-'newuserlog-byemail' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Üܫܬܕܪܬ Ü’ÜÜ• Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
-'newuserlog-create-entry' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü ÜšÜ•Ü¬Ü',
-'newuserlog-create2-entry' => 'Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢Ü ÜšÜ•Ü¬Ü $1',
+'newuserlogpage' => 'Ü£Ü“Ü Ü Ü•Ü’ÜªÜÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
# Special:ListGroupRights
'listgrouprights' => 'Ü™Ü•ÌˆÜ©Ü Ü•ÜŸÜ¢Ü˜Ü«Ü¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ',
@@ -1064,7 +1054,7 @@ $1',
'mailnologin' => 'Ü Üܬ ܦܪܫܓܢÜ',
'emailuser' => 'ܫܕܪ ÜÜ“ÜªÜ¬Ü Ü Ü—Ü¢Ü Ü¡Ü¦Ü ÜšÜ¢Ü',
'emailpage' => 'ܫܕܪ ÜÜ“ÜªÜ¬Ü Ü’Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Ü Ü¡Ü¦Ü ÜšÜ¢Ü',
-'defemailsubject' => 'Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Ü¡Ü¢ {{SITENAME}}',
+'defemailsubject' => 'Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Ü¡Ü¢ Ü¡Ü¦Ü ÜšÜ¢Ü "$1"',
'noemailtitle' => 'Ü Üܬ Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
'email-legend' => 'ܫܕܪ ÜÜ“ÜªÜ¬Ü Ü Ü¡Ü¦Ü ÜšÜ¢Ü Ü• {{SITENAME}} ÜܚܪܢÜ',
'emailfrom' => 'Ü¡Ü¢:',
@@ -1116,7 +1106,6 @@ $1',
'delete-legend' => 'ܫܘܦ',
'actioncomplete' => 'ܥܡܠÜÜ¬Ü Ü“Ü¡ÜªÜ¬',
'actionfailed' => 'ܥܡܠÜÜ¬Ü Ü Ü Ü¢Ü¨ÜšÜ¬',
-'deletedarticle' => 'ܫܦ "[[$1]]"',
'dellogpage' => 'Ü£Ü“Ü Ü Ü•Ü«ÜܦÜ',
'deletionlog' => 'Ü£Ü“Ü Ü Ü•Ü«ÜܦÜ',
'deletecomment' => 'ܥܠܬÜ:',
@@ -1281,28 +1270,25 @@ Do you want to change the settings?',
'proxyblocksuccess' => 'ܒܪÜ',
# Move page
-'move-page' => 'Ü«Ü¢Ü $1',
-'move-page-legend' => 'Ü«Ü¢Ü Ü¦ÜܬÜ',
-'movearticle' => 'Ü«Ü¢Ü Ü¦ÜܬÜ:',
-'movenologin' => 'Ü ÜܬÜÜŸ ܥܠÜÜ Ü',
-'newtitle' => 'Ü Ü«Ü¡Ü ÜšÜ•Ü¬Ü:',
-'move-watch' => 'ÜªÜ—Ü Ü¦ÜÜ¬Ü Ü—Ü•Ü',
-'movepagebtn' => 'Ü«Ü¢Ü Ü¦ÜܬÜ',
-'pagemovedsub' => 'ܫܘܢÜÜ Ü“Ü¡Üª',
-'movepage-moved' => '\'\'\'"$1" ÜܫܬܢÜܬ Ü  "$2"\'\'\'',
-'movepage-moved-redirect' => 'ܨܘÜÜ’Ü ÜܬܒܪÜ',
-'movedto' => 'ÜÜ¬Ü«Ü¢Ü Ü ',
-'move-subpages' => 'Ü«Ü¢Ü Ü•ÌˆÜ¦Ü Ü¦ÜªÌˆÜ¥ÜÜ (Ü¥Ü•Ü¡Ü Ü  $1)',
-'move-talk-subpages' => 'Ü«Ü¢Ü Ü•ÌˆÜ¦Ü Ü¦ÜªÌˆÜ¥ÜÜ Ü•Ü•Ü¦Ü Ü•Ü•Ü˜ÜªÜ«Ü (Ü¥Ü•Ü¡Ü Ü  $1)',
-'1movedto2' => 'Ü«Ü¢Ü [[$1]] Ü  [[$2]]',
-'1movedto2_redir' => 'Ü«Ü¢Ü [[$1]] Ü  [[$2]] ܥܠ ܪܫ ܨܘÜÜ’Ü',
-'move-redirect-suppressed' => 'ÜܬܚܦÜܬ ܠܨܘÜÜ’Ü',
-'movelogpage' => 'Ü£Ü“Ü Ü Ü•Ü«Ü˜Ü¢ÜÜ',
-'movereason' => 'ܥܠܬÜ:',
-'revertmove' => 'ÜܦܢÜ',
-'delete_and_move' => 'ܫܘܦ ܘܫܢÜ',
-'delete_and_move_confirm' => 'ÜÜÜ¢, ܫܘܦ ܦÜܬÜ',
-'move-leave-redirect' => 'ܫܒܘܩ ܨܘÜÜ’Ü Ü’Ü¬ÜªÜŸ',
+'move-page' => 'Ü«Ü¢Ü $1',
+'move-page-legend' => 'Ü«Ü¢Ü Ü¦ÜܬÜ',
+'movearticle' => 'Ü«Ü¢Ü Ü¦ÜܬÜ:',
+'movenologin' => 'Ü ÜܬÜÜŸ ܥܠÜÜ Ü',
+'newtitle' => 'Ü Ü«Ü¡Ü ÜšÜ•Ü¬Ü:',
+'move-watch' => 'ÜªÜ—Ü Ü¦ÜÜ¬Ü Ü—Ü•Ü',
+'movepagebtn' => 'Ü«Ü¢Ü Ü¦ÜܬÜ',
+'pagemovedsub' => 'ܫܘܢÜÜ Ü“Ü¡Üª',
+'movepage-moved' => '\'\'\'"$1" ÜܫܬܢÜܬ Ü  "$2"\'\'\'',
+'movepage-moved-redirect' => 'ܨܘÜÜ’Ü ÜܬܒܪÜ',
+'movedto' => 'ÜÜ¬Ü«Ü¢Ü Ü ',
+'move-subpages' => 'Ü«Ü¢Ü Ü•ÌˆÜ¦Ü Ü¦ÜªÌˆÜ¥ÜÜ (Ü¥Ü•Ü¡Ü Ü  $1)',
+'move-talk-subpages' => 'Ü«Ü¢Ü Ü•ÌˆÜ¦Ü Ü¦ÜªÌˆÜ¥ÜÜ Ü•Ü•Ü¦Ü Ü•Ü•Ü˜ÜªÜ«Ü (Ü¥Ü•Ü¡Ü Ü  $1)',
+'movelogpage' => 'Ü£Ü“Ü Ü Ü•Ü«Ü˜Ü¢ÜÜ',
+'movereason' => 'ܥܠܬÜ:',
+'revertmove' => 'ÜܦܢÜ',
+'delete_and_move' => 'ܫܘܦ ܘܫܢÜ',
+'delete_and_move_confirm' => 'ÜÜÜ¢, ܫܘܦ ܦÜܬÜ',
+'move-leave-redirect' => 'ܫܒܘܩ ܨܘÜÜ’Ü Ü’Ü¬ÜªÜŸ',
# Export
'export' => 'Üܦܩ ܦÜܬܬ̈Ü',
@@ -1350,10 +1336,6 @@ Do you want to change the settings?',
'anonusers' => '{{SITENAME}} {{PLURAL:$2|Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü|Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü Ü Üܕ̈ÜÜ¥Ü}} $1',
'creditspage' => 'Ü™Ü•ÌˆÜ©Ü Ü•Ü¦ÜܬÜ',
-# Patrol log
-'patrol-log-auto' => '(ÜܬÜÜܬ)',
-'patrol-log-diff' => 'ܬܢÜÜ¬Ü $1',
-
# Image deletion
'filedeleteerror-short' => 'Ü¦Ü˜Ü•Ü Ü’Ü«ÜÜ¦Ü Ü•Ü Ü¦Ü¦Ü: $1',
'filedeleteerror-long' => 'Ü¦Ü˜Ü•ÌˆÜ Üܫܟܚܬ ÜŸÜ• Ü«ÜÜ¦Ü Ü Ü¦Ü¦Ü:
@@ -1367,7 +1349,7 @@ $1',
# Media information
'thumbsize' => 'Ü¥Ü“ÜªÜ Ü•Ü¨Ü˜ÜªÜ¬Ü Ü™Ü¥Ü˜ÜªÜ¬Ü:',
'file-info' => 'Ü¥Ü“ÜªÜ Ü•Ü Ü¦Ü¦Ü: $1, MIME ÜÜ•Ü«Ü: $2',
-'file-nohires' => '<small>Ü Üܬ Ü¢Ü©Ü•Ü˜Ü¬Ü ÜܬÜܪ Ü¡Ü¢ Ü—Ü¢Ü.</small>',
+'file-nohires' => 'Ü Üܬ Ü¢Ü©Ü•Ü˜Ü¬Ü ÜܬÜܪ Ü¡Ü¢ Ü—Ü¢Ü.',
'show-big-image' => 'Ü¢Ü©Ü•Ü˜Ü¬Ü Ü“Ü¡ÜܪܬÜ',
# Special:NewFiles
@@ -1456,9 +1438,6 @@ $1',
'confirmemail_invalidated' => 'ÜšÜ˜Ü¬Ü¬Ü Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Ü’Ü›Ü ',
'invalidateemail' => 'ܒܛܘܠ ÜšÜ˜Ü¬Ü¬Ü Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
-# Trackbacks
-'trackbackremove' => '([$1 ܫܘܦ])',
-
# Delete conflict
'recreate' => 'Ü’ÜªÜ Ü™Ü’Ü¢Ü¬Ü ÜܚܪܬÜ',
@@ -1548,4 +1527,7 @@ $1',
'htmlform-reset' => 'Ü Ü Ü¬Ü¥Ü’Ü• ܫܘܚܠܦ̈Ü',
'htmlform-selectorother-other' => 'ÜܚܪܢÜ',
+# New logging system
+'newuserlog-byemail' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Üܫܬܕܪܬ Ü’ÜÜ• Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
+
);
diff --git a/languages/messages/MessagesArn.php b/languages/messages/MessagesArn.php
index af3bd98e..be1215fb 100644
--- a/languages/messages/MessagesArn.php
+++ b/languages/messages/MessagesArn.php
@@ -367,8 +367,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
'revdel-restore-visible' => 'pengengekelu malün',
'pagehist' => 'pünon pakina',
'deletedhist' => 'Ñamümüngelu pünon',
-'revdelete-uname' => 'Ãœy kellufe',
-'revdelete-hid' => 'Ellkan $1',
'revdelete-edit-reasonlist' => 'Wirin dungu ñamümgün mew',
# History merging
@@ -587,7 +585,7 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'nviews' => '$1 {{PLURAL:$1|pen|pen}}',
'prefixindex' => 'Kom wülngiñ engu wüne konkülelu nemül',
'shortpages' => 'Pichi pakina',
-'usercreated' => 'Llintun $1 mew $2 mew',
+'usercreated' => '{{GENDER:$3|Dewmangey}} $1, $2 mew',
'newpages' => 'Weke wülngiñ',
'newpages-username' => 'Kellufe ñi üy',
'move' => 'Wiñamün',
@@ -663,7 +661,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'delete-legend' => 'Ñamümün',
'actioncomplete' => 'Wechuley chi femün',
'actionfailed' => 'Wedalkay chi femün.',
-'deletedarticle' => '«[[$1]]» Ñamümün',
'dellogpage' => 'Liftungepelu wülngiñ ñi wirintukun',
'deletereasonotherlist' => 'Kake dungu',
@@ -762,7 +759,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'move-watch' => 'Llaytun tüfachi pakina',
'movepagebtn' => 'Nengümün pakina',
'movedto' => 'Nengümün',
-'1movedto2' => '[[$1]] wiñamngey [[$2]] püle',
'movelogpage' => 'Nengümün wirintukun',
'revertmove' => 'wüñoeltun',
'delete_and_move' => 'Ñamümün ka nengümün',
@@ -841,15 +837,13 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'others' => 'fill',
'siteusers' => '{{PLURAL:$2|Kellufe|Kellufe}} $1 {{SITENAME}}',
-# Patrol log
-'patrol-log-diff' => 'ng$1',
-
# Browsing diffs
'previousdiff' => '↠Füta wirin',
'nextdiff' => 'We wirin →',
# Media information
'file-info-size' => '$1 × $2 adentun piküsel, eltukawün ñi tunte ngen: $3, MIME ñi chumngen: $4',
+'file-nohires' => 'Pepiduamngefalay chum pengeam.',
'svg-long-desc' => 'SVG eltukawe, pingey $1 × $2 adentun piküsel, eltukawün ñi tunte ngen: $3',
'show-big-image' => 'Rüf chum pengeam',
@@ -857,7 +851,7 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'ilsubmit' => 'Kintu',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'o',
+'hours-abbrev' => '$1o',
# Bad image list
'bad_image_list' => 'Feychi chumkünuwe ta femngechi:
@@ -914,9 +908,6 @@ Ka dungu ellkangeay wünedullin reke.
'monthsall' => '(kom)',
'limitall' => 'Kom',
-# Trackbacks
-'trackbackremove' => '([$1 Ñamümün])',
-
# action=purge
'confirm_purge_button' => 'Feley may',
diff --git a/languages/messages/MessagesAry.php b/languages/messages/MessagesAry.php
index 158f8925..c8c4c90d 100644
--- a/languages/messages/MessagesAry.php
+++ b/languages/messages/MessagesAry.php
@@ -387,7 +387,7 @@ Ila ma kanṫċ, imken ikon ċi bog fe l-program.
ymkn ikon ċi waḫd aĥor ḫdfo.',
'badtitle' => 'aanwan mamzyanch',
'badtitletext' => 'L-Äœonwan li tlebṫi Ä¡alet, Ä¥awi, ola waqila hada Äonwan fe bezzaf de l-loÄ¡aṫ ola fe bezzaf de l-maÄ‹ariÄ. Imken ikon fih Ä‹i ḫrof li ma imken lekÄ‹ ṫesṫeÄmelhom fe l-Äanawin.',
-'perfcached' => 'l-bayanaṫ ṫ-ṫalia kayna f-lcache o-maymknċ ṫ-ḫddṫha.',
+'perfcached' => 'l-bayanaṫ ṫ-ṫalia kayna f-lcache o-maymknċ ṫ-ḫddṫha. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
'perfcachedts' => 'l-bayanaṫ ṫ-ṫalia kayna f-lcache, o-ṫḫddṫaṫ aĥir mrra f-$1.',
'querypage-no-updates' => 'ṫḫdiṫad dial had á¹£fḫa ma Ä¥á¸á¸amaÄ‹ daba.
l-bayanaṫ lli kayna hna daba maÄ¥adiÄ‹ ṫṫḫá¸á¸á¹«.',
@@ -395,7 +395,6 @@ l-bayanaṫ lli kayna hna daba maÄ¥adiÄ‹ ṫṫḫá¸á¸á¹«.',
Function: $1<br />
Query: $2',
'viewsource' => 'ÄŠof l-Äin',
-'viewsourcefor' => 'l $1',
'actionthrottled' => 'had l-feÄl ṫṫḫbs',
'actionthrottledtext' => 'baÄ‹ nṫfadaw á¹£-á¹£pam, Äadad l-mṛṛaṫ lli ymkn ddir fiha had l-feÄl f-modda qá¹£iá¹›a rah mḫdod, o-nta rak fṫṫi had l-Äadar.
Äawd jṛṛḅ mn beÄd Ä‹wiya dial dqayq.',
@@ -526,6 +525,7 @@ ma ṫá¸reb ḫsab l-had l-mesaj ila ṫṣÄyb had l-ḫisab Äen tariq l-Ä¥at
# E-mail sending
'php-mail-error-unknown' => "Ä¥ata' ma mÄrof-Ä‹ fl-mail() function taÄ l-PHP.",
+'user-mail-no-addy' => 'ḫawlṫi ṫsift email bla Äonwan l-email.',
# Change password dialog
'resetpass' => 'tbdl lmot de passe',
@@ -576,6 +576,16 @@ talab, wlla ila ṫfkkarṫi klmṫ s-srr l-qdima, o-ma bqiti-ċ baġi ṫbddalh
klmṫ s-srr l-mo'qaṫa: $2",
'passwordreset-emailsent' => 'ṫsift email liṫ-ṫdkir.',
+# Special:ChangeEmail
+'changeemail' => 'bddel Äonwan l-email',
+'changeemail-header' => 'bddel Äonwan l-email dl-ḫisab',
+'changeemail-no-info' => 'ĥaṣṣ tkon daĥol baĥ tqdr twṣl l-had ṣfḫa niċan.',
+'changeemail-oldemail' => 'Äonwan l-email l-ḫali:',
+'changeemail-newemail' => 'Äonwan dial l-email jdid:',
+'changeemail-none' => '(walo)',
+'changeemail-submit' => 'bddel l-email',
+'changeemail-cancel' => 'lġi',
+
# Edit page toolbar
'bold_sample' => 'Kṫaba Ä¡liá¸a',
'bold_tip' => 'Kṫaba Ä¡liá¸a',
@@ -646,9 +656,6 @@ ymkn lik ṫṫaṣl b-$1 wlla ċi [[{{MediaWiki:Grouppage-sysop}}|idari]] aĥor
Äonwan l-IP ṫaÄk daba howa $3, o-lmoÄrrif d-lblok howa #$5.
mli ṫkṫb Ä‹i talab Ä¥aṣṣk ṫÄti fih gaÄ had ṫ-ṫafaá¹£il lli l-foq.",
'blockednoreason' => 'ta sabab mamaatich',
-'blockedoriginalsource' => "l-má¹£á¸á¹› dial '''$1''' mbyyn l-ṫḫṫ:",
-'blockededitsource' => "n-naṣṣ dial '''ṫÄdilaṫk''' f-'''$1''' mbyyn l-ṫḫṫ:",
-'whitelistedittitle' => 'khassk tdkhl bach thrr',
'whitelistedittext' => 'khassk $1 bach taadl sfahi',
'confirmedittext' => "Ä¥aṣṣk ṫ'kkd l-Äonwan dl-email dialk qbl ma ṫÄddl á¹£-á¹£faḫi.
dĥĥel o-'kked l-Äonwan dl-email dialk fṫ-[[Special:Preferences|ṫfá¸ilaṫ]] dialk.",
@@ -853,8 +860,6 @@ raha kayna bÄda.',
'revdelete-unsuppress' => 'ḫyyed á¸-á¸awabit mn l-moá¹›ajaÄaṫ l-mosṫrjaÄa',
'revdelete-log' => 'sabab:',
'revdelete-submit' => 'tḅḅeq Äla {{PLURAL:$1|l-ṃoá¹›ajaÄa|l-ṃoá¹›ajaÄaṫ}} l-mĥṫaá¹›a',
-'revdelete-logentry' => 'bddl l-vizibiliṫi dl-ṃoá¹›ajaÄa l-"[[$1]]"',
-'logdelete-logentry' => 'bddl l-vizibiliṫi dl-ḫadaṫ l-"[[$1]]"',
'revdelete-success' => "'''ṫ-ṫḫdiṫ d-vizibiliṫi dl-morajaÄaṫ njḫ.'''",
'revdelete-failure' => "'''ṫ-ṫḫdiṫ d-vizibiliṫi dl-morajaÄaṫ ma njḫ-Ä‹:'''
$1",
@@ -866,15 +871,6 @@ $1",
'revdel-restore-visible' => "morajaat mar'iya",
'pagehist' => 'Ṫariĥ ṣ-ṣefḫa',
'deletedhist' => 'tarikh lmhdof',
-'revdelete-content' => 'L-Meá¸mon',
-'revdelete-summary' => 'molkhass taadil',
-'revdelete-uname' => 'smiṫ l-mosṫĥdim',
-'revdelete-restricted' => 'tḅḅq á¸-á¸awaḅit ll-idariyyin',
-'revdelete-unrestricted' => 'ḫyyd á¸-á¸awaḅit ll-idariyyin',
-'revdelete-hid' => 'ĥḅḅa $1',
-'revdelete-unhid' => 'byyn $1',
-'revdelete-log-message' => '$1 l-$2 {{PLURAL:$2|l-morajaÄa|dl-morajaÄaṫ}}',
-'logdelete-log-message' => '$1 l-$2 {{PLURAL:$2|l-ḫadaṫ|dl-ḫdaṫ}}',
'revdelete-no-change' => "'''ṫḫdir:''' l-Äoná¹£or l-m'rreÄ¥ $2, $1 fih bÄda l-parametraṫ dl-vizibiliti lli mtloba.",
'revdelete-reason-dropdown' => '*asbab l-ḫdf l-Äamma
** ĥrq ḫoqoq n-nacṛ
@@ -1016,7 +1012,7 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'prefs-rc' => 'Ṫ-ṪeÄdilaṫ l-leĥĥra',
'prefs-watchlist' => "qa'imaṫ l-ṃoṛaqaba",
'prefs-watchlist-days' => 'adad kiyam alaard f qaimat lmoraqaba:',
-'prefs-watchlist-days-max' => 'Maximmum 7 yam',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => "maksimom Äadad ṫ-ṫġyiraṫ lli ṫṫbyyen f-qa'imaṫ l-ṃoá¹›aqaba l-mowssaÄa:",
'prefs-watchlist-edits-max' => 'maximmum:1000',
'prefs-watchlist-token' => 'miftah qaimat lmoraqaba',
@@ -1193,7 +1189,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'right-autopatrol' => 'alm taadilat lmostakhdim morajaa tilqaiya',
'right-patrolmarks' => 'chof alamat lmorajaa f ahdat tghyirat',
'right-unwatchedpages' => 'chof sfahi li mamraqbinch',
-'right-trackback' => 'dir trackback',
'right-mergehistory' => 'dmj tarikh sfahi',
'right-userrights' => 'taadil kol salahiyat lmostkhdimin',
'right-userrights-interwiki' => 'taadil salahiyat lmostkhdim lmostkhdimin f lwikiyat lkhrin',
@@ -1237,7 +1232,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'action-patrol' => 'alm ala taadilat lkhrin kamorajaa',
'action-autopatrol' => 'alm taadil dualk kamorajaa',
'action-unwatchedpages' => 'chof lista dyal sfahi li mamraqbach',
-'action-trackback' => 'dir trackback',
'action-mergehistory' => 'dmj tarikh had sfha',
'action-userrights' => 'taadil kol salahiyat lmostkhdimin',
'action-userrights-interwiki' => 'taadil salahiyat lmostkhdimin f lwikiyat lkhrin',
@@ -1270,7 +1264,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'minoreditletter' => 'á¹£',
'newpageletter' => 'J',
'boteditletter' => 'b',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 katchof {{PLURAL:$1|mostkhdim|mostkhdimin}}]',
'rc_categories' => 'limiti tsnifat (frqha b "|")',
'rc_categories_any' => 'ay wahd',
@@ -1284,7 +1277,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-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'ta tghyir f sfahi mrtabta f lmodda li drtiha',
'recentchangeslinked-summary' => "Hadi lista dial 'ṫ-ṫeÄ¡yiraṫ li ṫdaro mo'aÄ¥arane le 'á¹£-á¹£efḫaṫ li mlaqyin mÄa 'á¹£-á¹£efḫa l-meÄniya (ola le 'aÄda' dial Ä‹i á¹£efa mÄayana). 'á¹¢-á¹¢efḫaṫ li [[Special:Watchlist|mṫebeÄ]] mekṫobine be ḫrof Ä¡laá¸.",
'recentchangeslinked-page' => 'Smiyṫ ṣ-ṣefḫa',
@@ -1442,15 +1434,13 @@ $1',
'shared-repo' => 'depot mochtarak',
# File reversion
-'filerevert' => 'rjjea $1',
-'filerevert-backlink' => '↠$1',
-'filerevert-legend' => 'rjjea lfichier',
-'filerevert-comment' => 'S-Sbab:',
-'filerevert-submit' => 'RejjeÄ',
+'filerevert' => 'rjjea $1',
+'filerevert-legend' => 'rjjea lfichier',
+'filerevert-comment' => 'S-Sbab:',
+'filerevert-submit' => 'RejjeÄ',
# File deletion
'filedelete' => 'suprimi $1',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'quprimi kolchi',
'filedelete-comment' => 'S-Sbab:',
'filedelete-submit' => 'Suprimi',
@@ -1629,12 +1619,8 @@ daba ka ṫḫwwal l-[[$2]].',
'activeusers-noresult' => 'ta mostakhdim matlgach.',
# Special:Log/newusers
-'newuserlogpage' => 'Ṫariĥ dyal l-ḫsabaṫ j-jdad',
-'newuserlogpagetext' => "hada sijill d-inċa'aṫ l-moṣṫĥdimin.",
-'newuserlog-byemail' => "lmot de passe raha tsiftat f l'email",
-'newuserlog-create-entry' => 'Ḫsab jdid',
-'newuserlog-create2-entry' => 'ĥṫareÄ á¸«sab jdid $1',
-'newuserlog-autocreate-entry' => 'lcont tnchad automatikmen',
+'newuserlogpage' => 'Ṫariĥ dyal l-ḫsabaṫ j-jdad',
+'newuserlogpagetext' => "hada sijill d-inċa'aṫ l-moṣṫĥdimin.",
# Special:ListGroupRights
'listgrouprights' => 'salahiyat mjmoat lmostkhdimin',
@@ -1729,7 +1715,6 @@ L-Kṫaba dyal had á¹£-á¹£efḫa Ä¡aṫban '''Ä¡liá¸a''' fe [[Special:RecentCha
'excontent' => 'lmohtawa kan : "$1"',
'exblank' => 'sfha kant khawya',
'delete-confirm' => 'suprimi "$1"',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Suprimi',
'confirmdeletetext' => 'Ĝendak rah ġadi ṫemḫi ċi ṣefḫa ola fiċyé, o ḫṫa lé-vérsyon li fe ṫ-ṫariĥ.
Äœafak ekked belli hadÄ‹i howa li baÄ¡i ṫdir, belli nṫa fahem l-ahammiya dyalo, o belli kaṫdir hadÄ‹i be ṫ-ṫowfiq dyal [[{{MediaWiki:Policy-url}}|l-qawaÄid d-daÄ¥iliya]].',
@@ -1737,8 +1722,6 @@ L-Kṫaba dyal had á¹£-á¹£efḫa Ä¡aṫban '''Ä¡liá¸a''' fe [[Special:RecentCha
'actionfailed' => 'Ma á¹£eá¸qaṫċ',
'deletedtext' => '« $1 » ṫemḫa.
Ċof $2 ila bġiṫi ċi lista dyal kolċi li ṫemḫa aĥiran.',
-'deletedarticle' => 'memḫi "[[$1]]"',
-'suppressedarticle' => 'mḫa "[[$1]]"',
'dellogpage' => 'Ṫ-Ṫariĥ dyal ṣ-ṣefḫaṫ li ṫṫemḫaw',
'dellogpagetext' => 'Ha hiya l-lista dyal dakÄ‹i li Äad ṫṫemḫa.',
'deletionlog' => 'Ṫ-Ṫariĥ dyal ṣ-ṣefḫaṫ li ṫṫemḫaw',
@@ -1761,7 +1744,6 @@ L-Kṫaba dyal had á¹£-á¹£efḫa Ä¡aṫban '''Ä¡liá¸a''' fe [[Special:RecentCha
'modifiedarticleprotection' => 'beddel l-mosṫawa de l-ḫimaya dyal « [[$1]] »',
'unprotectedarticle' => 'ḫma "[[$1]]"',
'prot_1movedto2' => '[[$1]] ṫnqlaṫ l-[[$2]]',
-'protect-backlink' => '↠$1',
'protect-legend' => "'kked l-ḫimaya",
'protectcomment' => 'S-Sbab:',
'protectexpiry' => 'ytsala:',
@@ -1818,7 +1800,6 @@ Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had ṣ-ṣefḫa bla ma i\'e
'undeletereset' => 'aawd regli',
'undeleteinvert' => 'Qleb dakÄ‹i li Äzelṫi',
'undeletecomment' => 'sabab:',
-'undeletedarticle' => 'sṫerjeÄ "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|vérsyon weḫda rejÄaṫ ki kaneṫ|$1 de lé-vérsyon rejÄo ki kano}}',
'undeletedrevisions-files' => 'ṫreddaṫ {{PLURAL:$1|1 l-ṃoá¹›ajaÄa|$1 dl-ṃoá¹›ajaÄaṫ}} o-{{PLURAL:$2|1 l-milef|$2 dl-milffaṫ}}',
'undeletedfiles' => 'ṫredd {{PLURAL:$1|1 l-milef|$1 dl-melffaṫ}}',
@@ -1861,7 +1842,6 @@ Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had ṣ-ṣefḫa bla ma i\'e
'whatlinkshere' => 'Ṣefḫaṫ mlaqyin',
'whatlinkshere-title' => 'á¹¢-á¹¢efḫaṫ li mlaqyin mÄa "$1"',
'whatlinkshere-page' => 'ṣfḫa:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Had ṣ-ṣefḫaṫ kayddiw le '''[[:$1]]''':",
'nolinkshere' => "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''[[:$1]]'''.",
'nolinkshere-ns' => "á¸«á¹«á¹«Ä á¹£fḫa ma ka-twṣṣal l-'''[[:$1]]''' f-nnitaq lli ĥṫariṫi",
@@ -2009,9 +1989,6 @@ Imken hadċi y'eddi ṫeġyiraṫ hammin ila kaneṫ ċi ṣefḫa kayqrawha n-n
'movepage-page-exists' => 'Ṣ-Ṣefḫa $1 fayeṫ kayna o ma ymken lhaċ ṫṫemḫa otomaṫikiyan.',
'movepage-page-moved' => 'Ṣ-Ṣefḫa $1 wellaṫ smiyyṫha $2',
'movepage-page-unmoved' => 'á¹¢-á¹¢efḫa $1 ma qeá¸raṫċ ṫwelli $2.',
-'1movedto2' => 'neqqel [[$1]] ḫṫal [[$2]]',
-'1movedto2_redir' => 'neqqel [[$1]] le [[$2]] foq ṫ-ṫeḫwila dyalṫha',
-'move-redirect-suppressed' => 'Ṫ-Ṫeḫwil ṫṫemḫa',
'movelogpage' => 'Ṫariĥ n-naql',
'movelogpagetext' => 'Ha hiya l-lista dyal ṣ-ṣefḫaṫ kamlin li ṫneqqlo.',
'movesubpage' => '{{PLURAL:$1|á¹¢efḫa ferÄiyya|á¹¢efḫaṫ ferÄiyya}}',
@@ -2168,8 +2145,6 @@ Imken lek ṫċof l-Äin dyalha.',
'markaspatrolleddiff' => 'marki kamorajaaa',
# Patrol log
-'patrol-log-auto' => '(otomatik)',
-'patrol-log-diff' => 'morajaa $1',
'log-show-hide-patrol' => '$1 sijjil lkhafr',
# Browsing diffs
@@ -2181,7 +2156,7 @@ Imken lek ṫċof l-Äin dyalha.',
'widthheight' => '$1 × $2',
'file-info' => 'ḫajm l-milef: $1, n-noÄ dl-MIME: $2',
'file-info-size' => '$1 × $2 piksel, ṫqel l-fiċyé: $3, ċkel MIME : $4',
-'file-nohires' => '<small>Ma kayenċ ċi rézolusyon kber men hadi.</small>',
+'file-nohires' => 'Ma kayenċ ċi rézolusyon kber men hadi.',
'svg-long-desc' => 'Fiċyé SVG, rézolusyon $1 × $2 pikselaṫ, ḫajm : $3',
'show-big-image' => 'Rézolusyon kamla',
'show-big-image-size' => '$1 × $2 dl-ppiksilaṫ',
@@ -2198,9 +2173,9 @@ Imken lek ṫċof l-Äin dyalha.',
'sp-newimages-showfrom' => 'biyn lmilfat mn $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 's',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'h',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
# Bad image list
'bad_image_list' => "L-forma howa ṫ-ṫali :
@@ -2577,13 +2552,6 @@ daba ymkn lik [[Special:UserLogin|ṫdÄ¥ol]] o-ṫsṫmá¹«Ä bl-wiki.",
'scarytranscludefailed' => '[lbaht 3la lqalb fchl l $1]',
'scarytranscludetoolong' => '[URL twil bzzaf]',
-# Trackbacks
-'trackbackbox' => 'ṃoṫaḅaÄaṫ dial had á¹£fḫa:<br />
-$1',
-'trackbackremove' => '([$1 Suprimi])',
-'trackbacklink' => 'lmotabaaa',
-'trackbackdeleteok' => 'lmotabaa tmshat',
-
# Delete conflict
'deletedwhileediting' => "'''attansyo''': had sfha tmshat bad ma bditi taadil dyalha",
'recreate' => "awd li'inchaa",
@@ -2759,4 +2727,9 @@ jrreb l-ÄṛḠl-Äadi.',
'sqlite-has-fts' => '$1 maa imkaniyat lbaht f nass kaml',
'sqlite-no-fts' => '$1 imkaniyat lbaht f nass kaml',
+# New logging system
+'revdelete-restricted' => 'tḅḅq á¸-á¸awaḅit ll-idariyyin',
+'revdelete-unrestricted' => 'ḫyyd á¸-á¸awaḅit ll-idariyyin',
+'newuserlog-byemail' => "lmot de passe raha tsiftat f l'email",
+
);
diff --git a/languages/messages/MessagesArz.php b/languages/messages/MessagesArz.php
index a93d53ed..ab46fabd 100644
--- a/languages/messages/MessagesArz.php
+++ b/languages/messages/MessagesArz.php
@@ -59,153 +59,153 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#تحويل', '#REDIRECT' ),
- 'notoc' => array( '0', '__لاÙهرس__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__لامعرض__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__لصق_Ùهرس__', '__FORCETOC__' ),
- 'toc' => array( '0', '__Ùهرس__', '__TOC__' ),
- 'noeditsection' => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__لاعنوان__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'شهر_حالى', 'شهر_حالي2', 'شهر_حالي', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'اسم_الشهر_الحالى', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'اسم_الشهر_الحالى_المولد', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'اختصار_الشهر_الحالى', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'يوم_حالى', 'يوم_حالي', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'يوم_حالى2', 'يوم_حالي2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'اسم_اليوم_الحالى', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'عام_حالى', 'عام_حالي', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'وقت_حالى', 'وقت_حالي', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'شهر_محلى', 'شهر_محلي2', 'شهر_محلي', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'شهر_محلى1', 'شهر_محلي1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'اسم_الشهر_المحلى', 'اسم_شهر_محلى', 'اسم_الشهر_المحلي', 'اسم_شهر_محلي', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'اسم_الشهر_المحلى_المولد', 'اسم_شهر_محلى_مولد', 'اسم_الشهر_المحلي_المولد', 'اسم_شهر_محلي_مولد', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'اختصار_الشهر_المحلى', 'اختصار_شهر_محلى', 'اختصار_الشهر_المحلي', 'اختصار_شهر_محلي', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'يوم_محلى', 'يوم_محلي', 'LOCALDAY' ),
- 'localday2' => array( '1', 'يوم_محلى2', 'يوم_محلي2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'اسم_اليوم_المحلى', 'اسم_يوم_محلى', 'اسم_اليوم_المحلي', 'اسم_يوم_محلي', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'عام_محلى', 'عام_محلي', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'وقت_محلى', 'وقت_محلي', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'عدد_الصÙحات', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'عدد_الملÙات', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'اسم_الصÙحة', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'عنوان_الصÙحة', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'نطاق', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'اسم_الصÙحة_الكامل', 'اسم_صÙحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'عنوان_الصÙحة_الكامل', 'عنوان_صÙحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'اسم_الصÙحة_الÙرعي', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'عنوان_الصÙحة_الÙرعى', 'عنوان_الصÙحة_الÙرعي', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'اسم_الصÙحة_الأساسى', 'اسم_الصÙحة_الأساسي', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'عنوان_الصÙحة_الأساسى', 'عنوان_الصÙحة_الأساسي', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'اسم_صÙحة_النقاش', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'عنوان_صÙحة_النقاش', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'اسم_صÙحة_الموضوع', 'اسم_صÙحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'عنوان_صÙحة_الموضوع', 'عنوان_صÙحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'رسالة:', 'MSG:' ),
- 'subst' => array( '0', 'نسخ:', 'إحلال:', 'SUBST:' ),
- 'safesubst' => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'مصدر:', 'مصدر_قالب:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'تصغير', 'مصغر', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'يمين', 'right' ),
- 'img_left' => array( '1', 'يسار', 'left' ),
- 'img_none' => array( '1', 'بدون', 'بلا', 'none' ),
- 'img_width' => array( '1', '$1بك', '$1عن', '$1px' ),
- 'img_center' => array( '1', 'مركز', 'center', 'centre' ),
- 'img_framed' => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'لاإطار', 'frameless' ),
- 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة $1', 'صÙحة_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'حد', 'حدود', 'border' ),
- 'img_baseline' => array( '1', 'خط_أساسى', 'خط_أساسي', 'baseline' ),
- 'img_sub' => array( '1', 'Ùرعى', 'Ùرعي', 'sub' ),
- 'img_super' => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
- 'img_top' => array( '1', 'أعلى', 'top' ),
- 'img_text_top' => array( '1', 'نص_أعلى', 'text-top' ),
- 'img_middle' => array( '1', 'وسط', 'middle' ),
- 'img_bottom' => array( '1', 'أسÙÙ„', 'bottom' ),
- 'img_text_bottom' => array( '1', 'نص_أسÙÙ„', 'text-bottom' ),
- 'img_link' => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'بديل=$1', 'alt=$1' ),
- 'int' => array( '0', 'محتوى:', 'INT:' ),
- 'sitename' => array( '1', 'اسم_الموقع', 'اسم_موقع', 'SITENAME' ),
- 'ns' => array( '0', 'نط:', 'NS:' ),
- 'nse' => array( '0', 'نطم:', 'NSE:' ),
- 'localurl' => array( '0', 'مسار_محلى:', 'مسار_محلي:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'عنوان_المسار_المحلى:', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
- 'server' => array( '0', 'خادم', 'SERVER' ),
- 'servername' => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
- 'grammar' => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'نوع:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'أسبوع_حالى', 'أسبوع_حالي', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'يوم_حالى_مأ', 'يوم_حالي_مأ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'أسبوع_محلى', 'أسبوع_محلي', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'يوم_محلى_مأ', 'يوم_محلي_مأ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
- 'revisionday' => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
- 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'مسار_كامل:', 'عنوان_كامل:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'عنوان_كامل:', 'مسار_كامل:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
- 'lc' => array( '0', 'صغير:', 'LC:' ),
- 'uc' => array( '0', 'كبير:', 'UC:' ),
- 'raw' => array( '0', 'خام:', 'RAW:' ),
- 'displaytitle' => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'أر', 'آر', 'R' ),
- 'newsectionlink' => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__لا_وصلة_قسم_جديد__', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'كود_المسار:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'طابع_الوقت_المحلى', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#لغة:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'صÙحات_ÙÙ‰_نطاق:', 'صÙحات_ÙÙ‰_نط:', 'صÙحات_ÙÙŠ_نطاق:', 'صÙحات_ÙÙŠ_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
- 'padleft' => array( '0', 'باد_يسار', 'PADLEFT' ),
- 'padright' => array( '0', 'باد_يمين', 'PADRIGHT' ),
- 'special' => array( '0', 'خاص', 'special' ),
- 'defaultsort' => array( '1', 'ترتيب_قياسى:', 'ترتيب_اÙتراضى:', 'Ù…Ùتاح_ترتيب_قياسى:', 'Ù…Ùتاح_ترتيب_اÙتراضى:', 'ترتيب_تصنيÙ_قياسى:', 'ترتيب_تصنيÙ_اÙتراضى:', 'ترتيب_قياسي:', 'ترتيب_اÙتراضي:', 'Ù…Ùتاح_ترتيب_قياسي:', 'Ù…Ùتاح_ترتيب_اÙتراضي:', 'ترتيب_تصنيÙ_قياسي:', 'ترتيب_تصنيÙ_اÙتراضي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'مسار_الملÙ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'وسم', 'tag' ),
- 'hiddencat' => array( '1', '__تصنيÙ_مخÙÙŠ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'صÙحات_ÙÙŠ_التصنيÙ', 'صÙحات_ÙÙŠ_تصنيÙ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'حجم_الصÙحة', 'PAGESIZE' ),
- 'index' => array( '1', '__Ùهرسة__', '__INDEX__' ),
- 'noindex' => array( '1', '__لاÙهرسة__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'عدد_ÙÙ‰_المجموعة', 'عدد_ÙÙ‰_مجموعة', 'عدد_ÙÙŠ_المجموعة', 'عدد_ÙÙŠ_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'مسار', 'PATH' ),
- 'url_wiki' => array( '0', 'ويكى', 'ويكي', 'WIKI' ),
- 'url_query' => array( '0', 'استعلام', 'QUERY' ),
+ 'redirect' => array( '0', '#تحويل', '#REDIRECT' ),
+ 'notoc' => array( '0', '__لاÙهرس__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__لامعرض__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__لصق_Ùهرس__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__Ùهرس__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__لاعنوان__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'شهر_حالى', 'شهر_حالي2', 'شهر_حالي', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'اسم_الشهر_الحالى', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'اسم_الشهر_الحالى_المولد', 'اسم_الشهر_الحالي_المولد', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'اختصار_الشهر_الحالى', 'اختصار_الشهر_الحالي', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'يوم_حالى', 'يوم_حالي', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'يوم_حالى2', 'يوم_حالي2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'اسم_اليوم_الحالى', 'اسم_اليوم_الحالي', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'عام_حالى', 'عام_حالي', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'وقت_حالى', 'وقت_حالي', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ساعة_حالية', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'شهر_محلى', 'شهر_محلي2', 'شهر_محلي', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'شهر_محلى1', 'شهر_محلي1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'اسم_الشهر_المحلى', 'اسم_شهر_محلى', 'اسم_الشهر_المحلي', 'اسم_شهر_محلي', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'اسم_الشهر_المحلى_المولد', 'اسم_شهر_محلى_مولد', 'اسم_الشهر_المحلي_المولد', 'اسم_شهر_محلي_مولد', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'اختصار_الشهر_المحلى', 'اختصار_شهر_محلى', 'اختصار_الشهر_المحلي', 'اختصار_شهر_محلي', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'يوم_محلى', 'يوم_محلي', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'يوم_محلى2', 'يوم_محلي2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'اسم_اليوم_المحلى', 'اسم_يوم_محلى', 'اسم_اليوم_المحلي', 'اسم_يوم_محلي', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'عام_محلى', 'عام_محلي', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'وقت_محلى', 'وقت_محلي', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ساعة_محلية', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'عدد_الصÙحات', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'عدد_المقالات', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'عدد_الملÙات', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'عدد_المستخدمين', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'عدد_المستخدمين_النشطين', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'عدد_التعديلات', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'عدد_المشاهدات', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'اسم_الصÙحة', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'عنوان_الصÙحة', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'نطاق', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'عنوان_نطاق', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'نطاق_النقاش', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'عنوان_النقاش', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'نطاق_الموضوع', 'نطاق_المقالة', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'عنوان_نطاق_الموضوع', 'عنوان_نطاق_المقالة', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'اسم_الصÙحة_الكامل', 'اسم_صÙحة_كامل', 'اسم_كامل', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'عنوان_الصÙحة_الكامل', 'عنوان_صÙحة_كامل', 'عنوان_كامل', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'اسم_الصÙحة_الÙرعي', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'عنوان_الصÙحة_الÙرعى', 'عنوان_الصÙحة_الÙرعي', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'اسم_الصÙحة_الأساسى', 'اسم_الصÙحة_الأساسي', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'عنوان_الصÙحة_الأساسى', 'عنوان_الصÙحة_الأساسي', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'اسم_صÙحة_النقاش', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'عنوان_صÙحة_النقاش', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'اسم_صÙحة_الموضوع', 'اسم_صÙحة_المقالة', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'عنوان_صÙحة_الموضوع', 'عنوان_صÙحة_المقالة', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'رسالة:', 'MSG:' ),
+ 'subst' => array( '0', 'نسخ:', 'إحلال:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'نسخ_آمن:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'مصدر:', 'مصدر_قالب:', 'رسالة_بدون_تهيئة:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'تصغير', 'مصغر', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'تصغير=$1', 'مصغر=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'يمين', 'right' ),
+ 'img_left' => array( '1', 'يسار', 'left' ),
+ 'img_none' => array( '1', 'بدون', 'بلا', 'none' ),
+ 'img_width' => array( '1', '$1بك', '$1عن', '$1px' ),
+ 'img_center' => array( '1', 'مركز', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'إطار', 'بإطار', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'لاإطار', 'frameless' ),
+ 'img_page' => array( '1', 'صÙحة=$1', 'صÙحة $1', 'صÙحة_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'معدول', 'معدول=$1', 'معدول $1', 'معدول_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'حد', 'حدود', 'border' ),
+ 'img_baseline' => array( '1', 'خط_أساسى', 'خط_أساسي', 'baseline' ),
+ 'img_sub' => array( '1', 'Ùرعى', 'Ùرعي', 'sub' ),
+ 'img_super' => array( '1', 'سوبر', 'سب', 'super', 'sup' ),
+ 'img_top' => array( '1', 'أعلى', 'top' ),
+ 'img_text_top' => array( '1', 'نص_أعلى', 'text-top' ),
+ 'img_middle' => array( '1', 'وسط', 'middle' ),
+ 'img_bottom' => array( '1', 'أسÙÙ„', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'نص_أسÙÙ„', 'text-bottom' ),
+ 'img_link' => array( '1', 'وصلة=$1', 'رابط=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'بديل=$1', 'alt=$1' ),
+ 'int' => array( '0', 'محتوى:', 'INT:' ),
+ 'sitename' => array( '1', 'اسم_الموقع', 'اسم_موقع', 'SITENAME' ),
+ 'ns' => array( '0', 'نط:', 'NS:' ),
+ 'nse' => array( '0', 'نطم:', 'NSE:' ),
+ 'localurl' => array( '0', 'مسار_محلى:', 'مسار_محلي:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'عنوان_المسار_المحلى:', 'عنوان_المسار_المحلي:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'خادم', 'SERVER' ),
+ 'servername' => array( '0', 'اسم_الخادم', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'مسار_السكريبت', 'مسار_سكريبت', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'مسار_الهيئة', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'قواعد_اللغة:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'نوع:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__لاتحويل_عنوان__', '__لاتع__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__لاتحويل_محتوى__', '__لاتم__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'أسبوع_حالى', 'أسبوع_حالي', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'يوم_حالى_مأ', 'يوم_حالي_مأ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'أسبوع_محلى', 'أسبوع_محلي', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'يوم_محلى_مأ', 'يوم_محلي_مأ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'رقم_المراجعة', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'يوم_المراجعة', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'يوم_المراجعة2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'شهر_المراجعة', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'شهر_المراجعة1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'عام_المراجعة', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'مسار_كامل:', 'عنوان_كامل:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'عنوان_كامل:', 'مسار_كامل:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'صغير:', 'LC:' ),
+ 'uc' => array( '0', 'كبير:', 'UC:' ),
+ 'raw' => array( '0', 'خام:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'عرض_العنوان', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'أر', 'آر', 'R' ),
+ 'newsectionlink' => array( '1', '__وصلة_قسم_جديد__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__لا_وصلة_قسم_جديد__', 'لا_وصلة_قسم_جديد__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'نسخة_حالية', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'كود_المسار:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'كود_الأنكور', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'طابع_الوقت_الحالي', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'طابع_الوقت_المحلى', 'طابع_الوقت_المحلي', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'علامة_الاتجاه', 'علامة_اتجاه', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#لغة:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'لغة_المحتوى', 'لغة_محتوى', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'صÙحات_ÙÙ‰_نطاق:', 'صÙحات_ÙÙ‰_نط:', 'صÙحات_ÙÙŠ_نطاق:', 'صÙحات_ÙÙŠ_نط:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'عدد_الإداريين', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'صيغة_رقم', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'باد_يسار', 'PADLEFT' ),
+ 'padright' => array( '0', 'باد_يمين', 'PADRIGHT' ),
+ 'special' => array( '0', 'خاص', 'special' ),
+ 'defaultsort' => array( '1', 'ترتيب_قياسى:', 'ترتيب_اÙتراضى:', 'Ù…Ùتاح_ترتيب_قياسى:', 'Ù…Ùتاح_ترتيب_اÙتراضى:', 'ترتيب_تصنيÙ_قياسى:', 'ترتيب_تصنيÙ_اÙتراضى:', 'ترتيب_قياسي:', 'ترتيب_اÙتراضي:', 'Ù…Ùتاح_ترتيب_قياسي:', 'Ù…Ùتاح_ترتيب_اÙتراضي:', 'ترتيب_تصنيÙ_قياسي:', 'ترتيب_تصنيÙ_اÙتراضي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'مسار_الملÙ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'وسم', 'tag' ),
+ 'hiddencat' => array( '1', '__تصنيÙ_مخÙÙŠ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'صÙحات_ÙÙŠ_التصنيÙ', 'صÙحات_ÙÙŠ_تصنيÙ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'حجم_الصÙحة', 'PAGESIZE' ),
+ 'index' => array( '1', '__Ùهرسة__', '__INDEX__' ),
+ 'noindex' => array( '1', '__لاÙهرسة__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'عدد_ÙÙ‰_المجموعة', 'عدد_ÙÙ‰_مجموعة', 'عدد_ÙÙŠ_المجموعة', 'عدد_ÙÙŠ_مجموعة', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__تحويلة_إستاتيكية__', '__تحويلة_ساكنة__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'مستوى_الحماية', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'تهيئة_التاريخ', 'تهيئة_تاريخ', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'مسار', 'PATH' ),
+ 'url_wiki' => array( '0', 'ويكى', 'ويكي', 'WIKI' ),
+ 'url_query' => array( '0', 'استعلام', 'QUERY' ),
);
$specialPageAliases = array(
@@ -652,15 +652,14 @@ $1',
'badtitle' => 'عنوان غلط',
'badtitletext' => 'العنوان المطلوب للصÙحه مش موجود او Ùاضى, او اللينك بين اللغات او بين المشاريع غلط.
ممكن يكون موجود رمز او اكتر ما ينÙع Ø´ يستخدم ÙÙ‰ العناوين.',
-'perfcached' => 'البيانات (الـ data) دى معمول لها كاش (cache) و ممكن ما تكونش متحدثه.',
-'perfcachedts' => 'البيانات (الـ data) دى معمول لها كاش (cache), Ùˆ اخر تحديث ليها كان ÙÙ‰ $1.',
+'perfcached' => 'البيانات (الـ data) دى معمول لها كاش (cache) و ممكن ما تكونش متحدثه. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'البيانات (الـ data) دى معمول لها كاش (cache), Ùˆ اخر تحديث ليها كان ÙÙ‰ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'التحديثات بتاعة الصÙحه دى متعطله دلوقتى.
البيانات (الـ data) اللى هنا مش Ø­ تتحدث ÙÙ‰ الوقت الحاضر.',
'wrong_wfQuery_params' => 'محددات غلط ÙÙ‰ wfQuery()<br />
الخاصّيه: $1<br />
الاستعلام: $2',
'viewsource' => 'عرض المصدر',
-'viewsourcefor' => 'لـ $1',
'actionthrottled' => 'العمليه دى اتزنقت',
'actionthrottledtext' => 'علشان نمنع ال سبام ،أنت ممنوع تعمل الÙعل دا عدد كبير من المرات ÙÙ‰ Ùترة زمنية قصيرة، Ùˆ انت ا تجاوزت الحد دا . لو سمحت تحاول مرة ثانية بعد دقائق.',
'protectedpagetext' => 'الصÙحة دى اتقÙلت ÙÙ‰ وش التعديل.',
@@ -861,9 +860,6 @@ $2',
عنوان الأيبى الحالى الخاص بك هو $3ØŒ رقم المنع هو $5. لو سمحت تذكر الرقم دا ÙÙ‰ اى استÙسار.',
'blockednoreason' => 'ما Ùيش سبب',
-'blockedoriginalsource' => "المصدر بتاع '''$1''' معروض تحت:",
-'blockededitsource' => "نص '''تعديلاتك''' ÙÙ‰ '''$1''' معروض هنا:",
-'whitelistedittitle' => 'لازم تسجل دخولك علشان تقدر تعدل',
'whitelistedittext' => 'لازم $1 علشان تقدر تعدل الصÙحات.',
'confirmedittext' => 'قبل ما تبتدى تعدل لازم نتأكد من الايميل بتاعك. لو سمحت تكتب وتأكد الايميل بتاعك ÙÙŠ[[Special:Preferences|تÙضيلاتك]]',
'nosuchsectiontitle' => 'ماÙيش قسم بالاسم ده',
@@ -1107,8 +1103,6 @@ $2',
'revdelete-unsuppress' => 'إزالة الضوابط من المراجعات المسترجعة',
'revdelete-log' => 'السبب:',
'revdelete-submit' => 'طبق على {{PLURAL:$1|المراجعه|المراجعه}} المختارة',
-'revdelete-logentry' => 'غير رؤية المراجعة ل[[$1]]',
-'logdelete-logentry' => 'غير رؤية الحدث ل[[$1]]',
'revdelete-success' => "''' رؤية المراجعه اتظبطت بنجاح.'''",
'revdelete-failure' => "'''عرض المراجعه ما Ù†Ùعش يتعاد ظبطه:'''
$1",
@@ -1118,15 +1112,6 @@ $1",
'revdel-restore' => 'تغيير الشوÙ',
'pagehist' => 'تاريخ الصÙحة',
'deletedhist' => 'التاريخ الممسوح',
-'revdelete-content' => 'محتويات',
-'revdelete-summary' => 'ملخص التعديل',
-'revdelete-uname' => 'اسم اليوزر',
-'revdelete-restricted' => 'طبق التعليمات على السيسوبات',
-'revdelete-unrestricted' => 'شيل الضوابط من على السيسوبات',
-'revdelete-hid' => 'أخÙÙ‰ $1',
-'revdelete-unhid' => 'أظهر $1',
-'revdelete-log-message' => '$1 ل$2 {{PLURAL:$2|مراجعة|مراجعة}}',
-'logdelete-log-message' => '$1 ل$2 {{PLURAL:$2|حدث|حدث}}',
'revdelete-hide-current' => 'حصل غلط ÙÙ‰ تخبية البند اللى بتاريخ $2, الساعه$1: دى هى النسخه بتاعة دلوقتى.
ماينÙعش يتخبى.',
'revdelete-show-no-access' => 'حصل غلط ÙÙ‰ عرض البند اللى بتاريخ $2, الساعه $1: البند دا متعلم عليه انه"محظور".
@@ -1283,7 +1268,7 @@ $1",
'prefs-rc' => 'اخر التغييرات',
'prefs-watchlist' => 'ليستة المراقبه',
'prefs-watchlist-days' => 'الايام اللى تتعرض ÙÙ‰ ليستة المراقبه:',
-'prefs-watchlist-days-max' => '(الحد الاقصى 7 ايام)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'عدد التعديلات اللى بتتعرض ÙÙ‰ لستةالمراقبة المتوسعة:',
'prefs-watchlist-edits-max' => '(الرقم الاقصى: 1000)',
'prefs-watchlist-token' => 'Ù…Ùتاح قايمة المراقبه:',
@@ -1477,13 +1462,13 @@ $1",
'right-autopatrol' => 'خلى التعديلات بتاعتى متعلم عليها كأنها متراجعة أوتوماتيكي',
'right-patrolmarks' => 'عرض علامات المراجعة ÙÙ‰ اخر التعديلات',
'right-unwatchedpages' => 'بين لستة الصÙحات اللى مش متراقبة',
-'right-trackback' => 'تنÙيذ تراكباك',
'right-mergehistory' => 'ادمج تاريخ الصÙحات',
'right-userrights' => 'تعديل كل الحقوق بتاعة اليوزر',
'right-userrights-interwiki' => 'تعديل صلاحيات اليوزر لليوزرز ÙÙ‰ مواقع الويكى التانيه',
'right-siteadmin' => 'Ù‚ÙÙ„ ÙˆÙتح قاعدة البيانات',
'right-override-export-depth' => 'تصدير الصÙحات مع الصÙحات الموصوله لحد عمق 5',
'right-sendemail' => 'يبعت إيميل لليوزرز التانيين',
+'right-passwordreset' => 'إعادة ضبط كلمة سر مستخدم([[Special:PasswordReset|صÙحة خاصة]])',
# User rights log
'rightslog' => 'سجل صلاحيات اليوزرز',
@@ -1521,7 +1506,6 @@ $1",
'action-patrol' => 'التعليم على تعديلات الآخرين كمراجعة',
'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع',
'action-unwatchedpages' => 'رؤية لستة الصÙحات اللى مش متراقبة',
-'action-trackback' => 'تنÙيذ تراكباك',
'action-mergehistory' => 'دمج تاريخ هذه الصÙحة',
'action-userrights' => 'تعديل كل صلاحيات اليوزر',
'action-userrights-interwiki' => 'تعديل صلاحيات اليوزر لليوزرز ÙÙ‰ الويكيات التانية',
@@ -1554,7 +1538,6 @@ $1",
'minoreditletter' => 'ص',
'newpageletter' => 'ج',
'boteditletter' => 'ب',
-'sectionlink' => 'â†',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1| يوزر مراقب|يوزر مراقب}}]',
'rc_categories' => 'حصر لتصنيÙات (Ù…Ùصولة برمز "|")',
'rc_categories_any' => 'أى',
@@ -2032,12 +2015,8 @@ PICT # misc.
'activeusers-noresult' => 'مالقيناش اى يوزر',
# Special:Log/newusers
-'newuserlogpage' => 'سجل اليوزرز الجداد',
-'newuserlogpagetext' => 'دا سجل لليوزرز الجداد',
-'newuserlog-byemail' => 'الباسورد اتبعتت بالايميل',
-'newuserlog-create-entry' => 'يوزر جديد',
-'newuserlog-create2-entry' => 'الحساب الجديد المعمول $1',
-'newuserlog-autocreate-entry' => 'الحساب اتÙتح اوتوماتيكي',
+'newuserlogpage' => 'سجل اليوزرز الجداد',
+'newuserlogpagetext' => 'دا سجل لليوزرز الجداد',
# Special:ListGroupRights
'listgrouprights' => 'حقوق مجموعات اليوزرز',
@@ -2170,8 +2149,6 @@ $UNWATCHURL
'actionfailed' => 'الÙعل Ùشل',
'deletedtext' => '"$1" اتمسحت.
بص على $2 علشان تشو٠سجل آخر عمليات المسح.',
-'deletedarticle' => 'اتمسحت "[[$1]]"',
-'suppressedarticle' => 'خببى "[[$1]]"',
'dellogpage' => 'سجل المسح',
'dellogpagetext' => 'لسته بأحدث عمليات المسح.',
'deletionlog' => 'سجل المسح',
@@ -2305,7 +2282,6 @@ $UNWATCHURL
'undeletereset' => 'ابتدى من الأول',
'undeleteinvert' => 'اعكس الاختيار',
'undeletecomment' => 'السبب:',
-'undeletedarticle' => 'رجع "[[$1]]" تاني',
'undeletedrevisions' => 'رجع تانى {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديل}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 نسخة|$1 نسخة}} Ùˆ {{PLURAL:$2|1 ملÙ|$2 ملÙ}} رجعو تاني',
'undeletedfiles' => '{{PLURAL:$1|ملÙ|ملÙات}} $1 رجعو تاني',
@@ -2553,9 +2529,6 @@ $1',
'movepage-page-moved' => 'الصÙحة $1 اتنقلت لـ $2.',
'movepage-page-unmoved' => 'ماقدرناش ننقل الصÙحة $1 لـ $2.',
'movepage-max-pages' => 'الحد الأقصى $1 {{PLURAL:$1|صÙحة|صÙحة}} اتنقل. Ùˆ ماÙيش حاجة تانى Ø­ تتنقل اوتوماتيكي.',
-'1movedto2' => '[[$1]] اتنقلت ل [[$2]]',
-'1movedto2_redir' => '[[$1]] اتنقلت لـ[[$2]] Ùوق التحويله',
-'move-redirect-suppressed' => ' التحويل ممنوع.',
'movelogpage' => 'سجل النقل',
'movelogpagetext' => 'تحت ÙÙ‰ لستة الصÙحات اللى اتنقلت.',
'movesubpage' => '{{PLURAL:$1|صÙحه Ùرعيه|صÙحات Ùرعيه}}',
@@ -2828,9 +2801,6 @@ $1',
# Patrol log
'patrol-log-page' => 'سجل المراجعة',
'patrol-log-header' => 'دا سجل بالنسخ المتراجعة',
-'patrol-log-line' => 'علم على $1 من $2 كأنها متراجعة $3',
-'patrol-log-auto' => '(اوتوماتيكي)',
-'patrol-log-diff' => 'Ù†$1',
'log-show-hide-patrol' => '$1 سجل المراجعة',
# Image deletion
@@ -2856,7 +2826,7 @@ $1',
'widthheightpage' => '$1×$2ØŒ $3 {{PLURAL:$3|صÙحة|صÙحة}}',
'file-info' => 'حجم الملÙ: $1ØŒ نوع MIME: $2',
'file-info-size' => '$1 × $2 بكسل حجم الÙايل: $3ØŒ نوع MIME: $4',
-'file-nohires' => '<small>ماÙيش ريزوليوشن اعلى متوÙر.</small>',
+'file-nohires' => 'ماÙيش ريزوليوشن اعلى متوÙر.',
'svg-long-desc' => 'مل٠SVGØŒ اساسا $1 × $2 بكسل، حجم الملÙ: $3',
'show-big-image' => 'الصورة بدقه كامله',
'file-info-gif-looped' => 'ملÙÙˆÙ',
@@ -2876,9 +2846,9 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1، $2×$3',
-'seconds-abbrev' => 'Ø«',
-'minutes-abbrev' => 'Ù‚',
-'hours-abbrev' => 'س',
+'seconds-abbrev' => '$1Ø«',
+'minutes-abbrev' => '$1Ù‚',
+'hours-abbrev' => '$1س',
# Bad image list
'bad_image_list' => 'التصميم (الـ format) بالشكل ده:
@@ -3233,13 +3203,6 @@ $5
'scarytranscludefailed' => '[التدوير على القالب Ùشل Ù„$1]',
'scarytranscludetoolong' => '[عنوان طويل جدا]',
-# Trackbacks
-'trackbackbox' => 'التراكباك بتاع الصÙحة دي:<br />
-$1',
-'trackbackremove' => '([$1 امسح])',
-'trackbacklink' => 'تراكباك',
-'trackbackdeleteok' => 'التراكباك اتمسح بنجاح.',
-
# Delete conflict
'deletedwhileediting' => "'''تحذير''': الصÙحة دى اتمسحت بعد ما بدأت أنت ÙÙ‰ تحريرها!",
'confirmrecreate' => "اليوزر [[User:$1|$1]] ([[User talk:$1|مناقشة]]) مسح المقالة دى بعد ما انت بدأت ÙÙ‰ تحريرها علشان:
@@ -3499,4 +3462,9 @@ $1',
'htmlform-reset' => 'الرجوع ÙÙ‰ التغييرات',
'htmlform-selectorother-other' => 'تانيين',
+# New logging system
+'revdelete-restricted' => 'طبق التعليمات على السيسوبات',
+'revdelete-unrestricted' => 'شيل الضوابط من على السيسوبات',
+'newuserlog-byemail' => 'الباسورد اتبعتت بالايميل',
+
);
diff --git a/languages/messages/MessagesAs.php b/languages/messages/MessagesAs.php
index 42ccd48e..c9f5ce72 100644
--- a/languages/messages/MessagesAs.php
+++ b/languages/messages/MessagesAs.php
@@ -108,6 +108,8 @@ $digitTransformTable = array(
'9' => '৯', # &#x09ef;
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'সংযোগ সমূহ অধোৰেখিত কৰক:',
@@ -465,20 +467,22 @@ $1',
'badarticleerror' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à¦¤ à¦à¦‡ কামটো কৰিব নোৱাৰি ।',
'cannotdelete' => '"$1" পৃষà§à¦ à¦¾ বা ফাইল মচা সমà§à¦­à¦¬ নহয় ।
সমà§à¦­à§± আনে আগেই মচি থৈছে ।',
+'cannotdelete-title' => '"$1" পৃষà§à¦ à¦¾ বিলোপ কৰিব নোৱাৰি',
'badtitle' => 'অগà§à§°à¦¹à¦£à§€à¦¯à¦¼ শিৰোনামা',
'badtitletext' => 'আপà§à¦¨à¦¿ বিচৰা পৃষà§à¦ à¦¾à¦Ÿà§‹à§° শিৰোনামা অযোগà§à¦¯, খালী বা ভà§à¦²à¦•à§ˆ জড়িত আনà§à¦¤à§°à§à¦­à¦¾à¦·à¦¿à¦• বা আনà§à¦¤à§°à§à§±à¦¿à¦•à¦¿ শিৰোনামা। ইয়াত à¦à¦• বা ততোধিক বৰà§à¦£ আছে যাক শিৰোনামাত বà§à¦¯à§±à¦¹à¦¾à§° কৰিব নোৱাৰি।',
-'perfcached' => 'তলত দিয়া তথà§à¦¯ খিনি আগতে জমা কৰি থোৱা (cached) আৰৠসামà§à¦ªà§à§°à¦¤à¦¿à¦• নহব পাৰে।',
-'perfcachedts' => 'তলত দিয়া তথà§à¦¯ খিনি আগতে জমা কৰি থোৱা (cached) আৰৠশেষবাৰৰ কাৰণে $1 ত নৱীকৰণ কৰা হৈছিল।',
+'perfcached' => "তলত দিয়া তথà§à¦¯à¦–িনি আগতে জমা কৰি থোৱা (cached) আৰৠসামà§à¦ªà§à§°à¦¤à¦¿à¦• নহ'ব পাৰে। à¦à¦‡ তথà§à¦¯à¦–িনিত সৰà§à¦¬à§‹à¦šà§à¦š {{PLURAL:$1|à¦à¦Ÿà¦¾ ফলফল|$1টা ফলাফল}} উপলবà§à¦§à¥¤",
+'perfcachedts' => 'তলত দিয়া তথà§à¦¯ খিনি আগতে জমা কৰি থোৱা (cached) আৰৠশেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰà§à¦¬à¦¾à¦§à¦¿à¦• {{PLURAL:$4|à¦à¦Ÿà¦¾ ফলাফল|$4 টা ফলাফল}} à¦à¦‡ cacheত পাব।',
'querypage-no-updates' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ নৱীকৰণ কৰা ৰোধ কৰা হৈছে। ইয়াৰ তথà§à¦¯ à¦à¦¤à¦¿à¦¯à¦¼à¦¾ সতেজ কৰিব নোৱাৰি।',
'wrong_wfQuery_params' => 'wfQuery() ৰ কাৰণে ভà§à¦² মাপদণà§à¦¡ দিয়া হৈছে <br />
কাৰà§à¦¯à§à¦¯: $1<br />পৃষà§à¦ à¦¾: $2',
'viewsource' => 'উৎস চাওক',
-'viewsourcefor' => '$1 ৰ কাৰণে',
+'viewsource-title' => '$1ৰ উৎস চাওক',
'actionthrottled' => 'কাৰà§à¦¯à§à¦¯ লেহেম কৰা হৈছে',
'actionthrottledtext' => 'সà§à¦ªà¦¾à¦® ৰোধ কৰিবলৈ à¦à¦‡ কà§à§°à¦¿à¦¯à¦¼à¦¾à¦¤à§‹ কম সময়ৰ ভিতৰত বহৠবেছি বাৰ কৰাতো ৰোধ কৰা হৈছে, আৰৠআপà§à¦¨à¦¿ ইতিমধà§à¦¯à§‡ সেই সীমা অতিকà§à§°à¦® কৰিলে।
অনà§à¦—à§à§°à¦¹ কৰি কিছৠসময় পাছত চেষà§à¦Ÿà¦¾ কৰক।',
'protectedpagetext' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à§° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ৰোধ কৰিবলৈ সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰা হৈছে।',
'viewsourcetext' => 'আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à§° উৎস চাব আৰৠনকল কৰিব পাৰে',
+'viewyourtext' => "আপà§à¦¨à¦¿ '''আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হ'''ৰ উৎস চাব আৰৠà¦à¦‡ পৃষà§à¦ à¦¾à¦²à§ˆ নকল কৰিব পাৰে:",
'protectedinterface' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦‡ ৱিকি ছফà§à¦Ÿà§±à§‡à§°à§° ইণà§à¦Ÿà¦¾à§°à¦«à§‡â€™à¦š বাৰà§à¦¤à¦¾ পà§à§°à¦¦à¦¾à¦¨ কৰে, আৰৠইয়াক সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰি ৰখা হৈছে ।',
'editinginterface' => "'''সাৱধানবাণী:''' আপà§à¦¨à¦¿ যিখন পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিছে সেইখন ৱিকি ছফà§à¦Ÿà§±à§‡à§°à§° ইণà§à¦Ÿà¦¾à§°à¦«à§‡â€™à¦š বাৰà§à¦¤à¦¾ দিবলৈ বà§à¦¯à§±à¦¹à¦¾à§° হয় । à¦à¦‡ পৃষà§à¦ à¦¾à§° সাল-সলনিয়ে আন বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° বাবে ইণà§à¦Ÿà¦¾à§°à¦«à§‡â€™à¦šà¦¤ পà§à§°à¦­à¦¾à§± পেলাব । অনà§à¦¬à¦¾à¦¦à§° বাবে অনà§à¦—à§à§°à¦¹ কৰি মিডিয়াৱিকি সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼à¦•à§°à¦£ পà§à§°à¦•à¦²à§à¦ª [//translatewiki.net/wiki/Main_Page?setlang=bn translatewiki.net] বà§à¦¯à§±à¦¹à¦¾à§° কৰক ।",
'sqlhidden' => '(নিহিত SQL query)',
@@ -583,6 +587,7 @@ $2',
'emailconfirmlink' => 'আপোনাৰ ই-মেইল ঠিকনাটো পà§à§°à¦®à¦¾à¦£à¦¿à¦¤ কৰক',
'invalidemailaddress' => 'à¦à¦‡ ই-মেইল ঠিকনাতো গà§à§°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নহয়, কাৰণ ই অবৈধ পà§à§°à¦•à¦¾à§°à§° যেন লাগিছে।
অনà§à¦—à§à§°à¦¹ কৰি à¦à¦Ÿà¦¾ বৈধ ই-মেইল ঠিকনা লিখক অথবা à¦à¦•à§‹ নিলিখিব।',
+'cannotchangeemail' => 'à¦à¦‡ ৱিকিত à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ ই-মেইল ঠিকনা সলনি কৰিব পৰা নাযায়',
'accountcreated' => "à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰা হ'ল",
'accountcreatedtext' => "$1ৰ কাৰণে সদসà§à¦¯ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰা হ'ল।",
'createaccount-title' => '{{SITENAME}}ৰ কাৰণে à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰক।',
@@ -598,6 +603,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'পি.à¦à¦‡à¦›.পি মেইল() কাৰà§à¦¯à¦¤ অজà§à¦žà¦¾à¦¤ তà§à§°à§à¦Ÿà¦¿ ।',
+'user-mail-no-addy' => 'ই-মেইল ঠিকনা নোহোৱাকৈয়ে ই-মেইল পঠোৱাৰ চেষà§à¦Ÿà¦¾ কৰা হৈছে ।',
# Change password dialog
'resetpass' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সলনি কৰক',
@@ -618,28 +624,43 @@ $2',
'resetpass-temp-password' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦:',
# Special:PasswordReset
-'passwordreset' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহাওক',
-'passwordreset-text' => 'আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ ই-পতà§à§°à§° জৰিয়তে পাবলৈ তলৰ পà§à§°-পতà§à§° পà§à§°à¦¾à¦“ক ।',
-'passwordreset-legend' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহাওক',
-'passwordreset-disabled' => 'à¦à¦‡ ৱিকিত গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ নবীকৰণ নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে ।',
-'passwordreset-pretext' => '{{PLURAL:$1||তলত উলà§à¦²à§‡à¦– কৰা তথà§à¦¯à§° কোনো অংশ ভৰাওক}}',
-'passwordreset-username' => 'সদসà§à¦¯à¦¨à¦¾à¦®',
-'passwordreset-domain' => 'ডমেইন :',
-'passwordreset-email' => 'ই-মেইল ঠিকনা:',
-'passwordreset-emailtitle' => '{{SITENAME}} ত à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ আছে ।',
-'passwordreset-emailtext-ip' => 'কোনোবাই (IP ঠিকনা $1 ৰ পৰা সমà§à¦­à§±à¦¤: আপà§à¦¨à¦¿à¦¯à¦¼à§‡à¦‡) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ বিচাৰিছিল । ই-পতà§à§° ঠিকনাটোৰ লগত à¦à¦‡ সদসà§à¦¯à§° {{PLURAL:$3|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà¦¬à§‹à§°}} জড়িত হৈ আছে ।
+'passwordreset' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহাওক',
+'passwordreset-text' => 'আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ ই-পতà§à§°à§° জৰিয়তে পাবলৈ তলৰ পà§à§°-পতà§à§° পà§à§°à¦¾à¦“ক ।',
+'passwordreset-legend' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহাওক',
+'passwordreset-disabled' => 'à¦à¦‡ ৱিকিত গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ নবীকৰণ নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে ।',
+'passwordreset-pretext' => '{{PLURAL:$1||তলত উলà§à¦²à§‡à¦– কৰা তথà§à¦¯à§° কোনো অংশ ভৰাওক}}',
+'passwordreset-username' => 'সদসà§à¦¯à¦¨à¦¾à¦®',
+'passwordreset-domain' => 'ডমেইন :',
+'passwordreset-capture' => 'ফলাফল ই-মেইলখন চাওক ?',
+'passwordreset-capture-help' => "আপà§à¦¨à¦¿ à¦à¦‡ ঘৰটো চিহà§à¦¨à¦¿à¦¤ কৰিলে à¦à¦‡ ই-মেইল (আৰৠঅসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦) আপà§à¦¨à¦¿ দেখা পোৱাৰ লগতে সদসà§à¦¯à¦œà¦¨à¦²à§ˆà¦“ পঠোৱা হ'ব।",
+'passwordreset-email' => 'ই-মেইল ঠিকনা:',
+'passwordreset-emailtitle' => '{{SITENAME}} ত à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ আছে ।',
+'passwordreset-emailtext-ip' => 'কোনোবাই (IP ঠিকনা $1 ৰ পৰা সমà§à¦­à§±à¦¤: আপà§à¦¨à¦¿à¦¯à¦¼à§‡à¦‡) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ বিচাৰিছিল । ই-পতà§à§° ঠিকনাটোৰ লগত à¦à¦‡ সদসà§à¦¯à§° {{PLURAL:$3|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà¦¬à§‹à§°}} জড়িত হৈ আছে ।
$2
{{PLURAL:$3|à¦à¦‡ অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦|à¦à¦‡ অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦à¦¬à§‹à§°}} {{PLURAL:$5|à¦à¦¦à¦¿à¦¨à¦¤|$5 দিনত }} নাইকীয়া হ’ব । আপà§à¦¨à¦¿ লগ-ইন কৰি à¦à¦Ÿà¦¾ নতà§à¦¨ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ দিয়া উচিত । যদি আন কোনোবাই à¦à¦‡ অনà§à§°à§‹à¦§ কৰিছিল, বা আপà§à¦¨à¦¿ নিজৰ পূৰà§à¦¬à§° গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ মনত পেলাইছে আৰৠইয়াক সলাব খোজা নাই, তেনà§à¦¤à§‡ আপà§à¦¨à¦¿ à¦à¦‡ বাৰà§à¦¤à¦¾à¦• অগà§à§°à¦¾à¦¹à§à¦¯ কৰি নিজৰ পূৰà§à¦¬à§° গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ বà§à¦¯à§±à¦¹à¦¾à§° কৰি থাকিব পাৰে ।',
-'passwordreset-emailtext-user' => '$1 বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à¦¯à¦¼à§‡ {{SITENAME}} ($4) ৰ বাবে আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ বিচাৰিছিল । ই-পতà§à§° ঠিকনাটোৰ লগত à¦à¦‡ সদসà§à¦¯à§° {{PLURAL:$3|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà¦¸à¦®à§‚হ}} জড়িত হৈ আছে ।
+'passwordreset-emailtext-user' => '$1 বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à¦¯à¦¼à§‡ {{SITENAME}} ($4) ৰ বাবে আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সবিশেষ তথà§à¦¯ বিচাৰিছিল । ই-পতà§à§° ঠিকনাটোৰ লগত à¦à¦‡ সদসà§à¦¯à§° {{PLURAL:$3|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ|à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà¦¸à¦®à§‚হ}} জড়িত হৈ আছে ।
$2
{{PLURAL:$3|à¦à¦‡ অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦|à¦à¦‡ অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦à¦¬à§‹à§°}} {{PLURAL:$5|à¦à¦¦à¦¿à¦¨à¦¤|$5 দিনত }} নাইকীয়া হ’ব । আপà§à¦¨à¦¿ লগ-ইন কৰি à¦à¦Ÿà¦¾ নতà§à¦¨ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ দিয়া উচিত । যদি আন কোনোবাই à¦à¦‡ অনà§à§°à§‹à¦§ কৰিছিল, বা আপà§à¦¨à¦¿ নিজৰ পূৰà§à¦¬à§° গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ মনত পেলাইছে আৰৠইয়াক সলাব খোজা নাই, তেনà§à¦¤à§‡ আপà§à¦¨à¦¿ à¦à¦‡ বাৰà§à¦¤à¦¾à¦• অগà§à§°à¦¾à¦¹à§à¦¯ কৰি নিজৰ পূৰà§à¦¬à§° গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ বà§à¦¯à§±à¦¹à¦¾à§° কৰি থাকিব পাৰে ।',
-'passwordreset-emailelement' => 'সদসà§à¦¯à¦¨à¦¾à¦®: $1
+'passwordreset-emailelement' => 'সদসà§à¦¯à¦¨à¦¾à¦®: $1
অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦: $2',
-'passwordreset-emailsent' => 'à¦à¦–ন সà§à¦®à§°à¦£à¦•à¦¾à§°à¦• ই-মেইল পঠোৱা হৈছে ।',
+'passwordreset-emailsent' => 'à¦à¦–ন সà§à¦®à§°à¦£à¦•à¦¾à§°à¦• ই-মেইল পঠোৱা হৈছে ।',
+'passwordreset-emailsent-capture' => 'à¦à¦–ন সà§à¦®à¦¾à§°à¦• ই-মেইল পঠোৱা হৈছে, à¦à¦‡à¦–ন তলত দেখা পাব।',
+'passwordreset-emailerror-capture' => "à¦à¦–ন সà§à¦®à¦¾à§°à¦• ই-মেইল সৃষà§à¦Ÿà¦¿ কৰা হ'ল কিনà§à¦¤à§ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ পঠিয়াব পৰা নগ'ল, à¦à¦‡à¦–ন তলত দেখà§à¦“ৱা হৈছে: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
+'changeemail-header' => 'à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° ই-মেইল ঠিকনা সলনি কৰক',
+'changeemail-text' => 'আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ à¦à¦‡ পà§à§°à¦ªà¦¤à§à§°à¦–ন পূৰাওক । à¦à¦‡ সালসলনি নিশà§à¦šà¦¿à¦¤ কৰিবলৈ আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ দিব লাগিব ।',
+'changeemail-no-info' => 'à¦à¦‡ পৃষà§à¦ à¦¾ পà§à§°à¦¤à§à¦¯à¦•à§à¦·à§à¦¯ ভাৱে ঢà§à¦•à¦¿ পাবলৈ আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰিব লাগিব ।',
+'changeemail-oldemail' => 'বৰà§à¦¤à¦®à¦¾à¦¨à§° ই-মেইল ঠিকনা:',
+'changeemail-newemail' => 'নতà§à¦¨ ই-মেইল ঠিকনা:',
+'changeemail-none' => '(নাই)',
+'changeemail-submit' => 'ই-মেইল ঠিকনা সলনি কৰক',
+'changeemail-cancel' => 'বাতিল কৰক',
# Edit page toolbar
'bold_sample' => 'গাঢ় পাঠà§à¦¯',
@@ -708,9 +729,6 @@ $1ৰ দà§à¦¬à¦¾à§°à¦¾ à¦à¦‡ অৱৰোধ কৰা হৈছে ।
অপোনাৰ à¦à¦¤à¦¿à¦¯à¦¼à¦¾à§° IP ঠিকনা হৈছে $3, অৰৠআপোনাৰ অবৰোধ কà§à§°à¦®à¦¿à¦• হৈছে $5 ।
à¦à¦‡ বিষয়ে হোৱা আলোচনাত ইয়াক বà§à¦¯à§±à¦¹à¦¾à§° কৰিবলৈ অনà§à§°à§‹à¦§ কৰা হল।",
'blockednoreason' => 'কাৰণ দিয়া নাই',
-'blockedoriginalsource' => "'''$1''' ৰ উৎস তলত দিয়া হৈছে।",
-'blockededitsource' => "'''$1''' ৰ '''আপà§à¦¨à¦¿ কৰা সাল-সলনি''' ৰ পাঠà§à¦¯ তলত দিয়া হৈছে:",
-'whitelistedittitle' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ পà§à§°à¦¬à§‡à¦¶ কৰিব লাগিব।',
'whitelistedittext' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ $1 কৰক ।',
'confirmedittext' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰাৰ আগতে আপà§à¦¨à¦¿ আপোনাৰ ই-মেইল ঠিকনাটো পà§à§°à¦®à¦¾à¦¨à¦¿à¦¤ কৰিব লাগিব।
অনà§à¦—à§à§°à¦¹ কৰি [[Special:Preferences|মোৰ পচনà§à¦¦]] ত গৈ আপোনাৰ ই-মেইল ঠিকনা দিয়ক আৰৠতাক পà§à§°à¦®à¦¾à¦¨à¦¿à¦¤ কৰক।',
@@ -805,8 +823,8 @@ $1ৰ দà§à¦¬à¦¾à§°à¦¾ à¦à¦‡ অৱৰোধ কৰা হৈছে ।
ইয়াত আপোনাৰ লিখনি দিয়াৰ লগে লগে আপà§à¦¨à¦¿ আপোনা-আপà§à¦¨à¦¿ পà§à§°à¦¤à¦¿à¦¶à§à§°à§à¦¤à¦¿ দিছে যে à¦à¦‡ লিখনিটো আপোনাৰ মৌলিক লিখনি, বা কোনো সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à§° নথকা বা কোনো ৰাজহà§à§±à¦¾ ৱেবছাইট বা তেনে কোনো মà§à¦•à¦²à¦¿ উৎসৰ পৰা আহৰণ কৰা । (অধিক জানিবলৈ $1 চাওক)
'''সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à§°à¦¯à§à¦•à§à¦¤ কোনো সমল অনà§à¦®à¦¤à¦¿ অবিহনে দাখিল নকৰে যেন!'''",
-'longpageerror' => "'''ভà§à¦²: আপà§à¦¨à¦¿ জমা দিয়া পাঠ $1 কিলো-বাইট আকাৰৰ, যি $2 কিলো-বাইট সীমাতকৈ বেছি।
-ইয়াক সাà¦à¦šà¦¿à¦¬ পৰা নাযাব।'''",
+'longpageerror' => "'''ভà§à¦²: আপà§à¦¨à¦¿ জমা দিয়া পাঠ {{PLURAL:$1|à¦à¦• কিলো-বাইট|$1 কিলো-বাইট}} আকাৰৰ, যি {{PLURAL:$2|à¦à¦• কিলো-বাইট|$2 কিলো-বাইট}} সীমাতকৈ বেছি।'''
+ইয়াক সাà¦à¦šà¦¿à¦¬ পৰা নাযাব।",
'readonlywarning' => "'''সতৰà§à¦•à¦¬à¦¾à¦£à§€: চোৱা-চিতাৰ হেতৠà¦à¦‡ তথà§à¦¯à¦•à§‹à¦· বনà§à¦§ কৰি ৰখা হৈছে, গতিকে আপà§à¦¨à¦¿ à¦à¦‡ মূহà§à§°à§à¦¤à¦¤ আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সাà¦à¦šà¦¿à¦¬ নোৱাৰিব ।'''
আপà§à¦¨à¦¿ লেখাটো কাটি টেকà§à¦¸à¦Ÿ-ফাইলত লেপন কৰি পিছলৈ বà§à¦¯à§±à¦¹à¦¾à§°à§° বাবে সাà¦à¦šà¦¿ ৰাখিব পাৰে ।
@@ -975,8 +993,6 @@ $3 ঠআগবঢ়োৱা ইয়াৰ কাৰণ হ’ল ''$2''",
'revdelete-unsuppress' => 'পà§à¦¨à§°à§à¦¸à§à¦¥à¦¾à¦ªà¦¨ কৰা সংশোধনসমূহৰ সীমাবদà§à¦§à¦¤à¦¾ আতৰাওক',
'revdelete-log' => 'কাৰণ:',
'revdelete-submit' => 'নিৰà§à¦¬à¦¾à¦šà¦¿à¦¤ {{PLURAL:$1|সংশোধনত|সংশোধনবোৰত}} পà§à§°à¦¯à¦¼à§‹à¦— কৰক ।',
-'revdelete-logentry' => '"[[$1]]" ৰ সংশোধন পà§à§°à¦¤à§à¦¯à¦•à§à¦·à¦¤à¦¾ সলনি কৰা হৈছে ।',
-'logdelete-logentry' => '"[[$1]]" ৰ ঘটনা পà§à§°à¦¤à§à¦¯à¦•à§à¦·à¦¤à¦¾ সলনি কৰা হৈছে ।',
'revdelete-success' => "'''সংশোধন পà§à§°à¦¤à§à¦¯à¦•à§à¦·à¦¤à¦¾ সফলতাৰে নবীকৰণ কৰা হ’ল ।'''",
'revdelete-failure' => "'''সংশোধন পà§à§°à¦¤à§à¦¯à¦•à§à¦·à¦¤à¦¾ নবীকৰণ কৰিব পৰা নগ’ল:'''
$1",
@@ -988,15 +1004,6 @@ $1",
'revdel-restore-visible' => 'দৃশà§à¦¯à¦®à¦¾à¦¨ সংশোধনসমূহ',
'pagehist' => 'পৃষà§à¦ à¦¾ ইতিহাস',
'deletedhist' => 'মচি পেলোৱা ইতিহাস',
-'revdelete-content' => 'বিষয়বসà§à¦¤à§',
-'revdelete-summary' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° সাৰমৰà§à¦®',
-'revdelete-uname' => 'সদসà§à¦¯à¦¨à¦¾à¦®',
-'revdelete-restricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à§°à¦¶à¦¾à¦¸à¦•à§° কà§à¦·à§‡à¦¤à§à§°à¦¤ পà§à§°à¦¯à§‹à¦œà§à¦¯',
-'revdelete-unrestricted' => 'পà§à§°à¦¶à¦¾à¦¸à¦•à§° সীমাবদà§à¦§à¦¤à¦¾ বাতিল কৰা হ’ল',
-'revdelete-hid' => '$1 আà¦à§° কৰক',
-'revdelete-unhid' => '$1 দেখোৱাওà¦à¦•',
-'revdelete-log-message' => '$2 {{PLURAL:$2|সংশোধন|সংশোধনসমূহ}}ৰ বাবে $1',
-'logdelete-log-message' => '$2 ৰ ঠাইত $1 {{PLURAL:$2|ঘটনা|ঘটনাসমূহ}}',
'revdelete-hide-current' => ' $2, $1 তাৰিখৰ à¦à¦‡ আইটেমটো গোপন কৰাত সমসà§à¦¯à¦¾ হৈছে: à¦à¦‡à¦Ÿà§‹ বৰà§à¦¤à¦®à¦¾à¦¨à§° সংশোধনী ।
à¦à¦‡à¦Ÿà§‹à¦• গোপন কৰিব পৰা নাযাব ।',
'revdelete-show-no-access' => '$2, $1 তাৰিখৰ à¦à¦‡ আইটেমটো দেখà§à¦“ৱাত সমসà§à¦¯à¦¾ হৈছে: à¦à¦‡ আইটেমটো "সীমাবদà§à¦§" হিছাপে চিহà§à¦¨à¦¿à¦¤ ।
@@ -1157,12 +1164,14 @@ $1",
'prefs-rc' => 'শেহতীয়া সাল-সলনি',
'prefs-watchlist' => 'লকà§à¦·à§à¦¯ তালিকা',
'prefs-watchlist-days' => 'লকà§à¦·à§à¦¯ তালিকাত দেখà§à§±à¦¾à¦¬ লগা দিন:',
-'prefs-watchlist-days-max' => 'সৰà§à¦¬à§‹à¦šà§à¦š ৭ দিন',
+'prefs-watchlist-days-max' => 'সৰà§à¦¬à¦¾à¦§à¦¿à¦• $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'বৰà§à¦§à¦¿à¦¤ লকà§à¦·à§à¦¯à¦¸à§à¦šà§€à¦¤ দেখà§à§±à¦¾à¦¬ লগা সৰà§à¦¬à§‹à¦šà§à¦š সাল-সলনি:',
'prefs-watchlist-edits-max' => 'সৰà§à¦¬à§‹à¦šà§à¦š নমà§à¦¬à§°: ১০০০',
'prefs-watchlist-token' => 'লকà§à¦·à§à¦¯à¦¤à¦¾à¦²à¦¿à¦•à¦¾ টোকেন:',
'prefs-misc' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯',
'prefs-resetpass' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ শলনি কৰক',
+'prefs-changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
+'prefs-setemail' => 'à¦à¦Ÿà¦¾ ই-মেইল ঠিকনা দিয়ক',
'prefs-email' => 'ই-মেইল বিকলà§à¦ª',
'prefs-rendering' => 'ৰূপ',
'saveprefs' => 'সাà¦à¦šà¦¿ থওক',
@@ -1221,6 +1230,7 @@ $1",
'yourrealname' => 'পà§à§°à¦•à§ƒà¦¤ নাম:',
'yourlanguage' => 'ভাষা:',
'yourvariant' => 'বিষয়-বসà§à¦¤à§à§° ভাষা বিকলà§à¦ª',
+'prefs-help-variant' => 'à¦à¦‡ ৱিকিৰ সমল পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ পà§à§°à¦¦à§°à§à¦¶à¦¨ কৰিবলে আপোনাৰ পছনà§à¦¦à§° অপৰ অথবা বৰà§à¦£à¦¬à¦¿à¦¨à§à¦¯à¦¾à¦¸à¥¤',
'yournick' => 'নতà§à¦¨ সà§à¦¬à¦¾à¦•à§à¦·à§à¦¯à§°:',
'prefs-help-signature' => 'কথা-বতৰা পৃষà§à¦ à¦¾à¦¤ মনà§à¦¤à¦¬à§à¦¯à¦¸à¦®à§‚হৰ তলত "<nowiki>~~~~</nowiki>" লিখিলে ই সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ আপোনাৰ নাম আৰৠসময় সংযà§à¦•à§à¦¤ কৰিব ।',
'badsig' => 'অনà§à¦ªà¦¯à§‹à¦—ী সà§à¦¬à¦¾à¦•à§à¦·à§à¦¯à§°, HTML টেগ পৰীকà§à¦·à¦¾ কৰি লওক।',
@@ -1262,7 +1272,7 @@ $1",
'userrights-lookup-user' => 'সদসà§à¦¯ গোটবোৰ বà§à¦¯à§±à¦¸à§à¦¥à¦¾à¦ªà¦¨à¦¾ কৰক',
'userrights-user-editname' => 'সদসà§à¦¯à¦¨à¦¾à¦® দিয়ক:',
'editusergroup' => 'সদসà§à¦¯ গোটবোৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
-'editinguser' => "'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) সদসà§à¦¯à¦œà¦¨à§° অধিকাৰ সলনী কৰি থকা হৈছে।",
+'editinguser' => "'''[[User:$1|$1]]''' $2 সদসà§à¦¯à¦œà¦¨à§° অধিকাৰ সলনি কৰি থকা হৈছে।",
'userrights-editusergroup' => 'সদসà§à¦¯ গোট সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'saveusergroups' => 'সদসà§à¦¯ গোট সংৰকà§à¦·à¦¿à¦¤ কৰক',
'userrights-groupsmember' => 'à¦à¦‡ গোটবোৰৰ সদসà§à¦¯:',
@@ -1356,13 +1366,13 @@ $1",
'right-autopatrol' => 'à¦à¦œà¦¨à§° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পৰীকà§à¦·à¦¿à¦¤ বà§à¦²à¦¿ সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ চিহà§à¦¨à¦¿à¦¤ কৰক',
'right-patrolmarks' => 'শেহতীয়া সালসলনিৰ পৰীকà§à¦·à¦¿à¦¤ চিহà§à¦¨ চাওক',
'right-unwatchedpages' => 'নিৰীকà§à¦·à¦£ নকৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ তালিকা চাওক',
-'right-trackback' => 'à¦à¦Ÿà¦¾ টà§à§°à§‡à¦•à¦¬à§‡à¦• দাখিল কৰক',
'right-mergehistory' => 'পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ ইতিহাস à¦à¦•à¦¤à§à§°à¦¿à¦¤ কৰক',
'right-userrights' => 'সকলো সদসà§à¦¯ অধিকাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'right-userrights-interwiki' => 'আন ৱিকিৰ সদসà§à¦¯à§° অধিকাৰসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'right-siteadmin' => 'তথà§à¦¯à¦•à§‹à¦· বনà§à¦§ কৰক বা খোলক',
'right-override-export-depth' => '৫ম সà§à¦¤à§° পৰà§à¦¯à¦¨à§à¦¤ সংযà§à¦•à§à¦¤ পৃষà§à¦ à¦¾à¦¸à¦¹ সকলো পৃষà§à¦ à¦¾ ৰপà§à¦¤à¦¾à¦¨à§€ কৰক',
'right-sendemail' => 'আন সদসà§à¦¯à¦²à§ˆ ই-পতà§à§° ঠিকনা পঠিয়াওক',
+'right-passwordreset' => 'পাছৱৰà§à¦¡ ৰি-চেটৰ ই-মেইলসমূহ দেখà§à§±à¦¾à¦“ক',
# User rights log
'rightslog' => 'সভà§à¦¯à§° অধিকাৰৰ লেখ',
@@ -1396,16 +1406,17 @@ $1",
'action-suppressionlog' => 'à¦à¦‡ বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত ল’গ চাওক',
'action-block' => 'à¦à¦‡ সদসà§à¦¯à¦• সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰাৰ পৰা বাৰণ কৰক',
'action-protect' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° সà§à§°à¦•à§à¦·à¦¾à§° মাতà§à§°à¦¾ পৰিৱৰà§à¦¤à¦¨ কৰক',
+'action-rollback' => 'শেষৰজন সদসà§à¦¯à¦‡ à¦à¦–ন নিৰà§à¦¦à¦¿à¦·à§à¦Ÿ পৃষà§à¦Ÿà¦¾à¦¤ কৰা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পূৰà§à¦¬à§° অৱসà§à¦¥à¦¾à¦²à§ˆ ঘূৰাই আনক',
'action-import' => 'অনà§à¦¯ ৱিকিৰ পৰা à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আমদানী কৰক',
'action-importupload' => 'ফাইল আপল’ডৰ পৰা à¦à¦‡ পৃষà§à¦ à¦¾ আমদানী কৰক',
'action-patrol' => 'আনৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পৰীকà§à¦·à¦¿à¦¤ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰক',
'action-autopatrol' => 'আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পৰীকà§à¦·à¦¿à¦¤ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰক',
'action-unwatchedpages' => 'নিৰীকà§à¦·à¦£ নকৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ তালিকা চাওক',
-'action-trackback' => 'à¦à¦Ÿà¦¾ টà§à§°à§‡à¦•à¦¬à§‡à¦• দাখিল কৰক',
'action-mergehistory' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–নৰ ইতিহাস à¦à¦•à¦¤à§à§°à¦¿à¦¤ কৰক',
'action-userrights' => 'সকলো সদসà§à¦¯ অধিকাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'action-userrights-interwiki' => 'আন ৱিকিৰ সদসà§à¦¯à§° অধিকাৰসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'action-siteadmin' => 'তথà§à¦¯à¦•à§‹à¦· বনà§à¦§ কৰক বা খোলক',
+'action-sendemail' => 'ই-মেইল পঠিয়াওক',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|সাল-সলনি|সাল-সলনি}}',
@@ -1437,6 +1448,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|জন সদসà§à¦¯à¦‡|জন সদসà§à¦¯à¦‡}} à¦à¦‡ পৃষà§à¦ à¦¾ নিৰীকà§à¦·à¦£ কৰিছে]',
'rc_categories' => 'অনà§à¦šà§à¦›à§‡à¦¦à§° সীমাবদà§à¦§à¦¤à¦¾ ("|" দি পৃথক কৰক)',
'rc_categories_any' => 'যিকোনো',
+'rc-change-size-new' => 'সালসলনিৰ পিছত $1 {{PLURAL:$1|বাইট|বাইট}}',
'newsectionsummary' => '/* $1 */ নতà§à¦¨ অনà§à¦šà§à¦›à§‡à¦¦',
'rc-enhanced-expand' => 'সবিশেষ দেখà§à§±à¦¾à¦“ক (জাভাসà§à¦•à§à§°à¦¿à¦ªà§à¦Ÿà§° পà§à§°à¦¯à¦¼à§‹à¦œà¦¨)',
'rc-enhanced-hide' => 'সবিশেষ লà§à¦•à§à§±à¦¾à¦“ক',
@@ -1491,6 +1503,7 @@ $1",
'minlength1' => "ফাইলনাম কমেও à¦à¦Ÿà¦¾ আখৰৰ হ'ব লাগে ।",
'illegalfilename' => '"$1" ফাইলনামটোত à¦à¦¨à§‡ চিহà§à¦¨ আছে যিবোৰ পৃষà§à¦ à¦¾à§° শিৰোনামাত অনà§à¦®à§‹à¦¦à¦¿à¦¤ নহয় ।
অনà§à¦—à§à§°à¦¹ কৰি ফাইলটোৰ আন à¦à¦Ÿà¦¾ নাম দি আপল’ড কৰিবলৈ পà§à¦¨à§° চেষà§à¦Ÿà¦¾ কৰক ।',
+'filename-toolong' => "ফাইলৰ নাম ২৪০ বাইটতকৈ দীঘল হ'ব নোৱাৰে।",
'badfilename' => 'ফাইলনাম "$1"-লৈ সলনি কৰা হ\'ল ।',
'filetype-mime-mismatch' => '".$1" ফাইল à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦šà¦¨à¦Ÿà§‹à§° লগত ফাইলটোৰ MIME পà§à§°à¦•à¦¾à§° ($2) ৰ মিল পোৱা নগ’ল ।',
'filetype-badmime' => '"$1" MIME ধৰণৰ ফাইল আপল’ড অনà§à¦®à§‹à¦¦à¦¿à¦¤ নহয় ।',
@@ -1594,6 +1607,35 @@ URL টোৰ বৈধতা বিচাৰ কৰি পà§à¦¨à§° চেষà§
'upload-unknown-size' => 'অজà§à¦žà¦¾à¦¤ আকাৰ',
'upload-http-error' => 'à¦à¦Ÿà¦¾ HTTP তà§à§°à§à¦Ÿà¦¿à¦¯à¦¼à§‡ দেখা দিছে: $1',
+# File backend
+'backend-fail-stream' => "$1 ফাইলটো ষà§à¦Ÿà§à§°à§€à¦® কৰিব পৰা নগ'ল।",
+'backend-fail-backup' => "$1 ফাইলটো বেকআপà§â€Œ কৰিব পৰা নগ'ল।",
+'backend-fail-notexists' => '$1 ফাইলটোৰ কোনো অসà§à¦¤à¦¿à¦¤à§à¦¬ নাই।',
+'backend-fail-hashes' => "তà§à¦²à¦¨à¦¾ কৰিবৰ বাবে ফাইল হেছà§â€Œà¦¸à¦®à§‚হ পাব পৰা নগ'ল।",
+'backend-fail-notsame' => '$1ত ইতিমধà§à¦¯à§‡ বেলেগ à¦à¦Ÿà¦¾ ফাইল আছে।',
+'backend-fail-invalidpath' => '$1টো বৈধ সঞà§à¦šà¦¯à¦¼ পথ নহয়।',
+'backend-fail-delete' => '$1 ফাইলটো বিলোপ কৰিব পৰা নগল।',
+'backend-fail-alreadyexists' => '$1 ফাইলটো ইতিমধà§à¦¯à§‡ আছেই।',
+'backend-fail-store' => "$1 ফাইলটো $2ত সাà¦à¦šà¦¿à¦¬ পৰা নগ'ল।",
+'backend-fail-copy' => '$1 ফাইলটো $2 লৈ পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ কৰিব পৰা নগ’ল',
+'backend-fail-move' => "$1 ফাইলটো $2লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব পৰা নগ'ল",
+'backend-fail-opentemp' => "অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইল খà§à¦²à¦¿à¦¬ পৰা নগ'ল।",
+'backend-fail-writetemp' => "অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইলত লিখিব পৰা নগ'ল।",
+'backend-fail-closetemp' => "অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইল বনà§à¦§ কৰিব পৰা নগ'ল।",
+'backend-fail-read' => "$1 ফাইলটো পঢ়িব পৰা নগ'ল",
+'backend-fail-create' => "$1 ফাইলটো সৃষà§à¦Ÿà¦¿ কৰিব পৰা নগ'ল",
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" খà§à¦²à¦¿à¦¬ পৰা নগ\'ল; ইয়াক বনà§à¦§ কৰা হোৱা নাই।',
+'lockmanager-fail-closelock' => '"$1" -ৰ বাবে লক নথিপতà§à§° বনà§à¦§ কৰিব পৰা নগল।',
+'lockmanager-fail-deletelock' => '"$1" -ৰ বাবে লক নথিপতà§à§° মচিব পৰা নগ\'ল।',
+'lockmanager-fail-acquirelock' => '"$1" -ৰ বাবে পà§à§°à¦¾à¦ªà§à¦¤ কৰিব পৰা নগল।',
+'lockmanager-fail-openlock' => '"$1" -ৰ বাবে লক নথিপতà§à§° খà§à¦²à¦¿à¦¬ পৰা নগল।',
+'lockmanager-fail-releaselock' => '"$1" -ৰ বাবে লক মà§à¦•à§à¦¤ কৰিব পৰা নগ\'ল।',
+'lockmanager-fail-db-bucket' => "বাকেট $1 -ত পৰà§à¦¯à¦¾à¦ªà§à¦¤ লক ডাটাবেইচসমূহ যোগাযোগ কৰিব পৰা নগ'ল।",
+'lockmanager-fail-db-release' => "$1 তথà§à¦¯à¦•à§‹à¦·à¦¤ তলা মোকোলাই দিব পৰা নগ'ল",
+'lockmanager-fail-svr-release' => "$1 চাৰà§à¦­à¦¾à§°à¦¤ তলা মোকোলাই দিব পৰা নগ'ল",
+
# ZipDirectoryReader
'zip-file-open-error' => 'ফাইলটো ZIP পৰীকà§à¦·à¦¾à§° বাবে মà§à¦•à¦²à¦¿ কৰোà¦à¦¤à§‡ à¦à¦Ÿà¦¾ সমসà§à¦¯à¦¾à¦‡ দেখা দিছে ।',
'zip-wrong-format' => 'চিহà§à¦¨à¦¿à¦¤ ফাইলটো ZIP ফাইল নহয় ।',
@@ -1610,6 +1652,7 @@ URL টোৰ বৈধতা বিচাৰ কৰি পà§à¦¨à§° চেষà§
'uploadstash-badtoken' => 'à¦à¦‡ কাৰà§à¦¯à§à¦¯ অসফল হৈছে, কাৰণ সমà§à¦­à§±à¦¤à¦ƒ আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° নিৰà§à¦­à§°à¦¯à§‹à¦—à§à¦¯à¦¤à¦¾à§° মà§à¦¯à¦¾à¦¦ উকলিছে । আকৌ চেষà§à¦Ÿà¦¾ কৰক ।',
'uploadstash-errclear' => 'ফাইলসমূহৰ নিকাকৰণ বà§à¦¯à§°à§à¦¥ হৈছে ।',
'uploadstash-refresh' => 'ফাইলৰ তালিকা ৰিফà§à§°à§‡â€™à¦š কৰক',
+'invalid-chunk-offset' => 'অবৈধ চাঙà§à¦• অফছেটà§â€Œ',
# img_auth script messages
'img-auth-accessdenied' => 'পà§à§°à§±à§‡à¦¶à¦¾à¦§à¦¿à¦•à¦¾à§° নাই',
@@ -1719,23 +1762,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'filerevert-badversion' => 'দাখিল কৰা তাৰিখ আৰৠসময়যà§à¦•à§à¦¤ à¦à¦‡ ফাইলৰ কোনো সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ সংসà§à¦•à§°à¦£ নাই ।',
# File deletion
-'filedelete' => '"$1" বিলোপ কৰক',
-'filedelete-legend' => 'ফাইল বিলোপ কৰক',
-'filedelete-intro' => "আপà§à¦¨à¦¿ '''[[Media:$1|$1]]''' ফাইলটো আৰৠতাৰ সমসà§à¦¤ ইতিহাস বিলোপ কৰিব বিচাৰিছে ।",
-'filedelete-intro-old' => "আপà§à¦¨à¦¿ '''[[Media:$1|$1]]''' ফাইলৰ [$4 $3, $2] সময়ৰ সংসà§à¦•à§°à¦£à¦Ÿà§‹ বিলোপ কৰিছে ।",
-'filedelete-comment' => 'কাৰণ:',
-'filedelete-submit' => 'বিলোপ কৰক',
-'filedelete-success' => "'''$1''' ক বিলোপ কৰা হৈছে ।",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' ফাইলৰ $3, $2 ৰ সংসà§à¦•à§°à¦£à¦Ÿà§‹ বিলোপ কৰা হৈছে ।",
-'filedelete-nofile' => "'''$1''' ৰ কোনো অসà§à¦¤à¦¿à¦¤à§à¦¬ নাই ।",
-'filedelete-nofile-old' => "নিৰà§à¦¦à§‡à¦¶à¦¿à¦¤ বৈশিষà§à¦Ÿ থকা '''$1''' ৰ কোনো আৰà§à¦•à¦¾à¦‡à¦­ সংসà§à¦•à§°à¦£ নাই ।",
-'filedelete-otherreason' => 'অনà§à¦¯/অতিৰিকà§à¦¤ কাৰণ:',
-'filedelete-reason-otherlist' => 'অনà§à¦¯ কাৰণ',
-'filedelete-reason-dropdown' => '*বিলোপৰ সাধাৰণ কাৰণসমূহ
+'filedelete' => '"$1" বিলোপ কৰক',
+'filedelete-legend' => 'ফাইল বিলোপ কৰক',
+'filedelete-intro' => "আপà§à¦¨à¦¿ '''[[Media:$1|$1]]''' ফাইলটো আৰৠতাৰ সমসà§à¦¤ ইতিহাস বিলোপ কৰিব বিচাৰিছে ।",
+'filedelete-intro-old' => "আপà§à¦¨à¦¿ '''[[Media:$1|$1]]''' ফাইলৰ [$4 $3, $2] সময়ৰ সংসà§à¦•à§°à¦£à¦Ÿà§‹ বিলোপ কৰিছে ।",
+'filedelete-comment' => 'কাৰণ:',
+'filedelete-submit' => 'বিলোপ কৰক',
+'filedelete-success' => "'''$1''' ক বিলোপ কৰা হৈছে ।",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' ফাইলৰ $3, $2 ৰ সংসà§à¦•à§°à¦£à¦Ÿà§‹ বিলোপ কৰা হৈছে ।",
+'filedelete-nofile' => "'''$1''' ৰ কোনো অসà§à¦¤à¦¿à¦¤à§à¦¬ নাই ।",
+'filedelete-nofile-old' => "নিৰà§à¦¦à§‡à¦¶à¦¿à¦¤ বৈশিষà§à¦Ÿ থকা '''$1''' ৰ কোনো আৰà§à¦•à¦¾à¦‡à¦­ সংসà§à¦•à§°à¦£ নাই ।",
+'filedelete-otherreason' => 'অনà§à¦¯/অতিৰিকà§à¦¤ কাৰণ:',
+'filedelete-reason-otherlist' => 'অনà§à¦¯ কাৰণ',
+'filedelete-reason-dropdown' => '*বিলোপৰ সাধাৰণ কাৰণসমূহ
** কপিৰাইট উলঙà§à¦˜à¦¨
** ফাইলৰ পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿',
-'filedelete-edit-reasonlist' => 'বিলোপৰ কাৰণ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
-'filedelete-maintenance' => 'চোৱা-চিতাৰ সময়ত ফাইলৰ বিলà§à¦ªà§à¦¤à¦¿ আৰৠপà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° সাময়িকভাৱে নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে ।',
+'filedelete-edit-reasonlist' => 'বিলোপৰ কাৰণ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+'filedelete-maintenance' => 'চোৱা-চিতাৰ সময়ত ফাইলৰ বিলà§à¦ªà§à¦¤à¦¿ আৰৠপà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° সাময়িকভাৱে নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে ।',
+'filedelete-maintenance-title' => 'ফাইল বিলোপ কৰিব নোৱাৰি',
# MIME search
'mimesearch' => 'MIME অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
@@ -1843,6 +1887,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'mostimages' => 'সৰà§à¦¬à§‹à¦šà§à¦š সংযোজিত ফাইলসমূহ',
'mostrevisions' => 'অধিকবাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'prefixindex' => 'উপসৰà§à¦— সহ সকলো পৃষà§à¦ à¦¾',
+'prefixindex-namespace' => 'উপসৰà§à¦— ($1 namespace) -ৰ সৈতে সকলো পৃষà§à¦ à¦¾',
'shortpages' => 'চà§à¦Ÿà¦¿ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'longpages' => 'দীঘলীয়া পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'deadendpages' => 'ডেড à¦à¦£à§à¦¡ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
@@ -1859,7 +1904,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'listusers-editsonly' => 'কেৱল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰা সদসà§à¦¯à¦•à¦¹à§‡ দেখà§à§±à¦¾à¦“ক',
'listusers-creationsort' => 'সৃষà§à¦Ÿà¦¿à§° তাৰিখমতে সজাওক',
'usereditcount' => '$1 {{PLURAL:$1|টা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|টা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}}',
-'usercreated' => '$1 তাৰিখৰ $2 সময়ত সৃষà§à¦Ÿà¦¿ কৰা হৈছে',
+'usercreated' => '$1 তাৰিখে $2 সময়ত {{GENDER:$3|য়ে সৃষà§à¦Ÿà¦¿ কৰিছে}}',
'newpages' => 'নতà§à¦¨ পৃষà§à¦ à¦¾',
'newpages-username' => 'সদসà§à¦¯à¦¨à¦¾à¦®:',
'ancientpages' => 'আটাইতকৈ পà§à§°à¦£à¦¿ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
@@ -1952,12 +1997,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'activeusers-noresult' => "কোনো সদসà§à¦¯ পোৱা নগ'ল ।",
# Special:Log/newusers
-'newuserlogpage' => 'সদসà§à¦¯à§° সৃষà§à¦Ÿà¦¿ অভিলেখ',
-'newuserlogpagetext' => 'à¦à¦‡à¦–ন à¦à¦–ন সদসà§à¦¯ সৃষà§à¦Ÿà¦¿à§° ল’গ ।',
-'newuserlog-byemail' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ই-মেইল কৰি পঠোৱা হৈছে',
-'newuserlog-create-entry' => 'নতà§à¦¨ সদসà§à¦¯',
-'newuserlog-create2-entry' => '$1 ক নতà§à¦¨ সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿ কৰা হল',
-'newuserlog-autocreate-entry' => "সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰা হ'ল",
+'newuserlogpage' => 'সদসà§à¦¯à§° সৃষà§à¦Ÿà¦¿ অভিলেখ',
+'newuserlogpagetext' => 'à¦à¦‡à¦–ন à¦à¦–ন সদসà§à¦¯ সৃষà§à¦Ÿà¦¿à§° ল’গ ।',
# Special:ListGroupRights
'listgrouprights' => 'বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ গোটৰ অধিকাৰ',
@@ -1986,7 +2027,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'emailpagetext' => 'তলৰ পà§à§°à¦ªà¦¤à§à§°à¦–ন বà§à¦¯à§±à¦¹à¦¾à§° কৰি আপà§à¦¨à¦¿ à¦à¦‡ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ ই-মেইল পঠাব পাৰে ।
আপà§à¦¨à¦¿ [[Special:Preferences|আপোনাৰ সদসà§à¦¯ পছনà§à¦¦à¦¸à¦®à§‚হ]]ত পà§à§°à§±à§‡à¦¶ কৰা ই-মেইল ঠিকনাটো পà§à§°à§‡à§°à¦•à§° ঠিকনা হিছাপে দেখা যাব, যাতে মেইলৰ পà§à§°à¦¾à¦ªà¦•à§‡ আপোনাক উতà§à¦¤à§° দিব পাৰে ।',
'usermailererror' => 'মেইল বিষয়বসà§à¦¤à§à§° তà§à§°à§à¦Ÿà¦¿:',
-'defemailsubject' => '{{SITENAME}} ই-মেইল',
+'defemailsubject' => '"$1" সদসà§à¦¯à§° পৰা {{SITENAME}} ই-মেইল',
'usermaildisabled' => 'বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° ই-মেইল নিষà§à¦•à§à§°à¦¿à¦¯à¦¼',
'usermaildisabledtext' => 'আপà§à¦¨à¦¿ à¦à¦‡ ৱিকিত আন সদসà§à¦¯à¦²à§ˆ ই-পতà§à§° পঠিয়াব নোৱাৰে',
'noemailtitle' => 'কোনো ই-পতà§à§° ঠিকনা নাই',
@@ -2040,7 +2081,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'watchmethod-list' => 'লকà§à¦·à§à¦¯ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ শেহতীয়া সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° বাবে পৰীকà§à¦·à¦¾ কৰা হৈছে',
'watchlistcontains' => 'আপোনাৰ লকà§à¦·à§à¦¯-তালিকাত $1 খন {{PLURAL:$1|পৃষà§à¦ à¦¾|পৃষà§à¦ à¦¾}} আছে ।',
'iteminvalidname' => "'$1' আইটেমটোৰ লগত সমসà§à¦¯à¦¾ হৈছে, অবৈধ নাম...",
-'wlnote' => "তলত বিগত {{PLURAL:$2|à¦à¦˜à¦¨à§à¦Ÿà¦¾à¦¤|'''$2''' ঘনà§à¦Ÿà¦¾à¦¤}} হোৱা {{PLURAL:$1|শেষ à¦à¦Ÿà¦¾ পৰিৱৰà§à¦¤à¦¨|শেষ '''$1'''টা পৰিৱৰà§à¦¤à¦¨}} দেখà§à¦“ৱা হ’ল ।",
+'wlnote' => "তলত {{PLURAL:$1| হ'ল সৰà§à¦¬à¦¶à§‡à¦· পৰিৱৰà§à¦¤à¦¨|হ'ল সৰà§à¦¬à¦¶à§‡à¦· '''$1''' পৰিৱৰà§à¦¤à¦¨à¦¸à¦®à§‚হ}} সৰà§à¦¬à¦¶à§‡à¦· {{PLURAL:$2|ঘনà§à¦Ÿà¦¾|'''$2''' ঘনà§à¦Ÿà¦¾}}, $3, $4 -ৰ হিচাপে।",
'wlshowlast' => 'যোৱা $1 ঘণà§à¦Ÿà¦¾ $2 দিন $3 চাওক',
'watchlist-options' => 'লকà§à¦·à§à¦¯-তালিকা পছনà§à¦¦à¦¸à¦®à§‚হ',
@@ -2106,8 +2147,6 @@ $UNWATCHURL
'actionfailed' => "কাৰà§à¦¯à§à¦¯ বিফল হ'ল",
'deletedtext' => '"$1" ক বিলোপন কৰা হৈছে।
সামà§à¦ªà§à§°à¦¤à¦¿à¦• বিলোপনসমূহৰ তালিকা চাবলৈ $2 চাওক।',
-'deletedarticle' => '"[[$1]]" ক বাতিল কৰা হৈছে।',
-'suppressedarticle' => 'দমন কৰা হ\'ল "[[$1]]"',
'dellogpage' => 'বাতিল কৰা সূচী',
'dellogpagetext' => "তলত সামà§à¦ªà§à§°à¦¤à¦¿à¦• বিলোপনৰ তালিকা দিয়া হ'ল ।",
'deletionlog' => 'বাতিল কৰা সূচী',
@@ -2157,7 +2196,10 @@ $UNWATCHURL
'unprotectedarticle' => '"[[$1]]"ৰ সà§à§°à¦•à§à¦·à¦¾ আà¦à¦¤à§° কৰা হৈছে',
'movedarticleprotection' => 'সà§à§°à¦•à§à¦·à¦¾ ছেটিং "[[$2]]" ৰ পৰা "[[$1]]" লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হ’ল',
'protect-title' => '"$1"ৰ সà§à§°à¦•à§à¦·à¦¾à§° সà§à¦¤à§° সলনি কৰক',
+'protect-title-notallowed' => '"$1"ৰ সà§à§°à¦•à§à¦·à¦¾à§° সà§à¦¤à§° চাওক',
'prot_1movedto2' => '$1 ক $2 লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¿à¦¤ কৰা হল',
+'protect-badnamespace-title' => 'অসà§à§°à¦•à§à¦·à¦¿à¦¤ নামসà§à¦¥à¦¾à¦¨',
+'protect-badnamespace-text' => 'à¦à¦‡ নামসà§à¦¥à¦¾à¦¨à§° পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰিব নোৱাৰি।',
'protect-legend' => 'সà§à§°à¦•à§à¦·à¦¾ নিশà§à¦šà¦¿à¦¤ কৰক',
'protectcomment' => 'কাৰণ:',
'protectexpiry' => 'সময় শেষ:',
@@ -2179,6 +2221,7 @@ $UNWATCHURL
'protect-level-sysop' => 'কেৱল পà§à§°à¦¶à¦¾à¦¸à¦•à¦¬à§ƒà¦¨à§à¦¦à§° বাবে',
'protect-summary-cascade' => 'পà§à§°à¦ªà¦¾à¦¤à¦¾à¦•à¦¾à§°/কেচà§â€Œà¦•à§‡à¦¡à¦¿à¦‚',
'protect-expiring' => ' $1 (UTC) ত সময় শেষ হব',
+'protect-expiring-local' => 'মà§à¦¯à¦¾à¦¦ উকলিব $1',
'protect-expiry-indefinite' => 'অনিৰà§à¦¦à¦¿à¦·à§à¦Ÿ',
'protect-cascade' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à§° লগত জৰিত সকলো পৃষà§à¦ à¦¾ সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰক (সà§à§°à¦•à§à¦·à¦¾ জখলা)',
'protect-cantedit' => 'আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à§° সà§à§°à¦•à§à¦·à¦¾-সà§à¦¤à§° সলনি কৰিব নোৱৰে, কাৰণ আপোনাক সেই অনà§à¦®à¦¤à¦¿ দিয়া হোৱা নাই।',
@@ -2239,7 +2282,6 @@ $UNWATCHURL
'undeletereset' => 'পূৰà§à¦¬à§° অৱসà§à¦¥à¦¾à¦²à§ˆ লৈ যাওক',
'undeleteinvert' => 'নিৰà§à¦¬à¦¾à¦šà¦¨ ওলোটা কৰক',
'undeletecomment' => ' কাৰণ:',
-'undeletedarticle' => '"[[$1]]"-ক পূৰà§à¦¬à¦¸à§à¦¥à¦¾à¦¨à¦²à§ˆ ঘূৰাই অনা হ\'ল',
'undeletedrevisions' => '{{PLURAL:$1|১টা সংশোধন|$1টা সংশোধন}} পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হৈছে',
'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰৠ{{PLURAL:$2|১টা ফাইল|$2 টা ফাইল}} পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হ’ল',
'undeletedfiles' => '{{PLURAL:$1|১টা ফাইল|$1 টা ফাইল}} পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হ’ল',
@@ -2248,6 +2290,7 @@ $UNWATCHURL
'undeletedpage' => "'''$1ক পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হৈছে'''
অনà§à¦—à§à§°à¦¹ কৰি শেহতীয়া অৱলà§à¦ªà§à¦¤à¦¿ আৰৠপà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§°à§° বাবে [[Special:Log/delete|অৱলà§à¦ªà§à¦¤à¦¿ ল’গ]] চাওক ।",
'undelete-header' => 'শেহতীয়াকৈ বিলোপ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ বাবে [[Special:Log/delete|অৱলà§à¦ªà§à¦¤à¦¿ ল’গ]] চাওক ।',
+'undelete-search-title' => 'বিলোপ কৰা পৃষà§à¦ à¦¾ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক',
'undelete-search-box' => 'বিলোপ কৰা পৃষà§à¦ à¦¾ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক',
'undelete-search-prefix' => 'à¦à¦‡ আখৰেৰে আৰমà§à¦­ হোৱা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ দেখà§à§±à¦¾à¦“ক:',
'undelete-search-submit' => 'সনà§à¦§à¦¾à¦¨',
@@ -2257,6 +2300,7 @@ $UNWATCHURL
'undelete-cleanup-error' => 'অবà§à¦¯à§±à¦¹à§ƒà¦¤ আৰà§à¦•à¦¾à¦‡à¦­ ফাইল "$1" বিলোপ কৰাত সমসà§à¦¯à¦¾ হৈছে ।',
'undelete-missing-filearchive' => 'ফাইল আৰà§à¦•à¦¾à¦‡à¦­ ID $1 পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰিব পৰা নগ’ল কাৰণ à¦à¦‡à¦Ÿà§‹ তথà§à¦¯à¦­à¦à§°à¦¾à¦²à¦¤ নাই ।
à¦à¦‡à¦Ÿà§‹ সমà§à¦­à§±à¦¤: আগতেই পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হৈছে ।',
+'undelete-error' => 'পৃষà§à¦ à¦¾ অবিলোপনত তà§à§°à§à¦Ÿà¦¿ হৈছে',
'undelete-error-short' => 'ফাইল অৱলà§à¦ªà§à¦¤à¦¿ বাতিল কৰাত তà§à§°à§à¦Ÿà¦¿: $1',
'undelete-error-long' => 'ফাইলটোৰ অৱলà§à¦ªà§à¦¤à¦¿ বাতিল কৰাত কিছৠতà§à§°à§à¦Ÿà¦¿ হৈছে:
@@ -2378,6 +2422,7 @@ $1',
'blocklist-userblocks' => 'à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ বাৰণ গোপন কৰক',
'blocklist-tempblocks' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ পà§à§°à¦¤à¦¿à¦¬à¦¨à§à¦§à¦• গোপন কৰক',
'blocklist-addressblocks' => 'à¦à¦•à¦• IP অৱৰোধ গোপন কৰক',
+'blocklist-rangeblocks' => 'পৰিসীমা পà§à§°à¦¤à¦¿à¦¬à¦¨à§à¦§à¦• গোপন কৰক',
'blocklist-timestamp' => 'সময়-মোহৰ',
'blocklist-target' => 'লকà§à¦·à§à¦¯',
'blocklist-expiry' => 'মà§à¦¯à¦¾à¦¦ উকলিব',
@@ -2400,6 +2445,7 @@ $1',
'unblocklink' => 'পà§à§°à¦¤à¦¿à¦¬à¦¨à§à¦§à¦• উঠাই লওক',
'change-blocklink' => 'পà§à§°à¦¤à¦¿à¦¬à¦¨à§à¦§à¦• সলনি কৰক',
'contribslink' => 'বৰঙণি',
+'emaillink' => 'ই-মেইল পঠাওক',
'autoblocker' => 'আপোনাক সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ অৱৰোধ কৰা হৈছে কাৰণ আপোনাৰ আই.পি. ঠিকনাটো শেহতীয়াকৈ "[[User:$1|$1]]"য়ে বà§à¦¯à§±à¦¹à¦¾à§° কৰিছে ।
$1ৰ অৱৰোধৰ কাৰণ: "$2"',
'blocklogpage' => 'বাৰণ সূচী',
@@ -2529,9 +2575,6 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'movepage-page-moved' => "$1 পৃষà§à¦ à¦¾à¦–ন $2-লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হ'ল ।",
'movepage-page-unmoved' => '$1 পৃষà§à¦ à¦¾à¦–ন $2-লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা সমà§à¦­à§± নহয়',
'movepage-max-pages' => 'সৰà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|পৃষà§à¦ à¦¾|পৃষà§à¦ à¦¾}} সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হৈছে আৰৠইয়াতকৈ অধিক সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° নহ’ব ।',
-'1movedto2' => '[[$1]]ক [[$2]] লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¿à¦¤ কৰা হল',
-'1movedto2_redir' => "[[$1]]-ক [[$2]]-লৈ পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à§° সহায়েৰে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হ'ল",
-'move-redirect-suppressed' => 'পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾ নিবাৰণ কৰা হৈছে',
'movelogpage' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¨ সূচী',
'movelogpagetext' => 'সকলো পৃষà§à¦ à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à§° à¦à¦–ন তালিকা তলত দিয়া হৈছে ।',
'movesubpage' => '{{PLURAL:$1|খন উপপৃষà§à¦ à¦¾|খন উপপৃষà§à¦ à¦¾}}',
@@ -2544,7 +2587,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
লকà§à¦·à§à¦¯ পৃষà§à¦ à¦¾ "[[:$1]]" ইতিমেধà§à¦¯à§‡ আছেই ।
আপà§à¦¨à¦¿ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিবলৈ à¦à¦‡à¦–ন বিলোপ কৰিব খà§à¦œà¦¿à¦›à§‡ নেকি ?',
'delete_and_move_confirm' => 'হয়, পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰক',
-'delete_and_move_reason' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à§° সà§à¦¬à¦¾à§°à§à¦¥à¦¤ বিলোপ কৰা হৈছে',
+'delete_and_move_reason' => '"[[$1]]"ৰ পৰা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à§° সà§à¦¬à¦¾à§°à§à¦¥à¦¤ বিলোপ কৰা হৈছে',
'selfmove' => 'উৎস আৰৠলকà§à¦·à§à¦¯ শিৰোনামা à¦à¦•à§‡à¦‡;
কোনো পৃষà§à¦ à¦¾à¦• à¦à¦•à§‡à¦–ন পৃষà§à¦ à¦¾à¦²à§ˆ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব নোৱাৰি ।',
'immobile-source-namespace' => '"$1" নামসà§à¦¥à¦¾à¦¨à¦¤ পৃষà§à¦ à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব নোৱাৰি',
@@ -2579,6 +2622,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'exportcuronly' => 'কেৱল সামà§à¦ªà§à§°à¦¤à¦¿à¦• সংশোধনটোহে অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ কৰক, সমà§à¦ªà§‚ৰà§à¦£ ইতিহাস নহয় ।',
'exportnohistory' => "----
'''টোকা:''' কৰà§à¦®à¦¦à¦•à§à¦·à¦¤à¦¾-সমà§à¦ªà§°à§à¦•à§€à¦¯à¦¼ কাৰণত à¦à¦‡ পà§à§°à¦ªà¦¤à§à§°à§° মাধà§à¦¯à¦®à§‡à§°à§‡ কোনো পৃষà§à¦ à¦¾à§° সমà§à¦ªà§‚ৰà§à¦£ ইতিহাস ৰপà§à¦¤à¦¾à¦¨à¦¿ কৰাটো নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে।",
+'exportlistauthors' => 'পà§à§°à¦¤à§à¦¯à§‡à¦• পৃষà§à¦ à¦¾à§° অৱদানকাৰীৰ সমà§à¦ªà§‚ৰà§à¦£ তালিকা অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ কৰক',
'export-submit' => 'ৰপà§à¦¤à¦¾à¦¨à¦¿ কৰক',
'export-addcattext' => 'à¦à¦‡ শà§à§°à§‡à¦£à§€à¦•à§‡à¦‡à¦Ÿà¦¾à§° পৰা পৃষà§à¦ à¦¾ যোগ কৰক:',
'export-addcat' => 'যোগ কৰক',
@@ -2611,6 +2655,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'thumbnail_error' => 'কà§à¦·à§à¦¦à§à§° পà§à§°à¦¤à¦¿à¦•à§ƒà¦¤à¦¿ সৃষà§à¦Ÿà¦¿ কৰাত অসà§à¦¬à¦¿à¦§à¦¾ হৈছে: $1',
'djvu_page_error' => 'DjVu পৃষà§à¦ à¦¾ পৰিসীমাৰ বাহিৰত',
'djvu_no_xml' => "DjVu ফাইলৰ বাবে XML আনিব পৰা নগ'ল",
+'thumbnail-temp-create' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ থামà§à¦¬à¦¨à§‡à¦‡à¦² নথিপতà§à§° সৃষà§à¦Ÿà¦¿ কৰিবলে অকà§à¦·à¦®',
+'thumbnail-dest-create' => 'থামà§à¦¬à¦¨à§‡à¦‡à¦²à¦• গনà§à¦¤à¦¬à§à¦¯à¦¤ সাà¦à¦šà¦¿à¦¬à¦²à§‡ অকà§à¦·à¦®',
'thumbnail_invalid_params' => 'অবৈধ কà§à¦·à§à¦¦à§à§°à¦¾à¦•à§ƒà¦¤à¦¿ পাৰামিটাৰ',
'thumbnail_dest_directory' => 'গনà§à¦¤à¦¬à§à¦¯ ডিৰেকà§à¦Ÿà§°à§€ সৃষà§à¦Ÿà¦¿ কৰিব পৰা নগ’ল',
'thumbnail_image-type' => 'চিতà§à§°à§° ধৰণ সমৰà§à¦¥à¦¿à¦¤ নহয় ।',
@@ -2659,6 +2705,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'import-token-mismatch' => 'ছেছন তথà§à¦¯ হেৰাই গৈছে ।
অনà§à¦—à§à§°à¦¹ কৰি পà§à¦¨à§° চেষà§à¦Ÿà¦¾ কৰক ।',
'import-invalid-interwiki' => 'নিৰà§à¦§à¦¾à§°à¦¿à¦¤ ৱিকিৰ পৰা আমদানি কৰিব নোৱাৰি ।',
+'import-error-edit' => '"$1" পৃষà§à¦ à¦¾à¦–ন আমদানি কৰা নহ\'ল কাৰণ ইয়াক সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।',
+'import-error-create' => '"$1" পৃষà§à¦ à¦¾à¦–ন আমদানি কৰা নহ\'ল কাৰণ ইয়াক সৃষà§à¦Ÿà¦¿ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।',
# Import log
'importlogpage' => "আমদানি ল'গ",
@@ -2668,72 +2716,77 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'import-logentry-interwiki' => 'আনà§à¦¤à¦ƒà§±à¦¿à¦•à¦¿-সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¿à¦¤ $1',
'import-logentry-interwiki-detail' => '$2ৱে কৰা $1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
+# JavaScriptTest
+'javascripttest' => 'জাভাসà§à¦•à§à§°à¦¿à¦ªà§à¦Ÿ পৰীকà§à¦·à¦¾à¥¤',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'আপোনাৰ সদসà§à¦¯ পৃষà§à¦ à¦¾',
-'tooltip-pt-anonuserpage' => 'যি আই.পি. ঠিকনাৰ পৰা আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিছে তাৰ সদসà§à¦¯ পৃষà§à¦ à¦¾',
-'tooltip-pt-mytalk' => 'আপোনাৰ আলোচনা পৃষà§à¦ à¦¾',
-'tooltip-pt-anontalk' => 'à¦à¦‡ আই.পি. ঠিকনাৰ পৰা কৰা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হৰ আলোচনা',
-'tooltip-pt-preferences' => 'মোৰ পচনà§à¦¦',
-'tooltip-pt-watchlist' => 'আপà§à¦¨à¦¿ সালসলনিৰ গতিবিধি লকà§à¦·à§à¦¯ কৰি থকা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ সà§à¦šà§€',
-'tooltip-pt-mycontris' => 'আপোনাৰ বৰঙণিৰ তালিকা',
-'tooltip-pt-login' => "বাধà§à¦¯à¦¤à¦¾à¦®à§‚লক নহ'লেও লগ-ইন কৰাটো বাঞà§à¦šà¦¨à§€à¦¯à¦¼",
-'tooltip-pt-anonlogin' => 'বাধà§à¦¯à¦¤à¦¾à¦®à§‚লক নহ’লেও লগ-ইন কৰাটো বাঞà§à¦šà¦¨à§€à¦¯à¦¼',
-'tooltip-pt-logout' => 'পà§à§°à¦¸à§à¦¥à¦¾à¦¨',
-'tooltip-ca-talk' => 'সংশà§à¦²à¦¿à¦·à§à¦Ÿ পà§à§°à¦¬à¦¨à§à¦§ সমà§à¦ªà§°à§à¦•à§€à¦¯à¦¼ আলোচনা',
-'tooltip-ca-edit' => 'আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ সালসলনি কৰিব পাৰে, অনà§à¦—à§à§°à¦¹ কৰি সালসলনি সাচী থোৱাৰ আগতে খচৰা চাই লব',
-'tooltip-ca-addsection' => 'নতà§à¦¨ অনà§à¦šà§à¦›à§‡à¦¦ আৰমà§à¦­ কৰক',
-'tooltip-ca-viewsource' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সংৰকà§à¦·à¦¿à¦¤ কৰা হৈছে, আপà§à¦¨à¦¿ ইয়াৰ উৎস চাব পাৰে।',
-'tooltip-ca-history' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° যোৱা সংসà§à¦•à§°à¦£à¦¸à¦®à§‚হ',
-'tooltip-ca-protect' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰক',
-'tooltip-ca-unprotect' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° সংৰকà§à¦·à¦£ সলনি কৰক',
-'tooltip-ca-delete' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰক',
-'tooltip-ca-undelete' => 'বিলোপ কৰাৰ আগেয়ে কৰা পৃষà§à¦ à¦¾à¦–নৰ সালসলনিসমূহ পà§à¦¨à¦ƒà¦¸à¦‚সà§à¦¥à¦¾à¦ªà¦¨ কৰক',
-'tooltip-ca-move' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¿à¦¤ কৰক',
-'tooltip-ca-watch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আপোনাৰ লকà§à¦·à§à¦¯-তালিকাত যোগ কৰক',
-'tooltip-ca-unwatch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আপোনাৰ লকà§à¦·à§à¦¯-তালিকাৰ পৰা আà¦à¦¤à§°à¦¾à¦“ক',
-'tooltip-search' => '{{SITENAME}} -ত সনà§à¦§à¦¾à¦¨à¦¾à§°à§à¦¥à§‡',
-'tooltip-search-go' => 'যদি আছে, তেহে ঠিক সেই নামৰ পৃষà§à¦ à¦¾à¦²à§ˆ যাওক',
-'tooltip-search-fulltext' => 'à¦à¦‡ পাঠ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হত বিচাৰক',
-'tooltip-p-logo' => 'বেটà§à¦ªà¦¾à¦¤ খà§à¦²à¦¿à¦¬à§° কাৰণে',
-'tooltip-n-mainpage' => 'বেটà§à¦ªà¦¾à¦¤ খà§à¦²à¦¿à¦¬à§° কাৰণে',
-'tooltip-n-mainpage-description' => 'পà§à§°à¦¥à¦® পৃষà§à¦ à¦¾ পৰিদৰà§à¦¶à¦¨ কৰক',
-'tooltip-n-portal' => 'ৱিকিপিডিয়া বà§à§°à¦¾à¦“জ কৰিবলৈ',
-'tooltip-n-currentevents' => 'সামà§à¦ªà§à§°à¦¤à¦¿à¦• ঘটনাৱলীৰ পটভূমি',
-'tooltip-n-recentchanges' => 'শেহতীয়া সালসলনিসমূহৰ সূচী',
-'tooltip-n-randompage' => 'অ-পূৰà§à¦¬à¦¨à¦¿à§°à§à¦§à¦¾à§°à¦¿à¦¤à¦­à¦¾à¦¬à§‡ যিকোনো à¦à¦Ÿà¦¾ পৃষà§à¦ à¦¾ দেখà§à§±à¦¾à¦¬à§° কাৰণে',
-'tooltip-n-help' => 'সহায়ৰ বাবে ইয়াত কà§à¦²à¦¿à¦• কৰক',
-'tooltip-t-whatlinkshere' => 'ইয়ালৈ সংযোজিত সকলো পৃষà§à¦ à¦¾à§° সà§à¦šà§€',
-'tooltip-t-recentchangeslinked' => 'সংযà§à¦•à§à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ শেহতীয়া সালসলনিসমূহ',
-'tooltip-feed-rss' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° বাবে আৰ-à¦à¦š-à¦à¦š ফিড',
-'tooltip-feed-atom' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° বাবে à¦à¦Ÿà¦® ফিড',
-'tooltip-t-contributions' => 'à¦à¦‡ সদসà§à¦¯à¦œà¦¨à§° অৰিহনাসমূহৰ সূচী চাওক',
-'tooltip-t-emailuser' => 'à¦à¦‡ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ ই-মেইল পঠাওক',
-'tooltip-t-upload' => "ফাইল আপল'ডৰ বাবে",
-'tooltip-t-specialpages' => 'বিশেষ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ সূচী',
-'tooltip-t-print' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° ছপা উপযোগী সংসà§à¦•à§°à¦£',
-'tooltip-t-permalink' => 'পৃষà§à¦ à¦¾à§° à¦à¦‡ সংসà§à¦•à§°à¦£à§° সà§à¦¥à¦¾à¦¯à¦¼à§€ সংযোগ',
-'tooltip-ca-nstab-main' => 'à¦à¦‡ ৱিকিৰ সূচী চাওক',
-'tooltip-ca-nstab-user' => 'সভà§à¦¯à§° বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত পৃষà§à¦ à¦¾à¦²à§ˆ',
-'tooltip-ca-nstab-media' => 'মিডিয়া পৃষà§à¦ à¦¾à¦–ন চাওক',
-'tooltip-ca-nstab-special' => 'à¦à¦‡à¦–ন à¦à¦–ন বিশেষ পৃষà§à¦ à¦¾, আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিব নোৱাৰে',
-'tooltip-ca-nstab-project' => 'পà§à§°à¦•à¦²à§à¦ª পৃষà§à¦ à¦¾ চাওক',
-'tooltip-ca-nstab-image' => 'ফাইল পৃষà§à¦ à¦¾ চাওক',
-'tooltip-ca-nstab-mediawiki' => 'পà§à§°à¦£à¦¾à¦²à§€ বাৰà§à¦¤à¦¾ চাওক',
-'tooltip-ca-nstab-template' => 'সাà¦à¦š চাওক',
-'tooltip-ca-nstab-help' => 'সহায় পৃষà§à¦ à¦¾ চাওক',
-'tooltip-ca-nstab-category' => 'শà§à§°à§‡à¦£à§€ পৃষà§à¦ à¦¾ চাওক',
-'tooltip-minoredit' => 'ইয়াক অগà§à§°à§à¦¤à§à¦¬à¦ªà§‚ৰà§à¦£ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ৰূপে চিহà§à¦¨à¦¿à¦¤ কৰক।',
-'tooltip-save' => 'আপà§à¦¨à¦¿ কৰা সালসলনি সাà¦à¦šà¦¿ থওক',
-'tooltip-preview' => 'আপà§à¦¨à¦¿ কৰা সালসলনিবোৰৰ খচৰা চাওক, অনà§à¦—à§à§°à¦¹ কৰি সালসলনি সাà¦à¦šà¦¿ থোৱাৰ আগতে বà§à¦¯à§±à¦¹à¦¾à§° কৰক!',
-'tooltip-diff' => 'ইয়াত আপà§à¦¨à¦¿ কৰা সালসলনিবোৰ দেখà§à§±à¦¾à¦“ক',
-'tooltip-compareselectedversions' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦¤ নিৰà§à¦¬à¦¾à¦šà¦¿à¦¤ দà§à¦Ÿà¦¾ সংশোধনৰ মাজত পাৰà§à¦¥à¦•à§à¦¯ দেখà§à§±à¦¾à¦“ক',
-'tooltip-watch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আপোনাৰ লকà§à¦·à§à¦¯-তালিকাভà§à¦•à§à¦¤ কৰক',
-'tooltip-recreate' => 'বিলোপ কৰা সতà§à¦¬à§‡à¦“ পৃষà§à¦ à¦¾à¦–ন পà§à¦¨à§° সৃষà§à¦Ÿà¦¿ কৰক',
-'tooltip-upload' => "আপল'ড আৰমà§à¦­ কৰক",
-'tooltip-rollback' => '"ৰ\'লবেক"ঠà¦à¦Ÿà¦¾ কà§à¦²à¦¿à¦•à¦¤ à¦à¦‡ পৃষà§à¦ à¦¾à§° শেষ অৱদানকাৰীৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বাতিল কৰি ইয়াক পূৰà§à¦¬à¦¾à§±à¦¸à§à¦¥à¦¾à¦²à§ˆ ঘূৰাই নিব।',
-'tooltip-undo' => '"বাতিল"ঠà¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦• পূৰà§à¦¬à¦¾à§±à¦¸à§à¦¥à¦¾à¦²à§ˆ ঘূৰাই নিব আৰৠপà§à§°à¦¾à¦•à§â€Œà¦¦à§°à§à¦¶à¦¨à§° বাবে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà§‹ খà§à¦²à¦¿à¦¬à¥¤ ই সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সাৰাংশত কাৰণ à¦à¦Ÿà¦¾ লিখিবলৈ সà§à¦¯à§‹à¦— দিব।',
-'tooltip-preferences-save' => 'পছনà§à¦¦à¦¸à¦®à§‚হ সাà¦à¦šà¦¿ থওক',
-'tooltip-summary' => 'চমৠসাৰাংশ লিখক',
+'tooltip-pt-userpage' => 'আপোনাৰ সদসà§à¦¯ পৃষà§à¦ à¦¾',
+'tooltip-pt-anonuserpage' => 'যি আই.পি. ঠিকনাৰ পৰা আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিছে তাৰ সদসà§à¦¯ পৃষà§à¦ à¦¾',
+'tooltip-pt-mytalk' => 'আপোনাৰ আলোচনা পৃষà§à¦ à¦¾',
+'tooltip-pt-anontalk' => 'à¦à¦‡ আই.পি. ঠিকনাৰ পৰা কৰা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হৰ আলোচনা',
+'tooltip-pt-preferences' => 'মোৰ পচনà§à¦¦',
+'tooltip-pt-watchlist' => 'আপà§à¦¨à¦¿ সালসলনিৰ গতিবিধি লকà§à¦·à§à¦¯ কৰি থকা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ সà§à¦šà§€',
+'tooltip-pt-mycontris' => 'আপোনাৰ বৰঙণিৰ তালিকা',
+'tooltip-pt-login' => "বাধà§à¦¯à¦¤à¦¾à¦®à§‚লক নহ'লেও লগ-ইন কৰাটো বাঞà§à¦šà¦¨à§€à¦¯à¦¼",
+'tooltip-pt-anonlogin' => 'বাধà§à¦¯à¦¤à¦¾à¦®à§‚লক নহ’লেও লগ-ইন কৰাটো বাঞà§à¦šà¦¨à§€à¦¯à¦¼',
+'tooltip-pt-logout' => 'পà§à§°à¦¸à§à¦¥à¦¾à¦¨',
+'tooltip-ca-talk' => 'সংশà§à¦²à¦¿à¦·à§à¦Ÿ পà§à§°à¦¬à¦¨à§à¦§ সমà§à¦ªà§°à§à¦•à§€à¦¯à¦¼ আলোচনা',
+'tooltip-ca-edit' => 'আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ সালসলনি কৰিব পাৰে, অনà§à¦—à§à§°à¦¹ কৰি সালসলনি সাচী থোৱাৰ আগতে খচৰা চাই লব',
+'tooltip-ca-addsection' => 'নতà§à¦¨ অনà§à¦šà§à¦›à§‡à¦¦ আৰমà§à¦­ কৰক',
+'tooltip-ca-viewsource' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সংৰকà§à¦·à¦¿à¦¤ কৰা হৈছে, আপà§à¦¨à¦¿ ইয়াৰ উৎস চাব পাৰে।',
+'tooltip-ca-history' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° যোৱা সংসà§à¦•à§°à¦£à¦¸à¦®à§‚হ',
+'tooltip-ca-protect' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰক',
+'tooltip-ca-unprotect' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° সংৰকà§à¦·à¦£ সলনি কৰক',
+'tooltip-ca-delete' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰক',
+'tooltip-ca-undelete' => 'বিলোপ কৰাৰ আগেয়ে কৰা পৃষà§à¦ à¦¾à¦–নৰ সালসলনিসমূহ পà§à¦¨à¦ƒà¦¸à¦‚সà§à¦¥à¦¾à¦ªà¦¨ কৰক',
+'tooltip-ca-move' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¿à¦¤ কৰক',
+'tooltip-ca-watch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আপোনাৰ লকà§à¦·à§à¦¯-তালিকাত যোগ কৰক',
+'tooltip-ca-unwatch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আপোনাৰ লকà§à¦·à§à¦¯-তালিকাৰ পৰা আà¦à¦¤à§°à¦¾à¦“ক',
+'tooltip-search' => '{{SITENAME}} -ত সনà§à¦§à¦¾à¦¨à¦¾à§°à§à¦¥à§‡',
+'tooltip-search-go' => 'যদি আছে, তেহে ঠিক সেই নামৰ পৃষà§à¦ à¦¾à¦²à§ˆ যাওক',
+'tooltip-search-fulltext' => 'à¦à¦‡ পাঠ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হত বিচাৰক',
+'tooltip-p-logo' => 'বেটà§à¦ªà¦¾à¦¤ খà§à¦²à¦¿à¦¬à§° কাৰণে',
+'tooltip-n-mainpage' => 'বেটà§à¦ªà¦¾à¦¤ খà§à¦²à¦¿à¦¬à§° কাৰণে',
+'tooltip-n-mainpage-description' => 'পà§à§°à¦¥à¦® পৃষà§à¦ à¦¾ পৰিদৰà§à¦¶à¦¨ কৰক',
+'tooltip-n-portal' => 'ৱিকিপিডিয়া বà§à§°à¦¾à¦“জ কৰিবলৈ',
+'tooltip-n-currentevents' => 'সামà§à¦ªà§à§°à¦¤à¦¿à¦• ঘটনাৱলীৰ পটভূমি',
+'tooltip-n-recentchanges' => 'শেহতীয়া সালসলনিসমূহৰ সূচী',
+'tooltip-n-randompage' => 'অ-পূৰà§à¦¬à¦¨à¦¿à§°à§à¦§à¦¾à§°à¦¿à¦¤à¦­à¦¾à¦¬à§‡ যিকোনো à¦à¦Ÿà¦¾ পৃষà§à¦ à¦¾ দেখà§à§±à¦¾à¦¬à§° কাৰণে',
+'tooltip-n-help' => 'সহায়ৰ বাবে ইয়াত কà§à¦²à¦¿à¦• কৰক',
+'tooltip-t-whatlinkshere' => 'ইয়ালৈ সংযোজিত সকলো পৃষà§à¦ à¦¾à§° সà§à¦šà§€',
+'tooltip-t-recentchangeslinked' => 'সংযà§à¦•à§à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ শেহতীয়া সালসলনিসমূহ',
+'tooltip-feed-rss' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° বাবে আৰ-à¦à¦š-à¦à¦š ফিড',
+'tooltip-feed-atom' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° বাবে à¦à¦Ÿà¦® ফিড',
+'tooltip-t-contributions' => 'à¦à¦‡ সদসà§à¦¯à¦œà¦¨à§° অৰিহনাসমূহৰ সূচী চাওক',
+'tooltip-t-emailuser' => 'à¦à¦‡ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ ই-মেইল পঠাওক',
+'tooltip-t-upload' => "ফাইল আপল'ডৰ বাবে",
+'tooltip-t-specialpages' => 'বিশেষ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ সূচী',
+'tooltip-t-print' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° ছপা উপযোগী সংসà§à¦•à§°à¦£',
+'tooltip-t-permalink' => 'পৃষà§à¦ à¦¾à§° à¦à¦‡ সংসà§à¦•à§°à¦£à§° সà§à¦¥à¦¾à¦¯à¦¼à§€ সংযোগ',
+'tooltip-ca-nstab-main' => 'à¦à¦‡ ৱিকিৰ সূচী চাওক',
+'tooltip-ca-nstab-user' => 'সভà§à¦¯à§° বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত পৃষà§à¦ à¦¾à¦²à§ˆ',
+'tooltip-ca-nstab-media' => 'মিডিয়া পৃষà§à¦ à¦¾à¦–ন চাওক',
+'tooltip-ca-nstab-special' => 'à¦à¦‡à¦–ন à¦à¦–ন বিশেষ পৃষà§à¦ à¦¾, আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিব নোৱাৰে',
+'tooltip-ca-nstab-project' => 'পà§à§°à¦•à¦²à§à¦ª পৃষà§à¦ à¦¾ চাওক',
+'tooltip-ca-nstab-image' => 'ফাইল পৃষà§à¦ à¦¾ চাওক',
+'tooltip-ca-nstab-mediawiki' => 'পà§à§°à¦£à¦¾à¦²à§€ বাৰà§à¦¤à¦¾ চাওক',
+'tooltip-ca-nstab-template' => 'সাà¦à¦š চাওক',
+'tooltip-ca-nstab-help' => 'সহায় পৃষà§à¦ à¦¾ চাওক',
+'tooltip-ca-nstab-category' => 'শà§à§°à§‡à¦£à§€ পৃষà§à¦ à¦¾ চাওক',
+'tooltip-minoredit' => 'ইয়াক অগà§à§°à§à¦¤à§à¦¬à¦ªà§‚ৰà§à¦£ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ৰূপে চিহà§à¦¨à¦¿à¦¤ কৰক।',
+'tooltip-save' => 'আপà§à¦¨à¦¿ কৰা সালসলনি সাà¦à¦šà¦¿ থওক',
+'tooltip-preview' => 'আপà§à¦¨à¦¿ কৰা সালসলনিবোৰৰ খচৰা চাওক, অনà§à¦—à§à§°à¦¹ কৰি সালসলনি সাà¦à¦šà¦¿ থোৱাৰ আগতে বà§à¦¯à§±à¦¹à¦¾à§° কৰক!',
+'tooltip-diff' => 'ইয়াত আপà§à¦¨à¦¿ কৰা সালসলনিবোৰ দেখà§à§±à¦¾à¦“ক',
+'tooltip-compareselectedversions' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦¤ নিৰà§à¦¬à¦¾à¦šà¦¿à¦¤ দà§à¦Ÿà¦¾ সংশোধনৰ মাজত পাৰà§à¦¥à¦•à§à¦¯ দেখà§à§±à¦¾à¦“ক',
+'tooltip-watch' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন আপোনাৰ লকà§à¦·à§à¦¯-তালিকাভà§à¦•à§à¦¤ কৰক',
+'tooltip-watchlistedit-normal-submit' => 'শিৰোনামা আà¦à¦¤à§°à¦¾à¦“ক',
+'tooltip-watchlistedit-raw-submit' => 'লকà§à¦·à§à¦¯-তালিকা আপডেট কৰক',
+'tooltip-recreate' => 'বিলোপ কৰা সতà§à¦¬à§‡à¦“ পৃষà§à¦ à¦¾à¦–ন পà§à¦¨à§° সৃষà§à¦Ÿà¦¿ কৰক',
+'tooltip-upload' => "আপল'ড আৰমà§à¦­ কৰক",
+'tooltip-rollback' => '"ৰ\'লবেক"ঠà¦à¦Ÿà¦¾ কà§à¦²à¦¿à¦•à¦¤ à¦à¦‡ পৃষà§à¦ à¦¾à§° শেষ অৱদানকাৰীৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বাতিল কৰি ইয়াক পূৰà§à¦¬à¦¾à§±à¦¸à§à¦¥à¦¾à¦²à§ˆ ঘূৰাই নিব।',
+'tooltip-undo' => '"বাতিল"ঠà¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦• পূৰà§à¦¬à¦¾à§±à¦¸à§à¦¥à¦¾à¦²à§ˆ ঘূৰাই নিব আৰৠপà§à§°à¦¾à¦•à§â€Œà¦¦à§°à§à¦¶à¦¨à§° বাবে সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà§‹ খà§à¦²à¦¿à¦¬à¥¤ ই সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সাৰাংশত কাৰণ à¦à¦Ÿà¦¾ লিখিবলৈ সà§à¦¯à§‹à¦— দিব।',
+'tooltip-preferences-save' => 'পছনà§à¦¦à¦¸à¦®à§‚হ সাà¦à¦šà¦¿ থওক',
+'tooltip-summary' => 'চমৠসাৰাংশ লিখক',
# Metadata
'notacceptable' => 'ৱিকি চাৰà§à¦­à¦¾à§°à§‡ আপোনাৰ কà§à¦²à¦¾à¦à¦¨à§à¦Ÿà§‡ পঢ়িব পৰা বিনà§à¦¯à¦¾à¦¸à¦¤ তথà§à¦¯ পà§à§°à¦¦à¦¾à¦¨ কৰিব নোৱাৰে।',
@@ -2786,8 +2839,6 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
# Patrol log
'patrol-log-page' => "নিৰীকà§à¦·à¦£ ল'গ",
'patrol-log-header' => "à¦à¦‡à¦–ন নিৰীকà§à¦·à¦¿à¦¤ সংশোধনসমূহৰ ল'গ ।",
-'patrol-log-auto' => '(সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼)',
-'patrol-log-diff' => 'সংশোধন $1',
'log-show-hide-patrol' => "নিৰীকà§à¦·à¦£ ল'গ $1",
# Image deletion
@@ -2806,23 +2857,25 @@ $1',
'nextdiff' => 'নতà§à¦¨à¦¤à§° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ →',
# Media information
-'mediawarning' => "'''সতৰà§à¦•à¦¬à¦¾à§°à§à¦¤à¦¾''': à¦à¦‡ নথিপতà§à§°à¦¤ তà§à§°à§à¦Ÿà¦¿à¦ªà§‚ৰà§à¦£ ক'ড অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ থাকিব পাৰে।
+'mediawarning' => "'''সতৰà§à¦•à¦¬à¦¾à§°à§à¦¤à¦¾''': à¦à¦‡ নথিপতà§à§°à¦¤ তà§à§°à§à¦Ÿà¦¿à¦ªà§‚ৰà§à¦£ ক'ড অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ থাকিব পাৰে।
ইয়াক পà§à§°à§‡à§°à¦£ কৰিলে আপোনাৰ চিষà§à¦Ÿà§‡à¦®à§° কà§à¦·à¦¤à¦¿ হব পাৰে।",
-'imagemaxsize' => "ছবিৰ আকাৰৰ সীমা: <br />''(নথিপতà§à§° বিৱৰণ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ বাবে)''",
-'thumbsize' => 'কà§à¦·à§à¦¦à§à§° পà§à§°à¦¤à¦¿à¦•à§ƒà¦¤à¦¿à§° আকাৰ:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|পৃষà§à¦ à¦¾|পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ}}',
-'file-info' => 'ফাইল আকাৰ: $1, MIME ধৰণ: $2',
-'file-info-size' => '$1 × $2 পিকà§à¦¸à§‡à¦², ফাইলৰ মাতà§à§°à¦¾: $3, MIME পà§à§°à¦•à¦¾à§°: $4',
-'file-info-size-pages' => '$1 × $2 পিকà§à¦¸à§‡à¦²à¦¸à¦®à§‚হ, নথিপতà§à§°à§° আকাৰ: $3, MIME ধৰণ: $4, $5 {{PLURAL:$5|page|pages}}',
-'file-nohires' => '<small>ইয়াতকৈ ডাঙৰকৈ দেখà§à§±à¦¾à¦¬ নোৱাৰি ।</small>',
-'svg-long-desc' => 'SVG ফাইল, সাধাৰণতঃ $1 × $2 পিকà§à¦¸à§‡à¦², ফাইল মাতà§à§°à¦¾: $3',
-'show-big-image' => 'সমà§à¦ªà§‚ৰà§à¦£ দৃশà§à¦¯',
-'show-big-image-size' => '$1 × $2 পিকà§à¦¸à§‡à¦²',
-'file-info-gif-looped' => 'লà§à¦ªà¦•à§ƒà¦¤',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|ফà§à§°à§‡à¦®|ফà§à§°à§‡à¦®}}',
-'file-info-png-looped' => 'লà§à¦ªà¦•à§ƒà¦¤',
-'file-info-png-repeat' => "$1 {{PLURAL:$1|বাৰ|বাৰ}} চলোৱা হ'ল",
-'file-info-png-frames' => '$1 {{PLURAL:$1|ফà§à§°à§‡à¦®|ফà§à§°à§‡à¦®}}',
+'imagemaxsize' => "ছবিৰ আকাৰৰ সীমা: <br />''(নথিপতà§à§° বিৱৰণ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ বাবে)''",
+'thumbsize' => 'কà§à¦·à§à¦¦à§à§° পà§à§°à¦¤à¦¿à¦•à§ƒà¦¤à¦¿à§° আকাৰ:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|পৃষà§à¦ à¦¾|পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ}}',
+'file-info' => 'ফাইল আকাৰ: $1, MIME ধৰণ: $2',
+'file-info-size' => '$1 × $2 পিকà§à¦¸à§‡à¦², ফাইলৰ মাতà§à§°à¦¾: $3, MIME পà§à§°à¦•à¦¾à§°: $4',
+'file-info-size-pages' => '$1 × $2 পিকà§à¦¸à§‡à¦²à¦¸à¦®à§‚হ, নথিপতà§à§°à§° আকাৰ: $3, MIME ধৰণ: $4, $5 {{PLURAL:$5|page|pages}}',
+'file-nohires' => 'ইয়াতকৈ ডাঙৰকৈ দেখà§à§±à¦¾à¦¬ নোৱাৰি ।',
+'svg-long-desc' => 'SVG ফাইল, সাধাৰণতঃ $1 × $2 পিকà§à¦¸à§‡à¦², ফাইল মাতà§à§°à¦¾: $3',
+'show-big-image' => 'সমà§à¦ªà§‚ৰà§à¦£ দৃশà§à¦¯',
+'show-big-image-preview' => 'à¦à¦‡ খচৰাৰ আকাৰ: $1.',
+'show-big-image-other' => 'আন {{PLURAL:$2|ৰিজলিউচন|ৰিজলিউচনসমূহ}}: $1।',
+'show-big-image-size' => '$1 × $2 পিকà§à¦¸à§‡à¦²',
+'file-info-gif-looped' => 'লà§à¦ªà¦•à§ƒà¦¤',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|ফà§à§°à§‡à¦®|ফà§à§°à§‡à¦®}}',
+'file-info-png-looped' => 'লà§à¦ªà¦•à§ƒà¦¤',
+'file-info-png-repeat' => "$1 {{PLURAL:$1|বাৰ|বাৰ}} চলোৱা হ'ল",
+'file-info-png-frames' => '$1 {{PLURAL:$1|ফà§à§°à§‡à¦®|ফà§à§°à§‡à¦®}}',
# Special:NewFiles
'newimages' => 'নতà§à¦¨ ফাইলৰ বিথীকা',
@@ -2836,6 +2889,13 @@ $1',
'bydate' => 'তাৰিখ অনà§à¦¯à¦¾à¦¯à¦¼à§€',
'sp-newimages-showfrom' => '$2, $1 পৰা নতà§à¦¨ চিতà§à§°à¦¸à¦®à§‚হ দেখà§à§±à¦¾à¦“ক',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1ছেকেণà§à¦¡ |$1 ছেকেণà§à¦¡}}',
+'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
+'hours' => '{{PLURAL:$1|$1 ঘনà§à¦Ÿà¦¾|$1 ঘনà§à¦Ÿà¦¾}}',
+'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'ago' => '$1 আগেয়ে',
+
# Bad image list
'bad_image_list' => 'The format is as follows:
@@ -3338,11 +3398,6 @@ $5
'scarytranscludefailed' => '[$1ৰ বাবে সাà¦à¦š অনা অসফল হৈছে]',
'scarytranscludetoolong' => '[URL অতà§à¦¯à¦¾à¦§à¦¿à¦• দীঘল]',
-# Trackbacks
-'trackbackremove' => '([$1 বিলোপ])',
-'trackbacklink' => 'টà§à§°à§‡à¦•à¦¬à§‡à¦•',
-'trackbackdeleteok' => 'টà§à§°à§‡à¦•à¦¬à§‡à¦•à¦Ÿà§‹ সফলতাৰে বিলোপ কৰা হৈছে ।',
-
# Delete conflict
'deletedwhileediting' => "'''সতৰà§à¦•à¦¬à¦¾à¦£à§€''': আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ আৰমà§à¦­ কৰাৰ পিছত পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰা হৈছে !",
'confirmrecreate' => "আপà§à¦¨à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ আৰমà§à¦­ কৰাৰ পিছত সদসà§à¦¯ [[User:$1|$1]] ([[User talk:$1|আলোচনা]])য়ে পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰিছে, তাৰ কাৰণ:
@@ -3425,6 +3480,9 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
'watchlisttools-edit' => 'লকà§à¦·à§à¦¯-তালিকা চাওক আৰৠসমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'watchlisttools-raw' => 'অশোধিত লকà§à¦·à§à¦¯-তালিকা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])',
+
# Core parser functions
'unknown_extension_tag' => 'অজà§à¦žà¦¾à¦¤ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦šà¦¨ টেগ "$1"',
'duplicate-defaultsort' => '\'\'\'সাৱধান!\'\'\' পূৰà§à¦¬à¦¨à¦¿à§°à§à¦§à¦¾à§°à¦¿à¦¤ কà§à§°à¦®à¦¸à§‚চক "$2"-ঠআগৰ কà§à§°à¦®à¦¸à§‚চক "$1"-অক বিসà§à¦¥à¦¾à¦ªà¦¿à¦¤ কৰিছে।',
@@ -3525,13 +3583,16 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
'tags-hitcount' => '$1 {{PLURAL:$1|সাল-সলনি|সাল-সলনিসমূহ}}',
# Special:ComparePages
-'comparepages' => 'পৃষà§à¦ à¦¾ তà§à¦²à¦¨à¦¾ কৰক',
-'compare-selector' => 'পৃষà§à¦ à¦¾ পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ তà§à¦²à¦¨à¦¾ কৰক',
-'compare-page1' => 'পৃষà§à¦ à¦¾ ১',
-'compare-page2' => 'পৃষà§à¦ à¦¾ ২',
-'compare-rev1' => 'পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ ১',
-'compare-rev2' => 'পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ ২',
-'compare-submit' => 'তà§à¦²à¦¨à¦¾ কৰক',
+'comparepages' => 'পৃষà§à¦ à¦¾ তà§à¦²à¦¨à¦¾ কৰক',
+'compare-selector' => 'পৃষà§à¦ à¦¾ পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ তà§à¦²à¦¨à¦¾ কৰক',
+'compare-page1' => 'পৃষà§à¦ à¦¾ ১',
+'compare-page2' => 'পৃষà§à¦ à¦¾ ২',
+'compare-rev1' => 'পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ ১',
+'compare-rev2' => 'পà§à¦¨à§°à§€à¦•à§à¦·à¦¨ ২',
+'compare-submit' => 'তà§à¦²à¦¨à¦¾ কৰক',
+'compare-invalid-title' => 'আপà§à¦¨à¦¿ নিৰà§à¦§à¦¾à§°à¦£ কৰা শিৰোনামাটো অবৈধ ।',
+'compare-title-not-exists' => 'আপà§à¦¨à¦¿ নিৰà§à¦§à¦¾à§°à¦£ কৰা ফাইলটোৰ অসà§à¦¬à¦¿à¦¤à§à¦¬ নাই ।',
+'compare-revision-not-exists' => 'আপà§à¦¨à¦¿ নিৰà§à¦§à¦¾à§°à¦£ কৰা সংশোধনীটোৰ অসà§à¦¬à¦¿à¦¤à§à¦¬ নাই ।',
# Database error messages
'dberr-header' => 'à¦à¦‡ ৱিকিত à¦à¦Ÿà¦¾ সমসà§à¦¯à¦¾ হৈছে',
@@ -3559,4 +3620,72 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
'sqlite-has-fts' => '$1 সমà§à¦ªà§‚ৰà§à¦£-পাঠ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ সমৰà§à¦¥à¦¨ সহ',
'sqlite-no-fts' => '$1 সমà§à¦ªà§‚ৰà§à¦£-পাঠ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ সমৰà§à¦¥à¦¨ অবিহনে',
+# New logging system
+'logentry-delete-delete' => '$1 মচি পেলোৱা হল পৃষà§à¦ à¦¾ $3',
+'logentry-delete-restore' => '$1 পà§à¦¨à§° সংৰকà§à¦·à¦£ কৰা হল পৃষà§à¦ à¦¾ $3',
+'logentry-delete-event' => '$3: $4 -ত {{PLURAL:$5|à¦à¦Ÿà¦¾ লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰà§à¦¤à¦¨ কৰা দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-delete-revision' => 'পৃষà§à¦ à¦¾ $3: $4 -ত {{PLURAL:$5|à¦à¦Ÿà¦¾ পà§à¦¨à§°à§€à¦•à§à¦·à¦¨|$5 পà§à¦¨à§°à§€à¦•à§à¦·à¦¨à¦¸à¦®à§‚হ}} -ৰ $1 পৰিৱৰà§à¦¤à¦¨ কৰা হল দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-delete-event-legacy' => '$3 -ত লগ ঘটনামসমূহৰ $1 changed দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-delete-revision-legacy' => 'পৃষà§à¦ à¦¾ $3 -ত পà§à¦¨à§°à§€à¦•à§à¦·à¦¨à¦¸à¦®à§‚হৰ $1 changed দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-suppress-delete' => '$1 সংকোচিত পৃষà§à¦ à¦¾ $3',
+'logentry-suppress-event' => '$3: $4 -ত {{PLURAL:$5|à¦à¦Ÿà¦¾ লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 গোপন পৰিৱৰà§à¦¤à¦¨ কৰা হল দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-suppress-revision' => 'পৃষà§à¦ à¦¾ $3: $4 -ত {{PLURAL:$5|à¦à¦Ÿà¦¾ পà§à¦¨à§°à§€à¦•à§à¦·à¦¨|$5 পà§à¦¨à§°à§€à¦•à§à¦·à¦¨à¦¸à¦®à§‚হ}} -ৰ $1 গোপন পৰিৱৰà§à¦¤à¦¨à¦¸à¦®à§‚হ দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-suppress-event-legacy' => '$3 -ত লগ ঘটনাসমূহৰ $1 গোপন পৰিৱৰà§à¦¤à¦¨ কৰা হল দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾',
+'logentry-suppress-revision-legacy' => 'পৃষà§à¦ à¦¾ $3 -ত পà§à¦¨à§°à§€à¦•à§à¦·à¦¨à¦¸à¦®à§‚হৰ $1 গোপন পৰিৱৰà§à¦¤à¦¨ কৰা হল',
+'revdelete-content-hid' => 'বিষয়বসà§à¦¤à§ গোপন কৰা হৈছে',
+'revdelete-summary-hid' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সাৰাংশ গোপন কৰা হৈছে',
+'revdelete-uname-hid' => 'নিহিত সদসà§à¦¯à¦¨à¦¾à¦®',
+'revdelete-content-unhid' => 'বিষয়বসà§à¦¤à§ মà§à¦•à¦²à¦¿ কৰা হৈছে',
+'revdelete-summary-unhid' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সাৰাংশ মà§à¦•à¦²à¦¿ কৰা হৈছে',
+'revdelete-uname-unhid' => 'সদসà§à¦¯à¦¨à¦¾à¦® মà§à¦•à¦²à¦¿ কৰা হৈছে',
+'revdelete-restricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à§°à¦¶à¦¾à¦¸à¦•à§° কà§à¦·à§‡à¦¤à§à§°à¦¤ পà§à§°à¦¯à§‹à¦œà§à¦¯',
+'revdelete-unrestricted' => 'পà§à§°à¦¶à¦¾à¦¸à¦•à§° সীমাবদà§à¦§à¦¤à¦¾ বাতিল কৰা হ’ল',
+'logentry-move-move' => 'পৃষà§à¦ à¦¾ $3 -ৰ পৰা $4 -লে $1 সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হল',
+'logentry-move-move-noredirect' => 'পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶ নেৰাকৈ $1 সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হল পৃষà§à¦ à¦¾ $3 -ৰ পৰা $4',
+'logentry-move-move_redir' => 'পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à§°à§‡ পৃষà§à¦ à¦¾ $3 -ৰ পৰা $4 $1 সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হল',
+'logentry-move-move_redir-noredirect' => 'পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶ নেৰাকৈ à¦à¦Ÿà¦¾ পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à§° ওপৰেৰে পৃষà§à¦ à¦¾ $3 -ৰ পৰা $4 $1 সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হল',
+'logentry-patrol-patrol' => "পৃষà§à¦ à¦¾ $3 -ৰ $1 চিহà§à¦¨à¦¿à¦¤ সংশোধন $4 নিৰীকà§à¦·à¦£ কৰা হ'ল",
+'logentry-patrol-patrol-auto' => "পৃষà§à¦ à¦¾ $3 -ৰ $1 চিহà§à¦¨à¦¿à¦¤ সংশোধন $4 সà§à¦¬à¦šà¦¾à¦²à¦¿à¦¤à¦­à¦¾à§±à§‡ নিৰীকà§à¦·à¦£ কৰা হ'ল",
+'logentry-newusers-newusers' => '$1 -ঠসৃষà§à¦Ÿà¦¿ কৰিলে à¦à¦Ÿà¦¾ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ',
+'logentry-newusers-create' => '$1 -ঠসৃষà§à¦Ÿà¦¿ কৰিলে à¦à¦Ÿà¦¾ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ',
+'logentry-newusers-create2' => '$1 সৃষà§à¦Ÿà¦¿ কৰিলে à¦à¦Ÿà¦¾ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ $3',
+'logentry-newusers-autocreate' => 'à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ $1 -ক সà§à¦¬à¦šà¦¾à¦²à¦¿à¦¤à¦­à¦¾à§±à§‡ সৃষà§à¦Ÿà¦¿ কৰা হৈছিল',
+'newuserlog-byemail' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ই-মেইল কৰি পঠোৱা হৈছে',
+
+# Feedback
+'feedback-bugornote' => 'যদি আপà§à¦¨à¦¿ à¦à¦Ÿà¦¾ কাৰিকৰী সমসà§à¦¯à¦¾à§° বিৱৰণ দিবলে পà§à§°à¦¸à§à¦¤à§à¦¤ অনà§à¦—à§à§°à¦¹ কৰি [$1 à¦à¦Ÿà¦¾ বাগ সংবাদন কৰক]।
+নহলে, আপà§à¦¨à¦¿ তলৰ সহজ ফৰà§à¦® বà§à¦¯à§±à¦¹à¦¾à§° কৰিব পাৰিব। আপোনাৰ মনà§à¦¤à¦¬à§à¦¯ পৃষà§à¦ à¦¾ "[$3 $2]" -লে যোগ কৰা হব, আপোনাৰ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à¦¨à¦¾à¦® আৰৠআপà§à¦¨à¦¿ বà§à¦¯à§±à¦¹à¦¾à§° কৰা বà§à§°à¦¾à¦‰à¦›à¦¾à§°à§° সৈতে।',
+'feedback-subject' => 'বিষয়:',
+'feedback-message' => 'বাৰà§à¦¤à¦¾:',
+'feedback-cancel' => 'বাতিল কৰক',
+'feedback-submit' => 'পà§à§°à¦¤à¦¿à¦•à§à§°à¦¿à¦¯à¦¼à¦¾ জমা কৰক',
+'feedback-adding' => 'পৃষà§à¦ à¦¾à¦¤ পà§à§°à¦¤à¦¿à¦•à§à§°à¦¿à¦¯à¦¼à¦¾ যোগ কৰা হৈছে...',
+'feedback-error1' => 'তà§à§°à§à¦Ÿà¦¿: à¦.পি.আই.ৰ অজà§à¦žà¦¾à¦¤ ফলাফল',
+'feedback-error2' => 'তà§à§°à§à¦Ÿà¦¿: সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বিফল হৈছে',
+'feedback-error3' => 'তà§à§°à§à¦Ÿà¦¿: à¦.পি.আই.ৰ কোনো সà¦à¦¹à¦¾à§°à¦¿ নাই',
+'feedback-thanks' => 'ধনà§à¦¯à¦¬à¦¾à¦¦ ! আপোনাৰ পà§à§°à¦¤à¦¿à¦•à§à§°à¦¿à¦¯à¦¼à¦¾ "[$2 $1]" পৃষà§à¦ à¦¾à¦¤ পà§à§°à¦•à¦¾à¦¶ কৰা হৈছে।',
+'feedback-close' => 'কৰা হ’ল',
+'feedback-bugcheck' => 'অতি উতà§à¦¤à¦®! কেৱল পৰীকà§à¦·à¦¾ কৰক যে ই ইতিমধà§à¦¯à§‡ [$1 জà§à¦žà¦¾à¦¤ বাগসমূহ]ৰ à¦à¦Ÿà¦¾ নহয়।',
+'feedback-bugnew' => 'মই পৰীকà§à¦·à¦¾ কৰিলো। à¦à¦Ÿà¦¾ নতà§à¦¨ বাগ সংবাদন কৰক',
+
+# API errors
+'api-error-badaccess-groups' => "à¦à¦‡ ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।",
+'api-error-duplicate-archive-popup-title' => 'পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ {{PLURAL:$1|ফাইল|ফাইল}} যোনকেইটা ইতিমধà§à¦¯à§‡ মচা হৈছে।',
+'api-error-duplicate-popup-title' => 'পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ {{PLURAL:$1|ফাইল|ফাইল}}।',
+'api-error-empty-file' => 'আপà§à¦¨à¦¿ দাখিল কৰা ফাইলখন খালী ।',
+'api-error-emptypage' => 'নতà§à¦¨, খালী পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿ কৰিবলৈ অনà§à¦®à¦¤à¦¿ নাই।',
+'api-error-fetchfileerror' => 'আভà§à¦¯à¦¨à§à¦¤à§°à§€à¦£ তà§à§°à§à¦Ÿà¦¿: ফাইলটো অনাত কিবা সমসà§à¦¯à¦¾ হৈছে।',
+'api-error-file-too-large' => 'আপà§à¦¨à¦¿ দাখিল কৰা ফাইলখন বৰ ডাঙৰ ।',
+'api-error-filename-tooshort' => 'ফাইলৰ নামটো অতি চà§à¦Ÿà¦¿à¥¤',
+'api-error-filetype-banned' => 'à¦à¦‡ ধৰণৰ ফাইল নিষেধ ।',
+'api-error-filetype-missing' => 'ফাইলনামটোত à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à§â€Œà¦›à¦¨ নাই।',
+'api-error-illegal-filename' => 'ফাইলৰ à¦à¦‡ নামটো গà§à§°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নহয় ।',
+'api-error-mustbeloggedin' => "ফাইল আপল'ড কৰিবলৈ আপà§à¦¨à¦¿ লগà§â€Œ ইনà§â€Œ কৰিব লাগিব।",
+'api-error-unclassified' => 'à¦à¦• অজà§à¦žà¦¾à¦¤ সমসà§à¦¯à¦¾à¦‡ দেখা দিছে।',
+'api-error-unknown-code' => 'অজà§à¦žà¦¾à¦¤ সমসà§à¦¯à¦¾: "$1"।',
+'api-error-unknown-warning' => 'অজà§à¦žà¦¾à¦¤ সাৱধানবাণী: "$1"।',
+'api-error-unknownerror' => 'অজà§à¦žà¦¾à¦¤ সমসà§à¦¯à¦¾: "$1"।',
+'api-error-uploaddisabled' => "à¦à¦‡ ৱিকিত আপল'ড নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে।",
+'api-error-verification-error' => 'সমà§à¦­à§±à¦¤à¦ƒ à¦à¦‡ ফাইলটো তà§à§°à§à¦Ÿà¦¿à¦ªà§‚ৰà§à¦£ বা তাৰ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à§â€Œà¦›à¦¨à¦Ÿà§‹ ভà§à¦²à¥¤',
+
);
diff --git a/languages/messages/MessagesAst.php b/languages/messages/MessagesAst.php
index 69226e08..2560c486 100644
--- a/languages/messages/MessagesAst.php
+++ b/languages/messages/MessagesAst.php
@@ -415,23 +415,25 @@ Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotand
'badarticleerror' => 'Esta aición nun pue facese nesta páxina',
'cannotdelete' => 'Nun pudo desaniciase la páxina o el ficheru "$1".
Seique daquién yá la desaniciara.',
+'cannotdelete-title' => 'Nun se pue desaniciar la páxina "$1"',
'badtitle' => 'Títulu incorreutu',
'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces inter-llingua o inter-wiki incorreutos.
Pue contener ún o más caráuteres que nun se puen usar nos títulos.',
-'perfcached' => 'Los siguientes datos tán na caché y seique nun tean actualizaos dafechu.',
-'perfcachedts' => "Los siguientes datos tán na caché, y s'anovaron la cabera vegada'l $1.",
+'perfcached' => 'Los siguientes datos tán na caché, seique nun tean actualizaos dafechu. Hai un máximu de {{PLURAL:$1|$1 resultáu disponible|$1 resultaos disponibles}} na caché.',
+'perfcachedts' => "Los siguientes datos tán na caché, y s'anovaron la cabera vegada'l $1. Hai un máximu de {{PLURAL:$4|$4 resultáu disponible|$4 resultaos disponibles}} na caché.",
'querypage-no-updates' => "Los anovamientos d'esta páxina anguaño tán desactivaos.
Estos datos nun se refrescarán nestos momentos.",
'wrong_wfQuery_params' => 'Parámetros incorreutos pa wfQuery()<br />
Función: $1<br />
Consulta: $2',
'viewsource' => 'Ver códigu fonte',
-'viewsourcefor' => 'pa $1',
+'viewsource-title' => 'Ver la fonte de "$1"',
'actionthrottled' => 'Aición llendada',
'actionthrottledtext' => "Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.
Por favor vuelve a tentalo dientro d'unos minutos.",
'protectedpagetext' => 'Esta páxina ta candada pa torgar la so edición.',
'viewsourcetext' => "Pues ver y copiar el códigu fonte d'esta páxina:",
+'viewyourtext' => "Pues ver y copiar el códigu fonte de '''les tos ediciones''' d'esta páxina:",
'protectedinterface' => "Esta páxina proporciona testu d'interfaz a l'aplicación y ta candada pa evitar el so abusu.",
'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu de la interfaz a l'aplicación.
Los cambeos nesta páxina afeutarán a l'apariencia de la interfaz pa otros usuarios.
@@ -540,6 +542,7 @@ Nun s'unviará corréu de denguna de les funciones siguientes.",
'emailconfirmlink' => 'Confirmar la direición de corréu',
'invalidemailaddress' => "La direición de corréu nun se pue aceutar yá que paez tener un formatu non válidu.
Por favor escribi una direición con formatu afayadizu o dexa vaciu'l campu.",
+'cannotchangeemail' => 'Les direiciones de corréu de la cuenta nun puen camudase nesta wiki.',
'accountcreated' => 'Cuenta creada',
'accountcreatedtext' => "La cuenta d'usuariu de $1 ta creada.",
'createaccount-title' => 'Creación de cuenta pa {{SITENAME}}',
@@ -556,6 +559,7 @@ Por favor espera enantes d'intentalo otra vuelta.",
# E-mail sending
'php-mail-error-unknown' => 'Error desconocíu na función mail() de PHP',
+'user-mail-no-addy' => 'Tentasti unviar un corréu ensin direición de corréu electrónicu.',
# Change password dialog
'resetpass' => 'Camudar la conseña',
@@ -578,16 +582,18 @@ Seique yá camudasti correutamente la conseña o que pidieras una nueva conseña
'resetpass-temp-password' => 'Conseña temporal:',
# Special:PasswordReset
-'passwordreset' => 'Reaniciar conseña',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu que te recuerde los detalles de la to cuenta.',
-'passwordreset-legend' => 'Reaniciar conseña',
-'passwordreset-disabled' => 'Los reanicios de conseña tan desactivaos nesta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Escribi una de les partes de los datos d'abaxo}}",
-'passwordreset-username' => "Nome d'usuariu:",
-'passwordreset-domain' => 'Dominiu:',
-'passwordreset-email' => 'Direición de corréu electrónicu:',
-'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Dalguién (seique tu, dende la direición IP $1) pidió un recordatoriu cola
+'passwordreset' => 'Reaniciar conseña',
+'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu que te recuerde los detalles de la to cuenta.',
+'passwordreset-legend' => 'Reaniciar conseña',
+'passwordreset-disabled' => 'Los reanicios de conseña tan desactivaos nesta wiki.',
+'passwordreset-pretext' => "{{PLURAL:$1||Escribi una de les partes de los datos d'abaxo}}",
+'passwordreset-username' => "Nome d'usuariu:",
+'passwordreset-domain' => 'Dominiu:',
+'passwordreset-capture' => '¿Ver el mensaxe de corréu resultante?',
+'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola conseña temporal) de la que s'unvia al usuariu.",
+'passwordreset-email' => 'Direición de corréu electrónicu:',
+'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Dalguién (seique tu, dende la direición IP $1) pidió un recordatoriu cola
información de la to cuenta de {{SITENAME}} ($4).
{{PLURAL:$3|La siguiente cuenta d'usuariu ta asociada|Les siguientes cuentes d'usuariu tan asociaes}} con esta direición de corréu:
@@ -597,7 +603,7 @@ $2
Tendríes d'entrar al sistema y escoyer una conseña nueva agora. Si esta
solicitú ye d'otru o recordasti la conseña orixinal y nun quies camudala,
escaez esti mensaxe y sigui emplegando la conseña antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} pidió un recordatoriu cola información de la to cuenta de {{SITENAME}} ($4).
+'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} pidió un recordatoriu cola información de la to cuenta de {{SITENAME}} ($4).
{{PLURAL:$3|La siguiente cuenta d'usuariu ta asociada|Les siguientes cuentes d'usuariu tan asociaes}} con esta direición de corréu:
$2
@@ -606,9 +612,22 @@ $2
Tendríes d'entrar al sistema y escoyer una conseña nueva agora. Si esta
solicitú ye d'otru o recordasti la conseña orixinal y nun quies camudala,
escaez esti mensaxe y sigui emplegando la conseña antigua.",
-'passwordreset-emailelement' => "Nome d'usuariu: $1
+'passwordreset-emailelement' => "Nome d'usuariu: $1
Conseña temporal: $2",
-'passwordreset-emailsent' => "S'unvió un corréu de recordatoriu.",
+'passwordreset-emailsent' => "S'unvió un corréu de recordatoriu.",
+'passwordreset-emailsent-capture' => "S'unvió un corréu de recordatoriu, que s'amuesa abaxo.",
+'passwordreset-emailerror-capture' => "Se xeneró un corréu de recordatoriu, que s'amuesa abaxo; pero falló unvialu al usuariu: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Camudar la direición de corréu electrónicu',
+'changeemail-header' => 'Camudar la direición de corréu electrónicu de la cuenta',
+'changeemail-text' => "Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Tendrás d'escribir la to conseña pa confirmar esti cambiu.",
+'changeemail-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
+'changeemail-oldemail' => 'Direición de corréu electrónicu actual:',
+'changeemail-newemail' => 'Nueva direición de corréu electrónicu:',
+'changeemail-none' => '(nengún)',
+'changeemail-submit' => 'Camudar el corréu electrónicu',
+'changeemail-cancel' => 'Encaboxar',
# Edit page toolbar
'bold_sample' => 'Testu en negrina',
@@ -681,9 +700,6 @@ Fíxate en que nun pues usar la funcionalidá d\'"unvia-y un corréu a esti usua
La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
Por favor, amiesta toos estos detalles nes consultes que faigas.',
'blockednoreason' => 'nun se dio nengún motivu',
-'blockedoriginalsource' => "El códigu fonte de '''$1''' s'amuesa darréu:",
-'blockededitsource' => "El testu de '''les tos ediciones''' en '''$1''' s'amuesa darréu:",
-'whitelistedittitle' => 'Ye necesario tar identificáu pa poder editar',
'whitelistedittext' => 'Tienes que $1 pa editar páxines.',
'confirmedittext' => "Has confirmar la to direición de corréu electrónicu enantes d'editar páxines. Por favor, configúrala y valídala nes tos [[Special:Preferences|preferencies d'usuariu]].",
'nosuchsectiontitle' => 'Nun se pue alcontrar la seición',
@@ -764,7 +780,7 @@ Amás tas dexándonos afitao qu'escribisti esto tu mesmu o que lo copiasti d'una
'copyrightwarning2' => "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />
Amás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).
'''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
-'longpageerror' => "'''ERROR: El testu qu'unviasti tien $1 quilobytes, que ye más que'l máximu de $2 quilobytes.'''
+'longpageerror' => "'''ERROR: El testu qu'unviasti tien {{PLURAL:$1|un quilobyte|$1 quilobytes}}, que pasa del máximu de {{PLURAL:$2|un quilobyte|$2 quilobytes}}.'''
Nun se pue grabar.",
'readonlywarning' => "'''Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.'''
Seique habríes copiar el testu nun ficheru de testu y guardalu pa intentalo llueu.
@@ -934,8 +950,6 @@ Otros alministradores de {{SITENAME}} van siguir pudiendo acceder al conteníu a
'revdelete-unsuppress' => 'Eliminar restricciones de revisiones restauraes',
'revdelete-log' => 'Motivu:',
'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la revisión seleicionada|les revisiones seleicionaes}}',
-'revdelete-logentry' => 'camudada la visibilidá de revisiones de [[$1]]',
-'logdelete-logentry' => "camudada la visibilidá d'eventos de [[$1]]",
'revdelete-success' => "'''Visibilidá de revisiones anovada correutamente.'''",
'revdelete-failure' => "'''La visibilida de revisiones nun se pudo anovar:'''
$1",
@@ -947,15 +961,6 @@ $1",
'revdel-restore-visible' => 'revisiones visibles',
'pagehist' => 'Historial de la páxina',
'deletedhist' => 'Historial elimináu',
-'revdelete-content' => 'conteníu',
-'revdelete-summary' => 'editar resume',
-'revdelete-uname' => "nome d'usuariu",
-'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
-'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
-'revdelete-hid' => "ocultáu'l $1",
-'revdelete-unhid' => "amosáu'l $1",
-'revdelete-log-message' => '$1 pa {{PLURAL:$2|una revisión|$2 revisiones}}',
-'logdelete-log-message' => '$1 pa {{PLURAL:$2|un eventu|$2 eventos}}',
'revdelete-hide-current' => "Error al anubrir l'elementu con data $1, $2: esta ye la revisión actual.
Nun se pue anubrir.",
'revdelete-show-no-access' => 'Error al amosar l\'elementu con data $2, $1: esti elementu se marcó como "llendáu".
@@ -1111,12 +1116,14 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
'prefs-rc' => 'Cambios recientes',
'prefs-watchlist' => 'Llista de vixilancia',
'prefs-watchlist-days' => "Númberu de díes qu'amosar na llista de vixilancia:",
-'prefs-watchlist-days-max' => '7 díes máximo',
+'prefs-watchlist-days-max' => 'Máximo $1 {{PLURAL:$1|día|díes}}',
'prefs-watchlist-edits' => "Númberu d'ediciones qu'amosar na llista de vixilancia espandida:",
'prefs-watchlist-edits-max' => 'Númberu máximu: 1000',
'prefs-watchlist-token' => 'Marca de la llista de vixilancia:',
'prefs-misc' => 'Varios',
'prefs-resetpass' => 'Camudar la conseña',
+'prefs-changeemail' => 'Camudar el corréu electrónicu',
+'prefs-setemail' => 'Conseñar una direición de corréu electrónicu',
'prefs-email' => 'Opciones de corréu',
'prefs-rendering' => 'Aspeutu',
'saveprefs' => 'Guardar',
@@ -1176,6 +1183,7 @@ Esto nun se pue desfacer.',
'yourrealname' => 'Nome real:',
'yourlanguage' => 'Llingua:',
'yourvariant' => 'Variante llingüística del conteníu:',
+'prefs-help-variant' => "La ortografía o variante que prefieres p'amosar el conteníu de les páxines d'esta wiki.",
'yournick' => 'Firma:',
'prefs-help-signature' => 'Los comentarios nes páxines d\'alderique habría que roblales con "<nowiki>~~~~</nowiki>" que se convertirán na to robla y una marca de tiempu.',
'badsig' => 'Firma cruda non válida; comprueba les etiquetes HTML.',
@@ -1216,7 +1224,7 @@ Esta información sedrá pública.",
'userrights-lookup-user' => 'Xestión de grupos del usuariu',
'userrights-user-editname' => "Escribi un nome d'usuariu:",
'editusergroup' => "Modificar grupos d'usuariu",
-'editinguser' => "Camudando los drechos del usuariu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Camudando los permisos del usuariu '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Editar los grupos d'usuariu",
'saveusergroups' => "Guardar los grupos d'usuariu",
'userrights-groupsmember' => 'Miembru de:',
@@ -1310,13 +1318,13 @@ Esta información sedrá pública.",
'right-autopatrol' => 'Marcar automáticamente les ediciones como supervisaes',
'right-patrolmarks' => 'Ver les marques de supervisión de los cambeos recientes',
'right-unwatchedpages' => 'Ver una llista de páxines non vixilaes',
-'right-trackback' => 'Añader un retroenllaz',
'right-mergehistory' => 'Fusionar historiales de páxines',
'right-userrights' => "Editar tolos drechos d'usuariu",
'right-userrights-interwiki' => "Editar los drechos d'usuariu d'usuarios d'otros sitios wiki",
'right-siteadmin' => 'Candar y descandar la base de datos',
'right-override-export-depth' => 'Esportar páxines, incluyendo páxines enllazaes fasta una fondura de 5',
'right-sendemail' => 'Unviar corréu a otros usuarios',
+'right-passwordreset' => 'Ver los correos de reestablecimientu de conseña',
# User rights log
'rightslog' => "Rexistru de perfil d'usuariu",
@@ -1350,16 +1358,17 @@ Esta información sedrá pública.",
'action-suppressionlog' => 'ver esti rexistru priváu',
'action-block' => "bloquiar qu'esti usuariu edite",
'action-protect' => 'camudar los niveles de proteición pa esta páxina',
+'action-rollback' => "Revertir rápido les ediciones del caberu usuariu qu'editó una páxina determinada",
'action-import' => 'importar esta páxina dende otra wiki',
'action-importupload' => "importar esta páxina dende una xubida d'archivu",
'action-patrol' => "marcar les ediciones d'otros como supervisaes",
'action-autopatrol' => 'marcar la to edición como supervisada',
'action-unwatchedpages' => 'ver la llista de páxines non vixilaes',
-'action-trackback' => 'añader un retroenllaz',
'action-mergehistory' => "fusionar l'historial d'esta páxina",
'action-userrights' => "editar tolos drechos d'usuariu",
'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',
# Recent changes
'nchanges' => '{{PLURAL:$1|un cambiu|$1 cambios}}',
@@ -1391,6 +1400,7 @@ Esta información sedrá pública.",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usuariu|ususarios}} vixilando]',
'rc_categories' => 'Llímite pa les categoríes (dixebrar con "|")',
'rc_categories_any' => 'Cualesquiera',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} dempués del cambiu',
'newsectionsummary' => '/* $1 */ nueva seición',
'rc-enhanced-expand' => 'Amosar detalles (requier JavaScript)',
'rc-enhanced-hide' => 'Anubrir los detalles',
@@ -1443,6 +1453,7 @@ Mira la [[Special:NewFiles|galería d'archivos nuevos]] pa una güeyada más vis
'ignorewarnings' => 'Inorar tolos avisos',
'minlength1' => "Los nomes d'archivu han tener a lo menos una lletra.",
'illegalfilename' => 'El nome d\'archivu "$1" contién carauteres non permitíos en títulos de páxina. Por favor renoma l\'archivu y xúbilu otra vuelta.',
+'filename-toolong' => 'Los nomes de ficheru nun puen tener más de 240 bytes.',
'badfilename' => 'Nome de la imaxe camudáu a "$1".',
'filetype-mime-mismatch' => 'La estensión de ficheru ".$1" nun casa cola triba MIME detectada del ficheru ($2).',
'filetype-badmime' => 'Los ficheros de la triba MIME "$1" nun tienen permitida la xubida.',
@@ -1560,6 +1571,41 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
'upload-unknown-size' => 'Tamañu desconocíu',
'upload-http-error' => 'Hebo un error HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Nun se pudo tresmitir el ficheru $1.',
+'backend-fail-backup' => 'Nun se pudo facer copia de seguridá del ficheru $1.',
+'backend-fail-notexists' => 'El ficheru $1 nun esiste.',
+'backend-fail-hashes' => 'Nun se pudieron alcontrar los hashes del ficheru pa comparar.',
+'backend-fail-notsame' => 'Yá esiste un ficheru non idénticu en $1.',
+'backend-fail-invalidpath' => "$1 nun ye una ruta d'almacenamientu válida.",
+'backend-fail-delete' => 'Nun se pudo desaniciar el ficheru $1.',
+'backend-fail-alreadyexists' => 'El ficheru $1 yá esiste.',
+'backend-fail-store' => 'Nun se pudo guardar el ficheru $1 en $2.',
+'backend-fail-copy' => 'Nun se pudo copiar el ficheru $1 como $2.',
+'backend-fail-move' => 'Nun se pudo mover el ficheru $1 a $2.',
+'backend-fail-opentemp' => 'Nun se pudo abrir el ficheru temporal.',
+'backend-fail-writetemp' => 'Nun se pudo escribir nel ficheru temporal.',
+'backend-fail-closetemp' => 'Nun se pudo zarrar el ficheru temporal.',
+'backend-fail-read' => 'Nun se pudo lleer el ficheru $1.',
+'backend-fail-create' => 'Nun se pudo crear el ficheru $1.',
+'backend-fail-readonly' => 'Nesti momentu el motor d\'almacenamientu "$1" ta en mou de sólo llectura. El motivu dau foi: "$2"',
+'backend-fail-synced' => 'El ficheru "$1" ta nún estáu inconsistente colos motores d\'almacenamientu internos',
+'backend-fail-connect' => 'Nun se pudo coneutar col motor d\'almacenamientu "$1".',
+'backend-fail-internal' => 'Hebo un fallu desconocíu nel motor d\'almacenamientu "$1".',
+'backend-fail-contenttype' => 'Non se pudo determinar la triba de conteníu de ficheru a guardar en "$1".',
+'backend-fail-batchsize' => "El motor d'almacenamientu dio un llote de $1 {{PLURAL:$1|operación|operaciones}} en ficheros; el llímite ye de $2 {{PLURAL:$2|operación|operaciones}}.",
+
+# Lock manager
+'lockmanager-notlocked' => 'Nun se pudo desbloquiar "$1"; nun ta bloquiáu.',
+'lockmanager-fail-closelock' => 'Nun se pudo zarrar el ficheru de bloquéu pa "$1".',
+'lockmanager-fail-deletelock' => 'Non se pudo desaniciar el ficheru de bloquéu pa "$1".',
+'lockmanager-fail-acquirelock' => 'Nun se pudo adquirir el bloquéu pa "$1".',
+'lockmanager-fail-openlock' => 'Nun se pudo abrir el ficheru de bloquéu pa "$1".',
+'lockmanager-fail-releaselock' => 'Nun se pudo lliberar el bloquéu pa "$1".',
+'lockmanager-fail-db-bucket' => 'Nun se pudo contautar con bloqueos de bases de datos bastantes nel conxuntu $1.',
+'lockmanager-fail-db-release' => 'Nun se pudieron lliberar los bloqueos na base de datos $1.',
+'lockmanager-fail-svr-release' => 'Nun se pudieron lliberar los bloqueos nel sirvidor $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => "S'alcontró un fallu al abrir el ficheru pa les comprobaciones del ZIP.",
'zip-wrong-format' => 'El ficheru especificáu nun yera un ficheru ZIP.',
@@ -1576,6 +1622,7 @@ Nun se pue comprobar la seguridá de mou afayadizu.",
'uploadstash-badtoken' => 'Nun se pudo facer esa operación, seique porque caducó la identificación pa editar. Vuelvi a intentalo.',
'uploadstash-errclear' => 'Nun se pudieron desaniciar los ficheros.',
'uploadstash-refresh' => 'Anovar la llista de ficheros',
+'invalid-chunk-offset' => 'Allugamientu inválidu del fragmentu',
# img_auth script messages
'img-auth-accessdenied' => 'Accesu denegáu',
@@ -1682,23 +1729,24 @@ La descripción de la [páxina de descripción del ficheru $2] s'amuesa darréu.
'filerevert-badversion' => "Nun hai nenguna versión llocal previa d'esti archivu cola fecha conseñada.",
# File deletion
-'filedelete' => 'Desaniciar $1',
-'filedelete-legend' => 'Esborrar archivu',
-'filedelete-intro' => "Tas a piques d'esborrar el ficheru '''[[Media:$1|$1]]''' xunto con tol so historial.",
-'filedelete-intro-old' => "Tas esborrando la versión de '''[[Media:$1|$1]]''' del [$4 $3 a les $2].",
-'filedelete-comment' => 'Motivu:',
-'filedelete-submit' => 'Desaniciar',
-'filedelete-success' => "'''$1''' se desanició.",
-'filedelete-success-old' => "Eliminóse la versión de '''[[Media:$1|$1]]''' del $2 a les $3.",
-'filedelete-nofile' => "'''$1''' nun esiste.",
-'filedelete-nofile-old' => "Nun hai nenguna versión archivada de '''$1''' colos atributos especificaos.",
-'filedelete-otherreason' => 'Motivu distintu/adicional:',
-'filedelete-reason-otherlist' => 'Otru motivu',
-'filedelete-reason-dropdown' => "*Motivos comunes d'esborráu
+'filedelete' => 'Desaniciar $1',
+'filedelete-legend' => 'Esborrar archivu',
+'filedelete-intro' => "Tas a piques d'esborrar el ficheru '''[[Media:$1|$1]]''' xunto con tol so historial.",
+'filedelete-intro-old' => "Tas esborrando la versión de '''[[Media:$1|$1]]''' del [$4 $3 a les $2].",
+'filedelete-comment' => 'Motivu:',
+'filedelete-submit' => 'Desaniciar',
+'filedelete-success' => "'''$1''' se desanició.",
+'filedelete-success-old' => "Eliminóse la versión de '''[[Media:$1|$1]]''' del $2 a les $3.",
+'filedelete-nofile' => "'''$1''' nun esiste.",
+'filedelete-nofile-old' => "Nun hai nenguna versión archivada de '''$1''' colos atributos especificaos.",
+'filedelete-otherreason' => 'Motivu distintu/adicional:',
+'filedelete-reason-otherlist' => 'Otru motivu',
+'filedelete-reason-dropdown' => "*Motivos comunes d'esborráu
** Violación de Copyright
** Archivu duplicáu",
-'filedelete-edit-reasonlist' => "Editar los motivos d'esborráu",
-'filedelete-maintenance' => 'El desaniciu y restauración de ficheros ta desactivao temporalmente mientres ta en mantenimientu.',
+'filedelete-edit-reasonlist' => "Editar los motivos d'esborráu",
+'filedelete-maintenance' => 'El desaniciu y restauración de ficheros ta desactivao temporalmente mientres ta en mantenimientu.',
+'filedelete-maintenance-title' => 'Nun se pue desaniciar el ficheru',
# MIME search
'mimesearch' => 'Busca MIME',
@@ -1794,6 +1842,8 @@ Les entraes <del>tachaes</del> tan resueltes.',
'wantedpages' => 'Páxines buscaes',
'wantedpages-badtitle' => 'Títulu inválidu nel conxuntu de resultaos: $1',
'wantedfiles' => 'Archivos buscaos',
+'wantedfiletext-cat' => "Los ficheros siguientes tan usándose, pero nun esisten. Ye posible qu'apaezan ficheros de repositorios esternos ensin qu'esistan. Cualesquier falsu positivu tará <del>tacháu</del>. Amás, les páxines qu'inxerten ficheros que nun esisten apaecen na llista de [[:$1]].",
+'wantedfiletext-nocat' => "Los ficheros siguientes tan usándose, pero nun esisten. Ye posible qu'apaezan ficheros de repositorios esternos ensin qu'esistan. Cualesquier falsu positivu tará <del>tacháu</del>.",
'wantedtemplates' => 'Plantíes más buscaes',
'mostlinked' => 'Páxines más enllaciaes',
'mostlinkedcategories' => 'Categoríes más enllaciaes',
@@ -1802,6 +1852,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
'mostimages' => 'Archivos más enllaciaos',
'mostrevisions' => 'Páxines con más revisiones',
'prefixindex' => 'Toles páxines col prefixu',
+'prefixindex-namespace' => 'Toles páxines col prefixu (espaciu de nomes $1)',
'shortpages' => 'Páxines curties',
'longpages' => 'Páxines llargues',
'deadendpages' => 'Páxines ensin salida',
@@ -1818,7 +1869,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
'listusers-editsonly' => 'Amosar namái usuarios con ediciones',
'listusers-creationsort' => 'Ordenar por data de creación',
'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
-'usercreated' => 'Creáu el $1 a les $2',
+'usercreated' => "{{GENDER:$3|Creáu el|Creada'l}} $1 a les $2",
'newpages' => 'Páxines nueves',
'newpages-username' => "Nome d'usuariu:",
'ancientpages' => 'Páxines más vieyes',
@@ -1911,12 +1962,8 @@ Protocolos almitíos: <tt>$1</tt> (nun amiestes dengún d\'estos na to gueta).',
'activeusers-noresult' => "Nun s'alcontraron usuarios.",
# Special:Log/newusers
-'newuserlogpage' => "Rexistru de creación d'usuarios",
-'newuserlogpagetext' => "Esti ye un rexistru de creación d'usuarios.",
-'newuserlog-byemail' => 'conseña unviada per corréu electrónicu',
-'newuserlog-create-entry' => 'Usuariu nuevu',
-'newuserlog-create2-entry' => 'creó una cuenta nueva pa $1',
-'newuserlog-autocreate-entry' => 'Cuenta creada automáticamente',
+'newuserlogpage' => "Rexistru de creación d'usuarios",
+'newuserlogpagetext' => "Esti ye un rexistru de creación d'usuarios.",
# Special:ListGroupRights
'listgrouprights' => "Drechos de los grupos d'usuariu",
@@ -1947,7 +1994,7 @@ pa poder unviar correos a otros usuarios.',
'emailpagetext' => "Pues usar el formulariu d'embaxo pa unviar un corréu electrónicu a esti usuariu.
La direición de corréu electrónicu qu'especificasti nes [[Special:Preferences|tos preferencies d'usuariu]] va apaecer como la direición \"Dende\" del corréu, pa que'l que lo recibe seya quien a respondete direutamente a ti.",
'usermailererror' => "L'operador de corréu devolvió un error:",
-'defemailsubject' => 'Corréu electrónicu de {{SITENAME}}',
+'defemailsubject' => 'Corréu electrónicu del usuariu «$1» de {{SITENAME}}',
'usermaildisabled' => 'Corréu del usuariu desactiváu',
'usermaildisabledtext' => "Nun pues unviar corréu a otros usuarios d'esta wiki",
'noemailtitle' => 'Ensin direición de corréu',
@@ -2002,7 +2049,7 @@ Si más tarde quies quitala de la llista de vixilancia calca en "Dexar de vixila
'watchmethod-list' => 'comprobando ediciones recientes nes páxines vixilaes',
'watchlistcontains' => 'La to llista de vixilancia tien $1 {{PLURAL:$1|páxina|páxines}}.',
'iteminvalidname' => "Problema col elementu '$1', nome non válidu...",
-'wlnote' => "Abaxo {{PLURAL:$1|ta'l caberu cambéu|tán los caberos '''$1''' cambeos}} {{PLURAL:$2|na cabera hora|nes caberes '''$2''' hores}}.",
+'wlnote' => "Abaxo {{PLURAL:$1|ta'l caberu cambiu|tán los caberos '''$1''' cambios}} {{PLURAL:$2|na cabera hora|nes caberes '''$2''' hores}}, el día $3 a les $4.",
'wlshowlast' => 'Amosar les últimes $1 hores $2 díes $3',
'watchlist-options' => 'Opciones de la llista de vixilancia',
@@ -2067,8 +2114,6 @@ Por favor confirma que ye lo que quies facer, qu'entiendes les consecuencies, y
'actionfailed' => "Falló l'aición",
'deletedtext' => 'Esborróse "$1".
Mira en $2 la llista de les últimes páxines esborraes.',
-'deletedarticle' => 'esborró "[[$1]]"',
-'suppressedarticle' => 'suprimió "[[$1]]"',
'dellogpage' => 'Rexistru de desanicios',
'dellogpagetext' => 'Abaxo amuésase una llista de los artículos esborraos más recién.',
'deletionlog' => 'rexistru de desanicios',
@@ -2117,7 +2162,10 @@ Consulta la [[Special:ProtectedPages|llista de páxines protexíes]] pa ver les
'unprotectedarticle' => 'quitó-y la protección a "[[$1]]"',
'movedarticleprotection' => 'treslladó los parámetros de proteición dende "[[$2]]" a "[[$1]]"',
'protect-title' => 'Protexendo "$1"',
+'protect-title-notallowed' => 'Ver el nivel de proteición de "$1"',
'prot_1movedto2' => '[[$1]] treslladáu a [[$2]]',
+'protect-badnamespace-title' => 'Espaciu de nomes non protexible',
+'protect-badnamespace-text' => "Les páxines d'esti espaciu de nomes nun se puen protexer.",
'protect-legend' => 'Confirmar proteición',
'protectcomment' => 'Motivu:',
'protectexpiry' => 'Caduca:',
@@ -2138,6 +2186,7 @@ Esta ye la configuración actual pa la páxina '''$1''':",
'protect-level-sysop' => 'Namái alministradores',
'protect-summary-cascade' => 'en cascada',
'protect-expiring' => "caduca'l $1 (UTC)",
+'protect-expiring-local' => 'caduca el $1',
'protect-expiry-indefinite' => 'indefiníu',
'protect-cascade' => 'Páxines protexíes inxeríes nesta páxina (proteición en cascada)',
'protect-cantedit' => "Nun pues camudar los niveles de proteición d'esta páxina porque nun tienes permisu pa editala.",
@@ -2197,7 +2246,6 @@ revisión fuera restaurada o eliminada del archivu.",
'undeletereset' => 'Reaniciar',
'undeleteinvert' => 'Invertir seleición',
'undeletecomment' => 'Motivu:',
-'undeletedarticle' => 'restauró "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos',
'undeletedfiles' => '{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}',
@@ -2206,6 +2254,7 @@ revisión fuera restaurada o eliminada del archivu.",
Consulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.",
'undelete-header' => "Mira nel [[Special:Log/delete|rexistru d'esborraos]] les páxines esborraes recién.",
+'undelete-search-title' => 'Buscar páxines desaniciaes',
'undelete-search-box' => 'Buscar páxines desaniciaes',
'undelete-search-prefix' => "Amosar páxines qu'empecipien por:",
'undelete-search-submit' => 'Guetar',
@@ -2214,6 +2263,7 @@ Consulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y re
'undelete-bad-store-key' => "Nun se pue restaurar la revisión del archivu con fecha $1: yá nun esistía l'archivu nel momentu d'esborralu.",
'undelete-cleanup-error' => 'Error al esborrar l\'archivu non usáu "$1".',
'undelete-missing-filearchive' => "Nun se pue restaurar l'archivu col númberu d'identificación $1 porque nun ta na base de datos. Seique yá fuera restauráu.",
+'undelete-error' => 'Error al restaurar la páxina',
'undelete-error-short' => "Error al restaurar l'archivu: $1",
'undelete-error-long' => "Atopáronse errores al restaurar l'archivu:
@@ -2334,6 +2384,7 @@ Esto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWik
'blocklist-userblocks' => 'Anubrir los bloqueos de cuenta',
'blocklist-tempblocks' => 'Anubrir los bloqueos temporales',
'blocklist-addressblocks' => "Anubrir los bloqueos d'IP simples",
+'blocklist-rangeblocks' => 'Anubrir los bloqueos de rangu',
'blocklist-timestamp' => "Marca d'hora",
'blocklist-target' => 'Oxetivu',
'blocklist-expiry' => 'Caduca',
@@ -2356,6 +2407,7 @@ Esto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWik
'unblocklink' => 'desbloquiar',
'change-blocklink' => 'camudar el bloquéu',
'contribslink' => 'contribuciones',
+'emaillink' => 'unviar corréu',
'autoblocker' => 'Bloquiáu automáticamente porque la to direición IP foi usada recién por "[[User:$1|$1]]". El motivu del bloquéu de $1 ye: "$2"',
'blocklogpage' => 'Rexistru de bloqueos',
'blocklog-showlog' => "Esti usuariu recibió un bloquéu previamente.
@@ -2476,9 +2528,6 @@ Nestos casos vas tener que treslladar o fusionar la páxina manualmente.",
'movepage-page-moved' => 'Treslladóse la páxina $1 a $2.',
'movepage-page-unmoved' => 'Nun se pudo treslladar la páxina $1 a $2.',
'movepage-max-pages' => "Treslladóse'l máximu de $1 {{PLURAL:$1|páxina|páxinees}} y nun van treslladase más automáticamente.",
-'1movedto2' => '[[$1]] treslladáu a [[$2]]',
-'1movedto2_redir' => '[[$1]] treslladáu a [[$2]] sobre una redireición',
-'move-redirect-suppressed' => 'redireición desaniciada',
'movelogpage' => 'Rexistru de tresllaos',
'movelogpagetext' => 'Esta ye la llista de páxines treslladaes.',
'movesubpage' => '{{PLURAL:$1|Subpáxina|Subpáxines}}',
@@ -2491,7 +2540,7 @@ Nestos casos vas tener que treslladar o fusionar la páxina manualmente.",
La páxina de destín "[[:$1]]" yá esiste. ¿Quies esborrala pa dexar sitiu pal treslláu?',
'delete_and_move_confirm' => 'Sí, esborrar la páxina',
-'delete_and_move_reason' => 'Esborrada pa facer sitiu pal treslláu',
+'delete_and_move_reason' => 'Desaniciada pa facer sitiu pa treslladar dende «[[$1]]»',
'selfmove' => "Los nomes d'orixe y destín son los mesmos, nun se pue treslladar una páxina sobre ella mesma.",
'immobile-source-namespace' => 'Nun se puen treslladar páxines nel espaciu de nomes "$1"',
'immobile-target-namespace' => 'Nun se puen treslladar páxines al espaciu de nomes "$1"',
@@ -2524,9 +2573,11 @@ y seleiciona si quies la versión actual xunto con toles versiones antigües, xu
so historial, o namái la versión actual cola información de la postrer edición.
Por último, tamién pues usar un enllaz: p.e. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pa la páxina \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Esportar toles páxines',
'exportcuronly' => 'Amestar namái la revisión actual, non tol historial',
'exportnohistory' => "----
'''Nota:''' Desactivóse la esportación del historial completu de páxines al traviés d'esti formulariu por motivos de rendimientu.",
+'exportlistauthors' => 'Incluir una llista completa de collaboradores pa cada páxina',
'export-submit' => 'Esportar',
'export-addcattext' => 'Añader páxines dende la categoría:',
'export-addcat' => 'Amestar',
@@ -2559,6 +2610,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Llocalización de MediaW
'thumbnail_error' => 'Error al crear la miniatura: $1',
'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',
+'thumbnail-dest-create' => 'Nun se pudo guardar la miniatura nel destín',
'thumbnail_invalid_params' => 'Parámetros de miniatura non válidos',
'thumbnail_dest_directory' => 'Nun se pue crear el direutoriu de destín',
'thumbnail_image-type' => "Triba d'imaxe ensin sofitu",
@@ -2603,6 +2656,11 @@ Guárdalu nel ordenador y xúbilu equí.",
'import-upload' => 'Xubir datos XML',
'import-token-mismatch' => 'Perdiéronse los datos de la sesión. Intentalo otra vuelta.',
'import-invalid-interwiki' => "Nun se puede importar d'esi wiki.",
+'import-error-edit' => "La páxina $1 nun s'importó porque nun tienes permisu pa editala.",
+'import-error-create' => "La páxina $1 nun s'importó porque nun tienes permisu pa creala.",
+'import-error-interwiki' => "La páxina «$1» nun s'importó porque'l so nome ta acutáu pa enllaces esternos (interwiki).",
+'import-error-special' => "La páxina «$1» nun s'importó porque pertenez a un espaciu de nomes especial que nun permite les páxines.",
+'import-error-invalid' => "La páxina «$1» nun s'importó porque tien un nome inválidu.",
# Import log
'importlogpage' => "Rexistru d'importaciones",
@@ -2612,73 +2670,86 @@ Guárdalu nel ordenador y xúbilu equí.",
'import-logentry-interwiki' => 'treswikificada $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revisión|revisiones}} dende $2',
+# JavaScriptTest
+'javascripttest' => 'Prueba de JavaScript',
+'javascripttest-disabled' => 'Esta función ta desactivada.',
+'javascripttest-title' => 'Executando pruebes de $1',
+'javascripttest-pagetext-noframework' => 'Esta páxina ta acutada pa executar pruebes de javascript.',
+'javascripttest-pagetext-unknownframework' => "L'entornu de pruebes «$1» ye desconocíu.",
+'javascripttest-pagetext-frameworks' => 'Escueyi un de los siguientes entornos de pruebes: $1',
+'javascripttest-pagetext-skins' => 'Escueyi una apariencia pa executar les pruebes:',
+'javascripttest-qunit-intro' => 'Ver la [$1 documentación de les pruebes] en mediawiki.org.',
+'javascripttest-qunit-heading' => 'Conxuntu de pruebes JavaScript QUnit de MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => "La to páxina d'usuariu",
-'tooltip-pt-anonuserpage' => "La páxina d'usuariu de la IP cola que tas editando",
-'tooltip-pt-mytalk' => "La to páxina d'alderique",
-'tooltip-pt-anontalk' => 'Alderique de les ediciones feches con esta direición IP',
-'tooltip-pt-preferences' => 'Les tos preferencies',
-'tooltip-pt-watchlist' => 'Llista de les páxines nes que tas vixilando los cambios',
-'tooltip-pt-mycontris' => 'Llista de les tos collaboraciones',
-'tooltip-pt-login' => "T'encamentamos que t'identifiques, anque nun ye obligatorio",
-'tooltip-pt-anonlogin' => "T'encamentamos que t'identifiques, anque nun ye obligatorio.",
-'tooltip-pt-logout' => 'Colar',
-'tooltip-ca-talk' => 'Alderique tocante al conteníu de la páxina',
-'tooltip-ca-edit' => "Pues editar esta páxina. Por favor usa'l botón de vista previa enantes de guardar los cambios.",
-'tooltip-ca-addsection' => 'Emprima una seición nueva',
-'tooltip-ca-viewsource' => 'Esta páxina ta protexida.
+'tooltip-pt-userpage' => "La to páxina d'usuariu",
+'tooltip-pt-anonuserpage' => "La páxina d'usuariu de la IP cola que tas editando",
+'tooltip-pt-mytalk' => "La to páxina d'alderique",
+'tooltip-pt-anontalk' => 'Alderique de les ediciones feches con esta direición IP',
+'tooltip-pt-preferences' => 'Les tos preferencies',
+'tooltip-pt-watchlist' => 'Llista de les páxines nes que tas vixilando los cambios',
+'tooltip-pt-mycontris' => 'Llista de les tos collaboraciones',
+'tooltip-pt-login' => "T'encamentamos que t'identifiques, anque nun ye obligatorio",
+'tooltip-pt-anonlogin' => "T'encamentamos que t'identifiques, anque nun ye obligatorio.",
+'tooltip-pt-logout' => 'Colar',
+'tooltip-ca-talk' => 'Alderique tocante al conteníu de la páxina',
+'tooltip-ca-edit' => "Pues editar esta páxina. Por favor usa'l botón de vista previa enantes de guardar los cambios.",
+'tooltip-ca-addsection' => 'Emprima una seición nueva',
+'tooltip-ca-viewsource' => 'Esta páxina ta protexida.
Pues ver el so códigu fonte.',
-'tooltip-ca-history' => "Versiones antigües d'esta páxina.",
-'tooltip-ca-protect' => 'Protexer esta páxina',
-'tooltip-ca-unprotect' => 'Camudar la proteición desta páxina',
-'tooltip-ca-delete' => 'Desaniciar esta páxina',
-'tooltip-ca-undelete' => 'Restaura les ediciones feches nesta páxina enantes de que fuera esborrada',
-'tooltip-ca-move' => 'Tresllada esta páxina',
-'tooltip-ca-watch' => 'Amiesta esta páxina na to llista de vixilancia',
-'tooltip-ca-unwatch' => 'Desaniciar esta páxina de la to llista de vixilancia',
-'tooltip-search' => 'Busca en {{SITENAME}}',
-'tooltip-search-go' => 'Dir a una páxina con esti nome exautu si esiste',
-'tooltip-search-fulltext' => 'Busca páxines con esti testu',
-'tooltip-p-logo' => 'Visita la portada',
-'tooltip-n-mainpage' => 'Visita la portada',
-'tooltip-n-mainpage-description' => 'Visita la portada',
-'tooltip-n-portal' => "Tocante al proyeutu, lo qué pues facer, ú s'alcuentren les coses",
-'tooltip-n-currentevents' => 'Información sobre los asocedíos actuales',
-'tooltip-n-recentchanges' => 'La llista de cambios recientes de la wiki.',
-'tooltip-n-randompage' => 'Carga una páxina al debalu',
-'tooltip-n-help' => 'El llugar pa deprender',
-'tooltip-t-whatlinkshere' => "Llista de toles páxines wiki qu'enllacien equí",
-'tooltip-t-recentchangeslinked' => 'Cambios recientes nes páxines enllazaes dende esta',
-'tooltip-feed-rss' => 'Canal RSS pa esta páxina',
-'tooltip-feed-atom' => 'Canal Atom pa esta páxina',
-'tooltip-t-contributions' => "Llista de collaboraciones d'esti usuariu",
-'tooltip-t-emailuser' => 'Unvia un corréu a esti usuariu',
-'tooltip-t-upload' => 'Xubir ficheros',
-'tooltip-t-specialpages' => 'Llista de toles páxines especiales',
-'tooltip-t-print' => "Versión imprentable d'esta páxina",
-'tooltip-t-permalink' => 'Enllaz permanente a esta versión de la páxina',
-'tooltip-ca-nstab-main' => 'Ver la páxina de conteníu',
-'tooltip-ca-nstab-user' => "Ver la páxina d'usuariu",
-'tooltip-ca-nstab-media' => 'Amuesa la páxina de multimedia',
-'tooltip-ca-nstab-special' => 'Esta ye una páxina especial, nun pues editar la propia páxina',
-'tooltip-ca-nstab-project' => 'Vera la páxina de proyeutu',
-'tooltip-ca-nstab-image' => 'Ver la páxina del ficheru',
-'tooltip-ca-nstab-mediawiki' => "Amuesa'l mensaxe de sistema",
-'tooltip-ca-nstab-template' => 'Amuesa la plantía',
-'tooltip-ca-nstab-help' => "Amuesa la páxina d'ayuda",
-'tooltip-ca-nstab-category' => 'Ver la páxina de categoría',
-'tooltip-minoredit' => 'Marcar como una edición menor',
-'tooltip-save' => 'Guardar los cambios',
-'tooltip-preview' => 'Vista previa de los cambios, ¡usa esto enantes de guardar!',
-'tooltip-diff' => 'Amuesa los cambios que fixisti nel testu.',
-'tooltip-compareselectedversions' => "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
-'tooltip-watch' => 'Amiesta esta páxina na to llista de vixilancia',
-'tooltip-recreate' => 'Vuelve a crear la páxina magar que se tenga esborrao',
-'tooltip-upload' => 'Empecipiar la xubida',
-'tooltip-rollback' => '"Revertir" desfái nún clic la edición(es) d\'esta páxina del postrer collaborador.',
-'tooltip-undo' => '"Esfacer" revierte esta edición y abre\'l formulariu d\'edición en mou de vista previa. Permite añader un motivu nel resume.',
-'tooltip-preferences-save' => 'Guardar les preferencies',
-'tooltip-summary' => 'Escribi un resume curtiu',
+'tooltip-ca-history' => "Versiones antigües d'esta páxina.",
+'tooltip-ca-protect' => 'Protexer esta páxina',
+'tooltip-ca-unprotect' => 'Camudar la proteición desta páxina',
+'tooltip-ca-delete' => 'Desaniciar esta páxina',
+'tooltip-ca-undelete' => 'Restaura les ediciones feches nesta páxina enantes de que fuera esborrada',
+'tooltip-ca-move' => 'Tresllada esta páxina',
+'tooltip-ca-watch' => 'Amiesta esta páxina na to llista de vixilancia',
+'tooltip-ca-unwatch' => 'Desaniciar esta páxina de la to llista de vixilancia',
+'tooltip-search' => 'Busca en {{SITENAME}}',
+'tooltip-search-go' => 'Dir a una páxina con esti nome exautu si esiste',
+'tooltip-search-fulltext' => 'Busca páxines con esti testu',
+'tooltip-p-logo' => 'Visita la portada',
+'tooltip-n-mainpage' => 'Visita la portada',
+'tooltip-n-mainpage-description' => 'Visita la portada',
+'tooltip-n-portal' => "Tocante al proyeutu, lo qué pues facer, ú s'alcuentren les coses",
+'tooltip-n-currentevents' => 'Información sobre los asocedíos actuales',
+'tooltip-n-recentchanges' => 'La llista de cambios recientes de la wiki.',
+'tooltip-n-randompage' => 'Carga una páxina al debalu',
+'tooltip-n-help' => 'El llugar pa deprender',
+'tooltip-t-whatlinkshere' => "Llista de toles páxines wiki qu'enllacien equí",
+'tooltip-t-recentchangeslinked' => 'Cambios recientes nes páxines enllazaes dende esta',
+'tooltip-feed-rss' => 'Canal RSS pa esta páxina',
+'tooltip-feed-atom' => 'Canal Atom pa esta páxina',
+'tooltip-t-contributions' => "Llista de collaboraciones d'esti usuariu",
+'tooltip-t-emailuser' => 'Unvia un corréu a esti usuariu',
+'tooltip-t-upload' => 'Xubir ficheros',
+'tooltip-t-specialpages' => 'Llista de toles páxines especiales',
+'tooltip-t-print' => "Versión imprentable d'esta páxina",
+'tooltip-t-permalink' => 'Enllaz permanente a esta versión de la páxina',
+'tooltip-ca-nstab-main' => 'Ver la páxina de conteníu',
+'tooltip-ca-nstab-user' => "Ver la páxina d'usuariu",
+'tooltip-ca-nstab-media' => 'Amuesa la páxina de multimedia',
+'tooltip-ca-nstab-special' => 'Esta ye una páxina especial, nun pues editar la propia páxina',
+'tooltip-ca-nstab-project' => 'Vera la páxina de proyeutu',
+'tooltip-ca-nstab-image' => 'Ver la páxina del ficheru',
+'tooltip-ca-nstab-mediawiki' => "Amuesa'l mensaxe de sistema",
+'tooltip-ca-nstab-template' => 'Amuesa la plantía',
+'tooltip-ca-nstab-help' => "Amuesa la páxina d'ayuda",
+'tooltip-ca-nstab-category' => 'Ver la páxina de categoría',
+'tooltip-minoredit' => 'Marcar como una edición menor',
+'tooltip-save' => 'Guardar los cambios',
+'tooltip-preview' => 'Vista previa de los cambios, ¡usa esto enantes de guardar!',
+'tooltip-diff' => 'Amuesa los cambios que fixisti nel testu.',
+'tooltip-compareselectedversions' => "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
+'tooltip-watch' => 'Amiesta esta páxina na to llista de vixilancia',
+'tooltip-watchlistedit-normal-submit' => 'Desaniciar títulos',
+'tooltip-watchlistedit-raw-submit' => 'Anovar llista de vixilancia',
+'tooltip-recreate' => 'Vuelve a crear la páxina magar que se tenga esborrao',
+'tooltip-upload' => 'Empecipiar la xubida',
+'tooltip-rollback' => '"Revertir" desfái nún clic la edición(es) d\'esta páxina del postrer collaborador.',
+'tooltip-undo' => '"Esfacer" revierte esta edición y abre\'l formulariu d\'edición en mou de vista previa. Permite añader un motivu nel resume.',
+'tooltip-preferences-save' => 'Guardar les preferencies',
+'tooltip-summary' => 'Escribi un resume curtiu',
# Stylesheets
'common.css' => "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
@@ -2773,9 +2844,6 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
# Patrol log
'patrol-log-page' => 'Rexistru de supervisión',
'patrol-log-header' => 'Esti ye un rexistru de les revisiones supervisaes.',
-'patrol-log-line' => 'marcó la versión $1 de $2 como supervisada $3',
-'patrol-log-auto' => '(automática)',
-'patrol-log-diff' => 'revisión $1',
'log-show-hide-patrol' => '$1 rexistru de supervisión',
# Image deletion
@@ -2802,11 +2870,11 @@ Al executalu pues comprometer el to sistema.",
'file-info' => "tamañu d'archivu: $1, triba MIME: $2",
'file-info-size' => '$1 × $2 píxels, tamañu de ficheru: $3, triba MIME: $4',
'file-info-size-pages' => '$1 × $2 pixels, tamañu del ficheru: $3, triba MIME: $4, $5 {{PLURAL:$5|páxina|páxines}}',
-'file-nohires' => '<small>Nun ta disponible con mayor resolución.</small>',
+'file-nohires' => 'Nun ta disponible con mayor resolución.',
'svg-long-desc' => 'ficheru SVG, $1 × $2 píxels nominales, tamañu de ficheru: $3',
'show-big-image' => 'Resolución completa',
-'show-big-image-preview' => "<small>Tamañu d'esta previsualización: $1.</small>",
-'show-big-image-other' => '<small>Otres resoluciones: $1.</small>',
+'show-big-image-preview' => "Tamañu d'esta previsualización: $1.",
+'show-big-image-other' => '{{PLURAL:$2|Otra resolución|Otres resoluciones}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'animáu',
'file-info-gif-frames' => '$1 {{PLURAL:$1|cuadru|cuadros}}',
@@ -2826,6 +2894,13 @@ Al executalu pues comprometer el to sistema.",
'bydate' => 'por fecha',
'sp-newimages-showfrom' => "Amosar los archivos nuevos emprimando dende'l $1 a les $2",
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 segundu|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutos}}',
+'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
+'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
+'ago' => 'hai $1',
+
# Bad image list
'bad_image_list' => "El formatu ye'l que sigue:
@@ -3332,13 +3407,6 @@ Esti códigu de confirmación caduca\'l $4.',
'scarytranscludefailed' => '[La obtención de la plantía falló pa $1]',
'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
-# Trackbacks
-'trackbackbox' => 'Retroenllaces pa esta páxina:<br />
-$1',
-'trackbackremove' => '([$1 Esborrar])',
-'trackbacklink' => 'Retroenllaz',
-'trackbackdeleteok' => 'El retroenllaz esborróse correutamente.',
-
# Delete conflict
'deletedwhileediting' => "'''Avisu''': ¡Esta páxina foi esborrada depués de qu'entamaras a editala!",
'confirmrecreate' => "L'usuariu [[User:$1|$1]] ([[User talk:$1|alderique]]) esborró esta páxina depués de qu'empecipiaras a editala pol siguiente motivu:
@@ -3421,6 +3489,9 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
'watchlisttools-edit' => 'Ver y editar la llista de vixilancia',
'watchlisttools-raw' => 'Editar la llista de vixilancia (en bruto)',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|alderique]])',
+
# Core parser functions
'unknown_extension_tag' => 'Etiqueta d\'estensión "$1" desconocida',
'duplicate-defaultsort' => 'Avisu: La clave d\'ordenación predeterminada "$2" anula la clave d\'ordenación anterior "$1".',
@@ -3519,13 +3590,16 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'tags-hitcount' => '$1 {{PLURAL:$1|cambiu|cambios}}',
# Special:ComparePages
-'comparepages' => 'Comparar páxines',
-'compare-selector' => 'Comparar revisiones de páxina',
-'compare-page1' => 'Páxina 1',
-'compare-page2' => 'Páxina 2',
-'compare-rev1' => 'Revisión 1',
-'compare-rev2' => 'Revisión 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar páxines',
+'compare-selector' => 'Comparar revisiones de páxina',
+'compare-page1' => 'Páxina 1',
+'compare-page2' => 'Páxina 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'El títulu que conseñasti nun ye válidu.',
+'compare-title-not-exists' => 'El títulu que conseñasti nun esiste.',
+'compare-revision-not-exists' => 'La revisión que conseñasti nun esiste.',
# Database error messages
'dberr-header' => 'Esta wiki tien un problema',
@@ -3552,4 +3626,90 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'sqlite-has-fts' => '$1 con sofitu pa gueta en testu completu',
'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
+# New logging system
+'logentry-delete-delete' => '$1 desanició la páxina $3',
+'logentry-delete-restore' => '$1 restauró la páxina $3',
+'logentry-delete-event' => "$1 camudó la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-delete-revision' => "$1 camudó la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-delete-event-legacy' => '$1 camudó la visibilidá de los socesos del rexistru en $3',
+'logentry-delete-revision-legacy' => '$1 camudó la visibilidá de les revisiones na páxina $3',
+'logentry-suppress-delete' => '$1 suprimió la páxina $3',
+'logentry-suppress-event' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-suppress-revision' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-suppress-event-legacy' => '$1 camudó en secretu la visibilidá de los socesos del rexistru en $3',
+'logentry-suppress-revision-legacy' => '$1 camudó en secretu la visibilidá de les revisiones na páxina $3',
+'revdelete-content-hid' => 'conteníu tapecíu',
+'revdelete-summary-hid' => "resume d'edición tapecíu",
+'revdelete-uname-hid' => "nome d'usuariu anubríu",
+'revdelete-content-unhid' => 'conteníu non tapecíu',
+'revdelete-summary-unhid' => "resume d'edición non tapecíu",
+'revdelete-uname-unhid' => "nome d'usuariu non anubríu",
+'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
+'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
+'logentry-move-move' => '$1 treslladó la páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 treslladó la páxina "$3" a "$4" ensin dexar una redireición',
+'logentry-move-move_redir' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición',
+'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
+'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
+'logentry-newusers-newusers' => "$1 creó una cuenta d'usuariu",
+'logentry-newusers-create' => "$1 creó una cuenta d'usuariu",
+'logentry-newusers-create2' => "$1 creó una cuenta d'usuariu $3",
+'logentry-newusers-autocreate' => 'La cuenta $1 se creó automáticamente',
+'newuserlog-byemail' => 'conseña unviada per corréu electrónicu',
+
+# Feedback
+'feedback-bugornote' => 'Si tas preparáu pa describir un problema técnicu en detalle, [$1 informa del fallu].
+D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apaecerá na páxina "[$3 $2]" xunto col to nome d\'usuariu y el restolador qu\'uses.',
+'feedback-subject' => 'Asuntu:',
+'feedback-message' => 'Mensaxe:',
+'feedback-cancel' => 'Encaboxar',
+'feedback-submit' => 'Unviar comentarios',
+'feedback-adding' => 'Amestando el comentariu a la páxina...',
+'feedback-error1' => 'Fallu: Resultáu de la API non reconocíu',
+'feedback-error2' => 'Fallu: Falló la edición',
+'feedback-error3' => 'Fallu: Ensin respuesta de la API',
+'feedback-thanks' => "¡Gracies! La to opinión s'espublizó na páxina «[$2 $1]».",
+'feedback-close' => 'Fecho',
+'feedback-bugcheck' => '¡Perfeuto! Comprueba que nun tea yá ente los [$1 fallos conocíos].',
+'feedback-bugnew' => "Yá lo comprobé. Informar d'esti fallu nuevu",
+
+# API errors
+'api-error-badaccess-groups' => 'Nun tienes permisu pa xubir ficheros a esta wiki.',
+'api-error-badtoken' => 'Fallu internu: token incorreutu.',
+'api-error-copyuploaddisabled' => "Xubir d'una URL ta desactivao nesti sirvidor.",
+'api-error-duplicate' => 'Yá hai {{PLURAL:$1|[$2 otru ficheru]|[$2 otros ficheros]}} nesti sitiu col mesmu conteníu.',
+'api-error-duplicate-archive' => 'Había {{PLURAL:$1|[$2 otru ficheru]|[$2 otros ficheros]}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Ficheru duplicáu|Ficheros duplicaos}} que yá se {{PLURAL:$1|desanició|desaniciaron}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Ficheru duplicáu|Ficheros duplicaos}}',
+'api-error-empty-file' => "El ficheru qu'unviasti taba baleru.",
+'api-error-emptypage' => 'Nun se permite la creación de páxines nueves baleres.',
+'api-error-fetchfileerror' => 'Fallu internu: daqué nun funcionó al buscar el ficheru.',
+'api-error-file-too-large' => "El ficheru qu'unviasti yera demasiao grande.",
+'api-error-filename-tooshort' => 'El nome de ficheru ye demasiao curtiu.',
+'api-error-filetype-banned' => 'Esta triba de ficheru ta torgada.',
+'api-error-filetype-missing' => 'Al ficheru falta-y una estensión.',
+'api-error-hookaborted' => 'La conexón con una estensión encaboxó el cambéu que tentasti facer.',
+'api-error-http' => 'Fallu internu: Nun se pudo coneutar col sirvidor.',
+'api-error-illegal-filename' => 'El nome de ficheru nun ta permitíu.',
+'api-error-internal-error' => 'Fallu internu: daqué nun funcionó al procesar la xubida na wiki.',
+'api-error-invalid-file-key' => "Fallu internu: nun s'atopó el ficheru nel depósitu temporal.",
+'api-error-missingparam' => 'Fallu internu: falten parámetros na solicitú.',
+'api-error-missingresult' => 'Fallu internu: nun se pudo determinar si la copia foi bien.',
+'api-error-mustbeloggedin' => 'Tienes de tar autenticáu pa xubir ficheros.',
+'api-error-mustbeposted' => 'Fallu internu: la solicitú necesita HTTP POST.',
+'api-error-noimageinfo' => 'La xubida foi correuta, pero el sirvidor nun dio información dala del ficheru.',
+'api-error-nomodule' => 'Fallu internu: nun se configuró dengún módulu de xubíes.',
+'api-error-ok-but-empty' => 'Fallu internu: nun hai respuesta del sirvidor.',
+'api-error-overwrite' => 'Nun ta permitío sobroscribir un ficheru esistente.',
+'api-error-stashfailed' => 'Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.',
+'api-error-timeout' => 'El sirvidor nun respondió nel tiempu esperáu.',
+'api-error-unclassified' => 'Hebo un fallu desconocíu',
+'api-error-unknown-code' => 'Fallu desconocíu: «$1»',
+'api-error-unknown-error' => 'Fallu internu: daqué nun funcionó al tentar xubir el ficheru.',
+'api-error-unknown-warning' => 'Avisu desconocíu: $1',
+'api-error-unknownerror' => 'Fallu desconocíu: «$1».',
+'api-error-uploaddisabled' => 'Les xubíes tan desactivaes nesta wiki.',
+'api-error-verification-error' => 'Esti ficheru pudiera tar corrompíu, o tien una estensión incorreuta.',
+
);
diff --git a/languages/messages/MessagesAv.php b/languages/messages/MessagesAv.php
index cee4a941..5aa62c26 100644
--- a/languages/messages/MessagesAv.php
+++ b/languages/messages/MessagesAv.php
@@ -107,9 +107,6 @@ $messages = array(
# Special:AllPages
'allarticles' => 'Киналго макъалаби',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'ЦӀиÑв гӀахьалчи',
-
# Watchlist
'watchlist' => 'Дур халгьабиÑлъул ÑиÑÑ…l',
'watch' => 'хал гьабизе',
diff --git a/languages/messages/MessagesAvk.php b/languages/messages/MessagesAvk.php
index a0b322d7..301b0492 100644
--- a/languages/messages/MessagesAvk.php
+++ b/languages/messages/MessagesAvk.php
@@ -393,14 +393,13 @@ MySQL va « $3 : $4 » rokla al dimstakser.',
'cannotdelete' => 'Sulara va bazenu bu oku ewava tir merotisa.',
'badtitle' => 'Rotaf vergumvelt',
'badtitletext' => 'Vergumvelt ke erunu bu tir volenafu ok vlardafu ike walavafi gluyasiki me tir enafi',
-'perfcached' => 'Vlevef orig yo tid koe palsexo nume me zo ronusked.',
-'perfcachedts' => 'Vlevef orig yo tid koe palsexo, ise ironokafa nuskera tir $1.',
+'perfcached' => 'Vlevef orig yo tid koe palsexo nume me zo ronusked. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Vlevef orig yo tid koe palsexo, ise ironokafa nuskera tir $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Nuskera va batu bu me noelon flir. Acum origeem me zo divneditir.',
'wrong_wfQuery_params' => 'Mewadaf dor koe wfQuery() dirgara<br />
Fliok : $1<br />
Erura : $2',
'viewsource' => 'Wira va klitakrent',
-'viewsourcefor' => 'tori $1',
'actionthrottled' => 'Tulokaliana tegira',
'actionthrottledtext' => 'Wetce sabega kev staksavamolavara, rin ta bata skura gemeltamon slikviele zo kimar voxe va bata kimara al kaikayal. Vay artimon lwil !',
'protectedpagetext' => 'Batu bu betaradjison zo nendar.',
@@ -547,9 +546,6 @@ Ta keyaksera va $1 ok konar [[{{MediaWiki:Grouppage-sysop}}|ristusik]] rotuzeral
Va \'"e-mail" staksara pu bat favesik\' me rofavel vaxede "e-mail" mane tir koe rinaf [[Special:Preferences|lodamaceem]] ise vaon faveson me zo elekayal.
Rinaf tise IP mane tir $3 ise ID elekara tir #$5. Va bate ik bane mane ko kota erura vay bazel !',
'blockednoreason' => 'Meka bazena lazava',
-'blockedoriginalsource' => "Klita ke '''$1''' vleveon zo nedir :",
-'blockededitsource' => "Krent ke '''rinaf betakseem''' va '''$1''' vleveon zo betar :",
-'whitelistedittitle' => 'Kucilan login ta sutelara',
'whitelistedittext' => 'Ta bubetara rin gonaskil ta $1',
'confirmedittext' => 'Abdi bubetara va rinafe e-mail mane gogruyel. Kan rinaf [[Special:Preferences|favesiklodamaceem]] va rinafe e-mail mane vay plekul ise tuenal !',
'nosuchsectiontitle' => 'Me man gabot',
@@ -692,22 +688,11 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
'revdelete-unsuppress' => 'Dimirutara va dimplekun betaks yo',
'revdelete-log' => 'Lazava :',
'revdelete-submit' => 'Ko reban siatos rewar',
-'revdelete-logentry' => 'Betayana betarafa rowinuca ke [[$1]]',
-'logdelete-logentry' => 'Betayana bifafa rowinuca ke [[$1]]',
'revdelete-success' => "'''Kiewaskinon plekuyuna betarafa rowinuca.'''",
'logdelete-success' => "'''Kiewaskinon plekuyuna bifafa rowinuca.'''",
'revdel-restore' => 'Betara va rowinuca',
'pagehist' => 'Buizvot',
'deletedhist' => 'Sularizvot',
-'revdelete-content' => 'cek',
-'revdelete-summary' => 'betara va vildeks',
-'revdelete-uname' => 'favesikyolt',
-'revdelete-restricted' => 'irutara rewana pu ristusik',
-'revdelete-unrestricted' => 'irutara tiolteyena pu ristusik',
-'revdelete-hid' => '$1 pals-',
-'revdelete-unhid' => '$1 volpals-',
-'revdelete-log-message' => '$1 tori $2 {{PLURAL:$2|betara|betara}}',
-'logdelete-log-message' => '$1 tori $2 {{PLURAL:$2|bif|bif}}',
'revdelete-edit-reasonlist' => 'Betara va sularalazava',
# Suppression log
@@ -815,7 +800,7 @@ Kan ''all:'' laganeyal ta varafa exulera (gon keyaksexo is teza ikz-), oke wetce
'prefs-rc' => 'Noeltaf betakseem',
'prefs-watchlist' => 'Suzdasiki',
'prefs-watchlist-days' => 'Cugafa vielota gonedina koe suzdasiki :',
-'prefs-watchlist-days-max' => 'Cugon 7 viel',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Betaracugota gonedina koe mantafi suzdasiki :',
'prefs-watchlist-edits-max' => 'Cugafa ota : 1000',
'prefs-misc' => 'Gedrafa lodamaca yo',
@@ -942,7 +927,6 @@ Gotir le $1 {{PLURAL:$1|staa|staa}}.',
'right-patrol' => 'Tcalara va fieyen betaks',
'right-patrolmarks' => 'Rupera va noeltafa fieratcala',
'right-unwatchedpages' => 'Wira va medisukeyenu bu',
-'right-trackback' => 'Erura va suzdara',
'right-mergehistory' => 'Jera va buizvot',
'right-userrights' => 'Betara va favesikrokeem',
'right-userrights-interwiki' => "Betara va favesikrokeem koe aro 'wiki' xo",
@@ -1320,11 +1304,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Mek trasiyin favesik.',
# Special:Log/newusers
-'newuserlogpage' => 'Buredura "log"',
-'newuserlog-byemail' => 'remravlem staksayan kan e-mail',
-'newuserlog-create-entry' => 'Warzaf favesik',
-'newuserlog-create2-entry' => 'va $1 warzafa pata reduyur',
-'newuserlog-autocreate-entry' => 'Mivaskon reduyuna pata',
+'newuserlogpage' => 'Buredura "log"',
# Special:ListGroupRights
'listgrouprights' => 'Rokeem ke favesiklospa',
@@ -1445,8 +1425,6 @@ Vay gruyel da djuskul ise va maletireem vangrupel ise tarkason va [[{{MediaWiki:
'actioncomplete' => 'Skuyuna sulara',
'deletedtext' => '« $1 » tir sulayan.
Ta vexala dem noeltaf sulareem va $2 disukel.',
-'deletedarticle' => 'al sular va « [[$1]] »',
-'suppressedarticle' => '"[[$1]]" sulayan',
'dellogpage' => 'Izvot va sulareem',
'dellogpagetext' => 'Tir tela vexala dem noeltaf sulareem.
Bazen bartiv tir tel ke zanisiko.',
@@ -1535,7 +1513,6 @@ Si une nouvelle page avec le même nom a été créée depuis la suppression, le
'undeletelink' => 'wira ik dimplekura',
'undeletereset' => 'Tolplekura',
'undeletecomment' => 'Sebuks :',
-'undeletedarticle' => 'va « [[$1]] » al dimplekur',
'undeletedrevisions' => '$1 siatos dimplekuyun',
'undeletedrevisions-files' => '$1 betaks isu $2 iyeltak zo dimplekuyud',
'undeletedfiles' => '{{PLURAL:$1|1|$1}} dimplekuyun iyeltak',
@@ -1717,8 +1694,6 @@ Dans ce cas, vous devrez renommer ou fusionner la page manuellement si vous le d
'movepage-page-exists' => '$1 bu ixam tir nume me balkon zo rotolsuter.',
'movepage-page-moved' => '$1 bu ko $2 su zo arrundar.',
'movepage-page-unmoved' => '$1 bu ko $2 me al zo rotarrundar.',
-'1movedto2' => '[[$1]] arbureyen kal [[$2]]',
-'1movedto2_redir' => '[[$1]] arbureyen kal [[$2]] (graskara)',
'movelogpage' => 'Arrundara va "log" bu',
'movelogpagetext' => 'Vleveon vexala dem arrundayanu bu se.',
'movereason' => 'Lazava :',
@@ -1892,8 +1867,6 @@ MediaWiki spam cleanup',
# Patrol log
'patrol-log-page' => '"Log" triosusiki va fiereem',
-'patrol-log-line' => 'tcalara va $1 ke $2 : $3 fieyen',
-'patrol-log-auto' => '(mivaskon)',
# Image deletion
'deletedrevision' => '$1 sulayan guazaf betaks',
@@ -1914,7 +1887,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|bu|bu}}',
'file-info' => 'iyeltakaldo : $1, MIME ord : $2',
'file-info-size' => '$1 × $2 pixel, iyeltakaldo : $3, MIME ord : $4',
-'file-nohires' => '<small>Me roderaykan logijaf lum.</small>',
+'file-nohires' => 'Me roderaykan logijaf lum.',
'svg-long-desc' => 'SVG iyeltak, prekson $1 × $2 pixels, iyeltakaldo : $3',
'show-big-image' => 'Geltraf lum',
@@ -2178,11 +2151,6 @@ This confirmation code will expire at $4.',
# Scary transclusion
'scarytranscludetoolong' => '[URL tir abrotcarsaf]',
-# Trackbacks
-'trackbackremove' => '([$1 Sulara])',
-'trackbacklink' => 'Sledasiki',
-'trackbackdeleteok' => 'Sledasiki tir sulanhayani.',
-
# Delete conflict
'deletedwhileediting' => "'''Obral''' : Batu bu zo sulayar vielu toz betayal !",
'recreate' => 'Tolredura',
@@ -2293,4 +2261,9 @@ This confirmation code will expire at $4.',
# Special:BlankPage
'blankpage' => 'Butuvlardara',
+# New logging system
+'revdelete-restricted' => 'irutara rewana pu ristusik',
+'revdelete-unrestricted' => 'irutara tiolteyena pu ristusik',
+'newuserlog-byemail' => 'remravlem staksayan kan e-mail',
+
);
diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php
index e31561e4..ed32c76a 100644
--- a/languages/messages/MessagesAz.php
+++ b/languages/messages/MessagesAz.php
@@ -68,9 +68,9 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#Ä°STÄ°QAMÆTLÆNDÄ°RMÆ', '#Ä°STÄ°QAMÆTLÆNDÄ°R', '#REDIRECT' ),
- 'notoc' => array( '0', '__MÃœNDÆRÄ°CATYOX__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__QALEREYAYOX__', '__NOGALLERY__' ),
+ 'redirect' => array( '0', '#Ä°STÄ°QAMÆTLÆNDÄ°RMÆ', '#Ä°STÄ°QAMÆTLÆNDÄ°R', '#REDIRECT' ),
+ 'notoc' => array( '0', '__MÃœNDÆRÄ°CATYOX__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__QALEREYAYOX__', '__NOGALLERY__' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -438,17 +438,18 @@ XahiÅŸ edirik bunu bir [[Special:ListUsers/sysop|Ä°darəçilÉ™rÉ™]], URL not edÉ
'badarticleerror' => 'Yerinə yetirmək istədiyiniz fəaliyyətin icrası bu səhifədə mümkün deyil.',
'cannotdelete' => 'İstədiyiniz "$1" səhifə və ya faylını silmək mümkün deyil.
Bu səhifə və ya fayl başqa bir istifadəçi tərəfindən silinmiş ola bilər.',
+'cannotdelete-title' => '"$1" səhifəsinin silinməsi mümkünsüzdür.',
'badtitle' => 'Səhv başlıq',
'badtitletext' => 'Axtarılan səhifə adı səhvdir və ya boşdur, ya da düzgün olmayan dillərarası, yaxud vikilərarası keçid istifadə edilib.
Başlıqlarda istifadə edilməsi qadağan olunan bir və ya daha çox simvol istifadə edilmiş ola bilər.',
-'perfcached' => 'Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və bu səbəbdən aktual olmaya bilər.',
-'perfcachedts' => 'Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və sonuncu dəfə $1 tarixində yenilənmişdir.',
+'perfcached' => 'Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və bu səbəbdən aktual olmaya bilər. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və sonuncu dəfə $1 tarixində yenilənmişdir. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Bu an üçün güncəlləmələr sıradan çıxdı. Buradakı məlumat dərhal yenilənməyəcək.',
'wrong_wfQuery_params' => 'wfQuery() funksiyası üçün qəbuledilməz parametrlər <br />
Funksiya: $1<br />
SorÄŸu: $2',
'viewsource' => 'Mənbə göstər',
-'viewsourcefor' => '$1 üçün',
+'viewsource-title' => '$1 üçün mənbəyə bax',
'actionthrottled' => 'Sürət məhdudiyyəti',
'actionthrottledtext' => 'Anti-spam hərəkətləri səbəbilə, bir hərəkəti qısa bir zaman aralığında çoxetməniz əngəlləndi, və siz həddi aşmısınız. Lütfən bir neçə dəqiqə sonra yenidən yoxlayın.',
'protectedpagetext' => 'Bu səhifə redaktə üçün bağlıdır.',
@@ -590,6 +591,14 @@ Ola bilər siz parolu müvəffəqiyyətlə dəyişmisiniz yaxud müvəqqəti par
Müvəqqəti parol: $2',
'passwordreset-emailsent' => 'Xəbərdarlıq məktubu e-maillə göndərildi.',
+# Special:ChangeEmail
+'changeemail' => 'E-məktub ünvanını dəyiş',
+'changeemail-oldemail' => 'Hazırki e-poçt ünvanı:',
+'changeemail-newemail' => 'Yeni e-poçt ünvanı:',
+'changeemail-none' => '(heç biri)',
+'changeemail-submit' => 'E-poçtu dəyiş',
+'changeemail-cancel' => 'Ä°mtina',
+
# Edit page toolbar
'bold_sample' => 'Qalın mətn',
'bold_tip' => 'Qalın mətn',
@@ -628,9 +637,6 @@ Müvəqqəti parol: $2',
'subject-preview' => 'Sərlövhə belə olacaq:',
'blockedtitle' => 'İstifadəçi bloklanıb',
'blockednoreason' => 'səbəb göstərilməyib',
-'blockedoriginalsource' => "'''$1''' mənbəyi aşağıda göstərilib:",
-'blockededitsource' => "Aşağıda '''$1''' səhifəsində etdiyiniz '''dəyişikliklərin''' mətni göstərilib:",
-'whitelistedittitle' => 'Redaktə üçün daxil olmalısınız',
'whitelistedittext' => 'Dəyişiklik edə bilmək üçün $1.',
'confirmedittext' => 'Siz elektron ünvanınızı səhifədə dəyişiklik etməzdən əvvəl göstərməlisiniz.
Zəhmət olmasa elektron ünvanınızı [[Special:Preferences|istifadəçi nizamlaması]] səhifənizdə göstərib təsdiq ediniz.',
@@ -817,8 +823,6 @@ Mümkündür ki, bununla bağlı təfərrüatlar [{{fullurl:{{#Special:Log}}/del
'revdelete-unsuppress' => 'Bərpa olunan versiyalar üzərindən məhdudiyyətləri qaldır',
'revdelete-log' => 'Səbəb:',
'revdelete-submit' => 'Seçilmiş {{PLURAL:$1|versiyaya|versiyayalara}} tətbiq et',
-'revdelete-logentry' => '[[$1]] səhifəsinin versiyasının görünüşünü dəyişdirdi',
-'logdelete-logentry' => '[[$1]] səhifəsinin versiyasının görünüşünü dəyişdirdi',
'revdelete-success' => "'''Versiyanın görünüşü yeniləndi.'''",
'revdelete-failure' => "'''Versiyanın görünüşü dəyişdirilə bilməz:'''
$1",
@@ -830,15 +834,6 @@ $1",
'revdel-restore-visible' => 'görünən düzəlişlər',
'pagehist' => 'Səhifənin tarixçəsi',
'deletedhist' => 'Silmə qeydləri',
-'revdelete-content' => 'məzmun',
-'revdelete-summary' => 'redaktə xülasəsi',
-'revdelete-uname' => 'istifadəçi adı',
-'revdelete-restricted' => 'məhdudiyyətlər idarəçilərə tətbiq olunur',
-'revdelete-unrestricted' => 'idarəçilər üçün götürülmüş məhdudiyyətlər',
-'revdelete-hid' => 'gizlət $1',
-'revdelete-unhid' => 'göstər $1',
-'revdelete-log-message' => '$2 {{PLURAL:$2|dəyişiklik|dəyişiklik}} üçün $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|hadisə|hadisə}} üçün $1',
'revdelete-reason-dropdown' => '*Ümumi silmə səbəbləri
** Müəllif hüquqları pozuntusu
** Uyğunsuz şəxsi məlumat',
@@ -972,12 +967,14 @@ $1",
'prefs-rc' => 'Son dəyişikliklər',
'prefs-watchlist' => 'İzləmə siyahısı',
'prefs-watchlist-days' => 'İzləmə siyahısında göstərilən maksimal günlərin sayı:',
-'prefs-watchlist-days-max' => 'Maksimum 7 gün',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|gün|gün}}',
'prefs-watchlist-edits' => 'İzləmə siyahısında göstərilən maksimal redaktələrin sayı:',
'prefs-watchlist-edits-max' => 'Maksimum say: 1000',
'prefs-watchlist-token' => 'İzləmə siyahısı nişanı:',
'prefs-misc' => 'Digər seçimlər',
'prefs-resetpass' => 'Parolu dəyiş',
+'prefs-changeemail' => 'E-poçtu dəyiş',
+'prefs-setemail' => 'E-poçt ünvanının nizamlanması',
'prefs-email' => 'E-mailin parametrləri',
'prefs-rendering' => 'Görünüş',
'saveprefs' => 'Qeyd et',
@@ -1076,7 +1073,7 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'userrights-lookup-user' => 'İstifadəçi qruplarını idarə et',
'userrights-user-editname' => 'İstifadəçi adınızı yazın:',
'editusergroup' => 'İstifadəçi qruplarını redaktə et',
-'editinguser' => "RedaktÉ™ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "İstifadəçi '''[[User:$1|$1]]''' $2 üçün istifadəçi hüquqları dəyişdirilir",
'userrights-editusergroup' => 'İstifadəçi qruplarını redaktə et',
'saveusergroups' => 'İstifadəçi qrupunu qeyd et',
'userrights-groupsmember' => 'Daxil olduÄŸu qruplar:',
@@ -1163,7 +1160,6 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'right-autopatrol' => 'Dəyişikliklər avtomatik patrullanmış kimi işarələnir',
'right-patrolmarks' => 'Bütün patrullanmış son dəyişikliklərə bax',
'right-unwatchedpages' => 'Müşahidə olunmayan səhifələrin siyahısına baxış',
-'right-trackback' => 'Trackback göndər',
'right-mergehistory' => 'Səhifələrin tarixini birləşdirmək',
'right-userrights' => 'Bütün istifadəçi hüquqlarının redaktə edilməsi',
'right-userrights-interwiki' => 'Digər vikilərdəki istifadəçilərin istifadəçi hüquqlarını dəyişdir',
@@ -1205,11 +1201,11 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'action-patrol' => 'Digərlərinin dəyişikliklərini patrullanmış olaraq işarələ',
'action-autopatrol' => 'öz redaktələrinizi patrullanmış olarq işarələmək',
'action-unwatchedpages' => 'müşahidə olunmayan səhifələrin siyahısına baxış',
-'action-trackback' => 'Trackback göndər',
'action-mergehistory' => 'Bu səhifənin tarixini birləşdirmək',
'action-userrights' => 'Bütün istifadəçi hüquqlarını redaktə et',
'action-userrights-interwiki' => 'Digər vikilərdəki istifadəçilərin istifadəçi hüquqlarını dəyişdir',
'action-siteadmin' => 'Məlumatlar bazasının bloklanması və blokun götürülməsi',
+'action-sendemail' => 'e-məktub göndər',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
@@ -1238,7 +1234,6 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'minoreditletter' => 'k',
'newpageletter' => 'Y',
'boteditletter' => 'b',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 izləyən istifadəçi]',
'rc_categories' => 'Kateqoriyalara limit qoy ("|" ilə ayır)',
'rc_categories_any' => 'Hər',
@@ -1252,7 +1247,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-backlink' => '↠$1',
'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.",
@@ -1426,15 +1420,13 @@ $1',
'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
# File reversion
-'filerevert' => '$1 faylını əvvəlki vəziyyətinə qaytar',
-'filerevert-backlink' => '↠$1',
-'filerevert-legend' => 'Faylı əvvəlki vəziyyətinə qaytar',
-'filerevert-comment' => 'Səbəb:',
-'filerevert-submit' => 'ÆvvÉ™lki vÉ™ziyyÉ™tinÉ™',
+'filerevert' => '$1 faylını əvvəlki vəziyyətinə qaytar',
+'filerevert-legend' => 'Faylı əvvəlki vəziyyətinə qaytar',
+'filerevert-comment' => 'Səbəb:',
+'filerevert-submit' => 'ÆvvÉ™lki vÉ™ziyyÉ™tinÉ™',
# File deletion
'filedelete' => '$1 adlı faylı sil',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'Faylı sil',
'filedelete-intro' => "'''[[Media:$1|$1]]''' faylını və onunla bağlı bütün tarixçəni silmək ərəfəsindəsiniz.",
'filedelete-comment' => 'Səbəb:',
@@ -1557,7 +1549,7 @@ Hazırda [[$2]]-yə istiqamətlənib.',
'listusers-editsonly' => 'Yalnız redaktələri olan istifadəçiləri göstər',
'listusers-creationsort' => 'Yaranma tarixinə görə sırala',
'usereditcount' => '$1 {{PLURAL:$1|redaktÉ™}}',
-'usercreated' => '$1 $2 vaxtda yaradılıb',
+'usercreated' => 'Saat $2, $1 tarixində {{GENDER:$3|qeydiyyatdan keçib}}',
'newpages' => 'Yeni səhifələr',
'newpages-username' => 'İstifadəçi adı:',
'ancientpages' => 'Æn köhnÉ™ sÉ™hifÉ™lÉ™r',
@@ -1634,12 +1626,8 @@ Həmçinin, [[Special:WantedCategories|tələb olunan kateqoriyalara]] baxın.',
'activeusers-noresult' => 'İstifadəçi tapılmadı.',
# Special:Log/newusers
-'newuserlogpage' => 'Yeni istifadəçilərin qeydiyyatı',
-'newuserlogpagetext' => 'Yeni qeydiyyatdan keçmiş istifadəçilərin siyahısı.',
-'newuserlog-byemail' => 'parol e-maillə göndərildi',
-'newuserlog-create-entry' => 'Yeni istifadəçi hesabı',
-'newuserlog-create2-entry' => 'Yeri $1 hesabı açıldı',
-'newuserlog-autocreate-entry' => 'Hesab avtomatik olaraq yaradıldı',
+'newuserlogpage' => 'Yeni istifadəçilərin qeydiyyatı',
+'newuserlogpagetext' => 'Yeni qeydiyyatdan keçmiş istifadəçilərin siyahısı.',
# Special:ListGroupRights
'listgrouprights' => 'İstifadəçi qruplarının hüquqları',
@@ -1667,7 +1655,7 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
'emailuser' => 'İstifadəçiyə e-məktub yolla',
'emailpage' => 'İstifadəçiyə e-məktub yolla',
'usermailererror' => 'Elektron poçtla məlumat göndərilən zaman xəta baş vermişdir:',
-'defemailsubject' => '{{SITENAME}} e-məktub',
+'defemailsubject' => '"$1" adlı istifadəçidən {{SITENAME}} e-məktubu',
'usermaildisabled' => 'İstifadəçi e-maili işləmir',
'noemailtitle' => 'E-məktub ünvanı yoxdur',
'noemailtext' => 'Bu istifadəçi işlək e-məktub ünvanını qeyd etməmişdir.',
@@ -1765,7 +1753,6 @@ Yardım və təklifləriniz üçün:
'exbeforeblank' => "Silinmədən əvvəlki məzmun: '$1'",
'exblank' => 'səhifə boş',
'delete-confirm' => 'Silinən səhifə: "$1"',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Sil',
'historywarning' => "'''Xəbərdarlıq:''' Silinəcək səhifənin tarixçəsində qeyd olunmuş $1 {{PLURAL:$1|redaktə|redaktə}} var:",
'confirmdeletetext' => 'Bu səhifə və ya fayl bütün tarixçəsi ilə birlikdə birdəfəlik silinəcək. Bunu [[{{MediaWiki:Policy-url}}|qaydalara]] uyğun etdiyinizi və əməliyyatın nəticələrini başa düşdüyünüzü təsdiq edin.',
@@ -1773,8 +1760,6 @@ Yardım və təklifləriniz üçün:
'actionfailed' => 'ÆmÉ™liyyat yerinÉ™ yetirilmÉ™di',
'deletedtext' => '"$1" silindi.
Sonuncu silinmələrə bax: $2.',
-'deletedarticle' => '"[[$1]]" silindi',
-'suppressedarticle' => '"[[$1]]" gizlədildi',
'dellogpage' => 'Silmə qeydləri',
'dellogpagetext' => 'Æn son silinmiÅŸ sÉ™hifÉ™lÉ™rin siyahısı.',
'deletionlog' => 'Silmə jurnal qeydləri',
@@ -1808,7 +1793,6 @@ Sonuncu silinmələrə bax: $2.',
'unprotectedarticle' => 'mühafizə kənarlaşdırıldı "[[$1]]"',
'protect-title' => '"$1" üçün mühafizə səviyyəsinin dəyişdirilməsi',
'prot_1movedto2' => '[[$1]] adı dəyişildi. Yeni adı: [[$2]]',
-'protect-backlink' => '↠$1',
'protect-legend' => 'Qorumayı təsdiq et',
'protectcomment' => 'Səbəb:',
'protectexpiry' => 'Vaxtı bitib',
@@ -1829,6 +1813,7 @@ Sonuncu silinmələrə bax: $2.',
'protect-level-sysop' => 'Yalnız idarəçilər',
'protect-summary-cascade' => 'kaskad mühafizə',
'protect-expiring' => '$1 (UTC)- tarixində vaxtı bitir',
+'protect-expiring-local' => '$1-dÉ™ bitir',
'protect-expiry-indefinite' => 'müddətsiz',
'protect-cascade' => 'Kaskad mühafizəsi - bu səhifəyə daxil bütün səhifələri mühafizə et',
'protect-cantedit' => 'Bu səhifənin mühafizə dərəcəsini dəyişdirə bilməzsiniz, çünki bu dəyişiklik üçün hüququnuz yoxdur.',
@@ -1870,7 +1855,6 @@ Sonuncu silinmələrə bax: $2.',
'undeletereset' => 'Qur',
'undeleteinvert' => 'Seçilən xaricindəkiləri',
'undeletecomment' => 'Səbəb:',
-'undeletedarticle' => '"[[$1]]" məqaləsi bərpa edilmişdir',
'undeletedrevisions' => 'Cəmi {{PLURAL:$1|1 redaktə|$1 redaktə}} geri qaytarıldı.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versiya|$1 versiya}} və {{PLURAL:$2|1 fayl|$2 fayl}} bərpa edildi',
'undeletedfiles' => '{{PLURAL:$1|1 fayl|$1 fayl}} bərpa olundu',
@@ -1932,7 +1916,6 @@ Bloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:',
'whatlinkshere' => 'Bu səhifəyə bağlantılar',
'whatlinkshere-title' => '"$1" məqaləsinə keçid verən səhifələr',
'whatlinkshere-page' => 'Səhifə:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "'''[[:$1]]''' səhifəsinə istinad edən səhifələr:",
'nolinkshere' => "'''[[:$1]]''' səhifəsinə keçid verən səhifə yoxdur.",
'nolinkshere-ns' => "Seçilmiş ad aralığında heç bir səhifə '''[[:$1]]''' səhifəsinə keçid vermir.",
@@ -2002,6 +1985,7 @@ Bax [[Special:BlockList|IP blok siyahısı]] bloklanmış IP-lər.',
'blocklist-userblocks' => 'Hesab bloklarını gizlət',
'blocklist-tempblocks' => 'Müvəqqəti blokları gizlə',
'blocklist-addressblocks' => 'Tək IP bloklarını gizlə',
+'blocklist-rangeblocks' => 'Indiki blokları gizlə',
'blocklist-timestamp' => 'Vaxt',
'blocklist-target' => 'Hədəf',
'blocklist-expiry' => 'BitiÅŸ tarixi',
@@ -2024,6 +2008,7 @@ Bax [[Special:BlockList|IP blok siyahısı]] bloklanmış IP-lər.',
'unblocklink' => 'bloklamanı kənarlaşdır',
'change-blocklink' => 'bloklamanı dəyişdir',
'contribslink' => 'Köməklər',
+'emaillink' => 'e-məktub göndər',
'autoblocker' => 'Avtomatik olaraq bloklanmısınız. Çünki, qısa müddət əvvəl sizin IP-ünvanınız "[[User:$1|$1]]" tərəfindən istifadə edilmişdir.
$1 adlı istifadəçinin bloklanma səbəbi: "$2"',
'blocklogpage' => 'Bloklama qeydləri',
@@ -2111,9 +2096,6 @@ Zəhmət olmasa başqa ad seçin.',
'move-talk-subpages' => 'Müzakirə səhifələrinin alt səhifələrini köçür ($1-ə qədər)',
'movepage-page-moved' => '$1 səhifəsi $2 səhifəsinə köçürülüb.',
'movepage-page-unmoved' => '$1 səhifəsi $2 səhifəsinə köçürülə bilinmir.',
-'1movedto2' => '[[$1]] adı dəyişildi. Yeni adı: [[$2]]',
-'1movedto2_redir' => '[[$1]] adı və istiqamətləndirmə dəyişildi: [[$2]]',
-'move-redirect-suppressed' => 'yönləndirmənin qarşısı alındı',
'movelogpage' => 'Yerdəyişmə qeydləri',
'movesubpage' => '{{PLURAL:$1|alt səhifə}}',
'movenosubpage' => 'Bu səhifənin altsəhifəsi yoxdur.',
@@ -2124,7 +2106,7 @@ Zəhmət olmasa başqa ad seçin.',
"[[$1]]" məqaləsi mövcuddur. Bu dəyişikliyin yerinə yetirilə bilməsi üçün həmin məqalənin silinməsini istəyirsinizmi?',
'delete_and_move_confirm' => 'Bəli, səhifəni sil',
-'delete_and_move_reason' => 'Ad dəyişməyə yer açmaq üçün silinmişdir',
+'delete_and_move_reason' => '[[$1]] Ad dəyişməyə yer açmaq üçün silinmişdir',
'selfmove' => 'Səhifənin hazırkı adı ilə dəyişmək istənilən ad eynidir. Bu əməliyyat yerinə yetirilə bilməz.',
'immobile-source-namespace' => '"$1" ad aralığında səhifə adları dəyişmir.',
'immobile-target-namespace' => 'Səhilərin "$1" ad aralığına daşınması qeyri-mümkündür',
@@ -2187,6 +2169,8 @@ Zəhmət olmasa başqa ad seçin.',
'import-upload' => 'XML-veriləni yüklə',
'import-token-mismatch' => 'Seans məlumatlarının itirilməsi. Lütfən, yenidən cəhd edin.',
'import-invalid-interwiki' => 'Göstərilən vikidən köçürmək mümkün deyil',
+'import-error-edit' => '"$1" səhifəsi idxal edilə bilinmir, çünki onu dəyişmək səlahiyyətiniz yoxdur.',
+'import-error-create' => '"$1" səhifəsi açılmır, çünki onu yaratmaq səlahiyyətiniz yoxdur.',
# Import log
'importlogpage' => 'Çıxarılma gündəliyi',
@@ -2347,9 +2331,6 @@ Zəhmət olmasa başqa ad seçin.',
# Patrol log
'patrol-log-page' => 'Patrul gündəliyi',
'patrol-log-header' => 'Bu yoxlanmış dəyişikliklərin gündəliyidir.',
-'patrol-log-line' => '$3 yoxlanılaraq $2 $1 versiyası işarələndi',
-'patrol-log-auto' => '(avtomatik)',
-'patrol-log-diff' => 'təftiş $1',
'log-show-hide-patrol' => '$1 patrul gündəliyi',
# Image deletion
@@ -2367,20 +2348,22 @@ $1',
'nextdiff' => 'Sonrakı redaktə →',
# Media information
-'imagemaxsize' => "Şəkilin maksimal tutumu:<br />''(faylın təsviri səhifələri üçün)''",
-'thumbsize' => 'Kiçik ölçü:',
-'widthheight' => '$1 × $2',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|səhifə|səhifələr}}',
-'file-info' => 'faylın ölçüsü: $1, MIME tipi: $2',
-'file-info-size' => '$1 × $2 piksel, fayl həcmi: $3, MIME növü: $4',
-'file-nohires' => '<small>Daha dəqiq versiyası yoxdur.</small>',
-'svg-long-desc' => 'SVG fayl, nominal olaraq $1 × $2 piksel, faylın ölçüsü: $3',
-'show-big-image' => 'Daha yüksək keyfiyyətli şəkil',
-'show-big-image-size' => '$1 × $2 piksel',
-'file-info-gif-looped' => 'ilmələnib',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|çərçivə}}',
-'file-info-png-looped' => 'ilmələnib',
-'file-info-png-frames' => '$1 {{PLURAL:$1|frame|çərçivə}}',
+'imagemaxsize' => "Şəkilin maksimal tutumu:<br />''(faylın təsviri səhifələri üçün)''",
+'thumbsize' => 'Kiçik ölçü:',
+'widthheight' => '$1 × $2',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|səhifə|səhifələr}}',
+'file-info' => 'faylın ölçüsü: $1, MIME tipi: $2',
+'file-info-size' => '$1 × $2 piksel, fayl həcmi: $3, MIME növü: $4',
+'file-nohires' => 'Daha dəqiq versiyası yoxdur.',
+'svg-long-desc' => 'SVG fayl, nominal olaraq $1 × $2 piksel, faylın ölçüsü: $3',
+'show-big-image' => 'Daha yüksək keyfiyyətli şəkil',
+'show-big-image-preview' => 'Sınaq göstərişi ölçüsü: $1.',
+'show-big-image-other' => "Dig'r {{PLURAL:$2|nəticə|nəticələr}}: $1.",
+'show-big-image-size' => '$1 × $2 piksel',
+'file-info-gif-looped' => 'ilmələnib',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|çərçivə}}',
+'file-info-png-looped' => 'ilmələnib',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|çərçivə}}',
# Special:NewFiles
'newimages' => 'Yeni faylların siyahısı',
@@ -2393,9 +2376,10 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 'san',
-'minutes-abbrev' => 'd',
-'hours-abbrev' => 'saat',
+'seconds-abbrev' => '$1san',
+'minutes-abbrev' => '$1d',
+'hours-abbrev' => '$1saat',
+'ago' => '$1 əvvəl',
# Bad image list
'bad_image_list' => 'Format bu şəkildə olmalıdır:
@@ -2798,13 +2782,6 @@ Variants for Chinese language
'scarytranscludedisabled' => '[«Interwiki transcluding»dən çıxılmışdır]',
'scarytranscludetoolong' => '[URL uzundur]',
-# Trackbacks
-'trackbackbox' => 'Bu səhifə üçün geri izləmələr:<br />
-$1',
-'trackbackremove' => '([$1 Sil])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Geri izləmə uğurla silindi.',
-
# Delete conflict
'deletedwhileediting' => "'''Diqqət!''' Bu səhifə siz redaktə etməyə başladıqdan sonra silinmişdir!",
'recreate' => 'Yeniləmək',
@@ -2960,4 +2937,37 @@ Bu saytda texniki problemlər var.',
'sqlite-has-fts' => '$1 tam mətn axtarma ilə',
'sqlite-no-fts' => '$1 tam mətn axtarma olmadan',
+# New logging system
+'logentry-suppress-delete' => '$1 suppressed page $3',
+'revdelete-content-hid' => 'Mətn gizli',
+'revdelete-summary-hid' => 'redaktələr gizli',
+'revdelete-uname-hid' => 'İstifadəçi adı gizli',
+'revdelete-content-unhid' => 'mətn gizli',
+'revdelete-summary-unhid' => 'redaktələr gizli deyil',
+'revdelete-uname-unhid' => 'İstifadəçi adı gizli deyil',
+'revdelete-restricted' => 'məhdudiyyətlər idarəçilərə tətbiq olunur',
+'revdelete-unrestricted' => 'idarəçilər üçün götürülmüş məhdudiyyətlər',
+'logentry-newusers-newusers' => '$1istifadəçi hesabını yaratdı',
+'logentry-newusers-create' => '$1istifadəçi hesabını yaratdı',
+'logentry-newusers-create2' => '$1 $3-ün istifadəçi hesabını yaratdı',
+'logentry-newusers-autocreate' => 'Hesab $1 yaradıldı avtomatik',
+'newuserlog-byemail' => 'parol e-maillə göndərildi',
+
+# Feedback
+'feedback-subject' => 'Mövzu:',
+'feedback-message' => 'Mesaj:',
+'feedback-cancel' => 'Ä°mtina',
+'feedback-error2' => 'Xəta: Redaktə qeydə alınmadı',
+'feedback-close' => 'Oldu',
+'feedback-bugnew' => 'Mən yoxladım. Yeni xəta barədə xəbər ver',
+
+# API errors
+'api-error-filename-tooshort' => 'Fayl adı qısadır.',
+'api-error-filetype-banned' => 'Bu tip fayllar qadağandır.',
+'api-error-illegal-filename' => 'Fayl adına icazə yoxdur.',
+'api-error-unknown-code' => 'Naməlum xəta: "$1".',
+'api-error-unknown-warning' => 'Naməlum xəbərdarlıq: "$1".',
+'api-error-unknownerror' => 'Naməlum xəta: "$1".',
+'api-error-uploaddisabled' => 'Bu vikidə fayl yükləmə mümkün deyil.',
+
);
diff --git a/languages/messages/MessagesBa.php b/languages/messages/MessagesBa.php
index 43292091..56ab0194 100644
--- a/languages/messages/MessagesBa.php
+++ b/languages/messages/MessagesBa.php
@@ -38,6 +38,9 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑ_б-Ñа_фекер_алышыу',
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$linkTrail = '/^((?:[a-z]|а|б|в|г|д|е|Ñ‘|ж|з|и|й|к|л|м|н|о|п|Ñ€|Ñ|Ñ‚|у|Ñ„|Ñ…|ц|ч|ш|щ|ÑŠ|Ñ‹|ÑŒ|Ñ|ÑŽ|Ñ|Ó™|Ó©|Ò¯|Ò“|Ò¡|Ò£|Ò™|Ò«|Ò»|“|»)+)(.*)$/sDu';
$messages = array(
@@ -398,21 +401,23 @@ $1',
'badarticleerror' => 'Был биттә ундай ғәмәл үтәргә Ñрамай',
'cannotdelete' => '«$1» иÑемле битте йәки файлды юйып булмай.
Уны башҡа ҡулланыуÑÑ‹ юйған булыуы мөмкин.',
+'cannotdelete-title' => '"$1" битен юйып булмай',
'badtitle' => 'Ярамаған иÑем',
'badtitletext' => 'Биттең һоратылған иÑеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики иÑеме Ñңылыш күрһәтелгән. ИÑемдә тыйылған Ñимволдар булыуы ла мөмкин.',
-'perfcached' => 'Был мәғлүмәттәр кÑштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин.',
-'perfcachedts' => 'Был мәғлүмәттәр кÑштан алынды, ул һуңғы тапҡыр $1 Ñңыртылды.',
+'perfcached' => 'Был мәғлүмәттәр кÑштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Был мәғлүмәттәр кÑштан алынды, ул һуңғы тапҡыр $1 Ñңыртылды. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Был битте Ñңыртыу хәҙер тыйылған.
Бында күрһәтелгән мәғлүмәттәр ÑңыртылмаÑÑаҡ.',
'wrong_wfQuery_params' => 'wfQuery() функциÑһы Ó©Ñөн Ñ€Ó©Ñ…Ñәт ителмәгән параметрҙар<br />
ФункциÑ: $1<br />
Һоратыу: $2',
'viewsource' => 'Сығанаҡты ҡарау',
-'viewsourcefor' => '«$1» бите',
+'viewsource-title' => '$1 битенең Ñығанаҡ текÑтын ҡарарға',
'actionthrottled' => 'Тиҙлек Ñикләнгән',
'actionthrottledtext' => 'Спам менән көрәшеү Ó©Ñөн, был ғәмәлде ҡыҫҡа ваҡыт ÑÑендә күп тапҡыр ҡабатлауға Ñикләү ҡуйылған. Зинһар, бер ниÑÓ™ минуттан Ñңынан ҡабатлап ҡарағыҙ.',
'protectedpagetext' => 'Был бит мөхәррирләү Ó©Ñөн Ñбыҡ.',
'viewsourcetext' => 'Һеҙ был биттең Ñығанаҡ текÑтын ҡарай һәм күÑермәһен ала алаһығыҙ:',
+'viewyourtext' => "Был биттәге '''үҙгәртеүҙәрегеҙҙең''' Ñығанаҡ текÑтын ҡарай һәм күÑермәһен ала алаһығыҙ:",
'protectedinterface' => 'Был биттә программа арайөҙө белдереүҙәре бар. Вандализмға ҡаршы көрәш Ñәбәпле, был битте үҙгәртеү тыйыла.',
'editinginterface' => "'''Иғтибар.''' Һеҙ программаның арайөҙ текÑÑ‚Ñ‹ булған битте мөхәррирләйһегеҙ.
Уны үҙгәртеү, башҡа ҡулланыуÑыларҙын арайөҙ күренешен үҙгәртәÑәктер.
@@ -508,6 +513,7 @@ $2',
'emailconfirmlink' => 'Электрон почта адреÑығыҙҙы раҫлағыҙ',
'invalidemailaddress' => 'Электрон почта адреÑÑ‹ ҡабул ителә алмай, Ñөнки ул форматка тап килмәй.
Зинһар, дөрөҫ Ð°Ð´Ñ€ÐµÑ ÐºÐµÑ€ÐµÑ‚ÐµÐ³ÐµÒ™ йәки юлды буш ҡалдырығыҙ.',
+'cannotchangeemail' => 'Иҫәп Ñҙыуы Ñлектрон почта адреÑтарын был викила үҙгәртеп булмай.',
'accountcreated' => 'Иҫәп Ñҙыуы Ñһалды',
'accountcreatedtext' => '$1 иÑемле ҡулланыуÑÑ‹ Ó©Ñөн иÑәп Ñҙыуы Ñһалды.',
'createaccount-title' => '{{SITENAME}}: теркәлеү',
@@ -523,6 +529,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHP-ның mail() функциÑһында билдәһеҙ хата',
+'user-mail-no-addy' => 'Электрон почта адреÑÑ‹ булмайынÑа Ñлектрон хәбәр ебәреп ҡараны',
# Change password dialog
'resetpass' => 'Паролде үҙгәртеү',
@@ -542,16 +549,18 @@ $2',
'resetpass-temp-password' => 'ВаҡытлыÑа пароль',
# Special:PasswordReset
-'passwordreset' => 'Паролде ташлатыу',
-'passwordreset-text' => 'Иҫәп Ñҙыуығыҙ мәғлүмәттәрен хат аша алыу Ó©Ñөн киләһе форманы тултырығыҙ.',
-'passwordreset-legend' => 'Паролде ташлатыу',
-'passwordreset-disabled' => 'Был викила паролде ташлатыу ғәмәлдә түгел',
-'passwordreset-pretext' => '{{PLURAL:$1||аҫта күрһәтелгән мәғлүмәттәрҙең бер киҫәген керетегеҙ}}',
-'passwordreset-username' => 'ҠулланыуÑÑ‹ иÑеме:',
-'passwordreset-domain' => 'Домен:',
-'passwordreset-email' => 'Электрон почта адреÑÑ‹:',
-'passwordreset-emailtitle' => '{{SITENAME}} иҫәп Ñҙыуы мәғлүмәттәре',
-'passwordreset-emailtext-ip' => 'Берәү (бәлки Ò»Ó™Ò™, $1 IP-адреÑынан ) {{SITENAME}} ($4) проектындағы иҫәп Ñҙыуығыҙҙы хәтерләтеүҙе һоратты.
+'passwordreset' => 'Паролде ташлатыу',
+'passwordreset-text' => 'Иҫәп Ñҙыуығыҙ мәғлүмәттәрен хат аша алыу Ó©Ñөн киләһе форманы тултырығыҙ.',
+'passwordreset-legend' => 'Паролде ташлатыу',
+'passwordreset-disabled' => 'Был викила паролде ташлатыу ғәмәлдә түгел',
+'passwordreset-pretext' => '{{PLURAL:$1||аҫта күрһәтелгән мәғлүмәттәрҙең бер киҫәген керетегеҙ}}',
+'passwordreset-username' => 'ҠулланыуÑÑ‹ иÑеме:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?',
+'passwordreset-capture-help' => 'Әгәр был билдәне ҡуйһағыҙ, ҡулланыуÑыға ебәрелгән ваҡытлыÑа пароль һеҙгә күрһәтеләÑәк.',
+'passwordreset-email' => 'Электрон почта адреÑÑ‹:',
+'passwordreset-emailtitle' => '{{SITENAME}} иҫәп Ñҙыуы мәғлүмәттәре',
+'passwordreset-emailtext-ip' => 'Берәү (бәлки Ò»Ó™Ò™, $1 IP-адреÑынан ) {{SITENAME}} ($4) проектындағы иҫәп Ñҙыуығыҙҙы хәтерләтеүҙе һоратты.
Киләһе ҡулланыуÑÑ‹ {{PLURAL:$3|иҫәп Ñҙыуы|иҫәп Ñҙыуҙары}} был Ñлектрон почта адреÑÑ‹ менән бәйле:
$2
@@ -559,16 +568,29 @@ $2
Был ваҡытлыÑа {{PLURAL:$3|пароль|паролдәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә булаÑаҡ.
Һеҙ ÑиÑтемала танылырға һәм Ñңы пароль һайларға тейешһегеҙ.
Әгәр, һеҙ быны һоратмаған булһағыҙ йәки Ñлекке паролегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм Ñлекке паролегеҙҙе ҡулланыуҙы дауам итегеҙ.',
-'passwordreset-emailtext-user' => '{{SITENAME}} проектындағы $1 ҡулланыуÑыһы {{SITENAME}} ($4) проектындағы иҫәп Ñҙыуығыҙҙы хәтерләтеүҙе һоратты. Киләһе ҡулланыуÑÑ‹ {{PLURAL:$3|иҫәп Ñҙыуы|иҫәп Ñҙыуҙары}} был Ñлектрон почта адреÑÑ‹ менән бәйле:
+'passwordreset-emailtext-user' => '{{SITENAME}} проектындағы $1 ҡулланыуÑыһы {{SITENAME}} ($4) проектындағы иҫәп Ñҙыуығыҙҙы хәтерләтеүҙе һоратты. Киләһе ҡулланыуÑÑ‹ {{PLURAL:$3|иҫәп Ñҙыуы|иҫәп Ñҙыуҙары}} был Ñлектрон почта адреÑÑ‹ менән бәйле:
$2
Был ваҡытлыÑа {{PLURAL:$3|пароль|паролдәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә булаÑаҡ.
Һеҙ ÑиÑтемала танылырға һәм Ñңы пароль һайларға тейешһегеҙ.
Әгәр, һеҙ быны һоратмаған булһағыҙ йәки Ñлекке паролегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм Ñлекке паролегеҙҙе ҡулланыуҙы дауам итегеҙ.',
-'passwordreset-emailelement' => 'ҠулланыуÑÑ‹ иÑеме: $1
+'passwordreset-emailelement' => 'ҠулланыуÑÑ‹ иÑеме: $1
ВаҡытлыÑа пароль: $2',
-'passwordreset-emailsent' => 'Электрон почта аша иҫләтеү хаты ебәрелде.',
+'passwordreset-emailsent' => 'Электрон почта аша иҫләтеү хаты ебәрелде.',
+'passwordreset-emailsent-capture' => 'Ебәрелгән хәтерләтеү хәбәре түбәндә күрһәлгән.',
+'passwordreset-emailerror-capture' => 'Килеп Ñыҡҡан хәтерләтеү хәбәре түбәндә күрһәтелгән, тик уны ебәреү уңышһыҙ тамамланды. Сәбәбе:$1',
+
+# Special:ChangeEmail
+'changeemail' => 'Электрон почта адреÑын үҙгәртергә',
+'changeemail-header' => 'Электрон почта адреÑын үҙгәртеү',
+'changeemail-text' => 'Электрон почта адреÑығыҙҙы үҙгәртеү Ó©Ñөн түбәндәге форманы тултырығыҙ. Үҙгәртеүҙәрҙе раҫлау Ó©Ñөн паролегеҙҙе керетеү кәрәк булаÑаҡ.',
+'changeemail-no-info' => 'Был биткә туранан ирешеү Ó©Ñөн һеҙгә ÑиÑтемала танылыу кәрәк.',
+'changeemail-oldemail' => 'Хәҙерге Ñлектрон почта адреÑÑ‹:',
+'changeemail-newemail' => 'Яңы Ñлектрон почта адреÑÑ‹:',
+'changeemail-none' => '(ÑŽÒ¡)',
+'changeemail-submit' => 'ÐдреÑÑ‚Ñ‹ үҙгәртергә',
+'changeemail-cancel' => 'Кире алырға',
# Edit page toolbar
'bold_sample' => 'Ҡалын Ñҙылыш',
@@ -636,9 +658,6 @@ $2
Һеҙҙең IP-Ð°Ð´Ñ€ÐµÑ â€” $3, блоклау идентификаторы — #$5.
Хаттарҙа был мәғлүмәттәрҙе күрһәтергә онотмағыҙ.",
'blockednoreason' => 'Ñәбәп белдерелмәгән',
-'blockedoriginalsource' => "Ðҫта '''$1''' битенең текÑÑ‚Ñ‹ күрһәтелгән.",
-'blockededitsource' => "Ðҫта '''$1''' битенең '''һеҙ үҙгәрткән''' текÑÑ‚Ñ‹ күрһәтелгән.",
-'whitelistedittitle' => 'Үҙгәртеү Ó©Ñөн танылыу кәрәк',
'whitelistedittext' => 'Биттәрҙә үҙгәртеү Ó©Ñөн $1 кәрәк.',
'confirmedittext' => 'Биттәрҙе үҙгәртерҙән алда Ñлектрон почта адреÑығыҙҙы раҫларға тейешһегеҙ.
Быны [[Special:Preferences|көйләүҙәр битендә]] Ñшләй алаһығыҙ.',
@@ -889,8 +908,6 @@ $3 белдергән Ñәбәп: ''$2''",
'revdelete-unsuppress' => 'Тергеҙелгән верÑиÑларҙан бар Ñикләүҙәрҙе алырға',
'revdelete-log' => 'Сәбәп:',
'revdelete-submit' => 'Һайланған {{PLURAL:$1|верÑиÑ|верÑиÑлар}} Ó©Ñөн ҡулланырға',
-'revdelete-logentry' => '[[$1]] бит верÑиÑһының күренеүÑәнлеге үҙгәрҙе',
-'logdelete-logentry' => '[[$1]] ваҡиғаһының күренеүÑәнлеге үҙгәртелде',
'revdelete-success' => "'''ВерÑÐ¸Ñ ÐºÒ¯Ñ€ÐµÐ½ÐµÒ¯Ñәнлеге уңышлы үҙгәртелде.'''",
'revdelete-failure' => "'''ВерÑÐ¸Ñ ÐºÒ¯Ñ€ÐµÐ½ÐµÒ¯Ñәнлеген үҙгәртеп булмай:'''
$1",
@@ -902,15 +919,6 @@ $1",
'revdel-restore-visible' => 'ҡара алған өлгөләр',
'pagehist' => 'Бит тарихы',
'deletedhist' => 'Юйылған тарих',
-'revdelete-content' => 'ÑÑтәлек',
-'revdelete-summary' => 'үҙгәртеүҙәр таÑуирламаһы',
-'revdelete-uname' => 'ҡатнашыуÑÑ‹ иÑеме',
-'revdelete-restricted' => 'хәкимдәргә ҡаршы ҡулланылған Ñикләүҙәр',
-'revdelete-unrestricted' => 'хәкимдәрҙән алынған Ñикләүҙәр',
-'revdelete-hid' => '$1 йәшер',
-'revdelete-unhid' => '$1 күрһәт',
-'revdelete-log-message' => '$2 {{PLURAL:$2|өлгө}} Ó©Ñөн $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|ваҡиға|ваҡиға}} Ó©Ñөн $1',
'revdelete-hide-current' => '$2, $1 ваҡытлы Ñҙманы йәшереүҙә хата.
Уны йәшереп булмай.',
'revdelete-show-no-access' => '$2, $1 ваҡытлы Ñҙманы аÑыуҙа хата: был Ñҙма «Ñикләнгән» тип билдәләнгән.
@@ -1067,12 +1075,14 @@ $1",
'prefs-rc' => 'Һуңғы үҙгәртеүҙәр',
'prefs-watchlist' => 'Күҙәтеү иÑемлеге',
'prefs-watchlist-days' => 'Күҙәтеү иÑемлегендә ниÑÓ™ көн керетелгән үҙгәртеүҙәрҙе күрһәтергә:',
-'prefs-watchlist-days-max' => 'Иң күбендә 7 көн',
+'prefs-watchlist-days-max' => 'МакÑимум $1 {{PLURAL:$1|көн|көн}}',
'prefs-watchlist-edits' => 'Киңәйтелгән күҙәтеү иÑемлегендә күрһәтелә торған үҙгәртеүҙәр һанының Ñиге:',
'prefs-watchlist-edits-max' => 'Иң күбе: 1000',
'prefs-watchlist-token' => 'Күҙәтеү иÑемлеге токены:',
'prefs-misc' => 'Башҡа көйләүҙәр',
'prefs-resetpass' => 'Паролде үҙгәртергә',
+'prefs-changeemail' => 'Электрон почта адреÑын үҙгәртергә',
+'prefs-setemail' => 'Электрон почта адреÑын көйләү',
'prefs-email' => 'Электрон почта көйләүҙәре',
'prefs-rendering' => 'Күренеш',
'saveprefs' => 'Һаҡларға',
@@ -1132,6 +1142,7 @@ $1",
'yourrealname' => 'Һеҙҙең Ñ‹Ñын иÑемегеҙ (*)',
'yourlanguage' => 'Тышҡы күренештә ҡулланылған тел:',
'yourvariant' => 'ЭÑтәлектең тел варианты:',
+'prefs-help-variant' => 'Вики биттәренең ÑÑтәлеген күрһәтеү Ó©Ñөн өҫтөнлөк бирелгән тел йәки орфографиÑ.',
'yournick' => 'Һеҙҙең уйҙырма иÑемегеҙ/ҡушаматығыҙ (имза Ó©Ñөн):',
'prefs-help-signature' => 'Фекер алышыу биттәрендәге хәбәрҙәрегеҙ һеҙҙең имзағыҙға һәм ваҡытҡа әйләнәÑәк "<nowiki>~~~~</nowiki>" Ñимволдарын Ó©Ò«Ñ‚Ó™Ò¯ юлы менән имзаланырға тейеш.',
'badsig' => 'Хаталы имза. HTML-тегдарҙың дөрөҫлөгөн тикшерегеҙ.',
@@ -1174,7 +1185,7 @@ $1",
'userrights-lookup-user' => 'ҠулланыуÑÑ‹ төркөмдәрен идаралау',
'userrights-user-editname' => 'ҠулланыуÑÑ‹ иÑемен керетерегеҙ:',
'editusergroup' => 'ҠулланыуÑÑ‹ төркөмдәрен идараларға',
-'editinguser' => "Мөхәрирләү '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Хоҡуҡтары үҙгәртелгән ҡулланыуÑÑ‹ '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'ҠулланыуÑÑ‹ төркөмдәрен идараларға',
'saveusergroups' => 'ҠулланыуÑÑ‹ төркөмдәрен һаҡларға',
'userrights-groupsmember' => 'Ðғза булған төркөмдәр:',
@@ -1268,13 +1279,13 @@ $1",
'right-autopatrol' => 'Үҙгәртеүҙәр үҙҙәренән-үҙҙәре тикшерелгән тип билдәләнә',
'right-patrolmarks' => 'Һуңғы үҙгәртеүҙәрҙә тикшереү билдәләрен ҡарау',
'right-unwatchedpages' => 'Күҙәтелмәгән биттәр иÑемлеген ҡарау',
-'right-trackback' => 'Trackback ебәреү',
'right-mergehistory' => 'Биттәр тарихын берләштереү',
'right-userrights' => 'Барлыҡ ҡатнашыуÑыларҙың хоҡуҡтарын үҙгәртеү',
'right-userrights-interwiki' => 'ҠатнашыуÑыларҙың башҡа Вики-Ñайттарҙағы хоҡуҡтарын үҙгәртеү',
'right-siteadmin' => 'Мәғлүмәттәр базаһын аÑыу һәм Ñбыу',
'right-override-export-depth' => '5-Ñе тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе Ñығарыу',
'right-sendemail' => 'Башҡа ҡатнашыуÑыларға Ñлектрон почта аша хат ебәреү',
+'right-passwordreset' => 'Паролде Ñңыртыу хәбәрҙәрен ҡарау',
# User rights log
'rightslog' => 'ҠулланыуÑының хоҡуҡтары көндәлеге',
@@ -1308,16 +1319,17 @@ $1",
'action-suppressionlog' => 'Был шәхÑи журналды ҡарау',
'action-block' => 'Был ҡатнашыуÑыға мөхәррирләүҙе тыйыу',
'action-protect' => 'Был биттең һаҡланыу дәрәжәһен үҙгәртеү',
+'action-rollback' => 'битте мөхәррирләгән һуңғы ҡатнашыуÑының үҙгәртеүҙәрен тиҙ кире алыу',
'action-import' => 'Был битте башҡа вики-проекттан күÑереү',
'action-importupload' => 'Был битте файл күÑереү аша тейәү',
'action-patrol' => 'Башҡаларҙың үҙгәртеүҙәрен тикшерелгән тип билдәләү',
'action-autopatrol' => 'Үҙ үҙгәртеүҙәрен тикшерелгән тип билдәләү',
'action-unwatchedpages' => 'Күҙәтелмәгән биттәр иÑемлеген ҡарау',
-'action-trackback' => 'Trackback ебәреү',
'action-mergehistory' => 'Был биттең тарихын берләштереү',
'action-userrights' => 'ҠатнашыуÑының барлыҡ хоҡуҡтарын үҙгәртеү',
'action-userrights-interwiki' => 'ҠатнашыуÑыларҙың башҡа Викиларҙағы хоҡуҡтарын үҙгәртеү',
'action-siteadmin' => 'Мәғлүмәттәр базаһын аÑыу һәм Ñбыу',
+'action-sendemail' => 'Ñлектрон хат ебәреү',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
@@ -1349,6 +1361,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|ҡатнашыуÑÑ‹}} күҙәтә]',
'rc_categories' => 'Ошо категориÑларҙан ғына («|» менән айырырға)',
'rc_categories_any' => 'Һәр',
+'rc-change-size-new' => 'Үҙгәртештән һуң $1 {{PLURAL:$1|байт|байт}}',
'newsectionsummary' => '/* $1 */ Ñңы бүлек',
'rc-enhanced-expand' => 'Ваҡлыҡтарҙы күрһәтергә (JavaScript кәрәкле)',
'rc-enhanced-hide' => 'Ваҡлыҡтарҙы йәшерергә',
@@ -1402,6 +1415,7 @@ $1",
'minlength1' => 'Файлдың иÑеме кәмендә бер хәрефтән торорға тейеш.',
'illegalfilename' => '«$1» файлы иÑемендә Ñ€Ó©Ñ…Ñәт ителмәгән Ñимволдар бар.
Зинһар файл иÑемен үҙгәртегеҙ һәм Ñңынан тейәп ҡарағыҙ.',
+'filename-toolong' => 'Файл иÑемдәре 240 байтты үтергә тейеш түгел.',
'badfilename' => 'Файлдың иÑеме $1 иÑеменә үҙгәртелде.',
'filetype-mime-mismatch' => 'Файлдың «.$1» киңәйеүе файлдың ($2) MIME-төрөнә тап килмәй.',
'filetype-badmime' => 'MIME-төрө «$1» булған файлдарҙы тейәп булмай.',
@@ -1500,6 +1514,36 @@ $1',
'upload-unknown-size' => 'Билдәһеҙ дәүмәл',
'upload-http-error' => 'HTTP хата килеп ÑÑ‹Ò¡Ñ‚Ñ‹: $1',
+# File backend
+'backend-fail-stream' => '$1 файлын транÑлÑциÑлап булмай.',
+'backend-fail-backup' => '$1 файлының резерв күÑермәһен Ñшләп булмай.',
+'backend-fail-notexists' => '$1 файлы юҡ.',
+'backend-fail-hashes' => 'Сағыштырыу өҫөн кәрәкле файл Ñ…Ñштарын алып булманы.',
+'backend-fail-notsame' => 'Бер үҡ булмаған файл $1 бар инде.',
+'backend-fail-invalidpath' => '$1 Ñраҡлы һаҡлау юлы түгел.',
+'backend-fail-delete' => '«$1» файлын юйып булмай.',
+'backend-fail-alreadyexists' => '$1 файлы бар инде.',
+'backend-fail-store' => '$1 файлын $2 адреÑында һаҡлап булманы.',
+'backend-fail-copy' => 'Файлдың күÑермәһен $1 адреÑынан $2 адреÑына Ñһап булманы.',
+'backend-fail-move' => 'Файлды $1 адреÑынан $2 адреÑына күÑереп булманы.',
+'backend-fail-opentemp' => 'Ваҡытлы файлды аÑып булмай.',
+'backend-fail-writetemp' => 'Ваҡытлы файлға Ñҙып булмай.',
+'backend-fail-closetemp' => 'Ваҡытлы файлды Ñбып булмай.',
+'backend-fail-read' => '«$1» файлын уҡып булмай.',
+'backend-fail-create' => '«$1» файлын Ñһап булмай.',
+'backend-fail-connect' => '"$1" һаҡлағыÑÑ‹ менән бәйләнеш Ñһап булманы.',
+
+# Lock manager
+'lockmanager-notlocked' => '" $1 " аÑÒ¡Ñ‹Ñының биген ÑиÑеп булмай; ул бикле түгел.',
+'lockmanager-fail-closelock' => '"$1" аÑÒ¡Ñ‹Ñының бикләү файлын Ñбып булманы.',
+'lockmanager-fail-deletelock' => '"$1" аÑÒ¡Ñ‹Ñының бикләү файлын юйып булманы.',
+'lockmanager-fail-acquirelock' => '"$1" аÑÒ¡Ñ‹Ñын бикләп булманы.',
+'lockmanager-fail-openlock' => '"$1" аÑÒ¡Ñ‹Ñының бикләү файлын аÑып булманы.',
+'lockmanager-fail-releaselock' => '"$1" аÑÒ¡Ñ‹Ñының биген аÑып булманы.',
+'lockmanager-fail-db-bucket' => '$1 Ñегментында етәрле күләмдә бикләү базаһы менән бәйләнеп булманы.',
+'lockmanager-fail-db-release' => '$1 мәғлүмәттәр базаһы биген ÑиÑеп булманы.',
+'lockmanager-fail-svr-release' => '$1 Ñерверы биктәрен ÑиÑеп булманы.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Ðрхивты тикшереү Ó©Ñөн файлды аÑҡан ваҡытта хата барлыҡҡа килде.',
'zip-wrong-format' => 'Күрһәтелгән файл ZIP файл түгел.',
@@ -1516,6 +1560,7 @@ $1',
'uploadstash-badtoken' => 'Был ғәмәлде башҡарып булманы, һеҙҙең төҙәтеү Ñҙмағыҙ ғәмәлдән Ñыҡҡан булыуы ихтимал. Яңынан ҡабатлап ҡарағыҙ.',
'uploadstash-errclear' => 'Файлдарҙы таҙартып булманы.',
'uploadstash-refresh' => 'Файлдар иÑемлеген Ñңыртырға',
+'invalid-chunk-offset' => 'Ҡабул ителмәгән фрагмент шылыуы',
# img_auth script messages
'img-auth-accessdenied' => 'Керергә Ñ€Ó©Ñ…Ñәт ителмәй',
@@ -1625,23 +1670,24 @@ $1',
'filerevert-badversion' => 'Файлдың күрһәтелгән ваҡыт билдәһе менән алдағы урындағы өлгөһө юҡ.',
# File deletion
-'filedelete' => '$1 юйырға',
-'filedelete-legend' => 'Файлды юйырға',
-'filedelete-intro' => "Һеҙ '''[[Media:$1|$1]]''' файлын бөтә тарихы менән бергә юйырға йыйынаһығыҙ.",
-'filedelete-intro-old' => "Һеҙ '''[[Media:$1|$1]]''' файлының [$4 $2 $3] өлгөһөн ÑŽÑһығыҙ.",
-'filedelete-comment' => 'Сәбәп:',
-'filedelete-submit' => 'Юйырға',
-'filedelete-success' => "'''$1''' юйылды.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' файлының $2 $3 өлгөһө юйылды.",
-'filedelete-nofile' => "'''$1''' файлы юҡ.",
-'filedelete-nofile-old' => "'''$1''' файлының күрһәтелгән атрибуттар менән архив өлгөһө юҡ.",
-'filedelete-otherreason' => 'Башҡа/өҫтәмә Ñәбәп:',
-'filedelete-reason-otherlist' => 'Башҡа Ñәбәп',
-'filedelete-reason-dropdown' => '*Киң таралған юйыу Ñәбәптәре:
+'filedelete' => '$1 юйырға',
+'filedelete-legend' => 'Файлды юйырға',
+'filedelete-intro' => "Һеҙ '''[[Media:$1|$1]]''' файлын бөтә тарихы менән бергә юйырға йыйынаһығыҙ.",
+'filedelete-intro-old' => "Һеҙ '''[[Media:$1|$1]]''' файлының [$4 $2 $3] өлгөһөн ÑŽÑһығыҙ.",
+'filedelete-comment' => 'Сәбәп:',
+'filedelete-submit' => 'Юйырға',
+'filedelete-success' => "'''$1''' юйылды.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' файлының $2 $3 өлгөһө юйылды.",
+'filedelete-nofile' => "'''$1''' файлы юҡ.",
+'filedelete-nofile-old' => "'''$1''' файлының күрһәтелгән атрибуттар менән архив өлгөһө юҡ.",
+'filedelete-otherreason' => 'Башҡа/өҫтәмә Ñәбәп:',
+'filedelete-reason-otherlist' => 'Башҡа Ñәбәп',
+'filedelete-reason-dropdown' => '*Киң таралған юйыу Ñәбәптәре:
** авторлыҡ хоҡуҡтарын боҙоу
** икенÑе файл менән тап килгән файл',
-'filedelete-edit-reasonlist' => 'Сәбәптәр иÑемлеген мөхәррирләргә',
-'filedelete-maintenance' => 'Файлдарҙы юйыу һәм тергеҙеү техник Ñштәр ваҡытында ваҡытлыÑа һундерелгән.',
+'filedelete-edit-reasonlist' => 'Сәбәптәр иÑемлеген мөхәррирләргә',
+'filedelete-maintenance' => 'Файлдарҙы юйыу һәм тергеҙеү техник Ñштәр ваҡытында ваҡытлыÑа һундерелгән.',
+'filedelete-maintenance-title' => 'Файлды юйып булмай',
# MIME search
'mimesearch' => 'MIME буйынÑа Ñҙләү',
@@ -1749,6 +1795,7 @@ $1',
'mostimages' => 'Иң күп һылтанма Ñһалған Ñ€Ó™Ñемдәр',
'mostrevisions' => 'Иң күп үҙгәртеү Ñһалған биттәр',
'prefixindex' => 'ИÑемдәре башында ҡушымта торған биттәр',
+'prefixindex-namespace' => 'ПрефикÑлы бар биттәр ( $1 иÑемдәр арауығы)',
'shortpages' => 'Ҡыҫҡа биттәр',
'longpages' => 'Оҙон биттәр',
'deadendpages' => 'КөрÑөк биттәр',
@@ -1765,7 +1812,7 @@ $1',
'listusers-editsonly' => 'Кәмендә бер үҙгәртеү индергән ҡатнашыуÑыларҙы ғына күрһәтергә',
'listusers-creationsort' => 'Булдырыу көнө буйынÑа тәртипкә килтерергә',
'usereditcount' => '$1 {{PLURAL:$1|үҙгәртеү}}',
-'usercreated' => '$1 $2 булдырылған',
+'usercreated' => '$3 ҡулланыуÑыһының теркәлеү ваҡыты: $1 $2',
'newpages' => 'Яңы биттәр',
'newpages-username' => 'ҠатнашыуÑÑ‹:',
'ancientpages' => 'Иң иҫке мәҡәләләр',
@@ -1858,12 +1905,8 @@ $1',
'activeusers-noresult' => 'ҠатнашыуÑылар табылманы',
# Special:Log/newusers
-'newuserlogpage' => 'Яңы ҡулланыуÑÑ‹ Ñҙмалары',
-'newuserlogpagetext' => 'Яңы теркәлгән ҡатнашыуÑылар Ñҙмалары журналы.',
-'newuserlog-byemail' => 'пароль Ñлектрон почта адреÑÑ‹ аша ебәрелде',
-'newuserlog-create-entry' => 'Яңы ҡулланыуÑÑ‹',
-'newuserlog-create2-entry' => 'Ñңы $1 иҫәп Ñҙмаһын булдырған',
-'newuserlog-autocreate-entry' => 'Иҫәп Ñҙмаһы үҙенән-үҙе булдырылған',
+'newuserlogpage' => 'Яңы ҡулланыуÑÑ‹ Ñҙмалары',
+'newuserlogpagetext' => 'Яңы теркәлгән ҡатнашыуÑылар Ñҙмалары журналы.',
# Special:ListGroupRights
'listgrouprights' => 'ҠатнашыуÑылар төркөмө хоҡуҡтары',
@@ -1892,7 +1935,7 @@ $1',
'emailpagetext' => 'Был ҡатнашыуÑыға Ñлектрон почта аша хат ебәреү Ó©Ñөн, һеҙ түбәндәге форманы ҡуллана алаһығыҙ.
Яуап Ó©Ñөн Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ»Ð°Ñ€Ð°Ò¡ һеҙ [[Special:Preferences|көйләүҙәрегеҙҙә]] күрһәткән Ñлектрон почта адреÑÑ‹ күрһәтеләÑәк, шулай итеп, хатты алыуÑÑ‹ һеҙгә тура Ñуап ебәрә алаÑаҡ.',
'usermailererror' => 'Хат ебәргән ваҡытта хата килеп ÑÑ‹Ò¡Ñ‚Ñ‹:',
-'defemailsubject' => '{{SITENAME}} проектынан хат',
+'defemailsubject' => '{{SITENAME}} — $1 ҡулланыуÑыһынан хат',
'usermaildisabled' => 'ҠатнашыуÑының Ñлектрон почтаһы һүндерелгән',
'usermaildisabledtext' => 'Һеҙ был вики-проекттың башҡа ҡатнашыуÑыларына Ñлектрон хат ебәрә алмайһығыҙ',
'noemailtitle' => 'Электрон почта адреÑÑ‹ ÑŽÒ¡',
@@ -1946,7 +1989,7 @@ $1',
'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр Ó©Ñөн күҙәтелгән биттәрҙе ҡарау',
'watchlistcontains' => 'Һеҙҙең күҙәтеү иÑемлегендә $1 {{PLURAL:$1|бит|бит}}бар.',
'iteminvalidname' => '«$1» менән ҡыйынлыҡтар, иÑеме дөрөҫ түгел...',
-'wlnote' => "Түбәндә аҙаҡҡы {{PLURAL:$2|Ñәғәт|'''$2''' Ñәғәт}} ÑÑендә Ñшләнгән {{PLURAL:$1|үҙгәртеү|'''$1''' үҙгәртеү}} күрһәтелгән.",
+'wlnote' => "Түбәндә $3 $4 ваҡытына тиклем аҙаҡҡы {{PLURAL:$2|Ñәғәт|'''$2''' Ñәғәт}} ÑÑендә Ñшләнгән {{PLURAL:$1|үҙгәртеү|'''$1''' үҙгәртеү}} күрһәтелгән.",
'wlshowlast' => 'Һуңғы $1 Ñәғәт $2 көн Ó©Ñөн күрһәт $3',
'watchlist-options' => 'Күҙәтеү иÑемлеге көйләүҙәре',
@@ -2011,8 +2054,6 @@ $UNWATCHURL
'actionfailed' => 'Ғәмәл үтәлмәне',
'deletedtext' => '«$1» юйылды.
Юйылған һуңғы биттәрҙе ҡарар Ó©Ñөн: $2.',
-'deletedarticle' => '«[[$1]]» юйылды',
-'suppressedarticle' => '"[[$1]]" битен йәшергән',
'dellogpage' => 'Юйыуҙар журналы',
'dellogpagetext' => 'Түбәндә һуңғы юйыуҙар Ñҙмалары журналы килтерелгән.',
'deletionlog' => 'Юйыуҙар журналы',
@@ -2060,7 +2101,10 @@ $2 өлгөһөнә ҡайтыу.',
'unprotectedarticle' => '«[[$1]]» битенән һаҡлау алынды',
'movedarticleprotection' => 'һаҡлау көйләүҙәрен «[[$2]]» битенән «[[$1]]» битенә күÑергән',
'protect-title' => '"$1" битенең һаҡлау дәрәжәһен үҙгәртеү',
+'protect-title-notallowed' => '"$1" битенең һаҡлау дәрәжәһен байҡау',
'prot_1movedto2' => '[[$1]] битенең иÑемен [[$2]] тип үҙгәрткән',
+'protect-badnamespace-title' => 'Һаҡланмаған иÑемдәр арауығы',
+'protect-badnamespace-text' => 'Был иÑемдәр арауығындағы биттәрҙе һаҡлап булмай.',
'protect-legend' => 'Битте һаҡлауҙы раҫлау',
'protectcomment' => 'Сәбәп:',
'protectexpiry' => 'Тамамлана:',
@@ -2080,6 +2124,7 @@ $2 өлгөһөнә ҡайтыу.',
'protect-level-sysop' => 'Хәкимдәр генә',
'protect-summary-cascade' => 'Ñҙмә-Ñҙлекле',
'protect-expiring' => '$1 бөтә (UTC)',
+'protect-expiring-local' => '$1 тамамлана',
'protect-expiry-indefinite' => 'Ñикһеҙ',
'protect-cascade' => 'Был биткә кергән биттәрҙе һаҡларға (Ñҙмә-Ñҙлекле һаҡлау)',
'protect-cantedit' => 'Һеҙ был биттең һаҡлау дәрәжәһен үҙгәртә алмайһығыҙ, Ñөнки уны үҙгәртеү хоҡуғығыҙ ÑŽÒ¡.',
@@ -2140,7 +2185,6 @@ $2 өлгөһөнә ҡайтыу.',
'undeletereset' => 'Юҡ итергә',
'undeleteinvert' => 'Һайланғандарҙы әйләндерергә',
'undeletecomment' => 'Сәбәп:',
-'undeletedarticle' => '«[[$1]]» тергеҙелде',
'undeletedrevisions' => '$1 {{PLURAL:$1|өлгө}} тергеҙелде',
'undeletedrevisions-files' => '{{PLURAL:$1|өлгө}} һәм {{PLURAL:$2|файл}} тергеҙелде',
'undeletedfiles' => '{{PLURAL:$1|файл}} тергеҙелде',
@@ -2150,6 +2194,7 @@ $2 өлгөһөнә ҡайтыу.',
Һуңғы юйыуҙарҙы һәм тергеҙеүҙәрҙе ҡарау Ó©Ñөн, [[Special:Log/delete|юйыу Ñҙмалары журналын]] ҡарағыҙ.",
'undelete-header' => 'Һуңғы юйылған биттәрҙе [[Special:Log/delete|юйыу Ñҙмалары журналында]] ҡарағыҙ.',
+'undelete-search-title' => 'Юйылған биттәрҙе Ñҙләү',
'undelete-search-box' => 'Юйылған биттәрҙе Ñҙләү',
'undelete-search-prefix' => 'Ошолай башланған биттәрҙе күрһәтергә:',
'undelete-search-submit' => 'Эҙләү',
@@ -2159,6 +2204,7 @@ $2 өлгөһөнә ҡайтыу.',
'undelete-cleanup-error' => 'Ҡулланылмаған "$1" архив файлын юйыу хатаһы.',
'undelete-missing-filearchive' => 'Ðрхив индикаторы $1 булған файлды тергеҙеү мөмкин түгел, Ñөнки ул мәғлүмәттәр базаһында ÑŽÒ¡.
Файл бығаÑа тергеҙелгән, булыуы мөмкин.',
+'undelete-error' => 'Битте тергеҙеү хатаһы',
'undelete-error-short' => 'Файлды тергеҙеү хатаһы: $1',
'undelete-error-long' => 'Файлды тергеҙеү ваҡытында хаталар килеп ÑÑ‹Ò¡Ñ‚Ñ‹:
@@ -2280,6 +2326,7 @@ $1',
'blocklist-userblocks' => 'Иҫәп Ñҙыуҙарын бикләүҙе йәшер',
'blocklist-tempblocks' => 'ВаҡытлыÑа бикләүҙәрҙе йәшер',
'blocklist-addressblocks' => 'Ðйырым IP бикләүҙәрҙе йәшер',
+'blocklist-rangeblocks' => 'Диапазон бикләүҙәрен йәшер',
'blocklist-timestamp' => 'Ваҡыт',
'blocklist-target' => 'МаҡÑат',
'blocklist-expiry' => 'Тамамлана',
@@ -2302,6 +2349,7 @@ $1',
'unblocklink' => 'Тыйыуҙы кире алырға',
'change-blocklink' => 'блоклауҙы үҙгәртергә',
'contribslink' => 'индергән өлөш',
+'emaillink' => 'Ñлектрон хат ебәрергә',
'autoblocker' => 'Һеҙҙең IP адреÑÑ‹Ò“Ñ‹Ò™ [[User:$1|$1]] Ñңыраҡ ҡулланған Ð°Ð´Ñ€ÐµÑ Ð¼ÐµÐ½Ó™Ð½ тап килеүе арҡаһында бикләнде.
$1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'blocklogpage' => 'Блоклау Ñҙмалары',
@@ -2433,9 +2481,6 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'movepage-page-moved' => '$1 битенең иÑеме $2 тип үҙгәртелде.',
'movepage-page-unmoved' => '$1 битенең иÑеме $2 тип үҙгәртелә алмай.',
'movepage-max-pages' => '$1 {{PLURAL:$1|биттең}} иÑеме үҙгәртелде, бынан күберәк биттең иÑемен автоматик рәүештә үҙгәртеү мөмкин түгел.',
-'1movedto2' => '«[[$1]]» битенең Ñңы иÑеме «[[$2]]»',
-'1movedto2_redir' => '[[$1]] бите [[$2]] битенә йүнәлтеү буйынÑа күÑте',
-'move-redirect-suppressed' => 'йүнәлтеү тыйылды',
'movelogpage' => 'ИÑем үҙгәртеү Ñҙмалары',
'movelogpagetext' => 'Түбәндә — иÑемдәре үҙгәртелгән биттәр.',
'movesubpage' => '{{PLURAL:$1|кергән бит}}',
@@ -2447,7 +2492,7 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'delete_and_move_text' => '==Юйыу талап ителә==
[[:$1|«$1»]] иÑемле бит бар инде. ИÑем үҙгәртеүҙе дауам итеү Ó©Ñөн, уны юйырға теләйһегеҙме?',
'delete_and_move_confirm' => 'Эйе, битте юйырға',
-'delete_and_move_reason' => 'ИÑем үҙгәртеүҙе дауам итеү Ó©Ñөн юйылды',
+'delete_and_move_reason' => 'ИÑем үҙгәртеүҙе дауам итеү Ó©Ñөн юйылды «[[$1]]»',
'selfmove' => 'Хәҙерге һәм Ñңы иÑемдәр тап килә. ИÑем үҙгәртеү мөмкин түгел.',
'immobile-source-namespace' => '"$1" иÑемдәр арауығындағы биттәрҙең иÑемен үҙгәртеү мөмкин түгел.',
'immobile-target-namespace' => 'Биттәрҙе "$1" иÑемдәр арауығына күÑереү мөмкин түгел.',
@@ -2475,8 +2520,10 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
Биттәрҙе Ñығарыу Ó©Ñөн, түбәндәге мөхәррирләү формаһына бер юлға бер бит иÑеме керетегеҙ һәм биттең хәҙерге өлгөһө менән бергә бөтә Ñлекке өлгөләрҙе һәм үҙгәртеү тарихын Ñығарырға теләйһегеҙме, әллә хәҙерге өлгөһөн һәм һуңғы үҙгәртеү тураһында мәғлүмәтте Ñығарырға теләйһегеҙме икәнен һайлағыҙ.
Һуңғы оÑраҡта һеҙ шулай уҡ һылтанма ҡуллана алаһығыҙ, мәҫәлән, [[{{MediaWiki:Mainpage}}]] бите Ó©Ñөн [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] һылтанмаһын ҡулланырға мөмкин.',
+'exportall' => 'Бөтә биттәрҙе лә ÑкÑпортлау',
'exportcuronly' => 'Хәҙерге өлгөнө генә индерергә, үҙгәртеүҙәр тарихын индермәҫкә',
'exportnohistory' => "'''Иҫкәрмә:''' биттәрҙең тулы үҙгәртеү тарихын Ñығарыу етештереүÑәнлек ҡыйынлыҡтары арҡаһында һүндерелгән.",
+'exportlistauthors' => 'Һәр бер бит Ó©Ñөн өлөш кереткәндәр иÑемлеген ҡушырға',
'export-submit' => 'Сығарырға',
'export-addcattext' => 'Ошо категориÑнан биттәрҙе өҫтәргә:',
'export-addcat' => 'Өҫтәргә',
@@ -2509,6 +2556,8 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'thumbnail_error' => 'Шартлы Ñ€Ó™Ñем булдырыу хатаһы: $1',
'djvu_page_error' => 'DjVu битенең һаны биттәр һанынан ашҡан',
'djvu_no_xml' => 'DjVu файлы Ó©Ñөн XML Ñығарып булмай',
+'thumbnail-temp-create' => 'ЭÑкиздың ваҡытлыÑа файлын Ñһап булмай',
+'thumbnail-dest-create' => 'МаҡÑат урында ÑÑкизды һаҡлап булмай',
'thumbnail_invalid_params' => 'Шартлы Ñ€Ó™Ñем шарттары дөрөҫ түгел',
'thumbnail_dest_directory' => 'Кәрәкле директориÑны булдырып булмай',
'thumbnail_image-type' => 'Был Ñ€Ó™Ñем Ñ‚Ó©Ñ€Ó© ҡулланылмай',
@@ -2556,6 +2605,9 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'import-token-mismatch' => 'СеÑÑÐ¸Ñ Ð¼Ó™Ò“Ð»Ò¯Ð¼Ó™Ñ‚Ñ‚Ó™Ñ€Ðµ юғалған.
Зинһар, тағы ҡабатлап ҡарағыҙ.',
'import-invalid-interwiki' => 'Күрһәтелгән вики проекттан тейәү мөмкин түгел.',
+'import-error-edit' => '«$1» битен импортлап булманы, Ñөнки һеҙгә ул битте мөхәррирләү тыйылған.',
+'import-error-create' => '«$1» битен импортлап булманы, Ñөнки һеҙгә ул битте Ñһау тыйылған.',
+'import-error-invalid' => '"$1" бите Ñраҡһыҙ иÑеме Ó©Ñөн импортланманы.',
# Import log
'importlogpage' => 'Тейәү Ñҙмалары журналы',
@@ -2565,73 +2617,84 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'import-logentry-interwiki' => '$1 битен вики проекттары-ара тейәгән',
'import-logentry-interwiki-detail' => '$2 өлгөнән $1 {{PLURAL:$1|өлгө|өлгө}}',
+# JavaScriptTest
+'javascripttest' => '
+JavaScript тикшереү',
+'javascripttest-disabled' => 'Был мөмкинлек һүндерелгән.',
+'javascripttest-title' => '$1 тикшеренеү үткәрелә',
+'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү Ó©Ñөн резервланған.',
+'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
+'javascripttest-pagetext-frameworks' => 'Зинһар Ó©Ñөн киләһе тикшеренеүҙәр мөхитнамәһенең береһен һайлап алығыҙ: $1',
+'javascripttest-qunit-intro' => 'mediawiki.org адреÑÑ‹ буйынÑа ҡарағыҙ [$1 теÑÑ‚ үткәреү документациÑһы].',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'ҠулланыуÑÑ‹ битегеҙ',
-'tooltip-pt-anonuserpage' => 'IP адреÑÑ‹Ò“Ñ‹Ò™ Ó©Ñөн ҡатнашыуÑÑ‹ бите',
-'tooltip-pt-mytalk' => 'Фекер алышыу битегеҙ',
-'tooltip-pt-anontalk' => 'IP адреÑÑ‹Ò“Ñ‹Ò™ Ó©Ñөн фекер алышыу бите',
-'tooltip-pt-preferences' => 'Көйләүҙәрегеҙ',
-'tooltip-pt-watchlist' => 'Һеҙ күҙәткән биттәр иÑемлеге',
-'tooltip-pt-mycontris' => 'Кереткән өлөшөгөҙ',
-'tooltip-pt-login' => 'Бында теркәлеү үтергә була, әммә был Ñш мәжбүри түгел.',
-'tooltip-pt-anonlogin' => 'Бында танылыу үтергә була, әммә был Ñш мәжбүри түгел.',
-'tooltip-pt-logout' => 'Сығырға',
-'tooltip-ca-talk' => 'Биттең ÑÑтәлеге тураһында фекер алышыу',
-'tooltip-ca-edit' => 'Һеҙ был битте үҙгәртә алаһығыҙ. Зинһар, Ñҙып ҡуйыр алдынан ҡарап ÑÑ‹Ò“Ñ‹Ò“Ñ‹Ò™',
-'tooltip-ca-addsection' => 'Яңы бүлек Ñшләргә',
-'tooltip-ca-viewsource' => 'Был бит үҙгәртеүҙән һаҡланған.
+'tooltip-pt-userpage' => 'ҠулланыуÑÑ‹ битегеҙ',
+'tooltip-pt-anonuserpage' => 'IP адреÑÑ‹Ò“Ñ‹Ò™ Ó©Ñөн ҡатнашыуÑÑ‹ бите',
+'tooltip-pt-mytalk' => 'Фекер алышыу битегеҙ',
+'tooltip-pt-anontalk' => 'IP адреÑÑ‹Ò“Ñ‹Ò™ Ó©Ñөн фекер алышыу бите',
+'tooltip-pt-preferences' => 'Көйләүҙәрегеҙ',
+'tooltip-pt-watchlist' => 'Һеҙ күҙәткән биттәр иÑемлеге',
+'tooltip-pt-mycontris' => 'Кереткән өлөшөгөҙ',
+'tooltip-pt-login' => 'Бында теркәлеү үтергә була, әммә был Ñш мәжбүри түгел.',
+'tooltip-pt-anonlogin' => 'Бында танылыу үтергә була, әммә был Ñш мәжбүри түгел.',
+'tooltip-pt-logout' => 'Сығырға',
+'tooltip-ca-talk' => 'Биттең ÑÑтәлеге тураһында фекер алышыу',
+'tooltip-ca-edit' => 'Һеҙ был битте үҙгәртә алаһығыҙ. Зинһар, Ñҙып ҡуйыр алдынан ҡарап ÑÑ‹Ò“Ñ‹Ò“Ñ‹Ò™',
+'tooltip-ca-addsection' => 'Яңы бүлек Ñшләргә',
+'tooltip-ca-viewsource' => 'Был бит үҙгәртеүҙән һаҡланған.
Тик Ñығанаҡ текÑтын ғына ҡарай һәм күÑереп ала алаһығыҙ.',
-'tooltip-ca-history' => 'Биттең төҙәтеүҙәр иÑемлеге',
-'tooltip-ca-protect' => 'Был битте һаҡларға',
-'tooltip-ca-unprotect' => 'Был биттең һаҡлауын үҙгәртергә',
-'tooltip-ca-delete' => 'Был битте юйырға',
-'tooltip-ca-undelete' => 'Юйыр алдынан биттә башҡарылған үҙгәртеүҙәрҙе тергеҙергә',
-'tooltip-ca-move' => 'Битте күÑерергә',
-'tooltip-ca-watch' => 'Был битте күҙәтеү иÑемлегенә өҫтәргә',
-'tooltip-ca-unwatch' => 'Был битте күҙәтеү иÑемлегемдән Ñығарырға',
-'tooltip-search' => 'Эҙләргә {{SITENAME}}',
-'tooltip-search-go' => 'ÐÓ™Ò¡ ошондай иÑеме булған биткә күÑергә',
-'tooltip-search-fulltext' => 'Ошондай ÑÑтәлекле биттәрҙе табырға',
-'tooltip-p-logo' => 'Баш биткә күÑергә',
-'tooltip-n-mainpage' => 'Баш биткә күÑергә',
-'tooltip-n-mainpage-description' => 'Баш биткә күÑеү',
-'tooltip-n-portal' => 'Проект буйынÑа һеҙ нимә Ñшләй алаһығыҙ һәм ҡайҙа нимә барлығы тураһында белешмә',
-'tooltip-n-currentevents' => 'Ðғымдағы ваҡиғалар иÑемлеге',
-'tooltip-n-recentchanges' => 'Һуңғы үҙгәртеүҙәр иÑемлеге',
-'tooltip-n-randompage' => 'ОÑраҡлы битте ҡарарға',
-'tooltip-n-help' => '«{{SITENAME}}» буйынÑа белешмә',
-'tooltip-t-whatlinkshere' => 'Был биткә һылтанған барлык биттәрҙең иÑемлеге',
-'tooltip-t-recentchangeslinked' => 'Был биттән һылтанған биттәрҙә һуңғы үҙгәртеүҙәр',
-'tooltip-feed-rss' => 'Был бит Ó©Ñөн RSS-таҫма',
-'tooltip-feed-atom' => 'Был бит Ó©Ñөн Atom-таҫма',
-'tooltip-t-contributions' => 'Был ҡулланыуÑының кереткән өлөшөн ҡарарға',
-'tooltip-t-emailuser' => 'Был ҡулланыуÑыға хат ебәрергә',
-'tooltip-t-upload' => 'РәÑем йәки тауыш ÑÑтәлекле файлдарҙы тейәргә',
-'tooltip-t-specialpages' => 'Барлыҡ махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€ иÑемлеге',
-'tooltip-t-print' => 'Был биттең ҡағыҙға баҫыу өлгөһө',
-'tooltip-t-permalink' => 'Биттең был өлгөһөнә даими һылтанма',
-'tooltip-ca-nstab-main' => 'Мәҡәләнең ÑÑтәлеге',
-'tooltip-ca-nstab-user' => 'ҠулланыуÑының шәхÑи бите',
-'tooltip-ca-nstab-media' => 'Медиа-файл бите',
-'tooltip-ca-nstab-special' => 'Был махÑÑƒÑ Ð±Ð¸Ñ‚, уны үҙгәртеп булмай',
-'tooltip-ca-nstab-project' => 'Проект битен күрһәт',
-'tooltip-ca-nstab-image' => 'Файл бите',
-'tooltip-ca-nstab-mediawiki' => 'СиÑтема хәбәре бите',
-'tooltip-ca-nstab-template' => 'Ҡалып бите',
-'tooltip-ca-nstab-help' => 'Ярҙам бите',
-'tooltip-ca-nstab-category' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð±Ð¸Ñ‚Ðµ',
-'tooltip-minoredit' => 'ТекÑÑ‚ Ó™Ò™ үҙгәртелгән тип билдәләргә',
-'tooltip-save' => 'Үҙгәртеүҙәрҙе һаҡларға',
-'tooltip-preview' => 'Ðлдан байҡау, һаҡлауҙан алда уны ҡулланып үҙгәртеүҙәрегеҙҙе ҡарап ÑÑ‹Ò“Ñ‹Ò“Ñ‹Ò™!',
-'tooltip-diff' => 'Сығанаҡ текÑтҡа ҡарата Ñшләгән үҙгәртеүҙәрҙе күрһәтергә.',
-'tooltip-compareselectedversions' => 'Был биттең һайланған ике өлгөһө араһындағы айырманы ҡарарға',
-'tooltip-watch' => 'Битте күҙәтеү иÑемлегемә өҫтәргә',
-'tooltip-recreate' => 'Битте юйылған булыуына ҡарамаҫтан тергеҙергә',
-'tooltip-upload' => 'КүÑерә башларға',
-'tooltip-rollback' => 'Бер баҫыу менән аҙаҡҡы мөхәррирләүÑенең үҙгәртеүҙәрен кире ала.',
-'tooltip-undo' => '"Кире ал" төҙәтеүҙе кире ала һәм төҙәтеү формаһын "алдан байҡау"ҙа күрһәтә. Һәм кире алыуҙың Ñәбәбен белдерергә була.',
-'tooltip-preferences-save' => 'Көйләүҙәрҙе һаҡларға',
-'tooltip-summary' => 'ҠыҫҡаÑа таÑуирлама керетегеҙ',
+'tooltip-ca-history' => 'Биттең төҙәтеүҙәр иÑемлеге',
+'tooltip-ca-protect' => 'Был битте һаҡларға',
+'tooltip-ca-unprotect' => 'Был биттең һаҡлауын үҙгәртергә',
+'tooltip-ca-delete' => 'Был битте юйырға',
+'tooltip-ca-undelete' => 'Юйыр алдынан биттә башҡарылған үҙгәртеүҙәрҙе тергеҙергә',
+'tooltip-ca-move' => 'Битте күÑерергә',
+'tooltip-ca-watch' => 'Был битте күҙәтеү иÑемлегенә өҫтәргә',
+'tooltip-ca-unwatch' => 'Был битте күҙәтеү иÑемлегемдән Ñығарырға',
+'tooltip-search' => 'Эҙләргә {{SITENAME}}',
+'tooltip-search-go' => 'ÐÓ™Ò¡ ошондай иÑеме булған биткә күÑергә',
+'tooltip-search-fulltext' => 'Ошондай ÑÑтәлекле биттәрҙе табырға',
+'tooltip-p-logo' => 'Баш биткә күÑергә',
+'tooltip-n-mainpage' => 'Баш биткә күÑергә',
+'tooltip-n-mainpage-description' => 'Баш биткә күÑеү',
+'tooltip-n-portal' => 'Проект буйынÑа һеҙ нимә Ñшләй алаһығыҙ һәм ҡайҙа нимә барлығы тураһында белешмә',
+'tooltip-n-currentevents' => 'Ðғымдағы ваҡиғалар иÑемлеге',
+'tooltip-n-recentchanges' => 'Һуңғы үҙгәртеүҙәр иÑемлеге',
+'tooltip-n-randompage' => 'ОÑраҡлы битте ҡарарға',
+'tooltip-n-help' => '«{{SITENAME}}» буйынÑа белешмә',
+'tooltip-t-whatlinkshere' => 'Был биткә һылтанған барлык биттәрҙең иÑемлеге',
+'tooltip-t-recentchangeslinked' => 'Был биттән һылтанған биттәрҙә һуңғы үҙгәртеүҙәр',
+'tooltip-feed-rss' => 'Был бит Ó©Ñөн RSS-таҫма',
+'tooltip-feed-atom' => 'Был бит Ó©Ñөн Atom-таҫма',
+'tooltip-t-contributions' => 'Был ҡулланыуÑының кереткән өлөшөн ҡарарға',
+'tooltip-t-emailuser' => 'Был ҡулланыуÑыға хат ебәрергә',
+'tooltip-t-upload' => 'РәÑем йәки тауыш ÑÑтәлекле файлдарҙы тейәргә',
+'tooltip-t-specialpages' => 'Барлыҡ махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€ иÑемлеге',
+'tooltip-t-print' => 'Был биттең ҡағыҙға баҫыу өлгөһө',
+'tooltip-t-permalink' => 'Биттең был өлгөһөнә даими һылтанма',
+'tooltip-ca-nstab-main' => 'Мәҡәләнең ÑÑтәлеге',
+'tooltip-ca-nstab-user' => 'ҠулланыуÑының шәхÑи бите',
+'tooltip-ca-nstab-media' => 'Медиа-файл бите',
+'tooltip-ca-nstab-special' => 'Был махÑÑƒÑ Ð±Ð¸Ñ‚, уны үҙгәртеп булмай',
+'tooltip-ca-nstab-project' => 'Проект битен күрһәт',
+'tooltip-ca-nstab-image' => 'Файл бите',
+'tooltip-ca-nstab-mediawiki' => 'СиÑтема хәбәре бите',
+'tooltip-ca-nstab-template' => 'Ҡалып бите',
+'tooltip-ca-nstab-help' => 'Ярҙам бите',
+'tooltip-ca-nstab-category' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð±Ð¸Ñ‚Ðµ',
+'tooltip-minoredit' => 'ТекÑÑ‚ Ó™Ò™ үҙгәртелгән тип билдәләргә',
+'tooltip-save' => 'Үҙгәртеүҙәрҙе һаҡларға',
+'tooltip-preview' => 'Ðлдан байҡау, һаҡлауҙан алда уны ҡулланып үҙгәртеүҙәрегеҙҙе ҡарап ÑÑ‹Ò“Ñ‹Ò“Ñ‹Ò™!',
+'tooltip-diff' => 'Сығанаҡ текÑтҡа ҡарата Ñшләгән үҙгәртеүҙәрҙе күрһәтергә.',
+'tooltip-compareselectedversions' => 'Был биттең һайланған ике өлгөһө араһындағы айырманы ҡарарға',
+'tooltip-watch' => 'Битте күҙәтеү иÑемлегемә өҫтәргә',
+'tooltip-watchlistedit-raw-submit' => 'Күҙәтеү иÑемлеген Ñңыртырға',
+'tooltip-recreate' => 'Битте юйылған булыуына ҡарамаҫтан тергеҙергә',
+'tooltip-upload' => 'КүÑерә башларға',
+'tooltip-rollback' => 'Бер баҫыу менән аҙаҡҡы мөхәррирләүÑенең үҙгәртеүҙәрен кире ала.',
+'tooltip-undo' => '"Кире ал" төҙәтеүҙе кире ала һәм төҙәтеү формаһын "алдан байҡау"ҙа күрһәтә. Һәм кире алыуҙың Ñәбәбен белдерергә була.',
+'tooltip-preferences-save' => 'Көйләүҙәрҙе һаҡларға',
+'tooltip-summary' => 'ҠыҫҡаÑа таÑуирлама керетегеҙ',
# Metadata
'notacceptable' => 'Вики-Ñервер мәғлүмәтте һеҙҙең браузер уҡый алырлыҡ форматта ҡайтара алмай.<br />
@@ -2694,9 +2757,6 @@ The wiki server cannot provide data in a format your client can read.',
# Patrol log
'patrol-log-page' => 'Тикшереү Ñҙмалары журналы',
'patrol-log-header' => 'Был — тикшерелгән өлгөләр Ñҙмалары журналы.',
-'patrol-log-line' => '$2 битенең $1 тикшерелгән тип билдәләгән $3',
-'patrol-log-auto' => '(автоматик рәүештә)',
-'patrol-log-diff' => '$1 өлгөһөн',
'log-show-hide-patrol' => 'тикшереү Ñҙмалары журналын $1',
# Image deletion
@@ -2715,23 +2775,25 @@ $1',
'nextdiff' => 'Киләһе үҙгәртеү →',
# Media information
-'mediawarning' => "'''Иғтибар''': был Ñ‚Ó©Ñ€ файлда зыÑн килтереүÑе программа коды булыуы мөмкин.
+'mediawarning' => "'''Иғтибар''': был Ñ‚Ó©Ñ€ файлда зыÑн килтереүÑе программа коды булыуы мөмкин.
Уны башҡарған Ñаҡта һеҙҙең ÑиÑтемағыҙға хәүеф Ñнауы мөмкин.",
-'imagemaxsize' => "РәÑем дәүмәле Ó©Ñөн Ñик: <br />''(файл таÑуирламаһы биттәре Ó©Ñөн)''",
-'thumbsize' => 'Шартлы Ñ€Ó™Ñем дәүмәле:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|бит}}',
-'file-info' => 'файлдың дәүмәле: $1, MIME төрө: $2',
-'file-info-size' => '$1 × $2 нөктә, файлдың дәүмәле: $3, MIME төрө: $4',
-'file-info-size-pages' => '$1 × $2 пикÑель, файл күләме: $3, MIME Ñ‚Ó©Ñ€: $4, $5 {{PLURAL:$5|бит}}',
-'file-nohires' => '<small>Юғары аÑыҡлыҡтағы өлгө ÑŽÒ¡.</small>',
-'svg-long-desc' => 'SVG файлы, номиналь $1 × $2 нөктә, файлдың дәүмәле: $3',
-'show-big-image' => 'Тулы аÑыҡлыҡ',
-'show-big-image-size' => '$1 × $2 пикÑель',
-'file-info-gif-looped' => 'әйләнешле',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм}}',
-'file-info-png-looped' => 'әйләнешле',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|тапҡыр}} уйнала',
-'file-info-png-frames' => '$1 {{PLURAL:$1|фрейм}}',
+'imagemaxsize' => "РәÑем дәүмәле Ó©Ñөн Ñик: <br />''(файл таÑуирламаһы биттәре Ó©Ñөн)''",
+'thumbsize' => 'Шартлы Ñ€Ó™Ñем дәүмәле:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|бит}}',
+'file-info' => 'файлдың дәүмәле: $1, MIME төрө: $2',
+'file-info-size' => '$1 × $2 нөктә, файлдың дәүмәле: $3, MIME төрө: $4',
+'file-info-size-pages' => '$1 × $2 пикÑель, файл күләме: $3, MIME Ñ‚Ó©Ñ€: $4, $5 {{PLURAL:$5|бит}}',
+'file-nohires' => 'Юғары аÑыҡлыҡтағы өлгө ÑŽÒ¡.',
+'svg-long-desc' => 'SVG файлы, номиналь $1 × $2 нөктә, файлдың дәүмәле: $3',
+'show-big-image' => 'Тулы аÑыҡлыҡ',
+'show-big-image-preview' => 'Байҡау ваҡытындағы күләм: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Башҡа ÑиÑелеш|Башҡа ÑиÑелештәр}}: $1.',
+'show-big-image-size' => '$1 × $2 пикÑель',
+'file-info-gif-looped' => 'әйләнешле',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм}}',
+'file-info-png-looped' => 'әйләнешле',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|тапҡыр}} уйнала',
+'file-info-png-frames' => '$1 {{PLURAL:$1|фрейм}}',
# Special:NewFiles
'newimages' => 'Яңы файлдар йыйылмаһы',
@@ -2745,6 +2807,13 @@ $1',
'bydate' => 'булдырыу көнө буйынÑа',
'sp-newimages-showfrom' => '$1 $2 ваҡытынан башлап Ñңы файлдарҙы күрһәтергә',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Ñекунд|$1 Ñекунд}}',
+'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 Ñәғәт|$1 Ñәғәт}}',
+'days' => '{{PLURAL:$1|$1 көн|$1 көн}}',
+'ago' => '$1 Ñлек',
+
# Bad image list
'bad_image_list' => 'Формат киләһе рәүештә булырға тейеш:
@@ -3243,13 +3312,6 @@ $5
'scarytranscludefailed' => '[$1 ҡалыбына мөрәжәғәт итеү хатаһы]',
'scarytranscludetoolong' => '[URL Ð°Ð´Ñ€ÐµÑ Ð±Ð¸Ð³ÐµÑ€Ó™Ðº оҙон]',
-# Trackbacks
-'trackbackbox' => 'Был мәҡәлә Ó©Ñөн Trackback:<br />
-$1',
-'trackbackremove' => '([$1 Юйырға])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback уңышлы юйылды.',
-
# Delete conflict
'deletedwhileediting' => "'''Иғтибар''': Был бит һеҙ мөхәррирләй башлар алдынан юйылған ине!",
'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|фекер алышыу]]) был битте һеҙ мөхәррирләй башлағандан һуң юйған, Ñәбәбе:
@@ -3331,6 +3393,9 @@ $1',
'watchlisttools-edit' => 'Күҙәтеү иÑемлеген ҡарарға/төҙәтергә',
'watchlisttools-raw' => 'ТекÑÑ‚ һымаҡ үҙгәртеү',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|фекер алышыу]])',
+
# Core parser functions
'unknown_extension_tag' => 'Билдәһеҙ "$1" киңәйтеү тегы',
'duplicate-defaultsort' => '\'\'\'Иҫкәртеү:\'\'\' "$2" ғәҙәттәге тәпртипкә килтереү аÑÒ¡Ñ‹ÑÑ‹ Ñлекке "$1" ғәҙәттәге тәртипкә килтереү аÑÒ¡Ñ‹Ñын үҙгәртә.',
@@ -3386,7 +3451,8 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'specialpages' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€',
'specialpages-note' => '----
* Ябай махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€.
-* <strong class="mw-specialpagerestricted">Сикләнгән махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€.</strong>',
+* <span class="mw-specialpagerestricted">Сикле махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€.</span>
+* <span class="mw-specialpagecached">Кешланған махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€ (иҫкергән булыуы мөмкин).</span>',
'specialpages-group-maintenance' => 'Техник хеҙмәтләндереү хиÑапламалары',
'specialpages-group-other' => 'Башҡа махÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€',
'specialpages-group-login' => 'Танышыу йәки теркәлеү',
@@ -3428,13 +3494,16 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'tags-hitcount' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
# Special:ComparePages
-'comparepages' => 'Биттәрҙе Ñағыштырыу',
-'compare-selector' => 'Биттәрҙең өлгөләрен Ñағыштырыу',
-'compare-page1' => 'БеренÑе бит',
-'compare-page2' => 'ИкенÑе бит',
-'compare-rev1' => 'БеренÑе өлгө',
-'compare-rev2' => 'ИкенÑе өлгө',
-'compare-submit' => 'Сағыштырырға',
+'comparepages' => 'Биттәрҙе Ñағыштырыу',
+'compare-selector' => 'Биттәрҙең өлгөләрен Ñағыштырыу',
+'compare-page1' => 'БеренÑе бит',
+'compare-page2' => 'ИкенÑе бит',
+'compare-rev1' => 'БеренÑе өлгө',
+'compare-rev2' => 'ИкенÑе өлгө',
+'compare-submit' => 'Сағыштырырға',
+'compare-invalid-title' => 'Керетелгән иÑем дөрөҫ түгел.',
+'compare-title-not-exists' => 'Һеҙ күрһәткән иÑем ÑŽÒ¡.',
+'compare-revision-not-exists' => 'Һеҙ күрһәткән верÑÐ¸Ñ ÑŽÒ¡.',
# Database error messages
'dberr-header' => 'Был вики проектта ҡыйынлыҡтар бар',
@@ -3462,4 +3531,72 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'sqlite-has-fts' => '$1, тулы текÑÑ‚ буйынÑа Ñҙләү мөмкинлеге менән',
'sqlite-no-fts' => '$1, тулы текÑÑ‚ буйынÑа Ñҙләү мөмкинлекһеҙ',
+# New logging system
+'logentry-delete-delete' => '$1 $3 битен юйҙы',
+'logentry-delete-restore' => '$1 $3 битен тергеҙҙе',
+'logentry-delete-event' => '$1 {{PLURAL:$5|$5 журнал Ñҙмаһының|$5 журнал Ñҙмаһының}} күренеүÑәнлеген $3 битендә үҙгәртте: $4',
+'logentry-delete-revision' => '$1 {{PLURAL:$5|$5 верÑиÑның|$5 верÑиÑның}} күренеүÑәнлеген $3 битендә үҙгәртте: $4',
+'logentry-delete-event-legacy' => '$1 $3 журнал Ñҙмаһының күренеүÑәнлеген үҙгәртте',
+'logentry-delete-revision-legacy' => '$1 $3 битендә верÑиÑларҙың күренеүÑәнлеген үҙгәртте',
+'logentry-suppress-delete' => '$1 $3 битен йәшерҙе',
+'logentry-suppress-event' => '$1 {{PLURAL:$5|$5 журнал Ñҙмаһының|$5 журнал Ñҙмаһының}} күренеүÑәнлеген $3 битендә йәшерен үҙгәртте: $4',
+'logentry-suppress-revision' => '$1 {{PLURAL:$5|$5 верÑиÑның|$5 верÑиÑның}} күренеүÑәнлеген $3 битендә йәшерен үҙгәртте: $4',
+'logentry-suppress-event-legacy' => '$1 $3 журнал Ñҙмаһының күренеүÑәнлеген йәшерен үҙгәртте',
+'logentry-suppress-revision-legacy' => '$1 $3 битендә верÑиÑларҙың күренеүÑәнлеген йәшерен үҙгәртте',
+'revdelete-content-hid' => 'ÑÑтәлек йәшерелгән',
+'revdelete-summary-hid' => 'төҙәтеү аңлатмаһы йәшерелде',
+'revdelete-uname-hid' => 'ҡатнашыуÑÑ‹ иÑеме йәшерелгән',
+'revdelete-content-unhid' => 'ÑÑтәлек күрһәтелде',
+'revdelete-summary-unhid' => 'төҙәтеү аңлатмаһы аÑылды',
+'revdelete-uname-unhid' => 'ҡатнашыуÑÑ‹ иÑеме күрһәтелде',
+'revdelete-restricted' => 'хәкимдәргә ҡаршы ҡулланылған Ñикләүҙәр',
+'revdelete-unrestricted' => 'хәкимдәрҙән алынған Ñикләүҙәр',
+'logentry-move-move' => '$1 $3 битенең иÑемен үҙгәртте. Яңы иÑеме: $4',
+'logentry-move-move-noredirect' => '$1 $3 битенең иÑемен йүнәлтеү ҡуймайынÑа үҙгәртте. Яңы иÑеме: $4',
+'logentry-move-move_redir' => '$1 $3 битенең иÑемен йүнәлтеү өҫтөнән үҙгәртте. Яңы иÑеме: $4',
+'logentry-move-move_redir-noredirect' => '$1 $3 битенең иÑемен йүнәлтеү ҡуймайынÑа һәм йүнәлтеү өҫтөнән үҙгәртте. Яңы иÑеме: $4',
+'logentry-patrol-patrol' => '$1 $3 битенең $4 верÑиÑһын билдәләне.',
+'logentry-patrol-patrol-auto' => '$1 $3 битенең $4 верÑиÑһын автоматик рәүештә билдәләне.',
+'logentry-newusers-newusers' => '$1 ҡулланыуÑының иҫәп Ñҙыуын булдырҙы',
+'logentry-newusers-create' => '$1 ҡулланыуÑының иҫәп Ñҙыуын булдырҙы',
+'logentry-newusers-create2' => '$1 ҡулланыуÑÑ‹ иҫәп Ñҙыуын Ñһаны $3',
+'logentry-newusers-autocreate' => 'Ðвтоматик рәүештә $1 иҫәп Ñҙыуы Ñһалды',
+'newuserlog-byemail' => 'пароль Ñлектрон почта адреÑÑ‹ аша ебәрелде',
+
+# Feedback
+'feedback-bugornote' => 'Әгәр Һеҙ техник проблеманы ентекле рәүештә аңлатырға теләһәгеҙ, зинһар, [$1 хата тураһында белдерегеҙ].
+Башҡа оÑраҡта, ошо Ñбай форманы ҡуллана алаһығыҙ. Комментарийығыҙ «[$3 $2]» битенә ҡулланыуÑÑ‹ иÑемегеҙ һәм браузер мәғлүмәте менән өҫтәләÑәк.',
+'feedback-subject' => 'Тема:',
+'feedback-message' => 'Хәбәр:',
+'feedback-cancel' => 'Кире алырға',
+'feedback-submit' => 'Кире белдереү ебәрергә',
+'feedback-adding' => 'Биткә кире белдереү өҫтәлә',
+'feedback-error1' => 'Хата: API-нан беленмәгән хата',
+'feedback-error2' => 'Хата: Мөхәррирләү хатаһы',
+'feedback-error3' => 'Хата: API-нан Ñуап ÑŽÒ¡',
+'feedback-thanks' => 'Рәхмәт! Һеҙҙең фекерегеҙ «[$2 $1]» битенә өҫтәлде.',
+'feedback-close' => 'Әҙер',
+'feedback-bugcheck' => 'Шәп! Тик [$1 билдәле хаталар] иÑемлегендә оҡшаш белдереүҙең булмауына иғтибар итегеҙ.',
+'feedback-bugnew' => 'Тикшерҙем. Яңы хата тураһында белдерергә',
+
+# API errors
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|файлы|файлдары}} дубликаты.',
+'api-error-empty-file' => 'Һеҙ ебәргән файл буш.',
+'api-error-emptypage' => 'Яңы буш биттәр Ñһау тыйыла.',
+'api-error-file-too-large' => 'Һеҙ ебәргән файл үтә ҙур.',
+'api-error-filename-tooshort' => 'Файл иÑеме бик ҡыҫҡа.',
+'api-error-filetype-banned' => 'Был файл төрө тыйылған.',
+'api-error-http' => 'ЭÑке хата: Ñерверға бәйләнеп булмай.',
+'api-error-illegal-filename' => 'РөхÑәт ителмәгән файл иÑеме.',
+'api-error-mustbeloggedin' => 'Файлдарҙы йөкмәтеү Ó©Ñөн һеҙ ÑиÑемаға танышырға тейешһегеҙ.',
+'api-error-nomodule' => 'ЭÑке хата: тейәү модуле көйләнмәгән.',
+'api-error-ok-but-empty' => 'ЭÑке хата: Ñерверҙан Ñуап ÑŽÒ¡.',
+'api-error-overwrite' => 'Булған файлды алыштырыу Ñ€Ó©Ñ…Ñәт ителмәй.',
+'api-error-timeout' => 'Көтөлгән ваҡыт ÑÑендә Ñервер Ñуып бирмәне.',
+'api-error-unclassified' => 'Билдәһеҙ хата барлыҡҡа килде.',
+'api-error-unknown-code' => 'Билдәһеҙ хата: «$1»',
+'api-error-unknown-warning' => 'Билдәһеҙ белдереү: "$1".',
+'api-error-unknownerror' => 'Билдәһеҙ хата: «$1»',
+'api-error-uploaddisabled' => 'Был викила файл тейәү мөмкинлеге Ñбылған.',
+
);
diff --git a/languages/messages/MessagesBar.php b/languages/messages/MessagesBar.php
index 889ed5e5..90be2922 100644
--- a/languages/messages/MessagesBar.php
+++ b/languages/messages/MessagesBar.php
@@ -376,21 +376,23 @@ Fois dés néd zuadrifft, host eventuö an Feeler in da Software gfunden. Bittsc
'badarticleerror' => 'Dé Akzión kå néd auf dé Seiten ågwendt wern.',
'cannotdelete' => 'Dé Seiten óder Daatei "$1" kå néd gléschd wern.
Méglicherweis iss schoh vohram åndern gléschd worn.',
+'cannotdelete-title' => 'Seiten „$1“ kå néd gléschd wern',
'badtitle' => 'néd gütiger Titel',
'badtitletext' => 'Da Titel voh da ågforderden Seiten is néd gütig, laar óder a ungütiger Sproochlink vohram åndern Wiki.',
-'perfcached' => "Dé fóigernden Daaten ståmmern aus 'm Cache und san méglicherweis nimmer aktuö:",
-'perfcachedts' => "Dé Daaten ståmmern aus 'm Cache, létzde Aktualisiarung: $2, $3 Uar",
+'perfcached' => "Dé fóigernden Daaten staummern aus'm Cache und san méglicherweis nimmer aktuö. Maximoi {{PLURAL:$1|oah Ergebnis is|$1 Ergebniss san}} im Cache vafiagbor.",
+'perfcachedts' => "Dé Daaten staummern aus 'm Cache. Da Zeidbunkt voh da létzden Aktualisiarung: $1. Maximoi {{PLURAL:$4|oah Ergebnis is|$4 Ergebniss san}} im Cache vafiagbor.",
'querypage-no-updates' => "'''Dé Aktualisiarungsfunkzión voh derer Seiten is derzeid deaktivird. Dé Daaten wern bis auf Weiders néd daneiert.'''",
'wrong_wfQuery_params' => 'Foische Parameeter fyr wfQuery()<br />
Funkzión: $1<br />
Obfrog: $2',
'viewsource' => 'an Quötext åschauh',
-'viewsourcefor' => 'fyr $1',
+'viewsource-title' => 'Quöntext voh da Seiten $1 auhschauh',
'actionthrottled' => 'Akziónszoi limitird',
'actionthrottledtext' => 'Im Råmen voh ner Anti-Spam-Moossnåm kå dé Akzión do in am kurzen Zeidobstånd netter begrenzd ausgfyrd wern. Dé Grenzen host ywerschritten.
Bittscheh vasuachs in a por Minunten nuamoi.',
'protectedpagetext' => "Dé Seiten is gschytzd worn, um Beorweitungen z' vahindern.",
'viewsourcetext' => "Du kåst ower 'n Quötext åschaung und kópirn:",
+'viewyourtext' => "Du kåst 'n Quejtext vah '''deiner Beorwatung''' derer Seiten betrochten und kópiern:",
'protectedinterface' => "Dé Seiten do enthoit Text fyr d' Benutzerówerflächen voh da Software und is gschytzd, um an Missbrauch vurzbeing.",
'editinginterface' => "'''Ówocht:''' Dé Seiten do enthoit voh da MediaWiki-Software gnutzden Text.
Änderrungen auf derer Seiten wirken sé auf d' Benutzerówerflächen aus.
@@ -507,7 +509,6 @@ Es muass sichergstöd seih, daas Cookies aktivierd san. Danoch bittscheh d' Seit
'summary-preview' => 'Vurschau vo da ZÃ¥mmfossung:',
'subject-preview' => 'Vurschau vom Bedreff:',
'blockedtitle' => 'Da Benytzer is gsperrt',
-'whitelistedittitle' => 'Zum Beorwaiten muasst de åmöiden',
'whitelistedittext' => "Du muasst de $1, um Saiten beorwaiten z' kenna.",
'loginreqtitle' => "'s braucht a Åmöidung",
'loginreqlink' => 'åmöiden',
@@ -634,16 +635,11 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
'revdelete-nooldid-title' => 'Koa Version ogem',
'revdelete-text' => "'''Der Inhalt oder andere Bestandteile gelöschter Versionen sind nicht mehr öffentlich einsehbar, erscheinen jedoch weiterhin als Einträge in der Versionsgeschichte.'''
{{SITENAME}}-Administratoren können den entfernten Inhalt oder andere entfernte Bestandteile weiterhin einsehen und wiederherstellen, es sei denn, es wurde festgelegt, dass die Zugangsbeschränkungen auch für Administratoren gelten.",
-'revdelete-logentry' => "hod d' Versiónsgschicht voh „[[$1]]“ gänderd",
'revdel-restore' => 'Siagborkeid ändern',
'revdel-restore-deleted' => 'gschléschde Versión',
'revdel-restore-visible' => 'siagbore Versión',
'pagehist' => 'Versiónsgschicht',
'deletedhist' => 'Gléschde Versiónen',
-'revdelete-content' => 'Seiteninhoid',
-'revdelete-summary' => 'ZÃ¥mmfossungskommentar',
-'revdelete-hid' => 'vastéck $1',
-'revdelete-log-message' => '$1 fyr $2 {{PLURAL:$2|Versión|Versiónen}}',
# Merge log
'revertmerge' => 'Vaoanigung zruckénemmer',
@@ -990,7 +986,7 @@ Links as Naumensraim wern do néd afglistt.",
'protectedpages-indef' => 'Netter néd bschränkde gschytzde Seiten zoang',
'protectedpages-cascade' => 'Netter Seiten mid Kaskadenschutz',
'protectedtitles' => 'Gschytzde Seitennaumen',
-'usercreated' => 'Erstöd am $1 um $2 Ur',
+'usercreated' => '{{GENDER:$3|Erstöd}} am $1 um $2 Uar',
'newpages' => 'Neiche Seiten',
'newpages-username' => 'Benutzernåm:',
'ancientpages' => 'Schoh länger nimmer beorweitade Seiten',
@@ -1050,10 +1046,7 @@ Links as Naumensraim wern do néd afglistt.",
'listusers-noresult' => 'Koane Benutzer gfunden.',
# Special:Log/newusers
-'newuserlogpage' => 'Neiåmödungs-Logbiaché',
-'newuserlog-create-entry' => 'Benutzer is neich registrierd',
-'newuserlog-create2-entry' => 'erstö a neichs Benutzerkóntó „$1“',
-'newuserlog-autocreate-entry' => 'A Benutzerkóntó is autómaatisch erstöd worn',
+'newuserlogpage' => 'Neiåmödungs-Logbiaché',
# Special:ListGroupRights
'listgrouprights' => 'Benutzergruppmrechtt',
@@ -1122,6 +1115,7 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
'watchmethod-list' => 'Ywerpriaffm voh da Beówochtungslisten auf létzde Beorwatungen',
'watchlistcontains' => 'Deih Beówochtungslisten enthoitt $1 {{PLURAL:$1|Seiten|Seiten}}.',
'iteminvalidname' => 'Próblém mim Eihtrog „$1“, néd gütiger Naum.',
+'wlnote' => "Es {{PLURAL:$1|fóigt d' létzde Änderrung|fóing d' létzden '''$1''' Änderrungen}} voh da/dé {{PLURAL:$2|Stund| '''$2''' Stunden}}. Staund: $3, $4 Uar.",
'wlshowlast' => 'Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder $3 (in dé létzden 30 Dog).',
'watchlist-options' => 'Åzoagópziónen',
@@ -1180,7 +1174,6 @@ Ryckmödungen und a weidre Hüf: {{canonicalurl:{{MediaWiki:Helppage}}}}',
'actioncomplete' => 'Akzión beéndt',
'actionfailed' => 'Akzión föögschlong',
'deletedtext' => '„$1“ is glöscht worn. Im $2 findn Sie a Listn vo de letzten Löschungen.',
-'deletedarticle' => 'hod „[[$1]]“ gléschd',
'dellogpage' => 'Lésch-Logbiache',
'deletionlog' => 'Lösch-Logbuach',
'reverted' => 'Auf a oide Version zruckgesetzt',
@@ -1239,7 +1232,6 @@ Da aktuöje Text voh da gléschden Seiten is netter fyr Administraatorn zuagäng
'undeletelink' => 'åschauh / wiaderherstön',
'undeleteviewlink' => 'Ã¥schaung',
'undeletereset' => 'Zrucksétzen',
-'undeletedarticle' => 'hod „[[$1]]“ wiederhergstöd',
'undeletedfiles' => '$1 {{plural:$1|Datei|Dateien}} san wieda hergstellt worn',
'undelete-search-box' => 'Suach noch gléschde Seiten',
'undelete-search-submit' => 'Suach',
@@ -1346,6 +1338,7 @@ Zur da Aufheewung vo da Sperrn schau unter da [[Special:BlockList|Listen vo olle
'unblocklink' => 'Freigeem',
'change-blocklink' => 'Sperr ändern',
'contribslink' => 'Beitrég',
+'emaillink' => 'E-Póst schicker',
'autoblocker' => 'Autómaatische Sperr, wei du a gmoahsaume IP-Adress mim [[User:$1|$1]] bnutzd. Grund voh da Benutzersperrn: „$2“.',
'blocklogpage' => 'Benutzersperrlogbiaché',
'blocklog-showlog' => "{{GENDER:$1|Der Benutzer|Dé Benutzerrin|Der Benutzer}} do is schoh friarer gsperrd worn. Es fóigt a Eihtrog aus'm Benutzersperrlogbiaché:",
@@ -1404,8 +1397,6 @@ Bittschee gib außadem druntn in '''neichn''' Nãm vu da Seitn ei und schreib ku
'talkexists' => "D' Seiten söwer is erfóigreich vaschóm worn, ower d' zuagherige Dischkrierseiten néd, weis mid dém Titel schoh oane gibt. Bittscheh kymmerd dé händisch ums zaummfyrn.",
'movedto' => 'vaschóm auf',
'movetalk' => "Waunns geet, d' Dischkrierseiten aa midvaschiam",
-'1movedto2' => 'håt [[$1]] nåch [[$2]] verschom',
-'1movedto2_redir' => 'hod [[$1]] noch [[$2]] vaschóm und dodabei a Weiderloattung ywerschriem',
'movelogpage' => 'Vaschiawungs-Logbiaché',
'movereason' => 'Grund:',
'revertmove' => 'zruck vaschiam',
@@ -1508,10 +1499,6 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
# Patrolling
'markedaspatrollederrortext' => 'Du muasst a Seitenänderrung auswön',
-# Patrol log
-'patrol-log-line' => 'markirde $1 voh „$2“ ois kontroilird $3',
-'patrol-log-diff' => 'Versión $1',
-
# Image deletion
'deletedrevision' => 'Oide Version $1 glöscht.',
'filedelete-missing' => 'De Datei „$1“ ko net glöscht wern, weils es net gibt.',
@@ -1522,7 +1509,7 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
# Media information
'file-info-size' => '$1 × $2 Pixel, Daateigreess: $3, MIME-Typ: $4',
-'file-nohires' => '<small>Es gibt koah heecherne Auflésung.</small>',
+'file-nohires' => 'Es gibt koah heecherne Auflésung.',
'svg-long-desc' => 'SVG-Datei, Basisgreß: $1 × $2 Pixl, Dateigreß: $3',
'show-big-image' => 'Versión in heecherner Auflésung',
@@ -1628,6 +1615,9 @@ Bittscheh d' noraale Vurschau bnutzen.",
'watchlisttools-edit' => 'normaal beorwaten',
'watchlisttools-raw' => 'Im Listenformaat beorwaten',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussión]])',
+
# Core parser functions
'unknown_extension_tag' => 'Unbekaunnter Extension-Tag „$1“',
'duplicate-defaultsort' => 'Ówocht: Da Sortiarungsschlyssel "$2" ywerschreibt dén vurher vawendten Schlyssel "$1".',
@@ -1667,7 +1657,7 @@ Bittscheh d' noraale Vurschau bnutzen.",
'specialpages-note' => '----
* Reguläre Speziaalseiten
* <span class="mw-specialpagerestricted">Zuagrifsbschränkde Speziaalseiten</span>
-* <span class="mw-specialpagecached">Cachegenerrirde Speziaalseiten</span>',
+* <span class="mw-specialpagecached">Cachegenerrirde Speziaalseiten (Da Inhoid is méglicherweis vaoiterd)</span>',
'specialpages-group-maintenance' => 'Wartungslisten',
'specialpages-group-other' => 'Ã…ndre Speziaalseiten',
'specialpages-group-login' => 'Åmöden',
@@ -1709,13 +1699,16 @@ Bittscheh d' noraale Vurschau bnutzen.",
'tags-hitcount' => '$1 {{PLURAL:$1|Änderrung|Änderrungen}}',
# Special:ComparePages
-'comparepages' => 'Seiten vagleichen',
-'compare-selector' => 'Seitenversiónen vagleichen',
-'compare-page1' => 'Seiten 1',
-'compare-page2' => 'Seiten 2',
-'compare-rev1' => 'Versión 1',
-'compare-rev2' => 'Versión 2',
-'compare-submit' => 'Vagleichen',
+'comparepages' => 'Seiten vagleichen',
+'compare-selector' => 'Seitenversiónen vagleichen',
+'compare-page1' => 'Seiten 1',
+'compare-page2' => 'Seiten 2',
+'compare-rev1' => 'Versión 1',
+'compare-rev2' => 'Versión 2',
+'compare-submit' => 'Vagleichen',
+'compare-invalid-title' => 'Da ågeewerne Seitennåm is néd gütig',
+'compare-title-not-exists' => 'Da ågeewerne Seitennåm is néd vurhånden',
+'compare-revision-not-exists' => 'Dé ågeewerne Versión is néd vurhånden',
# Database error messages
'dberr-header' => 'Dés Wiki hod a Próblém',
diff --git a/languages/messages/MessagesBat_smg.php b/languages/messages/MessagesBat_smg.php
index d32e58ac..44041f0e 100644
--- a/languages/messages/MessagesBat_smg.php
+++ b/languages/messages/MessagesBat_smg.php
@@ -12,4 +12,4 @@
*
*/
-$fallback = 'sgs';
+$fallback = 'sgs, lt';
diff --git a/languages/messages/MessagesBcc.php b/languages/messages/MessagesBcc.php
index 9ec06cc9..4988bec1 100644
--- a/languages/messages/MessagesBcc.php
+++ b/languages/messages/MessagesBcc.php
@@ -478,14 +478,13 @@ $1',
'badtitle' => 'عنوان بد',
'badtitletext' => 'لوٹتگین عنوان صÙحه نامعتبر ،هالیک یا یک عنوان هرابین لینک بین زبانی یا بین ÙˆÛŒ Ú©ÛŒ انت.
Ø¢ÛŒ شاید شامل یک یا گیشترین کاراکترانت Ú©Ù‡ ته عناوین استÙاده نه بنت.',
-'perfcached' => 'جهلیگین دیتا ذخیره بیتگنت و شاید نوک می بنت.',
-'perfcachedts' => 'جهلیگین دیتا ذخیره بیتگنت و اهرین په روچ بیگ $1.',
+'perfcached' => 'جهلیگین دیتا ذخیره بیتگنت و شاید نوک می بنت. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'جهلیگین دیتا ذخیره بیتگنت و اهرین په روچ بیگ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'په روچ بیگان په ای صÙحه الان غیر Ùعالنت. دیتا ادان الان نوکین نهنت.',
'wrong_wfQuery_params' => 'اشتباهین پارامتر به wfQuery()<br />
Function: $1<br />
Query: $2',
'viewsource' => 'به گند منبع آ',
-'viewsourcefor' => 'په $1',
'actionthrottled' => 'کار گیر نت',
'actionthrottledtext' => 'په خاطر یک معیار ضد اسپم شما چه انجام ای کار ته یک کمی زمان محدود بیتگیت، و شما چه ای محدودیت رد بیتگیت.
لطÙا چند دقیقه بعد کوشست Ú©Ù†',
@@ -679,9 +678,6 @@ $2',
مشی هنوکی ان آی پی $3 شمی شماره محدودیت $5
لطÙا ای شماره ته هر جوست Ùˆ پرسی هور کنیت.',
'blockednoreason' => 'هچ دلیلی دهگ نه بیته',
-'blockedoriginalsource' => "منبع '''$1''' جهلآ پیش دراگ بیت:",
-'blockededitsource' => "متن '''your edits'' به '''$1''' جهلآ پیش دارگ بیت:",
-'whitelistedittitle' => 'په اصلاح کتن بایدن وارد سیستم بیت',
'whitelistedittext' => 'شما باید $1به اصلاح کتن صÙحات.',
'confirmedittext' => 'شما بایدن وتی آدرس ایمیل Ø¢ پیش Ú†Ù‡ اصلاح کتن صÙحات تایید کنیت.
لطÙا وتی آدرس ایمیل Ø¢ÛŒ Ú†Ù‡ طریق [[Special:Preferences|ترجحات کاربر]] تنظیم Ùˆ معتبر کنیت.',
@@ -893,8 +889,6 @@ Legend: (cur) = تÙاوتان گون هنوکین نسخه,
'revdelete-unsuppress' => 'بزور محدودیت آنء جه ترینتگین بازبینی آن',
'revdelete-log' => 'دلیل:',
'revdelete-submit' => 'بلی اور انتخابی بازبینی',
-'revdelete-logentry' => 'عوض بوت ظاهر بیگ بازبینی [[$1]]',
-'logdelete-logentry' => 'عوض بیت ظاهر بوتن رویداد چه [[$1]]',
'revdelete-success' => "'''ظاهر بازبینی گون موÙقیت تنظیم بوت.'''",
'revdelete-failure' => "'''پیشدارگ نسخ قابل تنظیم نه بیتن.'''",
'logdelete-success' => "''''آمار ظاهر بیگ گون موÙقیت تنظیم بوت.''''",
@@ -903,15 +897,6 @@ $1",
'revdel-restore' => 'عوض کن ظاهر بیگء',
'pagehist' => 'تاریح صÙحه',
'deletedhist' => 'تاریح حذ٠بوت',
-'revdelete-content' => 'محتوا',
-'revdelete-summary' => 'خلاصه اصلاح',
-'revdelete-uname' => 'نام کاربری',
-'revdelete-restricted' => 'محدودیت آن په مدیران سیستم بوت',
-'revdelete-unrestricted' => 'به زور چه مدیران سیستم محدودیتان',
-'revdelete-hid' => 'پناه $1',
-'revdelete-unhid' => ' $1پنهاه مکن',
-'revdelete-log-message' => '$1 په $2 {{PLURAL:$2|بازبینی|بازبینی ان}}',
-'logdelete-log-message' => '$1 په $2 {{PLURAL:$2|رویداد|رویدادان}}',
'revdelete-edit-reasonlist' => 'اصلاح دلایل حذÙ',
# Suppression log
@@ -1047,7 +1032,7 @@ $1",
'prefs-rc' => 'نوکین تغییرات',
'prefs-watchlist' => 'لیست چارگ',
'prefs-watchlist-days' => 'روچان په پیش دارگ ته لیست چارگ',
-'prefs-watchlist-days-max' => '(حداکثر ۷ روچ)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'گشیترین تعداد تغییرات په پیشدارگ ته پچین لیست چارگ:',
'prefs-watchlist-edits-max' => '(گیشترین تعداد: ۱۰۰۰)',
'prefs-misc' => 'هردابین',
@@ -1228,7 +1213,6 @@ $1",
'right-autopatrol' => 'اتوماتیکی اصلاحات یکیء چه وتی نشان کن په داب نظارت بوتگین',
'right-patrolmarks' => 'به گند نوکین تغییرات نشان نظارتی',
'right-unwatchedpages' => 'به گند په داب یکیک لیست نچارتگین صÙحات',
-'right-trackback' => 'یک رندگری دیم دی',
'right-mergehistory' => 'Ú†Ù† وبند Ú©Ù† تاریح صÙحاتء',
'right-userrights' => 'اصلاح کل حقوق کاربری',
'right-userrights-interwiki' => 'اصلاح حقوق کابرانی کابران دگه ویکی انء',
@@ -1271,7 +1255,6 @@ $1",
'action-patrol' => 'نشان کتن اصلاح دگران په داب چارگ بیتگین',
'action-autopatrol' => 'نشان کتن وتی اصلاح په داب چارگ بوتگین',
'action-unwatchedpages' => 'چارگ لیست نچارتگین صÙحات',
-'action-trackback' => 'ثبت یک بازتر',
'action-mergehistory' => 'هورکتن تاریح ای صÙحه',
'action-userrights' => 'اصلاح کل حقوق کاربر',
'action-userrights-interwiki' => 'اصلاح حقوق کاربری کاربران ته دگه ویکیء',
@@ -1729,12 +1712,8 @@ PICT # misc.
'activeusers-noresult' => 'هچ کاربری درگیزگ نه بیت',
# Special:Log/newusers
-'newuserlogpage' => 'ورود شرکتن کاربر',
-'newuserlogpagetext' => '.شی یک ورودی چه شرکتن کاربر',
-'newuserlog-byemail' => 'کلمه رمز گون ایمیل دیم دهگ بوت',
-'newuserlog-create-entry' => 'نوکین کاربر',
-'newuserlog-create2-entry' => 'نوکین حساب شربوت $1',
-'newuserlog-autocreate-entry' => 'حساب اتوماتیکی شربوت',
+'newuserlogpage' => 'ورود شرکتن کاربر',
+'newuserlogpagetext' => '.شی یک ورودی چه شرکتن کاربر',
# Special:ListGroupRights
'listgrouprights' => 'حقوق گروه کاربر',
@@ -1862,8 +1841,6 @@ $NEWPAGE
'actionfailed' => 'عمل پروش وارت',
'deletedtext' => '"$1" حذ٠بیت.
بگندیت $2 په ثبتی Ú©Ù‡ نوکین حذÙیات',
-'deletedarticle' => 'حذ٠بوت "[[$1]]"',
-'suppressedarticle' => 'متوق٠بوت "[[$1]]"',
'dellogpage' => 'حذ٠ورودان',
'dellogpagetext' => 'جهلء یک لیستی Ú†Ù‡ نوکترین حذÙیات هست.',
'deletionlog' => 'آمار حذÙ',
@@ -1993,7 +1970,6 @@ $NEWPAGE
'undeletereset' => 'برگردینگ',
'undeleteinvert' => 'چپکایگ کتن انتخاب',
'undeletecomment' => 'نظر:',
-'undeletedarticle' => 'واترینت "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 بازبینی|$1 بازبینی آن}} واترینگ بیت',
'undeletedrevisions-files' => '{{PLURAL:$1|1 بازبینی|$1بازبینی ان}} Ùˆ {{PLURAL:$2|1 Ùایل|$2 Ùایلان}} برگردینگ بوتن',
'undeletedfiles' => '{{PLURAL:$1|1 Ùایل|$1 Ùایلآن}} واترینگ بین',
@@ -2228,9 +2204,6 @@ $1',
'movepage-page-moved' => 'صÙحه $1 جاه په جاه بیت په $2',
'movepage-page-unmoved' => 'صÙحه $1نه تونیت جاه په جاه بیت په $2',
'movepage-max-pages' => 'گیشترین $1 {{PLURAL:$1|صÙحه|صÙحات}}جاه په جاه بوتگن ودگه Ù‡Ú†ÛŒ اتوماتیکی جاه په جاه نه بیت.',
-'1movedto2' => '[[$1]] چاه په چاه بوت په [[$2]]',
-'1movedto2_redir' => '[[$1]] جاه په جاه بوت په [[$2]] غیر مستقیم',
-'move-redirect-suppressed' => 'تغییر مسیر بند بوت',
'movelogpage' => 'جاه په جاهی ورود',
'movelogpagetext' => 'جهلء یک لیستی Ú†Ù‡ صÙحات جاه په جاه بوتگین هست',
'movesubpage' => '{{PLURAL:$1|زیرتاک|زیرتاکان}}',
@@ -2471,9 +2444,6 @@ $1',
# Patrol log
'patrol-log-page' => 'آمار نظارت',
'patrol-log-header' => 'شی آماری چه بازبینی آن گشتی انت.',
-'patrol-log-line' => 'نشان هلگ بیتن $1 چه $2 نظارت $3',
-'patrol-log-auto' => '(اتوماتیک)',
-'patrol-log-diff' => 'ر$1',
'log-show-hide-patrol' => '$1 آمار گشت',
# Image deletion
@@ -2498,7 +2468,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|صÙحه|صÙحات}}',
'file-info' => 'اندازه Ùایل: $1, مایم نوع: $2',
'file-info-size' => '$1 × $2 پیکسل, اندازه Ùایل: $3, مایم نوع: $4',
-'file-nohires' => '<small>مزنترین رزلوشن نیست.</small>',
+'file-nohires' => 'مزنترین رزلوشن نیست.',
'svg-long-desc' => 'اس ÙˆÛŒ جی Ùایل, معمولا $1 × $2 پیکسل, Ùایل اندازه: $3',
'show-big-image' => 'Ú©Ù„ صÙحه',
@@ -2515,9 +2485,9 @@ $1',
'sp-newimages-showfrom' => 'پیش دار نوکین Ùایلان شروع بینت Ú†Ù‡ $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'س',
-'minutes-abbrev' => 'Ù…',
-'hours-abbrev' => 'Ù‡',
+'seconds-abbrev' => '$1س',
+'minutes-abbrev' => '$1Ù…',
+'hours-abbrev' => '$1Ù‡',
# Bad image list
'bad_image_list' => 'Ùرمت په داب جهلیگی انت:
@@ -2927,13 +2897,6 @@ $5
'scarytranscludefailed' => '[تمپلت آرگ پروش وارت په $1]',
'scarytranscludetoolong' => '[URL باز مزننت]',
-# Trackbacks
-'trackbackbox' => 'گرند گروگان ای صÙحه:<br />
-$1',
-'trackbackremove' => '([$1 حذÙ])',
-'trackbacklink' => 'رند گر',
-'trackbackdeleteok' => 'رند گر گون موÙقیت حذ٠بوت.',
-
# Delete conflict
'deletedwhileediting' => "'''هوژاری''': ای صÙحه حذ٠بوتت رند Ú†Ù‡ شمی اصلاح کتن شروه بیگ!",
'confirmrecreate' => "کاربر [[User:$1|$1]] ([[User talk:$1|Ú¯Ù¾]]) ای صÙحهء حذ٠کتت بعد Ú†Ù‡ Ø´ÛŒ Ú©Ù‡ شما اصلاح شروع کتت گون ای دلیل:
@@ -3168,4 +3131,9 @@ $1',
'htmlform-reset' => 'ترینگ تغییرات',
'htmlform-selectorother-other' => 'دگه',
+# New logging system
+'revdelete-restricted' => 'محدودیت آن په مدیران سیستم بوت',
+'revdelete-unrestricted' => 'به زور چه مدیران سیستم محدودیتان',
+'newuserlog-byemail' => 'کلمه رمز گون ایمیل دیم دهگ بوت',
+
);
diff --git a/languages/messages/MessagesBcl.php b/languages/messages/MessagesBcl.php
index 26239eb0..9d4bfce2 100644
--- a/languages/messages/MessagesBcl.php
+++ b/languages/messages/MessagesBcl.php
@@ -33,59 +33,59 @@ $namespaceNames = array(
);
$magicWords = array(
- 'currentmonth' => array( '1', 'BULANNGONYAN', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'NGARANBULANNGONYAN', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'ALDAWNGONYAN', 'CURRENTDAY' ),
- 'currentyear' => array( '1', 'TAONNGONYAN', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'PANAHONNGONYAN', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORASNGONYAN', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALBULAN', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'NGARANLOKALBULAN', 'LOCALMONTHNAME' ),
- 'localday' => array( '1', 'LOKALALDAW', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALALDAW2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NGARANLOKALALDAW', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKALTAON', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALPANAHON', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKALORAS', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMEROKANPAHINA', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMEROKANARTIKULO', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMEROKANDOKUMENTO', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMEROKANPARAGAMIT', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'NUMEROKANLIGWAT', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NGARANKANPAHINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'KAGNGARANKANPAHINA', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NGARANESPASYO', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'KAGNGARANESPASYO', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'OLAYESPASYO', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'KAGOLAYESPASYO', 'TALKSPACEE' ),
- 'fullpagename' => array( '1', 'TODONGNGARANKANPAHINA', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'KAGNGARANKANTODONGNGARANKANPAHINA', 'FULLPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NGARANKANPAHINANINOLAY', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'KAGNGARANKANPAHINANINOLAY', 'TALKPAGENAMEE' ),
- 'msg' => array( '0', 'MSH', 'MSG:' ),
- 'img_right' => array( '1', 'too', 'right' ),
- 'img_left' => array( '1', 'wala', 'left' ),
- 'img_none' => array( '1', 'mayò', 'none' ),
- 'img_center' => array( '1', 'sentro', 'tangâ', 'center', 'centre' ),
- 'img_framed' => array( '1', 'nakakawadro', 'kwadro', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'daing kwadro', 'frameless' ),
- 'img_page' => array( '1', 'pahina=$1', 'pahina $1', 'page=$1', 'page $1' ),
- 'localurl' => array( '0', 'LOKALURL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALURLE', 'LOCALURLE:' ),
- 'currentweek' => array( '1', 'SEMANANGONYAN', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'LOKALSEMANA', 'LOCALWEEK' ),
- 'plural' => array( '0', 'DAKOL:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TODONGURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'TODONGURLE:', 'FULLURLE:' ),
- 'language' => array( '0', '#TATARAMON', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'TATARAMONKANLAOG', 'TATARAMONLAOG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'numberofadmins' => array( '1', 'NUMEROKANTAGAMATO', 'NUMBEROFADMINS' ),
- 'padleft' => array( '0', 'PADWALA', 'PADLEFT' ),
- 'padright' => array( '0', 'PADTOO', 'PADRIGHT' ),
- 'filepath' => array( '0', 'FILEDALAN', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__NAKATAGONGKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAHINASAKATEGORYA', 'PAHINASAKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'PAHINASOKOL', 'PAGESIZE' ),
+ 'currentmonth' => array( '1', 'BULANNGONYAN', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'NGARANBULANNGONYAN', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'ALDAWNGONYAN', 'CURRENTDAY' ),
+ 'currentyear' => array( '1', 'TAONNGONYAN', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'PANAHONNGONYAN', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORASNGONYAN', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALBULAN', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'NGARANLOKALBULAN', 'LOCALMONTHNAME' ),
+ 'localday' => array( '1', 'LOKALALDAW', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALALDAW2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NGARANLOKALALDAW', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALTAON', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALPANAHON', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALORAS', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMEROKANPAHINA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMEROKANARTIKULO', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMEROKANDOKUMENTO', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMEROKANPARAGAMIT', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'NUMEROKANLIGWAT', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NGARANKANPAHINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'KAGNGARANKANPAHINA', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NGARANESPASYO', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'KAGNGARANESPASYO', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'OLAYESPASYO', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'KAGOLAYESPASYO', 'TALKSPACEE' ),
+ 'fullpagename' => array( '1', 'TODONGNGARANKANPAHINA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'KAGNGARANKANTODONGNGARANKANPAHINA', 'FULLPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NGARANKANPAHINANINOLAY', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'KAGNGARANKANPAHINANINOLAY', 'TALKPAGENAMEE' ),
+ 'msg' => array( '0', 'MSH', 'MSG:' ),
+ 'img_right' => array( '1', 'too', 'right' ),
+ 'img_left' => array( '1', 'wala', 'left' ),
+ 'img_none' => array( '1', 'mayò', 'none' ),
+ 'img_center' => array( '1', 'sentro', 'tangâ', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'nakakawadro', 'kwadro', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'daing kwadro', 'frameless' ),
+ 'img_page' => array( '1', 'pahina=$1', 'pahina $1', 'page=$1', 'page $1' ),
+ 'localurl' => array( '0', 'LOKALURL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALURLE', 'LOCALURLE:' ),
+ 'currentweek' => array( '1', 'SEMANANGONYAN', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'LOKALSEMANA', 'LOCALWEEK' ),
+ 'plural' => array( '0', 'DAKOL:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'TODONGURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'TODONGURLE:', 'FULLURLE:' ),
+ 'language' => array( '0', '#TATARAMON', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'TATARAMONKANLAOG', 'TATARAMONLAOG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'numberofadmins' => array( '1', 'NUMEROKANTAGAMATO', 'NUMBEROFADMINS' ),
+ 'padleft' => array( '0', 'PADWALA', 'PADLEFT' ),
+ 'padright' => array( '0', 'PADTOO', 'PADRIGHT' ),
+ 'filepath' => array( '0', 'FILEDALAN', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__NAKATAGONGKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAHINASAKATEGORYA', 'PAHINASAKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PAHINASOKOL', 'PAGESIZE' ),
);
$specialPageAliases = array(
@@ -406,14 +406,13 @@ Ini an eksplikasyon kan tagamató na nagkandado kaini: $1',
'cannotdelete' => 'Dai naparà an pahina o file na napilî. (Pwede na naparà na ini kan ibang paragamit.)',
'badtitle' => 'Salâ an titulo',
'badtitletext' => 'Dai pwede an hinagad na titulo nin pahina, o mayong laog, o sarong titulong pan-ibang tatarámon o pan-ibang wiki na sala an pagkatakód. Pwedengigwa ining sarô o iba pang mga karakter na dai pwedeng gamiton sa mga titulo.',
-'perfcached' => 'Nakaabang an minasunod na mga datos, asin pwede ser na mga lumâ na.',
-'perfcachedts' => 'Nakaabang an nagsusunod na mga datos, asin huring nabâgo sa $1.',
+'perfcached' => 'Nakaabang an minasunod na mga datos, asin pwede ser na mga lumâ na. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Nakaabang an nagsusunod na mga datos, asin huring nabâgo sa $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pigpopogol mùna an mga pagbabàgo sa pahinang ini. Dai mùna mababàgo an mga datos digdi.',
'wrong_wfQuery_params' => 'Salâ na parámetro sa wfQuery()<br />
Acción: $1<br />
Hapót: $2',
'viewsource' => 'Hilingón an ginikanan',
-'viewsourcefor' => 'para sa $1',
'protectedpagetext' => 'An pahinang ini pigsará tangarig pogolon an paghirá.',
'viewsourcetext' => 'Pwede mong hilingón asin arógon an ginikanan kan pahinang ini:',
'protectedinterface' => 'An pahinang ini nagtatao nin interface para sa software, asin sarado tangarig mapondo an pag-abuso.',
@@ -577,9 +576,6 @@ Giromdomon tabî na pwede mo sanang gamiton an \"''e''-suratan ining parágamit\
\$5 an pigbagat na ID. Ikaag tabî ining ID sa gabos na paghapot mo.",
'blockednoreason' => 'mayong itinaong rason',
-'blockedoriginalsource' => "An ginikanan kan '''$1''' mahihiling sa ibabâ:",
-'blockededitsource' => "An teksto kan '''mga hira mo''' sa '''$1''' mahihiling sa babâ:",
-'whitelistedittitle' => 'Kaipuhan an paglaog tangarig makahirá',
'whitelistedittext' => 'Kaipuhan mong $1 tangarig makahirá nin mga páhina.',
'confirmedittext' => "Kaipuhan mong kompirmaron an saimong ''e''-surat. Ipwesto tabî asin patunayan an saimong ''e''-surat sa [[Special:Preferences|mga kabôtan kan parágamit]].",
'nosuchsectiontitle' => 'Mayong siring na seksyón',
@@ -731,11 +727,8 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
'revdelete-unsuppress' => 'Halîon an mga restriksyón sa mga ibinalík na pagpakarhay',
'revdelete-log' => 'Rason:',
'revdelete-submit' => 'Ibílang sa piniling pagpakarhay',
-'revdelete-logentry' => 'pigribayan an bisibilidad nin panyayari kan $1 [[$1]]',
-'logdelete-logentry' => 'Pigribayan an bisibilidad nin panyayari kan [[$1]]',
'revdelete-success' => "'''Nakapwesto na an bisibilidad kan pagpakarhay.'''",
'logdelete-success' => "'''Nakapuesto na an katalâan kan nangyari.'''",
-'revdelete-uname' => 'paragamit',
# Merge log
'revertmerge' => 'Suwayón',
@@ -1188,9 +1181,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Ipahiling',
'listusers-noresult' => 'Mayong nakuang parágamit.',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Bâgong parágamit',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Grupo',
'listgrouprights-rights' => 'Derechos',
@@ -1302,7 +1292,6 @@ Konpirmaron tabì na talagang boot mong gibohon ini, nasasabotan mo an mga resul
'actioncomplete' => 'Nagibo na',
'deletedtext' => 'Pigparà na an "$1" .
Hilingón tabì an $2 para mahiling an lista nin mga kaaagi pa sanang pagparà.',
-'deletedarticle' => 'pigparà an "[[$1]]"',
'dellogpage' => 'Usip nin pagparà',
'dellogpagetext' => 'Mahihiling sa babâ an lista kan mga pinakahuring pagparâ.',
'deletionlog' => 'Historial nin pagparâ',
@@ -1395,7 +1384,6 @@ binalik an na pagribay o hinalî sa archibo.',
'undeletebtn' => 'Ibalik',
'undeletereset' => 'Ipwesto giraray',
'undeletecomment' => 'Komento:',
-'undeletedarticle' => 'Ibinalik "[[$1]]"',
'undeletedrevisions' => '$1 na (mga) pagriribay an binalík',
'undeletedrevisions-files' => "$1 na (mga) pagribay asin $2 na (mga) binalik na ''file''",
'undeletedfiles' => "$1 (mga) ''file'' an binalik",
@@ -1576,8 +1564,6 @@ Magpilì tabì nin ibang pangaran.',
'talkexists' => "'''Ibinalyo na an mismong pahina, alagad dai naibalyo an pahina nin orolay ta igwa na kaini sa bàgong titulo. Pagsaroon tabì ining duwa nin mano-mano.'''",
'movedto' => 'piglipat sa',
'movetalk' => 'Ibalyo an pahinang orolayan na nakaasociar',
-'1movedto2' => '[[$1]] piglipat sa [[$2]]',
-'1movedto2_redir' => '[[$1]] pigbalyó sa [[$2]] sa paagi kan pagredirekta',
'movelogpage' => 'Ibalyó an usip',
'movelogpagetext' => 'Nasa ibaba an lista kan pahinang pigbalyó.',
'movereason' => 'Rason:',
@@ -1758,8 +1744,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => 'Laóg kan Pigpapatrolya',
-'patrol-log-line' => 'minarkahan an $1 kan $2 na pigpapatrulya $3',
-'patrol-log-auto' => '(enseguida)',
# Image deletion
'deletedrevision' => 'Pigparâ an lumang pagribay na $1.',
@@ -1783,7 +1767,7 @@ $1",
'widthheightpage' => '$1 × $2, $3 mga pahina',
'file-info' => "sokol kan ''file'': $1, tipo nin MIME: $2",
'file-info-size' => "$1 × $2 na pixel, sokol kan ''file'': $3, tipo nin MIME: $4",
-'file-nohires' => '<small>Mayong mas halangkaw na resolusyón.</small>',
+'file-nohires' => 'Mayong mas halangkáw na resolusyon.',
'svg-long-desc' => 'file na SVG, haros $1 × $2 pixels, sokol kan file: $3',
'show-big-image' => 'Todong resolusyon',
@@ -1899,13 +1883,6 @@ Kun *bakô* ka ini, dai sunodón an takod. Mapaso sa $4 inning koda nin kompirma
'scarytranscludefailed' => '[Nabigô an pagkua kan templato para sa $1; despensa]',
'scarytranscludetoolong' => '[halabaon an URL; despensa]',
-# Trackbacks
-'trackbackbox' => 'Mga trackback sa pahinang ini:<br />
-$1',
-'trackbackremove' => '([$1 Parâon])',
-'trackbacklink' => 'Solsogan',
-'trackbackdeleteok' => 'Pigparâ na an solsogan.',
-
# Delete conflict
'deletedwhileediting' => 'Patanid: Pigparâ na an pahinang ini antes na nagpoon kan maghirá!',
'confirmrecreate' => "Si [[User:$1|$1]] ([[User talk:$1|olay]]) pigparâ ining páhina pagkatapos mong magpoon kan paghira ta:
diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php
index f8591d0b..e300fc12 100644
--- a/languages/messages/MessagesBe.php
+++ b/languages/messages/MessagesBe.php
@@ -16,6 +16,7 @@
* @author Prima klasy4na
* @author Riwnodennyk
* @author Urhixidur
+ * @author Wizardist
* @author Yury Tarasievich
* @author ТеÑÑ‚
* @author Хомелка
@@ -61,6 +62,17 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Размовы_пра_катÑгорыю',
);
+$magicWords = array(
+ 'img_thumbnail' => array( '1', 'міні', 'мініÑцюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'міні=$1', 'мініÑцюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'злева', 'left' ),
+ 'img_none' => array( '1', 'нÑма', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'цÑнтр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'безрамкі', 'framed', 'enframed', 'frame' ),
+);
+
# Per discussion on http://translatewiki.net/wiki/Thread:Support/Customization_of number format
$separatorTransformTable = array(
',' => "\xc2\xa0", # nbsp
@@ -427,21 +439,23 @@ $1',
'formerror' => 'Памылка: не ўдалоÑÑ Ð¿Ð°Ð´Ð°Ñ†ÑŒ форму',
'badarticleerror' => 'ÐÐ¿ÐµÑ€Ð°Ñ†Ñ‹Ñ Ð½Ðµ дазволена на гÑтай Ñтаронцы.',
'cannotdelete' => 'Ðемагчыма Ñцерці Ñтаронку ці файл "$1". Магчыма, хтоÑьці іншы ўжо зрабіў гÑта.',
+'cannotdelete-title' => 'Ðельга выдаліць Ñтаронку "$1"',
'badtitle' => 'ÐÑÐ¿Ñ€Ð°Ð²Ñ–Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°',
'badtitletext' => 'Ðазва Ñтаронкі, па Ñкую звÑрталіÑÑ, аказалаÑÑ Ð½ÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ð¹, пуÑтой, або нÑправільна прылучанай між-моўнай ці між-вікі назвай. Магчыма, у ёй Ñ‘Ñць знакі, ÑÐºÑ–Ñ Ð½ÐµÐ»ÑŒÐ³Ð° ўжываць у назвах.',
-'perfcached' => 'ГÑта ўзÑÑ‚Ñ‹Ñ Ð· кÑшу звеÑткі, Ñ– Ñны могуць не быць актуальнымі.',
-'perfcachedts' => 'КÑÑˆÐ°Ð²Ñ‹Ñ Ð·Ð²ÐµÑткі, дата апошнÑй актуалізацыі $1.',
+'perfcached' => 'ГÑта ўзÑÑ‚Ñ‹Ñ Ð· кÑшу звеÑткі, Ñ– Ñны могуць не быць актуальнымі. У кÑшы захоўваецца не больш за {{PLURAL:$1|адзін вынік|$1 вынікі|$1 вынікаў}}.',
+'perfcachedts' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·Ð²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– апошні раз былі Ð°Ð±Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1. У кÑшы {{PLURAL:$4|даÑтупны|даÑтупныÑ}} не больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.',
'querypage-no-updates' => 'Ðемагчыма абнавіць Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ð·Ð²ÐµÑткі, таму што зараз абнаўленні гÑтай Ñтаронкі не дазволены.',
'wrong_wfQuery_params' => 'ÐÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ wfQuery()<br />
ФункцыÑ: $1<br />
Зварот: $2',
'viewsource' => 'Паказаць выточны Ñ‚ÑкÑÑ‚',
-'viewsourcefor' => 'Ð´Ð»Ñ $1',
+'viewsource-title' => 'ПраглÑд зыходнага Ñ‚ÑкÑту Ñтаронкі $1',
'actionthrottled' => 'ДзеÑнне прыгашана',
'actionthrottledtext' => 'Ð”Ð·ÐµÐ»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ ад Ñпаму, вам не дазвалÑецца выконваць гÑтае дзеÑнне занадта чаÑта за пÑўны адрÑзак чаÑу, Ñ– вы гÑÑ‚Ñ‹ ліміт пераÑÑгнулі. ПаÑпрабуйце ізноў праз некалькі мінут.',
'protectedpagetext' => 'Старонка ахоўваецца, каб нельга было Ñе правіць.',
'viewsourcetext' => 'Можна бачыць Ñ– капіраваць крынічны Ñ‚ÑкÑÑ‚ гÑтай Ñтаронкі:',
+'viewyourtext' => "Ð’Ñ‹ можаце праглÑдзець Ñ– ÑкапіÑваць зыходны Ñ‚ÑкÑÑ‚ '''вашых правак''' на гÑтай Ñтаронцы:",
'protectedinterface' => 'Старонка ахоўваецца, таму што ўваходзіць у Ñклад інтÑрфейÑу гÑтай праграмы.',
'editinginterface' => "'''Увага:''' Ð’Ñ‹ правіце Ñтаронку, ÑÐºÐ°Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ Ñ‚ÑкÑÑ‚ карыÑтальніцкага інтÑрфейÑу.
Яе змÑненне паўплывае на вонкавы выглÑд праграмы Ð´Ð»Ñ ÑžÑÑ–Ñ… удзельнікаў.
@@ -532,6 +546,7 @@ $2',
'noemailprefs' => 'ПатрÑбны Ð°Ð´Ñ€Ð°Ñ Ñл.пошты, каб дзейнічалі гÑÑ‚Ñ‹Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñці.',
'emailconfirmlink' => 'Пацвердзіце ваш Ð°Ð´Ñ€Ð°Ñ Ñл.пошты',
'invalidemailaddress' => 'Ðепрыймальны Ð°Ð´Ñ€Ð°Ñ Ñл.пошты, таму што Ñго фармат выглÑдае нÑправільным. Упішыце Ð°Ð´Ñ€Ð°Ñ Ñƒ правільным фармаце або ачыÑціце гÑтае поле.',
+'cannotchangeemail' => 'ÐдраÑÑ‹ Ñлектроннай пошты гÑтага ўліковага запіÑу не могуць быць зменены Ñž гÑтай вікі.',
'accountcreated' => 'Створаны рахунак',
'accountcreatedtext' => 'Створаны рахунак удзельніка $1.',
'createaccount-title' => 'СтварÑнне рахунка на {{SITENAME}}',
@@ -546,6 +561,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž функцыі PHP-пошты',
+'user-mail-no-addy' => 'ПаÑпрабаваў адправіць Ñлектронны ліÑÑ‚ без адраÑу Ñлектроннай пошты',
# Change password dialog
'resetpass' => 'ЗмÑніць пароль',
@@ -565,16 +581,18 @@ $2',
'resetpass-temp-password' => 'ТымчаÑовы пароль:',
# Special:PasswordReset
-'passwordreset' => 'Ð’Ñ‹Ñлаць мне новы пароль',
-'passwordreset-text' => 'Запоўніце гÑтую форму, каб атрымаць па Ñлектроннай пошце напамін вашага акаўнта.',
-'passwordreset-legend' => 'ПераўÑтанавіць пароль',
-'passwordreset-disabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð¿ÐµÑ€Ð°ÑžÑталёўкі Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ð½Ð° гÑтай вікі.',
-'passwordreset-pretext' => '{{PLURAL:$1||Калі лаÑка, увÑдзіце адзін з фрагментаў дадзеных ніжÑй}}',
-'passwordreset-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
-'passwordreset-domain' => 'Дамен:',
-'passwordreset-email' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
-'passwordreset-emailtitle' => 'Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° рахунак на Ñайце {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ðехта (магчыма вы, з IP-адраÑу $1) запытаў напамін пра ваш
+'passwordreset' => 'Ð’Ñ‹Ñлаць мне новы пароль',
+'passwordreset-text' => 'Запоўніце гÑтую форму, каб атрымаць па Ñлектроннай пошце напамін вашага акаўнта.',
+'passwordreset-legend' => 'ПераўÑтанавіць пароль',
+'passwordreset-disabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð¿ÐµÑ€Ð°ÑžÑталёўкі Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ð½Ð° гÑтай вікі.',
+'passwordreset-pretext' => '{{PLURAL:$1||Калі лаÑка, увÑдзіце адзін з фрагментаў дадзеных ніжÑй}}',
+'passwordreset-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
+'passwordreset-domain' => 'Дамен:',
+'passwordreset-capture' => 'ПраглÑдзець напіÑаны ліÑÑ‚?',
+'passwordreset-capture-help' => 'Калі вы паÑтавіце адзнаку, то вам будзе паказаны ліÑÑ‚ з чаÑовым паролем, Ñкі адпраўлÑецца ўдзельніку.',
+'passwordreset-email' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'passwordreset-emailtitle' => 'Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° рахунак на Ñайце {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Ðехта (магчыма вы, з IP-адраÑу $1) запытаў напамін пра ваш
уліковы Ð·Ð°Ð¿Ñ–Ñ Ñƒ праекце {{SITENAME}} ($4).
{{PLURAL:$3|ÐаÑтупны ўліковы Ð·Ð°Ð¿Ñ–Ñ Ð·Ð²Ñзаны | ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÑžÐ»Ñ–ÐºÐ¾Ð²Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹ звÑзаны}} з гÑтым адраÑам Ñлектроннай пошты:
@@ -585,7 +603,7 @@ $2
Калі вы не рабілі гÑтага запыту, ці ÑžÑпомнілі Ñвой зыходны пароль
Ñ– не жадаеце Ñго мÑнÑць, вы можаце праігнараваць гÑтае паведамленне
Ñ– працÑгнуць выкарыÑтоўваць Ñвой Ñтары пароль.',
-'passwordreset-emailtext-user' => 'Удзельнік $1 з праекту {{SITENAME}} запраÑÑ–Ñž напамін пра ваш
+'passwordreset-emailtext-user' => 'Удзельнік $1 з праекту {{SITENAME}} запраÑÑ–Ñž напамін пра ваш
уліковы Ð·Ð°Ð¿Ñ–Ñ Ñƒ праекце {{SITENAME}}
($4).
{{PLURAL:$3|ÐаÑтупны ўліковы Ð·Ð°Ð¿Ñ–Ñ Ð·Ð²Ñзаны | ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÑƒÐ»Ñ–ÐºÐ¾Ð²Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹ звÑзаны}} з гÑтым адраÑам Ñлектроннай пошты:
@@ -597,9 +615,22 @@ $2
Калі вы не рабілі гÑтага запыту, ці ÑžÑпомнілі Ñвой зыходны пароль
Ñ– не жадаеце Ñго мÑнÑць, вы можаце праігнараваць гÑтае паведамленне
Ñ– працÑгнуць выкарыÑтоўваць Ñвой Ñтары пароль.',
-'passwordreset-emailelement' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°: $1
+'passwordreset-emailelement' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°: $1
ЧаÑовы пароль: $2',
-'passwordreset-emailsent' => 'Па Ñлектроннай пошце быў адпраўлены напамін.',
+'passwordreset-emailsent' => 'Па Ñлектроннай пошце быў адпраўлены напамін.',
+'passwordreset-emailsent-capture' => 'ÐіжÑй прыведзены адпраўлены ліÑÑ‚-напамін.',
+'passwordreset-emailerror-capture' => 'ÐіжÑй прыведзены Ñтвораны ліÑÑ‚-напамін, Ñго адпраўка не атрымалаÑÑ Ð¿Ð° прычыне: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ЗмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+'changeemail-header' => 'Змена Ñлектроннага адраÑу акаўнта',
+'changeemail-text' => 'Запоўніце гÑтую форму, каб змÑніць Ñвой Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты. Вам Ñ‚Ñ€Ñба будзе ўвеÑці пароль, каб пацвердзіць змÑненне.',
+'changeemail-no-info' => 'Каб звÑртацца непаÑÑ€Ñдна да гÑтай Ñтаронкі, вам варта прадÑтавіцца ÑÑ–ÑÑ‚Ñме.',
+'changeemail-oldemail' => 'БÑгучы Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'changeemail-newemail' => 'Ðовы Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'changeemail-none' => '(нÑма)',
+'changeemail-submit' => 'ЗмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'changeemail-cancel' => 'Ðдмена',
# Edit page toolbar
'bold_sample' => 'Цёмны Ñ‚ÑкÑÑ‚',
@@ -665,9 +696,6 @@ $2
Ваш Ð°Ð´Ñ€Ð°Ñ IP: $3. Ваш нумар блоку: $5. Падавайце ÑžÑе гÑÑ‚Ñ‹Ñ Ð·Ð²ÐµÑткі Ñž кожным Ñваім звароце адноÑна гÑтага блоку.",
'blockednoreason' => 'прычына не вызначана',
-'blockedoriginalsource' => "Крынічны Ñ‚ÑкÑÑ‚ '''$1''' паказаны ніжÑй:",
-'blockededitsource' => "ТÑкÑÑ‚ '''вашых правак''' у '''$1''' паказаны ніжÑй:",
-'whitelistedittitle' => 'Каб правіць Ñтаронкі, Ñ‚Ñ€Ñба ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму',
'whitelistedittext' => 'Ðалежыць $1 каб правіць Ñтаронкі.',
'confirmedittext' => 'Вам Ñ‚Ñ€Ñба пацвердзіць Ñвой Ð°Ð´Ñ€Ð°Ñ Ñл.пошты перад тым, Ñк правіць Ñтаронкі.
Вызначце Ñ– пацвердзіце Ð°Ð´Ñ€Ð°Ñ Ñž Ñваіх [[Special:Preferences|наÑтáўленнÑÑ…]].',
@@ -741,7 +769,8 @@ $2
'copyrightwarning2' => "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб Ð²Ð°ÑˆÑ‹Ñ Ð¼Ð°Ñ‚ÑрыÑлы бÑзлітаÑна правіліÑÑ, то Ñ– не давайце Ñ–Ñ… Ñюды.<br />
ТакÑама вы нам абÑцаеце, што напіÑалі гÑта Ñамі, або Ñкапіравалі з Ñ€ÑÑурÑу, Ñкі знаходзіцца Ñž публічнай улаÑнаÑці, або з аналагічнага Ñвабоднага Ñ€ÑÑурÑу (бач падрабÑзнаÑці на $1).
'''ÐЕ КЛÐДЗІЦЕ СЮДЫ, БЕЗ ÐДПÐВЕДÐÐГРДÐЗВОЛУ, ÐœÐТЭРЫЯЛУ, ЯКІ ÐХОЎВÐЕЦЦРÐЎТÐРСКІМ ПРÐÐ’ÐÐœ!'''",
-'longpageerror' => "'''ПÐМЫЛКÐ: немагчыма запіÑаць ваш Ñ‚ÑкÑÑ‚, бо Ñго аб'ём $1 кілабайтаў, а дазволены макÑімум — $2 кілабайтаў.'''",
+'longpageerror' => "'''Памылка: Ðб’ём Ñ‚ÑкÑту, Ñкі Ð’Ñ‹ Ñпрабуеце запіÑаць Ñкладае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей уÑтаноўленага Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð° $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.'''
+Старонка не можа быць захаванаÑ.",
'readonlywarning' => "'''УВÐГÐ: зараз вы не можаце запіÑаць Ñвае праўкі, таму што база даных зачынена на абÑлугоўванне. Магчыма, варта перанеÑці ваш Ñ‚ÑкÑÑ‚ у аÑобны файл Ñ– запіÑаць на потым.
ÐдмініÑтратар, Ñкі зачыніў базу, раÑтлумачыў гÑта так: $1'''",
@@ -904,8 +933,6 @@ $2
'revdelete-unsuppress' => 'ЗнÑць абмежаванні на Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ Ð²ÐµÑ€ÑÑ–Ñ–',
'revdelete-log' => 'Прычына:',
'revdelete-submit' => 'ПрымÑніць да азначан{{PLURAL:$1|ай ерÑÑ–Ñ–|Ñ‹Ñ… верÑій}}',
-'revdelete-logentry' => 'зменена бачнаÑць верÑÑ–Ñ– [[$1]]',
-'logdelete-logentry' => 'зменена бачнаÑць падзеі* [[$1]]',
'revdelete-success' => "'''ПаÑпÑхова абноўлена бачнаÑць верÑÑ–Ñ–.'''",
'revdelete-failure' => "'''Ðе ўдалоÑÑ Ð°Ð±Ð½Ð°Ð²Ñ–Ñ†ÑŒ бачнаÑць верÑÑ–Ñ–:'''
$1",
@@ -917,15 +944,6 @@ $1",
'revdel-restore-visible' => 'Ð‘Ð°Ñ‡Ð½Ñ‹Ñ Ð·Ð¼ÐµÐ½Ñ‹',
'pagehist' => 'ГіÑÑ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі',
'deletedhist' => 'Ð¡Ñ†Ñ‘Ñ€Ñ‚Ð°Ñ Ð³Ñ–ÑторыÑ',
-'revdelete-content' => 'змеÑÑ‚',
-'revdelete-summary' => 'тлумачÑнне праўкі',
-'revdelete-uname' => 'удзельнік',
-'revdelete-restricted' => 'паÑÑ‚Ð°ÑžÐ»ÐµÐ½Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ– на адмініÑтратараў',
-'revdelete-unrestricted' => 'знÑÑ‚Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ– з адмініÑтратараў',
-'revdelete-hid' => 'не паказваць $1',
-'revdelete-unhid' => 'паказваць $1',
-'revdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|верÑÑ–Ñ–|верÑій}}',
-'logdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|падзеі|падзей}}',
'revdelete-hide-current' => 'Памылка пры Ñкрыванні Ñкладніка з датай $2, $1: таму што гÑта Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ,
а Ñе немагчыма Ñкрываць.',
'revdelete-show-no-access' => 'Памылка пры паказе Ñкладніка з датай $2, $1: Ñкладнік пазначаны Ñк "абмежаваны".
@@ -1081,12 +1099,14 @@ $1",
'prefs-rc' => '{{:{{ns:mediawiki}}:Recentchanges/be}}',
'prefs-watchlist' => 'Ð¡Ð¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½Ð°Ð³Ð°',
'prefs-watchlist-days' => 'За колькі дзён паказваць змÑненні Ñž назіраным:',
-'prefs-watchlist-days-max' => '(найбольш 7 дзён)',
+'prefs-watchlist-days-max' => '(найбольш $1 {{PLURAL:$1|дзень|дзён}})',
'prefs-watchlist-edits' => 'КолькаÑць правак Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñž разгорнутым выглÑдзе:',
'prefs-watchlist-edits-max' => 'МакÑімум: 1000',
'prefs-watchlist-token' => 'СакрÑтны ключ Ð´Ð»Ñ RSS:',
'prefs-misc' => 'Рознае',
'prefs-resetpass' => 'ЗмÑніць пароль',
+'prefs-changeemail' => 'ЗмÑніць e-mail',
+'prefs-setemail' => 'УÑтаноўка Ñлектроннага адраÑу',
'prefs-email' => 'Эл.пошта',
'prefs-rendering' => 'Від',
'saveprefs' => 'ЗапіÑаць',
@@ -1146,6 +1166,7 @@ $1",
'yourrealname' => 'Сапраўднае імÑ:',
'yourlanguage' => 'Мова:',
'yourvariant' => 'ВарыÑнт мовы змеÑту',
+'prefs-help-variant' => 'Упадабаны Ð´Ð»Ñ Ð°Ð´Ð»ÑŽÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð¼ÐµÑціва Ñтаронак вікі варыÑнт мовы ці арфаграфіÑ.',
'yournick' => 'ПÑеўданім:',
'prefs-help-signature' => 'Ð’Ð°ÑˆÑ‹Ñ Ð²Ñ‹ÐºÐ°Ð·Ð²Ð°Ð½Ð½Ñ– Ñž размоўных Ñтаронках павінны быць падпіÑÐ°Ð½Ñ‹Ñ Ð·Ð½Ð°ÐºÐ°Ð¼Ñ– "<nowiki>~~~~</nowiki>", ÑÐºÑ–Ñ Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ð° ператвараюцца Ñž ваш Ð¿Ð¾Ð´Ð¿Ñ–Ñ Ñ– Ñ‡Ð°Ñ Ð·Ð°Ð¿Ñ–Ñу.',
'badsig' => 'Ðедапушчальны крынічны Ñ‚ÑкÑÑ‚ подпіÑу; праверце Ñ‚Ñгі HTML.',
@@ -1184,7 +1205,7 @@ $1",
'userrights-lookup-user' => 'РаÑпараджацца групамі ўдзельнікаў',
'userrights-user-editname' => 'УвÑдзіце Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'editusergroup' => 'Правіць групы ўдзельнікаў',
-'editinguser' => "ÐœÑнÑюцца дазволы Ð´Ð»Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Змена праў удзельніка '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'РаÑпараджацца групамі ўдзельніка',
'saveusergroups' => 'Захаваць групы ўдзельнікаў',
'userrights-groupsmember' => 'У групе:',
@@ -1278,13 +1299,13 @@ $1",
'right-autopatrol' => 'Значыць улаÑÐ½Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ– Ñк ухваленыÑ',
'right-patrolmarks' => 'Бачыць меткі ÑžÑ…Ð²Ð°Ð»ÐµÐ½Ð½Ñ Ð½Ñдаўніх змÑненнÑÑž',
'right-unwatchedpages' => 'Чытаць ÑÐ¿Ñ–Ñ Ð½ÐµÐ½Ð°Ð·Ñ–Ñ€Ð°Ð½Ñ‹Ñ… Ñтаронак',
-'right-trackback' => 'Падаваць Ñ‚Ñ€Ñк-бÑк',
'right-mergehistory' => "Ðб'Ñдноўваць гіÑторыі Ñтаронак",
'right-userrights' => 'Правіць уÑе дазволы ўдзельнікаў',
'right-userrights-interwiki' => 'Правіць дазволы ўдзельнікаў на іншых вікі',
'right-siteadmin' => 'Замыкаць і адмыкаць базу даных',
'right-override-export-depth' => 'ЭкÑпартаваць Ñтаронкі, у тым ліку звÑзаныÑ, да глыбіні ÑпаÑылак 5.',
'right-sendemail' => 'Ðдправіць па Ñлектроннай пошце іншым карыÑтальнікам',
+'right-passwordreset' => 'праглÑд Ñлектронных ліÑтоў Ñа змÑненнем паролÑ',
# User rights log
'rightslog' => 'Журнал правоў удзельнікаў',
@@ -1318,16 +1339,17 @@ $1",
'action-suppressionlog' => 'бачыць гÑÑ‚Ñ‹ прыватны журнал',
'action-block' => 'блакаваць праўкі гÑтага ўдзельніка',
'action-protect' => 'мÑнÑць узровень аховы гÑтай Ñтаронкі',
+'action-rollback' => 'хутка адкаціць змены апошнÑга карыÑтальніка, Ñкі Ñ€Ñдагаваў Ñтаронку',
'action-import' => 'імпартаваць гÑтую Ñтаронку з іншай вікі',
'action-importupload' => 'імпартаваць гÑтую Ñтаронку з укладзенага файла',
'action-patrol' => 'значыць праўкі іншых Ñк ухваленыÑ',
'action-autopatrol' => 'атрымліваць знак ухваленаÑці на Ñвае праўкі',
'action-unwatchedpages' => 'бачыць ÑÐ¿Ñ–Ñ Ð½ÐµÐ½Ð°Ð·Ñ–Ñ€Ð°Ð½Ñ‹Ñ… Ñтаронак',
-'action-trackback' => 'падаваць Ñ‚Ñ€Ñк-бÑк',
'action-mergehistory' => "аб'Ñдноўваць гіÑторыю гÑтай Ñтаронкі",
'action-userrights' => 'мÑнÑць уÑе дазволы ўдзельніка',
'action-userrights-interwiki' => 'мÑнÑць дазволы ўдзельнікаў на іншых вікі',
'action-siteadmin' => 'зачынÑць Ñ– адчынÑць базу даных',
+'action-sendemail' => 'адпраўка Ñлектронных піÑем',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|мена|менаў}}',
@@ -1359,6 +1381,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|назіральнік|назіральнікаў}}]',
'rc_categories' => 'Ðбмежаваць катÑгорыÑмі (размÑжоўваць знакам "|")',
'rc_categories_any' => 'УÑе',
+'rc-change-size-new' => '$1 {{PLURAL:$1|байт|байта|байтаў}} паÑÐ»Ñ Ð·Ð¼ÐµÐ½Ñ‹',
'newsectionsummary' => '/* $1 */ новы падраздзел',
'rc-enhanced-expand' => 'Паказваць падрабÑзнаÑці (патрабуецца ЯваÑкрыпт)',
'rc-enhanced-hide' => 'Ðе паказваць падрабÑзнаÑцÑÑž',
@@ -1411,6 +1434,7 @@ $1",
'ignorewarnings' => 'Ігнараваць уÑе папÑÑ€Ñджанні',
'minlength1' => 'Ðазвы файлаў муÑÑць утрымліваць хоць 1 знак.',
'illegalfilename' => 'У назве файла «$1» Ñ‘Ñць Ñ‚Ð°ÐºÑ–Ñ Ð·Ð½Ð°ÐºÑ–, ÑÐºÑ–Ñ Ð½Ðµ дазвалÑюцца Ñž назвах Ñтаронак. Калі лаÑка, паÑпрабуйце ўклаÑці файл ізноў, але пад іншай назвай.',
+'filename-toolong' => 'Імёны файлаў не павінны перавышаць 240 байт.',
'badfilename' => 'Ðазва файла зменена на "$1".',
'filetype-mime-mismatch' => 'ПашырÑнне файла (".$1") не адпавÑдае заўважанаму тыпу MIME ($2).',
'filetype-badmime' => 'Ðе дазвалÑецца ўкладанне файлаў з тыпам MIME "$1".',
@@ -1496,6 +1520,41 @@ $1',
'upload-unknown-size' => 'ÐевÑдомы памер',
'upload-http-error' => 'Памылка HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Ðе атрымалаÑÑ Ñ‚Ñ€Ð°Ð½ÑлÑваць файл $1.',
+'backend-fail-backup' => 'Ðемагчыма зрабіць Ñ€Ñзервную копію $1.',
+'backend-fail-notexists' => 'Файл $1 не Ñ–Ñнуе.',
+'backend-fail-hashes' => 'Ðе ўдалоÑÑ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ñ†ÑŒ Ñ…Ñшы файлаў Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°ÑžÐ½Ð°Ð½Ð½Ñ.',
+'backend-fail-notsame' => 'Ужо Ñ–Ñнуе неідÑнтычны файл $1.',
+'backend-fail-invalidpath' => "$1 не з'ÑўлÑецца дапушчальным шлÑхам",
+'backend-fail-delete' => 'Ðе ўдалоÑÑ Ñцерці файл "$1".',
+'backend-fail-alreadyexists' => 'Файл $1 ужо Ñ–Ñнуе.',
+'backend-fail-store' => 'Ðе ўдалоÑÑ Ð·Ð°Ñ…Ð°Ð²Ð°Ñ†ÑŒ файл $1 на $2 .',
+'backend-fail-copy' => 'Ðе ўдалоÑÑ ÐºÐ°Ð¿Ñ–Ñ€Ð°Ð²Ð°Ñ†ÑŒ файл "$1" у "$2".',
+'backend-fail-move' => 'Ðе ўдалоÑÑ Ð¿ÐµÑ€Ð°Ð½ÐµÑці файл "$1" у "$2".',
+'backend-fail-opentemp' => 'Ðе атрымалаÑÑ Ð°Ð´ÐºÑ€Ñ‹Ñ†ÑŒ чаÑовы файл',
+'backend-fail-writetemp' => 'Ðе атрымалаÑÑ Ð·Ð°Ð¿Ñ–Ñаць чаÑовы файл',
+'backend-fail-closetemp' => 'Ðе атрымалаÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ†ÑŒ чаÑовы файл',
+'backend-fail-read' => 'Ðе атрымалаÑÑ Ð¿Ñ€Ð°Ñ‡Ñ‹Ñ‚Ð°Ñ†ÑŒ файл $1.',
+'backend-fail-create' => 'Ðе атрымалаÑÑ Ñтварыць файл $1.',
+'backend-fail-readonly' => 'Сервер Ñховішча «$1» у Ñ€Ñжыме толькі чытаннÑ. Прычына: «$2»',
+'backend-fail-synced' => 'Стан файла «$1» адрозніваецца ад Ñтану на ўнутраным Ñерверы Ñховішча',
+'backend-fail-connect' => 'Ðемагчыма далучыцца да Ñервера Ñховішча «$1».',
+'backend-fail-internal' => 'Узнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° на Ñерверы Ñховішча «$1».',
+'backend-fail-contenttype' => 'Ðемагчыма вызначыць тып змеÑту файла, Ñкі муÑіць быць захаваны Ñž «$1».',
+'backend-fail-batchsize' => 'Сервер Ñховішча атрымаў блок з $1 {{PLURAL:$1|файлавай аперацыі|файлавых аперацый|файлавых аперацый}}; абмежаванне Ñкладае $2',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ðе ўдалоÑÑ Ñ€Ð°Ð·Ð±Ð»Ð°ÐºÐ°Ð²Ð°Ñ†ÑŒ "$1"; ён не заблакаваны.',
+'lockmanager-fail-closelock' => 'Ðе ўдалоÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ†ÑŒ файл блакіроўкі Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-deletelock' => 'Ðе ўдалоÑÑ Ð²Ñ‹Ð´Ð°Ð»Ñ–Ñ†ÑŒ файл блакіроўкі Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-acquirelock' => 'Ðе ўдалоÑÑ Ð´Ð°Ð±Ñ–Ñ†Ñ†Ð° блакіроўкі Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-openlock' => 'Ðе ўдалоÑÑ Ð°Ð´ÐºÑ€Ñ‹Ñ†ÑŒ файл блакіроўкі Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-releaselock' => 'Ðе ўдалоÑÑ Ñ€Ð°Ð·Ð±Ð»Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ñ†ÑŒ "$1"',
+'lockmanager-fail-db-bucket' => 'Ðе атрымалаÑÑ Ð·Ð²Ñзацца з даÑтатковай колькаÑцю баз блакаваннÑÑž у Ñегменце $1.',
+'lockmanager-fail-db-release' => 'Ðе атрымалаÑÑ Ð·Ð½Ñць блакаванне базы дадзеных $1.',
+'lockmanager-fail-svr-release' => 'Ðе атрымалаÑÑ Ð·Ð½Ñць блакаванні на Ñерверы $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° пры адкрыцці файла Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÑ– архіва.',
'zip-wrong-format' => "Указаны файл не з'ÑўлÑецца файлам ZIP.",
@@ -1512,6 +1571,7 @@ $1',
'uploadstash-badtoken' => 'Ðе атрымалаÑÑ Ð²Ñ‹ÐºÐ°Ð½Ð°Ñ†ÑŒ Ð½Ð°Ð·Ð²Ð°Ð½Ñ‹Ñ Ð´Ð·ÐµÑнні. Магчыма, ÑкончыўÑÑ Ñ‚Ñрмін дзеÑÐ½Ð½Ñ Ð²Ð°ÑˆÐ°Ð³Ð° жÑтона бÑÑпекі. ПаÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð·.',
'uploadstash-errclear' => 'ÐчыÑтка файлаў не ўдалаÑÑ',
'uploadstash-refresh' => 'Ðбнавіць ÑпіÑак файлаў',
+'invalid-chunk-offset' => 'Ðедапушчальнае зрушÑнне фрагмента',
# img_auth script messages
'img-auth-accessdenied' => 'ДоÑтуп забаронены',
@@ -1613,23 +1673,24 @@ $1',
'filerevert-badversion' => 'ÐÑма ÑтарÑйшай тутÑйшай верÑÑ–Ñ– гÑтага файла з прапанаванай чаÑавай меткай.',
# File deletion
-'filedelete' => 'Выдаліць $1',
-'filedelete-legend' => 'Выдаліць файл',
-'filedelete-intro' => "Ð’Ñ‹ збіраецеÑÑ Ñцерці файл '''[[Media:$1|$1]]''' разам з уÑёй Ñго гіÑторыÑй.",
-'filedelete-intro-old' => "Ð’Ñ‹ Ñціраеце верÑÑ–ÑŽ '''[[Media:$1|$1]]''' з [$4 $3, $2].",
-'filedelete-comment' => 'Прычына:',
-'filedelete-submit' => 'Выдаліць',
-'filedelete-success' => "'''$1''' быў выдалены.",
-'filedelete-success-old' => "ВерÑÑ–Ñ '''[[Media:$1|$1]]''' з $3, $2 была ÑцёртаÑ.",
-'filedelete-nofile' => "ÐÑÑ–Ñны файл '''$1'''.",
-'filedelete-nofile-old' => "Ðе Ñ–Ñнуе архіўнай (ÑтарÑйшай) верÑÑ–Ñ– '''$1''' з такімі атрыбутамі.",
-'filedelete-otherreason' => 'ІншаÑ/Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°:',
-'filedelete-reason-otherlist' => 'Ð†Ð½ÑˆÐ°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°',
-'filedelete-reason-dropdown' => '*Ð—Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ñ‹ ÑціраннÑ
+'filedelete' => 'Выдаліць $1',
+'filedelete-legend' => 'Выдаліць файл',
+'filedelete-intro' => "Ð’Ñ‹ збіраецеÑÑ Ñцерці файл '''[[Media:$1|$1]]''' разам з уÑёй Ñго гіÑторыÑй.",
+'filedelete-intro-old' => "Ð’Ñ‹ Ñціраеце верÑÑ–ÑŽ '''[[Media:$1|$1]]''' з [$4 $3, $2].",
+'filedelete-comment' => 'Прычына:',
+'filedelete-submit' => 'Выдаліць',
+'filedelete-success' => "'''$1''' быў выдалены.",
+'filedelete-success-old' => "ВерÑÑ–Ñ '''[[Media:$1|$1]]''' з $3, $2 была ÑцёртаÑ.",
+'filedelete-nofile' => "ÐÑÑ–Ñны файл '''$1'''.",
+'filedelete-nofile-old' => "Ðе Ñ–Ñнуе архіўнай (ÑтарÑйшай) верÑÑ–Ñ– '''$1''' з такімі атрыбутамі.",
+'filedelete-otherreason' => 'ІншаÑ/Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°:',
+'filedelete-reason-otherlist' => 'Ð†Ð½ÑˆÐ°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°',
+'filedelete-reason-dropdown' => '*Ð—Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ñ‹ ÑціраннÑ
** ПарушÑнне аўтарÑкага права
** Дублікатны файл',
-'filedelete-edit-reasonlist' => 'Правіць прычыны ÑціраннÑ',
-'filedelete-maintenance' => 'ТымчаÑова Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ñ‹Ñ Ñціранне Ñ– аднаўленне файлаў (на Ñ‡Ð°Ñ Ñ‚Ñхнічнага абÑлугоўваннÑ).',
+'filedelete-edit-reasonlist' => 'Правіць прычыны ÑціраннÑ',
+'filedelete-maintenance' => 'ТымчаÑова Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ñ‹Ñ Ñціранне Ñ– аднаўленне файлаў (на Ñ‡Ð°Ñ Ñ‚Ñхнічнага абÑлугоўваннÑ).',
+'filedelete-maintenance-title' => 'Ðемагчыма выдаліць файл',
# MIME search
'mimesearch' => 'Пошук паводле змеÑту файла',
@@ -1726,6 +1787,8 @@ $1',
'wantedpages' => 'Вельмі патрÑÐ±Ð½Ñ‹Ñ Ñтаронкі',
'wantedpages-badtitle' => 'ÐÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° Ñž выніках: $1',
'wantedfiles' => 'ПатрÑÐ±Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹',
+'wantedfiletext-cat' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ выкарыÑтоўваюцца, але Ñ–Ñ… нÑма. Файлы Ñа знешніх Ñховішчаў могуць знаходзіцца Ñž ÑпіÑе без уліку Ñ–Ñ… Ñ–ÑнаваннÑ. Ð›ÑŽÐ±Ñ‹Ñ Ñ‚Ð°ÐºÑ–Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð¶Ð°Ð½Ð½Ñ– будуць <del>выкраÑленыÑ</del>. Дадаткова, Ñтаронкі, ÑÐºÑ–Ñ ÑžÐ±ÑƒÐ´Ð¾ÑžÐ²Ð°ÑŽÑ†ÑŒ неіÑÐ½ÑƒÑŽÑ‡Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ Ð¿Ñ€Ñ‹Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð½Ð° [[:$1]].',
+'wantedfiletext-nocat' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ выкарыÑтоўваюцца, але Ñ–Ñ… нÑма. Файлы Ñа знешніх Ñховішчаў могуць знаходзіцца Ñž ÑпіÑе без уліку Ñ–Ñ… Ñ–ÑнаваннÑ. Ð›ÑŽÐ±Ñ‹Ñ Ñ‚Ð°ÐºÑ–Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð¶Ð°Ð½Ð½Ñ– будуць <del>выкраÑленыÑ</del>.',
'wantedtemplates' => 'ПатрÑÐ±Ð½Ñ‹Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñ‹',
'mostlinked' => 'Старонкі, на ÑÐºÑ–Ñ Ð½Ð°Ð¹Ñ‡Ð°Ñцей ÑпаÑылаюцца',
'mostlinkedcategories' => 'КатÑгорыі з найбольшай колькаÑцю Ñкладнікаў',
@@ -1734,6 +1797,7 @@ $1',
'mostimages' => 'Ð’Ñ‹Ñвы Ñž чаÑтым выкарыÑтанні',
'mostrevisions' => 'Ðртыкулы з найбольшай колькаÑцю верÑій',
'prefixindex' => 'Старонкі з назвамі на ўзор',
+'prefixindex-namespace' => 'УÑе Ñтаронкі з прÑфікÑам ( $1 праÑтора імёнаў)',
'shortpages' => "Старонкі малога аб'ёму",
'longpages' => "Старонкі вÑлікага аб'ёму",
'deadendpages' => 'Старонкі без ÑпаÑылак',
@@ -1750,7 +1814,7 @@ $1',
'listusers-editsonly' => 'Толькі ўдзельнікі, ÑÐºÑ–Ñ Ð¼Ð°ÑŽÑ†ÑŒ праўкі',
'listusers-creationsort' => 'У парадку датаў ÑтварÑннÑ',
'usereditcount' => '$1 {{PLURAL:$1|праўка|праўкі}}',
-'usercreated' => 'Створана ў $2 $1',
+'usercreated' => ' {{GENDER:$3|ЗарÑгіÑтраваўÑÑ|ЗарÑгіÑтравалаÑÑ}} $1 в $2',
'newpages' => 'ÐÐ¾Ð²Ñ‹Ñ Ñтаронкі',
'newpages-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'ancientpages' => 'ÐайÑтарÑÐ¹ÑˆÑ‹Ñ Ñтаронкі',
@@ -1843,12 +1907,8 @@ $1',
'activeusers-noresult' => 'ÐÑма такіх удзельнікаў.',
# Special:Log/newusers
-'newuserlogpage' => 'Журнал Ñ€ÑгіÑтрацыі ўдзельнікаў',
-'newuserlogpagetext' => 'ГÑта журнал Ñ€ÑгіÑтрацыі новых удзельнікаў.',
-'newuserlog-byemail' => 'пароль адаÑланы Ñл.поштай',
-'newuserlog-create-entry' => 'Ðовы ўдзельнік',
-'newuserlog-create2-entry' => 'Ñтвораны новы рахунак $1',
-'newuserlog-autocreate-entry' => 'Рахунак Ñтвораны аўтаматычна',
+'newuserlogpage' => 'Журнал Ñ€ÑгіÑтрацыі ўдзельнікаў',
+'newuserlogpagetext' => 'ГÑта журнал Ñ€ÑгіÑтрацыі новых удзельнікаў.',
# Special:ListGroupRights
'listgrouprights' => 'Дазволы Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ удзельнікаў',
@@ -1877,7 +1937,7 @@ $1',
'emailpagetext' => 'Тут можна выÑлаць Ñл.пошту гÑтаму ўдзельніку.
ÐÐ´Ñ€Ð°Ñ Ñл.пошты, уведзены вамі Ñž [[Special:Preferences|Ñваіх наÑтаўленнÑÑ…]], з\'Ñвіцца Ñž полі "From" вашага ліÑта, Ñ– атрымальнік зможа адказаць на ваш ліÑÑ‚.',
'usermailererror' => "Паштовы аб'ект паведамлÑе пра памылку:",
-'defemailsubject' => 'Ñл.пошта {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} — ЛіÑÑ‚ ад $1',
'usermaildisabled' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° ўдзельніка не працуе',
'usermaildisabledtext' => 'Ð’Ñ‹ не можаце адпраўлÑць паведамленні Ñлектроннай пошты іншым карыÑтальнікам гÑтай вікі',
'noemailtitle' => 'ÐÑма адраÑа Ñлектроннай пошты',
@@ -1933,7 +1993,7 @@ $1',
'watchmethod-list' => 'правÑраем наÑўнаÑць нÑдаўніх правак Ñž назіраных Ñтаронках',
'watchlistcontains' => 'У вашым ÑпіÑе назіранага $1 {{PLURAL:$1|Ñтаронка|Ñтаронак}}.',
'iteminvalidname' => "Праблема Ñа Ñкладнікам '$1', Ð½ÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°...",
-'wlnote' => "ÐіжÑй паказан{{PLURAL:$1|а апошнÑе змÑненне|Ñ‹Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ '''$1''' змÑненнÑÑž}} за апошн{{PLURAL:$2|ÑŽÑŽ гадзіну|Ñ–Ñ '''$2''' гадзін}}.",
+'wlnote' => "ÐіжÑй {{PLURAL:$1|паказана апошнÑе $1 змена|паказаны Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ $1 змены|паказаны Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ $1 змен}} за {{PLURAL:$2|апошнюю|апошніÑ|апошніÑ}} '''$2''' {{plural:$2|гадзіну|гадзіны|гадзіны}}, на момант чаÑу $3 $4.",
'wlshowlast' => 'Паказваць Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ $1 гадз. $2 дзён $3',
'watchlist-options' => 'МагчымаÑці назіраннÑ',
@@ -1998,8 +2058,6 @@ $UNWATCHURL
'actionfailed' => 'Памылка дзеÑннÑ',
'deletedtext' => '"$1" было выдалена.
Бач $2 па журнал нÑдаўніх выдаленнÑÑž.',
-'deletedarticle' => 'Ñцёрты "[[$1]]"',
-'suppressedarticle' => 'падаўлены "[[$1]]"',
'dellogpage' => 'Журнал ÑціраннÑÑž',
'dellogpagetext' => 'ÐіжÑй паказаны ÑÐ¿Ñ–Ñ Ñамых нÑдаўніх ÑціраннÑÑž.',
'deletionlog' => 'журнал ÑціраннÑÑž',
@@ -2043,7 +2101,10 @@ $UNWATCHURL
'unprotectedarticle' => 'знÑÑ‚Ð°Ñ Ð°Ñ…Ð¾Ð²Ð° з "[[$1]]"',
'movedarticleprotection' => 'наÑтаўленні аховы перанеÑÐµÐ½Ñ‹Ñ Ð· "[[$2]]" у "[[$1]]"',
'protect-title' => 'Ðхова «$1»',
+'protect-title-notallowed' => 'ПраглÑд ÑƒÐ·Ñ€Ð¾ÑžÐ½Ñ Ð°Ñ…Ð¾Ð²Ñ‹ «$1»',
'prot_1movedto2' => '[[$1]] перанеÑена Ñž [[$2]]',
+'protect-badnamespace-title' => 'ПраÑтора імёнаў без аховы',
+'protect-badnamespace-text' => 'Старонкі Ñž гÑтай праÑторы імёнаў не могуць знаходзіцца пад аховай.',
'protect-legend' => 'Пацверджанне пачатку аховы',
'protectcomment' => 'Прычына:',
'protectexpiry' => 'Канчаецца:',
@@ -2063,6 +2124,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Толькі Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
'protect-summary-cascade' => 'каÑкад',
'protect-expiring' => 'Ñкончыцца $1 (UTC)',
+'protect-expiring-local' => 'канчацца $1',
'protect-expiry-indefinite' => 'бÑÑконца',
'protect-cascade' => 'КаÑкад - ахоўваць такÑама Ñ– ÑžÑе Ñ‚Ñ‹Ñ Ñтаронкі, Ñкі ўлучаюцца Ñž гÑтую.',
'protect-cantedit' => 'Ð’Ñ‹ не можаце змÑніць узроўню заÑÑ†ÐµÑ€Ð°Ð³Ð°Ð½Ð½Ñ Ð³Ñтай Ñтаронкі, таму што не маеце дазволу, каб правіць Ñе.',
@@ -2118,7 +2180,6 @@ $UNWATCHURL
'undeletereset' => 'Да пачатковага',
'undeleteinvert' => 'ПеравÑрнуць выбранае',
'undeletecomment' => 'Прычына:',
-'undeletedarticle' => 'адноўлены "[[$1]]"',
'undeletedrevisions' => 'Ðдноўлен{{PLURAL:$1|а 1 верÑÑ–Ñ|Ñ‹Ñ $1 верÑій}}',
'undeletedrevisions-files' => 'Ðдноўлен{{PLURAL:$1|а 1 верÑÑ–Ñ|Ñ‹Ñ $1 верÑій}} Ñ– {{PLURAL:$2|1 файл|$2 файлаў}}',
'undeletedfiles' => 'Ðдноўлен{{PLURAL:$1|Ñ‹ 1 файл|Ñ‹Ñ $1 файлаў}}',
@@ -2127,6 +2188,7 @@ $UNWATCHURL
Праверце пералік нÑдаўніх ÑціраннÑÑž Ñ– аднаўленнÑÑž у [[Special:Log/delete|журнале ÑціраннÑÑž]].",
'undelete-header' => 'Бач нÑдаўна ÑÑ†Ñ‘Ñ€Ñ‚Ñ‹Ñ Ñтаронкі Ñž [[Special:Log/delete|журнале ÑціраннÑÑž]].',
+'undelete-search-title' => 'Пошук выдаленых Ñтаронак',
'undelete-search-box' => 'ЗнайÑці Ñž Ñцёртых Ñтаронках',
'undelete-search-prefix' => 'Паказаць Ñтаронкі, пачынаючы з:',
'undelete-search-submit' => 'Шукаць',
@@ -2135,6 +2197,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'Ðемагчыма аднавіць верÑÑ–ÑŽ файла з адзнакай чаÑу $1: файл не Ñ–Ñнаваў перад Ñціраннем.',
'undelete-cleanup-error' => 'Памылка пры Ñціранні неўжыванага архіўнага файла "$1".',
'undelete-missing-filearchive' => 'Ðемагчыма аднавіць архіўны файл ID $1, таму што Ñго нÑма Ñž базе даных. Магчыма, Ñго ўжо аднавілі.',
+'undelete-error' => 'Памылка Ð°Ð´Ð½Ð°ÑžÐ»ÐµÐ½Ð½Ñ Ñтаронкі',
'undelete-error-short' => 'Памылка пры аднаўленні файла: $1',
'undelete-error-long' => 'Памылкі пры аднаўленні файла:
@@ -2255,6 +2318,7 @@ $1',
'blocklist-userblocks' => 'Схаваць блакіроўкі ўліковых запіÑаў',
'blocklist-tempblocks' => 'Схаваць чаÑÐ°Ð²Ñ‹Ñ Ð±Ð»Ð°ÐºÑ–Ñ€Ð¾ÑžÐºÑ–',
'blocklist-addressblocks' => 'Схаваць блакаванні аÑобных IP',
+'blocklist-rangeblocks' => 'Схаваць блакіроўкі дыÑпазонаў',
'blocklist-timestamp' => 'Дата/чаÑ',
'blocklist-target' => 'ÐœÑта',
'blocklist-expiry' => 'Канчаецца',
@@ -2277,6 +2341,7 @@ $1',
'unblocklink' => 'адблакаваць',
'change-blocklink' => 'змÑніць блок',
'contribslink' => 'уклад',
+'emaillink' => 'адправіць ліÑÑ‚',
'autoblocker' => 'Ðўтаматычны блок таму што вашым адраÑам IP нÑдаўна карыÑтаўÑÑ "[[User:$1|$1]]". Блакаванне $1\'s патлумачана так: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'Журнал блокаў',
'blocklog-showlog' => '{{GENDER:$1|ГÑÑ‚Ñ‹ ўдзельнік ужо блакіраваўÑÑ|ГÑта ўдзельніца ўжо блакіравалаÑÑ}} раней.
@@ -2398,9 +2463,6 @@ $1',
'movepage-page-moved' => 'Старонка $1 была перанеÑÐµÐ½Ð°Ñ Ñž $2.',
'movepage-page-unmoved' => 'Ðе ўдалоÑÑ Ð¿ÐµÑ€Ð°Ð½ÐµÑці Ñтаронку $1 у $2.',
'movepage-max-pages' => 'Быў перанеÑены дазволены макÑімум $1 {{PLURAL:$1|Ñтаронкі|Ñтаронак}} Ñ– больш аўтаматычных пераноÑаў не будзе.',
-'1movedto2' => '[[$1]] перанеÑена Ñž [[$2]]',
-'1movedto2_redir' => '[[$1]] перанеÑена Ñž [[$2]] з выдаленнем пераÑылкі',
-'move-redirect-suppressed' => 'пераÑылка не ÑтворанаÑ',
'movelogpage' => 'Журнал пераноÑаў',
'movelogpagetext' => 'ÐіжÑй падаецца ÑÐ¿Ñ–Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñаў Ñтаронак.',
'movesubpage' => '{{PLURAL:$1|Пад-Ñтаронка|Пад-Ñтаронкі}}',
@@ -2413,7 +2475,7 @@ $1',
Ужо Ñ–Ñнуе артыкул з мÑтавай назвай "[[:$1]]". Дык ці жадаеце Ñцерці Ñго, каб зрабіць меÑца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу?',
'delete_and_move_confirm' => 'Так, Ñцерці Ñтаронку',
-'delete_and_move_reason' => 'Сцёрта, каб зрабіць меÑца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу',
+'delete_and_move_reason' => 'Сцёрта, каб зрабіць меÑца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу "[[$1]]"',
'selfmove' => 'Ðазвы вытока Ñ– мÑÑ‚Ñ‹ Ñ‚Ð°ÐºÑ–Ñ ÑамыÑ; нельга пераноÑіць Ñтаронку Ñаму на ÑÑбе.',
'immobile-source-namespace' => 'Ðельга пераноÑіць Ñтаронкі Ñž праÑторы назваў "$1"',
'immobile-target-namespace' => 'Ðельга пераноÑіць Ñтаронкі Ñž праÑторы назваў "$1"',
@@ -2442,9 +2504,11 @@ $1',
Каб ÑкÑпартаваць Ñтаронкі, упішыце Ñ–Ñ… назвы, адну на радок, у Ñ‚ÑкÑтавым полі, што ніжÑй, Ñ– абазначце, ці жадаеце Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ð²ÐµÑ€ÑÑ–Ñ– разам Ñа Ñтарымі верÑÑ–Ñмі Ñ– з гіÑторыÑй правак, ці толькі Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ð· інфармацыÑй пра апошнюю праўку.
У апошнім выпадку можна карыÑтацца адмыÑловай формай ÑпаÑылкі Ñž выглÑдзе, напр., [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] Ð´Ð»Ñ "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'ЭкÑпартаваць уÑе Ñтаронкі',
'exportcuronly' => 'ЭкÑпартаваць толькі актуальную верÑÑ–ÑŽ, без поўнай гіÑторыі',
'exportnohistory' => "----
'''Увага:''' ÑкÑпартаванне поўнай гіÑторыі Ñтаронак праз гÑту форму было забаронена, каб не траціць магутнаÑці ÑÑ–ÑÑ‚Ñмы.",
+'exportlistauthors' => 'Уключыць поўны пералік удзельнікаў, ÑÐºÑ–Ñ ÑžÐ½ÐµÑлі ўклад Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð°Ð¹ Ñтаронкі',
'export-submit' => 'ЭкÑпартаваць',
'export-addcattext' => 'Дадаць Ñтаронкі з катÑгорыі:',
'export-addcat' => 'Дадаць',
@@ -2476,6 +2540,8 @@ $1',
'thumbnail_error' => 'Памылка пры ÑтварÑнні драбніцы: $1',
'djvu_page_error' => 'Старонка DjVu па-за інтÑрвалам',
'djvu_no_xml' => 'Ðе ўдалоÑÑ ÑžÐ·Ñць XML Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° DjVu',
+'thumbnail-temp-create' => 'Ðе ўдаецца Ñтварыць чаÑовы файл ÑÑкіза',
+'thumbnail-dest-create' => 'Ðе ўдаецца захаваць ÑÑкіз па меÑцы прызначÑннÑ',
'thumbnail_invalid_params' => 'ÐÑÐ¿Ñ€Ð°Ð²Ñ–Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ драбніцы',
'thumbnail_dest_directory' => 'Ðемагчыма Ñтварыць мÑтавую Ñ‚Ñчку',
'thumbnail_image-type' => 'Дадзены тып выÑвы не падтрымліваецца',
@@ -2520,6 +2586,11 @@ $1',
'import-upload' => 'УклаÑці Ð´Ð°Ð½Ñ‹Ñ XML',
'import-token-mismatch' => 'Згублены звеÑткі пра ÑеанÑ. ПаÑпрабуйце ізноў.',
'import-invalid-interwiki' => 'Ðемагчыма імпартаваць з гÑтай вікі.',
+'import-error-edit' => 'Старонка «$1» не была імпартавана раней, бо вам не дазволена Ñе Ñ€Ñдагаваць.',
+'import-error-create' => 'Старонка «$1» не была імпартавана раней, бо вам не дазволена Ñе Ñтвараць.',
+'import-error-interwiki' => 'Старонка «$1» не была імпартаванаÑ, таму што гÑÑ‚Ð°Ñ Ð½Ð°Ð·Ð²Ð° зарÑÐ·ÐµÑ€Ð²Ð°Ð²Ð°Ð½Ð°Ñ Ð´Ð»Ñ Ñ–Ð½Ñ‚Ñрвікі.',
+'import-error-special' => 'Старонка «$1» не была імпартаванаÑ, таму што Ñна належыць да ÑпецыÑльнай праÑторы назваў, Ñтаронкі Ñž Ñкой не дазволеныÑ.',
+'import-error-invalid' => 'Старонка «$1» не была Ñ–Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ð½Ð°Ñ Ð·-за нÑÑлушнаÑці назвы.',
# Import log
'importlogpage' => 'Журнал імпартаваннÑÑž',
@@ -2529,72 +2600,85 @@ $1',
'import-logentry-interwiki' => 'транÑ-вікавана $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|верÑÑ–Ñ|верÑій}} з $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-Ñ‚ÑÑÑ‚Ñ‹',
+'javascripttest-disabled' => 'ГÑта Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ.',
+'javascripttest-title' => 'Праводзіцца Ñ‚ÑÑтаванне $1',
+'javascripttest-pagetext-noframework' => 'ГÑта Ñтаронка зарÑзервавана Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку Ñ‚ÑÑтаў JavaScript',
+'javascripttest-pagetext-unknownframework' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð±Ñ–Ð±Ð»Ñ–ÑÑ‚Ñка Ñ‚ÑÑÑ‚Ð°Ð²Ð°Ð½Ð½Ñ Â«$1».',
+'javascripttest-pagetext-frameworks' => 'Калі лаÑка, выберыце адну з прапанаваных бібліÑÑ‚Ñк Ñ‚ÑÑтаваннÑ: $1',
+'javascripttest-pagetext-skins' => 'Выберыце афармленне Ð´Ð»Ñ Ñ‚ÑÑтаваннÑ:',
+'javascripttest-qunit-intro' => 'ГлÑдзіце [$1 дакументацыю па Ñ‚ÑÑтаванні] на mediawiki.org.',
+'javascripttest-qunit-heading' => 'Ðабор QUnit-Ñ‚ÑÑтаў Ð´Ð»Ñ MediaWiki JavaScript',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ваша ўлаÑÐ½Ð°Ñ Ñтаронка',
-'tooltip-pt-anonuserpage' => 'Старонка ўдзельніка Ð´Ð»Ñ Ñ‚Ð°Ð³Ð¾ IP, з Ñкога вы зараз працуеце',
-'tooltip-pt-mytalk' => 'Ваша Ñтаронка размоваў',
-'tooltip-pt-anontalk' => 'Размовы аб праўках, зробленых з гÑтага адраÑу IP',
-'tooltip-pt-preferences' => 'Свае наÑтáўленні',
-'tooltip-pt-watchlist' => 'Пералік Ñтаронак, за змÑненнÑмі Ñž Ñкіх вы Ñочыце',
-'tooltip-pt-mycontris' => 'Пералік вашага ўкладу',
-'tooltip-pt-login' => 'Уваходзіць у ÑÑ–ÑÑ‚Ñму неабавÑзкова, але Ð²Ð°Ñ Ð²ÐµÐ»ÑŒÐ¼Ñ– запрашаюць гÑтак зрабіць.',
-'tooltip-pt-anonlogin' => 'Ð’Ð°Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ°ÑŽÑ†ÑŒ уваходзіць у ÑÑ–ÑÑ‚Ñму, хоць гÑта Ñ– не абавÑзкова.',
-'tooltip-pt-logout' => 'ВыйÑці з ÑÑ–ÑÑ‚Ñмы',
-'tooltip-ca-talk' => 'Размовы пра змеÑÑ‚ гÑтай Ñтаронкі',
-'tooltip-ca-edit' => 'Старонку можна правіць; ужывайце папÑÑ€Ñдні паказ перад замацоўваннем.',
-'tooltip-ca-addsection' => 'Дадаць новы раздзел',
-'tooltip-ca-viewsource' => 'ГÑÑ‚Ð°Ñ Ñтаронка ахоўваецца, але можна паглÑдзець Ñе крынічны Ñ‚ÑкÑÑ‚.',
-'tooltip-ca-history' => 'Ð Ð°Ð½ÐµÐ¹ÑˆÑ‹Ñ Ð²ÐµÑ€ÑÑ–Ñ– гÑтай Ñтаронкі.',
-'tooltip-ca-protect' => 'ПаÑтавіць ахову на Ñтаронку',
-'tooltip-ca-unprotect' => 'ЗмÑніць ахову гÑтай Ñтаронкі',
-'tooltip-ca-delete' => 'Сцерці гÑтую Ñтаронку',
-'tooltip-ca-undelete' => 'Ðднавіць праўкі, Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð½Ð° гÑтай Ñтаронцы перад тым, Ñк Ñна была Ñцёрта',
-'tooltip-ca-move' => 'ПеранеÑці гÑтую Ñтаронку пад іншую назву',
-'tooltip-ca-watch' => 'Дадаць гÑтую Ñтаронку да Ñвайго ÑпіÑу назіраных Ñтаронак',
-'tooltip-ca-unwatch' => 'ВынÑць гÑтую Ñтаронку з вашага ÑпіÑу назіранага',
-'tooltip-search' => 'ЗнайÑці Ñž {{SITENAME}}',
-'tooltip-search-go' => 'ПерайÑці да Ñтаронкі з дакладна такой назвай, калі Ñ‚Ð°ÐºÐ°Ñ Ð½Ð°Ð¾Ð³ÑƒÐ» Ñ–Ñнуе',
-'tooltip-search-fulltext' => 'ЗнайÑці гÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚ у Ñ‚ÑкÑтах Ñтаронак',
-'tooltip-p-logo' => 'ÐŸÐµÑ€ÑˆÐ°Ñ Ñтаронка',
-'tooltip-n-mainpage' => 'Ðдкрыць Першую Ñтаронку',
-'tooltip-n-mainpage-description' => 'Ðаведайце галоўную Ñтаронку',
-'tooltip-n-portal' => 'Ðб гÑтым праекце, чым можна занÑцца, дзе што шукаць',
-'tooltip-n-currentevents' => 'Ðтрымаць інфармацыю пра Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ð´Ð·ÐµÑ–',
-'tooltip-n-recentchanges' => 'Пералік нÑдаўніх змÑненнÑÑž у вікÑе.',
-'tooltip-n-randompage' => 'Паказаць выпадковую Ñтаронку',
-'tooltip-n-help' => 'Дзе можна атрымаць тлумачÑнні.',
-'tooltip-t-whatlinkshere' => 'Ð¡Ð¿Ñ–Ñ Ð²Ñ–ÐºÑ–-Ñтаронак, што ÑпаÑылаюцца Ñюды',
-'tooltip-t-recentchangeslinked' => 'ÐÑÐ´Ð°ÑžÐ½Ñ–Ñ Ð¼ÐµÐ½Ñ‹ Ñž Ñтаронках, на ÑÐºÑ–Ñ ÑпаÑылаецца гÑÑ‚Ð°Ñ Ñтаронка',
-'tooltip-feed-rss' => 'RSS-Ñтрумень гÑтай Ñтаронкі',
-'tooltip-feed-atom' => 'Струмень навін Atom Ð´Ð»Ñ Ð³Ñтай Ñтаронкі',
-'tooltip-t-contributions' => 'Паказаць пералік укладаў гÑтага ўдзельніка',
-'tooltip-t-emailuser' => 'ÐдаÑлаць удзельніку ліÑÑ‚ Ñл.пошты',
-'tooltip-t-upload' => 'УклаÑці файлы',
-'tooltip-t-specialpages' => 'Пералік уÑÑ–Ñ… адмыÑловых Ñтаронак',
-'tooltip-t-print' => 'Ð”Ñ€ÑƒÐºÐ°Ð²Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ Ð³Ñтай Ñтаронкі',
-'tooltip-t-permalink' => 'ÐÑÐ·Ð¼ÐµÐ½Ð½Ð°Ñ ÑпаÑылка на гÑтую верÑÑ–ÑŽ Ñтаронкі',
-'tooltip-ca-nstab-main' => 'Паказаць улаÑна змеÑÑ‚ Ñтаронкі',
-'tooltip-ca-nstab-user' => 'Паказаць улаÑную Ñтаронку ўдзельніка',
-'tooltip-ca-nstab-media' => 'Паказаць Ñтаронку мультымедыйнага змеÑту',
-'tooltip-ca-nstab-special' => 'ГÑта адмыÑÐ»Ð¾Ð²Ð°Ñ Ñтаронка, Ñ– правіць Ñе нельга',
-'tooltip-ca-nstab-project' => 'Паказаць Ñтаронку праекта',
-'tooltip-ca-nstab-image' => 'Паказаць Ñтаронку файла',
-'tooltip-ca-nstab-mediawiki' => 'Паказаць інтÑрфейÑны Ñ‚ÑкÑÑ‚',
-'tooltip-ca-nstab-template' => 'Паказаць шаблон',
-'tooltip-ca-nstab-help' => 'Паказаць Ñтаронку даведкі',
-'tooltip-ca-nstab-category' => 'Паказаць Ñтаронку катÑгорыі',
-'tooltip-minoredit' => 'Падаць гÑтую праўку Ñк дробную',
-'tooltip-save' => 'Замацаваць Ñвае змÑненні',
-'tooltip-preview' => 'Паказаць, Ñкім будзе вынік — ужывайце перад замацоўваннем!',
-'tooltip-diff' => 'Паказаць, што вы мÑнÑеце Ñž Ñ‚ÑкÑце.',
-'tooltip-compareselectedversions' => 'Паказаць розніцу паміж Ð´Ð·Ð²ÑŽÐ¼Ñ Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ð¼Ñ– верÑÑ–Ñмі гÑтай Ñтаронкі.',
-'tooltip-watch' => 'ДапіÑаць Ñтаронку да ÑпіÑу назіранага',
-'tooltip-recreate' => 'Ðднавіць Ñтаронку, хоць Ñна Ñ– была Ñцёрта',
-'tooltip-upload' => 'Пачаць укладанне',
-'tooltip-rollback' => '"Ðдкат" адным клікам вÑртае Ñ‚ÑкÑÑ‚, Ñкі быў тут перад адной ці некалькімі праўкамі апошнÑга аўтара.',
-'tooltip-undo' => '"Ðдкат" Ñцірае гÑтую праўку Ñ– адкрывае Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð´Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñ€ÑдактарÑкае акно. Так можна упіÑваць тлумачÑнне адкату.',
-'tooltip-preferences-save' => 'Захаваць наÑтаўленні',
-'tooltip-summary' => 'Дайце кароткае апіÑанне',
+'tooltip-pt-userpage' => 'Ваша ўлаÑÐ½Ð°Ñ Ñтаронка',
+'tooltip-pt-anonuserpage' => 'Старонка ўдзельніка Ð´Ð»Ñ Ñ‚Ð°Ð³Ð¾ IP, з Ñкога вы зараз працуеце',
+'tooltip-pt-mytalk' => 'Ваша Ñтаронка размоваў',
+'tooltip-pt-anontalk' => 'Размовы аб праўках, зробленых з гÑтага адраÑу IP',
+'tooltip-pt-preferences' => 'Свае наÑтáўленні',
+'tooltip-pt-watchlist' => 'Пералік Ñтаронак, за змÑненнÑмі Ñž Ñкіх вы Ñочыце',
+'tooltip-pt-mycontris' => 'Пералік вашага ўкладу',
+'tooltip-pt-login' => 'Уваходзіць у ÑÑ–ÑÑ‚Ñму неабавÑзкова, але Ð²Ð°Ñ Ð²ÐµÐ»ÑŒÐ¼Ñ– запрашаюць гÑтак зрабіць.',
+'tooltip-pt-anonlogin' => 'Ð’Ð°Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ°ÑŽÑ†ÑŒ уваходзіць у ÑÑ–ÑÑ‚Ñму, хоць гÑта Ñ– не абавÑзкова.',
+'tooltip-pt-logout' => 'ВыйÑці з ÑÑ–ÑÑ‚Ñмы',
+'tooltip-ca-talk' => 'Размовы пра змеÑÑ‚ гÑтай Ñтаронкі',
+'tooltip-ca-edit' => 'Старонку можна правіць; ужывайце папÑÑ€Ñдні паказ перад замацоўваннем.',
+'tooltip-ca-addsection' => 'Дадаць новы раздзел',
+'tooltip-ca-viewsource' => 'ГÑÑ‚Ð°Ñ Ñтаронка ахоўваецца, але можна паглÑдзець Ñе крынічны Ñ‚ÑкÑÑ‚.',
+'tooltip-ca-history' => 'Ð Ð°Ð½ÐµÐ¹ÑˆÑ‹Ñ Ð²ÐµÑ€ÑÑ–Ñ– гÑтай Ñтаронкі.',
+'tooltip-ca-protect' => 'ПаÑтавіць ахову на Ñтаронку',
+'tooltip-ca-unprotect' => 'ЗмÑніць ахову гÑтай Ñтаронкі',
+'tooltip-ca-delete' => 'Сцерці гÑтую Ñтаронку',
+'tooltip-ca-undelete' => 'Ðднавіць праўкі, Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð½Ð° гÑтай Ñтаронцы перад тым, Ñк Ñна была Ñцёрта',
+'tooltip-ca-move' => 'ПеранеÑці гÑтую Ñтаронку пад іншую назву',
+'tooltip-ca-watch' => 'Дадаць гÑтую Ñтаронку да Ñвайго ÑпіÑу назіраных Ñтаронак',
+'tooltip-ca-unwatch' => 'ВынÑць гÑтую Ñтаронку з вашага ÑпіÑу назіранага',
+'tooltip-search' => 'ЗнайÑці Ñž {{SITENAME}}',
+'tooltip-search-go' => 'ПерайÑці да Ñтаронкі з дакладна такой назвай, калі Ñ‚Ð°ÐºÐ°Ñ Ð½Ð°Ð¾Ð³ÑƒÐ» Ñ–Ñнуе',
+'tooltip-search-fulltext' => 'ЗнайÑці гÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚ у Ñ‚ÑкÑтах Ñтаронак',
+'tooltip-p-logo' => 'ÐŸÐµÑ€ÑˆÐ°Ñ Ñтаронка',
+'tooltip-n-mainpage' => 'Ðдкрыць Першую Ñтаронку',
+'tooltip-n-mainpage-description' => 'Ðаведайце галоўную Ñтаронку',
+'tooltip-n-portal' => 'Ðб гÑтым праекце, чым можна занÑцца, дзе што шукаць',
+'tooltip-n-currentevents' => 'Ðтрымаць інфармацыю пра Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ð´Ð·ÐµÑ–',
+'tooltip-n-recentchanges' => 'Пералік нÑдаўніх змÑненнÑÑž у вікÑе.',
+'tooltip-n-randompage' => 'Паказаць выпадковую Ñтаронку',
+'tooltip-n-help' => 'Дзе можна атрымаць тлумачÑнні.',
+'tooltip-t-whatlinkshere' => 'Ð¡Ð¿Ñ–Ñ Ð²Ñ–ÐºÑ–-Ñтаронак, што ÑпаÑылаюцца Ñюды',
+'tooltip-t-recentchangeslinked' => 'ÐÑÐ´Ð°ÑžÐ½Ñ–Ñ Ð¼ÐµÐ½Ñ‹ Ñž Ñтаронках, на ÑÐºÑ–Ñ ÑпаÑылаецца гÑÑ‚Ð°Ñ Ñтаронка',
+'tooltip-feed-rss' => 'RSS-Ñтрумень гÑтай Ñтаронкі',
+'tooltip-feed-atom' => 'Струмень навін Atom Ð´Ð»Ñ Ð³Ñтай Ñтаронкі',
+'tooltip-t-contributions' => 'Паказаць пералік укладаў гÑтага ўдзельніка',
+'tooltip-t-emailuser' => 'ÐдаÑлаць удзельніку ліÑÑ‚ Ñл.пошты',
+'tooltip-t-upload' => 'УклаÑці файлы',
+'tooltip-t-specialpages' => 'Пералік уÑÑ–Ñ… адмыÑловых Ñтаронак',
+'tooltip-t-print' => 'Ð”Ñ€ÑƒÐºÐ°Ð²Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ Ð³Ñтай Ñтаронкі',
+'tooltip-t-permalink' => 'ÐÑÐ·Ð¼ÐµÐ½Ð½Ð°Ñ ÑпаÑылка на гÑтую верÑÑ–ÑŽ Ñтаронкі',
+'tooltip-ca-nstab-main' => 'Паказаць улаÑна змеÑÑ‚ Ñтаронкі',
+'tooltip-ca-nstab-user' => 'Паказаць улаÑную Ñтаронку ўдзельніка',
+'tooltip-ca-nstab-media' => 'Паказаць Ñтаронку мультымедыйнага змеÑту',
+'tooltip-ca-nstab-special' => 'ГÑта адмыÑÐ»Ð¾Ð²Ð°Ñ Ñтаронка, Ñ– правіць Ñе нельга',
+'tooltip-ca-nstab-project' => 'Паказаць Ñтаронку праекта',
+'tooltip-ca-nstab-image' => 'Паказаць Ñтаронку файла',
+'tooltip-ca-nstab-mediawiki' => 'Паказаць інтÑрфейÑны Ñ‚ÑкÑÑ‚',
+'tooltip-ca-nstab-template' => 'Паказаць шаблон',
+'tooltip-ca-nstab-help' => 'Паказаць Ñтаронку даведкі',
+'tooltip-ca-nstab-category' => 'Паказаць Ñтаронку катÑгорыі',
+'tooltip-minoredit' => 'Падаць гÑтую праўку Ñк дробную',
+'tooltip-save' => 'Замацаваць Ñвае змÑненні',
+'tooltip-preview' => 'Паказаць, Ñкім будзе вынік — ужывайце перад замацоўваннем!',
+'tooltip-diff' => 'Паказаць, што вы мÑнÑеце Ñž Ñ‚ÑкÑце.',
+'tooltip-compareselectedversions' => 'Паказаць розніцу паміж Ð´Ð·Ð²ÑŽÐ¼Ñ Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ð¼Ñ– верÑÑ–Ñмі гÑтай Ñтаронкі.',
+'tooltip-watch' => 'ДапіÑаць Ñтаронку да ÑпіÑу назіранага',
+'tooltip-watchlistedit-normal-submit' => 'Выдаліць Ð¿Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ñтаронкі',
+'tooltip-watchlistedit-raw-submit' => 'Ðбнавіць ÑÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½Ð½Ñ',
+'tooltip-recreate' => 'Ðднавіць Ñтаронку, хоць Ñна Ñ– была Ñцёрта',
+'tooltip-upload' => 'Пачаць укладанне',
+'tooltip-rollback' => '"Ðдкат" адным клікам вÑртае Ñ‚ÑкÑÑ‚, Ñкі быў тут перад адной ці некалькімі праўкамі апошнÑга аўтара.',
+'tooltip-undo' => '"Ðдкат" Ñцірае гÑтую праўку Ñ– адкрывае Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð´Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñ€ÑдактарÑкае акно. Так можна упіÑваць тлумачÑнне адкату.',
+'tooltip-preferences-save' => 'Захаваць наÑтаўленні',
+'tooltip-summary' => 'Дайце кароткае апіÑанне',
# Stylesheets
'common.css' => '/** CSS, упіÑаны Ñюды, будзе дзейнічаць на карыÑтальнікаў уÑÑ–Ñ… Ñвітаў */',
@@ -2664,9 +2748,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Журнал ухваленых',
'patrol-log-header' => 'Журнал ухваленых верÑій',
-'patrol-log-line' => 'пазначаны $1 з ліку $2 ухваленых $3',
-'patrol-log-auto' => '(аўтаматычна)',
-'patrol-log-diff' => 'верÑÑ–Ñ $1',
'log-show-hide-patrol' => '$1 журнал ухваленнÑÑž',
# Image deletion
@@ -2685,22 +2766,24 @@ $1',
'nextdiff' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð¿Ñ€Ð°ÑžÐºÐ° →',
# Media information
-'mediawarning' => "'''Увага''': у гÑтым тыпе файлаў бывае зламыÑны код, выкананне Ñкога можа паÑтавіць пад небÑÑпеку вашую ÑÑ–ÑÑ‚Ñму.",
-'imagemaxsize' => "ÐœÑжа памеру выÑваў:<br />''(на тлумачальных Ñтаронках)''",
-'thumbsize' => 'Памеры драбніцы:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|Ñтаронка|Ñтаронак}}',
-'file-info' => "аб'ём файла: $1, тып MIME: $2",
-'file-info-size' => "$1 × $2 кропак, аб'ём файла: $3, тып MIME: $4",
-'file-info-size-pages' => '$1 × $2 пікÑелÑÑž, памер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|Ñтаронка|Ñтаронкі|Ñтаронак}}',
-'file-nohires' => '<small>Без верÑÑ–Ñ– Ñž лепшым разрозненні.</small>',
-'svg-long-desc' => "файл SVG, намінальна $1 × $2 кропак, аб'ём файла: $3",
-'show-big-image' => 'Ðайлепшае разрозненне',
-'show-big-image-size' => '$1 × $2 піхелÑÑž',
-'file-info-gif-looped' => 'закальцаваныÑ',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|кадр|кадраў}}',
-'file-info-png-looped' => 'бÑÑконца',
-'file-info-png-repeat' => 'паўтараецца $1 {{PLURAL:$1|раз|разоў}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|кадр|кадраў}}',
+'mediawarning' => "'''Увага''': у гÑтым тыпе файлаў бывае зламыÑны код, выкананне Ñкога можа паÑтавіць пад небÑÑпеку вашую ÑÑ–ÑÑ‚Ñму.",
+'imagemaxsize' => "ÐœÑжа памеру выÑваў:<br />''(на тлумачальных Ñтаронках)''",
+'thumbsize' => 'Памеры драбніцы:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|Ñтаронка|Ñтаронак}}',
+'file-info' => "аб'ём файла: $1, тып MIME: $2",
+'file-info-size' => "$1 × $2 кропак, аб'ём файла: $3, тып MIME: $4",
+'file-info-size-pages' => '$1 × $2 пікÑелÑÑž, памер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|Ñтаронка|Ñтаронкі|Ñтаронак}}',
+'file-nohires' => 'Без верÑÑ–Ñ– Ñž лепшым разрозненні.',
+'svg-long-desc' => "файл SVG, намінальна $1 × $2 кропак, аб'ём файла: $3",
+'show-big-image' => 'Ðайлепшае разрозненне',
+'show-big-image-preview' => 'Памер пры папÑÑ€Ñднім праглÑдзе: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Іншы дазвол|Ð†Ð½ÑˆÑ‹Ñ Ð´Ð°Ð·Ð²Ð¾Ð»Ñ‹}}: $1.',
+'show-big-image-size' => '$1 × $2 піхелÑÑž',
+'file-info-gif-looped' => 'закальцаваныÑ',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|кадр|кадраў}}',
+'file-info-png-looped' => 'бÑÑконца',
+'file-info-png-repeat' => 'паўтараецца $1 {{PLURAL:$1|раз|разоў}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|кадр|кадраў}}',
# Special:NewFiles
'newimages' => 'ÐÐ¾Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹',
@@ -2714,6 +2797,13 @@ $1',
'bydate' => 'п. датаў',
'sp-newimages-showfrom' => 'Паказаць Ð½Ð¾Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹, пачынаючы з $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунды|$1 Ñекунд}}',
+'minutes' => '{{PLURAL:$1|$1 хвіліна|$1 хвіліны|$1 хвілін}}',
+'hours' => '{{PLURAL:$1|$1 гадзіна|$1 гадзіны|$1 гадзін}}',
+'days' => '{{PLURAL:$1|$1 дзень|$1 днÑ|$1 дзён}}',
+'ago' => '$1 назад',
+
# Bad image list
'bad_image_list' => 'Ðфармленне гÑтага такое:
@@ -3201,13 +3291,6 @@ $5
'scarytranscludefailed' => '[Ðе ўдалоÑÑ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ñ†ÑŒ шаблон Ð´Ð»Ñ $1]',
'scarytranscludetoolong' => '[Занадта доўгі URL]',
-# Trackbacks
-'trackbackbox' => 'ТрÑк-бÑкі Ð´Ð»Ñ Ð³Ñтай Ñтаронкі:<br />
-$1',
-'trackbackremove' => '([$1 Сцерці])',
-'trackbacklink' => 'ТрÑк-бÑк',
-'trackbackdeleteok' => 'ТрÑк-бÑк быў паÑпÑхова Ñцёрты.',
-
# Delete conflict
'deletedwhileediting' => "'''Увага''': гÑÑ‚Ð°Ñ Ñтаронка была Ñцёрта паÑÐ»Ñ Ñ‚Ð°Ð³Ð¾, Ñк вы пачалі з ёй працаваць!",
'confirmrecreate' => "Удзельнік [[User:$1|$1]] ([[User talk:$1|размова]]) Ñцёр гÑÑ‚Ñ‹ артыкул паÑÐ»Ñ Ñ‚Ð°Ð³Ð¾, Ñк вы пачалі працу з ім, падаўшы прычыну:
@@ -3285,6 +3368,9 @@ $1',
'watchlisttools-edit' => 'Паказаць назіранае',
'watchlisttools-raw' => 'Паказаць нефарматаванае назіранае',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|размовы]])',
+
# Core parser functions
'unknown_extension_tag' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° пашырÑÐ½Ð½Ñ "$1"',
'duplicate-defaultsort' => 'Увага: Ð¿Ñ€Ð°Ð´Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° ÑžÐ¿Ð°Ñ€Ð°Ð´ÐºÐ°Ð²Ð°Ð½Ð½Ñ "$2" замÑніла ранейшую такую клавішу "$1".',
@@ -3339,8 +3425,9 @@ MediaWiki раÑпаўÑюджваецца, ÑпадзеючыÑÑ Ð½Ð° прыд
# Special:SpecialPages
'specialpages' => 'ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі',
'specialpages-note' => '----
-* ÐÐ³ÑƒÐ»ÑŒÐ½Ñ‹Ñ Ð°Ð´Ð¼Ñ‹ÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі.
-* <strong class="mw-specialpagerestricted">ÐÐ±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ñ‹Ñ Ð°Ð´Ð¼Ñ‹ÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі.</strong>',
+* Ð—Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ Ð°Ð´Ð¼Ñ‹ÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі.
+* <span class="mw-specialpagerestricted">ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі з абмежаваным доÑтупам.</span>
+* <span class="mw-specialpagecached">ЗакÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ð°Ð´Ð¼Ñ‹ÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі (могуць быць ÑаÑтарÑлымі).</span>',
'specialpages-group-maintenance' => 'ЗвеÑткі аб працы',
'specialpages-group-other' => 'Ð†Ð½ÑˆÑ‹Ñ Ð°Ð´Ð¼Ñ‹ÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі',
'specialpages-group-login' => 'ПрадÑтаўленне / Ñ€ÑгіÑтрацыÑ',
@@ -3382,13 +3469,16 @@ MediaWiki раÑпаўÑюджваецца, ÑпадзеючыÑÑ Ð½Ð° прыд
'tags-hitcount' => '$1 {{PLURAL:$1|мена|менаў}}',
# Special:ComparePages
-'comparepages' => 'Параўнанне Ñтаронак',
-'compare-selector' => 'Параўнанне верÑій Ñтаронкі',
-'compare-page1' => 'Старонка 1',
-'compare-page2' => 'Старонка 2',
-'compare-rev1' => 'ВерÑÑ–Ñ 1',
-'compare-rev2' => 'ВерÑÑ–Ñ 2',
-'compare-submit' => 'Параўнаць',
+'comparepages' => 'Параўнанне Ñтаронак',
+'compare-selector' => 'Параўнанне верÑій Ñтаронкі',
+'compare-page1' => 'Старонка 1',
+'compare-page2' => 'Старонка 2',
+'compare-rev1' => 'ВерÑÑ–Ñ 1',
+'compare-rev2' => 'ВерÑÑ–Ñ 2',
+'compare-submit' => 'Параўнаць',
+'compare-invalid-title' => 'ÐÐ±Ñ€Ð°Ð½Ð°Ñ Ð²Ð°Ð¼Ñ– назва недапушчальнаÑ.',
+'compare-title-not-exists' => 'Ðе Ñ–Ñнуе названай вамі назвы.',
+'compare-revision-not-exists' => 'Паказанай вамі верÑÑ–Ñ– не Ñ–Ñнуе.',
# Database error messages
'dberr-header' => 'Праблема на плÑцоўцы',
@@ -3415,4 +3505,90 @@ MediaWiki раÑпаўÑюджваецца, ÑпадзеючыÑÑ Ð½Ð° прыд
'sqlite-has-fts' => '$1 з падтрымкай поўна-Ñ‚ÑкÑтавага пошуку',
'sqlite-no-fts' => '$1 без падтрымкі поўна-Ñ‚ÑкÑтавага пошуку',
+# New logging system
+'logentry-delete-delete' => '$1 выдаліў Ñтаронку $3',
+'logentry-delete-restore' => '$1 аднавіў Ñтаронку $3',
+'logentry-delete-event' => '$1 змÑніў бачнаÑць {{PLURAL:$5|$5 запіÑу журнала|$5 запіÑаў журнала|$5 запіÑаў журнала}} на $3: $4',
+'logentry-delete-revision' => '$1 змÑніў бачнаÑць {{PLURAL:$5|$5 верÑÑ–Ñ–|$5 верÑій|$5 верÑій}} на Ñтаронцы $3: $4',
+'logentry-delete-event-legacy' => '$1 змÑніў бачнаÑць запіÑаў журнала $3',
+'logentry-delete-revision-legacy' => '$1 змÑніў бачнаÑць верÑій на Ñтаронцы $3',
+'logentry-suppress-delete' => '$1 падавіў Ñтаронку $3',
+'logentry-suppress-event' => '$1 утойліва змÑніў бачнаÑць {{PLURAL:$5|$5 Ð·Ð°Ð¿Ñ–Ñ Ñ‡Ð°ÑопіÑа|$5 запіÑÑ‹ чаÑопіÑа |$5 запіÑаў чаÑопіÑа}} на $3: $4',
+'logentry-suppress-revision' => '$1 утойліва змÑніў бачнаÑць {{PLURAL:$5|$5 верÑÑ–ÑŽ|$5 верÑÑ–Ñ–|$5 верÑій}} на Ñтаронцы $3: $4',
+'logentry-suppress-event-legacy' => '$1 утойліва змÑніў бачнаÑць запіÑаў журнала $3',
+'logentry-suppress-revision-legacy' => '$1 утойліва змÑніў бачнаÑць верÑій на Ñтаронцы $3',
+'revdelete-content-hid' => 'змеÑÑ‚ Ñхаваны',
+'revdelete-summary-hid' => 'апіÑанне змены Ñхавана',
+'revdelete-uname-hid' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° Ñхавана',
+'revdelete-content-unhid' => 'змеÑÑ‚ адкрыты',
+'revdelete-summary-unhid' => 'апіÑанне змены адкрыта',
+'revdelete-uname-unhid' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° адкрыта',
+'revdelete-restricted' => 'паÑÑ‚Ð°ÑžÐ»ÐµÐ½Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ– на адмініÑтратараў',
+'revdelete-unrestricted' => 'знÑÑ‚Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ– з адмініÑтратараў',
+'logentry-move-move' => '$1 Ð¿ÐµÑ€Ð°Ð½Ñ‘Ñ Ñтаронку $3 у $4',
+'logentry-move-move-noredirect' => '$1 Ð¿ÐµÑ€Ð°Ð½Ñ‘Ñ Ñтаронку $3 у $4 без Ð¿Ð°ÐºÑ–Ð´Ð°Ð½Ð½Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ',
+'logentry-move-move_redir' => '$1 пераназваў Ñтаронку $3 у $4 па-над перанакіраваннем',
+'logentry-move-move_redir-noredirect' => '$1 пераназваў Ñтаронку $3 у $4 па-над перанакіраваннем Ñ– без Ð¿Ð°ÐºÑ–Ð´Ð°Ð½Ð½Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ',
+'logentry-patrol-patrol' => '$1 адпатрулÑваў верÑÑ–ÑŽ $4 Ñтаронкі $3',
+'logentry-patrol-patrol-auto' => '$1 аўтаматычна адпатрулÑваў верÑÑ–ÑŽ $4 Ñтаронкі $3',
+'logentry-newusers-newusers' => '$1 Ñтварыў уліковы Ð·Ð°Ð¿Ñ–Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
+'logentry-newusers-create' => '$1 Ñтварыў уліковы Ð·Ð°Ð¿Ñ–Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
+'logentry-newusers-create2' => '$1 Ñтварыў уліковы Ð·Ð°Ð¿Ñ–Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° $3',
+'logentry-newusers-autocreate' => 'Ðўтаматычна Ñтвораны ўліковы Ð·Ð°Ð¿Ñ–Ñ $1',
+'newuserlog-byemail' => 'пароль адаÑланы Ñл.поштай',
+
+# Feedback
+'feedback-bugornote' => 'Калі вы Ð³Ð°Ñ‚Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ð´Ñ€Ð°Ð±Ñзна апіÑаць Ñ‚Ñхнічную праблему, калі лаÑка, [$1 паведаміце пра памылку].
+У адваротным выпадку вы можаце выкарыÑтоўваць гÑтую проÑтую форму. Ваш каментар будзе дададзены на Ñтаронку «[$3 $2]» разам з вашым імем удзельніка Ñ– выкарыÑтоўваемым браўзерам.',
+'feedback-subject' => 'ТÑма:',
+'feedback-message' => 'Паведамленне',
+'feedback-cancel' => 'Ðдмена',
+'feedback-submit' => 'ДаÑлаць водгук',
+'feedback-adding' => 'Даданне водгуку на Ñтаронку…',
+'feedback-error1' => 'Памылка. ÐевÑдомы вынік з API',
+'feedback-error2' => 'Памылка. Збой праўкі',
+'feedback-error3' => 'Памылка. ÐÑма адказу ад API',
+'feedback-thanks' => 'ДзÑкуй! Ваш водгук размешчаны на Ñтаронцы «[$2 $1]».',
+'feedback-close' => 'Зроблена.',
+'feedback-bugcheck' => 'Выдатна! Толькі праверце, што Ñž ÑпіÑе [$1 вÑдомых памылак] Ñе нÑма падобнага запіÑу.',
+'feedback-bugnew' => 'Я праверыў. Паведаміць пра новую памылку',
+
+# API errors
+'api-error-badaccess-groups' => 'У Ð’Ð°Ñ Ð½Ñма дазволу загружаць файлы Ñž гÑтую вікі.',
+'api-error-badtoken' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: нÑÑлушны ключ.',
+'api-error-copyuploaddisabled' => 'Загрузка з URL-адраÑу Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð½Ð° гÑтым Ñерверы.',
+'api-error-duplicate' => 'Ужо {{PLURAL:$1|Ñ–Ñнуе [$2 іншы файл]|Ñ–Ñнуюць [$2 Ñ–Ð½ÑˆÑ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹]}} з такім жа змеÑтам.',
+'api-error-duplicate-archive' => 'Раней на Ñайце {{PLURAL:$1|ўжо быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа змеÑтам, але {{PLURAL:$1|ён быў выдалены|Ñны былі выдаленыÑ}}.',
+'api-error-duplicate-archive-popup-title' => 'Дублікаты {{PLURAL:$1|файла, Ñкі ўжо быў выдалены|файлаў, ÑÐºÑ–Ñ ÑžÐ¶Ð¾ былі выдаленыÑ}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|ІдÑнтычны файл|ІдÑÐ½Ñ‚Ñ‹Ñ‡Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹}}',
+'api-error-empty-file' => 'ДаÑланы Вамі файл быў пуÑÑ‚Ñ‹.',
+'api-error-emptypage' => 'СтварÑнне новых пуÑÑ‚Ñ‹Ñ… Ñтаронак забаронена.',
+'api-error-fetchfileerror' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° штоÑьці здарылаÑÑ.',
+'api-error-file-too-large' => 'ДаÑланы Вамі файл занадта вÑлікі.',
+'api-error-filename-tooshort' => 'Ð†Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° занадта кароткае.',
+'api-error-filetype-banned' => 'ГÑÑ‚Ñ‹ тып файлаў забаронены.',
+'api-error-filetype-missing' => 'У файла нÑма пашырÑннÑ.',
+'api-error-hookaborted' => 'Прапанаванае вамі змÑненне было адменена Ñž апрацоўшчыку пашырÑннÑ.',
+'api-error-http' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: немагчыма далучыцца да Ñервера.',
+'api-error-illegal-filename' => 'Ð†Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° не дапуÑкаецца.',
+'api-error-internal-error' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð°Ð¿Ñ€Ð°Ñ†Ð¾ÑžÐºÑ– Вашага файла штоÑьці здарылаÑÑ.',
+'api-error-invalid-file-key' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: не быў знойдзены чаÑовы файл.',
+'api-error-missingparam' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: запыт бракуе параметраў.',
+'api-error-missingresult' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: немагчыма вызначыць, ці паÑпÑхова зробленае капіÑванне.',
+'api-error-mustbeloggedin' => 'Ð”Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÑ– файлаў неабходна ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму.',
+'api-error-mustbeposted' => 'Памылка гÑтага праграмнага забеÑпÑчÑннÑ; Ñно не выкарыÑтоўвае Ñлушны HTTP-метад.',
+'api-error-noimageinfo' => 'Файл загружаны, але Ñервер не даў пра Ñго ніÑкай інфармацыі.',
+'api-error-nomodule' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: не выбраны модуль загрузкі.',
+'api-error-ok-but-empty' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: нÑма адказу ад Ñервера.',
+'api-error-overwrite' => 'Замена Ñ–Ñнуючага файла не дапуÑкаецца.',
+'api-error-stashfailed' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ñервер не змог захаваць чаÑовы файл.',
+'api-error-timeout' => 'Сервер не адказаў у чаканы Ñ‚Ñрмін.',
+'api-error-unclassified' => 'Узнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°',
+'api-error-unknown-code' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: «$1».',
+'api-error-unknown-error' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÑ– файла здарылаÑÑ ÑˆÑ‚Ð¾Ñьці невÑдомае.',
+'api-error-unknown-warning' => 'ÐевÑдомае папÑÑ€Ñджанне: $1',
+'api-error-unknownerror' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: «$1».',
+'api-error-uploaddisabled' => 'Загрузка Ñž гÑтую вікі адключанаÑ.',
+'api-error-verification-error' => 'ГÑÑ‚Ñ‹ файл можа быць пашкоджаны, ці мае нÑÑлушнае пашырÑнне.',
+
);
diff --git a/languages/messages/MessagesBe_tarask.php b/languages/messages/MessagesBe_tarask.php
index 69a621d9..ad247f83 100644
--- a/languages/messages/MessagesBe_tarask.php
+++ b/languages/messages/MessagesBe_tarask.php
@@ -16,6 +16,7 @@
* @author Renessaince
* @author Wizardist
* @author Zedlik
+ * @author ТеÑÑ‚
*/
$bookstoreList = array(
@@ -38,121 +39,121 @@ $dateFormats = array(
);
$magicWords = array(
- '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', 'БЯГУЧЫ_МЕСЯЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ÐÐЗВÐ_БЯГУЧÐГÐ_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ÐÐЗВÐ_БЯГУЧÐГÐ_МЕСЯЦÐ_ÐŽ_РОДÐЫМ_СКЛОÐЕ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'СКÐРОЧÐÐÐЯ_ÐÐЗВÐ_БЯГУЧÐГÐ_МЕСЯЦÐ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'БЯГУЧЫ_ДЗЕÐЬ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'БЯГУЧЫ_ДЗЕÐЬ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ÐÐЗВÐ_БЯГУЧÐГÐ_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'БЯГУЧЫ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'БЯГУЧЫ_ЧÐС', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'БЯГУЧÐЯ_ГÐДЗІÐÐ', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ЛЯКÐЛЬÐЫ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_МЕСЯЦÐ_ÐŽ_РОДÐЫМ_СКЛОÐЕ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'СКÐРОЧÐÐÐЯ_ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_МЕСЯЦÐ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ЛЯКÐЛЬÐЫ_ДЗЕÐЬ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ЛЯКÐЛЬÐЫ_ДЗЕÐЬ_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_ДÐЯ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ЛЯКÐЛЬÐЫ_ГОД', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ЛЯКÐЛЬÐЫ_ЧÐС', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ЛЯКÐЛЬÐÐЯ_ГÐДЗІÐÐ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'КОЛЬКÐСЬЦЬ_СТÐРОÐÐК', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'КОЛЬКÐСЬЦЬ_ÐРТЫКУЛÐÐŽ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'КОЛЬКÐСЬЦЬ_ФÐЙЛÐÐŽ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'КОЛЬКÐСЬЦЬ_УДЗЕЛЬÐІКÐÐŽ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'КОЛЬКÐСЬЦЬ_ÐКТЫЎÐЫХ_УДЗЕЛЬÐІКÐÐŽ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'КОЛЬКÐСЬЦЬ_РЭДÐГÐÐ’ÐÐЬÐЯЎ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'КОЛЬКÐСЬЦЬ_ПРÐГЛЯДÐÐŽ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐБМЕРКÐÐ’ÐÐЬÐЯ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐБМЕРКÐÐ’ÐÐЬÐЯ_2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ПРÐДМЕТУ', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐРТЫКУЛÐ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ПРÐДМЕТУ_2', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐРТЫКУЛÐ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ПОЎÐÐЯ_ÐÐЗВÐ_СТÐРОÐКІ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ПОЎÐÐЯ_ÐÐЗВÐ_СТÐРОÐКІ_2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ÐÐЗВÐ_ПÐДСТÐРОÐКІ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ÐÐЗВÐ_ПÐДСТÐРОÐКІ_2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ÐÐЗВÐ_БÐЗÐÐ’ÐЙ_СТÐРОÐКІ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ÐÐЗВÐ_БÐЗÐÐ’ÐЙ_СТÐРОÐКІ_2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐБМЕРКÐÐ’ÐÐЬÐЯ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐБМЕРКÐÐ’ÐÐЬÐЯ_2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ПРÐДМЕТУ', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐРТЫКУЛÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ПРÐДМЕТУ_2', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐРТЫКУЛÐ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'ПÐВЕДÐМЛЕÐЬÐЕ:', 'MSG:' ),
- 'subst' => array( '0', 'ПÐДСТÐÐОЎКÐ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'ПÐВЕДÐМЛЕÐЬÐЕ_БЯЗЬ_ВІКІ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'значак', 'міні', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'значак=$1', 'міні=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'зьлева', 'left' ),
- 'img_none' => array( '1', 'нÑма', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1px' ),
- 'img_center' => array( '1', 'цÑнтар', 'center', 'centre' ),
- 'img_framed' => array( '1', 'рамка', 'framed', 'enframed', 'frame' ),
- 'img_page' => array( '1', 'Ñтаронка=$1', 'Ñтаронка $1', 'page=$1', 'page $1' ),
- 'img_top' => array( '1', 'зьверху', 'top' ),
- 'img_middle' => array( '1', 'паÑÑÑ€Ñдзіне', 'middle' ),
- 'img_bottom' => array( '1', 'зьнізу', 'bottom' ),
- 'img_link' => array( '1', 'ÑпаÑылка=$1', 'link=$1' ),
- 'sitename' => array( '1', 'ÐÐЗВÐ_СÐЙТУ', 'SITENAME' ),
- 'ns' => array( '0', 'ПÐ:', 'NS:' ),
- 'localurl' => array( '0', 'ЛЯКÐЛЬÐЫ_ÐДРÐС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛЯКÐЛЬÐЫ_ÐДРÐС_2:', 'LOCALURLE:' ),
- 'server' => array( '0', 'СЭРВЭР', 'SERVER' ),
- 'servername' => array( '0', 'ÐÐЗВÐ_СЭРВЭРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ШЛЯХ_ДÐ_СКРЫПТÐ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ГРÐÐœÐТЫКÐ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__ÐЕ_КÐÐВЭРТÐÐ’ÐЦЬ_ÐÐЗВУ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__ÐЕ_КÐÐВЭРТÐÐ’ÐЦЬ_ТЭКСТ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'БЯГУЧЫ_ТЫДЗЕÐЬ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'БЯГУЧЫ_ДЗЕÐЬ_ТЫДÐЯ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ЛЯКÐЛЬÐЫ_ТЫДЗЕÐЬ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ЛЯКÐЛЬÐЫ_ДЗЕÐЬ_ТЫДÐЯ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ID_ВЭРСІІ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЗЕÐЬ_ВЭРСІІ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЗЕÐЬ_ВЭРСІІ_2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МЕСЯЦ_ВЭРСІІ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ГОД_ВЭРСІІ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'МОМÐÐТ_ЧÐСУ_ВЭРСІІ', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'ÐœÐОЖÐЫ_ЛІК:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПОЎÐЫ_ÐДРÐС:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ПОЎÐЫ_ÐДРÐС_2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ПЕРШÐЯ_ЛІТÐРÐ_ÐœÐЛÐЯ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ПЕРШÐЯ_ЛІТÐРÐ_ВЯЛІКÐЯ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'ÐœÐЛЫМІ_ЛІТÐРÐМІ:', 'LC:' ),
- 'uc' => array( '0', 'ВЯЛІКІМІ_ЛІТÐРÐМІ:', 'UC:' ),
- 'raw' => array( '0', 'ÐЕÐПРÐЦÐÐ’ÐÐЫ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ПÐКÐЗВÐЦЬ_ÐÐЗВУ', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Ð', 'R' ),
- 'newsectionlink' => array( '1', '__СПÐСЫЛКÐ_ÐÐ_ÐОВУЮ_СЭКЦЫЮ__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'БЯГУЧÐЯ_ВЭРСІЯ', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'МОМÐÐТ_ЧÐСУ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ЛЯКÐЛЬÐЫ_МОМÐÐТ_ЧÐСУ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'СЫМБÐЛЬ_ÐÐПРÐМКУ_ПІСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#МОВÐ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'МОВÐ_ЗЬМЕСТУ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'КОЛЬКÐСЬЦЬ_СТÐРОÐÐК_У_ПРÐСТОРЫ_ÐÐЗВÐÐŽ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'КОЛЬКÐСЬЦЬ_ÐДМІÐІСТРÐТÐРÐÐŽ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ФÐРМÐТÐÐ’ÐЦЬ_ЛІК', 'FORMATNUM' ),
- 'defaultsort' => array( '1', 'СÐРТЫРОЎКÐ_ПÐ_ЗМОЎЧВÐÐЬÐІ:', 'КЛЮЧ_СÐРТЫРОЎКІ_ПÐ_ЗМОЎЧВÐÐЬÐІ:', 'СÐРТЫРОЎКÐ_ÐŽ_КÐТЭГОРЫІ_ПÐ_ЗМОЎЧВÐÐЬÐІ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ШЛЯХ_ДÐ_ФÐЙЛÐ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'Ñ‚Ñг', 'tag' ),
- 'hiddencat' => array( '1', '__СХÐÐ’ÐЦЬ_КÐТЭГОРЫЮ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'КОЛЬКÐСЬЦЬ_СТÐРОÐÐК_У_КÐТЭГОРЫІ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ПÐМЕР_СТÐРОÐКІ', 'PAGESIZE' ),
- 'staticredirect' => array( '1', '__СТÐТЫЧÐÐЕ_ПЕРÐÐÐКІРÐÐ’ÐÐЬÐЕ__', '__STATICREDIRECT__' ),
+ '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', 'БЯГУЧЫ_МЕСЯЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ÐÐЗВÐ_БЯГУЧÐГÐ_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐÐЗВÐ_БЯГУЧÐГÐ_МЕСЯЦÐ_ÐŽ_РОДÐЫМ_СКЛОÐЕ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'СКÐРОЧÐÐÐЯ_ÐÐЗВÐ_БЯГУЧÐГÐ_МЕСЯЦÐ', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'БЯГУЧЫ_ДЗЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'БЯГУЧЫ_ДЗЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐÐЗВÐ_БЯГУЧÐГÐ_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'БЯГУЧЫ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'БЯГУЧЫ_ЧÐС', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'БЯГУЧÐЯ_ГÐДЗІÐÐ', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ЛЯКÐЛЬÐЫ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_МЕСЯЦÐ_ÐŽ_РОДÐЫМ_СКЛОÐЕ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'СКÐРОЧÐÐÐЯ_ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_МЕСЯЦÐ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ЛЯКÐЛЬÐЫ_ДЗЕÐЬ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ЛЯКÐЛЬÐЫ_ДЗЕÐЬ_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ÐÐЗВÐ_ЛЯКÐЛЬÐÐГÐ_ДÐЯ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ЛЯКÐЛЬÐЫ_ГОД', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ЛЯКÐЛЬÐЫ_ЧÐС', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ЛЯКÐЛЬÐÐЯ_ГÐДЗІÐÐ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'КОЛЬКÐСЬЦЬ_СТÐРОÐÐК', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'КОЛЬКÐСЬЦЬ_ÐРТЫКУЛÐÐŽ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'КОЛЬКÐСЬЦЬ_ФÐЙЛÐÐŽ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'КОЛЬКÐСЬЦЬ_УДЗЕЛЬÐІКÐÐŽ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'КОЛЬКÐСЬЦЬ_ÐКТЫЎÐЫХ_УДЗЕЛЬÐІКÐÐŽ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'КОЛЬКÐСЬЦЬ_РЭДÐГÐÐ’ÐÐЬÐЯЎ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'КОЛЬКÐСЬЦЬ_ПРÐГЛЯДÐÐŽ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐБМЕРКÐÐ’ÐÐЬÐЯ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐБМЕРКÐÐ’ÐÐЬÐЯ_2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ПРÐДМЕТУ', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐРТЫКУЛÐ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ПРÐДМЕТУ_2', 'ПРÐСТОРÐ_ÐÐЗВÐÐŽ_ÐРТЫКУЛÐ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ПОЎÐÐЯ_ÐÐЗВÐ_СТÐРОÐКІ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ПОЎÐÐЯ_ÐÐЗВÐ_СТÐРОÐКІ_2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ÐÐЗВÐ_ПÐДСТÐРОÐКІ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ÐÐЗВÐ_ПÐДСТÐРОÐКІ_2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ÐÐЗВÐ_БÐЗÐÐ’ÐЙ_СТÐРОÐКІ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ÐÐЗВÐ_БÐЗÐÐ’ÐЙ_СТÐРОÐКІ_2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐБМЕРКÐÐ’ÐÐЬÐЯ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐБМЕРКÐÐ’ÐÐЬÐЯ_2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ПРÐДМЕТУ', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐРТЫКУЛÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐРОÐКІ_ПРÐДМЕТУ_2', 'ÐÐЗВÐ_СТÐРОÐКІ_ÐРТЫКУЛÐ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'ПÐВЕДÐМЛЕÐЬÐЕ:', 'MSG:' ),
+ 'subst' => array( '0', 'ПÐДСТÐÐОЎКÐ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'ПÐВЕДÐМЛЕÐЬÐЕ_БЯЗЬ_ВІКІ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'значак', 'міні', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'значак=$1', 'міні=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'зьлева', 'left' ),
+ 'img_none' => array( '1', 'нÑма', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'цÑнтар', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'рамка', 'framed', 'enframed', 'frame' ),
+ 'img_page' => array( '1', 'Ñтаронка=$1', 'Ñтаронка $1', 'page=$1', 'page $1' ),
+ 'img_top' => array( '1', 'зьверху', 'top' ),
+ 'img_middle' => array( '1', 'паÑÑÑ€Ñдзіне', 'middle' ),
+ 'img_bottom' => array( '1', 'зьнізу', 'bottom' ),
+ 'img_link' => array( '1', 'ÑпаÑылка=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'ÐÐЗВÐ_СÐЙТУ', 'SITENAME' ),
+ 'ns' => array( '0', 'ПÐ:', 'NS:' ),
+ 'localurl' => array( '0', 'ЛЯКÐЛЬÐЫ_ÐДРÐС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛЯКÐЛЬÐЫ_ÐДРÐС_2:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'СЭРВЭР', 'SERVER' ),
+ 'servername' => array( '0', 'ÐÐЗВÐ_СЭРВЭРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ШЛЯХ_ДÐ_СКРЫПТÐ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ГРÐÐœÐТЫКÐ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__ÐЕ_КÐÐВЭРТÐÐ’ÐЦЬ_ÐÐЗВУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ÐЕ_КÐÐВЭРТÐÐ’ÐЦЬ_ТЭКСТ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'БЯГУЧЫ_ТЫДЗЕÐЬ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'БЯГУЧЫ_ДЗЕÐЬ_ТЫДÐЯ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ЛЯКÐЛЬÐЫ_ТЫДЗЕÐЬ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ЛЯКÐЛЬÐЫ_ДЗЕÐЬ_ТЫДÐЯ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ID_ВЭРСІІ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЗЕÐЬ_ВЭРСІІ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЗЕÐЬ_ВЭРСІІ_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЯЦ_ВЭРСІІ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ГОД_ВЭРСІІ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'МОМÐÐТ_ЧÐСУ_ВЭРСІІ', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'ÐœÐОЖÐЫ_ЛІК:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПОЎÐЫ_ÐДРÐС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПОЎÐЫ_ÐДРÐС_2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ПЕРШÐЯ_ЛІТÐРÐ_ÐœÐЛÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ПЕРШÐЯ_ЛІТÐРÐ_ВЯЛІКÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ÐœÐЛЫМІ_ЛІТÐРÐМІ:', 'LC:' ),
+ 'uc' => array( '0', 'ВЯЛІКІМІ_ЛІТÐРÐМІ:', 'UC:' ),
+ 'raw' => array( '0', 'ÐЕÐПРÐЦÐÐ’ÐÐЫ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ПÐКÐЗВÐЦЬ_ÐÐЗВУ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Ð', 'R' ),
+ 'newsectionlink' => array( '1', '__СПÐСЫЛКÐ_ÐÐ_ÐОВУЮ_СЭКЦЫЮ__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'БЯГУЧÐЯ_ВЭРСІЯ', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'МОМÐÐТ_ЧÐСУ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ЛЯКÐЛЬÐЫ_МОМÐÐТ_ЧÐСУ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'СЫМБÐЛЬ_ÐÐПРÐМКУ_ПІСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#МОВÐ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'МОВÐ_ЗЬМЕСТУ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'КОЛЬКÐСЬЦЬ_СТÐРОÐÐК_У_ПРÐСТОРЫ_ÐÐЗВÐÐŽ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'КОЛЬКÐСЬЦЬ_ÐДМІÐІСТРÐТÐРÐÐŽ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ФÐРМÐТÐÐ’ÐЦЬ_ЛІК', 'FORMATNUM' ),
+ 'defaultsort' => array( '1', 'СÐРТЫРОЎКÐ_ПÐ_ЗМОЎЧВÐÐЬÐІ:', 'КЛЮЧ_СÐРТЫРОЎКІ_ПÐ_ЗМОЎЧВÐÐЬÐІ:', 'СÐРТЫРОЎКÐ_ÐŽ_КÐТЭГОРЫІ_ПÐ_ЗМОЎЧВÐÐЬÐІ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ШЛЯХ_ДÐ_ФÐЙЛÐ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'Ñ‚Ñг', 'tag' ),
+ 'hiddencat' => array( '1', '__СХÐÐ’ÐЦЬ_КÐТЭГОРЫЮ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'КОЛЬКÐСЬЦЬ_СТÐРОÐÐК_У_КÐТЭГОРЫІ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ПÐМЕР_СТÐРОÐКІ', 'PAGESIZE' ),
+ 'staticredirect' => array( '1', '__СТÐТЫЧÐÐЕ_ПЕРÐÐÐКІРÐÐ’ÐÐЬÐЕ__', '__STATICREDIRECT__' ),
);
$namespaceNames = array(
@@ -610,20 +611,22 @@ $1',
'formerror' => 'Памылка: не атрымалаÑÑ Ð°Ð´Ð°Ñлаць зьвеÑткі формы',
'badarticleerror' => 'ГÑтае дзеÑньне немагчыма выканаць на гÑтай Ñтаронцы.',
'cannotdelete' => 'Ðемагчыма выдаліць Ñтаронку альбо файл «$1». Магчыма, Ñна ўжо Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ ÐºÑ–Ð¼Ñьці іншым.',
+'cannotdelete-title' => 'Ðемагчыма выдаліць Ñтаронку «$1»',
'badtitle' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°',
'badtitletext' => 'Ð—Ð°Ð¿Ñ‹Ñ‚Ð°Ð½Ð°Ñ Ð½Ð°Ð·Ð²Ð° Ñтаронкі нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ñ†Ñ– пуÑтаÑ, альбо нÑÑлушна ÑžÐºÐ°Ð·Ð°Ð½Ð°Ñ Ð¼Ñ–Ð¶Ð¼Ð¾ÑžÐ½Ð°Ñ Ñ†Ñ– інтÑрвікі-назва. Яна можа ўтрымліваць Ñымбалі, ÑÐºÑ–Ñ Ð½ÐµÐ»ÑŒÐ³Ð° ўжываць у назвах.',
-'perfcached' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– могуць быць ÑаÑтарÑлымі.',
-'perfcachedts' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– апошні раз былі Ð°Ð±Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1.',
+'perfcached' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– могуць быць ÑаÑтарÑлымі. У кÑшы {{PLURAL:$1|даÑтупны|даÑтупныÑ}} Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.',
+'perfcachedts' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– апошні раз былі Ð°Ð±Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1. У кÑшы {{PLURAL:$4|даÑтупны|даÑтупныÑ}} Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.',
'querypage-no-updates' => 'Ðбнаўленьні гÑтай Ñтаронкі цÑпер адключаныÑ. ЗьвеÑткі Ð½Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ абнаўлÑцца.',
'wrong_wfQuery_params' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼Ñтры Ð´Ð»Ñ wfQuery()<br />
ФункцыÑ: $1<br />
Запыт: $2',
'viewsource' => 'Паказаць крыніцу',
-'viewsourcefor' => 'Ð´Ð»Ñ $1',
+'viewsource-title' => 'ПраглÑд крыніцы Ð´Ð»Ñ $1',
'actionthrottled' => 'ДзеÑньне прытрыманае',
'actionthrottledtext' => 'У межах барацьбы Ñа Ñпамам Ð’Ñ‹ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ñ‹Ñ Ñž надта чаÑтым выкананьні гÑтага дзеÑÐ½ÑŒÐ½Ñ Ð·Ð° кароткі прамежак чаÑу, Ñ– Ð’Ñ‹ перавыÑілі гÑтае абмежаваньне. Калі лаÑка, паÑпрабуйце ÑÑˆÑ‡Ñ Ñ€Ð°Ð· празь некалькі хвілінаў.',
'protectedpagetext' => 'РÑдагаваньне гÑтай Ñтаронкі забароненае.',
'viewsourcetext' => 'Ð’Ñ‹ можаце праглÑдаць Ñ– капіÑваць крынічны Ñ‚ÑкÑÑ‚ гÑтай Ñтаронкі:',
+'viewyourtext' => "Ð’Ñ‹ можаце праглÑдзець Ñ– ÑкапіÑваць крынічны Ñ‚ÑкÑÑ‚ '''вашых Ñ€ÑдагаваньнÑÑž''' на гÑтую Ñтаронку:",
'protectedinterface' => 'ГÑÑ‚Ð°Ñ Ñтаронка ўтрымлівае інтÑрфÑйÑнае паведамленьне праграмнага забеÑьпÑчÑньнÑ, Ñ– Ñе зьмена забаронена.',
'editinginterface' => "'''Увага:''' Ð’Ñ‹ Ñ€Ñдагуеце Ñтаронку, ÑÐºÐ°Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ ÑÑ‹ÑÑ‚Ñмнае паведамленьне MediaWiki.
Яе зьмена паўплывае на вонкавы выглÑд інтÑрфÑйÑу іншых удзельнікаў.
@@ -726,6 +729,7 @@ $2',
'emailconfirmlink' => 'Пацьвердзіць Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
'invalidemailaddress' => 'Уведзены Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты не адпавÑдае фармату адраÑоў Ñлектроннай пошты.
УвÑдзіце Ñлушны Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты ці ачыÑьціце гÑтае поле.',
+'cannotchangeemail' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° рахунку Ð½Ñ Ð¼Ð¾Ð¶Ð° быць Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ð°Ñ Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}.',
'accountcreated' => 'Рахунак Ñтвораны',
'accountcreatedtext' => 'Рахунак удзельніка Ð´Ð»Ñ $1 быў Ñтвораны.',
'createaccount-title' => 'СтварÑньне рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}',
@@ -741,6 +745,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž функцыі PHP mail()',
+'user-mail-no-addy' => 'Спроба даÑлаць Ñлектронны ліÑÑ‚ без адраÑу даÑтаўкі',
# Change password dialog
'resetpass' => 'ЗьмÑніць пароль',
@@ -761,16 +766,18 @@ $2',
'resetpass-temp-password' => 'ЧаÑовы пароль:',
# Special:PasswordReset
-'passwordreset' => 'ÐчыÑтка паролю',
-'passwordreset-text' => 'Запоўніце гÑтую форму, каб атрымаць напамін праз Ñлектронную пошту пра Ð’Ð°ÑˆÑ‹Ñ Ð·ÑŒÐ²ÐµÑткі Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ.',
-'passwordreset-legend' => 'ÐчыÑьціць пароль',
-'passwordreset-disabled' => 'МагчымаÑьць ачыÑткі паролю была Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}.',
-'passwordreset-pretext' => '{{PLURAL:$1||УвÑдзіце ніжÑй чаÑтку зьвеÑтак}}',
-'passwordreset-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
-'passwordreset-domain' => 'ДамÑн:',
-'passwordreset-email' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
-'passwordreset-emailtitle' => 'ПадрабÑзнаÑьці рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Ðехта (магчыма Ð’Ñ‹, з IP-адраÑу $1) зрабіў запыт на атрыманьне падрабÑзнаÑьцÑÑž Вашага рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} ($4). {{PLURAL:$3|ÐаÑтупны рахунак удзельніка зьвÑзаны|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑ– удзельнікаў зьвÑзаныÑ}} з гÑтым адраÑам Ñлектроннай пошты:
+'passwordreset' => 'ÐчыÑтка паролю',
+'passwordreset-text' => 'Запоўніце гÑтую форму, каб атрымаць напамін праз Ñлектронную пошту пра Ð’Ð°ÑˆÑ‹Ñ Ð·ÑŒÐ²ÐµÑткі Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ.',
+'passwordreset-legend' => 'ÐчыÑьціць пароль',
+'passwordreset-disabled' => 'МагчымаÑьць ачыÑткі паролю была Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}.',
+'passwordreset-pretext' => '{{PLURAL:$1||УвÑдзіце ніжÑй чаÑтку зьвеÑтак}}',
+'passwordreset-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
+'passwordreset-domain' => 'ДамÑн:',
+'passwordreset-capture' => 'Паказаць канчатковы Ñлектронны ліÑÑ‚?',
+'passwordreset-capture-help' => 'Калі Ð’Ñ‹ пазначыце гÑтае поле, Ñлектронны ліÑÑ‚ (з чаÑовым паролем), будзе паказаны Вам Ñк толькі ён будзе даÑланы ўдзельніку.',
+'passwordreset-email' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'passwordreset-emailtitle' => 'ПадрабÑзнаÑьці рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Ðехта (магчыма Ð’Ñ‹, з IP-адраÑу $1) зрабіў запыт на атрыманьне падрабÑзнаÑьцÑÑž Вашага рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} ($4). {{PLURAL:$3|ÐаÑтупны рахунак удзельніка зьвÑзаны|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑ– удзельнікаў зьвÑзаныÑ}} з гÑтым адраÑам Ñлектроннай пошты:
$2
@@ -778,7 +785,7 @@ $2
ЦÑпер Вам неабходна ўвайÑьці Ñ– выбраць новы пароль. Калі нехта іншы зрабіў гÑÑ‚Ñ‹ запыт,
ці Ð’Ñ‹ ÑžÑпомнілі Ваш пачатковы пароль, Ñкі Ð½Ñ Ñ…Ð¾Ñ‡Ð°Ñ†Ðµ мÑнÑць,
Ð’Ñ‹ можаце праігнараваць гÑтае паведамленьне, Ñ– працÑгваць выкарыÑтоўваць Ñтары пароль.',
-'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на атрыманьне падрабÑзнаÑьцÑÑž Вашага рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} ($4). {{PLURAL:$3|ÐаÑтупны рахунак удзельніка зьвÑзаны|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑ– удзельнікаў зьвÑзаныÑ}} з гÑтым адраÑам Ñлектроннай пошты:
+'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на атрыманьне падрабÑзнаÑьцÑÑž Вашага рахунку Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} ($4). {{PLURAL:$3|ÐаÑтупны рахунак удзельніка зьвÑзаны|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑ– удзельнікаў зьвÑзаныÑ}} з гÑтым адраÑам Ñлектроннай пошты:
$2
@@ -786,9 +793,22 @@ $2
ЦÑпер Вам неабходна ўвайÑьці Ñ– выбраць новы пароль. Калі нехта іншы зрабіў гÑÑ‚Ñ‹ запыт,
ці Ð’Ñ‹ ÑžÑпомнілі Ваш пачатковы пароль, Ñкі Ð½Ñ Ñ…Ð¾Ñ‡Ð°Ñ†Ðµ мÑнÑць,
Ð’Ñ‹ можаце праігнараваць гÑтае паведамленьне, Ñ– працÑгваць выкарыÑтоўваць Ñтары пароль.',
-'passwordreset-emailelement' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°: $1
+'passwordreset-emailelement' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°: $1
ЧаÑовы пароль: $2',
-'passwordreset-emailsent' => 'Ðапамін быў даÑланы па Ñлектроннай пошце.',
+'passwordreset-emailsent' => 'Ðапамін быў даÑланы па Ñлектроннай пошце.',
+'passwordreset-emailsent-capture' => 'Электронны ліÑÑ‚ з напамінам быў даÑланы, што паказана ніжÑй.',
+'passwordreset-emailerror-capture' => 'Электронны ліÑÑ‚ з напамінам быў Ñтвораны, што паказана ніжÑй, але адбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° адпраўкі ўдзельніку: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+'changeemail-header' => 'Зьмена адраÑу Ñлектроннай пошты Ð´Ð»Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ',
+'changeemail-text' => 'Запоўніце гÑтую форму Ð´Ð»Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ адраÑу Вашай Ñлектроннай пошты. Вам неабходна будзе ўвеÑьці Ваш пароль Ð´Ð»Ñ Ð¿Ð°Ñ†ÑŒÐ²ÐµÑ€Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹.',
+'changeemail-no-info' => 'Ð”Ð»Ñ Ð½ÐµÐ¿Ð°ÑÑ€Ñднага доÑтупу да гÑтай Ñтаронкі Вам неабходна ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму.',
+'changeemail-oldemail' => 'ЦÑперашні Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'changeemail-newemail' => 'Ðовы Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
+'changeemail-none' => '(нÑма)',
+'changeemail-submit' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+'changeemail-cancel' => 'СкаÑаваць',
# Edit page toolbar
'bold_sample' => 'ТлуÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚',
@@ -858,9 +878,6 @@ $2
Ваш цÑперашні IP-Ð°Ð´Ñ€Ð°Ñ â€” $3, ідÑнтыфікатар блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ â€” #$5.
Калі лаÑка, улучайце ÑžÑÑŽ вышÑйпададзеную інфармацыю ва ÑžÑе запыты, што Ð’Ñ‹ будзеце рабіць.",
'blockednoreason' => 'прычына не пазначана',
-'blockedoriginalsource' => "Крыніца '''$1''' паказана ніжÑй:",
-'blockededitsource' => "ТÑкÑÑ‚ '''Вашых зьменаў''' у '''$1''' паказаны ніжÑй:",
-'whitelistedittitle' => 'Ð”Ð»Ñ Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµÑ†Ñ†Ð° ўваход у ÑÑ‹ÑÑ‚Ñму',
'whitelistedittext' => 'Вам Ñ‚Ñ€Ñба $1, каб Ñ€Ñдагаваць Ñтаронкі.',
'confirmedittext' => 'Ð’Ñ‹ муÑіце пацьвердзіць Ваш Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты перад Ñ€Ñдагаваньнем Ñтаронак. Калі лаÑка, пазначце Ñ– пацьвердзіце Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты праз Вашы [[Special:Preferences|налады]].',
'nosuchsectiontitle' => 'Ðемагчыма знайÑьці ÑÑкцыю',
@@ -942,7 +959,8 @@ $2
РазьмÑшчÑньнем тут Ñ‚ÑкÑтаў, Ð’Ñ‹ дÑклÑруеце, што Ð’Ñ‹ зьÑўлÑецеÑÑ Ñ–Ñ… аўтарам, ці Ð’Ñ‹ ÑкапіÑвалі Ñ–Ñ… з крыніцы, ÑÐºÐ°Ñ Ð´Ð°Ð·Ð²Ð°Ð»Ñе вольнае выкарыÑтаньне Ñваіх Ñ‚ÑкÑтаў (Ð´Ð·ÐµÐ»Ñ Ð¿Ð°Ð´Ñ€Ð°Ð±ÑзнаÑьцÑÑž глÑдзіце $1).
'''КÐЛІ ЛÐСКÐ, ÐЕ ЗЬМЯШЧÐЙЦЕ ТУТ БЕЗ ДÐЗВОЛУ ÐœÐТЭРЫЯЛЫ, ЯКІЯ ÐХОЎВÐЮЦЦРÐЎТÐРСКІМ ПРÐÐ’ÐÐœ!'''",
-'longpageerror' => "'''ПÐМЫЛКÐ: Ðб'ём Ñ‚ÑкÑту, Ñкі Ð’Ñ‹ Ñпрабуеце запіÑаць Ñкладае $1 {{PLURAL:$1|кілÑбайт|кілÑбайты|кілÑбайтаў}}. Ðб'ём Ñтаронкі Ð½Ñ Ð¼Ð¾Ð¶Ð° перавышаць $2 {{PLURAL:$2|кілÑбайт|кілÑбайты|кілÑбайтаў}}. Старонка Ð½Ñ Ð¼Ð¾Ð¶Ð° быць захаванаÑ.'''",
+'longpageerror' => "'''Памылка: Ðб’ём Ñ‚ÑкÑту, Ñкі Ð’Ñ‹ Ñпрабуеце запіÑаць Ñкладае $1 {{PLURAL:$1|кілÑбайт|кілÑбайты|кілÑбайтаў}}, што болей уÑтаноўленага Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð½Ð° $2 {{PLURAL:$2|кілÑбайт|кілÑбайты|кілÑбайтаў}}.'''
+Старонка Ð½Ñ Ð¼Ð¾Ð¶Ð° быць захаванаÑ.",
'readonlywarning' => "'''ПÐПЯРЭДЖÐÐЬÐЕ: База зьвеÑтак была заблÑÐºÐ°Ð²Ð°Ð½Ð°Ñ Ð´Ð»Ñ Ñ‚Ñхнічнага абÑлугоўваньнÑ, таму немагчыма зараз захаваць Ð’Ð°ÑˆÑ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹.
Ð’Ñ‹ можаце ÑкапіÑваць Ñ‚ÑкÑÑ‚ у файл на Вашым кампутары, а пазьней захаваць Ñюды.'''
@@ -1107,8 +1125,6 @@ $2
'revdelete-unsuppress' => 'ЗьнÑць абмежаваньні з адноўленых вÑÑ€ÑÑ–ÑÑž',
'revdelete-log' => 'Прычына:',
'revdelete-submit' => 'Ужыць Ð´Ð»Ñ {{PLURAL:$1|выбранай вÑÑ€ÑÑ–Ñ–|выбраных вÑÑ€ÑÑ–ÑÑž}}',
-'revdelete-logentry' => 'Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ð°Ñ Ð±Ð°Ñ‡Ð½Ð°Ñьць вÑÑ€ÑÑ–Ñ– Ñтаронкі [[$1]]',
-'logdelete-logentry' => 'Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ð°Ñ Ð±Ð°Ñ‡Ð½Ð°Ñьць падзеі Ñтаронкі [[$1]]',
'revdelete-success' => "'''БачнаÑьць вÑÑ€ÑÑ–Ñ– паÑьпÑхова абноўленаÑ.'''",
'revdelete-failure' => "'''Ðемагчыма абнавіць бачнаÑьць вÑÑ€ÑÑ–Ñ–:'''
$1",
@@ -1120,15 +1136,6 @@ $1",
'revdel-restore-visible' => 'Ð±Ð°Ñ‡Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
'pagehist' => 'ГіÑÑ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі',
'deletedhist' => 'Ð’Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ Ð³Ñ–ÑторыÑ',
-'revdelete-content' => 'зьмеÑÑ‚',
-'revdelete-summary' => 'кароткае апіÑаньне зьменаў',
-'revdelete-uname' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
-'revdelete-restricted' => 'ужыць абмежаваньні Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
-'revdelete-unrestricted' => 'зьнÑÑ‚Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½ÑŒÐ½Ñ– Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
-'revdelete-hid' => 'Ñхаваны $1',
-'revdelete-unhid' => 'не хаваць $1',
-'revdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž|вÑÑ€ÑÑ–ÑÑž}}',
-'logdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|падзеі|падзеÑÑž|падзеÑÑž}}',
'revdelete-hide-current' => 'Памылка Ñ…Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð·Ð°Ð¿Ñ–Ñу ад $2 $1: гÑта цÑперашнÑÑ Ð²ÑÑ€ÑÑ–Ñ.
Ð—Ð°Ð¿Ñ–Ñ Ð½Ñ Ð¼Ð¾Ð¶Ð° быць Ñхаваны.',
'revdelete-show-no-access' => 'Памылка паказу запіÑу ад $2 $1: гÑÑ‚Ñ‹ Ð·Ð°Ð¿Ñ–Ñ Ð±Ñ‹Ñž пазначаны Ñк «абмежаваны».
@@ -1286,12 +1293,14 @@ $1",
'prefs-rc' => 'ÐÐ¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹',
'prefs-watchlist' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
'prefs-watchlist-days' => 'КолькаÑьць дзён Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñž ÑьпіÑе назіраньнÑ:',
-'prefs-watchlist-days-max' => 'МакÑымальна 7 дзён',
+'prefs-watchlist-days-max' => '(макÑымальна $1 {{PLURAL:$1|дзень|дні|дзён}})',
'prefs-watchlist-edits' => 'КолькаÑьць Ñ€ÑдагаваньнÑÑž Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñž пашыраным ÑьпіÑе назіраньнÑ:',
'prefs-watchlist-edits-max' => 'МакÑÑ‹Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñьць: 1000',
'prefs-watchlist-token' => 'СакрÑтны ключ ÑьпіÑу назіраньнÑ:',
'prefs-misc' => 'Рознае',
'prefs-resetpass' => 'ЗьмÑніць пароль',
+'prefs-changeemail' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
+'prefs-setemail' => 'УÑтанавіць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
'prefs-email' => 'Ðалады Ñлектроннай пошты',
'prefs-rendering' => 'ВыглÑд',
'saveprefs' => 'Захаваць',
@@ -1351,6 +1360,7 @@ $1",
'yourrealname' => 'Сапраўднае імÑ:',
'yourlanguage' => 'Мова інтÑрфÑйÑу:',
'yourvariant' => 'ВарыÑнт мовы зьмеÑту:',
+'prefs-help-variant' => 'Выбраны Вамі альфабÑÑ‚ ці Ð°Ñ€Ñ‚Ð°Ð³Ñ€Ð°Ñ„Ñ–Ñ Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ Ñтаронак зьмеÑту {{GRAMMAR:родны|{{SITENAME}}}}.',
'yournick' => 'ПодпіÑ:',
'prefs-help-signature' => 'КамÑнтары на Ñтаронцы Ð°Ð±Ð¼ÐµÑ€ÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ð²Ñ–Ð½Ð½Ñ‹ быць падпіÑаны праз даданьне ÑымбалÑÑž «<nowiki>~~~~</nowiki>», ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ пераўтвораны Ñž Ваш Ð¿Ð¾Ð´Ð¿Ñ–Ñ Ñ– цÑперашні чаÑ.',
'badsig' => 'ÐÑÑлушны неапрацаваны подпіÑ; праверце HTML-Ñ‚Ñгі.',
@@ -1391,7 +1401,7 @@ $1",
'userrights-lookup-user' => 'Кіраваньне групамі ўдзельнікаў і ўдзельніц',
'userrights-user-editname' => 'УвÑдзіце Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'editusergroup' => 'РÑдагаваць групы ўдзельнікаў Ñ– ўдзельніц',
-'editinguser' => "Зьмена правоў удзельніка '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Зьмена правоў {{GENDER:$1|удзельніка|удзельніцы}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'РÑдагаваць групы ўдзельнікаў Ñ– ўдзельніц',
'saveusergroups' => 'Захаваць групы ўдзельнікаў і ўдзельніц',
'userrights-groupsmember' => 'Уваходзіць у:',
@@ -1485,13 +1495,13 @@ $1",
'right-autopatrol' => 'аўтаматычнае пазначÑньне Ñ€ÑдагаваньнÑÑž Ñк «патрулÑваных»',
'right-patrolmarks' => 'праглÑд пазначÑньнÑÑž пра патрулÑваньне Ñž апошніх зьменах',
'right-unwatchedpages' => 'праглÑд ÑьпіÑу Ñтаронак, за Ñкімі ніхто не назірае',
-'right-trackback' => 'адпраўка trackback',
'right-mergehistory' => 'аб’Ñднаньне гіÑторыі Ñтаронак',
'right-userrights' => 'Ñ€Ñдагаваньне правоў уÑÑ–Ñ… удзельнікаў',
'right-userrights-interwiki' => 'Ñ€Ñдагаваньне правоў удзельнікаў у іншых вікі',
'right-siteadmin' => 'блÑкаваньне Ñ– разблÑкаваньне базы зьвеÑтак',
'right-override-export-depth' => 'ÑкÑпартаваньне Ñтаронак, уключаючы зьвÑÐ·Ð°Ð½Ñ‹Ñ Ñтаронкі з глыбінёй да 5',
'right-sendemail' => 'адпраўка Ñлектронных ліÑтоў іншым удзельнікам',
+'right-passwordreset' => 'праглÑд Ñлектронных ліÑтоў з ачыÑткай паролю',
# User rights log
'rightslog' => 'Журнал правоў удзельнікаў',
@@ -1525,16 +1535,17 @@ $1",
'action-suppressionlog' => 'праглÑд гÑтага прыватнага журнала',
'action-block' => 'блÑкаваньне гÑтага ўдзельніка ад Ñ€ÑдагаваньнÑÑž',
'action-protect' => 'зьмену ўзроўню абароны гÑтай Ñтаронкі',
+'action-rollback' => 'хуткі адкат Ñ€ÑдагаваньнÑÑž апошнÑга ўдзельніка, Ñкі Ñ€Ñдагаваў Ñтаронку',
'action-import' => 'імпарт гÑтай Ñтаронкі зь іншай вікі',
'action-importupload' => 'імпарт гÑтай Ñтаронкі праз загрузку файла',
'action-patrol' => 'пазначÑньне чужых Ñ€ÑдагаваньнÑÑž Ñк «патрулÑваныÑ»',
'action-autopatrol' => 'пазначÑньне ўлаÑных Ñ€ÑдагаваньнÑÑž Ñк «патрулÑваныÑ»',
'action-unwatchedpages' => 'праглÑд ÑьпіÑу Ñтаронак, за Ñкімі ніхто не назірае',
-'action-trackback' => 'адпраўку trackback',
'action-mergehistory' => "аб'Ñднаньне гіÑторыі гÑтай Ñтаронкі",
'action-userrights' => 'Ñ€Ñдагаваньне правоў уÑÑ–Ñ… удзельнікаў',
'action-userrights-interwiki' => 'Ñ€Ñдагаваньне правоў удзельнікаў у іншых вікі',
'action-siteadmin' => 'блÑкаваньне Ñ– разблÑкаваньне базы зьвеÑтак',
+'action-sendemail' => 'адпраўку Ñлектронных ліÑтоў іншым удзельнікам',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
@@ -1566,6 +1577,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]',
'rc_categories' => 'Ðбмежаваць катÑгорыÑмі (разьдзÑлÑйце знакам «|»)',
'rc_categories_any' => 'УÑе',
+'rc-change-size-new' => '$1 {{PLURAL:$1|байт|байты|байтаў}} паÑÑŒÐ»Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹',
'newsectionsummary' => '/* $1 */ Ð½Ð¾Ð²Ð°Ñ ÑÑкцыÑ',
'rc-enhanced-expand' => 'Паказаць падрабÑзнаÑьці (патрабуе JavaScript)',
'rc-enhanced-hide' => 'Схаваць падрабÑзнаÑьці',
@@ -1618,6 +1630,7 @@ $1",
'ignorewarnings' => 'Ігнараваць уÑе папÑÑ€Ñджаньні',
'minlength1' => 'Ðазва файла павінна ўтрымліваць Ñ…Ð°Ñ†Ñ Ð± адзін Ñымбаль.',
'illegalfilename' => 'Ðазва файла «$1» зьмÑшчае Ñымбалі, ÑÐºÑ–Ñ Ð½ÐµÐ»ÑŒÐ³Ð° выкарыÑтоўваць у назвах Ñтаронак. Калі лаÑка, зьмÑніце назву файла Ñ– паÑпрабуйце загрузіць Ñго зноў.',
+'filename-toolong' => 'Ðазвы файлаў Ð½Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ быць даўжÑй 240 байтаў.',
'badfilename' => 'Ðазва файла была Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ð°Ñ Ð½Ð° «$1».',
'filetype-mime-mismatch' => 'ПашырÑньне файла «.$1» не адпавÑдае выÑўленаму MIME-тыпу файла ($2).',
'filetype-badmime' => 'Загрузка файлаў тыпу MIME «$1» забароненаÑ.',
@@ -1714,6 +1727,41 @@ $1',
'upload-unknown-size' => 'ÐевÑдомы памер',
'upload-http-error' => 'Узьнікла памылка HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Ðемагчыма накіраваць файл $1.',
+'backend-fail-backup' => 'Ðемагчыма зрабіць Ñ€ÑзÑрвовую копію файла $1.',
+'backend-fail-notexists' => 'Файл $1 не Ñ–Ñнуе.',
+'backend-fail-hashes' => 'Ðемагчыма атрымаць Ñ…Ñшы файлаў Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°ÑžÐ½Ð°Ð½ÑŒÐ½Ñ.',
+'backend-fail-notsame' => 'ÐеідÑнтыфікаваны файл ужо Ñ–Ñнуе $1.',
+'backend-fail-invalidpath' => '$1 не зьÑўлÑецца Ñлушным шлÑхам да Ñховішча.',
+'backend-fail-delete' => 'Ðемагчыма выдаліць файл $1.',
+'backend-fail-alreadyexists' => 'Файл $1 ужо Ñ–Ñнуе.',
+'backend-fail-store' => 'Ðемагчыма захаваць файл $1 у $2.',
+'backend-fail-copy' => 'Ðемагчыма ÑкапіÑваць файл $1 у $2.',
+'backend-fail-move' => 'Ðемагчыма перанеÑьці файл $1 у $2.',
+'backend-fail-opentemp' => 'Ðемагчыма адкрыць чаÑовы файл.',
+'backend-fail-writetemp' => 'Ðемагчыма запіÑаць чаÑовы файл.',
+'backend-fail-closetemp' => 'Ðемагчыма закрыць чаÑовы файл.',
+'backend-fail-read' => 'Ðемагчыма прачытаць файл $1.',
+'backend-fail-create' => 'Ðемагчыма Ñтварыць файл $1.',
+'backend-fail-readonly' => 'СÑрвÑÑ€ Ñховішча «$1» у Ñ€Ñжыме толькі чытаньнÑ. Прычына: «$2»',
+'backend-fail-synced' => 'Стан файла «$1» адрозьніваецца ад Ñтану на ўнутраным ÑÑрвÑры Ñховішча',
+'backend-fail-connect' => 'Ðемагчыма далучыцца да ÑÑрвÑра Ñховішча «$1».',
+'backend-fail-internal' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° на ÑÑрвÑры Ñховішча «$1».',
+'backend-fail-contenttype' => 'Ðемагчыма вызначыць тып зьмеÑту файла, Ñкі муÑіць быць захаваны Ñž «$1».',
+'backend-fail-batchsize' => 'Cховішча атрымала блёк з $1 {{PLURAL:$1|файлавай апÑрацыі|файлавых апÑрацыÑÑž|файлавых апÑрацыÑÑž}}; абмежаваньне Ñкладае $2 {{PLURAL:$2|апÑрацыю|апÑрацыі|апÑрацыÑÑž}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ðемагчыма разблÑкаваць «$1», Ñкі не заблÑкаваны.',
+'lockmanager-fail-closelock' => 'Ðемагчыма закрыць файл блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-deletelock' => 'Ðемагчыма выдаліць файл блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-acquirelock' => 'Ðемагчыма здабыць блÑкаваньне Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-openlock' => 'Ðемагчыма адкрыць файл блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-releaselock' => 'Ðемагчыма зьнÑць блÑкаваньне Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-db-bucket' => 'Ðемагчыма Ñкантактавацца з даÑтатковай колькаÑьцю базаў блÑкавньнÑÑž на ўчаÑтку $1.',
+'lockmanager-fail-db-release' => 'Ðемагчыма зьнÑць блÑкаваньні Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ зьвеÑтак $1.',
+'lockmanager-fail-svr-release' => 'Ðемагчыма зьнÑць блÑкаваньні Ð´Ð»Ñ ÑÑрвÑра $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ÐŸÐ°Ð´Ñ‡Ð°Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ†ÑŒÑ†Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÑ– архіву адбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°.',
'zip-wrong-format' => 'Пазначаны файл не зьÑўлÑецца ZIP-архівам.',
@@ -1730,6 +1778,7 @@ $1',
'uploadstash-badtoken' => 'Ðемагчыма выканаць гÑтае дзеÑньне, верагодна ÑкончыўÑÑ Ñ‚Ñрмін дзеÑÐ½ÑŒÐ½Ñ Ð’Ð°ÑˆÐ°Ð³Ð° дазволу на Ñ€Ñдагаваньне. ПаÑпрабуйце зноў.',
'uploadstash-errclear' => 'Ðемагчыма ачыÑьціць файлы.',
'uploadstash-refresh' => 'Ðбнавіць ÑÑŒÐ¿Ñ–Ñ Ñ„Ð°Ð¹Ð»Ð°Ñž.',
+'invalid-chunk-offset' => 'ÐÑÑлушнае зрушÑньне фрагмÑнту',
# img_auth script messages
'img-auth-accessdenied' => 'ДоÑтуп забаронены',
@@ -1839,23 +1888,24 @@ $1',
'filerevert-badversion' => 'Ðе Ñ–Ñнуе папÑÑ€ÑднÑй лÑкальнай вÑÑ€ÑÑ–Ñ– гÑтага файла з пазначанай датай.',
# File deletion
-'filedelete' => 'Выдаліць $1',
-'filedelete-legend' => 'Выдаліць файл',
-'filedelete-intro' => "Ð’Ñ‹ выдалÑеце файл '''[[Media:$1|$1]]''' з уÑёй Ñго гіÑторыÑй.",
-'filedelete-intro-old' => "Ð’Ñ‹ выдалÑеце вÑÑ€ÑÑ–ÑŽ '''[[Media:$1|$1]]''' ад [$4 $3, $2].",
-'filedelete-comment' => 'Прычына:',
-'filedelete-submit' => 'Выдаліць',
-'filedelete-success' => "'''$1''' выдалены.",
-'filedelete-success-old' => "Ð’ÑÑ€ÑÑ–Ñ '''[[Media:$1|$1]]''' ад $3, $2 была выдаленаÑ.",
-'filedelete-nofile' => "Файл '''$1''' не Ñ–Ñнуе.",
-'filedelete-nofile-old' => "Ðе Ñ–Ñнуе архіўнай вÑÑ€ÑÑ–Ñ– '''$1''' з пазначанымі атрыбутамі.",
-'filedelete-otherreason' => 'ІншаÑ/Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°:',
-'filedelete-reason-otherlist' => 'Ð†Ð½ÑˆÐ°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°',
-'filedelete-reason-dropdown' => '* Ð—Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ñ‹ выдаленьнÑ
+'filedelete' => 'Выдаліць $1',
+'filedelete-legend' => 'Выдаліць файл',
+'filedelete-intro' => "Ð’Ñ‹ выдалÑеце файл '''[[Media:$1|$1]]''' з уÑёй Ñго гіÑторыÑй.",
+'filedelete-intro-old' => "Ð’Ñ‹ выдалÑеце вÑÑ€ÑÑ–ÑŽ '''[[Media:$1|$1]]''' ад [$4 $3, $2].",
+'filedelete-comment' => 'Прычына:',
+'filedelete-submit' => 'Выдаліць',
+'filedelete-success' => "'''$1''' выдалены.",
+'filedelete-success-old' => "Ð’ÑÑ€ÑÑ–Ñ '''[[Media:$1|$1]]''' ад $3, $2 была выдаленаÑ.",
+'filedelete-nofile' => "Файл '''$1''' не Ñ–Ñнуе.",
+'filedelete-nofile-old' => "Ðе Ñ–Ñнуе архіўнай вÑÑ€ÑÑ–Ñ– '''$1''' з пазначанымі атрыбутамі.",
+'filedelete-otherreason' => 'ІншаÑ/Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°:',
+'filedelete-reason-otherlist' => 'Ð†Ð½ÑˆÐ°Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ð°',
+'filedelete-reason-dropdown' => '* Ð—Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ Ð¿Ñ€Ñ‹Ñ‡Ñ‹Ð½Ñ‹ выдаленьнÑ
** парушÑньне аўтарÑкіх правоў
** файл-дублікат',
-'filedelete-edit-reasonlist' => 'РÑдагаваць прычыны выдаленьнÑ',
-'filedelete-maintenance' => 'Выдаленьне Ñ– аднаўленьне файлаў чаÑова забароненае па прычыне падтрымкі.',
+'filedelete-edit-reasonlist' => 'РÑдагаваць прычыны выдаленьнÑ',
+'filedelete-maintenance' => 'Выдаленьне Ñ– аднаўленьне файлаў чаÑова забароненае па прычыне падтрымкі.',
+'filedelete-maintenance-title' => 'Ðемагчыма выдаліць файл',
# MIME search
'mimesearch' => 'Пошук па MIME',
@@ -1953,6 +2003,8 @@ $1',
'wantedpages' => 'Ð—Ð°Ð¿Ð°Ñ‚Ñ€Ð°Ð±Ð°Ð²Ð°Ð½Ñ‹Ñ Ñтаронкі',
'wantedpages-badtitle' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° ÑÑрод вынікаў: $1',
'wantedfiles' => 'Ð—Ð°Ð¿Ð°Ñ‚Ñ€Ð°Ð±Ð°Ð²Ð°Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹',
+'wantedfiletext-cat' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ выкарыÑтоўваюцца, але Ñ–Ñ… нÑма. Файлы Ñа зьнешніх Ñховішчаў могуць знаходзіцца Ñž ÑьпіÑе без уліку Ñ–Ñ… Ñ–ÑнаваньнÑ. Ð›ÑŽÐ±Ñ‹Ñ Ñ‚Ð°ÐºÑ–Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ– будуць <del>выкраÑьленыÑ</del>. Дадаткова, Ñтаронкі, ÑÐºÑ–Ñ ÑžÐ±ÑƒÐ´Ð¾ÑžÐ²Ð°ÑŽÑ†ÑŒ неіÑÐ½ÑƒÑŽÑ‡Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ Ð¿Ñ€Ñ‹Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð½Ð° [[:$1]].',
+'wantedfiletext-nocat' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹ выкарыÑтоўваюцца, але Ñ–Ñ… нÑма. Файлы Ñа зьнешніх Ñховішчаў могуць знаходзіцца Ñž ÑьпіÑе без уліку Ñ–Ñ… Ñ–ÑнаваньнÑ. Ð›ÑŽÐ±Ñ‹Ñ Ñ‚Ð°ÐºÑ–Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð¶Ð°Ð½ÑŒÐ½Ñ– будуць <del>выкраÑьленыÑ</del>.',
'wantedtemplates' => 'Ð—Ð°Ð¿Ð°Ñ‚Ñ€Ð°Ð±Ð°Ð²Ð°Ð½Ñ‹Ñ ÑˆÐ°Ð±Ð»Ñ‘Ð½Ñ‹',
'mostlinked' => 'Старонкі, на ÑÐºÑ–Ñ Ð½Ð°Ð¹Ñ‡Ð°Ñьцей ÑпаÑылаюцца',
'mostlinkedcategories' => 'КатÑгорыі з найбольшай колькаÑьцю Ñтаронак',
@@ -1961,6 +2013,7 @@ $1',
'mostimages' => 'Файлы, на ÑÐºÑ–Ñ Ð½Ð°Ð¹Ñ‡Ð°Ñьцей ÑпаÑылаюцца',
'mostrevisions' => 'Старонкі з найбольшай колькаÑьцю Ñ€ÑдагаваньнÑÑž',
'prefixindex' => 'УÑе Ñтаронкі з пачаткам назваў',
+'prefixindex-namespace' => 'УÑе Ñтаронкі з прÑфікÑам (праÑтора назваў $1)',
'shortpages' => 'ÐšÐ°Ñ€Ð¾Ñ‚ÐºÑ–Ñ Ñтаронкі',
'longpages' => 'Ð”Ð¾ÑžÐ³Ñ–Ñ Ñтаронкі',
'deadendpages' => 'Ð¢ÑƒÐ¿Ñ–ÐºÐ¾Ð²Ñ‹Ñ Ñтаронкі',
@@ -1977,7 +2030,7 @@ $1',
'listusers-editsonly' => 'Паказаць толькі ўдзельнікаў, ÑÐºÑ–Ñ Ð¼Ð°ÑŽÑ†ÑŒ Ñ€Ñдагаваньні',
'listusers-creationsort' => 'ÐдÑартаваць па даце ÑтварÑньнÑ',
'usereditcount' => '$1 {{PLURAL:$1|Ñ€Ñдагаваньне|Ñ€Ñдагаваньні|Ñ€ÑдагаваньнÑÑž}}',
-'usercreated' => 'Створаны $1 ў $2',
+'usercreated' => '{{GENDER:$3|}}Створаны $1 у $2',
'newpages' => 'ÐÐ¾Ð²Ñ‹Ñ Ñтаронкі',
'newpages-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°/ўдзельніцы:',
'ancientpages' => 'ÐайÑтарÑÐ¹ÑˆÑ‹Ñ Ñтаронкі',
@@ -2071,12 +2124,8 @@ $1',
'activeusers-noresult' => 'Удзельнікі Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹Ñ.',
# Special:Log/newusers
-'newuserlogpage' => 'Журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž',
-'newuserlogpagetext' => 'ГÑта журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž удзельнікаў Ñ– ўдзельніц.',
-'newuserlog-byemail' => 'Пароль адаÑланы па Ñлектроннай пошце',
-'newuserlog-create-entry' => 'Ðовы ўдзельнік',
-'newuserlog-create2-entry' => 'Ñтвораны рахунак $1',
-'newuserlog-autocreate-entry' => 'Рахунак Ñтвораны аўтаматычна',
+'newuserlogpage' => 'Журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž',
+'newuserlogpagetext' => 'ГÑта журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž удзельнікаў Ñ– ўдзельніц.',
# Special:ListGroupRights
'listgrouprights' => 'Правы групаў удзельнікаў',
@@ -2105,7 +2154,7 @@ $1',
'emailpagetext' => 'Ð’Ñ‹ можаце выкарыÑтоўваць форму ніжÑй, каб даÑлаць гÑтаму ўдзельніку ліÑÑ‚ па Ñлектроннай пошце.
ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты, Ñкі Ð’Ñ‹ пазначалі Ñž [[Special:Preferences|Ñваіх наладах]], будзе пазначаны Ñž полі ліÑта «Ðд», Ñ– ўдзельнік зможа даÑлаць на гÑÑ‚Ñ‹ Ð°Ð´Ñ€Ð°Ñ Ð°Ð´ÐºÐ°Ð·.',
'usermailererror' => 'Пры адÑыланьні пошты адбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°:',
-'defemailsubject' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° {{GRAMMAR:родны|{{SITENAME}}}}',
+'defemailsubject' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
'usermaildisabled' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð° ўдзельніка адключанаÑ',
'usermaildisabledtext' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ даÑылаць ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹ іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}',
'noemailtitle' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты адÑутнічае',
@@ -2159,7 +2208,7 @@ $1',
'watchmethod-list' => 'праглÑд Ñтаронак Ñа ÑьпіÑу Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð´Ð·ÐµÐ»Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ… зьменах',
'watchlistcontains' => 'Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð·ÑŒÐ¼Ñшчае $1 {{PLURAL:$1|Ñтаронка|Ñтаронкі|Ñтаронак}}.',
'iteminvalidname' => 'Праблема з ÑлемÑнтам «$1», нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°â€¦',
-'wlnote' => "ÐіжÑй {{PLURAL:$1|Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ð°Ñ '''$1''' апошнÑÑ Ð·ÑŒÐ¼ÐµÐ½Ð°|Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ '''$1''' Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹|Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ '''$1''' апошніх зьменаў}} за '''$2''' {{PLURAL:$2|гадзіну|гадзіны|гадзінаў}}.",
+'wlnote' => "ÐіжÑй {{PLURAL:$1|Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ð°Ñ '''$1''' апошнÑÑ Ð·ÑŒÐ¼ÐµÐ½Ð°|Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ '''$1''' Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹|Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ '''$1''' апошніх зьменаў}} за '''$2''' {{PLURAL:$2|гадзіну|гадзіны|гадзінаў}}, па Ñтане на $3, $4.",
'wlshowlast' => 'Паказаць: за Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ $1 гадзінаў, $2 дзён, $3',
'watchlist-options' => 'Ðалады ÑьпіÑу назіраньнÑ',
@@ -2225,8 +2274,6 @@ $UNWATCHURL
'actionfailed' => 'ДзеÑньне Ð½Ñ Ð²Ñ‹ÐºÐ°Ð½Ð°Ð½Ð°Ðµ',
'deletedtext' => '«$1» была выдаленаÑ.
ГлÑдзіце журнал выдаленьнÑÑž у $2.',
-'deletedarticle' => 'выдаліў «[[$1]]»',
-'suppressedarticle' => 'Ñхаваў «[[$1]]»',
'dellogpage' => 'Журнал выдаленьнÑÑž',
'dellogpagetext' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ… выдаленьнÑÑž.',
'deletionlog' => 'журнал выдаленьнÑÑž',
@@ -2274,7 +2321,10 @@ $UNWATCHURL
'unprotectedarticle' => 'зьнÑÑ‚Ð°Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ð° з «[[$1]]»',
'movedarticleprotection' => 'перанеÑÐµÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ абароны з «[[$2]]» на «[[$1]]»',
'protect-title' => 'Ðбарона «$1»',
+'protect-title-notallowed' => 'ПраглÑд узроўню абароны «$1»',
'prot_1movedto2' => '[[$1]] перанеÑÐµÐ½Ð°Ñ Ñž [[$2]]',
+'protect-badnamespace-title' => 'ПраÑтора назваў, у Ñкой немагчыма абаранÑць Ñтаронкі',
+'protect-badnamespace-text' => 'Старонкі Ñž гÑтай праÑторы назваў Ð½Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ быць абароненыÑ.',
'protect-legend' => 'Пацьверджаньне абароны',
'protectcomment' => 'Прычына:',
'protectexpiry' => 'ТÑрмін:',
@@ -2296,6 +2346,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Толькі адмініÑтратары',
'protect-summary-cascade' => 'каÑкаднаÑ',
'protect-expiring' => 'Ñканчаецца $1 (UTC)',
+'protect-expiring-local' => 'канчаецца $1',
'protect-expiry-indefinite' => 'беÑÑ‚Ñрмінова',
'protect-cascade' => 'ÐбаранÑць Ñтаронкі, ÑÐºÑ–Ñ ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ñ‹Ñ Ñž гÑтую Ñтаронку (каÑÐºÐ°Ð´Ð½Ð°Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ð°)',
'protect-cantedit' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ зьмÑніць узровень абароны гÑтай Ñтаронкі, таму што Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу на Ñе Ñ€Ñдагаваньне.',
@@ -2356,7 +2407,6 @@ $UNWATCHURL
'undeletereset' => 'Скінуць',
'undeleteinvert' => 'Ðдваротны выбар',
'undeletecomment' => 'Прычына:',
-'undeletedarticle' => 'Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ Â«[[$1]]»',
'undeletedrevisions' => '{{PLURAL:$1|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ $1 вÑÑ€ÑÑ–Ñ|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 вÑÑ€ÑÑ–Ñ–|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 вÑÑ€Ñій}}',
'undeletedrevisions-files' => 'Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 {{PLURAL:$1|вÑÑ€ÑÑ–Ñ|вÑÑ€ÑÑ–Ñ–|вÑÑ€Ñій}} Ñ– $2 {{PLURAL:$2|файл|файлы|файлаў}}',
'undeletedfiles' => '{{PLURAL:$1|адноўлены $1 файл|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 файлы|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 файлаў}}',
@@ -2365,6 +2415,7 @@ $UNWATCHURL
ГлÑдзіце [[Special:Log/delete|журнал выдаленьнÑÑž]] Ð´Ð»Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду апошніх выдаленьнÑÑž Ñ– аднаўненьнÑÑž.",
'undelete-header' => 'ГлÑдзіце [[Special:Log/delete|журнал выдаленьнÑÑž]] Ð´Ð»Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду апошніх выдаленьнÑÑž.',
+'undelete-search-title' => 'Пошук выдаленых Ñтаронак',
'undelete-search-box' => 'Пошук выдаленых Ñтаронак',
'undelete-search-prefix' => 'Паказаць Ñтаронкі, назвы Ñкіх пачынаюцца з:',
'undelete-search-submit' => 'Паказаць',
@@ -2374,6 +2425,7 @@ $UNWATCHURL
'undelete-cleanup-error' => 'Памылка Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½ÑŒÐ½Ñ Ð°Ñ€Ñ…Ñ–ÑžÐ½Ð°Ð³Ð° файла «$1», Ñкі не выкарыÑтоўваўÑÑ.',
'undelete-missing-filearchive' => 'Ðемагчыма аднавіць файл з ідÑнтыфікатарам $1, таму што ён адÑутнічае Ñž базе зьвеÑтак.
Магчыма ён быў ужо адноўлены.',
+'undelete-error' => 'Памылка Ð°Ð´Ð½Ð°ÑžÐ»ÐµÐ½ÑŒÐ½Ñ Ñтаронкі',
'undelete-error-short' => 'Памылка Ð°Ð´Ð½Ð°ÑžÐ»ÐµÐ½ÑŒÐ½Ñ Ñ„Ð°Ð¹Ð»Ð°: $1',
'undelete-error-long' => 'Пад Ñ‡Ð°Ñ Ð°Ð´Ð½Ð°ÑžÐ»ÐµÐ½ÑŒÐ½Ñ Ñ„Ð°Ð¹Ð»Ð° адбыліÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÑ–:
@@ -2492,6 +2544,7 @@ $1',
'blocklist-userblocks' => 'Схаваць блÑкаваньні рахункаў',
'blocklist-tempblocks' => 'Схаваць чаÑÐ¾Ð²Ñ‹Ñ Ð±Ð»Ñкаваньні',
'blocklist-addressblocks' => 'Схаваць блÑкаваньні аÑобных IP-адраÑоў',
+'blocklist-rangeblocks' => 'хаваньне блÑкаваньнÑÑž дыÑпазонаў',
'blocklist-timestamp' => 'Дата/чаÑ',
'blocklist-target' => 'ÐœÑта',
'blocklist-expiry' => 'Сканчаецца',
@@ -2514,6 +2567,7 @@ $1',
'unblocklink' => 'разблÑкаваць',
'change-blocklink' => 'зьмÑніць блÑкаваньне',
'contribslink' => 'унёÑак',
+'emaillink' => 'даÑлаць ліÑÑ‚',
'autoblocker' => "Ð’Ñ‹ аўтаматычна заблÑкаваныÑ, таму што Ваш IP-Ð°Ð´Ñ€Ð°Ñ Ð½Ñдаўна ўжываўÑÑ Â«[[User:$1|$1]]». Прычына блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ $1 наÑтупнаÑ: «'''$2'''»",
'blocklogpage' => 'Журнал блÑкаваньнÑÑž',
'blocklog-showlog' => 'ГÑÑ‚Ñ‹ ўдзельнік ужо заблÑкаваны. Журнал блÑкаваньнÑÑž пададзены ніжÑй:',
@@ -2634,9 +2688,6 @@ $1',
'movepage-page-moved' => 'Старонка $1 перанеÑÐµÐ½Ð°Ñ Ñž $2.',
'movepage-page-unmoved' => 'Старонка $1 Ð½Ñ Ð¼Ð¾Ð¶Ð° быць перанеÑÐµÐ½Ð°Ñ Ñž $2.',
'movepage-max-pages' => '$1 {{PLURAL:$1|Ñтаронка была перанеÑенаÑ|Ñтаронкі былі перанеÑеныÑ|Ñтаронак былі перанеÑеныÑ}} — гÑта дазволены макÑымум, больш аўтаматычных пераноÑаў Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ.',
-'1movedto2' => '[[$1]] перанеÑÐµÐ½Ð°Ñ Ñž [[$2]]',
-'1movedto2_redir' => '[[$1]] перанеÑÐµÐ½Ð°Ñ Ñž [[$2]] паўзьверх перанакіраваньнÑ',
-'move-redirect-suppressed' => 'перанакіраваньне забаронена',
'movelogpage' => 'Журнал пераноÑаў',
'movelogpagetext' => 'ÐіжÑй пададзены ÑÑŒÐ¿Ñ–Ñ Ð¿ÐµÑ€Ð°Ð½ÐµÑеных Ñтаронак.',
'movesubpage' => '{{PLURAL:$1|ПадÑтаронка|ПадÑтаронкі}}',
@@ -2649,7 +2700,7 @@ $1',
ÐœÑÑ‚Ð°Ð²Ð°Ñ Ñтаронка «[[:$1]]» ужо Ñ–Ñнуе.
Ці жадаеце Ð’Ñ‹ Ñе выдаліць, каб вызваліць меÑца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу?',
'delete_and_move_confirm' => 'Так, выдаліць Ñтаронку',
-'delete_and_move_reason' => 'ВыдаленаÑ, каб вызваліць меÑца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу',
+'delete_and_move_reason' => 'ВыдаленаÑ, каб вызваліць меÑца Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу «[[$1]]»',
'selfmove' => 'ÐšÑ€Ñ‹Ð½Ñ–Ñ‡Ð½Ð°Ñ Ñ– мÑÑ‚Ð°Ð²Ð°Ñ Ð½Ð°Ð·Ð²Ñ‹ Ñупадаюць;
немагчыма перанеÑьці Ñтаронку Ñаму на ÑÑбе.',
'immobile-source-namespace' => 'Ðемагчыма пераноÑіць Ñтаронкі Ñž праÑторы назваў «$1»',
@@ -2681,9 +2732,11 @@ $1',
Каб ÑкÑпартаваць Ñтаронкі, увÑдзіце назвы Ñтаронак у Ñ‚ÑкÑтавае поле ніжÑй, адну назву Ñž адзін радок, Ñ– абÑрыце жадаеце Ð’Ñ‹ цÑперашнюю вÑÑ€ÑÑ–ÑŽ разам з уÑімі папÑÑ€Ñднімі вÑÑ€ÑÑ–Ñмі Ñ– гіÑторыÑй Ñ€ÑдагаваньнÑÑž, ці толькі цÑперашнюю вÑÑ€ÑÑ–ÑŽ з інфармацыÑй пра апошнÑе Ñ€Ñдагаваньне.
У апошнім выпадку Ð’Ñ‹ можаце такÑама ÑкарыÑтацца ÑпаÑылкай, напрыклад, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] Ð´Ð»Ñ Â«[[{{MediaWiki:Mainpage}}]]».',
+'exportall' => 'ЭкÑпартаваць уÑе Ñтаронкі',
'exportcuronly' => 'ЭкÑпартаваць толькі цÑперашнюю вÑÑ€ÑÑ–ÑŽ, бÑз поўнай гіÑторыі',
'exportnohistory' => "----
'''Заўвага:''' ÑкÑпартаваньне поўнай гіÑторыі Ñтаронак з дапамогай гÑтай формы было адключанае праз прычыны прадукцыйнаÑьці ÑÑ‹ÑÑ‚Ñмы.",
+'exportlistauthors' => 'Дадае поўны ÑÑŒÐ¿Ñ–Ñ Ð°ÑžÑ‚Ð°Ñ€Ð°Ñž Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð°Ð¹ Ñтаронкі',
'export-submit' => 'ЭкÑпартаваць',
'export-addcattext' => 'Дадаць Ñтаронкі з катÑгорыі:',
'export-addcat' => 'Дадаць',
@@ -2716,6 +2769,8 @@ $1',
'thumbnail_error' => 'Памылка ÑтварÑÐ½ÑŒÐ½Ñ Ð¼Ñ–Ð½Ñ–Ñтуры: $1',
'djvu_page_error' => 'Старонка DjVu па-за прамежкам',
'djvu_no_xml' => 'Ðемагчыма атрымаць XML Ð´Ð»Ñ DjVu-файла',
+'thumbnail-temp-create' => 'Ðемагчыма Ñтварыць чаÑовы файл мініÑтуры',
+'thumbnail-dest-create' => 'Ðемагчыма захаваць мініÑтуру Ñž меÑцы прызначÑньнÑ',
'thumbnail_invalid_params' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼Ñтры мініÑтуры',
'thumbnail_dest_directory' => 'Ðемагчыма Ñтварыць мÑтавую дырÑкторыю',
'thumbnail_image-type' => 'Тып выÑвы не падтрымліваецца',
@@ -2763,6 +2818,11 @@ $1',
'import-upload' => 'Загрузіць XML-зьвеÑткі',
'import-token-mismatch' => 'Ð¡Ñ‚Ñ€Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі ÑÑÑÑ–Ñ–. Калі лаÑка, паÑпрабуйце ізноў.',
'import-invalid-interwiki' => 'Ðемагчыма імпартаваць з вызначанай вікі.',
+'import-error-edit' => 'Старонка «$1» не імпартаванаÑ, бо Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў на Ñе Ñ€Ñдагаваньне.',
+'import-error-create' => 'Старонка «$1» не імпартаванаÑ, бо Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў на Ñе ÑтварÑньне.',
+'import-error-interwiki' => 'Старонка «$1» не была імпартаванаÑ, таму што гÑÑ‚Ð°Ñ Ð½Ð°Ð·Ð²Ð° зарÑзÑÑ€Ð²Ð°Ð²Ð°Ð½Ð°Ñ Ð´Ð»Ñ Ñ–Ð½Ñ‚Ñрвікі.',
+'import-error-special' => 'Старонка «$1» не была імпартаванаÑ, таму што Ñна належыць да ÑпÑцыÑльнай праÑторы назваў, Ñтаронкі Ñž Ñкой не дазволеныÑ.',
+'import-error-invalid' => 'Старонка «$1» не была Ñ–Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ð½Ð°Ñ Ð·-за нÑÑлушнаÑьці назвы.',
# Import log
'importlogpage' => 'Журнал імпартаваньнÑÑž',
@@ -2772,74 +2832,87 @@ $1',
'import-logentry-interwiki' => 'імпартавана зь іншай вікі $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|вÑÑ€ÑÑ–Ñ|вÑÑ€ÑÑ–Ñ–|вÑÑ€Ñій}} з $2',
+# JavaScriptTest
+'javascripttest' => 'ТÑÑтаваньне JavaScript',
+'javascripttest-disabled' => 'ГÑта Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ.',
+'javascripttest-title' => 'Праводзіцца Ñ‚ÑÑтаваньне $1',
+'javascripttest-pagetext-noframework' => 'ГÑÑ‚Ð°Ñ Ñтаронка трымаецца Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²ÑÐ´Ð·ÐµÐ½ÑŒÐ½Ñ Ñ‚ÑÑтаў JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð±Ñ–Ð±Ð»Ñ–ÑÑ‚Ñка Ñ‚ÑÑÑ‚Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Â«$1».',
+'javascripttest-pagetext-frameworks' => 'Калі лаÑка, выберыце адну з прапанаваных бібліÑÑ‚Ñка Ñ‚ÑÑтаваньнÑ: $1',
+'javascripttest-pagetext-skins' => 'Выберыце афармленьне Ð´Ð»Ñ Ñ‚ÑÑтаваньнÑ:',
+'javascripttest-qunit-intro' => 'ГлÑдзіце [$1 дакумÑнтацыю па Ñ‚ÑÑтаваньні] на mediawiki.org.',
+'javascripttest-qunit-heading' => 'Ðабор QUnit-Ñ‚ÑÑтаў Ð´Ð»Ñ MediaWiki JavaScript',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ваша Ñтаронка ўдзельніка',
-'tooltip-pt-anonuserpage' => 'Старонка ўдзельніка Ð´Ð»Ñ IP-адраÑу, зь Ñкога Ð’Ñ‹ Ñ€Ñдагуеце',
-'tooltip-pt-mytalk' => 'Ваша Ñтаронка гутарак',
-'tooltip-pt-anontalk' => 'Старонка гутарак пра Ñ€Ñдагаваньні, Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð· гÑтага IP-адраÑу',
-'tooltip-pt-preferences' => 'Ð’Ð°ÑˆÑ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
-'tooltip-pt-watchlist' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ñтаронак, за зьменамі Ñкіх Ð’Ñ‹ назіраеце',
-'tooltip-pt-mycontris' => 'Ваш унёÑак',
-'tooltip-pt-login' => 'Ð’Ð°Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ°ÑŽÑ†ÑŒ увайÑьці, Ñ…Ð°Ñ†Ñ Ð³Ñта Ñ– неабавÑзкова.',
-'tooltip-pt-anonlogin' => 'Уваход у ÑÑ‹ÑÑ‚Ñму вітаецца, Ñ…Ð°Ñ†Ñ Ñ‘Ð½ не абавÑзковы.',
-'tooltip-pt-logout' => 'ВыйÑьці',
-'tooltip-ca-talk' => 'Ðбмеркаваньне зьмеÑту Ñтаронкі',
-'tooltip-ca-edit' => 'Ð’Ñ‹ можаце Ñ€Ñдагаваць гÑтую Ñтаронку. Калі лаÑка, ужывайце кнопку праглÑду перад захаваньнем.',
-'tooltip-ca-addsection' => 'Пачаць новую ÑÑкцыю',
-'tooltip-ca-viewsource' => 'ГÑÑ‚Ð°Ñ Ñтаронка абароненаÑ.
+'tooltip-pt-userpage' => 'Ваша Ñтаронка ўдзельніка',
+'tooltip-pt-anonuserpage' => 'Старонка ўдзельніка Ð´Ð»Ñ IP-адраÑу, зь Ñкога Ð’Ñ‹ Ñ€Ñдагуеце',
+'tooltip-pt-mytalk' => 'Ваша Ñтаронка гутарак',
+'tooltip-pt-anontalk' => 'Старонка гутарак пра Ñ€Ñдагаваньні, Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð· гÑтага IP-адраÑу',
+'tooltip-pt-preferences' => 'Ð’Ð°ÑˆÑ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
+'tooltip-pt-watchlist' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ñтаронак, за зьменамі Ñкіх Ð’Ñ‹ назіраеце',
+'tooltip-pt-mycontris' => 'Ваш унёÑак',
+'tooltip-pt-login' => 'Ð’Ð°Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ°ÑŽÑ†ÑŒ увайÑьці, Ñ…Ð°Ñ†Ñ Ð³Ñта Ñ– неабавÑзкова.',
+'tooltip-pt-anonlogin' => 'Уваход у ÑÑ‹ÑÑ‚Ñму вітаецца, Ñ…Ð°Ñ†Ñ Ñ‘Ð½ не абавÑзковы.',
+'tooltip-pt-logout' => 'ВыйÑьці',
+'tooltip-ca-talk' => 'Ðбмеркаваньне зьмеÑту Ñтаронкі',
+'tooltip-ca-edit' => 'Ð’Ñ‹ можаце Ñ€Ñдагаваць гÑтую Ñтаронку. Калі лаÑка, ужывайце кнопку праглÑду перад захаваньнем.',
+'tooltip-ca-addsection' => 'Пачаць новую ÑÑкцыю',
+'tooltip-ca-viewsource' => 'ГÑÑ‚Ð°Ñ Ñтаронка абароненаÑ.
Ðле можна паглÑдзець Ñе крынічны Ñ‚ÑкÑÑ‚',
-'tooltip-ca-history' => 'ÐœÑ–Ð½ÑƒÐ»Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ– гÑтай Ñтаронкі.',
-'tooltip-ca-protect' => 'Ðбараніць гÑтую Ñтаронку',
-'tooltip-ca-unprotect' => 'ЗьмÑніць абарону Ñтаронкі',
-'tooltip-ca-delete' => 'Выдаліць гÑтую Ñтаронку',
-'tooltip-ca-undelete' => 'Ðднавіць Ñ€Ñдагаваньні, Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð´Ð° Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½ÑŒÐ½Ñ Ð³Ñтай Ñтаронкі',
-'tooltip-ca-move' => 'ПеранеÑьці гÑтую Ñтаронку',
-'tooltip-ca-watch' => 'Дадаць гÑтую Ñтаронку Ñž Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
-'tooltip-ca-unwatch' => 'Выдаліць гÑтую Ñтаронку з Вашага ÑьпіÑу назіраньнÑ',
-'tooltip-search' => 'Шукаць у {{GRAMMAR:меÑны|{{SITENAME}}}}',
-'tooltip-search-go' => 'ПерайÑьці да Ñтаронкі з гÑтай назвай, калі Ñтаронка Ñ–Ñнуе',
-'tooltip-search-fulltext' => 'Шукаць гÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚ на Ñтаронках',
-'tooltip-p-logo' => 'Ðаведаць галоўную Ñтаронку',
-'tooltip-n-mainpage' => 'Ðаведаць галоўную Ñтаронку',
-'tooltip-n-mainpage-description' => 'Ðаведаць галоўную Ñтаронку',
-'tooltip-n-portal' => 'Пра праект, што Ð’Ñ‹ можаце зрабіць, дзе што знайÑьці',
-'tooltip-n-currentevents' => 'Ðтрымаць інфармацыю пра Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ð´Ð·ÐµÑ–',
-'tooltip-n-recentchanges' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ… зьменаў у {{GRAMMAR:меÑны|{{SITENAME}}}}.',
-'tooltip-n-randompage' => 'Паказаць выпадковую Ñтаронку',
-'tooltip-n-help' => 'МеÑца, каб пра ÑžÑÑ‘ даведацца.',
-'tooltip-t-whatlinkshere' => 'Ð¡ÑŒÐ¿Ñ–Ñ ÑƒÑÑ–Ñ… Ñтаронак, ÑÐºÑ–Ñ ÑпаÑылаюцца на гÑтую',
-'tooltip-t-recentchangeslinked' => 'ÐÐ¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ Ñž Ñтаронках, на ÑÐºÑ–Ñ ÑпаÑылаецца гÑÑ‚Ð°Ñ Ñтаронка',
-'tooltip-feed-rss' => 'RSS-Ñтужка Ð´Ð»Ñ Ð³Ñтай Ñтаронкі',
-'tooltip-feed-atom' => 'Atom-Ñтужка Ð´Ð»Ñ Ð³Ñтай Ñтаронкі',
-'tooltip-t-contributions' => 'Паказаць унёÑак гÑтага удзельніка/гÑтай удзельніцы',
-'tooltip-t-emailuser' => 'ДаÑлаць ліÑÑ‚ гÑтаму ўдзельніку/гÑтай удзельніцы па Ñлектроннай пошце',
-'tooltip-t-upload' => 'Загрузіць файл',
-'tooltip-t-specialpages' => 'Ð¡ÑŒÐ¿Ñ–Ñ ÑƒÑÑ–Ñ… ÑпÑцыÑльных Ñтаронак',
-'tooltip-t-print' => 'Ð’ÑÑ€ÑÑ–Ñ Ð³Ñтай Ñтаронкі Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ',
-'tooltip-t-permalink' => 'Ð¡Ñ‚Ð°Ð»Ð°Ñ ÑпаÑылка на гÑтую вÑÑ€ÑÑ–ÑŽ Ñтаронкі',
-'tooltip-ca-nstab-main' => 'Паказаць зьмеÑÑ‚ Ñтаронкі',
-'tooltip-ca-nstab-user' => 'Паказаць Ñтаронку ўдзельніка',
-'tooltip-ca-nstab-media' => 'Паказаць Ñтаронку мÑдыÑфайла',
-'tooltip-ca-nstab-special' => 'ГÑта ÑпÑцыÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка, Ñ– Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ Ñе Ñ€Ñдагаваць',
-'tooltip-ca-nstab-project' => 'Паказаць Ñтаронку праекту',
-'tooltip-ca-nstab-image' => 'Паказаць Ñтаронку файла',
-'tooltip-ca-nstab-mediawiki' => 'Паказаць ÑÑ‹ÑÑ‚Ñмнае паведамленьне',
-'tooltip-ca-nstab-template' => 'Паказаць шаблён',
-'tooltip-ca-nstab-help' => 'Паказаць Ñтаронку дапамогі',
-'tooltip-ca-nstab-category' => 'Паказаць Ñтаронку катÑгорыі',
-'tooltip-minoredit' => 'Пазначыць гÑтую зьмену Ñк дробную',
-'tooltip-save' => 'Захаваць Вашы зьмены',
-'tooltip-preview' => 'ПраглÑдзець Вашы зьмены. Калі лаÑка, выкарыÑтоўвайце гÑтую магчымаÑьць перад тым, Ñк захаваць Ñтаронку!',
-'tooltip-diff' => 'Паказаць Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– зьмены Ñž Ñ‚ÑкÑьце.',
-'tooltip-compareselectedversions' => 'Пабачыць розьніцу паміж дзьвюма абранымі вÑÑ€ÑÑ–Ñмі гÑтай Ñтаронкі.',
-'tooltip-watch' => 'Дадаць гÑтую Ñтаронку Ñž Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
-'tooltip-recreate' => 'Ðднавіць Ñтаронку, Ð½Ñ Ð³Ð»ÐµÐ´Ð·Ñчы на тое, што Ñна была выдаленаÑ',
-'tooltip-upload' => 'Пачаць загрузку',
-'tooltip-rollback' => '«Ðдкат» вÑртае Ñ€Ñдагаваньні папÑÑ€ÑднÑга ўдзельніка адным клікам.',
-'tooltip-undo' => '«СкаÑаваць» — ÑкаÑоўвае гÑтае Ñ€Ñдагаваньне Ñ– адкрывае акно Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñž Ñ€Ñжыме праглÑду.
+'tooltip-ca-history' => 'ÐœÑ–Ð½ÑƒÐ»Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ– гÑтай Ñтаронкі.',
+'tooltip-ca-protect' => 'Ðбараніць гÑтую Ñтаронку',
+'tooltip-ca-unprotect' => 'ЗьмÑніць абарону Ñтаронкі',
+'tooltip-ca-delete' => 'Выдаліць гÑтую Ñтаронку',
+'tooltip-ca-undelete' => 'Ðднавіць Ñ€Ñдагаваньні, Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð´Ð° Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½ÑŒÐ½Ñ Ð³Ñтай Ñтаронкі',
+'tooltip-ca-move' => 'ПеранеÑьці гÑтую Ñтаронку',
+'tooltip-ca-watch' => 'Дадаць гÑтую Ñтаронку Ñž Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
+'tooltip-ca-unwatch' => 'Выдаліць гÑтую Ñтаронку з Вашага ÑьпіÑу назіраньнÑ',
+'tooltip-search' => 'Шукаць у {{GRAMMAR:меÑны|{{SITENAME}}}}',
+'tooltip-search-go' => 'ПерайÑьці да Ñтаронкі з гÑтай назвай, калі Ñтаронка Ñ–Ñнуе',
+'tooltip-search-fulltext' => 'Шукаць гÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚ на Ñтаронках',
+'tooltip-p-logo' => 'Ðаведаць галоўную Ñтаронку',
+'tooltip-n-mainpage' => 'Ðаведаць галоўную Ñтаронку',
+'tooltip-n-mainpage-description' => 'Ðаведаць галоўную Ñтаронку',
+'tooltip-n-portal' => 'Пра праект, што Ð’Ñ‹ можаце зрабіць, дзе што знайÑьці',
+'tooltip-n-currentevents' => 'Ðтрымаць інфармацыю пра Ð°ÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ Ð¿Ð°Ð´Ð·ÐµÑ–',
+'tooltip-n-recentchanges' => 'Ð¡ÑŒÐ¿Ñ–Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ… зьменаў у {{GRAMMAR:меÑны|{{SITENAME}}}}.',
+'tooltip-n-randompage' => 'Паказаць выпадковую Ñтаронку',
+'tooltip-n-help' => 'МеÑца, каб пра ÑžÑÑ‘ даведацца.',
+'tooltip-t-whatlinkshere' => 'Ð¡ÑŒÐ¿Ñ–Ñ ÑƒÑÑ–Ñ… Ñтаронак, ÑÐºÑ–Ñ ÑпаÑылаюцца на гÑтую',
+'tooltip-t-recentchangeslinked' => 'ÐÐ¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ Ñž Ñтаронках, на ÑÐºÑ–Ñ ÑпаÑылаецца гÑÑ‚Ð°Ñ Ñтаронка',
+'tooltip-feed-rss' => 'RSS-Ñтужка Ð´Ð»Ñ Ð³Ñтай Ñтаронкі',
+'tooltip-feed-atom' => 'Atom-Ñтужка Ð´Ð»Ñ Ð³Ñтай Ñтаронкі',
+'tooltip-t-contributions' => 'Паказаць унёÑак гÑтага удзельніка/гÑтай удзельніцы',
+'tooltip-t-emailuser' => 'ДаÑлаць ліÑÑ‚ гÑтаму ўдзельніку/гÑтай удзельніцы па Ñлектроннай пошце',
+'tooltip-t-upload' => 'Загрузіць файл',
+'tooltip-t-specialpages' => 'Ð¡ÑŒÐ¿Ñ–Ñ ÑƒÑÑ–Ñ… ÑпÑцыÑльных Ñтаронак',
+'tooltip-t-print' => 'Ð’ÑÑ€ÑÑ–Ñ Ð³Ñтай Ñтаронкі Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ',
+'tooltip-t-permalink' => 'Ð¡Ñ‚Ð°Ð»Ð°Ñ ÑпаÑылка на гÑтую вÑÑ€ÑÑ–ÑŽ Ñтаронкі',
+'tooltip-ca-nstab-main' => 'Паказаць зьмеÑÑ‚ Ñтаронкі',
+'tooltip-ca-nstab-user' => 'Паказаць Ñтаронку ўдзельніка',
+'tooltip-ca-nstab-media' => 'Паказаць Ñтаронку мÑдыÑфайла',
+'tooltip-ca-nstab-special' => 'ГÑта ÑпÑцыÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка, Ñ– Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ Ñе Ñ€Ñдагаваць',
+'tooltip-ca-nstab-project' => 'Паказаць Ñтаронку праекту',
+'tooltip-ca-nstab-image' => 'Паказаць Ñтаронку файла',
+'tooltip-ca-nstab-mediawiki' => 'Паказаць ÑÑ‹ÑÑ‚Ñмнае паведамленьне',
+'tooltip-ca-nstab-template' => 'Паказаць шаблён',
+'tooltip-ca-nstab-help' => 'Паказаць Ñтаронку дапамогі',
+'tooltip-ca-nstab-category' => 'Паказаць Ñтаронку катÑгорыі',
+'tooltip-minoredit' => 'Пазначыць гÑтую зьмену Ñк дробную',
+'tooltip-save' => 'Захаваць Вашы зьмены',
+'tooltip-preview' => 'ПраглÑдзець Вашы зьмены. Калі лаÑка, выкарыÑтоўвайце гÑтую магчымаÑьць перад тым, Ñк захаваць Ñтаронку!',
+'tooltip-diff' => 'Паказаць Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– зьмены Ñž Ñ‚ÑкÑьце.',
+'tooltip-compareselectedversions' => 'Пабачыць розьніцу паміж дзьвюма абранымі вÑÑ€ÑÑ–Ñмі гÑтай Ñтаронкі.',
+'tooltip-watch' => 'Дадаць гÑтую Ñтаронку Ñž Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
+'tooltip-watchlistedit-normal-submit' => 'Выдаліць Ð¿Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ñтаронкі',
+'tooltip-watchlistedit-raw-submit' => 'Ðбнавіць ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
+'tooltip-recreate' => 'Ðднавіць Ñтаронку, Ð½Ñ Ð³Ð»ÐµÐ´Ð·Ñчы на тое, што Ñна была выдаленаÑ',
+'tooltip-upload' => 'Пачаць загрузку',
+'tooltip-rollback' => '«Ðдкат» вÑртае Ñ€Ñдагаваньні папÑÑ€ÑднÑга ўдзельніка адным клікам.',
+'tooltip-undo' => '«СкаÑаваць» — ÑкаÑоўвае гÑтае Ñ€Ñдагаваньне Ñ– адкрывае акно Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñž Ñ€Ñжыме праглÑду.
ДазвалÑе дадаваць прычыну адкату Ñž апіÑаньне зьменаў.',
-'tooltip-preferences-save' => 'Захаваць налады',
-'tooltip-summary' => 'УвÑдзіце кароткае апіÑаньне',
+'tooltip-preferences-save' => 'Захаваць налады',
+'tooltip-summary' => 'УвÑдзіце кароткае апіÑаньне',
# Metadata
'notacceptable' => 'Вікі-ÑÑрвÑÑ€ Ð½Ñ Ð¼Ð¾Ð¶Ð° адлюÑтраваць зьвеÑткі Ñž выглÑдзе, Ñкі здольны прачытаць Ваш браўзÑÑ€.',
@@ -2903,9 +2976,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Журнал патрулÑваньнÑÑž',
'patrol-log-header' => 'ГÑта журнал патрулÑваных вÑÑ€ÑÑ–ÑÑž.',
-'patrol-log-line' => 'пазначана $1 з $2 патрулÑваных $3',
-'patrol-log-auto' => '(аўтаматычна)',
-'patrol-log-diff' => 'вÑÑ€ÑÑ–Ñ $1',
'log-show-hide-patrol' => '$1 журнал патрулÑваньнÑÑž',
# Image deletion
@@ -2931,11 +3001,11 @@ $1',
'file-info' => 'памер файла: $1, тып MIME: $2',
'file-info-size' => '$1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}, памер файла: $3, тып MIME: $4',
'file-info-size-pages' => '$1 × $2 пікÑÑлаў, памер файла: $3, MIME-тып: $4, $5 {{PLURAL:$5|Ñтаронка|Ñтаронкі|Ñтаронак}}',
-'file-nohires' => '<small>ÐÑма вÑÑ€ÑÑ–Ñ– зь лепшым разрозьненьнем.</small>',
+'file-nohires' => 'ÐÑма вÑÑ€ÑÑ–Ñ– зь лепшым разрозьненьнем.',
'svg-long-desc' => 'SVG-файл, намінальна $1 × $2 {{PLURAL:$2|пікÑÑль|пікÑÑлі|пікÑÑлÑÑž}}, памер файла: $3.',
'show-big-image' => 'Ðайлепшае разрозьненьне',
-'show-big-image-preview' => '<small>Памер праглÑду: $1.</small>',
-'show-big-image-other' => '<small>Ð†Ð½ÑˆÑ‹Ñ Ñ€Ð°Ð·Ñ€Ð¾Ð·ÑŒÐ½ÐµÐ½ÑŒÐ½Ñ–: $1.</small>',
+'show-big-image-preview' => 'Памер праглÑду: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Іншае разрозьненьне|Ð†Ð½ÑˆÑ‹Ñ Ñ€Ð°Ð·Ñ€Ð¾Ð·ÑŒÐ½ÐµÐ½ÑŒÐ½Ñ–}}: $1.',
'show-big-image-size' => '$1 × $2 пікÑÑлаў',
'file-info-gif-looped' => 'паўтараючыÑÑ',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадры|кадраў}}',
@@ -2956,9 +3026,15 @@ $1',
'sp-newimages-showfrom' => 'Паказаць Ð½Ð¾Ð²Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹, Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ð½Ñ‹Ñ Ð¿Ð°Ð·ÑŒÐ½ÐµÐ¹ за $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'Ñ',
-'minutes-abbrev' => 'хв',
-'hours-abbrev' => 'г',
+'seconds-abbrev' => '$1 Ñ',
+'minutes-abbrev' => '$1 хв',
+'hours-abbrev' => '$1 г',
+'days-abbrev' => '$1 дз',
+'seconds' => '$1 {{PLURAL:$1|ÑÑкунда|ÑÑкунды|ÑÑкундаў}}',
+'minutes' => '$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}',
+'hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
+'days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
+'ago' => '$1 таму',
# Bad image list
'bad_image_list' => 'Фармат наÑтупны:
@@ -3449,13 +3525,6 @@ $5
'scarytranscludefailed' => '[Памылка Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½ÑŒÐ½Ñ ÑˆÐ°Ð±Ð»Ñ‘Ð½Ñƒ $1]',
'scarytranscludetoolong' => '[Занадта даўгі URL-адраÑ]',
-# Trackbacks
-'trackbackbox' => 'Trackback Ð´Ð»Ñ Ð³Ñтай Ñтаронкі:<br />
-$1',
-'trackbackremove' => '([$1 выдаліць])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback быў паÑьпÑхова выдалены.',
-
# Delete conflict
'deletedwhileediting' => "'''Увага''': ГÑÑ‚Ð°Ñ Ñтаронка была Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ Ð¿Ð°ÑÑŒÐ»Ñ Ñ‚Ð°Ð³Ð¾, Ñк Ð’Ñ‹ пачалі Ñе Ñ€Ñдагаваньне!",
'confirmrecreate' => "{{GENDER:$1|Удзельнік|Удзельніца}} [[User:$1|$1]] ([[User talk:$1|гутаркі]]) {{GENDER:$1|выдаліў|выдаліла}} гÑтую Ñтаронку, перад тым Ñк Ð’Ñ‹ пачалі Ñе Ñ€Ñдагаваць, з прычыны:
@@ -3547,6 +3616,7 @@ $1',
'watchlisttools-raw' => 'РÑдагаваць Ñк Ñ‚ÑкÑÑ‚',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|гутаркі]])',
'timezone-utc' => 'UTC',
# Core parser functions
@@ -3649,13 +3719,16 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'tags-hitcount' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
# Special:ComparePages
-'comparepages' => 'Параўнаньне Ñтаронак',
-'compare-selector' => 'Параўнаньне вÑÑ€ÑÑ–ÑÑž Ñтаронак',
-'compare-page1' => 'Старонка 1',
-'compare-page2' => 'Старонка 2',
-'compare-rev1' => 'Ð’ÑÑ€ÑÑ–Ñ 1',
-'compare-rev2' => 'Ð’ÑÑ€ÑÑ–Ñ 2',
-'compare-submit' => 'Параўнаць',
+'comparepages' => 'Параўнаньне Ñтаронак',
+'compare-selector' => 'Параўнаньне вÑÑ€ÑÑ–ÑÑž Ñтаронак',
+'compare-page1' => 'Старонка 1',
+'compare-page2' => 'Старонка 2',
+'compare-rev1' => 'Ð’ÑÑ€ÑÑ–Ñ 1',
+'compare-rev2' => 'Ð’ÑÑ€ÑÑ–Ñ 2',
+'compare-submit' => 'Параўнаць',
+'compare-invalid-title' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°.',
+'compare-title-not-exists' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ñтаронка не Ñ–Ñнуе.',
+'compare-revision-not-exists' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ Ð½Ðµ Ñ–Ñнуе.',
# Database error messages
'dberr-header' => 'ГÑÑ‚Ð°Ñ Ð²Ñ–ÐºÑ– не функцыÑнуе Ñпраўна',
@@ -3682,4 +3755,90 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'sqlite-has-fts' => '$1 з падтрымкай поўнатÑкÑтнага пошуку',
'sqlite-no-fts' => '$1 без падтрымкі поўнатÑкÑтнага пошуку',
+# New logging system
+'logentry-delete-delete' => '$1 выдаліў Ñтаронку $3',
+'logentry-delete-restore' => '$1 аднавіў Ñтаронку $3',
+'logentry-delete-event' => '$1 зьмÑніў бачнаÑьць $5 {{PLURAL:$5|падзеі Ñž журнале|падзеÑÑž у журнале|падзеÑÑž у журнале}} на $3: $4',
+'logentry-delete-revision' => '$1 зьмÑніў бачнаÑьць $5 {{PLURAL:$5|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž|вÑÑ€ÑÑ–ÑÑž}} Ñтаронкі $3: $4',
+'logentry-delete-event-legacy' => '$1 зьмÑніў бачнаÑьць падзеÑÑž у журнале на $3',
+'logentry-delete-revision-legacy' => '$1 зьмÑніў бачнаÑьць вÑÑ€ÑÑ–ÑÑž Ñтаронкі $3',
+'logentry-suppress-delete' => '$1 Ñхаваў Ñтаронку $3',
+'logentry-suppress-event' => '$1 прыхавана зьмÑніў бачнаÑьць $5 {{PLURAL:$5|падзеі Ñž журнале|падзеÑÑž у журнале|падзеÑÑž у журнале}} на $3: $4',
+'logentry-suppress-revision' => '$1 прыхавана зьмÑніў бачнаÑьць $5 {{PLURAL:$5|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž|вÑÑ€ÑÑ–ÑÑž}} Ñтаронкі $3: $4',
+'logentry-suppress-event-legacy' => '$1 прыхавана зьмÑніў бачнаÑьць падзеÑÑž у журнале на $3',
+'logentry-suppress-revision-legacy' => '$1 прыхавана зьмÑніў бачнаÑьць вÑÑ€ÑÑ–ÑÑž Ñтаронкі $3',
+'revdelete-content-hid' => 'зьмеÑÑ‚ Ñхаваны',
+'revdelete-summary-hid' => 'апіÑаньне Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñхаванае',
+'revdelete-uname-hid' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° Ñхаванае',
+'revdelete-content-unhid' => 'зьмеÑÑ‚ адкрыты',
+'revdelete-summary-unhid' => 'апіÑаньне Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ‚Ð°Ðµ',
+'revdelete-uname-unhid' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° адкрытае',
+'revdelete-restricted' => 'ужыць абмежаваньні Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
+'revdelete-unrestricted' => 'зьнÑÑ‚Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½ÑŒÐ½Ñ– Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
+'logentry-move-move' => '$1 Ð¿ÐµÑ€Ð°Ð½Ñ‘Ñ Ñтаронку $3 у $4',
+'logentry-move-move-noredirect' => '$1 Ð¿ÐµÑ€Ð°Ð½Ñ‘Ñ Ñтаронку $3 у $4 без пакінутага перанакіраваньнÑ',
+'logentry-move-move_redir' => '$1 Ð¿ÐµÑ€Ð°Ð½Ñ‘Ñ Ñтаронку $3 у $4 паўзьверх перанакіраваньнÑ',
+'logentry-move-move_redir-noredirect' => '$1 Ð¿ÐµÑ€Ð°Ð½Ñ‘Ñ Ñтаронку $3 у $4 паўзьверх Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð±ÐµÐ· пакінутага перанакіраваньнÑ',
+'logentry-patrol-patrol' => '$1 пазначыў вÑÑ€ÑÑ–ÑŽ $4 Ñтаронкі $3 Ñк правераную',
+'logentry-patrol-patrol-auto' => '$1 аўтаматычна пазначыў вÑÑ€ÑÑ–ÑŽ $4 Ñтаронкі $3 Ñк правераную',
+'logentry-newusers-newusers' => '$1 Ñтварыў рахунак',
+'logentry-newusers-create' => '$1 Ñтварыў рахунак',
+'logentry-newusers-create2' => '$1 Ñтварыў рахунак $3',
+'logentry-newusers-autocreate' => 'Рахунак $1 быў Ñтвораны аўтаматычна',
+'newuserlog-byemail' => 'Пароль адаÑланы па Ñлектроннай пошце',
+
+# Feedback
+'feedback-bugornote' => 'Калі Ð’Ñ‹ гатовы падрабÑзна апіÑаць Ñ‚Ñхнічную праблему, калі лаÑка [$1 паведаміце пра памылку].
+У адваротным выпадку, Ð’Ñ‹ можаце выкарыÑтоўваць проÑтую форму пададзеную ніжÑй. Ваш камÑнтар будзе дададзены на Ñтаронку «[$3 $2]», разам з Вашым іменем удзельніка Ñ– выкарыÑтоўваемым браўзÑрам.',
+'feedback-subject' => 'ТÑма:',
+'feedback-message' => 'Паведамленьне:',
+'feedback-cancel' => 'СкаÑаваць',
+'feedback-submit' => 'ДаÑлаць водгук',
+'feedback-adding' => 'Даданьне водгуку на Ñтаронку…',
+'feedback-error1' => 'Памылка: невÑдомы вынік з API',
+'feedback-error2' => 'Памылка Ñ€ÑдагаваньнÑ',
+'feedback-error3' => 'Памылка: нÑма адказу ад API',
+'feedback-thanks' => 'ДзÑкуй! Ваш водгук быў разьмешчаны на Ñтаронцы «[$2 $1]».',
+'feedback-close' => 'Выканана',
+'feedback-bugcheck' => 'Выдатна! Толькі праверце, магчыма гÑÑ‚Ñ‹Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÑ– ўжо [$1 вÑдомыÑ].',
+'feedback-bugnew' => 'Я праверыў. ГÑта Ð½Ð¾Ð²Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°',
+
+# API errors
+'api-error-badaccess-groups' => 'У Ð’Ð°Ñ Ð½Ñма дазволу загружаць файлы Ñž гÑтую вікі.',
+'api-error-badtoken' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: нÑÑлушны ключ.',
+'api-error-copyuploaddisabled' => 'Загрузка з URL-адраÑу Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð½Ð° гÑтым ÑÑрвÑры.',
+'api-error-duplicate' => 'Ужо {{PLURAL:$1|Ñ–Ñнуе [$2 іншы файл]|Ñ–Ñнуюць [$2 Ñ–Ð½ÑˆÑ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹]}} з такім жа зьмеÑтам.',
+'api-error-duplicate-archive' => 'Раней на Ñайце {{PLURAL:$1|ўжо быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зьмеÑтам, але {{PLURAL:$1|ён быў выдалены|Ñны былі выдаленыÑ}}.',
+'api-error-duplicate-archive-popup-title' => 'Дублікаты {{PLURAL:$1|файла, Ñкі ўжо быў выдалены|файлаў, ÑÐºÑ–Ñ ÑžÐ¶Ð¾ былі выдаленыÑ}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|ІдÑнтычны файл|ІдÑÐ½Ñ‚Ñ‹Ñ‡Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹}}',
+'api-error-empty-file' => 'ДаÑланы Вамі файл быў пуÑÑ‚Ñ‹.',
+'api-error-emptypage' => 'СтварÑньне новых пуÑÑ‚Ñ‹Ñ… Ñтаронак забаронена.',
+'api-error-fetchfileerror' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½ÑŒÐ½Ñ Ñ„Ð°Ð¹Ð»Ð° штоÑьці здарылаÑÑ.',
+'api-error-file-too-large' => 'ДаÑланы Вамі файл занадта вÑлікі.',
+'api-error-filename-tooshort' => 'Ðазва файла занадта кароткаÑ.',
+'api-error-filetype-banned' => 'ГÑÑ‚Ñ‹ тып файла забаронены.',
+'api-error-filetype-missing' => 'У файла нÑма пашырÑньнÑ.',
+'api-error-hookaborted' => 'ÐŸÑ€Ð°Ð¿Ð°Ð½Ð°Ð²Ð°Ð½Ð°Ñ Ð’Ð°Ð¼Ñ– зьмена была Ð°Ð´Ñ…Ñ–Ð»ÐµÐ½Ð°Ñ Ð°Ð¿Ñ€Ð°Ñ†Ð¾ÑžÑˆÑ‡Ñ‹ÐºÐ°Ð¼ пашырÑньнÑ.',
+'api-error-http' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: немагчыма далучыцца да ÑÑрвÑра.',
+'api-error-illegal-filename' => 'ÐÐµÐ´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° файла.',
+'api-error-internal-error' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð°Ð¿Ñ€Ð°Ñ†Ð¾ÑžÐºÑ– Вашага файла штоÑьці здарылаÑÑ.',
+'api-error-invalid-file-key' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð½Ñ Ð±Ñ‹Ñž знойдзены чаÑовы файл.',
+'api-error-missingparam' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: запыт бракуе парамÑтраў.',
+'api-error-missingresult' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: немагчыма вызначыць, ці паÑьпÑхова зробленае капіÑваньне.',
+'api-error-mustbeloggedin' => 'Ð”Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÑ– файлаў неабходна ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму.',
+'api-error-mustbeposted' => 'Памылка гÑтага праграмнага забеÑьпÑчÑньнÑ; Ñно не выкарыÑтоўвае Ñлушны HTTP-мÑтад.',
+'api-error-noimageinfo' => 'Файл загружаны, але ÑÑрвÑÑ€ Ð½Ñ Ð´Ð°Ñž пра Ñго ніÑкай інфармацыі.',
+'api-error-nomodule' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð½Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ñ‹ модуль загрузкі.',
+'api-error-ok-but-empty' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: нÑма адказу ад ÑÑрвÑра.',
+'api-error-overwrite' => 'Замена Ñ–Ñнуючага файла забароненаÑ.',
+'api-error-stashfailed' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: ÑÑрвÑÑ€ Ð½Ñ Ð·Ð¼Ð¾Ð³ захаваць чаÑовы файл.',
+'api-error-timeout' => 'СÑрвÑÑ€ не адказаў у чаканы Ñ‚Ñрмін.',
+'api-error-unclassified' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°',
+'api-error-unknown-code' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: «$1».',
+'api-error-unknown-error' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÑ– файла здарылаÑÑ ÑˆÑ‚Ð¾Ñьці невÑдомае.',
+'api-error-unknown-warning' => 'ÐевÑдомае папÑÑ€Ñджаньне: $1',
+'api-error-unknownerror' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: «$1».',
+'api-error-uploaddisabled' => 'Загрузка Ñž гÑтую вікі адключанаÑ.',
+'api-error-verification-error' => 'ГÑÑ‚Ñ‹ файл можа быць пашкоджаны, ці мае нÑÑлушнае пашырÑньне.',
+
);
diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php
index 7664bac4..e283d1c7 100644
--- a/languages/messages/MessagesBg.php
+++ b/languages/messages/MessagesBg.php
@@ -57,86 +57,86 @@ $bookstoreList = array(
);
$magicWords = array(
- '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', 'ТЕКУЩМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ТЕКУЩМЕСЕЦ1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ТЕКУЩМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ТЕКУЩМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ТЕКУЩМЕСЕЦСЪКР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ТЕКУЩДЕÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ТЕКУЩДЕÐ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ТЕКУЩДЕÐИМЕ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ТЕКУЩÐГОДИÐÐ', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ТЕКУЩОВРЕМЕ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ТЕКУЩЧÐС', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'БРОЙСТРÐÐИЦИ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'БРОЙСТÐТИИ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'БРОЙФÐЙЛОВЕ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'БРОЙÐКТИВÐИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'БРОЙРЕДÐКЦИИ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'СТРÐÐИЦÐИ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВО', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВОИ', 'NAMESPACEE' ),
- 'fullpagename' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐИ', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐИ', 'SUBPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ИМЕ_БЕСЕДÐ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ИМЕ_БЕСЕДÐИ', 'TALKPAGENAMEE' ),
- 'msg' => array( '0', 'СЪОБЩ:', 'MSG:' ),
- 'subst' => array( '0', 'ЗÐМЕСТ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'СЪОБЩБУ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'мини', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'вдÑÑно', 'дÑÑно', 'д', 'right' ),
- 'img_left' => array( '1', 'влÑво', 'лÑво', 'л', 'left' ),
- 'img_none' => array( '1', 'н', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1п', '$1px' ),
- 'img_center' => array( '1', 'център', 'центр', 'ц', 'center', 'centre' ),
- 'img_framed' => array( '1', 'рамка', 'врамка', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'безрамка', 'frameless' ),
- 'img_border' => array( '1', 'ръб', 'контур', 'border' ),
- 'int' => array( '0', 'ВЪТР:', 'INT:' ),
- 'sitename' => array( '1', 'ИМЕÐÐСÐЙТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'ИП:', 'NS:' ),
- 'localurl' => array( '0', 'ЛОКÐЛЕÐÐДРЕС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛОКÐЛЕÐÐДРЕСИ:', 'LOCALURLE:' ),
- 'server' => array( '0', 'СЪРВЪР', 'SERVER' ),
- 'servername' => array( '0', 'ИМЕÐÐСЪРВЪРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ПЪТДОСКРИПТÐ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
- 'currentweek' => array( '1', 'ТЕКУЩÐСЕДМИЦÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ТЕКУЩ_ДЕÐ_ОТ_СЕДМИЦÐТÐ', 'CURRENTDOW' ),
- 'revisionid' => array( '1', 'ИД_ÐÐ_ВЕРСИЯТÐ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МЕСЕЦ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ГОДИÐÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONYEAR' ),
- 'plural' => array( '0', 'ÐœÐ_ЧИСЛО:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПЪЛЕÐ_ÐДРЕС:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ПЪЛЕÐ_ÐДРЕСИ:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'МБПЪРВÐ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ГБПЪРВÐ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'МБ:', 'LC:' ),
- 'uc' => array( '0', 'ГБ:', 'UC:' ),
- 'raw' => array( '0', 'ÐЕОБРÐБ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ПОКÐЗВ_ЗÐГЛÐВИЕ', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__ВРЪЗКÐ_ЗÐ_ÐОВ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
- 'language' => array( '0', '#ЕЗИК:', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'БРОЙÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
- 'defaultsort' => array( '1', 'СОРТКÐТ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'hiddencat' => array( '1', '__СКРИТÐКÐТЕГОРИЯ__', '__HIDDENCAT__' ),
- 'index' => array( '1', '__ИÐДЕКСИРÐÐЕ__', '__INDEX__' ),
- 'noindex' => array( '1', '__БЕЗИÐДЕКСИРÐÐЕ__', '__NOINDEX__' ),
+ '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', 'ТЕКУЩМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ТЕКУЩМЕСЕЦ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ТЕКУЩМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ТЕКУЩМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ТЕКУЩМЕСЕЦСЪКР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ТЕКУЩДЕÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ТЕКУЩДЕÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ТЕКУЩДЕÐИМЕ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ТЕКУЩÐГОДИÐÐ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ТЕКУЩОВРЕМЕ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ТЕКУЩЧÐС', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'БРОЙСТРÐÐИЦИ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'БРОЙСТÐТИИ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'БРОЙФÐЙЛОВЕ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'БРОЙÐКТИВÐИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'БРОЙРЕДÐКЦИИ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'СТРÐÐИЦÐИ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВО', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВОИ', 'NAMESPACEE' ),
+ 'fullpagename' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐИ', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐИ', 'SUBPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ИМЕ_БЕСЕДÐ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ИМЕ_БЕСЕДÐИ', 'TALKPAGENAMEE' ),
+ 'msg' => array( '0', 'СЪОБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'ЗÐМЕСТ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'СЪОБЩБУ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'мини', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'вдÑÑно', 'дÑÑно', 'д', 'right' ),
+ 'img_left' => array( '1', 'влÑво', 'лÑво', 'л', 'left' ),
+ 'img_none' => array( '1', 'н', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1п', '$1px' ),
+ 'img_center' => array( '1', 'център', 'центр', 'ц', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'рамка', 'врамка', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'безрамка', 'frameless' ),
+ 'img_border' => array( '1', 'ръб', 'контур', 'border' ),
+ 'int' => array( '0', 'ВЪТР:', 'INT:' ),
+ 'sitename' => array( '1', 'ИМЕÐÐСÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'ИП:', 'NS:' ),
+ 'localurl' => array( '0', 'ЛОКÐЛЕÐÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛОКÐЛЕÐÐДРЕСИ:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'СЪРВЪР', 'SERVER' ),
+ 'servername' => array( '0', 'ИМЕÐÐСЪРВЪРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ПЪТДОСКРИПТÐ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'ТЕКУЩÐСЕДМИЦÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ТЕКУЩ_ДЕÐ_ОТ_СЕДМИЦÐТÐ', 'CURRENTDOW' ),
+ 'revisionid' => array( '1', 'ИД_ÐÐ_ВЕРСИЯТÐ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЕЦ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ГОДИÐÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONYEAR' ),
+ 'plural' => array( '0', 'ÐœÐ_ЧИСЛО:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПЪЛЕÐ_ÐДРЕС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПЪЛЕÐ_ÐДРЕСИ:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'МБПЪРВÐ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ГБПЪРВÐ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'МБ:', 'LC:' ),
+ 'uc' => array( '0', 'ГБ:', 'UC:' ),
+ 'raw' => array( '0', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ПОКÐЗВ_ЗÐГЛÐВИЕ', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__ВРЪЗКÐ_ЗÐ_ÐОВ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
+ 'language' => array( '0', '#ЕЗИК:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'БРОЙÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
+ 'defaultsort' => array( '1', 'СОРТКÐТ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'hiddencat' => array( '1', '__СКРИТÐКÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'index' => array( '1', '__ИÐДЕКСИРÐÐЕ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__БЕЗИÐДЕКСИРÐÐЕ__', '__NOINDEX__' ),
);
$specialPageAliases = array(
@@ -595,20 +595,22 @@ $1',
'formerror' => 'Възникна грешка при изпращане на формулÑра',
'badarticleerror' => 'ДейÑтвието не може да Ñе изпълни върху Ñтраницата.',
'cannotdelete' => 'Указаната Ñтраница или файл "$1" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от нÑкой друг.',
+'cannotdelete-title' => 'Страницата „$1“ не може да бъде изтрита',
'badtitle' => 'Ðевалидно заглавие',
'badtitletext' => 'Желаното заглавие на Ñтраница е невалидно, празно или неправилна препратка към друго уики. Възможно е да Ñъдържа знаци, които не Ñа позволени в заглавиÑ.',
-'perfcached' => 'Следните данни Ñа извлечени от Ñклада и затова може да не отговарÑÑ‚ на текущото ÑÑŠÑтоÑние:',
-'perfcachedts' => 'Данните Ñа Ñкладирани и обновени за поÑледно на $1.',
+'perfcached' => 'Следните данни Ñа извлечени от Ñклада и затова може да не отговарÑÑ‚ на текущото ÑÑŠÑтоÑние. Ð’ Ñкладираното копие {{PLURAL:$1|е допуÑтим най-много един резултат|Ñа допуÑтими най-много $1 резултата}}.',
+'perfcachedts' => 'Данните Ñа Ñкладирани и обновени за поÑледно на $1. Ðай-много {{PLURAL:$4|един резултат е допуÑтим и наличен|$4 резултата Ñа допуÑтими и налични}} в Ñкладираното копие.',
'querypage-no-updates' => 'ОбновÑването на тази Ñтраница в момента е изключено. ЗаÑега данните тук нÑма да бъдат обновÑвани.',
'wrong_wfQuery_params' => 'Ðевалидни аргументи за wfQuery()<br />
ФункциÑ: $1<br />
ЗаÑвка: $2',
'viewsource' => 'Преглед на кода',
-'viewsourcefor' => 'за $1',
+'viewsource-title' => 'Преглеждане на кода на $1',
'actionthrottled' => 'Ограничение в ÑкороÑтта',
'actionthrottledtext' => 'Като чаÑÑ‚ от защитата против Ñпам, многократното повтарÑне на това дейÑтвие за кратък период от време е ограничено и вие вече Ñте надвишили лимита Ñи. Опитайте отново Ñлед нÑколко минути.',
'protectedpagetext' => 'Тази Ñтраница е заключена за редактиране.',
'viewsourcetext' => 'Можете да разгледате и да копирате кодa на Ñтраницата:',
+'viewyourtext' => "Можете да прегледате и копирате Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´ на '''вашите редакции''' на тази Ñтраница:",
'protectedinterface' => 'Тази Ñтраница Ñъдържа текÑÑ‚, нужен за работата на ÑиÑтемата. Ð¢Ñ Ðµ защитена против редактиране, за да Ñе предотвратÑÑ‚ възможни злоупотреби.',
'editinginterface' => "'''Внимание:''' Редактирате Ñтраница, коÑто Ñе използва за интерфейÑа на Ñофтуера. ПромÑната й ще повлиÑе на Ð²ÑŠÐ½ÑˆÐ½Ð¸Ñ Ð²Ð¸Ð´ на уикито.
За превеждане обмиÑлете използването на [//translatewiki.net/wiki/Main_Page?setlang=bg translatewiki.net], проектът за локализиране на MediaWiki.",
@@ -708,6 +710,7 @@ $2',
'noemailprefs' => 'За да работÑÑ‚ тези функционалноÑти, Ñ‚Ñ€Ñбва да поÑочите Ð°Ð´Ñ€ÐµÑ Ð½Ð° електронна поща в Ñвоите наÑтройки.',
'emailconfirmlink' => 'Потвърждаване на адреÑа за електронна поща',
'invalidemailaddress' => 'ВъведениÑÑ‚ Ð°Ð´Ñ€ÐµÑ Ð½Ðµ може да бъде приет, тъй като не ÑъответÑтва на формата на Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща. Въведете коректен Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ оÑтавете полето празно.',
+'cannotchangeemail' => 'ÐдреÑите за електронна поща на Ñметките не могат да бъдат променÑни в това уики.',
'accountcreated' => 'ПотребителÑката Ñметка беше Ñъздадена',
'accountcreatedtext' => 'ПотребителÑката Ñметка за $1 беше Ñъздадена.',
'createaccount-title' => 'Създаване на Ñметка за {{SITENAME}}',
@@ -723,6 +726,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'ÐеизвеÑтна грешка в mail() функциÑта на PHP',
+'user-mail-no-addy' => 'Опитвате Ñе да изпратите е-пиÑмо без да е поÑочен Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща.',
# Change password dialog
'resetpass' => 'ПромÑна на парола',
@@ -743,16 +747,18 @@ $2',
'resetpass-temp-password' => 'Временна парола:',
# Special:PasswordReset
-'passwordreset' => 'ВъзÑтановÑване на парола',
-'passwordreset-text' => 'След попълването на формулÑра ще получите пиÑмо Ñ Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° потребителÑката Ñметка.',
-'passwordreset-legend' => 'ВъзÑтановÑване на парола',
-'passwordreset-disabled' => 'ВъзÑтановÑването на паролата е изключено в това уики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Въведете нÑÐºÐ¾Ñ Ð¾Ñ‚ информациите по-долу}}',
-'passwordreset-username' => 'ПотребителÑко име:',
-'passwordreset-domain' => 'Домейн:',
-'passwordreset-email' => 'Електронна поща:',
-'passwordreset-emailtitle' => 'ПодробноÑти за Ñметката в {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'ÐÑкой (вероÑтно вие, от IP Ð°Ð´Ñ€ÐµÑ $1) поиÑка напомнÑне за
+'passwordreset' => 'ВъзÑтановÑване на парола',
+'passwordreset-text' => 'След попълването на формулÑра ще получите пиÑмо Ñ Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° потребителÑката Ñметка.',
+'passwordreset-legend' => 'ВъзÑтановÑване на парола',
+'passwordreset-disabled' => 'ВъзÑтановÑването на паролата е изключено в това уики.',
+'passwordreset-pretext' => '{{PLURAL:$1||Въведете нÑÐºÐ¾Ñ Ð¾Ñ‚ информациите по-долу}}',
+'passwordreset-username' => 'ПотребителÑко име:',
+'passwordreset-domain' => 'Домейн:',
+'passwordreset-capture' => 'Преглеждане на електронното пиÑмо?',
+'passwordreset-capture-help' => 'ПоÑтавÑнето на отметка в това поле ще покаже електронното пиÑмо (Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ‚Ð° парола), което ще бъде изпратено и до потребителÑ.',
+'passwordreset-email' => 'Електронна поща:',
+'passwordreset-emailtitle' => 'ПодробноÑти за Ñметката в {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'ÐÑкой (вероÑтно вие, от IP Ð°Ð´Ñ€ÐµÑ $1) поиÑка напомнÑне за
данните от Ñметката в {{SITENAME}} ($4). За {{PLURAL:$3|Ñледната Ñметка|Ñледните Ñметки}}
е поÑочен този Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща:
@@ -762,7 +768,7 @@ $2
Сега би Ñ‚Ñ€Ñбвало да влезете в ÑиÑтемата и да Ñи изберете нова парола. Ðко заÑвката е направена от друг или пък Ñте Ñи
Ñпомнили паролата и не иÑкате да Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñте, можете да пренебрегнете това Ñъобщение и да продължите да използвате
Ñтарата Ñи парола.',
-'passwordreset-emailtext-user' => 'Потребител $1 от {{SITENAME}} поиÑка напомнÑне за данните от Ñметката в {{SITENAME}}
+'passwordreset-emailtext-user' => 'Потребител $1 от {{SITENAME}} поиÑка напомнÑне за данните от Ñметката в {{SITENAME}}
($4). За {{PLURAL:$3|Ñледната Ñметка|Ñледните Ñметки}} е поÑочен този Ð°Ð´Ñ€ÐµÑ Ð·Ð° електронна поща:
$2
@@ -771,9 +777,22 @@ $2
Сега би Ñ‚Ñ€Ñбвало да влезете в ÑиÑтемата и да Ñи изберете нова парола. Ðко заÑвката е направена
от друг или пък Ñте Ñи Ñпомнили паролата и не иÑкате да Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñте, можете да пренебрегнете
това Ñъобщение и да продължите да използвате Ñтарата Ñи парола.',
-'passwordreset-emailelement' => 'ПотребителÑко име: $1
+'passwordreset-emailelement' => 'ПотребителÑко име: $1
Временна парола: $2',
-'passwordreset-emailsent' => 'Беше изпратено напомнÑщо пиÑмо на електронната поща.',
+'passwordreset-emailsent' => 'Беше изпратено напомнÑщо пиÑмо на електронната поща.',
+'passwordreset-emailsent-capture' => 'По-долу е показано електронното пиÑмо за напомнÑне, което беше изпратено.',
+'passwordreset-emailerror-capture' => 'По-долу е показано Ñъздадено електронно пиÑмо за напомнÑне, което не беше изпратено на потребителÑ: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ПромÑна на адреÑа за е-поща',
+'changeemail-header' => 'ПромÑна на адреÑа за е-поща на Ñметката',
+'changeemail-text' => 'Попълването на този формулÑÑ€ ще промени адреÑа за електронна поща. Ðеобходимо е да Ñе въведе и паролата, за да Ñе потвърди промÑната.',
+'changeemail-no-info' => 'За да доÑтъпвате тази Ñтраница директно, необходимо е да влезете в ÑиÑтемата.',
+'changeemail-oldemail' => 'Текущ Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
+'changeemail-newemail' => 'Ðов Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
+'changeemail-none' => '(нÑма)',
+'changeemail-submit' => 'ПромÑна на е-пощата',
+'changeemail-cancel' => 'Отказване',
# Edit page toolbar
'bold_sample' => 'Получер текÑÑ‚',
@@ -842,9 +861,6 @@ $2
ТекущиÑÑ‚ ви IP-Ð°Ð´Ñ€ÐµÑ Ðµ $3, а номерът на блокирането ви е $5. Включвайте ги във вÑÑко питане, което правите.",
'blockednoreason' => 'не е указана причина',
-'blockedoriginalsource' => "По-долу е показано Ñъдържанието на '''$1''':",
-'blockededitsource' => "По-долу е показан текÑÑ‚ÑŠÑ‚ на '''вашите редакции''' на '''$1''':",
-'whitelistedittitle' => 'Ðеобходимо е да влезете, за да може да редактирате',
'whitelistedittext' => 'Редактирането на Ñтраници изиÑква $1 в ÑиÑтемата.',
'confirmedittext' => 'Ðеобходимо е да потвърдите електронната Ñи поща, преди да редактирате Ñтраници.
Въведете и потвърдете адреÑа Ñи на [[Special:Preferences|Ñтраницата Ñ Ð½Ð°Ñтройките]].',
@@ -925,7 +941,8 @@ $2
Ðко Ñте ползвали чужди материали, за които имате разрешение, непременно поÑочете източника.
<div style=\"font-variant:small-caps\">'''Ðе публикувайте Ð¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ñки права без разрешение!'''</div>",
-'longpageerror' => "'''ГРЕШКÐ: ТекÑÑ‚ÑŠÑ‚, който пращате, е Ñ Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° $1 килобайта, което надвишава Ð¿Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимум от $2 килобайта. Заради това не може да бъде Ñъхранен.'''",
+'longpageerror' => "'''ГРЕШКÐ: ИзпратениÑÑ‚ текÑÑ‚ е Ñ Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава Ð¿Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.'''
+Поради тази причина той не може да бъде Ñъхранен.",
'readonlywarning' => "'''Ð’ÐИМÐÐИЕ: Базата от данни беше затворена за поддръжка, затова в момента промените ви не могат да бъдат Ñъхранени. Ðко желаете, можете да Ñъхраните Ñтраницата като текÑтов файл и да Ñе опитате да Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÑƒÐ²Ð°Ñ‚Ðµ по-къÑно.'''
ÐдминиÑтраторът, който е затворил базата от данни, е поÑочил Ñледната причина: $1",
@@ -1088,8 +1105,6 @@ $2
'revdelete-unsuppress' => 'Премахване на ограничениÑта за възÑтановените верÑии',
'revdelete-log' => 'Причина:',
'revdelete-submit' => 'Прилагане към {{PLURAL:$1|избраната верÑиÑ|избраните верÑии}}',
-'revdelete-logentry' => 'промени видимоÑтта на верÑÐ¸Ñ Ð½Ð° [[$1]]',
-'logdelete-logentry' => 'промени видимоÑтта на Ñъбитие за [[$1]]',
'revdelete-success' => "'''ВидимоÑтта на верÑиÑта беше променена уÑпешно.'''",
'revdelete-failure' => "'''ВидимоÑтта на редакциÑта не може да бъде обновена:'''
$1",
@@ -1101,15 +1116,6 @@ $1",
'revdel-restore-visible' => 'видими редакции',
'pagehist' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° Ñтраницата',
'deletedhist' => 'Изтрита иÑториÑ',
-'revdelete-content' => 'Ñъдържание',
-'revdelete-summary' => 'резюме',
-'revdelete-uname' => 'потребителÑко име',
-'revdelete-restricted' => 'добавени Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð° админиÑтраторите',
-'revdelete-unrestricted' => 'премахнати Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð° админиÑтраторите',
-'revdelete-hid' => 'Ñкри $1',
-'revdelete-unhid' => 'разкри $1',
-'revdelete-log-message' => '$1 за $2 {{PLURAL:$2|верÑиÑ|верÑии}}',
-'logdelete-log-message' => '$1 за $2 {{PLURAL:$2|Ñъбитие|ÑъбитиÑ}}',
'revdelete-hide-current' => 'Грешка при Ñкриване на елемента от $2, $1: предÑтавлÑва текущата верÑиÑ.
Ð¢Ñ Ð½Ðµ може да бъде Ñкрита.',
'revdelete-show-no-access' => 'Грешка при показване на обект, датиран към $2, $1: обектът е бил отбелÑзан като "ограничен".
@@ -1265,12 +1271,14 @@ $1",
'prefs-rc' => 'ПоÑледни промени',
'prefs-watchlist' => 'СпиÑък за наблюдение',
'prefs-watchlist-days' => 'Брой дни, които да Ñе показват в ÑпиÑъка за наблюдение:',
-'prefs-watchlist-days-max' => 'Ðай-много 7 дни',
+'prefs-watchlist-days-max' => 'Ðай-много $1 {{PLURAL:$1|ден|дни}}',
'prefs-watchlist-edits' => 'Брой редакции, които Ñе показват в Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÑпиÑък за наблюдение:',
'prefs-watchlist-edits-max' => 'МакÑимален брой: 1000',
'prefs-watchlist-token' => 'Уникален идентификатор на ÑпиÑъка за наблюдение:',
'prefs-misc' => 'Други',
'prefs-resetpass' => 'ПромÑна на паролата',
+'prefs-changeemail' => 'ПромÑна на е-поща',
+'prefs-setemail' => 'ÐаÑтройка на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща',
'prefs-email' => 'ÐаÑтройки за електронната поща',
'prefs-rendering' => 'Облик',
'saveprefs' => 'СъхранÑване',
@@ -1370,7 +1378,7 @@ $1",
'userrights-lookup-user' => 'УправлÑване на потребителÑките групи',
'userrights-user-editname' => 'ПотребителÑко име:',
'editusergroup' => 'Редактиране на потребителÑките групи',
-'editinguser' => "ПромÑна на потребителÑките права на потребител '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "ПромÑна на потребителÑките права на потребител '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Редактиране на потребителÑките групи',
'saveusergroups' => 'СъхранÑване на потребителÑките групи',
'userrights-groupsmember' => 'Член на:',
@@ -1464,13 +1472,13 @@ $1",
'right-autopatrol' => 'автоматично отбелÑзване на редакции като проверени',
'right-patrolmarks' => 'Показване на отбелÑзаните като патрулирани поÑледни промени',
'right-unwatchedpages' => 'преглеждане на ÑпиÑъка Ñ Ð½ÐµÐ½Ð°Ð±Ð»ÑŽÐ´Ð°Ð²Ð°Ð½Ð¸Ñ‚Ðµ Ñтраници',
-'right-trackback' => 'изпращане на обратна Ñледа',
'right-mergehistory' => 'Ñливане на редакционни иÑтории на Ñтраници',
'right-userrights' => 'редактиране на потребителÑките права',
'right-userrights-interwiki' => 'редактиране на потребителÑки права на потребители в други уикита',
'right-siteadmin' => 'заключване и отключване на базата от данни',
'right-override-export-depth' => 'ИзнаÑÑне на Ñтраници, включително Ñвързаните Ñ Ñ‚ÑÑ… в дълбочина до пето ниво',
'right-sendemail' => 'Изпращане на е-пиÑма до другите потребители',
+'right-passwordreset' => 'Преглеждане на е-пиÑма за възÑтановÑване на парола',
# User rights log
'rightslog' => 'Дневник на потребителÑките права',
@@ -1508,11 +1516,11 @@ $1",
'action-patrol' => 'отбелÑзване на чуждите редакции като проверени',
'action-autopatrol' => 'отбелÑзване на ÑобÑтвените редакции като автоматично патрулирани',
'action-unwatchedpages' => 'преглеждане на ÑпиÑъка Ñ Ð½ÐµÐ½Ð°Ð±Ð»ÑŽÐ´Ð°Ð²Ð°Ð½Ð¸ Ñтраници',
-'action-trackback' => 'оÑтавÑне на обратна Ñледа',
'action-mergehistory' => 'Ñливане на иÑториÑта на тази Ñтраница',
'action-userrights' => 'редактиране на вÑички потребителÑки права',
'action-userrights-interwiki' => 'редактиране на потребителÑките права на потребители от други уикита',
'action-siteadmin' => 'заключване и отключване на базата от данни',
+'action-sendemail' => 'изпращане на е-пиÑма',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|промÑна|промени}}',
@@ -1602,6 +1610,7 @@ $1",
'ignorewarnings' => 'Пренебрегване на вÑÑкакви предупреждениÑ',
'minlength1' => 'Имената на файловете Ñ‚Ñ€Ñбва да Ñъдържат поне един знак.',
'illegalfilename' => 'Името на файла „$1“ Ñъдържа знаци, които не Ñа позволени в Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ñ Ð½Ð° Ñтраници. Преименувайте файла и Ñе опитайте да го качите отново.',
+'filename-toolong' => 'Имената на файлове не могат да Ñа по-големи от 240 байта.',
'badfilename' => 'Файлът беше преименуван на „$1“.',
'filetype-mime-mismatch' => 'Файловото разширение ".$1" не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° MIME типа на файла ($2).',
'filetype-badmime' => 'Ðе е разрешено качването на файлове Ñ MIME-тип „$1“.',
@@ -1686,6 +1695,18 @@ $1',
'upload-unknown-size' => 'ÐеизвеÑтен размер',
'upload-http-error' => 'Възникна HTTP грешка: $1',
+# File backend
+'backend-fail-notexists' => 'Файлът $1 не ÑъщеÑтвува.',
+'backend-fail-delete' => 'Файлът $1 не може да бъде изтрит.',
+'backend-fail-alreadyexists' => 'Файлът $1 вече ÑъщеÑтвува.',
+'backend-fail-copy' => 'Файлът „$1“ не можа да бъде копиран в „$2“.',
+'backend-fail-move' => 'Файлът „$1“ не можа да бъде премеÑтен в „$2“.',
+'backend-fail-opentemp' => 'ВременниÑÑ‚ файл не може да бъде отворен.',
+'backend-fail-writetemp' => 'Грешка при запиÑването във Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð».',
+'backend-fail-closetemp' => 'Ðе може да бъде затворен временниÑÑ‚ файл.',
+'backend-fail-read' => 'Файлът $1 не може да бъде прочетен.',
+'backend-fail-create' => 'Файлът $1 не може да бъде Ñъздаден.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Възникна грешка при отварÑне на файла за проверка на ZIP.',
'zip-wrong-format' => 'УказаниÑÑ‚ файл не е ZIP файл.',
@@ -1803,23 +1824,24 @@ $1',
'filerevert-badversion' => 'Ðе ÑъщеÑтвува предишна локална верÑÐ¸Ñ Ð½Ð° файла ÑÑŠÑ Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ²Ð¸ отпечатък.',
# File deletion
-'filedelete' => 'Изтриване на $1',
-'filedelete-legend' => 'Изтриване на файл',
-'filedelete-intro' => "Ðа път Ñте да изтриете '''[[Media:$1|$1]]''' заедно Ñ Ñ†Ñлата му редакционна иÑториÑ.",
-'filedelete-intro-old' => "Изтривате верÑиÑта на '''[[Media:$1|$1]]''' към [$4 $3, $2].",
-'filedelete-comment' => 'Причина:',
-'filedelete-submit' => 'Изтриване',
-'filedelete-success' => "Файлът '''$1''' беше изтрит.",
-'filedelete-success-old' => "ВерÑиÑта на '''[[Media:$1|$1]]''' към $3, $2 е била изтрита.",
-'filedelete-nofile' => "Файлът '''$1''' не ÑъщеÑтвува.",
-'filedelete-nofile-old' => "Ðе ÑъщеÑтвува архивна верÑÐ¸Ñ Ð½Ð° '''$1''' Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ‚Ðµ параметри.",
-'filedelete-otherreason' => 'Друга/допълнителна причина:',
-'filedelete-reason-otherlist' => 'Друга причина',
-'filedelete-reason-dropdown' => '*Общи причини за изтриване
+'filedelete' => 'Изтриване на $1',
+'filedelete-legend' => 'Изтриване на файл',
+'filedelete-intro' => "Ðа път Ñте да изтриете '''[[Media:$1|$1]]''' заедно Ñ Ñ†Ñлата му редакционна иÑториÑ.",
+'filedelete-intro-old' => "Изтривате верÑиÑта на '''[[Media:$1|$1]]''' към [$4 $3, $2].",
+'filedelete-comment' => 'Причина:',
+'filedelete-submit' => 'Изтриване',
+'filedelete-success' => "Файлът '''$1''' беше изтрит.",
+'filedelete-success-old' => "ВерÑиÑта на '''[[Media:$1|$1]]''' към $3, $2 е била изтрита.",
+'filedelete-nofile' => "Файлът '''$1''' не ÑъщеÑтвува.",
+'filedelete-nofile-old' => "Ðе ÑъщеÑтвува архивна верÑÐ¸Ñ Ð½Ð° '''$1''' Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ‚Ðµ параметри.",
+'filedelete-otherreason' => 'Друга/допълнителна причина:',
+'filedelete-reason-otherlist' => 'Друга причина',
+'filedelete-reason-dropdown' => '*Общи причини за изтриване
** Ðарушение на авторÑките права
** Файлът Ñе повтарÑ',
-'filedelete-edit-reasonlist' => 'Редактиране на причините за изтриване',
-'filedelete-maintenance' => 'Поради поддръжка на Ñайта, изтриването и възÑтановÑването на файлове е временно ограничено.',
+'filedelete-edit-reasonlist' => 'Редактиране на причините за изтриване',
+'filedelete-maintenance' => 'Поради поддръжка на Ñайта, изтриването и възÑтановÑването на файлове е временно ограничено.',
+'filedelete-maintenance-title' => 'Файлът не може да бъде изтрит',
# MIME search
'mimesearch' => 'MIME-Ñ‚ÑŠÑ€Ñене',
@@ -1922,6 +1944,7 @@ $1',
'mostimages' => 'Ðай-препращани картинки',
'mostrevisions' => 'Страници Ñ Ð½Ð°Ð¹-много верÑии',
'prefixindex' => 'Ð’Ñички Ñтраници Ñ Ð¿Ñ€ÐµÐ´Ñтавка',
+'prefixindex-namespace' => 'Ð’Ñички Ñтраници Ñ Ð¿Ñ€ÐµÐ´Ñтавка (именно проÑтранÑтво $1)',
'shortpages' => 'Кратки Ñтраници',
'longpages' => 'Дълги Ñтраници',
'deadendpages' => 'Задънени Ñтраници',
@@ -1938,7 +1961,7 @@ $1',
'listusers-editsonly' => 'Показване Ñамо на потребители Ñ Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ð¸',
'listusers-creationsort' => 'Сортиране по дата на Ñъздаване',
'usereditcount' => '$1 {{PLURAL:$1|редакциÑ|редакции}}',
-'usercreated' => 'Създаден на $1 в $2',
+'usercreated' => '{{GENDER:$3|Създаден}} на $1 в $2',
'newpages' => 'Ðови Ñтраници',
'newpages-username' => 'Потребител:',
'ancientpages' => 'Стари Ñтраници',
@@ -2029,12 +2052,8 @@ $1',
'activeusers-noresult' => 'ÐÑма намерени потребители.',
# Special:Log/newusers
-'newuserlogpage' => 'Дневник на региÑтрациите',
-'newuserlogpagetext' => 'Ð’ този дневник Ñе запиÑват региÑтрациите на потребители.',
-'newuserlog-byemail' => 'паролата е изпратена по е-поща',
-'newuserlog-create-entry' => 'Ðов потребител',
-'newuserlog-create2-entry' => 'Ñъздаде новата Ñметка $1',
-'newuserlog-autocreate-entry' => 'Ðвтоматично Ñъздадена Ñметка',
+'newuserlogpage' => 'Дневник на региÑтрациите',
+'newuserlogpagetext' => 'Ð’ този дневник Ñе запиÑват региÑтрациите на потребители.',
# Special:ListGroupRights
'listgrouprights' => 'Права по потребителÑки групи',
@@ -2062,7 +2081,7 @@ $1',
'emailpagetext' => 'Можете да използвате формулÑра по-долу, за да изпратите електронно пиÑмо на този потребител.
ÐдреÑÑŠÑ‚, който Ñе въвели в [[Special:Preferences|наÑтройките Ñи]], ще Ñе поÑви в полето „От“ на пиÑмото, така че получателÑÑ‚ ще е в ÑÑŠÑтоÑние да ви отговори.',
'usermailererror' => 'ПощенÑкиÑÑ‚ обект даде грешка:',
-'defemailsubject' => 'ПиÑмо от {{SITENAME}}',
+'defemailsubject' => 'ПиÑмо от потребител $1 в {{SITENAME}}',
'usermaildisabled' => 'ПотребителÑÑ‚ не е разрешил да получава електронна поща',
'usermaildisabledtext' => 'Ðе можете да изпращате електронна поща на други потребители от това уики',
'noemailtitle' => 'ÐÑма електронна поща',
@@ -2180,8 +2199,6 @@ $UNWATCHURL
'actioncomplete' => 'ДейÑтвието беше изпълнено',
'actionfailed' => 'ДейÑтвието не Ñполучи',
'deletedtext' => 'Страницата „$1“ беше изтрита. Вижте $2 за Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° поÑледните изтриваниÑ.',
-'deletedarticle' => 'изтри „[[$1]]“',
-'suppressedarticle' => 'премахна „[[$1]]“',
'dellogpage' => 'Дневник на изтриваниÑта',
'dellogpagetext' => 'СпиÑък на поÑледните изтриваниÑ.',
'deletionlog' => 'дневник на изтриваниÑта',
@@ -2224,7 +2241,10 @@ $UNWATCHURL
'unprotectedarticle' => 'Ñвали защитата на „[[$1]]“',
'movedarticleprotection' => 'премеÑтване на наÑтройките за защита от „[[$2]]“ на „[[$1]]“',
'protect-title' => 'СмÑна на нивото на защита на "$1"',
+'protect-title-notallowed' => 'Преглеждане нивото на защита за „$1“',
'prot_1movedto2' => '„[[$1]]“ премеÑтена като „[[$2]]“',
+'protect-badnamespace-title' => 'Ðезащитимо именно проÑтранÑтво',
+'protect-badnamespace-text' => 'Страниците в това именно проÑтранÑтво не могат да бъдат защитени.',
'protect-legend' => 'Потвърждение на защитата',
'protectcomment' => 'Причина:',
'protectexpiry' => 'Изтича на:',
@@ -2242,6 +2262,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Само за админиÑтратори',
'protect-summary-cascade' => 'каÑкадно',
'protect-expiring' => 'изтича на $1 (UTC)',
+'protect-expiring-local' => 'Ñрок на изтичане $1',
'protect-expiry-indefinite' => 'безÑрочно',
'protect-cascade' => 'КаÑкадна защита — защита на вÑички Ñтраници, включени в наÑтоÑщата Ñтраница.',
'protect-cantedit' => 'Ðе можете да промените нивото на защита на тази Ñтраницата, защото нÑмате права да Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ñ‚Ðµ.',
@@ -2297,7 +2318,6 @@ $UNWATCHURL
'undeletereset' => 'ИзчиÑтване',
'undeleteinvert' => 'Обръщане на избора',
'undeletecomment' => 'Причина:',
-'undeletedarticle' => 'възÑтанови „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|Една верÑÐ¸Ñ Ð±ÐµÑˆÐµ възÑтановена|$1 верÑии бÑха възÑтановени}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Една верÑиÑ|$1 верÑии}} и {{PLURAL:$1|един файл|$2 файла}} бÑха възÑтановени',
'undeletedfiles' => '{{PLURAL:$1|Един файл беше възÑтановен|$1 файла бÑха възÑтановени}}',
@@ -2306,6 +2326,7 @@ $UNWATCHURL
Можете да видите поÑледните изтрити и възÑтановени Ñтраници в [[Special:Log/delete|дневника на изтриваниÑта]].",
'undelete-header' => 'Прегледайте [[Special:Log/delete|дневника на изтриваниÑта]] за текущо изтритите Ñтраници.',
+'undelete-search-title' => 'ТърÑене на изтрити Ñтраници',
'undelete-search-box' => 'ТърÑене на изтрити Ñтраници',
'undelete-search-prefix' => 'Показване на Ñтраници, започващи ÑÑŠÑ:',
'undelete-search-submit' => 'ТърÑене',
@@ -2437,6 +2458,7 @@ $1',
'blocklist-userblocks' => 'Скриване на блокирани потребителÑки Ñметки',
'blocklist-tempblocks' => 'Скриване на Ñрочните блокираниÑ',
'blocklist-addressblocks' => 'Скриване на отделни блокирани IP адреÑи',
+'blocklist-rangeblocks' => 'Скриване на блокираниÑта по IP диапазон',
'blocklist-target' => 'Цел',
'blocklist-expiry' => 'Срок на изтичане:',
'blocklist-by' => 'Блокиращ админиÑтратор',
@@ -2576,9 +2598,6 @@ $1',
'movepage-page-moved' => 'Страницата $1 беше премеÑтена като $2.',
'movepage-page-unmoved' => 'Страницата $1 не може да бъде премеÑтена като $2.',
'movepage-max-pages' => 'ПремеÑтен беше макÑималниÑÑ‚ брой от $1 {{PLURAL:$1|Ñтраница|Ñтраници}} и повече Ñтраници нÑма да бъдат премеÑтвани автоматично.',
-'1movedto2' => 'премеÑти „[[$1]]“ като „[[$2]]“',
-'1movedto2_redir' => 'премеÑти „[[$1]]“ като „[[$2]]“ (върху пренаÑочване)',
-'move-redirect-suppressed' => 'прикрита пренаÑочваща Ñтраница',
'movelogpage' => 'Дневник на премеÑтваниÑта',
'movelogpagetext' => 'По-долу е показан ÑпиÑък на премеÑтваниÑта.',
'movesubpage' => '{{PLURAL:$1|ПодÑтраница|ПодÑтраници}}',
@@ -2591,7 +2610,7 @@ $1',
Целевата Ñтраница „[[:$1]]“ вече ÑъщеÑтвува. ИÑкате ли да Ñ Ð¸Ð·Ñ‚Ñ€Ð¸ÐµÑ‚Ðµ, за да оÑвободите мÑÑто за премеÑтването?',
'delete_and_move_confirm' => 'Да, иÑкам да Ð¸Ð·Ñ‚Ñ€Ð¸Ñ Ñ‚Ð°Ð·Ð¸ Ñтраница.',
-'delete_and_move_reason' => 'Изтрита, за да Ñе оÑвободи мÑÑто за премеÑтване',
+'delete_and_move_reason' => 'Изтрита, за да Ñе оÑвободи мÑÑто за премеÑтване от „[[$1]]“',
'selfmove' => 'Страницата не може да бъде премеÑтена, тъй като целевото име Ñъвпада Ñ Ð¿ÑŠÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¾Ñ‚Ð¾ й заглавие.',
'immobile-source-namespace' => 'Ðе могат да Ñе меÑÑ‚ÑÑ‚ Ñтраници в именно проÑтранÑтво „$1“',
'immobile-target-namespace' => 'Ðе е възможно премеÑтването на Ñтраници в именното проÑтранÑтво „$1“',
@@ -2620,6 +2639,7 @@ $1',
За да изнеÑете нÑколко Ñтраници, въвеждайте вÑÑко ново заглавие на '''нов ред'''. След това изберете дали иÑкате Ñамо текущата верÑÐ¸Ñ (заедно Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° поÑледната редакциÑ) или вÑички верÑии (заедно Ñ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ‚Ð°) на Ñтраницата.
Ðко желаете Ñамо текущата верÑиÑ, бихте могли да използвате препратка от вида [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за Ñтраницата [[{{MediaWiki:Mainpage}}]].",
+'exportall' => 'ИзнаÑÑне на вÑички Ñтраници',
'exportcuronly' => 'Включване Ñамо на текущата верÑиÑ, а не на цÑлата иÑториÑ',
'exportnohistory' => "----
'''Важно:''' ИзнаÑÑнето на пълната иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° Ñтраниците е забранено, защото много Ð·Ð°Ð±Ð°Ð²Ñ ÑƒÐ¸ÐºÐ¸Ñ‚Ð¾.",
@@ -2698,6 +2718,11 @@ $1',
'import-upload' => 'Качване на XML данни',
'import-token-mismatch' => 'Загубени Ñа данните за ÑеÑиÑта. Опитайте отново.',
'import-invalid-interwiki' => 'Ðе може да бъде извършено внаÑÑне от поÑоченото уики.',
+'import-error-edit' => 'Страницата „$1“ не беше внеÑена, тъй като нÑмате права да Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ñ‚Ðµ.',
+'import-error-create' => 'Страницата „$1“ не беше внеÑена, тъй като нÑмате права да Ñ Ñъздадете.',
+'import-error-interwiki' => 'Страницата „$1“ не беше внеÑена, тъй като името Ñ Ðµ запазено за външно Ñвързване (междууики).',
+'import-error-special' => 'Страницата „$1“ не беше внеÑена, тъй като принадлежи към Ñпециално именно проÑтранÑтво, което не позволÑва Ñтраници.',
+'import-error-invalid' => 'Страницата „$1“ не беше внеÑена, тъй като името Ñ Ðµ невалидно.',
# Import log
'importlogpage' => 'Дневник на внаÑÑниÑта',
@@ -2707,73 +2732,79 @@ $1',
'import-logentry-interwiki' => '$1 беше внеÑена от друго уики',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|една верÑиÑ|$1 верÑии}} на $2 бÑха внеÑени',
+# JavaScriptTest
+'javascripttest-disabled' => 'Тази Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ðµ изключена.',
+'javascripttest-pagetext-noframework' => 'Тази Ñтраница е запазена за изпълнение на ДжаваÑкрипт теÑтове.',
+'javascripttest-qunit-intro' => 'Вижте [$1 теÑтовата документациÑ] на mediawiki.org.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Вашата потребителÑка Ñтраница',
-'tooltip-pt-anonuserpage' => 'ПотребителÑката Ñтраница за адреÑа, от който редактирате',
-'tooltip-pt-mytalk' => 'Вашата диÑкуÑионна Ñтраница',
-'tooltip-pt-anontalk' => 'ДиÑкуÑÐ¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно редакциите от този адреÑ',
-'tooltip-pt-preferences' => 'Вашите наÑтройки',
-'tooltip-pt-watchlist' => 'СпиÑък на Ñтраници, чиито промени Ñте избрали да наблюдавате',
-'tooltip-pt-mycontris' => 'СпиÑък на вашите приноÑи',
-'tooltip-pt-login' => 'ÐаÑърчаваме ви да влезете, въпреки че не е задължително.',
-'tooltip-pt-anonlogin' => 'ÐаÑърчаваме ви да влезете, въпреки че не е задължително.',
-'tooltip-pt-logout' => 'Излизане от {{SITENAME}}',
-'tooltip-ca-talk' => 'БеÑеда отноÑно Ñтраницата',
-'tooltip-ca-edit' => 'Можете да редактирате Ñтраницата. Използвайте бутона за предварителен преглед преди да Ñъхраните.',
-'tooltip-ca-addsection' => 'Започване на нов раздел',
-'tooltip-ca-viewsource' => 'Страницата е защитена. Можете да разгледате Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ Ð¹ код.',
-'tooltip-ca-history' => 'Предишни верÑии на Ñтраницата',
-'tooltip-ca-protect' => 'Защитаване на Ñтраницата',
-'tooltip-ca-unprotect' => 'ПромÑна на защитата за тази Ñтраница',
-'tooltip-ca-delete' => 'Изтриване на Ñтраницата',
-'tooltip-ca-undelete' => 'ВъзÑтановÑване на изтрити редакции на Ñтраницата',
-'tooltip-ca-move' => 'ПремеÑтване на Ñтраницата',
-'tooltip-ca-watch' => 'ДобавÑне на Ñтраницата към ÑпиÑъка ви за наблюдение',
-'tooltip-ca-unwatch' => 'Премахване на Ñтраницата от ÑпиÑъка ви за наблюдение',
-'tooltip-search' => 'ПретърÑване на {{SITENAME}}',
-'tooltip-search-go' => 'Отиване на Ñтраницата, ако Ñ‚Ñ ÑъщеÑтвува Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ това име',
-'tooltip-search-fulltext' => 'ТърÑене в Ñтраниците за този текÑÑ‚',
-'tooltip-p-logo' => 'Ðачалната Ñтраница',
-'tooltip-n-mainpage' => 'Ðачалната Ñтраница',
-'tooltip-n-mainpage-description' => 'ПоÑещаване на началната Ñтраница',
-'tooltip-n-portal' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° проекта — какво, къде, как',
-'tooltip-n-currentevents' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° текущите ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¿Ð¾ Ñвета',
-'tooltip-n-recentchanges' => 'СпиÑък на поÑледните промени в {{SITENAME}}',
-'tooltip-n-randompage' => 'Зареждане на Ñлучайна Ñтраница',
-'tooltip-n-help' => 'Помощната Ñтраница',
-'tooltip-t-whatlinkshere' => 'СпиÑък на вÑички Ñтраници, Ñочещи наÑам',
-'tooltip-t-recentchangeslinked' => 'ПоÑледните промени на Ñтраници, Ñочени от тази Ñтраница',
-'tooltip-feed-rss' => 'RSS feed за Ñтраницата',
-'tooltip-feed-atom' => 'Atom feed за Ñтраницата',
-'tooltip-t-contributions' => 'Показване на приноÑите на потребителÑ',
-'tooltip-t-emailuser' => 'Изпращане на пиÑмо до потребителÑ',
-'tooltip-t-upload' => 'Качване на файлове',
-'tooltip-t-specialpages' => 'СпиÑък на вÑички Ñпециални Ñтраници',
-'tooltip-t-print' => 'ВерÑÐ¸Ñ Ð·Ð° печат на Ñтраницата',
-'tooltip-t-permalink' => 'ПоÑтоÑнна препратка към тази верÑÐ¸Ñ Ð½Ð° Ñтраницата',
-'tooltip-ca-nstab-main' => 'Преглед на оÑновната Ñтраница',
-'tooltip-ca-nstab-user' => 'Преглед на потребителÑката Ñтраница',
-'tooltip-ca-nstab-media' => 'Преглед на медийната Ñтраница',
-'tooltip-ca-nstab-special' => 'Това е Ñпециална Ñтраница, коÑто не може да бъде редактирана.',
-'tooltip-ca-nstab-project' => 'Преглед на проектната Ñтраница',
-'tooltip-ca-nstab-image' => 'Преглед на Ñтраницата на файла',
-'tooltip-ca-nstab-mediawiki' => 'Преглед на ÑиÑтемното Ñъобщение',
-'tooltip-ca-nstab-template' => 'Преглед на шаблона',
-'tooltip-ca-nstab-help' => 'Преглед на помощната Ñтраница',
-'tooltip-ca-nstab-category' => 'Преглед на категориÑта',
-'tooltip-minoredit' => 'ОтбелÑзване на промÑната като малка',
-'tooltip-save' => 'СъхранÑване на промените',
-'tooltip-preview' => 'Предварителен преглед, използвайте го преди да Ñъхраните!',
-'tooltip-diff' => 'Показване на направените от Ð²Ð°Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ по текÑта',
-'tooltip-compareselectedversions' => 'Показване на разликите между двете избрани верÑии на Ñтраницата',
-'tooltip-watch' => 'ДобавÑне на Ñтраницата към ÑпиÑъка ви за наблюдение',
-'tooltip-recreate' => 'ВъзÑтановÑване на Ñтраницата незавиÑимо, че е била изтрита',
-'tooltip-upload' => 'Започване на качването',
-'tooltip-rollback' => 'Чрез „отмÑна“ ще премахнете наведнъж вÑички промени, нанеÑени от поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€',
-'tooltip-undo' => 'Препратката „връщане“ премахва тази Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð¸ Ð¾Ñ‚Ð²Ð°Ñ€Ñ Ñтраницата за редактиране в режим на предварителен преглед.
+'tooltip-pt-userpage' => 'Вашата потребителÑка Ñтраница',
+'tooltip-pt-anonuserpage' => 'ПотребителÑката Ñтраница за адреÑа, от който редактирате',
+'tooltip-pt-mytalk' => 'Вашата диÑкуÑионна Ñтраница',
+'tooltip-pt-anontalk' => 'ДиÑкуÑÐ¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно редакциите от този адреÑ',
+'tooltip-pt-preferences' => 'Вашите наÑтройки',
+'tooltip-pt-watchlist' => 'СпиÑък на Ñтраници, чиито промени Ñте избрали да наблюдавате',
+'tooltip-pt-mycontris' => 'СпиÑък на вашите приноÑи',
+'tooltip-pt-login' => 'ÐаÑърчаваме ви да влезете, въпреки че не е задължително.',
+'tooltip-pt-anonlogin' => 'ÐаÑърчаваме ви да влезете, въпреки че не е задължително.',
+'tooltip-pt-logout' => 'Излизане от {{SITENAME}}',
+'tooltip-ca-talk' => 'БеÑеда отноÑно Ñтраницата',
+'tooltip-ca-edit' => 'Можете да редактирате Ñтраницата. Използвайте бутона за предварителен преглед преди да Ñъхраните.',
+'tooltip-ca-addsection' => 'Започване на нов раздел',
+'tooltip-ca-viewsource' => 'Страницата е защитена. Можете да разгледате Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ Ð¹ код.',
+'tooltip-ca-history' => 'Предишни верÑии на Ñтраницата',
+'tooltip-ca-protect' => 'Защитаване на Ñтраницата',
+'tooltip-ca-unprotect' => 'ПромÑна на защитата за тази Ñтраница',
+'tooltip-ca-delete' => 'Изтриване на Ñтраницата',
+'tooltip-ca-undelete' => 'ВъзÑтановÑване на изтрити редакции на Ñтраницата',
+'tooltip-ca-move' => 'ПремеÑтване на Ñтраницата',
+'tooltip-ca-watch' => 'ДобавÑне на Ñтраницата към ÑпиÑъка ви за наблюдение',
+'tooltip-ca-unwatch' => 'Премахване на Ñтраницата от ÑпиÑъка ви за наблюдение',
+'tooltip-search' => 'ПретърÑване на {{SITENAME}}',
+'tooltip-search-go' => 'Отиване на Ñтраницата, ако Ñ‚Ñ ÑъщеÑтвува Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ това име',
+'tooltip-search-fulltext' => 'ТърÑене в Ñтраниците за този текÑÑ‚',
+'tooltip-p-logo' => 'Ðачалната Ñтраница',
+'tooltip-n-mainpage' => 'Ðачалната Ñтраница',
+'tooltip-n-mainpage-description' => 'ПоÑещаване на началната Ñтраница',
+'tooltip-n-portal' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° проекта — какво, къде, как',
+'tooltip-n-currentevents' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° текущите ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð¿Ð¾ Ñвета',
+'tooltip-n-recentchanges' => 'СпиÑък на поÑледните промени в {{SITENAME}}',
+'tooltip-n-randompage' => 'Зареждане на Ñлучайна Ñтраница',
+'tooltip-n-help' => 'Помощната Ñтраница',
+'tooltip-t-whatlinkshere' => 'СпиÑък на вÑички Ñтраници, Ñочещи наÑам',
+'tooltip-t-recentchangeslinked' => 'ПоÑледните промени на Ñтраници, Ñочени от тази Ñтраница',
+'tooltip-feed-rss' => 'RSS feed за Ñтраницата',
+'tooltip-feed-atom' => 'Atom feed за Ñтраницата',
+'tooltip-t-contributions' => 'Показване на приноÑите на потребителÑ',
+'tooltip-t-emailuser' => 'Изпращане на пиÑмо до потребителÑ',
+'tooltip-t-upload' => 'Качване на файлове',
+'tooltip-t-specialpages' => 'СпиÑък на вÑички Ñпециални Ñтраници',
+'tooltip-t-print' => 'ВерÑÐ¸Ñ Ð·Ð° печат на Ñтраницата',
+'tooltip-t-permalink' => 'ПоÑтоÑнна препратка към тази верÑÐ¸Ñ Ð½Ð° Ñтраницата',
+'tooltip-ca-nstab-main' => 'Преглед на оÑновната Ñтраница',
+'tooltip-ca-nstab-user' => 'Преглед на потребителÑката Ñтраница',
+'tooltip-ca-nstab-media' => 'Преглед на медийната Ñтраница',
+'tooltip-ca-nstab-special' => 'Това е Ñпециална Ñтраница, коÑто не може да бъде редактирана.',
+'tooltip-ca-nstab-project' => 'Преглед на проектната Ñтраница',
+'tooltip-ca-nstab-image' => 'Преглед на Ñтраницата на файла',
+'tooltip-ca-nstab-mediawiki' => 'Преглед на ÑиÑтемното Ñъобщение',
+'tooltip-ca-nstab-template' => 'Преглед на шаблона',
+'tooltip-ca-nstab-help' => 'Преглед на помощната Ñтраница',
+'tooltip-ca-nstab-category' => 'Преглед на категориÑта',
+'tooltip-minoredit' => 'ОтбелÑзване на промÑната като малка',
+'tooltip-save' => 'СъхранÑване на промените',
+'tooltip-preview' => 'Предварителен преглед, използвайте го преди да Ñъхраните!',
+'tooltip-diff' => 'Показване на направените от Ð²Ð°Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ по текÑта',
+'tooltip-compareselectedversions' => 'Показване на разликите между двете избрани верÑии на Ñтраницата',
+'tooltip-watch' => 'ДобавÑне на Ñтраницата към ÑпиÑъка ви за наблюдение',
+'tooltip-watchlistedit-raw-submit' => 'ОбновÑване на ÑпиÑъка за наблюдение',
+'tooltip-recreate' => 'ВъзÑтановÑване на Ñтраницата незавиÑимо, че е била изтрита',
+'tooltip-upload' => 'Започване на качването',
+'tooltip-rollback' => 'Чрез „отмÑна“ ще премахнете наведнъж вÑички промени, нанеÑени от поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€',
+'tooltip-undo' => 'Препратката „връщане“ премахва тази Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð¸ Ð¾Ñ‚Ð²Ð°Ñ€Ñ Ñтраницата за редактиране в режим на предварителен преглед.
Ð’ полето за резюме може да Ñе впише причина за връщането.',
-'tooltip-preferences-save' => 'СъхранÑване на предпочитаниÑта',
-'tooltip-summary' => 'Въведете кратко резюме',
+'tooltip-preferences-save' => 'СъхранÑване на предпочитаниÑта',
+'tooltip-summary' => 'Въведете кратко резюме',
# Stylesheets
'common.css' => '/* Чрез редактиране на този файл ще промените вÑички облици */',
@@ -2843,9 +2874,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Дневник на патрула',
'patrol-log-header' => 'Тази Ñтраница Ñъдържа дневник на проверените верÑии.',
-'patrol-log-line' => 'отбелÑза $1 от $2 като проверена $3',
-'patrol-log-auto' => '(автоматично)',
-'patrol-log-diff' => 'верÑÐ¸Ñ $1',
'log-show-hide-patrol' => '$1 на Дневника на патрула',
# Image deletion
@@ -2871,11 +2899,11 @@ $1',
'file-info' => 'големина на файла: $1, MIME-тип: $2',
'file-info-size' => '$1 × $2 пикÑела, големина на файла: $3, MIME-тип: $4',
'file-info-size-pages' => '$1 × $2 пикÑела, размер на файла: $3, MIME тип: $4, $5 {{PLURAL:$5|Ñтраница|Ñтраници}}',
-'file-nohires' => '<small>Ðе е налична верÑÐ¸Ñ Ñ Ð¿Ð¾-виÑока разделителна ÑпоÑобноÑÑ‚.</small>',
+'file-nohires' => 'Ðе е налична верÑÐ¸Ñ Ñ Ð¿Ð¾-виÑока разделителна ÑпоÑобноÑÑ‚.',
'svg-long-desc' => 'Файл във формат SVG, оÑновен размер: $1 × $2 пикÑела, големина на файла: $3',
'show-big-image' => 'Пълна разделителна ÑпоÑобноÑÑ‚',
-'show-big-image-preview' => '<small>Размер на този преглед: $1.</small>',
-'show-big-image-other' => '<small>Други разделителни ÑпоÑобноÑти: $1.</small>',
+'show-big-image-preview' => 'Размер на този преглед: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Друга разделителна ÑпоÑобноÑÑ‚|Други разделителни ÑпоÑобноÑти}}: $1.',
'show-big-image-size' => '$1 × $2 пикÑела',
'file-info-gif-looped' => 'непрекъÑнато повтарÑне',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадър|кадъра}}',
@@ -2895,6 +2923,13 @@ $1',
'bydate' => 'по дата',
'sp-newimages-showfrom' => 'Показване на новите файлове, като Ñе започва от $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунди}}',
+'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
+'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа}}',
+'days' => '{{PLURAL:$1|$1 ден|$1 дни}}',
+'ago' => 'преди $1',
+
# Bad image list
'bad_image_list' => 'Спазва Ñе ÑледниÑÑ‚ формат:
@@ -3334,13 +3369,6 @@ $5
'scarytranscludefailed' => '[Зареждането на шаблона за $1 не Ñполучи]',
'scarytranscludetoolong' => '[ÐдреÑÑŠÑ‚ е твърде дълъг]',
-# Trackbacks
-'trackbackbox' => 'Обратни Ñледи за ÑтатиÑта:<br />
-$1',
-'trackbackremove' => '([$1 Изтриване])',
-'trackbacklink' => 'Обратна Ñледа',
-'trackbackdeleteok' => 'Обратната Ñледа беше изтрита.',
-
# Delete conflict
'deletedwhileediting' => "'''Внимание''': Страницата е била изтрита, Ñлед като Ñте започнали да Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ñ‚Ðµ!",
'confirmrecreate' => "ПотребителÑÑ‚ [[User:$1|$1]] ([[User talk:$1|беÑеда]]) е изтрил Ñтраницата, откакто Ñте започнали да Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ñ‚Ðµ, като е поÑочил Ñледното обÑÑнение:
@@ -3419,6 +3447,9 @@ $1',
'watchlisttools-edit' => 'Преглед и редактиране на ÑпиÑъка за наблюдение',
'watchlisttools-raw' => 'Редактиране на Ð½ÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐµÐ½Ð¸Ñ ÑпиÑък за наблюдение',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|беÑеда]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ðепознат етикет на разширение „$1“',
'duplicate-defaultsort' => 'Внимание: Ключът за Ñортиране по подразбиране „$2“ Ð¾Ñ‚Ð¼ÐµÐ½Ñ Ð¿Ð¾-Ñ€Ð°Ð½Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ „$1“.',
@@ -3517,13 +3548,16 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'tags-hitcount' => '$1 {{PLURAL:$1|промÑна|промени}}',
# Special:ComparePages
-'comparepages' => 'СравнÑване на Ñтраници',
-'compare-selector' => 'СравнÑване верÑиите на Ñтраници',
-'compare-page1' => 'Страница 1',
-'compare-page2' => 'Страница 2',
-'compare-rev1' => 'ВерÑÐ¸Ñ 1',
-'compare-rev2' => 'ВерÑÐ¸Ñ 2',
-'compare-submit' => 'СравнÑване',
+'comparepages' => 'СравнÑване на Ñтраници',
+'compare-selector' => 'СравнÑване верÑиите на Ñтраници',
+'compare-page1' => 'Страница 1',
+'compare-page2' => 'Страница 2',
+'compare-rev1' => 'ВерÑÐ¸Ñ 1',
+'compare-rev2' => 'ВерÑÐ¸Ñ 2',
+'compare-submit' => 'СравнÑване',
+'compare-invalid-title' => 'ПоÑоченото заглавие е невалидно',
+'compare-title-not-exists' => 'ПоÑоченото заглавие не ÑъщеÑтвува.',
+'compare-revision-not-exists' => 'ПоÑочената верÑÐ¸Ñ Ð½Ðµ ÑъщеÑтвува.',
# Database error messages
'dberr-header' => 'Това уики има проблем',
@@ -3550,4 +3584,69 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на пълнотекÑтово Ñ‚ÑŠÑ€Ñене',
'sqlite-no-fts' => '$1 без поддръжка на пълнотекÑтово Ñ‚ÑŠÑ€Ñене',
+# New logging system
+'logentry-delete-delete' => '$1 изтри Ñтраницата $3',
+'logentry-delete-restore' => '$1 възÑтанови Ñтраницата $3',
+'logentry-suppress-revision' => '$1 тайно промени видимоÑтта на {{PLURAL:$5|една верÑиÑ|$5 верÑии}} на Ñтраницата $3: $4',
+'logentry-suppress-revision-legacy' => '$1 тайно промени видимоÑтта на верÑиите на Ñтраница $3',
+'revdelete-restricted' => 'добавени Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð° админиÑтраторите',
+'revdelete-unrestricted' => 'премахнати Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð° админиÑтраторите',
+'logentry-patrol-patrol' => '$1 отбелÑза като патрулирана верÑÐ¸Ñ $4 на Ñтраницата „$3“',
+'logentry-patrol-patrol-auto' => '$1 автоматично отбелÑза като патрулирана верÑÐ¸Ñ $4 на Ñтраницата $3',
+'logentry-newusers-newusers' => '$1 Ñъздаде потребителÑка Ñметка',
+'logentry-newusers-create' => '$1 Ñъздаде потребителÑка Ñметка',
+'logentry-newusers-create2' => '$1 Ñъздаде потребителÑка Ñметка $3',
+'logentry-newusers-autocreate' => 'Сметката $1 беше Ñъздадена автоматично',
+'newuserlog-byemail' => 'паролата е изпратена по е-поща',
+
+# Feedback
+'feedback-subject' => 'Тема:',
+'feedback-message' => 'Съобщение:',
+'feedback-cancel' => 'Отказване',
+'feedback-submit' => 'ОÑтавÑне на коментар',
+'feedback-adding' => 'ДобавÑне на коментар към Ñтраницата...',
+'feedback-error1' => 'Грешка: Ðеразпознат резултат от API',
+'feedback-error2' => 'Грешка: ÐеуÑпешна редакциÑ',
+'feedback-error3' => 'Грешка: ÐÑма отговор от API',
+'feedback-thanks' => 'БлагодарноÑти! Вашата обратна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ðµ публикувана на Ñтраницата „[$2 $1]“.',
+'feedback-close' => 'Готово',
+
+# API errors
+'api-error-badaccess-groups' => 'ÐÑмате необходимите права, за да качвате файлове в това уики.',
+'api-error-badtoken' => 'Вътрешна грешка: неправилен маркер.',
+'api-error-copyuploaddisabled' => 'Качването през URL е забранено на този Ñървър.',
+'api-error-duplicate' => 'Ðа Ñайта вече има качени {{PLURAL:$1|[$2 друг файл]|[$2 други файла]}} Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ‡Ð½Ð¾ Ñъдържание.',
+'api-error-duplicate-archive' => 'Ðа Ñайта вече е имало {{PLURAL:$1|качен [$2 друг файл]|качени [$2 други файла]}} Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ‡Ð½Ð¾ Ñъдържание, {{PLURAL:$1|който е бил изтрит|които Ñа били изтрити}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Дублиращ Ñе файл, който вече е бил изтрит|Дублиращи Ñе файлове, които вече Ñа били изтрити}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|ПовтарÑщ Ñе файл|ПовтарÑщи Ñе файлове}}',
+'api-error-empty-file' => 'ЗаÑвениÑÑ‚ за качване файл беше празен.',
+'api-error-emptypage' => 'Създаването на нови, празени Ñтраници, не е разрешено.',
+'api-error-fetchfileerror' => 'Вътрешна грешка: Ðещо Ñе обърка при извличане на файла.',
+'api-error-file-too-large' => 'ЗаÑвениÑÑ‚ за качване файл беше твърде голÑм.',
+'api-error-filename-tooshort' => 'Името на файла е твърде кратко.',
+'api-error-filetype-banned' => 'Този файлов тип не е позволен за качване.',
+'api-error-filetype-missing' => 'ЛипÑва разширение на файла.',
+'api-error-hookaborted' => 'Промените, които опитахте да направите, бÑха отменени от нÑкое разширение.',
+'api-error-http' => 'Вътрешна грешка: Грешка при Ñвързането ÑÑŠÑ Ñървъра.',
+'api-error-illegal-filename' => 'Ðепозволено име на файл.',
+'api-error-internal-error' => 'Вътрешна грешка: Ðещо Ñе обърка при обработката на качването в уикито.',
+'api-error-invalid-file-key' => 'Вътрешна грешка: Файлът не беше открит във временното хранилище.',
+'api-error-missingparam' => 'Вътрешна грешка: ЛипÑващи параметри на заÑвката.',
+'api-error-missingresult' => 'Вътрешна грешка: Ðе може да Ñе определи дали копирането е уÑпешно.',
+'api-error-mustbeloggedin' => 'ТрÑбва да Ñте влезли в ÑиÑтемата, за да можете да качвате файлове.',
+'api-error-mustbeposted' => 'Вътрешна грешка: ЗаÑвката изиÑква HTTP POST.',
+'api-error-noimageinfo' => 'Качването беше уÑпешно, но Ñървърът не подаде никаква Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° файла.',
+'api-error-nomodule' => 'Вътрешна грешка: ЛипÑва наÑтроен модул за качваниÑ.',
+'api-error-ok-but-empty' => 'Вътрешна грешка: ÐÑма отговор от Ñървъра.',
+'api-error-overwrite' => 'Ðе е позволено презапиÑването върху ÑъщеÑтвуващ файл.',
+'api-error-stashfailed' => 'Вътрешна грешка: Сървърът не уÑÐ¿Ñ Ð´Ð° Ñъхрани Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð».',
+'api-error-timeout' => 'Сървърът не отговори в рамките на предвиденото време.',
+'api-error-unclassified' => 'Възникна непозната грешка.',
+'api-error-unknown-code' => 'Ðепозната грешка: "$1"',
+'api-error-unknown-error' => 'Вътрешна грешка: Ðещо Ñе обърка по време на качването на файла ви.',
+'api-error-unknown-warning' => 'Ðепознато предупреждение: $1',
+'api-error-unknownerror' => 'ÐеизвеÑтна грешка: „$1“.',
+'api-error-uploaddisabled' => 'ДоÑтъпът за качване на файлове в това уики е прекратен.',
+'api-error-verification-error' => 'Файлът може би е повреден или има грешно разширение.',
+
);
diff --git a/languages/messages/MessagesBh.php b/languages/messages/MessagesBh.php
index 95ecd8da..f3d7ba06 100644
--- a/languages/messages/MessagesBh.php
+++ b/languages/messages/MessagesBh.php
@@ -1,5 +1,5 @@
<?php
-/** Bihari (macro language)
+/** Bihari (language group)
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
diff --git a/languages/messages/MessagesBho.php b/languages/messages/MessagesBho.php
index 97b4957d..b73b2a48 100644
--- a/languages/messages/MessagesBho.php
+++ b/languages/messages/MessagesBho.php
@@ -358,7 +358,6 @@ $1',
'subject-preview' => 'विषय/शिरà¥à¤·à¤• पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨:',
'blockedtitle' => 'निषà¥à¤•à¥à¤°à¤¿à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
'blockednoreason' => 'कउनो कारण उलà¥à¤²à¥‡à¤–ित नईखे',
-'whitelistedittitle' => 'समà¥à¤ªà¤¾à¤¦à¤¨ खातिर खाता में पà¥à¤°à¤µà¥‡à¤¶ जरà¥à¤°à¥€ बा',
'nosuchsectiontitle' => 'खणà¥à¤¡ ना मिल सकल।',
'loginreqtitle' => 'खाता में पà¥à¤°à¤µà¥‡à¤¶ जरà¥à¤°à¥€ बा',
'loginreqlink' => 'खाता में पà¥à¤°à¤µà¥‡à¤¶',
@@ -410,13 +409,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'revdel-restore-visible' => 'दृशà¥à¤¯à¤®à¤¾à¤¨ संसोधन',
'pagehist' => 'पनà¥à¤¨à¤¾ के इतिहास',
'deletedhist' => 'मिटावल इतिहास',
-'revdelete-content' => 'सामगà¥à¤°à¥€',
-'revdelete-summary' => 'सारांश संपादन',
-'revdelete-uname' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम',
-'revdelete-restricted' => 'पà¥à¤°à¤¬à¤‚धक पर पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध लागू',
-'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धक पर से पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध समापà¥à¤¤',
-'revdelete-hid' => 'छà¥à¤ª $1',
-'revdelete-unhid' => 'ना छà¥à¤ª $1',
# Merge log
'revertmerge' => 'अलग करीं',
@@ -590,9 +582,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'enotif_newpagetext' => 'इ à¤à¤—ो नया पनà¥à¤¨à¤¾ ह',
'created' => 'बनावल गईल',
-# Delete
-'deletedarticle' => "मिटावल ''[[$1]]''",
-
# Undelete
'undeletelink' => 'देखीं/बहाल करीं',
@@ -694,7 +683,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'tooltip-save' => 'आपन बदलाव के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करीं',
# Media information
-'file-nohires' => '<small> उचà¥à¤š गà¥à¤£à¤µà¤¤à¥à¤¤à¤¾ उपलबà¥à¤§ नईखे। </small>',
+'file-nohires' => ' उचà¥à¤š गà¥à¤£à¤µà¤¤à¥à¤¤à¤¾ उपलबà¥à¤§ नईखे।',
'svg-long-desc' => 'à¤à¤¸ वी जी फाईल, नॉमिनलà¥à¤²à¥€ $1 x $2 पिकà¥à¤¸à¤²à¥à¤¸, फाईल के आकार $3',
'show-big-image' => 'पà¥à¤°à¤¾ गà¥à¤£à¤µà¤¤à¥à¤¤à¤¾',
'file-info-gif-looped' => 'लूपà¥à¤¡',
@@ -738,4 +727,8 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
# Special:SpecialPages
'specialpages' => 'ख़ाश पनà¥à¤¨à¤¾',
+# New logging system
+'revdelete-restricted' => 'पà¥à¤°à¤¬à¤‚धक पर पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध लागू',
+'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धक पर से पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध समापà¥à¤¤',
+
);
diff --git a/languages/messages/MessagesBjn.php b/languages/messages/MessagesBjn.php
index b7237eb9..fd34afe5 100644
--- a/languages/messages/MessagesBjn.php
+++ b/languages/messages/MessagesBjn.php
@@ -408,22 +408,24 @@ Silakan lapurakan ini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah cata
'formerror' => 'Kasalahan: kada kawa mangirim purmulir',
'badarticleerror' => 'Palakuan ini kada kawa dicungulakan pada tungkaran ini.',
'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
+'cannotdelete-title' => 'Kada kawa mahapus tungkaran "$1"',
'badtitle' => 'Judul buruk',
'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-bahasa atawa antar-wiki.
Nangini bisa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
-'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir.',
-'perfcachedts' => 'Data nang dudi ini adalah timbuluk, wan tauncit dihahanyari pada $1.',
+'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Data nang dudi ini adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pamugaan matan tungkaran ini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
'wrong_wfQuery_params' => 'Kada bujur ukuran ka wfQuery ()<br />
Pungsi: $1<br />
Parmintaan: $2',
'viewsource' => 'Tiringi asal mulanya',
-'viewsourcefor' => 'gasan $1',
+'viewsource-title' => 'Tiringi asalmula matan $1',
'actionthrottled' => 'Kalakuan dikiripi',
'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ini.
Muhun cubai pulang dalam babarapa minit.',
'protectedpagetext' => 'Tungkaran ini sudah dilindungi hagan mancagah babakan.',
'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ini:',
+'viewyourtext' => "Pian kawa maniringi wan salain asalmula matan '''babakan pian''' ka tungkaran ngini:",
'protectedinterface' => 'Tungkaran ini manyadiakan naskah antarmuha gasan parangkat lunak, wan dilindungi hagan mancagah tasalah puruk.',
'editinginterface' => "'''Paringatan:''' Pian mambabak sabuah tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
Parubahan ka tungkaran ini akan bapangaruh matan tampaian antarmuha gasan pamuruk lain.
@@ -526,6 +528,7 @@ Kadada suril nang akan dikirim maumpati pitur.',
'emailconfirmlink' => 'Yakinakan alamat suril Pian',
'invalidemailaddress' => 'Alamat suril ini kada kawa ditarima karana pormat kada sah.
Muhun buati sabuah alamat suril nang bujur pormatnya atawa kusungakan haja isian itu.',
+'cannotchangeemail' => 'Akun alamat suril kada kawa diganti pada wiki ngini.',
'accountcreated' => 'Akun diulah',
'accountcreatedtext' => 'Akun pamuruk gasan $1 sudah diulah.',
'createaccount-title' => 'Paulahan akun gasan {{SITENAME}}',
@@ -542,6 +545,7 @@ Muhun hadangi dahulu sapandang hanyar cubai pulang.',
# E-mail sending
'php-mail-error-unknown' => 'Kasalahan kada dipinandui dalam pungsi surat () PHP',
+'user-mail-no-addy' => 'Mancuba mangirim suril kada baalamat suril.',
# Change password dialog
'resetpass' => 'Ubah katasunduk',
@@ -563,32 +567,47 @@ Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasundu
'resetpass-temp-password' => 'Katasunduk samantara:',
# Special:PasswordReset
-'passwordreset' => 'Bulikakan setelan katasunduk',
-'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
-'passwordreset-legend' => 'Bulikakan setelan katasunduk',
-'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
-'passwordreset-username' => 'Ngaran pamuruk:',
-'passwordreset-domain' => 'Dumain:',
-'passwordreset-email' => 'Alamat suril:',
-'passwordreset-emailtitle' => 'Rarincian akun pada {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamuruk barikut {{PLURAL:$3|akun|aakun}}
+'passwordreset' => 'Bulikakan setelan katasunduk',
+'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
+'passwordreset-legend' => 'Bulikakan setelan katasunduk',
+'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ini.',
+'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
+'passwordreset-username' => 'Ngaran pamuruk:',
+'passwordreset-domain' => 'Dumain:',
+'passwordreset-capture' => 'Tiringikah kulihan suril?',
+'passwordreset-capture-help' => 'Amun Pian cintang kutak ngini, suril (awan katasunduk samantara) akan ditampaiakan ka Pian bahwasa lagi dikirim ka pamuruk.',
+'passwordreset-email' => 'Alamat suril:',
+'passwordreset-emailtitle' => 'Rarincian akun pada {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamuruk barikut {{PLURAL:$3|akun|aakun}}
tarait awan suril:
$2
{{PLURAL:$3|katasunduk samantara ngini|kakatasunduk samantara ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hahari}}.
Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
-'passwordreset-emailtext-user' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamuruk barikut {{PLURAL:$3|akun|aakun}}
+'passwordreset-emailtext-user' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamuruk barikut {{PLURAL:$3|akun|aakun}}
tarait awan suril:
$2
{{PLURAL:$3|katasunduk samantara ngini|kakatasunduk samantara ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hahari}}.
Pian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ini wan manyambung mamuruk katasunduk lawas Pian.',
-'passwordreset-emailelement' => 'Ngaran pamuruk: $1
+'passwordreset-emailelement' => 'Ngaran pamuruk: $1
Katasunduk samantara: $2',
-'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
+'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
+'passwordreset-emailsent-capture' => 'Sabuah suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.',
+'passwordreset-emailerror-capture' => 'Sabuah sril pangingat digenerasiakan, nangkaya ditampaiakan di bawah, tagal pangiriman ngini ka pamuruk gagal: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ganti alamat suril',
+'changeemail-header' => 'Ganti akun alamat suril',
+'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan parubahan ngini.',
+'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
+'changeemail-oldemail' => 'Alamat suril wayah ini:',
+'changeemail-newemail' => 'Alamat suril puga:',
+'changeemail-none' => '(kadada)',
+'changeemail-submit' => 'Ganti suril',
+'changeemail-cancel' => 'Walangi',
# Edit page toolbar
'bold_sample' => 'Naskah kandal',
@@ -656,9 +675,6 @@ Catatan Pian kada kawa mamuruk pitur 'surili pamuruk ini' amun kadada sabuah ala
Alamat IP Pian parhatan ini $3, wan ID nang diblukir adalah $5.
Muhun sampaiakan samunyaan rarinci di atas dalam parmintaan nag Pian ulah.",
'blockednoreason' => 'kadada alasan nang diunjukakan',
-'blockedoriginalsource' => "Asal mula matan '''$1''' ditampaiakan di bawah:",
-'blockededitsource' => "Naskah nang '''babakan Pian''' awan '''$1''' ditampaiakan di bawah:",
-'whitelistedittitle' => 'Parlu babuat log hagan mambabak',
'whitelistedittext' => 'Pian harus $1 hagan mambabak tungkaran.',
'confirmedittext' => 'Pian musti mayakinakan alamat suril Pian sabalum mambabak tungkaran-tungkaran. Muhun disetel wan disakakan alamat suril Pian tumatan [[Special:Preferences|kakatujuan pamuruk]] Pian.',
'nosuchsectiontitle' => 'Hagian kada tadapat',
@@ -913,8 +929,6 @@ Pambakal lain pada {{SITENAME}} akan magun kawa maungkai isi tasungkup wan kawa
'revdelete-unsuppress' => 'Buang pambatasan pada ralatan-ralatan nang dibulikakan',
'revdelete-log' => 'Alasan:',
'revdelete-submit' => 'Lamar hagan mamilih {{PLURAL:$1|ralatan|ralatan-ralatan}}',
-'revdelete-logentry' => 'Ubah panampaian ralatan matan "[[$1]]"',
-'logdelete-logentry' => 'Ubah panampaian kajadian matan "[[$1]]"',
'revdelete-success' => "'''Panampaian ralatan bakulihan dimutakhirakan.'''",
'revdelete-failure' => "'''Panampaian ralatan kada kawa dimutakhirakan:'''
$1",
@@ -926,15 +940,6 @@ $1",
'revdel-restore-visible' => 'Ralatan-ralatan kalihatan',
'pagehist' => 'Sajarah tungkaran',
'deletedhist' => 'Halam tahapus',
-'revdelete-content' => 'Isi',
-'revdelete-summary' => 'Kasimpulan babakan',
-'revdelete-uname' => 'ngaran pamuruk',
-'revdelete-restricted' => 'Talamar pambatasan hagan pambakal-pambakal',
-'revdelete-unrestricted' => 'Buang pambatasan gasan pambakal-pambakal',
-'revdelete-hid' => 'Sung $1',
-'revdelete-unhid' => 'Singkai $1',
-'revdelete-log-message' => '$1 gasan $2 {{PLURAL:$2|ralatan|ralatan-ralatan}}',
-'logdelete-log-message' => '$1 gasan $2 {{PLURAL:$2|kajadian|kajadian-kajadian}}',
'revdelete-hide-current' => 'Tasalah manyungkupakan nang batanggal $1, $2: ini adalah ralatan tahanyar.
Ini kada kawa disungkupakan.',
'revdelete-show-no-access' => 'Tasalah manampaiakan nang batanggal $1, $2: nangini sudah ditandai "tabatas".
@@ -1094,12 +1099,14 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
'prefs-rc' => 'Parubahan tahanyar',
'prefs-watchlist' => 'Paitihan',
'prefs-watchlist-days' => 'Rikinan hari-hari ditampaiakan di daptar itihan:',
-'prefs-watchlist-days-max' => 'Paling lawas 7 hari-hari',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Rikinan paningginya matan parubahan hagan ditampaiakan pada singkaian daptar itihan:',
'prefs-watchlist-edits-max' => 'Rikinan paningginya:1000',
'prefs-watchlist-token' => 'Token itihan:',
'prefs-misc' => 'Balalain',
'prefs-resetpass' => 'Ubah katasunduk',
+'prefs-changeemail' => 'Ganti suril',
+'prefs-setemail' => 'Setel sabuah alamat suril',
'prefs-email' => 'Pipilihan suril',
'prefs-rendering' => 'Pancungulan',
'saveprefs' => 'Simpan',
@@ -1158,6 +1165,7 @@ Ini kada kawa diwalangi.',
'yourrealname' => 'Ngaran asli:',
'yourlanguage' => 'Bahasa:',
'yourvariant' => 'Variasi bahasa isi:',
+'prefs-help-variant' => 'Variasi kakatujuan Pian atawa ortugrafi panampaian isi tutungkaran matan wiki ngini dalam.',
'yournick' => 'Tandatangan:',
'prefs-help-signature' => 'Kumintar pada tungkaran pamandiran parlu ditandatangani awan "<nowiki>~~~~</nowiki>" nangapa akan taubah jadi tandatangan Pian wan waktu wayahini.',
'badsig' => 'Tandatangan mantah kada sah.
@@ -1198,7 +1206,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
'userrights-lookup-user' => 'Mangalula gagalambang pamuruk',
'userrights-user-editname' => 'Buati sabuah ngaran pamuruk:',
'editusergroup' => 'Babak galambang pamuruk',
-'editinguser' => "Mangganti hak akses pamuruk '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ma-ubah hak ungkai pamuruk '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Babak galambang pamuruk',
'saveusergroups' => 'Simpan galambang pamuruk',
'userrights-groupsmember' => 'Angguta matan:',
@@ -1292,13 +1300,13 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
'right-autopatrol' => "Babakan ampun surang utumatis ditandai sawagai ta'awasi",
'right-patrolmarks' => 'Tiringi tanda parubahan tahanyar',
'right-unwatchedpages' => 'Tiringi sabuah daptar tutungkaran nang kada diitihi',
-'right-trackback' => 'Mangirimakan sabuah panjajakan balik',
'right-mergehistory' => 'Gabungakan halam matan tutungkaran',
'right-userrights' => 'Babak sabarataan hak pamuruk',
'right-userrights-interwiki' => 'Babak hahak pamuruk matan papamuruk wiwiki balain',
'right-siteadmin' => 'Sunduk wan buka sunduk basis data',
'right-override-export-depth' => 'Ekspur tutungkaran tamasuk tutungkaran tataut sampai kadalaman 5',
'right-sendemail' => 'Mangirim suril ka papamuruk lain',
+'right-passwordreset' => 'Tiringi setelan-pulang katasunduk suril',
# User rights log
'rightslog' => 'Log parubahan hak masuk',
@@ -1332,16 +1340,17 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
'action-suppressionlog' => 'tiringi log paribadi ini',
'action-block' => 'blukir pamuruk ini matan mambabak',
'action-protect' => 'Ubah tingkat parlindungan tungkaran ngini',
+'action-rollback' => 'Mambulikakan hancap bababakan matan pamuruk tauncit nang mambabak sabuah tungkaran tatantu.',
'action-import' => 'Impur tungkaran ngini matan wiki lain',
'action-importupload' => 'Impur tungkaran ngini matan sabuah barakas hunggahan',
'action-patrol' => "tandai babakan nang lain sawagai ta'awasi",
'action-autopatrol' => "Tandai babakan Pian sawagai ta'awasi",
'action-unwatchedpages' => 'tiringi daptar tutungkaran nang kada diitihi',
-'action-trackback' => 'kirim sabuah jajakbulik',
'action-mergehistory' => 'gabungakan halam matan tungkaran ngini',
'action-userrights' => 'babak sabarataan hak pamuruk',
'action-userrights-interwiki' => 'babak hak pamuruk matan papamuruk dalam wiwiki lain',
'action-siteadmin' => 'sunduk atawa bukasunduk basisdata',
+'action-sendemail' => 'Kirim suril',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
@@ -1426,6 +1435,7 @@ Janaki [[Special:NewFiles|galeri babarakas hanyar]] gasan tampaian visual.',
'minlength1' => 'Ngaran barakas musti sahikitnya asa abjad.',
'illegalfilename' => 'Ngaran barakas "$1" mangandung karaktir nang kada dibulihakan dalam tungkaran jujudul.
Muhan ganti ngaran barakas wan cubai mahunggah pulang.',
+'filename-toolong' => 'Ngaran barakas kada bulih tapanjang pada 240 bita.',
'badfilename' => 'Ngaran barakas sudah diganti ka "$1".',
'filetype-mime-mismatch' => 'Ekstensi barakas ".$1" kada pas lawan macam MIME matan barakas ($2).',
'filetype-badmime' => 'Babarakas macam MIME "$1" kada bulih dihunggah.',
@@ -1528,6 +1538,35 @@ Amun masih haja bamasalah, kiau saurang [[Special:ListUsers/sysop|pambakal]].',
'upload-unknown-size' => 'Ukuran kada dikatahui',
'upload-http-error' => 'Sabuah kasalahan HTTP tajadi: $1',
+# File backend
+'backend-fail-stream' => 'Kada kawa manyalarasakan barakas $1.',
+'backend-fail-backup' => 'Kada kawa mambackup barakas $1.',
+'backend-fail-notexists' => 'Si barakas $1 kadada.',
+'backend-fail-hashes' => 'Kada kawa kulihan barakas kasar hagan mananding.',
+'backend-fail-notsame' => 'Sabuah barakas kada dipinandui sudah ada pintangan $1.',
+'backend-fail-invalidpath' => '$1 adalah sabuah jalur panyimpanan kada sah.',
+'backend-fail-delete' => 'Kada kawa mahapus barakas $1.',
+'backend-fail-alreadyexists' => 'Si barakas $1 sudah ada.',
+'backend-fail-store' => 'Kada kawa manyimpan $1 pintangan $2.',
+'backend-fail-copy' => 'Kada kawa manyimpan $1 ka $2.',
+'backend-fail-move' => 'Kada kawa mamindahakan $1 ka $2.',
+'backend-fail-opentemp' => 'Kada kawa maungkai barakas samantara.',
+'backend-fail-writetemp' => 'Kada kawa manulis ka barakas samantara.',
+'backend-fail-closetemp' => 'Kada kawa manungkup barakas samantara.',
+'backend-fail-read' => 'Kada kawa mambaca barakas $1.',
+'backend-fail-create' => 'Kada kawa maulah barakas $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kada kawa mambuka-sunduk "$1"; ngini kada basunduk.',
+'lockmanager-fail-closelock' => 'Kada kawa manungkup "$1".',
+'lockmanager-fail-deletelock' => 'Kada kawa mahapus barakas tasunduk "$1".',
+'lockmanager-fail-acquirelock' => 'Kada kawa bakulihan sunduk gasan "$1".',
+'lockmanager-fail-openlock' => 'Kada kawa maungkai sunduk barakas gasan "$1".',
+'lockmanager-fail-releaselock' => 'Kada kawa malapas sunduk gasan "$1".',
+'lockmanager-fail-db-bucket' => 'Kada kawa santuk cukup sunduk databasis dalam wadah $1.',
+'lockmanager-fail-db-release' => 'Kada kawa malapas sunduk pintang databasis $1.',
+'lockmanager-fail-svr-release' => 'Kada kawa malapas sunduk pintang sarvar $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Sabuah kasalahan tarikin wayah mambuka barakas gasan pariksa ZIP.',
'zip-wrong-format' => 'Barakas nang diajuakan lainan sabuah barakas ZIP.',
@@ -1545,6 +1584,7 @@ Babarakas ngini kada kawa dilihat ka siapa pun kacuali pamuruk nang mahunggahnya
'uploadstash-badtoken' => 'Aksi kada ruhui dilaksanaakan, pinanya karana babakan Pian sudah kadaluarsa. Cubai pulang.',
'uploadstash-errclear' => 'Pangalaran babarakas kada ruhui.',
'uploadstash-refresh' => "Sagar'akan daptar babarakas",
+'invalid-chunk-offset' => 'Putungan kada sah diimbangi',
# img_auth script messages
'img-auth-accessdenied' => 'Ungkaian ditolak',
@@ -1653,23 +1693,24 @@ Diskripsi ngini [$2 tungkaran diskripsi barakas] ditampaiakan di bawah.',
'filerevert-badversion' => 'Kadada janis lokal bahari tumatan barakas ini lawan bacap waktu nang dimaksud.',
# File deletion
-'filedelete' => 'Mahapus $1',
-'filedelete-legend' => 'Hapus barakas',
-'filedelete-intro' => "Pian huwal mahapus barakas '''[[Media:$1|$1]]''' awan barataan halamnya.",
-'filedelete-intro-old' => "Pian mahapus pirsi matan '''[[Media:$1|$1]]''' sawagai matan [$4 $3, $2].",
-'filedelete-comment' => 'Alasan:',
-'filedelete-submit' => 'Hapus',
-'filedelete-success' => "'''$1''' sudah tahapus.",
-'filedelete-success-old' => "Pirsi matan '''[[Media:$1|$1]]''' sawagai matan $3, $2 sudah tahapus.",
-'filedelete-nofile' => "'''$1''' kadada.",
-'filedelete-nofile-old' => "Kadada arsip pirsi matan '''$1''' lawan atribut diajuakan.",
-'filedelete-otherreason' => 'Alasan lain/tambahan:',
-'filedelete-reason-otherlist' => 'Alasan nang lain',
-'filedelete-reason-dropdown' => '*Alasan pahapusan
+'filedelete' => 'Mahapus $1',
+'filedelete-legend' => 'Hapus barakas',
+'filedelete-intro' => "Pian huwal mahapus barakas '''[[Media:$1|$1]]''' awan barataan halamnya.",
+'filedelete-intro-old' => "Pian mahapus pirsi matan '''[[Media:$1|$1]]''' sawagai matan [$4 $3, $2].",
+'filedelete-comment' => 'Alasan:',
+'filedelete-submit' => 'Hapus',
+'filedelete-success' => "'''$1''' sudah tahapus.",
+'filedelete-success-old' => "Pirsi matan '''[[Media:$1|$1]]''' sawagai matan $3, $2 sudah tahapus.",
+'filedelete-nofile' => "'''$1''' kadada.",
+'filedelete-nofile-old' => "Kadada arsip pirsi matan '''$1''' lawan atribut diajuakan.",
+'filedelete-otherreason' => 'Alasan lain/tambahan:',
+'filedelete-reason-otherlist' => 'Alasan nang lain',
+'filedelete-reason-dropdown' => '*Alasan pahapusan
** Palanggaran hak cipta
** Barakas duplikat',
-'filedelete-edit-reasonlist' => 'Aalasan pahapusan babakan',
-'filedelete-maintenance' => 'Pahapusan wan pambulikakan babarakas kada-kawa samantara paharaguan.',
+'filedelete-edit-reasonlist' => 'Aalasan pahapusan babakan',
+'filedelete-maintenance' => 'Pahapusan wan pambulikakan babarakas kada-kawa samantara paharaguan.',
+'filedelete-maintenance-title' => 'Kada kawa mahapus barakas',
# MIME search
'mimesearch' => 'Panggagaian MIME',
@@ -1777,6 +1818,7 @@ Ngini wayah ini sudah diugahakan ka [[$2]].',
'mostimages' => "Barakas nang rancak diguna'akan",
'mostrevisions' => 'Tutungkaran lawan parubahan paling banyak',
'prefixindex' => 'Samunyaan tungkaran wan awalan',
+'prefixindex-namespace' => 'Samunyaan tutungkaran baawalan ($1 ngaran-kamar)',
'shortpages' => 'Tutungkaran handap',
'longpages' => 'Tutungkaran panjang',
'deadendpages' => 'Tutungkaran buntu',
@@ -1793,7 +1835,7 @@ Ngini wayah ini sudah diugahakan ka [[$2]].',
'listusers-editsonly' => 'Tiringi papamuruk awan babakan',
'listusers-creationsort' => 'Susun ulih tanggal paulahan',
'usereditcount' => '$1 {{PLURAL:$1|babakan|bababakan}}',
-'usercreated' => 'Diulah pada $1, $2',
+'usercreated' => '{{GENDER:$3|Diulah}} pada $1 pukul $2',
'newpages' => 'Tungkaran hanyar',
'newpages-username' => 'Ngaran pamuruk:',
'ancientpages' => 'Tutungkaran panuhanya',
@@ -1886,12 +1928,8 @@ Disukung protokol: <tt>$1</tt>',
'activeusers-noresult' => 'Kadada papamuruk tatamu.',
# Special:Log/newusers
-'newuserlogpage' => 'Log pamuruk hanyar',
-'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
-'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
-'newuserlog-create-entry' => 'mandaptar sabagai pamuruk',
-'newuserlog-create2-entry' => 'Maulah akun hanyar $1',
-'newuserlog-autocreate-entry' => 'Akun diulah utumatis',
+'newuserlogpage' => 'Log pamuruk hanyar',
+'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
# Special:ListGroupRights
'listgrouprights' => 'Galambang hak pamuruk',
@@ -1920,7 +1958,7 @@ Ada di [[{{MediaWiki:Listgrouprights-helppage}}|tambahan panjalasan]] pasal hak
'emailpagetext' => 'Pian kawa mamuruk purmulir di bawah hagan mangirim sabuah suril ka pamuruk ngini.
Alamat sril Pian pintang [[Special:Preferences|kakatujuan pamuruk Pian]] akan cungul sawagai "Matan" alamat suril, lalu-ai panarima akan kawa langsung mambalas ka Pian.',
'usermailererror' => 'Objek surat ada kasalahan dibulikakan:',
-'defemailsubject' => 'Suril {{SITENAME}}',
+'defemailsubject' => 'Suril {{SITENAME}} matan pamuruk "$1"',
'usermaildisabled' => 'Suril pamuruk dipajahakan',
'usermaildisabledtext' => 'Pian kada kawa mangirim suril ka papamuruk lain di wiki ngini',
'noemailtitle' => 'Kadada alamat suril',
@@ -2036,8 +2074,6 @@ Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, w
'actioncomplete' => 'Pangulahan tuntung',
'actionfailed' => 'Palakuan luput',
'deletedtext' => '"$1" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
-'deletedarticle' => 'mahapus "[[$1]]"',
-'suppressedarticle' => '"[[$1]]" ditindihakan',
'dellogpage' => 'Log pahapusan',
'dellogpagetext' => 'Di bawah ngini adalah sabuah daptar matan pahapusan hahanyar ni.',
'deletionlog' => 'log pahapusan',
@@ -2088,7 +2124,10 @@ Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parli
'unprotectedarticle' => 'mahilangakan palindungan "[[$1]]"',
'movedarticleprotection' => 'mamindahakan pangaturan protéksi matan "[[$2]]" ka "[[$1]]"',
'protect-title' => 'Malindungi "$1"',
+'protect-title-notallowed' => 'Tiringi tingkat parlindungan matan "$1"',
'prot_1movedto2' => '[[$1]] dipindahakan ka [[$2]]',
+'protect-badnamespace-title' => 'Ngaran-kamar nang kada-dilindungi',
+'protect-badnamespace-text' => 'Tutungkaran dalam ngaran-kamar ngini kada kawa dilindungi.',
'protect-legend' => 'Konpirmasi palindungan',
'protectcomment' => 'Alasan:',
'protectexpiry' => 'Kadaluwarsa:',
@@ -2110,6 +2149,7 @@ Pian kawa maubah tingkatan palindungan gasan tungkaran ini, tagal ini kada pacan
'protect-level-sysop' => 'Hanya pambakal',
'protect-summary-cascade' => 'barénténg',
'protect-expiring' => 'kadaluwarsa $1 (UTC)',
+'protect-expiring-local' => 'kadaluwarsa $1',
'protect-expiry-indefinite' => 'kada bawatas',
'protect-cascade' => 'Lindungi tungkaran-tungkaran nang tamasuk dalam tungkaran ini (palindungan barénténg)',
'protect-cantedit' => 'Pian kada kawa maubah tingkatan palindungan tungkaran ini marga Pian kada baisi hak gasan itu.',
@@ -2171,7 +2211,6 @@ Pian kalu-ai baisi tautan buruk, atawa ralatan sudah disimpan-pulang atau dibuan
'undeletereset' => 'Bulikakan setelan',
'undeleteinvert' => 'Bulikakan pilihan',
'undeletecomment' => 'Alasan:',
-'undeletedarticle' => "''[[$1]]'' sudah dibulikakan",
'undeletedrevisions' => '{{PLURAL:$1|1 ralatan|$1 raralatan}} dibulikakan',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ralatan|$1 raralatan}} and {{PLURAL:$2|1 barakas|$2 babarakas}} dibulikakan',
'undeletedfiles' => '$1 {{PLURAL:$1|barakas|babarakas}} dibulikakan',
@@ -2180,6 +2219,7 @@ ada urang lain nang badahulu mawalangi pahapusan tungkaran ngini.',
'undeletedpage' => "'''$1 sudah disimpan-pulang'''
Janaki [[Special:Log/delete|log pahapusan]] gasan sabuah rakaman matan pahapusan wan panyimpanan-pulang.",
'undelete-header' => 'Janaki [[Special:Log/delete|log pahapusan]] gasan tutungkaran hanyar tahapus.',
+'undelete-search-title' => 'Gagai tutungkaran tahapus',
'undelete-search-box' => 'Gagai tutungkaran tahapus',
'undelete-search-prefix' => 'Tampaiakan tutungkaran bamula lawan:',
'undelete-search-submit' => 'Gagai',
@@ -2189,6 +2229,7 @@ Janaki [[Special:Log/delete|log pahapusan]] gasan sabuah rakaman matan pahapusan
'undelete-cleanup-error' => 'Kasalahan mahapus barakas arkip kada-dipuruk "$1".',
'undelete-missing-filearchive' => 'Kada kawa manyimpan-pulang barakas arkip ID $1 karana ngini kadada dalam data basis.
Pinanya barakas ngini sudah dilapas-hapusannya.',
+'undelete-error' => 'Kasalahan kada-mahapus tungkaran',
'undelete-error-short' => 'Kasalahan malapas-hapusan barakas: $1',
'undelete-error-long' => 'Kasalahan tarikin parhatan malapas-hapusan barakas:
@@ -2310,6 +2351,7 @@ Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
'blocklist-userblocks' => 'Sungkupakan pamblukiran akun',
'blocklist-tempblocks' => 'Sungkupakan pamblukiran samantara',
'blocklist-addressblocks' => 'Sungkupakan pamblukiran asa IP',
+'blocklist-rangeblocks' => 'Sungkupakan wilayah blukir',
'blocklist-timestamp' => 'Capwayah',
'blocklist-target' => 'Tuju',
'blocklist-expiry' => 'Kadaluwarsa',
@@ -2332,6 +2374,7 @@ Janaki [[Special:BlockList|daptar IP dibluk]] hagan maniring-pulang blukir.',
'unblocklink' => 'hilangakan blukir',
'change-blocklink' => 'ubah blukir',
'contribslink' => 'sumbangan',
+'emaillink' => 'kirim suril',
'autoblocker' => 'Utumatis blukir karana alamat IP Pian hahanyar ni dipuruk ulih "[[User:$1|$1]]".
Alasan nang dibari gasan pamblukiran $1 adalah: "$2"',
'blocklogpage' => 'Log blukir',
@@ -2450,9 +2493,6 @@ muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
'movepage-page-moved' => 'Tungkaran $1 sudah dipindahakan ka $2.',
'movepage-page-unmoved' => 'Tungkaran $1 kada kawa dipindahakan ka $2.',
'movepage-max-pages' => 'Maksimal $1 {{PLURAL:$1|tungkaran|tutungkaran}} sudah dipindahakan wan kada kawa lagi dipindahakan utumatis.',
-'1movedto2' => 'mamindahakan [[$1]] ka [[$2]]',
-'1movedto2_redir' => 'mamindahakan [[$1]] ka [[$2]] malalui paugahan',
-'move-redirect-suppressed' => 'paugahan ditikin',
'movelogpage' => 'Log pamindahan',
'movelogpagetext' => 'Di bawah ngini adalah sabuah daptar matan samunyaan pamindahan tungkaran.',
'movesubpage' => '{{PLURAL:$1|Subtungkaran|Subtutungkaran}}',
@@ -2499,6 +2539,7 @@ Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Spec
'exportcuronly' => 'Tamasuk ralatan tadamini haja, kada sahibakan halam',
'exportnohistory' => "----
''Catatan:''' Ma-ikspur sahibakan halam matan tutungkaran lung purmulir ngini sudah dipajahakan lawan alasan ginawi.",
+'exportlistauthors' => 'Tarmasuk sabuah daptar hibak panyumbang gasan tiap tungkaran',
'export-submit' => 'Pangaluar',
'export-addcattext' => 'Tambahi tutungkaran matan tumbung:',
'export-addcat' => 'Tambahi',
@@ -2531,6 +2572,8 @@ Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan
'thumbnail_error' => 'Kasalahan maulah thumbnail: $1',
'djvu_page_error' => 'Tungkaran DJVu di luar jarak',
'djvu_no_xml' => 'Kada kawa kulihan XML gasan barakas DJVu',
+'thumbnail-temp-create' => 'Kada kawa maulah barakas kuku-umajari samantara',
+'thumbnail-dest-create' => 'Kada kawa manyimpan kuku-umajari ka tujuan',
'thumbnail_invalid_params' => 'Takaran thumbnail kada sah',
'thumbnail_dest_directory' => 'Kada kawa maulah direktori tujuan',
'thumbnail_image-type' => 'Macam pancitraan kada disukung',
@@ -2579,6 +2622,8 @@ Sabuah puldar samantara hilang.',
'import-token-mismatch' => 'Kahilangan sesi data.
Muhun cubai pulang.',
'import-invalid-interwiki' => 'Kada kawa maimpur matan wiki nang diajuakan.',
+'import-error-edit' => 'Tungkaran "$1" kada diumpur karana Pian kada bulih mambabak ngini.',
+'import-error-create' => 'Tungkaran "$1" kada diumpur karana Pian kada bulih maulah ngini.',
# Import log
'importlogpage' => 'Log impur',
@@ -2706,9 +2751,6 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
# Patrol log
'patrol-log-page' => 'Log pa-awasan',
'patrol-log-header' => 'Ngini adalah sabuah log matan raralatan nang ta-awasi.',
-'patrol-log-line' => 'ciri-i $1 matan $2 ta-awasi $3',
-'patrol-log-auto' => '(utumatis)',
-'patrol-log-diff' => 'Ralatan $1',
'log-show-hide-patrol' => '$1 log pa-awasan',
# Image deletion
@@ -2727,23 +2769,25 @@ $1',
'nextdiff' => 'Ralatan tahanyar →',
# Media information
-'mediawarning' => "'''Paringatan''': Barakas ngini pinanya mangandung kudi babahaya.
+'mediawarning' => "'''Paringatan''': Barakas ngini pinanya mangandung kudi babahaya.
Manarusakan ngini, kawa manyarang sistem Pian.",
-'imagemaxsize' => "Watas takaran gambar: <br />''(gasan barakas tutungkaran diskripsi)''",
-'thumbsize' => 'Ukuran kuku-uma-jari:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|tungkaran|tutungkaran}}',
-'file-info' => 'takaran barakas: $1, macam MIME: $2',
-'file-info-size' => '$1 × $2 piksel, ukuran barakas: $3, tipe MIME: $4',
-'file-info-size-pages' => '$1 × $2 piksal, takaran barakas: $3, macam MIME: $4, $5 {{PLURAL:$5|tungkaran|tutungkaran}}',
-'file-nohires' => '<small> kadada tasadia resolusi tapancau.</small>',
-'svg-long-desc' => 'Barakas SVG, nominal $1 × $2 piksel, basar barakas: $3',
-'show-big-image' => 'Ukuran hibak',
-'show-big-image-size' => '$1 × $2 piksal',
-'file-info-gif-looped' => 'mambulat',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
-'file-info-png-looped' => 'mambulat',
-'file-info-png-repeat' => 'dimainakan $1 {{PLURAL:$1|kali|kakali}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
+'imagemaxsize' => "Watas takaran gambar: <br />''(gasan barakas tutungkaran diskripsi)''",
+'thumbsize' => 'Ukuran kuku-uma-jari:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|tungkaran|tutungkaran}}',
+'file-info' => 'takaran barakas: $1, macam MIME: $2',
+'file-info-size' => '$1 × $2 piksel, ukuran barakas: $3, tipe MIME: $4',
+'file-info-size-pages' => '$1 × $2 piksal, takaran barakas: $3, macam MIME: $4, $5 {{PLURAL:$5|tungkaran|tutungkaran}}',
+'file-nohires' => 'Kadada tasadia resolusi tapancau.',
+'svg-long-desc' => 'Barakas SVG, nominal $1 × $2 piksel, basar barakas: $3',
+'show-big-image' => 'Ukuran hibak',
+'show-big-image-preview' => 'Takaran tilikan ngini: $1.',
+'show-big-image-other' => 'Resolusi lain: $1.',
+'show-big-image-size' => '$1 × $2 piksal',
+'file-info-gif-looped' => 'mambulat',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
+'file-info-png-looped' => 'mambulat',
+'file-info-png-repeat' => 'dimainakan $1 {{PLURAL:$1|kali|kakali}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|pigura|pipigura}}',
# Special:NewFiles
'newimages' => 'Balai babarakas hanyar',
@@ -2757,6 +2801,13 @@ Manarusakan ngini, kawa manyarang sistem Pian.",
'bydate' => 'ulih tanggal',
'sp-newimages-showfrom' => 'Tampaiakan babarakas hanyar mulai matan $1, $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 datik|$1 dadatik}}',
+'minutes' => '{{PLURAL:$1|$1 manit|$1 mamanit}}',
+'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
+'days' => '{{PLURAL:$1|$1 hari|$1 hahari}}',
+'ago' => '$1 lalu',
+
# Bad image list
'bad_image_list' => "Purmatnya nangkaya di bawah ni:
@@ -3258,9 +3309,6 @@ Kudi payakinan ngini akan kadaluarsa pada $4.',
'scarytranscludefailed' => '[Pangambilan citakan $1 gagal]',
'scarytranscludetoolong' => '[URL kapanjangan]',
-# Trackbacks
-'trackbackremove' => '([$1 Hapus])',
-
# Delete conflict
'deletedwhileediting' => "'''Paringatan''': Tungkaran ngini sudah dihapus satalah Pian bamula mambabak!",
'confirmrecreate' => "Pamuruk [[User:$1|$1]] ([[User talk:$1|pandir]]) sudah mahapus tungkaran ngini satalah Pian bamula mambabak awan alasan:
@@ -3343,6 +3391,9 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
'watchlisttools-edit' => 'Tiringi wan babak daptar itihan',
'watchlisttools-raw' => 'Babak daptar itihan mantah',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pandir]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tag ekstensi kada dipinandui "$1"',
'duplicate-defaultsort' => 'Paringatan: Sunduk pangurutan baku "$2" mangabaikan sunduk pangurutan baku "$1" sabalumnya.',
@@ -3441,13 +3492,16 @@ Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugra
'tags-hitcount' => '$1 {{PLURAL:$1|parubahan|paparubahan}}',
# Special:ComparePages
-'comparepages' => 'Bandingakan tutungkaran',
-'compare-selector' => 'Tanding raralatan tungkaran',
-'compare-page1' => 'Tungkaran 1',
-'compare-page2' => 'Tungkaran 2',
-'compare-rev1' => 'Ralatan 1',
-'compare-rev2' => 'Ralatan 2',
-'compare-submit' => 'Tanding',
+'comparepages' => 'Bandingakan tutungkaran',
+'compare-selector' => 'Tanding raralatan tungkaran',
+'compare-page1' => 'Tungkaran 1',
+'compare-page2' => 'Tungkaran 2',
+'compare-rev1' => 'Ralatan 1',
+'compare-rev2' => 'Ralatan 2',
+'compare-submit' => 'Tanding',
+'compare-invalid-title' => 'Judul nang Pian bari kada sah.',
+'compare-title-not-exists' => 'Si judul nang Pian ajuakan kadada.',
+'compare-revision-not-exists' => 'Si ralatan nang Pian ajuakan kadada.',
# Database error messages
'dberr-header' => 'Wiki ngini baisi sabuah masalah',
@@ -3475,4 +3529,52 @@ Situs ngini mangalami kangalihan teknik.',
'sqlite-has-fts' => '$1 awan sukungan panggagaian naskah-hibak',
'sqlite-no-fts' => '$1 kada-awan sukungan panggagaian naskah-hibak',
+# New logging system
+'logentry-delete-delete' => '$1 tahapus tungkaran $3',
+'logentry-delete-restore' => '$1 dibulikakan tungkaran $3',
+'logentry-delete-event' => '$1 mangganti kakawaan dijanaki {{PLURAL:$5|sabuah log kajadian|$5 log kajadian}} pintangan $3: $4',
+'logentry-delete-revision' => '$1 mangganti kakawaan dijanaki {{PLURAL:$5|sabuah ralatan|$5 ralatan}} pintangan tungkaran $3: $4',
+'logentry-delete-event-legacy' => '$1 mangganti kakawaan dijanaki log kajadian pintangan $3',
+'logentry-delete-revision-legacy' => '$1 mangganti kakawaan dijanaki ralatan pintangan tungkaran $3',
+'logentry-suppress-delete' => '$1 ditikin tungkaran $3',
+'logentry-suppress-event' => '$1 mangganti kakawaan dijanaki {{PLURAL:$5|sabuah log kajadian|$5 log kajadian}} pintangan $3: $4 lawan rahasia',
+'logentry-suppress-revision' => '$1 mangganti kakawaan dijanaki {{PLURAL:$5|sabuah ralatan|$5 ralatan}} pintangan tungkaran $3: $4 lawan rahasia',
+'logentry-suppress-event-legacy' => '$1 mangganti kakawaan dijanaki log kajadian pintangan $3 lawan rahasia',
+'logentry-suppress-revision-legacy' => '$1 mangganti kakawaan dijanaki ralatan pintangan tungkaran $3 lawan rahasia',
+'revdelete-content-hid' => 'Isi disungkupakan',
+'revdelete-summary-hid' => 'babak kasimpulan tasungkup',
+'revdelete-uname-hid' => 'ngaran-pamuruk tasungkup',
+'revdelete-content-unhid' => 'Isi kada disungkupakan',
+'revdelete-summary-unhid' => 'babak kasimpulan kada tasungkup',
+'revdelete-uname-unhid' => 'ngaran-pamuruk kada tasungkup',
+'revdelete-restricted' => 'Talamar pambatasan hagan pambakal-pambakal',
+'revdelete-unrestricted' => 'Buang pambatasan gasan pambakal-pambakal',
+'logentry-move-move' => '$1 diugah ptungkaran $3 ka $4',
+'logentry-move-move-noredirect' => '$1 diugah tungkaran $3 ka $4 awan-kada maninggalakan sabuah paugahan',
+'logentry-move-move_redir' => '$1 diugah tungkaran $3 ka $4 lung paugahan',
+'logentry-move-move_redir-noredirect' => '$1 diugah tungkaran $3 ka $4 lung sabuah paugahan awan-kada maninggalakan sabuah paugahan',
+'logentry-patrol-patrol' => "$1 diciri'i ralatan $4 matan tungkaran $3 taawasi",
+'logentry-patrol-patrol-auto' => "$1 utumatis diciri'i ralatan $4 matan tungkaran $3 taawasi",
+'logentry-newusers-newusers' => '$1 diulah sabuah akun pamuruk',
+'logentry-newusers-create' => '$1 diulah sabuah akun pamuruk',
+'logentry-newusers-create2' => '$1 diulah sabuah akun pamuruk $3',
+'logentry-newusers-autocreate' => 'Akun $1 utumatis diulah',
+'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
+
+# Feedback
+'feedback-bugornote' => 'Pabila Pian siap manjalasakan sabuah masalah taknik rinci muhun [lapurakan sabuah bug $1].
+Salain ngitu, Pian kawa mamuruk prmulir nyaman di bawah ngini. Kumintar Pian akan ditambahi ka si tungkaran "[$3 $2]", baimbai awan ngaran-pamuruk Pian wan panjalajah nagn Pian puruk.',
+'feedback-subject' => 'Parihal:',
+'feedback-message' => 'Pasan:',
+'feedback-cancel' => 'Walangi',
+'feedback-submit' => 'Kirimi Kitihanbalik',
+'feedback-adding' => 'Manambahi kitihanbalik ka tungkaran...',
+'feedback-error1' => 'Kasalahan: kulihan matan API kada-dipinandui',
+'feedback-error2' => 'Kasalahan: Babakan gagal',
+'feedback-error3' => 'Kasalahan: Kadada tanggapan matan API',
+'feedback-thanks' => 'Tarimakasih! jitihanbalik Pian sudah dipusakan ka si tungkaran "[$2 $1]".',
+'feedback-close' => 'Sudah',
+'feedback-bugcheck' => 'Harat! hanyar dipariksa bahwasa ngini lainan salah asa [$1 bug nang dipinandui].',
+'feedback-bugnew' => 'Ulun mamariksa. Malapurakan sabuah bug hanyar',
+
);
diff --git a/languages/messages/MessagesBn.php b/languages/messages/MessagesBn.php
index dcc57d10..3d97244f 100644
--- a/languages/messages/MessagesBn.php
+++ b/languages/messages/MessagesBn.php
@@ -19,6 +19,7 @@
* @author Reedy
* @author Samritmaity
* @author Sayak Sarkar
+ * @author Sm faysal
* @author Usarker
* @author Wikitanvir
* @author Zaheen
@@ -64,6 +65,8 @@ $digitTransformTable = array(
'9' => '৯'
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'সংযোগগà§à¦²à¦¿à¦° নিচে দাগ দেখানো হোক:',
@@ -423,20 +426,22 @@ $1',
'badarticleerror' => 'à¦à¦‡ পাতায় à¦à¦‡ কাজটি করা সমà§à¦­à¦¬ নয়।',
'cannotdelete' => '"$1" পাতা বা ফাইলটি মোছা সমà§à¦­à¦¬ না।
সমà§à¦­à¦¬à¦¤ অনà§à¦¯ কেউ আগেই à¦à¦Ÿà¦¿à¦•à§‡ মà§à¦›à§‡ ফেলেছেন।',
+'cannotdelete-title' => '"$1" পৃষà§à¦ à¦¾ মà§à¦›à§‡ ফেলা যাচà§à¦›à§‡ না।',
'badtitle' => 'শিরোনামটি গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নয়।',
'badtitletext' => 'অনà§à¦°à§‹à¦§à¦•à§ƒà¦¤ পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভà§à¦² আনà§à¦¤à¦ƒà¦­à¦¾à¦·à¦¾ বা আনà§à¦¤à¦ƒà¦‰à¦‡à¦•à¦¿ শিরোনাম সংযোগ ছিল। à¦à¦Ÿà¦¿à¦¤à§‡ সমà§à¦­à¦¬à¦¤ à¦à¦®à¦¨ à¦à¦• (à¦à¦•à¦¾à¦§à¦¿à¦•) কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° আছে, যা (যেগà§à¦²à¦¿) শিরোনামে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ নয়।',
-'perfcached' => 'নিচের উপাতà§à¦¤à¦—à§à¦²à§‹ কà§à¦¯à¦¾à¦¶ থেকে নেয়া à¦à¦¬à¦‚ সমà§à¦ªà§‚রà§à¦£ হালনাগাদকৃত না-ও হতে পারে:',
-'perfcachedts' => 'নিচের উপাতà§à¦¤à¦—à§à¦²à§‹ কà§à¦¯à¦¾à¦¶ থেকে নেয়া à¦à¦¬à¦‚ $1 তারিখে হালনাগাদ করা হয়েছে।',
+'perfcached' => 'নিচের উপাতà§à¦¤à¦—à§à¦²à§‹ কà§à¦¯à¦¾à¦¶ থেকে নেয়া à¦à¦¬à¦‚ সমà§à¦ªà§‚রà§à¦£ হালনাগাদকৃত না-ও হতে পারে। সরà§à¦¬à§‹à¦šà§à¦š {{PLURAL:$1|à¦à¦•à¦Ÿà¦¿ ফলাফল|$1 টি ফলাফল}} কà§à¦¯à¦¾à¦¶à§‡ থাকতে পারে।',
+'perfcachedts' => 'নিচের উপাতà§à¦¤à¦—à§à¦²à§‹ কà§à¦¯à¦¾à¦¶ থেকে নেয়া à¦à¦¬à¦‚ $1 তারিখে হালনাগাদ করা হয়েছে। সরà§à¦¬à§‹à¦šà§à¦š {{PLURAL:$4|à¦à¦•à¦Ÿà¦¿ ফলাফল|$4 টি ফলাফল}} কà§à¦¯à¦¾à¦¶à§‡ থাকতে পারে।',
'querypage-no-updates' => 'à¦à¦‡ পাতার জনà§à¦¯ হালনাগাদ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ করা হয়েছে। à¦à¦–ানে রাখা উপাতà§à¦¤ ঠমà§à¦¹à§‚রà§à¦¤à§‡ রিফà§à¦°à§‡à¦¶ করা হবে না।',
'wrong_wfQuery_params' => 'wfQuery()-তে ভà§à¦² পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦° দেয়া হয়েছে<br />
ফাংশন: $1<br />
কোয়েরি: $2',
'viewsource' => 'উৎস দেখà§à¦¨',
-'viewsourcefor' => '$1 à¦à¦° জনà§à¦¯',
+'viewsource-title' => '$1 à¦à¦° উৎস দেখà§à¦¨',
'actionthrottled' => 'কাজের গতি ধীরকরণ',
'actionthrottledtext' => 'সà§à¦ªà§à¦¯à¦¾à¦®-রোধী সমাধান হিসেবে à¦à¦‡ কাজটি খà§à¦¬ কম সময়ে অনেক বেশিবার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার সীমা বেà¦à¦§à§‡ দেওয়া হয়েছে। আপনি সেই সীমা অতিকà§à¦°à¦® করেছেন। অনà§à¦—à§à¦°à¦¹ করে কয়েক মিনিট পরে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
'protectedpagetext' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ à¦à¦¡à¦¼à¦¾à¦¤à§‡ ঠপাতাটির বà§à¦¯à¦¬à¦¹à¦¾à¦° নিয়নà§à¦¤à§à¦°à¦£ করা হয়েছে।',
'viewsourcetext' => 'ঠপাতাটি আপনি দেখতে à¦à¦¬à¦‚ উৎসের অনà§à¦²à¦¿à¦ªà¦¿ নিতে পারবেন:',
+'viewyourtext' => "আপনি ' ' ' আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ' ' ' à¦à¦‡ পাতায় দেখতে à¦à¦¬à¦‚ কপি করতে পারেন:",
'protectedinterface' => 'à¦à¦‡ পাতার বিষয়বসà§à¦¤à§ উইকি সফটওয়à§à¦¯à¦¾à¦°à§‡à¦° à¦à¦•à¦Ÿà¦¿ ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ বারà§à¦¤à¦¾ পà§à¦°à¦¦à¦¾à¦¨ করে, তাই à¦à¦Ÿà¦¿à¦•à§‡ সà§à¦°à¦•à§à¦·à¦¿à¦¤ করে রাখা হয়েছে।',
'editinginterface' => "'''সতরà§à¦•à§€à¦•à¦°à¦£:''' আপনি à¦à¦®à¦¨ à¦à¦•à¦Ÿà¦¿ পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করছেন যা সফটওয়à§à¦¯à¦¾à¦°à§‡à¦° জনà§à¦¯ ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ টেকà§à¦¸à¦Ÿ পà§à¦°à¦¦à¦¾à¦¨ করে। à¦à¦‡ পাতাতে সংঘটিত পরিবরà§à¦¤à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸à§‡ পà§à¦°à¦­à¦¾à¦¬ ফেলবে, যা অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°à¦¾ দেখতে পাবেন। অনà§à¦¬à¦¾à¦¦à§‡à¦° জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে [//translatewiki.net/wiki/Main_Page?setlang=bn translatewiki.net] বà§à¦¯à¦¬à¦¹à¦¾à¦° করার বà§à¦¯à¦¾à¦ªà¦¾à¦°à¦Ÿà¦¿ বিবেচনা করà§à¦¨à¥¤ à¦à¦Ÿà¦¿ মিডিয়াউইকি সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼à¦•à¦°à¦£ পà§à¦°à¦•à¦²à§à¦ªà¥¤",
'sqlhidden' => '(à¦à¦¸ কিউ à¦à¦² কোয়েরি লà§à¦•à¦¾à¦¨à§‹ আছে)',
@@ -529,6 +534,7 @@ $2',
'noemailprefs' => 'à¦à¦‡ বৈশিষà§à¦Ÿà¦Ÿà¦¿ কাজ করাতে হলে à¦à¦•à¦Ÿà¦¿ ই-মেইল ঠিকানা নিরà§à¦§à¦¾à¦°à¦£ করতে হবে।',
'emailconfirmlink' => 'আপনার ই-মেইলের ঠিকানা নিশà§à¦šà¦¿à¦¤ করà§à¦¨',
'invalidemailaddress' => 'à¦à¦‡ ই-মেইল ঠিকানাটি গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়, কারণ সমà§à¦­à¦¬à¦¤ à¦à¦Ÿà¦¿ সঠিক ফরমà§à¦¯à¦¾à¦Ÿà§‡ লেখা হয়নি। অনà§à¦—à§à¦°à¦¹ করে সঠিক ফরমà§à¦¯à¦¾à¦Ÿà§‡ লেখা ই-মেইল ঠিকানা দিন, অথবা কà§à¦·à§‡à¦¤à§à¦°à¦Ÿà¦¿ খালি রাখà§à¦¨à¥¤',
+'cannotchangeemail' => 'à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ ইমেইল ঠিকানা à¦à¦‡ উইকিতে পরিবরà§à¦¤à¦¨ করা যাবে না।',
'accountcreated' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা হয়েছে',
'accountcreatedtext' => '$1 à¦à¦° জনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা হয়েছে।',
'createaccount-title' => '{{SITENAME}}-à¦à¦° জনà§à¦¯ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿',
@@ -544,6 +550,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'পিà¦à¦‡à¦šà¦ªà¦¿ à¦à¦° মেইল () কারà§à¦¯à§‡ অজà§à¦žà¦¾à¦¤ ভà§à¦²',
+'user-mail-no-addy' => 'কোনো ইমেইল ঠিকানা ছাড়াই ইমেইল করার চেষà§à¦Ÿà¦¾ করা হয়েছে।',
# Change password dialog
'resetpass' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
@@ -564,16 +571,17 @@ $2',
'resetpass-temp-password' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ শবà§à¦¦à¦šà¦¾à¦¬à¦¿:',
# Special:PasswordReset
-'passwordreset' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেট',
-'passwordreset-text' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯ ই-মেইলের মাধà§à¦¯à¦®à§‡ পেতে নিচের ফরà§à¦®à¦Ÿà¦¿ পূরণ করà§à¦¨à¥¤',
-'passwordreset-legend' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেট',
-'passwordreset-disabled' => 'à¦à¦‡ উইকিতে শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেটের সà§à¦¬à¦¿à¦§à¦¾ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।',
-'passwordreset-pretext' => '{{PLURAL:$1||নিচে উলà§à¦²à§‡à¦–িত ডেটাগà§à¦²à§‹à¦° কোনো à¦à¦•à¦Ÿà¦¿ পà§à¦°à¦¬à§‡à¦¶ করান}}',
-'passwordreset-username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
-'passwordreset-domain' => 'ডোমেইন:',
-'passwordreset-email' => 'ইমেইল ঠিকানা:',
-'passwordreset-emailtitle' => '{{SITENAME}} সাইটে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à¦¾à¦¦à¦¿',
-'passwordreset-emailtext-ip' => 'কেউ à¦à¦•à¦œà¦¨ (সমà§à¦­à¦¬à¦¤ আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জনà§à¦¯ আপনার
+'passwordreset' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেট',
+'passwordreset-text' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯ ই-মেইলের মাধà§à¦¯à¦®à§‡ পেতে নিচের ফরà§à¦®à¦Ÿà¦¿ পূরণ করà§à¦¨à¥¤',
+'passwordreset-legend' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেট',
+'passwordreset-disabled' => 'à¦à¦‡ উইকিতে শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেটের সà§à¦¬à¦¿à¦§à¦¾ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।',
+'passwordreset-pretext' => '{{PLURAL:$1||নিচে উলà§à¦²à§‡à¦–িত ডেটাগà§à¦²à§‹à¦° কোনো à¦à¦•à¦Ÿà¦¿ পà§à¦°à¦¬à§‡à¦¶ করান}}',
+'passwordreset-username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
+'passwordreset-domain' => 'ডোমেইন:',
+'passwordreset-capture' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° ফলাফলের ইমেইল দেখà§à¦¨?',
+'passwordreset-email' => 'ইমেইল ঠিকানা:',
+'passwordreset-emailtitle' => '{{SITENAME}} সাইটে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à¦¾à¦¦à¦¿',
+'passwordreset-emailtext-ip' => 'কেউ à¦à¦•à¦œà¦¨ (সমà§à¦­à¦¬à¦¤ আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জনà§à¦¯ আপনার
অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯ জানতে চেয়েছে। নিচের বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ {{PLURAL:$3|অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿|অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦—à§à¦²à§‹}}
à¦à¦‡ ই-মেইল ঠিকানার সাথে সংযà§à¦•à§à¦¤:
@@ -583,7 +591,7 @@ $2
আপনার অবশà§à¦¯à¦‡ লগ-ইন করে à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ পাসওয়ারà§à¦¡ পছনà§à¦¦ করা উচিত। যদি অনà§à¦¯ কেউ à¦à¦‡ অনà§à¦°à§‹à¦§ করে থাকে,
অথবা আপনি যদি পà§à¦°à§‹à¦¨à§‹ পাসওয়ারà§à¦¡ মনে করতে পারেন, à¦à¦¬à¦‚ আপনার সেটি পরিবরà§à¦¤à¦¨ করার কোনো ইচà§à¦›à¦¾ না থাকে, তবে
আপনি à¦à¦‡ বারà§à¦¤à¦¾à¦Ÿà¦¿ উপেকà§à¦·à¦¾ করতে পারে, à¦à¦¬à¦‚ আপনার পà§à¦°à§‹à¦¨à§‹ পাসওয়ারà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা চালিয়ে যেতে পারেন।',
-'passwordreset-emailtext-user' => 'কেউ à¦à¦•à¦œà¦¨ (সমà§à¦­à¦¬à¦¤ আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জনà§à¦¯ আপনার
+'passwordreset-emailtext-user' => 'কেউ à¦à¦•à¦œà¦¨ (সমà§à¦­à¦¬à¦¤ আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জনà§à¦¯ আপনার
অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° à¦à¦•à¦Ÿà¦¿ পাসওয়ারà§à¦¡ রিমাইনà§à¦¡à¦¾à¦° চেয়ে পাঠিয়েছে। নিচের বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ {{PLURAL:$3|অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿|অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦—à§à¦²à§‹}}
à¦à¦‡ ই-মেইল ঠিকানার সাথে সংযà§à¦•à§à¦¤:
@@ -593,9 +601,22 @@ $2
আপনার অবশà§à¦¯à¦‡ লগ-ইন করে à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ পাসওয়ারà§à¦¡ পছনà§à¦¦ করা উচিত। যদি অনà§à¦¯ কেউ à¦à¦‡ অনà§à¦°à§‹à¦§ করে থাকে,
অথবা আপনি যদি পà§à¦°à§‹à¦¨à§‹ পাসওয়ারà§à¦¡ মনে করতে পারেন, à¦à¦¬à¦‚ আপনার সেটি পরিবরà§à¦¤à¦¨ করার কোনো ইচà§à¦›à¦¾ না থাকে, তবে
আপনি à¦à¦‡ বারà§à¦¤à¦¾à¦Ÿà¦¿ উপেকà§à¦·à¦¾ করতে পারে, à¦à¦¬à¦‚ আপনার পà§à¦°à§‹à¦¨à§‹ পাসওয়ারà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা চালিয়ে যেতে পারেন।',
-'passwordreset-emailelement' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম: $1
+'passwordreset-emailelement' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম: $1
অসà§à¦¥à¦¾à¦¯à¦¼à§€ শবà§à¦¦à¦šà¦¾à¦¬à¦¿: $2',
-'passwordreset-emailsent' => 'à¦à¦•à¦Ÿà¦¿ রিমাইনà§à¦¡à¦¾à¦° ই-মেইল পাঠানো হয়েছে।',
+'passwordreset-emailsent' => 'à¦à¦•à¦Ÿà¦¿ রিমাইনà§à¦¡à¦¾à¦° ই-মেইল পাঠানো হয়েছে।',
+'passwordreset-emailsent-capture' => 'সà§à¦®à¦°à¦£ করিয়ে দেয়ার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ ইমেইল করা হয়েছে, যা নিচে দেখানো হচà§à¦›à§‡à¥¤',
+'passwordreset-emailerror-capture' => 'সà§à¦®à¦°à¦£ করিয়ে দেয়ার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচà§à¦›à§‡, তবে $1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ à¦à¦Ÿà¦¿ পাঠানো যায়নি',
+
+# Special:ChangeEmail
+'changeemail' => 'ই-মেইল ঠিকানা পরিবরà§à¦¤à¦¨',
+'changeemail-header' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ ই-মেইল ঠিকানা পরিবরà§à¦¤à¦¨',
+'changeemail-text' => 'ই-মেইল ঠিকানা পরিবরà§à¦¤à¦¨ করতে আপনাকে à¦à¦‡ ফরমটি পূরণ করতে হবে। à¦à¦‡ পরিবরà§à¦¤à¦¨à¦Ÿà¦¿ নিশà§à¦šà¦¿à¦¤ করতে আপনার শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (পাসওয়ারà§à¦¡) পà§à¦°à¦¦à¦¾à¦¨à§‡à¦° পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨ হবে।',
+'changeemail-no-info' => 'à¦à¦‡ পাতাটিতে সরাসরি পà§à¦°à¦¬à§‡à¦¶à¦¾à¦§à¦¿à¦•à¦¾à¦° পেতে আপনাকে অবশà§à¦¯à¦‡ লগইন করতে হবে।',
+'changeemail-oldemail' => 'বরà§à¦¤à¦®à¦¾à¦¨ ই-মেইল ঠিকানা:',
+'changeemail-newemail' => 'নতà§à¦¨ ই-মেইল ঠিকানা:',
+'changeemail-none' => '(কিছৠনাই)',
+'changeemail-submit' => 'ই-মেইল পরিবরà§à¦¤à¦¨',
+'changeemail-cancel' => 'বাতিল',
# Edit page toolbar
'bold_sample' => 'গাঢ় লেখা',
@@ -664,9 +685,6 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
আপনার বরà§à¦¤à¦®à¦¾à¦¨ IP ঠিকানা হচà§à¦›à§‡ $3, à¦à¦¬à¦‚ যা বাধা দানের আইডি হল $5।
যেকোন পà§à¦°à¦¶à§à¦¨ করার সময় উপরের সকল তথà§à¦¯ উলà§à¦²à§‡à¦– করà§à¦¨à¥¤',
'blockednoreason' => 'কোন কারণ দেওয়া হয়নি',
-'blockedoriginalsource' => "'''$1''' à¦à¦° উৎস নিচে দেখানো হল:",
-'blockededitsource' => "'''$1''' ঠ'''আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾''' করা লেখাগà§à¦²à§‹ নিচে দেখানো হল:",
-'whitelistedittitle' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে পà§à¦°à¦¬à§‡à¦¶ আবশà§à¦¯à¦•',
'whitelistedittext' => 'পাতায় সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে আপশà§à¦¯à¦‡ $1 করতে হবে।',
'confirmedittext' => 'কোন সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার আগে আপনার ই-মেইল ঠিকানাটি অবশà§à¦¯à¦‡ নিশà§à¦šà¦¿à¦¤ করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° পছনà§à¦¦à¦¤à¦¾à¦²à¦¿à¦•à¦¾à¦¯à¦¼]] ঠিকমত দিন।',
'nosuchsectiontitle' => 'অনà§à¦šà§à¦›à§‡à¦¦ পাওয়া যায়নি',
@@ -885,8 +903,6 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'revdelete-unsuppress' => 'সংশোধন পà§à¦¨à¦ƒà¦¸à§à¦¥à¦¾à¦ªà¦¨à§‡à¦° উপর সীমাবদà§à¦§à¦¤à¦¾ দূর করো',
'revdelete-log' => 'কারণ:',
'revdelete-submit' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} পà§à¦°à¦¯à¦¼à§‹à¦— করো',
-'revdelete-logentry' => '[[$1]] পাতার সংশোধন দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করেছেন',
-'logdelete-logentry' => '[[$1]] পাতার ঘটনা দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করেছে',
'revdelete-success' => "'''সংশোধন দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ সফলভাবে হালনাগাদ করা হয়েছে।'''",
'logdelete-success' => "'''ঘটনা দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ সফলভাবে সà§à¦¥à¦¾à¦ªà¦¨ করা হয়েছে।'''",
'revdel-restore' => 'দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ পরিবরà§à¦¤à¦¨ করো',
@@ -894,15 +910,6 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'revdel-restore-visible' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à¦¯à§‹à¦—à§à¦¯ সংসà§à¦•à¦°à¦£',
'pagehist' => 'পাতার ইতিহাস',
'deletedhist' => 'ইতিহাস মà§à¦›à§‡ ফেলো',
-'revdelete-content' => 'বিষয়বসà§à¦¤à§',
-'revdelete-summary' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সারাংশ',
-'revdelete-uname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম',
-'revdelete-restricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ পà§à¦°à¦¯à¦¼à§‹à¦— করো',
-'revdelete-unrestricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ তà§à¦²à§‡ নাও',
-'revdelete-hid' => '$1 আড়াল করা হয়েছে',
-'revdelete-unhid' => '$1 পà§à¦°à¦•à¦¾à¦¶ করা হয়েছে',
-'revdelete-log-message' => '$2{{PLURAL:$2|টি সংশোধনের|টি সংশোধনের}} $1',
-'logdelete-log-message' => '$1 à¦à¦° জনà§à¦¯ $2 {{PLURAL:$2|ঘটনা|ঘটনা সমূহ}}',
'revdelete-reason-dropdown' => '*সাধারণ অপসারণের কারণসমূহ
** কপিরাইট লঙà§à¦˜à¦¨
** অনà§à¦ªà¦¯à§à¦•à§à¦¤ বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯
@@ -1043,12 +1050,14 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'prefs-rc' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ',
'prefs-watchlist' => 'নজরতালিকা',
'prefs-watchlist-days' => 'যত দিনের নজরতালিকা দেখানো হবে:',
-'prefs-watchlist-days-max' => 'সরà§à¦¬à§‹à¦šà§à¦š ৭ দিন',
+'prefs-watchlist-days-max' => 'সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিন|দিন}}',
'prefs-watchlist-edits' => 'সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ নজর তালিকায় সরà§à¦¬à§‹à¦šà§à¦š সংখà§à¦¯à¦¾à¦° পরিবরà§à¦¤à¦¨ দেখানোর জনà§à¦¯:',
'prefs-watchlist-edits-max' => 'সরà§à¦¬à§‹à¦šà§à¦š নামà§à¦¬à¦¾à¦°: ১০০০',
'prefs-watchlist-token' => 'নজরতালিকা টোকেন:',
'prefs-misc' => 'বিবিধ',
'prefs-resetpass' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
+'prefs-changeemail' => 'ই-মেইল পরিবরà§à¦¤à¦¨',
+'prefs-setemail' => 'à¦à¦•à¦Ÿà¦¿ ই-মেইল ঠিকানা নিরà§à¦§à¦¾à¦°à¦£ করà§à¦¨',
'prefs-email' => 'ই-মেইল অপশন',
'prefs-rendering' => 'অবয়ব',
'saveprefs' => 'সংরকà§à¦·à¦£',
@@ -1225,7 +1234,6 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'right-patrol' => 'অনà§à¦¯à§‡à¦° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পরীকà§à¦·à¦¿à¦¤ বলে চিহà§à¦¨à¦¿à¦¤ করো',
'right-patrolmarks' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡à¦° পরীকà§à¦·à¦¿à¦¤ চিহà§à¦¨ দেখাও',
'right-unwatchedpages' => 'নজরতালিকা বহিরà§à¦­à§‚ত পাতাগà§à¦²à¦¿à¦° তালিকা দেখাও',
-'right-trackback' => 'à¦à¦•à¦Ÿà¦¿ টà§à¦°à§à¦¯à¦¾à¦•à¦¬à§à¦¯à¦¾à¦• জমা দিন',
'right-mergehistory' => 'পাতার ইতিহাস à¦à¦•à§€à¦•à¦°à¦£ করà§à¦¨à¥¤',
'right-userrights' => 'সকল বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
'right-userrights-interwiki' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯ উইকির বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° অধিকারসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨à¥¤',
@@ -1267,10 +1275,10 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'action-patrol' => 'অনà§à¦¯à¦¦à§‡à¦° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পরীকà§à¦·à¦¿à¦¤ বলে চিহà§à¦¨à¦¿à¦¤ করো',
'action-autopatrol' => 'পরীকà§à¦·à¦¿à¦¤ বলে চিহà§à¦¨à¦¿à¦¤ কি আপনি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করেছেন',
'action-unwatchedpages' => 'নজরতালিকা বহিরà§à¦­à§‚ত পাতাগà§à¦²à¦¿à¦° তালিকা দেখাও',
-'action-trackback' => 'à¦à¦•à¦Ÿà¦¿ টà§à¦°à§à¦¯à¦¾à¦•à¦¬à§à¦¯à¦¾à¦• জমা দিন',
'action-mergehistory' => 'à¦à¦‡ পাতার ইতিহাস à¦à¦•à¦¤à§à¦°à¦¿à¦¤ করà§à¦¨',
'action-userrights' => 'সকল বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অধিকার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
'action-userrights-interwiki' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯ উইকির বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° অধিকারসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
+'action-sendemail' => 'ই-মেইল পাঠাও',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|পরিবরà§à¦¤à¦¨|পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ}}',
@@ -1426,6 +1434,9 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'upload-unknown-size' => 'অজানা আকার',
'upload-http-error' => 'à¦à¦•à¦Ÿà¦¿ à¦à¦‡à¦šà¦Ÿà¦¿à¦Ÿà¦¿à¦ªà¦¿ তà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে: $1',
+# File backend
+'backend-fail-delete' => '$1 ফাইলটি অপসারণ সমà§à¦­à¦¬ নয়।',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ফাইলটির জিপ পরীকà§à¦·à¦¾ করার সময় à¦à¦•à¦Ÿà¦¿ তà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে।',
'zip-wrong-format' => 'চিহà§à¦¨à¦¿à¦¤ ফাইলটি কোনো জিপ ফাইল নয়।',
@@ -1649,7 +1660,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'listusers-editsonly' => 'শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦®à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° দেখাও যাদের অবদান আছে',
'listusers-creationsort' => 'তৈরির তারিখ অনà§à¦¸à¦¾à¦°à§‡ সাজাও',
'usereditcount' => '$1 {{PLURAL:$1|সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}}',
-'usercreated' => 'তৈরি হয়েছে $1 তারিখে, সময়: $2',
+'usercreated' => 'লিঙà§à¦—: $3 তৈরি হয়েছে $1 তারিখে, সময়: $2',
'newpages' => 'নতà§à¦¨ পাতাসমূহ',
'newpages-username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
'ancientpages' => 'পà§à¦°à¦¾à¦¨à§‹ নিবনà§à¦§',
@@ -1736,12 +1747,8 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'activeusers-noresult' => 'কোনো বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পাওয়া যায়নি।',
# Special:Log/newusers
-'newuserlogpage' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
-'newuserlogpagetext' => 'à¦à¦Ÿà¦¿ নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
-'newuserlog-byemail' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ ইমেইলের মাধà§à¦¯à¦®à§‡ পাঠানো হয়েছে',
-'newuserlog-create-entry' => 'নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€',
-'newuserlog-create2-entry' => '$1 নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ করা হয়েছে',
-'newuserlog-autocreate-entry' => 'সয়ংকà§à¦°à¦¿à¦¯à¦¼ ভাবে অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি হয়েছে',
+'newuserlogpage' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
+'newuserlogpagetext' => 'à¦à¦Ÿà¦¿ নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
# Special:ListGroupRights
'listgrouprights' => 'দলগত বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার',
@@ -1762,7 +1769,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'emailpagetext' => 'আপনি নিচের ফরà§à¦®à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ à¦à¦•à¦Ÿà¦¿ ই-মেইল পাঠাতে পারেন।
আপনি [[Special:Preferences|আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পছনà§à¦¦à§‡]] যে ই-মেইল ঠিকানাটি পà§à¦°à¦¬à§‡à¦¶ করিয়েছেন সেটিকে ই-মেইলের পà§à¦°à§‡à¦°à¦• হিসেবে দেখানো হবে, যেনো মেইলের পà§à¦°à¦¾à¦ªà¦• আপনাকে উতà§à¦¤à¦° দিতে পারেন।',
'usermailererror' => 'মেইল অবজেকà§à¦Ÿ তà§à¦°à§à¦Ÿà¦¿ পাঠিয়েছে:',
-'defemailsubject' => '{{SITENAME}} ই-মেইল',
+'defemailsubject' => '{{SITENAME}} বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ "$1" পà§à¦°à§‡à¦°à¦¿à¦¤ ইমেইল',
'usermaildisabled' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ ই-মেইল নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼',
'noemailtitle' => 'ই-মেইল ঠিকানা নেই',
'noemailtext' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ কোন বৈধ ই-মেইল ঠিকানা জানাননি।',
@@ -1817,7 +1824,7 @@ $3-à¦à¦° দেয়া কারণ হল ''$2''",
'watchmethod-list' => 'নজরে রাখা পাতাগà§à¦²à¦¿à¦¤à§‡ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨ পরীকà§à¦·à¦¾ করা হচà§à¦›à§‡',
'watchlistcontains' => 'আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।',
'iteminvalidname' => "'$1'নং আইটেমে সমসà§à¦¯à¦¾, অবৈধ নাম...",
-'wlnote' => "নিচে বিগত {{PLURAL:$2|১ ঘনà§à¦Ÿà¦¾à¦¯à¦¼|'''$2''' ঘনà§à¦Ÿà¦¾à¦¯à¦¼}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবরà§à¦¤à¦¨|শেষ '''$1'''টি পরিবরà§à¦¤à¦¨}} দেখানো হল।",
+'wlnote' => "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘনà§à¦Ÿà¦¾à¦¯à¦¼|'''$2''' ঘনà§à¦Ÿà¦¾à¦¯à¦¼}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবরà§à¦¤à¦¨|শেষ '''$1'''টি পরিবরà§à¦¤à¦¨}} দেখানো হল।",
'wlshowlast' => 'দেখাও সরà§à¦¬à¦¶à§‡à¦· $1 ঘনà§à¦Ÿà¦¾ $2 দিন $3',
'watchlist-options' => 'নজর তালিকা পছনà§à¦¦à¦¸à¦®à§‚হ',
@@ -1882,8 +1889,6 @@ $UNWATCHURL
'actioncomplete' => 'কাজটি নিষà§à¦ªà¦¨à§à¦¨ হয়েছে',
'actionfailed' => 'অà§à¦¯à¦¾à¦•à¦¶à¦¨ বà§à¦¯à¦°à§à¦¥',
'deletedtext' => '"$1" মà§à¦›à§‡ ফেলা হয়েছে। সামà§à¦ªà§à¦°à¦¤à¦¿à¦• মà§à¦›à§‡ ফেলার ঘটনাগà§à¦²à§‹ $2-ঠদেখà§à¦¨à¥¤',
-'deletedarticle' => '"[[$1]]" মà§à¦›à§‡ ফেলেছেন',
-'suppressedarticle' => '"[[$1]]" অপসারিত',
'dellogpage' => 'পাতা অবলà§à¦ªà§à¦¤à¦¿ লগ',
'dellogpagetext' => 'নিচে সবচেয়ে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• অবলà§à¦ªà§à¦¤à¦¿à¦—à§à¦²à§‹à¦° à¦à¦•à¦¾à¦Ÿà¦¿ তালিকা দেওয়া হল।',
'deletionlog' => 'পাতা অবলà§à¦ªà§à¦¤à¦¿ লগ',
@@ -2003,7 +2008,6 @@ $UNWATCHURL
'undeletereset' => 'আদি অবসà§à¦¥à¦¾à¦¯à¦¼ ফেরত',
'undeleteinvert' => 'বà§à¦¯à§à¦¤à§à¦•à§à¦°à¦®à§‡ নিরà§à¦¬à¦¾à¦šà¦¨',
'undeletecomment' => 'কারণ:',
-'undeletedarticle' => '"[[$1]]"-কে পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফেরত নেওয়া হয়েছে',
'undeletedrevisions' => '{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে',
'undeletedrevisions-files' => '{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} à¦à¦¬à¦‚ {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে',
'undeletedfiles' => '{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে',
@@ -2012,6 +2016,7 @@ $UNWATCHURL
সামà§à¦ªà§à¦°à¦¤à¦¿à¦• মà§à¦›à§‡ ফেলা ও পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦°à§‡à¦° ঘটনাগà§à¦²à¦¿à¦° জনà§à¦¯ [[Special:Log/delete|অবলà§à¦ªà§à¦¤à¦¿ লগ]] দেখà§à¦¨à¥¤",
'undelete-header' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• সময়ে মà§à¦›à§‡ ফেলা পাতাগà§à¦²à¦¿ দেখতে [[Special:Log/delete|অবলà§à¦ªà§à¦¤à¦¿ লগ]] দেখà§à¦¨à¥¤',
+'undelete-search-title' => 'অপসারিত পাতা অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করো',
'undelete-search-box' => 'অপসারিত পাতা অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করো',
'undelete-search-prefix' => 'à¦à¦‡ অকà§à¦·à¦° দিয়ে শà§à¦°à§ হওয়া পাতাগà§à¦²à¦¿ দেখানো হোক:',
'undelete-search-submit' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
@@ -2159,6 +2164,7 @@ $1',
'unblocklink' => 'বাধা তà§à¦²à§‡ নেওয়া হোক',
'change-blocklink' => 'বà§à¦²à¦• অবসà§à¦¥à¦¾à¦° পরিবরà§à¦¤à¦¨ করà§à¦¨',
'contribslink' => 'অবদান',
+'emaillink' => 'ই-মেইল পাঠাও',
'autoblocker' => 'আপনাকে সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ বাধা দেওয়া হয়েছে, কারণ আপনার আইপি ঠিকানাটি সমà§à¦ªà§à¦°à¦¤à¦¿ "[[User:$1|$1]]" বà§à¦¯à¦¬à¦¹à¦¾à¦° করেছেন। $1-কে বাধাদানের কারণ: "$2"',
'blocklogpage' => 'বাধা দানের লগ',
'blocklog-showlog' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ পূরà§à¦¬à§‡à¦“ বাধা পà§à¦°à¦¦à¦¾à¦¨ করা হয়েছিলো।
@@ -2209,9 +2215,9 @@ $1',
'databasenotlocked' => 'ডাটাবেজ বনà§à¦§ নয়।',
# Move page
-'move-page' => '$1 সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°',
-'move-page-legend' => 'পাতাটি সরিয়ে ফেলà§à¦¨',
-'movepagetext' => "নিচের ফরà§à¦®à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে à¦à¦•à¦Ÿà¦¿ পাতার শিরোনাম পরিবরà§à¦¤à¦¨ করা যাবে, à¦à¦¬à¦‚ সেই সাথে নতà§à¦¨ শিরোনামে à¦à¦° সমগà§à¦° ইতিহাস সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা যাবে।
+'move-page' => '$1 সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°',
+'move-page-legend' => 'পাতাটি সরিয়ে ফেলà§à¦¨',
+'movepagetext' => "নিচের ফরà§à¦®à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে à¦à¦•à¦Ÿà¦¿ পাতার শিরোনাম পরিবরà§à¦¤à¦¨ করা যাবে, à¦à¦¬à¦‚ সেই সাথে নতà§à¦¨ শিরোনামে à¦à¦° সমগà§à¦° ইতিহাস সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা যাবে।
পà§à¦°à¦¨à§‹ শিরোনামটি নতà§à¦¨ শিরোনামটির পà§à¦°à¦¤à¦¿ à¦à¦•à¦Ÿà¦¿ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ ধারণ করবে।
যেসমসà§à¦¤ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ পà§à¦°à¦¨à§‹ শিরোনামটির দিকে নিরà§à¦¦à§‡à¦¶ করছিল, সেগà§à¦²à¦¿ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ হালনাগাদ করতে পারবেন।
যদি তা না চান, তবে [[Special:DoubleRedirects|দà§à¦¬à¦¿-পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾]] বা [[Special:BrokenRedirects|অচল পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦—à§à¦²à¦¿]] পরীকà§à¦·à¦¾ করে দেখতে ভà§à¦²à¦¬à§‡à¦¨ না।
@@ -2222,50 +2228,47 @@ $1',
'''সতরà§à¦•à§€à¦•à¦°à¦£!'''
কোন জনপà§à¦°à¦¿à¦¯à¦¼ পাতার কà§à¦·à§‡à¦¤à§à¦°à§‡ à¦à¦‡ পরিবরà§à¦¤à¦¨à¦Ÿà¦¿ খà§à¦¬à¦‡ আকসà§à¦®à¦¿à¦• হতে পারে; অগà§à¦°à¦¸à¦° হবার আগে à¦à¦‡ কাজটির ফলাফল কী হতে পারে, সে বà§à¦¯à¦¾à¦ªà¦¾à¦°à§‡ অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ হোন।",
-'movepagetalktext' => "পাতাটির সাথে সাথে সংশà§à¦²à¦¿à¦·à§à¦Ÿ আলোচনা পাতাটিও সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ সরানো হবে '''যদি না:'''
+'movepagetalktext' => "পাতাটির সাথে সাথে সংশà§à¦²à¦¿à¦·à§à¦Ÿ আলোচনা পাতাটিও সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ সরানো হবে '''যদি না:'''
*খালি নয় à¦à¦®à¦¨ à¦à¦•à¦Ÿà¦¿ আলাপ পাতা নতà§à¦¨ শিরোনামটির অধীনে ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨ থাকে, অথবা
*আপনি নিচের বাকà§à¦¸à¦Ÿà¦¿ থেকে টিক সরিয়ে নিতে পারেন।
à¦à¦¸à¦¬ কà§à¦·à§‡à¦¤à§à¦°à§‡ আপনি চাইলে নিজের হাতে পাতাটিকে সরাতে বা à¦à¦•à¦¤à§à¦°à§€à¦•à¦°à¦£ করতে পারেন।",
-'movearticle' => 'যে পাতা সরিয়ে ফেলা হবে',
-'movenologin' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ পà§à¦°à¦¬à§‡à¦¶ করা হয়নি',
-'movenologintext' => 'কোন পাতা সরিয়ে ফেলতে চাইলে আপনাকে অবশà§à¦¯à¦‡ à¦à¦•à¦œà¦¨ নিবনà§à¦§à¦¿à¦¤ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ হতে হবে ও অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ [[Special:UserLogin|পà§à¦°à¦¬à§‡à¦¶]] করতে হবে।',
-'movenotallowed' => 'আপনার {{SITENAME}}-তে পাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ নেই।',
-'movenotallowedfile' => 'আপনার à¦à¦‡ ফাইলটি সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ নেই।',
-'cant-move-user-page' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পাতা (উপপাতা থেকে পৃথক) সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° আপনার অনà§à¦®à¦¤à¦¿ নেই।',
-'newtitle' => 'à¦à¦‡ নতà§à¦¨ শিরোনামে',
-'move-watch' => 'à¦à¦‡ পাতাটি নজরে রাখà§à¦¨',
-'movepagebtn' => 'পাতা সরান',
-'pagemovedsub' => 'সরিয়ে নেওয়া হয়েছে',
-'movepage-moved' => '\'\'\'"$1"-কে "$2" শিরোনামে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা হয়েছে\'\'\'',
-'movepage-moved-redirect' => 'à¦à¦•à¦Ÿà¦¿ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ তৈরি হয়েছে।',
-'articleexists' => 'হয় à¦à¦‡ শিরোনামের à¦à¦•à¦Ÿà¦¿ নিবনà§à¦§ ইতোমধà§à¦¯à§‡ সৃষà§à¦Ÿà¦¿ হযে গেছে, অথবা আপনি যে শিরোনামটি পছনà§à¦¦ করেছেন তা গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়। দয়া করে অনà§à¦¯ à¦à¦•à¦Ÿà¦¿ শিরোনাম দিয়ে চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
-'cantmove-titleprotected' => 'আপনি à¦à¦‡ অবসà§à¦¥à¦¾à¦¨à§‡ পাতাটিকে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করতে পারেন না, কারণ à¦à¦‡ নতà§à¦¨ শিরোনামটি সৃষà§à¦Ÿà¦¿ করা থেকে সà§à¦°à¦•à§à¦·à¦¿à¦¤à¥¤',
-'talkexists' => "'''পাতাটি সফলভাবে সরানো গেলেও আলোচনা পাতাটিকে সরানো যায়নি, কারণ নতà§à¦¨ শিরোনামের অধীনে ইতিমধà§à¦¯à§‡à¦‡ à¦à¦•à¦Ÿà¦¿ আলোচনা পাতা বিদà§à¦¯à¦®à¦¾à¦¨à¥¤ অনà§à¦—à§à¦°à¦¹ নিজের হাতে à¦à¦—à§à¦²à¦¿à¦•à§‡ à¦à¦•à¦¤à§à¦° করà§à¦¨à¥¤'''",
-'movedto' => 'সরানো হয়েছে à¦à¦–ানে:',
-'movetalk' => 'সংশà§à¦²à¦¿à¦·à§à¦Ÿ আলাপের পাতা সরিয়ে নাও',
-'move-subpages' => 'উপপাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° ($1টি পরà§à¦¯à¦¨à§à¦¤)',
-'move-talk-subpages' => 'উপপাতার আলাপ পাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° ($1টি পরà§à¦¯à¦¨à§à¦¤)',
-'movepage-page-exists' => '$1 পাতাটি ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨ à¦à¦¬à¦‚ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ পà§à¦¨à¦°à§à¦²à¦¿à¦–ন করা সমà§à¦­à¦¬ নয়।',
-'movepage-page-moved' => '$1 পাতাটি $2 পাতায় সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা হয়েছে।',
-'movepage-page-unmoved' => '$1 পাতাটি $2 -ঠসরিয়ে নেওয়া সমà§à¦­à¦ªà¦° নয়।',
-'1movedto2' => '[[$1]]-কে [[$2]]-ঠসরিয়ে নেওয়া হয়েছে',
-'1movedto2_redir' => '[[$1]]-কে [[$2]]-তে পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° সাহাযà§à¦¯à§‡ সরিয়ে নেওয়া হয়েছে',
-'move-redirect-suppressed' => 'পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ অপসারণ',
-'movelogpage' => 'পাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° লগ',
-'movelogpagetext' => 'সরানো পাতাগà§à¦²à¦¿à¦° à¦à¦•à¦Ÿà¦¿ তালিকা নিচে দেয়া হল।',
-'movenosubpage' => 'à¦à¦‡ পাতাটির কোনো উপপাতা নেই।',
-'movereason' => 'কারণ:',
-'revertmove' => 'পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফেরত নেওয়া হোক',
-'delete_and_move' => 'মà§à¦›à§‡ ফেলা হোক ও সরানো হোক',
-'delete_and_move_text' => '==মà§à¦›à§‡ ফেলা আবশà§à¦¯à¦•==
+'movearticle' => 'যে পাতা সরিয়ে ফেলা হবে',
+'movenologin' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ পà§à¦°à¦¬à§‡à¦¶ করা হয়নি',
+'movenologintext' => 'কোন পাতা সরিয়ে ফেলতে চাইলে আপনাকে অবশà§à¦¯à¦‡ à¦à¦•à¦œà¦¨ নিবনà§à¦§à¦¿à¦¤ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ হতে হবে ও অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ [[Special:UserLogin|পà§à¦°à¦¬à§‡à¦¶]] করতে হবে।',
+'movenotallowed' => 'আপনার {{SITENAME}}-তে পাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ নেই।',
+'movenotallowedfile' => 'আপনার à¦à¦‡ ফাইলটি সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° অনà§à¦®à¦¤à¦¿ নেই।',
+'cant-move-user-page' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পাতা (উপপাতা থেকে পৃথক) সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° আপনার অনà§à¦®à¦¤à¦¿ নেই।',
+'newtitle' => 'à¦à¦‡ নতà§à¦¨ শিরোনামে',
+'move-watch' => 'à¦à¦‡ পাতাটি নজরে রাখà§à¦¨',
+'movepagebtn' => 'পাতা সরান',
+'pagemovedsub' => 'সরিয়ে নেওয়া হয়েছে',
+'movepage-moved' => '\'\'\'"$1"-কে "$2" শিরোনামে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা হয়েছে\'\'\'',
+'movepage-moved-redirect' => 'à¦à¦•à¦Ÿà¦¿ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ তৈরি হয়েছে।',
+'articleexists' => 'হয় à¦à¦‡ শিরোনামের à¦à¦•à¦Ÿà¦¿ নিবনà§à¦§ ইতোমধà§à¦¯à§‡ সৃষà§à¦Ÿà¦¿ হযে গেছে, অথবা আপনি যে শিরোনামটি পছনà§à¦¦ করেছেন তা গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়। দয়া করে অনà§à¦¯ à¦à¦•à¦Ÿà¦¿ শিরোনাম দিয়ে চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
+'cantmove-titleprotected' => 'আপনি à¦à¦‡ অবসà§à¦¥à¦¾à¦¨à§‡ পাতাটিকে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করতে পারেন না, কারণ à¦à¦‡ নতà§à¦¨ শিরোনামটি সৃষà§à¦Ÿà¦¿ করা থেকে সà§à¦°à¦•à§à¦·à¦¿à¦¤à¥¤',
+'talkexists' => "'''পাতাটি সফলভাবে সরানো গেলেও আলোচনা পাতাটিকে সরানো যায়নি, কারণ নতà§à¦¨ শিরোনামের অধীনে ইতিমধà§à¦¯à§‡à¦‡ à¦à¦•à¦Ÿà¦¿ আলোচনা পাতা বিদà§à¦¯à¦®à¦¾à¦¨à¥¤ অনà§à¦—à§à¦°à¦¹ নিজের হাতে à¦à¦—à§à¦²à¦¿à¦•à§‡ à¦à¦•à¦¤à§à¦° করà§à¦¨à¥¤'''",
+'movedto' => 'সরানো হয়েছে à¦à¦–ানে:',
+'movetalk' => 'সংশà§à¦²à¦¿à¦·à§à¦Ÿ আলাপের পাতা সরিয়ে নাও',
+'move-subpages' => 'উপপাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° ($1টি পরà§à¦¯à¦¨à§à¦¤)',
+'move-talk-subpages' => 'উপপাতার আলাপ পাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° ($1টি পরà§à¦¯à¦¨à§à¦¤)',
+'movepage-page-exists' => '$1 পাতাটি ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨ à¦à¦¬à¦‚ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ পà§à¦¨à¦°à§à¦²à¦¿à¦–ন করা সমà§à¦­à¦¬ নয়।',
+'movepage-page-moved' => '$1 পাতাটি $2 পাতায় সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা হয়েছে।',
+'movepage-page-unmoved' => '$1 পাতাটি $2 -ঠসরিয়ে নেওয়া সমà§à¦­à¦ªà¦° নয়।',
+'movelogpage' => 'পাতা সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° লগ',
+'movelogpagetext' => 'সরানো পাতাগà§à¦²à¦¿à¦° à¦à¦•à¦Ÿà¦¿ তালিকা নিচে দেয়া হল।',
+'movenosubpage' => 'à¦à¦‡ পাতাটির কোনো উপপাতা নেই।',
+'movereason' => 'কারণ:',
+'revertmove' => 'পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফেরত নেওয়া হোক',
+'delete_and_move' => 'মà§à¦›à§‡ ফেলা হোক ও সরানো হোক',
+'delete_and_move_text' => '==মà§à¦›à§‡ ফেলা আবশà§à¦¯à¦•==
"[[:$1]]" শিরোনামের গনà§à¦¤à¦¬à§à¦¯ পাতাটি ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤ আপনি কি সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° সফল করার জনà§à¦¯ পাতাটি মà§à¦›à§‡ দিতে চান?',
-'delete_and_move_confirm' => 'হà§à¦¯à¦¾à¦, পাতাটি মà§à¦›à§‡ ফেলা হোক',
-'delete_and_move_reason' => 'সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° সà§à¦¬à¦¾à¦°à§à¦¥à§‡ মà§à¦›à§‡ ফেলা হয়েছে',
-'selfmove' => 'উৎস ও গনà§à¦¤à¦¬à§à¦¯ পাতা à¦à¦•à¦‡ শিরোনামের; কোন পাতা à¦à¦•à¦‡ শিরোনামের আরেক পাতায় সরানো যাবে না।',
-'immobile-source-page' => 'à¦à¦‡ পাতাটির সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° সমà§à¦­à¦¬ নয়।',
-'immobile-target-page' => 'গনà§à¦¤à¦¬à§à¦¯ শিরোনামে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা যাবে না।',
+'delete_and_move_confirm' => 'হà§à¦¯à¦¾à¦, পাতাটি মà§à¦›à§‡ ফেলা হোক',
+'delete_and_move_reason' => '"[[$1]]" থেকে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°à§‡à¦° সà§à¦¬à¦¾à¦°à§à¦¥à§‡ মà§à¦›à§‡ ফেলা হয়েছে',
+'selfmove' => 'উৎস ও গনà§à¦¤à¦¬à§à¦¯ পাতা à¦à¦•à¦‡ শিরোনামের; কোন পাতা à¦à¦•à¦‡ শিরোনামের আরেক পাতায় সরানো যাবে না।',
+'immobile-source-page' => 'à¦à¦‡ পাতাটির সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° সমà§à¦­à¦¬ নয়।',
+'immobile-target-page' => 'গনà§à¦¤à¦¬à§à¦¯ শিরোনামে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করা যাবে না।',
# Export
'export' => 'পাতা রপà§à¦¤à¦¾à¦¨à¦¿',
@@ -2464,9 +2467,6 @@ $1',
# Patrol log
'patrol-log-page' => 'পরীকà§à¦·à¦£ লগ',
-'patrol-log-line' => '$2 গà§à¦²à§‹à¦° $1 কে পরীকà§à¦·à¦¿à¦¤ বলে চিহà§à¦¨à¦¿à¦¤ করা হয়েছে $3',
-'patrol-log-auto' => '(সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼)',
-'patrol-log-diff' => 'সংশোধন $1',
'log-show-hide-patrol' => '$1 পরীকà§à¦·à¦£ লগ',
# Image deletion
@@ -2491,7 +2491,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$1|পাতাট|পাতাগà§à¦²à§‹}}',
'file-info' => 'ফাইলের আকার: $1, MIME ধরণ: $2',
'file-info-size' => '$1 × $2 pixel, ফাইলের আকার: $3, MIME ধরণ: $4',
-'file-nohires' => '<small>à¦à¦° চেয়ে বেশি রেজোলিউশন লভà§à¦¯ নয়।</small>',
+'file-nohires' => 'à¦à¦° চেয়ে বেশি রেজোলিউশন লভà§à¦¯ নয়।',
'svg-long-desc' => 'SVG ফাইল, সাধারণত $1 × $2 pixels, ফাইলের আকার: $3',
'show-big-image' => 'পূরà§à¦£ রেজোলিউশন',
'file-info-gif-looped' => 'লà§à¦ªà¦•à§ƒà¦¤',
@@ -2512,6 +2512,13 @@ $1',
'bydate' => 'তারিখ অনà§à¦¯à¦¾à¦¯à¦¼à§€',
'sp-newimages-showfrom' => '$2, $1 à¦à¦° পরের নতà§à¦¨ ছবিগà§à¦²à§‹ দেখাও',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 সেকেনà§à¦¡|$1 সেকেনà§à¦¡}}',
+'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
+'hours' => '{{PLURAL:$1|$1 ঘণà§à¦Ÿà¦¾|$1 ঘণà§à¦Ÿà¦¾}}',
+'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'ago' => '$1 আগে',
+
# Bad image list
'bad_image_list' => 'ফরমà§à¦¯à¦¾à¦Ÿà¦Ÿà¦¿ à¦à¦°à¦•à¦®:
@@ -2955,13 +2962,6 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'scarytranscludefailed' => '[$1 à¦à¦° জনà§à¦¯ টেমà§à¦ªà¦²à§‡à¦Ÿ আনা অসফল হয়েছে]',
'scarytranscludetoolong' => '[URL অতিরিকà§à¦¤ দীরà§à¦˜]',
-# Trackbacks
-'trackbackbox' => 'অনà§à¦¸à¦°à¦£à¦•à¦¾à¦°à§€ সংযোগগà§à¦²à¦¿:<br />
-$1',
-'trackbackremove' => '([$1 অবলà§à¦ªà§à¦¤])',
-'trackbacklink' => 'অনà§à¦¸à¦°à¦£à¦•à¦¾à¦°à§€ সংযোগ',
-'trackbackdeleteok' => 'অনà§à¦¸à¦°à¦£à¦•à¦¾à¦°à§€ সংযোগটি সফলভাবে মà§à¦›à§‡ ফেলা হয়েছে।',
-
# Delete conflict
'deletedwhileediting' => "'''সতরà§à¦•à§€à¦•à¦°à¦£''': আপনি পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ শà§à¦°à§ করার পরে তা মà§à¦›à§‡ ফেলা হয়েছে!",
'confirmrecreate' => "আপনি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ শà§à¦°à§ করার পর বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ [[User:$1|$1]] ([[User talk:$1|আলাপ]]) à¦à¦‡ পাতাটি মà§à¦›à§‡ দিয়েছেন, নিচের কারণ দেখিয়ে:
@@ -3149,4 +3149,55 @@ $1',
'htmlform-reset' => 'পরিবরà§à¦¤à¦¨ বাতিল',
'htmlform-selectorother-other' => 'অনà§à¦¯',
+# New logging system
+'revdelete-restricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ পà§à¦°à¦¯à¦¼à§‹à¦— করো',
+'revdelete-unrestricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ তà§à¦²à§‡ নাও',
+'newuserlog-byemail' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ ইমেইলের মাধà§à¦¯à¦®à§‡ পাঠানো হয়েছে',
+
+# Feedback
+'feedback-subject' => 'বিষয়:',
+'feedback-message' => 'বারà§à¦¤à¦¾:',
+'feedback-cancel' => 'বাতিল',
+'feedback-submit' => 'পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ জমা',
+'feedback-adding' => 'পাতায় পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ যোগ করা হচà§à¦›à§‡...',
+'feedback-error1' => 'তà§à¦°à§à¦Ÿà¦¿: à¦à¦ªà¦¿à¦†à¦‡ থেকে অজানা ফলাফল à¦à¦¸à§‡à¦›à§‡',
+'feedback-error2' => 'তà§à¦°à§à¦Ÿà¦¿: সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বà§à¦¯à¦°à§à¦¥',
+'feedback-error3' => 'তà§à¦°à§à¦Ÿà¦¿: à¦à¦ªà¦¿à¦†à¦‡ থেকে কোন সাড়া নেই',
+
+# API errors
+'api-error-badaccess-groups' => 'আপনার à¦à¦‡ উইকিতে ফাইল আপলোডের অনà§à¦®à¦¤à¦¿ নেই।',
+'api-error-badtoken' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: অপà§à¦°à¦¯à§‹à¦œà§à¦¯ টোকেন।',
+'api-error-copyuploaddisabled' => 'à¦à¦‡ সারà§à¦­à¦¾à¦°à§‡ ইউআরà¦à¦²-à¦à¦° মাধà§à¦¯à¦®à§‡ আপলোড করার সà§à¦¬à¦¿à¦§à¦¾ নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।',
+'api-error-duplicate' => 'ইতোমধà§à¦¯à§‡ à¦à¦‡ সাইটে à¦à¦•à¦‡ রকমের কনà§à¦Ÿà§‡à¦Ÿ সমৃদà§à¦§ {{PLURAL:$1|[$2 অনà§à¦¯ ফাইল]|[$2 কিছৠঅনà§à¦¯ ফাইল]}} রয়েছে।',
+'api-error-duplicate-archive' => 'à¦à¦•à¦‡ নাম ও বিষয়বসà§à¦¤à§ বিশিষà§à¦Ÿ {{PLURAL:$1| [$2 অপর à¦à¦•à¦Ÿà¦¿ ফাইল]| [$2 কয়েকটি ফাইল]}} পূরà§à¦¬à§‡ à¦à¦‡ উইকিতে ছিলো, à¦à¦¬à¦‚ {{PLURAL:$1|সেটিকে|সেগà§à¦²à§‹à¦•à§‡}} অপসারণ করা হয়েছে।',
+'api-error-duplicate-archive-popup-title' => 'অনà§à¦²à¦¿à¦ªà¦¿ {{PLURAL:$1|ফাইল|ফাইল}} যা ইতমধà§à¦¯à§‡ অপসারণ করা হয়েছে',
+'api-error-duplicate-popup-title' => 'অনà§à¦²à¦¿à¦ªà¦¿ {{PLURAL:$1|ফাইল|ফাইল}}',
+'api-error-empty-file' => 'আপনার জমাদানকৃত ফাইলটি খালি।',
+'api-error-fetchfileerror' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: ফাইল নিয়ে আসার সময় কোনো সমসà§à¦¯à¦¾ হয়েছিলো।',
+'api-error-file-too-large' => 'আপনার জমাদানকৃত ফাইলটি অনেক বড়।',
+'api-error-filename-tooshort' => 'à¦à¦‡ ফাইল নামটি খà§à¦¬à¦‡ ছোট।',
+'api-error-filetype-banned' => 'à¦à¦‡ ধরনের ফাইল নিষিদà§à¦§à¥¤',
+'api-error-filetype-missing' => 'à¦à¦‡ ফাইলটির কোনো à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨ নেই।',
+'api-error-hookaborted' => 'যে পরিবরà§à¦¤à¦¨à¦Ÿà¦¿ আপনি করার চেষà§à¦Ÿà¦¾ করেছিলেন তা à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨ হà§à¦• দà§à¦¬à¦¾à¦°à¦¾ বাতিলকৃত হয়েছে।',
+'api-error-http' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: সারà§à¦­à¦¾à¦°à§‡ সংযোগ পà§à¦°à¦¦à¦¾à¦¨ করা সমà§à¦­à¦¬ হচà§à¦›à§‡ না।',
+'api-error-illegal-filename' => 'ফাইলের à¦à¦‡ নামটি গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়।',
+'api-error-internal-error' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: à¦à¦‡ উইকিতে আপনার আপলোড পà§à¦°à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾à¦•à¦°à¦£ করার সময় কোনো তà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে।',
+'api-error-invalid-file-key' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: অসà§à¦¥à¦¾à¦¯à¦¼à§€ সংরকà§à¦·à¦£à¦¶à¦¾à¦²à¦¾à¦¯à¦¼ ফাইলটি খà§à¦à¦œà§‡ পাওয়া যায়নি।',
+'api-error-missingparam' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: অনà§à¦°à§‹à¦§à§‡ কিছৠপà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦°à§‡à¦° ঘাটতি রয়েছে।',
+'api-error-missingresult' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: সফলভাবে অনà§à¦²à¦¿à¦ªà¦¿ করা হয়েছে কিনা তা নিশà§à¦šà¦¿à¦¤ করা সমà§à¦­à¦¬ হয়নি।',
+'api-error-mustbeloggedin' => 'ফাইল আপলোড করার জনà§à¦¯ আপনাকে অবশà§à¦¯à¦‡ à¦à¦‡ উইকিতে পà§à¦°à¦¬à§‡à¦¶ বা লগইন করতে হবে।',
+'api-error-mustbeposted' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: à¦à¦‡ অনà§à¦°à§‹à¦§à§‡à¦° জনà§à¦¯ à¦à¦‡à¦šà¦Ÿà¦¿à¦Ÿà¦¿à¦ªà¦¿ পোসà§à¦Ÿ পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨à¥¤',
+'api-error-noimageinfo' => 'আপলোড সফল হয়েছে, কিনà§à¦¤à§ ফাইলটি সমà§à¦ªà¦°à§à¦•à§‡ সারà§à¦­à¦¾à¦° কোন তথà§à¦¯ পà§à¦°à¦¦à¦¾à¦¨ করে নি।',
+'api-error-nomodule' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: কোন আপলোড মডিউল সেট করা হয়নি।',
+'api-error-ok-but-empty' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: সারà§à¦­à¦¾à¦° হতে কোন সাড়া পাওয়া যাচà§à¦›à§‡ না।',
+'api-error-overwrite' => 'ইতিমধà§à¦¯à§‡à¦‡ রয়েছে à¦à¦®à¦¨ কোনো ফাইলের পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়।',
+'api-error-stashfailed' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: সারà§à¦­à¦¾à¦° অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইলটি সংরকà§à¦·à¦£ করতে বà§à¦¯à¦°à§à¦¥ হয়েছে।',
+'api-error-timeout' => 'কাঙà§à¦–িত সময়ের মধà§à¦¯à§‡ সারà§à¦­à¦¾à¦°à§‡à¦° কোন সাড়া পাওয়া যায়নি।',
+'api-error-unclassified' => 'à¦à¦•à¦Ÿà¦¿ অজানা তà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে',
+'api-error-unknown-code' => 'অজানা তà§à¦°à§à¦Ÿà¦¿: "$1"',
+'api-error-unknown-error' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: আপনার ফাইলটি আপলোড করার সময় কিছৠসমসà§à¦¯à¦¾ হয়েছে।',
+'api-error-unknown-warning' => 'অজানা সতরà§à¦•à§€à¦•à¦°à¦£: $1',
+'api-error-uploaddisabled' => 'à¦à¦‡ উইকির জনà§à¦¯ আপলোড সà§à¦¬à¦¿à¦§à¦¾ নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।',
+'api-error-verification-error' => 'সমà§à¦­à¦¬à¦¤ à¦à¦‡ ফাইলটি তà§à¦°à§à¦Ÿà¦¿à¦ªà§‚রà§à¦£ অথবা à¦à¦° à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨à¦Ÿà¦¿ ভà§à¦²à¥¤',
+
);
diff --git a/languages/messages/MessagesBo.php b/languages/messages/MessagesBo.php
index 3a2f012d..ab936def 100644
--- a/languages/messages/MessagesBo.php
+++ b/languages/messages/MessagesBo.php
@@ -8,6 +8,7 @@
* @file
*
* @author Freeyak
+ * @author Jason (on bo.wikipedia.org)
*/
$digitTransformTable = array(
@@ -341,6 +342,14 @@ $messages = array(
'passwordreset-username' => 'སྤྱོད་མིང་à¼',
'passwordreset-email' => 'དྲ་འཕྲིན་à½à¼‹à½–ྱང་à¼',
+# Special:ChangeEmail
+'changeemail' => 'དྲ་འཕྲིན་à½à¼‹à½–ྱང་བརྗེ་བà¼',
+'changeemail-oldemail' => 'ད་ཡོད་དྲ་འཕྲིན་à½à¼‹à½–ྱང་à¼',
+'changeemail-newemail' => 'དྲ་འཕྲིན་à½à¼‹à½–ྱང་གསར་བà¼',
+'changeemail-none' => '(སྟོང་པà¼)',
+'changeemail-submit' => 'དྲ་འཕྲིན་བརྗེ་བà¼',
+'changeemail-cancel' => 'རྩིས་མེད་à½à½¼à½„སà¼',
+
# Edit page toolbar
'bold_sample' => 'ཡིག་གཟུགས་སྦོམ་པོà¼',
'bold_tip' => 'ཡིག་གཟུགས་སྦོམ་པོà¼',
@@ -359,37 +368,35 @@ $messages = array(
'hr_tip' => 'à½à½‘་à½à½²à½‚ ༼ཆུད་ཟོས་མེད་པརà¼à¼½',
# Edit pages
-'summary' => 'བསྡུས་དོནà¼:',
-'subject' => 'འགོ་བརྗོདà¼',
-'minoredit' => 'འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིནà¼',
-'watchthis' => 'དྲ་ངོས་འདི་ལ་གཟིགསà¼',
-'savearticle' => 'ཤོག་ངོས་ཉར་བà¼',
-'preview' => 'སྔོན་ལྟà¼',
-'showpreview' => 'སྔོན་ལྟ་སྟོན་ཅིག',
-'showlivepreview' => 'ད་ཡོད་སྔོན་ལྟà¼',
-'showdiff' => 'བཟོས་བཅོས་སྟོནà¼',
-'anoneditwarning' => "'''གསལ་བརྡà¼''' à½à¾±à½ºà½‘་à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་མི་འདུག à½à¾±à½ºà½‘་ཀྱི་ IP à½à¼‹à½–ྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུརà¼",
-'anonpreviewwarning' => '༼à½à¾±à½ºà½‘་རང་à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་མི་འདུག ཉར་ཚགས་ཀྱིས་à½à¾±à½ºà½‘་ཀྱི་ IP à½à¼‹à½–ྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུརà¼à¼½',
-'summary-preview' => 'བསྡུས་དོན་སྔོན་ལྟà¼',
-'subject-preview' => 'བརྗོད་གཞི་དང་འགོ་བརྗོད་སྔོན་ལྟà¼',
-'blockedtitle' => 'སྤྱོད་མི་བཀག་ཟིནà¼',
-'blockednoreason' => 'རྒྱུ་མཚན་བྱིན་མི་འདུག',
-'blockedoriginalsource' => "'''$1''' ཡི་à½à½´à½„ས་གཤམ་དུ་བསྟན་ཡོདà¼",
-'whitelistedittitle' => 'ནང་འཛུལ་བཟོ་བཅོས་བྱེད་དགོསà¼',
-'whitelistedittext' => 'ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ངེས་པར་དུ་$1བྱ་དགོསà¼',
-'loginreqtitle' => 'ནང་འཛུལ་བྱ་དགོསà¼',
-'loginreqlink' => 'ནང་འཛུལ་',
-'loginreqpagetext' => 'ཤོག་ངོས་གཞན་རྣམས་ལྟ་བར་ངེས་པར་དུ་$1བྱ་དགོསà¼',
-'accmailtitle' => 'ལམ་ཡིག་བà½à½„་ཟིནà¼',
-'newarticle' => '(གསར་བ)',
-'previewnote' => '༼འདི་ནི་སྔོན་ལྟ་ཙམ་ཡིན་པ་མ་བརྗེདà¼à¼½ à½à¾±à½ºà½‘་ཀྱི་བཟོ་བཅོས་ད་དུང་ཉར་ཚགས་བྱས་མི་འདུག',
-'editing' => '$1རྩོམ་སྒྲིག་བྱེད་བཞིན་པà¼',
-'editingsection' => ' $1 (སྡེ་ཚན) ལ་རྩོམ་སྒྲིག་བྱེད་བཞིན་པà¼',
-'yourtext' => 'à½à¾±à½¼à½‘་ཀྱི་ཡིག་འབྲུà¼',
-'yourdiff' => 'མི་འདྲ་སà¼',
-'templatesused' => 'ཤོག་ངོས་འདིར་སྤྱད་པའི་ {{PLURAL:$1|དཔེ་པང་à¼|དཔེ་པང་à¼}}',
-'template-protected' => 'སྲུང་སà¾à¾±à½¼à½–་འོག་ཡོད་པà¼',
-'nocreate-loggedin' => 'ཤོག་ངོས་གསར་བཟོའི་ཆོག་མཆན་མི་འདུག',
+'summary' => 'བསྡུས་དོནà¼:',
+'subject' => 'འགོ་བརྗོདà¼',
+'minoredit' => 'འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིནà¼',
+'watchthis' => 'དྲ་ངོས་འདི་ལ་གཟིགསà¼',
+'savearticle' => 'ཤོག་ངོས་ཉར་བà¼',
+'preview' => 'སྔོན་ལྟà¼',
+'showpreview' => 'སྔོན་ལྟ་སྟོན་ཅིག',
+'showlivepreview' => 'ད་ཡོད་སྔོན་ལྟà¼',
+'showdiff' => 'བཟོས་བཅོས་སྟོནà¼',
+'anoneditwarning' => "'''གསལ་བརྡà¼''' à½à¾±à½ºà½‘་à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་མི་འདུག à½à¾±à½ºà½‘་ཀྱི་ IP à½à¼‹à½–ྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུརà¼",
+'anonpreviewwarning' => '༼à½à¾±à½ºà½‘་རང་à½à½¼à¼‹à½ à½›à½´à½£à¼‹à½–ྱས་མི་འདུག ཉར་ཚགས་ཀྱིས་à½à¾±à½ºà½‘་ཀྱི་ IP à½à¼‹à½–ྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུརà¼à¼½',
+'summary-preview' => 'བསྡུས་དོན་སྔོན་ལྟà¼',
+'subject-preview' => 'བརྗོད་གཞི་དང་འགོ་བརྗོད་སྔོན་ལྟà¼',
+'blockedtitle' => 'སྤྱོད་མི་བཀག་ཟིནà¼',
+'blockednoreason' => 'རྒྱུ་མཚན་བྱིན་མི་འདུག',
+'whitelistedittext' => 'ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ངེས་པར་དུ་$1བྱ་དགོསà¼',
+'loginreqtitle' => 'ནང་འཛུལ་བྱ་དགོསà¼',
+'loginreqlink' => 'ནང་འཛུལ་',
+'loginreqpagetext' => 'ཤོག་ངོས་གཞན་རྣམས་ལྟ་བར་ངེས་པར་དུ་$1བྱ་དགོསà¼',
+'accmailtitle' => 'ལམ་ཡིག་བà½à½„་ཟིནà¼',
+'newarticle' => '(གསར་བ)',
+'previewnote' => '༼འདི་ནི་སྔོན་ལྟ་ཙམ་ཡིན་པ་མ་བརྗེདà¼à¼½ à½à¾±à½ºà½‘་ཀྱི་བཟོ་བཅོས་ད་དུང་ཉར་ཚགས་བྱས་མི་འདུག',
+'editing' => '$1རྩོམ་སྒྲིག་བྱེད་བཞིན་པà¼',
+'editingsection' => ' $1 (སྡེ་ཚན) ལ་རྩོམ་སྒྲིག་བྱེད་བཞིན་པà¼',
+'yourtext' => 'à½à¾±à½¼à½‘་ཀྱི་ཡིག་འབྲུà¼',
+'yourdiff' => 'མི་འདྲ་སà¼',
+'templatesused' => 'ཤོག་ངོས་འདིར་སྤྱད་པའི་ {{PLURAL:$1|དཔེ་པང་à¼|དཔེ་པང་à¼}}',
+'template-protected' => 'སྲུང་སà¾à¾±à½¼à½–་འོག་ཡོད་པà¼',
+'nocreate-loggedin' => 'ཤོག་ངོས་གསར་བཟོའི་ཆོག་མཆན་མི་འདུག',
# History pages
'viewpagelogs' => 'ཤོག་ངོས་འདིའི་ཉིན་à½à½¼à¼‹à½£à¼‹à½£à¾Ÿà¼‹à½–à¼',
@@ -415,7 +422,6 @@ $messages = array(
'revdelete-radio-set' => 'ཡིནà¼',
'revdel-restore' => 'བཅོས་སུ་རུང་བà¼',
'pagehist' => 'ཤོག་ངོས་ལོ་རྒྱུསà¼',
-'revdelete-summary' => 'བསྡུས་དོན་བཟོ་བཅོསà¼',
'revdelete-reasonotherlist' => 'རྒྱུ་མཚན་གཞན་པà¼',
# History merging
@@ -472,9 +478,11 @@ $messages = array(
'prefs-personal' => 'སྤྱོད་མིའི་སྤྱི་à½à½¼à½‚',
'prefs-rc' => 'ཉེ་བའི་བཟོ་བཅོསà¼',
'prefs-watchlist' => 'མཉམ་འཇོག་à½à½¼à¼',
-'prefs-watchlist-days-max' => 'རིང་ཚད་ཉི་མ་ ༧ à¼',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'མང་ཚད་ཨང་གྲངས༠༡༠༠༠',
'prefs-resetpass' => 'ལམ་ཡིག་བརྗེ་བà¼',
+'prefs-changeemail' => 'དྲ་འཕྲིན་བརྗེ་བà¼',
+'prefs-setemail' => 'གློག་འཕྲིན་à½à¼‹à½–ྱང་སྒྲིག་པà¼',
'prefs-email' => 'གློག་འཕྲིན་འདེམས་ཚནà¼',
'saveprefs' => 'ཉར་བà¼',
'searchresultshead' => 'འཚོལà¼',
@@ -699,7 +707,6 @@ $messages = array(
'delete-legend' => 'སུབས་ཤིག',
'actioncomplete' => 'བྱ་འགུལ་ལེགས་གྲུབà¼',
'actionfailed' => 'བྱ་འགུལ་ཕམ་ཉེས་བྱུང་བà¼',
-'deletedarticle' => '"[[$1]]"བསུབས་ཟིནà¼',
'dellogpage' => 'རྩོམ་ཡིག་སུབ་དོརà¼',
'deletecomment' => 'རྒྱུ་མཚནà¼',
'deleteotherreason' => 'རྒྱུ་མཚན་གཞན་པའམ་འཕར་མà¼',
@@ -772,7 +779,6 @@ $messages = array(
'movepagebtn' => 'ཤོག་ངོས་སྤོ་བà¼',
'pagemovedsub' => 'སྤོར་བ་ལེགས་གྲུབà¼',
'movedto' => 'སྤོར་ཟིན་ཡུལà¼',
-'1movedto2' => '[[$1]][[$2]]ལ་སྤོར་ཟིནà¼',
'movelogpage' => 'རྩོམ་ཡིག་སྤོ་བà¼',
'movereason' => 'རྒྱུ་མཚནà¼',
'revertmove' => 'ཕྱིར་ལོག',
diff --git a/languages/messages/MessagesBpy.php b/languages/messages/MessagesBpy.php
index 553b51e0..f4cca571 100644
--- a/languages/messages/MessagesBpy.php
+++ b/languages/messages/MessagesBpy.php
@@ -405,15 +405,14 @@ $1',
à¦à¦¹à¦¾à¦¨ হয়ত আরাক আগই পà§à¦¸à§‡ বেলাসি সাত।',
'badtitle' => 'চিঙনাঙহান চà§à¦®à¦¨à¦¾à¦‡à¦¸à§‡ নাইসে।',
'badtitletext' => 'হেইচা করিসত পাতাহানর চিঙনাঙহান চà§à¦® নাইসে, খালি বা আর ঠার বা আনà§à¦¤à¦ƒà¦‰à¦‡à¦•à¦¿ চিঙনাঙ মিলাপ অসিল। হয়ত à¦à¦¹à¦¾à¦¨à¦¤ আক বারো গজে কোন আখর মিহিসে, যেতা চিঙনাঙে বরানি লালà§à¦‡à¦¸à§‡à¥¤',
-'perfcached' => 'তলর পৌ অতা কà§à¦¯à¦¾à¦¶à§‡à¦¤à§à¦¤ দেহাদেরতা অহানে হালনাগাদ না-ও ইতে পারে:',
-'perfcachedts' => 'তলর পৌ অতা কà§à¦¯à¦¾à¦¶à§‡à¦¤à§à¦¤ দেহাদেরতা বারো $1 তারিখে হালনাগাদ করানি ইসে।',
+'perfcached' => 'তলর পৌ অতা কà§à¦¯à¦¾à¦¶à§‡à¦¤à§à¦¤ দেহাদেরতা অহানে হালনাগাদ না-ও ইতে পারে: A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'তলর পৌ অতা কà§à¦¯à¦¾à¦¶à§‡à¦¤à§à¦¤ দেহাদেরতা বারো $1 তারিখে হালনাগাদ করানি ইসে। A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° হালনাগাদ বনà§à¦§ করানি অসে।
à¦à¦¹à¦¾à¦¨à¦¾à¦¤ থà§à§±à¦¾à¦¸à¦¿ পৌ ঠখেনà§à¦¤à¦¾à¦®à§‡ রিফà§à¦°à§‡à¦¶ করানি নাইব।',
'wrong_wfQuery_params' => 'wfQuery()-ত দিয়াসি পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦° অতা লালà§à¦‡à¦¸à§‡<br />
ফাংশন: $1<br />
কোয়েরি: $2',
'viewsource' => 'উৎসহান চা',
-'viewsourcefor' => '$1-র কা',
'actionthrottled' => 'কামর গতিহান তাপকরানি',
'actionthrottledtext' => 'সà§à¦ªà§à¦¯à¦¾à¦® থেত করানির কা কাম à¦à¦¹à¦¾à¦¨ কম মিকà§à¦ªà§‡ বপ করে পতানির সময়র সিমাহান লেপ করানি অসে। তি সীমা অহান লালà§à¦‡à¦²à§‡à¥¤ কৃপা করিয়া খানি থায়া হৎনা কর।',
'protectedpagetext' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° পতানি থেপকরিয়া থসি।',
@@ -520,6 +519,7 @@ $2',
'noemailprefs' => 'à¦à¦° বৈশিষà§à¦ à§à¦¯ à¦à¦¹à¦¾à¦¨ কাম করà§à¦¯à¦¼à¦¾à¦¨à¦¿ মনেইলে তরতা ই-মেইণ টিকানা আহান লেপকরানি লাগতই।',
'emailconfirmlink' => 'ইমেইল ঠিকানাহান লেপকর',
'invalidemailaddress' => 'à¦à¦°à§‡ ইমেইল ঠিকানাহান আমি ঙকà§à¦•à¦°à§‡ নà§à§±à¦¾à¦°à¦°à¦¾à¦‚, নিংকররাঙতা চà§à¦®à§à¦ªà¦¾ ফরমেটে নাইসে সাত। ফরমেটহান চà§à¦®à¦•à¦°à§‡ দে, নাইলে লেখার জাগাহান খালি কর।',
+'cannotchangeemail' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦° ইমেইল ঠিকানাহানি à¦à¦°à§‡ উইকিত সিলকরানি নাইব।',
'accountcreated' => 'à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨ হঙকরানি ইল',
'accountcreatedtext' => 'আতাকà§à¦°à¦¾ $1 -র কা à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨ হঙকরানি ইল।',
'createaccount-title' => '{{SITENAME}}-র কা অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ হঙকরানি',
@@ -555,6 +555,15 @@ $2',
'passwordreset-username' => 'আতাকà§à¦°à¦¾à¦° নাংহান:',
'passwordreset-domain' => 'ডমেইন:',
+# Special:ChangeEmail
+'changeemail' => 'ই-মেইল ঠিকানাহান সিলকর',
+'changeemail-header' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦° ই-মেইল ঠিকানাহান সিলকর',
+'changeemail-text' => 'ইমেইল ঠিকানাহান সিরকরানি মনেইলে ফরম à¦à¦¹à¦¾à¦¨ পà§à¦°à¦¨ কর। সিলপা à¦à¦¹à¦¾à¦¨ লেপকরতে তর খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— দেনা লাগতই।',
+'changeemail-no-info' => 'পাতা à¦à¦¹à¦¾à¦¨à¦¾à¦¤ হমিতে গেলেগা তি যেসারেউ লগইন করানি লাগতই।',
+'changeemail-none' => '(নেই)',
+'changeemail-submit' => 'ই-মেইল সিলকর',
+'changeemail-cancel' => 'বাতিল করেদে',
+
# Edit page toolbar
'bold_sample' => 'গাঢ়পা ৱাহি',
'bold_tip' => 'গাঢ়পা ৱাহি',
@@ -618,9 +627,6 @@ $2',
তর à¦à¦¬à¦¾à¦•à¦¾à¦° IP ঠিকানাহান ইলতাই $3, বারো থেপকরিসি IP আইডিগ ইলতাই $5।
যেপগাউ আঙকরানির সময়ত গজর পৌ অতা যেসারেউ বরিস।',
'blockednoreason' => 'কোন কারণ দেনা নাইসে',
-'blockedoriginalsource' => "'''$1'''র উৎসহান তলে দেখানি অইল:",
-'blockededitsource' => "'''$1'''ত '''তর পতাসত''' ইকা দেখাদেনা অইল:",
-'whitelistedittitle' => 'পতানির কা লগইন করানি লাগতই',
'whitelistedittext' => 'পাতাহান পতানিরকা $1 করানি লাগতই।',
'confirmedittext' => 'যেহানউ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করানির আগে তর ই-মেইল ঠিকানাহন যেসাদেউ লেপকরানি লাগতই। কৃপাকরিয়া তর ই-মেইল ঠিকানাহান [[Special:Preferences|আতাকà§à¦°à¦¾à¦° পছনতালিকা]]ত চà§à¦®à¦•à¦°à§‡ বরা।',
'nosuchsectiontitle' => 'অনà§à¦šà§à¦›à§‡à¦¦à¦¹à¦¾à¦¨ বিসারিয়া নাপেইলাঙ',
@@ -773,13 +779,6 @@ $2',
'revdel-restore' => 'দৃষà§à¦Ÿà¦¿à¦ªà¦¾à¦¤ সিলকর',
'pagehist' => 'পাতার ইতিহাসহান',
'deletedhist' => 'ইতিহাসহান পà§à¦¸',
-'revdelete-content' => 'বিষয়বসà§à¦¤à§',
-'revdelete-summary' => 'সারাংশ পতানি',
-'revdelete-uname' => 'আতাকà§à¦°à¦¾',
-'revdelete-restricted' => 'ডানà§à¦¡à¦¿à¦•à¦°à§‡à¦•à§à¦°à¦¾à¦—রাঙ সীমাবদà§à¦§à¦¤à¦¾à¦¹à¦¾à¦¨à¦¿ ফলা',
-'revdelete-unrestricted' => 'ডানà§à¦¡à¦¿à¦•à¦°à§‡à¦•à§à¦°à¦¾à¦—রাঙ সীমাবদà§à¦§à¦¤à¦¾à¦¹à¦¾à¦¨à¦¿ নেইকর',
-'revdelete-hid' => '$1 গà§à¦°',
-'revdelete-unhid' => '$1 নাগà§à¦°à¦¿',
'revdelete-otherreason' => 'আর আর কারণ:',
'revdelete-reasonotherlist' => 'আরাক কারণ',
'revdelete-edit-reasonlist' => 'থেইকরানির কারণহান পতা',
@@ -901,7 +900,7 @@ $2',
'prefs-datetime' => 'তারিখ বারো সময়',
'prefs-labs' => 'পরীকà§à¦·à¦¾à¦—ারর বৈশিষà§à¦Ÿà¦¹à¦¾à¦¨à¦¿',
'prefs-rc' => 'হাদি à¦à¦¹à¦¾à¦¨à¦° পতানি',
-'prefs-watchlist-days-max' => 'বপিলে ৭ দিন পেয়া',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-misc' => 'নানন',
'prefs-resetpass' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ সিলকর',
'prefs-email' => 'ই-মেইল অপশনহানি',
@@ -979,7 +978,6 @@ $2',
'action-delete' => 'পাতা à¦à¦¹à¦¾à¦¨ পà§à¦¸',
'action-browsearchive' => 'পà§à¦¸à¦¿à¦¸à¦¿ পাতা বিসারা',
'action-block' => 'পতাকà§à¦°à¦¾ à¦à¦—রে পতানি নাদি',
-'action-trackback' => 'আলথক টà§à¦°à¦¾à¦• সাবমিট কর',
'action-mergehistory' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° ইতাহাসহান সà§à¦ªà¦•à¦°à¦¿à¦•',
# Recent changes
@@ -1223,9 +1221,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'activeusers-noresult' => 'আতাকà§à¦°à¦¾ নাপেইলাং।',
# Special:Log/newusers
-'newuserlogpage' => 'আতাকà§à¦°à¦¾ হঙসে লগহানি',
-'newuserlog-byemail' => 'ই-মেইলর মা পেঠাদিয়াসি পাসৱারà§à¦¡à¦—',
-'newuserlog-create-entry' => 'নà§à§±à¦¾ আতাকà§à¦°à¦¾à¦° à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨',
+'newuserlogpage' => 'আতাকà§à¦°à¦¾ হঙসে লগহানি',
# Special:ListGroupRights
'listgrouprights-key' => '* <span class="listgrouprights-granted">য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ পাসে অধিকার</span>
@@ -1279,7 +1275,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'actioncomplete' => 'কামহান লমিল।',
'deletedtext' => '"$1" পà§à¦¸à¦¾à¦¨à¦¿ অইল।
চা $2 à¦à¦¹à¦¾à¦° বারে আগে আসে পà§à¦¸à¦¾à¦¨à¦¿à¦° লাতংগ।',
-'deletedarticle' => 'পà§à¦¸à¦¾à¦¨à¦¿à¦‡à¦² "[[$1]]"',
'dellogpage' => 'পà§à¦¸à¦¿à¦¸à¦¿à¦¤à¦¾à¦° লাতংগ',
'deletecomment' => 'কারণ:',
'deleteotherreason' => 'আরাক/উপরি কারন:',
@@ -1333,9 +1328,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'restriction-level-all' => 'যেকোন থাক',
# Undelete
-'undeletebtn' => 'বারোইতà§à¦•à¦°',
-'undeletelink' => 'চা/আলথক কর',
-'undeletedarticle' => '"[[$1]]"-রে আগর অঙতাত নেনা ইল',
+'undeletebtn' => 'বারোইতà§à¦•à¦°',
+'undeletelink' => 'চা/আলথক কর',
# Namespace form on various pages
'namespace' => 'নাঙরথাক:',
@@ -1450,8 +1444,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
দয়া করিয়া তি নিজর আতহানà§à¦¨ তিলকরগা।'''",
'movedto' => 'থেইকর',
'movetalk' => 'লগর য়à§à¦¯à¦¾à¦°à¦¿à¦° পাতাহান গà§à¦¸à¦¾',
-'1movedto2' => '[[$1]]-রে [[$2]]-ত গà§à¦¸à¦¾à¦¨à¦¿ ইল',
-'1movedto2_redir' => '[[$1]]-রে [[$2]]-ত বারো-রà§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° মা থেইকরানি ইল',
'movelogpage' => 'লগ গà§à¦¸à¦¾',
'movereason' => 'কারণ:',
'revertmove' => 'রিভারà§à¦Ÿ',
@@ -1558,7 +1550,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Media information
'file-info-size' => '$1 × $2 পিকà§à¦¸à§‡à¦², ফাইলর সাইজহান: $3, à¦à¦®à¦†à¦‡à¦à¦®à¦‡-র অংতা: $4',
-'file-nohires' => '<small>à¦à¦¹à¦¾à¦¤à§à¦¤ গজর রিজরিউশন নেই।</small>',
+'file-nohires' => 'à¦à¦¹à¦¾à¦¤à§à¦¤ গজর রিজরিউশন নেই।',
'svg-long-desc' => 'SVG ফাইল, সাধারনত $1 × $2 পিকà§à¦¸à§‡à¦², ফাইলর সাইজহান: $3',
'show-big-image' => 'পà§à¦²à§à¦²à¦¾à¦ª রিজলিউশন',
@@ -1708,4 +1700,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'htmlform-reset' => 'পতানিহান আলকর',
'htmlform-selectorother-other' => 'আরাক',
+# New logging system
+'revdelete-restricted' => 'ডানà§à¦¡à¦¿à¦•à¦°à§‡à¦•à§à¦°à¦¾à¦—রাঙ সীমাবদà§à¦§à¦¤à¦¾à¦¹à¦¾à¦¨à¦¿ ফলা',
+'revdelete-unrestricted' => 'ডানà§à¦¡à¦¿à¦•à¦°à§‡à¦•à§à¦°à¦¾à¦—রাঙ সীমাবদà§à¦§à¦¤à¦¾à¦¹à¦¾à¦¨à¦¿ নেইকর',
+'newuserlog-byemail' => 'ই-মেইলর মা পেঠাদিয়াসি পাসৱারà§à¦¡à¦—',
+
);
diff --git a/languages/messages/MessagesBqi.php b/languages/messages/MessagesBqi.php
index 24a19057..9fcc7819 100644
--- a/languages/messages/MessagesBqi.php
+++ b/languages/messages/MessagesBqi.php
@@ -252,7 +252,6 @@ $1',
'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرسته
Ùˆ ممکنه دارای یک یا چند کاراکتر بوه Ú©Ù‡ در عنوان مربوط نوا زش استÙاده کنین',
'viewsource' => 'مشاهده منبع',
-'viewsourcefor' => 'سی $1',
'viewsourcetext' => 'ایسا ترین بوینین ÙˆÚ©Ù¾ÛŒ کنین منبع ای صÙحه را:',
# Login and logout pages
@@ -579,7 +578,6 @@ $2',
'actioncomplete' => 'عمل مربوطه راکامل کن',
'deletedtext' => '"$1" حذ٠وابیده.
بوین $2 سی ثبت حذ٠آخر.',
-'deletedarticle' => 'حذ٠وابید "[[$1]]"',
'dellogpage' => 'نمایه _ حذÙ',
'deletecomment' => 'دلیل:',
'deleteotherreason' => 'دیه/دلیل اضاÙÛŒ:',
@@ -691,7 +689,6 @@ $2',
لطÙا به صورت دستی آنها را ترکیب کنین.'''",
'movedto' => 'جابجا وابید به',
'movetalk' => 'جابجایی صÙحه صحبت مربوطه',
-'1movedto2' => '[[$1]] جابجا وابید به[[$2]]',
'movelogpage' => 'نمایه جابجایی',
'movereason' => 'دلیل:',
'revertmove' => 'واگردانی',
@@ -769,7 +766,7 @@ $2',
# Media information
'file-info-size' => '$1 × $2 پیکسل, اندازه Ùایل: $3, MIME نوع: $4',
-'file-nohires' => '<small>قابلیت تÙکیک بالاتری در دسترس نه.</small>',
+'file-nohires' => 'قابلیت تÙکیک بالاتری در دسترس نه.',
'svg-long-desc' => 'SVG Ùایل, تقریبا$1 × $2 پیکسل, اندازه Ùایل: $3',
'show-big-image' => 'تصویر با قابلیت تÙکیک کامل',
diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php
index 11860441..b06de005 100644
--- a/languages/messages/MessagesBr.php
+++ b/languages/messages/MessagesBr.php
@@ -49,6 +49,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'HollGemennadennoù' ),
'Allpages' => array( 'AnHollBajennoù' ),
'Ancientpages' => array( 'PajennoùKozh' ),
+ 'Badtitle' => array( 'TitlFall' ),
'Block' => array( 'Stankañ' ),
'Blockme' => array( 'MaStankañ' ),
'Booksources' => array( 'MammennoùLevr' ),
@@ -119,43 +120,43 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ADKAS', '#REDIRECT' ),
- 'numberofpages' => array( '1', 'NIVERABAJENNOU', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NIVERABENNADOU', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NIVERARESTROU', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NIVERAIMPLIJERIEN', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NIVERAIMPLIJERIENOBERIANT', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NIVERAZEGASEDENNOU', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NIVERALENNADENNOU', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ANVPAJENN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ANVPAJENNSK', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ESAOUENNANV', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESAOUENNANVSK', 'NAMESPACEE' ),
- 'fullpagename' => array( '1', 'ANVPAJENNKLOK', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ANVPAJENNKLOKSK', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ANVISPAJENN', 'SUBPAGENAME' ),
- 'img_right' => array( '1', 'dehou', 'right' ),
- 'img_left' => array( '1', 'kleiz', 'left' ),
- 'img_none' => array( '1', 'netra', 'none' ),
- 'img_center' => array( '1', 'kreizenn', 'center', 'centre' ),
- 'img_page' => array( '1', 'pajenn=$1', 'pajenn $1', 'page=$1', 'page $1' ),
- 'img_sub' => array( '1', 'is', 'sub' ),
- 'img_top' => array( '1', 'krec\'h', 'top' ),
- 'img_middle' => array( '1', 'kreiz', 'middle' ),
- 'img_bottom' => array( '1', 'traoñ', 'bottom' ),
- 'img_link' => array( '1', 'liamm=$1', 'link=$1' ),
- 'sitename' => array( '1', 'ANVLEC\'HIENN', 'SITENAME' ),
- 'server' => array( '0', 'SERVIJER', 'SERVER' ),
- 'servername' => array( '0', 'ANVSERVIJER', 'SERVERNAME' ),
- 'grammar' => array( '0', 'YEZHADUR:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'JENER:', 'GENDER:' ),
- 'plural' => array( '0', 'LIESTER:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URLKLOK:', 'FULLURL:' ),
- 'currentversion' => array( '1', 'STUMMRED', 'CURRENTVERSION' ),
- 'language' => array( '0', '#YEZH:', '#LANGUAGE:' ),
- 'special' => array( '0', 'dibar', 'special' ),
- 'pagesize' => array( '1', 'MENTPAJENN', 'PAGESIZE' ),
- 'url_path' => array( '0', 'HENT', 'PATH' ),
+ 'redirect' => array( '0', '#ADKAS', '#REDIRECT' ),
+ 'numberofpages' => array( '1', 'NIVERABAJENNOU', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NIVERABENNADOU', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NIVERARESTROU', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NIVERAIMPLIJERIEN', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NIVERAIMPLIJERIENOBERIANT', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NIVERAZEGASEDENNOU', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NIVERALENNADENNOU', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ANVPAJENN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ANVPAJENNSK', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ESAOUENNANV', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESAOUENNANVSK', 'NAMESPACEE' ),
+ 'fullpagename' => array( '1', 'ANVPAJENNKLOK', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ANVPAJENNKLOKSK', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ANVISPAJENN', 'SUBPAGENAME' ),
+ 'img_right' => array( '1', 'dehou', 'right' ),
+ 'img_left' => array( '1', 'kleiz', 'left' ),
+ 'img_none' => array( '1', 'netra', 'none' ),
+ 'img_center' => array( '1', 'kreizenn', 'center', 'centre' ),
+ 'img_page' => array( '1', 'pajenn=$1', 'pajenn $1', 'page=$1', 'page $1' ),
+ 'img_sub' => array( '1', 'is', 'sub' ),
+ 'img_top' => array( '1', 'krec\'h', 'top' ),
+ 'img_middle' => array( '1', 'kreiz', 'middle' ),
+ 'img_bottom' => array( '1', 'traoñ', 'bottom' ),
+ 'img_link' => array( '1', 'liamm=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'ANVLEC\'HIENN', 'SITENAME' ),
+ 'server' => array( '0', 'SERVIJER', 'SERVER' ),
+ 'servername' => array( '0', 'ANVSERVIJER', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'YEZHADUR:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'JENER:', 'GENDER:' ),
+ 'plural' => array( '0', 'LIESTER:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLKLOK:', 'FULLURL:' ),
+ 'currentversion' => array( '1', 'STUMMRED', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#YEZH:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'dibar', 'special' ),
+ 'pagesize' => array( '1', 'MENTPAJENN', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'HENT', 'PATH' ),
);
$bookstoreList = array(
@@ -534,20 +535,22 @@ Kasit keloù d'ur [[Special:ListUsers/sysop|merer]], en ur verkañ dezhañ choml
'badarticleerror' => "N'haller ket seveniñ an ober-mañ war ar bajenn-mañ.",
'cannotdelete' => 'Dibosupl diverkañ ar bajenn pe ar restr "$1".
Marteze e o bet diverket gant unan bennak all dija.',
+'cannotdelete-title' => 'N\'haller ket diverkañ ar bajenn "$1"',
'badtitle' => 'Titl fall',
'badtitletext' => "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel",
-'perfcached' => "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet.",
-'perfcachedts' => "Krubuilhet eo ar roadennoù-mañ; hizivaet int bet da ziwezhañ d'an $1.",
+'perfcached' => "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet. D'ar muiañ e c'haller kaout {{PLURAL:$1|un disoc'h|$1 disoc'h}} er grubuilh.",
+'perfcachedts' => "Krubuilhet eo ar roadennoù da-heul hag hizivaet int bet da ziwezhañ d'an $1. D'ar muiañ e c'haller kaout {{PLURAL:$4|un disoc'h|$4 disoc'h}} er grubuilh.",
'querypage-no-updates' => 'Diweredekaet eo an hizivaat evit ar bajenn-mañ. Evit poent ne vo ket nevesaet ar roadennoù amañ.',
'wrong_wfQuery_params' => "Arventennoù faziek war an urzhiad wfQuery()<br />
Arc'hwel : $1<br />
Goulenn : $2",
'viewsource' => 'Sellet ouzh tarzh an destenn',
-'viewsourcefor' => 'evit $1',
+'viewsource-title' => 'Gwelet an tarzh evit $1',
'actionthrottled' => 'Ober daleet',
'actionthrottledtext' => "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeut munutennoù.",
'protectedpagetext' => "Prennet eo bet ar bajenn-mañ. N'haller ket kemmañ anezhi ken.",
'viewsourcetext' => 'Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ',
+'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. 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)',
@@ -646,6 +649,7 @@ A-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzu
'emailconfirmlink' => "Kadarnait ho chomlec'h postel",
'invalidemailaddress' => "N'haller ket degemer ar chomlec'h postel-mañ rak faziek eo e furmad evit doare.
Merkit ur chomlec'h reizh pe goullonderit ar vaezienn-mañ.",
+'cannotchangeemail' => "N'haller ket cheñch chomlec'hioù postel ar c'hontoù war ar wiki-mañ.",
'accountcreated' => 'Kont krouet',
'accountcreatedtext' => 'Krouet eo bet kont implijer $1.',
'createaccount-title' => 'Krouiñ ur gont war {{SITENAME}}',
@@ -662,6 +666,7 @@ Gortozit a-raok klask en-dro.",
# E-mail sending
'php-mail-error-unknown' => "Fazi dianav en arc'hwel postel () PHP",
+'user-mail-no-addy' => "Klasket kas ur postel hep lakaat ur chomlec'h postel.",
# Change password dialog
'resetpass' => 'Cheñch ar ger-tremen',
@@ -681,30 +686,45 @@ Gortozit a-raok klask en-dro.",
'resetpass-temp-password' => "Ger-tremen da c'hortoz :",
# Special:PasswordReset
-'passwordreset' => 'Adderaouekaat ar ger-tremen',
-'passwordreset-text' => "Leuniañ ar furmskrid-mañ da resev ur postel da zegas soñj deoc'h eus titouroù ho kont.",
-'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-username' => 'Anv implijer :',
-'passwordreset-domain' => 'Domani :',
-'passwordreset-email' => 'Postel :',
-'passwordreset-emailtitle' => 'Titouroù kont war {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :
+'passwordreset' => 'Adderaouekaat ar ger-tremen',
+'passwordreset-text' => "Leuniañ ar furmskrid-mañ da resev ur postel da zegas soñj deoc'h eus titouroù ho kont.",
+'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-username' => 'Anv implijer :',
+'passwordreset-domain' => 'Domani :',
+'passwordreset-capture' => 'Gwelet ar postel ?',
+'passwordreset-capture-help' => "Ma askit al logell-mañ e vo diskouezet deoc'h ar postel (gant ar ger-tremen da c'hortoz) war un dro pa vo kaset d'an implijer.",
+'passwordreset-email' => 'Postel :',
+'passwordreset-emailtitle' => 'Titouroù kont war {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :
$2
Mont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.
Mat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
-'passwordreset-emailtext-user' => "Goulennet en deus an implijer $1 war {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :
+'passwordreset-emailtext-user' => "Goulennet en deus an implijer $1 war {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :
$2
Mont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.
Mat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
-'passwordreset-emailelement' => "Anv implijer : $1
+'passwordreset-emailelement' => "Anv implijer : $1
Ger-tremen da c'hortoz : $2",
-'passwordreset-emailsent' => "Kaset ez eus bet ur postel da zegas soñj deoc'h.",
+'passwordreset-emailsent' => "Kaset ez eus bet ur postel da zegas soñj deoc'h.",
+'passwordreset-emailsent-capture' => 'Ur postel degas da soñj evel zo diskouezet amañ dindan zo bet kaset.',
+'passwordreset-emailerror-capture' => "Kaset ez eus bet ur postel degas da soñj evel m'emañ diskouezet amañ dindan met c'hwitet eo bet ar c'has : $1",
+
+# Special:ChangeEmail
+'changeemail' => "Kemmañ ar chomlec'h postel",
+'changeemail-header' => "Kemmañ chomlec'h postel ar gont",
+'changeemail-text' => "Leugnit ar furmskrid-mañ da cheñch ho chomlec'h postel. Ret e vo deoc'h merkañ ho ker-tremen evit kadarnaat ar c'hemm-se.",
+'changeemail-no-info' => "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
+'changeemail-oldemail' => "Chomlec'h postel a-vremañ :",
+'changeemail-newemail' => "Chomlec'h postel nevez :",
+'changeemail-none' => '(hini ebet)',
+'changeemail-submit' => "Cheñch chomlec'h postel",
+'changeemail-cancel' => 'Nullañ',
# Edit page toolbar
'bold_sample' => 'Testenn dev',
@@ -777,9 +797,6 @@ Merkit mat an titouroù-se war kement goulenn savet ganeoc'h.
\$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
'blockednoreason' => "n'eus bet roet abeg ebet",
-'blockedoriginalsource' => "Kavout a reot mammenn '''$1''' a-is:",
-'blockededitsource' => "Kavout a reot testenn ho '''kemmoù''' war '''$1''' a-is :",
-'whitelistedittitle' => 'Ret eo bezañ kevreet evit gellout skridaozañ',
'whitelistedittext' => "Ret eo deoc'h en em $1 evit gallout skridaozañ.",
'confirmedittext' => "Rankout a ri bezañ kadarnaet ho chomlec'h postel a-raok gallout kemmañ pajennoù. Skrivit ha kadarnait ho chomlec'h postel en ho [[Special:Preferences|penndibaboù implijer]] mar plij.",
'nosuchsectiontitle' => 'Diposupl eo kavout ar rann-mañ',
@@ -861,7 +878,7 @@ N'eus '''nemet''' an destenn zo en takad krec'h a vo saveteet pa klikot war \"{{
Heñveldra, prometiñ a rit kemer perzh dre zegas skridoù savet ganeoc'h hepken pe tennet eus ur vammenn frank a wirioù.
'''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER (COPYRIGHT) HEP AOTRE D'OBER KEMENT-SE!'''",
'copyrightwarning2' => "Notit mat e c'hall kement degasadenn graet ganeoc'h war {{SITENAME}} bezañ kemmet, adaozet pe lamet kuit gant an implijerien all. Mar ne fell ket deoc'h e vije kemmet-digemmet ar pezh hoc'h eus skrivet na gemerit ket perzh er raktres-mañ.<br /> Gouestlañ a rit ivez eo bet savet ar boued spered ganeoc'h pe eilet diwar ur vammenn frank a wirioù pe en domani foran (gwelet $1 evit gouzout hiroc'h). '''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER HEP AOTRE D'OBER KEMENT-SE!'''",
-'longpageerror' => "'''FAZI: $1 kilobit hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget $2 kilobit, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
+'longpageerror' => "'''FAZI : {{PLURAL:$1|Ur c'hilookted|$1 kilookted}} hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget {{PLURAL:$2|ur c'hilookted|$2 kilookted}}, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
'readonlywarning' => "'''KEMENN DIWALL : stanket eo an diaz titouroù a-benn bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.
Gallout a rit eilañ-pegañ an destenn en ur restr skrid all hag enrollañ anezhi a-benn diwezhatoc'hik.'''
@@ -1027,8 +1044,6 @@ Gouest e vo merourien all {{SITENAME}} da dapout krog en testennoù kuzhet ha da
'revdelete-unsuppress' => 'Lemel ar strishadurioù war ar stummoù assavet',
'revdelete-log' => 'Abeg :',
'revdelete-submit' => 'Lakaat da dalvezout evit an {{PLURAL:$1|adweladenn|adweladennoù}} diuzet',
-'revdelete-logentry' => 'Cheñchet eo bet gweluster ar stumm evit [[$1]]',
-'logdelete-logentry' => 'kemmet eo bet gweluster an darvoud evit [[$1]]',
'revdelete-success' => "''Gweluster ar stummoù hizivaet mat.'''",
'revdelete-failure' => "''Dibosupl hizivaat gweluster ar stumm :'''
$1",
@@ -1040,15 +1055,6 @@ $1",
'revdel-restore-visible' => "adweladennoù a c'heller gwelet",
'pagehist' => 'Istor ar bajenn',
'deletedhist' => 'Diverkañ an istor',
-'revdelete-content' => 'danvez',
-'revdelete-summary' => "diverradenn eus ar c'hemmoù",
-'revdelete-uname' => 'anv implijer',
-'revdelete-restricted' => 'Lakaat ar strishadurioù da dalvezout evit ar verourien',
-'revdelete-unrestricted' => 'dilemel ar strishadurioù evit ar verourien',
-'revdelete-hid' => 'kuzhat $1',
-'revdelete-unhid' => 'diguzhat $1',
-'revdelete-log-message' => '$1 evit $2 {{PLURAL:$2|adweladenn|adweladenn}}',
-'logdelete-log-message' => '$1 evit $2 {{PLURAL:$2|darvoud|darvoud}}',
'revdelete-hide-current' => "Fazi en ur ziverkañ an elfenn deiziataet eus an $1 da $2 : ar stumm red eo.
N'hall ket bezañ diverket.",
'revdelete-show-no-access' => 'Fazi en ur ziskwel an elfenn deiziataet eus an $1 da $2 : merket eo evel "miret".
@@ -1202,12 +1208,14 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
'prefs-rc' => 'Kemmoù diwezhañ',
'prefs-watchlist' => 'Roll evezhiañ',
'prefs-watchlist-days' => 'Niver a zevezhioù da ziskouez er rollad evezhiañ :',
-'prefs-watchlist-days-max' => "7 devezh d'ar muiañ",
+'prefs-watchlist-days-max' => "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
'prefs-watchlist-edits' => 'Niver a gemmoù da ziskouez er roll evezhiañ astennet :',
'prefs-watchlist-edits-max' => 'Niver brasañ : 1000',
'prefs-watchlist-token' => 'Jedouer evit ar roll evezhiañ :',
'prefs-misc' => 'Penndibaboù liesseurt',
'prefs-resetpass' => 'Cheñch ar ger-tremen',
+'prefs-changeemail' => "Cheñch chomlec'h postel",
+'prefs-setemail' => "Termeniñ ur chomlec'h postel",
'prefs-email' => 'Dibarzhioù postel',
'prefs-rendering' => 'Neuz',
'saveprefs' => 'Enrollañ ar penndibaboù',
@@ -1266,6 +1274,7 @@ Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
'yourrealname' => 'Anv gwir*',
'yourlanguage' => 'Yezh an etrefas&nbsp;',
'yourvariant' => 'Adstumm yezh :',
+'prefs-help-variant' => 'An adstummoù yezh pe ar reizhskrivadur a gavit ar gwellañ evit diskouez pajennoù ar wiki.',
'yournick' => 'Sinadur :',
'prefs-help-signature' => 'Dleout a rafe an evezhiadennoù war ar pajennoù kaozeal bezañ sinet gant "<nowiki>~~~~</nowiki>" a vo treuzfurmet en ho sinadur hag euriet.',
'badsig' => 'Direizh eo ho sinadur kriz; gwiriit ho palizennoù HTML.',
@@ -1307,7 +1316,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'userrights-lookup-user' => 'Merañ strolladoù an implijer',
'userrights-user-editname' => 'Lakait un anv implijer :',
'editusergroup' => 'Kemmañ ar strolladoù implijerien',
-'editinguser' => "Kemmañ gwirioù an implijer '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Kemmañ gwirioù an implijer '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Kemmañ strolladoù an implijer',
'saveusergroups' => 'Enrollañ ar strolladoù implijer',
'userrights-groupsmember' => 'Ezel eus :',
@@ -1401,13 +1410,13 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'right-autopatrol' => 'Merkañ e gemmoù evel gwiriekaet, ent emgefre',
'right-patrolmarks' => 'Gwelet kemmoù diwezhañ ar merkoù patrouilhañ',
'right-unwatchedpages' => "Gwelet roll ar pajennoù n'int ket evezhiet",
-'right-trackback' => "Ouzhpennañ ur c'hilliamm",
'right-mergehistory' => 'Unvaniñ istor ar pajennoù',
'right-userrights' => 'Kemmañ holl wirioù un implijer',
'right-userrights-interwiki' => 'Kemmañ ar gwirioù implijer zo war ur wiki all',
'right-siteadmin' => 'Prennañ ha dibrennañ ar bank-titouroù',
'right-override-export-depth' => 'Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live',
'right-sendemail' => "Kas ur postel d'an implijerien all",
+'right-passwordreset' => 'Gwelet ar posteloù assevel gerioù-tremen',
# User rights log
'rightslog' => 'Marilh statud an implijerien',
@@ -1441,16 +1450,17 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'action-suppressionlog' => 'gwelet ar marilh prevez-mañ',
'action-block' => 'mirout ouzh an impplijer-mañ da zegas kemmoù',
'action-protect' => 'kemmañ liveoù gwareziñ ar bajenn-mañ',
+'action-rollback' => 'disteuler prim kemmoù an implijer diwezhañ kemmet gantañ ur bajenn resis',
'action-import' => 'Enporzhiañ ar bajenn-mañ adal ur wiki all',
'action-importupload' => 'Enporzhiañ ar bajenn-mañ adal ur restr pellgarget',
'action-patrol' => 'merkañ kemmoù ar re all evel gwiriet',
'action-autopatrol' => 'bezañ merket ho tegasadennoù evel gwiriet',
'action-unwatchedpages' => "gwelet roll ar pajennoù n'int ket evezhiet",
-'action-trackback' => "zegas ur c'hilliamm",
'action-mergehistory' => 'kendeuziñ istor ar bajenn-mañ',
'action-userrights' => 'Kemmañ an holl wirioù implijer',
'action-userrights-interwiki' => 'Kemmañ gwirioù an implijerien war wikioù all',
'action-siteadmin' => 'Prennañ pe dibrennañ ar bank roadennoù',
+'action-sendemail' => 'Kas posteloù',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|kemm|kemm}}',
@@ -1482,6 +1492,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]',
'rc_categories' => 'Bevenn ar rummadoù (dispartiañ gant "|")',
'rc_categories_any' => 'An holl',
+'rc-change-size-new' => '$1 {{PLURAL:$1|okted|okted}} goude kemmañ',
'newsectionsummary' => '/* $1 */ rann nevez',
'rc-enhanced-expand' => 'Diskouez ar munudoù (JavaScript rekis)',
'rc-enhanced-hide' => 'Kuzhat munudoù',
@@ -1535,6 +1546,7 @@ S.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
'ignorewarnings' => "Na ober van ouzh ar c'hemennoù diwall",
'minlength1' => 'Anv ar restroù a rank bezañ keit hag ul lizherenn da nebeutañ.',
'illegalfilename' => "Lakaet ez eus bet er restr « $1 » arouezennoù n'int ket aotreet evit titl ur bajenn. Mar plij, adanvit ar restr hag adkasit anezhi.",
+'filename-toolong' => "N'hallet ket anvioù ar restroù bezañ hiroc'h eget 240 okted.",
'badfilename' => 'Adanvet eo bet ar skeudenn « $1 ».',
'filetype-mime-mismatch' => 'Ne glot ket astenn ar restr ".$1" gant seurt MIME detektet ar restr ($2).',
'filetype-badmime' => 'N\'eo ket aotreet pellgargañ ar restroù a seurt MIME "$1".',
@@ -1641,6 +1653,41 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
'upload-unknown-size' => 'Ment dianav',
'upload-http-error' => 'Ur fazi HTTP zo bet : $1',
+# File backend
+'backend-fail-stream' => 'Dibosupl lenn ar restr $1.',
+'backend-fail-backup' => 'Dibosupl enrollañ ar restr $1.',
+'backend-fail-notexists' => "N'eus ket eus ar restr $1.",
+'backend-fail-hashes' => 'Dibosupl eo bet tapout hacherezh ar restr evit keñveriañ.',
+'backend-fail-notsame' => "Ur restr disheñvel zo e $1 c'hoazh.",
+'backend-fail-invalidpath' => "$1 n'eo ket un hent stokañ reizh.",
+'backend-fail-delete' => 'Dibosupl eo diverkañ a restr $1.',
+'backend-fail-alreadyexists' => 'Ar restr "$1" zo anezhi c\'hoazh.',
+'backend-fail-store' => 'Dibosupl stokañ ar restr $1 e $2.',
+'backend-fail-copy' => 'Dibosupl eilañ ar restr "$1" war-du "$2".',
+'backend-fail-move' => 'Dibosupl kas ar restr "$1" war-du "$2".',
+'backend-fail-opentemp' => 'Dibosupl eo digeriñ ar restr padennek.',
+'backend-fail-writetemp' => 'Dibosupl skrivañ er restr padennek.',
+'backend-fail-closetemp' => 'Dibosupl eo serriñ ar restr padennek.',
+'backend-fail-read' => 'Dibosupl lenn ar restr $1.',
+'backend-fail-create' => 'Dibosupl krouiñ ar restr $1.',
+'backend-fail-readonly' => 'Emañ an dermenell stokañ "$1" e mod lenn hepken. Setu aze an abeg a oa bet roet : "$2".',
+'backend-fail-synced' => 'Emañ ar restr "$1" en ur stad direizhet en termenelloù stokañ diabarzh',
+'backend-fail-connect' => 'Dibosupl kevreañ ouzh termenell stokañ ar restr "$1".',
+'backend-fail-internal' => 'C\'hoarvezet ez eus ur fazi dianav e termenell stokañ ar restr "$1".',
+'backend-fail-contenttype' => 'Dibosupl termeniñ ar seurt danvez da enrollañ e "$1".',
+'backend-fail-batchsize' => 'Pourvezet he deus an dermenell stokañ ur pakad a $1 {{PLURAL:$1|oberiadenn|oberiadenn}}; sevel a ra ar vevenn da $2 {{PLURAL:$2|oberiadenn|oberiadenn}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Dibosupl dibrennañ "$1"; n\'eo ket prennet.',
+'lockmanager-fail-closelock' => 'Dibosupl serriñ ar restr prennañ evit "$1".',
+'lockmanager-fail-deletelock' => 'Dibosupl diverkañ ar restr prennañ evit "$1".',
+'lockmanager-fail-acquirelock' => 'Dibosupl tapout ar prenn evit "$1".',
+'lockmanager-fail-openlock' => 'Dibosupl digeriñ ar restr prennañ evit "$1".',
+'lockmanager-fail-releaselock' => 'Dibosupl leuskel ar prenn digor evit "$1".',
+'lockmanager-fail-db-bucket' => "Dibosupl mont e darempred gant diazoù roadennoù a-walc'h evit ar c'helornad $1.",
+'lockmanager-fail-db-release' => 'Dibosupl da leuskel ar prennoù digor war an diaz roadennoù $1.',
+'lockmanager-fail-svr-release' => 'Dibosupl da leuskel ar prennoù digor war ar servijer $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Kavet ez eus bet ur fazi en ur zigeriñ ar restr evit kas da benn gwiriadennoù ZIP.',
'zip-wrong-format' => "Ar restr spisaet n'eo ket ur restr ZIP anezhi",
@@ -1657,6 +1704,7 @@ N'hall ket bezañ gwiriet ervat evit ar surentez.",
'uploadstash-badtoken' => "N'haller ket kas an ober-mañ da benn vat, marteze a-walc'h abalamour m'eo aet d'o zermen an titouroù kred ho poa roet. Klaskit en-dro.",
'uploadstash-errclear' => "N'eus ket bet gallet riñsañ ar restroù.",
'uploadstash-refresh' => 'Freskaat roll ar restroù',
+'invalid-chunk-offset' => 'Direizh eo offset ar rannad',
# img_auth script messages
'img-auth-accessdenied' => "Moned nac'het",
@@ -1762,23 +1810,24 @@ Diskouezet eo deskrivadur he [$2 fajenn zeskrivañ] amañ dindan.',
'filerevert-badversion' => "N'eus stumm lec'hel kent ebet eus ar restr-mañ d'ar mare spisaet.",
# File deletion
-'filedelete' => 'Diverkañ $1',
-'filedelete-legend' => 'Diverkañ ar restr',
-'filedelete-intro' => "War-nes diverkañ '''[[Media:$1|$1]]''' a-gevret gant e istor emaoc'h.",
-'filedelete-intro-old' => "Emaoc'h o tiverkañ stumm '''[[Media:$1|$1]]''' eus [$4 $3, $2].",
-'filedelete-comment' => 'Abeg :',
-'filedelete-submit' => 'Diverkañ',
-'filedelete-success' => "Diverket eo bet '''$1'''.",
-'filedelete-success-old' => "Diverket eo bet ar stumm '''[[Media:$1|$1]]''' eus an $2 da $3.",
-'filedelete-nofile' => "N'eus ket eus '''$1'''.",
-'filedelete-nofile-old' => "N'eus stumm diellaouet ebet eus '''$1''' gant an dezverkoù lakaet.",
-'filedelete-otherreason' => 'Abeg all/ouzhpenn :',
-'filedelete-reason-otherlist' => 'Abeg all',
-'filedelete-reason-dropdown' => "*Abegoù diverkañ boas
+'filedelete' => 'Diverkañ $1',
+'filedelete-legend' => 'Diverkañ ar restr',
+'filedelete-intro' => "War-nes diverkañ '''[[Media:$1|$1]]''' a-gevret gant e istor emaoc'h.",
+'filedelete-intro-old' => "Emaoc'h o tiverkañ stumm '''[[Media:$1|$1]]''' eus [$4 $3, $2].",
+'filedelete-comment' => 'Abeg :',
+'filedelete-submit' => 'Diverkañ',
+'filedelete-success' => "Diverket eo bet '''$1'''.",
+'filedelete-success-old' => "Diverket eo bet ar stumm '''[[Media:$1|$1]]''' eus an $2 da $3.",
+'filedelete-nofile' => "N'eus ket eus '''$1'''.",
+'filedelete-nofile-old' => "N'eus stumm diellaouet ebet eus '''$1''' gant an dezverkoù lakaet.",
+'filedelete-otherreason' => 'Abeg all/ouzhpenn :',
+'filedelete-reason-otherlist' => 'Abeg all',
+'filedelete-reason-dropdown' => "*Abegoù diverkañ boas
** Gaou ouzh ar gwirioù perc'hennañ
** Restr zo anezhi dija",
-'filedelete-edit-reasonlist' => 'Kemmañ a ra an abegoù diverkañ',
-'filedelete-maintenance' => "Evit ar mare eo diweredekaet an diverkañ hag an assevel restroù, amzer d'ober un tamm trezalc'h.",
+'filedelete-edit-reasonlist' => 'Kemmañ a ra an abegoù diverkañ',
+'filedelete-maintenance' => "Evit ar mare eo diweredekaet an diverkañ hag an assevel restroù, amzer d'ober un tamm trezalc'h.",
+'filedelete-maintenance-title' => 'Dibosupl diverkañ ar restr',
# MIME search
'mimesearch' => 'Klask MIME',
@@ -1876,6 +1925,8 @@ $1 {{PLURAL:$1|rummad|rummad}}',
'wantedpages' => 'Pajennoù goulennet ar muiañ',
'wantedpages-badtitle' => "Titl direizh er strollad disoc'hoù : $1",
'wantedfiles' => 'Restroù a vank',
+'wantedfiletext-cat' => "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se. Ouzhpenn-se emañ renablet an holl bajennoù zo enno restroù n'eus ket anezho e [[:$1]].",
+'wantedfiletext-nocat' => "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se.",
'wantedtemplates' => 'Patromoù a vank',
'mostlinked' => 'Pajennoù dezho al liammoù niverusañ',
'mostlinkedcategories' => 'Rummadoù dezho al liammoù niverusañ',
@@ -1884,6 +1935,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
'mostimages' => 'Skeudennoù implijet ar muiañ',
'mostrevisions' => 'Pennadoù bet kemmet ar muiañ',
'prefixindex' => 'An holl bajennoù a grog gant...',
+'prefixindex-namespace' => 'An holl bajennoù enno ur rakger (esaouenn anv $1)',
'shortpages' => 'Pennadoù berr',
'longpages' => 'Pennadoù hir',
'deadendpages' => 'Pajennoù dall (hep liamm diabarzh)',
@@ -1900,7 +1952,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
'listusers-editsonly' => 'Na ziskouez nemet an implijerien o deus degaset un dra bennak',
'listusers-creationsort' => 'Renket dre urzh krouiñ',
'usereditcount' => '$1 {{PLURAL:$1|kemm|kemm}}',
-'usercreated' => "Krouet d'an $1 da $2",
+'usercreated' => "{{GENDER:$3|Krouet}} d'an $1 da $2",
'newpages' => 'Pajennoù nevez',
'newpages-username' => 'Anv implijer :',
'ancientpages' => 'Pennadoù koshañ',
@@ -1994,12 +2046,8 @@ Protokoloù skoret : <tt>$1</tt> (na lakait hini ebet eus ar re-se en ho klask)'
'activeusers-noresult' => "N'eus bet kavet implijer ebet.",
# Special:Log/newusers
-'newuserlogpage' => "Marilh ar c'hontoù krouet",
-'newuserlogpagetext' => "Marilh krouiñ ar c'hontoù implijer.",
-'newuserlog-byemail' => 'ger-tremen kaset dre bostel',
-'newuserlog-create-entry' => 'Implijer nevez',
-'newuserlog-create2-entry' => 'krouet ar gont nevez $1',
-'newuserlog-autocreate-entry' => 'Kont krouet ent emgefre',
+'newuserlogpage' => "Marilh ar c'hontoù krouet",
+'newuserlogpagetext' => "Marilh krouiñ ar c'hontoù implijer.",
# Special:ListGroupRights
'listgrouprights' => 'Gwirioù ar strolladoù implijer',
@@ -2030,7 +2078,7 @@ evit gallout kas ur postel d'un implijer all.",
'emailpagetext' => "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an implijer-mañ.
E maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h-c'hwi en ho [[Special:Preferences|Penndibaboù]], d'ar resever da c'hallout respont deoc'h war-eeun ma kar.",
'usermailererror' => 'Fazi postel :',
-'defemailsubject' => 'postel kaset eus {{SITENAME}}',
+'defemailsubject' => 'Postel kaset eus {{SITENAME}} gant an implijer "$1"',
'usermaildisabled' => "Diweredekaet eo ar c'has posteloù etre an implijerien.",
'usermaildisabledtext' => "Ne c'helloc'h ket kas posteloù da implijerien all er wiki-mañ",
'noemailtitle' => "Chomlec'h postel ebet",
@@ -2087,7 +2135,7 @@ Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ. klikit war "Paouez da e
'watchmethod-list' => "Gwiriañ ar c'hemmoù diwezhañ evit ar pajennoù evezhiet",
'watchlistcontains' => '$1 {{PLURAL:$1|pajenn|pajenn}} zo en ho rollad evezhiañ',
'iteminvalidname' => "Ur gudenn zo gant ar pennad « $1 » : n'eo ket mat e anv...",
-'wlnote' => "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} ziwezhañ.",
+'wlnote' => "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} ziwezhañ, evit an $3 da $4.",
'wlshowlast' => 'Diskouez an $1 eurvezh $2 devezh diwezhañ $3',
'watchlist-options' => 'Dibarzhioù ar roll evezhiañ',
@@ -2152,8 +2200,6 @@ Kadarnait, mar plij, eo mat an dra-se hoc'h eus c'hoant da ober, e komprenit mat
'actionfailed' => "Ober c'hwitet",
'deletedtext' => '"Diverket eo bet $1".
Sellet ouzh $2 evit roll an diverkadennoù diwezhañ.',
-'deletedarticle' => 'en deus dilamet "[[$1]]"',
-'suppressedarticle' => 'diverket "[[$1]]"',
'dellogpage' => 'Roll ar pajennoù diverket',
'dellogpagetext' => 'Setu roll ar pajennnoù diwezhañ bet diverket.',
'deletionlog' => 'roll an diverkadennoù',
@@ -2201,7 +2247,10 @@ Sellet ouzh ar [[Special:ProtectedPages|roll ar pajennoù gwarezet]] evit kaout
'unprotectedarticle' => "diwarezet eo bet ''[[$1]]''",
'movedarticleprotection' => 'en deus adkaset an arventennoù gwareziñ eus "[[$2]]" da "[[$1]]"',
'protect-title' => 'Kemmañ al live gwareziñ evit "$1"',
+'protect-title-notallowed' => 'Gwelet al live gwareziñ evit "$1"',
'prot_1movedto2' => '[[$1]] adkaset war-du [[$2]]',
+'protect-badnamespace-title' => 'Esaouennoù anv diwarezadus',
+'protect-badnamespace-text' => "N'haller ket gwareziñ ar pajennoù en esaouenn anv-mañ.",
'protect-legend' => 'Kadarnaat ar gwareziñ',
'protectcomment' => 'Abeg :',
'protectexpiry' => 'Termen',
@@ -2221,6 +2270,7 @@ Setu an doare a-vremañ evit ar bajenn-mañ '''$1''':",
'protect-level-sysop' => 'Merourien hepken',
'protect-summary-cascade' => 'Gwareziñ dre skalierad',
'protect-expiring' => "a zeu d'e dermen d'an $1",
+'protect-expiring-local' => "a ya d'e dermen d'an $1",
'protect-expiry-indefinite' => 'da viken',
'protect-cascade' => 'Gwareziñ dre skalierad - gwareziñ a ra an holl bajennoù zo er bajenn-mañ. ARABAT IMPLIJOUT.',
'protect-cantedit' => "N'oc'h ket evit cheñch live gwareziñ ar bajenn-mañ rak n'oc'h ket aotreet da zegas kemmoù enni.",
@@ -2278,7 +2328,6 @@ Ma'z eus bet krouet ur bajenn nevez dezhi an hevelep anv abaoe an diverkadenn, e
'undeletereset' => 'Adderaouekaat',
'undeleteinvert' => 'Eilpennañ diuzadenn',
'undeletecomment' => 'Abeg :',
-'undeletedarticle' => 'Diziverket"$1"',
'undeletedrevisions' => 'Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}',
'undeletedrevisions-files' => 'Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}',
'undeletedfiles' => '{{PLURAL:$1|1 restr|$1 restr}} adsavet',
@@ -2287,6 +2336,7 @@ Ma'z eus bet krouet ur bajenn nevez dezhi an hevelep anv abaoe an diverkadenn, e
Sellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.",
'undelete-header' => 'Gwelet [[Special:Log/delete|al log diverkañ]] evit ar pajennoù diverket nevez zo.',
+'undelete-search-title' => 'Klask pajennoù bet diverket',
'undelete-search-box' => 'Klask pajennoù diverket',
'undelete-search-prefix' => 'Diskouez ar pajennoù a grog gant :',
'undelete-search-submit' => 'Klask',
@@ -2295,6 +2345,7 @@ Sellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell
'undelete-bad-store-key' => "Dibosupl diziverkañ stumm ar restr d'ar mare $1: ezvezant e oa ar restr a-raok an diverkadenn.",
'undelete-cleanup-error' => 'Fazi en ur ziverkañ ar restr diellaouet dizimplij "$1".',
'undelete-missing-filearchive' => "Dibosupl adsevel ID diell ar restr $1 rak n'emañ ket er bank ditouroù. Diziverket eo bet c'hoazh, marteze a-walc'h.",
+'undelete-error' => 'Pajenn ar fazioù diziverkañ',
'undelete-error-short' => 'Fazi e-ser diziverkañ ar restr : $1',
'undelete-error-long' => 'Fazioù zo bet kavet e-ser diziverkañ ar restr :
@@ -2418,6 +2469,7 @@ Sellit ouzh [[Special:BlockList|roll ar chomlec\'hioù IP ha kontoù stanket]] e
'blocklist-userblocks' => 'Kuzhat ar stankadennoù kont',
'blocklist-tempblocks' => 'Kuzhat ar stankadennoù berrbad',
'blocklist-addressblocks' => "Kuzhat stankadennoù ar chomlec'hioù IP en o-unan",
+'blocklist-rangeblocks' => "Kuzhat ar bloc'hadoù renkennek",
'blocklist-timestamp' => 'Deiziad hag eur',
'blocklist-target' => 'pal',
'blocklist-expiry' => "A ya d'e dermen",
@@ -2440,6 +2492,7 @@ Sellit ouzh [[Special:BlockList|roll ar chomlec\'hioù IP ha kontoù stanket]] e
'unblocklink' => 'distankañ',
'change-blocklink' => 'Kemmañ ar stankadenn',
'contribslink' => 'degasadennoù',
+'emaillink' => 'Kas ur postel',
'autoblocker' => 'Emstanket rak implijet eo bet ho chomlec\'h IP gant "[[User:$1|$1]]" nevez zo.
Setu aze an abeg(où) m\'eo bet stanket $1 : "$2"',
'blocklogpage' => 'Roll ar stankadennoù',
@@ -2554,9 +2607,6 @@ Dibabit unan all mar plij.",
'movepage-page-moved' => 'Anv nevez ar bajenn $1 zo $2.',
'movepage-page-unmoved' => "N'eus ket bet gallet adenvel ar bajenn $1 e $2.",
'movepage-max-pages' => 'Tizhet eo bet ar vevenn uhelañ a $1 {{PLURAL:$1|bajenn|pajenn}} da adenvel ha ne vo ket adanvet hini all ebet ken ent emgefre.',
-'1movedto2' => '[[$1]] adkaset war-du [[$2]]',
-'1movedto2_redir' => '[[$1]] adkaset war-du [[$2]] (adkas)',
-'move-redirect-suppressed' => 'adkas nullet',
'movelogpage' => 'Roll an adkasoù',
'movelogpagetext' => 'Setu roll ar pajennoù bet savet un adkas evito.',
'movesubpage' => '{{PLURAL:$1|Ispajenn|Ispajenn}}',
@@ -2570,7 +2620,7 @@ Dibabit unan all mar plij.",
Savet eo ar pennad tal \"[[:\$1]]\" c'hoazh.
Diverkañ anezhañ a fell deoc'h ober evit reiñ lec'h d'an adkas ?",
'delete_and_move_confirm' => 'Ya, diverkañ ar bajenn',
-'delete_and_move_reason' => "Diverket evit ober lec'h d'an adkas",
+'delete_and_move_reason' => 'Diverket evit ober lec\'h d\'an adkas "[[$1]]"',
'selfmove' => "Heñvel eo titl ar poent loc'hañ ha hini ar pal; n'haller ket adkas ur bajenn war-du he lec'h orin.",
'immobile-source-namespace' => 'n\'haller kas ar pajennoù war-du an esaouenn anv "$1"',
'immobile-target-namespace' => 'N\'hallit ket adenvel pajennoù war-du an esaouenn anv "$1"',
@@ -2598,9 +2648,11 @@ a-benn neuze e c'hall an disoc'h bezañ enporzhiet en ur wiki all a ya en-dro ga
A-benn ezporzhiañ pajennoù, merkit an titloù anezho er voest skrid a-is, un titl dre linenn. Diuzit mar fell deoc'h kaout, pe get, ar stumm a-vremañ gant an holl stummoù kozh, gant linennoù itor ar bajenn, pe just ar bajenn red gant titouroù diwar-benn ar c'hemm diwezhañ.
Mard eo se e c'hallit ivez implijout ul liamm a seurt gant [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] evit ar bajenn [[{{MediaWiki:Mainpage}}]].",
+'exportall' => 'Ezporzhiañ an holl bajennoù',
'exportcuronly' => 'Ezporzhiañ hepken ar stumm red hep an istor anezhañ',
'exportnohistory' => "----
'''Notenn :''' Dilezet eo bet an ezporzhiañ istor klok ar pajennoù evit poent peogwir e veze gorrekaet ar reizhiad diwar se.",
+'exportlistauthors' => 'Lakaat e-barzh ur roll klok eus ar berzhidi evit pep pajenn',
'export-submit' => 'Ezporzhiañ',
'export-addcattext' => 'Ouzhpennañ pajennoù ar rummad :',
'export-addcat' => 'Ouzhpennañ',
@@ -2633,6 +2685,8 @@ Kit da welet [//www.mediawiki.org/wiki/Localisation Lec'heladur MediaWiki] ha [/
'thumbnail_error' => 'Fazi e-ser krouiñ an alberz : $1',
'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',
+'thumbnail-dest-create' => 'Dibosupl enrollañ ar munud.',
'thumbnail_invalid_params' => 'Arventennoù direizh evit ar munud',
'thumbnail_dest_directory' => "Dibosupl krouiñ ar c'havlec'h pal",
'thumbnail_image-type' => "N'eo ket skoret ar seurt skeudennoù",
@@ -2677,6 +2731,11 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
'import-upload' => 'Enporzhiañ roadennoù XML',
'import-token-mismatch' => "Kollet eo bet roadennoù an dalc'h. Klaskit en-dro.",
'import-invalid-interwiki' => 'Dibosupl enporzhiañ adal ar wiki spisaet.',
+'import-error-edit' => 'N\'eo ket bet enporzhiet ar bajenn "$1" peogwir n\'oc\'h ket aotreet da zegas kemmoù enni.',
+'import-error-create' => 'N\'eo ket bet enporzhiet ar bajenn "$1" peogwir n\'oc\'h ket aotreet da grouiñ anezhi.',
+'import-error-interwiki' => 'Ne vez ket enporzhiet ar bajenn "$1" rak miret eo an anv evit liammoù diavaez (etrewiki).',
+'import-error-special' => 'Ne vez ket enporzhiet ar bajenn "$1" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.',
+'import-error-invalid' => 'Ne vez ket enporzhiet ar bajenn "$1" rak direizh eo hec\'h anv.',
# Import log
'importlogpage' => 'Log an enporzhiadennoù',
@@ -2686,73 +2745,86 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
'import-logentry-interwiki' => 'treuzwikiet $1',
'import-logentry-interwiki-detail' => "$1 {{PLURAL:$1|c'hemm|kemm}} abaoe $2",
+# JavaScriptTest
+'javascripttest' => 'Amprouadenn JavaScript',
+'javascripttest-disabled' => "Diweredekaet eo an arc'hwel-mañ.",
+'javascripttest-title' => 'Emeur o seveniñ $1 amprouadenn',
+'javascripttest-pagetext-noframework' => 'Miret eo ar bajenn-mañ evit amprouiñ JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Framm amprouiñ "$1" dianav.',
+'javascripttest-pagetext-frameworks' => 'Diuzit unan eus ar frammoù amprouiñ da-heul : $1',
+'javascripttest-pagetext-skins' => 'Diuzit ar gwiskadur da vezañ implijet evit an amprouadennoù :',
+'javascripttest-qunit-intro' => 'Sellet ouzh [$1 an teulioù amprouiñ] e mediawiki.org.',
+'javascripttest-qunit-heading' => 'Heuliad amprouadennoù QUnit eus JavaScript war MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ho pajenn implijer',
-'tooltip-pt-anonuserpage' => "Ar bajenn implijer evit ar c'homlec'h IP implijet ganeoc'h",
-'tooltip-pt-mytalk' => 'Ho pajenn gaozeal',
-'tooltip-pt-anontalk' => "Kaozeadennoù diwar-benn ar c'hemmoù graet adal ar chomlec'h-mañ",
-'tooltip-pt-preferences' => 'Ma fenndibaboù',
-'tooltip-pt-watchlist' => "Roll ar pajennoù evezhiet ganeoc'h.",
-'tooltip-pt-mycontris' => 'Roll ho tegasadennoù',
-'tooltip-pt-login' => "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ",
-'tooltip-pt-anonlogin' => "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ.",
-'tooltip-pt-logout' => 'Digevreañ',
-'tooltip-ca-talk' => 'Kaozeadennoù diwar-benn ar pennad',
-'tooltip-ca-edit' => 'Gallout a rit kemmañ ar bajenn-mañ. Implijit ar stokell Rakwelet a-raok enrollañ, mar plij.',
-'tooltip-ca-addsection' => 'Kregiñ gant ur rann nevez.',
-'tooltip-ca-viewsource' => 'Gwarezet eo ar bajenn-mañ. Gallout a rit gwelet an danvez anezhañ memes tra.',
-'tooltip-ca-history' => 'Stummoù kozh ar bajenn-mañ gant an aozerien anezhi.',
-'tooltip-ca-protect' => 'Gwareziñ ar bajenn-mañ',
-'tooltip-ca-unprotect' => 'Cheñch live gwareziñ ar bajenn-mañ',
-'tooltip-ca-delete' => 'Diverkañ ar bajenn-mañ',
-'tooltip-ca-undelete' => 'Adsevel ar bajenn-mañ',
-'tooltip-ca-move' => 'Adenvel ar bajenn-mañ',
-'tooltip-ca-watch' => "Ouzhpennañ ar bajenn-mañ d'ho roll evezhiañ",
-'tooltip-ca-unwatch' => 'Paouez da evezhiañ ar bajenn-mañ',
-'tooltip-search' => 'Klaskit er wiki-mañ',
-'tooltip-search-go' => "Mont d'ar bajenn dezhi an anv-mañ rik, ma'z eus anezhi",
-'tooltip-search-fulltext' => 'Klask an destenn-mañ er pajennoù',
-'tooltip-p-logo' => 'Pajenn bennañ',
-'tooltip-n-mainpage' => 'Diskouez ar Bajenn bennañ',
-'tooltip-n-mainpage-description' => 'Kit da welet an degemer',
-'tooltip-n-portal' => "Diwar-benn ar raktres, ar pezh a c'hallit ober, pelec'h kavout an traoù",
-'tooltip-n-currentevents' => 'Tapout keleier diwar-benn an darvoudoù diwezhañ',
-'tooltip-n-recentchanges' => "Roll ar c'hemmoù diwezhañ c'hoarvezet war ar wiki.",
-'tooltip-n-randompage' => 'Diskwel ur bajenn dre zegouezh',
-'tooltip-n-help' => 'Skoazell.',
-'tooltip-t-whatlinkshere' => 'Roll ar pajennoù liammet ouzh ar bajenn-mañ',
-'tooltip-t-recentchangeslinked' => "Roll ar c'hemmoù diwezhañ war ar pajennoù liammet ouzh ar bajenn-mañ",
-'tooltip-feed-rss' => 'Magañ ar red RSS evit ar bajenn-mañ',
-'tooltip-feed-atom' => 'Magañ ar red Atom evit ar bajenn-mañ',
-'tooltip-t-contributions' => 'Gwelet roll degasadennoù an implijer-mañ',
-'tooltip-t-emailuser' => "Kas ur postel d'an implijer-mañ",
-'tooltip-t-upload' => 'Enporzhiañ ur skeudenn pe ur restr media war ar servijer',
-'tooltip-t-specialpages' => 'Roll an holl bajennoù dibar',
-'tooltip-t-print' => 'Stumm moulladus ar bajenn-mañ',
-'tooltip-t-permalink' => 'Liamm padus war-du ar stumm-mañ eus ar bajenn',
-'tooltip-ca-nstab-main' => 'Gwelet ar pennad',
-'tooltip-ca-nstab-user' => 'Gwelet ar bajenn implijer',
-'tooltip-ca-nstab-media' => 'Gwelet pajenn ar media',
-'tooltip-ca-nstab-special' => "Ur bajenn dibar eo homañ, n'oc'h ket evit kemmañ anezhi.",
-'tooltip-ca-nstab-project' => 'Gwelet pajenn ar raktres',
-'tooltip-ca-nstab-image' => 'Gwelet pajenn deskrivañ ar bajenn-mañ',
-'tooltip-ca-nstab-mediawiki' => 'Gwelet kemenn ar reizhiad',
-'tooltip-ca-nstab-template' => 'Gwelet ar patrom',
-'tooltip-ca-nstab-help' => 'Gwelet ar bajenn soazell',
-'tooltip-ca-nstab-category' => 'Gwelet pajenn ar rummad',
-'tooltip-minoredit' => "Merkañ ar c'hemm-mañ evel dister",
-'tooltip-save' => 'Enrollañ ho kemmoù',
-'tooltip-preview' => "Rakwelet ar c'hemmoù; trugarez d'ober gantañ a-raok enrollañ!",
-'tooltip-diff' => "Diskouez ar c'hemmoù degaset ganeoc'h en destenn.",
-'tooltip-compareselectedversions' => "Sellet ouzh an diforc'hioù zo etre daou stumm diuzet ar bajenn-mañ.",
-'tooltip-watch' => "Ouzhpennañ ar bajenn-mañ d'ho roll evezhiañ",
-'tooltip-recreate' => 'Adkrouiñ ar bajenn ha pa vije bet diverket a-raok',
-'tooltip-upload' => 'Kregiñ da enporzhiañ',
-'tooltip-rollback' => "\"Disteuler\" a zistaol en ur c'hlik ar c'hemm(où) bet degaset d'ar bajenn-mañ gant an implijer diwezhañ.",
-'tooltip-undo' => '"Dizober" a zistaol ar c\'hemm-mañ hag a zigor ar prenestr skridaozañ er mod rakwelet.
+'tooltip-pt-userpage' => 'Ho pajenn implijer',
+'tooltip-pt-anonuserpage' => "Ar bajenn implijer evit ar c'homlec'h IP implijet ganeoc'h",
+'tooltip-pt-mytalk' => 'Ho pajenn gaozeal',
+'tooltip-pt-anontalk' => "Kaozeadennoù diwar-benn ar c'hemmoù graet adal ar chomlec'h-mañ",
+'tooltip-pt-preferences' => 'Ma fenndibaboù',
+'tooltip-pt-watchlist' => "Roll ar pajennoù evezhiet ganeoc'h.",
+'tooltip-pt-mycontris' => 'Roll ho tegasadennoù',
+'tooltip-pt-login' => "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ",
+'tooltip-pt-anonlogin' => "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ.",
+'tooltip-pt-logout' => 'Digevreañ',
+'tooltip-ca-talk' => 'Kaozeadennoù diwar-benn ar pennad',
+'tooltip-ca-edit' => 'Gallout a rit kemmañ ar bajenn-mañ. Implijit ar stokell Rakwelet a-raok enrollañ, mar plij.',
+'tooltip-ca-addsection' => 'Kregiñ gant ur rann nevez.',
+'tooltip-ca-viewsource' => 'Gwarezet eo ar bajenn-mañ. Gallout a rit gwelet an danvez anezhañ memes tra.',
+'tooltip-ca-history' => 'Stummoù kozh ar bajenn-mañ gant an aozerien anezhi.',
+'tooltip-ca-protect' => 'Gwareziñ ar bajenn-mañ',
+'tooltip-ca-unprotect' => 'Cheñch live gwareziñ ar bajenn-mañ',
+'tooltip-ca-delete' => 'Diverkañ ar bajenn-mañ',
+'tooltip-ca-undelete' => 'Adsevel ar bajenn-mañ',
+'tooltip-ca-move' => 'Adenvel ar bajenn-mañ',
+'tooltip-ca-watch' => "Ouzhpennañ ar bajenn-mañ d'ho roll evezhiañ",
+'tooltip-ca-unwatch' => 'Paouez da evezhiañ ar bajenn-mañ',
+'tooltip-search' => 'Klaskit er wiki-mañ',
+'tooltip-search-go' => "Mont d'ar bajenn dezhi an anv-mañ rik, ma'z eus anezhi",
+'tooltip-search-fulltext' => 'Klask an destenn-mañ er pajennoù',
+'tooltip-p-logo' => 'Pajenn bennañ',
+'tooltip-n-mainpage' => 'Diskouez ar Bajenn bennañ',
+'tooltip-n-mainpage-description' => 'Kit da welet an degemer',
+'tooltip-n-portal' => "Diwar-benn ar raktres, ar pezh a c'hallit ober, pelec'h kavout an traoù",
+'tooltip-n-currentevents' => 'Tapout keleier diwar-benn an darvoudoù diwezhañ',
+'tooltip-n-recentchanges' => "Roll ar c'hemmoù diwezhañ c'hoarvezet war ar wiki.",
+'tooltip-n-randompage' => 'Diskwel ur bajenn dre zegouezh',
+'tooltip-n-help' => 'Skoazell.',
+'tooltip-t-whatlinkshere' => 'Roll ar pajennoù liammet ouzh ar bajenn-mañ',
+'tooltip-t-recentchangeslinked' => "Roll ar c'hemmoù diwezhañ war ar pajennoù liammet ouzh ar bajenn-mañ",
+'tooltip-feed-rss' => 'Magañ ar red RSS evit ar bajenn-mañ',
+'tooltip-feed-atom' => 'Magañ ar red Atom evit ar bajenn-mañ',
+'tooltip-t-contributions' => 'Gwelet roll degasadennoù an implijer-mañ',
+'tooltip-t-emailuser' => "Kas ur postel d'an implijer-mañ",
+'tooltip-t-upload' => 'Enporzhiañ ur skeudenn pe ur restr media war ar servijer',
+'tooltip-t-specialpages' => 'Roll an holl bajennoù dibar',
+'tooltip-t-print' => 'Stumm moulladus ar bajenn-mañ',
+'tooltip-t-permalink' => 'Liamm padus war-du ar stumm-mañ eus ar bajenn',
+'tooltip-ca-nstab-main' => 'Gwelet ar pennad',
+'tooltip-ca-nstab-user' => 'Gwelet ar bajenn implijer',
+'tooltip-ca-nstab-media' => 'Gwelet pajenn ar media',
+'tooltip-ca-nstab-special' => "Ur bajenn dibar eo homañ, n'oc'h ket evit kemmañ anezhi.",
+'tooltip-ca-nstab-project' => 'Gwelet pajenn ar raktres',
+'tooltip-ca-nstab-image' => 'Gwelet pajenn deskrivañ ar bajenn-mañ',
+'tooltip-ca-nstab-mediawiki' => 'Gwelet kemenn ar reizhiad',
+'tooltip-ca-nstab-template' => 'Gwelet ar patrom',
+'tooltip-ca-nstab-help' => 'Gwelet ar bajenn soazell',
+'tooltip-ca-nstab-category' => 'Gwelet pajenn ar rummad',
+'tooltip-minoredit' => "Merkañ ar c'hemm-mañ evel dister",
+'tooltip-save' => 'Enrollañ ho kemmoù',
+'tooltip-preview' => "Rakwelet ar c'hemmoù; trugarez d'ober gantañ a-raok enrollañ!",
+'tooltip-diff' => "Diskouez ar c'hemmoù degaset ganeoc'h en destenn.",
+'tooltip-compareselectedversions' => "Sellet ouzh an diforc'hioù zo etre daou stumm diuzet ar bajenn-mañ.",
+'tooltip-watch' => "Ouzhpennañ ar bajenn-mañ d'ho roll evezhiañ",
+'tooltip-watchlistedit-normal-submit' => 'Tennañ an titloù',
+'tooltip-watchlistedit-raw-submit' => 'Hizivaat ar roll evezhiañ',
+'tooltip-recreate' => 'Adkrouiñ ar bajenn ha pa vije bet diverket a-raok',
+'tooltip-upload' => 'Kregiñ da enporzhiañ',
+'tooltip-rollback' => "\"Disteuler\" a zistaol en ur c'hlik ar c'hemm(où) bet degaset d'ar bajenn-mañ gant an implijer diwezhañ.",
+'tooltip-undo' => '"Dizober" a zistaol ar c\'hemm-mañ hag a zigor ar prenestr skridaozañ er mod rakwelet.
Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
-'tooltip-preferences-save' => 'Enrollañ ar penndibaboù',
-'tooltip-summary' => 'Skrivit un diveradenn verr',
+'tooltip-preferences-save' => 'Enrollañ ar penndibaboù',
+'tooltip-summary' => 'Skrivit un diveradenn verr',
# Stylesheets
'common.css' => '/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */',
@@ -2847,9 +2919,6 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
# Patrol log
'patrol-log-page' => 'Log gwiriañ',
'patrol-log-header' => 'Setu ur marilh eus ar stummoù patrouilhet.',
-'patrol-log-line' => 'en/he deus merket ar stumm $1 eus $2 evel gwiriet $3',
-'patrol-log-auto' => '(emgefre)',
-'patrol-log-diff' => 'Adweladenn $1',
'log-show-hide-patrol' => '$1 istor ar stummoù gwiriet',
# Image deletion
@@ -2876,11 +2945,11 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
'file-info' => 'ment ar restr : $1, seurt MIME : $2',
'file-info-size' => '$1 × $2 piksel, ment ar restr : $3, seurt MIME : $4',
'file-info-size-pages' => '$1 × $2 piksel, ment ar restr : $3, seurt MIME : $4, $5 {{PLURAL:$5|pajenn|pajenn}}',
-'file-nohires' => "<small>N'haller ket gwellaat ar pizhder.</small>",
+'file-nohires' => "N'haller ket gwellaat ar pizhder.",
'svg-long-desc' => 'restr SVG file, pizhder $1 × $2 piksel, ment ar restr : $3',
'show-big-image' => 'Pizhder leun',
-'show-big-image-preview' => '<small>Ment ar rakweled-mañ : $1.</small>',
-'show-big-image-other' => '<small>Spiderioù all : $1.</small>',
+'show-big-image-preview' => 'Ment ar rakweled-mañ : $1.',
+'show-big-image-other' => '{{PLURAL:$2|pizhder all|pizhderioù all}} : $1.',
'show-big-image-size' => '$1 × $2 piksel',
'file-info-gif-looped' => "e kelc'h",
'file-info-gif-frames' => '$1 {{PLURAL:$1|skeudenn|skeudenn}}',
@@ -2900,6 +2969,13 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
'bydate' => 'dre an deiziad anezho',
'sp-newimages-showfrom' => 'Diskouez ar restroù nevez adal $1, $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 eilenn|$1 eilenn}}',
+'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
+'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
+'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
+'ago' => '$1 zo',
+
# Bad image list
'bad_image_list' => "Setu doare ar furmad :
@@ -3396,13 +3472,6 @@ Mont a raio ar c'hod-mañ d'e dermen d'ar \$4.",
'scarytranscludefailed' => "[N'eus ket bet gallet tapout ar patrom evit $1]",
'scarytranscludetoolong' => '[URL re hir]',
-# Trackbacks
-'trackbackbox' => 'Liamm war-gil betek al liamm-mañ :<br />
-$1',
-'trackbackremove' => '([$1 Diverkañ])',
-'trackbacklink' => 'Liamm war-gil',
-'trackbackdeleteok' => 'Diverket mat eo bet al liamm war-gil.',
-
# Delete conflict
'deletedwhileediting' => "'''Diwallit''' : Diverket eo bet ar bajenn-mañ bremañ ha krog e oac'h da zegas kemmoù enni!",
'confirmrecreate' => "Diverket eo bet ar pennad-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhañ :
@@ -3503,6 +3572,9 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
'iranian-calendar-m11' => '11vet miz JalÄli',
'iranian-calendar-m12' => '12vet miz JalÄli',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kaozeal]])',
+
# Core parser functions
'unknown_extension_tag' => 'Balizenn astenn "$1" dianav',
'duplicate-defaultsort' => 'Diwallit : Frikañ a ra an alc\'hwez dre ziouer "$2" an hini a oa a-raok "$1".',
@@ -3601,13 +3673,16 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
'tags-hitcount' => '$1 {{PLURAL:$1|kemm|kemm}}',
# Special:ComparePages
-'comparepages' => 'Keñveriañ pajennoù',
-'compare-selector' => 'Keñveriañ stummoù ar pajennoù',
-'compare-page1' => 'Pajenn 1',
-'compare-page2' => 'Pajenn 2',
-'compare-rev1' => 'Adweladenn 1',
-'compare-rev2' => 'Adweladenn 2',
-'compare-submit' => 'Keñveriañ',
+'comparepages' => 'Keñveriañ pajennoù',
+'compare-selector' => 'Keñveriañ stummoù ar pajennoù',
+'compare-page1' => 'Pajenn 1',
+'compare-page2' => 'Pajenn 2',
+'compare-rev1' => 'Adweladenn 1',
+'compare-rev2' => 'Adweladenn 2',
+'compare-submit' => 'Keñveriañ',
+'compare-invalid-title' => "Kamm eo an titl hoc'h eus merket.",
+'compare-title-not-exists' => "N'eus ket eus an titl spisaet ganeoc'h.",
+'compare-revision-not-exists' => "N'eus ket eus an adweladenn spisaet ganeoc'h.",
# Database error messages
'dberr-header' => 'Ur gudenn zo gant ar wiki-mañ',
@@ -3634,4 +3709,90 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
'sqlite-has-fts' => '$1 gant enklask eus an destenn a-bezh embreget',
'sqlite-no-fts' => '$1 hep enklask eus an destenn a-bezh embreget',
+# New logging system
+'logentry-delete-delete' => 'Diverket eo bet ar bajenn $3 gant $1',
+'logentry-delete-restore' => 'Assavet eo bet ar bajenn $3 gant $1',
+'logentry-delete-event' => "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
+'logentry-delete-revision' => 'Kemmet eo bet gwelusted {{PLURAL:$5|ur reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4',
+'logentry-delete-event-legacy' => 'Kemmet eo bet gwelusted darvoudoù ar marilh $3 gant $1',
+'logentry-delete-revision-legacy' => 'Kemmet eo bet gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
+'logentry-suppress-delete' => 'Diverket eo bet ar bajenn $3 gant $1',
+'logentry-suppress-event' => "Kemmet eo bet dre guzh gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
+'logentry-suppress-revision' => 'Kemmet eo bet dre guzh gwelusted {{PLURAL:$5|ur reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4',
+'logentry-suppress-event-legacy' => 'Kemmet eo bet dre guzh gwelusted darvoudoù ar marilh $3 gant $1',
+'logentry-suppress-revision-legacy' => 'Kemmet eo bet dre guzh gwelusted ar reizhadennoù war ar bajenn $3 gant $1',
+'revdelete-content-hid' => 'danvez kuzet',
+'revdelete-summary-hid' => 'kemmañ an diverrañ kuzhet',
+'revdelete-uname-hid' => 'anv implijer kuzhet',
+'revdelete-content-unhid' => 'danvez war wel',
+'revdelete-summary-unhid' => 'kemmañ an diverrañ zo war wel',
+'revdelete-uname-unhid' => 'anv implijer war wel',
+'revdelete-restricted' => 'Lakaat ar strishadurioù da dalvezout evit ar verourien',
+'revdelete-unrestricted' => 'dilemel ar strishadurioù evit ar verourien',
+'logentry-move-move' => '$1 kaset ar bajenn $3 da $4',
+'logentry-move-move-noredirect' => 'kaset ar bajenn $3 da $4 gant $1 hep adkas',
+'logentry-move-move_redir' => 'kaset ar bajenn $3 da $4 gant $1 dreist un adkas',
+'logentry-move-move_redir-noredirect' => 'kaset ar bajenn $3 da $4 gant $1 dreist un adkas hep lezel un adkas',
+'logentry-patrol-patrol' => 'Merket eo bet an adweladenn $4 eus ar bajenn $3 evel gwiriet gant $1',
+'logentry-patrol-patrol-auto' => 'Merket eo bet ent emgefre an adweladenn $4 eus ar bajenn $3 evel gwiriet gant $1',
+'logentry-newusers-newusers' => '$1 en deus krouet ur gont implijer',
+'logentry-newusers-create' => '$1 en deus krouet ur gont implijer',
+'logentry-newusers-create2' => '$1 en deus krouet ur gont implijer $3',
+'logentry-newusers-autocreate' => 'Krouet eo bet kont $1 ent emgefre',
+'newuserlog-byemail' => 'ger-tremen kaset dre bostel',
+
+# Feedback
+'feedback-bugornote' => "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [\$1 kemenn un draen].
+A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[\$3 \$2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
+'feedback-subject' => 'Danvez :',
+'feedback-message' => 'Kemennadenn:',
+'feedback-cancel' => 'Nullañ',
+'feedback-submit' => 'Kas ho soñj',
+'feedback-adding' => "Oc'h ouzhpennañ ho soñj war ar bajenn...",
+'feedback-error1' => "Fazi : disoc'h dianav a-berzh an API",
+'feedback-error2' => "Fazi : N'eus ket bet gallet degemer ar c'hemmoù",
+'feedback-error3' => 'Fazi : respont ebet a-berzh an API',
+'feedback-thanks' => 'Ho trugarekaat ! Postet eo bet hoc\'h evezhiadenn d\'ar bajenn "[$2 $1]".',
+'feedback-close' => 'Graet',
+'feedback-bugcheck' => "Eus ar c'hentañ ! Gwiriit mat n'emañ ket e-touez an [$1 draen diskoachet c'hoazh].",
+'feedback-bugnew' => 'Gwiriet em eus. Kemenn un draen nevez',
+
+# API errors
+'api-error-badaccess-groups' => "N'oc'h ket aotreet da enporzhiañ restroù war ar wiki-mañ.",
+'api-error-badtoken' => 'Fazi diabarzh : "jedouer" fall.',
+'api-error-copyuploaddisabled' => 'Diweredekaet eo an enporzhioù dre URL war ar servijer-mañ.',
+'api-error-duplicate' => "Bez' {{PLURAL:$1|ez eus [$2 restr all]|[$2 restr all]}} gant an hevelep danvez war al lec'hienn-mañ c'hoazh",
+'api-error-duplicate-archive' => "Bez' e oa {{PLURAL:$1|[$2 ur restr all]|[$2 restroù all]}} c'hoazh enno an hevelep danvez, nemet {{PLURAL:$1|eo bet diverket|int bet diverket}}.",
+'api-error-duplicate-archive-popup-title' => "Eilañ ar {{PLURAL:$1|restr|restroù}} zo bet diverket c'hoazh",
+'api-error-duplicate-popup-title' => 'Eilañ {{PLURAL:$1|ar restr|ar restroù}}',
+'api-error-empty-file' => "Ar restr hoc'h eus roet a oa goullo.",
+'api-error-emptypage' => "N'eo ket aotreet krouiñ pajennoù goullo.",
+'api-error-fetchfileerror' => 'Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask adtapout ar restr.',
+'api-error-file-too-large' => "Ar restr hoc'h eus roet a oa re vras.",
+'api-error-filename-tooshort' => 'Re verr eo anv ar restr.',
+'api-error-filetype-banned' => 'Difennet eo ar seurt restroù',
+'api-error-filetype-missing' => "Un astenn a vank d'ar restr.",
+'api-error-hookaborted' => "Ar c'hemm hoc'h eus klasket degas zo bet harzet gant ur c'hrog astenn.",
+'api-error-http' => "Fazi diabarzh : dibosupl kevreañ d'ar servijer.",
+'api-error-illegal-filename' => "N'eo ket aotreet anv ar restr.",
+'api-error-internal-error' => "Fazi diabarzh : aet ez eus un dra bennak a dreuz en ur dretiñ hoc'h enporzhiadenn war ar wiki.",
+'api-error-invalid-file-key' => "Fazi diabarzh : n'eo ket bet kavet ar restr er stokañ da c'hortoz.",
+'api-error-missingparam' => 'Fazi diabarzh : Arventennoù a vank er reked.',
+'api-error-missingresult' => 'Fazi diabarzh : dibosupl termeniñ hag eilet eo bet an traoù ervat.',
+'api-error-mustbeloggedin' => "Ret eo deoc'h bezañ kevreet evit pellgargañ restroù.",
+'api-error-mustbeposted' => 'Un draen a zo er poellad-mañ ; ne implij ket an hentenn HTTP ret.',
+'api-error-noimageinfo' => "Kaset eo bet ar pellgargañ ervat met n'eus ket bet roet tamm titour ebet deomp diwar-benn ar restr gant ar servijer",
+'api-error-nomodule' => 'Fazi diabarzh : tamm modulenn enporzhiañ ebet.',
+'api-error-ok-but-empty' => 'Fazi diabarzh : respont ebet a-berzh ar servijer.',
+'api-error-overwrite' => "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
+'api-error-stashfailed' => "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
+'api-error-timeout' => "N'eo ket bet ar servijer evit respont en termen lakaet.",
+'api-error-unclassified' => "C'hoarvezet ez eus ur gudenn dianav.",
+'api-error-unknown-code' => 'Fazi dianav : "$1"',
+'api-error-unknown-error' => 'Fazi diabarzh : aet ez eus un dra bennak a-dreuz en ur glask enporzhiañ ho restr.',
+'api-error-unknown-warning' => 'Kemenn diwall dianav : $1',
+'api-error-unknownerror' => 'Fazi dianav : "$1".',
+'api-error-uploaddisabled' => 'Diweredekaat eo an enporzh war ar wiki-mañ.',
+'api-error-verification-error' => 'Pe eo brein ar restr pe eo fall an astenn anezhi.',
+
);
diff --git a/languages/messages/MessagesBrh.php b/languages/messages/MessagesBrh.php
index db45883d..0caaa7f1 100644
--- a/languages/messages/MessagesBrh.php
+++ b/languages/messages/MessagesBrh.php
@@ -271,7 +271,6 @@ Ná radbadal ák deskáne atíko matano.",
'revdel-restore' => 'páşí e badal kar',
'revdel-restore-deleted' => 'mesok badaldroÅŸumk',
'revdel-restore-visible' => 'páş badaldroşumk',
-'revdelete-content' => 'niviÅŸt',
# Merge log
'revertmerge' => 'Jitá',
@@ -439,8 +438,7 @@ Ná radbadal ák deskáne atíko matano.",
'linksearch' => 'Darí gańđ',
# Special:Log/newusers
-'newuserlogpage' => 'Kárband joŕ kanning ná hisáb',
-'newuserlog-create-entry' => 'Púskun kárband pinváxubí',
+'newuserlogpage' => 'Kárband joŕ kanning ná hisáb',
# Special:ListGroupRights
'listgrouprights-members' => '(básk átá ridoband)',
@@ -471,7 +469,6 @@ Dá pakk kar ki ní dun kanning xuáisa, dáná pad án poh us, o ní dád [[{{M
'actionfailed' => 'Amal besob mass',
'deletedtext' => '"$1" mesingáne.
Zút áteaŧ mesing átá lekav kin $2 e ur.',
-'deletedarticle' => '"[[$1]]" mesingá',
'dellogpage' => 'Mesing ná hisáb',
'deletecomment' => 'Dalíl:',
'deleteotherreason' => 'Elo/pen dalíl:',
@@ -493,7 +490,6 @@ Zút áteaŧ mesing átá lekav kin $2 e ur.',
# Undelete
'undeletelink' => 'ur/aŕsa',
'undeleteviewlink' => 'ur',
-'undeletedarticle' => '"[[$1]]" ságí kanningá',
# Namespace form on various pages
'namespace' => 'Pin-jága:',
@@ -545,20 +541,18 @@ Zút áteaŧ mesing átá lekav kin $2 e ur.',
'block-log-flags-nocreate' => 'pinváxubí á rok xallingá',
# Move page
-'movearticle' => 'Panna e surif:',
-'newtitle' => 'Púskuná sarhál á:',
-'movepagebtn' => 'Panna e surif',
-'pagemovedsub' => 'Surifing sarsob mass',
-'movepage-moved' => '\'\'\'"$1" e "$2"\'\'\' á surifingáne',
-'articleexists' => 'Anná pin aná panna málav án sáŕí e, yá ná tiroká pin ravá aff.
+'movearticle' => 'Panna e surif:',
+'newtitle' => 'Púskuná sarhál á:',
+'movepagebtn' => 'Panna e surif',
+'pagemovedsub' => 'Surifing sarsob mass',
+'movepage-moved' => '\'\'\'"$1" e "$2"\'\'\' á surifingáne',
+'articleexists' => 'Anná pin aná panna málav án sáŕí e, yá ná tiroká pin ravá aff.
Pen pin as gicen kar.',
-'movedto' => 'dáng surifingá',
-'movetalk' => 'Aviŕda ģá ítgap panna e surif',
-'1movedto2' => '[[$1]] e [[$2]] á surifingá',
-'1movedto2_redir' => 'aŕseng aŧ [[$1]] e [[$2]] á danningá',
-'movelogpage' => 'Surifing ná hisáb',
-'movereason' => 'Dalíl:',
-'revertmove' => 'málav ná',
+'movedto' => 'dáng surifingá',
+'movetalk' => 'Aviŕda ģá ítgap panna e surif',
+'movelogpage' => 'Surifing ná hisáb',
+'movereason' => 'Dalíl:',
+'revertmove' => 'málav ná',
# Namespace 8 related
'allmessagesname' => 'Pin',
diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php
index 531194c3..bd07d7fb 100644
--- a/languages/messages/MessagesBs.php
+++ b/languages/messages/MessagesBs.php
@@ -54,6 +54,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'SvePoruke' ),
'Allpages' => array( 'SveStranice' ),
'Ancientpages' => array( 'NajstarijeStranice' ),
+ 'Badtitle' => array( 'Losnaslov' ),
'Blankpage' => array( 'PraznaStranica' ),
'Block' => array( 'BlokirajIP' ),
'Blockme' => array( 'BlokirajMe' ),
@@ -144,132 +145,132 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PREUSMJERI', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'TRENUTNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'TRENUTNIMJESEC1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'TRENUTNIMJESECIME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'TRENUTNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'TRENUTNIMJESECSKR', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'TRENUTNIDAN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'TRENUTNIDAN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'TRENUTNIDANIME', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TRENUTNAGODINA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'TRENUTNOVRIJEME', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'TRENUTNISAT', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALNIMJESEC1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKALNIMJESECIME', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKALNIMJESECIMEROD', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LOKALNIMJESECSKR', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALNOVRIJEME', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'BROJPROMJENA', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'STRANICA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'STRANICE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'PROSTORSUBJEKTA', 'PROSTORCLANAKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'PROSTORISUBJEKTA', 'PROSTORICLANKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'PUNOIMESTRANE', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'PUNOIMESTRANEE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'IMENAPODSTRANICE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'IMEBAZNESTRANICE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'IMENABAZNESTRANICE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'IMESTRANICERAZGOVORA', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'IMENASTRANICERAZGOVORA', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'IMESTRANICESUBKJEKTA', 'IMESTRANICECLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'IMENASTRANICESUBJEKTA', 'IMENASTRANICECLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'POR:', 'MSG:' ),
- 'subst' => array( '0', 'ZAMJENI:', 'SUBST:' ),
- 'msgnw' => array( '0', 'NVPOR:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'desno', 'd', 'right' ),
- 'img_left' => array( '1', 'lijevo', 'l', 'left' ),
- 'img_none' => array( '1', 'n', 'bez', 'none' ),
- 'img_width' => array( '1', '$1piksel', '$1p', '$1px' ),
- 'img_center' => array( '1', 'centar', 'c', 'center', 'centre' ),
- 'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bez_okvira', 'frameless' ),
- 'img_page' => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'granica', 'border' ),
- 'img_baseline' => array( '1', 'pocetna_linija', 'baseline' ),
- 'img_sub' => array( '1', 'odjeljak', 'sub' ),
- 'img_top' => array( '1', 'vrh', 'top' ),
- 'img_text_top' => array( '1', 'vrh_teksta', 'text-top' ),
- 'img_middle' => array( '1', 'sredina', 'middle' ),
- 'img_bottom' => array( '1', 'dugme', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekst-dugme', 'text-bottom' ),
- 'sitename' => array( '1', 'IMESAJTA', 'SITENAME' ),
- 'ns' => array( '0', 'IP:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALNAADRESA:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALNEADRESE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'IMESERVERA', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTA', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'POL:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__BEZTC__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'TRENUTNASEDMICA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'TRENUTNIDOV', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALNASEDMICA', 'LOCALWEEK' ),
- 'revisionid' => array( '1', 'IDREVIZIJE', 'REVISIONID' ),
- 'revisionday' => array( '1', 'REVIZIJEDANA', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'REVIZIJEDANA2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'REVIZIJAMJESECA', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'REVIZIJAGODINE', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'REVIZIJAVREMENSKOGPECATA', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'PUNURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'PUNURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'LCPRVI:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'UCPRVI:', 'UCFIRST:' ),
- 'displaytitle' => array( '1', 'POKAZINASLOV', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LINKNOVESEKCIJE__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'SADASNJAVERZIJA', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'DEKODIRAJADRESU', 'URLENCODE:' ),
- 'currenttimestamp' => array( '1', 'SADASNJIVREMENSKIPECAT', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKALNIVREMENSKIPECAT', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
- 'pagesinnamespace' => array( '1', 'STRANICEUIMENSKOMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'BROJADMINISTRATORA', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'NUMERICKIFORMAT', 'FORMATNUM' ),
- 'padleft' => array( '0', 'JASTUKLIJEVO', 'PADLEFT' ),
- 'padright' => array( '0', 'JASTUKDESNO', 'PADRIGHT' ),
- 'special' => array( '0', 'specijalno', 'special' ),
- 'filepath' => array( '0', 'STAZADATOTEKE:', 'FILEPATH:' ),
- 'tag' => array( '0', 'oznaka', 'tag' ),
- 'hiddencat' => array( '1', '__SAKRIVENAKATEGORIJA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'STRANICEUKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'VELICINASTRANICE', 'PAGESIZE' ),
- 'index' => array( '1', '__SADRZAJ__', '__INDEX__' ),
- 'noindex' => array( '1', '__BEZSADRZAJA__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'BROJUGRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__STATISTICNOPREUSMJERENJE__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVOZASTITE', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'PUTANJA', 'PATH' ),
- 'url_query' => array( '0', 'UPIT', 'QUERY' ),
+ 'redirect' => array( '0', '#PREUSMJERI', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'TRENUTNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'TRENUTNIMJESEC1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'TRENUTNIMJESECIME', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'TRENUTNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'TRENUTNIMJESECSKR', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'TRENUTNIDAN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'TRENUTNIDAN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'TRENUTNIDANIME', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TRENUTNAGODINA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'TRENUTNOVRIJEME', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'TRENUTNISAT', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALNIMJESEC1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKALNIMJESECIME', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKALNIMJESECIMEROD', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKALNIMJESECSKR', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALNOVRIJEME', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'BROJPROMJENA', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'STRANICA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'STRANICE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'PROSTORSUBJEKTA', 'PROSTORCLANAKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'PROSTORISUBJEKTA', 'PROSTORICLANKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'PUNOIMESTRANE', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'PUNOIMESTRANEE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'IMENAPODSTRANICE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'IMEBAZNESTRANICE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'IMENABAZNESTRANICE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'IMESTRANICERAZGOVORA', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'IMENASTRANICERAZGOVORA', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'IMESTRANICESUBKJEKTA', 'IMESTRANICECLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'IMENASTRANICESUBJEKTA', 'IMENASTRANICECLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'POR:', 'MSG:' ),
+ 'subst' => array( '0', 'ZAMJENI:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'NVPOR:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'desno', 'd', 'right' ),
+ 'img_left' => array( '1', 'lijevo', 'l', 'left' ),
+ 'img_none' => array( '1', 'n', 'bez', 'none' ),
+ 'img_width' => array( '1', '$1piksel', '$1p', '$1px' ),
+ 'img_center' => array( '1', 'centar', 'c', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bez_okvira', 'frameless' ),
+ 'img_page' => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'granica', 'border' ),
+ 'img_baseline' => array( '1', 'pocetna_linija', 'baseline' ),
+ 'img_sub' => array( '1', 'odjeljak', 'sub' ),
+ 'img_top' => array( '1', 'vrh', 'top' ),
+ 'img_text_top' => array( '1', 'vrh_teksta', 'text-top' ),
+ 'img_middle' => array( '1', 'sredina', 'middle' ),
+ 'img_bottom' => array( '1', 'dugme', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tekst-dugme', 'text-bottom' ),
+ 'sitename' => array( '1', 'IMESAJTA', 'SITENAME' ),
+ 'ns' => array( '0', 'IP:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALNAADRESA:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALNEADRESE:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'IMESERVERA', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTA', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'POL:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__BEZTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'TRENUTNASEDMICA', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'TRENUTNIDOV', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALNASEDMICA', 'LOCALWEEK' ),
+ 'revisionid' => array( '1', 'IDREVIZIJE', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'REVIZIJEDANA', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'REVIZIJEDANA2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'REVIZIJAMJESECA', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'REVIZIJAGODINE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'REVIZIJAVREMENSKOGPECATA', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PUNURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'PUNURLE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'LCPRVI:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'UCPRVI:', 'UCFIRST:' ),
+ 'displaytitle' => array( '1', 'POKAZINASLOV', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LINKNOVESEKCIJE__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'SADASNJAVERZIJA', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'DEKODIRAJADRESU', 'URLENCODE:' ),
+ 'currenttimestamp' => array( '1', 'SADASNJIVREMENSKIPECAT', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKALNIVREMENSKIPECAT', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+ 'pagesinnamespace' => array( '1', 'STRANICEUIMENSKOMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'BROJADMINISTRATORA', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'NUMERICKIFORMAT', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'JASTUKLIJEVO', 'PADLEFT' ),
+ 'padright' => array( '0', 'JASTUKDESNO', 'PADRIGHT' ),
+ 'special' => array( '0', 'specijalno', 'special' ),
+ 'filepath' => array( '0', 'STAZADATOTEKE:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'oznaka', 'tag' ),
+ 'hiddencat' => array( '1', '__SAKRIVENAKATEGORIJA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'STRANICEUKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'VELICINASTRANICE', 'PAGESIZE' ),
+ 'index' => array( '1', '__SADRZAJ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__BEZSADRZAJA__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'BROJUGRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STATISTICNOPREUSMJERENJE__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVOZASTITE', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'PUTANJA', 'PATH' ),
+ 'url_query' => array( '0', 'UPIT', 'QUERY' ),
);
$fallback8bitEncoding = "iso-8859-2";
@@ -635,21 +636,23 @@ Molimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] sa navođ
'badarticleerror' => 'Ova akcija ne može biti izvršena na ovoj stranici.',
'cannotdelete' => 'Ne može se obrisati stranica ili datoteka "$1".
Moguće je da ju je neko drugi već obrisao.',
+'cannotdelete-title' => 'Ne mogu izbrisati stranicu "$1"',
'badtitle' => 'Loš naslov',
'badtitletext' => 'Zahtjevani naslov stranice je bio neispravan, prazan ili neispravno povezan meÄ‘ujeziÄki ili interviki naslov.',
-'perfcached' => 'Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani.',
-'perfcachedts' => 'Slijedeći podaci se nalaze u memoriji i zadnji put su ažurirani $1.',
+'perfcached' => 'Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Slijedeći podaci se nalaze u memoriji i zadnji put su ažurirani $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ažuriranje ove stranice je iskljuÄeno.
Podaci koji se ovdje nalaze ne moraju biti aktuelni.',
'wrong_wfQuery_params' => 'NetaÄni parametri za wfQuery()<br />
Funkcija: $1<br />
Pretraga: $2',
'viewsource' => 'pogledaj kod',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Prikaz izvora stranice $1',
'actionthrottled' => 'Akcija je usporena',
'actionthrottledtext' => 'Kao anti-spam mjera, ograniÄene su vam izmjene u odreÄ‘enom vremenu, i trenutaÄno ste dostigli to ograniÄenje. PokuÅ¡ajte ponovo poslije nekoliko minuta.',
'protectedpagetext' => 'Ova stranica je zakljuÄana da bi se sprijeÄile izmjene.',
'viewsourcetext' => 'Možete vidjeti i kopirati izvorni tekst ove stranice:',
+'viewyourtext' => "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
'protectedinterface' => 'Ova stranica je zaštićena jer sadrži tekst MediaWiki programa.',
'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja sadrži aktivan tekst programa.
Promjene na ovoj stranici dovode i do promjena za druge korisnike.
@@ -751,6 +754,7 @@ Nijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.',
'emailconfirmlink' => 'Potvrdite Vašu e-mail adresu',
'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
+'cannotchangeemail' => 'Na ovom wikiju ne možete promijeniti e-mail adresu raÄuna.',
'accountcreated' => 'KorisniÄki raÄun je napravljen',
'accountcreatedtext' => 'KorisniÄki raÄun za $1 je napravljen.',
'createaccount-title' => 'Pravljenje korisniÄkog raÄuna za {{SITENAME}}',
@@ -767,6 +771,7 @@ Molimo Vas da saÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
# E-mail sending
'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
+'user-mail-no-addy' => 'Pokušaj slanja e-maila bez navedene e-mail adrese.',
# Change password dialog
'resetpass' => 'Promijeni korisniÄku Å¡ifru',
@@ -788,16 +793,18 @@ Možda ste već uspješno promijenili Vašu šifru ili ste tražili novu privrem
'resetpass-temp-password' => 'Privremena Å¡ifra:',
# Special:PasswordReset
-'passwordreset' => 'Poništavanje šifre',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vaÅ¡im detaljima raÄuna.',
-'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-username' => 'KorisniÄko ime:',
-'passwordreset-domain' => 'Domen:',
-'passwordreset-email' => 'E-mail adresa:',
-'passwordreset-emailtitle' => 'Detalji raÄuna na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Neto (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik VaÅ¡ih detalja raÄuna
+'passwordreset' => 'Poništavanje šifre',
+'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vaÅ¡im detaljima raÄuna.',
+'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-username' => 'KorisniÄko ime:',
+'passwordreset-domain' => 'Domen:',
+'passwordreset-capture' => 'Pogledati krajnji e-mail?',
+'passwordreset-capture-help' => 'Ako oznaÄite ovu kućicu, e-poruka (s privremenom lozinkom) će biti prikazana i poslata korisniku.',
+'passwordreset-email' => 'E-mail adresa:',
+'passwordreset-emailtitle' => 'Detalji raÄuna na {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Neto (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik VaÅ¡ih detalja raÄuna
za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|raÄun korisnika je|raÄuni korisnika su}}
povezani s ovom e-mail adresom:
@@ -807,7 +814,7 @@ $2
Trebate se prijaviti i odabrati novu Å¡ifru. Ako je neko drugi napravio ovaj
zahtjev, ili ako ste se sjetili VaÅ¡e poÄetne Å¡ifre, a ne želite je promijeniti,
možete zanemariti ovu poruku i nastaviti koristiti staru šifru.',
-'passwordreset-emailtext-user' => 'Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima VaÅ¡eg raÄuna za {{SITENAME}}
+'passwordreset-emailtext-user' => 'Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima VaÅ¡eg raÄuna za {{SITENAME}}
($4). Sljedeći {{PLURAL:$3|korisniÄki raÄun je|korisniÄki raÄuni su}} povezani s ovom e-mail adresom:
$2
@@ -816,9 +823,22 @@ $2
Trebate se prijaviti i odabrati novu Å¡ifru. Ako je neko drugi napravio ovaj
zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti,
možete zanemariti ovu poruku i nastaviti koristiti staru šifru.',
-'passwordreset-emailelement' => 'KorisniÄko ime: $1
+'passwordreset-emailelement' => 'KorisniÄko ime: $1
Privremena Å¡ifra: $2',
-'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
+'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
+'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',
+
+# Special:ChangeEmail
+'changeemail' => 'Promijeni e-mail adresu',
+'changeemail-header' => 'Promijeni e-mail adresu korisniÄkog raÄuna',
+'changeemail-text' => 'Ispunite ovaj formular da biste promijenili svoju e-mail adresu. Morat ćete upisati svoj pasvord da potvrdite ovu promjenu.',
+'changeemail-no-info' => 'Morate biti prijavljeni za direktan pristup ovoj stranici.',
+'changeemail-oldemail' => 'Trenutna e-mail adresa:',
+'changeemail-newemail' => 'Nova e-mail adresa:',
+'changeemail-none' => '(ništa)',
+'changeemail-submit' => 'Promijeni e-mail',
+'changeemail-cancel' => 'Otkaži',
# Edit page toolbar
'bold_sample' => 'Podebljan tekst',
@@ -890,9 +910,6 @@ Zapamtite da ne možete koristiti opciju "pošalji e-mail ovom korisniku" sve do
Vaša trenutna IP adresa je $3, a ID blokade je $5.
Molimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.',
'blockednoreason' => 'razlog nije naveden',
-'blockedoriginalsource' => "Izvor '''$1''' je prikazan ispod:",
-'blockededitsource' => "Sadržaj '''vaših izmjena''' na '''$1''' je prikazan ispod:",
-'whitelistedittitle' => 'Obavezno je prijavljivanje za uređivanje',
'whitelistedittext' => 'Da bi ste uređivali stranice, morate se $1.',
'confirmedittext' => 'Morate potvrditi VaÅ¡u e-mail adresu prije nego poÄnete mijenjati stranice.
Molimo da postavite i verifikujete VaÅ¡u e-mail adresu putem VaÅ¡ih [[Special:Preferences|korisniÄkih opcija]].',
@@ -1152,8 +1169,6 @@ Drugi administratori projekta {{SITENAME}} će i dalje moći pristupiti sakriven
'revdelete-unsuppress' => 'Ukloni ograniÄenja na vraćenim revizijama',
'revdelete-log' => 'Razlog:',
'revdelete-submit' => 'Primijeni na odabrane {{PLURAL:$1|reviziju|revizije}}',
-'revdelete-logentry' => 'promijenjena vidljivost revizije [[$1]]',
-'logdelete-logentry' => 'promijenjena vidljivost događaja [[$1]]',
'revdelete-success' => "'''Vidljivost revizije uspješno ažurirana.'''",
'revdelete-failure' => "'''Vidljivost revizije nije mogla biti ažurirana:'''
$1",
@@ -1165,15 +1180,6 @@ $1",
'revdel-restore-visible' => 'vidljive revizije',
'pagehist' => 'Historija stranice',
'deletedhist' => 'Izbrisana historija',
-'revdelete-content' => 'sadržaj',
-'revdelete-summary' => 'sažetak',
-'revdelete-uname' => 'korisniÄko ime',
-'revdelete-restricted' => 'primijenjena ograniÄenja za administratore',
-'revdelete-unrestricted' => 'uklonjena ograniÄenja za administratore',
-'revdelete-hid' => 'sakrij $1',
-'revdelete-unhid' => 'otkrij $1',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|izmjenu|izmjene|izmjena}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|događaj|događaja}}',
'revdelete-hide-current' => 'Greška pri sakrivanju stavke od $2, $1: ovo je trenutna revizija.
Ne može biti sakrivena.',
'revdelete-show-no-access' => 'GreÅ¡ka pri prikazivanju stavke od $2, $1: ova stavka je oznaÄena kao "zaÅ¡tićena".
@@ -1329,12 +1335,14 @@ PokuÅ¡ajte u VaÅ¡ upit ukljuÄiti prefiks ''all:'' da bi ste pretražili sav sad
'prefs-rc' => 'Podešavanja nedavnih izmjena',
'prefs-watchlist' => 'Moji praćeni Älanci',
'prefs-watchlist-days' => 'Broj dana za prikaz u spisku praćenja:',
-'prefs-watchlist-days-max' => 'Najviše 7 dana',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|dan|dana}}',
'prefs-watchlist-edits' => 'Najveći broj izmjena za prikaz u proširenom spisku praćenja:',
'prefs-watchlist-edits-max' => 'Najveći broj: 1000',
'prefs-watchlist-token' => 'Token spiska za praćenje:',
'prefs-misc' => 'Ostala podešavanja',
'prefs-resetpass' => 'Promijeni Å¡ifru',
+'prefs-changeemail' => 'Promijeni e-mail adresu',
+'prefs-setemail' => 'Postavite e-mail adresu',
'prefs-email' => 'E-mail opcije',
'prefs-rendering' => 'Izgled',
'saveprefs' => 'SaÄuvajte podeÅ¡avanja',
@@ -1529,13 +1537,13 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'right-autopatrol' => 'Vlastite izmjene se automatski oznaÄavaju kao patrolirane',
'right-patrolmarks' => 'Pregled oznaka patroliranja u spisku nedavnih izmjena',
'right-unwatchedpages' => 'Gledanje spiska nepraćenih stranica',
-'right-trackback' => "Slanje ''trackbacka''",
'right-mergehistory' => 'Spajanje historije stranica',
'right-userrights' => 'UreÄ‘ivanje svih korisniÄkih prava',
'right-userrights-interwiki' => 'UreÄ‘ivanje korisniÄkih prava korisnika na drugim wikijima',
'right-siteadmin' => 'ZakljuÄavanje i otkljuÄavanje baze podataka',
'right-override-export-depth' => 'Izvoz stranica ukljuÄujući povezane stranice do dubine od 5 linkova',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
+'right-passwordreset' => 'Poništavanje šifre korisnika ([[Special:PasswordReset|posebna stranica]])',
# User rights log
'rightslog' => 'Zapisnik korisniÄkih prava',
@@ -1574,7 +1582,6 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'action-patrol' => 'oznaÄite izmjene drugih kao patrolirane',
'action-autopatrol' => 'da VaÅ¡e izmjene budu oznaÄene kao patrolirane',
'action-unwatchedpages' => 'pregledate spisak nepraćenih stranica',
-'action-trackback' => "pošaljete ''trackback''",
'action-mergehistory' => 'spajate historiju ove stranice',
'action-userrights' => 'ureÄ‘ujete sva korisniÄka prava',
'action-userrights-interwiki' => 'ureÄ‘ujete korisniÄka prava korisnika na drugim wikijima',
@@ -1771,6 +1778,10 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
'upload-unknown-size' => 'Nepoznata veliÄina',
'upload-http-error' => 'Desila se HTTP greška: $1',
+# File backend
+'backend-fail-notexists' => 'Datoteka $1 ne postoji.',
+'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Desila se greška pri otvaranju datoteke za provjere ZIP-a.',
'zip-wrong-format' => 'Navedena datoteka ni bila ZIP datoteka.',
@@ -1896,23 +1907,24 @@ Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
'filerevert-badversion' => 'Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.',
# File deletion
-'filedelete' => 'Obriši $1',
-'filedelete-legend' => 'Obriši datoteku',
-'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
-'filedelete-intro-old' => "Brišete verziju datoteke '''[[Media:$1|$1]]''' od [$4 $3, $2].",
-'filedelete-comment' => 'Razlog:',
-'filedelete-submit' => 'Obriši',
-'filedelete-success' => "'''$1''' je obrisano.",
-'filedelete-success-old' => "Verzija datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
-'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Ne postoji arhivirana verzija '''$1''' sa navedenim atributima.",
-'filedelete-otherreason' => 'Ostali/dodatni razlozi:',
-'filedelete-reason-otherlist' => 'Ostali razlozi',
-'filedelete-reason-dropdown' => '*UobiÄajeni razlozi brisanja
+'filedelete' => 'Obriši $1',
+'filedelete-legend' => 'Obriši datoteku',
+'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
+'filedelete-intro-old' => "Brišete verziju datoteke '''[[Media:$1|$1]]''' od [$4 $3, $2].",
+'filedelete-comment' => 'Razlog:',
+'filedelete-submit' => 'Obriši',
+'filedelete-success' => "'''$1''' je obrisano.",
+'filedelete-success-old' => "Verzija datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
+'filedelete-nofile' => "'''$1''' ne postoji.",
+'filedelete-nofile-old' => "Ne postoji arhivirana verzija '''$1''' sa navedenim atributima.",
+'filedelete-otherreason' => 'Ostali/dodatni razlozi:',
+'filedelete-reason-otherlist' => 'Ostali razlozi',
+'filedelete-reason-dropdown' => '*UobiÄajeni razlozi brisanja
** Kršenje autorskih prava
** Datoteka dvojnik',
-'filedelete-edit-reasonlist' => 'Uredi razloge brisanja',
-'filedelete-maintenance' => 'Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.',
+'filedelete-edit-reasonlist' => 'Uredi razloge brisanja',
+'filedelete-maintenance' => 'Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.',
+'filedelete-maintenance-title' => 'Ne mogu da obrišem datoteku',
# MIME search
'mimesearch' => 'MIME pretraga',
@@ -2019,6 +2031,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
'mostimages' => 'Najviše linkovane slike',
'mostrevisions' => 'Članci sa najviše izmjena',
'prefixindex' => 'Sve stranice sa prefiksom',
+'prefixindex-namespace' => 'Sve stranice s predmetkom (imenski prostor $1)',
'shortpages' => 'Kratke stranice',
'longpages' => 'DugaÄke stranice',
'deadendpages' => 'Stranice bez internih veza',
@@ -2035,7 +2048,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
'listusers-editsonly' => 'Pokaži samo korisnike koji su uređivali',
'listusers-creationsort' => 'Sortiraj po datumu pravljenja',
'usereditcount' => '$1 {{PLURAL:$1|izmjena|izmjene}}',
-'usercreated' => 'Napravljeno dana $1 u $2',
+'usercreated' => '{{GENDER:$3|Napravio|Napravila}} dana $1 u $2',
'newpages' => 'Nove stranice',
'newpages-username' => 'KorisniÄko ime:',
'ancientpages' => 'Najstarije stranice',
@@ -2129,12 +2142,8 @@ Podržani protokoli: <tt>$1</tt>',
'activeusers-noresult' => 'Nije pronađen korisnik.',
# Special:Log/newusers
-'newuserlogpage' => 'Zapis novih korisnika',
-'newuserlogpagetext' => 'Ovo je zapis o registraciji novih korisnika.',
-'newuserlog-byemail' => 'Å¡ifra je poslana putem e-maila',
-'newuserlog-create-entry' => 'Novi korisnik',
-'newuserlog-create2-entry' => 'napravljen novi raÄun za $1',
-'newuserlog-autocreate-entry' => 'RaÄun napravljen automatski',
+'newuserlogpage' => 'Zapis novih korisnika',
+'newuserlogpagetext' => 'Ovo je zapis o registraciji novih korisnika.',
# Special:ListGroupRights
'listgrouprights' => 'Prava korisniÄkih grupa',
@@ -2286,8 +2295,6 @@ Molim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu
'actionfailed' => 'Akcija nije uspjela',
'deletedtext' => 'ÄŒlanak "$1" je obrisan.
Pogledajte $2 za zapis o skorašnjim brisanjima.',
-'deletedarticle' => 'obrisan "[[$1]]"',
-'suppressedarticle' => 'promijeni vidljivost od "[[$1]]"',
'dellogpage' => 'Protokol brisanja',
'dellogpagetext' => 'Ispod je spisak najskorijih brisanja.',
'deletionlog' => 'zapis brisanja',
@@ -2334,6 +2341,7 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled tr
'unprotectedarticle' => 'uklonjena zaštita za "[[$1]]"',
'movedarticleprotection' => 'podešavanja zaštite premještena sa "[[$2]]" na "[[$1]]"',
'protect-title' => 'Zaštićuje se "$1"',
+'protect-title-notallowed' => 'Pregled stepena zaštite za "$1"',
'prot_1movedto2' => 'Älanak [[$1]] premjeÅ¡ten na [[$2]]',
'protect-legend' => 'Potvrdite zaštitu',
'protectcomment' => 'Razlog:',
@@ -2356,6 +2364,7 @@ Možete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenos
'protect-level-sysop' => 'Samo administratori',
'protect-summary-cascade' => 'prenosna zaštita',
'protect-expiring' => 'istiÄe $1 (UTC)',
+'protect-expiring-local' => 'istiÄe $1',
'protect-expiry-indefinite' => 'neograniÄeno',
'protect-cascade' => 'ZaÅ¡titi sve stranice koje su ukljuÄene u ovu (kaskadna zaÅ¡tita)',
'protect-cantedit' => 'Ne možete mijenjati nivo zaštite ove stranice, jer nemate prava da je uređujete.',
@@ -2414,7 +2423,6 @@ Možda ste unijeli pogrešan link, ili je revizija vraćena ili uklonjena iz arh
'undeletereset' => 'OÄisti',
'undeleteinvert' => 'Izmijeni odabir',
'undeletecomment' => 'Razlog:',
-'undeletedarticle' => 'vraćeno "$1"',
'undeletedrevisions' => '{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno',
'undeletedfiles' => '{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
@@ -2424,6 +2432,7 @@ neko drugi je već vratio ovu stranicu.',
Provjerite [[Special:Log/delete|zapis brisanja]] za zapise najskorijih brisanja i vraćanja.",
'undelete-header' => 'Pogledajte [[Special:Log/delete|zapisnik brisanja]] za nedavno obrisane stranice.',
+'undelete-search-title' => 'Pretraga obrisanih stranica',
'undelete-search-box' => 'Pretraga obrisanih stranica',
'undelete-search-prefix' => 'Prikaži stranice koje poÄinju sa:',
'undelete-search-submit' => 'Traži',
@@ -2433,6 +2442,7 @@ Provjerite [[Special:Log/delete|zapis brisanja]] za zapise najskorijih brisanja
'undelete-cleanup-error' => 'Greške pri brisanju nekorištene arhivske datoteke "$1".',
'undelete-missing-filearchive' => 'Ne može se vratiti arhivska datoteka sa ID oznakom $1 jer nije u bazi podataka.
Možda je već ranije vraćena.',
+'undelete-error' => 'Greška u vraćanju obrisane stranice',
'undelete-error-short' => 'Greška pri vraćanju datoteke: $1',
'undelete-error-long' => 'Desile su se pogreške pri vraćanju datoteke:
@@ -2575,6 +2585,7 @@ ili korisniÄkom imenu.',
'unblocklink' => 'deblokiraj',
'change-blocklink' => 'promijeni blokadu',
'contribslink' => 'doprinosi',
+'emaillink' => 'pošalji e-mail',
'autoblocker' => 'Automatski ste blokirani jer dijelite IP adresu sa "[[User:$1|$1]]".
Razlog za blokiranje je korisnika $1 je: \'\'$2\'\'',
'blocklogpage' => 'Evidencija blokiranja',
@@ -2710,9 +2721,6 @@ stranica za razgovor nije mogla biti premještena jer takva već postoji na novo
'movepage-page-moved' => 'Stranica $1 je premještena na $2.',
'movepage-page-unmoved' => 'Stranica $1 ne može biti premještena na $2.',
'movepage-max-pages' => 'Maksimum od $1 {{PLURAL:$1|stranice|stranice|stranica}} je premješteno i više nije moguće premjestiti automatski.',
-'1movedto2' => 'Älanak [[$1]] premjeÅ¡ten na [[$2]]',
-'1movedto2_redir' => 'stranica [[$1]] premještena u stranicu [[$2]] putem preusmjerenja',
-'move-redirect-suppressed' => 'preusmjeravanje onemogućeno',
'movelogpage' => 'Protokol premještanja',
'movelogpagetext' => 'Ispod je spisak stranica koje su premještene.',
'movesubpage' => '{{PLURAL:$1|Podstranica|Podstranice}}',
@@ -2755,9 +2763,11 @@ Ovo se može uvesti u drugi wiki koristeći MediaWiki preko [[Special:Import|str
Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i oznaÄite želite li trenutnu verziju zajedno sa svim ranijim, ili samo trenutnu verziju sa informacijom o zadnjoj promjeni.
U drugom sluÄaju možete koristiti i vezu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Izvezi sve stranice',
'exportcuronly' => 'UkljuÄite samo trenutnu reviziju, ne cijelu historiju',
'exportnohistory' => "----
'''Pažnja:''' Izvoz cjelokupne historije stranica preko ovog obrasca je onemogućeno iz tehniÄkih razloga.",
+'exportlistauthors' => 'UkljuÄi cjelokupan spisak doprinosilaca za svaku stranicu',
'export-submit' => 'Izvezi',
'export-addcattext' => 'Dodaj stranice iz kategorije:',
'export-addcat' => 'Dodaj',
@@ -2790,6 +2800,7 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
'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',
'thumbnail_invalid_params' => 'Pogrešne postavke smanjenog prikaza',
'thumbnail_dest_directory' => 'Ne može se napraviti odredišni folder',
'thumbnail_image-type' => 'Tip slike nije podržan',
@@ -2846,73 +2857,78 @@ Nedostaje privremeni folder.',
'import-logentry-interwiki' => "uveženo (''transwikied'') $1",
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizija|revizije|revizija}} od $2',
+# JavaScriptTest
+'javascripttest-qunit-intro' => 'Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'VaÅ¡a korisniÄka stranica',
-'tooltip-pt-anonuserpage' => 'KorisniÄka stranica za ip koju Vi ureÄ‘ujete kao',
-'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
-'tooltip-pt-anontalk' => 'Razgovor o doprinosu sa ove IP adrese',
-'tooltip-pt-preferences' => 'Moja podešavanja',
-'tooltip-pt-watchlist' => 'Spisak Älanaka koje pratite.',
-'tooltip-pt-mycontris' => 'Spisak vašeg doprinosa',
-'tooltip-pt-login' => 'Predlažemo da se prijavite, ali nije obvezno.',
-'tooltip-pt-anonlogin' => 'Prijava nije obavezna, ali donosi mnogo koristi.',
-'tooltip-pt-logout' => 'Odjava sa projekta {{SITENAME}}',
-'tooltip-ca-talk' => 'Razgovor o sadržaju',
-'tooltip-ca-edit' => 'Možete da ureÄ‘ujete ovaj Älanak. Molimo Vas, koristite dugme "Prikaži izgled',
-'tooltip-ca-addsection' => 'ZapoÄnite novu sekciju.',
-'tooltip-ca-viewsource' => 'Ovaj Älanak je zakljuÄan. Možete ga samo vidjeti ili kopirati kod.',
-'tooltip-ca-history' => 'Prethodne verzije ove stranice.',
-'tooltip-ca-protect' => 'Zaštitite stranicu od budućih izmjena',
-'tooltip-ca-unprotect' => 'Promijeni zaštitu za ovu stranicu',
-'tooltip-ca-delete' => 'Izbrišite ovu stranicu',
-'tooltip-ca-undelete' => 'Vratite izmjene koje su naÄinjene prije brisanja stranice',
-'tooltip-ca-move' => 'Pomjerite stranicu',
-'tooltip-ca-watch' => 'Dodajte stranicu u listu praćnih Älanaka',
-'tooltip-ca-unwatch' => 'IzbriÅ¡ite stranicu sa liste praćnih Älanaka',
-'tooltip-search' => 'Pretraži projekat {{SITENAME}}',
-'tooltip-search-go' => 'Idi na stranicu sa taÄno ovim imenom ako postoji',
-'tooltip-search-fulltext' => 'Pretraga stranica sa ovim tekstom',
-'tooltip-p-logo' => 'Glavna stranica',
-'tooltip-n-mainpage' => 'Posjetite poÄetnu stranicu',
-'tooltip-n-mainpage-description' => 'Posjetite poÄetnu stranicu',
-'tooltip-n-portal' => 'O projektu, šta možete da uradite, gdje se šta nalazi',
-'tooltip-n-currentevents' => 'Podaci o onome na Äemu se trenutno radi',
-'tooltip-n-recentchanges' => 'Spisak nedavnih izmjena na wiki.',
-'tooltip-n-randompage' => 'Otvorite sluÄajan Älanak',
-'tooltip-n-help' => 'Mjesto gdje možete neÅ¡to da nauÄite.',
-'tooltip-t-whatlinkshere' => 'Spisak svih Älanaka koji su povezani sa ovim',
-'tooltip-t-recentchangeslinked' => 'Nedavne izmjene na stranicama koje su povezane sa ovom',
-'tooltip-feed-rss' => 'RSS za ovu stranicu',
-'tooltip-feed-atom' => 'Atom za ovu stranicu',
-'tooltip-t-contributions' => 'Pogledajte spisak doprinosa ovog korisnika',
-'tooltip-t-emailuser' => 'Pošaljite pismo ovom korisniku',
-'tooltip-t-upload' => 'Postavi slike i druge medije',
-'tooltip-t-specialpages' => 'Spisak svih posebnih stranica',
-'tooltip-t-print' => 'Verzija ove stranice za Å¡tampanje',
-'tooltip-t-permalink' => 'Stalni link ove verzije stranice',
-'tooltip-ca-nstab-main' => 'Pogledajte sadržaj Älanka',
-'tooltip-ca-nstab-user' => 'Pogledajte korisniÄku stranicu',
-'tooltip-ca-nstab-media' => 'Pogledajte medija fajl',
-'tooltip-ca-nstab-special' => 'Ovo je specijalna stranica i zato je ne možete uređivati',
-'tooltip-ca-nstab-project' => 'Pogledajte projekat stranicu',
-'tooltip-ca-nstab-image' => 'Pogledajte stranicu slike',
-'tooltip-ca-nstab-mediawiki' => 'Pogledajte sistemsku poruku',
-'tooltip-ca-nstab-template' => 'Pogledajte Å¡ablon',
-'tooltip-ca-nstab-help' => 'Pogledajte stranicu za pomoć',
-'tooltip-ca-nstab-category' => 'Pogledajte stranicu kategorije',
-'tooltip-minoredit' => 'NaznaÄite da se radi o maloj izmjeni',
-'tooltip-save' => 'SaÄuvajte VaÅ¡e izmjene',
-'tooltip-preview' => 'Pregledajte VaÅ¡e izmjene; molimo Vas da koristite ovo prije nego Å¡to saÄuvate stranicu!',
-'tooltip-diff' => 'Prikaži moje izmjene u tekstu.',
-'tooltip-compareselectedversions' => 'Pogledajte pazlike između dvije selektovane verzije ove stranice.',
-'tooltip-watch' => 'Dodajte ovu stranicu na VaÅ¡ spisak praćenih Älanaka',
-'tooltip-recreate' => 'Ponovno pravljenje stranice iako je već brisana',
-'tooltip-upload' => 'ZapoÄni postavljanje',
-'tooltip-rollback' => 'Brzo vraćanje izmjene(izmjena) ove stranice posljednjeg ureÄ‘ivaÄa jednim klikom.',
-'tooltip-undo' => 'Vraća posljednju izmjenu i otvara formu za uređivanje u modu pregleda.
+'tooltip-pt-userpage' => 'VaÅ¡a korisniÄka stranica',
+'tooltip-pt-anonuserpage' => 'KorisniÄka stranica za ip koju Vi ureÄ‘ujete kao',
+'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
+'tooltip-pt-anontalk' => 'Razgovor o doprinosu sa ove IP adrese',
+'tooltip-pt-preferences' => 'Moja podešavanja',
+'tooltip-pt-watchlist' => 'Spisak Älanaka koje pratite.',
+'tooltip-pt-mycontris' => 'Spisak vašeg doprinosa',
+'tooltip-pt-login' => 'Predlažemo da se prijavite, ali nije obvezno.',
+'tooltip-pt-anonlogin' => 'Prijava nije obavezna, ali donosi mnogo koristi.',
+'tooltip-pt-logout' => 'Odjava sa projekta {{SITENAME}}',
+'tooltip-ca-talk' => 'Razgovor o sadržaju',
+'tooltip-ca-edit' => 'Možete da ureÄ‘ujete ovaj Älanak. Molimo Vas, koristite dugme "Prikaži izgled',
+'tooltip-ca-addsection' => 'ZapoÄnite novu sekciju.',
+'tooltip-ca-viewsource' => 'Ovaj Älanak je zakljuÄan. Možete ga samo vidjeti ili kopirati kod.',
+'tooltip-ca-history' => 'Prethodne verzije ove stranice.',
+'tooltip-ca-protect' => 'Zaštitite stranicu od budućih izmjena',
+'tooltip-ca-unprotect' => 'Promijeni zaštitu za ovu stranicu',
+'tooltip-ca-delete' => 'Izbrišite ovu stranicu',
+'tooltip-ca-undelete' => 'Vratite izmjene koje su naÄinjene prije brisanja stranice',
+'tooltip-ca-move' => 'Pomjerite stranicu',
+'tooltip-ca-watch' => 'Dodajte stranicu u listu praćnih Älanaka',
+'tooltip-ca-unwatch' => 'IzbriÅ¡ite stranicu sa liste praćnih Älanaka',
+'tooltip-search' => 'Pretraži projekat {{SITENAME}}',
+'tooltip-search-go' => 'Idi na stranicu sa taÄno ovim imenom ako postoji',
+'tooltip-search-fulltext' => 'Pretraga stranica sa ovim tekstom',
+'tooltip-p-logo' => 'Glavna stranica',
+'tooltip-n-mainpage' => 'Posjetite poÄetnu stranicu',
+'tooltip-n-mainpage-description' => 'Posjetite poÄetnu stranicu',
+'tooltip-n-portal' => 'O projektu, šta možete da uradite, gdje se šta nalazi',
+'tooltip-n-currentevents' => 'Podaci o onome na Äemu se trenutno radi',
+'tooltip-n-recentchanges' => 'Spisak nedavnih izmjena na wiki.',
+'tooltip-n-randompage' => 'Otvorite sluÄajan Älanak',
+'tooltip-n-help' => 'Mjesto gdje možete neÅ¡to da nauÄite.',
+'tooltip-t-whatlinkshere' => 'Spisak svih Älanaka koji su povezani sa ovim',
+'tooltip-t-recentchangeslinked' => 'Nedavne izmjene na stranicama koje su povezane sa ovom',
+'tooltip-feed-rss' => 'RSS za ovu stranicu',
+'tooltip-feed-atom' => 'Atom za ovu stranicu',
+'tooltip-t-contributions' => 'Pogledajte spisak doprinosa ovog korisnika',
+'tooltip-t-emailuser' => 'Pošaljite pismo ovom korisniku',
+'tooltip-t-upload' => 'Postavi slike i druge medije',
+'tooltip-t-specialpages' => 'Spisak svih posebnih stranica',
+'tooltip-t-print' => 'Verzija ove stranice za Å¡tampanje',
+'tooltip-t-permalink' => 'Stalni link ove verzije stranice',
+'tooltip-ca-nstab-main' => 'Pogledajte sadržaj Älanka',
+'tooltip-ca-nstab-user' => 'Pogledajte korisniÄku stranicu',
+'tooltip-ca-nstab-media' => 'Pogledajte medija fajl',
+'tooltip-ca-nstab-special' => 'Ovo je specijalna stranica i zato je ne možete uređivati',
+'tooltip-ca-nstab-project' => 'Pogledajte projekat stranicu',
+'tooltip-ca-nstab-image' => 'Pogledajte stranicu slike',
+'tooltip-ca-nstab-mediawiki' => 'Pogledajte sistemsku poruku',
+'tooltip-ca-nstab-template' => 'Pogledajte Å¡ablon',
+'tooltip-ca-nstab-help' => 'Pogledajte stranicu za pomoć',
+'tooltip-ca-nstab-category' => 'Pogledajte stranicu kategorije',
+'tooltip-minoredit' => 'NaznaÄite da se radi o maloj izmjeni',
+'tooltip-save' => 'SaÄuvajte VaÅ¡e izmjene',
+'tooltip-preview' => 'Pregledajte VaÅ¡e izmjene; molimo Vas da koristite ovo prije nego Å¡to saÄuvate stranicu!',
+'tooltip-diff' => 'Prikaži moje izmjene u tekstu.',
+'tooltip-compareselectedversions' => 'Pogledajte pazlike između dvije selektovane verzije ove stranice.',
+'tooltip-watch' => 'Dodajte ovu stranicu na VaÅ¡ spisak praćenih Älanaka',
+'tooltip-watchlistedit-normal-submit' => 'Ukloni naslove',
+'tooltip-watchlistedit-raw-submit' => 'Ažuriraj spisak praćenja',
+'tooltip-recreate' => 'Ponovno pravljenje stranice iako je već brisana',
+'tooltip-upload' => 'ZapoÄni postavljanje',
+'tooltip-rollback' => 'Brzo vraćanje izmjene(izmjena) ove stranice posljednjeg ureÄ‘ivaÄa jednim klikom.',
+'tooltip-undo' => 'Vraća posljednju izmjenu i otvara formu za uređivanje u modu pregleda.
Dopušta unos razloga u sažetak.',
-'tooltip-preferences-save' => 'SaÄuvaj podeÅ¡avanja',
-'tooltip-summary' => 'Unesite kratki sažetak',
+'tooltip-preferences-save' => 'SaÄuvaj podeÅ¡avanja',
+'tooltip-summary' => 'Unesite kratki sažetak',
# Stylesheets
'common.css' => '/* CSS umetnut ovdje primijenit će se na sve skinove */',
@@ -2999,9 +3015,6 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
# Patrol log
'patrol-log-page' => 'Zapisnik patroliranja',
'patrol-log-header' => 'Ovdje se nalazi zapis patroliranih revizija.',
-'patrol-log-line' => 'oznaÄeno $1 od $2 patrolirano $3',
-'patrol-log-auto' => '(automatsko)',
-'patrol-log-diff' => 'revizija $1',
'log-show-hide-patrol' => '$1 zapis patroliranja',
# Image deletion
@@ -3027,11 +3040,11 @@ $1',
'file-info' => 'veliÄina datoteke: $1, MIME tip: $2',
'file-info-size' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME tip: $4',
'file-info-size-pages' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}',
-'file-nohires' => '<small>Veća rezolucija nije dostupna.</small>',
+'file-nohires' => 'Veća rezolucija nije dostupna.',
'svg-long-desc' => 'SVG fajl, dozvoljeno $1 × $2 piksela, veliÄina fajla: $3',
'show-big-image' => 'Vidi sliku u punoj veliÄini (rezoluciji)',
-'show-big-image-preview' => '<small>VeliÄina ovog prikaza: $1.</small>',
-'show-big-image-other' => '<small>Ostale rezolucije: $1.</small>',
+'show-big-image-preview' => 'VeliÄina ovog prikaza: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.',
'show-big-image-size' => '$1 × $2 piksela',
'file-info-gif-looped' => 'stalno iznova',
'file-info-gif-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄice|sliÄica}}',
@@ -3051,6 +3064,13 @@ $1',
'bydate' => 'po datumu',
'sp-newimages-showfrom' => 'Prikaz novih datoteka poÄev od $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekunde|$1 sekundi}}',
+'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}}',
+'ago' => 'prije $1',
+
# Bad image list
'bad_image_list' => "Koristi se sljedeći format:
@@ -3543,13 +3563,6 @@ Ovaj kod za potvrdu će isteći u $4.',
'scarytranscludefailed' => '[Neuspješno preusmjerenje šablona na $1]',
'scarytranscludetoolong' => '[URL je predugaÄak]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks za ovu stranicu:<br />
-$1',
-'trackbackremove' => '([$1 Brisanje])',
-'trackbacklink' => 'Vraćanje',
-'trackbackdeleteok' => 'Trackback je uspješno obrisan.',
-
# Delete conflict
'deletedwhileediting' => "'''Upozorenje''': Ova stranica je obrisana prije nego Å¡to ste poÄeli ureÄ‘ivati!",
'confirmrecreate' => "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovaj Älanak poÅ¡to ste poÄeli ureÄ‘ivanje sa razlogom:
@@ -3698,6 +3711,7 @@ TakoÄ‘er možete [[Special:EditWatchlist|koristiti standardni ureÄ‘ivaÄ]].',
'hebrew-calendar-m12-gen' => 'Elul',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])',
'timezone-utc' => 'KSV',
# Core parser functions
@@ -3755,8 +3769,7 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'specialpages' => 'Posebne stranice',
'specialpages-note' => '----
* Normalne posebne stranice.
-* <strong class="mw-specialpagerestricted">Zaštićene posebne stranice.</strong>
-* <span class="mw-specialpagecached">Samo keširane posebne stranice.</span>',
+* <strong class="mw-specialpagerestricted">Zaštićene posebne stranice.</strong>',
'specialpages-group-maintenance' => 'Izvještaji za održavanje',
'specialpages-group-other' => 'Ostale posebne stranice',
'specialpages-group-login' => 'Prijava / Otvaranje raÄuna',
@@ -3798,13 +3811,15 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
# Special:ComparePages
-'comparepages' => 'Usporedi stranice',
-'compare-selector' => 'Usporedi ispravljanje stranica',
-'compare-page1' => 'Stranica 1',
-'compare-page2' => 'Stranica 2',
-'compare-rev1' => 'Ispravljanje 1',
-'compare-rev2' => 'Ispravljanje 2',
-'compare-submit' => 'Usporedi',
+'comparepages' => 'Usporedi stranice',
+'compare-selector' => 'Usporedi ispravljanje stranica',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Ispravljanje 1',
+'compare-rev2' => 'Ispravljanje 2',
+'compare-submit' => 'Usporedi',
+'compare-invalid-title' => 'Naslov koji ste unijeli je nevaljan.',
+'compare-title-not-exists' => 'Naslov koji ste naveli ne postoji.',
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
@@ -3831,4 +3846,73 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
+# New logging system
+'logentry-delete-delete' => '$1 je obrisao stranicu $3',
+'logentry-delete-restore' => '$1 je vratio stranicu $3',
+'revdelete-content-hid' => 'skriveni sadržaj',
+'revdelete-summary-hid' => 'sažetak izmjene je sakriven',
+'revdelete-uname-hid' => 'sažetak izmjene je sakriven',
+'revdelete-content-unhid' => 'sadržaj je otkriven',
+'revdelete-summary-unhid' => 'sažetak izmjene je otkriven',
+'revdelete-uname-unhid' => 'korisniÄko ime je otkriveno',
+'revdelete-restricted' => 'primijenjena ograniÄenja za administratore',
+'revdelete-unrestricted' => 'uklonjena ograniÄenja za administratore',
+'logentry-move-move' => '$1 premjesti stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 premjesti stranicu $3 na $4 bez ostavljanja preusmjerenja',
+'logentry-newusers-newusers' => '$1 je napravio korisniÄki raÄun',
+'logentry-newusers-create' => '$1 je napravio korisniÄki raÄun',
+'logentry-newusers-create2' => '$1 je napravio korisniÄki raÄun $3',
+'logentry-newusers-autocreate' => 'KorisniÄki raÄun $1 je automatski napravljen',
+'newuserlog-byemail' => 'Å¡ifra je poslana putem e-maila',
+
+# Feedback
+'feedback-subject' => 'Tema:',
+'feedback-message' => 'Poruka:',
+'feedback-cancel' => 'Odustani',
+'feedback-submit' => 'Pošalji povratnu informaciju',
+'feedback-adding' => 'Dodajem povratne informacije na stranicu...',
+'feedback-error1' => 'Greška: Neprepoznati rezultat od API',
+'feedback-error2' => 'Greška: Uređivanje nije uspjelo',
+'feedback-error3' => 'Greška: Nema odgovora od API',
+'feedback-close' => 'Završeno',
+'feedback-bugnew' => 'Provjereno. Prijavi novu grešku',
+
+# API errors
+'api-error-badaccess-groups' => 'Nemate ovlasti da postavljate datoteke na ovoj wiki.',
+'api-error-badtoken' => 'Unutrašnja greška: token nije ispravan.',
+'api-error-copyuploaddisabled' => 'Postavljanja putem URL-a su onemogućena na ovom serveru.',
+'api-error-duplicate' => 'Već postoji {{PLURAL:$1|[$2 druga datoteka]|[$2 druge datoteke]}} na ovoj stranici sa istim sadržajem',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su već obrisane',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Dvojna datoteka|Dvojne datoteke}}',
+'api-error-empty-file' => 'Datoteka koju ste poslali je bila prazna.',
+'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
+'api-error-fetchfileerror' => 'Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.',
+'api-error-file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
+'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
+'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
+'api-error-hookaborted' => 'Izmjena koji ste pokuÅ¡ali naÄiniti je obustavljena preko kuke proÅ¡irenja.',
+'api-error-http' => 'Unutrašnja greška: ne može se spojiti na server.',
+'api-error-illegal-filename' => 'Ime datoteke nije dopušteno.',
+'api-error-internal-error' => 'Unutrašnja greška: pojavio se neki problem sa obradom vašeg postavljanja na wiki.',
+'api-error-invalid-file-key' => 'Unutrašnja greška: datoteka nije pronađena u privremenom skladištu.',
+'api-error-missingparam' => 'Unutrašnja greška: nedostaju parametri u zahtjevu.',
+'api-error-missingresult' => 'Unutrašnja greška: ne može se otkriti da li je kopiranje uspjelo.',
+'api-error-mustbeloggedin' => 'Morate biti prijavljeni da biste postavljali datoteke.',
+'api-error-mustbeposted' => 'Postoji greška u ovom softverz; ne koristi pravilan HTTP metod.',
+'api-error-noimageinfo' => 'Postavljanje je uspjelo, ali server nam nije dao nikakvu informaciju o datoteci.',
+'api-error-nomodule' => 'Unutrašnja greška: nije postavljen modul za postavljanje.',
+'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
+'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
+'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-timeout' => 'Server nije odgovorio unutar oÄekivanog vremena.',
+'api-error-unclassified' => 'Desila se nepoznata greška',
+'api-error-unknown-code' => 'Nepoznata greška: "$1"',
+'api-error-unknown-error' => 'Unutrašnja greška: desila se neka greška pri pokušaju postavljanja vaše datoteke.',
+'api-error-unknown-warning' => 'Nepoznato upozorenje: $1',
+'api-error-unknownerror' => 'Nepoznata greška: "$1"',
+'api-error-uploaddisabled' => 'Postavljanje je onemogućeno na ovoj wiki.',
+'api-error-verification-error' => 'Ova datoteka je možda oštećenja ili ima pogrešan nastavak.',
+
);
diff --git a/languages/messages/MessagesBug.php b/languages/messages/MessagesBug.php
index fec3566d..662d45ec 100644
--- a/languages/messages/MessagesBug.php
+++ b/languages/messages/MessagesBug.php
@@ -9,6 +9,7 @@
*
* @author Ezagren
* @author Kurniasan
+ * @author Zaidpjd (on bug.wikipedia.org)
*/
$fallback = "id";
@@ -171,7 +172,6 @@ $messages = array(
'internalerror_info' => 'Éro internal: $1',
'badtitle' => 'Judul dek essa',
'viewsource' => 'Ita sumber',
-'viewsourcefor' => 'polé $1',
# Virus scanner
'virus-unknownscanner' => "Antivirus dé' riisseŋ:",
@@ -237,9 +237,6 @@ $messages = array(
'revdelete-hide-comment' => 'Tapo komentar mapadecéŋ',
'revdelete-hide-user' => 'Tapo aseŋ papakéna/IPna papadéceŋë',
'revdelete-log' => 'Saba:',
-'revdelete-content' => 'lise',
-'revdelete-uname' => 'aseŋ papaké',
-'revdelete-hid' => 'tapo $1',
# Diffs
'editundo' => 'undo',
@@ -311,12 +308,8 @@ $messages = array(
'filehist-dimensions' => 'Dimensi',
'imagelinks' => 'Liŋke',
-# File reversion
-'filerevert-backlink' => '↠$1',
-
# File deletion
'filedelete' => 'Mapeddé $1',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'Mapeddé berkas',
'filedelete-intro' => "Iko purani mapeddé '''[[Media:$1|$1]]'''.",
'filedelete-submit' => 'Peddé',
@@ -384,10 +377,9 @@ Apak ida ronnak mappedde halamang édé ri daftar jagaan, klik \"Mangedda jaga\"
'sp-contributions-talk' => 'Bicara',
# What links here
-'whatlinkshere' => 'Pranala ri leppa iyéwé',
-'whatlinkshere-page' => 'Leppa:',
-'whatlinkshere-backlink' => '↠$1',
-'whatlinkshere-links' => '↠liŋke',
+'whatlinkshere' => 'Pranala ri leppa iyéwé',
+'whatlinkshere-page' => 'Leppa:',
+'whatlinkshere-links' => '↠liŋke',
# Block/unblock
'ipblocklist-submit' => 'Sappa',
@@ -397,8 +389,6 @@ Apak ida ronnak mappedde halamang édé ri daftar jagaan, klik \"Mangedda jaga\"
# Move page
'articleexists' => 'Leppa béla ida pile ni ujuk, a dek essa.
Silakan pile aseng laing.',
-'1movedto2' => '[[$1]] léccé lao [[$2]]',
-'1movedto2_redir' => '[[$1]] rileccé lao ri[[$2]] paké redirect',
'movelogpage' => 'Log leccé',
'movereason' => 'Saba:',
'delete_and_move' => 'Peddé nappa paleccé',
diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php
index e8352878..63cdc110 100644
--- a/languages/messages/MessagesCa.php
+++ b/languages/messages/MessagesCa.php
@@ -8,6 +8,7 @@
* @file
*
* @author Aleator
+ * @author Avm99963
* @author BroOk
* @author Cedric31
* @author Davidpar
@@ -81,20 +82,20 @@ $dateFormats = array(
);
$magicWords = array(
- 'numberofarticles' => array( '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NOMDELAPLANA', 'PAGENAME' ),
- 'img_right' => array( '1', 'dreta', 'right' ),
- 'img_left' => array( '1', 'esquerra', 'left' ),
- 'img_border' => array( '1', 'vora', 'border' ),
- 'img_link' => array( '1', 'enllaç=$1', 'link=$1' ),
- 'displaytitle' => array( '1', 'TÃTOL', 'DISPLAYTITLE' ),
- 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
- 'special' => array( '0', 'especial', 'special' ),
- 'defaultsort' => array( '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'pagesize' => array( '1', 'MIDADELAPLANA', 'PAGESIZE' ),
+ 'numberofarticles' => array( '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NOMDELAPLANA', 'PAGENAME' ),
+ 'img_right' => array( '1', 'dreta', 'right' ),
+ 'img_left' => array( '1', 'esquerra', 'left' ),
+ 'img_border' => array( '1', 'vora', 'border' ),
+ 'img_link' => array( '1', 'enllaç=$1', 'link=$1' ),
+ 'displaytitle' => array( '1', 'TÃTOL', 'DISPLAYTITLE' ),
+ 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'especial', 'special' ),
+ 'defaultsort' => array( '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'pagesize' => array( '1', 'MIDADELAPLANA', 'PAGESIZE' ),
);
$specialPageAliases = array(
@@ -543,20 +544,22 @@ Aviseu-ho llavors a un [[Special:ListUsers/sysop|administrador]], deixant-li cla
'badarticleerror' => 'Aquesta operació no es pot dur a terme en aquesta pàgina',
'cannotdelete' => "No s'ha pogut esborrar la pàgina o fitxer «$1».
Potser ja ha estat esborrat per algú altre.",
+'cannotdelete-title' => 'No es pot suprimir 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' => 'Tot seguit es mostren les dades que es troben a la memòria cau, i podria no tenir els últims canvis del dia:',
-'perfcachedts' => 'Tot seguit es mostra les dades que es troben a la memòria cau, la darrera actualització de la qual fou el $1.',
+'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.",
+'perfcachedts' => "Les dades següents es troben a la memòria cau i es van actualitzar per darrera vegada el $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
'querypage-no-updates' => "S'ha inhabilitat l'actualització d'aquesta pàgina. Les dades que hi contenen podrien no estar al dia.",
'wrong_wfQuery_params' => 'Paràmetres incorrectes per a wfQuery()<br />
Funció: $1<br />
Consulta: $2',
'viewsource' => 'Mostra la font',
-'viewsourcefor' => 'per a $1',
+'viewsource-title' => 'Mostra la font per a $1',
'actionthrottled' => 'Acció limitada',
'actionthrottledtext' => "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
'protectedpagetext' => 'Aquesta pàgina està protegida per evitar modificacions.',
'viewsourcetext' => "Podeu visualitzar i copiar la font d'aquesta pàgina:",
+'viewyourtext' => "Vostè pot veure i copiar la font de ' ' les modificacions ' ' d'aquesta pàgina:",
'protectedinterface' => "Aquesta pàgina conté cadenes de text per a la interfície del programari, i és protegida per a previndre'n abusos.",
'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. Pel que fa a les traduccions, plantegeu-vos utilitzar la [//translatewiki.net/wiki/Main_Page?setlang=ca translatewiki.net], el projecte de traducció de MediaWiki.",
'sqlhidden' => '(consulta SQL oculta)',
@@ -652,6 +655,7 @@ Així, des d'aquesta adreça IP no es poden crear més comptes actualment.",
'emailconfirmlink' => 'Confirmeu la vostra adreça electrònica',
'invalidemailaddress' => "No es pot acceptar l'adreça electrònica perquè sembla que té un format no vàlid.
Introduïu una adreça amb un format adequat o bé buideu el camp.",
+'cannotchangeemail' => 'No podeu canviar adreces de correu electrònic en aquest wiki.',
'accountcreated' => "S'ha creat el compte",
'accountcreatedtext' => "S'ha creat el compte d'usuari de $1.",
'createaccount-title' => "Creació d'un compte a {{SITENAME}}",
@@ -668,6 +672,7 @@ Si us plau, esperi abans de tornar-ho a intentar.",
# E-mail sending
'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
+'user-mail-no-addy' => "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
# Change password dialog
'resetpass' => 'Canvia la contrasenya',
@@ -688,30 +693,45 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
'resetpass-temp-password' => 'Contrasenya temporal:',
# Special:PasswordReset
-'passwordreset' => 'Restablir contrasenya',
-'passwordreset-text' => 'Completeu el següent formulari per rebre un recordatori per correu electrònic amb els detalls del vostre compte.',
-'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-username' => "Nom d'usuari:",
-'passwordreset-domain' => 'Domini',
-'passwordreset-email' => 'Adreça de correu electrònic:',
-'passwordreset-emailtitle' => 'Detalls del compte a {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
+'passwordreset' => 'Restablir contrasenya',
+'passwordreset-text' => 'Completeu el següent formulari per rebre un recordatori per correu electrònic amb els detalls del vostre compte.',
+'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-username' => "Nom d'usuari:",
+'passwordreset-domain' => 'Domini',
+'passwordreset-capture' => 'Veure el missatge de correu electrònic?',
+'passwordreset-capture-help' => "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
+'passwordreset-email' => 'Adreça de correu electrònic:',
+'passwordreset-emailtitle' => 'Detalls del compte a {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
$2
{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
Hauríeu d'entrar {{PLURAL:$3|al compte per a fixar-hi una nova contrasenya|als comptes per a fixar-hi noves contrasenyes}} al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
-'passwordreset-emailtext-user' => "L'usuari $1 de {{SITENAME}} ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
+'passwordreset-emailtext-user' => "L'usuari $1 de {{SITENAME}} ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
$2
{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
Hauríeu d'entrar {{PLURAL:$3|al compte per a fixar-hi una nova contrasenya|als comptes per a fixar-hi noves contrasenyes}} al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
-'passwordreset-emailelement' => "Nom d'usuari: $1
+'passwordreset-emailelement' => "Nom d'usuari: $1
Contrasenya temporal: $2",
-'passwordreset-emailsent' => "S'ha enviat un correu de recordatori.",
+'passwordreset-emailsent' => "S'ha enviat un correu de recordatori.",
+'passwordreset-emailsent-capture' => "S'ha enviat un recordatori per correu electrònic, 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",
+
+# Special:ChangeEmail
+'changeemail' => 'Canvi de correu electrònic',
+'changeemail-header' => "Canvi de l'adreça de correu electrònic del compte",
+'changeemail-text' => "Completeu el següent formulari per canviar la vostra adreça de correu electrònic. Haureu d'introduir la contrasenya per confirmar el canvi.",
+'changeemail-no-info' => "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
+'changeemail-oldemail' => 'Adreça de correu electrònic actual:',
+'changeemail-newemail' => 'Nova adreça de correu electrònic:',
+'changeemail-none' => '(cap)',
+'changeemail-submit' => 'Canvia de correu electrònic',
+'changeemail-cancel' => 'Cancel·la',
# Edit page toolbar
'bold_sample' => 'Text en negreta',
@@ -780,9 +800,6 @@ Recordeu que per a poder usar l'opció «Envia un missatge de correu electrònic
El número d'identificació de la vostra adreça IP és $3, i l'ID del bloqueig és #$5. Si us plau, incloeu aquestes dades en totes les consultes que feu.",
'blockednoreason' => "no s'ha donat cap motiu",
-'blockedoriginalsource' => "La font de '''$1''' es mostra a sota:",
-'blockededitsource' => "El text de les vostres edicions a '''$1''' es mostra a continuació:",
-'whitelistedittitle' => 'Cal iniciar una sessió per a poder modificar el contingut',
'whitelistedittext' => 'Heu de $1 per modificar pàgines.',
'confirmedittext' => "Heu de confirmar la vostra adreça electrònica abans de poder modificar les pàgines. Definiu i valideu la vostra adreça electrònica a través de les vostres [[Special:Preferences|preferències d'usuari]].",
'nosuchsectiontitle' => 'No es pot trobar la secció',
@@ -863,7 +880,8 @@ A més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bÃ
'copyrightwarning2' => "Si us plau, tingueu en compte que totes les contribucions al projecte {{SITENAME}} poden ser corregides, alterades o esborrades per altres usuaris. Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />
A més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o altres recursos lliures similars (consulteu $1 per a més detalls).
'''No feu servir textos amb drets d'autor sense permís!'''",
-'longpageerror' => "'''ERROR: El text que heu introduït és de $1 kB i sobrepassa el màxim permès de $2 kB. Per tant, no es desarà.'''",
+'longpageerror' => "'''Error: El text que heu introduït és {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}} i sobrepassa el màxim permès de {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
+No es pot desar.",
'readonlywarning' => "'''ADVERTÈNCIA: La base de dades està tancada per manteniment
i no podeu desar les vostres contribucions en aquests moments. Podeu retallar i enganxar el codi
en un fitxer de text i desar-lo més tard.'''
@@ -1032,8 +1050,6 @@ Els altres administradors de {{SITENAME}} encara podran accedir al contingut ama
'revdelete-unsuppress' => 'Suprimir les restriccions de les revisions restaurades',
'revdelete-log' => 'Motiu:',
'revdelete-submit' => 'Aplica a {{PLURAL:$1|la revisió seleccionada|les revisions seleccionades}}',
-'revdelete-logentry' => "s'ha canviat la visibilitat de la revisió de [[$1]]",
-'logdelete-logentry' => "s'ha canviat la visibilitat de [[$1]]",
'revdelete-success' => "'''La visibilitat d'aquesta revisió s'ha actualitzat correctament.'''",
'revdelete-failure' => "'''La visibilitat de la revisió no ha pogut actualitzar-se:'''
$1",
@@ -1045,16 +1061,6 @@ $1",
'revdel-restore-visible' => 'revisions visibles',
'pagehist' => 'Historial',
'deletedhist' => "Historial d'esborrat",
-'revdelete-content' => 'el contingut',
-'revdelete-summary' => "el resum d'edició",
-'revdelete-uname' => "el nom d'usuari",
-'revdelete-restricted' => 'ha aplicat restriccions als administradors',
-'revdelete-unrestricted' => 'ha tret les restriccions als administradors',
-'revdelete-hid' => 'ha amagat $1',
-'revdelete-unhid' => 'ha tornat a mostrar $1',
-'revdelete-log-message' => '$1 de {{PLURAL:$2|la revisió|les revisions}}
-$2',
-'logdelete-log-message' => "$1 per {{PLURAL:$2|l'esdeveniment|els esdeveniments}} $2",
'revdelete-hide-current' => "Error en amagar l'edició del $1 a les $2: és la revisió actual.
No es pot amagar.",
'revdelete-show-no-access' => "Error en mostrar l'element del $1 a les $2: està marcat com a ''restringit''.
@@ -1210,12 +1216,14 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
'prefs-rc' => 'Canvis recents',
'prefs-watchlist' => 'Llista de seguiment',
'prefs-watchlist-days' => 'Nombre de dies per mostrar en la llista de seguiment:',
-'prefs-watchlist-days-max' => 'Màxim set dies',
+'prefs-watchlist-days-max' => 'Màxim $1 {{PLURAL:$1|dia|dies}}',
'prefs-watchlist-edits' => 'Nombre de modificacions a mostrar en una llista estesa de seguiment:',
'prefs-watchlist-edits-max' => 'Nombre màxim: 1000',
'prefs-watchlist-token' => 'Fitxa de llista de seguiment:',
'prefs-misc' => 'Altres preferències',
'prefs-resetpass' => 'Canvia la contrasenya',
+'prefs-changeemail' => 'Canvia de correu electrònic',
+'prefs-setemail' => 'Indiqueu una adreça de correu electrònic',
'prefs-email' => 'Opcions de correu electrònic',
'prefs-rendering' => 'Aparença',
'saveprefs' => 'Desa les preferències',
@@ -1275,6 +1283,7 @@ No es podrà desfer el canvi.',
'yourrealname' => 'Nom real *',
'yourlanguage' => 'Idioma:',
'yourvariant' => 'Variant lingüística:',
+'prefs-help-variant' => "La variant lingüística o ortogràfica que preferiu a l'hora de mostrar el contingut d'aquest wiki.",
'yournick' => 'Signatura:',
'prefs-help-signature' => "Els comentaris a les pàgines d'usuari s'han de signar amb \"<nowiki>~~~~</nowiki>\", que serà convertit en la vostra signatura i la data i l'hora.",
'badsig' => 'La signatura que heu inserit no és vàlida; verifiqueu les etiquetes HTML que heu emprat.',
@@ -1314,7 +1323,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'userrights-lookup-user' => "Gestiona els grups d'usuari",
'userrights-user-editname' => "Introduïu un nom d'usuari:",
'editusergroup' => "Edita els grups d'usuaris",
-'editinguser' => "S'està canviant els permisos de l'usuari '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "S'està canviant els permisos de l'usuari '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Edita els grups d'usuaris",
'saveusergroups' => "Desa els grups d'usuari",
'userrights-groupsmember' => 'Membre de:',
@@ -1408,13 +1417,13 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'right-autopatrol' => 'Que les edicions pròpies es marquin automàticament com a patrullades',
'right-patrolmarks' => 'Veure les marques de patrulla als canvis recents',
'right-unwatchedpages' => 'Veure la llista de les pàgines no vigilades',
-'right-trackback' => 'Trametre un trackback',
'right-mergehistory' => "Fusionar l'historial de les pàgines",
'right-userrights' => 'Editar els drets dels usuaris',
'right-userrights-interwiki' => "Editar els drets dels usuaris d'altres wikis",
'right-siteadmin' => 'Blocar i desblocar la base de dades',
'right-override-export-depth' => 'Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5',
'right-sendemail' => 'Enviar missatges de correu electrònic a altres usuaris',
+'right-passwordreset' => 'Veure les soŀlicituds de restabliment de contrasenya per correu electrònic',
# User rights log
'rightslog' => "Registre dels permisos d'usuari",
@@ -1448,16 +1457,17 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'action-suppressionlog' => 'visualitzar aquest registre privat',
'action-block' => 'blocar aquest usuari per a què no pugui editar',
'action-protect' => "canviar els nivells de protecció d'aquesta pàgina",
+'action-rollback' => "desfer ràpidament les modificacions de l'últim usuari que va editar una determinada pàgina",
'action-import' => "importar aquesta pàgina des d'un altre wiki",
'action-importupload' => "importar aquesta pàgina mitjançant la càrrega des d'un fitxer",
'action-patrol' => 'marcar les edicions dels altres com a supervisades',
'action-autopatrol' => 'marcar les vostres edicions com a supervisades',
'action-unwatchedpages' => 'visualitzar la llista de pàgines no vigilades',
-'action-trackback' => 'enviar una referència',
'action-mergehistory' => "fusionar l'historial d'aquesta pàgina",
'action-userrights' => "modificar tots els permisos d'usuari",
'action-userrights-interwiki' => "modificar permisos d'usuari en altres wikis",
'action-siteadmin' => 'bloquejar o desbloquejar la base de dades',
+'action-sendemail' => 'envia missatges de correu',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
@@ -1489,6 +1499,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'number_of_watching_users_pageview' => '[{{PLURAL:$1|Un usuari vigila|$1 usuaris vigilen}} aquesta pàgina]',
'rc_categories' => 'Limita a les categories (separades amb "|")',
'rc_categories_any' => 'Qualsevol',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} després del canvi',
'newsectionsummary' => '/* $1 */ secció nova',
'rc-enhanced-expand' => 'Mostra detalls (requereix JavaScript)',
'rc-enhanced-hide' => 'Amagar detalls',
@@ -1543,6 +1554,7 @@ Vegeu la [[Special:NewFiles|galeria de nous fitxers]] per a una presentació mé
'ignorewarnings' => 'Ignora qualsevol avís',
'minlength1' => "Els noms de fitxer han de ser de com a mínim d'una lletra.",
'illegalfilename' => 'El nom del fitxer «$1» conté caràcters que no estan permesos en els títols de pàgines. Si us plau, canvieu el nom al fitxer i torneu a carregar-lo.',
+'filename-toolong' => 'Els noms de fitxer no poden fer més de 240 bytes.',
'badfilename' => "El nom de la imatge s'ha canviat a «$1».",
'filetype-mime-mismatch' => "L'extensió de fitxer «.$1» no coincideix amb el tipus MIME del fitxer ($2).",
'filetype-badmime' => 'No es poden carregar fitxers del tipus MIME «$1».',
@@ -1629,6 +1641,41 @@ $1',
'upload-unknown-size' => 'Mida desconeguda',
'upload-http-error' => 'Ha ocorregut un error HTTP: $1',
+# File backend
+'backend-fail-stream' => "No s'ha pogut transmetre el fitxer $1.",
+'backend-fail-backup' => "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
+'backend-fail-notexists' => 'El fitxer $1 no existeix.',
+'backend-fail-hashes' => "No s'han pogut obtenir els resums dels fitxer per fer-ne comparació.",
+'backend-fail-notsame' => 'Ja existeix un fitxer no idèntic a $1.',
+'backend-fail-invalidpath' => "$1 no és un camí d'emmagatzemament vàlid.",
+'backend-fail-delete' => "No s'ha pogut suprimir el fitxer $1.",
+'backend-fail-alreadyexists' => 'El fitxer $1 ja existeix.',
+'backend-fail-store' => "No s'ha pogut emmagatzemar el fitxer $1 a $2.",
+'backend-fail-copy' => "No s'ha pogut copiar el fitxer $1 a $2.",
+'backend-fail-move' => "No s'ha pogut moure el fitxer $1 a $2.",
+'backend-fail-opentemp' => "No s'ha pogut obrir el fitxer temporal.",
+'backend-fail-writetemp' => "No s'ha pogut escriure el fitxer temporal.",
+'backend-fail-closetemp' => "No s'ha pogut tancar el fitxer temporal.",
+'backend-fail-read' => "No s'ha pogut llegir el fitxer $1.",
+'backend-fail-create' => "No s'ha pogut crear el fitxer $1.",
+'backend-fail-readonly' => "El rerefons d'emmagatzemament «$1» actualment només és de lectura. Es va donar el motiu: «$2»",
+'backend-fail-synced' => "El fitxer «$1» es troba en un estat inconsistent amb els rerefons d'emmagatzemament interns.",
+'backend-fail-connect' => "No s'ha pogut connectar al fitxer de rerefons d'emmagatzemament «$1».",
+'backend-fail-internal' => "S'ha produït un error desconegut en el fitxer de rerefons d'emmagatzemament «$1».",
+'backend-fail-contenttype' => 'No es pot determinar el tipus de contingut del fitxer per emmagatzemar a «$1».',
+'backend-fail-batchsize' => "El rerefons d'emmagatzemament ha rebut un lot {{PLURAL:$1|d'$1 operació|de $1 operacions}} de fitxer; el límit és $2 {{PLURAL:$2|operació|operacions}}.",
+
+# Lock manager
+'lockmanager-notlocked' => "No s'ha pogut desbloquejar «$1»; no és bloquejat.",
+'lockmanager-fail-closelock' => "No s'ha pogut bloquejar el fitxer per «$1».",
+'lockmanager-fail-deletelock' => "No s'ha pogut suprimir el fitxer de bloqueig per «$1».",
+'lockmanager-fail-acquirelock' => "No s'ha pogut adquirir el bloqueig de «$1».",
+'lockmanager-fail-openlock' => "No s'ha pogut obrir el fitxer de bloqueig de «$1».",
+'lockmanager-fail-releaselock' => "No s'ha pogut alliberar el bloqueig de «$1».",
+'lockmanager-fail-db-bucket' => "No s'han pogut contactar un nombre suficient de bases de bloqueig en el cubell $1.",
+'lockmanager-fail-db-release' => "No s'han pogut alliberar els bloquejos a la base de dades $1.",
+'lockmanager-fail-svr-release' => "No s'han pogut alliberar els bloquejos al servidor $1.",
+
# ZipDirectoryReader
'zip-file-open-error' => "S'ha trobat un error en obrir l'arxiu ZIP per a fer-hi comprovacions.",
'zip-wrong-format' => 'El fitxer especificat no és un arxiu ZIP.',
@@ -1644,6 +1691,7 @@ No s'hi ha pogut comprovar la seguretat.",
'uploadstash-badtoken' => "No s'ha pogut realitzar l'acció, possiblement perquè han caducat la vostra identificació. Intenteu-ho de nou.",
'uploadstash-errclear' => "No ha estat possible l'esborrat dels fitxers.",
'uploadstash-refresh' => 'Actualitza la llista de fitxers',
+'invalid-chunk-offset' => 'El desplaçament del fragment no és vàlid',
# img_auth script messages
'img-auth-accessdenied' => 'Accés denegat',
@@ -1749,23 +1797,24 @@ La descripció de la seva [$2 pàgina de descripció] es mostra a continuació.'
'filerevert-badversion' => "No hi ha cap versió local anterior d'aquest fitxer amb la marca horària que es proporciona.",
# File deletion
-'filedelete' => 'Suprimeix $1',
-'filedelete-legend' => 'Suprimeix el fitxer',
-'filedelete-intro' => "Esteu eliminant el fitxer '''[[Media:$1|$1]]''' juntament amb el seu historial.",
-'filedelete-intro-old' => "Esteu eliminant la versió de '''[[Media:$1|$1]]''' com de [$4 $3, $2].",
-'filedelete-comment' => 'Motiu:',
-'filedelete-submit' => 'Suprimeix',
-'filedelete-success' => "'''$1''' s'ha eliminat.",
-'filedelete-success-old' => "<span class=\"plainlinks\">La versió de '''[[Media:\$1|\$1]]''' s'ha eliminat el \$2 a les \$3.</span>",
-'filedelete-nofile' => "'''$1''' no existeix.",
-'filedelete-nofile-old' => "No hi ha cap versió arxivada de '''$1''' amb els atributs especificats.",
-'filedelete-otherreason' => 'Motius alternatius/addicionals:',
-'filedelete-reason-otherlist' => 'Altres motius',
-'filedelete-reason-dropdown' => "*Motius d'eliminació comuns
+'filedelete' => 'Suprimeix $1',
+'filedelete-legend' => 'Suprimeix el fitxer',
+'filedelete-intro' => "Esteu eliminant el fitxer '''[[Media:$1|$1]]''' juntament amb el seu historial.",
+'filedelete-intro-old' => "Esteu eliminant la versió de '''[[Media:$1|$1]]''' com de [$4 $3, $2].",
+'filedelete-comment' => 'Motiu:',
+'filedelete-submit' => 'Suprimeix',
+'filedelete-success' => "'''$1''' s'ha eliminat.",
+'filedelete-success-old' => "<span class=\"plainlinks\">La versió de '''[[Media:\$1|\$1]]''' s'ha eliminat el \$2 a les \$3.</span>",
+'filedelete-nofile' => "'''$1''' no existeix.",
+'filedelete-nofile-old' => "No hi ha cap versió arxivada de '''$1''' amb els atributs especificats.",
+'filedelete-otherreason' => 'Motius alternatius/addicionals:',
+'filedelete-reason-otherlist' => 'Altres motius',
+'filedelete-reason-dropdown' => "*Motius d'eliminació comuns
** Violació dels drets d'autor / copyright
** Fitxer duplicat",
-'filedelete-edit-reasonlist' => "Edita els motius d'eliminació",
-'filedelete-maintenance' => "L'esborrament i recuperació de fitxers està temporalment deshabilitada durant el manteniment.",
+'filedelete-edit-reasonlist' => "Edita els motius d'eliminació",
+'filedelete-maintenance' => "L'esborrament i recuperació de fitxers està temporalment deshabilitada durant el manteniment.",
+'filedelete-maintenance-title' => 'No pot suprimir arxiu',
# MIME search
'mimesearch' => 'Cerca per MIME',
@@ -1862,6 +1911,8 @@ Les entrades <del>ratllades</del> s\'han resolt.',
'wantedpages' => 'Pàgines demanades',
'wantedpages-badtitle' => 'Títol invàlid al conjunt de resultats: $1',
'wantedfiles' => 'Fitxers demanats',
+'wantedfiletext-cat' => "Els fitxers següents s'utilitzen per no existeixen. Els fitxers de repositoris aliens poden ser llistats encara que existeixin. Aquells que siguin fals positius es <del>tatxaran</del>. A més, les pàgines que tinguin fitxers incrustats que no existeixin es llistaran a [[:$1]].",
+'wantedfiletext-nocat' => "Els fitxers següents es fan servir però no existeixen. Els fitxers d'un repositori aliè poden ser llistats encara que existeixin. Tots aquells fals positius es <del>tatxaran</del>.",
'wantedtemplates' => 'Plantilles demanades',
'mostlinked' => 'Pàgines més enllaçades',
'mostlinkedcategories' => 'Categories més utilitzades',
@@ -1870,6 +1921,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
'mostimages' => 'Fitxers més enllaçats',
'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)',
'shortpages' => 'Pàgines curtes',
'longpages' => 'Pàgines llargues',
'deadendpages' => 'Pàgines atzucac',
@@ -1886,7 +1938,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
'listusers-editsonly' => 'Mostra només usuaris amb edicions',
'listusers-creationsort' => 'Ordena per data de creació',
'usereditcount' => '$1 {{PLURAL:$1|modificació|modificacions}}',
-'usercreated' => 'Creat el $1 a $2',
+'usercreated' => '{{GENDER:$3|Creat}} en $1 a les$2',
'newpages' => 'Pàgines noves',
'newpages-username' => "Nom d'usuari:",
'ancientpages' => 'Pàgines més antigues',
@@ -1979,12 +2031,8 @@ Protocols admesos: <tt> $1 </tt> (no els afegiu en la vostra recerca).',
'activeusers-noresult' => "No s'han trobat usuaris.",
# Special:Log/newusers
-'newuserlogpage' => "Registre de creació de l'usuari",
-'newuserlogpagetext' => 'Aquest és un registre de creació de nous usuaris.',
-'newuserlog-byemail' => 'contrasenya enviada per correu electrònic',
-'newuserlog-create-entry' => 'Nou usuari',
-'newuserlog-create2-entry' => 'ha creat un compte per a $1',
-'newuserlog-autocreate-entry' => 'Compte creat automàticament',
+'newuserlogpage' => "Registre de creació de l'usuari",
+'newuserlogpagetext' => 'Aquest és un registre de creació de nous usuaris.',
# Special:ListGroupRights
'listgrouprights' => "Drets dels grups d'usuaris",
@@ -2015,7 +2063,7 @@ per enviar un correu electrònic a altres usuaris.",
'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a aquest usuari.
L'adreça electrònica que heu entrat en [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
'usermailererror' => "L'objecte de correu ha retornat un error:",
-'defemailsubject' => 'Adreça correl de {{SITENAME}}',
+'defemailsubject' => 'Correu electrònic de l\'usuari "$1" de {{SITENAME}}',
'usermaildisabled' => "Correu electrònic d'usuaris deshabilitat",
'usermaildisabledtext' => 'No podeu enviar correus electrònics a altres usuaris en aquest wiki',
'noemailtitle' => 'No hi ha cap adreça electrònica',
@@ -2070,7 +2118,7 @@ S'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corres
'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}}.',
'iteminvalidname' => "Hi ha un problema amb l'element '$1': el nom no és vàlid...",
-'wlnote' => 'A sota hi ha {{PLURAL:$1|el darrer canvi|els darrers $1 canvis}} en {{PLURAL:$2|la darrera hora|les darreres $2 hores}}.',
+'wlnote' => "A sota hi ha {{PLURAL:$1|el darrer canvi|els darrers '''$1''' canvis}} en {{PLURAL:$2|la darrera hora|les '''$2''' darreres hores}}, a $4 del $3.",
'wlshowlast' => '<small>- Mostra les darreres $1 hores, els darrers $2 dies o $3</small>',
'watchlist-options' => 'Opcions de la llista de seguiment',
@@ -2136,8 +2184,6 @@ conseqüències, i que el que esteu fent està d'acord amb la [[{{MediaWiki:Poli
'actionfailed' => "L'acció ha fallat",
'deletedtext' => '«$1» ha estat esborrat.
Vegeu $2 per a un registre dels esborrats més recents.',
-'deletedarticle' => 'ha esborrat «[[$1]]»',
-'suppressedarticle' => "s'ha suprimit «[[$1]]»",
'dellogpage' => "Registre d'eliminació",
'dellogpagetext' => 'Davall hi ha una llista dels esborraments més recents.',
'deletionlog' => "Registre d'esborrats",
@@ -2181,7 +2227,10 @@ Vegeu la [[Special:ProtectedPages|llista de pàgines protegides]] per a la llist
'unprotectedarticle' => 'ha desprotegit "[[$1]]"',
'movedarticleprotection' => 'ha traslladat els ajustaments de protecció des de «[[$2]]» a «[[$1]]»',
'protect-title' => 'Canviant la protecció de «$1»',
+'protect-title-notallowed' => 'Mostra el nivell de protecció de " $1 "',
'prot_1movedto2' => '[[$1]] mogut a [[$2]]',
+'protect-badnamespace-title' => 'Espai de nom no-protectable',
+'protect-badnamespace-text' => 'Les pàgines en aquest espai de nom no pot ser protegit.',
'protect-legend' => 'Confirmeu la protecció',
'protectcomment' => 'Motiu:',
'protectexpiry' => "Data d'expiració",
@@ -2202,6 +2251,7 @@ Ací es troben els paràmetres actuals de la pàgina '''$1''':",
'protect-level-sysop' => 'Bloqueja tots els usuaris excepte administradors',
'protect-summary-cascade' => 'en cascada',
'protect-expiring' => 'expira el dia $1 (UTC)',
+'protect-expiring-local' => 'caduca el $1',
'protect-expiry-indefinite' => 'indefinit',
'protect-cascade' => 'Protecció en cascada: protegeix totes les pàgines i plantilles incloses en aquesta.',
'protect-cantedit' => "No podeu canviar els nivells de protecció d'aquesta pàgina, perquè no teniu permisos per a editar-la.",
@@ -2261,7 +2311,6 @@ al resum a continuació, juntament amb detalls dels usuaris que l'havien editat
'undeletereset' => 'Reinicia',
'undeleteinvert' => 'Invertir selecció',
'undeletecomment' => 'Motiu:',
-'undeletedarticle' => 'ha restaurat «[[$1]]»',
'undeletedrevisions' => '{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats',
'undeletedfiles' => '$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}',
@@ -2270,6 +2319,7 @@ al resum a continuació, juntament amb detalls dels usuaris que l'havien editat
Consulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
'undelete-header' => "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
+'undelete-search-title' => 'Pàgines de cerca suprimit',
'undelete-search-box' => 'Cerca pàgines esborrades',
'undelete-search-prefix' => 'Mostra pàgines que comencin:',
'undelete-search-submit' => 'Cerca',
@@ -2278,6 +2328,7 @@ Consulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esbo
'undelete-bad-store-key' => 'No es pot revertir la revisió de fitxer amb marca horària $1: el fitxer no hi era abans i tot de ser eliminat.',
'undelete-cleanup-error' => "S'ha produït un error en eliminar el fitxer d'arxiu sense utilitzar «$1».",
'undelete-missing-filearchive' => "No s'ha pogut restaurar l'identificador $1 d'arxiu de fitxers perquè no es troba a la base de dades. Podria ser que ja s'hagués revertit l'eliminació.",
+'undelete-error' => 'Error recuperant pàgina',
'undelete-error-short' => "S'ha produït un error en revertir l'eliminació del fitxer: $1",
'undelete-error-long' => "S'han produït errors en revertir la supressió del fitxer:
@@ -2403,6 +2454,7 @@ l'accés a l'escriptura a una adreça IP o un usuari prèviament bloquejat.",
'blocklist-userblocks' => 'Amaga bloquejos de compte',
'blocklist-tempblocks' => 'Amaga bloquejos temporals',
'blocklist-addressblocks' => "Amaga bloquejos d'una sola IP",
+'blocklist-rangeblocks' => 'Amaga els blocatges de rang',
'blocklist-timestamp' => 'Marca horària',
'blocklist-target' => 'Usuari blocat',
'blocklist-expiry' => 'Caduca',
@@ -2425,6 +2477,7 @@ l'accés a l'escriptura a una adreça IP o un usuari prèviament bloquejat.",
'unblocklink' => 'desbloca',
'change-blocklink' => 'canvia el blocatge',
'contribslink' => 'contribucions',
+'emaillink' => 'correu electrònic',
'autoblocker' => "Heu estat blocat automàticament perquè la vostra adreça IP ha estat recentment utilitzada per l'usuari ''[[User:$1|$1]]''.
El motiu del bloqueig de $1 és: ''$2''.",
'blocklogpage' => 'Registre de bloquejos',
@@ -2550,9 +2603,6 @@ Incorporeu-les manualment, si us plau.",
'movepage-page-moved' => 'La pàgina $1 ha estat traslladada a $2.',
'movepage-page-unmoved' => "La pàgina $1 no s'ha pogut moure a $2.",
'movepage-max-pages' => "{{PLURAL:$1|S'ha mogut una pàgina|S'han mogut $1 pàgines}} que és el nombre màxim, i per tant no se'n mourà automàticament cap més.",
-'1movedto2' => 'ha reanomenat [[$1]] com a [[$2]]',
-'1movedto2_redir' => 'ha reanomenat [[$1]] com a [[$2]] sobre una redirecció',
-'move-redirect-suppressed' => 'redirecció suprimida',
'movelogpage' => 'Registre de reanomenaments',
'movelogpagetext' => 'Vegeu la llista de les darreres pàgines reanomenades.',
'movesubpage' => '{{PLURAL:$1|Subpàgina|Subpàgines}}',
@@ -2565,7 +2615,7 @@ Incorporeu-les manualment, si us plau.",
La pàgina de destinació, «[[:$1]]», ja existeix. Voleu eliminar-la per a fer lloc al trasllat?",
'delete_and_move_confirm' => 'Sí, esborra la pàgina',
-'delete_and_move_reason' => "S'ha eliminat per a permetre el reanomenament",
+'delete_and_move_reason' => 'Suprimit per donar pas a pas de " [[$1]] "',
'selfmove' => "Els títols d'origen i de destinació coincideixen: no és possible de reanomenar una pàgina a si mateixa.",
'immobile-source-namespace' => 'No es poden moure pàgines de l\'espai de noms "$1"',
'immobile-target-namespace' => 'No es poden moure pàgines cap a l\'espai de noms "$1"',
@@ -2593,9 +2643,11 @@ A continuació es mostra la darrera entrada del registre com a referència:",
Per a exportar pàgines, escriviu els títols que desitgeu al quadre de text de sota, un títol per línia, i seleccioneu si desitgeu o no la versió actual juntament amb totes les versions antigues, amb la pàgina d'historial, o només la pàgina actual amb la informació de la darrera modificació.
En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per a la pàgina «[[{{MediaWiki:Mainpage}}]]».",
+'exportall' => 'Exporta totes les pàgines',
'exportcuronly' => "Exporta únicament la versió actual en voltes de l'historial sencer",
'exportnohistory' => "----
'''Nota:''' s'ha inhabilitat l'exportació sencera d'historial de pàgines mitjançant aquest formulari a causa de problemes de rendiment del servidor.",
+'exportlistauthors' => 'Inclouen una llista completa dels contribuents per a cada pàgina',
'export-submit' => 'Exporta',
'export-addcattext' => 'Afegeix pàgines de la categoria:',
'export-addcat' => 'Afegeix',
@@ -2627,6 +2679,8 @@ En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{Me
'thumbnail_error' => "S'ha produït un error en crear la miniatura: $1",
'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",
+'thumbnail-dest-create' => 'No es pot desar la miniatura a la destinació',
'thumbnail_invalid_params' => 'Els paràmetres de les miniatures no són vàlids',
'thumbnail_dest_directory' => "No s'ha pogut crear el directori de destinació",
'thumbnail_image-type' => "Tipus d'imatge no contemplat",
@@ -2671,6 +2725,11 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
'import-upload' => 'Carrega dades XML',
'import-token-mismatch' => 'Pèrdua de dades de sessió. Torneu-ho a intentar.',
'import-invalid-interwiki' => 'No es pot importar des del wiki especificat.',
+'import-error-edit' => "La pàgina «$1» no s'ha importat perquè no teniu permís per modificar-la.",
+'import-error-create' => "La pàgina «$1» no s'ha importat perquè no teniu permís per crear-la.",
+'import-error-interwiki' => "No s'importa la pàgina «$1» perquè el seu nom està reservat a l'enllaçament extern (interwiki).",
+'import-error-special' => "No s'importa la pàgina «$1» perquè el seu nom pertany a l'espai de noms especial que no permet pàgines.",
+'import-error-invalid' => "No s'importa la pàgina «$1» perquè el seu nom no és vàlid.",
# Import log
'importlogpage' => "Registre d'importació",
@@ -2680,73 +2739,86 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
'import-logentry-interwiki' => "s'ha importat $1 via interwiki",
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revisió|revisions}} de $2',
+# JavaScriptTest
+'javascripttest' => 'Proves de JavaScript',
+'javascripttest-disabled' => 'La funció està inhabilitada.',
+'javascripttest-title' => "S'estan executant $1 proves",
+'javascripttest-pagetext-noframework' => "Es reserva la pàgina per a l'execució de tests amb JavaScript.",
+'javascripttest-pagetext-unknownframework' => "L'entorn de proves «$1» és desconegut.",
+'javascripttest-pagetext-frameworks' => 'Trieu un dels següents entorns de prova: $1',
+'javascripttest-pagetext-skins' => 'Trieu un tema on executar-hi els tests:',
+'javascripttest-qunit-intro' => 'Consulteu la [documentació de tests de $1] a mediawiki.org.',
+'javascripttest-qunit-heading' => 'Entorn de proves JavaScript QUnit per al MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => "La vostra pàgina d'usuari",
-'tooltip-pt-anonuserpage' => "La pàgina d'usuari per la ip que utilitzeu",
-'tooltip-pt-mytalk' => 'La vostra pàgina de discussió.',
-'tooltip-pt-anontalk' => 'Discussió sobre les edicions per aquesta adreça ip.',
-'tooltip-pt-preferences' => 'Les vostres preferències.',
-'tooltip-pt-watchlist' => 'La llista de pàgines de les que estau vigilant els canvis.',
-'tooltip-pt-mycontris' => 'Llista de les vostres contribucions.',
-'tooltip-pt-login' => 'Us animem a registrar-vos, però no és obligatori.',
-'tooltip-pt-anonlogin' => 'Us animem a registrar-vos, però no és obligatori.',
-'tooltip-pt-logout' => "Finalitza la sessió d'usuari",
-'tooltip-ca-talk' => "Discussió sobre el contingut d'aquesta pàgina.",
-'tooltip-ca-edit' => 'Podeu modificar aquesta pàgina. Si us plau, previsualitzeu-la abans de desar.',
-'tooltip-ca-addsection' => 'Comença una nova secció',
-'tooltip-ca-viewsource' => 'Aquesta pàgina està protegida. Podeu veure el seu codi font.',
-'tooltip-ca-history' => "Versions antigues d'aquesta pàgina.",
-'tooltip-ca-protect' => 'Protegeix aquesta pàgina.',
-'tooltip-ca-unprotect' => 'Desprotegeix aquesta pàgina',
-'tooltip-ca-delete' => 'Elimina aquesta pàgina',
-'tooltip-ca-undelete' => 'Restaura les edicions fetes a aquesta pàgina abans de que fos esborrada.',
-'tooltip-ca-move' => 'Reanomena aquesta pàgina',
-'tooltip-ca-watch' => 'Afegiu aquesta pàgina a la vostra llista de seguiment.',
-'tooltip-ca-unwatch' => 'Suprimiu aquesta pàgina de la vostra llista de seguiment',
-'tooltip-search' => 'Cerca en el projecte {{SITENAME}}',
-'tooltip-search-go' => 'Vés a una pàgina amb aquest nom exacte si existeix',
-'tooltip-search-fulltext' => 'Cerca a les pàgines aquest text',
-'tooltip-p-logo' => 'Pàgina principal',
-'tooltip-n-mainpage' => 'Visiteu la pàgina principal.',
-'tooltip-n-mainpage-description' => 'Vegeu la pàgina principal',
-'tooltip-n-portal' => 'Sobre el projecte, què podeu fer, on podeu trobar coses.',
-'tooltip-n-currentevents' => "Per trobar informació general sobre l'actualitat.",
-'tooltip-n-recentchanges' => 'La llista de canvis recents a la wiki.',
-'tooltip-n-randompage' => 'Vés a una pàgina aleatòria.',
-'tooltip-n-help' => 'El lloc per esbrinar.',
-'tooltip-t-whatlinkshere' => 'Llista de totes les pàgines viqui que enllacen ací.',
-'tooltip-t-recentchangeslinked' => 'Canvis recents a pàgines que enllacen amb aquesta pàgina.',
-'tooltip-feed-rss' => "Canal RSS d'aquesta pàgina",
-'tooltip-feed-atom' => "Canal Atom d'aquesta pàgina",
-'tooltip-t-contributions' => "Vegeu la llista de contribucions d'aquest usuari.",
-'tooltip-t-emailuser' => 'Envia un correu en aquest usuari.',
-'tooltip-t-upload' => "Càrrega d'imatges o altres fitxers.",
-'tooltip-t-specialpages' => 'Llista de totes les pàgines especials.',
-'tooltip-t-print' => "Versió per a impressió d'aquesta pàgina",
-'tooltip-t-permalink' => 'Enllaç permanent a aquesta versió de la pàgina',
-'tooltip-ca-nstab-main' => 'Vegeu el contingut de la pàgina.',
-'tooltip-ca-nstab-user' => "Vegeu la pàgina de l'usuari.",
-'tooltip-ca-nstab-media' => "Vegeu la pàgina de l'element multimèdia",
-'tooltip-ca-nstab-special' => 'Aquesta és una pàgina especial, no podeu modificar-la',
-'tooltip-ca-nstab-project' => 'Vegeu la pàgina del projecte',
-'tooltip-ca-nstab-image' => 'Visualitza la pàgina del fitxer',
-'tooltip-ca-nstab-mediawiki' => 'Vegeu el missatge de sistema',
-'tooltip-ca-nstab-template' => 'Vegeu la plantilla',
-'tooltip-ca-nstab-help' => "Vegeu la pàgina d'ajuda",
-'tooltip-ca-nstab-category' => 'Vegeu la pàgina de la categoria',
-'tooltip-minoredit' => 'Marca-ho com una modificació menor',
-'tooltip-save' => 'Desa els vostres canvis',
-'tooltip-preview' => 'Reviseu els vostres canvis, feu-ho abans de desar res!',
-'tooltip-diff' => 'Mostra quins canvis heu fet al text',
-'tooltip-compareselectedversions' => "Vegeu les diferències entre les dues versions seleccionades d'aquesta pàgina.",
-'tooltip-watch' => 'Afegiu aquesta pàgina a la vostra llista de seguiment',
-'tooltip-recreate' => 'Recrea la pàgina malgrat hagi estat suprimida',
-'tooltip-upload' => 'Inicia la càrrega',
-'tooltip-rollback' => "«Rollback» reverteix les edicions del darrer contribuïdor d'aquesta pàgina en un clic.",
-'tooltip-undo' => '«Desfés» reverteix aquesta modificació i obre un formulari de previsualització.
+'tooltip-pt-userpage' => "La vostra pàgina d'usuari",
+'tooltip-pt-anonuserpage' => "La pàgina d'usuari per la ip que utilitzeu",
+'tooltip-pt-mytalk' => 'La vostra pàgina de discussió.',
+'tooltip-pt-anontalk' => 'Discussió sobre les edicions per aquesta adreça ip.',
+'tooltip-pt-preferences' => 'Les vostres preferències.',
+'tooltip-pt-watchlist' => 'La llista de pàgines de les que estau vigilant els canvis.',
+'tooltip-pt-mycontris' => 'Llista de les vostres contribucions.',
+'tooltip-pt-login' => 'Us animem a registrar-vos, però no és obligatori.',
+'tooltip-pt-anonlogin' => 'Us animem a registrar-vos, però no és obligatori.',
+'tooltip-pt-logout' => "Finalitza la sessió d'usuari",
+'tooltip-ca-talk' => "Discussió sobre el contingut d'aquesta pàgina.",
+'tooltip-ca-edit' => 'Podeu modificar aquesta pàgina. Si us plau, previsualitzeu-la abans de desar.',
+'tooltip-ca-addsection' => 'Comença una nova secció',
+'tooltip-ca-viewsource' => 'Aquesta pàgina està protegida. Podeu veure el seu codi font.',
+'tooltip-ca-history' => "Versions antigues d'aquesta pàgina.",
+'tooltip-ca-protect' => 'Protegeix aquesta pàgina.',
+'tooltip-ca-unprotect' => 'Desprotegeix aquesta pàgina',
+'tooltip-ca-delete' => 'Elimina aquesta pàgina',
+'tooltip-ca-undelete' => 'Restaura les edicions fetes a aquesta pàgina abans de que fos esborrada.',
+'tooltip-ca-move' => 'Reanomena aquesta pàgina',
+'tooltip-ca-watch' => 'Afegiu aquesta pàgina a la vostra llista de seguiment.',
+'tooltip-ca-unwatch' => 'Suprimiu aquesta pàgina de la vostra llista de seguiment',
+'tooltip-search' => 'Cerca en el projecte {{SITENAME}}',
+'tooltip-search-go' => 'Vés a una pàgina amb aquest nom exacte si existeix',
+'tooltip-search-fulltext' => 'Cerca a les pàgines aquest text',
+'tooltip-p-logo' => 'Pàgina principal',
+'tooltip-n-mainpage' => 'Visiteu la pàgina principal.',
+'tooltip-n-mainpage-description' => 'Vegeu la pàgina principal',
+'tooltip-n-portal' => 'Sobre el projecte, què podeu fer, on podeu trobar coses.',
+'tooltip-n-currentevents' => "Per trobar informació general sobre l'actualitat.",
+'tooltip-n-recentchanges' => 'La llista de canvis recents a la wiki.',
+'tooltip-n-randompage' => 'Vés a una pàgina aleatòria.',
+'tooltip-n-help' => 'El lloc per esbrinar.',
+'tooltip-t-whatlinkshere' => 'Llista de totes les pàgines viqui que enllacen ací.',
+'tooltip-t-recentchangeslinked' => 'Canvis recents a pàgines que enllacen amb aquesta pàgina.',
+'tooltip-feed-rss' => "Canal RSS d'aquesta pàgina",
+'tooltip-feed-atom' => "Canal Atom d'aquesta pàgina",
+'tooltip-t-contributions' => "Vegeu la llista de contribucions d'aquest usuari.",
+'tooltip-t-emailuser' => 'Envia un correu en aquest usuari.',
+'tooltip-t-upload' => "Càrrega d'imatges o altres fitxers.",
+'tooltip-t-specialpages' => 'Llista de totes les pàgines especials.',
+'tooltip-t-print' => "Versió per a impressió d'aquesta pàgina",
+'tooltip-t-permalink' => 'Enllaç permanent a aquesta versió de la pàgina',
+'tooltip-ca-nstab-main' => 'Vegeu el contingut de la pàgina.',
+'tooltip-ca-nstab-user' => "Vegeu la pàgina de l'usuari.",
+'tooltip-ca-nstab-media' => "Vegeu la pàgina de l'element multimèdia",
+'tooltip-ca-nstab-special' => 'Aquesta és una pàgina especial, no podeu modificar-la',
+'tooltip-ca-nstab-project' => 'Vegeu la pàgina del projecte',
+'tooltip-ca-nstab-image' => 'Visualitza la pàgina del fitxer',
+'tooltip-ca-nstab-mediawiki' => 'Vegeu el missatge de sistema',
+'tooltip-ca-nstab-template' => 'Vegeu la plantilla',
+'tooltip-ca-nstab-help' => "Vegeu la pàgina d'ajuda",
+'tooltip-ca-nstab-category' => 'Vegeu la pàgina de la categoria',
+'tooltip-minoredit' => 'Marca-ho com una modificació menor',
+'tooltip-save' => 'Desa els vostres canvis',
+'tooltip-preview' => 'Reviseu els vostres canvis, feu-ho abans de desar res!',
+'tooltip-diff' => 'Mostra quins canvis heu fet al text',
+'tooltip-compareselectedversions' => "Vegeu les diferències entre les dues versions seleccionades d'aquesta pàgina.",
+'tooltip-watch' => 'Afegiu aquesta pàgina a la vostra llista de seguiment',
+'tooltip-watchlistedit-normal-submit' => 'Suprimeix els títols',
+'tooltip-watchlistedit-raw-submit' => 'Actualitza la llista de seguiment',
+'tooltip-recreate' => 'Recrea la pàgina malgrat hagi estat suprimida',
+'tooltip-upload' => 'Inicia la càrrega',
+'tooltip-rollback' => "«Rollback» reverteix les edicions del darrer contribuïdor d'aquesta pàgina en un clic.",
+'tooltip-undo' => '«Desfés» reverteix aquesta modificació i obre un formulari de previsualització.
Permet afegir un motiu al resum.',
-'tooltip-preferences-save' => 'Desa preferències',
-'tooltip-summary' => 'Afegiu un breu resum',
+'tooltip-preferences-save' => 'Desa preferències',
+'tooltip-summary' => 'Afegiu un breu resum',
# Stylesheets
'common.css' => '/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */',
@@ -2811,9 +2883,6 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
# Patrol log
'patrol-log-page' => 'Registre de supervisió',
'patrol-log-header' => 'Això és un registre de les revisions patrullades.',
-'patrol-log-line' => 'ha marcat $3 la $1 de «$2» com a supervisada',
-'patrol-log-auto' => '(automàticament)',
-'patrol-log-diff' => 'revisió $1',
'log-show-hide-patrol' => '$1 el registre de patrulla',
# Image deletion
@@ -2840,11 +2909,11 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
'file-info' => 'mida: $1, tipus MIME: $2',
'file-info-size' => '$1 × $2 píxels, mida del fitxer: $3, tipus MIME: $4',
'file-info-size-pages' => '$1 × $2 píxels, mida del fitxer: $3, tipus MIME: $4, $5 {{PLURAL:$5|pàgina|pàgines}}',
-'file-nohires' => '<small>No hi ha cap versió amb una resolució més gran.</small>',
+'file-nohires' => 'No hi ha cap versió amb una resolució més gran.',
'svg-long-desc' => 'fitxer SVG, nominalment $1 × $2 píxels, mida del fitxer: $3',
'show-big-image' => 'Imatge en màxima resolució',
-'show-big-image-preview' => "<small>Mida d'aquesta previsualització: $1.</small>",
-'show-big-image-other' => '<small>Altres resolucions: $1.</small>',
+'show-big-image-preview' => "Mida d'aquesta previsualització: $1.",
+'show-big-image-other' => '{{PLURAL:$2|Altra resolució|Altres resolucions}}: $1.',
'show-big-image-size' => '$1 × $2 píxels',
'file-info-gif-looped' => 'embuclat',
'file-info-gif-frames' => '$1 {{PLURAL:$1|fotograma|fotogrames}}',
@@ -2865,7 +2934,12 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
'sp-newimages-showfrom' => 'Mostra fitxers nous des del $1 a les $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'minutes-abbrev' => 'min',
+'minutes-abbrev' => '$1 min',
+'seconds' => '{{PLURAL:$1|$1 segon|$1 segons}}',
+'minutes' => '{{PLURAL:$1|$1 minut|$1 minuts}}',
+'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
+'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
+'ago' => 'fa $1',
# Bad image list
'bad_image_list' => "El format ha de ser el següent:
@@ -3369,13 +3443,6 @@ Aquest codi de confirmació caducarà el $4.",
'scarytranscludefailed' => '[Ha fallat la recuperació de la plantilla per a $1]',
'scarytranscludetoolong' => "[L'URL és massa llarg]",
-# Trackbacks
-'trackbackbox' => "Referències d'aquesta pàgina:<br />
-$1",
-'trackbackremove' => '([$1 eliminada])',
-'trackbacklink' => 'Referència',
-'trackbackdeleteok' => "La referència s'ha eliminat amb èxit.",
-
# Delete conflict
'deletedwhileediting' => "'''Avís''': S'ha eliminat aquesta pàgina després que haguéssiu començat a modificar-la!",
'confirmrecreate' => "L'usuari [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:
@@ -3457,6 +3524,9 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
'watchlisttools-edit' => 'Visualitza i edita la llista de seguiment',
'watchlisttools-raw' => 'Edita la llista de seguiment sense format',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussió]])',
+
# Core parser functions
'unknown_extension_tag' => "Etiqueta d'extensió desconeguda «$1»",
'duplicate-defaultsort' => 'Atenció: La clau d\'ordenació per defecte "$2" invalida l\'anterior clau "$1".',
@@ -3513,7 +3583,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'specialpages-note' => '----
* Pàgines especials normals.
* <span class="mw-specialpagerestricted">Pàgines especials restringides.</span>
-* <span class="mw-specialpagecached">Pàgines especials amb memòria cau.</span>',
+* <span class="mw-specialpagecached">Pàgines especials en memòria cau (poden ser obsoletes).</span>',
'specialpages-group-maintenance' => 'Informes de manteniment',
'specialpages-group-other' => 'Altres pàgines especials',
'specialpages-group-login' => 'Inici de sessió / Registre',
@@ -3555,13 +3625,16 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'tags-hitcount' => '$1 {{PLURAL:$1|canvi|canvis}}',
# Special:ComparePages
-'comparepages' => 'Comparar pàgines',
-'compare-selector' => 'Comparar revisions de pàgines',
-'compare-page1' => 'Pàgina 1',
-'compare-page2' => 'Pàgina 2',
-'compare-rev1' => 'Revisió 1',
-'compare-rev2' => 'Revisió 2',
-'compare-submit' => 'Compara',
+'comparepages' => 'Comparar pàgines',
+'compare-selector' => 'Comparar revisions de pàgines',
+'compare-page1' => 'Pàgina 1',
+'compare-page2' => 'Pàgina 2',
+'compare-rev1' => 'Revisió 1',
+'compare-rev2' => 'Revisió 2',
+'compare-submit' => 'Compara',
+'compare-invalid-title' => 'El títol que heu especificat no és vàlid.',
+'compare-title-not-exists' => 'El títol que heu especificat no existeix.',
+'compare-revision-not-exists' => 'La revisió que heu especificat no existeix.',
# Database error messages
'dberr-header' => 'Aquest wiki té un problema',
@@ -3588,4 +3661,90 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'sqlite-has-fts' => '$1, amb suport de búsqueda de text íntegre',
'sqlite-no-fts' => '$1, sense supor de búsqueda de text íntegre',
+# New logging system
+'logentry-delete-delete' => '$1 ha esborrat la pàgina $3',
+'logentry-delete-restore' => '$1 ha restaurat la pàgina $3',
+'logentry-delete-event' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
+'logentry-delete-revision' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
+'logentry-delete-event-legacy' => "$1 ha canviat la visibilitat d'esdeveniments al registre de $3",
+'logentry-delete-revision-legacy' => '$1 ha canviat la visibilitat de revisions a la pàgina $3',
+'logentry-suppress-delete' => '$1 ha suprimit la pàgina $3',
+'logentry-suppress-event' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
+'logentry-suppress-revision' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
+'logentry-suppress-event-legacy' => "$1 secretament ha canviat la visibilitat d'esdeveniments al registre de $3",
+'logentry-suppress-revision-legacy' => '$1 secretament ha canviat la visibilitat de revisions a la pàgina $3',
+'revdelete-content-hid' => 'ha ocultat contingut',
+'revdelete-summary-hid' => "ha ocultat el resum d'edició",
+'revdelete-uname-hid' => "ha ocultat el nom d'usuari",
+'revdelete-content-unhid' => 'ha revelat contingut que era ocult',
+'revdelete-summary-unhid' => "ha revelat el resum d'edició que era ocult",
+'revdelete-uname-unhid' => "ha revelat un nom d'usuari que era ocult",
+'revdelete-restricted' => 'ha aplicat restriccions als administradors',
+'revdelete-unrestricted' => 'ha tret les restriccions als administradors',
+'logentry-move-move' => '$1 ha desplaçat la pàgina $3 a $4',
+'logentry-move-move-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 sense deixar cap redirecció',
+'logentry-move-move_redir' => '$1 ha desplaçat la pàgina $3 a $4, on hi havia una redirecció',
+'logentry-move-move_redir-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
+'logentry-patrol-patrol' => '$1 ha marcat la versió $4 de la pàgina $3 com a patrullada',
+'logentry-patrol-patrol-auto' => '$1 ha marcat automàticament la versió $4 de la pàgina $3 com a patrullada',
+'logentry-newusers-newusers' => "$1 ha creat un compte d'usuari",
+'logentry-newusers-create' => "$1 ha creat un compte d'usuari",
+'logentry-newusers-create2' => "$1 ha creat el compte d'usuari $3",
+'logentry-newusers-autocreate' => "El compte d'usuari $1 ha estat creat de manera automàtica",
+'newuserlog-byemail' => 'contrasenya enviada per correu electrònic',
+
+# Feedback
+'feedback-bugornote' => "Si podeu descriure un problema tècnic en detall, [$1 informeu-ne].
+Altrament, podeu fer servir un senzill formulari a continuació. El vostre comentari s'afegirà a la pàgina «[$3 $2]», juntament amb el vostre nom d'usuari i el navegador que esteu emprant.",
+'feedback-subject' => 'Assumpte:',
+'feedback-message' => 'Missatge:',
+'feedback-cancel' => 'Canceŀla',
+'feedback-submit' => 'Envieu la vostra opinió',
+'feedback-adding' => "S'està afegint el comentari a la pàgina...",
+'feedback-error1' => "Error: Resultat de l'API no reconegut",
+'feedback-error2' => 'Error: Edició fallida',
+'feedback-error3' => "Error: No hi ha resposta de l'API",
+'feedback-thanks' => "Gràcies! S'ha publicat la vostra opinió a la pàgina «[$2 $1]».",
+'feedback-close' => 'Fet',
+'feedback-bugcheck' => 'Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].',
+'feedback-bugnew' => "Ja ho he comprovat. Informeu d'un nou problema",
+
+# API errors
+'api-error-badaccess-groups' => 'No teniu permís per a carregar fitxers en aquest wiki.',
+'api-error-badtoken' => 'Error intern: argument incorrecte.',
+'api-error-copyuploaddisabled' => 'Les càrregues via URL estan desactivades en aquest servidor.',
+'api-error-duplicate' => 'Ja hi ha {{PLURAL:$1|[$2 un altre fitxer]|[$2 altres fitxers]}} en aquest lloc web amb el mateix contingut.',
+'api-error-duplicate-archive' => 'Aquí ja hi ha hagut {{PLURAL:$1|[$2 un altre fitxer]|[$2 altres fitxers]}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.',
+'api-error-duplicate-archive-popup-title' => "Duplica {{PLURAL:$1|el fitxer|els fitxers}} que ja s'han eliminat",
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Fitxer duplicat|Fitxers duplicats}}',
+'api-error-empty-file' => 'El fitxer que heu tramès està buit.',
+'api-error-emptypage' => 'No es permet la creació de pàgines noves en blanc.',
+'api-error-fetchfileerror' => 'Error intern: quelcom no ha funcionat en accedir al fitxer.',
+'api-error-file-too-large' => 'El fitxer que heu tramès és massa gran.',
+'api-error-filename-tooshort' => 'El nom del fitxer és massa curt.',
+'api-error-filetype-banned' => 'Aquest tipus de fitxer està prohibit.',
+'api-error-filetype-missing' => 'El nom de fitxer no té extensió.',
+'api-error-hookaborted' => "La modificació que heu intentat fer ha estat canceŀlada per un mòdul d'extensió.",
+'api-error-http' => 'Error intern: no es pot connectar al servidor.',
+'api-error-illegal-filename' => 'El nom del fitxer no està permès.',
+'api-error-internal-error' => 'Error intern: el procés de càrrega en el wiki no ha funcionat.',
+'api-error-invalid-file-key' => "Error intern: no s'ha trobat el fitxer al dipòsit temporal.",
+'api-error-missingparam' => 'Error intern: falten paràmetres a la petició.',
+'api-error-missingresult' => "Error intern: no s'ha pogut determinar si la còpia ha reeixit.",
+'api-error-mustbeloggedin' => "Cal que estigueu autenticats en un compte d'usuari per a poder carregar fitxers.",
+'api-error-mustbeposted' => 'Error intern: la sol·licitud necessita HTTP POST.',
+'api-error-noimageinfo' => "La pujada s'ha realitzat amb èxit, però el servidor no ha proporcionat cap informació del fitxer.",
+'api-error-nomodule' => 'Error intern: no està definit el mòdul de càrregues.',
+'api-error-ok-but-empty' => 'Error intern: no hi ha resposta del servidor.',
+'api-error-overwrite' => 'No està permès sobreescriure un fitxer existent.',
+'api-error-stashfailed' => 'Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.',
+'api-error-timeout' => 'El servidor no ha respost en el temps esperat.',
+'api-error-unclassified' => "S'ha produït un error desconegut",
+'api-error-unknown-code' => 'Error desconegut: «$1»',
+'api-error-unknown-error' => 'Error intern: quelcom no ha funcionat en intentar carregar el fitxer.',
+'api-error-unknown-warning' => 'Avís desconegut: $1',
+'api-error-unknownerror' => 'Error desconegut: «$1».',
+'api-error-uploaddisabled' => 'Estan desactivades les càrregues en aquest wiki',
+'api-error-verification-error' => 'Aquest fitxer pot estar danyat, o tenir una extensió incorrecta.',
+
);
diff --git a/languages/messages/MessagesCbk_zam.php b/languages/messages/MessagesCbk_zam.php
index 0a4f4fbe..5e6e2f95 100644
--- a/languages/messages/MessagesCbk_zam.php
+++ b/languages/messages/MessagesCbk_zam.php
@@ -131,10 +131,6 @@ Por favor mira tambien el maga [[Special:WantedCategories|categoria requeridas]]
'blockipsuccesssub' => 'El prohibicion es confirmado con exito',
'contribslink' => 'Maga contribuciones',
-# Move page
-'1movedto2' => 'Ya move con el articulo de nombre [[$1]] y ahora cambiado ya na nombre [[$2]]',
-'1movedto2_redir' => 'Ya move con el articulo de nombre [[$1]] sobre un redireccion y ahora cambiado ya na nombre [[$2]]',
-
# Tooltip help for the actions
'tooltip-search' => 'Busca na {{SITENAME}}',
'tooltip-n-mainpage' => 'Visita na Primero Pagina',
diff --git a/languages/messages/MessagesCdo.php b/languages/messages/MessagesCdo.php
index cd43fbf8..266c4179 100644
--- a/languages/messages/MessagesCdo.php
+++ b/languages/messages/MessagesCdo.php
@@ -201,11 +201,10 @@ $messages = array(
SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'cannotdelete' => 'Mò̤ nièng-ngài chÄ“ng lâi ciÄ hiÄ•k-miêng hĕ̤k ùng-giông. (KÅ̤-nèng Ä«-gÄ­ng ké̤ṳk nè̤ng chÄ“ng lâi go̤ lÄu.)',
-'perfcached' => "Â-dÄ̤ gì só-gé̤ṳ ké̤ṳk ká̤-chṳ̄ (''cashed'') guó, kÅ̤-nèng Ä«-gÄ­ng guó-gÄ­.",
-'perfcachedts' => "Â-dÄ̤ gì só-gé̤ṳ ké̤ṳk ká̤-chṳ̄ (''cashed'') guó, sèng siÅh huòi huăng-sÄ­ng gì sì-găng sê $1.",
+'perfcached' => "Â-dÄ̤ gì só-gé̤ṳ ké̤ṳk ká̤-chṳ̄ (''cashed'') guó, kÅ̤-nèng Ä«-gÄ­ng guó-gÄ­. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "Â-dÄ̤ gì só-gé̤ṳ ké̤ṳk ká̤-chṳ̄ (''cashed'') guó, sèng siÅh huòi huăng-sÄ­ng gì sì-găng sê $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'CÄ«-buàng buÅng hiÄ•k-miêng mâ̤ huăng-sÄ­ng. Só-gé̤ṳ iâ mâ̤ huăng-sÄ­ng.',
'viewsource' => 'Káng nguòng-dâi-mÄ',
-'viewsourcefor' => '$1 gì',
'protectedpagetext' => 'CÄ« hiÄ•k Ä«-gÄ­ng ké̤ṳk sÅ̤ kÄ« lÄu, mâ̤-sÄi siÅ­-gÄi.',
'viewsourcetext' => 'Nṳ̄ â̤-sÄi káng gâe̤ng hók-cié ciÄ hiÄ•k gì nguòng-dâi-mÄ:',
'editinginterface' => "'''GÄ«ng-gó̤:''' Nṳ̄ hiêng-câi lÄ̤ siÅ­-gÄi hiê-tÅ«ng gái-miêng gì hiÄ•k. Dó̤i ciÄ hiÄ•k gì gÄi-biéng â̤ Ä«ng-hiÅng gì-tă ê̤ṳng-hô gì gái-miêng.",
@@ -568,8 +567,7 @@ Siók-mìng: (dÄng) = gâe̤ng dék sÄ­ng bÄ“ng-buÅng bÄ«-piâng, (sèng) = gÃ
'linksearch-ok' => 'Sìng-tÅ̤',
# Special:Log/newusers
-'newuserlogpage' => 'Kŭi dióng-hô̤ nĭk-cé',
-'newuserlog-create-entry' => 'Sĭng ê̤ṳng-hô',
+'newuserlogpage' => 'Kŭi dióng-hô̤ nĭk-cé',
# E-mail user
'emailuser' => 'Gié diêng-piĕ ké̤ṳk ĭ',
@@ -615,7 +613,6 @@ IÅk-sṳ̄ nṳ̄ buóh-siÅng téng nṳ̄ gáng-sê-dăng gà̤-dÄ“ng dṳ̀
'confirmdeletetext' => 'Nṳ̄ cÅ«ng-bê ciÅng ciÄ hiÄ•k-miêng hĕ̤k ùng-giông lièng Ä­ găk só-gé̤ṳ-kó gì lÄ­k-sṳ̄ ciòng-buô chÄ“ng lâi. ChiÄng nṳ̄ káuk-nêng: nṳ̄ dÅng-cÄ­ng buóh siÅng cÅ«ng-kuÄng có̤, nṳ̄ liÄ“u-gÄi cÅ«ng-kuÄng có̤ gì hâiu-guÅ, bêng-chiÄ nṳ̄ cÅ«ng-kuÄng có̤ sê hù-hăk [[{{MediaWiki:Policy-url}}]].',
'actioncomplete' => 'Cék-hèng sìng-gŭng',
'deletedtext' => '"$1" Ä«-gÄ­ng ké̤ṳk chÄ“ng lâi go̤ lÄu. CÄ«-bÅng chÄ“ng hiÄ•k gì gé-liÅh dÅ­ gé diÅh $2.',
-'deletedarticle' => 'chēng lâi "[[$1]]"',
'dellogpage' => 'Chēng hiĕk nĭk-cé',
'dellogpagetext' => 'Â-dÄ̤ sê gé-liÅh cÄ«-bÅng chÄ“ng hiÄ•k gì dăng-dăng.',
'deletionlog' => 'chēng hiĕk nĭk-cé',
@@ -665,7 +662,6 @@ Có̤i âu gì siÅ­-gÄi sê [[User:$3|$3]] ([[User talk:$3|TÅ̤-lâung]]) sÅ«
'undeletebtn' => 'Hŭi-hók',
'undeletereset' => 'Dṳ̀ng-sÄ­ng siÄ',
'undeletecomment' => 'Pàng-lâung:',
-'undeletedarticle' => 'hŭi-hók "[[$1]]"',
'undelete-search-submit' => 'Sìng-tÅ̤',
# Namespace form on various pages
@@ -777,8 +773,6 @@ Nâ cÅ«ng-kuÄng, nṳ̄ â̤-sÄi cê-gă iè-dông hĕ̤k-ciÄ sê hăk-biáng
'talkexists' => "'''HiÄ•k-miêng buÅng-sÄ­ng Ä«-gÄ­ng ké̤ṳk iè-dông go̤ lÄu, dáng-sê tÅ̤-lâung-hiÄ•k mò̤ nièng-ngài iè-dông Ä­ng-ôi sÄ­ng biÄ•u-dà̤ â-dÄ̤ Ä«-gÄ­ng ô siÅh tiÅng tÅ̤-lâung-hiÄ•k lÄu. ChiÄng nṳ̄ cê-gă gâe̤ng cÄ« lâng hiÄ•k biáng lâ.'''",
'movedto' => 'iè gáu',
'movetalk' => 'Iè-dông siÅng-guăng tÅ̤-lâung hiÄ•k',
-'1movedto2' => '[[$1]] iè gáu [[$2]]',
-'1movedto2_redir' => '[[$1]] dṳ̀ng-sĭng dêng-hióng gáu [[$2]]',
'movelogpage' => 'Iè-dông nĭk-cé',
'movelogpagetext' => 'Â-dÄ̤ sê ké̤ṳk iè-dông guó gì hiÄ•k-miêng gì dăng-dăng.',
'movereason' => 'Nguòng-ĭng',
@@ -810,7 +804,7 @@ Nâ cÅ«ng-kuÄng, nṳ̄ â̤-sÄi cê-gă iè-dông hĕ̤k-ciÄ sê hăk-biáng
'nextdiff' => 'Â 1 hâung chă-biék →',
# Media information
-'file-nohires' => '<small>Cuòi sê có̤i duâi chióh-cháung.</small>',
+'file-nohires' => 'Cuòi sê có̤i duâi chióh-cháung.',
# Special:NewFiles
'showhidebots' => '($1 gĭ-ké-nè̤ng)',
diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php
index e6fc913e..869b70b9 100644
--- a/languages/messages/MessagesCe.php
+++ b/languages/messages/MessagesCe.php
@@ -58,151 +58,154 @@ $namespaceAliases = array(
'Тобан_дийца' => NS_CATEGORY_TALK
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$magicWords = array(
- 'redirect' => array( '0', '#дlаÑахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
- 'notoc' => array( '0', '__БÐЦ_ЧУЛÐЦÐÐœ__', '__БÐЦ_ЧУЛ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__ЙÐЦ_УЧЕ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛÐЦÐМБÐР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ЧУЛÐЦÐÐœ__', '__ЧУЛ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__ЦÐМЕГ_РЕДÐККХÐ_ÐГlОÐ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__КОЬРТÐ_ЙОЦÐШ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'КÐРÐРÐ_БУТТ', 'КÐРÐРÐ_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'КÐРÐРÐ_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ_МУХ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ_ÐБР', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'КÐРÐРÐ_ДЕ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'КÐРÐРÐ_ДЕ_2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'КÐРÐРÐЧУ_ДЕ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'КÐРÐРÐ_ШО', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'КÐРÐРÐ_Ð¥ÐÐ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'КÐРÐРÐ_СÐХЬТ', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'МЕТТИГÐÐ_БУТТ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'МЕСТÐЫЙ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'МЕТТИГÐÐ_БУТТ_1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ_МУХ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ_ÐБР', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'МЕТТИГÐÐ_ДЕ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'МЕТТИГÐÐ_ДЕ_2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'МЕТТИГÐÐ_ДЕ_ЦlЕ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'МЕТТИГÐÐ_ШО', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'МЕТТИГÐÐ_Ð¥ÐÐ', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'МЕТТИГÐÐ_СÐХЬТ', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ÐГlОÐИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ЯЗЗÐÐœÐШИ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'Ð¥lУМÐИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ДЕКЪÐШХОЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ДУКХÐЛЛÐ_ЖИГÐРÐ_ДЕКЪÐШХОЙ', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ÐИСДÐРШИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'ХЬÐЖÐРИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ÐГlОÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ÐГlОÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ЦlЕРИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ЦlЕРИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ДИЙЦÐРШИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ДИЙЦÐРШИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ЯЗЗÐÐœÐШИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ЯЗЗÐÐœÐШИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ЮЬЗЗИÐÐ_ÐГlОÐ_ЦlЕ', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ЮЬЗЗИÐÐ_ÐГlОÐ_ЦlЕ_2', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ÐГlОÐ_КlЕЛÐРÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ÐГlОÐ_КlЕЛÐРÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ÐГlОÐ_ЦlЕРÐ_БУХ', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ÐГlОÐ_ЦlЕРÐ_БУХ_2', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ДИЙЦÐРЕ_ÐГlОÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ДИЙЦÐРЕ_ÐГlОÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ÐГlОÐ_ЯЗЗÐÐœÐÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ÐГlОÐ_ЯЗЗÐÐœÐÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'Ð¥ÐÐÐœ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
- 'subst' => array( '0', 'Ð¥lОТТОР:', 'Ð¥lОТТ:', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'ВИКИ_Ð¥ÐÐÐœ_БОЦÐШ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'жима', 'жимо', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'жима=$1', 'жимо=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'бакъхьа', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'харцхьа', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'йоцуш', 'без', 'none' ),
- 'img_width' => array( '1', '$1цинт', '$1пкÑ', '$1px' ),
- 'img_center' => array( '1', 'юккъ', 'центр', 'center', 'centre' ),
- 'img_framed' => array( '1', 'гурабе', 'обрамить', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'гурабоцаш', 'безрамки', 'frameless' ),
- 'img_page' => array( '1', 'агlо=$1', 'агlо_$1', 'page_$1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'бакъхьалакхо', 'бакъхьалакхо=$1', 'бакъхьалакхо_$1', 'upright_$1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'доза', 'граница', 'border' ),
- 'img_baseline' => array( '1', 'бух', 'оÑнование', 'baseline' ),
- 'img_sub' => array( '1', 'буха', 'под', 'sub' ),
- 'img_super' => array( '1', 'тlе', 'над', 'super', 'sup' ),
- 'img_top' => array( '1', 'лакхахь', 'Ñверху', 'top' ),
- 'img_text_top' => array( '1', 'лакххьара-йоза', 'текÑÑ‚-Ñверху', 'text-top' ),
- 'img_middle' => array( '1', 'юккъе', 'поÑередине', 'middle' ),
- 'img_bottom' => array( '1', 'бухар', 'Ñнизу', 'bottom' ),
- 'img_text_bottom' => array( '1', 'бухара-йоза', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
- 'img_link' => array( '1', 'хьажориг=$1', 'ÑÑылка=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
- 'int' => array( '0', 'ЧУЬРÐ:', 'Ð’ÐУТР:', 'INT:' ),
- 'sitename' => array( '1', 'МЕТТИГ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'БО:', 'ПИ:', 'NS:' ),
- 'nse' => array( '0', 'БОХЬ:', 'ПИК:', 'NSE:' ),
- 'localurl' => array( '0', 'Ð¥lОТТÐЕЛЛÐ_МЕТТИГ:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'Ð¥lОТТÐЕЛЛÐ_МЕТТИГ_2:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
- 'server' => array( '0', 'ГlУЛКХДИРИГ', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'ГlУЛКХДЕЧУЬÐÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ÐЕКЪ_ОЦ_МЕТТÐКЕПÐ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'ЙОМÐÐÐ¥ÐТl', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
- 'grammar' => array( '0', 'ДОЖÐР:', 'ПÐДЕЖ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ВУ_ЙУ:', 'GENDER', 'ПОЛ:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__ХИЙЦÐР_ДОЦУШ_КОЬРТЕ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__ЙОЗÐ_ХИЙЦÐР_ДОЦУШ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'КÐРÐРÐ_КlИР', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'КÐРÐРÐ_КlИРÐÐ_ДЕ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'МЕТТИГЕРÐ_КlИРÐ', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'МЕТТИГÐÐ_КlИРÐÐ_ДЕ', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ЦУЬÐÐ_БÐШХО', 'ИД_ВЕРСИИ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЕ_БÐШХО', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЕ_БÐШХО_2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'БЕТТÐ_БÐШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ШО_БÐШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'КЪÐСТÐÐœ_ХЕÐÐ_БÐШХО', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'ДЕКЪÐШХОÐ_БÐШХО', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ДУКХÐЛЛИÐ_ТЕРÐХЬ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ХЬÐЛХÐР_ЭЛП_ЖИМÐ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ХЬÐЛХÐР_ЭЛП_ДОККХÐ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'КЕГИЙЧУ_ЭЛПÐШЦÐ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
- 'uc' => array( '0', 'ДÐККХИЙЧУ_ЭЛПÐШЦÐ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
- 'raw' => array( '0', 'ТÐЙÐÐЗÐ:', 'ÐЕОБРÐБ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ГÐЙТÐ_КОЬРТÐМОГl', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Т', 'Ð', 'R' ),
- 'newsectionlink' => array( '1', '__ХЬÐЖОРИГ_ОЦ_КЕРЛÐЧУ_ДЕКЪÐÐ__', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__ЙОЦÐШ_ХЬÐЖОРИГ_ОЦ_КЕРЛÐЧУ_ДЕКЪÐÐ__', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ЙОЛШЙОЛУ_БÐШХО', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ИШÐРЙИÐÐ_МЕТТИГ:', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ИШÐРЙÐР_МЕТТИГÐÐ', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'КЪÐСТÐÐœ_ЙОЛУЧУ_Ð¥ÐÐÐÐ', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'КЪÐСТÐÐœ_МЕТТИГÐ_Ð¥ÐÐÐÐ', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'ХЬÐЖОЧЕ_Ð¥ÐÐÐœ', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#МОТТ', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'МОТТ_ЧУЛÐЦÐÐœ', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'ÐГlОÐÐШ_ОЦ_ЦlЕРÐШКÐХЬ:', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ÐДМÐÐКУЬГÐЛХОЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ТЕРÐХЬÐÐ_БÐРÐМХlОТТОР', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ЙУЗÐ_Ð¥ÐРЦЕ', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
- 'padright' => array( '0', 'ЙУЗÐ_БÐКЪЕ', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
- 'special' => array( '0', 'белхан', 'гlуллакхан', 'ÑлужебнаÑ', 'special' ),
- 'defaultsort' => array( '1', 'ЛИСТÐР_ЦÐХЬЕХОР', 'ДОГlÐ_ЛИСТÐРÐÐ', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ОЦ_Ð¥lУМÐÐТlЕ_ÐЕКЪ:', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'къаÑтам', 'къаÑто', 'къаÑÑ‚', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
- 'hiddencat' => array( '1', '__КЪÐЙЛÐХЙОЛУ_КÐДЕГÐР__', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'ÐГlОÐÐШ_ОЦУ_КÐДЕГÐРШЧОХЬ', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ÐГlОÐ_БÐРÐÐœ', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
- 'index' => array( '1', '__МЕТТИГТЕРÐХЬ__', '__ИÐДЕКС__', '__INDEX__' ),
- 'noindex' => array( '1', '__МЕТТИГТЕРÐХЬ_ЙОЦÐШ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'ТЕРÐХЬ_ОЦ_ТОБÐÐЦÐ', 'ЧИСЛО_Ð’_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__БУХЕХЬДЕРГ_ДlÐСХЬÐЖÐЙÐР__', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'ГlÐРОЛЛИ_БÐРÐÐœ', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'терахьибарам', 'форматдаты', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'ЙОМÐ', 'ПУТЬ', 'PATH' ),
- 'url_wiki' => array( '0', 'ЧЕХКÐ', 'ВИКИ', 'WIKI' ),
+ 'redirect' => array( '0', '#дlаÑахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БÐЦ_ЧУЛÐЦÐÐœ__', '__БÐЦ_ЧУЛ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ЙÐЦ_УЧЕ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛÐЦÐМБÐР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ЧУЛÐЦÐÐœ__', '__ЧУЛ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ЦÐМЕГ_РЕДÐККХÐ_ÐГlОÐ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__КОЬРТÐ_ЙОЦÐШ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'КÐРÐРÐ_БУТТ', 'КÐРÐРÐ_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'КÐРÐРÐ_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ_МУХ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ_ÐБР', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'КÐРÐРÐ_ДЕ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'КÐРÐРÐ_ДЕ_2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'КÐРÐРÐЧУ_ДЕ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'КÐРÐРÐ_ШО', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'КÐРÐРÐ_Ð¥ÐÐ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'КÐРÐРÐ_СÐХЬТ', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'МЕТТИГÐÐ_БУТТ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'МЕСТÐЫЙ_МЕСЯЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'МЕТТИГÐÐ_БУТТ_1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ_МУХ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'МЕТТИГÐÐ_БЕТТÐ_ЦlЕ_ÐБР', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'МЕТТИГÐÐ_ДЕ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'МЕТТИГÐÐ_ДЕ_2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'МЕТТИГÐÐ_ДЕ_ЦlЕ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'МЕТТИГÐÐ_ШО', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'МЕТТИГÐÐ_Ð¥ÐÐ', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'МЕТТИГÐÐ_СÐХЬТ', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ÐГlОÐИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ЯЗЗÐÐœÐШИ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Ð¥lУМÐИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ДЕКЪÐШХОЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ДУКХÐЛЛÐ_ЖИГÐРÐ_ДЕКЪÐШХОЙ', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ÐИСДÐРШИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ХЬÐЖÐРИЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ÐГlОÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ÐГlОÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ЦlЕРИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ЦlЕРИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ДИЙЦÐРШИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ДИЙЦÐРШИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ЯЗЗÐÐœÐШИ_ÐÐÐ', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ЯЗЗÐÐœÐШИ_ÐÐÐ_2', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ЮЬЗЗИÐÐ_ÐГlОÐ_ЦlЕ', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ЮЬЗЗИÐÐ_ÐГlОÐ_ЦlЕ_2', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ÐГlОÐ_КlЕЛÐРÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ÐГlОÐ_КlЕЛÐРÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ÐГlОÐ_ЦlЕРÐ_БУХ', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ÐГlОÐ_ЦlЕРÐ_БУХ_2', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ДИЙЦÐРЕ_ÐГlОÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ДИЙЦÐРЕ_ÐГlОÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ÐГlОÐ_ЯЗЗÐÐœÐÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ÐГlОÐ_ЯЗЗÐÐœÐÐ_ЦlЕ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'Ð¥ÐÐÐœ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'Ð¥lОТТОР:', 'Ð¥lОТТ:', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'ВИКИ_Ð¥ÐÐÐœ_БОЦÐШ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'жима', 'жимо', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'жима=$1', 'жимо=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'бакъхьа', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'харцхьа', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'йоцуш', 'без', 'none' ),
+ 'img_width' => array( '1', '$1цинт', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'юккъ', 'центр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'гурабе', 'обрамить', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'гурабоцаш', 'безрамки', 'frameless' ),
+ 'img_page' => array( '1', 'агlо=$1', 'агlо_$1', 'page_$1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'бакъхьалакхо', 'бакъхьалакхо=$1', 'бакъхьалакхо_$1', 'upright_$1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'доза', 'граница', 'border' ),
+ 'img_baseline' => array( '1', 'бух', 'оÑнование', 'baseline' ),
+ 'img_sub' => array( '1', 'буха', 'под', 'sub' ),
+ 'img_super' => array( '1', 'тlе', 'над', 'super', 'sup' ),
+ 'img_top' => array( '1', 'лакхахь', 'Ñверху', 'top' ),
+ 'img_text_top' => array( '1', 'лакххьара-йоза', 'текÑÑ‚-Ñверху', 'text-top' ),
+ 'img_middle' => array( '1', 'юккъе', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'бухар', 'Ñнизу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'бухара-йоза', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
+ 'img_link' => array( '1', 'хьажориг=$1', 'ÑÑылка=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ЧУЬРÐ:', 'Ð’ÐУТР:', 'INT:' ),
+ 'sitename' => array( '1', 'МЕТТИГ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'БО:', 'ПИ:', 'NS:' ),
+ 'nse' => array( '0', 'БОХЬ:', 'ПИК:', 'NSE:' ),
+ 'localurl' => array( '0', 'Ð¥lОТТÐЕЛЛÐ_МЕТТИГ:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'Ð¥lОТТÐЕЛЛÐ_МЕТТИГ_2:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'ГlУЛКХДИРИГ', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'ГlУЛКХДЕЧУЬÐÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ÐЕКЪ_ОЦ_МЕТТÐКЕПÐ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'ЙОМÐÐÐ¥ÐТl', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'ДОЖÐР:', 'ПÐДЕЖ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ВУ_ЙУ:', 'GENDER', 'ПОЛ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__ХИЙЦÐР_ДОЦУШ_КОЬРТЕ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ЙОЗÐ_ХИЙЦÐР_ДОЦУШ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'КÐРÐРÐ_КlИР', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'КÐРÐРÐ_КlИРÐÐ_ДЕ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'МЕТТИГЕРÐ_КlИРÐ', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'МЕТТИГÐÐ_КlИРÐÐ_ДЕ', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ЦУЬÐÐ_БÐШХО', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕ_БÐШХО', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕ_БÐШХО_2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'БЕТТÐ_БÐШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ШО_БÐШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'КЪÐСТÐÐœ_ХЕÐÐ_БÐШХО', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'ДЕКЪÐШХОÐ_БÐШХО', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ДУКХÐЛЛИÐ_ТЕРÐХЬ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ХЬÐЛХÐР_ЭЛП_ЖИМÐ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ХЬÐЛХÐР_ЭЛП_ДОККХÐ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'КЕГИЙЧУ_ЭЛПÐШЦÐ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
+ 'uc' => array( '0', 'ДÐККХИЙЧУ_ЭЛПÐШЦÐ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
+ 'raw' => array( '0', 'ТÐЙÐÐЗÐ:', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ГÐЙТÐ_КОЬРТÐМОГl', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Т', 'Ð', 'R' ),
+ 'newsectionlink' => array( '1', '__ХЬÐЖОРИГ_ОЦ_КЕРЛÐЧУ_ДЕКЪÐÐ__', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__ЙОЦÐШ_ХЬÐЖОРИГ_ОЦ_КЕРЛÐЧУ_ДЕКЪÐÐ__', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ЙОЛШЙОЛУ_БÐШХО', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ИШÐРЙИÐÐ_МЕТТИГ:', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ИШÐРЙÐР_МЕТТИГÐÐ', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'КЪÐСТÐÐœ_ЙОЛУЧУ_Ð¥ÐÐÐÐ', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'КЪÐСТÐÐœ_МЕТТИГÐ_Ð¥ÐÐÐÐ', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ХЬÐЖОЧЕ_Ð¥ÐÐÐœ', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#МОТТ', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'МОТТ_ЧУЛÐЦÐÐœ', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ÐГlОÐÐШ_ОЦ_ЦlЕРÐШКÐХЬ:', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ÐДМÐÐКУЬГÐЛХОЙ_ДУКХÐЛЛÐ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ТЕРÐХЬÐÐ_БÐРÐМХlОТТОР', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ЙУЗÐ_Ð¥ÐРЦЕ', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
+ 'padright' => array( '0', 'ЙУЗÐ_БÐКЪЕ', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
+ 'special' => array( '0', 'белхан', 'гlуллакхан', 'ÑлужебнаÑ', 'special' ),
+ 'defaultsort' => array( '1', 'ЛИСТÐР_ЦÐХЬЕХОР', 'ДОГlÐ_ЛИСТÐРÐÐ', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ОЦ_Ð¥lУМÐÐТlЕ_ÐЕКЪ:', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'къаÑтам', 'къаÑто', 'къаÑÑ‚', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
+ 'hiddencat' => array( '1', '__КЪÐЙЛÐХЙОЛУ_КÐДЕГÐР__', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'ÐГlОÐÐШ_ОЦУ_КÐДЕГÐРШЧОХЬ', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ÐГlОÐ_БÐРÐÐœ', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
+ 'index' => array( '1', '__МЕТТИГТЕРÐХЬ__', '__ИÐДЕКС__', '__INDEX__' ),
+ 'noindex' => array( '1', '__МЕТТИГТЕРÐХЬ_ЙОЦÐШ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'ТЕРÐХЬ_ОЦ_ТОБÐÐЦÐ', 'ЧИСЛО_Ð’_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__БУХЕХЬДЕРГ_ДlÐСХЬÐЖÐЙÐР__', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ГlÐРОЛЛИ_БÐРÐÐœ', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'терахьибарам', 'форматдаты', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ЙОМÐ', 'ПУТЬ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ЧЕХКÐ', 'ВИКИ', 'WIKI' ),
);
$messages = array(
@@ -534,7 +537,6 @@ $1',
'badtitle' => 'Цамегаш йолу цlе',
'badtitletext' => 'Дехарца йолу агlонан цlе нийÑа Ñц, йаьÑÑа ÑŽ, хила мега нийÑа ца Ñ…lоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу Ñаберг.',
'viewsource' => 'Хьажар',
-'viewsourcefor' => 'Ðгlо «$1»',
'protectedpagetext' => 'Хlара агlо дlакъойлина йу рé цадаккхийта.',
'viewsourcetext' => 'Хьоьга далундерг хьажар а дезахь Ñ…lокху агlон чура йоза хьаÑцар:',
'protectedinterface' => 'Ð¥lара Ñхьгайтарна гlирÑа хаамаш латтош йолу агlо йу. Гlуо лелачаьрга гал ца Ñккхийта, оцун хийцам ба магийна дац.',
@@ -708,8 +710,6 @@ $1',
'revdelete-radio-unset' => 'Хlахlа',
'revdelete-log' => 'Бахьан:',
'revdel-restore' => 'Хийцам бе Ñхьагарехь',
-'revdelete-content' => 'чуьраниг',
-'revdelete-uname' => 'декъашхон цlе',
'revdelete-reasonotherlist' => 'Кхин бахьан',
# History merging
@@ -1067,9 +1067,7 @@ PICT # тайп тайпан
'activeusers' => 'Жигар декъашхой могlам',
# Special:Log/newusers
-'newuserlogpage' => 'Декъашхой дlабазбина тептар',
-'newuserlog-create-entry' => 'Керла декъашхо',
-'newuserlog-autocreate-entry' => 'Дlайазвар кхоллина ша шех',
+'newuserlogpage' => 'Декъашхой дlабазбина тептар',
# Special:ListGroupRights
'listgrouprights' => 'Декъашхойн тобанаши бакъонаш',
@@ -1116,7 +1114,6 @@ PICT # тайп тайпан
'actioncomplete' => 'Дешдерг кхочушди',
'deletedtext' => '«$1» дlаÑккхина йара.
Хьажа. $2 хьажарна оцу тlаьхьара дlадайаран могlаме.',
-'deletedarticle' => 'дlадайинарг «[[$1]]»',
'dellogpage' => 'Дlадайарш долу тéптар',
'deletionlog' => 'дlадайарш долу тéптар',
'deletecomment' => 'Бахьан:',
@@ -1164,7 +1161,6 @@ PICT # тайп тайпан
'undeleterevdel' => 'Метта Ñ…lоттор хира дац, нагахь иза дакъошкахь дlадайина далахь а Ñ‚lаьххьара киÑак башхо йа Ñ…lума.
Иштнарг хилча ахьа дlабаккха беза Ñ…lоттийна болу къаÑтам йа хьагайта Ñ‚lаьххьара дlайайина башхо.',
'undeletelink' => 'хьажа/метта хlоттаде',
-'undeletedarticle' => 'метта хlоттийна «[[$1]]»',
'undelete-search-submit' => 'Лаха',
# Namespace form on various pages
@@ -1258,8 +1254,6 @@ PICT # тайп тайпан
'talkexists' => "'''Ðгlон цlе хийцина йара, амма дийцаре агlон цlе хийца цало, Ñ…lунда аьльча иза Ñанна цlе йолу агlо йолуш ÑŽ. Дехар до, куьйга Ñ…lотта уьш.'''",
'movedto' => 'цlе хийцина оцу',
'movetalk' => 'Цуьнца йогlуш йолу дийцаре агlон цlе хийцар',
-'1movedto2' => 'цlе хийцина «[[$1]]» оцу «[[$2]]»',
-'1movedto2_redir' => '«[[$1]]» цlе хийцина оцу «[[$2]]» дlаÑахьажоран Ñ‚lохул',
'movelogpage' => 'Цlераш хийцаран тептар',
'movereason' => 'Бахьан:',
'revertmove' => 'йухаÑккха',
@@ -1389,7 +1383,7 @@ PICT # тайп тайпан
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|агlо|агlонаш|агlонаш}}',
'file-info-size' => '$1 × $2 Ñиртакх, Ñ…lуман барам: $3, MIME-тайп: $4',
-'file-nohires' => '<small>Кхи йоккха гlоле башхо Ñц.</small>',
+'file-nohires' => 'Кхи йоккха гlоле башхо Ñц.',
'svg-long-desc' => 'SVG-хlума, хlоттамца $1 × $2 цинташ, хlуман барам: $3',
'show-big-image' => 'Сурт цlанал лаккхара бакъонца',
@@ -1399,7 +1393,7 @@ PICT # тайп тайпан
'ilsubmit' => 'Лаха',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'оцу',
+'seconds-abbrev' => '$1оцу',
# Bad image list
'bad_image_list' => 'Барам хила беза ишта:
@@ -1444,9 +1438,6 @@ PICT # тайп тайпан
'monthsall' => 'маÑÑо',
'limitall' => 'маÑÑо',
-# Trackbacks
-'trackbackremove' => '([$1 дlадайá])',
-
# Delete conflict
'confirmrecreate' => "Декъашхо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) Ñ…lара агlо дlадайина, хьо иза ниÑда вола велча, дlадайарна бахьан:
: ''$2''
diff --git a/languages/messages/MessagesCeb.php b/languages/messages/MessagesCeb.php
index fdd276b4..76472f8c 100644
--- a/languages/messages/MessagesCeb.php
+++ b/languages/messages/MessagesCeb.php
@@ -407,15 +407,14 @@ Puyde kini gipapas na sa uban.',
'badtitle' => 'Bati nga titulo',
'badtitletext' => 'Ang gihangyong titulo sa panid mahimong inbalido, walay sulod, o nasayop og sumpay nga inter-pinulongan o inter-wiki nga titulo.
Basin aduna kini usa o daghan pang mga karakter nga dili magamit isip titulo.',
-'perfcached' => 'Ang mosunod nga data naka-cache ug mahimong dili ang labing bag-o.',
-'perfcachedts' => 'Ang mosunod nga data naka-cache, ug kataposang nabag-o sa $1.',
+'perfcached' => 'Ang mosunod nga data naka-cache ug mahimong dili ang labing bag-o. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ang mosunod nga data naka-cache, ug kataposang nabag-o sa $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ang mga update alang sa kining panid naka-disable sa kasamtangan.
Dili karon dayon ma-refresh ang data dinhi.',
'wrong_wfQuery_params' => 'Sayop nga mga parametro sa wfQuery()<br />
Function: $1<br />
Query: $2',
'viewsource' => 'Tan-awa ang ginikanan',
-'viewsourcefor' => 'para kang $1',
'actionthrottled' => 'Na-throttle ang lihok',
'actionthrottledtext' => "Isip anti-spam, gilimitahan ka sa sinagunson nga paghimo niining lihok sa mubong panahon lang, ikaw misobra na sa maong limit.
Palihog sulayi'g usab sa pipila ka minutos.",
@@ -653,8 +652,6 @@ Isip tagdumala, puyde nimo [$1 tan-awon ang diff] kon gusto ka magpadayon.",
'revdelete-unsuppress' => 'Tangtanga ang mga restriksyon sa nabalik nga mga rebisyon',
'revdelete-log' => 'Rason:',
'revdelete-submit' => 'I-aplay sa napiling rebisyon',
-'revdelete-logentry' => 'giusab ang bisibilidad sa rebisyon sa [[$1]]',
-'logdelete-logentry' => 'giusab ang bisibilidad sa event sa [[$1]]',
'revdelete-success' => "'''Ang bisibilidad sa rebisyon malamposong na-set.'''",
'revdelete-failure' => "'''Ang bisibilidad sa rebisyon dili ma-set.'''
$1",
@@ -664,15 +661,6 @@ $1",
'revdel-restore' => 'usba ang bisibilidad',
'pagehist' => 'Kaagi sa panid',
'deletedhist' => 'Napapas nga kaagi',
-'revdelete-content' => 'sulod',
-'revdelete-summary' => 'mubong sugid sa pag-usab',
-'revdelete-uname' => 'username',
-'revdelete-restricted' => 'mga na-aplay nga restriksyon sa mga tagdumala',
-'revdelete-unrestricted' => 'gitangtang ang mga restriksyon alang sa mga tagdumala',
-'revdelete-hid' => 'gitago $1',
-'revdelete-unhid' => 'ayaw itago $1',
-'revdelete-log-message' => '$1 para sa $2 {{PLURAL:$2|rebisyon|mga rebisyon}}',
-'logdelete-log-message' => '$1 para sa $2 {{PLURAL:$2|event|mga event}}',
'revdelete-hide-current' => 'Sayop sa pagtago sa item sa petsa sa $2, $1: kini ang kasamtangang rebisyon.
Dili puyde kini tagoon.',
'revdelete-show-no-access' => 'Sayop sa pagtago sa item sa petsa sa $2, $1: namarkahan kini isip "restricted".
@@ -775,7 +763,7 @@ Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.
'prefs-rc' => 'Mga bag-ong pag-usab',
'prefs-watchlist' => 'Gibantayan',
'prefs-watchlist-days' => 'Mga adlaw nga ipakita sa gibantayan:',
-'prefs-watchlist-days-max' => 'Maximum 7 ka adlaw',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Maximum nga numero sa pag-usab nga ipakita sa ekspanded nga gibantayan:',
'prefs-watchlist-edits-max' => 'Maximum nga numero: 1000',
'prefs-watchlist-token' => 'Token sa gibantayan',
@@ -984,11 +972,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'linksearch' => 'Mga sumpay sa gawas',
# Special:Log/newusers
-'newuserlogpage' => "Log sa paghimo'g gumagamit",
-'newuserlogpagetext' => "Kini mao ang ''log'' sa bag-ong namugnang mga gumagamit.",
-'newuserlog-byemail' => "ang pasword gipadala na pinaagi sa ''e-mail''",
-'newuserlog-create-entry' => 'Bag-ong gumagamit',
-'newuserlog-create2-entry' => "naghimo'g akawnt alang kang $1",
+'newuserlogpage' => "Log sa paghimo'g gumagamit",
+'newuserlogpagetext' => "Kini mao ang ''log'' sa bag-ong namugnang mga gumagamit.",
# Special:ListGroupRights
'listgrouprights-members' => '(talaan sa mga miyembro)',
@@ -1020,7 +1005,6 @@ Palihog ikompirma nga imo gyud ni buhaton, nga nakasabot ka sa mga puyde idangat
'actioncomplete' => 'Nahuman na ang lihok',
'deletedtext' => 'Ang "$1" napapas na.
Tan-awa ang $2 para sa rekord sa mga bag-ong napapas.',
-'deletedarticle' => 'gitangtang "[[$1]]"',
'dellogpage' => 'Log sa pagtangtang',
'deletecomment' => 'Rason:',
'deleteotherreason' => 'Uban pa/dugang nga rason:',
@@ -1054,8 +1038,7 @@ Puyde nimo usbon ang level sa proteksyon ning panid, pero dili kini makaapekto s
'restriction-level' => 'Level sa restriksyon:',
# Undelete
-'undeletelink' => 'tan-awa/ibalik',
-'undeletedarticle' => 'nabalik "[[$1]]"',
+'undeletelink' => 'tan-awa/ibalik',
# Namespace form on various pages
'namespace' => 'Ngalang espasyo:',
@@ -1137,8 +1120,6 @@ Palihog pagpili og laing ngalan.',
Palihog imanwal ang pag-merge nila.'''",
'movedto' => 'nabalhin ngadto',
'movetalk' => 'Ibalhin ang kaubang panid sa hisgot',
-'1movedto2' => 'gibalhin ang [[$1]] ngadto sa [[$2]]',
-'1movedto2_redir' => 'gibalhin ang [[$1]] ngadto sa [[$2]] taas sa redirek',
'movelogpage' => 'Log sa pagbalhin',
'movereason' => 'Rason:',
'revertmove' => 'i-revert',
@@ -1211,7 +1192,7 @@ Puyde dugangan og rason sa mubong sugid.',
# Media information
'file-info-size' => '$1 × $2 pixels, size sa payl: $3, MIME type: $4',
-'file-nohires' => '<small>Walay mas taas nga resolusyon.</small>',
+'file-nohires' => 'Walay mas taas nga resolusyon.',
'svg-long-desc' => 'SVG nga payl, nominally $1 × $2 pixels, size sa payl: $3',
'show-big-image' => 'Tibuok resolusyon',
@@ -1261,4 +1242,9 @@ Ang uban default nga nakatago.
# Special:SpecialPages
'specialpages' => 'Espesyal nga mga panid',
+# New logging system
+'revdelete-restricted' => 'mga na-aplay nga restriksyon sa mga tagdumala',
+'revdelete-unrestricted' => 'gitangtang ang mga restriksyon alang sa mga tagdumala',
+'newuserlog-byemail' => "ang pasword gipadala na pinaagi sa ''e-mail''",
+
);
diff --git a/languages/messages/MessagesCh.php b/languages/messages/MessagesCh.php
index 53e00a27..5f4f1bd9 100644
--- a/languages/messages/MessagesCh.php
+++ b/languages/messages/MessagesCh.php
@@ -294,7 +294,6 @@ Pot fabot ripotta este para un [[Special:ListUsers/sysop|administrator]], ya un
'unexpected' => 'Ti ma\'antisipa i guinaha: "$1"="$2".',
'badtitle' => 'BÃ¥ba na titulo',
'viewsource' => 'Atan i code',
-'viewsourcefor' => 'para $1',
'viewsourcetext' => "Siña un li'e' yan kopia i code ni påhina:",
'namespaceprotected' => "Ti nahong nibet-mu petmisu tumulaika i påhina siha ni mafa'na'an '''$1'''.",
'ns-specialprotected' => 'Ti siña un tulaika i manespesiat na påhina.',
@@ -446,9 +445,6 @@ Ti siña un usa i ramientan 'e-mail i muna'sesetbi,' solo guåha e-mail address
Machomma' i ID #$5.
Pot fabot, na'hålom i ID gi todus i finaisen-mu siha.",
'blockednoreason' => "ti mana'i rason",
-'blockedoriginalsource' => "Ma'a'annok i code '''$1''' gi papa':",
-'blockededitsource' => "Ma'a'annok gi papa' i tinige' '''tinilaika-mu''' gi '''$1''':",
-'whitelistedittitle' => 'Nesesario malogin para tumulaika',
'whitelistedittext' => 'Un nesisita ma$1 para tumulaika påhina.',
'confirmedittext' => "Un nesisita un konfotme iyo-mu email åntes di tumulaika påhina.
Pot fabot po'lo yan konfotme iyo-mu e-mail gi [[Special:Preferences|prifirensia muna'sesetbi]].",
@@ -581,20 +577,11 @@ fana'an guåha attikulo gi [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGEN
'revdelete-unsuppress' => "Na'suha i chinemma' siha gi tinilaika manmana'lo siha",
'revdelete-log' => 'Rason:',
'revdelete-submit' => "Na'aplika gi tinilaika ni ma'ayek",
-'revdelete-logentry' => "ha tulaika i lini'e'on ribision [[$1]]",
-'logdelete-logentry' => "ha tulaika i lini'e'on kasu [[$1]]",
'revdelete-success' => "'''Munhåyan i sinesedi i lini'e'on ribision .'''",
'logdelete-success' => "'''Munhåyan i sinesedi i lini'e'on log.'''",
'revdel-restore' => "Tulaika i lini'e'on",
'pagehist' => 'Historian påhina',
'deletedhist' => "Historia mana'suha",
-'revdelete-content' => 'guinaha',
-'revdelete-summary' => 'tulaika i sumaria',
-'revdelete-uname' => "nå'an muna'sesetbi",
-'revdelete-hid' => "manå'na' $1",
-'revdelete-unhid' => "mana'annok $1",
-'revdelete-log-message' => '$1 para $2 {{PLURAL:$2|na ribision|na ribision siha}}',
-'logdelete-log-message' => '$1 para $2 {{PLURAL:$2|na kåsu|na kåsu siha}}',
# Suppression log
'suppressionlog' => "Log manchinemma'",
@@ -923,7 +910,6 @@ Konfotme fan na este i malago'-mu, na kumonprende hao hiniyong-ña, yan tumattiy
'actioncomplete' => 'Funhayan i aksion',
'deletedtext' => 'Mana\'suha "$1".
Chek $2 para i historian muna\'suha gi halacha.',
-'deletedarticle' => 'Mana\'suha "[[$1]]"',
'dellogpage' => "Historian muna'suha",
'deletecomment' => 'Rason:',
'deleteotherreason' => 'Otru na rason:',
@@ -1026,7 +1012,6 @@ Ayek fan otru nå'an-ña.",
'talkexists' => "'''Munhåyan i siniha i påhina mismo, lao ti siña ha kånya i påhinan kombetsasion sa' guåha esta otru ni titulon nuebu.'''",
'movedto' => 'makånya para',
'movetalk' => 'Kånya i påhinan kombetsasion',
-'1movedto2' => 'Makånya [[$1]] påra [[$2]]',
'movelogpage' => 'KÃ¥nya i log',
'movereason' => 'Rason:',
'revertmove' => 'tulaika tatte',
@@ -1101,7 +1086,7 @@ Ayek fan otru nå'an-ña.",
# Media information
'file-info-size' => '$1 × $2 na pixel, mineddong atkibu: $3, MIME klåsi: $4',
-'file-nohires' => "<small>TÃ¥ya' mas takhilo' na risolusion.</small>",
+'file-nohires' => "TÃ¥ya' mas takhilo' na risolusion.",
'svg-long-desc' => 'Atkibu SVG, $1 × $2 na pixels, mineddong atkibu: $3',
'show-big-image' => 'Magåhet mineddong-ña',
diff --git a/languages/messages/MessagesChr.php b/languages/messages/MessagesChr.php
index 81944a03..7d6c5253 100644
--- a/languages/messages/MessagesChr.php
+++ b/languages/messages/MessagesChr.php
@@ -7,7 +7,10 @@
* @ingroup Language
* @file
*
+ * @author Etse (on chr.wikipedia.org)
+ * @author Gmaxwell (on chr.wikipedia.org)
* @author Maximillion Pegasus
+ * @author Srtxg (on chr.wikipedia.org)
*/
$messages = array(
diff --git a/languages/messages/MessagesCkb.php b/languages/messages/MessagesCkb.php
index 054fae63..fd91328d 100644
--- a/languages/messages/MessagesCkb.php
+++ b/languages/messages/MessagesCkb.php
@@ -132,14 +132,14 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'img_thumbnail' => array( '1', 'ÙˆÛŽÙ†Û†Ú©', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'ڕاست', 'right' ),
- 'img_left' => array( '1', 'Ú†Û•Ù¾', 'left' ),
- 'img_width' => array( '1', '$1پیکسڵ', '$1px' ),
- 'img_center' => array( '1', 'ناوەڕاست', 'center', 'centre' ),
- 'img_framed' => array( '1', 'چوارچێوە', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'بێچوارچێوە', 'frameless' ),
- 'img_border' => array( '1', 'سنوور', 'border' ),
+ 'img_thumbnail' => array( '1', 'ÙˆÛŽÙ†Û†Ú©', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'ڕاست', 'right' ),
+ 'img_left' => array( '1', 'Ú†Û•Ù¾', 'left' ),
+ 'img_width' => array( '1', '$1پیکسڵ', '$1px' ),
+ 'img_center' => array( '1', 'ناوەڕاست', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'چوارچێوە', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'بێچوارچێوە', 'frameless' ),
+ 'img_border' => array( '1', 'سنوور', 'border' ),
);
$messages = array(
@@ -399,6 +399,7 @@ $1',
تەماشای [[Special:Version|پەڕەی وەشان]] بکە.',
'ok' => 'باشه‌',
+'backlinksubtitle' => '→ $1',
'retrievedfrom' => 'وەرگیراو لە «$1»',
'youhavenewmessages' => '$1ت ھەیە ($2).',
'newmessageslink' => 'پەیامی نوێ',
@@ -493,15 +494,14 @@ $1',
'badtitle' => 'ناونیشانی خراپ',
'badtitletext' => 'سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.
ڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.',
-'perfcached' => 'ئەم داتای خوارەوە پاشەکەوتی کەشە وە ناکرێ تازەی بکەیەوە.',
-'perfcachedts' => 'ئەم داتای خوارەوە کەش کراوە، و دوایین جار لە $1 تازە کراوەتەوە',
+'perfcached' => 'ئەم داتای خوارەوە پاشەکەوتی کەشە وە ناکرێ تازەی بکەیەوە. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ئەم داتای خوارەوە کەش کراوە، و دوایین جار لە $1 تازە کراوەتەوە A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'تازەکردنەوەی ئەم لاپەڕە لە حاڵی ئێستا دا ناچالاک کراو.
داتای ئەم شوێنە بەم زووانە تازە ناکرێتەوە.',
'wrong_wfQuery_params' => 'پارامێتری ھەڵە بۆ wfQuery()<br />
کردار: $1<br />
داواکاری: $2',
'viewsource' => 'سەرچاوەکەی ببینە',
-'viewsourcefor' => 'بۆ $1',
'actionthrottled' => 'چالاکی پێشی پێ گیرا',
'actionthrottledtext' => 'بە مەبەستی پێشگریی لە سپەم، ڕێگە نادرێت تۆ لە ماوەیەکی کورت دا لە سەر یەک ئەمە زۆر جار ئەنجام بدەی، وە ئیستا تۆ لە ڕادە بەدەرت کردووە.
تکایە پاش چەند خولەک دووبارە تاقی بکەوە.',
@@ -706,9 +706,6 @@ $2',
ئای‌پی ئەدرەسی ئێستای تۆ $3 و پەێناسەی بەربەست‌کراو #$5.<br />
تکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.',
'blockednoreason' => 'هیچ هۆکارێک نەدراوە',
-'blockedoriginalsource' => "سەرچاوەی '''$1''' لەخوارەوە پیشاندراوە:",
-'blockededitsource' => "دەقی '''دەستکاریەکانی تۆ''' بۆ '''$1''' لە خوارەوە نیشان‌دراوە:",
-'whitelistedittitle' => 'بۆ دەستکاریکردن پێویستە لەژوورەوە بیت',
'whitelistedittext' => 'بۆ دەستکاری کردنی لاپەڕەکان دەبێ $1.',
'confirmedittext' => 'پێویستە پێش هەرجۆرە دەستکاریەکی لاپەڕەکان ئەدرەسی ئیمەیلت ڕاچاو کردبێت .<br />
تکایە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ئی‌مەیلەکەت دانێ و بڕواپێکراوی بکە.',
@@ -952,8 +949,6 @@ $3 هۆکاری "$2" خستوەتەڕوو',
'revdelete-unsuppress' => 'لابردنی بەربەستەکان لە سەر پێداچوونەوە گەڕێندراوەکان',
'revdelete-log' => 'هۆکار:',
'revdelete-submit' => 'خستنەکار بۆ سەر پێداچوونەوە {{PLURAL:$1|ھەڵبژێردراوەکە|ھەڵبژێردراوەکان}}',
-'revdelete-logentry' => 'گۆڕانی بەرچاوکەوتنی دەستکارییەکی [[$1]]',
-'logdelete-logentry' => 'بیندرانی ڕووداوە‌ گۆڕاوەکەی [[$1]]',
'revdelete-success' => "'''چۆنیەتی بیندرانی پێداچوونەوە بە سەرکەوتوویی نوێکراوە.'''",
'revdelete-failure' => "'''ناکرێ دەرکەوتنی پێداچوونەوە نوێبکرێتەوە:'''
$1",
@@ -965,15 +960,6 @@ $1",
'revdel-restore-visible' => 'پێداچوونەوە دەرکەوتووەکان',
'pagehist' => 'مێژووی پەڕە',
'deletedhist' => 'مێژوو بسڕەوە',
-'revdelete-content' => 'ناوەرۆک',
-'revdelete-summary' => 'پوختەی دەستکاری',
-'revdelete-uname' => 'ناوی بەکارهێنەر',
-'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
-'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
-'revdelete-hid' => '$1ـی داشارد',
-'revdelete-unhid' => '$1ـی ئاشکرا کرد',
-'revdelete-log-message' => '$1 بۆ {{PLURAL:$2|پێداچوونەوەی|پێداچوونەوەکانی}} $2',
-'logdelete-log-message' => '$1 بۆ {{PLURAL:$2|ڕووداوی|ڕووداوەکانی}} $2',
'revdelete-hide-current' => 'هەڵە لە شاردنەوەی بابەتی ڕیکەوتی $1، کات $2: ئەم پێداچوونەوە ئێستا لەکاردایە.
ناکرێ داشاردرێت.',
'revdelete-show-no-access' => 'هەڵە لە نیشان‌دانی بابەتی ڕیکەوتی $1، کات $2: ئەم بابەتە وەک "بەرگیراو"‌ نیشانکراوە.
@@ -1132,7 +1118,7 @@ $1",
'prefs-rc' => 'دوایین گۆڕانکارییەکان',
'prefs-watchlist' => 'لیستی چاودێری',
'prefs-watchlist-days' => 'ژمارەی ڕۆژەکان بۆ نیشاندان لە لیستی چاودێری:',
-'prefs-watchlist-days-max' => 'ئه‌وپه‌ڕی ٧ ڕۆژ',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'ئەوپەڕی ژمارەی گۆڕانکارییەکان بۆ نیشاندان لە لیستی چاودێریی پەرەپێدراو:',
'prefs-watchlist-edits-max' => 'ئەوپەڕی ژمارە: ١٠٠٠',
'prefs-watchlist-token' => 'ڕەمزی لیستی چاودێری:',
@@ -1321,7 +1307,6 @@ $1",
'right-autopatrol' => 'خۆکار لەژێرچاودێری نیشان‌کردنی دەستکاریەکانی کەسێک بۆخۆی',
'right-patrolmarks' => 'دیتنی دوایین دەستکاریەکان وا لەژێرچاودێری نیشان‌کراون',
'right-unwatchedpages' => 'دیتنی لیستێک لەو لاپەڕانەی چاودێری ناکرێن',
-'right-trackback' => 'ناردنی ڕێچکەیەک',
'right-mergehistory' => 'سەریەک‌خستنی میژووی لاپەڕەکان',
'right-userrights' => 'دەستکاری ماÙەکانی هەموو بەکارهێنەران',
'right-userrights-interwiki' => 'دەستکاری ماÙەکانی بەکارهێنەریی بەکارهێنەران Ù„Û• ویکی‌یەکانی دیکە‌دا',
@@ -1364,7 +1349,6 @@ $1",
'action-patrol' => 'لەژێرچاودێری نیشان‌کردنی دەستکاریەکانی کەسانی‌تر',
'action-autopatrol' => 'دەستکاریەکانت وەک لەژێرچاودێری نیشان کراون',
'action-unwatchedpages' => 'دیتنی لیستێک لەو لاپەڕانەی چاودێری ناکرێن',
-'action-trackback' => 'ناردنی ڕێچکەیەک',
'action-mergehistory' => 'سەریەک‌خستنی میژووی ئەم لاپەڕە',
'action-userrights' => 'دەستکاری ماÙەکانی هەموو بەکارهێنەران',
'action-userrights-interwiki' => 'دەستکاری ماÙەکانی بەکارهێنەریی بەکارهێنەران Ù„Û• ویکی‌یەکانی دیکە‌دا',
@@ -1612,7 +1596,6 @@ $1',
# File reversion
'filerevert' => 'پێچەوانەکردنەوەی $1',
-'filerevert-backlink' => '→ $1',
'filerevert-legend' => 'پێچەوانەکردنەوەی پەڕگە',
'filerevert-intro' => "خەریکی پەڕگەی '''[[Media:$1|$1]]''' دەگەڕینیتەوە بۆ [$4 وەشانی $3، $2].",
'filerevert-comment' => 'هۆکار:',
@@ -1623,7 +1606,6 @@ $1',
# File deletion
'filedelete' => 'سڕینەوەی $1',
-'filedelete-backlink' => '→ $1',
'filedelete-legend' => 'سڕینەوەی پەڕگە',
'filedelete-intro' => "خەریکی پەڕگەی '''[[Media:$1|$1]]''' دەگەڵ هەموو مێژووی دەسڕیتەوە.",
'filedelete-intro-old' => "خەریکی وەشانی [$4 $3، $2] لە '''[[Media:$1|$1]]''' دەسڕیتەوە.",
@@ -1758,7 +1740,7 @@ $1',
'listusers-editsonly' => 'تەنھا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە',
'listusers-creationsort' => 'ڕیز کردن بە پێی ڕێکەوتی دروست کردن',
'usereditcount' => '$1 {{PLURAL:$1|دەستکاری|دەستکاری}}',
-'usercreated' => 'دروست کراو لە $2ی $1',
+'usercreated' => 'لە $1 کاتژمێر $2 {{GENDER:$3|دروستکراوە}}',
'newpages' => 'پەڕە نوێکان',
'newpages-username' => 'ناوی بەکارھێنەر:',
'ancientpages' => 'کۆنترین پەڕەکان',
@@ -1848,12 +1830,8 @@ $1',
'activeusers-noresult' => 'هیچ بەکارهێنەرێک نەدۆزرایەوە',
# Special:Log/newusers
-'newuserlogpage' => 'لۆگی دروست کردنی بەکارھێنەر',
-'newuserlogpagetext' => 'ئەمە لۆگێکی درووست‌کردنی بەکارهێنەرە.',
-'newuserlog-byemail' => 'تێپەڕوشە بە ئیمەیل نێردرا.',
-'newuserlog-create-entry' => 'بەکارھێنەری نوێ',
-'newuserlog-create2-entry' => 'ھەژماری $1ی دروست کرد',
-'newuserlog-autocreate-entry' => 'هەژمارە بە جۆری خۆکار درووست‌کرا',
+'newuserlogpage' => 'لۆگی دروست کردنی بەکارھێنەر',
+'newuserlogpagetext' => 'ئەمە لۆگێکی درووست‌کردنی بەکارهێنەرە.',
# Special:ListGroupRights
'listgrouprights' => 'ماÙەکانی گرووپە بەکارھێنەرییەکان',
@@ -1983,7 +1961,6 @@ $UNWATCHURL
'exbeforeblank' => 'ناوەرۆک بەر لە بەتاڵ کردنەوە ئەمە بوو: «$1»',
'exblank' => 'پەڕە خاڵی بوو',
'delete-confirm' => 'سڕینەوەی «$1»',
-'delete-backlink' => '→ $1',
'delete-legend' => 'بیسڕەوە',
'historywarning' => "'''وشیار بە:''' پەڕەیەک کە دەتەوێ بیسڕیتەوە مێژوویەکی ھەیە بە نزیکەی $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}وە:",
'confirmdeletetext' => 'تۆ خەریکی پەڕەیەک بە ھەموو مێژووەکەیەوە دەسڕیتەو.
@@ -1992,8 +1969,6 @@ $UNWATCHURL
'actionfailed' => 'کردارەکە سەرنەکەوت',
'deletedtext' => '«$1» سڕایەوە.
سەیری $2 بکە بۆ تۆمارێکی دوایین سڕینەوەکان.',
-'deletedarticle' => '«[[$1]]»ی سڕییەوە',
-'suppressedarticle' => '«[[$1]]»ی دامرکاندەوە',
'dellogpage' => 'لۆگی سڕینەوە',
'dellogpagetext' => 'ئەوەی خوارەوە لیستێكە لە دوایین سڕینەوەکان',
'deletionlog' => 'لۆگی سڕینەوە',
@@ -2042,7 +2017,6 @@ $UNWATCHURL
'movedarticleprotection' => 'ڕێککارییەکانی پاراستن لە "[[$2]]" گوازرایەوە بۆ "[[$1]]"',
'protect-title' => 'گۆڕینی ئاستی پاراستنی "$1"',
'prot_1movedto2' => '[[$1]] گوازراوەتەوە بۆ [[$2]]',
-'protect-backlink' => '↠$1',
'protect-legend' => 'پاراستن تەیید بکە',
'protectcomment' => 'ھۆکار:',
'protectexpiry' => 'ھەتا:',
@@ -2122,7 +2096,6 @@ $UNWATCHURL
'undeletereset' => 'بردنەوە نووک',
'undeleteinvert' => 'هەڵگێڕانەوەی هەڵبژاردن',
'undeletecomment' => 'هۆکار:',
-'undeletedarticle' => '«[[$1]]» گێڕایەوە',
'undeletedrevisions' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} هێنرایەوە',
'undeletedrevisions-files' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} و {{PLURAL:$2|1 پەڕگە|$2 پەڕگە}} هێنرایەوە',
'undeletedfiles' => '{{PLURAL:$1|1 پەڕگە|$1 پەڕگە}} هێنرایەوه',
@@ -2372,9 +2345,6 @@ $1',
'movepage-page-moved' => 'پەڕەی $1 گۆزرایەوە بۆ $2.',
'movepage-page-unmoved' => 'ناکرێ پەڕەی $1 بگوێزرێتەوە بۆ $2.',
'movepage-max-pages' => 'زۆرینەی ژمارەی $1 {{PLURAL:$1|لاپەڕە|لاپەڕە}} گوێستراوەتەوە و لەوە زیاتر خۆکار ناگوێسترێتەوە.',
-'1movedto2' => '«[[$1]]»ی گواستەوە بۆ «[[$2]]»',
-'1movedto2_redir' => 'بە ڕەوانکردنەوە، [[$1]] گۆزرایەوە بۆ [[$2]]',
-'move-redirect-suppressed' => 'ڕەوانەکردن بەرگری‌کراوە',
'movelogpage' => 'لۆگی گواستنەوە',
'movelogpagetext' => 'لە خوارەوەدا لیستی ھەموو پەڕە گواستنەوەکان دەبینن.',
'movesubpage' => '{{PLURAL:$1|ژێرپەڕە|ژێرپەڕە}}',
@@ -2622,8 +2592,6 @@ $1',
# Patrol log
'patrol-log-page' => 'لۆگی چاودێری',
'patrol-log-header' => 'ئەمە لۆگێکی چاودێری پێداچوونەوەکانە.',
-'patrol-log-auto' => '(خۆکار)',
-'patrol-log-diff' => 'پێداچوونەوە $1',
'log-show-hide-patrol' => 'لۆگی چاودێری $1',
# Image deletion
@@ -2642,7 +2610,7 @@ $1',
'thumbsize' => 'قەبارەی وێنۆک:',
'file-info' => 'قه‌باره‌: $1, جۆر: $2',
'file-info-size' => '$1 × $2 پیکسێل، قەبارەی پەڕگە: $3، جۆری MIME: $4',
-'file-nohires' => '<small>رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.</small>',
+'file-nohires' => 'رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.',
'svg-long-desc' => 'پەڕگەی SVG، بە ناو $1 × $2 پیکسەڵ، قەبارەی پەڕگە: $3',
'show-big-image' => 'گەورە کردنەوە',
@@ -2897,9 +2865,6 @@ $5
# Scary transclusion
'scarytranscludetoolong' => '[URL زۆر درێژە]',
-# Trackbacks
-'trackbackremove' => '([سڕینەوە $1])',
-
# Delete conflict
'deletedwhileediting' => "'''ھۆشیار بە''': ئەم پەڕە دوای ئەوە تۆ دەستکاریکردنیت دەستپێکرد سڕاوەتەوە!",
'recreate' => 'درووست‌کردنەوە',
@@ -3108,4 +3073,9 @@ $5
'htmlform-reset' => 'پووچەڵکردنەوەی دەستکارییەکان',
'htmlform-selectorother-other' => 'دیکە',
+# New logging system
+'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
+'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
+'newuserlog-byemail' => 'تێپەڕوشە بە ئیمەیل نێردرا.',
+
);
diff --git a/languages/messages/MessagesCo.php b/languages/messages/MessagesCo.php
index 9c2c74c2..91b6cc45 100644
--- a/languages/messages/MessagesCo.php
+++ b/languages/messages/MessagesCo.php
@@ -7,6 +7,8 @@
* @ingroup Language
* @file
*
+ * @author Ale Mister (on co.wikipedia.org)
+ * @author Img (on co.wikipedia.org)
*/
$messages = array(
@@ -156,7 +158,6 @@ $messages = array(
# General errors
'error' => 'Errore',
'internalerror' => 'Errore internu',
-'viewsourcefor' => 'di $1',
# Login and logout pages
'yourname' => 'Nome di utilizatore:',
@@ -439,8 +440,6 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
'move-watch' => 'Fighjulà issa pagina',
'movepagebtn' => 'Move a pagina',
'movedto' => 'mossu à',
-'1movedto2' => 'hà mossu [[$1]] à [[$2]]',
-'1movedto2_redir' => 'hà reindirizzatu [[$1]] à [[$2]]',
'movelogpagetext' => 'Elencu di e pagine mosse.',
'movereason' => 'Mutivu:',
'delete_and_move_confirm' => 'Iè, supprimà issa pagina',
diff --git a/languages/messages/MessagesCps.php b/languages/messages/MessagesCps.php
index 01971b82..e9d47f99 100644
--- a/languages/messages/MessagesCps.php
+++ b/languages/messages/MessagesCps.php
@@ -371,18 +371,19 @@ Palihog isugid ini sa isa ka [[Special:ListUsers/sysop|administrator]], samtang
'badarticleerror' => 'Ang mini nga aksyon indi mahimo sa mini nga pahina.',
'cannotdelete' => 'Indi mapanas ang pahina ukon ang file nga "$1" .
Posible nga ginpanas na ini sang wala makilal-an.',
+'cannotdelete-title' => 'Indi mapanas ang pahina nga "$1"',
'badtitle' => 'Kala-in nga titulo',
'badtitletext' => 'Ang ginapangayo nga titulo sang pahina sala, wala unod, ukon may indi insakto nga koneksyon sa inter-language ukon sa titulo sang interwiki.
Pwede nga naga-unod mini sang isa ukon madamo pa nga mga karakter nga indi pwede gamiton sa mga titulo.',
-'perfcached' => '',
-'perfcachedts' => '',
+'perfcached' => 'Naka-cache ang mga gasunod nga pahina kag posible nga wala na sa panahon. {{PLURAL:$1|one result is|$1 results are}} ang pinakamataas nga bakante nga cache.',
+'perfcachedts' => 'Nakacache ang gasunod nga datos, kag nagligad nga ginsapanahon sang $1. {{PLURAL:$4|ang|$4 ang}} pinakamataas nga bakante nga cache.',
'querypage-no-updates' => 'Ginbawalan yanda ang mga update sa mini nga pahina .
Ang data diya wala napreskuhan sang aktwal.',
'wrong_wfQuery_params' => 'Sala nga mga parametro sa wfQuery()<br />
Pulos: $1<br />
Pamangkot: $2',
'viewsource' => 'Tan-awon ang ginhalinan',
-'viewsourcefor' => 'para sa $1',
+'viewsource-title' => 'Tan-awon ang ginhalinan para sa $1',
'actionthrottled' => 'Ginpunggan ang ulubrahon',
'actionthrottledtext' => 'Bilang pangontra spam nga mga pagsulundan, ginalimitahan ikaw sa pag-ubra sang mini nga mga aksyon sang madamo nga beses sa manubo nga oras, kag nagsobra ka na sa limitasyon.
Palihog tistingan liwat sa pila ka minutos.',
@@ -722,8 +723,7 @@ Ang paglarawan nga yara sa ibabaw sang [$2 pahina sang paglarawan sang akta] sin
'linksearch' => 'Panggwa nga mga link',
# Special:Log/newusers
-'newuserlogpage' => 'Listahan sang pag-ubra sang manug-usar',
-'newuserlog-create-entry' => 'Bag-o nga manug-usar',
+'newuserlogpage' => 'Listahan sang pag-ubra sang manug-usar',
# Special:ListGroupRights
'listgrouprights-members' => '(lista sang mga myembro)',
@@ -755,7 +755,6 @@ Palihog kumpirmahon nga intensyon mo nga himu-on mini, nga na-intindihan mo ang
'actioncomplete' => 'Tapos na ang aksyon',
'deletedtext' => 'Napanas na ang "$1".
Tan-awon ang $2 para sa nalista sang mga bag-o lang napanas.',
-'deletedarticle' => 'ginpanas ang "[[$1]]"',
'dellogpage' => 'Lista sang pagpanas',
'deletecomment' => 'Rason:',
'deleteotherreason' => 'Iban pa/dugang nga rason:',
@@ -791,7 +790,6 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang mini nga pahina, pero indi ma-a
# Undelete
'undeletelink' => 'tan-awon/ibalik',
'undeleteviewlink' => 'tan-awon',
-'undeletedarticle' => 'ginbalik ang "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Lang-at ngalan:',
@@ -872,8 +870,6 @@ Palihog pili liwat sang bag-o nga ngalan.',
Palihog pakikombinar sa ila sang manomano.'''",
'movedto' => 'ginsaylo sa',
'movetalk' => 'Isaylo ang kaangot nga pahina sang istoryahanay',
-'1movedto2' => 'Ang [[$1]] gin-saylo na sa [[$2]]',
-'1movedto2_redir' => 'Ang [[$1]] ginsaylo sa [[$2]] sa ibabaw sang pagdirekta',
'movelogpage' => 'Lista sang pagsaylo',
'movereason' => 'Rason:',
'revertmove' => 'ibalik',
@@ -947,7 +943,7 @@ Makit-an mo lang ang ginhalinan (source) sini.',
# Media information
'file-info-size' => '$1 × $2 piksel, kadakuon sang file: $3, klase sang MIME: $4',
-'file-nohires' => '<small>Wala na sang mas mataas pa nga resolusyon (katin-aw).</small>',
+'file-nohires' => 'Wala na sang mas mataas pa nga resolusyon (katin-aw).',
'svg-long-desc' => 'SVG file, nga ara sa $1 × $2 ka piksels, kadakuon sang file: $3',
'show-big-image' => 'Bilog nga resolusyon (katin-aw)',
diff --git a/languages/messages/MessagesCrh_cyrl.php b/languages/messages/MessagesCrh_cyrl.php
index b857c665..12fb6e68 100644
--- a/languages/messages/MessagesCrh_cyrl.php
+++ b/languages/messages/MessagesCrh_cyrl.php
@@ -62,6 +62,8 @@ $namespaceAliases = array(
'Kategoriya_muzakeresi' => NS_CATEGORY_TALK
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
$datePreferences = array(
'default',
@@ -458,16 +460,17 @@ $1',
'formerror' => 'Хата: форманынъ малюматыны ёлламакънынъ ич чареÑи ёкъ',
'badarticleerror' => 'Сиз Ñпмагъа иÑтеген ишлев бу Ñаифеде Ñпылып оламай.',
'cannotdelete' => '«$1» Ñаифе Ñ Ð´Ð° файлы ёкъ Ñтилип оламады. Башкъа бир къулланыджы тарафындан ёкъ Ñтильген ола биле.',
+'cannotdelete-title' => '«$1» ÑаифеÑини ёкъ Ñтмеге олмаз',
'badtitle' => 'РухÑетÑиз Ñерлева',
'badtitletext' => 'ИÑтенильген Ñаифе ады догъру дегиль, о боштыр, Ñхут тиллерара багъланты Ñ Ð´Ð° викилерара багъланты догъру Ñзылмагъан. Бельки Ñаифе адында ÑÑакълангъан ишаретлер бар.',
-'perfcached' => 'Малюматлар даа Ñвельджеден азырлангъан ола билир. Бу Ñебептен ÑÑкирген ола билир!',
-'perfcachedts' => 'Ðшагъыда кÑште Ñакълангъан малюмат булуна, Ñонъки Ñнъарув заманы: $1.',
+'perfcached' => 'Малюматлар даа Ñвельджеден азырлангъан ола билир. Бу Ñебептен ÑÑкирген ола билир! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ðшагъыда кÑште Ñакълангъан малюмат булуна, Ñонъки Ñнъарув заманы: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Бу Ñаифени денъиштирмеге шимди изин ёкъ. Бу малюмат аман Ñнъартылмайджакъ.',
'wrong_wfQuery_params' => 'wfQuery() функциÑÑÑ‹ ичюн изинÑиз параметрлер<br />
ФункциÑ: $1<br />
Соратма: $2',
'viewsource' => 'менба кодуны коÑьтер',
-'viewsourcefor' => '$1 ичюн',
+'viewsource-title' => '$1 ÑаифеÑининъ менба коду',
'actionthrottled' => 'Ðрекет токъталды',
'actionthrottledtext' => 'Спамгъа къаршы куреш Ñебебинден бу арекетни аз вакъыт ичинде чокъ кере текрарлап оламайÑынъыз. Мумкюн олгъан къарардан зиÑде арекет Ñптынъыз. Бир къач дакъкъадан Ñонъ текрарлап бакъынъыз.',
'protectedpagetext' => 'Бу Ñаифени кимÑе денъиштирмеÑин деп о блок Ñтильди.',
@@ -653,9 +656,6 @@ $2 къулланыджыÑына вакътынджа <code>$3</code> пароÐ
Дикъкъат Ñтинъиз ки, къайд олунмагъан ве e-mail адреÑинъизни [[Special:Preferences|шахÑий Ñазламаларда]] таÑдыкъламагъан алда, Ñм де блок Ñтильгенде Ñизге мектюп ёлламакъ ÑÑакъ Ñтильген олÑа, идареджиге мектюп ёллап оламазÑынъыз.
Шимдики IP адреÑинъиз — $3, блок Ñтюв идентификаторы — #$5. Лютфен, идареджилерге мектюплеринъизде оны бильдиринъиз.',
'blockednoreason' => 'Ñебеп бильдирильмеди',
-'blockedoriginalsource' => 'Ðшагъыда «$1» ÑаифеÑининъ метини булуна.',
-'blockededitsource' => "Ðшагъыда «$1» ÑаифеÑиндеки '''Ñпкъан денъиштирмелеринъизнинъ''' метини булуна.",
-'whitelistedittitle' => 'Денъиштирмек ичюн отурым ачмалыÑынъыз',
'whitelistedittext' => 'Саифени денъиштирмек ичюн $1 керекÑинъиз.',
'confirmedittext' => 'Саифени денъиштирмеден Ñвель e-mail адреÑинъизни таÑдыкъламалыÑынъыз. Лютфен, [[Special:Preferences|Ñазламалар ÑаифеÑинде]] e-mail адреÑинъизни кирÑетинъиз ве таÑдыкъланъыз.',
'nosuchsectiontitle' => 'Болюк тапыламады',
@@ -914,7 +914,7 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'prefs-rc' => 'Сонъки денъишмелер',
'prefs-watchlist' => 'Козетюв джедвели',
'prefs-watchlist-days' => 'Козетюв джедвелинде коÑьтериледжек кунь ÑайыÑÑ‹:',
-'prefs-watchlist-days-max' => '(Ñнъ чокъ 7 кунь)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Кенишлетилген козетюв джедвелинде коÑьтериледжек денъишмелер ÑайыÑÑ‹:',
'prefs-watchlist-edits-max' => '(Ñнъ чокъ 1000)',
'prefs-watchlist-token' => 'Козетюв джедвели ишарети:',
@@ -1004,7 +1004,7 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'userrights-lookup-user' => 'Къулланыджы группаларыны идаре ÑÑ‚',
'userrights-user-editname' => 'Озь къулланыджы адынъызны Ñзынъыз:',
'editusergroup' => 'Къулланыджы группалары низамла',
-'editinguser' => "'''[[User:$1|$1]]''' къулланыджыÑынынъ ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) изинлери денъиштирмектеÑинъиз",
+'editinguser' => "'''[[User:$1|$1]]''' $1 къулланыджыÑынынъ изинлери денъиштиреÑтаÑыз",
'userrights-editusergroup' => 'Къулланыджы группалары низамла',
'saveusergroups' => 'Къулланыджы группаларыны Ñакъла',
'userrights-groupsmember' => 'ÐзаÑÑ‹ олгъан группаларынъыз:',
@@ -1386,12 +1386,8 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'listusers-noresult' => 'Ич бир къулланыджы тапылмады.',
# Special:Log/newusers
-'newuserlogpage' => 'Янъы къулланыджы журналы',
-'newuserlogpagetext' => 'Энъ Ñонъки къайд олгъан къулланыджы журналы.',
-'newuserlog-byemail' => 'пароль e-mail ваÑтаÑынен йиберильген',
-'newuserlog-create-entry' => 'Янъы къулланыджы',
-'newuserlog-create2-entry' => 'Ñнъы ÑÑап Ñратты $1',
-'newuserlog-autocreate-entry' => 'ЭÑап автоматик оларакъ Ñратылды',
+'newuserlogpage' => 'Янъы къулланыджы журналы',
+'newuserlogpagetext' => 'Энъ Ñонъки къайд олгъан къулланыджы журналы.',
# Special:ListGroupRights
'listgrouprights-members' => '(азалар джедвели)',
@@ -1441,7 +1437,7 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'watchmethod-list' => 'козетюв джедвелиндеки Ñаифелер тешкериле',
'watchlistcontains' => 'Сизинъ козетюв джедвелинъизде {{PLURAL:$1|1|$1}} Ñаифе бар.',
'iteminvalidname' => '"$1" ÑаифеÑи мунаÑебетинен проблема олып чыкъты, Ñльверишли олмагъан иÑимдир…',
-'wlnote' => "Ðшагъыда Ñонъки {{PLURAL:$2|Ñаат|'''$2''' Ñаат}} ичинде Ñпылгъан Ñонъки {{PLURAL:$1|денъишиклик|'''$1''' денъишиклик}} коÑьтериле.",
+'wlnote' => "Ðшагъыда Ñаат $3, $4 ичюн Ñонъки {{PLURAL:$2|Ñаат|'''$2''' Ñаат}} ичинде Ñпылгъан Ñонъки {{PLURAL:$1|денъишме|'''$1''' денъишме}} коÑьтериле.",
'wlshowlast' => 'Сонъки $1 Ñаат ичюн, $2 кунь ичюн Ñ Ð´Ð° $3 коÑьтер',
'watchlist-options' => 'Козетюв джедвели Ñазламалары',
@@ -1505,7 +1501,6 @@ $UNWATCHURL
'actionfailed' => 'Ðрекет Ñпыламады',
'deletedtext' => '"$1" ёкъ Ñтильди.
Ñкъын заманда ёкъ Ñтильгенлерни корьмек ичюн: $2.',
-'deletedarticle' => '"[[$1]]" ёкъ Ñтильди',
'dellogpage' => 'Ðкъ Ñтюв журналы',
'dellogpagetext' => 'Ðшагъыдаки джедвель Ñонъки ёкъ Ñтюв журналыдыр.',
'deletionlog' => 'ёкъ Ñтюв журналы',
@@ -1571,7 +1566,6 @@ $UNWATCHURL
'undeletelink' => 'коÑьтер/кери кетир',
'undeletereset' => 'Вазгеч',
'undeletecomment' => 'Себеп:',
-'undeletedarticle' => '"[[$1]]" кери кетирильди.',
'undeletedrevisions' => 'Топлам {{PLURAL:$1|1 къайд|$1 къайд}} кери кетирильди.',
'undelete-header' => 'Кеченлерде ёкъ Ñтильген Ñаифелерни корьмек ичюн [[Special:Log/delete|ёкъ Ñтюв журналына]] бакъынъыз.',
@@ -1696,9 +1690,6 @@ $UNWATCHURL
'movepage-page-exists' => '$1 ÑаифеÑи Ñнди бар, ве автоматик оларакъ Ñнъыдан Ñзылып оламаз.',
'movepage-page-moved' => '$1 ÑаифеÑининъ ады $2 оларакъ денъиштирильди.',
'movepage-page-unmoved' => '$1 ÑаифеÑининъ ады $2 оларакъ денъиштирилип оламай.',
-'1movedto2' => '"[[$1]]" ÑаифеÑининъ ады "[[$2]]" оларакъ денъиштирильди',
-'1movedto2_redir' => '[[$1]] ÑерлеваÑÑ‹ [[$2]] ÑаифеÑине ёлланды',
-'move-redirect-suppressed' => 'ёллама баÑтырылгъан',
'movelogpage' => 'Ðд денъишмелери журналы',
'movelogpagetext' => 'Ðшагъыда булунгъан джедвель ады денъиштирильген Ñаифелерни коÑьтере',
'movesubpage' => '{{PLURAL:$1|Ðлт Ñаифе|Ðлт Ñаифелер}}',
@@ -1866,7 +1857,7 @@ MediaWiki интерфейÑининъ чешит тиллерге терджиÐ
'widthheightpage' => '$1 × $2, {{PLURAL:$3|1|$3}} Ñаифе',
'file-info' => 'файл буюклиги: $1, MIME чешити: $2',
'file-info-size' => '$1 × $2 пикÑель, файл буюклиги: $3, MIME чешити: $4',
-'file-nohires' => '<small>Даа юкÑек чезинирликке Ñаип верÑÐ¸Ñ Ñ‘ÐºÑŠ.</small>',
+'file-nohires' => 'Даа юкÑек айырымлылыкъкъа Ñаип верÑÐ¸Ñ Ñ‘ÐºÑŠ.',
'svg-long-desc' => 'SVG файлы, номиналь $1 × $2 пикÑель, файл буюклиги: $3',
'show-big-image' => 'Там айырымлылыкъ',
@@ -1884,9 +1875,9 @@ MediaWiki интерфейÑининъ чешит тиллерге терджиÐ
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'Ñан.',
-'minutes-abbrev' => 'дакъ.',
-'hours-abbrev' => 'Ñаат',
+'seconds-abbrev' => '$1Ñан.',
+'minutes-abbrev' => '$1дакъ.',
+'hours-abbrev' => '$1Ñаат',
# Bad image list
'bad_image_list' => 'Формат бойле олмалы:
@@ -2019,13 +2010,6 @@ $5
'scarytranscludefailed' => '[$1 шаблонына иришилип оламады]',
'scarytranscludetoolong' => '[URL адреÑи чокъ узун]',
-# Trackbacks
-'trackbackbox' => 'Бу Ñаифе ичюн trackback:<br />
-$1',
-'trackbackremove' => '([$1 ёкъ ÑÑ‚])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback мувафакъиетнен ёкъ Ñтильди.',
-
# Delete conflict
'deletedwhileediting' => "'''Тенби''': Бу Ñаифе Ñиз денъишиклик Ñпмагъа башлагъандан Ñонъ ёкъ Ñтильди!",
'confirmrecreate' => "Сиз бу Ñаифени денъиштирген вакъытта [[User:$1|$1]] ([[User talk:$1|музакере]]) къулланыджыÑÑ‹ оны ёкъ Ñткендир, Ñебеби:
@@ -2128,4 +2112,7 @@ $1',
# HTML forms
'htmlform-reset' => 'Денъишикликлерни кери ал',
+# New logging system
+'newuserlog-byemail' => 'пароль e-mail ваÑтаÑынен йиберильген',
+
);
diff --git a/languages/messages/MessagesCrh_latn.php b/languages/messages/MessagesCrh_latn.php
index c77ab801..11f5d3eb 100644
--- a/languages/messages/MessagesCrh_latn.php
+++ b/languages/messages/MessagesCrh_latn.php
@@ -456,16 +456,17 @@ Lütfen, URL yazıp bundan [[Special:ListUsers/sysop|idarecige]] haber beriñiz.
'formerror' => 'Hata: formanıñ malümatını yollamaqnıñ iç çaresi yoq',
'badarticleerror' => 'Siz yapmağa istegen işlev bu saifede yapılıp оlamay.',
'cannotdelete' => '"$1" saife ya da faylı yoq etilip olamadı. Başqa bir qullanıcı tarafından yoq etilgen ola bile.',
+'cannotdelete-title' => '"$1" saifesini yoq etmege olmaz',
'badtitle' => 'Ruhsetsiz serleva',
'badtitletext' => 'İstenilgen saife adı doğru degil, o boştır, yahut tillerara bağlantı ya da vikilerara bağlantı doğru yazılmağan. Belki saife adında yasaqlanğan işaretler bar.',
-'perfcached' => 'Malümatlar daa evelceden azırlanğan ola bilir. Bu sebepten eskirgen ola bilir!',
-'perfcachedts' => 'Aşağıda keşte saqlanğan malümat buluna, soñki yañaruv zamanı: $1.',
+'perfcached' => 'Malümatlar daa evelceden azırlanğan ola bilir. Bu sebepten eskirgen ola bilir! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Aşağıda keşte saqlanğan malümat buluna, soñki yañaruv zamanı: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Bu saifeni deñiştirmege şimdi izin yoq. Bu malümat aman yañartılmaycaq.',
'wrong_wfQuery_params' => 'wrong_wfQuery_params - wfQuery() funktsiyası içün izinsiz parametrler<br />
Funktsiya: $1<br />
Soratma: $2',
'viewsource' => 'menba kodunı köster',
-'viewsourcefor' => '$1 içün',
+'viewsource-title' => '$1 saifesiniñ menba kodu',
'actionthrottled' => 'Areket toqtaldı',
'actionthrottledtext' => 'Spamğa qarşı küreş sebebinden bu areketni az vaqıt içinde çoq kere tekrarlap olamaysıñız. Mümkün olğan qarardan ziyade areket yaptıñız. Bir qaç daqqadan soñ tekrarlap baqıñız.',
'protectedpagetext' => 'Bu saifeni kimse deñiştirmesin dep o blok etildi.',
@@ -651,9 +652,6 @@ Blok etüvni muzakere etmek içün $1 qullanıcısına ya da başqa er angi [[{{
Diqqat etiñiz ki, qayd olunmağan ve e-mail adresiñizni [[Special:Preferences|şahsiy sazlamalarda]] tasdıqlamağan alda, em de blok etilgende sizge mektüp yollamaq yasaq etilgen olsa, idarecige mektüp yollap olamazsıñız.
IP adresiñiz — $3, blok etüv identifikatorı — #$5. Lütfen, idarecilerge mektüpleriñizde onı bildiriñiz.',
'blockednoreason' => 'sebep bildirilmedi',
-'blockedoriginalsource' => 'Aşağıda "$1" saifesiniñ metini buluna.',
-'blockededitsource' => "Aşağıda \"\$1\" saifesindeki '''yapqan deñiştirmeleriñizniñ''' metini buluna.",
-'whitelistedittitle' => 'Deñiştirmek içün oturım açmalısıñız',
'whitelistedittext' => 'Saifeni deñiştirmek içün $1 kereksiñiz.',
'confirmedittext' => 'Saifeni deñiştirmeden evel e-mail adresiñizni tasdıqlamalısıñız. Lütfen, [[Special:Preferences|sazlamalar saifesinde]] e-mail adresiñizni kirsetiñiz ve tasdıqlañız.',
'nosuchsectiontitle' => 'Bölük tapılamadı',
@@ -913,7 +911,7 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
'prefs-rc' => 'Soñki deñişmeler',
'prefs-watchlist' => 'Közetüv cedveli',
'prefs-watchlist-days' => 'Közetüv cedvelinde kösterilecek kün sayısı:',
-'prefs-watchlist-days-max' => 'Eñ çoq 7 kün',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Kenişletilgen közetüv cedvelinde kösterilecek deñişmeler sayısı:',
'prefs-watchlist-edits-max' => 'Eñ çoq 1000',
'prefs-watchlist-token' => 'Közetüv cedveli işareti:',
@@ -1003,7 +1001,7 @@ Eger bildirseñiz, saifelerdeki deñiÅŸmelerni kimniñ yapqanını köstermek iÃ
'userrights-lookup-user' => 'Qullanıcı gruppalarını idare et',
'userrights-user-editname' => 'Öz qullanıcı adıñıznı yazıñız:',
'editusergroup' => 'Qullanıcı gruppaları nizamla',
-'editinguser' => "'''[[User:$1|$1]]''' qullanıcısınıñ ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) izinlerini deñiştirmektesiñiz",
+'editinguser' => "'''[[User:$1|$1]]''' $2 qullanıcısınıñ izinlerini deñiştireyatasız",
'userrights-editusergroup' => 'Qullanıcı gruppaları nizamla',
'saveusergroups' => 'Qullanıcı gruppalarını saqla',
'userrights-groupsmember' => 'Azası оlğan gruppalarıñız:',
@@ -1384,12 +1382,8 @@ Ayrıca [[Special:WantedCategories|talap etilgen kategoriyalarnıñ cedveline]]
'listusers-noresult' => 'İç bir qullanıcı tapılmadı.',
# Special:Log/newusers
-'newuserlogpage' => 'Yañı qullanıcı jurnalı',
-'newuserlogpagetext' => 'Eñ sоñki qayd оlğan qullanıcı jurnalı.',
-'newuserlog-byemail' => 'parol e-mail vastasınen yiberilgen',
-'newuserlog-create-entry' => 'Yañı qullanıcı',
-'newuserlog-create2-entry' => 'yañı esap yarattı $1',
-'newuserlog-autocreate-entry' => 'Esap avtomatik olaraq yaratıldı',
+'newuserlogpage' => 'Yañı qullanıcı jurnalı',
+'newuserlogpagetext' => 'Eñ sоñki qayd оlğan qullanıcı jurnalı.',
# Special:ListGroupRights
'listgrouprights-members' => '(azalar cedveli)',
@@ -1438,7 +1432,7 @@ Ayrıca [[Special:WantedCategories|talap etilgen kategoriyalarnıñ cedveline]]
'watchmethod-list' => 'közetüv cedvelindeki saifeler teşkerile',
'watchlistcontains' => 'Siziñ közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
'iteminvalidname' => '"$1" saifesi munasebetinen problema olıp çıqtı, elverişli olmağan isimdir…',
-'wlnote' => "Aşağıda soñki {{PLURAL:$2|saat|'''$2''' saat}} içinde yapılğan soñki {{PLURAL:$1|deñişiklik|'''$1''' deñişiklik}} kösterile.",
+'wlnote' => "Aşağıda saat $3, $4 içün soñki {{PLURAL:$2|saat|'''$2''' saat}} içinde yapılğan soñki {{PLURAL:$1|deñişme|'''$1''' deñişme}} kösterile.",
'wlshowlast' => 'Soñki $1 saat içün, $2 kün içün ya da $3 köster',
'watchlist-options' => 'Közetüv cedveli sazlamaları',
@@ -1501,7 +1495,6 @@ Lütfen, neticelerini añlağanıñıznı ve [[{{MediaWiki:Policy-url}}|yoq etü
'actionfailed' => 'Areket yapılamadı',
'deletedtext' => '"$1" yoq etildi.
yaqın zamanda yoq etilgenlerni körmek içün: $2.',
-'deletedarticle' => '"[[$1]]" yoq etildi',
'dellogpage' => 'Yoq etüv jurnalı',
'dellogpagetext' => 'Aşağıdaki cedvel soñki yoq etüv jurnalıdır.',
'deletionlog' => 'yoq etüv jurnalı',
@@ -1567,7 +1560,6 @@ Bu saifeniñ qorçalav seviyesini deñiştirip olasıñız, amma kaskadlı qorç
'undeletelink' => 'köster/keri ketir',
'undeletereset' => 'Vazgeç',
'undeletecomment' => 'Sebep:',
-'undeletedarticle' => '"[[$1]]" keri ketirildi.',
'undeletedrevisions' => 'Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.',
'undelete-header' => 'Keçenlerde yоq etilgen saifelerni körmek içün [[Special:Log/delete|yоq etüv jurnalına]] baqıñız.',
@@ -1691,9 +1683,6 @@ Lütfen, başqa bir ad saylap yazıñız.',
'movepage-page-exists' => '$1 saifesi endi bar, ve avtomatik olaraq yañıdan yazılıp olamaz.',
'movepage-page-moved' => '$1 saifesiniñ adı $2 olaraq deñiştirildi.',
'movepage-page-unmoved' => '$1 saifesiniñ adı $2 olaraq deñiştirilip olamay.',
-'1movedto2' => '"[[$1]]" saifesiniñ adı "[[$2]]" olaraq deñiştirildi',
-'1movedto2_redir' => '[[$1]] serlevası [[$2]] saifesine yollandı',
-'move-redirect-suppressed' => 'yollama bastırılğan',
'movelogpage' => 'Ad deñişmeleri jurnalı',
'movelogpagetext' => 'Aşağıda bulunğan cedvel adı deñiştirilgen saifelerni köstere',
'movesubpage' => '{{PLURAL:$1|Alt saife|Alt saifeler}}',
@@ -1861,7 +1850,7 @@ Faylnı işletip işletim sistemañızğa zarar ketirip olursıñız.",
'widthheightpage' => '$1 × $2, {{PLURAL:$3|1|$3}} saife',
'file-info' => 'fayl büyükligi: $1, MIME çeşiti: $2',
'file-info-size' => '$1 × $2 piksel, fayl büyükligi: $3, MIME çeşiti: $4',
-'file-nohires' => '<small>Daa yüksek çezinirlikke saip versiya yoq.</small>',
+'file-nohires' => 'Daa yüksek ayırımlılıqqa saip versiya yoq.',
'svg-long-desc' => 'SVG faylı, nominal $1 × $2 piksel, fayl büyükligi: $3',
'show-big-image' => 'Tam ayırımlılıq',
@@ -1879,9 +1868,9 @@ Faylnı işletip işletim sistemañızğa zarar ketirip olursıñız.",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'san.',
-'minutes-abbrev' => 'daq.',
-'hours-abbrev' => 'saat',
+'seconds-abbrev' => '$1san.',
+'minutes-abbrev' => '$1daq.',
+'hours-abbrev' => '$1saat',
# Bad image list
'bad_image_list' => 'Format böyle olmalı:
@@ -2015,13 +2004,6 @@ Bu tasdıq kodu $4 tarihına qadar qullanılıp olacaq.',
'scarytranscludefailed' => '[$1 şablonına irişilip olamadı]',
'scarytranscludetoolong' => '[URL adresi çoq uzun]',
-# Trackbacks
-'trackbackbox' => 'Bu saife içün trackback:<br />
-$1',
-'trackbackremove' => '([$1 yoq et])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback muvafaqiyetnen yoq etildi.',
-
# Delete conflict
'deletedwhileediting' => "'''Tenbi''': Bu saife siz deñişiklik yapmağa başlağandan soñ yoq etildi!",
'confirmrecreate' => "Siz bu saifeni deñiştirgen vaqıtta [[User:$1|$1]] ([[User talk:$1|muzakere]]) qullanıcısı onı yoq etkendir, sebebi:
@@ -2125,4 +2107,7 @@ Bitirgen soñ "{{int:Watchlistedit-raw-submit}}" yazısına basıñız.
# HTML forms
'htmlform-reset' => 'Deñişikliklerni keri al',
+# New logging system
+'newuserlog-byemail' => 'parol e-mail vastasınen yiberilgen',
+
);
diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php
index 62ecd750..420d0f86 100644
--- a/languages/messages/MessagesCs.php
+++ b/languages/messages/MessagesCs.php
@@ -10,6 +10,7 @@
* @author Danny B.
* @author Dontlietome7
* @author Helix84
+ * @author Jachym
* @author Jkjk
* @author Kaganer
* @author Kuvaly
@@ -49,8 +50,6 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Uživatelka' => NS_USER, # female complement
- 'Diskuse_s_uživatelkou' => NS_USER_TALK, # female complement
'Uživatel_diskuse' => NS_USER_TALK, # old literal translation backward compatibility
'Uživatelka_diskuse' => NS_USER_TALK, # female complement to old literal translation style
'$1_diskuse' => NS_PROJECT_TALK, # old literal translation backward compatibility
@@ -61,6 +60,11 @@ $namespaceAliases = array(
'Kategorie_diskuse' => NS_CATEGORY_TALK, # old literal translation backward compatibility
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'Uživatel', 'female' => 'Uživatelka' ),
+ NS_USER_TALK => array( 'male' => 'Diskuse_s_uživatelem', 'female' => 'Diskuse_s_uživatelkou' ),
+);
+
/**
* Date formats list for Special:Preferences
* see $dateFormats for definitions
@@ -130,121 +134,121 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PŘESMĚRUJ', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEZGALERIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__VŽDYOBSAH__', '__FORCETOC__' ),
- 'toc' => array( '0', '__OBSAH__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEZEDITOVATÄŒÃST__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'AKTUÃLNÃMÄšSÃC', 'AKTUÃLNÃMÄšSÃC2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'AKTUÃLNÃMÄšSÃC1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'AKTUÃLNÃMÄšSÃCJMÉNO', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'AKTUÃLNÃMÄšSÃCGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'AKTUÃLNÃMÄšSÃCZKR', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'AKTUÃLNÃDEN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'AKTUÃLNÃDEN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'AKTUÃLNÃDENJMÉNO', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AKTUÃLNÃROK', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AKTUÃLNÃÄŒAS', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'AKTUÃLNÃHODINA', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MÃSTNÃMÄšSÃC', 'MÃSTNÃMÄšSÃC2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MÃSTNÃMÄšSÃC1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'MÃSTNÃMÄšSÃCJMÉNO', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'MÃSTNÃMÄšSÃCGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'MÃSTNÃMÄšSÃCZKR', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'MÃSTNÃDEN', 'LOCALDAY' ),
- 'localday2' => array( '1', 'MÃSTNÃDEN2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'MÃSTNÃDENJMÉNO', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'MÃSTNÃROK', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'MÃSTNÃÄŒAS', 'LOCALTIME' ),
- 'localhour' => array( '1', 'MÃSTNÃHODINA', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'POÄŒETSTRAN', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'POÄŒETÄŒLÃNKÅ®', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'POÄŒETSOUBORÅ®', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'POČETUŽIVATELŮ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'POÄŒETAKTIVNÃCHUŽIVATELÅ®', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'POÄŒETEDITACÃ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NÃZEVSTRANY', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NÃZEVSTRANYE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'JMENNÃPROSTOR', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'JMENNÃPROSTORE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'DISKUSNÃPROSTOR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'DISKUSNÃPROSTORE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ÄŒLÃNEKPROSTOR', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ÄŒLÃNEKPROSTORE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'PLNÃNÃZEVSTRANY', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'PLNÃNÃZEVSTRANYE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NÃZEVPODSTRANY', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NÃZEVPODSTRANYE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NÃZEVNADSTRANY', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NÃZEVNADSTRANYE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NÃZEVDISKUSE', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NÃZEVDISKUSEE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NÃZEVÄŒLÃNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NÃZEVÄŒLÃNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'subst' => array( '0', 'VLOŽIT:', 'SUBST:' ),
- 'msgnw' => array( '0', 'VLOŽITNW:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'náhled', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'náhled=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'vpravo', 'right' ),
- 'img_left' => array( '1', 'vlevo', 'left' ),
- 'img_none' => array( '1', 'žádné', 'none' ),
- 'img_width' => array( '1', '$1pixelů', '$1px' ),
- 'img_center' => array( '1', 'střed', 'center', 'centre' ),
- 'img_framed' => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bezrámu', 'frameless' ),
- 'img_page' => array( '1', 'strana=$1', 'strana $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'okraj', 'border' ),
- 'sitename' => array( '1', 'NÃZEVWEBU', 'SITENAME' ),
- 'ns' => array( '0', 'JMENNÃPROSTOR:', 'NS:' ),
- 'localurl' => array( '0', 'MÃSTNÃURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'MÃSTNÃURLE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'NÃZEVSERVERU', 'SERVERNAME' ),
- 'grammar' => array( '0', 'SKLOŇUJ:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__BEZKONVERZENADPISU__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__BEZKONVERZEOBSAHU__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'AKTUÃLNÃTÃDEN', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'AKTUÃLNÃDENTÃDNE', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'MÃSTNÃTÃDEN', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'MÃSTNÃDENTÃDNE', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDREVIZE', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DENREVIZE', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DENREVIZE2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MÄšSÃCREVIZE', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ROKREVIZE', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'KÓDČASUREVIZE', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'PLURÃL:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'PLNÉURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'PLNÉURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'PRVNÃMALÉ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'PRVNÃVELKÉ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MALÃ:', 'LC:' ),
- 'uc' => array( '0', 'VELKÃ:', 'UC:' ),
- 'displaytitle' => array( '1', 'ZOBRAZOVANÃNADPIS', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LINKPŘIDATKOMENTÃŘ__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERZESOFTWARE', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ENKÓDOVATURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ENKÓDOVATNADPIS', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'AKTUÃLNÃKÓDÄŒASU', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'MÃSTNÃKÓDÄŒASU', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#JAZYK:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'STRÃNEKVEJMENNÉMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'POÄŒETSPRÃVCÅ®', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMÃTUJÄŒÃSLO', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ZAROVNATVLEVO', 'PADLEFT' ),
- 'padright' => array( '0', 'ZAROVNATVPRAVO', 'PADRIGHT' ),
- 'special' => array( '0', 'speciální', 'special' ),
- 'defaultsort' => array( '1', 'KLÃČŘAZENÃ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CESTAKSOUBORU', 'FILEPATH:' ),
- 'tag' => array( '0', 'znaÄka', 'tag' ),
- 'hiddencat' => array( '1', '__SKRÃTKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'STRÃNEKVKATEGORII', 'STRÃNEKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'VELIKOSTSTRÃNKY', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEXOVAT__', '__INDEX__' ),
- 'noindex' => array( '1', '__NEINDEXOVAT__', '__NOINDEX__' ),
- 'staticredirect' => array( '1', '__STATICKÉPŘESMÄšROVÃNÃ__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'ÚROVEŇZAMÄŒENÃ', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#PŘESMĚRUJ', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALERIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__VŽDYOBSAH__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__OBSAH__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEZEDITOVATÄŒÃST__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'AKTUÃLNÃMÄšSÃC', 'AKTUÃLNÃMÄšSÃC2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'AKTUÃLNÃMÄšSÃC1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'AKTUÃLNÃMÄšSÃCJMÉNO', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'AKTUÃLNÃMÄšSÃCGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'AKTUÃLNÃMÄšSÃCZKR', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'AKTUÃLNÃDEN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'AKTUÃLNÃDEN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'AKTUÃLNÃDENJMÉNO', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AKTUÃLNÃROK', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AKTUÃLNÃÄŒAS', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'AKTUÃLNÃHODINA', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MÃSTNÃMÄšSÃC', 'MÃSTNÃMÄšSÃC2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MÃSTNÃMÄšSÃC1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'MÃSTNÃMÄšSÃCJMÉNO', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'MÃSTNÃMÄšSÃCGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'MÃSTNÃMÄšSÃCZKR', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'MÃSTNÃDEN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'MÃSTNÃDEN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'MÃSTNÃDENJMÉNO', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'MÃSTNÃROK', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'MÃSTNÃÄŒAS', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'MÃSTNÃHODINA', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'POÄŒETSTRAN', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'POÄŒETÄŒLÃNKÅ®', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'POÄŒETSOUBORÅ®', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'POČETUŽIVATELŮ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'POÄŒETAKTIVNÃCHUŽIVATELÅ®', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'POÄŒETEDITACÃ', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NÃZEVSTRANY', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NÃZEVSTRANYE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'JMENNÃPROSTOR', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'JMENNÃPROSTORE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUSNÃPROSTOR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUSNÃPROSTORE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ÄŒLÃNEKPROSTOR', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ÄŒLÃNEKPROSTORE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'PLNÃNÃZEVSTRANY', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'PLNÃNÃZEVSTRANYE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NÃZEVPODSTRANY', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NÃZEVPODSTRANYE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NÃZEVNADSTRANY', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NÃZEVNADSTRANYE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NÃZEVDISKUSE', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NÃZEVDISKUSEE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NÃZEVÄŒLÃNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NÃZEVÄŒLÃNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'subst' => array( '0', 'VLOŽIT:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'VLOŽITNW:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'náhled', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'náhled=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'vpravo', 'right' ),
+ 'img_left' => array( '1', 'vlevo', 'left' ),
+ 'img_none' => array( '1', 'žádné', 'none' ),
+ 'img_width' => array( '1', '$1pixelů', '$1px' ),
+ 'img_center' => array( '1', 'střed', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bezrámu', 'frameless' ),
+ 'img_page' => array( '1', 'strana=$1', 'strana $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'okraj', 'border' ),
+ 'sitename' => array( '1', 'NÃZEVWEBU', 'SITENAME' ),
+ 'ns' => array( '0', 'JMENNÃPROSTOR:', 'NS:' ),
+ 'localurl' => array( '0', 'MÃSTNÃURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'MÃSTNÃURLE:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'NÃZEVSERVERU', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'SKLOŇUJ:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__BEZKONVERZENADPISU__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__BEZKONVERZEOBSAHU__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'AKTUÃLNÃTÃDEN', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'AKTUÃLNÃDENTÃDNE', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'MÃSTNÃTÃDEN', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'MÃSTNÃDENTÃDNE', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDREVIZE', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DENREVIZE', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DENREVIZE2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MÄšSÃCREVIZE', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ROKREVIZE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'KÓDČASUREVIZE', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'PLURÃL:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PLNÉURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'PLNÉURLE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'PRVNÃMALÉ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'PRVNÃVELKÉ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MALÃ:', 'LC:' ),
+ 'uc' => array( '0', 'VELKÃ:', 'UC:' ),
+ 'displaytitle' => array( '1', 'ZOBRAZOVANÃNADPIS', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LINKPŘIDATKOMENTÃŘ__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERZESOFTWARE', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ENKÓDOVATURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ENKÓDOVATNADPIS', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'AKTUÃLNÃKÓDÄŒASU', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'MÃSTNÃKÓDÄŒASU', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#JAZYK:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'STRÃNEKVEJMENNÉMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'POÄŒETSPRÃVCÅ®', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMÃTUJÄŒÃSLO', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ZAROVNATVLEVO', 'PADLEFT' ),
+ 'padright' => array( '0', 'ZAROVNATVPRAVO', 'PADRIGHT' ),
+ 'special' => array( '0', 'speciální', 'special' ),
+ 'defaultsort' => array( '1', 'KLÃČŘAZENÃ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CESTAKSOUBORU', 'FILEPATH:' ),
+ 'tag' => array( '0', 'znaÄka', 'tag' ),
+ 'hiddencat' => array( '1', '__SKRÃTKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'STRÃNEKVKATEGORII', 'STRÃNEKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'VELIKOSTSTRÃNKY', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEXOVAT__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NEINDEXOVAT__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '__STATICKÉPŘESMÄšROVÃNÃ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ÚROVEŇZAMÄŒENÃ', 'PROTECTIONLEVEL' ),
);
/**
@@ -705,20 +709,22 @@ Pokud toto není váš případ, možná jste nalezli chybu v software. Prosíme
'badarticleerror' => 'Tento úkon nelze použít na tuto stránku.',
'cannotdelete' => 'Nebylo možné smazat stránku nebo soubor „$1“.
Možná už byl(a) smazán(a) někým jiným.',
+'cannotdelete-title' => 'Stránku „$1“ nelze smazat',
'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í:',
-'perfcachedts' => 'Následující data jsou z cache, která byla naposledy aktualizována $1.',
+'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ů}}.',
+'perfcachedts' => 'Následující data jsou z cache, která byla naposledy aktualizována $1. Cache může obsahovat maximálně {{PLURAL:$4|jeden výsledek|$4 výsledky|$4 výsledků}}.',
'querypage-no-updates' => 'Aktualizace této stránky je vypnuta. Data nyní nebudou obnovována.',
'wrong_wfQuery_params' => 'Nesprávné parametry do wfQuery()<br />
Funkce: $1<br />
Dotaz: $2',
'viewsource' => 'Zobrazit zdroj',
-'viewsourcefor' => 'stránky $1',
+'viewsource-title' => 'Zobrazení zdroje stránky $1',
'actionthrottled' => 'Akce byla pozastavena',
'actionthrottledtext' => 'Vzhledem k protispamovým opatÅ™ením nemůžete požadovanou akci provádÄ›t příliÅ¡ Äastokrát v krátké dobÄ›. Zkuste to znovu za nÄ›kolik minut.',
'protectedpagetext' => 'Tato stránka byla zamÄena, takže ji nelze editovat.',
'viewsourcetext' => 'Můžete si prohlédnout a zkopírovat zdrojový kód této stránky:',
+'viewyourtext' => "Můžete si prohlédnout a zkopírovat zdrojový kód '''vašich změn''' této stránky:",
'protectedinterface' => 'Tato stránka obsahuje text softwarového rozhraní a smějí ji editovat jen správci.',
'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. PÅ™i úpravách Äeského pÅ™ekladu zvažte použití [//translatewiki.net/wiki/Main_Page?setlang=cs translatewiki.net], projektu pro lokalizaci MediaWiki.",
'sqlhidden' => '(SQL dotaz skryt)',
@@ -813,6 +819,7 @@ Heslo může být zasláno jen jednou za $1 {{PLURAL:$1|hodinu|hodiny|hodin}}.',
'noemailprefs' => 'Pro zprovoznění následujících možností musíte zadat svou e-mailovou adresu.',
'emailconfirmlink' => 'PodvrÄte svou e-mailovou adresu',
'invalidemailaddress' => 'Zadaná e-mailová adresa nemůže být přijata, neboť nemá správný formát. Zadejte platnou e-mailovou adresu nebo obsah tohoto pole vymažte.',
+'cannotchangeemail' => 'U uživatelských úÄtů na této wiki nelze mÄ›nit e-mailové adresy.',
'accountcreated' => 'ÚÄet vytvoÅ™en',
'accountcreatedtext' => 'Uživatelský úÄet $1 byl vytvoÅ™en.',
'createaccount-title' => 'VytvoÅ™ení úÄtu na {{grammar:6sg|{{SITENAME}}}}',
@@ -831,6 +838,7 @@ PoÄkejte chvíli, než to zkusíte znovu.',
# E-mail sending
'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
+'user-mail-no-addy' => 'Pokus o odeslání e-mailu bez e-mailové adresy',
# Change password dialog
'resetpass' => 'Změna hesla',
@@ -851,16 +859,18 @@ Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové d
'resetpass-temp-password' => 'DoÄasné heslo:',
# Special:PasswordReset
-'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Pro obdržení e-mailu s pÅ™ipomenutím detailů vaÅ¡eho úÄtu vyplňte tento formulář.',
-'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-username' => 'Uživatelské jméno:',
-'passwordreset-domain' => 'Doména:',
-'passwordreset-email' => 'E-mailová adresa:',
-'passwordreset-emailtitle' => 'Informace k úÄtu na {{grammar:6sg|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Někdo (patrně vy, z IP adresy $1) zažádal o připomenutí informací k vašemu
+'passwordreset' => 'Reset hesla',
+'passwordreset-text' => 'Pro obdržení e-mailu s pÅ™ipomenutím detailů vaÅ¡eho úÄtu vyplňte tento formulář.',
+'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-username' => 'Uživatelské jméno:',
+'passwordreset-domain' => 'Doména:',
+'passwordreset-capture' => 'Prohlédnout si výsledný e-mail?',
+'passwordreset-capture-help' => 'Pokud zaÅ¡krtnete toto políÄko, bude e-mail (s doÄasným heslem) kromÄ› zaslání uživateli zobrazen i vám.',
+'passwordreset-email' => 'E-mailová adresa:',
+'passwordreset-emailtitle' => 'Informace k úÄtu na {{grammar:6sg|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Někdo (patrně vy, z IP adresy $1) zažádal o připomenutí informací k vašemu
úÄtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je pÅ™iÅ™azen následující úÄet|jsou pÅ™iÅ™azeny následující úÄty}}:
$2
@@ -869,7 +879,7 @@ $2
Nyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek
poslal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho
tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.',
-'passwordreset-emailtext-user' => '{{gender:$1|Uživatel|Uživatelka|Uživatel}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala|zažádal}} o připomenutí informací k vašemu
+'passwordreset-emailtext-user' => '{{gender:$1|Uživatel|Uživatelka|Uživatel}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala|zažádal}} o připomenutí informací k vašemu
úÄtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je pÅ™iÅ™azen následující úÄet|jsou pÅ™iÅ™azeny následující úÄty}}:
$2
@@ -878,9 +888,22 @@ $2
Nyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek
poslal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho
tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.',
-'passwordreset-emailelement' => 'Uživatelské jméno: $1
+'passwordreset-emailelement' => 'Uživatelské jméno: $1
DoÄasné heslo: $2',
-'passwordreset-emailsent' => 'E-mail s heslem byl odeslán.',
+'passwordreset-emailsent' => 'E-mail s heslem byl odeslán.',
+'passwordreset-emailsent-capture' => 'Byl vygenerován připomínací e-mail, 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Změna e-mailové adresy',
+'changeemail-header' => 'ZmÄ›na e-mailové adresy k úÄtu',
+'changeemail-text' => 'Vyplněním tohoto formuláře si změníte e-mailovou adresu. Pro potvrzení změny budete muset zadat své heslo.',
+'changeemail-no-info' => 'K této stránce mají přímý přístup jen přihlášení uživatelé.',
+'changeemail-oldemail' => 'Stávající e-mailová adresa:',
+'changeemail-newemail' => 'Nová e-mailová adresa:',
+'changeemail-none' => '(žádná)',
+'changeemail-submit' => 'Změnit e-mail',
+'changeemail-cancel' => 'Storno',
# Edit page toolbar
'bold_sample' => 'TuÄný text',
@@ -949,9 +972,6 @@ Uvědomte si však, že funkci „Poslat e-mail tomuto uživateli“ nemůžete
VaÅ¡e souÄasná IP adresa je $3, Äíslo vaÅ¡eho zablokování je #$5.
Prosíme, uveÄte tyto údaje pÅ™i komunikaci se správci.",
'blockednoreason' => 'důvod nebyl zadán',
-'blockedoriginalsource' => "Zdrojový text stránky '''$1''' následuje:",
-'blockededitsource' => "Text '''vašich editací''' stránky '''$1''' následuje:",
-'whitelistedittitle' => 'Pro editaci je vyžadováno přihlášení',
'whitelistedittext' => 'Pro editaci se musíte $1.',
'confirmedittext' => 'Pro editaci stránek je vyžadováno potvrzení vaší e-mailové adresy. Na stránce [[Special:Preferences|nastavení]] zadejte a nechte potvrdit svou e-mailovou adresu.',
'nosuchsectiontitle' => 'Sekce nenalezena',
@@ -1029,7 +1049,8 @@ Uložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírová
'''NEVKLÃDEJTE DÃLA CHRÃNÄšNÃ AUTORSKÃM PRÃVEM BEZ DOVOLENÃ!'''",
'copyrightwarning2' => "UvÄ›domte si, že vÅ¡echny příspÄ›vky do {{grammar:2sg|{{SITENAME}}}} mohou být ostatními uživateli upraveny, pozmÄ›nÄ›ny Äi odstranÄ›ny. Pokud si nepÅ™ejete, aby váš text byl nemilosrdnÄ› upravován, pak ho do {{grammar:2sg|{{SITENAME}}}} neukládejte.<br />
Uložením příspěvku se zavazujete, že je vaším dílem nebo je zkopírován ze zdrojů, které nejsou chráněny autorským právem (tzv. <em>public domain</em>), podrobnosti najdete na $1. '''Nekopírujte díla chráněná autorským právem bez dovolení!'''",
-'longpageerror' => "'''CHYBA: Pokoušíte se uložit text o velikosti $1 KiB, pÅ™iÄemž dovolené maximum je $2 KiB. VaÅ¡e editace nemůže být uložena.'''",
+'longpageerror' => "'''Chyba: Pokoušíte se uložit text o velikosti {{PLURAL:$1|$1 KiB}}, pÅ™iÄemž dovolené maximum je {{PLURAL:$2|$2 KiB}}.'''
+Vaše změna nemůže být uložena.",
'readonlywarning' => "'''VAROVÃNÃ: Databáze byla uzamÄena kvůli údržbÄ›, takže nebudete moci uložit své zmÄ›ny. Můžete si okopírovat text do souboru a uložit ho na pozdÄ›ji.'''
Správce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
@@ -1194,8 +1215,6 @@ pokud nebyla nastavena další omezení.",
'revdelete-unsuppress' => 'Odstranit omezení na vrácené verze',
'revdelete-log' => 'Důvod:',
'revdelete-submit' => 'Aplikovat na {{PLURAL:$1|zvolenou revizi|zvolené revize}}',
-'revdelete-logentry' => 'změnil viditelnost revizí u [[$1]]',
-'logdelete-logentry' => 'mění viditelnost události [[$1]]',
'revdelete-success' => "'''Viditelnost revize úspěšně nastavena.'''",
'revdelete-failure' => "'''Nepodařilo se nastavit viditelnost revize:'''
$1",
@@ -1207,15 +1226,6 @@ $1",
'revdel-restore-visible' => 'viditelné revize',
'pagehist' => 'Historie stránky',
'deletedhist' => 'Smazaná historie',
-'revdelete-content' => 'obsah',
-'revdelete-summary' => 'shrnutí editace',
-'revdelete-uname' => 'uživatelské jméno',
-'revdelete-restricted' => 'omezení správců použito',
-'revdelete-unrestricted' => 'omezení správců odstraněno',
-'revdelete-hid' => 'skryl $1',
-'revdelete-unhid' => 'odkryl $1',
-'revdelete-log-message' => '$1 $2 reviz{{PLURAL:$2|i|e|í}}',
-'logdelete-log-message' => '$1 $2 událost{{PLURAL:$2||i|í}}',
'revdelete-hide-current' => 'Chyba pÅ™i skrývání položky z $1 $2: jedná se o souÄasnou revizi.
Tu nelze skrýt.',
'revdelete-show-no-access' => 'Chyba při zobrazování položky z $1 $2: je vyžadováno zvláštní oprávnění.
@@ -1372,12 +1382,14 @@ Pokud na zaÄátek dotazu pÅ™idáte ''all:'', bude se hledat vÅ¡ude (vÄetnÄ› di
'prefs-rc' => 'Poslední změny',
'prefs-watchlist' => 'Sledované stránky',
'prefs-watchlist-days' => 'PoÄet dní zobrazených ve sledovaných stránkách:',
-'prefs-watchlist-days-max' => 'Maximálně 7 dní',
+'prefs-watchlist-days-max' => 'Maximálně $1 {{PLURAL:$1|den|dny|dní}}',
'prefs-watchlist-edits' => 'PoÄet editací zobrazených ve zdokonalených sledovaných stránkách:',
'prefs-watchlist-edits-max' => 'Maximum: 1000',
'prefs-watchlist-token' => 'KlÃ­Ä k seznamu sledovaných stránek:',
'prefs-misc' => 'Různé',
'prefs-resetpass' => 'Změnit heslo',
+'prefs-changeemail' => 'Změnit e-mail',
+'prefs-setemail' => 'Nastavit e-mailovou adresu',
'prefs-email' => 'Nastavení e-mailu',
'prefs-rendering' => 'Vzhled',
'saveprefs' => 'Uložit nastavení',
@@ -1437,6 +1449,7 @@ Tuto operaci nelze vrátit zpět.',
'yourrealname' => 'VaÅ¡e skuteÄné jméno:',
'yourlanguage' => 'Jazyk rozhraní:',
'yourvariant' => 'Varianta jazyka obsahu:',
+'prefs-help-variant' => 'Vámi preferovaná varianta nebo pravopis, jak se mají na této wiki zobrazovat obsahové stránky.',
'yournick' => 'Podpis:',
'prefs-help-signature' => 'Komentáře v diskusích by se mÄ›ly podepisovat pomocí „<nowiki>~~~~</nowiki>“, což se zmÄ›ní na váš podpis a aktuální Äas.',
'badsig' => 'Chybný podpis, zkontrolujte syntaxi HTML.',
@@ -1475,7 +1488,7 @@ Tuto operaci nelze vrátit zpět.',
'userrights-lookup-user' => 'Spravovat uživatelské skupiny',
'userrights-user-editname' => 'Zadejte uživatelské jméno:',
'editusergroup' => 'Upravit uživatelské skupiny',
-'editinguser' => "Úprava práv uživatele '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Úprava práv uživatele '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Upravit uživatelské skupiny',
'saveusergroups' => 'Uložit uživatelské skupiny',
'userrights-groupsmember' => 'ÄŒlen skupin:',
@@ -1569,13 +1582,13 @@ Tuto operaci nelze vrátit zpět.',
'right-autopatrol' => 'Automatické oznaÄování editací jako prověřených',
'right-patrolmarks' => 'Zobrazování patrolovacích znaÄek v Posledních zmÄ›nách',
'right-unwatchedpages' => 'Zobrazování seznamu nesledovaných stránek',
-'right-trackback' => 'Zasílání trackbacku',
'right-mergehistory' => 'SluÄování historií stránek',
'right-userrights' => 'Nastavování práv ostatním uživatelům',
'right-userrights-interwiki' => 'Nastavování práv ostatním uživatelům na jiných wiki',
'right-siteadmin' => 'Zamykání a odemykání databáze',
'right-override-export-depth' => 'Exportovat stránky vÄetnÄ› odkazovaných stránek až do hloubky 5',
'right-sendemail' => 'Odesílání e-mailů ostatním uživatelům',
+'right-passwordreset' => 'Prohlížení e-mailů pro znovunastavení hesla',
# User rights log
'rightslog' => 'Kniha práv uživatelů',
@@ -1609,16 +1622,17 @@ Tuto operaci nelze vrátit zpět.',
'action-suppressionlog' => 'prohlížet si tento skrytý protokolovací záznam',
'action-block' => 'znemožnit tomuto uživateli editování',
'action-protect' => 'změnit úrovně ochrany této stránky',
+'action-rollback' => 'rychle revertovat úpravy posledního uživatele editujícího danou stránku',
'action-import' => 'importovat tuto stránku z jiné wiki',
'action-importupload' => 'importovat tuto stránku z nahraného souboru',
'action-patrol' => 'oznaÄit úpravy ostatních jako zhlédnuté',
'action-autopatrol' => 'oznaÄit vlastní úpravy jako zhlédnuté',
'action-unwatchedpages' => 'zobrazit seznam nesledovaných stránek',
-'action-trackback' => 'poslat trackback',
'action-mergehistory' => 'slouÄit historii této stránky',
'action-userrights' => 'upravovat práva všech uživatelů',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|změna|změny|změn}}',
@@ -1651,6 +1665,7 @@ $3',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|sledující uživatel|sledující uživatelé|sledujících uživatelů}}]',
'rc_categories' => 'Omezit na kategorie (oddělené „|“)',
'rc_categories_any' => 'VÅ¡echny',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajty|bajtů}} po změně',
'newsectionsummary' => 'Nová sekce /* $1 */',
'rc-enhanced-expand' => 'Zobrazit detaily (vyžaduje JavaScript)',
'rc-enhanced-hide' => 'Skrýt detaily',
@@ -1701,6 +1716,7 @@ Pro vložení obrázku do stránky použijte jeden z následujících způsobů
'ignorewarnings' => 'Ignorovat všechna varování',
'minlength1' => 'Jméno souboru musí mít alespoň jeden znak.',
'illegalfilename' => 'Název souboru "$1" obsahuje znaky, které nejsou povoleny v názvech stránek. Prosím přejmenujte soubor a zkuste jej nahrát znovu.',
+'filename-toolong' => 'Jména souborů nemohou být delší než 240 bajtů.',
'badfilename' => 'Jméno souboru bylo změněno na „$1“.',
'filetype-mime-mismatch' => 'Přípona souboru „.$1“ neodpovídá rozpoznanému MIME typu souboru ($2).',
'filetype-badmime' => 'Není povoleno naÄítat soubory MIME typu „$1“.',
@@ -1803,6 +1819,41 @@ Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
'upload-unknown-size' => 'Neznámá velikost',
'upload-http-error' => 'Došlo k chybě HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Soubor $1 nelze streamovat.',
+'backend-fail-backup' => 'Soubor $1 nelze zazálohovat.',
+'backend-fail-notexists' => 'Soubor $1 neexistuje.',
+'backend-fail-hashes' => 'Nelze získat hashe souborů pro porovnání.',
+'backend-fail-notsame' => 'Odlišný soubor $1 už existuje.',
+'backend-fail-invalidpath' => '$1 je neplatná cesta k místu uložení.',
+'backend-fail-delete' => 'Soubor $1 nelze smazat.',
+'backend-fail-alreadyexists' => 'Soubor $1 už existuje.',
+'backend-fail-store' => 'Soubor $1 nelze uložit v $2.',
+'backend-fail-copy' => 'Soubor $1 nelze kopírovat do $2.',
+'backend-fail-move' => 'Soubor $1 nelze přesunout do $2.',
+'backend-fail-opentemp' => 'DoÄasný soubor nelze otevřít.',
+'backend-fail-writetemp' => 'Do doÄasného souboru nelze zapisovat.',
+'backend-fail-closetemp' => 'DoÄasný soubor nelze zavřít.',
+'backend-fail-read' => 'Soubor $1 nelze Äíst.',
+'backend-fail-create' => 'Soubor $1 nelze vytvořit.',
+'backend-fail-readonly' => 'Koncový úložný systém „$1“ je momentálnÄ› pouze pro Ätení. Udaným důvodem je: „$2“',
+'backend-fail-synced' => 'Soubor „$1“ je v interních koncových úložných systémech v nekonzistentním stavu',
+'backend-fail-connect' => 'Nepodařilo se připojit ke koncovému úložnému systému „$1“.',
+'backend-fail-internal' => 'V koncovém úložném systému „$1“ došlo k neznámé chybě.',
+'backend-fail-contenttype' => 'Nelze urÄit typ obsahu souboru k uložení do „$1“.',
+'backend-fail-batchsize' => 'Koncový úložný systém přijal dávku s $1 {{PLURAL:souborovou operací|souborovými operacemi}}; maximum je {{PLURAL:$2|$2}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Soubor „$1“ nelze odemknout, neboÅ¥ není zamÄen.',
+'lockmanager-fail-closelock' => 'Soubor se zámkem pro „$1“ nelze zavřít.',
+'lockmanager-fail-deletelock' => 'Soubor se zámkem pro „$1“ nelze smazat.',
+'lockmanager-fail-acquirelock' => 'Zámek pro „$1“ nelze získat.',
+'lockmanager-fail-openlock' => 'Soubor se zámkem pro „$1“ nelze otevřít.',
+'lockmanager-fail-releaselock' => 'Zámek pro „$1“ nelze uvolnit.',
+'lockmanager-fail-db-bucket' => 'Nelze navázat spojení s dostateÄným poÄtem databází zámků v bloku $1.',
+'lockmanager-fail-db-release' => 'UzamÄení databáze $1 nelze uvolnit.',
+'lockmanager-fail-svr-release' => 'UzamÄení serveru $1 nelze uvolnit.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Při otevírání souboru ke kontrole ZIP došlo k chybě.',
'zip-wrong-format' => 'Dodaný soubor není ve formátu ZIP.',
@@ -1819,6 +1870,7 @@ Nelze náležitÄ› zkontrolovat jeho bezpeÄnost.',
'uploadstash-badtoken' => 'Operace se nezdařila, možná vypršela platnost vašeho oprávnění k editaci. Zkuste to znovu.',
'uploadstash-errclear' => 'Soubory se nepodařilo vymazat.',
'uploadstash-refresh' => 'Aktualizovat seznam souborů',
+'invalid-chunk-offset' => 'Neplatný posun bloku',
# img_auth script messages
'img-auth-accessdenied' => 'Přístup odepřen',
@@ -1924,23 +1976,24 @@ Níže jsou zobrazeny informace, které obsahuje jeho [$2 tamější stránka s
'filerevert-badversion' => 'Není dostupná pÅ™edchozí verze tohoto souboru s odpovídající Äasovou znaÄkou.',
# File deletion
-'filedelete' => 'Smazání souboru $1',
-'filedelete-legend' => 'Smazat soubor',
-'filedelete-intro' => "Chystáte se smazat soubor '''[[Media:$1|$1]]''' i s celou historií.",
-'filedelete-intro-old' => "Chystáte se smazat verzi souboru '''[[Media:$1|$1]]''' z [$4 $3 $2].",
-'filedelete-comment' => 'Důvod:',
-'filedelete-submit' => 'Smazat',
-'filedelete-success' => "Soubor '''$1''' byl smazán.",
-'filedelete-success-old' => "Verze souboru '''[[Media:$1|$1]]''' z $3 $2 byla smazána.",
-'filedelete-nofile' => "Soubor '''$1''' neexistuje.",
-'filedelete-nofile-old' => "Neexistuje archivní verze souboru '''$1''' s udávanými atributy.",
-'filedelete-otherreason' => 'Jiný/další důvod:',
-'filedelete-reason-otherlist' => 'Jiný důvod',
-'filedelete-reason-dropdown' => '*Obvyklé důvody smazání
+'filedelete' => 'Smazání souboru $1',
+'filedelete-legend' => 'Smazat soubor',
+'filedelete-intro' => "Chystáte se smazat soubor '''[[Media:$1|$1]]''' i s celou historií.",
+'filedelete-intro-old' => "Chystáte se smazat verzi souboru '''[[Media:$1|$1]]''' z [$4 $3 $2].",
+'filedelete-comment' => 'Důvod:',
+'filedelete-submit' => 'Smazat',
+'filedelete-success' => "Soubor '''$1''' byl smazán.",
+'filedelete-success-old' => "Verze souboru '''[[Media:$1|$1]]''' z $3 $2 byla smazána.",
+'filedelete-nofile' => "Soubor '''$1''' neexistuje.",
+'filedelete-nofile-old' => "Neexistuje archivní verze souboru '''$1''' s udávanými atributy.",
+'filedelete-otherreason' => 'Jiný/další důvod:',
+'filedelete-reason-otherlist' => 'Jiný důvod',
+'filedelete-reason-dropdown' => '*Obvyklé důvody smazání
** Porušení autorských práv
** NadbyteÄná kopie',
-'filedelete-edit-reasonlist' => 'Editovat důvody smazání',
-'filedelete-maintenance' => 'Mazání a obnovování souborů je kvůli údržbÄ› doÄasnÄ› vypnuto.',
+'filedelete-edit-reasonlist' => 'Editovat důvody smazání',
+'filedelete-maintenance' => 'Mazání a obnovování souborů je kvůli údržbÄ› doÄasnÄ› vypnuto.',
+'filedelete-maintenance-title' => 'Soubor nelze smazat',
# MIME search
'mimesearch' => 'Hledání podle MIME typu',
@@ -2036,6 +2089,8 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
'wantedpages' => 'Chybějící stránky',
'wantedpages-badtitle' => 'Výsledky obsahují neplatný název: $1',
'wantedfiles' => 'Chybějící soubory',
+'wantedfiletext-cat' => 'Následující soubory se používají, ale neexistují. Soubory ze vzdálených úložišť zde mohou být uvedeny, přestože existují. Taková falešná pozitiva budou zobrazena <del>přeškrtnutě</del>. Stránky, které vkládají neexistující soubory, jsou navíc uvedeny v [[:$1]].',
+'wantedfiletext-nocat' => 'Následující soubory se používají, ale neexistují. Soubory ze vzdálených úložišť zde mohou být uvedeny, přestože existují. Taková falešná pozitiva budou zobrazena <del>přeškrtnutě</del>.',
'wantedtemplates' => 'Chybějící šablony',
'mostlinked' => 'Nejodkazovanější stránky',
'mostlinkedcategories' => 'Nejpoužívanější kategorie',
@@ -2044,6 +2099,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
'mostimages' => 'Nejpoužívanější soubory',
'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)',
'shortpages' => 'Nejkratší stránky',
'longpages' => 'Nejdelší stránky',
'deadendpages' => 'Slepé stránky',
@@ -2153,12 +2209,8 @@ Podporované protokoly: <tt>$1</tt> (nepřidávejte je do hledání).',
'activeusers-noresult' => 'Nenalezen žádný uživatel.',
# Special:Log/newusers
-'newuserlogpage' => 'Kniha nových uživatelů',
-'newuserlogpagetext' => 'Toto je záznam nově zaregistrovaných uživatelů.',
-'newuserlog-byemail' => 'heslo zasláno e-mailem',
-'newuserlog-create-entry' => 'Nově založený uživatel',
-'newuserlog-create2-entry' => 'založil úÄet $1',
-'newuserlog-autocreate-entry' => 'ÚÄet vytvoÅ™en automaticky',
+'newuserlogpage' => 'Kniha nových uživatelů',
+'newuserlogpagetext' => 'Toto je záznam nově zaregistrovaných uživatelů.',
# Special:ListGroupRights
'listgrouprights' => 'Práva skupin uživatelů',
@@ -2188,7 +2240,7 @@ Podporované protokoly: <tt>$1</tt> (nepřidávejte je do hledání).',
'emailpagetext' => 'Pomocí níže zobrazeného formuláře můžete tomuto uživateli poslat zprávu e-mailem.
E-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se objeví jako adresa odesílatele pošty, aby vám adresát mohl odpovědět přímo.',
'usermailererror' => 'Chyba poštovního programu:',
-'defemailsubject' => 'E-mail z {{grammar:2sg|{{SITENAME}}}}',
+'defemailsubject' => 'E-mail z {{grammar:2sg|{{SITENAME}}}} od {{gender:$1|uživatele|uživatelky|uživatele}} „$1“',
'usermaildisabled' => 'Posílání e-mailů je vypnuto',
'usermaildisabledtext' => 'Nemáte oprávnění odesílat e-maily ostatním uživatelům této wiki',
'noemailtitle' => 'Bez e-mailové adresy',
@@ -2241,7 +2293,7 @@ E-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se
'watchmethod-list' => 'hledají se nejnovější editace sledovaných stránek',
'watchlistcontains' => 'Na svém seznamu sledovaných stránek máte $1 {{PLURAL:$1|položku|položky|položek}}.',
'iteminvalidname' => 'Problém s položkou „$1“, neplatný název…',
-'wlnote' => 'Níže je {{PLURAL:$1|poslední změna|poslední $1 změny|posledních $1 změn}} za {{PLURAL:$2|poslední|poslední|posledních}} <b>$2</b> {{PLURAL:$2|hodinu|hodiny|hodin}}.',
+'wlnote' => "Níže {{PLURAL:$1|je poslední změna|jsou poslední '''$1''' změny|je posledních '''$1''' změn}} za {{PLURAL:$2|poslední hodinu|poslední '''$2''' hodiny|posledních '''$2''' hodin}} do $4, $3.",
'wlshowlast' => 'Ukázat posledních $1 hodin $2 dnů $3',
'watchlist-options' => 'Možnosti sledovaných stránek',
@@ -2304,8 +2356,6 @@ Rady a kontakt:
'actioncomplete' => 'Provedeno',
'actionfailed' => 'Operace se nezdařila',
'deletedtext' => 'Stránka nebo soubor „$1“ byla smazána. $2 zaznamenává poslední smazání.',
-'deletedarticle' => 'maže „$1“',
-'suppressedarticle' => 'utajil „[[$1]]“',
'dellogpage' => 'Kniha smazaných stránek',
'dellogpagetext' => 'Zde je seznam posledních smazaných stránek.',
'deletionlog' => 'Kniha smazaných stránek',
@@ -2350,7 +2400,10 @@ Můžete si prohlédnout též [[Special:ProtectedPages|seznam aktuálnÄ› platnÃ
'unprotectedarticle' => 'odemyká „[[$1]]“',
'movedarticleprotection' => 'nastavení zámků přesunuto z „[[$2]]“ na „[[$1]]“',
'protect-title' => 'Zamyká se „$1“',
+'protect-title-notallowed' => 'Zobrazení zámků na „$1“',
'prot_1movedto2' => 'Stránka [[$1]] přemístěna na stránku [[$2]]',
+'protect-badnamespace-title' => 'Nezamykatelný jmenný prostor',
+'protect-badnamespace-text' => 'Stránky v tomto jmenném prostoru nelze zamykat.',
'protect-legend' => 'Potvrdit zamÄení',
'protectcomment' => 'Důvod:',
'protectexpiry' => 'Čas vypršení:',
@@ -2370,6 +2423,7 @@ SouÄasné nastavení pro tuto stránku je: '''$1''':",
'protect-level-sysop' => 'Pouze správci',
'protect-summary-cascade' => 'kaskádový',
'protect-expiring' => 'vyprší $1 (UTC)',
+'protect-expiring-local' => 'vyprší $1',
'protect-expiry-indefinite' => 'do odvolání',
'protect-cascade' => 'Zamknout stránky vložené do této stránky (kaskádový zámek)',
'protect-cantedit' => 'Nemůžete měnit nastavení zámků této stránky, protože nemáte povoleno tuto stránku editovat.',
@@ -2425,7 +2479,6 @@ Pro ÄásteÄné obnovení zaÅ¡krtnÄ›te ÄtvereÄky u obnovovaných revizí a kl
'undeletereset' => 'Resetovat',
'undeleteinvert' => 'Invertovat výběr',
'undeletecomment' => 'Důvod:',
-'undeletedarticle' => 'obnovuje „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|Obnovena $1 verze|Obnoveny $1 verze|Obnoveno $1 verzí}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a $2 {{PLURAL:$2|soubor|soubory|souborů}}.',
'undeletedfiles' => '{{PLURAL:$1|obnoven $1 soubor|obnoveny $1 soubory|obnoveno $1 souborů}}',
@@ -2434,6 +2487,7 @@ Pro ÄásteÄné obnovení zaÅ¡krtnÄ›te ÄtvereÄky u obnovovaných revizí a kl
Záznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
'undelete-header' => 'Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].',
+'undelete-search-title' => 'Hledání smazaných stránek',
'undelete-search-box' => 'Hledání smazaných stránek',
'undelete-search-prefix' => 'Zobraz stránky zaÄínající na:',
'undelete-search-submit' => 'Hledat',
@@ -2442,6 +2496,7 @@ Záznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|kn
'undelete-bad-store-key' => 'Nelze obnovit verzi souboru s Äasovou znaÄkou $1: soubor pÅ™ed smazáním chybÄ›l.',
'undelete-cleanup-error' => 'Chyba při mazání nepoužívaného archivního souboru „$1“.',
'undelete-missing-filearchive' => 'Nepodařilo se obnovit soubor archivu s identifikací $1 , protože není v databázi. Možná již byl obnoven.',
+'undelete-error' => 'Chyba při obnovování stránky',
'undelete-error-short' => 'Chyba při obnovování souboru: $1',
'undelete-error-long' => 'Vyskytla se chyba při obnovování souboru:
@@ -2562,6 +2617,7 @@ Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]]
'blocklist-userblocks' => 'Skrýt zablokované úÄty',
'blocklist-tempblocks' => 'Skrýt doÄasná zablokování',
'blocklist-addressblocks' => 'Skrýt blokování jedné IP adresy',
+'blocklist-rangeblocks' => 'Skrýt blokování rozsahů',
'blocklist-timestamp' => 'Datum a Äas',
'blocklist-target' => 'Cíl',
'blocklist-expiry' => 'Vypršení',
@@ -2584,6 +2640,7 @@ Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]]
'unblocklink' => 'uvolnit',
'change-blocklink' => 'změnit blok',
'contribslink' => 'příspěvky',
+'emaillink' => 'poslat e-mail',
'autoblocker' => 'Byli jste automaticky zablokováni, protože sdílíte IP adresu s uživatelem „[[User:$1|$1]]“. Důvod zablokování tohoto uživatele: „$2“',
'blocklogpage' => 'Kniha zablokování',
'blocklog-showlog' => '{{GENDER:$1|Tento uživatel byl dříve blokován.|Tato uživatelka byla dříve blokována.|Tento uživatel byl dříve blokován.}}
@@ -2698,9 +2755,6 @@ V tÄ›chto případech musíte pÅ™esunout nebo slouÄit stránky manuálnÄ›, jest
'movepage-page-moved' => 'Stránka $1 byla přesunuta na $2.',
'movepage-page-unmoved' => 'Stránka $1 nemůže být přesunuta na $2.',
'movepage-max-pages' => '{{PLURAL:$1|Byla přesunuta maximálně povolená jedna stránka|Byly přesunuty maximálně povolené $1 stránky|Bylo přesunuto maximálně povolených $1 stránek}}, více jich už automaticky přesunuto nebude.',
-'1movedto2' => 'Stránka [[$1]] přemístěna na stránku [[$2]]',
-'1movedto2_redir' => 'Stránka [[$1]] přemístěna na stránku [[$2]] s výměnou přesměrování',
-'move-redirect-suppressed' => 'pÅ™esmÄ›rování potlaÄeno',
'movelogpage' => 'Kniha přesunů',
'movelogpagetext' => 'Toto je záznam všech přesunů stránek.',
'movesubpage' => '{{PLURAL:$1|Podstránka|Podstránky}}',
@@ -2713,7 +2767,7 @@ V tÄ›chto případech musíte pÅ™esunout nebo slouÄit stránky manuálnÄ›, jest
Cílová stránka „[[:$1]]“ již existuje. Přejete si ji smazat pro uvolnění místa pro přesun?',
'delete_and_move_confirm' => 'Ano, smazat cílovou stránku',
-'delete_and_move_reason' => 'Smazáno pro umožnění přesunu',
+'delete_and_move_reason' => 'Smazáno pro umožnění přesunu z „[[$1]]“',
'selfmove' => 'Původní a nový název jsou stejné; nelze stránku přesunout na sebe samu.',
'immobile-source-namespace' => 'Stránky ve jmenném prostoru „$1“ nelze přesouvat',
'immobile-target-namespace' => 'Stránky nelze přesouvat do jmenného prostoru „$1“',
@@ -2742,9 +2796,11 @@ Prosíme, vyberte jiné jméno.',
Do níže uvedeného editaÄního pole zadejte názvy stránek, které chcete exportovat; každý řádek jeden název. Zvolte také, zda se mají exportovat i starší verze stránky vÄetnÄ› informací v historii editací, nebo jen aktuální verze s informací o poslední editaci.
V druhém případě můžete také používat přímý odkaz, např. pomocí [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] se vyexportuje „[[{{MediaWiki:Mainpage}}]]“.',
+'exportall' => 'Exportovat všechny stránky',
'exportcuronly' => 'Zahrnout jen souÄasnou verzi, ne plnou historii',
'exportnohistory' => "----
'''Poznámka:''' export plných historií prostřednictvím tohoto formuláře byl z výkonnostních důvodů zakázán.",
+'exportlistauthors' => 'U každé stránky vypsat úplný seznam přispěvatelů',
'export-submit' => 'Exportovat',
'export-addcattext' => 'Přidat stránky z kategorie:',
'export-addcat' => 'Přidat',
@@ -2777,6 +2833,8 @@ Pokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [//www
'thumbnail_error' => 'Chyba při vytváření náhledu: $1',
'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.',
+'thumbnail-dest-create' => 'Náhled nelze uložit na dané místo.',
'thumbnail_invalid_params' => 'Neplatný parametr náhledu',
'thumbnail_dest_directory' => 'Nelze vytvořit cílový adresář',
'thumbnail_image-type' => 'Nepodporovaný typ obrázku',
@@ -2819,6 +2877,11 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'import-upload' => 'Importovat XML data',
'import-token-mismatch' => 'Ztratila se data relace. Zkuste to znovu.',
'import-invalid-interwiki' => 'Ze zadané wiki nelze importovat.',
+'import-error-edit' => 'Stránka „$1“ se nenaimportovala, protože nemáte oprávnění ji editovat.',
+'import-error-create' => 'Stránka „$1“ se nenaimportovala, protože nemáte oprávnění ji založit.',
+'import-error-interwiki' => 'Stránka „$1“ se neimportuje, protože její název je vyhrazen pro externí odkazy (interwiki).',
+'import-error-special' => 'Stránka „$1“ se neimportuje, protože patří do speciálního jmenného prostoru, do kterého stránky nepatří.',
+'import-error-invalid' => 'Stránka „$1“ se neimportuje, protože její název je neplatný.',
# Import log
'importlogpage' => 'Kniha importů',
@@ -2828,72 +2891,85 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'import-logentry-interwiki' => 'přenesl $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizi|revize|revizí}} z $2',
+# JavaScriptTest
+'javascripttest' => 'Testování JavaScriptu',
+'javascripttest-disabled' => 'Tato funkce je vypnuta.',
+'javascripttest-title' => 'Spouštějí se testy v $1',
+'javascripttest-pagetext-noframework' => 'Tato stránka je vyhrazena pro spouštění testů JavaScriptu.',
+'javascripttest-pagetext-unknownframework' => 'Neznámá testovací knihovna „$1“.',
+'javascripttest-pagetext-frameworks' => 'Zvolte jednu z následujících testovacích knihoven: $1',
+'javascripttest-pagetext-skins' => 'Zvolte vzhled, pod kterým se mají testy spustit:',
+'javascripttest-qunit-intro' => 'Vizte [$1 dokumentaci testování] na mediawiki.org',
+'javascripttest-qunit-heading' => 'Sada testů JavaScriptu v MediaWiki pomocí QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Vaše uživatelská stránka',
-'tooltip-pt-anonuserpage' => 'Uživatelská stránka pro IP adresu, ze které editujete',
-'tooltip-pt-mytalk' => 'Vaše diskusní stránka',
-'tooltip-pt-anontalk' => 'Diskuse o editacích provedených z této IP adresy',
-'tooltip-pt-preferences' => 'Moje nastavení',
-'tooltip-pt-watchlist' => 'Seznam stránek, jejichž změny sleduji',
-'tooltip-pt-mycontris' => 'Seznam vašich příspěvků',
-'tooltip-pt-login' => 'DoporuÄujeme vám pÅ™ihlásit se, ovÅ¡em není to povinné.',
-'tooltip-pt-anonlogin' => 'DoporuÄujeme vám pÅ™ihlásit se, ovÅ¡em není to povinné.',
-'tooltip-pt-logout' => 'Odhlásit se',
-'tooltip-ca-talk' => 'Diskuse ke stránce',
-'tooltip-ca-edit' => 'Tuto stránku můžete editovat. Prosíme použijte tlaÄítko Ukázat náhled pÅ™ed uložením.',
-'tooltip-ca-addsection' => 'ZaÄít novou sekci',
-'tooltip-ca-viewsource' => 'Tato stránka je zamÄena. Můžete si prohlédnout její zdrojový kód.',
-'tooltip-ca-history' => 'Starší verze této stránky.',
-'tooltip-ca-protect' => 'Zamknout tuto stránku.',
-'tooltip-ca-unprotect' => 'Změnit zámek této stránky.',
-'tooltip-ca-delete' => 'Smazat tuto stránku.',
-'tooltip-ca-undelete' => 'Obnovit editace této stránky provedené před jejím smazáním.',
-'tooltip-ca-move' => 'Přesunout tuto stránku',
-'tooltip-ca-watch' => 'Přidat tuto stránku mezi sledované',
-'tooltip-ca-unwatch' => 'Vyjmout tuto stránku ze sledovaných',
-'tooltip-search' => 'Prohledat tuto wiki',
-'tooltip-search-go' => 'Jít na stránku s tímto názvem, pokud existuje',
-'tooltip-search-fulltext' => 'Hledat stránky s tímto textem',
-'tooltip-p-logo' => 'Hlavní strana',
-'tooltip-n-mainpage' => 'Navštívit Hlavní stranu',
-'tooltip-n-mainpage-description' => 'Přejít na hlavní stranu',
-'tooltip-n-portal' => 'O projektu, jak můžete pomoci, kde hledat',
-'tooltip-n-currentevents' => 'Informace o aktuálních událostech',
-'tooltip-n-recentchanges' => 'Seznam posledních změn na této wiki',
-'tooltip-n-randompage' => 'Přejít na náhodně vybranou stránku',
-'tooltip-n-help' => 'Místo, kde najdete pomoc',
-'tooltip-t-whatlinkshere' => 'Seznam všech wikistránek, které sem odkazují',
-'tooltip-t-recentchangeslinked' => 'Nedávné změny stránek, na které je odkazováno',
-'tooltip-feed-rss' => 'RSS kanál pro tuto stránku',
-'tooltip-feed-atom' => 'Atom kanál pro tuto stránku',
-'tooltip-t-contributions' => 'Prohlédnout si seznam příspěvků tohoto uživatele',
-'tooltip-t-emailuser' => 'Poslat e-mail tomuto uživateli',
-'tooltip-t-upload' => 'Nahrát obrázky Äi jiná multimédia',
-'tooltip-t-specialpages' => 'Seznam všech speciálních stránek',
-'tooltip-t-print' => 'Tato stránka v podobě vhodné k tisku',
-'tooltip-t-permalink' => 'Trvalý odkaz na tuto verzi této stránky',
-'tooltip-ca-nstab-main' => 'Zobrazit obsahovou stránku',
-'tooltip-ca-nstab-user' => 'Zobrazit uživatelovu stránku',
-'tooltip-ca-nstab-media' => 'Zobrazit stránku souboru',
-'tooltip-ca-nstab-special' => 'Toto je speciální stránka, kterou nelze editovat.',
-'tooltip-ca-nstab-project' => 'Zobrazit stránku o wiki.',
-'tooltip-ca-nstab-image' => 'Zobrazit stránku obrázku.',
-'tooltip-ca-nstab-mediawiki' => 'Zobrazit systémovou zprávu.',
-'tooltip-ca-nstab-template' => 'Zobrazit Å¡ablonu.',
-'tooltip-ca-nstab-help' => 'Zobrazit stránku nápovědy.',
-'tooltip-ca-nstab-category' => 'Zobrazit kategorii.',
-'tooltip-minoredit' => 'OznaÄit zmÄ›nu jako malou editaci',
-'tooltip-save' => 'Uložit vaše změny',
-'tooltip-preview' => 'Zobrazit náhled vašich změn; prosíme, zobrazte si ho před uložením!',
-'tooltip-diff' => 'Zobrazit, jaké změny jste v textu provedli',
-'tooltip-compareselectedversions' => 'Podívat se na rozdíly mezi dvěma vybranými verzemi této stránky.',
-'tooltip-watch' => 'Přidat stránku do seznamu sledovaných',
-'tooltip-recreate' => 'Obnovit stánku i když byla smazána',
-'tooltip-upload' => 'Odesílání souboru',
-'tooltip-rollback' => '„Vrácení zpět“ jedním kliknutím zruší všechny editace provedené posledním uživatelem.',
-'tooltip-undo' => '„Zrušit editaci“ otevře okno editace, které neobsahuje změny provedené v rušené editaci. Je možné doplnit zdůvodnění do shrnutí editace.',
-'tooltip-preferences-save' => 'Uložit nastavení',
-'tooltip-summary' => 'Zadejte struÄné shrnutí',
+'tooltip-pt-userpage' => 'Vaše uživatelská stránka',
+'tooltip-pt-anonuserpage' => 'Uživatelská stránka pro IP adresu, ze které editujete',
+'tooltip-pt-mytalk' => 'Vaše diskusní stránka',
+'tooltip-pt-anontalk' => 'Diskuse o editacích provedených z této IP adresy',
+'tooltip-pt-preferences' => 'Moje nastavení',
+'tooltip-pt-watchlist' => 'Seznam stránek, jejichž změny sleduji',
+'tooltip-pt-mycontris' => 'Seznam vašich příspěvků',
+'tooltip-pt-login' => 'DoporuÄujeme vám pÅ™ihlásit se, ovÅ¡em není to povinné.',
+'tooltip-pt-anonlogin' => 'DoporuÄujeme vám pÅ™ihlásit se, ovÅ¡em není to povinné.',
+'tooltip-pt-logout' => 'Odhlásit se',
+'tooltip-ca-talk' => 'Diskuse ke stránce',
+'tooltip-ca-edit' => 'Tuto stránku můžete editovat. Prosíme použijte tlaÄítko Ukázat náhled pÅ™ed uložením.',
+'tooltip-ca-addsection' => 'ZaÄít novou sekci',
+'tooltip-ca-viewsource' => 'Tato stránka je zamÄena. Můžete si prohlédnout její zdrojový kód.',
+'tooltip-ca-history' => 'Starší verze této stránky.',
+'tooltip-ca-protect' => 'Zamknout tuto stránku.',
+'tooltip-ca-unprotect' => 'Změnit zámek této stránky.',
+'tooltip-ca-delete' => 'Smazat tuto stránku.',
+'tooltip-ca-undelete' => 'Obnovit editace této stránky provedené před jejím smazáním.',
+'tooltip-ca-move' => 'Přesunout tuto stránku',
+'tooltip-ca-watch' => 'Přidat tuto stránku mezi sledované',
+'tooltip-ca-unwatch' => 'Vyjmout tuto stránku ze sledovaných',
+'tooltip-search' => 'Prohledat tuto wiki',
+'tooltip-search-go' => 'Jít na stránku s tímto názvem, pokud existuje',
+'tooltip-search-fulltext' => 'Hledat stránky s tímto textem',
+'tooltip-p-logo' => 'Hlavní strana',
+'tooltip-n-mainpage' => 'Navštívit Hlavní stranu',
+'tooltip-n-mainpage-description' => 'Přejít na hlavní stranu',
+'tooltip-n-portal' => 'O projektu, jak můžete pomoci, kde hledat',
+'tooltip-n-currentevents' => 'Informace o aktuálních událostech',
+'tooltip-n-recentchanges' => 'Seznam posledních změn na této wiki',
+'tooltip-n-randompage' => 'Přejít na náhodně vybranou stránku',
+'tooltip-n-help' => 'Místo, kde najdete pomoc',
+'tooltip-t-whatlinkshere' => 'Seznam všech wikistránek, které sem odkazují',
+'tooltip-t-recentchangeslinked' => 'Nedávné změny stránek, na které je odkazováno',
+'tooltip-feed-rss' => 'RSS kanál pro tuto stránku',
+'tooltip-feed-atom' => 'Atom kanál pro tuto stránku',
+'tooltip-t-contributions' => 'Prohlédnout si seznam příspěvků tohoto uživatele',
+'tooltip-t-emailuser' => 'Poslat e-mail tomuto uživateli',
+'tooltip-t-upload' => 'Nahrát obrázky Äi jiná multimédia',
+'tooltip-t-specialpages' => 'Seznam všech speciálních stránek',
+'tooltip-t-print' => 'Tato stránka v podobě vhodné k tisku',
+'tooltip-t-permalink' => 'Trvalý odkaz na tuto verzi této stránky',
+'tooltip-ca-nstab-main' => 'Zobrazit obsahovou stránku',
+'tooltip-ca-nstab-user' => 'Zobrazit uživatelovu stránku',
+'tooltip-ca-nstab-media' => 'Zobrazit stránku souboru',
+'tooltip-ca-nstab-special' => 'Toto je speciální stránka, kterou nelze editovat.',
+'tooltip-ca-nstab-project' => 'Zobrazit stránku o wiki.',
+'tooltip-ca-nstab-image' => 'Zobrazit stránku obrázku.',
+'tooltip-ca-nstab-mediawiki' => 'Zobrazit systémovou zprávu.',
+'tooltip-ca-nstab-template' => 'Zobrazit Å¡ablonu.',
+'tooltip-ca-nstab-help' => 'Zobrazit stránku nápovědy.',
+'tooltip-ca-nstab-category' => 'Zobrazit kategorii.',
+'tooltip-minoredit' => 'OznaÄit zmÄ›nu jako malou editaci',
+'tooltip-save' => 'Uložit vaše změny',
+'tooltip-preview' => 'Zobrazit náhled vašich změn; prosíme, zobrazte si ho před uložením!',
+'tooltip-diff' => 'Zobrazit, jaké změny jste v textu provedli',
+'tooltip-compareselectedversions' => 'Podívat se na rozdíly mezi dvěma vybranými verzemi této stránky.',
+'tooltip-watch' => 'Přidat stránku do seznamu sledovaných',
+'tooltip-watchlistedit-normal-submit' => 'Odstranit položky',
+'tooltip-watchlistedit-raw-submit' => 'Aktualizovat seznam sledovaných stránek',
+'tooltip-recreate' => 'Obnovit stánku i když byla smazána',
+'tooltip-upload' => 'Odesílání souboru',
+'tooltip-rollback' => '„Vrácení zpět“ jedním kliknutím zruší všechny editace provedené posledním uživatelem.',
+'tooltip-undo' => '„Zrušit editaci“ otevře okno editace, které neobsahuje změny provedené v rušené editaci. Je možné doplnit zdůvodnění do shrnutí editace.',
+'tooltip-preferences-save' => 'Uložit nastavení',
+'tooltip-summary' => 'Zadejte struÄné shrnutí',
# Stylesheets
'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
@@ -2981,9 +3057,6 @@ Uložte jej na svůj disk a nahrajte ho sem.',
# Patrol log
'patrol-log-page' => 'Kniha prověřených editací',
'patrol-log-header' => 'Toto je kniha prověřených verzí.',
-'patrol-log-line' => 'oznaÄuje $1 stránky $2 za prověřenou $3',
-'patrol-log-auto' => '(automaticky)',
-'patrol-log-diff' => 'revizi $1',
'log-show-hide-patrol' => '$1 knihu záznamů patroly',
# Image deletion
@@ -3011,11 +3084,11 @@ OtevÅ™ením souboru můžete ohrozit svůj poÄítaÄ.",
'file-info' => 'velikost souboru: $1, MIME typ: $2',
'file-info-size' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4',
'file-info-size-pages' => '$1 × $2 pixelů, velikost souboru: $3, MIME typ: $4, $5 {{PLURAL:$5|stránka|stránky|stránek}}',
-'file-nohires' => '<small>Větší rozlišení není k dispozici.</small>',
+'file-nohires' => 'Větší rozlišení není k dispozici.',
'svg-long-desc' => 'soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
'show-big-image' => 'Obrázek ve vyšším rozlišení',
-'show-big-image-preview' => '<small>Velikost tohoto náhledu: $1.</small>',
-'show-big-image-other' => '<small>Jiná rozlišení: $1.</small>',
+'show-big-image-preview' => 'Velikost tohoto náhledu: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Jiné|Jiná}} rozlišení: $1.',
'show-big-image-size' => '$1 × $2 pixelů',
'file-info-gif-looped' => 've smyÄce',
'file-info-gif-frames' => '$1 {{PLURAL:$1|snímek|snímky|snímků}}',
@@ -3035,6 +3108,14 @@ OtevÅ™ením souboru můžete ohrozit svůj poÄítaÄ.",
'bydate' => 'podle data',
'sp-newimages-showfrom' => 'Zobrazit nové soubory poÄínaje od $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekundy|$1 sekund}}',
+'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í}}',
+'ago' => 'před
+$1',
+
# Bad image list
'bad_image_list' => 'Tato stránka má následující formát:
@@ -3527,13 +3608,6 @@ Platnost tohoto potvrzovacího kódu vyprší $4.',
'scarytranscludefailed' => '[NepodaÅ™ilo se naÄíst Å¡ablonu pro $1]',
'scarytranscludetoolong' => '[Příliš dlouhé URL]',
-# Trackbacks
-'trackbackbox' => 'Zpětné odkazy k této stránce:<br />
-$1',
-'trackbackremove' => '([$1 Smazat])',
-'trackbacklink' => 'Zpětný odkaz',
-'trackbackdeleteok' => 'Zpětný odkaz byl úspěšně smazán.',
-
# Delete conflict
'deletedwhileediting' => "'''Upozornění''': V průběhu vaší editace byla tato stránka smazána!",
'confirmrecreate' => 'Uživatel [[User:$1|$1]] ([[User talk:$1|diskuse]]) tuto stránku smazal poté, co jste zaÄali editovat, s odůvodnÄ›ním:
@@ -3675,6 +3749,9 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
'hebrew-calendar-m11-gen' => 'avu',
'hebrew-calendar-m12-gen' => 'elulu',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuse]])',
+
# Core parser functions
'unknown_extension_tag' => 'Neznámá znaÄka rozšíření: „$1“',
'duplicate-defaultsort' => 'UpozornÄ›ní: Implicitní klÃ­Ä Å™azení (DEFAULTSORTKEY) „$2“ pÅ™episuje dříve nastavenou hodnotu „$1“.',
@@ -3773,13 +3850,16 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změny|změn}}',
# Special:ComparePages
-'comparepages' => 'Porovnání stránek',
-'compare-selector' => 'Porovnání revizí stránek',
-'compare-page1' => 'Stránka 1',
-'compare-page2' => 'Stránka 2',
-'compare-rev1' => 'Revize 1',
-'compare-rev2' => 'Revize 2',
-'compare-submit' => 'Porovnat',
+'comparepages' => 'Porovnání stránek',
+'compare-selector' => 'Porovnání revizí stránek',
+'compare-page1' => 'Stránka 1',
+'compare-page2' => 'Stránka 2',
+'compare-rev1' => 'Revize 1',
+'compare-rev2' => 'Revize 2',
+'compare-submit' => 'Porovnat',
+'compare-invalid-title' => 'Zadaný název je neplatný.',
+'compare-title-not-exists' => 'Zadaný název neexistuje.',
+'compare-revision-not-exists' => 'Zadaná revize neexistuje.',
# Database error messages
'dberr-header' => 'Tato wiki má nějaké potíže',
@@ -3806,4 +3886,90 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'sqlite-has-fts' => '$1 s podporou plnotextového vyhledávání',
'sqlite-no-fts' => '$1 bez podpory plnotextového vyhledávání',
+# New logging system
+'logentry-delete-delete' => '$1 smazal stránku $3',
+'logentry-delete-restore' => '$1 obnovil stránku $3',
+'logentry-delete-event' => '$1 změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-delete-revision' => '$1 změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-delete-event-legacy' => '$1 změnil viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-delete-revision-legacy' => '$1 změnil viditelnost revizí na stránce $3',
+'logentry-suppress-delete' => '$1 utajil stránku $3',
+'logentry-suppress-event' => '$1 utajeně změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-suppress-revision' => '$1 utajeně změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-suppress-event-legacy' => '$1 utajeně změnil viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-suppress-revision-legacy' => '$1 utajeně změnil viditelnost revizí na stránce $3',
+'revdelete-content-hid' => 'skryt obsah',
+'revdelete-summary-hid' => 'skryto shrnutí editace',
+'revdelete-uname-hid' => 'skryto uživatelské jméno',
+'revdelete-content-unhid' => 'odkryt obsah',
+'revdelete-summary-unhid' => 'odkryto shrnutí editace',
+'revdelete-uname-unhid' => 'odkryto uživatelské jméno',
+'revdelete-restricted' => 'omezení správců použito',
+'revdelete-unrestricted' => 'omezení správců odstraněno',
+'logentry-move-move' => '$1 přesunul stránku $3 na $4',
+'logentry-move-move-noredirect' => '$1 přesunul stránku $3 na $4 bez založení přesměrování',
+'logentry-move-move_redir' => '$1 přesunul stránku $3 na $4 s výměnou přesměrování',
+'logentry-move-move_redir-noredirect' => '$1 přesunul stránku $3 na $4 místo přesměrování bez založení přesměrování',
+'logentry-patrol-patrol' => '$1 oznaÄil revizi $4 stránky $3 jako prověřenou',
+'logentry-patrol-patrol-auto' => '$1 automaticky oznaÄil revizi $4 stránky $3 jako prověřenou',
+'logentry-newusers-newusers' => '$1 založil uživatelský úÄet',
+'logentry-newusers-create' => '$1 založil uživatelský úÄet',
+'logentry-newusers-create2' => '$1 založil uživatelský úÄet $3',
+'logentry-newusers-autocreate' => 'Automaticky byl založen úÄet $1',
+'newuserlog-byemail' => 'heslo zasláno e-mailem',
+
+# Feedback
+'feedback-bugornote' => 'Pokud dokážete podrobně popsat technický problém, můžete [$1 nahlásit chybu].
+Jinak můžete využít jednoduchý formulář níže. Váš komentář bude pÅ™idán na stránku „[$3 $2]“ spolu s vaším uživatelským jménem a informací o tom, jaký prohlížeÄ používáte.',
+'feedback-subject' => 'Předmět:',
+'feedback-message' => 'Zpráva:',
+'feedback-cancel' => 'Storno',
+'feedback-submit' => 'Odeslat komentář',
+'feedback-adding' => 'Komentář se přidává na stránku…',
+'feedback-error1' => 'Chyba: Nerozpoznaný výsledek z API',
+'feedback-error2' => 'Chyba: Editace se nezdařila',
+'feedback-error3' => 'Chyba: API nevrátilo žádnou odpovÄ›Ä',
+'feedback-thanks' => 'Děkujeme! Váš komentář byl přidat na stránku „[$2 $1]“.',
+'feedback-close' => 'Hotovo',
+'feedback-bugcheck' => 'Skvělé! Jen zkontrolujte, zda se nejedná o jednu z [$1 už známých chyb].',
+'feedback-bugnew' => 'Zkontroloval(a) jsem to. Chci ohlásit novou chybu.',
+
+# API errors
+'api-error-badaccess-groups' => 'Nemáte povoleno nahrávat soubory na tuto wiki.',
+'api-error-badtoken' => 'Vnitřní chyba: špatný token.',
+'api-error-copyuploaddisabled' => 'NaÄítání z URL je na tomto severu zakázáno.',
+'api-error-duplicate' => 'Na této wiki již {{PLURAL:$1|existuje [$2 jiný soubor]|existují [$2 jiné soubory]}} se shodným obsahem',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Soubor|Soubory}} se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.',
+'api-error-duplicate-archive-popup-title' => 'Duplicitní {{PLURAL:$1|soubor, který byl|soubory, které byly}} smazány',
+'api-error-duplicate-popup-title' => 'Duplicitní {{PLURAL:$1|soubor|soubory}}',
+'api-error-empty-file' => 'NaÄtený soubor je prázdný.',
+'api-error-emptypage' => 'Zakládání prázdných stránek není dovoleno.',
+'api-error-fetchfileerror' => 'Vnitřní chyba: došlo k chybě při stahování souboru.',
+'api-error-file-too-large' => 'NaÄtený soubor je příliÅ¡ velký.',
+'api-error-filename-tooshort' => 'Název souboru je příliš krátký.',
+'api-error-filetype-banned' => 'Tento typ souboru je zakázán.',
+'api-error-filetype-missing' => 'Tento soubor nemá příponu.',
+'api-error-hookaborted' => 'Zamýšlená úprava byla zakázána rozšiřujícím modulem.',
+'api-error-http' => 'Vnitřní chyba: nepodařilo se připojit k serveru.',
+'api-error-illegal-filename' => 'Tento název souboru není dovolen.',
+'api-error-internal-error' => 'VnitÅ™ní chyba: doÅ¡lo k chybÄ› pÅ™i zpracování vaÅ¡eho naÄteného souboru.',
+'api-error-invalid-file-key' => 'VnitÅ™ní chyba: soubor nebyl nalezen v doÄasném úložiÅ¡ti.',
+'api-error-missingparam' => 'Vnitřní chyba: chybí parametry požadavku.',
+'api-error-missingresult' => 'VnitÅ™ní chyba: nelze urÄit, zda kopírování bylo úspěšné.',
+'api-error-mustbeloggedin' => 'K naÄtení souborů musíte být pÅ™ihlášen.',
+'api-error-mustbeposted' => 'Vnitřní chyba: požadavek musí být prostřednictvím HTTP POST.',
+'api-error-noimageinfo' => 'NaÄtení bylo úspěšné, ale server neposkytl o souboru žádné informace.',
+'api-error-nomodule' => 'Interní chyba: není nastaven naÄítací modul.',
+'api-error-ok-but-empty' => 'Interní chyba: ze serveru nepÅ™iÅ¡la odpovÄ›Ä.',
+'api-error-overwrite' => 'Není dovoleno přepsat existující soubor.',
+'api-error-stashfailed' => 'VnitÅ™ní chyba: serveru se nepodaÅ™ilo uložit doÄasný soubor.',
+'api-error-timeout' => 'Server neodpovÄ›dÄ›l v oÄekávaném Äase.',
+'api-error-unclassified' => 'Došlo k neznámé chybě',
+'api-error-unknown-code' => 'Neznámá chyba: „$1“',
+'api-error-unknown-error' => 'VnitÅ™ní chyba: doÅ¡lo k chybÄ› pÅ™i pokusu o naÄtení souboru.',
+'api-error-unknown-warning' => 'Neznámé varování: $1',
+'api-error-unknownerror' => 'Neznámá chyba: „$1“.',
+'api-error-uploaddisabled' => 'NaÄítání souborů je na této wiki vypnuto.',
+'api-error-verification-error' => 'Soubor je možná poškozen nebo má špatnou příponu.',
+
);
diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php
index 4becde1b..c70bb6c7 100644
--- a/languages/messages/MessagesCsb.php
+++ b/languages/messages/MessagesCsb.php
@@ -351,7 +351,6 @@ Mòże to zgÅ‚oszëc [[Special:ListUsers/sysop|sprôwnikòwi]], pòdajÄ…c adresÃ
'badtitle' => 'Òchëbny titel',
'badtitletext' => 'Pòdóny titel starnë je òchëbny. Gwësno są w nim znaczi, chtërnëch brëkòwanié je zakôzané abò je pùsti.',
'viewsource' => 'Zdrojowi tekst',
-'viewsourcefor' => 'dlô $1',
'editinginterface' => "'''ÒSTRZÉGA:''' Editëjesz starnã, jakô zamëkô w se tekst interfejsu softwôrë. Wszëtczé zmianë tu zrobioné bãdze widzec na interfejse jinszëch brëkòwników.
Przemëszlë dolmaczënié na [//translatewiki.net/wiki/Main_Page?setlang=csb translatewiki.net], ekstra ùdbie lokalizacëji softwôrë MediaWiki.",
@@ -468,9 +467,6 @@ Bë zgwësnic sprawã zablokòwaniô mòżesz skòntaktowac sã z $1 abò jińsz
Boczë, że të ni mòżesz stądka sélac e-mailów, jeżlë nié môsz jesz zaregisterowóné e-mailowé adresë w [[Special:Preferences|nastôwach]].
Twòjô aktualnô adresa IP to $3, a zablokòwónô adresa ID to #$5.
Proszëmë pòdac wëższé pòdôłczi przë wszëtczich pëtaniach.",
-'blockedoriginalsource' => "Zdrój '''$1''' je niżi:",
-'blockededitsource' => "Tekst '''Twòjëch edicëji''' do '''$1''' je niżi:",
-'whitelistedittitle' => 'Bë editowac je nót sã wlogòwac',
'loginreqlink' => 'Wlogùjë',
'loginreqpagetext' => '$1 sã, żebë przezérac jinszé starnë.',
'accmailtitle' => 'Parola wësłónô.',
@@ -553,15 +549,6 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
'revdel-restore-visible' => 'widzawné wersëje',
'pagehist' => 'Historëjô starnë',
'deletedhist' => 'Rëmniãtô historëjô edicëji',
-'revdelete-content' => 'zamkłosc',
-'revdelete-summary' => 'òpisënk zjinaczi',
-'revdelete-uname' => 'miono brëkòwnika',
-'revdelete-restricted' => 'nastôwi ògrańczenia dlô sprôwników',
-'revdelete-unrestricted' => 'rëmôj ògrańczenia dlô sprôwników',
-'revdelete-hid' => 'zatacë $1',
-'revdelete-unhid' => 'nie tacë $1',
-'revdelete-log-message' => '$1 - $2 {{PLURAL:$2|wersëjô|wersëji}}',
-'logdelete-log-message' => '$1 – $2 {{PLURAL:$2|zdarzenié|zdarzenia|zdarzeniów}}',
'revdelete-hide-current' => 'Pòkôza sã fela przë taceniu wersëji datowóny na $2, $1. To je nônowszô wersëjô starnë, chtërnô ni mòże bëc zataconô.',
'revdelete-show-no-access' => 'Pòkôza sã fela przë próbie wëskrzënieniô elementu datowónegò na $2, $1. Widzawnota negò elementu òsta ògrańczonô - ni môsz przëstãpù.',
@@ -766,15 +753,14 @@ Mòżesz zezwòlëc jinszim brëkòwniką na łączbã z Tobą przez Twòją sta
'rc-enhanced-hide' => 'Zatacë detale',
# Recent changes linked
-'recentchangeslinked' => 'Zmianë w dolënkòwónëch',
-'recentchangeslinked-feed' => 'Zmianë w dolënkòwónëch',
-'recentchangeslinked-toolbox' => 'Zmianë w dolënkòwónëch',
-'recentchangeslinked-title' => 'Zjinaczi w lënkòwónëch z "$1"',
-'recentchangeslinked-backlink' => '↠$1',
-'recentchangeslinked-summary' => "Niżi nachôdô sã lësta slédnëch zjinaków na lënkòwónëch starnach z pòdóny starnë (abò we wszëtczich starnach przënôleżącëch do pòdóny kategòrëji).
+'recentchangeslinked' => 'Zmianë w dolënkòwónëch',
+'recentchangeslinked-feed' => 'Zmianë w dolënkòwónëch',
+'recentchangeslinked-toolbox' => 'Zmianë w dolënkòwónëch',
+'recentchangeslinked-title' => 'Zjinaczi w lënkòwónëch z "$1"',
+'recentchangeslinked-summary' => "Niżi nachôdô sã lësta slédnëch zjinaków na lënkòwónëch starnach z pòdóny starnë (abò we wszëtczich starnach przënôleżącëch do pòdóny kategòrëji).
Starnë z [[Special:Watchlist|lëstë ùzérónëch artiklów]] są '''pògrëbioné'''.",
-'recentchangeslinked-page' => 'Miono starnë:',
-'recentchangeslinked-to' => 'Wëskrzëni zjinaczi nié na lënkòwónëch starnach, blós na starnach lënkùjącëch do pòdóny starnë',
+'recentchangeslinked-page' => 'Miono starnë:',
+'recentchangeslinked-to' => 'Wëskrzëni zjinaczi nié na lënkòwónëch starnach, blós na starnach lënkùjącëch do pòdóny starnë',
# Upload
'upload' => 'Wladënk lopka',
@@ -908,8 +894,7 @@ Mòżesz zawãżëc wëszłosc przez wëbranié ôrtu registru, miona brëkòwni
'linksearch' => 'Bùtnowé lënczi',
# Special:Log/newusers
-'newuserlogpage' => 'Nowi brëkòwnicë',
-'newuserlog-create-entry' => 'Nowé kònto brëkòwnika',
+'newuserlogpage' => 'Nowi brëkòwnicë',
# Special:ListGroupRights
'listgrouprights-members' => '(lësta nôlëżników karna)',
@@ -966,7 +951,6 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
'actioncomplete' => 'Òperacëjô wëkònónô',
'deletedtext' => '^$1" òstôł rëmniãti.
Òbôczë na starnie $2 register slédnych rëmniãców.',
-'deletedarticle' => 'rëmniãté przez "[[$1]]"',
'dellogpage' => 'Rëmóné',
'deletionlog' => 'register rëmaniów',
'deletecomment' => 'Przëczëna:',
@@ -1012,7 +996,6 @@ Mòżesz zmienic légã zazychrowaniô, nie bãdze to równak miało cëskù na
'viewdeletedpage' => 'Òbaczë rëmóne starnë',
'undeletebtn' => 'Doprowôdzë nazôd',
'undeletelink' => 'wëskrzëni abò doprowôdzë nazôd',
-'undeletedarticle' => 'dobëté nazôd "[[$1]]"',
'undelete-show-file-submit' => 'Jo',
# Namespace form on various pages
@@ -1112,8 +1095,6 @@ W taczich przëtrôfkach zamkłosc diskùsëji mòże przeniesc blós rãczno.',
'talkexists' => "'''Starna zamkłoscë òsta ùdało przeniosłô, równak starna diskùsëji ni, ga starna diskùsëji na nowim pacu ju je. Sparłãczë ne dwa tekstë rãczno'''",
'movedto' => 'przeniesłô do',
'movetalk' => 'Przeniesë téż starnã <i>Diskùsëje</i>, jeżle je to mòżlëwé.',
-'1movedto2' => '[[$1]] przeniesłé do [[$2]]',
-'1movedto2_redir' => '[[$1]] przeniesłé do [[$2]] nad przeczérowanim',
'movelogpage' => 'Przeniosłé',
'movereason' => 'Przëczëna:',
'revertmove' => 'copnij',
@@ -1217,7 +1198,7 @@ Zezwôlô na dodanié przëczënë zjinaczi w òpisënkù.',
'imagemaxsize' => 'Ògrańczë na starnie òpisënkù òbrôzków jich miarã do:',
'thumbsize' => 'Miara miniaturków:',
'file-info-size' => '$1 × $2 pikslów, miara lopka: $3, ôrt MIME: $4',
-'file-nohires' => '<small>Felëje wikszô miara.</small>',
+'file-nohires' => 'Felëje wikszô miara.',
'svg-long-desc' => 'Lopk SVG, nominalno $1 × $2 pikslów, miara lopka: $3',
'show-big-image' => 'Fùl miara',
@@ -1294,4 +1275,8 @@ Jinszé pòla bãdą domëslno zataconé.
# Special:SpecialPages
'specialpages' => 'Specjalné starnë',
+# New logging system
+'revdelete-restricted' => 'nastôwi ògrańczenia dlô sprôwników',
+'revdelete-unrestricted' => 'rëmôj ògrańczenia dlô sprôwników',
+
);
diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php
index 64256f0e..512dc75b 100644
--- a/languages/messages/MessagesCu.php
+++ b/languages/messages/MessagesCu.php
@@ -61,8 +61,8 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ПРѢÐÐПРÐВЛЄÐИѤ', '#REDIRECT' ),
- 'language' => array( '0', '#ѨꙀê™ÐšÐª:', '#LANGUAGE:' ),
+ 'redirect' => array( '0', '#ПРѢÐÐПРÐВЛЄÐИѤ', '#REDIRECT' ),
+ 'language' => array( '0', '#ѨꙀê™ÐšÐª:', '#LANGUAGE:' ),
);
$defaultDateFormat = 'mdy';
@@ -263,9 +263,8 @@ $messages = array(
'nstab-category' => 'катигорїꙗ',
# General errors
-'error' => 'блаê™Ð½Ð°',
-'viewsource' => 'Ñтраницѧ иÑточьнъ обраê™ÑŠ',
-'viewsourcefor' => '$1 дѣлꙗ',
+'error' => 'блаê™Ð½Ð°',
+'viewsource' => 'Ñтраницѧ иÑточьнъ обраê™ÑŠ',
# Login and logout pages
'yourname' => 'твоѥ имѧ',
@@ -355,8 +354,6 @@ $messages = array(
'revdelete-log' => 'какъ ÑъмꙑÑлъ :',
'pagehist' => 'Ñтраницѧ Ñ—Ñторїꙗ',
'deletedhist' => 'поничьжєна Ñ—Ñторїꙗ',
-'revdelete-summary' => 'мѣнꙑ опьÑаниѥ',
-'revdelete-uname' => 'польꙃєватєлꙗ имѧ',
'revdelete-otherreason' => 'инъ или допльнитєл҄ьнъ ÑъмꙑÑлъ :',
'revdelete-reasonotherlist' => 'инъ ÑъмꙑÑлъ',
@@ -584,9 +581,7 @@ $messages = array(
'listusers-submit' => 'виждь',
# Special:Log/newusers
-'newuserlogpage' => 'новъ мѣÑÑ‚ÑŠ Ñътворѥниꙗ Ñ—Ñторїꙗ',
-'newuserlog-create-entry' => 'новъ польꙃєватєл҄ь',
-'newuserlog-autocreate-entry' => 'польꙃєватєлꙗ мѣÑто аѵтоматичьно Ñътворєно Ñ¥ÑÑ‚ÑŠ',
+'newuserlogpage' => 'новъ мѣÑÑ‚ÑŠ Ñътворѥниꙗ Ñ—Ñторїꙗ',
# E-mail user
'emailuser' => 'поÑъли єпїÑтолѫ',
@@ -615,7 +610,6 @@ $messages = array(
'actioncomplete' => 'дѣиÑтво Ñътворєно Ñ¥ÑÑ‚ÑŠ',
'deletedtext' => 'Ñтраница â– $1 ■поничьжєна Ñ¥ÑÑ‚ÑŠ â™
виждь â– $2 ■поÑлѣдьнъ поничьжєниѩ дѣлꙗ',
-'deletedarticle' => 'â– [[$1]] ■поничьжєнъ Ñ¥ÑÑ‚ÑŠ',
'dellogpage' => 'поничьжєниꙗ Ñ—Ñторїꙗ',
'deletionlog' => 'поничьжєниꙗ Ñ—Ñторїꙗ',
'deletecomment' => 'какъ ÑъмꙑÑлъ :',
@@ -686,8 +680,6 @@ $messages = array(
'movepage-moved-redirect' => 'прѣнаправлѥниѥ Ñътворѥно бѣ',
'movedto' => 'прѣимєновано въ',
'movetalk' => 'Ñи Ñтраницѧ бєÑѣдꙑ прѣимєнованиѥ',
-'1movedto2' => 'â– [[$1]] ■нарєчєнъ â– [[$2]] ■ѥÑÑ‚ÑŠ',
-'1movedto2_redir' => '[[$1]] нарєчєнъ [[$2]] врьхоу прѣнаправлѥниꙗ Ñ¥ÑÑ‚ÑŠ.',
'movelogpage' => 'прѣимєнованиꙗ Ñ—Ñторїꙗ',
'movereason' => 'какъ ÑъмꙑÑлъ :',
'move-leave-redirect' => 'прѣнаправлѥниꙗ Ñътворѥниѥ',
diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php
index 26accd24..ae8626aa 100644
--- a/languages/messages/MessagesCv.php
+++ b/languages/messages/MessagesCv.php
@@ -37,6 +37,9 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Категорине_ÑӳтÑе_Ñвмалли',
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$linkTrail = '/^([a-zа-Ñĕçăӳ"»]+)(.*)$/sDu';
$messages = array(
@@ -352,14 +355,13 @@ $1',
'cannotdelete' => 'ЭÑир кăтартнă Ñтраницăна е файла кăларÑа пăрахаймаÑтпăр. Ăна, тен, урăххи кăларÑа пăрахнă?',
'badtitle' => 'Ку ÑÑ‚ килĕшмеÑÑ‚',
'badtitletext' => 'ЭÑир кăтартнă ÑÑ‚Ð°Ñ‚ÑŒÑ Ñчĕ Ñ‚Ä•Ñ€Ä•Ñ Ð¼Ð°Ñ€, пушă, е чĕлхе хушшинчипе интервики Ñчĕ Ñ‚Ä•Ñ€Ä•Ñ Ð¼Ð°Ñ€. Ятра уÑă курма юраман паллăÑене çырнинче пулма пултарать.',
-'perfcached' => 'Ку даннăйÑене кÑшран илнĕ, çавна май унта юлашки улшăнуÑем палăрмаÑăр пултараççĕ.',
-'perfcachedts' => 'Ку даннăйÑене кÑшран илнĕ, юлашки хут вăл $1 вăхăтра çĕнелнĕ.',
+'perfcached' => 'Ку даннăйÑене кÑшран илнĕ, çавна май унта юлашки улшăнуÑем палăрмаÑăр пултараççĕ. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ку даннăйÑене кÑшран илнĕ, юлашки хут вăл $1 вăхăтра çĕнелнĕ. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ку Ñтраницăна хальхи вăхăтра улăштарма чарнă. Ку даннăйÑене хальхи вăхăтра çĕнетме май çук.',
'wrong_wfQuery_params' => 'wfQuery() функцине Ñ‚Ä•Ñ€Ä•Ñ Ð¼Ð°Ñ€ параметрÑем панă<br />
Функци: $1<br />
Ыйту: $2',
'viewsource' => 'Курăм',
-'viewsourcefor' => '«$1» Ñтраници',
'actionthrottled' => 'Хăвăртлăха чакарнă',
'actionthrottledtext' => 'Спампа кĕрешнине пула ку ĕçе пĕчĕк вăхăт хушшинче ытла нумай тума чарнă. Темиçе минутран тепре туÑа пăхма пултаратăр.',
'protectedpagetext' => 'Ку Ñтраницăна тӳрлетме май çук, хӳтĕленĕ.',
@@ -487,9 +489,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
Сирĕн IP-Ð°Ð´Ñ€ÐµÑ â€” $3, чару идентификаторĕ — #$5. ÇыруÑенче, тархаÑшăн, вĕÑене пĕлтерĕр.",
'blockednoreason' => 'Ñăлтавне пĕлтермен',
-'blockedoriginalsource' => 'ÐÑларах «$1» Ñтраницăн текÑтне куратăр.',
-'blockededitsource' => "ÐÑларах ÑÑир «$1» Ñтраницăра '''хăвÑамăр тунă''' улшăнуÑене куратăр.",
-'whitelistedittitle' => 'Улăштарма Ñирĕн авторизациленмелле',
'loginreqtitle' => 'Сайта кĕмелле',
'loginreqlink' => 'Ñайта кĕр',
'loginreqpagetext' => 'Ытти ÑтраницăÑене курмашкăн Ñирĕн $1.',
@@ -571,10 +570,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
'revdelete-success' => 'ВерÑин курăмлăхне улăштартăмăр.',
'pagehist' => 'Страница иÑторийĕ',
'deletedhist' => 'КăларÑа пăрахниÑен иÑторийĕ',
-'revdelete-content' => 'ăшлăхĕ',
-'revdelete-uname' => 'Хутшăнакан Ñчĕ',
-'revdelete-hid' => '$1 пытарнă',
-'revdelete-unhid' => '$1 курăмлă тунă',
# Suppression log
'suppressionlog' => 'Пытару журналĕ',
@@ -933,20 +928,19 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_anon_editor' => '$1 анонимлă хутшăнакан',
# Delete
-'deletepage' => 'КăларÑа парахнă ÑтатьÑÑем',
-'confirm' => 'Çирĕплетни',
-'excontent' => 'ăшлăхĕ: «$1»',
-'excontentauthor' => 'ăшлăхĕ: «$1» ([[Special:Contributions/$2|$2]] пĕччен кăна улшăнуÑем кĕртнĕ)',
-'exblank' => 'Ñтраница пушă пулнă',
-'actioncomplete' => 'Турăмăр',
-'deletedtext' => '«$1» кăларÑа парахрăмăр.
+'deletepage' => 'КăларÑа парахнă ÑтатьÑÑем',
+'confirm' => 'Çирĕплетни',
+'excontent' => 'ăшлăхĕ: «$1»',
+'excontentauthor' => 'ăшлăхĕ: «$1» ([[Special:Contributions/$2|$2]] пĕччен кăна улшăнуÑем кĕртнĕ)',
+'exblank' => 'Ñтраница пушă пулнă',
+'actioncomplete' => 'Турăмăр',
+'deletedtext' => '«$1» кăларÑа парахрăмăр.
Юлашки кăларÑа пăрахнă ÑтатьÑÑен ÑпиÑокне курмашкăн кунта пăхăр: $2.',
-'suppressedarticle' => '«[[$1]]» пытарнă',
-'dellogpage' => 'КăларÑа пăрахниÑем',
-'dellogpagetext' => 'ÐÑларах ÑÑир юлашки кăларÑа пăрахнă ÑтатьÑÑене куратăр.',
-'deletionlog' => 'кăларÑа пăрахниÑем',
-'reverted' => 'Малтанхи верÑине тавăрнă',
-'deletecomment' => 'Сăлтавĕ',
+'dellogpage' => 'КăларÑа пăрахниÑем',
+'dellogpagetext' => 'ÐÑларах ÑÑир юлашки кăларÑа пăрахнă ÑтатьÑÑене куратăр.',
+'deletionlog' => 'кăларÑа пăрахниÑем',
+'reverted' => 'Малтанхи верÑине тавăрнă',
+'deletecomment' => 'Сăлтавĕ',
# Rollback
'rollback' => 'ТÿрлетÿÑене каÑлла куçараÑÑи',
@@ -971,7 +965,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'undeleterevisions' => 'Ðрхивра пурĕ $1 верÑи',
'undeletebtn' => 'КаÑлла тавăр!',
'undeletereset' => 'ТаÑат',
-'undeletedarticle' => '«[[$1]]» каÑлла тавăрнă',
'undeletedrevisions' => '$1 кăларÑа пăрахнă тӳрлетӳÑене каÑлла тавăрнă',
'undelete-search-box' => 'КăларÑа пăрахнă ÑтраницăÑен хушшинчи шырав',
'undelete-search-submit' => 'Шыра',
@@ -1034,8 +1027,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
ТархаÑшăн, ÑтатьÑна урăх ÑÑ‚ парăр.',
'talkexists' => "'''Страницăн Ñтне улăштартăмăр, анчах та ÑӳтÑе Ñвмалли Ñтраницăн Ñтне улăштараймарăмар — вăл Ñтлă Ñтраницăна маларах хатĕрленĕ. ТархаÑшăн, вĕÑене хăвăр тĕллĕн çыпăçтарăр.'''",
'movetalk' => 'СтатьÑна ÑӳтÑе Ñвнă Ñтраницăн Ñтне те улăштармалла',
-'1movedto2' => '[[$1]] [[$2]] çине куçарнă',
-'1movedto2_redir' => '«[[$1]]» ÑÑ‚Ð°Ñ‚ÑŒÑ Ñтне маларах куçаракан Ñтраница пулнă «[[$2]]» çине улăштарнă',
'movelogpage' => 'СтатьÑÑен Ñтне улăштарнине кăтартакан журнал',
'movereason' => 'Сăлтавĕ',
'delete_and_move' => 'КăларÑа пăрахÑа куçараÑÑи',
@@ -1119,7 +1110,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Media information
'file-info' => 'файл пыÑăкăшĕ: $1, MIME-Ñ‚Ä•ÑÄ•: $2',
'file-info-size' => '$1 × $2 пикÑел, файл пыÑăкăше: $3, MIME-Ñ‚Ä•ÑÄ•: $4',
-'file-nohires' => '<small>ПыÑăкрах калăпăшли çук.</small>',
+'file-nohires' => 'ПыÑăкрах калăпăшли çук.',
# Special:NewFiles
'newimages' => 'Çĕнĕ файлÑен галерейи',
@@ -1156,9 +1147,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'scarytranscludefailed' => '[Шел те, $1 шаблонпа уÑă кураймарăмăр]',
'scarytranscludetoolong' => '[Питĕ шел, URL ытла вăрăм]',
-# Trackbacks
-'trackbackremove' => '([$1 кăларÑа пăрах])',
-
# Delete conflict
'deletedwhileediting' => 'ÐÑăрхăр: ÑÑир тӳрлетнĕ вăхăтра ку Ñтраницăна кăларÑа парахнă!',
'recreate' => 'Çĕнĕрен пуçла',
diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php
index c9fb118c..4d8aaef8 100644
--- a/languages/messages/MessagesCy.php
+++ b/languages/messages/MessagesCy.php
@@ -49,69 +49,69 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ail-cyfeirio', '#ailgyfeirio', '#REDIRECT' ),
- 'notoc' => array( '0', '__DIMTAFLENCYNNWYS__', '__DIMRHESTRGYNNWYS__', '__DIMRHG__', '__NOTOC__' ),
- 'noeditsection' => array( '0', '__DIMADRANGOLYGU__', '__DIMGOLYGUADRAN__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'MISCYFOES', 'MISCYFREDOL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ENWMISCYFOES', 'ENWMISCYFREDOL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'GENENWMISCYFOES', 'CURRENTMONTHNAMEGEN' ),
- 'currentday' => array( '1', 'DYDDIADCYFOES', 'DYDDCYFREDOL', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'ENWDYDDCYFOES', 'ENWDYDDCYFREDOL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'FLWYDDYNCYFOES', 'BLWYDDYNGYFREDOL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AMSERCYFOES', 'AMSERCYFREDOL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'AWRGYFREDOL', 'CURRENTHOUR' ),
- 'numberofarticles' => array( '1', 'NIFEROERTHYGLAU', 'NIFERYRERTHYGLAU', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NIFERYFFEILIAU', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NIFERYDEFNYDDWYR', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'NIFERYGOLYGIADAU', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'ENWTUDALEN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ENWTUDALENE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'PARTH', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NAMESPACE', 'PARTHE', 'NAMESPACEE' ),
- 'fullpagename' => array( '1', 'ENWLLAWNTUDALEN', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ENWLLAWNTUDALENE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ENWISDUDALEN', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ENWISDUDALENE', 'SUBPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ENWTUDALENSGWRS', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ENWTUDALENSGWRSE', 'TALKPAGENAMEE' ),
- 'img_thumbnail' => array( '1', 'ewin bawd', 'bawd', 'mân-lun', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'mân-lun=$1', 'bawd=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'de', 'right' ),
- 'img_left' => array( '1', 'chwith', 'left' ),
- 'img_none' => array( '1', 'dim', 'none' ),
- 'img_center' => array( '1', 'canol', 'center', 'centre' ),
- 'img_page' => array( '1', 'tudalen=$1', 'tudalen $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'unionsyth', 'unionsyth=$1', 'unionsyth $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_sub' => array( '1', 'is', 'sub' ),
- 'img_super' => array( '1', 'uwch', 'super', 'sup' ),
- 'img_top' => array( '1', 'brig', 'top' ),
- 'img_bottom' => array( '1', 'gwaelod', 'godre', 'bottom' ),
- 'server' => array( '0', 'GWEINYDD', 'SERVER' ),
- 'servername' => array( '0', 'ENW\'RGWEINYDD', 'SERVERNAME' ),
- 'grammar' => array( '0', 'GRAMMAR', 'GRAMADEG', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'WYTHNOSGYFREDOL', 'CURRENTWEEK' ),
- 'revisionid' => array( '1', 'IDYGOLYGIAD', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DIWRNODYGOLYGIAD', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DIWRNODYGOLYGIAD2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MISYGOLYGIAD', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'BLWYDDYNYGOLYGIAD', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'STAMPAMSERYGOLYGIAD', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'LLUOSOG:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URLLLAWN:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLLLAWNE:', 'FULLURLE:' ),
- 'newsectionlink' => array( '1', '_NEWSECTIONLINK_', '_CYSWLLTADRANNEWYDD_', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'GOLYGIADCYFREDOL', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'STAMPAMSERCYFREDOL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'STAMPAMSERLLEOL', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#IAITH:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'IAITHYCYNNWYS', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'TUDALENNAUYNYPARTH:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NIFERYGWEINYDDWYR', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FFORMATIORHIF', 'FORMATNUM' ),
- 'special' => array( '0', 'arbennig', 'special' ),
- 'hiddencat' => array( '1', '_HIDDENCAT_', '_CATCUDD_', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'TUDALENNAUYNYCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'MAINTTUD', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#ail-cyfeirio', '#ailgyfeirio', '#REDIRECT' ),
+ 'notoc' => array( '0', '__DIMTAFLENCYNNWYS__', '__DIMRHESTRGYNNWYS__', '__DIMRHG__', '__NOTOC__' ),
+ 'noeditsection' => array( '0', '__DIMADRANGOLYGU__', '__DIMGOLYGUADRAN__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'MISCYFOES', 'MISCYFREDOL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ENWMISCYFOES', 'ENWMISCYFREDOL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'GENENWMISCYFOES', 'CURRENTMONTHNAMEGEN' ),
+ 'currentday' => array( '1', 'DYDDIADCYFOES', 'DYDDCYFREDOL', 'CURRENTDAY' ),
+ 'currentdayname' => array( '1', 'ENWDYDDCYFOES', 'ENWDYDDCYFREDOL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'FLWYDDYNCYFOES', 'BLWYDDYNGYFREDOL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AMSERCYFOES', 'AMSERCYFREDOL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'AWRGYFREDOL', 'CURRENTHOUR' ),
+ 'numberofarticles' => array( '1', 'NIFEROERTHYGLAU', 'NIFERYRERTHYGLAU', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NIFERYFFEILIAU', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NIFERYDEFNYDDWYR', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'NIFERYGOLYGIADAU', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'ENWTUDALEN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ENWTUDALENE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'PARTH', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NAMESPACE', 'PARTHE', 'NAMESPACEE' ),
+ 'fullpagename' => array( '1', 'ENWLLAWNTUDALEN', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ENWLLAWNTUDALENE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ENWISDUDALEN', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ENWISDUDALENE', 'SUBPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ENWTUDALENSGWRS', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ENWTUDALENSGWRSE', 'TALKPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'ewin bawd', 'bawd', 'mân-lun', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'mân-lun=$1', 'bawd=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'de', 'right' ),
+ 'img_left' => array( '1', 'chwith', 'left' ),
+ 'img_none' => array( '1', 'dim', 'none' ),
+ 'img_center' => array( '1', 'canol', 'center', 'centre' ),
+ 'img_page' => array( '1', 'tudalen=$1', 'tudalen $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'unionsyth', 'unionsyth=$1', 'unionsyth $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_sub' => array( '1', 'is', 'sub' ),
+ 'img_super' => array( '1', 'uwch', 'super', 'sup' ),
+ 'img_top' => array( '1', 'brig', 'top' ),
+ 'img_bottom' => array( '1', 'gwaelod', 'godre', 'bottom' ),
+ 'server' => array( '0', 'GWEINYDD', 'SERVER' ),
+ 'servername' => array( '0', 'ENW\'RGWEINYDD', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'GRAMMAR', 'GRAMADEG', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'WYTHNOSGYFREDOL', 'CURRENTWEEK' ),
+ 'revisionid' => array( '1', 'IDYGOLYGIAD', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DIWRNODYGOLYGIAD', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DIWRNODYGOLYGIAD2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MISYGOLYGIAD', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'BLWYDDYNYGOLYGIAD', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'STAMPAMSERYGOLYGIAD', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'LLUOSOG:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLLLAWN:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLLLAWNE:', 'FULLURLE:' ),
+ 'newsectionlink' => array( '1', '_NEWSECTIONLINK_', '_CYSWLLTADRANNEWYDD_', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'GOLYGIADCYFREDOL', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'STAMPAMSERCYFREDOL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'STAMPAMSERLLEOL', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#IAITH:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'IAITHYCYNNWYS', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'TUDALENNAUYNYPARTH:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NIFERYGWEINYDDWYR', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FFORMATIORHIF', 'FORMATNUM' ),
+ 'special' => array( '0', 'arbennig', 'special' ),
+ 'hiddencat' => array( '1', '_HIDDENCAT_', '_CATCUDD_', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'TUDALENNAUYNYCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'MAINTTUD', 'PAGESIZE' ),
);
$linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
@@ -473,21 +473,23 @@ A fyddech gystal â gwneud adroddiad ar hwn at [[Special:ListUsers/sysop|weinydd
'badarticleerror' => "Mae'n amhosib cyflawni'r weithred hon ar y dudalen hon.",
'cannotdelete' => "Mae'n amhosib dileu'r dudalen neu'r ddelwedd \"\$1\".
Efallai fod rhywun arall eisoes wedi'i dileu.",
+'cannotdelete-title' => "Ni ellir dileu'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.",
-'perfcachedts' => 'Rhoddwyd y data canlynol ar gadw mewn celc a ddiweddarwyd ddiwethaf am $1.',
+'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.",
+'perfcachedts' => 'Rhoddwyd y data canlynol ar gadw mewn celc a ddiweddarwyd ddiwethaf am $1. Cedwir hyd at {{PLURAL:$4||un canlyniad yn unig|ddau ganlyniad|dri canlyniad|$4 chanlyniad|$4 canlyniad}} yn y celc.',
'querypage-no-updates' => "Ar hyn o bryd, nid yw'r meddalwedd wedi ei osod i ddiweddaru data'r dudalen hon.",
'wrong_wfQuery_params' => 'Paramedrau anghywir i wfQuery()<br />
Ffwythiant: $1<br />
Gofyniad: $2',
'viewsource' => 'Dangos côd y dudalen',
-'viewsourcefor' => 'ar gyfer $1',
+'viewsource-title' => 'Gweld cod y dudalen $1',
'actionthrottled' => 'Tagwyd y weithred',
'actionthrottledtext' => "Mae camau gwrth-sbam y wici yn cyfyngu ar ba mor aml y gall defnyddwyr ailwneud y weithred hon mewn byr amser, ac rydych chi wedi croesi'r terfyn.
Ceisiwch eto ymhen rhai munudau.",
'protectedpagetext' => "Mae'r dudalen hon wedi'i diogelu rhag cael ei golygu.",
'viewsourcetext' => 'Cewch weld a chopïo côd y dudalen:',
+'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.',
'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 gan eraill. Os am gyfieithu'r neges, ystyriwch ddefnyddio [//translatewiki.net/wiki/Main_Page?setlang=cy translatewiki.net], sef y prosiect MediaWiki sy'n hyrwyddo creu wicïau amlieithog.",
'sqlhidden' => '(cuddiwyd chwiliad SQL)',
@@ -581,6 +583,7 @@ Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfri
'noemailprefs' => "Mae'n rhaid i chi gynnig cyfeiriad e-bost er mwyn i'r nodweddion hyn weithio.",
'emailconfirmlink' => 'Cadarnhewch eich cyfeiriad e-bost',
'invalidemailaddress' => 'Ni allwn dderbyn y cyfeiriad e-bost gan fod ganddo fformat annilys. Mewnbynnwch cyfeiriad dilys neu gwagiwch y maes hwnnw, os gwelwch yn dda.',
+'cannotchangeemail' => 'Ni ellir newid cyfeiriadau e-bost i gyfrifon ar y wici hwn.',
'accountcreated' => 'Crëwyd y cyfrif',
'accountcreatedtext' => 'Crëwyd cyfrif defnyddiwr ar gyfer $1.',
'createaccount-title' => 'Creu cyfrif ar {{SITENAME}}',
@@ -596,6 +599,7 @@ Oedwch ychydig cyn mentro eto.',
# E-mail sending
'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
+'user-mail-no-addy' => 'Wedi ceisio anfon e-bost heb gyfeiriad e-bost',
# Change password dialog
'resetpass' => 'Newid cyfrinair y cyfrif',
@@ -616,30 +620,45 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
'resetpass-temp-password' => 'Cyfrinair dros dro:',
# Special:PasswordReset
-'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => "Cwblhewch y ffurflen hon er mwyn derbyn e-bost i'ch atgoffa o fanylion eich cyfrif.",
-'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-username' => 'Eich enw defnyddiwr:',
-'passwordreset-domain' => 'Parth:',
-'passwordreset-email' => 'Eich cyfeiriad e-bost:',
-'passwordreset-emailtitle' => 'Manylion eich cyfrif ar {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am nodyn atgoffa o fanylion eich cyfrif ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+'passwordreset' => 'Ailosod cyfrinair',
+'passwordreset-text' => "Cwblhewch y ffurflen hon er mwyn derbyn e-bost i'ch atgoffa o fanylion eich cyfrif.",
+'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-username' => 'Eich enw defnyddiwr:',
+'passwordreset-domain' => 'Parth:',
+'passwordreset-capture' => 'Gweld yr e-bost a gaiff ei anfon?',
+'passwordreset-capture-help' => "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
+'passwordreset-email' => 'Eich cyfeiriad e-bost:',
+'passwordreset-emailtitle' => 'Manylion eich cyfrif ar {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am nodyn atgoffa o fanylion eich cyfrif ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
$2
Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
-'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ei atgoffa o fanylion eich cyfrif ar {{SITENAME}}
+'passwordreset-emailtext-user' => "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ei atgoffa o fanylion eich cyfrif ar {{SITENAME}}
($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
$2
Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau|cyfrineiriau|cyfrineiriau|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}.
Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
-'passwordreset-emailelement' => "Enw'r defnyddiwr: $1
+'passwordreset-emailelement' => "Enw'r defnyddiwr: $1
Y cyfrinair dros dro: $2",
-'passwordreset-emailsent' => 'Anfonwyd nodyn atgoffa drwy e-bost.',
+'passwordreset-emailsent' => 'Anfonwyd nodyn atgoffa drwy e-bost.',
+'passwordreset-emailsent-capture' => 'Anfonwyd e-bost atgoffa, a ddangosir isod.',
+'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Newid y cyfeiriad e-bost',
+'changeemail-header' => 'Newid cyfeiriad e-bost y cyfrif',
+'changeemail-text' => 'Cwblhewch y ffurflen hon i newid eich cyfeiriad e-bost. Bydd angen i chi roi eich cyfrinair i gadarnhau hyn o newid.',
+'changeemail-no-info' => 'Ni allwch fynd at y dudalen hon heblaw eich bod wedi mewngofnodi.',
+'changeemail-oldemail' => 'Y cyfeiriad e-bost presennol:',
+'changeemail-newemail' => 'Cyfeiriad e-bost newydd:',
+'changeemail-none' => '(dim)',
+'changeemail-submit' => 'Newidier y cyfeiriad e-bost',
+'changeemail-cancel' => 'Dileer',
# Edit page toolbar
'bold_sample' => 'Testun cryf',
@@ -708,9 +727,6 @@ Sylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Prefe
Eich cyfeiriad IP presennol yw $3. Cyfeirnod y bloc yw $5. Nodwch y manylion hyn wrth drafod y bloc.",
'blockednoreason' => 'dim rheswm wedi ei roi',
-'blockedoriginalsource' => "Dangosir côd '''$1''' isod:",
-'blockededitsource' => "Dangosir testun '''eich golygiadau''' ar '''$1''' isod:",
-'whitelistedittitle' => 'Rhaid mewngofnodi cyn golygu',
'whitelistedittext' => 'Rhaid $1 i olygu tudalennau.',
'confirmedittext' => "Mae'n rhaid i chi gadarnhau eich cyfeiriad e-bost cyn y gallwch ddechrau golygu tudalennau.
Gosodwch eich cyfeiriad e-bost drwy eich [[Special:Preferences|dewisiadau defnyddiwr]] ac yna'i gadarnhau, os gwelwch yn dda.",
@@ -792,7 +808,7 @@ Rydych chi'n cadarnhau mai chi yw awdur y cyfraniad, neu eich bod chi wedi'i gop
Os nad ydych chi'n fodlon i'ch gwaith gael ei olygu heb drugaredd, neu i gopïau ymddangos ar draws y we, peidiwch a'i gyfrannu yma.<br />
Rydych chi'n cadarnhau mai chi yw awdur y cyfraniad, neu eich bod chi wedi'i gopïo o'r parth cyhoeddus (''public domain'') neu rywle rhydd tebyg.<br />
'''PEIDIWCH Â CHYFRANNU GWAITH O DAN HAWLFRAINT HEB GANIATÂD!'''",
-'longpageerror' => "'''GWALL: Mae'r testun yr ydych wedi ei osod yma yn $1 cilobeit o hyd, ac yn hwy na'r hyd eithaf o $2 cilobeit.
+'longpageerror' => "'''GWALL: Mae'r testun yr ydych wedi ei osod yma yn {{PLURAL:$1|$1 cilobeit}} o hyd, ac yn hwy na'r hyd eithaf o {{PLURAL:$2|$2}} cilobeit.
Ni ellir ei roi ar gadw.'''",
'readonlywarning' => "'''RHYBUDD: Mae'r databas wedi'i gloi am gyfnod er mwyn cynnal a chadw, felly fyddwch chi ddim yn gallu cadw'ch golygiadau ar hyn o bryd. Rydyn ni'n argymell eich bod chi'n copïo a gludo'r testun i ffeil a'i gadw ar eich disg tan bod y sustem yn weithredol eto.'''
@@ -958,8 +974,6 @@ Fe fydd gweinyddwyr eraill {{SITENAME}} o hyd yn gallu gweld yr hyn a guddiwyd.
'revdelete-unsuppress' => "Tynnu'r cyfyngiadau ar y golygiadau a adferwyd",
'revdelete-log' => 'Rheswm:',
'revdelete-submit' => 'Rhoi ar waith ar y {{PLURAL:$1|golygiad|golygiad|golygiadau|golygiadau|golygiadau|golygiadau}} dewisedig',
-'revdelete-logentry' => 'wedi newid y gallu i weld golygiadau ar [[$1]]',
-'logdelete-logentry' => 'wedi newid y gallu i weld y digwyddiad ar [[$1]]',
'revdelete-success' => "'''Diweddarwyd y gallu i weld golygiadau.'''",
'revdelete-failure' => "'''Ni ellid newid y cyfyngiadau ar y gallu i weld y golygiad:'''
$1",
@@ -971,15 +985,6 @@ $1",
'revdel-restore-visible' => 'diwygiadau gweladwy',
'pagehist' => 'Hanes y dudalen',
'deletedhist' => 'Hanes dilëedig',
-'revdelete-content' => 'cynnwys',
-'revdelete-summary' => 'crynodeb golygu',
-'revdelete-uname' => 'yr enw defnyddiwr ar gyfer',
-'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
-'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
-'revdelete-hid' => 'cuddiwyd $1',
-'revdelete-unhid' => 'datguddiwyd $1',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|golygiad|golygiad|olygiad|golygiad|golygiad|golygiad|}}',
-'logdelete-log-message' => '$1 $2 {{PLURAL:$2||digywddiad|ddigwyddiad|digwyddiad|digwyddiad|digwyddiad}}',
'revdelete-hide-current' => "Cafwyd gwall wrth geisio cuddio'r eitem a'r dyddiad $2, $1 arno: hwn yw'r diwygiad presennol.
Ni ellir ei guddio.",
'revdelete-show-no-access' => 'Cafwyd gwall wrth geisio newid yr eitem gyda\'r dyddiad $2, $1: mae marc "cyfyngedig" arno.
@@ -1136,12 +1141,14 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
'prefs-rc' => 'Newidiadau diweddar',
'prefs-watchlist' => 'Rhestr wylio',
'prefs-watchlist-days' => "Nifer y diwrnodau i'w dangos yn y rhestr wylio:",
-'prefs-watchlist-days-max' => 'Hyd at 7 diwrnod',
+'prefs-watchlist-days-max' => 'Hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}}',
'prefs-watchlist-edits' => "Nifer y golygiadau i'w dangos wrth ehangu'r rhestr wylio:",
'prefs-watchlist-edits-max' => 'Hyd at uchafswm o 1000',
'prefs-watchlist-token' => 'Tocyn y rhestr wylio:',
'prefs-misc' => 'Amrywiol',
'prefs-resetpass' => 'Newid y cyfrinair',
+'prefs-changeemail' => 'Newid y cyfeiriad e-bost',
+'prefs-setemail' => 'Gosod cyfeiriad e-bost',
'prefs-email' => 'E-bostio',
'prefs-rendering' => 'Ymddangosiad',
'saveprefs' => "Cadw'r dewisiadau",
@@ -1201,6 +1208,7 @@ Ni allwch ddadwneud y weithred hon.",
'yourrealname' => 'Eich enw cywir*',
'yourlanguage' => 'Iaith y rhyngwyneb',
'yourvariant' => 'Tafodiaith neu orgraff y cynnwys:',
+'prefs-help-variant' => 'Dewis amrywiad iaith neu orgraff yr hoffech ei weld wrth ddarllen cynnwys y wici hwn.',
'yournick' => 'Eich llysenw (fel llofnod):',
'prefs-help-signature' => 'Dylid arwyddo sylwadau ar dudalennau sgwrs gyda "<nowiki>~~~~</nowiki>". Fe ymddengys hwn fel eich enw ac amser y sylw.',
'badsig' => 'Llofnod crai annilys; gwiriwch y tagiau HTML.',
@@ -1241,7 +1249,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'userrights-lookup-user' => 'Rheoli grwpiau defnyddiwr',
'userrights-user-editname' => 'Rhowch enw defnyddiwr:',
'editusergroup' => 'Golygu Grwpiau Defnyddwyr',
-'editinguser' => "Newid galluoedd y defnyddiwr '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Newid galluoedd y defnyddiwr '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Golygu grwpiau defnyddwyr',
'saveusergroups' => "Cadw'r Grwpiau Defnyddwyr",
'userrights-groupsmember' => 'Yn aelod o:',
@@ -1335,13 +1343,13 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'right-autopatrol' => 'Gallu derbyn marc ymweliad patrôl yn awtomatig ar eich golygiadau eich hunan',
'right-patrolmarks' => 'Gweld marciau patrôl ar newidiadau diweddar',
'right-unwatchedpages' => 'Gweld rhestr y tudalennau heb neb yn eu gwylio',
-'right-trackback' => "Gallu cael y wici i dderbyn 'trackback'",
'right-mergehistory' => 'Cyfuno hanes y tudalennau',
'right-userrights' => 'Golygu holl alluoedd defnyddwyr',
'right-userrights-interwiki' => "Newid galluoedd defnyddwyr sy'n perthyn i ddefnyddwyr ar wicïau eraill",
'right-siteadmin' => "Cloi a datgloi'r databas",
'right-override-export-depth' => 'Allforio tudalennau gan gynnwys tudalennau cysylltiedig hyd at ddyfnder o 5',
'right-sendemail' => 'Anfon e-bost at ddefnyddwyr eraill',
+'right-passwordreset' => "Gweld e-byst sy'n ailosod cyfrinair",
# User rights log
'rightslog' => 'Lòg galluoedd defnyddiwr',
@@ -1375,16 +1383,17 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'action-suppressionlog' => 'gweld y lòg preifat hwn',
'action-block' => 'atal y defnyddiwr hwn rhag golygu',
'action-protect' => 'newid lefelau gwarchod y dudalen hon',
+'action-rollback' => 'gwrthdroi golygiadau defnyddiwr diwethaf rhyw dudalen, yn sydyn',
'action-import' => "mewnforio'r dudalen hon o wici arall",
'action-importupload' => "mewnforio'r dudalen hon drwy uwchlwytho ffeil XML",
'action-patrol' => 'marcio bod golygiad defnyddiwr arall wedi derbyn ymweliad patrôl',
'action-autopatrol' => 'cael derbyn marc ymweliad patrôl ar eich golygiad',
'action-unwatchedpages' => 'gweld rhestr y tudalennau heb neb yn eu gwylio',
-'action-trackback' => "cael y wici i dderbyn 'trackback'",
'action-mergehistory' => 'cyfuno hanes y dudalen hon',
'action-userrights' => 'golygu holl alluoedd y defnyddwyr',
'action-userrights-interwiki' => 'golygu galluoedd y defnyddwyr ar wicïau eraill',
'action-siteadmin' => "cloi neu ddatgloi'r databas",
+'action-sendemail' => 'anfon e-bost',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|newid|newid|newid|newid|newid|o newidiadau}}',
@@ -1416,6 +1425,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|defnyddwyr|defnyddiwr|ddefnyddiwr|defnyddiwr|defnyddiwr|o ddefnyddwyr}} yn gwylio]',
'rc_categories' => 'Cyfyngu i gategorïau (gwahanwch gyda "|")',
'rc_categories_any' => 'Unrhyw un',
+'rc-change-size-new' => "$1 {{PLURAL:$1|beit}} wedi'r newid",
'newsectionsummary' => '/* $1 */ adran newydd',
'rc-enhanced-expand' => 'Dangos y manylion (angen JavaScript)',
'rc-enhanced-hide' => "Cuddio'r manylion",
@@ -1468,6 +1478,7 @@ Gweler [[Special:NewFiles|oriel y ffeiliau newydd]] i fwrw golwg drostynt.",
'ignorewarnings' => 'Anwybydder pob rhybudd',
'minlength1' => 'Rhaid i enwau ffeiliau gynnwys un llythyren neu ragor.',
'illegalfilename' => 'Mae\'r enw ffeil "$1" yn cynnwys nodau sydd wedi\'u gwahardd mewn teitlau tudalennau. Ail-enwch y ffeil ac uwchlwythwch hi eto os gwelwch yn dda.',
+'filename-toolong' => 'Ni ddylai enw ffeil fod yn hwy na 240 beit.',
'badfilename' => 'Newidiwyd enw\'r ffeil i "$1".',
'filetype-mime-mismatch' => 'Nid yw\'r estyniad ".$1" ar y ffeil yn cysefeillio â\'i math MIME ($2).',
'filetype-badmime' => "Ni chaniateir uwchlwytho ffeiliau o'r math MIME '$1'.",
@@ -1563,6 +1574,33 @@ Os yw'r broblem yn parhau, cysylltwch â [[Special:ListUsers/sysop|gweinyddwr]].
'upload-unknown-size' => 'Maint anhysbys',
'upload-http-error' => 'Digwyddodd gwall HTTP: $1',
+# File backend
+'backend-fail-stream' => "Wedi methu ffrydio'r ffeil $1.",
+'backend-fail-backup' => "Wedi methu gwneud copi wrth gefn o'r ffeil $1.",
+'backend-fail-notexists' => "Nid yw'r ffeil $1 ar gael.",
+'backend-fail-notsame' => "Mae ffeil gwahanol a'r enw $1 arni eisoes ar gael.",
+'backend-fail-invalidpath' => 'Nid yw $1 yn lwybr dilys i roi ffeil ar gadw.',
+'backend-fail-delete' => "Wedi methu dileu'r ffeil $1.",
+'backend-fail-alreadyexists' => "Mae'r ffeil $1 ar gael yn barod.",
+'backend-fail-store' => "Wedi methu rhoi'r ffeil $1 ar gadw yn $2.",
+'backend-fail-copy' => "Wedi methu copïo'r ffeil $1 i $2.",
+'backend-fail-move' => 'Wedi methu symud y ffeil $1 i $2.',
+'backend-fail-opentemp' => 'Wedi methu agor y ffeil dros dro.',
+'backend-fail-writetemp' => "Wedi methu ysgrifennu i'r ffeil dros dro.",
+'backend-fail-closetemp' => "Wedi methu cau'r ffeil dros dro.",
+'backend-fail-read' => 'Wedi methu darllen y ffeil $1.',
+'backend-fail-create' => "Wedi methu creu'r ffeil $1.",
+
+# Lock manager
+'lockmanager-notlocked' => 'Wedi methu datgloi "$1"; nid yw ar glo.',
+'lockmanager-fail-closelock' => 'Wedi methu cau\'r ffeil cloi mynediad at "$1".',
+'lockmanager-fail-deletelock' => 'Wedi methu dileu\'r ffeil cloi mynediad at "$1".',
+'lockmanager-fail-acquirelock' => 'Wedi methu cael clo ar "$1".',
+'lockmanager-fail-openlock' => 'Wedi methu agor y ffeil cloi mynediad at "$1".',
+'lockmanager-fail-releaselock' => 'Wedi methu agor y clo ar "$1".',
+'lockmanager-fail-db-release' => 'Wedi methu agor y cloion ar y gronfa ddata $1.',
+'lockmanager-fail-svr-release' => 'Wedi methu agor y cloion ar y gweinydd $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Cafwyd gwall wrth agor y ffeil er mwyn gwneud gwiriadau ZIP.',
'zip-wrong-format' => "Nid ffeil ZIP yw'r ffeil a enwyd.",
@@ -1579,6 +1617,7 @@ Ni all gael ei wirio'n ddigonol er sicrhau diogelwch.",
'uploadstash-badtoken' => 'Ni lwyddodd y weithred, efallai oherwydd bod eich cymwysterau golygu wedi dod i ben. Ceisiwch eto.',
'uploadstash-errclear' => "Ni lwyddwyd i glirio'r ffeiliau.",
'uploadstash-refresh' => 'Adnewyddu rhestr y ffeiliau',
+'invalid-chunk-offset' => "Atred annilys i'r talpiau",
# img_auth script messages
'img-auth-accessdenied' => 'Ni chaniatawyd mynediad',
@@ -1687,23 +1726,24 @@ Dangosir isod y disgrifiad sydd ar [$2 dudalen ddisgrifio'r ffeil] yno.",
'filerevert-badversion' => "Nid oes fersiwn lleol cynt o'r ffeil hwn gyda'r amsernod a nodwyd.",
# File deletion
-'filedelete' => 'Dileu $1',
-'filedelete-legend' => "Dileu'r ffeil",
-'filedelete-intro' => "Rydych ar fin dileu'r ffeil '''[[Media:$1|$1]]''' ynghyd â'i holl hanes.",
-'filedelete-intro-old' => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
-'filedelete-comment' => 'Rheswm:',
-'filedelete-submit' => 'Dilëir',
-'filedelete-success' => "Mae '''$1''' wedi cael ei dileu.",
-'filedelete-success-old' => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
-'filedelete-nofile' => "Ni chafwyd '''$1'''.",
-'filedelete-nofile-old' => "Nid oes fersiwn o '''$1''' gyda'r priodoleddau a enwir yn yr archif.",
-'filedelete-otherreason' => 'Rheswm arall/ychwanegol:',
-'filedelete-reason-otherlist' => 'Rheswm arall',
-'filedelete-reason-dropdown' => '*Rhesymau cyffredin dros ddileu
+'filedelete' => 'Dileu $1',
+'filedelete-legend' => "Dileu'r ffeil",
+'filedelete-intro' => "Rydych ar fin dileu'r ffeil '''[[Media:$1|$1]]''' ynghyd â'i holl hanes.",
+'filedelete-intro-old' => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
+'filedelete-comment' => 'Rheswm:',
+'filedelete-submit' => 'Dilëir',
+'filedelete-success' => "Mae '''$1''' wedi cael ei dileu.",
+'filedelete-success-old' => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
+'filedelete-nofile' => "Ni chafwyd '''$1'''.",
+'filedelete-nofile-old' => "Nid oes fersiwn o '''$1''' gyda'r priodoleddau a enwir yn yr archif.",
+'filedelete-otherreason' => 'Rheswm arall/ychwanegol:',
+'filedelete-reason-otherlist' => 'Rheswm arall',
+'filedelete-reason-dropdown' => '*Rhesymau cyffredin dros ddileu
** Yn torri hawlfraint
** Dwy ffeil yn union debyg',
-'filedelete-edit-reasonlist' => 'Golygu rhestr y rhesymau dros ddileu',
-'filedelete-maintenance' => "Mae'r gallu i ddileu ffeiliau a'u hadfer wedi ei anallogi tra bod gwaith cynnal wrthi.",
+'filedelete-edit-reasonlist' => 'Golygu rhestr y rhesymau dros ddileu',
+'filedelete-maintenance' => "Mae'r gallu i ddileu ffeiliau a'u hadfer wedi ei anallogi tra bod gwaith cynnal wrthi.",
+'filedelete-maintenance-title' => "Ni ellir dileu'r ffeil",
# MIME search
'mimesearch' => 'Chwiliad MIME',
@@ -1808,6 +1848,7 @@ Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
'mostimages' => 'Ffeiliau yn nhrefn nifer y cysylltiadau iddynt',
'mostrevisions' => 'Tudalennau yn nhrefn nifer y newidiadau iddynt',
'prefixindex' => 'Pob tudalen yn ôl parth',
+'prefixindex-namespace' => 'Pob tudalen â rhagddodiad penodol (y parth $1)',
'shortpages' => 'Erthyglau byr',
'longpages' => 'Tudalennau hirion',
'deadendpages' => 'Tudalennau heb gysylltiadau ynddynt',
@@ -1918,12 +1959,8 @@ Protocoliau sy\'n cael eu cynnal: <tt>$1</tt> (peidiwch ag ychwanegu\'r rhain wr
'activeusers-noresult' => "Dim defnyddwyr i'w cael.",
# Special:Log/newusers
-'newuserlogpage' => 'Lòg creu cyfrifon defnyddwyr newydd',
-'newuserlogpagetext' => "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
-'newuserlog-byemail' => 'anfonwyd y cyfrinair trwy e-bost',
-'newuserlog-create-entry' => 'Defnyddiwr newydd',
-'newuserlog-create2-entry' => 'wedi creu cyfrif newydd ar gyfer $1',
-'newuserlog-autocreate-entry' => "Cyfrif wedi ei greu'n awtomatig",
+'newuserlogpage' => 'Lòg creu cyfrifon defnyddwyr newydd',
+'newuserlogpagetext' => "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
# Special:ListGroupRights
'listgrouprights' => 'Galluoedd grwpiau defnyddwyr',
@@ -1953,7 +1990,7 @@ er mwyn medru anfon e-bost at ddefnyddwyr eraill.',
'emailpagetext' => "Os yw'r cyfeiriad e-bost sydd yn newisiadau'r defnyddiwr hwn yn un dilys, gellir anfon neges ato o'i ysgrifennu ar y ffurflen isod.
Bydd y cyfeiriad e-bost a osodoch yn eich [[Special:Preferences|dewisiadau chithau]] yn ymddangos ym maes \"Oddi wrth\" yr e-bost, fel bod y defnyddiwr arall yn gallu anfon ateb atoch.",
'usermailererror' => 'Dychwelwyd gwall gan y rhaglen e-bost:',
-'defemailsubject' => 'E-bost {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} yn anfon e-bost oddi wrth y defnyddiwr "$1"',
'usermaildisabled' => 'Dim modd anfon e-bost at ddefnyddwyr',
'usermaildisabledtext' => 'Ni allwch anfon e-bost at ddefnyddwyr eraill y wici hwn',
'noemailtitle' => 'Dim cyfeiriad e-bost',
@@ -2009,7 +2046,7 @@ Os ydych am ddiddymu'r dudalen o'r rhestr wylio, cliciwch ar \"Stopio gwylio\" y
'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.',
'iteminvalidname' => "Problem gyda'r eitem '$1', enw annilys...",
-'wlnote' => "{{PLURAL:$1|Ni fu unrhyw newid|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf|Isod mae'r '''$1''' newid diweddaraf}} yn ystod {{PLURAL:$2||yr awr|y ddwyawr|y teirawr|y <b>$2</b> awr|y(r) <b>$2</b> awr}} ddiwethaf.",
+'wlnote' => "{{PLURAL:\$1|Ni fu unrhyw newid|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf|Isod mae'r '''\$1''' newid diweddaraf}} yn ystod {{PLURAL:\$2||yr awr|y ddwyawr|y teirawr|y \"\$2\" awr|y(r) \"\$2\" awr}} ddiwethaf, fel ag yr oedd am \$4, \$3.",
'wlshowlast' => "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r $3 newidiadau.",
'watchlist-options' => 'Dewisiadau ar gyfer y rhestr wylio',
@@ -2073,8 +2110,6 @@ Os gwelwch yn dda, cadarnhewch eich bod chi wir yn bwriadu gwneud hyn, eich bod
'actionfailed' => 'Methodd y weithred',
'deletedtext' => 'Mae "$1" wedi\'i ddileu.
Gwelwch y $2 am gofnod o\'r dileuon diweddar.',
-'deletedarticle' => 'wedi dileu "[[$1]]"',
-'suppressedarticle' => 'cuddiwyd "[[$1]]"',
'dellogpage' => 'Lòg dileuon',
'dellogpagetext' => "Ceir rhestr isod o'r dileadau diweddaraf.",
'deletionlog' => 'lòg dileuon',
@@ -2121,7 +2156,10 @@ Mae'r tudalennau sydd wedi eu diogelu ar hyn o bryd wedi eu rhestri ar y [[Speci
'unprotectedarticle' => 'wedi dad-ddiogelu "[[$1]]"',
'movedarticleprotection' => 'wedi symud y gosodiadau gwarchod o "[[$2]]" i "[[$1]]"',
'protect-title' => "Newid y lefel diogelu ar gyfer '$1'",
+'protect-title-notallowed' => "Gweld y lefel diogelu ar gyfer '$1'",
'prot_1movedto2' => 'wedi symud [[$1]] i [[$2]]',
+'protect-badnamespace-title' => 'Parth na ellir ei ddiogelu',
+'protect-badnamespace-text' => 'Ni ellir diogelu tudalennau yn y parth hwn.',
'protect-legend' => "Cadarnháu'r diogelu",
'protectcomment' => 'Rheswm:',
'protectexpiry' => 'Yn dod i ben:',
@@ -2142,6 +2180,7 @@ Dyma'r gosodiadau diogelu cyfredol ar gyfer y dudalen '''$1''':",
'protect-level-sysop' => 'Gweinyddwyr yn unig',
'protect-summary-cascade' => 'sgydol',
'protect-expiring' => 'yn dod i ben am $1 (UTC)',
+'protect-expiring-local' => 'yn dod i ben am $1',
'protect-expiry-indefinite' => 'amhenodol',
'protect-cascade' => 'Diogelwch dudalennau sydd wedi eu cynnwys yn y dudalen hon (diogelu sgydol)',
'protect-cantedit' => "Ni allwch newid lefel diogelu'r dudalen hon, am nad yw'r gallu i olygu'r dudalen ganddoch.",
@@ -2199,7 +2238,6 @@ Mae'n bosibl bod nam ar y cyswllt, neu fod y diwygiad eisoes wedi'i adfer neu we
'undeletereset' => 'Ailosod',
'undeleteinvert' => "Gwrthdroi'r dewis",
'undeletecomment' => 'Rheswm:',
-'undeletedarticle' => 'wedi adfer "[[$1]]"',
'undeletedrevisions' => 'wedi adfer $1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}',
'undeletedrevisions-files' => 'Adferwyd $1 {{PLURAL:$1|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn}} a $2 {{PLURAL:$2|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}',
'undeletedfiles' => 'Adferwyd $1 {{PLURAL:$1|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}',
@@ -2209,6 +2247,7 @@ efallai bod rhywun arall wedi dad-ddileu'r dudalen yn barod.",
Ceir cofnod o'r tudalennau a ddilëwyd neu a adferwyd yn ddiweddar ar y [[Special:Log/delete|lòg ddileuon]].",
'undelete-header' => "Ewch i'r [[Special:Log/delete|lòg ddileuon]] i weld tudalennau a ddilëwyd yn ddiweddar.",
+'undelete-search-title' => "Chwilio drwy'r tudalennau dilëedig",
'undelete-search-box' => 'Chwilio tudalennau a ddilëwyd',
'undelete-search-prefix' => 'Dangos tudalennau gan ddechrau gyda:',
'undelete-search-submit' => 'Chwilio',
@@ -2218,6 +2257,7 @@ Ceir cofnod o'r tudalennau a ddilëwyd neu a adferwyd yn ddiweddar ar y [[Specia
'undelete-cleanup-error' => 'Bu gwall wrth ddileu\'r ffeil archif na ddefnyddiwyd "$1".',
'undelete-missing-filearchive' => "Nid oes modd adfer archif y ffeil â'r ID $1 oherwydd nad ydyw yn y gronfa ddata.
Efallai ei bod eisoes wedi'i hadfer.",
+'undelete-error' => 'Gwall wrth adfer tudalen',
'undelete-error-short' => 'Gwall wrth adfer y ffeil: $1',
'undelete-error-long' => 'Cafwyd gwallau wrth adfer y ffeil:
@@ -2339,6 +2379,7 @@ Gwelwch y [[Special:BlockList|rhestr flociau IP]] er mwyn arolygu blociau.',
'blocklist-userblocks' => 'Cuddio rhwystrau cyfrifon',
'blocklist-tempblocks' => 'Cuddio rhwystrau dros dro',
'blocklist-addressblocks' => 'Cuddio rhwystrau IP unigol',
+'blocklist-rangeblocks' => 'Cuddio blociau amrediad',
'blocklist-timestamp' => 'Stamp amser',
'blocklist-target' => 'Targed',
'blocklist-expiry' => 'Yn dod i ben:',
@@ -2361,6 +2402,7 @@ Gwelwch y [[Special:BlockList|rhestr flociau IP]] er mwyn arolygu blociau.',
'unblocklink' => 'dadrwystro',
'change-blocklink' => 'newid y rhwystr',
'contribslink' => 'cyfraniadau',
+'emaillink' => 'anfon e-bost',
'autoblocker' => 'Rydych wedi cael eich rhwystro\'n awtomatig oherwydd bod eich cyfeiriad IP wedi cael ei ddefnyddio gan "[[User:$1|$1]]" yn ddiweddar.
Dyma\'r rheswm a roddwyd dros rwystro $1: "$2".',
'blocklogpage' => 'Lòg rhwystrau',
@@ -2484,9 +2526,6 @@ Dewiswch enw arall os gwelwch yn dda.",
'movepage-page-moved' => 'Symudwyd y dudalen $1 i $2.',
'movepage-page-unmoved' => 'Ni ellid symud y dudalen $1 i $2.',
'movepage-max-pages' => 'Symudwyd yr uchafswm o $1 {{PLURAL:$1|tudalen|dudalen|dudalen|tudalen|thudalen|tudalen}} y gellir eu symud yn awtomatig.',
-'1movedto2' => 'wedi symud [[$1]] i [[$2]]',
-'1movedto2_redir' => 'Wedi symud [[$1]] i [[$2]] trwy ailgyfeiriad.',
-'move-redirect-suppressed' => 'ataliwyd ailgyfeirio',
'movelogpage' => 'Lòg symud tudalennau',
'movelogpagetext' => "Isod mae rhestr y tudalennau sydd wedi'u symud",
'movesubpage' => '{{PLURAL:$1|Isdudalen|Isdudalen|Isdudalennau|Isdudalennau|Isdudalennau|Isdudalennau}}',
@@ -2499,7 +2538,7 @@ Dewiswch enw arall os gwelwch yn dda.",
Mae'r erthygl \"[[:\$1]]\" yn bodoli'n barod. Ydych chi am ddileu'r erthygl er mwyn cwblhau'r symudiad?",
'delete_and_move_confirm' => "Ie, dileu'r dudalen",
-'delete_and_move_reason' => "Wedi'i dileu er mwyn symud tudalen arall yn ei lle.",
+'delete_and_move_reason' => 'Wedi\'i dileu er mwyn gallu symud y dudalen "[[$1]]" i gymryd ei lle',
'selfmove' => "Mae'r teitlau hen a newydd yn union yr un peth;
nid yw'n bosib cyflawnu'r symud.",
'immobile-source-namespace' => 'Ni ellir symud tudalennau yn y parth "$1".',
@@ -2529,9 +2568,11 @@ Dewiswch enw arall os gwelwch yn dda.",
I allforio tudalennau, teipiwch y teitlau yn y bocs testun isod, bobi linell i'r teitlau; a dewis p'un ai ydych chi eisiau'r diwygiad presennol a'r holl fersiynnau blaenorol, gyda hanes y dudalen; ynteu a ydych am y diwygiad presennol a'r wybodaeth am y golygiad diweddaraf yn unig.
Yn achos yr ail ddewis, mae modd defnyddio cyswllt, e.e. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ar gyfer y dudalen \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => "Allforio'r holl dudalennau",
'exportcuronly' => 'Cynnwys y diwygiad diweddaraf yn unig, nid yr hanes llawn',
'exportnohistory' => "----
'''Sylwer:''' er mwyn peidio â gor-lwytho'r gweinydd, analluogwyd allforio hanes llawn y tudalennau.",
+'exportlistauthors' => "Cynnwys rhestr gyflawn o'r cyfranwyr i bob tudalen",
'export-submit' => 'Allforier',
'export-addcattext' => "Ychwanegu tudalennau i'w hallforio o'r categori:",
'export-addcat' => 'Ychwaneger',
@@ -2564,6 +2605,8 @@ Os ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki
'thumbnail_error' => "Cafwyd gwall wrth greu'r mân-lun: $1",
'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',
+'thumbnail-dest-create' => "Wedi methu rhoi'r mân-lun ar gadw yn y man y gofynwyd iddo fod",
'thumbnail_invalid_params' => 'Paramedrau maint mân-lun annilys',
'thumbnail_dest_directory' => "Methwyd â chreu'r cyfeiriadur cyrchfan",
'thumbnail_image-type' => "Nid yw'r math hwn o ddelwedd yn cael ei gynnal",
@@ -2610,6 +2653,10 @@ Mae ffolder dros dro yn eisiau.',
'import-upload' => 'Uwchlwytho data XML',
'import-token-mismatch' => "Collwyd data'r sesiwn. Ceisiwch eto.",
'import-invalid-interwiki' => "Ni ellir uwchlwytho o'r wici dewisedig.",
+'import-error-edit' => 'Ni fewnforiwyd y dudalen "$1" oherwydd nad yw\'r gallu i\'w golygu gennych.',
+'import-error-create' => 'Ni fewnforiwyd y dudalen "$1" oherwydd nad yw\'r gallu i\'w chreu gennych.',
+'import-error-interwiki' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni wedi ei neilltuo at ddiben cysylltu\'n allanol (rhyngwici).',
+'import-error-invalid' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni yn annilys.',
# Import log
'importlogpage' => 'Lòg mewnforio',
@@ -2619,73 +2666,85 @@ Mae ffolder dros dro yn eisiau.',
'import-logentry-interwiki' => 'wedi symud $1 (traws-wici)',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o $2',
+# JavaScriptTest
+'javascripttest' => 'Profi JavaScript',
+'javascripttest-disabled' => 'Analluogwyd y swyddogaeth hon.',
+'javascripttest-title' => 'Yn cynnal profion $1',
+'javascripttest-pagetext-noframework' => 'Neilltuwyd y dudalen hon at gynnal profion JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Ni nabyddwyd y fframwaith profi "$1".',
+'javascripttest-pagetext-frameworks' => "Dewiswch un o'r fframweithiau profi canlynol: $1",
+'javascripttest-pagetext-skins' => 'Dewiswch wedd i gynnal profion arni:',
+'javascripttest-qunit-heading' => 'Cyfres brofi MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Eich tudalen defnyddiwr',
-'tooltip-pt-anonuserpage' => 'Y tudalen defnyddiwr ar gyfer y cyfeiriad IP yr ydych yn ei ddefnyddio wrth olygu',
-'tooltip-pt-mytalk' => 'Eich tudalen sgwrs',
-'tooltip-pt-anontalk' => "Sgwrs ynglŷn â golygiadau o'r cyfeiriad IP hwn",
-'tooltip-pt-preferences' => 'Eich dewisiadau',
-'tooltip-pt-watchlist' => 'Rydych yn dilyn hynt y tudalennau sydd ar y rhestr hon',
-'tooltip-pt-mycontris' => 'Rhestr eich cyfraniadau yn nhrefn amser',
-'tooltip-pt-login' => "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
-'tooltip-pt-anonlogin' => "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
-'tooltip-pt-logout' => 'Allgofnodi',
-'tooltip-ca-talk' => 'Sgwrsio am y dudalen',
-'tooltip-ca-edit' => "Gallwch olygu'r dudalen hon. Da o beth fyddai defnyddio'r botwm 'Dangos rhagolwg' cyn rhoi ar gadw.",
-'tooltip-ca-addsection' => 'Ychwanegu adran newydd',
-'tooltip-ca-viewsource' => "Mae'r dudalen hon wedi'i diogelu. Gallwch weld y côd yma.",
-'tooltip-ca-history' => "Fersiynau cynt o'r dudalen hon.",
-'tooltip-ca-protect' => "Diogelu'r dudalen hon",
-'tooltip-ca-unprotect' => 'Newid gosodiadau diogelwch y dudalen hon',
-'tooltip-ca-delete' => "Dileu'r dudalen hon",
-'tooltip-ca-undelete' => "Adfer y golygiadau i'r dudalen hon a wnaethpwyd cyn ei dileu",
-'tooltip-ca-move' => 'Symud y dudalen hon',
-'tooltip-ca-watch' => "Ychwanegu'r dudalen hon at eich rhestr wylio",
-'tooltip-ca-unwatch' => "Tynnu'r dudalen oddi ar eich rhestr wylio",
-'tooltip-search' => 'Chwilio {{SITENAME}}',
-'tooltip-search-go' => "Mynd i'r dudalen â'r union deitl hwn, os oes un",
-'tooltip-search-fulltext' => 'Chwilio am y testun hwn',
-'tooltip-p-logo' => 'Yr Hafan',
-'tooltip-n-mainpage' => "Ymweld â'r Hafan",
-'tooltip-n-mainpage-description' => 'At yr Hafan',
-'tooltip-n-portal' => "Pethau i'w gwneud, adnoddau a thudalennau'r gymuned",
-'tooltip-n-currentevents' => 'Gwybodaeth yn gysylltiedig â materion cyfoes',
-'tooltip-n-recentchanges' => 'Rhestr y newidiadau diweddar ar y wici.',
-'tooltip-n-randompage' => 'Dewiswch dudalen ar hap',
-'tooltip-n-help' => 'Tudalennau cymorth',
-'tooltip-t-whatlinkshere' => "Rhestr o bob tudalen sy'n cysylltu â hon",
-'tooltip-t-recentchangeslinked' => 'Newidiadau diweddar i dudalennau sydd yn cysylltu â hon',
-'tooltip-feed-rss' => 'Porthiant RSS ar gyfer y dudalen hon',
-'tooltip-feed-atom' => 'Porthiant atom ar gyfer y dudalen hon',
-'tooltip-t-contributions' => "Gwelwch restr o gyfraniadau'r defnyddiwr hwn",
-'tooltip-t-emailuser' => 'Anfonwch e-bost at y defnyddiwr hwn',
-'tooltip-t-upload' => 'Uwchlwythwch ffeil delwedd, sain, fideo, ayb',
-'tooltip-t-specialpages' => "Rhestr o'r holl dudalennau arbennig",
-'tooltip-t-print' => "Cynhyrchwch fersiwn o'r dudalen yn barod at ei hargraffu",
-'tooltip-t-permalink' => "Ail-lwytho'r dudalen fel bod modd gweld y cyfeiriad URL llawn a chreu cyswllt parhaol i'r fersiwn hwn o'r dudalen",
-'tooltip-ca-nstab-main' => 'Gweld y dudalen bwnc',
-'tooltip-ca-nstab-user' => 'Gweld tudalen y defnyddiwr',
-'tooltip-ca-nstab-media' => 'Gweld y dudalen gyfrwng',
-'tooltip-ca-nstab-special' => "Mae hwn yn dudalen arbennig; ni allwch olygu'r dudalen ei hun",
-'tooltip-ca-nstab-project' => 'Gweld tudalen y wici',
-'tooltip-ca-nstab-image' => 'Gweld tudalen y ffeil',
-'tooltip-ca-nstab-mediawiki' => 'Gweld neges y system',
-'tooltip-ca-nstab-template' => 'Dangos y nodyn',
-'tooltip-ca-nstab-help' => 'Gweld y dudalen gymorth',
-'tooltip-ca-nstab-category' => 'Dangos tudalen y categori',
-'tooltip-minoredit' => 'Marciwch hwn yn olygiad bychan.',
-'tooltip-save' => 'Cadwch eich newidiadau',
-'tooltip-preview' => "Dangos rhagolwg o'r newidiadau; defnyddiwch cyn cadw.",
-'tooltip-diff' => "Dangos y newidiadau rydych chi wedi gwneud i'r testun.",
-'tooltip-compareselectedversions' => 'Cymharwch y fersiynau detholedig.',
-'tooltip-watch' => "Ychwanegu'r dudalen hon at eich rhestr wylio",
-'tooltip-recreate' => "Ail-greu'r dudalen serch iddi gael ei dileu",
-'tooltip-upload' => 'Dechrau uwchlwytho',
-'tooltip-rollback' => "Yn troi golygiad(au) y defnyddiwr diwethaf i'r dudalen hon yn ôl gydag un clic.",
-'tooltip-undo' => 'Mae "dadwneud" yn troi\'r golygiad hwn yn ôl ac yn dangos rhagolwg o\'r golygiad adferedig.
+'tooltip-pt-userpage' => 'Eich tudalen defnyddiwr',
+'tooltip-pt-anonuserpage' => 'Y tudalen defnyddiwr ar gyfer y cyfeiriad IP yr ydych yn ei ddefnyddio wrth olygu',
+'tooltip-pt-mytalk' => 'Eich tudalen sgwrs',
+'tooltip-pt-anontalk' => "Sgwrs ynglŷn â golygiadau o'r cyfeiriad IP hwn",
+'tooltip-pt-preferences' => 'Eich dewisiadau',
+'tooltip-pt-watchlist' => 'Rydych yn dilyn hynt y tudalennau sydd ar y rhestr hon',
+'tooltip-pt-mycontris' => 'Rhestr eich cyfraniadau yn nhrefn amser',
+'tooltip-pt-login' => "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
+'tooltip-pt-anonlogin' => "Fe'ch anogir i fewngofnodi, er nad oes rhaid gwneud.",
+'tooltip-pt-logout' => 'Allgofnodi',
+'tooltip-ca-talk' => 'Sgwrsio am y dudalen',
+'tooltip-ca-edit' => "Gallwch olygu'r dudalen hon. Da o beth fyddai defnyddio'r botwm 'Dangos rhagolwg' cyn rhoi ar gadw.",
+'tooltip-ca-addsection' => 'Ychwanegu adran newydd',
+'tooltip-ca-viewsource' => "Mae'r dudalen hon wedi'i diogelu. Gallwch weld y côd yma.",
+'tooltip-ca-history' => "Fersiynau cynt o'r dudalen hon.",
+'tooltip-ca-protect' => "Diogelu'r dudalen hon",
+'tooltip-ca-unprotect' => 'Newid gosodiadau diogelwch y dudalen hon',
+'tooltip-ca-delete' => "Dileu'r dudalen hon",
+'tooltip-ca-undelete' => "Adfer y golygiadau i'r dudalen hon a wnaethpwyd cyn ei dileu",
+'tooltip-ca-move' => 'Symud y dudalen hon',
+'tooltip-ca-watch' => "Ychwanegu'r dudalen hon at eich rhestr wylio",
+'tooltip-ca-unwatch' => "Tynnu'r dudalen oddi ar eich rhestr wylio",
+'tooltip-search' => 'Chwilio {{SITENAME}}',
+'tooltip-search-go' => "Mynd i'r dudalen â'r union deitl hwn, os oes un",
+'tooltip-search-fulltext' => 'Chwilio am y testun hwn',
+'tooltip-p-logo' => 'Yr Hafan',
+'tooltip-n-mainpage' => "Ymweld â'r Hafan",
+'tooltip-n-mainpage-description' => 'At yr Hafan',
+'tooltip-n-portal' => "Pethau i'w gwneud, adnoddau a thudalennau'r gymuned",
+'tooltip-n-currentevents' => 'Gwybodaeth yn gysylltiedig â materion cyfoes',
+'tooltip-n-recentchanges' => 'Rhestr y newidiadau diweddar ar y wici.',
+'tooltip-n-randompage' => 'Dewiswch dudalen ar hap',
+'tooltip-n-help' => 'Tudalennau cymorth',
+'tooltip-t-whatlinkshere' => "Rhestr o bob tudalen sy'n cysylltu â hon",
+'tooltip-t-recentchangeslinked' => 'Newidiadau diweddar i dudalennau sydd yn cysylltu â hon',
+'tooltip-feed-rss' => 'Porthiant RSS ar gyfer y dudalen hon',
+'tooltip-feed-atom' => 'Porthiant atom ar gyfer y dudalen hon',
+'tooltip-t-contributions' => "Gwelwch restr o gyfraniadau'r defnyddiwr hwn",
+'tooltip-t-emailuser' => 'Anfonwch e-bost at y defnyddiwr hwn',
+'tooltip-t-upload' => 'Uwchlwythwch ffeil delwedd, sain, fideo, ayb',
+'tooltip-t-specialpages' => "Rhestr o'r holl dudalennau arbennig",
+'tooltip-t-print' => "Cynhyrchwch fersiwn o'r dudalen yn barod at ei hargraffu",
+'tooltip-t-permalink' => "Ail-lwytho'r dudalen fel bod modd gweld y cyfeiriad URL llawn a chreu cyswllt parhaol i'r fersiwn hwn o'r dudalen",
+'tooltip-ca-nstab-main' => 'Gweld y dudalen bwnc',
+'tooltip-ca-nstab-user' => 'Gweld tudalen y defnyddiwr',
+'tooltip-ca-nstab-media' => 'Gweld y dudalen gyfrwng',
+'tooltip-ca-nstab-special' => "Mae hwn yn dudalen arbennig; ni allwch olygu'r dudalen ei hun",
+'tooltip-ca-nstab-project' => 'Gweld tudalen y wici',
+'tooltip-ca-nstab-image' => 'Gweld tudalen y ffeil',
+'tooltip-ca-nstab-mediawiki' => 'Gweld neges y system',
+'tooltip-ca-nstab-template' => 'Dangos y nodyn',
+'tooltip-ca-nstab-help' => 'Gweld y dudalen gymorth',
+'tooltip-ca-nstab-category' => 'Dangos tudalen y categori',
+'tooltip-minoredit' => 'Marciwch hwn yn olygiad bychan.',
+'tooltip-save' => 'Cadwch eich newidiadau',
+'tooltip-preview' => "Dangos rhagolwg o'r newidiadau; defnyddiwch cyn cadw.",
+'tooltip-diff' => "Dangos y newidiadau rydych chi wedi gwneud i'r testun.",
+'tooltip-compareselectedversions' => 'Cymharwch y fersiynau detholedig.',
+'tooltip-watch' => "Ychwanegu'r dudalen hon at eich rhestr wylio",
+'tooltip-watchlistedit-normal-submit' => "Tynnu'r tudalennau o'r rhestr",
+'tooltip-watchlistedit-raw-submit' => "Diweddaru'r rhestr wylio",
+'tooltip-recreate' => "Ail-greu'r dudalen serch iddi gael ei dileu",
+'tooltip-upload' => 'Dechrau uwchlwytho',
+'tooltip-rollback' => "Yn troi golygiad(au) y defnyddiwr diwethaf i'r dudalen hon yn ôl gydag un clic.",
+'tooltip-undo' => 'Mae "dadwneud" yn troi\'r golygiad hwn yn ôl ac yn dangos rhagolwg o\'r golygiad adferedig.
Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
-'tooltip-preferences-save' => "Rhoi'r dewisiadau ar gadw",
-'tooltip-summary' => 'Rhowch grynodeb byr',
+'tooltip-preferences-save' => "Rhoi'r dewisiadau ar gadw",
+'tooltip-summary' => 'Rhowch grynodeb byr',
# Metadata
'notacceptable' => "Dydy gweinydd y wici ddim yn medru rhoi'r data mewn fformat darllenadwy i'ch cleient.",
@@ -2743,9 +2802,6 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr gwahard
# Patrol log
'patrol-log-page' => 'Lòg patrolio',
'patrol-log-header' => "Mae'r lòg hwn yn dangos y golygiadau sydd wedi derbyn ymweliad patrôl.",
-'patrol-log-line' => 'wedi marcio bod $1 o $2 wedi derbyn ymweliad patrôl $3',
-'patrol-log-auto' => '(awtomatig)',
-'patrol-log-diff' => 'golygiad $1',
'log-show-hide-patrol' => '$1 lòg patrolio',
# Image deletion
@@ -2772,11 +2828,11 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
'file-info' => 'maint y ffeil: $1, ffurf MIME: $2',
'file-info-size' => '$1 × $2 picsel, maint y ffeil: $3, ffurf MIME: $4',
'file-info-size-pages' => '$1 × $2 picsel, maint ffeil: $3, math MIME: $4, $5 {{PLURAL:$5|tudalen|tudalen}}',
-'file-nohires' => '<small>Wedi ei chwyddo hyd yr eithaf.</small>',
+'file-nohires' => 'Wedi ei chwyddo hyd yr eithaf.',
'svg-long-desc' => 'Ffeil SVG, maint mewn enw $1 × $2 picsel, maint y ffeil: $3',
'show-big-image' => 'Maint llawn',
-'show-big-image-preview' => '<small>Maint y rhagolwg: $1.</small>',
-'show-big-image-other' => '<small>Datrysiadau eraill: $1 .</small>',
+'show-big-image-preview' => 'Maint y rhagolwg: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Datrysiad arall|Datrysiad arall|Datrysiadau eraill|Datrysiadau eraill|Datrysiadau eraill|Datrysiadau eraill}}: $1.',
'show-big-image-size' => '$1 × $2 picsel',
'file-info-gif-looped' => 'dolennog',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ffrâm}}',
@@ -2797,9 +2853,14 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
'sp-newimages-showfrom' => "Dangos ffeiliau sy'n newydd ers: $2, $1",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'e',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'a',
+'seconds-abbrev' => '$1e',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1a',
+'seconds' => '{{PLURAL:$1|$1 eiliad}}',
+'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}}',
+'ago' => '$1 yn ôl',
# Bad image list
'bad_image_list' => "Dyma'r fformat:
@@ -3288,13 +3349,6 @@ Bydd y côd cadarnhau yn dod i ben am $4.',
'scarytranscludefailed' => '[Methwyd â nôl y nodyn ar gyfer $1]',
'scarytranscludetoolong' => "[Mae'r URL yn rhy hir]",
-# Trackbacks
-'trackbackbox' => "Cysylltiadau 'Trackback' ar gyfer yr erthygl hon:<br />
-$1",
-'trackbackremove' => '([$1 Dileu])',
-'trackbacklink' => "Cyswllt 'trackback'",
-'trackbackdeleteok' => 'Dilëwyd y cyswllt ôlrhain yn llwyddiannus.',
-
# Delete conflict
'deletedwhileediting' => "'''Rhybudd''': Dilëwyd y dudalen wedi i chi ddechrau ei golygu!",
'confirmrecreate' => "Mae'r defnyddiwr [[User:$1|$1]] ([[User talk:$1|Sgwrs]]) wedi dileu'r dudalen hon ers i chi ddechrau ei golygu. Y rheswm a roddwyd yw:
@@ -3374,6 +3428,9 @@ Gallwch hefyd [[Special:EditWatchlist|ddefnyddio\'r rhestr arferol]].',
'watchlisttools-edit' => "Gweld a golygu'r rhestr wylio",
'watchlisttools-raw' => "Golygu'r rhestr wylio syml",
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|sgwrs]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tag estyniad anhysbys "$1"',
'duplicate-defaultsort' => 'Rhybudd: Mae\'r allwedd trefnu diofyn "$2" yn gwrthwneud yr allwedd trefnu diofyn blaenorol "$1".',
@@ -3472,13 +3529,16 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'tags-hitcount' => '$1 {{PLURAL:$1|newid}}',
# Special:ComparePages
-'comparepages' => 'Cymharu tudalennau',
-'compare-selector' => "Cymharu diwygiadau gwahanol o'r dudalen",
-'compare-page1' => 'Tudalen 1',
-'compare-page2' => 'Tudalen 2',
-'compare-rev1' => 'Diwygiad 1',
-'compare-rev2' => 'Diwygiad 2',
-'compare-submit' => 'Cymharer',
+'comparepages' => 'Cymharu tudalennau',
+'compare-selector' => "Cymharu diwygiadau gwahanol o'r dudalen",
+'compare-page1' => 'Tudalen 1',
+'compare-page2' => 'Tudalen 2',
+'compare-rev1' => 'Diwygiad 1',
+'compare-rev2' => 'Diwygiad 2',
+'compare-submit' => 'Cymharer',
+'compare-invalid-title' => 'Ysgrifennwyd teitl annilys.',
+'compare-title-not-exists' => "Nid yw'r teitl a enwyd ar gael.",
+'compare-revision-not-exists' => "Nid yw'r diwygiad a enwyd ar gael.",
# Database error messages
'dberr-header' => 'Mae problem gan y wici hwn',
@@ -3505,4 +3565,88 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'sqlite-has-fts' => '$1 gyda chymorth chwilio yr holl destun',
'sqlite-no-fts' => '$1 heb gymorth chwiliad yr holl destun',
+# New logging system
+'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
+'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
+'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
+'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
+'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
+'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
+'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
+'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
+'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
+'revdelete-content-hid' => 'cuddiwyd y cynnwys',
+'revdelete-summary-hid' => 'cuddiwyd y crynodeb golygu',
+'revdelete-uname-hid' => 'cuddiwyd yr enw defnyddiwr',
+'revdelete-content-unhid' => 'datguddiwyd y cynnwys',
+'revdelete-summary-unhid' => 'datguddiwyd y crynodeb golygu',
+'revdelete-uname-unhid' => 'datguddiwyd yr enw defnyddiwr',
+'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
+'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
+'logentry-move-move' => 'Symudwyd y dudalen $3 i $4 gan $1',
+'logentry-move-move-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 heb adael dolen ailgyfeirio',
+'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
+'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
+'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-patrol-patrol-auto' => "Rhoddodd $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-newusers-newusers' => 'Crëodd $1 gyfrif defnyddiwr',
+'logentry-newusers-create' => 'Crëodd $1 gyfrif defnyddiwr',
+'logentry-newusers-create2' => 'Crëodd $1 y cyfrif defnyddiwr $3',
+'logentry-newusers-autocreate' => 'Crëwyd y cyfrif $1 yn awtomatig',
+'newuserlog-byemail' => 'anfonwyd y cyfrinair trwy e-bost',
+
+# Feedback
+'feedback-bugornote' => 'Os ydych yn barod i ddisgrifio problem technegol yn fanwl gallwch [$1 gyflwyno adroddiad am y bỳg]. Fel arall, gallwch ddefnyddio\'r ffurflen syml isod. Fe roddir eich sylwadau ar y dudalen "[$3 $2]", ynghyd â\'ch enw defnyddiwr ac enw\'r gweinydd sydd ar waith gennych.',
+'feedback-subject' => 'Gwrthrych:',
+'feedback-message' => 'Neges:',
+'feedback-cancel' => 'Diddymer',
+'feedback-submit' => 'Cyflwyner yr Adborth',
+'feedback-adding' => "Wrthi'n ychwanegu adborth i'r dudalen...",
+'feedback-error1' => "Gwall: Canlyniad anhysbys o'r API",
+'feedback-error2' => 'Gwall: Methodd y golygu',
+'feedback-error3' => 'Gwall: Dim ymateb gan yr API',
+'feedback-thanks' => 'Diolch! Gosodwyd eich adborth ar y dudalen "[$2 $1]".',
+'feedback-close' => 'Yn barod',
+'feedback-bugcheck' => "Iawn! Gwnewch yn siwr yn gyntaf nag ydy hwn yn un o'r [$1 bygiau hysbys].",
+'feedback-bugnew' => "Edrychais ar y bygiau hysbys. Mae byg newydd gennyf i'w adrodd",
+
+# API errors
+'api-error-badaccess-groups' => 'Nid oes caniatad gennych i uwchlwytho ffeiliau ar y wici hwn.',
+'api-error-badtoken' => 'Gwall mewnol: tocyn gwael.',
+'api-error-copyuploaddisabled' => 'Nid oes modd uwchlwytho drwy URL ar y gweinydd hwn',
+'api-error-duplicate' => "Mae {{PLURAL:$1||[$2 ffeil arall]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]}} gyda'r un cynnwys {{PLURAL:$1||ynddi|ynddynt|ynddynt|ynddynt|ynddynt}} eisoes ar y wici hwn",
+'api-error-duplicate-archive' => "Fe fu {{PLURAL:$1|[$2 ffeil arall gyda'r un cynnwys ynddi]|[$2 ffeiliau eraill gyda'r un cynnwys ynddynt]}} ar y safle, ond fe'{{PLURAL:$1|i|u}} dilëwyd.",
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Ffeiliau|Ffeil|Ffeiliau|Ffeiliau|Ffeiliau|Ffeiliau}} dyblyg, sydd eisoes wedi eu dileu.',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Ffeiliau|ffeil|ffeiliau|ffeiliau|ffeiliau|ffeiliau}} dyblyg.',
+'api-error-empty-file' => "Mae'r ffeil a gyflwynwyd gennych yn wag.",
+'api-error-emptypage' => "Ni chaniateir dechrau tudalen newydd, a honno'n wag.",
+'api-error-fetchfileerror' => "Gwall mewnol: aeth rhywbeth o'i le tra'n cywain y ffeil.",
+'api-error-file-too-large' => "Mae'r ffeil a gyflwynwyd gennych yn rhy fawr.",
+'api-error-filename-tooshort' => "Mae enw'r ffeil yn rhy fyr.",
+'api-error-filetype-banned' => "Mae'r math hwn o ffeil wedi ei wahardd.",
+'api-error-filetype-missing' => 'Mae estyniad yn eisiau ar y ffeil.',
+'api-error-http' => "Gwall mewnol: ni ellir cysylltu â'r gweinydd.",
+'api-error-illegal-filename' => "Nid yw'r enw ffeil hwn yn cael ei ganiatáu.",
+'api-error-internal-error' => "Gwall mewnol: aeth rhywbeth o'i le wrth brosesu'ch uwchlwythiad ar y wici.",
+'api-error-invalid-file-key' => "Gwall mewnol: nid oedd modd dod o hyd i'r ffeil yn y storfa dros dro.",
+'api-error-missingparam' => 'Gwall mewnol: paramedrau yn eisiau ar y cais.',
+'api-error-missingresult' => 'Gwall mewnol: ni allem ddarganfod a lwyddodd y gwaith copïo ai pheidio.',
+'api-error-mustbeloggedin' => 'Rhaid i chi fewngofnodi er mwyn uwchlwytho ffeiliau.',
+'api-error-mustbeposted' => 'Gwall mewnol: mae angen HTTP POST ar y cais hwn.',
+'api-error-noimageinfo' => 'Llwyddodd yr uwchlwytho, ond ni roddodd y gweinydd unrhyw wybodaeth i ni am y ffeil.',
+'api-error-nomodule' => 'Gwall mewnol: nid oes pecyn uwchlwytho wedi ei osod yn y meddalwedd.',
+'api-error-ok-but-empty' => 'Gwall mewnol: dim ymateb gan y gweinydd.',
+'api-error-overwrite' => 'Ni chaniateir trosysgrifo ffeil sydd eisoes yn bod.',
+'api-error-stashfailed' => "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
+'api-error-timeout' => 'Ni chafwyd ymateb gan y gweinydd mewn da bryd.',
+'api-error-unclassified' => 'Cafwyd gwall anhysbys',
+'api-error-unknown-code' => 'Gwall anhysbys: "$1"',
+'api-error-unknown-error' => "Gwall mewnol: aeth rhywbeth o'i le wrth geisio llwytho eich ffeil.",
+'api-error-unknown-warning' => 'Rhybudd anhysbys: $1',
+'api-error-unknownerror' => 'Gwall anhysbys: "$1".',
+'api-error-uploaddisabled' => 'Analluogwyd uwchlwytho ar y wici hwn.',
+'api-error-verification-error' => "Gallai'r ffeil hon fod wedi ei llygru, neu gall fod estyniad anghywir iddi.",
+
);
diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php
index e535157b..9b172c11 100644
--- a/languages/messages/MessagesDa.php
+++ b/languages/messages/MessagesDa.php
@@ -16,6 +16,7 @@
* @author EPO
* @author Emilkris33
* @author Froztbyte
+ * @author Gorbi
* @author H92
* @author Hylle
* @author Jan Friberg
@@ -541,20 +542,22 @@ Gør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, o
'badarticleerror' => 'Denne funktion kan ikke udføres på denne side.',
'cannotdelete' => 'Kunne ikke slette siden eller filen "$1".
Den kan være blevet slettet af en anden.',
+'cannotdelete-title' => 'Kan ikke slette siden "$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.',
-'perfcached' => 'Følgende data er gemt i cachen, det er muligvis ikke helt opdateret:',
-'perfcachedts' => 'Disse data stammer fra cachen, sidste update: $1',
+'perfcached' => 'Følgende data er gemt i cachen, der muligvis ikke er helt opdateret. Der gemmes højst {{PLURAL:$1|ét resultat|$1 resultater}} i cachen.',
+'perfcachedts' => 'Disse data stammer fra cachen, som senest blev opdateret $1. Der gemmes højst {{PLURAL:$4|ét resultat|$4 resultater}} i cachen.',
'querypage-no-updates' => "'''Aktualiseringsfunktionen for denne side er pt. deaktiveret. Dataene bliver indtil videre ikke fornyet.'''",
'wrong_wfQuery_params' => 'Ugyldig parameter til wfQuery()<br />
Funktion: $1<br />
Forespørgsel: $2',
'viewsource' => 'Vis kildetekst',
-'viewsourcefor' => 'for $1',
+'viewsource-title' => 'Se kildekoden til $1',
'actionthrottled' => 'Begrænsning af handling',
'actionthrottledtext' => 'For at modvirke spam, er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Vær venlig at forsøge igen om et par minutter.',
'protectedpagetext' => 'Denne side er skrivebeskyttet.',
'viewsourcetext' => 'Du kan se og kopiere kildekoden til siden:',
+'viewyourtext' => "Du kan se og kopiere kildekoden for '''dine redigeringer''' til denne side:",
'protectedinterface' => 'Denne side indeholder tekst til softwarens sprog-interface og er skrivebeskyttet for at forhindre misbrug.',
'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.
For oversættelser bedes du venligst overveje at bruge [//translatewiki.net/wiki/Main_Page?setlang=da translatewiki.net], projektet for oversættelse af MediaWiki.",
@@ -654,6 +657,7 @@ Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblik
'noemailprefs' => 'Angiv en e-mail-adresse, så følgende funktioner er til rådighed.',
'emailconfirmlink' => 'Bekræft e-mail-adressen (autentificering).',
'invalidemailaddress' => 'E-mail-adressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mail-adresse med et korrekt format eller tøm feltet.',
+'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
'accountcreated' => 'Brugerkonto oprettet',
'accountcreatedtext' => 'Brugerkontoen $1 er oprettet.',
'createaccount-title' => 'Opret brugerkonto på {{SITENAME}}',
@@ -670,6 +674,7 @@ Vent venligst før du prøver igen.',
# E-mail sending
'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
+'user-mail-no-addy' => 'Forsøgte at sende email uden en email-adresse',
# Change password dialog
'resetpass' => 'Skift adgangskode',
@@ -690,30 +695,45 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
'resetpass-temp-password' => 'Midlertidig adgangskode',
# Special:PasswordReset
-'passwordreset' => 'Nulstil adgangskode',
-'passwordreset-text' => 'Udfyld denne formular for at modtage en påmindelse om dine kontooplysninger som e-mail.',
-'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-username' => 'Brugernavn:',
-'passwordreset-domain' => 'Domæne:',
-'passwordreset-email' => 'E-mail adresse:',
-'passwordreset-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|brugerkonti}} er associerede med denne e-mail-adresse:
+'passwordreset' => 'Nulstil adgangskode',
+'passwordreset-text' => 'Udfyld denne formular for at modtage en påmindelse om dine kontooplysninger som e-mail.',
+'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-username' => 'Brugernavn:',
+'passwordreset-domain' => 'Domæne:',
+'passwordreset-capture' => 'Se den resulterende email?',
+'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-mail adresse:',
+'passwordreset-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|brugerkonti}} er associerede med denne e-mail-adresse:
$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 anmodet om denne påmindelse, 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 har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|brugerkonti}} er associerede med denne e-mail-adresse:
+'passwordreset-emailtext-user' => 'Brugeren $1 har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|brugerkonti}} er associerede med denne e-mail-adresse:
$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 anmodet om denne påmindelse, 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
+'passwordreset-emailelement' => 'Brugernavn: $1
Midlertidig adgangskode: $2',
-'passwordreset-emailsent' => 'En påmindelse er blevet sendt som e-mail.',
+'passwordreset-emailsent' => 'En påmindelse er blevet sendt som e-mail.',
+'passwordreset-emailsent-capture' => 'En påmindelsesemail, 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Ændr email-adresse',
+'changeemail-header' => 'Ændr kontoens email-adresse',
+'changeemail-text' => 'Udfyld denne formular for at ændre din email-adresse. Du skal indtaste dit kodeord for at bekræfte denne ændring.',
+'changeemail-no-info' => 'Du skal være logget på for at komme direkte til denne side.',
+'changeemail-oldemail' => 'Nuværende email-adresse:',
+'changeemail-newemail' => 'Ny email-adresse:',
+'changeemail-none' => '(ingen)',
+'changeemail-submit' => 'Ændr email',
+'changeemail-cancel' => 'Afbryd',
# Edit page toolbar
'bold_sample' => 'Fed tekst',
@@ -784,9 +804,6 @@ Bemærk at du ikke kan bruge funktionen "e-mail til denne bruger" medmindre du h
Din nuværende IP-adresse er $3, og blokerings-id\'et er #$5.
Angiv venligst alle de ovenstående detaljer ved eventuelle henvendelser.',
'blockednoreason' => 'ingen begrundelse givet',
-'blockedoriginalsource' => "Kildekoden fra '''$1''' vises her:",
-'blockededitsource' => "Kildekoden fra '''Dine ændringer''' til '''$1''':",
-'whitelistedittitle' => 'Log på for at redigere',
'whitelistedittext' => 'Du skal $1 for at kunne redigere sider.',
'confirmedittext' => 'Du skal først bekræfte e-mail-adressen, før du kan lave ændringer. Udfyld og bekræft din e-mail-adresse i dine [[Special:Preferences|Indstillinger]].',
'nosuchsectiontitle' => 'Kan ikke finde afsnittet',
@@ -871,7 +888,8 @@ Læg ingen tekster ind, hvis du ikke kan acceptere at disse kan ændres.
Du bekræfter hermed også, at du selv har skrevet denne tekst eller kopieret den fra en fri kilde (se $1 for detaljer).
'''OVERFØR IKKE OPHAVSRETSLIGT BESKYTTET INDHOLD UDEN TILLADELSE!'''",
-'longpageerror' => "'''FEJL: Teksten, som du ville gemme, er $1 kB stor. Det er større end det tilladet maksimum på $2 kB. Det er ikke muligt at gemme.'''",
+'longpageerror' => "'''Fejl: Teksten, som du ville gemme, er {{PLURAL:$1|en kilobyte|$1 kilobytes}} stor, hvilket er mere end det tilladte maksimum på {{PLURAL:$2|en kilobyte|$2 kilobytes}}.'''
+Det er ikke muligt at gemme den.",
'readonlywarning' => "'''ADVARSEL: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu. Det kan godt være en god ide at kopiere din tekst til en tekstfil, så du kan gemme den til senere.'''
Systemadministratoren som låste databasen, gav denne forklaring: $1",
@@ -1028,8 +1046,6 @@ Andre administratorer på {{SITENAME}} vil fortsat være i stand til at se det s
'revdelete-unsuppress' => 'Ophæv begrænsninger for gendannede versioner',
'revdelete-log' => 'Begrundelse:',
'revdelete-submit' => 'Udfør på {{PLURAL:$1|den udvalgte version|de udvalgte versioner}}',
-'revdelete-logentry' => 'Versionsvisning ændret for [[$1]]',
-'logdelete-logentry' => "ændrede [[$1]]'s synlighed",
'revdelete-success' => "'''Versionsvisningen er ændret.'''",
'revdelete-failure' => "'''Kunne ikke ændre versionssynligheden:'''
$1",
@@ -1041,15 +1057,6 @@ $1",
'revdel-restore-visible' => 'synlige ændringer',
'pagehist' => 'Sidehistorik',
'deletedhist' => 'Slettet historik',
-'revdelete-content' => 'indhold',
-'revdelete-summary' => 'redigeringsbeskrivelse',
-'revdelete-uname' => 'bruger',
-'revdelete-restricted' => 'tilføjede begrænsninger for administratorer',
-'revdelete-unrestricted' => 'fjernede begrænsninger for administratorer',
-'revdelete-hid' => 'usynliggjorde $1',
-'revdelete-unhid' => 'synliggjorde $1',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|version|versioner}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|hændelse|hændelser}}',
'revdelete-hide-current' => 'Der er opstået en fejl under skjulningen af objektet dateret $1 klokken $2: Dette er den nyeste revision.
Den kan ikke skjules.',
'revdelete-show-no-access' => 'Fejl under visning af objekt dateret $1 klokken $2: Dette objekt er blevet markeret som "begrænset".
@@ -1207,12 +1214,14 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
'prefs-rc' => 'Seneste ændringer',
'prefs-watchlist' => 'Overvågningsliste',
'prefs-watchlist-days' => 'Antal dage, som overvågningslisten standardmæssigt skal omfatte:',
-'prefs-watchlist-days-max' => 'Maks. 7 dage',
+'prefs-watchlist-days-max' => 'Højst $1 {{PLURAL:$1|dag|dage}}',
'prefs-watchlist-edits' => 'Antal redigeringer der vises i udvidet overvågningsliste:',
'prefs-watchlist-edits-max' => 'Maks. 1000',
'prefs-watchlist-token' => 'Overvågningslistenøgle:',
'prefs-misc' => 'Forskelligt',
'prefs-resetpass' => 'Skift adgangskode',
+'prefs-changeemail' => 'Ændr email',
+'prefs-setemail' => 'Angiv en email-adresse',
'prefs-email' => 'Indstillinger for e-mail',
'prefs-rendering' => 'Udseende',
'saveprefs' => 'Gem indstillinger',
@@ -1272,6 +1281,7 @@ Det kan ikke gøres om.',
'yourrealname' => 'Dit rigtige navn:',
'yourlanguage' => 'Sprog:',
'yourvariant' => 'Sprogvariant for indhold:',
+'prefs-help-variant' => 'Den sprogvariant eller retskrivning, som du foretrækker, at denne wikis indholdssider vises i.',
'yournick' => 'Signatur:',
'prefs-help-signature' => 'Kommentarer på diskussionssider bør signeres med "<nowiki>~~~~</nowiki>" som vil blive konverteret til din signatur og et tidsstempel.',
'badsig' => 'Syntaksen i underskriften er ugyldig; kontroller venligst den brugte HTML.',
@@ -1311,7 +1321,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'userrights-lookup-user' => 'Administrér brugergrupper',
'userrights-user-editname' => 'Skriv et brugernavn:',
'editusergroup' => 'Redigér brugergrupper',
-'editinguser' => "Ændrer brugerrettigheder for bruger '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ændrer brugerrettigheder for brugeren '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Redigér brugergrupper',
'saveusergroups' => 'Gem brugergrupper',
'userrights-groupsmember' => 'Medlem af:',
@@ -1405,13 +1415,13 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'right-autopatrol' => 'Egne redigeringer vises automatisk som patruljerede',
'right-patrolmarks' => 'Se de seneste patruljeringer',
'right-unwatchedpages' => 'Se en liste over uovervågede sider',
-'right-trackback' => 'Tilføje trackback',
'right-mergehistory' => 'Sammenflette sidehistorik',
'right-userrights' => 'Ændre alle brugerrettigheder',
'right-userrights-interwiki' => 'Ændre brugerrettigheder på andre wikier',
'right-siteadmin' => 'LÃ¥se og frigive databasen',
'right-override-export-depth' => 'Eksportere sider inkl. henviste sider op til en dybde på 5',
'right-sendemail' => 'Sende e-mail til andre brugere',
+'right-passwordreset' => 'Se emails til nulstilling af adgangskoder',
# User rights log
'rightslog' => 'Rettighedslog',
@@ -1445,16 +1455,17 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'action-suppressionlog' => 'se denne private log',
'action-block' => 'blokere denne bruger fra at redigere',
'action-protect' => 'ændre på beskyttelsen af denne side',
+'action-rollback' => 'hurtigt gendanne alle redigeringerne foretaget af den bruger, som senest redigerede en bestemt side,',
'action-import' => 'importere denne side fra en anden wiki',
'action-importupload' => 'importere denne side fra en filoplægning',
'action-patrol' => 'patruljere andres redigeringer',
'action-autopatrol' => 'patruljere din redigering',
'action-unwatchedpages' => 'se listen over uovervågede sider',
-'action-trackback' => 'tilføj et trackback',
'action-mergehistory' => 'flette denne sides historik',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ændring|ændringer}}',
@@ -1487,6 +1498,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'rc_categories' => 'Kun sider fra kategorierne (adskilt med „|“):',
'rc_categories_any' => 'Alle',
'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter ændring',
'newsectionsummary' => '/* $1 */ nyt afsnit',
'rc-enhanced-expand' => 'Vis detaljer (kræver JavaScript)',
'rc-enhanced-hide' => 'Skjul detaljer',
@@ -1538,6 +1550,7 @@ Brug en henvisning af en de følgende typer for at bruge en fil på en side:
'ignorewarnings' => 'Ignorer advarsler',
'minlength1' => 'Navnet på filen skal være på mindst et bogstav.',
'illegalfilename' => 'Filnavnet "$1" indeholder tegn, der ikke er tilladte i sidetitler. Omdøb filen og prøv at lægge den op igen.',
+'filename-toolong' => 'Filnavne må ikke være længere end 240 bytes.',
'badfilename' => 'Navnet på filen er blevet ændret til "$1".',
'filetype-mime-mismatch' => 'Filendelsen ".$1" svarer ikke til filens MIME-type ($2).',
'filetype-badmime' => 'Filer med MIME-typen „$1“ må ikke uploades.',
@@ -1628,6 +1641,41 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
'upload-unknown-size' => 'Ukendt størrelse',
'upload-http-error' => 'Der opstod en HTTP-fejl: $1',
+# File backend
+'backend-fail-stream' => 'Kunne ikke streame filen $1.',
+'backend-fail-backup' => 'Kunne ikke lave sikkerhedskopi af filen $1.',
+'backend-fail-notexists' => 'Filen $1 findes ikke.',
+'backend-fail-hashes' => 'Kunne ikke danne hashværdier til sammenligning af filer.',
+'backend-fail-notsame' => 'En ikke-identisk fil eksisterer allerede som $1.',
+'backend-fail-invalidpath' => '$1 er ikke en gyldig lagringssti.',
+'backend-fail-delete' => 'Kunne ikke slette filen $1.',
+'backend-fail-alreadyexists' => 'Filen $1 findes allerede.',
+'backend-fail-store' => 'Kunne ikke gemme filen $1 i $2.',
+'backend-fail-copy' => 'Kunne ikke kopiere filen $1 til $2.',
+'backend-fail-move' => 'Kunne ikke flytte filen $1 til $2.',
+'backend-fail-opentemp' => 'Kunne ikke åbne midlertidig fil.',
+'backend-fail-writetemp' => 'Kunne ikke skrive til midlertidig fil.',
+'backend-fail-closetemp' => 'Kunne ikke lukke midlertidig fil.',
+'backend-fail-read' => 'Kunne ikke læse filen $1.',
+'backend-fail-create' => 'Kunne ikke oprette filen $1.',
+'backend-fail-readonly' => 'Lagrings-backend "$1" er i øjeblikket skrivebeskyttet. Den angivne begrundelse var: " $2 "',
+'backend-fail-synced' => 'Filen "$1" er i en inkonsistent tilstand inden for de interne lagringsbackends',
+'backend-fail-connect' => 'Kunne ikke forbinde til lagringsbackend "$1".',
+'backend-fail-internal' => 'En ukendt fejl opstod i filbackend "$1".',
+'backend-fail-contenttype' => 'Kunne ikke bestemme typen af indhold i filen, der skal gemmes på "$1".',
+'backend-fail-batchsize' => 'Lagringsbackend gav en batch på $1 fil{{PLURAL:$1|operation|operationer}}; grænsen er $2 {{PLURAL:$2|operation|operationer}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kunne ikke låse "$1" op, da den ikke er låst.',
+'lockmanager-fail-closelock' => 'Kunne ikke lukke låsefilen for "$1".',
+'lockmanager-fail-deletelock' => 'Kunne ikke slette låsefilen for "$1".',
+'lockmanager-fail-acquirelock' => 'Kunne ikke opnå lås for "$1".',
+'lockmanager-fail-openlock' => 'Kunne ikke åbne låsefilen for "$1".',
+'lockmanager-fail-releaselock' => 'Kunne ikke frigive låsen for "$1".',
+'lockmanager-fail-db-bucket' => 'Kunne ikke kontakte nok låsedatabaser i bøtten $1.',
+'lockmanager-fail-db-release' => 'Kunne ikke frigive lås til databasen $1.',
+'lockmanager-fail-svr-release' => 'Kunne ikke frigive låse til serveren $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'En fejl opstod under åbning af filen til ZIP kontrol.',
'zip-wrong-format' => 'Den angivne fil var ikke en ZIP-fil.',
@@ -1644,6 +1692,7 @@ Den kan ikke kontrolleres rigtigt for sikkerhed.',
'uploadstash-badtoken' => 'Udførelse af handlingen mislykkedes, måske fordi dine redigerings legitimationsoplysninger udløbet. Prøv igen.',
'uploadstash-errclear' => 'Rydning af filerne mislykkedes.',
'uploadstash-refresh' => 'Opdatér filoversigten',
+'invalid-chunk-offset' => 'Ugyldig segmentstart',
# img_auth script messages
'img-auth-accessdenied' => 'Adgang nægtet',
@@ -1749,24 +1798,25 @@ Indholdet på dens [$2 filbeskrivelsesside] er vist herunder.',
'filerevert-badversion' => 'Der findes ingen lokal udgave af denne fil med det opgivne tidsstempel.',
# File deletion
-'filedelete' => 'Slet $1',
-'filedelete-legend' => 'Slet fil',
-'filedelete-intro' => "Du er ved at slette filen '''[[Media:$1|$1]]''' sammen med hele dens historik.",
-'filedelete-intro-old' => '<span class="plainlinks">Du er ved at slette en tidligere version af \'\'\'[[Media:$1|$1]]\'\'\' fra [$4 $2, $3].</span>',
-'filedelete-comment' => 'Begrundelse:',
-'filedelete-submit' => 'Slet',
-'filedelete-success' => "'''$1''' er blevet slettet.",
-'filedelete-success-old' => "Versionen af '''[[Media:$1|$1]]''' fra $2 $3 er blevet slettet.",
-'filedelete-nofile' => "'''$1''' findes ikke.",
-'filedelete-nofile-old' => "Det er ingen version af '''$1''' med de anførte attributter.",
-'filedelete-otherreason' => 'Anden/uddybende begrundelse:',
-'filedelete-reason-otherlist' => 'Anden begrundelse',
-'filedelete-reason-dropdown' => '*Hyppige sletningsbegrundelser
+'filedelete' => 'Slet $1',
+'filedelete-legend' => 'Slet fil',
+'filedelete-intro' => "Du er ved at slette filen '''[[Media:$1|$1]]''' sammen med hele dens historik.",
+'filedelete-intro-old' => '<span class="plainlinks">Du er ved at slette en tidligere version af \'\'\'[[Media:$1|$1]]\'\'\' fra [$4 $2, $3].</span>',
+'filedelete-comment' => 'Begrundelse:',
+'filedelete-submit' => 'Slet',
+'filedelete-success' => "'''$1''' er blevet slettet.",
+'filedelete-success-old' => "Versionen af '''[[Media:$1|$1]]''' fra $2 $3 er blevet slettet.",
+'filedelete-nofile' => "'''$1''' findes ikke.",
+'filedelete-nofile-old' => "Det er ingen version af '''$1''' med de anførte attributter.",
+'filedelete-otherreason' => 'Anden/uddybende begrundelse:',
+'filedelete-reason-otherlist' => 'Anden begrundelse',
+'filedelete-reason-dropdown' => '*Hyppige sletningsbegrundelser
** Ophavsretskrænkelse
** Dubletfil
** Filen er ubrugt',
-'filedelete-edit-reasonlist' => 'Rediger sletningsårsager',
-'filedelete-maintenance' => 'Sletning og gendannelse af filer er midlertidigt forhindret på grund af vedligeholdelse.',
+'filedelete-edit-reasonlist' => 'Rediger sletningsårsager',
+'filedelete-maintenance' => 'Sletning og gendannelse af filer er midlertidigt forhindret på grund af vedligeholdelse.',
+'filedelete-maintenance-title' => 'Kan ikke slette fil',
# MIME search
'mimesearch' => 'Søge efter MIME-type',
@@ -1862,6 +1912,8 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, sÃ
'wantedpages' => 'Ønskede sider',
'wantedpages-badtitle' => 'Ugyldig titel i resultaterne: $1',
'wantedfiles' => 'Ønskede filer',
+'wantedfiletext-cat' => 'De følgende filer er i brug, men findes ikke. Filer fra eksterne databaser kan være medtaget, selvom de reelt findes. Sådanne falske positiver vil være <del>streget over</del>. Sider, der bruger ikke-eksisterende filer, kan findes i [[:$1]].',
+'wantedfiletext-nocat' => 'De følgende filer er i brug, men findes ikke. Filer fra eksterne databaser kan være medtaget, selvom de reelt findes. Sådanne falske positiver vil være <del>streget over</del>.',
'wantedtemplates' => 'Ønskede skabeloner',
'mostlinked' => 'Sider med flest henvisninger',
'mostlinkedcategories' => 'Mest brugte kategorier',
@@ -1870,6 +1922,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, sÃ
'mostimages' => 'Mest brugte filer',
'mostrevisions' => 'Sider med de fleste ændringer',
'prefixindex' => 'Alle sider med præfiks',
+'prefixindex-namespace' => 'Alle sider med præfiks (navnerummet $1)',
'shortpages' => 'Korte sider',
'longpages' => 'Lange sider',
'deadendpages' => 'Blindgydesider',
@@ -1979,12 +2032,8 @@ Understøttede protokoller: <tt>$1</tt> (tilføj ikke protokollerne til din søg
'activeusers-noresult' => 'Ingen brugere fundet.',
# Special:Log/newusers
-'newuserlogpage' => 'Brugeroprettelseslog',
-'newuserlogpagetext' => 'Dette er en log over de senest oprettede brugere.',
-'newuserlog-byemail' => 'kodeord tilsendt pr. e-mail',
-'newuserlog-create-entry' => 'Ny bruger',
-'newuserlog-create2-entry' => 'oprettede ny brugerkonto $1',
-'newuserlog-autocreate-entry' => 'Automatisk oprettet konto',
+'newuserlogpage' => 'Brugeroprettelseslog',
+'newuserlogpagetext' => 'Dette er en log over de senest oprettede brugere.',
# Special:ListGroupRights
'listgrouprights' => 'Brugergrupperettigheder',
@@ -2014,7 +2063,7 @@ Der findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere informat
'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne bruger.
Den e-mail-adresse du har angivet i [[Special:Preferences|dine indstillinger]] vil dukke op i "fra"-feltet på e-mailen, så modtageren kan svare dig.',
'usermailererror' => 'E-mail-modulet returnerede en fejl:',
-'defemailsubject' => 'E-mail fra {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}}-email fra brugeren "$1"',
'usermaildisabled' => 'Bruger-e-mail deaktiveret',
'usermaildisabledtext' => 'Du kan ikke sende e-mails til andre brugere på denne wiki',
'noemailtitle' => 'Ingen e-mail-adresse',
@@ -2067,7 +2116,7 @@ Den e-mail-adresse du har angivet i [[Special:Preferences|dine indstillinger]] v
'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
'iteminvalidname' => "Problem med '$1', ugyldigt navn...",
-'wlnote' => "Nedenfor ses de seneste $1 {{PLURAL:$1|ændring|ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}'''.",
+'wlnote' => "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}''' fra den $3, kl. $4.",
'wlshowlast' => 'Vis de seneste $1 timer $2 dage $3',
'watchlist-options' => 'Indstillinger for overvågningslisten',
@@ -2131,8 +2180,6 @@ Bekræft venligst at du virkelig vil gøre dette, at du forstår konsekvenserne,
'actioncomplete' => 'Gennemført',
'actionfailed' => 'Handlingen mislykkedes',
'deletedtext' => '"$1" er slettet. Se $2 for en fortegnelse over de nyeste sletninger.',
-'deletedarticle' => 'slettede "$1"',
-'suppressedarticle' => 'skjulte "[[$1]]"',
'dellogpage' => 'Sletningslog',
'dellogpagetext' => 'Herunder vises de nyeste sletninger. Alle tider er serverens tid.',
'deletionlog' => 'sletningslog',
@@ -2178,7 +2225,10 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sideb
'unprotectedarticle' => 'fjernede beskyttelse af "[[$1]]"',
'movedarticleprotection' => 'flyttede beskyttelsesindstillinger fra "[[$2]]" til "[[$1]]"',
'protect-title' => 'Ændr beskyttelse af "$1"',
+'protect-title-notallowed' => 'FÃ¥ vist beskyttelsesniveauet af "$1"',
'prot_1movedto2' => '$1 flyttet til $2',
+'protect-badnamespace-title' => 'Navnerum, der ikke kan beskyttes',
+'protect-badnamespace-text' => 'Sider i dette navnerum kan ikke beskyttes.',
'protect-legend' => 'Bekræft beskyttelse',
'protectcomment' => 'Begrundelse:',
'protectexpiry' => 'Udløb',
@@ -2196,6 +2246,7 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sideb
'protect-level-sysop' => 'Kun administratorer',
'protect-summary-cascade' => 'nedarvende',
'protect-expiring' => 'til $1 (UTC)',
+'protect-expiring-local' => 'udløber $1',
'protect-expiry-indefinite' => 'på ubestemt tid',
'protect-cascade' => 'Beskyt sider som er inkluderet på denne side (nedarvende beskyttelse)',
'protect-cantedit' => 'Du kan ikke ændre beskyttelsesniveau for denne side, da du ikke har tilladelse til at redigere den.',
@@ -2256,7 +2307,6 @@ Teksten i de slettede versioner er kun tilgængelig for administratorer.',
'undeletereset' => 'Afbryd',
'undeleteinvert' => 'Omvend valget af versioner',
'undeletecomment' => 'Begrundelse:',
-'undeletedarticle' => 'gendannede "$1"',
'undeletedrevisions' => '$1 {{PLURAL:$1|version|versioner}} gendannet',
'undeletedrevisions-files' => '$1 {{plural:$1|version|versioner}} og $2 {{plural:$2|fil|filer}} gendannet',
'undeletedfiles' => '$1 {{plural:$1|fil|filer}} gendannet',
@@ -2265,6 +2315,7 @@ Teksten i de slettede versioner er kun tilgængelig for administratorer.',
I [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt slettede og gendannede sider.",
'undelete-header' => 'Se [[Special:Log/delete|slette-loggen]] for nyligt slettede og gendannede sider.',
+'undelete-search-title' => 'Søg i slettede sider',
'undelete-search-box' => 'Søg efter slettede sider',
'undelete-search-prefix' => 'Vis sider som starter med:',
'undelete-search-submit' => 'Søg',
@@ -2273,6 +2324,7 @@ I [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt sletted
'undelete-bad-store-key' => 'Kan ikke gendanne filen med tidsstempel $1: file fandtes ikke da den blev slettet',
'undelete-cleanup-error' => 'Fejl under sletning af ubrugt arkiveret version "$1".',
'undelete-missing-filearchive' => 'Kunne ikke genskabe arkiveret fil med ID $1 fordi den ikke findes i databasen. MÃ¥ske er den allerede gendannet.',
+'undelete-error' => 'Fejl under gendannelse af siden',
'undelete-error-short' => 'Fejl under gendannelsen af fil: $1',
'undelete-error-long' => 'Der opstod en fejl under gendannelsen af filen:
@@ -2393,6 +2445,7 @@ Se [[Special:BlockList|IP-blokeringslisten]] for alle blokeringer.',
'blocklist-userblocks' => 'Skjul blokeringer af kontoer',
'blocklist-tempblocks' => 'Skjul midlertidige blokeringer',
'blocklist-addressblocks' => 'Skjul enkel IP blokeringer',
+'blocklist-rangeblocks' => 'Skjul blokeringsklasser',
'blocklist-timestamp' => 'Tidsstempel',
'blocklist-target' => 'MÃ¥l',
'blocklist-expiry' => 'Udløber',
@@ -2415,6 +2468,7 @@ Se [[Special:BlockList|IP-blokeringslisten]] for alle blokeringer.',
'unblocklink' => 'ophæv blokering',
'change-blocklink' => 'ændr blokering',
'contribslink' => 'bidrag',
+'emaillink' => 'send email',
'autoblocker' => 'Du er automatisk blokeret, fordi du deler IP-adresse med "[[User:$1|$1]]".
Begrundelse: "$2".',
'blocklogpage' => 'Blokeringslog',
@@ -2522,9 +2576,6 @@ navn du har valgt er ikke gyldigt. Vælg et andet navn.',
'movepage-page-moved' => 'Siden $1 er flyttet til $2.',
'movepage-page-unmoved' => 'Siden $1 kan ikke flyttes til $2.',
'movepage-max-pages' => 'Grænsen på $1 {{PLURAL:$1|sideflytning|sideflytninger}} er nået. De resterende sider vil ikke blive flyttet automatisk.',
-'1movedto2' => '[[$1]] flyttet til [[$2]]',
-'1movedto2_redir' => '[[$1]] flyttet til [[$2]] over en omdirigering',
-'move-redirect-suppressed' => 'en omdirigering oprettes ikke',
'movelogpage' => 'Flyttelog',
'movelogpagetext' => 'Nedenfor vises flyttede sider.',
'movesubpage' => '{{PLURAL:$1|Underside|Undersider}}',
@@ -2537,7 +2588,7 @@ navn du har valgt er ikke gyldigt. Vælg et andet navn.',
Artiklen "[[:$1]]" eksisterer allerede. Vil du slette den for at gøre plads til flytningen?',
'delete_and_move_confirm' => 'Ja, slet siden',
-'delete_and_move_reason' => 'Slettet på grund af flytning',
+'delete_and_move_reason' => 'Slettet for at gøre plads til flytning fra "[[$1]]"',
'selfmove' => 'Begge sider har samme navn. Man kan ikke flytte en side oven i sig selv.',
'immobile-source-namespace' => 'Kan ikke flytte sider i navnerummet "$1"',
'immobile-target-namespace' => 'Kan ikke flytte sider til navnerummet "$1"',
@@ -2567,8 +2618,10 @@ Dette kan så importeres i en anden wiki der bruger MediaWiki-softwaren ved hjæ
For at eksportere sider skal du skrive sidetitlerne i tekstboksen herunder med én titel per linje, og vælge om du vil have alle versioner i historikken eller kun den seneste version.
Hvis du kun vil have den seneste version, kan du også bruge en henvisning, for eksempel [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for siden "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Eksporter alle sider',
'exportcuronly' => 'Eksportér kun den nuværende version, ikke hele historikken',
'exportnohistory' => "---- '''Bemærk:''' Eksporten af en komplet versionshistorik er pga. ydelsesårsager pt. ikke mulig.",
+'exportlistauthors' => 'Inkluder en komplet liste over bidragyderne til hver side',
'export-submit' => 'Eksporter',
'export-addcattext' => 'Tilføj sider fra kategori:',
'export-addcat' => 'Tilføj',
@@ -2601,6 +2654,8 @@ Besøg venligst [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisering] o
'thumbnail_error' => 'Fejl ved oprettelse af thumbnail: $1',
'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',
+'thumbnail-dest-create' => 'Kunne ikke gemme miniaturebillede til destinationen',
'thumbnail_invalid_params' => 'Ugyldige thumbnail-parametre',
'thumbnail_dest_directory' => 'Kataloget kan ikke oprettes.',
'thumbnail_image-type' => 'Billedtypen understøttes ikke',
@@ -2644,6 +2699,11 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
'import-upload' => 'Upload XML-data',
'import-token-mismatch' => 'Sessionsdata er mistet. Prøv venligst igen.',
'import-invalid-interwiki' => 'Kan ikke importere fra den angivne wiki.',
+'import-error-edit' => 'Siden "$1" importeres ikke, da du ikke har rettigheden til at redigere den.',
+'import-error-create' => 'Siden "$1" importeres ikke, da du ikke har rettigheden til at oprette den.',
+'import-error-interwiki' => 'Siden "$1" importeres ikke, da dens navn er reserveret for eksterne henvisninger (interwiki).',
+'import-error-special' => 'Siden "$1" importeres ikke, da den tilhører et særligt navnerum, der ikke tillader sider.',
+'import-error-invalid' => 'Siden "$1" importeres ikke, da dens navn er ugyldigt.',
# Import log
'importlogpage' => 'Importlog',
@@ -2653,74 +2713,87 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
'import-logentry-interwiki' => '$1 blev importeret (Transwiki)',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|1 version|$1 versioner}} af $2 importeret',
+# JavaScriptTest
+'javascripttest' => 'Test af JavaScript',
+'javascripttest-disabled' => 'Denne funktion er deaktiveret.',
+'javascripttest-title' => 'Kører $1 test',
+'javascripttest-pagetext-noframework' => 'Denne side er reserveret til at teste JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Ukendt testmiljø "$1".',
+'javascripttest-pagetext-frameworks' => 'Vælg venligst en af de følgende testmiljøer: $1',
+'javascripttest-pagetext-skins' => 'Vælg et udseende, som testene skal køres med:',
+'javascripttest-qunit-intro' => 'Se [$1 testdokumentationen] på mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit testsuite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Din brugerside',
-'tooltip-pt-anonuserpage' => 'Brugersiden for den ip-adresse du redigerer som',
-'tooltip-pt-mytalk' => 'Din diskussionsside',
-'tooltip-pt-anontalk' => 'Diskussion om redigeringer fra denne ip-adresse',
-'tooltip-pt-preferences' => 'Mine indstillinger',
-'tooltip-pt-watchlist' => 'Listen over sider du overvåger for ændringer.',
-'tooltip-pt-mycontris' => 'Liste over dine bidrag',
-'tooltip-pt-login' => 'Du opfordres til at logge på, men det er ikke obligatorisk.',
-'tooltip-pt-anonlogin' => 'Du opfordres til at logge på, men det er ikke obligatorisk',
-'tooltip-pt-logout' => 'Log af',
-'tooltip-ca-talk' => 'Diskussion om indholdet på siden',
-'tooltip-ca-edit' => 'Du kan redigere denne side. Brug venligst forhåndsvisning før du gemmer.',
-'tooltip-ca-addsection' => 'Start et nyt afsnit',
-'tooltip-ca-viewsource' => 'Denne side er beskyttet.
+'tooltip-pt-userpage' => 'Din brugerside',
+'tooltip-pt-anonuserpage' => 'Brugersiden for den ip-adresse du redigerer som',
+'tooltip-pt-mytalk' => 'Din diskussionsside',
+'tooltip-pt-anontalk' => 'Diskussion om redigeringer fra denne ip-adresse',
+'tooltip-pt-preferences' => 'Mine indstillinger',
+'tooltip-pt-watchlist' => 'Listen over sider du overvåger for ændringer.',
+'tooltip-pt-mycontris' => 'Liste over dine bidrag',
+'tooltip-pt-login' => 'Du opfordres til at logge på, men det er ikke obligatorisk.',
+'tooltip-pt-anonlogin' => 'Du opfordres til at logge på, men det er ikke obligatorisk',
+'tooltip-pt-logout' => 'Log af',
+'tooltip-ca-talk' => 'Diskussion om indholdet på siden',
+'tooltip-ca-edit' => 'Du kan redigere denne side. Brug venligst forhåndsvisning før du gemmer.',
+'tooltip-ca-addsection' => 'Start et nyt afsnit',
+'tooltip-ca-viewsource' => 'Denne side er beskyttet.
Du kan se på kildeteksten.',
-'tooltip-ca-history' => 'Tidligere versioner af denne side',
-'tooltip-ca-protect' => 'Beskyt denne side',
-'tooltip-ca-unprotect' => 'Ændr beskyttelsen af denne side',
-'tooltip-ca-delete' => 'Slet denne side',
-'tooltip-ca-undelete' => 'Gendan de redigeringer der blev lavet på denne side før den blev slettet',
-'tooltip-ca-move' => 'Flyt denne side',
-'tooltip-ca-watch' => 'Sæt denne side på din overvågningsliste',
-'tooltip-ca-unwatch' => 'Fjern denne side fra din overvågningsliste',
-'tooltip-search' => 'Søg på denne wiki',
-'tooltip-search-go' => 'Vis en side med præcis dette navn, hvis den findes',
-'tooltip-search-fulltext' => 'Søg efter sider der indeholder denne tekst',
-'tooltip-p-logo' => 'Forsiden',
-'tooltip-n-mainpage' => 'Besøg forsiden',
-'tooltip-n-mainpage-description' => 'Besøg forsiden',
-'tooltip-n-portal' => 'Om projektet, hvad du kan gøre, hvor tingene findes',
-'tooltip-n-currentevents' => 'Find baggrundsinformation om aktuelle begivenheder',
-'tooltip-n-recentchanges' => 'Listen over de seneste ændringer i wikien.',
-'tooltip-n-randompage' => 'Gå til en tilfældig side',
-'tooltip-n-help' => 'Hvordan gør jeg ...',
-'tooltip-t-whatlinkshere' => 'Liste med alle sider som henviser hertil',
-'tooltip-t-recentchangeslinked' => 'Seneste ændringer i sider som denne side henviser til',
-'tooltip-feed-rss' => 'RSS-feed for denne side',
-'tooltip-feed-atom' => 'Atom-feed for denne side',
-'tooltip-t-contributions' => 'Se denne brugers bidrag',
-'tooltip-t-emailuser' => 'Send en e-mail til denne bruger',
-'tooltip-t-upload' => 'Upload et billede eller anden mediafil',
-'tooltip-t-specialpages' => 'Liste med alle specielle sider',
-'tooltip-t-print' => 'Printervenlig udgave af denne side',
-'tooltip-t-permalink' => 'Permanent henvisning til denne version af denne side',
-'tooltip-ca-nstab-main' => 'Se indholdet',
-'tooltip-ca-nstab-user' => 'Se brugersiden',
-'tooltip-ca-nstab-media' => 'Se mediasiden',
-'tooltip-ca-nstab-special' => 'Dette er en speciel side; man kan ikke redigere sådanne sider',
-'tooltip-ca-nstab-project' => 'Vis projektsiden',
-'tooltip-ca-nstab-image' => 'Se filsiden',
-'tooltip-ca-nstab-mediawiki' => 'Se systembeskeden',
-'tooltip-ca-nstab-template' => 'Se skabelonen',
-'tooltip-ca-nstab-help' => 'Se hjælpesiden',
-'tooltip-ca-nstab-category' => 'Se kategorisiden',
-'tooltip-minoredit' => 'Marker dette som en mindre ændring',
-'tooltip-save' => 'Gem dine ændringer',
-'tooltip-preview' => 'Forhåndsvis dine ændringer, brug venligst denne funktion inden du gemmer!',
-'tooltip-diff' => 'Vis hvilke ændringer du har lavet i teksten.',
-'tooltip-compareselectedversions' => 'Se forskellene imellem de to valgte versioner af denne side.',
-'tooltip-watch' => 'Tilføj denne side til din overvågningsliste',
-'tooltip-recreate' => 'Opret side, selv om den blev slettet.',
-'tooltip-upload' => 'Upload fil',
-'tooltip-rollback' => '"Rul tilbage" fjerner den sidste bidragsyders redigering(er) af denne side med et klik',
-'tooltip-undo' => '"Fjern redigering" fjerner denne redigering og åbner redigeringssiden med forhåndsvisning.
+'tooltip-ca-history' => 'Tidligere versioner af denne side',
+'tooltip-ca-protect' => 'Beskyt denne side',
+'tooltip-ca-unprotect' => 'Ændr beskyttelsen af denne side',
+'tooltip-ca-delete' => 'Slet denne side',
+'tooltip-ca-undelete' => 'Gendan de redigeringer der blev lavet på denne side før den blev slettet',
+'tooltip-ca-move' => 'Flyt denne side',
+'tooltip-ca-watch' => 'Sæt denne side på din overvågningsliste',
+'tooltip-ca-unwatch' => 'Fjern denne side fra din overvågningsliste',
+'tooltip-search' => 'Søg på denne wiki',
+'tooltip-search-go' => 'Vis en side med præcis dette navn, hvis den findes',
+'tooltip-search-fulltext' => 'Søg efter sider der indeholder denne tekst',
+'tooltip-p-logo' => 'Forsiden',
+'tooltip-n-mainpage' => 'Besøg forsiden',
+'tooltip-n-mainpage-description' => 'Besøg forsiden',
+'tooltip-n-portal' => 'Om projektet, hvad du kan gøre, hvor tingene findes',
+'tooltip-n-currentevents' => 'Find baggrundsinformation om aktuelle begivenheder',
+'tooltip-n-recentchanges' => 'Listen over de seneste ændringer i wikien.',
+'tooltip-n-randompage' => 'Gå til en tilfældig side',
+'tooltip-n-help' => 'Hvordan gør jeg ...',
+'tooltip-t-whatlinkshere' => 'Liste med alle sider som henviser hertil',
+'tooltip-t-recentchangeslinked' => 'Seneste ændringer i sider som denne side henviser til',
+'tooltip-feed-rss' => 'RSS-feed for denne side',
+'tooltip-feed-atom' => 'Atom-feed for denne side',
+'tooltip-t-contributions' => 'Se denne brugers bidrag',
+'tooltip-t-emailuser' => 'Send en e-mail til denne bruger',
+'tooltip-t-upload' => 'Upload et billede eller anden mediafil',
+'tooltip-t-specialpages' => 'Liste med alle specielle sider',
+'tooltip-t-print' => 'Printervenlig udgave af denne side',
+'tooltip-t-permalink' => 'Permanent henvisning til denne version af denne side',
+'tooltip-ca-nstab-main' => 'Se indholdet',
+'tooltip-ca-nstab-user' => 'Se brugersiden',
+'tooltip-ca-nstab-media' => 'Se mediasiden',
+'tooltip-ca-nstab-special' => 'Dette er en speciel side; man kan ikke redigere sådanne sider',
+'tooltip-ca-nstab-project' => 'Vis projektsiden',
+'tooltip-ca-nstab-image' => 'Se filsiden',
+'tooltip-ca-nstab-mediawiki' => 'Se systembeskeden',
+'tooltip-ca-nstab-template' => 'Se skabelonen',
+'tooltip-ca-nstab-help' => 'Se hjælpesiden',
+'tooltip-ca-nstab-category' => 'Se kategorisiden',
+'tooltip-minoredit' => 'Marker dette som en mindre ændring',
+'tooltip-save' => 'Gem dine ændringer',
+'tooltip-preview' => 'Forhåndsvis dine ændringer, brug venligst denne funktion inden du gemmer!',
+'tooltip-diff' => 'Vis hvilke ændringer du har lavet i teksten.',
+'tooltip-compareselectedversions' => 'Se forskellene imellem de to valgte versioner af denne side.',
+'tooltip-watch' => 'Tilføj denne side til din overvågningsliste',
+'tooltip-watchlistedit-normal-submit' => 'Fjern titler',
+'tooltip-watchlistedit-raw-submit' => 'Opdater overvågningsliste',
+'tooltip-recreate' => 'Opret side, selv om den blev slettet.',
+'tooltip-upload' => 'Upload fil',
+'tooltip-rollback' => '"Rul tilbage" fjerner den sidste bidragsyders redigering(er) af denne side med et klik',
+'tooltip-undo' => '"Fjern redigering" fjerner denne redigering og åbner redigeringssiden med forhåndsvisning.
Det giver mulighed for at tilføje en begrundelse i beskrivelsen.',
-'tooltip-preferences-save' => 'Gem indstillinger',
-'tooltip-summary' => 'Indtast en kort opsummering',
+'tooltip-preferences-save' => 'Gem indstillinger',
+'tooltip-summary' => 'Indtast en kort opsummering',
# Stylesheets
'common.css' => '/** CSS inkluderet her vil være aktivt for alle brugere. */',
@@ -2791,9 +2864,6 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
# Patrol log
'patrol-log-page' => 'Kontrollog',
'patrol-log-header' => 'Patruljerede versioner.',
-'patrol-log-line' => 'har markeret $1 af $2 som kontrolleret $3.',
-'patrol-log-auto' => '(automatisk)',
-'patrol-log-diff' => 'Version $1',
'log-show-hide-patrol' => '$1 patruljeringslog',
# Image deletion
@@ -2820,11 +2890,11 @@ Du kan beskadige dit system hvis du udfører den.",
'file-info' => 'Filstørrelse: $1, MIME-Type: $2',
'file-info-size' => '$1 × $2 punkter, filstørrelse: $3, MIME-Type: $4',
'file-info-size-pages' => '$1 × $2 punkter, filstørrelse: $3, MIME-type: $4, $5 {{PLURAL:$5|side|sider}}',
-'file-nohires' => '<small>Ingen højere opløsning fundet.</small>',
+'file-nohires' => 'Ingen højere opløsning fundet.',
'svg-long-desc' => 'SVG fil, basisstørrelse $1 × $2 punkters, størrelse: $3',
'show-big-image' => 'Version i større opløsning',
-'show-big-image-preview' => '<small>Størrelse af denne forhåndsvisning: $1.</small>',
-'show-big-image-other' => '<small>Andre opløsninger: $1.</small>',
+'show-big-image-preview' => 'Størrelse af denne forhåndsvisning: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Anden opløsning|Andre opløsninger}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'gentaget',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ramme|rammer}}',
@@ -2845,7 +2915,12 @@ Du kan beskadige dit system hvis du udfører den.",
'sp-newimages-showfrom' => 'Vis nye filer startende fra $1 $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 't',
+'hours-abbrev' => '$1t',
+'seconds' => '{{PLURAL: $1|$1 sekund|$1 sekunder}}',
+'minutes' => '{{PLURAL: $1|$1 minut|$1 minutter}}',
+'hours' => '{{PLURAL: $1|$1 time|$1 timer}}',
+'days' => '{{PLURAL: $1|$1 dag|$1 dage}}',
+'ago' => '$1 siden',
# Bad image list
'bad_image_list' => 'Formatet er:
@@ -3335,13 +3410,6 @@ Denne bekræftelseskode vil udløbe den $4.',
'scarytranscludefailed' => '[Hentning af skabelon for $1 mislykkedes]',
'scarytranscludetoolong' => "[URL'en er for lang]",
-# Trackbacks
-'trackbackbox' => 'Trackbacks for denne side:<br />
-$1',
-'trackbackremove' => '([$1 slet])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback blev slettet.',
-
# Delete conflict
'deletedwhileediting' => 'Bemærk: Det blev forsøgt at slette denne side, efter at du var begyndt, at ændre den!
Kig i [{{fullurl:Special:Log|type=delete&page=}}{{FULLPAGENAMEE}} slette-loggen],
@@ -3424,6 +3492,9 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
'watchlisttools-edit' => 'Rediger overvågningsliste',
'watchlisttools-raw' => 'Rediger rå overvågningsliste',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ukendt tag "$1"',
'duplicate-defaultsort' => 'Advarsel: Standardsorteringsnøglen "$2" tilsidesætter den tidligere sorteringsnøgle "$1".',
@@ -3479,8 +3550,7 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'specialpages' => 'Specialsider',
'specialpages-note' => '----
* Normale specialsider.
-* <span class="mw-specialpagerestricted">Specialsider med begrænset adgang.</span>
-* <span class="mw-specialpagecached">Specialsider der opdateres med jævne mellemrum (kan være forældede).</span>',
+* <span class="mw-specialpagerestricted">Specialsider med begrænset adgang.</span>',
'specialpages-group-maintenance' => 'Vedligeholdelsesside',
'specialpages-group-other' => 'Andre specialsider',
'specialpages-group-login' => 'Opret bruger / logon',
@@ -3522,13 +3592,16 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'tags-hitcount' => '{{PLURAL:$1|en ændring|$1 ændringer}}',
# Special:ComparePages
-'comparepages' => 'Sammenlign sider',
-'compare-selector' => 'Sammenlign sideversioner',
-'compare-page1' => 'Side 1',
-'compare-page2' => 'Side 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Sammenlign',
+'comparepages' => 'Sammenlign sider',
+'compare-selector' => 'Sammenlign sideversioner',
+'compare-page1' => 'Side 1',
+'compare-page2' => 'Side 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Sammenlign',
+'compare-invalid-title' => 'Den titel, du har angivet, er ugyldig.',
+'compare-title-not-exists' => 'Den titel, du har angivet, findes ikke.',
+'compare-revision-not-exists' => 'Den version, du har angivet, findes ikke.',
# Database error messages
'dberr-header' => 'Wikien har et problem',
@@ -3555,4 +3628,90 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'sqlite-has-fts' => '$1 med fuld-tekst søgnings support',
'sqlite-no-fts' => '$1 uden fuld-tekst søgnings support',
+# New logging system
+'logentry-delete-delete' => '$1 slettede siden $3',
+'logentry-delete-restore' => '$1 gendannede siden $3',
+'logentry-delete-event' => '$1 ændrede synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-delete-revision' => '$1 ændrede synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-delete-event-legacy' => '$1 ændrede synligheden af loghændelser for siden $3',
+'logentry-delete-revision-legacy' => '$1 ændrede synligheden af versioner af siden $3',
+'logentry-suppress-delete' => '$1 skjulte hændelser for siden $3',
+'logentry-suppress-event' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-suppress-revision' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-suppress-event-legacy' => '$1 ændrede hemmeligt synligheden af loghændelser for siden $3',
+'logentry-suppress-revision-legacy' => '$1 ændrede hemmeligt synligheden af versioner af siden $3',
+'revdelete-content-hid' => 'indhold skjult',
+'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
+'revdelete-uname-hid' => 'brugernavnet er skjult',
+'revdelete-content-unhid' => 'indhold er ikke længere skjult',
+'revdelete-summary-unhid' => 'redigeringsbeskrivelse er ikke længere skjult',
+'revdelete-uname-unhid' => 'brugernavnet er ikke længere skjult',
+'revdelete-restricted' => 'tilføjede begrænsninger for administratorer',
+'revdelete-unrestricted' => 'fjernede begrænsninger for administratorer',
+'logentry-move-move' => '$1 flyttede siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 flyttede siden $3 til $4 uden at efterlade en omdirigering',
+'logentry-move-move_redir' => '$1 flyttede siden $3 til $4 hen over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 flyttede siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
+'logentry-patrol-patrol' => '$1 markerede version $4 af siden $3 som patruljeret',
+'logentry-patrol-patrol-auto' => '$1 markerede automatisk version $4 af siden $3 som patruljeret',
+'logentry-newusers-newusers' => '$1 oprettede en brugerkonto',
+'logentry-newusers-create' => '$1 oprettede en brugerkonto',
+'logentry-newusers-create2' => '$1 oprettede brugerkontoen $3',
+'logentry-newusers-autocreate' => 'Kontoen $1 blev automatisk oprettet',
+'newuserlog-byemail' => 'kodeord tilsendt pr. e-mail',
+
+# Feedback
+'feedback-bugornote' => 'Hvis du er klar til at beskrive et teknisk problem i detaljer, bedes du [$1 rapportere en fejl].
+Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføjet siden "[$3 $2]" sammen med dit brugernavn og den browser, du anvender.',
+'feedback-subject' => 'Emne:',
+'feedback-message' => 'Besked:',
+'feedback-cancel' => 'Afbryd',
+'feedback-submit' => 'Send kommentar',
+'feedback-adding' => 'Tilføjer kommentar til side...',
+'feedback-error1' => 'Fejl: Ukendt resultat fra API',
+'feedback-error2' => 'Fejl: Redigering mislykkedes',
+'feedback-error3' => 'Fejl: Intet svar fra API',
+'feedback-thanks' => 'Tak! Dine tilbagemeldinger er blevet noteret på siden "[$2 $1]".',
+'feedback-close' => 'Færdig',
+'feedback-bugcheck' => 'Skønt! Men tjek venligst, at det ikke er en af de [$1 kendte fejl].',
+'feedback-bugnew' => 'Jeg har kontrolleret. Rapporter en ny fejl.',
+
+# API errors
+'api-error-badaccess-groups' => 'Du har ikke tilladelse til at overføre filer til denne wiki.',
+'api-error-badtoken' => 'Intern fejl: ugyldigt mærke.',
+'api-error-copyuploaddisabled' => 'At lægge filer op via hjemmesideadresser er slået fra på denne server.',
+'api-error-duplicate' => 'Der er allerede {{PLURAL:$1|[$2 en anden fil]|[$2 nogle andre filer]}} med samme indhold på webstedet.',
+'api-error-duplicate-archive' => 'Der var allerede {{PLURAL:$1|en [$2 anden fil]|[$2 nogle andre filer]}} med samme indhold på webstedet, men {{PLURAL:$1|den|de}} blev slettet.',
+'api-error-duplicate-archive-popup-title' => 'Duplet af {{PLURAL:$1|fil|filer}}, der allerede er slettet',
+'api-error-duplicate-popup-title' => 'Duplet {{PLURAL:$1|fil|filer}}',
+'api-error-empty-file' => 'Den fil du indsendte var tom.',
+'api-error-emptypage' => 'Det er ikke tilladt at oprette nye, tomme sider.',
+'api-error-fetchfileerror' => 'Intern fejl: noget gik galt under hentningen af filen.',
+'api-error-file-too-large' => 'Den fil du indsendte var for stor.',
+'api-error-filename-tooshort' => 'Filnavnet er for kort.',
+'api-error-filetype-banned' => 'Denne type fil er ikke tilladt.',
+'api-error-filetype-missing' => 'Filen mangler en filendelse.',
+'api-error-hookaborted' => 'Ændringen, du forsøgte at gøre, blev afbrudt af en udvidelsestilkobling.',
+'api-error-http' => 'Intern fejl: Kan ikke forbinde til serveren.',
+'api-error-illegal-filename' => 'Filnavnet er ikke tilladt.',
+'api-error-internal-error' => 'Intern fejl: noget gik galt med behandlingen af din filoplægning på wikien.',
+'api-error-invalid-file-key' => 'Intern fejl: filen blev ikke fundet på den midlertidige lagerplads.',
+'api-error-missingparam' => 'Intern fejl: manglende parametre i anmodning.',
+'api-error-missingresult' => 'Intern fejl: kunne ikke afgøre om kopieringen lykkedes.',
+'api-error-mustbeloggedin' => 'Du skal være logget på for at kunne lægge filer op.',
+'api-error-mustbeposted' => 'Intern fejl: anmodningen kræver brug af HTTP POST.',
+'api-error-noimageinfo' => 'Oplægningen lykkedes, men serveren gav os ikke nogen oplysninger om filen.',
+'api-error-nomodule' => 'Intern fejl: intet modul til oplægning indstillet.',
+'api-error-ok-but-empty' => 'Intern fejl: intet svar fra serveren.',
+'api-error-overwrite' => 'Det er ikke tilladt at overskrive en eksisterende fil.',
+'api-error-stashfailed' => 'Intern fejl: serveren kunne ikke gemme midlertidig fil.',
+'api-error-timeout' => 'Serveren svarede ikke tilbage inden for den forventede tid.',
+'api-error-unclassified' => 'En ukendt fejl opstod.',
+'api-error-unknown-code' => 'Ukendt fejl: "$1"',
+'api-error-unknown-error' => 'Intern fejl: noget gik galt under forsøget på at lægge din fil op.',
+'api-error-unknown-warning' => 'Ukendt advarsel: $1',
+'api-error-unknownerror' => 'Ukendt fejl: "$1".',
+'api-error-uploaddisabled' => 'Oplægning af filer er slået fra på denne wiki.',
+'api-error-verification-error' => 'Denne fil kan være beskadiget, eller den har måske en forkert filendelse.',
+
);
diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php
index 7a45801a..dff691b1 100644
--- a/languages/messages/MessagesDe.php
+++ b/languages/messages/MessagesDe.php
@@ -112,6 +112,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'MediaWiki-Systemnachrichten', 'Systemnachrichten' ),
'Allpages' => array( 'Alle_Seiten' ),
'Ancientpages' => array( 'Älteste_Seiten' ),
+ 'Badtitle' => array( 'Ungültiger_Seitenname' ),
'Blankpage' => array( 'Leerseite', 'Leere_Seite' ),
'Block' => array( 'Sperren' ),
'Blockme' => array( 'Proxy-Sperre' ),
@@ -164,7 +165,7 @@ $specialPageAliases = array(
'Newimages' => array( 'Neue_Dateien' ),
'Newpages' => array( 'Neue_Seiten' ),
'PasswordReset' => array( 'Passwort_neu_vergeben' ),
- 'PermanentLink' => array( 'Permanenter_Link' ),
+ 'PermanentLink' => array( 'Permanenter_Link', 'Permalink' ),
'Popularpages' => array( 'Beliebteste_Seiten' ),
'Preferences' => array( 'Einstellungen' ),
'Prefixindex' => array( 'Präfixindex' ),
@@ -193,6 +194,7 @@ $specialPageAliases = array(
'Unusedtemplates' => array( 'Unbenutzte_Vorlagen' ),
'Unwatchedpages' => array( 'Ignorierte_Seiten', 'Unbeobachtete_Seiten' ),
'Upload' => array( 'Hochladen' ),
+ 'UploadStash' => array( 'Hochladespeicher' ),
'Userlogin' => array( 'Anmelden' ),
'Userlogout' => array( 'Abmelden' ),
'Userrights' => array( 'Benutzerrechte' ),
@@ -239,132 +241,134 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
- 'notoc' => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__KEINE_GALERIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INHALTSVERZEICHNIS__', '__TOC__' ),
- 'noeditsection' => array( '0', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__KEINKOPF__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'JETZIGER_MONAT_1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'JETZIGER_MONATSNAME_KURZ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'JETZIGER_KALENDERTAG_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'JETZIGE_STUNDE', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALER_MONAT', 'LOKALER_MONAT_2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALER_MONAT_1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKALER_MONATSNAME', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LOKALER_MONATSNAME_KURZ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALER_KALENDERTAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALER_KALENDERTAG_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKALER_WOCHENTAG', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKALES_JAHR', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALE_UHRZEIT', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKALE_STUNDE', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'DATEIANZAHL', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'BEARBEITUNGSANZAHL', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'BETRACHTUNGEN', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'SEITENNAME', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SEITENNAME_URL', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAMENSRAUM', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NAMENSRAUM_URL', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'DISKUSSIONSNAMENSRAUM', 'DISK_NR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'DISKUSSIONSNAMENSRAUM_URL', 'DISK_NR_URL', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'HAUPTNAMENSRAUM_URL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'VOLLER_SEITENNAME', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'DISKUSSIONSSEITE_URL', 'DISK_URL', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'subst' => array( '0', 'ERS:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'miniatur', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'rechts', 'right' ),
- 'img_left' => array( '1', 'links', 'left' ),
- 'img_none' => array( '1', 'ohne', 'none' ),
- 'img_center' => array( '1', 'zentriert', 'center', 'centre' ),
- 'img_framed' => array( '1', 'gerahmt', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'rahmenlos', 'frameless' ),
- 'img_page' => array( '1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'rand', 'border' ),
- 'img_sub' => array( '1', 'tiefgestellt', 'sub' ),
- 'img_super' => array( '1', 'hochgestellt', 'super', 'sup' ),
- 'img_link' => array( '1', 'verweis=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'alternativtext=$1', 'alt=$1' ),
- 'int' => array( '0', 'NACHRICHT:', 'INT:' ),
- 'sitename' => array( '1', 'PROJEKTNAME', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'nse' => array( '0', 'NR_URL:', 'NSE:' ),
- 'localurl' => array( '0', 'LOKALE_URL:', 'LOCALURL:' ),
- 'articlepath' => array( '0', 'ARTIKELPFAD', 'ARTICLEPATH' ),
- 'scriptpath' => array( '0', 'SKRIPTPFAD', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'STYLEPFAD', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GESCHLECHT:', 'GENDER:' ),
- 'currentweek' => array( '1', 'JETZIGE_KALENDERWOCHE', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'LOKALER_WOCHENTAG_ZAHL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'REVISIONSID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'REVISIONSTAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'REVISIONSTAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'REVISIONSMONAT', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'REVISIONSMONAT1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'REVISIONSJAHR', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'REVISIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'REVISIONSBENUTZER', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
- 'lcfirst' => array( '0', 'INITIAL_KLEIN:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'INITIAL_GROSS:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KLEIN:', 'LC:' ),
- 'uc' => array( '0', 'GROSS:', 'UC:' ),
- 'raw' => array( '0', 'ROH:', 'RAW:' ),
- 'displaytitle' => array( '1', 'SEITENTITEL', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__NEUER_ABSCHNITTSLINK__', '__PLUS_LINK__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__KEIN_NEUER_ABSCHNITTSLINK__', '__KEIN_PLUS_LINK__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'JETZIGE_VERSION', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLENKODIERT:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'SPRUNGMARKEENKODIERT:', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'JETZIGER_ZEITSTEMPEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKALER_ZEITSTEMPEL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'TEXTAUSRICHTUNG', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#SPRACHE:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'INHALTSSPRACHE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'SEITEN_IM_NAMENSRAUM:', 'SEITEN_NR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ADMINANZAHL', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ZAHLENFORMAT', 'FORMATNUM' ),
- 'padleft' => array( '0', 'FÃœLLENLINKS', 'PADLEFT' ),
- 'padright' => array( '0', 'FÃœLLENRECHTS', 'PADRIGHT' ),
- 'special' => array( '0', 'spezial', 'special' ),
- 'defaultsort' => array( '1', 'SORTIERUNG:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'DATEIPFAD:', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
- 'index' => array( '1', '__INDIZIEREN__', '__INDEX__' ),
- 'noindex' => array( '1', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'DATUMSFORMAT', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
+ 'notoc' => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__KEINE_GALERIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INHALTSVERZEICHNIS__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__KEINKOPF__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'JETZIGER_MONAT_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'JETZIGER_MONATSNAME_KURZ', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'JETZIGER_KALENDERTAG_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'JETZIGE_STUNDE', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALER_MONAT', 'LOKALER_MONAT_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALER_MONAT_1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKALER_MONATSNAME', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKALER_MONATSNAME_KURZ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALER_KALENDERTAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALER_KALENDERTAG_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKALER_WOCHENTAG', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALES_JAHR', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALE_UHRZEIT', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALE_STUNDE', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'DATEIANZAHL', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'BEARBEITUNGSANZAHL', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'BETRACHTUNGEN', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'SEITENNAME', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SEITENNAME_URL', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAMENSRAUM', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NAMENSRAUM_URL', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUSSIONSNAMENSRAUM', 'DISK_NR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUSSIONSNAMENSRAUM_URL', 'DISK_NR_URL', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'HAUPTNAMENSRAUM_URL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'VOLLER_SEITENNAME', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'DISKUSSIONSSEITE_URL', 'DISK_URL', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'subst' => array( '0', 'ERS:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'miniatur', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'rechts', 'right' ),
+ 'img_left' => array( '1', 'links', 'left' ),
+ 'img_none' => array( '1', 'ohne', 'none' ),
+ 'img_center' => array( '1', 'zentriert', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'gerahmt', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'rahmenlos', 'frameless' ),
+ 'img_page' => array( '1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'rand', 'border' ),
+ 'img_sub' => array( '1', 'tiefgestellt', 'sub' ),
+ 'img_super' => array( '1', 'hochgestellt', 'super', 'sup' ),
+ 'img_link' => array( '1', 'verweis=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'alternativtext=$1', 'alt=$1' ),
+ 'int' => array( '0', 'NACHRICHT:', 'INT:' ),
+ 'sitename' => array( '1', 'PROJEKTNAME', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'nse' => array( '0', 'NR_URL:', 'NSE:' ),
+ 'localurl' => array( '0', 'LOKALE_URL:', 'LOCALURL:' ),
+ 'articlepath' => array( '0', 'ARTIKELPFAD', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'SEITENID', 'PAGEID' ),
+ 'scriptpath' => array( '0', 'SKRIPTPFAD', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'STYLEPFAD', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GESCHLECHT:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'JETZIGE_KALENDERWOCHE', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'LOKALER_WOCHENTAG_ZAHL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'REVISIONSID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'REVISIONSTAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'REVISIONSTAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'REVISIONSMONAT', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'REVISIONSMONAT1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'REVISIONSJAHR', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'REVISIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'REVISIONSBENUTZER', 'REVISIONUSER' ),
+ 'fullurl' => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
+ 'canonicalurl' => array( '0', 'KANONISCHE_URL:', 'CANONICALURL:' ),
+ 'lcfirst' => array( '0', 'INITIAL_KLEIN:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'INITIAL_GROSS:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KLEIN:', 'LC:' ),
+ 'uc' => array( '0', 'GROSS:', 'UC:' ),
+ 'raw' => array( '0', 'ROH:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'SEITENTITEL', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__NEUER_ABSCHNITTSLINK__', '__PLUS_LINK__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__KEIN_NEUER_ABSCHNITTSLINK__', '__KEIN_PLUS_LINK__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'JETZIGE_VERSION', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLENKODIERT:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'SPRUNGMARKEENKODIERT:', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'JETZIGER_ZEITSTEMPEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKALER_ZEITSTEMPEL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'TEXTAUSRICHTUNG', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#SPRACHE:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'INHALTSSPRACHE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'SEITEN_IM_NAMENSRAUM:', 'SEITEN_NR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ADMINANZAHL', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ZAHLENFORMAT', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'FÃœLLENLINKS', 'PADLEFT' ),
+ 'padright' => array( '0', 'FÃœLLENRECHTS', 'PADRIGHT' ),
+ 'special' => array( '0', 'spezial', 'special' ),
+ 'defaultsort' => array( '1', 'SORTIERUNG:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'DATEIPFAD:', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDIZIEREN__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'DATUMSFORMAT', 'formatdate', 'dateformat' ),
);
$imageFiles = array(
@@ -730,21 +734,23 @@ Falls dies nicht zutrifft, hast du eventuell einen Fehler in der Software gefun
'badarticleerror' => 'Diese Aktion kann auf diese Seite nicht angewendet werden.',
'cannotdelete' => 'Die Seite oder Datei „$1“ kann nicht gelöscht werden.
Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
+'cannotdelete-title' => 'Seite „$1“ kann nicht gelöscht 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:',
-'perfcachedts' => 'Diese Daten stammen aus dem Cache, letzte Aktualisierung: $2, $3 Uhr',
+'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.',
+'perfcachedts' => 'Diese Daten stammen aus dem Cache. Der Zeitpunkt der letzten Aktualisierung: $1. Maximal {{PLURAL:$4|ein Ergebnis ist|$4 Ergebnisse sind}} im Cache verfügbar.',
'querypage-no-updates' => "'''Die Aktualisierungsfunktion dieser Seite ist zurzeit deaktiviert. Die Daten werden bis auf Weiteres nicht erneuert.'''",
'wrong_wfQuery_params' => 'Falsche Parameter für wfQuery()<br />
Funktion: $1<br />
Abfrage: $2',
'viewsource' => 'Quelltext anzeigen',
-'viewsourcefor' => 'von $1',
+'viewsource-title' => 'Quelltext von Seite $1 ansehen',
'actionthrottled' => 'Aktionsanzahl limitiert',
'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Maßnahme 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.',
'protectedpagetext' => 'Diese Seite wurde geschützt, um Bearbeitungen zu verhindern.',
'viewsourcetext' => 'Du kannst den Quelltext dieser Seite betrachten und kopieren:',
+'viewyourtext' => "Du kannst den Quelltext '''deiner Bearbeitung''' dieser Seite betrachten und kopieren:",
'protectedinterface' => 'Diese Seite enthält Text für die Benutzeroberfläche der Software und ist geschützt, um Missbrauch vorzubeugen.',
'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
@@ -846,6 +852,7 @@ Besucher, die diese IP-Adresse verwenden, können momentan keine Benutzerkonten
'noemailprefs' => 'Gib eine E-Mail-Adresse in den Einstellungen an, damit die nachfolgenden Funktionen zur Verfügung stehen.',
'emailconfirmlink' => 'E-Mail-Adresse bestätigen (authentifizieren).',
'invalidemailaddress' => 'Die E-Mail-Adresse wird nicht akzeptiert, weil sie ein ungültiges Format (eventuell ungültige Zeichen) zu haben scheint. Bitte gib eine korrekte Adresse ein oder leere das Feld.',
+'cannotchangeemail' => 'E-Mail-Adressen können in diesem Wiki nicht geändert werden.',
'accountcreated' => 'Benutzerkonto erstellt',
'accountcreatedtext' => 'Das Benutzerkonto $1 wurde eingerichtet.',
'createaccount-title' => 'Erstellung eines Benutzerkontos für {{SITENAME}}',
@@ -861,6 +868,7 @@ Bitte warte, bevor du es erneut probierst.',
# E-mail sending
'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
+'user-mail-no-addy' => 'Versuchte eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden',
# Change password dialog
'resetpass' => 'Passwort ändern',
@@ -881,29 +889,44 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
'resetpass-temp-password' => 'Temporäres Passwort:',
# Special:PasswordReset
-'passwordreset' => 'Passwort zurücksetzen',
-'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen deines Benutzerkontos zu erhalten.',
-'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-username' => 'Benutzername:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'E-Mail-Adresse:',
-'passwordreset-emailtitle' => 'Benutzerkontoinformationen auf {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Erinnerung an deine Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
+'passwordreset' => 'Passwort zurücksetzen',
+'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen deines Benutzerkontos zu erhalten.',
+'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-username' => 'Benutzername:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
+'passwordreset-capture-help' => 'Sofern Du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl dir angezeigt, als auch dem Benutzer zugesandt.',
+'passwordreset-email' => 'E-Mail-Adresse:',
+'passwordreset-emailtitle' => 'Benutzerkontoinformationen auf {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Erinnerung an deine 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.
Du solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht länger ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.',
-'passwordreset-emailtext-user' => 'Benutzer $1 auf {{SITENAME}} hat eine Erinnerung an deine Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
+'passwordreset-emailtext-user' => 'Benutzer $1 auf {{SITENAME}} hat eine Erinnerung an deine 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. Du solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.',
-'passwordreset-emailelement' => 'Benutzername: $1
+'passwordreset-emailelement' => 'Benutzername: $1
Temporäres Passwort: $2',
-'passwordreset-emailsent' => 'Eine Erinnerung wurde per E-Mail versandt.',
+'passwordreset-emailsent' => 'Eine Erinnerung wurde per E-Mail versandt.',
+'passwordreset-emailsent-capture' => 'Die unten angezeigte Erinnerungs-E-Mail wurde abgeschickt.',
+'passwordreset-emailerror-capture' => 'Die unten angezeigte Erinnerungs-E-Mail wurde generiert, allerdings ist der Versand an den Benutzer gescheitert: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-Mail-Adresse ändern',
+'changeemail-header' => 'E-Mail-Adresse ändern',
+'changeemail-text' => 'Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Du musst dein Passwort angeben, um diese Änderung zu bestätigen.',
+'changeemail-no-info' => 'Du musst angemeldet sein, um direkt auf diese Seite zugreifen zu können.',
+'changeemail-oldemail' => 'Aktuelle E-Mail-Adresse:',
+'changeemail-newemail' => 'Neue E-Mail-Adresse:',
+'changeemail-none' => '(keine)',
+'changeemail-submit' => 'E-Mail-Adresse ändern',
+'changeemail-cancel' => 'Abbrechen',
# Edit page toolbar
'bold_sample' => 'Fetter Text',
@@ -972,9 +995,6 @@ Du kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange kei
Deine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
Bitte füge alle Informationen jeder Anfrage hinzu, die du stellt.",
'blockednoreason' => 'keine Begründung angegeben',
-'blockedoriginalsource' => "Der Quelltext von '''$1''' wird hier angezeigt:",
-'blockededitsource' => "Der Quelltext '''deiner Änderungen''' an '''$1''':",
-'whitelistedittitle' => 'Zum Bearbeiten ist es erforderlich, angemeldet zu sein',
'whitelistedittext' => 'Du musst dich $1, um Seiten bearbeiten zu können.',
'confirmedittext' => 'Du musst deine E-Mail-Adresse erst bestätigen, bevor du Bearbeitungen durchführen kannst. Bitte ergänze und bestätige deine E-Mail in den [[Special:Preferences|Einstellungen]].',
'nosuchsectiontitle' => 'Abschnitt nicht gefunden',
@@ -1058,7 +1078,7 @@ Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränku
Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast
(siehe $1 für weitere Details). '''ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
-'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist $1 KB groß. Dies ist größer als das erlaubte Maximum von $2 KB.'''
+'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobyte}} groß. Dies ist größer als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobyte}}.'''
Er kann nicht gespeichert werden.",
'readonlywarning' => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass deine Änderungen derzeit nicht gespeichert werden können.
Sichere den Text bitte lokal auf deinem Computer und versuche zu einem späteren Zeitpunkt, die Änderungen zu übertragen.'''
@@ -1221,8 +1241,6 @@ Andere Administratoren auf {{SITENAME}} haben Zugriff auf den versteckten Inhalt
'revdelete-unsuppress' => 'Einschränkungen für wiederhergestellte Versionen aufheben',
'revdelete-log' => 'Grund:',
'revdelete-submit' => 'Auf gewählte {{PLURAL:$1|Version|Versionen}} anwenden',
-'revdelete-logentry' => 'änderte die Versionsansicht von „[[$1]]“',
-'logdelete-logentry' => 'änderte die Sichtbarkeit von „[[$1]]“',
'revdelete-success' => "'''Die Versionsansicht wurde aktualisiert.'''",
'revdelete-failure' => "'''Die Versionssichtbarkeit konnte nicht aktualisiert werden:'''
$1",
@@ -1234,15 +1252,6 @@ $1",
'revdel-restore-visible' => 'sichtbare Versionen',
'pagehist' => 'Versionsgeschichte',
'deletedhist' => 'Gelöschte Versionen',
-'revdelete-content' => 'Seiteninhalt',
-'revdelete-summary' => 'Zusammenfassungskommentar',
-'revdelete-uname' => 'Benutzername',
-'revdelete-restricted' => 'Einschränkungen gelten auch für Administratoren',
-'revdelete-unrestricted' => 'Einschränkungen für Administratoren aufgehoben',
-'revdelete-hid' => 'versteckte $1',
-'revdelete-unhid' => 'machte $1 wieder öffentlich',
-'revdelete-log-message' => '$1 für $2 {{PLURAL:$2|Version|Versionen}}',
-'logdelete-log-message' => '$1 für $2 {{PLURAL:$2|Logbucheintrag|Logbucheinträge}}',
'revdelete-hide-current' => 'Fehler beim Verstecken des Eintrags vom $1, $2 Uhr: Dies ist die aktuelle Version.
Sie kann nicht versteckt werden.',
'revdelete-show-no-access' => 'Fehler beim Anzeigen des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.
@@ -1397,12 +1406,14 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
'prefs-rc' => 'Letzte Änderungen',
'prefs-watchlist' => 'Beobachtungsliste',
'prefs-watchlist-days' => 'Anzahl der Tage, die die Beobachtungsliste standardmäßig umfassen soll:',
-'prefs-watchlist-days-max' => 'Maximal 7 Tage',
+'prefs-watchlist-days-max' => 'Maximal {{PLURAL:$1|ein Tag|$1 Tage}}',
'prefs-watchlist-edits' => 'Maximale Zahl der Einträge:',
'prefs-watchlist-edits-max' => 'Maximale Anzahl: 1000',
'prefs-watchlist-token' => 'Beobachtungslisten-Token:',
'prefs-misc' => 'Verschiedenes',
'prefs-resetpass' => 'Passwort ändern',
+'prefs-changeemail' => 'E-Mail-Adresse ändern',
+'prefs-setemail' => 'E-Mail-Adresse festlegen',
'prefs-email' => 'E-Mail-Optionen',
'prefs-rendering' => 'Aussehen',
'saveprefs' => 'Einstellungen speichern',
@@ -1464,6 +1475,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'yourrealname' => 'Bürgerlicher Name:',
'yourlanguage' => 'Sprache der Benutzeroberfläche:',
'yourvariant' => 'Sprachvariante:',
+'prefs-help-variant' => 'Die bevorzugte Schreibvariante oder Orthografie, in der die Wikiseiten angezeigt werden sollen.',
'yournick' => 'Signatur:',
'prefs-help-signature' => 'Beiträge auf Diskussionsseiten sollten mit „<nowiki>~~~~</nowiki>“ signiert werden, was dann in die Signatur mit Zeitstempel umgewandelt wird.',
'badsig' => 'Die Syntax der Signatur ist ungültig; bitte HTML überprüfen.',
@@ -1502,7 +1514,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'userrights-lookup-user' => 'Gruppenzugehörigkeit verwalten',
'userrights-user-editname' => 'Benutzername:',
'editusergroup' => 'Benutzerrechte bearbeiten',
-'editinguser' => "Ändere Benutzerrechte von '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ändere Benutzerrechte von '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Benutzer-Gruppenzugehörigkeit bearbeiten',
'saveusergroups' => 'Gruppenzugehörigkeit ändern',
'userrights-groupsmember' => 'Mitglied von:',
@@ -1596,13 +1608,13 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'right-autopatrol' => 'Eigene Bearbeitungen automatisch als kontrolliert markieren',
'right-patrolmarks' => 'Kontrollmarkierungen in den letzten Änderungen sehen',
'right-unwatchedpages' => 'Liste der unbeobachteten Seiten ansehen',
-'right-trackback' => 'Trackback übermitteln',
'right-mergehistory' => 'Versionsgeschichten von Seiten vereinen',
'right-userrights' => 'Benutzerrechte bearbeiten',
'right-userrights-interwiki' => 'Benutzerrechte in anderen Wikis bearbeiten',
'right-siteadmin' => 'Datenbank sperren und entsperren',
'right-override-export-depth' => 'Exportiere Seiten einschließlich verlinkter Seiten bis zu einer Tiefe von 5',
'right-sendemail' => 'E-Mails an andere Benutzer senden',
+'right-passwordreset' => 'Passwort eines Benutzers zurücksetzen',
# User rights log
'rightslog' => 'Rechte-Logbuch',
@@ -1636,16 +1648,17 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'action-suppressionlog' => 'das private Logbuch einzusehen',
'action-block' => 'den Benutzer zu sperren',
'action-protect' => 'den Schutzstatus von Seiten zu ändern',
+'action-rollback' => 'die Änderungen des letzten Bearbeiters einer bestimmten Seite schnell zurückzusetzen',
'action-import' => 'Seiten aus einem anderen Wiki zu importieren',
'action-importupload' => 'Seiten über das Hochladen einer Datei zu importieren',
'action-patrol' => 'die Bearbeitungen andere Benutzer zu kontrollieren',
'action-autopatrol' => 'eigene Bearbeitungen als kontrolliert zu markieren',
'action-unwatchedpages' => 'die Liste der unbeobachteten Seiten einzusehen',
-'action-trackback' => 'einen Trackback zu übertragen',
'action-mergehistory' => 'die Versionengeschichten von Seiten zu vereinen',
'action-userrights' => 'Benutzerrechte zu ändern',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
@@ -1679,6 +1692,7 @@ Stand: $4, $5 Uhr.",
'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit „|“):',
'rc_categories_any' => 'Alle',
'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Byte}} nach der Änderung',
'newsectionsummary' => 'Neuer Abschnitt /* $1 */',
'rc-enhanced-expand' => 'Details anzeigen (benötigt JavaScript)',
'rc-enhanced-hide' => 'Details verstecken',
@@ -1731,6 +1745,7 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
'ignorewarnings' => 'Warnungen ignorieren',
'minlength1' => 'Dateinamen müssen mindestens einen Buchstaben lang sein.',
'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche sie erneut hochzuladen.',
+'filename-toolong' => 'Dateinamen dürfen nicht größer als 240 Byte sein.',
'badfilename' => 'Der Dateiname wurde in „$1“ geändert.',
'filetype-mime-mismatch' => 'Dateierweiterung „.$1“ stimmt nicht mit dem MIME-Typ ($2) überein.',
'filetype-badmime' => 'Dateien mit dem MIME-Typ „$1“ dürfen nicht hochgeladen werden.',
@@ -1838,6 +1853,41 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
'upload-unknown-size' => 'Unbekannte Größe',
'upload-http-error' => 'Ein HTTP-Fehler ist aufgetreten: $1',
+# File backend
+'backend-fail-stream' => 'Die Datei $1 konnte nicht übertragen werden.',
+'backend-fail-backup' => 'Die Datei $1 konnte nicht gesichert werden.',
+'backend-fail-notexists' => 'Die Datei $1 ist nicht vorhanden.',
+'backend-fail-hashes' => 'Die Streuwerte der Datei konnten nicht zum Vergleichen abgerufen werden.',
+'backend-fail-notsame' => 'Es ist bereits eine Datei $1 vorhanden, die nicht identisch ist.',
+'backend-fail-invalidpath' => '$1 ist kein gültiger Pfad zum Speichern.',
+'backend-fail-delete' => 'Die Datei $1 konnte nicht gelöscht werden.',
+'backend-fail-alreadyexists' => 'Die Seite $1 ist bereits vorhanden',
+'backend-fail-store' => 'Die Datei $1 konnte nicht unter $2 gespeichert werden.',
+'backend-fail-copy' => 'Die Datei $1 konnte nicht nach $2 kopiert werden.',
+'backend-fail-move' => 'Die Datei $1 konnte nicht nach $2 verschoben werden.',
+'backend-fail-opentemp' => 'Die temporäre Datei konnte nicht geöffnet werden.',
+'backend-fail-writetemp' => 'Die temporäre Datei konnte nicht geschrieben werden.',
+'backend-fail-closetemp' => 'Die temporäre Datei konnte nicht geschlossen werden.',
+'backend-fail-read' => 'Die Datei $1 konnte nicht gelesen werden.',
+'backend-fail-create' => 'Die Datei $1 konnte nicht erstellt werden.',
+'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.',
+'backend-fail-internal' => 'Im Speicher-Backend „$1“ ist ein unbekannter Fehler aufgetreten.',
+'backend-fail-contenttype' => 'Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.',
+'backend-fail-batchsize' => 'Eine Stapelverarbeitungsdatei, die {{PLURAL:$1|eine Operation|$1 Operationen}} enthält, wurde an das Speicher-Backend gesandt. Die Begrenzung liegt allerdings bei {{PLURAL:$2|einer Operation|$2 Operationen}}.',
+
+# Lock manager
+'lockmanager-notlocked' => '„$1“ konnte nicht entsperrt werden, da keine Sperrung besteht.',
+'lockmanager-fail-closelock' => 'Die Sperrdatei für „$1“ konnte nicht geschlossen werden.',
+'lockmanager-fail-deletelock' => 'Die Sperrdatei für „$1“ konnte nicht gelöscht werden.',
+'lockmanager-fail-acquirelock' => 'Die Sperre für „$1“ konnte nicht abgerufen werden.',
+'lockmanager-fail-openlock' => 'Die Sperrdatei für „$1“ konnte nicht geöffnet werden.',
+'lockmanager-fail-releaselock' => 'Die Sperre für „$1“ konnte nicht freigegeben werden.',
+'lockmanager-fail-db-bucket' => 'Es konnte mit Sammelabruf $1 keine ausreichende Anzahl an Verbindungen zu Sperrdatenbanken hergestellt werden.',
+'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnte nicht freigegeben werden.',
+'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnte nicht freigegeben werden.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Es ist ein Fehler beim Öffnen der Datei zur ZIP-Überprüfung aufgetreten.',
'zip-wrong-format' => 'Die angegebene Datei ist keine ZIP-Datei.',
@@ -1854,6 +1904,7 @@ Sie kann daher keiner ordnungsgemäßen Sicherheitsüberprüfung unterzogen werd
'uploadstash-badtoken' => 'Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil die Sitzungsdaten abgelaufen sind. Bitte erneut versuchen.',
'uploadstash-errclear' => 'Das Entfernen der vorab gespeicherten Dateien war erfolglos.',
'uploadstash-refresh' => 'Liste der Dateien aktualisieren',
+'invalid-chunk-offset' => 'Ungültiger Startpunkt',
# img_auth script messages
'img-auth-accessdenied' => 'Zugriff verweigert',
@@ -1958,23 +2009,24 @@ Eine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.',
'filerevert-badversion' => 'Es gibt keine Version der Datei zu dem angegebenen Zeitpunkt.',
# File deletion
-'filedelete' => 'Lösche „$1“',
-'filedelete-legend' => 'Lösche Datei',
-'filedelete-intro' => "Du löschst die Datei '''„[[Media:$1|$1]]“''' inklusive ihrer Versionsgeschichte.",
-'filedelete-intro-old' => "Du löschst von der Datei '''„[[Media:$1|$1]]“''' die [$4 Version vom $2, $3 Uhr].",
-'filedelete-comment' => 'Grund:',
-'filedelete-submit' => 'Löschen',
-'filedelete-success' => "'''„$1“''' wurde gelöscht.",
-'filedelete-success-old' => "Von der Datei '''„[[Media:$1|$1]]“''' wurde die Version vom $2, $3 Uhr gelöscht.",
-'filedelete-nofile' => "'''„$1“''' ist nicht vorhanden.",
-'filedelete-nofile-old' => "Es gibt von '''„$1“''' keine archivierte Version mit den angegebenen Attributen.",
-'filedelete-otherreason' => 'Anderer/ergänzender Grund:',
-'filedelete-reason-otherlist' => 'Anderer Grund',
-'filedelete-reason-dropdown' => '* Allgemeine Löschgründe
+'filedelete' => 'Lösche „$1“',
+'filedelete-legend' => 'Lösche Datei',
+'filedelete-intro' => "Du löschst die Datei '''„[[Media:$1|$1]]“''' inklusive ihrer Versionsgeschichte.",
+'filedelete-intro-old' => "Du löschst von der Datei '''„[[Media:$1|$1]]“''' die [$4 Version vom $2, $3 Uhr].",
+'filedelete-comment' => 'Grund:',
+'filedelete-submit' => 'Löschen',
+'filedelete-success' => "'''„$1“''' wurde gelöscht.",
+'filedelete-success-old' => "Von der Datei '''„[[Media:$1|$1]]“''' wurde die Version vom $2, $3 Uhr gelöscht.",
+'filedelete-nofile' => "'''„$1“''' ist nicht vorhanden.",
+'filedelete-nofile-old' => "Es gibt von '''„$1“''' keine archivierte Version mit den angegebenen Attributen.",
+'filedelete-otherreason' => 'Anderer/ergänzender Grund:',
+'filedelete-reason-otherlist' => 'Anderer Grund',
+'filedelete-reason-dropdown' => '* Allgemeine Löschgründe
** Urheberrechtsverletzung
** Duplikat',
-'filedelete-edit-reasonlist' => 'Löschgründe bearbeiten',
-'filedelete-maintenance' => 'Das Löschen und Wiederherstellen von Dateien ist aufgrund von Wartungsarbeiten vorübergehend deaktiviert.',
+'filedelete-edit-reasonlist' => 'Löschgründe bearbeiten',
+'filedelete-maintenance' => 'Das Löschen und Wiederherstellen von Dateien ist aufgrund von Wartungsarbeiten vorübergehend deaktiviert.',
+'filedelete-maintenance-title' => 'Die Datei kann nicht gelöscht werden.',
# MIME search
'mimesearch' => 'Suche nach MIME-Typ',
@@ -2073,6 +2125,8 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
'wantedpages' => 'Gewünschte Seiten',
'wantedpages-badtitle' => 'Ungültiger Titel im Ergebnis: $1',
'wantedfiles' => 'Gewünschte Dateien',
+'wantedfiletext-cat' => 'Die folgenden Dateien werden verwendet, sind jedoch nicht vorhanden. Vorhandene Dateien aus fremden Repositorien könnten dennoch hier aufgelistet sein, werden allerdings <del>durchgestrichen</del>. Zusätzlich werden Seiten, die nicht vorhandene Dateien enthalten, in die [[:$1]] eingeordnet.',
+'wantedfiletext-nocat' => 'Die folgenden Dateien werden verwendet, sind jedoch nicht vorhanden. Vorhandene Dateien aus fremden Repositorien könnten dennoch hier aufgelistet sein, werden allerdings <del>durchgestrichen</del>.',
'wantedtemplates' => 'Gewünschte Vorlagen',
'mostlinked' => 'Meistverlinkte Seiten',
'mostlinkedcategories' => 'Meistbenutzte Kategorien',
@@ -2081,6 +2135,7 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
'mostimages' => 'Meistbenutzte Dateien',
'mostrevisions' => 'Seiten mit den meisten Versionen',
'prefixindex' => 'Alle Seiten (mit Präfix)',
+'prefixindex-namespace' => 'Alle Seiten mit Präfix (Namensraum $1)',
'shortpages' => 'Kurze Seiten',
'longpages' => 'Lange Seiten',
'deadendpages' => 'Nicht verlinkende Seiten',
@@ -2188,12 +2243,8 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
'activeusers-noresult' => 'Keine Benutzer gefunden.',
# Special:Log/newusers
-'newuserlogpage' => 'Neuanmeldungs-Logbuch',
-'newuserlogpagetext' => 'Dies ist ein Logbuch der neu erstellten Benutzerkonten.',
-'newuserlog-byemail' => 'das Passwort wurde per E-Mail versandt',
-'newuserlog-create-entry' => 'Benutzer wurde neu registriert',
-'newuserlog-create2-entry' => 'erstellte neues Benutzerkonto „$1“',
-'newuserlog-autocreate-entry' => 'Benutzerkonto wurde automatisch erstellt',
+'newuserlogpage' => 'Neuanmeldungs-Logbuch',
+'newuserlogpagetext' => 'Dies ist ein Logbuch der neu erstellten Benutzerkonten.',
# Special:ListGroupRights
'listgrouprights' => 'Benutzergruppenrechte',
@@ -2222,7 +2273,7 @@ Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgroup
'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer dir antworten kann.',
'usermailererror' => 'Das E-Mail-Objekt gab einen Fehler zurück:',
-'defemailsubject' => '{{SITENAME}}-E-Mail',
+'defemailsubject' => '{{SITENAME}} - E-Mail von Benutzer „$1“',
'usermaildisabled' => 'E-Mail-Empfang deaktiviert',
'usermaildisabledtext' => 'Du kannst in diesem Wiki keine E-Mails an andere Benutzer senden',
'noemailtitle' => 'Keine E-Mail-Adresse',
@@ -2279,7 +2330,7 @@ in der Übersicht der [[Special:RecentChanges|letzten Änderungen]] in Fettschri
'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen',
'watchlistcontains' => 'Deine Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.',
'iteminvalidname' => 'Problem mit dem Eintrag „$1“, ungültiger Name.',
-'wlnote' => "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten '''$1''' Änderungen}} der letzten {{PLURAL:$2|Stunde|'''$2''' Stunden}}.",
+'wlnote' => "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten '''$1''' Änderungen}} der letzten {{PLURAL:$2|Stunde|'''$2''' Stunden}}. Stand: $3, $4 Uhr.",
'wlshowlast' => 'Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3.',
'watchlist-options' => 'Anzeigeoptionen',
@@ -2339,8 +2390,6 @@ Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
'actioncomplete' => 'Aktion beendet',
'actionfailed' => 'Aktion fehlgeschlagen',
'deletedtext' => '„$1“ wurde gelöscht. Im $2 findest du eine Liste der letzten Löschungen.',
-'deletedarticle' => 'löschte „[[$1]]“',
-'suppressedarticle' => 'veränderte die Sichtbarkeit von „[[$1]]“',
'dellogpage' => 'Lösch-Logbuch',
'dellogpagetext' => 'Dies ist das Logbuch der gelöschten Seiten und Dateien.',
'deletionlog' => 'Lösch-Logbuch',
@@ -2385,7 +2434,10 @@ Siehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle akt
'unprotectedarticle' => 'hob den Schutz von „[[$1]]“ auf',
'movedarticleprotection' => 'übertrug den Seitenschutz von „[[$2]]“ auf „[[$1]]“',
'protect-title' => 'Schutz ändern von „$1“',
+'protect-title-notallowed' => 'Schutz ansehen von „$1“',
'prot_1movedto2' => 'hat „[[$1]]“ nach „[[$2]]“ verschoben',
+'protect-badnamespace-title' => 'Nicht-schützbarer Namensraum',
+'protect-badnamespace-text' => 'Seiten dieses Namensraums können nicht geschützt werden.',
'protect-legend' => 'Seitenschutzstatus ändern',
'protectcomment' => 'Grund:',
'protectexpiry' => 'Sperrdauer:',
@@ -2403,6 +2455,7 @@ Siehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle akt
'protect-level-sysop' => 'Nur Administratoren',
'protect-summary-cascade' => 'kaskadierend',
'protect-expiring' => 'bis $2, $3 Uhr (UTC)',
+'protect-expiring-local' => 'bis $1',
'protect-expiry-indefinite' => 'unbeschränkt',
'protect-cascade' => 'Kaskadierende Sperre – alle in diese Seite eingebundenen Vorlagen werden ebenfalls gesperrt.',
'protect-cantedit' => 'Du kannst die Sperre dieser Seite nicht ändern, da du keine Berechtigung zum Bearbeiten der Seite hast.',
@@ -2461,7 +2514,6 @@ Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
'undeletereset' => 'Zurücksetzen',
'undeleteinvert' => 'Auswahl umkehren',
'undeletecomment' => 'Grund:',
-'undeletedarticle' => 'stellte „[[$1]]“ wieder her',
'undeletedrevisions' => '{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt',
'undeletedfiles' => '{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt',
@@ -2470,6 +2522,7 @@ Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
Im [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
'undelete-header' => 'Siehe das [[Special:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.',
+'undelete-search-title' => 'Nach gelöschten Seiten suchen',
'undelete-search-box' => 'Nach gelöschten Seiten suchen',
'undelete-search-prefix' => 'Suchbegriff (Wortanfang ohne Wildcards):',
'undelete-search-submit' => 'Suchen',
@@ -2478,6 +2531,7 @@ Im [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelösch
'undelete-bad-store-key' => 'Die Dateiversion mit dem Zeitstempel $1 konnte nicht wiederhergestellt werden: Die Datei war bereits vor dem Löschen nicht mehr vorhanden.',
'undelete-cleanup-error' => 'Fehler beim Löschen der unbenutzten Archiv-Version $1.',
'undelete-missing-filearchive' => 'Die Datei mit der Archiv-ID $1 kann nicht wiederhergestellt werden, da sie nicht in der Datenbank vorhanden ist. Möglicherweise wurde sie bereits wiederhergestellt.',
+'undelete-error' => 'Es beim Wiederherstellen der Seite ein Fehler aufgetreten.',
'undelete-error-short' => 'Fehler beim Wiederherstellen der Datei $1',
'undelete-error-long' => 'Es wurden Fehler beim Wiederherstellen einer Datei festgestellt:
@@ -2598,6 +2652,7 @@ Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperr
'blocklist-userblocks' => 'Benutzersperren ausblenden',
'blocklist-tempblocks' => 'Befristete Sperren ausblenden',
'blocklist-addressblocks' => 'Sperren einzelner IP-Adressen ausblenden',
+'blocklist-rangeblocks' => 'Bereichssperren ausblenden',
'blocklist-timestamp' => 'Zeitstempel',
'blocklist-target' => 'Ziel',
'blocklist-expiry' => 'Sperrdauer bis',
@@ -2620,6 +2675,7 @@ Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperr
'unblocklink' => 'Freigeben',
'change-blocklink' => 'Sperre ändern',
'contribslink' => 'Beiträge',
+'emaillink' => 'E-Mail senden',
'autoblocker' => 'Automatische Sperre, da du eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzt. Grund der Benutzersperre: „$2“.',
'blocklogpage' => 'Benutzersperr-Logbuch',
'blocklog-showlog' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt. Es folgt der Eintrag aus dem Benutzersperr-Logbuch:',
@@ -2739,9 +2795,6 @@ Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung
'movepage-page-moved' => 'Die Seite „$1“ wurde nach „$2“ verschoben.',
'movepage-page-unmoved' => 'Die Seite „$1“ konnte nicht nach „$2“ verschoben werden.',
'movepage-max-pages' => 'Die Maximalanzahl von $1 {{PLURAL:$1|Seite|Seiten}} wurde verschoben, Alle weiteren Seiten können nicht automatisch verschoben werden.',
-'1movedto2' => 'verschob „[[$1]]“ nach „[[$2]]“',
-'1movedto2_redir' => 'verschob „[[$1]]“ nach „[[$2]]“ und hat dabei eine Weiterleitung überschrieben',
-'move-redirect-suppressed' => 'Weiterleitung unterdrückt',
'movelogpage' => 'Verschiebungs-Logbuch',
'movelogpagetext' => 'Dies ist eine Liste aller verschobenen Seiten.',
'movesubpage' => '{{PLURAL:$1|Unterseite|Unterseiten}}',
@@ -2754,7 +2807,7 @@ Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung
Die Seite „[[:$1]]“ existiert bereits. Möchtest du diese löschen, um die Seite verschieben zu können?',
'delete_and_move_confirm' => 'Ja, Seite löschen',
-'delete_and_move_reason' => 'gelöscht, um Platz für Verschiebung zu machen',
+'delete_and_move_reason' => 'gelöscht, um Platz für die Verschiebung von „[[$1]]“ zu machen',
'selfmove' => 'Ursprungs- und Zielname sind gleich.
Eine Seite kann nicht auf sich selbst verschoben werden.',
'immobile-source-namespace' => 'Seiten des „$1“-Namensraums können nicht verschoben werden',
@@ -2785,9 +2838,11 @@ Die Datei kann in ein anderes MediaWiki-Wiki über die [[Special:Import|Importfu
Trage den oder die entsprechenden Seitentitel in das folgende Textfeld ein (pro Zeile jeweils nur eine Seite).
Alternativ ist der Export auch mit der Syntax [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] möglich, beispielsweise für die [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Alle Seiten exportieren',
'exportcuronly' => 'Nur die aktuelle Version der Seite exportieren',
'exportnohistory' => "----
'''Hinweis:''' Der Export kompletter Versionsgeschichten ist aus Performancegründen bis auf weiteres nicht möglich.",
+'exportlistauthors' => 'Für jede Seite die jeweils vollständige Liste der Bearbeiter einbeziehen',
'export-submit' => 'Seiten exportieren',
'export-addcattext' => 'Seiten aus folgender Kategorie hinzufügen:',
'export-addcat' => 'Hinzufügen',
@@ -2820,6 +2875,8 @@ Bitte besuche die Seiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Lokali
'thumbnail_error' => 'Fehler beim Erstellen des Vorschaubildes: $1',
'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',
+'thumbnail-dest-create' => 'Die Miniaturansicht konnte nicht am vorgesehenen Ort gespeichert werden',
'thumbnail_invalid_params' => 'Ungültige Thumbnail-Parameter',
'thumbnail_dest_directory' => 'Zielverzeichnis kann nicht erstellt werden.',
'thumbnail_image-type' => 'Bildtyp nicht unterstützt',
@@ -2864,6 +2921,11 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
'import-upload' => 'XML-Daten importieren',
'import-token-mismatch' => 'Verlust der Sessiondaten. Bitte versuche es erneut.',
'import-invalid-interwiki' => 'Aus dem angegebenen Wiki ist kein Import möglich.',
+'import-error-edit' => 'Die Seite „$1“ wurde nicht importiert, da du nicht berechtigt bist, sie zu bearbeiten.',
+'import-error-create' => 'Die Seite „$1“ wurde nicht importiert, da du nicht berechtigt bist, sie zu erstellen.',
+'import-error-interwiki' => 'Die Seite „$1“ wurde nicht importiert, da deren Name für externe Links (Interwiki) reserviert ist.',
+'import-error-special' => 'Die Seite „$1“ wurde nicht importiert, da sie zu einem besonderen Namensraum gehört, in dem keine Seiten möglich sind.',
+'import-error-invalid' => 'Seite „$1“ wurde nicht importiert, da deren Name ungültig ist.',
# Import log
'importlogpage' => 'Import-Logbuch',
@@ -2873,72 +2935,85 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
'import-logentry-interwiki' => 'importierte „$1“ (Transwiki)',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Version|Versionen}} von $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-Test',
+'javascripttest-disabled' => 'Diese Funktion ist deaktiviert.',
+'javascripttest-title' => '$1-Tests werden durchgeführt',
+'javascripttest-pagetext-noframework' => 'Diese Seite ist JavaSkript-Tests vorbehalten.',
+'javascripttest-pagetext-unknownframework' => 'Unbekanntes Framework „$1“.',
+'javascripttest-pagetext-frameworks' => 'Bitte eines der folgenden Frameworks auswählen: $1',
+'javascripttest-pagetext-skins' => 'Wähle eine Benutzeroberfläche zur Durchführung der Tests aus:',
+'javascripttest-qunit-intro' => 'Siehe die [$1 Dokumentation zu Tests] auf mediawiki.org',
+'javascripttest-qunit-heading' => 'MediaWiki-JavaSkript-QUnit-Tester',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Deine Benutzerseite',
-'tooltip-pt-anonuserpage' => 'Benutzerseite der IP-Adresse von der aus du Änderungen durchführst',
-'tooltip-pt-mytalk' => 'Deine Diskussionsseite',
-'tooltip-pt-anontalk' => 'Diskussion über Änderungen von dieser IP-Adresse',
-'tooltip-pt-preferences' => 'Eigene Einstellungen',
-'tooltip-pt-watchlist' => 'Liste der beobachteten Seiten',
-'tooltip-pt-mycontris' => 'Liste deiner Beiträge',
-'tooltip-pt-login' => 'Sich anzumelden wird zwar gerne gesehen, ist aber keine Pflicht.',
-'tooltip-pt-anonlogin' => 'Sich anzumelden wird zwar gerne gesehen, ist aber keine Pflicht.',
-'tooltip-pt-logout' => 'Abmelden',
-'tooltip-ca-talk' => 'Diskussion zum Seiteninhalt',
-'tooltip-ca-edit' => 'Seite bearbeiten. Bitte vor dem Speichern die Vorschaufunktion benutzen.',
-'tooltip-ca-addsection' => 'Neuen Abschnitt beginnen',
-'tooltip-ca-viewsource' => 'Diese Seite ist geschützt. Der Quelltext kann angesehen werden.',
-'tooltip-ca-history' => 'Frühere Versionen dieser Seite',
-'tooltip-ca-protect' => 'Diese Seite schützen',
-'tooltip-ca-unprotect' => 'Seitenschutz ändern',
-'tooltip-ca-delete' => 'Diese Seite löschen',
-'tooltip-ca-undelete' => 'Einträge wiederherstellen, bevor diese Seite gelöscht wurde',
-'tooltip-ca-move' => 'Diese Seite verschieben',
-'tooltip-ca-watch' => 'Diese Seite zur persönlichen Beobachtungsliste hinzufügen',
-'tooltip-ca-unwatch' => 'Diese Seite von der persönlichen Beobachtungsliste entfernen',
-'tooltip-search' => '{{SITENAME}} durchsuchen',
-'tooltip-search-go' => 'Gehe direkt zu der Seite, die exakt dem eingegebenen Namen entspricht.',
-'tooltip-search-fulltext' => 'Suche nach Seiten, die diesen Text enthalten',
-'tooltip-p-logo' => 'Hauptseite',
-'tooltip-n-mainpage' => 'Hauptseite anzeigen',
-'tooltip-n-mainpage-description' => 'Hauptseite besuchen',
-'tooltip-n-portal' => 'Ãœber das Projekt, was du tun kannst, wo was zu finden ist',
-'tooltip-n-currentevents' => 'Hintergrundinformationen zu aktuellen Ereignissen',
-'tooltip-n-recentchanges' => 'Liste der letzten Änderungen in {{SITENAME}}',
-'tooltip-n-randompage' => 'Zufällige Seite',
-'tooltip-n-help' => 'Hilfeseite anzeigen',
-'tooltip-t-whatlinkshere' => 'Liste aller Seiten, die hierher verlinken',
-'tooltip-t-recentchangeslinked' => 'Letzte Änderungen an Seiten, die von hier verlinkt sind',
-'tooltip-feed-rss' => 'RSS-Feed dieser Seite',
-'tooltip-feed-atom' => 'Atom-Feed dieser Seite',
-'tooltip-t-contributions' => 'Liste der Beiträge von diesem Benutzer ansehen',
-'tooltip-t-emailuser' => 'Eine E-Mail an diesen Benutzer senden',
-'tooltip-t-upload' => 'Dateien hochladen',
-'tooltip-t-specialpages' => 'Liste aller Spezialseiten',
-'tooltip-t-print' => 'Druckansicht dieser Seite',
-'tooltip-t-permalink' => 'Dauerhafter Link zu dieser Seitenversion',
-'tooltip-ca-nstab-main' => 'Seiteninhalt anzeigen',
-'tooltip-ca-nstab-user' => 'Benutzerseite anzeigen',
-'tooltip-ca-nstab-media' => 'Mediendateienseite anzeigen',
-'tooltip-ca-nstab-special' => 'Dies ist eine Spezialseite. Sie kann nicht bearbeitet werden.',
-'tooltip-ca-nstab-project' => 'Portalseite anzeigen',
-'tooltip-ca-nstab-image' => 'Dateiseite anzeigen',
-'tooltip-ca-nstab-mediawiki' => 'MediaWiki-Systemtext anzeigen',
-'tooltip-ca-nstab-template' => 'Vorlage anzeigen',
-'tooltip-ca-nstab-help' => 'Hilfeseite anzeigen',
-'tooltip-ca-nstab-category' => 'Kategorieseite anzeigen',
-'tooltip-minoredit' => 'Diese Änderung als klein markieren.',
-'tooltip-save' => 'Änderungen speichern',
-'tooltip-preview' => 'Vorschau der Änderungen an dieser Seite. Bitte vor dem Speichern benutzen!',
-'tooltip-diff' => 'Änderungen am Text zeigen',
-'tooltip-compareselectedversions' => 'Unterschied zwischen zwei ausgewählten Versionen dieser Seite anzeigen',
-'tooltip-watch' => 'Diese Seite zu deiner Beobachtungsliste hinzufügen',
-'tooltip-recreate' => 'Seite neu erstellen, obwohl sie gelöscht wurde',
-'tooltip-upload' => 'Hochladen starten',
-'tooltip-rollback' => 'Macht alle letzten Änderungen der Seite, die vom gleichen Benutzer vorgenommen worden sind, durch nur einen Klick rückgängig.',
-'tooltip-undo' => 'Macht lediglich diese eine Änderung rückgängig und zeigt das Resultat in der Vorschau an, damit in der Zusammenfassungszeile eine Begründung angegeben werden kann.',
-'tooltip-preferences-save' => 'Einstellungen speichern',
-'tooltip-summary' => 'Gib eine kurze Zusammenfassung ein.',
+'tooltip-pt-userpage' => 'Deine Benutzerseite',
+'tooltip-pt-anonuserpage' => 'Benutzerseite der IP-Adresse von der aus du Änderungen durchführst',
+'tooltip-pt-mytalk' => 'Deine Diskussionsseite',
+'tooltip-pt-anontalk' => 'Diskussion über Änderungen von dieser IP-Adresse',
+'tooltip-pt-preferences' => 'Eigene Einstellungen',
+'tooltip-pt-watchlist' => 'Liste der beobachteten Seiten',
+'tooltip-pt-mycontris' => 'Liste deiner Beiträge',
+'tooltip-pt-login' => 'Sich anzumelden wird zwar gerne gesehen, ist aber keine Pflicht.',
+'tooltip-pt-anonlogin' => 'Sich anzumelden wird zwar gerne gesehen, ist aber keine Pflicht.',
+'tooltip-pt-logout' => 'Abmelden',
+'tooltip-ca-talk' => 'Diskussion zum Seiteninhalt',
+'tooltip-ca-edit' => 'Seite bearbeiten. Bitte vor dem Speichern die Vorschaufunktion benutzen.',
+'tooltip-ca-addsection' => 'Neuen Abschnitt beginnen',
+'tooltip-ca-viewsource' => 'Diese Seite ist geschützt. Der Quelltext kann angesehen werden.',
+'tooltip-ca-history' => 'Frühere Versionen dieser Seite',
+'tooltip-ca-protect' => 'Diese Seite schützen',
+'tooltip-ca-unprotect' => 'Seitenschutz ändern',
+'tooltip-ca-delete' => 'Diese Seite löschen',
+'tooltip-ca-undelete' => 'Einträge wiederherstellen, bevor diese Seite gelöscht wurde',
+'tooltip-ca-move' => 'Diese Seite verschieben',
+'tooltip-ca-watch' => 'Diese Seite zur persönlichen Beobachtungsliste hinzufügen',
+'tooltip-ca-unwatch' => 'Diese Seite von der persönlichen Beobachtungsliste entfernen',
+'tooltip-search' => '{{SITENAME}} durchsuchen',
+'tooltip-search-go' => 'Gehe direkt zu der Seite, die exakt dem eingegebenen Namen entspricht.',
+'tooltip-search-fulltext' => 'Suche nach Seiten, die diesen Text enthalten',
+'tooltip-p-logo' => 'Hauptseite',
+'tooltip-n-mainpage' => 'Hauptseite anzeigen',
+'tooltip-n-mainpage-description' => 'Hauptseite besuchen',
+'tooltip-n-portal' => 'Ãœber das Projekt, was du tun kannst, wo was zu finden ist',
+'tooltip-n-currentevents' => 'Hintergrundinformationen zu aktuellen Ereignissen',
+'tooltip-n-recentchanges' => 'Liste der letzten Änderungen in {{SITENAME}}',
+'tooltip-n-randompage' => 'Zufällige Seite',
+'tooltip-n-help' => 'Hilfeseite anzeigen',
+'tooltip-t-whatlinkshere' => 'Liste aller Seiten, die hierher verlinken',
+'tooltip-t-recentchangeslinked' => 'Letzte Änderungen an Seiten, die von hier verlinkt sind',
+'tooltip-feed-rss' => 'RSS-Feed dieser Seite',
+'tooltip-feed-atom' => 'Atom-Feed dieser Seite',
+'tooltip-t-contributions' => 'Liste der Beiträge von diesem Benutzer ansehen',
+'tooltip-t-emailuser' => 'Eine E-Mail an diesen Benutzer senden',
+'tooltip-t-upload' => 'Dateien hochladen',
+'tooltip-t-specialpages' => 'Liste aller Spezialseiten',
+'tooltip-t-print' => 'Druckansicht dieser Seite',
+'tooltip-t-permalink' => 'Dauerhafter Link zu dieser Seitenversion',
+'tooltip-ca-nstab-main' => 'Seiteninhalt anzeigen',
+'tooltip-ca-nstab-user' => 'Benutzerseite anzeigen',
+'tooltip-ca-nstab-media' => 'Mediendateienseite anzeigen',
+'tooltip-ca-nstab-special' => 'Dies ist eine Spezialseite. Sie kann nicht bearbeitet werden.',
+'tooltip-ca-nstab-project' => 'Portalseite anzeigen',
+'tooltip-ca-nstab-image' => 'Dateiseite anzeigen',
+'tooltip-ca-nstab-mediawiki' => 'MediaWiki-Systemtext anzeigen',
+'tooltip-ca-nstab-template' => 'Vorlage anzeigen',
+'tooltip-ca-nstab-help' => 'Hilfeseite anzeigen',
+'tooltip-ca-nstab-category' => 'Kategorieseite anzeigen',
+'tooltip-minoredit' => 'Diese Änderung als klein markieren.',
+'tooltip-save' => 'Änderungen speichern',
+'tooltip-preview' => 'Vorschau der Änderungen an dieser Seite. Bitte vor dem Speichern benutzen!',
+'tooltip-diff' => 'Änderungen am Text zeigen',
+'tooltip-compareselectedversions' => 'Unterschied zwischen zwei ausgewählten Versionen dieser Seite anzeigen',
+'tooltip-watch' => 'Diese Seite zu deiner Beobachtungsliste hinzufügen',
+'tooltip-watchlistedit-normal-submit' => 'Einträge entfernen',
+'tooltip-watchlistedit-raw-submit' => 'Beobachtungsliste aktualisieren',
+'tooltip-recreate' => 'Seite neu erstellen, obwohl sie gelöscht wurde',
+'tooltip-upload' => 'Hochladen starten',
+'tooltip-rollback' => 'Macht alle letzten Änderungen der Seite, die vom gleichen Benutzer vorgenommen worden sind, durch nur einen Klick rückgängig.',
+'tooltip-undo' => 'Macht lediglich diese eine Änderung rückgängig und zeigt das Resultat in der Vorschau an, damit in der Zusammenfassungszeile eine Begründung angegeben werden kann.',
+'tooltip-preferences-save' => 'Einstellungen speichern',
+'tooltip-summary' => 'Gib eine kurze Zusammenfassung ein.',
# Stylesheets
'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
@@ -3037,9 +3112,6 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
# Patrol log
'patrol-log-page' => 'Kontroll-Logbuch',
'patrol-log-header' => 'Dies ist das Kontroll-Logbuch.',
-'patrol-log-line' => 'markierte $1 von „$2“ als kontrolliert $3',
-'patrol-log-auto' => '(automatisch)',
-'patrol-log-diff' => 'Version $1',
'log-show-hide-patrol' => 'Kontroll-Logbuch $1',
# Image deletion
@@ -3066,11 +3138,11 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
'file-info' => 'Dateigröße: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 Pixel, Dateigröße: $3, MIME-Typ: $4',
'file-info-size-pages' => '$1 × $2 Pixel, Dateigröße: $3, MIME-Typ: $4, $5 {{PLURAL:$5|Seite| Seiten}}',
-'file-nohires' => '<small>Keine höhere Auflösung vorhanden.</small>',
+'file-nohires' => 'Keine höhere Auflösung vorhanden.',
'svg-long-desc' => 'SVG-Datei, Basisgröße: $1 × $2 Pixel, Dateigröße: $3',
'show-big-image' => 'Volle Auflösung',
-'show-big-image-preview' => '<small>Größe dieser Vorschau: $1.</small>',
-'show-big-image-other' => '<small>Weitere Auflösungen: $1.</small>',
+'show-big-image-preview' => 'Größe dieser Vorschau: $1.',
+'show-big-image-other' => 'Weitere {{PLURAL:$2|Auflösung|Auflösungen}}: $1.',
'show-big-image-size' => '$1 × $2 Pixel',
'file-info-gif-looped' => 'Endlosschleife',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Bilder}}',
@@ -3090,6 +3162,13 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
'bydate' => 'nach Datum',
'sp-newimages-showfrom' => 'Zeige neue Dateien ab $1, $2 Uhr',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Sekunde|$1 Sekunden}}',
+'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
+'hours' => '{{PLURAL:$1|$1 Stunde|$1 Stunden}}',
+'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
+'ago' => 'vor $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3587,13 +3666,6 @@ Dieser Bestätigungscode ist gültig bis $4.',
'scarytranscludefailed' => '[Vorlageneinbindung für $1 ist gescheitert]',
'scarytranscludetoolong' => '[URL ist zu lang]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks für diese Seite:<br />
-$1',
-'trackbackremove' => '([$1 löschen])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback wurde erfolgreich gelöscht.',
-
# Delete conflict
'deletedwhileediting' => 'Achtung: Diese Seite wurde gelöscht, nachdem du angefangen hast sie zu bearbeiten!
Im [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Lösch-Logbuch] findest du den Grund für die Löschung. Wenn du die Seite speicherst, wird sie neu angelegt.',
@@ -3693,6 +3765,9 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
'hijri-calendar-m11' => 'Dhu l-qaʿda',
'hijri-calendar-m12' => 'Dhu l-hiddscha',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])',
+
# Core parser functions
'unknown_extension_tag' => 'Unbekanntes Parsertag „$1“',
'duplicate-defaultsort' => 'Achtung: Der Sortierungsschlüssel „$2“ überschreibt den vorher verwendeten Schlüssel „$1“.',
@@ -3791,13 +3866,16 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
'tags-hitcount' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
# Special:ComparePages
-'comparepages' => 'Seiten vergleichen',
-'compare-selector' => 'Seitenversionen vergleichen',
-'compare-page1' => 'Seite 1',
-'compare-page2' => 'Seite 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Vergleichen',
+'comparepages' => 'Seiten vergleichen',
+'compare-selector' => 'Seitenversionen vergleichen',
+'compare-page1' => 'Seite 1',
+'compare-page2' => 'Seite 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Vergleichen',
+'compare-invalid-title' => 'Der angegebene Seitenname ist ungültig.',
+'compare-title-not-exists' => 'Der angegebene Seitenname ist nicht vorhanden.',
+'compare-revision-not-exists' => 'Die angegebene Version ist nicht vorhanden.',
# Database error messages
'dberr-header' => 'Dieses Wiki hat ein Problem',
@@ -3824,4 +3902,90 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
'sqlite-has-fts' => 'Version $1 mit Unterstützung für die Volltextsuche',
'sqlite-no-fts' => 'Version $1 ohne Unterstützung für die Volltextsuche',
+# New logging system
+'logentry-delete-delete' => '$1 löschte Seite $3',
+'logentry-delete-restore' => '$1 stellte Seite $3 wieder her',
+'logentry-delete-event' => '$1 änderte die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4',
+'logentry-delete-revision' => '$1 änderte die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4',
+'logentry-delete-event-legacy' => '$1 änderte die Sichtbarkeit von Logbucheinträgen auf $3',
+'logentry-delete-revision-legacy' => '$1 änderte die Sichtbarkeit von Versionen der Seite $3',
+'logentry-suppress-delete' => '$1 unterdrückte Seite $3',
+'logentry-suppress-event' => '$1 änderte diskret die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4',
+'logentry-suppress-revision' => '$1 änderte diskret die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4',
+'logentry-suppress-event-legacy' => '$1 änderte diskret die Sichtbarkeit von Logbucheinträgen auf $3',
+'logentry-suppress-revision-legacy' => '$1 änderte diskret die Sichtbarkeit von Versionen der Seite $3',
+'revdelete-content-hid' => 'Inhalt versteckt',
+'revdelete-summary-hid' => 'Zusammenfassung versteckt',
+'revdelete-uname-hid' => 'Benutzername versteckt',
+'revdelete-content-unhid' => 'Inhalt freigegeben',
+'revdelete-summary-unhid' => 'Zusammenfassung freigegeben',
+'revdelete-uname-unhid' => 'Benutzername freigegeben',
+'revdelete-restricted' => 'Einschränkungen gelten auch für Administratoren',
+'revdelete-unrestricted' => 'Einschränkungen für Administratoren aufgehoben',
+'logentry-move-move' => '$1 verschob Seite $3 nach $4',
+'logentry-move-move-noredirect' => '$1 verschob Seite $3 nach $4 ohne dabei eine Weiterleitung anzulegen',
+'logentry-move-move_redir' => '$1 verschob Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
+'logentry-move-move_redir-noredirect' => '$1 verschob Seite $3 nach $4 und überschrieb dabei eine Weiterleitung ohne selbst eine Weiterleitung anzulegen',
+'logentry-patrol-patrol' => '$1 markierte Version $4 von Seite $3 als kontrolliert',
+'logentry-patrol-patrol-auto' => '$1 markierte automatisch Version $4 von Seite $3 als kontrolliert',
+'logentry-newusers-newusers' => '$1 erstellte ein Benutzerkonto',
+'logentry-newusers-create' => '$1 erstellte ein Benutzerkonto',
+'logentry-newusers-create2' => '$1 erstellte ein Benutzerkonto $3',
+'logentry-newusers-autocreate' => 'Benutzerkonto $1 wurde automatisch erstellt',
+'newuserlog-byemail' => 'das Passwort wurde per E-Mail versandt',
+
+# Feedback
+'feedback-bugornote' => 'Sofern Du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].
+Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von Dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.',
+'feedback-subject' => 'Betreff:',
+'feedback-message' => 'Nachricht:',
+'feedback-cancel' => 'Abbrechen',
+'feedback-submit' => 'Rückmeldung senden',
+'feedback-adding' => 'Rückmeldung wird zur Seite hinzugefügt …',
+'feedback-error1' => 'Fehler: Unbekanntes Ergebnis der API',
+'feedback-error2' => 'Fehler: Bearbeitung gescheitert',
+'feedback-error3' => 'Fehler: Keine Antwort von der API',
+'feedback-thanks' => 'Vielen Dank. Deine Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.',
+'feedback-close' => 'Erledigt',
+'feedback-bugcheck' => 'Super! Bitte überprüfe noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.',
+'feedback-bugnew' => 'Ich habe es überprüft. Den neuen Fehler melden.',
+
+# API errors
+'api-error-badaccess-groups' => 'Du hast nicht die Berechtigung Dateien in dieses Wiki hochzuladen.',
+'api-error-badtoken' => 'Interner Fehler: Der Token ist fehlerhaft.',
+'api-error-copyuploaddisabled' => 'Das Hochladen via URL wurde auf diesem Server deaktiviert.',
+'api-error-duplicate' => 'Es gibt im Wiki bereits {{PLURAL:$1|[$2 eine andere Datei]|[$2 mehrere andere Dateien]}} gleichen Inhalts.',
+'api-error-duplicate-archive' => 'Es {{PLURAL:$1|war bereits [$2 andere Datei]|waren bereits [$2 andere Dateien]}} gleichen Inhalts vorhanden. {{PLURAL:$1|Sie wurde|Sie wurden}} allerdings gelöscht.',
+'api-error-duplicate-archive-popup-title' => 'Doppelte {{PLURAL:$1|Datei, die bereits gelöscht wurde|Dateien, die bereits gelöscht wurden}}',
+'api-error-duplicate-popup-title' => 'Doppelt vorhandene {{PLURAL:$1|Datei|Dateien}}',
+'api-error-empty-file' => 'Die hochgeladene Datei war leer.',
+'api-error-emptypage' => 'Es ist nicht erlaubt, neue leere Seiten zu erstellen.',
+'api-error-fetchfileerror' => 'Interner Fehler: Beim Abrufen der Datei ist ein Fehler aufgetreten.',
+'api-error-file-too-large' => 'Die hochgeladene Datei war zu groß.',
+'api-error-filename-tooshort' => 'Der Dateiname ist zu kurz.',
+'api-error-filetype-banned' => 'Diese Dateiendung ist gesperrt.',
+'api-error-filetype-missing' => 'Die hochzuladende Datei hat keine Dateiendung.',
+'api-error-hookaborted' => 'Die von dir vorgesehene Anpassung kann nicht durchgeführt werden (Unterbrechung durch eine Programmschnittstelle).',
+'api-error-http' => 'Interner Fehler: Es konnte keine Verbindung zum Server hergestellt werden.',
+'api-error-illegal-filename' => 'Der Dateiname ist nicht erlaubt.',
+'api-error-internal-error' => 'Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei ins Wiki aufgetreten.',
+'api-error-invalid-file-key' => 'Interner Fehler: Die Datei wurde nicht im temporären Speicher gefunden.',
+'api-error-missingparam' => 'Interner Fehler: Der Anfrage fehlen Parameter.',
+'api-error-missingresult' => 'Interner Fehler: Es konnte nicht festgestellt werden, ob das Kopieren erfolgreich war.',
+'api-error-mustbeloggedin' => 'Um Dateien hochladen zu können, musst du angemeldet sein.',
+'api-error-mustbeposted' => 'Es liegt ein Programmfehler vor (es wird die falsche HTTP-Methode verwendet).',
+'api-error-noimageinfo' => 'Das Hochladen war erfolgreich, aber der Server kann keine Informationen zur Datei anzeigen.',
+'api-error-nomodule' => 'Interner Fehler: Es wurde kein Modul zum Hochladen festgelegt.',
+'api-error-ok-but-empty' => 'Interner Fehler: Der Server reagiert nicht.',
+'api-error-overwrite' => 'Das Ãœberschreiben einer vorhandenen Datei ist nicht erlaubt.',
+'api-error-stashfailed' => 'Interner Fehler: Der Server konnte keine temporäre Datei speichern.',
+'api-error-timeout' => 'Der Server hat nicht innerhalb der erwarteten Zeit reagiert.',
+'api-error-unclassified' => 'Ein unbekannter Fehler ist aufgetreten.',
+'api-error-unknown-code' => 'Unbekannter Fehler: „$1“',
+'api-error-unknown-error' => 'Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei aufgetreten.',
+'api-error-unknown-warning' => 'Unbekannte Warnung: $1',
+'api-error-unknownerror' => 'Unbekannter Fehler: „$1“',
+'api-error-uploaddisabled' => 'Das Hochladen ist in diesem Wiki deaktiviert.',
+'api-error-verification-error' => 'Die hochzuladende Datei ist entweder fehlerhaft oder hat keine Dateinamenserweiterung.',
+
);
diff --git a/languages/messages/MessagesDe_ch.php b/languages/messages/MessagesDe_ch.php
index 0d43d83e..685dde69 100644
--- a/languages/messages/MessagesDe_ch.php
+++ b/languages/messages/MessagesDe_ch.php
@@ -79,8 +79,7 @@ Bitte prüfe, ob du das Bild in voller Auflösung vorliegen hast und lade dieses
'img-auth-nologinnWL' => 'Du bist nicht angemeldet und „$1“ ist nicht in der weissen Liste.',
# Special:ListFiles
-'listfiles-summary' => 'Diese Spezialseite listet alle hochgeladenen Dateien auf. Standardmässig werden die zuletzt hochgeladenen Dateien zuerst angezeigt. Durch einen Klick auf die Spaltenüberschriften kann die Sortierung umgedreht werden oder es kann nach einer anderen Spalte sortiert werden.',
-'listfiles_size' => 'Grösse',
+'listfiles_size' => 'Grösse',
# File description page
'filehist-dimensions' => 'Masse',
diff --git a/languages/messages/MessagesDe_formal.php b/languages/messages/MessagesDe_formal.php
index 7d8b1b73..c7b7c206 100644
--- a/languages/messages/MessagesDe_formal.php
+++ b/languages/messages/MessagesDe_formal.php
@@ -57,6 +57,7 @@ Falls dies nicht der Fall ist, haben Sie eventuell einen Fehler in der Software
'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Maßnahme kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze haben Sie überschritten.
Bitte versuchen Sie es in ein paar Minuten erneut.',
'viewsourcetext' => 'Sie können den Quelltext dieser Seite betrachten und kopieren:',
+'viewyourtext' => "Sie können den Quelltext '''Ihrer Bearbeitung''' dieser Seite betrachten und kopieren:",
'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
Ziehen Sie bitte im Fall von Übersetzungen in Betracht, diese bei [//translatewiki.net/wiki/Main_Page?setlang=de-formal translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
@@ -130,6 +131,7 @@ Möglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein ne
# Special:PasswordReset
'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen Ihres Benutzerkontos zu erhalten.',
+'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
@@ -142,6 +144,10 @@ $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 ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes Passwort benutzen.',
+# Special:ChangeEmail
+'changeemail-text' => 'Füllen Sie dieses Formular vollständig aus, um Ihre E-Mail-Adresse zu ändern. Sie müssen Ihr Passwort angeben, um diese Änderung zu bestätigen.',
+'changeemail-no-info' => 'Sie müssen angemeldet sein, um direkt auf diese Seite zugreifen zu können.',
+
# Edit page toolbar
'sig_tip' => 'Ihre Signatur mit Zeitstempel',
@@ -178,7 +184,6 @@ Sie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange k
Ihre aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
Bitte fügen Sie alle Informationen jeder Anfrage hinzu, die Sie stellen.",
-'blockededitsource' => "Der Quelltext '''Ihrer Änderungen''' an '''$1''':",
'whitelistedittext' => 'Sie müssen sich $1, um Seiten bearbeiten zu können.',
'confirmedittext' => 'Sie müssen Ihre E-Mail-Adresse erst bestätigen, bevor Sie Bearbeitungen vornehmen können. Bitte ergänzen und bestätigen Sie Ihre E-Mail in den [[Special:Preferences|Einstellungen]].',
'nosuchsectiontext' => 'Sie haben versucht, einen Abschnitt zu bearbeiten, der nicht existiert.
@@ -241,7 +246,7 @@ Reichen Sie keine Texte ein, falls Sie nicht wollen, dass diese ohne Einschränk
Sie bestätigen hiermit auch, dass Sie diese Texte selbst geschrieben haben oder diese von einer gemeinfreien Quelle kopiert haben
(siehe $1 für weitere Details). '''ÜBERTRAGEN SIE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
-'longpageerror' => "'''Fehler: Der Text, den Sie zu speichern versuchen, ist $1 KB groß. Dies ist größer als das erlaubte Maximum von $2 KB.'''
+'longpageerror' => "'''Fehler: Der Text, den Sie zu speichern versuchen, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobyte}} groß. Dies ist größer als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobyte}}.'''
Er kann nicht gespeichert werden.",
'readonlywarning' => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass Ihre Änderungen derzeit nicht gespeichert werden können.
Sichern Sie den Text bitte lokal auf Ihrem Computer und versuchen Sie zu einem späteren Zeitpunkt, die Änderungen zu übertragen.'''
@@ -594,6 +599,11 @@ Bitte besuchen Sie die Seiten [//www.mediawiki.org/wiki/Localisation MediaWiki-L
Die Versionsdaten und Benutzernamen bleiben dabei erhalten.
Alle Transwiki-Import-Aktionen werden im [[Special:Log/import|Import-Logbuch]] protokolliert.',
'import-token-mismatch' => 'Verlust der Sessiondaten. Bitte versuchen Sie es erneut.',
+'import-error-edit' => 'Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu bearbeiten.',
+'import-error-create' => 'Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu erstellen.',
+
+# JavaScriptTest
+'javascripttest-pagetext-skins' => 'Wählen Sie eine Benutzeroberfläche zur Durchführung der Tests aus:',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Ihre Benutzerseite',
@@ -690,4 +700,15 @@ Sie können auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benu
'dberr-usegoogle' => 'Sie könnten in der Zwischenzeit mit Google suchen.',
'dberr-outofdate' => 'Beachten Sie, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.',
+# Feedback
+'feedback-bugornote' => 'Sofern Sie detailliert ein technisches Problem beschreiben möchten, melden Sie bitte [$1 einen Fehler].
+Anderenfalls können Sie auch das untenstehende einfache Formular nutzen. Ihr Kommentar wird, zusammen mit Ihrem Benutzernamen und der Version des von Ihnen verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.',
+'feedback-thanks' => 'Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.',
+'feedback-bugcheck' => 'Super! Bitte überprüfen Sie noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.',
+
+# API errors
+'api-error-badaccess-groups' => 'Sie haben nicht die Berechtigung Dateien in dieses Wiki hochzuladen.',
+'api-error-hookaborted' => 'Die von Ihnen vorgesehene Anpassung kann nicht durchgeführt werden (Unterbrechung durch eine Programmschnittstelle).',
+'api-error-mustbeloggedin' => 'Um Dateien hochladen zu können, müssen Sie angemeldet sein.',
+
);
diff --git a/languages/messages/MessagesDiq.php b/languages/messages/MessagesDiq.php
index b45a1b3d..ad14fb64 100644
--- a/languages/messages/MessagesDiq.php
+++ b/languages/messages/MessagesDiq.php
@@ -11,6 +11,7 @@
* @author Aspar
* @author Belekvor
* @author Erdemaslancan
+ * @author Kaganer
* @author Mirzali
* @author Reedy
* @author Sahim
@@ -375,17 +376,17 @@ Kerem kerê, naye be namey ''URL''i yew [[Special:ListUsers/sysop|karber]]i ra v
'badarticleerror' => 'Kar ke şıma kenê, qebul nêbi.',
'cannotdelete' => 'Pel "$1" o ke şıma nişane kerd hewn a neşı.
Belka yewna ten kerdo hewn a.',
+'cannotdelete-title' => 'şıma "$1" nê şenê besternê.',
'badtitle' => 'Sernameo xırabın',
'badtitletext' => 'Sernamey pela ke şıma waşt, nêvêrd, thalo/vengo ya ki zıwano miyanêno ğelet gırêdae ya ki sernamey wiki.
Beno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.',
-'perfcached' => 'Datayi cıwa ver hazır biye. No semedê ra nıkayin niyo!',
-'perfcachedts' => 'Cêr de malumatê nımıteyi esti, wextê newe kerdışo peyın: $1.',
+'perfcached' => 'Datayi cıwa ver hazır biye. No semedê ra nıkayin niyo! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Cêr de malumatê nımıteyi esti, wextê newe kerdışo peyın: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Nıka newe kerdış nêbeno. no datayi ca de newe nêbeni .',
'wrong_wfQuery_params' => 'wfQuery() parametreyo ÅŸaÅŸ<br />
Fonksiyon: $1<br />
Perse: $2',
'viewsource' => 'Çımey bıvêne',
-'viewsourcefor' => 'Seba / qandê $1',
'actionthrottled' => 'Fealiyet xeneqna',
'actionthrottledtext' => 'Riyê tedbirê anti-spami ra, wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.
Çend deqey ra tepeya reyna bıcerrebnên.',
@@ -586,9 +587,6 @@ Not, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nê
IP numre şıma yo nıkayın $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corınan xo vir ra mekere.',
'blockednoreason' => 'sebeb nidaniyo',
-'blockedoriginalsource' => "Çimeyê '''$1''' cêr de mocnayiyo:",
-'blockededitsource' => "Nuştişê '''vurnayişe''' tu '''$1''' cêr de mocnayiyo:",
-'whitelistedittitle' => 'Eka ti wazene binusi hesabê xo a bike',
'whitelistedittext' => 'Eka ti wazene binusi ti gani $1.',
'confirmedittext' => 'Eka ti wazene binusi, adresê xo e-maili confirme bike.
Adresê xo e-maili [[Special:Preferences|user preferences]] de confirme bike.',
@@ -825,8 +823,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşenê h
'revdelete-unsuppress' => 'reizyonê ke tepiya anciye serbest ker',
'revdelete-log' => 'Sebeb:',
'revdelete-submit' => 'Cewab be {{PLURAL:$1|çımraviyarnayışi|çımraviyarnayışan}} de',
-'revdelete-logentry' => '[[$1]] qey neyi esayişê revizyon vuriya',
-'logdelete-logentry' => '[[$1]] qey neyi esayişê vaqayi vuriya',
'revdelete-success' => "''''Esayişê revizyoni bi muvaffaqi eyar bi.'''",
'revdelete-failure' => "'''Esayişê revizyoni eyar nibeno:'''
$1",
@@ -838,15 +834,6 @@ $1",
'revdel-restore-visible' => 'revizyonanê esani',
'pagehist' => 'vere cûyê peli',
'deletedhist' => 'tarixê hewna şiyaye',
-'revdelete-content' => 'mebhes',
-'revdelete-summary' => 'kılmvatışê vuriyayişi',
-'revdelete-uname' => 'nameyê karberi',
-'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
-'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
-'revdelete-hid' => 'bınım $1',
-'revdelete-unhid' => 'bımoc (musnayiş) $1',
-'revdelete-log-message' => '$2 qey {{PLURAL:$2|revizyon|revizyon}} $1',
-'logdelete-log-message' => '$2 qey {{PLURAL:$2|vaqa|vaqa}} $1',
'revdelete-hide-current' => '$2 $1 ney çiye ke wexta diyayene wera (wedar dayiş) xeta da: no reviyon nınımiyeno.',
'revdelete-show-no-access' => '$2 $1 wexta ke ney tarix de mociyayene xeta da: ne çi "vergırewtı" nişane biyo.
resayişê şıma çino.',
@@ -997,7 +984,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
'prefs-rc' => 'Vurnayışê peyêni',
'prefs-watchlist' => 'Lista seyr-kerdışi',
'prefs-watchlist-days' => 'Rocê ke lista seyrkerdışi de bêrê ramocnaene',
-'prefs-watchlist-days-max' => 'Tewr zêde/vêşi 7 roci',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'tewr zêde amarê vurnayışi ke lista seyrkerdışia herakerdiye de bıasê:',
'prefs-watchlist-edits-max' => 'Amerê tewr zafî: 1000',
'prefs-watchlist-token' => 'Lista seyrkerdışia nışani:',
@@ -1190,7 +1177,6 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'right-autopatrol' => 'Vurnayîşanê xo otomatik nîşan bike ke patrol biyê',
'right-patrolmarks' => 'Vurnayîşanê peniyî nîşan patrol biyê bivîne',
'right-unwatchedpages' => 'Yew listeyê pelanê seyrnibiye bivîne',
-'right-trackback' => 'yew trackback bide',
'right-mergehistory' => 'Tarixê pelanê yew bike',
'right-userrights' => 'Heqanê karberi pêro bıvurne',
'right-userrights-interwiki' => 'Heqqa karberanê ke ho wîkîyo binî de ey bivurne',
@@ -1234,7 +1220,6 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'action-patrol' => 'vurnayîşê karberanê binî nişan bike patrol biye',
'action-autopatrol' => 'vurnayîşê xoye nişan bike ke belli biyo patrol biye',
'action-unwatchedpages' => 'listeyê pelanê seyirnibiya bivîne',
-'action-trackback' => 'yew trackback bide',
'action-mergehistory' => 'tarixê ena pele yew bike',
'action-userrights' => 'heqqa karberanê hemî bivurne',
'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
@@ -1735,12 +1720,8 @@ qaydeyê destek biyayeyi: <tt>$1</tt>',
'activeusers-noresult' => 'Karberî çini yo.',
# Special:Log/newusers
-'newuserlogpage' => 'Cıkewtışê hesab-vıraştışi',
-'newuserlogpagetext' => 'Ena log de viraştişê karberî esta.',
-'newuserlog-byemail' => 'pê e-mail ra paralo şiravt',
-'newuserlog-create-entry' => 'Hesabê karberê newey',
-'newuserlog-create2-entry' => 'hesabê newî $1 viraşt',
-'newuserlog-autocreate-entry' => 'hesab otomatik vıraziya.',
+'newuserlogpage' => 'Cıkewtışê hesab-vıraştışi',
+'newuserlogpagetext' => 'Ena log de viraştişê karberî esta.',
# Special:ListGroupRights
'listgrouprights' => 'heqê grubê karberi',
@@ -1880,8 +1861,6 @@ Tı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi
'actionfailed' => 'kar nêbı',
'deletedtext' => '"$1" biya wedariya.
Qe qeydê wedarnayışi, $2 bevinin.',
-'deletedarticle' => '"[[$1]]" esterıt',
-'suppressedarticle' => '"[[$1]]" çap biyo',
'dellogpage' => 'Logê bıesterışi',
'dellogpagetext' => 'listeya cêrıni heme qaydê hewn a kerdeyan o.',
'deletionlog' => 'qaydê hewnakerdışani',
@@ -1953,6 +1932,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
'protect-level-sysop' => 'Tenya idarekeri',
'protect-summary-cascade' => 'çırrayış',
'protect-expiring' => 'qediyeno $1 (UTC)',
+'protect-expiring-local' => '$1 do bı qedyo',
'protect-expiry-indefinite' => 'bê hed u hesab',
'protect-cascade' => 'Ena pela dı pelayan kılit-biya ca geno (cascading protection)',
'protect-cantedit' => 'Tı nêşenay sinorê kılit-biyayışê ena pele bıvurnê, çıke desturê to be vurnayışi çıniyo.',
@@ -2009,7 +1989,6 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
'undeletereset' => 'Sifir bike',
'undeleteinvert' => 'vicnayeyi qeldaye açarn',
'undeletecomment' => 'Sebeb:',
-'undeletedarticle' => '"[[$1]]" peyser ard',
'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni',
'undeletedfiles' => '{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.',
@@ -2149,6 +2128,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
'unblocklink' => 'ake',
'change-blocklink' => 'kılit-kerdışi bıvurne',
'contribslink' => 'iştıraki',
+'emaillink' => 'e-poste bırışe',
'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
Sebebê kılit-biyayışê $1\'i: "$2"o',
'blocklogpage' => 'Protokolê kıliti',
@@ -2261,9 +2241,6 @@ Yewna name bınus.',
'movepage-page-moved' => 'pelê $1i kırışiya pelê $2i.',
'movepage-page-unmoved' => 'pelê $1i nêkırışiyeno sernameyê $2i.',
'movepage-max-pages' => 'tewr ziyed $1 {{PLURAL:$1|peli|peli}} kırışiya u hıni ziyedê ıney otomotikmen nêkırışiyeno.',
-'1movedto2' => '[[$1]] berd be [[$2]]',
-'1movedto2_redir' => 'berd [[$1]] ri [[$2]] ser redireksiyon',
-'move-redirect-suppressed' => 'rayberdışi çap biyo',
'movelogpage' => 'Logê berdışi',
'movelogpagetext' => 'nameyê liste ya ke cêr de yo, pelê vuriyayeyani mocneno',
'movesubpage' => '{{PLURAL:$1|Subpage|pelê bınıni}}',
@@ -2506,9 +2483,6 @@ Tı eşkeno yew sebeb bınus.',
# Patrol log
'patrol-log-page' => 'Logê devriye',
'patrol-log-header' => 'Ena listeyê logi revizyonê devriyeyi mocneno.',
-'patrol-log-line' => 'nişan biyo $1 ê $2 patrol biyo $3',
-'patrol-log-auto' => '(otomatik)',
-'patrol-log-diff' => 'revizyon $1',
'log-show-hide-patrol' => '$1 logê devriye',
# Image deletion
@@ -2534,7 +2508,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pele|peli}}',
'file-info' => 'ebatê dosyayi: $1, MIME tip: $2',
'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
-'file-nohires' => '<small>Resolosyonê detayeri çino .</small>',
+'file-nohires' => 'Rovıleşiyayışo berzêr çıniyo.',
'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
'show-big-image' => 'Resolosyonê temami',
'file-info-gif-looped' => 'viyariye biyo',
@@ -2911,13 +2885,6 @@ kodê tesdiqi heta ıney tarixi $4 meqbul o.',
'scarytranscludefailed' => '[Qe $1 fetch kerdişî nihebitiyeno]',
'scarytranscludetoolong' => '[Ena URL zaf dergo]',
-# Trackbacks
-'trackbackbox' => 'Ser ena pel trackbackî :<br />
-$1',
-'trackbackremove' => '([$1 biwedarne])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback wedariyeyo.',
-
# Delete conflict
'deletedwhileediting' => "'''Teme''': Ena pele verniyê ti de eseteriyaya!",
'confirmrecreate' => "Karberê [[User:$1|$1]]î ([[User talk:$1|talk]]), verniyê vurnayîşê ti ra ena pele wedarno, sebeb: ''$2''
@@ -3114,4 +3081,11 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
'htmlform-reset' => 'Vurnayişî reyna biyar',
'htmlform-selectorother-other' => 'Bin',
+# New logging system
+'revdelete-content-hid' => 'nusno nımte',
+'revdelete-summary-hid' => 'Vurnayışi nımtey niyê',
+'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
+'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
+'newuserlog-byemail' => 'pê e-mail ra paralo şiravt',
+
);
diff --git a/languages/messages/MessagesDsb.php b/languages/messages/MessagesDsb.php
index 730fe81a..039a0fb1 100644
--- a/languages/messages/MessagesDsb.php
+++ b/languages/messages/MessagesDsb.php
@@ -62,8 +62,8 @@ $defaultDateFormat = 'dmy';
$dateFormats = array(
'dmy time' => 'H:i',
- 'dmy date' => 'j xg Y',
- 'dmy both' => 'H:i, j xg Y',
+ 'dmy date' => 'j. xg Y',
+ 'dmy both' => 'j. xg Y, H:i',
);
$specialPageAliases = array(
@@ -514,20 +514,22 @@ Pšosym daj to a pśisłušny URL [[Special:ListUsers/sysop|administratoroju]] k
'formerror' => 'Zmólka: Njejo móžno formular wótpósłaś.',
'badarticleerror' => 'Akcija njedajo se na toś tom boku wuwjasć.',
'cannotdelete' => 'Njejo móžno było bok abo dataju "$1" wulašowaś. Snaź jo to južo něchten drugi cynił.',
+'cannotdelete-title' => 'Bok "$1" njedajo se lašowaś',
'badtitle' => 'Njepłaśecy nadpis',
'badtitletext' => 'Nadpis pominanego boka jo był njepłaśecy, prozny abo njekorektny nadpis, póchadajucy z mjazyrěcnego abo interwikijowego wótkaza. Snaź wopśimjejo jadno abo wěcej znamuškow, kótarež njejsu w nadpisach dowólone.',
-'perfcached' => 'Toś te daty póchadaju z pufrowaka a mógu toś njeaktualne byś.',
-'perfcachedts' => 'Toś te daty póchadaju z pufrowaka, slědna aktualizacija: $1',
+'perfcached' => 'Toś te daty póchadaju z pufrowaka a mógu snaź njeaktualne byś. Maksimalnje {{PLURAL:$1|jaden wuslědk stoj|$1 wuslědka stojtej|$1 wuslědki stoje|$1 wuslědkow stoj}} w pufrowaku k dispoziciji.',
+'perfcachedts' => 'Toś te daty póchadaju z pufrowaka a su se $1 slědny raz aktualizěrowali. Maksimalnje {{PLURAL:$4|jaden wuslědk stoj|$4 wuslědka stojtej|$4 wuslědki stoje|$4 wuslědkow stoj}} w pufrowaku k dispoziciji.',
'querypage-no-updates' => 'Aktualizěrowanje toś togo boka jo se znjemóžniło. Daty how se nejžpjerwjej raz njeaktualizěruju.',
'wrong_wfQuery_params' => 'Njedobre parametery za wfQuery()<br />
Funkcija: $1<br />
Wótpšašanje: $2',
'viewsource' => 'Žrědło se wobglědaś',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Žrědłowy tekst za $1 se woglědaś',
'actionthrottled' => 'Akcije limitowane',
'actionthrottledtext' => 'Ako napšawa pśeśiwo spamoju, móžoš toś tu akciju jano někotare raze we wěstym case wuwjasć. Sy toś ten limit dośěgnuł. Pšosym wopytaj za někotare minuty hyšći raz.',
'protectedpagetext' => 'Wobźěłanje toś togo boka jo se znjemóžniło.',
'viewsourcetext' => 'Žrědłowy tekst togo boka móžoš se woglědaś a kopěrowaś:',
+'viewyourtext' => "Móžoš se žrědłowy tekst '''swójich změnow''' woglědaś a do toś togo bok kopěrowaś:",
'protectedinterface' => 'Toś ten bok wopśimujo tekst za rěcny zwjerch softwary. Jogo wobźěłowanje jo se znjemóžniło, aby se znjewužywanjeju zadorało.',
'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 wobwliwowaś. Wužywaj pšosym za pśełožki [//translatewiki.net/wiki/Main_Page?setlang=dsb translatewiki.net], projekt MediaWiki za lokalizacije.",
'sqlhidden' => '(Wótpšašanje SQL schowane)',
@@ -619,6 +621,7 @@ Woglědowarje, kótarež wužywaju toś tu IP-adresu njamógu tuchylu dalšne ko
'noemailprefs' => 'Zapódaj e-mailowu adresu w swójich nastajenjach, aby toś te funkcije stali k dispoziciji.',
'emailconfirmlink' => 'Wobkšuś swóju e-mailowu adresu.',
'invalidemailaddress' => 'Toś ta e-mailowa adresa njamóžo se akceptěrowaś, dokulaž zda se, až jo njepłaśiwy format. Pšošym zapódaj adresu w korektnem formaśe abo wuprozń to pólo.',
+'cannotchangeemail' => 'Kontowe e-mailowe adrese njedaju se změniś na toś tom wikiju.',
'accountcreated' => 'Wužywarske konto jo se wutwóriło.',
'accountcreatedtext' => 'Wužywarske konto $1 jo se wutwóriło.',
'createaccount-title' => 'Wužywarske konto za {{SITENAME}} nawarjone',
@@ -633,6 +636,7 @@ Móžoš toś te zdźělenje ignorowaś, jolic toś te konto jo se jano zamólnj
# E-mail sending
'php-mail-error-unknown' => 'Njeznata zmólka w PHP-funkciji mail()',
+'user-mail-no-addy' => 'Jo se wopytało, e-mail bźez e-mailoweje adrese pósłaś',
# Change password dialog
'resetpass' => 'Gronidło změniś',
@@ -653,30 +657,45 @@ Sy snaź swójo gronidło južo wuspěšnje změnił abo nowe nachylne gronidło
'resetpass-temp-password' => 'Nachylne gronidło:',
# Special:PasswordReset
-'passwordreset' => 'Gronidło slědk stajiś',
-'passwordreset-text' => 'Wupołni toś ten formular, aby dostał e-mailowe dopomnjeśe k swójim kontowym drobnostkam.',
-'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-email' => 'E-mailowa adresa:',
-'passwordreset-emailtitle' => 'Kontowe drobnostki na {{GRAMMAR:lokatiw|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Něchten (nejskerjej ty, z IP-adresu $1) jo dopomnjeśe na twóje kontowe drobnostki za {{SITENAME}} pominał ($4). {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su|Slědujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane|zwězane}}:
+'passwordreset' => 'Gronidło slědk stajiś',
+'passwordreset-text' => 'Wupołni toś ten formular, aby dostał e-mailowe dopomnjeśe k swójim kontowym drobnostkam.',
+'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ś?',
+'passwordreset-capture-help' => 'Jolic nakśickujoš toś ten kašćik, e-mail (z nachylnym gronidłom) buźo se pokazaś a wužywarjeju słaś.',
+'passwordreset-email' => 'E-mailowa adresa:',
+'passwordreset-emailtitle' => 'Kontowe drobnostki na {{GRAMMAR:lokatiw|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Něchten (nejskerjej ty, z IP-adresu $1) jo dopomnjeśe na twóje kontowe drobnostki za {{SITENAME}} pominał ($4). {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su|Slědujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane|zwězane}}:
$2
{{PLURAL:$3|Toś to nachylne gronidło spadnjo|Toś tej nachylnej gronidle spadnjotej|Toś te nachylne gronidła spadnu|Toś te nachylne gronidła spadnu}} za {{PLURAL:$5|jaden źeń|$5 dnja|$5 dny|$5 dnjow}}.
Ty by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten drugi jo toś to napšašowanje pósłał, abo jolic sy se zasej na spócetne gronidło spomnjeł a wěcej njocoš jo změniś, móžoš toś to zdźělenje ignorěrowaś a swójo stare gronidło dalej wužywaś.',
-'passwordreset-emailtext-user' => 'Wužywaŕ $1 jo dopomnjeśe na twóje kontowe drobnostki za {{SITENAME}} pominał ($4). {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su|Slědlujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane|zwězane}}:
+'passwordreset-emailtext-user' => 'Wužywaŕ $1 jo dopomnjeśe na twóje kontowe drobnostki za {{SITENAME}} pominał ($4). {{PLURAL:$3|Slědujuce wužywarske konto jo|Slědujucej wužywarskej konśe stej|Slědujuce wužywarske konta su|Slědlujuce wužywarske konta su}} z toś tej e-mailoweju adresu {{PLURAL:$3|zwězane|zwězanej|zwězane|zwězane}}:
$2
{{PLURAL:$3|Toś to nachylne gronidło spadnjo|Toś tej nachylnej gronidle spadnjotej|Toś te nachylne gronidła spadnu|Toś te nachylne gronidła spadnu}} za {{PLURAL:$5|jaden źeń|$5 dnja|$5 dny|$5 dnjow}}.
Ty by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten drugi jo toś to napšašowanje pósłał, abo jolic sy se zasej na spócetne gronidło spomnjeł a wěcej njocoš jo změniś, móžoš toś to zdźělenje ignorěrowaś a swójo stare gronidło dalej wužywaś.',
-'passwordreset-emailelement' => 'Wužywarske mě: $1
+'passwordreset-emailelement' => 'Wužywarske mě: $1
Nachylne gronidło: $2',
-'passwordreset-emailsent' => 'Dopominańska e-mail jo se pósłała.',
+'passwordreset-emailsent' => 'Dopominańska e-mail jo se pósłała.',
+'passwordreset-emailsent-capture' => 'Dopominańska e-mail jo se pósłała, kótaraž se dołojce pokazujo.',
+'passwordreset-emailerror-capture' => 'Dołojce pokazowana e-mail jo se napóriła, ale jo se njeraźiło ju wužiwarjeju pósłaś: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mailowu adresu změniś',
+'changeemail-header' => 'Kontowu e-mailowu adresu změniś',
+'changeemail-text' => 'Wupołni toś ten formular, aby swóju e-mailowu adresu změnił. Musyš swójo gronidło zapódaś, aby toś tu změnu wobkšuśił.',
+'changeemail-no-info' => 'Dejš pśizjawjony byś, aby direktny pśistup na toś ten bok měł.',
+'changeemail-oldemail' => 'Aktualna e-mailowa adresa:',
+'changeemail-newemail' => 'Nowa e-mailowa adresa:',
+'changeemail-none' => '(žedna)',
+'changeemail-submit' => 'E-mailowu adresu změniś',
+'changeemail-cancel' => 'Pśetergnuś',
# Edit page toolbar
'bold_sample' => 'Tucny tekst',
@@ -745,9 +764,6 @@ Wobmysli, až njamóžoÅ¡ funkciju "ToÅ› tomu wužywarjeju e-mail pósÅ‚aÅ›" wuÅ
Twója aktualna IP-adresa jo $3 a ID blokěrowanja jo #$5.
Zapśimjejśo pšosym wše górjejce pomjenjowane drobnosći do wšych napšašowanjow, kótarež cyniš.',
'blockednoreason' => 'Pśicyna njejo dana',
-'blockedoriginalsource' => "Žrědłowy tekst boka '''$1''':",
-'blockededitsource' => "Žrědłowy tekst '''Twójich pśinoskow''' do '''$1''' jo:",
-'whitelistedittitle' => 'Za wobźěłanje dejš se pśizjawiś',
'whitelistedittext' => 'Musyš se $1, aby mógał boki wobźěłowaś.',
'confirmedittext' => 'Nježli až móžoš źěłaš, musyš swóju e-mailowu adresu wobkšuśiś. Pšosym dodaj a wobkšuś swóju e-mailowu adresu w [[Special:Preferences|nastajenjach]].',
'nosuchsectiontitle' => 'Wótrězk njedajo se namakaś',
@@ -819,7 +835,7 @@ Ty teke wobkšuśijoš, až sy tekst sam napisał abo sy jen wót public domainy
'''NJEWÓZJAW WÓT COPYRIGHTA ŠĆITANE ŹĚÅA MIMO DOWÓLNOSĆI!'''",
'copyrightwarning2' => "PÅ¡osym buź se togo wÄ›dobny, až wÅ¡ykne pÅ›inoski na {{SITENAME}} mógu wót drugich wužywarjow se wobźěłaÅ›, narownaÅ› abo wulaÅ¡owaÅ›. Jolic až njocoÅ¡, až twój tekst se mimo zmilnosći wobźěłujo, ga pón jen how njeskÅ‚aduj.<br /> Ty teke wobkÅ¡uÅ›ijoÅ¡, až sy tekst sam napisaÅ‚ abo sy jen wót public domainy resp. wót pódobneje lichotneje resursy kopÄ›rowaÅ‚ (glÄ›daj $1 za dalÅ¡e detaile). '''NJEWÓZJAW WÓT COPYRIGHTA ŠĆITANE ŹĚÅA MIMO DOWÓLNOSĆI!'''",
-'longpageerror' => "'''Zmólka: Tekst, kótaryž coš składowaś jo $1 KB wjeliki. To jo wěcej, ako dowólony maksimum ($2 KB). Składowanje njejo móžno.'''",
+'longpageerror' => "'''Zmólka: Tekst, kótaryž coš składowaś, jo {{PLURAL:$1| jaden kilobajt|$1 kilobajta|$1 kilobajty|$1 kilobajtow}} wjeliki. To jo wěcej ako dowólony maksimum {{PLURAL:$2|jaden kilobajt|$1 kilobajta|$1 kilobajty|$1 kilobajtow}}.''' Składowanje njejo móžno.",
'readonlywarning' => "'''WARNOWANJE: Datowa banka jo se za wótwardowanje zacyniła, togodla njebuźo tuchylu móžno, twóje změny składowaś. Jolic až coš, ga móžoš tekst do tekstoweje dataje kopěrowaś a pózdźej składowaś.'''
Administrator, kenž jo ju zastajił, su toś tu pśicynu pódał: $1",
@@ -983,8 +999,6 @@ DalÅ¡ne administratory na {{GRAMMAR:lokatiw|{{SITENAME}}}} mógu ale pÅ›ecej hyÅ
'revdelete-unsuppress' => 'Wobgranicowanja za wótnowjone wersije zasej zwignuś.',
'revdelete-log' => 'Pśicyna:',
'revdelete-submit' => 'Na {{PLURAL:$1|wubranu wersiju|wubranej wersiji|wubrane wersije|wubrane wersije}} nałožyś',
-'revdelete-logentry' => 'Woglědanje wersije změnjone za [[$1]]',
-'logdelete-logentry' => 'wiźobnosć za [[$1]] změnjona.',
'revdelete-success' => "'''Widobnosć wersije jo se z wuspěchom zaktualizěrowała.'''",
'revdelete-failure' => "'''Wersijowa widobnosć njedajo se aktualizěrowaś:'''
$1",
@@ -996,15 +1010,6 @@ $1",
'revdel-restore-visible' => 'widobne wersije',
'pagehist' => 'stawizny boka',
'deletedhist' => 'wulašowane stawizny',
-'revdelete-content' => 'wopśimjeśe',
-'revdelete-summary' => 'Zespominanje wobźěłanja',
-'revdelete-uname' => 'wužywarske mě',
-'revdelete-restricted' => 'Wobgranicowanja se teke na administratorow nałožuju',
-'revdelete-unrestricted' => 'Wobgranicowanja za administratorow wótpórane',
-'revdelete-hid' => 'schowa $1',
-'revdelete-unhid' => 'zasej wótkšy $1',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|wersiju|wersiji|wersije|wersijow}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|tšojenje|tšojeni|tšojenja|tšojenjow}}',
'revdelete-hide-current' => 'Zmólka pśi chowanju zapiska wót $2, $1: to jo aktualna wersija.
Njedajo se schowaÅ›.',
'revdelete-show-no-access' => 'Zmólka pśi pokazowanju zapiska wót $2, $1: toś ten zapisk jo se ako "wobgranicowany" markěrował.
@@ -1158,12 +1163,14 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
'prefs-rc' => 'Aktualne změny',
'prefs-watchlist' => 'Wobglědowańka',
'prefs-watchlist-days' => 'Licba dnjow, kenž maju se we wobglědowańce pokazaś:',
-'prefs-watchlist-days-max' => 'Maksimalnje 7 dnjow',
+'prefs-watchlist-days-max' => 'Maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}}',
'prefs-watchlist-edits' => 'Maksimalna licba změnow, kótarež maju se w rozšyrjonej wobglědowańce pokazaś:',
'prefs-watchlist-edits-max' => 'Maksimalna licba: 1000',
'prefs-watchlist-token' => 'Marka wobglědowańki:',
'prefs-misc' => 'WÅ¡ake nastajenja',
'prefs-resetpass' => 'Gronidło změniś',
+'prefs-changeemail' => 'E-mailowu adresu změniś',
+'prefs-setemail' => 'E.mailowu adresu póstajiś',
'prefs-email' => 'E-mailowe opcije',
'prefs-rendering' => 'Naglěd',
'saveprefs' => 'Składowaś',
@@ -1223,6 +1230,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'yourrealname' => 'Realne mÄ› *:',
'yourlanguage' => 'Rěc:',
'yourvariant' => 'Rěcna warianta:',
+'prefs-help-variant' => 'Twója preferěrowana warianta abo ortografija, w kótarejž maju se wopśimjeśowe boki toś togo wikija zwobrazniś.',
'yournick' => 'Pódpismo:',
'prefs-help-signature' => 'Komentary na diskusijnych bokach měli se pśez "<nowiki>~~~~</nowiki>" pódpisaś, kótarež konwertěrujo se do twójeje signatury a casowego kołka.',
'badsig' => 'Signatura njejo dobra; pšosym HTML pśekontrolěrowaś.',
@@ -1261,7 +1269,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'userrights-lookup-user' => 'Wužywarske kupki zastojaś',
'userrights-user-editname' => 'Wužywarske mě:',
'editusergroup' => 'Wužywarske kupki wobźěłaś.',
-'editinguser' => "Změnjaju se wužywarske pšawa wužywarja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Změnjaju se wužywarske pšawa wužywarja '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Pšawa wužywarskich kupkow wobźěłaś',
'saveusergroups' => 'Wužywarske kupki składowaś',
'userrights-groupsmember' => 'CÅ‚onk kupki:',
@@ -1355,13 +1363,13 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'right-autopatrol' => 'Swójske změny awtomatiski ako doglědowane markěrowane',
'right-patrolmarks' => 'Kontrolne wobznamjenja w aktualnych změnach',
'right-unwatchedpages' => 'Lisćinu njewobglědowanych bokow woglědaś',
-'right-trackback' => 'Trackback wótpósłaś',
'right-mergehistory' => 'Stawizny wersijow bokow zjadnośiś',
'right-userrights' => 'Wšykne wužywarske pšawa wobźěłaś',
'right-userrights-interwiki' => 'Wužywarske pšawa w drugich wikijach wobźěłaś',
'right-siteadmin' => 'Datowu banku zastajiś a zastajenje wótpóraś',
'right-override-export-depth' => 'Boki inkluziwnje wótkazanych bokow až do dłyma 5 eksportěrowaś',
'right-sendemail' => 'Drugim wužywarjam e-mail pósłaś',
+'right-passwordreset' => 'E-maile za slědkstajanje gronidłow se woglědaś',
# User rights log
'rightslog' => 'Protokol wužywarskich pšawow',
@@ -1395,16 +1403,17 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'action-suppressionlog' => 'toÅ› ten priwatny protokol zwobrazniÅ›',
'action-block' => 'Toś tomu wužiwarjeju wobźěłowanje zawoboraś',
'action-protect' => 'Šćitowe stopnje za toś ten bok změniś',
+'action-rollback' => 'změny slědnego wužywarja, kótaryž jo wobźěłał wěsty bok, malsnje slědk stajiś',
'action-import' => 'toś ten bok z drugego wikija importěrowaś',
'action-importupload' => 'toś ten bok z datajowego nagraśa importěrowaś',
'action-patrol' => 'změny drugich wužywarjow ako doglědowane markěrowaś',
'action-autopatrol' => 'twóju změnu ako doglědowanu markěrowaś daś',
'action-unwatchedpages' => 'lisćinu njewobglědowanych bokow zwobrazniś',
-'action-trackback' => 'trackback pósłaś',
'action-mergehistory' => 'Stawizny toś togo boka zjadnośiś',
'action-userrights' => 'wše wužywarske pšawa wobźěłaś',
'action-userrights-interwiki' => 'wužywarske pšawa wužywarjow w drugich wikijach wobźěłaś',
'action-siteadmin' => 'datowu banku zastajiś abo wótworiś',
+'action-sendemail' => 'E-maile pósłaś',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|změna|změnje|změny}}',
@@ -1436,6 +1445,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|wobglědowaŕ|wobglědowarja|wobglědowarje}}]',
'rc_categories' => 'Jano boki z kategorijow (źělone z pomocu „|“):',
'rc_categories_any' => 'wše',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byta|byty|bytow}} pó změnje',
'newsectionsummary' => 'Nowy wótrězk /* $1 */',
'rc-enhanced-expand' => 'Drobnosći pokazaś (pomina se JavaScript)',
'rc-enhanced-hide' => 'Drobnosći schowaś',
@@ -1490,6 +1500,7 @@ Glědaj [[Special:NewFiles|galeriju nowych datajow]] za wizuelny pśeglěd.',
'ignorewarnings' => 'Wše warnowanja ignorěrowaś',
'minlength1' => 'Mjenja datajow muse wopśimjeś nanejmjenjej jaden pismik.',
'illegalfilename' => 'Datajowe mě „$1“ wopśimjejo njedowólone znamuška, kótarež njejsu dowólone w titulami bokow. Pšosym pśemjeń dataju a wopytaj ju wótnowotki nagraś.',
+'filename-toolong' => 'Datajowe mjenja njesměju dlejše ako 240 bajtow byś.',
'badfilename' => 'Mě dataje jo se změniło na „$1“.',
'filetype-mime-mismatch' => 'Datajowy sufiks ".$1" njewótpowědujo MIME-typoju dataje ($2).',
'filetype-badmime' => 'Dataje z MIME-typom „$1“ njesměju se nagraś.',
@@ -1591,6 +1602,41 @@ $1',
'upload-unknown-size' => 'Njeznata wjelikosć',
'upload-http-error' => 'HTTP-zmólka nastata: $1',
+# File backend
+'backend-fail-stream' => 'Dataja $1 njedajo se pśenjasć.',
+'backend-fail-backup' => 'Dataja $1 njedajo se zawěsćiś.',
+'backend-fail-notexists' => 'Dataja $1 njeeksistěrujo.',
+'backend-fail-hashes' => 'Sypańske gódnoty dataje njedaju se za pśorownowanje wótwołaś.',
+'backend-fail-notsame' => 'Njeidentiska dataja $1 južo eksistěrujo.',
+'backend-fail-invalidpath' => '$1 njejo płaśiwy puśik za składowanje.',
+'backend-fail-delete' => 'Dataja $1 njedajo se wulašowaś.',
+'backend-fail-alreadyexists' => 'Dataja $1 južo eksistěrujo.',
+'backend-fail-store' => 'Dataja $1 njedajo se pód $2 składowaś.',
+'backend-fail-copy' => 'Dataja $1 njedajo se pód $2 kopěrowaś.',
+'backend-fail-move' => 'Dataja $1 njedajo se do $2 pśesunuś.',
+'backend-fail-opentemp' => 'Temporerna dataja njedajo se wócyniś.',
+'backend-fail-writetemp' => 'Temporerna dataja njedajo se pisaÅ›.',
+'backend-fail-closetemp' => 'Temporerna dataja njedajo se zacyniÅ›.',
+'backend-fail-read' => 'Dataja $1 njedajo se cytaÅ›.',
+'backend-fail-create' => 'Dataja $1 njedajo se napóraś.',
+'backend-fail-readonly' => 'Składowański backend "$1" dajo se tuchylu jano cytaś. Pśicyna jo była: "$2"',
+'backend-fail-synced' => 'Dataja "$1" jo w internem składowańskem backenźe w inkonsistentnem stawje',
+'backend-fail-connect' => 'Zwisk z datajowym składowańskem backendom "$1" njejo móžno.',
+'backend-fail-internal' => 'W składowańskem backenźe "$1" jo njeznata zmólka nastała.',
+'backend-fail-contenttype' => 'Wopśimjeśowy typ dataje, kótaraž ma se na "$1" składowaś, njedajo se zwěsćiś.',
+'backend-fail-batchsize' => 'Štapjelowa dataja, kótaraž wopśimujo {{PLURAL:$1|jadnu operaciju|$1 operaciji|$1 operacije|$1 operacijow}}, jo se na składowański backend pósłała; limit jo $2 {{PLURAL:$1|operaciju|operaciji|operacije|operacijow}}.',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" njedajo se wótwóriś; njejo zastajony.',
+'lockmanager-fail-closelock' => 'Zastajańska dataja njedajo se za "$1" zacyniś.',
+'lockmanager-fail-deletelock' => 'Zastajańska dataja njedajo se za "$1" wulašowaś.',
+'lockmanager-fail-acquirelock' => 'Zastajenje za "$1" njedajo se wótwołaś.',
+'lockmanager-fail-openlock' => 'Zastajańska dataja njedajo se za "$1" wócyniś.',
+'lockmanager-fail-releaselock' => 'Zastajenje za "$1" njedajo se dopušćiś.',
+'lockmanager-fail-db-bucket' => 'W zběrniku $1 njedajo se dosć zastajeńskich datowych bankow kontaktěrowaś',
+'lockmanager-fail-db-release' => 'Zastajenja na datowu banku $1 njedaju se dopušćiś.',
+'lockmanager-fail-svr-release' => 'Zastajenja na serwer $1 njedaju se dopušćiś.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Pśi wocynjenju dataja za ZIP-pśekontrolěrowanje jo zmólka nastała.',
'zip-wrong-format' => 'Pódana dataja njejo była ZIP-dataja.',
@@ -1607,6 +1653,7 @@ Togodla njedajo se jeje wěstoty pśekontrolěrowaś.',
'uploadstash-badtoken' => 'Wuwjeźenje teje akcije jo se njeraźiło, snaź dokulaž twóje wobźěłowańske daty su spadnjone. Wopytaj hyšći raz.',
'uploadstash-errclear' => 'Wótpóranje datajow jo se njeraźiło.',
'uploadstash-refresh' => 'Lisćinu datajow aktualizěrowaś',
+'invalid-chunk-offset' => 'Njepłaśiwy startowy dypk',
# img_auth script messages
'img-auth-accessdenied' => 'Pśistup zawobarany',
@@ -1710,23 +1757,24 @@ Slědujuca lisćina pokazujo jano {{PLURAL:$1|prědny wótkaz|prědnej $1 wótka
'filerevert-badversion' => 'Za pódany cas njeeksistěrujo žedna wersija dataje.',
# File deletion
-'filedelete' => 'Wulašowaś $1',
-'filedelete-legend' => 'Wulašowaś dataje',
-'filedelete-intro' => "Lašujoš dataju '''[[Media:$1|$1]]''' gromaźe z jeje cełymi stawiznami.",
-'filedelete-intro-old' => "Wulašujoš [$4 wersiju wót $2, $3 góź.] dataje '''„[[Media:$1|$1]]“'''.",
-'filedelete-comment' => 'Pśicyna:',
-'filedelete-submit' => 'Wulašowaś',
-'filedelete-success' => "'''$1''' jo se wulašował.",
-'filedelete-success-old' => "Wersija wót $2, $3 góź. dataje '''[[Media:$1|$1]]''' jo se wulašowała.",
-'filedelete-nofile' => "'''$1''' njeekistěrujo.",
-'filedelete-nofile-old' => "Njejo archiwowana wersija '''$1''' z pódanymi atributami.",
-'filedelete-otherreason' => 'Druga/pśidatna pśicyna:',
-'filedelete-reason-otherlist' => 'Druga pśicyna',
-'filedelete-reason-dropdown' => '*Powšykne pśicyny za lašowanja
+'filedelete' => 'Wulašowaś $1',
+'filedelete-legend' => 'Wulašowaś dataje',
+'filedelete-intro' => "Lašujoš dataju '''[[Media:$1|$1]]''' gromaźe z jeje cełymi stawiznami.",
+'filedelete-intro-old' => "Wulašujoš [$4 wersiju wót $2, $3 góź.] dataje '''„[[Media:$1|$1]]“'''.",
+'filedelete-comment' => 'Pśicyna:',
+'filedelete-submit' => 'Wulašowaś',
+'filedelete-success' => "'''$1''' jo se wulašował.",
+'filedelete-success-old' => "Wersija wót $2, $3 góź. dataje '''[[Media:$1|$1]]''' jo se wulašowała.",
+'filedelete-nofile' => "'''$1''' njeekistěrujo.",
+'filedelete-nofile-old' => "Njejo archiwowana wersija '''$1''' z pódanymi atributami.",
+'filedelete-otherreason' => 'Druga/pśidatna pśicyna:',
+'filedelete-reason-otherlist' => 'Druga pśicyna',
+'filedelete-reason-dropdown' => '*Powšykne pśicyny za lašowanja
** Pśekśiwjenje stworiśelskego pšawa
** Dwójna dataja',
-'filedelete-edit-reasonlist' => 'Pśicyny za lašowanje wobźěłaś',
-'filedelete-maintenance' => 'Wulašowanje a wótnowjenje datajow stej wótwardowanja dla nachylu znjemóžnjonej.',
+'filedelete-edit-reasonlist' => 'Pśicyny za lašowanje wobźěłaś',
+'filedelete-maintenance' => 'Wulašowanje a wótnowjenje datajow stej wótwardowanja dla nachylu znjemóžnjonej.',
+'filedelete-maintenance-title' => 'Dataja njedajo se lašowaś',
# MIME search
'mimesearch' => 'MIME-typ pytaÅ›',
@@ -1823,6 +1871,8 @@ Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a tek
'wantedpages' => 'Póžedane boki',
'wantedpages-badtitle' => 'Njepłaśiwy titel we wuslědku: $1',
'wantedfiles' => 'Póžedane dataje',
+'wantedfiletext-cat' => 'Slědujuce dataje se wužywaju, ale njeeksistěruja. Dataje z cuzych repozitoriumow daju se nalicyś, lěcrownož eksistěruju. Take wopacne pozitiwy su <del>pśešmarnjone</del>. Mimo togo se boki w [[:$1]] nalicyju, kótarež dataje zasajźuju, kótarež njeeksistěruju.',
+'wantedfiletext-nocat' => 'Slědujuce dataje se wužywaju, ale njeeksistěruju. Dataje z cuzych repozitoriumow daju se nalicyś, lěcrownož eksistěruju. Take wopacne pozitiwy su <del>pśešmarnjone</del>.',
'wantedtemplates' => 'Brachujuce pśedłogi',
'mostlinked' => 'Nejcesćej zalinkowane boki',
'mostlinkedcategories' => 'Nejcesćej wužywane kategorije',
@@ -1831,6 +1881,7 @@ Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a tek
'mostimages' => 'Nejcesćej wótkazane dataje',
'mostrevisions' => 'Boki z nejwěcej wersijami',
'prefixindex' => 'WÅ¡ykne boki z prefiksom',
+'prefixindex-namespace' => 'WÅ¡ykne boki z prefiksom (mjenjowy rum $1)',
'shortpages' => 'Krotke nastawki',
'longpages' => 'DÅ‚ujke nastawki',
'deadendpages' => 'Nastawki bźez wótkazow',
@@ -1939,12 +1990,8 @@ Pódpěrane protokole: <tt>$1</tt> (pšosym njepódaj je w swójom pytanju).',
'activeusers-noresult' => 'Žedne wužywarje namakane.',
# Special:Log/newusers
-'newuserlogpage' => 'Protokol nowych wužywarjow',
-'newuserlogpagetext' => 'To jo protokol wó nowych wužywarskich kontow.',
-'newuserlog-byemail' => 'Pótajne słowo bu pśez e-mail pósłane.',
-'newuserlog-create-entry' => 'Nowy wužywaŕ',
-'newuserlog-create2-entry' => 'Nowe konto za $1 napórane.',
-'newuserlog-autocreate-entry' => 'Wužywarske konto bu awtomatiski napórane',
+'newuserlogpage' => 'Protokol nowych wužywarjow',
+'newuserlogpagetext' => 'To jo protokol wó nowych wužywarskich kontow.',
# Special:ListGroupRights
'listgrouprights' => 'Pšawa wužywarskeje kupki',
@@ -1972,7 +2019,7 @@ Pódpěrane protokole: <tt>$1</tt> (pšosym njepódaj je w swójom pytanju).',
'emailpagetext' => 'Móžoš slědujucy formular wužywaś, aby toś tomu wužywarjeju e-mail pósłał.
E-mailowa adresa, kótaruž sy zapódał w [[Special:Preferences|swójich wužywarskich nastajenjach]], zjawi se ako adresa w pólu "Wót" e-maile, aby dostawaŕ móžo śi direktnje wótegroniś.',
'usermailererror' => 'E-mailowy objekt jo zmólku wrośił.',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} - e-mail wót wužywarja "$1"',
'usermaildisabled' => 'Wužywarska e-mail znjemóžnjona',
'usermaildisabledtext' => 'Njamóžoš w toś tym wikiju drugim wužywarjam e-mail pósłaś',
'noemailtitle' => 'E-mailowa adresa felujo.',
@@ -2026,7 +2073,7 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
'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}}.',
'iteminvalidname' => 'Problem ze zapisom „$1“, njepłaśece mě.',
-'wlnote' => "{{PLURAL:$1|Slědujo slědna změna|slědujotej '''$1''' slědnej změnje|slěduju slědne '''$1''' změny}} {{PLURAL:$2|slědneje góźiny|slědneju '''$2''' góźinowu|slědnych '''$2''' góźinow}}.",
+'wlnote' => "{{PLURAL:$1|Slědujo slědna změna|slědujotej '''$1''' slědnej změnje|slěduju slědne '''$1''' změny}} {{PLURAL:$2|slědneje góźiny|slědneju '''$2''' góźinowu|slědnych '''$2''' góźinow}}, staw: $3, $4.",
'wlshowlast' => 'Pokaž změny slědnych $1 góźinow, $2 dnjow abo $3 (w slědnych 30 dnjach).',
'watchlist-options' => 'Opcije wobglědowańki',
@@ -2088,8 +2135,6 @@ Pšašanja a dalšna pomoc:
'actioncomplete' => 'Akcija jo se wugbała.',
'actionfailed' => 'Akcija jo se njeraźiła',
'deletedtext' => '„$1“ jo se wulašował(a/o). W $2 namakajoš lisćinu slědnych wulašowanjow.',
-'deletedarticle' => 'jo "[[$1]]" wulašował',
-'suppressedarticle' => '"[[$1]]" pódtłocony',
'dellogpage' => 'Protokol wulašowanjow',
'dellogpagetext' => 'How jo protokol wulašowanych bokow a datajow.',
'deletionlog' => 'protokol wulašowanjow',
@@ -2134,7 +2179,10 @@ Pšosym nawroś se na bok, wót kótaregož sy pśišeł a wopytaj hyšći raz.'
'unprotectedarticle' => 'jo šćit za „[[$1]]“ wótpórał',
'movedarticleprotection' => 'šćitowe nastajenja z "[[$2]]" do "[[$1]]" psésunjone',
'protect-title' => 'Šćit boka „$1“ změniś',
+'protect-title-notallowed' => 'Šćitny stopjeń za "$1" pokazaś',
'prot_1movedto2' => '„[[$1]]“ pśesunjone na „[[$2]]“',
+'protect-badnamespace-title' => 'Nješćitajobny mjenjowy rum',
+'protect-badnamespace-text' => 'Boki w toś tom mjenjowem rumje njedaju se šćitaś.',
'protect-legend' => 'Šćitanje wobkšuśiś',
'protectcomment' => 'Pśicyna:',
'protectexpiry' => 'cas wótběžy:',
@@ -2152,6 +2200,7 @@ Pšosym nawroś se na bok, wót kótaregož sy pśišeł a wopytaj hyšći raz.'
'protect-level-sysop' => 'Jano administratory',
'protect-summary-cascade' => 'kaskaděrujucy',
'protect-expiring' => 'kóńcy $1 (UTC)',
+'protect-expiring-local' => 'płaśiwy do $1',
'protect-expiry-indefinite' => 'njewobgranicowany',
'protect-cascade' => 'Kaskaděrujucy šćit – wšykne pśedłogi, kótarež su zawězane do toś togo boka, tejerownosći se zamknu.',
'protect-cantedit' => 'Njamóžoš šćitne rowniny toś tego boka změniś, dokulaž njamaš dowólnosć toś ten bok wobźěłaś.',
@@ -2209,7 +2258,6 @@ W takich padach dejš nejnowše wulašowane wersije markěroanje abo schowanje w
'undeletereset' => 'Slědk wześ',
'undeleteinvert' => 'Wuběrk pśewobrośiś',
'undeletecomment' => 'Pśicyna:',
-'undeletedarticle' => 'bok „[[$1]]“ nawrośony',
'undeletedrevisions' => '{{PLURAL:$1|1 wersija jo se nawrośiła|$1 wersiji stej se nawrośiłej|$1 wersije su se nawrośili}}.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 wersija|$1 wersiji|$1 wersije}} a {{PLURAL:$2|1 dataja|$2 dataji|$2 dataje}} {{PLURAL:$2|jo se nawrośiła|stej se nawrośiłej|su se nawrośili}}.',
'undeletedfiles' => '{{PLURAL:$1|1 dataja jo se nawrośiła|$1 dataji stej se nawrośiłej|$1 dataje su se nawrośili}}.',
@@ -2218,6 +2266,7 @@ W takich padach dejš nejnowše wulašowane wersije markěroanje abo schowanje w
W [[Special:Log/delete|log-lisćinje wulašowanjow]] namakajoš pśeglěd wulašowanych a nawrośonych bokow.",
'undelete-header' => 'Gano wulašowane boki wiźiš w [[Special:Log/delete|log-lisćinje wulašowanjow]].',
+'undelete-search-title' => 'Wulašowane boki pytaś',
'undelete-search-box' => 'Wulašowane boki pytaś',
'undelete-search-prefix' => 'Pokaž boki, kótarež zachopiju z:',
'undelete-search-submit' => 'PytaÅ›',
@@ -2226,6 +2275,7 @@ W [[Special:Log/delete|log-lisćinje wulašowanjow]] namakajoš pśeglěd wulaš
'undelete-bad-store-key' => 'Njejo móžno było, wersiju z casowym kołkom $1 nawrośiś: Dataja južo pśed wulašowanim njejo eksistěrowała.',
'undelete-cleanup-error' => 'Zmólka pśi wulašowanju njewužywaneje archiwneje dataje $1.',
'undelete-missing-filearchive' => 'Njejo móžno, archiwnu dataju ID $1 nawrośiś. Wóna južo w datowej bance njejo. Snaź jo južo raz se nawrośiła.',
+'undelete-error' => 'Zmólka pśi wulašowanju boka',
'undelete-error-short' => 'Zmólka pśi nawrośenju dataje: $1',
'undelete-error-long' => 'Zmólki pśi nawrośenju dataje:
@@ -2344,6 +2394,7 @@ Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěro
'blocklist-userblocks' => 'Kontowe blokěrowanja schowaś',
'blocklist-tempblocks' => 'Nachylne blokěrowanja schowaś',
'blocklist-addressblocks' => 'Blokěrowanja jadnotliwych IP-adresow schowaś',
+'blocklist-rangeblocks' => 'Blokěrowanja wobcerkow schowaś',
'blocklist-timestamp' => 'Casowy kołk',
'blocklist-target' => 'Cel',
'blocklist-expiry' => 'Pśepadnjo',
@@ -2366,6 +2417,7 @@ Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěro
'unblocklink' => 'dopušćiś',
'change-blocklink' => 'Blokěrowanje změniś',
'contribslink' => 'pśinoski',
+'emaillink' => 'E-mail pósłaś',
'autoblocker' => 'Awtomatiski blokěrowany, dokulaž twója IP-adresa jo se rowno wót "[[User:$1|$1]]". Pśicyna za blokěrowanje wužywarja $1 jo: "$2".',
'blocklogpage' => 'Protokol blokěrowanjow',
'blocklog-showlog' => 'Toś ten wužywaŕ jo se pjerwjej zablokěrował. Protokol blokěrowanjow pódawa se dołojce ako referenca:',
@@ -2482,9 +2534,6 @@ W toś tyma padoma dej wopśimjeśe boka manualnje se pśesunuś resp. gromadu w
'movepage-page-moved' => 'Bok $1 jo se do $2 pśesunuł.',
'movepage-page-unmoved' => 'Bok $1 njejo se do $2 pśesunuś dał.',
'movepage-max-pages' => 'Maksimalna licba $1 {{PLURAL:$1|boka|bokowu|bokow|bokow}} jo se pśesunuła a žedne dalšne wěcej njedaje se awtomatiski pśesunuś.',
-'1movedto2' => '„[[$1]]“ pśesunjone na „[[$2]]“',
-'1movedto2_redir' => 'Nastawk „[[$1]]“ jo se pśesunuł na „[[$2]]“. Pśi tom jo jadno dalejpósrědnjenje se pśepisało.',
-'move-redirect-suppressed' => 'dalejpósrědnjenje pódtłocone',
'movelogpage' => 'Protokol pśesunjenjow',
'movelogpagetext' => 'How jo lisćina wšyknych pśesunjonych bokow.',
'movesubpage' => '{{PLURAL:$1|Pódbok|Pódboka|Pódboki|Pódbokow}}',
@@ -2497,7 +2546,7 @@ W toś tyma padoma dej wopśimjeśe boka manualnje se pśesunuś resp. gromadu w
Bok „[[:$1]]“ južo eksistěrujo. Coš jen wulašowaś, aby mógał toś ten bok pśesunuś?',
'delete_and_move_confirm' => 'Jo, toś ten bok wulašowaś',
-'delete_and_move_reason' => 'wulašowane, aby było městno za pśesunjenje',
+'delete_and_move_reason' => 'Wulašowane, aby městno za pśesunjenje boka "[[$1]]" napórał',
'selfmove' => 'Wuchadne a celowe mě stej identiskej; njejo móžno, bok na sam se pśesunuś.',
'immobile-source-namespace' => 'Boki w mjenjowem rumje "$1" njedaju se pśesunuś',
'immobile-target-namespace' => 'Boki njedaju se do mjenjowego ruma "$1" pśesunuś',
@@ -2526,9 +2575,11 @@ Pšosym wubjeŕ druge mě.',
Za eksportěrowanje bokow zapódaj nadpisma do dołojcnego tekstowogo póla, jadno nadpismo na smužku, a wuzwól nowe a stare wersije z wótkazami stawiznow boka abo jano aktualnu wersiju z informacijami wó slědnjej změnje.
W slědnem padźe móžoš teke wótkaz wužywaś, na pś. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za bok "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Wšykne boki eksportěrowaś',
'exportcuronly' => 'Jano aktualne wersije, bźez stawiznow',
'exportnohistory' => "----
'''Pokazka:''' Eksportěrowanje cełych stawiznow bokow pśez toś ten formular njejo dla performancowych pśicyn tuchylu móžne.",
+'exportlistauthors' => 'Za kuždy bok lisćinu wobźěłarjow zapśimjeś',
'export-submit' => 'Eksportěrowaś',
'export-addcattext' => 'Pśidaś boki z kategorije:',
'export-addcat' => 'DodaÅ›',
@@ -2561,6 +2612,8 @@ Pšosym wobglědaj [//www.mediawiki.org/wiki/Localisation lokalizaciju MediaWiki
'thumbnail_error' => 'Zmólka pśi stwórjenju pśeglěda: $1',
'djvu_page_error' => 'DjVu-bok pśesegujo wobłuk.',
'djvu_no_xml' => 'Njejo móžno, XML za DjVu-dataju wótwołaś.',
+'thumbnail-temp-create' => 'Temporerna dataja za miniaturny wobrazk njedajo se napóraś',
+'thumbnail-dest-create' => 'Miniaturny wobrazk njedajo se na celowem městnje składowaś',
'thumbnail_invalid_params' => 'Njepłaśece parametry pśeglěda',
'thumbnail_dest_directory' => 'Njejo móžno celowy zapis stwóriś.',
'thumbnail_image-type' => 'Wobrazy typ se njepódpěra',
@@ -2604,6 +2657,11 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
'import-upload' => 'XML-daty nagraÅ›',
'import-token-mismatch' => 'Zgubjenje posejźeńskich datow. Pšosym wopytaj hyšći raz.',
'import-invalid-interwiki' => 'Njejo móžno importěrowaś z pódanego wikija.',
+'import-error-edit' => 'Bok "$1" se njeimportěrujo, dokulaž njesmějoš jen wobźěłaś.',
+'import-error-create' => 'Bok "$1" se njeimportěrujo, dokulaž njesmějoš jen napóraś.',
+'import-error-interwiki' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo za eksterne wótkazowanje (interwiki) wuměnjone.',
+'import-error-special' => 'Bok "$1" se njeimportěrujo, dokulaž słuša k wósebnemu mjenjowemu rumoju, kótaryž njedowólujo boki.',
+'import-error-invalid' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo njepłaśiwe.',
# Import log
'importlogpage' => 'Log-lisćinu importěrowaś',
@@ -2613,73 +2671,86 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
'import-logentry-interwiki' => 'Dataja $1 jo se importěrowała (transwiki).',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|$1 wersija|$1 wersiji|$1 wersije}} wót $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScriptowy test',
+'javascripttest-disabled' => 'Toś ta funkcija jo znjemóžnjona.',
+'javascripttest-title' => 'Testy $1 se pśewjeduju',
+'javascripttest-pagetext-noframework' => 'Toś ten bok jo pśewjedowanjeju javascriptowych testow pśewóstajony.',
+'javascripttest-pagetext-unknownframework' => 'Njeznaty wobłuk "$1".',
+'javascripttest-pagetext-frameworks' => 'Pšosym wubjeŕ jaden ze slědujucych testowańskich wobłukow: $1',
+'javascripttest-pagetext-skins' => 'Wubjeŕ drastwu za pśewjeźenje testow:',
+'javascripttest-qunit-intro' => 'Glědaj [$1 testowańsku dokumentaciju] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Twój wužywarski bok',
-'tooltip-pt-anonuserpage' => 'Wužywarski bok za IP-adresu, z kótarejuž bok wobźěłajoš',
-'tooltip-pt-mytalk' => 'Twój diskusijny bok',
-'tooltip-pt-anontalk' => 'Diskusija wó změnach z tuteje IP-adresy.',
-'tooltip-pt-preferences' => 'Móje pśistajenja',
-'tooltip-pt-watchlist' => 'Lisćina bokow, kótarež se wobglěduju',
-'tooltip-pt-mycontris' => 'Lisćina twójich pśinoskow',
-'tooltip-pt-login' => 'Pśizjawjenje njejo obligatoriske, ale lubje witane.',
-'tooltip-pt-anonlogin' => 'Pśizjawjenje njejo obligatoriske, ale lubje witane.',
-'tooltip-pt-logout' => 'Wótzjawiś',
-'tooltip-ca-talk' => 'Diskusija wó wopśimjeśu boka',
-'tooltip-ca-edit' => 'Móžoš bok wobźěłaś. Nježlic składujoš, wužywaj pšosym funkciju "pśeglěd".',
-'tooltip-ca-addsection' => 'Nowy wótrězk zachopiś',
-'tooltip-ca-viewsource' => 'Bok jo šćitany. Jo móžno, žrědłowy tekst woglědaś.',
-'tooltip-ca-history' => 'Něgajšne wersije togo boka.',
-'tooltip-ca-protect' => 'Toś ten bok šćitaś',
-'tooltip-ca-unprotect' => 'Šćit toś togo boka změniś',
-'tooltip-ca-delete' => 'Toś ten bok wulašowaś',
-'tooltip-ca-undelete' => 'Zapise pśed wulašowanim boka nawrośiś.',
-'tooltip-ca-move' => 'Toś ten bok pśesunuś',
-'tooltip-ca-watch' => 'Dodaj toś ten bok do swójeje wobglědowańskeje lisćiny.',
-'tooltip-ca-unwatch' => 'Bok z wobglědowańskeje lisćiny wulašowaś',
-'tooltip-search' => 'Pśepytaś {{SITENAME}}',
-'tooltip-search-go' => 'Źi direktnje na bok z toś tym mjenim.',
-'tooltip-search-fulltext' => 'ToÅ› ten tekst w bokach pytaÅ›',
-'tooltip-p-logo' => 'GÅ‚owny bok',
-'tooltip-n-mainpage' => 'Glowny bok pokazaÅ›',
-'tooltip-n-mainpage-description' => 'Hłownu stronu wopytać',
-'tooltip-n-portal' => 'Wó portalu, co móžoš cyniś, źo co namakajoš',
-'tooltip-n-currentevents' => 'Slězynowe informacije k aktualnym tšojenjam',
-'tooltip-n-recentchanges' => 'Lisćina aktualnych změnow w(e) {{SITENAME}}.',
-'tooltip-n-randompage' => 'Pśipadny bok',
-'tooltip-n-help' => 'Pomocny bok pokazaÅ›',
-'tooltip-t-whatlinkshere' => 'Lisćina wšyknych wiki bokow, kótarež how wótkazuju',
-'tooltip-t-recentchangeslinked' => 'Aktualne změny w bokach, na kótarež toś ten bok wótkazujo',
-'tooltip-feed-rss' => 'RSS-feed za toÅ› ten bok',
-'tooltip-feed-atom' => 'Atom-feed za toÅ› ten bok',
-'tooltip-t-contributions' => 'Pśinoski togo wužywarja wobglědowaś',
-'tooltip-t-emailuser' => 'Wužywarjeju e-mail pósłaś',
-'tooltip-t-upload' => 'Dataje nagraÅ›',
-'tooltip-t-specialpages' => 'Lisćina wšyknych specialnych bokow',
-'tooltip-t-print' => 'Śišćańska wersija boka',
-'tooltip-t-permalink' => 'Stawny wótkaz na toś tu wersiju boka',
-'tooltip-ca-nstab-main' => 'Wopśimjeśe pokazaś',
-'tooltip-ca-nstab-user' => 'Wužywarski bok pokazaś',
-'tooltip-ca-nstab-media' => 'PokazaÅ› bok medijow/datajow.',
-'tooltip-ca-nstab-special' => 'To jo specialny bok, kótaryž njedajo se wobźěłaś.',
-'tooltip-ca-nstab-project' => 'Portal pokazaÅ›',
-'tooltip-ca-nstab-image' => 'Bok z datajami pokazaÅ›',
-'tooltip-ca-nstab-mediawiki' => 'Systemowy tekst pokazaÅ›',
-'tooltip-ca-nstab-template' => 'Pśedłogu pokazaś',
-'tooltip-ca-nstab-help' => 'Pomocny bok pokazaÅ›',
-'tooltip-ca-nstab-category' => 'Bok kategorijow pokazaÅ›',
-'tooltip-minoredit' => 'Změnu ako drobnu markěrowaś',
-'tooltip-save' => 'Změny składowaś',
-'tooltip-preview' => "Pšosym '''pśeglěd změnow''' wužywaś, nježlic až składujoš!",
-'tooltip-diff' => 'Pokazujo změny teksta w tabelariskej formje.',
-'tooltip-compareselectedversions' => 'Wuzwólonej wersiji boka pśirownowaś',
-'tooltip-watch' => 'Toś ten bok wobglědowańce dodaś',
-'tooltip-recreate' => 'Bok nawrośiś, lěcrowno jo był wulašowany',
-'tooltip-upload' => 'Nagraśe zachopiś',
-'tooltip-rollback' => '"Roolback" anulěrujo změny slědnego wužywarja na toś tom boku z jadnym kliknjenim.',
-'tooltip-undo' => 'Anulěrujo toś tu změnu a wócynijo wobźěłański formular w pśeglědowem modusu.
+'tooltip-pt-userpage' => 'Twój wužywarski bok',
+'tooltip-pt-anonuserpage' => 'Wužywarski bok za IP-adresu, z kótarejuž bok wobźěłajoš',
+'tooltip-pt-mytalk' => 'Twój diskusijny bok',
+'tooltip-pt-anontalk' => 'Diskusija wó změnach z tuteje IP-adresy.',
+'tooltip-pt-preferences' => 'Móje pśistajenja',
+'tooltip-pt-watchlist' => 'Lisćina bokow, kótarež se wobglěduju',
+'tooltip-pt-mycontris' => 'Lisćina twójich pśinoskow',
+'tooltip-pt-login' => 'Pśizjawjenje njejo obligatoriske, ale lubje witane.',
+'tooltip-pt-anonlogin' => 'Pśizjawjenje njejo obligatoriske, ale lubje witane.',
+'tooltip-pt-logout' => 'Wótzjawiś',
+'tooltip-ca-talk' => 'Diskusija wó wopśimjeśu boka',
+'tooltip-ca-edit' => 'Móžoš bok wobźěłaś. Nježlic składujoš, wužywaj pšosym funkciju "pśeglěd".',
+'tooltip-ca-addsection' => 'Nowy wótrězk zachopiś',
+'tooltip-ca-viewsource' => 'Bok jo šćitany. Jo móžno, žrědłowy tekst woglědaś.',
+'tooltip-ca-history' => 'Něgajšne wersije togo boka.',
+'tooltip-ca-protect' => 'Toś ten bok šćitaś',
+'tooltip-ca-unprotect' => 'Šćit toś togo boka změniś',
+'tooltip-ca-delete' => 'Toś ten bok wulašowaś',
+'tooltip-ca-undelete' => 'Zapise pśed wulašowanim boka nawrośiś.',
+'tooltip-ca-move' => 'Toś ten bok pśesunuś',
+'tooltip-ca-watch' => 'Dodaj toś ten bok do swójeje wobglědowańskeje lisćiny.',
+'tooltip-ca-unwatch' => 'Bok z wobglědowańskeje lisćiny wulašowaś',
+'tooltip-search' => 'Pśepytaś {{SITENAME}}',
+'tooltip-search-go' => 'Źi direktnje na bok z toś tym mjenim.',
+'tooltip-search-fulltext' => 'ToÅ› ten tekst w bokach pytaÅ›',
+'tooltip-p-logo' => 'GÅ‚owny bok',
+'tooltip-n-mainpage' => 'Glowny bok pokazaÅ›',
+'tooltip-n-mainpage-description' => 'Hłownu stronu wopytać',
+'tooltip-n-portal' => 'Wó portalu, co móžoš cyniś, źo co namakajoš',
+'tooltip-n-currentevents' => 'Slězynowe informacije k aktualnym tšojenjam',
+'tooltip-n-recentchanges' => 'Lisćina aktualnych změnow w(e) {{SITENAME}}.',
+'tooltip-n-randompage' => 'Pśipadny bok',
+'tooltip-n-help' => 'Pomocny bok pokazaÅ›',
+'tooltip-t-whatlinkshere' => 'Lisćina wšyknych wiki bokow, kótarež how wótkazuju',
+'tooltip-t-recentchangeslinked' => 'Aktualne změny w bokach, na kótarež toś ten bok wótkazujo',
+'tooltip-feed-rss' => 'RSS-feed za toÅ› ten bok',
+'tooltip-feed-atom' => 'Atom-feed za toÅ› ten bok',
+'tooltip-t-contributions' => 'Pśinoski togo wužywarja wobglědowaś',
+'tooltip-t-emailuser' => 'Wužywarjeju e-mail pósłaś',
+'tooltip-t-upload' => 'Dataje nagraÅ›',
+'tooltip-t-specialpages' => 'Lisćina wšyknych specialnych bokow',
+'tooltip-t-print' => 'Śišćańska wersija boka',
+'tooltip-t-permalink' => 'Stawny wótkaz na toś tu wersiju boka',
+'tooltip-ca-nstab-main' => 'Wopśimjeśe pokazaś',
+'tooltip-ca-nstab-user' => 'Wužywarski bok pokazaś',
+'tooltip-ca-nstab-media' => 'PokazaÅ› bok medijow/datajow.',
+'tooltip-ca-nstab-special' => 'To jo specialny bok, kótaryž njedajo se wobźěłaś.',
+'tooltip-ca-nstab-project' => 'Portal pokazaÅ›',
+'tooltip-ca-nstab-image' => 'Bok z datajami pokazaÅ›',
+'tooltip-ca-nstab-mediawiki' => 'Systemowy tekst pokazaÅ›',
+'tooltip-ca-nstab-template' => 'Pśedłogu pokazaś',
+'tooltip-ca-nstab-help' => 'Pomocny bok pokazaÅ›',
+'tooltip-ca-nstab-category' => 'Bok kategorijow pokazaÅ›',
+'tooltip-minoredit' => 'Změnu ako drobnu markěrowaś',
+'tooltip-save' => 'Změny składowaś',
+'tooltip-preview' => "Pšosym '''pśeglěd změnow''' wužywaś, nježlic až składujoš!",
+'tooltip-diff' => 'Pokazujo změny teksta w tabelariskej formje.',
+'tooltip-compareselectedversions' => 'Wuzwólonej wersiji boka pśirownowaś',
+'tooltip-watch' => 'Toś ten bok wobglědowańce dodaś',
+'tooltip-watchlistedit-normal-submit' => 'Titele wótpóraś',
+'tooltip-watchlistedit-raw-submit' => 'Wobglědowańku aktualizěrowaś',
+'tooltip-recreate' => 'Bok nawrośiś, lěcrowno jo był wulašowany',
+'tooltip-upload' => 'Nagraśe zachopiś',
+'tooltip-rollback' => '"Roolback" anulěrujo změny slědnego wužywarja na toś tom boku z jadnym kliknjenim.',
+'tooltip-undo' => 'Anulěrujo toś tu změnu a wócynijo wobźěłański formular w pśeglědowem modusu.
W zespominanju dajo se pśicyna pódaś.',
-'tooltip-preferences-save' => 'Nastajenja składowaś',
-'tooltip-summary' => 'Zapódaj krotke zespominanje',
+'tooltip-preferences-save' => 'Nastajenja składowaś',
+'tooltip-summary' => 'Zapódaj krotke zespominanje',
# Stylesheets
'common.css' => '/** Na toś tom městnje wustatkujo se CSS na wšykne šaty. */',
@@ -2749,9 +2820,6 @@ W zespominanju dajo se pśicyna pódaś.',
# Patrol log
'patrol-log-page' => 'Protokol kontrolow',
'patrol-log-header' => 'To jo protokol pśekontrolowanych wersijow.',
-'patrol-log-line' => 'markěrował $1 wót $2 ako kontrolěrowane $3.',
-'patrol-log-auto' => '(awtomatiski)',
-'patrol-log-diff' => 'Wersija $1',
'log-show-hide-patrol' => 'Protokol doglědowanja $1',
# Image deletion
@@ -2777,11 +2845,11 @@ $1',
'file-info' => 'wjelikosć dataje: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 pikselow, wjelikosć dataje: $3, MIME-Typ: $4',
'file-info-size-pages' => '$1 × $2 pikselow, wjelikosć dataje: $3, MIME-typ: $4, $5 {{PLURAL:$5|bok|boka|boki|bokow}}',
-'file-nohires' => '<small>Wuše wótgranicowanje njeeksistěrujo.</small>',
+'file-nohires' => 'Wuše wótgranicowanje njeeksistěrujo.',
'svg-long-desc' => 'dataja SVG, nominalnje: $1 × $2 piksele, wjelikosć dataje: $3',
'show-big-image' => 'Połne optiske wótgranicowanje.',
-'show-big-image-preview' => '<small>Wjelikosć toś togo pśeglěda: $1.</small>',
-'show-big-image-other' => '<small>Druge rozeznaśa: $1.</small>',
+'show-big-image-preview' => 'Wjelikosć toś togo pśeglěda: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druge rozeznaśe||Drugej rozeznaśi|Druge rozeznaśa|Druge rozeznaśa}}: $1.',
'show-big-image-size' => '$1 × $2 pikselow',
'file-info-gif-looped' => 'bźezkóńcna šlejfa',
'file-info-gif-frames' => '$1 {{PLURAL:$1|wobłuk|wobłuka|wobłuki|wobłukow}}',
@@ -2801,6 +2869,13 @@ $1',
'bydate' => 'pó datumje',
'sp-newimages-showfrom' => 'Pokaž nowe dataje wót $1, $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekundu|$1 sekundoma|$1 sekundami|$1 sekundami}}',
+'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutoma|$1 minutami|$1 minutami}}',
+'hours' => '{{PLURAL:$1|$1 góźinu|$1 góźinoma|$1 góźinami|$1 góźinami}}',
+'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjoma|$1 dnjami|$1 dnjami}}',
+'ago' => 'pśed $1',
+
# Bad image list
'bad_image_list' => 'Format jo slědujucy:
@@ -3287,13 +3362,6 @@ Toś ten wobkšuśeński kod płaśi až do $4.',
'scarytranscludefailed' => '[Zapśěgnjenje pśedłogi za $1 njejo se raźiło]',
'scarytranscludetoolong' => '[URL jo pśedłujki]',
-# Trackbacks
-'trackbackbox' => 'Trackbacki za toÅ› ten bok:<br />
-$1',
-'trackbackremove' => '([$1 wulašowaś])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback jo wuspěšnje wulašowany.',
-
# Delete conflict
'deletedwhileediting' => "'''Warnowanje''': Toś ten bok se wulašujo, gaž zachopijoš jen wobźěłaś!",
'confirmrecreate' => "Wužywaŕ [[User:$1|$1]] ([[User talk:$1|diskusija]]) jo bok wulašował, nježli až sy zachopił jen wobźěłaś, pśicyna:
@@ -3386,6 +3454,9 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
'iranian-calendar-m11' => 'Bahman',
'iranian-calendar-m12' => 'Esfand',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusija]])',
+
# Core parser functions
'unknown_extension_tag' => 'Njeznaty tag rozšyrjenja „$1“',
'duplicate-defaultsort' => 'Glědaj: Standardny sortěrowański kluc (DEFAULT SORT KEY) "$2" pśepišo pjerwjej wužyty kluc "$1".',
@@ -3441,8 +3512,7 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
'specialpages' => 'Specialne boki',
'specialpages-note' => '----
* Normalne specialne boki
-* <span class="mw-specialpagerestricted">Specialne boki z wobgranicowanym pśistupom.</span>
-* <span class="mw-specialpagecached">Specialne boki z pufrowaka.</span>',
+* <span class="mw-specialpagerestricted">Specialne boki z wobgranicowanym pśistupom.</span>',
'specialpages-group-maintenance' => 'Wótwardowańske lisćiny',
'specialpages-group-other' => 'Druge specialne boki',
'specialpages-group-login' => 'Pśizjawjenje',
@@ -3484,13 +3554,16 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
# Special:ComparePages
-'comparepages' => 'Boki pśirownaś',
-'compare-selector' => 'Wersije boka pśirownaś',
-'compare-page1' => 'Bok 1',
-'compare-page2' => 'Bok 2',
-'compare-rev1' => 'Wersija 1',
-'compare-rev2' => 'Wersija 2',
-'compare-submit' => 'Pśirownaś',
+'comparepages' => 'Boki pśirownaś',
+'compare-selector' => 'Wersije boka pśirownaś',
+'compare-page1' => 'Bok 1',
+'compare-page2' => 'Bok 2',
+'compare-rev1' => 'Wersija 1',
+'compare-rev2' => 'Wersija 2',
+'compare-submit' => 'Pśirownaś',
+'compare-invalid-title' => 'Titel, kótaryž sy pódał, jo njepłaśiwy.',
+'compare-title-not-exists' => 'Titel, kótaryž sy pódał, njeeksistěrujo.',
+'compare-revision-not-exists' => 'Wersija, kótaruž sy pódał, njeeksistěrujo.',
# Database error messages
'dberr-header' => 'ToÅ› ten wiki ma problem',
@@ -3517,4 +3590,90 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
'sqlite-has-fts' => 'Wersija $1 z pódpěru za połnotekstowe pytanje',
'sqlite-no-fts' => 'Wersija $1 bźez pódpěry za połnotekstowe pytanje',
+# New logging system
+'logentry-delete-delete' => '$1 jo bok $3 wulašował',
+'logentry-delete-restore' => '$1 jo bok $3 wótnowił',
+'logentry-delete-event' => '$1 jo změnił widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
+'logentry-delete-revision' => '$1 jo změnił widobnosć {{PLURAL:$5|wersije|$5 wersijowu|$5 wersijow|$5 wersijow}} na boku $3: $4',
+'logentry-delete-event-legacy' => '$1 jo změnił widobnosć protokolowych zapiskow na $3',
+'logentry-delete-revision-legacy' => '$1 jo změnił widobnosć wersijow na boku $3',
+'logentry-suppress-delete' => '$1 jo pódtłocył bok $3',
+'logentry-suppress-event' => '$1 jo kšajźu změnił widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
+'logentry-suppress-revision' => '$1 jo kšajźu změnił widobnosć {{PLURAL:$5|wersije|$5 wersijowu|$5 wersijow|$5 wersijow}} na boku $3: $4',
+'logentry-suppress-event-legacy' => '$1 jo kšajźu změnił widobnosć protokolowych zapiskow na $3',
+'logentry-suppress-revision-legacy' => '$1 jo kšajźu změnił widobnosć wersijow na boku $3',
+'revdelete-content-hid' => 'wopśimjeśe schowane',
+'revdelete-summary-hid' => 'Zespominanje schowane',
+'revdelete-uname-hid' => 'wužywarske mě schowane',
+'revdelete-content-unhid' => 'wopśimjeśe widobne',
+'revdelete-summary-unhid' => 'zespominanje widobne',
+'revdelete-uname-unhid' => 'wužywarske mě widobne',
+'revdelete-restricted' => 'Wobgranicowanja se teke na administratorow nałožuju',
+'revdelete-unrestricted' => 'Wobgranicowanja za administratorow wótpórane',
+'logentry-move-move' => '$1 jo pśesunuł bok $3 do $4',
+'logentry-move-move-noredirect' => '$1 jo pśesunuł bok $3 do $4, mimo až jo napórał dalejpósrědnjenje',
+'logentry-move-move_redir' => '$1 jo pśesunuł bok $3 do $4 a jo pśepisał dalejpósrědnjenje',
+'logentry-move-move_redir-noredirect' => '$1 jo pśesunuł bok $3 do $4 a jo pśepisał dalejpósrědnjenje, mimo až jo napórał dalejpósrědnjenje',
+'logentry-patrol-patrol' => '$1 jo markěrował wersiju $4 boka $3 ako doglědowanu',
+'logentry-patrol-patrol-auto' => '$1 jo awtomatiski markěrował wersiju $4 boka $3 ako doglědowanu',
+'logentry-newusers-newusers' => '$1 jo załožył wužywarske konto',
+'logentry-newusers-create' => '$1 jo załožył wužywarske konto',
+'logentry-newusers-create2' => '$1 jo załožył wužywarske konto $3',
+'logentry-newusers-autocreate' => 'Konto $1 jo se awtomatiski załožyło',
+'newuserlog-byemail' => 'Pótajne słowo bu pśez e-mail pósłane.',
+
+# Feedback
+'feedback-bugornote' => 'Jolic sy zwólny, techniski problem nadrobnje wopisaś, [$1 daj pšosym zmólku k wěsći].
+Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo se bokoju "[$3 $2]", z twójim wužywarskim mjenim a z wobglědowakom, kótaryž wužywaš.',
+'feedback-subject' => 'Tema:',
+'feedback-message' => 'Powěsć:',
+'feedback-cancel' => 'Pśetergnuś',
+'feedback-submit' => 'Komentar wótpósłaś',
+'feedback-adding' => 'Komentar pśidawa se bokoju...',
+'feedback-error1' => 'Zmólka: Njepóznaty wuslědk wót API',
+'feedback-error2' => 'Zmólka: Wobźěłanje jo se njeraźiło',
+'feedback-error3' => 'Zmólka: Žedne wótegrono wót API',
+'feedback-thanks' => 'Źěkujomy se! Twój komentar jo se k bokoju "[$2 $1]" pósłał.',
+'feedback-close' => 'Dokóńcony',
+'feedback-bugcheck' => 'Wjelicnje! Pśekontrolěruj jano, lěc to njejo jadna z [$1 znatych zmólkow].',
+'feedback-bugnew' => 'Som pśekontrolěrował. Nowu zmólku k wěsći daś',
+
+# API errors
+'api-error-badaccess-groups' => 'Njamaš pšawo dataje do toś togo wikija nagraś.',
+'api-error-badtoken' => 'Nutśikowna zmólka: Wopacny token',
+'api-error-copyuploaddisabled' => 'Nagrawanje pśez URL jo na toś tom serwerje znjemóžnjone.',
+'api-error-duplicate' => '{{PLURAL:$1|Jo|Stej|Su|Jo}} južo {{PLURAL:$1|[$2 druga dataja]|[$2 drugej dataji]|[$2 druge dataje]|[$2 drugich datajow]}} z tym samym wopśimjeśim na sedle',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Jo była [$2 druga dataja]|Stej byłej [$2 drugej dataji]|Su byli [$2 druge dataje]|Jo było [$2 drugich datajow]}} južo na websedle z tym samym wopśimjeśim, ale {{PLURAL:$1|jo se wulašowała|stej se wulašowałej|su se wulašowali|jo se wulašowało}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Dwójna dataja, kótaraž jo|Dwójnej dataji, kótarejž stej|Dwójne dataje, kótarež su|Dwójne dataje, kótarež su}} se južo {{PLURAL:$1|wulašowała|wulašowałej|wulašowali|wulašowali}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}',
+'api-error-empty-file' => 'Dataja, kótaruž sy nagrał, jo prozna była.',
+'api-error-emptypage' => 'Napóranje nowych, proznych bokow njejo dowólone.',
+'api-error-fetchfileerror' => 'Nutśikowna zmólka: Pśii wobstarowanju dataje jo se něco njeraźiło.',
+'api-error-file-too-large' => 'Dataja, kótaruž sy nagrał, jo pśewjelika była.',
+'api-error-filename-tooshort' => 'Datajowe mě jo pśekrotke.',
+'api-error-filetype-banned' => 'ToÅ› ten datajowy typ jo zakazany.',
+'api-error-filetype-missing' => 'Dataja njama datajowu kóńcowku.',
+'api-error-hookaborted' => 'Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjenje.',
+'api-error-http' => 'Nutśikowna zmólka: Zwisk ze serwerom njemóžno.',
+'api-error-illegal-filename' => 'Datajowe mě njejo dowólone.',
+'api-error-internal-error' => 'Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki jo se něco njeraźiło.',
+'api-error-invalid-file-key' => 'Nutśikowna zmólka: Dataja njejo se w temporernem składowaku namakała.',
+'api-error-missingparam' => 'Nutśikowna zmólka: Felujuce parametry pśi napšašowanju.',
+'api-error-missingresult' => 'Nutśikowna zmólka: Njedajo se zwěsćiś, lěc kopěrowanje jo se raźiło.',
+'api-error-mustbeloggedin' => 'Musyš pśizjawjony byś, aby dataje nagrał.',
+'api-error-mustbeposted' => 'Nutśikowna zmólka: Napšašowanje pomina se HTTP POST.',
+'api-error-noimageinfo' => 'Nagraśe jo se raźiło, ale serwer njejo nam žedne informacije wó dataji dał.',
+'api-error-nomodule' => 'Nutśikowna zmólka: Žeden modul nastajony.',
+'api-error-ok-but-empty' => 'Nutśikowna zmólka: Žedne wótegrono wót serwera.',
+'api-error-overwrite' => 'Pśepisowanje eksistujuceje dataje njejo dowólone.',
+'api-error-stashfailed' => 'Nutśikowna zmólka: Serwer njejo mógał temporernu dataju składowaś.',
+'api-error-timeout' => 'Serwer njejo we wócakanem casu wótgronił.',
+'api-error-unclassified' => 'Njeznata zmólka jo nastała.',
+'api-error-unknown-code' => 'Njeznata zmólka: "$1"',
+'api-error-unknown-error' => 'Nutśikowna zmólka: Pśi nagrawanju twójeje dataje jo se něco njeraźiło.',
+'api-error-unknown-warning' => 'Njeznate warnowanje: $1',
+'api-error-unknownerror' => 'Njeznata zmólka: "$1".',
+'api-error-uploaddisabled' => 'Nagraśa su na toś tom wikiju znjemóžnjone.',
+'api-error-verification-error' => 'Toś ta dataja by mógła wobkškóźona byś abo wopacnu kóńcowku měś.',
+
);
diff --git a/languages/messages/MessagesDtp.php b/languages/messages/MessagesDtp.php
index 1dcd87ea..803d80ca 100644
--- a/languages/messages/MessagesDtp.php
+++ b/languages/messages/MessagesDtp.php
@@ -371,15 +371,14 @@ Nopugas no kaanto do tulun suai.',
'badtitle' => 'Sosomu tuluhon',
'badtitletext' => 'Tuluhon bobolikon di pinokianu nopo nga nokosilap, aiso, nakasala pinioputan boros toi pinioputan tuluhon wiki.
Haro kaanto sokukuri do iso pimato it awu milo gunoon id pongkotuluhon.',
-'perfcached' => 'Data sumusuhut namadangkob om okon ko noinwoguan.',
-'perfcachedts' => 'Data sumusuhut namadangkob, om nopinwoguan ontok $1.',
+'perfcached' => 'Data sumusuhut namadangkob om okon ko noinwoguan. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Data sumusuhut namadangkob, om nopinwoguan ontok $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pinisok ponginwoguan id bolikon diti.
Awu nodi posikapon do popointalang iri data kawawagu.',
'wrong_wfQuery_params' => 'Nokosilap tangaparamito mongoi wfQuery()<br />
Kopomogunoon: $1<br />
Pongimuhatan: $2',
'viewsource' => 'Intaai wowonod',
-'viewsourcefor' => 'montok $1',
'actionthrottled' => 'Momilos',
'actionthrottledtext' => 'Pinapanau lumawan-singkarap, Nantaban ko do mingguli momonsoi miagal dilo id timpu do osikap, om nagampot nu noh gisom diti.
Umbalan kawagu do katalib poh pipiro minit.',
@@ -531,6 +530,10 @@ Naalanannu noh kaatalib toi nokopokianu koh no do kaatalib daamot.',
'passwordreset-username' => 'Ngarandait:',
'passwordreset-emailtitle' => 'Kointalangan takaun id {{SITENAME}}',
+# Special:ChangeEmail
+'changeemail-no-info' => 'Mositi sumuang log ko do mongoguno monilombus id bolikon diti.',
+'changeemail-cancel' => 'Kinsilo',
+
# Edit page toolbar
'bold_sample' => 'Polombono tik',
'bold_tip' => 'Polombono tik',
@@ -600,9 +603,6 @@ Awu ko milo do mongoguno kakamot 'ponurat-i montok momoguno diti' nung ingaa kin
Kinoyonon IPnu nopo nga $3, on ID nantaban nopo nga #$5.
Alansan do potonudon oinsanan kointalangan id sawat montok nunu-nunu ponguhatannu.",
'blockednoreason' => 'ingaa pinatahak sabab',
-'blockedoriginalsource' => "Tadon do '''$1''' pokitonon id siriba:",
-'blockededitsource' => "Tik do '''niditannu''' gisom '''$1''' pokitonon id siriba:",
-'whitelistedittitle' => 'Sumuang log no do mongidit',
'whitelistedittext' => 'Mositi do $1 do mongidit bobolikon.',
'confirmedittext' => 'Potontuo no do nokogirotnu no kinoyonon surat-i pogulu mongidit do bobolikon.
Maai posoino om pogiroto kinoiyonon surat-i hilo id [[Special:Preferences|komoisaan momomogunonu]].',
@@ -797,8 +797,6 @@ Sobaagi do mongungulud milo ko do montong diti; kointalangan oihum id [{{fullurl
'revdelete-unsuppress' => 'Iduon pangantaban om pogogompi sinimakan',
'revdelete-log' => 'Sabab:',
'revdelete-submit' => 'Pokionuo pinili {{PLURAL:$1|sinimakan|tongosinimakan}}',
-'revdelete-logentry' => 'mongolon sinimakan kokitanan do "[[$1]]"',
-'logdelete-logentry' => 'mongolon tangamaan kokitanan do "[[$1]]"',
'revdelete-success' => "'''Kokitanan sinimakan nopinwoguan.'''",
'revdelete-failure' => "'''Kokitanan sinimakan awu milo inwoguan:'''
$1",
@@ -810,15 +808,6 @@ $1",
'revdel-restore-visible' => 'sinimakan tokito',
'pagehist' => 'Susuyan bolikon',
'deletedhist' => 'Susuyan nopugas',
-'revdelete-content' => 'suang',
-'revdelete-summary' => 'idito koinibaan',
-'revdelete-uname' => 'ngarandait',
-'revdelete-restricted' => 'pinokogos pogoduhan montok momuruan',
-'revdelete-unrestricted' => 'pinoidu pogoduhan montok momuruan',
-'revdelete-hid' => 'lisoko $1',
-'revdelete-unhid' => 'pokitono $1',
-'revdelete-log-message' => '$1 montok $2 {{PLURAL:$2|sinimakan|sinimakan}}',
-'logdelete-log-message' => '$1 montok $2 {{PLURAL:$2|maan|tangamaan}}',
'revdelete-hide-current' => 'Nokosilap popolisok kakamot ditadau $2, $1: iti no sinimakan wagu.
Awu milo polisokon.',
'revdelete-show-no-access' => 'Nokosilap popokito kakamot ditadau $2, $1: natandaan iti do "pogoduhan".
@@ -1103,8 +1092,7 @@ Kointalangan dilo [$2 kointalangan pail] okito id siriba.',
'linksearch-line' => '$1 toput mantad $2',
# Special:Log/newusers
-'newuserlogpage' => 'Log pinamansaian momomoguno',
-'newuserlog-create-entry' => 'Akaun momomoguno kawawagu',
+'newuserlogpage' => 'Log pinamansaian momomoguno',
# Special:ListGroupRights
'listgrouprights-members' => '(lis do kinoruhangan)',
@@ -1138,7 +1126,6 @@ Mangai potontuo do mimang iti no komoyonnu om karati ko do kotutukon, om winonso
'actionfailed' => 'Nantaban karaja',
'deletedtext' => '"$1" nopugas nodi.
Intaai $2 montok ruputan di wagu pinugas.',
-'deletedarticle' => '"[[$1]]" it nopugas',
'dellogpage' => 'Log pinimpugasan',
'deletecomment' => 'Sabab:',
'deleteotherreason' => 'Sabab suai/poinsungku:',
@@ -1173,7 +1160,6 @@ Milo ko nogi do mongolon tingkat tingolig diti, nga ingaa it kosimbanon montok t
# Undelete
'undeletelink' => 'intangai/pogompio',
'undeleteviewlink' => 'intaai',
-'undeletedarticle' => 'potonduliono "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Ponuratan ngaran',
@@ -1266,8 +1252,6 @@ Pilio ngaran suai.',
Maai no longono do posungku.'''",
'movedto' => 'powolihon hilo',
'movetalk' => 'Pooliho bolikon bolotok di poingompinai',
-'1movedto2' => 'pinoundalih [[$1]] kumaa [[$2]]',
-'1movedto2_redir' => 'popoundalih [[$1]] mongoi [[$2]] do montilombus',
'movelogpage' => 'Poundoliho log',
'movereason' => 'Sabab:',
'revertmove' => 'gulio',
@@ -1354,7 +1338,7 @@ Milo ko mongintong do wowonod',
# Media information
'file-info-size' => '$1 × $2 pipisil, sais pail: $3, nuludan MIME: $4',
-'file-nohires' => '<small>Ingaa pinosodia risoluson takawas.</small>',
+'file-nohires' => 'Ingaa pinosodia risoluson takawas.',
'svg-long-desc' => 'Pail SVG, tipong tuou $1 × $2 piksol, ginayo pail: $3',
'show-big-image' => 'Sinaisan poimponu',
@@ -1410,4 +1394,8 @@ Iri suai sinandad do poinlisok.
# Special:Tags
'tag-filter' => '[[Special:Tags|Pananda]] gagan:',
+# New logging system
+'revdelete-restricted' => 'pinokogos pogoduhan montok momuruan',
+'revdelete-unrestricted' => 'pinoidu pogoduhan montok momuruan',
+
);
diff --git a/languages/messages/MessagesDv.php b/languages/messages/MessagesDv.php
index d54ea9e2..8ba34648 100644
--- a/languages/messages/MessagesDv.php
+++ b/languages/messages/MessagesDv.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Deviathan (on dv.wikipedia.org)
* @author Glacious
* @author MF-Warburg
* @author לערי ריינה×רט
@@ -263,7 +264,6 @@ $messages = array(
ތިބޭފުޅޭގެ Þ‡Þ¦Þ‡Þ¨.Þ•Þ© Þ‡Þ¬Þ‘Þ° ÞƒÞ¬ÞÞ° Þ‡Þ¦Þ†Þ© $3 Þ‡Þ¬ÞˆÞ¬.
Þ‡Þ¦Þ‹Þ¨ Þ„Þ°ÞÞ®Þ†Þ° Þ‡Þ¦Þ‡Þ¨.Þ‘Þ© Þ‡Þ¦Þ†Þ© #$5 Þ‡Þ¬ÞˆÞ¬.",
-'blockedoriginalsource' => "'''$1''' Þ‰Þ¦Þ’ÞªÞ‰Þ«Þ‚ÞªÞŽÞ¬ Þ‰Þ¦ÞÞ°Þ‹Þ¦ÞƒÞª ތިރީގައި Þ‰Þ¨ ÞˆÞ¦Þ‚Þ© Þ‡Þ¬ÞˆÞ¬:",
'accmailtitle' => 'ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° ÞŠÞ®Þ‚ÞªÞˆÞ¨Þ‡Þ°Þ–Þ¬.',
'accmailtext' => '"$1" Þ‡Þ¦ÞÞ°Þ“Þ¦Þ†Þ¦Þ‡Þ¨ÞˆÞ§ ÞÞ¨Þ‡Þ°ÞƒÞª Þ„Þ¦ÞÞ° $2 Þ‡Þ¦ÞÞ° ÞˆÞ¦Þ‚Þ© ÞŠÞ®Þ‚ÞªÞˆÞ¨ÞŠÞ¦Þ‡Þ¨',
'newarticle' => '(Þ‡Þ¦Þ‡Þª)',
@@ -437,8 +437,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'movepagebtn' => 'ÞžÞ¦ÞŠÞ°Þ™Þ§ÞŽÞ¬Þ‚Þ¦Þ‚Þ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
'articleexists' => 'ތިޔަ ÞÞªÞƒÞªÞ€Þ©ÞŽÞ¦Þ‡Þ¨ Þ†ÞªÞƒÞ©Þ‡Þ°ÞÞªÞƒÞ¬ ÞˆÞ¬ÞÞ° ÞžÞ¦ÞŠÞ°Þ™Þ¦Þ‡Þ¬Þ‡Þ° ÞˆÞ­ØŒ ނުވަތަ ތިޔަ އިހުތިޔާރުކުރެއްވި Þ‚Þ¦Þ‚Þ° ÞƒÞ¦Þ‚ÞŽÞ¦Þ…Þ¬Þ‡Þ° Þ‚Þ«Þ‚Þ°ØŒ ÞˆÞ©Þ‰Þ§ Þ‡Þ¬Þ€Þ¬Þ‚Þ° Þ‚Þ¦Þ‰Þ¬Þ‡Þ° އިހުތިޔާރުކުރެއްވުން Þ‡Þ¬Þ‹Þ¬ÞˆÞ¨ÞŽÞ¬Þ‚Þ°ÞˆÞ¬Þ‡Þ¬ÞˆÞ¬.',
'movedto' => 'Þ‡Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨',
-'1movedto2' => '[[$1]] Þ‡Þ¦ÞÞ° Þ‚Þ¦ÞŽÞªÞÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ [[$2]]',
-'1movedto2_redir' => '[[$2]] Þ‡Þ¦ÞÞ° Þ‚Þ¦ÞŽÞªÞÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨Þ‡Þ°Þ–Þ¬ [[$1]] Þ‰Þ¨ÞÞ°ÞƒÞ§Þ„ÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
'movelogpagetext' => 'ތިރީގައި Þ‰Þ¨ÞˆÞ¦Þ‚Þ© Þ‚Þ¦Þ‚Þ°/ތަން Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ÞˆÞ§ ޞަފްޙާތަކުގެ ÞŠÞ¨Þ€ÞªÞƒÞ¨Þްތެކެވެ.',
'movereason' => 'ÞÞ¦Þ„Þ¦Þ„Þª',
'delete_and_move' => 'ÞŠÞ®Þ€Þ¬ÞÞ¦Þ‡Þ°ÞˆÞ§ÞŠÞ¦Þ‡Þ¨ Þ‡Þ¬Þ€Þ¬Þ‚Þ°Þ‚Þ¦Þ‰Þ¦Þ†Þ¦ÞÞ°Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
diff --git a/languages/messages/MessagesDz.php b/languages/messages/MessagesDz.php
index bade9a60..ad84110b 100644
--- a/languages/messages/MessagesDz.php
+++ b/languages/messages/MessagesDz.php
@@ -165,7 +165,6 @@ $messages = array(
'badtitle' => 'མགོ་མིང་བྱང་ཉེསà¼',
'badtitletext' => 'ཞུ་བ་འབད་ཡོད་པའི་ཤོག་ལེབ་མགོ་མིང་འདི་ ནུས་མེད་ སྟོངམ་ ཡང་ན་ བདེན་མེད་འབྲེལ་མà½à½´à½‘་ཅན་གྱི་ནང་à½à½´à½£à¼‹-སà¾à½‘་ཡིག་ ཡངན་ ནང་à½à½´à½£à¼‹-à½à½²à¼‹à½€à½²à¼‹à½˜à½‚ོ་མིང་ཨིན་པས༠དེ་ནང་ མགོ་མིང་ནང་ལུ་ལག་ལེན་འà½à½–་མ་བà½à½´à½–་པའི་ཡིག་འབྲུ་གཅིག་ ཡང་ན་ ལེ་ཤ་ཡོདཔ་འོང་à¼',
'viewsource' => 'འབྱུང་ས་སྟོནà¼',
-'viewsourcefor' => '$1 གི་',
'viewsourcetext' => 'à½à¾±à½¼à½‘་ཀྱིས་ ཤོག་ལེབ་འདི་གི་འབྱུང་ས་བལྟ་བà½à½´à½–་པའི་à½à½¢à¼‹ འདྲ་བཤུས་ཡང་རà¾à¾±à½–་བà½à½´à½–་ཨིན་:',
# Login and logout pages
@@ -485,7 +484,6 @@ $messages = array(
'actioncomplete' => 'བྱ་ལས་མཇུག་བསྡུà¼',
'deletedtext' => '"$1" འདི་ བà½à½¼à½“་བཀོག་ནུགà¼
འཕྲལ་à½à½˜à½¦à¼‹à½£à½´à¼‹à½–à½à½¼à½“་བཀོག་མི་à½à½¼à¼‹à½‚ི་དོན་ལུ་ $2 ལུ་བལྟà¼',
-'deletedarticle' => '"[[$1]]" བà½à½¼à½“་གà½à½„་ཡོདཔà¼',
'dellogpage' => 'བà½à½¼à½“་གà½à½„་ཡོད་པའི་ལོགà¼',
'deletecomment' => 'རྒྱུ་མཚན:',
'deleteotherreason' => 'གཞན་/à½à¼‹à½¦à¾à½¼à½„་ཅན་གྱི་རྒྱུ་མཚནà¼',
@@ -586,7 +584,6 @@ $messages = array(
དེ་ཚུ་ ལག་à½à½¼à½‚་ལས་མཉམ་བསྡོམས་འབད་གནང་à¼'''",
'movedto' => 'ལུ་སྤོ་བཤུད་འབདà¼',
'movetalk' => 'འབྲེལ་བ་ཡོད་པའི་à½à¼‹à½¦à¾³à½–་ཤོག་ལེབ་ སྤོ་བཤུད་འབདà¼',
-'1movedto2' => '[[$1]] འདི་ [[$2]] ལུ་སྤོ་བཤུད་འབད་ཡོདཔà¼',
'movelogpage' => 'ལོག་སྤོ་བཤུད་འབདà¼',
'movereason' => 'རྒྱུ་མཚན:',
'revertmove' => 'རྒྱབ་ལོགà¼',
@@ -652,7 +649,7 @@ $messages = array(
# Media information
'file-info-size' => '$1 × $2 པིག་སེལ་ ཡིག་སྣོད་ཀྱི་ཚད་: $3 མའིམ་དབྱེ་བ་: $4',
-'file-nohires' => '<small>ཧུམ་ཆ་ལེགས་ཤོམ་མིན་འདུགà¼</small>',
+'file-nohires' => 'ཧུམ་ཆ་ལེགས་ཤོམ་མིན་འདུགà¼',
'svg-long-desc' => 'ཨེསི་བི་ཇི་ཡིག་སྣོད་ $1 × $2 པིག་སེལསི་ཆུང་སུ་ཅིག་ ཡིག་སྣོད་ཚད་: $3',
'show-big-image' => 'ཧུམ་ཆ་གང་à¼',
diff --git a/languages/messages/MessagesEe.php b/languages/messages/MessagesEe.php
index 9317ce82..4b7c562e 100644
--- a/languages/messages/MessagesEe.php
+++ b/languages/messages/MessagesEe.php
@@ -185,7 +185,6 @@ $messages = array(
Ɖewomahĩ ame aɖe tutui xoxo.',
'badtitle' => 'Tanya gbegblẽ',
'viewsource' => 'Kpɔ alesi wowɔe',
-'viewsourcefor' => '$1 tɔwo',
# Login and logout pages
'remembermypassword' => 'Ɖo ŋku nyeƒe dzesi ŋkɔ dzi le mɔ sia dzi (vaseɖe {{PLURAL:$1|ŋkeke|ŋkeke}} $1 megbe)',
@@ -259,8 +258,6 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
'revdelete-radio-same' => '(megatrɔe o)',
'revdelete-radio-set' => 'Yo',
'revdelete-radio-unset' => 'Kpao',
-'revdelete-hid' => 'É£la $1',
-'revdelete-unhid' => 'megaɣla $1 o',
# Diffs
'history-title' => '"$1" Æ’e tata xoxoawo',
@@ -296,7 +293,7 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
'mypreferences' => 'NyeÆ’e didiwo',
'skin-preview' => 'Kpɔe do ŋgɔ',
'prefs-datetime' => 'ÅŠkeke kple gaÆ’oÆ’o',
-'prefs-watchlist-days-max' => 'VaseÉ–e Å‹keke 7',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'timezoneregion-africa' => 'Afrika',
'yourlanguage' => 'Gbe:',
'yournick' => 'Dzesi',
@@ -411,9 +408,7 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
'linksearch-ok' => 'Dii',
# Special:Log/newusers
-'newuserlogpage' => 'Ŋkɔŋlɔla yeyewo ƒe xexlẽme',
-'newuserlog-create-entry' => 'Nuŋlɔla yeye',
-'newuserlog-create2-entry' => 'woŋlɔ ŋkɔ yeye na $1',
+'newuserlogpage' => 'Ŋkɔŋlɔla yeyewo ƒe xexlẽme',
# Special:ListGroupRights
'listgrouprights-group' => 'Hame',
@@ -430,7 +425,6 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
'delete-confirm' => 'Tutu "$1"',
'delete-legend' => 'Tutui',
'actioncomplete' => 'Wowɔe vɔ',
-'deletedarticle' => 'wotutu "[[$1]]"',
'dellogpagetext' => 'Afisia wofia axa mamleawo siwo wotutu la',
# Protect
@@ -513,7 +507,6 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
Tia Å‹kÉ” alo tanya bubu.',
'cantmove-titleprotected' => 'Wòmateŋu ahe axa aɖeke va afii o, elabena wo xemɔ na tanya sia ƒe ŋɔŋlɔ',
'movedto' => 'wohee yi',
-'1movedto2' => '[[$1]] wohee yi [[$2]]',
# Export
'export' => 'Ɖo axa siawo ɖa',
diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php
index 57aef990..03e2c044 100644
--- a/languages/messages/MessagesEl.php
+++ b/languages/messages/MessagesEl.php
@@ -210,143 +210,143 @@ $dateFormats = array(
$magicWords = array(
- 'redirect' => array( '0', '#ΑÎΑΚΑΤΕΥΘΥÎΣΗ', '#REDIRECT' ),
- 'notoc' => array( '0', '__ΧΩΡΙΣΠΠ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__ΧΩΡΙΣΠΙÎΑΚΟΘΗΚΗ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ΜΕΠΠ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ΠΠ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__ΧΩΡΙΣΕΠΕΞΕÎΟΤ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__ΧΩΡΙΣΚΕΦΑΛΙΔΑ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣ1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΟÎΟΜΑ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΓΕÎΙΚΗ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΣΥÎΤ', 'CURRENTMONTHABBREV' ),
- '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' ),
- 'localmonth' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣ1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣΟÎΟΜΑ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣΓΕÎΙΚΗ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣΣΥÎΤ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΟÎΟΜΑ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ΤΟΠΙΚΟΕΤΟΣ', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ΤΟΠΙΚΟΣΧΡΟÎΟΣ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ΤΟΠΙΚΗΩΡΑ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ΑΡΙΘΜΟΣΣΕΛΙΔΩÎ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ΑΡΙΘΜΟΣΑΡΘΡΩÎ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ΑΡΙΘΜΟΣΑΡΧΕΙΩÎ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ΑΡΙΘΜΟΣΧΡΗΣΤΩÎ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ΕÎΕΡΓΟΙΧΡΗΣΤΕΣ', 'ΑΡΙΘΜΟΣΕÎΕΡΓΩÎΧΡΗΣΤΩÎ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ΑΡΙΘΜΟΣΕΠΕΞΕΡΓΑΣΙΩÎ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'ΑΡΙΘΜΟΣΕΜΦΑÎΙΣΕΩÎ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΚ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ΠΕΡΙΟΧΗ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ΠΕΡΙΟΧΗΚ', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩÎ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩÎΚ', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩÎ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩÎΚ', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ΠΛΗΡΕΣΟÎΟΜΑΣΕΛΙΔΑΣ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ΠΛΗΡΕΣΟÎΟΜΑΣΕΛΙΔΑΣΚ', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ΟÎΟΜΑΥΠΟΣΕΛΙΔΑΣ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ΟÎΟΜΑΥΠΟΣΕΛΙΔΑΣΚ', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ΒΑΣΗΟÎΟΜΑΤΟΣΣΕΛΙΔΑΣ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ΒΑΣΗΟÎΟΜΑΤΟΣΣΕΛΙΔΑΣΚ', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩÎ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩÎΚ', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣΚ', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'ΚΕΙΜΕÎΟ:', 'MSG:' ),
- 'subst' => array( '0', 'ΑΛΛΑΓΗ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'ΑΠΛΟΚΕΙΜΕÎΟ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'μικÏογÏαφία', 'μινιατοÏÏα', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'μικÏογÏαφία=$1', 'μινιατοÏÏα=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'δεξιά', 'right' ),
- 'img_left' => array( '1', 'αÏιστεÏά', 'left' ),
- 'img_none' => array( '1', 'καθόλου', 'none' ),
- 'img_width' => array( '1', '$1εσ', '$1px' ),
- 'img_center' => array( '1', 'κέντÏο', 'center', 'centre' ),
- 'img_framed' => array( '1', 'με-πλαίσιο', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'χωÏίς-πλαίσιο', 'frameless' ),
- 'img_page' => array( '1', 'σελίδα=$1', 'σελίδα $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'κατακόÏυφα', 'κατακόÏυφα=$1', 'κατακόÏυφα $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'πλαίσιο', 'border' ),
- 'img_baseline' => array( '1', 'γÏαμμήβάσης', 'baseline' ),
- 'img_sub' => array( '1', 'δείκτης', 'sub' ),
- 'img_super' => array( '1', 'εκθέτης', 'super', 'sup' ),
- 'img_top' => array( '1', 'άνω', 'top' ),
- 'img_text_top' => array( '1', 'πάνω-από-το-κείμενο', 'text-top' ),
- 'img_middle' => array( '1', 'μέσο', 'middle' ),
- 'img_bottom' => array( '1', 'κάτω', 'bottom' ),
- 'img_text_bottom' => array( '1', 'κάτω-από-το-κείμενο', 'text-bottom' ),
- 'img_link' => array( '1', 'σÏνδεσμος=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'εναλλ.=$1', 'alt=$1' ),
- 'int' => array( '0', 'ΕΣΩΤ:', 'INT:' ),
- 'sitename' => array( '1', 'ΙΣΤΟΧΩΡΟΣ', 'SITENAME' ),
- 'ns' => array( '0', 'ΧΟ:', 'NS:' ),
- 'localurl' => array( '0', 'ΤΟΠΙΚΟURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ΤΟΠΙΚΟURLΚ:', 'LOCALURLE:' ),
- 'server' => array( '0', 'ΕΞΥΠΗΡΕΤΗΤΗΣ', 'SERVER' ),
- 'servername' => array( '0', 'ΟÎΟΜΑΕΞΥΠΗΡΕΤΗΤΗ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ΔΙΑΔΡΟΜΗΠΡΟΓΡΑΜΜΑΤΟΣ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ΓΡΑΜΜΑΤΙΚΗ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ΦΥΛΟ:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΤΙΤΛΟΥ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΠΕΡΙΧΟΜΕÎΟΥ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ΤΡΕΧΟΥΣΑΕΒΔΟΜΑΔΑ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ΤΟΠΙΚΗΕΒΔΟΜΑΔΑ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ΚΩΔΙΚΟΣΑΛΛΑΓΗΣ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'ΜΗÎΑΣΑΛΛΑΓΗΣ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ΕΤΟΣΑΛΛΑΓΗΣ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'ΧΡΟÎΟΣΗΜΑÎΣΗΑΛΛΑΓΗΣ', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'ΠΛΗΘΥÎΤΙΚΟΣ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ΠΛΗΡΕΣURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ΠΛΗΡΕΣURLΚ:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ΠΡΩΤΟΠΕΖΟ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ΠΡΩΤΟΚΕΦΑΛΑΙΟ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'ΠΕΖΑ:', 'LC:' ),
- 'uc' => array( '0', 'ΚΕΦΑΛΑΙΑ:', 'UC:' ),
- 'raw' => array( '0', 'ΓΥΜÎΑ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ΔΕΙΞΕΤΙΤΛΟ', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Γ', 'R' ),
- 'newsectionlink' => array( '1', '__ΔΕΣΜΟΣÎΕΑΣΕÎΟΤΗΤΑΣ__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ΤΡΕΧΟΥΣΑΕΚΔΟΣΗ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗΑΓΚΥΡΑΣ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'ΤΡΕΧΟΥΣΑΧΡΟÎΟΣΗΜΑÎΣΗ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ΤΟΠΙΚΗΧΡΟÎΟΣΗΜΑÎΣΗ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'ΚΩΔΙΚΟΣΦΟΡΑΣ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#ΓΛΩΣΣΑ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ΓΛΩΣΣΑΠΕΡΙΕΧΟΜΕÎΟΥ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'ΣΕΛΙΔΕΣΣΤΗÎΠΕΡΙΟΧΗΟÎΟΜΑΤΩÎ:', 'ΣΕΛΙΔΕΣΣΤΗÎΠΟ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ΑΡΙΘΜΟΣΔΙΑΧΕΙΡΙΣΤΩÎ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ΜΟΡΦΟΠΟΙΗΣΗΑΡΙΘΜΟΥ', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ΑΡΙΣΤΕΡΟΠΑΡΑΓΕΜΙΣΜΑ', 'PADLEFT' ),
- 'padright' => array( '0', 'ΔΕΞΙΠΑΡΑΓΕΜΙΣΜΑ', 'PADRIGHT' ),
- 'special' => array( '0', 'λειτουÏγία', 'special' ),
- 'defaultsort' => array( '1', 'ΠΡΟΚΑΘΟΡΙΣΜΕÎΗΤΑΞΙÎΟΜΗΣΗ:', 'ΚΛΕΙΔΙΠΡΟΚΑΘΟΡΙΣΜΕÎΗΣΤΑΞΙÎΟΜΗΣΗΣ:', 'ΠΡΟΚΑΘΟΡΙΣΜΕÎΗΤΑΞΙÎΟΜΗΣΗΚΑΤΗΓΟΡΙΑΣ:', 'ΠΡΟΚΤΑΞ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ΔΙΑΔΡΟΜΗΑΡΧΕΙΟΥ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'ετικέτα', 'tag' ),
- 'hiddencat' => array( '1', '__ΚΡΥΦΗΚΑΤΗΓΟΡΙΑ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'ΣΕΛΙΔΕΣΣΤΗÎΚΑΤΗΓΟΡΙΑ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ΜΕΓΕΘΟΣΣΕΛΙΔΑΣ', 'PAGESIZE' ),
- 'index' => array( '1', '__ΕΥΡΕΤΗΡΙΟ__', '__INDEX__' ),
- 'noindex' => array( '1', '__ΧΩΡΙΣΕΥΡΕΤΗΡΙΟ__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'ΟΜΑΔΑΑΡΙΘΜΗΣΗΣ', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__ΣΤΑΤΙΚΗΑÎΑΚΑΤΕΥΘΥÎΣΗ__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'ΕΠΙΠΕΔΟΠΡΟΣΤΑΣΙΑΣ', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#ΑÎΑΚΑΤΕΥΘΥÎΣΗ', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ΧΩΡΙΣΠΠ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ΧΩΡΙΣΠΙÎΑΚΟΘΗΚΗ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ΜΕΠΠ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ΠΠ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ΧΩΡΙΣΕΠΕΞΕÎΟΤ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__ΧΩΡΙΣΚΕΦΑΛΙΔΑ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΟÎΟΜΑ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΓΕÎΙΚΗ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΣΥÎΤ', 'CURRENTMONTHABBREV' ),
+ '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' ),
+ 'localmonth' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣ1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣΟÎΟΜΑ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣΓΕÎΙΚΗ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ΤΟΠΙΚΟΣΜΗÎΑΣΣΥÎΤ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΟÎΟΜΑ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ΤΟΠΙΚΟΕΤΟΣ', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ΤΟΠΙΚΟΣΧΡΟÎΟΣ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ΤΟΠΙΚΗΩΡΑ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ΑΡΙΘΜΟΣΣΕΛΙΔΩÎ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ΑΡΙΘΜΟΣΑΡΘΡΩÎ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ΑΡΙΘΜΟΣΑΡΧΕΙΩÎ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ΑΡΙΘΜΟΣΧΡΗΣΤΩÎ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ΕÎΕΡΓΟΙΧΡΗΣΤΕΣ', 'ΑΡΙΘΜΟΣΕÎΕΡΓΩÎΧΡΗΣΤΩÎ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ΑΡΙΘΜΟΣΕΠΕΞΕΡΓΑΣΙΩÎ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ΑΡΙΘΜΟΣΕΜΦΑÎΙΣΕΩÎ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΚ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ΠΕΡΙΟΧΗ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ΠΕΡΙΟΧΗΚ', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩÎ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩÎΚ', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩÎ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩÎΚ', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ΠΛΗΡΕΣΟÎΟΜΑΣΕΛΙΔΑΣ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ΠΛΗΡΕΣΟÎΟΜΑΣΕΛΙΔΑΣΚ', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ΟÎΟΜΑΥΠΟΣΕΛΙΔΑΣ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ΟÎΟΜΑΥΠΟΣΕΛΙΔΑΣΚ', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ΒΑΣΗΟÎΟΜΑΤΟΣΣΕΛΙΔΑΣ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ΒΑΣΗΟÎΟΜΑΤΟΣΣΕΛΙΔΑΣΚ', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩÎ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΣΥΖΗΤΗΣΕΩÎΚ', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΘΕΜΑΤΟΣΚ', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'ΚΕΙΜΕÎΟ:', 'MSG:' ),
+ 'subst' => array( '0', 'ΑΛΛΑΓΗ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'ΑΠΛΟΚΕΙΜΕÎΟ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'μικÏογÏαφία', 'μινιατοÏÏα', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'μικÏογÏαφία=$1', 'μινιατοÏÏα=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'δεξιά', 'right' ),
+ 'img_left' => array( '1', 'αÏιστεÏά', 'left' ),
+ 'img_none' => array( '1', 'καθόλου', 'none' ),
+ 'img_width' => array( '1', '$1εσ', '$1px' ),
+ 'img_center' => array( '1', 'κέντÏο', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'με-πλαίσιο', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'χωÏίς-πλαίσιο', 'frameless' ),
+ 'img_page' => array( '1', 'σελίδα=$1', 'σελίδα $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'κατακόÏυφα', 'κατακόÏυφα=$1', 'κατακόÏυφα $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'πλαίσιο', 'border' ),
+ 'img_baseline' => array( '1', 'γÏαμμήβάσης', 'baseline' ),
+ 'img_sub' => array( '1', 'δείκτης', 'sub' ),
+ 'img_super' => array( '1', 'εκθέτης', 'super', 'sup' ),
+ 'img_top' => array( '1', 'άνω', 'top' ),
+ 'img_text_top' => array( '1', 'πάνω-από-το-κείμενο', 'text-top' ),
+ 'img_middle' => array( '1', 'μέσο', 'middle' ),
+ 'img_bottom' => array( '1', 'κάτω', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'κάτω-από-το-κείμενο', 'text-bottom' ),
+ 'img_link' => array( '1', 'σÏνδεσμος=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'εναλλ.=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ΕΣΩΤ:', 'INT:' ),
+ 'sitename' => array( '1', 'ΙΣΤΟΧΩΡΟΣ', 'SITENAME' ),
+ 'ns' => array( '0', 'ΧΟ:', 'NS:' ),
+ 'localurl' => array( '0', 'ΤΟΠΙΚΟURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ΤΟΠΙΚΟURLΚ:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'ΕΞΥΠΗΡΕΤΗΤΗΣ', 'SERVER' ),
+ 'servername' => array( '0', 'ΟÎΟΜΑΕΞΥΠΗΡΕΤΗΤΗ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ΔΙΑΔΡΟΜΗΠΡΟΓΡΑΜΜΑΤΟΣ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ΓΡΑΜΜΑΤΙΚΗ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ΦΥΛΟ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΤΙΤΛΟΥ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ΧΩΡΙΣΜΕΤΑΤΡΟΠΗΠΕΡΙΧΟΜΕÎΟΥ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ΤΡΕΧΟΥΣΑΕΒΔΟΜΑΔΑ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ΤΡΕΧΟΥΣΑΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ΤΟΠΙΚΗΕΒΔΟΜΑΔΑ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ΤΟΠΙΚΗΜΕΡΑΕΒΔΟΜΑΔΑΣ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ΚΩΔΙΚΟΣΑΛΛΑΓΗΣ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ΜΕΡΑΑΛΛΑΓΗΣ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'ΜΗÎΑΣΑΛΛΑΓΗΣ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ΕΤΟΣΑΛΛΑΓΗΣ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ΧΡΟÎΟΣΗΜΑÎΣΗΑΛΛΑΓΗΣ', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'ΠΛΗΘΥÎΤΙΚΟΣ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ΠΛΗΡΕΣURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ΠΛΗΡΕΣURLΚ:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ΠΡΩΤΟΠΕΖΟ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ΠΡΩΤΟΚΕΦΑΛΑΙΟ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ΠΕΖΑ:', 'LC:' ),
+ 'uc' => array( '0', 'ΚΕΦΑΛΑΙΑ:', 'UC:' ),
+ 'raw' => array( '0', 'ΓΥΜÎΑ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ΔΕΙΞΕΤΙΤΛΟ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Γ', 'R' ),
+ 'newsectionlink' => array( '1', '__ΔΕΣΜΟΣÎΕΑΣΕÎΟΤΗΤΑΣ__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ΤΡΕΧΟΥΣΑΕΚΔΟΣΗ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ΚΩΔΙΚΟΠΟΙΗΣΗΑΓΚΥΡΑΣ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ΤΡΕΧΟΥΣΑΧΡΟÎΟΣΗΜΑÎΣΗ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ΤΟΠΙΚΗΧΡΟÎΟΣΗΜΑÎΣΗ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ΚΩΔΙΚΟΣΦΟΡΑΣ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#ΓΛΩΣΣΑ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ΓΛΩΣΣΑΠΕΡΙΕΧΟΜΕÎΟΥ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ΣΕΛΙΔΕΣΣΤΗÎΠΕΡΙΟΧΗΟÎΟΜΑΤΩÎ:', 'ΣΕΛΙΔΕΣΣΤΗÎΠΟ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ΑΡΙΘΜΟΣΔΙΑΧΕΙΡΙΣΤΩÎ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ΜΟΡΦΟΠΟΙΗΣΗΑΡΙΘΜΟΥ', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ΑΡΙΣΤΕΡΟΠΑΡΑΓΕΜΙΣΜΑ', 'PADLEFT' ),
+ 'padright' => array( '0', 'ΔΕΞΙΠΑΡΑΓΕΜΙΣΜΑ', 'PADRIGHT' ),
+ 'special' => array( '0', 'λειτουÏγία', 'special' ),
+ 'defaultsort' => array( '1', 'ΠΡΟΚΑΘΟΡΙΣΜΕÎΗΤΑΞΙÎΟΜΗΣΗ:', 'ΚΛΕΙΔΙΠΡΟΚΑΘΟΡΙΣΜΕÎΗΣΤΑΞΙÎΟΜΗΣΗΣ:', 'ΠΡΟΚΑΘΟΡΙΣΜΕÎΗΤΑΞΙÎΟΜΗΣΗΚΑΤΗΓΟΡΙΑΣ:', 'ΠΡΟΚΤΑΞ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ΔΙΑΔΡΟΜΗΑΡΧΕΙΟΥ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'ετικέτα', 'tag' ),
+ 'hiddencat' => array( '1', '__ΚΡΥΦΗΚΑΤΗΓΟΡΙΑ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'ΣΕΛΙΔΕΣΣΤΗÎΚΑΤΗΓΟΡΙΑ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ΜΕΓΕΘΟΣΣΕΛΙΔΑΣ', 'PAGESIZE' ),
+ 'index' => array( '1', '__ΕΥΡΕΤΗΡΙΟ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__ΧΩΡΙΣΕΥΡΕΤΗΡΙΟ__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'ΟΜΑΔΑΑΡΙΘΜΗΣΗΣ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__ΣΤΑΤΙΚΗΑÎΑΚΑΤΕΥΘΥÎΣΗ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ΕΠΙΠΕΔΟΠΡΟΣΤΑΣΙΑΣ', 'PROTECTIONLEVEL' ),
);
$messages = array(
@@ -706,20 +706,22 @@ $1',
'badarticleerror' => 'Η ενέÏγεια αυτή δεν μποÏεί να εκτελεσθεί στη συγκεκÏιμένη σελίδα.',
'cannotdelete' => 'Η σελίδα ή αÏχείο "$1" δεν μπόÏεσε να διαγÏαφεί.
Ενδεχομένως να έχει ήδη διαγÏαφεί από άλλο χÏήστη.',
+'cannotdelete-title' => 'ΑδÏνατη η διαγÏαφή της σελίδας "$1"',
'badtitle' => 'Ακατάλληλος τίτλος',
'badtitletext' => 'Ο τίτλος της σελίδας που ζητήσατε είναι άκυÏος ή κενός ή Ï€Ïόκειται για έναν εσφαλμένα συνδεδεμένο διαγλωσσικό τίτλο (ή εσφαλμένα συνδεδεμένο τίτλο ανάμεσα σε διαφοÏετικά Wiki).',
-'perfcached' => 'Τα δεδομένα που ακολουθοÏν είναι cached και είνα πιθανόν να μην είναι πλήÏως ενημεÏωμένα:',
-'perfcachedts' => 'Τα ακόλουθα δεδομένα είναι καταχωÏημένα στη λανθάνουσα μνήμη, και ενημεÏώθηκαν τελευταία στις $1.',
+'perfcached' => 'Τα δεδομένα που ακολουθοÏν είναι cached και είναι πιθανόν να μην είναι επικαιÏοποιημένα. Ένα μέγιστο των {{PLURAL:$1|one result is|$1 results are}} διαθέσιμο στην cache.',
+'perfcachedts' => 'Τα ακόλουθα δεδομένα είναι καταχωÏημένα στη λανθάνουσα μνήμη, και ενημεÏώθηκαν τελευταία στις $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Οι ενημεÏώσεις για αυτή τη σελίδα είναι απενεÏγοποιημένες. Τα δεδομένα εδώ δεν θα ανανεωθοÏν Ï€Ïος το παÏόν.',
'wrong_wfQuery_params' => 'Λανθασμένες παÏάμετÏοι στο wfQuery()<br />
ΛειτουÏγία: $1<br />
Αίτημα: $2',
'viewsource' => 'Εμφάνιση κώδικα',
-'viewsourcefor' => 'για $1',
+'viewsource-title' => 'ΠÏοβολή πηγής για $1',
'actionthrottled' => 'ΠεÏιοÏισμένη ενέÏγεια',
'actionthrottledtext' => 'Σαν μέτÏο anti-spam, πεÏιοÏίζεται η πολλαπλή επανάληψη αυτής της ενέÏγειας σε μικÏÏŒ χÏονικό διάστημα. ΞεπεÏάσατε αυτό το ÏŒÏιο. ΠαÏακαλοÏμε δοκιμάστε ξανά σε λίγα λεπτά.',
'protectedpagetext' => 'Αυτή η σελίδα έχει κλειδωθεί για αποτÏοπή επεξεÏγασίας της.',
'viewsourcetext' => 'ΜποÏείτε να δείτε και να αντιγÏάψετε τον κώδικα αυτής της σελίδας:',
+'viewyourtext' => "ΜποÏείτε να Ï€Ïοβάλετε και να αντιγÏάψετε τον κώδικα των '''επεξεÏγασιών σας''' σε αυτήν τη σελίδα:",
'protectedinterface' => 'Αυτή η σελίδα παÏέχει κείμενο διεπαφής για το λογισμικό, και έχει κλειδωθεί για Ï€Ïόληψη τυχόν βανδαλισμοÏ.',
'editinginterface' => "'''ΠÏοσοχή:''' ΕπεξεÏγάζεστε μια σελίδα η οποία χÏησιμοποιείται για να παÏέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτή τη σελίδα θα επηÏεάσουν την εμφάνιση της διεπαφής χÏήστη για τους άλλους χÏήστες. Εάν θέλετε να διοÏθώσετε τη μετάφÏαση, μποÏείτε να χÏησιμοποιήσετε το [//translatewiki.net/wiki/Main_Page?setlang=el translatewiki.net], που ασχολείται με τις μεταφÏάσεις των μηνυμάτων MediaWiki.",
'sqlhidden' => '(το αίτημα SQL δεν εμφανίζεται)',
@@ -814,6 +816,7 @@ $2',
'noemailprefs' => 'Δεν έχει οÏισθεί ηλεκτÏονική διεÏθυνση, οι λειτουÏγίες που ακολουθοÏν δεν θα είναι δυνατόν να ολοκληÏωθοÏν.',
'emailconfirmlink' => 'ΕπαληθεÏστε την ηλεκτÏονική σας διεÏθυνση',
'invalidemailaddress' => 'Η ηλεκτÏονική διεÏθυνση δεν μποÏεί να γίνει δεκτή γιατί ενδεχομένως δεν έχει έγκυÏη μοÏφή. ΠαÏακαλοÏμε συμπληÏώστε μια σωστά διαμοÏφωμένη διεÏθυνση ή αφήστε το πεδίο κενό.',
+'cannotchangeemail' => "Οι διευθÏνσεις ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î´ÎµÎ½ μποÏοÏν να αλλάξουν σ' αυτό το wiki.",
'accountcreated' => 'Ο λογαÏιασμός δημιουÏγήθηκε',
'accountcreatedtext' => 'Ο λογαÏιασμός χÏήστη για τον/την $1 έχει δημιουÏγηθεί.',
'createaccount-title' => 'ΔημιουÏγία λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î³Î¹Î± {{SITENAME}}',
@@ -829,6 +832,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'Άγνωστο σφάλμα στη συνάÏτηση της PHP mail()',
+'user-mail-no-addy' => 'ΠÏοσπαθήσατε να στείλετε e-mail χωÏίς μια διεÏθυνση e-mail.',
# Change password dialog
'resetpass' => 'Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
@@ -849,30 +853,45 @@ $2',
'resetpass-temp-password' => 'ΠÏοσωÏινός κωδικός:',
# Special:PasswordReset
-'passwordreset' => 'Κωδικός επαναφοÏάς',
-'passwordreset-text' => 'ΣυμπληÏώστε αυτή τη φόÏμα για να λάβετε ένα e-mail υπενθÏμιση του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚.',
-'passwordreset-legend' => 'ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
-'passwordreset-disabled' => 'Η ανάκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης έχουν απενεÏγοποιηθεί σε αυτό το βίκι',
-'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παÏακάτω}}',
-'passwordreset-username' => 'Όνομα χÏήστη:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
-'passwordreset-emailtitle' => 'ΛεπτομέÏειες λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î³Î¹Î± {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Κάποιος (πιθανώς εσείς, από την διεÏθυνση IP $1 ) ζήτησε μια υπενθÏμιση των λεπτομεÏειών του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ σε {{SITENAME}} ($4). {{PLURAL:$3|Ο ακόλουθος λογαÏιασμός|Οι ακόλουθοι λογαÏιασμοί}} χÏήστη συνδέονται με αυτή τη διεÏθυνση e-mail:
+'passwordreset' => 'Κωδικός επαναφοÏάς',
+'passwordreset-text' => 'ΣυμπληÏώστε αυτή τη φόÏμα για να λάβετε ένα e-mail υπενθÏμιση του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚.',
+'passwordreset-legend' => 'ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
+'passwordreset-disabled' => 'Η ανάκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης έχουν απενεÏγοποιηθεί σε αυτό το βίκι',
+'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παÏακάτω}}',
+'passwordreset-username' => 'Όνομα χÏήστη:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'ΠÏοβολή του μηνÏματος ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου που δημιουÏγήθηκε;',
+'passwordreset-capture-help' => 'Εάν μαÏκάÏετε αυτό το πλαίσιο, το μήνυμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου (με το Ï€ÏοσωÏινό κωδικό Ï€Ïόσβασης) θα εμφανιστεί σε σας καθώς θα αποσταλεί στο χÏήστη.',
+'passwordreset-email' => 'ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
+'passwordreset-emailtitle' => 'ΛεπτομέÏειες λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î³Î¹Î± {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Κάποιος (πιθανώς εσείς, από την διεÏθυνση IP $1 ) ζήτησε μια υπενθÏμιση των λεπτομεÏειών του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ σε {{SITENAME}} ($4). {{PLURAL:$3|Ο ακόλουθος λογαÏιασμός|Οι ακόλουθοι λογαÏιασμοί}} χÏήστη συνδέονται με αυτή τη διεÏθυνση e-mail:
$2
{{PLURAL:$3|Αυτός ο Ï€ÏοσωÏινός κωδικός Ï€Ïόσβασης θα λήξει| Αυτοί οι Ï€ÏοσωÏινοί κωδικοί Ï€Ïόσβασης θα λήξουν}} σε {{PLURAL:$5| μία ημέÏα| $5 ημέÏες}}.
Θα Ï€Ïέπει να συνδεθείτε Ï„ÏŽÏα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αÏχικό κωδικό Ï€Ïόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μποÏείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χÏησιμοποιείτε τον παλιό σας κωδικό Ï€Ïόσβασης.',
-'passwordreset-emailtext-user' => 'Ο χÏήστης $1 στη {{SITENAME}} ζήτησε μια υπενθÏμιση των λεπτομεÏειών του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ σε {{SITENAME}} ($4). {{PLURAL:$3|Ο ακόλουθος λογαÏιασμός|Οι ακόλουθοι λογαÏιασμοί}} χÏήστη συνδέονται με αυτή τη διεÏθυνση e-mail:
+'passwordreset-emailtext-user' => 'Ο χÏήστης $1 στη {{SITENAME}} ζήτησε μια υπενθÏμιση των λεπτομεÏειών του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ σε {{SITENAME}} ($4). {{PLURAL:$3|Ο ακόλουθος λογαÏιασμός|Οι ακόλουθοι λογαÏιασμοί}} χÏήστη συνδέονται με αυτή τη διεÏθυνση e-mail:
$2
{{PLURAL:$3|Αυτός ο Ï€ÏοσωÏινός κωδικός Ï€Ïόσβασης θα λήξει| Αυτοί οι Ï€ÏοσωÏινοί κωδικοί Ï€Ïόσβασης θα λήξουν}} σε {{PLURAL:$5| μία ημέÏα| $5 ημέÏες}}.
Θα Ï€Ïέπει να συνδεθείτε Ï„ÏŽÏα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αÏχικό κωδικό Ï€Ïόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μποÏείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χÏησιμοποιείτε τον παλιό σας κωδικό Ï€Ïόσβασης.',
-'passwordreset-emailelement' => 'Όνομα χÏήστη: $1
+'passwordreset-emailelement' => 'Όνομα χÏήστη: $1
ΠÏοσωÏινός κωδικός Ï€Ïόσβασης:$2',
-'passwordreset-emailsent' => 'Ένα e-mail υπενθÏμισης έχει σταλεί.',
+'passwordreset-emailsent' => 'Ένα e-mail υπενθÏμισης έχει σταλεί.',
+'passwordreset-emailsent-capture' => 'Ένα μήνυμα υπενθÏμισης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου έχει αποσταλεί, το οποίο φαίνεται πιο κάτω.',
+'passwordreset-emailerror-capture' => 'Ένα μήνυμα υπενθÏμισης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου έχει δημιουÏγηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χÏήστη $1.',
+
+# Special:ChangeEmail
+'changeemail' => 'Αλλαγή της διεÏθυνσης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+'changeemail-header' => 'Αλλαγή λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î·Î»ÎµÎºÏ„ÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+'changeemail-text' => 'ΣυμπληÏώστε αυτή τη φόÏμα για να αλλάξετε τη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου σας. Θα Ï€Ïέπει να εισάγετε τον κωδικό σας για να επιβεβαιωθεί αυτή η αλλαγή.',
+'changeemail-no-info' => 'ΠÏέπει να έχετε συνδεθεί για άμεση Ï€Ïόσβαση σε αυτήν τη σελίδα.',
+'changeemail-oldemail' => 'ΤÏέχουσα διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
+'changeemail-newemail' => 'Îέα διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
+'changeemail-none' => '(κανένα)',
+'changeemail-submit' => 'Αλλαγή ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος',
+'changeemail-cancel' => 'ΑκÏÏωση',
# Edit page toolbar
'bold_sample' => 'Έντονο κείμενο',
@@ -941,9 +960,6 @@ $2
Η Ï„Ïέχουσα διεÏθυνση IP σας είναι $3, και ο αÏιθμός αναγνώÏισης της φÏαγής σας είναι #$5. ΠαÏακαλώ συμπεÏιλάβετε τις παÏαπάνω λεπτομέÏειες σε όποια εÏωτήματα κάνετε.',
'blockednoreason' => 'δεν δόθηκε λόγος',
-'blockedoriginalsource' => "Η πηγή του '''$1''' φαίνεται παÏακάτω:",
-'blockededitsource' => "Το κείμενο των '''επεξεÏγασιών σας''' στο '''$1''' φαίνεται παÏακάτω:",
-'whitelistedittitle' => 'Για να επεξεÏγαστείτε μια σελίδα Ï€Ïέπει Ï€Ïώτα να συνδεθείτε.',
'whitelistedittext' => 'ΠÏέπει να $1 για να επεξεÏγαστείτε σελίδες.',
'confirmedittext' => 'ΠÏέπει να επιβεβαιώσετε την διεÏθυνση e-mail σας Ï€Ïιν μποÏέσετε να επεξεÏγαστείτε σελίδες. ΠαÏακαλώ θέστε και επικυÏώστε την διεÏθυνση e-mail σας μέσω των [[Special:Preferences|Ï€Ïοτιμήσεων χÏήστη]] σας.',
'nosuchsectiontitle' => 'Δεν υπάÏχει τέτοιο τμήμα',
@@ -1188,8 +1204,6 @@ $2
'revdelete-unsuppress' => 'ΑφαίÏεσε πεÏιοÏισμοÏÏ‚ στις αποκατεστημένες αναθεωÏήσεις',
'revdelete-log' => 'Αιτία:',
'revdelete-submit' => 'ΕφάÏμοσε {{PLURAL:$1|στην επιλεγμένη αναθεώÏηση|στις επιλεγμένες αναθεωÏήσεις}}',
-'revdelete-logentry' => 'η οÏατότητα της αναθεώÏησης του [[$1]] αλλάχθηκε',
-'logdelete-logentry' => 'η οÏατότητα γεγονότος του [[$1]] αλλάχθηκε',
'revdelete-success' => "'''Η οÏατότητα έκδοσης ενημεÏώθηκε επιτυχώς.'''",
'revdelete-failure' => "'''Η οÏατότητα της επεξεÏγασίας δεν ήταν δυνατόν να ενημεÏωθεί:''' $1",
'logdelete-success' => "'''Η οÏατότητα γεγονότος τέθηκε επιτυχώς.'''",
@@ -1200,15 +1214,6 @@ $1",
'revdel-restore-visible' => 'οÏατές αναθεωÏήσεις',
'pagehist' => 'ΙστοÏικό σελίδας',
'deletedhist' => 'ΔιαγÏαμμένο ιστοÏικό',
-'revdelete-content' => 'πεÏιεχόμενο',
-'revdelete-summary' => 'επεξεÏγασία σÏνοψης',
-'revdelete-uname' => 'όνομα χÏήστη',
-'revdelete-restricted' => 'εφάÏμοσε πεÏιοÏισμοÏÏ‚ στους sysops',
-'revdelete-unrestricted' => 'αφαίÏεσε πεÏιοÏισμοÏÏ‚ στους sysops',
-'revdelete-hid' => 'αποκÏÏφθηκε το $1',
-'revdelete-unhid' => 'εμφάνιση $1',
-'revdelete-log-message' => '$1 για $2 {{PLURAL:$2|έκδοση|εκδόσεις}}',
-'logdelete-log-message' => '$1 για $2 {{PLURAL:$2|γεγονός|γεγονότα}}',
'revdelete-hide-current' => 'Σφάλμα κατά την απόκÏυψη του αντικειμένου στις $2, $1: αυτή είναι η τωÏινή έκδοση.
Δεν μποÏεί να αποκÏυφθεί.',
'revdelete-show-no-access' => 'Σφάλμα στην Ï€Ïοβολή του αντικειμένου στις $2, $1: αυτό το αντικείμενο έχει σημειωθεί ως "πεÏιοÏισμένο".
@@ -1363,12 +1368,14 @@ $1",
'prefs-rc' => 'ΠÏόσφατες αλλαγές και εμφάνιση Ï€Î¿Î»Ï ÏƒÏντομων άÏθÏων',
'prefs-watchlist' => 'Λίστα παÏακολοÏθησης',
'prefs-watchlist-days' => 'ΗμέÏες Ï€Ïος εμφάνιση στη λίστα παÏακολοÏθησης:',
-'prefs-watchlist-days-max' => 'Mέγιστο 7 ημέÏες',
+'prefs-watchlist-days-max' => 'Mέγιστο $1 {{PLURAL:$1|ημέÏα|ημέÏες}}',
'prefs-watchlist-edits' => 'ΑÏιθμός επεξεÏγασιών Ï€Ïος εμφάνιση στην εκτεταμένη λίστα παÏακολοÏθησης:',
'prefs-watchlist-edits-max' => 'Μέγιστος αÏιθμός: 1000',
'prefs-watchlist-token' => 'Σημείο λίστας παÏακολοÏθησης:',
'prefs-misc' => 'ΔιάφοÏες Ïυθμίσεις',
'prefs-resetpass' => 'Αλλαγή κωδικοÏ',
+'prefs-changeemail' => 'Αλλαγή ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος',
+'prefs-setemail' => 'ΟÏίστε μια διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
'prefs-email' => 'Επιλογές e-mail',
'prefs-rendering' => 'Εμφάνιση',
'saveprefs' => 'Αποθήκευση',
@@ -1466,7 +1473,7 @@ $1",
'userrights-lookup-user' => 'ΔιαχείÏιση ομάδων χÏηστών',
'userrights-user-editname' => 'Δηλώστε όνομα χÏήστη:',
'editusergroup' => 'ΕπεξεÏγασία ομάδων χÏηστών',
-'editinguser' => "Αλλαγή των δικαιωμάτων χÏήστη γα το χÏήστη '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Αλλαγή δικαιωμάτων χÏήστη του χÏήστη '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'ΕπεξεÏγασία ομάδων χÏηστών',
'saveusergroups' => 'Αποθήκευση ομάδων χÏηστών',
'userrights-groupsmember' => 'Μέλος της ομάδας:',
@@ -1560,7 +1567,6 @@ $1",
'right-autopatrol' => 'Αυτόματη σημείωση των επεξεÏγασιών τους ως ελεγμένες',
'right-patrolmarks' => "Δείτε τις σημειώσεις 'υπό παÏακολοÏθηση' των Ï€Ïοσφάτων αλλαγών",
'right-unwatchedpages' => 'Δείτε μια λίστα σελίδων που δεν παÏακολουθοÏνται',
-'right-trackback' => 'Υποβολή ανασυνδέσμου',
'right-mergehistory' => 'Συγχώνευση του ιστοÏÎ¹ÎºÎ¿Ï Ï„Ï‰Î½ σελίδων',
'right-userrights' => 'ΤÏοποποίηση όλων των δικαιωμάτων χÏηστών',
'right-userrights-interwiki' => 'ΤÏοποποίηση δικαιωμάτων χÏηστών σε άλλα wiki',
@@ -1600,16 +1606,17 @@ $1",
'action-suppressionlog' => 'να δείτε αυτόν τον ιδιωτικό κατάλογο',
'action-block' => 'να φÏάξετε τις επεξεÏγασίες Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… χÏήστη',
'action-protect' => 'να αλλάξετε τα επίπεδα Ï€Ïοστασίας για αυτή τη σελίδα',
+'action-rollback' => 'γÏήγοÏη επαναφοÏά των επεξεÏγασιών του τελευταίου χÏήστη που επεξεÏγάστηκε μια συγκεκÏιμένη σελίδα',
'action-import' => 'να εισάγετε αυτή τη σελίδα από άλλο wiki',
'action-importupload' => 'να εισάγετε αυτή τη σελίδα από φόÏτωση αÏχείου',
'action-patrol' => 'να επισημάνετε τις επεξεÏγασίες άλλων ως ελεγμένες',
'action-autopatrol' => 'να επισημάνετε την επεξεÏγασία σας ως ελεγμένη',
'action-unwatchedpages' => 'να εμφανίσετε τον κατάλογο μη παÏακολουθοÏμενων σελίδων',
-'action-trackback' => 'να υποβάλλετε ανασÏνδεσμο',
'action-mergehistory' => 'να συγχωνεÏσετε το ιστοÏικό αυτής της σελίδας',
'action-userrights' => 'να επεξεÏγαστείτε όλα τα δικαιώματα χÏηστών',
'action-userrights-interwiki' => 'να επεξεÏγαστείτε τα δικαιώματα χÏηστών σε άλλα βίκι',
'action-siteadmin' => 'να κλειδώσετε ή ξεκλειδώσετε τη βάση δεδομένων',
+'action-sendemail' => 'αποστείλετε μηνÏματα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|αλλαγή|αλλαγές}}',
@@ -1692,6 +1699,7 @@ $1",
'ignorewarnings' => 'Αγνόησε οποιεσδήποτε Ï€Ïοειδοποιήσεις',
'minlength1' => 'Τα ονόματα αÏχείων Ï€Ïέπει να είναι τουλάχιστον ένα γÏάμμα.',
'illegalfilename' => 'Το όνομα του αÏχείου "$1" πεÏιέχει χαÏακτήÏες που δεν επιτÏέπονται στους τίτλους των σελίδων. ΠαÏακαλοÏμε δώστε άλλο όνομα στο αÏχείο και Ï€Ïοσπαθήστε ξανά να το ανεβάσετε.',
+'filename-toolong' => 'Τα ονόματα των αÏχείων δεν Ï€Ïέπει να ξεπεÏνοÏν τα 240 bytes.',
'badfilename' => 'Το όνομα της εικόνας άλλαξε σε "$1".',
'filetype-mime-mismatch' => 'Η επέκταση αÏχείου ".$1" δεν ταιÏιάζει με τον Ï„Ïπο MIME του αÏχείου ($2).',
'filetype-badmime' => 'ΑÏχεία του Ï„Ïπου MIME "$1" δεν επιτÏέπεται να επιφοÏτωθοÏν.',
@@ -1798,6 +1806,21 @@ $1',
'upload-unknown-size' => 'Άγνωστο μέγεθος',
'upload-http-error' => 'Εμφανίστηκε κάποιο σφάλμα HTTP: $1',
+# File backend
+'backend-fail-backup' => 'ΑδÏνατη η δημιουÏγία αντίγÏαφου ασφαλείας του αÏχείου $1.',
+'backend-fail-notexists' => 'Το αÏχείο $1 δεν υπάÏχει.',
+'backend-fail-invalidpath' => '$1 δεν είναι έγκυÏη διαδÏομή αποθήκευσης.',
+'backend-fail-delete' => 'ΑδÏνατη η διαγÏαφή αÏχείου $1.',
+'backend-fail-alreadyexists' => 'Το αÏχείο $1 υπάÏχει ήδη.',
+'backend-fail-store' => 'ΑδÏνατη η αποθήκευση του αÏχείου $1 σε $2.',
+'backend-fail-copy' => 'ΑδÏνατη η αντιγÏαφή του αÏχείου από $1 σε $2.',
+'backend-fail-move' => 'ΑδÏνατη η μετακίνηση του αÏχείου από $1 σε $2.',
+'backend-fail-opentemp' => 'ΑδÏνατο το άνοιγμα Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου.',
+'backend-fail-writetemp' => 'ΑδÏνατη η εγγÏαφή στο Ï€ÏοσωÏινό αÏχείο.',
+'backend-fail-closetemp' => 'ΑδÏνατο το κλείσιμο Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου.',
+'backend-fail-read' => 'ΑδÏνατη η ανάγνωση αÏχείου $1.',
+'backend-fail-create' => 'ΑδÏνατη η δημιουÏγία αÏχείου $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ΠαÏουσιάστηκε σφάλμα κατά το άνοιγμα του αÏχείου για ZIP ελέγχους.',
'zip-wrong-format' => 'Το καθοÏισμένο αÏχείο δεν ήταν αÏχείο ZIP.',
@@ -1919,23 +1942,24 @@ $1',
'filerevert-badversion' => 'Δεν υπάÏχει Ï€ÏοηγοÏμενη τοπική έκδοση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… αÏχείου με την χÏονική σφÏαγίδα που παÏαχωÏήθηκε.',
# File deletion
-'filedelete' => 'ΔιαγÏαφή του $1',
-'filedelete-legend' => 'ΔιαγÏαφή αÏχείου',
-'filedelete-intro' => "ΠÏόκειται να διαγÏάψετε το αÏχείο '''[[Media:$1|$1]]''' μαζί με όλο το ιστοÏικό του.",
-'filedelete-intro-old' => "ΔιαγÏάφετε την έκδοση του '''[[Media:$1|$1]]''' από τις [$4 $3, $2].",
-'filedelete-comment' => 'Αιτία:',
-'filedelete-submit' => 'ΔιαγÏαφή',
-'filedelete-success' => "Το αÏχείο '''$1''' έχει διαγÏαφεί.",
-'filedelete-success-old' => "Η έκδοση του '''[[Media:$1|$1]]''' από την $3, $2 έχει διαγÏαφεί.",
-'filedelete-nofile' => "Το '''$1''' δεν υπάÏχει.",
-'filedelete-nofile-old' => "Δεν υπάÏχει καταγεγÏαμμένη έκδοση του '''$1''' με τα συγκεκÏιμένα χαÏακτηÏιστικά.",
-'filedelete-otherreason' => 'Άλλος/Ï€Ïόσθετος λόγος:',
-'filedelete-reason-otherlist' => 'Άλλος λόγος',
-'filedelete-reason-dropdown' => '*Συχνοί λόγοι διαγÏαφής
+'filedelete' => 'ΔιαγÏαφή του $1',
+'filedelete-legend' => 'ΔιαγÏαφή αÏχείου',
+'filedelete-intro' => "ΠÏόκειται να διαγÏάψετε το αÏχείο '''[[Media:$1|$1]]''' μαζί με όλο το ιστοÏικό του.",
+'filedelete-intro-old' => "ΔιαγÏάφετε την έκδοση του '''[[Media:$1|$1]]''' από τις [$4 $3, $2].",
+'filedelete-comment' => 'Αιτία:',
+'filedelete-submit' => 'ΔιαγÏαφή',
+'filedelete-success' => "Το αÏχείο '''$1''' έχει διαγÏαφεί.",
+'filedelete-success-old' => "Η έκδοση του '''[[Media:$1|$1]]''' από την $3, $2 έχει διαγÏαφεί.",
+'filedelete-nofile' => "Το '''$1''' δεν υπάÏχει.",
+'filedelete-nofile-old' => "Δεν υπάÏχει καταγεγÏαμμένη έκδοση του '''$1''' με τα συγκεκÏιμένα χαÏακτηÏιστικά.",
+'filedelete-otherreason' => 'Άλλος/Ï€Ïόσθετος λόγος:',
+'filedelete-reason-otherlist' => 'Άλλος λόγος',
+'filedelete-reason-dropdown' => '*Συχνοί λόγοι διαγÏαφής
** ΠαÏαβίαση πνευματικών δικαιωμάτων
** Το αÏχείο υπάÏχει δυο φοÏές',
-'filedelete-edit-reasonlist' => 'ΕπεξεÏγασία λόγων διαγÏαφής',
-'filedelete-maintenance' => 'Η διαγÏαφή κι η επαναφοÏά αÏχείων είναι Ï€ÏοσωÏινά αδÏνατη λόγω συντήÏησης.',
+'filedelete-edit-reasonlist' => 'ΕπεξεÏγασία λόγων διαγÏαφής',
+'filedelete-maintenance' => 'Η διαγÏαφή κι η επαναφοÏά αÏχείων είναι Ï€ÏοσωÏινά αδÏνατη λόγω συντήÏησης.',
+'filedelete-maintenance-title' => 'ΑδÏνατη η διαγÏαφή αÏχείου',
# MIME search
'mimesearch' => 'Αναζήτηση MIME',
@@ -2054,7 +2078,7 @@ $1',
'listusers-editsonly' => 'Εμφάνιση μόνο των χÏηστών με επεξεÏγασίες',
'listusers-creationsort' => 'Ταξινόμηση κατά ημεÏομηνία δημιουÏγίας',
'usereditcount' => '$1 {{PLURAL:$1|επεξεÏγασία|επεξεÏγασίες}}',
-'usercreated' => 'ΔημιουÏγήθηκε στις $1 στις $2',
+'usercreated' => '{{GENDER:$3|ΔημιουÏγήθηκε}} στις $1, $2',
'newpages' => 'Îέες σελίδες',
'newpages-username' => 'Όνομα χÏήστη:',
'ancientpages' => 'Οι παλιότεÏες σελίδες',
@@ -2144,12 +2168,8 @@ $1',
'activeusers-noresult' => 'Δεν βÏέθηκε χÏήστης.',
# Special:Log/newusers
-'newuserlogpage' => 'ΑÏχείο δημιουÏγίας χÏηστών',
-'newuserlogpagetext' => 'Αυτή είναι μια καταγÏαφή δημιουÏγίας χÏηστών.',
-'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος',
-'newuserlog-create-entry' => 'Îέος χÏήστης',
-'newuserlog-create2-entry' => 'δημιουÏγία νέου λογαÏιασμοÏ: $1',
-'newuserlog-autocreate-entry' => 'Ο λογαÏιασμός έχει δημιουÏγηθεί αυτόματα',
+'newuserlogpage' => 'ΑÏχείο δημιουÏγίας χÏηστών',
+'newuserlogpagetext' => 'Αυτή είναι μια καταγÏαφή δημιουÏγίας χÏηστών.',
# Special:ListGroupRights
'listgrouprights' => 'Δικαιώματα ομάδων χÏηστών',
@@ -2179,7 +2199,7 @@ $1',
'emailpage' => 'Αποστολή μηνÏματος ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείο στο χÏήστη',
'emailpagetext' => 'ΣυπληÏώνοντας την παÏακάτω φόÏμα θα στείλετε ένα μήνυμα εφόσον έχετε δηλώσει μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου στις [[Special:Preferences|Ï€Ïοτιμήσεις χÏήστη]]. Αυτή θα εμφανιστεί ως διεÏθυνση αποστολέα του μηνÏματος, οÏτως ώστε ο παÏαλήπτης να μποÏέσει να σας απαντήσει.',
'usermailererror' => 'Σφάλμα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
-'defemailsubject' => 'ΗλεκτÏονικό ταχυδÏομείο {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} e-mail από τον χÏήστη "$1"',
'usermaildisabled' => 'To e-mail χÏήστη είναι απενεÏγοποιημένο',
'usermaildisabledtext' => 'Είναι αδÏνατη η αποστολή e-mail σε άλλους χÏήστες σε αυτό το wiki',
'noemailtitle' => 'Δεν υπάÏχει ηλεκτÏονική διεÏθυνση.',
@@ -2302,8 +2322,6 @@ $UNWATCHURL
'actionfailed' => 'Ανεπιτυχής ενέÏγεια',
'deletedtext' => 'Η "$1" έχει διαγÏαφεί.
Για το ιστοÏικό των Ï€Ïόσφατων διαγÏαφών ανατÏέξτε στο σÏνδεσμο $2',
-'deletedarticle' => 'Η [[$1]] διαγÏάφηκε.',
-'suppressedarticle' => 'απόκÏυψη του "[[$1]]"',
'dellogpage' => 'ΚαταγÏαφές διαγÏαφών',
'dellogpagetext' => 'Λίστα των πιο Ï€Ïόσφατων διαγÏαφών',
'deletionlog' => 'ΚαταγÏαφές διαγÏαφών',
@@ -2369,6 +2387,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Μόνο διαχειÏιστές',
'protect-summary-cascade' => 'διαδοχική',
'protect-expiring' => 'λήγει στις $1 (UTC)',
+'protect-expiring-local' => 'λήγει στις $1',
'protect-expiry-indefinite' => "επ' αόÏιστο",
'protect-cascade' => 'Διαδοχική Ï€Ïοστασία - Ï€Ïοστάτευσε όποιες σελίδες πεÏιλαμβάνονται σε αυτή τη σελίδα.',
'protect-cantedit' => 'Δεν μποÏείτε να αλλάξετε τα επίπεδα Ï€Ïοστασίας αυτής της σελίδας, διότι δεν έχετε την άδεια να την επεξεÏγαστείτε.',
@@ -2428,7 +2447,6 @@ $UNWATCHURL
'undeletereset' => 'Ανανέωση',
'undeleteinvert' => 'ΑνατÏοπή επιλογής',
'undeletecomment' => 'Αιτία:',
-'undeletedarticle' => 'αποκατάσταση "$1"',
'undeletedrevisions' => '{{PLURAL:$1|Ï„Ïοποποίηση|Ï„Ïοποποιήσεις}} αποκαταστάθηκαν',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|αναθεώÏηση|αναθεωÏήσεις}} και $2 {{PLURAL:$2|αÏχείο|αÏχεία}} επαναφέÏθηκαν',
'undeletedfiles' => '$1 {{PLURAL:$1|αÏχείο|αÏχεία}} επαναφέÏθηκαν',
@@ -2437,6 +2455,7 @@ $UNWATCHURL
Συμβουλευτείτε το [[Special:Log/delete|αÏχείο καταγÏαφής διαγÏαφών]] για ένα μητÏώο των Ï€Ïόσφατων διαγÏαφών και επαναφοÏών.",
'undelete-header' => 'Δείτε [[Special:Log/delete|το αÏχείο καταγÏαφής διαγÏαφών]] για Ï€Ïόσφατα διεγÏαμμένες σελίδες.',
+'undelete-search-title' => 'Αναζήτηση στις διεγÏαμμένες σελίδες',
'undelete-search-box' => 'Αναζήτηση διεγÏαμμένων σελίδων',
'undelete-search-prefix' => 'Εμφάνισε σελίδες που αÏχίζουν με:',
'undelete-search-submit' => 'Αναζήτηση',
@@ -2445,6 +2464,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'ΑδÏνατη η επαναφοÏά της αναθεώÏησης αÏχείου με χÏονική σφÏαγιδα $1: το αÏχείο δεν υπήÏχε Ï€Ïιν τη διαγÏαφή.',
'undelete-cleanup-error' => 'Σφάλμα κατά τη διαγÏαφή του αχÏησιμοποίητου αÏχείου καταγÏαφής "$1".',
'undelete-missing-filearchive' => 'ΑδÏνατον να επαναφεÏθεί το ID $1 του καταλόγου αÏχείων γιατί δεν υπάÏχει στη βάση δεδομένων. ΜποÏεί να έχει ήδη επαναφεÏθεί.',
+'undelete-error' => 'Σφάλμα κατά την αναίÏεση διαγÏαφής της σελίδας',
'undelete-error-short' => 'Σφάλμα κατά τη διαγÏαφή του αÏχείου: $1',
'undelete-error-long' => 'Αντιμετωπίστηκαν σφάλματα καθώς επαναφεÏόταν το αÏχείο:
@@ -2565,6 +2585,7 @@ $1',
'blocklist-userblocks' => 'ΑπόκÏυψη φÏαγών λογαÏιασμοÏ',
'blocklist-tempblocks' => 'ΑπόκÏυψη Ï€ÏοσωÏινών φÏαγών',
'blocklist-addressblocks' => 'ΑπόκÏυψη ενιαίων μπλοκ IP',
+'blocklist-rangeblocks' => 'ΑπόκÏυψη πεÏιοχής φÏαγών',
'blocklist-timestamp' => 'Timestamp',
'blocklist-target' => 'Στόχος',
'blocklist-expiry' => 'Λήγει',
@@ -2587,6 +2608,7 @@ $1',
'unblocklink' => 'ΆÏση φÏαγής',
'change-blocklink' => 'αλλαγή φÏαγής',
'contribslink' => 'ΣυνεισφοÏές/ΠÏοσθήκες',
+'emaillink' => 'αποστολή μηνÏματος ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
'autoblocker' => 'Έχετε υποστεί αυτόματα φÏαγή από το σÏστημα επειδή χÏησιμοποιείτε την ίδια διεÏθυνση IP με το χÏήστη "[[User:$1|$1]]". Η αιτιολογία για την φÏαγή του $1 είναι "$2".',
'blocklogpage' => 'ΑÏχείο καταγÏαφής φÏαγών',
'blocklog-showlog' => 'Αυτός ο χÏήστης έχει φÏαγεί Ï€Ïοηγουμένως.
@@ -2709,9 +2731,6 @@ $1',
'movepage-page-moved' => 'Η σελίδα $1 μετακινήθηκε στο $2.',
'movepage-page-unmoved' => 'Η σελίδα $1 δεν μπόÏεσε να μετακινηθεί στο $2.',
'movepage-max-pages' => 'Ο μέγιστος δυνατός αÏιθμός ($1 {{PLURAL:$1|σελίδα|σελίδες}}) μετακινήθηκε και καμία άλλη δεν θα μετακινηθεί αυτόματα.',
-'1movedto2' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]]',
-'1movedto2_redir' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]] με ανακατεÏθυνση',
-'move-redirect-suppressed' => 'απόκÏυψη της ανακατεÏθυνσης',
'movelogpage' => 'ΑÏχείο καταγÏαφής μετακινήσεων',
'movelogpagetext' => 'Ακολουθεί η λίστα με τις σελίδες που έχουν μετακινηθεί.',
'movesubpage' => '{{PLURAL:$1|Υποσελίδα|Υποσελίδες}}',
@@ -2724,7 +2743,7 @@ $1',
Το άÏθÏο [[:$1]] υπάÏχει ήδη. Θέλετε να το διαγÏάψετε για να εκτελεσθεί η μετακίνηση;',
'delete_and_move_confirm' => 'Îαι, διέγÏαψε τη σελίδα',
-'delete_and_move_reason' => 'ΔιαγÏάφηκε για να εκτελεσθεί μετακίνηση.',
+'delete_and_move_reason' => 'ΔιαγÏάφηκε για να δημιουÏγήσει χώÏο για μετακίνηση από το "[[$1]]"',
'selfmove' => 'Ο τίτλος Ï€Ïοέλευσης είναι ο ίδιος με τον τίτλο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï -δεν είναι δυνατόν να μετακινηθεί μια σελίδα Ï€Ïος τον εαυτό της.',
'immobile-source-namespace' => 'Δεν μποÏοÏν να μετακινηθοÏν σελίδες στη πεÏιοχή "$1"',
'immobile-target-namespace' => 'Δεν μποÏοÏν να μετακινηθοÏν σελίδες στην πεÏιοχή "$1"',
@@ -2753,9 +2772,11 @@ $1',
Για την εξαγωγή ολόκληÏων άÏθÏων, συμπληÏώστε τους τίτλους στο παÏακάτω πλαίσιο (ένα τίτλο σε κάθε σειÏά) και επιλέξτε ανάμεσα από το να εξαγάγετε μόνο την Ï„Ïέχουσα έκδοση (με τις πληÏοφοÏίες της πιο Ï€Ïόσφατης επεξεÏγασίας) ή εναλλακτικά και τις παλιότεÏες εκδόσεις (με τις αντίστοιχες καταγÏαφές στη σελιδα του ιστοÏικοÏ).
Στην τελευταία πεÏίπτωση μποÏείτε να κάνετε και χÏήση συνδέσμου, Ï€.χ. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] για το άÏθÏο [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Εξαγωγή όλων των σελίδων',
'exportcuronly' => 'Îα συμπεÏιληφθεί μόνον η Ï„Ïέχουσα αναθεώÏηση, όχι το πλήÏες ιστοÏικό.',
'exportnohistory' => "----
'''Σημείωση:''' Η εξαγωγή του πλήÏους ιστοÏÎ¹ÎºÎ¿Ï ÏƒÎµÎ»Î¯Î´Ï‰Î½ μέσω αυτής της φόÏμας έχει απενεÏγοποιηθεί λόγω θεμάτων απόδοσης.",
+'exportlistauthors' => 'ΣυμπεÏίλαβε μια πλήÏη λίστα των συνεισφεÏόντων για κάθε σελίδα',
'export-submit' => 'Εξαγωγή',
'export-addcattext' => 'ΠÏόσθετε σελίδες από την κατηγοÏία:',
'export-addcat' => 'ΠÏόσθεσε',
@@ -2788,6 +2809,8 @@ $1',
'thumbnail_error' => 'Σφάλμα στη δημιουÏγία μικÏογÏαφίας: $1',
'djvu_page_error' => 'Σελίδα DjVu εκτός οÏίων',
'djvu_no_xml' => 'Αδυναμία Ï€Ïοσκόμισης XML για το αÏχείο DjVu',
+'thumbnail-temp-create' => 'ΑδÏνατη η δημιουÏγία Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου μικÏογÏαφίας',
+'thumbnail-dest-create' => 'ΑδÏνατη η αποθήκευση της μικÏογÏαφίας στον Ï€ÏοοÏισμό',
'thumbnail_invalid_params' => 'ΆκυÏες παÏάμετÏοι μικÏογÏαφίας',
'thumbnail_dest_directory' => 'Αδυναμία δημιουÏγίας καταλόγου Ï€ÏοοÏισμοÏ',
'thumbnail_image-type' => 'Δεν υποστηÏίζεται αυτός ο Ï„Ïπος εικόνας',
@@ -2831,6 +2854,8 @@ $1',
'import-upload' => 'ΕπιφόÏτωση δεδομένων XML',
'import-token-mismatch' => 'Απώλεια των στοιχείων της συνόδου. ΠαÏακαλοÏμε Ï€Ïοσπαθήστε ξανά.',
'import-invalid-interwiki' => 'Δεν είναι δυνατή η εισαγωγή από το καθοÏισμένο wiki.',
+'import-error-edit' => 'Η σελίδα "$1" δεν εισήχθηκε επειδή δεν επιτÏέπεται να το επεξεÏγαστείτε.',
+'import-error-create' => 'Η σελίδα "$1" δεν εισήχθηκε επειδή δεν επιτÏέπεται να τη δημιουÏγήσετε.',
# Import log
'importlogpage' => 'ΑÏχείο καταγÏαφής εισαγωγών',
@@ -2991,9 +3016,6 @@ $1',
# Patrol log
'patrol-log-page' => 'ΑÏχείο καταγÏαφής πεÏιπολιών',
'patrol-log-header' => 'Αυτός είναι ένας κατάλογος πεÏιπολοÏμενων αναθεωÏήσεων.',
-'patrol-log-line' => 'σημάνθηκε το $1 του $2 υπό πεÏιπολία $3',
-'patrol-log-auto' => '(αυτόματα)',
-'patrol-log-diff' => 'αναθεώÏηση $1',
'log-show-hide-patrol' => '$1 καταγÏαφή επιτήÏησης',
# Image deletion
@@ -3020,11 +3042,11 @@ $1',
'file-info' => 'μέγεθος αÏχείου: $1, Ï„Ïπος MIME: $2',
'file-info-size' => '$1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3, Ï„Ïπος MIME: $4',
'file-info-size-pages' => '$1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3 , Ï„Ïπος MIME: $4 , $5 {{PLURAL:$5| σελίδα | σελίδες}}',
-'file-nohires' => '<small>Δεν διατίθεται υψηλότεÏη ανάλυση.</small>',
+'file-nohires' => 'Δεν διατίθεται υψηλότεÏη ανάλυση.',
'svg-long-desc' => "ΑÏχείο SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3",
'show-big-image' => 'ΠλήÏης ανάλυση',
-'show-big-image-preview' => '<small>Μέγεθος αυτής της Ï€Ïοεπισκόπησης: $1 .</small>',
-'show-big-image-other' => '<small>Άλλες αναλÏσεις: $1.</small>',
+'show-big-image-preview' => 'Μέγεθος αυτής της Ï€Ïοεπισκόπησης: $1 .',
+'show-big-image-other' => 'Άλλες {{PLURAL:$2|ανάλυση|αναλÏσεις}}: $1.',
'show-big-image-size' => '$1 × $2 εικονοστοιχεία',
'file-info-gif-looped' => 'πεÏιτυλιγμένο',
'file-info-gif-frames' => '$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}',
@@ -3044,6 +3066,13 @@ $1',
'bydate' => 'ημεÏομηνίας',
'sp-newimages-showfrom' => 'Εμφάνιση νέων αÏχείων ξεκινώντας από $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 δευτεÏόλεπτο|$1 δευτεÏόλεπτα}}',
+'minutes' => '{{PLURAL:$1|$1 λεπτό|$1 λεπτά}}',
+'hours' => '{{PLURAL:$1|$1 ÏŽÏα|$1 ÏŽÏες}}',
+'days' => '{{PLURAL:$1|$1 μέÏα|$1 μέÏες}}',
+'ago' => '$1 Ï€Ïιν',
+
# Bad image list
'bad_image_list' => 'Η σÏνταξη είναι ως εξής:
@@ -3535,13 +3564,6 @@ $5
'scarytranscludefailed' => '[Η Ï€Ïοσκόμιση Ï€ÏοτÏπου για το $1 απέτυχε.]',
'scarytranscludetoolong' => '[Η διεÏθυνση URL είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î·.]',
-# Trackbacks
-'trackbackbox' => 'Ανασυνδέσεις για αυτό το άÏθÏο:<br />
-$1',
-'trackbackremove' => '([$1 ΔιαγÏαφή])',
-'trackbacklink' => 'ΕπιστÏοφή για αναζήτηση',
-'trackbackdeleteok' => 'Η επιστÏοφή για αναζήτηση έχει διαγÏαφεί επιτυχώς.',
-
# Delete conflict
'deletedwhileediting' => "'''ΠÏοσοχή''': Αυτή η σελίδα έχει διαγÏαφεί αφότου ξεκινήσατε την επεξεÏγασία!",
'confirmrecreate' => "Ο χÏήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγÏαψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεÏγασία με αιτιολόγηση:
@@ -3675,9 +3697,9 @@ $1',
# Special:SpecialPages
'specialpages' => 'Σελίδες λειτουÏγιών',
-'specialpages-note' => ' * Κανονικές ειδικές σελίδες.
+'specialpages-note' => '* Κανονικές ειδικές σελίδες.
* <span class="mw-specialpagerestricted">Ειδικές σελίδες με πεÏιοÏισμοÏÏ‚.</span>
-* <span class="mw-specialpagecached">Ειδικές σελίδες που βÏίσκονται στη μνήμη cache (μποÏεί να είναι απαÏχαιωμένες).</span>',
+* <span class="mw-specialpagecached">Ειδικές σελίδες αποθηκευμένες Ï€ÏοσωÏινά (μποÏεί να είναι παÏωχημένες).</span>',
'specialpages-group-maintenance' => 'ΑναφοÏές συντήÏησης',
'specialpages-group-other' => 'Άλλες ειδικές σελίδες',
'specialpages-group-login' => 'ΣÏνδεση / δημιουÏγία λογαÏιασμοÏ',
@@ -3719,13 +3741,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|αλλαγή|αλλαγές}}',
# Special:ComparePages
-'comparepages' => 'ΣυγκÏίνετε τις σελίδες',
-'compare-selector' => 'ΣυγκÏίνετε τις αναθεωÏήσεις των σελίδων',
-'compare-page1' => 'Σελίδα 1',
-'compare-page2' => 'Σελίδα 2',
-'compare-rev1' => 'ΑναθεώÏηση 1',
-'compare-rev2' => 'ΑναθεώÏηση 2',
-'compare-submit' => 'ΣυγκÏίνετε',
+'comparepages' => 'ΣυγκÏίνετε τις σελίδες',
+'compare-selector' => 'ΣυγκÏίνετε τις αναθεωÏήσεις των σελίδων',
+'compare-page1' => 'Σελίδα 1',
+'compare-page2' => 'Σελίδα 2',
+'compare-rev1' => 'ΑναθεώÏηση 1',
+'compare-rev2' => 'ΑναθεώÏηση 2',
+'compare-submit' => 'ΣυγκÏίνετε',
+'compare-invalid-title' => 'Ο τίτλος που καθοÏίσατε δεν είναι έγκυÏος.',
+'compare-title-not-exists' => 'Ο τίτλος που καθοÏίσατε δεν υπάÏχει.',
+'compare-revision-not-exists' => 'Η αναθεώÏηση που καθοÏίσατε δεν υπάÏχει.',
# Database error messages
'dberr-header' => 'Αυτό το βίκι έχει ένα Ï€Ïόβλημα',
@@ -3752,4 +3777,60 @@ $1',
'sqlite-has-fts' => '$1 με υποστήÏιξη αναζήτησης πλήÏους κειμένου',
'sqlite-no-fts' => '$1 χωÏίς την υποστήÏιξη αναζήτησης πλήÏους κειμένου',
+# New logging system
+'revdelete-restricted' => 'εφάÏμοσε πεÏιοÏισμοÏÏ‚ στους sysops',
+'revdelete-unrestricted' => 'αφαίÏεσε πεÏιοÏισμοÏÏ‚ στους sysops',
+'logentry-newusers-create' => '$1 δημιοÏÏγησε έναν λογαÏιασμό χÏήστη',
+'logentry-newusers-autocreate' => 'Ο λογαÏιασμός $1 δημιουÏγήθηκε αυτόματα',
+'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος',
+
+# Feedback
+'feedback-subject' => 'Θέμα:',
+'feedback-message' => 'Μήνυμα:',
+'feedback-cancel' => 'ΑκÏÏωση',
+'feedback-submit' => 'Υποβολή σχολίων',
+'feedback-adding' => 'ΠÏοσθήκη σχολίων στην σελίδα...',
+'feedback-error1' => 'Σφάλμα: Μη αναγνωÏίσιμο αποτέλεσμα από το API',
+'feedback-error2' => 'Σφάλμα: Η επεξεÏγασία απέτυχε',
+'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
+'feedback-thanks' => 'ΕυχαÏιστοÏμε! Τα σχόλιά σας έχουν καταχωÏηθεί στη σελίδα "[$2 $1]".',
+'feedback-close' => 'ΟλοκληÏώθηκε',
+
+# API errors
+'api-error-badaccess-groups' => 'Δεν επιτÏέπεται να ανεβάσετε αÏχεία σε αυτό το wiki.',
+'api-error-badtoken' => 'ΕσωτεÏικό σφάλμα: εσφαλμένο διακÏιτικό.',
+'api-error-copyuploaddisabled' => 'Η επιφόÏτωση από URL είναι απενεÏγοποιημένη σε αυτόν το διακομιστή.',
+'api-error-duplicate' => '{{PLURAL:$1|ΥπάÏχει [$2 άλλο αÏχείο]|ΥπάÏχουν [$2 άλλα αÏχεία]}} ήδη στον ιστότοπο με το ίδιο πεÏιεχόμενο.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|ΥπήÏχε ήδη [$2 άλλο αÏχείο] |ΥπήÏχαν ήδη [$2 άλλα αÏχεία]}} στον ιστότοπο με το ίδιο πεÏιεχόμενο, αλλά {{PLURAL:$1|διαγÏάφηκε|διαγÏάφηκαν}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Διπλότυπο αÏχείο που έχει|Διπλότυπα αÏχεία που έχουν}} ήδη διαγÏαφεί',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Διπλότυπο αÏχείο|Διπλότυπα αÏχεία}}',
+'api-error-empty-file' => 'Το αÏχείο που υποβάλλατε ήταν κενό.',
+'api-error-fetchfileerror' => 'ΕσωτεÏικό σφάλμα: κάτι πήγε στÏαβά κατά την ανάκτηση του αÏχείου.',
+'api-error-file-too-large' => 'Το αÏχείο που υποβάλλατε ήταν Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿.',
+'api-error-filename-tooshort' => 'Το όνομα αÏχείου είναι Ï€Î¿Î»Ï Î¼Î¹ÎºÏÏŒ.',
+'api-error-filetype-banned' => 'Αυτός ο Ï„Ïπος αÏχείου έχει απαγοÏευτεί.',
+'api-error-filetype-missing' => 'Το αÏχείο δεν έχει επέκταση.',
+'api-error-hookaborted' => 'Η Ï„Ïοποποίηση που επιχειÏήσατε να κάνετε ματαιώθηκε από ένα άγκιστÏο της επέκτασης.',
+'api-error-http' => 'ΕσωτεÏικό σφάλμα: δεν είναι δυνατή η σÏνδεση με το διακομιστή.',
+'api-error-illegal-filename' => 'Αυτό το όνομα αÏχείου δεν επιτÏέπεται.',
+'api-error-internal-error' => 'ΕσωτεÏικό σφάλμα: κάτι πήγε στÏαβά με την επεξεÏγασία της επιφόÏτωσής σας στο wiki.',
+'api-error-invalid-file-key' => 'ΕσωτεÏικό σφάλμα: το αÏχείο δεν βÏέθηκε στην Ï€ÏοσωÏινή αποθήκευση.',
+'api-error-missingparam' => 'ΕσωτεÏικό σφάλμα: λείπουν παÏάμετÏοι από το αίτημα.',
+'api-error-missingresult' => 'ΕσωτεÏικό σφάλμα: δεν ήταν δυνατό να Ï€ÏοσδιοÏιστεί εάν η αντίγÏαφή ολοκληÏώθηκε με επιτυχία.',
+'api-error-mustbeloggedin' => 'Θα Ï€Ïέπει να συνδεθείτε για να φοÏτώσετε τα αÏχεία.',
+'api-error-mustbeposted' => 'ΕσωτεÏικό σφάλμα: το αίτημα απαιτεί HTTP POST.',
+'api-error-noimageinfo' => 'Η αποστολή πέτυχε, αλλά ο διακομιστής δεν μας παÏείχε πληÏοφοÏίες σχετικά με το αÏχείο.',
+'api-error-nomodule' => 'ΕσωτεÏικό σφάλμα: δεν υπάÏχει σετ επιφόÏτωσης.',
+'api-error-ok-but-empty' => 'ΕσωτεÏικό σφάλμα: δεν υπάÏχει απάντηση από το διακομιστή.',
+'api-error-overwrite' => 'Αντικατάσταση ενός υπάÏχοντος αÏχείου δεν επιτÏέπεται.',
+'api-error-stashfailed' => 'ΕσωτεÏικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεÏσει το Ï€ÏοσωÏινό αÏχείο.',
+'api-error-timeout' => 'Ο διακομιστής δεν αποκÏίθηκε εντός του αναμενόμενου χÏόνου.',
+'api-error-unclassified' => 'ΠÏοέκυψε ένα άγνωστο σφάλμα.',
+'api-error-unknown-code' => 'Άγνωστο σφάλμα: "$1"',
+'api-error-unknown-error' => 'ΕσωτεÏικό σφάλμα: κάτι πήγε στÏαβά, όταν Ï€Ïοσπαθείσατε να φοÏτώσετε το αÏχείο σας.',
+'api-error-unknown-warning' => 'Άγνωστη Ï€Ïοειδοποίηση:$1',
+'api-error-unknownerror' => 'Άγνωστο σφάλμα:"$1".',
+'api-error-uploaddisabled' => 'Η επιφόÏτωση είναι απενεÏγοποιημένη σε αυτό το wiki.',
+'api-error-verification-error' => 'Αυτό το αÏχείο μποÏεί να είναι κατεστÏαμμένο, ή να έχει λανθασμένη επέκταση.',
+
);
diff --git a/languages/messages/MessagesEml.php b/languages/messages/MessagesEml.php
index b5b73ac6..66759001 100644
--- a/languages/messages/MessagesEml.php
+++ b/languages/messages/MessagesEml.php
@@ -130,8 +130,7 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
'allpages' => 'Tôt al pàgin',
# Special:Log/newusers
-'newuserlogpage' => 'Regestér di nÅv utèint',
-'newuserlog-create-entry' => 'Un utèint nÅv',
+'newuserlogpage' => 'Regestér di nÅv utèint',
# Watchlist
'watchlist' => 'Al còsi ca guèrd',
@@ -145,7 +144,6 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
Cunfermèr per piasèr ca saîv quàl che stèv par fêr, ca capîv al pussìbil counseguèinzi e ca stèv facènd quàst in confurmitê cun [[{{MediaWiki:Policy-url}}]].",
'deletedtext' => '"$1" l\'è stê scanzlê.
Guèrda $2 par vèdder la lésta d\'al pàgin ch\'i sun stèdi scanzlèdi di recèint.',
-'deletedarticle' => 'scanzlê "[[$1]]"',
'dellogpage' => 'Regestér dal scanzladûri',
'deletionlog' => 'regéster dal scanzladûri',
@@ -160,7 +158,6 @@ Guèrda $2 par vèdder la lésta d\'al pàgin ch\'i sun stèdi scanzlèdi di rec
'contribslink' => "còl ch'l'à scrét",
# Move page
-'1movedto2' => "[[$1]] l'è stê mòs a [[$2]]",
'movelogpage' => 'Regestér di muvimèint',
# Special:NewFiles
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index cd2b0240..6dd04c2c 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -350,6 +350,8 @@ $magicWords = array(
'url_path' => array( 0, 'PATH' ),
'url_wiki' => array( 0, 'WIKI' ),
'url_query' => array( 0, 'QUERY' ),
+ 'defaultsort_noerror' => array( 0, 'noerror' ),
+ 'defaultsort_noreplace' => array( 0, 'noreplace' ),
);
/**
@@ -372,6 +374,7 @@ $specialPageAliases = array(
'Booksources' => array( 'BookSources' ),
'BrokenRedirects' => array( 'BrokenRedirects' ),
'Categories' => array( 'Categories' ),
+ 'ChangeEmail' => array( 'ChangeEmail' ),
'ChangePassword' => array( 'ChangePassword', 'ResetPass', 'ResetPassword' ),
'ComparePages' => array( 'ComparePages' ),
'Confirmemail' => array( 'ConfirmEmail' ),
@@ -389,6 +392,7 @@ $specialPageAliases = array(
'Filepath' => array( 'FilePath' ),
'Import' => array( 'Import' ),
'Invalidateemail' => array( 'InvalidateEmail' ),
+ 'JavaScriptTest' => array( 'JavaScriptTest' ),
'BlockList' => array( 'BlockList', 'ListBlocks', 'IPBlockList' ),
'LinkSearch' => array( 'LinkSearch' ),
'Listadmins' => array( 'ListAdmins' ),
@@ -886,6 +890,7 @@ See [[Special:Version|version page]].',
'ok' => 'OK',
'pagetitle' => '$1 - {{SITENAME}}', # only translate this message to other languages if you have to change it
'pagetitle-view-mainpage' => '{{SITENAME}}', # only translate this message to other languages if you have to change it
+'backlinksubtitle' => '↠$1', # only translate this message to other languages if you have to change it
'retrievedfrom' => 'Retrieved from "$1"',
'youhavenewmessages' => 'You have $1 ($2).',
'newmessageslink' => 'new messages',
@@ -990,23 +995,25 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
'badarticleerror' => 'This action cannot be performed on this page.',
'cannotdelete' => 'The page or file "$1" could not be deleted.
It may have already been deleted by someone else.',
+'cannotdelete-title' => 'Cannot delete 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 which cannot be used in titles.',
-'perfcached' => 'The following data is cached and may not be up to date.',
-'perfcachedts' => 'The following data is cached, and was last updated $1.',
+'perfcached' => 'The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Updates for this page are currently disabled.
Data here will not presently be refreshed.',
'wrong_wfQuery_params' => 'Incorrect parameters to wfQuery()<br />
Function: $1<br />
Query: $2',
'viewsource' => 'View source',
-'viewsourcefor' => 'for $1',
+'viewsource-title' => 'View source for $1',
'actionthrottled' => 'Action throttled',
'actionthrottledtext' => 'As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.
Please try again in a few minutes.',
'protectedpagetext' => 'This page has been protected to prevent editing.',
'viewsourcetext' => 'You can view and copy the source of this page:',
+'viewyourtext' => "You can view and copy the source of '''your edits''' to this page:",
'protectedinterface' => 'This page provides interface text for the software, and is protected to prevent abuse.',
'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
Changes to this page will affect the appearance of the user interface for other users.
@@ -1125,6 +1132,7 @@ No e-mail will be sent for any of the following features.',
'emailconfirmlink' => 'Confirm your e-mail address',
'invalidemailaddress' => 'The e-mail address cannot be accepted as it appears to have an invalid format.
Please enter a well-formatted address or empty that field.',
+'cannotchangeemail' => 'Account e-mail addresses cannot be changed on this wiki.',
'accountcreated' => 'Account created',
'accountcreatedtext' => 'The user account for $1 has been created.',
'createaccount-title' => 'Account creation for {{SITENAME}}',
@@ -1150,6 +1158,7 @@ Please wait before trying again.',
'pear-mail-error' => '$1', # do not translate or duplicate this message to other languages
'php-mail-error' => '$1', # do not translate or duplicate this message to other languages
'php-mail-error-unknown' => "Unknown error in PHP's mail() function.",
+'user-mail-no-addy' => 'Tried to send e-mail without an e-mail address.',
# Change password dialog
'resetpass' => 'Change password',
@@ -1172,16 +1181,18 @@ You may have already successfully changed your password or requested a new tempo
'resetpass-temp-password' => 'Temporary password:',
# Special:PasswordReset
-'passwordreset' => 'Reset password',
-'passwordreset-text' => 'Complete this form to receive an e-mail reminder of your account details.',
-'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-username' => 'Username:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'E-mail address:',
-'passwordreset-emailtitle' => 'Account details on {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Someone (probably you, from IP address $1) requested a reminder of your
+'passwordreset' => 'Reset password',
+'passwordreset-text' => 'Complete this form to receive an e-mail reminder of your account details.',
+'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-username' => 'Username:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'View the resulting e-mail?',
+'passwordreset-capture-help' => 'If you check this box, the e-mail (with the temporary password) will be shown to you as well as being sent to the user.',
+'passwordreset-email' => 'E-mail address:',
+'passwordreset-emailtitle' => 'Account details on {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Someone (probably you, from IP address $1) requested a reminder of your
account details for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}
associated with this e-mail address:
@@ -1192,7 +1203,7 @@ You should log in and choose a new password now. If someone else made this
request, or if you have remembered your original password, and you no longer
wish to change it, you may ignore this message and continue using your old
password.',
-'passwordreset-emailtext-user' => 'User $1 on {{SITENAME}} requested a reminder of your account details for {{SITENAME}}
+'passwordreset-emailtext-user' => 'User $1 on {{SITENAME}} requested a reminder of your account details for {{SITENAME}}
($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this e-mail address:
$2
@@ -1202,9 +1213,22 @@ You should log in and choose a new password now. If someone else made this
request, or if you have remembered your original password, and you no longer
wish to change it, you may ignore this message and continue using your old
password.',
-'passwordreset-emailelement' => 'Username: $1
+'passwordreset-emailelement' => 'Username: $1
Temporary password: $2',
-'passwordreset-emailsent' => 'A reminder e-mail has been sent.',
+'passwordreset-emailsent' => 'A reminder e-mail has been sent.',
+'passwordreset-emailsent-capture' => 'A reminder e-mail has been sent, which is shown below.',
+'passwordreset-emailerror-capture' => 'A reminder e-mail was generated, which is shown below, but sending it to the user failed: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Change e-mail address',
+'changeemail-header' => 'Change account e-mail address',
+'changeemail-text' => 'Complete this form to change your e-mail address. You will need to enter your password to confirm this change.',
+'changeemail-no-info' => 'You must be logged in to access this page directly.',
+'changeemail-oldemail' => 'Current e-mail address:',
+'changeemail-newemail' => 'New e-mail address:',
+'changeemail-none' => '(none)',
+'changeemail-submit' => 'Change e-mail',
+'changeemail-cancel' => 'Cancel',
# Edit page toolbar
'bold_sample' => 'Bold text',
@@ -1276,9 +1300,6 @@ Note that you may not use the "e-mail this user" feature unless you have a valid
Your current IP address is $3, and the block ID is #$5.
Please include all above details in any queries you make.',
'blockednoreason' => 'no reason given',
-'blockedoriginalsource' => "The source of '''$1''' is shown below:",
-'blockededitsource' => "The text of '''your edits''' to '''$1''' is shown below:",
-'whitelistedittitle' => 'Login required to edit',
'whitelistedittext' => 'You have to $1 to edit pages.',
'confirmedittext' => 'You must confirm your e-mail address before editing pages.
Please set and validate your e-mail address through your [[Special:Preferences|user preferences]].',
@@ -1377,7 +1398,7 @@ You are also promising us that you wrote this yourself, or copied it from a publ
'''Do not submit copyrighted work without permission!'''",
'editpage-tos-summary' => '-', # do not translate or duplicate this message to other languages
'longpage-hint' => '-', # do not translate or duplicate this message to other languages
-'longpageerror' => "'''Error: The text you have submitted is $1 kilobytes long, which is longer than the maximum of $2 kilobytes.'''
+'longpageerror' => "'''Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
It cannot be saved.",
'readonlywarning' => "'''Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.'''
You may wish to cut-n-paste the text into a text file and save it for later.
@@ -1554,8 +1575,6 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
'revdelete-unsuppress' => 'Remove restrictions on restored revisions',
'revdelete-log' => 'Reason:',
'revdelete-submit' => 'Apply to selected {{PLURAL:$1|revision|revisions}}',
-'revdelete-logentry' => 'changed revision visibility of "[[$1]]"',
-'logdelete-logentry' => 'changed event visibility of "[[$1]]"',
'revdelete-success' => "'''Revision visibility successfully updated.'''",
'revdelete-failure' => "'''Revision visibility could not be updated:'''
$1",
@@ -1567,15 +1586,6 @@ $1",
'revdel-restore-visible' => 'visible revisions',
'pagehist' => 'Page history',
'deletedhist' => 'Deleted history',
-'revdelete-content' => 'content',
-'revdelete-summary' => 'edit summary',
-'revdelete-uname' => 'username',
-'revdelete-restricted' => 'applied restrictions to administrators',
-'revdelete-unrestricted' => 'removed restrictions for administrators',
-'revdelete-hid' => 'hid $1',
-'revdelete-unhid' => 'unhid $1',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|revision|revisions}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|event|events}}',
'revdelete-hide-current' => 'Error hiding the item dated $2, $1: This is the current revision.
It cannot be hidden.',
'revdelete-show-no-access' => 'Error showing the item dated $2, $1: This item has been marked "restricted".
@@ -1757,12 +1767,14 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
'prefs-rc' => 'Recent changes',
'prefs-watchlist' => 'Watchlist',
'prefs-watchlist-days' => 'Days to show in watchlist:',
-'prefs-watchlist-days-max' => 'Maximum 7 days',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Maximum number of changes to show in expanded watchlist:',
'prefs-watchlist-edits-max' => 'Maximum number: 1000',
'prefs-watchlist-token' => 'Watchlist token:',
'prefs-misc' => 'Misc',
'prefs-resetpass' => 'Change password',
+'prefs-changeemail' => 'Change e-mail address',
+'prefs-setemail' => 'Set an e-mail address',
'prefs-email' => 'E-mail options',
'prefs-rendering' => 'Appearance',
'saveprefs' => 'Save',
@@ -1824,6 +1836,7 @@ This cannot be undone.',
'yourrealname' => 'Real name:',
'yourlanguage' => 'Language:',
'yourvariant' => 'Content language variant:',
+'prefs-help-variant' => 'Your preferred variant or orthography to display the content pages of this wiki in.',
'yournick' => 'New signature:',
'prefs-help-signature' => 'Comments on talk pages should be signed with "<nowiki>~~~~</nowiki>" which will be converted into your signature and a timestamp.',
'badsig' => 'Invalid raw signature.
@@ -1868,7 +1881,7 @@ Your e-mail address is not revealed when other users contact you.',
'userrights-lookup-user' => 'Manage user groups',
'userrights-user-editname' => 'Enter a username:',
'editusergroup' => 'Edit user groups',
-'editinguser' => "Changing user rights of user '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Changing user rights of user '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Edit user groups',
'saveusergroups' => 'Save user groups',
'userrights-groupsmember' => 'Member of:',
@@ -1896,12 +1909,12 @@ Your e-mail address is not revealed when other users contact you.',
'group-suppress' => 'Oversights',
'group-all' => '(all)',
-'group-user-member' => 'user',
-'group-autoconfirmed-member' => 'autoconfirmed user',
-'group-bot-member' => 'bot',
-'group-sysop-member' => 'administrator',
-'group-bureaucrat-member' => 'bureaucrat',
-'group-suppress-member' => 'oversight',
+'group-user-member' => '{{GENDER:$1|user}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|autoconfirmed user}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|administrator}}',
+'group-bureaucrat-member' => '{{GENDER:$1|bureaucrat}}',
+'group-suppress-member' => '{{GENDER:$1|oversight}}',
'grouppage-user' => '{{ns:project}}:Users',
'grouppage-autoconfirmed' => '{{ns:project}}:Autoconfirmed users',
@@ -1963,13 +1976,13 @@ Your e-mail address is not revealed when other users contact you.',
'right-autopatrol' => "Have one's own edits automatically marked as patrolled",
'right-patrolmarks' => 'View recent changes patrol marks',
'right-unwatchedpages' => 'View a list of unwatched pages',
-'right-trackback' => 'Submit a trackback',
'right-mergehistory' => 'Merge the history of pages',
'right-userrights' => 'Edit all user rights',
'right-userrights-interwiki' => 'Edit user rights of users on other wikis',
'right-siteadmin' => 'Lock and unlock the database',
'right-override-export-depth' => 'Export pages including linked pages up to a depth of 5',
'right-sendemail' => 'Send e-mail to other users',
+'right-passwordreset' => 'View password reset e-mails',
# User rights log
'rightslog' => 'User rights log',
@@ -2003,16 +2016,17 @@ Your e-mail address is not revealed when other users contact you.',
'action-suppressionlog' => 'view this private log',
'action-block' => 'block this user from editing',
'action-protect' => 'change protection levels for this page',
+'action-rollback' => 'quickly rollback the edits of the last user who edited a particular page',
'action-import' => 'import this page from another wiki',
'action-importupload' => 'import this page from a file upload',
'action-patrol' => "mark others' edit as patrolled",
'action-autopatrol' => 'have your edit marked as patrolled',
'action-unwatchedpages' => 'view the list of unwatched pages',
-'action-trackback' => 'submit a trackback',
'action-mergehistory' => 'merge the history of this page',
'action-userrights' => 'edit all user rights',
'action-userrights-interwiki' => 'edit user rights of users on other wikis',
'action-siteadmin' => 'lock or unlock the database',
+'action-sendemail' => 'send e-mails',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|change|changes}}',
@@ -2043,22 +2057,22 @@ Your e-mail address is not revealed when other users contact you.',
'newpageletter' => 'N',
'boteditletter' => 'b',
'unpatrolledletter' => '!', # only translate this message to other languages if you have to change it
-'sectionlink' => '→', # only translate this message to other languages if you have to change it
'number_of_watching_users_RCview' => '[$1]', # do not translate or duplicate this message to other languages
'number_of_watching_users_pageview' => '[$1 watching {{PLURAL:$1|user|users}}]',
'rc_categories' => 'Limit to categories (separate with "|")',
'rc_categories_any' => 'Any',
'rc-change-size' => '$1', # only translate this message to other languages if you have to change it
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} after change',
'newsectionsummary' => '/* $1 */ new section',
'rc-enhanced-expand' => 'Show details (requires JavaScript)',
'rc-enhanced-hide' => 'Hide details',
+'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-backlink' => '↠$1', # only translate this message to other languages if you have to change it
'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'''.",
@@ -2106,6 +2120,7 @@ See the [[Special:NewFiles|gallery of new files]] for a more visual overview.',
'minlength1' => 'Filenames must be at least one letter.',
'illegalfilename' => 'The filename "$1" contains characters that are not allowed in page titles.
Please rename the file and try uploading it again.',
+'filename-toolong' => 'Filenames may not be longer than 240 bytes.',
'badfilename' => 'Filename has been changed to "$1".',
'filetype-mime-mismatch' => 'File extension ".$1" does not match the detected MIME type of the file ($2).',
'filetype-badmime' => 'Files of the MIME type "$1" are not allowed to be uploaded.',
@@ -2223,6 +2238,41 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
'upload-unknown-size' => 'Unknown size',
'upload-http-error' => 'An HTTP error occured: $1',
+# File backend
+'backend-fail-stream' => 'Could not stream file $1.',
+'backend-fail-backup' => 'Could not backup file $1.',
+'backend-fail-notexists' => 'The file $1 does not exist.',
+'backend-fail-hashes' => 'Could not get file hashes for comparison.',
+'backend-fail-notsame' => 'A non-identical file already exists at $1.',
+'backend-fail-invalidpath' => '$1 is not a valid storage path.',
+'backend-fail-delete' => 'Could not delete file $1.',
+'backend-fail-alreadyexists' => 'The file $1 already exists.',
+'backend-fail-store' => 'Could not store file $1 at $2.',
+'backend-fail-copy' => 'Could not copy file $1 to $2.',
+'backend-fail-move' => 'Could not move file $1 to $2.',
+'backend-fail-opentemp' => 'Could not open temporary file.',
+'backend-fail-writetemp' => 'Could not write to temporary file.',
+'backend-fail-closetemp' => 'Could not close temporary file.',
+'backend-fail-read' => 'Could not read file $1.',
+'backend-fail-create' => 'Could not create file $1.',
+'backend-fail-readonly' => 'The storage backend "$1" is currently read-only. The reason given was: "$2"',
+'backend-fail-synced' => 'The file "$1" is in an inconsistent state within the internal storage backends',
+'backend-fail-connect' => 'Could not connect to storage backend "$1".',
+'backend-fail-internal' => 'An unknown error occurred in storage backend "$1".',
+'backend-fail-contenttype' => 'Could not determine the content type of the file to store at "$1".',
+'backend-fail-batchsize' => 'Storage backend given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Could not unlock "$1"; it is not locked.',
+'lockmanager-fail-closelock' => 'Could not close lock file for "$1".',
+'lockmanager-fail-deletelock' => 'Could not delete lock file for "$1".',
+'lockmanager-fail-acquirelock' => 'Could not acquire lock for "$1".',
+'lockmanager-fail-openlock' => 'Could not open lock file for "$1".',
+'lockmanager-fail-releaselock' => 'Could not release lock for "$1".',
+'lockmanager-fail-db-bucket' => 'Could not contact enough lock databases in bucket $1.',
+'lockmanager-fail-db-release' => 'Could not release locks on database $1.',
+'lockmanager-fail-svr-release' => 'Could not release locks on server $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'An error was encountered when opening the file for ZIP checks.',
'zip-wrong-format' => 'The specified file was not a ZIP file.',
@@ -2239,6 +2289,7 @@ It cannot be properly checked for security.',
'uploadstash-badtoken' => 'Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.',
'uploadstash-errclear' => 'Clearing the files was unsuccessful.',
'uploadstash-refresh' => 'Refresh the list of files',
+'invalid-chunk-offset' => 'Invalid chunk offset',
# img_auth script messages
'img-auth-accessdenied' => 'Access denied',
@@ -2342,7 +2393,6 @@ The description on its [$2 file description page] there is shown below.',
# File reversion
'filerevert' => 'Revert $1',
-'filerevert-backlink' => '↠$1', # only translate this message to other languages if you have to change it
'filerevert-legend' => 'Revert file',
'filerevert-intro' => "You are about to revert the file '''[[Media:$1|$1]]''' to the [$4 version as of $3, $2].",
'filerevert-comment' => 'Reason:',
@@ -2352,24 +2402,24 @@ The description on its [$2 file description page] there is shown below.',
'filerevert-badversion' => 'There is no previous local version of this file with the provided timestamp.',
# File deletion
-'filedelete' => 'Delete $1',
-'filedelete-backlink' => '↠$1', # only translate this message to other languages if you have to change it
-'filedelete-legend' => 'Delete file',
-'filedelete-intro' => "You are about to delete the file '''[[Media:$1|$1]]''' along with all of its history.",
-'filedelete-intro-old' => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
-'filedelete-comment' => 'Reason:',
-'filedelete-submit' => 'Delete',
-'filedelete-success' => "'''$1''' has been deleted.",
-'filedelete-success-old' => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
-'filedelete-nofile' => "'''$1''' does not exist.",
-'filedelete-nofile-old' => "There is no archived version of '''$1''' with the specified attributes.",
-'filedelete-otherreason' => 'Other/additional reason:',
-'filedelete-reason-otherlist' => 'Other reason',
-'filedelete-reason-dropdown' => '*Common delete reasons
+'filedelete' => 'Delete $1',
+'filedelete-legend' => 'Delete file',
+'filedelete-intro' => "You are about to delete the file '''[[Media:$1|$1]]''' along with all of its history.",
+'filedelete-intro-old' => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
+'filedelete-comment' => 'Reason:',
+'filedelete-submit' => 'Delete',
+'filedelete-success' => "'''$1''' has been deleted.",
+'filedelete-success-old' => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
+'filedelete-nofile' => "'''$1''' does not exist.",
+'filedelete-nofile-old' => "There is no archived version of '''$1''' with the specified attributes.",
+'filedelete-otherreason' => 'Other/additional reason:',
+'filedelete-reason-otherlist' => 'Other reason',
+'filedelete-reason-dropdown' => '*Common delete reasons
** Copyright violation
** Duplicated file',
-'filedelete-edit-reasonlist' => 'Edit delete reasons',
-'filedelete-maintenance' => 'Deletion and restoration of files temporarily disabled during maintenance.',
+'filedelete-edit-reasonlist' => 'Edit delete reasons',
+'filedelete-maintenance' => 'Deletion and restoration of files temporarily disabled during maintenance.',
+'filedelete-maintenance-title' => 'Cannot delete file',
# MIME search
'mimesearch' => 'MIME search',
@@ -2488,6 +2538,8 @@ It now redirects to [[$2]].',
'wantedpages-badtitle' => 'Invalid title in result set: $1',
'wantedfiles' => 'Wanted files',
'wantedfiles-summary' => '', # do not translate or duplicate this message to other languages
+'wantedfiletext-cat' => 'The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].',
+'wantedfiletext-nocat' => 'The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.',
'wantedtemplates' => 'Wanted templates',
'wantedtemplates-summary' => '', # do not translate or duplicate this message to other languages
'mostlinked' => 'Most linked-to pages',
@@ -2503,6 +2555,7 @@ It now redirects to [[$2]].',
'mostrevisions' => 'Pages with the most revisions',
'mostrevisions-summary' => '', # do not translate or duplicate this message to other languages
'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
'shortpages' => 'Short pages',
'shortpages-summary' => '', # do not translate or duplicate this message to other languages
@@ -2526,7 +2579,7 @@ It now redirects to [[$2]].',
'listusers-editsonly' => 'Show only users with edits',
'listusers-creationsort' => 'Sort by creation date',
'usereditcount' => '$1 {{PLURAL:$1|edit|edits}}',
-'usercreated' => 'Created on $1 at $2',
+'usercreated' => '{{GENDER:$3|Created}} on $1 at $2',
'newpages' => 'New pages',
'newpages-summary' => '', # do not translate or duplicate this message to other languages
'newpages-username' => 'Username:',
@@ -2631,13 +2684,8 @@ Supported protocols: <tt>$1</tt> (do not add any of these in your search).',
'activeusers-noresult' => 'No users found.',
# Special:Log/newusers
-'newuserlogpage' => 'User creation log',
-'newuserlogpagetext' => 'This is a log of user creations.',
-'newuserlogentry' => '', # do not translate or duplicate this message to other languages
-'newuserlog-byemail' => 'password sent by e-mail',
-'newuserlog-create-entry' => 'New user account',
-'newuserlog-create2-entry' => 'created new account $1',
-'newuserlog-autocreate-entry' => 'Account created automatically',
+'newuserlogpage' => 'User creation log',
+'newuserlogpagetext' => 'This is a log of user creations.',
# Special:ListGroupRights
'listgrouprights' => 'User group rights',
@@ -2668,7 +2716,7 @@ There may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] a
'emailpagetext' => 'You can use the form below to send an e-mail message to this user.
The e-mail address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the e-mail, so the recipient will be able to reply directly to you.',
'usermailererror' => 'Mail object returned error:',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} e-mail from user "$1"',
'usermaildisabled' => 'User e-mail disabled',
'usermaildisabledtext' => 'You cannot send e-mail to other users on this wiki',
'noemailtitle' => 'No e-mail address',
@@ -2723,7 +2771,7 @@ Future changes to this page and its associated talk page will be listed there, a
'watchmethod-list' => 'checking watched pages for recent edits',
'watchlistcontains' => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
'iteminvalidname' => "Problem with item '$1', invalid name...",
-'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}.",
+'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
'wlshowlast' => 'Show last $1 hours $2 days $3',
'watchlist-options' => 'Watchlist options',
@@ -2781,7 +2829,6 @@ Feedback and further assistance:
'exbeforeblank' => 'content before blanking was: "$1"',
'exblank' => 'page was empty',
'delete-confirm' => 'Delete "$1"',
-'delete-backlink' => '↠$1', # only translate this message to other languages if you have to change it
'delete-legend' => 'Delete',
'historywarning' => "'''Warning:''' The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
'confirmdeletetext' => 'You are about to delete a page along with all of its history.
@@ -2790,8 +2837,6 @@ Please confirm that you intend to do this, that you understand the consequences,
'actionfailed' => 'Action failed',
'deletedtext' => '"$1" has been deleted.
See $2 for a record of recent deletions.',
-'deletedarticle' => 'deleted "[[$1]]"',
-'suppressedarticle' => 'suppressed "[[$1]]"',
'dellogpage' => 'Deletion log',
'dellogpagetext' => 'Below is a list of the most recent deletions.',
'deletionlog' => 'deletion log',
@@ -2842,15 +2887,17 @@ See the [[Special:ProtectedPages|protected pages list]] for the list of currentl
'unprotectedarticle' => 'removed protection from "[[$1]]"',
'movedarticleprotection' => 'moved protection settings from "[[$2]]" to "[[$1]]"',
'protect-title' => 'Change protection level for "$1"',
+'protect-title-notallowed' => 'View protection level of "$1"',
'prot_1movedto2' => '[[$1]] moved to [[$2]]',
-'protect-backlink' => '↠$1', # only translate this message to other languages if you have to change it
+'protect-badnamespace-title' => 'Non-protectable namespace',
+'protect-badnamespace-text' => 'Pages in this namespace cannot be protected.',
'protect-legend' => 'Confirm protection',
'protectcomment' => 'Reason:',
'protectexpiry' => 'Expires:',
'protect_expiry_invalid' => 'Expiry time is invalid.',
'protect_expiry_old' => 'Expiry time is in the past.',
'protect-unchain-permissions' => 'Unlock further protect options',
-'protect-text' => "You may view and change the protection level here for the page '''$1'''.",
+'protect-text' => "Here you may view and change the protection level for the page '''$1'''.",
'protect-locked-blocked' => "You cannot change protection levels while blocked.
Here are the current settings for the page '''$1''':",
'protect-locked-dblock' => "Protection levels cannot be changed due to an active database lock.
@@ -2865,6 +2912,7 @@ You can change this page's protection level, but it will not affect the cascadin
'protect-level-sysop' => 'Administrators only',
'protect-summary-cascade' => 'cascading',
'protect-expiring' => 'expires $1 (UTC)',
+'protect-expiring-local' => 'expires $1',
'protect-expiry-indefinite' => 'indefinite',
'protect-cascade' => 'Protect pages included in this page (cascading protection)',
'protect-cantedit' => 'You cannot change the protection levels of this page, because you do not have permission to edit it.',
@@ -2925,7 +2973,6 @@ You may have a bad link, or the revision may have been restored or removed from
'undeletereset' => 'Reset',
'undeleteinvert' => 'Invert selection',
'undeletecomment' => 'Reason:',
-'undeletedarticle' => 'restored "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisions}} restored',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} restored',
@@ -2935,6 +2982,7 @@ someone else may have undeleted the page first.',
Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
'undelete-header' => 'See [[Special:Log/delete|the deletion log]] for recently deleted pages.',
+'undelete-search-title' => 'Search deleted pages',
'undelete-search-box' => 'Search deleted pages',
'undelete-search-prefix' => 'Show pages starting with:',
'undelete-search-submit' => 'Search',
@@ -2944,6 +2992,7 @@ Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions
'undelete-cleanup-error' => 'Error deleting unused archive file "$1".',
'undelete-missing-filearchive' => 'Unable to restore file archive ID $1 because it is not in the database.
It may have already been undeleted.',
+'undelete-error' => 'Error undeleting page',
'undelete-error-short' => 'Error undeleting file: $1',
'undelete-error-long' => 'Errors were encountered while undeleting the file:
@@ -2995,7 +3044,6 @@ The latest block log entry is provided below for reference:',
'whatlinkshere-title' => 'Pages that link to "$1"',
'whatlinkshere-summary' => '', # do not translate or duplicate this message to other languages
'whatlinkshere-page' => 'Page:',
-'whatlinkshere-backlink' => '↠$1', # only translate this message to other languages if you have to change it
'linkshere' => "The following pages link to '''[[:$1]]''':",
'nolinkshere' => "No pages link to '''[[:$1]]'''.",
'nolinkshere-ns' => "No pages link to '''[[:$1]]''' in the chosen namespace.",
@@ -3070,6 +3118,7 @@ See [[Special:BlockList|IP block list]] to review blocks.',
'blocklist-userblocks' => 'Hide account blocks',
'blocklist-tempblocks' => 'Hide temporary blocks',
'blocklist-addressblocks' => 'Hide single IP blocks',
+'blocklist-rangeblocks' => 'Hide range blocks',
'blocklist-timestamp' => 'Timestamp',
'blocklist-target' => 'Target',
'blocklist-expiry' => 'Expires',
@@ -3093,6 +3142,7 @@ See [[Special:BlockList|IP block list]] to review blocks.',
'unblocklink' => 'unblock',
'change-blocklink' => 'change block',
'contribslink' => 'contribs',
+'emaillink' => 'send e-mail',
'autoblocker' => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
The reason given for $1\'s block is: "$2"',
'blocklogpage' => 'Block log',
@@ -3223,9 +3273,6 @@ Please merge them manually.'''",
'movepage-page-moved' => 'The page $1 has been moved to $2.',
'movepage-page-unmoved' => 'The page $1 could not be moved to $2.',
'movepage-max-pages' => 'The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.',
-'1movedto2' => 'moved [[$1]] to [[$2]]',
-'1movedto2_redir' => 'moved [[$1]] to [[$2]] over redirect',
-'move-redirect-suppressed' => 'redirect suppressed',
'movelogpage' => 'Move log',
'movelogpagetext' => 'Below is a list of all page moves.',
'movesubpage' => '{{PLURAL:$1|Subpage|Subpages}}',
@@ -3238,7 +3285,7 @@ Please merge them manually.'''",
The destination page "[[:$1]]" already exists.
Do you want to delete it to make way for the move?',
'delete_and_move_confirm' => 'Yes, delete the page',
-'delete_and_move_reason' => 'Deleted to make way for move',
+'delete_and_move_reason' => 'Deleted to make way for move from "[[$1]]"',
'selfmove' => 'Source and destination titles are the same;
cannot move a page over itself.',
'immobile-source-namespace' => 'Cannot move pages in namespace "$1"',
@@ -3269,9 +3316,11 @@ This can be imported into another wiki using MediaWiki via the [[Special:Import|
To export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.
In the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Export all pages',
'exportcuronly' => 'Include only the current revision, not the full history',
'exportnohistory' => "----
'''Note:''' Exporting the full history of pages through this form has been disabled due to performance reasons.",
+'exportlistauthors' => 'Include a full list of contributors for each page',
'export-submit' => 'Export',
'export-addcattext' => 'Add pages from category:',
'export-addcat' => 'Add',
@@ -3304,6 +3353,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'thumbnail_error' => 'Error creating thumbnail: $1',
'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',
+'thumbnail-dest-create' => 'Unable to save thumbnail to destination',
'thumbnail_invalid_params' => 'Invalid thumbnail parameters',
'thumbnail_dest_directory' => 'Unable to create destination directory',
'thumbnail_image-type' => 'Image type not supported',
@@ -3352,6 +3403,11 @@ A temporary folder is missing.',
'import-token-mismatch' => 'Loss of session data.
Please try again.',
'import-invalid-interwiki' => 'Cannot import from the specified wiki.',
+'import-error-edit' => 'Page "$1" is not imported because you are not allowed to edit it.',
+'import-error-create' => 'Page "$1" is not imported because you are not allowed to create it.',
+'import-error-interwiki' => 'Page "$1" is not imported because its name is reserved for external linking (interwiki).',
+'import-error-special' => 'Page "$1" is not imported because it belongs to a special namespace that does not allow pages.',
+'import-error-invalid' => 'Page "$1" is not imported because its name is invalid.',
# Import log
'importlogpage' => 'Import log',
@@ -3361,141 +3417,158 @@ Please try again.',
'import-logentry-interwiki' => 'transwikied $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revision|revisions}} from $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript testing',
+'javascripttest-backlink' => '< $1', # do not translate or duplicate this message to other languages
+'javascripttest-disabled' => 'This function is disabled.',
+'javascripttest-title' => 'Running $1 tests',
+'javascripttest-pagetext-noframework' => 'This page is reserved for running JavaScript tests.',
+'javascripttest-pagetext-unknownframework' => 'Unknown testing framework "$1".',
+'javascripttest-pagetext-frameworks' => 'Please choose one of the following testing frameworks: $1',
+'javascripttest-pagetext-skins' => 'Choose a skin to run the tests with:',
+'javascripttest-qunit-name' => 'QUnit', # do not translate or duplicate this message to other languages
+'javascripttest-qunit-intro' => 'See [$1 testing documentation] on mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
+
# Keyboard access keys for power users
-'accesskey-pt-userpage' => '.', # do not translate or duplicate this message to other languages
-'accesskey-pt-anonuserpage' => '.', # do not translate or duplicate this message to other languages
-'accesskey-pt-mytalk' => 'n', # do not translate or duplicate this message to other languages
-'accesskey-pt-anontalk' => 'n', # do not translate or duplicate this message to other languages
-'accesskey-pt-preferences' => '', # do not translate or duplicate this message to other languages
-'accesskey-pt-watchlist' => 'l', # do not translate or duplicate this message to other languages
-'accesskey-pt-mycontris' => 'y', # do not translate or duplicate this message to other languages
-'accesskey-pt-login' => 'o', # do not translate or duplicate this message to other languages
-'accesskey-pt-anonlogin' => 'o', # do not translate or duplicate this message to other languages
-'accesskey-pt-logout' => '', # do not translate or duplicate this message to other languages
-'accesskey-ca-talk' => 't', # do not translate or duplicate this message to other languages
-'accesskey-ca-edit' => 'e', # do not translate or duplicate this message to other languages
-'accesskey-ca-addsection' => '+', # do not translate or duplicate this message to other languages
-'accesskey-ca-viewsource' => 'e', # do not translate or duplicate this message to other languages
-'accesskey-ca-history' => 'h', # do not translate or duplicate this message to other languages
-'accesskey-ca-protect' => '=', # do not translate or duplicate this message to other languages
-'accesskey-ca-unprotect' => '=', # do not translate or duplicate this message to other languages
-'accesskey-ca-delete' => 'd', # do not translate or duplicate this message to other languages
-'accesskey-ca-undelete' => 'd', # do not translate or duplicate this message to other languages
-'accesskey-ca-move' => 'm', # do not translate or duplicate this message to other languages
-'accesskey-ca-watch' => 'w', # do not translate or duplicate this message to other languages
-'accesskey-ca-unwatch' => 'w', # do not translate or duplicate this message to other languages
-'accesskey-search' => 'f', # do not translate or duplicate this message to other languages
-'accesskey-search-go' => '', # do not translate or duplicate this message to other languages
-'accesskey-search-fulltext' => '', # do not translate or duplicate this message to other languages
-'accesskey-p-logo' => '', # do not translate or duplicate this message to other languages
-'accesskey-n-mainpage' => 'z', # do not translate or duplicate this message to other languages
-'accesskey-n-mainpage-description' => 'z', # do not translate or duplicate this message to other languages
-'accesskey-n-portal' => '', # do not translate or duplicate this message to other languages
-'accesskey-n-currentevents' => '', # do not translate or duplicate this message to other languages
-'accesskey-n-recentchanges' => 'r', # do not translate or duplicate this message to other languages
-'accesskey-n-randompage' => 'x', # do not translate or duplicate this message to other languages
-'accesskey-n-help' => '', # do not translate or duplicate this message to other languages
-'accesskey-t-whatlinkshere' => 'j', # do not translate or duplicate this message to other languages
-'accesskey-t-recentchangeslinked' => 'k', # do not translate or duplicate this message to other languages
-'accesskey-feed-rss' => '', # do not translate or duplicate this message to other languages
-'accesskey-feed-atom' => '', # do not translate or duplicate this message to other languages
-'accesskey-t-contributions' => '', # do not translate or duplicate this message to other languages
-'accesskey-t-emailuser' => '', # do not translate or duplicate this message to other languages
-'accesskey-t-permalink' => '', # do not translate or duplicate this message to other languages
-'accesskey-t-print' => 'p', # do not translate or duplicate this message to other languages
-'accesskey-t-upload' => 'u', # do not translate or duplicate this message to other languages
-'accesskey-t-specialpages' => 'q', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-main' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-user' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-media' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-special' => '', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-project' => 'a', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-image' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-mediawiki' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-template' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-help' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-ca-nstab-category' => 'c', # do not translate or duplicate this message to other languages
-'accesskey-minoredit' => 'i', # do not translate or duplicate this message to other languages
-'accesskey-save' => 's', # do not translate or duplicate this message to other languages
-'accesskey-preview' => 'p', # do not translate or duplicate this message to other languages
-'accesskey-diff' => 'v', # do not translate or duplicate this message to other languages
-'accesskey-compareselectedversions' => 'v', # do not translate or duplicate this message to other languages
-'accesskey-watch' => 'w', # do not translate or duplicate this message to other languages
-'accesskey-upload' => 's', # do not translate or duplicate this message to other languages
-'accesskey-preferences-save' => 's', # do not translate or duplicate this message to other languages
-'accesskey-summary' => 'b', # do not translate or duplicate this message to other languages
-'accesskey-userrights-set' => 's', # do not translate or duplicate this message to other languages
-'accesskey-blockip-block' => 's', # do not translate or duplicate this message to other languages
-'accesskey-export' => 's', # do not translate or duplicate this message to other languages
-'accesskey-import' => 's', # do not translate or duplicate this message to other languages
+'accesskey-pt-userpage' => '.', # do not translate or duplicate this message to other languages
+'accesskey-pt-anonuserpage' => '.', # do not translate or duplicate this message to other languages
+'accesskey-pt-mytalk' => 'n', # do not translate or duplicate this message to other languages
+'accesskey-pt-anontalk' => 'n', # do not translate or duplicate this message to other languages
+'accesskey-pt-preferences' => '', # do not translate or duplicate this message to other languages
+'accesskey-pt-watchlist' => 'l', # do not translate or duplicate this message to other languages
+'accesskey-pt-mycontris' => 'y', # do not translate or duplicate this message to other languages
+'accesskey-pt-login' => 'o', # do not translate or duplicate this message to other languages
+'accesskey-pt-anonlogin' => 'o', # do not translate or duplicate this message to other languages
+'accesskey-pt-logout' => '', # do not translate or duplicate this message to other languages
+'accesskey-ca-talk' => 't', # do not translate or duplicate this message to other languages
+'accesskey-ca-edit' => 'e', # do not translate or duplicate this message to other languages
+'accesskey-ca-addsection' => '+', # do not translate or duplicate this message to other languages
+'accesskey-ca-viewsource' => 'e', # do not translate or duplicate this message to other languages
+'accesskey-ca-history' => 'h', # do not translate or duplicate this message to other languages
+'accesskey-ca-protect' => '=', # do not translate or duplicate this message to other languages
+'accesskey-ca-unprotect' => '=', # do not translate or duplicate this message to other languages
+'accesskey-ca-delete' => 'd', # do not translate or duplicate this message to other languages
+'accesskey-ca-undelete' => 'd', # do not translate or duplicate this message to other languages
+'accesskey-ca-move' => 'm', # do not translate or duplicate this message to other languages
+'accesskey-ca-watch' => 'w', # do not translate or duplicate this message to other languages
+'accesskey-ca-unwatch' => 'w', # do not translate or duplicate this message to other languages
+'accesskey-search' => 'f', # do not translate or duplicate this message to other languages
+'accesskey-search-go' => '', # do not translate or duplicate this message to other languages
+'accesskey-search-fulltext' => '', # do not translate or duplicate this message to other languages
+'accesskey-p-logo' => '', # do not translate or duplicate this message to other languages
+'accesskey-n-mainpage' => 'z', # do not translate or duplicate this message to other languages
+'accesskey-n-mainpage-description' => 'z', # do not translate or duplicate this message to other languages
+'accesskey-n-portal' => '', # do not translate or duplicate this message to other languages
+'accesskey-n-currentevents' => '', # do not translate or duplicate this message to other languages
+'accesskey-n-recentchanges' => 'r', # do not translate or duplicate this message to other languages
+'accesskey-n-randompage' => 'x', # do not translate or duplicate this message to other languages
+'accesskey-n-help' => '', # do not translate or duplicate this message to other languages
+'accesskey-t-whatlinkshere' => 'j', # do not translate or duplicate this message to other languages
+'accesskey-t-recentchangeslinked' => 'k', # do not translate or duplicate this message to other languages
+'accesskey-feed-rss' => '', # do not translate or duplicate this message to other languages
+'accesskey-feed-atom' => '', # do not translate or duplicate this message to other languages
+'accesskey-t-contributions' => '', # do not translate or duplicate this message to other languages
+'accesskey-t-emailuser' => '', # do not translate or duplicate this message to other languages
+'accesskey-t-permalink' => '', # do not translate or duplicate this message to other languages
+'accesskey-t-print' => 'p', # do not translate or duplicate this message to other languages
+'accesskey-t-upload' => 'u', # do not translate or duplicate this message to other languages
+'accesskey-t-specialpages' => 'q', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-main' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-user' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-media' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-special' => '', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-project' => 'a', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-image' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-mediawiki' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-template' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-help' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-ca-nstab-category' => 'c', # do not translate or duplicate this message to other languages
+'accesskey-minoredit' => 'i', # do not translate or duplicate this message to other languages
+'accesskey-save' => 's', # do not translate or duplicate this message to other languages
+'accesskey-preview' => 'p', # do not translate or duplicate this message to other languages
+'accesskey-diff' => 'v', # do not translate or duplicate this message to other languages
+'accesskey-compareselectedversions' => 'v', # do not translate or duplicate this message to other languages
+'accesskey-watch' => 'w', # do not translate or duplicate this message to other languages
+'accesskey-upload' => 's', # do not translate or duplicate this message to other languages
+'accesskey-preferences-save' => 's', # do not translate or duplicate this message to other languages
+'accesskey-summary' => 'b', # do not translate or duplicate this message to other languages
+'accesskey-userrights-set' => 's', # do not translate or duplicate this message to other languages
+'accesskey-blockip-block' => 's', # do not translate or duplicate this message to other languages
+'accesskey-export' => 's', # do not translate or duplicate this message to other languages
+'accesskey-import' => 's', # do not translate or duplicate this message to other languages
+'accesskey-watchlistedit-normal-submit' => 's', # do not translate or duplicate this message to other languages
+'accesskey-watchlistedit-raw-submit' => 's', # do not translate or duplicate this message to other languages
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Your user page',
-'tooltip-pt-anonuserpage' => 'The user page for the IP address you are editing as',
-'tooltip-pt-mytalk' => 'Your talk page',
-'tooltip-pt-anontalk' => 'Discussion about edits from this IP address',
-'tooltip-pt-preferences' => 'Your preferences',
-'tooltip-pt-watchlist' => 'A list of pages you are monitoring for changes',
-'tooltip-pt-mycontris' => 'A list of your contributions',
-'tooltip-pt-login' => 'You are encouraged to log in; however, it is not mandatory',
-'tooltip-pt-anonlogin' => 'You are encouraged to log in; however, it is not mandatory',
-'tooltip-pt-logout' => 'Log out',
-'tooltip-ca-talk' => 'Discussion about the content page',
-'tooltip-ca-edit' => 'You can edit this page. Please use the preview button before saving',
-'tooltip-ca-addsection' => 'Start a new section',
-'tooltip-ca-viewsource' => 'This page is protected.
+'tooltip-pt-userpage' => 'Your user page',
+'tooltip-pt-anonuserpage' => 'The user page for the IP address you are editing as',
+'tooltip-pt-mytalk' => 'Your talk page',
+'tooltip-pt-anontalk' => 'Discussion about edits from this IP address',
+'tooltip-pt-preferences' => 'Your preferences',
+'tooltip-pt-watchlist' => 'A list of pages you are monitoring for changes',
+'tooltip-pt-mycontris' => 'A list of your contributions',
+'tooltip-pt-login' => 'You are encouraged to log in; however, it is not mandatory',
+'tooltip-pt-anonlogin' => 'You are encouraged to log in; however, it is not mandatory',
+'tooltip-pt-logout' => 'Log out',
+'tooltip-ca-talk' => 'Discussion about the content page',
+'tooltip-ca-edit' => 'You can edit this page. Please use the preview button before saving',
+'tooltip-ca-addsection' => 'Start a new section',
+'tooltip-ca-viewsource' => 'This page is protected.
You can view its source',
-'tooltip-ca-history' => 'Past revisions of this page',
-'tooltip-ca-protect' => 'Protect this page',
-'tooltip-ca-unprotect' => 'Change protection of this page',
-'tooltip-ca-delete' => 'Delete this page',
-'tooltip-ca-undelete' => 'Restore the edits done to this page before it was deleted',
-'tooltip-ca-move' => 'Move this page',
-'tooltip-ca-watch' => 'Add this page to your watchlist',
-'tooltip-ca-unwatch' => 'Remove this page from your watchlist',
-'tooltip-search' => 'Search {{SITENAME}}',
-'tooltip-search-go' => 'Go to a page with this exact name if exists',
-'tooltip-search-fulltext' => 'Search the pages for this text',
-'tooltip-p-logo' => 'Visit the main page',
-'tooltip-n-mainpage' => 'Visit the main page',
-'tooltip-n-mainpage-description' => 'Visit the main page',
-'tooltip-n-portal' => 'About the project, what you can do, where to find things',
-'tooltip-n-currentevents' => 'Find background information on current events',
-'tooltip-n-recentchanges' => 'A list of recent changes in the wiki',
-'tooltip-n-randompage' => 'Load a random page',
-'tooltip-n-help' => 'The place to find out',
-'tooltip-t-whatlinkshere' => 'A list of all wiki pages that link here',
-'tooltip-t-recentchangeslinked' => 'Recent changes in pages linked from this page',
-'tooltip-feed-rss' => 'RSS feed for this page',
-'tooltip-feed-atom' => 'Atom feed for this page',
-'tooltip-t-contributions' => 'A list of contributions of this user',
-'tooltip-t-emailuser' => 'Send an e-mail to this user',
-'tooltip-t-upload' => 'Upload files',
-'tooltip-t-specialpages' => 'A list of all special pages',
-'tooltip-t-print' => 'Printable version of this page',
-'tooltip-t-permalink' => 'Permanent link to this revision of the page',
-'tooltip-ca-nstab-main' => 'View the content page',
-'tooltip-ca-nstab-user' => 'View the user page',
-'tooltip-ca-nstab-media' => 'View the media page',
-'tooltip-ca-nstab-special' => 'This is a special page, you cannot edit the page itself',
-'tooltip-ca-nstab-project' => 'View the project page',
-'tooltip-ca-nstab-image' => 'View the file page',
-'tooltip-ca-nstab-mediawiki' => 'View the system message',
-'tooltip-ca-nstab-template' => 'View the template',
-'tooltip-ca-nstab-help' => 'View the help page',
-'tooltip-ca-nstab-category' => 'View the category page',
-'tooltip-minoredit' => 'Mark this as a minor edit',
-'tooltip-save' => 'Save your changes',
-'tooltip-preview' => 'Preview your changes, please use this before saving!',
-'tooltip-diff' => 'Show which changes you made to the text',
-'tooltip-compareselectedversions' => 'See the differences between the two selected revisions of this page',
-'tooltip-watch' => 'Add this page to your watchlist',
-'tooltip-recreate' => 'Recreate the page even though it has been deleted',
-'tooltip-upload' => 'Start upload',
-'tooltip-rollback' => '"Rollback" reverts edit(s) to this page of the last contributor in one click',
-'tooltip-undo' => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
-'tooltip-preferences-save' => 'Save preferences',
-'tooltip-summary' => 'Enter a short summary',
+'tooltip-ca-history' => 'Past revisions of this page',
+'tooltip-ca-protect' => 'Protect this page',
+'tooltip-ca-unprotect' => 'Change protection of this page',
+'tooltip-ca-delete' => 'Delete this page',
+'tooltip-ca-undelete' => 'Restore the edits done to this page before it was deleted',
+'tooltip-ca-move' => 'Move this page',
+'tooltip-ca-watch' => 'Add this page to your watchlist',
+'tooltip-ca-unwatch' => 'Remove this page from your watchlist',
+'tooltip-search' => 'Search {{SITENAME}}',
+'tooltip-search-go' => 'Go to a page with this exact name if exists',
+'tooltip-search-fulltext' => 'Search the pages for this text',
+'tooltip-p-logo' => 'Visit the main page',
+'tooltip-n-mainpage' => 'Visit the main page',
+'tooltip-n-mainpage-description' => 'Visit the main page',
+'tooltip-n-portal' => 'About the project, what you can do, where to find things',
+'tooltip-n-currentevents' => 'Find background information on current events',
+'tooltip-n-recentchanges' => 'A list of recent changes in the wiki',
+'tooltip-n-randompage' => 'Load a random page',
+'tooltip-n-help' => 'The place to find out',
+'tooltip-t-whatlinkshere' => 'A list of all wiki pages that link here',
+'tooltip-t-recentchangeslinked' => 'Recent changes in pages linked from this page',
+'tooltip-feed-rss' => 'RSS feed for this page',
+'tooltip-feed-atom' => 'Atom feed for this page',
+'tooltip-t-contributions' => 'A list of contributions of this user',
+'tooltip-t-emailuser' => 'Send an e-mail to this user',
+'tooltip-t-upload' => 'Upload files',
+'tooltip-t-specialpages' => 'A list of all special pages',
+'tooltip-t-print' => 'Printable version of this page',
+'tooltip-t-permalink' => 'Permanent link to this revision of the page',
+'tooltip-ca-nstab-main' => 'View the content page',
+'tooltip-ca-nstab-user' => 'View the user page',
+'tooltip-ca-nstab-media' => 'View the media page',
+'tooltip-ca-nstab-special' => 'This is a special page, you cannot edit the page itself',
+'tooltip-ca-nstab-project' => 'View the project page',
+'tooltip-ca-nstab-image' => 'View the file page',
+'tooltip-ca-nstab-mediawiki' => 'View the system message',
+'tooltip-ca-nstab-template' => 'View the template',
+'tooltip-ca-nstab-help' => 'View the help page',
+'tooltip-ca-nstab-category' => 'View the category page',
+'tooltip-minoredit' => 'Mark this as a minor edit',
+'tooltip-save' => 'Save your changes',
+'tooltip-preview' => 'Preview your changes, please use this before saving!',
+'tooltip-diff' => 'Show which changes you made to the text',
+'tooltip-compareselectedversions' => 'See the differences between the two selected revisions of this page',
+'tooltip-watch' => 'Add this page to your watchlist',
+'tooltip-watchlistedit-normal-submit' => 'Remove titles',
+'tooltip-watchlistedit-raw-submit' => 'Update watchlist',
+'tooltip-recreate' => 'Recreate the page even though it has been deleted',
+'tooltip-upload' => 'Start upload',
+'tooltip-rollback' => '"Rollback" reverts edit(s) to this page of the last contributor in one click',
+'tooltip-undo' => '"Undo" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.',
+'tooltip-preferences-save' => 'Save preferences',
+'tooltip-summary' => 'Enter a short summary',
# Stylesheets
'common.css' => '/* CSS placed here will be applied to all skins */', # only translate this message to other languages if you have to change it
@@ -3595,9 +3668,6 @@ This is probably caused by a link to a blacklisted external site.',
# Patrol log
'patrol-log-page' => 'Patrol log',
'patrol-log-header' => 'This is a log of patrolled revisions.',
-'patrol-log-line' => 'marked $1 of $2 patrolled $3',
-'patrol-log-auto' => '(automatic)',
-'patrol-log-diff' => 'revision $1',
'log-show-hide-patrol' => '$1 patrol log',
# Image deletion
@@ -3625,11 +3695,11 @@ By executing it, your system may be compromised.",
'file-info' => 'file size: $1, MIME type: $2',
'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
'file-info-size-pages' => '$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}',
-'file-nohires' => '<small>No higher resolution available.</small>',
+'file-nohires' => 'No higher resolution available.',
'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
'show-big-image' => 'Full resolution',
-'show-big-image-preview' => '<small>Size of this preview: $1.</small>',
-'show-big-image-other' => '<small>Other resolutions: $1.</small>',
+'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',
'file-info-gif-looped' => 'looped',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
@@ -3651,10 +3721,15 @@ By executing it, your system may be compromised.",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3', # only translate this message to other languages if you have to change it
-'seconds-abbrev' => 's', # only translate this message to other languages if you have to change it
-'minutes-abbrev' => 'm', # only translate this message to other languages if you have to change it
-'hours-abbrev' => 'h', # only translate this message to other languages if you have to change it
-'days-abbrev' => 'd', # only translate this message to other languages if you have to change it
+'seconds-abbrev' => '$1s', # only translate this message to other languages if you have to change it
+'minutes-abbrev' => '$1m', # only translate this message to other languages if you have to change it
+'hours-abbrev' => '$1h', # only translate this message to other languages if you have to change it
+'days-abbrev' => '$1d', # only translate this message to other languages if you have to change it
+'seconds' => '{{PLURAL:$1|$1 second|$1 seconds}}',
+'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
+'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
+'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'ago' => '$1 ago',
# Bad image list
'bad_image_list' => 'The format is as follows:
@@ -3713,6 +3788,11 @@ Variants for Chinese language
'variantname-ike-latn' => 'ike-Latn', # only translate this message to other languages if you have to change it
'variantname-iu' => 'iu', # only translate this message to other languages if you have to change it
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-Tfng', # only translate this message to other languages if you have to change it
+'variantname-shi-latn' => 'shi-Latn', # only translate this message to other languages if you have to change it
+'variantname-shi' => 'shi', # only translate this message to other languages if you have to change it
+
# Metadata
'metadata' => 'Metadata',
'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.
@@ -4256,15 +4336,6 @@ This confirmation code will expire at $4.',
'scarytranscludefailed' => '[Template fetch failed for $1]',
'scarytranscludetoolong' => '[URL is too long]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks for this page:<br />
-$1',
-'trackback' => '; $4 $5: [$2 $1]', # only translate this message to other languages if you have to change it
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>', # only translate this message to other languages if you have to change it
-'trackbackremove' => '([$1 Delete])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'The trackback was successfully deleted.',
-
# Delete conflict
'deletedwhileediting' => "'''Warning''': This page was deleted after you started editing!",
'confirmrecreate' => "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:
@@ -4346,10 +4417,26 @@ Please confirm that you really want to recreate this page.",
*207.200.112.0/21', # do not translate or duplicate this message to other languages
# Size units
-'size-bytes' => '$1 B', # only translate this message to other languages if you have to change it
-'size-kilobytes' => '$1 KB', # only translate this message to other languages if you have to change it
-'size-megabytes' => '$1 MB', # only translate this message to other languages if you have to change it
-'size-gigabytes' => '$1 GB', # only translate this message to other languages if you have to change it
+'size-bytes' => '$1 B', # only translate this message to other languages if you have to change it
+'size-kilobytes' => '$1 KB', # only translate this message to other languages if you have to change it
+'size-megabytes' => '$1 MB', # only translate this message to other languages if you have to change it
+'size-gigabytes' => '$1 GB', # only translate this message to other languages if you have to change it
+'size-terabytes' => '$1 TB', # only translate this message to other languages if you have to change it
+'size-petabytes' => '$1 PB', # only translate this message to other languages if you have to change it
+'size-exabytes' => '$1 EB', # only translate this message to other languages if you have to change it
+'size-zetabytes' => '$1 ZB', # only translate this message to other languages if you have to change it
+'size-yottabytes' => '$1 YB', # only translate this message to other languages if you have to change it
+
+# Bitrate units
+'bitrate-bits' => '$1bps', # only translate this message to other languages if you have to change it
+'bitrate-kilobits' => '$1kbps', # only translate this message to other languages if you have to change it
+'bitrate-megabits' => '$1Mbps', # only translate this message to other languages if you have to change it
+'bitrate-gigabits' => '$1Gbps', # only translate this message to other languages if you have to change it
+'bitrate-terabits' => '$1Tbps', # only translate this message to other languages if you have to change it
+'bitrate-petabits' => '$1Pbps', # only translate this message to other languages if you have to change it
+'bitrate-exabits' => '$1Ebps', # only translate this message to other languages if you have to change it
+'bitrate-zetabits' => '$1Zbps', # only translate this message to other languages if you have to change it
+'bitrate-yottabits' => '$1Ybps', # only translate this message to other languages if you have to change it
# Live preview
'livepreview-loading' => 'Loading...',
@@ -4449,7 +4536,7 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
'hebrew-calendar-m12-gen' => 'Elul', # only translate this message to other languages if you have to change it
# Signatures
-'signature' => '[[{{ns:user}}:$1|$2]]', # do not translate or duplicate this message to other languages
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])',
'signature-anon' => '[[{{#special:Contributions}}/$1|$2]]', # do not translate or duplicate this message to other languages
'timezone-utc' => 'UTC', # only translate this message to other languages if you have to change it
@@ -4511,8 +4598,7 @@ Images are shown in full resolution, other file types are started with their ass
'specialpages-summary' => '', # do not translate or duplicate this message to other languages
'specialpages-note' => '----
* Normal special pages.
-* <span class="mw-specialpagerestricted">Restricted special pages.</span>
-* <span class="mw-specialpagecached">Cached special pages (might be obsolete).</span>',
+* <span class="mw-specialpagerestricted">Restricted special pages.</span>',
'specialpages-group-maintenance' => 'Maintenance reports',
'specialpages-group-other' => 'Other special pages',
'specialpages-group-login' => 'Login / sign up',
@@ -4554,13 +4640,16 @@ Images are shown in full resolution, other file types are started with their ass
'tags-hitcount' => '$1 {{PLURAL:$1|change|changes}}',
# Special:ComparePages
-'comparepages' => 'Compare pages',
-'compare-selector' => 'Compare page revisions',
-'compare-page1' => 'Page 1',
-'compare-page2' => 'Page 2',
-'compare-rev1' => 'Revision 1',
-'compare-rev2' => 'Revision 2',
-'compare-submit' => 'Compare',
+'comparepages' => 'Compare pages',
+'compare-selector' => 'Compare page revisions',
+'compare-page1' => 'Page 1',
+'compare-page2' => 'Page 2',
+'compare-rev1' => 'Revision 1',
+'compare-rev2' => 'Revision 2',
+'compare-submit' => 'Compare',
+'compare-invalid-title' => 'The title you specified is invalid.',
+'compare-title-not-exists' => 'The title you specified does not exist.',
+'compare-revision-not-exists' => 'The revision you specified does not exist.',
# Database error messages
'dberr-header' => 'This wiki has a problem',
@@ -4588,4 +4677,90 @@ This site is experiencing technical difficulties.',
'sqlite-has-fts' => '$1 with full-text search support',
'sqlite-no-fts' => '$1 without full-text search support',
+# New logging system
+'logentry-delete-delete' => '$1 deleted page $3',
+'logentry-delete-restore' => '$1 restored page $3',
+'logentry-delete-event' => '$1 changed visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
+'logentry-delete-revision' => '$1 changed visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
+'logentry-delete-event-legacy' => '$1 changed visibility of log events on $3',
+'logentry-delete-revision-legacy' => '$1 changed visibility of revisions on page $3',
+'logentry-suppress-delete' => '$1 suppressed page $3',
+'logentry-suppress-event' => '$1 secretly changed visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
+'logentry-suppress-revision' => '$1 secretly changed visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
+'logentry-suppress-event-legacy' => '$1 secretly changed visibility of log events on $3',
+'logentry-suppress-revision-legacy' => '$1 secretly changed visibility of revisions on page $3',
+'revdelete-content-hid' => 'content hidden',
+'revdelete-summary-hid' => 'edit summary hidden',
+'revdelete-uname-hid' => 'username hidden',
+'revdelete-content-unhid' => 'content unhidden',
+'revdelete-summary-unhid' => 'edit summary unhidden',
+'revdelete-uname-unhid' => 'username unhidden',
+'revdelete-restricted' => 'applied restrictions to administrators',
+'revdelete-unrestricted' => 'removed restrictions for administrators',
+'logentry-move-move' => '$1 moved page $3 to $4',
+'logentry-move-move-noredirect' => '$1 moved page $3 to $4 without leaving a redirect',
+'logentry-move-move_redir' => '$1 moved page $3 to $4 over redirect',
+'logentry-move-move_redir-noredirect' => '$1 moved page $3 to $4 over a redirect without leaving a redirect',
+'logentry-patrol-patrol' => '$1 marked revision $4 of page $3 patrolled',
+'logentry-patrol-patrol-auto' => '$1 automatically marked revision $4 of page $3 patrolled',
+'logentry-newusers-newusers' => '$1 created a user account',
+'logentry-newusers-create' => '$1 created a user account',
+'logentry-newusers-create2' => '$1 created a user account $3',
+'logentry-newusers-autocreate' => 'Account $1 was created automatically',
+'newuserlog-byemail' => 'password sent by e-mail',
+
+# Feedback
+'feedback-bugornote' => 'If you are ready to describe a technical problem in detail please [$1 report a bug].
+Otherwise, you can use the easy form below. Your comment will be added to the page "[$3 $2]", along with your username and what browser you are using.',
+'feedback-subject' => 'Subject:',
+'feedback-message' => 'Message:',
+'feedback-cancel' => 'Cancel',
+'feedback-submit' => 'Submit Feedback',
+'feedback-adding' => 'Adding feedback to page...',
+'feedback-error1' => 'Error: Unrecognized result from API',
+'feedback-error2' => 'Error: Edit failed',
+'feedback-error3' => 'Error: No response from API',
+'feedback-thanks' => 'Thanks! Your feedback has been posted to the page "[$2 $1]".',
+'feedback-close' => 'Done',
+'feedback-bugcheck' => 'Great! Just check that it is not already one of the [$1 known bugs].',
+'feedback-bugnew' => 'I checked. Report a new bug',
+
+# API errors
+'api-error-badaccess-groups' => 'You are not permitted to upload files to this wiki.',
+'api-error-badtoken' => 'Internal error: Bad token.',
+'api-error-copyuploaddisabled' => 'Uploading by URL is disabled on this server.',
+'api-error-duplicate' => 'There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.',
+'api-error-duplicate-archive' => 'There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.',
+'api-error-duplicate-archive-popup-title' => 'Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.',
+'api-error-duplicate-popup-title' => 'Duplicate {{PLURAL:$1|file|files}}.',
+'api-error-empty-file' => 'The file you submitted was empty.',
+'api-error-emptypage' => 'Creating new, empty pages is not allowed.',
+'api-error-fetchfileerror' => 'Internal error: Something went wrong while fetching the file.',
+'api-error-file-too-large' => 'The file you submitted was too large.',
+'api-error-filename-tooshort' => 'The filename is too short.',
+'api-error-filetype-banned' => 'This type of file is banned.',
+'api-error-filetype-missing' => 'The filename is missing an extension.',
+'api-error-hookaborted' => 'The modification you tried to make was aborted by an extension.',
+'api-error-http' => 'Internal error: Unable to connect to server.',
+'api-error-illegal-filename' => 'The filename is not allowed.',
+'api-error-internal-error' => 'Internal error: Something went wrong with processing your upload on the wiki.',
+'api-error-invalid-file-key' => 'Internal error: File was not found in temporary storage.',
+'api-error-missingparam' => 'Internal error: Missing parameters on request.',
+'api-error-missingresult' => 'Internal error: Could not determine if the copy succeeded.',
+'api-error-mustbeloggedin' => 'You must be logged in to upload files.',
+'api-error-mustbeposted' => 'Internal error: Request requires HTTP POST.',
+'api-error-noimageinfo' => 'The upload succeeded, but the server did not give us any information about the file.',
+'api-error-nomodule' => 'Internal error: No upload module set.',
+'api-error-ok-but-empty' => 'Internal error: No response from server.',
+'api-error-overwrite' => 'Overwriting an existing file is not allowed.',
+'api-error-stashfailed' => 'Internal error: Server failed to store temporary file.',
+'api-error-timeout' => 'The server did not respond within the expected time.',
+'api-error-unclassified' => 'An unknown error occurred.',
+'api-error-unknown-code' => 'Unknown error: "$1".',
+'api-error-unknown-error' => 'Internal error: Something went wrong when trying to upload your file.',
+'api-error-unknown-warning' => 'Unknown warning: "$1".',
+'api-error-unknownerror' => 'Unknown error: "$1".',
+'api-error-uploaddisabled' => 'Uploading is disabled on this wiki.',
+'api-error-verification-error' => 'This file might be corrupt, or have the wrong extension.',
+
);
diff --git a/languages/messages/MessagesEn_ca.php b/languages/messages/MessagesEn_ca.php
new file mode 100644
index 00000000..af3c5ae5
--- /dev/null
+++ b/languages/messages/MessagesEn_ca.php
@@ -0,0 +1,61 @@
+<?php
+/** Canadian English (Canadian English)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Dantman
+ * @author Techman224
+ */
+
+$messages = array(
+# 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.',
+
+# Edit tokens
+'sessionfailure' => 'There seems to be a problem with your login session;
+this action has been cancelled as a precaution against session hijacking.
+Go back to the previous page, reload that page and then try again.',
+
+# EXIF tags
+'exif-ycbcrcoefficients' => 'Colour space transformation matrix coefficients',
+'exif-colorspace' => 'Colour space',
+'exif-licenseurl' => 'URL for copyright licence',
+
+'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',
+'exif-sensingmethod-5' => 'Colour sequential area sensor',
+'exif-sensingmethod-8' => 'Colour sequential linear sensor',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|metre|metres}} above sea level',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|metre|metres}} below sea level',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'Kilometres per hour',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilometres',
+
+'exif-ycbcrpositioning-1' => 'Centred',
+
+# E-mail address confirmation
+'confirmemail_invalidated' => 'E-mail address confirmation cancelled',
+
+# Special:Version
+'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.
+
+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 [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
+
+);
diff --git a/languages/messages/MessagesEn_gb.php b/languages/messages/MessagesEn_gb.php
index 83f02529..3928e702 100644
--- a/languages/messages/MessagesEn_gb.php
+++ b/languages/messages/MessagesEn_gb.php
@@ -28,47 +28,14 @@ $messages = array(
'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
-'category_header' => 'Pages in category ‘$1’',
-'category-media-header' => 'Media in category ‘$1’',
-
-'retrievedfrom' => 'Retrieved from ‘$1’',
-'page-rss-feed' => '‘$1’ RSS feed',
-'page-atom-feed' => '‘$1’ Atom feed',
# General errors
-'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>.’
-Database 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.’
-Database returned error ‘$3: $4’',
-'missing-article' => 'The database did not find the text of a page that it should have found, named ‘$1’ $2.
+'missing-article' => 'The database did not find the text of a page that it should have found, named ‘$1’ $2.
This is usually caused by following an outdated diff or history link to a page that has been deleted.
If this is not the case, you may have found a bug in the software.
Please report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.',
-'fileappenderrorread' => 'Could not read ‘$1’ during append.',
-'fileappenderror' => 'Could not append ‘$1’ to ‘$2.’',
-'filecopyerror' => 'Could not copy file ‘$1’ to ‘$2.’',
-'filerenameerror' => 'Could not rename file ‘$1’ to ‘$2.’',
-'filedeleteerror' => 'Could not delete file ‘$1’.',
-'directorycreateerror' => 'Could not create directory ‘$1’.',
-'filenotfound' => 'Could not find file ‘$1’.',
-'fileexistserror' => 'Unable to write to file ‘$1’: file exists',
-'unexpected' => 'Unexpected value: ‘$1’=‘$2’.',
-'cannotdelete' => 'The page or file ‘$1’ could not be deleted.
-It may have already been deleted by someone else.',
-'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',
# Miscellaneous special pages
'uncategorizedpages' => 'Uncategorised pages',
diff --git a/languages/messages/MessagesEnRTL.php b/languages/messages/MessagesEn_rtl.php
index bf408d1d..bf408d1d 100644
--- a/languages/messages/MessagesEnRTL.php
+++ b/languages/messages/MessagesEn_rtl.php
diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php
index 410fca62..8825bddf 100644
--- a/languages/messages/MessagesEo.php
+++ b/languages/messages/MessagesEo.php
@@ -26,6 +26,7 @@
* @author Pedroca cerebral
* @author Petrus Adamus
* @author Smeira
+ * @author ThomasPusch
* @author Tlustulimu
* @author Urhixidur
* @author Yekrats
@@ -81,6 +82,7 @@ $specialPageAliases = array(
'Booksources' => array( 'Citoj_el_libroj' ),
'BrokenRedirects' => array( 'Rompitaj_alidirektiloj' ),
'Categories' => array( 'Kategorioj' ),
+ 'ChangeEmail' => array( 'ÅœanÄi_retpoÅton' ),
'ChangePassword' => array( 'ÅœanÄi_pasvorton' ),
'ComparePages' => array( 'Komparu_paÄojn' ),
'Confirmemail' => array( 'Konfirmi_per_retpoÅto' ),
@@ -90,6 +92,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Forigitaj_kontribuoj' ),
'Disambiguations' => array( 'Apartigiloj' ),
'DoubleRedirects' => array( 'Duoblaj_alidirektiloj' ),
+ 'EditWatchlist' => array( 'Redakti_atenatron' ),
'Emailuser' => array( 'RetpoÅti_uzanton' ),
'Export' => array( 'Eksporti' ),
'Fewestrevisions' => array( 'Plej_malmultaj_revizioj' ),
@@ -124,6 +127,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'Miaj_alÅutaĵoj' ),
'Newimages' => array( 'Novaj_bildoj' ),
'Newpages' => array( 'Novaj_paÄoj' ),
+ 'PasswordReset' => array( 'ÅœanÄo_de_pasvorto' ),
'PermanentLink' => array( 'DaÅ­ra_ligilo' ),
'Popularpages' => array( 'Popularaj_paÄoj' ),
'Preferences' => array( 'Preferoj' ),
@@ -167,126 +171,129 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
- 'notoc' => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
- 'toc' => array( '0', '__I__', '__T__', '__INDEKSO__', '__TOC__' ),
- 'noeditsection' => array( '0', '__SRS__', '__NES__', '__SENREDAKTISEKCIOJN__', '__SENREDAKTISEKCION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SENTITOLO__', '__NH__', '__ST__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'NUNAMONATO', 'NUNAMONATO2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'NUNAMONATO1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NUNAMONATNOMO', 'NUNAMONATONOMO', 'NUNAMONATANOMO', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NUNAMONATNOMOGEN', 'NUNAMONATONOMOGEN', 'NUNAMONATANOMOGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'NUNAMONATNOMOMAL', 'NUNAMONATONOMOMAL', 'NUNAMONATANOMOMAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'NUNATAGO', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'NUNATAGO2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NUNATAGNOMO', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'NUNAJARO', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'NUNATEMPO', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'NUNAHORO', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKAMONATO', 'LOKAMONATO2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKAMONATO1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKAMONATNOMO', 'LOKAMONATONOMO', 'LOKAMONATANOMO', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKAMONATNOMOGEN', 'LOKAMONATONOMOGEN', 'LOKAMONATANOMOGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LOKAMONATNOMOMAL', 'LOKAMONATONOMOMAL', 'LOKAMONATANOMOMAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKATAGO', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKATAGO2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKATAGNOMO', 'LOKATAGONOMO', 'LOKATAGANOMO', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKAJARO', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKATEMPO', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKAHORO', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NOMBRODEPAÄœOJ', 'NOMBRODEPAGXOJ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NOMBRODEARTIKOLOJ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NOMBRODEDOSIEROJ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NOMBRODEUZANTOJ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NOMBRODEAKTIVAJUZANTOJ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NOMBRODEREDAKTOJ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NOMBRODEVIZITOJ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'PAÄœONOMO', 'PAGXONOMO', 'PAÄœNOMO', 'PAGXNOMO', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'PAÄœONOMOO', 'PAGXONOMOO', 'PAÄœNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NOMSPACO', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
- 'fullpagename' => array( '1', 'TUTAPAÄœONOMO', 'TUTAPAGXONOMO', 'TUTAPAÄœNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'TUTAPAÄœONOMOO', 'TUTAPAGXONOMOO', 'TUTAPAÄœNOMOO', 'TUTAPAGXNOMOO', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'SUBPAÄœONOMO', 'SUBPAGXONOMO', 'SUBPAÄœNOMO', 'SUBPAGXNOMO', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'SUBPAÄœONOMOO', 'SUBPAGXONOMOO', 'SUBPAÄœNOMOO', 'SUBPAGXNOMOO', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'PATRAPAÄœONOMO', 'PATRAPAGXONOMO', 'PATRAPAÄœNOMO', 'PATRAPAGXNOMO', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'PATRAPAÄœONOMOO', 'PATRAPAGXONOMOO', 'PATRAPAÄœNOMOO', 'PATRAPAGXNOMOO', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'DISKUTPAÄœONOMO', 'DISKUTPAGXONOMO', 'DISKUTPAÄœNOMO', 'DISKUTPAGXNOMO', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'DISKUTPAÄœONOMOO', 'DISKUTPAGXONOMOO', 'DISKUTPAÄœNOMOO', 'DISKUTPAGXNOMOO', 'TALKPAGENAMEE' ),
- 'msg' => array( '0', 'MSĜ:', 'MSGX:', 'MSG:' ),
- 'subst' => array( '0', 'ANSTAT:', 'SUBST:' ),
- 'safesubst' => array( '0', 'SEKURANSTAT:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'NVMSĜ:', 'NVMSGX:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'eta', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'eta=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'dekstra', 'dekstre', 'right' ),
- 'img_left' => array( '1', 'maldekstra', 'maldekstre', 'left' ),
- 'img_none' => array( '1', 'nenio', 'none' ),
- 'img_width' => array( '1', '$1ra', '$1px' ),
- 'img_center' => array( '1', 'centra', 'meza', 'center', 'centre' ),
- 'img_framed' => array( '1', 'kadro', 'enkadrita', 'enkadrite', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'senkadra', 'frameless' ),
- 'img_page' => array( '1', 'paÄo=$1', 'paÄo $1', 'pagxo=$1', 'pagxo $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'kadra', 'kadrita', 'kadrigita', 'kadrite', 'kadrigite', 'border' ),
- 'img_sub' => array( '1', 'sube', 'sub' ),
- 'img_super' => array( '1', 'supre', 'super', 'sup' ),
- 'img_top' => array( '1', 'alte', 'top' ),
- 'img_text_top' => array( '1', 'tekst-alte', 'text-top' ),
- 'img_middle' => array( '1', 'meze', 'middle' ),
- 'img_bottom' => array( '1', 'malalte', 'bottom' ),
- 'img_text_bottom' => array( '1', 'suba-teksto', 'text-bottom' ),
- 'img_link' => array( '1', 'ligilo=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'alternative=$1', 'alt=$1' ),
- 'int' => array( '0', 'ENE:', 'INT:' ),
- 'sitename' => array( '1', 'TTT-NOMO', 'RETPAÄœNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
- 'nse' => array( '0', 'NSO:', 'NSE:' ),
- 'localurl' => array( '0', 'LOKATTT:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
- 'server' => array( '0', 'SERVILO', 'SERVER' ),
- 'servername' => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'STILO-VOJO', 'STILOVOJO', 'STILVOJO', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMATIKO:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'SEKSO:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__NEKONVERTUTITOLON__', '__NKT__', '__NTC__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__NEKONVERTUENHAVON__', '__NKH__', '__NCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'NUNASEMAJNO', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'LOKASEMAJNO', 'LOCALWEEK' ),
- 'revisionyear' => array( '1', 'JARODEREVIZIO', 'REVISIONYEAR' ),
- 'plural' => array( '0', 'PLURALA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TUTATTT:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'TUTATTTT:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'MALMAJUSKLEUNUA:', 'MINUSKLEUNUA:', 'MMU:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'MAJUSKLEUNUA:', 'MALMINUSKLEUNUA:', 'MU:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MALMAJUSKLE:', 'MINUSKLE:', 'LC:' ),
- 'uc' => array( '0', 'MAJUSKLE:', 'MALMINUSKLE:', 'UC:' ),
- 'displaytitle' => array( '1', 'MONTRUTITOLON:', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LIGILOALNOVASEKCIO__', '__NSL__', '__LNS__', '__LANS__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__SENLIGILOALNOVASEKCIO__', '__NNSL__', '__SLNS__', '__SLANS__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'NUNAVERSIO', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'NUNATEMPINDIKO', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKATEMPINDIKO', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#LINGVO:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ENHAVA-LINGVO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAÄœOJENNOMSPACO', 'PAGXOJENNOMSPACO', 'PAÄœOJENS', 'PAGXOJENNS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NOMBRODEADMINOJ', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'speciala', 'special' ),
- 'defaultsort' => array( '1', 'DEFAŬLTORDIGO:', 'DEFAUXLTORDIGO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'DOSIERO-VORO', 'DOSIERVOJO', 'FILEPATH:' ),
- 'tag' => array( '0', 'marko', 'etikedo', 'tag' ),
- 'hiddencat' => array( '1', '__KK__', '__KAÅœITAKATEGORIO__', '__KASXITAKATEGORIO__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAÄœOJENKATEGORIO', 'PAGXOJENKATEGORIO', 'PAÄœOJENKAT', 'PAGXOJENKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'PAÄœOPEZO', 'PAGXOPEZO', 'PEZODEPAÄœO', 'PEZODEPAGXO', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEKSU__', '__INDEKSI__', '__INDEX__' ),
- 'noindex' => array( '1', '__NEINDEKSU__', '__NIU__', '__NOINDEX__' ),
- 'url_path' => array( '0', 'VOJO', 'PATH' ),
- 'url_wiki' => array( '0', 'VIKIO', 'WIKI' ),
- 'url_query' => array( '0', 'INFORMPETO', 'QUERY' ),
+ 'redirect' => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
+ 'notoc' => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__I__', '__T__', '__INDEKSO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__SRS__', '__NES__', '__SENREDAKTISEKCIOJN__', '__SENREDAKTISEKCION__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__SENTITOLO__', '__NH__', '__ST__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'NUNAMONATO', 'NUNAMONATO2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'NUNAMONATO1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NUNAMONATNOMO', 'NUNAMONATONOMO', 'NUNAMONATANOMO', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NUNAMONATNOMOGEN', 'NUNAMONATONOMOGEN', 'NUNAMONATANOMOGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'NUNAMONATNOMOMAL', 'NUNAMONATONOMOMAL', 'NUNAMONATANOMOMAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'NUNATAGO', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NUNATAGO2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NUNATAGNOMO', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'NUNAJARO', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'NUNATEMPO', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'NUNAHORO', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKAMONATO', 'LOKAMONATO2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKAMONATO1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKAMONATNOMO', 'LOKAMONATONOMO', 'LOKAMONATANOMO', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKAMONATNOMOGEN', 'LOKAMONATONOMOGEN', 'LOKAMONATANOMOGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKAMONATNOMOMAL', 'LOKAMONATONOMOMAL', 'LOKAMONATANOMOMAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKATAGO', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKATAGO2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKATAGNOMO', 'LOKATAGONOMO', 'LOKATAGANOMO', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKAJARO', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKATEMPO', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKAHORO', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NOMBRODEPAÄœOJ', 'NOMBRODEPAGXOJ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NOMBRODEARTIKOLOJ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NOMBRODEDOSIEROJ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NOMBRODEUZANTOJ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NOMBRODEAKTIVAJUZANTOJ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NOMBRODEREDAKTOJ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NOMBRODEVIZITOJ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'PAÄœONOMO', 'PAGXONOMO', 'PAÄœNOMO', 'PAGXNOMO', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PAÄœONOMOO', 'PAGXONOMOO', 'PAÄœNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NOMSPACO', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
+ 'fullpagename' => array( '1', 'TUTAPAÄœONOMO', 'TUTAPAGXONOMO', 'TUTAPAÄœNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'TUTAPAÄœONOMOO', 'TUTAPAGXONOMOO', 'TUTAPAÄœNOMOO', 'TUTAPAGXNOMOO', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'SUBPAÄœONOMO', 'SUBPAGXONOMO', 'SUBPAÄœNOMO', 'SUBPAGXNOMO', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'SUBPAÄœONOMOO', 'SUBPAGXONOMOO', 'SUBPAÄœNOMOO', 'SUBPAGXNOMOO', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'PATRAPAÄœONOMO', 'PATRAPAGXONOMO', 'PATRAPAÄœNOMO', 'PATRAPAGXNOMO', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'PATRAPAÄœONOMOO', 'PATRAPAGXONOMOO', 'PATRAPAÄœNOMOO', 'PATRAPAGXNOMOO', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'DISKUTPAÄœONOMO', 'DISKUTPAGXONOMO', 'DISKUTPAÄœNOMO', 'DISKUTPAGXNOMO', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'DISKUTPAÄœONOMOO', 'DISKUTPAGXONOMOO', 'DISKUTPAÄœNOMOO', 'DISKUTPAGXNOMOO', 'TALKPAGENAMEE' ),
+ 'msg' => array( '0', 'MSĜ:', 'MSGX:', 'MSG:' ),
+ 'subst' => array( '0', 'ANSTAT:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'SEKURANSTAT:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'NVMSĜ:', 'NVMSGX:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'eta', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'eta=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'dekstra', 'dekstre', 'right' ),
+ 'img_left' => array( '1', 'maldekstra', 'maldekstre', 'left' ),
+ 'img_none' => array( '1', 'nenio', 'neniu', 'none' ),
+ 'img_width' => array( '1', '$1ra', '$1px' ),
+ 'img_center' => array( '1', 'centra', 'meza', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'kadro', 'enkadrita', 'enkadrite', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'senkadra', 'frameless' ),
+ 'img_page' => array( '1', 'paÄo=$1', 'paÄo $1', 'pagxo=$1', 'pagxo_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'altdekstre', 'altdekstre=$1', 'altdekstre_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'kadra', 'kadrita', 'kadrigita', 'kadrite', 'kadrigite', 'border' ),
+ 'img_sub' => array( '1', 'sube', 'malsupre', 'sub' ),
+ 'img_super' => array( '1', 'supre', 'malsube', 'super', 'sup' ),
+ 'img_top' => array( '1', 'alte', 'top' ),
+ 'img_text_top' => array( '1', 'tekst-alte', 'text-top' ),
+ 'img_middle' => array( '1', 'meze', 'middle' ),
+ 'img_bottom' => array( '1', 'malalte', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'suba-teksto', 'text-bottom' ),
+ 'img_link' => array( '1', 'ligilo=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'alternative=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ENE:', 'INT:' ),
+ 'sitename' => array( '1', 'TTT-NOMO', 'RETPAÄœNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
+ 'nse' => array( '0', 'NSS:', 'NSO:', 'NSE:' ),
+ 'localurl' => array( '0', 'LOKATTT:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'SERVILO', 'SERVER' ),
+ 'servername' => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'STILO-VOJO', 'STILOVOJO', 'STILVOJO', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMATIKO:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SEKSO:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__NEKONVERTUTITOLON__', '__NKT__', '__NTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__NEKONVERTUENHAVON__', '__NKH__', '__NCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'NUNASEMAJNO', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'LOKASEMAJNO', 'LOCALWEEK' ),
+ 'revisionyear' => array( '1', 'JARODEREVIZIO', 'REVISIONYEAR' ),
+ 'plural' => array( '0', 'PLURALA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PLENALIGILO:', 'PLENLIG:', 'TUTATTT:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'PLENALIGILOO:', 'PLENLIGG:', 'TUTATTTT:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'MALMAJUSKLEUNUA:', 'MINUSKLEUNUA:', 'MMU:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'MAJUSKLEUNUA:', 'MALMINUSKLEUNUA:', 'MU:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MALMAJUSKLE:', 'MINUSKLE:', 'LC:' ),
+ 'uc' => array( '0', 'MAJUSKLE:', 'MALMINUSKLE:', 'UC:' ),
+ 'displaytitle' => array( '1', 'MONTRUTITOLON:', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LIGILOALNOVASEKCIO__', '__NSL__', '__LNS__', '__LANS__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__SENLIGILOALNOVASEKCIO__', '__NNSL__', '__SLNS__', '__SLANS__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'NUNAVERSIO', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'NUNATEMPINDIKO', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKATEMPINDIKO', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#LINGVO:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ENHAVA-LINGVO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAÄœOJENNOMSPACO', 'PAGXOJENNOMSPACO', 'PAÄœOJENS', 'PAGXOJENNS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NOMBRODEADMINOJ', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'speciala', 'special' ),
+ 'defaultsort' => array( '1', 'DEFAŬLTORDIGO:', 'DEFAUXLTORDIGO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'DOSIERO-VORO', 'DOSIERVOJO', 'FILEPATH:' ),
+ 'tag' => array( '0', 'marko', 'etikedo', 'tag' ),
+ 'hiddencat' => array( '1', '__KK__', '__KAÅœITAKATEGORIO__', '__KASXITAKATEGORIO__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAÄœOJENKATEGORIO', 'PAGXOJENKATEGORIO', 'PAÄœOJENKAT', 'PAGXOJENKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PAÄœOPEZO', 'PAGXOPEZO', 'PEZODEPAÄœO', 'PEZODEPAGXO', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKSU__', '__INDEKSI__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NEINDEKSU__', '__NIU__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '__STATIKAALIDIREKTO__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'PROTEKTONIVELO', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'VOJO', 'PATH' ),
+ 'url_wiki' => array( '0', 'VIKIO', 'WIKI' ),
+ 'url_query' => array( '0', 'INFORMPETO', 'QUERY' ),
);
$separatorTransformTable = array( ',' => ' ', '.' => ',' );
@@ -662,22 +669,24 @@ Bonvolu raporti ĉi tiun al [[Special:ListUsers/sysop|administranto]], notante l
'badarticleerror' => 'Tiun ĉi agon oni ne povas apliki al tiu ĉi artikolo.',
'cannotdelete' => 'Ne eblis forigi la elektitan paÄon aÅ­ dosieron "$1".
Eble Äi estis jam forigita de iu alia.',
+'cannotdelete-title' => 'Ne eblas forigi paÄon "$1"',
'badtitle' => 'FuÅa titolo',
'badtitletext' => 'La petita paÄotitolo estis malvalida, malplena, aÅ­ malÄuste ligita interlingva aÅ­ intervikia titolo.
Äœi eble enhavas unu aÅ­ pliaj signoj kiu ne povas esti uzata en titoloj.',
-'perfcached' => 'La sekvantaj informoj venas el kaÅmemoro kaj eble ne estas Äisdataj :',
-'perfcachedts' => 'La jenaj datenoj estas provizoraj, kaj estis laste Äisdatigitaj $1.',
+'perfcached' => 'La sekvantaj informoj venas el kaÅmemoro kaj eble ne estas Äisdataj. Maksimumo de {{PLURAL:$1|unu rezulto estas disponebla|$1 rezultoj estas disponeblaj}} en la kaÅmemoro.',
+'perfcachedts' => 'La jenaj datumoj estas el kaÅmemoro kaj estis laste Äisdatigitaj $1. Maksimumo de {{PLURAL:$4|unu rezulto estas disponebla|$4 rezultoj estas disponeblaj}} en la kaÅmemoro.',
'querypage-no-updates' => 'Äœisdatigoj por ĉi paÄo estas nune neebligitaj.
Datenoj ĉi tie ne estos nune refreÅigitaj.',
'wrong_wfQuery_params' => 'MalÄustaj parametroj por wfQuery()<br />
Funkcio: $1<br />
Peto: $2',
'viewsource' => 'Rigardi vikitekston',
-'viewsourcefor' => 'por $1',
+'viewsource-title' => 'Vidi fonton por $1',
'actionthrottled' => 'Agado limigita',
'actionthrottledtext' => 'Por kontraŭigi spamon, vi estas limigita farante ĉi tiun agon tro pluroble en mallonga tempdaŭro, kaj vi plialtigis ĉi tiun limon. Bonvolu refaru post kelkaj minutoj.',
'protectedpagetext' => 'Tiu ĉi paÄo estas Ålosita por malebligi redaktadon.',
'viewsourcetext' => 'Vi povas rigardi kaj kopii la fonton de la paÄo:',
+'viewyourtext' => "Vi povas vidi kaj kopii la fonton de '''viaj redaktoj''' al ĉi tiu paÄo:",
'protectedinterface' => 'Ĉi tiu paÄo provizas interfacan tekston por la softvaro, kaj estas Ålosita por malabeligi misuzon.',
'editinginterface' => "'''Atentu:''' Vi redaktas paÄon, kiu estas uzata kiel interfaca teksto por la rogramaro. ÅœanÄoj de ĉi tiu teksto povas ÅanÄi aspekton de la interfaco por aliaj uzantoj. Por tradukojn, bonvolu uzi [//translatewiki.net/wiki/Main_Page?setlang=eo translatewiki.net], la MediaWiki-projekton por lingvigaj versioj.",
'sqlhidden' => '(SQL serĉomendo kaÅita)',
@@ -777,6 +786,7 @@ Neniu retpoÅto estos sendita pro iuj jenaj kialoj.',
'emailconfirmlink' => 'Konfirmu vian retpoÅtan adreson',
'invalidemailaddress' => 'La retadreso ne povas esti akceptita, ĉar Äi verÅajne havas malvalidan formaton.
Enigi bone formatita adreso aÅ­ malplenigi tiun kampon.',
+'cannotchangeemail' => 'Kontaj retpoÅtadresoj ne povas esti ÅanÄita en ĉi tiu vikio.',
'accountcreated' => 'Konto kreita',
'accountcreatedtext' => 'La uzanto-konto por $1 estas kreita.',
'createaccount-title' => 'Konto-kreado por {{SITENAME}}',
@@ -792,6 +802,7 @@ Bonvolu Äisatendi antaÅ­ retrovi.',
# E-mail sending
'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
+'user-mail-no-addy' => 'Provis sendi retpoÅton sen retpoÅtadreso.',
# Change password dialog
'resetpass' => 'ÅœanÄi pasvorton',
@@ -812,16 +823,18 @@ Vi eble jam ÅanÄis vian pasvorton aÅ­ petis novan provizoran pasvorton.',
'resetpass-temp-password' => 'Provizora pasvorto:',
# Special:PasswordReset
-'passwordreset' => 'Restarigo de pasvorto',
-'passwordreset-text' => 'Plenumigu ĉi tiun formularon por ricevi retpoÅtan memoraĵon de viaj kontaj detaloj.',
-'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-username' => 'Salutnomo:',
-'passwordreset-domain' => 'Domajno:',
-'passwordreset-email' => 'RetpoÅtadreso:',
-'passwordreset-emailtitle' => 'Kontaj detaloj en {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Iu (verÅajne vi, de IP-adreso $1) petis rememoraĵo de viaj
+'passwordreset' => 'Restarigo de pasvorto',
+'passwordreset-text' => 'Plenumigu ĉi tiun formularon por ricevi retpoÅtan memoraĵon de viaj kontaj detaloj.',
+'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-username' => 'Salutnomo:',
+'passwordreset-domain' => 'Domajno:',
+'passwordreset-capture' => 'Vidi la rezultan retpoÅton?',
+'passwordreset-capture-help' => 'Se vi marki ĉi tiun skatoleton, la retpoÅto (kun provizora pasvorto) estos montrita al vi kaj estos sendita al la uzanto.',
+'passwordreset-email' => 'RetpoÅtadreso:',
+'passwordreset-emailtitle' => 'Kontaj detaloj en {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Iu (verÅajne vi, de IP-adreso $1) petis rememoraĵo de viaj
kontaj detaloj por {{SITENAME}} ($4). La {{PLURAL:$3|jena uzanto-konto|jenaj uzanto-kontoj}} estas
asociita kun ĉi tiu retpoÅtadreso:
@@ -832,7 +845,7 @@ Vi ensalutu kaj elektu novan pasvorton nun. Se iu alia petis ĉi tion,
aÅ­ se vi memoris vian originalan pasvorton, kaj vi ne plu volas
ÅanÄi Äin, vi povas ignori ĉi tiun mesaÄon kaj plu uzi vian
malnovan pasvorton.',
-'passwordreset-emailtext-user' => 'Uzanto $1 de {{SITENAME}} petis rememoraĵo de viaj kontaj detaloj por {{SITENAME}}
+'passwordreset-emailtext-user' => 'Uzanto $1 de {{SITENAME}} petis rememoraĵo de viaj kontaj detaloj por {{SITENAME}}
($4). La {{PLURAL:$3|jena uzanto-konto|jenaj uzanto-kontoj}} estas asociita kun ĉi tiu retpoÅtadreso:
$2
@@ -841,9 +854,22 @@ $2
Vi devas ensaluti kaj elekti novan pasvorton nun. Se iu alia petis ĉi tion,
aÅ­ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ÅanÄi
Äin, vi povas ignori ĉi tiun mesaÄon kaj uzi vian malnovan pasvorton.',
-'passwordreset-emailelement' => 'Salutnomo: $1
+'passwordreset-emailelement' => 'Salutnomo: $1
Provizora pasvorto: $2',
-'passwordreset-emailsent' => 'Rememoriga retpoÅto estis sendita.',
+'passwordreset-emailsent' => 'Rememoriga retpoÅto estis sendita.',
+'passwordreset-emailsent-capture' => 'Memoriga retpoÅto estis sendita, kiu estas montrata sube.',
+'passwordreset-emailerror-capture' => 'Memoriga retpoÅto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ÅœanÄi retpoÅtadreson',
+'changeemail-header' => 'ÅœanÄi retpoÅtadreso por konto',
+'changeemail-text' => 'Plenumu ĉi tiu formularon por ÅanÄi vian retpoÅtadreson. Vi devas enigi vian pasvorton por konfirmi ĉi tiun ÅanÄon.',
+'changeemail-no-info' => 'Vi devas ensaluti por atingi ĉi tiun paÄon rekte.',
+'changeemail-oldemail' => 'Aktuala retpoÅtadreso:',
+'changeemail-newemail' => 'Nova retpoÅtadreso:',
+'changeemail-none' => '(nenio)',
+'changeemail-submit' => 'ÅœanÄi retpoÅtadreson',
+'changeemail-cancel' => 'Nuligi',
# Edit page toolbar
'bold_sample' => 'Grasa teksto',
@@ -913,9 +939,6 @@ Notu, ke vi ne povas uzi la servon "RetpoÅtu ĉi tiu uzanton" krom se vi havas
Via nuna IP-adreso estas $3, kaj la forbaro-identigo estas $5.
Bonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.',
'blockednoreason' => 'nenia kialo donata',
-'blockedoriginalsource' => "La fonto de '''$1''' estas montrata malsupre:",
-'blockededitsource' => "La teksto de '''viaj redaktoj''' al '''$1''' estas montrata malsupre:",
-'whitelistedittitle' => 'Ensalutado devigata por redakti',
'whitelistedittext' => 'Vi devas $1 por redakti paÄojn.',
'confirmedittext' => 'Vi devas konfirmi vian retpoÅtan adreson antaÅ­ ol redakti paÄojn. Bonvolu agordi kaj validigi vian retadreson per viaj [[Special:Preferences|preferoj]].',
'nosuchsectiontitle' => 'Ne povas trovi sekcion',
@@ -1000,7 +1023,7 @@ Vi ankaÅ­ ĵuras, ke vi mem verkis la tekston, aÅ­ ke vi kopiis Äin el fonto se
'copyrightwarning2' => "Bonvolu noti ke ĉiuj kontribuoj al {{SITENAME}} povas esti reredaktita, ÅanÄita aÅ­ forigita de aliaj kontribuantoj. Se vi ne deziras ke viaj verkoj estu senkompate reredaktitaj, ne publikigu ilin ĉi tie.<br />
Vi ankaÅ­ promesu al ni ke vi verkis tion mem aÅ­ kopiis el publika domajno aÅ­ simila libera fonto (vidu $1 por detaloj).
'''NE PROPONU KOPIRAJTITAJN VERKOJN SEN PERMESO!'''",
-'longpageerror' => "'''Eraro: La teksto, kiun vi prezentis, longas $1 kilobajtojn, kio estas pli longa ol la maksimumo de $2 kilobajtoj. Äœi ne povas esti konservita.'''",
+'longpageerror' => "'''Eraro: La teksto, kiun vi prezentis, longas {{PLURAL:$1|$1}} kilobajtojn, kio estas pli longa ol la maksimumo de {{PLURAL:$2|$2}} kilobajtoj. Äœi ne povas esti konservita.'''",
'readonlywarning' => "'''AVERTO: La datumbazo estas Ålosita por teknika laboro, do vi ne povas konservi viajn redaktojn ĉi-momente.
Vi eble volus elkopii kaj englui la tekston al tekstdosiero por konservi Äin por posta uzo.'''
@@ -1167,8 +1190,6 @@ Aliaj administrantoj ĉe {{SITENAME}} plu povos aliri la kaÅitan entenon kaj re
'revdelete-unsuppress' => 'Forigi limigojn al restarigitaj versioj',
'revdelete-log' => 'Kialo:',
'revdelete-submit' => 'Apliki al {{PLURAL:$1|elektita revizio|elektitaj revizioj}}',
-'revdelete-logentry' => 'ÅanÄis videblecon de versio por [[$1]]',
-'logdelete-logentry' => 'ÅanÄis eventan videblecon de [[$1]]',
'revdelete-success' => "'''Revizia videbleco estas sukcese Äisdatigita.'''",
'revdelete-failure' => "'''Videblecon de revizio ne eblis Äisdatigi:'''
$1",
@@ -1180,15 +1201,6 @@ $1",
'revdel-restore-visible' => 'videblaj revizioj',
'pagehist' => 'PaÄa historio',
'deletedhist' => 'Forigita historio',
-'revdelete-content' => 'enhavon',
-'revdelete-summary' => 'redaktoresumon',
-'revdelete-uname' => 'salutnomo',
-'revdelete-restricted' => 'aplikis limojn al administrantoj',
-'revdelete-unrestricted' => 'forigis limojn por administrantoj',
-'revdelete-hid' => 'kaÅis $1',
-'revdelete-unhid' => 'malkaÅis $1',
-'revdelete-log-message' => '$1 por $2 {{PLURAL:$2|versio|versioj}}',
-'logdelete-log-message' => '$1 por $2 {{PLURAL:$2|evento|eventoj}}',
'revdelete-hide-current' => 'Eraro kaÅante la aĵon de $2, $1: ĉi tiu estas la nuna revizio.
Äœi ne estas kaÅebla.',
'revdelete-show-no-access' => 'Eraro montrante la aĵon de $2, $1: ĉi tiu estas markita "limigita".
@@ -1346,12 +1358,14 @@ indekso pro troÅarÄita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
'prefs-rc' => 'Lastaj ÅanÄoj',
'prefs-watchlist' => 'Atentaro',
'prefs-watchlist-days' => 'Kiom da tagoj montriÄu en la atentaro:',
-'prefs-watchlist-days-max' => 'Maksimume 7 tagoj',
+'prefs-watchlist-days-max' => 'Maksimume $1 {{PLURAL:$1|tago|tagoj}}',
'prefs-watchlist-edits' => 'Maksimuma nombro de ÅanÄoj montrendaj en ekspandita atentaro:',
'prefs-watchlist-edits-max' => 'Maksimuma nombro: 1000',
'prefs-watchlist-token' => 'Atentara ĵetono:',
'prefs-misc' => 'Miksitaĵoj',
'prefs-resetpass' => 'ÅœanÄi pasvorton',
+'prefs-changeemail' => 'ÅœanÄi retpoÅtadreson',
+'prefs-setemail' => 'Difini retpoÅtadreson',
'prefs-email' => 'RetpoÅtaj opcioj',
'prefs-rendering' => 'Aspekto',
'saveprefs' => 'Konservi preferojn',
@@ -1411,6 +1425,7 @@ Jen hazarde generita valoro por via uzo: $1',
'yourrealname' => 'Vera nomo:',
'yourlanguage' => 'Lingvo',
'yourvariant' => 'Varianto de la lingvo de enhavo:',
+'prefs-help-variant' => 'Via prefera variaĵo aÅ­ ortografio por montri la enhavojn de paÄoj por ĉi tiu vikio.',
'yournick' => 'Subskribo:',
'prefs-help-signature' => 'Komentoj en diskuto-paÄoj estu subskribita kun "<nowiki>~~~~</nowiki>" kiu estos konvertita al via subskribo kaj tempindiko.',
'badsig' => 'Via kaÅnomo (por subskriboj) malvalidas. Bv. kontroli la HTML-etikedojn!',
@@ -1450,7 +1465,7 @@ Jen hazarde generita valoro por via uzo: $1',
'userrights-lookup-user' => 'Administri grupojn de uzantoj',
'userrights-user-editname' => 'Entajpu salutnomon:',
'editusergroup' => 'Redakti grupojn de uzantoj',
-'editinguser' => "Redaktante uzanto-rajtojn de uzanto '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "ÅœanÄante uzanto-rajtojn de uzanto '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Redakti grupojn de uzantoj',
'saveusergroups' => 'Konservi grupojn de uzantoj',
'userrights-groupsmember' => 'Membro de:',
@@ -1544,13 +1559,13 @@ Jen hazarde generita valoro por via uzo: $1',
'right-autopatrol' => 'Fari redaktojn aÅ­tomate markitajn kiel patrolitajn',
'right-patrolmarks' => 'Rigardi patrolmarkojn de lastaj ÅanÄoj',
'right-unwatchedpages' => 'Vidi la liston de nepriatentitaj paÄoj',
-'right-trackback' => 'Enigi retrovojon',
'right-mergehistory' => 'Kunfandigi la historiojn de paÄoj',
'right-userrights' => 'Redakti ĉiujn uzanto-rajtojn',
'right-userrights-interwiki' => 'Redakti la rajtojn de uzantoj en aliaj vikioj',
'right-siteadmin' => 'Åœlosi kaj malÅlosi la datumbazon',
'right-override-export-depth' => 'Eksporti paÄojn inkluzivante ligitajn paÄojn Äis profundeco de 5',
'right-sendemail' => 'Sendi retpoÅton al aliaj uzantoj',
+'right-passwordreset' => 'Vidi retpoÅtojn de pasvorta restarado.',
# User rights log
'rightslog' => 'Protokolo de uzanto-rajtoj',
@@ -1584,16 +1599,17 @@ Jen hazarde generita valoro por via uzo: $1',
'action-suppressionlog' => 'vidi ĉi tiun privantan protokolon',
'action-block' => 'forari ĉi tiun uzanton de redaktado',
'action-protect' => 'ÅanÄi la protektan nivelon por ĉi tiu paÄo',
+'action-rollback' => 'tuj malfari la redaktojn de la lasta uzanto kiu redaktis specifan paÄon',
'action-import' => 'importi ĉi tiun paÄon de alia vikio',
'action-importupload' => 'importi ĉi tiun paÄon de dosiera alÅuto',
'action-patrol' => 'marki redakton de alia persono kiel patrolitan',
'action-autopatrol' => 'fari vian redakton markitan kiel patrolitan',
'action-unwatchedpages' => 'vidi la liston de neatentitaj paÄoj',
-'action-trackback' => 'aldoni retrovojon',
'action-mergehistory' => 'kunigi la historion de ĉi tiu paÄo',
'action-userrights' => 'redakti ĉiujn rajtojn de uzantoj',
'action-userrights-interwiki' => 'redakti uzulrajtojn de uzantoj en aliaj vikioj',
'action-siteadmin' => 'Ålosi aÅ­ malÅlosi la datumbazon',
+'action-sendemail' => 'sendi retpoÅtojn',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ÅanÄo|ÅanÄoj}}',
@@ -1625,6 +1641,7 @@ Jen hazarde generita valoro por via uzo: $1',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]',
'rc_categories' => 'Nur por jenaj kategorioj (disigu per "|")',
'rc_categories_any' => 'ĉiu',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajto|bajtoj}} post ÅanÄo',
'newsectionsummary' => '/* $1 */ nova sekcio',
'rc-enhanced-expand' => 'Montri detalojn (necesas JavaScript-on)',
'rc-enhanced-hide' => 'KaÅi detalojn',
@@ -1679,6 +1696,7 @@ Por inkluzivi la dosieron en paÄon, skribu ligilon laÅ­ la formoj
'ignorewarnings' => 'Ignori ĉiajn avertojn',
'minlength1' => 'Nomoj de dosieroj nepre havas almenaÅ­ unu literon.',
'illegalfilename' => 'La dosiernomo $1 entenas karaktrojn kiuj ne estas permesitaj en paÄaj titoloj. Bonvolu renomi la dosieron kaj provu denove alÅuti Äin.',
+'filename-toolong' => 'Nomoj de dosieroj ne estu pli longa ol 240 bitokoj.',
'badfilename' => 'Dosiernomo estis ÅanÄita al "$1".',
'filetype-mime-mismatch' => 'Dosiera sufikso ".$1" ne kongruas la MIME-tipon de la dosiero ($2).',
'filetype-badmime' => 'Dosieroj de la MIME-tipo "$1" ne estas permesitaj por alÅutado.',
@@ -1771,6 +1789,35 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
'upload-unknown-size' => 'Nekonata grandeco',
'upload-http-error' => 'HTTP-eraro okazis: $1',
+# File backend
+'backend-fail-stream' => 'Ne povis fluigi dosieron $1.',
+'backend-fail-backup' => 'Ne povis enarkivigi dosieron $1.',
+'backend-fail-notexists' => 'La dosiero $1 ne ekzistas.',
+'backend-fail-hashes' => 'Ne povis akiri dosierajn haketojn por komparo.',
+'backend-fail-notsame' => 'Malsama dosiero jam ekzistas ĉe $1.',
+'backend-fail-invalidpath' => '$1 ne estas valida pado por konservujo.',
+'backend-fail-delete' => 'Ne povis forigi dosieron "$1".',
+'backend-fail-alreadyexists' => 'La dosiero "$1" jam ekzistas.',
+'backend-fail-store' => 'Ne povis konservi dosieron $1 ĉe $2.',
+'backend-fail-copy' => 'Ne povis kopii dosieron $1 al $2.',
+'backend-fail-move' => 'Ne povis movi dosieron $1 al $2.',
+'backend-fail-opentemp' => 'Ne povis malfermi provizoran dosieron.',
+'backend-fail-writetemp' => 'Ne povis skribi intertempan dosieron.',
+'backend-fail-closetemp' => 'Ne povis fermi provizoran dosieron.',
+'backend-fail-read' => 'Ne povas legi dosieron "$1".',
+'backend-fail-create' => 'Ne povas krei dosieron $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ne povis malÅlosi "$1"; Äi ne estas Ålosita.',
+'lockmanager-fail-closelock' => 'Ne povis fermi Ålosadan dosieron por "$1".',
+'lockmanager-fail-deletelock' => 'Ne povis forigi Ålosadan dosieron por "$1".',
+'lockmanager-fail-acquirelock' => 'Ne povis akiri Ålosadon por "$1".',
+'lockmanager-fail-openlock' => 'Ne povis malfermi Ålosadan dosieron por "$1".',
+'lockmanager-fail-releaselock' => 'Ne povis liberigi Ålosadon por "$1".',
+'lockmanager-fail-db-bucket' => 'Ne povis kontakti sufiĉajn Ålos-datumbazojn en ujo $1.',
+'lockmanager-fail-db-release' => 'Ne povis liberigi Ålosadojn de datumbazao $1.',
+'lockmanager-fail-svr-release' => 'Ne povis liberigi Ålosadojn de servilo $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Eraro okazis malfermante la dosieron pro ZIP-kontrolado.',
'zip-wrong-format' => 'La specifigita dosiero ne estis ZIP-dosiero',
@@ -1787,6 +1834,7 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
'uploadstash-badtoken' => 'Malsukcesis tiu ago, eble pro tio ke viaj ensalutiloj senvalidiÄis. Reprovu.',
'uploadstash-errclear' => 'Sensukcesis la forigo de la dosieroj.',
'uploadstash-refresh' => 'Aktualigi la dosierliston.',
+'invalid-chunk-offset' => 'Malvalida deÅovo de dosierpeco',
# img_auth script messages
'img-auth-accessdenied' => 'Atingo malpermisita',
@@ -1892,23 +1940,24 @@ Jen la priskribo en ties [$2 dosier-priskriba paÄo].',
'filerevert-badversion' => 'Ne estas antaŭa loka versio de ĉi tiu dosiero ĉe tiu tempo.',
# File deletion
-'filedelete' => 'Forigi $1',
-'filedelete-legend' => 'Forigi dosieron.',
-'filedelete-intro' => "Vi preskaÅ­ forigos dosieron '''[[Media:$1|$1]]''' kune kun ĉiom da Äia historio.",
-'filedelete-intro-old' => "Vi forigas version de '''[[Media:$1|$1]]''' ekde [$4 $3, $2].",
-'filedelete-comment' => 'Kialo:',
-'filedelete-submit' => 'Forigi',
-'filedelete-success' => "'''$1''' estas forigita.",
-'filedelete-success-old' => "La versio de '''[[Media:$1|$1]]''' ekde $3, $2 estas forigita.",
-'filedelete-nofile' => "'''$1''' ne ekzistas.",
-'filedelete-nofile-old' => "Estas neniu arkivita versio de '''$1''' kun la specifitaj atribuoj.",
-'filedelete-otherreason' => 'Alia/plua kialo:',
-'filedelete-reason-otherlist' => 'Alia kialo',
-'filedelete-reason-dropdown' => '* Oftaj kialoj de forigo
+'filedelete' => 'Forigi $1',
+'filedelete-legend' => 'Forigi dosieron.',
+'filedelete-intro' => "Vi preskaÅ­ forigos dosieron '''[[Media:$1|$1]]''' kune kun ĉiom da Äia historio.",
+'filedelete-intro-old' => "Vi forigas version de '''[[Media:$1|$1]]''' ekde [$4 $3, $2].",
+'filedelete-comment' => 'Kialo:',
+'filedelete-submit' => 'Forigi',
+'filedelete-success' => "'''$1''' estas forigita.",
+'filedelete-success-old' => "La versio de '''[[Media:$1|$1]]''' ekde $3, $2 estas forigita.",
+'filedelete-nofile' => "'''$1''' ne ekzistas.",
+'filedelete-nofile-old' => "Estas neniu arkivita versio de '''$1''' kun la specifitaj atribuoj.",
+'filedelete-otherreason' => 'Alia/plua kialo:',
+'filedelete-reason-otherlist' => 'Alia kialo',
+'filedelete-reason-dropdown' => '* Oftaj kialoj de forigo
** Neglekto de aÅ­torrajto
** Duplikata dosiero',
-'filedelete-edit-reasonlist' => 'Redakti kialojn por forigo',
-'filedelete-maintenance' => 'Forigado kaj restarigado de dosieroj provizore malÅaltis dum funkciteno.',
+'filedelete-edit-reasonlist' => 'Redakti kialojn por forigo',
+'filedelete-maintenance' => 'Forigado kaj restarigado de dosieroj provizore malÅaltis dum funkciteno.',
+'filedelete-maintenance-title' => 'Ne povas forigi dosieron',
# MIME search
'mimesearch' => 'MIME-serĉilo',
@@ -2014,6 +2063,7 @@ PaÄo estas traktata kiel apartigilo se Äi uzas Åablonon kiu estas ligita de [
'mostimages' => 'Plej ligitaj bildoj',
'mostrevisions' => 'Artikoloj kun la plej multaj versioj',
'prefixindex' => 'Ĉiuj paÄoj kun prefikso',
+'prefixindex-namespace' => 'Ĉiuj paÄoj kun prefikso ($1 nomspaco)',
'shortpages' => 'Mallongaj paÄoj',
'longpages' => 'Longaj paÄoj',
'deadendpages' => 'PaÄoj sen interna ligilo',
@@ -2030,7 +2080,7 @@ PaÄo estas traktata kiel apartigilo se Äi uzas Åablonon kiu estas ligita de [
'listusers-editsonly' => 'Montri uzantojn kun redaktoj nur',
'listusers-creationsort' => 'Ordigi laÅ­ dato de kreado',
'usereditcount' => '$1 {{PLURAL:$1|redakto|redaktoj}}',
-'usercreated' => 'Kreita je $1, $2',
+'usercreated' => '{{GENDER:$3|Kreita}} je $1, $2',
'newpages' => 'Novaj paÄoj',
'newpages-username' => 'Salutnomo:',
'ancientpages' => 'Plej malnovaj artikoloj',
@@ -2125,12 +2175,8 @@ Subtenataj protokoloj: <tt>$1</tt> (ne aldonu ĉi tiujn ajn en via serĉo-mendo)
'activeusers-noresult' => 'Neniuj uzantoj trovitaj.',
# Special:Log/newusers
-'newuserlogpage' => 'Protokolo de uzanto-kreado',
-'newuserlogpagetext' => 'Jen protokolo de lastaj kreadoj de uzantoj.',
-'newuserlog-byemail' => 'pasvorto sendita retpoÅte',
-'newuserlog-create-entry' => 'Nova uzanto',
-'newuserlog-create2-entry' => 'kreis novan konton $1',
-'newuserlog-autocreate-entry' => 'Konto kreita aÅ­tomate',
+'newuserlogpage' => 'Protokolo de uzanto-kreado',
+'newuserlogpagetext' => 'Jen protokolo de lastaj kreadoj de uzantoj.',
# Special:ListGroupRights
'listgrouprights' => 'Gruprajtoj de uzantoj',
@@ -2159,7 +2205,7 @@ Estas [[{{MediaWiki:Listgrouprights-helppage}}|aldona informo]] pri individuaj r
'emailpagetext' => 'Vi povas uzi la jenan paÄon por sendi retpoÅtan mesaÄon al ĉi tiu uzanto.
La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel la "De" adreso de la retpoÅto, do la ricevonto eblos respondi rekte al vi.',
'usermailererror' => 'Resendita retmesaÄa erarsubjekto:',
-'defemailsubject' => '{{SITENAME}} retmesaÄo',
+'defemailsubject' => '{{SITENAME}} retmesaÄo de uzanto "$1"',
'usermaildisabled' => 'Uzula retpoÅto malÅaltis',
'usermaildisabledtext' => 'Vi ne povas sendi retpoÅton al aliaj uzantoj en ĉi tiu vikio',
'noemailtitle' => 'Neniu retpoÅtadreso',
@@ -2212,7 +2258,7 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
'watchmethod-list' => 'traserĉas priatentitajn',
'watchlistcontains' => 'Via atentaro enhavas $1 {{PLURAL:$1|paÄon|paÄojn}}.',
'iteminvalidname' => 'Ia eraro pri "$1", nevalida titolo...',
-'wlnote' => "Jen la {{PLURAL:$1|lasta redakto|lastaj '''$1''' redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj '''$2''' horoj}}.",
+'wlnote' => "Jen la {{PLURAL:$1|lasta redakto|lastaj '''$1''' redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj '''$2''' horoj}}, ekde $3, $4.",
'wlshowlast' => 'Montri el lastaj $1 horoj $2 tagoj $3',
'watchlist-options' => 'Opcioj por atentaro',
@@ -2275,8 +2321,6 @@ Komentoj kaj plia helpo:
'actionfailed' => 'Ago malsukcesis',
'deletedtext' => '"$1" estas forigita.
Vidu la paÄon $2 por registro de lastatempaj forigoj.',
-'deletedarticle' => 'forigis "[[$1]]"',
-'suppressedarticle' => '"[[$1]]" estas subigita',
'dellogpage' => 'Protokolo pri forigoj',
'dellogpagetext' => 'Jen listo de la plej lastaj forigoj el la datumaro.
Ĉiuj tempoj sekvas la horzonon UTC.',
@@ -2322,7 +2366,10 @@ Vidu [[Special:ProtectedPages|liston de protektitaj paÄoj]] por listo de aktual
'unprotectedarticle' => 'forigis protektadon de "[[$1]]"',
'movedarticleprotection' => 'movis protektadajn preferojn de "[[$2]]" al "[[$1]]"',
'protect-title' => 'Protektante "$1"',
+'protect-title-notallowed' => 'Vidi protektadan nivelon de "$1"',
'prot_1movedto2' => '[[$1]] movita al [[$2]]',
+'protect-badnamespace-title' => 'Ne-protektebla nomspaco',
+'protect-badnamespace-text' => 'PaÄoj en ĉi tiu datumbazo ne povas esti protektita.',
'protect-legend' => 'Konfirmi protektadon',
'protectcomment' => 'Kialo:',
'protectexpiry' => 'EksvalidiÄas:',
@@ -2343,6 +2390,7 @@ Vi povas ÅanÄi ties protektnivelon, sed tio ne ÅanÄos la kaskadan protekton.
'protect-level-sysop' => 'Nur administrantoj',
'protect-summary-cascade' => 'kaskada',
'protect-expiring' => 'finiÄas je $1 (UTC)',
+'protect-expiring-local' => 'eksdatiÄas $1',
'protect-expiry-indefinite' => 'sendifina',
'protect-cascade' => 'Protekti ĉiujn paÄojn inkluzivitajn en ĉi paÄo (kaskada protekto)',
'protect-cantedit' => 'Vi ne povas ÅanÄi la protekt-nivelojn de ĉi tiu paÄo, ĉar vi ne rajtas redakti Äin.',
@@ -2400,7 +2448,6 @@ Vi verÅajne havas malbonan ligilon, aÅ­ la revizio eble estis restarigita aÅ­ f
'undeletereset' => 'Restarigi',
'undeleteinvert' => 'Inversigi selektaĵon',
'undeletecomment' => 'Kialo:',
-'undeletedarticle' => 'restarigis "$1"',
'undeletedrevisions' => '{{PLURAL:$1|1 versio restarigita|$1 versioj restarigitaj}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versio|$1 versioj}} kaj {{PLURAL:$2|1 dosiero|$2 dosieroj}} restarigitaj',
'undeletedfiles' => '{{PLURAL:$1|1 dosiero restarigita|$1 dosieroj restarigitaj}}',
@@ -2409,6 +2456,7 @@ Vi verÅajne havas malbonan ligilon, aÅ­ la revizio eble estis restarigita aÅ­ f
Konsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj forigoj kaj restarigoj.",
'undelete-header' => 'Konsulti la [[Special:Log/delete|protokolo de forigoj]] por lastatempaj forigoj.',
+'undelete-search-title' => 'Serĉi forigitajn paÄojn',
'undelete-search-box' => 'Serĉi forigitajn paÄojn',
'undelete-search-prefix' => 'Montri paÄojn komence kun:',
'undelete-search-submit' => 'Serĉi',
@@ -2418,6 +2466,7 @@ Konsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj
'undelete-cleanup-error' => 'Eraro forigante la neuzatan arkivon "$1".',
'undelete-missing-filearchive' => 'Ne povas restarigi dosieran arkivon ID $1 ĉar Äi ne estas en la datumbazo.
Eble Äi jam estis restarigita.',
+'undelete-error' => 'Eraro malforigante paÄon',
'undelete-error-short' => 'Eraro pro restarigo de dosiero: $1',
'undelete-error-long' => 'Jen eraroj dum restarigo de dosiero:
@@ -2537,6 +2586,7 @@ forbarita IP-adreso/nomo la povon enskribi en la vikio.',
'blocklist-userblocks' => 'KaÅi konto-forbarojn',
'blocklist-tempblocks' => 'KaÅi provizorajn forbarojn',
'blocklist-addressblocks' => 'KaÅi unuopajn IP-adresajn forbarojn',
+'blocklist-rangeblocks' => 'KaÅi blokojn de intervalo',
'blocklist-timestamp' => 'Tempindiko',
'blocklist-target' => 'Celo',
'blocklist-expiry' => 'EksvalidiÄas',
@@ -2559,6 +2609,7 @@ forbarita IP-adreso/nomo la povon enskribi en la vikio.',
'unblocklink' => 'restarigi',
'change-blocklink' => 'ÅanÄi forbaron',
'contribslink' => 'kontribuoj',
+'emaillink' => 'sendi retpoÅton',
'autoblocker' => 'Aŭtomate forbarita ĉar via IP-adreso estis lastatempe uzita de "[[User:$1|$1]]".
La kialo donita por la forbaro de $1 estis: "$2"',
'blocklogpage' => 'Protokolo pri forbaroj',
@@ -2686,9 +2737,6 @@ Bonvolu permane kunigi ilin.',
'movepage-page-moved' => 'La paÄo $1 estis alinomita al $2.',
'movepage-page-unmoved' => 'La paÄo $1 ne povas esti alinomigita al $2.',
'movepage-max-pages' => 'La maksimumo de $1 {{PLURAL:$1|paÄo|paÄoj}} estis {{PLURAL:$1|alinomita|alinomitaj}} kaj neniuj pliaj estos alinomitaj aÅ­tomate.',
-'1movedto2' => '[[$1]] movita al [[$2]]',
-'1movedto2_redir' => '[[$1]] movita al [[$2]], redirekto lasita',
-'move-redirect-suppressed' => 'alidirektilo forigita',
'movelogpage' => 'Protokolo pri paÄmovoj',
'movelogpagetext' => 'Jen listo de movitaj paÄoj',
'movesubpage' => '{{PLURAL:$1|SubpaÄo|SubpaÄoj}}',
@@ -2701,7 +2749,7 @@ Bonvolu permane kunigi ilin.',
La celartikolo "[[:$1]]" jam ekzistas. Ĉu vi volas forigi Äin por krei spacon por la movo?',
'delete_and_move_confirm' => 'Jes, forigu la paÄon',
-'delete_and_move_reason' => 'Forigita por ebligi movon',
+'delete_and_move_reason' => 'Forigita por ebligi movadon de "[[$1]]"',
'selfmove' => 'Fonto- kaj celo-titoloj samas; ne povas movi paÄon sur Äin mem.',
'immobile-source-namespace' => 'Ne povas movi paÄojn en nomspaco "$1"',
'immobile-target-namespace' => 'Ne povas movi paÄojn en nomspacon "$1"',
@@ -2731,9 +2779,11 @@ Bonvolu elekti alian nomon.',
Por eksporti paÄojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaÅ­ajn versiojn, kun la paÄaj historiaj linioj, aÅ­ la nunan version kun la informo pri la lasta redakto.
En la lasta okazo, vi ankaÅ­ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paÄo "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Eksporti ĉiujn paÄojn',
'exportcuronly' => 'Entenas nur la aktualan version, ne la malnovajn.',
'exportnohistory' => "----
'''Notu:''' Eksportado de la plena historio de paÄoj per ĉi paÄo estis malebligita pro funkciigaj kialoj.",
+'exportlistauthors' => 'Inkluzivi plenan liston de kontribuantoj por ĉiu paÄo.',
'export-submit' => 'Eksporti',
'export-addcattext' => 'Aldoni paÄojn el kategorio:',
'export-addcat' => 'Aldoni',
@@ -2767,6 +2817,8 @@ se vi volus kontribui al la komuna MediaWiki-asimilado.',
'thumbnail_error' => 'Okazis eraro ĉe kreado de antaŭvida bildeto: $1',
'djvu_page_error' => 'DjVu-a paÄo el intervalo',
'djvu_no_xml' => 'Ne povas akiri XML por DjVu dosiero',
+'thumbnail-temp-create' => 'Ne povas krei provizoran bildetan dosieron',
+'thumbnail-dest-create' => 'Ne povis konservi etan version al celo',
'thumbnail_invalid_params' => 'Nevalidaj bildetaj parametroj',
'thumbnail_dest_directory' => 'Ne povas krei destinan dosierujon',
'thumbnail_image-type' => 'Tia bildo ne subtenata',
@@ -2810,6 +2862,10 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'import-upload' => 'AlÅuti XML-datenojn',
'import-token-mismatch' => 'Seancaj datenoj perdiÄis. Bonvolu reprovi.',
'import-invalid-interwiki' => 'Ne povas importi de la specifita vikio.',
+'import-error-edit' => 'PaÄo "$1" ne estas importita ĉar vi ne rajtas radakti Äin.',
+'import-error-create' => 'PaÄo "$1" ne estas importita ĉar vi ne rajtas krei Äin.',
+'import-error-special' => 'PaÄo "$1" ne estas importata, ĉar Äi apartenas al speciala nomspaco, kiu ne permesas paÄojn.',
+'import-error-invalid' => 'PaÄo "$1" ne estas importata, ĉar Äia nomo estas malvalida.',
# Import log
'importlogpage' => 'Protokolo de importaĵoj',
@@ -2819,72 +2875,79 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'import-logentry-interwiki' => 'transvikiigita $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versio|versioj}} de $2',
+# JavaScriptTest
+'javascripttest' => 'Äœavoskripta testado',
+'javascripttest-disabled' => 'Ĉi tiu funkcio estas malÅaltita.',
+'javascripttest-qunit-intro' => 'Vidu [$1 testa dokumentaro] en mediawiki.org.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Via uzantopaÄo',
-'tooltip-pt-anonuserpage' => 'La uzantopaÄo por la IP adreso sub kiu vi estas redaktanta',
-'tooltip-pt-mytalk' => 'Via diskutpaÄo',
-'tooltip-pt-anontalk' => 'Diskuto pri redaktoj sub tiu ĉi IP adreso',
-'tooltip-pt-preferences' => 'Miaj preferoj',
-'tooltip-pt-watchlist' => 'Listo de paÄoj kies ÅanÄojn vi priatentas.',
-'tooltip-pt-mycontris' => 'Listo de viaj kontribuoj',
-'tooltip-pt-login' => 'Vi estas invitita ensaluti, tamen ne estas devige.',
-'tooltip-pt-anonlogin' => 'Vi estas invitita ensaluti, tamen ne estas devige.',
-'tooltip-pt-logout' => 'Elsaluti',
-'tooltip-ca-talk' => 'Diskuto pri la artikolo',
-'tooltip-ca-edit' => 'Vi povas redakti tiun ĉi paÄon. Bv uzi la antaÅ­vidbutonon antaÅ­ ol konservi.',
-'tooltip-ca-addsection' => 'Starti novan sekcion',
-'tooltip-ca-viewsource' => 'Tiu paÄo estas protektita. Vi povas nur rigardi ties fonton.',
-'tooltip-ca-history' => 'AntaÅ­aj versioj de tiu ĉi paÄo.',
-'tooltip-ca-protect' => 'Protekti tiun ĉi paÄon',
-'tooltip-ca-unprotect' => 'ÅœanÄi protektadon de ĉi tiu paÄo',
-'tooltip-ca-delete' => 'Forigi tiun ĉi paÄon',
-'tooltip-ca-undelete' => 'Restarigu la redaktojn faritajn al tiu ĉi paÄo antaÅ­ ties forigo',
-'tooltip-ca-move' => 'Alinomigi tiun ĉi paÄon',
-'tooltip-ca-watch' => 'Aldoni tiun ĉi paÄon al via atentaro',
-'tooltip-ca-unwatch' => 'Forigi tiun ĉi paÄon el via atentaro',
-'tooltip-search' => 'Traserĉi {{SITENAME}}',
-'tooltip-search-go' => 'Iru al paÄo kun ĉi preciza nomo se Äi ekzistas',
-'tooltip-search-fulltext' => 'Serĉi la paÄojn por ĉi tiu teksto',
-'tooltip-p-logo' => 'ĈefpaÄo',
-'tooltip-n-mainpage' => 'Viziti la ĈefpaÄon',
-'tooltip-n-mainpage-description' => 'Iri al la ĉefpaÄon',
-'tooltip-n-portal' => 'Pri la projekto, kion vi povas fari, kie vi povas trovi ion',
-'tooltip-n-currentevents' => 'Trovi fonajn informojn pri nunaj eventoj',
-'tooltip-n-recentchanges' => 'Listo de la lastaj ÅanÄoj en la vikio.',
-'tooltip-n-randompage' => 'Iri al hazarda paÄo',
-'tooltip-n-help' => 'SerĉopaÄo.',
-'tooltip-t-whatlinkshere' => 'Listo de ĉiuj vikiaj paÄoj kij ligas ĉi tien',
-'tooltip-t-recentchangeslinked' => 'Lastaj ÅanÄoj en paÄoj kiuj ligas al tiu ĉi paÄo',
-'tooltip-feed-rss' => 'RSS-fonto por tiu ĉi paÄo',
-'tooltip-feed-atom' => 'Atom-fonto por ĉi tiu paÄo',
-'tooltip-t-contributions' => 'Rigardi la liston de kontribuoj de tiu ĉi uzanto',
-'tooltip-t-emailuser' => 'Sendi retmesaÄon al tiu ĉi uzanto',
-'tooltip-t-upload' => 'AlÅuti bildojn aÅ­ dosierojn',
-'tooltip-t-specialpages' => 'Listo de ĉiuj specialaj paÄoj',
-'tooltip-t-print' => 'Printebla versio de ĉi tiu paÄo',
-'tooltip-t-permalink' => 'Konstanta ligilo al ĉi versio de la paÄo',
-'tooltip-ca-nstab-main' => 'Vidi la artikolon',
-'tooltip-ca-nstab-user' => 'Vidi la personan paÄon de la uzanto',
-'tooltip-ca-nstab-media' => 'Vidi la paÄon de la dosiero',
-'tooltip-ca-nstab-special' => 'Estas speciala paÄo, vi ne rajtas redakti Äin.',
-'tooltip-ca-nstab-project' => 'Rigardi la paÄon de la projekto',
-'tooltip-ca-nstab-image' => 'Rigardi la dosierpaÄon',
-'tooltip-ca-nstab-mediawiki' => 'Rigardi la sisteman mesaÄon',
-'tooltip-ca-nstab-template' => 'Rigardi la Åablonon',
-'tooltip-ca-nstab-help' => 'Rigardi la helppaÄon',
-'tooltip-ca-nstab-category' => 'Vidu la paÄon de kategorioj',
-'tooltip-minoredit' => 'Marki tiun ÅanÄon kiel etan',
-'tooltip-save' => 'Konservi viajn ÅanÄojn',
-'tooltip-preview' => 'AntaÅ­rigardi viajn ÅanÄojn. Bonvolu uzi tion antaÅ­ ol konservi ilin!',
-'tooltip-diff' => 'Montri la ÅanÄojn kiujn vi faris de la teksto.',
-'tooltip-compareselectedversions' => 'Rigardi la malsamojn inter ambaÅ­ selektitaj versioj de ĉi tiu paÄo.',
-'tooltip-watch' => 'Aldoni ĉi paÄon al via atentaro',
-'tooltip-recreate' => 'Rekrei la paÄon malgraÅ­ Äi estis forigita',
-'tooltip-upload' => 'EkalÅuti',
-'tooltip-rollback' => '"Restarigi antaÅ­an" restarigas redakto(j)n al ĉi tiu paÄo de la lasta kontribuanto per unu klako.',
-'tooltip-undo' => '"Malfari" malfaris ĉi tiun redakton kaj malfermas la redakto-paÄon en antaÅ­vida reÄimo. Permesas aldoni kialon en la resumo.',
-'tooltip-preferences-save' => 'Konservi preferojn',
-'tooltip-summary' => 'Enigu mallongan resumon',
+'tooltip-pt-userpage' => 'Via uzantopaÄo',
+'tooltip-pt-anonuserpage' => 'La uzantopaÄo por la IP adreso sub kiu vi estas redaktanta',
+'tooltip-pt-mytalk' => 'Via diskutpaÄo',
+'tooltip-pt-anontalk' => 'Diskuto pri redaktoj sub tiu ĉi IP adreso',
+'tooltip-pt-preferences' => 'Miaj preferoj',
+'tooltip-pt-watchlist' => 'Listo de paÄoj kies ÅanÄojn vi priatentas.',
+'tooltip-pt-mycontris' => 'Listo de viaj kontribuoj',
+'tooltip-pt-login' => 'Vi estas invitita ensaluti, tamen ne estas devige.',
+'tooltip-pt-anonlogin' => 'Vi estas invitita ensaluti, tamen ne estas devige.',
+'tooltip-pt-logout' => 'Elsaluti',
+'tooltip-ca-talk' => 'Diskuto pri la artikolo',
+'tooltip-ca-edit' => 'Vi povas redakti tiun ĉi paÄon. Bv uzi la antaÅ­vidbutonon antaÅ­ ol konservi.',
+'tooltip-ca-addsection' => 'Starti novan sekcion',
+'tooltip-ca-viewsource' => 'Tiu paÄo estas protektita. Vi povas nur rigardi ties fonton.',
+'tooltip-ca-history' => 'AntaÅ­aj versioj de tiu ĉi paÄo.',
+'tooltip-ca-protect' => 'Protekti tiun ĉi paÄon',
+'tooltip-ca-unprotect' => 'ÅœanÄi protektadon de ĉi tiu paÄo',
+'tooltip-ca-delete' => 'Forigi tiun ĉi paÄon',
+'tooltip-ca-undelete' => 'Restarigu la redaktojn faritajn al tiu ĉi paÄo antaÅ­ ties forigo',
+'tooltip-ca-move' => 'Alinomigi tiun ĉi paÄon',
+'tooltip-ca-watch' => 'Aldoni tiun ĉi paÄon al via atentaro',
+'tooltip-ca-unwatch' => 'Forigi tiun ĉi paÄon el via atentaro',
+'tooltip-search' => 'Traserĉi {{SITENAME}}',
+'tooltip-search-go' => 'Iru al paÄo kun ĉi preciza nomo se Äi ekzistas',
+'tooltip-search-fulltext' => 'Serĉi la paÄojn por ĉi tiu teksto',
+'tooltip-p-logo' => 'ĈefpaÄo',
+'tooltip-n-mainpage' => 'Viziti la ĈefpaÄon',
+'tooltip-n-mainpage-description' => 'Iri al la ĉefpaÄon',
+'tooltip-n-portal' => 'Pri la projekto, kion vi povas fari, kie vi povas trovi ion',
+'tooltip-n-currentevents' => 'Trovi fonajn informojn pri nunaj eventoj',
+'tooltip-n-recentchanges' => 'Listo de la lastaj ÅanÄoj en la vikio.',
+'tooltip-n-randompage' => 'Iri al hazarda paÄo',
+'tooltip-n-help' => 'SerĉopaÄo.',
+'tooltip-t-whatlinkshere' => 'Listo de ĉiuj vikiaj paÄoj kij ligas ĉi tien',
+'tooltip-t-recentchangeslinked' => 'Lastaj ÅanÄoj en paÄoj kiuj ligas al tiu ĉi paÄo',
+'tooltip-feed-rss' => 'RSS-fonto por tiu ĉi paÄo',
+'tooltip-feed-atom' => 'Atom-fonto por ĉi tiu paÄo',
+'tooltip-t-contributions' => 'Rigardi la liston de kontribuoj de tiu ĉi uzanto',
+'tooltip-t-emailuser' => 'Sendi retmesaÄon al tiu ĉi uzanto',
+'tooltip-t-upload' => 'AlÅuti bildojn aÅ­ dosierojn',
+'tooltip-t-specialpages' => 'Listo de ĉiuj specialaj paÄoj',
+'tooltip-t-print' => 'Printebla versio de ĉi tiu paÄo',
+'tooltip-t-permalink' => 'Konstanta ligilo al ĉi versio de la paÄo',
+'tooltip-ca-nstab-main' => 'Vidi la artikolon',
+'tooltip-ca-nstab-user' => 'Vidi la personan paÄon de la uzanto',
+'tooltip-ca-nstab-media' => 'Vidi la paÄon de la dosiero',
+'tooltip-ca-nstab-special' => 'Estas speciala paÄo, vi ne rajtas redakti Äin.',
+'tooltip-ca-nstab-project' => 'Rigardi la paÄon de la projekto',
+'tooltip-ca-nstab-image' => 'Rigardi la dosierpaÄon',
+'tooltip-ca-nstab-mediawiki' => 'Rigardi la sisteman mesaÄon',
+'tooltip-ca-nstab-template' => 'Rigardi la Åablonon',
+'tooltip-ca-nstab-help' => 'Rigardi la helppaÄon',
+'tooltip-ca-nstab-category' => 'Vidu la paÄon de kategorioj',
+'tooltip-minoredit' => 'Marki tiun ÅanÄon kiel etan',
+'tooltip-save' => 'Konservi viajn ÅanÄojn',
+'tooltip-preview' => 'AntaÅ­rigardi viajn ÅanÄojn. Bonvolu uzi tion antaÅ­ ol konservi ilin!',
+'tooltip-diff' => 'Montri la ÅanÄojn kiujn vi faris de la teksto.',
+'tooltip-compareselectedversions' => 'Rigardi la malsamojn inter ambaÅ­ selektitaj versioj de ĉi tiu paÄo.',
+'tooltip-watch' => 'Aldoni ĉi paÄon al via atentaro',
+'tooltip-watchlistedit-normal-submit' => 'Forigi titolojn',
+'tooltip-watchlistedit-raw-submit' => 'Äœisdatigi atentaron',
+'tooltip-recreate' => 'Rekrei la paÄon malgraÅ­ Äi estis forigita',
+'tooltip-upload' => 'EkalÅuti',
+'tooltip-rollback' => '"Restarigi antaÅ­an" restarigas redakto(j)n al ĉi tiu paÄo de la lasta kontribuanto per unu klako.',
+'tooltip-undo' => '"Malfari" malfaris ĉi tiun redakton kaj malfermas la redakto-paÄon en antaÅ­vida reÄimo. Permesas aldoni kialon en la resumo.',
+'tooltip-preferences-save' => 'Konservi preferojn',
+'tooltip-summary' => 'Enigu mallongan resumon',
# Metadata
'notacceptable' => 'La viki-servilo ne povas doni datumon en formato kiun via kliento povas legi.',
@@ -2944,9 +3007,6 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
# Patrol log
'patrol-log-page' => 'Protokolo pri patrolado',
'patrol-log-header' => 'Jen protokolo de patrolitaj versioj.',
-'patrol-log-line' => 'markis $1 de $2 patrolita $3',
-'patrol-log-auto' => '(aÅ­tomata)',
-'patrol-log-diff' => 'version $1',
'log-show-hide-patrol' => '$1 protokolo pri patrolado',
# Image deletion
@@ -2972,11 +3032,11 @@ $1',
'file-info' => 'grando de dosiero: $1, MIME-tipo: $2',
'file-info-size' => '$1 × $2 rastrumeroj, dosiera grandeco: $3, MIME-tipo: $4',
'file-info-size-pages' => '$1 × $2 rastrumeroj, dosiera grandeco: $3, MIME-tipo: $4, $5 {{PLURAL:$5|paÄo|paÄoj}}',
-'file-nohires' => '<small>Nenia pli granda distingivo havebla.</small>',
+'file-nohires' => 'Nenia pli granda distingivo havebla.',
'svg-long-desc' => 'SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3',
'show-big-image' => 'Plena distingivo',
-'show-big-image-preview' => '<small>Grandeco de ĉi antaŭvido: $1.</small>',
-'show-big-image-other' => '<small>Aliaj distingivoj: $1.</small>',
+'show-big-image-preview' => 'Grandeco de ĉi antaŭvido: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Alia distingivo|Aliaj distingivoj}}: $1.',
'show-big-image-size' => '$1 × $2 rastrumeroj',
'file-info-gif-looped' => 'ripeta GIF',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ĉelo|ĉeloj}}',
@@ -2996,6 +3056,13 @@ $1',
'bydate' => 'laÅ­ dato',
'sp-newimages-showfrom' => 'Montru novajn dosierojn komencante de $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekundo|$1 sekundoj}}',
+'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutoj}}',
+'hours' => '{{PLURAL:$1|$1 horo|$1 horoj}}',
+'days' => '{{PLURAL:$1|$1 tago|$1 tagoj}}',
+'ago' => 'antaÅ­ $1',
+
# Bad image list
'bad_image_list' => 'La formato estas jen:
@@ -3492,13 +3559,6 @@ $5
'scarytranscludefailed' => '[Akiro de Åablono $1 malsukcesis.]',
'scarytranscludetoolong' => '[URL-o estas tro longa]',
-# Trackbacks
-'trackbackbox' => 'Respuradoj por ĉi tiu paÄo:<br />
-$1',
-'trackbackremove' => '([$1 Forigi])',
-'trackbacklink' => 'Postspurado',
-'trackbackdeleteok' => 'La postspurado estis sukcese forigita.',
-
# Delete conflict
'deletedwhileediting' => "'''Averto''': Ĉi tiu paÄo estis forigita post vi ekredaktis!",
'confirmrecreate' => "Uzanto [[User:$1|$1]] ([[User talk:$1|diskuto]]) forigis ĉi tiun paÄon post vi ekredaktis Äin kun kialo:
@@ -3578,6 +3638,9 @@ Vi povas ankaÅ­ [[Special:EditWatchlist|redakti norme]].',
'watchlisttools-edit' => 'Rigardi kaj redakti atentaron',
'watchlisttools-raw' => 'Redakti krudan atentaron',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskuto]])',
+
# Core parser functions
'unknown_extension_tag' => 'Nekonata etend-etikedo "$1"',
'duplicate-defaultsort' => '\'\'\'Averto:\'\'\' DefaÅ­lta ordiga Ålosilo "$2" anstataÅ­igas pli fruan defaÅ­ltan ordigan Ålosilon "$1".',
@@ -3676,13 +3739,16 @@ Bildoj montriÄas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
'tags-hitcount' => '$1 {{PLURAL:$1|ÅanÄo|ÅanÄoj}}',
# Special:ComparePages
-'comparepages' => 'Kompari paÄojn',
-'compare-selector' => 'Kompari reviziojn de paÄo',
-'compare-page1' => 'PaÄo 1',
-'compare-page2' => 'PaÄo 2',
-'compare-rev1' => 'Revizio 1',
-'compare-rev2' => 'Revizio 2',
-'compare-submit' => 'Komparu',
+'comparepages' => 'Kompari paÄojn',
+'compare-selector' => 'Kompari reviziojn de paÄo',
+'compare-page1' => 'PaÄo 1',
+'compare-page2' => 'PaÄo 2',
+'compare-rev1' => 'Revizio 1',
+'compare-rev2' => 'Revizio 2',
+'compare-submit' => 'Komparu',
+'compare-invalid-title' => 'La titolo kiun vi enmetis estas malvalida.',
+'compare-title-not-exists' => 'La titolo kiun vi specifis ne ekzistas.',
+'compare-revision-not-exists' => 'La revizio kiun vi specifis ne ekzistas.',
# Database error messages
'dberr-header' => 'Ĉi tiu vikio havas problemon',
@@ -3709,4 +3775,89 @@ Bildoj montriÄas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
'sqlite-has-fts' => '$1 kun tut-teksta subteno',
'sqlite-no-fts' => '$1 sen tut-teksta subteno',
+# New logging system
+'logentry-delete-delete' => '$1 forigis paÄon $3',
+'logentry-delete-restore' => '$1 restarigis paÄon $3',
+'logentry-delete-event' => '$1 ÅanÄis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
+'logentry-delete-revision' => '$1 ÅanÄis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paÄo $3: $4',
+'logentry-delete-event-legacy' => '$1 ÅanÄis vidiblecon de protokolaj eventoj en $3',
+'logentry-delete-revision-legacy' => '$1 ÅanÄis vidiblecon de revizioj en $3',
+'logentry-suppress-delete' => '$1 kaÅis paÄon $3',
+'logentry-suppress-event' => '$1 kaÅite ÅanÄis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
+'logentry-suppress-revision' => '$1 kaÅite ÅanÄis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paÄo $3: $4',
+'logentry-suppress-event-legacy' => '$1 kaÅite ÅanÄis vidiblecon de protokolaj eventoj en $3',
+'logentry-suppress-revision-legacy' => '$1 kaÅite ÅanÄis vidiblecon de revizioj en paÄo $3',
+'revdelete-content-hid' => 'enhavo kaÅita',
+'revdelete-summary-hid' => 'resumo de redakto kaÅita',
+'revdelete-uname-hid' => 'salutnomo kaÅita',
+'revdelete-content-unhid' => 'enhavo malkaÅita',
+'revdelete-summary-unhid' => 'resumo de redakto malkaÅita',
+'revdelete-uname-unhid' => 'salutnomo malkaÅita',
+'revdelete-restricted' => 'aplikis limojn al administrantoj',
+'revdelete-unrestricted' => 'forigis limojn por administrantoj',
+'logentry-move-move' => '$1 movis paÄon $3 al $4',
+'logentry-move-move-noredirect' => '$1 movis paÄon $3 al $4 sen lasante alidirektilon',
+'logentry-move-move_redir' => '$1 movis paÄon $3 al $4 anstataÅ­igante alidirektilon',
+'logentry-move-move_redir-noredirect' => '$1 movis paÄon $3 al $4 anstataÅ­igante alidirektilon sen lasante alidirektilon',
+'logentry-patrol-patrol' => '$1 markis revizion $4 de paÄo $3 kiel patrolita',
+'logentry-patrol-patrol-auto' => '$1 aÅ­tomate markis revizion $4 de paÄo $3 kiel patrolita',
+'logentry-newusers-newusers' => '$1 kreis salutnomon',
+'logentry-newusers-create' => '$1 kreis salutnomon',
+'logentry-newusers-create2' => '$1 kreis salutnomo $3',
+'logentry-newusers-autocreate' => 'Konto $1 estis kreita aÅ­tomate',
+'newuserlog-byemail' => 'pasvorto sendita retpoÅte',
+
+# Feedback
+'feedback-bugornote' => 'Se vi pretas priskribi teknikan problemon detale, bonvolu [$1 raporti cimon].
+AÅ­ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la paÄo "[$3 $2]", kune kun via salutnomo kaj uzita retumilo.',
+'feedback-subject' => 'Temo:',
+'feedback-message' => 'MesaÄo:',
+'feedback-cancel' => 'Nuligi',
+'feedback-submit' => 'Sendi MesaÄon',
+'feedback-adding' => 'Aldonanta respondon al la paÄo...',
+'feedback-error1' => 'Eraro: Nerekonita rezulto de API',
+'feedback-error2' => 'Eraro: La redakto malsukcesis',
+'feedback-error3' => 'Eraro: Neniu respondo de API',
+'feedback-thanks' => 'Dankon! Via opinio-esprimo estis afiÅita al la paÄo "[$2 $1]".',
+'feedback-close' => 'Farita',
+'feedback-bugcheck' => 'Bonega! Nur konfirmu ke Äi ne jam ekzistas inter la [$1 konataj cimoj].',
+'feedback-bugnew' => 'Mi konfirmis. Raportu novan cimon.',
+
+# API errors
+'api-error-badaccess-groups' => 'Vi ne havas permeson alÅuti dosierojn al tiu ĉi vikio.',
+'api-error-badtoken' => 'Interna eraro: fuÅaĵo.',
+'api-error-copyuploaddisabled' => 'AlÅuto per URL-adreso estas malebligata en tiu ĉi servilo.',
+'api-error-duplicate' => 'Jam estas {{PLURAL:$1|[$2 alia dosiero]|[$2 pluraj aliaj dosieroj]}} de sama enhavo en la retejo.',
+'api-error-duplicate-archive' => 'Jam estis {{PLURAL:$1|[$2 alia dosiero]|[$2 pluraj aliaj dosieroj]}} de sama enhavo en la retejo, sed {{PLURAL:$1|Äi estis forigita|ili estis forigitaj}}.',
+'api-error-duplicate-archive-popup-title' => 'Duoblaj {{PLURAL:$1|dosiero|dosieroj}} kiuj jam estas forigitaj',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duobla dosiero|Duoblaj dosieroj}}',
+'api-error-empty-file' => 'La dosiero kiun vi sendis estis malplena.',
+'api-error-fetchfileerror' => 'Interna eraro: io misfunkciis dum la dosiera prenado.',
+'api-error-file-too-large' => 'La dosiero kiun vi alÅutis estis tro granda.',
+'api-error-filename-tooshort' => 'La dosiernomo estas tro mallonga.',
+'api-error-filetype-banned' => 'Ĉi tiu tipo de dosiero estas malpermesita.',
+'api-error-filetype-missing' => 'Mankas sufikso de la dosiero.',
+'api-error-hookaborted' => 'La ÅanÄo kiun vi provis fari estis haltigita de etendaĵa hoko.',
+'api-error-http' => 'Interna eraro: ne eblas konektiÄi al la servilo.',
+'api-error-illegal-filename' => 'La dosiernomo ne estas permesata.',
+'api-error-internal-error' => 'Interna eraro: io misokazis en la prilaboro de via alÅuto en la vikio.',
+'api-error-invalid-file-key' => 'Interna eraro: la dosiero ne troveblis en la dumtempa stokejo.',
+'api-error-missingparam' => 'Interna eraro: mankantaj parametroj en la alÅutopeto.',
+'api-error-missingresult' => 'Interna eraro: ne eblis eltrovi ĉu la kopiado sukcesis.',
+'api-error-mustbeloggedin' => 'Vi devas esti ensalutinta por rajti alÅuti dosierojn.',
+'api-error-mustbeposted' => 'Interna eraro: la peto necesigas alÅuton en formato HTTP.',
+'api-error-noimageinfo' => 'La alÅuto sukcesis, sed la servilo ne donis ajnan informon pri la dosiero.',
+'api-error-nomodule' => 'Interna eraro: ne troveblas alÅuta helpilaro.',
+'api-error-ok-but-empty' => 'Interna eraro: nenia respondo de la servilo.',
+'api-error-overwrite' => 'AnstataÅ­igo de ekzistanta dosiero ne permesatas.',
+'api-error-stashfailed' => 'Interna eraro: la servilo malsukcesis stoki dumtempan dosieron.',
+'api-error-timeout' => 'La servilo ne respondis ene de la antaÅ­vidita tempo.',
+'api-error-unclassified' => 'Okazis nekonata eraro',
+'api-error-unknown-code' => 'Nekonata eraro: "$1"',
+'api-error-unknown-error' => 'Interna eraro: io misokazis en la alÅuto de via dosiero.',
+'api-error-unknown-warning' => 'Nekonata averto: $1',
+'api-error-unknownerror' => 'Nekonata eraro: "$1"',
+'api-error-uploaddisabled' => 'AlÅutato estas malebligata en tiu ĉi vikio.',
+'api-error-verification-error' => 'Tiu ĉi dosiero eble estas difektita, aÅ­ havas la malÄustan dosieran finaĵon.',
+
);
diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php
index 3925e2d1..72c1b0ff 100644
--- a/languages/messages/MessagesEs.php
+++ b/languages/messages/MessagesEs.php
@@ -11,8 +11,10 @@
* @author Alhen
* @author Alpertron
* @author Alvaro qc
+ * @author Armando-Martin
* @author Ascánder
* @author Baiji
+ * @author Bea.miau
* @author Bengoa
* @author Bernardom
* @author Better
@@ -71,6 +73,7 @@
* @author Vivaelcelta
* @author Wilfredor
* @author XalD
+ * @author XanaG
* @author לערי ריינה×רט
*/
@@ -109,12 +112,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'TodosLosMensajes' ),
'Allpages' => array( 'Todas', 'Todas_las_páginas' ),
'Ancientpages' => array( 'PáginasAntiguas', 'Páginas_antiguas' ),
+ 'Badtitle' => array( 'Título_incorrecto' ),
'Blankpage' => array( 'BlanquearPágina', 'Blanquear_página' ),
'Block' => array( 'Bloquear' ),
'Blockme' => array( 'Bloquearme' ),
'Booksources' => array( 'FuentesDeLibros', 'Fuentes_de_libros' ),
'BrokenRedirects' => array( 'RedireccionesRotas', 'Redirecciones_rotas' ),
'Categories' => array( 'Categorías' ),
+ 'ChangeEmail' => array( 'CambiarEmail', 'CambiarCorreo' ),
'ChangePassword' => array( 'Cambiar_contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear_contraseña' ),
'ComparePages' => array( 'CompararPáginas' ),
'Confirmemail' => array( 'ConfirmarEmail', 'Confirmar_e-mail' ),
@@ -124,6 +129,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'ContribucionesBorradas', 'Contribuciones_Borradas' ),
'Disambiguations' => array( 'Desambiguaciones', 'Desambiguación' ),
'DoubleRedirects' => array( 'RedireccionesDobles', 'Redirecciones_dobles' ),
+ 'EditWatchlist' => array( 'EditarSeguimiento' ),
'Emailuser' => array( 'MandarEmailUsuario' ),
'Export' => array( 'Exportar' ),
'Fewestrevisions' => array( 'MenosEdiciones', 'Menos_ediciones' ),
@@ -147,7 +153,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'BuscarPorMIME', 'Buscar_por_MIME' ),
'Mostcategories' => array( 'MásCategorizadas', 'Más_categorizadas' ),
'Mostimages' => array( 'MásImágenes', 'Con_más_imágenes' ),
- 'Mostlinked' => array( 'MásEnlazados', 'Más_enlazados' ),
+ 'Mostlinked' => array( 'MásEnlazados', 'Más_enlazados', 'MásEnlazadas' ),
'Mostlinkedcategories' => array( 'CategoríasMásUsadas', 'Categorías_más_usadas' ),
'Mostlinkedtemplates' => array( 'PlantillasMásUsadas', 'Plantillas_más_usadas' ),
'Mostrevisions' => array( 'MásEdiciones', 'Más_ediciones' ),
@@ -155,8 +161,10 @@ $specialPageAliases = array(
'Mycontributions' => array( 'MisContribuciones', 'Mis_contribuciones' ),
'Mypage' => array( 'MiPágina', 'Mi_página' ),
'Mytalk' => array( 'MiDiscusión', 'Mi_discusión' ),
+ 'Myuploads' => array( 'MisArchivosSubidos' ),
'Newimages' => array( 'NuevasImágenes', 'Nuevas_imágenes' ),
'Newpages' => array( 'PáginasNuevas', 'Páginas_nuevas' ),
+ 'PasswordReset' => array( 'RestablecerContraseña' ),
'Popularpages' => array( 'PáginasMásVisitadas', 'PáginasPopulares', 'Páginas_más_visitadas' ),
'Preferences' => array( 'Preferencias' ),
'Prefixindex' => array( 'PáginasPorPrefijo', 'Páginas_por_prefijo' ),
@@ -199,125 +207,125 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
- 'notoc' => array( '0', '__NOTDC__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__NOGALERÃA__', '__NOGALERIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
- 'toc' => array( '0', '__TDC__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MESACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MESACTUAL1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'GENERADORNOMBREMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMBREDÃAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'GENERADORNOMBREMESLOCAL', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ABREVIACIONMESLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'DIALOCAL2', 'DÃALOCAL2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMBREDIALOCAL', 'NOMBREDÃALOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'AÑOLOCAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'HORALOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'HORAMINUTOSLOCAL', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NÚMERODEPÃGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NÚMERODEARTÃCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NOMBREDEPAGINA', 'NOMBREDEPÃGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NOMBREDEPAGINAC', 'NOMBREDEPÃGINAC', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ESPACIODENOMBRE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÃCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÃCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÃGINAC', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÃGINAC', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NOMBREDEPAGINABASE', 'NOMBREDEPÃGINABASE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÃGINABASEC', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NOMBREDEPÃGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÃGINADISCUSIÓN', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NOMBREDEPÃGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÃGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'img_thumbnail' => array( '1', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'derecha', 'dcha', 'der', 'right' ),
- 'img_left' => array( '1', 'izquierda', 'izda', 'izq', 'left' ),
- 'img_none' => array( '1', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
- 'img_center' => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
- 'img_framed' => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
- 'img_page' => array( '1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'borde', 'border' ),
- 'img_link' => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NOMBREDESITIO', 'SITENAME' ),
- 'ns' => array( '0', 'EN:', 'NS:' ),
- 'localurl' => array( '0', 'URLLOCAL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
- 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
- 'servername' => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'RUTAESTILO', 'RUTADEESTILO', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMATICA:', 'GRAMÃTICA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÃTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SEMANAACTUAL', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÃADESEMANAACTUAL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÃADESEMANALOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DIADEREVISION', 'DIAREVISION', 'DÃADEREVISIÓN', 'DÃAREVISIÓN', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DIADEREVISION2', 'DIAREVISION2', 'DÃADEREVISIÓN2', 'DÃAREVISIÓN2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MINUS:', 'MINÚS:', 'LC:' ),
- 'uc' => array( '0', 'MAYUS:', 'MAYÚS:', 'UC:' ),
- 'displaytitle' => array( '1', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__VINCULARANUEVASECCION__', 'VÃNCULARANUEVASECCIÓN__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__NOVINCULARANUEVASECCION__', 'NOVÃNCULARANUEVASECCIÓN__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'CODIFICARURL:', 'URLENCODE:' ),
- 'currenttimestamp' => array( '1', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'numberofadmins' => array( '1', 'NÚMEROADMINIISTRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
- 'special' => array( '0', 'especial', 'special' ),
- 'defaultsort' => array( '1', 'ORDENAR:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
- 'tag' => array( '0', 'etiqueta', 'ETIQUETA', 'tag' ),
- 'hiddencat' => array( '1', '__CATEGORÃAOCULTA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PÃGINASENCATEGORÃA', 'PÃGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TAMAÑOPÃGINA', 'TAMAÑODEPÃGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEXAR__', '__INDEX__' ),
- 'noindex' => array( '1', '__NOINDEXAR__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÃTICA__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+ 'notoc' => array( '0', '__NOTDC__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__NOGALERÃA__', '__NOGALERIA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__TDC__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MESACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MESACTUAL1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'MESACTUALCOMPLETO', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN', 'GENERADORNOMBREMESACTUAL' ),
+ 'currentmonthabbrev' => array( '1', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV', 'ABREVIACIONNOMBREMESACTUAL' ),
+ 'currentday' => array( '1', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMBREDÃAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTHOUR', 'HORA_MINUTOS_ACTUAL' ),
+ 'localmonth' => array( '1', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'MESLOCALCOMPLETO', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN', 'GENERADORNOMBREMESLOCAL' ),
+ 'localmonthabbrev' => array( '1', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV', 'ABREVIACIONMESLOCAL' ),
+ 'localday' => array( '1', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'DIALOCAL2', 'DÃALOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMBREDIALOCAL', 'NOMBREDÃALOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'AÑOLOCAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME', 'HORALOCAL' ),
+ 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR', 'HORAMINUTOSLOCAL' ),
+ 'numberofpages' => array( '1', 'NÚMERODEPÃGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NÚMERODEARTÃCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NOMBREDEPAGINA', 'NOMBREDEPÃGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NOMBREDEPAGINAC', 'NOMBREDEPÃGINAC', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÃCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÃCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NOMBRECOMPLETODEPÃGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÃGINAC', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÃGINAC', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NOMBREDEPAGINABASE', 'NOMBREDEPÃGINABASE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÃGINABASEC', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NOMBREDEPÃGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÃGINADISCUSIÓN', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NOMBREDEPÃGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÃGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'MSJ:', 'MSG:' ),
+ 'img_thumbnail' => array( '1', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'derecha', 'dcha', 'der', 'right' ),
+ 'img_left' => array( '1', 'izquierda', 'izda', 'izq', 'left' ),
+ 'img_none' => array( '1', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+ 'img_center' => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
+ 'img_page' => array( '1', 'pagina=$1', 'página=$1', 'pagina_$1', 'página $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'borde', 'border' ),
+ 'img_link' => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NOMBREDELSITIO', 'SITENAME', 'NOMBREDESITIO' ),
+ 'ns' => array( '0', 'EN:', 'NS:' ),
+ 'localurl' => array( '0', 'URLLOCAL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
+ 'servername' => array( '0', 'NOMBRESERVIDOR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'RUTAESTILO', 'RUTADEESTILO', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMATICA:', 'GRAMÃTICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÃTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SEMANAACTUAL', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÃADESEMANAACTUAL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÃADESEMANALOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DIADEREVISION', 'DIAREVISION', 'DÃADEREVISIÓN', 'DÃAREVISIÓN', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DIADEREVISION2', 'DIAREVISION2', 'DÃADEREVISIÓN2', 'DÃAREVISIÓN2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
+ 'fullurl' => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLCOMPLETAC:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MINUS:', 'MINÚS:', 'LC:' ),
+ 'uc' => array( '0', 'MAYUS:', 'MAYÚS:', 'UC:' ),
+ 'displaytitle' => array( '1', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__VINCULARANUEVASECCION__', 'VÃNCULARANUEVASECCIÓN__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__NOVINCULARANUEVASECCION__', 'NOVÃNCULARANUEVASECCIÓN__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'CODIFICARURL:', 'URLENCODE:' ),
+ 'currenttimestamp' => array( '1', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'numberofadmins' => array( '1', 'NÚMEROADMINIISTRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
+ 'special' => array( '0', 'especial', 'special' ),
+ 'defaultsort' => array( '1', 'ORDENAR:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'etiqueta', 'ETIQUETA', 'tag' ),
+ 'hiddencat' => array( '1', '__CATEGORÃAOCULTA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PÃGINASENCATEGORÃA', 'PÃGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TAMAÑOPÃGINA', 'TAMAÑODEPÃGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEXAR__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NOINDEXAR__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÃTICA__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formatodefecha', 'formatearfecha', 'formatdate', 'dateformat' ),
);
$datePreferences = false;
@@ -690,21 +698,23 @@ Por favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de
'badarticleerror' => 'Esta acción no se puede llevar a cabo en esta página.',
'cannotdelete' => 'La página o archivo «$1» no se pudo borrar.
Puede que ya haya sido borrado por alguien más.',
+'cannotdelete-title' => 'No se pudede borrar 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.',
-'perfcached' => 'Los siguientes datos están en caché y por tanto pueden estar desactualizados:',
-'perfcachedts' => 'Estos datos están almacenados. Su última actualización fue el $1.',
+'perfcached' => 'Los siguientes datos provienen de la caché y pueden no estar actualizados. La caché puede contener {{PLURAL:$1|un resultado|$1 resultados}} como máximo.',
+'perfcachedts' => 'Los siguientes datos provienen de la caché y su última fecha y hora de actualización es: $1. La caché puede contener {{PLURAL:$4|un resultado|$4 resultados}} como máximo.',
'querypage-no-updates' => 'Actualmente las actualizaciones de esta página están desactivadas. Estos datos no serán actualizados a corto plazo.',
'wrong_wfQuery_params' => 'Parámetros incorrectos para wfQuery()<br />
Función: $1<br />
Consulta: $2',
'viewsource' => 'Ver fuente',
-'viewsourcefor' => 'para $1',
+'viewsource-title' => 'Ver el código fuente de «$1»',
'actionthrottled' => 'Acción bloqueada',
'actionthrottledtext' => "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
'protectedpagetext' => 'Esta página ha sido protegida para evitar su edición.',
'viewsourcetext' => 'Puedes ver y copiar el código fuente de esta página:',
+'viewyourtext' => "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
'protectedinterface' => 'Esta página provee texto del interfaz del software, y está protegida para evitar vandalismos.',
'editinginterface' => "'''Aviso:''' Estás editando una página usada para proporcionar texto de interfaz para el software. Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios. Para traducciones, por favor considera usar [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], el proyecto de regionalización de MediaWiki.",
'sqlhidden' => '(Consulta SQL oculta)',
@@ -808,6 +818,7 @@ Hasta que lo hagas, las siguientes funciones no estarán disponibles.',
'emailconfirmlink' => 'Confirmar dirección de correo electrónico',
'invalidemailaddress' => 'La dirección electrónica no puede ser aceptada, pues parece que tiene un formato no válido.
Por favor, escribe una dirección en el formato adecuado o deja el campo en blanco.',
+'cannotchangeemail' => 'Las direcciones de la correo electrónico de las cuentas de usuario no puedes cambiarse en esta wiki.',
'accountcreated' => 'Cuenta creada',
'accountcreatedtext' => 'La cuenta de usuario para $1 ha sido creada.',
'createaccount-title' => 'Creación de cuenta para {{SITENAME}}',
@@ -823,6 +834,7 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
# E-mail sending
'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP',
+'user-mail-no-addy' => 'Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.',
# Change password dialog
'resetpass' => 'Cambiar la contraseña',
@@ -845,16 +857,18 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
'resetpass-temp-password' => 'Contraseña temporal:',
# Special:PasswordReset
-'passwordreset' => 'Restablecimiento de contraseña',
-'passwordreset-text' => 'Completa este formulario para recibir un recordatorio por correo electrónico de los detalles de tu cuenta.',
-'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-username' => 'Nombre de usuario:',
-'passwordreset-domain' => 'Dominio:',
-'passwordreset-email' => 'Dirección de correo electrónico:',
-'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguien (probablemente tú, desde la dirección IP $1) pidió un recordatorio de tus
+'passwordreset' => 'Restablecimiento de contraseña',
+'passwordreset-text' => 'Completa este formulario para recibir un recordatorio por correo electrónico de los detalles de tu cuenta.',
+'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-username' => 'Nombre de usuario:',
+'passwordreset-domain' => 'Dominio:',
+'passwordreset-capture' => '¿Ver el mensaje resultante?',
+'passwordreset-capture-help' => 'Si marcas esta casilla, se te mostrará el correo electrónico (con la contraseña temporal) además de enviarse al usuario.',
+'passwordreset-email' => 'Dirección de correo electrónico:',
+'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Alguien (probablemente tú, desde la dirección IP $1) pidió un recordatorio de tus
datos de cuenta para {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}
con esta dirección de correo electrónico:
@@ -864,7 +878,7 @@ $2
Deberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,
o recuerdas tu contraseña original, y no deseas cambiarla, puedes
ignorar este mensaje y continuar usando tu contraseña anterior.',
-'passwordreset-emailtext-user' => 'El usuario $1 en {{SITENAME}} pidió un recordatorio de tus datos de cuenta para {{SITENAME}}
+'passwordreset-emailtext-user' => 'El usuario $1 en {{SITENAME}} pidió un recordatorio de tus datos de cuenta para {{SITENAME}}
($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:
$2
@@ -873,9 +887,22 @@ $2
Deberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,
o recuerdas tu contraseña original, y no deseas cambiarla, puedes
ignorar este mensaje y continuar usando tu contraseña anterior.',
-'passwordreset-emailelement' => 'Nombre de usuario: $1
+'passwordreset-emailelement' => 'Nombre de usuario: $1
Contraseña temporal: $2',
-'passwordreset-emailsent' => 'Se ha enviado un correo electrónico de recordatorio.',
+'passwordreset-emailsent' => 'Se ha enviado un correo electrónico de recordatorio.',
+'passwordreset-emailsent-capture' => 'Un recordatorio por correo electrónico ha sido enviado, que 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Cambiar la dirección de correo-e',
+'changeemail-header' => 'Cambiar la dirección de correo-e de la cuenta',
+'changeemail-text' => 'Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.',
+'changeemail-no-info' => 'Debes iniciar sesión para acceder directamente a esta página.',
+'changeemail-oldemail' => 'Dirección de correo-e actual:',
+'changeemail-newemail' => 'Nueva dirección de correo-e:',
+'changeemail-none' => '(ninguna)',
+'changeemail-submit' => 'Cambiar correo-e',
+'changeemail-cancel' => 'Cancelar',
# Edit page toolbar
'bold_sample' => 'Texto en negrita',
@@ -946,9 +973,6 @@ No puedes utilizar la función «enviar correo electrónico a este usuario» a
Tu actual dirección IP es $3, y el identificador del bloqueo es #$5.
Por favor incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
'blockednoreason' => 'no se ha especificado el motivo',
-'blockedoriginalsource' => "El código fuente de '''$1''' se muestra a continuación:",
-'blockededitsource' => "El texto de '''tus ediciones''' a '''$1''' se muestran a continuación:",
-'whitelistedittitle' => 'Se requiere identificación para editar.',
'whitelistedittext' => 'Tienes que $1 para editar artículos.',
'confirmedittext' => 'Debes confirmar tu dirección electrónica antes de editar páginas. Por favor, establece y valida una dirección electrónica a través de tus [[Special:Preferences|preferencias de usuario]].',
'nosuchsectiontitle' => 'Sección no encontrada',
@@ -1030,7 +1054,8 @@ Si la guardas, se perderán los cambios realizados desde esta revisión.",
'copyrightwarning' => "Por favor observa que todas las contribuciones a {{SITENAME}} se consideran hechas públicas bajo la $2 (véase $1 para más detalles). Si no deseas la modificación y distribución libre de tu obra, entonces no la pongas aquí.<br />También nos aseguras que tú escribiste esto y te pertenecen de los derechos de autor, o lo copiaste desde el dominio público u otra fuente libre. '''¡No uses escritos con copyright sin permiso!'''",
'copyrightwarning2' => "Por favor, ten en cuenta que todas las contribuciones a {{SITENAME}} pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, entonces no las pongas aquí.<br />También nos aseguras que tú escribiste esto y te pertenecen de los derechos de autor, o lo copiaste desde el dominio público u otra fuente libre. (véase $1 para más detalles).
'''¡No uses escritos con copyright sin permiso!'''",
-'longpageerror' => "'''Error: El texto que has enviado ocupa $1 kilobytes, que excede el máximo de $2 kilobytes. No se puede guardar.'''",
+'longpageerror' => "'''Error: El texto que has enviado ocupa {{PLURAL:$1|un kilobyte|$1 kilobytes}}, que excede el máximo de {{PLURAL:$2|un kilobyte|$2 kilobytes}}.'''
+No se lo puede guardar.",
'readonlywarning' => "'''Aviso: La base de datos ha sido bloqueada por cuestiones de mantenimiento, así que no podrás guardar tus modificaciones en este momento.
Puedes copiar y pegar el texto en un archivo y guardarlo para más tarde.'''
@@ -1199,8 +1224,6 @@ Otros administradores de {{SITENAME}} aún podrán acceder al contenido oculto y
'revdelete-unsuppress' => 'Eliminar restricciones de revisiones restauradas',
'revdelete-log' => 'Motivo:',
'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la revisión seleccionada|las revisiones seleccionadas}}',
-'revdelete-logentry' => 'cambió la visibilidad de revisiones de [[$1]]',
-'logdelete-logentry' => 'cambió la visibilidad de eventos de [[$1]]',
'revdelete-success' => "'''La visibilidad de revisiones ha sido cambiada correctamente.'''",
'revdelete-failure' => "'''La visibilidad de la revisión no pudo ser establecida:'''
$1",
@@ -1212,15 +1235,6 @@ $1",
'revdel-restore-visible' => 'revisiones visibles',
'pagehist' => 'Historial de la página',
'deletedhist' => 'Historial borrado',
-'revdelete-content' => 'contenido',
-'revdelete-summary' => 'resumen de edición',
-'revdelete-uname' => 'nombre de usuario',
-'revdelete-restricted' => 'restricciones para administradores aplicadas',
-'revdelete-unrestricted' => 'restricciones para administradores eliminadas',
-'revdelete-hid' => 'ocultó $1',
-'revdelete-unhid' => 'mostró $1',
-'revdelete-log-message' => '$1 para $2 {{PLURAL:$2|revisión|revisiones}}',
-'logdelete-log-message' => '$1 de $2 {{PLURAL:$2|evento|eventos}}',
'revdelete-hide-current' => 'Error al ocultar el objeto de fecha $1 a las $2: es la revisión actual.
No puede ser ocultada.',
'revdelete-show-no-access' => 'Error mostrando el objeto de fecha $2, $1: este objeto ha sido marcado como "restringido".
@@ -1379,12 +1393,14 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
'prefs-rc' => 'Cambios recientes',
'prefs-watchlist' => 'Seguimiento',
'prefs-watchlist-days' => 'Número de días a mostrar en la lista de seguimiento:',
-'prefs-watchlist-days-max' => 'Máximo 7 días',
+'prefs-watchlist-days-max' => 'Máximo $1 {{PLURAL:$1|día|días}}',
'prefs-watchlist-edits' => 'Número de ediciones a mostrar en la lista expandida:',
'prefs-watchlist-edits-max' => 'Máximo: 1000',
'prefs-watchlist-token' => 'Ficha de lista de seguimiento:',
'prefs-misc' => 'Miscelánea',
'prefs-resetpass' => 'Cambiar contraseña',
+'prefs-changeemail' => 'Cambiar correo-e',
+'prefs-setemail' => 'Establecer una dirección de correo-e',
'prefs-email' => 'Opciones de correo electrónico',
'prefs-rendering' => 'Apariencia',
'saveprefs' => 'Guardar',
@@ -1443,6 +1459,7 @@ Esto no se puede deshacer.',
'yourrealname' => 'Nombre real:',
'yourlanguage' => 'Idioma:',
'yourvariant' => 'Variante lingüística del contenido:',
+'prefs-help-variant' => 'Tu variante u ortografía preferida para mostrar las páginas de contenido de este wiki.',
'yournick' => 'Nueva firma:',
'prefs-help-signature' => 'Los comentarios en páginas de discusión deberían firmarse con «<nowiki>~~~~</nowiki>», que se convertirá en tu firma con fecha y hora.',
'badsig' => 'El código de tu firma no es válido; comprueba las etiquetas HTML.',
@@ -1482,7 +1499,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'userrights-lookup-user' => 'Configurar grupos de usuarios',
'userrights-user-editname' => 'Escriba un nombre de usuario:',
'editusergroup' => 'Modificar grupos de usuarios',
-'editinguser' => "Cambiando los derechos del usuario '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] {{int:pipe-separator}} [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Cambiando los derechos del usuario '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Modificar grupos de usuarios',
'saveusergroups' => 'Guardar grupos de usuarios',
'userrights-groupsmember' => 'Miembro de:',
@@ -1576,13 +1593,13 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'right-autopatrol' => 'Marcar como patrulladas sus ediciones automáticamente',
'right-patrolmarks' => 'Ver las marcas de patrullaje de cambios recientes',
'right-unwatchedpages' => 'Ver una lista de páginas no vigiladas',
-'right-trackback' => "Enviar un ''trackback''",
'right-mergehistory' => 'Fusionar historiales',
'right-userrights' => 'Modificar todos los derechos de usuario',
'right-userrights-interwiki' => 'Modificar los derechos de usuarios en otros wikis',
'right-siteadmin' => 'Bloquear y desbloquear la base de datos',
'right-override-export-depth' => 'Exporta páginas incluyendo aquellas enlazadas hasta una profundidad de 5',
'right-sendemail' => 'Enviar un correo electrónico a otros usuarios',
+'right-passwordreset' => 'Ver os correos electrónicos de restablecimiento de contraseñas',
# User rights log
'rightslog' => 'Cambios de perfil de usuario',
@@ -1616,16 +1633,17 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'action-suppressionlog' => 'ver este registro privado',
'action-block' => 'bloquear a este usuario para que no edite',
'action-protect' => 'cambiar los niveles de protección para esta página',
+'action-rollback' => 'revertir rápidamente las ediciones del último usuario que modificó una página en particular',
'action-import' => 'importar esta página desde otro wiki',
'action-importupload' => 'importar esta página mediante la carga de un archivo',
'action-patrol' => 'marcar ediciones de otros como patrulladas',
'action-autopatrol' => 'marcar como patrulladas tus propias ediciones',
'action-unwatchedpages' => 'ver la lista de páginas no vigiladas',
-'action-trackback' => 'enviar una notificación de enlace',
'action-mergehistory' => 'fusionar el historial de esta página',
'action-userrights' => 'modificar todos los derechos de usuario',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cambio|cambios}}',
@@ -1657,6 +1675,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usuario|usuarios}} vigilando]',
'rc_categories' => 'Limitar a las categorías (separadas por «|»)',
'rc_categories_any' => 'Cualquiera',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} después del cambio',
'newsectionsummary' => 'Nueva sección: /* $1 */',
'rc-enhanced-expand' => 'Mostrar detalles (requiere JavaScript)',
'rc-enhanced-hide' => 'Ocultar detalles',
@@ -1710,6 +1729,7 @@ Mira la [[Special:NewFiles|galería de archivos nuevos]] para una descripción v
'ignorewarnings' => 'Ignorar cualquier aviso',
'minlength1' => 'Los nombres de archivo deben tener al menos una letra.',
'illegalfilename' => 'El nombre de archivo «$1» contiene caracteres que no están permitidos en títulos de páginas. Por favor, renombra el archivo e intenta volver a subirlo.',
+'filename-toolong' => 'Los nombres de archivo no pueden tener más de 240 bytes.',
'badfilename' => 'El nombre de la imagen se ha cambiado a «$1».',
'filetype-mime-mismatch' => 'La extensión de archivo «.$1» no coincide con el tipo detectado de MIME del archivo ($2).',
'filetype-badmime' => 'No se permite subir archivos de tipo MIME «$1».',
@@ -1800,6 +1820,41 @@ $1',
'upload-unknown-size' => 'Tamaño desconocido',
'upload-http-error' => 'Ha ocurrido un error HTTP: $1',
+# File backend
+'backend-fail-stream' => 'No se pudo transmitir el archivo «$1».',
+'backend-fail-backup' => 'No pudo hacer copia de seguridad del archivo «$1».',
+'backend-fail-notexists' => 'El archivo $1 no existe.',
+'backend-fail-hashes' => 'No se pudieron obtener los hashes de los ficheros para compararlos.',
+'backend-fail-notsame' => 'Ya existe un fichero distinto en $1.',
+'backend-fail-invalidpath' => '$1 no es una ruta de almacenamiento válida',
+'backend-fail-delete' => 'No se pudo borrar el archivo «$1».',
+'backend-fail-alreadyexists' => 'El archivo $1 ya existe.',
+'backend-fail-store' => 'No se pudo almacenar el archivo $1 en $2.',
+'backend-fail-copy' => 'No se pudo copiar el archivo $1 a $2.',
+'backend-fail-move' => 'No se pudo mover el archivo $1 a $2.',
+'backend-fail-opentemp' => 'No se pudo crear archivo temporal.',
+'backend-fail-writetemp' => 'No se pudo escribir en el archivo temporal.',
+'backend-fail-closetemp' => 'No se pudo cerrar el archivo temporal.',
+'backend-fail-read' => 'No se pudo leer el archivo «$1».',
+'backend-fail-create' => 'No se pudo crear el archivo «$1».',
+'backend-fail-readonly' => 'El servidor (back-end) de almacenamiento "$1" está actualmente en estado de sólo lectura. La razón aducida fue: "$2"',
+'backend-fail-synced' => 'El archivo "$1" se encuentra en un estado incoherente dentro de los servidores (backends) de almacenamiento interno',
+'backend-fail-connect' => 'No se pudo conectar al servidor (backend) de almacenamiento "$1".',
+'backend-fail-internal' => 'Se ha producido un error desconocido en el servidor (backend) de almacenamiento "$1".',
+'backend-fail-contenttype' => 'No se pudo determinar el tipo de contenido del archivo a guardar en " $1 ".',
+'backend-fail-batchsize' => 'El servidor (back-end) de almacenamiento ha suministrado un lote de $1 {{PLURAL:$1|operación|operaciones}} de archivo; el límite es de $2 {{PLURAL:$2|operación|operaciones}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'No se pudo desbloquear "$1": no se encontraba bloqueado.',
+'lockmanager-fail-closelock' => 'No se pudo cerrar la referencia para el archivo de bloqueo de "$1".',
+'lockmanager-fail-deletelock' => 'No se pudo eliminar el archivo de bloqueo para "$1".',
+'lockmanager-fail-acquirelock' => 'No pudo adquirir el bloqueo para "$1".',
+'lockmanager-fail-openlock' => 'No se pudo abrir el archivo de bloqueo para "$1".',
+'lockmanager-fail-releaselock' => 'No se pudo liberar el bloqueo de "$1".',
+'lockmanager-fail-db-bucket' => 'No se pudo contactar con las suficientes bases de datos del conjunto $1.',
+'lockmanager-fail-db-release' => 'No se pudieron liberar los bloqueos registrados en la base de datos $1.',
+'lockmanager-fail-svr-release' => 'No se pudieron liberar los bloqueos registrados en el servidor $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Se encontró un error al abrir el archivo ZIP para su comprobación.',
'zip-wrong-format' => 'El archivo especificado no es un archivo ZIP.',
@@ -1816,6 +1871,7 @@ No puede comprobarse adecuadamente su seguridad.',
'uploadstash-badtoken' => 'No fue posible ejecutar esa operación, tal vez porque sus credenciales de edición expiraron. Reinténtelo.',
'uploadstash-errclear' => 'El borrado de los archivos no tuvo éxito.',
'uploadstash-refresh' => 'Actualizar la lista de archivos',
+'invalid-chunk-offset' => 'Desplazamiento inválido del fragmento',
# img_auth script messages
'img-auth-accessdenied' => 'Acceso denegado',
@@ -1923,23 +1979,24 @@ La descripción en su [$2 página de descripción del archivo] está mostrada de
'filerevert-badversion' => 'No existe version local previa de este archivo con esa marca de tiempo.',
# File deletion
-'filedelete' => 'Borrar $1',
-'filedelete-legend' => 'Borrar archivo',
-'filedelete-intro' => "Estás borrando el archivo '''[[Media:$1|$1]]''' así como todo su historial.",
-'filedelete-intro-old' => "Estás borrando la versión de '''[[Media:$1|$1]]''' del [$4 $2 a las $3].",
-'filedelete-comment' => 'Motivo:',
-'filedelete-submit' => 'Eliminar',
-'filedelete-success' => "'''$1''' ha sido borrado.",
-'filedelete-success-old' => "La version de '''[[Media:$1|$1]]''' del $2 a las $3 ha sido borrada.",
-'filedelete-nofile' => "'''$1''' no existe.",
-'filedelete-nofile-old' => "No existe una versión guardada de '''$1''' con los atributos especificados.",
-'filedelete-otherreason' => 'Otra razón:',
-'filedelete-reason-otherlist' => 'Otra razón',
-'filedelete-reason-dropdown' => '*Razones de borrado habituales
+'filedelete' => 'Borrar $1',
+'filedelete-legend' => 'Borrar archivo',
+'filedelete-intro' => "Estás borrando el archivo '''[[Media:$1|$1]]''' así como todo su historial.",
+'filedelete-intro-old' => "Estás borrando la versión de '''[[Media:$1|$1]]''' del [$4 $2 a las $3].",
+'filedelete-comment' => 'Motivo:',
+'filedelete-submit' => 'Eliminar',
+'filedelete-success' => "'''$1''' ha sido borrado.",
+'filedelete-success-old' => "La version de '''[[Media:$1|$1]]''' del $2 a las $3 ha sido borrada.",
+'filedelete-nofile' => "'''$1''' no existe.",
+'filedelete-nofile-old' => "No existe una versión guardada de '''$1''' con los atributos especificados.",
+'filedelete-otherreason' => 'Otra razón:',
+'filedelete-reason-otherlist' => 'Otra razón',
+'filedelete-reason-dropdown' => '*Razones de borrado habituales
** Violación de copyright
** Archivo duplicado',
-'filedelete-edit-reasonlist' => 'Edita los motivos del borrado',
-'filedelete-maintenance' => 'Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.',
+'filedelete-edit-reasonlist' => 'Edita los motivos del borrado',
+'filedelete-maintenance' => 'Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.',
+'filedelete-maintenance-title' => 'No se puede eliminar el archivo',
# MIME search
'mimesearch' => 'Búsqueda MIME',
@@ -2037,6 +2094,8 @@ Las entradas <del>tachadas</del> han sido resueltas.',
'wantedpages' => 'Páginas requeridas',
'wantedpages-badtitle' => 'Título inválido en conjunto de resultados: $1',
'wantedfiles' => 'Ficheros requeridos',
+'wantedfiletext-cat' => 'Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>. De igual manera, las páginas que incluyen archivos inexistentes se enumeran en [[:$1]].',
+'wantedfiletext-nocat' => 'Los siguientes archivos están en uso, pero no existen. Es posible que algunos de ellos estén almacenados en repositorios externos y se hayan incluido aquí por error; dichas entradas aparecen <del>tachadas</del>.',
'wantedtemplates' => 'Plantillas requeridas',
'mostlinked' => 'Artículos más enlazados',
'mostlinkedcategories' => 'Categorías más enlazadas',
@@ -2045,6 +2104,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
'mostimages' => 'Imágenes más usadas',
'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)',
'shortpages' => 'Páginas cortas',
'longpages' => 'Páginas largas',
'deadendpages' => 'Páginas sin salida',
@@ -2061,7 +2121,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
'listusers-editsonly' => 'Muestra sólo usuarios con ediciones',
'listusers-creationsort' => 'Ordenado por fecha de creación',
'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
-'usercreated' => 'Creado el $1 en $2',
+'usercreated' => '{{GENDER:$3|Registrado|Registrada}} el $1 a las $2',
'newpages' => 'Páginas nuevas',
'newpages-username' => 'Nombre de usuario',
'ancientpages' => 'Artículos más antiguos',
@@ -2154,12 +2214,8 @@ Protocolos soportados: <tt>$1</tt> (no añada ninguno de estos en su búsqueda).
'activeusers-noresult' => 'No se encontraron usuarios.',
# Special:Log/newusers
-'newuserlogpage' => 'Registro de creación de usuarios',
-'newuserlogpagetext' => 'Este es un registro de creación de usuarios.',
-'newuserlog-byemail' => 'contraseña enviada por correo electrónico',
-'newuserlog-create-entry' => 'Usuario nuevo',
-'newuserlog-create2-entry' => 'Nueva cuenta creada $1',
-'newuserlog-autocreate-entry' => 'Cuenta creada automáticamente',
+'newuserlogpage' => 'Registro de creación de usuarios',
+'newuserlogpagetext' => 'Este es un registro de creación de usuarios.',
# Special:ListGroupRights
'listgrouprights' => 'Permisos del grupo de usuarios',
@@ -2188,7 +2244,7 @@ Puede haber información adicional sobre privilegios individuales en [[{{MediaWi
'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a este usuario.
La dirección electrónica que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el remitente para que el destinatario pueda responderte.',
'usermailererror' => 'El sistema de correo devolvió un error:',
-'defemailsubject' => 'Correo de {{SITENAME}}',
+'defemailsubject' => 'Correo de {{SITENAME}} para el usuario $1',
'usermaildisabled' => 'Correo electrónico del usuario deshabilitado',
'usermaildisabledtext' => 'No puedes enviar correos electrónicos a otros usuarios en esta wiki',
'noemailtitle' => 'No hay dirección de correo electrónico',
@@ -2241,7 +2297,7 @@ La dirección electrónica que indicaste en [[Special:Preferences|tus preferenci
'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}}.',
'iteminvalidname' => "Problema con el artículo '$1', nombre inválido...",
-'wlnote' => "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos '''$1''' cambios}} en {{PLURAL:$2|la última hora|las últimas '''$2''' horas}}.",
+'wlnote' => "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos '''$1''' cambios}} en {{PLURAL:$2|la última hora|las últimas '''$2''' horas}} a fecha de $4 $3.",
'wlshowlast' => 'Ver los cambios de las últimas $1 horas, $2 días $3',
'watchlist-options' => 'Opciones de la lista de seguimiento',
@@ -2305,8 +2361,6 @@ consecuencias, y que lo estás haciendo de acuerdo con [[{{MediaWiki:Policy-url}
'actionfailed' => 'Acción fallida',
'deletedtext' => '«$1» ha sido borrado.
Véase $2 para un registro de los borrados recientes.',
-'deletedarticle' => 'borró «[[$1]]»',
-'suppressedarticle' => 'suprimió «[[$1]]»',
'dellogpage' => 'Registro de borrados',
'dellogpagetext' => 'A continuación se muestra una lista de los borrados más recientes.',
'deletionlog' => 'registro de borrados',
@@ -2353,7 +2407,10 @@ Véase [[Special:ProtectedPages|la lista de páginas protegidas]] para ver las p
'unprotectedarticle' => 'desprotegió «[[$1]]»',
'movedarticleprotection' => 'cambiadas protecciones de «[[$2]]» a «[[$1]]»',
'protect-title' => 'Cambiando el nivel de protección de «$1»',
+'protect-title-notallowed' => 'Ver el nivel de protección de «$1»',
'prot_1movedto2' => 'heredando la protección al trasladar [[$1]] a [[$2]]',
+'protect-badnamespace-title' => 'Espacio de nombres no protegible',
+'protect-badnamespace-text' => 'Las páginas de este espacio de nombres no pueden ser protegidas',
'protect-legend' => 'Confirmar protección',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Caducidad:',
@@ -2373,6 +2430,7 @@ A continuación se muestran las opciones actuales de la página '''$1''':",
'protect-level-sysop' => 'Solo administradores',
'protect-summary-cascade' => 'en cascada',
'protect-expiring' => 'caduca el $1 (UTC)',
+'protect-expiring-local' => 'caduca el $1',
'protect-expiry-indefinite' => 'indefinido',
'protect-cascade' => 'Protección en cascada - proteger todas las páginas incluidas en ésta.',
'protect-cantedit' => 'No puedes cambiar el nivel de protección porque no tienes permiso para hacer ediciones.',
@@ -2429,7 +2487,6 @@ o a que la revisión haya sido restaurada o eliminada del archivo.',
'undeletereset' => 'Cancelar',
'undeleteinvert' => 'Invertir selección',
'undeletecomment' => 'Razón:',
-'undeletedarticle' => 'restauró «[[$1]]»',
'undeletedrevisions' => '{{PLURAL:$1|Una edición restaurada|$1 ediciones restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|ediciones restauradas y $2 archivo restaurado|ediciones y $2 archivos restaurados}}',
'undeletedfiles' => '$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}',
@@ -2439,6 +2496,7 @@ alguien más puede haber deshecho el borrado antes.',
Consulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
'undelete-header' => 'En el [[Special:Log/delete|registro de borrados]] se listan las páginas eliminadas.',
+'undelete-search-title' => 'Buscar páginas borradas',
'undelete-search-box' => 'Buscar páginas borradas',
'undelete-search-prefix' => 'Mostrar páginas que empiecen por:',
'undelete-search-submit' => 'Buscar',
@@ -2448,6 +2506,7 @@ Consulta el [[Special:Log/delete|registro de borrados]] para ver una lista de lo
'undelete-cleanup-error' => 'Error al borrar el archivo no utilizado "$1".',
'undelete-missing-filearchive' => 'No se ha podido restaurar el archivo de ID $1 debido a que no está en la base de datos.
Puede que ya haya sido restaurado.',
+'undelete-error' => 'Error restaurando la página',
'undelete-error-short' => 'Error restaurando archivo: $1',
'undelete-error-long' => 'Se encontraron errores mientras se restauraba el archivo:
@@ -2568,6 +2627,7 @@ Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
'blocklist-userblocks' => 'Ocultar bloqueos de cuenta',
'blocklist-tempblocks' => 'Ocultar bloqueos temporales',
'blocklist-addressblocks' => 'Ocultar bloqueos de una sola dirección IP',
+'blocklist-rangeblocks' => 'Ocultar bloqueos de rango',
'blocklist-timestamp' => 'Marca de tiempo',
'blocklist-target' => 'Destino',
'blocklist-expiry' => 'Caduca',
@@ -2590,6 +2650,7 @@ Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
'unblocklink' => 'desbloquear',
'change-blocklink' => 'cambiar bloqueo',
'contribslink' => 'contribuciones',
+'emaillink' => 'enviar correo electrónico',
'autoblocker' => 'Has sido bloqueado automáticamente porque tu dirección IP ha sido usada recientemente por «[[User:$1|$1]]». La razón dada para bloquear a «[[User:$1|$1]]» fue «$2».',
'blocklogpage' => 'Registro de bloqueos',
'blocklog-showlog' => 'Este usuario ha sido bloqueado previamente. Debajo se provee el registro de bloqueos para mayor referencia:',
@@ -2710,9 +2771,6 @@ Por favor, elige otro nombre.',
'movepage-page-moved' => 'La página $1 ha sido trasladada a $2.',
'movepage-page-unmoved' => 'La página $1 no se ha podido trasladar a $2.',
'movepage-max-pages' => 'Se {{PLURAL:$1|ha trasladado un máximo de una página|han trasladado un máximo de $1 páginas}}, y no se van a mover más automáticamente.',
-'1movedto2' => '[[$1]] trasladada a [[$2]]',
-'1movedto2_redir' => '[[$1]] trasladada a [[$2]] sobre una redirección',
-'move-redirect-suppressed' => 'redirección suprimida',
'movelogpage' => 'Registro de traslados',
'movelogpagetext' => 'Abajo se encuentra una lista de páginas trasladadas.',
'movesubpage' => '{{PLURAL:$1|Subpágina|Subpáginas}}',
@@ -2725,7 +2783,7 @@ Por favor, elige otro nombre.',
La página de destino ("[[:$1]]") ya existe. ¿Quiere borrarla para permitir al traslado?',
'delete_and_move_confirm' => 'Sí, borrar la página',
-'delete_and_move_reason' => 'Borrada para permitir el traslado',
+'delete_and_move_reason' => 'Borrada para trasladar [[$1]]',
'selfmove' => 'Los títulos de origen y destino son los mismos;
no se puede trasladar una página sobre sí misma.',
'immobile-source-namespace' => 'No se pueden trasladar páginas en el espacio de nombres «$1»',
@@ -2755,9 +2813,11 @@ Por favor, elige otro nombre.',
Para exportar páginas, escribe los títulos en la caja de texto de abajo, un título por línea, y selecciona si quieres la versión actual junto a las versiones anteriores, con las líneas del historial, o sólo la versión actual con la información sobre la última edición.
En el último caso también puedes usar un enlace, por ejemplo [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para la página "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Exportar todas las páginas',
'exportcuronly' => 'Incluye sólo la revisión actual, no el historial de revisiones al completo.',
'exportnohistory' => "----
'''Nota:''' Exportar el historial completo de páginas a través de este formulario ha sido deshabilitado debido a problemas de rendimiento del servidor.",
+'exportlistauthors' => 'Incluir una lista completa de colaboradores para cada página',
'export-submit' => 'Exportar',
'export-addcattext' => 'Añadir páginas desde la categoría:',
'export-addcat' => 'Añadir',
@@ -2790,6 +2850,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Localización MediaWiki]
'thumbnail_error' => 'Error al crear miniatura: $1',
'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',
+'thumbnail-dest-create' => 'No se ha podido guardar la miniatura',
'thumbnail_invalid_params' => 'Parámetros del thumbnail no válidos',
'thumbnail_dest_directory' => 'Incapaz de crear el directorio de destino',
'thumbnail_image-type' => 'Tipo de imagen no contemplado',
@@ -2836,6 +2898,11 @@ No hay un directorio temporal.',
'import-upload' => 'Subir datos XML',
'import-token-mismatch' => 'Pérdida de datos de sesión. Por favor, inténtalo de nuevo.',
'import-invalid-interwiki' => 'No se puede importar de la wiki especificada.',
+'import-error-edit' => 'La página $1 no se importó porque no tienes permisos para editarla.',
+'import-error-create' => 'La página «$1» no se importó porque no tienes permisos para crearla.',
+'import-error-interwiki' => 'La página "$1" no se ha importado porque su nombre está reservado para la vinculación externa (interwikis).',
+'import-error-special' => 'La página "$1" no se ha importado porque pertenece a un espacio de nombres especial que no admite páginas.',
+'import-error-invalid' => 'La página "$1" no se ha importado porque su nombre no es válido.',
# Import log
'importlogpage' => 'Registro de importaciones',
@@ -2845,74 +2912,87 @@ No hay un directorio temporal.',
'import-logentry-interwiki' => 'transwikificada $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revisión|revisiones}} desde $2',
+# JavaScriptTest
+'javascripttest' => 'Pruebas de JavaScript',
+'javascripttest-disabled' => 'Esta función está deshabilitada.',
+'javascripttest-title' => 'Pruebas de $1 en ejecución',
+'javascripttest-pagetext-noframework' => 'Esta página está reservada para ejecutar pruebas de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Marco de pruebas desconocido "$1".',
+'javascripttest-pagetext-frameworks' => 'Por favor, seleccione uno de los marcos de pruebas siguientes: $1',
+'javascripttest-pagetext-skins' => 'Elija un aspecto (skin) para ejecutar las pruebas:',
+'javascripttest-qunit-intro' => 'Consulte la [$1 documentación sobre las pruebas] en mediawiki.org.',
+'javascripttest-qunit-heading' => 'Conjunto de pruebas MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tu página de {{gender:|usuario|usuaria}}',
-'tooltip-pt-anonuserpage' => 'La página de usuario de la IP desde la que editas',
-'tooltip-pt-mytalk' => 'Tu página de discusión',
-'tooltip-pt-anontalk' => 'Discusión sobre ediciones hechas desde esta dirección IP',
-'tooltip-pt-preferences' => 'Tus preferencias',
-'tooltip-pt-watchlist' => 'Lista de páginas cuyos cambios vigilas',
-'tooltip-pt-mycontris' => 'Lista de tus contribuciones',
-'tooltip-pt-login' => 'Te recomendamos iniciar sesión, sin embargo no es obligatorio',
-'tooltip-pt-anonlogin' => 'Te invitamos a registrarte, aunque no es obligatorio',
-'tooltip-pt-logout' => 'Salir de la sesión',
-'tooltip-ca-talk' => 'Discusión acerca del artículo',
-'tooltip-ca-edit' => 'Puedes editar esta página. Utiliza el botón de previsualización antes de guardar',
-'tooltip-ca-addsection' => 'Inicia una nueva sección',
-'tooltip-ca-viewsource' => 'Esta página está protegida.
+'tooltip-pt-userpage' => 'Tu página de {{gender:|usuario|usuaria}}',
+'tooltip-pt-anonuserpage' => 'La página de usuario de la IP desde la que editas',
+'tooltip-pt-mytalk' => 'Tu página de discusión',
+'tooltip-pt-anontalk' => 'Discusión sobre ediciones hechas desde esta dirección IP',
+'tooltip-pt-preferences' => 'Tus preferencias',
+'tooltip-pt-watchlist' => 'Lista de páginas cuyos cambios vigilas',
+'tooltip-pt-mycontris' => 'Lista de tus contribuciones',
+'tooltip-pt-login' => 'Te recomendamos iniciar sesión, sin embargo no es obligatorio',
+'tooltip-pt-anonlogin' => 'Te invitamos a registrarte, aunque no es obligatorio',
+'tooltip-pt-logout' => 'Salir de la sesión',
+'tooltip-ca-talk' => 'Discusión acerca del artículo',
+'tooltip-ca-edit' => 'Puedes editar esta página. Utiliza el botón de previsualización antes de guardar',
+'tooltip-ca-addsection' => 'Inicia una nueva sección',
+'tooltip-ca-viewsource' => 'Esta página está protegida.
Puedes ver su código fuente',
-'tooltip-ca-history' => 'Versiones anteriores de esta página y sus autores',
-'tooltip-ca-protect' => 'Proteger esta página',
-'tooltip-ca-unprotect' => 'Cambiar protección de esta página',
-'tooltip-ca-delete' => 'Borrar esta página',
-'tooltip-ca-undelete' => 'Restaurar las ediciones hechas a esta página antes de que fuese borrada',
-'tooltip-ca-move' => 'Mover esta página',
-'tooltip-ca-watch' => 'Añadir esta página a su lista de seguimiento',
-'tooltip-ca-unwatch' => 'Borrar esta página de su lista de seguimiento',
-'tooltip-search' => 'Buscar en {{SITENAME}}',
-'tooltip-search-go' => 'Ir al artículo con este nombre exacto si existe',
-'tooltip-search-fulltext' => 'Busca este texto en las páginas',
-'tooltip-p-logo' => 'Visitar la página principal',
-'tooltip-n-mainpage' => 'Visitar la página principal',
-'tooltip-n-mainpage-description' => 'Visitar la página principal',
-'tooltip-n-portal' => 'Acerca del proyecto, lo que puedes hacer, dónde encontrar información',
-'tooltip-n-currentevents' => 'Información de contexto sobre acontecimientos actuales',
-'tooltip-n-recentchanges' => 'Lista de cambios recientes en el wiki',
-'tooltip-n-randompage' => 'Cargar una página al azar',
-'tooltip-n-help' => 'El lugar para aprender',
-'tooltip-t-whatlinkshere' => 'Lista de todas las páginas del wiki que enlazan aquí',
-'tooltip-t-recentchangeslinked' => 'Cambios recientes en las páginas que enlazan con ésta',
-'tooltip-feed-rss' => 'Sindicación RSS de esta página',
-'tooltip-feed-atom' => 'Sindicación Atom de esta página',
-'tooltip-t-contributions' => 'Lista de contribuciones de este usuario',
-'tooltip-t-emailuser' => 'Enviar un mensaje de correo a este usuario',
-'tooltip-t-upload' => 'Subir imágenes o archivos multimedia',
-'tooltip-t-specialpages' => 'Lista de todas las páginas especiales',
-'tooltip-t-print' => 'Versión imprimible de esta página',
-'tooltip-t-permalink' => 'Enlace permanente a esta versión de la página',
-'tooltip-ca-nstab-main' => 'Ver el artículo',
-'tooltip-ca-nstab-user' => 'Ver la página de usuario',
-'tooltip-ca-nstab-media' => 'Ver la página de multimedia',
-'tooltip-ca-nstab-special' => 'Esta es una página especial, no se puede editar la página en sí',
-'tooltip-ca-nstab-project' => 'Ver la página de proyecto',
-'tooltip-ca-nstab-image' => 'Ver la página de la imagen',
-'tooltip-ca-nstab-mediawiki' => 'Ver el mensaje de sistema',
-'tooltip-ca-nstab-template' => 'Ver la plantilla',
-'tooltip-ca-nstab-help' => 'Ver la página de ayuda',
-'tooltip-ca-nstab-category' => 'Ver la página de categoría',
-'tooltip-minoredit' => 'Marcar este cambio como menor',
-'tooltip-save' => 'Guardar los cambios',
-'tooltip-preview' => 'Previsualiza los cambios realizados. ¡Por favor, hazlo antes de grabar!',
-'tooltip-diff' => 'Muestra los cambios que ha introducido en el texto.',
-'tooltip-compareselectedversions' => 'Ver las diferencias entre las dos versiones seleccionadas de esta página.',
-'tooltip-watch' => 'Añadir esta página a su lista de seguimiento',
-'tooltip-recreate' => 'Recupera una página que ha sido borrada',
-'tooltip-upload' => 'Empieza la subida',
-'tooltip-rollback' => '«Revertir» revierte todas las ediciones del último usuario con un solo clic.',
-'tooltip-undo' => '«Deshacer» revierte la edición seleccionada y abre la página de edición en el modo de previsualización.
+'tooltip-ca-history' => 'Versiones anteriores de esta página y sus autores',
+'tooltip-ca-protect' => 'Proteger esta página',
+'tooltip-ca-unprotect' => 'Cambiar protección de esta página',
+'tooltip-ca-delete' => 'Borrar esta página',
+'tooltip-ca-undelete' => 'Restaurar las ediciones hechas a esta página antes de que fuese borrada',
+'tooltip-ca-move' => 'Mover esta página',
+'tooltip-ca-watch' => 'Añadir esta página a su lista de seguimiento',
+'tooltip-ca-unwatch' => 'Borrar esta página de su lista de seguimiento',
+'tooltip-search' => 'Buscar en {{SITENAME}}',
+'tooltip-search-go' => 'Ir al artículo con este nombre exacto si existe',
+'tooltip-search-fulltext' => 'Busca este texto en las páginas',
+'tooltip-p-logo' => 'Visitar la página principal',
+'tooltip-n-mainpage' => 'Visitar la página principal',
+'tooltip-n-mainpage-description' => 'Visitar la página principal',
+'tooltip-n-portal' => 'Acerca del proyecto, lo que puedes hacer, dónde encontrar información',
+'tooltip-n-currentevents' => 'Información de contexto sobre acontecimientos actuales',
+'tooltip-n-recentchanges' => 'Lista de cambios recientes en el wiki',
+'tooltip-n-randompage' => 'Cargar una página al azar',
+'tooltip-n-help' => 'El lugar para aprender',
+'tooltip-t-whatlinkshere' => 'Lista de todas las páginas del wiki que enlazan aquí',
+'tooltip-t-recentchangeslinked' => 'Cambios recientes en las páginas que enlazan con ésta',
+'tooltip-feed-rss' => 'Sindicación RSS de esta página',
+'tooltip-feed-atom' => 'Sindicación Atom de esta página',
+'tooltip-t-contributions' => 'Lista de contribuciones de este usuario',
+'tooltip-t-emailuser' => 'Enviar un mensaje de correo a este usuario',
+'tooltip-t-upload' => 'Subir imágenes o archivos multimedia',
+'tooltip-t-specialpages' => 'Lista de todas las páginas especiales',
+'tooltip-t-print' => 'Versión imprimible de esta página',
+'tooltip-t-permalink' => 'Enlace permanente a esta versión de la página',
+'tooltip-ca-nstab-main' => 'Ver el artículo',
+'tooltip-ca-nstab-user' => 'Ver la página de usuario',
+'tooltip-ca-nstab-media' => 'Ver la página de multimedia',
+'tooltip-ca-nstab-special' => 'Esta es una página especial, no se puede editar la página en sí',
+'tooltip-ca-nstab-project' => 'Ver la página de proyecto',
+'tooltip-ca-nstab-image' => 'Ver la página de la imagen',
+'tooltip-ca-nstab-mediawiki' => 'Ver el mensaje de sistema',
+'tooltip-ca-nstab-template' => 'Ver la plantilla',
+'tooltip-ca-nstab-help' => 'Ver la página de ayuda',
+'tooltip-ca-nstab-category' => 'Ver la página de categoría',
+'tooltip-minoredit' => 'Marcar este cambio como menor',
+'tooltip-save' => 'Guardar los cambios',
+'tooltip-preview' => 'Previsualiza los cambios realizados. ¡Por favor, hazlo antes de grabar!',
+'tooltip-diff' => 'Muestra los cambios que ha introducido en el texto.',
+'tooltip-compareselectedversions' => 'Ver las diferencias entre las dos versiones seleccionadas de esta página.',
+'tooltip-watch' => 'Añadir esta página a su lista de seguimiento',
+'tooltip-watchlistedit-normal-submit' => 'Borrar páginas',
+'tooltip-watchlistedit-raw-submit' => 'Actualizar lista de seguimiento',
+'tooltip-recreate' => 'Recupera una página que ha sido borrada',
+'tooltip-upload' => 'Empieza la subida',
+'tooltip-rollback' => '«Revertir» revierte todas las ediciones del último usuario con un solo clic.',
+'tooltip-undo' => '«Deshacer» revierte la edición seleccionada y abre la página de edición en el modo de previsualización.
Permite añadir una razón al resumen de edición.',
-'tooltip-preferences-save' => 'Guardar las preferencias',
-'tooltip-summary' => 'Introduce un breve resumen',
+'tooltip-preferences-save' => 'Guardar las preferencias',
+'tooltip-summary' => 'Introduce un breve resumen',
# Stylesheets
'common.css' => '/* Los estilos CSS definidos aquí aplicarán a todas las pieles (skins) */',
@@ -3002,9 +3082,6 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
# Patrol log
'patrol-log-page' => 'Registro de revisiones',
'patrol-log-header' => 'Este es un registro de revisiones patrulladas.',
-'patrol-log-line' => 'revisó la $1 de $2 $3',
-'patrol-log-auto' => '(automático)',
-'patrol-log-diff' => 'revisión $1',
'log-show-hide-patrol' => '$1 registro de patrullaje',
# Image deletion
@@ -3031,11 +3108,11 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
'file-info' => 'tamaño de archivo: $1; tipo MIME: $2',
'file-info-size' => '$1 × $2 píxeles; tamaño de archivo: $3; tipo MIME: $4',
'file-info-size-pages' => '$1 × $2 píxeles, tamaño de archivo: $3, tipo MIME: $4, $5 {{PLURAL:$5|página|páginas}}',
-'file-nohires' => '<small>No disponible a mayor resolución.</small>',
+'file-nohires' => 'No disponible a mayor resolución.',
'svg-long-desc' => 'archivo SVG, nominalmente $1 × $2 píxeles, tamaño de archivo: $3',
'show-big-image' => 'Resolución original',
-'show-big-image-preview' => '<small>Tamaño de esta previsualización: $1.</small>',
-'show-big-image-other' => '<small>Otras resoluciones: $1.</small>',
+'show-big-image-preview' => 'Tamaño de esta previsualización: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Otra resolución|Otras resoluciones}}: $1.',
'show-big-image-size' => '$1 × $2 píxeles',
'file-info-gif-looped' => 'bucleado',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
@@ -3056,8 +3133,13 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
'sp-newimages-showfrom' => 'Mostrar nuevas imágenes empezando por $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'h',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
+'seconds' => '{{PLURAL:$1|un segundo|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
+'days' => '{{PLURAL:$1|un día|$1 días}}',
+'ago' => 'hace $1',
# Bad image list
'bad_image_list' => 'El formato es el siguiente:
@@ -3549,13 +3631,6 @@ Este código de confirmación caducará el $4.',
'scarytranscludefailed' => '[Obtención de plantilla falló para $1]',
'scarytranscludetoolong' => '[El URL es demasiado largo]',
-# Trackbacks
-'trackbackbox' => "''Trackbacks'' para este artículo:<br />
-$1",
-'trackbackremove' => '([$1 Borrar])',
-'trackbacklink' => "''Trackback''",
-'trackbackdeleteok' => 'El trackback se borró correctamente.',
-
# Delete conflict
'deletedwhileediting' => "'''Aviso''': ¡Esta página fue borrada después de que usted empezara a editar!",
'confirmrecreate' => "El usuario [[User:$1|$1]] ([[User talk:$1|disc.]]) borró esta página después de que comenzaste a editarla, por el motivo:
@@ -3641,6 +3716,9 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
'watchlisttools-edit' => 'Ver y editar tu lista de seguimiento',
'watchlisttools-raw' => 'Editar lista de seguimiento en crudo',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discusión]])',
+
# Core parser functions
'unknown_extension_tag' => 'Etiqueta desconocida «$1»',
'duplicate-defaultsort' => "'''Atención:''' La clave de ordenamiento predeterminada «$2» anula la clave de ordenamiento anterior «$1».",
@@ -3739,13 +3817,16 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
# Special:ComparePages
-'comparepages' => 'Comparar páginas',
-'compare-selector' => 'Comparar revisiones de página',
-'compare-page1' => 'Página 1',
-'compare-page2' => 'Página 2',
-'compare-rev1' => 'Revisión 1',
-'compare-rev2' => 'Revisión 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar páginas',
+'compare-selector' => 'Comparar revisiones de página',
+'compare-page1' => 'Página 1',
+'compare-page2' => 'Página 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'El título especificado es inválido.',
+'compare-title-not-exists' => 'El título especificado no existe.',
+'compare-revision-not-exists' => 'La revisión especificada no existe.',
# Database error messages
'dberr-header' => 'Este wiki tiene un problema',
@@ -3773,4 +3854,91 @@ Este sitio está experimentando dificultades técnicas.',
'sqlite-has-fts' => '$1 con soporte para búsqueda de texto completo',
'sqlite-no-fts' => '$1 sin soporte para búsqueda de texto completo',
+# New logging system
+'logentry-delete-delete' => '$1 borró la página $3',
+'logentry-delete-restore' => '$1 restauró la página $3',
+'logentry-delete-event' => '$1 modificó la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
+'logentry-delete-revision' => '$1 modificó la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
+'logentry-delete-event-legacy' => '$1 modificó la visibilidad de los eventos del registro en $3',
+'logentry-delete-revision-legacy' => '$1 modificó la visibilidad de las ediciones en la página $3',
+'logentry-suppress-delete' => '$1 borró la página $3',
+'logentry-suppress-event' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
+'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
+'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
+'logentry-suppress-revision-legacy' => '$1 modificó secretamente la visibilidad de las ediciones en la página $3',
+'revdelete-content-hid' => 'contenido oculto',
+'revdelete-summary-hid' => 'resumen de edición oculto',
+'revdelete-uname-hid' => 'nombre de usuario oculto',
+'revdelete-content-unhid' => 'contenido mostrado',
+'revdelete-summary-unhid' => 'resumen de edición mostrado',
+'revdelete-uname-unhid' => 'nombre de usuario mostrado',
+'revdelete-restricted' => 'restricciones para administradores aplicadas',
+'revdelete-unrestricted' => 'restricciones para administradores eliminadas',
+'logentry-move-move' => '$1 movió la página $3 a $4',
+'logentry-move-move-noredirect' => '$1 movió la página $3 a $4 sin dejar una redirección',
+'logentry-move-move_redir' => '$1 movió la página $3 a $4 sobre una redirección',
+'logentry-move-move_redir-noredirect' => '$1 movió la página $3 a $4 sobre una redirección, sin dejar redirección',
+'logentry-patrol-patrol' => '$1 marcó la edición $4 de la página $3 como patrullada',
+'logentry-patrol-patrol-auto' => '$1 marcó automáticamente la edición $4 de la página $3 como patrullada',
+'logentry-newusers-newusers' => '$1 creó una cuenta de usuario',
+'logentry-newusers-create' => '$1 creó una cuenta de usuario',
+'logentry-newusers-create2' => '$1 creó una cuenta de usuario $3',
+'logentry-newusers-autocreate' => 'La cuenta $1 fue creada automáticamente',
+'newuserlog-byemail' => 'contraseña enviada por correo electrónico',
+
+# Feedback
+'feedback-bugornote' => 'Si estás preparado para describir en detalle un problema técnico, [$1 informa de un bug] por favor.
+
+En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido a la página [$3 $2], junto con tu nombre de usuario y el navegador que usas.',
+'feedback-subject' => 'Asunto:',
+'feedback-message' => 'Mensaje:',
+'feedback-cancel' => 'Cancelar',
+'feedback-submit' => 'Enviar comentarios',
+'feedback-adding' => 'Añadiendo comentarios a la página...',
+'feedback-error1' => 'Error: No se reconoce resultado de API',
+'feedback-error2' => 'Error: Falló la edición',
+'feedback-error3' => 'Error: No hay respuesta de la API',
+'feedback-thanks' => '¡Gracias! Su comentario ha sido anotado en la página [$2 $1].',
+'feedback-close' => 'Hecho',
+'feedback-bugcheck' => '¡Perfecto! Únicamente comprueba que no sea un [$1 fallo conocido].',
+'feedback-bugnew' => 'Lo he comprobado. Informar de un nuevo fallo.',
+
+# API errors
+'api-error-badaccess-groups' => 'No puedes cargar archivos en este wiki.',
+'api-error-badtoken' => 'Error interno: Símbolo incorrecto.',
+'api-error-copyuploaddisabled' => 'La subida por URL está desactivada en este servidor.',
+'api-error-duplicate' => 'Ya existe{{PLURAL:$1| [$2 otro archivo]|[$2 n otros archivos]}} en el sitio con el mismo contenido.',
+'api-error-duplicate-archive' => 'Ya {{PLURAL:$1|existía [$2 otro archivo]|existían [$2 otros archivos]}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue|fueron}} {{PLURAL:$1|eliminado|eliminados}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Archivo|Archivos}} {{PLURAL:$1|duplicado|duplicados}} que ya se han eliminado',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Archivo|Archivos}} {{PLURAL:$1|duplicado|duplicados}}',
+'api-error-empty-file' => 'El archivo que enviaste estaba vacío.',
+'api-error-emptypage' => 'No se pueden crear páginas nuevas que estén vacías.',
+'api-error-fetchfileerror' => 'Error interno: Algo salió mal mientras se obtenía el archivo.',
+'api-error-file-too-large' => 'El archivo que enviaste era demasiado grande.',
+'api-error-filename-tooshort' => 'El nombre de archivo es demasiado corto.',
+'api-error-filetype-banned' => 'Este tipo de archivo está prohibido.',
+'api-error-filetype-missing' => 'El archivo no tiene extensión de archivo.',
+'api-error-hookaborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión.',
+'api-error-http' => 'Error interno: No se puede conectar al servidor.',
+'api-error-illegal-filename' => 'El nombre de archivo no está permitido.',
+'api-error-internal-error' => 'Error interno: Algo salió mal al procesar tu subida en el wiki.',
+'api-error-invalid-file-key' => 'Error interno: No se encontró el archivo en el almacenamiento temporal.',
+'api-error-missingparam' => 'Error interno: Faltan parámetros en la solicitud.',
+'api-error-missingresult' => 'Error interno: No se pudo determinar si la copia tuvo éxito.',
+'api-error-mustbeloggedin' => 'Debes iniciar sesión para subir archivos.',
+'api-error-mustbeposted' => 'Error interno: La solicitud requiere HTTP POST.',
+'api-error-noimageinfo' => 'La carga se realizó correctamente, pero el servidor no nos dio ninguna información sobre el archivo.',
+'api-error-nomodule' => 'Error interno: No hay un módulo de carga configurado.',
+'api-error-ok-but-empty' => 'Error interno: No hay respuesta del servidor.',
+'api-error-overwrite' => 'No se permite sobrescribir un archivo existente.',
+'api-error-stashfailed' => 'Error interno: El servidor no pudo almacenar el archivo temporal.',
+'api-error-timeout' => 'El servidor no respondió en el plazo previsto.',
+'api-error-unclassified' => 'Ocurrió un error desconocido.',
+'api-error-unknown-code' => 'Error desconocido: «$1»',
+'api-error-unknown-error' => 'Error interno: Algo salió mal al intentar cargar el archivo.',
+'api-error-unknown-warning' => 'Advertencia desconocida: $1',
+'api-error-unknownerror' => 'Error desconocido: «$1».',
+'api-error-uploaddisabled' => 'Las subidas están desactivadas en este wiki.',
+'api-error-verification-error' => 'Este archivo puede estar dañado, o tiene una extensión incorrecta.',
+
);
diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php
index 1923e0e2..6485ad73 100644
--- a/languages/messages/MessagesEt.php
+++ b/languages/messages/MessagesEt.php
@@ -58,7 +58,9 @@ $specialPageAliases = array(
'Booksources' => array( 'Raamatuotsimine', 'Otsi_raamatut' ),
'BrokenRedirects' => array( 'Vigased_ümbersuunamised' ),
'Categories' => array( 'Kategooriad' ),
+ 'ChangeEmail' => array( 'E-posti_aadressi_muutmine' ),
'ChangePassword' => array( 'Parooli_muutmine', 'Muuda_parool' ),
+ 'ComparePages' => array( 'Lehekülgede_kõrvutamine' ),
'Confirmemail' => array( 'E-posti_aadressi_kinnitamine' ),
'Contributions' => array( 'Kaastöö' ),
'CreateAccount' => array( 'Konto_loomine' ),
@@ -99,6 +101,7 @@ $specialPageAliases = array(
'Mytalk' => array( 'Minu_aruteluleht' ),
'Newimages' => array( 'Uued_failid' ),
'Newpages' => array( 'Uued_leheküljed' ),
+ 'PasswordReset' => array( 'Parooli_lähtestamine' ),
'Popularpages' => array( 'Loetumad_leheküljed' ),
'Preferences' => array( 'Eelistused' ),
'Prefixindex' => array( 'Kõik_pealkirjad_eesliitega' ),
@@ -150,99 +153,99 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#suuna', '#REDIRECT' ),
- 'notoc' => array( '0', '__SISUKORRATA__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__GALERIITA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__SISUKORDEES__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SISUKORD__', '__TOC__' ),
- 'noeditsection' => array( '0', '__ALAOSALINGITA__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'HETKEKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'HETKEKUU1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'HETKEKUUNIMETUS', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'HETKEKUUPÄEV', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'HETKEKUUPÄEV2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'HETKENÄDALAPÄEV', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'HETKEAASTA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HETKEAEG', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HETKETUND', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'KOHALIKKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'KOHALIKKUU1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'KOHALIKKUUNIMETUS', 'LOCALMONTHNAME' ),
- 'localday' => array( '1', 'KOHALIKKUUPÄEV', 'LOCALDAY' ),
- 'localday2' => array( '1', 'KOHALIKKUUPÄEV2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'KOHALIKNÄDALAPÄEV', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'KOHALIKAASTA', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'KOHALIKAEG', 'LOCALTIME' ),
- 'localhour' => array( '1', 'KOHALIKTUND', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'LEHEMÄÄR', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ARTIKLIMÄÄR', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FAILIMÄÄR', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'KASUTAJAMÄÄR', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'TEGUSKASUTAJAMÄÄR', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'REDIGEERIMISMÄÄR', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'VAATAMISTEARV', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'LEHEKÃœLJENIMI', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'LEHEKÃœLJENIMI1', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NIMERUUM', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NIMERUUM1', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ARUTELUNIMERUUM', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ARUTELUNIMERUUM1', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'SISUNIMERUUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'SISUNIMERUUM1', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'KOGULEHEKÃœLJENIMI', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'KOGULEHEKÃœLJENIMI1', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ALAMLEHEKÃœLJENIMI', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ALAMLEHEKÃœLJENIMI1', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NIMERUUMITANIMI', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NIMERUUMITANIMI1', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ARUTELUNIMI', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ARUTELUNIMI1', 'TALKPAGENAMEE' ),
- 'subst' => array( '0', 'ASENDA:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'pisi', 'pisipilt', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'pisi=$1', 'pisipilt=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'paremal', 'right' ),
- 'img_left' => array( '1', 'vasakul', 'left' ),
- 'img_none' => array( '1', 'tühi', 'none' ),
- 'img_center' => array( '1', 'keskel', 'center', 'centre' ),
- 'img_framed' => array( '1', 'raam', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'raamita', 'frameless' ),
- 'img_page' => array( '1', 'lehekülg=$1', 'lehekülg_$1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'ääris', 'border' ),
- 'sitename' => array( '1', 'KOHANIMI', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'nse' => array( '0', 'NR1:', 'NSE:' ),
- 'localurl' => array( '0', 'KOHALIKURL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'KOHALIKURL1', 'LOCALURLE:' ),
- 'servername' => array( '0', 'SERVERINIMI', 'SERVERNAME' ),
- 'gender' => array( '0', 'SUGU:', 'GENDER:' ),
- 'currentweek' => array( '1', 'HETKENÄDAL', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'HETKENÄDALAPÄEV1', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'KOHALIKNÄDAL', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'KOHALIKNÄDALAPÄEV1', 'LOCALDOW' ),
- 'fullurl' => array( '0', 'KOGUURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'KOGUURL1:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ESIVT:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ESIST:', 'UCFIRST:' ),
- 'lc' => array( '0', 'VT:', 'LC:' ),
- 'uc' => array( '0', 'ST:', 'UC:' ),
- 'displaytitle' => array( '1', 'PEALKIRI', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__UUEALAOSALINK__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__UUEALAOSALINGITA__', '__NONEWSECTIONLINK__' ),
- 'currenttimestamp' => array( '1', 'HETKEAJATEMPEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'KOHALIKAJATEMPEL', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#KEEL:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'VAIKEKEEL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'LEHEKÃœLGINIMERUUMIS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ÜLEMAMÄÄR', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ARVUVORMINDUS', 'FORMATNUM' ),
- 'defaultsort' => array( '1', 'JÄRJESTA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'hiddencat' => array( '1', '__PEIDETUDKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'LEHEKÃœLGIKATEGOORIAS', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'index' => array( '1', 'INDEKSIGA', '__INDEX__' ),
- 'noindex' => array( '1', 'INDEKSITA', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'KASUTAJAIDRÃœHMAS', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'protectionlevel' => array( '1', 'KAITSETASE', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'kuupäevavormindus', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#suuna', '#REDIRECT' ),
+ 'notoc' => array( '0', '__SISUKORRATA__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__GALERIITA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__SISUKORDEES__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SISUKORD__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ALAOSALINGITA__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'HETKEKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'HETKEKUU1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'HETKEKUUNIMETUS', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'HETKEKUUPÄEV', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'HETKEKUUPÄEV2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'HETKENÄDALAPÄEV', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'HETKEAASTA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HETKEAEG', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HETKETUND', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'KOHALIKKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'KOHALIKKUU1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'KOHALIKKUUNIMETUS', 'LOCALMONTHNAME' ),
+ 'localday' => array( '1', 'KOHALIKKUUPÄEV', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'KOHALIKKUUPÄEV2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'KOHALIKNÄDALAPÄEV', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'KOHALIKAASTA', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'KOHALIKAEG', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'KOHALIKTUND', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'LEHEMÄÄR', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ARTIKLIMÄÄR', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FAILIMÄÄR', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'KASUTAJAMÄÄR', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'TEGUSKASUTAJAMÄÄR', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'REDIGEERIMISMÄÄR', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'VAATAMISTEARV', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'LEHEKÃœLJENIMI', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'LEHEKÃœLJENIMI1', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NIMERUUM', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NIMERUUM1', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ARUTELUNIMERUUM', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ARUTELUNIMERUUM1', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'SISUNIMERUUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'SISUNIMERUUM1', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'KOGULEHEKÃœLJENIMI', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'KOGULEHEKÃœLJENIMI1', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ALAMLEHEKÃœLJENIMI', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ALAMLEHEKÃœLJENIMI1', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NIMERUUMITANIMI', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NIMERUUMITANIMI1', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ARUTELUNIMI', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ARUTELUNIMI1', 'TALKPAGENAMEE' ),
+ 'subst' => array( '0', 'ASENDA:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'pisi', 'pisipilt', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'pisi=$1', 'pisipilt=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'paremal', 'right' ),
+ 'img_left' => array( '1', 'vasakul', 'left' ),
+ 'img_none' => array( '1', 'tühi', 'none' ),
+ 'img_center' => array( '1', 'keskel', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'raam', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'raamita', 'frameless' ),
+ 'img_page' => array( '1', 'lehekülg=$1', 'lehekülg_$1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'ääris', 'border' ),
+ 'sitename' => array( '1', 'KOHANIMI', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'nse' => array( '0', 'NR1:', 'NSE:' ),
+ 'localurl' => array( '0', 'KOHALIKURL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'KOHALIKURL1', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'SERVERINIMI', 'SERVERNAME' ),
+ 'gender' => array( '0', 'SUGU:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'HETKENÄDAL', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'HETKENÄDALAPÄEV1', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'KOHALIKNÄDAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'KOHALIKNÄDALAPÄEV1', 'LOCALDOW' ),
+ 'fullurl' => array( '0', 'KOGUURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'KOGUURL1:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ESIVT:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ESIST:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'VT:', 'LC:' ),
+ 'uc' => array( '0', 'ST:', 'UC:' ),
+ 'displaytitle' => array( '1', 'PEALKIRI', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__UUEALAOSALINK__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__UUEALAOSALINGITA__', '__NONEWSECTIONLINK__' ),
+ 'currenttimestamp' => array( '1', 'HETKEAJATEMPEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'KOHALIKAJATEMPEL', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#KEEL:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'VAIKEKEEL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'LEHEKÃœLGINIMERUUMIS', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ÜLEMAMÄÄR', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ARVUVORMINDUS', 'FORMATNUM' ),
+ 'defaultsort' => array( '1', 'JÄRJESTA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'hiddencat' => array( '1', '__PEIDETUDKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'LEHEKÃœLGIKATEGOORIAS', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'index' => array( '1', 'INDEKSIGA', '__INDEX__' ),
+ 'noindex' => array( '1', 'INDEKSITA', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'KASUTAJAIDRÃœHMAS', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'protectionlevel' => array( '1', 'KAITSETASE', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'kuupäevavormindus', 'formatdate', 'dateformat' ),
);
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -637,22 +640,24 @@ Sellisel juhul tuleks teavitada [[Special:ListUsers/sysop|administraatorit]], ed
'badarticleerror' => 'Seda toimingut ei saa sellel leheküljel sooritada.',
'cannotdelete' => 'Lehekülge või faili "$1" ei saa kustutada.
Võimalik, et keegi on selle juba kustutanud.',
+'cannotdelete-title' => 'Lehekülge "$1" ei saa kustutada',
'badtitle' => 'Vigane pealkiri',
'badtitletext' => 'Soovitud lehekülje pealkiri oli vigane, tühi või teisest keeleversioonist või vikist valesti lingitud.
See võib sisaldada ühte või enamat märki, mida ei saa pealkirjades kasutada.',
-'perfcached' => 'Järgnevad andmed on puhverdatud ja ei pruugi olla kõige värskemad:',
-'perfcachedts' => 'Järgmised andmed on vahemälus. Viimase uuendamise daatum on $1.',
+'perfcached' => 'Järgnevad andmed on puhverdatud ja ei pruugi olla kõige värskemad. Puhvris on saadaval kuni {{PLURAL:$1|üks tulemus|$1 tulemust}}.',
+'perfcachedts' => 'Järgmised andmed on vahemälus. Viimane uuendamisaeg: $2, kell $3. Puhvris on saadaval kuni {{PLURAL:$4|üks tulemus|$4 tulemust}}.',
'querypage-no-updates' => 'Lehekülje uuendamine ei ole hetkel lubatud ning andmeid ei värskendata.',
'wrong_wfQuery_params' => 'Valed parameeterid funktsioonile wfQuery()<br />
Funktsioon: $1<br />
Päring: $2',
'viewsource' => 'Vaata lähteteksti',
-'viewsourcefor' => '$1',
+'viewsource-title' => 'Lehekülje $1 lähteteksti vaatamine',
'actionthrottled' => 'Toiming nurjus',
'actionthrottledtext' => 'Rämpsmuudatuste vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.
Palun proovi mõne minuti pärast uuesti.',
'protectedpagetext' => 'See lehekülg on lukustatud, et muudatusi ei tehtaks.',
'viewsourcetext' => 'Saad vaadata ja kopeerida lehekülje lähteteksti:',
+'viewyourtext' => "Saad vaadata ja kopeerida sellel leheküljel tehtud '''enda muudatuste '''lähteteksti:",
'protectedinterface' => 'Sellel leheküljel on tarkvara kasutajaliidese tekst. Kuritahtliku muutmise vältimiseks on lehekülg lukustatud.',
'editinginterface' => "'''Hoiatus:''' Te redigeerite tarkvara kasutajaliidese tekstiga lehekülge. Muudatused siin mõjutavad kõikide kasutajate kasutajaliidest. Tõlkijad, palun kaaluge MediaWiki tõlkimisprojekti – [//translatewiki.net/wiki/Main_Page?setlang=et translatewiki.net] kasutamist.",
'sqlhidden' => '(SQL päring peidetud)',
@@ -748,6 +753,7 @@ Seetõttu ei saa seda IP-aadressi kasutades hetkel rohkem kontosid luua.',
'emailconfirmlink' => 'Kinnita oma e-posti aadress',
'invalidemailaddress' => 'E-aadress ei ole aktsepteeritav, sest see on vigaselt kirjutatud.
Ole hea ja anna õige e-aadress või jäta lahter tühjaks.',
+'cannotchangeemail' => 'Selles vikis ei saa konto e-posti aadressi muuta.',
'accountcreated' => 'Konto loodud',
'accountcreatedtext' => 'Kasutajakonto kasutajatunnusele $1 loodud.',
'createaccount-title' => '{{GRAMMAR:illative|{{SITENAME}}}} konto loomine',
@@ -763,6 +769,7 @@ Palun pea nüüd pisut vahet.',
# E-mail sending
'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
+'user-mail-no-addy' => 'Püüdsid saata e-kirja ilma meiliaadressita.',
# Change password dialog
'resetpass' => 'Parooli muutmine',
@@ -784,30 +791,45 @@ Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist sa
'resetpass-temp-password' => 'Ajutine parool:',
# Special:PasswordReset
-'passwordreset' => 'Parooli lähtestamine',
-'passwordreset-text' => 'Täida see vorm, et saada e-kiri oma konto andmetega.',
-'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-username' => 'Kasutajanimi:',
-'passwordreset-domain' => 'Domeen:',
-'passwordreset-email' => 'E-posti aadress:',
-'passwordreset-emailtitle' => '{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed',
-'passwordreset-emailtext-ip' => 'Keegi, arvatavasti sina ise, IP-aadressilt $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
+'passwordreset' => 'Parooli lähtestamine',
+'passwordreset-text' => 'Täida see vorm, et saada e-kiri oma konto andmetega.',
+'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-username' => 'Kasutajanimi:',
+'passwordreset-domain' => 'Domeen:',
+'passwordreset-capture' => 'Näita lähetatavat e-kirja?',
+'passwordreset-capture-help' => 'Kui valid selle märkeruudu, näidatakse sulle ajutist parooli sisaldavat e-kirja, mis ühtlasi kasutajale saadetakse.',
+'passwordreset-email' => 'E-posti aadress:',
+'passwordreset-emailtitle' => '{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed',
+'passwordreset-emailtext-ip' => 'Keegi, arvatavasti sina ise, IP-aadressilt $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
$2
{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.
Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.',
-'passwordreset-emailtext-user' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
+'passwordreset-emailtext-user' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
$2
{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.
Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.',
-'passwordreset-emailelement' => 'Kasutajanimi: $1
+'passwordreset-emailelement' => 'Kasutajanimi: $1
Ajutine parool: $2',
-'passwordreset-emailsent' => 'Meeldetuletuskiri on saadetud.',
+'passwordreset-emailsent' => 'Meeldetuletuskiri on saadetud.',
+'passwordreset-emailsent-capture' => 'E-kirjatsi on saadetud allpool näidatav meeldetuletus.',
+'passwordreset-emailerror-capture' => 'Koostati allpool näidatav meeldetuletus, aga selle e-kirjatsi kasutajale saatmine ebaõnnestus: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-posti aadressi muutmine',
+'changeemail-header' => 'Konto e-posti aadressi muutmine',
+'changeemail-text' => 'Täida see vorm, et muuta oma e-posti aadress. Et seda muudatust kinnitada, pead sisestama oma parooli.',
+'changeemail-no-info' => 'Otselingi kaudu sellele lehele jõudmiseks pead olema sisse loginud.',
+'changeemail-oldemail' => 'Praegune e-posti aadress:',
+'changeemail-newemail' => 'Uus e-posti aadress:',
+'changeemail-none' => '(puudub)',
+'changeemail-submit' => 'Muuda e-posti aadress',
+'changeemail-cancel' => 'Loobu',
# Edit page toolbar
'bold_sample' => 'Rasvane kiri',
@@ -879,9 +901,6 @@ Pane tähele, et sa ei saa teisele kasutajale teadet saata, kui sa pole kinnitan
Sinu praegune IP-aadress on $3 ja blokeeringu number #$5. Lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
'blockednoreason' => 'põhjendust ei ole kirja pandud',
-'blockedoriginalsource' => "'''$1''' allikas on näidatud allpool:",
-'blockededitsource' => "Sinu muudatused leheküljele '''$1''':",
-'whitelistedittitle' => 'Redigeerimiseks tuleb sisse logida',
'whitelistedittext' => 'Lehekülgede toimetamiseks pead $1.',
'confirmedittext' => 'Lehekülgi ei saa toimetada enne e-posti aadressi kinnitamist.
Palun määra ja kinnita e-posti aadress [[Special:Preferences|eelistuste leheküljel]].',
@@ -967,7 +986,7 @@ Te kinnitate ka, et kirjutasite selle ise või võtsite selle kopeerimiskitsendu
'copyrightwarning2' => "Pea silmas, et teised kaastöölised võivad kogu {{GRAMMAR:inessive|{{SITENAME}}}} tehtud kaastööd muuta või eemaldada. Kui sa ei soovi, et su kirjutatut halastamatult redigeeritakse, siis ära seda siia salvesta.<br />
Sa kinnitad ka, et kirjutasid selle ise või võtsid selle kopeerimiskitsenduseta allikast (vaata ka $1).
'''Ära saada autoriõigusega kaitstud materjali loata!'''",
-'longpageerror' => "'''Viga: Lehekülje suurus on $1 kilobaiti. Lehekülge ei saa salvestada, kuna see on pikem kui maksimaalsed $2 kilobaiti.'''",
+'longpageerror' => "'''Tõrge: Lehekülge ei saa salvestada, sest sinu esitatud {{PLURAL:$1|ühe|$1}} kilobaidi suurune tekst ületab {{PLURAL:$2|ühekilobaidist|$2-kilobaidist}} ülemmäära.'''",
'readonlywarning' => "'''Hoiatus: Andmebaas on lukustatud hooldustöödeks, nii et praegu ei saa parandusi salvestada.'''
Võid teksti hilisemaks kasutamiseks alles hoida tekstifailina.
@@ -1130,8 +1149,6 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
'revdelete-unsuppress' => 'Eemalda taastatud redaktsioonidelt piirangud',
'revdelete-log' => 'Põhjus:',
'revdelete-submit' => 'Rakenda valitud {{PLURAL:$1|redaktsiooni|redaktsioonide}} suhtes',
-'revdelete-logentry' => 'muutis lehekülje [[$1]] redaktsiooni nähtavust',
-'logdelete-logentry' => 'muutis lehekülje [[$1]] nähtavust',
'revdelete-success' => "Redaktsiooni nähtavus edukalt värskendatud.'''",
'revdelete-failure' => "'''Redaktsiooni nähtavust ei saanud värskendada:'''
$1",
@@ -1143,15 +1160,6 @@ $1",
'revdel-restore-visible' => 'nähtavad redaktsioonid',
'pagehist' => 'Lehekülje ajalugu',
'deletedhist' => 'Kustutatud ajalugu',
-'revdelete-content' => 'sisu',
-'revdelete-summary' => 'resümee',
-'revdelete-uname' => 'kasutajanimi',
-'revdelete-restricted' => 'kehtestati piirangud administraatoritele',
-'revdelete-unrestricted' => 'eemaldati administraatoritelt piirangud',
-'revdelete-hid' => '$1 peidetud',
-'revdelete-unhid' => '$1 nähtavaks tehtud',
-'revdelete-log-message' => '{{PLURAL:$2|Ãœhe|$2}} redaktsiooni $1',
-'logdelete-log-message' => '{{PLURAL:$2|Ãœhe|$2}} toimingu $1',
'revdelete-hide-current' => 'Tõrge üksuse kuupäevaga $2, kell $1 peitmisel: see on praegune redaktsioon.
Seda ei saa peita.',
'revdelete-show-no-access' => 'Tõrge ajatempliga $1 kell $2 üksuse näitamisel: selle on märge "piiranguga".
@@ -1312,12 +1320,14 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
'prefs-rc' => 'Viimased muudatused',
'prefs-watchlist' => 'Jälgimisloend',
'prefs-watchlist-days' => 'Mitme päeva muudatusi näidata loendis:',
-'prefs-watchlist-days-max' => 'Ülemmäär 7 päeva',
+'prefs-watchlist-days-max' => 'Ülemmäär $1 {{PLURAL:$1|päev|päeva}}',
'prefs-watchlist-edits' => 'Mitu muudatust näidatakse laiendatud jälgimisloendis:',
'prefs-watchlist-edits-max' => 'Ülemmäär: 1000',
'prefs-watchlist-token' => 'Jälgimisloendi tunnus:',
'prefs-misc' => 'Muu',
'prefs-resetpass' => 'Muuda parooli',
+'prefs-changeemail' => 'Muuda e-posti aadressi',
+'prefs-setemail' => 'Määra e-posti aadress',
'prefs-email' => 'E-posti sätted',
'prefs-rendering' => 'Ilme',
'saveprefs' => 'Salvesta eelistused',
@@ -1377,6 +1387,7 @@ Toimingut ei saa hiljem tühistada.',
'yourrealname' => 'Tegelik nimi:',
'yourlanguage' => 'Keel:',
'yourvariant' => 'Kiri:',
+'prefs-help-variant' => 'Kiri või kirjaviis, milles eelistad selle viki sisulehekülgi kuvada.',
'yournick' => 'Uus allkiri:',
'prefs-help-signature' => 'Kommentaarile tuleks aruteluleheküljel alla kirjutada märkidega <nowiki>~~~~</nowiki>, mis muutuvad sinu allkirjaks ja ajatempliks.',
'badsig' => 'Sobimatu allkiri.
@@ -1417,7 +1428,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'userrights-lookup-user' => 'Kasutajarühma muutmine',
'userrights-user-editname' => 'Sisesta kasutajatunnus:',
'editusergroup' => 'Muuda kasutajarühma',
-'editinguser' => "Kasutaja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) õiguste muutmine",
+'editinguser' => "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
'userrights-editusergroup' => 'Kasutajarühma valik',
'saveusergroups' => 'Salvesta rühma muudatused',
'userrights-groupsmember' => 'Kuulub rühmadesse:',
@@ -1511,13 +1522,13 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'right-autopatrol' => 'Teha vaikimisi kontrollituks märgitud muudatusi',
'right-patrolmarks' => 'Vaadata viimaste muudatuste kontrollimise märkeid',
'right-unwatchedpages' => 'Vaadata jälgimata lehekülgede nimekirja',
-'right-trackback' => "Lähetada ''trackback''",
'right-mergehistory' => 'Ühendada lehekülgede ajalood',
'right-userrights' => 'Muuta kõiki kasutajaõigusi',
'right-userrights-interwiki' => 'Muuta teiste vikide kasutajate õigusi',
'right-siteadmin' => 'Panna lukku ja lukust lahti teha andmebaasi',
'right-override-export-depth' => 'Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni',
'right-sendemail' => 'Saata teistele kasutajatele e-kirju',
+'right-passwordreset' => 'Vaadata parooli lähtestamise e-kirju',
# User rights log
'rightslog' => 'Kasutaja õiguste logi',
@@ -1551,16 +1562,17 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'action-suppressionlog' => 'seda eralogi vaadata',
'action-block' => 'selle kasutaja redigeerimisõigust blokeerida',
'action-protect' => 'selle lehekülje kaitsetasemeid muuta',
+'action-rollback' => 'lehekülge viimati redigeeriund kasutaja muudatusi koheselt tühistada',
'action-import' => 'seda lehekülge teisest vikist importida',
'action-importupload' => 'seda lehekülge faili üleslaadimise abil importida',
'action-patrol' => 'teiste muudatusi kontrollituks märkida',
'action-autopatrol' => 'oma muudatusi kontrollituks märkida',
'action-unwatchedpages' => 'jälgimata lehekülgede loendit vaadata',
-'action-trackback' => "''trackbacki'' lähetada",
'action-mergehistory' => 'selle lehekülje ajalugu liita',
'action-userrights' => 'kõiki kasutajaõigusi muuta',
'action-userrights-interwiki' => 'teiste vikide kasutajate õigusi muuta',
'action-siteadmin' => 'andmebaasi lukustada või avada',
+'action-sendemail' => 'e-kirju saata',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
@@ -1592,6 +1604,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|jälgiv kasutaja|jälgivat kasutajat}}]',
'rc_categories' => 'Ainult kategooriatest (eraldajaks "|")',
'rc_categories_any' => 'Mistahes',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bait|baiti}} pärast muudatust',
'newsectionsummary' => '/* $1 */ uus alajaotus',
'rc-enhanced-expand' => 'Näita üksikasju (nõuab JavaScripti)',
'rc-enhanced-hide' => 'Peida üksikasjad',
@@ -1601,7 +1614,6 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
'recentchangeslinked-feed' => 'Seotud muudatused',
'recentchangeslinked-toolbox' => 'Seotud muudatused',
'recentchangeslinked-title' => 'Leheküljega "$1" seotud muudatused',
-'recentchangeslinked-backlink' => '↠$1',
'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.",
@@ -1646,6 +1658,7 @@ Faili lisamiseks artiklile kasuta linki ühel kujul järgnevatest.
'ignorewarnings' => 'Ignoreeri hoiatusi',
'minlength1' => 'Faili nimes peab olema vähemalt üks kirjamärk.',
'illegalfilename' => 'Faili "$1" nimi sisaldab sümboleid, mis pole pealkirjades lubatud. Palun nimetage fail ümber ja proovige uuesti.',
+'filename-toolong' => 'Failinimed ei või olla pikemad kui 240 baiti.',
'badfilename' => 'Pildi nimi on muudetud. Uus nimi on "$1".',
'filetype-mime-mismatch' => 'Faililaiend ".$1" ei vasta faili ($2) MIME tüübile.',
'filetype-badmime' => 'MIME tüübiga "$1" faile ei ole lubatud üles laadida.',
@@ -1744,6 +1757,31 @@ Kui probleem ei kao, võta ühendust [[Special:ListUsers/sysop|administraatoriga
'upload-unknown-size' => 'Tundmatu suurus',
'upload-http-error' => 'HTTP-viga: $1',
+# File backend
+'backend-fail-stream' => 'Faili $1 ei saanud edastada.',
+'backend-fail-backup' => 'Faili $1 ei saanud varundada.',
+'backend-fail-notexists' => 'Faili $1 pole olemas.',
+'backend-fail-hashes' => 'Võrdluseks ei saanud hankida faili räsiväärtusi.',
+'backend-fail-notsame' => 'Asukohas $1 on juba olemas mitteidentne fail.',
+'backend-fail-invalidpath' => '$1 pole sobiv talletustee.',
+'backend-fail-delete' => 'Faili $1 ei saa kustutada.',
+'backend-fail-alreadyexists' => 'Fail $1 on juba olemas.',
+'backend-fail-store' => 'Faili $1 ei saa talletada asukohas $2.',
+'backend-fail-copy' => 'Faili $1 ei saa kopeerida asukohta $2.',
+'backend-fail-move' => 'Faili $1 ei saa teisaldada asukohta $2.',
+'backend-fail-opentemp' => 'Ajutist faili ei saa avada.',
+'backend-fail-writetemp' => 'Ajutist faili ei saa kirjutada.',
+'backend-fail-closetemp' => 'Ajutist faili ei saa sulgeda.',
+'backend-fail-read' => 'Faili $1 ei saa lugeda.',
+'backend-fail-create' => 'Faili $1 ei saa luua.',
+'backend-fail-contenttype' => 'Faili, mida soovitakse talletada asukohas "$1", sisutüüpi saanud kindlaks teha.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Rada "$1" ei saa lukust lahti teha, sest see pole lukus.',
+'lockmanager-fail-closelock' => 'Raja "$1" lukustusfaili ei saa sulgeda.',
+'lockmanager-fail-deletelock' => 'Raja "$1" lukustusfaili ei saa kustutada.',
+'lockmanager-fail-openlock' => 'Raja "$1" lukustusfaili ei saa avada.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Faili avamisel ZIP-kontrolliks tekkis tõrge.',
'zip-wrong-format' => 'Valitud fail ei ole ZIP-fail.',
@@ -1866,23 +1904,24 @@ Järgnevas loetelus on kuvatud ainult {{PLURAL:$1|esimene viitav lehekülg|esime
'filerevert-badversion' => 'Failist ei ole kohalikku versiooni tagatud ajamarkeeringuga.',
# File deletion
-'filedelete' => 'Kustuta $1',
-'filedelete-legend' => 'Faili kustutamine',
-'filedelete-intro' => "Oled kustutamas faili '''[[Media:$1|$1]]''' ja kogu selle ajalugu.",
-'filedelete-intro-old' => "Sa kustutad faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2] kasutusel olnud versiooni.",
-'filedelete-comment' => 'Põhjus:',
-'filedelete-submit' => 'Kustuta',
-'filedelete-success' => "'''$1''' on kustutatud.",
-'filedelete-success-old' => "Faili '''[[Media:$1|$1]]''' seisuga $3, $2 kasutusel olnud versioon on kustutatud.",
-'filedelete-nofile' => "Faili '''$1''' ei ole.",
-'filedelete-nofile-old' => "Failist '''$1''' ei ole soovitud versiooni.",
-'filedelete-otherreason' => 'Muu või täiendav põhjus:',
-'filedelete-reason-otherlist' => 'Muu põhjus',
-'filedelete-reason-dropdown' => '*Harilikud kustutamise põhjused
+'filedelete' => 'Kustuta $1',
+'filedelete-legend' => 'Faili kustutamine',
+'filedelete-intro' => "Oled kustutamas faili '''[[Media:$1|$1]]''' ja kogu selle ajalugu.",
+'filedelete-intro-old' => "Sa kustutad faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2] kasutusel olnud versiooni.",
+'filedelete-comment' => 'Põhjus:',
+'filedelete-submit' => 'Kustuta',
+'filedelete-success' => "'''$1''' on kustutatud.",
+'filedelete-success-old' => "Faili '''[[Media:$1|$1]]''' seisuga $3, $2 kasutusel olnud versioon on kustutatud.",
+'filedelete-nofile' => "Faili '''$1''' ei ole.",
+'filedelete-nofile-old' => "Failist '''$1''' ei ole soovitud versiooni.",
+'filedelete-otherreason' => 'Muu või täiendav põhjus:',
+'filedelete-reason-otherlist' => 'Muu põhjus',
+'filedelete-reason-dropdown' => '*Harilikud kustutamise põhjused
** Autoriõiguste rikkumine
** Duplikaat',
-'filedelete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
-'filedelete-maintenance' => 'Failide kustutamine ja taastamine on hoolduse ajaks keelatud.',
+'filedelete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
+'filedelete-maintenance' => 'Failide kustutamine ja taastamine on hoolduse ajaks keelatud.',
+'filedelete-maintenance-title' => 'Faili ei saa kustutada',
# MIME search
'mimesearch' => 'MIME otsing',
@@ -1980,6 +2019,8 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise Ã
'wantedpages' => 'Kõige oodatumad leheküljed',
'wantedpages-badtitle' => 'Tulemuste seas on vigane pealkiri: $1',
'wantedfiles' => 'Kõige oodatumad failid',
+'wantedfiletext-cat' => 'Järgmised failid puuduvad, aga on lehekülgedel kasutuses. Siin võivad olla loetletud ka välistes hoidlates asuvad failid, hoolimata sellest, et nad tegelikult olemas on. Loendi sellised valeliikmed on <del>läbi kriipsutatud</del>. Lisaks on puuduvaid faile sisaldavad leheküljed loetletud asukohas [[:$1]].',
+'wantedfiletext-nocat' => 'Järgmised failid puuduvad, aga on lehekülgedel kasutuses. Siin võivad olla loetletud ka välistes hoidlates asuvad failid, hoolimata sellest, et nad tegelikult olemas on. Loendi sellised valeliikmed on <del>läbi kriipsutatud</del>.',
'wantedtemplates' => 'Kõige oodatumad mallid',
'mostlinked' => 'Kõige viidatumad leheküljed',
'mostlinkedcategories' => 'Kõige viidatumad kategooriad',
@@ -1988,6 +2029,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise Ã
'mostimages' => 'Kõige kasutatumad failid',
'mostrevisions' => 'Kõige pikema redigeerimislooga leheküljed',
'prefixindex' => 'Kõik pealkirjad eesliitega',
+'prefixindex-namespace' => 'Kõik pealkirjad eesliitega (nimeruumis $1)',
'shortpages' => 'Lühikesed leheküljed',
'longpages' => 'Pikad leheküljed',
'deadendpages' => 'Edasipääsuta leheküljed',
@@ -2098,12 +2140,8 @@ Toetatud protokollid: <tt>$1</tt> (otsingus ära neid kasuta).',
'activeusers-noresult' => 'Kasutajaid ei leidunud.',
# Special:Log/newusers
-'newuserlogpage' => 'Kasutaja loomise logi',
-'newuserlogpagetext' => 'See logi sisaldab infot äsja loodud uute kasutajate kohta.',
-'newuserlog-byemail' => 'parool saadetud e-postiga',
-'newuserlog-create-entry' => 'Uus kasutaja',
-'newuserlog-create2-entry' => 'lõi uue konto $1',
-'newuserlog-autocreate-entry' => 'Konto loodud automaatselt',
+'newuserlogpage' => 'Kasutaja loomise logi',
+'newuserlogpagetext' => 'See logi sisaldab infot äsja loodud uute kasutajate kohta.',
# Special:ListGroupRights
'listgrouprights' => 'Kasutajarühma õigused',
@@ -2131,7 +2169,7 @@ Toetatud protokollid: <tt>$1</tt> (otsingus ära neid kasuta).',
'emailpage' => 'Saada kasutajale e-kiri',
'emailpagetext' => 'Kui see kasutaja on oma eelistuste lehel sisestanud e-posti aadressi, saad alloleva vormi kaudu talle kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli "Kellelt" e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste lehel]].',
'usermailererror' => 'Saatmise viga:',
-'defemailsubject' => 'E-kiri {{GRAMMAR:elative|{{SITENAME}}}}',
+'defemailsubject' => 'E-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajalt $1',
'usermaildisabled' => 'Kasutajatele e-kirjade saatmine keelatud',
'usermaildisabledtext' => 'Selles vikis ei saa teistele kasutajatele e-kirju saata.',
'noemailtitle' => 'E-posti aadressi pole',
@@ -2188,7 +2226,7 @@ Kui tahad seda lehte hiljem jälgimisloendist eemaldada, klõpsa päisenupule \"
'watchmethod-list' => 'jälgitavate lehekülgede viimased muudatused',
'watchlistcontains' => 'Sinu jälgimisloendis on $1 {{PLURAL:$1|lehekülg|lehekülge}}.',
'iteminvalidname' => "Probleem üksusega '$1'. Selle nimes on viga.",
-'wlnote' => "Allpool on {{PLURAL:$1|viimane muudatus|viimased '''$1''' muudatust}} viimase {{PLURAL:$2|tunni|'''$2''' tunni}} jooksul.",
+'wlnote' => "Allpool on {{PLURAL:$1|viimane muudatus|viimased '''$1''' muudatust}} viimase {{PLURAL:$2|tunni|'''$2''' tunni}} jooksul seisuga $3, $4.",
'wlshowlast' => 'Näita viimast $1 tundi $2 päeva. $3',
'watchlist-options' => 'Jälgimisloendi võimalused',
@@ -2251,8 +2289,6 @@ Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et s
'actioncomplete' => 'Toiming sooritatud',
'actionfailed' => 'Tegevus ebaõnnestus',
'deletedtext' => '"$1" on kustutatud. Kustutatud leheküljed on ära toodud eraldi loendis ($2).',
-'deletedarticle' => 'kustutas lehekülje "[[$1]]"',
-'suppressedarticle' => 'varjas lehekülje "[[$1]]"',
'dellogpage' => 'Kustutamislogi',
'dellogpagetext' => 'Allpool on esitatud nimekiri viimastest kustutamistest.
Kõik toodud kellaajad järgivad serveriaega.',
@@ -2300,7 +2336,10 @@ Mine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.',
'unprotectedarticle' => 'eemaldas lehekülje "[[$1]]" kaitse',
'movedarticleprotection' => 'teisaldas kaitsesätted läheküljelt "[[$2]]" leheküljele "[[$1]]"',
'protect-title' => 'Lehekülje "$1" kaitsemäära muutmine',
+'protect-title-notallowed' => 'Lehekülje "$1" kaitsemäära vaatamine',
'prot_1movedto2' => 'Lehekülg "[[$1]]" teisaldatud pealkirja "[[$2]]" alla',
+'protect-badnamespace-title' => 'Kaitstamatu nimeruum',
+'protect-badnamespace-text' => 'Selles nimeruumis olevaid lehekülgi ei saa kaitsta.',
'protect-legend' => 'Kaitse kinnitamine',
'protectcomment' => 'Põhjus:',
'protectexpiry' => 'Aegub:',
@@ -2322,6 +2361,7 @@ Sa saad muuta selle lehekülje kaitse staatust, kuid see ei mõjuta kaskaadkaits
'protect-level-sysop' => 'Ainult administraatorid',
'protect-summary-cascade' => 'kaskaad',
'protect-expiring' => 'aegub $1 (UTC)',
+'protect-expiring-local' => 'aegub $1',
'protect-expiry-indefinite' => 'määramatu',
'protect-cascade' => 'Kaitse lehekülgi, mis on lülitatud käesoleva lehekülje koosseisu (kaskaadkaitse)',
'protect-cantedit' => 'Sa ei saa lehekülje kaitsetaset muuta, sest sul puudub lehekülje redigeerimise õigus.',
@@ -2381,7 +2421,6 @@ Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist e
'undeletereset' => 'Tühjenda',
'undeleteinvert' => 'Pööra valim teistpidi',
'undeletecomment' => 'Põhjus:',
-'undeletedarticle' => 'taastas lehekülje "[[$1]]"',
'undeletedrevisions' => '$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} taastatud',
'undeletedrevisions-files' => '{{PLURAL:$1|1 redaktsioon|$1 redaktsiooni}} ja {{PLURAL:$2|1 fail|$2 faili}} taastatud',
'undeletedfiles' => '{{PLURAL:$1|1 fail|$1 faili}} taastatud',
@@ -2390,6 +2429,7 @@ Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist e
[[Special:Log/delete|Kustutamise logist]] võib leida loendi viimastest kustutamistest ja taastamistest.",
'undelete-header' => 'Hiljuti kustutatud leheküljed leiad [[Special:Log/delete|kustutamislogist]].',
+'undelete-search-title' => 'Kustutatud lehekülgede otsimine',
'undelete-search-box' => 'Otsi kustutatud lehekülgi',
'undelete-search-prefix' => 'Näita lehekülgi, mille pealkiri algab nii:',
'undelete-search-submit' => 'Otsi',
@@ -2399,6 +2439,7 @@ Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist e
'undelete-cleanup-error' => 'Kasutamata arhiivifaili "$1" kustutamine ebaõnnestus.',
'undelete-missing-filearchive' => 'Failiarhiivi tunnusega $1 ei saa taastada, sest seda pole andmebaasis.
Võimalik, et see on juba taastatud.',
+'undelete-error' => 'Tõrge lehekülje taastamisel',
'undelete-error-short' => 'Faili $1 taastamine ebaõnnestus',
'undelete-error-long' => 'Faili taastamine ebaõnnestus:
@@ -2518,6 +2559,7 @@ Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
'blocklist-userblocks' => 'Peida kontod',
'blocklist-tempblocks' => 'Peida ajutised',
'blocklist-addressblocks' => 'Peida üksikud IP-aadressid',
+'blocklist-rangeblocks' => 'Peida vahemikublokeeringud',
'blocklist-timestamp' => 'Ajatempel',
'blocklist-target' => 'Blokeeritav',
'blocklist-expiry' => 'Aegumistähtaeg',
@@ -2540,6 +2582,7 @@ Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
'unblocklink' => 'lõpeta blokeerimine',
'change-blocklink' => 'muuda blokeeringut',
'contribslink' => 'kaastöö',
+'emaillink' => 'saada e-kiri',
'autoblocker' => 'Automaatselt blokeeritud, kuna [[User:$1|$1]] on hiljuti sinu IP-aadressi kasutanud. Põhjus: $2',
'blocklogpage' => 'Blokeerimislogi',
'blocklog-showlog' => 'See kasutaja on varem blokeeritud. Allpool on toodud blokeerimislogi sissekanne:',
@@ -2662,9 +2705,6 @@ Neil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
'movepage-page-moved' => 'Lehekülg $1 on teisaldatud pealkirja $2 alla.',
'movepage-page-unmoved' => 'Lehekülge $1 ei saanud teisaldada pealkirja $2 alla.',
'movepage-max-pages' => 'Teisaldatud on $1 {{PLURAL:$1|lehekülg|lehekülge}}, mis on teisaldatavate lehekülgede ülemmäär. Rohkem lehekülgi automaatselt ei teisaldata.',
-'1movedto2' => 'teisaldas lehekülje [[$1]] pealkirja [[$2]] alla',
-'1movedto2_redir' => 'teisaldas lehekülje [[$1]] ümbersuunamisega pealkirja [[$2]] alla',
-'move-redirect-suppressed' => 'ümbersuunamiseta',
'movelogpage' => 'Teisaldamislogi',
'movelogpagetext' => 'See logi sisaldab infot lehekülgede teisaldamistest.',
'movesubpage' => '{{PLURAL:$1|Alamlehekülg|Alamleheküljed}}',
@@ -2677,7 +2717,7 @@ Neil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
Sihtlehekülg "[[:$1]]" on juba olemas.
Kas kustutad selle, et luua võimalus teisaldamiseks?',
'delete_and_move_confirm' => 'Jah, kustuta lehekülg',
-'delete_and_move_reason' => 'Kustutatud, et asemele tõsta teine lehekülg',
+'delete_and_move_reason' => 'Kustutatud, et tõsta asemele lehekülg "[[$1]]"',
'selfmove' => 'Algne nimi ja uus nimi on samad.',
'immobile-source-namespace' => 'Lehekülgi ei saa teisaldada nimeruumis $1',
'immobile-target-namespace' => 'Lehekülgi ei saa teisaldada nimeruumi "$1"',
@@ -2706,9 +2746,11 @@ Palun kasuta mõnda teist nime.',
Et eksportida lehekülgi, sisesta nende pealkirjad all olevasse teksti kasti, iga pealkiri ise reale, ning vali kas sa soovid saada leheküljest kõiki selle vanemaid versioone (muudatusi) või soovid sa saada leheküljest vaid hetke versiooni.
Viimasel juhul võid sa näiteks "[[{{MediaWiki:Mainpage}}]]" lehekülje, jaoks kasutada samuti linki kujul: [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Ekspordi kõik leheküljed',
'exportcuronly' => 'Lisa vaid viimane versioon lehest, ning mitte kogu ajalugu',
'exportnohistory' => "----
'''Märkus:''' Lehekülgede täieliku ajaloo eksportimine on siin leheküljel jõudluse tagamiseks blokeeritud.",
+'exportlistauthors' => 'Lisa kõigile lehekülgedele kogu kaastööliste nimekiri',
'export-submit' => 'Ekspordi',
'export-addcattext' => 'Kõik leheküljed kategooriast:',
'export-addcat' => 'Lisa',
@@ -2741,6 +2783,8 @@ Kui soovid MediaWiki tarkvara tõlkimises osaleda siis vaata lehti [//www.mediaw
'thumbnail_error' => 'Viga pisipildi loomisel: $1',
'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.',
+'thumbnail-dest-create' => 'Pisipilti ei õnnestu sihtkohas salvestada',
'thumbnail_invalid_params' => 'Vigased pisipildi parameetrid',
'thumbnail_dest_directory' => 'Sihtkataloogi loomine ebaõnnestus.',
'thumbnail_image-type' => 'Selline pildi tüüp ei ole toetatav',
@@ -2790,6 +2834,11 @@ Puudub ajutine kataloog.',
'import-token-mismatch' => 'Seansiandmed läksid kaduma.
Palun ürita uuesti.',
'import-invalid-interwiki' => 'Määratud vikist ei saa importida.',
+'import-error-edit' => 'Lehekülge "$1" ei imporditud, sest sul pole õigust seda muuta.',
+'import-error-create' => 'Lehekülge "$1" ei imporditud, sest sul pole õigust seda luua.',
+'import-error-interwiki' => 'Lehekülge "$1" ei impordita, sest selle pealkirja hoitakse välislinkide (interviki) jaoks.',
+'import-error-special' => 'Lehekülge "$1" ei impordita, sest see kuulub erinimeruumi, kus pole leheküljed lubatud.',
+'import-error-invalid' => 'Lehekülge "$1" ei impordita, sest selle pealkiri on vigane.',
# Import log
'importlogpage' => 'Impordilogi',
@@ -2799,74 +2848,87 @@ Palun ürita uuesti.',
'import-logentry-interwiki' => 'importis teisest vikist lehekülje $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} asukohast $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScripti katsetamine',
+'javascripttest-disabled' => 'See toiming on keelatud.',
+'javascripttest-title' => '$1-katse käitus',
+'javascripttest-pagetext-noframework' => 'Seda lehekülge hoitakse JavaScripti katsete jaoks.',
+'javascripttest-pagetext-unknownframework' => 'Tundmatu katseraamistik "$1".',
+'javascripttest-pagetext-frameworks' => 'Palun vali üks järgmistest katseraamistikest: $1',
+'javascripttest-pagetext-skins' => 'Vali kujundus, millega katsetada:',
+'javascripttest-qunit-intro' => 'Vaata [$1 katsetamise dokumentatsiooni] asukohas mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScripti QUnit-katsekomplekt',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Sinu kasutajaleht',
-'tooltip-pt-anonuserpage' => 'Selle IP aadressi kasutajaleht',
-'tooltip-pt-mytalk' => 'Minu aruteluleht',
-'tooltip-pt-anontalk' => 'Arutelu sellelt IP aadressilt tehtud muudatuste kohta',
-'tooltip-pt-preferences' => 'Minu eelistused',
-'tooltip-pt-watchlist' => 'Lehekülgede loend, mida jälgid muudatuste osas',
-'tooltip-pt-mycontris' => 'Sinu kaastööde loend',
-'tooltip-pt-login' => 'Me julgustame teid sisse logima, kuid see pole kohustuslik.',
-'tooltip-pt-anonlogin' => 'Me julgustame teid sisse logima, kuid see pole kohustuslik.',
-'tooltip-pt-logout' => 'Logi välja',
-'tooltip-ca-talk' => 'Selle artikli arutelu',
-'tooltip-ca-edit' => 'Saad seda lehekülge redigeerida. Palun kasuta enne salvestamist eelvaadet.',
-'tooltip-ca-addsection' => 'Lisa uus alaosa',
-'tooltip-ca-viewsource' => 'See lehekülg on kaitstud.
+'tooltip-pt-userpage' => 'Sinu kasutajaleht',
+'tooltip-pt-anonuserpage' => 'Selle IP aadressi kasutajaleht',
+'tooltip-pt-mytalk' => 'Minu aruteluleht',
+'tooltip-pt-anontalk' => 'Arutelu sellelt IP aadressilt tehtud muudatuste kohta',
+'tooltip-pt-preferences' => 'Minu eelistused',
+'tooltip-pt-watchlist' => 'Lehekülgede loend, mida jälgid muudatuste osas',
+'tooltip-pt-mycontris' => 'Sinu kaastööde loend',
+'tooltip-pt-login' => 'Me julgustame teid sisse logima, kuid see pole kohustuslik.',
+'tooltip-pt-anonlogin' => 'Me julgustame teid sisse logima, kuid see pole kohustuslik.',
+'tooltip-pt-logout' => 'Logi välja',
+'tooltip-ca-talk' => 'Selle artikli arutelu',
+'tooltip-ca-edit' => 'Saad seda lehekülge redigeerida. Palun kasuta enne salvestamist eelvaadet.',
+'tooltip-ca-addsection' => 'Lisa uus alaosa',
+'tooltip-ca-viewsource' => 'See lehekülg on kaitstud.
Saad vaadata selle lähteteksti.',
-'tooltip-ca-history' => 'Selle lehekülje varasemad versioonid.',
-'tooltip-ca-protect' => 'Kaitse seda lehekülge',
-'tooltip-ca-unprotect' => 'Muuda selle lehekülje kaitset',
-'tooltip-ca-delete' => 'Kustuta see lehekülg',
-'tooltip-ca-undelete' => 'Taasta enne lehekülje kustutamist tehtud muudatused',
-'tooltip-ca-move' => 'Teisalda see lehekülg teise nime alla.',
-'tooltip-ca-watch' => 'Lisa see lehekülg oma jälgimisloendile',
-'tooltip-ca-unwatch' => 'Eemalda see lehekülg oma jälgimisloendist',
-'tooltip-search' => 'Otsi vikist',
-'tooltip-search-go' => 'Siirdutakse täpselt sellist pealkirja kandvale lehele (kui selline on olemas)',
-'tooltip-search-fulltext' => 'Otsitakse teksti sisaldavaid artikleid',
-'tooltip-p-logo' => 'Esileht',
-'tooltip-n-mainpage' => 'Mine esilehele',
-'tooltip-n-mainpage-description' => 'Mine esilehele',
-'tooltip-n-portal' => 'Projekti kohta, mida teha saad, kuidas asju leida',
-'tooltip-n-currentevents' => 'Leia teavet toimuvate sündmuste kohta',
-'tooltip-n-recentchanges' => 'Vikis tehtud viimaste muudatuste loend',
-'tooltip-n-randompage' => 'Mine juhuslikule leheküljele',
-'tooltip-n-help' => 'Kuidas redigeerida',
-'tooltip-t-whatlinkshere' => 'Kõik viki leheküljed, mis siia viitavad',
-'tooltip-t-recentchangeslinked' => 'Viimased muudatused lehekülgedel, milledele on siit viidatud',
-'tooltip-feed-rss' => 'Selle lehekülje RSS-toide',
-'tooltip-feed-atom' => 'Selle lehekülje Atom-toide',
-'tooltip-t-contributions' => 'Kuva selle kasutaja kaastöö',
-'tooltip-t-emailuser' => 'Saada sellele kasutajale e-kiri',
-'tooltip-t-upload' => 'Laadi faile üles',
-'tooltip-t-specialpages' => 'Erilehekülgede loend',
-'tooltip-t-print' => 'Selle lehe trükiversioon',
-'tooltip-t-permalink' => 'Püsilink lehe sellele versioonile',
-'tooltip-ca-nstab-main' => 'Näita artiklit',
-'tooltip-ca-nstab-user' => 'Näita kasutaja lehte',
-'tooltip-ca-nstab-media' => 'Näita pildi lehte',
-'tooltip-ca-nstab-special' => 'See on erilehekülg, te ei saa seda redigeerida',
-'tooltip-ca-nstab-project' => 'Näita projekti lehte',
-'tooltip-ca-nstab-image' => 'Näita pildi lehte',
-'tooltip-ca-nstab-mediawiki' => 'Näita süsteemi sõnumit',
-'tooltip-ca-nstab-template' => 'Näita malli',
-'tooltip-ca-nstab-help' => 'Näita abilehte',
-'tooltip-ca-nstab-category' => 'Näita kategooria lehte',
-'tooltip-minoredit' => 'Märgista see pisiparandusena',
-'tooltip-save' => 'Salvesta muudatused',
-'tooltip-preview' => 'Näita tehtavaid muudatusi. Palun kasutage seda enne salvestamist!',
-'tooltip-diff' => 'Näita tehtavaid muudatusi.',
-'tooltip-compareselectedversions' => 'Näita erinevusi kahe selle lehe valitud versiooni vahel.',
-'tooltip-watch' => 'Lisa see lehekülg oma jälgimisloendile',
-'tooltip-recreate' => 'Taasta kustutatud lehekülg',
-'tooltip-upload' => 'Alusta üleslaadimist',
-'tooltip-rollback' => 'Tühistab ühe klõpsuga viimase kaastöölise tehtud muudatused.',
-'tooltip-undo' => '"Eemalda" tühistab selle muudatuse ja avab teksti eelvaatega redigeerimisakna.
+'tooltip-ca-history' => 'Selle lehekülje varasemad versioonid.',
+'tooltip-ca-protect' => 'Kaitse seda lehekülge',
+'tooltip-ca-unprotect' => 'Muuda selle lehekülje kaitset',
+'tooltip-ca-delete' => 'Kustuta see lehekülg',
+'tooltip-ca-undelete' => 'Taasta enne lehekülje kustutamist tehtud muudatused',
+'tooltip-ca-move' => 'Teisalda see lehekülg teise nime alla.',
+'tooltip-ca-watch' => 'Lisa see lehekülg oma jälgimisloendile',
+'tooltip-ca-unwatch' => 'Eemalda see lehekülg oma jälgimisloendist',
+'tooltip-search' => 'Otsi vikist',
+'tooltip-search-go' => 'Siirdutakse täpselt sellist pealkirja kandvale lehele (kui selline on olemas)',
+'tooltip-search-fulltext' => 'Otsitakse teksti sisaldavaid artikleid',
+'tooltip-p-logo' => 'Esileht',
+'tooltip-n-mainpage' => 'Mine esilehele',
+'tooltip-n-mainpage-description' => 'Mine esilehele',
+'tooltip-n-portal' => 'Projekti kohta, mida teha saad, kuidas asju leida',
+'tooltip-n-currentevents' => 'Leia teavet toimuvate sündmuste kohta',
+'tooltip-n-recentchanges' => 'Vikis tehtud viimaste muudatuste loend',
+'tooltip-n-randompage' => 'Mine juhuslikule leheküljele',
+'tooltip-n-help' => 'Kuidas redigeerida',
+'tooltip-t-whatlinkshere' => 'Kõik viki leheküljed, mis siia viitavad',
+'tooltip-t-recentchangeslinked' => 'Viimased muudatused lehekülgedel, milledele on siit viidatud',
+'tooltip-feed-rss' => 'Selle lehekülje RSS-toide',
+'tooltip-feed-atom' => 'Selle lehekülje Atom-toide',
+'tooltip-t-contributions' => 'Kuva selle kasutaja kaastöö',
+'tooltip-t-emailuser' => 'Saada sellele kasutajale e-kiri',
+'tooltip-t-upload' => 'Laadi faile üles',
+'tooltip-t-specialpages' => 'Erilehekülgede loend',
+'tooltip-t-print' => 'Selle lehe trükiversioon',
+'tooltip-t-permalink' => 'Püsilink lehe sellele versioonile',
+'tooltip-ca-nstab-main' => 'Näita artiklit',
+'tooltip-ca-nstab-user' => 'Näita kasutaja lehte',
+'tooltip-ca-nstab-media' => 'Näita pildi lehte',
+'tooltip-ca-nstab-special' => 'See on erilehekülg, te ei saa seda redigeerida',
+'tooltip-ca-nstab-project' => 'Näita projekti lehte',
+'tooltip-ca-nstab-image' => 'Näita pildi lehte',
+'tooltip-ca-nstab-mediawiki' => 'Näita süsteemi sõnumit',
+'tooltip-ca-nstab-template' => 'Näita malli',
+'tooltip-ca-nstab-help' => 'Näita abilehte',
+'tooltip-ca-nstab-category' => 'Näita kategooria lehte',
+'tooltip-minoredit' => 'Märgista see pisiparandusena',
+'tooltip-save' => 'Salvesta muudatused',
+'tooltip-preview' => 'Näita tehtavaid muudatusi. Palun kasutage seda enne salvestamist!',
+'tooltip-diff' => 'Näita tehtavaid muudatusi.',
+'tooltip-compareselectedversions' => 'Näita erinevusi kahe selle lehe valitud versiooni vahel.',
+'tooltip-watch' => 'Lisa see lehekülg oma jälgimisloendile',
+'tooltip-watchlistedit-normal-submit' => 'Eemalda leheküljed',
+'tooltip-watchlistedit-raw-submit' => 'Uuenda jälgimisloendit',
+'tooltip-recreate' => 'Taasta kustutatud lehekülg',
+'tooltip-upload' => 'Alusta üleslaadimist',
+'tooltip-rollback' => 'Tühistab ühe klõpsuga viimase kaastöölise tehtud muudatused.',
+'tooltip-undo' => '"Eemalda" tühistab selle muudatuse ja avab teksti eelvaatega redigeerimisakna.
Samuti võimaldab see resümee reale põhjenduse lisamist.',
-'tooltip-preferences-save' => 'Salvesta eelistused',
-'tooltip-summary' => 'Kirjuta lühike kokkuvõte',
+'tooltip-preferences-save' => 'Salvesta eelistused',
+'tooltip-summary' => 'Kirjuta lühike kokkuvõte',
# Stylesheets
'common.css' => '/* Siin olevat CSS-i kasutavad kõik kujundused. */',
@@ -2937,9 +2999,6 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
# Patrol log
'patrol-log-page' => 'Kontrollimislogi',
'patrol-log-header' => 'See on kontrollitud redaktsioonide logi.',
-'patrol-log-line' => 'märkis $1 leheküljel $2 kontrollituks $3',
-'patrol-log-auto' => '(automaatne)',
-'patrol-log-diff' => 'versiooni $1',
'log-show-hide-patrol' => '$1 kontrollimislogi',
# Image deletion
@@ -2958,23 +3017,25 @@ $1',
'nextdiff' => 'Järgmised erinevused →',
# Media information
-'mediawarning' => "'''Hoiatus''': See failitüüp võib sisaldada pahatahtlikku koodi.
+'mediawarning' => "'''Hoiatus''': See failitüüp võib sisaldada pahatahtlikku koodi.
Selle avamine võib su arvutit kahjustada.",
-'imagemaxsize' => "Pildi suuruse ülemmäär:<br />''(faili kirjeldusleheküljel)''",
-'thumbsize' => 'Pisipildi suurus:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|lehekülg|lehekülge}}',
-'file-info' => 'faili suurus: $1, MIME tüüp: $2',
-'file-info-size' => '$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4',
-'file-info-size-pages' => '$1 × $2 pikslit, faili suurus: $3 , MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}',
-'file-nohires' => '<small>Sellest suuremat pilti pole.</small>',
-'svg-long-desc' => 'SVG fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
-'show-big-image' => 'Originaalsuurus',
-'show-big-image-size' => '$1 × $2 pikslit',
-'file-info-gif-looped' => 'korduv',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
-'file-info-png-looped' => 'korduv',
-'file-info-png-repeat' => 'mängitud $1 {{PLURAL:$1|korra|korda}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
+'imagemaxsize' => "Pildi suuruse ülemmäär:<br />''(faili kirjeldusleheküljel)''",
+'thumbsize' => 'Pisipildi suurus:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|lehekülg|lehekülge}}',
+'file-info' => 'faili suurus: $1, MIME tüüp: $2',
+'file-info-size' => '$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4',
+'file-info-size-pages' => '$1 × $2 pikslit, faili suurus: $3 , MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}',
+'file-nohires' => 'Sellest suuremat pilti pole.',
+'svg-long-desc' => 'SVG fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
+'show-big-image' => 'Originaalsuurus',
+'show-big-image-preview' => 'Selle eelvaate suurus: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Teine eraldusvõime|Teised eraldusvõimed}}: $1.',
+'show-big-image-size' => '$1 × $2 pikslit',
+'file-info-gif-looped' => 'korduv',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
+'file-info-png-looped' => 'korduv',
+'file-info-png-repeat' => 'mängitud $1 {{PLURAL:$1|korra|korda}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kaader|kaadrit}}',
# Special:NewFiles
'newimages' => 'Uute meediafailide galerii',
@@ -2989,6 +3050,13 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
'bydate' => 'kuupäeva järgi',
'sp-newimages-showfrom' => 'Näita uusi faile alates $2 $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|üks sekund|$1 sekundit}}',
+'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
+'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
+'days' => '{{PLURAL:$1|üks päev|$1 päeva}}',
+'ago' => '$1 tagasi',
+
# 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.
@@ -3449,9 +3517,6 @@ Selle kinnituskoodi aegumistähtaeg on $4.',
# Scary transclusion
'scarytranscludetoolong' => '[URL on liiga pikk]',
-# Trackbacks
-'trackbackremove' => '([$1 Kustuta])',
-
# Delete conflict
'deletedwhileediting' => "'''Hoiatus''': Sel ajal, kui sina lehekülge redigeerisid, kustutas keegi selle ära!",
'confirmrecreate' => "Kasutaja [[User:$1|$1]] ([[User talk:$1|arutelu]]) kustutas lehekülje sellel ajal, kui sina seda redigeerisid. Põhjus:
@@ -3532,6 +3597,9 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
'watchlisttools-edit' => 'Vaata ja redigeeri jälgimisloendit',
'watchlisttools-raw' => 'Muuda lähteteksti',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|arutelu]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tundmatu lisa märgend "$1".',
'duplicate-defaultsort' => '\'\'\'Hoiatus:\'\'\' Järjestamisvõti "$2" tühistab eespool oleva järjestamisvõtme "$1".',
@@ -3630,13 +3698,16 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'tags-hitcount' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
# Special:ComparePages
-'comparepages' => 'Lehekülgede kõrvutamine',
-'compare-selector' => 'Lehekülje redaktsioonide kõrvutamine',
-'compare-page1' => 'Lehekülg 1',
-'compare-page2' => 'Lehekülg 2',
-'compare-rev1' => 'Redaktsioon&nbsp;1',
-'compare-rev2' => 'Redaktsioon&nbsp;2',
-'compare-submit' => 'Kõrvuta',
+'comparepages' => 'Lehekülgede kõrvutamine',
+'compare-selector' => 'Lehekülje redaktsioonide kõrvutamine',
+'compare-page1' => 'Lehekülg 1',
+'compare-page2' => 'Lehekülg 2',
+'compare-rev1' => 'Redaktsioon&nbsp;1',
+'compare-rev2' => 'Redaktsioon&nbsp;2',
+'compare-submit' => 'Kõrvuta',
+'compare-invalid-title' => 'Valitud pealkiri on vigane.',
+'compare-title-not-exists' => 'Valitud pealkirja ei ole.',
+'compare-revision-not-exists' => 'Valitud redaktsiooni ei ole.',
# Database error messages
'dberr-header' => 'Selles vikis on probleem',
@@ -3663,4 +3734,88 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'sqlite-has-fts' => '$1 koos täistekstiotsingu toega',
'sqlite-no-fts' => '$1 ilma täistekstiotsingu toeta',
+# New logging system
+'logentry-delete-delete' => '$1 kustutas lehekülje $3',
+'logentry-delete-restore' => '$1 taastas lehekülje $3',
+'logentry-delete-event' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-delete-revision' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-delete-event-legacy' => '$1 muutis leheküljel $3 logisündmuste nähtavust',
+'logentry-delete-revision-legacy' => '$1 muutis leheküljel $3 redaktsioonide nähtavust',
+'logentry-suppress-delete' => '$1 varjas lehekülje $3',
+'logentry-suppress-event' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-suppress-revision' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-suppress-event-legacy' => '$1 muutis salaja leheküljel $3 logisündmuste nähtavust',
+'logentry-suppress-revision-legacy' => '$1 muutis salaja leheküljel $3 redaktsioonide nähtavust',
+'revdelete-content-hid' => 'peideti sisu',
+'revdelete-summary-hid' => 'peideti resümee',
+'revdelete-uname-hid' => 'peideti kasutajanimi',
+'revdelete-content-unhid' => 'nähtavaks tehti sisu',
+'revdelete-summary-unhid' => 'nähtavaks tehti resümee',
+'revdelete-uname-unhid' => 'nähtavaks tehti kasutajanimi',
+'revdelete-restricted' => 'kehtestati piirangud administraatoritele',
+'revdelete-unrestricted' => 'eemaldati administraatoritelt piirangud',
+'logentry-move-move' => '$1 teisaldas lehekülje $3 pealkirja $4 alla',
+'logentry-move-move-noredirect' => '$1 teisaldas lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
+'logentry-patrol-patrol' => '$1 märkis lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-patrol-patrol-auto' => '$1 märkis automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-newusers-newusers' => '$1 tegi kasutajakonto',
+'logentry-newusers-create' => '$1 tegi kasutajakonto',
+'logentry-newusers-create2' => '$1 tegi kasutajakonto $3',
+'logentry-newusers-autocreate' => 'Konto $1 loodi automaatselt',
+'newuserlog-byemail' => 'parool saadetud e-postiga',
+
+# Feedback
+'feedback-bugornote' => 'Kui arvad, et oskad tehnilist probleemi üksikasjalikult kirjeldada, [$1 teata veast].
+Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajanime ja teabega kasutatava võrgulehitsejaga kohta leheküljele "[$3 $2]".',
+'feedback-subject' => 'Teema:',
+'feedback-message' => 'Sõnum:',
+'feedback-cancel' => 'Loobu',
+'feedback-submit' => 'Saada tagasiside',
+'feedback-adding' => 'Tagasiside lisamine leheküljele...',
+'feedback-error1' => 'Tõrge: Tundmatu API tulemus',
+'feedback-error2' => 'Tõrge: Redigeerimine ebaõnnestus',
+'feedback-error3' => 'Tõrge: API ei vasta',
+'feedback-thanks' => 'Aitäh! Sinu tagasiside on postitatud leheküljele "[$2 $1]".',
+'feedback-close' => 'Valmis',
+'feedback-bugcheck' => 'Hästi! Kontrolli vaid, ega tegu pole juba [$1 teada oleva veaga].',
+'feedback-bugnew' => 'Kontrollisin. Teata uuest veast',
+
+# API errors
+'api-error-badaccess-groups' => 'Sul pole selles vikis üleslaadimisõigust.',
+'api-error-badtoken' => 'Sisemine tõrge: Sobimatu nimi.',
+'api-error-copyuploaddisabled' => 'URLi kaudu üleslaadimine on selles serveris keelatud.',
+'api-error-duplicate' => 'Siin on {{PLURAL:$1|[$2 teine samasisuline fail]|[$2 mõned teised samasisulised failid]}} juba olemas.',
+'api-error-duplicate-archive' => 'Siin {{PLURAL:$1|on [$2 teine samasisuline fail]|olid [$2 mõned teised samasisulised failid]}} juba olemas, aga {{PLURAL:$1|see|need}} kustutati.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplikaatfail|Duplikaatfailid}}, mis on juba kustutatud',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duplikaatfail|Duplikaatfailid}}',
+'api-error-empty-file' => 'Üleslaaditav fail on tühi.',
+'api-error-emptypage' => 'Uute tühjade lehekülgede loomine pole lubatud.',
+'api-error-fetchfileerror' => 'Sisemine tõrge: Midagi läks faili kättesaamisel valesti.',
+'api-error-file-too-large' => 'Ãœleslaaditav fail on liiga suur.',
+'api-error-filename-tooshort' => 'Failinimi on liiga lühike.',
+'api-error-filetype-banned' => 'Antud failitüüp on keelatud.',
+'api-error-filetype-missing' => 'Failinime tagant puudub laiend.',
+'api-error-hookaborted' => 'Tarkvaralisa katkestas muudatuse tegemise.',
+'api-error-http' => 'Sisetõrge: Serveriga pole võimalik ühendust luua.',
+'api-error-illegal-filename' => 'Failinimi pole lubatud.',
+'api-error-internal-error' => 'Sisetõrge: Sinu faili vikisse üleslaadimise juures läks midagi valesti.',
+'api-error-invalid-file-key' => 'Sisetõrge: Faili ei leitud ajutisest mälust.',
+'api-error-missingparam' => 'Sisetõrge: Päringust puudub mõni parameeter.',
+'api-error-missingresult' => 'Sisetõrge: Ei õnnestu kindlaks teha, kas kopeerimine õnnestus.',
+'api-error-mustbeloggedin' => 'Failide üleslaadimiseks pead sisse logima.',
+'api-error-mustbeposted' => 'Sisetõrge: Päring tuleb sooritada, kasutades HTTP POST-meetodit.',
+'api-error-noimageinfo' => 'Üleslaadimine õnnestus, aga server ei andnud faili kohta mingit teavet.',
+'api-error-nomodule' => 'Sisetõrge: Üleslaadimismoodul on määramata.',
+'api-error-ok-but-empty' => 'Sisetõrge: Server ei vasta.',
+'api-error-overwrite' => 'Olemasolevate failide ülekirjutamine pole lubatud.',
+'api-error-stashfailed' => 'Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.',
+'api-error-timeout' => 'Server ei vastanud oodatud aja sees.',
+'api-error-unclassified' => 'Ilmnes teadmata tõrge.',
+'api-error-unknown-code' => 'Teadmata tõrge: "$1"',
+'api-error-unknown-error' => 'Sisetõrge: Sellal kui sinu faili üritati üles laadida, läks midagi valesti.',
+'api-error-unknown-warning' => 'Teadmata hoiatus: $1',
+'api-error-unknownerror' => 'Tundmatu tõrge: "$1".',
+'api-error-uploaddisabled' => 'Ãœleslaadimine on selles vikis keelatud.',
+'api-error-verification-error' => 'See fail võib olla rikutud või vale laiendiga.',
+
);
diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php
index 2baa1123..19ad39a2 100644
--- a/languages/messages/MessagesEu.php
+++ b/languages/messages/MessagesEu.php
@@ -103,22 +103,22 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#BIRZUZENDU', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'ORAINGOHILABETE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ORAINGOHILABETEIZEN', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'ORAINGOEGUN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ORAINGOEGUN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ORAINGOEGUNIZEN', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ORAINGOURTE', 'CURRENTYEAR' ),
- 'numberofpages' => array( '1', 'ORRIALDEKOPURU', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ARTIKULUKOPURU', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FITXATEGIKOPURU', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'LANKIDEKOPURU', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'ALDAKETAKOPURU', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'ORRIALDEIZEN', 'PAGENAME' ),
- 'img_right' => array( '1', 'eskuinera', 'right' ),
- 'img_left' => array( '1', 'ezkerrera', 'left' ),
- 'img_center' => array( '1', 'erdian', 'center', 'centre' ),
+ 'redirect' => array( '0', '#BIRZUZENDU', '#REDIRECT' ),
+ 'currentmonth' => array( '1', 'ORAINGOHILABETE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ORAINGOHILABETEIZEN', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'ORAINGOEGUN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ORAINGOEGUN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ORAINGOEGUNIZEN', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ORAINGOURTE', 'CURRENTYEAR' ),
+ 'numberofpages' => array( '1', 'ORRIALDEKOPURU', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ARTIKULUKOPURU', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FITXATEGIKOPURU', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'LANKIDEKOPURU', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ALDAKETAKOPURU', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'ORRIALDEIZEN', 'PAGENAME' ),
+ 'img_right' => array( '1', 'eskuinera', 'right' ),
+ 'img_left' => array( '1', 'ezkerrera', 'left' ),
+ 'img_center' => array( '1', 'erdian', 'center', 'centre' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' ); /* Bug 15717 */
@@ -478,14 +478,13 @@ Mesedez, bidali gertakar hau administradore bati, URLaren izena jarriz.',
Baliteke beste norbaitek ezabatu izana.',
'badtitle' => 'Izenburu ezegokia',
'badtitletext' => 'Eskatutako orrialde izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat izatea.',
-'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea:',
-'perfcachedts' => 'Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz.',
+'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Orrialde honen berritzeak ez dira baimentzen. Hemen dagoen data ez da zuzenean berrituko.',
'wrong_wfQuery_params' => 'Baliogabeko parametroak eman zaizkio wfQuery() funtzioari<br />
Funtzioa: $1<br />
Kontsulta: $2',
'viewsource' => 'Kodea ikusi',
-'viewsourcefor' => '$1(r)entzako',
'actionthrottled' => 'Ekintzaren gainetik pasa da',
'actionthrottledtext' => 'Spamaren aurkako neurri gisa ekintza hau denbora tarte laburrean aldi askotan egiteko mugapena duzu, eta muga hori zeharkatu duzu.
Saia zaitez berriro minutu batzuen buruan, mesedez.',
@@ -635,6 +634,12 @@ Agian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat
Behin-behineko pasahitza: $2',
'passwordreset-emailsent' => 'Gogorarazteko e-posta bidali da.',
+# Special:ChangeEmail
+'changeemail-newemail' => 'E-posta helbide berria:',
+'changeemail-none' => '(bat ere ez)',
+'changeemail-submit' => 'E-posta aldatu',
+'changeemail-cancel' => 'Utzi',
+
# Edit page toolbar
'bold_sample' => 'Testu beltza',
'bold_tip' => 'Testu beltza',
@@ -702,9 +707,6 @@ Orain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5 da.
Eman itzazu datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
'blockednoreason' => 'ez da arrazoirik zehaztu',
-'blockedoriginalsource' => "Jarraian ikus daiteke '''$1'''(r)en kodea:",
-'blockededitsource' => "Jarraian ikus daitezke '''$1'''(e)n egin dituzun aldaketak:",
-'whitelistedittitle' => 'Saioa hastea beharrezkoa da aldaketak egiteko',
'whitelistedittext' => '$1 behar duzu orrialdeak aldatu ahal izateko..',
'confirmedittext' => 'Orrialdeetan aldaketak egin aurretik zure e-posta helbidea egiaztatu beharra daukazu. Mesedez, zehaztu eta egiaztatu zure e-posta helbidea [[Special:Preferences|hobespenetan]].',
'nosuchsectiontitle' => 'Atala ez da aurkitu',
@@ -947,8 +949,6 @@ Administratzailea zarenez, diff hau ikus dezakezu. Xehetasunak ikusgai daude [{{
'revdelete-unsuppress' => 'Berrezarritako aldaketen mugak kendu',
'revdelete-log' => 'Arrazoia:',
'revdelete-submit' => 'Hautatutako {{PLURAL:$1|berrikuspenari|berrikuspenei}} aplikatu',
-'revdelete-logentry' => '[[$1]] wikilariak egindako berriskupenaren ikusgaitasuna aldatu da',
-'logdelete-logentry' => '[[$1]] zerrendako gertakarien ikusgaitasuna aldatu da',
'revdelete-success' => "'''Berrikuspenen ikusgarritasuna eguneratu da.'''",
'revdelete-failure' => "'''Ezin da berrikuspenaren ikuspena eguneratu:'''
$1",
@@ -960,15 +960,6 @@ $1",
'revdel-restore-visible' => 'ageriko berrikuspenak',
'pagehist' => 'Orriaren historia',
'deletedhist' => 'Ezabatutako historia',
-'revdelete-content' => 'edukia',
-'revdelete-summary' => 'aldaketaren laburpena',
-'revdelete-uname' => 'lankide izena',
-'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
-'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
-'revdelete-hid' => '$1 ezkutatu da',
-'revdelete-unhid' => '$1 agerrarazi da',
-'revdelete-log-message' => '$1 {{PLURAL:$2|berrikuste baterako|$2 berrikustetarako}}',
-'logdelete-log-message' => '$1 {{PLURAL:$2|gertakari baterako|$2 gertakaritarako}}',
'revdelete-hide-current' => 'Errorea, $1 $2 data duen elementua ezkutatzean: hau da oraingo bertsioa.
Ezin da ezkutatu.',
'revdelete-show-no-access' => 'Errorea, $1 $2 data duen elementua erakustean: elementu hau «mugatua» dela markatu da.
@@ -1124,7 +1115,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'prefs-rc' => 'Azken aldaketak',
'prefs-watchlist' => 'Jarraipen zerrenda',
'prefs-watchlist-days' => 'Jarraipen zerrendan erakutsi beharreko egun kopurua:',
-'prefs-watchlist-days-max' => 'Gehienez 7 egun',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Jarraipen zerrendan erakutsi beharreko aldaketa kopurua:',
'prefs-watchlist-edits-max' => 'Gehenezko zenbakia: 1000',
'prefs-watchlist-token' => 'Jarraipen zerrendaren tokena:',
@@ -1223,7 +1214,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
'userrights-lookup-user' => 'Erabiltzaile taldeak kudeatu',
'userrights-user-editname' => 'Erabiltzaile izena idatzi:',
'editusergroup' => 'Erabiltzaile taldeak editatu',
-'editinguser' => "'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) lankidearen erabiltzaile-eskubideak aldatzen",
+'editinguser' => "'''[[User:$1|$1]]''' $2 lankidearen erabiltzaile-eskubideak aldatzen",
'userrights-editusergroup' => 'Erabiltzaile taldeak editatu',
'saveusergroups' => 'Erabiltzaile taldeak gorde',
'userrights-groupsmember' => 'Partaide da hemen:',
@@ -1317,7 +1308,6 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
'right-autopatrol' => 'Norberak egiten dituen aldaketa guztiak automatikoki gain-ikusi gisa markatu',
'right-patrolmarks' => 'Ikusi azken aldaketen jarraitze markak',
'right-unwatchedpages' => 'Ikusi gabeko orrialdeen zerrenda bat ikusi',
-'right-trackback' => 'Aipua bidali',
'right-mergehistory' => 'Orrialdeen historia batu',
'right-userrights' => 'Erabiltzaile guztien eskumenak aldatu',
'right-userrights-interwiki' => 'Beste wiki batzuetan erabiltzaileen eskumenak aldatu',
@@ -1361,7 +1351,6 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
'action-patrol' => 'besteen aldaketak patruilatu moduan markatu',
'action-autopatrol' => 'zeure aldaketak patruilatutzat markatu',
'action-unwatchedpages' => 'ikusi gabeko orrialdeen zerrenda ikusi',
-'action-trackback' => 'aipu bat bidali',
'action-mergehistory' => 'orrialde honen historia batu',
'action-userrights' => 'lankide guztien eskumenak aldatu',
'action-userrights-interwiki' => 'beste wikietako lankideen lankide-eskumenak aldatu',
@@ -1847,12 +1836,8 @@ Baimendutako protokoloak: <tt>$1</tt> (zure bilaketan hauek ez gehitu).',
'activeusers-noresult' => 'Ez da lankiderik aurkitu.',
# Special:Log/newusers
-'newuserlogpage' => 'Erabiltzaile erregistroa',
-'newuserlogpagetext' => 'Hau azken erabiltzaileen sorreren erregistroa da.',
-'newuserlog-byemail' => 'pasahitza e-postaz bidali da',
-'newuserlog-create-entry' => 'Erabiltzaile berria',
-'newuserlog-create2-entry' => '$1 kontu berria sortu da',
-'newuserlog-autocreate-entry' => 'Automatikoki sorturiko kontua',
+'newuserlogpage' => 'Erabiltzaile erregistroa',
+'newuserlogpagetext' => 'Hau azken erabiltzaileen sorreren erregistroa da.',
# Special:ListGroupRights
'listgrouprights' => 'Erabiltzaile talde eskumenak',
@@ -1879,7 +1864,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
'emailpagetext' => 'Erabiltzaile honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.
[[Special:Preferences|Hobespenetan]] daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.',
'usermailererror' => 'Mail objektuak errore hau itzuli du:',
-'defemailsubject' => 'E-posta {{SITENAME}}(e)tik',
+'defemailsubject' => '{{SITENAME}} e-posta "$1" lankideak',
'usermaildisabled' => 'Erabiltzailearen e-maila desaktibatuta',
'usermaildisabledtext' => 'Wiki honetan ezin diezu beste erabiltzaileei posta elektronikorik bidali',
'noemailtitle' => 'Posta helbiderik ez',
@@ -1929,7 +1914,7 @@ Jarraipen zerrendatik artikulua kentzeko, artikuluan ''ez jarraitu''ri eman.",
'watchmethod-list' => 'jarraipen zerrendako orrialdeak aldaketa berrien bila aztertzen',
'watchlistcontains' => 'Zure jarraipen zerrendak {{PLURAL:$1|orrialde $1 du|$1 orrialde ditu}}.',
'iteminvalidname' => "Arazoa '$1' elementuarekin, baliogabeko izena...",
-'wlnote' => "Jarraian {{PLURAL:$2|ikus daiteke azken orduko|ikus daitezke azken '''$2''' orduetako}} azken {{PLURAL:$1|aldaketa|'''$1''' aldaketak}}.",
+'wlnote' => "Jarraian {{PLURAL:$2|ikus daiteke azken orduko|ikus daitezke azken '''$2''' orduetako}} azken {{PLURAL:$1|aldaketa|'''$1''' aldaketak}}, $3, $4 gisa.",
'wlshowlast' => 'Erakutsi azken $1 orduak $2 egunak $3',
'watchlist-options' => 'Jarraitze-zerrendaren aukerak',
@@ -1991,8 +1976,6 @@ Laguntza:
'actioncomplete' => 'Ekintza burutu da',
'actionfailed' => 'Ekintzak huts egin du',
'deletedtext' => '"$1" ezabatu egin da. Ikus $2 azken ezabaketen erregistroa ikusteko.',
-'deletedarticle' => '"[[$1]]" ezabatu da',
-'suppressedarticle' => '"[[$1]]" kendua',
'dellogpage' => 'Ezabaketa erregistroa',
'dellogpagetext' => 'Behean ikus daiteke azken ezabaketen zerrenda.',
'deletionlog' => 'ezabaketa erregistroa',
@@ -2120,7 +2103,6 @@ In such cases, you must uncheck or unhide the newest deleted revision.',
'undeletereset' => 'Hasieratu',
'undeleteinvert' => 'Aukeraketa alderanztu',
'undeletecomment' => 'Arrazoia:',
-'undeletedarticle' => '"[[$1]]" leheneratu da',
'undeletedrevisions' => '{{PLURAL:$1|Berrikuspen 1 leheneratu da|$1 berrikuspen leheneratu dira}}',
'undeletedrevisions-files' => '{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira',
'undeletedfiles' => '{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira',
@@ -2365,9 +2347,6 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
'movepage-page-moved' => '$1 orrialdea $2(e)ra mugitu da.',
'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.',
'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.',
-'1movedto2' => '«[[$1]]» izenburuaren ordez, «[[$2]]» ezarri da',
-'1movedto2_redir' => '«[[$1]]» izenburuaren ordez, «[[$2]]» ezarri da, birzuzenketaren gainetik',
-'move-redirect-suppressed' => 'birzuzenketa ezabatua',
'movelogpage' => 'Mugimendu erregistroa',
'movelogpagetext' => 'Mugitutako orrialdeen zerrenda bat azaltzen da jarraian.',
'movesubpage' => '{{PLURAL:$1|Azpiorrialde|Azpiorrialdeak}}',
@@ -2619,9 +2598,6 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
# Patrol log
'patrol-log-page' => 'Patrullatze loga',
'patrol-log-header' => 'Hau patruliatutako aldaketen log bat da.',
-'patrol-log-line' => '$1etik $2 markatu da patruilatu moduan $3',
-'patrol-log-auto' => '(automatikoa)',
-'patrol-log-diff' => '$1 berrikuspena',
'log-show-hide-patrol' => '$1 patruilatze loga',
# Image deletion
@@ -2647,11 +2623,11 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|orri|orri}}',
'file-info' => 'fitxategiaren tamaina: $1, MIME mota: $2',
'file-info-size' => '$1 × $2 pixel, fitxategiaren tamaina: $3, MIME mota: $4',
-'file-nohires' => '<small>Ez dago bereizmen handiagorik.</small>',
+'file-nohires' => 'Ez dago bereizmen handiagorik.',
'svg-long-desc' => 'SVG fitxategia, nominaldi $1 × $2 pixel, fitxategiaren tamaina: $3',
'show-big-image' => 'Bereizmen handikoa',
-'show-big-image-preview' => '<small>Aurreikuspen honen neurria: $1.</small>',
-'show-big-image-other' => '<small>Bestelako bereizmenak: $1.</small>',
+'show-big-image-preview' => 'Aurreikuspen honen neurria: $1.',
+'show-big-image-other' => 'Bestelako {{PLURAL:$2|bereizmena|bereizmenak}}: $1.',
'show-big-image-size' => '$1 × $2 pixel',
'file-info-gif-looped' => 'kiribildua',
'file-info-gif-frames' => '{{PLURAL:$1|Irudi $1|$1 irudi}}',
@@ -2672,9 +2648,10 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 's',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'o',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1o',
+'ago' => 'Duela $1',
# Bad image list
'bad_image_list' => 'Formatua hurrengoa da:
@@ -3084,13 +3061,6 @@ Egiaztapen kode hau $4 iraungiko da.',
'scarytranscludefailed' => '[Arazoa $1 txantiloia eskuratzerakoan]',
'scarytranscludetoolong' => '[URLa luzeegia da]',
-# Trackbacks
-'trackbackbox' => 'Artikulu honen aipuak:<br />
-$1',
-'trackbackremove' => '([$1 Ezabatu])',
-'trackbacklink' => 'Aipua',
-'trackbackdeleteok' => 'Aipua ezabatu egin da.',
-
# Delete conflict
'deletedwhileediting' => "'''Oharra''': Zu aldaketak egiten hasi ondoren orrialdea ezabatua izan da!",
'confirmrecreate' => "[[User:$1|$1]] erabiltzaileak ([[User talk:$1|eztabaida]]) orrialde hau ezabatu zu aldatzen hasi eta gero. Hona arrazoia: : ''$2'' Mesedez, baieztatu orrialde hau berriz sortu nahi duzula.",
@@ -3162,6 +3132,9 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
'watchlisttools-edit' => 'Zerrenda ikusi eta aldatu',
'watchlisttools-raw' => 'Zerrenda idatziz aldatu',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|eztabaida]])',
+
# Core parser functions
'unknown_extension_tag' => '"$1" luzapen etiketa ezezaguna',
'duplicate-defaultsort' => 'Adi: Berezko "$2" antolatzeak aurreko berezko "$1" antolatzea gainditzen du.',
@@ -3209,8 +3182,7 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
'specialpages' => 'Orrialde bereziak',
'specialpages-note' => '----
* Orrialde berezi arruntak.
-* <strong class="mw-specialpagerestricted">Mugatutako orrialde bereziak.</strong>
-* <span class="mw-specialpagecached">Katxea duten orrialde bereziak.</span>',
+* <strong class="mw-specialpagerestricted">Mugatutako orrialde bereziak.</strong>',
'specialpages-group-maintenance' => 'Mantentze-oharrak',
'specialpages-group-other' => 'Beste orrialde berezi batzuk',
'specialpages-group-login' => 'Sartu / Izena eman',
@@ -3281,4 +3253,15 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
'htmlform-reset' => 'Aldaketak desegin',
'htmlform-selectorother-other' => 'Beste bat',
+# New logging system
+'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
+'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
+'newuserlog-byemail' => 'pasahitza e-postaz bidali da',
+
+# Feedback
+'feedback-subject' => 'Gaia:',
+'feedback-message' => 'Mezua:',
+'feedback-cancel' => 'Utzi',
+'feedback-submit' => 'Feedbacka bidali',
+
);
diff --git a/languages/messages/MessagesExt.php b/languages/messages/MessagesExt.php
index 301894d8..e319a835 100644
--- a/languages/messages/MessagesExt.php
+++ b/languages/messages/MessagesExt.php
@@ -352,12 +352,11 @@ Pol favol, contauta con un [[Special:ListUsers/sysop|çajoril]], mentandu la URL
'cannotdelete' => 'Nu es possibri esborral "$1". Puei que ya lo aiga esborrau otra presona.',
'badtitle' => 'Mal entitulau',
'badtitletext' => 'El entítulu la páhina está vaciu, nu es váliu, u es un atihu entelluenga u entelgüiqui encorretu.',
-'perfcached' => "Los siguientis datus s'alcuentran nel caché i es posibri que nu estén atualizaus.",
-'perfcachedts' => 'Estus datus están emburacaus. La su úrtima atualización hue el $1.',
+'perfcached' => "Los siguientis datus s'alcuentran nel caché i es posibri que nu estén atualizaus. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => 'Estus datus están emburacaus. La su úrtima atualización hue el $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "Las atualiçacionis desta páhina s'alcuentran atualmenti desativás. Los datus nu sedrán atualizaus a cortu praçu.",
'wrong_wfQuery_params' => 'Parametrus a wfQuery()<br /> Hunción: $1<br /> Pregunta: $2 encorretus',
'viewsource' => 'Vel coigu huenti',
-'viewsourcefor' => 'pa $1',
'actionthrottled' => 'Ación ilimitá',
'actionthrottledtext' => 'Cumu miia pa prevenil el spam, solu pueis hazel esta ación un limitau númeru e vezis nun cortu praçu e tiempu, i as pasau esti límiti. Pol favol, enténtalu otra vezi endrentu angunus minutus.',
'protectedpagetext' => "Esta página s'alcuentra atarugá a nuevas eicionis.",
@@ -532,9 +531,6 @@ Pueis contautal con $1 u con otru [[{{MediaWiki:Grouppage-sysop}}|çahoril]] pa
Si nu as escrebiu enas tus [[Special:Preferences|preferéncias]] una direción d\'email, u si t\'á siu atarugau el correu, nu te sedrá possibri gastal el botón "Envial un email a esti ussuáriu".
$3 es la tu direción IP atual, i el ID del tarugu es #$5. Pol favol, escrebi dambus los dos datus en cualisquiel consurta que hagas.',
'blockednoreason' => "nu s'an dau razonis",
-'blockedoriginalsource' => "El cóigu huenti e '''$1''' se muestra embahu:",
-'blockededitsource' => "Embahu se muestra el testu '''las tus eicionis''' en '''$1''':",
-'whitelistedittitle' => 'Es mestel rustrilsi pa eital',
'whitelistedittext' => 'Tiinis que $1 pa eital páhinas.',
'confirmedittext' => 'Ebis confirmal la tu direción d´email enantis d´eital páhinas. Pol favol, escrebi i compreba el tu email pol meyu las tus [[Special:Preferences|preferéncias d´usuáriu]].',
'nosuchsectiontitle' => 'Nu es posibri alcuentral el apaltiju',
@@ -717,22 +713,11 @@ El restu e çahorilis desti güiqui sí tendrán premisu pa visoreal el continiu
'revdelete-unsuppress' => 'Esborral restricionis enas revisionis arrecuperás',
'revdelete-log' => 'Razón:',
'revdelete-submit' => 'Aprical a {{PLURAL:$1|la revisión aseñalá|las revisionis aseñalás}}',
-'revdelete-logentry' => 'chambá la visibiliá la revisión pa [[$1]]',
-'logdelete-logentry' => "chambá la visibiliá d'eventus de [[$1]]",
'revdelete-success' => "'''Visibiliá revisionis chambá.'''",
'logdelete-success' => "'''Visibiliá d'eventus chambá.'''",
'revdel-restore' => 'Chambal visibiliá',
'pagehist' => 'Estorial la páhina',
'deletedhist' => 'Estorial esborrau',
-'revdelete-content' => 'conteniu',
-'revdelete-summary' => 'eital sumáriu',
-'revdelete-uname' => "nombri d'usuáriu",
-'revdelete-restricted' => 'las restricionis a los çahorilis án siu apricás',
-'revdelete-unrestricted' => 'las restricionis a los çahorilis án siu esborrás',
-'revdelete-hid' => 'açonchal $1',
-'revdelete-unhid' => 'esaçonchal $1',
-'revdelete-log-message' => '$1 de $2 {{PLURAL:$2|revisión|revisionis}}',
-'logdelete-log-message' => '$1 de $2 {{PLURAL:$2|eventu|eventus}}',
'revdelete-edit-reasonlist' => 'Eital razonis del esborrau',
# Suppression log
@@ -846,7 +831,7 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
'prefs-rc' => 'Úrtimus chambus',
'prefs-watchlist' => 'Lista e seguimientu',
'prefs-watchlist-days' => 'Máisimu númeru e dias a muestral ena lista e seguimientu:',
-'prefs-watchlist-days-max' => 'Máisimu 7 dias',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Númeru máisimu e chambus a muestral ena lista e seguimientu umentá:',
'prefs-misc' => 'Bandallu (una mihina e tó)',
'prefs-resetpass' => 'Escambial consínia',
@@ -1366,10 +1351,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Nu s´alcuentró dengún usuáriu.',
# Special:Log/newusers
-'newuserlogpage' => 'Rustrihu de nuevus usuárius',
-'newuserlog-byemail' => 'consínia enviá pol e-mail',
-'newuserlog-create-entry' => "Nueva cuenta d'usuáriu",
-'newuserlog-create2-entry' => 'nueva cuenta criá: $1',
+'newuserlogpage' => 'Rustrihu de nuevus usuárius',
# Special:ListGroupRights
'listgrouprights' => "Derechus del grupu d'usuárius",
@@ -1493,7 +1475,6 @@ Pol favol, confirma que realmenti quieis hazel esu, qu'entiendis las consecuenci
'actioncomplete' => 'Ación acabihá',
'deletedtext' => 'S\'á esborrau "$1" corretamenti.
Consurta $2 pa vel los úrtimus esborraus.',
-'deletedarticle' => 'esborrau "[[$1]]"',
'dellogpage' => 'Rustrihu d´esborrau',
'dellogpagetext' => 'Embahu se muestra una lista colos úrtimus esborraus.',
'deletionlog' => 'rustrihu d´esborrau',
@@ -1591,7 +1572,6 @@ arrecuperás apaicerán nel estorial anteriol.",
'undeletelink' => 'Guipal/arrecuperal',
'undeletereset' => 'Reahustal',
'undeletecomment' => 'Comentáriu:',
-'undeletedarticle' => '"[[$1]]" restaurau',
'undeletedrevisions' => '{{PLURAL:$1|1 revisión|$1 revisionis}} restaurás',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisión|$1 revisionis}} i {{PLURAL:$2|1 archivu|$2 archivus}} restauraus',
'undeletedfiles' => '{{PLURAL:$1|1 archivu|$1 archivus}} restauraus',
@@ -1797,8 +1777,6 @@ Pol favol, escrebi otru entítulu.',
'talkexists' => "'''S'á moviu la páhina, peru la su caraba nu puei sel movia polque ya desisti otra caraba con el nuevu entítulu. Pol favol, mesturalas manualmenti.'''",
'movedto' => 's´á moviu a',
'movetalk' => 'Tamién movel la su caraba',
-'1movedto2' => '[[$1]] s´á moviu a [[$2]]',
-'1movedto2_redir' => "S'á moviu [[$1]] a [[$2]] criandu una redireción",
'movelogpage' => 'Rustrihu e movimientus',
'movelogpagetext' => 'Embahu ai una lista colas páhinas movias.',
'movereason' => 'Razón:',
@@ -1981,9 +1959,6 @@ Pol favol, gasta el botón "previsoreal" enantis d\'emburacal.',
# Patrol log
'patrol-log-page' => 'Rustrihu e revisionis',
'patrol-log-header' => 'Esti es un rustriju e revissionis patrullás.',
-'patrol-log-line' => '$1 está aseñalau $2 patrullau $3',
-'patrol-log-auto' => '(autumáticu)',
-'patrol-log-diff' => 'revisión $1',
# Image deletion
'deletedrevision' => 'Esborrá la revisión antigua $1',
@@ -2005,7 +1980,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|página|páginas}}',
'file-info' => 'grandol el archivu: $1, MIME type: $2',
'file-info-size' => '$1 × $2 pixel, grandol el archivu: $3, MIME type: $4',
-'file-nohires' => '<small>Nu disponibri a mayol resolución.</small>',
+'file-nohires' => 'Nu disponibri a mayol resolución.',
'svg-long-desc' => 'archivu SVG, $1 × $2 pixelis, grandol: $3',
'show-big-image' => 'Resolución máisima',
@@ -2021,7 +1996,7 @@ $1',
'sp-newimages-showfrom' => 'Muestral nuevas imahin empuntás a partil de $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'o',
+'hours-abbrev' => '$1o',
# Bad image list
'bad_image_list' => 'El hormatu ebi sel asina:
@@ -2306,12 +2281,6 @@ El coigu de confirmación caucará a las $4.',
'scarytranscludefailed' => '[Marru al cargal la prantilla pa $1]',
'scarytranscludetoolong' => '[La URL es mu larga]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks pa esti artículu:<br />
-$1',
-'trackbackremove' => '([$1 Esborral])',
-'trackbackdeleteok' => "El trackback s'á esborrau corretamenti.",
-
# Delete conflict
'deletedwhileediting' => 'Avisu: esta página á siu esborrá endispués de tu encetal a eitala!',
'confirmrecreate' => "El usuáriu [[User:$1|$1]] ([[User talk:$1|caraba]]) á esborrau esta páhina aluspués de que prencipiaras a eitala, pola siguienti razón:
@@ -2447,4 +2416,9 @@ Las imahin se muestran a resolución compreta; las demas crasis d'archivu s'ehec
# Database error messages
'dberr-header' => 'Marru ena wiki',
+# New logging system
+'revdelete-restricted' => 'las restricionis a los çahorilis án siu apricás',
+'revdelete-unrestricted' => 'las restricionis a los çahorilis án siu esborrás',
+'newuserlog-byemail' => 'consínia enviá pol e-mail',
+
);
diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php
index 9ae707e9..8c8ea533 100644
--- a/languages/messages/MessagesFa.php
+++ b/languages/messages/MessagesFa.php
@@ -9,12 +9,15 @@
*
* @author Alnokta
* @author Americophile
+ * @author Armandaneshjoo
* @author Asoxor
+ * @author Baqeri
* @author Behdarvandyani
* @author Ebraminio
* @author Huji
* @author Ibrahim
* @author Ladsgroup
+ * @author Leyth
* @author Mardetanha
* @author Mehdi
* @author Mehran
@@ -23,6 +26,8 @@
* @author Meno25
* @author Mjbmr
* @author Mormegil
+ * @author Omnia
+ * @author Pouyana
* @author Reza1615
* @author Roozbeh Pournader <roozbeh at gmail.com>
* @author Sahim
@@ -65,12 +70,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'تمام_پیغام‌ها' ),
'Allpages' => array( 'تمام_صÙحه‌ها' ),
'Ancientpages' => array( 'صÙحه‌های_قدیمی' ),
+ 'Badtitle' => array( 'عنوان_بد' ),
'Blankpage' => array( 'صÙحه_خالی' ),
'Block' => array( 'بستن_نشانی_آی‌پی' ),
'Blockme' => array( 'بستن_من' ),
'Booksources' => array( 'منابع_کتاب' ),
'BrokenRedirects' => array( 'تغییرمسیرهای_خراب' ),
'Categories' => array( 'رده‌ها' ),
+ 'ChangeEmail' => array( 'تغییر_پست_الکترونیکی' ),
'ChangePassword' => array( 'از_نو_کردن_گذرواژه' ),
'ComparePages' => array( 'مقایسه_صÙحات' ),
'Confirmemail' => array( 'تایید_پست_الکترونیکی' ),
@@ -145,6 +152,7 @@ $specialPageAliases = array(
'Unusedtemplates' => array( 'الگوهای_استÙاده_نشده' ),
'Unwatchedpages' => array( 'صÙحه‌های_پی‌گیری_نشده' ),
'Upload' => array( 'بارگذاری_پرونده' ),
+ 'UploadStash' => array( 'بارگذاری_انبوه' ),
'Userlogin' => array( 'ورود_به_سامانه' ),
'Userlogout' => array( 'خروج_از_سامانه' ),
'Userrights' => array( 'اختیارات_کاربر' ),
@@ -256,154 +264,156 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#تغییرمسیر', '#REDIRECT' ),
- 'notoc' => array( '0', '__بی‌Ùهرست__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__بی‌نگارخانه__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__باÙهرست__', '__FORCETOC__' ),
- 'toc' => array( '0', '__Ùهرست__', '__TOC__' ),
- 'noeditsection' => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__بی‌عنوان__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'نام‌ماه‌اضاÙÙ‡', 'نام_ماه_اضاÙÙ‡', 'نام‌ماه‌کنونی‌اضاÙÙ‡', 'نام_ماه_کنونی_اضاÙÙ‡', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'مخÙÙ‌نام‌ماه', 'مخÙÙ_نام_ماه', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'نام‌ماه‌محلی‌اضاÙÙ‡', 'نام_ماه_محلی_اضاÙÙ‡', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'مخÙÙ‌ماه‌محلی', 'مخÙÙ_ماه_محلی', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
- 'localday2' => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'زمان‌محلی', 'زمان_محلی', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'تعدادکاربران', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'کاربران‌Ùعال', 'کاربران_Ùعال', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'نام‌صÙحه', 'نام_صÙحه', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'نام‌صÙحه‌کد', 'نام_صÙحه_کد', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'Ùضای‌نام', 'Ùضای_نام', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'Ùضای‌نام‌کد', 'Ùضای_نام_کد', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'Ùضای‌بحث', 'Ùضای_بحث', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'Ùضای‌بحث‌کد', 'Ùضای_بحث_کد', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'Ùضای‌موضوع', 'Ùضای‌مقاله', 'Ùضای_موضوع', 'Ùضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'Ùضای‌موضوع‌کد', 'Ùضای‌مقاله‌کد', 'Ùضای_موضوع_کد', 'Ùضای_مقاله_کد', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'نام‌کامل‌صÙحه', 'نام_کامل_صÙحه', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'نام‌کامل‌صÙحه‌کد', 'نام_کامل_صÙحه_کد', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'نام‌زیرصÙحه', 'نام_زیرصÙحه', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'نام‌زیرصÙحه‌کد', 'نام_زیرصÙحه_کد', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'نام‌صÙحه‌مبنا', 'نام_صÙحه_مبنا', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'نام‌صÙحه‌مبناکد', 'نام_صÙحه_مبنا_کد', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'نام‌صÙحه‌بحث', 'نام_صÙحه_بحث', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'نام‌صÙحه‌بحث‌کد', 'نام_صÙحه_بحث_کد', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'نام‌صÙحه‌موضوع', 'نام‌صÙحه‌مقاله', 'نام_صÙحه_موضوع', 'نام_صÙحه_مقاله', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'نام‌صÙحه‌موضوع‌کد', 'نام‌صÙحه‌مقاله‌کد', 'نام_صÙحه_موضوع_کد', 'نام_صÙحه_مقاله_کد', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
- 'subst' => array( '0', 'جایگزین:', 'جا:', 'SUBST:' ),
- 'safesubst' => array( '0', 'جایگزین_امن:', 'جام:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'پیغام‌بی‌بسط:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'بندانگشتی', 'انگشتدان', 'انگشتی', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'بندانگشتی=$1', 'انگشتدان=$1', 'انگشتی=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'راست', 'right' ),
- 'img_left' => array( '1', 'Ú†Ù¾', 'left' ),
- 'img_none' => array( '1', 'هیچ', 'none' ),
- 'img_width' => array( '1', '$1پیکسل', '$1px' ),
- 'img_center' => array( '1', 'وسط', 'center', 'centre' ),
- 'img_framed' => array( '1', 'قاب', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'بی‌قاب', 'بیقاب', 'بی_قاب', 'frameless' ),
- 'img_page' => array( '1', 'صÙحه=$1', 'صÙحه_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'ایستاده', 'ایستاده=$1', 'ایستاده_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'حاشیه', 'border' ),
- 'img_baseline' => array( '1', 'همکÙ', 'baseline' ),
- 'img_sub' => array( '1', 'زیر', 'sub' ),
- 'img_super' => array( '1', 'زبر', 'super', 'sup' ),
- 'img_top' => array( '1', 'بالا', 'top' ),
- 'img_text_top' => array( '1', 'متن-بالا', 'text-top' ),
- 'img_middle' => array( '1', 'میانه', 'middle' ),
- 'img_bottom' => array( '1', 'پایین', 'bottom' ),
- 'img_text_bottom' => array( '1', 'متن-پایین', 'text-bottom' ),
- 'img_link' => array( '1', 'پیوند=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'جایگزین=$1', 'alt=$1' ),
- 'int' => array( '0', 'ترجمه:', 'INT:' ),
- 'sitename' => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
- 'ns' => array( '0', 'ÙÙ†:', 'NS:' ),
- 'nse' => array( '0', 'ÙÙ†Ú©:', 'NSE:' ),
- 'localurl' => array( '0', 'نشانی:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'نشانی‌کد:', 'نشانی_کد:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'مسیرمقاله', 'مسیر_مقاله', 'ARTICLEPATH' ),
- 'server' => array( '0', 'سرور', 'کارساز', 'SERVER' ),
- 'servername' => array( '0', 'نام‌کارساز', 'نام_کارساز', 'نام‌سرور', 'نام_سرور', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'مسیرسند', 'مسیر_سند', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'مسیرسبک', 'مسیر_سبک', 'STYLEPATH' ),
- 'grammar' => array( '0', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__عنوان‌تبدیل‌نشده__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__محتواتبدیل‌نشده__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'Ù‡Ùته', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'روزهÙته', 'روز_Ù‡Ùته', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'Ù‡Ùته‌محلی', 'Ù‡Ùته_محلی', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'روزهÙته‌محلی', 'روز_Ù‡Ùته_محلی', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'نسخه', 'شماره‌نسخه', 'شماره_نسخه', 'REVISIONID' ),
- 'revisionday' => array( '1', 'روزنسخه', 'روز_نسخه', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'روزنسخه۲', 'روز_نسخه۲', 'روز_نسخه_۲', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'ماه‌نسخه', 'ماه_نسخه', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'ماه‌نسخه۱', 'ماه_نسخه_۱', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'سال‌نسخه', 'سال_نسخه', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'زمان‌یونیسکی‌نسخه', 'زمان‌نسخه', 'زمان_یونیکسی_نسخه', 'زمان_نسخه', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'کاربرنسخه', 'کاربر_نسخه', 'REVISIONUSER' ),
- 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'Ú©:', 'LC:' ),
- 'uc' => array( '0', 'ب:', 'UC:' ),
- 'raw' => array( '0', 'خام:', 'RAW:' ),
- 'displaytitle' => array( '1', 'عنوان‌ظاهری', 'عنوان_ظاهری', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Ù†', 'R' ),
- 'newsectionlink' => array( '1', '__بخش‌جدید__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__بی‌پیوندبخش__', '__بی‌پیوند‌بخش‌جدید__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'نسخه‌کنونی', 'نسخه_کنونی', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'کدنشانی:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'کدلنگر:', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'زمان‌یونیکسی', 'زمان_یونیکسی', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'زمان‌یونیکسی‌محلی', 'زمان_یونیکسی_محلی', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'علامت‌جهت', 'علامت_جهت', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#زبان:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'زبان‌محتوا', 'زبان_محتوا', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'صÙحه‌درÙضای‌نام:', 'صÙحه_در_Ùضای_نام:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'تعدادمدیران', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'آرایش‌عدد', 'آرایش_عدد', 'FORMATNUM' ),
- 'padleft' => array( '0', 'لبه‌چپ', 'لبه_چپ', 'PADLEFT' ),
- 'padright' => array( '0', 'لبه‌راست', 'لبه_راست', 'PADRIGHT' ),
- 'special' => array( '0', 'ویژه', 'special' ),
- 'defaultsort' => array( '1', 'ترتیب:', 'ترتیب‌پیش‌Ùرض:', 'ترتیب_پیش_Ùرض:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'مسیرپرونده:', 'مسیر_پرونده:', 'FILEPATH:' ),
- 'tag' => array( '0', 'برچسب', 'tag' ),
- 'hiddencat' => array( '1', '__رده‌پنهان__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'صÙحه‌دررده', 'صÙحه_در_رده', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'اندازه‌صÙحه', 'اندازه_صÙحه', 'PAGESIZE' ),
- 'index' => array( '1', '__نمایه__', '__INDEX__' ),
- 'noindex' => array( '1', '__بی‌نمایه__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'تعداددرگروه', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__تغییرمسیرثابت__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'سطح‌حغاطت', 'سطح_Ø­Ùاظت', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'آرایش‌تاریخ', 'آرایش_تاریخ', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'مسیر', 'PATH' ),
- 'url_wiki' => array( '0', 'ویکی', 'WIKI' ),
- 'url_query' => array( '0', 'دستور', 'QUERY' ),
+ 'redirect' => array( '0', '#تغییرمسیر', '#REDIRECT' ),
+ 'notoc' => array( '0', '__بی‌Ùهرست__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__بی‌نگارخانه__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__باÙهرست__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__Ùهرست__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__بی‌عنوان__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'نام‌ماه‌اضاÙÙ‡', 'نام_ماه_اضاÙÙ‡', 'نام‌ماه‌کنونی‌اضاÙÙ‡', 'نام_ماه_کنونی_اضاÙÙ‡', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'مخÙÙ‌نام‌ماه', 'مخÙÙ_نام_ماه', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'نام‌ماه‌محلی‌اضاÙÙ‡', 'نام_ماه_محلی_اضاÙÙ‡', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'مخÙÙ‌ماه‌محلی', 'مخÙÙ_ماه_محلی', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'زمان‌محلی', 'زمان_محلی', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'تعدادکاربران', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'کاربران‌Ùعال', 'کاربران_Ùعال', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'نام‌صÙحه', 'نام_صÙحه', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'نام‌صÙحه‌کد', 'نام_صÙحه_کد', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'Ùضای‌نام', 'Ùضای_نام', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'Ùضای‌نام‌کد', 'Ùضای_نام_کد', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'Ùضای‌بحث', 'Ùضای_بحث', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'Ùضای‌بحث‌کد', 'Ùضای_بحث_کد', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'Ùضای‌موضوع', 'Ùضای‌مقاله', 'Ùضای_موضوع', 'Ùضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'Ùضای‌موضوع‌کد', 'Ùضای‌مقاله‌کد', 'Ùضای_موضوع_کد', 'Ùضای_مقاله_کد', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'نام‌کامل‌صÙحه', 'نام_کامل_صÙحه', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'نام‌کامل‌صÙحه‌کد', 'نام_کامل_صÙحه_کد', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'نام‌زیرصÙحه', 'نام_زیرصÙحه', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'نام‌زیرصÙحه‌کد', 'نام_زیرصÙحه_کد', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'نام‌صÙحه‌مبنا', 'نام_صÙحه_مبنا', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'نام‌صÙحه‌مبناکد', 'نام_صÙحه_مبنا_کد', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'نام‌صÙحه‌بحث', 'نام_صÙحه_بحث', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'نام‌صÙحه‌بحث‌کد', 'نام_صÙحه_بحث_کد', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'نام‌صÙحه‌موضوع', 'نام‌صÙحه‌مقاله', 'نام_صÙحه_موضوع', 'نام_صÙحه_مقاله', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'نام‌صÙحه‌موضوع‌کد', 'نام‌صÙحه‌مقاله‌کد', 'نام_صÙحه_موضوع_کد', 'نام_صÙحه_مقاله_کد', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
+ 'subst' => array( '0', 'جایگزین:', 'جا:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'جایگزین_امن:', 'جام:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'پیغام‌بی‌بسط:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'بندانگشتی', 'انگشتدان', 'انگشتی', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'بندانگشتی=$1', 'انگشتدان=$1', 'انگشتی=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'راست', 'right' ),
+ 'img_left' => array( '1', 'Ú†Ù¾', 'left' ),
+ 'img_none' => array( '1', 'هیچ', 'none' ),
+ 'img_width' => array( '1', '$1پیکسل', '$1px' ),
+ 'img_center' => array( '1', 'وسط', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'قاب', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'بی‌قاب', 'بیقاب', 'بی_قاب', 'frameless' ),
+ 'img_page' => array( '1', 'صÙحه=$1', 'صÙحه_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'ایستاده', 'ایستاده=$1', 'ایستاده_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'حاشیه', 'border' ),
+ 'img_baseline' => array( '1', 'همکÙ', 'baseline' ),
+ 'img_sub' => array( '1', 'زیر', 'sub' ),
+ 'img_super' => array( '1', 'زبر', 'super', 'sup' ),
+ 'img_top' => array( '1', 'بالا', 'top' ),
+ 'img_text_top' => array( '1', 'متن-بالا', 'text-top' ),
+ 'img_middle' => array( '1', 'میانه', 'middle' ),
+ 'img_bottom' => array( '1', 'پایین', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'متن-پایین', 'text-bottom' ),
+ 'img_link' => array( '1', 'پیوند=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'جایگزین=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ترجمه:', 'INT:' ),
+ 'sitename' => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
+ 'ns' => array( '0', 'ÙÙ†:', 'NS:' ),
+ 'nse' => array( '0', 'ÙÙ†Ú©:', 'NSE:' ),
+ 'localurl' => array( '0', 'نشانی:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'نشانی‌کد:', 'نشانی_کد:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'مسیرمقاله', 'مسیر_مقاله', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'سرور', 'کارساز', 'SERVER' ),
+ 'servername' => array( '0', 'نام‌کارساز', 'نام_کارساز', 'نام‌سرور', 'نام_سرور', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'مسیرسند', 'مسیر_سند', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'مسیرسبک', 'مسیر_سبک', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__عنوان‌تبدیل‌نشده__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__محتواتبدیل‌نشده__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'Ù‡Ùته', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'روزهÙته', 'روز_Ù‡Ùته', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'Ù‡Ùته‌محلی', 'Ù‡Ùته_محلی', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'روزهÙته‌محلی', 'روز_Ù‡Ùته_محلی', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'نسخه', 'شماره‌نسخه', 'شماره_نسخه', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'روزنسخه', 'روز_نسخه', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'روزنسخه۲', 'روز_نسخه۲', 'روز_نسخه_۲', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'ماه‌نسخه', 'ماه_نسخه', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'ماه‌نسخه۱', 'ماه_نسخه_۱', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'سال‌نسخه', 'سال_نسخه', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'زمان‌یونیکسی‌نسخه', 'زمان‌نسخه', 'زمان_یونیکسی_نسخه', 'زمان_نسخه', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'کاربرنسخه', 'کاربر_نسخه', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'Ú©:', 'LC:' ),
+ 'uc' => array( '0', 'ب:', 'UC:' ),
+ 'raw' => array( '0', 'خام:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'عنوان‌ظاهری', 'عنوان_ظاهری', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Ù†', 'R' ),
+ 'newsectionlink' => array( '1', '__بخش‌جدید__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__بی‌پیوندبخش__', '__بی‌پیوند‌بخش‌جدید__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'نسخه‌کنونی', 'نسخه_کنونی', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'کدنشانی:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'کدلنگر:', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'زمان‌یونیکسی', 'زمان_یونیکسی', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'زمان‌یونیکسی‌محلی', 'زمان_یونیکسی_محلی', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'علامت‌جهت', 'علامت_جهت', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#زبان:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'زبان‌محتوا', 'زبان_محتوا', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'صÙحه‌درÙضای‌نام:', 'صÙحه_در_Ùضای_نام:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'تعدادمدیران', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'آرایش‌عدد', 'آرایش_عدد', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'لبه‌چپ', 'لبه_چپ', 'PADLEFT' ),
+ 'padright' => array( '0', 'لبه‌راست', 'لبه_راست', 'PADRIGHT' ),
+ 'special' => array( '0', 'ویژه', 'special' ),
+ 'defaultsort' => array( '1', 'ترتیب:', 'ترتیب‌پیش‌Ùرض:', 'ترتیب_پیش_Ùرض:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'مسیرپرونده:', 'مسیر_پرونده:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'برچسب', 'tag' ),
+ 'hiddencat' => array( '1', '__رده‌پنهان__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'صÙحه‌دررده', 'صÙحه_در_رده', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'اندازه‌صÙحه', 'اندازه_صÙحه', 'PAGESIZE' ),
+ 'index' => array( '1', '__نمایه__', '__INDEX__' ),
+ 'noindex' => array( '1', '__بی‌نمایه__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'تعداددرگروه', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__تغییرمسیرثابت__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'سطح‌حÙاطت', 'سطح_Ø­Ùاظت', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'آرایش‌تاریخ', 'آرایش_تاریخ', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'مسیر', 'PATH' ),
+ 'url_wiki' => array( '0', 'ویکی', 'WIKI' ),
+ 'url_query' => array( '0', 'دستور', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', 'بدون‌خطا', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', 'جایگزین‌نکن', 'noreplace' ),
);
# Harakat are intentionally not included in the linkTrail. Their addition should
@@ -682,6 +692,7 @@ $1',
به [[Special:Version|این صÙحه]] مراجعه کنید.',
'ok' => 'تأیید',
+'backlinksubtitle' => '↠$1',
'retrievedfrom' => 'برگرÙته از «$1»',
'youhavenewmessages' => '$1 دارید ($2).',
'newmessageslink' => 'پیام‌های جدید',
@@ -782,23 +793,25 @@ $1',
'badarticleerror' => 'نمی‌توان این عمل را بر این صÙحه انجام داد.',
'cannotdelete' => 'امکان حذ٠صÙحه یا تصویر «$1» وجود ندارد.
ممکن است قبلاً Ùرد دیگری آن را حذ٠کرده باشد.',
+'cannotdelete-title' => 'نمی تواند این " $1 " صÙحه را حذ٠کند.',
'badtitle' => 'عنوان بد',
'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی بین‌زبانی یا بین‌ویکی‌ای با پیوند نادرست بود.
ممکن است حاوی یک یا چند نویسه باشد Ú©Ù‡ نمی‌توانند در عنوان‌ها استÙاده شوند.',
-'perfcached' => 'داده‌های زیر از حاÙظهٔ موقت Ùراخوانی شده‌اند Ùˆ ممکن است کاملاً به‌روز نباشند.',
-'perfcachedts' => 'داده‌های زیر از حاÙظهٔ موقت Ùراخوانی شده‌اند Ùˆ آخرین بار در $1 به‌روزرسانی شده است.',
+'perfcached' => 'داده‌های زیر از حاÙظهٔ نهانی Ùراخوانی شده‌اند Ùˆ ممکن است کاملاً به‌روز نباشند. حداکثر {{PLURAL:$1|یک نتیجه| $1 نتیجه}} در حاÙظهٔ نهانی قابل دسترس است.',
+'perfcachedts' => 'داده‌های زیر از ذخیره شدند Ùˆ آخرین بار در $1 به‌روزرسانی شدند. حداکثر {{PLURAL:$4|یک نتیجه|$4 نتیجه}} در حاÙظهٔ نهانی قابل دسترس است.',
'querypage-no-updates' => 'امکان به‌روزرسانی این صÙحه Ùعلاً غیرÙعال شده‌است.
اطلاعات این صÙحه ممکن است به‌روز نباشد.',
'wrong_wfQuery_params' => 'پارامترهای wfQuery()‎ نادرست است<br />
تابع: $1<br />
پرس‌وجو: $2',
'viewsource' => 'نمایش مبدأ',
-'viewsourcefor' => 'برای $1',
+'viewsource-title' => 'مشاهدهٔ منبع برای $1',
'actionthrottled' => 'جلوی عمل شما گرÙته شد',
'actionthrottledtext' => 'به منظور جلوگیری از انتشار اسپم، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.
لطÙاً پس از چند دقیقه دوباره تلاش کنید.',
'protectedpagetext' => 'این صÙحه برای جلوگیری از ویرایش Ù‚ÙÙ„ شده‌است.',
'viewsourcetext' => 'می‌توانید متن مبدأ این صÙحه را مشاهده کنید یا از آن نسخه بردارید:',
+'viewyourtext' => "شما می‌توانید کد مبدأ '''ویرایشهایتان''' در این صÙحه را ببینید Ùˆ Ú©Ù¾ÛŒ کنید:",
'protectedinterface' => 'این صÙحه ارائه‌دهندهٔ متنی برای واسط کاربر این نرم‌اÙزار است Ùˆ به منظور پیشگیری از خرابکاری Ù‚ÙÙ„ شده‌است.',
'editinginterface' => "'''هشدار:''' صÙحه‌ای را Ú©Ù‡ ویرایش می‌کنید شامل متنی‌است Ú©Ù‡ در واسط کاربر این نرم‌اÙزار به کار رÙته‌است.
تغییر این صÙحه منجر به تغییر ظاهر واسط کاربر این نرم‌اÙزار برای دیگر کاربران خواهد شد.
@@ -907,6 +920,7 @@ $2',
'emailconfirmlink' => 'تأیید نشانی پست الکترونیکی',
'invalidemailaddress' => 'نشانی واردشدهٔ پست الکترونیک قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است.
لطÙاً نشانی‌ای با ساختار صحیح وارد کنید Ùˆ یا بخش مربوط را خالی بگذارید.',
+'cannotchangeemail' => 'نشانی‌های پست الکترونیکی حساب کاربری در این ویکی قابل تغییر نیست.',
'accountcreated' => 'حساب کاربری ایجاد شد',
'accountcreatedtext' => 'حساب کاربری $1 ایجاد شده‌است.',
'createaccount-title' => 'ایجاد حساب کاربری در {{SITENAME}}',
@@ -923,6 +937,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'خطای ناشناخته در تابع mail()‎ پی‌اچ‌پی',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس پست الکترونیک.',
# Change password dialog
'resetpass' => 'تغییر گذرواژه',
@@ -945,31 +960,46 @@ $2',
'resetpass-temp-password' => 'گذرواژهٔ موقت:',
# Special:PasswordReset
-'passwordreset' => 'بازنشانی گذرواژه',
-'passwordreset-text' => 'این Ùرم را برای دریاÙت نامهٔ یادآور جزئیات حسابتان کامل کنید.',
-'passwordreset-legend' => 'بازنشانی گذرواژه',
-'passwordreset-disabled' => 'بازنشانی گذرواژه در این ویکی غیرÙعال شده است.',
-'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
-'passwordreset-username' => 'نام کاربری:',
-'passwordreset-domain' => 'دامنه:',
-'passwordreset-email' => 'نشانی پست الکترونیک:',
-'passwordreset-emailtitle' => 'جزئیات حساب در {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'شخصی (احتمالاً شما، با نشانی آی‌پی $1) درخواست یادآوری جزئیات حساب کاربریتان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط هستند:
+'passwordreset' => 'بازنشانی گذرواژه',
+'passwordreset-text' => 'این Ùرم را برای دریاÙت نامهٔ یادآور جزئیات حسابتان کامل کنید.',
+'passwordreset-legend' => 'بازنشانی گذرواژه',
+'passwordreset-disabled' => 'بازنشانی گذرواژه در این ویکی غیرÙعال شده است.',
+'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
+'passwordreset-username' => 'نام کاربری:',
+'passwordreset-domain' => 'دامنه:',
+'passwordreset-capture' => 'پست الکترونیکی نهایی نشان داده شود؟',
+'passwordreset-capture-help' => 'اگر این گزینه را علامت بزنید پست الکترونیکی (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد Ùˆ برای کاربر نیز Ùرستاده خواهد شد.',
+'passwordreset-email' => 'نشانی پست الکترونیک:',
+'passwordreset-emailtitle' => 'جزئیات حساب در {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'شخصی (احتمالاً شما، با نشانی آی‌پی $1) درخواست یادآوری جزئیات حساب کاربریتان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط هستند:
$2
{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.
شما باید اکنون وارد سایت شوید Ùˆ گذرواژه‌ای جدید برگزینید. اگر Ùکر می‌کنید شخص دیگری این درخواست را داده‌است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید Ùˆ دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید Ùˆ به استÙاده از گذرواژهٔ قبلی‌تان ادامه دهید.',
-'passwordreset-emailtext-user' => 'کاربر $1 از {{SITENAME}} درخواست یادآور جزئیات حساب شما را برای {{SITENAME}}
+'passwordreset-emailtext-user' => 'کاربر $1 از {{SITENAME}} درخواست یادآور جزئیات حساب شما را برای {{SITENAME}}
($4) کرده است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این رایانشانی مرتبط است:
$2
{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} تا {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.
شما باید هم‌اکنون وارد شده Ùˆ یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلی‌تان را به خاطر آوردید، Ùˆ دیگر نمی‌خواهید Ú©Ù‡ آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید Ùˆ به استÙاده از گذرواژهٔ قبلی‌تان ادامه دهید.',
-'passwordreset-emailelement' => 'نام کاربری: $1
+'passwordreset-emailelement' => 'نام کاربری: $1
گذرواژهٔ موقت: $2',
-'passwordreset-emailsent' => 'یک نامهٔ یادآور Ùرستاده شده است.',
+'passwordreset-emailsent' => 'یک نامهٔ یادآور Ùرستاده شده است.',
+'passwordreset-emailsent-capture' => 'پست الکترونیکی یادآور Ùرستاده شد، Ú©Ù‡ به شرح زیر است.',
+'passwordreset-emailerror-capture' => 'پست الکترونیکی یادآور همانطور Ú©Ù‡ در زیر مشاهده‌ می‌Ùرمایید ایجاد شد ولی ارسال آن به کاربر موÙقیت‌آمیز نبود: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'تغییر آدرس پست الکترونیک',
+'changeemail-header' => 'تغییر آدرس ایمیل حساب کاربری',
+'changeemail-text' => 'این Ùرم را تکمیل کنید تا آدرس پست الکترونیکی‌تان تغییر یابد. برای این Ú©Ù‡ این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
+'changeemail-no-info' => 'برای دسترسی مستقیم به این صÙحه شما باید به سامانه وارد شده باشید.',
+'changeemail-oldemail' => 'نشانی پست الکترونیکی کنونی:',
+'changeemail-newemail' => 'نشانی پست الکترونیکی جدید:',
+'changeemail-none' => '(هیچ)',
+'changeemail-submit' => 'تغییر پست الکترونیکی',
+'changeemail-cancel' => 'انصراÙ',
# Edit page toolbar
'bold_sample' => 'متن پررنگ',
@@ -1041,9 +1071,6 @@ $2
نشانی آی‌پی Ùعلی شما $3 است Ùˆ شمارهٔ قطع دسترسی $5 است.
لطÙاً این شماره را در هر درخواستی Ú©Ù‡ در این باره مطرح می‌کنید ذکر کنید.",
'blockednoreason' => 'دلیلی مشخص نشده‌است',
-'blockedoriginalsource' => "متن مبدأ '''$1''' در زیر نمایش داده شده است:",
-'blockededitsource' => "متن '''ویرایش‌های شما''' در '''$1''' در زیر نشان داده شده‌است:",
-'whitelistedittitle' => 'برای ویرایش باید به سامانه وارد شوید',
'whitelistedittext' => 'برای ویرایش مقاله‌ها باید $1.',
'confirmedittext' => 'شما باید، پیش از ویرایش صÙحه‌ها، نشانی پست الکترونیکی خود را مشخص Ùˆ تأیید کنید. لطÙاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
'nosuchsectiontitle' => 'چنین بخشی پیدا نشد',
@@ -1136,7 +1163,7 @@ $2
اگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شود، اینجا Ù†Ùرستیدشان.<br />
همچنین شما دارید به ما قول می‌دهید که خودتان این را نوشته‌اید، یا آن را از یک منبع آزاد با مالکیت عمومی یا مشابه آن برداشته‌اید (برای جزئیات بیشتر به $1 مراجعه کنید).
'''کارهای دارای حق تکثیر (copyright) را بی‌اجازه Ù†Ùرستید!'''",
-'longpageerror' => "'''خطا: متنی که ارسال کرده‌اید $1 کیلوبایت طول دارد. این مقدار از مقدار بیشینهٔ $2 کیلوبایت بیشتر است.'''
+'longpageerror' => "'''خطا: متنی که ارسال کرده‌اید {{PULAR:$1|یک کیلوبایت|$1 کیلوبایت}} طول دارد. این مقدار از مقدار بیشینهٔ {{PLURAL:$2|یک کیلوبایت|$2 کیلوبایت}} بیشتر است.'''
نمی‌توان آن را ذخیره کرد.",
'readonlywarning' => "'''هشدار: پایگاه داده برای نگهداری Ù‚ÙÙ„ شده‌است، به همین علت هم‌اکنون نمی‌توانید ویرایش‌هایتان را ذخیره کنید.'''
اگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.
@@ -1306,8 +1333,6 @@ $2
'revdelete-unsuppress' => 'خاتمهٔ محدودیت‌ها در مورد نسخه‌های انتخاب شده',
'revdelete-log' => 'دلیل:',
'revdelete-submit' => 'اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده',
-'revdelete-logentry' => 'پیدایی نسخه‌ها را [[$1]] تغییر داد',
-'logdelete-logentry' => 'تغییر پیدایی رویداد در [[$1]]',
'revdelete-success' => "'''پیدایی نسخه با موÙقیت به روز شد.'''",
'revdelete-failure' => "'''پیدایی نسخه‌ها قابل به روز کردن نیست:'''
$1",
@@ -1319,15 +1344,6 @@ $1",
'revdel-restore-visible' => 'نسخه‌های پیدا',
'pagehist' => 'تاریخچهٔ صÙحه',
'deletedhist' => 'تاریخچهٔ حذÙ‌شده',
-'revdelete-content' => 'مقدار',
-'revdelete-summary' => 'خلاصه ویرایش',
-'revdelete-uname' => 'نام کاربر',
-'revdelete-restricted' => 'مدیران را محدود کرد',
-'revdelete-unrestricted' => 'محدودیت مدیران را لغو کرد',
-'revdelete-hid' => '$1 را پنهان کرد',
-'revdelete-unhid' => '$1 را از حالت پنهان در آورد',
-'revdelete-log-message' => '$1 برای $2 {{PLURAL:$2|نسخه|نسخه}}',
-'logdelete-log-message' => '$1 برای $2 {{PLURAL:$2|رویداد|رویداد}}',
'revdelete-hide-current' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر می‌باشد و قابل پنهان کردن نیست.',
'revdelete-show-no-access' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.',
'revdelete-modify-no-access' => 'خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.',
@@ -1485,12 +1501,14 @@ $1",
'prefs-rc' => 'تغییرات اخیر',
'prefs-watchlist' => 'Ùهرست پی‌گیری‌ها',
'prefs-watchlist-days' => 'تعداد روزهایی Ú©Ù‡ باید در Ùهرست پی‌گیری‌ها نمایش داده شود:',
-'prefs-watchlist-days-max' => 'حداکثر ۷ روز',
+'prefs-watchlist-days-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
'prefs-watchlist-edits' => 'تعداد ویرایش‌های نشان‌داده‌شده در Ùهرست پی‌گیری‌های گسترش‌یاÙته:',
'prefs-watchlist-edits-max' => 'حداکثر تعداد: ۱۰۰۰',
'prefs-watchlist-token' => 'رمز Ùهرست پی‌گیری:',
'prefs-misc' => 'تنظیمات متÙرقه',
'prefs-resetpass' => 'تغییر گذرواژه',
+'prefs-changeemail' => 'تغییر پست الکترونیکی',
+'prefs-setemail' => 'تغیین آدرس پست الکترونیکی',
'prefs-email' => 'گزینه‌های پست الکترونیک',
'prefs-rendering' => 'نمایش صÙحه',
'saveprefs' => 'ذخیره',
@@ -1550,6 +1568,7 @@ $1",
'yourrealname' => 'نام واقعی:',
'yourlanguage' => 'زبان:',
'yourvariant' => 'گویش زبان محتوا:',
+'prefs-help-variant' => 'گویش انتخابی شما برای نمایش محتوای صÙحه‌ها در این ویکی.',
'yournick' => 'امضای جدید:',
'prefs-help-signature' => 'نظرهای نوشته شده در صÙحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به طور خودکار به امضای شما Ùˆ مهر تاریخ تبدیل خواهد شد.',
'badsig' => 'امضای خام غیرمجاز.
@@ -1593,7 +1612,7 @@ $1",
'userrights-lookup-user' => 'مدیریت گروه‌های کاربری',
'userrights-user-editname' => 'یک نام کاربری وارد کنید:',
'editusergroup' => 'ویرایش گروه‌های کاربری',
-'editinguser' => "تغییر اختیارات کاربری برای '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "تغییر اختیارات کاربری کاربر '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'ویرایش گروه‌های کاربری',
'saveusergroups' => 'ثبت گروه‌های کاربری',
'userrights-groupsmember' => 'عضو:',
@@ -1687,13 +1706,13 @@ $1",
'right-autopatrol' => 'گشن زدن خودکار به ویرایش‌های خودش',
'right-patrolmarks' => 'مشاهدهٔ برچسب گشت تغییرات اخیر',
'right-unwatchedpages' => 'مشاهدهٔ Ùهرست صÙحه‌هایی Ú©Ù‡ پیگیری نمی‌شوند',
-'right-trackback' => 'ثبت یک بازتاب',
'right-mergehistory' => 'ادغام تاریخچهٔ صÙحه‌ها',
'right-userrights' => 'ویرایش تمام اختیارات کاربرها',
'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر',
'right-siteadmin' => 'Ù‚ÙÙ„ کردن Ùˆ باز کردن پایگاه داده',
'right-override-export-depth' => 'برون‌بری صÙحه‌ها شامل صÙحه‌های پیوند شده تا عمق Ûµ',
'right-sendemail' => 'ارسال نامه الکترونیکی به دیگر کاربران',
+'right-passwordreset' => 'مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه',
# User rights log
'rightslog' => 'سیاههٔ اختیارات کاربر',
@@ -1727,16 +1746,17 @@ $1",
'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
'action-block' => 'قطع دسترسی ویرایش این کاربر',
'action-protect' => 'تغییر سطح محاÙظت این صÙحه',
+'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری Ú©Ù‡ یک صÙحه را ویرایش کرده‌است',
'action-import' => 'وارد کردن این صÙحه از یک ویکی دیگر',
'action-importupload' => 'وارد کردن این صÙحه از طریق بارگذاری پرونده',
'action-patrol' => 'گشت زدن ویرایش دیگران',
'action-autopatrol' => 'گشت زدن ویرایش خودتان',
'action-unwatchedpages' => 'مشاهدهٔ صÙحه‌های پی‌گیری نشده',
-'action-trackback' => 'ثبت یک بازتاب',
'action-mergehistory' => 'ادغام تاریخچهٔ این صÙحه',
'action-userrights' => 'ویرایش همهٔ اختیارات کاربری',
'action-userrights-interwiki' => 'ویرایش اختیارات کاربری کاربران یک ویکی دیگر',
'action-siteadmin' => 'Ù‚ÙÙ„ کردن Ùˆ باز کردن پایگاه داده',
+'action-sendemail' => 'ارسال ایمیل',
# Recent changes
'nchanges' => '$1 تغییر',
@@ -1765,10 +1785,10 @@ $1",
'minoreditletter' => 'جز',
'newpageletter' => 'نو',
'boteditletter' => 'ر',
-'sectionlink' => 'â†',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|کاربر|کاربر}} پی‌گیری‌کننده]',
'rc_categories' => 'محدود به این رده‌ها (رده‌ها را با «|» جدا کنید)',
'rc_categories_any' => 'هر کدام',
+'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پس از تغییر',
'newsectionsummary' => '/* $1 */ بخش جدید',
'rc-enhanced-expand' => 'نمایش جزئیات (نیازمند جاوااسکریپت)',
'rc-enhanced-hide' => 'نهÙتن جزئیات',
@@ -1778,7 +1798,6 @@ $1",
'recentchangeslinked-feed' => 'تغییرات مرتبط',
'recentchangeslinked-toolbox' => 'تغییرات مرتبط',
'recentchangeslinked-title' => 'تغییرات مرتبط با $1',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'در بازهٔ ‌زمانی داده‌شده تغییری در صÙحه‌های پیوندداده رخ نداده‌است.',
'recentchangeslinked-summary' => "در زیر Ùهرستی از تغییرات اخیر صÙحه‌های پیوند داده شده از این صÙحه (یا اعضای رده مورد نظر) را می‌بینید.
صÙحه‌هایی Ú©Ù‡ در [[Special:Watchlist|Ùهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
@@ -1824,6 +1843,7 @@ $1",
'minlength1' => 'نام پرونده دست کم باید یک حر٠باشد.',
'illegalfilename' => 'نام پرونده «$1» نویسه‌هایی را شامل می‌شود Ú©Ù‡ در نام صÙحه‌ها مجاز نیستند.
لطÙاً نام پرونده را تغییر دهید Ùˆ آن را دوباره بارگذاری کنید.',
+'filename-toolong' => 'نام پرونده نباید از ۲۴۰ بایت طولانی‌تر باشد.',
'badfilename' => 'نام پرونده به «$1» تغییر کرد.',
'filetype-mime-mismatch' => 'پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.',
'filetype-badmime' => 'پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگذاری مجاز نیستند.',
@@ -1927,6 +1947,41 @@ $1',
'upload-unknown-size' => 'اندازهٔ نامشخص',
'upload-http-error' => 'یک خطای اچ‌تی‌تی‌پی رخ داد: $1',
+# File backend
+'backend-fail-stream' => 'نمی‌توان پروندهٔ $1 را ارسال کرد.',
+'backend-fail-backup' => 'نمی‌توان نسخهٔ پشتیبان برای پروندهٔ $1 ایجاد کرد.',
+'backend-fail-notexists' => 'پروندهٔ $1 وجود ندارد.',
+'backend-fail-hashes' => 'دریاÙت هش‌های پرونده برای مقایسه ناموÙÙ‚ بود.',
+'backend-fail-notsame' => 'پروندهٔ غیریکسانی در $1 وجود دارد.',
+'backend-fail-invalidpath' => '$1 مسیر ذخیره‌سازی معتبری نیست.',
+'backend-fail-delete' => 'نمی‌توان پروندهٔ $1 را حذ٠کرد.',
+'backend-fail-alreadyexists' => 'پروندهٔ $1 از قبل وجود داشت.',
+'backend-fail-store' => 'نمی‌توان پروندهٔ $1 را در $2 ذخیره کرد.',
+'backend-fail-copy' => 'نمی‌توان پروندهٔ $1 را به $2 کپی کرد.',
+'backend-fail-move' => 'نمی‌توان پروندهٔ $1 را به $2 منتقل کرد.',
+'backend-fail-opentemp' => 'نمی‌توان پروندهٔ موقتی را باز کرد.',
+'backend-fail-writetemp' => 'امکان نوشتن بر روی پروندهٔ موقتی وجود ندارد.',
+'backend-fail-closetemp' => 'نمی‌توان پروندهٔ موقتی را بست.',
+'backend-fail-read' => 'نمی‌توان پروندهٔ $1 را خواند.',
+'backend-fail-create' => 'نمی‌توان پروندهٔ $1 را ایجاد کرد.',
+'backend-fail-readonly' => 'پشتیبان «$1» درحال حاضر در وضیت Ùقط خواندنی است. دلیل ارائه شده چنین است: «$2»',
+'backend-fail-synced' => 'پرونده «$1» در پشتیبان‌های ذخیره داخلی در وضعیتی ناپایدار قرار دارد',
+'backend-fail-connect' => 'ارتباط با پشیبان ذخیره «$1» برقرار نشد.',
+'backend-fail-internal' => 'خطایی نامعلوم در پشتیبان ذخیره «$1» رخ داد.',
+'backend-fail-contenttype' => 'تعیین نوع محتوای پرونده برای ذخیره در «$1» ناموÙÙ‚ بود.',
+'backend-fail-batchsize' => 'دسته‌ای مشتمل بر $1 {{PLURAL:$1|عملکرد|عملکرد}} پرونده به پشتیبان ذخیره داده شد؛ حداکثر مجاز $2 {{PLURAL:$2|عملکرد|عملکرد}} است.',
+
+# Lock manager
+'lockmanager-notlocked' => 'نمی‌توان Ù‚ÙÙ„ «$1» را گشود؛ چون Ù‚ÙÙ„ نشده‌است.',
+'lockmanager-fail-closelock' => 'امکان بستن پرونده Ù‚ÙÙ„ شده "$1" وجود ندارد.',
+'lockmanager-fail-deletelock' => 'امکان حذ٠پرونده Ù‚ÙÙ„ شده "$1" وجود ندارد.',
+'lockmanager-fail-acquirelock' => 'نمی‌توان Ù‚ÙÙ„ «$1» را کسب کرد.',
+'lockmanager-fail-openlock' => 'امکان باز کردن پرونده Ù‚ÙÙ„ شده "$1" وجود ندارد.',
+'lockmanager-fail-releaselock' => 'نمی‌توان Ù‚ÙÙ„ «$1» را گشود.',
+'lockmanager-fail-db-bucket' => 'امکان ارتباط با تعداد کاÙÛŒ پایگاه داده Ù‚Ùل‌ها در محÙظه $1 وجود نداشت.',
+'lockmanager-fail-db-release' => 'بازکردن Ù‚Ùل‌های پایگاه دادهٔ $1 ممکن نیست.',
+'lockmanager-fail-svr-release' => 'امکان باز کردن Ù‚Ùل‌های سرور $1 وجود ندارد.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'در هنگام باز کردن پرونده زیپ برای بررسی محتوای آن خطایی رخ داد.',
'zip-wrong-format' => 'پرونده مشخص شده یک پرونده زیپ نیست.',
@@ -1943,6 +1998,7 @@ $1',
'uploadstash-badtoken' => 'انجام این اقدام ناموÙÙ‚ بود، احتمالاً به این دلیل Ú©Ù‡ اعتبار ویرایش شما به اتمام رسیده است. دوباره امتحان کنید.',
'uploadstash-errclear' => 'پاک کردن پرونده‌ها ناموÙÙ‚ بود.',
'uploadstash-refresh' => 'تازه کردن Ùهرست پرونده‌ها',
+'invalid-chunk-offset' => 'جابجایی نامعتبر قطعه',
# img_auth script messages
'img-auth-accessdenied' => 'منع دسترسی',
@@ -2043,7 +2099,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
# File reversion
'filerevert' => 'واگردانی $1',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'واگردانی پرونده',
'filerevert-intro' => "شما در حال واگردانی '''[[Media:$1|$1]]''' به [$4 نسخهٔ مورخ $2 ساعت $3] هستید.",
'filerevert-comment' => 'دلیل:',
@@ -2053,24 +2108,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'filerevert-badversion' => 'نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.',
# File deletion
-'filedelete' => 'حذ٠$1',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'حذ٠پرونده',
-'filedelete-intro' => "شما در حال حذ٠کردن پروندهٔ '''[[Media:$1|$1]]''' به همراه تمام تاریخچه‌اش هستید.",
-'filedelete-intro-old' => "شما در حال حذ٠نسخه '''[[Media:$1|$1]]''' مورخ [$4 $2 ساعت $3] هستید.",
-'filedelete-comment' => 'دلیل:',
-'filedelete-submit' => 'حذÙ',
-'filedelete-success' => "'''$1''' حذ٠شد.",
-'filedelete-success-old' => "نسخهٔ '''[[Media:$1|$1]]''' مورخ $2 ساعت $3 حذ٠شد.",
-'filedelete-nofile' => "'''$1''' وجود ندارد.",
-'filedelete-nofile-old' => "نسخهٔ بایگانی‌شده‌ای از '''$1''' با مشخصات داده شده، وجود ندارد.",
-'filedelete-otherreason' => 'دلیل دیگر/اضاÙÛŒ:',
-'filedelete-reason-otherlist' => 'دلیل دیگر',
-'filedelete-reason-dropdown' => '*دلایل متداول حذÙ
+'filedelete' => 'حذ٠$1',
+'filedelete-legend' => 'حذ٠پرونده',
+'filedelete-intro' => "شما در حال حذ٠کردن پروندهٔ '''[[Media:$1|$1]]''' به همراه تمام تاریخچه‌اش هستید.",
+'filedelete-intro-old' => "شما در حال حذ٠نسخه '''[[Media:$1|$1]]''' مورخ [$4 $2 ساعت $3] هستید.",
+'filedelete-comment' => 'دلیل:',
+'filedelete-submit' => 'حذÙ',
+'filedelete-success' => "'''$1''' حذ٠شد.",
+'filedelete-success-old' => "نسخهٔ '''[[Media:$1|$1]]''' مورخ $2 ساعت $3 حذ٠شد.",
+'filedelete-nofile' => "'''$1''' وجود ندارد.",
+'filedelete-nofile-old' => "نسخهٔ بایگانی‌شده‌ای از '''$1''' با مشخصات داده شده، وجود ندارد.",
+'filedelete-otherreason' => 'دلیل دیگر/اضاÙÛŒ:',
+'filedelete-reason-otherlist' => 'دلیل دیگر',
+'filedelete-reason-dropdown' => '*دلایل متداول حذÙ
** نقض حق تکثیر
** پروندهٔ تکراری',
-'filedelete-edit-reasonlist' => 'ویرایش دلایل حذÙ',
-'filedelete-maintenance' => 'حذ٠و احیای پرونده‌ها در مدت نگهداری به طور موقت غیرÙعال است.',
+'filedelete-edit-reasonlist' => 'ویرایش دلایل حذÙ',
+'filedelete-maintenance' => 'حذ٠و احیای پرونده‌ها در مدت نگهداری به طور موقت غیرÙعال است.',
+'filedelete-maintenance-title' => 'نمی‌تواند پرونده را حذ٠کند',
# MIME search
'mimesearch' => 'جستجوی بر اساس MIME',
@@ -2169,6 +2224,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'wantedpages' => 'صÙحه‌های مورد نیاز',
'wantedpages-badtitle' => 'عنوان غیرمجاز در مجموعهٔ نتایج: $1',
'wantedfiles' => 'پرونده‌های مورد نیاز',
+'wantedfiletext-cat' => 'پرونده‌های زیر استÙاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا Ùهرست شوند. هرگونه رتبه مثبت کاذب <del>خط خواهد خورد.</del> علاوه بر این، صÙحاتی Ú©Ù‡ پرونده‌هایی ناموجود را در خود جای داده‌اند در [[:$1]] Ùهرست شده‌اند.',
+'wantedfiletext-nocat' => 'پرونده‌های زیر استÙاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا Ùهرست شوند. هرگونه رتبه مثبت کاذب <del>خط خواهد خورد.</del>',
'wantedtemplates' => 'الگوهای مورد نیاز',
'mostlinked' => 'صÙحه‌هایی Ú©Ù‡ بیشتر از همه به آن‌ها پیوند داده شده‌است',
'mostlinkedcategories' => 'رده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است',
@@ -2177,6 +2234,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'mostimages' => 'پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است',
'mostrevisions' => 'صÙحه‌های دارای بیشترین نسخه',
'prefixindex' => 'تمام صÙحه‌ها با پیشوند',
+'prefixindex-namespace' => 'همهٔ صÙحه‌های دارای پیشوند (Ùضای‌نام $1)',
'shortpages' => 'صÙحه‌های کوتاه',
'longpages' => 'صÙحه‌های بلند',
'deadendpages' => 'صÙحه‌های بن‌بست',
@@ -2193,7 +2251,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'listusers-editsonly' => 'Ùقط کاربرانی Ú©Ù‡ ویرایش دارند را نشان بده',
'listusers-creationsort' => 'مرتب کردن بر اساس تاریخ ایجاد',
'usereditcount' => '$1 {{PLURAL:$1|ویرایش|ویرایش}}',
-'usercreated' => 'ایجاد شده در $1 ساعت $2',
+'usercreated' => '{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2',
'newpages' => 'صÙحه‌های تازه',
'newpages-username' => 'نام کاربری:',
'ancientpages' => 'قدیمی‌ترین صÙحه‌ها',
@@ -2287,12 +2345,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'activeusers-noresult' => 'کاربری پیدا نشد.',
# Special:Log/newusers
-'newuserlogpage' => 'سیاههٔ ایجاد کاربر',
-'newuserlogpagetext' => 'این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.',
-'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
-'newuserlog-create-entry' => 'کاربر جدید',
-'newuserlog-create2-entry' => 'حساب کاربری جدید $1 را ایجاد کرد',
-'newuserlog-autocreate-entry' => 'حساب به طور خودکار ساخته شد',
+'newuserlogpage' => 'سیاههٔ ایجاد کاربر',
+'newuserlogpagetext' => 'این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.',
# Special:ListGroupRights
'listgrouprights' => 'اختیارات گروه‌های کاربری',
@@ -2321,7 +2375,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'emailpagetext' => 'شما می‌توانید از Ùرم زیر برای ارسال یک نامه الکترونیکی به این کاربر استÙاده کنید.
نشانی پست الکترونیکی‌ای Ú©Ù‡ در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی Ùرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
'usermailererror' => 'پست الکترونیکی دچار خطا شد:',
-'defemailsubject' => 'پست الکترونیکی {{SITENAME}}',
+'defemailsubject' => 'پست الکترونیکی {{SITENAME}} از طر٠کاربر «$1»',
'usermaildisabled' => 'پست الکترونیکی کاربر غیرقعال است',
'usermaildisabledtext' => 'شما در این ویکی نمی‌توانید به دیگر کاربران پست الکترونیکی بÙرستید',
'noemailtitle' => 'نشانی پست الکترونیکی موجود نیست',
@@ -2375,7 +2429,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'watchmethod-list' => 'بررسی صÙحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
'watchlistcontains' => 'Ùهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صÙحه|صÙحه}} است.',
'iteminvalidname' => 'مشکل با مورد «$1»، نام نامعتبر است...',
-'wlnote' => 'در زیر آخرین $1 تغییر در $2 ساعت آخر {{PLURAL:$1|آمده‌است|آمده‌اند}}.',
+'wlnote' => "در زیر {{PLURAL:$1|آخرین تغییرات موجود است|آخرین تغییرات '''$1''' موجود است }} آخرین {{PLURAL:$2|ساعت|'''$2''' ساعت}}, در تاریخ $3, $4.",
'wlshowlast' => 'نمایش آخرین $1 ساعت $2 روز $3',
'watchlist-options' => 'گزینه‌های پیگیری',
@@ -2429,7 +2483,6 @@ $NEWPAGE
'exbeforeblank' => 'محتوای صÙحه قبل از خالی‌کردن این بود: «$1»',
'exblank' => 'صÙحه خالی بود',
'delete-confirm' => 'حذ٠«$1»',
-'delete-backlink' => '↠$1',
'delete-legend' => 'حذÙ',
'historywarning' => "'''هشدار!''' صÙحه‌ای Ú©Ù‡ قصد دارید حذ٠کنید تاریخچه‌ای با حدود $1 {{PLURAL:$1|نسخه|نسخه}} دارد:",
'confirmdeletetext' => 'شما در حال حذ٠کردن یک صÙحه یا تصویر از پایگاه‌ داده همراه با تمام تاریخچهٔ آن هستید.
@@ -2438,8 +2491,6 @@ $NEWPAGE
'actionfailed' => 'عمل ناموÙÙ‚ بود',
'deletedtext' => '«$1» حذ٠شد.
برای سابقهٔ حذÙ‌های اخیر به $2 مراجعه کنید.',
-'deletedarticle' => '«[[$1]]» را حذ٠کرد',
-'suppressedarticle' => '«[[$1]]» را Ùرونشاند',
'dellogpage' => 'سیاههٔ حذÙ',
'dellogpagetext' => 'Ùهرست زیر Ùهرستی از آخرین حذÙ‌هاست.
همهٔ زمان‌های نشان‌داده‌شده زمان خادم (وقت گرینویچ) است.',
@@ -2491,7 +2542,10 @@ $NEWPAGE
'unprotectedarticle' => 'صÙحهٔ «[[$1]]» را از محاÙظت بیرون آورد',
'movedarticleprotection' => 'تنظیمات محاÙظت را از «[[$2]]» به «[[$1]]» منتقل کرد',
'protect-title' => 'تغییر وضعیت محاÙظت «$1»',
+'protect-title-notallowed' => 'مشاهده سطح Ø­Ùاظت " $1 "',
'prot_1movedto2' => '[[$1]] به [[$2]] منتقل شد',
+'protect-badnamespace-title' => 'Ùضای نام بدون محاÙظت',
+'protect-badnamespace-text' => 'صÙحه‌های موجود در این Ùضای نام، نمی‌توانند محاÙظت شوند.',
'protect-legend' => 'تأیید محاÙظت',
'protectcomment' => 'دلیل:',
'protectexpiry' => 'زمان سرآمدن:',
@@ -2513,6 +2567,7 @@ $NEWPAGE
'protect-level-sysop' => 'Ùقط مدیران',
'protect-summary-cascade' => 'آبشاری',
'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
+'protect-expiring-local' => 'منقضی $1',
'protect-expiry-indefinite' => 'بی‌پایان',
'protect-cascade' => 'محاÙظت آبشاری - از همهٔ صÙحه‌هایی Ú©Ù‡ در این صÙحه آمده‌اند نیز محاÙظت می‌شود.',
'protect-cantedit' => 'شما نمی‌تواند وضعیت محاÙظت این صÙحه را تغییر دهید، چون اجازه ویرایش آن را ندارید.',
@@ -2573,7 +2628,6 @@ $NEWPAGE
'undeletereset' => 'از نو',
'undeleteinvert' => 'وارونه کردن انتخاب',
'undeletecomment' => 'دلیل:',
-'undeletedarticle' => '«[[$1]]» را احیا کرد',
'undeletedrevisions' => '$1 نسخه احیا {{PLURAL:$1|شد|شدند}}',
'undeletedrevisions-files' => '$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
'undeletedfiles' => '$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
@@ -2583,6 +2637,7 @@ $NEWPAGE
برای دیدن سیاههٔ حذÙ‌ها Ùˆ احیاهای اخیر به [[Special:Log/delete|سیاههٔ حذÙ]] رجوع کنید.",
'undelete-header' => 'برای دیدن صÙحه‌های حذÙ‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذÙ]] را ببینید.',
+'undelete-search-title' => 'جستجوی صÙحه‌های حذ٠شده',
'undelete-search-box' => 'جستجوی صÙحه‌های حذÙ‌شده.',
'undelete-search-prefix' => 'نمایش صÙحه‌ها با شروع از:',
'undelete-search-submit' => 'برو',
@@ -2592,6 +2647,7 @@ $NEWPAGE
'undelete-cleanup-error' => 'خطا در حذ٠تاریخچهٔ استÙاده نشدهٔ «$1».',
'undelete-missing-filearchive' => 'امکان احیای تاریخچهٔ شمارهٔ $1 وجود ندارد زیرا اطلاعات در پایگاه داده وجود ندارد.
ممکن است پیشتر احیا شده باشد.',
+'undelete-error' => 'خطا صÙحه غیرقابل حذÙ',
'undelete-error-short' => 'خطا در احیای پرونده: $1',
'undelete-error-long' => 'در زمان احیای پرونده خطا رخ داد:
@@ -2713,6 +2769,7 @@ $1',
'blocklist-userblocks' => 'پنهان‌کردن بسته‌شدن‌های حساب',
'blocklist-tempblocks' => 'پنهان‌کردن بستن‌های موقت',
'blocklist-addressblocks' => 'پنهان‌کردن تک آی‌پی‌های بسته شده',
+'blocklist-rangeblocks' => 'پنهان کردنی قطع دسترسی بازه‌ها',
'blocklist-timestamp' => 'برچسب زمان',
'blocklist-target' => 'هدÙ',
'blocklist-expiry' => 'زمان سرآمدن',
@@ -2735,6 +2792,7 @@ $1',
'unblocklink' => 'باز شود',
'change-blocklink' => 'تغییر قطع دسترسی',
'contribslink' => 'مشارکت‌ها',
+'emaillink' => 'ارسال پست الکترونیکی',
'autoblocker' => 'به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استÙاده شده‌است.
دلیل قطع دسترسی $1 چنین است: «$2»',
'blocklogpage' => 'سیاههٔ بسته‌شدن‌ها',
@@ -2864,9 +2922,6 @@ $1',
'movepage-page-moved' => 'صÙحهٔ $1 به $2 انتقال یاÙت.',
'movepage-page-unmoved' => 'صÙحهٔ $1 را نمی‌توان به $2 انتقال داد.',
'movepage-max-pages' => 'حداکثر تعداد صÙحه‌های ممکن ($1 {{PLURAL:$1|صÙحه|صÙحه}}) Ú©Ù‡ می‌توان انتقال داد منتقل شدند Ùˆ صÙحه‌های دیگر را نمی‌توان به طور خودکار منتقل کرد.',
-'1movedto2' => '[[$1]] را به [[$2]] منتقل کرد',
-'1movedto2_redir' => '[[$1]] را به [[$2]] Ú©Ù‡ قبلاً صÙحهٔ تغییرمسیر بود، منتقل کرد',
-'move-redirect-suppressed' => 'تغییرمسیر Ùرونشانده شد',
'movelogpage' => 'سیاههٔ انتقال',
'movelogpagetext' => 'در زیر Ùهرستی از انتقال صÙحه‌ها آمده است.',
'movesubpage' => '{{PLURAL:$1|زیرصÙحه|زیرصÙحه‌ها}}',
@@ -2879,7 +2934,7 @@ $1',
مقالهٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذ٠کنید تا انتقال ممکن شود؟',
'delete_and_move_confirm' => 'بله، صÙحه حذ٠شود',
-'delete_and_move_reason' => 'حذ٠برای ممکن‌شدن انتقال',
+'delete_and_move_reason' => 'حذ٠برای ممکن‌شدن انتقال «[[$1]]»',
'selfmove' => 'عنوان‌های صÙحهٔ مبدأ Ùˆ مقصد یکی است؛
انتقال صÙحه به خودش ممکن نیست.',
'immobile-source-namespace' => 'امکان انتقال صÙحه‌ها در Ùضای نام «$1» وجود ندارد',
@@ -2910,9 +2965,11 @@ $1',
برای برون‌بری صÙحه‌ها، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (یکی در هر سطر) Ùˆ مشخص کنید Ú©Ù‡ آیا نسخهٔ اخیر صÙحه را به همراه نسخه‌های قدیمی‌تر Ùˆ تاریخچهٔ صÙحه می‌خواهید، یا تنها نسخهٔ اخیر صÙحه Ùˆ اطلاعات آخرین ویرایش را می‌خواهید.
در حالت دوم، شما می‌توانید از یک پیوند استÙاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صÙحهٔ «[[{{MediaWiki:Mainpage}}]]».',
+'exportall' => 'برون‌بری همهٔ صÙحه‌ها',
'exportcuronly' => 'Ùقط نسخهٔ Ùعلی شامل شود، نه Ú©Ù„ تاریخچه',
'exportnohistory' => "----
'''توجه:''' امکان برون‌بری تاریخچهٔ کامل صÙحه‌ها از طریق این صÙحه به دلایل اجرایی از کار انداخته شده‌است.",
+'exportlistauthors' => 'محتوی لیست کامل مشارکت‌کنندگان هر صÙحه',
'export-submit' => 'برون‌بری',
'export-addcattext' => 'اÙزودن صÙحه‌ها از رده:',
'export-addcat' => 'اÙزودن',
@@ -2945,6 +3002,8 @@ $1',
'thumbnail_error' => 'خطا در ایجاد بندانگشتی: $1',
'djvu_page_error' => 'صÙحهٔ DjVu خارج از حدود مجاز',
'djvu_no_xml' => 'امکان پیدا کردن پروندهٔ XML برای استÙادهٔ DjVu وجود نداشت.',
+'thumbnail-temp-create' => 'نمی‌توان پروندهٔ بندانگشتی موقت را ساخت',
+'thumbnail-dest-create' => 'نمی‌توان تصویر بندانگشتی را در مقصد ذخیره کرد',
'thumbnail_invalid_params' => 'پارامترهای غیرمجاز در تصویر بندانگشتی (thumbnail)',
'thumbnail_dest_directory' => 'اشکال در ایجاد پوشهٔ مقصد',
'thumbnail_image-type' => 'تصویر از نوع پشتیبانی نشده',
@@ -2991,6 +3050,11 @@ $1',
'import-upload' => 'بارگذاری داده اکس‌ام‌ال',
'import-token-mismatch' => 'از دست رÙتن اطلاعات نشست کاربری. لطÙاً دوباره امتحان کنید.',
'import-invalid-interwiki' => 'از ویکی مشخص شده نمی‌توان درون‌ریزی انجام داد.',
+'import-error-edit' => 'صÙحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ویرایش آن نیستید.',
+'import-error-create' => 'صÙحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ایجاد آن نیستید.',
+'import-error-interwiki' => 'صÙحه «$1» وارد نشد. چون نام آن برای پیوند خارجی (interwiki) رزرو شده‌است.',
+'import-error-special' => 'صÙحه «$1» درون‌ریزی نشد، چرا Ú©Ù‡ متعلق به Ùضای نام غیرمجاز است.',
+'import-error-invalid' => 'صÙحه "$1" به دلیل نامعتبر بودن نامش وارد نمی‌شود.',
# Import log
'importlogpage' => 'سیاههٔ درون‌ریزی‌ها',
@@ -3000,73 +3064,86 @@ $1',
'import-logentry-interwiki' => '$1 را تراویکی کرد',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|نسخه|نسخه}} از $2',
+# JavaScriptTest
+'javascripttest' => 'آزمایش جاوا اسکریپت',
+'javascripttest-disabled' => 'این عملکرد غیرÙعال شده‌است.',
+'javascripttest-title' => 'در حال اجرای آزمایش‌های $1',
+'javascripttest-pagetext-noframework' => 'این صÙحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.',
+'javascripttest-pagetext-unknownframework' => 'چارچوب آزمایشی ناشناخته «$1».',
+'javascripttest-pagetext-frameworks' => 'لطÙاً یکی از Ùریم‌ورک‌های آزمایشی زیر را انتخاب کنید: $1',
+'javascripttest-pagetext-skins' => 'پوسته‌ای را برای اجرای آزمایش‌ها انتخاب کنید:',
+'javascripttest-qunit-intro' => '[$1 مستندات آزمایش] را در mediawiki.org ببینید.',
+'javascripttest-qunit-heading' => 'مجموعه آزمایش QUnit جاوااسکریپت برای مدیاویکی',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'صÙحهٔ کاربری شما',
-'tooltip-pt-anonuserpage' => 'صÙحهٔ کاربری نشانی آی‌پی‌ای Ú©Ù‡ با آن ویرایش می‌کنید',
-'tooltip-pt-mytalk' => 'صÙحهٔ بحث شما',
-'tooltip-pt-anontalk' => 'بحث پیرامون ویرایش‌های این نشانی آی‌پی',
-'tooltip-pt-preferences' => 'ترجیحات من',
-'tooltip-pt-watchlist' => 'Ùهرست صÙحه‌هایی Ú©Ù‡ شما تغییرات آن‌ها را پی‌گیری می‌کنید',
-'tooltip-pt-mycontris' => 'Ùهرست مشارکت‌های شما',
-'tooltip-pt-login' => 'توصیه می‌شود که به سامانه وارد شوید، گرچه اجباری نیست',
-'tooltip-pt-anonlogin' => 'توصیه می‌شود که به سامانه وارد شوید، لیکن اجباری نیست',
-'tooltip-pt-logout' => 'خروج از سامانه',
-'tooltip-ca-talk' => 'Ú¯Ùتگو پیرامون صÙحهٔ محتوا',
-'tooltip-ca-edit' => 'شما می‌توانید این صÙحه را ویرایش کنید. لطÙاً پیش از ذخیره از دکمهٔ پیش‌نمایش استÙاده کنید.',
-'tooltip-ca-addsection' => 'بخشی جدید ایجاد کنید',
-'tooltip-ca-viewsource' => 'این صÙحه محاÙظت‌شده‌است.
+'tooltip-pt-userpage' => 'صÙحهٔ کاربری شما',
+'tooltip-pt-anonuserpage' => 'صÙحهٔ کاربری نشانی آی‌پی‌ای Ú©Ù‡ با آن ویرایش می‌کنید',
+'tooltip-pt-mytalk' => 'صÙحهٔ بحث شما',
+'tooltip-pt-anontalk' => 'بحث پیرامون ویرایش‌های این نشانی آی‌پی',
+'tooltip-pt-preferences' => 'ترجیحات من',
+'tooltip-pt-watchlist' => 'Ùهرست صÙحه‌هایی Ú©Ù‡ شما تغییرات آن‌ها را پی‌گیری می‌کنید',
+'tooltip-pt-mycontris' => 'Ùهرست مشارکت‌های شما',
+'tooltip-pt-login' => 'توصیه می‌شود که به سامانه وارد شوید، گرچه اجباری نیست',
+'tooltip-pt-anonlogin' => 'توصیه می‌شود که به سامانه وارد شوید، لیکن اجباری نیست',
+'tooltip-pt-logout' => 'خروج از سامانه',
+'tooltip-ca-talk' => 'Ú¯Ùتگو پیرامون صÙحهٔ محتوا',
+'tooltip-ca-edit' => 'شما می‌توانید این صÙحه را ویرایش کنید. لطÙاً پیش از ذخیره از دکمهٔ پیش‌نمایش استÙاده کنید.',
+'tooltip-ca-addsection' => 'بخشی جدید ایجاد کنید',
+'tooltip-ca-viewsource' => 'این صÙحه محاÙظت‌شده‌است.
می‌توانید متن مبدأ آن را ببینید',
-'tooltip-ca-history' => 'نسخه‌های پیشین این صÙحه',
-'tooltip-ca-protect' => 'محاÙظت از این صÙحه',
-'tooltip-ca-unprotect' => 'تغییر محاÙظت این صÙحه',
-'tooltip-ca-delete' => 'حذ٠این صÙحه',
-'tooltip-ca-undelete' => 'بازگرداندن نسخه‌های صÙحهٔ حذÙ‌شده',
-'tooltip-ca-move' => 'انتقال این صÙحه',
-'tooltip-ca-watch' => 'اÙزودن این صÙحه به Ùهرست پی‌گیری‌هایتان',
-'tooltip-ca-unwatch' => 'حذ٠این صÙحه از Ùهرست پی‌گیری‌هایتان',
-'tooltip-search' => 'جستجو در {{SITENAME}}',
-'tooltip-search-go' => 'در صورت امکان به صÙحه‌ای با همین نام برو',
-'tooltip-search-fulltext' => 'جستجوی این عبارت در صÙحه‌ها',
-'tooltip-p-logo' => 'مشاهدهٔ صÙحهٔ اصلی',
-'tooltip-n-mainpage' => 'مشاهدهٔ صÙحهٔ اصلی',
-'tooltip-n-mainpage-description' => 'مشاهدهٔ صÙحهٔ اصلی',
-'tooltip-n-portal' => 'پیرامون پروژه، آنچه‌ می‌توانید انجام دهید و اینکه چه چیز را کجا پیدا کنید',
-'tooltip-n-currentevents' => 'یاÙتن اطلاعات پیش‌زمینه پیرامون رویدادهای کنونی',
-'tooltip-n-recentchanges' => 'Ùهرستی از تغییرات اخیر در ویکی',
-'tooltip-n-randompage' => 'آوردن یک صÙحهٔ تصادÙÛŒ',
-'tooltip-n-help' => 'مکانی برای دریاÙتن',
-'tooltip-t-whatlinkshere' => 'Ùهرست همهٔ صÙحه‌هایی Ú©Ù‡ به این صÙحه پیوند می‌دهند',
-'tooltip-t-recentchangeslinked' => 'تغییرات اخیر صÙحه‌هایی Ú©Ù‡ این صÙحه به آن‌ها پیوند دارد',
-'tooltip-feed-rss' => 'خبرنامه آراس‌اس برای این صÙحه',
-'tooltip-feed-atom' => 'خبرنامهٔ اتم برای این صÙحه',
-'tooltip-t-contributions' => 'Ùهرست مشارکت‌های این کاربر',
-'tooltip-t-emailuser' => 'Ùرستادن پست الکترونیکی به این کاربر',
-'tooltip-t-upload' => 'بارگذاری تصاویر و پرونده‌های دیگر',
-'tooltip-t-specialpages' => 'Ùهرستی از همهٔ صÙحه‌های ویژه',
-'tooltip-t-print' => 'نسخهٔ قابل چاپ این صÙحه',
-'tooltip-t-permalink' => 'پیوند پایدار به این نسخه از صÙحه',
-'tooltip-ca-nstab-main' => 'دیدن صÙحهٔ محتویات',
-'tooltip-ca-nstab-user' => 'نمایش صÙحهٔ کاربر',
-'tooltip-ca-nstab-media' => 'دیدن صÙحهٔ مدیا',
-'tooltip-ca-nstab-special' => 'این یک صÙحهٔ ویژه است، نمی‌توانید خود صÙحه را ویرایش کنید',
-'tooltip-ca-nstab-project' => 'نمایش صÙحهٔ پروژه',
-'tooltip-ca-nstab-image' => 'دیدن صÙحهٔ پرونده',
-'tooltip-ca-nstab-mediawiki' => 'نمایش پیغام سامانه',
-'tooltip-ca-nstab-template' => 'نمایش الگو',
-'tooltip-ca-nstab-help' => 'دیدن صÙحهٔ راهنما',
-'tooltip-ca-nstab-category' => 'دیدن صÙحهٔ رده',
-'tooltip-minoredit' => 'این ویرایش را ویرایش جزئی نشانه‌گذاری کن',
-'tooltip-save' => 'تغییرات خود را ذخیره کنید',
-'tooltip-preview' => 'پیش‌نمایش تغییرات شما، لطÙاً قبل از ذخیره‌کردن صÙحه از این کلید استÙاده کنید.',
-'tooltip-diff' => 'نمایش تغییراتی که شما در متن داده‌اید.',
-'tooltip-compareselectedversions' => 'دیدن تÙاوت‌های دو نسخهٔ انتخاب‌شده از این صÙحه',
-'tooltip-watch' => 'این صÙحه را به Ùهرست پی‌گیری‌هایتان بیÙزایید.',
-'tooltip-recreate' => 'ایجاد دوبارهٔ صÙحه صر٠نظر از حذ٠شدن قبلی آن',
-'tooltip-upload' => 'شروع بارگذاری',
-'tooltip-rollback' => '«واگردانی» ویرایش(های) آخرین ویرایش‌کنندهٔ این صÙحه را با یک کلیک بازمی‌گرداند.',
-'tooltip-undo' => '«خنثی‌سازی» این ویرایش را خنثی می‌کند Ùˆ جعبهٔ ویرایش را در حالت پیش‌نمایش باز می‌کند تا اÙزودن دلیل در خلاصهٔ ویرایش ممکن شود.',
-'tooltip-preferences-save' => 'ذخیره کردن ترجیحات',
-'tooltip-summary' => 'خلاصه‌ای وارد کنید',
+'tooltip-ca-history' => 'نسخه‌های پیشین این صÙحه',
+'tooltip-ca-protect' => 'محاÙظت از این صÙحه',
+'tooltip-ca-unprotect' => 'تغییر محاÙظت این صÙحه',
+'tooltip-ca-delete' => 'حذ٠این صÙحه',
+'tooltip-ca-undelete' => 'بازگرداندن نسخه‌های صÙحهٔ حذÙ‌شده',
+'tooltip-ca-move' => 'انتقال این صÙحه',
+'tooltip-ca-watch' => 'اÙزودن این صÙحه به Ùهرست پی‌گیری‌هایتان',
+'tooltip-ca-unwatch' => 'حذ٠این صÙحه از Ùهرست پی‌گیری‌هایتان',
+'tooltip-search' => 'جستجو در {{SITENAME}}',
+'tooltip-search-go' => 'در صورت امکان به صÙحه‌ای با همین نام برو',
+'tooltip-search-fulltext' => 'جستجوی این عبارت در صÙحه‌ها',
+'tooltip-p-logo' => 'مشاهدهٔ صÙحهٔ اصلی',
+'tooltip-n-mainpage' => 'مشاهدهٔ صÙحهٔ اصلی',
+'tooltip-n-mainpage-description' => 'مشاهدهٔ صÙحهٔ اصلی',
+'tooltip-n-portal' => 'پیرامون پروژه، آنچه‌ می‌توانید انجام دهید و اینکه چه چیز را کجا پیدا کنید',
+'tooltip-n-currentevents' => 'یاÙتن اطلاعات پیش‌زمینه پیرامون رویدادهای کنونی',
+'tooltip-n-recentchanges' => 'Ùهرستی از تغییرات اخیر در ویکی',
+'tooltip-n-randompage' => 'آوردن یک صÙحهٔ تصادÙÛŒ',
+'tooltip-n-help' => 'مکانی برای دریاÙتن',
+'tooltip-t-whatlinkshere' => 'Ùهرست همهٔ صÙحه‌هایی Ú©Ù‡ به این صÙحه پیوند می‌دهند',
+'tooltip-t-recentchangeslinked' => 'تغییرات اخیر صÙحه‌هایی Ú©Ù‡ این صÙحه به آن‌ها پیوند دارد',
+'tooltip-feed-rss' => 'خبرنامه آراس‌اس برای این صÙحه',
+'tooltip-feed-atom' => 'خبرنامهٔ اتم برای این صÙحه',
+'tooltip-t-contributions' => 'Ùهرست مشارکت‌های این کاربر',
+'tooltip-t-emailuser' => 'Ùرستادن پست الکترونیکی به این کاربر',
+'tooltip-t-upload' => 'بارگذاری تصاویر و پرونده‌های دیگر',
+'tooltip-t-specialpages' => 'Ùهرستی از همهٔ صÙحه‌های ویژه',
+'tooltip-t-print' => 'نسخهٔ قابل چاپ این صÙحه',
+'tooltip-t-permalink' => 'پیوند پایدار به این نسخه از صÙحه',
+'tooltip-ca-nstab-main' => 'دیدن صÙحهٔ محتویات',
+'tooltip-ca-nstab-user' => 'نمایش صÙحهٔ کاربر',
+'tooltip-ca-nstab-media' => 'دیدن صÙحهٔ مدیا',
+'tooltip-ca-nstab-special' => 'این یک صÙحهٔ ویژه است، نمی‌توانید خود صÙحه را ویرایش کنید',
+'tooltip-ca-nstab-project' => 'نمایش صÙحهٔ پروژه',
+'tooltip-ca-nstab-image' => 'دیدن صÙحهٔ پرونده',
+'tooltip-ca-nstab-mediawiki' => 'نمایش پیغام سامانه',
+'tooltip-ca-nstab-template' => 'نمایش الگو',
+'tooltip-ca-nstab-help' => 'دیدن صÙحهٔ راهنما',
+'tooltip-ca-nstab-category' => 'دیدن صÙحهٔ رده',
+'tooltip-minoredit' => 'این ویرایش را ویرایش جزئی نشانه‌گذاری کن',
+'tooltip-save' => 'تغییرات خود را ذخیره کنید',
+'tooltip-preview' => 'پیش‌نمایش تغییرات شما، لطÙاً قبل از ذخیره‌کردن صÙحه از این کلید استÙاده کنید.',
+'tooltip-diff' => 'نمایش تغییراتی که شما در متن داده‌اید.',
+'tooltip-compareselectedversions' => 'دیدن تÙاوت‌های دو نسخهٔ انتخاب‌شده از این صÙحه',
+'tooltip-watch' => 'این صÙحه را به Ùهرست پی‌گیری‌هایتان بیÙزایید.',
+'tooltip-watchlistedit-normal-submit' => 'حذ٠عنوان‌ها',
+'tooltip-watchlistedit-raw-submit' => 'بروزرسانی پی‌گیری‌ها',
+'tooltip-recreate' => 'ایجاد دوبارهٔ صÙحه صر٠نظر از حذ٠شدن قبلی آن',
+'tooltip-upload' => 'شروع بارگذاری',
+'tooltip-rollback' => '«واگردانی» ویرایش(های) آخرین ویرایش‌کنندهٔ این صÙحه را با یک کلیک بازمی‌گرداند.',
+'tooltip-undo' => '«خنثی‌سازی» این ویرایش را خنثی می‌کند Ùˆ جعبهٔ ویرایش را در حالت پیش‌نمایش باز می‌کند تا اÙزودن دلیل در خلاصهٔ ویرایش ممکن شود.',
+'tooltip-preferences-save' => 'ذخیره کردن ترجیحات',
+'tooltip-summary' => 'خلاصه‌ای وارد کنید',
# Stylesheets
'common.css' => '/* دستورات این بخش همهٔ کاربران را تحت تاثیر قرار می‌دهند. */',
@@ -3134,9 +3211,6 @@ $1',
# Patrol log
'patrol-log-page' => 'سیاههٔ گشت',
'patrol-log-header' => 'این سیاهه‌ای از ویرایش‌های گشت‌خورده است.',
-'patrol-log-line' => 'به $1 از $2 برچسب گشت زد $3',
-'patrol-log-auto' => '(خودکار)',
-'patrol-log-diff' => 'نسخهٔ $1',
'log-show-hide-patrol' => 'سیاههٔ گشت‌زنی $1',
# Image deletion
@@ -3164,11 +3238,11 @@ $1',
'file-info' => 'اندازهٔ پرونده: $1، نوع MIME $2',
'file-info-size' => '<span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3، نوع MIME پرونده: $4',
'file-info-size-pages' => '<span style="direction:ltr">$1 × $2</span> نقطه، حجم پرونده: $3ØŒ نوع MIME پرونده: $4ØŒ $5 صÙحه',
-'file-nohires' => '<small>تÙکیک‌پذیری بالاتری در دسترس نیست.</small>',
+'file-nohires' => 'تÙکیک‌پذیری بالاتری در دسترس نیست.',
'svg-long-desc' => 'پروندهٔ اس‌وی‌جی، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
'show-big-image' => 'تصویر با تÙکیک‌پذیری بالاتر',
-'show-big-image-preview' => '<small>اندازهٔ این پیش‌نمایش: $1.</small>',
-'show-big-image-other' => '<small>Ú©ÛŒÙیت‌های دیگر: $1.</small>',
+'show-big-image-preview' => 'اندازهٔ این پیش‌نمایش: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Ú©ÛŒÙیت|Ú©ÛŒÙیت‌های}} دیگر: $1.',
'show-big-image-size' => '<span dir="ltr">$1 × $2</span> پیکسل',
'file-info-gif-looped' => 'چرخش‌دار',
'file-info-gif-frames' => '$1 {{PLURAL:$1|قاب|قاب}}',
@@ -3188,6 +3262,13 @@ $1',
'bydate' => 'از روی تاریخ',
'sp-newimages-showfrom' => 'نشان‌دادن تصویرهای جدید از $2، $1 به بعد',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1ثانیه| $1 ثانیه}}',
+'minutes' => '{{PLURAL: $1|دقیقه|دقیقه}}',
+'hours' => '{{PLURAL: $1|ساعت|ساعت}}',
+'days' => '{{PLURAL: $1|روز|روز}}',
+'ago' => '$1 پیش',
+
# Bad image list
'bad_image_list' => 'اطلاعات را باید اینگونه وارد کنید:
@@ -3682,13 +3763,6 @@ $5
'scarytranscludefailed' => '[Ùراخوانی الگو برای $1 میسر نشد]',
'scarytranscludetoolong' => '[نشانی اینترنتی مورد نظر (URL) بیش از اندازه بلند بود]',
-# Trackbacks
-'trackbackbox' => 'بازتاب این صÙحه در وب‌نوشت‌ها:<br />
-$1',
-'trackbackremove' => '([$1 حذÙ])',
-'trackbacklink' => 'بازتاب',
-'trackbackdeleteok' => 'بازتاب صÙحه با موÙقیت حذ٠شد.',
-
# Delete conflict
'deletedwhileediting' => "'''هشدار''': این صÙحه پس از اینکه شما آغاز به ویرایش آن کرده‌اید، حذ٠شده است!",
'confirmrecreate' => "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذ٠کرده است :
@@ -3836,6 +3910,9 @@ $1',
'hebrew-calendar-m11-gen' => 'آب',
'hebrew-calendar-m12-gen' => 'ایلول',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|بحث]])',
+
# Core parser functions
'unknown_extension_tag' => 'برچسب ناشناختهٔ اÙزونه «$1»',
'duplicate-defaultsort' => 'هشدار: ترتیب پیش‌Ùرض «$2» ترتیب پیش‌Ùرض قبلی «$1» را باطل می‌کند.',
@@ -3891,8 +3968,7 @@ $1',
'specialpages' => 'صÙحه‌های ویژه',
'specialpages-note' => '----
* صÙحه‌های ویژهٔ عادی.
-* <strong class="mw-specialpagerestricted">صÙحات ویژهٔ محدود شده.</strong>
-* <strong class="mw-specialpagerestricted">صÙحات ویژهٔ دارای میانگیر (ممکن است منسوخ باشند).</strong>',
+* <strong class="mw-specialpagerestricted">صÙحه‌های ویژهٔ محدودشده.</strong>',
'specialpages-group-maintenance' => 'گزارش‌های نگهداری',
'specialpages-group-other' => 'صÙحه‌های ویژهٔ دیگر',
'specialpages-group-login' => 'ورود / ثبت نام',
@@ -3934,13 +4010,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|تغییر|تغییر}}',
# Special:ComparePages
-'comparepages' => 'مقایسهٔ صÙحه‌ها',
-'compare-selector' => 'مقایسهٔ نسخه‌های صÙحه‌ها',
-'compare-page1' => 'صÙحهٔ Û±',
-'compare-page2' => 'صÙحهٔ Û²',
-'compare-rev1' => 'نسخهٔ ۱',
-'compare-rev2' => 'نسخهٔ ۲',
-'compare-submit' => 'مقایسه',
+'comparepages' => 'مقایسهٔ صÙحه‌ها',
+'compare-selector' => 'مقایسهٔ نسخه‌های صÙحه‌ها',
+'compare-page1' => 'صÙحهٔ Û±',
+'compare-page2' => 'صÙحهٔ Û²',
+'compare-rev1' => 'نسخهٔ ۱',
+'compare-rev2' => 'نسخهٔ ۲',
+'compare-submit' => 'مقایسه',
+'compare-invalid-title' => 'عنوان تعیین‌شده نامعتبر است.',
+'compare-title-not-exists' => 'عنوان مشخص شده وجود ندارد.',
+'compare-revision-not-exists' => 'پالایهٔ مشخص شده وجود ندارد.',
# Database error messages
'dberr-header' => 'این ویکی یک ایراد دارد',
@@ -3968,4 +4047,89 @@ $1',
'sqlite-has-fts' => '$1 با پشتیبانی از جستجو در متن کامل',
'sqlite-no-fts' => '$1 بدون پشتیبانی از جستجو در متن کامل',
+# New logging system
+'logentry-delete-delete' => '$1 $3 را حذ٠کرد',
+'logentry-delete-restore' => '$1 $3 را احیا کرد',
+'logentry-delete-event' => '$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 تغییر داد: $4',
+'logentry-delete-revision' => '$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صÙحه $3 را تغییر داد: $4',
+'logentry-delete-event-legacy' => '$1 پیدایی موارد سیاهه را در $3 تغییر داد',
+'logentry-delete-revision-legacy' => '$1 پیدایی نسخه‌های $3 را تغییر داد',
+'logentry-suppress-delete' => '$1 $3 را Ùرونشانی کرد',
+'logentry-suppress-event' => '$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 مخÙیانه تغییر داد: $4',
+'logentry-suppress-revision' => '$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صÙحه $3 را مخÙیانه تغییر داد: $4',
+'logentry-suppress-event-legacy' => '$1 پیدایی موارد سیاهه را در $3 مخÙیانه تغییر داد',
+'logentry-suppress-revision-legacy' => '$1 پیدایی نسخه‌های $3 را مخÙیانه تغییر داد',
+'revdelete-content-hid' => 'محتوا را پنهان کرد',
+'revdelete-summary-hid' => 'خلاصه ویرایش را پنهان کرد',
+'revdelete-uname-hid' => 'نام کاربری را پنهان کرد',
+'revdelete-content-unhid' => 'محتوا را پنهان کرد',
+'revdelete-summary-unhid' => 'خلاصه ویرایش را پنهان کرد',
+'revdelete-uname-unhid' => 'نام کاربری را پنهان کرد',
+'revdelete-restricted' => 'مدیران را محدود کرد',
+'revdelete-unrestricted' => 'محدودیت مدیران را لغو کرد',
+'logentry-move-move' => '$1 صÙحهٔ $3 را به $4 منتقل کرد',
+'logentry-move-move-noredirect' => '$1 صÙحهٔ $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 منتقل کرد',
+'logentry-move-move_redir' => '$1 صÙحهٔ $3 را به $4 Ú©Ù‡ تغییرمسیر بود منتقل کرد',
+'logentry-move-move_redir-noredirect' => '$1 صÙحهٔ $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 Ú©Ù‡ تغییرمسیر بود منتقل کرد',
+'logentry-patrol-patrol' => '$1 نسخه $4 صÙحه $3 را به عنوان گشت خورده علامت زد',
+'logentry-patrol-patrol-auto' => '$1 نسخه $4 صÙحه $3 را به طور خودکار به عنوان گشت خورده علامت زد',
+'logentry-newusers-newusers' => '$1 یک حساب کاربری ایجاد کرد',
+'logentry-newusers-create' => '$1 یک حساب کاربری ایجاد کرد',
+'logentry-newusers-create2' => '$1 یک حساب کاربری ایجاد کرد $3',
+'logentry-newusers-autocreate' => 'کاروری حساب $1 بساتن به شکل خودکار',
+'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
+
+# Feedback
+'feedback-bugornote' => 'اگر آماده‌اید تا مشکلی ÙÙ†ÛŒ را با جزئیاتش شرح دهید لطÙاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از Ùرم سادهٔ زیر استÙاده کنید. نظر شما به همراه نام کاربری Ùˆ مرورگرتان به صÙحهٔ «[$2 $3]» اÙزوده خواهد شد.',
+'feedback-subject' => 'موضوع:',
+'feedback-message' => 'پیغام:',
+'feedback-cancel' => 'لغو',
+'feedback-submit' => 'ارسال بازخورد',
+'feedback-adding' => 'اÙزودن بازخورد به صÙحه...',
+'feedback-error1' => 'خطا: پاسخ‌های ناشناخته از رابط برنامه‌نویسی نرم‌اÙزار',
+'feedback-error2' => 'خطا: شکست در ویرایش',
+'feedback-error3' => 'خطا: عدم پاسخ از رابط برنامه‌نویسی نرم‌اÙزار',
+'feedback-thanks' => 'سپاس! بازخورد شما در صÙحهٔ «[$1 $2]» ثبت شد.',
+'feedback-close' => 'انجام شد',
+'feedback-bugcheck' => 'عالی‌است! Ùقط بررسی کنید Ú©Ù‡ از [$1 ایرادهای شناخته‌شده] نباشد.',
+'feedback-bugnew' => 'بررسی کردم. ایرادی جدید را گزارش بده',
+
+# API errors
+'api-error-badaccess-groups' => 'شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.',
+'api-error-badtoken' => 'خطای داخلی: کد امنیتی اشتباه (Bad token).',
+'api-error-copyuploaddisabled' => 'بارگذاری با استÙاده از نشانی اینترنتی در این کارساز غیرÙعال است.',
+'api-error-duplicate' => '{{PLURAL:$1|[$2 پروندهٔ دیگری]|[$2 چند پروندهٔ دیگر]}} در تارنما با محتوای یکسان وجود داشت.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|[$2 پروندهٔ دیگری]|[$2 چند پروندهٔ دیگر]}} در تارنما با محتوای یکسان وجود داشت، ولی حذ٠{{PLURAL:$1|شده است|شده‌اند}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|پروندهٔ|پرونده‌های}} تکراری که در حال حاضر حذ٠شده‌اند',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|پرونده|پرونده‌های}} تکراری',
+'api-error-empty-file' => 'پرونده‌ای که شما ارسال کردید خالی بود.',
+'api-error-emptypage' => 'ایجاد صÙحه‌های خالی مجاز نیست.',
+'api-error-fetchfileerror' => 'خطای داخلی: در هنگام گرÙتن پرونده، یک چیزی درست پیش نرÙت.',
+'api-error-file-too-large' => 'پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.',
+'api-error-filename-tooshort' => 'نام پرونده بیش از اندازه کوتاه است.',
+'api-error-filetype-banned' => 'این نوع پرونده ممنوع است.',
+'api-error-filetype-missing' => 'پرونده Ùرمت ندارد.',
+'api-error-hookaborted' => 'اصلاحیه‌ای Ú©Ù‡ شما سعی در ایجاد آن بودید توسط اÙزونه‌ای به دام اÙتاد.',
+'api-error-http' => 'خطای داخلی: قادر به اتصال به سرور نیست.',
+'api-error-illegal-filename' => 'نام پرونده مجاز نیست.',
+'api-error-internal-error' => 'خطای داخلی: با پردازش بارگذاری شما در ویکی، یک چیز اشتباه پیش رÙت.',
+'api-error-invalid-file-key' => 'خطای داخلی: پرونده در حاÙظهٔ موقت موجود نیست.',
+'api-error-missingparam' => 'خطای داخلی: پارامترهای ناموجود در درخواست.',
+'api-error-missingresult' => 'خطای داخلی: نمی‌توان Ùهمید کپی‌برداری موÙÙ‚ بوده‌است یا نه.',
+'api-error-mustbeloggedin' => 'برای بارگذاری پرونده‌ها شما باید به سامانه وارد شوید.',
+'api-error-mustbeposted' => 'خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.',
+'api-error-noimageinfo' => 'بارگذاری موÙÙ‚ بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.',
+'api-error-nomodule' => 'خطای داخلی: هیچ ماژول بارگذاری تنظیم نشده‌است.',
+'api-error-ok-but-empty' => 'خطای داخلی : پاسخی از سرور دریاÙت نشد.',
+'api-error-overwrite' => 'جای نوشتن یک پرونده موجود مجاز نیست.',
+'api-error-stashfailed' => 'خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.',
+'api-error-timeout' => 'کارساز در زمان انتظار هیچ پاسخی نداد.',
+'api-error-unclassified' => 'یک خطای ناشناخته رخ داد.',
+'api-error-unknown-code' => 'خطای ناشناخته: " $1 "',
+'api-error-unknown-error' => 'خطای داخلی: در زمانی Ú©Ù‡ شما در حال تلاش برای بارگذاری پروندهٔ‌تان بودید، یک چیز اشتباه پیش رÙت.',
+'api-error-unknown-warning' => 'اخطار ناشناخته: $1',
+'api-error-unknownerror' => 'خطای ناشناخته: «$1».',
+'api-error-uploaddisabled' => 'بارگذاری در این ویکی غیرÙعال است.',
+'api-error-verification-error' => 'ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.',
+
);
diff --git a/languages/messages/MessagesFf.php b/languages/messages/MessagesFf.php
index e7b5cf23..83098487 100644
--- a/languages/messages/MessagesFf.php
+++ b/languages/messages/MessagesFf.php
@@ -8,6 +8,7 @@
* @file
*
* @author Amkoullel
+ * @author Guaka (on ff.wikipedia.org)
*/
$fallback = 'fr';
diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php
index 69d3ee8b..f5edea25 100644
--- a/languages/messages/MessagesFi.php
+++ b/languages/messages/MessagesFi.php
@@ -25,7 +25,9 @@
* @author Str4nd
* @author Tarmo
* @author Tofu II
+ * @author Veikk0.ma
* @author Wix
+ * @author Yaamboo
* @author ZeiP
* @author לערי ריינה×רט
*/
@@ -96,110 +98,110 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#OHJAUS', '#UUDELLEENOHJAUS', '#REDIRECT' ),
- 'notoc' => array( '0', '__EISISLUETT__', '__NOTOC__' ),
- 'forcetoc' => array( '0', '__SISLUETTPAKOTUS__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SISÄLLYSLUETTELO__', '__TOC__' ),
- 'noeditsection' => array( '0', '__EIOSIOMUOKKAUSTA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__EIOTSIKKOA__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'KULUVAKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'KULUVAKUUNIMI', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'KULUVAKUUNIMIGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'KULUVAKUUNIMILYHYT', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'KULUVAPÄIVÄ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'KULUVAPÄIVÄ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'KULUVAPÄIVÄNIMI', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'KULUVAVUOSI', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'KULUVAAIKA', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'KULUVATUNTI', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'PAIKALLINENKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'PAIKALLINENKUUNIMI', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'PAIKALLINENKUUNIMIGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'PAIKALLINENKUUNIMILYHYT', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'PAIKALLINENPÄIVÄ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'PAIKALLINENPÄIVÄ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'PAIKALLINENPÄIVÄNIMI', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'PAIKALLINENVUOSI', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'PAIKALLINENAIKA', 'LOCALTIME' ),
- 'localhour' => array( '1', 'PAIKALLINENTUNTI', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'SIVUMÄÄRÄ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ARTIKKELIMÄÄRÄ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'TIEDOSTOMÄÄRÄ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'KÄYTTÄJÄMÄÄRÄ', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'MUOKKAUSMÄÄRÄ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'SIVUHAKUMÄÄRÄ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'SIVUNIMI', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SIVUNIMIE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NIMIAVARUUS', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NIMIAVARUUSE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'KESKUSTELUAVARUUS', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'KESKUSTELUAVARUUSE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'AIHEAVARUUS', 'ARTIKKELIAVARUUS', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'AIHEAVARUUSE', 'ARTIKKELIAVARUUSE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'KOKOSIVUNIMI', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'KOKOSIVUNIMIE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ALASIVUNIMI', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ALASIVUNIMIE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'KANTASIVUNIMI', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'KANTASIVUNIMIE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'KESKUSTELUSIVUNIMI', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'KESKUSTELUSIVUNIMIE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'AIHESIVUNIMI', 'ARTIKKELISIVUNIMI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'AIHESIVUNIMIE', 'ARTIKKELISIVUNIMIE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'subst' => array( '0', 'VASTINE:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'pienoiskuva', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'pienoiskuva=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'oikea', 'right' ),
- 'img_left' => array( '1', 'vasen', 'left' ),
- 'img_none' => array( '1', 'tyhjä', 'none' ),
- 'img_center' => array( '1', 'keskitetty', 'keski', 'center', 'centre' ),
- 'img_framed' => array( '1', 'kehys', 'kehystetty', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'kehyksetön', 'frameless' ),
- 'img_page' => array( '1', 'sivu=$1', 'sivu $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'yläoikea', 'yläoikea=$1', 'yläoikea $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'reunus', 'border' ),
- 'img_baseline' => array( '1', 'perustaso', 'baseline' ),
- 'img_sub' => array( '1', 'alaindeksi', 'sub' ),
- 'img_super' => array( '1', 'yläindeksi', 'super', 'sup' ),
- 'img_top' => array( '1', 'ylös', 'ylhäällä', 'top' ),
- 'img_middle' => array( '1', 'keskellä', 'middle' ),
- 'img_bottom' => array( '1', 'alas', 'alhaalla', 'bottom' ),
- 'img_link' => array( '1', 'linkki=$1', 'link=$1' ),
- 'sitename' => array( '1', 'SIVUSTONIMI', 'SITENAME' ),
- 'ns' => array( '0', 'NA:', 'NS:' ),
- 'localurl' => array( '0', 'PAIKALLINENOSOITE:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'PAIKALLINENOSOITEE:', 'LOCALURLE:' ),
- 'server' => array( '0', 'PALVELIN', 'SERVER' ),
- 'servername' => array( '0', 'PALVELINNIMI', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTIPOLKU', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'TAIVUTUS:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'SUKUPUOLI:', 'GENDER:' ),
- 'currentweek' => array( '1', 'KULUVAVIIKKO', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'KULUVAVIIKONPÄIVÄ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'PAIKALLINENVIIKKO', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'PAIKALLINENVIIKONPÄIVÄ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'VERSIOID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'VERSIOPÄIVÄ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'VERSIOPÄIVÄ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'VERSIOKUUKAUSI', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'VERSIOVUOSI', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'VERSIOAIKALEIMA', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'MONIKKO:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TÄYSIOSOITE:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'TÄYSIOSOITEE:', 'FULLURLE:' ),
- 'displaytitle' => array( '1', 'NÄKYVÄOTSIKKO', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'NYKYINENVERSIO', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'KULUVAAIKALEIMA', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'PAIKALLINENAIKALEIMA', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#KIELI:', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'YLLÄPITÄJÄMÄÄRÄ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'MUOTOILELUKU', 'FORMATNUM' ),
- 'defaultsort' => array( '1', 'AAKKOSTUS:', 'OLETUSAAKKOSTUS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'TIEDOSTOPOLKU:', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__PIILOLUOKKA__', '__HIDDENCAT__' ),
- 'pagesize' => array( '1', 'SIVUKOKO', 'PAGESIZE' ),
- 'noindex' => array( '1', '__HAKUKONEKIELTO__', '__NOINDEX__' ),
- 'protectionlevel' => array( '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#OHJAUS', '#UUDELLEENOHJAUS', '#REDIRECT' ),
+ 'notoc' => array( '0', '__EISISLUETT__', '__NOTOC__' ),
+ 'forcetoc' => array( '0', '__SISLUETTPAKOTUS__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SISÄLLYSLUETTELO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__EIOSIOMUOKKAUSTA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__EIOTSIKKOA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'KULUVAKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'KULUVAKUUNIMI', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'KULUVAKUUNIMIGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'KULUVAKUUNIMILYHYT', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'KULUVAPÄIVÄ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'KULUVAPÄIVÄ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'KULUVAPÄIVÄNIMI', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'KULUVAVUOSI', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'KULUVAAIKA', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'KULUVATUNTI', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'PAIKALLINENKUU', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'PAIKALLINENKUUNIMI', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'PAIKALLINENKUUNIMIGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'PAIKALLINENKUUNIMILYHYT', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'PAIKALLINENPÄIVÄ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'PAIKALLINENPÄIVÄ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'PAIKALLINENPÄIVÄNIMI', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'PAIKALLINENVUOSI', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'PAIKALLINENAIKA', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'PAIKALLINENTUNTI', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'SIVUMÄÄRÄ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ARTIKKELIMÄÄRÄ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'TIEDOSTOMÄÄRÄ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'KÄYTTÄJÄMÄÄRÄ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'MUOKKAUSMÄÄRÄ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'SIVUHAKUMÄÄRÄ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'SIVUNIMI', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SIVUNIMIE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NIMIAVARUUS', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NIMIAVARUUSE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'KESKUSTELUAVARUUS', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'KESKUSTELUAVARUUSE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'AIHEAVARUUS', 'ARTIKKELIAVARUUS', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'AIHEAVARUUSE', 'ARTIKKELIAVARUUSE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'KOKOSIVUNIMI', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'KOKOSIVUNIMIE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ALASIVUNIMI', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ALASIVUNIMIE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'KANTASIVUNIMI', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'KANTASIVUNIMIE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'KESKUSTELUSIVUNIMI', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'KESKUSTELUSIVUNIMIE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'AIHESIVUNIMI', 'ARTIKKELISIVUNIMI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'AIHESIVUNIMIE', 'ARTIKKELISIVUNIMIE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'subst' => array( '0', 'VASTINE:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'pienoiskuva', 'pienois', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'pienoiskuva=$1', 'pienois=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'oikea', 'right' ),
+ 'img_left' => array( '1', 'vasen', 'left' ),
+ 'img_none' => array( '1', 'tyhjä', 'none' ),
+ 'img_center' => array( '1', 'keskitetty', 'keski', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'kehys', 'kehystetty', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'kehyksetön', 'frameless' ),
+ 'img_page' => array( '1', 'sivu=$1', 'sivu $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'yläoikea', 'yläoikea=$1', 'yläoikea $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'reunus', 'border' ),
+ 'img_baseline' => array( '1', 'perustaso', 'baseline' ),
+ 'img_sub' => array( '1', 'alaindeksi', 'sub' ),
+ 'img_super' => array( '1', 'yläindeksi', 'super', 'sup' ),
+ 'img_top' => array( '1', 'ylös', 'ylhäällä', 'top' ),
+ 'img_middle' => array( '1', 'keskellä', 'middle' ),
+ 'img_bottom' => array( '1', 'alas', 'alhaalla', 'bottom' ),
+ 'img_link' => array( '1', 'linkki=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'SIVUSTONIMI', 'SITENAME' ),
+ 'ns' => array( '0', 'NA:', 'NS:' ),
+ 'localurl' => array( '0', 'PAIKALLINENOSOITE:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'PAIKALLINENOSOITEE:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'PALVELIN', 'SERVER' ),
+ 'servername' => array( '0', 'PALVELINNIMI', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTIPOLKU', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'TAIVUTUS:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SUKUPUOLI:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'KULUVAVIIKKO', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'KULUVAVIIKONPÄIVÄ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'PAIKALLINENVIIKKO', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'PAIKALLINENVIIKONPÄIVÄ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'VERSIOID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'VERSIOPÄIVÄ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'VERSIOPÄIVÄ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'VERSIOKUUKAUSI', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'VERSIOVUOSI', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VERSIOAIKALEIMA', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'MONIKKO:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'TÄYSIOSOITE:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'TÄYSIOSOITEE:', 'FULLURLE:' ),
+ 'displaytitle' => array( '1', 'NÄKYVÄOTSIKKO', 'DISPLAYTITLE' ),
+ 'currentversion' => array( '1', 'NYKYINENVERSIO', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'KULUVAAIKALEIMA', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'PAIKALLINENAIKALEIMA', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#KIELI:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'YLLÄPITÄJÄMÄÄRÄ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'MUOTOILELUKU', 'FORMATNUM' ),
+ 'defaultsort' => array( '1', 'AAKKOSTUS:', 'OLETUSAAKKOSTUS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'TIEDOSTOPOLKU:', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__PIILOLUOKKA__', '__HIDDENCAT__' ),
+ 'pagesize' => array( '1', 'SIVUKOKO', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__HAKUKONEKIELTO__', '__NOINDEX__' ),
+ 'protectionlevel' => array( '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ),
);
$specialPageAliases = array(
@@ -207,12 +209,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'Järjestelmäviestit' ),
'Allpages' => array( 'Kaikki_sivut' ),
'Ancientpages' => array( 'Kuolleet_sivut' ),
+ 'Badtitle' => array( 'Kelpaamaton_otsikko' ),
'Blankpage' => array( 'Tyhjä_sivu' ),
'Block' => array( 'Estä' ),
'Blockme' => array( 'Estä_minut' ),
'Booksources' => array( 'Kirjalähteet' ),
'BrokenRedirects' => array( 'Virheelliset_ohjaukset', 'Virheelliset_uudelleenohjaukset' ),
'Categories' => array( 'Luokat' ),
+ 'ChangeEmail' => array( 'Muuta_sähköpostiosoite' ),
'ChangePassword' => array( 'Muuta_salasana', 'Alusta_salasana' ),
'ComparePages' => array( 'Vertaa_sivuja' ),
'Confirmemail' => array( 'Varmista_sähköpostiosoite' ),
@@ -254,9 +258,11 @@ $specialPageAliases = array(
'Mycontributions' => array( 'Omat_muokkaukset' ),
'Mypage' => array( 'Oma_sivu' ),
'Mytalk' => array( 'Oma_keskustelu' ),
+ 'Myuploads' => array( 'Omat_tiedostot' ),
'Newimages' => array( 'Uudet_tiedostot', 'Uudet_kuvat' ),
'Newpages' => array( 'Uudet_sivut' ),
- 'PasswordReset' => array( 'Salasanan_pyyhkiminen' ),
+ 'PasswordReset' => array( 'Unohtuneen_salasanan_vaihto' ),
+ 'PermanentLink' => array( 'Ikilinkki' ),
'Popularpages' => array( 'Suositut_sivut' ),
'Preferences' => array( 'Asetukset' ),
'Prefixindex' => array( 'Etuliiteluettelo' ),
@@ -656,18 +662,20 @@ Ilmoita tämän sivun osoite wikin [[Special:ListUsers/sysop|ylläpitäjälle]].
'badarticleerror' => 'Toimintoa ei voi suorittaa tälle sivulle.',
'cannotdelete' => 'Sivun tai tiedoston â€$1†poisto epäonnistui.
Joku muu on saattanut poistaa sen.',
+'cannotdelete-title' => 'Sivua $1 ei voi poistaa',
'badtitle' => 'Virheellinen otsikko',
'badtitletext' => 'Pyytämäsi sivuotsikko oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen linkki.',
-'perfcached' => 'Tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla.',
-'perfcachedts' => 'Seuraava data on tuotu välimuistista ja se päivitettiin viimeksi $1.',
+'perfcached' => 'Tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla. Välimuistissa on enintään {{PLURAL:$1|yksi tulos|$1 tulosta}}.',
+'perfcachedts' => 'Tiedot ovat välimuistista ja se päivitettiin viimeksi $1. Välimuistissa on enintään {{PLURAL:$4|yksi tulos|$4 tulosta}}.',
'querypage-no-updates' => 'Tämän sivun tietoja ei toistaiseksi päivitetä.',
'wrong_wfQuery_params' => 'Virheelliset parametrit wfQuery()<br />Funktio: $1<br />Tiedustelu: $2',
'viewsource' => 'Lähdekoodi',
-'viewsourcefor' => 'sivulle $1',
+'viewsource-title' => 'Lähdekoodi sivulle $1',
'actionthrottled' => 'Toiminto nopeusrajoitettu',
'actionthrottledtext' => 'Ylläpitosyistä tämän toiminnon suorittamista on rajoitettu. Olet suorittanut tämän toiminnon liian monta kertaa lyhyen ajan sisällä. Yritä myöhemmin uudelleen.',
'protectedpagetext' => 'Tämä sivu on suojattu muutoksilta.',
'viewsourcetext' => 'Voit tarkastella ja kopioida tämän sivun lähdekoodia:',
+'viewyourtext' => "Voit tarkastella ja kopioida lähdekoodin '''tekemistäsi muutoksista''' tähän sivuun:",
'protectedinterface' => 'Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.',
'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.
@@ -755,6 +763,7 @@ Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunn
'noemailprefs' => 'Sähköpostiosoitetta ei ole määritelty.',
'emailconfirmlink' => 'Varmenna sähköpostiosoite',
'invalidemailaddress' => 'Sähköpostiosoitetta ei voida hyväksyä, koska se ei ole oikeassa muodossa. Ole hyvä ja anna oikea sähköpostiosoite tai jätä kenttä tyhjäksi.',
+'cannotchangeemail' => 'Tunnuksien sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
'accountcreated' => 'Käyttäjätunnus luotiin',
'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
'createaccount-title' => 'Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}',
@@ -771,6 +780,7 @@ Odota ennen kuin yrität uudelleen.',
# E-mail sending
'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
+'user-mail-no-addy' => 'Yritit lähettää sähköpostia ilman sähköpostiosoitetta.',
# Change password dialog
'resetpass' => 'Muuta salasana',
@@ -791,16 +801,18 @@ Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikai
'resetpass-temp-password' => 'Väliaikainen salasana:',
# Special:PasswordReset
-'passwordreset' => 'Salasanan alustus',
-'passwordreset-text' => 'Saat sähköpostimuistutuksen tunnuksesi tiedoista, kun täytät tämän lomakkeen.',
-'passwordreset-legend' => 'Salasanan vaihto',
-'passwordreset-disabled' => 'Salasanojen alustus ei ole mahdollista tässä wikissä.',
-'passwordreset-pretext' => '{{PLURAL:$1||Kirjoita jokin jäljempänä pyydetty tieto}}',
-'passwordreset-username' => 'Käyttäjätunnus',
-'passwordreset-domain' => 'Verkkotunnus',
-'passwordreset-email' => 'Sähköpostiosoite',
-'passwordreset-emailtitle' => 'Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
+'passwordreset' => 'Salasanan alustus',
+'passwordreset-text' => 'Saat sähköpostimuistutuksen tunnuksesi tiedoista, kun täytät tämän lomakkeen.',
+'passwordreset-legend' => 'Salasanan vaihto',
+'passwordreset-disabled' => 'Salasanojen alustus ei ole mahdollista tässä wikissä.',
+'passwordreset-pretext' => '{{PLURAL:$1||Kirjoita jokin jäljempänä pyydetty tieto}}',
+'passwordreset-username' => 'Käyttäjätunnus',
+'passwordreset-domain' => 'Verkkotunnus',
+'passwordreset-capture' => 'Näytä lähetettävä sähköpostiviesti',
+'passwordreset-capture-help' => 'Jos valitset tämän, sähköposti (tilapäisellä salasanalla) näytetään sinulle sekä lähetetään käyttäjälle.',
+'passwordreset-email' => 'Sähköpostiosoite',
+'passwordreset-emailtitle' => 'Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
{{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:
$2
@@ -809,7 +821,7 @@ $2
Sinun kannattaa kirjautua sisään ja valita uusi salasana. Jos joku toinen teki tämän
pyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,
voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
-'passwordreset-emailtext-user' => 'Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
+'passwordreset-emailtext-user' => 'Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
{{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:
$2
@@ -818,9 +830,22 @@ $2
Sinun kannattaa kirjautua sisään ja valita uusi salasana. Jos joku toinen teki tämän
pyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,
voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
-'passwordreset-emailelement' => 'Käyttäjätunnus: $1
+'passwordreset-emailelement' => 'Käyttäjätunnus: $1
Väliaikainen salasana: $2',
-'passwordreset-emailsent' => 'Sähköpostimuistutus on lähetetty.',
+'passwordreset-emailsent' => 'Sähköpostimuistutus on lähetetty.',
+'passwordreset-emailsent-capture' => 'Muistutussähköposti on lähetetty. 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Muuta sähköpostiosoitetta',
+'changeemail-header' => 'Muuta tunnuksen sähköpostiosoite',
+'changeemail-text' => 'Voit vaihtaa sähköpostiosoitteesi täyttämällä tämän lomakkeen. Muutoksen vahvistamiseen tarvitaan myös salasana.',
+'changeemail-no-info' => 'Tämän sivun käyttö edellyttää sisäänkirjautumista.',
+'changeemail-oldemail' => 'Nykyinen sähköpostiosoite',
+'changeemail-newemail' => 'Uusi sähköpostiosoite',
+'changeemail-none' => '(ei asetettu)',
+'changeemail-submit' => 'Muuta sähköpostiosoite',
+'changeemail-cancel' => 'Peruuta',
# Edit page toolbar
'bold_sample' => 'Lihavoitu teksti',
@@ -890,9 +915,6 @@ Huomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} ka
IP-osoitteesi on $3 ja estotunnus on #$5.
Liitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
'blockednoreason' => '(syytä ei annettu)',
-'blockedoriginalsource' => 'Sivun â€$1†lähdekoodi:',
-'blockededitsource' => 'Muokkauksesi sivuun â€$1â€:',
-'whitelistedittitle' => 'Sisäänkirjautuminen vaaditaan muokkaamiseen',
'whitelistedittext' => 'Sinun täytyy $1, jotta voisit muokata sivuja.',
'confirmedittext' => 'Et voi muokata sivuja, ennen kuin olet varmentanut sähköpostiosoitteesi. Voit tehdä varmennuksen [[Special:Preferences|asetussivulla]].',
'nosuchsectiontitle' => 'Pyydettyä osiota ei ole',
@@ -1125,8 +1147,6 @@ Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti lukea piilote
'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versiolta',
'revdelete-log' => 'Syy',
'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
-'revdelete-logentry' => 'muutti sivun [[$1]] version näkyvyyttä',
-'logdelete-logentry' => 'muutti sivun [[$1]] näkyvyyttä',
'revdelete-success' => "'''Version näkyvyys päivitetty.'''",
'revdelete-failure' => "'''Version näkyvyyttä ei voitu päivittää:'''
$1",
@@ -1138,15 +1158,6 @@ $1",
'revdel-restore-visible' => 'näkyvät muutokset',
'pagehist' => 'Sivun muutoshistoria',
'deletedhist' => 'Poistettujen versioiden historia',
-'revdelete-content' => 'sisällön',
-'revdelete-summary' => 'yhteenvedon',
-'revdelete-uname' => 'käyttäjänimen',
-'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
-'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
-'revdelete-hid' => 'piilotti $1',
-'revdelete-unhid' => 'palautti näkyviin $1',
-'revdelete-log-message' => '$1 koskien $2 {{PLURAL:$2|versiota}}',
-'logdelete-log-message' => '$1 koskien $2 {{PLURAL:$2|tapahtumaa}}',
'revdelete-hide-current' => 'Virhe tapahtui $2, $1 päivätyn kohteen piilottamisessa: tämä on nykyinen versio. Sitä ei voi piilottaa.',
'revdelete-show-no-access' => 'Virhe näyttäessä kohtaa $2 kello $1: kohta on merkitty â€rajoitetuksiâ€.
Sinulla ei ole oikeutta siihen.',
@@ -1301,12 +1312,14 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
'prefs-rc' => 'Tuoreet muutokset',
'prefs-watchlist' => 'Tarkkailulista',
'prefs-watchlist-days' => 'Tarkkailulistan ajanjakso',
-'prefs-watchlist-days-max' => 'Enintään 7 päivää',
+'prefs-watchlist-days-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
'prefs-watchlist-edits' => 'Tarkkailulistalla näytettävien muokkausten määrä',
'prefs-watchlist-edits-max' => 'Enintään 1000',
'prefs-watchlist-token' => 'Tarkkailulistan avain',
'prefs-misc' => 'Muut',
'prefs-resetpass' => 'Muuta salasana',
+'prefs-changeemail' => 'Muuta sähköpostiosoite',
+'prefs-setemail' => 'Aseta sähköpostiosoite',
'prefs-email' => 'Sähköpostiasetukset',
'prefs-rendering' => 'Ulkoasu',
'saveprefs' => 'Tallenna asetukset',
@@ -1365,6 +1378,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'yourrealname' => 'Oikea nimi',
'yourlanguage' => 'Käyttöliittymän kieli',
'yourvariant' => 'Sisällön kielivariantti',
+'prefs-help-variant' => 'Valitse se variantti tai ortografia, jolla haluat näyttää tämän wikin sisällön.',
'yournick' => 'Allekirjoitus',
'prefs-help-signature' => 'Kommentit keskustelusivuilla allekirjoitetaan merkinnällä <nowiki>~~~~</nowiki>, joka muuntuu allekirjoitukseksi ja aikaleimaksi.',
'badsig' => 'Allekirjoitus ei kelpaa.',
@@ -1403,7 +1417,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'userrights-lookup-user' => 'Käyttöoikeuksien hallinta',
'userrights-user-editname' => 'Käyttäjätunnus',
'editusergroup' => 'Muokkaa käyttäjän ryhmiä',
-'editinguser' => "Käyttäjän '''[[User:$1|$1]]''' oikeudet ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Käyttäjän '''[[User:$1|$1]]''' oikeudet $2",
'userrights-editusergroup' => 'Käyttäjän ryhmät',
'saveusergroups' => 'Tallenna',
'userrights-groupsmember' => 'Käyttäjä on jäsenenä ryhmissä',
@@ -1497,13 +1511,13 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'right-autopatrol' => 'Muokkaukset aina valmiiksi tarkastetuksi merkittyjä',
'right-patrolmarks' => 'Nähdä tarkastusmerkit tuoreissa muutoksissa',
'right-unwatchedpages' => 'Tarkastella listaa tarkkailemattomista sivuista',
-'right-trackback' => 'Lähettää trackback',
'right-mergehistory' => 'Yhdistää sivujen historioita',
'right-userrights' => 'Muuttaa kaikkia käyttäjäoikeuksia',
'right-userrights-interwiki' => 'Muokata käyttäjien oikeuksia muissa wikeissä',
'right-siteadmin' => 'Lukita tietokanta',
'right-override-export-depth' => 'Viedä sivuja sisältäen viitatut sivut viiden syvyydellä',
'right-sendemail' => 'Lähettää sähköpostia muille käyttäjille',
+'right-passwordreset' => 'Tarkastella salasanan alustusviestejä',
# User rights log
'rightslog' => 'Käyttöoikeusloki',
@@ -1537,16 +1551,17 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'action-suppressionlog' => 'tarkastella tätä yksityislokia',
'action-block' => 'estää tätä käyttäjää muokkaamasta',
'action-protect' => 'muuttaa tämän sivun suojaustasoa',
+'action-rollback' => 'käyttää nopeaa palautusta kumoamaan viimeisen käyttäjän viimeiset muutokset sivuun',
'action-import' => 'tuoda tätä sivua toisesta wikistä',
'action-importupload' => 'tuoda tätä sivua tiedostosta',
'action-patrol' => 'merkitä muiden muokkauksia tarkastetuiksi',
'action-autopatrol' => 'saada muokkaukset automaattisesti tarkastetuiksi',
'action-unwatchedpages' => 'tarkastella tarkkailemattomien sivujen listaa',
-'action-trackback' => 'lähettää trackbackia',
'action-mergehistory' => 'yhdistää tämän sivun historiaa',
'action-userrights' => 'muokata kaikkia käyttöoikeuksia',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|muutos|muutosta}}',
@@ -1578,6 +1593,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|tarkkaileva käyttäjä|tarkkailevaa käyttäjää}}]',
'rc_categories' => 'Vain luokista (erotin on â€|â€)',
'rc_categories_any' => 'Mikä tahansa',
+'rc-change-size-new' => '$1 {{PLURAL:$1|tavu|tavua}} muutosten jälkeen',
'newsectionsummary' => '/* $1 */ uusi osio',
'rc-enhanced-expand' => 'Näytä yksityiskohdat (JavaScript)',
'rc-enhanced-hide' => 'Piilota yksityiskohdat',
@@ -1628,6 +1644,7 @@ Voit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:
'ignorewarnings' => 'Ohita kaikki varoitukset',
'minlength1' => 'Tiedoston nimessä pitää olla vähintään yksi merkki.',
'illegalfilename' => "Tiedoston nimessä '''$1''' on merkkejä, joita ei sallita sivujen nimissä. Vaihda tiedoston nimeä, ja yritä lähettämistä uudelleen.",
+'filename-toolong' => 'Tiedostonimen sallittu enimmäispituus on 240 merkkiä.',
'badfilename' => 'Tiedoston nimi vaihdettiin: $1.',
'filetype-mime-mismatch' => 'Tiedostopääte <tt>.$1</tt> ei vastaa havaittua tiedoston MIME-tyyppiä (<tt>$2</tt>).',
'filetype-badmime' => '<tt>$1</tt> -tyypisten tiedostojen tallennus on kielletty.',
@@ -1727,6 +1744,35 @@ $1',
'upload-unknown-size' => 'Tuntematon koko',
'upload-http-error' => 'HTTP-virhe: $1',
+# File backend
+'backend-fail-stream' => 'Tiedoston $1 virtauttaminen epäonnistui.',
+'backend-fail-backup' => 'Tiedostoa $1 ei voitu varmuuskopioida.',
+'backend-fail-notexists' => 'Tiedostoa $1 ei ole olemassa.',
+'backend-fail-hashes' => 'Tiedostojen tarkisteita ei voitu käyttää.',
+'backend-fail-notsame' => 'Epäidenttinen tiedosto on jo olemassa sijainnissa $1.',
+'backend-fail-invalidpath' => '$1 ei ole sallittu tallennuspolku.',
+'backend-fail-delete' => 'Tiedostoa $1 ei voitu poistaa.',
+'backend-fail-alreadyexists' => 'Tiedosto $1 on jo olemassa.',
+'backend-fail-store' => 'Tiedostoa $1 ei voitu tallentaa polkuun $2.',
+'backend-fail-copy' => 'Tiedostoa ei voitu kopioida kohteesta $1 kohteeseen $2.',
+'backend-fail-move' => 'Tiedostoa ei voitu siirtää kohteesta $1 kohteeseen $2.',
+'backend-fail-opentemp' => 'Väliaikaista tiedostoa ei voitu avata.',
+'backend-fail-writetemp' => 'Väliaikaiseen tiedostoon ei voitu kirjoittaa.',
+'backend-fail-closetemp' => 'Väliaikaista tiedostoa ei voitu sulkea.',
+'backend-fail-read' => 'Tiedostoa $1 ei voitu lukea.',
+'backend-fail-create' => 'Tiedostoa $1 ei voitu luoda.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kohteen $1 lukitusta ei voitu poistaa, koska se ei ole lukittu.',
+'lockmanager-fail-closelock' => 'Tiedoston $1 lukkotiedostoa ei voitu sulkea.',
+'lockmanager-fail-deletelock' => 'Tiedoston $1 lukkotiedostoa ei voitu poistaa.',
+'lockmanager-fail-acquirelock' => 'Tiedostopolulle "$1" ei voitu luoda suojausta.',
+'lockmanager-fail-openlock' => 'Tiedoston $1 lukkotiedostoa ei voitu avata.',
+'lockmanager-fail-releaselock' => 'Tiedoston $1 lukituksen avaaminen epäonnistui.',
+'lockmanager-fail-db-bucket' => 'Ei voitu yhdistää riittävästi tietokantoja kohdassa $1.',
+'lockmanager-fail-db-release' => 'Lukitusten vapauttaminen epäonnistui tietokannassa $1.',
+'lockmanager-fail-svr-release' => 'Lukitusten vapauttaminen epäonnistui palvelimella $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Tiedostossa havaittiin virhe, kun se avattiin ZIP-tarkastuksia varten.',
'zip-wrong-format' => 'Määritetty tiedosto ei ole ZIP-tiedosto.',
@@ -1743,6 +1789,7 @@ Sitä ei voida tarkistaa tietoturvan varalta kunnolla.',
'uploadstash-badtoken' => 'Toiminnon suoritus epäonnistui. Tähän voi olla syynä muokkausvaltuuksien vanhentuminen. Yritä uudelleen.',
'uploadstash-errclear' => 'Muistin tyhjennys epäonnistui.',
'uploadstash-refresh' => 'Päivitä tiedostoluettelo',
+'invalid-chunk-offset' => 'Kelpaamaton siirtymä lohkoissa',
# img_auth script messages
'img-auth-accessdenied' => 'Pääsy estetty',
@@ -1848,23 +1895,24 @@ Tiedot [$2 tiedoston kuvaussivulta] näkyvät alla.',
'filerevert-badversion' => 'Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.',
# File deletion
-'filedelete' => 'Tiedoston $1 poisto',
-'filedelete-legend' => 'Tiedoston poisto',
-'filedelete-intro' => "Olet poistamassa tiedostoa '''[[Media:$1|$1]]''' ja kaiken sen historian.",
-'filedelete-intro-old' => '<span class="plainlinks">Olet poistamassa tiedoston \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3 kello $2 luotua versiota].</span>',
-'filedelete-comment' => 'Syy',
-'filedelete-submit' => 'Poista',
-'filedelete-success' => "Tiedosto '''$1''' on poistettu.",
-'filedelete-success-old' => "Tiedoston '''[[Media:$1|$1]]''' $3 kello $2 luotu versio on poistettu.",
-'filedelete-nofile' => "Tiedostoa '''$1''' ei ole.",
-'filedelete-nofile-old' => "Tiedostosta '''$1''' ei ole olemassa pyydettyä versiota.",
-'filedelete-otherreason' => 'Muu syy tai tarkennus',
-'filedelete-reason-otherlist' => 'Muu syy',
-'filedelete-reason-dropdown' => '*Yleiset poistosyyt
+'filedelete' => 'Tiedoston $1 poisto',
+'filedelete-legend' => 'Tiedoston poisto',
+'filedelete-intro' => "Olet poistamassa tiedostoa '''[[Media:$1|$1]]''' ja kaiken sen historian.",
+'filedelete-intro-old' => '<span class="plainlinks">Olet poistamassa tiedoston \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3 kello $2 luotua versiota].</span>',
+'filedelete-comment' => 'Syy',
+'filedelete-submit' => 'Poista',
+'filedelete-success' => "Tiedosto '''$1''' on poistettu.",
+'filedelete-success-old' => "Tiedoston '''[[Media:$1|$1]]''' $3 kello $2 luotu versio on poistettu.",
+'filedelete-nofile' => "Tiedostoa '''$1''' ei ole.",
+'filedelete-nofile-old' => "Tiedostosta '''$1''' ei ole olemassa pyydettyä versiota.",
+'filedelete-otherreason' => 'Muu syy tai tarkennus',
+'filedelete-reason-otherlist' => 'Muu syy',
+'filedelete-reason-dropdown' => '*Yleiset poistosyyt
** Kaksoiskappale
** Tekijänoikeusrikkomus',
-'filedelete-edit-reasonlist' => 'Muokkaa poistosyitä',
-'filedelete-maintenance' => 'Tiedostojen poisto ja palautus on väliaikaisesti poistettu käytöstä huoltotoimien vuoksi.',
+'filedelete-edit-reasonlist' => 'Muokkaa poistosyitä',
+'filedelete-maintenance' => 'Tiedostojen poisto ja palautus on väliaikaisesti poistettu käytöstä huoltotoimien vuoksi.',
+'filedelete-maintenance-title' => 'Tiedostoa ei voi poistaa',
# MIME search
'mimesearch' => 'MIME-haku',
@@ -1967,6 +2015,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
'mostimages' => 'Viitatuimmat tiedostot',
'mostrevisions' => 'Muokatuimmat sivut',
'prefixindex' => 'Kaikki sivut katkaisuhaulla',
+'prefixindex-namespace' => 'Kaikki sivut etuliitteellä (nimiavaruus $1)',
'shortpages' => 'Lyhyet sivut',
'longpages' => 'Pitkät sivut',
'deadendpages' => 'Sivut, joilla ei ole linkkejä',
@@ -2077,12 +2126,8 @@ Tuetut protokollat: <tt>$1</tt> (älä lisää näitä hakuusi).',
'activeusers-noresult' => 'Käyttäjiä ei löytynyt.',
# Special:Log/newusers
-'newuserlogpage' => 'Uudet käyttäjät',
-'newuserlogpagetext' => 'Tämä on loki luoduista käyttäjätunnuksista.',
-'newuserlog-byemail' => 'salasana lähetetty sähköpostitse',
-'newuserlog-create-entry' => 'Uusi käyttäjä',
-'newuserlog-create2-entry' => 'loi uuden käyttäjätunnuksen $1',
-'newuserlog-autocreate-entry' => 'Automaattisesti luotu käyttäjätunnus',
+'newuserlogpage' => 'Uudet käyttäjät',
+'newuserlogpagetext' => 'Tämä on loki luoduista käyttäjätunnuksista.',
# Special:ListGroupRights
'listgrouprights' => 'Käyttäjäryhmien oikeudet',
@@ -2110,7 +2155,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
'emailpage' => 'Lähetä sähköpostia käyttäjälle',
'emailpagetext' => 'Jos tämä käyttäjä on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.',
'usermailererror' => 'Postitus palautti virheen:',
-'defemailsubject' => 'Sähköpostia sivustolta {{SITENAME}}',
+'defemailsubject' => 'Sähköpostia käyttäjältä $1 sivustolta {{SITENAME}}',
'usermaildisabled' => 'Käyttäjien sähköposti poistettu käytöstä',
'usermaildisabledtext' => 'Et voi lähettää sähköpostia muille käyttäjille tässä wikissä',
'noemailtitle' => 'Ei sähköpostiosoitetta',
@@ -2163,7 +2208,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
'iteminvalidname' => 'Sivun $1 kanssa oli ongelmia! Sivun nimessä on vikaa.',
-'wlnote' => "Alla on '''$1''' {{PLURAL:$1|muutos|muutosta}} viimeisen {{PLURAL:$2||'''$2'''}} tunnin ajalta.",
+'wlnote' => "Alla on {{PLURAL:$1|yksi muutos|'''$1''' muutosta}} viimeisen {{PLURAL:$2|tunnin|'''$2''' tunnin}} ajalta $3 kello $4 asti.",
'wlshowlast' => 'Näytä viimeiset $1 tuntia tai $2 päivää$3',
'watchlist-options' => 'Tarkkailulistan asetukset',
@@ -2226,8 +2271,6 @@ Palaute ja lisäapu osoitteessa:
'actionfailed' => 'Toiminto epäonnistui',
'deletedtext' => 'â€$1†on poistettu.
Sivulla $2 on lista viimeaikaisista poistoista.',
-'deletedarticle' => 'poisti sivun [[$1]]',
-'suppressedarticle' => 'häivytti sivun [[$1]]',
'dellogpage' => 'Poistoloki',
'dellogpagetext' => 'Alla on loki viimeisimmistä poistoista.',
'deletionlog' => 'poistoloki',
@@ -2269,7 +2312,10 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
'unprotectedarticle' => 'poisti suojauksen sivulta [[$1]]',
'movedarticleprotection' => 'siirsi suojausasetukset sivulta [[$2]] sivulle [[$1]]',
'protect-title' => 'Sivun $1 suojaus',
+'protect-title-notallowed' => 'Sivun $1 suojaustaso',
'prot_1movedto2' => 'siirsi sivun [[$1]] uudelle nimelle [[$2]]',
+'protect-badnamespace-title' => 'Nimiavaruus ei suojattavissa',
+'protect-badnamespace-text' => 'Tämän nimiavaruuden sivuja ei voi suojata.',
'protect-legend' => 'Suojaukset',
'protectcomment' => 'Syy',
'protectexpiry' => 'Vanhenee',
@@ -2287,6 +2333,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
'protect-level-sysop' => 'Vain ylläpitäjät',
'protect-summary-cascade' => 'laajennettu',
'protect-expiring' => 'vanhenee $1',
+'protect-expiring-local' => 'vanhentuu $1',
'protect-expiry-indefinite' => 'ikuinen',
'protect-cascade' => 'Laajenna suojaus koskemaan kaikkia tähän sivuun sisällytettyjä sivuja.',
'protect-cantedit' => 'Et voi muuttaa sivun suojaustasoa, koska sinulla ei ole oikeutta muokata sivua.',
@@ -2341,7 +2388,6 @@ Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valinta
'undeletereset' => 'Tyhjennä',
'undeleteinvert' => 'Käänteinen valinta',
'undeletecomment' => 'Syy',
-'undeletedarticle' => 'palautti sivun [[$1]]',
'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
@@ -2350,6 +2396,7 @@ Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valinta
[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
'undelete-header' => '[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.',
+'undelete-search-title' => 'Etsi poistettuja sivuja',
'undelete-search-box' => 'Etsi poistettuja sivuja',
'undelete-search-prefix' => 'Näytä sivut, jotka alkavat merkkijonolla:',
'undelete-search-submit' => 'Hae',
@@ -2358,6 +2405,7 @@ Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valinta
'undelete-bad-store-key' => 'Tiedoston version, jonka aikaleima on $1 palauttaminen epäonnistui, koska tiedostoa ei ollut ennen poistoa.',
'undelete-cleanup-error' => 'Käyttämättömän arkistotiedoston $1 poistaminen epäonnistui.',
'undelete-missing-filearchive' => 'Tiedostoarkiston tunnuksen $1 hakeminen epäonnistui. Tiedosto on saatettu jo palauttaa.',
+'undelete-error' => 'Sivun palauttaminen epäonnistui',
'undelete-error-short' => 'Tiedoston $1 palauttaminen epäonnistui',
'undelete-error-long' => 'Tiedoston palauttaminen epäonnistui:
@@ -2476,6 +2524,7 @@ Nykyiset estot löytyvät [[Special:BlockList|estolistalta]].',
'blocklist-userblocks' => 'Piilota tunnusten estot',
'blocklist-tempblocks' => 'Piilota väliaikaiset estot',
'blocklist-addressblocks' => 'Piilota yksittäiset IP-estot',
+'blocklist-rangeblocks' => 'Piilota ryhmäestot',
'blocklist-timestamp' => 'Päiväys',
'blocklist-target' => 'Kohde',
'blocklist-expiry' => 'Vanhenee',
@@ -2498,6 +2547,7 @@ Nykyiset estot löytyvät [[Special:BlockList|estolistalta]].',
'unblocklink' => 'poista esto',
'change-blocklink' => 'muuta estoa',
'contribslink' => 'muokkaukset',
+'emaillink' => 'lähetä sähköpostia',
'autoblocker' => 'Olet automaattisesti estetty, koska jaat IP-osoitteen käyttäjän [[User:$1|$1]] kanssa. Eston syy: $2.',
'blocklogpage' => 'Estoloki',
'blocklog-showlog' => 'Tämä käyttäjä on ollut estettynä.
@@ -2610,9 +2660,6 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.",
'movepage-page-unmoved' => 'Sivua $1 ei voitu siirtää nimelle $2.',
'movepage-max-pages' => 'Enimmäismäärä sivuja on siirretty, eikä enempää siirretä enää automaattisesti.
$1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
-'1movedto2' => 'siirsi sivun [[$1]] uudelle nimelle [[$2]]',
-'1movedto2_redir' => 'siirsi sivun [[$1]] ohjauksen [[$2]] päälle',
-'move-redirect-suppressed' => 'ei ohjausta',
'movelogpage' => 'Siirtoloki',
'movelogpagetext' => 'Tämä on loki siirretyistä sivuista.',
'movesubpage' => '{{PLURAL:$1|Alasivu|Alasivut}}',
@@ -2623,7 +2670,7 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
'delete_and_move' => 'Poista kohdesivu ja siirrä',
'delete_and_move_text' => 'Kohdesivu [[:$1]] on jo olemassa. Haluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?',
'delete_and_move_confirm' => 'Poista sivu',
-'delete_and_move_reason' => 'Sivu on siirron tiellä.',
+'delete_and_move_reason' => 'Sivu on sivun [[$1]] siirron tiellä.',
'selfmove' => 'Lähde- ja kohdenimi ovat samat.',
'immobile-source-namespace' => 'Sivuja ei voi siirtää nimiavaruudessa â€$1â€',
'immobile-target-namespace' => 'Sivuja ei voi siirtää nimiavaruuteen â€$1â€',
@@ -2654,9 +2701,11 @@ Syötä sivujen otsikoita jokainen omalle rivilleen alla olevaan laatikkoon.
Valitse myös, haluatko kaikki versiot sivuista, vai ainoastaan nykyisen version.
Jälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun [[{{MediaWiki:Mainpage}}]] saa vietyä linkistä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Vie kaikki sivut',
'exportcuronly' => 'Liitä mukaan ainoastaan uusin versio – ei koko historiaa.',
'exportnohistory' => '----
Sivujen koko historian vienti on estetty suorituskykysyistä.',
+'exportlistauthors' => 'Lisää lista jokaisen sivun muokkaajista',
'export-submit' => 'Vie',
'export-addcattext' => 'Lisää sivut luokasta',
'export-addcat' => 'Lisää',
@@ -2689,6 +2738,8 @@ Jos haluat muokata MediaWikin yleistä kotoistusta, käy [//www.mediawiki.org/wi
'thumbnail_error' => 'Pienoiskuvan luominen epäonnistui: $1',
'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',
+'thumbnail-dest-create' => 'Esikatselukuvaa ei voitu tallentaa kohteeseen',
'thumbnail_invalid_params' => 'Virheelliset parametrit pienoiskuvalle',
'thumbnail_dest_directory' => 'Kohdehakemiston luominen ei onnistunut',
'thumbnail_image-type' => 'Kuvamuoto ei ole tuettu',
@@ -2731,6 +2782,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'import-upload' => 'Tallenna XML-tiedosto',
'import-token-mismatch' => 'Istuntotiedot ovat kadonneet. Yritä uudelleen.',
'import-invalid-interwiki' => 'Määritellystä wikistä ei voi tuoda.',
+'import-error-edit' => 'Sivua $1 ei tuotu, koska sinulla ei ole oikeutta muokata sitä.',
+'import-error-create' => 'Sivua $1 ei tuotu, koska sinulla ei ole oikeutta luoda sitä.',
# Import log
'importlogpage' => 'Tuontiloki',
@@ -2740,72 +2793,84 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'import-logentry-interwiki' => 'toi toisesta wikistä sivun $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|yksi versio|$1 versiota}} wikistä $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScriptin testaus',
+'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä.',
+'javascripttest-title' => 'Suoritetaan $1-testejä.',
+'javascripttest-pagetext-noframework' => 'Tämä sivu on varattu JavaScript-testien suorittamiseen.',
+'javascripttest-pagetext-unknownframework' => 'Tuntematon testausalusta $1.',
+'javascripttest-pagetext-frameworks' => 'Valitse yksi seuraavista testausalustoista: $1',
+'javascripttest-pagetext-skins' => 'Valitse testauksessa käytettävä ulkoasu',
+'javascripttest-qunit-intro' => 'Katso [$1 testausohjeet] mediawiki.orgissa.',
+'javascripttest-qunit-heading' => 'MediaWikin JavaScriptin QUnit-testikokoelma',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Oma käyttäjäsivu',
-'tooltip-pt-anonuserpage' => 'IP-osoitteesi käyttäjäsivu',
-'tooltip-pt-mytalk' => 'Oma keskustelusivu',
-'tooltip-pt-anontalk' => 'Keskustelu tämän IP-osoitteen muokkauksista',
-'tooltip-pt-preferences' => 'Omat asetukset',
-'tooltip-pt-watchlist' => 'Lista sivuista, joiden muokkauksia tarkkailet',
-'tooltip-pt-mycontris' => 'Lista omista muokkauksista',
-'tooltip-pt-login' => 'Kirjaudu sisään tai luo tunnus',
-'tooltip-pt-anonlogin' => 'Kirjaudu sisään tai luo tunnus',
-'tooltip-pt-logout' => 'Kirjaudu ulos',
-'tooltip-ca-talk' => 'Keskustele sisällöstä',
-'tooltip-ca-edit' => 'Muokkaa tätä sivua',
-'tooltip-ca-addsection' => 'Aloita keskustelu uudesta aiheesta',
-'tooltip-ca-viewsource' => 'Näytä sivun lähdekoodi',
-'tooltip-ca-history' => 'Sivun aikaisemmat versiot',
-'tooltip-ca-protect' => 'Suojaa tämä sivu',
-'tooltip-ca-unprotect' => 'Muuta tämän sivun suojauksia',
-'tooltip-ca-delete' => 'Poista tämä sivu',
-'tooltip-ca-undelete' => 'Palauta tämä sivu',
-'tooltip-ca-move' => 'Siirrä tämä sivu',
-'tooltip-ca-watch' => 'Lisää tämä sivu tarkkailulistallesi',
-'tooltip-ca-unwatch' => 'Poista tämä sivu tarkkailulistaltasi',
-'tooltip-search' => 'Etsi {{GRAMMAR:elative|{{SITENAME}}}}',
-'tooltip-search-go' => 'Siirry sivulle, joka on tarkalleen tällä nimellä',
-'tooltip-search-fulltext' => 'Etsi sivuilta tätä tekstiä',
-'tooltip-p-logo' => 'Etusivu',
-'tooltip-n-mainpage' => 'Siirry etusivulle',
-'tooltip-n-mainpage-description' => 'Siirry etusivulle',
-'tooltip-n-portal' => 'Keskustelua projektista',
-'tooltip-n-currentevents' => 'Taustatietoa tämänhetkisistä tapahtumista',
-'tooltip-n-recentchanges' => 'Lista tuoreista muutoksista',
-'tooltip-n-randompage' => 'Avaa satunnainen sivu',
-'tooltip-n-help' => 'Ohjeita',
-'tooltip-t-whatlinkshere' => 'Lista sivuista, jotka viittaavat tänne',
-'tooltip-t-recentchangeslinked' => 'Viimeisimmät muokkaukset sivuissa, joille viitataan tältä sivulta',
-'tooltip-feed-rss' => 'RSS-syöte tälle sivulle',
-'tooltip-feed-atom' => 'Atom-syöte tälle sivulle',
-'tooltip-t-contributions' => 'Näytä lista tämän käyttäjän muokkauksista',
-'tooltip-t-emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
-'tooltip-t-upload' => 'Tallenna tiedostoja',
-'tooltip-t-specialpages' => 'Näytä toimintosivut',
-'tooltip-t-print' => 'Tulostettava versio',
-'tooltip-t-permalink' => 'Ikilinkki sivun tähän versioon',
-'tooltip-ca-nstab-main' => 'Näytä sisältösivu',
-'tooltip-ca-nstab-user' => 'Näytä käyttäjäsivu',
-'tooltip-ca-nstab-media' => 'Näytä mediasivu',
-'tooltip-ca-nstab-special' => 'Tämä on toimintosivu',
-'tooltip-ca-nstab-project' => 'Näytä projektisivu',
-'tooltip-ca-nstab-image' => 'Näytä tiedostosivu',
-'tooltip-ca-nstab-mediawiki' => 'Näytä järjestelmäviesti',
-'tooltip-ca-nstab-template' => 'Näytä malline',
-'tooltip-ca-nstab-help' => 'Näytä ohjesivu',
-'tooltip-ca-nstab-category' => 'Näytä luokkasivu',
-'tooltip-minoredit' => 'Merkitse tämä pieneksi muutokseksi',
-'tooltip-save' => 'Tallenna muokkaukset',
-'tooltip-preview' => 'Esikatsele muokkausta ennen tallennusta',
-'tooltip-diff' => 'Näytä tehdyt muutokset',
-'tooltip-compareselectedversions' => 'Vertaile valittuja versioita',
-'tooltip-watch' => 'Lisää tämä sivu tarkkailulistaan',
-'tooltip-recreate' => 'Luo sivu uudelleen',
-'tooltip-upload' => 'Aloita tallennus',
-'tooltip-rollback' => 'Palauttaminen kumoaa viimeisimmän muokkaajan yhden tai useamman muutoksen yhdellä kertaa.',
-'tooltip-undo' => 'Kumoaminen palauttaa tämän muutoksen ja avaa artikkelin esikatselussa. Yhteenvetokenttään voi kirjoittaa palautuksen syyn.',
-'tooltip-preferences-save' => 'Tallenna asetukset',
-'tooltip-summary' => 'Kirjoita lyhyt yhteenveto',
+'tooltip-pt-userpage' => 'Oma käyttäjäsivu',
+'tooltip-pt-anonuserpage' => 'IP-osoitteesi käyttäjäsivu',
+'tooltip-pt-mytalk' => 'Oma keskustelusivu',
+'tooltip-pt-anontalk' => 'Keskustelu tämän IP-osoitteen muokkauksista',
+'tooltip-pt-preferences' => 'Omat asetukset',
+'tooltip-pt-watchlist' => 'Lista sivuista, joiden muokkauksia tarkkailet',
+'tooltip-pt-mycontris' => 'Lista omista muokkauksista',
+'tooltip-pt-login' => 'Kirjaudu sisään tai luo tunnus',
+'tooltip-pt-anonlogin' => 'Kirjaudu sisään tai luo tunnus',
+'tooltip-pt-logout' => 'Kirjaudu ulos',
+'tooltip-ca-talk' => 'Keskustele sisällöstä',
+'tooltip-ca-edit' => 'Muokkaa tätä sivua',
+'tooltip-ca-addsection' => 'Aloita keskustelu uudesta aiheesta',
+'tooltip-ca-viewsource' => 'Näytä sivun lähdekoodi',
+'tooltip-ca-history' => 'Sivun aikaisemmat versiot',
+'tooltip-ca-protect' => 'Suojaa tämä sivu',
+'tooltip-ca-unprotect' => 'Muuta tämän sivun suojauksia',
+'tooltip-ca-delete' => 'Poista tämä sivu',
+'tooltip-ca-undelete' => 'Palauta tämä sivu',
+'tooltip-ca-move' => 'Siirrä tämä sivu',
+'tooltip-ca-watch' => 'Lisää tämä sivu tarkkailulistallesi',
+'tooltip-ca-unwatch' => 'Poista tämä sivu tarkkailulistaltasi',
+'tooltip-search' => 'Etsi {{GRAMMAR:elative|{{SITENAME}}}}',
+'tooltip-search-go' => 'Siirry sivulle, joka on tarkalleen tällä nimellä',
+'tooltip-search-fulltext' => 'Etsi sivuilta tätä tekstiä',
+'tooltip-p-logo' => 'Etusivu',
+'tooltip-n-mainpage' => 'Siirry etusivulle',
+'tooltip-n-mainpage-description' => 'Siirry etusivulle',
+'tooltip-n-portal' => 'Keskustelua projektista',
+'tooltip-n-currentevents' => 'Taustatietoa tämänhetkisistä tapahtumista',
+'tooltip-n-recentchanges' => 'Lista tuoreista muutoksista',
+'tooltip-n-randompage' => 'Avaa satunnainen sivu',
+'tooltip-n-help' => 'Ohjeita',
+'tooltip-t-whatlinkshere' => 'Lista sivuista, jotka viittaavat tänne',
+'tooltip-t-recentchangeslinked' => 'Viimeisimmät muokkaukset sivuissa, joille viitataan tältä sivulta',
+'tooltip-feed-rss' => 'RSS-syöte tälle sivulle',
+'tooltip-feed-atom' => 'Atom-syöte tälle sivulle',
+'tooltip-t-contributions' => 'Näytä lista tämän käyttäjän muokkauksista',
+'tooltip-t-emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
+'tooltip-t-upload' => 'Tallenna tiedostoja',
+'tooltip-t-specialpages' => 'Näytä toimintosivut',
+'tooltip-t-print' => 'Tulostettava versio',
+'tooltip-t-permalink' => 'Ikilinkki sivun tähän versioon',
+'tooltip-ca-nstab-main' => 'Näytä sisältösivu',
+'tooltip-ca-nstab-user' => 'Näytä käyttäjäsivu',
+'tooltip-ca-nstab-media' => 'Näytä mediasivu',
+'tooltip-ca-nstab-special' => 'Tämä on toimintosivu',
+'tooltip-ca-nstab-project' => 'Näytä projektisivu',
+'tooltip-ca-nstab-image' => 'Näytä tiedostosivu',
+'tooltip-ca-nstab-mediawiki' => 'Näytä järjestelmäviesti',
+'tooltip-ca-nstab-template' => 'Näytä malline',
+'tooltip-ca-nstab-help' => 'Näytä ohjesivu',
+'tooltip-ca-nstab-category' => 'Näytä luokkasivu',
+'tooltip-minoredit' => 'Merkitse tämä pieneksi muutokseksi',
+'tooltip-save' => 'Tallenna muokkaukset',
+'tooltip-preview' => 'Esikatsele muokkausta ennen tallennusta',
+'tooltip-diff' => 'Näytä tehdyt muutokset',
+'tooltip-compareselectedversions' => 'Vertaile valittuja versioita',
+'tooltip-watch' => 'Lisää tämä sivu tarkkailulistaan',
+'tooltip-watchlistedit-raw-submit' => 'Päivitä tarkkailulista',
+'tooltip-recreate' => 'Luo sivu uudelleen',
+'tooltip-upload' => 'Aloita tallennus',
+'tooltip-rollback' => 'Palauttaminen kumoaa viimeisimmän muokkaajan yhden tai useamman muutoksen yhdellä kertaa.',
+'tooltip-undo' => 'Kumoaminen palauttaa tämän muutoksen ja avaa artikkelin esikatselussa. Yhteenvetokenttään voi kirjoittaa palautuksen syyn.',
+'tooltip-preferences-save' => 'Tallenna asetukset',
+'tooltip-summary' => 'Kirjoita lyhyt yhteenveto',
# Stylesheets
'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
@@ -2901,9 +2966,6 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
# Patrol log
'patrol-log-page' => 'Muutostentarkastusloki',
'patrol-log-header' => 'Tämä on loki tarkastetuista muutoksista.',
-'patrol-log-line' => 'merkitsi sivun $2 muutoksen $1 tarkastetuksi $3',
-'patrol-log-auto' => '(automaattinen)',
-'patrol-log-diff' => 'versio $1',
'log-show-hide-patrol' => '$1 muutostentarkastusloki',
# Image deletion
@@ -2930,11 +2992,11 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
'file-info' => '$1, MIME-tyyppi: $2',
'file-info-size' => '$1 × $2 kuvapistettä, $3, MIME-tyyppi: $4',
'file-info-size-pages' => '$1 × $2 kuvapistettä, tiedoston koko $3, MIME-tyyppi $4, $5 {{PLURAL:$5|sivu|sivua}}',
-'file-nohires' => '<small>Tarkempaa kuvaa ei ole saatavilla.</small>',
+'file-nohires' => 'Tarkempaa kuvaa ei ole saatavilla.',
'svg-long-desc' => 'SVG-tiedosto; oletustarkkuus $1 × $2 kuvapistettä; tiedostokoko $3',
'show-big-image' => 'Korkeatarkkuuksinen versio',
-'show-big-image-preview' => '<small>Tämän esikatselun koko: $1.</small>',
-'show-big-image-other' => '<small>Muut resoluutiot: $1.</small>',
+'show-big-image-preview' => 'Tämän esikatselun koko: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Muu resoluutio|Muut resoluutiot}}: $1.',
'show-big-image-size' => '$1 × $2 kuvapistettä',
'file-info-gif-looped' => 'toistuva',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kehys|kehystä}}',
@@ -2954,6 +3016,13 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
'bydate' => 'päiväyksen mukaan',
'sp-newimages-showfrom' => 'Näytä uudet tiedostot alkaen $1 kello $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunti|$1 sekuntia}}',
+'minutes' => '{{PLURAL:$1|$1 minuutti|$1 minuuttia}}',
+'hours' => '{{PLURAL:$1|$1 tunti|$1 tuntia}}',
+'days' => '{{PLURAL:$1|$1 päivä|$1 päivää}}',
+'ago' => '$1 sitten',
+
# Bad image list
'bad_image_list' => 'Listan muoto on seuraava:
@@ -3440,13 +3509,6 @@ Varmennuskoodi vanhenee $4.',
'scarytranscludefailed' => '[Mallineen hakeminen epäonnistui: $1]',
'scarytranscludetoolong' => '[Verkko-osoite on liian pitkä]',
-# Trackbacks
-'trackbackbox' => 'Sivun trackbackit:<br />
-$1',
-'trackbackremove' => '([$1 poista])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback poistettiin.',
-
# Delete conflict
'deletedwhileediting' => "'''Varoitus''': Tämä sivu on poistettu sen jälkeen, kun aloitit sen muokkaamisen!",
'confirmrecreate' => "Käyttäjä '''[[User:$1|$1]]''' ([[User talk:$1|keskustelu]]) on poistanut sivun sen jälkeen, kun aloit muokata sitä. Syy oli:
@@ -3537,6 +3599,9 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
'watchlisttools-edit' => 'Muokkaa listaa',
'watchlisttools-raw' => 'Lista raakamuodossa',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|keskustelu]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tuntematon laajennuskoodi â€$1â€.',
'duplicate-defaultsort' => "'''Varoitus:''' Oletuslajitteluavain â€$2†korvaa aiemman oletuslajitteluavaimen â€$1â€.",
@@ -3592,8 +3657,7 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'specialpages' => 'Toimintosivut',
'specialpages-note' => '----
* Normaalit toimintosivut.
-* <span class="mw-specialpagerestricted">Rajoitetut toimintosivut.</span>
-* <span class="mw-specialpagecached">Välimuistia käyttävät toimintosivut (saattavat olla vanhentuneita).</span>',
+* <span class="mw-specialpagerestricted">Rajoitetut toimintosivut.</span>',
'specialpages-group-maintenance' => 'Ylläpito',
'specialpages-group-other' => 'Muut',
'specialpages-group-login' => 'Kirjautuminen ja tunnusten luonti',
@@ -3635,13 +3699,16 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'tags-hitcount' => '$1 {{PLURAL:$1|muutos|muutosta}}',
# Special:ComparePages
-'comparepages' => 'Vertaile sivuja',
-'compare-selector' => 'Vertaile sivuversioita',
-'compare-page1' => 'Sivu 1',
-'compare-page2' => 'Sivu 2',
-'compare-rev1' => 'Versio 1',
-'compare-rev2' => 'Versio 2',
-'compare-submit' => 'Vertaile',
+'comparepages' => 'Vertaile sivuja',
+'compare-selector' => 'Vertaile sivuversioita',
+'compare-page1' => 'Sivu 1',
+'compare-page2' => 'Sivu 2',
+'compare-rev1' => 'Versio 1',
+'compare-rev2' => 'Versio 2',
+'compare-submit' => 'Vertaile',
+'compare-invalid-title' => 'Antamasi otsikko on virheellinen.',
+'compare-title-not-exists' => 'Määrittämääsi otsikkoa ei ole.',
+'compare-revision-not-exists' => 'Määrittämääsi muutosta ei ole olemassa.',
# Database error messages
'dberr-header' => 'Wikissä on tietokantaongelma',
@@ -3668,4 +3735,89 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle',
'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle',
+# New logging system
+'logentry-delete-delete' => '$1 poisti sivun $3',
+'logentry-delete-restore' => '$1 palautti sivun $3',
+'logentry-delete-event' => '$1 muutti {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-delete-revision' => '$1 muutti {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
+'logentry-delete-event-legacy' => '$1 muutti kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-delete-revision-legacy' => '$1 muutti sivun $3 muutosten näkyvyyttä',
+'logentry-suppress-delete' => '$1 häivytti sivun $3',
+'logentry-suppress-event' => '$1 muutti salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-suppress-revision' => '$1 muutti salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
+'logentry-suppress-event-legacy' => '$1 muutti salaa kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-suppress-revision-legacy' => '$1 muutti salaa sivun $3 muutosten näkyvyyttä',
+'revdelete-content-hid' => 'sisältö piilotettu',
+'revdelete-summary-hid' => 'muokkausyhteenveto piilotettu',
+'revdelete-uname-hid' => 'käyttäjätunnus piilotettu',
+'revdelete-content-unhid' => 'sisältö palautettu näkyviin',
+'revdelete-summary-unhid' => 'muokkausyhteenveto palautettu näkyviin',
+'revdelete-uname-unhid' => 'käyttäjätunnus palautettu näkyviin',
+'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
+'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
+'logentry-move-move' => '$1 siirsi sivun $3 uudelle nimelle $4',
+'logentry-move-move-noredirect' => '$1 siirsi sivun $3 uudelle nimelle $4 luomatta ohjausta',
+'logentry-move-move_redir' => '$1 siirsi sivun $3 ohjauksen $4 päälle',
+'logentry-move-move_redir-noredirect' => '$1 siirsi sivun $3 ohjauksen $4 päälle luomatta ohjausta',
+'logentry-patrol-patrol' => '$1 merkitsi sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-patrol-patrol-auto' => '$1 merkitsi automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-newusers-newusers' => '$1 loi käyttäjätunnuksen',
+'logentry-newusers-create' => '$1 loi käyttäjätunnuksen',
+'logentry-newusers-create2' => '$1 loi käyttäjätunnuksen $3',
+'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 luotiin automaattisesti',
+'newuserlog-byemail' => 'salasana lähetetty sähköpostitse',
+
+# Feedback
+'feedback-bugornote' => 'Jos voit kuvailla teknisen ongelman tarkasti – [$1 ilmoita ohjelmointivirheestä].
+Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi lisätään sivulle [$3 $2], ja siinä on mukana käyttäjätunnus ja käyttämäsi selain.',
+'feedback-subject' => 'Otsikko',
+'feedback-message' => 'Viesti',
+'feedback-cancel' => 'Peruuta',
+'feedback-submit' => 'Lähetä palaute',
+'feedback-adding' => 'Lisätään palautetta sivulle...',
+'feedback-error1' => 'Virhe: Ohjelmointirajapinnan vastausta ei tunnistettu',
+'feedback-error2' => 'Virhe: Muokkaus epäonnistui',
+'feedback-error3' => 'Virhe: Ohjelmointirajapinta ei vastaa',
+'feedback-thanks' => 'Kiitos. Palautteesi on jätetty sivulle [$2 $1].',
+'feedback-close' => 'Valmis',
+'feedback-bugcheck' => 'Hyvä! Varmista, että ohjelmointivirhe ei vielä löydy [$1 tästä listasta].',
+'feedback-bugnew' => 'Varmistin. Ilmoitan uuden ohjelmointivirheen',
+
+# API errors
+'api-error-badaccess-groups' => 'Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.',
+'api-error-badtoken' => 'Sisäinen virhe: virheellinen tarkistussumma.',
+'api-error-copyuploaddisabled' => 'Tallentaminen URL-osoitteesta ei ole käytössä.',
+'api-error-duplicate' => 'Samansisältöisiä tiedostoja löytyi {{PLURAL:$1|[$2 yksi kappale]|[$2 useampia kappaleita]}}.',
+'api-error-duplicate-archive' => 'Sivustolla oli aiemmin {{PLURAL:$1|[$2 toinen samansisältöinen tiedosto]|[$2 toisia samansisältöisiä tiedostoja]}}, mutta {{PLURAL:$1|se|ne}} poistettiin.',
+'api-error-duplicate-archive-popup-title' => 'Tiedostolla on {{PLURAL:$1|poistettu kaksoiskappale|poistettuja kaksoiskappaleita}}',
+'api-error-duplicate-popup-title' => 'Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}',
+'api-error-empty-file' => 'Määrittämäsi tiedosto on tyhjä.',
+'api-error-fetchfileerror' => 'Sisäinen virhe: jotakin meni pieleen tiedoston haussa.',
+'api-error-file-too-large' => 'Määrittämäsi tiedosto on liian iso.',
+'api-error-filename-tooshort' => 'Tiedoston nimi on liian lyhyt.',
+'api-error-filetype-banned' => 'Tämän tyyppisiä tiedosta ei voi tallentaa.',
+'api-error-filetype-missing' => 'Tiedostolta puuttuu tiedostopääte.',
+'api-error-hookaborted' => 'Laajennuskoodi esti yrittämäsi muutoksen.',
+'api-error-http' => 'Sisäinen virhe: palvelimeen ei saatu yhteyttä.',
+'api-error-illegal-filename' => 'Tiedoston nimi ei kelpaa.',
+'api-error-internal-error' => 'Sisäinen virhe: jotain meni vikaan tallennuksesi käsittelyssä.',
+'api-error-invalid-file-key' => 'Sisäinen virhe: tiedostoa ei löytynyt välikaisvarastosta.',
+'api-error-missingparam' => 'Sisäinen virhe: pyynnöstä puutuu parametrejä.',
+'api-error-missingresult' => 'Sisäinen virhe: ei voitu varmistaa, että tallennus onnistui.',
+'api-error-mustbeloggedin' => 'Sinun pitää olla kirjautunut sisään, jotta voisit tallentaa tiedostoja.',
+'api-error-mustbeposted' => 'Sisäinen virhe: HTTP POST-pyyntö edellytetty.',
+'api-error-noimageinfo' => 'Tallennus onnistui, mutta palvelin ei antanut meille tietoja tiedostosta.',
+'api-error-nomodule' => 'Sisäinen virhe: tallennusmoduulia ei ole asetettu.',
+'api-error-ok-but-empty' => 'Sisäinen virhe: palvelimelta ei saatu vastausta.',
+'api-error-overwrite' => 'Olemassa olevan tiedoston korvaaminen ei ole sallittua.',
+'api-error-stashfailed' => 'Sisäinen virhe: välikaikaisen tiedoston tallentaminen epäonnistui.',
+'api-error-timeout' => 'Palvelin ei vastannut odotetun ajan kuluessa.',
+'api-error-unclassified' => 'Tapahtui tuntematon virhe.',
+'api-error-unknown-code' => 'Tuntematon virhe: $1',
+'api-error-unknown-error' => 'Sisäinen virhe: jotain meni vikaan tiedoston siirrossa.',
+'api-error-unknown-warning' => 'Tuntematon varoitus: $1',
+'api-error-unknownerror' => 'Tuntematon virhe: $1.',
+'api-error-uploaddisabled' => 'Tiedostojen tallentaminen ei ole käytössä.',
+'api-error-verification-error' => 'Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.',
+
);
diff --git a/languages/messages/MessagesFiu_vro.php b/languages/messages/MessagesFiu_vro.php
index 85c3fd7a..9407647f 100644
--- a/languages/messages/MessagesFiu_vro.php
+++ b/languages/messages/MessagesFiu_vro.php
@@ -9,4 +9,4 @@
* @comment Deprecated language code. Falls back to 'vro'.
*/
-$fallback = 'vro';
+$fallback = 'vro, et';
diff --git a/languages/messages/MessagesFj.php b/languages/messages/MessagesFj.php
index 0bb30c62..2055a8fd 100644
--- a/languages/messages/MessagesFj.php
+++ b/languages/messages/MessagesFj.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Jose77 (on fj.wikipedia.org)
*/
$messages = array(
diff --git a/languages/messages/MessagesFo.php b/languages/messages/MessagesFo.php
index 6b4eb28c..740ba496 100644
--- a/languages/messages/MessagesFo.php
+++ b/languages/messages/MessagesFo.php
@@ -469,22 +469,24 @@ Vinarliga fortel hetta fyri einum [[Special:ListUsers/sysop|administrator]], og
'badarticleerror' => 'Hendan gerðin kann ikki fremjast á hesi síðu.',
'cannotdelete' => 'Síðan ella fílan $1 kundi ikki strikast.
Møguliga hevur onkur annar longu strikað hana.',
+'cannotdelete-title' => 'Kann ikki strika síðu "$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 "cached" og eru møguliga ikki dagførdir.',
-'perfcachedts' => 'Fylgjandi dáta er goymt, og var seinast goymt $1.',
+'perfcached' => 'Fylgjandi upplýsingar eru "cached" og eru møguliga ikki dagførdir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Fylgjandi dáta er goymt, og var seinast goymt $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Tað ber í løtuni ikki til at dagføra hesa síðuna.
Dáta higani verður í løtuni ikki endurnýggjað.',
'wrong_wfQuery_params' => '↓ Skeiv parametir til wfQuery()<br />
Funktión: $1<br />
Fyrispurningur: $2',
'viewsource' => 'Vís keldu',
-'viewsourcefor' => 'fyri $1',
+'viewsource-title' => 'Sí keldu fyri $1',
'actionthrottled' => 'Hendingin kvaldist',
'actionthrottledtext' => '↓ Fyri at mótvirka spam, er tað ikki møguligt at gera hetta alt ov nógvar ferðir uppá stutta tíð, og tú ert farin yvir tað markið.
Vinarliga royn aftur um fáir minuttir.',
'protectedpagetext' => 'Hendan síða er læst fyri at steðga rættingum.',
'viewsourcetext' => 'Tú kanst síggja og avrita kelduna til hesa grein:',
+'viewyourtext' => "Tú kanst síggja og avrita kelduna fyri '''tínar rættingar''' til hesa síðuna:",
'protectedinterface' => '↓ Henda síðan gevur markamóts tekst til ritbúnaðin (software), og er vard fyri at fyribyrgja misnýtslu.',
'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ðrir brúkarar.
@@ -592,6 +594,7 @@ verður sendur fyri nakað av fylgjandi hentleikum.',
'emailconfirmlink' => 'Vátta tína t-post adressu',
'invalidemailaddress' => 'T-post bústaðurin kann ikki verða góðtikin, tí hann sær út til at hava ógyldugt format.
Vinarliga skriva t-post bústað í røttum formati ella lat handa teigin vera tóman.',
+'cannotchangeemail' => 'T-post adressur, sum eru knýttar at brúkarakontum, kunnu ikki broytast á hesi wiki.',
'accountcreated' => 'Konto upprættað',
'accountcreatedtext' => 'Brúkarakontan hjá $1 er nú upprættað.',
'createaccount-title' => 'Upprætta brúkarakonto á {{SITENAME}}',
@@ -608,6 +611,7 @@ Vinarliga bíða áðrenn tú roynir aftur.',
# E-mail sending
'php-mail-error-unknown' => "Ókend villa í PHP'sa teldupost () funktión.",
+'user-mail-no-addy' => 'Royndi at senda t-post uttan eina t-post adressu.',
# Change password dialog
'resetpass' => 'Broyt loyniorð',
@@ -629,16 +633,18 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
'resetpass-temp-password' => 'Fyribils loyniorð',
# Special:PasswordReset
-'passwordreset' => 'Nullstilla loyniorðið',
-'passwordreset-text' => 'Útfyll hetta skjalið fyri at fáa eina áminning við t-posti við tínum konto upplýsingum.',
-'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-username' => 'Brúkaranavn:',
-'passwordreset-domain' => 'Umdømi (domain):',
-'passwordreset-email' => 'T-post adressur:',
-'passwordreset-emailtitle' => 'konto upplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Onkur (óiva tú, frá IP adressu $1) hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}
+'passwordreset' => 'Nullstilla loyniorðið',
+'passwordreset-text' => 'Útfyll hetta skjalið fyri at fáa eina áminning við t-posti við tínum konto upplýsingum.',
+'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-username' => 'Brúkaranavn:',
+'passwordreset-domain' => 'Umdømi (domain):',
+'passwordreset-capture' => 'Sí tann endaliga t-postin?',
+'passwordreset-capture-help' => 'Um tú setir kross við henda teigin, so verður t-posturin (við fyribils loyniorðinum) vístur fyri tær og verður harumframt sendur til brúkaran.',
+'passwordreset-email' => 'T-post adressur:',
+'passwordreset-emailtitle' => 'konto upplýsingar á {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Onkur (óiva tú, frá IP adressu $1) hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}
sett í samband við hesa t-post adressu:
$2
@@ -647,7 +653,7 @@ $2
Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa
umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur
ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
-'passwordreset-emailtext-user' => 'Brúkari $1 á {{SITENAME}} hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}}
+'passwordreset-emailtext-user' => 'Brúkari $1 á {{SITENAME}} hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}}
($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}} settar í samband við hesa t-post adressuna:
$2
@@ -656,9 +662,22 @@ $2
Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa
umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur
ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
-'passwordreset-emailelement' => 'Brúkaranavn: $1
+'passwordreset-emailelement' => 'Brúkaranavn: $1
Fyribils loyniorð: $2',
-'passwordreset-emailsent' => 'Ein áminningar teldupostur er blivin sendur.',
+'passwordreset-emailsent' => 'Ein áminningar teldupostur er blivin sendur.',
+'passwordreset-emailsent-capture' => 'Ein áminningar teldupostur 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Broyt teldupost adressu',
+'changeemail-header' => 'Broyt t-post adressuna hjá kontuni',
+'changeemail-text' => 'Útfyll henda formularin fyri at broyta tína t-post adressu. Tú mást skriva títt loyniorð fyri at vátta hesa broyting.',
+'changeemail-no-info' => 'Tú mást vera innritað/ur fyri at fáa beinleiðis atgongd til hesa síðu.',
+'changeemail-oldemail' => 'Verandi t-post adressa:',
+'changeemail-newemail' => 'Nýggj t-post adressa:',
+'changeemail-none' => '(ongin)',
+'changeemail-submit' => 'Broyt t-post',
+'changeemail-cancel' => 'Ógilda',
# Edit page toolbar
'bold_sample' => 'Feitir stavir',
@@ -715,9 +734,6 @@ Tú kanst ikki brúka 'send t-post til henda brúkara' funktiónina, uttan so at
Tín verandi IP adressa er $3, og sperrings ID er #$5.
Vinarliga tak allir hesir upplýsingar við í einum hvørjum fyrispurningi ið tí hevur.",
'blockednoreason' => 'Ongin orsøk er givin',
-'blockedoriginalsource' => "Keldan hjá '''$1''' sæst niðanfyri:",
-'blockededitsource' => "Teksturin á '''Tínar rættingar''' á '''$1''' er vístur niðanfyri:",
-'whitelistedittitle' => 'Tú mást rita inn fyri at rætta',
'whitelistedittext' => 'Tú mást $1 fyri at rætta hesa síðu.',
'confirmedittext' => 'Tú mást vátta tína teldupost adressu áðrenn tú rættar síður.
Vinarliga skriva og vátta tína t-post adressu í tínum [[Special:Preferences|brúkara innstillingum]].',
@@ -1056,11 +1072,13 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
'prefs-rc' => 'Nýkomnar broytingar og stubbaskoðan',
'prefs-watchlist' => 'Eftirlit',
'prefs-watchlist-days' => 'Tal av døgum, sum skula vísast í eftirliti:',
-'prefs-watchlist-days-max' => 'Ã mesta lagi 7 dagar',
+'prefs-watchlist-days-max' => 'Ã mesta lagi $1 {{PLURAL:$1|dagur|dagar}}',
'prefs-watchlist-edits' => 'Tal av rættingum, sum skula vísast í víðkaðum eftirliti:',
'prefs-watchlist-edits-max' => 'Ã mesta lagi: 1000',
'prefs-misc' => 'Ymiskar innstillingar',
'prefs-resetpass' => 'Broyt loyniorð',
+'prefs-changeemail' => 'Broyt t-post adressu',
+'prefs-setemail' => 'Skriva tína t-post adressu',
'prefs-email' => 'T-post møguleikar',
'prefs-rendering' => 'Útsjónd',
'saveprefs' => 'Goym innstillingar',
@@ -1142,6 +1160,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'userrights-lookup-user' => 'Stýr brúkarabólkum',
'userrights-user-editname' => 'Skriva eitt brúkaranavn:',
'editusergroup' => 'Rætta brúkarabólkar',
+'editinguser' => "Broytir rættindini hjá brúkara '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Rætta brúkarabólkar',
'saveusergroups' => 'Goym brúkaraflokk',
'userrights-groupsmember' => 'Limur í:',
@@ -1224,6 +1243,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'action-userrights' => 'broyt øll brúkaraloyvi',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|broyting|broytingar}}',
@@ -1294,6 +1314,7 @@ Sí [[Special:NewFiles|myndasavn av nýggjum fílum]] fyri at fáa eitt meira vi
'minlength1' => 'Fílunavnið má hava í minsta lagi ein bókstav.',
'illegalfilename' => 'Fílunavnið "$1" inniheldur bókstavir sum ikki eru loyvdir í síðu nøvnum.
Vinarliga gev fíluni nýtt navn og royn at senda hana upp (uploada) enn einaferð.',
+'filename-toolong' => 'Fílunøvn mugu ikki vera longri enn 240 bytes.',
'badfilename' => 'Myndin er umnevnd til "$1".',
'filetype-badmime' => 'Fílur av slagnum MIME "$1" eru ikki loyvd at verða send up (uploada).',
'filetype-missing' => 'Fílan hevur ongan enda (sum t.d. ".jpg").',
@@ -1325,6 +1346,21 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
'upload-file-error' => 'Innvortis brek',
'upload-unknown-size' => 'Ókend stødd',
+# File backend
+'backend-fail-store' => 'Kundi ikki goyma fílu $1 á $2.',
+'backend-fail-copy' => 'Kundi ikki avrita fílu $1 til $2.',
+'backend-fail-move' => 'Kundi ikki flyta fílu $1 til $2.',
+'backend-fail-opentemp' => 'Kundi ikki lata upp fyribils fílu.',
+'backend-fail-writetemp' => 'Kundi ikki skriva til fyribils fílu.',
+'backend-fail-closetemp' => 'Kundi ikki aftur fyribils fílu.',
+'backend-fail-read' => 'Kundi ikki lesa fílu $1.',
+'backend-fail-create' => 'Kundi ikki skapa fílu $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kundi ikki lata upp "$1"; hon er ikki stongd.',
+'lockmanager-fail-closelock' => 'Kundi ikki lata aftur lás fílu fyri "$1".',
+'lockmanager-fail-deletelock' => 'Kundi ikki sletta lás fílu fyri "$1".',
+
# img_auth script messages
'img-auth-noread' => 'Brúkarin hevur ikki rættindi til at lesa "$1".',
'img-auth-bad-query-string' => "URL'urin hevur ein ikki galdandi fyrispurning strong.",
@@ -1460,6 +1496,7 @@ Víðaristilling verður nú gjørd til [[$2]].',
'deadendpages' => 'Gøtubotnssíður',
'protectedpages' => 'Friðaðar síður',
'listusers' => 'Brúkaralisti',
+'usercreated' => '{{GENDER:$3|Upprættað}} hin $1 kl. $2',
'newpages' => 'Nýggjar síður',
'newpages-username' => 'Brúkaranavn:',
'ancientpages' => 'Elstu síður',
@@ -1512,8 +1549,7 @@ Sí eisini [[Special:WantedCategories|ynsktir bólkar]].',
'listusers-noresult' => 'Ongin brúkari var funnin.',
# Special:Log/newusers
-'newuserlogpage' => 'Brúkara logg',
-'newuserlog-create-entry' => 'Nýggjur brúkari',
+'newuserlogpage' => 'Brúkara logg',
# Special:ListGroupRights
'listgrouprights-members' => '(limalisti)',
@@ -1524,7 +1560,7 @@ og hava virkandi teldupostadressu í [[Special:Preferences|innstillingum]] tínu
fyri at senda teldupost til aðrar brúkarar.',
'emailuser' => 'Send t-post til brúkara',
'emailpage' => 'Send t-post til brúkara',
-'defemailsubject' => '{{SITENAME}} t-postur',
+'defemailsubject' => '{{SITENAME}} t-postur frá brúkara $1',
'usermaildisabled' => 'Brúkara t-postur er óvirkin',
'usermaildisabledtext' => 'Tú kanst ikki senda teldupost til aðrir brúkarar á hesi wiki',
'noemailtitle' => 'Ongin t-post adressa',
@@ -1560,7 +1596,7 @@ Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika ef
'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á tínum vaktarlista, kjaksíður ikki íroknaðar.',
'watchmethod-list' => 'kannar síður undir eftirliti fyri feskar broytingar',
'watchlistcontains' => 'Títt eftirlit inniheldur {{PLURAL:$1|eina síðu|$1 síður}}.',
-'wlnote' => "Niðanfyri {{PLURAL:$1|stendur seinastu broytingina|standa seinastu '''$1''' broytingarnar}} {{PLURAL:$2|seinasta tíman|seinastu '''$2''' tímarnar}}.",
+'wlnote' => "Niðanfyri {{PLURAL:$1|stendur seinasta broytingin|standa seinastu '''$1''' broytingarnar}} seinasta/u {{PLURAL:$2| tíman|'''$2''' tímarnar}} hin $3 kl. $4",
'wlshowlast' => 'Vís seinastu $1 tímar $2 dagar $3',
'watchlist-options' => 'Møguleikar í ansingarlistanum',
@@ -1588,7 +1624,6 @@ avleiðingarnar og at tú gert tað í tráð við
'actionfailed' => 'Virksemi miseydnaðist',
'deletedtext' => '"$1" er nú strikað.
Sí $2 fyri fulla skráseting av strikingum.',
-'deletedarticle' => 'strikaði "[[$1]]"',
'dellogpage' => 'Striku logg',
'deletionlog' => 'striku logg',
'deletecomment' => 'Orsøk:',
@@ -1633,7 +1668,6 @@ Sí $2 fyri fulla skráseting av strikingum.',
'undeleteviewlink' => 'Hygg',
'undeletereset' => 'Endurset',
'undeletecomment' => 'Orsøk:',
-'undeletedarticle' => 'endurstovnaði "[[$1]]"',
'undeletedfiles' => '{{PLURAL:$1|1 fíla endurstovna|$1 fílur endurstovnaðar}}',
'undelete-search-submit' => 'Leita',
'undelete-show-file-submit' => 'Ja',
@@ -1761,8 +1795,6 @@ ella er navnið tú valdi ógyldugt.
Vinarliga vel eitt annað navn.',
'movedto' => 'flyt til',
'movetalk' => 'Flyt kjaksíðuna eisini, um hon er til.',
-'1movedto2' => '[[$1]] flutt til [[$2]]',
-'1movedto2_redir' => '[[$1]] flutt til [[$2]] um ávísing',
'movelogpage' => 'Flyt gerðabók',
'movereason' => 'Orsøk:',
'revertmove' => 'endurstovna',
@@ -1771,7 +1803,7 @@ Vinarliga vel eitt annað navn.',
Grein við navninum "[[:$1]]" finst longu. Ynskir tú at strika hana til tess at skapa pláss til flytingina?',
'delete_and_move_confirm' => 'Ja, strika hesa síðuna',
-'delete_and_move_reason' => 'Strika til at gera pláss til flyting',
+'delete_and_move_reason' => 'Er strikað fyri at gera pláss til flyting frá "[[$1]]"',
'immobile-source-namespace' => 'Tað ber ikki til at flyta síðu í navnaøkinum "$1"',
'immobile-target-namespace' => 'Tað ber ikki til at flyta síður inn til navnaøkið "$1"',
@@ -1904,6 +1936,7 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
'imagemaxsize' => "Stødd á mynd er avmarkað:<br />''(fyri frágreiðingar síður hjá fílum)''",
'thumbsize' => 'Smámyndastødd:',
'file-info-size' => '$1 × $2 pixel, stødd fílu: $3, MIME-slag: $4',
+'file-nohires' => 'Ongin hægri upploysn varð funnin.',
'svg-long-desc' => 'SVG fíle, nominelt $1 × $2 pixel, fíle stødd: $3',
'show-big-image' => 'Full upploysn',
@@ -2042,4 +2075,13 @@ Hendan váttanarkoda fer úr gildi tann $4.',
'compare-page1' => 'Síða 1',
'compare-page2' => 'Síða 2',
+# API errors
+'api-error-empty-file' => 'Fílan sum tú sendi inn var tóm.',
+'api-error-file-too-large' => 'Fílan sum tú sendi inn var óv stór.',
+'api-error-http' => 'Internur feilur: Kann ikki fáa samband við servaran.',
+'api-error-mustbeloggedin' => 'Tú mást vera innritað/ur fyri at tú kanst leggja fílur upp.',
+'api-error-ok-but-empty' => 'Internur feilur: Onki svar frá servara.',
+'api-error-unclassified' => 'Ein ókendur feilur hendi.',
+'api-error-unknown-code' => 'Ókendur feilur: "$1"',
+
);
diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php
index e5c498f9..12262b21 100644
--- a/languages/messages/MessagesFr.php
+++ b/languages/messages/MessagesFr.php
@@ -12,6 +12,7 @@
* @author ChrisPtDe
* @author Coyau
* @author Crochet.david
+ * @author Csisc
* @author Damouns
* @author DavidL
* @author Delhovlyn
@@ -22,6 +23,7 @@
* @author Enzoreg
* @author Esbardu
* @author Fryed-peach
+ * @author Giro720
* @author Gomoko
* @author Grondin
* @author Guillom
@@ -40,6 +42,7 @@
* @author Krinkle
* @author Kropotkine 113
* @author Litlok
+ * @author Lloffiwr
* @author Louperivois
* @author Lucyin
* @author McDutchie
@@ -59,6 +62,7 @@
* @author Skalman
* @author The Evil IP address
* @author TouzaxA
+ * @author Tpt
* @author Urhixidur
* @author Verdy p
* @author Wyz
@@ -122,142 +126,142 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECTION', '#REDIRECT' ),
- 'notoc' => array( '0', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
- 'noeditsection' => array( '0', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__AUCUNENTETE__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HORAIREACTUEL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HEUREACTUELLE', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'JOUR2LOCAL', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANNEELOCALE', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'HORAIRELOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'HEURELOCALE', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NOMPAGE', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NOMPAGEX', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ESPACENOMMAGE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ESPACEDISCUSSION', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'img_thumbnail' => array( '1', 'vignette', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'droite', 'right' ),
- 'img_left' => array( '1', 'gauche', 'left' ),
- 'img_none' => array( '1', 'néant', 'neant', 'none' ),
- 'img_center' => array( '1', 'centré', 'center', 'centre' ),
- 'img_framed' => array( '1', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
- 'img_upright' => array( '1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'bordure', 'border' ),
- 'img_baseline' => array( '1', 'ligne_de_base', 'base', 'baseline' ),
- 'img_sub' => array( '1', 'indice', 'ind', 'sub' ),
- 'img_super' => array( '1', 'exposant', 'exp', 'super', 'sup' ),
- 'img_top' => array( '1', 'haut', 'top' ),
- 'img_text_top' => array( '1', 'haut-texte', 'haut-txt', 'text-top' ),
- 'img_middle' => array( '1', 'milieu', 'middle' ),
- 'img_bottom' => array( '1', 'bas', 'bottom' ),
- 'img_text_bottom' => array( '1', 'bas-texte', 'bas-txt', 'text-bottom' ),
- 'img_link' => array( '1', 'lien=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NOMSITE', 'SITENAME' ),
- 'ns' => array( '0', 'ESPACEN:', 'NS:' ),
- 'nse' => array( '0', 'ESPACENX:', 'NSE:' ),
- 'localurl' => array( '0', 'URLLOCALE:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLLOCALEX:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'CHEMINARTICLE', 'ARTICLEPATH' ),
- 'server' => array( '0', 'SERVEUR', 'SERVER' ),
- 'servername' => array( '0', 'NOMSERVEUR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'CHEMINSTYLE', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMMAIRE:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GENRE:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'JDSACTUEL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'SEMAINELOCALE', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDVERSION', 'REVISIONID' ),
- 'revisionday' => array( '1', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'JOUR2VERSION', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MOISVERSION', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'MOISVERSION1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'ANNEEVERSION', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'UTILISATEURVERSION', 'REVISIONUSER' ),
- 'plural' => array( '0', 'PLURIEL:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URLCOMPLETE:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLCOMPLETEX:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'INITMINUS:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MINUS:', 'LC:' ),
- 'uc' => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
- 'raw' => array( '0', 'BRUT:', 'RAW:' ),
- 'displaytitle' => array( '1', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'BRUT', 'B', 'R' ),
- 'newsectionlink' => array( '1', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ENCODEURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ENCODEANCRE', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#LANGUE:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
- 'padleft' => array( '0', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
- 'padright' => array( '0', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
- 'special' => array( '0', 'spécial', 'special' ),
- 'defaultsort' => array( '1', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CHEMIN:', 'FILEPATH:' ),
- 'tag' => array( '0', 'balise', 'tag' ),
- 'hiddencat' => array( '1', '__CATCACHEE__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TAILLEPAGE', 'PAGESIZE' ),
- 'noindex' => array( '1', '__AUCUNINDEX__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
- 'url_path' => array( '0', 'CHEMIN', 'PATH' ),
+ 'redirect' => array( '0', '#REDIRECTION', '#REDIRECT' ),
+ 'notoc' => array( '0', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__AUCUNENTETE__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HORAIREACTUEL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HEUREACTUELLE', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'JOUR2LOCAL', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANNEELOCALE', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'HORAIRELOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'HEURELOCALE', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NOMPAGE', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NOMPAGEX', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ESPACENOMMAGE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ESPACEDISCUSSION', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'vignette', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'droite', 'right' ),
+ 'img_left' => array( '1', 'gauche', 'left' ),
+ 'img_none' => array( '1', 'néant', 'neant', 'none' ),
+ 'img_center' => array( '1', 'centré', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
+ 'img_upright' => array( '1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'bordure', 'border' ),
+ 'img_baseline' => array( '1', 'ligne_de_base', 'base', 'baseline' ),
+ 'img_sub' => array( '1', 'indice', 'ind', 'sub' ),
+ 'img_super' => array( '1', 'exposant', 'exp', 'super', 'sup' ),
+ 'img_top' => array( '1', 'haut', 'top' ),
+ 'img_text_top' => array( '1', 'haut-texte', 'haut-txt', 'text-top' ),
+ 'img_middle' => array( '1', 'milieu', 'middle' ),
+ 'img_bottom' => array( '1', 'bas', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'bas-texte', 'bas-txt', 'text-bottom' ),
+ 'img_link' => array( '1', 'lien=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NOMSITE', 'SITENAME' ),
+ 'ns' => array( '0', 'ESPACEN:', 'NS:' ),
+ 'nse' => array( '0', 'ESPACENX:', 'NSE:' ),
+ 'localurl' => array( '0', 'URLLOCALE:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLLOCALEX:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'CHEMINARTICLE', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'SERVEUR', 'SERVER' ),
+ 'servername' => array( '0', 'NOMSERVEUR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'CHEMINSTYLE', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMMAIRE:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GENRE:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'JDSACTUEL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'SEMAINELOCALE', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDVERSION', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'JOUR2VERSION', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MOISVERSION', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'MOISVERSION1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'ANNEEVERSION', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'UTILISATEURVERSION', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'PLURIEL:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLCOMPLETE:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLCOMPLETEX:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'INITMINUS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MINUS:', 'LC:' ),
+ 'uc' => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
+ 'raw' => array( '0', 'BRUT:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'BRUT', 'B', 'R' ),
+ 'newsectionlink' => array( '1', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ENCODEURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ENCODEANCRE', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#LANGUE:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
+ 'padright' => array( '0', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
+ 'special' => array( '0', 'spécial', 'special' ),
+ 'defaultsort' => array( '1', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CHEMIN:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'balise', 'tag' ),
+ 'hiddencat' => array( '1', '__CATCACHEE__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TAILLEPAGE', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__AUCUNINDEX__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'CHEMIN', 'PATH' ),
);
$specialPageAliases = array(
@@ -265,6 +269,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
'Allpages' => array( 'Toutes_les_pages', 'ToutesLesPages' ),
'Ancientpages' => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
+ 'Badtitle' => array( 'MauvaisTitre', 'Mauvais_titre' ),
'Blankpage' => array( 'Page_blanche', 'PageBlanche' ),
'Block' => array( 'Bloquer', 'Blocage' ),
'Blockme' => array( 'Bloquez-moi', 'Bloquezmoi' ),
@@ -713,21 +718,23 @@ Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oubli
'badarticleerror' => 'Cette action ne peut pas être effectuée sur cette page.',
'cannotdelete' => 'Impossible de supprimer la page ou le fichier « $1 ».
La suppression a peut-être déjà été effectuée par quelqu’un d’autre.',
+'cannotdelete-title' => 'Impossible de supprimer la page « $1 »',
'badtitle' => 'Mauvais titre',
'badtitletext' => 'Le titre de la page demandée est invalide, vide, ou il s’agit d’un titre inter-langue ou inter-projet mal lié. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.',
-'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour.',
-'perfcachedts' => 'Les données suivantes sont en cache, elles ne sont donc pas obligatoirement à jour. La dernière actualisation date du $1.',
+'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.',
+'perfcachedts' => 'Les données suivantes sont en cache et ont été mises à jour pour la dernière fois à $1. Un maximum de {{PLURAL:$4|un résultat|$4 résultats}} est disponible dans le cache.',
'querypage-no-updates' => 'Les mises à jour pour cette page sont actuellement désactivées. Les données ci-dessous ne sont pas mises à jour.',
'wrong_wfQuery_params' => 'Paramètres incorrects sur wfQuery()<br />
Fonction : $1<br />
Requête : $2',
'viewsource' => 'Voir le texte source',
-'viewsourcefor' => 'pour $1',
+'viewsource-title' => 'Voir la source de $1',
'actionthrottled' => 'Action limitée',
'actionthrottledtext' => 'Pour lutter contre les pourriels, l’utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s’avère que vous avez dépassé cette limite.
Essayez à nouveau dans quelques minutes.',
'protectedpagetext' => 'Cette page a été protégée pour empêcher sa modification.',
'viewsourcetext' => 'Vous pouvez voir et copier le contenu de la page :',
+'viewyourtext' => "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel et est protégée pour éviter les abus.',
'editinginterface' => "'''Attention :''' vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements se répercuteront, selon le contexte, sur toutes ou certaines pages visibles par les autres utilisateurs. Pour les traductions, nous vous invitons à utiliser le projet MediaWiki d’internationalisation des messages [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
'sqlhidden' => '(Requête SQL cachée)',
@@ -827,6 +834,7 @@ Par conséquent, la création de compte a été temporairement désactivée pour
'emailconfirmlink' => 'Confirmez votre adresse de courriel',
'invalidemailaddress' => 'Cette adresse courriel ne peut pas être acceptée car elle semble avoir un format incorrect.
Entrez une adresse bien formatée ou laissez ce champ vide.',
+'cannotchangeemail' => 'Les adresses de courriel des comptes ne peuvent pas être modifiées sur ce wiki.',
'accountcreated' => 'Compte créé',
'accountcreatedtext' => 'Le compte utilisateur pour $1 a été créé.',
'createaccount-title' => 'Création d’un compte pour {{SITENAME}}',
@@ -843,6 +851,7 @@ Veuillez attendre avant d’essayer à nouveau.',
# E-mail sending
'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
+'user-mail-no-addy' => 'Tenté d’envoyer un courriel sans adresse de courriel',
# Change password dialog
'resetpass' => 'Changer de mot de passe',
@@ -863,28 +872,43 @@ Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mo
'resetpass-temp-password' => 'Mot de passe temporaire :',
# Special:PasswordReset
-'passwordreset' => 'Remise à zéro du mot de passe',
-'passwordreset-text' => 'Remplissez ce formulaire pour recevoir un courriel de rappel des détails de votre compte.',
-'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-username' => 'Nom d’utilisateur :',
-'passwordreset-domain' => 'Domaine :',
-'passwordreset-email' => 'Adresse de courriel :',
-'passwordreset-emailtitle' => 'Détails du compte sur {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
+'passwordreset' => 'Remise à zéro du mot de passe',
+'passwordreset-text' => 'Remplissez ce formulaire pour recevoir un courriel de rappel des détails de votre compte.',
+'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-username' => 'Nom d’utilisateur :',
+'passwordreset-domain' => 'Domaine :',
+'passwordreset-capture' => 'Voir le courriel résultant?',
+'passwordreset-capture-help' => 'Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu’il sera envoyé à l’utilisateur.',
+'passwordreset-email' => 'Adresse de courriel :',
+'passwordreset-emailtitle' => 'Détails du compte sur {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
$2
{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
-'passwordreset-emailtext-user' => 'L’utilisateur $1 sur {{SITENAME}} a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
+'passwordreset-emailtext-user' => 'L’utilisateur $1 sur {{SITENAME}} a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
$2
{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
-'passwordreset-emailelement' => 'Nom d’utilisateur : $1
+'passwordreset-emailelement' => 'Nom d’utilisateur : $1
Mot de passe temporaire : $2',
-'passwordreset-emailsent' => 'Un courriel de rappel a été envoyé.',
+'passwordreset-emailsent' => 'Un courriel de rappel a été envoyé.',
+'passwordreset-emailsent-capture' => 'Un courriel de rappel a été envoyé, qui est affiché ci-dessous.',
+'passwordreset-emailerror-capture' => 'Un courriel de rappel a été généré, qui est affiché ci-dessous, mais l’envoi à l’utilisateur a échoué : $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Changer l’adresse de courriel',
+'changeemail-header' => 'Changer l’adresse de courriel du compte',
+'changeemail-text' => 'Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.',
+'changeemail-no-info' => 'Vous devez être connecté pour pouvoir accéder directement à cette page.',
+'changeemail-oldemail' => 'Adresse de courriel actuelle :',
+'changeemail-newemail' => 'Nouvelle adresse de courriel :',
+'changeemail-none' => '(aucune)',
+'changeemail-submit' => 'Changer l’adresse de courriel',
+'changeemail-cancel' => 'Annuler',
# Edit page toolbar
'bold_sample' => 'Texte gras',
@@ -955,9 +979,6 @@ Notez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que
Votre adresse IP actuelle est $3, et le numéro de blocage est $5.
Veuillez préciser ces indications dans toutes les requêtes que vous ferez.",
'blockednoreason' => 'aucune raison donnée',
-'blockedoriginalsource' => "Le code source de '''$1''' est indiqué ci-dessous :",
-'blockededitsource' => "Le contenu de '''vos modifications''' apportées à '''$1''' est indiqué ci-dessous :",
-'whitelistedittitle' => 'Connexion nécessaire pour modifier le contenu',
'whitelistedittext' => 'Vous devez être $1 pour avoir la permission de modifier le contenu.',
'confirmedittext' => 'Vous devez confirmer votre adresse de courriel avant de modifier les pages.
Veuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].',
@@ -1040,7 +1061,8 @@ Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’
'copyrightwarning2' => "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d’autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />
Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).
'''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
-'longpageerror' => "'''ERREUR : Le texte que vous avez soumis fait $1 Kio, ce qui dépasse la limite fixée à $2 Kio. Le texte ne peut pas être sauvegardé.'''",
+'longpageerror' => "'''Erreur: Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.'''
+Il ne peut pas être sauvegardé.",
'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.'''
Vous pouvez copier le texte dans un fichier texte et le conserver pour plus tard.
@@ -1200,8 +1222,6 @@ Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu
'revdelete-unsuppress' => 'Enlever les restrictions sur les versions restaurées',
'revdelete-log' => 'Motif :',
'revdelete-submit' => 'Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}',
-'revdelete-logentry' => 'a modifié la visibilité de la version de [[$1]]',
-'logdelete-logentry' => 'a modifié la visibilité de l’événement de [[$1]]',
'revdelete-success' => "'''Visibilité des versions mise à jour avec succès.'''",
'revdelete-failure' => "'''La visibilité de la version n’a pas pu être mise à jour :'''
$1",
@@ -1213,15 +1233,6 @@ $1",
'revdel-restore-visible' => 'révisions visibles',
'pagehist' => 'Historique de la page',
'deletedhist' => 'Historique supprimé',
-'revdelete-content' => 'contenu',
-'revdelete-summary' => 'résumé de modification',
-'revdelete-uname' => 'nom d’utilisateur',
-'revdelete-restricted' => 'a appliqué les restrictions aux administrateurs',
-'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
-'revdelete-hid' => 'a masqué $1',
-'revdelete-unhid' => 'a démasqué $1',
-'revdelete-log-message' => '$1 pour $2 version{{PLURAL:$2||s}}',
-'logdelete-log-message' => '$1 sur $2 évènement{{PLURAL:$2||s}}',
'revdelete-hide-current' => 'Erreur lors de la suppression de l’élément daté du $1 à $2 : il est la révision courante.
Il ne peut pas être supprimé.',
'revdelete-show-no-access' => 'Erreur lors de l’affichage de l’élément daté du $1 à $2 : il est marqué comme « restreint ».
@@ -1378,12 +1389,14 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
'prefs-rc' => 'Modifications récentes',
'prefs-watchlist' => 'Liste de suivi',
'prefs-watchlist-days' => 'Nombre de jours à afficher dans la liste de suivi :',
-'prefs-watchlist-days-max' => 'Maximum 7 jours',
+'prefs-watchlist-days-max' => '(maximum $1 jour{{PLURAL:$1||s}})',
'prefs-watchlist-edits' => 'Nombre de modifications à afficher dans la liste de suivi étendue :',
'prefs-watchlist-edits-max' => 'Nombre maximum : 1000',
'prefs-watchlist-token' => 'Jeton pour la liste de suivi :',
'prefs-misc' => 'Préférences diverses',
'prefs-resetpass' => 'Changer de mot de passe',
+'prefs-changeemail' => 'Changer l’adresse de courriel',
+'prefs-setemail' => 'Définir une adresse de courriel',
'prefs-email' => 'Options des courriels',
'prefs-rendering' => 'Apparence',
'saveprefs' => 'Enregistrer les préférences',
@@ -1442,6 +1455,7 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
'yourrealname' => 'Nom réel :',
'yourlanguage' => 'Langue :',
'yourvariant' => 'Variante de la langue du contenu:',
+'prefs-help-variant' => 'Votre variante ou orthographe préféré dans lequel afficher les pages de contenu de ce wiki.',
'yournick' => 'Signature pour les discussions :',
'prefs-help-signature' => 'Les commentaires sur les pages de discussion doivent être signés avec « <nowiki>~~~~</nowiki> », qui sera converti par votre signature et un horodatage.',
'badsig' => 'Signature brute incorrecte.
@@ -1482,7 +1496,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
'userrights-lookup-user' => 'Gestion des groupes d’utilisateurs',
'userrights-user-editname' => 'Entrez un nom d’utilisateur :',
'editusergroup' => 'Modification des groupes d’utilisateurs',
-'editinguser' => "Modification des droits de l’utilisateur '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Modifier les groupes de l’utilisateur',
'saveusergroups' => 'Enregistrer les groupes de l’utilisateur',
'userrights-groupsmember' => 'Membre de :',
@@ -1576,13 +1590,13 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
'right-autopatrol' => 'Avoir ses modifications automatiquement marquées comme surveillées',
'right-patrolmarks' => 'Voir les marquages de surveillance dans les modifications récentes',
'right-unwatchedpages' => 'Voir la liste des pages non suivies',
-'right-trackback' => 'Ajouter des rétroliens',
'right-mergehistory' => 'Fusionner les historiques des pages',
'right-userrights' => 'Modifier tous les droits d’un utilisateur',
'right-userrights-interwiki' => 'Modifier les droits d’utilisateurs qui sont sur un autre wiki',
'right-siteadmin' => 'Verrouiller ou déverrouiller la base de données',
'right-override-export-depth' => 'Exporter les pages en incluant les pages liées jusqu’à une profondeur de 5 niveaux',
'right-sendemail' => 'Envoyer un courriel aux autres utilisateurs',
+'right-passwordreset' => 'Voir les courriels de réinitialisation des mots de passe',
# User rights log
'rightslog' => 'Journal des modifications de droits d’utilisateurs',
@@ -1616,16 +1630,17 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
'action-suppressionlog' => 'voir ce journal privé',
'action-block' => 'bloquer en écriture cet utilisateur',
'action-protect' => 'modifier les niveaux de protection pour cette page',
+'action-rollback' => 'annuler rapidement les modifications du dernier utilisateur qui a modifié une page donnée',
'action-import' => 'importer cette page à partir d’un autre wiki',
'action-importupload' => 'importer cette page à partir d’un fichier',
'action-patrol' => 'marquer la modification des autres comme relue',
'action-autopatrol' => 'avoir votre modification marquée comme relue',
'action-unwatchedpages' => 'voir la liste des pages non suivies',
-'action-trackback' => 'soumettre un rétrolien',
'action-mergehistory' => 'fusionner l’historique de cette page',
'action-userrights' => 'modifier tous les droits d’utilisateur',
'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',
# Recent changes
'nchanges' => '$1 modification{{PLURAL:$1||s}}',
@@ -1657,6 +1672,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
'number_of_watching_users_pageview' => '[$1 utilisateur{{PLURAL:$1||s}} en train de suivre]',
'rc_categories' => 'Limite des catégories (séparation avec « | »)',
'rc_categories_any' => 'Toutes',
+'rc-change-size-new' => '$1 {{PLURAL:$1|octet|octets}} après changement',
'newsectionsummary' => '/* $1 */ nouvelle section',
'rc-enhanced-expand' => 'Voir les détails (nécessite JavaScript)',
'rc-enhanced-hide' => 'Masquer les détails',
@@ -1709,6 +1725,7 @@ Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentatio
'ignorewarnings' => 'Ignorer les avertissements',
'minlength1' => 'Le noms de fichiers doivent comprendre au moins une lettre.',
'illegalfilename' => "Le nom de fichier « $1 » contient des caractères interdits dans les titres de pages. Merci de le renommer et de l'importer à nouveau.",
+'filename-toolong' => 'Le nom du fichier ne peut pas dépasser 240 octets.',
'badfilename' => 'Le fichier a été renommé en « $1 ».',
'filetype-mime-mismatch' => 'L’extension du fichier « .$1 » ne correspond pas au type MIME détecté du fichier ($2).',
'filetype-badmime' => 'Les fichiers du type MIME « $1 » ne peuvent pas être importés.',
@@ -1818,6 +1835,41 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
'upload-unknown-size' => 'Taille inconnue',
'upload-http-error' => 'Une erreur HTTP est survenue : $1',
+# File backend
+'backend-fail-stream' => 'Impossible de lire le fichier $1.',
+'backend-fail-backup' => 'Impossible de sauvegarder le fichier $1.',
+'backend-fail-notexists' => "Le fichier $1 n'existe pas.",
+'backend-fail-hashes' => "Impossible d'obtenir les hachages du fichier pour comparaison.",
+'backend-fail-notsame' => 'Un fichier différent existe déjà pour $1 .',
+'backend-fail-invalidpath' => '$1 n’est pas un chemin de stockage valide.',
+'backend-fail-delete' => 'Impossible de supprimer le fichier $1.',
+'backend-fail-alreadyexists' => 'Le fichier $1 existe déjà.',
+'backend-fail-store' => 'Impossible de stocker le fichier $1 en $2.',
+'backend-fail-copy' => 'Impossible de copier le fichier $1 en $2.',
+'backend-fail-move' => 'Impossible de déplacer le fichier $1 en $2.',
+'backend-fail-opentemp' => "Impossible d'ouvrir le fichier temporaire.",
+'backend-fail-writetemp' => "Impossible d'écrire dans le fichier temporaire.",
+'backend-fail-closetemp' => 'Impossible de fermer le fichier temporaire.',
+'backend-fail-read' => 'Impossible de lire le fichier $1.',
+'backend-fail-create' => 'Impossible de créer le fichier $1.',
+'backend-fail-readonly' => 'Le support de stockage "$1" est actuellement en lecture seule. La raison indiquée est: "$2"',
+'backend-fail-synced' => 'Le fichier "$1" est dans un état incohérent dans les supports de stockage internes',
+'backend-fail-connect' => 'Impossible de se connecter au support de stockage "$1".',
+'backend-fail-internal' => 'Une erreur inconnue s\'est produite dans le support de stockage "$1".',
+'backend-fail-contenttype' => 'Impossible de déterminer le type de contenu du fichier à stocker en "$1".',
+'backend-fail-batchsize' => 'Le support de stockage a fourni un lot de $1 {{PLURAL:$1|opération|opérations}} de fichier; la limite est $2 {{PLURAL:$2|opération|opérations}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Impossible de déverrouiller « $1 » ; elle n’est pas verrouillée.',
+'lockmanager-fail-closelock' => 'Impossible de fermer le fichier de verrou pour « $1 ».',
+'lockmanager-fail-deletelock' => 'Impossible de supprimer le fichier de verrou pour « $1 ».',
+'lockmanager-fail-acquirelock' => 'Impossible d’obtenir le verrou pour « $1 ».',
+'lockmanager-fail-openlock' => 'Impossible d’ouvrir le fichier de verrou pour « $1» .',
+'lockmanager-fail-releaselock' => 'Impossible de relâcher le verrou pour « $1 ».',
+'lockmanager-fail-db-bucket' => 'Impossible de contacter suffisamment de bases de données de verrouillage dans le godet $1.',
+'lockmanager-fail-db-release' => 'Impossible de relâcher les verrous sur la base de données $1.',
+'lockmanager-fail-svr-release' => 'Impossible de relâcher les verrous sur le serveur $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => "Une erreur s'est produite lors de l'ouverture du fichier ZIP pour contrôle.",
'zip-wrong-format' => "Le fichier spécifié n'est pas un fichier ZIP.",
@@ -1834,6 +1886,7 @@ Il ne peut pas être correctement vérifé pour la sécurité.',
'uploadstash-badtoken' => "L'exécution de cette action a échoué, peut-être parce que vos informations d'identification ont expiré. Réessayez.",
'uploadstash-errclear' => "L'effacement des fichiers a échoué.",
'uploadstash-refresh' => 'Actualiser la liste des fichiers',
+'invalid-chunk-offset' => 'Offset de segment non valide',
# img_auth script messages
'img-auth-accessdenied' => 'Accès refusé',
@@ -1940,23 +1993,24 @@ Sa description sur sa [$2 page de description] est affichée ci-dessous.',
'filerevert-badversion' => 'Il n’y a pas localement de version antérieure du fichier qui porte la date indiquée.',
# File deletion
-'filedelete' => 'Supprimer $1',
-'filedelete-legend' => 'Supprimer le fichier',
-'filedelete-intro' => "Vous êtes sur le point de supprimer '''[[Media:$1|$1]]''' ainsi que tout son historique.",
-'filedelete-intro-old' => "Vous êtes en train d’effacer la version de '''[[Media:$1|$1]]''' du [$4 $2 à $3].",
-'filedelete-comment' => 'Motif :',
-'filedelete-submit' => 'Supprimer',
-'filedelete-success' => "'''$1''' a été supprimé.",
-'filedelete-success-old' => "La version de '''[[Media:$1|$1]]''' du $2 à $3 a été supprimée.",
-'filedelete-nofile' => "'''$1''' n’existe pas.",
-'filedelete-nofile-old' => "Il n’existe aucune version archivée de '''$1''' avec les attributs indiqués.",
-'filedelete-otherreason' => 'Motif autre / supplémentaire :',
-'filedelete-reason-otherlist' => 'Autre motif',
-'filedelete-reason-dropdown' => '* Motifs fréquents de suppression de fichiers
+'filedelete' => 'Supprimer $1',
+'filedelete-legend' => 'Supprimer le fichier',
+'filedelete-intro' => "Vous êtes sur le point de supprimer '''[[Media:$1|$1]]''' ainsi que tout son historique.",
+'filedelete-intro-old' => "Vous êtes en train d’effacer la version de '''[[Media:$1|$1]]''' du [$4 $2 à $3].",
+'filedelete-comment' => 'Motif :',
+'filedelete-submit' => 'Supprimer',
+'filedelete-success' => "'''$1''' a été supprimé.",
+'filedelete-success-old' => "La version de '''[[Media:$1|$1]]''' du $2 à $3 a été supprimée.",
+'filedelete-nofile' => "'''$1''' n’existe pas.",
+'filedelete-nofile-old' => "Il n’existe aucune version archivée de '''$1''' avec les attributs indiqués.",
+'filedelete-otherreason' => 'Motif autre / supplémentaire :',
+'filedelete-reason-otherlist' => 'Autre motif',
+'filedelete-reason-dropdown' => '* Motifs fréquents de suppression de fichiers
** Violation du droit d’auteur
** Fichier dupliqué',
-'filedelete-edit-reasonlist' => 'Modifier les motifs fréquents de suppression',
-'filedelete-maintenance' => 'La suppression et restauration de fichiers est temporairement désactivée durant la maintenance.',
+'filedelete-edit-reasonlist' => 'Modifier les motifs fréquents de suppression',
+'filedelete-maintenance' => 'La suppression et restauration de fichiers est temporairement désactivée durant la maintenance.',
+'filedelete-maintenance-title' => 'Impossible de supprimer le fichier',
# MIME search
'mimesearch' => 'Recherche par type de contenu MIME',
@@ -2055,6 +2109,8 @@ Les entrées <del>barrées</del> ont été résolues.',
'wantedpages' => 'Pages les plus demandées',
'wantedpages-badtitle' => 'Titre invalide dans les résultats : $1',
'wantedfiles' => 'Fichiers les plus demandés',
+'wantedfiletext-cat' => "Les fichiers suivants sont utilisés, mais il n'existent pas. Les fichiers de dépôts à distance peuvent être listés malgré qu'ils existent. Tout ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriés dans [[:$1]].",
+'wantedfiletext-nocat' => "Les fichiers suivants sont utilisés, mais n'existent pas. Les fichiers de dépôts à distance peuvent être listés malgré qu'ils existent. Tout ces faux positifs seront <del>barrés</del>.",
'wantedtemplates' => 'Modèles demandés',
'mostlinked' => 'Pages les plus liées',
'mostlinkedcategories' => 'Catégories les plus utilisées',
@@ -2063,6 +2119,7 @@ Les entrées <del>barrées</del> ont été résolues.',
'mostimages' => 'Fichiers les plus utilisés',
'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)',
'shortpages' => 'Pages courtes',
'longpages' => 'Pages longues',
'deadendpages' => 'Pages en impasse',
@@ -2173,12 +2230,8 @@ Protocoles reconnus : <tt>$1</tt> (n’ajoutez aucun de ceux-ci dans votre reche
'activeusers-noresult' => 'Aucun utilisateur trouvé.',
# Special:Log/newusers
-'newuserlogpage' => 'Journal des créations de comptes utilisateur',
-'newuserlogpagetext' => 'Cette page affiche l’historique des créations de comptes utilisateur.',
-'newuserlog-byemail' => 'mot de passe envoyé par courriel',
-'newuserlog-create-entry' => 'Nouveau compte utilisateur',
-'newuserlog-create2-entry' => 'a créé le nouveau compte $1',
-'newuserlog-autocreate-entry' => 'Compte créé automatiquement',
+'newuserlogpage' => 'Journal des créations de comptes utilisateur',
+'newuserlogpagetext' => 'Cette page affiche l’historique des créations de comptes utilisateur.',
# Special:ListGroupRights
'listgrouprights' => 'Droits des groupes d’utilisateurs',
@@ -2207,7 +2260,7 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
'emailpagetext' => 'Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à cet utilisateur.
L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.',
'usermailererror' => 'Erreur dans l’objet du courriel :',
-'defemailsubject' => 'Courriel de {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} Courriel de l’utilisateur « $1 »',
'usermaildisabled' => 'L’envoi de courriels entre utilisateurs est désactivé',
'usermaildisabledtext' => 'Vous ne pouvez pas envoyer de courriels à d’autres utilisateurs sur ce wiki',
'noemailtitle' => 'Aucune adresse de courriel',
@@ -2260,7 +2313,7 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
'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}}.',
'iteminvalidname' => 'Problème avec l’élément « $1 » : le nom est invalide.',
-'wlnote' => "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les '''$1''' dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les '''$2''' dernières heures}}.",
+'wlnote' => "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les '''$1''' dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les '''$2''' dernières heures}}, depuis $3, $4.",
'wlshowlast' => 'Montrer les dernières $1 heures, les derniers $2 jours ou bien $3',
'watchlist-options' => 'Options de la liste de suivi',
@@ -2324,8 +2377,6 @@ Retour et assistance :
'actionfailed' => 'L’action a échoué',
'deletedtext' => '« $1 » a été supprimée.
Voir $2 pour une liste des suppressions récentes.',
-'deletedarticle' => 'a supprimé « [[$1]] »',
-'suppressedarticle' => 'a supprimé « [[$1]] »',
'dellogpage' => 'Journal des suppressions de page',
'dellogpagetext' => 'Voici la liste des suppressions les plus récentes.',
'deletionlog' => 'journal des suppressions',
@@ -2376,7 +2427,10 @@ Consultez la [[Special:ProtectedPages|liste des pages protégées]] pour la list
'unprotectedarticle' => 'a supprimé la protection de « [[$1]] »',
'movedarticleprotection' => 'a déplacé les paramètres de protection depuis « [[$2]] » vers « [[$1]] »',
'protect-title' => 'Changer le niveau de protection pour « $1 »',
+'protect-title-notallowed' => 'Voir le niveau de protection de « $1 »',
'prot_1movedto2' => '[[$1]] renommé en [[$2]]',
+'protect-badnamespace-title' => 'Espace de noms non protégeable',
+'protect-badnamespace-text' => 'Les pages dans cet espace de noms ne peuvent pas être protégées.',
'protect-legend' => 'Confirmer la protection',
'protectcomment' => 'Motif :',
'protectexpiry' => 'Date d’expiration :',
@@ -2397,6 +2451,7 @@ Voici les réglages actuels de la page '''$1''' :",
'protect-level-sysop' => 'Administrateurs uniquement',
'protect-summary-cascade' => 'protection en cascade',
'protect-expiring' => 'expire le $1 (UTC)',
+'protect-expiring-local' => 'expire le $1',
'protect-expiry-indefinite' => 'infini',
'protect-cascade' => 'Protéger les pages incluses dans celle-ci (protection en cascade)',
'protect-cantedit' => 'Vous ne pouvez pas changer les niveaux de protection de cette page car vous n’avez pas la permission de la modifier.',
@@ -2457,7 +2512,6 @@ Vous avez peut-être un mauvais lien, ou la version a pu être restaurée ou sup
'undeletereset' => 'Réinitialiser',
'undeleteinvert' => 'Inverser la sélection',
'undeletecomment' => 'Motif :',
-'undeletedarticle' => 'a restauré « [[$1]] »',
'undeletedrevisions' => '$1 {{PLURAL:$1|version restaurée|versions restaurées}}',
'undeletedrevisions-files' => '$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}',
'undeletedfiles' => '$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}',
@@ -2467,6 +2521,7 @@ un autre utilisateur a probablement déjà restauré la page.',
Consultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
'undelete-header' => 'Consultez le [[Special:Log/delete|journal des suppressions]] pour lister les pages récemment supprimées.',
+'undelete-search-title' => 'Rechercher les pages supprimées',
'undelete-search-box' => 'Rechercher des pages supprimées',
'undelete-search-prefix' => 'Montrer les pages commençant par :',
'undelete-search-submit' => 'Rechercher',
@@ -2476,6 +2531,7 @@ Consultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la lis
'undelete-cleanup-error' => 'Erreur lors de la suppression du fichier d’archive inutilisé « $1 ».',
'undelete-missing-filearchive' => 'Impossible de restaurer le fichier d’archive avec l’identifiant $1 parce qu’il n’est pas dans la base de données.
Il a peut-être déjà été restauré.',
+'undelete-error' => "Page d'erreur d'annulation",
'undelete-error-short' => 'Erreur lors de la restauration du fichier : $1',
'undelete-error-long' => 'Des erreurs ont été rencontrées lors de la restauration du fichier :
@@ -2596,6 +2652,7 @@ Consultez la [[Special:BlockList|liste des adresses IP et comptes bloqués]] pou
'blocklist-userblocks' => 'Masquer les blocages de comptes',
'blocklist-tempblocks' => 'Masquer les blocages temporaires',
'blocklist-addressblocks' => 'Masquer les blocages d’adresses IP uniques',
+'blocklist-rangeblocks' => 'Masquer les blocs de portée',
'blocklist-timestamp' => 'Date et heure',
'blocklist-target' => 'Cible',
'blocklist-expiry' => 'Date d’expiration',
@@ -2618,6 +2675,7 @@ Consultez la [[Special:BlockList|liste des adresses IP et comptes bloqués]] pou
'unblocklink' => 'débloquer',
'change-blocklink' => 'modifier le blocage',
'contribslink' => 'contributions',
+'emaillink' => 'Envoyer un courriel',
'autoblocker' => 'Vous avez été bloqué automatiquement parce que votre adresse IP a été récemment utilisée par « [[User:$1|$1]] ».
Le motif fourni pour le blocage de $1 est : « $2 ».',
'blocklogpage' => 'Journal des blocages',
@@ -2737,9 +2795,6 @@ Veuillez en choisir un autre.',
'movepage-page-moved' => 'La page $1 a été renommée en $2.',
'movepage-page-unmoved' => 'La page $1 n’a pas pu être renommée en $2.',
'movepage-max-pages' => 'Le maximum de $1 {{PLURAL:$1|page renommée|pages renommées}} a été atteint et aucune autre page ne sera renommée automatiquement.',
-'1movedto2' => 'a déplacé [[$1]] vers [[$2]]',
-'1movedto2_redir' => 'a déplacé [[$1]] vers [[$2]] en écrasant sa redirection',
-'move-redirect-suppressed' => 'redirection supprimée',
'movelogpage' => 'Journal des renommages',
'movelogpagetext' => 'Voici la liste de toutes les pages renommées ou déplacées.',
'movesubpage' => 'Sous-page{{PLURAL:$1||s}}',
@@ -2752,7 +2807,7 @@ Veuillez en choisir un autre.',
La page de destination « [[:$1]] » existe déjà.
Êtes-vous certain{{GENDER:||e|}} de vouloir la supprimer pour permettre ce renommage ?',
'delete_and_move_confirm' => 'Oui, supprimer la page de destination',
-'delete_and_move_reason' => 'Page supprimée pour permettre le renommage',
+'delete_and_move_reason' => 'Page supprimée pour permettre le renommage depuis "[[$1]]"',
'selfmove' => 'Les titres d’origine et de destination sont les mêmes ;
impossible de renommer une page sur elle-même.',
'immobile-source-namespace' => 'Vous ne pouvez pas renommer les pages dans l’espace de noms « $1 »',
@@ -2781,9 +2836,11 @@ le résultat peut alors être importé dans un autre wiki utilisant le logiciel
Pour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d’un titre par ligne. Sélectionnez si vous désirez ou non la version actuelle avec toutes les anciennes versions, avec les lignes de l’historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.
Dans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Exporter toutes les pages',
'exportcuronly' => 'Exporter uniquement la version courante, sans l’historique complet',
'exportnohistory' => "----
'''Note :''' l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
+'exportlistauthors' => 'Inclure une liste complète des contributeurs pour chaque page',
'export-submit' => 'Exporter',
'export-addcattext' => 'Ajouter les pages de la catégorie :',
'export-addcat' => 'Ajouter',
@@ -2816,6 +2873,8 @@ Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de Media
'thumbnail_error' => 'Erreur lors de la création de la miniature : $1',
'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',
+'thumbnail-dest-create' => "Impossible d'enregistrer la vignette sur la destination",
'thumbnail_invalid_params' => 'Paramètres de la miniature incorrects',
'thumbnail_dest_directory' => 'Impossible de créer le répertoire de destination',
'thumbnail_image-type' => 'Type d’image non supporté',
@@ -2863,6 +2922,11 @@ Un dossier temporaire est manquant.",
'import-upload' => 'Import de données XML',
'import-token-mismatch' => 'Perte des données de session. Veuillez réessayez.',
'import-invalid-interwiki' => 'Impossible d’importer depuis le wiki spécifié.',
+'import-error-edit' => 'La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisés à la modifier.',
+'import-error-create' => 'La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisés à la créer.',
+'import-error-interwiki' => "La page « $1 » n'est pas importée parce que son nom est réservé pour un lien externe (interwiki).",
+'import-error-special' => 'La page " $1 " n\'est pas importée parce qu\'elle appartient à un espace de noms special qui n’en autorise aucune.',
+'import-error-invalid' => 'Page « $1 » n’est pas importée parce que son nom n’est pas valide.',
# Import log
'importlogpage' => 'Journal des importations',
@@ -2872,75 +2936,88 @@ Un dossier temporaire est manquant.",
'import-logentry-interwiki' => 'a importé $1 d’un wiki à l’autre',
'import-logentry-interwiki-detail' => '$1 version{{PLURAL:$1||s}} depuis $2',
+# JavaScriptTest
+'javascripttest' => 'Test de JavaScript',
+'javascripttest-disabled' => 'Cette fonction est désactivée.',
+'javascripttest-title' => 'Exécution des tests $1',
+'javascripttest-pagetext-noframework' => "Cette page est réservée pour l'exécution des tests JavaScript.",
+'javascripttest-pagetext-unknownframework' => 'Structure "$1" inconnue.',
+'javascripttest-pagetext-frameworks' => "Veuillez choisir l'une des structures de test suivantes : $1",
+'javascripttest-pagetext-skins' => 'Choisissez un habillage avec lequel lancer les tests :',
+'javascripttest-qunit-intro' => 'Voir [$1 la documentation de test] sur mediawiki.org.',
+'javascripttest-qunit-heading' => 'Suite de test QUnit de JavaScript sur MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Votre page utilisateur',
-'tooltip-pt-anonuserpage' => 'La page utilisateur de l’IP avec laquelle vous contribuez',
-'tooltip-pt-mytalk' => 'Votre page de discussion',
-'tooltip-pt-anontalk' => 'La page de discussion pour les contributions depuis cette adresse IP',
-'tooltip-pt-preferences' => 'Vos préférences',
-'tooltip-pt-watchlist' => 'La liste des pages dont vous suivez les modifications',
-'tooltip-pt-mycontris' => 'La liste de vos contributions',
-'tooltip-pt-login' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n’est cependant pas obligatoire.',
-'tooltip-pt-anonlogin' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n’est cependant pas obligatoire.',
-'tooltip-pt-logout' => 'Se déconnecter',
-'tooltip-ca-talk' => 'Discussion au sujet de cette page de contenu',
-'tooltip-ca-edit' => 'Vous pouvez modifier cette page.
+'tooltip-pt-userpage' => 'Votre page utilisateur',
+'tooltip-pt-anonuserpage' => 'La page utilisateur de l’IP avec laquelle vous contribuez',
+'tooltip-pt-mytalk' => 'Votre page de discussion',
+'tooltip-pt-anontalk' => 'La page de discussion pour les contributions depuis cette adresse IP',
+'tooltip-pt-preferences' => 'Vos préférences',
+'tooltip-pt-watchlist' => 'La liste des pages dont vous suivez les modifications',
+'tooltip-pt-mycontris' => 'La liste de vos contributions',
+'tooltip-pt-login' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n’est cependant pas obligatoire.',
+'tooltip-pt-anonlogin' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n’est cependant pas obligatoire.',
+'tooltip-pt-logout' => 'Se déconnecter',
+'tooltip-ca-talk' => 'Discussion au sujet de cette page de contenu',
+'tooltip-ca-edit' => 'Vous pouvez modifier cette page.
Veuillez utiliser le bouton de prévisualisation avant d’enregistrer.',
-'tooltip-ca-addsection' => 'Commencer une nouvelle section',
-'tooltip-ca-viewsource' => 'Cette page est protégée.
+'tooltip-ca-addsection' => 'Commencer une nouvelle section',
+'tooltip-ca-viewsource' => 'Cette page est protégée.
Vous pouvez toutefois en visualiser la source.',
-'tooltip-ca-history' => 'Les versions passées de cette page (avec leurs contributeurs)',
-'tooltip-ca-protect' => 'Protéger cette page',
-'tooltip-ca-unprotect' => 'Changer la protection de cette page',
-'tooltip-ca-delete' => 'Supprimer cette page',
-'tooltip-ca-undelete' => 'Rétablir les modifications faites sur cette page avant sa suppression',
-'tooltip-ca-move' => 'Renommer cette page',
-'tooltip-ca-watch' => 'Ajouter cette page à votre liste de suivi',
-'tooltip-ca-unwatch' => 'Retirer cette page de votre liste de suivi',
-'tooltip-search' => 'Rechercher dans {{SITENAME}}',
-'tooltip-search-go' => 'Aller vers une page portant exactement ce nom si elle existe.',
-'tooltip-search-fulltext' => 'Rechercher les pages comportant ce texte.',
-'tooltip-p-logo' => 'Page principale',
-'tooltip-n-mainpage' => 'Visiter la page d’accueil du site',
-'tooltip-n-mainpage-description' => 'Aller à l’accueil',
-'tooltip-n-portal' => 'À propos du projet',
-'tooltip-n-currentevents' => 'Trouver les informations de fond sur l’actualité du moment',
-'tooltip-n-recentchanges' => 'Liste des modifications récentes sur le wiki',
-'tooltip-n-randompage' => 'Afficher une page au hasard',
-'tooltip-n-help' => 'Aide',
-'tooltip-t-whatlinkshere' => 'Liste des pages liées à celle-ci',
-'tooltip-t-recentchangeslinked' => 'Liste des modifications récentes des pages liées à celle-ci',
-'tooltip-feed-rss' => 'Flux RSS pour cette page',
-'tooltip-feed-atom' => 'Flux Atom pour cette page',
-'tooltip-t-contributions' => 'Voir la liste des contributions de cet utilisateur',
-'tooltip-t-emailuser' => 'Envoyer un courriel à cet utilisateur',
-'tooltip-t-upload' => 'Envoyer une image ou fichier média sur le serveur',
-'tooltip-t-specialpages' => 'Liste de toutes les pages spéciales',
-'tooltip-t-print' => 'Version imprimable de cette page',
-'tooltip-t-permalink' => 'Lien permanent vers cette version de la page',
-'tooltip-ca-nstab-main' => 'Voir la page de contenu',
-'tooltip-ca-nstab-user' => 'Voir la page utilisateur',
-'tooltip-ca-nstab-media' => 'Voir la page du média',
-'tooltip-ca-nstab-special' => 'Ceci est une page spéciale, vous ne pouvez pas la modifier.',
-'tooltip-ca-nstab-project' => 'Voir la page du projet',
-'tooltip-ca-nstab-image' => 'Voir la page du fichier',
-'tooltip-ca-nstab-mediawiki' => 'Voir le message système',
-'tooltip-ca-nstab-template' => 'Voir le modèle',
-'tooltip-ca-nstab-help' => 'Voir la page d’aide',
-'tooltip-ca-nstab-category' => 'Voir la page de la catégorie',
-'tooltip-minoredit' => 'Marquer mes modifications comme mineures',
-'tooltip-save' => 'Publier vos modifications',
-'tooltip-preview' => 'Merci de prévisualiser vos modifications avant de les publier',
-'tooltip-diff' => 'Permet de visualiser les changements que vous avez effectués',
-'tooltip-compareselectedversions' => 'Afficher les différences entre deux versions de cette page',
-'tooltip-watch' => 'Ajouter cette page à votre liste de suivi',
-'tooltip-recreate' => 'Recréer la page même si celle-ci a été effacée',
-'tooltip-upload' => "Démarrer l'import",
-'tooltip-rollback' => '« Révoquer » annule en un clic la ou les modification(s) de cette page par son dernier contributeur.',
-'tooltip-undo' => '« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
+'tooltip-ca-history' => 'Les versions passées de cette page (avec leurs contributeurs)',
+'tooltip-ca-protect' => 'Protéger cette page',
+'tooltip-ca-unprotect' => 'Changer la protection de cette page',
+'tooltip-ca-delete' => 'Supprimer cette page',
+'tooltip-ca-undelete' => 'Rétablir les modifications faites sur cette page avant sa suppression',
+'tooltip-ca-move' => 'Renommer cette page',
+'tooltip-ca-watch' => 'Ajouter cette page à votre liste de suivi',
+'tooltip-ca-unwatch' => 'Retirer cette page de votre liste de suivi',
+'tooltip-search' => 'Rechercher dans {{SITENAME}}',
+'tooltip-search-go' => 'Aller vers une page portant exactement ce nom si elle existe.',
+'tooltip-search-fulltext' => 'Rechercher les pages comportant ce texte.',
+'tooltip-p-logo' => 'Page principale',
+'tooltip-n-mainpage' => 'Visiter la page d’accueil du site',
+'tooltip-n-mainpage-description' => 'Aller à l’accueil',
+'tooltip-n-portal' => 'À propos du projet',
+'tooltip-n-currentevents' => 'Trouver les informations de fond sur l’actualité du moment',
+'tooltip-n-recentchanges' => 'Liste des modifications récentes sur le wiki',
+'tooltip-n-randompage' => 'Afficher une page au hasard',
+'tooltip-n-help' => 'Aide',
+'tooltip-t-whatlinkshere' => 'Liste des pages liées à celle-ci',
+'tooltip-t-recentchangeslinked' => 'Liste des modifications récentes des pages liées à celle-ci',
+'tooltip-feed-rss' => 'Flux RSS pour cette page',
+'tooltip-feed-atom' => 'Flux Atom pour cette page',
+'tooltip-t-contributions' => 'Voir la liste des contributions de cet utilisateur',
+'tooltip-t-emailuser' => 'Envoyer un courriel à cet utilisateur',
+'tooltip-t-upload' => 'Envoyer une image ou fichier média sur le serveur',
+'tooltip-t-specialpages' => 'Liste de toutes les pages spéciales',
+'tooltip-t-print' => 'Version imprimable de cette page',
+'tooltip-t-permalink' => 'Lien permanent vers cette version de la page',
+'tooltip-ca-nstab-main' => 'Voir la page de contenu',
+'tooltip-ca-nstab-user' => 'Voir la page utilisateur',
+'tooltip-ca-nstab-media' => 'Voir la page du média',
+'tooltip-ca-nstab-special' => 'Ceci est une page spéciale, vous ne pouvez pas la modifier.',
+'tooltip-ca-nstab-project' => 'Voir la page du projet',
+'tooltip-ca-nstab-image' => 'Voir la page du fichier',
+'tooltip-ca-nstab-mediawiki' => 'Voir le message système',
+'tooltip-ca-nstab-template' => 'Voir le modèle',
+'tooltip-ca-nstab-help' => 'Voir la page d’aide',
+'tooltip-ca-nstab-category' => 'Voir la page de la catégorie',
+'tooltip-minoredit' => 'Marquer mes modifications comme mineures',
+'tooltip-save' => 'Publier vos modifications',
+'tooltip-preview' => 'Merci de prévisualiser vos modifications avant de les publier',
+'tooltip-diff' => 'Permet de visualiser les changements que vous avez effectués',
+'tooltip-compareselectedversions' => 'Afficher les différences entre deux versions de cette page',
+'tooltip-watch' => 'Ajouter cette page à votre liste de suivi',
+'tooltip-watchlistedit-normal-submit' => 'Enlever les titres',
+'tooltip-watchlistedit-raw-submit' => 'Mise à jour de la liste de suivi',
+'tooltip-recreate' => 'Recréer la page même si celle-ci a été effacée',
+'tooltip-upload' => "Démarrer l'import",
+'tooltip-rollback' => '« Révoquer » annule en un clic la ou les modification(s) de cette page par son dernier contributeur.',
+'tooltip-undo' => '« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
Permet de rétablir la version précédente et d’ajouter un motif dans la boîte de résumé.',
-'tooltip-preferences-save' => 'Sauvegarder les préférences',
-'tooltip-summary' => 'Entrez un bref résumé',
+'tooltip-preferences-save' => 'Sauvegarder les préférences',
+'tooltip-summary' => 'Entrez un bref résumé',
# Stylesheets
'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
@@ -3030,9 +3107,6 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
# Patrol log
'patrol-log-page' => 'Journal des relectures',
'patrol-log-header' => 'Voici l’historique des versions relues.',
-'patrol-log-line' => 'a marqué la $1 de $2 comme relue $3',
-'patrol-log-auto' => '(automatique)',
-'patrol-log-diff' => 'version $1',
'log-show-hide-patrol' => '$1 l’historique des relectures',
# Image deletion
@@ -3059,11 +3133,11 @@ Si vous l’exécutez, votre système peut être compromis.",
'file-info' => 'Taille du fichier : $1, type MIME : $2',
'file-info-size' => '$1 × $2 pixels, taille du fichier : $3, type MIME : $4',
'file-info-size-pages' => '$1 × $2 pixels, taille de fichier: $3, type MIME: $4, $5 {{PLURAL:$5|page|pages}}',
-'file-nohires' => '<small>Pas de plus haute résolution disponible.</small>',
+'file-nohires' => 'Pas de plus haute résolution disponible.',
'svg-long-desc' => 'Fichier SVG, résolution de $1 × $2 pixels, taille : $3',
'show-big-image' => 'Image en plus haute résolution',
-'show-big-image-preview' => '<small>Taille de cet aperçu : $1.</small>',
-'show-big-image-other' => '<small>Autres résolutions : $1.</small>',
+'show-big-image-preview' => 'Taille de cet aperçu : $1.',
+'show-big-image-other' => '{{PLURAL:$2|Autre résolution|Autres résolutions}} : $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'en boucle',
'file-info-gif-frames' => '$1 {{PLURAL:$1|image|images}}',
@@ -3083,6 +3157,13 @@ Si vous l’exécutez, votre système peut être compromis.",
'bydate' => 'par date',
'sp-newimages-showfrom' => 'Afficher les nouveaux fichiers à partir du $1 à $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 seconde|$1 secondes}}',
+'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
+'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
+'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
+'ago' => 'Il y a $1',
+
# Bad image list
'bad_image_list' => 'Le format est le suivant :
@@ -3587,13 +3668,6 @@ $5',
'scarytranscludefailed' => '[La récupération de modèle a échoué pour $1]',
'scarytranscludetoolong' => '[L’URL est trop longue]',
-# Trackbacks
-'trackbackbox' => 'Rétroliens vers cette page :<br />
-$1',
-'trackbackremove' => '([$1 Supprimer])',
-'trackbacklink' => 'Rétrolien',
-'trackbackdeleteok' => 'Le rétrolien a été supprimé avec succès.',
-
# Delete conflict
'deletedwhileediting' => "'''Attention''' : cette page a été supprimée après que vous avez commencé à la modifier !",
'confirmrecreate' => "L’utilisateur [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à l’éditer, pour le motif suivant :
@@ -3693,6 +3767,9 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l’éditeur normal]].',
'hijri-calendar-m8' => 'Sha’aban',
'hijri-calendar-m11' => 'Dhu al-Qi’dah',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])',
+
# Core parser functions
'unknown_extension_tag' => 'Balise d’extension « $1 » inconnue',
'duplicate-defaultsort' => 'Attention : la clé de tri par défaut « $2 » écrase la précédente « $1 ».',
@@ -3791,13 +3868,16 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'tags-hitcount' => '$1 modification{{PLURAL:$1||s}}',
# Special:ComparePages
-'comparepages' => 'Comparer des pages',
-'compare-selector' => 'Comparer les versions des pages',
-'compare-page1' => 'Page 1',
-'compare-page2' => 'Page 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Comparer',
+'comparepages' => 'Comparer des pages',
+'compare-selector' => 'Comparer les versions des pages',
+'compare-page1' => 'Page 1',
+'compare-page2' => 'Page 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Comparer',
+'compare-invalid-title' => "Le titre que vous avez spécifié n'est pas valide.",
+'compare-title-not-exists' => "Le titre que vous avez spécifié n'existe pas.",
+'compare-revision-not-exists' => "La révision que vous avez spécifié n'existe pas.",
# Database error messages
'dberr-header' => 'Ce wiki a un problème',
@@ -3824,4 +3904,90 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'sqlite-has-fts' => '$1 avec recherche en texte intégral supportée',
'sqlite-no-fts' => '$1 sans recherche en texte intégral supportée',
+# New logging system
+'logentry-delete-delete' => '$1 a supprimé la page $3',
+'logentry-delete-restore' => '$1 a restauré la page $3',
+'logentry-delete-event' => "$1 a modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-delete-revision' => "$1 a modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-delete-event-legacy' => '$1 a modifié la visibilité des événements du journal sur $3',
+'logentry-delete-revision-legacy' => '$1 a modifié la visibilité des révisions sur la page $3',
+'logentry-suppress-delete' => '$1 a supprimé la page $3',
+'logentry-suppress-event' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-suppress-revision' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
+'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
+'revdelete-content-hid' => 'contenu caché',
+'revdelete-summary-hid' => 'modifier le résumé caché',
+'revdelete-uname-hid' => "nom d'utilisateur caché",
+'revdelete-content-unhid' => 'contenu démasqué',
+'revdelete-summary-unhid' => 'modifier le résumé démasqué',
+'revdelete-uname-unhid' => "nom d'utilisateur démasqué",
+'revdelete-restricted' => 'a appliqué les restrictions aux administrateurs',
+'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
+'logentry-move-move' => '$1 a déplacé la page $3 vers $4',
+'logentry-move-move-noredirect' => '$1 a déplacé la page $3 vers $4 sans laisser de redirection',
+'logentry-move-move_redir' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection',
+'logentry-move-move_redir-noredirect' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
+'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme contrôlée',
+'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme contrôlée',
+'logentry-newusers-newusers' => '$1 a créé un compte utilisateur',
+'logentry-newusers-create' => '$1 a créé un compte utilisateur',
+'logentry-newusers-create2' => '$1 a créé un compte utilisateur $3',
+'logentry-newusers-autocreate' => 'Le compte $1 a été créé automatiquement',
+'newuserlog-byemail' => 'mot de passe envoyé par courriel',
+
+# Feedback
+'feedback-bugornote' => 'Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].
+Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d’utilisateur et le navigateur que vous utilisez.',
+'feedback-subject' => 'Objet :',
+'feedback-message' => 'Message :',
+'feedback-cancel' => 'Annuler',
+'feedback-submit' => 'Envoyer vos commentaires',
+'feedback-adding' => 'Ajout de vos commentaires à la page...',
+'feedback-error1' => "Erreur : Résultat de l'API non reconnu",
+'feedback-error2' => 'Erreur : la modification a échoué',
+'feedback-error3' => "Erreur : aucune réponse de l'API",
+'feedback-thanks' => 'Merci ! Votre commentaire a été publié sur la page "[$2 $1]".',
+'feedback-close' => 'Fait',
+'feedback-bugcheck' => 'Formidable ! Vérifiez simplement que ce n’est pas un des [$1 bogues déjà connus].',
+'feedback-bugnew' => "J'ai vérifié. Signaler un nouveau bogue",
+
+# API errors
+'api-error-badaccess-groups' => 'Vous n’êtes pas autorisé à verser des fichiers sur ce wiki.',
+'api-error-badtoken' => 'Erreur interne : mauvais « jeton ».',
+'api-error-copyuploaddisabled' => 'Les versements via URL sont désactivés sur ce serveur.',
+'api-error-duplicate' => 'Il y a déjà {{PLURAL:$1|[$2 un autre fichier présent]|[$2 d’autres fichiers présents]}} sur le site avec le même contenu.',
+'api-error-duplicate-archive' => 'Il y avait déjà {{PLURAL:$1|[$2 un autre fichier présent]|[$2 d’autres fichiers présents]}} sur le site avec le même contenu, mais {{PLURAL:$1|il a été supprimé|ils ont été supprimés}}.',
+'api-error-duplicate-archive-popup-title' => 'Dupliquer {{PLURAL:$1|le fichier|les fichiers}} qui {{PLURAL:$1|a déjà été supprimé|ont déjà été supprimés}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|fichier|fichiers}} en double',
+'api-error-empty-file' => 'Le fichier que vous avez soumis était vide.',
+'api-error-emptypage' => "Création de pages vide n'est pas autorisée.",
+'api-error-fetchfileerror' => 'Erreur interne : Quelque chose s’est mal passé lors de la récupération du fichier.',
+'api-error-file-too-large' => 'Le fichier que vous avez soumis était trop grand.',
+'api-error-filename-tooshort' => 'Le nom du fichier est trop court.',
+'api-error-filetype-banned' => 'Ce type de fichier est interdit.',
+'api-error-filetype-missing' => 'L’extension du fichier est manquante.',
+'api-error-hookaborted' => 'La modification que vous avez essayé de faire a été arrêtée par un crochet d’une extension.',
+'api-error-http' => 'Erreur interne : ne peut se connecter au serveur.',
+'api-error-illegal-filename' => 'Le nom du fichier n’est pas autorisé.',
+'api-error-internal-error' => 'Erreur interne : Quelque chose s’est mal passé lors du traitement de votre import sur le wiki.',
+'api-error-invalid-file-key' => 'Erreur interne : aucun fichier trouvé dans le stockage temporaire.',
+'api-error-missingparam' => 'Erreur interne : Il manque des paramètres dans la requête.',
+'api-error-missingresult' => 'Erreur interne : Nous n’avons pas pu déterminer si la copie avait réussi.',
+'api-error-mustbeloggedin' => 'Vous devez être connecté pour télécharger des fichiers.',
+'api-error-mustbeposted' => 'Il y a un bogue dans ce logiciel ; il n’utilise pas la méthode HTTP adéquate.',
+'api-error-noimageinfo' => 'Le téléversement a réussi, mais le serveur n’a pas donné d’informations sur le fichier.',
+'api-error-nomodule' => 'Erreur interne : aucun module de versement défini.',
+'api-error-ok-but-empty' => 'Erreur interne : Le serveur n’a pas répondu.',
+'api-error-overwrite' => 'Écraser un fichier existant n’est pas autorisé.',
+'api-error-stashfailed' => 'Erreur interne : le serveur n’a pas pu enregistrer le fichier temporaire.',
+'api-error-timeout' => 'Le serveur n’a pas répondu dans le délai imparti.',
+'api-error-unclassified' => 'Une erreur inconnue s’est produite',
+'api-error-unknown-code' => 'Erreur inconnue : « $1 »',
+'api-error-unknown-error' => 'Erreur interne : Quelque chose a mal tourné lors du versement de votre fichier.',
+'api-error-unknown-warning' => 'Avertissement inconnu : $1',
+'api-error-unknownerror' => 'Erreur inconnue : « $1 ».',
+'api-error-uploaddisabled' => 'Le versement est désactivé sur ce wiki.',
+'api-error-verification-error' => 'Ce fichier peut être corrompu, ou son extension est incorrecte.',
+
);
diff --git a/languages/messages/MessagesFrc.php b/languages/messages/MessagesFrc.php
index 18da6dba..1257ab2a 100644
--- a/languages/messages/MessagesFrc.php
+++ b/languages/messages/MessagesFrc.php
@@ -305,14 +305,13 @@ L'administrateur qui l'a barrée a donné cette explication: $1",
'cannotdelete' => "Impossible d'ôter la page ou le dossier choisi. (Il est possible que quèqu'une d'autre l'a déjà ôté.)",
'badtitle' => 'Mauvais titre',
'badtitletext' => 'Le titre que vous avez demandé était pas bon, vide, ou y avait un mauvais titre entre-langue ou entre-wiki. Ça pourrait avoir des caractères qui pouvont pas être usés dans les titres.',
-'perfcached' => 'Cette information est en cache et pourrait pas être courante.',
-'perfcachedts' => 'Cette information est en cache et le dernier changement a été fait $1.',
+'perfcached' => 'Cette information est en cache et pourrait pas être courante. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Cette information est en cache et le dernier changement a été fait $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "À présent, les renouvelages pour cette page sont barrés. L'information ici va pas être renouvelée t'à l'heure.",
'wrong_wfQuery_params' => 'Informaton incorrecte sus le wfQuery()<br />
Fonction: $1<br />
Demande: $2',
'viewsource' => 'Voir la source',
-'viewsourcefor' => 'pour $1',
'protectedpagetext' => 'Cette page est barrée pour empêcher des changements.',
'viewsourcetext' => 'Vous pouvez voir et copier la source de cette page:',
'protectedinterface' => "Cette page crée le texte de l'interface pour le software, et est barrée pour empêcher l'abus.",
@@ -455,9 +454,6 @@ Vous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrat
Notez donc que vous pouvez pas user la fonction 'envoyer un e-mail à cet useur' hormis que vous avez une adresse e-mail confirmée dans votre [[Special:Preferences|réglage de compte]] et vous avez la permission de l'user.
Votre numéro de blocage est #$5. Mettez donc cette information dans toutes vos demandes.",
-'blockedoriginalsource' => "La source de '''$1''' est montrée en bas.",
-'blockededitsource' => "Le texte de '''votres changements''' à '''$1''' est montré en bas.",
-'whitelistedittitle' => 'Il faut connecter pour faire des changements.',
'whitelistedittext' => 'Il faut $1 pour faire des changements.',
'confirmedittext' => "Il faut confirmer votre adresse e-mail pour faire des changements. Mettez et confirmez un adresse e-mail dans votre [[Special:Preferences|réglage de compte]], s'il vous plaît.",
'nosuchsectiontitle' => 'Aucune section pareille',
@@ -592,8 +588,6 @@ Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir
'revdelete-unsuppress' => 'Enlever les restrictions des versions rétablies',
'revdelete-log' => 'Raison:',
'revdelete-submit' => 'Appliquer à la version choisie',
-'revdelete-logentry' => 'La visibilité pour la version a été changée pour [[$1]]',
-'logdelete-logentry' => "La visibilité de l'événement a été changée pour [[$1]]",
'revdelete-success' => "'''Vous avez bien changé la visibilité des versions.'''",
'logdelete-success' => "'''Vous avez bien changé la visibilité des événements.'''",
@@ -680,9 +674,6 @@ Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir
'contribslink' => 'changes',
'block-log-flags-nocreate' => 'création de compte interdite',
-# Move page
-'1movedto2_redir' => 'déplacé [[$1]] vers [[$2]] en écrasant sa redirection',
-
# Tooltip help for the actions
'tooltip-pt-login' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier mais ce n’est pas obligatoire.',
'tooltip-ca-talk' => 'Discussion de cette page de contenu',
diff --git a/languages/messages/MessagesFrp.php b/languages/messages/MessagesFrp.php
index 86929a91..e423f348 100644
--- a/languages/messages/MessagesFrp.php
+++ b/languages/messages/MessagesFrp.php
@@ -26,8 +26,8 @@ $namespaceNames = array(
NS_MEDIA => 'Mèdia',
NS_SPECIAL => 'Spèciâl',
NS_TALK => 'Discussion',
- NS_USER => 'Utilisator',
- NS_USER_TALK => 'Discussion_utilisator',
+ NS_USER => 'Usanciér',
+ NS_USER_TALK => 'Discussion_usanciér',
NS_PROJECT_TALK => 'Discussion_$1',
NS_FILE => 'Fichiér',
NS_FILE_TALK => 'Discussion_fichiér',
@@ -42,17 +42,18 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Discutar' => NS_TALK,
+ 'Discutar' => NS_TALK,
+ 'Utilisator' => NS_USER,
'Discussion_Utilisator' => NS_USER_TALK,
- 'Émâge' => NS_FILE,
- 'Discussion_Émâge' => NS_FILE_TALK,
- 'Discussion_Modèlo' => NS_TEMPLATE_TALK,
- 'Discussion_Éde' => NS_HELP_TALK,
- 'Discussion_Catègorie' => NS_CATEGORY_TALK
+ 'Émâge' => NS_FILE,
+ 'Discussion_Émâge' => NS_FILE_TALK,
+ 'Discussion_Modèlo' => NS_TEMPLATE_TALK,
+ 'Discussion_Éde' => NS_HELP_TALK,
+ 'Discussion_Catègorie' => NS_CATEGORY_TALK
);
$specialPageAliases = array(
- 'Activeusers' => array( 'Utilisators_actifs', 'UtilisatorsActifs' ),
+ 'Activeusers' => array( 'Usanciérs_actifs', 'UsanciérsActifs' ),
'Allmessages' => array( 'Mèssâjos_sistèmo', 'MèssâjosSistèmo' ),
'Allpages' => array( 'Totes_les_pâges', 'TotesLesPâges' ),
'Ancientpages' => array( 'Pâges_les_muens_dèrriérement_changiês', 'PâgesLesMuensDèrriérementChangiês' ),
@@ -62,7 +63,7 @@ $specialPageAliases = array(
'Booksources' => array( 'Ôvres_de_refèrence', 'ÔvresDeRefèrence' ),
'BrokenRedirects' => array( 'Redirèccions_câsses', 'RedirèccionsCâsses' ),
'Categories' => array( 'Catègories' ),
- 'ChangePassword' => array( 'Changement_de_mot_de_pâssa', 'ChangementDeMotDePâssa' ),
+ 'ChangePassword' => array( 'Changement_de_contresegno', 'ChangementDeContresegno' ),
'Confirmemail' => array( 'Confirmar_l\'adrèce_èlèctronica', 'ConfirmarLAdrèceÈlèctronica' ),
'Contributions' => array( 'Contribucions' ),
'CreateAccount' => array( 'Fâre_un_compto', 'FâreUnCompto' ),
@@ -77,14 +78,14 @@ $specialPageAliases = array(
'Filepath' => array( 'Chemin_d\'accès_du_fichiér', 'CheminDAccèsDuFichiér' ),
'Import' => array( 'Importar', 'Importacion' ),
'Invalidateemail' => array( 'Envalidar_l\'adrèce_èlèctronica', 'EnvalidarLAdrèceÈlèctronica' ),
- 'BlockList' => array( 'Lista_des_blocâjos', 'ListaDesBlocâjos', 'Blocâjos', 'Utilisators_blocâs', 'UtilisatorsBlocâs', 'Adrèces_IP_blocâs', 'AdrècesIPBlocâs' ),
+ 'BlockList' => array( 'Lista_des_blocâjos', 'ListaDesBlocâjos', 'Blocâjos', 'Usanciérs_blocâs', 'UsanciérsBlocâs', 'Adrèces_IP_blocâs', 'AdrècesIPBlocâs' ),
'LinkSearch' => array( 'Rechèrche_de_lims', 'RechèrcheDeLims' ),
'Listadmins' => array( 'Lista_ux_administrators', 'ListaUxAdministrators' ),
'Listbots' => array( 'Lista_ux_bots', 'ListaUxBots' ),
'Listfiles' => array( 'Lista_des_fichiérs', 'ListaDesFichiérs', 'Lista_de_les_émâges', 'ListaDeLesÉmâges' ),
- 'Listgrouprights' => array( 'Lista_des_drêts_a_les_tropes_d\'utilisators', 'ListaDesDrêtsALesTropesDUtilisators' ),
+ 'Listgrouprights' => array( 'Lista_des_drêts_a_les_tropes_d\'usanciérs', 'ListaDesDrêtsALesTropesDUsanciérs' ),
'Listredirects' => array( 'Lista_de_les_redirèccions', 'ListaDeLesRedirèccions' ),
- 'Listusers' => array( 'Lista_ux_utilisators', 'ListaUxUtilisators', 'Utilisators' ),
+ 'Listusers' => array( 'Lista_ux_usanciérs', 'ListaUxUsanciérs', 'Usanciérs' ),
'Lockdb' => array( 'Vèrrolyér_la_bâsa_de_balyês', 'VèrrolyérLaBâsaDeBalyês' ),
'Log' => array( 'Jornal', 'Jornals' ),
'Lonelypages' => array( 'Pâges_orfenes', 'PâgesOrfenes' ),
@@ -132,7 +133,7 @@ $specialPageAliases = array(
'Upload' => array( 'Tèlèchargiér', 'Tèlèchargement' ),
'Userlogin' => array( 'Branchiér', 'Branchement' ),
'Userlogout' => array( 'Dèbranchiér', 'Dèbranchement' ),
- 'Userrights' => array( 'Drêts_d\'utilisator', 'DrêtsDUtilisator' ),
+ 'Userrights' => array( 'Drêts_d\'usanciér', 'DrêtsDUsanciér' ),
'Version' => array( 'Vèrsion' ),
'Wantedcategories' => array( 'Catègories_les_ples_demandâs', 'CatègoriesLesPlesDemandâs' ),
'Wantedfiles' => array( 'Fichiérs_los_ples_demandâs', 'FichiérsLosPlesDemandâs' ),
@@ -144,144 +145,149 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRÈCCION', '#REDIRECTION', '#REDIRECT' ),
- 'notoc' => array( '0', '__NION_SOMÈRO__', '__NIONA_TRÂBLA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__NIONA_GALERIE__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORCIÉR_LO_SOMÈRO__', '__FORCIÉR_LA_TRÂBLA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SOMÈRO__', '__TRÂBLA__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
- 'noeditsection' => array( '0', '__SÈCCION_QUE_PÔT_PAS_ÉTRE_CHANGIÊ__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__NION_EN_TÉTA___', '__AUCUNENTETE__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MÊS_D_ORA', 'MÊS_D_ORA_2', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MÊS_D_ORA_1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NOM_DU_MÊS_D_ORA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_D_ORA', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ABRÈV_DU_MÊS_D_ORA', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'JORN_D_ORA', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'JORN_D_ORA_2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOM_DU_JORN_D_ORA', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AN_D_ORA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HORÈRO_D_ORA', 'HORAIREACTUEL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HORA_D_ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MÊS_LOCAL', 'MÊS_LOCAL_2', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MÊS_LOCAL_1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NOM_DU_MÊS_LOCAL', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_LOCAL', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ABRÈV_DU_MÊS_LOCAL', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'JORN_LOCAL', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'JORN_LOCAL_2', 'JOUR2LOCAL', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOM_DU_JORN_LOCAL', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'AN_LOCAL', 'ANNEELOCALE', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'HORÈRO_LOCAL', 'HORAIRELOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'HORA_LOCALA', 'HEURELOCALE', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NOMBRO_DE_PÂGES', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NOMBRO_D_ARTICLLOS', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NOMBRO_DE_FICHIÉRS', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NOMBRO_D_UTILISATORS', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NOMBRO_D_UTILISATORS_ACTIFS', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NOMBRO_DE_CHANGEMENTS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NOMBRO_DE_VUES', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NOM_DE_LA_PÂGE', 'NOMPAGE', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NOM_DE_LA_PÂGE_URL', 'NOMPAGEX', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ÈSPÂÇO_DE_NOMS', 'ESPACENOMMAGE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ÈSPÂÇO_DE_NOMS_URL', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ÈSPÂÇO_DE_DISCUSSION', 'ESPACEDISCUSSION', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ÈSPÂÇO_DE_DISCUSSION_URL', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ÈSPÂÇO_DU_SUJÈT', 'ÈSPÂÇO_DE_L_ARTICLLO', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ÈSPÂÇO_DU_SUJÈT_URL', 'ÈSPÂÇO_DE_L_ARTICLLO_URL', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE_URL', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NOM_DE_LA_SOT_PÂGE', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOM_DE_LA_SOT_PÂGE_URL', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA_URL', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION_URL', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT_URL', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO_URL', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'msgnw' => array( '0', 'MSJNW:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'figura', 'vignette', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'figura=$1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'drêta', 'droite', 'right' ),
- 'img_left' => array( '1', 'gôche', 'gauche', 'left' ),
- 'img_none' => array( '1', 'vouedo', 'néant', 'neant', 'none' ),
- 'img_center' => array( '1', 'centrâ', 'centré', 'center', 'centre' ),
- 'img_framed' => array( '1', 'encâdrâ', 'câdro', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sen_câdro', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
- 'img_page' => array( '1', 'pâge=$1', 'pâge $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'bordura', 'bordure', 'border' ),
- 'img_baseline' => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'baseline' ),
- 'img_sub' => array( '1', 'segno', 'indice', 'ind', 'sub' ),
- 'img_super' => array( '1', 'èxposent', 'èxp', 'exposant', 'exp', 'super', 'sup' ),
- 'img_top' => array( '1', 'd\'amont', 'haut', 'top' ),
- 'img_text_top' => array( '1', 'tèxto-d\'amont', 'haut-texte', 'haut-txt', 'text-top' ),
- 'img_middle' => array( '1', 'entre-mié', 'milieu', 'middle' ),
- 'img_bottom' => array( '1', 'd\'avâl', 'bas', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tèxto-d\'avâl', 'bas-texte', 'bas-txt', 'text-bottom' ),
- 'img_link' => array( '1', 'lim=$1', 'lien=$1', 'link=$1' ),
- 'int' => array( '0', 'ENT:', 'INT:' ),
- 'sitename' => array( '1', 'NOM_DU_SETO', 'NOMSITE', 'SITENAME' ),
- 'ns' => array( '0', 'ÈDN:', 'ESPACEN:', 'NS:' ),
- 'nse' => array( '0', 'ÈDN_URL:', 'ESPACENX:', 'NSE:' ),
- 'localurl' => array( '0', 'URL_LOCALA:', 'URLLOCALE:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URL_LOCALA_URL:', 'URLLOCALEX:', 'LOCALURLE:' ),
- 'server' => array( '0', 'SÈRVOR', 'SERVEUR', 'SERVER' ),
- 'servername' => array( '0', 'NOM_DU_SÈRVOR', 'NOMSERVEUR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CHEMIN_DE_SCRIPTE', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMÈRE:', 'GRAMMAIRE:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GENRO:', 'GENRE:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__SEN_CONVÈRSION_DE_TITRO__', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__SEN_CONVÈRSION_DE_CONTEGNU__', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SEMANA_D_ORA', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'JDS_D_ORA', 'JDSACTUEL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'SEMANA_LOCALA', 'SEMAINELOCALE', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'JDS_LOCAL', 'JDSLOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ID_DE_LA_VÈRSION', 'IDVERSION', 'REVISIONID' ),
- 'revisionday' => array( '1', 'JORN_DE_LA_VÈRSION', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'JORN_DE_LA_VÈRSION_2', 'JOUR2VERSION', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MÊS_DE_LA_VÈRSION', 'MOISVERSION', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'AN_DE_LA_VÈRSION', 'ANNEEVERSION', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'DÂTA_ET_HORA_DE_LA_VÈRSION', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'UTILISATOR_DE_LA_VÈRSION', 'UTILISATEURVERSION', 'REVISIONUSER' ),
- 'plural' => array( '0', 'PLURÂL:', 'PLURIEL:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URL_COMPLÈTA:', 'URLCOMPLETE:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URL_COMPLÈTA_URL:', 'URLCOMPLETEX:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'PREMIÉRE_PETIÔTA_LÈTRA:', 'INITMINUS:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'PREMIÉRE_GRANTA_LÈTRA:', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
- 'lc' => array( '0', 'PETIÔTA_LÈTRA:', 'MINUS:', 'LC:' ),
- 'uc' => array( '0', 'GRANTA_LÈTRA:', 'MAJUS:', 'CAPIT:', 'UC:' ),
- 'raw' => array( '0', 'BRUTO:', 'BRUT:', 'RAW:' ),
- 'displaytitle' => array( '1', 'FÂRE_VÊRE_LO_TITRO', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'B', 'BRUT', 'R' ),
- 'newsectionlink' => array( '1', '__LIM_DE_NOVÈLA_SÈCCION__', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__NION_LIM_DE_NOVÈLA_SÈCCION__', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VÈRSION_D_ORA', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URL_ENCODÂ:', 'ENCODEURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ANCRO_ENCODÂ', 'ENCODEANCRE', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'DÂTA_ET_HORA_D_ORA', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'DÂTA_ET_HORA_LOCALA', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'MÂRCA_DE_DIRÈCCION', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#LENGOUA:', '#LANGUE:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'LENGOUA_DU_CONTEGNU', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PÂGES_DENS_L_ÈSPÂÇO_DE_NOMS:', 'PÂGES_DENS_L_ÈDN:', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NOMBRO_D_ADMINS', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMAT_NOMBRO', 'FORMATNOMBRE', 'FORMATNUM' ),
- 'padleft' => array( '0', 'BORRÂJO_A_GÔCHE', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
- 'padright' => array( '0', 'BORRÂJO_A_DRÊTA', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
- 'special' => array( '0', 'spèciâl', 'spécial', 'special' ),
- 'defaultsort' => array( '1', 'CLLÂF_DE_TRI:', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CHEMIN_D_ACCÈS:', 'CHEMIN:', 'FILEPATH:' ),
- 'tag' => array( '0', 'balisa', 'balise', 'tag' ),
- 'hiddencat' => array( '1', '__CATÈGORIE_CACHIÊ__', '__CATCACHEE__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PÂGES_DENS_LA_CATÈGORIE', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TALYE_DE_LA_PÂGE', 'TAILLEPAGE', 'PAGESIZE' ),
- 'index' => array( '1', '__ENDÈXE__', '__INDEX__' ),
- 'noindex' => array( '1', '__NION_ENDÈXE__', '__AUCUNINDEX__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NOMBRO_D_UTILISATORS_DENS_LA_TROPA', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__REDIRÈCCION_IMOBILA__', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVÉL_DE_PROTÈCCION', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'format_de_dâta', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#REDIRÈCCION', '#REDIRECTION', '#REDIRECT' ),
+ 'notoc' => array( '0', '__NION_SOMÈRO__', '__NIONA_TRÂBLA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__NIONA_GALERIE__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORCIÉR_LO_SOMÈRO__', '__FORCIÉR_LA_TRÂBLA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SOMÈRO__', '__TRÂBLA__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__SÈCCION_QUE_PÔT_PAS_ÉTRE_CHANGIÊ__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__NION_EN_TÉTA__', '__AUCUNENTETE__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MÊS_D_ORA', 'MÊS_D_ORA_2', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MÊS_D_ORA_1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NOM_DU_MÊS_D_ORA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_D_ORA', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ABRÈV_DU_MÊS_D_ORA', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'JORN_D_ORA', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'JORN_D_ORA_2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOM_DU_JORN_D_ORA', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AN_D_ORA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HORÈRO_D_ORA', 'HORAIREACTUEL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HORA_D_ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MÊS_LOCAL', 'MÊS_LOCAL_2', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MÊS_LOCAL_1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NOM_DU_MÊS_LOCAL', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'GÈNITIF_DU_NOM_DU_MÊS_LOCAL', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ABRÈV_DU_MÊS_LOCAL', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'JORN_LOCAL', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'JORN_LOCAL_2', 'JOUR2LOCAL', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOM_DU_JORN_LOCAL', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'AN_LOCAL', 'ANNEELOCALE', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'HORÈRO_LOCAL', 'HORAIRELOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'HORA_LOCALA', 'HEURELOCALE', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NOMBRO_DE_PÂGES', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NOMBRO_D_ARTICLLOS', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NOMBRO_DE_FICHIÉRS', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NOMBRO_D_USANCIÉRS', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NOMBRO_D_USANCIÉRS_ACTIFS', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NOMBRO_DE_CHANGEMENTS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NOMBRO_DE_VUES', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NOM_DE_LA_PÂGE', 'NOMPAGE', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NOM_DE_LA_PÂGE_URL', 'NOMPAGEX', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ÈSPÂÇO_DE_NOMS', 'ESPACENOMMAGE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ÈSPÂÇO_DE_NOMS_URL', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ÈSPÂÇO_DE_DISCUSSION', 'ESPACEDISCUSSION', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ÈSPÂÇO_DE_DISCUSSION_URL', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ÈSPÂÇO_DU_SUJÈT', 'ÈSPÂÇO_DE_L_ARTICLLO', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ÈSPÂÇO_DU_SUJÈT_URL', 'ÈSPÂÇO_DE_L_ARTICLLO_URL', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NOM_COMPLÈT_DE_LA_PÂGE_URL', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOM_DE_LA_SOT_PÂGE', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOM_DE_LA_SOT_PÂGE_URL', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NOM_DE_LA_PÂGE_DE_BÂSA_URL', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NOM_DE_LA_PÂGE_DE_DISCUSSION_URL', 'NOMPAGEDISCUSSIONX', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO', 'NOMPAGESUJET', 'NOMPAGEARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NOM_DE_LA_PÂGE_DU_SUJÈT_URL', 'NOM_DE_LA_PÂGE_DE_L_ARTICLLO_URL', 'NOMPAGESUJETX', 'NOMPAGEARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'MSJ:', 'MSG:' ),
+ 'msgnw' => array( '0', 'MSJNV:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'figura', 'vignette', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'figura=$1', 'vignette=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'drêta', 'droite', 'right' ),
+ 'img_left' => array( '1', 'gôche', 'gauche', 'left' ),
+ 'img_none' => array( '1', 'vouedo', 'néant', 'neant', 'none' ),
+ 'img_center' => array( '1', 'centrâ', 'centré', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'encâdrâ', 'câdro', 'cadre', 'encadré', 'encadre', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'sen_câdro', 'pas_encâdrâ', 'sans_cadre', 'non_encadré', 'non_encadre', 'frameless' ),
+ 'img_page' => array( '1', 'pâge=$1', 'pâge $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'drêt', 'drêt=$1', 'drêt $1', 'redresse', 'redresse=$1', 'redresse $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'bordura', 'bordure', 'border' ),
+ 'img_baseline' => array( '1', 'legne_de_bâsa', 'ligne_de_base', 'base', 'baseline' ),
+ 'img_sub' => array( '1', 'segno', 'indice', 'ind', 'sub' ),
+ 'img_super' => array( '1', 'èxposent', 'èxp', 'exposant', 'exp', 'super', 'sup' ),
+ 'img_top' => array( '1', 'd\'amont', 'haut', 'top' ),
+ 'img_text_top' => array( '1', 'tèxto-d\'amont', 'haut-texte', 'haut-txt', 'text-top' ),
+ 'img_middle' => array( '1', 'entre-mié', 'milieu', 'middle' ),
+ 'img_bottom' => array( '1', 'd\'avâl', 'bas', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tèxto-d\'avâl', 'bas-texte', 'bas-txt', 'text-bottom' ),
+ 'img_link' => array( '1', 'lim=$1', 'lien=$1', 'link=$1' ),
+ 'int' => array( '0', 'ENT:', 'INT:' ),
+ 'sitename' => array( '1', 'NOM_DU_SETO', 'NOMSITE', 'SITENAME' ),
+ 'ns' => array( '0', 'ÈDN:', 'ESPACEN:', 'NS:' ),
+ 'nse' => array( '0', 'ÈDN_URL:', 'ESPACENX:', 'NSE:' ),
+ 'localurl' => array( '0', 'URL_LOCALA:', 'URLLOCALE:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URL_LOCALA_URL:', 'URLLOCALEX:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'CHEMIN_DE_L_ARTICLLO', 'CHEMINARTICLE', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'SÈRVOR', 'SERVEUR', 'SERVER' ),
+ 'servername' => array( '0', 'NOM_DU_SÈRVOR', 'NOMSERVEUR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CHEMIN_DU_SCRIPTE', 'CHEMINSCRIPT', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'CHEMIN_DU_STILO', 'CHEMINSTYLE', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMÈRE:', 'GRAMMAIRE:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GENRO:', 'GENRE:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__SEN_CONVÈRSION_DE_TITRO__', '__SENCDT__', '__SANSCONVERSIONTITRE__', '__SANSCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__SEN_CONVÈRSION_DE_CONTEGNU__', '__SENCDC__', '__SANSCONVERSIONCONTENU__', '__SANSCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SEMANA_D_ORA', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'JDS_D_ORA', 'JDSACTUEL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'SEMANA_LOCALA', 'SEMAINELOCALE', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'JDS_LOCAL', 'JDSLOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'NUMERÔ_DE_LA_VÈRSION', 'IDVERSION', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'JORN_DE_LA_VÈRSION', 'JOURVERSION', 'JOUR1VERSION', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'JORN_DE_LA_VÈRSION_2', 'JOUR2VERSION', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MÊS_DE_LA_VÈRSION', 'MOISVERSION', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'MÊS_DE_LA_VÈRSION_1', 'MOISVERSION1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'AN_DE_LA_VÈRSION', 'ANNEEVERSION', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'DÂTA_ET_HORA_DE_LA_VÈRSION', 'INSTANTVERSION', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'USANCIÉR_DE_LA_VÈRSION', 'UTILISATEURVERSION', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'PLURÂL:', 'PLURIEL:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URL_COMPLÈTA:', 'URLCOMPLETE:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URL_COMPLÈTA_URL:', 'URLCOMPLETEX:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'PREMIÉRE_PETIÔTA_LÈTRA:', 'INITMINUS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'PREMIÉRE_GRANTA_LÈTRA:', 'INITMAJUS:', 'INITCAPIT:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'PETIÔTA_LÈTRA:', 'MINUS:', 'LC:' ),
+ 'uc' => array( '0', 'GRANTA_LÈTRA:', 'MAJUS:', 'CAPIT:', 'UC:' ),
+ 'raw' => array( '0', 'BRUTO:', 'BRUT:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'FÂRE_VÊRE_LO_TITRO', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'B', 'BRUT', 'R' ),
+ 'newsectionlink' => array( '1', '__LIM_DE_NOVÈLA_SÈCCION__', '__LIENNOUVELLESECTION__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__NION_LIM_DE_NOVÈLA_SÈCCION__', '__AUCUNLIENNOUVELLESECTION__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VÈRSION_D_ORA', 'VERSIONACTUELLE', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URL_ENCODÂ:', 'ENCODEURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ANCRO_ENCODÂ', 'ENCODEANCRE', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'DÂTA_ET_HORA_D_ORA', 'INSTANTACTUEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'DÂTA_ET_HORA_LOCALA', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'MÂRCA_DE_DIRÈCCION', 'MARQUEDIRECTION', 'MARQUEDIR', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#LENGOUA:', '#LANGUE:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'LENGOUA_DU_CONTEGNU', 'LANGUECONTENU', 'LANGCONTENU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PÂGES_DENS_L_ÈSPÂÇO_DE_NOMS:', 'PÂGES_DENS_L_ÈDN:', 'PAGESDANSESPACE:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NOMBRO_D_ADMINS', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMAT_NOMBRO', 'FORMATNOMBRE', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'BORRÂJO_A_GÔCHE', 'BOURRAGEGAUCHE', 'BOURREGAUCHE', 'PADLEFT' ),
+ 'padright' => array( '0', 'BORRÂJO_A_DRÊTA', 'BOURRAGEDROITE', 'BOURREDROITE', 'PADRIGHT' ),
+ 'special' => array( '0', 'spèciâl', 'spécial', 'special' ),
+ 'defaultsort' => array( '1', 'CLLÂF_DE_TRI:', 'CLEFDETRI:', 'CLEDETRI:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CHEMIN_D_ACCÈS:', 'CHEMIN:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'balisa', 'balise', 'tag' ),
+ 'hiddencat' => array( '1', '__CATÈGORIE_CACHIÊ__', '__CATCACHEE__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PÂGES_DENS_LA_CATÈGORIE', 'PAGESDANSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TALYE_DE_LA_PÂGE', 'TAILLEPAGE', 'PAGESIZE' ),
+ 'index' => array( '1', '__ENDÈXE__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NION_ENDÈXE__', '__AUCUNINDEX__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NOMBRO_D_USANCIÉRS_DENS_LA_TROPA', 'NOMBREDANSGROUPE', 'NBDANSGROUPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__REDIRÈCCION_IMOBILA__', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVÉL_DE_PROTÈCCION', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'format_de_dâta', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'CHEMIN', 'PATH' ),
+ 'url_wiki' => array( '0', 'VOUIQUI', 'WIKI' ),
);
$linkTrail = '/^([a-zàâçéèêîœôû·’æäåÄăëēïīòöÅùü‘]+)(.*)$/sDu';
@@ -662,23 +668,25 @@ La volyéd signalar a un [[Special:ListUsers/sysop|administrator]] sen oubliar d
'badarticleerror' => 'Cela accion pôt pas étre fêta sur ceta pâge.',
'cannotdelete' => 'Empossiblo de suprimar la pâge ou ben lo fichiér « $1 ».
La suprèssion at pôt-étre ja étâ fêta per quârqu’un d’ôtro.',
+'cannotdelete-title' => 'Empossiblo de suprimar la pâge « $1 »',
'badtitle' => 'Crouyo titro',
'badtitletext' => 'Lo titro de pâge demandâ est fôx, vouedo, ou ben o est un titro entèrlengoua ou entèrvouiqui mâl-liyê.
Contint sûrement yon ou ben un mouél de caractèros que pôvont pas étre utilisâs dens los titros.',
-'perfcached' => 'Cetes balyês sont en cache et pôvont pas étre a jorn.',
-'perfcachedts' => 'Cetes balyês sont en cache, sont vêr pas forciêment a jorn. La dèrriére actualisacion dâte du $1.',
+'perfcached' => 'Cetes balyês sont en cache et pôvont pas étre a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Cetes balyês sont en cache, sont vêr pas forciêment a jorn. La dèrriére actualisacion dâte du $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ora, les mises a jorn por ceta pâge sont dèsactivâs.
Les balyês ce-desot sont pas betâs a jorn.',
'wrong_wfQuery_params' => 'Paramètres fôx dessus wfQuery()<br />
Fonccion : $1<br />
Requéta : $2',
'viewsource' => 'Vêre lo tèxto sôrsa',
-'viewsourcefor' => 'por $1',
+'viewsource-title' => 'Vêre la sôrsa de $1',
'actionthrottled' => 'Accion limitâ',
'actionthrottledtext' => 'Por combatre lo spame, la frèquence d’ègzécucion de cela accion est limitâ dens un moment prod côrt, et vos éd dèpassâ ceta limita.
Volyéd tornar èprovar dens doux-três menutes.',
'protectedpagetext' => 'Ceta pâge at étâ protègiê por empachiér son changement.',
'viewsourcetext' => 'Vos pouede vêre et copiyér lo tèxto sôrsa de la pâge :',
+'viewyourtext' => "Vos pouede vêre et copiyér lo contegnu de '''voutros changements''' a ceta pâge :",
'protectedinterface' => 'Ceta pâge fât de tèxto d’entèrface por la programeria et est protègiê por èvitar los abus.',
'editinginterface' => "'''Atencion :''' vos éte aprés changiér una pâge utilisâ por fâre lo tèxto d’entèrface por la programeria.
Los changements sè cognetront, d’aprés lo contèxto, sur totes ou ben quârques pâges visibles per los ôtros usanciérs.
@@ -788,6 +796,7 @@ Nion mèssâjo serat mandâ por châcuna de cetes fonccions.',
'emailconfirmlink' => 'Confirmâd voutra adrèce èlèctronica',
'invalidemailaddress' => 'Ceta adrèce èlèctronica pôt pas étre accèptâ perce que semble avêr un format fôx.
Volyéd buchiér una adrèce bien formatâ ou ben lèssiér cél champ vouedo.',
+'cannotchangeemail' => 'Les adrèces èlèctroniques des comptos pôvont pas étre changiês sur ceti vouiqui.',
'accountcreated' => 'Compto fêt.',
'accountcreatedtext' => 'Lo compto usanciér por $1 at étâ fêt.',
'createaccount-title' => 'Crèacion d’un compto por {{SITENAME}}',
@@ -804,6 +813,7 @@ Volyéd atendre devant que tornar èprovar.',
# E-mail sending
'php-mail-error-unknown' => 'Èrror encognua dens la fonccion mail() de PHP.',
+'user-mail-no-addy' => 'Tâchiê de mandar un mèssâjo sen adrèce èlèctronica',
# Change password dialog
'resetpass' => 'Changiér lo contresegno',
@@ -826,16 +836,18 @@ Vos éd pôt-étre ja changiê voutron contresegno avouéc reusséta ou ben dema
'resetpass-temp-password' => 'Contresegno temporèro :',
# Special:PasswordReset
-'passwordreset' => 'Tornar inicialisar lo contresegno',
-'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de rapèl des dètalys de voutron compto.',
-'passwordreset-legend' => 'Tornar inicialisar lo contresegno',
-'passwordreset-disabled' => 'La remisa a zérô des contresegnos at étâ dèsactivâ sur ceti vouiqui.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yon des bocons de balyês ce-desot}}',
-'passwordreset-username' => 'Nom d’usanciér :',
-'passwordreset-domain' => 'Domêno :',
-'passwordreset-email' => 'Adrèce èlèctronica :',
-'passwordreset-emailtitle' => 'Dètalys du compto dessus {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Quârqu’un (probâblament vos, avouéc l’adrèce IP $1) at demandâ un rapèl des dètalys
+'passwordreset' => 'Tornar inicialisar lo contresegno',
+'passwordreset-text' => 'Rempléd ceti formulèro por recêvre un mèssâjo de rapèl des dètalys de voutron compto.',
+'passwordreset-legend' => 'Tornar inicialisar lo contresegno',
+'passwordreset-disabled' => 'La remisa a zérô des contresegnos at étâ dèsactivâ sur ceti vouiqui.',
+'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yon des bocons de balyês ce-desot}}',
+'passwordreset-username' => 'Nom d’usanciér :',
+'passwordreset-domain' => 'Domêno :',
+'passwordreset-capture' => 'Vêre lo mèssâjo que rèsulte ?',
+'passwordreset-capture-help' => 'Se vos pouentâd cela câsa, lo mèssâjo (avouéc lo contresegno temporèro) vos serat montrâ en mémo temps que serat mandâ a l’usanciér.',
+'passwordreset-email' => 'Adrèce èlèctronica :',
+'passwordreset-emailtitle' => 'Dètalys du compto dessus {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Quârqu’un (probâblament vos, avouéc l’adrèce IP $1) at demandâ un rapèl des dètalys
de voutron compto por {{SITENAME}} ($4). {{PLURAL:$3|Ceti compto usanciér est associyê|Cetos comptos usanciérs sont associyês}}
a cela adrèce èlèctronica :
@@ -845,7 +857,7 @@ $2
Ora, vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos,
ou ben se vos vos rapelâd ora de voutron contresegno originâl et que vos souhètâd pas més nen changiér,
vos pouede ignorar ceti mèssâjo et continuar a utilisar voutron viely contresegno.',
-'passwordreset-emailtext-user' => 'L’usanciér $1 dessus {{SITENAME}} at demandâ un rapèl des dètalys
+'passwordreset-emailtext-user' => 'L’usanciér $1 dessus {{SITENAME}} at demandâ un rapèl des dètalys
de voutron compto por {{SITENAME}} ($4). {{PLURAL:$3|Ceti compto usanciér est associyê|Cetos comptos usanciérs sont associyês}}
a cela adrèce èlèctronica :
@@ -855,9 +867,22 @@ $2
Ora, vos vos dête branchiér et pués chouèsir un contresegno novél. Se cela demanda vint pas de vos,
ou ben se vos vos rapelâd ora de voutron contresegno originâl et que vos souhètâd pas més nen changiér,
vos pouede ignorar ceti mèssâjo et continuar a utilisar voutron viely contresegno.',
-'passwordreset-emailelement' => 'Nom d’usanciér : $1
+'passwordreset-emailelement' => 'Nom d’usanciér : $1
Contresegno temporèro : $2',
-'passwordreset-emailsent' => 'Un mèssâjo de rapèl at étâ mandâ.',
+'passwordreset-emailsent' => 'Un mèssâjo de rapèl at étâ mandâ.',
+'passwordreset-emailsent-capture' => 'Un mèssâjo de rapèl at étâ mandâ, qu’est montrâ ce-desot.',
+'passwordreset-emailerror-capture' => 'Un mèssâjo de rapèl at étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’usanciér at pas reussia : $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Changiér l’adrèce èlèctronica',
+'changeemail-header' => 'Changiér l’adrèce èlèctronica',
+'changeemail-text' => 'Rempléd ceti formulèro por changiér voutra adrèce èlèctronica. Vos devréd buchiér voutron contresegno por confirmar cél changement.',
+'changeemail-no-info' => 'Vos dête étre branchiê por avêr accès a cela pâge.',
+'changeemail-oldemail' => 'Adrèce èlèctronica d’ora :',
+'changeemail-newemail' => 'Novèla adrèce èlèctronica :',
+'changeemail-none' => '(niona)',
+'changeemail-submit' => 'Changiér l’adrèce èlèctronica',
+'changeemail-cancel' => 'Anular',
# Edit page toolbar
'bold_sample' => 'Tèxto en grâs',
@@ -929,9 +954,6 @@ Notâd que vos porréd pas utilisar la fonccionalitât « Lui mandar un mèssâj
Voutra adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
Volyéd spècefiar cetes endicacions dens totes les requétes que vos faréd.",
'blockednoreason' => 'gins de rêson balyê',
-'blockedoriginalsource' => "Lo tèxto sôrsa de '''$1''' est montrâ ce-desot :",
-'blockededitsource' => "Lo contegnu de '''voutros changements''' aplicâs a '''$1''' est montrâ ce-desot :",
-'whitelistedittitle' => 'Branchement nècèssèro por changiér lo contegnu',
'whitelistedittext' => 'Vos dête étre $1 por avêr la pèrmission de changiér lo contegnu.',
'confirmedittext' => 'Vos dête confirmar voutra adrèce èlèctronica devant que changiér les pâges.
Volyéd buchiér et pués validar voutra adrèce èlèctronica dens voutres [[Special:Preferences|prèferences]].',
@@ -1197,8 +1219,6 @@ Los ôtros administrators de {{SITENAME}} porront tojorn arrevar u contegnu cach
'revdelete-unsuppress' => 'Enlevar les rèstriccions sur les vèrsions refêtes',
'revdelete-log' => 'Rêson :',
'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la vèrsion chouèsia|les vèrsions chouèsies}}',
-'revdelete-logentry' => 'at changiê la visibilitât de la vèrsion de [[$1]]',
-'logdelete-logentry' => 'at changiê la visibilitât de l’entrâ de [[$1]]',
'revdelete-success' => "'''Visibilitât de la vèrsion betâ a jorn avouéc reusséta.'''",
'revdelete-failure' => "'''La visibilitât de la vèrsion at pas possu étre betâ a jorn :'''
$1",
@@ -1210,15 +1230,6 @@ $1",
'revdel-restore-visible' => 'vèrsions visibles',
'pagehist' => 'Historico de la pâge',
'deletedhist' => 'Historico suprimâ',
-'revdelete-content' => 'contegnu',
-'revdelete-summary' => 'rèsumâ du changement',
-'revdelete-uname' => 'nom d’usanciér',
-'revdelete-restricted' => 'at aplicâ les rèstriccions ux administrators',
-'revdelete-unrestricted' => 'rèstriccions enlevâs por los administrators',
-'revdelete-hid' => 'at cachiê $1',
-'revdelete-unhid' => 'at montrâ $1',
-'revdelete-log-message' => '$1 por $2 vèrsion{{PLURAL:$2||s}}',
-'logdelete-log-message' => '$1 sur $2 entrâ{{PLURAL:$2||s}}',
'revdelete-hide-current' => 'Èrror pendent la suprèssion de l’èlèment datâ du $1 a $2 : o est la vèrsion d’ora.
Pôt pas étre suprimâ.',
'revdelete-show-no-access' => 'Èrror pendent la visualisacion de l’èlèment datâ du $1 a $2 : il est marcâ coment « rètrent ».
@@ -1378,12 +1389,14 @@ Atencion, lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
'prefs-rc' => 'Dèrriérs changements',
'prefs-watchlist' => 'Lista de survelyence',
'prefs-watchlist-days' => 'Nombro de jorns a fâre vêre dens la lista de survelyence :',
-'prefs-watchlist-days-max' => '7 jorns u més',
+'prefs-watchlist-days-max' => '$1 jorn{{PLURAL:$1||s}} u més',
'prefs-watchlist-edits' => 'Nombro de changements a fâre vêre dens la lista de survelyence ètendua :',
'prefs-watchlist-edits-max' => 'Nombro lo ples grant : 1000',
'prefs-watchlist-token' => 'Jeton por la lista de survelyence :',
'prefs-misc' => 'Prèferences de totes sôrtes',
'prefs-resetpass' => 'Changiér lo contresegno',
+'prefs-changeemail' => 'Changiér l’adrèce èlèctronica',
+'prefs-setemail' => 'Configurar l’adrèce èlèctronica',
'prefs-email' => 'Chouèx de mèssageria èlèctronica',
'prefs-rendering' => 'Aparence',
'saveprefs' => 'Encartar les prèferences',
@@ -1443,6 +1456,7 @@ Cen pôt pas étre dèfêt.',
'yourrealname' => 'Veré nom :',
'yourlanguage' => 'Lengoua de l’entèrface :',
'yourvariant' => 'Varianta de la lengoua du contegnu :',
+'prefs-help-variant' => 'Voutra varianta ou ben ortografia prèferâ por nen fâre vêre les pâges de contegnu de ceti vouiqui.',
'yournick' => 'Signatura por les discussions :',
'prefs-help-signature' => 'Los comentèros sur les pâges de discussion dêvont étre signês avouéc « <nowiki>~~~~</nowiki> », que serat convèrti per voutra signatura avouéc la dâta.',
'badsig' => 'Signatura bruta fôssa.
@@ -1484,7 +1498,7 @@ Ceta enformacion serat publica.',
'userrights-lookup-user' => 'Administracion a les tropes d’usanciérs',
'userrights-user-editname' => 'Buchiéd un nom d’usanciér :',
'editusergroup' => 'Changiér les tropes a l’usanciér',
-'editinguser' => "Changement des drêts d’utilisator a '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Changement des drêts d’usanciér a l’usanciér '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Changiér les tropes a l’usanciér',
'saveusergroups' => 'Encartar les tropes a l’usanciér',
'userrights-groupsmember' => 'Membro de :',
@@ -1578,13 +1592,13 @@ Ceta enformacion serat publica.',
'right-autopatrol' => 'Avêr sos changements marcâs ôtomaticament coment survelyês',
'right-patrolmarks' => 'Vêre los marcâjos de survelyence dens los dèrriérs changements',
'right-unwatchedpages' => 'Vêre la lista de les pâges pas siuvues',
-'right-trackback' => 'Apondre des rètrolims',
'right-mergehistory' => 'Fusionar los historicos de les pâges',
'right-userrights' => 'Changiér tôs los drêts a un usanciér',
'right-userrights-interwiki' => 'Changiér los drêts ux usanciérs sur d’ôtros vouiquis',
'right-siteadmin' => 'Vèrrolyér ou dèvèrrolyér la bâsa de balyês',
'right-override-export-depth' => 'Èxportar les pâges en encllusent les pâges liyês tant qu’a una provondior de 5 nivéls',
'right-sendemail' => 'Mandar un mèssâjo ux ôtros usanciérs',
+'right-passwordreset' => 'Vêre los mèssâjos de remisa a zérô des contresegnos',
# User rights log
'rightslog' => 'Jornal des changements de statut d’usanciér',
@@ -1618,16 +1632,17 @@ Ceta enformacion serat publica.',
'action-suppressionlog' => 'vêre cél jornal privâ',
'action-block' => 'blocar en ècritura cél usanciér',
'action-protect' => 'changiér los nivéls de protèccion por cela pâge',
+'action-rollback' => 'rèvocar rêdo los changements u dèrriér usanciér qu’at changiê una pâge spècefica',
'action-import' => 'importar cela pâge dês un ôtro vouiqui',
'action-importupload' => 'importar cela pâge dês un fichiér tèlèchargiê',
'action-patrol' => 'marcar lo changement ux ôtros coment survelyê',
'action-autopatrol' => 'avêr voutron changement marcâ coment survelyê',
'action-unwatchedpages' => 'vêre la lista de les pâges pas siuvues',
-'action-trackback' => 'apondre un rètrolim',
'action-mergehistory' => 'fusionar l’historico de cela pâge',
'action-userrights' => 'changiér tôs los drêts d’usanciér',
'action-userrights-interwiki' => 'changiér los drêts ux usanciérs sur d’ôtros vouiquis',
'action-siteadmin' => 'vèrrolyér ou ben dèvèrrolyér la bâsa de balyês',
+'action-sendemail' => 'mandar des mèssâjos',
# Recent changes
'nchanges' => '$1 changement{{PLURAL:$1||s}}',
@@ -1714,6 +1729,7 @@ Vêde la [[Special:NewFiles|galerie des novéls fichiérs]] por una presentacion
'minlength1' => 'Los noms de fichiér dêvont comprendre u muens yona lètra.',
'illegalfilename' => 'Lo nom de fichiér « $1 » contint des caractèros dèfendus dens los titros de pâges.
Lo volyéd renomar et pués lo tornar tèlèchargiér.',
+'filename-toolong' => 'Lo nom du fichiér pôt pas dèpassar 240 octèts.',
'badfilename' => 'Lo fichiér at étâ renomâ en « $1 ».',
'filetype-mime-mismatch' => 'L’èxtension du fichiér « .$1 » corrèspond pas u tipo MIME dècelâ du fichiér ($2).',
'filetype-badmime' => 'Los fichiérs du tipo MIME « $1 » pôvont pas étre tèlèchargiês.',
@@ -1831,6 +1847,35 @@ Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administ
'upload-unknown-size' => 'Talye encognua',
'upload-http-error' => 'Una èrror HTTP est arrevâ : $1',
+# File backend
+'backend-fail-stream' => 'Empossiblo de liére lo fichiér $1.',
+'backend-fail-backup' => 'Empossiblo de sôvar lo fichiér $1.',
+'backend-fail-notexists' => 'Lo fichiér $1 ègziste pas.',
+'backend-fail-hashes' => 'Empossiblo d’avêr los chaplâjos du fichiér por comparèson.',
+'backend-fail-notsame' => 'Un fichiér difèrent ègziste ja por $1 .',
+'backend-fail-invalidpath' => '$1 est pas un chemin de stocâjo valido.',
+'backend-fail-delete' => 'Empossiblo de suprimar lo fichiér $1.',
+'backend-fail-alreadyexists' => 'Lo fichiér $1 ègziste ja.',
+'backend-fail-store' => 'Empossiblo de stocar lo fichiér $1 en $2.',
+'backend-fail-copy' => 'Empossiblo de copiyér lo fichiér $1 vers $2.',
+'backend-fail-move' => 'Empossiblo de dèplaciér lo fichiér $1 vers $2.',
+'backend-fail-opentemp' => 'Empossiblo d’uvrir lo fichiér temporèro.',
+'backend-fail-writetemp' => 'Empossiblo d’ècrire dedens lo fichiér temporèro.',
+'backend-fail-closetemp' => 'Empossiblo de cllôre lo fichiér temporèro.',
+'backend-fail-read' => 'Empossiblo de liére lo fichiér $1.',
+'backend-fail-create' => 'Empossiblo de fâre lo fichiér $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Empossiblo de dèvèrrolyér « $1 » ; el est pas vèrrolyê.',
+'lockmanager-fail-closelock' => 'Empossiblo de cllôre lo fichiér de vèrroly por « $1 ».',
+'lockmanager-fail-deletelock' => 'Empossiblo de suprimar lo fichiér de vèrroly por « $1 ».',
+'lockmanager-fail-acquirelock' => 'Empossiblo d’avêr lo vèrroly por « $1 ».',
+'lockmanager-fail-openlock' => 'Empossiblo d’uvrir lo fichiér de vèrroly por « $1 ».',
+'lockmanager-fail-releaselock' => 'Empossiblo de relâchiér lo vèrroly por « $1 ».',
+'lockmanager-fail-db-bucket' => 'Empossiblo de sè veriér vers prod de bâses de balyês de vèrrolyâjo dedens lo godèt $1.',
+'lockmanager-fail-db-release' => 'Empossiblo de relâchiér los vèrrolys sur la bâsa de balyês $1.',
+'lockmanager-fail-svr-release' => 'Empossiblo de relâchiér los vèrrolys sur lo sèrvor $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Una èrror est arrevâ pendent l’uvèrtura du fichiér ZIP por contrôlo.',
'zip-wrong-format' => 'Lo fichiér spècefiâ est pas un fichiér ZIP.',
@@ -1847,6 +1892,7 @@ Pôt pas étre controlâ tot drêt por la sècuritât.',
'uploadstash-badtoken' => 'L’ègzécucion de cela accion at pas reussia, pôt-étre perce que voutres enformacions de branchement ont èxpirâs. Tornâd èprovar.',
'uploadstash-errclear' => 'L’èfacement des fichiérs at pas reussi.',
'uploadstash-refresh' => 'Rafrèchir la lista des fichiérs',
+'invalid-chunk-offset' => 'Comencement de bocon envalido',
# img_auth script messages
'img-auth-accessdenied' => 'Accès refusâ',
@@ -1956,23 +2002,24 @@ La dèscripcion de sa [$2 pâge de dèscripcion] est montrâ ce-desot.',
'filerevert-badversion' => 'Y at gins de vèrsion ples vielye du fichiér avouéc la dâta balyê.',
# File deletion
-'filedelete' => 'Suprimar $1',
-'filedelete-legend' => 'Suprimar lo fichiér',
-'filedelete-intro' => "Vos éte prèst a suprimar '''[[Media:$1|$1]]''' et pués tot son historico.",
-'filedelete-intro-old' => "Vos éte aprés suprimar la vèrsion de '''[[Media:$1|$1]]''' du [$4 $2 a $3].",
-'filedelete-comment' => 'Rêson :',
-'filedelete-submit' => 'Suprimar',
-'filedelete-success' => "'''$1''' at étâ suprimâ.",
-'filedelete-success-old' => "La vèrsion de '''[[Media:$1|$1]]''' du $2 a $3 at étâ suprimâ.",
-'filedelete-nofile' => "'''$1''' ègziste pas.",
-'filedelete-nofile-old' => "Ègziste gins de vèrsion arch·ivâ de '''$1''' avouéc los atributs spècefiâs.",
-'filedelete-otherreason' => 'Ôtra rêson / rêson de ples :',
-'filedelete-reason-otherlist' => 'Ôtra rêson',
-'filedelete-reason-dropdown' => '* Rêsons de suprèssion les ples corentes
+'filedelete' => 'Suprimar $1',
+'filedelete-legend' => 'Suprimar lo fichiér',
+'filedelete-intro' => "Vos éte prèst a suprimar '''[[Media:$1|$1]]''' et pués tot son historico.",
+'filedelete-intro-old' => "Vos éte aprés suprimar la vèrsion de '''[[Media:$1|$1]]''' du [$4 $2 a $3].",
+'filedelete-comment' => 'Rêson :',
+'filedelete-submit' => 'Suprimar',
+'filedelete-success' => "'''$1''' at étâ suprimâ.",
+'filedelete-success-old' => "La vèrsion de '''[[Media:$1|$1]]''' du $2 a $3 at étâ suprimâ.",
+'filedelete-nofile' => "'''$1''' ègziste pas.",
+'filedelete-nofile-old' => "Ègziste gins de vèrsion arch·ivâ de '''$1''' avouéc los atributs spècefiâs.",
+'filedelete-otherreason' => 'Ôtra rêson / rêson de ples :',
+'filedelete-reason-otherlist' => 'Ôtra rêson',
+'filedelete-reason-dropdown' => '* Rêsons de suprèssion les ples corentes
** Violacion du drêt d’ôtor
** Fichiér en doblo',
-'filedelete-edit-reasonlist' => 'Changiér les rêsons de suprèssion',
-'filedelete-maintenance' => 'La suprèssion et la rèstoracion de fichiérs est dèsactivâ temporèrament pendent la mantegnence.',
+'filedelete-edit-reasonlist' => 'Changiér les rêsons de suprèssion',
+'filedelete-maintenance' => 'La suprèssion et la rèstoracion de fichiérs est dèsactivâ temporèrament pendent la mantegnence.',
+'filedelete-maintenance-title' => 'Empossiblo de suprimar lo fichiér',
# MIME search
'mimesearch' => 'Rechèrche per tipo de contegnu MIME',
@@ -2071,6 +2118,8 @@ Les entrâs <del>barrâs</del> ont étâ solucionâs.',
'wantedpages' => 'Pâges les ples demandâs',
'wantedpages-badtitle' => 'Titro envalido dens los rèsultats : $1',
'wantedfiles' => 'Fichiérs los ples demandâs',
+'wantedfiletext-cat' => 'Cetos fichiérs sont utilisâs, mas ègzistont pas. Los fichiérs de dèpôts a distance pôvont étre listâs mâlgrât qu’ègzistont. Tot celos fôx positifs seront <del>traciês</del>. Pués, les pâges qu’apondont des fichiérs qu’ègzistont pas sont rèpèrtoriyês dedens [[:$1]].',
+'wantedfiletext-nocat' => 'Cetos fichiérs sont utilisâs, mas ègzistont pas. Los fichiérs de dèpôts a distance pôvont étre listâs mâlgrât qu’ègzistont. Tot celos fôx positifs seront <del>traciês</del>.',
'wantedtemplates' => 'Modèlos los ples demandâs',
'mostlinked' => 'Pâges les ples liyês',
'mostlinkedcategories' => 'Catègories les ples utilisâs',
@@ -2079,6 +2128,7 @@ Les entrâs <del>barrâs</del> ont étâ solucionâs.',
'mostimages' => 'Fichiérs los ples utilisâs',
'mostrevisions' => 'Pâges les ples changiês',
'prefixindex' => 'Totes les pâges que començont per...',
+'prefixindex-namespace' => 'Totes les pâges avouéc prèfixo (èspâço de noms $1)',
'shortpages' => 'Pâges côrtes',
'longpages' => 'Pâges longes',
'deadendpages' => 'Pâges en cul-de-sac',
@@ -2095,7 +2145,7 @@ Les entrâs <del>barrâs</del> ont étâ solucionâs.',
'listusers-editsonly' => 'Fâre vêre ren que los usanciérs qu’ont u muens yona contribucion',
'listusers-creationsort' => 'Triyér per dâta de crèacion',
'usereditcount' => '$1 changement{{PLURAL:$1||s}}',
-'usercreated' => 'Fêt lo $1 a $2',
+'usercreated' => 'Fêt{{GENDER:$3||a}} lo $1 a $2',
'newpages' => 'Pâges novèles',
'newpages-username' => 'Nom d’usanciér :',
'ancientpages' => 'Pâges les muens dèrriérement changiês',
@@ -2190,12 +2240,8 @@ Protocolos recognus : <tt>$1</tt> (apondéd gins de cetos dedens voutra rechèrc
'activeusers-noresult' => 'Gins d’usanciér trovâ.',
# Special:Log/newusers
-'newuserlogpage' => 'Jornal de les crèacions de comptos usanciér',
-'newuserlogpagetext' => 'O est un jornal de les crèacions de comptos usanciér.',
-'newuserlog-byemail' => 'contresegno mandâ per mèssageria èlèctronica',
-'newuserlog-create-entry' => 'Compto usanciér novél',
-'newuserlog-create2-entry' => 'at fêt lo compto novél $1',
-'newuserlog-autocreate-entry' => 'Compto fêt ôtomaticament',
+'newuserlogpage' => 'Jornal de les crèacions de comptos usanciér',
+'newuserlogpagetext' => 'O est un jornal de les crèacions de comptos usanciér.',
# Special:ListGroupRights
'listgrouprights' => 'Drêts a les tropes d’usanciérs',
@@ -2224,7 +2270,7 @@ Y pôt avêr [[{{MediaWiki:Listgrouprights-helppage}}|més d’enformacions]] su
'emailpagetext' => 'Vos pouede utilisar lo formulèro ce-desot por mandar un mèssâjo a ceti usanciér.
L’adrèce èlèctronica que vos éd buchiê dens voutres [[Special:Preferences|prèferences]] aparètrat dedens lo champ « Èxpèdior » de voutron mèssâjo ; d’ense, lo dèstinatèro vos porrat rèpondre tot drêt.',
'usermailererror' => 'Èrror dens lo sujèt du mèssâjo :',
-'defemailsubject' => 'Mèssâjo de {{SITENAME}}',
+'defemailsubject' => 'Mèssâjo de {{SITENAME}} de l’usanciér « $1 »',
'usermaildisabled' => 'L’èxpèdicion de mèssâjos entre-mié usanciérs est dèsactivâ',
'usermaildisabledtext' => 'Vos pouede pas mandar des mèssâjos a d’ôtros usanciérs sur ceti vouiqui',
'noemailtitle' => 'Dèstinatèro sen adrèce èlèctronica',
@@ -2279,7 +2325,7 @@ Los changements a vegnir de ceta pâge et de sa pâge de discussion y seront lis
'watchmethod-list' => 'contrôlo de les pâges siuvues por y trovar des novéls changements',
'watchlistcontains' => 'Voutra lista de survelyence contint $1 pâge{{PLURAL:$1||s}}.',
'iteminvalidname' => 'Problèmo avouéc l’èlèment « $1 » : lo nom est envalido.',
-'wlnote' => "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâ|les '''$2''' hores passâs}}.",
+'wlnote' => "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los '''$1''' dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâ|les '''$2''' hores passâs}}, dês $3, $4.",
'wlshowlast' => 'Fâre vêre les $1 hores passâs, los $2 jorns passâs ou ben $3 ;',
'watchlist-options' => 'Chouèx de la lista de survelyence',
@@ -2345,8 +2391,6 @@ Volyéd confirmar qu’o est franc cen que vos voléd fâre, que vos en compregn
'actionfailed' => 'L’accion at pas reussia',
'deletedtext' => '« $1 » at étâ suprimâ.
Vêde lo $2 por una lista de les novèles suprèssions.',
-'deletedarticle' => 'at suprimâ « [[$1]] »',
-'suppressedarticle' => 'at suprimâ « [[$1]] »',
'dellogpage' => 'Jornal de les suprèssions',
'dellogpagetext' => 'Vê-que la lista de les suprèssions les ples novèles.',
'deletionlog' => 'jornal de les suprèssions',
@@ -2397,7 +2441,10 @@ Vêde la [[Special:ProtectedPages|lista de les pâges protègiês]] por la lista
'unprotectedarticle' => 'at enlevâ la protèccion de « [[$1]] »',
'movedarticleprotection' => 'at dèplaciê los paramètres de protèccion dês « [[$2]] » vers « [[$1]] »',
'protect-title' => 'Changiér lo nivél de protèccion por « $1 »',
+'protect-title-notallowed' => 'Vêre lo nivél de protèccion de « $1 »',
'prot_1movedto2' => 'at renomâ [[$1]] en [[$2]]',
+'protect-badnamespace-title' => 'Èspâço de noms pas protèjâblo',
+'protect-badnamespace-text' => 'Les pâges dens ceti èspâço de noms pôvont pas étre protègiês.',
'protect-legend' => 'Confirmar la protèccion',
'protectcomment' => 'Rêson :',
'protectexpiry' => 'Dâta d’èxpiracion :',
@@ -2419,6 +2466,7 @@ Vos pouede changiér lo nivél de protèccion de ceta pâge sen que cen afècte
'protect-level-sysop' => 'Solament los administrators',
'protect-summary-cascade' => 'protèccion en cascâda',
'protect-expiring' => 'èxpire lo $1 (UTC)',
+'protect-expiring-local' => 'èxpire lo $1',
'protect-expiry-indefinite' => 'sen fin',
'protect-cascade' => 'Protège asse-ben les pâges encllues dens ceta (protèccion en cascâda).',
'protect-cantedit' => 'Vos pouede pas changiér los nivéls de protèccion de ceta pâge perce que vos avéd pas la pèrmission de la changiér.',
@@ -2479,7 +2527,6 @@ Vos avéd pôt-étre un crouyo lim, ou ben la vèrsion at possu étre refêta ou
'undeletereset' => 'Tornar inicialisar',
'undeleteinvert' => 'Envèrsar lo chouèx',
'undeletecomment' => 'Rêson :',
-'undeletedarticle' => 'at refêt « [[$1]] »',
'undeletedrevisions' => '$1 {{PLURAL:$1|vèrsion refêta|vèrsions refêtes}}',
'undeletedrevisions-files' => '$1 vèrsion{{PLURAL:$1||s}} et $2 fichiér{{PLURAL:$2||s}} refêts',
'undeletedfiles' => '$1 {{PLURAL:$1|fichiér refêt|fichiérs refêts}}',
@@ -2489,6 +2536,7 @@ un ôtro usanciér at probâblament ja refêt la pâge.',
Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por vêre la lista de les novèles suprèssions et de les novèles rèstoracions.",
'undelete-header' => 'Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por vêre la lista de les pâges suprimâs dèrriérement.',
+'undelete-search-title' => 'Rechèrchiér des pâges suprimâs',
'undelete-search-box' => 'Rechèrchiér des pâges suprimâs',
'undelete-search-prefix' => 'Montrar les pâges que començont per :',
'undelete-search-submit' => 'Rechèrchiér',
@@ -2498,6 +2546,7 @@ Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por vêre la lista de
'undelete-cleanup-error' => 'Èrror pendent la suprèssion du fichiér de les arch·ives inutilisâ « $1 ».',
'undelete-missing-filearchive' => 'Empossiblo de refâre lo fichiér de les arch·ives avouéc lo numerô $1 perce qu’il est pas dens la bâsa de balyês.
Il at pôt-étre ja étâ refêt.',
+'undelete-error' => 'Èrror pendent la rèstoracion de la pâge',
'undelete-error-short' => 'Èrror pendent la rèstoracion du fichiér : $1',
'undelete-error-long' => 'Des èrrors ont étâ rencontrâs pendent la rèstoracion du fichiér :
@@ -2619,6 +2668,7 @@ Vêde la [[Special:BlockList|lista a les adrèces IP blocâs]] por revêre los b
'blocklist-userblocks' => 'Cachiér los blocâjos de comptos',
'blocklist-tempblocks' => 'Cachiér los blocâjos temporèros',
'blocklist-addressblocks' => 'Cachiér los blocâjos d’adrèces IP solètes',
+'blocklist-rangeblocks' => 'Cachiér los blocos de portâ',
'blocklist-timestamp' => 'Dâta et hora',
'blocklist-target' => 'Ciba',
'blocklist-expiry' => 'Dâta d’èxpiracion',
@@ -2641,6 +2691,7 @@ Vêde la [[Special:BlockList|lista a les adrèces IP blocâs]] por revêre los b
'unblocklink' => 'dèblocar',
'change-blocklink' => 'changiér lo blocâjo',
'contribslink' => 'contribucions',
+'emaillink' => 'mandar un mèssâjo',
'autoblocker' => 'Vos avéd étâ blocâ ôtomaticament perce que voutra adrèce IP at étâ utilisâ dèrriérement per « [[User:$1|$1]] ».
La rêson balyê por lo blocâjo a $1 est : « $2 ».',
'blocklogpage' => 'Jornal des blocâjos',
@@ -2772,9 +2823,6 @@ Nen volyéd chouèsir un ôtro.',
'movepage-page-moved' => 'La pâge $1 at étâ renomâ en $2.',
'movepage-page-unmoved' => 'La pâge $1 at pas possu étre renomâ en $2.',
'movepage-max-pages' => 'Lo més de $1 {{PLURAL:$1|pâge at étâ renomâ|pâges ont étâ renomâs}} et niona ôtra pâge serat renomâ ôtomaticament.',
-'1movedto2' => 'at renomâ [[$1]] en [[$2]]',
-'1movedto2_redir' => 'at dèplaciê [[$1]] vers [[$2]] en ècrasent sa redirèccion',
-'move-redirect-suppressed' => 'redirèccion suprimâ',
'movelogpage' => 'Jornal des changements de nom',
'movelogpagetext' => 'Vê-que la lista de totes les pâges renomâs ou dèplaciês.',
'movesubpage' => 'Sot-pâge{{PLURAL:$1||s}}',
@@ -2787,7 +2835,7 @@ Nen volyéd chouèsir un ôtro.',
La pâge de dèstinacion « [[:$1]] » ègziste ja.
La voléd-vos suprimar por pèrmetre lo changement de nom ?',
'delete_and_move_confirm' => 'Ouè, j’accèpto de suprimar la pâge de dèstinacion por pèrmetre lo changement de nom.',
-'delete_and_move_reason' => 'Pâge suprimâ ôtomaticament por pèrmetre un changement de nom',
+'delete_and_move_reason' => 'Pâge suprimâ por pèrmetre lo changement de nom dês « [[$1]] »',
'selfmove' => 'Los titros d’origina et de dèstinacion sont los mémos ;
empossiblo de renomar una pâge sur lyé-méma.',
'immobile-source-namespace' => 'Vos pouede pas renomar les pâges dens l’èspâço de noms « $1 »',
@@ -2821,6 +2869,7 @@ Dens cél dèrriér câs, vos pouede asse-ben utilisar un lim, coment [[{{#Speci
'exportcuronly' => 'Èxportar ren que la vèrsion d’ora, sen l’historico complèt',
'exportnohistory' => "----
'''Nota :''' l’èxportacion de l’historico complèt de les pâges avouéc ceti formulèro at étâ dèsactivâ por des rêsons de capacitât.",
+'exportlistauthors' => 'Encllure una lista complèta ux contributors por châque pâge',
'export-submit' => 'Èxportar',
'export-addcattext' => 'Apondre les pâges de la catègorie :',
'export-addcat' => 'Apondre',
@@ -2853,6 +2902,8 @@ Volyéd visitar la [//www.mediawiki.org/wiki/Localisation localisacion de MediaW
'thumbnail_error' => 'Èrror pendent la crèacion de la figura : $1',
'djvu_page_error' => 'Pâge DjVu en defôr de les limites',
'djvu_no_xml' => 'Empossiblo de rècupèrar lo XML por lo fichiér DjVu',
+'thumbnail-temp-create' => 'Empossiblo de fâre lo fichiér de figura temporèra',
+'thumbnail-dest-create' => 'Empossiblo d’encartar la figura sur la dèstinacion',
'thumbnail_invalid_params' => 'Paramètres de la figura fôx',
'thumbnail_dest_directory' => 'Empossiblo de fâre lo rèpèrtouèro de dèstinacion',
'thumbnail_image-type' => 'Tipo d’émâge pas recognu',
@@ -2901,6 +2952,8 @@ Un dossiér temporèro est manquent.',
'import-token-mismatch' => 'Pèrta de les balyês de sèance.
Volyéd tornar èprovar.',
'import-invalid-interwiki' => 'Empossiblo d’importar dês lo vouiqui spècefiâ.',
+'import-error-edit' => 'La pâge « $1 » est pas importâ perce que vos éte pas ôtorisâ a la changiér.',
+'import-error-create' => 'La pâge « $1 » est pas importâ perce que vos éte pas ôtorisâ a la fâre.',
# Import log
'importlogpage' => 'Jornal de les importacions',
@@ -3077,9 +3130,6 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
# Patrol log
'patrol-log-page' => 'Jornal de les vèrsions survelyês',
'patrol-log-header' => 'Vê-que un jornal de les vèrsions survelyês.',
-'patrol-log-line' => 'at marcâ la vèrsion $1 de $2 coment survelyê $3',
-'patrol-log-auto' => '(ôtomatico)',
-'patrol-log-diff' => 'v$1',
'log-show-hide-patrol' => '$1 lo jornal de les vèrsions survelyês',
# Image deletion
@@ -3106,11 +3156,11 @@ Se vos l’ègzécutâd, voutron sistèmo pôt étre compromês.",
'file-info' => 'Talye du fichiér : $1, tipo MIME : $2',
'file-info-size' => '$1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4',
'file-info-size-pages' => '$1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4, $5 pâge{{PLURAL:$5||s}}',
-'file-nohires' => '<small>Gins de rèsolucion ples hôta disponibla.</small>',
+'file-nohires' => 'Gins de rèsolucion ples hôta disponibla.',
'svg-long-desc' => 'Fichiér SVG, rèsolucion de $1 × $2 pixèls, talye : $3',
'show-big-image' => 'Émâge en rèsolucion ples hôta',
-'show-big-image-preview' => '<small>Talye de ceti apèrçu : $1.</small>',
-'show-big-image-other' => '<small>Ôtres rèsolucions : $1.</small>',
+'show-big-image-preview' => 'Talye de ceti apèrçu : $1.',
+'show-big-image-other' => '{{PLURAL:$2|Ôtra rèsolucion|Ôtres rèsolucions}} : $1.',
'show-big-image-size' => '$1 × $2 pixèls',
'file-info-gif-looped' => 'en boclla',
'file-info-gif-frames' => '$1 émâge{{PLURAL:$1||s}}',
@@ -3131,7 +3181,12 @@ Se vos l’ègzécutâd, voutron sistèmo pôt étre compromês.",
'sp-newimages-showfrom' => 'Fâre vêre los novéls fichiérs dês lo $1 a $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'days-abbrev' => 'j',
+'days-abbrev' => '$1j',
+'seconds' => '$1 second{{PLURAL:$1|a|es}}',
+'minutes' => '$1 menut{{PLURAL:$1|a|es}}',
+'hours' => '$1 hor{{PLURAL:$1|a|es}}',
+'days' => '$1 jorn{{PLURAL:$1||s}}',
+'ago' => 'cen fât $1',
# Bad image list
'bad_image_list' => 'Lo format est ceti :
@@ -3642,14 +3697,6 @@ Cél code de confirmacion èxpirerat lo $4.',
'scarytranscludefailed' => '[La rècupèracion de modèlo at pas reussia por $1]',
'scarytranscludetoolong' => '[L’URL est trop longe]',
-# Trackbacks
-'trackbackbox' => 'Rètrolims de vers ceta pâge :<br />
-$1',
-'trackbackexcerpt' => '; $4 $5: [$2 $1] : <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 Suprimar])',
-'trackbacklink' => 'Rètrolim',
-'trackbackdeleteok' => 'Lo rètrolim at étâ suprimâ avouéc reusséta.',
-
# Delete conflict
'deletedwhileediting' => "'''Atencion :''' ceta pâge at étâ suprimâ aprés que vos vos éte betâ a la changiér !",
'confirmrecreate' => "L’usanciér [[User:$1|$1]] ([[User talk:$1|Discussion]]) at suprimâ ceta pâge, pendent que vos vos érâd betâ a la changiér, por ceta rêson :
@@ -3802,6 +3849,9 @@ Vos pouede asse-ben utilisar l’[[Special:EditWatchlist|èditor normal]].',
'hebrew-calendar-m11-gen' => 'd’av',
'hebrew-calendar-m12-gen' => 'd’èloul',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discutar]])',
+
# Core parser functions
'unknown_extension_tag' => 'Balisa d’èxtension « $1 » encognua',
'duplicate-defaultsort' => "'''Atencion :''' la cllâf de tri per dèfôt « $2 » ècllafe cela « $1 ».",
@@ -3901,13 +3951,16 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
'tags-hitcount' => '$1 changement{{PLURAL:$1||s}}',
# Special:ComparePages
-'comparepages' => 'Comparar des pâges',
-'compare-selector' => 'Comparar les vèrsions de les pâges',
-'compare-page1' => 'Pâge 1',
-'compare-page2' => 'Pâge 2',
-'compare-rev1' => 'Vèrsion 1',
-'compare-rev2' => 'Vèrsion 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar des pâges',
+'compare-selector' => 'Comparar les vèrsions de les pâges',
+'compare-page1' => 'Pâge 1',
+'compare-page2' => 'Pâge 2',
+'compare-rev1' => 'Vèrsion 1',
+'compare-rev2' => 'Vèrsion 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'Lo titro que vos éd spècefiâ est fôx.',
+'compare-title-not-exists' => 'Lo titro que vos éd spècefiâ ègziste pas.',
+'compare-revision-not-exists' => 'La vèrsion que vos éd spècefiâ ègziste pas.',
# Database error messages
'dberr-header' => 'Ceti vouiqui at un problèmo',
@@ -3934,4 +3987,88 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
'sqlite-has-fts' => '$1 avouéc rechèrche en tèxto complèt recognua',
'sqlite-no-fts' => '$1 sen rechèrche en tèxto complèt recognua',
+# New logging system
+'logentry-delete-delete' => '$1 at suprimâ la pâge $3',
+'logentry-delete-restore' => '$1 at refêt la pâge $3',
+'logentry-delete-event' => '$1 at changiê la visibilitât {{PLURAL:$5|d’un èvènement|de $5 èvènements}} du jornal dessus $3 : $4',
+'logentry-delete-revision' => '$1 at changiê la visibilitât {{PLURAL:$5|d’una vèrsion|de $5 vèrsions}} sur la pâge $3 : $4',
+'logentry-delete-event-legacy' => '$1 at changiê la visibilitât des èvènements du jornal dessus $3',
+'logentry-delete-revision-legacy' => '$1 at changiê la visibilitât de les vèrsions sur la pâge $3',
+'logentry-suppress-delete' => '$1 at suprimâ la pâge $3',
+'logentry-suppress-event' => '$1 at changiê a cachon la visibilitât {{PLURAL:$5|d’un èvènement|de $5 èvènements}} du jornal dessus $3 : $4',
+'logentry-suppress-revision' => '$1 at changiê a cachon la visibilitât {{PLURAL:$5|d’una vèrsion|de $5 vèrsions}} sur la pâge $3 : $4',
+'logentry-suppress-event-legacy' => '$1 at changiê a cachon la visibilitât des èvènements du jornal dessus $3',
+'logentry-suppress-revision-legacy' => '$1 at changiê a cachon la visibilitât de les vèrsions sur la pâge $3',
+'revdelete-content-hid' => 'contegnu cachiê',
+'revdelete-summary-hid' => 'rèsumâ de changement cachiê',
+'revdelete-uname-hid' => 'nom d’usanciér cachiê',
+'revdelete-content-unhid' => 'contegnu pas més cachiê',
+'revdelete-summary-unhid' => 'rèsumâ de changement pas més cachiê',
+'revdelete-uname-unhid' => 'nom d’usanciér pas més cachiê',
+'revdelete-restricted' => 'at aplicâ les rèstriccions ux administrators',
+'revdelete-unrestricted' => 'rèstriccions enlevâs por los administrators',
+'logentry-move-move' => '$1 at dèplaciê la pâge $3 vers $4',
+'logentry-move-move-noredirect' => '$1 at dèplaciê la pâge $3 vers $4 sen lèssiér una redirèccion',
+'logentry-move-move_redir' => '$1 at dèplaciê la pâge $3 vers $4 en ècrasent sa redirèccion',
+'logentry-move-move_redir-noredirect' => '$1 at dèplaciê la pâge $3 vers $4 en ècrasent sa redirèccion sen lèssiér una redirèccion',
+'logentry-patrol-patrol' => '$1 at marcâ la vèrsion $4 de la pâge $3 coment survelyê',
+'logentry-patrol-patrol-auto' => '$1 at marcâ ôtomaticament la vèrsion $4 de la pâge $3 coment survelyê',
+'logentry-newusers-newusers' => '$1 at fêt un compto usanciér',
+'logentry-newusers-create' => '$1 at fêt un compto usanciér',
+'logentry-newusers-create2' => '$1 at fêt un compto usanciér $3',
+'logentry-newusers-autocreate' => 'Lo compto $1 at étâ fêt ôtomaticament',
+'newuserlog-byemail' => 'contresegno mandâ per mèssageria èlèctronica',
+
+# Feedback
+'feedback-bugornote' => 'Se vos éte prèst a dècrire un problèmo tècnico en dètaly, volyéd [$1 signalar una cofierie].
+Ôtrament, vos pouede utilisar lo formulèro simplifiâ ce-desot. Voutron comentèro serat apondu a la pâge « [$3 $2] », avouéc voutron nom d’usanciér et lo navigator que vos utilisâd.',
+'feedback-subject' => 'Sujèt :',
+'feedback-message' => 'Mèssâjo :',
+'feedback-cancel' => 'Anular',
+'feedback-submit' => 'Mandar voutron avis',
+'feedback-adding' => 'Aponsa de voutros avis a la pâge...',
+'feedback-error1' => 'Èrror : rèsultat de l’API pas recognu',
+'feedback-error2' => 'Èrror : lo changement at pas reussi',
+'feedback-error3' => 'Èrror : gins de rèponsa de l’API',
+'feedback-thanks' => 'Grant-marci ! Voutron avis at étâ postâ sur la pâge « [$2 $1] ».',
+'feedback-close' => 'Fêt',
+'feedback-bugcheck' => 'Formidâblo ! Controlâd simplament qu’o est pas yona de les [$1 cofieries ja cognues].',
+'feedback-bugnew' => 'J’é controlâ. Signalar una cofierie novèla',
+
+# API errors
+'api-error-badaccess-groups' => 'Vos éte pas ôtorisâ a tèlèchargiér des fichiérs sur ceti vouiqui.',
+'api-error-badtoken' => 'Èrror de dedens : crouyo « jeton ».',
+'api-error-copyuploaddisabled' => 'Los tèlèchargements per URL sont dèsactivâs sur cél sèrvor.',
+'api-error-duplicate' => 'Y at {{PLURAL:$1|[$2 un ôtro fichiér]|[$2 d’ôtros fichiérs]}} ja sur lo seto avouéc lo mémo contegnu.',
+'api-error-duplicate-archive' => 'Y avéve {{PLURAL:$1|[$2 un ôtro fichiér]|[$2 d’ôtros fichiérs]}} ja sur lo seto avouéc lo mémo contegnu, mas {{PLURAL:$1|il at étâ suprimâ|ils ont étâ suprimâs}}.',
+'api-error-duplicate-archive-popup-title' => 'Duplicar {{PLURAL:$1|lo fichiér|los fichiérs}} qu’{{PLURAL:$1|at ja étâ suprimâ|ont ja étâ suprimâs}}',
+'api-error-duplicate-popup-title' => 'Fichiér{{PLURAL:$1||s}} en doblo',
+'api-error-empty-file' => 'Lo fichiér que vos éd somês ére vouedo.',
+'api-error-fetchfileerror' => 'Èrror de dedens : quârque-ren s’est mâl passâ pendent la rècupèracion du fichiér.',
+'api-error-file-too-large' => 'Lo fichiér que vos éd somês ére trop grant.',
+'api-error-filename-tooshort' => 'Lo nom du fichiér est trop côrt.',
+'api-error-filetype-banned' => 'Cél tipo de fichiér est dèfendu.',
+'api-error-filetype-missing' => 'L’èxtension du fichiér est manquenta.',
+'api-error-hookaborted' => 'Lo changement que vos éd tâchiê de fâre at étâ arrètâ per un grèfon d’una èxtension.',
+'api-error-http' => 'Èrror de dedens : sè pôt pas branchiér u sèrvor.',
+'api-error-illegal-filename' => 'Lo nom du fichiér est pas ôtorisâ.',
+'api-error-internal-error' => 'Èrror de dedens : quârque-ren s’est mâl passâ pendent lo trètament de voutron tèlèchargement sur lo vouiqui.',
+'api-error-invalid-file-key' => 'Èrror de dedens : gins de fichiér trovâ dens lo stocâjo temporèro.',
+'api-error-missingparam' => 'Èrror de dedens : manque des paramètres dens la requéta.',
+'api-error-missingresult' => 'Èrror de dedens : nos ens pas possu dètèrmenar se la copia avéve reussia.',
+'api-error-mustbeloggedin' => 'Vos dête étre branchiê por tèlèchargiér des fichiérs.',
+'api-error-mustbeposted' => 'Èrror de dedens : la requéta at fôta d’HTTP POST.',
+'api-error-noimageinfo' => 'Lo tèlèchargement at reussi, mas lo sèrvor at pas balyê d’enformacions sur lo fichiér.',
+'api-error-nomodule' => 'Èrror de dedens : gins de modulo de tèlèchargement dèfeni.',
+'api-error-ok-but-empty' => 'Èrror de dedens : lo sèrvor at pas rèpondu.',
+'api-error-overwrite' => 'Ècllafar un fichiér ègzistent est pas ôtorisâ.',
+'api-error-stashfailed' => 'Èrror de dedens : lo sèrvor at pas possu encartar lo fichiér temporèro.',
+'api-error-timeout' => 'Lo sèrvor at pas rèpondu dens lo dèlê atendu.',
+'api-error-unclassified' => 'Una èrror encognua est arrevâ',
+'api-error-unknown-code' => 'Èrror encognua : « $1 »',
+'api-error-unknown-error' => 'Èrror de dedens : quârque-ren s’est mâl passâ pendent lo tèlèchargement de voutron fichiér.',
+'api-error-unknown-warning' => 'Avèrtissement encognu : $1',
+'api-error-uploaddisabled' => 'Lo tèlèchargement est dèsactivâ sur ceti vouiqui.',
+'api-error-verification-error' => 'Cél fichiér pôt étre corrompu, ou ben son èxtension est fôssa.',
+
);
diff --git a/languages/messages/MessagesFrr.php b/languages/messages/MessagesFrr.php
index d55d371a..08759568 100644
--- a/languages/messages/MessagesFrr.php
+++ b/languages/messages/MessagesFrr.php
@@ -378,16 +378,16 @@ Wan dåt ai di fål as, hääst dü eewäntuäl en fäägel önj e software fün
'badarticleerror' => 'Jüdeer aksjoon koon ai aw jüdeer sid mååged wårde.',
'cannotdelete' => 'Jü sid unti dootäi "$1" köö ai straagen wårde.
Dåt as flicht ål straagen foon huum ouders.',
+'cannotdelete-title' => 'Sidj „$1“ koon ei stregen wurd.',
'badtitle' => 'Ferkiirde tiitel',
'badtitletext' => 'Di tiitel foon jü anfrååged sid as üngülti, lääsi unti n üngültigen spräklink foon en ouder wiki.',
-'perfcached' => 'Da füliende doote ståme üt di cache än san möölikerwise ai aktuäl.',
-'perfcachedts' => 'Daheere doote ståme üt di cache, leest aktualisiiring: $2, klook $3.',
+'perfcached' => 'Da füliende doote ståme üt di cache än san möölikerwise ai aktuäl. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Daheere doote ståme üt di cache, leest aktualisiiring: $2, klook $3. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "'''Jü aktualisiiringsfunksjoon for jüdeer sid as nütutids deaktiwiird. Da doote wårde tujarst ai fernaierd.'''",
'wrong_wfQuery_params' => 'Ferkiirde parameetere for wfQuery()<br />
Funksjoon: $1<br />
Ouffrååch: $2',
'viewsource' => 'Kwältäkst önjkiike',
-'viewsourcefor' => 'for $1',
'actionthrottled' => 'Aksjoonstål limitiird',
'actionthrottledtext' => 'Dü hääst jüdeer aksjoon tu oofding bane en kort tidrüm ütfjard. Wees sü gödj än täiw en påår minuute än fersäk dåt et dan foon naien.',
'protectedpagetext' => 'Jüdeer sid as for dåt beårben späred.',
@@ -497,6 +497,7 @@ Besäkere, da iüheer IP-adräse brüke, koone tu jü tutids niinj benutserkonte
'emailconfirmlink' => 'E-mail-adräs bestääsie (autäntifisiire).',
'invalidemailaddress' => 'Jü E-mail adräs wörd ai aksäptiird, ouerdåt jü en üngülti formoot (ewentuäl üngültie tiikne) tu heewen scheent.
Wees sü gödj än jeef en koräkt adräs önj unti mäág dåt fäalj lääsi.',
+'cannotchangeemail' => 'E-mail-adresen kön uun detheer wiki ei feranert wurd.',
'accountcreated' => 'Benjüterkonto mååged',
'accountcreatedtext' => 'Dåt benjüteraccount for $1 as mååged wörden.',
'createaccount-title' => 'Måågen foon en benjüterkonto for {{SITENAME}}',
@@ -513,6 +514,7 @@ Wees sü gödj än täif, bit dü wider ferseechst.',
# E-mail sending
'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
+'user-mail-no-addy' => 'Köö niinj e-mail schake suner e-mail-adres.',
# Change password dialog
'resetpass' => 'Pååsuurd änre',
@@ -540,11 +542,21 @@ Möölikerwise heest dü din pååsuurd ål ma erfolch änred heest unti en nai
'passwordreset-pretext' => '{{PLURAL:$1||Du ian faan jo dooten oner iin}}',
'passwordreset-username' => 'Brükernoome:',
'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Wel dü det e-mail nooracht uunluke?',
+'passwordreset-capture-help' => 'Wan dü detheer kasje uunkrüsagst, woort det e-mail nooracht mä det nei paaswurd uunwiset an tu di brüker sjüürd.',
'passwordreset-email' => 'E-mail adres:',
'passwordreset-emailtitle' => 'Brükerkonto aw {{SITENAME}}',
'passwordreset-emailelement' => 'Brükernoome: $1
Tidwis paasuurd: $2',
+# Special:ChangeEmail
+'changeemail-no-info' => 'Dü möist önjmälded weese am ju sid diräkt tu tu gripen.',
+'changeemail-oldemail' => 'Aktuel e-mail adres',
+'changeemail-newemail' => 'Nei e-mail adres',
+'changeemail-none' => '(niin)',
+'changeemail-submit' => 'E-mail adres feranere',
+'changeemail-cancel' => 'Ufbreeg',
+
# Edit page toolbar
'bold_sample' => 'Fåten täkst',
'bold_tip' => 'Fåten täkst',
@@ -584,9 +596,6 @@ Wan dü wider aw \"{{int:savearticle}}\" klakst, wårt din beårbing suner ouers
'subject-preview' => 'Forkiik foon dåt subjäkt:',
'blockedtitle' => 'Brüker as späred',
'blockednoreason' => 'niinj grün önjjääwen',
-'blockedoriginalsource' => "Di kwältakst foon '''$1''' wårt heer wised:",
-'blockededitsource' => "Di takst foon '''din änringe''' bit '''$1'''wårt heer wised:",
-'whitelistedittitle' => 'Tu t beårben as dåt ferplächted, önjmälde tu weesen.',
'whitelistedittext' => 'Dü möist de $1, am side beårbe tu koonen.',
'confirmedittext' => 'Dü möist din E-mail-adräs jarst bestääsie, iir dü beårbinge döörfääre koost. Mååg din årbe radi än bestääsie din E-mail önj da [[Special:Preferences|önjstalinge]].',
'nosuchsectiontitle' => 'Stuk ai fünen',
@@ -799,8 +808,6 @@ Dü koost dåtheer färsjoonsferschääl siinj. Ainkelthäide stönje önj dåt
'revdelete-unsuppress' => 'Gränse for wi måågede färsjoone wächnaame',
'revdelete-log' => 'Begrüning:',
'revdelete-submit' => 'Aw {{PLURAL:$1|kiisd färsjoon|kiisde färsjoone}} önjwiinje',
-'revdelete-logentry' => 'heet jü färsjoonsönjsicht foon "[[$1]]" änred',
-'logdelete-logentry' => 'heet jü sachtboorhäid foon "[[$1]]" änred',
'revdelete-success' => "'''Jü färsjoonsönjsicht wörd aktualisiird.'''",
'revdelete-failure' => "'''Jü färsjoonsönjsicht köö ai aktualisiird wårde:'''
$1",
@@ -812,15 +819,6 @@ $1",
'revdel-restore-visible' => 'sachtboore färsjoone',
'pagehist' => 'Färsjoonshistoori',
'deletedhist' => 'Straagene färsjoone',
-'revdelete-content' => 'wat önj e side stoont',
-'revdelete-summary' => 'tuhuupefootings-komäntoor',
-'revdelete-uname' => 'brükernoome',
-'revdelete-restricted' => 'gränse jüle uk for administratoore',
-'revdelete-unrestricted' => 'gränse for administratoore wächnümen',
-'revdelete-hid' => 'fersteegen $1',
-'revdelete-unhid' => 'mååged $1 wi sachtboor',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|färsjoon|färsjoone}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|logbökindräch|logbökindreege}}',
'revdelete-hide-current' => 'Fäägel bai t fersteegen foon di önjdråch foon e klook $1, $2; ditheer as jü aktuäl färsjoon,
jü koon ai ferstäägen wårde.',
'revdelete-show-no-access' => 'Fäägel bai t wisen foon di önjdråch foon $1, e klook $2: diheer önjdråch wörd ås "begränsed" markiird.
@@ -945,7 +943,7 @@ Stal sääker, dåt jü färsjoonshistoori foon en sid histoorisch koräkt as.',
'datedefault' => 'Foor-önjstaling',
'prefs-personal' => 'Brüker dooten',
'prefs-rc' => 'Leeste änringe',
-'prefs-watchlist-days-max' => 'Ai lunger as 7 deege',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'Ai mör as 1000',
'prefs-misc' => 'Dit än dat',
'prefs-resetpass' => 'Pååsuurd änre',
@@ -1115,7 +1113,7 @@ Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
'nlinks' => '$1 {{PLURAL:$1|link|links}}',
'nmembers' => '{{PLURAL:$1|1 önjdraag|$1 önjdraage}}',
'prefixindex' => 'Ã…le side (ma prefiks)',
-'usercreated' => 'Maaget di $1 am a klook $2',
+'usercreated' => '{{GENDER:$3|Maaget}} di $1 am a klook $2',
'newpages' => 'Naie side',
'newpages-username' => 'Brükernoome:',
'move' => 'Ferschüwe',
@@ -1155,8 +1153,7 @@ Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
'linksearch-line' => '$2 ferwiset üüb $1',
# Special:Log/newusers
-'newuserlogpage' => 'Nai-önjmäldings-logbök',
-'newuserlog-create-entry' => 'Brüker wörd nai registriird',
+'newuserlogpage' => 'Nai-önjmäldings-logbök',
# Special:ListGroupRights
'listgrouprights-members' => '(lasmoote-list)',
@@ -1193,7 +1190,6 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
'actioncomplete' => 'Aksjoon beånd',
'actionfailed' => 'Diar ging wat skiaf',
'deletedtext' => '„$1“ wörd tunintemååged. In e $2 fanst dü en list foon da tuleest tunintemåågede side.',
-'deletedarticle' => 'heet "[[$1]]" tunintemååged',
'dellogpage' => 'Tunintemååg-Logbök',
'deletecomment' => 'Grün:',
'deleteotherreason' => 'Ouderen/tubaikaamenden grün:',
@@ -1227,7 +1223,6 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
# Undelete
'undeletelink' => 'wise/widermååge',
'undeleteviewlink' => 'Uunluke',
-'undeletedarticle' => 'heet "[[$1]]" widermååged',
# Namespace form on various pages
'namespace' => 'Noomerüm:',
@@ -1282,6 +1277,7 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
'unblocklink' => 'frijeewe',
'change-blocklink' => 'Späring änre',
'contribslink' => 'tujeefte',
+'emaillink' => 'e-mail schake',
'autoblocker' => 'Automatische spär, deer dü en gemiinsoom IP-adräs ma [[User:$1|brüker:$1]] brükst. Grün foon brükerspär: „$2“.',
'blocklogpage' => 'Brükerspär-logbök',
'blocklogentry' => 'spärd „[[$1]]“ for di tidrüm: $2 $3',
@@ -1336,8 +1332,6 @@ Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming
'talkexists' => 'Jü sid seelew wörd erfolchrik ferschääwen, ouers jü deertu hiirende diskusjoonssid ai, deer ål iinj ma di nai tiitel bestoont. Glik hål da önjhålte foon hönj ouf.',
'movedto' => 'ferschääwen eefter',
'movetalk' => 'Jü diskusjoonssid maferschüwe, wan möölik',
-'1movedto2' => 'heet „[[$1]]“ eefter „[[$2]]“ ferschääwen',
-'1movedto2_redir' => 'heet „[[$1]]“ eefter „[[$2]]“ ferschääwen än deerbai en widerliidjing ouerschraawen',
'movelogpage' => 'Ferschüwingslogbök',
'movereason' => 'Begrüning:',
'revertmove' => 'tubääg ferschüwe',
@@ -1423,7 +1417,7 @@ Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming
# Media information
'file-info-size' => '$1 × $2 pixele, dååtäigrutelse: $3, MIME-typ: $4',
-'file-nohires' => '<small>Niinj huuger apliising as deer.</small>',
+'file-nohires' => 'Niinj huuger apliising as deer.',
'svg-long-desc' => 'SVG-dåtäi, basisgrutelse: $1 × $2 pixel, dåtäigrutelse: $3',
'show-big-image' => 'Färsjon önj huuger apliising',
@@ -1501,4 +1495,10 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
# HTML forms
'htmlform-selectorother-other' => 'Oudere',
+# New logging system
+'revdelete-uname-hid' => 'brükernoome ferstäägen',
+'revdelete-uname-unhid' => 'brükernoome frijääwen',
+'revdelete-restricted' => 'gränse jüle uk for administratoore',
+'revdelete-unrestricted' => 'gränse for administratoore wächnümen',
+
);
diff --git a/languages/messages/MessagesFur.php b/languages/messages/MessagesFur.php
index 03b863d7..6f8df32c 100644
--- a/languages/messages/MessagesFur.php
+++ b/languages/messages/MessagesFur.php
@@ -405,7 +405,6 @@ Segnalilu par plasê a un [[Special:ListUsers/sysop|administrator]], notant la U
'badtitletext' => 'Il titul de pagjine che tu âs inserît nol è valit, al è vuelit, o al veve un erôr tal colegament tra wiki diviersis o tra versions in altris lenghis.
Al podarès vê dentri caratars che no podin jessi doprâts tai titui.',
'viewsource' => 'Cjale risultive',
-'viewsourcefor' => 'di $1',
'viewsourcetext' => 'Tu puedis viodi e copiâ la risultive di cheste pagjine:',
# Login and logout pages
@@ -535,7 +534,6 @@ Se tu vuelis tu puedis contatâ $1 o un altri [[{{MediaWiki:Grouppage-sysop}}|am
Visiti che no tu puedis doprâ la funzion 'Messaç di pueste a chest utent' se no tu âs specificât une direzion di pueste eletroniche valide tes [[Special:Preferences|preferencis]] e se no tu sês stât blocât al ûs di cheste funzion.
Par plasê inclût la to direzion IP atuâl ($3) o il numar dal bloc (ID #$5) in ogni richieste di sclariments.",
-'blockedoriginalsource' => "Ca sot tu puedis viodi la risultive de pagjine '''$1''':",
'whitelistedittext' => 'Tu scugnis $1 par cambiâ lis pagjinis.',
'confirmedittext' => 'Prime di cambiâ lis pagjinis tu scugnis confermâ la to direzion di pueste eletroniche. Par impuestâ e confermâ la direzion, dopre lis [[Special:Preferences|preferencis]].',
'loginreqtitle' => 'Si scugne jentrâ',
@@ -638,15 +636,10 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'revdelete-radio-same' => '(no stâ cambiâ)',
'revdelete-radio-set' => 'Sì',
'revdelete-radio-unset' => 'No',
-'revdelete-logentry' => 'cambiât la visibilitât de revision di "[[$1]]"',
'revdel-restore' => 'cambie visibilitât',
'revdel-restore-deleted' => 'revisions eliminadis',
'revdel-restore-visible' => 'revisions visibilis',
'pagehist' => 'Storic de pagjine',
-'revdelete-content' => 'contignût',
-'revdelete-uname' => 'non utent',
-'revdelete-hid' => 'platât $1',
-'revdelete-log-message' => '$1 par $2 {{PLURAL:$2|revision|revisions}}',
'revdelete-reasonotherlist' => 'Altri motîf',
# Merge log
@@ -740,7 +733,7 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'prefs-rc' => 'Ultins cambiaments & stubs',
'prefs-watchlist' => 'Tignudis di voli',
'prefs-watchlist-days' => 'Numar di zornadis di mostrâ inte liste des pagjinis tignudis di voli:',
-'prefs-watchlist-days-max' => 'Massim 7 zornadis',
+'prefs-watchlist-days-max' => 'Massim $1 {{PLURAL:$1|zornade|zornadis}}',
'prefs-watchlist-edits' => 'Numar di modifichis di mostrâ inte liste slargjade:',
'prefs-watchlist-edits-max' => 'Numar massim: 1000',
'prefs-misc' => 'Variis',
@@ -1128,12 +1121,8 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
'activeusers-noresult' => 'Nissun utent cjatât.',
# Special:Log/newusers
-'newuserlogpage' => 'Regjistri dai gnûfs utents',
-'newuserlogpagetext' => 'Ca sot tu cjatis un regjistri dai gnûfs utents creâts.',
-'newuserlog-byemail' => 'peraule clâf mandade par pueste eletroniche',
-'newuserlog-create-entry' => 'al è rivât il gnûf utent',
-'newuserlog-create2-entry' => 'creade une gnove identitât par $1',
-'newuserlog-autocreate-entry' => 'Identitât creade in automatic',
+'newuserlogpage' => 'Regjistri dai gnûfs utents',
+'newuserlogpagetext' => 'Ca sot tu cjatis un regjistri dai gnûfs utents creâts.',
# Special:ListGroupRights
'listgrouprights' => 'Dirits dai grups di utents',
@@ -1211,7 +1200,6 @@ Par plasê, da la conferme che tu vuelis fâlu, che tu capissis lis conseguencis
'actionfailed' => 'Azion falide',
'deletedtext' => '"$1" al è stât eliminât.
Cjale $2 par une liste des ultimis eliminazions.',
-'deletedarticle' => 'eliminât "[[$1]]"',
'dellogpage' => 'Regjistri des eliminazions',
'deletionlog' => 'regjistri eliminazions',
'reverted' => 'Tornât ae version precedente',
@@ -1264,7 +1252,6 @@ Tu puedis cambiâ il nivel di protezion di cheste pagjine, ma chest nol varà ef
'undeleteviewlink' => 'viôt',
'undeleteinvert' => 'Invertìs selezion',
'undeletecomment' => 'Reson:',
-'undeletedarticle' => 'al à recuperât "[[$1]]"',
'undelete-search-prefix' => 'Mostre lis pagjinis che a scomencin cun:',
'undelete-search-submit' => 'Cîr',
'undelete-show-file-submit' => 'Sì',
@@ -1376,8 +1363,6 @@ Sielç par plasê un altri non.',
'talkexists' => "'''La pagjine e je stade movude cun sucès, ma no si à podût movi la pagjine di discussion parcè che e esist za tal gnûf titul. Trasferìs il contignût a man par plasê.'''",
'movedto' => 'Movude in',
'movetalk' => 'Môf ancje la pagjine di discussion, se pussibil.',
-'1movedto2' => 'al à movût [[$1]] in [[$2]]',
-'1movedto2_redir' => 'al à movût [[$1]] a [[$2]] par mieç di un re-indreçament',
'movelogpage' => 'Regjistri des pagjinis movudis',
'movelogpagetext' => 'Ca sot e je une liste des pagjinis movudis.',
'movereason' => 'Reson:',
@@ -1508,11 +1493,6 @@ Par plasê va su [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'skinname-nostalgia' => 'Nostalgjie',
'skinname-modern' => 'Moderne',
-# Patrol log
-'patrol-log-line' => 'al à segnât $1 di $2 come verificade $3',
-'patrol-log-auto' => '(in automatic)',
-'patrol-log-diff' => 'revision $1',
-
# Browsing diffs
'previousdiff' => '↠Difarence precedente',
'nextdiff' => 'Prossime difarence →',
@@ -1522,7 +1502,7 @@ Par plasê va su [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagjine|pagjinis}}',
'file-info' => 'Dimensions: $1, gjenar MIME: $2',
'file-info-size' => '$1 × $2 pixel, dimensions: $3, gjenar MIME: $4',
-'file-nohires' => '<small>No son disponibilis versions cun risoluzion plui alte.</small>',
+'file-nohires' => 'No son disponibilis versions cun risoluzion plui alte.',
'svg-long-desc' => 'file tal formât SVG, dimensions nominâls $1 × $2 pixels, dimensions dal file: $3',
'show-big-image' => 'Version a risoluzion plene',
@@ -1719,4 +1699,10 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
'htmlform-submit' => 'Invie',
'htmlform-selectorother-other' => 'Altris',
+# New logging system
+'newuserlog-byemail' => 'peraule clâf mandade par pueste eletroniche',
+
+# API errors
+'api-error-unclassified' => 'Al è capitât un erôr no cognossût',
+
);
diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php
index 88fc2f93..47c22a8c 100644
--- a/languages/messages/MessagesFy.php
+++ b/languages/messages/MessagesFy.php
@@ -478,14 +478,13 @@ Meitsje dêr melding fan by in [[Special:ListUsers/sysop|systeembehearder]] fan
'cannotdelete' => 'Koe de oantsjutte side of it oantsjutte ôfbyld net wiskje. (Faaks hat in oar dat al dien.)',
'badtitle' => 'Misse titel',
'badtitletext' => 'De opfrege sidetitel wie ûnjildich, leech, of in miskeppele yntertaal of ynterwiki titel.',
-'perfcached' => "Dit is bewarre ynformaasje dy't mooglik ferâldere is.",
-'perfcachedts' => 'De neikommende gegevens komme út de bewarre ynformaasje, dizze is it lêst fernijd op $1.',
+'perfcached' => "Dit is bewarre ynformaasje dy't mooglik ferâldere is. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => 'De neikommende gegevens komme út de bewarre ynformaasje, dizze is it lêst fernijd op $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Dizze side kin net bywurke wurde. Dizze gegevens wurde net ferfarske.',
'wrong_wfQuery_params' => 'Ferkearde parameters foar wfQuery()<br />
Funksje: $1<br />
Query: $2',
'viewsource' => 'Besjoch de boarne',
-'viewsourcefor' => 'fan $1',
'actionthrottled' => 'Hanneling opkeard',
'actionthrottledtext' => 'As maatregel tsjin spam is it tal kearen per tiidsienheid beheind dat jo dizze hanneling ferrjochtsje kinne. Jo binne oer de limyt. Besykje it in tal minuten letter wer.',
'protectedpagetext' => 'Dizze side is befeilige. Bewurkjen is net mûglik.',
@@ -661,9 +660,6 @@ Jo kinne kontakt opnimme mei $1 of in oare [[{{MediaWiki:Grouppage-sysop}}|behea
Jo kinne gjin gebrûk meitsje fan 'e funksje 'Skriuw meidogger', of jo moatte in jildich e-postadres opjûn hawwe yn jo [[Special:Preferences|foarkarren]] en it gebrûk fan dy funksje moat net útsletten wêze.
Jo tsjintwurdich e-postadres is $3 en it útsletnûmer is #$5. Neam beide gegevens as jo earne op dizze útsluting reagearje.",
'blockednoreason' => 'gjin reden opjûn',
-'blockedoriginalsource' => "Hjir ûnder stiet de boarnetekst fan '''$1''':",
-'blockededitsource' => "Hjir ûnder stiet de tekst fan '''jo bewurkings''' oan '''$1''':",
-'whitelistedittitle' => 'Foar bewurkjen is oanmelden ferplichte',
'whitelistedittext' => 'Jo moatte $1 om siden te bewurkjen.',
'confirmedittext' => "Jo moatte jo e-mailadres befêstichje foar't jo siden feroarje kinne. Fier in e-mailedres yn by jo [[Special:Preferences|ynstellings]] en befêstichje it.",
'nosuchsectiontitle' => 'Dizze subkop bestiet net',
@@ -858,22 +854,11 @@ Oare behearders fan {{SITENAME}} kinne de ferburgen ynhâld benaderje en it fuor
'revdelete-unsuppress' => 'Beheinings op tebeksette feroarings fuorthelje',
'revdelete-log' => 'Reden:',
'revdelete-submit' => 'Tapasse op selektearre bewurking',
-'revdelete-logentry' => 'sichtberens fan bewurkings is feroare foar [[$1]]',
-'logdelete-logentry' => 'feroare sichtberens fan barren [[$1]]',
'revdelete-success' => "'''Sichtberens fan'e feroaring mei sukses ynsteld.'''",
'logdelete-success' => "'''Sichtberens fan it barren mei sukses ynsteld.'''",
'revdel-restore' => 'Sichtberens feroarje',
'pagehist' => 'Sideskiednis',
'deletedhist' => 'Wiske skiednis',
-'revdelete-content' => 'ynhâld',
-'revdelete-summary' => 'gearfetting bewurkje',
-'revdelete-uname' => 'meidoggernamme',
-'revdelete-restricted' => 'hat beheinings oplein oan behearders',
-'revdelete-unrestricted' => 'hat beheinings foar behearders goedmakke',
-'revdelete-hid' => 'hat $1 ferburgen',
-'revdelete-unhid' => '$1 net mear ferburgen',
-'revdelete-log-message' => '$1 foar $2 {{PLURAL:$2|ferzje|ferzjes}}',
-'logdelete-log-message' => '$1 foar $2 {{PLURAL:$2|lochboekregel|lochboekregels}}',
'revdelete-edit-reasonlist' => 'Redenen foar fuortheljen bewurkje',
# Suppression log
@@ -1007,7 +992,7 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
'prefs-rc' => 'Koartlyn feroare',
'prefs-watchlist' => 'Folchlist',
'prefs-watchlist-days' => 'Oantal dagen yn folchlist sjen litte:',
-'prefs-watchlist-days-max' => 'Maksimaal 7 dagen',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Tal wizigings om sjen te litten yn de útwreide folchlist:',
'prefs-watchlist-edits-max' => 'Maksimum oantal: 1000',
'prefs-misc' => 'Ferskaat',
@@ -1172,7 +1157,6 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
'right-autopatrol' => 'Bewurkings wurde automatysk as kontrolearre markearre',
'right-patrolmarks' => 'Kontroletekens yn resinte feroarings besjen',
'right-unwatchedpages' => "In list mei siden besjen dy't net op in folchlist steane",
-'right-trackback' => 'In trackback opjaan',
'right-mergehistory' => 'De skiednis fan siden gearfoegje',
'right-userrights' => 'Alle meidoggerrjochten bywurkje',
'right-userrights-interwiki' => "Wizigje meidoggerrjochten fan meidoggers yn oare wiki's",
@@ -1215,7 +1199,6 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
'action-patrol' => 'bewurkings fan oaren as kontrolearre beskôgje',
'action-autopatrol' => 'eigen bewurkings as kontrolearre markearje litte',
'action-unwatchedpages' => "de list mei siden dy't net op in folchlist steane besjen",
-'action-trackback' => 'in trackback opjaan',
'action-mergehistory' => 'de skiednis fan dizze side gearfoegje',
'action-userrights' => 'alle brûkersrjochten bewurkje',
'action-userrights-interwiki' => "brûkersrjochten fan brûkers fan oare wiki's bewurkje",
@@ -1670,12 +1653,8 @@ Stipe protokollen: <tt>$1</tt>',
'activeusers-noresult' => 'Gjin meidoggers fûn.',
# Special:Log/newusers
-'newuserlogpage' => 'Ynskriuwingsloch',
-'newuserlogpagetext' => "Dit is in loch fan meidoggers dy't de lêste tiid ynskreaun binne.",
-'newuserlog-byemail' => 'wachtwurd is ferstjoerd oer e-mail',
-'newuserlog-create-entry' => 'Nije meidogger',
-'newuserlog-create2-entry' => 'hat meidogger "$1" oanmakke',
-'newuserlog-autocreate-entry' => 'Brûker automatysk oanmakke',
+'newuserlogpage' => 'Ynskriuwingsloch',
+'newuserlogpagetext' => "Dit is in loch fan meidoggers dy't de lêste tiid ynskreaun binne.",
# Special:ListGroupRights
'listgrouprights' => 'Rjochten fan brûkersgroepen',
@@ -1786,7 +1765,6 @@ is en dat jo dit dogge neffens de [[{{MediaWiki:Policy-url}}]].',
'actioncomplete' => 'Dien',
'deletedtext' => '"$1" is wiske.
Sjoch "$2" foar in list fan wat resint wiske is.',
-'deletedarticle' => '"[[$1]]" is wiske',
'dellogpage' => 'Wiskloch',
'dellogpagetext' => 'Dit is wat der resint wiske is.
(Tiden oanjûn as UTC).',
@@ -1879,7 +1857,6 @@ Dit binne de rinnende ynstellings foar de side '''$1''':",
'undeletereset' => 'Leechmeitsje',
'undeleteinvert' => 'Omkearde seleksje',
'undeletecomment' => 'Utlis foar weromsetten:',
-'undeletedarticle' => '"$1" weromset',
'undelete-header' => 'Sjoch [[Special:Log/delete|de wiskloch]] foar resint wiske siden.',
'undelete-search-box' => 'Sykje wiske siden',
'undelete-search-prefix' => "Lit siden sjen dy't begjinne mei:",
@@ -2031,8 +2008,6 @@ In dizze gefallen is it oan jo hoe't jo de oerlisside werneame of ynfoegje wolle
'movedto' => 'werneamd as',
'movetalk' => 'Titel fan oerlisside ek feroarje, as dy der is.',
'movepage-page-moved' => 'De side $1 is werneamd nei $2.',
-'1movedto2' => '[[$1]] feroare ta [[$2]]',
-'1movedto2_redir' => '[[$1]] feroare ta [[$2]], wat in synonym wie',
'movelogpage' => 'Werneam-loch',
'movelogpagetext' => 'Dit is in list fan feroare titels.',
'movereason' => 'Reden:',
@@ -2176,7 +2151,7 @@ Sjoch: [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation], [//transl
'thumbsize' => 'Mjitte fan miniatueren:',
'file-info' => 'triemgrutte: $1, MIME-type: $2',
'file-info-size' => '$1 × $2 pixel, triemgrutte: $3, MIME type: $4',
-'file-nohires' => '<small>Gjin hegere resolúsje beskikber.</small>',
+'file-nohires' => 'Gjin hegere resolúsje beskikber.',
'svg-long-desc' => 'SVG-triem, nominaal $1 × $2 pixels, triemgrutte: $3',
'show-big-image' => 'Hegere resolúsje',
@@ -2303,9 +2278,6 @@ Dizze befêstigingskoade ferrint dan op $4.',
# Scary transclusion
'scarytranscludetoolong' => '[URL-adres is te lang]',
-# Trackbacks
-'trackbackremove' => '([$1 Wiskje])',
-
# Delete conflict
'confirmrecreate' => "Sûnt jo begûn binne dizze side te bewurkjen, hat meidogger [[User:$1|$1]] ([[User talk:$1|oerlis]]) de side wiske. De reden dy't derfoar jûn waard wie:
: ''$2''
@@ -2392,4 +2364,9 @@ Wolle jo de side wier op 'e nij skriuwe?",
'blankpage' => 'Side is leech',
'intentionallyblankpage' => 'Dizze side is bewust leech lizzen en wurdt brûkt foar benchmarks, ensfh.',
+# New logging system
+'revdelete-restricted' => 'hat beheinings oplein oan behearders',
+'revdelete-unrestricted' => 'hat beheinings foar behearders goedmakke',
+'newuserlog-byemail' => 'wachtwurd is ferstjoerd oer e-mail',
+
);
diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php
index 2d804fd0..6f41a0b0 100644
--- a/languages/messages/MessagesGa.php
+++ b/languages/messages/MessagesGa.php
@@ -22,47 +22,47 @@
*/
$magicWords = array(
- 'redirect' => array( '0', '#athsheoladh', '#REDIRECT' ),
- 'notoc' => array( '0', '__GANCÃ__', '__NOTOC__' ),
- 'forcetoc' => array( '0', '__CÃGACHUAIR__', '__FORCETOC__' ),
- 'toc' => array( '0', '__CÃ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__GANMHÃRATHRÚ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'MÃLÃITHREACH', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'AINMNAMÃOSALÃITHREAÃ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'GINAINMNAMÃOSALÃITHREAÃ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'GIORRÚNAMÃOSALÃITHREAÃ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'LÃLÃITHREACH', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'AINMANLAELÃITHRIGH', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'BLIAINLÃITHREACH', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AMLÃITHREACH', 'CURRENTTIME' ),
- 'numberofarticles' => array( '1', 'LÃONNANALT', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'LÃONNAGCOMHAD', 'NUMBEROFFILES' ),
- 'pagename' => array( '1', 'AINMANLGH', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'AINMANLGHB', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'AINMSPÃS', 'NAMESPACE' ),
- 'msg' => array( '0', 'TCHT:', 'MSG:' ),
- 'subst' => array( '0', 'IONAD:', 'SUBST:' ),
- 'msgnw' => array( '0', 'TCHTFS:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'mionsamhail', 'mion', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'deas', 'right' ),
- 'img_left' => array( '1', 'clé', 'left' ),
- 'img_none' => array( '1', 'faic', 'none' ),
- 'img_center' => array( '1', 'lár', 'center', 'centre' ),
- 'img_framed' => array( '1', 'fráma', 'frámaithe', 'framed', 'enframed', 'frame' ),
- 'int' => array( '0', 'INMH:', 'INT:' ),
- 'sitename' => array( '1', 'AINMANTSUÃMH', 'SITENAME' ),
- 'ns' => array( '0', 'AS:', 'NS:' ),
- 'localurl' => array( '0', 'URLÃITIÚIL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLÃITIÚILB', 'LOCALURLE:' ),
- 'server' => array( '0', 'FREASTALAÃ', 'SERVER' ),
- 'servername' => array( '0', 'AINMANFHREASTALAÃ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SCRIPTCHOSÃN', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMADACH:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__GANTIONTÚNADTEIDEAL__', '__GANTT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__GANTIONTÚNANÃBHAIR__', '__GANTA__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SEACHTAINLÃITHREACH', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'LÃLÃITHREACHNAS', 'CURRENTDOW' ),
- 'revisionid' => array( '1', 'IDANLEASAITHE', 'REVISIONID' ),
+ 'redirect' => array( '0', '#athsheoladh', '#REDIRECT' ),
+ 'notoc' => array( '0', '__GANCÃ__', '__NOTOC__' ),
+ 'forcetoc' => array( '0', '__CÃGACHUAIR__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__CÃ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__GANMHÃRATHRÚ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'MÃLÃITHREACH', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'AINMNAMÃOSALÃITHREAÃ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'GINAINMNAMÃOSALÃITHREAÃ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'GIORRÚNAMÃOSALÃITHREAÃ', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'LÃLÃITHREACH', 'CURRENTDAY' ),
+ 'currentdayname' => array( '1', 'AINMANLAELÃITHRIGH', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'BLIAINLÃITHREACH', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AMLÃITHREACH', 'CURRENTTIME' ),
+ 'numberofarticles' => array( '1', 'LÃONNANALT', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'LÃONNAGCOMHAD', 'NUMBEROFFILES' ),
+ 'pagename' => array( '1', 'AINMANLGH', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'AINMANLGHB', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'AINMSPÃS', 'NAMESPACE' ),
+ 'msg' => array( '0', 'TCHT:', 'MSG:' ),
+ 'subst' => array( '0', 'IONAD:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'TCHTFS:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'mionsamhail', 'mion', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'deas', 'right' ),
+ 'img_left' => array( '1', 'clé', 'left' ),
+ 'img_none' => array( '1', 'faic', 'none' ),
+ 'img_center' => array( '1', 'lár', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'fráma', 'frámaithe', 'framed', 'enframed', 'frame' ),
+ 'int' => array( '0', 'INMH:', 'INT:' ),
+ 'sitename' => array( '1', 'AINMANTSUÃMH', 'SITENAME' ),
+ 'ns' => array( '0', 'AS:', 'NS:' ),
+ 'localurl' => array( '0', 'URLÃITIÚIL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLÃITIÚILB', 'LOCALURLE:' ),
+ 'server' => array( '0', 'FREASTALAÃ', 'SERVER' ),
+ 'servername' => array( '0', 'AINMANFHREASTALAÃ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SCRIPTCHOSÃN', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMADACH:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__GANTIONTÚNADTEIDEAL__', '__GANTT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__GANTIONTÚNANÃBHAIR__', '__GANTA__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SEACHTAINLÃITHREACH', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'LÃLÃITHREACHNAS', 'CURRENTDOW' ),
+ 'revisionid' => array( '1', 'IDANLEASAITHE', 'REVISIONID' ),
);
$namespaceNames = array(
@@ -450,13 +450,12 @@ B\'fhéidir gur scrios duine eile é cheana féin.',
'badtitle' => 'Teideal neamhbhailí',
'badtitletext' => "Bhí teideal an leathanaigh a d'iarr tú ar neamhbhailí, folamh, nó
teideal idirtheangach nó idirvicí nasctha go mícheart.",
-'perfcached' => 'Fuarthas na sonraí a leanas as taisce, agus is dócha go bhfuil siad as dáta.',
-'perfcachedts' => 'Tá na sonraí seo a leanas sa taisce, nuashonraithe $1.',
+'perfcached' => 'Fuarthas na sonraí a leanas as taisce, agus is dócha go bhfuil siad as dáta. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Tá na sonraí seo a leanas sa taisce, nuashonraithe $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'wrong_wfQuery_params' => 'Paraiméadair mhíchearta don wfQuery()<br />
Feidhm: $1<br />
Iarratas: $2',
'viewsource' => 'Féach ar fhoinse',
-'viewsourcefor' => 'le haghaidh $1',
'actionthrottled' => 'Gníomh scóigthe',
'actionthrottledtext' => 'Mar theicníc frithurscair, ní féidir lear an gníomh seo a dhéanamh barraíocht taobh istigh de thréimhse ghairid ama, agus tá an méid sáraithe agat.
Bain trial arís as i gcionn cúpla bomaite más é do thoil é.',
@@ -627,8 +626,6 @@ Tabhair faoi deara nach féidir leat an gné "cuir ríomhphost chuig an úsáide
Is é $3 do sheoladh IP agus #$5 do ID coisc. Déan tagairt don seoladh seo le gach ceist a chuirfeá.',
'blockednoreason' => 'níl chúis a thugadh',
-'blockedoriginalsource' => "Tá an foinse '''$1''' le feiceáil a leanas:",
-'whitelistedittitle' => 'Logáil isteach chun athrú a dhéanamh',
'whitelistedittext' => 'Ní mór duit $1 chun ailt a athrú.',
'nosuchsectiontitle' => 'Níl a leithéad de mhír ann',
'loginreqtitle' => 'Tá logáil isteach de dhíth ort',
@@ -753,8 +750,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
'revdel-restore' => 'athraigh infheictheacht',
'pagehist' => 'Stair leathanach',
'deletedhist' => 'Stair scriosta',
-'revdelete-uname' => 'ainm úsáideora',
-'revdelete-log-message' => '$1 le $2 {{PLURAL:$2|leagan|leagain}}',
# History merging
'mergehistory-from' => 'Leathanach fhoinse:',
@@ -841,7 +836,7 @@ Bain triail as ''all:'' a chur roimh d'iarratas chun an t-inneachar ar fad (leat
'prefs-rc' => 'Athruithe is déanaí',
'prefs-watchlist' => 'Liosta faire',
'prefs-watchlist-days' => 'Líon na laethanta le taispeáint sa liosta faire:',
-'prefs-watchlist-days-max' => 'Uasmhéid 7 lá',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Líon na n-athruithe le taispeáint sa liosta leathnaithe faire:',
'prefs-watchlist-edits-max' => 'Uasmhéid: 1000',
'prefs-misc' => 'Éagsúla',
@@ -1242,9 +1237,7 @@ Féach freisin ar [[Special:WantedCategories|catagóirí faoi iarraidh]].',
'listusers-submit' => 'Taispeáin',
# Special:Log/newusers
-'newuserlogpage' => 'Log cruthú úsáideoira',
-'newuserlog-create-entry' => 'Úsáideoir nua',
-'newuserlog-create2-entry' => 'cuntas cruthú le $1',
+'newuserlogpage' => 'Log cruthú úsáideoira',
# Special:ListGroupRights
'listgrouprights-group' => 'Ghrúpa',
@@ -1358,7 +1351,6 @@ Deimhnigh, le do thoil, gur mhian leat é seo a dhéanamh, go dtuigeann tú tort
'actioncomplete' => 'Gníomh críochnaithe',
'deletedtext' => 'scriosadh "$1".
Féach ar $2 chun cuntas na scriosiadh deireanacha a fháil.',
-'deletedarticle' => 'scriosadh "[[$1]]"',
'dellogpage' => 'Loga scriosta',
'dellogpagetext' => 'Seo é liosta de na scriosaidh is déanaí.',
'deletionlog' => 'cuntas scriosaidh',
@@ -1444,7 +1436,6 @@ Is an téacs as na leagan scriosta seo ar fáil do riarthóirí amháin.',
'undeletereset' => 'Athshocraigh',
'undeleteinvert' => 'Cuir an roghnú bun os cionn',
'undeletecomment' => 'Tuairisc:',
-'undeletedarticle' => 'Díscriosadh "$1" ar ais',
'undeletedrevisions' => '{{PLURAL:$1|Leagan amháin|$1 leagain}} díscriosta',
'undeletedrevisions-files' => '{{PLURAL:$1|Leagan amháin|$1 leagain}} agus {{PLURAL:$2|comhad amháin|$2 comhaid}} a chur ar ais',
'undeletedfiles' => '{{PLURAL:$1|Comhad amháin|$1 comhaid}} díscriosta',
@@ -1623,8 +1614,6 @@ Sna cásanna sin, caithfidh tú an leathanach a aistrigh nó a chumasc tú féin
'''Báigh tusa féin iad.'''",
'movedto' => 'athainmnithe bheith',
'movetalk' => 'Athainmnigh an leathanach plé freisin.',
-'1movedto2' => 'tar éis [[$1]] a athainmniú mar [[$2]]',
-'1movedto2_redir' => 'rinneadh athsheoladh de [[$1]] go [[$2]]',
'movelogpage' => 'Log athainmnithe',
'movelogpagetext' => 'Liosta is ea seo thíos de leathanaigh athainmnithe.',
'movereason' => 'Fáth:',
@@ -1790,7 +1779,6 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
# Patrol log
'patrol-log-page' => 'Log phatról',
-'patrol-log-auto' => '(uathoibríoch)',
'log-show-hide-patrol' => '$1 log phatról',
# Image deletion
@@ -1808,7 +1796,7 @@ B'fheidir go gcuirfear do chóras i gcontúirt dá rithfeá é.",
'thumbsize' => 'Méid mionsamhlacha:',
'file-info' => 'méid comhad : $1, saghas MIME: $2',
'file-info-size' => '$1 × $2 picteilín, méid comhaid: $3, cineál MIME: $4',
-'file-nohires' => '<small>Níl aon taifeach is mó ar fáil.</small>',
+'file-nohires' => 'Níl aon taifeach is mó ar fáil.',
'svg-long-desc' => 'Comhad SVG, ainmniúil $1 × $2 picteilíni, méid comhaid: $3',
'show-big-image' => 'Taispeáin leagan ardtaifigh den íomhá',
@@ -2141,9 +2129,6 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
'scarytranscludefailed' => '[Theip leis an iarradh teimpléid do $1]',
'scarytranscludetoolong' => '[Tá an URL ró-fhada]',
-# Trackbacks
-'trackbackremove' => '([$1 Scrios])',
-
# Delete conflict
'deletedwhileediting' => "'''Aire''': scriosadh an leathanach seo nuair a bhí tu ag athrú é!",
'recreate' => 'Athchruthaigh',
diff --git a/languages/messages/MessagesGag.php b/languages/messages/MessagesGag.php
index 78aabeb1..aec30243 100644
--- a/languages/messages/MessagesGag.php
+++ b/languages/messages/MessagesGag.php
@@ -93,7 +93,7 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#YÖNNENDİRMÄKLER', '#YÖNNENDİR', '#YÖNNENDİRMÄ', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
+ 'redirect' => array( '0', '#YÖNNENDİRMÄKLER', '#YÖNNENDİR', '#YÖNNENDİRMÄ', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
);
$messages = array(
@@ -372,7 +372,6 @@ Yalvarêrız benneyiniz URL - i hem raport ediniz bunu bir [[Special:ListUsers/s
'badtitle' => 'Yannış yazı adı',
'badtitletext' => 'Girilen sayfa adı beki yannış beki de boş, yaki geçersiz neçin ki diller arası baalantı yaki vikiler arası baalantı içerer. Var nicä içindä olsun bir yaki taa çok nışan angıları yasak başlıklarda kullanılsın.',
'viewsource' => 'Geliniri gör',
-'viewsourcefor' => '$1 için',
'protectedpagetext' => 'Bu sayfa diiştirmämää deyni kilitlendi.',
'viewsourcetext' => 'Var nicä görmää hem kopiya etmää bu yapraa gelinirini:',
@@ -480,8 +479,6 @@ Herliim girmediniz [[Special:Preferences|seçimner]] bölümünde geçerli bir e
Şindi IP adresiniz $3. Yalvarêrêz bu adresi belirtmää her angı bir sorgu yapar kana.',
'blockednoreason' => 'hiç bir sebep belirtilmedi',
-'blockedoriginalsource' => "'''$1''' sayfasın kaynak teksti aşaada:",
-'whitelistedittitle' => 'Lääzım açmaa sessiya diişmäk yapmaa deyni',
'whitelistedittext' => 'Diişmäk yapmaa için $1.',
'nosuchsectiontitle' => 'Bölä bölüm yok',
'loginreqtitle' => 'Lääazım sessiya açmaa',
@@ -803,8 +800,7 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
'linksearch' => 'İç baalantlar',
# Special:Log/newusers
-'newuserlogpage' => 'Eni kullanıcı bennemäkleri',
-'newuserlog-create-entry' => 'Eni kullanıcı esabı',
+'newuserlogpage' => 'Eni kullanıcı bennemäkleri',
# Special:ListGroupRights
'listgrouprights-members' => '(azaların listası)',
@@ -842,7 +838,6 @@ Lütfen doorulayın ani siz neetlenersiniz bunu yapmaa, annêêrsiniz onun rezul
'actioncomplete' => 'İşlik tamannandı.',
'deletedtext' => '"$1" silindi.
Yakın zamanda silinenleri görmää deyni: $2.',
-'deletedarticle' => '"[[$1]]" silindi',
'dellogpage' => 'Silmää jurnalı',
'deletecomment' => 'Sebep',
'deleteotherreason' => 'BaÅŸka/ek sebep:',
@@ -878,9 +873,8 @@ Burada bitki seçimner '''$1''' yazı diiştirmää deyni:",
'restriction-level' => 'Yasaklama düzeyi:',
# Undelete
-'undeletebtn' => 'Geeri getir!',
-'undeletelink' => 'Göster/geeri getir',
-'undeletedarticle' => '[[$1]] geeri getirildi.',
+'undeletebtn' => 'Geeri getir!',
+'undeletelink' => 'Göster/geeri getir',
# Namespace form on various pages
'namespace' => 'Er adı:',
@@ -965,8 +959,6 @@ Yalvarêrêz başka bir ad seçmää.',
'talkexists' => "'''Bu sayfa kendisi başarılan aktarıldı, ama konuşmaa sayfası aktarılamadı neçin ki eni ad altında bulunêr taa birisi. Yalvarêrêz onnarı ellän birleştirmää.'''",
'movedto' => 'taşındı:',
'movetalk' => 'Varsa hem aktar "konuşmaa" sayfasını.',
-'1movedto2' => '[[$1]] sayfasın eni adı: [[$2]]',
-'1movedto2_redir' => '[[$1]] başlaa [[$2]] sayfasına gönderildi',
'movelogpage' => 'Ad diişmäk jurnalı',
'movereason' => 'Sebep',
'revertmove' => 'geeri al',
@@ -1048,7 +1040,7 @@ Dönün baş yapraa',
# Media information
'file-info-size' => '$1 × $2 piksel, fayl ölçüsü: $3, MIME tipi: $4',
-'file-nohires' => '<small>Taa üüksek aydınnıklı versiya bulunmêêr.</small>',
+'file-nohires' => 'Taa üüksek aydınnıklı versiya bulunmêêr.',
'svg-long-desc' => 'SVG faylı, nominal $1 × $2 piksel, fayl ölçüsü: $3',
'show-big-image' => 'Taman aydınnık',
diff --git a/languages/messages/MessagesGan.php b/languages/messages/MessagesGan.php
index 41117356..decfa8b5 100644
--- a/languages/messages/MessagesGan.php
+++ b/languages/messages/MessagesGan.php
@@ -12,7 +12,7 @@
* @author Vipuser
*/
-$fallback = 'gan-hant';
+$fallback = 'gan-hant, zh-hant, zh-hans';
$namespaceNames = array(
NS_MEDIA => 'Media',
diff --git a/languages/messages/MessagesGan_hans.php b/languages/messages/MessagesGan_hans.php
index 7845c479..f63ae998 100644
--- a/languages/messages/MessagesGan_hans.php
+++ b/languages/messages/MessagesGan_hans.php
@@ -377,14 +377,13 @@ MySQL回到错误“$3: $4â€ã€‚',
'cannotdelete' => '拣正𠮶页é¢æˆ–图åƒâ€œ$1â€åˆ ä¼“正。(佢å¯èƒ½æ‹•äººå®¶åˆ å¥å“©ã€‚)',
'badtitle' => '错误𠮶标题',
'badtitletext' => '所è¦æ±‚𠮶页é¢æ ‡é¢˜ä¼“正确,伓存在,跨语言或跨wiki链接。标题错误,佢å¯èƒ½æœ‰åªæˆ–好几åªä¼“åˆð ®¶æ ‡é¢˜å­—符。',
-'perfcached' => '底下系缓存资料,å¯èƒ½ä¼“系最新𠮶。',
-'perfcachedts' => '底下系缓存资料,佢最æ™æ›´æ–°ð ®¶æ—¶é—´ç³» $1。',
+'perfcached' => '底下系缓存资料,å¯èƒ½ä¼“系最新𠮶。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => '底下系缓存资料,佢最æ™æ›´æ–°ð ®¶æ—¶é—´ç³» $1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => '个页目å‰æ”¹ä¼“正,佢𠮶资料伓能仰上更新。',
'wrong_wfQuery_params' => 'å‚数错误斢到嘞 wfQuery()<br />
函数: $1<br />
查询: $2',
'viewsource' => 'æºä»£ç ',
-'viewsourcefor' => '$1 𠮶æºä»£ç ',
'protectedpagetext' => '个页é”到嘞,改伓正。',
'viewsourcetext' => '倷å¯ä»¥çœµå–或å¤åˆ¶ä¸ªé¡µð ®¶æºä»£ç ï¼š',
'protectedinterface' => '个页给正嘞软件𠮶界é¢æ–‡æœ¬ï¼Œä½¢æ‹–é”到怕人乱扤。',
@@ -535,9 +534,6 @@ $2',
倷𠮶å°é”IDç³»$5。请到查询𠮶时间都è¦ç´§æ ‡åˆ°ä½¢ã€‚',
'blockednoreason' => '冇è¯ç†ç”±',
-'blockedoriginalsource' => "底下系'''$1'''𠮶æºä»£ç :",
-'blockededitsource' => "底下系倷对'''$1'''𠮶'''编辑'''内容:",
-'whitelistedittitle' => '登入åŽæ‰ç¼–å¾—æ­£',
'whitelistedittext' => '起先倷è¦$1æ‰ç¼–得正个页。',
'confirmedittext' => '确认嘞emailæ‰èƒ½ç¼–写个页。麻烦用[[Special:Preferences|å‚数设置]]设置åŒç¡®è®¤å€·ð ®¶email。',
'nosuchsectiontitle' => '冇个åªæ®µè½',
@@ -699,8 +695,6 @@ $2',
'revdelete-unsuppress' => '移å¥æ¢å¤æ­£ð ®¶æ”¹åŠ¨ð ®¶é™åˆ¶',
'revdelete-log' => '原因:',
'revdelete-submit' => '应用到选正𠮶修改',
-'revdelete-logentry' => '已更改[[$1]]𠮶修改å¯è§æ€§',
-'logdelete-logentry' => '已更改[[$1]]𠮶事件å¯è§æ€§',
'revdelete-success' => "'''修订𠮶å¯è§æ€§è®¾ç½®æ­£å–½ã€‚'''",
'logdelete-success' => "'''事件𠮶å¯è§æ€§è®¾ç½®æ­£å–½ã€‚'''",
'revdel-restore' => '改动å¯è§æ€§',
@@ -708,7 +702,6 @@ $2',
'revdel-restore-visible' => '相得到𠮶修订版',
'pagehist' => '文章历å²',
'deletedhist' => '删å¥ð ®¶åŽ†å²',
-'revdelete-hid' => '弆到 $1',
# History merging
'mergehistory' => 'åˆå¹¶é¡µé¢ð ®¶åŽ†å²',
@@ -1182,6 +1175,7 @@ $2',
'protectedpagesempty' => '个兮å‚数下冇页é¢æ‹–ä¿æŠ¤åˆ°ã€‚',
'protectedtitles' => 'ä¿æŠ¤é¢˜ç›®',
'listusers' => '用户列表',
+'usercreated' => '到$1𠮶$2{{GENDER:$3|建立}}',
'newpages' => '新页é¢',
'newpages-username' => '用户å:',
'ancientpages' => 'è€æ—©ð ®¶é¡µé¢',
@@ -1243,8 +1237,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => '寻伓到用户。',
# Special:Log/newusers
-'newuserlogpage' => '新开户𠮶人åå•',
-'newuserlog-create-entry' => '新用户𠮶账户',
+'newuserlogpage' => '新开户𠮶人åå•',
# Special:ListGroupRights
'listgrouprights-members' => '(æˆå‘˜åå•ï¼‰',
@@ -1339,7 +1332,6 @@ $NEWPAGE
'actioncomplete' => '扤正嘞',
'actionfailed' => 'æ“作冇舞正',
'deletedtext' => '"$1"删åŸå˜žã€‚最æ™ð ®¶åˆ é™¤è®°å½•è¯·æœ›$2。',
-'deletedarticle' => '"[[$1]]"删åŸå˜ž',
'dellogpage' => '删除日志',
'dellogpagetext' => '下底系最æ™åˆ é™¤ð ®¶è®°å½•åˆ—表:',
'deletionlog' => '删除日志',
@@ -1434,7 +1426,6 @@ $NEWPAGE
'undeleteviewlink' => '望å–',
'undeletereset' => '设过',
'undeletecomment' => '评论:',
-'undeletedarticle' => 'æ¢å¤æ­£ð ®¶"[[$1]]"',
'undeletedrevisions' => '$1åªä¿®æ”¹ç‰ˆæœ¬æ¢å¤æ­£å˜ž',
'undeletedrevisions-files' => '$1åªä¿®æ”¹ç‰ˆæœ¬åŒ$2åªæ¡£æ¡ˆæ¢å¤æ­£å˜ž',
'undeletedfiles' => '$1åªæ¡£æ¡ˆæ¢å¤æ­£å˜ž',
@@ -1624,8 +1615,6 @@ $1',
'talkexists' => '页é¢æœ¬èº«ç§»åŠ¨æ­£å˜žï¼Œä½†ç³»æ–°æ ‡é¢˜ä¸‹åº•æœ‰å˜žå¯¹è¯é¡µï¼Œæ‰€ä»¥å¯¹è¯é¡µç§»ä¼“正。请手工åˆå¹¶ä¸¤é¡µã€‚',
'movedto' => '移到',
'movetalk' => '移动相关𠮶讨论页',
-'1movedto2' => '[[$1]]移到[[$2]]',
-'1movedto2_redir' => '[[$1]]通过é‡å®šå‘移到[[$2]]',
'movelogpage' => '移动日志',
'movelogpagetext' => '下底系移动嘞𠮶页é¢åˆ—表:',
'movereason' => '原因:',
@@ -1817,8 +1806,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => '巡查记录',
-'patrol-log-line' => '标正嘞$1/$2版系检查过𠮶$3',
-'patrol-log-auto' => '(自动)',
# Image deletion
'deletedrevision' => '删åŸå˜žæ—§ç‰ˆæœ¬$1。',
@@ -1842,7 +1829,7 @@ $1',
'widthheightpage' => '$1 × $2,$3页',
'file-info' => '档案大细: $1, MIME 类型: $2',
'file-info-size' => '$1 × $2 åƒç´ ï¼Œæ¡£æ¡ˆå¤§ç»†ï¼š$3 ,MIME类型:$4',
-'file-nohires' => '<small>冇更高分辨率𠮶图åƒã€‚</small>',
+'file-nohires' => '冇更高分辨率𠮶图åƒã€‚',
'svg-long-desc' => 'SVG档案,表é¢å¤§ç»†ï¼š $1 × $2 åƒç´ ï¼Œæ¡£æ¡ˆå¤§ç»†ï¼š$3',
'show-big-image' => '完整分辨率',
@@ -2167,13 +2154,6 @@ $3
'scarytranscludefailed' => '[对伓ä½ï¼Œæå–$1失败]',
'scarytranscludetoolong' => '[对伓ä½ï¼ŒURL 太长]',
-# Trackbacks
-'trackbackbox' => '个篇文章𠮶引用:<br />
-$1',
-'trackbackremove' => '([$1删除])',
-'trackbacklink' => '引用',
-'trackbackdeleteok' => 'æˆåŠŸåˆ åŸä¸ªåªå¼•ç”¨ã€‚',
-
# Delete conflict
'deletedwhileediting' => '警告: 倷编辑𠮶时间有人删åŸå˜žä¸ªé¡µï¼',
'confirmrecreate' => "倷编辑𠮶时间,用户[[User:$1|$1]]([[User talk:$1|对è¯]])因为下底原因删åŸå˜žä¸ªé¡µ:
diff --git a/languages/messages/MessagesGan_hant.php b/languages/messages/MessagesGan_hant.php
index 78e5a521..858df337 100644
--- a/languages/messages/MessagesGan_hant.php
+++ b/languages/messages/MessagesGan_hant.php
@@ -15,7 +15,7 @@
* @author Vipuser
*/
-$fallback = 'zh-hant';
+$fallback = 'zh-hant, zh-hans';
$namespaceNames = array(
NS_TALK => '談詑',
@@ -400,14 +400,13 @@ MySQL回到錯誤“$3: $4â€ã€‚',
'cannotdelete' => 'æ€æ­£å—°é é¢æˆ–圖åƒâ€œ$1â€åˆªä¼“正。(佢å¯èƒ½æ‹•äººå®¶åˆªå¥å“©ã€‚)',
'badtitle' => '錯誤嗰標題',
'badtitletext' => '所è¦æ±‚å—°é é¢æ¨™é¡Œä¼“正確,伓存在,跨語言或跨wiki連çµã€‚標題錯誤,佢å¯èƒ½æœ‰éš»æˆ–好幾隻伓åˆå—°æ¨™é¡Œå­—符。',
-'perfcached' => '底下係緩存資料,å¯èƒ½ä¼“係最新嗰。',
-'perfcachedts' => '底下係緩存資料,佢最æ™æ›´æ–°å—°æ™‚é–“ä¿‚ $1。',
+'perfcached' => '底下係緩存資料,å¯èƒ½ä¼“係最新嗰。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => '底下係緩存資料,佢最æ™æ›´æ–°å—°æ™‚é–“ä¿‚ $1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => '箇é ç›®å‰æ”¹ä¼“正,佢嗰資料伓能仰上更新。',
'wrong_wfQuery_params' => 'åƒæ•¸éŒ¯èª¤æ–¢åˆ°å˜ž wfQuery()<br />
函數: $1<br />
查詢: $2',
'viewsource' => '原始碼',
-'viewsourcefor' => '$1 嗰原始碼',
'protectedpagetext' => '箇é éŽ–到嘞,改伓正。',
'viewsourcetext' => '倷å¯ä»¥çœµå–或複製箇é å—°åŽŸå§‹ç¢¼ï¼š',
'protectedinterface' => '箇é çµ¦æ­£å˜žè»Ÿä»¶å—°ç•Œé¢æ–‡æœ¬ï¼Œä½¢æ‹•éŽ–到怕人亂扤。',
@@ -558,9 +557,6 @@ $2',
倷嗰å°éŽ–IDä¿‚$5。請到查詢嗰時間都è¦ç·Šæ¨™åˆ°ä½¢ã€‚',
'blockednoreason' => '冇話ç†ç”±',
-'blockedoriginalsource' => "底下係'''$1'''嗰原始碼:",
-'blockededitsource' => "底下係倷å°'''$1'''å—°'''編輯'''內容:",
-'whitelistedittitle' => '登入後æ‰ç·¨å¾—æ­£',
'whitelistedittext' => 'èµ·å…ˆæ±è¦$1æ‰ç·¨å¾—正箇é ã€‚',
'confirmedittext' => '確èªå˜žemailæ‰èƒ½ç·¨å¯«ç®‡é ã€‚麻煩用[[Special:Preferences|åƒæ•¸è¨­ç½®]]設置åŒç¢ºèªå€·å—°email。',
'nosuchsectiontitle' => '冇箇隻段è½',
@@ -722,8 +718,6 @@ $2',
'revdelete-unsuppress' => '移å¥æ¢å¾©æ­£å—°æ”¹å‹•å—°é™åˆ¶',
'revdelete-log' => '原因:',
'revdelete-submit' => '應用到é¸æ­£å—°ä¿®æ”¹',
-'revdelete-logentry' => '已更改[[$1]]嗰修改å¯è¦‹æ€§',
-'logdelete-logentry' => '已更改[[$1]]嗰事件å¯è¦‹æ€§',
'revdelete-success' => "'''修訂嗰å¯è¦‹æ€§è¨­ç½®æ­£å˜ã€‚'''",
'logdelete-success' => "'''事件嗰å¯è¦‹æ€§è¨­ç½®æ­£å˜ã€‚'''",
'revdel-restore' => '改動å¯è¦‹æ€§',
@@ -731,8 +725,6 @@ $2',
'revdel-restore-visible' => '相得到嗰修訂版',
'pagehist' => '文章歷å²',
'deletedhist' => '刪å¥å—°æ­·å²',
-'revdelete-uname' => '用戶å',
-'revdelete-hid' => '弆到 $1',
# History merging
'mergehistory' => 'åˆä½µé é¢å—°æ­·å²',
@@ -1206,7 +1198,7 @@ $2',
'protectedpagesempty' => '箇兮åƒæ•¸ä¸‹å†‡é é¢æ‹•ä¿è­·åˆ°ã€‚',
'protectedtitles' => 'ä¿è­·é¡Œç›®',
'listusers' => '用戶列表',
-'usercreated' => '$1嗰$2建立',
+'usercreated' => '到$1嗰$2{{GENDER:$3|建立}}',
'newpages' => 'æ–°é ',
'newpages-username' => '用戶å:',
'ancientpages' => 'è€æ—©å—°é é¢',
@@ -1268,8 +1260,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => '尋伓到用戶。',
# Special:Log/newusers
-'newuserlogpage' => '新開戶嗰人åå–®',
-'newuserlog-create-entry' => '新用戶嗰賬戶',
+'newuserlogpage' => '新開戶嗰人åå–®',
# Special:ListGroupRights
'listgrouprights-members' => '(æˆå“¡å單)',
@@ -1364,7 +1355,6 @@ $NEWPAGE
'actioncomplete' => '舞正哩',
'actionfailed' => 'æ“作冇舞正',
'deletedtext' => '"$1"刪åŸå˜žã€‚最æ™å—°åˆªé™¤è¨˜éŒ„請望$2。',
-'deletedarticle' => '"[[$1]]"刪åŸå˜ž',
'dellogpage' => '刪除日誌',
'dellogpagetext' => '下底係最æ™åˆªé™¤å—°è¨˜éŒ„列表:',
'deletionlog' => '刪除日誌',
@@ -1459,7 +1449,6 @@ $NEWPAGE
'undeleteviewlink' => '望å–',
'undeletereset' => '設éŽ',
'undeletecomment' => 'è©•è«–:',
-'undeletedarticle' => 'æ¢å¾©æ­£å—°"[[$1]]"',
'undeletedrevisions' => '$1隻修改版本æ¢å¾©æ­£å˜ž',
'undeletedrevisions-files' => '$1隻修改版本åŒ$2隻檔案æ¢å¾©æ­£å˜ž',
'undeletedfiles' => '$1隻檔案æ¢å¾©æ­£å˜ž',
@@ -1649,8 +1638,6 @@ $1',
'talkexists' => 'é é¢æœ¬èº«ç§»å‹•æ­£å˜žï¼Œä½†ä¿‚新標題下底有嘞å°è©±é ï¼Œæ‰€ä»¥å°è©±é ç§»ä¼“正。請手工åˆä½µå…©é ã€‚',
'movedto' => '移到',
'movetalk' => '移動相關嗰討論é ',
-'1movedto2' => '[[$1]]移到[[$2]]',
-'1movedto2_redir' => '[[$1]]通éŽé‡å®šå‘移到[[$2]]',
'movelogpage' => '移動日誌',
'movelogpagetext' => '下底係移動嘞嗰é é¢åˆ—表:',
'movereason' => '原因:',
@@ -1842,8 +1829,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => '巡查記錄',
-'patrol-log-line' => '標正嘞$1/$2版係檢查éŽå—°$3',
-'patrol-log-auto' => '(自動)',
# Image deletion
'deletedrevision' => '刪åŸå˜žèˆŠç‰ˆæœ¬$1。',
@@ -1867,7 +1852,7 @@ $1',
'widthheightpage' => '$1 × $2,$3é ',
'file-info' => '檔案大細: $1, MIME 類型: $2',
'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大細:$3 ,MIME類型:$4',
-'file-nohires' => '<small>冇更高解åƒåº¦å—°åœ–åƒã€‚</small>',
+'file-nohires' => '冇更高解åƒåº¦å—°åœ–åƒã€‚',
'svg-long-desc' => 'SVG檔案,表é¢å¤§ç´°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大細:$3',
'show-big-image' => '完整解æžåº¦',
@@ -2192,13 +2177,6 @@ $3
'scarytranscludefailed' => '[å°ä¼“ä½ï¼Œæå–$1失敗]',
'scarytranscludetoolong' => '[å°ä¼“ä½ï¼ŒURL 太長]',
-# Trackbacks
-'trackbackbox' => '箇篇文章嗰引用:<br />
-$1',
-'trackbackremove' => '([$1刪除])',
-'trackbacklink' => '引用',
-'trackbackdeleteok' => 'æˆåŠŸåˆªåŸç®‡éš»å¼•ç”¨ã€‚',
-
# Delete conflict
'deletedwhileediting' => '警告: 倷編輯嗰時間有人刪åŸå˜žç®‡é ï¼',
'confirmrecreate' => "倷編輯嗰時間,用戶[[User:$1|$1]]([[User talk:$1|å°è©±]])因為下底原因刪åŸå˜žç®‡é :
diff --git a/languages/messages/MessagesGd.php b/languages/messages/MessagesGd.php
index 842adf90..e10337b3 100644
--- a/languages/messages/MessagesGd.php
+++ b/languages/messages/MessagesGd.php
@@ -373,23 +373,25 @@ An dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse
'badarticleerror' => 'Cha ghabh an gnìomh seo a dhèanamh air an duilleag seo.',
'cannotdelete' => 'Cha do ghabh an duilleag no am faidhle "$1" a sguabadh às.
Faodaidh gun deach a sguabadh às le cuideigin eile mu thràth.',
+'cannotdelete-title' => 'Cha ghabh an duilleag "$1" a sguabadh às',
'badtitle' => 'Droch thiotal',
'badtitletext' => "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.
Faodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
-'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh.",
-'perfcachedts' => "Chaidh an dàta a leanas a thasgadh 's chaidh ùrachadh $1 turas mu dheireadh.",
+'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùradhadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
'querypage-no-updates' => 'Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.
Cha dèid an dàta an-seo ùrachadh aig an àm seo.',
'wrong_wfQuery_params' => 'Paramatairean mì-cheart airson wfQuery()<br />
Foincsean: $1<br />
Iarrtas: $2',
'viewsource' => 'Seall an tùs',
-'viewsourcefor' => 'airson $1',
+'viewsource-title' => 'Seall an tùs aig $1',
'actionthrottled' => 'Gnìomh air a mhùchadh',
'actionthrottledtext' => "Gus casg a chur air spama, chan urrainn dhut an gnìomh seo a dhèanamh ro thric am broinn ùine ghoirid agus chaidh thu thairis air a' chrìoch seo.
Feuch ris a-rithist às a dhèidh seo.",
'protectedpagetext' => 'Chaidh an duilleag seo a ghlasadh gus casg a chur air deasachadh.',
'viewsourcetext' => "'S urrainn dhut coimhead air tùs na duilleige seo 's lethbhreac a dhèanamh dheth:",
+'viewyourtext' => "'S urrainn dhut coimhead air '''na mhùthaich thu''' 's lethbhreac a dhèanamh dheth air an duilleag seo:",
'protectedinterface' => "Tha an duilleag seo a' solar teacsa eadar-aghaidh airson a' bhathar-bhog is chaidh a ghlaadh gus casg a chur air mì-chleachdadh.",
'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 i.
@@ -666,13 +668,9 @@ Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, ''
# Revision deletion
'rev-delundel' => 'seall/falaich',
-'revdelete-logentry' => 'a dh\'atharraich faicsinneachd mùthaidhean "[[$1]]"',
'revdel-restore' => 'mùth follaiseachd',
'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
'revdel-restore-visible' => 'mùthaidhean faicsinneach',
-'revdelete-content' => 'susbaint',
-'revdelete-hid' => "a dh'fhalaich $1",
-'revdelete-log-message' => '$1 airson $2 {{PLURAL:$2|mhùthadh|mhùthadh|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
# Merge log
'revertmerge' => 'Dì-aontaich',
@@ -883,7 +881,7 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
'shortpages' => 'Duilleagan goirid',
'longpages' => 'Duilleagan fada',
'listusers' => 'Liosta nan cleachdaichean',
-'usercreated' => 'a chruthaich $1 aig $2',
+'usercreated' => 'Air a chruthachadh le {{GENDER:$3|}} $1 aig $2',
'newpages' => 'Duilleagan ùra',
'ancientpages' => 'Duilleagan as sìne',
'move' => 'Gluais',
@@ -921,8 +919,7 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
'linksearch-line' => "Tha $1 a' ceangal an-seo o $2",
# Special:Log/newusers
-'newuserlogpage' => 'Loga cruthachaidh de chleachdaichean',
-'newuserlog-create-entry' => 'Cunntas de chleachdaiche ùr',
+'newuserlogpage' => 'Loga cruthachaidh de chleachdaichean',
# Special:ListGroupRights
'listgrouprights-members' => '(liosta de bhuill)',
@@ -972,7 +969,6 @@ Dearbhaich gu bheil thu airson seo a dhèanamh 's gun tuig thu a' bhuaidh a bhio
'actionfailed' => "Dh'fhàillig ort",
'deletedtext' => 'Chaidh "$1" a sguabadh às.
Seall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoirid.',
-'deletedarticle' => '"[[$1]]" air a sguabadh às',
'dellogpage' => 'Loga an sguabaidh às',
'reverted' => 'Air aiseag gu tionndadh nas sine',
'deletecomment' => 'Adhbhar:',
@@ -1023,7 +1019,6 @@ Seo roghainnean làithreach na duilleige '''$1''':",
'undeleterevisions' => 'Chaidh $1 {{PLURAL:$1|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreacan|leth-bhreac}} a chur san tasg-lann',
'undeletelink' => 'seall/aisig',
'undeleteviewlink' => 'seall',
-'undeletedarticle' => 'a dh\'aisig "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Namespace:',
@@ -1128,8 +1123,6 @@ Nach tagh thu ainm eile?',
Bidh agad ris an co-aontachadh a làimh.'''",
'movedto' => 'air a ghluasad a',
'movetalk' => 'Gluais an duilleag deasbaireachd a tha co-cheangailte ris',
-'1movedto2' => '[[$1]] air a ghluasad a [[$2]]',
-'1movedto2_redir' => 'a ghluais [[$1]] a [[$2]] thairis air ath-sheòladh',
'movelogpage' => 'Loga nan gluasadan',
'movereason' => 'Adhbhar:',
'revertmove' => 'till',
@@ -1218,17 +1211,13 @@ Tadhail air [//www.mediawiki.org/wiki/Localisation Ionadaileadh MediaWiki] is [/
'others' => 'eile',
'siteusers' => '{{PLURAL:$2|chleachdaiche|chleachdaiche|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} {{SITENAME}} $1',
-# Patrol log
-'patrol-log-line' => 'a chomharraich $1 dhen duilleag $2 freiceadan $3',
-'patrol-log-diff' => 'lèirmheas $1',
-
# Browsing diffs
'previousdiff' => '↠Mùthadh nas sine',
'nextdiff' => 'Deasachadh nas ùire →',
# Media information
'file-info-size' => '$1 × $2 pixel, meud an fhaidhle: $3, seòrsa MIME: $4',
-'file-nohires' => '<small>Chan eil dùmhlachd-bhreacaidh nas fhearr ri fhaighinn.</small>',
+'file-nohires' => 'Chan eil dùmhlachd-bhreacaidh nas fhearr ri fhaighinn.',
'svg-long-desc' => 'Faidhle SVG, a-rèir ainm $1 × $2 pixel, meud faidhle: $3',
'show-big-image' => 'Dùmhlachd-bhreacaidh shlàn',
diff --git a/languages/messages/MessagesGl.php b/languages/messages/MessagesGl.php
index b2ba1e18..084d2e5d 100644
--- a/languages/messages/MessagesGl.php
+++ b/languages/messages/MessagesGl.php
@@ -8,6 +8,7 @@
* @file
*
* @author Alma
+ * @author Elisardojm
* @author Gallaecio
* @author Gustronico
* @author Kaganer
@@ -66,12 +67,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'Todas_as_mensaxes' ),
'Allpages' => array( 'Todas_as_páxinas' ),
'Ancientpages' => array( 'Páxinas_máis_antigas' ),
+ 'Badtitle' => array( 'Título_incorrecto' ),
'Blankpage' => array( 'Baleirar_a_páxina' ),
'Block' => array( 'Bloquear', 'Bloquear_o_enderezo_IP', 'Bloquear_o_usuario' ),
'Blockme' => array( 'Bloquearme' ),
'Booksources' => array( 'Fontes_bibliográficas' ),
'BrokenRedirects' => array( 'Redireccións_rotas' ),
'Categories' => array( 'Categorías' ),
+ 'ChangeEmail' => array( 'Cambiar_o_correo_electrónico' ),
'ChangePassword' => array( 'Cambiar_o_contrasinal' ),
'ComparePages' => array( 'Comparar_as_páxinas' ),
'Confirmemail' => array( 'Confirmar_o_correo_electrónico' ),
@@ -160,59 +163,59 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECCIÓN', '#REDIRECIONAMENTO', '#REDIRECT' ),
- 'notoc' => array( '0', '__SENÃNDICE__', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__SENGALERÃA__', '__SEMGALERIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORZAROÃNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ÃNDICE__', '__TDC__', '__SUMÃRIO__', '__TOC__' ),
- 'noeditsection' => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NOMEDOMESACTUAL', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'ABREVIATURADOMESACTUAL', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DÃAACTUAL', 'DIAATUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAATUAL2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMEDODÃAACTUAL', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANOACTUAL', 'ANOATUAL', 'CURRENTYEAR' ),
- 'currenthour' => array( '1', 'HORAACTUAL', 'HORAATUAL', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'ABREVIATURADOMESLOCAL', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'DÃALOCAL2', 'DIALOCAL2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMEDODÃALOCAL', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
- 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NÚMERODEPÃXINAS', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NÚMERODEARTIGOS', 'NUMERODEARTIGOS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NÚMERODEFICHEIROS', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'NÚMERODEEDICIÓNS', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NOMEDAPÃXINA', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
- 'namespace' => array( '1', 'ESPAZODENOMES', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
- 'fullpagename' => array( '1', 'NOMECOMPLETODAPÃXINA', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'NOMEDASUBPÃXINA', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
- 'basepagename' => array( '1', 'NOMEDAPÃXINABASE', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
- 'talkpagename' => array( '1', 'NOMEDAPÃXINADECONVERSA', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
- 'img_manualthumb' => array( '1', 'miniatura=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'dereita', 'direita', 'right' ),
- 'img_left' => array( '1', 'esquerda', 'left' ),
- 'img_none' => array( '1', 'ningún', 'nenhum', 'none' ),
- 'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_page' => array( '1', 'páxina=$1', 'páxina $1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'bordo', 'borda', 'border' ),
- 'grammar' => array( '0', 'GRAMÃTICA:', 'GRAMMAR:' ),
- 'displaytitle' => array( '1', 'AMOSAROTÃTULO', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LIGAZÓNDANOVASECCIÓN__', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
- 'language' => array( '0', '#LINGUA:', '#IDIOMA:', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'NÚMERODEADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'especial', 'special' ),
- 'tag' => array( '0', 'etiqueta', 'tag' ),
- 'hiddencat' => array( '1', '__CATEGORÃAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PÃXINASNACATEGORÃA', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TAMAÑODAPÃXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#REDIRECCIÓN', '#REDIRECIONAMENTO', '#REDIRECT' ),
+ 'notoc' => array( '0', '__SENÃNDICE__', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__SENGALERÃA__', '__SEMGALERIA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORZAROÃNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ÃNDICE__', '__TDC__', '__SUMÃRIO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NOMEDOMESACTUAL', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'ABREVIATURADOMESACTUAL', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'DÃAACTUAL', 'DIAATUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAATUAL2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMEDODÃAACTUAL', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANOACTUAL', 'ANOATUAL', 'CURRENTYEAR' ),
+ 'currenthour' => array( '1', 'HORAACTUAL', 'HORAATUAL', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'ABREVIATURADOMESLOCAL', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'DÃALOCAL2', 'DIALOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMEDODÃALOCAL', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+ 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NÚMERODEPÃXINAS', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NÚMERODEARTIGOS', 'NUMERODEARTIGOS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NÚMERODEFICHEIROS', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'NÚMERODEEDICIÓNS', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NOMEDAPÃXINA', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
+ 'namespace' => array( '1', 'ESPAZODENOMES', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
+ 'fullpagename' => array( '1', 'NOMECOMPLETODAPÃXINA', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'NOMEDASUBPÃXINA', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'NOMEDAPÃXINABASE', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'NOMEDAPÃXINADECONVERSA', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
+ 'img_manualthumb' => array( '1', 'miniatura=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'dereita', 'direita', 'right' ),
+ 'img_left' => array( '1', 'esquerda', 'left' ),
+ 'img_none' => array( '1', 'ningún', 'nenhum', 'none' ),
+ 'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_page' => array( '1', 'páxina=$1', 'páxina $1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'bordo', 'borda', 'border' ),
+ 'grammar' => array( '0', 'GRAMÃTICA:', 'GRAMMAR:' ),
+ 'displaytitle' => array( '1', 'AMOSAROTÃTULO', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LIGAZÓNDANOVASECCIÓN__', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
+ 'language' => array( '0', '#LINGUA:', '#IDIOMA:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'NÚMERODEADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'especial', 'special' ),
+ 'tag' => array( '0', 'etiqueta', 'tag' ),
+ 'hiddencat' => array( '1', '__CATEGORÃAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PÃXINASNACATEGORÃA', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TAMAÑODAPÃXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -576,22 +579,24 @@ Por favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando
'badarticleerror' => 'Non pode efectuarse esa acción nesta páxina.',
'cannotdelete' => 'Non se puido borrar a páxina ou imaxe "$1".
Se cadra, xa a borrou alguén.',
+'cannotdelete-title' => 'Non se pode borrar 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 interlingua ou interwiki incorrecta.
Pode conter un ou máis caracteres dos que non se poden empregar nos títulos.',
-'perfcached' => 'A información seguinte é da memoria caché e pode ser que non estea completamente actualizada.',
-'perfcachedts' => 'Esta información é da memoria caché. Última actualización: $1.',
+'perfcached' => 'Esta información é da memoria caché e pode ser que non estea completamente actualizada. Hai un máximo de {{PLURAL:$1|$1 resultado dispoñible|$1 resultados dispoñibles}} na caché.',
+'perfcachedts' => 'Esta información é da memoria caché. Última actualización: $2 ás $3. Hai un máximo de {{PLURAL:$4|$4 resultado dispoñible|$4 resultados dispoñibles}} na caché.',
'querypage-no-updates' => 'Neste momento están desactivadas as actualizacións nesta páxina. O seu contido non se modificará.',
'wrong_wfQuery_params' => 'Parámetros incorrectos para wfQuery()<br />
Función: $1<br />
Dúbida: $2',
'viewsource' => 'Ver o código fonte',
-'viewsourcefor' => 'de "$1"',
+'viewsource-title' => 'Ver o código fonte de "$1"',
'actionthrottled' => 'Acción limitada',
'actionthrottledtext' => "Como unha medida de loita contra o ''spam'', limítase a realización desta acción a un número determinado de veces nun curto espazo de tempo, e vostede superou este límite.
Inténteo de novo nuns minutos.",
'protectedpagetext' => 'Esta páxina foi protexida para evitar a edición.',
'viewsourcetext' => 'Pode ver e copiar o código fonte desta páxina:',
+'viewyourtext' => "Pode ver e copiar o código fonte '''das súas edicións''' nesta páxina:",
'protectedinterface' => 'Esta páxina fornece o texto da interface do software e está protexida para evitar o seu abuso.',
'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 para os outros usuarios.
@@ -702,6 +707,7 @@ Como resultado, os visitantes que usen este enderezo IP non poden crear máis co
'emailconfirmlink' => 'Confirmar o enderezo de correo electrónico',
'invalidemailaddress' => 'Non se pode aceptar o enderezo de correo electrónico porque semella ter un formato incorrecto.
Insira un enderezo cun formato válido ou baleire ese campo.',
+'cannotchangeemail' => 'Neste wiki non se poden mudar os enderezos de correo electrónico asociados a unha conta.',
'accountcreated' => 'Conta creada',
'accountcreatedtext' => 'Creouse a conta de usuario para "$1".',
'createaccount-title' => 'Creación dunha conta para {{SITENAME}}',
@@ -718,6 +724,7 @@ Por favor, agarde antes de probar outra vez.',
# E-mail sending
'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP',
+'user-mail-no-addy' => 'Intentou enviar un correo sen enderezo de correo electrónico.',
# Change password dialog
'resetpass' => 'Cambiar o contrasinal',
@@ -738,16 +745,18 @@ Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal
'resetpass-temp-password' => 'Contrasinal temporal:',
# Special:PasswordReset
-'passwordreset' => 'Restablecer o contrasinal',
-'passwordreset-text' => 'Encha este formulario para recibir un recordatorio por correo electrónico cos detalles da súa conta.',
-'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-username' => 'Nome de usuario:',
-'passwordreset-domain' => 'Dominio:',
-'passwordreset-email' => 'Enderezo de correo electrónico:',
-'passwordreset-emailtitle' => 'Detalles da conta de {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguén (probablemente vostede, desde o enderezo IP $1) solicitou un recordatorio coa
+'passwordreset' => 'Restablecer o contrasinal',
+'passwordreset-text' => 'Encha este formulario para recibir un recordatorio por correo electrónico cos detalles da súa conta.',
+'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-username' => 'Nome de usuario:',
+'passwordreset-domain' => 'Dominio:',
+'passwordreset-capture' => 'Quere ollar o correo electrónico?',
+'passwordreset-capture-help' => 'Se marca esta caixa, poderá ver o correo electrónico (co contrasinal temporal) que se envía ao usuario.',
+'passwordreset-email' => 'Enderezo de correo electrónico:',
+'passwordreset-emailtitle' => 'Detalles da conta de {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Alguén (probablemente vostede, desde o enderezo IP $1) solicitou un recordatorio coa
información da súa conta en {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}
a este enderezo de correo electrónico:
@@ -757,7 +766,7 @@ $2
Debería acceder ao sistema e elixir un novo contrasinal agora. Se outro fixo esta
solicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,
ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
-'passwordreset-emailtext-user' => 'O usuario $1 solicitou un recordatorio coa información da súa conta en {{SITENAME}}
+'passwordreset-emailtext-user' => 'O usuario $1 solicitou un recordatorio coa información da súa conta en {{SITENAME}}
($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}
a este enderezo de correo electrónico:
@@ -767,9 +776,22 @@ $2
Debería acceder ao sistema e elixir un novo contrasinal agora. Se outro fixo esta
solicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,
ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
-'passwordreset-emailelement' => 'Nome de usuario: $1
+'passwordreset-emailelement' => 'Nome de usuario: $1
Contrasinal temporal: $2',
-'passwordreset-emailsent' => 'Enviouse o correo electrónico co recordatorio.',
+'passwordreset-emailsent' => 'Enviouse o correo electrónico co recordatorio.',
+'passwordreset-emailsent-capture' => 'Enviouse un correo electrónico recordatorio, 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.',
+
+# Special:ChangeEmail
+'changeemail' => 'Cambiar o enderezo de correo electrónico',
+'changeemail-header' => 'Cambiar o enderezo de correo electrónico da conta',
+'changeemail-text' => 'Encha este formulario para cambiar o seu enderezo de correo electrónico. Terá que escribir o seu contrasinal para confirmar este cambio.',
+'changeemail-no-info' => 'Debe rexistrarse para acceder directamente a esta páxina.',
+'changeemail-oldemail' => 'Enderezo de correo electrónico actual:',
+'changeemail-newemail' => 'Novo enderezo de correo electrónico:',
+'changeemail-none' => '(ningún)',
+'changeemail-submit' => 'Cambiar o correo electrónico',
+'changeemail-cancel' => 'Cancelar',
# Edit page toolbar
'bold_sample' => 'Texto en negra',
@@ -841,9 +863,6 @@ Teña en conta que non pode empregar "enviarlle un correo electrónico a este us
O seu enderezo IP actual é $3 e o ID do bloqueo é #$5.
Por favor, inclúa eses datos nas consultas que faga.',
'blockednoreason' => 'non se deu ningunha razón',
-'blockedoriginalsource' => "O código fonte de '''$1''' móstrase a continuación:",
-'blockededitsource' => "O texto das '''súas edicións''' en '''$1''' móstrase a continuación:",
-'whitelistedittitle' => 'Cómpre acceder ao sistema para poder editar',
'whitelistedittext' => 'Ten que $1 para poder editar páxinas.',
'confirmedittext' => 'Debe confirmar o correo electrónico antes de comezar a editar. Por favor, configure e dea validez ao correo mediante as súas [[Special:Preferences|preferencias de usuario]].',
'nosuchsectiontitle' => 'Non se pode atopar a sección',
@@ -929,7 +948,7 @@ Ao mesmo tempo, prométanos que o que escribiu é da súa autoría ou que está
'copyrightwarning2' => "Por favor, decátese de que todas as súas contribucións a {{SITENAME}} poden ser editadas, alteradas ou eliminadas por outras persoas. Se non quere que os seus escritos sexan editados sen piedade, non os publique aquí.<br />
Do mesmo xeito, comprométese a que o que vostede escriba sexa da súa autoría ou copiado dunha fonte de dominio público ou recurso público semellante (vexa $1 para detalles).
'''NON ENVÃE SEN PERMISO TRABALLOS CON DEREITOS DE COPIA!'''",
-'longpageerror' => "'''Erro: O texto que pretende gardar ocupa $1 kilobytes, e existe un límite dun máximo de $2 kilobytes.'''
+'longpageerror' => "'''Erro: O texto que pretende gardar ocupa {{PLURAL:$1|$1 kilobyte|$1 kilobytes}}, e existe un límite dun máximo de {{PLURAL:$2|$2 kilobyte|$2 kilobytes}}.'''
Polo tanto, non se pode gardar.",
'readonlywarning' => "'''Atención: A base de datos foi pechada para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.'''
Se cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.
@@ -1099,8 +1118,6 @@ Os demais administradores de {{SITENAME}} poderán acceder ao contido agochado e
'revdelete-unsuppress' => 'Retirar as restricións sobre as revisións restauradas',
'revdelete-log' => 'Motivo:',
'revdelete-submit' => 'Aplicar {{PLURAL:$1|á revisión seleccionada|ás revisións seleccionadas}}',
-'revdelete-logentry' => 'mudou a visibilidade dunha revisión de "[[$1]]"',
-'logdelete-logentry' => 'mudou a visibilidade do evento de "[[$1]]"',
'revdelete-success' => "'''Actualizouse sen problemas a visibilidade da revisión.'''",
'revdelete-failure' => "'''Non se puido actualizar a visibilidade da revisión:'''
$1",
@@ -1112,15 +1129,6 @@ $1",
'revdel-restore-visible' => 'revisións visibles',
'pagehist' => 'Historial da páxina',
'deletedhist' => 'Historial de borrado',
-'revdelete-content' => 'o contido',
-'revdelete-summary' => 'o resumo de edición',
-'revdelete-uname' => 'o nome de usuario',
-'revdelete-restricted' => 'aplicou restricións aos administradores',
-'revdelete-unrestricted' => 'eliminou restricións aos administradores',
-'revdelete-hid' => 'agochou $1',
-'revdelete-unhid' => 'descubriu $1',
-'revdelete-log-message' => '$1 {{PLURAL:$2|dunha revisión|de $2 revisións}}',
-'logdelete-log-message' => '$1 {{PLURAL:$2|dun evento|de $2 eventos}}',
'revdelete-hide-current' => 'Produciuse un erro ao agochar o elemento con data do $1 ás $2: Esta é a revisión actual.
Non se pode agochar.',
'revdelete-show-no-access' => 'Produciuse un erro ao mostrar o elemento con data do $1 ás $2: Este elemento marcouse como "restrinxido".
@@ -1278,12 +1286,14 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
'prefs-rc' => 'Cambios recentes',
'prefs-watchlist' => 'Lista de vixilancia',
'prefs-watchlist-days' => 'Número de días que mostrar na lista de vixilancia:',
-'prefs-watchlist-days-max' => 'Máximo 7 días',
+'prefs-watchlist-days-max' => 'Máximo $1 {{PLURAL:$1|día|días}}',
'prefs-watchlist-edits' => 'Número máximo de edicións que mostrar na lista de vixilancia completa:',
'prefs-watchlist-edits-max' => 'Número máximo: 1000',
'prefs-watchlist-token' => 'Pase para a lista de vixilancia:',
'prefs-misc' => 'Preferencias varias',
'prefs-resetpass' => 'Cambiar o contrasinal',
+'prefs-changeemail' => 'Cambiar o correo electrónico',
+'prefs-setemail' => 'Establecer un enderezo de correo electrónico',
'prefs-email' => 'Opcións de correo electrónico',
'prefs-rendering' => 'Aparencia',
'saveprefs' => 'Gardar',
@@ -1343,6 +1353,7 @@ Este cambio non se poderá desfacer.',
'yourrealname' => 'Nome real:',
'yourlanguage' => 'Lingua da interface:',
'yourvariant' => 'Variante de lingua para os contidos:',
+'prefs-help-variant' => 'A variante ou ortografía preferida na que mostrar o contido das páxinas deste wiki.',
'yournick' => 'Sinatura:',
'prefs-help-signature' => 'Os comentarios feitos nas páxinas de conversa deben asinarse con catro tiles ("<nowiki>~~~~</nowiki>"), que se converterán na súa sinatura con data e hora.',
'badsig' => 'Sinatura non válida; comprobe o código HTML utilizado.',
@@ -1382,7 +1393,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
'userrights-lookup-user' => 'Administrar os grupos do usuario',
'userrights-user-editname' => 'Escriba un nome de usuario:',
'editusergroup' => 'Editar os grupos do usuario',
-'editinguser' => "Mudando os dereitos do usuario '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Mudando os dereitos {{GENDER:$1|do usuario|da usuaria}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Editar os grupos do usuario',
'saveusergroups' => 'Gardar os grupos do usuario',
'userrights-groupsmember' => 'Membro de:',
@@ -1476,13 +1487,13 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
'right-autopatrol' => 'Ter as edicións marcadas automaticamente como patrulladas',
'right-patrolmarks' => 'Ver os cambios que están marcados coma patrullados',
'right-unwatchedpages' => 'Ver unha lista de páxinas que non están vixiadas',
-'right-trackback' => 'Enviar un trackback',
'right-mergehistory' => 'Fusionar o historial das páxinas',
'right-userrights' => 'Editar todos os dereitos de usuario',
'right-userrights-interwiki' => 'Editar os dereitos de usuario dos usuarios doutros wikis',
'right-siteadmin' => 'Pechar e abrir a base de datos',
'right-override-export-depth' => 'Exportar páxinas incluíndo as páxinas ligadas ata unha profundidade de 5',
'right-sendemail' => 'Enviar correos electrónicos a outros usuarios',
+'right-passwordreset' => 'Ver os correos electrónicos de restablecemento de contrasinais',
# User rights log
'rightslog' => 'Rexistro de dereitos de usuario',
@@ -1516,16 +1527,17 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
'action-suppressionlog' => 'ver este rexistro privado',
'action-block' => 'bloquear o usuario fronte á edición',
'action-protect' => 'cambiar o nivel de protección desta páxina',
+'action-rollback' => 'reverter rapidamente as edicións do último usuario que editou unha páxina en particular',
'action-import' => 'importar esta páxina doutro wiki',
'action-importupload' => 'importar esta páxina da carga dun ficheiro',
'action-patrol' => 'marcar a edición doutro como patrullada',
'action-autopatrol' => 'marcar a súa edición como patrullada',
'action-unwatchedpages' => 'ver a lista das páxinas non vixiadas',
-'action-trackback' => 'enviar un trackback',
'action-mergehistory' => 'fusionar o historial desta páxina',
'action-userrights' => 'editar todos os permisos de usuario',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cambio|cambios}}',
@@ -1557,6 +1569,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|usuario|usuarios}} vixiando]',
'rc_categories' => 'Límite para categorías (separado con "|")',
'rc_categories_any' => 'Calquera',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} despois da modificación',
'newsectionsummary' => 'Nova sección: /* $1 */',
'rc-enhanced-expand' => 'Mostrar os detalles (cómpre JavaScript)',
'rc-enhanced-hide' => 'Agochar os detalles',
@@ -1611,6 +1624,7 @@ Vexa a [[Special:NewFiles|galería de imaxes novas]] para ollar unha visión má
'minlength1' => 'Os nomes dos ficheiros deben ter cando menos unha letra.',
'illegalfilename' => 'O nome de ficheiro "$1" contén caracteres que non están permitidos nos títulos das páxinas.
Por favor, cambie o nome do ficheiro e intente cargalo de novo.',
+'filename-toolong' => 'Os nomes dos ficheiros non poden superar os 240 bytes.',
'badfilename' => 'O nome deste ficheiro cambiouse a "$1".',
'filetype-mime-mismatch' => 'A extensión do ficheiro ".$1" non coincide co tipo MIME detectado ($2).',
'filetype-badmime' => 'Non se permite enviar ficheiros de tipo MIME "$1".',
@@ -1723,6 +1737,41 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
'upload-unknown-size' => 'Tamaño descoñecido',
'upload-http-error' => 'Produciuse un erro HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Non se puido transmitir o ficheiro "$1".',
+'backend-fail-backup' => 'Non se puido facer unha copia de seguridade do ficheiro "$1".',
+'backend-fail-notexists' => 'Non existe o ficheiro "$1".',
+'backend-fail-hashes' => 'Non se puideron obter os cardinais do ficheiro por comparación.',
+'backend-fail-notsame' => 'Xa existe un ficheiro chamado "$1", con contidos diferentes.',
+'backend-fail-invalidpath' => '"$1" non é unha ruta de almacenamento válida.',
+'backend-fail-delete' => 'Non se deu borrado o ficheiro "$1".',
+'backend-fail-alreadyexists' => 'O ficheiro "$1" xa existe.',
+'backend-fail-store' => 'Non se deu almacenado o ficheiro "$1" en "$2".',
+'backend-fail-copy' => 'Non se deu copiado o ficheiro "$1" en "$2".',
+'backend-fail-move' => 'Non se deu trasladado o ficheiro "$1" a "$2".',
+'backend-fail-opentemp' => 'Non se puido abrir o ficheiro temporal.',
+'backend-fail-writetemp' => 'Non se puido escribir no ficheiro temporal.',
+'backend-fail-closetemp' => 'Non se puido pechar o ficheiro temporal.',
+'backend-fail-read' => 'Non se puido ler o ficheiro "$1".',
+'backend-fail-create' => 'Non se puido crear o ficheiro "$1".',
+'backend-fail-readonly' => 'Nestes intres, o sistema de almacenamento "$1" está en modo de só lectura. A razón dada é: "$2"',
+'backend-fail-synced' => 'O ficheiro "$1" está nun estado inconsistente dentro do sistema de almacenamento interno',
+'backend-fail-connect' => 'Non se puido conectar co sistema de almacenamento "$1".',
+'backend-fail-internal' => 'Houbo un erro descoñecido no sistema de almacenamento "$1".',
+'backend-fail-contenttype' => 'Non se puido determinar o tipo de contido do ficheiro a almacenar en "$1".',
+'backend-fail-batchsize' => 'O sistema de almacenamento recibiu un feixe de $1 {{PLURAL:$1|operación|operacións}} de ficheiro; o límite está en $2 {{PLURAL:$2|operación|operacións}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Non se puido desbloquear "$1". Non está bloqueado.',
+'lockmanager-fail-closelock' => 'Non se puido pechar o ficheiro de peche de "$1".',
+'lockmanager-fail-deletelock' => 'Non se puido borrar o ficheiro de peche de "$1".',
+'lockmanager-fail-acquirelock' => 'Non se puido obter o peche de "$1".',
+'lockmanager-fail-openlock' => 'Non se puido abrir o ficheiro de peche de "$1".',
+'lockmanager-fail-releaselock' => 'Non se puido liberar o peche de "$1".',
+'lockmanager-fail-db-bucket' => 'Non se puido contactar cos peches de bases de datos suficientes no cubo $1.',
+'lockmanager-fail-db-release' => 'Non se puideron liberar os peches na base de datos $1.',
+'lockmanager-fail-svr-release' => 'Non se puideron liberar os peches no servidor $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Atopouse un erro ao abrir o ficheiro ZIP para realizar as comprobacións.',
'zip-wrong-format' => 'O ficheiro especificado non é ZIP.',
@@ -1739,6 +1788,7 @@ Non pode superar adecuadamente as comprobacións de seguridade.',
'uploadstash-badtoken' => 'A acción non se puido completar, seica porque caducou a información de acceso. Inténteo de novo.',
'uploadstash-errclear' => 'Fallou o borrado de ficheiros.',
'uploadstash-refresh' => 'Actualizar a lista de ficheiros',
+'invalid-chunk-offset' => 'Desprazamento inválido do fragmento',
# img_auth script messages
'img-auth-accessdenied' => 'Acceso rexeitado',
@@ -1847,23 +1897,24 @@ A descrición da [$2 páxina de descrición do ficheiro] móstrase a continuaciÃ
'filerevert-badversion' => 'Non existe unha versión local anterior deste ficheiro coa data e hora indicadas.',
# File deletion
-'filedelete' => 'Borrar "$1"',
-'filedelete-legend' => 'Eliminar un ficheiro',
-'filedelete-intro' => "Está a piques de eliminar o ficheiro \"'''[[Media:\$1|\$1]]'''\" xunto con todo o seu historial.",
-'filedelete-intro-old' => 'Vai eliminar a versión de "\'\'\'[[Media:$1|$1]]\'\'\'" do [$4 $2 ás $3].',
-'filedelete-comment' => 'Motivo:',
-'filedelete-submit' => 'Borrar',
-'filedelete-success' => "Borrouse o ficheiro \"'''\$1'''\".",
-'filedelete-success-old' => 'Eliminouse a versión de "\'\'\'[[Media:$1|$1]]\'\'\'" do $2 ás $3.',
-'filedelete-nofile' => "\"'''\$1'''\" non existe.",
-'filedelete-nofile-old' => "Non existe unha versión arquivada de \"'''\$1'''\" cos atributos especificados.",
-'filedelete-otherreason' => 'Outro motivo:',
-'filedelete-reason-otherlist' => 'Outro motivo',
-'filedelete-reason-dropdown' => '*Motivos frecuentes para borrar
+'filedelete' => 'Borrar "$1"',
+'filedelete-legend' => 'Eliminar un ficheiro',
+'filedelete-intro' => "Está a piques de eliminar o ficheiro \"'''[[Media:\$1|\$1]]'''\" xunto con todo o seu historial.",
+'filedelete-intro-old' => 'Vai eliminar a versión de "\'\'\'[[Media:$1|$1]]\'\'\'" do [$4 $2 ás $3].',
+'filedelete-comment' => 'Motivo:',
+'filedelete-submit' => 'Borrar',
+'filedelete-success' => "Borrouse o ficheiro \"'''\$1'''\".",
+'filedelete-success-old' => 'Eliminouse a versión de "\'\'\'[[Media:$1|$1]]\'\'\'" do $2 ás $3.',
+'filedelete-nofile' => "\"'''\$1'''\" non existe.",
+'filedelete-nofile-old' => "Non existe unha versión arquivada de \"'''\$1'''\" cos atributos especificados.",
+'filedelete-otherreason' => 'Outro motivo:',
+'filedelete-reason-otherlist' => 'Outro motivo',
+'filedelete-reason-dropdown' => '*Motivos frecuentes para borrar
** Violación dos dereitos de autor
** Ficheiro duplicado',
-'filedelete-edit-reasonlist' => 'Editar os motivos de borrado',
-'filedelete-maintenance' => 'Os borrados e restauracións de ficheiros están desactivados temporalmente durante o mantemento.',
+'filedelete-edit-reasonlist' => 'Editar os motivos de borrado',
+'filedelete-maintenance' => 'Os borrados e restauracións de ficheiros están desactivados temporalmente durante o mantemento.',
+'filedelete-maintenance-title' => 'Non se pode borrar o ficheiro',
# MIME search
'mimesearch' => 'Busca MIME',
@@ -1962,6 +2013,8 @@ As entradas <del>riscadas</del> xa foron resoltas.',
'wantedpages' => 'Páxinas requiridas',
'wantedpages-badtitle' => 'Título inválido fixado nos resultados: $1',
'wantedfiles' => 'Ficheiros requiridos',
+'wantedfiletext-cat' => 'Os seguintes ficheiros están en uso, pero non existen. É posible que aparezan ficheiros de repositoroios externos, malia que existan. Calquera falso positivo estará <del>riscado</del>. Ademais, as páxinas que inclúen ficheiros que non existen están listadas en [[:$1]].',
+'wantedfiletext-nocat' => 'Os seguintes ficheiros están en uso, pero non existen. É posible que aparezan ficheiros de repositoroios externos, malia que existan. Calquera falso positivo estará <del>riscado</del>.',
'wantedtemplates' => 'Modelos requiridos',
'mostlinked' => 'Páxinas máis ligadas',
'mostlinkedcategories' => 'Categorías máis ligadas',
@@ -1970,6 +2023,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
'mostimages' => 'Ficheiros máis usados',
'mostrevisions' => 'Artigos con máis revisións',
'prefixindex' => 'Todas as páxinas coas iniciais',
+'prefixindex-namespace' => 'Todas as páxinas con prefixo (espazo de nomes $1)',
'shortpages' => 'Páxinas curtas',
'longpages' => 'Páxinas longas',
'deadendpages' => 'Páxinas sen ligazóns cara a outras',
@@ -2079,12 +2133,8 @@ Protocolos soportados: <tt>$1</tt> (non engada ningún destes na súa procura).'
'activeusers-noresult' => 'Non se atopou ningún usuario.',
# Special:Log/newusers
-'newuserlogpage' => 'Rexistro de creación de usuarios',
-'newuserlogpagetext' => 'Este é un rexistro de creación de contas de usuario.',
-'newuserlog-byemail' => 'contrasinal enviado por correo electrónico',
-'newuserlog-create-entry' => 'Novo usuario',
-'newuserlog-create2-entry' => 'creou unha nova conta para "$1"',
-'newuserlog-autocreate-entry' => 'Conta de usuario creada automaticamente',
+'newuserlogpage' => 'Rexistro de creación de usuarios',
+'newuserlogpagetext' => 'Este é un rexistro de creación de contas de usuario.',
# Special:ListGroupRights
'listgrouprights' => 'Dereitos dun usuario segundo o seu grupo',
@@ -2113,7 +2163,7 @@ Se quere máis información acerca dos dereitos individuais, pode atopala [[{{Me
'emailpagetext' => 'Pode usar o formulario de embaixo para enviar unha mensaxe de correo electrónico a este usuario.
O correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]] aparecerá no campo "De:" do correo, polo que o receptor da mensaxe poderalle responder.',
'usermailererror' => 'O obxecto enviado deu unha mensaxe de erro:',
-'defemailsubject' => 'Correo electrónico de {{SITENAME}}',
+'defemailsubject' => 'Correo electrónico do usuario $1 de {{SITENAME}}',
'usermaildisabled' => 'O correo electrónico do usuario está desactivado',
'usermaildisabledtext' => 'Non pode enviar correos electrónicos a outros usuarios deste wiki',
'noemailtitle' => 'Sen enderezo de correo electrónico',
@@ -2167,7 +2217,7 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
'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}}.',
'iteminvalidname' => 'Hai un problema co elemento "$1", nome non válido...',
-'wlnote' => "A continuación {{PLURAL:$1|está a última modificación|están as últimas '''$1''' modificacións}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}}.",
+'wlnote' => "A continuación {{PLURAL:$1|está a última modificación|están as últimas '''$1''' modificacións}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} ata o $3 ás $4.",
'wlshowlast' => 'Mostrar as últimas $1 horas, os últimos $2 días ou $3',
'watchlist-options' => 'Opcións de vixilancia',
@@ -2234,8 +2284,6 @@ Por favor, confirme que é realmente a súa intención, que comprende as consecu
'actionfailed' => 'Fallou a acción',
'deletedtext' => 'Borrouse a páxina "$1".
No $2 pode ver unha lista cos borrados máis recentes.',
-'deletedarticle' => 'borrou "[[$1]]"',
-'suppressedarticle' => 'suprimiu "[[$1]]"',
'dellogpage' => 'Rexistro de borrados',
'dellogpagetext' => 'A continuación atópase a lista cos borrados máis recentes.',
'deletionlog' => 'rexistro de borrados',
@@ -2284,7 +2332,10 @@ Vexa a [[Special:ProtectedPages|lista de páxinas protexidas]] se quere obter a
'unprotectedarticle' => 'eliminou a protección de "[[$1]]"',
'movedarticleprotection' => 'cambiou as características da protección de "[[$2]]" a "[[$1]]"',
'protect-title' => 'Cambiar o nivel de protección de "$1"',
+'protect-title-notallowed' => 'Ollar o nivel de protección de "$1"',
'prot_1movedto2' => 'moveu "[[$1]]" a "[[$2]]"',
+'protect-badnamespace-title' => 'Espazo de nomes que non se pode protexer',
+'protect-badnamespace-text' => 'As páxinas presentes neste espazo de nomes non se poden protexer.',
'protect-legend' => 'Confirmar a protección',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Caducidade:',
@@ -2305,6 +2356,7 @@ Pode mudar o nivel de protección da páxina pero iso non afectará á protecciÃ
'protect-level-sysop' => 'Só os administradores',
'protect-summary-cascade' => 'protección en serie',
'protect-expiring' => 'remata o $2 ás $3 (UTC)',
+'protect-expiring-local' => 'caduca o $1',
'protect-expiry-indefinite' => 'indefinido',
'protect-cascade' => 'Protexer as páxinas incluídas nesta (protección en serie)',
'protect-cantedit' => 'Non pode modificar os niveis de protección desta páxina porque non ten os permisos necesarios para editala.',
@@ -2364,7 +2416,6 @@ O texto destas revisións eliminadas só está á disposición dos administrador
'undeletereset' => 'Limpar',
'undeleteinvert' => 'Inverter a selección',
'undeletecomment' => 'Motivo:',
-'undeletedarticle' => 'restaurou "[[$1]]"',
'undeletedrevisions' => '$1 {{PLURAL:$1|revisión restaurada|revisións restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
'undeletedfiles' => '$1 {{PLURAL:$1|ficheiro restaurado|ficheiros restaurados}}',
@@ -2373,6 +2424,7 @@ O texto destas revisións eliminadas só está á disposición dos administrador
Comprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
'undelete-header' => 'Vexa [[Special:Log/delete|no rexistro de borrados]] as páxinas eliminadas recentemente.',
+'undelete-search-title' => 'Procurar páxinas borradas',
'undelete-search-box' => 'Procurar páxinas borradas',
'undelete-search-prefix' => 'Mostrar as páxinas que comecen por:',
'undelete-search-submit' => 'Procurar',
@@ -2382,6 +2434,7 @@ Comprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas rece
'undelete-cleanup-error' => 'Erro ao eliminar o ficheiro do arquivo sen usar "$1".',
'undelete-missing-filearchive' => 'Non foi posible restaurar o arquivo do ficheiro co ID $1 porque non figura na base de datos.
Poida que xa se restaurase con anterioridade.',
+'undelete-error' => 'Erro ao restaurar a páxina',
'undelete-error-short' => 'Erro ao desfacer a eliminación do ficheiro: $1',
'undelete-error-long' => 'Atopáronse erros ao desfacer a eliminación do ficheiro:
@@ -2502,6 +2555,7 @@ Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] para re
'blocklist-userblocks' => 'Agochar os bloqueos de contas',
'blocklist-tempblocks' => 'Agochar os bloqueos temporais',
'blocklist-addressblocks' => 'Agochar os bloqueos a enderezos IP únicos',
+'blocklist-rangeblocks' => 'Agochar os bloqueos de rango',
'blocklist-timestamp' => 'Data e hora',
'blocklist-target' => 'Destino',
'blocklist-expiry' => 'Caduca',
@@ -2524,6 +2578,7 @@ Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] para re
'unblocklink' => 'desbloquear',
'change-blocklink' => 'cambiar o bloqueo',
'contribslink' => 'contribucións',
+'emaillink' => 'enviar un correo',
'autoblocker' => 'Foi autobloqueado porque "[[User:$1|$1]]" usou recentemente o seu mesmo enderezo IP.
O motivo do bloqueo de $1 é: "$2"',
'blocklogpage' => 'Rexistro de bloqueos',
@@ -2648,9 +2703,6 @@ Por favor, escolla outro nome.',
'movepage-page-moved' => 'A páxina "$1" foi movida a "$2".',
'movepage-page-unmoved' => 'A páxina "$1" non pode ser movida a "$2".',
'movepage-max-pages' => 'Foi movido o número máximo {{PLURAL:$1|dunha páxina|de $1 páxinas}} e non poderán ser movidas automaticamente máis.',
-'1movedto2' => 'moveu "[[$1]]" a "[[$2]]"',
-'1movedto2_redir' => 'moveu "[[$1]]" a "[[$2]]" sobre unha redirección',
-'move-redirect-suppressed' => 'redirección suprimida',
'movelogpage' => 'Rexistro de traslados',
'movelogpagetext' => 'A continuación móstrase a lista con todas as páxinas trasladadas.',
'movesubpage' => '{{PLURAL:$1|Subpáxina|Subpáxinas}}',
@@ -2663,7 +2715,7 @@ Por favor, escolla outro nome.',
A páxina de destino, chamada "[[:$1]]", xa existe.
Quérea eliminar para facer sitio para mover?',
'delete_and_move_confirm' => 'Si, borrar a páxina',
-'delete_and_move_reason' => 'Eliminado para facer sitio para mover',
+'delete_and_move_reason' => 'Eliminado para facer sitio para mover "[[$1]]"',
'selfmove' => 'O título de orixe e o de destino é o mesmo; non se pode mover unha páxina sobre si mesma.',
'immobile-source-namespace' => 'Non se poden mover as páxinas que están no espazo de nomes "$1"',
'immobile-target-namespace' => 'Non se poden mover as páxinas ao espazo de nomes "$1"',
@@ -2692,9 +2744,11 @@ Por favor, escolla outro nome.',
Para exportar páxinas, insira os títulos na caixa de texto que está máis abaixo, poñendo un título por liña, e se quere seleccione a versión actual e todas as versións vellas, coas liñas do historial da páxina, ou só a versión actual con información sobre a última edición.
No último caso, pode usar tamén unha ligazón, por exemplo [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]], para a páxina "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Exportar toda as páxinas',
'exportcuronly' => 'Incluír só a revisión actual, non o historial completo',
'exportnohistory' => "----
'''Aviso:''' Foi desactivada a exportación do historial completo das páxinas mediante este formulario debido a razóns relacionadas co rendemento do servidor.",
+'exportlistauthors' => 'Incluír unha lista completa dos colaboradores de cada páxina',
'export-submit' => 'Exportar',
'export-addcattext' => 'Engadir as páxinas da categoría:',
'export-addcat' => 'Engadir',
@@ -2727,6 +2781,8 @@ Por favor, visite a [//www.mediawiki.org/wiki/Localisation localización MediaWi
'thumbnail_error' => 'Erro ao crear a miniatura: $1',
'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',
+'thumbnail-dest-create' => 'Non se puido gardar a miniatura no destino',
'thumbnail_invalid_params' => 'Parámetros de miniatura non válidos',
'thumbnail_dest_directory' => 'Non se puido crear o directorio de destino',
'thumbnail_image-type' => 'Tipo de imaxe non soportado',
@@ -2771,6 +2827,11 @@ Gárdeo no seu disco duro e cárgueo aquí.',
'import-upload' => 'Cargar datos XML',
'import-token-mismatch' => 'Perdéronse os datos da sesión. Por favor, inténteo de novo.',
'import-invalid-interwiki' => 'Non se pode importar desde o wiki escificado.',
+'import-error-edit' => 'Non se pode importar a páxina "$1" porque non ten os permisos necesarios para editala.',
+'import-error-create' => 'Non se pode importar a páxina "$1" porque non ten os permisos necesarios para creala.',
+'import-error-interwiki' => 'Non se pode importar a páxina "$1" porque o seu nome está reservado para unha ligazón externa (interwiki).',
+'import-error-special' => 'Non se pode importar a páxina "$1" porque pertence a un espazo de nomes especial que non o permite.',
+'import-error-invalid' => 'Non se pode importar a páxina "$1" porque o seu nome non é válido.',
# Import log
'importlogpage' => 'Rexistro de importacións',
@@ -2780,73 +2841,86 @@ Gárdeo no seu disco duro e cárgueo aquí.',
'import-logentry-interwiki' => 'importou "$1"',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revisión|revisións}} de $2',
+# JavaScriptTest
+'javascripttest' => 'Proba de JavaScript',
+'javascripttest-disabled' => 'Esta función está desactivada.',
+'javascripttest-title' => 'Executando probas de $1',
+'javascripttest-pagetext-noframework' => 'Esta páxina está reservada para executar probas do JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Descoñécese a infraestrutura dixital "$1" de probas.',
+'javascripttest-pagetext-frameworks' => 'Seleccione unha das seguintes infraestruturas dixitais de probas: $1',
+'javascripttest-pagetext-skins' => 'Escolla a aparencia na que executar as probas:',
+'javascripttest-qunit-intro' => 'Bótelle unha ollada á [$1 documentación das probas] en mediawiki.org.',
+'javascripttest-qunit-heading' => 'Conxunto de probas QUnit para o JavaScript de MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'A súa páxina de {{GENDER:|usuario|usuaria}}',
-'tooltip-pt-anonuserpage' => 'A páxina de usuario do enderezo IP desde o que está a editar',
-'tooltip-pt-mytalk' => 'A súa páxina de conversa',
-'tooltip-pt-anontalk' => 'Conversa acerca de edicións feitas desde este enderezo IP',
-'tooltip-pt-preferences' => 'As miñas preferencias',
-'tooltip-pt-watchlist' => 'A lista de páxinas cuxas modificacións está a seguir',
-'tooltip-pt-mycontris' => 'Lista das súas contribucións',
-'tooltip-pt-login' => 'Recoméndaselle rexistrarse, se ben non é obrigatorio.',
-'tooltip-pt-anonlogin' => 'Recoméndaselle rexistrarse, se ben non é obrigatorio.',
-'tooltip-pt-logout' => 'Saír ao anonimato',
-'tooltip-ca-talk' => 'Conversa acerca do contido desta páxina',
-'tooltip-ca-edit' => 'Pode modificar esta páxina; antes de gardala, por favor, utilice o botón de vista previa',
-'tooltip-ca-addsection' => 'Comezar unha nova sección',
-'tooltip-ca-viewsource' => 'Esta páxina está protexida.
+'tooltip-pt-userpage' => 'A súa páxina de {{GENDER:|usuario|usuaria}}',
+'tooltip-pt-anonuserpage' => 'A páxina de usuario do enderezo IP desde o que está a editar',
+'tooltip-pt-mytalk' => 'A súa páxina de conversa',
+'tooltip-pt-anontalk' => 'Conversa acerca de edicións feitas desde este enderezo IP',
+'tooltip-pt-preferences' => 'As miñas preferencias',
+'tooltip-pt-watchlist' => 'A lista de páxinas cuxas modificacións está a seguir',
+'tooltip-pt-mycontris' => 'Lista das súas contribucións',
+'tooltip-pt-login' => 'Recoméndaselle rexistrarse, se ben non é obrigatorio.',
+'tooltip-pt-anonlogin' => 'Recoméndaselle rexistrarse, se ben non é obrigatorio.',
+'tooltip-pt-logout' => 'Saír ao anonimato',
+'tooltip-ca-talk' => 'Conversa acerca do contido desta páxina',
+'tooltip-ca-edit' => 'Pode modificar esta páxina; antes de gardala, por favor, utilice o botón de vista previa',
+'tooltip-ca-addsection' => 'Comezar unha nova sección',
+'tooltip-ca-viewsource' => 'Esta páxina está protexida.
Pode ver o código fonte.',
-'tooltip-ca-history' => 'Versións anteriores desta páxina',
-'tooltip-ca-protect' => 'Protexer esta páxina',
-'tooltip-ca-unprotect' => 'Cambiar a protección desta páxina',
-'tooltip-ca-delete' => 'Eliminar esta páxina',
-'tooltip-ca-undelete' => 'Restaurar as edicións feitas nesta páxina antes de que fose eliminada',
-'tooltip-ca-move' => 'Mover esta páxina',
-'tooltip-ca-watch' => 'Engadir esta páxina á lista de vixilancia',
-'tooltip-ca-unwatch' => 'Eliminar esta páxina da lista de vixilancia',
-'tooltip-search' => 'Procurar en {{SITENAME}}',
-'tooltip-search-go' => 'Ir a unha páxina con este texto exacto, se existe',
-'tooltip-search-fulltext' => 'Procurar este texto nas páxinas',
-'tooltip-p-logo' => 'Visitar a páxina principal',
-'tooltip-n-mainpage' => 'Visitar a páxina principal',
-'tooltip-n-mainpage-description' => 'Visitar a páxina principal',
-'tooltip-n-portal' => 'Información acerca do proxecto, o que pode facer e os lugares onde atopar as cousas',
-'tooltip-n-currentevents' => 'Información acerca de acontecementos de actualidade',
-'tooltip-n-recentchanges' => 'A lista de modificacións recentes no wiki',
-'tooltip-n-randompage' => 'Cargar unha páxina ao chou',
-'tooltip-n-help' => 'O lugar para informarse',
-'tooltip-t-whatlinkshere' => 'Lista de todas as páxinas do wiki que ligan cara a aquí',
-'tooltip-t-recentchangeslinked' => 'Cambios recentes nas páxinas ligadas desde esta',
-'tooltip-feed-rss' => 'Fonte de novas RSS desta páxina',
-'tooltip-feed-atom' => 'Fonte de novas Atom desta páxina',
-'tooltip-t-contributions' => 'Ver a lista de contribucións {{GENDER:{{BASEPAGENAME}}|deste usuario|desta usuaria}}',
-'tooltip-t-emailuser' => 'Enviarlle unha mensaxe a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}} por correo electrónico',
-'tooltip-t-upload' => 'Cargar os ficheiros',
-'tooltip-t-specialpages' => 'Lista de todas as páxinas especiais',
-'tooltip-t-print' => 'Versión para imprimir da páxina',
-'tooltip-t-permalink' => 'Ligazón permanente a esta versión da páxina',
-'tooltip-ca-nstab-main' => 'Ver o contido da páxina',
-'tooltip-ca-nstab-user' => 'Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}',
-'tooltip-ca-nstab-media' => 'Ver a páxina con contido multimedia',
-'tooltip-ca-nstab-special' => 'Esta é unha páxina especial, polo que non a pode editar',
-'tooltip-ca-nstab-project' => 'Ver a páxina do proxecto',
-'tooltip-ca-nstab-image' => 'Ver a páxina do ficheiro',
-'tooltip-ca-nstab-mediawiki' => 'Ver a mensaxe do sistema',
-'tooltip-ca-nstab-template' => 'Ver o modelo',
-'tooltip-ca-nstab-help' => 'Ver a páxina de axuda',
-'tooltip-ca-nstab-category' => 'Ver a páxina da categoría',
-'tooltip-minoredit' => 'Marcar isto coma unha edición pequena',
-'tooltip-save' => 'Gravar os seus cambios',
-'tooltip-preview' => 'Vista previa dos seus cambios; por favor, úsea antes de gravalos!',
-'tooltip-diff' => 'Mostrar os cambios que fixo no texto',
-'tooltip-compareselectedversions' => 'Ver as diferenzas entre dúas versións seleccionadas desta páxina',
-'tooltip-watch' => 'Engadir esta páxina á súa lista de vixilancia',
-'tooltip-recreate' => 'Recrear a páxina a pesar de que foi borrada',
-'tooltip-upload' => 'Iniciar o envío',
-'tooltip-rollback' => '"Reverter" desfai, cun único clic, a(s) edición(s) feita(s) nesta páxina polo último colaborador.',
-'tooltip-undo' => '"Desfacer" reverte esta edición e abre o formulario de edición nun modo previo. Permite engadir un motivo no resumo de edición.',
-'tooltip-preferences-save' => 'Gardar as preferencias',
-'tooltip-summary' => 'Escriba un breve resumo',
+'tooltip-ca-history' => 'Versións anteriores desta páxina',
+'tooltip-ca-protect' => 'Protexer esta páxina',
+'tooltip-ca-unprotect' => 'Cambiar a protección desta páxina',
+'tooltip-ca-delete' => 'Eliminar esta páxina',
+'tooltip-ca-undelete' => 'Restaurar as edicións feitas nesta páxina antes de que fose eliminada',
+'tooltip-ca-move' => 'Mover esta páxina',
+'tooltip-ca-watch' => 'Engadir esta páxina á lista de vixilancia',
+'tooltip-ca-unwatch' => 'Eliminar esta páxina da lista de vixilancia',
+'tooltip-search' => 'Procurar en {{SITENAME}}',
+'tooltip-search-go' => 'Ir a unha páxina con este texto exacto, se existe',
+'tooltip-search-fulltext' => 'Procurar este texto nas páxinas',
+'tooltip-p-logo' => 'Visitar a páxina principal',
+'tooltip-n-mainpage' => 'Visitar a páxina principal',
+'tooltip-n-mainpage-description' => 'Visitar a páxina principal',
+'tooltip-n-portal' => 'Información acerca do proxecto, o que pode facer e os lugares onde atopar as cousas',
+'tooltip-n-currentevents' => 'Información acerca de acontecementos de actualidade',
+'tooltip-n-recentchanges' => 'A lista de modificacións recentes no wiki',
+'tooltip-n-randompage' => 'Cargar unha páxina ao chou',
+'tooltip-n-help' => 'O lugar para informarse',
+'tooltip-t-whatlinkshere' => 'Lista de todas as páxinas do wiki que ligan cara a aquí',
+'tooltip-t-recentchangeslinked' => 'Cambios recentes nas páxinas ligadas desde esta',
+'tooltip-feed-rss' => 'Fonte de novas RSS desta páxina',
+'tooltip-feed-atom' => 'Fonte de novas Atom desta páxina',
+'tooltip-t-contributions' => 'Ver a lista de contribucións {{GENDER:{{BASEPAGENAME}}|deste usuario|desta usuaria}}',
+'tooltip-t-emailuser' => 'Enviarlle unha mensaxe a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}} por correo electrónico',
+'tooltip-t-upload' => 'Cargar os ficheiros',
+'tooltip-t-specialpages' => 'Lista de todas as páxinas especiais',
+'tooltip-t-print' => 'Versión para imprimir da páxina',
+'tooltip-t-permalink' => 'Ligazón permanente a esta versión da páxina',
+'tooltip-ca-nstab-main' => 'Ver o contido da páxina',
+'tooltip-ca-nstab-user' => 'Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}',
+'tooltip-ca-nstab-media' => 'Ver a páxina con contido multimedia',
+'tooltip-ca-nstab-special' => 'Esta é unha páxina especial, polo que non a pode editar',
+'tooltip-ca-nstab-project' => 'Ver a páxina do proxecto',
+'tooltip-ca-nstab-image' => 'Ver a páxina do ficheiro',
+'tooltip-ca-nstab-mediawiki' => 'Ver a mensaxe do sistema',
+'tooltip-ca-nstab-template' => 'Ver o modelo',
+'tooltip-ca-nstab-help' => 'Ver a páxina de axuda',
+'tooltip-ca-nstab-category' => 'Ver a páxina da categoría',
+'tooltip-minoredit' => 'Marcar isto coma unha edición pequena',
+'tooltip-save' => 'Gravar os seus cambios',
+'tooltip-preview' => 'Vista previa dos seus cambios; por favor, úsea antes de gravalos!',
+'tooltip-diff' => 'Mostrar os cambios que fixo no texto',
+'tooltip-compareselectedversions' => 'Ver as diferenzas entre dúas versións seleccionadas desta páxina',
+'tooltip-watch' => 'Engadir esta páxina á súa lista de vixilancia',
+'tooltip-watchlistedit-normal-submit' => 'Eliminar os títulos',
+'tooltip-watchlistedit-raw-submit' => 'Actualizar a lista de vixilancia',
+'tooltip-recreate' => 'Recrear a páxina a pesar de que foi borrada',
+'tooltip-upload' => 'Iniciar o envío',
+'tooltip-rollback' => '"Reverter" desfai, cun único clic, a(s) edición(s) feita(s) nesta páxina polo último colaborador.',
+'tooltip-undo' => '"Desfacer" reverte esta edición e abre o formulario de edición nun modo previo. Permite engadir un motivo no resumo de edición.',
+'tooltip-preferences-save' => 'Gardar as preferencias',
+'tooltip-summary' => 'Escriba un breve resumo',
# Stylesheets
'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
@@ -2944,9 +3018,6 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
# Patrol log
'patrol-log-page' => 'Rexistro de revisións',
'patrol-log-header' => 'Este é un rexistro das revisións patrulladas.',
-'patrol-log-line' => 'marcou a $1 de "$2" como revisada $3',
-'patrol-log-auto' => '(automático)',
-'patrol-log-diff' => 'revisión $1',
'log-show-hide-patrol' => '$1 o rexistro de patrullas',
# Image deletion
@@ -2973,11 +3044,11 @@ O seu sistema pode quedar comprometido se o executa.",
'file-info' => 'Tamaño do ficheiro: $1, tipo MIME: $2',
'file-info-size' => '$1 × $2 píxeles, tamaño do ficheiro: $3, tipo MIME: $4',
'file-info-size-pages' => '$1 × $2 píxeles, tamaño do ficheiro: $3, tipo MIME: $4, $5 {{PLURAL:$5|páxina|páxinas}}',
-'file-nohires' => '<small>Non se dispón dunha resolución máis grande.</small>',
+'file-nohires' => 'Non se dispón dunha resolución máis grande.',
'svg-long-desc' => 'ficheiro SVG, nominalmente $1 × $2 píxeles, tamaño do ficheiro: $3',
'show-big-image' => 'Imaxe na máxima resolución',
-'show-big-image-preview' => '<small>Tamaño desta vista previa: $1.</small>',
-'show-big-image-other' => '<small>Outras resolucións: $1.</small>',
+'show-big-image-preview' => 'Tamaño desta vista previa: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Outra resolución|Outras resolucións}}: $1.',
'show-big-image-size' => '$1 × $2 píxeles',
'file-info-gif-looped' => 'en bucle',
'file-info-gif-frames' => '$1 {{PLURAL:$1|fotograma|fotogramas}}',
@@ -2998,7 +3069,12 @@ O seu sistema pode quedar comprometido se o executa.",
'sp-newimages-showfrom' => 'Mostrar os novos ficheiros comezando polo $1 ás $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'minutes-abbrev' => 'min',
+'minutes-abbrev' => '$1min',
+'seconds' => '{{PLURAL:$1|$1 segundo|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
+'days' => '{{PLURAL:$1|$1 día|$1 días}}',
+'ago' => 'hai $1',
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3501,13 +3577,6 @@ O código de confirmación caduca o $6 ás $7.',
'scarytranscludefailed' => '[Fallou a busca do modelo "$1"]',
'scarytranscludetoolong' => '[O enderezo URL é demasiado longo]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks para esta páxina:<br />
-$1',
-'trackbackremove' => '([$1 Borrar])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'O trackback foi eliminado sen problemas.',
-
# Delete conflict
'deletedwhileediting' => "'''Aviso:''' Esta páxina foi borrada despois de que comezase a editala!",
'confirmrecreate' => "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) borrou este artigo despois de que vostede comezara a editalo, dando o seguinte motivo:
@@ -3594,6 +3663,9 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
'watchlisttools-edit' => 'Ver e editar a lista de vixilancia',
'watchlisttools-raw' => 'Editar a lista de vixilancia simple',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|conversa]])',
+
# Core parser functions
'unknown_extension_tag' => 'Etiqueta de extensión descoñecida "$1"',
'duplicate-defaultsort' => '\'\'\'Aviso:\'\'\' A clave de ordenación por defecto "$2" anula a clave de ordenación anterior por defecto "$1".',
@@ -3649,8 +3721,7 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'specialpages' => 'Páxinas especiais',
'specialpages-note' => '----
* Páxinas especiais normais.
-* <span class="mw-specialpagerestricted">Páxinas especiais restrinxidas.</span>
-* <span class="mw-specialpagecached">Páxinas especiais só con caché (poden estar desactualizadas).</span>',
+* <span class="mw-specialpagerestricted">Páxinas especiais restrinxidas.</span>',
'specialpages-group-maintenance' => 'Informes de mantemento',
'specialpages-group-other' => 'Outras páxinas especiais',
'specialpages-group-login' => 'Rexistro',
@@ -3692,13 +3763,16 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
# Special:ComparePages
-'comparepages' => 'Comparar páxinas',
-'compare-selector' => 'Comparar as revisións de dúas páxinas',
-'compare-page1' => 'Páxina 1',
-'compare-page2' => 'Páxina 2',
-'compare-rev1' => 'Revisión 1',
-'compare-rev2' => 'Revisión 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar páxinas',
+'compare-selector' => 'Comparar as revisións de dúas páxinas',
+'compare-page1' => 'Páxina 1',
+'compare-page2' => 'Páxina 2',
+'compare-rev1' => 'Revisión 1',
+'compare-rev2' => 'Revisión 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'O título que especificou non é válido.',
+'compare-title-not-exists' => 'O título que especificou non existe.',
+'compare-revision-not-exists' => 'A revisión que especificou non existe.',
# Database error messages
'dberr-header' => 'Este wiki ten un problema',
@@ -3725,4 +3799,90 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'sqlite-has-fts' => '$1 con soporte para procuras de texto completo',
'sqlite-no-fts' => '$1 sen soporte para procuras de texto completo',
+# New logging system
+'logentry-delete-delete' => '$1 borrou a páxina "$3"',
+'logentry-delete-restore' => '$1 restaurou a páxina "$3"',
+'logentry-delete-event' => '$1 mudou a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de "$3": $4',
+'logentry-delete-revision' => '$1 mudou a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
+'logentry-delete-event-legacy' => '$1 mudou a visibilidade de entradas do rexistro de "$3"',
+'logentry-delete-revision-legacy' => '$1 mudou a visibilidade de revisións da páxina "$3"',
+'logentry-suppress-delete' => '$1 suprimiu a páxina "$3"',
+'logentry-suppress-event' => '$1 mudou de xeito secreto a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de "$3": $4',
+'logentry-suppress-revision' => '$1 mudou de xeito secreto a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
+'logentry-suppress-event-legacy' => '$1 mudou de xeito secreto a visibilidade de entradas do rexistro de "$3"',
+'logentry-suppress-revision-legacy' => '$1 mudou de xeito secreto a visibilidade de revisións da páxina "$3"',
+'revdelete-content-hid' => 'agochou contidos',
+'revdelete-summary-hid' => 'agochou o resumo de edición',
+'revdelete-uname-hid' => 'agochou o nome de usuario',
+'revdelete-content-unhid' => 'descubriu contidos',
+'revdelete-summary-unhid' => 'descubriu o resumo de edición',
+'revdelete-uname-unhid' => 'descubriu o nome de usuario',
+'revdelete-restricted' => 'aplicou restricións aos administradores',
+'revdelete-unrestricted' => 'eliminou restricións aos administradores',
+'logentry-move-move' => '$1 moveu a páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 moveu a páxina "$3" a "$4" sen deixar unha redirección',
+'logentry-move-move_redir' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección',
+'logentry-move-move_redir-noredirect' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección sen deixar unha redirección',
+'logentry-patrol-patrol' => '$1 marcou a revisión $4 da páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisión $4 da páxina "$3" como patrullada',
+'logentry-newusers-newusers' => '$1 creou unha conta de usuario',
+'logentry-newusers-create' => '$1 creou unha conta de usuario',
+'logentry-newusers-create2' => '$1 creou unha conta de usuario $3',
+'logentry-newusers-autocreate' => 'A conta $1 creouse automaticamente',
+'newuserlog-byemail' => 'contrasinal enviado por correo electrónico',
+
+# Feedback
+'feedback-bugornote' => 'Se está listo para describir un problema técnico en detalle, [$1 informe do erro].
+En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario aparecerá na páxina "[$3 $2]" xunto ao seu nome de usuario e o navegador que está usando.',
+'feedback-subject' => 'Asunto:',
+'feedback-message' => 'Mensaxe:',
+'feedback-cancel' => 'Cancelar',
+'feedback-submit' => 'Enviar os comentarios',
+'feedback-adding' => 'Enviando os comentarios...',
+'feedback-error1' => 'Erro: Resultado da API non recoñecido',
+'feedback-error2' => 'Erro: Fallo de edición',
+'feedback-error3' => 'Erro: Non hai resposta da API',
+'feedback-thanks' => 'Grazas! Os seus comentarios publicáronse na páxina "[$2 $1]".',
+'feedback-close' => 'Feito',
+'feedback-bugcheck' => 'Perfecto! Comprobe que aínda non está entre os [$1 erros coñecidos].',
+'feedback-bugnew' => 'Comprobeino. Informar deste novo erro',
+
+# API errors
+'api-error-badaccess-groups' => 'Non ten os permisos necesarios para cargar ficheiros neste wiki.',
+'api-error-badtoken' => 'Erro interno: Pase incorrecto.',
+'api-error-copyuploaddisabled' => 'As cargas mediante URL están desactivadas neste servidor.',
+'api-error-duplicate' => 'Xa hai {{PLURAL:$1|[$2 outro ficheiro]|[$2 outros ficheiros]}} no wiki co mesmo contido',
+'api-error-duplicate-archive' => 'Había {{PLURAL:$1|[$2 outro ficheiro]|[$2 outros ficheiros]}} no sitio co mesmo contido, pero {{PLURAL:$1|foi borrado|foron borrados}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}} que xa {{PLURAL:$1|foi borrado|foron borrados}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}}',
+'api-error-empty-file' => 'O ficheiro que enviou estaba baleiro.',
+'api-error-emptypage' => 'Non está permitida a creación de páxinas novas que estean baleiras.',
+'api-error-fetchfileerror' => 'Erro interno: Houbo un problema ao buscar o ficheiro.',
+'api-error-file-too-large' => 'O ficheiro que enviou era grande de máis.',
+'api-error-filename-tooshort' => 'O nome do ficheiro é curto de máis.',
+'api-error-filetype-banned' => 'Este tipo de ficheiro está prohibido.',
+'api-error-filetype-missing' => 'Fáltalle a extensión ao ficheiro.',
+'api-error-hookaborted' => 'O asociador da extensión cancelou a modificación que intentou realizar.',
+'api-error-http' => 'Erro interno: Non se puido conectar co servidor.',
+'api-error-illegal-filename' => 'O nome do ficheiro non está permitido.',
+'api-error-internal-error' => 'Erro interno: Houbo un problema ao procesar a súa carga no wiki.',
+'api-error-invalid-file-key' => 'Erro interno: Non se atopou o ficheiro no depósito temporal.',
+'api-error-missingparam' => 'Erro interno: Faltan parámetros na solicitude.',
+'api-error-missingresult' => 'Erro interno: Non se puido determinar se a copia saíu ben.',
+'api-error-mustbeloggedin' => 'Debe acceder ao sistema para cargar ficheiros.',
+'api-error-mustbeposted' => 'Erro interno: A solicitude necesita HTTP POST.',
+'api-error-noimageinfo' => 'A carga realizouse correctamente, pero o servidor non deu ningunha información sobre o ficheiro.',
+'api-error-nomodule' => 'Erro interno: Non hai ningún módulo de cargas.',
+'api-error-ok-but-empty' => 'Erro interno: Non hai resposta do servidor.',
+'api-error-overwrite' => 'Non está permitido sobrescribir un ficheiro existente.',
+'api-error-stashfailed' => 'Erro interno: O servidor non puido almacenar os ficheiros temporais.',
+'api-error-timeout' => 'O servidor non respondeu no tempo esperado.',
+'api-error-unclassified' => 'Houbo un erro descoñecido',
+'api-error-unknown-code' => 'Erro descoñecido: "$1"',
+'api-error-unknown-error' => 'Erro interno: Houbo un problema ao intentar cargar o ficheiro.',
+'api-error-unknown-warning' => 'Advertencia descoñecida: $1',
+'api-error-unknownerror' => 'Erro descoñecido: "$1".',
+'api-error-uploaddisabled' => 'As cargas están desactivadas neste wiki.',
+'api-error-verification-error' => 'Este ficheiro podería estar corrupto ou ter unha extensión incorrecta.',
+
);
diff --git a/languages/messages/MessagesGn.php b/languages/messages/MessagesGn.php
index 46208d7b..7a564ab7 100644
--- a/languages/messages/MessagesGn.php
+++ b/languages/messages/MessagesGn.php
@@ -429,9 +429,8 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
'watch' => 'Ñangareko',
# Delete
-'deletedarticle' => 'oñembogue "[[$1]]"',
-'dellogpage' => 'Ñemboguepyre ñonagatupy',
-'deletionlog' => 'ñemboguepyre ñonagatupy',
+'dellogpage' => 'Ñemboguepyre ñonagatupy',
+'deletionlog' => 'ñemboguepyre ñonagatupy',
# Rollback
'rollback_short' => 'Embojevy',
@@ -480,7 +479,6 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
'movearticle' => 'Guerova kuatiarogue',
'move-watch' => 'Toñeñangareko ko tembiapóre',
'movepagebtn' => 'Guerova kuatiarogue',
-'1movedto2' => '[[$1]] oñembohasa [[$2]]-pe',
'revertmove' => 'embojevy',
'delete_and_move' => "Mboje'o ha guerova",
diff --git a/languages/messages/MessagesGot.php b/languages/messages/MessagesGot.php
index 06bd617e..a81a230b 100644
--- a/languages/messages/MessagesGot.php
+++ b/languages/messages/MessagesGot.php
@@ -10,6 +10,7 @@
* @author Jocke Pirat
* @author Michawiki
* @author Node ue
+ * @author Sajasazi (on got.wikipedia.org)
* @author Zylbath
*/
@@ -178,8 +179,7 @@ $messages = array(
'nstab-category' => 'ðŒºðŒ¿ðŒ½ðŒ¾ðŒ°',
# General errors
-'viewsource' => 'ðƒðŒ°ðŒ¹ðˆðŒ° ðŒ¹ðŒ½ðŒ½ðŒ°ðŒ½ðŒ°',
-'viewsourcefor' => 'fáur $1',
+'viewsource' => 'ðƒðŒ°ðŒ¹ðˆðŒ° ðŒ¹ðŒ½ðŒ½ðŒ°ðŒ½ðŒ°',
# Login and logout pages
'yourname' => 'ðŒ½ðŒ¹ðŒ¿ð„ðŒ°ðŒ½ðŒ³ðŒ¹ðƒðŒ½ðŒ°ðŒ¼ð‰:',
@@ -389,7 +389,6 @@ $messages = array(
'deletepage' => 'ð„ðŒ°ðŒ¹ð‚ðŒ° ðƒðŒ´ðŒ¹ðŒ³ð‰',
'delete-legend' => 'ð„ðŒ°ðŒ¹ð‚ðŒ°ðŒ½',
'actioncomplete' => 'ð…ðŒ°ðƒðŒ¿ðŒ· ðŒ¹ð„ðŒ° ðŒ²ðŒ°ðŒ¿ðƒð„ðŒ¹ðŒ¿ðŒ·ðŒ°ðŒ½',
-'deletedarticle' => 'ð„ðŒ°ðŒ¹ð‚ðŒ¹ðŒ¸ "[[$1]]"',
'dellogpage' => 'ð„ðŒ°ðŒ¹ð‚ðŒ° ðŒ°ðŒ¹ð‚ð…ðŒ±ð‰ðŒºðŒ°',
'deleteotherreason' => 'ðŒ°ðŒ½ðŒ¸ðŒ°ð‚/ðŒ¼ðŒ°ðŒ¹ðƒ ðŒ¼ðŒ¹ð„ð‰ðŒ½ðƒ:',
'deletereasonotherlist' => 'ðŒ°ðŒ½ðŒ¸ðŒ°ð‚ ðŒ¼ðŒ¹ð„ð‰ðŒ½ðƒ',
@@ -451,16 +450,14 @@ $messages = array(
'blocklogentry' => 'ðŒ°ð†ðŒ³ð‚ðŒ°ðŒ¿ðƒðŒ¹ðŒ¸ [[$1]] ð†ðŒ°ðŒ¿ð‚ $2 $3',
# Move page
-'movearticle' => 'ðƒðŒºðŒ¹ðŒ¿ðŒ±ðŒ° ðƒðŒ´ðŒ¹ðŒ³ð‰:',
-'newtitle' => 'ðŒ³ðŒ¿ ðŒ½ðŒ¹ðŒ¿ðŒ¾ðŒ¹ðƒ ðŒ½ðŒ°ðŒ¼ð‰ðƒ:',
-'move-watch' => 'ð…ðŒ¹ð„ðŒ°ðŒ½ ðƒð‰ ðƒðŒ´ðŒ¹ðŒ³ð‰',
-'movepagebtn' => 'ðƒðŒºðŒ¹ðŒ¿ðŒ±ðŒ° ðƒðŒ´ðŒ¹ðŒ³ð‰',
-'movedto' => 'skiubiþ du',
-'1movedto2' => '[[$1]] ðƒðŒºðŒ¹ðŒ¿ðŒ±ðŒ¹ðŒ¸ ðŒ³ðŒ¿ [[$2]]',
-'1movedto2_redir' => '[[$1]] ðƒðŒºðŒ¹ðŒ¿ðŒ±ðŒ¹ðŒ¸ ðŒ³ðŒ¿ [[$2]] ðŒ¿ð†ðŒ°ð‚ ð„ðŒ°ðŒ¹ðŒºðŒ¾ðŒ°ðŒ½ðŒ±ðŒ°ðŒ½ðŒ³ðŒ¹',
-'movelogpage' => 'Log af skiubans',
-'movereason' => 'ð†ðŒ°ðŒ¹ð‚ðŒ¹ðŒ½ðŒ°:',
-'revertmove' => 'ráidjan',
+'movearticle' => 'ðƒðŒºðŒ¹ðŒ¿ðŒ±ðŒ° ðƒðŒ´ðŒ¹ðŒ³ð‰:',
+'newtitle' => 'ðŒ³ðŒ¿ ðŒ½ðŒ¹ðŒ¿ðŒ¾ðŒ¹ðƒ ðŒ½ðŒ°ðŒ¼ð‰ðƒ:',
+'move-watch' => 'ð…ðŒ¹ð„ðŒ°ðŒ½ ðƒð‰ ðƒðŒ´ðŒ¹ðŒ³ð‰',
+'movepagebtn' => 'ðƒðŒºðŒ¹ðŒ¿ðŒ±ðŒ° ðƒðŒ´ðŒ¹ðŒ³ð‰',
+'movedto' => 'skiubiþ du',
+'movelogpage' => 'Log af skiubans',
+'movereason' => 'ð†ðŒ°ðŒ¹ð‚ðŒ¹ðŒ½ðŒ°:',
+'revertmove' => 'ráidjan',
# Thumbnails
'thumbnail-more' => 'Biáuknan',
diff --git a/languages/messages/MessagesGrc.php b/languages/messages/MessagesGrc.php
index e7d5a659..462c1753 100644
--- a/languages/messages/MessagesGrc.php
+++ b/languages/messages/MessagesGrc.php
@@ -386,15 +386,14 @@ $1',
Τάχ\' ἂν τόδε ἤδη διαγεγÏαμμένον εἴη.',
'badtitle' => 'Κακὸν τὸ á¼Ï€ÏŽÎ½Ï…μον',
'badtitletext' => 'Ἡ á¼Ï€Î¹Î³Ïαφὴ τῆς á¾Ï„ουμένης δέλτου á¼ÏƒÏ„ὶν ἄκυÏος, κενή, á¼¢ Ï€Ïόκειται πεÏὶ á¼ÏƒÏ†Î±Î»Î¼Î­Î½Ï‰Ï‚ συνδεδεμένης á¼Ï€Î¹Î³Ïαφῆς μεταξὺ διαφόÏων βίκι· εἰκότως πεÏιέχει χαÏακτῆÏας μὴ χÏηστέους á¼Î½ á¼Ï€Î¹Î³Ïαφαῖς.',
-'perfcached' => 'Τὸ ἀκόλουθα δεδομένα εἰσὶ λανθάνοντα καὶ á¼Î½Î´ÎµÏ‡Î¿Î¼Î­Î½Ï‰Ï‚ οá½Îº εἰσὶ á¼Î½Î®Î¼ÎµÏα.',
-'perfcachedts' => 'Τὸ ἀκόλουθα δεδομένα εἰσὶ λανθάνοντα καὶ ὑστάτως á¼Î½Î·Î¼ÎµÏωμένα á¼Î½ $1.',
+'perfcached' => 'Τὸ ἀκόλουθα δεδομένα εἰσὶ λανθάνοντα καὶ á¼Î½Î´ÎµÏ‡Î¿Î¼Î­Î½Ï‰Ï‚ οá½Îº εἰσὶ á¼Î½Î®Î¼ÎµÏα. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Τὸ ἀκόλουθα δεδομένα εἰσὶ λανθάνοντα καὶ ὑστάτως á¼Î½Î·Î¼ÎµÏωμένα á¼Î½ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Αἱ á¼Î½Î·Î¼ÎµÏώσεις τῆσδε τῆς δέλτου ἀπενεÏγοποιηθεῖσαι εἰσίν.
Τὰ δεδομένα á¼Î½Ï„αῦθα μὴ ἀνανεώσιμα ἔσονται á¼Ï€á½¶ τοῦ παÏόντος.',
'wrong_wfQuery_params' => 'Ἐσφαλμέναι παÏάμετÏοι εἰς τὸ wfQuery()<br />
ἘνέÏγεια: $1<br />
Πεῦσις: $2',
'viewsource' => 'Πηγὴν á¼Ï€Î¹ÏƒÎºÎ¿Ï€Îµá¿–ν',
-'viewsourcefor' => 'διὰ τὸ $1',
'actionthrottled' => 'ΔÏᾶσις ἠγχθεῖσα',
'protectedpagetext' => 'Ἥδε ἡ δέλτος ἀποκεκλῃμένη á¼ÏƒÏ„ὶν εἰς ἀποτÏοπὴν τοῦ μεταγÏάφειν.',
'viewsourcetext' => 'Ἔξεστί σοι á½Ïᾶν τε καὶ ἀντιγÏάφειν τὴν τῆς δέλτου πηγήν:',
@@ -503,6 +502,11 @@ $2',
# Special:PasswordReset
'passwordreset-username' => 'Ὄνομα χÏωμένου:',
+# Special:ChangeEmail
+'changeemail-none' => '(οá½Î´Î­Î½)',
+'changeemail-submit' => 'Ἀλλάττειν ἠλ.-ταχυδÏομεῖον',
+'changeemail-cancel' => 'ἈκυÏοῦν',
+
# Edit page toolbar
'bold_sample' => 'ΓÏάμματα παχέα',
'bold_tip' => 'ΓÏάμματα παχέα',
@@ -567,9 +571,6 @@ $2',
Ἡ Ï„Ïέχουσα διεÏθυνσις IP σου $3 á¼ÏƒÏ„ίν, καὶ ἡ ἀναγνώÏισις τῆς φÏαγῆς #$5 á¼ÏƒÏ„ίν.
ΠαÏακαλοῦμεν σε πεÏιλαμβάνειν οἱανδήποτε á¼Î¾ αá½Ï„ῶν á¼¢ καὶ ἀμφοτέÏας á¼Î½ ταῖς á¼Ïωτήσεσί σου.",
'blockednoreason' => 'οá½Î´ÎµÎ¼Î¯Î± αἰτία á¼Î´ÏŒÎ¸Î·',
-'blockedoriginalsource' => "Ἡ πηγὴ τοῦ '''$1''' δείκνυται κατωτέÏω:",
-'blockededitsource' => "Τὸ κείμενον τῶν '''μεταγÏαφῶν ὑπ' á¼ÏƒÎ¿á¿¦''' τοῦ '''$1''' δείκνυται κάτωθι:",
-'whitelistedittitle' => 'ἈπαιτοÏμενον τὸ συνδεῖσθαι Ï€Ïὸ τοῦ μεταγÏάψειν',
'whitelistedittext' => 'ἈπαιτοÏμενον τὸ $1 Ï€Ïὸ τοῦ μεταγÏάψειν δέλτους.',
'confirmedittext' => 'Δεῖ σε á¼Ï€Î¹Î²ÎµÎ²Î±Î¹ÏŽÏƒÎµÎ¹Î½ τὴν διεÏθυνσίν σου Ï€Ïὸ τοῦ μεταγÏάψειν δέλτους. Θὲς καὶ á¼Ï€Î¹ÎºÏÏωσον τὴν διεÏθυνσίν σου διὰ τῶν [[Special:Preferences|αἱÏέσεων χÏωμένου]] σου.',
'nosuchsectiontitle' => 'Οá½Î´á½²Î½ τοιοῦτον τμῆμα εὑÏεθέν',
@@ -726,8 +727,6 @@ $2',
'revdelete-unsuppress' => 'ΑἴÏειν πεÏιοÏίσεις á¼Ï€á½¶ τῶν ἀποκατεστημένων á¼ÎºÎ´ÏŒÏƒÎµÏ‰Î½',
'revdelete-log' => 'Αἰτία:',
'revdelete-submit' => 'ἘφαÏμογὴ á¼Ï€á½¶ {{PLURAL:$1|τῇ á¼Ï€ÎµÎ¹Î»ÎµÎ³Î¼Î­Î½á¿‡ ἀναθεωÏήσει|ταῖς á¼Ï€ÎµÎ¹Î»ÎµÎ³Î¼Î­Î½Î±Î¹Ï‚ ἀναθεωÏήσεσιν}}',
-'revdelete-logentry' => 'ἠλλαγμένη ἡ á½Ïατότης τῆς ἀναθεωÏήσεως τοῦ [[$1]]',
-'logdelete-logentry' => 'ἀλλάττειν τὴν á½Ïατότητα τῶν γεγονότων διὰ τὸ [[$1]]',
'revdelete-success' => "'''ἈναθεωÏήσεων á½Ïατότης á¼Ï€Î¹Ï„υχῶς á¼Î½Î·Î¼ÎµÏωθεῖσα.'''",
'revdelete-failure' => "'''Ἡ á½Ïατότης τῆς ἀναθεωÏήσεως οá½Îº ἦ á¼Î½Î·Î¼ÎµÏώσιμος:'''
$1",
@@ -739,15 +738,6 @@ $1",
'revdel-restore-visible' => 'á½Ïαταὶ ἀναθεωÏήσεις',
'pagehist' => 'ἹστοÏία δέλτου',
'deletedhist' => 'ἹστοÏία διαγεγÏαμμένη',
-'revdelete-content' => 'πεÏιεχόμενον',
-'revdelete-summary' => 'σÏνοψις μεταγÏαφῶν',
-'revdelete-uname' => 'ὄνομα χÏωμένου',
-'revdelete-restricted' => 'á¼Ï†Î·Ïμοσμένοι πεÏιοÏισμοὶ διὰ τοὺς á¼Ï€Î¹Ï„Ïόπους',
-'revdelete-unrestricted' => 'αἱÏεθέντες πεÏιοÏισμοὶ διὰ τοὺς á¼Ï€Î¹Ï„Ïόπους',
-'revdelete-hid' => 'κÏÏÏ€ $1',
-'revdelete-unhid' => 'oὠκÏÏÏ€ $1',
-'revdelete-log-message' => '$1 διὰ $2 {{PLURAL:$2|ἀναθεώÏησιν|ἀναθεωÏήσεις}}',
-'logdelete-log-message' => '$1 διὰ $2 {{PLURAL:$2|γεγονός|γεγονότα}}',
'revdelete-modify-missing' => 'Σφάλμα κατὰ τὸ μεταγÏάφειν τοῦ τεμαχίου τοῦ ἔχοντος ID $1: οá½Ï‡ á½Ï€Î¬Ïχει á¼Î½ τῇ βάσει δεδομένων!',
'revdelete-no-change' => "'''Εἴδησις:''' τὸ τεμάχιον τὸ ἔχον ἡμεÏομηνίαν $2, $1 ἔχει ἤδη Ï„á½°Ï‚ αἰτουμένας ῥυθμίσεις á½Ïατότητος",
'revdelete-only-restricted' => 'Οá½Îº ἔξεστί σοι ἀποκÏÏπτειν τὴν Ï€Ïοβολὴν τοῦ τεμαχίου τοῦ χÏονολογηθέντος $2, $1: ὑπὸ τῶν á¼Ï€Î¹Ï„Ïόπων ἄνευ τοῦ συνάμα á¼Ï€Î¹Î»Î­Î³ÎµÎ¹Î½ μίαν á¼Îº τῶν ἑτέÏων á¼Ï€Î¹Î»Î¿Î³á¿¶Î½ καταστολῆς.',
@@ -883,7 +873,7 @@ $1",
'prefs-rc' => 'Αἱ νέαι μεταβολαί',
'prefs-watchlist' => 'Τὰ á¼Ï†Î¿Ïώμενα',
'prefs-watchlist-days' => 'ἩμέÏαι á¼Î¼Ï†Î±Î½Î¹ÏƒÏ„έαι á¼Î½ τῇ á¼Ï†Î¿Ïοδιαλογῇ:',
-'prefs-watchlist-days-max' => 'Μέγιστον 7 ἡμέÏαι',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Μέγιστος á¼€Ïιθμὸς á¼Î¼Ï†Î±Î½Î¹ÏƒÏ„έων μεταβολῶν á¼Î½ τῇ á¼Ï€ÎµÎºÏ„εταμένῃ διαλογῇ:',
'prefs-watchlist-edits-max' => 'Μέγιστος á¼€Ïιθμός: 1000',
'prefs-watchlist-token' => 'Δεῖγμα á¼Ï†Î¿Ïοδιαλογῆς:',
@@ -1058,7 +1048,6 @@ $1",
'right-autopatrol' => 'Σημαίνειν Ï„á½°Ï‚ ἰδιωτικὰς μεταγÏαφὰς τινὸς αá½Ï„ομάτως ὡς φÏουÏουμένας',
'right-patrolmarks' => 'ὉÏᾶν Ï„á½°Ï‚ σημάνσεις φÏουÏήσεως τῶν Ï€Ïοσφάτων μεταβολῶν',
'right-unwatchedpages' => 'ὉÏᾶν κατάλογόν τινα ἀνεφοÏωμένων δέλτων',
-'right-trackback' => 'ὈπισθοσÏνδεσμον ὑποβάλλειν',
'right-mergehistory' => 'ΣυγχωνεÏειν τὸ ἱστοÏικὸν τῶν δέλτων',
'right-userrights' => 'ΜεταγÏάφειν ἅπαντα τοῦ χÏωμένου δικαιώματα',
'right-userrights-interwiki' => 'ΜεταγÏάφειν Ï„á½° δικαιώματα χÏωμένων á¼Î½ ἄλλοις βίκι',
@@ -1101,7 +1090,6 @@ $1",
'action-patrol' => 'σημαίνειν Ï„á½°Ï‚ μεταγÏαφὰς ἑτέÏων ὡς φÏουÏουμένας',
'action-autopatrol' => 'σήμανσις τῆς μεταγÏαφῆς σου ὡς πεÏιπολουμένης',
'action-unwatchedpages' => 'á½Ïᾶν τὴν διαλογὴν τῶν μὴ á¼Ï†Î¿Ïωμένων δέλτων',
-'action-trackback' => 'ὑποβάλλειν ἀνασÏνδεσμον τινά',
'action-mergehistory' => 'συγχωνεÏειν τὸ ἱστοÏικὸν τῆσδε τῆς δέλτου',
'action-userrights' => 'μεταγÏάφειν ἅπαντα τα δικαιώματα χÏωμένου',
'action-userrights-interwiki' => 'μεταγÏάφειν τα δικαιώματα χÏωμένου ἑτέÏων βικι-χÏωμένων',
@@ -1505,12 +1493,8 @@ $1",
'activeusers-noresult' => 'Οá½Î´Îµá½¶Ï‚ χÏώμενος εὑÏέθη.',
# Special:Log/newusers
-'newuserlogpage' => 'Κατάλογος ποιήσεων λογισμῶν.',
-'newuserlogpagetext' => 'á½Î´Îµ á¼ÏƒÏ„ὶν κατάλογος τις τῶν ποιήσεων λογισμῶν.',
-'newuserlog-byemail' => 'σÏνθημα ἀπεσταλμένον μέσῳ ἠλ-ταχυδÏομείου',
-'newuserlog-create-entry' => 'Îέος χÏώμενος',
-'newuserlog-create2-entry' => 'νέος λογισμὸς ποιηθεὶς διὰ $1',
-'newuserlog-autocreate-entry' => 'Λογισμὸς ποιηθεὶς αá½Ï„ομάτως',
+'newuserlogpage' => 'Κατάλογος ποιήσεων λογισμῶν.',
+'newuserlogpagetext' => 'á½Î´Îµ á¼ÏƒÏ„ὶν κατάλογος τις τῶν ποιήσεων λογισμῶν.',
# Special:ListGroupRights
'listgrouprights' => 'Δικαιώματα á½Î¼Î¬Î´Î¿Ï‚ χÏωμένου',
@@ -1633,8 +1617,6 @@ $NEWPAGE
'actionfailed' => 'ΔÏάσις ἀνεπιτυχής',
'deletedtext' => 'Τὸ "$1" διεγÏάφη.
Ἴδε τὸ $2 διὰ μητÏῷόν τι Ï€Ïοσφάτων διαγÏαφῶν.',
-'deletedarticle' => 'Ἐσβέσθη ἡ δέλτος "[[$1]]"',
-'suppressedarticle' => '"[[$1]]" κατεσταλμένον',
'dellogpage' => 'Τὰ á¼ÏƒÎ²ÎµÏƒÎ¼Î­Î½Î±',
'dellogpagetext' => 'ΚατωτέÏω á¼ÏƒÏ„ὶ διαλογή τις τῶν ὑστάτων διαγÏαφῶν.',
'deletionlog' => 'κατάλογος διαγÏαφῶν',
@@ -1731,7 +1713,6 @@ $NEWPAGE
'undeletereset' => 'Ἐπαναθέτειν',
'undeleteinvert' => 'ἈναστÏέφειν τὴν á¼Ï€Î¹Î»Î¿Î³Î®Î½',
'undeletecomment' => 'Αἰτία:',
-'undeletedarticle' => 'á¼Ï€Î±Î½Î¹ÏƒÏ„άν "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 ἀναθεωÏήσις|$1 ἀναθεωÏήσεις}} ἀποκατεστάθησαν',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ἀναθεωÏήσις|$1 ἀναθεωÏήσεις}} καὶ {{PLURAL:$2|1 á¼€Ïχεῖον|$2 á¼€Ïχεῖα}} ἀποκατεστάθησαν',
'undeletedfiles' => '{{PLURAL:$1|1 á¼€Ïχεῖον|$1 á¼€Ïχεῖα}} ἀποκατεστάθησαν',
@@ -1939,9 +1920,6 @@ $1',
'movepage-page-moved' => 'Ἡ δέλτος $1 μετακεκίνηται εἰς $2.',
'movepage-page-unmoved' => 'Ἡ δέλτος $1 μὴ μετακεκινημένη á¼ÏƒÏ„ὶν εἰς $2.',
'movepage-max-pages' => 'Τὸ μέγιστον τῶν $1 {{PLURAL:$1|δέλτου|δέλτων}} μετεκινήθη ἤδη καὶ οὠπλέον μετακινηθήσεται αá½Ï„ομάτως.',
-'1movedto2' => '[[$1]] á¼ÎºÎ¹Î½Î®Î¸Î· Ï€Ïὸς [[$2]]',
-'1movedto2_redir' => '[[$1]] μετακινηθεῖσα εἰς [[$2]] μέσῳ ἀναδιευθÏνσεως',
-'move-redirect-suppressed' => 'κατεσταλμένη ἡ ἀναδιεÏθυνσις',
'movelogpage' => 'Τὰ κινηθέντα',
'movelogpagetext' => 'ΚατωτέÏω á¼ÏƒÏ„ὶ διαλογή τις τῶν κεκινημένων δέλτων.',
'movesubpage' => '{{PLURAL:$1|Ὑποδέλτος|Ὑποδέλτοι}}',
@@ -2167,9 +2145,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Κατάλογος πεÏιπόλων',
'patrol-log-header' => 'á½Î´Îµ á¼ÏƒÏ„ὶ κατάλογος πεÏιπολουμένων ἀναθεωÏήσεων.',
-'patrol-log-line' => 'σήμανσις τῆς á¼ÎºÎ´ÏŒÏƒÎµÏ‰Ï‚ $1 τοῦ $2 ὡς πεÏιπολουμένη $3',
-'patrol-log-auto' => '(αá½Ï„όματον)',
-'patrol-log-diff' => 'ἀναθεώÏησις $1',
'log-show-hide-patrol' => '$1 κατάλογος πεÏιπόλου',
# Image deletion
@@ -2192,7 +2167,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|δέλτος|δέλτοι}}',
'file-info' => 'μέγεθος á¼€Ïχείου: $1, Ï„á½Ï€Î¿Ï‚ MIME: $2',
'file-info-size' => '$1 × $2 εἰκονοστοιχεῖα, μέγεθος á¼€Ïχείου: $3, Ï„Ïπος MIME: $4',
-'file-nohires' => '<small>Οὠδιατίθεται ὑψηλοτέÏα ἀνάλυσις.</small>',
+'file-nohires' => 'Οὠδιατίθεται ὑψηλοτέÏα ἀνάλυσις.',
'svg-long-desc' => 'á¼€Ïχεῖον SVG, ὀνομαστὶ $1 × $2 εἰκονοστοιχεῖα, μέγεθος á¼€Ïχείου: $3',
'show-big-image' => 'ΠλήÏης ἀνάλυσις',
'show-big-image-size' => '$1 × $2 εἰκονοστοιχεία',
@@ -2558,13 +2533,6 @@ $5
'scarytranscludefailed' => '[Τὸ Ï€Ïοσκομίζειν τὸ Ï€Ïότυπον διὰ τὸ $1 ἀπετεÏχθη]',
'scarytranscludetoolong' => '[Ὁ URL á½‘Ï€á½²Ï Ï„á½¸ δέον μακÏÏÏ‚ á¼ÏƒÏ„ιν]',
-# Trackbacks
-'trackbackbox' => 'ὈπισθοσÏνδεσμοι διὰ τήνδε á¼Î³Î³Ïαφήν:<br />
-$1',
-'trackbackremove' => '([$1 ΔιαγÏάφειν])',
-'trackbacklink' => 'ὈπισθοσÏνδεσμος',
-'trackbackdeleteok' => 'ὈπισθοσÏνδεσμος á¼Ï€Î¹Ï„υχῶς διαγÏαφείς.',
-
# Delete conflict
'deletedwhileediting' => "'''Εἴδησις''': Ἥδε ἡ δέλτος διεγÏάφη Ï€Ïὸ τοῦ ἄÏχειν ὑπá¼ÏƒÎ¿á¿¦ τὸ μεταγÏάφειν!",
'recreate' => 'Ἀναποιεῖν',
@@ -2748,4 +2716,12 @@ $1',
'htmlform-reset' => 'ἈναστÏέφειν μεταβολάς',
'htmlform-selectorother-other' => 'Ἄλλον',
+# New logging system
+'revdelete-restricted' => 'á¼Ï†Î·Ïμοσμένοι πεÏιοÏισμοὶ διὰ τοὺς á¼Ï€Î¹Ï„Ïόπους',
+'revdelete-unrestricted' => 'αἱÏεθέντες πεÏιοÏισμοὶ διὰ τοὺς á¼Ï€Î¹Ï„Ïόπους',
+'newuserlog-byemail' => 'σÏνθημα ἀπεσταλμένον μέσῳ ἠλ-ταχυδÏομείου',
+
+# Feedback
+'feedback-cancel' => 'ἈκυÏοῦν',
+
);
diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php
index 06b8e1ba..587393da 100644
--- a/languages/messages/MessagesGsw.php
+++ b/languages/messages/MessagesGsw.php
@@ -116,7 +116,7 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'displaytitle' => array( '1', 'SYTETITEL', 'SEITENTITEL', 'DISPLAYTITLE' ),
+ 'displaytitle' => array( '1', 'SYTETITEL', 'SEITENTITEL', 'DISPLAYTITLE' ),
);
$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
@@ -481,15 +481,14 @@ Wänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäl
'cannotdelete' => 'D Syte oder d Datei „$1“ cha nit glescht wäre. Si isch villicht scho vu eber anderem glescht wore.',
'badtitle' => 'Ugültiger Titel',
'badtitletext' => 'Dr Titel vu dr agforderte Syte isch nit giltig gsi, leer, oder e nit giltig Sprochgleich vun eme andre Wiki.',
-'perfcached' => 'Die Informatione chömme us em Zwüschespeicher un sin derwiil villicht nid aktuell.
+'perfcached' => 'Die Informatione chömme us em Zwüschespeicher un sin derwiil villicht nid aktuell. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.
----',
-'perfcachedts' => 'Die Date stamme us em Cache un sin am $1 s letscht Mol aktualisiert wore.',
+'perfcachedts' => 'Die Date stamme us em Cache un sin am $1 s letscht Mol aktualisiert wore. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "'''D Aktualisierigsfunktion fir die Syte isch im Momänt deaktiviert. D Date wäre vorerscht nit ernejert.'''",
'wrong_wfQuery_params' => 'Falschi Parameter fir wfQuery()<br />
Funktion: $1<br />
Abfrog: $2',
'viewsource' => 'Quelltext aaluege',
-'viewsourcefor' => 'fir $1',
'actionthrottled' => 'Aktionsaazahl limitiert',
'actionthrottledtext' => 'As Schutz vor Spam cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.',
'protectedpagetext' => 'Die Syte isch fir s Bearbeite gsperrt.',
@@ -598,6 +597,7 @@ Fir d Bstätigung muesch em Gleich nogoh, wu Dir gschickt woren isch. Du chasch
'emailconfirmlink' => 'E-Poscht-Adräss bstätige',
'invalidemailaddress' => 'Diä E-Mail-Adress isch nit akzeptiert worre, wil s ä ugültigs Format ghet het.
Bitte gib ä neiji Adress in nem gültige Format ii, odr tue s Feld leere.',
+'cannotchangeemail' => 'E-Mail-Adrässe chönne in däm Wiki nit gänderet werde.',
'accountcreated' => 'S Benutzerkonto isch aagleit wore.',
'accountcreatedtext' => 'S Benutzerkonto $1 isch aagleit wore.',
'createaccount-title' => 'Aalege vum e Benutzerkonto fir {{SITENAME}}',
@@ -612,6 +612,7 @@ Wänn s Benutzerkonto us Versäh aaglait woren isch, chasch die Nochricht ignori
# E-mail sending
'php-mail-error-unknown' => 'Nit bekannte Fähler mit dr Funktion mail() vu PHP',
+'user-mail-no-addy' => 'Es isch versuecht worde e E-Mail ohni Angab vunere E-Mail-Adräss z verschigge.',
# Change password dialog
'resetpass' => 'Passwort fir s Benutzerkonto ändere oder zrucksetze',
@@ -632,30 +633,45 @@ Villicht hesch Dyy Passwort scho gänderet oder e nej temporär Passwort aagford
'resetpass-temp-password' => 'Temporär Passwort:',
# 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-email' => 'E-Mail-Adräss:',
-'passwordreset-emailtitle' => 'Benutzerkontoinformationen uf {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). {{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft:
+'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?',
+'passwordreset-capture-help' => 'Wänn du des Chäschtli aachrüüzesch, no wird die E-Mail (mit em temporäre Passwort) dir aazeigt, un au em Benutzer zuegschiggt.',
+'passwordreset-email' => 'E-Mail-Adräss:',
+'passwordreset-emailtitle' => 'Benutzerkontoinformationen uf {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). {{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft:
$2
{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.
Du sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.',
-'passwordreset-emailtext-user' => 'Benutzer $1 uf {{SITENAME}} het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). {{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft:
+'passwordreset-emailtext-user' => 'Benutzer $1 uf {{SITENAME}} het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). {{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft:
$2
{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.
Du sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.',
-'passwordreset-emailelement' => 'Benutzername: $1
+'passwordreset-emailelement' => 'Benutzername: $1
Temporär Passwort: $2',
-'passwordreset-emailsent' => 'E Erinnerig isch per E-Mail verschickt wore.',
+'passwordreset-emailsent' => 'E Erinnerig isch per E-Mail verschickt wore.',
+'passwordreset-emailsent-capture' => 'E Erinnerigsmail isch abgschiggt worde, un isch unte aazeigt.',
+'passwordreset-emailerror-capture' => 'Die Erinnerigsmail, wo unte aazeigt isch, isch generiert worde, aber de Versand aa de Benutzer isch gschyyteret: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-Mail-Adräss ändre',
+'changeemail-header' => 'D E-Mail-Adräss vo däm Chonto ändre',
+'changeemail-text' => 'Füll des Formular ganz uss, zume dyni E-Mail-Adräss ändre. Du muesch dyn Passwort aagee, zum die Änderig z bstätige.',
+'changeemail-no-info' => 'Du muesch aagmolde sy zum uff die Syte diräkt zuegryfe z chönne.',
+'changeemail-oldemail' => 'Aktuelli E-Mail-Adräss',
+'changeemail-newemail' => 'Nöii E-Mail-Adräss:',
+'changeemail-none' => '(nyt)',
+'changeemail-submit' => 'E-Mail Adräss ändre',
+'changeemail-cancel' => 'Abbräche',
# Edit page toolbar
'bold_sample' => 'fetti Schrift',
@@ -730,9 +746,6 @@ Du chasch $1 oder ein vu dr andre [[{{MediaWiki:Grouppage-sysop}}|Ammanne]] kont
*Sperr-ID: #$5
</div>',
'blockednoreason' => 'kei Begrindig aagee',
-'blockedoriginalsource' => "Dr Quälltäxt vu '''$1''' wird do aazeigt:",
-'blockededitsource' => "Dr Quälltäxt vu '''Dyyne Änderige''' an '''$1''':",
-'whitelistedittitle' => 'Zum Bearbeite muess mer aagmäldet syy.',
'whitelistedittext' => 'Du muesch Di $1 zum Artikel bearbeite.',
'confirmedittext' => 'Si mien Ihri E-Mail-Adräss zerscht bstätige, voreb Si Syte chenne ändere. Bitte setze Si in [[Special:Preferences|Ihre Iistellige]] Ihri E-Mail-Adräss yy un len Si si priefe.',
'nosuchsectiontitle' => 'Abschnitt nit gfunde',
@@ -978,8 +991,6 @@ Du chasch dää Unterschid allno aaluege; Details het's im [{{fullurl:{{#Special
'revdelete-unsuppress' => 'Yyschränkige fir di widerhergstellte Versione ufhebe',
'revdelete-log' => 'Grund:',
'revdelete-submit' => 'Uf {{PLURAL:$1|di uusgwehlt Version|usgwehlti Versione}} aawände',
-'revdelete-logentry' => 'het d Versionsaasicht fir „[[$1]]“ gänderet',
-'logdelete-logentry' => 'het d Sichtbarkeit fir „[[$1]]“ gänderet',
'revdelete-success' => "'''Versionsaasicht erfolgryych aktualisiert.'''",
'revdelete-failure' => "'''Versionssichtbarkeit het nit chenne aktualisiert wäre.'''
$1",
@@ -991,15 +1002,6 @@ $1",
'revdel-restore-visible' => 'sichtbari Versione',
'pagehist' => 'Versionsgeschicht',
'deletedhist' => 'Gleschti Versione',
-'revdelete-content' => 'Syteinhalt',
-'revdelete-summary' => 'Zämmefassig',
-'revdelete-uname' => 'Benutzername',
-'revdelete-restricted' => 'Yyschränkige gälte au fir Ammanne',
-'revdelete-unrestricted' => 'Yyschränkige fir Ammanne ufghobe',
-'revdelete-hid' => 'versteckleti $1',
-'revdelete-unhid' => 'macht $1 wider effetlig',
-'revdelete-log-message' => '$1 fir $2 {{PLURAL:$2|Version|Versione}}',
-'logdelete-log-message' => '$1 fir $2 {{PLURAL:$2|Logbuechyytrag|Logbuechyytreg}}',
'revdelete-hide-current' => 'Fähler bim Verstecke vum Yytrag mit em Datum $2, $1: des isch di aktuäll Version.
Si cha nit versteckt wäre.',
'revdelete-show-no-access' => 'Fähler bim Aazeige vum Yytrag mit em Datum $2, $1: dää Yytrag isch as „yygschränkt“ markiert wore.
@@ -1154,12 +1156,14 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
'prefs-rc' => 'Letschti Änderige',
'prefs-watchlist' => 'Beobachtigslischte',
'prefs-watchlist-days' => 'Aazahl vu dr Täg, wu d Beobchtigslischt standardmässig soll umfasse:',
-'prefs-watchlist-days-max' => 'Maximal 7 Täg',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Maximali Zahl vu dr Yyträg:',
'prefs-watchlist-edits-max' => 'Maximali Aazahl: 1000',
'prefs-watchlist-token' => 'Beobachtigslischte-Chännzeiche:',
'prefs-misc' => 'Verschidnigs',
'prefs-resetpass' => 'Passwort ändere',
+'prefs-changeemail' => 'E-Mail Adräss ändre',
+'prefs-setemail' => 'E-Mail-Adräss festlaie',
'prefs-email' => 'E-Mail-Optione',
'prefs-rendering' => 'Sytedarstellig',
'saveprefs' => 'Änderige spychere',
@@ -1219,6 +1223,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
'yourrealname' => 'Echte Name:',
'yourlanguage' => 'Sproch:',
'yourvariant' => 'Sproochvariante vum Inhalt:',
+'prefs-help-variant' => 'Dyni bevorzugti Schrybvariante oder Orthographi, wo de Inhalt vo däm Wiki aazeigt drin aazeigt werde söll.',
'yournick' => 'Unterschrift:',
'prefs-help-signature' => 'Byyträg uf Diskussionssyte sotte mit „<nowiki>~~~~</nowiki>“ unterschribe wäre, was derno in d Unterschrift mit eme Zytstämpfel umgwandlet wird.',
'badsig' => 'Dr Syntax vu dr Signatur isch nid giltig; bitte d HTML iberpriefe.',
@@ -1257,7 +1262,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
'userrights-lookup-user' => 'Verwalt d Gruppezuegherigkeit',
'userrights-user-editname' => 'Benutzername:',
'editusergroup' => 'Ändere vo Benutzerrächt',
-'editinguser' => "Benutzerrächt ändere vu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Am Ändere vu dr Benutzerrächt vu '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Bearbeit d Gruppezuegherigkeit vum Benutzer',
'saveusergroups' => 'Spychere d Gruppezuegherigkeit',
'userrights-groupsmember' => 'Mitgliid vu:',
@@ -1350,13 +1355,13 @@ Des cha nimmi ruckgängig gmacht wäre.',
'right-autopatrol' => 'Markier eigeni Bearbeitige automatisch as kontrolliert',
'right-patrolmarks' => 'D Kontrollmarkierige in dr letschten Änderige aaluege',
'right-unwatchedpages' => 'D Lischt vu nit beobachtete Syte aaluege',
-'right-trackback' => 'Trackback ibermittle',
'right-mergehistory' => 'Versionsgschichte vu Syte zämefiere',
'right-userrights' => 'Benutzerrächt bearbeite',
'right-userrights-interwiki' => 'Benutzerrächt in andere Wiki bearbeite',
'right-siteadmin' => 'Datebank sperre un entsperre',
'right-override-export-depth' => 'Exportier Syte mitsamt dr vergleichte Syte bis zuen ere Tiefi vu 5',
'right-sendemail' => 'E-Mail an anderi Benutzer schicke',
+'right-passwordreset' => 'Passwort vun eme Benutzer zruggsetze',
# User rights log
'rightslog' => 'Benutzerrächt-Logbuech',
@@ -1395,7 +1400,6 @@ Des cha nimmi ruckgängig gmacht wäre.',
'action-patrol' => 'd Bearbeitige vu andere Benutzer as kontrolliert z markiere',
'action-autopatrol' => 'di eigene Bearbeitige as kontrolliert z markiere',
'action-unwatchedpages' => 'd Lischt vu dr nit beobachtete Syten aazluege',
-'action-trackback' => 'e Trackback z ibertrage',
'action-mergehistory' => 'd Versionegschichte vu Syte zämezfiere',
'action-userrights' => 'Benutzerrächt z ändere',
'action-userrights-interwiki' => 'd Rächt vu Benutzer in andere Wiki z ändere',
@@ -1485,6 +1489,7 @@ Lueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick
'ignorewarnings' => 'Warnige ignoriere',
'minlength1' => 'Dateinäme mien zmindescht e Buechstab lang syy.',
'illegalfilename' => 'Im Dateiname „$1“ het s zmindescht ei Zeiche, wu nit erlaubt isch. Bitte gib dr Datei e andere Name un versuech nomol si uffezlade.',
+'filename-toolong' => 'Dateiname dürfe nit grösser wie 240 Bytes sy.',
'badfilename' => 'Dr Dateiname isch in „$1“ gänderet wore.',
'filetype-mime-mismatch' => 'D Dateierwyterig „.$1“ passt nit zum MIME-Typ ($2).',
'filetype-badmime' => 'Dateie mit em MIME-Typ „$1“ derfe nit uffeglade wäre.',
@@ -1923,12 +1928,8 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
'activeusers-noresult' => 'Kei Benutzer gfunde.',
# Special:Log/newusers
-'newuserlogpage' => 'Nejaamäldigs-Logbuech',
-'newuserlogpagetext' => 'Des isch e Logbuech fir nej aagleiti Benutzerchonte.',
-'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
-'newuserlog-create-entry' => 'Benutzer isch nej regischtriert wore',
-'newuserlog-create2-entry' => 'het e Benutzerkonto aagleit fir $1',
-'newuserlog-autocreate-entry' => 'Benutzerkonto isch automatisch aagleit wore',
+'newuserlogpage' => 'Nejaamäldigs-Logbuech',
+'newuserlogpagetext' => 'Des isch e Logbuech fir nej aagleiti Benutzerchonte.',
# Special:ListGroupRights
'listgrouprights' => 'Benutzergruppe-Rächt',
@@ -1957,7 +1958,7 @@ Zuesätzligi Informatione iber einzelni Rächt git s [[{{MediaWiki:Listgrouprigh
'emailpagetext' => 'Du chasch im Benutzer mit däm Formular e E-Mail schicke.
As Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yytrait, ass dr Benutzer Dir cha Antwort gee.',
'usermailererror' => 'S Mail-Objekt het e Fähler zruckgee:',
-'defemailsubject' => '{{SITENAME}}-E-Mail',
+'defemailsubject' => '{{SITENAME}}-E-Mail vum Benutzer „$1“',
'usermaildisabled' => 'Benutzer-E-Mail abgstellt',
'usermaildisabledtext' => 'Du chasch in däm Wiki kei E-Mail an anderi Benutzer schicke',
'noemailtitle' => 'Kei e-Mail-Adrässe',
@@ -2075,8 +2076,6 @@ Bitte bi Dir iber d Konsequänze bewusst, un bi sicher, dass Du Di an unsri [[{{
'actionfailed' => 'Aktion fählgschlaa',
'deletedtext' => '«$1» isch glescht wore.
Im $2 het s e Lischt vu dr letschte Leschige.',
-'deletedarticle' => 'het „[[$1]]“ glescht',
-'suppressedarticle' => 'het d Sichtbarkeit vu „[[$1]]“ gänderet',
'dellogpage' => 'Lösch-Logbuech',
'dellogpagetext' => 'Des isch s Logbuech vu dr gleschte Syte un Dateie.',
'deletionlog' => 'Lösch-Logbuech',
@@ -2141,6 +2140,7 @@ Der Schutzstatus vo dere Syte lat sech la ändere, aber das het kei Yfluss uf d
'protect-level-sysop' => 'Numme Ammanne',
'protect-summary-cascade' => 'Kaskade',
'protect-expiring' => 'bis $1 (UTC)',
+'protect-expiring-local' => 'bis $1',
'protect-expiry-indefinite' => 'uubschränkt',
'protect-cascade' => 'Kaskadesperrig – alli yybundnige Vorlage sy mitgsperrt.',
'protect-cantedit' => 'Du chasch der Schutzstatus vo dere Syte nid ändere, wil du kener Berächtigunge hesch, für se z bearbeite.',
@@ -2197,7 +2197,6 @@ In däm Fall darf di neijscht Version nit markiert wäre oder ihre Status muess
'undeletereset' => 'Abbräche',
'undeleteinvert' => 'Uswahl umchehre',
'undeletecomment' => 'Grund:',
-'undeletedarticle' => 'hät d Site „[[$1]]“ widderhergstellt',
'undeletedrevisions' => '{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore',
'undeletedfiles' => '{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore',
@@ -2335,6 +2334,7 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
'blocklist-userblocks' => 'Benutzersperrine uusblände',
'blocklist-tempblocks' => 'Befrischteti Sperrine uusblände',
'blocklist-addressblocks' => 'IP-Sperrine uusblände',
+'blocklist-rangeblocks' => 'Beryychssperre ussblände',
'blocklist-timestamp' => 'Zytstämpfel',
'blocklist-target' => 'Ziil',
'blocklist-expiry' => 'Gsperrt bis',
@@ -2357,6 +2357,7 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
'unblocklink' => 'freigä',
'change-blocklink' => 'Sperri ändere',
'contribslink' => 'Byträg',
+'emaillink' => 'E-Mail abschicke',
'autoblocker' => 'Automatischi Sperri, wel Du e gmeinsami IP-Adräss mit [[User:$1|Benutzer:$1]] bruchsch. Grund: „$2“.',
'blocklogpage' => 'Sperrigs-Protokoll',
'blocklog-showlog' => 'Dää Benutzer isch schon emol gsperrt wore. S Sperrine-Logbuech git s do as Referänz:',
@@ -2461,9 +2462,6 @@ I söttigne Fäll müessti d Diskussionssyten allefalls vo Hand kopiert wärde."
'movepage-page-moved' => 'D Syte „$1“ isch uf „$2“ verschobe worde.',
'movepage-page-unmoved' => 'D Syte „$1“ het nüt chönne uf „$2“ verschobe werde.',
'movepage-max-pages' => 'D Maximalaazaal vo $1 {{PLURAL:$1|Syte|Syte}} isch verschobe worde. Mee chönne automatisch nüt verschobe werde.',
-'1movedto2' => '[[$1]] isch uf [[$2]] verschobe worde.',
-'1movedto2_redir' => '[[$1]] isch uf [[$2]] verschobe wore un het drbyy e Wyterleitig iberschribe.',
-'move-redirect-suppressed' => 'E Wyterleitig isch unterdruggt worde',
'movelogpage' => 'Verschiebigs-Logbuech',
'movelogpagetext' => 'Des isch e Lischte mit allene Syte wo verschobe worde sin.',
'movesubpage' => '{{PLURAL:$1|Untersyte|Untersyte}}',
@@ -2476,7 +2474,7 @@ I söttigne Fäll müessti d Diskussionssyten allefalls vo Hand kopiert wärde."
D Syte „[[:$1]]“ gits scho. Wottsch du si lösche, zume Platz zum verschiebe mache?',
'delete_and_move_confirm' => 'D Ziilsyte für d Verschiebig lösche',
-'delete_and_move_reason' => 'glöscht, zume Platz für zum verschiebe mache',
+'delete_and_move_reason' => 'glöscht, zume Platz für s Verschiebe vo „[[$1]]“ z mache',
'selfmove' => 'Der nöi Artikelname mues en andere sy als der alt!',
'immobile-source-namespace' => 'Syte ussem „$1“-Namensruum chönne nüt verschobe werde',
'immobile-target-namespace' => 'Syte chönne nüt in de „$1“-Namensruum verschobe werde',
@@ -2581,6 +2579,8 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
'import-upload' => 'XML-Date ufelade',
'import-token-mismatch' => 'D Sitzigsdate sin verlore gange. Bitte versuech es noo emool.',
'import-invalid-interwiki' => 'Us däm Wiki wo du aagää hesch isch kei Import mögli.',
+'import-error-edit' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z bearbeite.',
+'import-error-create' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z erstelle.',
# Import log
'importlogpage' => 'Import-Logbuech',
@@ -2707,9 +2707,6 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
# Patrol log
'patrol-log-page' => 'Kontroll-Logbuech',
'patrol-log-header' => 'Des isch s Kontroll-Logbuech.',
-'patrol-log-line' => 'het d’$1 vo $2 als patrulyrt markyrt $3',
-'patrol-log-auto' => '(automatisch)',
-'patrol-log-diff' => 'Version $1',
'log-show-hide-patrol' => 'Kontroll-Logbuech $1',
# Image deletion
@@ -2735,11 +2732,11 @@ $1',
'file-info' => 'Dateigressi: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 Pixel, Dateigrößi: $3, MIME-Typ: $4',
'file-info-size-pages' => '$1 × $2 Pixel, Dateigreßi: $3, MIME-Typ: $4, $5 {{PLURAL:$5|Syte| Syte}}',
-'file-nohires' => '<small>Kei höcheri Uflösig verfüegbar.</small>',
+'file-nohires' => 'Kei höcheri Uflösig verfüegbar.',
'svg-long-desc' => 'SVG-Datei, Basisgrößi: $1 × $2 Pixel, Dateigrößi: $3',
'show-big-image' => 'Originalgrößi',
-'show-big-image-preview' => '<small>Greßi vu däre Vorschau: $1.</small>',
-'show-big-image-other' => '<small>Wyteri Uflesige: $1.</small>',
+'show-big-image-preview' => 'Greßi vu däre Vorschau: $1.',
+'show-big-image-other' => 'Wyteri {{PLURAL:$2|Ufflösig|Ufflösige}}: $1.',
'show-big-image-size' => '$1 × $2 Pixel',
'file-info-gif-looped' => 'Ändlosschlupf',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Ramme|Ramme}}',
@@ -2759,6 +2756,13 @@ $1',
'bydate' => 'noch Datum',
'sp-newimages-showfrom' => 'Zeig neiji Dateie ab $1, $2 Uhr',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|1 Sekund|$1 Sekunde}}',
+'minutes' => '{{PLURAL:$1|1 Minut|$1 Minute}}',
+'hours' => '{{PLURAL:$1|1 Stund|$1 Stunde}}',
+'days' => '{{PLURAL:$1|1 Tag|$1 Täg}}',
+'ago' => 'vor $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3256,13 +3260,6 @@ Dää Bstetigungscode isch giltig bis am $4.',
'scarytranscludefailed' => '[Vorlage-Yybindig fir $1 isch gescheitert]',
'scarytranscludetoolong' => '[URL isch z lang]',
-# Trackbacks
-'trackbackbox' => 'Trackback fir die Syte:<br />
-$1',
-'trackbackremove' => '([$1 lesche])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback isch mit Erfolg glescht wore.',
-
# Delete conflict
'deletedwhileediting' => "'''Obacht''': Die Syte isch glescht wore, nochdäm Du aagfange hesch si z bearbeite!",
'confirmrecreate' => "Benutzer [[User:$1|$1]] ([[User talk:$1|Diskussion]]) het die Syte glescht, nochdäm Du aagfange hesch si z bearbeite.
@@ -3341,6 +3338,9 @@ Du chasch au d [[Special:EditWatchlist|Standard-Bearbeitigssyte]] bruuche.',
'watchlisttools-edit' => 'normal bearbeite',
'watchlisttools-raw' => 'imene große Textfäld bearbeite',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])',
+
# Core parser functions
'unknown_extension_tag' => 'Nit bekannte Extension-Tag „$1“',
'duplicate-defaultsort' => 'Obacht: Dr Sortierigsschlüssel „$2“ iberschrybt dr vorig brucht Schlüssel „$1“.',
@@ -3394,10 +3394,9 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
# Special:SpecialPages
'specialpages' => 'Spezialsytene',
-'specialpages-note' => '----
-* Reguläri Spezialsyte
+'specialpages-note' => '* Reguläri Spezialsyte
* <span class="mw-specialpagerestricted">Zuegriffsbschränkti Spezialsyte</span>
-* <span class="mw-specialpagecached">Cachegenerierti Spezialsyte</span>',
+* <span class="mw-specialpagecached">Gecachti Spezialsyte (dr Inhalt ist villicht veraltet.)</span>',
'specialpages-group-maintenance' => 'Wartigslischte',
'specialpages-group-other' => 'Andri Spezialsyte',
'specialpages-group-login' => 'Aamälde',
@@ -3439,13 +3438,16 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
'tags-hitcount' => '$1 {{PLURAL:$1|Änderig|Änderige}}',
# Special:ComparePages
-'comparepages' => 'Syte verglyyche',
-'compare-selector' => 'Syteversione verglyyche',
-'compare-page1' => 'Syte 1',
-'compare-page2' => 'Syte 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Verglyyche',
+'comparepages' => 'Syte verglyyche',
+'compare-selector' => 'Syteversione verglyyche',
+'compare-page1' => 'Syte 1',
+'compare-page2' => 'Syte 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Verglyyche',
+'compare-invalid-title' => 'Dr Sytename, wu Du aagee hesch, isch nit giltig',
+'compare-title-not-exists' => 'Dr Sytename, wu Du aagee hesch, git s nit.',
+'compare-revision-not-exists' => 'Die Version, wu Du aagee hesch, git s nit.',
# Database error messages
'dberr-header' => 'Des Wiki het e Probläm',
@@ -3472,4 +3474,82 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
'sqlite-has-fts' => '$1 mit Unterstitzig vu dr Volltextsuechi',
'sqlite-no-fts' => '$1 ohni Unterstitzig vu dr Volltextsuechi',
+# New logging system
+'logentry-delete-delete' => '$1 het d Syte $3 glöscht',
+'logentry-delete-restore' => '$1 het d Syte $3 wiiderhergstellt',
+'logentry-delete-event' => '$1 het die Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} uff $3: $4 gänderet',
+'logentry-delete-revision' => '$1 het die Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} uff $3: $4 gänderet',
+'logentry-delete-event-legacy' => '$1 het d Sichtbarkeit vo Logbuechyyträg uff $3 gänderet',
+'logentry-delete-revision-legacy' => '$1 het d Sichtbarkeit vo Versione uff $3 gänderet',
+'logentry-suppress-delete' => '$1 het d Syte $3 unterdrückt',
+'logentry-suppress-event' => '$1 het diskret d Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} uff $3: $4 gänderet',
+'logentry-suppress-revision' => '$1 het diskret d Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} uff $3: $4 gänderet',
+'logentry-suppress-event-legacy' => '$1 het d Sichtbarkeit vo Logbuechyyträg diskret uff $3 gänderet',
+'logentry-suppress-revision-legacy' => '$1 het diskret d Sichtbarkeit vo Versione uff $3 gänderet',
+'revdelete-content-hid' => 'Inhalt versteckt',
+'revdelete-summary-hid' => 'Bearbeitigszämmefassig versteckt',
+'revdelete-uname-hid' => 'Benutzername versteckt',
+'revdelete-content-unhid' => 'Inhalt füregholt',
+'revdelete-summary-unhid' => 'Bearbeitigszämmefassig füregholt',
+'revdelete-uname-unhid' => 'Benutzername freigee',
+'revdelete-restricted' => 'Yyschränkige gälte au fir Ammanne',
+'revdelete-unrestricted' => 'Yyschränkige fir Ammanne ufghobe',
+'logentry-move-move' => '$1 het d Syte $3 nooch $4 verschobe',
+'logentry-move-move-noredirect' => '$1 het d Syte $3 nooch $4 verschobe ohni e Wyterleitig aazlege',
+'logentry-move-move_redir' => '$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe',
+'logentry-move-move_redir-noredirect' => '$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe, ohni sälber eini aazlege',
+'logentry-patrol-patrol' => '$1 het Version $4 vo Syte $3 als kontrolliert markiert',
+'logentry-patrol-patrol-auto' => '$1 het Version $4 vo Syte $3 automatisch als kontrolliert markiert',
+'logentry-newusers-newusers' => '$1 het en Benutzerchonto erstellt',
+'logentry-newusers-create' => '$1 het en Benutzerchonto erstellt',
+'logentry-newusers-create2' => '$1 het en Benutzerchonto $3 erstellt',
+'logentry-newusers-autocreate' => 'S Benutzerchonto $1 isch automatisch erstellt worde',
+'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
+
+# Feedback
+'feedback-subject' => 'Beträff:',
+'feedback-message' => 'Noochricht:',
+'feedback-cancel' => 'Abbräche',
+'feedback-submit' => 'Ruggmäldig abschigge',
+'feedback-adding' => 'Ruggmäldig wird zur Syte dezuegfiegt …',
+'feedback-error1' => 'Fäälermäldig: Unbekannts Ergebniss vo de API',
+'feedback-error2' => 'Fääler: Bearbeitig fehlgschlo',
+'feedback-error3' => 'Fäälermäldig: Kei Antwort vo de API',
+
+# API errors
+'api-error-badaccess-groups' => 'Du derfsch keini Dateie in des Wiki uffelade.',
+'api-error-badtoken' => 'Intärne Fähler: Dr Token isch fählerhaft.',
+'api-error-copyuploaddisabled' => 'S Uffelade iber e URL isch uf däm Server deaktiviert.',
+'api-error-duplicate' => 'S git im Wiki scho {{PLURAL:$1|[$2 ei anderi Datei]|[$2 anderi Dateie]}} mit em glyche Inhalt.',
+'api-error-duplicate-archive' => 'Es {{PLURAL:$1|isch scho [$2 e andri Datei]|sin scho [$2 anderi Dateie]}} mit em glyche Inhalt vorhande gsi. {{PLURAL:$1|Si isch|Si sin}} allerdings glöscht worde.',
+'api-error-duplicate-archive-popup-title' => 'Doppelti {{PLURAL:$1|Datei, wo scho worde isch|Dateie, wo scho glöscht worde sin}}',
+'api-error-duplicate-popup-title' => 'Dopplet vorhandeni {{PLURAL:$1|Datei|Dateie}}',
+'api-error-empty-file' => 'D Datei, wu Du uffeglade hesch, isch läär.',
+'api-error-fetchfileerror' => 'Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.',
+'api-error-file-too-large' => 'D Datei, wu Du ibertrait hesch, isch z groß.',
+'api-error-filename-tooshort' => 'Dr Dateiname isch z churz.',
+'api-error-filetype-banned' => 'Dää Dateityp isch gsperrt.',
+'api-error-filetype-missing' => 'D Datei het kei Dateinameerwyterig.',
+'api-error-hookaborted' => 'D Änderig, wu Du versuecht hesch, isch wäg eme Erwyterigs-Hooks abbroche wore.',
+'api-error-http' => 'Intärne Fähler: S het kei Verbindig zum Server chenne härgstellt wäre.',
+'api-error-illegal-filename' => 'Dr Dateiname isch nit erlaubt.',
+'api-error-internal-error' => 'Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei ins Wiki.',
+'api-error-invalid-file-key' => 'Intärne Fähler: D Datei isch nit im temporäre Spycher gfunde wore.',
+'api-error-missingparam' => 'Intärne Fähler: Zue dr Aafrog fähle Parameter.',
+'api-error-missingresult' => 'Intärne Fähler: S het nit chenne feschtgstellt wäre, eb s Kopiere erfolgryych gsi isch.',
+'api-error-mustbeloggedin' => 'Zum Dateie uffelade muesch aagmäldet syy.',
+'api-error-mustbeposted' => 'S git e Programmierfähler (s wird di falsch HTTP-Method brucht).',
+'api-error-noimageinfo' => 'S Uffelade isch erfolgryych gsi, aber de Server het kei Informatione über d Datei zur Verfiegig gstellt.',
+'api-error-nomodule' => 'Intärne Fähler: S isch kei Modul zum Uffelade feschtgleit wore.',
+'api-error-ok-but-empty' => 'Intärne Fähler: Dr Server reagiert nit.',
+'api-error-overwrite' => 'S Iberschryybe vun ere Datei, wu s scho git, isch nit erlaubt.',
+'api-error-stashfailed' => 'Intärne Fähler: Dr Server het kei temporäri Datei chenne spychere.',
+'api-error-timeout' => 'Dr Server het kei antwort gee in dr erwartete Zyt.',
+'api-error-unclassified' => 'S het e nit bekannte Fähler gee.',
+'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
+'api-error-unknown-error' => 'Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei.',
+'api-error-unknown-warning' => 'Unbekannti Warnig: $1',
+'api-error-uploaddisabled' => 'S Uffelade isch in däm Wiki deaktiviert.',
+'api-error-verification-error' => 'Die Datei isch entwäder fählerhaft oder si het di falsch Dateinameerwyterig.',
+
);
diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php
index 7cadc1b5..271b1b34 100644
--- a/languages/messages/MessagesGu.php
+++ b/languages/messages/MessagesGu.php
@@ -144,6 +144,8 @@ $digitTransformTable = array(
'9' => '૯', # &#x0aef;
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન) ઉમેરો:',
@@ -511,22 +513,24 @@ $1',
'badarticleerror' => 'આ કà«àª°àª¿àª¯àª¾ આ પાના ઉપર કરવી શકà«àª¯ નથી.',
'cannotdelete' => 'ફાઇલ કે પાનà«àª‚ "$1" હટાવી શકાયà«àª‚ નથી.
શકà«àª¯ છે કે અનà«àª¯ કોઈઠપહેલેથી હટાવી દીધà«àª‚ હોય.',
+'cannotdelete-title' => '"$1" પાનà«àª‚ કાઢી શકતા નથી',
'badtitle' => 'ખરાબ નામ',
'badtitletext' => 'આપનà«àª‚ ઈચà«àª›àª¿àª¤ શીરà«àª·àª• અમાનà«àª¯ છે, ખાલી છે, અથવાતો અયોગà«àª¯ રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલà«àª‚ શીરà«àª·àª• છે.
શકà«àª¯ છે કે તેમાં àªàª• કે વધૠàªàªµàª¾ અકà«àª·àª° કે ચિહà«àª¨à«‹ છે કે જે પાનાનાં શીરà«àª·àª• માટે અવૈધ છે.',
-'perfcached' => 'નીચે દરà«àª¶àª¾àªµà«‡àª²à«€ માહિતી જà«àª¨àª¾ સંગà«àª°àª¹àª®àª¾àª‚થી લીધેલી છે અને શકà«àª¯ છે કે તે હાલની પરિસà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ સચોટ ના હોય.',
-'perfcachedts' => 'નીચેની વિગતો જà«àª¨àª¾ સંગà«àª°àª¹àª®àª¾àª¥à«€ છે અને તે છેલà«àª²à«‡ $1 સà«àª§à«€ અદà«àª¯àª¤àª¨ હતી.',
+'perfcached' => 'નીચે દરà«àª¶àª¾àªµà«‡àª²à«€ માહિતી જૂના સંગà«àª°àª¹àª®àª¾àª‚થી લીધેલી છે અને શકà«àª¯ છે કે તે હાલની પરિસà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ સચોટ ના હોય. વધà«àª®àª¾àª‚ વધૠ{{PLURAL:$1|àªàª• પરિણામ|$1 પરિણામો}} આ સંગà«àª°àª¹àª®àª¾àª‚ ઉપલબà«àª§ છે.',
+'perfcachedts' => 'નીચેની વિગતો જૂના સંગà«àª°àª¹àª®àª¾àª¥à«€ છે અને તે છેલà«àª²à«‡ $1ઠતાજી કરવામાં આવી હતી. વધà«àª®àª¾àª‚ વધૠ{{PLURAL:$4|àªàª• પરિણામ|$4 પરિણામો}} આ સંગà«àª°àª¹àª®àª¾àª‚ ઉપલબà«àª§ છે.',
'querypage-no-updates' => 'આ પાનાની નવી આવૃતà«àª¤àª¿àª“ હાલમાં અકà«àª°àª¿àª¯ છે.
અહીંની વિગતો હાલમાં રિફà«àª°à«‡àª¶ કરવામાં નહી આવે.',
'wrong_wfQuery_params' => 'wfQuery() માટે અયોગà«àª¯ વિકલà«àªªà«‹<br />
Function: $1<br />
Query: $2',
'viewsource' => 'સà«àª¤à«àª°à«‹àª¤ જà«àª“',
-'viewsourcefor' => '$1ને માટે',
+'viewsource-title' => '$1 માટે સà«àª¤à«àª°à«‹àª¤ જà«àªµàª‘',
'actionthrottled' => 'અકાળે અટાકાવી દીધેલી કà«àª°àª¿àª¯àª¾',
'actionthrottledtext' => 'સà«àªªàª¾àª® નિયંતà«àª°àª£ તકેદારી રૂપે આ કà«àª°àª¿àª¯àª¾ અમà«àª• મરà«àª¯àª¾àª¦àª¾àª®àª¾àª‚ જ કરી શકો છો, અને તમે તે મરà«àª¯àª¾àª¦àª¾ વટાવી દીધી છે. કૃપા કરી થોડાક સમય પછી ફરી પà«àª°àª¯àª¤à«àª¨ કરો.',
'protectedpagetext' => 'ફેરફારો થતાં રોકવા માટે આ પાનà«àª‚ સà«àª°àª•à«àª·àª¿àª¤ કરવામાં આવà«àª¯à«àª‚ છે.',
'viewsourcetext' => 'આપ આ પાનાનો મૂળ સà«àª¤à«àª°à«‹àª¤ નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:',
+'viewyourtext' => "તમે જોવા અને''સà«àª¤à«àª°à«‹àª¤ નકલ કરી શકો છો પર તમારા સંપાદનો'''આ પાનાં નઆ",
'protectedinterface' => 'આ પાનà«àª‚ સોફà«àªŸàªµà«‡àª° માટે ઇનà«àªŸàª°àª«à«‡àª‡àª¸ ટેકà«àª¸àªŸ આપે છે, અને તેને દà«àª°à«àªªàª¯à«‹àª— રોકવા માટે સà«àª¥àª—િત કરà«àª¯à«àª‚ છે.',
'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહà«àª¯àª¾ છો તે પાનà«àª‚ સોફà«àªŸàªµà«‡àª° માટે ઇનà«àªŸàª°àª«à«‡àª¸ ટેકà«àª¸àªŸ પà«àª°à«€ પાડે છે.
અહીંનો બદલાવ બીજા સભà«àª¯à«‹àª¨àª¾ ઇનà«àªŸàª°àª«à«‡àª¸àª¨àª¾àª‚ દેખાવ ઉપર અસરકરà«àª¤àª¾ બનશે.
@@ -638,6 +642,7 @@ Please log in again after you receive it.
'emailconfirmlink' => 'તમારા ઇ-મેઇલ સરનામાની પà«àª·à«àªŸàª¿ કરો',
'invalidemailaddress' => 'આ ઈ-મેલ અયોગà«àª¯ માળખà«àª‚ ધરાવà«àª¹à«‡ છે માટે સà«àªµà«€àª•àª¾àª°à«€ શકાશે નહીં
કૃપયા યોગà«àª¯ માળખામાં ઇ-મેલ લખો',
+'cannotchangeemail' => 'àªàª•àª¾àª‰àª¨à«àªŸ ઈ મેલ àªàª¡à«àª°àª¸ આ વીકી પર નહિ બદલી શકાય.',
'accountcreated' => 'ખાતà«àª‚ ખોલવામાં આવà«àª¯à«àª‚ છે',
'accountcreatedtext' => '$1 માટે સભà«àª¯ ખાતૠબનાવà«àª¯à«àª‚.',
'createaccount-title' => '{{SITENAME}} માટે ખાતૠબનાવà«àª¯à«àª‚',
@@ -655,6 +660,7 @@ Please log in again after you receive it.
# E-mail sending
'php-mail-error-unknown' => 'PHPની મેલ() કામગીરીમાં અજà«àªžàª¾àª¤ તà«àª°à«àªŸàª¿',
+'user-mail-no-addy' => 'ઈ મેલ àªàª¡à«àª°àª¸ વગર ઈ મેલ મોકલવા પà«àª°àª¯àª¤à«àª¨ કરેલ.',
# Change password dialog
'resetpass' => 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલો',
@@ -676,30 +682,45 @@ Please log in again after you receive it.
'resetpass-temp-password' => 'કામચલાવ ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾:',
# Special:PasswordReset
-'passwordreset' => 'પાસવરà«àª¡ રીસેટ કરો',
-'passwordreset-text' => 'આપના ઈ મેલ ખાતા ની માહિતી મેળવવા માટે આ ફોરà«àª® માં વિગતો ભરો.',
-'passwordreset-legend' => 'પાસવરà«àª¡ રીસેટ કરો',
-'passwordreset-disabled' => 'આ વિકી પર પાસવરà«àª¡ રીસેટ કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ છે.',
-'passwordreset-pretext' => '{{PLURAL: $1| | àªàª• નીચે માહિતીના ટà«àª•àª¡àª¾àª“ દાખલ}}',
-'passwordreset-username' => 'સભà«àª¯ નામ:',
-'passwordreset-domain' => 'ડોમેઈન:',
-'passwordreset-email' => 'ઇ મેલ સરનામà«àª‚:',
-'passwordreset-emailtitle' => '{{SITENAME}} માટે ખાતૠબનાવà«àª¯à«àª‚',
-'passwordreset-emailtext-ip' => 'કોઈક (કદાચ તમો , $1 IP àªàª¡à«àª°à«‡àª¸ થી) ઠતમારી વેબસાઈટ {{SITENAME}} ($4) ના ખાતા ની વિગત અંગે યાદ દેવડાવાની રજૂઆત કરી છે. આ ઈ-મેઈલ àªàª¡à«àª°à«‡àª¸ સાથે {{PLURAL:$3|નà«àª‚ ખાતà«àª‚|ના ખાતા}} જોડાયેલા છે.
+'passwordreset' => 'પાસવરà«àª¡ રીસેટ કરો',
+'passwordreset-text' => 'આપના ઈ મેલ ખાતા ની માહિતી મેળવવા માટે આ ફોરà«àª® માં વિગતો ભરો.',
+'passwordreset-legend' => 'પાસવરà«àª¡ રીસેટ કરો',
+'passwordreset-disabled' => 'આ વિકી પર પાસવરà«àª¡ રીસેટ કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ છે.',
+'passwordreset-pretext' => '{{PLURAL: $1| | àªàª• નીચે માહિતીના ટà«àª•àª¡àª¾àª“ દાખલ}}',
+'passwordreset-username' => 'સભà«àª¯ નામ:',
+'passwordreset-domain' => 'ડોમેઈન:',
+'passwordreset-capture' => 'પરિણામી ઈ મેલ જોવો છે ?',
+'passwordreset-capture-help' => 'જો તમે આ ઓપà«àª¶àª¨ સિલેકà«àªŸ કરશો, તો તમને અને યà«àªàª° ને ઈ મેલ (કામચલાઉ પાસવરà«àª¡ સાથે) દેખાડવામાં આવશે.',
+'passwordreset-email' => 'ઇ મેલ સરનામà«àª‚:',
+'passwordreset-emailtitle' => '{{SITENAME}} માટે ખાતૠબનાવà«àª¯à«àª‚',
+'passwordreset-emailtext-ip' => 'કોઈક (કદાચ તમો , $1 IP àªàª¡à«àª°à«‡àª¸ થી) ઠતમારી વેબસાઈટ {{SITENAME}} ($4) ના ખાતા ની વિગત અંગે યાદ દેવડાવાની રજૂઆત કરી છે. આ ઈ-મેઈલ àªàª¡à«àª°à«‡àª¸ સાથે {{PLURAL:$3|નà«àª‚ ખાતà«àª‚|ના ખાતા}} જોડાયેલા છે.
.
.
$2
{{PLURAL:$3|આ કામચલાઉ પાસવરà«àª¡|આ બધા કામચલાઉ પાસવરà«àª¡}} {{PLURAL:$5|àªàª• દિવસ|$5 દિવસ}} માં નષà«àªŸ થઇ જશે. તમારે અતà«àª¯àª¾àª°à«‡ જ ખાતà«àª‚ ખોલીને નવો પાસવરà«àª¡ સેટ કરી લેવો જોઈઠ.જો કોઈ બીજા ઠઆ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવરà«àª¡ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવરà«àª¡ ને વાપરી શકો છો.',
-'passwordreset-emailtext-user' => 'વેબસાઈટ {{SITENAME}} ($4) ના વપરાશકરà«àª¤àª¾ $1 ઠતમારી ના ખાતા ની વિગત અંગે યાદ દેવડાવાની રજૂઆત કરી છે. આ ઈ-મેઈલ àªàª¡à«àª°à«‡àª¸ સાથે {{PLURAL:$3|નà«àª‚ ખાતà«àª‚|ના ખાતા}} જોડાયેલા છે.
+'passwordreset-emailtext-user' => 'વેબસાઈટ {{SITENAME}} ($4) ના વપરાશકરà«àª¤àª¾ $1 ઠતમારી ના ખાતા ની વિગત અંગે યાદ દેવડાવાની રજૂઆત કરી છે. આ ઈ-મેઈલ àªàª¡à«àª°à«‡àª¸ સાથે {{PLURAL:$3|નà«àª‚ ખાતà«àª‚|ના ખાતા}} જોડાયેલા છે.
$2
{{PLURAL:$3|આ કામચલાઉ પાસવરà«àª¡|આ બધા કામચલાઉ પાસવરà«àª¡}} {{PLURAL:$5|àªàª• દિવસ|$5 દિવસ}} માં નષà«àªŸ થઇ જશે. તમારે અતà«àª¯àª¾àª°à«‡ જ ખાતà«àª‚ ખોલીને નવો પાસવરà«àª¡ સેટ કરી લેવો જોઈઠ.જો કોઈ બીજા ઠઆ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવરà«àª¡ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવરà«àª¡ ને વાપરી શકો છો..',
-'passwordreset-emailelement' => 'વપરાશકરà«àª¤àª¾ નામ: $1
+'passwordreset-emailelement' => 'વપરાશકરà«àª¤àª¾ નામ: $1
કામચલાઉ પાસવરà«àª¡: $2',
-'passwordreset-emailsent' => 'àªàª• સà«àª®à«ƒàª¤àª¿àªªàª¤à«àª° ઈ મેલ મોકલવામાં આવà«àª¯à«‹ છે.',
+'passwordreset-emailsent' => 'àªàª• સà«àª®à«ƒàª¤àª¿àªªàª¤à«àª° ઈ મેલ મોકલવામાં આવà«àª¯à«‹ છે.',
+'passwordreset-emailsent-capture' => 'àªàª• સà«àª®à«ƒàª¤àª¿àªªàª¤à«àª° ઈ મેલ મોકલવામાં આવà«àª¯à«‹ છે, જે આ પà«àª°àª®àª¾àª£à«‡ છે.',
+'passwordreset-emailerror-capture' => 'àªàª• સà«àª®à«ƒàª¤àª¿àªªàª¤à«àª° ઈ મેલ બનાવવા માં આવà«àª¯à«‹ છે, જે આ પà«àª°àª®àª¾àª£à«‡ છે, પરંતૠતે યà«àªàª° ને મોકલવા માં નિષà«àª«àª³ થયો છે: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ઈ મેલ ખાતૠબદલવા માટે',
+'changeemail-header' => 'તમારા ખાતાનà«àª‚ ઈ-મેઈલ સરનામà«àª‚ બદલો',
+'changeemail-text' => 'તમારà«àª‚ ઈ-મેઈલ સરનામà«àª‚ બદલવા માટે આ ફોરà«àª® ભરો. આ ફેરફાર કાયમ કરવા માટે તમારે પાસવરà«àª¡ ભરવાની જરૂર પડશે.',
+'changeemail-no-info' => 'બારોબાર આ પાનà«àª‚ જોવા માટે પà«àª°àªµà«‡àª¶ કરવો આવશà«àª¯àª• છે.',
+'changeemail-oldemail' => 'હાલ નà«àª‚ ઈ મેલ ખાતà«:',
+'changeemail-newemail' => 'નવà«àª‚ ઈ-મેલ સરનામà«àª‚',
+'changeemail-none' => '(કંઈ નહી)',
+'changeemail-submit' => 'ઈ મેલ બદલો',
+'changeemail-cancel' => 'રદ કરો',
# Edit page toolbar
'bold_sample' => 'ઘાટા અકà«àª·àª°',
@@ -768,9 +789,6 @@ $2
તમારà«àª‚ હાલનà«àª‚ IP સરનામà«àª‚ $3 છે, અને રોકની ID છે #$5.
આ માહિતી તમારી પૂછપરછમાં જરૂર ઉમેરશો',
'blockednoreason' => 'કોઇ કારણ દરà«àª¶àª¾àªµàªµàª¾àª®àª¾àª‚ આવà«àª¯à«àª‚ નથી',
-'blockedoriginalsource' => "'''$1'''નો સà«àª°à«‹àª¤ નીચે દરà«àª¶àª¾àªµà«‡àª² છે:",
-'blockededitsource' => "'''$1''' માટે '''તમારા ફેરફારો''' નીચે દેખાય છે:",
-'whitelistedittitle' => 'ફેરફારો કરવા માટે લોગીન જરૂરી છે.',
'whitelistedittext' => 'ફેરફાર કરવા માટે તમારે $1 કરવાનà«àª‚ છે.',
'confirmedittext' => 'પાનાંમાં ફેરફાર કરવા માટે તમારે તમારા ઇમેલની પà«àª·à«àªŸàª¿ કરવી પડશે.
મહેરબાની કરી [[Special:Preferences|મારી પસંદ]]માં જઇને તમારà«àª‚ ઇમેલ સરનામà«àª‚ આપો અને તેને પà«àª°àª®àª¾àª£àª¿àª¤ કરો.',
@@ -863,7 +881,7 @@ $2
જો આપ ના ચાહતા હોવ કે તમારા યોગદાનમાં અનà«àª¯ કોઇ વà«àª¯àª•à«àª¤àª¿ બેધડક પણે ફેરફાર કરે તો અહીં યોગદાન કરશો નહી.<br />
સાથે સાથે તમે અમને àªàª® પણ ખાતરી આપી રહà«àª¯àª¾ છો કે આ લખાણ તમે મૌલિક રીતે લખà«àª¯à«àª‚ છે, અથવાતો પબà«àª²àª¿àª• ડોમેઇન કે તેવા અનà«àª¯ મà«àª•à«àª¤ સà«àª¤à«àª°à«‹àª¤àª®àª¾àª‚થી લીધà«àª‚ છે (વધૠમાહિતી માટે $1 જà«àª“).
'''પરવાનગી વગર પà«àª°àª•àª¾àª¶àª¨àª¾àª§àª¿àª•àª¾àª°àª¥à«€ સà«àª°àª•à«àª·àª¿àª¤ કારà«àª¯ અહીં પà«àª°àª•àª¾àª¶àª¿àª¤ ના કરશો!'''",
-'longpageerror' => "'''તà«àª°à«àªŸàª¿: તમે લખેલ લેખ $1 કિલોબાઇટ લાંબો છે, જે $2 કિલોબાઇટની મહતà«àª¤àª® સીમા કરતાં વધૠછે.'''
+'longpageerror' => "તà«àª°à«àªŸàª¿: તમે લખેલ લેખ {{PLURAL:$1|àªàª• કિલોબાઈટ|$1 કિલોબાઈટà«àª¸}} કિલોબાઇટ લાંબો છે, જે {{PLURAL:$1|àªàª• કિલોબાઈટ|$2 કિલોબાઈટà«àª¸}} કિલોબાઇટની મહતà«àª¤àª® સીમા કરતાં વધૠછે.'''
તેને સાચવી ન શકાયા.",
'readonlywarning' => "'''ચેતવણી: માહિતીસંચ સમારકામ માટે બંધ કરાયો છે, તમે તમારા ફેરફારો હમણા સાચવી નહીં શકો.'''
તમે તમારà«àª‚ લેખ કોઇ ટેકà«àª¸à«àªŸ ફાઇલ માં સેવ કરી મૂકી દો અને માહિતી સંચ ખà«àª²àª¤àª¾ વિકિ પર સાચવી શકશો.
@@ -1033,8 +1051,6 @@ $3 દà«àªµàª¾àª°àª¾ અપાયેલ કારણ છે ''$2''",
'revdelete-unsuppress' => 'સમા કરાયેલા પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ પરનાપà«àª°àª¤àª¿àª¬àª‚ધ હટાવો',
'revdelete-log' => 'કારણ:',
'revdelete-submit' => 'પસંદ કરેલા {{PLURAL:$1|ફેરફાર|ફેરફારો}} પર લગાડો',
-'revdelete-logentry' => '"[[$1]]" ના પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àª¨à«€ બદયેલી દà«àª°àª¶à«àª¯àª¤àª¾',
-'logdelete-logentry' => '"[[$1]]"ની બદલાયેલી ઘટના દà«àª°àª¶à«àª¯àª¤àª¾',
'revdelete-success' => 'પà«àª¨àª°àªµàª°à«àª¤àª¨ દà«àª°àª¶à«àª¯àª¤àª¾àª¸àª«àª³àª¤àª¾ પૂરà«àªµàª• અદà«àª¯àª¤àª¨ બનાવાઈ',
'revdelete-failure' => "'''પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àª¨à«€ દà«àª°àª¶à«àª¯àª¤àª¾ બદલીન શકાઈ:'''
$1",
@@ -1046,15 +1062,6 @@ $1",
'revdel-restore-visible' => 'દà«àª°àª¶à«àª¯ પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹',
'pagehist' => 'પાનાનો ઇતિહાસ',
'deletedhist' => 'રદ કરેલનો ઇતિહાસ',
-'revdelete-content' => 'સામગà«àª°à«€',
-'revdelete-summary' => 'સંપાદનનો સંકà«àª·àª¿àªªà«àª¤ અહેવાલ',
-'revdelete-uname' => 'સભà«àª¯àª¨àª¾àª®',
-'revdelete-restricted' => 'પà«àª°àª¬àªàª§àª•à«‹àª¨àª¾ ફેરફાર કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ મà«àª•àª¾àª¯à«‹',
-'revdelete-unrestricted' => 'પà«àª°àª¬àª‚ધકોના ફેરફાર કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ હટાવાયો.',
-'revdelete-hid' => '$1 છà«àªªàª¾àªµà«‹',
-'revdelete-unhid' => '$1 દરà«àª¶àª¾àªµà«‹',
-'revdelete-log-message' => '$1 માટે $2 {{PLURAL:$2|ફેરફાર|ફેરફારો }} દરà«àª¶àª¾àªµà«‹',
-'logdelete-log-message' => '$1 માટે $2 {{PLURAL:$2|ઘટના|ઘટનાઓ}}',
'revdelete-hide-current' => '$2, $1 તરીખ ધરાવતી વસà«àª¤à« સંતાડવામાં તà«àª°à«àªŸàª¿ : આ હાલનો ફેરફાર છે.
આને છà«àªªàª¾àªµà«€ નહીં શકાય.',
'revdelete-show-no-access' => '$2, $1 તિથીની વસà«àª¤à« બતાવવામાં તà«àª°à«àªŸàª¿ : આને "પà«àª°àª¤àª¿àª¬àª‚ધિત" અંકિત કરાઇ છે.
@@ -1215,12 +1222,14 @@ $1",
'prefs-rc' => 'તાજા ફેરફારો',
'prefs-watchlist' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ',
'prefs-watchlist-days' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિમાઠદરà«àª¶àª¾àªµàªµàª¨àª¾ દિવસો',
-'prefs-watchlist-days-max' => 'મહતà«àª¤àª® à«­ દિવસો',
+'prefs-watchlist-days-max' => 'મહતà«àª¤àª® $1 {{PLURAL:$1|દિવસ|દિવસો}}',
'prefs-watchlist-edits' => 'વિસà«àª¤àª°à«€àª¤ ધà«àª¯àª¾àª¨àª¸à«‚ચિ માં બતાવનારા ફેરફારોની સંખà«àª¯àª¾',
'prefs-watchlist-edits-max' => 'મહતà«àª¤àª® સંખà«àª¯àª¾ : ૧૦૦૦',
'prefs-watchlist-token' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ ચિઠà«àª à«€',
'prefs-misc' => 'પરચૂરણ',
'prefs-resetpass' => 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલો',
+'prefs-changeemail' => 'ઈ મેલ સરનામà«àª‚ બદલવા માટે',
+'prefs-setemail' => 'ઈ મેલ સરનામà«àª‚ સેટ કરો',
'prefs-email' => 'ઈ-મેલ સંબંધી વિકલà«àªªà«‹',
'prefs-rendering' => 'દેખાવ',
'saveprefs' => 'સાચવો',
@@ -1280,6 +1289,7 @@ $1",
'yourrealname' => 'સાચà«àª‚ નામ:',
'yourlanguage' => 'ભાષા',
'yourvariant' => 'સામગà«àª°à«€ ભાષા વિવિધતા:',
+'prefs-help-variant' => 'આ વિકિ પરના માહિતી પાનાના દેખાવ સંબંધે તમારી મનપસંદ variant કે orthography.',
'yournick' => 'સહી:',
'prefs-help-signature' => 'ચરà«àªšàª¾ પાના પરની ટિપà«àªªàª£à«€ "<nowiki>~~~~</nowiki>" દà«àªµàª¾àª°àª¾ હસà«àª¤àª¾àª•à«àª·àª°à«€àª¤ હોવા જોઇઠતેમાં તમારા હસà«àª¤àª¾àª•à«àª·àª° અને સમય શામિલ થશે.',
'badsig' => 'અવૈધ કાચી સહી
@@ -1322,7 +1332,7 @@ HTML નાકà«àª‚ ચકાસો',
'userrights-lookup-user' => 'સભà«àª¯ સમà«àª¹à«‹ નà«àª‚ પà«àª°àª¬àª‚ધન કરો',
'userrights-user-editname' => 'સભà«àª¯àª¨àª¾àª® દાખલ કરો:',
'editusergroup' => 'સભà«àª¯ સમà«àª¹à«‹ સંપાદીત કરો',
-'editinguser' => "સભà«àª¯ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) ના અધિકારો બદલાઇ રહà«àª¯àª¾ છે.",
+'editinguser' => "સભà«àª¯ '''[[User:$1|$1]]''' ના વપરાશકરà«àª¤àª¾ અધિકારો બદલો $2",
'userrights-editusergroup' => 'સભà«àª¯ સમà«àª¹à«‹ સંપાદીત કરો',
'saveusergroups' => 'સભà«àª¯ સમà«àª¹à«‹ સાચવો',
'userrights-groupsmember' => 'સભà«àª¯àªªàª¦:',
@@ -1416,13 +1426,13 @@ HTML નાકà«àª‚ ચકાસો',
'right-autopatrol' => 'પોતાના ફેરફારોને નીરીકà«àª·àª¿àª¤ અંકિત કરો',
'right-patrolmarks' => 'તાજા ફેરફારો અને ચોકીયાત નોંધ જà«àª“',
'right-unwatchedpages' => 'ન જોવાતા પાનાની યાદી જà«àª“',
-'right-trackback' => 'ટà«àª°à«‡àª•àª¬à«‡àª• જમા કરો',
'right-mergehistory' => 'પાનાનો ઇતિહાસ વિલિન કરો',
'right-userrights' => 'બધા સભà«àª¯à«‹àª¨àª¾ હકà«àª•à«‹àª®àª¾àª‚ ફેરફાર કરો',
'right-userrights-interwiki' => 'અનà«àª¯ વિકિ પરના સભà«àª¯à«‹àª¨àª¾ હકà«àª•à«‹ સંપાદિત કરો.',
'right-siteadmin' => 'માહિતી સંચયને ઉઘાડો અને વાસો.',
'right-override-export-depth' => 'à«« સà«àª¤àª° સà«àª§à«€ જોડાયેલ પાના સહીત પાના નિકાસ કરો',
'right-sendemail' => ' અનà«àª¯ સભà«àª¯à«‹àª¨à«‡ ઈ-મેલ મોકલો',
+'right-passwordreset' => 'પાસવરà«àª¡ રીસેટ ઇ-મેઇલà«àª¸ જà«àª“',
# User rights log
'rightslog' => 'સભà«àª¯ હકà«àª• માહિતિ પતà«àª°àª•',
@@ -1456,16 +1466,17 @@ HTML નાકà«àª‚ ચકાસો',
'action-suppressionlog' => 'આ અંગત યાદી જà«àª“',
'action-block' => 'આ સભà«àª¯ દà«àªµàª¾àª°àª¾ થનાર ફેરફાર પà«àª°àª¤àª¿àª¬àª‚ધીત કરો',
'action-protect' => 'આ પાનાંનà«àª‚ પà«àª°àª¤àª¿àª¬àª‚ધ સà«àª¤àª° બદલો',
+'action-rollback' => 'ચોકà«àª•àª¸ પાનામાં જે છેલà«àª²àª¾ સભà«àª¯àª ફેરફારો કરà«àª¯àª¾àª‚ હોય તેને àªàª¡àªªàª¥à«€ ઉલટાવો',
'action-import' => 'અનà«àª¯ વિકિ પરથી આ પાનà«àª‚ આયાત કરો',
'action-importupload' => 'ચઢાવેલી ફાઇલ પરથી આ પાનà«àª‚ આયાત કરો.',
'action-patrol' => 'અનà«àª¯à«‹ ના ફેરફારો નીરીકà«àª·à«€àª¤ અંકિત કરો',
'action-autopatrol' => 'તમે તમારા ફેરફારો નીરીકà«àª·àª¿àª¤ અંકિત કરો',
'action-unwatchedpages' => 'ન જોવાતા પાનાની યાદી જà«àª“',
-'action-trackback' => 'ટà«àª°à«‡àª•àª¬à«‡àª• જમા કરો',
'action-mergehistory' => 'પાનાનો ઇતિહાસ વિલિન કરો',
'action-userrights' => 'બધા સભà«àª¯à«‹àª¨àª¾ હકà«àª•à«‹àª®àª¾àª‚ ફેરફાર કરો',
'action-userrights-interwiki' => 'અનà«àª¯ વિકિ પરના સભà«àª¯à«‹àª¨àª¾ હકà«àª•à«‹ સંપાદિત કરો.',
'action-siteadmin' => 'માહિતી સંચયને ઉઘાડો અને વાસો.',
+'action-sendemail' => 'ઈ-મેલ મોકલો',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
@@ -1497,6 +1508,7 @@ HTML નાકà«àª‚ ચકાસો',
'number_of_watching_users_pageview' => '[$1 જોઇરહેલ {{PLURAL:$1|સભà«àª¯|સભà«àª¯à«‹}}]',
'rc_categories' => 'શà«àª°à«‡àª£à«€àª“ સà«àª§à«€ મરà«àª¯àª¾àª¦àª¿àª¤ ("|" થી જà«àª¦àª¾ પાડો)',
'rc_categories_any' => 'કોઇ પણ',
+'rc-change-size-new' => 'બદલાયા પછી $1 {{PLURAL:$1|બાઈટ|બાઈટો}}',
'newsectionsummary' => '/* $1 */ નવો વિભાગ',
'rc-enhanced-expand' => 'વિગતો બતાવો (જાવા સà«àª•à«àª°àª¿àªªà«àªŸ જરૂરી છે)',
'rc-enhanced-hide' => 'વિગતો છà«àªªàª¾àªµà«‹',
@@ -1550,6 +1562,7 @@ HTML નાકà«àª‚ ચકાસો',
'minlength1' => 'ફાઇલ નામની લંબાઇ કમ સે કમ àªàª• અકà«àª·àª° જેટલી તો હોવી જ જોઇàª.',
'illegalfilename' => 'ફાઇલનામ "$1" àªàªµàª¾ ચિનà«àª¹à«‹ ધરાવે છે જેનો પà«àª°àª¯à«‹àª— શીરà«àª·àª•à«‹àª®àª¾àª‚ વરà«àªœàª¿àª¤ છે.
કૃપયા ફાઇઅલ નà«àª‚ નામ બદલીને ફરી ચઢાવો.',
+'filename-toolong' => 'ફાઈલ નામો 240 બાઇટà«àª¸ કરતાં લાંબા હોઈ શકે નહિં.',
'badfilename' => 'ફાઇલ નામ "$1" નામે બદલાયà«àª‚ છે.',
'filetype-mime-mismatch' => 'ફાઇલ પà«àª°àª•àª¾àª° ".$1" શોધાયેલ MIME પà«àª°àª•àª¾àª°àª¨à«€ ફાઇલ ($2) સાથે મેળ ખાતો નથી.',
'filetype-badmime' => 'MIME પà«àª°àª•àª¾àª°àª¨à«€ "$1" ફાઇલ ચડાવવાની પરવાનગી નથી',
@@ -1652,6 +1665,41 @@ $1',
'upload-unknown-size' => 'અજà«àªžàª¾àª¤ કદ',
'upload-http-error' => ' HTTP તà«àª°à«àªŸàª¿ : $1',
+# File backend
+'backend-fail-stream' => 'ફાઈલ $1 ને લાવી ન શકાઈ.',
+'backend-fail-backup' => 'ફાઈલ $1 ની પà«àª°àª¤ ન સાચવી શકાઈ.',
+'backend-fail-notexists' => 'ફાઈલ $1 ઉપલબà«àª§ નથી.',
+'backend-fail-hashes' => 'ફાઈલ સરખામણી માટે હેશ ન મેળવી શકાયાં',
+'backend-fail-notsame' => '$1 પર આથી વિપરીત ફાઈલ મોજૂદ છે.',
+'backend-fail-invalidpath' => '$1 ઠવૈધ સંગà«àª°àª¹ પથ નથી.',
+'backend-fail-delete' => '"$1" ફાઇલ હટાવી ન શકાઇ.',
+'backend-fail-alreadyexists' => '$1 ફાઈલ પહેલેથી મોજà«àª¦ છે.',
+'backend-fail-store' => 'ફાઈલ $1 ને $2 પર સાચવી ન શકાઈ.',
+'backend-fail-copy' => '"$1" થી "$2"માં નકલ નિષà«àª«àª³.',
+'backend-fail-move' => '"$1" થી "$2" પર સà«àª¥àª³àª¾àª‚તર નિષà«àª«àª³.',
+'backend-fail-opentemp' => 'હંગામી ફાઇલ ન બનાવી શકાઇ',
+'backend-fail-writetemp' => 'હંગામી ફાઇલમાં લખી ન શકાયà«àª‚.',
+'backend-fail-closetemp' => 'હંગામી ફાઇલ બંધ ન કરી શકાઇ',
+'backend-fail-read' => 'ફાઈલ $1 ને વાંચી ન શકાઈ.',
+'backend-fail-create' => 'ફાઈલ $1 ને બનાવી શકાઈ.',
+'backend-fail-readonly' => 'સંગà«àª°àª¹ પારà«àª¶à«àªµàª­à«‚મિ "$1" ઠહાલમાં માતà«àª° વાંચન સકà«àª·àª® છે. તેનà«àª‚ કારણ આપવામાં આવà«àª¯à«àª‚ હતà«àª‚: "$2"',
+'backend-fail-synced' => 'ફાઈલ "$1" અંતરિક સà«àªŸà«‹àª°à«‡àªœ બેકàªàª‚ડ માં àªàª• અસંગત સà«àª¥àª¿àª¤àª¿àª®àª¾àª‚ છે',
+'backend-fail-connect' => 'સંગà«àª°àª¹ પૃષà«àª àª­à«‚મિ "$1" સાથે સંપરà«àª• સà«àª¥àª¾àªªà«€ ના શકાયો.',
+'backend-fail-internal' => 'સંગà«àª°àª¹ પૃષà«àª àª­à«‚મિ "$1"માં અજà«àªžàª¾àª¤ કà«àª·àª¤àª¿ ઉદà«àª­àªµà«€.',
+'backend-fail-contenttype' => '"$1" પર ફાઇલ સનગà«àª°àªµàª¾àª¹ માટે સમાવિષà«àªŸ પà«àª°àª•àª¾àª° નકà«àª•à«€ કરી નથી શકાય',
+'backend-fail-batchsize' => '$1 ફાઈલના બેચને {{PLURAL:$1|પà«àª°àª•à«àª°àª¿àª¯àª¾|પà«àª°àª•à«àª°àª¿àª¯àª¾àª“}}ને સà«àªŸà«‹àª°à«‡àªœ બેકàªàª¨à«àª¡ અપાયà«àª‚; મરà«àª¯àª¾àª¦àª¾: $2 {{PLURAL:$2|પà«àª°àª•à«àª°àª¿àª¯àª¾|પà«àª°àª•à«àª°àª¿àª¯àª¾àª“}}.',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" નà«àª‚ તાળà«àª‚ ખોલી ન શકાયà«àª‚; તેના પર તાળà«àª‚ મરાયà«àª‚ જ નથી.',
+'lockmanager-fail-closelock' => '"$1" માટેની તાળાવાળી ફાઈલ બંધ ન કરી શકાઈ',
+'lockmanager-fail-deletelock' => '"$1" માટેની તાળાવાલી ફાઈલ હટાવી ન શકાઈ',
+'lockmanager-fail-acquirelock' => '"$1" માટે તાળà«àª‚ ન મેળવી શકાયà«àª‚.',
+'lockmanager-fail-openlock' => '"$1" માટેની તાળાવાલી ફાઈલ ઉઘાડી ન શકાઈ',
+'lockmanager-fail-releaselock' => '"$1" માટે તાળà«àª‚ ન ખોલી શકાયà«àª‚.',
+'lockmanager-fail-db-bucket' => '$1 પાતà«àª°àª®àª¾àª‚ જરૂરી માહિતી સંચનો સંપરà«àª• ન થેઈ શકà«àª¯à«‹',
+'lockmanager-fail-db-release' => '$1 માહિતીસંચ પરના તાળા ઉઘાડી ન શકાયા.',
+'lockmanager-fail-svr-release' => 'સરà«àªµàª° $1 પરના તાળા ઉઘાડે ન શકાયા.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ZIP તપાસ કરતી વખતે તà«àª°à«àªŸàª¿ નિરà«àª®àª¾àª£ થઈ',
'zip-wrong-format' => 'જણાવેલી ફાઇલ ZIP ફાઇલ નથી.',
@@ -1668,6 +1716,7 @@ $1',
'uploadstash-badtoken' => 'તે કારà«àª¯ કરવà«àª‚ નિષà«àª«àª³. કદાચ તમારા ફેરફાર હકà«àª•à«‹ કાલાતિત થયાં છે. ફરી પà«àª°àª¯àª¤à«àª¨ કરો.',
'uploadstash-errclear' => 'ફાઇલ સાફ સફાઇ અસફળ રહી',
'uploadstash-refresh' => 'અધà«àª¯àª¤àª¨ ફાઇલ યાદિ',
+'invalid-chunk-offset' => 'અમાનà«àª¯ કાપી કાઢેલો ઓફસેટ',
# img_auth script messages
'img-auth-accessdenied' => 'પà«àª°àªµà«‡àª¶ વરà«àªœà«€àª¤',
@@ -1767,7 +1816,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
# File reversion
'filerevert' => '$1 હતà«àª‚ તેવà«àª‚ કરો',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'ફાઇલ હતી તેવી કરો',
'filerevert-intro' => "તમે '''[[Media:$1|$1]]''' ફાઇલ હતી તેવી મૂળ સà«àª¥àª¿àª¤àª¿[$3, $2 વખતે હતà«àª‚ તેવà«àª‚ વરà«àªàª¨ $4]માં લઇ જઇ રહà«àª¯àª¾ છો.",
'filerevert-comment' => 'કારણ:',
@@ -1777,24 +1825,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'filerevert-badversion' => 'તમે દરà«àª¶àª¾àªµà«‡àª² સમય વખતની મૂળ ફાઇલ સà«àª¥àª¾àª¨àª¿àª• સà«àªµàª°à«àªªà«‡ પà«àª°àª¾àªªà«àª¯ નથી.',
# File deletion
-'filedelete' => '$1ને ભૂસી નાંખો.',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'ફાઇલ ભà«àª¸à«€ નાખો.',
-'filedelete-intro' => "તમે '''[[Media:$1|$1]]'' ફાઇલ અને તેની સાથે સંલગà«àª¨ ઇતિહાસ ભà«àª‚સી રહà«àª¯àª¾ છો.",
-'filedelete-intro-old' => "તમે '''[[Media:$1|$1]]'''નà«àª‚ આ [$4 $3, $2] વરà«àªàª¨ ભà«àª¸à«€ રહà«àª¯àª¾ છો.",
-'filedelete-comment' => 'કારણ:',
-'filedelete-submit' => 'ભà«àª‚સો',
-'filedelete-success' => "'''$1'''ને ભૂંસી નાંખવામાં આવà«àª¯à«àª‚ છે.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]'''નà«àª‚ $3, $2ના રોજનà«àª‚ સંસà«àª•àª°àª£ ભà«àª‚સી નાખà«àª¯à«àª‚ છે.",
-'filedelete-nofile' => "'''$1'''નà«àª‚ અસà«àª¤àª¿àª¤à«àªµ નથી.",
-'filedelete-nofile-old' => "'''$1'''નà«àª‚ આપે જણાવેલ ખાસિયતવાળà«àª‚ સંગà«àª°àª¹àª¿àª¤ સંસà«àª•àª°àª£ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નથી.",
-'filedelete-otherreason' => 'અનà«àª¯/વધારાનà«àª‚ કારણ:',
-'filedelete-reason-otherlist' => 'બીજà«àª‚ કારણ',
-'filedelete-reason-dropdown' => '* હટાવવાનાં સામાનà«àª¯ કારણો
+'filedelete' => '$1ને ભૂસી નાંખો.',
+'filedelete-legend' => 'ફાઇલ ભà«àª¸à«€ નાખો.',
+'filedelete-intro' => "તમે '''[[Media:$1|$1]]'' ફાઇલ અને તેની સાથે સંલગà«àª¨ ઇતિહાસ ભà«àª‚સી રહà«àª¯àª¾ છો.",
+'filedelete-intro-old' => "તમે '''[[Media:$1|$1]]'''નà«àª‚ આ [$4 $3, $2] વરà«àªàª¨ ભà«àª¸à«€ રહà«àª¯àª¾ છો.",
+'filedelete-comment' => 'કારણ:',
+'filedelete-submit' => 'ભà«àª‚સો',
+'filedelete-success' => "'''$1'''ને ભૂંસી નાંખવામાં આવà«àª¯à«àª‚ છે.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]'''નà«àª‚ $3, $2ના રોજનà«àª‚ સંસà«àª•àª°àª£ ભà«àª‚સી નાખà«àª¯à«àª‚ છે.",
+'filedelete-nofile' => "'''$1'''નà«àª‚ અસà«àª¤àª¿àª¤à«àªµ નથી.",
+'filedelete-nofile-old' => "'''$1'''નà«àª‚ આપે જણાવેલ ખાસિયતવાળà«àª‚ સંગà«àª°àª¹àª¿àª¤ સંસà«àª•àª°àª£ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નથી.",
+'filedelete-otherreason' => 'અનà«àª¯/વધારાનà«àª‚ કારણ:',
+'filedelete-reason-otherlist' => 'બીજà«àª‚ કારણ',
+'filedelete-reason-dropdown' => '* હટાવવાનાં સામાનà«àª¯ કારણો
** પà«àª°àª•àª¾àª¶àª¨àª¾àª§àª¿àª•àª¾àª° ભંગ
** ડà«àªªà«àª²à«€àª•à«‡àªŸ ફાઇલ',
-'filedelete-edit-reasonlist' => 'ભૂંસવાનà«àª‚ કારણ બદલો.',
-'filedelete-maintenance' => 'સાર સંભાળ કારà«àª¯ જારી હોઇ ફાઇલો નà«àª‚ હટાવવà«àª‚ અને પà«àª¨àªƒ સà«àª¥àª¾àªªàª¨ થોડા સમય માટે બંધ છે',
+'filedelete-edit-reasonlist' => 'ભૂંસવાનà«àª‚ કારણ બદલો.',
+'filedelete-maintenance' => 'સાર સંભાળ કારà«àª¯ જારી હોઇ ફાઇલો નà«àª‚ હટાવવà«àª‚ અને પà«àª¨àªƒ સà«àª¥àª¾àªªàª¨ થોડા સમય માટે બંધ છે',
+'filedelete-maintenance-title' => 'ફાઈલ કાઢી શકતા નથી',
# MIME search
'mimesearch' => 'MIME શોધ',
@@ -1893,6 +1941,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'wantedpages' => 'ઇચà«àª›àª¿àª¤ પાનાં',
'wantedpages-badtitle' => 'પરિણામ ગણમાં અવૈધ શીરà«àª·àª•: $1',
'wantedfiles' => 'ઇચà«àª›àª¿àª¤ ફાઈલો',
+'wantedfiletext-cat' => 'નીચેની ફાઈલ વપરાઈ છે પણ તે વિહરમન નથી. ફાઈલ અહીં હોવા તેવી ફાઈલોને પણ પરદેશી રીપોસીટરીમાંથી ફાઈલો યાદીમાં જોઈ શકાય છે. આવા પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹àª¨à«‡ <del>struck out</del> કાઢી નાખવામાં આવશે.વધારામાં, અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નહોય તેવી ફાઈલધરાવતાં પાનાની યાદી [[:$1]].',
+'wantedfiletext-nocat' => 'નીચેની ફાઈલ વપરાઈ છે પણ તે અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નથી. ફાઈલ અહીં હોવા તેવી ફાઈલોને પણ પરદેશી રીપોસીટરીમાંથી ફાઈલો યાદીમાં જોઈ શકાય છે. આવા પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹àª¨à«‡ <del>struck out</del> કાઢી નાખવામાં આવશે.',
'wantedtemplates' => 'જોઈતા ઢાંચા',
'mostlinked' => 'સૌથી વધૠકડીઓ દà«àªµàª¾àª°àª¾ જોડાયેલ પાનà«àª‚',
'mostlinkedcategories' => 'સૌથી વધૠશà«àª°à«‡àª£à«€àª“ દà«àªµàª¾àª°àª¾ જોડાયેલ પાનà«àª‚',
@@ -1901,6 +1951,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'mostimages' => 'સૌથી વધૠકડીઓ દà«àªµàª¾àª°àª¾ જોડાયેલી ફાઇલ',
'mostrevisions' => 'સૌથી વધૠફેરફાર થયેલા પાનાં',
'prefixindex' => 'પૂરà«àªµàª¾àª•à«àª·àª° સૂચિ',
+'prefixindex-namespace' => 'શરૂઆતમાં ($1 namespace) ધરાવતા પાનાં',
'shortpages' => 'નાનાં પાનાં',
'longpages' => 'લાંબા પાનાઓ',
'deadendpages' => 'લેખ સમાપà«àª¤àª¿ પાના',
@@ -1917,7 +1968,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'listusers-editsonly' => 'માતà«àª° સંપાદન કરનારા સભà«àª¯à«‹ બતાવો',
'listusers-creationsort' => 'તારીખ અનà«àª¸àª¾àª° ગોઠવો',
'usereditcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
-'usercreated' => '$1 તારીખે $2 વાગà«àª¯à«‡ નિરà«àª®àª¿àª¤',
+'usercreated' => '$1 તારીખે $2 વાગà«àª¯à«‡ {{GENDER:$3|બનાવà«àª¯à«àª‚}}',
'newpages' => 'નવા પાના',
'newpages-username' => 'સભà«àª¯ નામ:',
'ancientpages' => 'સૌથી જૂનાં પાના',
@@ -2012,12 +2063,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'activeusers-noresult' => 'કોઇ સકà«àª°à«€àª¯ સભà«àª¯ ન મળà«àª¯à«‹',
# Special:Log/newusers
-'newuserlogpage' => 'નવા બનેલા સભà«àª¯à«‹àª¨à«‹ લૉગ',
-'newuserlogpagetext' => 'આ સભà«àª¯à«‹àª¨à«€ રચનાનો લોગ છે.',
-'newuserlog-byemail' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ ઇ-મેલ દà«àªµàª¾àª°àª¾ મોકલાઇ છે.',
-'newuserlog-create-entry' => 'નવà«àª‚ ખાતà«àª‚',
-'newuserlog-create2-entry' => 'નવà«àª‚ ખાતà«àª‚ $1 ખોલાયà«àª‚',
-'newuserlog-autocreate-entry' => 'સà«àªµàª¯àª‚ચલિત રીતે ખà«àª²à«‡àª²àª¾ ખાતાં',
+'newuserlogpage' => 'નવા બનેલા સભà«àª¯à«‹àª¨à«‹ લૉગ',
+'newuserlogpagetext' => 'આ સભà«àª¯à«‹àª¨à«€ રચનાનો લોગ છે.',
# Special:ListGroupRights
'listgrouprights' => 'સભà«àª¯ જૂથ ના હકà«àª•à«‹',
@@ -2046,7 +2093,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'emailpagetext' => 'તમે નીચે દરà«àª¶àª¾àªµà«‡àª² ફોરà«àª® વાપરી ઇ-મેલ મોકલી શકો છો.
તમે તમારી માહિતીમાં [[Special:Preferences|your user preferences]] જે ઇ-મેલ લખà«àª¯à«‹ હશે તે દà«àªµàª¾àª°àª¾ ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.',
'usermailererror' => 'મેલ વસà«àª¤à« પાઠવવામાં તà«àª°à«àªŸàª¿',
-'defemailsubject' => '{{SITENAME}} ઈ-મેલ',
+'defemailsubject' => '{{SITENAME}} સભà«àª¯ $1 તરફથી ઈ-મેલ',
'usermaildisabled' => 'સભà«àª¯àª¨à«‹ ઈ-મેલ નિષà«àª•à«àª°àª¿àª¯ કરાયો',
'usermaildisabledtext' => 'તમે આ વિકિ પર અનà«àª¯ સભà«àª¯à«‹àª¨à«‡ ઇ-મેલ મોકલી ન શકો',
'noemailtitle' => 'ઈ-મેલ àªàª¡à«àª°à«‡àª¸ નથી',
@@ -2100,7 +2147,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'watchmethod-list' => 'હાલમાં થયેલ ફેરફાર માટે નીરીકà«àª·à«€àª¤ પાના તપાસાય છે',
'watchlistcontains' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમાં $1 {{PLURAL:$1|પાનà«àª‚|પાનાં}} છે.',
'iteminvalidname' => "વસà«àª¤à« '$1' સાથે ગડબડ, અવૈધ નામ...",
-'wlnote' => "છેલà«àª²àª¾àª‚ {{PLURAL:$2|કલાક|'''$2''' કલાકો}} માં થયેલા {{PLURAL:$1|ફેરફાર| '''$1''' ફેરફારો }} .",
+'wlnote' => "નીચે $3, $4 વાગà«àª¯àª¾ સà«àª§à«€àª¨àª¾ છેલà«àª²àª¾ {{PLURAL:$2|àªàª• કલાક|'''$2''' કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|'''$1''' ફેરફારો }} દરà«àª¶àª¾àªµà«àª¯àª¾ છે.",
'wlshowlast' => 'છેલà«àª²àª¾ $1 કલાક $2 દિવસ $3 બતાવો',
'watchlist-options' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિના વિકલà«àªªà«‹',
@@ -2163,8 +2210,6 @@ $UNWATCHURL
'actionfailed' => 'કારà«àª¯ અસફળ',
'deletedtext' => '"$1" દૂર કરવામાં આવà«àª¯à«àª‚ છે.
તાજેતરમાં દૂર કરેલા લેખોની વિગત માટે $2 જà«àª“.',
-'deletedarticle' => 'હટાવવામાં આવેલા "[[$1]]"',
-'suppressedarticle' => 'છà«àªªàª¾àªµà«‡àª²àª¾ "[[$1]]"',
'dellogpage' => 'હટાવેલાઓનà«àª‚ માહિતિ પતà«àª°àª• (ડિલિશન લૉગ)',
'dellogpagetext' => 'હાલમાં હટાવેલ પાનાની યાદિ',
'deletionlog' => 'હટાવેલાઓનà«àª‚ માહિતિ પતà«àª°àª• (ડિલિશન લૉગ)',
@@ -2218,7 +2263,10 @@ Deleting it may disrupt database operations of {{SITENAME}};',
'unprotectedarticle' => '"[[$1]]" થી સà«àª°àª•à«àª·àª¾ હટાવી દીધી',
'movedarticleprotection' => '"[[$2]]" થી "[[$1]]"માં સંરકà«àª·àª£ વિકલà«àªª ખસેડà«àª¯àª¾àª‚.',
'protect-title' => '"$1"નà«àª‚ સà«àª°àª•à«àª·àª¾àª¸à«àª¤àª° બદલો',
+'protect-title-notallowed' => '"$1" નà«àª‚ સà«àª°àª•à«àª·àª¾àª¸à«àª¤àª° જોવો',
'prot_1movedto2' => '[[$1]]નà«àª‚ નામ બદલીને [[$2]] કરવામાં આવà«àª¯à«àª‚ છે.',
+'protect-badnamespace-title' => 'સંરકà«àª·àª¿àª¤ ન કરી શકાતà«àª‚ નામસà«àª¥àª³',
+'protect-badnamespace-text' => 'આ નામસà«àª¥àª³àª®àª¾àª‚ પાના સà«àª°àª•à«àª·àª¿àª¤ કરી શકાતા નથી.',
'protect-legend' => 'સંરકà«àª·àª£ બહાલી આપો',
'protectcomment' => 'કારણ:',
'protectexpiry' => 'સમાપà«àª¤àª¿:',
@@ -2241,6 +2289,7 @@ Deleting it may disrupt database operations of {{SITENAME}};',
'protect-level-sysop' => 'માતà«àª° પà«àª°àª¬àª‚ધકો',
'protect-summary-cascade' => 'ધોધાકાર',
'protect-expiring' => '$1 (UTC) ઠસમાપà«àª¤ થાય છે',
+'protect-expiring-local' => '$1ના નિવૃતà«àª¤ થશે',
'protect-expiry-indefinite' => 'અનિશà«àªšàª¿àª¤',
'protect-cascade' => 'આ પાનામાં સમાવિષà«àªŸ પેટા પાનાં પણ સà«àª°àª•à«àª·àª¿àª¤ કરો (કૅસà«àª•à«‡àª¡à«€àª‚ગ સà«àª°àª•à«àª·àª¾)',
'protect-cantedit' => 'આપ આ પાનાનાં સà«àª°àª•à«àª·àª¾ સà«àª¤àª°àª®àª¾àª‚ ફેરફાર ના કરી શકો, કેમકે આપને અહિં ફેરફાર કરવાની પરવાનગી નથી.',
@@ -2301,7 +2350,6 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'undeletereset' => 'ફરી ગોઠવો',
'undeleteinvert' => 'પસંદગી ઉલટાવો',
'undeletecomment' => 'કારણ:',
-'undeletedarticle' => '"[[$1]]" પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ કરà«àª¯à«àª‚',
'undeletedrevisions' => '{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પà«àª¨ સà«àª¥àª¾àªªàª¿àª¤ કરાયા',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤',
'undeletedfiles' => '{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤',
@@ -2311,6 +2359,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
તાજેતરમાં હટાવેલા કે પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ થયેલા ફેરફારની નોંધ નો સંદરà«àª­ અહીં ઉપà«àª²àª¬à«àª§ [[Special:Log/delete|deletion log]].",
'undelete-header' => 'હાલમાં હટાવેલ પાનાનો [[Special:Log/delete|the deletion log]] જà«àª“',
+'undelete-search-title' => 'હટાવેલા પાનાની શોધ',
'undelete-search-box' => 'હટાવેલા પાનાની શોધ',
'undelete-search-prefix' => 'આનાથી શરૂ થતા પાના બતાવો.',
'undelete-search-submit' => 'શોધો',
@@ -2320,6 +2369,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'undelete-cleanup-error' => 'વણ વપરાયેલી પà«àª°àª¾àªšà«€àª¨ ફાઇલને ભૂંસવામાં તà«àª°à«àªŸàª¿ "$1".',
'undelete-missing-filearchive' => 'ફાઇલ સંગà«àª°àª¹ ID $1 પà«àª¨àªƒ સà«àª¥àª¾àªªàª¿àª¤ ન કરી શકાયà«àª‚ કેમકે તે માહિતી સંચમાં મોજà«àª¦ નથી.
તે પહેલેથી પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ કરાયà«àª‚ હશે.',
+'undelete-error' => 'પાનà«àª‚ પà«àª¨àªƒ મેળવવામાં નિષà«àª«àª³àª¤àª¾.',
'undelete-error-short' => 'આ ફાઇલ પà«àª¨àª°à«àªœà«€àªµà«€àª¤ કરવામાં તકલીફ : $1',
'undelete-error-long' => '$1 આ ફાઈલ ભૂંસતી વખતે ચૂક થઈ',
'undelete-show-file-confirm' => 'શà«àª‚ તમને ખાતà«àª°à«€ છે કેતમે $2 તારીખ $3 વાગà«àª¯àª¾ સà«àª§à«€àª¨àª¾ "<nowiki>$1</nowiki>" ફાઇલ ના ફેરફાર જોવા માંગો છો?',
@@ -2440,6 +2490,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'blocklist-userblocks' => 'àªàª•àª¾àª‰àª¨à«àªŸ બà«àª²à«‹àª•à«‹ છà«àªªàª¾àªµà«‹',
'blocklist-tempblocks' => 'કામચલાઉ બà«àª²à«‹àª•à«‹ છà«àªªàª¾àªµà«‹',
'blocklist-addressblocks' => 'àªàª• આઇપી બà«àª²à«‹àª•à«‹ છà«àªªàª¾àªµà«‹',
+'blocklist-rangeblocks' => 'શà«àª°à«‡àª£à«€ બà«àª²à«‹àª•à«‹ છà«àªªàª¾àªµà«‹',
'blocklist-timestamp' => 'સમયછાપ',
'blocklist-target' => 'લકà«àª·à«àª¯',
'blocklist-expiry' => 'સમાપà«àª¤àª¿',
@@ -2462,6 +2513,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'unblocklink' => 'પà«àª°àª¤àª¿àª¬àª‚ધ હટાવો',
'change-blocklink' => 'પà«àª°àª¤àª¿àª¬àª‚ધમાં ફેરફાર કરો',
'contribslink' => 'યોગદાન',
+'emaillink' => 'ઈ-મેલ મોકલો',
'autoblocker' => 'તમારા પર સà«àªµàª¯àª‚ચાલિત રીતે રોક લગાવાઇ છે કેમકે તમારો IP હાલમાં "[[User:$1|$1]]" સભà«àª¯ દà«àªµàª¾àª°àª¾ વપરાયો છે.
તેનà«àª‚ કારણ આ છે : "$2"',
'blocklogpage' => 'પà«àª°àª¤àª¿àª¬àª‚ધ સૂચિ',
@@ -2593,9 +2645,6 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'movepage-page-moved' => 'પાના $1 ને $2 પર ખસેડાયà«àª‚',
'movepage-page-unmoved' => 'પાના $1ને $2 પર ન લઈ જઈ શકાયà«àª‚',
'movepage-max-pages' => 'મહતà«àª¤àª® àªàªµàª¾ $1 {{PLURAL:$1|પાનà«àª‚|પાનાઓ}} કાઢી નખાયા છે. સà«àªµàª¯àª‚ચાલિત રીત આનાથી વધૠપાના કાઢી શકાશે નહીં.',
-'1movedto2' => '[[$1]] નà«àª‚ નામ બદલી ને [[$2]] કરવામાં આવà«àª¯à«àª‚ છે.',
-'1movedto2_redir' => 'નામ બદલતા [[$1]] ને [[$2]] બનાવà«àª¯à«àª‚',
-'move-redirect-suppressed' => 'દિશા નિરà«àª¦à«‡àª¶àª¨à«‹ છà«àªªàª¾àª¡àª¾àª¯àª¾',
'movelogpage' => 'નામ ફેર માહિતિ પતà«àª°àª•',
'movelogpagetext' => 'બધા હટાવેલ પાનાની માહિતી',
'movesubpage' => '{{PLURAL:$1|ઉપપાનà«àª‚|ઉપપાના}}',
@@ -2608,7 +2657,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
લકà«àª·à«àª¯ પાનà«àª‚ "[[:$1]]" પહેલેથી અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ છે.
શà«àª‚ તમે આને હટાવીને સà«àª¥àª³àª¾àª‚તર કરવાનો મારà«àª— મોકળો કરવા માંગો છો?',
'delete_and_move_confirm' => 'હા, આ પાનà«àª‚ હટાવો',
-'delete_and_move_reason' => 'હટાવવાનà«àª‚ કામ આગળ વધાવવા ભૂંસી દેવાયà«',
+'delete_and_move_reason' => 'હટાવવાનà«àª‚ કામ આગળ વધાવવા ભૂંસી દેવાયૠ"[[$1]]"',
'selfmove' => 'સà«àª¤à«àª°à«‹àª¤ ને લકà«àª·à«àª¯ શીરà«àª·àª•à«‹ સમાન છે.
પાના ને તેવા જ નામ ધરાવતા પાના પર પà«àª¨àªƒ સà«àª¥àª¾àªªàª¨ નહીં કરી શકાય.',
'immobile-source-namespace' => '"$1" નામાસà«àª¥àª³àª®àª¾àª‚ પાના ન ખસેડી શાકાયા',
@@ -2639,9 +2688,11 @@ To perform a selective restoration, check the boxes corresponding to the revisio
પાનાની નિકાસ કરવા, નીચેના ચોકઠામાં તેના શીરà«àª·àª•à«‹ લખો, àªàª• લિટીમાં àªàª• શીરà«àª·àª•, અનેપસંદ કરો કે તમારે પà«àª°àª¾àªšà«€àª¨ ફેરફારો સાથે ઇતિહાસના પાના સાથે નવા ફેરફારો અને હાલના ફેરફારની માહિતી લઇ જવી છે.
પાછળના વિકલà«àªª પસંદ કરવા તમે આ કડી વાપરી શકો [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] આ પાના માટે "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'બધાં પાનાઓ નિકાસ કરો/પાના અનà«àª¯àª¤à«àª° મોકલો',
'exportcuronly' => 'માતà«àª° હાલના ફેરફારો જà«àª“ , પૂરà«àª£ ઇતિહાસ નહી.',
'exportnohistory' => "----
'''નોંધ:''' કારà«àª¯àª•à«àª·àª®àª¤àª¾àª¨à«‡ લાગતા કારણોને લીધે આ રૂપમાં ઇતિહાસ પાનાની નિકાસ ને નિષà«àª•à«àª°à«€àª¯ કરાઇ છે.",
+'exportlistauthors' => 'દરેક પાના માટે ફાળો આપનાર સભà«àª¯à«‹ ની યાદી પà«àª°à«àª£ કરો',
'export-submit' => 'નિકાસ',
'export-addcattext' => 'આ શà«àª°à«‡àª£à«€àª®àª¾àª‚થી પાના ઉમેરો',
'export-addcat' => 'ઉમેરો',
@@ -2674,6 +2725,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'thumbnail_error' => 'નાની છબી (થંબનેઇલ-thumbnail) બનાવવામાં તà«àª°à«àªŸàª¿: $1',
'djvu_page_error' => 'DjVu પાનà«àª‚ સીમાની બહાર',
'djvu_no_xml' => 'DjVu ફાઇલ માટે XML લાવવા અસમરà«àª¥',
+'thumbnail-temp-create' => 'હંગામી થમà«àª¬àª¨à«‡àª² ફાઈલ ન બનાવી શકાઈ',
+'thumbnail-dest-create' => 'થમà«àª¬àª¨à«‡àª²àª¨à«‡ નિરà«àª§àª¾àª°àª¿àª¤ સà«àª¥àª³à«‡ સાચવી ન શકાયો',
'thumbnail_invalid_params' => 'અંગà«àª²àª¿ નિરà«àª¦à«‡àª¶àª•àª¨àª¾ નિરà«àª¦à«‡àª¶àª•à«‹ અવૈધ',
'thumbnail_dest_directory' => 'લકà«àª·à«àª¯ ડીરેકà«àªŸàª°à«€ રચવા અસમરà«àª¥',
'thumbnail_image-type' => 'ચિતà«àª°àª¨à«‹ આ પà«àª°àª•àª¾àª° અમાનà«àª¯',
@@ -2722,6 +2775,11 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'import-token-mismatch' => 'સતà«àª° સમાપà«àª¤
ફરી પà«àª°àª¯àª¤à«àª¨ કરો',
'import-invalid-interwiki' => 'દરà«àª¶àª¾àªµà«‡àª² વિકિ પરથી આયાત નહીં કરી શકાય',
+'import-error-edit' => 'પાનà«àª‚ "$1" આયાત ન કરી શકાયà«àª‚ કેમકે તેને સંપાદિત કરવાનો હકà«àª• તમને પà«àª°àª¾àªªàª¤ નથી.',
+'import-error-create' => 'પાનà«àª‚ "$1" આયાત ન કરી શકાયà«àª‚ કેમકે તેને બનાવવાના હકà«àª• તમને પà«àª°àª¾àªªàª¤ નથી.',
+'import-error-interwiki' => '"$1" પાનà«àª‚ અહીં આયાત કરી ન શકાયà«àª‚ કેમકે તે નામ બાહà«àª¯ કડીઓ (interwiki) માટે આરકà«àª·à«€àª¤ છે',
+'import-error-special' => 'પાનà«àª‚ "$1" આયાત કરી શકાયà«àª‚ નહીં કેમકે તે ખાસ નામસà«àª¥àª³àª¨à«‹ ભાગ જે અનà«àª¯ પાના ની રજા આપનો નથી.',
+'import-error-invalid' => '"$1" આ પાનà«àª®à« આયાત ન થયà«àª‚ કેમકે નામ અવૈધ છે.',
# Import log
'importlogpage' => 'આયાત માહિતિ પતà«àª°àª•',
@@ -2731,73 +2789,86 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'import-logentry-interwiki' => 'આંતરવિકિ $1',
'import-logentry-interwiki-detail' => '$2 થી $1 {{PLURAL:$1|પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨|પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹}}',
+# JavaScriptTest
+'javascripttest' => 'જાવા સà«àª•à«àª°à«€àªªà«àªŸ પરીકà«àª·àª£',
+'javascripttest-disabled' => 'આ સૂતà«àª° (ફંકશન) નિષà«àª•à«àª°à«€àª¯ કરાયો',
+'javascripttest-title' => '$1 પરીકà«àª·àª£ જારી',
+'javascripttest-pagetext-noframework' => 'આ પાનà«àª‚ જાવા સà«àª•à«àª°à«€àªªà«àªŸ ચલાવવા આરકà«àª·àª¿àª¤ છે.',
+'javascripttest-pagetext-unknownframework' => 'અજાણ ચકાસણી ફà«àª°à«‡àª®àªµàª°à«àª• "$1".',
+'javascripttest-pagetext-frameworks' => 'નીચેનામાંથી કોઈ àªàª• ચકાસણી ફà«àª°à«‡àª®àªµàª°à«àª• પસંદ કરો : $1',
+'javascripttest-pagetext-skins' => 'ચકાસણી કરવા માટેની સà«àª•à«€àª¨ પસંદ કરો',
+'javascripttest-qunit-intro' => 'mediawiki.org પર [$1 testing documentation] તપાસ માહિતી જà«àª“',
+'javascripttest-qunit-heading' => 'મિડિયા વિકી જાવા સà«àª•à«àª°à«€àªªà«àªŸ QUnit test suite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => "તમારૂં પાનà«àª‚ (તમારૂં 'મારા વિષે')",
-'tooltip-pt-anonuserpage' => 'IP સરનામà«àª‚ માટેના સભà«àª¯ પાનામાં તમે ફેરફાર કરી રહà«àª¯àª¾àª‚ છો.',
-'tooltip-pt-mytalk' => 'તમારૂં ચરà«àªšàª¾àª¨à«àª‚ પાનà«àª‚',
-'tooltip-pt-anontalk' => 'આ IP સરનામા દà«àªµàª¾àª°àª¾ થયેલ ફેરફારની ચરà«àªšàª¾',
-'tooltip-pt-preferences' => 'મારી પસંદ',
-'tooltip-pt-watchlist' => 'તમે દેખરેખ રાખી રહà«àª¯àª¾àª‚ હોવ તેવા પાનાઓની યાદી',
-'tooltip-pt-mycontris' => 'તમારા યોગદાનની યાદી',
-'tooltip-pt-login' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશà«àª¯àª• નથી',
-'tooltip-pt-anonlogin' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશà«àª¯àª• નથી',
-'tooltip-pt-logout' => 'બહાર નીકળો/લૉગ આઉટ કરો',
-'tooltip-ca-talk' => 'અનà«àª•à«àª°àª®àª£àª¿àª•àª¾àª¨àª¾àª‚ પાના વિષે ચરà«àªšàª¾',
-'tooltip-ca-edit' => "આપ આ પાનામાં ફેરફાર કરી શકો છો, કારà«àª¯ સà«àª°àª•à«àª·àª¿àª¤ કરતાં પહેલાં 'àªàª²àª•' બટન ઉપર કà«àª²àª¿àª• કરીને જોઇ લેશો",
-'tooltip-ca-addsection' => 'ચરà«àªšàª¾àª¨à«‹ નવો મà«àª¦à«àª¦à«‹ ઉમેરો.',
-'tooltip-ca-viewsource' => 'આ પાનૠસંરકà«àª·àª¿àª¤ છે, તમે તેનો સà«àª¤à«àª°à«‹àª¤ જોઇ શકો છો',
-'tooltip-ca-history' => 'આ પાનાનાં અગાઉનાં ફેરફારો',
-'tooltip-ca-protect' => 'આ પાનà«àª‚ સà«àª°àª•à«àª·àª¿àª¤ કરો',
-'tooltip-ca-unprotect' => 'આ પાનà«àª‚ રકà«àª·àª£ બદલો',
-'tooltip-ca-delete' => 'આ પાનà«àª‚ હટાવો',
-'tooltip-ca-undelete' => 'આ પાનà«àª‚ હટાવાયà«àª‚ તે પહેલાના ફેરફારો હટાવો.',
-'tooltip-ca-move' => 'આ પાનà«àª‚ ખસેડો',
-'tooltip-ca-watch' => 'આ પાનà«àª‚ તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમા ઉમેરો',
-'tooltip-ca-unwatch' => 'આ પાનà«àª‚ તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમાથી કાઢી નાખો',
-'tooltip-search' => '{{SITENAME}} શોધો',
-'tooltip-search-go' => 'આ ચોકà«àª•àª¸ જોડણી વાળૠપાનૠજો અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ હોય તો તેના પર જાવ',
-'tooltip-search-fulltext' => 'આ લખાણ વાળા પાનાઓ શોધો',
-'tooltip-p-logo' => 'મà«àª–પૃષà«àª ',
-'tooltip-n-mainpage' => 'મà«àª–પૃષà«àª  પર જાઓ',
-'tooltip-n-mainpage-description' => 'મà«àª–à«àª¯ પાના પર જાઓ',
-'tooltip-n-portal' => 'પરિયોજના વિષે, આપ શà«àª‚ કરી શકો અને વસà«àª¤à«àª“ કà«àª¯àª¾àª‚ શોધશો',
-'tooltip-n-currentevents' => 'પà«àª°àª¸à«àª¤à«àª¤ ઘટનાની પૃષà«àª àª­à«‚મિની માહિતિ શોધો',
-'tooltip-n-recentchanges' => 'વિકિમાં હાલમા થયેલા ફેરફારોની સૂચિ.',
-'tooltip-n-randompage' => 'કોઇ પણ àªàª• લેખ બતાવો',
-'tooltip-n-help' => 'શોધવા માટેની જગà«àª¯àª¾.',
-'tooltip-t-whatlinkshere' => 'અહીં જોડાતા બધાં વિકિ પાનાઓની યાદી',
-'tooltip-t-recentchangeslinked' => 'આ પાના પરની કડીઓ વાળા લેખોમાં તાજેતરમાં થયેલા ફેરફારો',
-'tooltip-feed-rss' => 'આ પાના માટે આર.àªàª¸.àªàª¸. ફીડ',
-'tooltip-feed-atom' => 'આ પાના માટે àªàªŸà«‹àª® ફીડ',
-'tooltip-t-contributions' => 'આ સભà«àª¯àª¨àª¾àª‚ યોગદાનોની યાદી જà«àª“',
-'tooltip-t-emailuser' => 'આ સભà«àª¯àª¨à«‡ ઇ-મેલ મોકલો',
-'tooltip-t-upload' => 'ફાઇલ ચડાવો',
-'tooltip-t-specialpages' => 'બધા ખાસ પાનાઓની સૂચિ',
-'tooltip-t-print' => 'આ પાનાની છાપવા માટેની આવૃતà«àª¤àª¿',
-'tooltip-t-permalink' => 'પાનાનાં આ પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àª¨à«€ સà«àª¥àª¾àª¯à«€ કડી',
-'tooltip-ca-nstab-main' => 'સૂચિ વાળà«àª‚ પાનૠજà«àª“',
-'tooltip-ca-nstab-user' => 'સભà«àª¯àª¨à«àª‚ પાનà«àª‚ જà«àª“',
-'tooltip-ca-nstab-media' => 'મિડિયાનà«àª‚ પાનà«àª‚ જà«àª“',
-'tooltip-ca-nstab-special' => 'આ ખાસ પાનà«àª‚ છે, તમે તેમાં ફેરફાર ના કરી શકો',
-'tooltip-ca-nstab-project' => 'પરિયોજનાનà«àª‚ પાનà«àª‚',
-'tooltip-ca-nstab-image' => 'ફાઇલ વિષેનà«àª‚ પાનà«àª‚ જà«àª“',
-'tooltip-ca-nstab-mediawiki' => 'તંતà«àª° સંદેશ જà«àª“',
-'tooltip-ca-nstab-template' => 'ઢાંચો જà«àª“',
-'tooltip-ca-nstab-help' => 'મદદનà«àª‚ પાનà«àª‚ જà«àª“',
-'tooltip-ca-nstab-category' => 'શà«àª°à«‡àª£à«€àª“નà«àª‚ પાનà«àª‚ જà«àª“',
-'tooltip-minoredit' => 'આને નાનો ફેરફાર ગણો',
-'tooltip-save' => 'તમે કરેલાં ફેરફારો સà«àª°àª•à«àª·àª¿àª¤ કરો',
-'tooltip-preview' => 'તમે કરેલાં ફેરફારો જોવા મળશે, કૃપા કરી કારà«àª¯ સà«àª°àª•à«àª·àª¿àª¤ કરતાં પહેલા આ જોઇ લો',
-'tooltip-diff' => 'તમે માહિતિમાં કયા ફેરફારો કરà«àª¯àª¾ છે તે જોવા મળશે',
-'tooltip-compareselectedversions' => 'અ પાનાનાં પસંદ કરેલા બે વૃતà«àª¤àª¾àª‚ત વચà«àªšà«‡àª¨àª¾àª‚ ભેદ જà«àª“.',
-'tooltip-watch' => 'આ પાનાને તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ઉમેરો',
-'tooltip-recreate' => 'આપાનà«àª‚ ફરીથી રચો ભલેને તે પહેલાં ભૂસાડી દેવાયà«àª‚ હોય',
-'tooltip-upload' => 'ફાઇલ ચડાવવાનà«àª‚ શરૂ કરો',
-'tooltip-rollback' => '"પાછà«àª‚ વાળો" àªàª• જ કà«àª²àª¿àª•àª®àª¾àª‚ આ પાનામાં છેલà«àª²àª¾ સભà«àª¯àª કરેલા બધા ફેરફારો પાછા વાળશે',
-'tooltip-undo' => '"રદ કરો" આ ફેરફારને પાછો વાળશે અને ફેરફાર પછીનà«àª‚ પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨ ફોરà«àª® નવા પાના તરીકે ખà«àª²àª¶à«‡.
+'tooltip-pt-userpage' => "તમારૂં પાનà«àª‚ (તમારૂં 'મારા વિષે')",
+'tooltip-pt-anonuserpage' => 'IP સરનામà«àª‚ માટેના સભà«àª¯ પાનામાં તમે ફેરફાર કરી રહà«àª¯àª¾àª‚ છો.',
+'tooltip-pt-mytalk' => 'તમારૂં ચરà«àªšàª¾àª¨à«àª‚ પાનà«àª‚',
+'tooltip-pt-anontalk' => 'આ IP સરનામા દà«àªµàª¾àª°àª¾ થયેલ ફેરફારની ચરà«àªšàª¾',
+'tooltip-pt-preferences' => 'મારી પસંદ',
+'tooltip-pt-watchlist' => 'તમે દેખરેખ રાખી રહà«àª¯àª¾àª‚ હોવ તેવા પાનાઓની યાદી',
+'tooltip-pt-mycontris' => 'તમારા યોગદાનની યાદી',
+'tooltip-pt-login' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશà«àª¯àª• નથી',
+'tooltip-pt-anonlogin' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશà«àª¯àª• નથી',
+'tooltip-pt-logout' => 'બહાર નીકળો/લૉગ આઉટ કરો',
+'tooltip-ca-talk' => 'અનà«àª•à«àª°àª®àª£àª¿àª•àª¾àª¨àª¾àª‚ પાના વિષે ચરà«àªšàª¾',
+'tooltip-ca-edit' => "આપ આ પાનામાં ફેરફાર કરી શકો છો, કારà«àª¯ સà«àª°àª•à«àª·àª¿àª¤ કરતાં પહેલાં 'àªàª²àª•' બટન ઉપર કà«àª²àª¿àª• કરીને જોઇ લેશો",
+'tooltip-ca-addsection' => 'ચરà«àªšàª¾àª¨à«‹ નવો મà«àª¦à«àª¦à«‹ ઉમેરો.',
+'tooltip-ca-viewsource' => 'આ પાનૠસંરકà«àª·àª¿àª¤ છે, તમે તેનો સà«àª¤à«àª°à«‹àª¤ જોઇ શકો છો',
+'tooltip-ca-history' => 'આ પાનાનાં અગાઉનાં ફેરફારો',
+'tooltip-ca-protect' => 'આ પાનà«àª‚ સà«àª°àª•à«àª·àª¿àª¤ કરો',
+'tooltip-ca-unprotect' => 'આ પાનà«àª‚ રકà«àª·àª£ બદલો',
+'tooltip-ca-delete' => 'આ પાનà«àª‚ હટાવો',
+'tooltip-ca-undelete' => 'આ પાનà«àª‚ હટાવાયà«àª‚ તે પહેલાના ફેરફારો હટાવો.',
+'tooltip-ca-move' => 'આ પાનà«àª‚ ખસેડો',
+'tooltip-ca-watch' => 'આ પાનà«àª‚ તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમા ઉમેરો',
+'tooltip-ca-unwatch' => 'આ પાનà«àª‚ તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમાથી કાઢી નાખો',
+'tooltip-search' => '{{SITENAME}} શોધો',
+'tooltip-search-go' => 'આ ચોકà«àª•àª¸ જોડણી વાળૠપાનૠજો અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ હોય તો તેના પર જાવ',
+'tooltip-search-fulltext' => 'આ લખાણ વાળા પાનાઓ શોધો',
+'tooltip-p-logo' => 'મà«àª–પૃષà«àª ',
+'tooltip-n-mainpage' => 'મà«àª–પૃષà«àª  પર જાઓ',
+'tooltip-n-mainpage-description' => 'મà«àª–à«àª¯ પાના પર જાઓ',
+'tooltip-n-portal' => 'પરિયોજના વિષે, આપ શà«àª‚ કરી શકો અને વસà«àª¤à«àª“ કà«àª¯àª¾àª‚ શોધશો',
+'tooltip-n-currentevents' => 'પà«àª°àª¸à«àª¤à«àª¤ ઘટનાની પૃષà«àª àª­à«‚મિની માહિતિ શોધો',
+'tooltip-n-recentchanges' => 'વિકિમાં હાલમા થયેલા ફેરફારોની સૂચિ.',
+'tooltip-n-randompage' => 'કોઇ પણ àªàª• લેખ બતાવો',
+'tooltip-n-help' => 'શોધવા માટેની જગà«àª¯àª¾.',
+'tooltip-t-whatlinkshere' => 'અહીં જોડાતા બધાં વિકિ પાનાઓની યાદી',
+'tooltip-t-recentchangeslinked' => 'આ પાના પરની કડીઓ વાળા લેખોમાં તાજેતરમાં થયેલા ફેરફારો',
+'tooltip-feed-rss' => 'આ પાના માટે આર.àªàª¸.àªàª¸. ફીડ',
+'tooltip-feed-atom' => 'આ પાના માટે àªàªŸà«‹àª® ફીડ',
+'tooltip-t-contributions' => 'આ સભà«àª¯àª¨àª¾àª‚ યોગદાનોની યાદી જà«àª“',
+'tooltip-t-emailuser' => 'આ સભà«àª¯àª¨à«‡ ઇ-મેલ મોકલો',
+'tooltip-t-upload' => 'ફાઇલ ચડાવો',
+'tooltip-t-specialpages' => 'બધા ખાસ પાનાઓની સૂચિ',
+'tooltip-t-print' => 'આ પાનાની છાપવા માટેની આવૃતà«àª¤àª¿',
+'tooltip-t-permalink' => 'પાનાનાં આ પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àª¨à«€ સà«àª¥àª¾àª¯à«€ કડી',
+'tooltip-ca-nstab-main' => 'સૂચિ વાળà«àª‚ પાનૠજà«àª“',
+'tooltip-ca-nstab-user' => 'સભà«àª¯àª¨à«àª‚ પાનà«àª‚ જà«àª“',
+'tooltip-ca-nstab-media' => 'મિડિયાનà«àª‚ પાનà«àª‚ જà«àª“',
+'tooltip-ca-nstab-special' => 'આ ખાસ પાનà«àª‚ છે, તમે તેમાં ફેરફાર ના કરી શકો',
+'tooltip-ca-nstab-project' => 'પરિયોજનાનà«àª‚ પાનà«àª‚',
+'tooltip-ca-nstab-image' => 'ફાઇલ વિષેનà«àª‚ પાનà«àª‚ જà«àª“',
+'tooltip-ca-nstab-mediawiki' => 'તંતà«àª° સંદેશ જà«àª“',
+'tooltip-ca-nstab-template' => 'ઢાંચો જà«àª“',
+'tooltip-ca-nstab-help' => 'મદદનà«àª‚ પાનà«àª‚ જà«àª“',
+'tooltip-ca-nstab-category' => 'શà«àª°à«‡àª£à«€àª“નà«àª‚ પાનà«àª‚ જà«àª“',
+'tooltip-minoredit' => 'આને નાનો ફેરફાર ગણો',
+'tooltip-save' => 'તમે કરેલાં ફેરફારો સà«àª°àª•à«àª·àª¿àª¤ કરો',
+'tooltip-preview' => 'તમે કરેલાં ફેરફારો જોવા મળશે, કૃપા કરી કારà«àª¯ સà«àª°àª•à«àª·àª¿àª¤ કરતાં પહેલા આ જોઇ લો',
+'tooltip-diff' => 'તમે માહિતિમાં કયા ફેરફારો કરà«àª¯àª¾ છે તે જોવા મળશે',
+'tooltip-compareselectedversions' => 'અ પાનાનાં પસંદ કરેલા બે વૃતà«àª¤àª¾àª‚ત વચà«àªšà«‡àª¨àª¾àª‚ ભેદ જà«àª“.',
+'tooltip-watch' => 'આ પાનાને તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ઉમેરો',
+'tooltip-watchlistedit-normal-submit' => 'શીરà«àª·àª•à«‹ હટાવો',
+'tooltip-watchlistedit-raw-submit' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચિ અધà«àª¯àª¤àª¨ બનાવો',
+'tooltip-recreate' => 'આપાનà«àª‚ ફરીથી રચો ભલેને તે પહેલાં ભૂસાડી દેવાયà«àª‚ હોય',
+'tooltip-upload' => 'ફાઇલ ચડાવવાનà«àª‚ શરૂ કરો',
+'tooltip-rollback' => '"પાછà«àª‚ વાળો" àªàª• જ કà«àª²àª¿àª•àª®àª¾àª‚ આ પાનામાં છેલà«àª²àª¾ સભà«àª¯àª કરેલા બધા ફેરફારો પાછા વાળશે',
+'tooltip-undo' => '"રદ કરો" આ ફેરફારને પાછો વાળશે અને ફેરફાર પછીનà«àª‚ પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨ ફોરà«àª® નવા પાના તરીકે ખà«àª²àª¶à«‡.
તે તમને \'સારાંશ\'માં કારણ જણાવવા દેશે.',
-'tooltip-preferences-save' => 'પસંદ સાચવો',
-'tooltip-summary' => 'ટૂંક સારાંશ ઉમેરો',
+'tooltip-preferences-save' => 'પસંદ સાચવો',
+'tooltip-summary' => 'ટૂંક સારાંશ ઉમેરો',
# Metadata
'notacceptable' => 'તમારા ગà«àª°àª¾àª¹àª• સમજી શકે તે રીતે વિકિ માહિતી નહીં આપી શકે',
@@ -2850,9 +2921,6 @@ To perform a selective restoration, check the boxes corresponding to the revisio
# Patrol log
'patrol-log-page' => 'ચકાસણી લોગ',
'patrol-log-header' => 'આ નીરીકà«àª·àª¿àª¤ ફેરફાઓનો લોગ છે',
-'patrol-log-line' => '$1 માંના $2 ને નીરીકà«àª·àª¿àª¤ અંકિત કરો $3',
-'patrol-log-auto' => '(સà«àªµàª¯àª‚ચાલિત)',
-'patrol-log-diff' => 'સà«àª§àª¾àª°à«‹: $1',
'log-show-hide-patrol' => '$1 ચકાસણી લોગ',
# Image deletion
@@ -2869,23 +2937,25 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'nextdiff' => 'પછીનો ફેરફાર →',
# Media information
-'mediawarning' => "'''ચેતવણી''': આ ફાઇલમાં દà«àª·à«àªŸ સોચનાઓ હોઇ શકે.
+'mediawarning' => "'''ચેતવણી''': આ ફાઇલમાં દà«àª·à«àªŸ સોચનાઓ હોઇ શકે.
તેને ચલવતા, તમારા સંગણકને ભય છે.",
-'imagemaxsize' => "ચિતà«àª°àª¨àª¾ કદની મરà«àª¯àª¾àª¦àª¾:<br />''(for file description pages)''",
-'thumbsize' => 'લઘà«àªšàª¿àª¤à«àª° કદ',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|પાનà«àª‚|પાના}}',
-'file-info' => 'ફાઇલ કદ : $1, MIME પà«àª°àª•àª¾àª°: $2',
-'file-info-size' => '$1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4',
-'file-info-size-pages' => '$1 × $2 પીકà«àª¸àª², ફાઈલ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4, $5 {{PLURAL:$5|પાનà«àª‚|પાના}}',
-'file-nohires' => '<small>આથી વધૠઆવરà«àª¤àª¨ ઉપલબà«àª§ નથી.</small>',
-'svg-long-desc' => 'SVG ફાઇલ, માતà«àª° $1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3',
-'show-big-image' => 'મહતà«àª¤àª® આવરà«àª¤àª¨',
-'show-big-image-size' => '$1 × $2 પીકà«àª¸àª²',
-'file-info-gif-looped' => 'આવરà«àª¤àª¨ (લà«àªª)',
-'file-info-gif-frames' => ' $1 {{PLURAL:$1|છબી|છબીઓ}}',
-'file-info-png-looped' => 'આવરà«àª¤àª¨',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|વખત|વખત}} કરાયà«àª‚',
-'file-info-png-frames' => '$1 {{PLURAL:$1|છà«àª¬à«€|છબીઓ}}',
+'imagemaxsize' => "ચિતà«àª°àª¨àª¾ કદની મરà«àª¯àª¾àª¦àª¾:<br />''(for file description pages)''",
+'thumbsize' => 'લઘà«àªšàª¿àª¤à«àª° કદ',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|પાનà«àª‚|પાના}}',
+'file-info' => 'ફાઇલ કદ : $1, MIME પà«àª°àª•àª¾àª°: $2',
+'file-info-size' => '$1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4',
+'file-info-size-pages' => '$1 × $2 પીકà«àª¸àª², ફાઈલ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4, $5 {{PLURAL:$5|પાનà«àª‚|પાના}}',
+'file-nohires' => 'આથી વધૠઆવરà«àª¤àª¨ ઉપલબà«àª§ નથી.',
+'svg-long-desc' => 'SVG ફાઇલ, માતà«àª° $1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3',
+'show-big-image' => 'મહતà«àª¤àª® આવરà«àª¤àª¨',
+'show-big-image-preview' => 'આ મહાવરા દà«àª°àª¶à«àª¯àª¨à«àª‚ માપ: $1.',
+'show-big-image-other' => 'અનà«àª¯ {{PLURAL:$2|આવરà«àª¤àª¨|આવરà«àª¤àª¨à«‹}}: $1.',
+'show-big-image-size' => '$1 × $2 પીકà«àª¸àª²',
+'file-info-gif-looped' => 'આવરà«àª¤àª¨ (લà«àªª)',
+'file-info-gif-frames' => ' $1 {{PLURAL:$1|છબી|છબીઓ}}',
+'file-info-png-looped' => 'આવરà«àª¤àª¨',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|વખત|વખત}} કરાયà«àª‚',
+'file-info-png-frames' => '$1 {{PLURAL:$1|છà«àª¬à«€|છબીઓ}}',
# Special:NewFiles
'newimages' => 'નવી ફાઇલોની àªàª¾àª‚ખી',
@@ -2899,6 +2969,13 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'bydate' => 'તારીખ પà«àª°àª®àª¾àª£à«‡',
'sp-newimages-showfrom' => '$2, $1 થી શરૂ થતી ફાઇલો બતાવો',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 સેકનà«àª¡|$1 સેકનà«àª¡}}',
+'minutes' => '{{PLURAL:$1|$1 મિનિટ|$1 મિનિટો}}',
+'hours' => '{{PLURAL:$1|$1 કલાક|$1 કલાકો}}',
+'days' => '{{PLURAL:$1|$1 દિવસ|$1 દિવસો}}',
+'ago' => '$1 પહેલાં',
+
# Bad image list
'bad_image_list' => 'ફોરà«àª®à«‡àªŸ નીચે મà«àªœàª¬ છે:
@@ -3395,13 +3472,6 @@ $5
'scarytranscludefailed' => '[$1 માટે ઢાંચો ખેંચી લાવવામાં અસફળ ]',
'scarytranscludetoolong' => '[URL ઘણો લાંબો છે]',
-# Trackbacks
-'trackbackbox' => 'આ પાનાના ટà«àª°à«‡àª• બેક:<br />
-$1',
-'trackbackremove' => '([$1 ભૂંસો])',
-'trackbacklink' => 'ટà«àª°à«‡àª•àª¬à«‡àª•',
-'trackbackdeleteok' => 'ટà«àª°à«‡àª•àª¬à«‡àª• સફળતા પૂરà«àªµàª• હટાવાયા.',
-
# Delete conflict
'deletedwhileediting' => "'''ચેતવણી''': તમે ફેરફાર કરà«àª¯àª¾ પછી આ પાનà«àª‚ હટાવી દેવાયà«àª‚ !",
'confirmrecreate' => "સભà«àª¯ [[User:$1|$1]] ([[User talk:$1|talk]]) àªàª¤àª®à«‡ ફેરફાર કરો તે પહેલાં આ પાનà«àª‚ હટાવી દીધà«àª‚ તેનà«àª‚ કારણ:
@@ -3484,6 +3554,9 @@ $1',
'watchlisttools-edit' => 'ધà«àª¯àª¾àª¨àª¸à«‚ચી જà«àª“ અને બદલો',
'watchlisttools-raw' => 'કાચી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં ફેરફાર કરો',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])',
+
# Core parser functions
'unknown_extension_tag' => 'અજà«àªžàª¾àª¤ વિસà«àª¤àª¾àª°àª• શબà«àª¦ "$1"',
'duplicate-defaultsort' => '\'\'\'ચેતવણી:\'\'\' કી "$2" આગળનામૂળે પà«àª°àª¸à«àª¥àª¾àªªàª¿àª¤ કà«àª°àª®àª¿àª•àª¾àªµàª°à«àª—ીકરણ કી "$1"નà«àª‚ સà«àª¥àª¾àª¨ લઈ લેશે..',
@@ -3539,8 +3612,7 @@ $1',
'specialpages' => 'ખાસ પાનાં',
'specialpages-note' => '----
* નિયમિત ખાસ પાનાં.
-* <span class="mw-specialpagerestricted">સીમિત ખાસ પાનાં.</span>
-* <span class="mw-specialpagecached">માતà«àª°-સંગà«àª°àª¹àª¿àª¤ ખાસ પાનાં.</span>',
+* <span class="mw-specialpagerestricted">ખાસ પાનાં પà«àª°àª¤àª¿àª¬àª‚ધિત.</span>',
'specialpages-group-maintenance' => 'સમારકામ અહેવાલ',
'specialpages-group-other' => 'અનà«àª¯ ખાસ પાનાઓ',
'specialpages-group-login' => 'પà«àª°àªµà«‡àª¶ / નોંધણી કરો',
@@ -3582,13 +3654,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
# Special:ComparePages
-'comparepages' => 'પાનાં સરખાવો',
-'compare-selector' => 'પાનાનાં પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ સરખાવો',
-'compare-page1' => 'પાનà«àª‚ ૧',
-'compare-page2' => 'પાનà«àª‚ ૨',
-'compare-rev1' => 'પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ ૧',
-'compare-rev2' => 'પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ ૨',
-'compare-submit' => 'સરખાવો',
+'comparepages' => 'પાનાં સરખાવો',
+'compare-selector' => 'પાનાનાં પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ સરખાવો',
+'compare-page1' => 'પાનà«àª‚ ૧',
+'compare-page2' => 'પાનà«àª‚ ૨',
+'compare-rev1' => 'પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ ૧',
+'compare-rev2' => 'પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ ૨',
+'compare-submit' => 'સરખાવો',
+'compare-invalid-title' => 'આ શીરà«àª·àª• અમાનà«àª¯ છે.',
+'compare-title-not-exists' => 'આ શીરà«àª·àª• અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નથી.',
+'compare-revision-not-exists' => 'આ આવૃતà«àª¤àª¿ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નથી.',
# Database error messages
'dberr-header' => 'આ વિકિમાં તકલીફ છે',
@@ -3616,4 +3691,90 @@ $1',
'sqlite-has-fts' => '$1 પૂરà«àª£ શબà«àª¦ શોધ સહીત',
'sqlite-no-fts' => '$1 પૂરà«àª£ શબà«àª¦ શોધ વિકલà«àªª વગર',
+# New logging system
+'logentry-delete-delete' => '$1 કાઢી પાનà«àª‚ $3',
+'logentry-delete-restore' => '$1 પà«àª¨àªƒàª¸àª‚ગà«àª°àª¹ પાનà«àª‚ $3',
+'logentry-delete-event' => '$1 બદલાઈ ના દૃશà«àª¯àª¤àª¾ {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} $3 ઘટનાઓ પર $4',
+'logentry-delete-revision' => '$1 બદલાઈ ના દૃશà«àª¯àª¤àª¾ {{PLURAL: $5 | સà«àª§àª¾àª°àª£àª¾ | $5 આવૃતà«àª¤àª¿àª“}} $3 પાનાં પર: $4',
+'logentry-delete-event-legacy' => '$1 બદલાઈ $3 પર લોગ ઘટનાઓ દૃશà«àª¯àª¤àª¾',
+'logentry-delete-revision-legacy' => '$1 બદલાઈ પાનાં પર આવૃતà«àª¤àª¿àª“ની દૃશà«àª¯àª¤àª¾ $3',
+'logentry-suppress-delete' => '$1 દબાવી પાનà«àª‚ $3',
+'logentry-suppress-event' => '$1 (છાની માહિતી) બદલાઈ {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} ની દà«àª°àª¶à«àª¯àª¤àª¾ $3 : $4',
+'logentry-suppress-revision' => '$1 બદલાઈ ના દૃશà«àª¯àª¤àª¾ {{PLURAL: $5 | આવૃતà«àª¤àª¿ ઠ| $5 આવૃતà«àª¤àª¿àª“}}: $4 $3 પાનાં પર',
+'logentry-suppress-event-legacy' => '$1 ગà«àªªà«àª¤ બદલો $3 પર લોગ ઘટનાઓ દૃશà«àª¯àª¤àª¾',
+'logentry-suppress-revision-legacy' => '$1 ગà«àªªà«àª¤ બદલાઈ પાનાં પર આવૃતà«àª¤àª¿àª“ની દૃશà«àª¯àª¤àª¾ $3',
+'revdelete-content-hid' => 'સામગà«àª°à«€ છà«àªªàª¾àª¯à«‡àª²àª¾',
+'revdelete-summary-hid' => 'ફેરફાર સાર છà«àªªàª¾àª¯à«‡àª²àª¾',
+'revdelete-uname-hid' => 'વપરાશકરà«àª¤àª¾ નામ છà«àªªàª¾àª¯à«‡àª²àª¾',
+'revdelete-content-unhid' => 'સામગà«àª°à«€ છà«àªªàª¾àªµà«‡àª² નથીં',
+'revdelete-summary-unhid' => 'ફેરફાર સાર છà«àªªàª¾àªµà«‡àª² નથીં',
+'revdelete-uname-unhid' => 'વપરાશકરà«àª¤àª¾ નામ છà«àªªàª¾àªµà«‡àª² નથીં',
+'revdelete-restricted' => 'પà«àª°àª¬àªàª§àª•à«‹àª¨àª¾ ફેરફાર કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ મà«àª•àª¾àª¯à«‹',
+'revdelete-unrestricted' => 'પà«àª°àª¬àª‚ધકોના ફેરફાર કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ હટાવાયો.',
+'logentry-move-move' => '$1ઠપાના $3ને $4 પર ખસેડà«àª¯à«àª‚',
+'logentry-move-move-noredirect' => '$1ઠદિશાનિરà«àª¦à«‡àª¶àª¨ છોડà«àª¯àª¾ વગર પાના $3ને $4 પર વાળà«àª¯à«àª‚',
+'logentry-move-move_redir' => '$1ઠદિશાનિરà«àª¦à«‡àª¶àª¨ કરીને પાના $3ને $4 પર ખસેડà«àª¯à«àª‚',
+'logentry-move-move_redir-noredirect' => '$1ઠદિશાનિરà«àª¦à«‡àª¶àª¨ કરીને પાના $3ને $4 પર વાળà«àª¯à«àª‚ પણ પાછળ દિશાનિરà«àª¦à«‡àª¶àª¨ છોડà«àª¯à«àª‚ નહી',
+'logentry-patrol-patrol' => '$1 આવૃતà«àª¤àª¿ ચિહà«àª¨àª¿àª¤ થયેલ પાનાં $4 $3 ચોકી કરવા ફરવા નીકળવà«àª‚',
+'logentry-patrol-patrol-auto' => '$1 આપોઆપ ચિહà«àª¨àª¿àª¤ ચોકી પહેરો કરવા લાગà«àª¯àª¾ આવૃતà«àª¤àª¿ પાનà«àª‚ $4 $3',
+'logentry-newusers-newusers' => '$1ઠસભà«àª¯ ખાતà«àª‚ બનાવà«àª¯à«àª‚',
+'logentry-newusers-create' => '$1ઠસભà«àª¯ ખાતà«àª‚ બનાવà«àª¯à«àª‚',
+'logentry-newusers-create2' => '$1ઠ$3 નામે સભà«àª¯ ખાતà«àª‚ બનાવà«àª¯à«àª‚',
+'logentry-newusers-autocreate' => 'àªàª•àª¾àª‰àª¨à«àªŸ $1 બનાવનાર આપોઆપ',
+'newuserlog-byemail' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ ઇ-મેલ દà«àªµàª¾àª°àª¾ મોકલાઇ છે.',
+
+# Feedback
+'feedback-bugornote' => 'જો તમને તકનીકી પà«àª°à«‹àª¬à«àª²à«‡àª®àª¨à«‡ વરà«àª£àª¨ કરવા માંગતા હોય તો [$1 report a bug] ઠબગ અહીં નોંધાવો.
+અનà«àª¯àª¥àª¾, તમે નેચે આપેલ સરળ ફોરà«àª® વાંચી શકો છો. તમારી ટિપà«àªªàª£à«€ "[$3 $2]" પાના કરવા માટે, તમારા સભà«àª¯ નામ અને બà«àª°àª¾àª‰àªàª° પà«àª°àª•àª¾àª° વાપફો છો તેની માહિતી આપો.',
+'feedback-subject' => 'વિષય:',
+'feedback-message' => 'સંદેશ',
+'feedback-cancel' => 'રદ કરો',
+'feedback-submit' => 'પà«àª°àª¤àª¿àª­àª¾àªµ આપો',
+'feedback-adding' => 'પà«àª°àª¤àª¿àª­àª¾àªµ આ પાના પર ઉમેરાઈ રહà«àª¯à«‹ છે.',
+'feedback-error1' => 'કà«àª·àª¤àª¿:API તરફથી અજાણ પરિણામ',
+'feedback-error2' => 'કà«àª·àª¤àª¿:ફેરફાર નિષà«àª«àª³',
+'feedback-error3' => 'તà«àª°à«àªŸà«€: API તરફથી કોઈ પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª° નથી',
+'feedback-thanks' => 'આભર! તમારા પà«àª°àª¤àª¿àª­àª¾àªµàª¨à«‡ "[$2 $1]" પાના પર મà«àª•àª¾àª¯àª¾ છે.',
+'feedback-close' => 'સંપનà«àª¨',
+'feedback-bugcheck' => 'સરસ! જરા જોઈ લેશો કે આ પહેલેથી જ હાજર [$1 known bugs] નથીને?',
+'feedback-bugnew' => 'મેં તપાસà«àª¯à«àª‚. નવી તà«àª°à«àªŸà«€àª¨à«€ જાણ કરો.',
+
+# API errors
+'api-error-badaccess-groups' => 'આ વિકિ પર ફાઈલ ચઢાવવાની પરવાનગી તમને નથી.',
+'api-error-badtoken' => 'આંતરીક તà«àª°à«àªŸà«€: ખરાબ ટોકન',
+'api-error-copyuploaddisabled' => 'આ સરà«àªµàª° પર URL દà«àªµàª¾àª°àª¾ માહિતી ચઢાવવા પર પà«àª°àª¤àª¿àª¬àª‚ધ',
+'api-error-duplicate' => 'આ {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} પહેલેથી સાઈટ પર તેજ માહિતી સાથે મોજૂદ છે.',
+'api-error-duplicate-archive' => 'તà«àª¯àª¾àª‚ {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} તે જ મહિતી સાથે મોજૂદ છે , પણ {{PLURAL:$1|it was|they were}} હટાવી દો.',
+'api-error-duplicate-archive-popup-title' => 'ડà«àª¯à«àªªà«àª²à«€àª•à«‡àªŸ {{PLURAL:$1|ફાઈલ|ફાઈલો}} પહેલેથી મોજà«àª¦ છે.',
+'api-error-duplicate-popup-title' => 'આબેહà«àª¬ અનà«àª¯ {{PLURAL:$1|ફાઈલ|ફાઈલો}}.',
+'api-error-empty-file' => 'તમે ચડાવેલ ફાઈલ ખાલી છે',
+'api-error-emptypage' => 'નવા ખાલી પાના રચવાની અપà«àª°àªµàª¾àª¨àª—à«€ નથી',
+'api-error-fetchfileerror' => 'આંતરીક તà«àª°à«àªŸà«€: ફાઈલ લાવતી વખતે અમà«àª• ગડબડ થઈ',
+'api-error-file-too-large' => 'તમે ચડાવેલી ફાઈલ ખૂબ મોટી છે',
+'api-error-filename-tooshort' => 'ફાઇલ નામ ખૂબ ટૂંકà«àª‚ છે',
+'api-error-filetype-banned' => 'આ પà«àª°àª•àª¾àª°àª¨à«€ ફાઈલ પà«àª°àª¤àª¿àª¬àª‚ધિત છે.',
+'api-error-filetype-missing' => 'ફાઈલને àªàª•à«àª¸àªŸà«‡àª¨à«àª¶àª¨ નથી',
+'api-error-hookaborted' => 'તમે કરેલ ફેરફારો વિસà«àª¤àª¾àª°à«€àª¤ ખૂંટા દà«àªµàª¾àª°àª¾ રોકી દેવાયા.',
+'api-error-http' => 'આંતરીક કà«àª·àª¤àª¿: સરà«àªµàª¸àª¨à«‹ સંપરà«àª• કરવામાં નિષà«àª«àª³àª¤àª¾',
+'api-error-illegal-filename' => 'ફાઈલા નામને પરવાનગી નથી',
+'api-error-internal-error' => 'આંતરીક તà«àª°à«àªŸàª¿ : વિકિ પર ફાઈલ ચડાવતા કાંઈક ગડબડ થઈ',
+'api-error-invalid-file-key' => 'આંતરીક કà«àª·àª¤àª¿: હંગામી સંગà«àª°àª¹ સà«àª¥àª³ પર ફાઈન ન મળી',
+'api-error-missingparam' => 'આંતરીક તà«àª°à«àªŸà«€: અરજીમાં માહિતી ખà«àªŸà«‡ છે',
+'api-error-missingresult' => 'આંતરીક તà«àª°à«àªŸà«€: નકલ સફળ રહી કે કેમ તેની ખાતà«àª°à«€ ન કરી શકાઈ.',
+'api-error-mustbeloggedin' => 'ફાઈલ ચઢાવવા તમારે લોગીન કરેલà«àª‚ હોવà«àª‚ જોઈàª.',
+'api-error-mustbeposted' => 'આંતરીક તà«àª°à«àªŸà«€: તમારી વિનંતિમાં HTTP POST હોવી જોઈàª',
+'api-error-noimageinfo' => 'ફાઈલ સફળતા પૂરà«àªµàª• ચઢાવાઈ, પણ ફાઈલ વિષે સરà«àªµàª°à«‡ પૂરી માહિતી ન આપી',
+'api-error-nomodule' => 'આંતરીક કà«àª·àª¤àª¿: ફાઈલ ચઢાવવાનà«àª‚ મોડà«àª¯à«àª² સેટ નથી',
+'api-error-ok-but-empty' => 'આંતરીક તà«àª°à«àªŸà«€: સરà«àªµàª° તરફથી કોઈ પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª° નથી',
+'api-error-overwrite' => 'વિહરમાન ફાઇલ પર પà«àª¨àª°à«àª²à«‡àª–ન કરવાની પરવાનગી નથી',
+'api-error-stashfailed' => 'આંતરીક કà«àª·àª¤àª¿: હંગામી ફાઈલ સંચયમાં સરà«àªµàª° નિષà«àª«àª³',
+'api-error-timeout' => 'અપેકà«àª·àª¿àª¤ સમય સà«àª§à«€ સરà«àªµàª°à«‡ પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª° ન આપà«àª¯à«‹.',
+'api-error-unclassified' => 'અજà«àªžàª¾àª¤ ચૂક થઈ.',
+'api-error-unknown-code' => 'અજà«àªžàª¾àª¤ કà«àª·àª¤àª¿: "$1".',
+'api-error-unknown-error' => 'આંતરીક તà«àª°à«àªŸàª¿ : તમારી ફાઈલ ચડાવાતા કાંઈક ગડબડ થઈ.',
+'api-error-unknown-warning' => 'અજà«àªžàª¾àª¤ ચેતચણી: "$1".',
+'api-error-unknownerror' => 'અજà«àªžàª¾àª¤ કà«àª·àª¤àª¿: "$1".',
+'api-error-uploaddisabled' => 'આ વીકી પર અપલોડ નિષà«àª•à«àª°àª¿àª¯ કરવામાં આવેલ છે',
+'api-error-verification-error' => 'ફાઈલ યાતો ખરાબ થઈ ગઈ છે યાતો તેનà«àª‚ àªàª•à«àª¸àªŸà«‡àª¨à«àª¶àª¨ (વિસà«àª¤àª°àª•) ખોટો છે.',
+
);
diff --git a/languages/messages/MessagesGv.php b/languages/messages/MessagesGv.php
index be9559d0..a08b3393 100644
--- a/languages/messages/MessagesGv.php
+++ b/languages/messages/MessagesGv.php
@@ -325,10 +325,11 @@ Cur coontey jeh da [[Special:ListUsers/sysop|reireyder]], as goaill stiagh yn UR
'filenotfound' => 'Cha dooar shin y coadan "$1".',
'fileexistserror' => 'Cha dod shin screeu da\'n choadan "$1": t\'eh ayn hannah',
'badarticleerror' => 'Cha nod oo jannoo yn obbyr shen er y duillag shoh.',
+'cannotdelete-title' => 'Gyn jargaght y duillag "$1" y scryssey',
'badtitle' => 'Drogh-ennym',
'badtitletext' => "Va marranys ayn bentyn rish ennym ny duillag v'ou shirrey. Foddee dy row eh follym ny gyn vree, ny kianglt dy moal myr kiangley eddyr-wiki. Foddee dy vel cowraghyn 'syn ennym nagh nod oo jannoo ymmyd jeu ayns enmyn.",
'viewsource' => 'Jeeagh er bun',
-'viewsourcefor' => 'dy $1',
+'viewsource-title' => 'Jeeagh er bun $1',
'actionthrottled' => 'Obbyr er ny phlooghey',
'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.",
@@ -406,11 +407,16 @@ Myr eiyrtys, cha nod keayrtee lesh yn enmys IP shoh ny smoo coontyssyn noa y chr
'resetpass-submit-loggedin' => 'Caghlaa fockle yn arrey',
# Special:PasswordReset
-'passwordreset-username' => "Dt'ennym ymmydeyr:",
-'passwordreset-email' => 'Enmys post-L:',
-'passwordreset-emailelement' => 'Ennym ymmydeyr: $1
+'passwordreset-username' => "Dt'ennym ymmydeyr:",
+'passwordreset-email' => 'Enmys post-L:',
+'passwordreset-emailelement' => 'Ennym ymmydeyr: $1
Fockle arrey shallidagh: $2',
-'passwordreset-emailsent' => 'Ta post-l cur gys cooinaghtyn er ny chur dhyt.',
+'passwordreset-emailsent' => 'Ta post-l cur gys cooinaghtyn er ny chur dhyt.',
+'passwordreset-emailsent-capture' => 'Ta post-l cur gys cooinaghtyn er ny chur dhyt, as eshyn heese.',
+'passwordreset-emailerror-capture' => 'Ta post-l cur gys cooinaghtyn er ny chur dhyt, as eshyn heese, agh cha rosh eh yn ymmydeyr: $1',
+
+# Special:ChangeEmail
+'changeemail-none' => '(gyn)',
# Edit page toolbar
'bold_sample' => 'Clou trome',
@@ -541,9 +547,6 @@ Ogher: '''({{int:cur}})''' = anchaslyssyn rish y lhieggan t'ayn nish,
'revdel-restore' => 'ceaghley leayrid',
'pagehist' => 'Shennaghys y duillag',
'deletedhist' => 'Shennaghys scryssit',
-'revdelete-content' => 'cummal',
-'revdelete-summary' => 'giare-choontey yn reaghey',
-'revdelete-uname' => 'ennym yn ymmydeyr',
# History merging
'mergehistory' => 'Shennaghys ny duillagyn y chochiangley',
@@ -914,7 +917,7 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
'protectedpages-cascade' => 'Cha nel agh coadey eiraghtagh',
'protectedtitles' => 'Enmyn coadit',
'listusers' => 'Rolley ymmydeyryn',
-'usercreated' => 'Crooit er $1 ec $2',
+'usercreated' => 'Crooit liorish {{GENDER:$3|}} er $1 ec $2',
'newpages' => 'Duillagyn noa',
'newpages-username' => 'Ennym ymmydeyr:',
'ancientpages' => 'Duillagyn by hinney',
@@ -960,8 +963,7 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
'listusers-submit' => 'Taishbyn',
# Special:Log/newusers
-'newuserlogpage' => 'Lioar chooishyn ny h-ymmydeyryn noa',
-'newuserlog-create-entry' => 'Ymmydeyr noa',
+'newuserlogpage' => 'Lioar chooishyn ny h-ymmydeyryn noa',
# Special:ListGroupRights
'listgrouprights-group' => 'Possan',
@@ -1052,7 +1054,6 @@ Feeraghey dy vel eh y çhalee ayd eh y yannoo, dy vel ny scanshyn toiggit ayd, a
'actioncomplete' => 'Obbraghey creaghnit',
'deletedtext' => 'Ta "$1" scrysst.<br />
Jeeagh er $2 son recortys ny scryssaghyn magh jeianagh.',
-'deletedarticle' => '"[[$1]]" scryssit',
'dellogpage' => 'Lioar scryssaghyn magh',
'deletecomment' => 'Fa:',
'deleteotherreason' => 'Fa elley/tooilley:',
@@ -1109,7 +1110,6 @@ Shoh ny reaghaghyn roie da'n duillag '''$1''':",
'undeletelink' => 'jeeagh/cur er ash',
'undeletereset' => 'Aahoiaghey',
'undeletecomment' => 'Fa:',
-'undeletedarticle' => '"[[$1]]" aahoiaghit',
'undelete-search-box' => 'Ronsee ny duillagyn scrysst',
'undelete-search-submit' => 'Ronsee',
@@ -1224,8 +1224,6 @@ Reih ennym elley, my sailliu.',
Jean covestey eddyr oc er laueyn, my sailliu.'''",
'movedto' => 'aa-enmyssit myr',
'movetalk' => 'Scugh yn duillag resoonaght eck',
-'1movedto2' => '[[$1]] aa-enmyssit myr [[$2]]',
-'1movedto2_redir' => 'va [[$1]] scughit dys [[$2]] harrish aaenmys',
'movelogpage' => 'Lioar chooishyn y scughey',
'movereason' => 'Fa:',
'revertmove' => 'goll er ash',
@@ -1320,10 +1318,6 @@ T'eh lhiggey da oyr y chur 'sy ghiare-choontey.",
'others' => 'sleih elley',
'siteusers' => '{{PLURAL:$2|Ymmydeyr|Ymmydeyryn}} ec {{SITENAME}} $1',
-# Patrol log
-'patrol-log-auto' => '(seyr-obbragh)',
-'patrol-log-diff' => 'caghlaa $1',
-
# Browsing diffs
'previousdiff' => '↠Y caghlaa ny shinney',
'nextdiff' => 'Y caghlaa ny snoa →',
@@ -1331,7 +1325,7 @@ T'eh lhiggey da oyr y chur 'sy ghiare-choontey.",
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|duillag|duillagyn}}',
'file-info-size' => '$1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}}, mooadys y choadan: $3, sorçh MIME: $4',
-'file-nohires' => '<small>Cha nel jeeskeaylley ny smoo ry-gheddyn.</small>',
+'file-nohires' => 'Cha nel jeeskeaylley ny smoo ry-gheddyn.',
'svg-long-desc' => 'coadan SVG, $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}} dy ennymagh, mooadys y choadan: $3',
'show-big-image' => 'Jeeskeaylley ymlane',
diff --git a/languages/messages/MessagesHa.php b/languages/messages/MessagesHa.php
index 4cbbdb89..4c156122 100644
--- a/languages/messages/MessagesHa.php
+++ b/languages/messages/MessagesHa.php
@@ -488,8 +488,7 @@ Ku gwada tare da amfani da \"all:\" don bincikar duka shafunan (har da shafunan
'listusers-submit' => 'Nuna',
# Special:Log/newusers
-'newuserlogpage' => 'Rajistan sabbin akwantoci',
-'newuserlog-create-entry' => 'Sabon akwanti',
+'newuserlogpage' => 'Rajistan sabbin akwantoci',
# Special:ListGroupRights
'listgrouprights-members' => '(jerin mambobi)',
@@ -521,7 +520,6 @@ A nan ne kuma za a yi rajistan dukkan sauye-sauye ga shafin ko shafinsa na muhaw
'actioncomplete' => 'Aiki cikakke',
'deletedtext' => 'An soke "$1".
Ku duba $2 ku ga rajistan soke-soke na baya-bayan nan.',
-'deletedarticle' => 'an soke "[[$1]]"',
'dellogpage' => 'Rajistan sauye-sauye',
'deletecomment' => 'Dalili:',
'deleteotherreason' => 'Wani dalilin:',
@@ -562,7 +560,6 @@ Kuna iya sake wa wannan shafi matakin kariya, amma hakan ba zai yi tasiri ga kar
# Undelete
'undeletelink' => 'duba/maido da',
'undeletecomment' => 'Dalili:',
-'undeletedarticle' => 'an mayar da "[[$1]]"',
'undelete-search-submit' => 'Nema',
# Namespace form on various pages
@@ -647,8 +644,6 @@ Don Allah ku zaɓi wani suna.',
Don Allah ku game su da hannu.'''",
'movedto' => 'an gusar zuwa',
'movetalk' => 'Gusar da shafin mahawara mai alaƙa',
-'1movedto2' => 'an gusar da [[$1]] zuwa [[$2]]',
-'1movedto2_redir' => 'an gusar da [[$1]] zuwa [[$2]] ta hanyar soke turawa',
'movelogpage' => 'Rajistan gushe-gushe',
'movereason' => 'Dalili:',
'revertmove' => 'koma',
@@ -722,7 +717,7 @@ Tana ba da damar bayyana dalilin soke gyaran.',
# Media information
'file-info-size' => 'pikisal $1 × $2, girman fayil: $3, irin MIME: $4',
-'file-nohires' => '<small>Babu wata babbar saƙa.</small>',
+'file-nohires' => 'Babu wata babbar saƙa.',
'svg-long-desc' => 'Fayil kin SVG, saƙar fikisal $1 x $2, girman fayil: $3',
'show-big-image' => 'Cikakkar saƙa',
diff --git a/languages/messages/MessagesHak.php b/languages/messages/MessagesHak.php
index 60fbc5d4..2137be61 100644
--- a/languages/messages/MessagesHak.php
+++ b/languages/messages/MessagesHak.php
@@ -306,14 +306,13 @@ Chhiáng ki-liuÌk hâ URL thi-chí, pin hiong [[Special:ListUsers/sysop|Kón-lÃ
'cannotdelete' => 'Mò-fap chhù-thet sién-thin ke vùn-chông feÌt-he thù-chhiong (Kí khó-nèn yí-kîn pûn khì-thâ-ngìn chhù-hi liáu).',
'badtitle' => 'Chho-ngu ke phêu-thì',
'badtitletext' => 'Só chhiáng-khiù hong-mien ke phêu-thì he mò-háu ke, mò-chhùn-chhai, khiam-ko ngî-ngièn feÌt-chá khiam-ko wiki lièn-kiet ke phêu-thì chho-ngu.',
-'perfcached' => 'Yî-ha chṳ̂-liau lòi-chhṳ khoai-chhí, khó-nèn yû chho-ngu.',
-'perfcachedts' => 'Yî-ha he khoai-chhí chṳ̂-liau, chui-heu kiên-sîn sṳ̀-kiên he $1.',
+'perfcached' => 'Yî-ha chṳ̂-liau lòi-chhṳ khoai-chhí, khó-nèn yû chho-ngu. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Yî-ha he khoai-chhí chṳ̂-liau, chui-heu kiên-sîn sṳ̀-kiên he $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Tông-chhièn kim-chá¹³Ì tui chhá¹³Ì-chông chin-hàng kiên-sîn. Chhá¹³Ì-chhu ke chṳ̂-liau chiông put-nèn pûn chhùng-sîn chá¹³Ìn-lî.',
'wrong_wfQuery_params' => 'Chho-ngu ke chhâm-su thô-chṳ wfQuery()<br />
Chhá¹³-su: $1<br />
Chhà-khon: $2',
'viewsource' => 'Ngièn-sá¹³Ì-tóng',
-'viewsourcefor' => '$1 ke ngièn-sá¹³Ì-tóng',
'actionthrottled' => 'Thung-tsok yí-kîn ap-tsṳ',
'protectedpagetext' => 'Pún-chông yí-kîn pûn fûng-só put yún-chún phiên-cho.',
'viewsourcetext' => 'Ngì khó-yî chhà-khon pin fuk-chṳ pún vùn-chông ke kîn-ngièn.',
@@ -442,9 +441,6 @@ Ngì khó-yî ki-siuÌk yî ngiaÌk-miàng fông-sá¹³t sá¹³Ì-yung {{SITENAME}},
Liá-chhá¹³ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he ''$2''. Ngì khó-yî lièn-loÌk $1 feÌt-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|Kón-lî-yèn]], thó-lun liá-chhá¹³ ke chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|Chong-ho chhâm-su sat-chá¹³]] chûng sat-thin liáu yit-ke yû-háu ke email, féu-chet ngì-he put-nèn sá¹³Ì-yung “email liá-vi yung-fu†ke kûng-yung. Ngì-ke IP thi-tiám he $3, yì-yèn ke chhà-fûng ID he #$5. Chhiáng ngì chhai só-yû chhà-chhìm chûng chu-mìn liá-ke thi-tiám khiÌpï¼feÌt-he chhà-fûng ID.",
'autoblockedtext' => 'Ngì-ke IP thi-tiám yí-kîn pûn chhá¹³-thung chhà-fûng, lî-yù he siên-chhièn ke nang yit-vi yung-fu pûn $1 só chhà-fûng. Yì-yèn chhà-fûng ke ngièn-yîn he: \'\'$2\'\' liá-chhá¹³ chhà-fûng ke khì-kiên he: $6 ngì khó-yî lièn-loÌk $1 feÌt-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|kón-lî-yèn]], thó-lun liá-chhá¹³ chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|chong-ho chhâm-su sat-chá¹³]] chûng sat-thin yit-ke yû-háu ke email thi-tiám, féu-chet ngì-he put-nèn sá¹³Ì-yung "email liá-vi yung-fu" ke kûng-nèn. Ngì-ke chhà-fûng ID he $5. Chhiáng ngì chhai só-yû thiàu-chhà chûng chu-mìn liá-ke chhà-fûng ID.',
-'blockedoriginalsource' => "Yî-ha he '''$1''' ke ngièn-sá¹³Ì meÌt:",
-'blockededitsource' => "Ngì tui '''$1''' chin-hàng '''phiên-siá''' ke vùn-sṳ yì-hâ:",
-'whitelistedittitle' => 'Tên-ngiÌp heu chhòi hí-khó phiên-siá',
'whitelistedittext' => 'Ngì pit-sî siên $1 chhòi-nèn phiên-siá vùn-chông.',
'confirmedittext' => 'Chhai phiên-cho chhá¹³Ì-chông chṳ̂-chhièn pit-sî khok-ngin ngì-ke email thi-tiám. Chhiáng theu-ko [[Special:Preferences|chhâm-su sat-thin]] sat-thin pin ngiam-chá¹³n ngì-ke email thi-tiám.',
'nosuchsectiontitle' => 'Mò-yû liá-ke thon-loÌk',
@@ -582,22 +578,11 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
'revdelete-unsuppress' => 'Chhai yí-kîn fî-fuÌk ke siû-thin chûng yì-chhù han-chá¹³',
'revdelete-log' => 'Ngièn-yîn:',
'revdelete-submit' => 'Yin-yung chhut-yì sién-chhí ke siû-thin',
-'revdelete-logentry' => '[[$1]]-ke siû-thin khó-kien-sin yí-kîn kiên-kói',
-'logdelete-logentry' => '[[$1]]-ke sṳ-khien khó-kien-sin yí-kîn kiên-kói',
'revdelete-success' => "'''Siû-thin ke khó-kien-sin yí-kîn sṳ̀n-kûng sat-thin.'''",
'logdelete-success' => "'''Sṳ-khien ke khó-kien-sin yí-kîn sṳ̀n-kûng sat-thin.'''",
'revdel-restore' => 'Kiên-kói khó-kien-sin',
'pagehist' => 'Vùn-tsông liÌt-sá¹³Ì',
'deletedhist' => 'Yí-kîn tshù-meÌt ke liÌt-sá¹³Ì',
-'revdelete-content' => 'nui-yùng',
-'revdelete-summary' => 'piên-sip tsak-yêu',
-'revdelete-uname' => 'yung-fu-miàng',
-'revdelete-restricted' => 'yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn',
-'revdelete-unrestricted' => 'yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ',
-'revdelete-hid' => 'yún-tshòng $1',
-'revdelete-unhid' => 'mò yún-tshòng $1',
-'revdelete-log-message' => '$1 ke $2-tshṳ siû-hàng',
-'logdelete-log-message' => '$1 ke $2-hong sá¹³-khien',
# Suppression log
'suppressionlog' => 'Fi-tsá¹³Ì ngit-péu',
@@ -1025,10 +1010,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Cháu put-to yung-fu.',
# Special:Log/newusers
-'newuserlogpage' => 'Sîn-chin yung-fu miàng-chhak',
-'newuserlogpagetext' => 'Liá-he yit-ke chui-khiun pûn chhóng-kien yung-fu ke ngit-ki.',
-'newuserlog-create-entry' => 'Sîn yung-fu',
-'newuserlog-create2-entry' => 'Yí-kîn chhong-kien $1 ke chong-fu',
+'newuserlogpage' => 'Sîn-chin yung-fu miàng-chhak',
+'newuserlogpagetext' => 'Liá-he yit-ke chui-khiun pûn chhóng-kien yung-fu ke ngit-ki.',
# Special:ListGroupRights
'listgrouprights-members' => '(sṳ̀n-yèn chhîn-tân)',
@@ -1107,7 +1090,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'confirmdeletetext' => 'Ngì chiông-voi chhiùng chṳ̂-liau-khu chûng yún-yén chhù-thet yit-ke vùn-chông feÌt-chá thù-chhiong yî-khiÌp liÌt-sá¹³Ì. Chhiáng khok-thin ngì-yeu chin-hàng chhâu-chok, pin liáu-kié heu-kó, thùng-sṳ̀ ngì-ke hàng-vì fù-haÌp [[{{MediaWiki:Policy-url}}]].',
'actioncomplete' => 'Chhâu-chok vàn-sṳ̀n',
'deletedtext' => '"$1" yí-kîn pûn chhù-thet. Chui-khiûn chhù-hi ke ki-liuÌk chhiáng chhâm-siòng $2.',
-'deletedarticle' => 'Yí-kîn chhù-thet "[[$1]]"',
'dellogpage' => 'Chhù-chhiang ki-liuÌk',
'dellogpagetext' => 'Yî-ha he chui-khiûn chhù-thet ke ki-liuÌk lieÌt-péu.',
'deletionlog' => 'Chhù-chhiang ki-liuÌk',
@@ -1190,7 +1172,6 @@ Pûn chhù-thet chhièn ke só-yû siû-thin pán-pún, lièn-thùng chhù-thet
'undeletelink' => 'kiám-sá¹³/fî-fuÌk',
'undeletereset' => 'Chhùng-sat',
'undeletecomment' => 'Ngièn-yîn:',
-'undeletedarticle' => 'yí-kîn fî-fuÌk "[[$1]]"',
'undeletedrevisions' => '$1-ke siû-thin pán-pún yí-kîn fî-fuÌk',
'undeletedrevisions-files' => '$1-ke pán-pún lâu $2-ke vùn-khien pûn fî-fuÌk',
'undeletedfiles' => '$1-ke vùn-khien pûn fî-fuÌk',
@@ -1361,8 +1342,6 @@ chhiáng chhai hàng-thung chṳ̂-chhièn siên liáu-kié khì-thâ khó-nèn
'talkexists' => "'''Hong-mien pún-sṳ̂n yì-thung sṳ̀n-kûng, than-he yù-yî sîn phêu-thì hâ yí-kîn yû tui-fa-hong chhùn-chhai, só-yî tui-fa-hong vù-fap yì-thung. Chhiáng sú-kûng haÌp-phîn lióng-ke hong-mien'''.",
'movedto' => 'yì-thung to',
'movetalk' => 'Chhiáng thùng-sṳ̀ yì-thung tui-fa-chông',
-'1movedto2' => '[[$1]] yì-thung to [[$2]]',
-'1movedto2_redir' => '[[$1]] theu-ko chhûng-thin-hiong yì-thung to [[$2]]',
'movelogpage' => 'Yì-thung ngit-ki',
'movelogpagetext' => 'Yî-ha he yí-kîn yì-thung ke vùn-chông chhîn-tân.',
'movereason' => 'Ngièn-yîn:',
@@ -1543,8 +1522,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => 'Sùn-chhà ki-liuÌk',
-'patrol-log-line' => 'Yí-kîn phêu-sṳ $1/$2-pán cho yí-kîn sùn-chhà ke $3',
-'patrol-log-auto' => '(chhṳ-thung)',
# Image deletion
'deletedrevision' => 'Yí-kîn chhù-thet khiu-ke pán-pún $1.',
@@ -1559,7 +1536,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'thumbsize' => 'LioÌk-thù thai-séu:',
'file-info' => 'tóng-on thai-séu: $1, MIME lui-hìn: $2',
'file-info-size' => '$1 × $2 chhiong-su, tóng-on thai-séu:$3 ,MIME lui-hìn:$4',
-'file-nohires' => '<small>Mò kien-kô kié-chhiong-thu khó-yî thì-kiûng.</small>',
+'file-nohires' => 'Mò kien-kô kié-chhiong-thu khó-yî thì-kiûng.',
'svg-long-desc' => 'SVG tóng-on, péu-mien thai-séu: $1 × $2 siong-su, tóng-on thai-séu: $3',
'show-big-image' => 'Vàn-cháng ke kié-chhiong-thu',
@@ -1636,13 +1613,6 @@ Kó-yèn ngì *mò-yû* thì-chhut liá-ke chhiáng-khiù, chhiáng put-yeu tiÃ
'scarytranscludefailed' => '[Tui-put-hí, mù-pán $1 thuÌk-chhí sá¹³t-phai]',
'scarytranscludetoolong' => '[Tui-put-hí; URL thi-tiám thai-chhòng]',
-# Trackbacks
-'trackbackbox' => 'Chhá¹³Ì vùn-chông ke yîn-yung:<br />
-$1',
-'trackbackremove' => '([$1 Chhù-meÌt])',
-'trackbacklink' => 'Fì-hióng',
-'trackbackdeleteok' => 'Trackback chhù-hi sṳ̀n-kûng.',
-
# Delete conflict
'deletedwhileediting' => 'Kín-ko: Chhá¹³Ì-hong chhai ngì khôi-sá¹³Ì phiên-cho chṳ̂-heu yí-kîn pûn Chhù-thet!',
'confirmrecreate' => "Chhai ngì phiên-chho liá-ke thiàu-muk heu, yung-fu [[User:$1|$1]]([[User talk:$1|tui-fa]]) yî ha-lieÌt ngièn-yîn chhù-thet liá-ke vùn-chông:
@@ -1705,4 +1675,8 @@ Sòn-chhṳ phêu-chún yi-liau.',
# Special:SpecialPages
'specialpages' => 'ThiÌt-sû-yaÌp',
+# New logging system
+'revdelete-restricted' => 'yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn',
+'revdelete-unrestricted' => 'yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ',
+
);
diff --git a/languages/messages/MessagesHaw.php b/languages/messages/MessagesHaw.php
index 3daad79c..29e17a2d 100644
--- a/languages/messages/MessagesHaw.php
+++ b/languages/messages/MessagesHaw.php
@@ -61,27 +61,27 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'currentmonth' => array( '1', 'KÄ’IAMAHINA', 'KEIAMAHINA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'KÄ’IAINOAMAHINA', 'KEIAINOAMAHINA', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'KÄ’IALÄ€', 'KEIALA', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'KÄ’IALÄ€2', 'KEIALA2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'KÄ’IAINOALÄ€', 'KEIAINOALA', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'KÄ’IAMAKAHIKI', 'KEIAMAKAHIKI', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'KÄ’IAMANAWA', 'KEIAMANAWA', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'KÄ’IAHOLA', 'KEIAHOLA', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'HELUʻAOʻAO', 'HELUAOAO', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'HELUMEA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'HELUWAIHONA', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'HELUMEAHOʻOHANA', 'HELUMEAHOOHANA', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'HELULOLI', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'INOAʻAOʻAO', 'INOAAOAO', 'PAGENAME' ),
- 'img_right' => array( '1', 'Ê»Äkau', 'Äkau', 'akau', 'right' ),
- 'img_left' => array( '1', 'hema', 'left' ),
- 'img_none' => array( '1', 'ʻaʻohe', 'aohe', 'none' ),
- 'img_link' => array( '1', 'loulou=$1', 'link=$1' ),
- 'currentweek' => array( '1', 'KÄ’IAPULE', 'KEIAPULE', 'CURRENTWEEK' ),
- 'language' => array( '0', '#ʻŌLELO', '#ŌLELO', '#OLELO', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'HELUKAHU', 'NUMBEROFADMINS' ),
+ 'currentmonth' => array( '1', 'KÄ’IAMAHINA', 'KEIAMAHINA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'KÄ’IAINOAMAHINA', 'KEIAINOAMAHINA', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'KÄ’IALÄ€', 'KEIALA', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'KÄ’IALÄ€2', 'KEIALA2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'KÄ’IAINOALÄ€', 'KEIAINOALA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'KÄ’IAMAKAHIKI', 'KEIAMAKAHIKI', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'KÄ’IAMANAWA', 'KEIAMANAWA', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'KÄ’IAHOLA', 'KEIAHOLA', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'HELUʻAOʻAO', 'HELUAOAO', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'HELUMEA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'HELUWAIHONA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'HELUMEAHOʻOHANA', 'HELUMEAHOOHANA', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'HELULOLI', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'INOAʻAOʻAO', 'INOAAOAO', 'PAGENAME' ),
+ 'img_right' => array( '1', 'Ê»Äkau', 'Äkau', 'akau', 'right' ),
+ 'img_left' => array( '1', 'hema', 'left' ),
+ 'img_none' => array( '1', 'ʻaʻohe', 'aohe', 'none' ),
+ 'img_link' => array( '1', 'loulou=$1', 'link=$1' ),
+ 'currentweek' => array( '1', 'KÄ’IAPULE', 'KEIAPULE', 'CURRENTWEEK' ),
+ 'language' => array( '0', '#ʻŌLELO', '#ŌLELO', '#OLELO', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'HELUKAHU', 'NUMBEROFADMINS' ),
);
$messages = array(
@@ -317,7 +317,6 @@ $messages = array(
'filenotfound' => '‘A‘ole hiki ke loa‘a waihona "$1".',
'badtitle' => 'Inoa ‘ino',
'viewsource' => 'E nÄnÄ i ka molekumu',
-'viewsourcefor' => 'no $1',
'cascadeprotected' => 'Ho‘omalu ‘ia kÄ“ia ‘ao‘ao mai e ho‘opololei ana, no ka mea, hoÊ»okomo pÅ« ‘ia ‘oia ma aia {{PLURAL:$1|‘ao‘ao|nÄ â€˜ao‘ao}} i lalo, ho‘omalu ‘ia me ka "e wailele ana" koho:
$2',
'ns-specialprotected' => '‘A‘ole hiki ke ho‘opololei i nÄ â€˜ao‘ao kÅ«ikawÄ',
@@ -394,9 +393,6 @@ E ʻoluʻolu, e kūlia hou.',
E hoÊ»opaÊ»a Ê»ia ana kou IP ma ko kÄ“ia Ê»aoÊ»ao mÅÊ»aukala.",
'blockedtitle' => 'Ua ke‘a ‘ia ka mea ho‘ohana',
'blockednoreason' => '‘a‘ohe kumu',
-'blockedoriginalsource' => "Aia ke kumu o '''$1'''
-hÅ‘ike ‘ia i lalo:",
-'blockededitsource' => "Aia ka mo‘olelo o '''kou mau ho‘opololei''' i '''$1''' hÅ‘ike ‘ia i lalo:",
'loginreqlink' => 'ʻeʻe',
'accmailtitle' => 'Ua ho‘ouna ‘ia ka hua‘Ålelo huna',
'newarticle' => '(Hou)',
@@ -496,7 +492,7 @@ E Ê»oluÊ»olu, e hÅÊ»oia i ka hoÊ»okÅ«kÅ« Ê»ana i lalo, a laila, e mÄlama i nÄ
'prefs-rc' => 'NÄ loli hou',
'prefs-watchlist' => 'Helu nÄnÄ',
'prefs-watchlist-days' => 'NÄ lÄ e hÅÊ»ike ana i ka helu nÄnÄ:',
-'prefs-watchlist-days-max' => 'Ê»Ehiku lÄ ka palena nui',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'saveprefs' => 'MÄlama',
'searchresultshead' => 'Huli',
'savedprefs' => 'Ua mÄlama ‘ia kÄu makemake',
@@ -645,9 +641,6 @@ E Ê»oluÊ»olu, e hÅÊ»oia i ka hoÊ»okÅ«kÅ« Ê»ana i lalo, a laila, e mÄlama i nÄ
# Special:ListUsers
'listusers-submit' => 'HÅ‘ike',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Mea hoʻohana hou',
-
# Special:ListGroupRights
'listgrouprights-members' => '(papa o nÄ lÄlÄ)',
@@ -676,7 +669,6 @@ E Ê»oluÊ»olu, e hÅÊ»oia i ka hoÊ»okÅ«kÅ« Ê»ana i lalo, a laila, e mÄlama i nÄ
'actioncomplete' => 'Ua pau',
'deletedtext' => 'Ua kÄpae Ê»ia Ê»o "$1".
E Ê»ike iÄ $2 no ka papa o nÄ kÄpae Ê»ana hou.',
-'deletedarticle' => 'ua kÄpae ‘ia "[[$1]]"',
'dellogpage' => 'Mo‘olelo kÄpae',
'dellogpagetext' => 'He helu o nÄ mea i kÄpae Ê»ia hou i lalo.',
'deletionlog' => 'mo‘olelo kÄpae',
@@ -762,7 +754,6 @@ E Ê»ike iÄ $2 no ka papa o nÄ kÄpae Ê»ana hou.',
'pagemovedsub' => 'Kūleʻa ka hoʻoneʻe ʻana',
'movepage-moved' => '\'\'\'Ua hoÊ»oneÊ»e Ê»ia Ê»o "$1" iÄ "$2"\'\'\'',
'movedto' => 'ua neÊ»e Ê»ia i/iÄ',
-'1movedto2' => 'Ua hoÊ»oneÊ»e Ê»o [[$1]] iÄ [[$2]]',
'movereason' => 'Kumu:',
'delete_and_move' => 'E kÄpae a e ho‘ololi i ka inoa',
'delete_and_move_confirm' => '‘Ae, e kÄpae i ka ‘ao‘ao',
diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php
index 05d426bd..9b19e23d 100644
--- a/languages/messages/MessagesHe.php
+++ b/languages/messages/MessagesHe.php
@@ -19,6 +19,7 @@
* @author YaronSh
* @author ערן
* @author שומבלע
+ * @author תומר ט
*/
$rtl = true;
@@ -66,154 +67,159 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#הפניה', '#REDIRECT' ),
- 'notoc' => array( '0', '__לל×_תוכן_×¢× ×™×™× ×™×__', '__לל×_תוכן__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__לל×_גלריה__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__חייב_תוכן_×¢× ×™×™× ×™×__', '__חייב_תוכן__', '__FORCETOC__' ),
- 'toc' => array( '0', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
- 'noeditsection' => array( '0', '__לל×_עריכה__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__לל×_כותרת__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'חודש נוכחי', 'חודש נוכחי 2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'חודש נוכחי 1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', '×©× ×—×•×“×© נוכחי', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', '×©× ×—×•×“×© נוכחי קניין', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'קיצור חודש נוכחי', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', '×™×•× × ×•×›×—×™', 'CURRENTDAY' ),
- 'currentday2' => array( '1', '×™×•× × ×•×›×—×™ 2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', '×©× ×™×•× × ×•×›×—×™', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'שנה נוכחית', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'שעה נוכחית', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'שעות נוכחיות', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'חודש מקומי', 'חודש מקומי 2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'חודש מקומי 1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', '×©× ×—×•×“×© מקומי', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', '×©× ×—×•×“×© מקומי קניין', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'קיצור חודש מקומי', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', '×™×•× ×ž×§×•×ž×™', 'LOCALDAY' ),
- 'localday2' => array( '1', '×™×•× ×ž×§×•×ž×™ 2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', '×©× ×™×•× ×ž×§×•×ž×™', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'שנה מקומית', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'שעה מקומית', 'LOCALTIME' ),
- 'localhour' => array( '1', 'שעות מקומיות', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'מספר ×“×¤×™× ×›×•×œ×œ', 'מספר דפי×', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'מספר קבצי×', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'מספר משתמשי×', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'מספר ×ž×©×ª×ž×©×™× ×¤×¢×™×œ×™×', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'מספר עריכות', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'מספר צפיות', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', '×©× ×”×“×£', 'PAGENAME' ),
- 'pagenamee' => array( '1', '×©× ×”×“×£ מקודד', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'מרחב הש×', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'מרחב ×”×©× ×ž×§×•×“×“', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'מרחב הנוש×', 'מרחב הערכי×', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'מרחב ×”× ×•×©× ×ž×§×•×“×“', 'מרחב ×”×¢×¨×›×™× ×ž×§×•×“×“', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', '×©× ×”×“×£ המל×', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', '×©× ×”×“×£ ×”×ž×œ× ×ž×§×•×“×“', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', '×©× ×“×£ המשנה', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', '×©× ×“×£ המשנה מקודד', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', '×©× ×“×£ הבסיס', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', '×©× ×“×£ הבסיס מקודד', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', '×©× ×“×£ השיחה', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', '×©× ×“×£ השיחה מקודד', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', '×©× ×“×£ הנוש×', '×©× ×”×¢×¨×š', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', '×©× ×“×£ ×”× ×•×©× ×ž×§×•×“×“', '×©× ×”×¢×¨×š מקודד', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'הכללה:', 'MSG:' ),
- 'subst' => array( '0', 'ס:', 'SUBST:' ),
- 'safesubst' => array( '0', 'ס בטוח:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'הכללת מקור', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'ממוזער', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'ימין', 'right' ),
- 'img_left' => array( '1', 'שמ×ל', 'left' ),
- 'img_none' => array( '1', 'לל×', 'none' ),
- 'img_width' => array( '1', '$1 פיקסלי×', '$1px' ),
- 'img_center' => array( '1', 'מרכז', 'center', 'centre' ),
- 'img_framed' => array( '1', 'ממוסגר', 'מסגרת', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', '×œ× ×ž×ž×•×¡×’×¨', '×œ×œ× ×ž×¡×’×¨×ª', 'frameless' ),
- 'img_page' => array( '1', 'דף=$1', 'דף $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'ימין למעלה', 'ימין למעלה=$1', 'ימין למעלה $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'גבולות', 'גבול', 'border' ),
- 'img_baseline' => array( '1', 'שורת הבסיס', 'baseline' ),
- 'img_sub' => array( '1', 'תחתי', 'sub' ),
- 'img_super' => array( '1', 'עילי', 'super', 'sup' ),
- 'img_top' => array( '1', 'למעלה', 'top' ),
- 'img_text_top' => array( '1', 'בר×ש הטקסט', 'text-top' ),
- 'img_middle' => array( '1', 'ב×מצע', 'middle' ),
- 'img_bottom' => array( '1', 'למטה', 'bottom' ),
- 'img_text_bottom' => array( '1', 'בתחתית הטקסט', 'text-bottom' ),
- 'img_link' => array( '1', 'קישור=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'טקסט=$1', 'alt=$1' ),
- 'int' => array( '0', 'הודעה:', 'INT:' ),
- 'sitename' => array( '1', '×©× ×”×תר', 'SITENAME' ),
- 'ns' => array( '0', 'מרחב ש×:', 'NS:' ),
- 'nse' => array( '0', 'מרחב ×©× ×ž×§×•×“×“:', 'NSE:' ),
- 'localurl' => array( '0', 'כתובת יחסית:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'כתובת יחסית מקודד:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'נתיב הדפי×', 'ARTICLEPATH' ),
- 'server' => array( '0', 'כתובת השרת', 'שרת', 'SERVER' ),
- 'servername' => array( '0', '×©× ×”×©×¨×ª', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'נתיב הקבצי×', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'נתיב הסגנון', 'STYLEPATH' ),
- 'grammar' => array( '0', 'דקדוק:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'מגדר:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__לל×_המרת_כותרת__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__לל×_המרת_תוכן__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'שבוע נוכחי', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'מספר ×™×•× × ×•×›×—×™', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'שבוע מקומי', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'מספר ×™×•× ×ž×§×•×ž×™', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'מזהה גרסה', 'REVISIONID' ),
- 'revisionday' => array( '1', '×™×•× ×’×¨×¡×”', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', '×™×•× ×’×¨×¡×” 2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'חודש גרסה', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'חודש גרסה 1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'שנת גרסה', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'זמן גרסה', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'כותב גרסה', 'REVISIONUSER' ),
- 'plural' => array( '0', 'רבי×:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'כתובת מל××”:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'כתובת מל××” מקודד:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', '×ות ר×שונה קטנה:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', '×ות ר×שונה גדולה:', 'UCFIRST:' ),
- 'lc' => array( '0', '×ותיות קטנות:', 'LC:' ),
- 'uc' => array( '0', '×ותיות גדולות:', 'UC:' ),
- 'raw' => array( '0', '×œ×œ× ×¢×™×‘×•×“:', 'RAW:' ),
- 'displaytitle' => array( '1', 'כותרת תצוגה', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', '×œ×œ× ×¤×¡×™×§', 'R' ),
- 'newsectionlink' => array( '1', '__יצירת_הערה__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__לל×_יצירת_הערה__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'גרסה נוכחית', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'נתיב מקודד:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'עוגן מקודד:', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'זמן נוכחי', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'זמן מקומי', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'סימן כיווניות', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#שפה:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'שפת תוכן', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', '×“×¤×™× ×‘×ž×¨×—×‘ הש×:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'מספר מפעילי×', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'עיצוב מספר', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ריפוד משמ×ל', 'PADLEFT' ),
- 'padright' => array( '0', 'ריפוד מימין', 'PADRIGHT' ),
- 'special' => array( '0', 'מיוחד', 'special' ),
- 'defaultsort' => array( '1', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'נתיב לקובץ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'תגית', 'tag' ),
- 'hiddencat' => array( '1', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', '×“×¤×™× ×‘×§×˜×’×•×¨×™×”', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'גודל דף', 'PAGESIZE' ),
- 'index' => array( '1', '__לחיפוש__', '__INDEX__' ),
- 'noindex' => array( '1', '__ל×_לחיפוש__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'מספר בקבוצה', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__הפניה_קבועה__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'רמת הגנה', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'עיצוב ת×ריך', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'נתיב', 'PATH' ),
- 'url_wiki' => array( '0', 'ויקי', 'WIKI' ),
- 'url_query' => array( '0', 'ש×ילתה', 'QUERY' ),
+ 'redirect' => array( '0', '#הפניה', '#REDIRECT' ),
+ 'notoc' => array( '0', '__לל×_תוכן_×¢× ×™×™× ×™×__', '__לל×_תוכן__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__לל×_גלריה__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__חייב_תוכן_×¢× ×™×™× ×™×__', '__חייב_תוכן__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__לל×_עריכה__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__לל×_כותרת__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'חודש נוכחי', 'חודש נוכחי 2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'חודש נוכחי 1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', '×©× ×—×•×“×© נוכחי', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', '×©× ×—×•×“×© נוכחי קניין', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'קיצור חודש נוכחי', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', '×™×•× × ×•×›×—×™', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', '×™×•× × ×•×›×—×™ 2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', '×©× ×™×•× × ×•×›×—×™', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'שנה נוכחית', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'שעה נוכחית', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'שעות נוכחיות', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'חודש מקומי', 'חודש מקומי 2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'חודש מקומי 1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', '×©× ×—×•×“×© מקומי', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', '×©× ×—×•×“×© מקומי קניין', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'קיצור חודש מקומי', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', '×™×•× ×ž×§×•×ž×™', 'LOCALDAY' ),
+ 'localday2' => array( '1', '×™×•× ×ž×§×•×ž×™ 2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', '×©× ×™×•× ×ž×§×•×ž×™', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'שנה מקומית', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'שעה מקומית', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'שעות מקומיות', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'מספר ×“×¤×™× ×›×•×œ×œ', 'מספר דפי×', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'מספר קבצי×', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'מספר משתמשי×', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'מספר ×ž×©×ª×ž×©×™× ×¤×¢×™×œ×™×', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'מספר עריכות', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'מספר צפיות', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', '×©× ×”×“×£', 'PAGENAME' ),
+ 'pagenamee' => array( '1', '×©× ×”×“×£ מקודד', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'מרחב הש×', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'מרחב ×”×©× ×ž×§×•×“×“', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'מרחב הנוש×', 'מרחב הערכי×', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'מרחב ×”× ×•×©× ×ž×§×•×“×“', 'מרחב ×”×¢×¨×›×™× ×ž×§×•×“×“', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', '×©× ×”×“×£ המל×', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', '×©× ×”×“×£ ×”×ž×œ× ×ž×§×•×“×“', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', '×©× ×“×£ המשנה', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', '×©× ×“×£ המשנה מקודד', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', '×©× ×“×£ הבסיס', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', '×©× ×“×£ הבסיס מקודד', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', '×©× ×“×£ השיחה', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', '×©× ×“×£ השיחה מקודד', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', '×©× ×“×£ הנוש×', '×©× ×”×¢×¨×š', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', '×©× ×“×£ ×”× ×•×©× ×ž×§×•×“×“', '×©× ×”×¢×¨×š מקודד', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'הכללה:', 'MSG:' ),
+ 'subst' => array( '0', 'ס:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'ס בטוח:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'הכללת מקור', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'ממוזער', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'ימין', 'right' ),
+ 'img_left' => array( '1', 'שמ×ל', 'left' ),
+ 'img_none' => array( '1', 'לל×', 'none' ),
+ 'img_width' => array( '1', '$1 פיקסלי×', '$1px' ),
+ 'img_center' => array( '1', 'מרכז', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'ממוסגר', 'מסגרת', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', '×œ× ×ž×ž×•×¡×’×¨', '×œ×œ× ×ž×¡×’×¨×ª', 'frameless' ),
+ 'img_page' => array( '1', 'דף=$1', 'דף $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'ימין למעלה', 'ימין למעלה=$1', 'ימין למעלה $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'גבולות', 'גבול', 'border' ),
+ 'img_baseline' => array( '1', 'שורת הבסיס', 'baseline' ),
+ 'img_sub' => array( '1', 'תחתי', 'sub' ),
+ 'img_super' => array( '1', 'עילי', 'super', 'sup' ),
+ 'img_top' => array( '1', 'למעלה', 'top' ),
+ 'img_text_top' => array( '1', 'בר×ש הטקסט', 'text-top' ),
+ 'img_middle' => array( '1', 'ב×מצע', 'middle' ),
+ 'img_bottom' => array( '1', 'למטה', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'בתחתית הטקסט', 'text-bottom' ),
+ 'img_link' => array( '1', 'קישור=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'טקסט=$1', 'alt=$1' ),
+ 'int' => array( '0', 'הודעה:', 'INT:' ),
+ 'sitename' => array( '1', '×©× ×”×תר', 'SITENAME' ),
+ 'ns' => array( '0', 'מרחב ש×:', 'NS:' ),
+ 'nse' => array( '0', 'מרחב ×©× ×ž×§×•×“×“:', 'NSE:' ),
+ 'localurl' => array( '0', 'כתובת יחסית:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'כתובת יחסית מקודד:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'נתיב הדפי×', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'מזהה הדף', 'PAGEID' ),
+ 'server' => array( '0', 'כתובת השרת', 'שרת', 'SERVER' ),
+ 'servername' => array( '0', '×©× ×”×©×¨×ª', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'נתיב הקבצי×', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'נתיב הסגנון', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'דקדוק:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'מגדר:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__לל×_המרת_כותרת__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__לל×_המרת_תוכן__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'שבוע נוכחי', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'מספר ×™×•× × ×•×›×—×™', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'שבוע מקומי', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'מספר ×™×•× ×ž×§×•×ž×™', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'מזהה גרסה', 'REVISIONID' ),
+ 'revisionday' => array( '1', '×™×•× ×’×¨×¡×”', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', '×™×•× ×’×¨×¡×” 2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'חודש גרסה', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'חודש גרסה 1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'שנת גרסה', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'זמן גרסה', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'כותב גרסה', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'רבי×:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'כתובת מל××”:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'כתובת מל××” מקודד:', 'FULLURLE:' ),
+ 'canonicalurl' => array( '0', 'כתובת קנונית:', 'CANONICALURL:' ),
+ 'canonicalurle' => array( '0', 'כתובת קנונית מקודד:', 'CANONICALURLE:' ),
+ 'lcfirst' => array( '0', '×ות ר×שונה קטנה:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', '×ות ר×שונה גדולה:', 'UCFIRST:' ),
+ 'lc' => array( '0', '×ותיות קטנות:', 'LC:' ),
+ 'uc' => array( '0', '×ותיות גדולות:', 'UC:' ),
+ 'raw' => array( '0', '×œ×œ× ×¢×™×‘×•×“:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'כותרת תצוגה', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', '×œ×œ× ×¤×¡×™×§', 'R' ),
+ 'newsectionlink' => array( '1', '__יצירת_הערה__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__לל×_יצירת_הערה__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'גרסה נוכחית', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'נתיב מקודד:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'עוגן מקודד:', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'זמן נוכחי', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'זמן מקומי', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'סימן כיווניות', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#שפה:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'שפת תוכן', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', '×“×¤×™× ×‘×ž×¨×—×‘ הש×:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'מספר מפעילי×', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'עיצוב מספר', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ריפוד משמ×ל', 'PADLEFT' ),
+ 'padright' => array( '0', 'ריפוד מימין', 'PADRIGHT' ),
+ 'special' => array( '0', 'מיוחד', 'special' ),
+ 'defaultsort' => array( '1', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'נתיב לקובץ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'תגית', 'tag' ),
+ 'hiddencat' => array( '1', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', '×“×¤×™× ×‘×§×˜×’×•×¨×™×”', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'גודל דף', 'PAGESIZE' ),
+ 'index' => array( '1', '__לחיפוש__', '__INDEX__' ),
+ 'noindex' => array( '1', '__ל×_לחיפוש__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'מספר בקבוצה', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__הפניה_קבועה__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'רמת הגנה', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'עיצוב ת×ריך', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'נתיב', 'PATH' ),
+ 'url_wiki' => array( '0', 'ויקי', 'WIKI' ),
+ 'url_query' => array( '0', 'ש×ילתה', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', '×œ×œ× ×©×’×™××”', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', '×œ×œ× ×”×—×œ×¤×”', 'noreplace' ),
);
$specialPageAliases = array(
@@ -221,6 +227,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'הודעות_המערכת' ),
'Allpages' => array( 'כל_הדפי×' ),
'Ancientpages' => array( 'דפי×_מוזנחי×' ),
+ 'Badtitle' => array( 'כותרת_שגויה' ),
'Blankpage' => array( 'דף_ריק' ),
'Block' => array( 'חסימה', 'חסימת_כתובת', 'חסימת_משתמש' ),
'Blockme' => array( 'חסו×_×ותי' ),
@@ -245,6 +252,7 @@ $specialPageAliases = array(
'Filepath' => array( 'נתיב_לקובץ' ),
'Import' => array( 'ייבו×', 'ייבו×_דפי×' ),
'Invalidateemail' => array( 'ביטול_דו×ר' ),
+ 'JavaScriptTest' => array( 'בדיקת_JavaScript' ),
'BlockList' => array( 'רשימת_חסומי×', 'רשימת_משתמשי×_חסומי×', 'משתמשי×_חסומי×' ),
'LinkSearch' => array( 'חיפוש_קישורי×_חיצוניי×' ),
'Listadmins' => array( 'רשימת_מפעילי×' ),
@@ -272,6 +280,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'ההעל×ות_שלי' ),
'Newimages' => array( 'קבצי×_חדשי×', 'תמונות_חדשות', 'גלריית_קבצי×_חדשי×', 'גלריית_תמונות_חדשות' ),
'Newpages' => array( 'דפי×_חדשי×' ),
+ 'PasswordReset' => array( '×יפוס_סיסמה' ),
'PermanentLink' => array( 'קישור_קבוע' ),
'Popularpages' => array( 'הדפי×_הנצפי×_ביותר', 'דפי×_פופולריי×' ),
'Preferences' => array( 'העדפות', 'ההעדפות_שלי' ),
@@ -339,8 +348,8 @@ $namespaceAliases = array(
'שיחת_תמונה' => NS_FILE_TALK,
);
$namespaceGenderAliases = array(
- NS_USER => array( 'female' => 'משתמשת' ),
- NS_USER_TALK => array( 'female' => 'שיחת_משתמשת' ),
+ NS_USER => array( 'male' => 'משתמש', 'female' => 'משתמשת' ),
+ NS_USER_TALK => array( 'male' => 'שיחת_משתמש', 'female' => 'שיחת_משתמשת' ),
);
$messages = array(
@@ -607,6 +616,7 @@ $1',
'ok' => '×ישור',
'pagetitle' => '$1 – {{SITENAME}}',
+'backlinksubtitle' => '→ $1',
'retrievedfrom' => 'מקור: $1',
'youhavenewmessages' => 'יש לך $1 ($2).',
'newmessageslink' => 'הודעות חדשות',
@@ -703,21 +713,23 @@ $1',
'badarticleerror' => '×œ× × ×™×ª×Ÿ לבצע פעולה זו בדף ×–×”.',
'cannotdelete' => '×œ× × ×™×ª×Ÿ ×”×™×” למחוק ×ת הדף ×ו הקובץ "$1".
ייתכן ×©×”×•× × ×ž×—×§ כבר על ידי מישהו ×חר.',
+'cannotdelete-title' => '×œ× × ×™×ª×Ÿ למחוק ×ת הדף "$1"',
'badtitle' => 'כותרת שגויה',
'badtitletext' => 'כותרת הדף המבוקש הייתה בלתי־תקינה, ריקה, ×ו קישור שגוי לשפה ×חרת ×ו ×œ×ž×™×–× ×חר.
ייתכן ×©×”×™× ×ž×›×™×œ×” תו ×חד ×ו יותר ש×ינו יכול לשמש בכותרות.',
-'perfcached' => 'המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור של המידע, ועשוי ×©×œ× ×œ×”×™×•×ª מעודכן.',
-'perfcachedts' => 'המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור של המידע, שעודכן ל×חרונה ב־$1.',
+'perfcached' => 'המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור בזיכרון המטמון של המידע, ועשוי ×©×œ× ×œ×”×™×•×ª מעודכן. לכל היותר {{PLURAL:$1|תוצ××” ×חת נשמרת|$1 תוצ×ות נשמרות}} בזיכרון המטמון.',
+'perfcachedts' => 'המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור בזיכרון המטמון של המידע, שעודכן ל×חרונה ב־$1. לכל היותר {{PLURAL:$4|תוצ××” ×חת נשמרת|$4 תוצ×ות נשמרות}} בזיכרון המטמון.',
'querypage-no-updates' => '×”×¢×“×›×•× ×™× ×œ×“×£ ×–×” כרגע מופסקי×, והמידע ×œ× ×™×¢×•×“×›×Ÿ ב×ופן שוטף.',
'wrong_wfQuery_params' => '×”×¤×¨×ž×˜×¨×™× ×©×”×•×–× ×• ל־wfQuery()‎ ××™× × × ×›×•× ×™×:<br />
פונקציה: $1<br />
ש×ילתה: $2',
'viewsource' => 'הצגת מקור',
-'viewsourcefor' => 'לדף $1',
+'viewsource-title' => 'הצגת המקור של $1',
'actionthrottled' => 'הפעולה הוגבלה',
'actionthrottledtext' => '×›×מצעי נגד ספ××, ××™× ×›× ×ž×•×¨×©×™× ×œ×‘×¦×¢ פעולה זו ×¤×¢×ž×™× ×¨×‘×•×ª מדי בזמן קצר. ×× × × ×¡×• שוב בעוד מספר דקות.',
'protectedpagetext' => 'דף ×–×” מוגן ×•×œ× × ×™×ª×Ÿ לערוך ×ותו.',
'viewsourcetext' => 'ב××¤×©×¨×•×ª×›× ×œ×¦×¤×•×ª בטקסט המקור של הדף ולהעתיקו:',
+'viewyourtext' => "ב××¤×©×¨×•×ª×›× ×œ×¦×¤×•×ª בטקסט המקור של '''העריכות שלכ×''' של הדף ולהעתיקו:",
'protectedinterface' => 'דף ×–×” ×”×•× ×חד מסדרת ×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה, ומוגן כדי למנוע השחתות.',
'editinginterface' => "'''×זהרה:''' הדף ש××ª× ×¢×•×¨×›×™× ×”×•× ×חד ×”×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה.
×©×™× ×•×™×™× ×‘×“×£ ×–×” ישפיעו על תצוגת ממשק המשתמש של ×ž×©×ª×ž×©×™× ×חרי×.",
@@ -824,6 +836,7 @@ $2',
'emailconfirmlink' => '×ישור כתובת הדו×"ל שלך',
'invalidemailaddress' => 'כתובת הדו×"ל ××™× ×” מתקבלת כיוון שנר××” ×©×”×™× ×‘×¤×•×¨×ž×˜ ×œ× × ×›×•×Ÿ.
×× × ×”×§×œ×™×“×• כתובת תקינה ×ו הש×ירו ×ת השדה ריק.',
+'cannotchangeemail' => '×œ× × ×™×ª×Ÿ לשנות ×ת כתובות הדו×"ל של חשבונות ב×תר ויקי ×–×”.',
'accountcreated' => 'החשבון נוצר',
'accountcreatedtext' => 'חשבון המשתמש $1 נוצר.',
'createaccount-title' => 'יצירת חשבון ב{{grammar:תחילית|{{SITENAME}}}}',
@@ -839,6 +852,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'שגי××” ×œ× ×™×“×•×¢×” בפונקציה mail()‎ של PHP',
+'user-mail-no-addy' => 'ניסיון לשלוח דו×"ל ×œ×œ× ×›×ª×•×‘×ª דו×"ל',
# Change password dialog
'resetpass' => 'שינוי סיסמה',
@@ -860,16 +874,18 @@ $2',
'resetpass-temp-password' => 'סיסמה זמנית:',
# Special:PasswordReset
-'passwordreset' => '×יפוס סיסמה',
-'passwordreset-text' => 'מל×ו טופס ×–×” כדי לקבל דו×ר ×לקטרוני ובו תזכורת של פרטי החשבון.',
-'passwordreset-legend' => '×יפוס סיסמה',
-'passwordreset-disabled' => '×יפוסי סיסמה בוטלו ב×תר ויקי ×–×”.',
-'passwordreset-pretext' => '{{PLURAL:$1||הקלידו ×חד מפריטי המידע למטה}}',
-'passwordreset-username' => '×©× ×ž×©×ª×ž×©:',
-'passwordreset-domain' => 'תחו×:',
-'passwordreset-email' => 'כתובת דו×"ל:',
-'passwordreset-emailtitle' => 'פרטי חשבון ב{{grammar:תחילית|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'מישהו (ככל הנר××” ×ת×, מכתובת ×”Ö¾IP מספר $1) ביקש תזכורת של פרטי
+'passwordreset' => '×יפוס סיסמה',
+'passwordreset-text' => 'מל×ו טופס ×–×” כדי לקבל דו×ר ×לקטרוני ובו תזכורת של פרטי החשבון.',
+'passwordreset-legend' => '×יפוס סיסמה',
+'passwordreset-disabled' => '×יפוסי סיסמה בוטלו ב×תר ויקי ×–×”.',
+'passwordreset-pretext' => '{{PLURAL:$1||הקלידו ×חד מפריטי המידע למטה}}',
+'passwordreset-username' => '×©× ×ž×©×ª×ž×©:',
+'passwordreset-domain' => 'תחו×:',
+'passwordreset-capture' => 'לצפות בדו×"ל הנשלח?',
+'passwordreset-capture-help' => '×× ×ª×¡×ž× ×• תיבה זו, הדו×ר ×”×לקטרוני (יחד ×¢× ×”×¡×™×¡×ž×” הזמנית) יוצג ×œ×›× ×‘×ž×§×‘×™×œ לשליחתו למשתמש.',
+'passwordreset-email' => 'כתובת דו×"ל:',
+'passwordreset-emailtitle' => 'פרטי חשבון ב{{grammar:תחילית|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'מישהו (ככל הנר××” ×ת×, מכתובת ×”Ö¾IP מספר $1) ביקש תזכורת של פרטי
החשבון ×©×œ×›× ×‘{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הב×|חשבונות המשתמש הב××™×}}
×©×™×™×›×™× ×œ×›×ª×•×‘×ª הדו×ר ×”×לקטרוני הזו:
@@ -879,7 +895,7 @@ $2
×¢×œ×™×›× ×œ×”×™×›× ×¡ ולבחור סיסמה חדשה עכשיו. ×× ×ž×™×©×”×• ×חר ביצע בקשה זו, ×ו ×©× ×–×›×¨×ª× ×‘×¡×™×¡×ž×ª×›×
המקורית ו××™× ×›× ×¨×•×¦×™× ×¢×•×“ לשנות ×ותה, ב××¤×©×¨×•×ª×›× ×œ×”×ª×¢×œ× ×ž×”×•×“×¢×” זו ולהמשיך להשתמש בסיסמה
הישנה.',
-'passwordreset-emailtext-user' => 'המשתמש $1 ב{{grammar:תחילית|{{SITENAME}}}} ביקש תזכורת של פרטי
+'passwordreset-emailtext-user' => 'המשתמש $1 ב{{grammar:תחילית|{{SITENAME}}}} ביקש תזכורת של פרטי
החשבון ×©×œ×›× ×‘{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הב×|חשבונות המשתמש הב××™×}}
×©×™×™×›×™× ×œ×›×ª×•×‘×ª הדו×ר ×”×לקטרוני הזו:
@@ -889,9 +905,22 @@ $2
×¢×œ×™×›× ×œ×”×™×›× ×¡ ולבחור סיסמה חדשה עכשיו. ×× ×ž×™×©×”×• ×חר ביצע בקשה זו, ×ו ×©× ×–×›×¨×ª× ×‘×¡×™×¡×ž×ª×›×
המקורית ו××™× ×›× ×¨×•×¦×™× ×¢×•×“ לשנות ×ותה, ב××¤×©×¨×•×ª×›× ×œ×”×ª×¢×œ× ×ž×”×•×“×¢×” זו ולהמשיך להשתמש בסיסמה
הישנה.',
-'passwordreset-emailelement' => '×©× ×ž×©×ª×ž×©: $1
+'passwordreset-emailelement' => '×©× ×ž×©×ª×ž×©: $1
סיסמה זמנית: $2',
-'passwordreset-emailsent' => 'נשלח דו×ר ×לקטרוני ×¢× ×ª×–×›×•×¨×ª.',
+'passwordreset-emailsent' => 'נשלח דו×ר ×לקטרוני ×¢× ×ª×–×›×•×¨×ª.',
+'passwordreset-emailsent-capture' => 'נשלח דו×ר ×לקטרוני ×¢× ×ª×–×›×•×¨×ª, ×•×”×•× ×ž×•×¦×’ להלן.',
+'passwordreset-emailerror-capture' => 'נוצר דו×ר ×לקטרוני ×¢× ×ª×–×›×•×¨×ª, ×•×”×•× ×ž×•×¦×’ להלן, ×ך שליחתו למשתמש נכשלה: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'שינוי כתובת דו×"ל',
+'changeemail-header' => 'שינוי כתוב דו×"ל של חשבון',
+'changeemail-text' => 'מל×ו טופס ×–×” כדי לשנות ×ת כתובת הדו×ר ×”×לקטרוני שלכ×. ×™×”×™×” ×¢×œ×™×›× ×œ×ž×œ× ×¡×™×¡×ž×” כדי ל×שר ×ת השינוי.',
+'changeemail-no-info' => '×¢×œ×™×›× ×œ×”×™×›× ×¡ לחשבון כדי לגשת לדף ×–×” ישירות.',
+'changeemail-oldemail' => 'כתובת דו×"ל נוכחית:',
+'changeemail-newemail' => 'כתובת דו×"ל חדשה:',
+'changeemail-none' => '(×ין)',
+'changeemail-submit' => 'שינוי כתובת הדו×"ל',
+'changeemail-cancel' => 'ביטול',
# Edit page toolbar
'bold_sample' => 'טקסט מודגש',
@@ -957,9 +986,6 @@ $2
כתובת ×”Ö¾IP ×©×œ×›× ×”×™× $3, ומספר החסימה ×©×œ×›× ×”×•× #$5.
×× × ×¦×™×™× ×• ×ת כל ×”×¤×¨×˜×™× ×”×œ×œ×• בכל פנייה למפעילי המערכת.',
'blockednoreason' => '×œ× × ×™×ª× ×” סיבה',
-'blockedoriginalsource' => "טקסט המקור של '''$1''' מוצג למטה:",
-'blockededitsource' => "הטקסט של '''העריכות שלך''' לדף '''$1''' מוצג למטה:",
-'whitelistedittitle' => 'כניסה לחשבון נדרשת לעריכה',
'whitelistedittext' => '×¢×œ×™×›× $1 כדי לערוך דפי×.',
'confirmedittext' => '×¢×œ×™×›× ×œ×מת ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתוכלו לערוך דפי×. ×× × ×”×’×“×™×¨×• ו×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×‘×מצעות [[Special:Preferences|העדפות המשתמש]] שלכ×.',
'nosuchsectiontitle' => 'הפסקה ×œ× × ×ž×¦××”',
@@ -1044,7 +1070,7 @@ $2
'yourdiff' => 'הבדלי×',
'copyrightwarning' => "'''שימו לב:''' ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}} ×ª×¤×•×¨×¡× ×ª×—×ª תנ××™ הרישיון $2 (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על ידי ×חרי×, שתופץ לעיני כל, וש××—×¨×™× ×™×•×›×œ×• להעתיק ממנה בציון המקור – ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על ידי זכויות יוצרי×. '''×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!'''",
'copyrightwarning2' => "'''שימו לב:''' ×ª×•×¨×ž×™× ××—×¨×™× ×¢×©×•×™×™× ×œ×¢×¨×•×š ×ו ××£ להסיר ×ת ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}}. ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על ידי ×חרי×, ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על ידי זכויות ×™×•×¦×¨×™× (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). '''×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!'''",
-'longpageerror' => "'''שגי××”: הטקסט ×©×©×œ×—×ª× ×”×•× ×‘×ורך $1 קילובייטי×, ×ך ×סור לו להיות ×רוך יותר ×ž×”×ž×§×¡×™×ž×•× ×©×œ $2 קילובייטי×.'''
+'longpageerror' => "'''שגי××”: הטקסט ×©×©×œ×—×ª× ×”×•× ×‘×ורך {{PLURAL:$1|קילובייט ×חד|$1 קילובייטי×}}, ×ך ×סור לו להיות ×רוך יותר ×ž×”×ž×§×¡×™×ž×•× ×©×œ {{PLURAL:$2|קילובייט ×חד|$2 קילובייטי×}}.'''
×œ× × ×™×ª×Ÿ לשומרו.",
'readonlywarning' => "'''×זהרה: בסיס ×”× ×ª×•× ×™× × × ×¢×œ לצורך תחזוקה. בזמן ×–×” ××™ ×פשר לשמור ×ת הטקסט הערוך.'''
ב××¤×©×¨×•×ª×›× ×œ×”×¢×ª×™×§ ולהדביק ×ת הטקסט לתוך קובץ טקסט ולשמור ×ותו עד שתיגמר הנעילה.
@@ -1211,8 +1237,6 @@ $2
'revdelete-unsuppress' => 'הסרת הגבלות בגרס×ות המשוחזרות',
'revdelete-log' => 'סיבה:',
'revdelete-submit' => 'ביצוע על {{PLURAL:$1|הגרסה שנבחרה|הגרס×ות שנבחרו}}',
-'revdelete-logentry' => 'שינה ×ת הסתרת הגרסה של "[[$1]]"',
-'logdelete-logentry' => 'שינה ×ת הסתרת פעולת היומן של "[[$1]]"',
'revdelete-success' => "'''מצב הסתרת הגרסה עודכן בהצלחה.'''",
'revdelete-failure' => "'''×œ× × ×™×ª×Ÿ ×”×™×” לעדכן ×ת מצב הסתרת הגרסה:'''
$1",
@@ -1224,15 +1248,6 @@ $1",
'revdel-restore-visible' => 'גרס×ות גלויות',
'pagehist' => 'היסטוריית הדף',
'deletedhist' => 'הגרס×ות המחוקות',
-'revdelete-content' => 'התוכן',
-'revdelete-summary' => 'תקציר העריכה',
-'revdelete-uname' => '×©× ×”×ž×©×ª×ž×©',
-'revdelete-restricted' => 'נוספו הגבלות למפעילי מערכת',
-'revdelete-unrestricted' => 'הוסרו הגבלות ממפעילי מערכת',
-'revdelete-hid' => 'הסתיר ×ת $1',
-'revdelete-unhid' => 'ביטל ×ת הסתרת $1',
-'revdelete-log-message' => '$1 עבור {{PLURAL:$2|גרסה ×חת|$2 גרס×ות}}',
-'logdelete-log-message' => '$1 עבור {{PLURAL:$2|×ירוע ×חד|$2 ×ירועי×}}',
'revdelete-hide-current' => 'שגי××” בהסתרת הפריט מת×ריך $2, $1: זו הגרסה הנוכחית.
×œ× × ×™×ª×Ÿ להסתיר ×ותה.',
'revdelete-show-no-access' => 'שגי××” בהצגת הפריט מת×ריך $2, $1: פריט ×–×” סומן ×›"מוגבל".
@@ -1392,12 +1407,14 @@ $1",
'prefs-rc' => '×©×™× ×•×™×™× ×חרוני×',
'prefs-watchlist' => 'רשימת המעקב',
'prefs-watchlist-days' => 'מספר ×”×™×ž×™× ×”×ž×¨×‘×™ שיוצגו ברשימת המעקב:',
-'prefs-watchlist-days-max' => 'לכל היותר 7 ימי×',
+'prefs-watchlist-days-max' => 'לכל היותר {{PLURAL:$1|×™×•× ×חד|$1 ימי×|יומיי×}}',
'prefs-watchlist-edits' => 'מספר העריכות המרבי שיוצגו ברשימת המעקב המורחבת:',
'prefs-watchlist-edits-max' => 'לכל היותר 1000',
'prefs-watchlist-token' => '×סימון לרשימת המעקב:',
'prefs-misc' => 'שונות',
'prefs-resetpass' => 'שינוי סיסמה',
+'prefs-changeemail' => 'שינוי כתובת דו×"ל',
+'prefs-setemail' => 'הגדרת כתובת דו×"ל',
'prefs-email' => '×פשרויות דו×"ל',
'prefs-rendering' => 'מר××”',
'saveprefs' => 'שמירת העדפות',
@@ -1457,6 +1474,7 @@ $1",
'yourrealname' => '×©× ×מיתי:',
'yourlanguage' => 'שפת הממשק:',
'yourvariant' => 'סוג הכתב בשפת התוכן:',
+'prefs-help-variant' => 'סוג הכתב המועדף להצגת דפי התוכן ב×תר ויקי ×–×”.',
'yournick' => 'חתימה:',
'prefs-help-signature' => 'על הודעות בדפי שיחה יש ×œ×—×ª×•× ×‘×מצעות הטקסט "<nowiki>~~~~</nowiki>", שיומר לחתימה ×©×œ×›× ×•×חריה ת×ריך ושעה.',
'badsig' => 'חתימה מסוגננת שגויה.
@@ -1499,7 +1517,7 @@ $1",
'userrights-lookup-user' => 'ניהול קבוצות משתמש',
'userrights-user-editname' => '×©× ×ž×©×ª×ž×©:',
'editusergroup' => 'עריכת קבוצות משתמשי×',
-'editinguser' => "שינוי הרש×ות המשתמש של '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "שינוי הרש×ות המשתמש של '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'עריכת קבוצות משתמש',
'saveusergroups' => 'שמירת קבוצות משתמש',
'userrights-groupsmember' => 'חבר בקבוצות:',
@@ -1593,13 +1611,13 @@ $1",
'right-autopatrol' => 'סימון ×וטומטי של עריכות של המשתמש כבדוקות',
'right-patrolmarks' => 'צפייה בסימוני עריכות בדוקות ×‘×©×™× ×•×™×™× ×”×חרוני×',
'right-unwatchedpages' => 'הצגת רשימה של ×“×¤×™× ×©××™× × ×‘×ž×¢×§×‘',
-'right-trackback' => 'שליחת טרקבק',
'right-mergehistory' => 'מיזוג היסטוריות של דפי×',
'right-userrights' => 'עריכת כל הרש×ות המשתמש',
'right-userrights-interwiki' => 'עריכת הרש×ות המשתמש של ×ž×©×ª×ž×©×™× ×‘×תרי ויקי ×חרי×',
'right-siteadmin' => 'נעילה וביטול נעילה של בסיס הנתוני×',
'right-override-export-depth' => '×™×™×¦×•× ×“×¤×™× ×›×•×œ×œ ×“×¤×™× ×ž×§×•×©×¨×™× ×¢×“ עומק של חמישה',
'right-sendemail' => 'שליחת דו×ר ×לקטרוני ×œ×ž×©×ª×ž×©×™× ×חרי×',
+'right-passwordreset' => 'צפייה בדו×ר ×לקטרוני של ×יפוס סיסמה',
# User rights log
'rightslog' => 'יומן תפקידי×',
@@ -1633,16 +1651,17 @@ $1",
'action-suppressionlog' => 'לצפות ביומן פרטי זה',
'action-block' => '×œ×—×¡×•× ×ž×©×ª×ž×© ×–×” מעריכה',
'action-protect' => 'לשנות ×ת רמת ×”×”×’× ×” על דף ×–×”',
+'action-rollback' => 'לשחזר במהירות ×ת עריכות המשתמש ×”×חרון שערך דף מסוי×',
'action-import' => '×œ×™×™×‘× ×“×£ ×–×” מ×תר ויקי ×חר',
'action-importupload' => '×œ×™×™×‘× ×“×£ ×–×” ב×מצעות העל×ת קובץ',
'action-patrol' => 'לסמן עריכות של ××—×¨×™× ×›×‘×“×•×§×•×ª',
'action-autopatrol' => 'לסמן ×ת עריכותיך כבדוקות',
'action-unwatchedpages' => 'לצפות ברשימת ×”×“×¤×™× ×©××™× × ×‘×ž×¢×§×‘',
-'action-trackback' => 'לשלוח טרקבק',
'action-mergehistory' => 'למזג ×ת ההיסטוריה של דף ×–×”',
'action-userrights' => 'לערוך ×ת כל הרש×ות המשתמש',
'action-userrights-interwiki' => 'לערוך ×ת ההרש×ות של ×ž×©×ª×ž×©×™× ×‘×תרי ויקי ×חרי×',
'action-siteadmin' => 'לנעול ×ו לבטל ×ת נעילת בסיס הנתוני×',
+'action-sendemail' => 'לשלוח דו×ר ×לקטרוני',
# Recent changes
'nchanges' => '{{PLURAL:$1|שינוי ×חד|$1 שינויי×}}',
@@ -1671,10 +1690,10 @@ $1",
'minoreditletter' => 'מ',
'newpageletter' => '×—',
'boteditletter' => 'ב',
-'sectionlink' => 'â†',
'number_of_watching_users_pageview' => '[{{PLURAL:$1|משתמש ×חד עוקב|$1 ×ž×©×ª×ž×©×™× ×¢×•×§×‘×™×}} ×חרי הדף]',
'rc_categories' => 'הגבלה לקטגוריות (יש להפריד ×¢× "|")',
'rc_categories_any' => 'הכול',
+'rc-change-size-new' => '{{PLURAL:$1|בית ×חד|$1 בתי×}} ל×חר השינוי',
'newsectionsummary' => '/* $1 */ פסקה חדשה',
'rc-enhanced-expand' => 'הצגת ×”×¤×¨×˜×™× (נדרש JavaScript)',
'rc-enhanced-hide' => 'הסתרת הפרטי×',
@@ -1684,7 +1703,6 @@ $1",
'recentchangeslinked-feed' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™×',
'recentchangeslinked-toolbox' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™×',
'recentchangeslinked-title' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×ž×”×“×£ $1',
-'recentchangeslinked-backlink' => '→ $1',
'recentchangeslinked-noresult' => '×œ× ×”×™×• ×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×‘×ª×§×•×¤×” זו.',
'recentchangeslinked-summary' => "בדף מיוחד ×–×” ×¨×©×•×ž×™× ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×ž×ª×•×š הדף (×ו ×‘×“×¤×™× ×”×›×œ×•×œ×™× ×‘×§×˜×’×•×¨×™×”).
×“×¤×™× ×‘[[Special:Watchlist|רשימת המעקב שלכ×]] ×ž×•×¦×’×™× ×‘'''הדגשה'''.",
@@ -1730,6 +1748,7 @@ $1",
'minlength1' => 'שמות ×§×‘×¦×™× ×¦×¨×™×›×™× ×œ×”×™×•×ª בני תו ×חד לפחות.',
'illegalfilename' => '×©× ×”×§×•×‘×¥ "$1" מכיל ×ª×•×•×™× ×©××™× × ×ž×•×ª×¨×™× ×‘×›×•×ª×¨×•×ª דפי×.
× × ×œ×©× ×•×ª ×ת ×”×©× ×•×œ× ×¡×•×ª להעלותו שנית.',
+'filename-toolong' => 'שמות ×§×‘×¦×™× ×œ× ×™×›×•×œ×™× ×œ×”×™×•×ª ××¨×•×›×™× ×žÖ¾240 בתי×.',
'badfilename' => '×©× ×”×§×•×‘×¥ שונה ל־"$1".',
'filetype-mime-mismatch' => 'סיומת הקובץ ".$1" ××™× ×” מת×ימה לסוג ×”Ö¾MIME ×©× ×ž×¦× ×œ×§×•×‘×¥ ×–×” ($2).',
'filetype-badmime' => '×œ× × ×™×ª×Ÿ להעלות ×§×‘×¦×™× ×©×¡×•×’ ×”Ö¾MIME ×©×œ×”× ×”×•× "$1".',
@@ -1839,6 +1858,41 @@ $1',
'upload-unknown-size' => 'גודל בלתי ידוע',
'upload-http-error' => 'התרחשה שגי×ת HTTPâ€: $1',
+# File backend
+'backend-fail-stream' => '×œ× ×”×™×™×ª×” ×פשרות ×œ×”×–×¨×™× ×ת הקובץ $1.',
+'backend-fail-backup' => '×œ× ×”×™×™×ª×” ×פשרות לגבות ×ת הקובץ $1.',
+'backend-fail-notexists' => 'הקובץ $1 ×ינו קיי×.',
+'backend-fail-hashes' => '×œ× ×”×™×™×ª×” ×פשרות לקבל גיבובי ×§×‘×¦×™× ×¢×‘×•×¨ ההשוו××”.',
+'backend-fail-notsame' => 'כבר ×§×™×™× ×§×•×‘×¥ ×œ× ×–×”×” ב־$1.',
+'backend-fail-invalidpath' => '$1 ×ינו נתיב ×חסון תקין.',
+'backend-fail-delete' => '×œ× ×”×¦×œ×™×—×” מחיקת הקובץ $1.',
+'backend-fail-alreadyexists' => 'הקובץ $1 כבר קיי×.',
+'backend-fail-store' => '×œ× ×”×™×™×ª×” ×פשרות ל×חסן ×ת הקובץ $1 ב־$2',
+'backend-fail-copy' => '×œ× ×”×™×™×ª×” ×פשרות להעתיק ×ת הקובץ $1 ×ל $2',
+'backend-fail-move' => '×œ× ×”×™×™×ª×” ×פשרות להעביר ×ת הקובץ $1 ×ל $2',
+'backend-fail-opentemp' => '×œ× ×”×™×™×ª×” ×פשרות לפתוח ×ת הקובץ הזמני.',
+'backend-fail-writetemp' => '×œ× ×”×™×™×ª×” ×פשרות לכתוב ×ל הקובץ הזמני.',
+'backend-fail-closetemp' => '×œ× ×”×™×™×ª×” ×פשרות לסגור ×ת הקובץ הזמני.',
+'backend-fail-read' => 'קרי×ת הקובץ $1 ×œ× ×”×¦×œ×™×—×”',
+'backend-fail-create' => 'יצירת הקובץ $1 ×œ× ×”×¦×œ×™×—×”',
+'backend-fail-readonly' => 'מ×גר ×”×חסון ×œ×§×‘×¦×™× "$1" ×”×•× ×›×¨×’×¢ במצב קרי××” בלבד. הסיבה שניתנה לכך ×”×™×: "$2"',
+'backend-fail-synced' => 'הקובץ "$1" × ×ž×¦× ×‘×ž×¦×‘ ×œ× ×¢×§×‘×™ בתוך מ×גרי ×חסון ×”×§×‘×¦×™× ×”×¤× ×™×ž×™×™×',
+'backend-fail-connect' => '×œ× × ×™×ª×Ÿ ×”×™×” להתחבר למ×גר ×חסון ×”×§×‘×¦×™× ×”×¤× ×™×ž×™ "$1".',
+'backend-fail-internal' => '×ירעה שגי××” בלתי־ידועה במ×גר ×חסון ×”×§×‘×¦×™× ×”×¤× ×™×ž×™ "$1".',
+'backend-fail-contenttype' => '×œ× × ×™×ª×Ÿ ×”×™×” לקבוע ×ת סוג התוכן של הקובץ ל×חסון ב־"$1".',
+'backend-fail-batchsize' => 'למ×גר ×חסון ×”×§×‘×¦×™× ×”×¤× ×™×ž×™ הועבר ×וסף של {{PLURAL:$1|פעולת קובץ ×חת|$1 פעולות קובץ}}; המגבלה ×”×™× {{PLURAL:$2|פעולה ×חת|$2 פעולות}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'פתיחת הנעילה של "$1" ×œ× ×”×¦×œ×™×—×”; ×”×•× ×œ× × ×¢×•×œ.',
+'lockmanager-fail-closelock' => '×œ× ×”×™×™×ª×” ×פשרות לסגור ×ת קובץ הנעילה עבור "$1".',
+'lockmanager-fail-deletelock' => '×œ× ×”×™×™×ª×” ×פשרות למחוק ×ת קובץ הנעילה עבור "$1".',
+'lockmanager-fail-acquirelock' => '×œ× ×”×™×™×ª×” ×פשרות לקבל נעילה עבור "$1".',
+'lockmanager-fail-openlock' => '×œ× ×”×™×™×ª×” ×פשרות לפתוח ×ת קובץ הנעילה עבור "$1".',
+'lockmanager-fail-releaselock' => '×œ× ×”×™×™×ª×” ×פשרות לשחרר ×ת הנעילה עבור "$1".',
+'lockmanager-fail-db-bucket' => '×œ× ×”×™×™×ª×” ×פשרות לקבל מספיק מסדי × ×ª×•× ×™× ×©×œ נעילות בדלי $1',
+'lockmanager-fail-db-release' => '×œ× ×”×™×™×ª×” ×פשרות לשחרר נעילות על מסד ×”× ×ª×•× ×™× $1',
+'lockmanager-fail-svr-release' => '×œ× ×”×™×™×ª×” ×פשרות לשחרר נעילות על השרת $1',
+
# ZipDirectoryReader
'zip-file-open-error' => '×ירעה שגי××” במהלך פתיחת הקובץ לבדיקות ZIP.',
'zip-wrong-format' => 'הקובץ שצוין ×ינו קובץ ZIP.',
@@ -1855,6 +1909,7 @@ $1',
'uploadstash-badtoken' => 'ביצוע הפעולה נכשל, ×ולי בגלל פקיעת תוקפו של ×סימון העריכה שלכ×. נסו שוב.',
'uploadstash-errclear' => 'מחיקת ×”×§×‘×¦×™× × ×›×©×œ×”.',
'uploadstash-refresh' => 'רענון רשימת הקבצי×',
+'invalid-chunk-offset' => 'היסט גוש ×œ× ×ª×§×™×Ÿ',
# img_auth script messages
'img-auth-accessdenied' => 'הגישה נדחתה',
@@ -1953,7 +2008,6 @@ $1',
# File reversion
'filerevert' => 'שחזור $1',
-'filerevert-backlink' => '→ $1',
'filerevert-legend' => 'שחזור קובץ',
'filerevert-intro' => "××ª× ×¢×•×ž×“×™× ×œ×©×—×–×¨ ×ת הקובץ '''[[Media:$1|$1]]''' ל[$4 גרסה מ־$3, $2].",
'filerevert-comment' => 'סיבה:',
@@ -1963,24 +2017,24 @@ $1',
'filerevert-badversion' => '×ין גרסה מקומית קודמת של הקובץ שהועלתה בת×ריך המבוקש.',
# File deletion
-'filedelete' => 'מחיקת $1',
-'filedelete-backlink' => '→ $1',
-'filedelete-legend' => 'מחיקת קובץ',
-'filedelete-intro' => "××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ ×ת הקובץ '''[[Media:$1|$1]]''' יחד ×¢× ×›×œ ההיסטוריה שלו.",
-'filedelete-intro-old' => "××ª× ×ž×•×—×§×™× ×ת הגרסה של '''[[Media:$1|$1]]''' מ־[$4 $3, $2].",
-'filedelete-comment' => 'סיבה:',
-'filedelete-submit' => 'מחיקה',
-'filedelete-success' => "'''$1''' נמחק.",
-'filedelete-success-old' => "הגרסה של '''[[Media:$1|$1]]''' מ־$3, $2 נמחקה.",
-'filedelete-nofile' => "'''$1''' ×ינו קיי×.",
-'filedelete-nofile-old' => "×ין גרסה ישנה של '''$1''' ×¢× ×”×ª×›×•× ×•×ª המבוקשות.",
-'filedelete-otherreason' => 'סיבה נוספת/×חרת:',
-'filedelete-reason-otherlist' => 'סיבה ×חרת',
-'filedelete-reason-dropdown' => '* סיבות מחיקה נפוצות
+'filedelete' => 'מחיקת $1',
+'filedelete-legend' => 'מחיקת קובץ',
+'filedelete-intro' => "××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ ×ת הקובץ '''[[Media:$1|$1]]''' יחד ×¢× ×›×œ ההיסטוריה שלו.",
+'filedelete-intro-old' => "××ª× ×ž×•×—×§×™× ×ת הגרסה של '''[[Media:$1|$1]]''' מ־[$4 $3, $2].",
+'filedelete-comment' => 'סיבה:',
+'filedelete-submit' => 'מחיקה',
+'filedelete-success' => "'''$1''' נמחק.",
+'filedelete-success-old' => "הגרסה של '''[[Media:$1|$1]]''' מ־$3, $2 נמחקה.",
+'filedelete-nofile' => "'''$1''' ×ינו קיי×.",
+'filedelete-nofile-old' => "×ין גרסה ישנה של '''$1''' ×¢× ×”×ª×›×•× ×•×ª המבוקשות.",
+'filedelete-otherreason' => 'סיבה נוספת/×חרת:',
+'filedelete-reason-otherlist' => 'סיבה ×חרת',
+'filedelete-reason-dropdown' => '* סיבות מחיקה נפוצות
** הפרת זכויות יוצרי×
** קובץ כפול',
-'filedelete-edit-reasonlist' => 'עריכת סיבות המחיקה',
-'filedelete-maintenance' => '×פשרות המחיקה והשחזור של ×§×‘×¦×™× ×ž×‘×•×˜×œ×ª זמנית עקב פעולת תחזוקה.',
+'filedelete-edit-reasonlist' => 'עריכת סיבות המחיקה',
+'filedelete-maintenance' => '×פשרות המחיקה והשחזור של ×§×‘×¦×™× ×ž×‘×•×˜×œ×ª זמנית עקב פעולת תחזוקה.',
+'filedelete-maintenance-title' => '×œ× × ×™×ª×Ÿ למחוק ×ת הקובץ',
# MIME search
'mimesearch' => 'חיפוש MIME',
@@ -2078,6 +2132,8 @@ $1',
'wantedpages' => '×“×¤×™× ×ž×‘×•×§×©×™×',
'wantedpages-badtitle' => 'כותרת בלתי תקינה ברשימת התוצ×ות: $1',
'wantedfiles' => '×§×‘×¦×™× ×ž×‘×•×§×©×™×',
+'wantedfiletext-cat' => '×”×§×‘×¦×™× ×”×‘××™× × ×ž×¦××™× ×‘×©×™×ž×•×©, ×ך ××™× × ×§×™×™×ž×™×. ייתכן ×©×§×‘×¦×™× ×ž×ž××’×¨×™× ×—×™×¦×•× ×™×™× ×™×”×™×• ×¨×©×•×ž×™× ××£ על פי ×©×”× ×§×™×™×ž×™×, ×ך שגי×ות ×›×לה יהיו <del>מחוקות</del>. בנוסף, ×“×¤×™× ×©×ž×©×ª×ž×©×™× ×‘×§×‘×¦×™× ×©××™× × ×§×™×™×ž×™× ×¨×©×•×ž×™× ×‘×“×£ [[:$1]].',
+'wantedfiletext-nocat' => '×”×§×‘×¦×™× ×”×‘××™× × ×ž×¦××™× ×‘×©×™×ž×•×©, ×ך ××™× × ×§×™×™×ž×™×. ייתכן ×©×§×‘×¦×™× ×ž×ž××’×¨×™× ×—×™×¦×•× ×™×™× ×™×”×™×• ×¨×©×•×ž×™× ××£ על פי ×©×”× ×§×™×™×ž×™×, ×ך שגי×ות ×›×לה יהיו <del>מחוקות</del>.',
'wantedtemplates' => 'תבניות מבוקשות',
'mostlinked' => '×”×“×¤×™× ×”×ž×§×•×©×¨×™× ×‘×™×•×ª×¨',
'mostlinkedcategories' => 'הקטגוריות המקושרות ביותר',
@@ -2086,6 +2142,7 @@ $1',
'mostimages' => '×”×§×‘×¦×™× ×”×ž×§×•×©×¨×™× ×‘×™×•×ª×¨',
'mostrevisions' => '×”×“×¤×™× ×‘×¢×œ×™ מספר העריכות הגבוה ביותר',
'prefixindex' => 'רשימת ×”×“×¤×™× ×”×ž×ª×—×™×œ×™× ×‘â€¦',
+'prefixindex-namespace' => 'רשימת ×”×“×¤×™× ×”×ž×ª×—×™×œ×™× ×‘â€¦ (במרחב ×”×©× $1)',
'shortpages' => '×“×¤×™× ×§×¦×¨×™×',
'longpages' => '×“×¤×™× ×רוכי×',
'deadendpages' => '×“×¤×™× ×œ×œ× ×§×™×©×•×¨×™×',
@@ -2197,12 +2254,8 @@ $1',
'activeusers-noresult' => '×œ× × ×ž×¦×ו משתמשי×.',
# Special:Log/newusers
-'newuserlogpage' => 'יומן ×¨×™×©×•× ×ž×©×ª×ž×©×™×',
-'newuserlogpagetext' => 'זהו יומן המכיל הרשמות של משתמשי×.',
-'newuserlog-byemail' => 'הסיסמה נשלחה בדו×"ל',
-'newuserlog-create-entry' => 'חשבון משתמש חדש',
-'newuserlog-create2-entry' => 'יצר חשבון חדש $1',
-'newuserlog-autocreate-entry' => 'חשבון שנוצר ×וטומטית',
+'newuserlogpage' => 'יומן ×¨×™×©×•× ×ž×©×ª×ž×©×™×',
+'newuserlogpagetext' => 'זהו יומן המכיל הרשמות של משתמשי×.',
# Special:ListGroupRights
'listgrouprights' => 'רשימת הרש×ות לקבוצה',
@@ -2231,7 +2284,7 @@ $1',
'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דו×ר ×לקטרוני למשתמש ×–×”.
כתובת הדו×ר ×”×לקטרוני ×©×›×ª×‘×ª× ×‘[[Special:Preferences|העדפות המשתמש שלכ×]] תופיע ככתובת ממנה נשלחה ההודעה, כדי ל×פשר תגובה ישירה למכתב.',
'usermailererror' => '×ובייקט הדו×ר החזיר שגי××”:',
-'defemailsubject' => 'דו×"ל {{SITENAME}}',
+'defemailsubject' => 'דו×"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש "$1"',
'usermaildisabled' => 'שליחת דו×"ל ×œ×ž×©×ª×ž×©×™× ×ž×‘×•×˜×œ×ª',
'usermaildisabledtext' => '××™× ×›× ×¨×©××™× ×œ×©×œ×•×— דו×ר ×לקטרוני ×œ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×תר ×–×”',
'noemailtitle' => '×ין כתובת דו×ר ×לקטרוני',
@@ -2286,7 +2339,7 @@ $1',
'watchmethod-list' => 'בודק ×ת העריכות ×”×חרונות ×‘×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב',
'watchlistcontains' => 'רשימת המעקב כוללת {{PLURAL:$1|דף ×חד|$1 דפי×}}.',
'iteminvalidname' => 'בעיה ×¢× $1, ×©× ×©×’×•×™â€¦',
-'wlnote' => "להלן {{PLURAL:$1|השינוי ×”×חרון|'''$1''' ×”×©×™× ×•×™×™× ×”×חרוני×}} {{PLURAL:$2|בשעה ×”×חרונה|ב־'''$2''' השעות ×”×חרונות}}.",
+'wlnote' => "להלן {{PLURAL:$1|השינוי ×”×חרון|'''$1''' ×”×©×™× ×•×™×™× ×”×חרוני×}} {{PLURAL:$2|בשעה ×”×חרונה|ב־'''$2''' השעות ×”×חרונות}}, עד $4, $3.",
'wlshowlast' => '(הצגת $1 שעות ×חרונות | $2 ×™×ž×™× ××—×¨×•× ×™× | $3)',
'watchlist-options' => '×פשרויות ברשימת המעקב',
@@ -2342,7 +2395,6 @@ $UNWATCHURL
'exbeforeblank' => 'תוכן לפני שרוקן היה: "$1"',
'exblank' => 'הדף היה ריק',
'delete-confirm' => 'מחיקת $1',
-'delete-backlink' => '→ $1',
'delete-legend' => 'מחיקה',
'historywarning' => "'''×זהרה:''' לדף ש××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ יש היסטוריית ×©×™× ×•×™×™× ×©×œ בערך {{PLURAL:$1|גרסה ×חת|$1 גרס×ות}}:",
'confirmdeletetext' => '××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ דף יחד ×¢× ×›×œ ההיסטוריה שלו.
@@ -2352,8 +2404,6 @@ $UNWATCHURL
'actionfailed' => 'הפעולה נכשלה',
'deletedtext' => '"$1" נמחק.
ר×ו $2 לרשימת המחיקות ×”×חרונות.',
-'deletedarticle' => 'מחק ×ת [[$1]]',
-'suppressedarticle' => 'הסתיר ×ת [[$1]]',
'dellogpage' => 'יומן מחיקות',
'dellogpagetext' => 'להלן רשימה של המחיקות ×”×חרונות שבוצעו.',
'deletionlog' => 'יומן מחיקות',
@@ -2399,8 +2449,10 @@ $UNWATCHURL
'unprotectedarticle' => 'ביטל ×ת ×”×”×’× ×” על [[$1]]',
'movedarticleprotection' => 'העביר ×ת הגדרות ×”×”×’× ×” מ"[[$2]]" ל"[[$1]]"',
'protect-title' => 'שינוי רמת ההגנה של "$1"',
+'protect-title-notallowed' => 'הצגת רמת ההגנה של "$1"',
'prot_1movedto2' => '[[$1]] הועבר ל[[$2]]',
-'protect-backlink' => '→ $1',
+'protect-badnamespace-title' => 'מרחב ×©× ×©×‘×• ×œ× × ×™×ª×Ÿ להגן על דפי×',
+'protect-badnamespace-text' => '×œ× × ×™×ª×Ÿ להגן על ×“×¤×™× ×‘×ž×¨×—×‘ ×©× ×–×”.',
'protect-legend' => '×ישור הפעלת ×”×”×’× ×”',
'protectcomment' => 'סיבה:',
'protectexpiry' => 'פקיעת ההגנה:',
@@ -2421,6 +2473,7 @@ $UNWATCHURL
'protect-level-sysop' => 'מפעילי מערכת בלבד',
'protect-summary-cascade' => 'מדורג',
'protect-expiring' => 'פוקעת $1 (UTC)',
+'protect-expiring-local' => 'פוקעת $1',
'protect-expiry-indefinite' => 'בלתי מוגבלת בזמן',
'protect-cascade' => '×”×’× ×” על כל ×”×“×¤×™× ×”×ž×•×›×œ×œ×™× ×‘×“×£ ×–×” (×”×’× ×” מדורגת)',
'protect-cantedit' => '××™× ×›× ×™×›×•×œ×™× ×œ×©× ×•×ª ×ת רמת ×”×”×’× ×” על דף ×–×”, כיוון ש×ין ×œ×›× ×”×¨×©××” לערוך ×ותו.',
@@ -2477,7 +2530,6 @@ $UNWATCHURL
'undeletereset' => '×יפוס',
'undeleteinvert' => 'הפיכת הבחירה',
'undeletecomment' => 'סיבה:',
-'undeletedarticle' => 'שחזר ×ת [[$1]]',
'undeletedrevisions' => '{{PLURAL:$1|שוחזרה גרסה ×חת|שוחזרו $1 גרס×ות}}',
'undeletedrevisions-files' => 'שחזר {{PLURAL:$1|גרסה ×חת|$1 גרס×ות}} ו{{PLURAL:$2|קובץ ×חד|Ö¾$2 קבצי×}}',
'undeletedfiles' => 'שחזר {{PLURAL:$1|קובץ ×חד|$1 קבצי×}}',
@@ -2486,6 +2538,7 @@ $UNWATCHURL
ר×ו ×ת [[Special:Log/delete|יומן המחיקות]] לרשימה של מחיקות ×•×©×—×–×•×¨×™× ×חרוני×.",
'undelete-header' => 'ר×ו ×ת [[Special:Log/delete|יומן המחיקות]] ×œ×“×¤×™× ×©× ×ž×—×§×• ל×חרונה.',
+'undelete-search-title' => 'חיפוש ×“×¤×™× ×©× ×ž×—×§×•',
'undelete-search-box' => 'חיפוש ×“×¤×™× ×©× ×ž×—×§×•',
'undelete-search-prefix' => 'הצגת ×“×¤×™× ×”×—×œ מ:',
'undelete-search-submit' => 'חיפוש',
@@ -2494,6 +2547,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'שחזור גרסת הקובץ מהת×ריך $1 נכשל: הקובץ ×”×™×” חסר לפני המחיקה.',
'undelete-cleanup-error' => 'שגי×ת בעת מחיקת קובץ ×”×רכיון "$1" ש×ינו בשימוש.',
'undelete-missing-filearchive' => 'שחזור קובץ ×”×רכיון שמספרו $1 נכשל כיוון ×©×”×•× ×ינו בבסיס הנתוני×. ייתכן ×©×”×•× ×›×‘×¨ שוחזר.',
+'undelete-error' => 'שגי××” בשחזור דף',
'undelete-error-short' => 'שגי××” בשחזור הקובץ: $1',
'undelete-error-long' => 'שגי×ות ש×ירעו בעת שחזור הקובץ:
@@ -2541,7 +2595,6 @@ $1',
'whatlinkshere' => '×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
'whatlinkshere-title' => '×“×¤×™× ×”×ž×§×©×¨×™× ×œ×“×£ $1',
'whatlinkshere-page' => 'דף:',
-'whatlinkshere-backlink' => '→ $1',
'linkshere' => "×”×“×¤×™× ×©×œ×”×œ×Ÿ ×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]''':",
'nolinkshere' => "×ין ×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]'''.",
'nolinkshere-ns' => "×ין ×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]''' במרחב ×”×©× ×©× ×‘×—×¨.",
@@ -2617,6 +2670,7 @@ $1',
'blocklist-userblocks' => 'הסתרת חסימת חשבונות',
'blocklist-tempblocks' => 'הסתרת חסימות זמניות',
'blocklist-addressblocks' => 'הסתרת חסימות IP בודד',
+'blocklist-rangeblocks' => 'הסתרת חסימות טווחי×',
'blocklist-timestamp' => 'זמן',
'blocklist-target' => 'יעד',
'blocklist-expiry' => 'פקיעה',
@@ -2639,6 +2693,7 @@ $1',
'unblocklink' => 'שחרור חסימה',
'change-blocklink' => 'שינוי חסימה',
'contribslink' => 'תרומות',
+'emaillink' => 'שליחת דו×"ל',
'autoblocker' => '× ×—×¡×ž×ª× ×‘×ופן ×וטומטי ×ž×©×•× ×©××ª× ×—×•×œ×§×™× ×ת כתובת ×”Ö¾IP ×©×œ×›× ×¢× [[User:$1|$1]]. הנימוק לחסימה: "$2".',
'blocklogpage' => 'יומן חסימות',
'blocklog-showlog' => 'משתמש ×–×” × ×—×¡× ×‘×¢×‘×¨. יומן החסימות מוצג למטה:',
@@ -2762,9 +2817,6 @@ $1',
'movepage-page-moved' => 'הדף $1 הועבר ×œ×©× $2.',
'movepage-page-unmoved' => '×œ× × ×™×ª×Ÿ להעביר ×ת הדף $1 ×œ×©× $2.',
'movepage-max-pages' => '{{PLURAL:$1|דף ×חד כבר הועבר|$1 ×“×¤×™× ×›×‘×¨ הועברו}}. ×–×” המספר המרבי ×•×œ× × ×™×ª×Ÿ להעביר ×“×¤×™× × ×•×¡×¤×™× ×וטומטית.',
-'1movedto2' => 'הדף [[$1]] הועבר לדף [[$2]]',
-'1movedto2_redir' => 'הדף [[$1]] הועבר לדף [[$2]] ×‘×ž×§×•× ×”×¤× ×™×”',
-'move-redirect-suppressed' => '×œ× × ×•×¦×¨×” הפניה',
'movelogpage' => 'יומן העברות',
'movelogpagetext' => 'להלן רשימה של כל ×”×“×¤×™× ×©×”×•×¢×‘×¨×•.',
'movesubpage' => '{{PLURAL:$1|דף משנה|דפי משנה}}',
@@ -2776,7 +2828,7 @@ $1',
'delete_and_move_text' => '== בקשת מחיקה ==
דף היעד, [[:$1]], כבר קיי×. ×”×× ×‘×¨×¦×•× ×›× ×œ×ž×—×•×§ ×ותו כדי ל×פשר ×ת ההעברה?',
'delete_and_move_confirm' => '×ישור מחיקת הדף',
-'delete_and_move_reason' => 'מחיקה כדי ל×פשר העברה',
+'delete_and_move_reason' => 'מחיקה כדי ל×פשר העברה מ[[$1]]',
'selfmove' => 'כותרות המקור והיעד זהות; ×œ× × ×™×ª×Ÿ להעביר דף לעצמו.',
'immobile-source-namespace' => '×œ× × ×™×ª×Ÿ להעביר ×“×¤×™× ×‘×ž×¨×—×‘ ×”×©× "$1"',
'immobile-target-namespace' => '×œ× × ×™×ª×Ÿ להעביר ×“×¤×™× ×œ×ž×¨×—×‘ ×”×©× "$1"',
@@ -2806,9 +2858,11 @@ $1',
כדי ×œ×™×™×¦× ×“×¤×™×, הקישו ×ת ×©×ž×•×ª×™×”× ×‘×ª×™×‘×ª הטקסט שלהלן, כל ×©× ×‘×©×•×¨×” נפרדת, ובחרו ×”×× ×œ×™×™×¦× ×’× ×ת הגרסה הנוכחית ×•×’× ×ת היסטוריית ×”×©×™× ×•×™×™× ×©×œ הדפי×, ×ו רק ×ת הגרסה הנוכחית ×¢× ×ž×™×“×¢ על העריכה ×”×חרונה.
בנוסף, ניתן להשתמש בקישור, כגון [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] לדף [[{{MediaWiki:Mainpage}}]] ×œ×œ× ×”×™×¡×˜×•×¨×™×™×ª ×”×©×™× ×•×™×™× ×©×œ×•.',
+'exportall' => '×™×™×¦×•× ×›×œ הדפי×',
'exportcuronly' => 'לכלול רק ×ת הגרסה הנוכחית, ×œ×œ× ×›×œ ההיסטוריה',
'exportnohistory' => "----
'''הערה:''' ×™×™×¦×•× ×”×”×™×¡×˜×•×¨×™×” המל××” של ×“×¤×™× ×“×¨×š טופס ×–×” הופסקה עקב בעיות ביצועי×.",
+'exportlistauthors' => 'הכללת רשימה מל××” של ×”×ª×•×¨×ž×™× ×œ×›×œ הדף',
'export-submit' => 'ייצו×',
'export-addcattext' => 'הוספת ×“×¤×™× ×ž×”×§×˜×’×•×¨×™×”:',
'export-addcat' => 'הוספה',
@@ -2842,6 +2896,8 @@ $1',
'thumbnail_error' => 'שגי××” ביצירת תמונה ממוזערת: $1',
'djvu_page_error' => 'דף ה־DjVu מחוץ לטווח',
'djvu_no_xml' => '×œ× × ×™×ª×Ÿ ×”×™×” לקבל ×ת ×”Ö¾XML עבור קובץ ×”Ö¾DjVu',
+'thumbnail-temp-create' => '×œ× ×”×¦×œ×™×—×” יצירת קובץ תמונה ממוזערת זמני',
+'thumbnail-dest-create' => '×œ× ×”×™×™×ª×” ×פשרות לשמור ×ת התמונה הממוזערת ×ל יעדה',
'thumbnail_invalid_params' => '×¤×¨×ž×˜×¨×™× ×©×’×•×™×™× ×œ×ª×ž×•× ×” הממוזערת',
'thumbnail_dest_directory' => '×œ× × ×™×ª×Ÿ ×”×™×” ליצור ×ת תיקיית היעד',
'thumbnail_image-type' => 'סוג התמונה ×ינו נתמך',
@@ -2887,6 +2943,11 @@ $1',
'import-token-mismatch' => 'מידע הכניסה ×בד.
× × ×œ× ×¡×•×ª שוב.',
'import-invalid-interwiki' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ž×תר הוויקי שציינת×.',
+'import-error-edit' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ש×ין לך הרש××” לערוך ×ותו.',
+'import-error-create' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ש×ין לך הרש××” ליצור ×ותו.',
+'import-error-interwiki' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ששמו שמור לקישור חיצוני (בין־ויקי).',
+'import-error-special' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ×©×”×•× ×©×™×™×š למרחב ×©× ×ž×™×•×—×“ ×©×œ× ×™×›×•×œ להכיל דפי×.',
+'import-error-invalid' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ששמו ×ינו תקין.',
# Import log
'importlogpage' => 'יומן ייבו×',
@@ -2896,73 +2957,86 @@ $1',
'import-logentry-interwiki' => '×™×™×‘× ×ת $1 ×‘×™×™×‘×•× ×‘×™×ŸÖ¾×תרי',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|גרסה ×חת|$1 גרס×ות}} של הדף $2',
+# JavaScriptTest
+'javascripttest' => 'בדיקת JavaScript',
+'javascripttest-disabled' => '×פשרות זו מבוטלת.',
+'javascripttest-title' => 'הרצת בדיקות $1',
+'javascripttest-pagetext-noframework' => 'דף זה שמור להרצת בדיקות JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'סביבת הבדיקות "$1" ××™× ×” ידועה.',
+'javascripttest-pagetext-frameworks' => '× × ×œ×‘×—×•×¨ ×חת מסביבות הבדיקות הב×ות: $1',
+'javascripttest-pagetext-skins' => 'בחירת עיצוב ש×יתו יורצו הבדיקות:',
+'javascripttest-qunit-intro' => 'ר×ו ×ת [$1 תיעוד הבדיקות] ב×תר mediawiki.org.',
+'javascripttest-qunit-heading' => 'מערך בדיקות QUnit ל־JavaScript של מדיה־ויקי',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'דף המשתמש שלכ×',
-'tooltip-pt-anonuserpage' => 'דף המשתמש של משתמש ×נונימי ×–×”',
-'tooltip-pt-mytalk' => 'דף השיחה שלכ×',
-'tooltip-pt-anontalk' => 'שיחה על תרומות המשתמש ×”×נונימי',
-'tooltip-pt-preferences' => 'ההעדפות שלכ×',
-'tooltip-pt-watchlist' => 'רשימת ×”×“×¤×™× ×©××ª× ×¢×•×§×‘×™× ×חרי ×”×©×™× ×•×™×™× ×‘×”×',
-'tooltip-pt-mycontris' => 'רשימת התרומות שלכ×',
-'tooltip-pt-login' => 'מומלץ להירש×, ×ך ×ין חובה לעשות כן',
-'tooltip-pt-anonlogin' => 'מומלץ להירש×, ×ך ×ין חובה לעשות כן',
-'tooltip-pt-logout' => 'יצי××” מהחשבון',
-'tooltip-ca-talk' => 'שיחה על דף זה',
-'tooltip-ca-edit' => 'ב××¤×©×¨×•×ª×›× ×œ×¢×¨×•×š דף ×–×”. ×× × ×”×©×ª×ž×©×• בלחצן "תצוגה מקדימה" לפני השמירה',
-'tooltip-ca-addsection' => 'הוספת פסקה חדשה',
-'tooltip-ca-viewsource' => 'הדף הזה מוגן.
+'tooltip-pt-userpage' => 'דף המשתמש שלכ×',
+'tooltip-pt-anonuserpage' => 'דף המשתמש של משתמש ×נונימי ×–×”',
+'tooltip-pt-mytalk' => 'דף השיחה שלכ×',
+'tooltip-pt-anontalk' => 'שיחה על תרומות המשתמש ×”×נונימי',
+'tooltip-pt-preferences' => 'ההעדפות שלכ×',
+'tooltip-pt-watchlist' => 'רשימת ×”×“×¤×™× ×©××ª× ×¢×•×§×‘×™× ×חרי ×”×©×™× ×•×™×™× ×‘×”×',
+'tooltip-pt-mycontris' => 'רשימת התרומות שלכ×',
+'tooltip-pt-login' => 'מומלץ להירש×, ×ך ×ין חובה לעשות כן',
+'tooltip-pt-anonlogin' => 'מומלץ להירש×, ×ך ×ין חובה לעשות כן',
+'tooltip-pt-logout' => 'יצי××” מהחשבון',
+'tooltip-ca-talk' => 'שיחה על דף זה',
+'tooltip-ca-edit' => 'ב××¤×©×¨×•×ª×›× ×œ×¢×¨×•×š דף ×–×”. ×× × ×”×©×ª×ž×©×• בלחצן "תצוגה מקדימה" לפני השמירה',
+'tooltip-ca-addsection' => 'הוספת פסקה חדשה',
+'tooltip-ca-viewsource' => 'הדף הזה מוגן.
ב××¤×©×¨×•×ª×›× ×œ×¦×¤×•×ª בטקסט המקור שלו',
-'tooltip-ca-history' => 'גרס×ות קודמות של דף ×–×”',
-'tooltip-ca-protect' => 'הגנה על דף זה',
-'tooltip-ca-unprotect' => 'שינוי ההגנה על דף זה',
-'tooltip-ca-delete' => 'מחיקת דף זה',
-'tooltip-ca-undelete' => 'שחזור עריכות שנעשו בדף זה לפני שנמחק',
-'tooltip-ca-move' => 'העברת דף זה',
-'tooltip-ca-watch' => 'הוספת דף זה לרשימת המעקב',
-'tooltip-ca-unwatch' => 'הסרת דף זה מרשימת המעקב',
-'tooltip-search' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}}',
-'tooltip-search-go' => 'מעבר לדף ×‘×©× ×”×–×” בדיוק, ×× ×”×•× ×§×™×™×',
-'tooltip-search-fulltext' => 'חיפוש טקסט ×–×” בדפי×',
-'tooltip-p-logo' => 'ביקור בעמוד הר×שי',
-'tooltip-n-mainpage' => 'ביקור בעמוד הר×שי',
-'tooltip-n-mainpage-description' => 'ביקור בעמוד הר×שי',
-'tooltip-n-portal' => '×ודות המיז×, ×יך תוכלו לעזור, ×יפה ×œ×ž×¦×•× ×“×‘×¨×™×',
-'tooltip-n-currentevents' => 'מצי×ת מידע רקע על ×”××™×¨×•×¢×™× ×”×חרוני×',
-'tooltip-n-recentchanges' => 'רשימת ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר',
-'tooltip-n-randompage' => 'צפייה בדף תוכן ×קר××™',
-'tooltip-n-help' => 'עזרה בשימוש ב×תר',
-'tooltip-t-whatlinkshere' => 'רשימת כל ×”×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
-'tooltip-t-recentchangeslinked' => '×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
-'tooltip-feed-rss' => 'הזנת RSS עבור דף זה',
-'tooltip-feed-atom' => 'הזנת Atom עבור דף זה',
-'tooltip-t-contributions' => 'תרומותיו של משתמש זה',
-'tooltip-t-emailuser' => 'שליחת דו×ר ×לקטרוני למשתמש ×–×”',
-'tooltip-t-upload' => 'העל×ת קבצי×',
-'tooltip-t-specialpages' => 'רשימת כל ×”×“×¤×™× ×”×ž×™×•×—×“×™×',
-'tooltip-t-print' => 'גרסה להדפסה של דף זה',
-'tooltip-t-permalink' => 'קישור קבוע לגרסה זו של הדף',
-'tooltip-ca-nstab-main' => 'צפייה בדף התוכן',
-'tooltip-ca-nstab-user' => 'צפייה בדף המשתמש',
-'tooltip-ca-nstab-media' => 'צפייה בפריט המדיה',
-'tooltip-ca-nstab-special' => 'זהו דף מיוחד, ××™ ×פשר לערוך ×ותו',
-'tooltip-ca-nstab-project' => 'צפייה בדף המיז×',
-'tooltip-ca-nstab-image' => 'צפייה בדף הקובץ',
-'tooltip-ca-nstab-mediawiki' => 'צפייה בהודעת המערכת',
-'tooltip-ca-nstab-template' => 'צפייה בתבנית',
-'tooltip-ca-nstab-help' => 'צפייה בדף העזרה',
-'tooltip-ca-nstab-category' => 'צפייה בדף הקטגוריה',
-'tooltip-minoredit' => 'סימון עריכה זו כמשנית',
-'tooltip-save' => 'שמירת ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª×',
-'tooltip-preview' => 'תצוגה מקדימה, ×× × ×”×©×ª×ž×©×• ב×פשרות זו לפני השמירה!',
-'tooltip-diff' => 'צפייה ×‘×©×™× ×•×™×™× ×©×¢×¨×›×ª× ×‘×˜×§×¡×˜',
-'tooltip-compareselectedversions' => 'צפייה בהשוו×ת שתי גרס×ות של דף ×–×”',
-'tooltip-watch' => 'הוספת דף זה לרשימת המעקב',
-'tooltip-recreate' => 'יצירת הדף מחדש למרות ×©×”×•× × ×ž×—×§',
-'tooltip-upload' => 'התחלת ההעל××”',
-'tooltip-rollback' => 'שחזור בלחיצה ×חת של העריכה ×ו העריכות של ×”×ª×•×¨× ×”×חרון לדף ×–×”',
-'tooltip-undo' => 'פתיחת חלון העריכה במצב תצוגה מקדימה כדי לשחזר ×ת העריכה, תוך ×פשרות להוספת סיבה בתקציר העריכה',
-'tooltip-preferences-save' => 'שמירת ההעדפות',
-'tooltip-summary' => 'להכנסת תקציר קצר',
+'tooltip-ca-history' => 'גרס×ות קודמות של דף ×–×”',
+'tooltip-ca-protect' => 'הגנה על דף זה',
+'tooltip-ca-unprotect' => 'שינוי ההגנה על דף זה',
+'tooltip-ca-delete' => 'מחיקת דף זה',
+'tooltip-ca-undelete' => 'שחזור עריכות שנעשו בדף זה לפני שנמחק',
+'tooltip-ca-move' => 'העברת דף זה',
+'tooltip-ca-watch' => 'הוספת דף זה לרשימת המעקב',
+'tooltip-ca-unwatch' => 'הסרת דף זה מרשימת המעקב',
+'tooltip-search' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}}',
+'tooltip-search-go' => 'מעבר לדף ×‘×©× ×”×–×” בדיוק, ×× ×”×•× ×§×™×™×',
+'tooltip-search-fulltext' => 'חיפוש טקסט ×–×” בדפי×',
+'tooltip-p-logo' => 'ביקור בעמוד הר×שי',
+'tooltip-n-mainpage' => 'ביקור בעמוד הר×שי',
+'tooltip-n-mainpage-description' => 'ביקור בעמוד הר×שי',
+'tooltip-n-portal' => '×ודות המיז×, ×יך תוכלו לעזור, ×יפה ×œ×ž×¦×•× ×“×‘×¨×™×',
+'tooltip-n-currentevents' => 'מצי×ת מידע רקע על ×”××™×¨×•×¢×™× ×”×חרוני×',
+'tooltip-n-recentchanges' => 'רשימת ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר',
+'tooltip-n-randompage' => 'צפייה בדף תוכן ×קר××™',
+'tooltip-n-help' => 'עזרה בשימוש ב×תר',
+'tooltip-t-whatlinkshere' => 'רשימת כל ×”×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
+'tooltip-t-recentchangeslinked' => '×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
+'tooltip-feed-rss' => 'הזנת RSS עבור דף זה',
+'tooltip-feed-atom' => 'הזנת Atom עבור דף זה',
+'tooltip-t-contributions' => 'תרומותיו של משתמש זה',
+'tooltip-t-emailuser' => 'שליחת דו×ר ×לקטרוני למשתמש ×–×”',
+'tooltip-t-upload' => 'העל×ת קבצי×',
+'tooltip-t-specialpages' => 'רשימת כל ×”×“×¤×™× ×”×ž×™×•×—×“×™×',
+'tooltip-t-print' => 'גרסה להדפסה של דף זה',
+'tooltip-t-permalink' => 'קישור קבוע לגרסה זו של הדף',
+'tooltip-ca-nstab-main' => 'צפייה בדף התוכן',
+'tooltip-ca-nstab-user' => 'צפייה בדף המשתמש',
+'tooltip-ca-nstab-media' => 'צפייה בפריט המדיה',
+'tooltip-ca-nstab-special' => 'זהו דף מיוחד, ××™ ×פשר לערוך ×ותו',
+'tooltip-ca-nstab-project' => 'צפייה בדף המיז×',
+'tooltip-ca-nstab-image' => 'צפייה בדף הקובץ',
+'tooltip-ca-nstab-mediawiki' => 'צפייה בהודעת המערכת',
+'tooltip-ca-nstab-template' => 'צפייה בתבנית',
+'tooltip-ca-nstab-help' => 'צפייה בדף העזרה',
+'tooltip-ca-nstab-category' => 'צפייה בדף הקטגוריה',
+'tooltip-minoredit' => 'סימון עריכה זו כמשנית',
+'tooltip-save' => 'שמירת ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª×',
+'tooltip-preview' => 'תצוגה מקדימה, ×× × ×”×©×ª×ž×©×• ב×פשרות זו לפני השמירה!',
+'tooltip-diff' => 'צפייה ×‘×©×™× ×•×™×™× ×©×¢×¨×›×ª× ×‘×˜×§×¡×˜',
+'tooltip-compareselectedversions' => 'צפייה בהשוו×ת שתי גרס×ות של דף ×–×”',
+'tooltip-watch' => 'הוספת דף זה לרשימת המעקב',
+'tooltip-watchlistedit-normal-submit' => 'הסרת הדפי×',
+'tooltip-watchlistedit-raw-submit' => 'עדכון רשימת המעקב',
+'tooltip-recreate' => 'יצירת הדף מחדש למרות ×©×”×•× × ×ž×—×§',
+'tooltip-upload' => 'התחלת ההעל××”',
+'tooltip-rollback' => 'שחזור בלחיצה ×חת של העריכה ×ו העריכות של ×”×ª×•×¨× ×”×חרון לדף ×–×”',
+'tooltip-undo' => 'פתיחת חלון העריכה במצב תצוגה מקדימה כדי לשחזר ×ת העריכה, תוך ×פשרות להוספת סיבה בתקציר העריכה',
+'tooltip-preferences-save' => 'שמירת ההעדפות',
+'tooltip-summary' => 'להכנסת תקציר קצר',
# Stylesheets
'common.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על כל ×”×¢×™×¦×•×‘×™× */',
@@ -3061,9 +3135,6 @@ $1',
# Patrol log
'patrol-log-page' => 'יומן ×©×™× ×•×™×™× ×‘×“×•×§×™×',
'patrol-log-header' => 'יומן ×–×” מציג גרס×ות שנבדקו.',
-'patrol-log-line' => 'סימן ×ת $1 בדף $2 כבדוקה $3',
-'patrol-log-auto' => '(×וטומטית)',
-'patrol-log-diff' => 'הגרסה $1',
'log-show-hide-patrol' => '$1 יומן ×©×™× ×•×™×™× ×‘×“×•×§×™×',
# Image deletion
@@ -3090,11 +3161,11 @@ $1',
'file-info' => 'גודל הקובץ: $1, סוג MIMEâ€: $2',
'file-info-size' => '<span dir="ltr">$1 × $2</span> פיקסלי×, גודל הקובץ: $3, סוג MIMEâ€: $4',
'file-info-size-pages' => '<span dir="ltr">$1 × $2</span> פיקסלי×, גודל הקובץ: $3, סוג MIMEâ€: $4, {{PLURAL:$5|דף ×חד|$5 דפי×}}',
-'file-nohires' => '<small>×ין גרסת רזולוציה גבוהה יותר.</small>',
+'file-nohires' => '×ין גרסה ברזולוציה גבוהה יותר.',
'svg-long-desc' => 'קובץ SVG, הגודל המקורי: <span dir="ltr">$1 × $2</span> פיקסלי×, גודל הקובץ: $3',
'show-big-image' => 'תמונה ברזולוציה גבוהה יותר',
-'show-big-image-preview' => '<small>גודל תצוגה זו: $1.</small>',
-'show-big-image-other' => '<small>רזולוציות ×חרות: $1.</small>',
+'show-big-image-preview' => 'גודל תצוגה זו: $1.',
+'show-big-image-other' => '{{PLURAL:$2|רזולוציה ×חרת|רזולוציות ×חרות}}: $1.',
'show-big-image-size' => '<span dir="ltr">$1 × $2</span> פיקסלי×',
'file-info-gif-looped' => 'בלול××”',
'file-info-gif-frames' => '{{PLURAL:$1|תמונה ×חת|$1 תמונות}}',
@@ -3114,6 +3185,13 @@ $1',
'bydate' => 'לפי ת×ריך',
'sp-newimages-showfrom' => 'הצגת ×§×‘×¦×™× ×—×“×©×™× ×”×—×œ מ־$2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
+'hours' => '{{PLURAL:$1|שעה|$1 שעות|שעתיי×}}',
+'days' => '{{PLURAL:$1|יו×|$1 ימי×|יומיי×}}',
+'ago' => 'לפני $1',
+
# Bad image list
'bad_image_list' => 'דרך הכתיבה בהודעה ×”×™× ×›×ž×ª×•×ר להלן:
@@ -3605,13 +3683,6 @@ $5
'scarytranscludefailed' => '[הכללת התבנית נכשלה בגלל $1]',
'scarytranscludetoolong' => '[כתובת ×”Ö¾URL ×רוכה מדי]',
-# Trackbacks
-'trackbackbox' => '×˜×¨×§×‘×§×™× ×œ×“×£ ×–×”:<br />
-$1',
-'trackbackremove' => '([$1 מחיקה])',
-'trackbacklink' => 'טרקבק',
-'trackbackdeleteok' => 'הטרקבק נמחק בהצלחה.',
-
# Delete conflict
'deletedwhileediting' => "'''×זהרה''': דף ×–×” נמחק ל×חר ×©×”×ª×—×œ×ª× ×œ×¢×¨×•×š!",
'confirmrecreate' => "הדף נמחק על ידי המשתמש [[User:$1|$1]] ([[User talk:$1|שיחה]]) ל×חר ×©×”×ª×—×œ×ª× ×œ×¢×¨×•×š ×ותו, מסיבה זו:
@@ -3657,10 +3728,15 @@ $1',
'autosumm-new' => 'יצירת דף ×¢× ×”×ª×•×›×Ÿ "$1"',
# Size units
-'size-bytes' => '$1 בייט',
-'size-kilobytes' => '$1 קילו־בייט',
-'size-megabytes' => '$1 מגה־בייט',
-'size-gigabytes' => "$1 ג'יגה־בייט",
+'size-bytes' => '$1 בייט',
+'size-kilobytes' => '$1 קילו־בייט',
+'size-megabytes' => '$1 מגה־בייט',
+'size-gigabytes' => "$1 ג'יגה־בייט",
+'size-terabytes' => '$1 טרה־בייט',
+'size-petabytes' => '$1 פטה־בייט',
+'size-exabytes' => '$1 ×קסה־בייט',
+'size-zetabytes' => '$1 זטה־בייט',
+'size-yottabytes' => '$1 יוטה־בייט',
# Live preview
'livepreview-loading' => 'בטעינה…',
@@ -3757,6 +3833,9 @@ $1',
'hebrew-calendar-m11-gen' => 'ב×ב',
'hebrew-calendar-m12-gen' => 'ב×לול',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|שיחה]])',
+
# Core parser functions
'unknown_extension_tag' => 'תגית בלתי ידועה: "$1"',
'duplicate-defaultsort' => '\'\'\'×זהרה:\'\'\' המיון הרגיל "$2" דורס ×ת המיון הרגיל ×”×ž×•×§×“× ×ž×ž× ×• "$1".',
@@ -3812,8 +3891,7 @@ $1',
'specialpages' => '×“×¤×™× ×ž×™×•×—×“×™×',
'specialpages-note' => '----
* ×“×¤×™× ×ž×™×•×—×“×™× ×¨×’×™×œ×™×.
-* <span class="mw-specialpagerestricted">×“×¤×™× ×ž×™×•×—×“×™× ×ž×•×’×‘×œ×™×.</span>
-* <span class="mw-specialpagecached">×“×¤×™× ×ž×™×•×—×“×™× ×”×ž×ª×§×‘×œ×™× ×ž×–×™×›×¨×•×Ÿ המטמון (×©×¢×œ×•×œ×™× ×œ×”×™×•×ª ×œ× ×ž×¢×•×“×›× ×™×).</span>',
+* <span class="mw-specialpagerestricted">×“×¤×™× ×ž×™×•×—×“×™× ×ž×•×’×‘×œ×™×.</span>',
'specialpages-group-maintenance' => 'דיווחי תחזוקה',
'specialpages-group-other' => '×“×¤×™× ×ž×™×•×—×“×™× ×חרי×',
'specialpages-group-login' => 'כניסה / הרשמה לחשבון',
@@ -3855,13 +3933,16 @@ $1',
'tags-hitcount' => '{{PLURAL:$1|שינוי ×חד|$1 שינויי×}}',
# Special:ComparePages
-'comparepages' => 'השוו×ת דפי×',
-'compare-selector' => 'השוו×ת גרס×ות של דפי×',
-'compare-page1' => 'דף 1',
-'compare-page2' => 'דף 2',
-'compare-rev1' => 'גרסה 1',
-'compare-rev2' => 'גרסה 2',
-'compare-submit' => 'השוו××”',
+'comparepages' => 'השוו×ת דפי×',
+'compare-selector' => 'השוו×ת גרס×ות של דפי×',
+'compare-page1' => 'דף 1',
+'compare-page2' => 'דף 2',
+'compare-rev1' => 'גרסה 1',
+'compare-rev2' => 'גרסה 2',
+'compare-submit' => 'השוו××”',
+'compare-invalid-title' => '×©× ×”×“×£ ×©×¦×™×™× ×ª× ×ינו תקין.',
+'compare-title-not-exists' => 'הדף ×©×¦×™×™× ×ª× ×ינו קיי×.',
+'compare-revision-not-exists' => 'הגרסה ×©×¦×™×™× ×ª× ××™× ×” קיימת.',
# Database error messages
'dberr-header' => 'בעיה בוויקי',
@@ -3888,4 +3969,90 @@ $1',
'sqlite-has-fts' => '$1 ×¢× ×ª×ž×™×›×” בחיפוש בטקסט מל×',
'sqlite-no-fts' => '$1 ×œ×œ× ×ª×ž×™×›×” בחיפוש בטקסט מל×',
+# New logging system
+'logentry-delete-delete' => '$1 מחק ×ת הדף $3',
+'logentry-delete-restore' => '$1 שחזר ×ת הדף $3',
+'logentry-delete-event' => '$1 שינה ×ת מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
+'logentry-delete-revision' => '$1 שינה ×ת מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרס×ות}} של הדף $3: $4',
+'logentry-delete-event-legacy' => '$1 שינה ×ת מצב התצוגה של פעולות יומן של $3',
+'logentry-delete-revision-legacy' => '$1 שינה ×ת מצב התצוגה של גרס×ות בדף $3',
+'logentry-suppress-delete' => '$1 הסתיר לחלוטין ×ת הדף $3',
+'logentry-suppress-event' => '$1 שינה בסודיות ×ת מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
+'logentry-suppress-revision' => '$1 שינה בסודיות ×ת מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרס×ות}} של הדף $3: $4',
+'logentry-suppress-event-legacy' => '$1 שינה בסודיות ×ת מצב התצוגה של פעולות יומן של $3',
+'logentry-suppress-revision-legacy' => '$1 שינה בסודיות ×ת מצב התצוגה של גרס×ות של הדף $3',
+'revdelete-content-hid' => 'התוכן הוסתר',
+'revdelete-summary-hid' => 'תקציר העריכה הוסתר',
+'revdelete-uname-hid' => '×©× ×”×ž×©×ª×ž×© הוסתר',
+'revdelete-content-unhid' => 'הסתרת התוכן בוטלה',
+'revdelete-summary-unhid' => 'הסתרת תקציר העריכה בוטלה',
+'revdelete-uname-unhid' => 'הסתרת ×©× ×”×ž×©×ª×ž×© בוטלה',
+'revdelete-restricted' => 'נוספו הגבלות למפעילי מערכת',
+'revdelete-unrestricted' => 'הוסרו הגבלות ממפעילי מערכת',
+'logentry-move-move' => '$1 העביר ×ת הדף $3 ל$4',
+'logentry-move-move-noredirect' => '$1 העביר ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להש×יר הפניה',
+'logentry-move-move_redir' => '$1 העביר ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה',
+'logentry-move-move_redir-noredirect' => '$1 העביר ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להש×יר הפניה',
+'logentry-patrol-patrol' => '$1 סימן ×ת הגרסה $4 בדף $3 כבדוקה',
+'logentry-patrol-patrol-auto' => '$1 סימן ×וטומטית ×ת הגרסה $4 בדף $3 כבדוקה',
+'logentry-newusers-newusers' => '$1 יצר חשבון משתמש',
+'logentry-newusers-create' => '$1 יצר חשבון משתמש',
+'logentry-newusers-create2' => '$1 יצר חשבון משתמש $3',
+'logentry-newusers-autocreate' => 'החשבון $1 נוצר ×וטומטית',
+'newuserlog-byemail' => 'הסיסמה נשלחה בדו×"ל',
+
+# Feedback
+'feedback-bugornote' => '×× ××ª× ×ž×•×›× ×™× ×œ×ª×ר בעיה טכנית בפרטי×, ×× × [$1 דווחו על ב××’].
+×חרת, תוכלו להשתמש בטופס הפשוט שלהלן. ×”×¢×¨×ª×›× ×ª×ª×•×•×¡×£ לדף "[$3 $2]", יחד ×¢× ×©× ×”×ž×©×ª×ž×© ×©×œ×›× ×•×”×“×¤×“×¤×Ÿ בו ××ª× ×ž×©×ª×ž×©×™×.',
+'feedback-subject' => 'נוש×:',
+'feedback-message' => 'הודעה:',
+'feedback-cancel' => 'ביטול',
+'feedback-submit' => 'שליחת משוב',
+'feedback-adding' => 'הוספת משוב לדף...',
+'feedback-error1' => 'שגי××”: תוצ××” ×œ× ×ž×–×•×”×” מה־API',
+'feedback-error2' => 'שגי××”: העריכה נכשלה',
+'feedback-error3' => 'שגי××”: ×ין תשובה מה־API',
+'feedback-thanks' => 'תודה! המשוב ×©×œ×›× ×¤×•×¨×¡× ×‘×“×£ "[$2 $1]".',
+'feedback-close' => 'סיו×',
+'feedback-bugcheck' => 'מצוין! × × ×œ×‘×“×•×§ שזה ×œ× ×חד מה[$1 ב××’×™× ×”×™×“×•×¢×™×].',
+'feedback-bugnew' => 'בדקתי. × × ×œ×“×•×•×— כב××’ חדש',
+
+# API errors
+'api-error-badaccess-groups' => '××™× ×›× ×ž×•×¨×©×™× ×œ×”×¢×œ×•×ª ×§×‘×¦×™× ×œ×תר הוויקי ×”×–×”.',
+'api-error-badtoken' => 'שגי××” פנימית: ×סימון רע.',
+'api-error-copyuploaddisabled' => 'העל××” לפי כתובת כובתה בשרת ×–×”.',
+'api-error-duplicate' => 'כבר יש ב×תר הוויקי {{PLURAL:$1|[$2 קובץ ×חר] בעל|[$2 ×§×‘×¦×™× ×חרי×] בעלי}} ×ותו תוכן.',
+'api-error-duplicate-archive' => 'ב×תר כבר {{PLURAL:$1|×”×™×” [$2 קובץ ×חר]|היו [$2 ×§×‘×¦×™× ×חרי×]}} ×¢× ×ותו תוכן, ×בל {{PLURAL:$1|×”×•× × ×ž×—×§|×”× × ×ž×—×§×•}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|קובץ כפול שכבר נמחק|×§×‘×¦×™× ×›×¤×•×œ×™× ×©×›×‘×¨ נמחקו}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|קובץ כפול|×§×‘×¦×™× ×›×¤×•×œ×™×}}',
+'api-error-empty-file' => 'הקובץ ×©×©×œ×—×ª× ×”×™×” ריק.',
+'api-error-emptypage' => 'יצירת ×“×¤×™× ×—×“×©×™× ×¨×™×§×™× ××™× ×” ×פשרית.',
+'api-error-fetchfileerror' => 'שגי××” פנימית: משהו השתבש בזמן ×חזור הקובץ.',
+'api-error-file-too-large' => 'הקובץ ×©×©×œ×—×ª× ×”×™×” גדול מדי.',
+'api-error-filename-tooshort' => '×©× ×”×§×•×‘×¥ קצר מדי.',
+'api-error-filetype-banned' => 'סוג קובץ ×–×” חסו×.',
+'api-error-filetype-missing' => 'חסרה סיומת ×œ×©× ×”×§×•×‘×¥.',
+'api-error-hookaborted' => 'השינוי ×©× ×™×¡×™×ª× ×œ×¢×©×•×ª × ×—×¡× ×¢×œ ידי הרחבה.',
+'api-error-http' => 'שגי××” פנימית: ×œ× × ×™×ª×Ÿ להתחבר לשרת.',
+'api-error-illegal-filename' => '×©× ×”×§×•×‘×¥ ×”×–×” ×ינו מורשה.',
+'api-error-internal-error' => 'שגי××” פנימית: משהו השתבש בעת עיבוד ההעל××” ×©×œ×›× ×‘×תר הוויקי.',
+'api-error-invalid-file-key' => 'שגי××” פנימית: הקובץ ×œ× × ×ž×¦× ×‘×ž×גר הזמני.',
+'api-error-missingparam' => 'שגי××” פנימית: ×¤×¨×ž×˜×¨×™× ×—×¡×¨×™× ×‘×‘×§×©×” שנשלחה.',
+'api-error-missingresult' => 'שגי××” פנימית: ×œ× × ×™×ª×Ÿ לקבוע ×× ×”×”×¢×ª×§×” הצליחה.',
+'api-error-mustbeloggedin' => '×¢×œ×™×›× ×œ×”×™×•×ª ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ כדי להעלות קבצי×.',
+'api-error-mustbeposted' => 'שגי××” פנימית: הבקשה דורשת שימוש בשיטת POST של HTTP.',
+'api-error-noimageinfo' => 'ההעל××” הושלמה בהצלחה, ×בל השרת ×œ× × ×ª×Ÿ לנו ×©×•× ×ž×™×“×¢ על הקובץ.',
+'api-error-nomodule' => 'שגי××” פנימית: מודול ההעל××” ×ינו מוגדר.',
+'api-error-ok-but-empty' => 'שגי××” פנימית: ×ין תשובה מהשרת.',
+'api-error-overwrite' => '×œ× ×ž×•×ª×¨×ª החלפת קובץ קיי×.',
+'api-error-stashfailed' => 'שגי××” פנימית: השרת נכשל ב×חסון הקובץ הזמני.',
+'api-error-timeout' => 'השרת ×œ× ×”×©×™×‘ בזמן המצופה.',
+'api-error-unclassified' => '×ירעה שגי××” בלתי ידועה.',
+'api-error-unknown-code' => 'שגי××” בלתי ידועה: "$1".',
+'api-error-unknown-error' => 'שגי××” פנימית: משהו השתבש בעת ניסיון להעלות ×ת הקובץ שלכ×.',
+'api-error-unknown-warning' => '×זהרה בלתי ידועה: "$1".',
+'api-error-unknownerror' => 'שגי××” בלתי ידועה: "$1".',
+'api-error-uploaddisabled' => 'ההעל××” מבוטלת ב×תר הוויקי ×”×–×”.',
+'api-error-verification-error' => 'קובץ ×–×” עשוי להיות ×¤×’×•× ×ו בעל סיומת שגויה.',
+
);
diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php
index 8467f4e3..3490702c 100644
--- a/languages/messages/MessagesHi.php
+++ b/languages/messages/MessagesHi.php
@@ -26,6 +26,7 @@
* @author Kiranmayee
* @author Krinkle
* @author Kumar
+ * @author Mayur
* @author Odisha1
* @author Omprakash
* @author Pulkitsingh01
@@ -34,13 +35,16 @@
* @author Rajivkurjee
* @author Reedy
* @author Sajeel.irkal
+ * @author Sayak Sarkar
* @author Shrish
* @author Shyam
* @author Shyam123.ckp
* @author Siddhartha Ghai
+ * @author Subhashkataria21.90
* @author Sunil Mohan
* @author Taxman
* @author Vibhijain
+ * @author Wikiconference
* @author לערי ריינה×רט
* @author आलोक
* @author रोहित रावत
@@ -79,6 +83,8 @@ $digitTransformTable = array(
);
$linkTrail = "/^([a-z]+)(.*)$/sD";
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'कड़ियाठअधोरेखन:',
@@ -438,21 +444,23 @@ $1',
'badarticleerror' => 'इस पनà¥à¤¨à¥‡ पर यह कà¥à¤°à¤¿à¤¯à¤¾ नहीं कर सकतें ।',
'cannotdelete' => '"$1" पनà¥à¤¨à¥‡ या फाइल को हटाया नहीं जा सकता.
शायद किसी और ने इसे पहले ही हटा दिया हो.',
+'cannotdelete-title' => 'इस पनà¥à¤¨à¥‡ को नहि मिटा नहि जा सकà¥à¤¤à¤¾ $1',
'badtitle' => 'खराब शीरà¥à¤·à¤•',
'badtitletext' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ पूछा गया लेख का शीरà¥à¤·à¤• अयोगà¥à¤¯, ख़ाली या गलतीसे जà¥à¤¡à¤¾ हà¥à¤µà¤¾ आंतर-भाषिय या आंतर-विकि शीरà¥à¤·à¤• हैं । इसमें à¤à¤• या à¤à¤•à¤¸à¥‡ जà¥à¤¯à¤¾à¤¦à¤¾ à¤à¤¸à¥‡ कॅरेकà¥à¤Ÿà¤° है जो शीरà¥à¤·à¤•à¤®à¥‡à¤‚ इसà¥à¤¤à¥‡à¤®à¤¾à¤² नहीं किये जा सकते है ।',
-'perfcached' => 'नीचे दिया हà¥à¤µà¤¾ पाठà¥à¤¯ कैश मेमरीसे लिया हà¥à¤µà¤¾ होने के कारण अदà¥à¤¯à¤¤à¤¨ जानकारीयà¥à¤•à¥à¤¤ ना होने की संभावना है ।',
-'perfcachedts' => 'नीचे दी गई ज़ानकारी कैश मेमरीमें रखी हà¥à¤ˆ है, और आखिरी बार $1 को बदली गई हैं ।',
+'perfcached' => 'नीचे दिया हà¥à¤† डेटा कैशे मेमरी से लिया हà¥à¤† है, अतः हो सकता है कि इसका पूरà¥à¤£ अदà¥à¤¯à¤¤à¤¨ न हà¥à¤† हो। कैशे मेमोरी में अधिकतम {{PLURAL:$1|à¤à¤• नतीजा|$1 नतीजे}} उपà¥à¤²à¤¬à¥à¤§ हैं।',
+'perfcachedts' => 'नीचे दिया हà¥à¤† डेटा कैशे मेमोरी से है, और इसका अंतिम अदà¥à¤¯à¤¤à¤¨ $1 को हà¥à¤† था। कैशे मेमोरी में अधिकतम {{PLURAL:$4|à¤à¤• नतीजा|$4 नतीजे}} उपà¥à¤²à¤¬à¥à¤§ हैं।',
'querypage-no-updates' => 'इस पनà¥à¤¨à¥‡ का नवीनीकरण करना मना है । अभी यहां के डाटा को ताज़ा नहीं कर सकतें ।',
'wrong_wfQuery_params' => 'wfQuery() के लिये गलत मापदणà¥à¤¡ दियें हैं<br />
कारà¥à¤¯: $1<br />
पृचà¥à¤›à¤¾: $2',
'viewsource' => 'सà¥à¤°à¥‹à¤¤ देखें',
-'viewsourcefor' => '$1 के लिये',
+'viewsource-title' => '$1 का उगम नहि मिटाया जा साकà¥à¤¤à¤¾',
'actionthrottled' => 'कारà¥à¤¯ समापà¥à¤¤ कर दिया गया हैं',
'actionthrottledtext' => 'सà¥à¤ªà¥ˆà¤® की रोकथाम के लिये, यह कà¥à¤°à¤¿à¤¯à¤¾ इतने कम समय में à¤à¤•à¤¸à¥‡ जà¥à¤¯à¤¾à¤¦à¤¾ बार करनेसे मनाई है, और आप इस मरà¥à¤¯à¤¾à¤¦à¤¾à¤•à¥‹ पार कर चà¥à¤•à¥‡ हैं ।
कृपया कà¥à¤› समय बाद पà¥à¤¨: यतà¥à¤¨ किजीयें ।',
'protectedpagetext' => 'यह पान संपादनोंसे सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ किया हà¥à¤µà¤¾ है ।',
'viewsourcetext' => 'आप इस पनà¥à¤¨à¥‡ का सà¥à¤°à¥‹à¤¤ देख सकते हैं और उसकी नकल उतार सकतें हैं:',
+'viewyourtext' => "तà¥à¤® इस पनà¥à¤¨à¥‡ का ''तà¥à¤®à¥à¤¹à¤¾à¤°à¥‡ समà¥à¤ªà¤¦à¤¨à¥'' सà¥à¤°à¥‹à¤¤ देख और नकल उतार सकà¥à¤¤à¥‡ है:",
'protectedinterface' => 'यह पनà¥à¤¨à¤¾ सॉफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤•à¥‹ इंटरफ़ेस देता हैं, और इसके गलत इसà¥à¤¤à¥‡à¤®à¤¾à¤²à¤¸à¥‡ बचने के लिये इसे सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कर दिया गया हैं ।',
'editinginterface' => "'''चेतावनी:''' आप à¤à¤• à¤à¤¸à¥‡ पनà¥à¤¨à¥‡ को बदल रहे हैं जो तंतà¥à¤°à¤¾à¤‚श के अंतरापृषà¥à¤  की सामगà¥à¤°à¥€ पà¥à¤°à¤¦à¤¾à¤¨ करता है। इस पनà¥à¤¨à¥‡ को बदलने से अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤“ं को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अंतरापृषà¥à¤  की शकà¥à¤²à¥‹à¤¸à¥‚रत में बदलाव आà¤à¤—ा। अनà¥à¤µà¤¾à¤¦à¥‹à¤‚ के लिठकृपया [//translatewiki.net/wiki/Main_Page?setlang=hi टà¥à¤°à¤¾à¤‚सलेटविकि.नेट] का पà¥à¤°à¤¯à¥‹à¤— करें, यह मीडियाविकि की कà¥à¤·à¥‡à¤¤à¥à¤°à¥€à¤¯à¤•à¤°à¤£ परियोजना है।",
'sqlhidden' => '(छà¥à¤ªà¤¾à¤ˆ हà¥à¤ˆ SQL पृचà¥à¤›à¤¾)',
@@ -555,6 +563,7 @@ $2',
'emailconfirmlink' => 'अपना ई-मेल पता पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ करें',
'invalidemailaddress' => 'ई-मेल पता नहीं माना जा सकता कà¥à¤¯à¥‹à¤‚कि ये किसी अवैध सà¥à¤µà¤°à¥‚प में है।
कृपया à¤à¤• सही तरीके से सà¥à¤µà¤°à¥‚पित ई-मेल पता दें अथवा उस कोषà¥à¤ à¤• को रिकà¥à¤¤ ही रहने दें।',
+'cannotchangeemail' => 'इस विकी पर सदसà¥à¤¯ खाते का ई-मेल पता नहीं बदला जा सकता।',
'accountcreated' => 'खाता निरà¥à¤®à¤¿à¤¤',
'accountcreatedtext' => '$1 के लिये खाता निरà¥à¤®à¤¿à¤¤ कर दिया गया है।',
'createaccount-title' => '{{SITENAME}} के लिये खाता बनाà¤à¤',
@@ -571,6 +580,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHP के mail() फ़ंकà¥à¤¶à¤¨ में अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆà¥¤',
+'user-mail-no-addy' => 'ई-मेल पते के बिना ई-मेल भेजने की कोशिश की।',
# Change password dialog
'resetpass' => 'कूटशबà¥à¤¦ बदलें',
@@ -592,26 +602,41 @@ $2',
'resetpass-temp-password' => 'असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦:',
# Special:PasswordReset
-'passwordreset' => 'कूटशबà¥à¤¦ रिसैट',
-'passwordreset-text' => 'आपके खाते के विवरण का à¤à¤• ई-मेल अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठइस फॉरà¥à¤® को पूरा करें।',
-'passwordreset-legend' => 'कूटशबà¥à¤¦ रीसेट करें',
-'passwordreset-disabled' => 'पासवरà¥à¤¡ फिर सेट करना इस wiki पर अकà¥à¤·à¤® किया जा चà¥à¤•à¤¾ है।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचे दिठगठडेटा के टà¥à¤•à¤¡à¤¼à¥‡ में से à¤à¤• पà¥à¤°à¤µà¥‡à¤¶}}',
-'passwordreset-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
-'passwordreset-domain' => 'डोमेन:',
-'passwordreset-email' => 'ई-मेल पता:',
-'passwordreset-emailtitle' => '{{SITENAME}} पर खाते का विवरण',
-'passwordreset-emailtext-ip' => 'किसी ने (शायद आपने, आई पी पते से $1 ) अपके {{SITENAME}} ( $4 ) की खाता विवरण याद दिलाने का अनà¥à¤°à¥‹à¤§ किया है । निमà¥à¤¨ उपयोगकरà¥à¤¤à¤¾ {{PLURAL:$3| इस | इनॠ}} ई-मेल पते के साथ जà¥à¤¡à¤¼à¥‡ है :
+'passwordreset' => 'कूटशबà¥à¤¦ रिसैट',
+'passwordreset-text' => 'आपके खाते के विवरण का à¤à¤• ई-मेल अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• पà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठइस फॉरà¥à¤® को पूरा करें।',
+'passwordreset-legend' => 'कूटशबà¥à¤¦ रीसेट करें',
+'passwordreset-disabled' => 'पासवरà¥à¤¡ फिर सेट करना इस wiki पर अकà¥à¤·à¤® किया जा चà¥à¤•à¤¾ है।',
+'passwordreset-pretext' => '{{PLURAL:$1||नीचे दिठगठडेटा के टà¥à¤•à¤¡à¤¼à¥‡ में से à¤à¤• पà¥à¤°à¤µà¥‡à¤¶}}',
+'passwordreset-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'passwordreset-domain' => 'डोमेन:',
+'passwordreset-capture' => 'परिणामसà¥à¤µà¤°à¥‚प ई मेल देखे?',
+'passwordreset-capture-help' => 'अगर आप इस चेकबॉकà¥à¤¸ को टिक करà¥à¤¤à¥‡ है तो ई-मेल (असà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡ के साथ) आप को दिखया और भेजा जयेगा।',
+'passwordreset-email' => 'ई-मेल पता:',
+'passwordreset-emailtitle' => '{{SITENAME}} पर खाते का विवरण',
+'passwordreset-emailtext-ip' => 'किसी ने (शायद आपने, आई पी पते से $1 ) अपके {{SITENAME}} ( $4 ) की खाता विवरण याद दिलाने का अनà¥à¤°à¥‹à¤§ किया है । निमà¥à¤¨ उपयोगकरà¥à¤¤à¤¾ {{PLURAL:$3| इस | इनॠ}} ई-मेल पते के साथ जà¥à¤¡à¤¼à¥‡ है :
$2
{{PLURAL:$3| इस असà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡ |इन असà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡à¤¸ }}{{PLURAL:$5 | à¤à¤• दिन | $5 दिनों}} में समापà¥à¤¤ हो जाà¤à¤—ी! आपको लॉग इन करके à¤à¤• नया पासवरà¥à¤¡ का चयन करना चाहिà¤à¥¤ अगर किसी औरने यह अनà¥à¤°à¥‹à¤§ किया है
या यदि आपको अपना मूल पासवरà¥à¤¡ याद है और आप अपने इस पासवरà¥à¤¡ का परिवरà¥à¤¤à¤¿à¤¤ नहि करना चाहते हैं, आप इस संदेश को अनदेखा करके अपने पà¥à¤°à¤¾à¤¨à¥‡ पासवरà¥à¤¡ का उपयोग जारी रखिये।',
-'passwordreset-emailtext-user' => 'उपयोगकरà¥à¤¤à¤¾ $1 {{SITENAME पर}} आपके खाते के विवरण की याद दिलाने {{SITENAME के लिà¤}} का अनà¥à¤°à¥‹à¤§ किया है!à¤à¤¨!($4). निमà¥à¤¨ उपयोगकरà¥à¤¤à¤¾ {{PLURAL:$3| खाता is|accounts हैं}} इस ई-मेल पते के साथ जà¥à¤¡à¤¼à¥‡:!à¤à¤¨!à¤à¤¨!$2!à¤à¤¨!à¤à¤¨! {{PLURAL:$3| इस असà¥à¤¥à¤¾à¤¯à¥€ password|इन असà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡}} में समापà¥à¤¤ हो जाà¤à¤—ी {{PLURAL:$5| à¤à¤• day| $5 दिनों}}.!à¤à¤¨!आपॠलॉग इन करें और अब à¤à¤• नया पासवरà¥à¤¡ का चयन कैजिये । अगर किसी और ने यह अनà¥à¤°à¥‹à¤§ किया , या यदि आपको अपना मूल पासवरà¥à¤¡ यादॠआजाये, और आपको परिवरà¥à¤¤à¤¿à¤¤ नहीं करना है, आप इस संदेश को अनदेखा कर सकते हैं और अपने पà¥à¤°à¤¾à¤¨à¥‡ का उपयोग जारी रखना चाहà¥à¤¤à¥‡ है
+'passwordreset-emailtext-user' => 'उपयोगकरà¥à¤¤à¤¾ $1 {{SITENAME पर}} आपके खाते के विवरण की याद दिलाने {{SITENAME के लिà¤}} का अनà¥à¤°à¥‹à¤§ किया है!à¤à¤¨!($4). निमà¥à¤¨ उपयोगकरà¥à¤¤à¤¾ {{PLURAL:$3| खाता is|accounts हैं}} इस ई-मेल पते के साथ जà¥à¤¡à¤¼à¥‡:!à¤à¤¨!à¤à¤¨!$2!à¤à¤¨!à¤à¤¨! {{PLURAL:$3| इस असà¥à¤¥à¤¾à¤¯à¥€ password|इन असà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡}} में समापà¥à¤¤ हो जाà¤à¤—ी {{PLURAL:$5| à¤à¤• day| $5 दिनों}}.!à¤à¤¨!आपॠलॉग इन करें और अब à¤à¤• नया पासवरà¥à¤¡ का चयन कैजिये । अगर किसी और ने यह अनà¥à¤°à¥‹à¤§ किया , या यदि आपको अपना मूल पासवरà¥à¤¡ यादॠआजाये, और आपको परिवरà¥à¤¤à¤¿à¤¤ नहीं करना है, आप इस संदेश को अनदेखा कर सकते हैं और अपने पà¥à¤°à¤¾à¤¨à¥‡ का उपयोग जारी रखना चाहà¥à¤¤à¥‡ है
पासवरà¥à¤¡à¥¤',
-'passwordreset-emailelement' => 'उपभोकà¥à¤¤à¤¾ का नाम: $1
+'passwordreset-emailelement' => 'उपभोकà¥à¤¤à¤¾ का नाम: $1
असà¥à¤¥à¤¾à¤¯à¥€ पासवरà¥à¤¡: $2',
-'passwordreset-emailsent' => 'à¤à¤•à¥ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• ई-मेल भेजा जा चà¥à¤•à¤¾ है।',
+'passwordreset-emailsent' => 'à¤à¤•à¥ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• ई-मेल भेजा जा चà¥à¤•à¤¾ है।',
+'passwordreset-emailsent-capture' => 'à¤à¤• अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• ई-मेल, जो नीचे दिखाया गया है भेजा जा चà¥à¤•à¤¾ है।',
+'passwordreset-emailerror-capture' => 'à¤à¤• अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• ई-मेल उतà¥à¤ªà¤¨à¥à¤¨ किया गया था, जो निछे दिखाया गय है, लेकिन असफल उपà¥à¤­à¥‹à¤—à¥à¤¤à¤¾ को भेजा जा रहा है: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ई-मेल पता परिवरà¥à¤¤à¤¿à¤¤ करें',
+'changeemail-header' => 'खाते के ई-मेल पता परिवरà¥à¤¤à¤¿à¤¤ करें',
+'changeemail-text' => 'आपका ई-मेल पता परिवरà¥à¤¤à¤¿à¤¤ करने के लिठइस फॉरà¥à¤® को पूरा करें। आप इस बदलाव की पà¥à¤·à¥à¤Ÿà¤¿ करने के लिठअपना पासवरà¥à¤¡ दरà¥à¤œ करने की आवशà¥à¤¯à¤•à¤¤à¤¾ होगी।',
+'changeemail-no-info' => 'इस पनà¥à¤¨à¥‡ तक सीधे पहà¥à¤à¤šà¤¨à¥‡ के लिठआपको सतà¥à¤°à¤¾à¤°à¤‚भ करना होगा।',
+'changeemail-oldemail' => 'वरà¥à¤¤à¤®à¤¾à¤¨ ई-मेल पता :',
+'changeemail-newemail' => 'नया ई-मेल पता:',
+'changeemail-none' => '(बिलà¥à¤•à¥à¤² नहीं)',
+'changeemail-submit' => 'ई-मेल बदलें',
+'changeemail-cancel' => 'रदà¥à¤¦ करें',
# Edit page toolbar
'bold_sample' => 'मोटा पाठ',
@@ -682,9 +707,6 @@ $2
आपका मौजूदा आईपी पता $3 है और अवरोध कà¥à¤°à¤®à¤¾à¤‚क #$5 है।
अपने किसी भी पà¥à¤°à¤¶à¥à¤¨ में कृपया यह सभी जानकारी भी शामिल करें।',
'blockednoreason' => 'कारण दिया नहीं हैं',
-'blockedoriginalsource' => "'''$1''' का सà¥à¤°à¥‹à¤¤ इसके नीचे दिया गया है:",
-'blockededitsource' => "'''$1''' को '''आपके बदलाव''' का पाठà¥à¤¯ नीचे दरà¥à¤¶à¤¾à¤¯à¤¾ गया हैं:",
-'whitelistedittitle' => 'संपादन के लिठसतà¥à¤°à¤¾à¤°à¤‚भ करना होगा',
'whitelistedittext' => 'लेख संपादित करने के लियें $1 करें ।',
'confirmedittext' => 'संपादन करने से पहले आपने अपना इ-मेल पता पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ कराना आवशà¥à¤¯à¤• हैं ।
कृपया अपनी [[Special:Preferences|सदसà¥à¤¯ वरीयताà¤à¤‚]] में जाकर अपना इ-मेल पता दें और उसे पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ करें ।',
@@ -769,7 +791,7 @@ $2
अगर आपको अपने लिखे हà¥à¤ पाठ में संपादन होना नामंजूर हैं तो कृपया यहां पर मत लिखें।<br />
आप हमें यह भी वचन देतें हैं कि यह आपने खà¥à¤¦ लिखा हैं या फिर कोई पबà¥à¤²à¤¿à¤• डोमेन या à¤à¤¸à¥‡ ही किसी मà¥à¤•à¥à¤¤ सà¥à¤°à¥‹à¤¤à¤¸à¥‡ कापी किया हैं। (अधिक जानकारी के लिये $1 देखें)।
'''कॉपीराइट वाले लेखों को, बिना अनà¥à¤®à¤¤à¤¿ के, यहाठन डाले।'''",
-'longpageerror' => "'''गलती: आपने दिया हà¥à¤† पाठ $1 कीलोबाईट लंबा हैं, जो $2 केबी के मरà¥à¤¯à¤¾à¤¦à¤¾ से बाहर हैं।
+'longpageerror' => "'''तà¥à¤°à¥à¤Ÿà¤¿: आपका दिया हà¥à¤† पाठ {{PLURAL:|$1 किलोबाइट|$1 किलोबाइट}} लंबा है, जो {{PLURAL:|$2 किलोबाइट|$2 किलोबाइट}} की सीमा से बाहर है।
इसे संजोया नहीं जा सकता।'''",
'readonlywarning' => "'''सावधान: आà¤à¤•à¤¡à¤¼à¤•à¥‹à¤· को रख रखाव के लियें बंद कर दिया गया हैं, इसलिये अभी आपके बदलाव संजोठनहीं जा सकते।
अगर आप चाहतें हैं तो इस सामगà¥à¤°à¥€ की नकलचिपà¥à¤ªà¥€ कर के किसी संचिका में बाद के लिठडाल के रख सकते हैं।'''
@@ -933,8 +955,6 @@ $2
'revdelete-unsuppress' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ अवतरणोंपरसे पà¥à¤°à¤¬à¤‚धन हटायें',
'revdelete-log' => 'कारण:',
'revdelete-submit' => 'चयनित लागू करें {{PLURAL:$1|revision|revisions}}',
-'revdelete-logentry' => '[[$1]] की अवतरण दृषà¥à¤¯à¤¤à¤¾ बदली गईं',
-'logdelete-logentry' => '[[$1]] की घटना दृशà¥à¤¯à¤¤à¤¾ बदली गईं',
'revdelete-success' => 'फिरना-हटाना-सफलता',
'revdelete-failure' => "'''संशोधन विफलता हटाया नहि जा सकà¥à¤¤à¤¾:'''
$1",
@@ -946,15 +966,6 @@ $1",
'revdel-restore-visible' => 'दृशà¥à¤¯ संशोधन',
'pagehist' => 'पनà¥à¤¨à¥‡ का इतिहास',
'deletedhist' => 'हटाया हà¥à¤† इतिहास',
-'revdelete-content' => 'कंटेंट',
-'revdelete-summary' => 'बदलाव ज़ानकारी',
-'revdelete-uname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®',
-'revdelete-restricted' => 'पà¥à¤°à¤¬à¤‚धकोंको पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित किया',
-'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धकोंके पà¥à¤°à¤¬à¤‚धन हटायें',
-'revdelete-hid' => 'छà¥à¤ªà¤¾à¤¯à¥‡à¤‚ $1',
-'revdelete-unhid' => 'दरà¥à¤¶à¤¾à¤¯à¥‡à¤‚ $1',
-'revdelete-log-message' => '$2 {{PLURAL:$2|अवतरण|अवतरणों}}के लिये $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|घटना|घटनाओं}}के लिये $1',
'revdelete-hide-current' => '$2 को, $1 बजे वाला मद छिपाया नहीं जा सका: यह सबसे ताज़ा संसà¥à¤•à¤°à¤£ है।
यह छिपाया नहीं जा सकता है।',
'revdelete-show-no-access' => '$1, $2 वाला मद दिखाते समय तà¥à¤°à¥à¤Ÿà¤¿ आई: इस मद को "पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित" चिहà¥à¤¨à¤¿à¤¤ किया गया है।
@@ -1111,12 +1122,14 @@ $1",
'prefs-rc' => 'हाल में हà¥à¤ बदलाव',
'prefs-watchlist' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची',
'prefs-watchlist-days' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमें दिखाने के दिन:',
-'prefs-watchlist-days-max' => 'अधिकतम ७ दिन',
+'prefs-watchlist-days-max' => 'अधिकतम $1 {{PLURAL:$1|दिन|दिन}}',
'prefs-watchlist-edits' => 'बढ़ाई हà¥à¤ˆ धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में दिखाने के जà¥à¤¯à¤¾à¤¦à¤¾ से जà¥à¤¯à¤¾à¤¦à¤¾ बदलाव:',
'prefs-watchlist-edits-max' => 'अधिकतम संखà¥à¤¯à¤¾: १०००',
'prefs-watchlist-token' => 'पसंद-धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची-टोकन',
'prefs-misc' => 'अनà¥à¤¯',
'prefs-resetpass' => 'कूटशबà¥à¤¦ बदलें',
+'prefs-changeemail' => 'ई-मेल पता बदलें',
+'prefs-setemail' => 'ई-मेल पता सेट करें',
'prefs-email' => 'डाक वरीयताà¤à¤',
'prefs-rendering' => 'शकà¥à¤²à¥‹à¤¸à¥‚रत',
'saveprefs' => 'संजोयें',
@@ -1176,6 +1189,7 @@ $1",
'yourrealname' => 'वासà¥à¤¤à¤µà¤¿à¤• नाम:',
'yourlanguage' => 'भाषा:',
'yourvariant' => 'सामगà¥à¤°à¥€ भाषा संसà¥à¤•à¤°à¤£:',
+'prefs-help-variant' => 'आपका पसंदीदा पà¥à¤°à¤•à¤¾à¤° या इमला इस विकि के अंदर सामगà¥à¤°à¥€ पृषà¥à¤ à¥‹à¤‚ को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने के लिà¤à¥¤',
'yournick' => 'आपका उपनाम (दसà¥à¤¤à¤–त/सही के लिये)',
'prefs-help-signature' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¥‹à¤‚ पर की गई टिपà¥à¤ªà¤£à¤¿à¤¯à¥‹à¤‚ पर "<nowiki>~~~~</nowiki>" के जरिठहसà¥à¤¤à¤¾à¤•à¥à¤·à¤° किया जाना चाहिà¤, यह आपके हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° और समय में परिवरà¥à¤¤à¤¿à¤¤ हो जाà¤à¤—ा।',
'badsig' => 'गलत कचà¥à¤šà¤¾ दसà¥à¤¤à¤–त, HTML टैग की जाà¤à¤š करें ।',
@@ -1216,7 +1230,7 @@ $1",
'userrights-lookup-user' => 'सदसà¥à¤¯ गà¥à¤°à¥à¤ªà¥‹à¤‚का वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ करें',
'userrights-user-editname' => 'सदसà¥à¤¯à¤¨à¤¾à¤® दें:',
'editusergroup' => 'सदसà¥à¤¯ गà¥à¤°à¥à¤ªà¤•à¤¾ संपादन करें',
-'editinguser' => "सदसà¥à¤¯ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])के सदसà¥à¤¯ अधिकारोंमें बदलाव कियें जा रहें हैं।",
+'editinguser' => "उपयोकà¥à¤¤à¤¾ '''[[User:$1|$1]]''' $2 के अधिकार बदलें",
'userrights-editusergroup' => 'सदसà¥à¤¯ गà¥à¤°à¥à¤ªà¥‹à¤‚का संपादन करें',
'saveusergroups' => 'सदसà¥à¤¯ गà¥à¤°à¥à¤ª संजोयें',
'userrights-groupsmember' => 'का सदसà¥à¤¯:',
@@ -1310,13 +1324,13 @@ $1",
'right-autopatrol' => 'सभी बदलाव पेटà¥à¤°à¥‹à¤²à¥à¤¡ करके मारà¥à¤• करें',
'right-patrolmarks' => 'हालमें हà¥à¤ बदलावोंमें पैटà¥à¤°à¥‹à¤² मारà¥à¤• देखें',
'right-unwatchedpages' => 'ना देखे हà¥à¤ पनà¥à¤¨à¥‹à¤‚की सूची देखें',
-'right-trackback' => 'à¤à¤• टà¥à¤°à¥ˆà¤•à¤¬à¥ˆà¤• भेजें',
'right-mergehistory' => 'पनà¥à¤¨à¥‹à¤‚का इतिहास à¤à¤•à¤¤à¥à¤°à¤¿à¤¤ करें',
'right-userrights' => 'सभी सदसà¥à¤¯à¥‹à¤‚के अधिकार बदलें',
'right-userrights-interwiki' => 'अनà¥à¤¯ विकियोंपर सदसà¥à¤¯ अधिकार बदलें',
'right-siteadmin' => 'डाटाबेस को ताला लगायें या खोलें',
'right-override-export-depth' => 'पनà¥à¤¨à¥‹à¤‚ का निरà¥à¤¯à¤¾à¤¤, ५वीं गहराई तक के हवाले वाले पनà¥à¤¨à¥‹à¤‚ समेत',
'right-sendemail' => 'सही ईमेल भेजें',
+'right-passwordreset' => 'पासवरà¥à¤¡ रीसेट ई मेल देखें',
# User rights log
'rightslog' => 'सदसà¥à¤¯ अधिकार सूची',
@@ -1350,16 +1364,17 @@ $1",
'action-suppressionlog' => 'इस निजी चिटà¥à¤ à¥‡ को देखना',
'action-block' => 'इस पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ को संपादन करने से रोकना',
'action-protect' => 'इस पनà¥à¤¨à¥‡ के सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° को बदलना',
+'action-rollback' => 'जलà¥à¤¦à¥€ से अंतिम उपयोगकरà¥à¤¤à¤¾ की संपादन जो किसी विशेष पेज संपादित किठहैं उसे पूरà¥à¤µà¤µà¤¤ करें',
'action-import' => 'किसी और विकि से इस पनà¥à¤¨à¥‡ को आयातित करना',
'action-importupload' => 'इस पनà¥à¤¨à¥‡ को संचिका चढ़ा के आयातित करना',
'action-patrol' => 'औरों के बदलाव को निगारनी वाला चिहà¥à¤¨à¤¿à¤¤ करना',
'action-autopatrol' => 'अपने बदलाव को निगरानी वाला चिहà¥à¤¨à¤¿à¤¤ करना',
'action-unwatchedpages' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में नामौजूद पनà¥à¤¨à¥‹à¤‚ की सूची देखना',
-'action-trackback' => 'विपरीत पथ जमा करना',
'action-mergehistory' => 'इस पनà¥à¤¨à¥‡ के इतिहास का विलय करना',
'action-userrights' => 'सभी पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारों का संपादन करना',
'action-userrights-interwiki' => 'अनà¥à¤¯ विकि पर सदसà¥à¤¯à¥‹à¤‚ के अधिकारों का संपादन',
'action-siteadmin' => 'आà¤à¤•à¤¡à¤¼à¤¾à¤•à¥‹à¤· को तालाबंद करना या खोलना',
+'action-sendemail' => 'ई-मेल भेजें',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|बदलाव|बदलाव}}',
@@ -1391,6 +1406,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 देखनेवाले {{PLURAL:$1|सदसà¥à¤¯|सदसà¥à¤¯}}]',
'rc_categories' => 'शà¥à¤°à¥‡à¤£à¥€à¤¯à¥‹à¤‚ तक सीमीत रखें ("|" से अलग करें)',
'rc_categories_any' => 'कोईभी',
+'rc-change-size-new' => 'बदलाव के बाद $1 {{PLURAL:$1|बाइट|बाइट}}',
'newsectionsummary' => '/* $1 */ नया विभाग',
'rc-enhanced-expand' => 'विसà¥à¤¤à¥ƒà¤¤ जानकारी दिखाà¤à¤ (इसके लिठजावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाहिà¤)',
'rc-enhanced-hide' => 'विसà¥à¤¤à¥ƒà¤¤ जानकारी छिपाà¤à¤',
@@ -1444,6 +1460,7 @@ $1",
'minlength1' => 'फ़ाईल का नाम कम से कम à¤à¤• अकà¥à¤·à¤°à¤•à¤¾ होना चाहियें।',
'illegalfilename' => 'संचिका के नाम "$1" में कà¥à¤› à¤à¤¸à¥‡ अकà¥à¤·à¤° हैं जो पनà¥à¤¨à¥‡ के शीरà¥à¤·à¤•à¥‹à¤‚ में पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित हैं।
कृपया संचिका का नाम बदल के चढ़ाने की कोशिश करें।',
+'filename-toolong' => 'फ़ाइल नाम 240 बाइटà¥à¤¸ से अधिक लंबे नहीं हो सकते।',
'badfilename' => 'संचिका का नाम बदल के "$1" कर दिया गया है।',
'filetype-mime-mismatch' => 'फाइल à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन ".$1" खोजे गठफ़ाइल MIME पà¥à¤°à¤•à¤¾à¤° से मेल नहीं खाता ($2)।',
'filetype-badmime' => '"$1" पà¥à¤°à¤•à¤¾à¤° की फ़ाईलें अपलोड करने के लिये अनà¥à¤®à¤¤à¤¿ नहीं हैं।',
@@ -1553,6 +1570,37 @@ PICT # misc.
'upload-unknown-size' => 'अजà¥à¤žà¤¾à¤¤ आकार',
'upload-http-error' => 'à¤à¤• à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€ तà¥à¤°à¥à¤Ÿà¤¿ आई: $1',
+# File backend
+'backend-fail-stream' => 'फ़ाइल का पà¥à¤°à¤µà¤¾à¤¹ नहीं हो पाया $1।',
+'backend-fail-backup' => 'फ़ाइल बैकअप नहीं हो पाया $1 ।',
+'backend-fail-notexists' => 'फ़ाइल $1 मौजूद नहीं है।',
+'backend-fail-hashes' => 'तà¥à¤²à¤¨à¤¾ के लिठफ़ाइल हाशेस नहीं मिली ।',
+'backend-fail-notsame' => 'à¤à¤• गैर समान फ़ाइल पहले से मौजूद है $1 ।',
+'backend-fail-invalidpath' => '$1कोई मानà¥à¤¯ भंडारण पथ नहीं है।',
+'backend-fail-delete' => 'फ़ाइल नषà¥à¤Ÿ नहीं हो पाया $1।',
+'backend-fail-alreadyexists' => 'फ़ाइल $1 पहले से ही मौजूद है।',
+'backend-fail-store' => 'फ़ाइल $1, $2 पर संगà¥à¤°à¤¹à¥€à¤¤ नहीं हो पाया ।',
+'backend-fail-copy' => 'फ़ाइल $1 से $2 पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ नहीं हो पाया ।',
+'backend-fail-move' => 'फ़ाइल $1 से $2 सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित नहीं हो पाया ।',
+'backend-fail-opentemp' => 'असà¥à¤¥à¤¾à¤ˆ फ़ाइल खोल नहीं पाया ।',
+'backend-fail-writetemp' => 'असà¥à¤¥à¤¾à¤¯à¥€ फ़ाइल पर लिखना संभव नहीं हà¥à¤† ।',
+'backend-fail-closetemp' => 'असà¥à¤¥à¤¾à¤ˆ फ़ाइल बंद नहीं हो पाया।',
+'backend-fail-read' => 'फ़ाइल नहीं पढ सका $1 ।',
+'backend-fail-create' => 'फ़ाइल नहीं बन पाया $1 ।',
+'backend-fail-readonly' => 'भंडारण बैकेंड "$1" इस समय केवल पढ़ा जा सकता है (रीड-ओनà¥à¤²à¥€ है)। दिया गया कारण था: "$2"',
+'backend-fail-connect' => '"$1" भंडारण से समà¥à¤ªà¤°à¥à¤• सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ नहीं किया जा सका।',
+'backend-fail-internal' => 'भंडारण बैकेंड में कोइ अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤‡ "$1"।',
+
+# Lock manager
+'lockmanager-notlocked' => 'अनलॉक नहीं हà¥à¤ˆ " $1 "; ये बंद नहीं है।',
+'lockmanager-fail-closelock' => 'अवरोधित फ़ाइल बंद नहीं हो पाया " $1 "।',
+'lockmanager-fail-deletelock' => 'अवरोधित फ़ाइल हटा नहीं पाया " $1 " के लिà¤à¥¤',
+'lockmanager-fail-acquirelock' => 'के लिठताला पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं हो पाया " $1 "।',
+'lockmanager-fail-openlock' => 'अवरोधित फ़ाइल खोल नहीं पाया " $1 " के लिà¤à¥¤',
+'lockmanager-fail-releaselock' => 'के लिठलॉक जारी नहीं हो पाया " $1 "।',
+'lockmanager-fail-db-release' => 'डेटाबेस पर ताले जारी नहीं हो पाया $1 ।',
+'lockmanager-fail-svr-release' => 'सरà¥à¤µà¤° पर ताले जारी नहीं हो पाया $1 ।',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ज़िप जाà¤à¤š के लिठसञà¥à¤šà¤¿à¤•à¤¾ खोलते समय तà¥à¤°à¥à¤Ÿà¤¿ का सामना करना पड़ा।',
'zip-wrong-format' => 'निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ सञà¥à¤šà¤¿à¤•à¤¾ à¤à¤• ज़िप सञà¥à¤šà¤¿à¤•à¤¾ नहीं थी।',
@@ -1569,6 +1617,7 @@ PICT # misc.
'uploadstash-badtoken' => 'उस कारà¥à¤¯ का पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ असफल रहा, समà¥à¤­à¤µà¤¤à¤ƒ आपके पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¯à¤•à¥‹à¤‚(साख) की अवधि समापà¥à¤¤ हो गई है। पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें।',
'uploadstash-errclear' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤“ं का समाशोधन असफल रहा।',
'uploadstash-refresh' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤“ं की सूची का पà¥à¤¨à¤ƒ भरण करें',
+'invalid-chunk-offset' => 'अगà¥à¤°à¤¾à¤¹à¥à¤¯ चंक ऑफसेट',
# img_auth script messages
'img-auth-accessdenied' => 'अनà¥à¤®à¤¤à¤¿ नहीं है',
@@ -1677,24 +1726,25 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'filerevert-badversion' => 'दिये हà¥à¤ समयसे मेल खाने वाला, इस फ़ाईलका पà¥à¤°à¤¾à¤¨à¤¾ अवतरण नहीं हैं।',
# File deletion
-'filedelete' => '$1 हटायें',
-'filedelete-legend' => 'संचिका मिटाà¤à¤',
-'filedelete-intro' => "आप संचिका '''[[Media:$1|$1]]''' इतिहास समेत मिटाने जा रहे हैं।",
-'filedelete-intro-old' => "आप '''[[Media:$1|$1]]''' के [$4 $3, $2 के अवतरण] हटा रहें हैं।",
-'filedelete-comment' => 'कारण:',
-'filedelete-submit' => 'हटायें',
-'filedelete-success' => "'''$1''' को हटा दिया गया हैं।",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' का $3, $2 वाला संसà¥à¤•à¤°à¤£ मिटा दिया गया है।",
-'filedelete-nofile' => "'''$1''' मौजूद नहीं है।",
-'filedelete-nofile-old' => "
+'filedelete' => '$1 हटायें',
+'filedelete-legend' => 'संचिका मिटाà¤à¤',
+'filedelete-intro' => "आप संचिका '''[[Media:$1|$1]]''' इतिहास समेत मिटाने जा रहे हैं।",
+'filedelete-intro-old' => "आप '''[[Media:$1|$1]]''' के [$4 $3, $2 के अवतरण] हटा रहें हैं।",
+'filedelete-comment' => 'कारण:',
+'filedelete-submit' => 'हटायें',
+'filedelete-success' => "'''$1''' को हटा दिया गया हैं।",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' का $3, $2 वाला संसà¥à¤•à¤°à¤£ मिटा दिया गया है।",
+'filedelete-nofile' => "'''$1''' मौजूद नहीं है।",
+'filedelete-nofile-old' => "
'''$1'''का आपने बताये हà¥à¤ विशिषà¥à¤Ÿ खासियतवाले संगà¥à¤°à¤¹à¤¿à¤¤ संसà¥à¤•à¤°à¤£ का असà¥à¤¤à¤¿à¤¤à¥à¤µ नहीं है।",
-'filedelete-otherreason' => 'अनà¥à¤¯/दूसरा कारण:',
-'filedelete-reason-otherlist' => 'अनà¥à¤¯ कारण',
-'filedelete-reason-dropdown' => '*हटाने के साधारण कारण
+'filedelete-otherreason' => 'अनà¥à¤¯/दूसरा कारण:',
+'filedelete-reason-otherlist' => 'अनà¥à¤¯ कारण',
+'filedelete-reason-dropdown' => '*हटाने के साधारण कारण
** कॉपीराईट
** डà¥à¤ªà¥à¤²à¤¿à¤•à¥‡à¤Ÿ फ़ाईल',
-'filedelete-edit-reasonlist' => 'हटाने के कारण बदलें',
-'filedelete-maintenance' => 'रखरखाव चल रहा है इसलिठकà¥à¤› समय के लिठसंचिकाओं को मिटाना और वापस पà¥à¤°à¤¾à¤¨ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाना निषà¥à¤•à¥à¤°à¤¿à¤¯ है।',
+'filedelete-edit-reasonlist' => 'हटाने के कारण बदलें',
+'filedelete-maintenance' => 'रखरखाव चल रहा है इसलिठकà¥à¤› समय के लिठसंचिकाओं को मिटाना और वापस पà¥à¤°à¤¾à¤¨ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाना निषà¥à¤•à¥à¤°à¤¿à¤¯ है।',
+'filedelete-maintenance-title' => 'फ़ाइल हटा नहीं सकते',
# MIME search
'mimesearch' => 'MIME खोज',
@@ -1802,6 +1852,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'mostimages' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• से-जà¥à¤¡à¤¼à¥€ हà¥à¤ˆ सञà¥à¤šà¤¿à¤•à¤¾à¤à¤‚',
'mostrevisions' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• अवतरणित पृषà¥à¤ ',
'prefixindex' => 'इस उपसरà¥à¤— वाले भी पनà¥à¤¨à¥‡',
+'prefixindex-namespace' => 'उपसरà¥à¤— के साथ सभी पृषà¥à¤ à¥‹à¤‚ ( $1 नेमसà¥à¤ªà¥‡à¤¸)',
'shortpages' => 'छोटे पनà¥à¤¨à¥‡',
'longpages' => 'लमà¥à¤¬à¥‡ पनà¥à¤¨à¥‡',
'deadendpages' => 'डेड-à¤à¤‚ड पनà¥à¤¨à¥‡',
@@ -1818,7 +1869,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'listusers-editsonly' => 'केवल संपादन कर चà¥à¤•à¥‡ सदसà¥à¤¯ दिखाà¤à¤',
'listusers-creationsort' => 'निरà¥à¤®à¤¾à¤£ तिथि के आधार पर कà¥à¤°à¤®à¤¾à¤‚कन करें',
'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादन}}',
-'usercreated' => '$1 को $2 बजे बनाया गया',
+'usercreated' => '$1 को $2 बजे बनाया गया, $3 ये उपà¥à¤¯à¥‹à¤—ित क नाम है',
'newpages' => 'नठपृषà¥à¤ ',
'newpages-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
'ancientpages' => 'सबसे पà¥à¤°à¤¾à¤¨à¥‡ लेख',
@@ -1912,12 +1963,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'activeusers-noresult' => 'कोई सदसà¥à¤¯ नहीं मिले।',
# Special:Log/newusers
-'newuserlogpage' => 'नये सदसà¥à¤¯à¥‹à¤‚की सूची',
-'newuserlogpagetext' => 'यह नठसदसà¥à¤¯ निरà¥à¤®à¤¾à¤£ का चिटà¥à¤ à¤¾ है।',
-'newuserlog-byemail' => 'कूटशबà¥à¤¦ इ-मेल दà¥à¤µà¤¾à¤°à¤¾ भेजा गया हैं',
-'newuserlog-create-entry' => 'नवीन सदसà¥à¤¯',
-'newuserlog-create2-entry' => 'नया खाता $1 खोला गया',
-'newuserlog-autocreate-entry' => 'खाता अपनेआप खोल दिया हैं',
+'newuserlogpage' => 'नये सदसà¥à¤¯à¥‹à¤‚की सूची',
+'newuserlogpagetext' => 'यह नठसदसà¥à¤¯ निरà¥à¤®à¤¾à¤£ का चिटà¥à¤ à¤¾ है।',
# Special:ListGroupRights
'listgrouprights' => 'सदसà¥à¤¯ गà¥à¤°à¥à¤ª अधिकार',
@@ -1946,7 +1993,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'emailpagetext' => 'नीचे दिठपरà¥à¤šà¥‡ को जरिठआप इस सदसà¥à¤¯ को डाक भेज सकते हैं।
आपने जो पता [[Special:Preferences|अपनी सदसà¥à¤¯ वरीयताओं]] में दिया था वह इस डाक के "पà¥à¤°à¥‡à¤·à¤•" के तौर पर आà¤à¤—ा, अतः पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾ आपको सीधे जवाब दे सकेंगे।',
'usermailererror' => 'मेल ऑबà¥à¤œà¥‡à¤•à¥à¤Ÿ ने यह गलती बताई हैं:',
-'defemailsubject' => 'विकिपीडिया ई-मेल',
+'defemailsubject' => '{{SITENAME}} ई-मेल उपयोगकरà¥à¤¤à¤¾ से " $1 "',
'usermaildisabled' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ ईमेल अकà¥à¤·à¤® किया गया',
'usermaildisabledtext' => 'आप इस विकि पर ई मेल अनà¥à¤¯ यूज़रà¥à¤¸ को नहीं भेज सकते हैं',
'noemailtitle' => 'इ-मेल à¤à¤¡à¥à¤°à¥‡à¤¸ नहीं',
@@ -2002,7 +2049,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'watchmethod-list' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमें दिये गये लेखोंमें हाल में हà¥à¤ बदलाव देख रहें हैं',
'watchlistcontains' => 'आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीमें $1 {{PLURAL:$1|लेख|पनà¥à¤¨à¥‡}} हैं।',
'iteminvalidname' => "'$1' के साथ समसà¥à¤¯à¤¾, अवैध नाम...",
-'wlnote' => "नीचे पीछले {{PLURAL:$2|घंटेमें|'''$2''' घंटोंमें}} हà¥à¤ {{PLURAL:$1|आखिरी बदलाव|आखिरी '''$1''' बदलाव}} दिये हà¥à¤ हैं।",
+'wlnote' => "$3 को $4 बजे तक पिछले '''$2''' {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हà¥à¤ '''$1'''|हà¥à¤† à¤à¤•}} परिवरà¥à¤¤à¤¨ निमà¥à¤¨ {{PLURAL:$1|है|हैं}}।",
'wlshowlast' => 'पिछले $1 घंटे $2 दिन $3 देखें',
'watchlist-options' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची विकलà¥à¤ª',
@@ -2068,8 +2115,6 @@ $UNWATCHURL
'actionfailed' => 'कà¥à¤°à¤¿à¤¯à¤¾ विफल',
'deletedtext' => '"$1" को हटाया गया है ।
हाल में हटाये गये लेखोंकी सूची के लिये $2 देखें ।',
-'deletedarticle' => '"$1" को हटाया गया है।',
-'suppressedarticle' => '"[[$1]]" को सपà¥à¤°à¥‡à¤¸ किया',
'dellogpage' => 'हटाने की सूची',
'dellogpagetext' => 'नीचे हाल में हटायें गये पनà¥à¤¨à¥‹à¤‚की सूची हैं।',
'deletionlog' => 'हटाने की सूची',
@@ -2120,7 +2165,10 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
'unprotectedarticle' => '"[[$1]]" से सà¥à¤°à¤•à¥à¤·à¤¾ हटा दी गई',
'movedarticleprotection' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° "[[$2]]" से बदल कर "[[$1]]" कर दिया गया है',
'protect-title' => '"$1" की सà¥à¤°à¤•à¥à¤·à¤¾ लेवल बदलें',
+'protect-title-notallowed' => '"$1" का सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° देखें',
'prot_1movedto2' => '$1 का नाम बदलकर $2 कर दिया गया है',
+'protect-badnamespace-title' => 'असà¥à¤°à¤•à¥à¤¶à¤¿à¤¤à¥ नाम सà¥à¤¥à¤¾à¤¨',
+'protect-badnamespace-text' => 'इस नाम सà¥à¤¥à¤¾à¤¨ में पृषà¥à¤ à¥‹à¤‚ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नहीं कर सकता।',
'protect-legend' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤¤à¤¾ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करें',
'protectcomment' => 'कारण:',
'protectexpiry' => 'समापà¥à¤¤à¤¿:',
@@ -2141,6 +2189,7 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
'protect-level-sysop' => 'केवल पà¥à¤°à¤¬à¤¨à¥à¤§à¤•',
'protect-summary-cascade' => 'सीढी',
'protect-expiring' => 'समापà¥à¤¤à¥€ $1 (UTC)',
+'protect-expiring-local' => 'समापà¥à¤¤à¥€ $1',
'protect-expiry-indefinite' => 'बेमियादी',
'protect-cascade' => 'इस पनà¥à¤¨à¥‡ से जà¥à¤¡à¥‡ हà¥à¤ पनà¥à¤¨à¥‡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें (सà¥à¤°à¤•à¥à¤·à¤¾-सीढी)',
'protect-cantedit' => 'आप इस पनà¥à¤¨à¥‡à¤•à¤¾ सà¥à¤°à¤•à¥à¤·à¤¾-सà¥à¤¤à¤° बदल नहीं सकते कà¥à¤¯à¥‹à¤‚की आपको à¤à¤¸à¤¾ करने की अनà¥à¤®à¤¤à¤¿ नहीं है ।',
@@ -2202,7 +2251,6 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
'undeletereset' => 'पूरà¥à¤µà¤µà¤¤ करें',
'undeleteinvert' => 'चà¥à¤¨à¤¾à¤µ उलटें',
'undeletecomment' => 'टिपà¥à¤ªà¤£à¥€ हटाना',
-'undeletedarticle' => '"[[$1]]" पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया',
'undeletedrevisions' => '{{PLURAL:$1|à¤à¤• रूपानà¥à¤¤à¤° वापस लाया गया|$1 रूपानà¥à¤¤à¤° वापस लाये गये}} है',
'undeletedrevisions-files' => '{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाईल|$2 फ़ाइलें}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ कर दियें',
'undeletedfiles' => '{{PLURAL:$1|1 फ़ाईल|$1 फ़ाईलें}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
@@ -2212,6 +2260,7 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
हाल में हटायें गये तथा पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ किये हà¥à¤ पनà¥à¤¨à¥‹à¤‚की ज़ानकारी के लिये [[Special:Log/delete|हटानेकी सूची]] देखें।",
'undelete-header' => 'हाल में हटाये गये पनà¥à¤¨à¥‡ देखने के लियें [[Special:Log/delete|हटाने की सूची]] देखें।',
+'undelete-search-title' => 'हटाये गये पनà¥à¤¨à¥‡ खोज़ें',
'undelete-search-box' => 'हटायें गयें पनà¥à¤¨à¥‡ खोजें',
'undelete-search-prefix' => 'से शà¥à¤°à¥ होने पनà¥à¤¨à¥‡ दरà¥à¤¶à¤¾à¤¯à¥‡à¤‚:',
'undelete-search-submit' => 'खोजें',
@@ -2221,6 +2270,7 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित आखिरी अवतरण कà
'undelete-cleanup-error' => 'इसà¥à¤¤à¥‡à¤®à¤¾à¤²à¤®à¥‡à¤‚ न लाई गई "$1" आरà¥à¤šà¤¿à¤µà¥à¤¹ फ़ाईल हटाने में समसà¥à¤¯à¤¾ हà¥à¤ˆ हैं।',
'undelete-missing-filearchive' => 'सिचिका पà¥à¤°à¤¾à¤²à¥‡à¤– कà¥à¤°à¤®à¤¾à¤‚क $1 को पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने में असकà¥à¤·à¤® हैं, कà¥à¤¯à¥‹à¤‚कि यह आà¤à¤•à¤¡à¤¼à¤¾à¤•à¥‹à¤· में उपलबà¥à¤§ नहीं है।
या à¤à¤¸à¤¾ भी हो सकता है कि इसे पहले से ही पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया जा चà¥à¤•à¤¾ हो।',
+'undelete-error' => 'पृषà¥à¤  अविलोपन में तà¥à¤°à¥à¤Ÿà¤¿',
'undelete-error-short' => 'फ़ाईल पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने में समसà¥à¤¯à¤¾: $1',
'undelete-error-long' => 'फ़ाईल पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने में आई हà¥à¤ˆ समसà¥à¤¯à¤¾à¤à¤‚:
@@ -2340,6 +2390,7 @@ $1',
'blocklist-userblocks' => 'खाते के अवरोध छिपाà¤à¤‚',
'blocklist-tempblocks' => 'असà¥à¤¥à¤¾à¤ˆ अवरोध छिपाà¤à¤‚',
'blocklist-addressblocks' => 'à¤à¤•à¤² आईपी अवरोध छिपाà¤à¤‚',
+'blocklist-rangeblocks' => 'शà¥à¤°à¥‡à¤£à¥€ बà¥à¤²à¥‰à¤• छà¥à¤ªà¤¾à¤à¤',
'blocklist-timestamp' => 'टाइमसà¥à¤Ÿà¥ˆà¤®à¥à¤ª',
'blocklist-target' => 'लकà¥à¤·à¥à¤¯',
'blocklist-expiry' => 'अवसान',
@@ -2362,6 +2413,7 @@ $1',
'unblocklink' => 'अवरोध हटाà¤à¤',
'change-blocklink' => 'विभाग बदलें',
'contribslink' => 'योगदान',
+'emaillink' => 'ई-मेल भेजें',
'autoblocker' => 'आपका IP पता सà¥à¤µà¤¤: बाधà¥à¤¯ है, जो की हाल ही में "[[User:$1|$1]]" दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤— किया गया है।
$1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'blocklogpage' => 'बà¥à¤²à¥‰à¤• सूची',
@@ -2499,9 +2551,6 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'movepage-page-moved' => '$1 यह पृषà¥à¤  $2 इस नामपर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर दिया गया।',
'movepage-page-unmoved' => '$1 यह पृषà¥à¤  $2 इस नामपर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित नहीं कर पायें।',
'movepage-max-pages' => 'जà¥à¤¯à¤¾à¤¦à¤¾à¤¸à¥‡ जà¥à¤¯à¤¾à¤¦à¤¾ $1 पृषà¥à¤  सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर {{PLURAL:$1|दिया गया है|दिये गये हैं}}, अब और पृषà¥à¤  अपनेआप सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित नहीं होंगे।',
-'1movedto2' => '[[$1]] का नाम बदलकर [[$2]] कर दिया गया है',
-'1movedto2_redir' => '[[$1]] यह लेख का नाम बदल कर [[$2]] कर दिया गया हैं (अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤)',
-'move-redirect-suppressed' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ नहीं किया गया',
'movelogpage' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤£ सूची',
'movelogpagetext' => 'नाम बदले गये लेखोंकी सूची नीचे दी गई हैं।',
'movesubpage' => '{{PLURAL:$1|उप पनà¥à¤¨à¤¾|उप पनà¥à¤¨à¥‡}}',
@@ -2514,7 +2563,7 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
लकà¥à¤·à¥à¤¯ पृषà¥à¤  "[[:$1]]" पहले से असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ हैं।
नाम बदलने के लिये कà¥à¤¯à¤¾ आप इसे हटाना चाहतें हैं?',
'delete_and_move_confirm' => 'जी हां, पनà¥à¤¨à¤¾ हटाईयें',
-'delete_and_move_reason' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करने के लिये जगह बनाई',
+'delete_and_move_reason' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण करने के लिये जगह बनाई गयी है',
'selfmove' => 'सà¥à¤°à¥‹à¤¤ और लकà¥à¤·à¥à¤¯ शीरà¥à¤·à¤• समान हैं;
पनà¥à¤¨à¤¾ अपने ही जगह पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित नहीं हो सकता।',
'immobile-source-namespace' => 'नामसà¥à¤¥à¤¾à¤¨ "$1" के पनà¥à¤¨à¥‹à¤‚ का सà¥à¤¥à¤¾à¤¨à¤‚तरण नहीं किया जा सकता है।',
@@ -2546,6 +2595,7 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'exportcuronly' => 'पूरा इतिहास नहीं चाहियें, सिरà¥à¤« अभी का अवतरण अंतरà¥à¤­à¥‚त करें',
'exportnohistory' => "----
'''सूचना:''' इस फॉरà¥à¤® का इसà¥à¤¤à¥‡à¤®à¤¾à¤² कर पनà¥à¤¨à¥‡à¤•à¤¾ पूरा इतिहास निरà¥à¤¯à¤¾à¤¤ करना परफॉरà¥à¤®à¥‡à¤¨à¥à¤¸ के चलते रोक दिया गया हैं।",
+'exportlistauthors' => 'पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• पृषà¥à¤  के लिठयोगदानकरà¥à¤¤à¤¾à¤“ं की à¤à¤• पूरी सूची शामिल करें ।',
'export-submit' => 'निरà¥à¤¯à¤¾à¤¤',
'export-addcattext' => 'इस शà¥à¤°à¥‡à¤£à¥€à¤¸à¥‡ पनà¥à¤¨à¥‡ चà¥à¤¨à¥‡à¤‚:',
'export-addcat' => 'चà¥à¤¨à¥‡à¤‚',
@@ -2623,6 +2673,8 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'import-token-mismatch' => 'सतà¥à¤° सामगà¥à¤°à¥€ खो गई है।
कृपया पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करें।',
'import-invalid-interwiki' => 'इस विकि से आयात नहीं हो सकता है।',
+'import-error-edit' => 'पृषà¥à¤  " $1 " आयातित नहीं किया जासकता है कà¥à¤¯à¥‹à¤‚कि आपको उसे संपादित करने की अनà¥à¤®à¤¤à¤¿ नहीं हैं।',
+'import-error-create' => 'पृषà¥à¤  " $1 " आयातित नहीं है कà¥à¤¯à¥‹à¤‚कि आपको उसे बनाने की अनà¥à¤®à¤¤à¤¿ नहीं हैं।',
# Import log
'importlogpage' => 'आयात सूची',
@@ -2633,73 +2685,75 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'import-logentry-interwiki-detail' => '$2 से $1 {{PLURAL:$1|अवतरण|अवतरण}}',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'आपका पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾',
-'tooltip-pt-anonuserpage' => 'आप जिस आईपी से बदलाव कर रहें हैं उसका सदसà¥à¤¯ पान',
-'tooltip-pt-mytalk' => 'आपका वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾',
-'tooltip-pt-anontalk' => 'इस आईपी à¤à¤¡à¥à¤°à¥‡à¤¸à¤¸à¥‡ हà¥à¤ बदलावों के बारे में वारà¥à¤¤à¤¾',
-'tooltip-pt-preferences' => 'आपकी वरीयताà¤à¤',
-'tooltip-pt-watchlist' => 'आपने धà¥à¤¯à¤¾à¤¨ दिये हà¥à¤ पनà¥à¤¨à¥‹à¤‚की सूची',
-'tooltip-pt-mycontris' => 'आपके योगदानों की सूची',
-'tooltip-pt-login' => 'आपको सतà¥à¤°à¤¾à¤°à¤®à¥à¤­ करने के लिठपà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¿à¤¤ किया जाता है; लेकिन यह अनिवारà¥à¤¯ नहीं है',
-'tooltip-pt-anonlogin' => 'आप लॉग इन करें, जबकि यह अतà¥à¤¯à¤¾à¤µà¤¶à¥à¤¯à¤• नहीं हैं।',
-'tooltip-pt-logout' => 'सतà¥à¤°à¤¾à¤‚त',
-'tooltip-ca-talk' => 'सामगà¥à¤°à¥€ पनà¥à¤¨à¥‡ के बारे में वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
-'tooltip-ca-edit' => 'आप यह पनà¥à¤¨à¤¾ बदल सकते हैं।
+'tooltip-pt-userpage' => 'आपका पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ पनà¥à¤¨à¤¾',
+'tooltip-pt-anonuserpage' => 'आप जिस आईपी से बदलाव कर रहें हैं उसका सदसà¥à¤¯ पान',
+'tooltip-pt-mytalk' => 'आपका वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾',
+'tooltip-pt-anontalk' => 'इस आईपी à¤à¤¡à¥à¤°à¥‡à¤¸à¤¸à¥‡ हà¥à¤ बदलावों के बारे में वारà¥à¤¤à¤¾',
+'tooltip-pt-preferences' => 'आपकी वरीयताà¤à¤',
+'tooltip-pt-watchlist' => 'आपने धà¥à¤¯à¤¾à¤¨ दिये हà¥à¤ पनà¥à¤¨à¥‹à¤‚की सूची',
+'tooltip-pt-mycontris' => 'आपके योगदानों की सूची',
+'tooltip-pt-login' => 'आपको सतà¥à¤°à¤¾à¤°à¤®à¥à¤­ करने के लिठपà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¿à¤¤ किया जाता है; लेकिन यह अनिवारà¥à¤¯ नहीं है',
+'tooltip-pt-anonlogin' => 'आप लॉग इन करें, जबकि यह अतà¥à¤¯à¤¾à¤µà¤¶à¥à¤¯à¤• नहीं हैं।',
+'tooltip-pt-logout' => 'सतà¥à¤°à¤¾à¤‚त',
+'tooltip-ca-talk' => 'सामगà¥à¤°à¥€ पनà¥à¤¨à¥‡ के बारे में वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
+'tooltip-ca-edit' => 'आप यह पनà¥à¤¨à¤¾ बदल सकते हैं।
कृपया बदलाव संजोने से पहले à¤à¤²à¤• देखें।',
-'tooltip-ca-addsection' => 'नया विभाग आरमà¥à¤­ करें',
-'tooltip-ca-viewsource' => 'यह पृषà¥à¤  रकà¥à¤·à¤¿à¤¤ हैं। आप इसका सà¥à¤°à¥‹à¤¤ देख सकते हैं।',
-'tooltip-ca-history' => 'इस पनà¥à¤¨à¥‡ के पà¥à¤°à¤¾à¤¨à¥‡ अवतरण',
-'tooltip-ca-protect' => 'इस पनà¥à¤¨à¥‡à¤•à¥‹ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ किजीयें',
-'tooltip-ca-unprotect' => 'इस पृषà¥à¤  की सà¥à¤°à¤•à¥à¤·à¤¾ बदलें ।',
-'tooltip-ca-delete' => 'इस पनà¥à¤¨à¥‡ को हटाà¤à¤‚',
-'tooltip-ca-undelete' => 'इस पनà¥à¤¨à¥‡à¤•à¥‹ हटाने से पहले किये गये बदलाव पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें',
-'tooltip-ca-move' => 'यह पनà¥à¤¨à¤¾ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करें',
-'tooltip-ca-watch' => 'इस पनà¥à¤¨à¥‡ को अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में डालें',
-'tooltip-ca-unwatch' => 'यह पनà¥à¤¨à¤¾ अपने धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीसे हटाà¤à¤‚',
-'tooltip-search' => '{{SITENAME}} में खोजें',
-'tooltip-search-go' => 'अगर इस शीरà¥à¤·à¤• का पनà¥à¤¨à¤¾ हैं तो उसपर चलें',
-'tooltip-search-fulltext' => 'इस वाकà¥à¤¯à¤¾à¤‚श को पनà¥à¤¨à¥‹à¤‚ में खोजें',
-'tooltip-p-logo' => 'मà¥à¤– पृषà¥à¤ ',
-'tooltip-n-mainpage' => 'मà¥à¤–पृषà¥à¤  पर जाà¤à¤',
-'tooltip-n-mainpage-description' => 'मà¥à¤–पृषà¥à¤  पर जाà¤à¤',
-'tooltip-n-portal' => 'परियोजना के बारे में, आप कà¥à¤¯à¤¾ कर सकतें हैं, सहायता कहाठसे लें',
-'tooltip-n-currentevents' => 'हालकी घटनाओं की पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤¾à¤ªà¥à¤¤ करें',
-'tooltip-n-recentchanges' => 'विकि में हाल में हà¥à¤ बदलावों की सूची',
-'tooltip-n-randompage' => 'किसी à¤à¤• लेख पर जाà¤à¤',
-'tooltip-n-help' => 'पता लगाने का सà¥à¤¥à¤¾à¤¨',
-'tooltip-t-whatlinkshere' => 'यहाठका हवाला देने वाले सभी विकि पनà¥à¤¨à¥‹à¤‚ की सूची',
-'tooltip-t-recentchangeslinked' => 'यहां जà¥à¤¡à¥‡ हà¥à¤ सभी पनà¥à¤¨à¥‹à¤‚में हà¥à¤ हाल के बदलाव',
-'tooltip-feed-rss' => 'इस पनà¥à¤¨à¥‡ की आरà¤à¤¸à¤à¤¸ फ़ीड',
-'tooltip-feed-atom' => 'इस पनà¥à¤¨à¥‡ की अणॠफ़ीड',
-'tooltip-t-contributions' => 'इस सदसà¥à¤¯à¤•à¥‡ योगदानकी सूची देखियें',
-'tooltip-t-emailuser' => 'इस सदसà¥à¤¯ को इमेल भेजें',
-'tooltip-t-upload' => 'संचिका चढ़ाà¤à¤',
-'tooltip-t-specialpages' => 'सभी खास पनà¥à¤¨à¥‹à¤‚की सूची',
-'tooltip-t-print' => 'इस पनà¥à¤¨à¥‡à¤•à¤¾ छपानेलायक अवतरण',
-'tooltip-t-permalink' => 'पनà¥à¤¨à¥‡ के इस संसà¥à¤•à¤°à¤£ की सà¥à¤¥à¤¾à¤¯à¥€ कड़ी',
-'tooltip-ca-nstab-main' => 'सामगà¥à¤°à¥€ वाला पनà¥à¤¨à¤¾ देखें',
-'tooltip-ca-nstab-user' => 'सदसà¥à¤¯ पनà¥à¤¨à¤¾ देखियें',
-'tooltip-ca-nstab-media' => 'मीडिया पनà¥à¤¨à¥‡ देखें',
-'tooltip-ca-nstab-special' => 'यह à¤à¤• खास पनà¥à¤¨à¤¾ है, आप इसे बदल नहीं सकतें हैं',
-'tooltip-ca-nstab-project' => 'पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ पनà¥à¤¨à¤¾ देखियें',
-'tooltip-ca-nstab-image' => 'संचिका का पनà¥à¤¨à¤¾ देखें',
-'tooltip-ca-nstab-mediawiki' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ सनà¥à¤¦à¥‡à¤¶ देखें',
-'tooltip-ca-nstab-template' => 'टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ देखियें',
-'tooltip-ca-nstab-help' => 'सहायता पनà¥à¤¨à¥‡ पर जाईयें',
-'tooltip-ca-nstab-category' => 'शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ पनà¥à¤¨à¤¾ देखियें',
-'tooltip-minoredit' => 'इसे छोटे बदलाव के तौर पर दरà¥à¤œ करें',
-'tooltip-save' => 'अपने बदलाव सà¤à¤œà¥‹à¤à¤',
-'tooltip-preview' => 'अपने बदलावों की à¤à¤²à¤• देखें, कृपया सà¤à¤œà¥‹à¤¨à¥‡ से पहले इसका इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें!',
-'tooltip-diff' => 'इस पाठà¥à¤¯à¤®à¥‡à¤‚ आपने किये हà¥à¤ बदलाव देखें।',
-'tooltip-compareselectedversions' => 'इस पृषà¥à¤  के चà¥à¤¨à¥‡ हà¥à¤ अवतरणों में अनà¥à¤¤à¤° देखें।',
-'tooltip-watch' => 'इस पनà¥à¤¨à¥‡ को अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में डालें।',
-'tooltip-recreate' => 'यह पनà¥à¤¨à¤¾ पहले हटाया होने के बावजूद फिरसे बनायें',
-'tooltip-upload' => 'अपलोड शà¥à¤°à¥‚ करें',
-'tooltip-rollback' => '"वापस ले जाà¤à¤" इस पनà¥à¤¨à¥‡ के पिछले योगदाता के बदलाव à¤à¤• ही चटके में ग़ायब कर देता है।',
-'tooltip-undo' => '"पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाà¤à¤" इस बदलाव को वापस ले जा के संपादन परà¥à¤šà¥‡ को à¤à¤²à¤• रीति में दिखलाता है।
+'tooltip-ca-addsection' => 'नया विभाग आरमà¥à¤­ करें',
+'tooltip-ca-viewsource' => 'यह पृषà¥à¤  रकà¥à¤·à¤¿à¤¤ हैं। आप इसका सà¥à¤°à¥‹à¤¤ देख सकते हैं।',
+'tooltip-ca-history' => 'इस पनà¥à¤¨à¥‡ के पà¥à¤°à¤¾à¤¨à¥‡ अवतरण',
+'tooltip-ca-protect' => 'इस पनà¥à¤¨à¥‡à¤•à¥‹ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ किजीयें',
+'tooltip-ca-unprotect' => 'इस पृषà¥à¤  की सà¥à¤°à¤•à¥à¤·à¤¾ बदलें ।',
+'tooltip-ca-delete' => 'इस पनà¥à¤¨à¥‡ को हटाà¤à¤‚',
+'tooltip-ca-undelete' => 'इस पनà¥à¤¨à¥‡à¤•à¥‹ हटाने से पहले किये गये बदलाव पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें',
+'tooltip-ca-move' => 'यह पनà¥à¤¨à¤¾ सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करें',
+'tooltip-ca-watch' => 'इस पनà¥à¤¨à¥‡ को अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में डालें',
+'tooltip-ca-unwatch' => 'यह पनà¥à¤¨à¤¾ अपने धà¥à¤¯à¤¾à¤¨à¤¸à¥‚चीसे हटाà¤à¤‚',
+'tooltip-search' => '{{SITENAME}} में खोजें',
+'tooltip-search-go' => 'अगर इस शीरà¥à¤·à¤• का पनà¥à¤¨à¤¾ हैं तो उसपर चलें',
+'tooltip-search-fulltext' => 'इस वाकà¥à¤¯à¤¾à¤‚श को पनà¥à¤¨à¥‹à¤‚ में खोजें',
+'tooltip-p-logo' => 'मà¥à¤– पृषà¥à¤ ',
+'tooltip-n-mainpage' => 'मà¥à¤–पृषà¥à¤  पर जाà¤à¤',
+'tooltip-n-mainpage-description' => 'मà¥à¤–पृषà¥à¤  पर जाà¤à¤',
+'tooltip-n-portal' => 'परियोजना के बारे में, आप कà¥à¤¯à¤¾ कर सकतें हैं, सहायता कहाठसे लें',
+'tooltip-n-currentevents' => 'हालकी घटनाओं की पृषà¥à¤ à¤­à¥‚मि पà¥à¤°à¤¾à¤ªà¥à¤¤ करें',
+'tooltip-n-recentchanges' => 'विकि में हाल में हà¥à¤ बदलावों की सूची',
+'tooltip-n-randompage' => 'किसी à¤à¤• लेख पर जाà¤à¤',
+'tooltip-n-help' => 'पता लगाने का सà¥à¤¥à¤¾à¤¨',
+'tooltip-t-whatlinkshere' => 'यहाठका हवाला देने वाले सभी विकि पनà¥à¤¨à¥‹à¤‚ की सूची',
+'tooltip-t-recentchangeslinked' => 'यहां जà¥à¤¡à¥‡ हà¥à¤ सभी पनà¥à¤¨à¥‹à¤‚में हà¥à¤ हाल के बदलाव',
+'tooltip-feed-rss' => 'इस पनà¥à¤¨à¥‡ की आरà¤à¤¸à¤à¤¸ फ़ीड',
+'tooltip-feed-atom' => 'इस पनà¥à¤¨à¥‡ की अणॠफ़ीड',
+'tooltip-t-contributions' => 'इस सदसà¥à¤¯à¤•à¥‡ योगदानकी सूची देखियें',
+'tooltip-t-emailuser' => 'इस सदसà¥à¤¯ को इमेल भेजें',
+'tooltip-t-upload' => 'संचिका चढ़ाà¤à¤',
+'tooltip-t-specialpages' => 'सभी खास पनà¥à¤¨à¥‹à¤‚की सूची',
+'tooltip-t-print' => 'इस पनà¥à¤¨à¥‡à¤•à¤¾ छपानेलायक अवतरण',
+'tooltip-t-permalink' => 'पनà¥à¤¨à¥‡ के इस संसà¥à¤•à¤°à¤£ की सà¥à¤¥à¤¾à¤¯à¥€ कड़ी',
+'tooltip-ca-nstab-main' => 'सामगà¥à¤°à¥€ वाला पनà¥à¤¨à¤¾ देखें',
+'tooltip-ca-nstab-user' => 'सदसà¥à¤¯ पनà¥à¤¨à¤¾ देखियें',
+'tooltip-ca-nstab-media' => 'मीडिया पनà¥à¤¨à¥‡ देखें',
+'tooltip-ca-nstab-special' => 'यह à¤à¤• खास पनà¥à¤¨à¤¾ है, आप इसे बदल नहीं सकतें हैं',
+'tooltip-ca-nstab-project' => 'पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ पनà¥à¤¨à¤¾ देखियें',
+'tooltip-ca-nstab-image' => 'संचिका का पनà¥à¤¨à¤¾ देखें',
+'tooltip-ca-nstab-mediawiki' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ सनà¥à¤¦à¥‡à¤¶ देखें',
+'tooltip-ca-nstab-template' => 'टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ देखियें',
+'tooltip-ca-nstab-help' => 'सहायता पनà¥à¤¨à¥‡ पर जाईयें',
+'tooltip-ca-nstab-category' => 'शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ पनà¥à¤¨à¤¾ देखियें',
+'tooltip-minoredit' => 'इसे छोटे बदलाव के तौर पर दरà¥à¤œ करें',
+'tooltip-save' => 'अपने बदलाव सà¤à¤œà¥‹à¤à¤',
+'tooltip-preview' => 'अपने बदलावों की à¤à¤²à¤• देखें, कृपया सà¤à¤œà¥‹à¤¨à¥‡ से पहले इसका इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें!',
+'tooltip-diff' => 'इस पाठà¥à¤¯à¤®à¥‡à¤‚ आपने किये हà¥à¤ बदलाव देखें।',
+'tooltip-compareselectedversions' => 'इस पृषà¥à¤  के चà¥à¤¨à¥‡ हà¥à¤ अवतरणों में अनà¥à¤¤à¤° देखें।',
+'tooltip-watch' => 'इस पनà¥à¤¨à¥‡ को अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में डालें।',
+'tooltip-watchlistedit-normal-submit' => 'पृषà¥à¤  हटाà¤à¤',
+'tooltip-watchlistedit-raw-submit' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची अपडेट करें',
+'tooltip-recreate' => 'यह पनà¥à¤¨à¤¾ पहले हटाया होने के बावजूद फिरसे बनायें',
+'tooltip-upload' => 'अपलोड शà¥à¤°à¥‚ करें',
+'tooltip-rollback' => '"वापस ले जाà¤à¤" इस पनà¥à¤¨à¥‡ के पिछले योगदाता के बदलाव à¤à¤• ही चटके में ग़ायब कर देता है।',
+'tooltip-undo' => '"पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाà¤à¤" इस बदलाव को वापस ले जा के संपादन परà¥à¤šà¥‡ को à¤à¤²à¤• रीति में दिखलाता है।
इसके जरिठसारांश में पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ में लाने का कारण लिखा जा सकता है।',
-'tooltip-preferences-save' => 'वरीयताà¤à¤‚ सहेजें',
-'tooltip-summary' => 'à¤à¤• संकà¥à¤·à¤¿à¤ªà¥à¤¤ सारांश दरà¥à¤œ करें',
+'tooltip-preferences-save' => 'वरीयताà¤à¤‚ सहेजें',
+'tooltip-summary' => 'à¤à¤• संकà¥à¤·à¤¿à¤ªà¥à¤¤ सारांश दरà¥à¤œ करें',
# Stylesheets
'common.css' => '/* यहां रखी css सभी तà¥à¤µà¤šà¤¾à¤“ंपर असर करेगी */',
@@ -2760,9 +2814,6 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
# Patrol log
'patrol-log-page' => 'नजर रखनेकी सूची',
'patrol-log-header' => 'यह निगरानी में बने संसà¥à¤•à¤°à¤£à¥‹à¤‚ का चिटà¥à¤ à¤¾ है।',
-'patrol-log-line' => '$2 के $1 अवतरण पर नजर रखी $3',
-'patrol-log-auto' => '(सà¥à¤µà¤¤:)',
-'patrol-log-diff' => 'संसà¥à¤•à¤°à¤£ $1',
'log-show-hide-patrol' => 'गशà¥à¤¤à¥€ अभिलेख $1',
# Image deletion
@@ -2781,22 +2832,24 @@ $1',
'nextdiff' => 'ताज़ा संपादन →',
# Media information
-'mediawarning' => 'चेतावनी मीडिया',
-'imagemaxsize' => "छवि आकार सीमा:<br />''(संचिका वरà¥à¤£à¤¨ पनà¥à¤¨à¥‹à¤‚ के लिà¤)''",
-'thumbsize' => 'अंगूठानख आकार:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|पनà¥à¤¨à¤¾|पनà¥à¤¨à¥‡}}',
-'file-info' => 'फ़ाईल का आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2',
-'file-info-size' => '$1 × $2 चितà¥à¤°à¤¤à¤¤à¥à¤µ, संचिका का आकार: $3, माइम पà¥à¤°à¤•à¤¾à¤°: $4',
-'file-info-size-pages' => '$1 × $2 पिकà¥à¤¸à¥‡à¤², फ़ाइल का आकार: $3 , MIME पà¥à¤°à¤•à¤¾à¤°: $4 , $5 {{PLURAL:$5| page|pages}}',
-'file-nohires' => '<small>इससे जà¥à¤¯à¤¾à¤¦à¤¾ रिज़ोलà¥à¤¯à¥‚शन उपलबà¥à¤§ नहीं हैं.</small>',
-'svg-long-desc' => 'SVG फ़ाईल, साधारणत: $1 × $2 पीकà¥à¤¸à¥‡à¤²à¥à¤¸, फ़ाईलका आकार: $3',
-'show-big-image' => 'समà¥à¤ªà¥‚रà¥à¤£ रिज़ोलà¥à¤¯à¥‚शन',
-'show-big-image-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²',
-'file-info-gif-looped' => 'चकà¥à¤°à¤¿à¤¤',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|ढाà¤à¤šà¤¾|ढाà¤à¤šà¥‡}}',
-'file-info-png-looped' => 'चकà¥à¤°à¤¿à¤¤',
-'file-info-png-repeat' => 'पà¥à¤²à¥‡ हो चà¥à¤•à¤¾ $1 {{PLURAL:$1| time|times}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'mediawarning' => 'चेतावनी मीडिया',
+'imagemaxsize' => "छवि आकार सीमा:<br />''(संचिका वरà¥à¤£à¤¨ पनà¥à¤¨à¥‹à¤‚ के लिà¤)''",
+'thumbsize' => 'अंगूठानख आकार:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|पनà¥à¤¨à¤¾|पनà¥à¤¨à¥‡}}',
+'file-info' => 'फ़ाईल का आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2',
+'file-info-size' => '$1 × $2 चितà¥à¤°à¤¤à¤¤à¥à¤µ, संचिका का आकार: $3, माइम पà¥à¤°à¤•à¤¾à¤°: $4',
+'file-info-size-pages' => '$1 × $2 पिकà¥à¤¸à¥‡à¤², फ़ाइल का आकार: $3 , MIME पà¥à¤°à¤•à¤¾à¤°: $4 , $5 {{PLURAL:$5| page|pages}}',
+'file-nohires' => 'इससे जà¥à¤¯à¤¾à¤¦à¤¾ रिज़ोलà¥à¤¯à¥‚शन उपलबà¥à¤§ नहीं हैं.',
+'svg-long-desc' => 'SVG फ़ाईल, साधारणत: $1 × $2 पीकà¥à¤¸à¥‡à¤²à¥à¤¸, फ़ाईलका आकार: $3',
+'show-big-image' => 'समà¥à¤ªà¥‚रà¥à¤£ रिज़ोलà¥à¤¯à¥‚शन',
+'show-big-image-preview' => 'इस पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ का आकार: $1 ।',
+'show-big-image-other' => 'अनà¥à¤¯ {{PLURAL:$2| resolution|resolutions}}: $1 ।',
+'show-big-image-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²',
+'file-info-gif-looped' => 'चकà¥à¤°à¤¿à¤¤',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|ढाà¤à¤šà¤¾|ढाà¤à¤šà¥‡}}',
+'file-info-png-looped' => 'चकà¥à¤°à¤¿à¤¤',
+'file-info-png-repeat' => 'पà¥à¤²à¥‡ हो चà¥à¤•à¤¾ $1 {{PLURAL:$1| time|times}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
# Special:NewFiles
'newimages' => 'नई फ़ाईलà¥à¤¸à¤•à¥€ गैलरी',
@@ -2810,6 +2863,13 @@ $1',
'bydate' => 'तिथि अनà¥à¤¸à¤¾à¤°',
'sp-newimages-showfrom' => '$2, $1 के बाद की फ़ाईलें दरà¥à¤¶à¤¾à¤¯à¥‡à¤‚',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 second|$1 seconds}}',
+'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
+'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
+'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'ago' => '$1 पहले',
+
# Bad image list
'bad_image_list' => 'पà¥à¤°à¤¾à¤°à¥‚प इस पà¥à¤°à¤•à¤¾à¤° है:
@@ -3291,13 +3351,6 @@ $5
'scarytranscludefailed' => '[$1 के लिये साà¤à¤šà¤¾ मà¤à¤—ा नहीं पाà¤]',
'scarytranscludetoolong' => '[यूआरà¤à¤² बहà¥à¤¤ लंबा है]',
-# Trackbacks
-'trackbackbox' => 'इस पनà¥à¤¨à¥‡ के लिये टà¥à¤°à¥ˆà¤•à¤¬à¥ˆà¤•:<br />
-$1',
-'trackbackremove' => '([$1 हटायें])',
-'trackbacklink' => 'टà¥à¤°à¥ˆà¤•à¤¬à¥ˆà¤•',
-'trackbackdeleteok' => 'टà¥à¤°à¥ˆà¤•à¤¬à¥ˆà¤• को हटाया गया।',
-
# Delete conflict
'deletedwhileediting' => "'''Warning''': आपने जब से संपादन शà¥à¤°à¥‚ किया है, उसके बाद से यह पनà¥à¤¨à¤¾ ही मिटा दिया गया है!",
'confirmrecreate' => "सदसà¥à¤¯ [[User:$1|$1]] ([[User talk:$1|वारà¥à¤¤à¤¾]]) ने आपके दà¥à¤µà¤¾à¤°à¤¾ संपादन शà¥à¤°à¥‚ होने के बाद यह पनà¥à¤¨à¤¾ निमà¥à¤¨à¤²à¤¿à¤–ित कारण देकर हटाया हैं:
@@ -3432,6 +3485,9 @@ $1',
'hebrew-calendar-m11-gen' => 'à¤à¤µà¥€ (Av)',
'hebrew-calendar-m12-gen' => 'à¤à¤²à¥à¤² (Elul)',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वारà¥à¤¤à¤¾]])',
+
# Core parser functions
'unknown_extension_tag' => 'गलत à¤à¤•à¥à¤¸à¥à¤Ÿà¥‡à¤‚शन टैग "$1"',
'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' पà¥à¤°à¤¾à¤¨à¥€ मूल कà¥à¤°à¤®à¤¾à¤‚कन कà¥à¤‚जी "$1" के बजाय अब मूल कà¥à¤°à¤®à¤¾à¤‚कन कà¥à¤‚जी "$2" होगी।',
@@ -3482,7 +3538,7 @@ $1',
'specialpages' => 'विशेष पृषà¥à¤ ',
'specialpages-note' => '----
* साधारण विशेष पृषà¥à¤ à¥¤
-* <strong class="mw-specialpagerestricted">पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित विशेष पृषà¥à¤ à¥¤</strong>',
+* <span class="mw-specialpagerestricted">पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित विशेष पृषà¥à¤ à¥¤</span>',
'specialpages-group-maintenance' => 'अनà¥à¤°à¤•à¥à¤·à¤£ रिपोरà¥à¤Ÿ',
'specialpages-group-other' => 'अनà¥à¤¯ विशेष पृषà¥à¤ ',
'specialpages-group-login' => 'सतà¥à¤° पà¥à¤°à¤¾à¤°à¤®à¥à¤­ / हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करें',
@@ -3524,13 +3580,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|बदलाव|बदलाव}}',
# Special:ComparePages
-'comparepages' => 'पृषà¥à¤ à¥‹à¤‚ की तà¥à¤²à¤¨à¤¾ करें',
-'compare-selector' => 'पृषà¥à¤  संशोधन की तà¥à¤²à¤¨à¤¾ करें',
-'compare-page1' => 'पृषà¥à¤  १',
-'compare-page2' => 'पृषà¥à¤  २',
-'compare-rev1' => 'पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ १',
-'compare-rev2' => 'पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ २',
-'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करें',
+'comparepages' => 'पृषà¥à¤ à¥‹à¤‚ की तà¥à¤²à¤¨à¤¾ करें',
+'compare-selector' => 'पृषà¥à¤  संशोधन की तà¥à¤²à¤¨à¤¾ करें',
+'compare-page1' => 'पृषà¥à¤  १',
+'compare-page2' => 'पृषà¥à¤  २',
+'compare-rev1' => 'पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ १',
+'compare-rev2' => 'पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ २',
+'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करें',
+'compare-invalid-title' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ शीरà¥à¤·à¤• अमानà¥à¤¯ है।',
+'compare-title-not-exists' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ शीरà¥à¤·à¤• मौजूद नहीं है।',
+'compare-revision-not-exists' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ संशोधन मौजूद नहीं है।',
# Database error messages
'dberr-header' => 'इस विकि को कà¥à¤› दिकà¥à¤•à¤¤ आ रही है',
@@ -3557,4 +3616,90 @@ $1',
'sqlite-has-fts' => '$1 पूरà¥à¤£ पाठ खोज समरà¥à¤¥à¤¨ के साथ',
'sqlite-no-fts' => '$1पूरà¥à¤£-पाठ खोज समरà¥à¤¥à¤¨ के बिना',
+# New logging system
+'logentry-delete-delete' => '$1 हटा दिया गया पृषà¥à¤  $3',
+'logentry-delete-restore' => '$1 बहाल पृषà¥à¤  $3',
+'logentry-delete-event' => '$1 changed दृशà¥à¤¯à¤¤à¤¾ के {{PLURAL:$5|a log event|$5 log events}} पर $3: $4',
+'logentry-delete-revision' => '$1 ने $3 पृषà¥à¤  के {{PLURAL:$5|à¤à¤• अवतरण|$5 अवतरणों}} की दृशà¥à¤¯à¤¤à¤¾ बदली: $4',
+'logentry-delete-event-legacy' => '$1 ने $3 पृषà¥à¤  पर लॉग कà¥à¤°à¤¿à¤¯à¤¾à¤“ं की दृशà¥à¤¯à¤¤à¤¾ बदली',
+'logentry-delete-revision-legacy' => '$1 ने $3 पृषà¥à¤  पर अवतरणों की दृशà¥à¤¯à¤¤à¤¾ बदली',
+'logentry-suppress-delete' => '$1 suppressed पृषà¥à¤  $3',
+'logentry-suppress-event' => '$1 ने गà¥à¤ªà¥à¤¤ रूप से $3 पृषà¥à¤  पर निमà¥à¤¨ {{PLURAL:$5|à¤à¤• लॉग कà¥à¤°à¤¿à¤¯à¤¾|$5 लॉग कà¥à¤°à¤¿à¤¯à¤¾à¤“ं}} की दृशà¥à¤¯à¤¤à¤¾ बदली: $4',
+'logentry-suppress-revision' => '$1 चà¥à¤ªà¤•à¥‡ से changed की दृशà¥à¤¯à¤¤à¤¾ {{PLURAL:$5|a revision|$5 revisions}} पृषà¥à¤  पर $3: $4',
+'logentry-suppress-event-legacy' => '$1 चà¥à¤ªà¤•à¥‡ से changed पर लॉग इन घटनाओं की दृशà¥à¤¯à¤¤à¤¾ $3',
+'logentry-suppress-revision-legacy' => '$1 चà¥à¤ªà¤•à¥‡ से changed पृषà¥à¤  पर संशोधन की दृशà¥à¤¯à¤¤à¤¾ $3',
+'revdelete-content-hid' => 'सामगà¥à¤°à¥€ छिपाई गई',
+'revdelete-summary-hid' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सारांश छिपाया गया',
+'revdelete-uname-hid' => 'सदसà¥à¤¯à¤¨à¤¾à¤® छिपाया गया',
+'revdelete-content-unhid' => 'सामगà¥à¤°à¥€ फिर से सारà¥à¤µà¤œà¤¨à¤¿à¤• की गई',
+'revdelete-summary-unhid' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सारांश फिर सारà¥à¤µà¤œà¤¨à¤¿à¤• किया गया',
+'revdelete-uname-unhid' => 'सदसà¥à¤¯à¤¨à¤¾à¤® फिर सारà¥à¤µà¤œà¤¨à¤¿à¤• किया गया',
+'revdelete-restricted' => 'पà¥à¤°à¤¬à¤‚धकोंको पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित किया',
+'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धकोंके पà¥à¤°à¤¬à¤‚धन हटायें',
+'logentry-move-move' => '$1 moved पृषà¥à¤  $3 से $4',
+'logentry-move-move-noredirect' => '$1 ने $3 पर पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶ छोड़े बिना उसे $4 पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर दिया',
+'logentry-move-move_redir' => '$1 ने $4 से पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶ हटाकर $3 को $4 पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर दिया',
+'logentry-move-move_redir-noredirect' => '$1 ने $4 पर से पà¥à¤¨à¤¾à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶ हटाकर $3 पर पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶ छोड़े बिना $3 को $4 पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर दिया',
+'logentry-patrol-patrol' => '$1 ने $3 पृषà¥à¤  के $4 अवतरण को देखा हà¥à¤† चिनà¥à¤¹à¤¿à¤¤ किया',
+'logentry-patrol-patrol-auto' => '$1 ने $3 पृषà¥à¤  के $4 अवतरण को सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से देखा हà¥à¤† चिनà¥à¤¹à¤¿à¤¤ किया',
+'logentry-newusers-newusers' => '$1 created उपयोगकरà¥à¤¤à¤¾ के खाता',
+'logentry-newusers-create' => '$1 created उपयोगकरà¥à¤¤à¤¾ के खाता',
+'logentry-newusers-create2' => '$1 created a user account $3',
+'logentry-newusers-autocreate' => 'खाते $1 था created सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से',
+'newuserlog-byemail' => 'कूटशबà¥à¤¦ इ-मेल दà¥à¤µà¤¾à¤°à¤¾ भेजा गया हैं',
+
+# Feedback
+'feedback-bugornote' => 'यदि आप किसी तकनीकी परेशानी को विसà¥à¤¤à¤¾à¤° से समà¤à¤¾à¤¨à¥‡ के लिये तैयार हैं तो कृपया [$1 बग फ़ाइल करें]।
+यदि नहीं, तो आप नीचे दिये सरल फ़ॉरà¥à¤® का पà¥à¤°à¤¯à¥‹à¤— कर सकते हैं। आपकी टिपà¥à¤ªà¤£à¥€ आपके सदसà¥à¤¯ नाम और आपके बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° के नाम के सहित "[$3 $2]" पृषà¥à¤  में जोड़ दी जाà¤à¤—ी।',
+'feedback-subject' => 'विषय:',
+'feedback-message' => 'संदेश:',
+'feedback-cancel' => 'रदà¥à¤¦ करें',
+'feedback-submit' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ भेजें',
+'feedback-adding' => 'पृषà¥à¤  पर पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ जोड़ना ...',
+'feedback-error1' => 'तà¥à¤°à¥à¤Ÿà¤¿: न पहचाना गया परिणाम à¤à¤ªà¥€à¤†à¤ˆ से',
+'feedback-error2' => 'तà¥à¤°à¥à¤Ÿà¤¿: संपादन विफल रहा है',
+'feedback-error3' => 'तà¥à¤°à¥à¤Ÿà¤¿: à¤à¤ªà¥€à¤†à¤ˆ से कोई पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ नहीं',
+'feedback-thanks' => 'धनà¥à¤¯à¤µà¤¾à¤¦! आपकी पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ पृषà¥à¤  में नियà¥à¤•à¥à¤¤ किया गया है "[ $2 $1 ]"।',
+'feedback-close' => 'हो गया',
+'feedback-bugcheck' => 'शानदार! जांच ले कहीं ये [ $1 known bugs] पहले से ही न हो ।',
+'feedback-bugnew' => 'मैं जाà¤à¤š कीया। à¤à¤• नया बग रिपोरà¥à¤Ÿ करें',
+
+# API errors
+'api-error-badaccess-groups' => 'आपको इस विकि के लिठफ़ाइलें अपलोड करने की अनà¥à¤®à¤¤à¤¿ नहीं है.',
+'api-error-badtoken' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: बà¥à¤°à¥€ टोकन।',
+'api-error-copyuploaddisabled' => 'URL दà¥à¤µà¤¾à¤°à¤¾ इस सरà¥à¤µà¤° पर अपलोड अकà¥à¤·à¤® है।',
+'api-error-duplicate' => 'वहाठ{{PLURAL:$1| [ $2 अनà¥à¤¯ फ़ाइल] | रहे हैं [ $2 कà¥à¤› अनà¥à¤¯ फ़ाइलों]}} à¤à¤• ही सामगà¥à¤°à¥€ के साथ साइट पर पहले से ही है.',
+'api-error-duplicate-archive' => 'वहाठ{{PLURAL:$1|था [$2 कà¥à¤› अनà¥à¤¯ फ़ाइल] |were [$2 कà¥à¤› अनà¥à¤¯ फ़ाइलें]}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परनà¥à¤¤à¥ हटा दिये गये',
+'api-error-duplicate-archive-popup-title' => 'डà¥à¤ªà¥à¤²à¤¿à¤•à¥‡à¤Ÿ {{PLURAL:$1| फ़ाइल | फ़ाइलें}} है कि पहले से ही हटा दिया गया है',
+'api-error-duplicate-popup-title' => 'डà¥à¤ªà¥à¤²à¤¿à¤•à¥‡à¤Ÿ {{PLURAL:$1| फ़ाइल | फ़ाइलें}}',
+'api-error-empty-file' => 'पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ फ़ाइल खाली था।',
+'api-error-emptypage' => 'नठखाली पृषà¥à¤  बनाने की अनà¥à¤®à¤¤à¤¿ नहीं है।',
+'api-error-fetchfileerror' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: जब फ़ाइल लाया जा रहा तो कà¥à¤› गलत हो गया था।',
+'api-error-file-too-large' => 'पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ फ़ाइल बहà¥à¤¤ बड़ी थी।',
+'api-error-filename-tooshort' => 'फ़ाइल का नाम बहà¥à¤¤ छोटा है।',
+'api-error-filetype-banned' => 'इस पà¥à¤°à¤•à¤¾à¤° की फ़ाइल पर पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध लगा दिया है।',
+'api-error-filetype-missing' => 'फाईल की à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन लापता है.',
+'api-error-hookaborted' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¤¾à¤¸à¤°à¤¤ संशोधन विसà¥à¤¤à¤¾à¤° हूक दà¥à¤µà¤¾à¤°à¤¾ निरसà¥à¤¤ किया गया।',
+'api-error-http' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: सरà¥à¤µà¤° से कनेकà¥à¤Ÿ करने में असमरà¥à¤¥à¥¤',
+'api-error-illegal-filename' => 'फ़ाइल नाम की अनà¥à¤®à¤¤à¤¿ नहीं है।',
+'api-error-internal-error' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: विकि पर अपने अपलोड पà¥à¤°à¤¸à¤‚सà¥à¤•à¤°à¤£ के साथ कà¥à¤› गलत हो गया था.',
+'api-error-invalid-file-key' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: फ़ाइल असà¥à¤¥à¤¾à¤¯à¥€ भंडारण में नहीं पाया गया.',
+'api-error-missingparam' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: अनà¥à¤°à¥‹à¤§ पर पैरामीटर लापता',
+'api-error-missingresult' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: यह पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ सफल निरà¥à¤§à¤¾à¤°à¤¿à¤¤ नहीं हो सकी',
+'api-error-mustbeloggedin' => 'आप फ़ाइलों को अपलोड करने के लिये आपको लॉग इन होना चाहिà¤.',
+'api-error-mustbeposted' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: HTTP POST अनà¥à¤°à¥‹à¤§ की आवशà¥à¤¯à¤•à¤¤à¤¾ है.',
+'api-error-noimageinfo' => 'अपलोड सफल, लेकिन सरà¥à¤µà¤° ने फ़ाइल के बारे में हमें कोई जानकारी नहीं दी.',
+'api-error-nomodule' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: कोई अपलोड मॉडà¥à¤¯à¥‚ल सेट नहीं',
+'api-error-ok-but-empty' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: सरà¥à¤µà¤° से कोई जवाब नहीं.',
+'api-error-overwrite' => 'मौजूदा फ़ाइल को अधिलेखित करने की अनà¥à¤®à¤¤à¤¿ नहीं है',
+'api-error-stashfailed' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: सरà¥à¤µà¤° असà¥à¤¥à¤¾à¤ˆ फ़ाइल को संगà¥à¤°à¤¹à¥€à¤¤ करने में विफल।',
+'api-error-timeout' => 'सरà¥à¤µà¤° ने अपेकà¥à¤·à¤¿à¤¤ समय के भीतर जवाब नहीं दिया',
+'api-error-unclassified' => 'à¤à¤• अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ',
+'api-error-unknown-code' => 'अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿: " $1 "',
+'api-error-unknown-error' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¤¿: आपकी फ़ाइल अपलोड करने का पà¥à¤°à¤¯à¤¾à¤¸ करते समय कà¥à¤› गलत हो गया था।',
+'api-error-unknown-warning' => 'अजà¥à¤žà¤¾à¤¤ चेतावनी: $1',
+'api-error-unknownerror' => 'अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿: " $1 "',
+'api-error-uploaddisabled' => 'इस विकि पर अपलोड अकà¥à¤·à¤® है.',
+'api-error-verification-error' => 'यह फ़ाइल दूषित हो सकती है, या गलत à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन है।',
+
);
diff --git a/languages/messages/MessagesHif_latn.php b/languages/messages/MessagesHif_latn.php
index 1c79bb67..b34fb95a 100644
--- a/languages/messages/MessagesHif_latn.php
+++ b/languages/messages/MessagesHif_latn.php
@@ -374,19 +374,20 @@ Iske, URL ke likh ke, koi administrator ke report karo.',
'cannotdelete' => '{{PLURAL:$1|Template|Template}} ke ii jhalak me kaam me lawa gais 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.',
-'perfcachedts' => 'Niche likha data ke cache kar dewa gais rahaa, aur pichhle time $1 ke badlaa gais rahaa.',
+'perfcached' => 'Niche likha data ke cache karaa gais hai aur sait purana hoi. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Niche likha data ke cache kar dewa gais rahaa, aur pichhle time $1 ke badlaa gais rahaa. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ii panna me badlao abhi band hai. Data ke abhi nawaa nai karaa jaai.',
'wrong_wfQuery_params' => 'Galat parameters to wfQuery()<br />
Function: $1<br />
Query: $2',
'viewsource' => 'Source dekho',
-'viewsourcefor' => '$1 khatir',
+'viewsource-title' => '"$1" ke source dekho',
'actionthrottled' => 'Kaam ke band kar dewa gais hai',
'actionthrottledtext' => 'Spam ke virod me, aap ke ii kaam thora deri me bahut time kare ke rukawat hai, aur aap time limit ke exceed kar diya hai.
Kuch deri be baad fir se kosis karna.',
'protectedpagetext' => 'Ii panna ke badlao ke roke ke khatir band kar dewa gais hai.',
'viewsourcetext' => 'Aap ii panna ke source ke dekhe aur nakal utare kare sakta hai:',
+'viewyourtext' => "Aap '''aapan badlao''' ke source ke dekhe aur copy kare saktaa hae",
'protectedinterface' => 'Ii panna software ke interface text dewe hai, aur iske barbaadi se roke ke khatir band kar dewa gais hai.',
'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 ke bhi hoi.
@@ -492,6 +493,7 @@ Ii sab feature khatir koi e-mail nai bheja jaai.',
'emailconfirmlink' => 'aapan e-mail address ke confirm karo',
'invalidemailaddress' => 'E-mail address ke nai lewa jae sake hai kahe ki iske format kharaab hai.
Meharbaani kar ke achchha address ke enter karo nai to uu field ke khali kar do.',
+'cannotchangeemail' => 'Ii wiki me account e-mail ke badla nai jaawe sake hae',
'accountcreated' => 'Account banae dewa gais hai',
'accountcreatedtext' => '$1 khatir user account banae dewa gais hai.',
'createaccount-title' => '{{SITENAME}} khatir account creation',
@@ -507,6 +509,7 @@ Thora deri baad fir se kosis karna.',
# E-mail sending
'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
+'user-mail-no-addy' => 'Bina e-mail address rahe pe bhi e-mail bheje ke kosis karaa gais hae.',
# Change password dialog
'resetpass' => 'Password ke badlo',
@@ -528,24 +531,39 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
'resetpass-temp-password' => 'Kachcha password:',
# Special:PasswordReset
-'passwordreset' => 'Password ke badlo',
-'passwordreset-text' => 'Aapan account ke baare me jaankari ke receive kare ke khatir ii fom ke bharo.',
-'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-username' => 'Sadasya ke naam:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'E-mail ke address',
-'passwordreset-emailtitle' => '{{SITENAME}} me account ke jaankari',
-'passwordreset-emailtext-ip' => 'Koi (hoe sake aap, IP address $1 se) {{SITENAME}} ($4) pe aap ke account ke baare me jaankari maanga hae. Niche likha gias sadasya ii e-mail se associated hae. {{PLURAL:$3|account hae|accounts hae}}
+'passwordreset' => 'Password ke badlo',
+'passwordreset-text' => 'Aapan account ke baare me jaankari ke receive kare ke khatir ii fom ke bharo.',
+'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-username' => 'Sadasya ke naam:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Banawa gais e-mail ke dekho',
+'passwordreset-capture-help' => 'Agar aap ii box ke tick karaa, tab e-mail (aur uske saathe temporary password) ke aap ke ii rakam se dekhawa jaai jaise ki iske sadasya ke lage bhej dewa gais hae.',
+'passwordreset-email' => 'E-mail ke address',
+'passwordreset-emailtitle' => '{{SITENAME}} me account ke jaankari',
+'passwordreset-emailtext-ip' => 'Koi (hoe sake aap, IP address $1 se) {{SITENAME}} ($4) pe aap ke account ke baare me jaankari maanga hae. Niche likha gias sadasya ii e-mail se associated hae. {{PLURAL:$3|account hae|accounts hae}}
$2
{{PLURAL:$3|Ii temporary password|Ii sab temporary passwords}} {{PLURAL:$5|ek din|$5 din}} me khalaas hoi.
Aap ke chaahi ki aap login kar ke ek nawaa password banao. Agar aur koi ii request karis hae, nai to agae aap aapan purana paasword ke yaad kar liya hae, tab ii sandes ke baare me bhuul jaao aur purana password use karte raho.',
-'passwordreset-emailelement' => 'Sadasya ke naam: $1
+'passwordreset-emailelement' => 'Sadasya ke naam: $1
Kuchh din ke khatir password: $2',
-'passwordreset-emailsent' => 'Aap ke yaad karae ke khatir ek e-mail ke bhej dewa gais hae.',
+'passwordreset-emailsent' => 'Aap ke yaad karae ke khatir ek e-mail ke bhej dewa gais hae.',
+'passwordreset-emailsent-capture' => 'Ek 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',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail address ke badlo',
+'changeemail-header' => 'Account e-mail address ke badlo',
+'changeemail-text' => 'Aapan e-mail ke badle kae khaatir ii form ke fill karo. Ii badlao ke khatir aap ke aapan password ke de ke parri.',
+'changeemail-no-info' => 'Ii panna ke sidha dekhe ke khaatir, aap ke login kare ke parri.',
+'changeemail-oldemail' => 'Abhi ke E-mail address:',
+'changeemail-newemail' => 'Nawaa E-mail address:',
+'changeemail-none' => '(kuchh nai)',
+'changeemail-submit' => 'E-mail badlo',
+'changeemail-cancel' => 'Kaat do',
# Edit page toolbar
'bold_sample' => 'Motaa text',
@@ -615,9 +633,6 @@ Aap ii sadasya ke 'email this user' feature ke kaam me lae ke baat nai kare sakt
Aap ke abhi ke IP address $3 hai, aur roka gae ID hai #$5.
Meharbani kar ke chahe ek nai to duno ke aapan sawaal me rakho.",
'blockednoreason' => 'koi kaaran nai dewa gais hai',
-'blockedoriginalsource' => "'''$1''' ke kahaan se suruu bhais hai, niche likha hai:",
-'blockededitsource' => "Aap ke '''$1 ke badlao''' ke akchhar niche likha hai:",
-'whitelistedittitle' => 'Badle khatir login kare ke jaruri hai',
'whitelistedittext' => 'Aap ke panna badle khatir $1 kare ke parri.',
'confirmedittext' => 'Panna ke badle se pahile aap ke aapan e-mail ke confirm kare ke parri.
Meharbani kar ke aap aapan e-mail ke aapan [[Special:Preferences|user preferences]] se validate karna.',
@@ -879,8 +894,6 @@ Duusra admins {{SITENAME}} me, lukawa gais content ke khole sake aur iske mitae
'revdelete-unsuppress' => 'Pahile jaise karaa gais badlao me se rukawat hatao',
'revdelete-log' => 'Kaaran:',
'revdelete-submit' => 'Chuna gae badlao ke apply karo {{PLURAL:$1|revision|revisions}}',
-'revdelete-logentry' => '[[$1]] ke badlao ke visibility ke badal dewa gais hai',
-'logdelete-logentry' => '[[$1]] keevent visibility ke badal dewa gais hae',
'revdelete-success' => "'''Badlao dekhe khatir taiyaar hai.'''",
'revdelete-failure' => "'''Badlao ke nai dekhawa jaae sake hae:'''
$1",
@@ -892,15 +905,6 @@ $1",
'revdel-restore-visible' => 'badlao, jiske aap dekhe saktaa hae',
'pagehist' => 'Panna ke itihaas',
'deletedhist' => 'Mitawa gae itihass',
-'revdelete-content' => 'suchi',
-'revdelete-summary' => 'summary ke badlo',
-'revdelete-uname' => 'Sadasya ke naam',
-'revdelete-restricted' => 'sysops pe llabu restrictions',
-'revdelete-unrestricted' => 'sysops se hatawa gae rukawat',
-'revdelete-hid' => '$1 lukaya',
-'revdelete-unhid' => '$1 ke fir se dekhaya',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|badlao|badlao}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|ghatna|ghatna}}',
'revdelete-hide-current' => 'Item dated $2, $1 ke lukae me garrbarr hoe gais hai: ii abhi ke version hai.
Iske lukawa nai jaawe sake hai.',
'revdelete-show-no-access' => '$2, $1 ke tarik ke item me error hai: ii item ke "restricted" mark karaa gais hai.
@@ -1060,12 +1064,14 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
'prefs-rc' => 'Nawaa badlao',
'prefs-watchlist' => 'Dhyan suchi',
'prefs-watchlist-days' => 'Dhyan suchi me ketna roj dekhawa jaae:',
-'prefs-watchlist-days-max' => 'Jaada se jaada 7 din',
+'prefs-watchlist-days-max' => 'Jaada se jaada $1 {{PLURAL:$1|din|din}}',
'prefs-watchlist-edits' => 'Barraa dhyan suchi me jaada se jaada ketna badlao dekhawa jaae:',
'prefs-watchlist-edits-max' => 'Jaada se jaada: 1000',
'prefs-watchlist-token' => 'Dhyan suchi ke nisani:',
'prefs-misc' => 'Futkar',
'prefs-resetpass' => 'Password badlo',
+'prefs-changeemail' => 'E-mail badlo',
+'prefs-setemail' => 'Ek E-mail address ke banao',
'prefs-email' => 'E-mail ke option',
'prefs-rendering' => 'Dekhe me kaise lage hai',
'saveprefs' => 'Save karo',
@@ -1125,6 +1131,7 @@ Iske pahile jaise nai karaa jaawe sake hai.',
'yourrealname' => 'Asli naam:',
'yourlanguage' => 'Bhasa:',
'yourvariant' => 'Bahasa ke variant:',
+'prefs-help-variant' => 'Ii panna ke dekhae ke khatir, aap ke pasand ke variant nai to orthography',
'yournick' => 'Chinh:',
'prefs-help-signature' => 'Baat waala panna me aap ke bichar ke "<nowiki>~~~~</nowiki>" se sign kare ke chaahi jiske signature aur timestamp me badal dewa jaai.',
'badsig' => 'Invalid raw signature; HTML tags ke check karo.',
@@ -1164,7 +1171,7 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'userrights-lookup-user' => 'Sadasya ke group ke manage karo',
'userrights-user-editname' => 'Ek Username ke enter karo:',
'editusergroup' => 'User groups ke badlo',
-'editinguser' => "'''[[User:$1|$1]]''' ke user rights badaltaa hai ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Sadasya '''[[User:$1|$1]]''' ke adhikaar ke badlaa jaawe hae $2",
'userrights-editusergroup' => 'User groupske badlo',
'saveusergroups' => 'User groups ke save karo',
'userrights-groupsmember' => 'Iske member hai:',
@@ -1258,13 +1265,13 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'right-autopatrol' => 'Aapan badlao pe apne se pahraa do',
'right-patrolmarks' => 'Haali ke badlao ke pahraa ke mark ke dekho',
'right-unwatchedpages' => 'Unwatched panna ke suchi ke dekho',
-'right-trackback' => 'Ek trackback ke submit karo',
'right-mergehistory' => 'Panna ke itihass ke jorro',
'right-userrights' => 'Sadasya ke adhikar ke badlo',
'right-userrights-interwiki' => 'Duusra wiki me sadasya ke adhikar ke badlo',
'right-siteadmin' => 'Database ke band karo aur kholo',
'right-override-export-depth' => 'Panna aur jurra panna, 5 ke gahirrai talak, ke export karo',
'right-sendemail' => 'Duusra sadasya ke lage e-mail bhejo',
+'right-passwordreset' => 'Password ke badle waala e-mail ke dekho',
# User rights log
'rightslog' => 'Sadasya adhikar suchi',
@@ -1298,12 +1305,12 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'action-suppressionlog' => 'ii private log ke dekho',
'action-block' => 'ii sadasya ke panna badle se roko',
'action-protect' => 'ii panna ke protection levels ke badlo',
+'action-rollback' => 'jaldi se pichhla sadasya, jon ki koi panna ke badlis rahaa, ke badlao ke pahile jaise kar do',
'action-import' => 'duusra wiki me se ii panna ke import karo',
'action-importupload' => 'ek file upload se ii panna ke import karo',
'action-patrol' => 'duusra jan ke badlao pe pahraa do',
'action-autopatrol' => 'aapan badlao pe pahraa do',
'action-unwatchedpages' => 'unwatched panna ke suchi dekho',
-'action-trackback' => 'Ek trackback ke submit karo',
'action-mergehistory' => 'ii panna ke itihass ke ek karo',
'action-userrights' => 'sab sadasya ke adhikar ke badlo',
'action-userrights-interwiki' => 'duusra wiki ke sadasya ke adhikar ke badlo',
@@ -1741,7 +1748,7 @@ Sab row me pahila aur duusra redirect ke jorr hae, aur isme duusra redirect ke n
'listusers-editsonly' => 'Khaali uu sadasya ke dekhao jon ki koi badlao karis hai',
'listusers-creationsort' => 'Banawa gais tarik se sort karo',
'usereditcount' => '$1 {{PLURAL:$1|badlao|badlao}}',
-'usercreated' => '$1 ke roj $2 baje iske banawa gais hai',
+'usercreated' => '{{GENDER:$3|Banawa gais hae}} $1 pe $2 me',
'newpages' => 'Nawaa panna',
'newpages-username' => 'Username:',
'ancientpages' => 'Sab se purana panna',
@@ -1834,12 +1841,8 @@ Support karaa gais protocol: <tt>$1</tt>',
'activeusers-noresult' => 'koi sadasya ke pawa nai gais hai.',
# Special:Log/newusers
-'newuserlogpage' => 'Sadasya ke banae waala log',
-'newuserlogpagetext' => 'Ii sadasya ke banae waala log hai.',
-'newuserlog-byemail' => 'password ke e-mail se bheja gais hai',
-'newuserlog-create-entry' => 'Nawaa sadasya ke account',
-'newuserlog-create2-entry' => 'nawaa account banaya $1',
-'newuserlog-autocreate-entry' => 'Account ke automatically banawa gais hai',
+'newuserlogpage' => 'Sadasya ke banae waala log',
+'newuserlogpagetext' => 'Ii sadasya ke banae waala log hai.',
# Special:ListGroupRights
'listgrouprights' => 'Sadasya ke group adhikar',
@@ -1868,7 +1871,7 @@ Support karaa gais protocol: <tt>$1</tt>',
'emailpagetext' => 'Aap niche ke form ke use kar ke ii sadasya ke e-mail bheje sakta hae.
Jon e-mail address aap [[Special:Preferences|your user preferences]] me enter karaa rahaa, "From" ke e-mail rahii, jisse ki e-mail receive kare waala aap ke sidha reply kare sake hae.',
'usermailererror' => 'Mail object error return karis hai:',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} e-mail sadasya "$1" se',
'usermaildisabled' => 'Sadasya ke e-mail ke rok dewa gais hae',
'usermaildisabledtext' => 'Aap ii wiki ke duusra sadasya ke e-mail nai bheje saktaa hae',
'noemailtitle' => 'E-mail address nai hai',
@@ -1987,8 +1990,6 @@ Meharbani kar ke iske confirm karo, ki aap iske consequences ke samajhta hai, au
'actioncomplete' => 'Action puura hoe gais hai',
'actionfailed' => 'Action fail hoe gais',
'deletedtext' => '"$1" ke delete kar dewa gais hai. Abhi jaldi ke deletions ke record dekhe khatir $2 ke dekho.',
-'deletedarticle' => '"[[$1]]" ke mitae dewa gais hae',
-'suppressedarticle' => 'suppressed "[[$1]]"',
'dellogpage' => 'Mitae ke suchi',
'dellogpagetext' => 'Niche nawaa mitawa gais panna ke suchi hai.',
'deletionlog' => 'Mitae waala suchi',
@@ -2063,6 +2064,7 @@ Aap ii panna ke ijaajat level badle sakta hai, lekin ii cascading protection nai
'protect-level-sysop' => 'Khali sysops',
'protect-summary-cascade' => 'cascading',
'protect-expiring' => '$1 khalaas hoe hai (UTC)',
+'protect-expiring-local' => '$1 ke khalaas hoe hae',
'protect-expiry-indefinite' => 'sab time khatir',
'protect-cascade' => 'Ii panna me ke panna ke bachao (cascading protection)',
'protect-cantedit' => 'Aap ii panna ke protection level badle nai sakta hai, kahe ki aap ke badle ke ijaajat nai hai.',
@@ -2124,7 +2126,6 @@ Sait aap ke kharaab link hoi, nai to badlao ke sait pahile jaise kar dewa gais h
'undeletereset' => 'Pahile jaise karo',
'undeleteinvert' => 'Selection ke ulta karo',
'undeletecomment' => 'Kaaran::',
-'undeletedarticle' => '"[[$1]]" ke pahile jaise kar dewa gais hai',
'undeletedrevisions' => '{{PLURAL:$1|1 badlao|$1 badlao}} ke pahile jaise kar dewa gais hai',
'undeletedrevisions-files' => '{{PLURAL:$1|1 badlao|$1 badlao}} aur {{PLURAL:$2|1 file|$2 files}} ke pahile jaise kar dewa gais hai',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} ke pahile jaise kar dewa gais hai',
@@ -2385,9 +2386,6 @@ Meharbani kar ke duusra naam choose karo.',
'movepage-page-moved' => 'Panna $1 ke naam badal ke $2 kar dewa gais hai.',
'movepage-page-unmoved' => 'Panna $1 ke naam badal ke $2 nai kare sakaa hai.',
'movepage-max-pages' => 'Jaada se jaada $1 {{PLURAL:$1|panna|panna}} ke hatae dewa gais hai, aur jaada ke ab nai hatawa jaai.',
-'1movedto2' => '[[$1]] ke naam badal ke [[$2]] kar dewa gae hai',
-'1movedto2_redir' => 'Redirect ke uppar se [[$1]] ke badal ke [[$2]] kar dewa gais hai',
-'move-redirect-suppressed' => 'redirect ke rok dewa gais hai',
'movelogpage' => 'Suchi ke jagah badlo',
'movelogpagetext' => 'Niche sab panna, jiske naam badla gais hai, ke suchi hai.',
'movesubpage' => '{{PLURAL:$1|Subpage|Subpages}}',
@@ -2632,9 +2630,6 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
# Patrol log
'patrol-log-page' => 'Pahraa de waala suchi',
'patrol-log-header' => 'Ii pahraa dewa gais badlao ke suchi hai.',
-'patrol-log-line' => 'mark karaa gais $1 of $2 pahraa dewa gais $3',
-'patrol-log-auto' => '(apne se)',
-'patrol-log-diff' => 'badlao $1',
'log-show-hide-patrol' => '$1 pahraa de waala suchi',
# Image deletion
@@ -2660,7 +2655,7 @@ Iske execute kare se aap ke system me garrbarr hoe sake hae.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|panna|panna}}',
'file-info' => 'file etnaa barraa: $1, MIME rakam: $2',
'file-info-size' => '$1 × $2 pixel, file ke size: $3, MIME type: $4',
-'file-nohires' => '<small>Aur achchha resolution nai hai.</small>',
+'file-nohires' => 'Aur achchha resolution nai hai.',
'svg-long-desc' => 'SVG file, naam kare ke khatir $1 × $2 pixels, file size: $3',
'show-big-image' => 'Puura resolution',
'file-info-gif-looped' => 'Ghuum ghumae ke wahii jagha pe aawe hae',
@@ -2923,4 +2918,9 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'htmlform-reset' => 'Badlao ke pahile jaise karo',
'htmlform-selectorother-other' => 'Duusra',
+# New logging system
+'revdelete-restricted' => 'sysops pe llabu restrictions',
+'revdelete-unrestricted' => 'sysops se hatawa gae rukawat',
+'newuserlog-byemail' => 'password ke e-mail se bheja gais hai',
+
);
diff --git a/languages/messages/MessagesHil.php b/languages/messages/MessagesHil.php
index 9d0bf49f..9642bb4a 100644
--- a/languages/messages/MessagesHil.php
+++ b/languages/messages/MessagesHil.php
@@ -375,15 +375,14 @@ Mahimo nga napanas na ini sang iban.',
'badtitle' => 'Malain nga titulo',
'badtitletext' => 'Ang ginapangayo mo nga titulo ka pahina ay sala, blangko, ukon indi ensakto ang pagtabid sang inter-lengwahe o inter-wiki na titulo.
Siguro may-ara ini sang isa ukon madamo nga karakter nga indi ginabaton kag ginagamit sa titulo.',
-'perfcached' => 'Ang masunod nga datos nakatago lamang kag mahimo nga indi bag-o.',
-'perfcachedts' => 'Ang masunod nga datos nakatago lamang, kag pinaka-ulihe nga ginbag-o sang $1.',
+'perfcached' => 'Ang masunod nga datos nakatago lamang kag mahimo nga indi bag-o. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ang masunod nga datos nakatago lamang, kag pinaka-ulihe nga ginbag-o sang $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ang mga pagbag-o sa sini nga panid karon ginpa-untat.
Ang datos nga yari diri indi pagliwaton.',
'wrong_wfQuery_params' => 'Indi insakto nga mga parametro sa wfQuery()<br />
Kapuslanan: $1<br />
Pagpamangkot: $2',
'viewsource' => 'Lantawon ang ginhalinan',
-'viewsourcefor' => 'para sa $1',
'actionthrottled' => 'Ang paghulag ginpunggan',
'actionthrottledtext' => 'Bilang pagpangontra sa span, ginalimitahan ka sa pagbuhat sang sini nga paghulag sa tuman ka damo nga beses sa malip-ot nga tinion, kag naglapaw ka na sa sini nga patakaran.
Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
@@ -500,6 +499,7 @@ Wala pa sang e-mail nga ipadala diri para sa bisan ano sa masunod nga mga katung
'emailconfirmlink' => 'Palihog pamatud-i ang imo e-mail adres',
'invalidemailaddress' => 'Ang e-mail adres indi mabaton tungod kay nagagwa nga sala ang iya plastar.
Palihog butang sang ginplastar sing maayo nga adres ukon panason nal lang ang lugar.',
+'cannotchangeemail' => 'Ang mga e-mail adres indi mahimo nga ilisan sa sini nga wiki.',
'accountcreated' => 'Nahimo na ang akawnt',
'accountcreatedtext' => 'Ang akawnt sang manug-gamit nga $1 nahimo na.',
'createaccount-title' => 'Pagbuhat sang akawnt para sa {{SITENAME}}',
@@ -516,6 +516,7 @@ Palihog maghulat anay bag-o tilawan liwat.',
# E-mail sending
'php-mail-error-unknown' => 'Wala nahibaluan nga sala sa kapuslanan nga sulat() sang PHP.',
+'user-mail-no-addy' => 'Gintilawan nga magpadala sang e-mail biskan wala sang e-mail adres.',
# Change password dialog
'resetpass' => 'Ilisan ang pasword',
@@ -537,16 +538,18 @@ Mahimo nga madinalag-on mo nga nga gin-ilisan ang imo pasword ukon nagpangabay k
'resetpass-temp-password' => 'Temporaryo nga pasword:',
# 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-email' => 'Adres sang e-mail:',
-'passwordreset-emailtitle' => 'Ang mga detalye sang akawnt sa {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'May tawo nga (mahimo ikaw, halin sa IP adres nga $1) nagpangabay sang pahanumdom sang mga detalye
+'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?',
+'passwordreset-capture-help' => 'Kon butangan mo sang tsek ang ini nga kahon, ang e-mail (nga may temporaryo nga pasword) igapakita sa imo kag amo man ipadala sa manuggamit.',
+'passwordreset-email' => 'Adres sang e-mail:',
+'passwordreset-emailtitle' => 'Ang mga detalye sang akawnt sa {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'May tawo nga (mahimo ikaw, halin sa IP adres nga $1) nagpangabay sang pahanumdom sang mga detalye
sang imo akawnt para sa {{SITENAME}} ($4). Ang masunod nga {{PLURAL:$3|akawnt|mga akawnt}} sang manuggamit
may kabahin sa sini nga adres sang e-mail:
@@ -556,7 +559,7 @@ $2
Kinahanglan mo nga magsulod kag magpili sang bag-o nga pasword subong. Kon lain nga tawo ang nagbuhat sini
nga pagpangabay, ukon nadumduman mo na ang imo pasword, kag indi mo na kinahanglan nga ini
paga-ilisan, mahimo mo nga pabay-an ang ini nga pahanumdom kag magpadayon sa paggamit sang imo daan nga pasword.',
-'passwordreset-emailtext-user' => 'Ang manuggamit nga si $1 sa {{SITENAME}} nagpangabay sang pahanumdom sang mga detalye sang imo akawnt para sa {{SITENAME}}
+'passwordreset-emailtext-user' => 'Ang manuggamit nga si $1 sa {{SITENAME}} nagpangabay sang pahanumdom sang mga detalye sang imo akawnt para sa {{SITENAME}}
($4). Ang masunod nga {{PLURAL:$3|akawnt|mga akawnt}} sang manuggamit may kabahin sa sini nga adres sang e-mail:
$2
@@ -565,9 +568,22 @@ $2
Kinahanglan mo nga magsulod kag magpili sang bag-o nga pasword subong. Kon lain nga tawo ang nagbuhat sini
nga pagpangabay, ukon nadumduman mo na ang imo pasword, kag indi mo na kinahanglan nga ini
paga-ilisan, mahimo mo nga pabay-an ang ini nga pahanumdom kag magpadayon sa paggamit sang imo daan nga pasword.',
-'passwordreset-emailelement' => 'Gamit-pangalan: $1
+'passwordreset-emailelement' => 'Gamit-pangalan: $1
Temporaryo nga pasword: $2',
-'passwordreset-emailsent' => 'May pahanumdom nga e-mail nga ginpadala.',
+'passwordreset-emailsent' => 'May pahanumdom nga e-mail nga ginpadala.',
+'passwordreset-emailsent-capture' => 'May e-mail nga nagapahanumdum, nga ginapakita sa idalom.',
+'passwordreset-emailerror-capture' => 'May e-mail nga nagapahanumdom nga ginbuhat, nga ginapakita sa idalom, apang ang pagpadala sa manuggamit indi madinalag-on: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ilisan ang E-mail adres',
+'changeemail-header' => 'Ilisan ang e-mail adres sang akawnt',
+'changeemail-text' => 'Tapusa ang ini nga formas agod nga ma-ilisan ang imo e-mail adres. Kinahanglan mo nga magbutang sang imo pasword sa pag-kumperma sang sini nga pag-ilis.',
+'changeemail-no-info' => 'Kinahanglan nga nakasulod ka agod nga makadtoan ang ini nga panid sing derecho.',
+'changeemail-oldemail' => 'E-mail adres sa subong:',
+'changeemail-newemail' => 'Bag-o nga e-mail adres:',
+'changeemail-none' => '(wala)',
+'changeemail-submit' => 'Ilisan and E-mail',
+'changeemail-cancel' => 'Kanselahon',
# Edit page toolbar
'bold_sample' => 'Dukot nga teksto',
@@ -637,9 +653,6 @@ Indi mo magamit ang 'i-email ining manuggamit' samtang wala ka sang matood nga e
Ang imo adres sang IP karon amo ang $3, kag ang ID sang pagpuggong amo ang #$5.
Palihog dala sang mga nasulat sa ibabaw sa mga pagpamangkot nga imo ubrahon.",
'blockednoreason' => 'wala sang rason nga ginhatag',
-'blockedoriginalsource' => "Ang ginhalinan sang '''$1''' ginapakita sa dalom:",
-'blockededitsource' => "Ang mga letra sang '''imo gin-ilisan''' sa '''$1''' ginapakita sa dalom:",
-'whitelistedittitle' => 'Kinahanglan Magsulod para maka ilis',
'whitelistedittext' => 'Kinahanglan mo ang $1 agod maka-ilis sang mga panid.',
'confirmedittext' => 'Kinahanglan mo nga kumpirmahon ang imo e-mail adres bag-o ka mag-ilis sang mga panid.
Palihog plastar kag magpamatood sang imo e-mail adres paagi sang imo [[Special:Preferences|pagpalabi]].',
@@ -904,8 +917,6 @@ Ang iban nga administrador sa {{SITENAME}} mahimo sa gihapon nga makasulod sa na
'revdelete-unsuppress' => 'Kuhaon ang mga pagbawal sa mga ginliwat nga mga pagbag-o',
'revdelete-log' => 'Rason:',
'revdelete-submit' => 'Ipatuman sa ginpili nga {{PLURAL:$1|pagbag-o|mga pagbag-o}}',
-'revdelete-logentry' => 'gin-ilisan nga pagbag-o sa pagkakitaon sang "[[$1]]"',
-'logdelete-logentry' => 'gin-ilisan nga hinatabo sa pagkakitaon sang "[[$1]]"',
'revdelete-success' => "'''Ang pagkakitaon sang pagbag-o madinalag-on nga ginbag-o.'''",
'revdelete-failure' => "'''Ang pagkakitaon sang pagbag-o indi mabag-o:'''
$1",
@@ -917,15 +928,6 @@ $1",
'revdel-restore-visible' => 'mga makita nga pagbag-o',
'pagehist' => 'Kasaysayan sang panid',
'deletedhist' => 'Ginpanas nga kasaysayan',
-'revdelete-content' => 'kaundan',
-'revdelete-summary' => 'liwaton ang kabilogan',
-'revdelete-uname' => 'gamit-pangalan',
-'revdelete-restricted' => 'ginapatuman nga pagbawal sa mga administrador',
-'revdelete-unrestricted' => 'ginkakas nga pagbawal sa mga administrador',
-'revdelete-hid' => 'tagu $1',
-'revdelete-unhid' => 'ditagu $1',
-'revdelete-log-message' => '$1 para sa $2 {{PLURAL:$2|pagbag-o|mga pagbag-o}}',
-'logdelete-log-message' => '$1 para sa $2 {{PLURAL:$2|hinatabo|mga hinatabo}}',
'revdelete-hide-current' => 'May sala sa pagtago sang bagay nga may petsa nga $2, $1: amo ini ang pagbag-o karon.
Indi ini mahimo nga taguon.',
'revdelete-show-no-access' => 'May sala sa pagpakita sang bagay nga may petsa nga $2, $1: ang ini nga bagay ginmarkahan nga "ginabawalan".
@@ -1086,12 +1088,14 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
'prefs-rc' => 'Mga Bag-o nga Inislan',
'prefs-watchlist' => 'Lista sang mga ginabantayan',
'prefs-watchlist-days' => 'Mga adlaw nga ipakita sa lista sang ginabantayan:',
-'prefs-watchlist-days-max' => 'Indi magsobra 7 ka adlaw',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Ang pinakataas nga beses sang pag-ilis nga ipakita sa ginpalawig nga lista sang ginabantayan:',
'prefs-watchlist-edits-max' => 'Pinakataas nga numero: 1000',
'prefs-watchlist-token' => 'Token sang lista sang ginabantayan:',
'prefs-misc' => 'Misc',
'prefs-resetpass' => 'Ilisan ang pasword',
+'prefs-changeemail' => 'Ilisan ang E-mail',
+'prefs-setemail' => 'Magbutang sang E-mail adres',
'prefs-email' => 'Mga pililian sang e-mail',
'prefs-rendering' => 'Hitsura',
'saveprefs' => 'Itipunon',
@@ -1151,6 +1155,7 @@ Indi na ini maliwat pa.',
'yourrealname' => 'Matood-tood nga pangalan:',
'yourlanguage' => 'Lenguahe:',
'yourvariant' => 'Ang lain nga lenggwahe sang kaundan:',
+'prefs-help-variant' => 'Ang imo mas gusto nga kinalain ukon ortigrapiya sa pagpakita sang kaundan nga mga panid sang sini nga wiki sa.',
'yournick' => 'Bag-o nga pirma:',
'prefs-help-signature' => 'Ang mga kumento sa mga panid sang pag-estorya kinahanglan nga napirmahan sang "<nowiki>~~~~</nowiki>" nga pagasayluhon sa imo pirma sang stamp sang oras.',
'badsig' => 'Indi mabaton nga hilaw nga pirma.
@@ -1294,8 +1299,7 @@ Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
'linksearch-ok' => 'Pangita-a',
# Special:Log/newusers
-'newuserlogpage' => 'Naga-usar nga ginhimo log',
-'newuserlog-create-entry' => 'Bag-o na akawnt nga naga-usar',
+'newuserlogpage' => 'Naga-usar nga ginhimo log',
# Special:ListGroupRights
'listgrouprights-group' => 'Grupo',
@@ -1330,7 +1334,6 @@ Palihog lang nga sigurado nga kinagusto mo ini nga himuon, nga na-intindihan mo
'actioncomplete' => 'Kompleto nga aksiyon',
'deletedtext' => '"$1" ay nakakas na.
Lantawa $2 para sa mga lista sang mga bag-o lang ginkakas.',
-'deletedarticle' => 'ginkakas "[[$1]]"',
'dellogpage' => 'Ginkakas na log',
'deletecomment' => 'Rason:',
'deleteotherreason' => 'Iban/dugang nga rason:',
@@ -1370,7 +1373,6 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
# Undelete
'undeletelink' => 'tan-aw/ginbalik',
-'undeletedarticle' => 'nanumbalik "[[$1]]"',
'undelete-search-submit' => 'Pangita-a',
# Namespace form on various pages
@@ -1458,8 +1460,6 @@ Palihog lang pili sang lain nga ngalan. Salamat.',
Palihog lang sang pagkombinar sa ila sang ensakto.'''",
'movedto' => 'gin saylo sa',
'movetalk' => 'Isaylo ang upod mga nga pahina hambal',
-'1movedto2' => '[[$1]] gin saylo na sa [[$2]]',
-'1movedto2_redir' => 'isaylo [[$1]] sa [[$2]] labaw sa gin direkta liwat',
'movelogpage' => 'Giho log',
'movereason' => 'Rason:',
'revertmove' => 'nagbalik',
@@ -1536,7 +1536,7 @@ Gapasugot sa pagdugang sang rason sa kabilugan.',
# Media information
'file-info-size' => '$1 × $2 piksel, kadakuon sang file: $3, MIME type: $4',
-'file-nohires' => '<small>Wala sang yara na taas nga resolusyon.</small>',
+'file-nohires' => 'Wala sang yara na taas nga resolusyon.',
'svg-long-desc' => 'SVG file, nominalya $1 × $2 piksels, kadakuon sang file: $3',
'show-big-image' => 'Kabilogan nga resolusyon',
@@ -1601,4 +1601,8 @@ Ang iban ay pagataguon sang default.
# Special:SpecialPages
'specialpages' => 'Espesyal nga mga panid',
+# New logging system
+'revdelete-restricted' => 'ginapatuman nga pagbawal sa mga administrador',
+'revdelete-unrestricted' => 'ginkakas nga pagbawal sa mga administrador',
+
);
diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php
index 7a07a79f..2d2fad67 100644
--- a/languages/messages/MessagesHr.php
+++ b/languages/messages/MessagesHr.php
@@ -145,132 +145,132 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PREUSMJERI', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEZUREÄIVANJAODLOMAKA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZZAGLAVLJA__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'TRENUTAÄŒNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'TRENUTAÄŒNIMJESEC1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'TRENUTAÄŒNIMJESECIME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'TRENUTAÄŒNIMJESECIMEGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'TRENUTAÄŒNIMJESECKRAT', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'TRENUTAÄŒNIDAN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'TRENUTAÄŒNIDAN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'TRENUTAÄŒNIDANIME', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TRENUTAÄŒNAGODINA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'TRENUTAÄŒNOVRIJEME', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'TRENUTAÄŒNISAT', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MJESNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MJESNIMJESEC1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'MJESNIMJESECIME', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'MJESNIMJESECIMEGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'MJESNIMJESECKRAT', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'MJESNIDAN', 'LOCALDAY' ),
- 'localday2' => array( '1', 'MJESNIDAN2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'MJESNIDANIME', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'MJESNAGODINA', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'MJESNOVRIJEME', 'LOCALTIME' ),
- 'localhour' => array( '1', 'MJESNISAT', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'BROJSURADNIKA', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHSURADNIKA', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'BROJUREÄIVANJA', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'IMESTRANICE', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'IMESTRANICEE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'IMENSKIPROSTORE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'RAZGOVORE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'PROSTORSTRANICE', 'IMPSTRANICE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'PROSTORSTRANICEE', 'IMPSTRANICEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'IMEPODSTRANICEE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'IMEOSNOVNESTRANICE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'IMEOSNOVNESTRANICEE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'IMERAZGOVORASTRANICE', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'IMERAZGOVORASTRANICEE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'IMEGLAVNESTRANICE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'IMEGLAVNESTRANICEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'subst' => array( '0', 'ZAMJENA:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'minijatura=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'desno', 'right' ),
- 'img_left' => array( '1', 'lijevo', 'left' ),
- 'img_none' => array( '1', 'ništa', 'none' ),
- 'img_center' => array( '1', 'središte', 'center', 'centre' ),
- 'img_framed' => array( '1', 'okvir', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bezokvira', 'frameless' ),
- 'img_page' => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'uspravno=$1', 'uspravno $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'obrub', 'border' ),
- 'img_baseline' => array( '1', 'osnovnacrta', 'baseline' ),
- 'img_sub' => array( '1', 'potpis', 'ind', 'sub' ),
- 'img_super' => array( '1', 'natpis', 'eks', 'super', 'sup' ),
- 'img_top' => array( '1', 'vrh', 'top' ),
- 'img_text_top' => array( '1', 'tekst-vrh', 'text-top' ),
- 'img_middle' => array( '1', 'pola', 'middle' ),
- 'img_bottom' => array( '1', 'dno', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekst-dno', 'text-bottom' ),
- 'sitename' => array( '1', 'IMEPROJEKTA', 'SITENAME' ),
- 'ns' => array( '0', 'IMP:', 'NS:' ),
- 'localurl' => array( '0', 'MJESNIURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'MJESNIURLE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'IMESERVERA', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'PUTANJASKRIPTE', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__BEZPRETVARANJANASLOVA__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__BEZPRETVARANJASADRŽAJA__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'TRENUTAÄŒNITJEDAN', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'TRENUTAÄŒNIDANTJEDNA', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'MJESNITJEDAN', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'MJESNIDANTJEDNA', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDIZMJENE', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DANIZMJENE', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DANIZMJENE2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MJESECIZMJENE', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'GODINAIZMJENE', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'VREMENSKAOZNAKAIZMJENE', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'PUNIURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'PUNIURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'MSPRVO:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'VSPRVO:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MS:', 'LC:' ),
- 'uc' => array( '0', 'VS:', 'UC:' ),
- 'raw' => array( '0', 'NEOBRAÄENO:', 'RAW:' ),
- 'displaytitle' => array( '1', 'POKAŽINASLOV', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'NEO', 'R' ),
- 'newsectionlink' => array( '1', '__NOVIODLOMAKPOVEZNICA__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'TRENUTAÄŒNAIZMJENA', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLKODIRANJE:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'SIDROKODIRANJE', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'TRENUTAÄŒNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'MJESNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'JEZIKPROJEKTA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'STRANICEPOPROSTORU:', 'STRANICEUIMP', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'BROJADMINA', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'OBLIKBROJA', 'FORMATNUM' ),
- 'padleft' => array( '0', 'POSTAVALIJEVO', 'PADLEFT' ),
- 'padright' => array( '0', 'POSTAVADESNO', 'PADRIGHT' ),
- 'special' => array( '0', 'posebno', 'special' ),
- 'defaultsort' => array( '1', 'GLAVNIRASPORED:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'PUTANJADATOTEKE:', 'FILEPATH:' ),
- 'tag' => array( '0', 'oznaka', 'tag' ),
- 'hiddencat' => array( '1', '__SKRIVENAKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'STRANICEPOKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'VELIÄŒINASTRANICE', 'PAGESIZE' ),
- 'index' => array( '1', '__KAZALO__', '__INDEX__' ),
- 'noindex' => array( '1', '__BEZKAZALA__', '__NOINDEX__' ),
- 'staticredirect' => array( '1', '__NEPOMIÄŒNOPREUSMJERAVANJE__', '__STATICREDIRECT__' ),
+ 'redirect' => array( '0', '#PREUSMJERI', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEZUREÄIVANJAODLOMAKA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BEZZAGLAVLJA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'TRENUTAÄŒNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'TRENUTAÄŒNIMJESEC1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'TRENUTAÄŒNIMJESECIME', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'TRENUTAÄŒNIMJESECIMEGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'TRENUTAÄŒNIMJESECKRAT', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'TRENUTAÄŒNIDAN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'TRENUTAÄŒNIDAN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'TRENUTAÄŒNIDANIME', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TRENUTAÄŒNAGODINA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'TRENUTAÄŒNOVRIJEME', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'TRENUTAÄŒNISAT', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MJESNIMJESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MJESNIMJESEC1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'MJESNIMJESECIME', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'MJESNIMJESECIMEGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'MJESNIMJESECKRAT', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'MJESNIDAN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'MJESNIDAN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'MJESNIDANIME', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'MJESNAGODINA', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'MJESNOVRIJEME', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'MJESNISAT', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'BROJSTRANICA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'BROJSURADNIKA', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHSURADNIKA', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'BROJUREÄIVANJA', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'IMESTRANICE', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'IMESTRANICEE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'IMENSKIPROSTORE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'RAZGOVORE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'PROSTORSTRANICE', 'IMPSTRANICE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'PROSTORSTRANICEE', 'IMPSTRANICEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'IMEPODSTRANICE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'IMEPODSTRANICEE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'IMEOSNOVNESTRANICE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'IMEOSNOVNESTRANICEE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'IMERAZGOVORASTRANICE', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'IMERAZGOVORASTRANICEE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'IMEGLAVNESTRANICE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'IMEGLAVNESTRANICEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'subst' => array( '0', 'ZAMJENA:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'minijatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'desno', 'right' ),
+ 'img_left' => array( '1', 'lijevo', 'left' ),
+ 'img_none' => array( '1', 'ništa', 'none' ),
+ 'img_center' => array( '1', 'središte', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'okvir', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bezokvira', 'frameless' ),
+ 'img_page' => array( '1', 'stranica=$1', 'stranica $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'uspravno=$1', 'uspravno $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'obrub', 'border' ),
+ 'img_baseline' => array( '1', 'osnovnacrta', 'baseline' ),
+ 'img_sub' => array( '1', 'potpis', 'ind', 'sub' ),
+ 'img_super' => array( '1', 'natpis', 'eks', 'super', 'sup' ),
+ 'img_top' => array( '1', 'vrh', 'top' ),
+ 'img_text_top' => array( '1', 'tekst-vrh', 'text-top' ),
+ 'img_middle' => array( '1', 'pola', 'middle' ),
+ 'img_bottom' => array( '1', 'dno', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tekst-dno', 'text-bottom' ),
+ 'sitename' => array( '1', 'IMEPROJEKTA', 'SITENAME' ),
+ 'ns' => array( '0', 'IMP:', 'NS:' ),
+ 'localurl' => array( '0', 'MJESNIURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'MJESNIURLE:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'IMESERVERA', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'PUTANJASKRIPTE', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__BEZPRETVARANJANASLOVA__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__BEZPRETVARANJASADRŽAJA__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'TRENUTAÄŒNITJEDAN', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'TRENUTAÄŒNIDANTJEDNA', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'MJESNITJEDAN', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'MJESNIDANTJEDNA', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDIZMJENE', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DANIZMJENE', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DANIZMJENE2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MJESECIZMJENE', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'GODINAIZMJENE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VREMENSKAOZNAKAIZMJENE', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PUNIURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'PUNIURLE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'MSPRVO:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'VSPRVO:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MS:', 'LC:' ),
+ 'uc' => array( '0', 'VS:', 'UC:' ),
+ 'raw' => array( '0', 'NEOBRAÄENO:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'POKAŽINASLOV', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'NEO', 'R' ),
+ 'newsectionlink' => array( '1', '__NOVIODLOMAKPOVEZNICA__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'TRENUTAÄŒNAIZMJENA', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLKODIRANJE:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'SIDROKODIRANJE', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'TRENUTAÄŒNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'MJESNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'JEZIKPROJEKTA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'STRANICEPOPROSTORU:', 'STRANICEUIMP', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'BROJADMINA', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'OBLIKBROJA', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'POSTAVALIJEVO', 'PADLEFT' ),
+ 'padright' => array( '0', 'POSTAVADESNO', 'PADRIGHT' ),
+ 'special' => array( '0', 'posebno', 'special' ),
+ 'defaultsort' => array( '1', 'GLAVNIRASPORED:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'PUTANJADATOTEKE:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'oznaka', 'tag' ),
+ 'hiddencat' => array( '1', '__SKRIVENAKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'STRANICEPOKATEGORIJI', 'STRANICEUKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'VELIÄŒINASTRANICE', 'PAGESIZE' ),
+ 'index' => array( '1', '__KAZALO__', '__INDEX__' ),
+ 'noindex' => array( '1', '__BEZKAZALA__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '__NEPOMIÄŒNOPREUSMJERAVANJE__', '__STATICREDIRECT__' ),
);
$datePreferences = array(
@@ -664,20 +664,22 @@ Ako to nije sluÄaj, možda se radi o softverskoj greÅ¡ci. Molimo da u tom sluÄ
'badarticleerror' => 'Ovu radnju nije moguće izvesti s tom stranicom.',
'cannotdelete' => 'Ne može se obrisati stranica ili datoteka "$1".
Moguće je da ju je netko drugi već obrisao.',
+'cannotdelete-title' => 'Brisanje stranice "$1" nije moguće',
'badtitle' => 'Loš naslov',
'badtitletext' => 'Navedeni naslov stranice nepravilan ili loše formirana interwiki poveznica.',
-'perfcached' => 'Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji:',
-'perfcachedts' => 'Sljedeći podaci su iz međuspremnika i zadnji puta su ažurirani u $1.',
+'perfcached' => 'Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Sljedeći podaci su iz međuspremnika i zadnji puta su ažurirani u $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Osvježavanje ove stranice je trenutaÄno onemogućeno. Nove promjene neće biti vidljive.',
'wrong_wfQuery_params' => 'Neispravni parametri poslani u wfQuery()<br />
Funkcija: $1<br />
Upit: $2',
'viewsource' => 'Vidi izvornik',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Vidi kôd stranice $1',
'actionthrottled' => 'Uređivanje je usporeno',
'actionthrottledtext' => 'Kao anti-spam mjeru, ograniÄeni ste u broju ovih radnji u odreÄ‘enom vremenu, i trenutaÄno ste dosegli to ograniÄenje. PokuÅ¡ajte opet za koju minutu.',
'protectedpagetext' => 'Ova stranica je zakljuÄana da bi se onemogućile izmjene.',
'viewsourcetext' => 'Možete pogledati i kopirati izvorni sadržaj ove stranice:',
+'viewyourtext' => "Možete vidjeti i kopirati tekst '''vaših uređivanja''' na ovoj stranici:",
'protectedinterface' => 'Ova stranica je zaštićena od izmjena jer sadrži tekst 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 koriÅ¡tenje [//translatewiki.net/wiki/Main_Page?setlang=hr translatewiki.net], projekta lokalizacije MedijeWiki.",
'sqlhidden' => '(SQL upit sakriven)',
@@ -777,6 +779,7 @@ Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.',
'emailconfirmlink' => 'Potvrdite svoju e-mail adresu',
'invalidemailaddress' => 'Ne mogu prihvatiti e-mail adresu jer nije valjano oblikovana.
Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
+'cannotchangeemail' => 'Na ovom wikiju ne možete promijeniti adresu e-pošte.',
'accountcreated' => 'SuradniÄki raÄun otvoren',
'accountcreatedtext' => 'SuradniÄki raÄun za $1 je otvoren.',
'createaccount-title' => 'Otvaranje suradniÄkog raÄuna za {{SITENAME}}',
@@ -792,6 +795,7 @@ Molimo Vas da priÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
# E-mail sending
'php-mail-error-unknown' => 'Nepoznata pogreška u PHP-mail() funkciji',
+'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
# Change password dialog
'resetpass' => 'Promijeni lozinku',
@@ -811,16 +815,18 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
'resetpass-temp-password' => 'Privremena lozinka:',
# Special:PasswordReset
-'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vaÅ¡im detaljima raÄuna.',
-'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-username' => 'SuradniÄko ime:',
-'passwordreset-domain' => 'Domena:',
-'passwordreset-email' => 'E-mail adresa:',
-'passwordreset-emailtitle' => 'Pojedinosti o raÄunu na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za VaÅ¡e detalje raÄuna
+'passwordreset' => 'Ponovno postavi lozinku',
+'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vaÅ¡im detaljima raÄuna.',
+'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-username' => 'SuradniÄko ime:',
+'passwordreset-domain' => 'Domena:',
+'passwordreset-capture' => 'Pogledati krajnju poruku?',
+'passwordreset-capture-help' => 'Ako oznaÄite ovu kućicu, e-poruka s privremenom lozinkom će biti prikazana i poslana korisniku.',
+'passwordreset-email' => 'E-mail adresa:',
+'passwordreset-emailtitle' => 'Pojedinosti o raÄunu na {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za VaÅ¡e detalje raÄuna
za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|raÄun suradnika je|raÄuni suradnika su}}
povezani s ovom e-mail adresom:
@@ -830,7 +836,7 @@ $2
Trebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj
zahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti,
možete zanemariti ovu poruku i nastavite koristiti staru lozinku.',
-'passwordreset-emailtext-user' => 'Suradnik $1 na {{SITENAME}} zatražio podsjetnik o pojedinostima vaÅ¡eg raÄuna za {{SITENAME}}
+'passwordreset-emailtext-user' => 'Suradnik $1 na {{SITENAME}} zatražio podsjetnik o pojedinostima vaÅ¡eg raÄuna za {{SITENAME}}
($4). Sljedeći {{PLURAL:$3|raÄun suradnika je|raÄuni suradnika su}} povezani s ovom e-mail adresom:
$2
@@ -839,9 +845,22 @@ $2
Trebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj
zahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti,
možete zanemariti ovu poruku i nastavite koristiti staru lozinku.',
-'passwordreset-emailelement' => 'SuradniÄko ime: $1
+'passwordreset-emailelement' => 'SuradniÄko ime: $1
Privremena lozinka: $2',
-'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
+'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
+'passwordreset-emailsent-capture' => 'Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).',
+'passwordreset-emailerror-capture' => 'Napravljen je podsjetnik za slanje e-pošte (prikazan dolje), ali njegovo slanje nije uspjelo: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Promijeni e-mail adresu',
+'changeemail-header' => 'Promijeni e-mail adresu raÄuna',
+'changeemail-text' => 'Za promjenu e-mail adrese popunite ovaj obrazac. Morat ćete unijeti svoju lozinku da potvrdite ovu promjenu.',
+'changeemail-no-info' => 'Morate biti prijavljeni da biste izravno pristupili ovoj stranici.',
+'changeemail-oldemail' => 'Trenutna E-mail adresa:',
+'changeemail-newemail' => 'Nova E-mail adresa:',
+'changeemail-none' => '(ništa)',
+'changeemail-submit' => 'Promijeni E-mail',
+'changeemail-cancel' => 'Odustani',
# Edit page toolbar
'bold_sample' => 'Podebljani tekst',
@@ -910,9 +929,6 @@ Primijetite da ne možete koristiti opciju "Pošalji mu e-mail" ukoliko niste up
VaÅ¡a trenutaÄna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.',
'blockednoreason' => 'bez obrazloženja',
-'blockedoriginalsource' => "Izvorni tekst Älanka '''$1''' prikazan je ispod:",
-'blockededitsource' => "Tekst '''VaÅ¡e izmjene''' na Älanku '''$1''' prikazan je ispod:",
-'whitelistedittitle' => 'Za uređivanje stranice morate se prijaviti',
'whitelistedittext' => 'Za uređivanje stranice morate se $1.',
'confirmedittext' => 'Morate potvrditi VaÅ¡u e-mail adresu prije nego Å¡to Vam bude omogućeno ureÄ‘ivanje. Molim unesite i ovjerite VaÅ¡u e-mail adresu u [[Special:Preferences|suradniÄkim postavkama]].',
'nosuchsectiontitle' => 'Ne mogu pronaći odlomak',
@@ -1154,8 +1170,6 @@ Drugi administratori ovoga projekta ({{SITENAME}}) moći će i dalje pristupiti
'revdelete-unsuppress' => 'Ukloni ograniÄenja na vraćenim izmjenama',
'revdelete-log' => 'Razlog:',
'revdelete-submit' => 'Primijeni na {{PLURAL:$1|odabranu inaÄicu|odabrane inaÄice}}',
-'revdelete-logentry' => 'promijenjena vidljivost izmjene za [[$1]]',
-'logdelete-logentry' => 'promijenjena vidljivost uređivanja [[$1]]',
'revdelete-success' => "'''Vidljivost izmjene uspješno ažurirana.'''",
'revdelete-failure' => "'''Vidljivost inaÄice nije mogla biti ažurirana:'''
$1",
@@ -1167,15 +1181,6 @@ $1",
'revdel-restore-visible' => 'vidljive izmjene',
'pagehist' => 'Povijest stranice',
'deletedhist' => 'Obrisana povijest',
-'revdelete-content' => 'sadržaj',
-'revdelete-summary' => 'sažetak',
-'revdelete-uname' => 'suradniÄko ime',
-'revdelete-restricted' => 'primijenjeno ograniÄenje za administratore',
-'revdelete-unrestricted' => 'uklonjeno ograniÄenje za administratore',
-'revdelete-hid' => 'sakrij $1',
-'revdelete-unhid' => 'otkrij $1',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|izmjenu|izmjene}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|sluÄaj|sluÄaja}}',
'revdelete-hide-current' => 'GreÅ¡ka u skrivanju stavke datirane $2, $1: ovo je trenutaÄna inaÄica. Ne može biti skrivena.',
'revdelete-show-no-access' => 'GreÅ¡ka u prikazivanju stavke od $2, $1: ova stavka je oznaÄena kao "ograniÄeno".
Nemate pristup do nje.',
@@ -1331,12 +1336,14 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
'prefs-rc' => 'Nedavne promjene i kratki Älanci',
'prefs-watchlist' => 'Praćene stranice',
'prefs-watchlist-days' => 'Broj dana koji će se prikazati na popisu praćenja:',
-'prefs-watchlist-days-max' => 'Maksimalno 7 dana',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Broj uređivanja koji će se prikazati na proširenom popisu praćenja:',
'prefs-watchlist-edits-max' => 'Maksimalni broj: 1000',
'prefs-watchlist-token' => 'Token popisa praćenja:',
'prefs-misc' => 'Razno',
'prefs-resetpass' => 'Promijeni lozinku',
+'prefs-changeemail' => 'Promijeni E-mail',
+'prefs-setemail' => 'Postavite E-mail adresu',
'prefs-email' => 'Mogućnosti e-maila',
'prefs-rendering' => 'Izgled',
'saveprefs' => 'Spremi',
@@ -1393,6 +1400,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
'yourrealname' => 'Pravo ime (nije obvezno)*',
'yourlanguage' => 'Jezik:',
'yourvariant' => 'InaÄica jezika:',
+'prefs-help-variant' => 'Željena varijanta ili pravopis za prikaz stranica ovog wikija.',
'yournick' => 'Vaš nadimak (za potpisivanje)',
'prefs-help-signature' => 'Komentari na stranicama za razgovor trebali bi biti potpisani s "<nowiki>~~~~</nowiki>" što će biti pretvoreno u Vaš potpis i datum.',
'badsig' => 'Kôd Vašeg potpisa nije valjan; provjerite HTML tagove.',
@@ -1432,7 +1440,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'userrights-lookup-user' => 'Upravljaj suradniÄkim skupinama',
'userrights-user-editname' => 'Unesite suradniÄko ime:',
'editusergroup' => 'Uredi suradniÄke skupine',
-'editinguser' => "Promjena suradniÄkih prava za suradnika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Promjena suradniÄkih prava za suradnika '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Uredi suradniÄke skupine',
'saveusergroups' => 'Snimi suradniÄke skupine',
'userrights-groupsmember' => 'ÄŒlan:',
@@ -1526,13 +1534,13 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'right-autopatrol' => 'Izmjene su automatski oznaÄene kao pregledane',
'right-patrolmarks' => 'Vidljive oznake pregledavanja u nedavnim promjenama',
'right-unwatchedpages' => 'Vidljiv popis nepraćenih stranica',
-'right-trackback' => 'Podnijeti trackback',
'right-mergehistory' => 'Spajanje povijesti stranica',
'right-userrights' => 'UreÄ‘ivanje svih suradniÄkih prava',
'right-userrights-interwiki' => 'UreÄ‘ivanje suradniÄkih prava na drugim Wikijima',
'right-siteadmin' => 'ZakljuÄavanje i otkljuÄavanje baze podataka',
'right-override-export-depth' => 'Izvezi stranice ukljuÄujući i povezane stranice do dubine od 5',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
+'right-passwordreset' => 'Vidi poruku e-pošte o ponovnom postavljanju lozinke',
# User rights log
'rightslog' => 'Evidencija suradniÄkih prava',
@@ -1566,16 +1574,17 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'action-suppressionlog' => 'gledanje ove privatne evidencije',
'action-block' => 'blokiranje ovog suradnika',
'action-protect' => 'promjenu stupnja zaštite ove stranice',
+'action-rollback' => 'brzo vraćanje uređivanja posljednjeg suradnika koji je mijenjao određenu stranicu',
'action-import' => 'uvoženje ove stranice s drugog wikija',
'action-importupload' => 'uvoženje ove stranice postavljanjem datoteke',
'action-patrol' => 'oznaÄavanje tuÄ‘ih izmjena pregledanim',
'action-autopatrol' => 'automatsko oznaÄavanje pregledanim za svoje izmjene',
'action-unwatchedpages' => 'gledanje popisa stranica koje nisu praćene',
-'action-trackback' => 'podnošenje povratne informacije',
'action-mergehistory' => 'spajanje povijesti ove stranice',
'action-userrights' => 'ureÄ‘ivanje svih suradniÄkih prava',
'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',
# Recent changes
'nchanges' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}}',
@@ -1658,6 +1667,7 @@ Da biste na stranicu stavili datoteku, koristite poveznice tipa
'ignorewarnings' => 'Zanemari sva upozorenja',
'minlength1' => 'Ime datoteke mora imati barem jedno slovo.',
'illegalfilename' => 'Ime datoteke "$1" sadrži znakove koji nisu dopušteni u imenima stranica. Preimenujte datoteku i ponovno je postavite.',
+'filename-toolong' => 'Nazivi datoteka mogu imati najviše 240 znakova.',
'badfilename' => 'Ime slike automatski je promijenjeno u "$1".',
'filetype-mime-mismatch' => 'Ekstenzija datoteke ".$1" ne odgovara MIME tipu datoteke ($2).',
'filetype-badmime' => 'Datoteke MIME tipa "$1" ne mogu se snimati.',
@@ -1764,6 +1774,7 @@ Ne može biti ispravno sigurnosno oznaÄena.',
'uploadstash-badtoken' => 'Obavljanje akcije je bilo neuspješano, možda jer je vaša prijava istekla. Pokušajte ponovno.',
'uploadstash-errclear' => 'Brisanje neobjavljenih datoteka nije uspjelo.',
'uploadstash-refresh' => 'Osvježi popis datoteka',
+'invalid-chunk-offset' => 'Nevaljana toÄka nastavka snimanja',
# img_auth script messages
'img-auth-accessdenied' => 'Pristup onemogućen',
@@ -1867,24 +1878,25 @@ Slijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vo
'filerevert-badversion' => 'Nema prethodne lokalne inaÄice datoteke s zadanim datumom i vremenom.',
# File deletion
-'filedelete' => 'Izbriši $1',
-'filedelete-legend' => 'Izbriši datoteku',
-'filedelete-intro' => "BriÅ¡ete datoteku '''[[Media:$1|$1]]''' ukljuÄujući i sve njezine stare izmjene.",
-'filedelete-intro-old' => "BriÅ¡ete inaÄicu '''[[Media:$1|$1]]''' od [$4 $3, $2].",
-'filedelete-comment' => 'Razlog:',
-'filedelete-submit' => 'Izbriši',
-'filedelete-success' => "Datoteka '''$1''' je izbrisana.",
-'filedelete-success-old' => "InaÄica datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
-'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Nema arhivirane verzije datoteke '''$1''' s zadanim parametrima.",
-'filedelete-otherreason' => 'Drugi/dodatni razlog:',
-'filedelete-reason-otherlist' => 'Drugi razlog',
-'filedelete-reason-dropdown' => '*ÄŒesti razlozi brisanja
+'filedelete' => 'Izbriši $1',
+'filedelete-legend' => 'Izbriši datoteku',
+'filedelete-intro' => "BriÅ¡ete datoteku '''[[Media:$1|$1]]''' ukljuÄujući i sve njezine stare izmjene.",
+'filedelete-intro-old' => "BriÅ¡ete inaÄicu '''[[Media:$1|$1]]''' od [$4 $3, $2].",
+'filedelete-comment' => 'Razlog:',
+'filedelete-submit' => 'Izbriši',
+'filedelete-success' => "Datoteka '''$1''' je izbrisana.",
+'filedelete-success-old' => "InaÄica datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
+'filedelete-nofile' => "'''$1''' ne postoji.",
+'filedelete-nofile-old' => "Nema arhivirane verzije datoteke '''$1''' s zadanim parametrima.",
+'filedelete-otherreason' => 'Drugi/dodatni razlog:',
+'filedelete-reason-otherlist' => 'Drugi razlog',
+'filedelete-reason-dropdown' => '*ÄŒesti razlozi brisanja
** Kršenje autorskih prava
** Dupla datoteka
** Nekorištena datoteka',
-'filedelete-edit-reasonlist' => 'Uredi razloge za brisanje',
-'filedelete-maintenance' => 'Brisanje i vraćanje datoteka privremeno je onemogućeno zbog održavanja.',
+'filedelete-edit-reasonlist' => 'Uredi razloge za brisanje',
+'filedelete-maintenance' => 'Brisanje i vraćanje datoteka privremeno je onemogućeno zbog održavanja.',
+'filedelete-maintenance-title' => 'Ne mogu obrisati datoteku',
# MIME search
'mimesearch' => 'MIME tražilica',
@@ -2006,7 +2018,7 @@ koja obiÄno ukazuje na "pravu" odrediÅ¡nu stranicu, na koju bi trebalo pokaziva
'listusers-editsonly' => 'Pokaži samo suradnike s uređivanjem',
'listusers-creationsort' => 'Razvrstaj po datumu stvaranja',
'usereditcount' => '$1 {{PLURAL:$1|uređivanje|uređivanja|uređivanja}}',
-'usercreated' => 'Otvoren $1 u $2',
+'usercreated' => '{{GENDER:$3|Otvorio|Otvorila}} raÄun $1 u $2',
'newpages' => 'Nove stranice',
'newpages-username' => 'SuradniÄko ime:',
'ancientpages' => 'Najstarije stranice',
@@ -2099,12 +2111,8 @@ Podržani su protokoli: <tt>$1</tt> (ne stavljajte ih u vaše pretraživanje).',
'activeusers-noresult' => 'Niti jedan suradnik nije nađen.',
# Special:Log/newusers
-'newuserlogpage' => 'Evidencija novih suradnika',
-'newuserlogpagetext' => 'Ispod je popis nedavno otvorenih suradniÄkih imena.',
-'newuserlog-byemail' => 'lozinka poslana e-poštom',
-'newuserlog-create-entry' => 'Novi suradnik',
-'newuserlog-create2-entry' => 'otvoren je novi suradniÄki raÄun $1',
-'newuserlog-autocreate-entry' => 'Automatski stvoren raÄun',
+'newuserlogpage' => 'Evidencija novih suradnika',
+'newuserlogpagetext' => 'Ispod je popis nedavno otvorenih suradniÄkih imena.',
# Special:ListGroupRights
'listgrouprights' => 'Prava suradniÄkih skupina',
@@ -2135,7 +2143,7 @@ da bi mogli slati poštu drugim suradnicima.',
'emailpagetext' => 'Možete koristiti ovaj obrazac za slanje elektroniÄke poÅ¡te ovom suradniku.
E-mail adresa iz Vaših [[Special:Preferences|postavki]] nalazit će se u "From" polju poruke i primatelj će Vam moći izravno odgovoriti.',
'usermailererror' => 'Sustav pošte javio je pogrešku:',
-'defemailsubject' => '{{SITENAME}} elektroniÄka poÅ¡ta (e-mail)',
+'defemailsubject' => '{{SITENAME}} e-mail od suradnika "$1"',
'usermaildisabled' => 'SuradniÄka e-poÅ¡ta je onemogućena',
'usermaildisabledtext' => 'Ne možete slati e-poštu drugim suradnicima na ovom wikiju',
'noemailtitle' => 'Nema adrese primaoca',
@@ -2190,7 +2198,7 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
'watchmethod-list' => 'provjera praćanih stranica za nedavne promjene',
'watchlistcontains' => 'Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
'iteminvalidname' => "Problem s izborom '$1', ime nije valjano...",
-'wlnote' => "Ovdje {{PLURAL:$1|je posljednja $1 promjena|su posljednje $1 promjene|je posljednjih $1 promjena}} u {{PLURAL:$2|posljednjem '''$2''' satu|posljednja '''$2''' sata|posljednjih '''$2''' sati}}.",
+'wlnote' => "Ovdje {{PLURAL:$1|je posljednja $1 promjena|su posljednje $1 promjene|je posljednjih $1 promjena}} u {{PLURAL:$2|posljednjem '''$2''' satu|posljednja '''$2''' sata|posljednjih '''$2''' sati}}, od $3, $4.",
'wlshowlast' => 'Prikaži zadnjih $1 sati $2 dana $3',
'watchlist-options' => 'Izbornik popisa praćenja',
@@ -2252,8 +2260,6 @@ Molim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu
'actionfailed' => 'Radnja nije uspjela',
'deletedtext' => '"$1" je izbrisana.
Vidi $2 za evidenciju nedavnih brisanja.',
-'deletedarticle' => 'izbrisano "$1"',
-'suppressedarticle' => 'sakriven "[[$1]]"',
'dellogpage' => 'Evidencija_brisanja',
'dellogpagetext' => 'Dolje je popis nedavnih brisanja.
Sva vremena su prema poslužiteljevom vremenu.',
@@ -2297,7 +2303,10 @@ Pogledajte [[Special:ProtectedPages|zaÅ¡tićene stranice]] za popis trenutaÄno
'unprotectedarticle' => 'uklonjena zaÅ¡tita Älanka "[[$1]]"',
'movedarticleprotection' => 'premještene postavke zaštite s "[[$2]]" na "[[$1]]"',
'protect-title' => 'Zaštićujem "$1"',
+'protect-title-notallowed' => 'Vidi stupanj zaštite stranice "$1"',
'prot_1movedto2' => '$1 premješteno na $2',
+'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
+'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru ne mogu se zaštititi.',
'protect-legend' => 'Potvrda zaštite',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'Trajanje zaštite:',
@@ -2318,6 +2327,7 @@ Slijede trenutaÄne postavke stranice '''$1''':",
'protect-level-sysop' => 'Samo administratori',
'protect-summary-cascade' => 'prenosiva zaštita',
'protect-expiring' => 'istjeÄe $1 (UTC)',
+'protect-expiring-local' => 'istiÄe $1',
'protect-expiry-indefinite' => 'neograniÄeno',
'protect-cascade' => 'Prenosiva zaÅ¡tita - zaÅ¡titi sve stranice koje su ukljuÄene u ovu.',
'protect-cantedit' => 'Ne možete mijenjati razinu zaštite ove stranice, jer nemate prava uređivati ju.',
@@ -2377,7 +2387,6 @@ ili je promjena vraćena ili uklonjena iz arhive.',
'undeletereset' => 'OÄisti',
'undeleteinvert' => 'Obrni odabir',
'undeletecomment' => 'Razlog:',
-'undeletedarticle' => 'vraćena stranica "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|$1 inaÄica vraćena|$1 inaÄice vraćene|$1 inaÄica vraćeno}}',
'undeletedrevisions-files' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}',
'undeletedfiles' => '{{PLURAL:$1|$1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
@@ -2386,6 +2395,7 @@ ili je promjena vraćena ili uklonjena iz arhive.',
Pogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.",
'undelete-header' => 'Pogledaj [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.',
+'undelete-search-title' => 'Pretraži obrisane stranice',
'undelete-search-box' => 'Pretraži obrisane stranice',
'undelete-search-prefix' => 'Pretraži stranice koje poÄinju s:',
'undelete-search-submit' => 'Pretraži',
@@ -2394,6 +2404,7 @@ Pogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanj
'undelete-bad-store-key' => 'Ne mogu vratiti inaÄicu datoteke s vremenom i datumom $1: datoteka ne postoji (obrisana je) prije VaÅ¡eg pokuÅ¡aja brisanja.',
'undelete-cleanup-error' => 'Pogreška pri brisanju nekorištene arhivske datoteke "$1".',
'undelete-missing-filearchive' => 'Vraćanje arhivske datoteke s oznakom $1 nije moguće jer ne postoji u bazi podataka. Moguće je već vraćena.',
+'undelete-error' => 'Pogreška pri vraćanju obrisane stranice',
'undelete-error-short' => 'Pogreška pri vraćanju datoteke: $1',
'undelete-error-long' => 'Dogodila se pogreška pri vraćanju datoteke:
@@ -2516,6 +2527,7 @@ Pogledaj [[Special:BlockList|popis blokiranih IP adresa]] za pregled.',
'blocklist-userblocks' => 'Sakrij blokiranja raÄuna',
'blocklist-tempblocks' => 'Sakrij privremena blokiranja',
'blocklist-addressblocks' => 'Sakrij pojedinaÄna IP blokiranja',
+'blocklist-rangeblocks' => 'Sakrij blokiranja opsega',
'blocklist-timestamp' => 'Vremenska oznaka',
'blocklist-target' => 'Cilj',
'blocklist-expiry' => 'IstjeÄe',
@@ -2538,6 +2550,7 @@ Pogledaj [[Special:BlockList|popis blokiranih IP adresa]] za pregled.',
'unblocklink' => 'deblokiraj',
'change-blocklink' => 'promijeni blokiranje',
'contribslink' => 'doprinosi',
+'emaillink' => 'pošalji e-mail',
'autoblocker' => 'Automatski ste blokirani jer je Vašu IP adresu nedavno koristio "[[User:$1|$1]]" koji je blokiran zbog: "$2".',
'blocklogpage' => 'Evidencija blokiranja',
'blocklog-showlog' => 'Ovaj suradnik je ranije blokiran.
@@ -2659,9 +2672,6 @@ Molimo odaberite drugo ime.',
'movepage-page-moved' => 'Stranica $1 je premještena na $2.',
'movepage-page-unmoved' => 'Stranica $1 nije mogla biti premještena na $2.',
'movepage-max-pages' => 'Najveća koliÄina od $1 {{PLURAL:$1|stranice|stranica}} je premjeÅ¡tena i viÅ¡e od toga neće biti automatski premjeÅ¡teno.',
-'1movedto2' => '[[$1]] premješteno na [[$2]]',
-'1movedto2_redir' => '[[$1]] premješteno na [[$2]] preko postojećeg preusmjeravanja',
-'move-redirect-suppressed' => 'izostavljeno preusmjeravanje',
'movelogpage' => 'Evidencija premještanja',
'movelogpagetext' => 'Ispod je popis premještenih stranica.',
'movesubpage' => '{{PLURAL:$1|Podstranica|Podstranice}}',
@@ -2674,7 +2684,7 @@ Molimo odaberite drugo ime.',
OdrediÅ¡ni Älanak "[[:$1]]" već postoji. Želite li ga obrisati da biste napravili mjesto za premjeÅ¡taj?',
'delete_and_move_confirm' => 'Da, izbriši stranicu',
-'delete_and_move_reason' => 'Obrisano kako bi se napravilo mjesta za premještaj.',
+'delete_and_move_reason' => 'Obrisano kako bi se napravilo mjesta za premještaj, stari naziv "[[$1]]"',
'selfmove' => 'Izvorni i odredišni naslov su isti; ne mogu premjestiti stranicu na nju samu.',
'immobile-source-namespace' => 'Ne mogu premjestiti stranice u imenski prostor "$1"',
'immobile-target-namespace' => 'Ne mogu premjestiti stranice u imenski prostor "$1"',
@@ -2706,6 +2716,7 @@ U potonjem sluÄaju možete koristiti i poveznicu, npr. [[{{#Special:Export}}/{{
'exportcuronly' => 'UkljuÄi samo trenutaÄnu inaÄicu, ne i sve prijaÅ¡nje',
'exportnohistory' => "----
'''Napomena:''' izvoz cjelokupne stranice sa svim prethodnim izmjenama onemogućen je zbog opterećenja poslužitelja.",
+'exportlistauthors' => 'UkljuÄi potpuni popis suradnika za svaku stranicu',
'export-submit' => 'Izvezi',
'export-addcattext' => 'Dodaj stranice iz kategorije:',
'export-addcat' => 'Dodaj',
@@ -2737,6 +2748,8 @@ U potonjem sluÄaju možete koristiti i poveznicu, npr. [[{{#Special:Export}}/{{
'thumbnail_error' => 'PogreÅ¡ka pri izradbi sliÄice: $1',
'djvu_page_error' => "DjVu stranica nije dohvatljiva (''out of range'')",
'djvu_no_xml' => 'Ne mogu dohvatiti XML za DjVu datoteku',
+'thumbnail-temp-create' => 'Stvaranje privremene datoteke za smanjenu sliku ("mini") nije moguće.',
+'thumbnail-dest-create' => 'Spremanje smanjene slike ("thumbnail") na ponuđenu mjesto nije moguće.',
'thumbnail_invalid_params' => "Nevaljani parametri za smanjenu sliku (''thumbnail'')",
'thumbnail_dest_directory' => 'Ne mogu stvoriti ciljni direktorij',
'thumbnail_image-type' => 'Tip slike nije podržan',
@@ -2781,6 +2794,8 @@ Snimite je na svoje raÄunalo i postavite je ovdje.',
'import-upload' => 'Postavljanje XML datoteka',
'import-token-mismatch' => 'Izgubljeni su podaci o sesiji. Molimo pokušajte ponovno.',
'import-invalid-interwiki' => 'Ne mogu uvesti iz navedene wiki.',
+'import-error-edit' => 'Stranica "$1" nije uvezena jer vam nije dopušteno da je uređujete.',
+'import-error-create' => 'Stranica "$1" nije uvezena jer vam nije dopušteno da ju stvorite.',
# Import log
'importlogpage' => 'Evidencija uvoza Älanaka',
@@ -2924,9 +2939,6 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
# Patrol log
'patrol-log-page' => 'Evidencija pregledavanja promjena',
'patrol-log-header' => 'Ovo su evidencije patroliranih izmjena.',
-'patrol-log-line' => 'promjena broj $1 stranice $2 pregledana $3',
-'patrol-log-auto' => '(automatski pregledano)',
-'patrol-log-diff' => 'promjena $1',
'log-show-hide-patrol' => '$1 evidenciju patroliranja',
# Image deletion
@@ -2953,11 +2965,11 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
'file-info' => 'veliÄina datoteke: $1, MIME tip: $2',
'file-info-size' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME tip: $4',
'file-info-size-pages' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}',
-'file-nohires' => '<small>Viša rezolucija nije dostupna.</small>',
+'file-nohires' => 'Viša rezolucija nije dostupna.',
'svg-long-desc' => 'SVG datoteka, nominalno $1 × $2 piksela, veliÄina datoteke: $3',
'show-big-image' => 'Vidi sliku u punoj veliÄini (rezoluciji)',
-'show-big-image-preview' => '<small>VeliÄina ovog prikaza: $1.</small>',
-'show-big-image-other' => '<small>Ostale rezolucije: $1.</small>',
+'show-big-image-preview' => 'VeliÄina ovog prikaza: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.',
'show-big-image-size' => '$1 × $2 piksela',
'file-info-gif-looped' => 'animacija se ponavlja',
'file-info-gif-frames' => '$1 {{PLURAL:$1|okvir|okvira}}',
@@ -2977,6 +2989,13 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
'bydate' => 'po datumu',
'sp-newimages-showfrom' => 'Prikaži nove slike poÄevÅ¡i od $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekunde|$1 sekundi}}',
+'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}}',
+'ago' => 'prije $1',
+
# Bad image list
'bad_image_list' => "Rabi se sljedeći format:
@@ -3476,13 +3495,6 @@ Valjanost ovog potvrdnog koda istjeÄe u $4',
'scarytranscludefailed' => '[Dobava predloška nije uspjela za $1]',
'scarytranscludetoolong' => '[URL je predug]',
-# Trackbacks
-'trackbackbox' => "''Trackbackovi'' za ovaj Älanak:<br />
-$1",
-'trackbackremove' => '([$1 izbrisati])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback izbrisan.',
-
# Delete conflict
'deletedwhileediting' => "'''Upozorenje''': Ova stranica je obrisana nakon Å¡to ste poÄeli ureÄ‘ivati!",
'confirmrecreate' => "Suradnik [[User:$1|$1]] ([[User talk:$1|talk]]) izbrisao je ovaj Älanak nakon Å¡to ste ga poÄeli ureÄ‘ivati. Razlog brisanja
@@ -3620,6 +3632,9 @@ Također možete koristiti [[Special:EditWatchlist|standardni editor]].',
'hebrew-calendar-m11-gen' => 'ava',
'hebrew-calendar-m12-gen' => 'elula',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])',
+
# Core parser functions
'unknown_extension_tag' => "Nepoznat ''tag'' ekstenzije \"\$1\"",
'duplicate-defaultsort' => '\'\'\'Upozorenje:\'\'\' Razvrstavanje po "$2" poništava ranije razvrstavanje po "$1".',
@@ -3675,7 +3690,7 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'specialpages' => 'Posebne stranice',
'specialpages-note' => '----
* Normalne posebne stranice
-* <strong class="mw-specialpagerestricted">Posebne stranice s ograniÄenim pristupom.</strong>',
+* <span class="mw-specialpagerestricted">Posebne stranice s ograniÄenim pristupom.</span>',
'specialpages-group-maintenance' => 'Izvještaji za održavanje',
'specialpages-group-other' => 'Ostale posebne stranice',
'specialpages-group-login' => 'Prijava / Otvaranje raÄuna',
@@ -3717,13 +3732,16 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'tags-hitcount' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
# Special:ComparePages
-'comparepages' => 'Usporedite stranice',
-'compare-selector' => 'Usporedite inaÄice stranice',
-'compare-page1' => 'Stranica 1',
-'compare-page2' => 'Stranica 2',
-'compare-rev1' => 'Izmjena 1',
-'compare-rev2' => 'Izmjena 2',
-'compare-submit' => 'Usporedite',
+'comparepages' => 'Usporedite stranice',
+'compare-selector' => 'Usporedite inaÄice stranice',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Izmjena 1',
+'compare-rev2' => 'Izmjena 2',
+'compare-submit' => 'Usporedite',
+'compare-invalid-title' => 'Naslov koji ste naveli je nevažeći.',
+'compare-title-not-exists' => 'Naslov koji ste naveli ne postoji.',
+'compare-revision-not-exists' => 'Navedena izmjena stranice ne postoji.',
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
@@ -3750,4 +3768,83 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'sqlite-has-fts' => '$1 s podrškom pretraživanja cijelog teksta',
'sqlite-no-fts' => '$1 bez podrške pretraživanja cijelog teksta',
+# New logging system
+'logentry-delete-delete' => '$1 je obrisao stranicu $3',
+'logentry-delete-restore' => '$1 je vratio stranicu $3',
+'logentry-delete-event' => '$1 je promijenio vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4',
+'logentry-delete-revision' => '$1 je promijenio vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4',
+'logentry-delete-event-legacy' => '$1 je promijenio vidljivost zapisa u evidenciji na $3',
+'logentry-delete-revision-legacy' => '$1 je promijenio vidljivost uređivanja stranice $3',
+'logentry-suppress-delete' => '$1 je potisnuo stranicu $3',
+'logentry-suppress-event' => '$1 je tajno promijenio vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4',
+'logentry-suppress-revision' => '$1 je tajno promijenio vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4',
+'logentry-suppress-event-legacy' => '$1 je tajno promijenio vidljivost zapisa u evidenciji na $3',
+'logentry-suppress-revision-legacy' => '$1 je tajno promijenio vidljivost uređivanja na stranici $3',
+'revdelete-content-hid' => 'sadržaj je sakriven',
+'revdelete-summary-hid' => 'sažetak uređivanja je sakriven',
+'revdelete-uname-hid' => 'suradniÄko ime skriveno',
+'revdelete-content-unhid' => 'sadržaj uređivanja je otkriven',
+'revdelete-summary-unhid' => 'sažetak uređivanja je otkriven',
+'revdelete-uname-unhid' => 'suradniÄko ime je otkriveno',
+'revdelete-restricted' => 'primijenjeno ograniÄenje za administratore',
+'revdelete-unrestricted' => 'uklonjeno ograniÄenje za administratore',
+'logentry-move-move' => '$1 je premjestio stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 je premjestio stranicu $3 na $4 bez preusmjeravanja',
+'logentry-move-move_redir' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja',
+'logentry-move-move_redir-noredirect' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
+'logentry-patrol-patrol' => '$1 je oznaÄio ureÄ‘ivanje $4 stranice $3 pregledanim',
+'logentry-patrol-patrol-auto' => '$1 je automatski oznaÄio ureÄ‘ivanje $4 stranice $3 pregledanim',
+'logentry-newusers-newusers' => '$1 je otvorio suradniÄki raÄun',
+'logentry-newusers-create' => '$1 je otvorio suradniÄki raÄun',
+'logentry-newusers-create2' => '$1 je otvorio suradniÄki raÄun $3',
+'logentry-newusers-autocreate' => 'SuradniÄki raÄun $1 je automatski stvoren',
+'newuserlog-byemail' => 'lozinka poslana e-poštom',
+
+# Feedback
+'feedback-bugornote' => 'Ako ste spremni detaljno opisati tehniÄki problem molimo [$1 prijavite "bug"].
+InaÄe, možete ispuniti jednostavan obrazac u nastavku. VaÅ¡ komentar biti će dodan na stranicu "[$3 $2]", zajedno s vaÅ¡im suradniÄkim imenom i imenom internetskog preglednika koji rabite.',
+'feedback-subject' => 'Tema:',
+'feedback-message' => 'Poruka:',
+'feedback-cancel' => 'Odustani',
+'feedback-submit' => 'Pošaljite povratnu informaciju',
+'feedback-adding' => 'Dodajem povratne informacije na stranicu...',
+'feedback-error1' => 'Pogreška: Neprepoznati rezultat od API funkcije',
+'feedback-error2' => 'Pogreška: Uređivanje nije uspjelo',
+'feedback-error3' => 'Pogreška: Nema odgovora od API funkcije',
+'feedback-thanks' => 'Hvala! Vaš odgovor je snimljen na stranicu "[$2 $1]".',
+'feedback-close' => 'Gotovo',
+'feedback-bugcheck' => 'Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom "bugu"].',
+'feedback-bugnew' => 'Provjereno. Prijavi novi "bug"',
+
+# API errors
+'api-error-badaccess-groups' => 'Nemate ovlasti za postavljanje datoteka na ovu wiki.',
+'api-error-badtoken' => "''Token'' koji smo koristili za vašu identifikaciju na ovaj poslužitelj nije bio ispravan.",
+'api-error-copyuploaddisabled' => 'Postavljanja datoteka kopiranjem su onemogućena.',
+'api-error-duplicate' => 'Već postoji jedna datoteka na ovoj wiki s istim sadržajem',
+'api-error-empty-file' => 'Datoteka koju ste poslali je prazna.',
+'api-error-fetchfileerror' => 'Pojavio se neki problem pri dobivanju podataka o datoteci.',
+'api-error-file-too-large' => 'Datoteka koju ste poslali bila je prevelika.',
+'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
+'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
+'api-error-hookaborted' => 'Izmjena koji ste pokuÅ¡ali naÄiniti je otkazana preko "kuke" proÅ¡irenja mediawiki softvera.',
+'api-error-http' => 'Interna pogreška: Ne može se povezati na poslužitelj.',
+'api-error-illegal-filename' => 'Ime datoteke nije dopušteno.',
+'api-error-internal-error' => 'Pojavio se neki problem s obradom postavljanja datoteke na wiki.',
+'api-error-invalid-file-key' => 'Poslužitelj nije mogao naći tu datoteku u vašim postavljenim datotekama.',
+'api-error-missingparam' => 'Postavljanje nije imalo sve nužne podatke (možda je pogrjeÅ¡ka u ovom postavljaÄu.)',
+'api-error-missingresult' => 'Nismo mogli utvrditi je li kopiranje uspjelo.',
+'api-error-mustbeloggedin' => 'Niste pravilno prijavljeni.',
+'api-error-mustbeposted' => 'Postoji pogreška u ovom softveru; ne rabi ispravnu HTTP metodu.',
+'api-error-nomodule' => 'Interna pogreška: Nije postavljen modul za postavljanje.',
+'api-error-ok-but-empty' => 'Interna pogreška: Nema odgovora od poslužitelja.',
+'api-error-overwrite' => 'Postavljanje preko postojeće datoteke nije dopušteno.',
+'api-error-stashfailed' => 'Wikiprojekt nije mogao spremiti datoteku.',
+'api-error-unclassified' => 'Dogodila se nepoznata pogreška.',
+'api-error-unknown-code' => 'Nepoznata pogreška: "$1"',
+'api-error-unknown-error' => 'Dogodila se pogrješka pri pokušaju postavljanja vaše datoteke.',
+'api-error-unknown-warning' => 'Nepoznato upozorenje: $1',
+'api-error-uploaddisabled' => 'Postavljanje datoteka je onemogućeno na ovom wikiprojektu.',
+'api-error-verification-error' => 'Ova datoteka je možda oštećena ili ima pogrešan nastavak.',
+
);
diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php
index 0b086700..3e3e25c2 100644
--- a/languages/messages/MessagesHsb.php
+++ b/languages/messages/MessagesHsb.php
@@ -47,6 +47,20 @@ $namespaceGenderAliases = array(
NS_USER_TALK => array( 'male' => 'Diskusija_z_wužiwarjom', 'female' => 'Diskusija_z_wužiwarku' ),
);
+$datePreferences = array(
+ 'default',
+ 'dmy',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j. xg Y',
+ 'dmy both' => 'j. xg Y, H:i',
+);
+
$specialPageAliases = array(
'Activeusers' => array( 'Aktiwni_wužiwarjo' ),
'Allmessages' => array( 'MediaWiki-zdźělenki' ),
@@ -495,20 +509,22 @@ Zdźěl to proÅ¡u [[Special:ListUsers/sysop|admininistratorej]] podawajo wotpowÄ
'badarticleerror' => 'Tuta akcija njeda so na tutej stronje wuwjesć.',
'cannotdelete' => 'Strona abo dataja "$1" njeje so dała wušmórnyć.
Móže być, zo je hižo wot někoho druheho wušmórnjena.',
+'cannotdelete-title' => 'Strona "$1" njehodźi so zhašeć',
'badtitle' => 'WopaÄny titul',
'badtitletext' => 'Požadane mjeno strony běše njepÅ‚aćiwy, prózdny abo njekorektny titul z mjezyrÄ›Äneho abo interwikijoweho wotkaza. Snano wobsahuje jedne znamjeÅ¡ko abo wjacore znamjeÅ¡ka, kotrež w titulach dowolene njejsu.',
-'perfcached' => 'Sćěhowace daty z pufrowaka pochadźeja a snano cyle aktualne njejsu.',
-'perfcachedts' => 'Sćěhowace daty su z pufrowaka a buchu $1 posledni raz zaktualizowane.',
+'perfcached' => 'Slědowace daty pochadźeja z pufrowaka a njejsu snano cyle aktualne. Maksimalnje {{PLURAL:$1|jedyn wuslědk|$1 wuslědkaj|$1 wuslědki|$1 wuslědkow}} w pufrowaku k dispoziciji {{PLURAL:$1|steji|stejitej|steja|steji}}.',
+'perfcachedts' => 'Slědowace daty su z pufrowaka a buchu $1 posledni raz zaktualizowane. Maksimalnje {{PLURAL:$4|jedyn wuslědk|$4 wuslědkaj|$4 wuslědki|$4 wuslědkow}} w pufrowaku k dispoziciji {{PLURAL:$4|steji|stejitej|steja|steji}}.',
'querypage-no-updates' => 'Aktualizacije za tutu stronu su tuchwilu znjemóžnjene. Daty so haÄ na dalÅ¡e njewobnowja.',
'wrong_wfQuery_params' => 'Njeprawe parametry za wfQuery()<br />
Funkcija: $1<br />
Wotprašenje: $2',
'viewsource' => 'žórło wobhladać',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Žórłowy tekst za $1 sej wobhladać',
'actionthrottled' => 'Akcije wobmjezowane',
'actionthrottledtext' => 'Jako pÅ™iprawa pÅ™ećiwo spamej, je Äastosć wuwjedźenja tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit pÅ™ekroÄiÅ‚. ProÅ¡u spytaj za něšto mjeÅ„Å¡iny hišće raz.',
'protectedpagetext' => 'Strona je přećiwo wobdźěłowanju škitana.',
'viewsourcetext' => 'Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować:',
+'viewyourtext' => "Móžeš sej žórłowy tekst '''swojich změnow''' wobhladać a do slědowaceje strony kopěrować:",
'protectedinterface' => 'Tuta strona wobsahuje tekst za wužiwarski powjerch softwary a je škitana, zo by so znjewužiwanje zadźěwało.',
'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. Hlej za přełožki [//translatewiki.net/wiki/Main_Page?setlang=hsb translatewiki.net], projekt lokalizacije MediaWiki.",
'sqlhidden' => '(SQL wotprašenje schowane)',
@@ -602,6 +618,7 @@ Prjedy haÄ so druha e-mejlka na konto pósćele, dyrbiÅ¡ so po instrukcijach w
'noemailprefs' => 'Podaj e-mejlowu adresu w swojich nastajenjach, zo bychu tute funkcije k dispoziciji stali.',
'emailconfirmlink' => 'Swoju e-mejlowu wobkrućić',
'invalidemailaddress' => 'E-mejlowa adresa so njeakceptuje, dokelž ma po zdaću njepłaćiwy format. Prošu zapodaj płaćiwu adresu abo wuprózdń te polo.',
+'cannotchangeemail' => 'Kontowe e-mejlowe adresy njehodźa so na tutym wikiju změnić.',
'accountcreated' => 'Wužiwarske konto załožene',
'accountcreatedtext' => 'Wužiwarske konto za $1 bu załožene.',
'createaccount-title' => 'Wutworjenje wužiwarskeho konta za {{SITENAME}}',
@@ -616,6 +633,7 @@ MóžeÅ¡ tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiÅ
# E-mail sending
'php-mail-error-unknown' => 'Njeznaty zmylk w PHP-funkciji mail()',
+'user-mail-no-addy' => 'Je so spytało e-mejl bjez e-mejloweje adresy słać.',
# Change password dialog
'resetpass' => 'Hesło změnić',
@@ -636,30 +654,45 @@ Snano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło poža
'resetpass-temp-password' => 'Nachwilne hesło:',
# Special:PasswordReset
-'passwordreset' => 'Hesło wróćo stajić',
-'passwordreset-text' => 'Wupjelń tutón formular, zo by dopomnjensku e-mejl wo swojich kontowych podrobnosćach dóstał.',
-'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-username' => 'Wužiwarske mjeno:',
-'passwordreset-domain' => 'Domena:',
-'passwordreset-email' => 'E-mejlowa adresa:',
-'passwordreset-emailtitle' => 'Kontowe podrobnosće na {{GRAMMAR:lokatiw|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Něchtó (najskerje ty, z IP-adresu $1) je dopomnjenku na twoje kontowe podrobnosće za {{SITENAME}} požadał ($4). {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane|zwjazane}}:
+'passwordreset' => 'Hesło wróćo stajić',
+'passwordreset-text' => 'Wupjelń tutón formular, zo by dopomnjensku e-mejl wo swojich kontowych podrobnosćach dóstał.',
+'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-username' => 'Wužiwarske mjeno:',
+'passwordreset-domain' => 'Domena:',
+'passwordreset-capture' => 'E-mejlku sej wobhladać?',
+'passwordreset-capture-help' => 'Jeli nakřižuješ tutón kašćik, budźe so e-mejlka z nachwilnym hesło pokazować a tež wužiwarjej pósłać.',
+'passwordreset-email' => 'E-mejlowa adresa:',
+'passwordreset-emailtitle' => 'Kontowe podrobnosće na {{GRAMMAR:lokatiw|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Něchtó (najskerje ty, z IP-adresu $1) je dopomnjenku na twoje kontowe podrobnosće za {{SITENAME}} požadał ($4). {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane|zwjazane}}:
$2
{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.
Ty měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.',
-'passwordreset-emailtext-user' => 'Wužiwar $1 je dopomnjenku na twoje kontowe podrobnosće za {{SITENAME}} požadał ($4). {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane|zwjazane}}:
+'passwordreset-emailtext-user' => 'Wužiwar $1 je dopomnjenku na twoje kontowe podrobnosće za {{SITENAME}} požadał ($4). {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane|zwjazane}}:
$2
{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.
Ty měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.',
-'passwordreset-emailelement' => 'Wužiwarske mjeno: $1
+'passwordreset-emailelement' => 'Wužiwarske mjeno: $1
Nachwilne hesło: $2',
-'passwordreset-emailsent' => 'Wopomnjenska e-mejlka je so pósłała.',
+'passwordreset-emailsent' => 'Wopomnjenska e-mejlka je so pósłała.',
+'passwordreset-emailsent-capture' => 'Deleka pokazana dopomnjenska e-mejl je so wotpósłała.',
+'passwordreset-emailerror-capture' => 'Deleka pokazana dopomnjenska e-mejl je so wutworiła, ale słanje wužiwarjej je so njeporadźiło: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mejlowu adresu změnić',
+'changeemail-header' => 'Kontowu e-mejlowu adresu změnić',
+'changeemail-text' => 'Wupjelń tutón formular, zo by swoju e-mejlowu adresu změnił. Dyrbiš swoje hesło zapodać, zo by tutu změnu wobkrućił.',
+'changeemail-no-info' => 'Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.',
+'changeemail-oldemail' => 'Aktualna e-mejlowa adresa:',
+'changeemail-newemail' => 'Nowa e-mejlowa adresa:',
+'changeemail-none' => '(žana)',
+'changeemail-submit' => 'E-mejlowu adresu změnić',
+'changeemail-cancel' => 'Přetorhnyć',
# Edit page toolbar
'bold_sample' => 'TuÄny tekst',
@@ -727,9 +760,6 @@ Wobkedźbuj, zo njemóžeš funkciju "Wužiwarjej mejlku pósłać" wužiwać, j
Twój aktualna adresa IP je $3 a ID blokowanja je #$5.
ProÅ¡u podaj wÅ¡Ä› horjeka naspomnjene podrobnosće w napraÅ¡owanjach, kotrež ÄiniÅ¡.',
'blockednoreason' => 'žana pÅ™iÄina podata',
-'blockedoriginalsource' => 'To je žórłowy tekst strony <b>$1</b>:',
-'blockededitsource' => 'Tekst <b>twojich změnow</b> strony <b>$1</b> so tu pokazuje:',
-'whitelistedittitle' => 'Za wobdźěłowanje je přizjewjenje trěbne.',
'whitelistedittext' => 'Dyrbiš so $1, zo by strony wobdźěłować móhł.',
'confirmedittext' => 'DyrbiÅ¡ swoju e-mejlowu adresa wobkrućić, prjedy haÄ móžeÅ¡ strony wobdźěłować. ProÅ¡u zapodaj a wobkruć swoju e-mejlowu adresu we [[Special:Preferences|wužiwarskich nastajenjach]].',
'nosuchsectiontitle' => 'Wotrězk njeda so namakać',
@@ -804,7 +834,7 @@ Kopěrowanje tekstow, kiž su přez awtorske prawa škitane, je zakazane! '''NJE
Lubiš nam tež, zo sy jón sam napisał abo ze zjawneje domejny abo z podobneho swobodneho žórła kopěrował (hlej $1 za podrobnosće).
'''NJESKÅADUJ PŘINOÅ KI Z COPYRIGHTOM BJEZ DOWOLNOSĆE!'''",
-'longpageerror' => "'''ZMYLK: Tekst, kotryž sy spytał składować wobsahuje $1 kB, maksimalna wulkosć pak je $2 kB. Njehodźi so składować.'''",
+'longpageerror' => "'''ZMYLK: Tekst, kotryž pospytuješ składować, je {{PLURAL:$1| jedyn kilobajt|$1 kilobajtaj|$1 kilobajty|$1 kilobajtow}} dołho, maksimalna wulkosć pak je {{PLURAL:$2|jedyn kilobajt|$1 kilobajtaj|$1 kilobajty|$1 kilobajtow}}.''' Njehodźi so składować.",
'readonlywarning' => "'''KEDŹBU: Datowa banka bu wothladanja dla zawrjena, tohodla njemóžeš swoje změny nětko składować. Móžeš tekst do tekstoweje dataje přesunyć a jón za pozdźišo składować.'''
Administrator, kiž je ju zawrjena, je tutu pÅ™iÄinu podaÅ‚: $1",
@@ -965,8 +995,6 @@ Druzy administratorojo na {{GRAMMAR:lokatiw|{{SITENAME}}}} móža hišće na sch
'revdelete-unsuppress' => 'Wobmjezowanja za wobnowjene wersije zběhnyć',
'revdelete-log' => 'PÅ™iÄina:',
'revdelete-submit' => 'Na {{PLURAL:$1|wubranu wersiju|wubranej wersiji|wubrane wersije|wubrane wersije}} nałožować',
-'revdelete-logentry' => 'Widźomnosć wersije změnjena za [[$1]]',
-'logdelete-logentry' => 'je widźomnosć za [[$1]] změnił',
'revdelete-success' => "'''Widźomnosć wersije bu wuspěšnje zaktualizowana.'''",
'revdelete-failure' => "'''Wersijowa widźomnosć njeda so aktualizować:'''
$1",
@@ -978,15 +1006,6 @@ $1",
'revdel-restore-visible' => 'widźomne wersije',
'pagehist' => 'Stawizny strony',
'deletedhist' => 'Wušmórnjene stawizny',
-'revdelete-content' => 'wobsah',
-'revdelete-summary' => 'zjeće wobdźěłać',
-'revdelete-uname' => 'wužiwarske mjeno',
-'revdelete-restricted' => 'na administratorow nałožene wobmjezowanja',
-'revdelete-unrestricted' => 'Wobmjezowanja za administratorow wotstronjene',
-'revdelete-hid' => '$1 schowany',
-'revdelete-unhid' => '$1 pokazany',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|wersija|wersiji|wersije|wersijow}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|podawk|podawkaj|podawki|podawkow}}',
'revdelete-hide-current' => 'Zmylk při chowanju zapiska wot $2, $1: to je aktualna wersija.
Njeda so schować.',
'revdelete-show-no-access' => 'Zmylk při pokazowanju zapiska wot $2, $1: tutón zapisk bu jako "wobmjezowany" markěrowany.
@@ -1142,12 +1161,14 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
'prefs-rc' => 'Aktualne změny',
'prefs-watchlist' => 'Wobkedźbowanki',
'prefs-watchlist-days' => 'LiÄba dnjow, kotrež maja so we wobkedźbowankach pokazać:',
-'prefs-watchlist-days-max' => 'Maksimalnje 7 dnjow',
+'prefs-watchlist-days-max' => 'Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}}',
'prefs-watchlist-edits' => 'LiÄba zmÄ›now, kotrež maja so we wobkedźbowankach pokazać:',
'prefs-watchlist-edits-max' => 'Maksimalna liÄba: 1000',
'prefs-watchlist-token' => 'Marka wobkedźbowankow:',
'prefs-misc' => 'WÅ¡elake nastajenja',
'prefs-resetpass' => 'Hesło změnić',
+'prefs-changeemail' => 'E-mejl změnić',
+'prefs-setemail' => 'E-mejlowu adresu postajić',
'prefs-email' => 'E-mejlowe opcije',
'prefs-rendering' => 'Napohlad',
'saveprefs' => 'Składować',
@@ -1207,6 +1228,7 @@ Móžeš tutu stronu wužiwać, zo by swoje nastajenja na standardne hódnoty sy
'yourrealname' => 'Woprawdźite mjeno:',
'yourlanguage' => 'RÄ›Ä:',
'yourvariant' => 'RÄ›Äna warianta:',
+'prefs-help-variant' => 'Twoja preferowana warianta abo ortografija, w kotrejž so wikistrony maja zwobraznić.',
'yournick' => 'Podpis:',
'prefs-help-signature' => 'Komentary na diskusijnch stronach mÄ›li so pÅ™ez "<nowiki>~~~~</nowiki>" podpisać, kotrež so do twojeje signatury a Äasoweho koÅ‚ka konwertuje.',
'badsig' => 'Njepłaćiwa signatura, prošu HTML přepruwować.',
@@ -1246,7 +1268,7 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'userrights-lookup-user' => 'Wužiwarske skupiny zrjadować',
'userrights-user-editname' => 'Wužiwarske mjeno:',
'editusergroup' => 'Wužiwarske skupiny wobdźěłać',
-'editinguser' => "Měnja so wužiwarske prawa wot wužiwarja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Změni wužiwarske prawa wužiwarja '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Wužiwarske skupiny wobdźěłać',
'saveusergroups' => 'Wužiwarske skupiny składować',
'userrights-groupsmember' => 'Čłon wot:',
@@ -1340,13 +1362,13 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'right-autopatrol' => 'Změny awtomatisce jako dohladowane markěrować dać',
'right-patrolmarks' => 'Kontrolowe marki w najnowšich změnach wobhladać',
'right-unwatchedpages' => 'Lisćinu njewobkedźbowanych stronow wobhladać',
-'right-trackback' => 'Trackback pósłać',
'right-mergehistory' => 'Stawizny stronow zjednoćić',
'right-userrights' => 'Wužiwarske prawa wobdźěłać',
'right-userrights-interwiki' => 'Wužiwarske prawa wužiwarjow druhich wikijow wobdźěłać',
'right-siteadmin' => 'Datowu banku zawrěć abo wotewrić',
'right-override-export-depth' => 'Strony inkluziwnje wotkazanych stronow haÄ do hÅ‚ubokosće 5 eksportować',
'right-sendemail' => 'Druhim wužiwarjam e-mejl pósłać',
+'right-passwordreset' => 'E-mejlki za wróćostajenje hesłow sej wobhladać',
# User rights log
'rightslog' => 'Protokol zrjadowanja wužiwarskich prawow',
@@ -1380,16 +1402,17 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'action-suppressionlog' => 'Tutón priwatny protokol wobhladać',
'action-block' => 'Wobdźěłanju přez wužiwarja zadźěwać',
'action-protect' => 'škitowe runiny za tutu stronu změnić',
+'action-rollback' => 'Změny poslednjeho wužiwarja, kiž je wěstu stronu wobdźěłał, spěšnje wróćo stajić',
'action-import' => 'Tutu stronu z druheho wikija importować',
'action-importupload' => 'Tutu stronu z datajoweho nahraća importować',
'action-patrol' => 'Změny druhich wužiwarjiw jako dohladowane markować',
'action-autopatrol' => 'twoju změnu jako dohladowanu markować dać',
'action-unwatchedpages' => 'lisćinu njewobkedźbowanych stronow zwobraznić',
-'action-trackback' => 'Trackback pósłać',
'action-mergehistory' => 'stawizny tuteje strony zjednoćić',
'action-userrights' => 'wšě wužiwarske prawa wobdźěłać',
'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ć',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
@@ -1422,6 +1445,7 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'rc_categories' => 'Jenož kategorije (dźělene z "|")',
'rc_categories_any' => 'wšě',
'rc-change-size' => '$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}} po změnje',
'newsectionsummary' => 'Nowy wotrězk: /* $1 */',
'rc-enhanced-expand' => 'Podrobnosće pokazać (wužaduje sej JavaScript)',
'rc-enhanced-hide' => 'Podrobnosće schować',
@@ -1475,6 +1499,7 @@ Hlej [[Special:NewFiles|galeriju nowych datajow]] za wizuelny přehlad.',
'ignorewarnings' => 'Wšě warnowanja ignorować',
'minlength1' => 'Datajowe mjena dyrbja znajmjeńša jedyn pismik dołhe być.',
'illegalfilename' => 'Mjeno dataje „$1†wobsahuje znamješka, kotrež w titlach stronow dowolene njejsu. Prošu přemjenuj dataju a spytaj ju znowa nahrać.',
+'filename-toolong' => 'Datajowe mjena njesmÄ›dźa dlěše haÄ 240 bajtow być.',
'badfilename' => 'Mjeno dataje bu do „$1†změnjene.',
'filetype-mime-mismatch' => 'Datajowy sufiks ".$1" njewotpowěduje MIME-typej dataje ($2).',
'filetype-badmime' => 'Dataje typa MIME „$1†njesmědźa so nahrać.',
@@ -1579,6 +1604,41 @@ $1',
'upload-unknown-size' => 'Njeznata wulkosć',
'upload-http-error' => 'HTTP-zmylk je wustupił: $1',
+# File backend
+'backend-fail-stream' => 'Dataja $1 njeda so přenjesć.',
+'backend-fail-backup' => 'Dataja $1 njeda so zawěsćić.',
+'backend-fail-notexists' => 'Dataja $1 njeeksistuje.',
+'backend-fail-hashes' => 'Sypanske hódnoty dataje njedadźa so za přirunanje wotwołać.',
+'backend-fail-notsame' => 'Dataja, kotraž identiska njeje, hižo pola $1 eksistuje.',
+'backend-fail-invalidpath' => '$1 płaćiwy pućik za składowanje njeje.',
+'backend-fail-delete' => 'Dataja $1 njeda so zhašeć.',
+'backend-fail-alreadyexists' => 'Dataja $1 hižo eksistuje.',
+'backend-fail-store' => 'Dataja $1 njeda so pod $2 składować',
+'backend-fail-copy' => 'Dataja $1 njeda so do $2 kopěrować',
+'backend-fail-move' => 'Dataja $1 njeda so do $2 přesunyć',
+'backend-fail-opentemp' => 'Temporerna dataja njeda so woÄinić.',
+'backend-fail-writetemp' => 'Njeda so do temporerneje dataje pisać.',
+'backend-fail-closetemp' => 'Temporerna dataja njeda so zaÄinić.',
+'backend-fail-read' => 'Dataja $1 njeda so Äitać',
+'backend-fail-create' => 'Dataja $1 njeda so wutworić',
+'backend-fail-readonly' => 'SkÅ‚adowanski backend "$1" da so tuchwilu jenož Äitać. PÅ™iÄina je byÅ‚a: "$2"',
+'backend-fail-synced' => 'Dataja "$1" je znutřka interneho składowanskeho backenda w inkonsistentnym stawje',
+'backend-fail-connect' => 'Zwisk z datajowym składowanskim backendom "$1" móžno njeje.',
+'backend-fail-internal' => 'W składowanskim backendźe "$1" je njeznaty zmylk wustupił.',
+'backend-fail-contenttype' => 'Wobsahowy typ dataje, kotraž ma so na "$1" składować, njeda so zwěsćić.',
+'backend-fail-batchsize' => 'Staplowa dataja, kotraž {{PLURAL:$1|jednu operaciju|$1 operaciji|$1 operacije|$1 operacijow}} wobsahuje, je so na składowanski backend pósłała; limit je $2 {{PLURAL:$2|operaciju|operaciji|operacije|operacijow}} .',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" njeda so wotewrić; njeje zawrjeny.',
+'lockmanager-fail-closelock' => 'Zawrjenska dataja njeda so za "$1" zaÄinić.',
+'lockmanager-fail-deletelock' => 'Zawrjenska dataja njeda so za "$1" zhašeć.',
+'lockmanager-fail-acquirelock' => 'Zawěra za "$1" njeda so dóstać.',
+'lockmanager-fail-openlock' => 'Zawrjenska dataja njeda so za "$1" woÄinić.',
+'lockmanager-fail-releaselock' => 'Zawěra za "$1" njeda so dopušćić.',
+'lockmanager-fail-db-bucket' => 'W zběrniku $1 njeda so dosć zawrjenskich datowych bankow kontaktować',
+'lockmanager-fail-db-release' => 'Zawěry na datowu banku $1 njedadźa so dopušćić',
+'lockmanager-fail-svr-release' => 'Zawěry na serwer $1 njedadźa so dopušćić',
+
# ZipDirectoryReader
'zip-file-open-error' => 'PÅ™i woÄinjenju dataje za ZIP-pÅ™epruwowanje je zmylk wustupiÅ‚.',
'zip-wrong-format' => 'Podata dataja ZIP-dataja njebÄ›.',
@@ -1595,6 +1655,7 @@ Tohodla njeda so jeje wěstota porjadnje přepruwować.',
'uploadstash-badtoken' => 'Wuwjedźenje teje akcije je so njeporadźiło, snano dokelž twoje wobdźěłowanske daty su spadnjene. Spytaj hišće raz.',
'uploadstash-errclear' => 'Wotstronjenje datajow je so njeporadźiło.',
'uploadstash-refresh' => 'Lisćinu datajow aktualizować',
+'invalid-chunk-offset' => 'Njepłaćiwy startowy dypk',
# img_auth script messages
'img-auth-accessdenied' => 'Přistup wotpokazany',
@@ -1698,23 +1759,24 @@ Slědowaca lisćina pokazuje jenož {{PLURAL:$1|prěni wotkaz strony|prěnjej $1
'filerevert-badversion' => 'W zapodatym Äasu žana wersija dataje njeje.',
# File deletion
-'filedelete' => '„$1“ wušmórnyć',
-'filedelete-legend' => 'Wušmórnju dataju',
-'filedelete-intro' => "Šmórnješ dataju '''[[Media:$1|$1]]''' zhromadnje z jeje cyłymi stawiznami.",
-'filedelete-intro-old' => "Wušmórnješ wersiju '''[[Media:$1|$1]]''' wot [$4 wot $2, $3 hodź].",
-'filedelete-comment' => 'PÅ™iÄina:',
-'filedelete-submit' => 'Wušmórnyć',
-'filedelete-success' => "Strona '''„$1“''' bu wušmórnjena.",
-'filedelete-success-old' => "Wersija '''[[Media:$1|$1]]''' wot $2, $3 hodź. bu zniÄena.",
-'filedelete-nofile' => "'''„$1“''' njeeksistuje.",
-'filedelete-nofile-old' => "Njeje žana archiwowana wersija '''$1''' z podatymi atributami.",
-'filedelete-otherreason' => 'Druha/pÅ™idatna pÅ™iÄina:',
-'filedelete-reason-otherlist' => 'Druha pÅ™iÄina',
-'filedelete-reason-dropdown' => '*PowÅ¡itkowne pÅ™iÄina za wuÅ¡mórnjenja
+'filedelete' => '„$1“ wušmórnyć',
+'filedelete-legend' => 'Wušmórnju dataju',
+'filedelete-intro' => "Šmórnješ dataju '''[[Media:$1|$1]]''' zhromadnje z jeje cyłymi stawiznami.",
+'filedelete-intro-old' => "Wušmórnješ wersiju '''[[Media:$1|$1]]''' wot [$4 wot $2, $3 hodź].",
+'filedelete-comment' => 'PÅ™iÄina:',
+'filedelete-submit' => 'Wušmórnyć',
+'filedelete-success' => "Strona '''„$1“''' bu wušmórnjena.",
+'filedelete-success-old' => "Wersija '''[[Media:$1|$1]]''' wot $2, $3 hodź. bu zniÄena.",
+'filedelete-nofile' => "'''„$1“''' njeeksistuje.",
+'filedelete-nofile-old' => "Njeje žana archiwowana wersija '''$1''' z podatymi atributami.",
+'filedelete-otherreason' => 'Druha/pÅ™idatna pÅ™iÄina:',
+'filedelete-reason-otherlist' => 'Druha pÅ™iÄina',
+'filedelete-reason-dropdown' => '*PowÅ¡itkowne pÅ™iÄina za wuÅ¡mórnjenja
** Zranjenje awtorksich prawow
** Dwójna dataja',
-'filedelete-edit-reasonlist' => 'PÅ™iÄiny za wuÅ¡mórnjenje wobdźěłać',
-'filedelete-maintenance' => 'Wušmórnjenje a wobnowjenje datajow stej wothladowanja dla nachilu znjemóžnjenej.',
+'filedelete-edit-reasonlist' => 'PÅ™iÄiny za wuÅ¡mórnjenje wobdźěłać',
+'filedelete-maintenance' => 'Wušmórnjenje a wobnowjenje datajow stej wothladowanja dla nachilu znjemóžnjenej.',
+'filedelete-maintenance-title' => 'Dataja njeda so zhašeć',
# MIME search
'mimesearch' => 'Pytanje za typom MIME',
@@ -1808,6 +1870,8 @@ Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž t
'wantedpages' => 'Požadane strony',
'wantedpages-badtitle' => 'Njepłaćiwy titul we wuslědku: $1',
'wantedfiles' => 'Požadane dataje',
+'wantedfiletext-cat' => 'SlÄ›dowace dataje so wužiwaja, ale njeeksistuju. Dataje z cuzych repozitorijow hodźa so nalistować, byrnjež eksistowali. Tajke wopaÄne pozitiwy su <del>pÅ™eÅ¡mórnjene</del>. Nimo toho so strony w [[:$1]] nalistuja, kotrež dataje zasadźuja, kotrež njeeksistuja.',
+'wantedfiletext-nocat' => 'SlÄ›dowace dataje so wužiwaja, ale njeeksistuja. Dataje z cuzych repozitorijow hodźa so nalistować, byrnjež eksistowali. Tajke wopaÄne pozitiwy su <del>pÅ™eÅ¡mórnjene</del>.',
'wantedtemplates' => 'Falowace předłohi',
'mostlinked' => 'Z najwjace stronami zwjazane strony',
'mostlinkedcategories' => 'Z najwjace stronami zwjazane kategorije',
@@ -1816,6 +1880,7 @@ Kóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž t
'mostimages' => 'Z najwjace stronami zwjazane dataje',
'mostrevisions' => 'Nastawki z najwjace wersijemi',
'prefixindex' => 'WÅ¡Ä› strony z prefiksom',
+'prefixindex-namespace' => 'WÅ¡Ä› strony z prefiksom (mjenowy rum $1)',
'shortpages' => 'Krótke nastawki',
'longpages' => 'Dołhe nastawki',
'deadendpages' => 'Nastawki bjez wotkazow',
@@ -1924,12 +1989,8 @@ Podpěrowane protokole: <tt>$1</tt> (prošu njepodaj je w swojim pytanje).',
'activeusers-noresult' => 'Žani wužiwarjo namakani.',
# Special:Log/newusers
-'newuserlogpage' => 'Protokol nowych wužiwarjow',
-'newuserlogpagetext' => 'To je protokol wutworjenja nowych wužiwarskich kontow.',
-'newuserlog-byemail' => 'Hesło z e-mejlku pósłane',
-'newuserlog-create-entry' => 'Nowy wužiwar',
-'newuserlog-create2-entry' => 'Wutwori nowe konto za wužiwarja $1',
-'newuserlog-autocreate-entry' => 'Wužiwarske konto bu awtomatisce wutworjene.',
+'newuserlogpage' => 'Protokol nowych wužiwarjow',
+'newuserlogpagetext' => 'To je protokol wutworjenja nowych wužiwarskich kontow.',
# Special:ListGroupRights
'listgrouprights' => 'Prawa wužiwarskeje skupiny',
@@ -1957,7 +2018,7 @@ Podpěrowane protokole: <tt>$1</tt> (prošu njepodaj je w swojim pytanje).',
'emailpagetext' => 'Móžeš slědowacy formular wužiwać, zo by tutomu wužiwarjej e-mejlku pósłał.
E-mejlowa adresa, kotruž sy w [[Special:Preferences|swojich wužiwarskich nastajenjach]] zapodał, zjewi so jako adresa "Wot" e-mejlki, tak zo přijimowar móže ći direktnje wotmołwić.',
'usermailererror' => 'E-mejlowy objekt je zmylk wróćił:',
-'defemailsubject' => 'Powěsć z {{grammar:genitiw|{{SITENAME}}}}',
+'defemailsubject' => '{{SITENAME}} - e-mejlka wot wužiwarja "$1"',
'usermaildisabled' => 'Wužiwarska e-mejl znjemóžnjena',
'usermaildisabledtext' => 'Njemóžeš na tutym wikiju druhim wužiwarjam e-mejl pósłać',
'noemailtitle' => 'Žana e-mejlowa adresa podata',
@@ -2013,7 +2074,7 @@ Jeli chceš stronu pozdźišo ze swojich wobkedźbowankow wotstronić, klikń na
'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
'watchlistcontains' => 'Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.',
'iteminvalidname' => 'Problem ze zapiskom „$1“, njepłaćiwe mjeno.',
-'wlnote' => 'Deleka {{PLURAL:$1|je poslednja|stej poslednjej|su poslednje|su poslednje}} $1 {{PLURAL:$1|změna|změnje|změny|změnow}} za poslednje <b>$2</b> hodź.',
+'wlnote' => "Deleka {{PLURAL:$1|je '''1''' změna|stej poslednjej '''$1''' změnje|su poslednje '''$1''' změny|je poslednich '''$1''' změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje '''$2''' hodźinje|poslednje '''$2''' hodźiny|poslednje '''$2''' hodźin}}, staw : $3, $4.",
'wlshowlast' => 'Poslednje $1 hodź. - $2 dnjow - $3 pokazać',
'watchlist-options' => 'Opcije wobkedźbowankow',
@@ -2079,8 +2140,6 @@ ProÅ¡u potwjerdź, zo maÅ¡ wotpohlad to Äinić, zo rozumiÅ¡ sćěwki a zo to wo
'actioncomplete' => 'DokónÄene',
'actionfailed' => 'Akcija je so njeporadźiła',
'deletedtext' => 'Strona „$1†bu wušmórnjena. Hlej $2 za lisćinu aktualnych wušmórnjenjow.',
-'deletedarticle' => 'je stronu [[$1]] wušmórnył.',
-'suppressedarticle' => '"[[$1]]" potłóÄeny',
'dellogpage' => 'Protokol wušmórnjenjow',
'dellogpagetext' => 'Deleka je lisćina najaktualnišich wušmórnjenjow.',
'deletionlog' => 'Protokol wušmórnjenjow',
@@ -2123,7 +2182,10 @@ Hlej [[Special:ProtectedPages|lisćinu škitanych stronow]] za lisćinu tuchwilu
'unprotectedarticle' => 'je škit za [[$1]] wotstronił',
'movedarticleprotection' => 'škitowe nastajenja z "[[$2]]" do "[[$1]]" přesunjene',
'protect-title' => 'Stronu „$1†škitać',
+'protect-title-notallowed' => 'Škitny stopjeń za "$1" pokazać',
'prot_1movedto2' => 'je [[$1]] pod hesło [[$2]] přesunył',
+'protect-badnamespace-title' => 'Nješkitajomny mjenowy rum',
+'protect-badnamespace-text' => 'Strony w tutym mjenowym rumje njehodźa so škitać.',
'protect-legend' => 'Škit wobkrućić',
'protectcomment' => 'PÅ™iÄina:',
'protectexpiry' => 'ÄŒas Å¡kita:',
@@ -2141,6 +2203,7 @@ Hlej [[Special:ProtectedPages|lisćinu škitanych stronow]] za lisćinu tuchwilu
'protect-level-sysop' => 'jenož administratorojo',
'protect-summary-cascade' => 'kaskadowacy',
'protect-expiring' => 'spadnje $1 (UTC)',
+'protect-expiring-local' => 'pÅ‚aćiwy haÄ do $1',
'protect-expiry-indefinite' => 'njewobmjezowany',
'protect-cascade' => 'Kaskadowacy škit – wšě w tutej stronje zapřijate strony so škituja.',
'protect-cantedit' => 'Njemóžeš škitowe runiny tuteje strony změnić, dokelž nimaš dowolnosć, zo by ju wobdźěłał.',
@@ -2197,7 +2260,6 @@ W tutym padźe dyrbiÅ¡ najnowÅ¡u wuÅ¡mórnjenu wersiju znjemóžnić abo pokazaÄ
'undeletereset' => 'Cofnyć',
'undeleteinvert' => 'Wuběr wobroćić',
'undeletecomment' => 'PÅ™iÄina:',
-'undeletedarticle' => 'je „[[$1]]†wobnowił.',
'undeletedrevisions' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} a $2 {{PLURAL:$2|dataja|dataji|dataje|datajow}} {{PLURAL:$2|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}',
'undeletedfiles' => '$1 {{PLURAL:$1|dataja|dataji|dataje|datajow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}.',
@@ -2206,6 +2268,7 @@ W tutym padźe dyrbiÅ¡ najnowÅ¡u wuÅ¡mórnjenu wersiju znjemóžnić abo pokazaÄ
Hlej [[Special:Log/delete|protokol]] za lisćinu aktualnych wušmórnjenjow a wobnowjenjow.",
'undelete-header' => 'Hlej [[Special:Log/delete|protokol wušmórnjenjow]] za njedawno wušmórnjene strony.',
+'undelete-search-title' => 'Wušmórnjene strony pytać',
'undelete-search-box' => 'Wušmórnjene strony pytać',
'undelete-search-prefix' => 'Strony pokazać, kotrež zapoÄinaja so z:',
'undelete-search-submit' => 'Pytać',
@@ -2214,6 +2277,7 @@ Hlej [[Special:Log/delete|protokol]] za lisćinu aktualnych wušmórnjenjow a wo
'undelete-bad-store-key' => 'Datajowa wersija z Äasowym koÅ‚kom $1 njeda so wobnowić: dataja pÅ™ed zniÄenjom hižo njeeksistowaÅ¡e.',
'undelete-cleanup-error' => 'Zmylk při wušmórnjenju njewužita wersija $1 z archiwa.',
'undelete-missing-filearchive' => 'Dataja z archiwowym ID $1 njeda so wobnowić, dokelž w datowej bance njeje. Snano bu wona hižo wobnowjena.',
+'undelete-error' => 'Zmylk při wušmórnjenju strony',
'undelete-error-short' => 'Zmylk při wobnowjenju dataje $1',
'undelete-error-long' => 'Buchu zmylki při wobnowjenju dataje zwěsćene:
@@ -2333,6 +2397,7 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
'blocklist-userblocks' => 'Kontowe blokowanja schować',
'blocklist-tempblocks' => 'Nachwilne blokowanja schować',
'blocklist-addressblocks' => 'Blokowanja jednotliwych IP-adresow schować',
+'blocklist-rangeblocks' => 'Blokowanja wobłukow schować',
'blocklist-timestamp' => 'Časowy kołk',
'blocklist-target' => 'Cil',
'blocklist-expiry' => 'Spadnje',
@@ -2355,6 +2420,7 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
'unblocklink' => 'blokowanje zběhnyć',
'change-blocklink' => 'Blokowanje změnić',
'contribslink' => 'přinoški',
+'emaillink' => 'E-mejl pósłać',
'autoblocker' => 'Awtomatiske blokowanje, dokelž twoja IP-adresa bu njedawno wot wužiwarja „[[User:$1|$1]]†wužita. PÅ™iÄina, podata za blokowanje $1, je: "$2"',
'blocklogpage' => 'Protokol zablokowanjow',
'blocklog-showlog' => 'Tutón wužiwar bu prjedy zablokowany. Protokol blokowanjow so deleka jako referenca podawa:',
@@ -2464,9 +2530,6 @@ W tutych padach dyrbiš stronu manuelnje přesunyć abo zaměšeć, jeli sej to
'movepage-page-moved' => 'Strona $1 bu do $2 přesunjena.',
'movepage-page-unmoved' => 'Strona $1 njeda so do $2 přesunyć.',
'movepage-max-pages' => 'Maksimalna liÄba $1 {{PLURAL:$1|strony|stronow|stronow|stronow}} bu pÅ™esunjena, dalÅ¡e strony so awtomatisce njepÅ™esunu.',
-'1movedto2' => 'je [[$1]] pod hesło [[$2]] přesunył',
-'1movedto2_redir' => 'je [[$1]] pod hesło [[$2]] přesunył a při tym daleposrědkowanje přepisał.',
-'move-redirect-suppressed' => 'daleposrÄ›dkowanje podtłóÄene',
'movelogpage' => 'Protokol přesunjenjow',
'movelogpagetext' => 'Deleka je lisćina wšěch přesunjenych stronow.',
'movesubpage' => '{{PLURAL:$1|Podstrona|Podstronje|Podstrony|Podstronow}}',
@@ -2479,7 +2542,7 @@ W tutych padach dyrbiš stronu manuelnje přesunyć abo zaměšeć, jeli sej to
Cilowa strona „[[:$1]]†hižo eksistuje. Chceš ju wušmórnyć, zo by so přesunjenje zmóžniło?',
'delete_and_move_confirm' => 'Haj, stronu wušmórnyć.',
-'delete_and_move_reason' => 'Strona bu wušmórnjena, zo by so přesunjenje zmóžniło.',
+'delete_and_move_reason' => 'Wušmórnjena, zo by so rum za přesunjenje z "[[$1]]" wutworił.',
'selfmove' => 'Žórłowy a cilowy titl stej samsnej; strona njehodźi so na sebje samu přesunyć.',
'immobile-source-namespace' => 'njemóže strony w mjenowym rumje "$1" přesunyć',
'immobile-target-namespace' => 'njemóže strono do mjenoweho ruma "$1" přesunyć',
@@ -2508,9 +2571,11 @@ Prošu wubjer druhe mjeno.',
Zo by strony eksportowaÅ‚, zapodaj title deleka do tekstoweho pola, jedyn titul na linku, a wubjer, haÄ chceÅ¡ aktualnu wersiju kaž tež stare wersije z linkami stawiznow strony abo jenož aktualnu wersiju z informacijemi wo poslednjej zmÄ›nje eksportować.
W poslednim padźe móžeÅ¡ tež wotkaz wužiwać, na pÅ™. „[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]†za stronu „[[{{MediaWiki:Mainpage}}]]â€.',
+'exportall' => 'Wšě strony eksportować',
'exportcuronly' => 'Jenož aktualnu wersiju zapřijeć, nic dospołne stawizny',
'exportnohistory' => '----
<b>Kedźbu:</b> Eksport cyÅ‚ych stawiznow pÅ™ez tutón formular bu z pÅ™iÄin wukonitosće serwera znjemóžnjeny.',
+'exportlistauthors' => 'Za kóždu stronu lisćinu wobdźěłarjow zapřijeć',
'export-submit' => 'Eksportować',
'export-addcattext' => 'Strony z kategorije dodawać:',
'export-addcat' => 'Dodawać',
@@ -2542,6 +2607,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'thumbnail_error' => 'Zmylk při wutworjenju miniaturki: $1',
'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ć',
+'thumbnail-dest-create' => 'Miniaturny wobrazk njeda so na cilowym městnje składować',
'thumbnail_invalid_params' => 'Njepłaćiwe parametry miniaturki',
'thumbnail_dest_directory' => 'Njemóžno cilowy zapis wutworić.',
'thumbnail_image-type' => 'Wobrazowy typ so njepodpěruje',
@@ -2583,6 +2650,11 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'import-upload' => 'XML-daty nahrać',
'import-token-mismatch' => 'Strata posedźenskich datow. Prošu spytaj hišće raz.',
'import-invalid-interwiki' => 'Njeje móžno z podateho wikija importować.',
+'import-error-edit' => 'Strona "$1" so njeimportuje, dokelž nimaš prawo ju wobdźěłać.',
+'import-error-create' => 'Strona "$1" so njeimportuje, dokelž nimaš prawo ju wutworić.',
+'import-error-interwiki' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je za eksterne wotkazowanje (interwiki) wuměnjene.',
+'import-error-special' => 'Strona "$1" so njeimportuje, dokelž k wosebitemu mjenowemu rumej słuša, kotryž strony njedowola.',
+'import-error-invalid' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je njepłaćiwe.',
# Import log
'importlogpage' => 'Protokol importow',
@@ -2592,72 +2664,85 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'import-logentry-interwiki' => 'je stronu $1 z druheho wikija přenjesł',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} z $2 {{PLURAL:$1|importowana|importowanej|importowane|importowane}}',
+# JavaScriptTest
+'javascripttest' => 'JavaScriptowy test',
+'javascripttest-disabled' => 'Tuta funkcija je znjemóžnjena.',
+'javascripttest-title' => 'Testy $1 so přewjedu',
+'javascripttest-pagetext-noframework' => 'Tuta strona je za přewjedźenje javascriptowych testow přewostajena.',
+'javascripttest-pagetext-unknownframework' => 'Njeznaty wobłuk "$1".',
+'javascripttest-pagetext-frameworks' => 'Prošu wubjer jedyn ze slědowacych testowanskich wobłukow: $1',
+'javascripttest-pagetext-skins' => 'Wubjer drastu za přewjedźenje testow:',
+'javascripttest-qunit-intro' => 'Hlej [$1 testowansku dokumentaciju] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit Test Suite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Twoja wužiwarska strona',
-'tooltip-pt-anonuserpage' => 'Wužiwarska strona IP-adresy, z kotrejž tuchwilu dźěłaš',
-'tooltip-pt-mytalk' => 'Twoja diskusijna strona',
-'tooltip-pt-anontalk' => 'Diskusija wo změnach z tuteje IP-adresy',
-'tooltip-pt-preferences' => 'moje nastajenja',
-'tooltip-pt-watchlist' => 'lisćina stronow, kotrež wobkedźbuješ',
-'tooltip-pt-mycontris' => 'Lisćina twojich přinoškow',
-'tooltip-pt-login' => 'Móžeš so woměrje přizjewić, to pak zawjazowace njeje.',
-'tooltip-pt-anonlogin' => 'Móžeš so woměrje přizjewić, to pak zawjazowace njeje.',
-'tooltip-pt-logout' => 'so wotzjewić',
-'tooltip-ca-talk' => 'diskusija wo stronje',
-'tooltip-ca-edit' => 'MóžeÅ¡ stronu wobdźěłać. ProÅ¡u wužij tłóÄku „PÅ™ehlad†do skÅ‚adowanja.',
-'tooltip-ca-addsection' => 'Nowy wotrÄ›zk zapoÄeć',
-'tooltip-ca-viewsource' => 'Strona je škitana. Móžeš pak jeje žórło wobhladać.',
-'tooltip-ca-history' => 'stawizny tuteje strony',
-'tooltip-ca-protect' => 'stronu škitać',
-'tooltip-ca-unprotect' => 'Tutu stronu hižo nješkitać',
-'tooltip-ca-delete' => 'stronu wušmórnyć',
-'tooltip-ca-undelete' => 'zmÄ›ny wobnowić, kotrež buchu do wuÅ¡mórnjenja sÄinjene',
-'tooltip-ca-move' => 'stronu přesunyć',
-'tooltip-ca-watch' => 'stronu wobkedźbowankam přidać',
-'tooltip-ca-unwatch' => 'stronu z wobkedźbowankow wotstronić',
-'tooltip-search' => '{{GRAMMAR:akuzatiw|{{SITENAME}}}} přepytać',
-'tooltip-search-go' => 'Dźi k stronje z runje tutym mjenom, jeli eksistuje',
-'tooltip-search-fulltext' => 'Strony za tutym tekstom přepytać',
-'tooltip-p-logo' => 'hłowna strona',
-'tooltip-n-mainpage' => 'hłownu stronu pokazać',
-'tooltip-n-mainpage-description' => 'Hłownu stronu wopytać',
-'tooltip-n-portal' => 'wo projekće, Å¡to móžeÅ¡ Äinić, hdźe móžeÅ¡ informacije namakać',
-'tooltip-n-currentevents' => 'pozadkowe informacije wo aktualnych podawkach pytać',
-'tooltip-n-recentchanges' => 'lisćina aktualnych změnow w tutym wikiju',
-'tooltip-n-randompage' => 'připadny nastawk wopytać',
-'tooltip-n-help' => 'pomocna strona',
-'tooltip-t-whatlinkshere' => 'lisćina wšěch stronow, kotrež sem wotkazuja',
-'tooltip-t-recentchangeslinked' => 'aktualne změny w stronach, na kotrež tuta strona wotkazuje',
-'tooltip-feed-rss' => 'RSS-feed za tutu stronu',
-'tooltip-feed-atom' => 'Atom-feed za tutu stronu',
-'tooltip-t-contributions' => 'přinoški tutoho wužiwarja wobhladać',
-'tooltip-t-emailuser' => 'wužiwarjej mejlku pósłać',
-'tooltip-t-upload' => 'Dataje nahrać',
-'tooltip-t-specialpages' => 'lisćina wšěch specialnych stronow',
-'tooltip-t-print' => 'ćišćowy napohlad tuteje strony',
-'tooltip-t-permalink' => 'trajny wotkaz k tutej wersiji strony',
-'tooltip-ca-nstab-main' => 'stronu wobhladać',
-'tooltip-ca-nstab-user' => 'wužiwarsku stronu wobhladać',
-'tooltip-ca-nstab-media' => 'datajowu stronu wobhladać',
-'tooltip-ca-nstab-special' => 'To je specialna strona. Njemóžeš ju wobdźěłać.',
-'tooltip-ca-nstab-project' => 'projektowu stronu wobhladać',
-'tooltip-ca-nstab-image' => 'Datajowu stronu pokazać',
-'tooltip-ca-nstab-mediawiki' => 'systemowu zdźělenku wobhladać',
-'tooltip-ca-nstab-template' => 'předłohu wobhladać',
-'tooltip-ca-nstab-help' => 'pomocnu stronu wobhladać',
-'tooltip-ca-nstab-category' => 'kategorijnu stronu wobhladać',
-'tooltip-minoredit' => 'jako snadnu změnu woznamjenić',
-'tooltip-save' => 'změny składować',
-'tooltip-preview' => 'twoje zmÄ›ny pÅ™ehladnyć, proÅ¡u ÄiÅ„ to do skÅ‚adowanja!',
-'tooltip-diff' => 'zmÄ›ny pokazać, kotrež sy w teksće ÄiniÅ‚',
-'tooltip-compareselectedversions' => 'rozdźěle mjez wubranymaj wersijomaj tuteje strony pokazać',
-'tooltip-watch' => 'tutu stronu wobkedźbowankam přidać',
-'tooltip-recreate' => 'stronu znowa wutworić, haÄrunjež bu wumÅ¡mórnjena',
-'tooltip-upload' => 'nahraće startować',
-'tooltip-rollback' => '"Rollback" anuluje změny strony poslednjeho sobudźěłaćerja přez jedne kliknjenje.',
-'tooltip-undo' => 'anuluje tutu zmÄ›nu a woÄinja wobdźěłowanski formular w pÅ™ehladowym modusu. Zmóžnja pÅ™iÄinu w zjeću pÅ™idać.',
-'tooltip-preferences-save' => 'Nastajenja składować',
-'tooltip-summary' => 'Zapodaj krótke zjeće',
+'tooltip-pt-userpage' => 'Twoja wužiwarska strona',
+'tooltip-pt-anonuserpage' => 'Wužiwarska strona IP-adresy, z kotrejž tuchwilu dźěłaš',
+'tooltip-pt-mytalk' => 'Twoja diskusijna strona',
+'tooltip-pt-anontalk' => 'Diskusija wo změnach z tuteje IP-adresy',
+'tooltip-pt-preferences' => 'moje nastajenja',
+'tooltip-pt-watchlist' => 'lisćina stronow, kotrež wobkedźbuješ',
+'tooltip-pt-mycontris' => 'Lisćina twojich přinoškow',
+'tooltip-pt-login' => 'Móžeš so woměrje přizjewić, to pak zawjazowace njeje.',
+'tooltip-pt-anonlogin' => 'Móžeš so woměrje přizjewić, to pak zawjazowace njeje.',
+'tooltip-pt-logout' => 'so wotzjewić',
+'tooltip-ca-talk' => 'diskusija wo stronje',
+'tooltip-ca-edit' => 'MóžeÅ¡ stronu wobdźěłać. ProÅ¡u wužij tłóÄku „PÅ™ehlad†do skÅ‚adowanja.',
+'tooltip-ca-addsection' => 'Nowy wotrÄ›zk zapoÄeć',
+'tooltip-ca-viewsource' => 'Strona je škitana. Móžeš pak jeje žórło wobhladać.',
+'tooltip-ca-history' => 'stawizny tuteje strony',
+'tooltip-ca-protect' => 'stronu škitać',
+'tooltip-ca-unprotect' => 'Tutu stronu hižo nješkitać',
+'tooltip-ca-delete' => 'stronu wušmórnyć',
+'tooltip-ca-undelete' => 'zmÄ›ny wobnowić, kotrež buchu do wuÅ¡mórnjenja sÄinjene',
+'tooltip-ca-move' => 'stronu přesunyć',
+'tooltip-ca-watch' => 'stronu wobkedźbowankam přidać',
+'tooltip-ca-unwatch' => 'stronu z wobkedźbowankow wotstronić',
+'tooltip-search' => '{{GRAMMAR:akuzatiw|{{SITENAME}}}} přepytać',
+'tooltip-search-go' => 'Dźi k stronje z runje tutym mjenom, jeli eksistuje',
+'tooltip-search-fulltext' => 'Strony za tutym tekstom přepytać',
+'tooltip-p-logo' => 'hłowna strona',
+'tooltip-n-mainpage' => 'hłownu stronu pokazać',
+'tooltip-n-mainpage-description' => 'Hłownu stronu wopytać',
+'tooltip-n-portal' => 'wo projekće, Å¡to móžeÅ¡ Äinić, hdźe móžeÅ¡ informacije namakać',
+'tooltip-n-currentevents' => 'pozadkowe informacije wo aktualnych podawkach pytać',
+'tooltip-n-recentchanges' => 'lisćina aktualnych změnow w tutym wikiju',
+'tooltip-n-randompage' => 'připadny nastawk wopytać',
+'tooltip-n-help' => 'pomocna strona',
+'tooltip-t-whatlinkshere' => 'lisćina wšěch stronow, kotrež sem wotkazuja',
+'tooltip-t-recentchangeslinked' => 'aktualne změny w stronach, na kotrež tuta strona wotkazuje',
+'tooltip-feed-rss' => 'RSS-feed za tutu stronu',
+'tooltip-feed-atom' => 'Atom-feed za tutu stronu',
+'tooltip-t-contributions' => 'přinoški tutoho wužiwarja wobhladać',
+'tooltip-t-emailuser' => 'wužiwarjej mejlku pósłać',
+'tooltip-t-upload' => 'Dataje nahrać',
+'tooltip-t-specialpages' => 'lisćina wšěch specialnych stronow',
+'tooltip-t-print' => 'ćišćowy napohlad tuteje strony',
+'tooltip-t-permalink' => 'trajny wotkaz k tutej wersiji strony',
+'tooltip-ca-nstab-main' => 'stronu wobhladać',
+'tooltip-ca-nstab-user' => 'wužiwarsku stronu wobhladać',
+'tooltip-ca-nstab-media' => 'datajowu stronu wobhladać',
+'tooltip-ca-nstab-special' => 'To je specialna strona. Njemóžeš ju wobdźěłać.',
+'tooltip-ca-nstab-project' => 'projektowu stronu wobhladać',
+'tooltip-ca-nstab-image' => 'Datajowu stronu pokazać',
+'tooltip-ca-nstab-mediawiki' => 'systemowu zdźělenku wobhladać',
+'tooltip-ca-nstab-template' => 'předłohu wobhladać',
+'tooltip-ca-nstab-help' => 'pomocnu stronu wobhladać',
+'tooltip-ca-nstab-category' => 'kategorijnu stronu wobhladać',
+'tooltip-minoredit' => 'jako snadnu změnu woznamjenić',
+'tooltip-save' => 'změny składować',
+'tooltip-preview' => 'twoje zmÄ›ny pÅ™ehladnyć, proÅ¡u ÄiÅ„ to do skÅ‚adowanja!',
+'tooltip-diff' => 'zmÄ›ny pokazać, kotrež sy w teksće ÄiniÅ‚',
+'tooltip-compareselectedversions' => 'rozdźěle mjez wubranymaj wersijomaj tuteje strony pokazać',
+'tooltip-watch' => 'tutu stronu wobkedźbowankam přidać',
+'tooltip-watchlistedit-normal-submit' => 'Titule wotstronić',
+'tooltip-watchlistedit-raw-submit' => 'Wobkedźbowanki aktualizować',
+'tooltip-recreate' => 'stronu znowa wutworić, haÄrunjež bu wumÅ¡mórnjena',
+'tooltip-upload' => 'nahraće startować',
+'tooltip-rollback' => '"Rollback" anuluje změny strony poslednjeho sobudźěłaćerja přez jedne kliknjenje.',
+'tooltip-undo' => 'anuluje tutu zmÄ›nu a woÄinja wobdźěłowanski formular w pÅ™ehladowym modusu. Zmóžnja pÅ™iÄinu w zjeću pÅ™idać.',
+'tooltip-preferences-save' => 'Nastajenja składować',
+'tooltip-summary' => 'Zapodaj krótke zjeće',
# Stylesheets
'common.css' => '/* CSS w tutej dataji budźe so na wšěch stronow wuskutkować. */',
@@ -2727,9 +2812,6 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
# Patrol log
'patrol-log-page' => 'Protokol přepruwowanjow',
'patrol-log-header' => 'To je protokol dohladowanych wersijow.',
-'patrol-log-line' => 'je $1 strony $2 jako přepruwowanu markěrował $3.',
-'patrol-log-auto' => '(awtomatisce)',
-'patrol-log-diff' => 'wersiju $1',
'log-show-hide-patrol' => 'Protokol dohladowanja $1',
# Image deletion
@@ -2756,11 +2838,11 @@ $1',
'file-info' => 'Wulkosć dataje: $1, typ MIME: $2',
'file-info-size' => '$1 × $2 pikselow, wulkosć dataje: $3, typ MIME: $4',
'file-info-size-pages' => '$1 × $2 pikselow, wulkosć dataje: $3, MIME-typ: $4, $5 {{PLURAL:$5|strona|stronje|strony|stronow}}',
-'file-nohires' => '<small>Za tutu dataju žane wyše rozeznaće njeje.</small>',
+'file-nohires' => 'Za tutu dataju žane wyše rozeznaće njeje.',
'svg-long-desc' => 'SVG-dataja, zakładna wulkosć: $1 × $2 pikselow, datajowa wulkosć: $3',
'show-big-image' => 'Wersija z wyšim rozeznaćom',
-'show-big-image-preview' => '<small>Wulkosć tutoho přehlada: $1.</small>',
-'show-big-image-other' => '<small>Druhe rozeznaća: $1.</small>',
+'show-big-image-preview' => 'Wulkosć tutoho přehlada: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druhe rozeznaće|Druhej rozeznaći|Druhe rozeznaća|Druhe rozeznaća}}: $1.',
'show-big-image-size' => '$1 × $2 pikselow',
'file-info-gif-looped' => 'BjezkónÄna sekla',
'file-info-gif-frames' => '$1 {{PLURAL:$1|wobłuk|wobłukaj|wobłuki|wobłukow}}',
@@ -2780,6 +2862,13 @@ $1',
'bydate' => 'datumje',
'sp-newimages-showfrom' => 'Nowe dataje pokazać, zapoÄinajo wot $1, $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekundu|$1 sekundomaj|$1 sekundami|$1 sekundami}}',
+'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}}',
+'ago' => 'před $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3265,13 +3354,6 @@ Tutón wobkrućenski kod spadnje $4.',
'scarytranscludefailed' => '[Zapřijimanje předłohi za $1 je so njeporadźiło]',
'scarytranscludetoolong' => '[URL je předołhi]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks za tutón nastawk:<br />
-$1',
-'trackbackremove' => '([$1 wušmórnyć])',
-'trackbacklink' => 'Wróćosćěhowanje',
-'trackbackdeleteok' => 'Trackback bu wuspěšnje wušmórnjeny.',
-
# Delete conflict
'deletedwhileediting' => "'''Kedźbu''': Tuta strona bu wuÅ¡mórnjena, po tym zo sy zapoÄaÅ‚ ju wobdźěłać!",
'confirmrecreate' => "Wužiwar [[User:$1|$1]] ([[User talk:$1|diskusija]]) je stronu wuÅ¡mórnyÅ‚, po tym zo sy zapoÄaÅ‚ ju wobdźěłać. PÅ™iÄina:
@@ -3358,6 +3440,9 @@ Móžeš tež [[Special:EditWatchlist|standardnu wobdźěłowansku stronu]] wuž
# Iranian month names
'iranian-calendar-m2' => 'Ordibehešt',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusija]])',
+
# Core parser functions
'unknown_extension_tag' => 'Njeznata tafliÄka rozÅ¡Ä›rjenja "$1"',
'duplicate-defaultsort' => 'Warnowanje: Standardny sortÄ›rowonski kluÄ (DEFAULTSORTKEY) "$2" pÅ™episa prjedawÅ¡u sortÄ›rowanski kluÄ "$1".',
@@ -3414,7 +3499,7 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
'specialpages-note' => '----
* Normalne specialne strony.
* <span class="mw-specialpagerestricted">Specialne strony z wobmjezowanym přistupom.</span>
-* <span class="mw-specialpagecached">Specialne strony z pufrowaka.</span>',
+* <span class="mw-specialpagecached">Specialne strony z pufrowaka (móža zestarjene być).</span>',
'specialpages-group-maintenance' => 'Hladanske lisćiny',
'specialpages-group-other' => 'Druhe specialne strony',
'specialpages-group-login' => 'Přizjewjenje',
@@ -3456,13 +3541,16 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
# Special:ComparePages
-'comparepages' => 'Strony přirunać',
-'compare-selector' => 'Wersije strony přirunać',
-'compare-page1' => 'Strona 1',
-'compare-page2' => 'Strona 2',
-'compare-rev1' => 'Wersija 1',
-'compare-rev2' => 'Wersija 2',
-'compare-submit' => 'Přirunać',
+'comparepages' => 'Strony přirunać',
+'compare-selector' => 'Wersije strony přirunać',
+'compare-page1' => 'Strona 1',
+'compare-page2' => 'Strona 2',
+'compare-rev1' => 'Wersija 1',
+'compare-rev2' => 'Wersija 2',
+'compare-submit' => 'Přirunać',
+'compare-invalid-title' => 'Titul, kotryž sy podał, je njepłaćiwy.',
+'compare-title-not-exists' => 'Titul, kotryž sy podał, njeeksistuje.',
+'compare-revision-not-exists' => 'Wersija, kotruž sy podał, njeeksistuje.',
# Database error messages
'dberr-header' => 'Tutón wiki ma problem',
@@ -3489,4 +3577,90 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
'sqlite-no-fts' => '$1 połnotekstowe pytanje njepodpěruje',
+# New logging system
+'logentry-delete-delete' => '$1 je stronu $3 zhašał',
+'logentry-delete-restore' => '$1 je stronu $3 wobnowił',
+'logentry-delete-event' => '$1 změni widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
+'logentry-delete-revision' => '$1 změni widźomnosć {{PLURAL:$5|jedneje wersije|$5 wersijow|$5 wersijow|$5 wersijow}} na $3: $4',
+'logentry-delete-event-legacy' => '$1 změni widźomnosć protokolowych zapiskow na $3',
+'logentry-delete-revision-legacy' => '$1 změni widźomnosć wersijow na stronje $3',
+'logentry-suppress-delete' => '$1 je stronu $3 potłóÄiÅ‚',
+'logentry-suppress-event' => '$1 změni skradźu widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
+'logentry-suppress-revision' => '$1 změni skradźu widźomnosć {{PLURAL:$5|jedneje wersije|$5 wersijow|$5 wersijow|$5 wersijow}} na stronje $3: $4',
+'logentry-suppress-event-legacy' => '$1 změni skradźu widźomnosć protokolowych zapiskow na $3',
+'logentry-suppress-revision-legacy' => '$1 změni skradźu widźomnosć wersijow na stronje $3',
+'revdelete-content-hid' => 'wobsah schowany',
+'revdelete-summary-hid' => 'Zjeće schowane',
+'revdelete-uname-hid' => 'wužiwarske mjeno schowane',
+'revdelete-content-unhid' => 'wobsah widźomny',
+'revdelete-summary-unhid' => 'zjeće widźomne',
+'revdelete-uname-unhid' => 'wužiwarske mjeno widźomne',
+'revdelete-restricted' => 'na administratorow nałožene wobmjezowanja',
+'revdelete-unrestricted' => 'Wobmjezowanja za administratorow wotstronjene',
+'logentry-move-move' => '$1 je stronu $3 do $4 přesunył',
+'logentry-move-move-noredirect' => '$1 přesuny stronu $3 do $4, bjeztoho zo by dalesposrědkowanje wutworił',
+'logentry-move-move_redir' => '$1 přesuny stronu $3 do $4 přepisujo dalesposrědkowanje',
+'logentry-move-move_redir-noredirect' => '$1 přesuny stronu $3 do $4 přepisujo dalesposrědkowanje, bjeztoho zo by dalesposrědkowanje wutworił',
+'logentry-patrol-patrol' => '$1 markěrowaše wersiju $4 strony $3 jako skontrolowanu',
+'logentry-patrol-patrol-auto' => '$1 awtomatisce markěrowaše wersiju $4 strony $3 jako skontrolowanu',
+'logentry-newusers-newusers' => '$1 je wužiwarske konto załožił',
+'logentry-newusers-create' => '$1 je wužiwarske konto załožił',
+'logentry-newusers-create2' => '$1 załoži wužiwarske konto $3',
+'logentry-newusers-autocreate' => 'Konto $1 je so awtomatisce załožiło',
+'newuserlog-byemail' => 'Hesło z e-mejlku pósłane',
+
+# Feedback
+'feedback-bugornote' => 'Jeli sy zwólniwy, techniski problem nadrobnje wopisać, [$1 zdźěl prošu zmylk].
+Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so stronje "[$3 $2]", z twojim wužiwarskim mjenom a z wobhladowakom, kotryž wužiwaš.',
+'feedback-subject' => 'Tema:',
+'feedback-message' => 'Powěsć:',
+'feedback-cancel' => 'Přetorhnyć',
+'feedback-submit' => 'Komentar wotpósłać',
+'feedback-adding' => 'Komentar so stronje přidawa...',
+'feedback-error1' => 'Zmylk: Njepřipóznaty wuslědk wot API',
+'feedback-error2' => 'Zmylk: Wobdźěłanje je so njeporadźiło',
+'feedback-error3' => 'Zmylk: Žana wotmołwa wot API',
+'feedback-thanks' => 'Dźakujemy so! Twój komentar je so k stronje "[$2 $1]" pósłał.',
+'feedback-close' => 'DokónÄeny',
+'feedback-bugcheck' => 'Wulkotnje! Skontroluj jenož, haÄ to jedyn z [$1 znatych zmylkow] njeje.',
+'feedback-bugnew' => 'Sym to skontrolował. Nowy zmylk zdźělić',
+
+# API errors
+'api-error-badaccess-groups' => 'Nimaš prawo dataje do tutoho wikija nahrać.',
+'api-error-badtoken' => 'NutÅ™kowny zmylk: WopaÄny token.',
+'api-error-copyuploaddisabled' => 'Nahrawanje přez URL je na tutym serwerje znjemóžnjene.',
+'api-error-duplicate' => '{{PLURAL:$1|Je|Stej|Su|Je}} hižo {{PLURAL:$1|[$2 druha dataja]|[$2 druhej dataji]|[$2 druhe dataje]|[$2 druhich datajow]}} ze samsnym wobsahom na sydle',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Bě [$2 druha dataja]|Běštej [$2 druhej dataji]|Běchu [$2 druhe dataje]|Bě [$2 druhich datajow]}} hižo na websydle ze samsnym wobsahom, ale {{PLURAL:$1|je so zhašała|stej so zhašałoj|su so zhašeli|je so zhašało}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Dwójna dataja, kotraž je|Dwójnej dataji, kotrejž stej|Dwójne dataje, kotrež su|Dwójne dataje, kotrež su}} so hižo {{PLURAL:$1|zhašała|zhašałoj|zhašeli|zhašeli}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}',
+'api-error-empty-file' => 'Dataja, kotruž sy nahrał, je prózdna.',
+'api-error-emptypage' => 'Wutworjenje nowych, prózdnych stronow njeje dowolene.',
+'api-error-fetchfileerror' => 'Nutřkowny zmylk: při wobstarowanju dataje je so něšto nimokuliło.',
+'api-error-file-too-large' => 'Dataja, kotruž sy nahrał, bě přewulka.',
+'api-error-filename-tooshort' => 'Datajowe mjeno překrótko',
+'api-error-filetype-banned' => 'Tutón datajowy typ je zawrjeny.',
+'api-error-filetype-missing' => 'Dataja nima datajowu kóncowku.',
+'api-error-hookaborted' => 'Změna, kotruž pospytowaše přewjesć, bu přez rozšěrjensku hoku přetorhnjena.',
+'api-error-http' => 'Nutřkowny zmylk: Zwisk ze serwerom njemóžno.',
+'api-error-illegal-filename' => 'Datajowe mjeno njedowolene.',
+'api-error-internal-error' => 'Nutřkowny zmylk: Při předźěłowanju twojeho nahraća na wiki je so něšto nimokuliło.',
+'api-error-invalid-file-key' => 'Nutřkowny zmylk: dataja njeje so w nachwilnym składowaku namakała.',
+'api-error-missingparam' => 'Nutřkowny zmylk: falowace parametry při naprašowanju.',
+'api-error-missingresult' => 'NutÅ™kowny zmylk: njeda so zwÄ›sćić, haÄ kopÄ›rowanje je so poradźiÅ‚o.',
+'api-error-mustbeloggedin' => 'Dyrbiš přizjewjeny być, zo by dataje nahrał.',
+'api-error-mustbeposted' => 'Nutřkowny zmylk: Naprašowanje wužaduje sej HTTP POST.',
+'api-error-noimageinfo' => 'Nahraće je so poradźiło, ale serwer njeje nam žane informacije wo dataji dał.',
+'api-error-nomodule' => 'Nutřkowny zmylk: Žadyn modul nastajeny.',
+'api-error-ok-but-empty' => 'Nutřkowny zmylk: žana wotmołwa wot serwera.',
+'api-error-overwrite' => 'Přepisowanje eksistowaceje dataje njeje dowolene.',
+'api-error-stashfailed' => 'Nutřkowny zmylk: Serwer njemóžeše nachwilnu dataju składować.',
+'api-error-timeout' => 'Serwer njeje znutÅ™ka woÄakowaneho Äasa wotmoÅ‚wiÅ‚.',
+'api-error-unclassified' => 'Njeznaty zmylk je wustupił.',
+'api-error-unknown-code' => 'Njeznaty zmylk: "$1"',
+'api-error-unknown-error' => 'Nutřkowny zmylk: Při nahrawanju twojeje dataje je so něšto nimokuliło.',
+'api-error-unknown-warning' => 'Njeznate warnowanje: $1',
+'api-error-unknownerror' => 'Njeznaty zmylk: "$1".',
+'api-error-uploaddisabled' => 'Nahraća su na tutym wikiju znjemóžnjene.',
+'api-error-verification-error' => 'Tuta dataja móhÅ‚a wobkÅ¡kodźena być abo wopaÄny sufiks měć.',
+
);
diff --git a/languages/messages/MessagesHt.php b/languages/messages/MessagesHt.php
index dfd70e77..28ef03da 100644
--- a/languages/messages/MessagesHt.php
+++ b/languages/messages/MessagesHt.php
@@ -45,6 +45,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'ToutMesaj' ),
'Allpages' => array( 'ToutPaj' ),
'Ancientpages' => array( 'PajAnsyen' ),
+ 'Badtitle' => array( 'MovèTit' ),
'Blankpage' => array( 'PajVid' ),
'Block' => array( 'Bloke', 'BlokeIP', 'BlokeItilizatè' ),
'Blockme' => array( 'BlokeM' ),
@@ -496,14 +497,13 @@ Souple, kontakte yon [[Special:ListUsers/sysop|administratè]], epi ba li lyen a
Yon lòt moun te gendwa efase l anvan ou.',
'badtitle' => 'Tit ou bay an pa bon, li pa koresponn nan sistèm an, eseye byen ekri li',
'badtitletext' => 'Tit, sijè paj ou mande a pa korèk oubyen li pa egziste oubyen li nan yon lòt pwojè wiki yo (gade nan lòt pwojè wiki yo pou wè toutbon). Li mèt genyen tou kèk karaktè ki pa rekonèt nan sistèm an, eseye itilize bon karaktè yo nan tit ou yo.',
-'perfcached' => 'Sa se yon vèsyon ki sòti nan kach sistèm nou an. Li gendwa pa a jou.',
-'perfcachedts' => 'Done sa yo sòti nan sistèm kach la, yo gendwa pa a jou. Dènye fwa nou mete yo a jou se te $1.',
+'perfcached' => 'Sa se yon vèsyon ki sòti nan kach sistèm nou an. Li gendwa pa a jou. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Done sa yo sòti nan sistèm kach la, yo gendwa pa a jou. Dènye fwa nou mete yo a jou se te $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Nou pa kapab mete paj sa yo a jou paske fonksyon mizajou dezaktive. Done w ap jwenn pi ba pap rafrechi.',
'wrong_wfQuery_params' => 'Paramèt sa yo pa bon sou wfQuery()<br />
Fonksyon : $1<br />
Demann : $2',
'viewsource' => 'Wè kòd paj la',
-'viewsourcefor' => 'pou $1',
'actionthrottled' => 'Aksyon sa limite',
'actionthrottledtext' => 'Nan batay kont pouryèl, aksyon sa ou tapral fè limite nan kantite itilizasyon l pandan yon tan ki kout. Li sanble ou depase kantite sa. Eseye ankò nan kèk minit.',
'protectedpagetext' => 'Paj sa pwoteje pou anpeche tout modifikasyon nou ta kapab fè sou li. Gade paj diskisyon sou li pito.',
@@ -691,9 +691,6 @@ Si toutfwa ou te bay yon bon adrès imèl nan preferans ou yo ( [[Special:Prefer
Adrès IP ou an kounye a se $3. Idantifyan pou blokaj la se $5. Ou dwe mete enfòmasyon sa yo nan demann ou an.',
'blockednoreason' => 'Li pa bay pyès rezon pou aksyon sa',
-'blockedoriginalsource' => "Wè kòd sous '''$1''' pli ba :",
-'blockededitsource' => "Teks '''modifikasyon ou yo''' sou '''$1''' parèt pi ba :",
-'whitelistedittitle' => 'Ou dwe konekte w pou ou kapab modifye tèks sa',
'whitelistedittext' => 'Ou dwe $1 pou ou kapab genyen dwa pou modifye paj sa.',
'confirmedittext' => 'Ou dwe konfime adrès imèl ou an anvan ou kapab fè modifikasyon. Antre epi valide adrès imèl ou an nan paj [[Special:Preferences|preferans]] ou.',
'nosuchsectiontitle' => 'Nou pa ka jwenn seksyon sa a',
@@ -875,16 +872,9 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
'revdelete-unsuppress' => 'Anlve restriksyon yo sou vèsyon yo ki restore',
'revdelete-log' => 'Poukisa:',
'revdelete-submit' => 'Aplike sou vèsyon ki seleksyone {{PLURAL:$1|a|yo}}',
-'revdelete-logentry' => 'Vizibilite pou vèsyon sa modifye pou [[$1]]',
'revdel-restore' => 'Modifye, chanje vizibilite a',
'pagehist' => 'Istorik paj sa',
'deletedhist' => 'Istorik efase',
-'revdelete-content' => 'kontni',
-'revdelete-summary' => 'somè pou modifikasyon',
-'revdelete-uname' => 'non itilizatè',
-'revdelete-restricted' => 'aplike restriksyon sa yo pou administratè yo',
-'revdelete-hid' => 'kache $1',
-'revdelete-unhid' => 'montre $1',
# Merge log
'revertmerge' => 'Separe',
@@ -1114,12 +1104,8 @@ Gade tou [[Special:WantedCategories|kategori moun mande]].',
'linksearch' => 'Lyen andeyò',
# Special:Log/newusers
-'newuserlogpage' => 'Jounal pou kreyasyon kont itilizatè yo',
-'newuserlogpagetext' => 'Men jounal, istorik kreyasyon kont itilizatè yo.',
-'newuserlog-byemail' => 'mopas an voye pa imèl',
-'newuserlog-create-entry' => 'Nouvo kont itilizatè',
-'newuserlog-create2-entry' => 'te kreye kont $1',
-'newuserlog-autocreate-entry' => 'Kont sa kreye otomatikman',
+'newuserlogpage' => 'Jounal pou kreyasyon kont itilizatè yo',
+'newuserlogpagetext' => 'Men jounal, istorik kreyasyon kont itilizatè yo.',
# Special:ListGroupRights
'listgrouprights-members' => '(lis manm yo)',
@@ -1151,7 +1137,6 @@ Depi kounye a, tout modifikasyon nan paj sa a ak nan paj diskisyon li pral parè
'actioncomplete' => 'Aksyon an fèt',
'deletedtext' => '« $1 » efase.
Gade $2 pou wè yon lis efasman resan.',
-'deletedarticle' => 'efase « [[$1]] »',
'dellogpage' => 'Jounal efasman yo',
'deletecomment' => 'Rezon:',
'deleteotherreason' => 'Rezon an plis :',
@@ -1187,9 +1172,8 @@ Men reglaj pou paj '''$1''' an kounye a:",
'restriction-level' => 'Nivo kontrent, restriksyon:',
# Undelete
-'undeletebtn' => 'Retabli',
-'undeletelink' => 'gade/retabli',
-'undeletedarticle' => 'retabli « [[$1]] »',
+'undeletebtn' => 'Retabli',
+'undeletelink' => 'gade/retabli',
# Namespace form on various pages
'namespace' => 'Espas non :',
@@ -1272,8 +1256,6 @@ Nan ka sa yo, ou dwe renonmen oubyen fizyone paj la ou menm si ou vle.',
'talkexists' => 'Paj nan te byen deplase, men paj diskisyon an pa t deplase paske te deja ekziste youn anlè nouvo paj la. Tanpri, fizyone de paj diskisyon sa yo ou menm.',
'movedto' => 'deplase nan',
'movetalk' => 'Renonmen ak deplase paj diskisyon an tou',
-'1movedto2' => 'te deplase [[$1]] vè [[$2]]',
-'1movedto2_redir' => 'te deplase [[$1]] vè [[$2]], nan menm moman, li ekraze redireksyon li',
'movelogpage' => 'Jounal deplasman yo',
'movereason' => 'Rezon:',
'revertmove' => 'revoke',
@@ -1353,7 +1335,7 @@ Li pèmèt retabli vèsyon ki te anvan li epi ajoute yon rezon ki esplike poukis
# Media information
'file-info-size' => '$1 × $2 piksèl, gwosè fichye a : $3, tip MIME li ye : $4',
-'file-nohires' => '<small>Pa genyen rezolisyon ki pi wo ki disponib.</small>',
+'file-nohires' => 'Pa genyen rezolisyon ki pi wo ki disponib.',
'svg-long-desc' => 'Fichye SVG, rezolisyon de $1 × $2 piksèl, gwosè fichye : $3',
'show-big-image' => 'Pi bon rezolisyon',
@@ -1410,4 +1392,8 @@ Nenpòt lòt lyen nan menm liy nan konsidere kòm yon eksèpsyon, i.e. paj kote
# HTML forms
'htmlform-reset' => 'Revoke chanjman yo',
+# New logging system
+'revdelete-restricted' => 'aplike restriksyon sa yo pou administratè yo',
+'newuserlog-byemail' => 'mopas an voye pa imèl',
+
);
diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php
index 2cf137cf..7c5abdfd 100644
--- a/languages/messages/MessagesHu.php
+++ b/languages/messages/MessagesHu.php
@@ -27,6 +27,7 @@
* @author KossuthRad
* @author Misibacsi
* @author Samat
+ * @author Sucy
* @author Terik
* @author Tgr
* @author Xbspiro
@@ -71,6 +72,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Rendszerüzenetek' ),
'Allpages' => array( 'Az_összes_lap_listája' ),
'Ancientpages' => array( 'Régóta_nem_változott_szócikkek' ),
+ 'Badtitle' => array( 'Hibás_címek' ),
'Blankpage' => array( 'Ãœres_lap' ),
'Block' => array( 'Blokkolás' ),
'Blockme' => array( 'Blokkolj' ),
@@ -181,128 +183,128 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ÃTIRÃNYÃTÃS', '#REDIRECT' ),
- 'notoc' => array( '0', '__NINCSTARTALOMJEGYZÉK__', '__NINCSTJ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__NINCSGALÉRIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__LEGYENTARTALOMJEGYZÉK__', '__LEGYENTJ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__TARTALOMJEGYZÉK__', '__TJ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NINCSSZERKESZTÉS__', '__NINCSSZERK__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'HÓNAP', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'HÓNAP1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'HÓNAPNEVE', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'HÓNAPRÖVID', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'MAINAP', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'MAINAP2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'MAINAPNEVE', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ÉV', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'IDÅ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ÓRA', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'HELYIHÓNAP', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'HELYIHÓNAP1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'HELYIHÓNAPNÉV', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'HELYIHÓNAPRÖVIDÃTÉS', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'HELYINAP', 'LOCALDAY' ),
- 'localday2' => array( '1', 'HELYINAP2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'HELYINAPNEVE', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'HELYIÉV', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'HELYIIDÅ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'HELYIÓRA', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'OLDALAKSZÃMA', 'LAPOKSZÃMA', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'SZÓCIKKEKSZÃMA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FÃJLOKSZÃMA', 'KÉPEKSZÃMA', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'SZERKESZTÅKSZÃMA', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'AKTÃVSZERKESZTÅKSZÃMA', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'SZERKESZTÉSEKSZÃMA', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'MEGTEKINTÉSEKSZÃMA', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'OLDALNEVE', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'OLDALNEVEE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NÉVTERE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NÉVTEREE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'VITATERE', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'VITATEREE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'SZÓCIKKNÉVTERE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'SZÓCIKKNÉVTEREE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'LAPTELJESNEVE', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'LAPTELJESNEVEE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ALLAPNEVE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ALLAPNEVEE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ALAPLAPNEVE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ALAPLAPNEVEE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'VITALAPNEVE', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'VITALAPNEVEE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'SZÓCIKKNEVE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'SZÓCIKKNEVEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'ÃœZENET:', 'ÃœZ:', 'MSG:' ),
- 'subst' => array( '0', 'BEILLESZT:', 'BEMÃSOL:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'bélyegkép', 'bélyeg', 'miniatűr', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'bélyegkép=$1', 'bélyeg=$1', 'miniatűr=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'jobb', 'jobbra', 'right' ),
- 'img_left' => array( '1', 'bal', 'balra', 'left' ),
- 'img_none' => array( '1', 'semmi', 'none' ),
- 'img_center' => array( '1', 'közép', 'középre', 'center', 'centre' ),
- 'img_framed' => array( '1', 'keretezett', 'keretes', 'keretben', 'kerettel', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'keretnélküli', 'frameless' ),
- 'img_page' => array( '1', 'oldal=$1', 'oldal $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'fennjobbra', 'fennjobbra=$1', 'fennjobbra $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'keret', 'border' ),
- 'img_baseline' => array( '1', 'alapvonal', 'baseline' ),
- 'img_sub' => array( '1', 'ai', 'alsóindex', 'sub' ),
- 'img_super' => array( '1', 'fi', 'felsőindex', 'super', 'sup' ),
- 'img_top' => array( '1', 'fenn', 'fent', 'top' ),
- 'img_text_top' => array( '1', 'szöveg-fenn', 'szöveg-fent', 'text-top' ),
- 'img_middle' => array( '1', 'vközépen', 'vközépre', 'middle' ),
- 'img_bottom' => array( '1', 'lenn', 'lent', 'bottom' ),
- 'img_text_bottom' => array( '1', 'szöveg-lenn', 'szöveg-lent', 'text-bottom' ),
- 'sitename' => array( '1', 'WIKINEVE', 'SITENAME' ),
- 'ns' => array( '0', 'NÉVTÉR:', 'NS:' ),
- 'localurl' => array( '0', 'HELYIURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'HELYIURLE:', 'LOCALURLE:' ),
- 'server' => array( '0', 'SZERVER', 'KISZOLGÃLÓ', 'SERVER' ),
- 'servername' => array( '0', 'SZERVERNEVE', 'KISZOLGÃLÓNEVE', 'SERVERNAME' ),
- 'grammar' => array( '0', 'NYELVTAN:', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'HÉT', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'HÉTNAPJA', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'HELYIHÉT', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'HELYIHÉTNAPJA', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'VÃLTOZATAZON', 'VÃLTOZATAZONOSÃTÓ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'VÃLTOZATNAPJA', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'VÃLTOZATNAPJA2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'VÃLTOZATHÓNAPJA', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'VÃLTOZATÉVE', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'VÃLTOZATIDÅBÉLYEG', 'VÃLTOZATIDEJE', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'VÃLTOZATSZERKESZTÅJE', 'REVISIONUSER' ),
- 'plural' => array( '0', 'TÖBBESSZÃM:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TELJESURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'TELJESURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'KISKEZDÅ:', 'KISKEZDÅBETÅ°:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'NAGYKEZDÅ:', 'NAGYKEZDÅBETÅ°:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KISBETÅ°:', 'KISBETÅ°K:', 'KB:', 'KISBETÅ°S:', 'LC:' ),
- 'uc' => array( '0', 'NAGYBETÅ°:', 'NAGYBETÅ°K', 'NB:', 'NAGYBETÅ°S:', 'UC:' ),
- 'displaytitle' => array( '1', 'MEGJELENÃTENDÅCÃM', 'CÃM', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__ÚJSZAKASZHIV__', '__ÚJSZAKASZLINK__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__NINCSÚJSZAKASZHIV__', '__NINCSÚJSZAKASZLINK__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'JELENLEGIVÃLTOZAT', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLKÓDOLVA:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'HORGONYKÓDOLVA', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'IDÅBÉLYEG', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'HELYIIDÅBÉLYEG', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'IRÃNYJELZÅ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#NYELV:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'TARTALOMNYELVE', 'TARTNYELVE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'OLDALAKNÉVTÉRBEN:', 'OLDALAKNBEN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ADMINOKSZÃMA', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMÃZOTTSZÃM', 'SZÃMFORMÃZÃS', 'SZÃMFORM', 'FORMATNUM' ),
- 'special' => array( '0', 'speciális', 'special' ),
- 'defaultsort' => array( '1', 'RENDEZÉS:', 'KULCS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ELÉRÉSIÚT:', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__REJTETTKAT__', '__REJTETTKATEGÓRIA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'LAPOKAKATEGÓRIÃBAN', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'LAPMÉRET', 'PAGESIZE' ),
- 'noindex' => array( '1', '__NINCSINDEX__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'CSOPORTTAGOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__ÃLLANDÓÃTIRÃNYÃTÃS__', '__STATIKUSÃTIRÃNYÃTÃS__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'VÉDELMISZINT', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'dátumformázás', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#ÃTIRÃNYÃTÃS', '#REDIRECT' ),
+ 'notoc' => array( '0', '__NINCSTARTALOMJEGYZÉK__', '__NINCSTJ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__NINCSGALÉRIA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__LEGYENTARTALOMJEGYZÉK__', '__LEGYENTJ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__TARTALOMJEGYZÉK__', '__TJ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NINCSSZERKESZTÉS__', '__NINCSSZERK__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'HÓNAP', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'HÓNAP1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'HÓNAPNEVE', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'HÓNAPRÖVID', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'MAINAP', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'MAINAP2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'MAINAPNEVE', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ÉV', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'IDÅ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ÓRA', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'HELYIHÓNAP', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'HELYIHÓNAP1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'HELYIHÓNAPNÉV', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'HELYIHÓNAPRÖVIDÃTÉS', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'HELYINAP', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'HELYINAP2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'HELYINAPNEVE', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'HELYIÉV', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'HELYIIDÅ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'HELYIÓRA', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'OLDALAKSZÃMA', 'LAPOKSZÃMA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'SZÓCIKKEKSZÃMA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FÃJLOKSZÃMA', 'KÉPEKSZÃMA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'SZERKESZTÅKSZÃMA', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AKTÃVSZERKESZTÅKSZÃMA', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'SZERKESZTÉSEKSZÃMA', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'MEGTEKINTÉSEKSZÃMA', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'OLDALNEVE', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'OLDALNEVEE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NÉVTERE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NÉVTEREE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'VITATERE', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'VITATEREE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'SZÓCIKKNÉVTERE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'SZÓCIKKNÉVTEREE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'LAPTELJESNEVE', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'LAPTELJESNEVEE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ALLAPNEVE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ALLAPNEVEE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ALAPLAPNEVE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ALAPLAPNEVEE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'VITALAPNEVE', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'VITALAPNEVEE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'SZÓCIKKNEVE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'SZÓCIKKNEVEE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'ÃœZENET:', 'ÃœZ:', 'MSG:' ),
+ 'subst' => array( '0', 'BEILLESZT:', 'BEMÃSOL:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'bélyegkép', 'bélyeg', 'miniatűr', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'bélyegkép=$1', 'bélyeg=$1', 'miniatűr=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'jobb', 'jobbra', 'right' ),
+ 'img_left' => array( '1', 'bal', 'balra', 'left' ),
+ 'img_none' => array( '1', 'semmi', 'none' ),
+ 'img_center' => array( '1', 'közép', 'középre', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'keretezett', 'keretes', 'keretben', 'kerettel', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'keretnélküli', 'frameless' ),
+ 'img_page' => array( '1', 'oldal=$1', 'oldal $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'fennjobbra', 'fennjobbra=$1', 'fennjobbra $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'keret', 'border' ),
+ 'img_baseline' => array( '1', 'alapvonal', 'baseline' ),
+ 'img_sub' => array( '1', 'ai', 'alsóindex', 'sub' ),
+ 'img_super' => array( '1', 'fi', 'felsőindex', 'super', 'sup' ),
+ 'img_top' => array( '1', 'fenn', 'fent', 'top' ),
+ 'img_text_top' => array( '1', 'szöveg-fenn', 'szöveg-fent', 'text-top' ),
+ 'img_middle' => array( '1', 'vközépen', 'vközépre', 'middle' ),
+ 'img_bottom' => array( '1', 'lenn', 'lent', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'szöveg-lenn', 'szöveg-lent', 'text-bottom' ),
+ 'sitename' => array( '1', 'WIKINEVE', 'SITENAME' ),
+ 'ns' => array( '0', 'NÉVTÉR:', 'NS:' ),
+ 'localurl' => array( '0', 'HELYIURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'HELYIURLE:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'SZERVER', 'KISZOLGÃLÓ', 'SERVER' ),
+ 'servername' => array( '0', 'SZERVERNEVE', 'KISZOLGÃLÓNEVE', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'NYELVTAN:', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'HÉT', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'HÉTNAPJA', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'HELYIHÉT', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'HELYIHÉTNAPJA', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'VÃLTOZATAZON', 'VÃLTOZATAZONOSÃTÓ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'VÃLTOZATNAPJA', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'VÃLTOZATNAPJA2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'VÃLTOZATHÓNAPJA', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'VÃLTOZATÉVE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VÃLTOZATIDÅBÉLYEG', 'VÃLTOZATIDEJE', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'VÃLTOZATSZERKESZTÅJE', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'TÖBBESSZÃM:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'TELJESURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'TELJESURLE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'KISKEZDÅ:', 'KISKEZDÅBETÅ°:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'NAGYKEZDÅ:', 'NAGYKEZDÅBETÅ°:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KISBETÅ°:', 'KISBETÅ°K:', 'KB:', 'KISBETÅ°S:', 'LC:' ),
+ 'uc' => array( '0', 'NAGYBETÅ°:', 'NAGYBETÅ°K', 'NB:', 'NAGYBETÅ°S:', 'UC:' ),
+ 'displaytitle' => array( '1', 'MEGJELENÃTENDÅCÃM', 'CÃM', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__ÚJSZAKASZHIV__', '__ÚJSZAKASZLINK__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__NINCSÚJSZAKASZHIV__', '__NINCSÚJSZAKASZLINK__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'JELENLEGIVÃLTOZAT', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLKÓDOLVA:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'HORGONYKÓDOLVA', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'IDÅBÉLYEG', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'HELYIIDÅBÉLYEG', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'IRÃNYJELZÅ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#NYELV:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'TARTALOMNYELVE', 'TARTNYELVE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'OLDALAKNÉVTÉRBEN:', 'OLDALAKNBEN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ADMINOKSZÃMA', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMÃZOTTSZÃM', 'SZÃMFORMÃZÃS', 'SZÃMFORM', 'FORMATNUM' ),
+ 'special' => array( '0', 'speciális', 'special' ),
+ 'defaultsort' => array( '1', 'RENDEZÉS:', 'KULCS:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ELÉRÉSIÚT:', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__REJTETTKAT__', '__REJTETTKATEGÓRIA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'LAPOKAKATEGÓRIÃBAN', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'LAPMÉRET', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__NINCSINDEX__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'CSOPORTTAGOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__ÃLLANDÓÃTIRÃNYÃTÃS__', '__STATIKUSÃTIRÃNYÃTÃS__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'VÉDELMISZINT', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'dátumformázás', 'formatdate', 'dateformat' ),
);
$linkTrail = '/^([a-záéíóúöüőűÃÉÃÓÚÖÜÅÅ°]+)(.*)$/sDu';
@@ -665,20 +667,22 @@ Jelezd ezt egy [[Special:ListUsers/sysop|adminiszttrátornak]] az URL megadásá
'badarticleerror' => 'Ez a tevékenység nem végezhető el ezen a lapon.',
'cannotdelete' => 'A(z) $1 lapot vagy fájlt nem lehet törölni.
Talán már valaki más törölte.',
+'cannotdelete-title' => 'Nem lehet törölni a(z) „$1†lapot',
'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:",
-'perfcachedts' => "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, legutóbbi frissítésük ideje $1.",
+'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.",
+'perfcachedts' => "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, legutóbbi frissítésük ideje $1. Legfeljebb {{PLURAL:$4|egy|$4}} eredmény áll rendelkezésre a gyorsítótárban.",
'querypage-no-updates' => 'Az oldal frissítése jelenleg le van tiltva. Az itt szereplő adatok nem frissülnek azonnal.',
'wrong_wfQuery_params' => 'A wfQuery() függvény paraméterei hibásak<br />
Függvény: $1<br />
Lekérdezés: $2',
'viewsource' => 'Lapforrás',
-'viewsourcefor' => '$1 változata',
+'viewsource-title' => '$1 forrásának megtekintése',
'actionthrottled' => 'Művelet megszakítva',
'actionthrottledtext' => 'A spamek elleni védekezés miatt nem végezheted el a műveletet túl sokszor egy adott időn belül, és te átlépted a megengedett határt. Próbálkozz újra néhány perc múlva.',
'protectedpagetext' => 'Ez egy védett lap, nem szerkeszthető.',
'viewsourcetext' => 'Megtekintheted és másolhatod a lap forrását:',
+'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 más szerkesztők számára is. 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)',
@@ -779,6 +783,7 @@ A visszaélések elkerülése végett {{PLURAL:$1|egy|$1}} óránként csak egy
'noemailprefs' => 'Az alábbi funkciók használatához meg kell adnod az e-mail címedet.',
'emailconfirmlink' => 'E-mail cím megerősítése',
'invalidemailaddress' => 'A megadott e-mail cím érvénytelen formátumú. Kérlek, adj meg egy érvényes e-mail címet vagy hagyd üresen azt a mezőt.',
+'cannotchangeemail' => 'Ezen a wikin nem módosítható a fiókhoz tartozó e-mail cím.',
'accountcreated' => 'Felhasználói fiók létrehozva',
'accountcreatedtext' => '$1 felhasználói fiókja sikeresen létrejött.',
'createaccount-title' => 'Új {{SITENAME}}-azonosító létrehozása',
@@ -795,6 +800,7 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
# E-mail sending
'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
+'user-mail-no-addy' => 'E-mail üzenetet próbáltál küldeni e-mail cím megadása nélkül.',
# Change password dialog
'resetpass' => 'Jelszó módosítása',
@@ -815,28 +821,43 @@ Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben
'resetpass-temp-password' => 'Ideiglenes jelszó:',
# Special:PasswordReset
-'passwordreset' => 'Jelszó beállítása',
-'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy értesítő e-mailt kapsz a fiók adataival.',
-'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-username' => 'Felhasználónév:',
-'passwordreset-domain' => 'Tartomány:',
-'passwordreset-email' => 'E-mail cím:',
-'passwordreset-emailtitle' => 'A(z) {{SITENAME}}-fiók adatai',
-'passwordreset-emailtext-ip' => 'Valaki (vélhetően Te, a $1 IP-címrő)l emlékeztetők kért a {{SITENAME}} ($4) oldalon felvett fiókokról. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:
+'passwordreset' => 'Jelszó beállítása',
+'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy értesítő e-mailt kapsz a fiók adataival.',
+'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-username' => 'Felhasználónév:',
+'passwordreset-domain' => 'Tartomány:',
+'passwordreset-capture' => 'Meg szeretnéd nézni az elkészült üzenetet?',
+'passwordreset-capture-help' => 'Ha kipipálod a dobozt, amellett, hogy kiküldődik az üzenet a felhasználónak, megjelenik számodra (az ideiglenes jelszavakkal együtt)',
+'passwordreset-email' => 'E-mail cím:',
+'passwordreset-emailtitle' => 'A(z) {{SITENAME}}-fiók adatai',
+'passwordreset-emailtext-ip' => 'Valaki (vélhetően Te, a $1 IP-címrő)l emlékeztetők kért a {{SITENAME}} ($4) oldalon felvett fiókokról. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:
$2
{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.',
-'passwordreset-emailtext-user' => '$1 felhasználó emlékeztetők kért a {{SITENAME}} ($4) oldalon felvett fiókokról. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:
+'passwordreset-emailtext-user' => '$1 felhasználó emlékeztetők kért a {{SITENAME}} ($4) oldalon felvett fiókokról. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:
$2
{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.',
-'passwordreset-emailelement' => 'Felhaználónév: $1
+'passwordreset-emailelement' => 'Felhaználónév: $1
Ideiglenes jelszó: $2',
-'passwordreset-emailsent' => 'Emlékeztető e-mail elküldve.',
+'passwordreset-emailsent' => 'Emlékeztető e-mail elküldve.',
+'passwordreset-emailsent-capture' => 'Az alább látható emlékeztető e-mail 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',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail cím megváltoztatása',
+'changeemail-header' => 'A fiókhoz tartozó e-mail cím megváltoztatása',
+'changeemail-text' => 'Az e-mail címed megváltoztatásához ki kell töltened az alábbi űrlapot. Megerősítésképpen meg kell adnod a jelszavadat is.',
+'changeemail-no-info' => 'A lap közvetlen eléréséhez be kell jelentkezned.',
+'changeemail-oldemail' => 'Jelenlegi e-mail cím:',
+'changeemail-newemail' => 'Új e-mail cím:',
+'changeemail-none' => '(nincs)',
+'changeemail-submit' => 'E-mail cím megváltoztatása',
+'changeemail-cancel' => 'Mégse',
# Edit page toolbar
'bold_sample' => 'Félkövér szöveg',
@@ -907,9 +928,6 @@ Az 'E-mail küldése ennek a szerkesztőnek' funkciót csak akkor használhatod,
Jelenlegi IP-címed: $3, a blokkolás azonosítószáma: #$5.
Kérjük, hogy érdeklődés esetén mindkettőt add meg.",
'blockednoreason' => 'nem adott meg okot',
-'blockedoriginalsource' => "A(z) '''$1''' lap forráskódja:",
-'blockededitsource' => "A(z) '''$1''' lapon '''végrehajtott szerkesztésed''' szövege:",
-'whitelistedittitle' => 'A lap szerkesztéséhez be kell jelentkezned',
'whitelistedittext' => 'Lapok szerkesztéséhez $1.',
'confirmedittext' => 'Lapok szerkesztése előtt meg kell erősítened az e-mail címedet. Kérjük, hogy a [[Special:Preferences|szerkesztői beállításaidban]] add meg, majd erősítsd meg az e-mail címedet.',
'nosuchsectiontitle' => 'A szakasz nem található',
@@ -994,7 +1012,7 @@ Azt is megígéred, hogy ezt magadtól írtad, vagy egy közkincsből vagy más
Ha nem akarod, hogy az írásodat módosítsák, akkor ne küldd be.<br />
Azt is megígéred, hogy ezt magadtól írtad, vagy egy közkincsből vagy más szabad forrásból másoltad (lásd a(z) $1 lapot a részletekért).
'''NE KÃœLDJ BE JOGVÉDETT MUNKÃT ENGEDÉLY NÉLKÃœL!'''",
-'longpageerror' => "'''HIBA: Az általad beküldött szöveg $1 kilobájt hosszú, ami több az engedélyezett $2 kilobájtnál.
+'longpageerror' => "'''HIBA: Az általad beküldött szöveg {{PLURAL:$1|egy kilobájt|$1 kilobájt}} hosszú, ami több az engedélyezett {{PLURAL:$2|egy kilobájtnál|$2 kilobájtnál}}.
A szerkesztést nem lehet elmenteni.'''",
'readonlywarning' => "'''FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet.
A lap szöveget kimásolhatod egy szövegfájlba, amit elmenthetsz későbbre.'''
@@ -1161,8 +1179,6 @@ A(z) {{SITENAME}} adminisztrátorai továbbra is meg tudják tekinteni az elrejt
'revdelete-unsuppress' => 'Korlátozások eltávolítása a visszaállított változatokról',
'revdelete-log' => 'Ok:',
'revdelete-submit' => 'Alkalmazás a kiválasztott {{PLURAL:$1|változatra|változatokra}}',
-'revdelete-logentry' => 'módosította a(z) [[$1]] lap egy vagy több változatának láthatóságát',
-'logdelete-logentry' => '[[$1]] eseményének láthatóságának módosítása',
'revdelete-success' => "'''A változat láthatósága sikeresen frissítve.'''",
'revdelete-failure' => "'''Nem sikerült frissíteni a változat láthatóságát:'''
$1",
@@ -1174,15 +1190,6 @@ $1",
'revdel-restore-visible' => 'látható lapváltozatok',
'pagehist' => 'Laptörténet',
'deletedhist' => 'Törölt változatok',
-'revdelete-content' => 'a tartalmát',
-'revdelete-summary' => 'a szerkesztési összefoglalóját',
-'revdelete-uname' => 'a szerkesztőjének nevét',
-'revdelete-restricted' => 'elrejtett az adminisztrátorok elől',
-'revdelete-unrestricted' => 'felfedett az adminisztrátoroknak',
-'revdelete-hid' => 'elrejtette $1',
-'revdelete-unhid' => 'felfedte $1',
-'revdelete-log-message' => '$1 {{PLURAL:$1|egy|$2}} változatnak',
-'logdelete-log-message' => '$1 {{PLURAL:$2|egy|$2}} eseménynek',
'revdelete-hide-current' => 'Nem sikerült elrejteni a $1 $2-kori elemet: ez a jelenlegi változat, amit nem lehet elrejteni.',
'revdelete-show-no-access' => 'Nem lehet megjeleníteni a $2 $1-kori elemet, mert „korlátozottnak†van jelölve.',
'revdelete-modify-no-access' => 'Nem lehet módosítani a $2 $1-kori elemet, mert „korlátozottnak†van jelölve.',
@@ -1333,12 +1340,14 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
'prefs-rc' => 'Friss változtatások',
'prefs-watchlist' => 'Figyelőlista',
'prefs-watchlist-days' => 'A figyelőlistában mutatott napok száma:',
-'prefs-watchlist-days-max' => 'Legfeljebb 7 nap',
+'prefs-watchlist-days-max' => 'Legfeljebb $1 {{PLURAL:$1|nap|nap}}',
'prefs-watchlist-edits' => 'A kiterjesztett figyelőlistán mutatott szerkesztések száma:',
'prefs-watchlist-edits-max' => 'Legfeljebb 1000',
'prefs-watchlist-token' => 'A figyelőlista kulcsa:',
'prefs-misc' => 'Egyéb',
'prefs-resetpass' => 'Jelszó megváltoztatása',
+'prefs-changeemail' => 'e-mail cím megváltoztatása',
+'prefs-setemail' => 'e-mail cím megadása',
'prefs-email' => 'Levelezés',
'prefs-rendering' => 'Lapok megjelenítése',
'saveprefs' => 'Mentés',
@@ -1398,6 +1407,7 @@ A műveletet nem lehet visszavonni.',
'yourrealname' => 'Valódi neved:',
'yourlanguage' => 'A felület nyelve:',
'yourvariant' => 'A tartalom nyelvváltozata:',
+'prefs-help-variant' => 'A választott variánsod vagy rendezési sorrendek, ahogy a wiki lapokat meg akarod jeleníteni.',
'yournick' => 'Aláírás:',
'prefs-help-signature' => 'A vitalapra írt hozzászólásaidat négy hullámvonallal (<nowiki>~~~~</nowiki>) írd alá. A lap mentésekor ez lecserélődik az aláírásodra és egy időbélyegre.',
'badsig' => 'Érvénytelen aláírás; ellenőrizd a HTML-formázást.',
@@ -1437,7 +1447,7 @@ A műveletet nem lehet visszavonni.',
'userrights-lookup-user' => 'Szerkesztőcsoportok beállítása',
'userrights-user-editname' => 'Add meg a szerkesztő nevét:',
'editusergroup' => 'Szerkesztőcsoportok módosítása',
-'editinguser' => "'''[[User:$1|$1]]''' jogainak megváltoztatása ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "'''[[User:$1|$1]]''' szerkesztő jogainak megváltoztatása $2",
'userrights-editusergroup' => 'Szerkesztőcsoportok módosítása',
'saveusergroups' => 'Szerkesztőcsoportok mentése',
'userrights-groupsmember' => 'Csoporttag:',
@@ -1530,13 +1540,13 @@ A műveletet nem lehet visszavonni.',
'right-autopatrol' => 'szerkesztések automatikusan ellenőrzöttként való jelölése',
'right-patrolmarks' => 'járőrök jelzéseinek megtekintése a friss változásokban',
'right-unwatchedpages' => 'nem figyelt lapok listájának megtekintése',
-'right-trackback' => 'trackback küldése',
'right-mergehistory' => 'laptörténetek egyesítése',
'right-userrights' => 'az összes szerkesztő jogainak módosítása',
'right-userrights-interwiki' => 'más wikik szerkesztői jogainak módosítása',
'right-siteadmin' => 'adatbázis lezárása, felnyitása',
'right-override-export-depth' => 'Lapok exportálása a hivatkozott lapokkal együtt, legfeljebb 5-ös mélységig',
'right-sendemail' => 'e-mail küldése más felhasználóknak',
+'right-passwordreset' => 'Jelszó visszaállítási emailek megtekintése',
# User rights log
'rightslog' => 'Szerkesztői jogosultságok naplója',
@@ -1570,16 +1580,17 @@ A műveletet nem lehet visszavonni.',
'action-suppressionlog' => 'privát napló megtekintése',
'action-block' => 'szerkesztő blokkolása',
'action-protect' => 'lap védelmi szintjének megváltoztatása',
+'action-rollback' => 'szerkesztések gyors visszaállítása az utolsó szerkesztő változatára egy adott oldalon',
'action-import' => 'lap importálása más wikiből',
'action-importupload' => 'lap importálása fájl feltöltésével',
'action-patrol' => 'mások szerkesztéseinek ellenőrzöttként való megjelölése',
'action-autopatrol' => 'saját szerkesztések ellenőrzöttként való megjelölése',
'action-unwatchedpages' => 'nem figyelt lapok listájának megtekintése',
-'action-trackback' => 'trackback küldése',
'action-mergehistory' => 'lap laptörténetének egyesítése',
'action-userrights' => 'összes szerkesztő jogainak módosítása',
'action-userrights-interwiki' => 'más wikik szerkesztői jogainak módosítása',
'action-siteadmin' => 'adatbázis lezárása vagy felnyitása',
+'action-sendemail' => 'e-mailek küldése',
# Recent changes
'nchanges' => '{{PLURAL:$1|egy|$1}} változtatás',
@@ -1611,6 +1622,7 @@ A műveletet nem lehet visszavonni.',
'number_of_watching_users_pageview' => '[Jelenleg {{PLURAL:$1|egy|$1}} felhasználó figyeli]',
'rc_categories' => 'Szűkítés kategóriákra („|†jellel válaszd el őket)',
'rc_categories_any' => 'Bármelyik',
+'rc-change-size-new' => '{{PLURAL:$1| egy bájt|$1 bájt}} módosítás után',
'newsectionsummary' => '/* $1 */ (új szakasz)',
'rc-enhanced-expand' => 'Részletek megjelenítése (JavaScript szükséges)',
'rc-enhanced-hide' => 'Részletek elrejtése',
@@ -1663,6 +1675,7 @@ Lásd még az [[Special:NewFiles|új fáljlok galériáját]]',
'ignorewarnings' => 'Hagyd figyelmen kívül a figyelmeztetéseket',
'minlength1' => 'A fájlnévnek legalább egy betűből kell állnia.',
'illegalfilename' => 'A „$1†lap neve olyan karaktereket tartalmaz, melyek nincsenek megengedve lapcímben. Kérlek, változtasd meg a nevet, és próbálkozz a mentéssel újra.',
+'filename-toolong' => 'A fájlok neve nem lehet hosszabb 240 bájtnál.',
'badfilename' => 'A fájl új neve „$1â€.',
'filetype-mime-mismatch' => 'A fájl kiterjesztése („.$1â€) nem egyezik meg az észlelt MIME-típussal ($2).',
'filetype-badmime' => '„$1†MIME-típusú fájlokat nem lehet feltölteni.',
@@ -1769,6 +1782,41 @@ Kérjük, hogy lépj kapcsolatba egy [[Special:ListUsers/sysop|adminisztrátorr
'upload-unknown-size' => 'Ismeretlen méretű',
'upload-http-error' => 'HTTP-hiba történt: $1',
+# File backend
+'backend-fail-stream' => 'Nem sikerült sugározni ezt a fájlt: $1.',
+'backend-fail-backup' => 'Nem lehet elmenteni ezt a fájlt: $1.',
+'backend-fail-notexists' => 'Ez a fájl nem létezik: $1 .',
+'backend-fail-hashes' => 'Nem lehet lekérni a hash értéket az összehasonlításhoz.',
+'backend-fail-notsame' => 'Egy nem azonos fájl már létezik $1 néven.',
+'backend-fail-invalidpath' => '$1 nem érvényes tárolási útvonal.',
+'backend-fail-delete' => 'Nem sikerült törölni ezt a fájlt: $1 .',
+'backend-fail-alreadyexists' => 'Ez a fájl már létezik: $1 .',
+'backend-fail-store' => 'Nem sikerült a(z) $1 fájl tárolása $2 helyen.',
+'backend-fail-copy' => 'Nem sikerült a(z) $1 fájl másolása $2 helyre.',
+'backend-fail-move' => 'Nem sikerült a(z) $1 fájl mozgatása $2 helyre.',
+'backend-fail-opentemp' => 'Nem lehet megnyitni az ideiglenes fájlt.',
+'backend-fail-writetemp' => 'Nem lehet írni az ideiglenes fájlba.',
+'backend-fail-closetemp' => 'Nem lehet lezárni az ideiglenes fájlt.',
+'backend-fail-read' => 'Nem sikerült olvasni ebből a fájlból: $1.',
+'backend-fail-create' => 'Nem sikerült létrehozni ezt a fájlt: $1.',
+'backend-fail-readonly' => 'A(z) „$1†tárolórendszer jelenleg csak olvasható. Ennek oka a következÅ‘: „$2â€',
+'backend-fail-synced' => 'A(z) „$1†fájl inkonzisztens állapotban van a tárolórendszerek között',
+'backend-fail-connect' => 'Nem sikerült csatlakozni a(z) „$1†tárolórendszerhez.',
+'backend-fail-internal' => 'Ismeretlen hiba keletkezett a(z) „$1†tárolórendszerben.',
+'backend-fail-contenttype' => 'Nem lehetett a fájl típusát meghatározni a „$1†helyen történő tároláshoz.',
+'backend-fail-batchsize' => 'A tárolórendszer {{PLURAL:$1|1|$1}} fájlműveletet tartalmazó parancsfájlt kapott; legfeljebb {{PLURAL:$2|1|$2}} műveletből állót kaphat.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Nem lehet a zárolást feloldani: „$1â€; nincs zárolva.',
+'lockmanager-fail-closelock' => 'Nem sikerült a „$1†zárolási fájljának bezárása.',
+'lockmanager-fail-deletelock' => 'Nem sikerült a(z) „$1†zárolási fájljának törlése.',
+'lockmanager-fail-acquirelock' => 'Nem sikerült zárolást igényelni a „$1†fájlhoz.',
+'lockmanager-fail-openlock' => 'Nem sikerült a „$1†zárolási fájljának megnyitása.',
+'lockmanager-fail-releaselock' => 'Nem sikerült a(z) „$1†fájl zárolásának feloldása.',
+'lockmanager-fail-db-bucket' => 'Nem sikerült kapcsolatot létesíteni elég adatbázis zároláshoz a $1 vödörben.',
+'lockmanager-fail-db-release' => 'Nem lehet a $1 adatbázis zárolását feloldani.',
+'lockmanager-fail-svr-release' => 'Nem lehet a(z) $1 szerver zárolását feloldani.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Hiba történt a ZIP fájlokon végzett ellenőrzés elindítása közben.',
'zip-wrong-format' => 'A fájl sérült, vagy más miatt olvashatatlan ZIP fájl.
@@ -1786,6 +1834,7 @@ Nem lehet megfelelően ellenőrizni a biztonságosságát.',
'uploadstash-badtoken' => 'A művelet végrehajtása sikertelen volt. Lehetséges, hogy lejártak a szerkesztést hitelesítő adataid. Próbáld újra!',
'uploadstash-errclear' => 'A fájlok törlése nem sikerült.',
'uploadstash-refresh' => 'Fájlok listájának frissítése',
+'invalid-chunk-offset' => 'Érvénytelen darab eltolás',
# img_auth script messages
'img-auth-accessdenied' => 'Hozzáférés megtagadva',
@@ -1890,23 +1939,24 @@ A [$2 fájl ottani leírólapjának] másolata alább látható.',
'filerevert-badversion' => 'A megadott időbélyegzésű fájlnak nincs helyi változata.',
# File deletion
-'filedelete' => '$1 törlése',
-'filedelete-legend' => 'Fájl törlése',
-'filedelete-intro' => "Törölni készülsz a(z) '''[[Media:$1|$1]]''' médiafájlt, a teljes fájltörténetével együtt.",
-'filedelete-intro-old' => '<span class="plainlinks">A(z) \'\'\'[[Media:$1|$1]]\'\'\' fájl, dátum: [$4 $3, $2] változatát törlöd.</span>',
-'filedelete-comment' => 'Ok:',
-'filedelete-submit' => 'Törlés',
-'filedelete-success' => "A(z) '''$1''' médiafájlt törölted.",
-'filedelete-success-old' => "A(z) '''[[Media:$1|$1]]''' $3, $2-kori változata sikeresen törölve lett.",
-'filedelete-nofile' => "'''$1''' nem létezik.",
-'filedelete-nofile-old' => "A(z) '''$1''' fájlnak nincs a megadott tulajdonságokkal rendelkező archivált változata.",
-'filedelete-otherreason' => 'Más/további ok:',
-'filedelete-reason-otherlist' => 'Más ok',
-'filedelete-reason-dropdown' => '*Ãltalános törlési okok
+'filedelete' => '$1 törlése',
+'filedelete-legend' => 'Fájl törlése',
+'filedelete-intro' => "Törölni készülsz a(z) '''[[Media:$1|$1]]''' médiafájlt, a teljes fájltörténetével együtt.",
+'filedelete-intro-old' => '<span class="plainlinks">A(z) \'\'\'[[Media:$1|$1]]\'\'\' fájl, dátum: [$4 $3, $2] változatát törlöd.</span>',
+'filedelete-comment' => 'Ok:',
+'filedelete-submit' => 'Törlés',
+'filedelete-success' => "A(z) '''$1''' médiafájlt törölted.",
+'filedelete-success-old' => "A(z) '''[[Media:$1|$1]]''' $3, $2-kori változata sikeresen törölve lett.",
+'filedelete-nofile' => "'''$1''' nem létezik.",
+'filedelete-nofile-old' => "A(z) '''$1''' fájlnak nincs a megadott tulajdonságokkal rendelkező archivált változata.",
+'filedelete-otherreason' => 'Más/további ok:',
+'filedelete-reason-otherlist' => 'Más ok',
+'filedelete-reason-dropdown' => '*Ãltalános törlési okok
** Szerzői jog megsértése
** Duplikátum',
-'filedelete-edit-reasonlist' => 'Törlési okok szerkesztése',
-'filedelete-maintenance' => 'A fájlok törlése és helyreállítása ideiglenesen le van tiltva karbantartás miatt.',
+'filedelete-edit-reasonlist' => 'Törlési okok szerkesztése',
+'filedelete-maintenance' => 'A fájlok törlése és helyreállítása ideiglenesen le van tiltva karbantartás miatt.',
+'filedelete-maintenance-title' => 'Nem lehet törölni a fájlt',
# MIME search
'mimesearch' => 'Keresés MIME-típus alapján',
@@ -2004,6 +2054,8 @@ Az <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.',
'wantedpages' => 'Keresett lapok',
'wantedpages-badtitle' => 'Érvénytelen cím található az eredményhalmazban: $1',
'wantedfiles' => 'Keresett fájlok',
+'wantedfiletext-cat' => 'A következő fájlok használatban vannak, de nem léteznek. Külső tárhelyről származó fájlok akkor is a listára kerülhetnek, ha léteznek. Az ilyen hamis riasztások <del>áthúzva</del> jelennek meg. Ezen felül az olyan beágyazott fájlok, amelyek nem léteznek a [[:$1]] kategóriában jelennek meg.',
+'wantedfiletext-nocat' => 'A következő fájlok használatban vannak, de nem léteznek. Külső tárhelyről származó fájlok akkor is a listára kerülhetnek, ha léteznek. Az ilyen hamis riasztások <del>áthúzva</del> jelennek meg.',
'wantedtemplates' => 'Keresett sablonok',
'mostlinked' => 'Legtöbbet hivatkozott lapok',
'mostlinkedcategories' => 'Legtöbbet hivatkozott kategóriák',
@@ -2012,6 +2064,7 @@ Az <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.',
'mostimages' => 'Legtöbbet hivatkozott fájlok',
'mostrevisions' => 'Legtöbbet szerkesztett lapok',
'prefixindex' => 'Keresés előtag szerint',
+'prefixindex-namespace' => 'Összes lap adott előtaggal ($1 névtér)',
'shortpages' => 'Rövid lapok',
'longpages' => 'Hosszú lapok',
'deadendpages' => 'Zsákutcalapok',
@@ -2028,7 +2081,7 @@ Az <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.',
'listusers-editsonly' => 'Csak a szerkesztéssel rendelkező szerkesztők mutatása',
'listusers-creationsort' => 'Rendezés létrehozási dátum szerint',
'usereditcount' => '{{PLURAL:$1|egy|$1}} szerkesztés',
-'usercreated' => 'Létrehozva $1, $2-kor',
+'usercreated' => '{{GENDER:$3|Létrehozva}} $1, $2-kor',
'newpages' => 'Új lapok',
'newpages-username' => 'Felhasználói név:',
'ancientpages' => 'Régóta nem változott szócikkek',
@@ -2121,12 +2174,8 @@ Támogatott protokollok: <tt>$1</tt> (ezeket ne írd be a keresésbe).',
'activeusers-noresult' => 'Nem található ilyen szerkesztő.',
# Special:Log/newusers
-'newuserlogpage' => 'Új szerkesztők naplója',
-'newuserlogpagetext' => 'Ez a napló az újonnan regisztrált szerkesztők listáját tartalmazza.',
-'newuserlog-byemail' => 'a jelszót kiküldtük a megadott e-mail címre',
-'newuserlog-create-entry' => 'új szerkesztőként regisztrált',
-'newuserlog-create2-entry' => 'új felhasználói fiókot hozott létre $1 néven',
-'newuserlog-autocreate-entry' => 'Felhasználói fiók automatikusan létrehozva',
+'newuserlogpage' => 'Új szerkesztők naplója',
+'newuserlogpagetext' => 'Ez a napló az újonnan regisztrált szerkesztők listáját tartalmazza.',
# Special:ListGroupRights
'listgrouprights' => 'Szerkesztői csoportok jogai',
@@ -2155,7 +2204,7 @@ Az egyes csoportokról további információt [[{{MediaWiki:Listgrouprights-help
'emailpagetext' => 'A szerkesztő e-mail-címére ezen űrlap kitöltésével üzenetet tudsz küldeni.
Feladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címed fog szerepelni, így a címzett közvetlenül neked tud majd válaszolni.',
'usermailererror' => 'A levélküldő objektum hibával tért vissza:',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} e-mail a következÅ‘ felhasználótól: „$1â€',
'usermaildisabled' => 'Email fogadás letiltva',
'usermaildisabledtext' => 'Nem küldhetsz emailt más felhasználóknak ezen a wikin',
'noemailtitle' => 'Nincs e-mail cím',
@@ -2209,7 +2258,7 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
'watchmethod-list' => 'a legfrissebb szerkesztésekben található figyelt lapok',
'watchlistcontains' => 'A figyelőlistádon {{PLURAL:$1|egy|$1}} lap szerepel.',
'iteminvalidname' => "Probléma a '$1' elemmel: érvénytelen név...",
-'wlnote' => "Az utolsó '''{{PLURAL:$2|egy|$2}}''' óra '''{{PLURAL:$1|egy|$1}}''' változtatása látható az alábbiakban.",
+'wlnote' => "Alább az utolsó '''{{PLURAL:$2|egy|$2}}''' óra '''{{PLURAL:$1|egy|$1}}''' változtatása látható. A lap generálásának ideje $3, $4.",
'wlshowlast' => 'Az elmúlt $1 órában | $2 napon | $3 történt változtatások legyenek láthatóak',
'watchlist-options' => 'A figyelőlista beállításai',
@@ -2274,8 +2323,6 @@ Kérjük, erősítsd meg, hogy valóban ezt szeretnéd tenni, átlátod a követ
'actionfailed' => 'A művelet nem sikerült',
'deletedtext' => 'A(z) „$1†lapot törölted.
A legutóbbi törlések listájához lásd a $2 lapot.',
-'deletedarticle' => '„[[$1]]†törölve',
-'suppressedarticle' => 'elrejtette a(z) „[[$1]]†szócikket',
'dellogpage' => 'Törlési_napló',
'dellogpagetext' => 'Itt láthatók a legutóbb törölt lapok.',
'deletionlog' => 'törlési napló',
@@ -2321,7 +2368,10 @@ A [[Special:ProtectedPages|védett lapok listáján]] megtekintheted a jelenleg
'unprotectedarticle' => 'eltávolította a védelmet a(z) „[[$1]]†lapról',
'movedarticleprotection' => 'áthelyezte „[[$2]]†védelmi beállításait „[[$1]]†cím alá',
'protect-title' => '„$1†levédése',
+'protect-title-notallowed' => '„$1†védelmi szintjének megtekintése',
'prot_1movedto2' => '[[$1]] lapot átneveztem [[$2]] névre',
+'protect-badnamespace-title' => 'Nem védhető névtér',
+'protect-badnamespace-text' => 'Ebben a névtérben az oldalak nem védhetők.',
'protect-legend' => 'Levédés megerősítése',
'protectcomment' => 'Ok:',
'protectexpiry' => 'Időtartam',
@@ -2344,6 +2394,7 @@ Megváltoztathatod ezen lap védelmi szintjét, de az nem lesz hatással a kaszk
'protect-level-sysop' => 'Csak adminisztrátorok',
'protect-summary-cascade' => 'kaszkád védelem',
'protect-expiring' => 'lejár: $1 (UTC)',
+'protect-expiring-local' => 'lejárat: $1',
'protect-expiry-indefinite' => 'határozatlan',
'protect-cascade' => 'Kaszkád védelem – védjen le minden lapot, amit ez a lap tartalmaz.',
'protect-cantedit' => 'Nem változtathatod meg a lap védelmi szintjét, mert nincs jogod a szerkesztéséhez.',
@@ -2405,7 +2456,6 @@ változatot visszaállították vagy eltávolították az archívumból.',
'undeletereset' => 'Vissza',
'undeleteinvert' => 'Kijelölés megfordítása',
'undeletecomment' => 'Ok:',
-'undeletedarticle' => '„[[$1]]†helyreállítva',
'undeletedrevisions' => '{{PLURAL:$1|egy|$1}} változat helyreállítva',
'undeletedrevisions-files' => '{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva',
'undeletedfiles' => '{{PLURAL:$1|egy|$1}} fájl visszaállítva',
@@ -2414,6 +2464,7 @@ változatot visszaállították vagy eltávolították az archívumból.',
Lásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.",
'undelete-header' => 'A legutoljára törölt lapokat lásd a [[Special:Log/delete|törlési naplóban]].',
+'undelete-search-title' => 'Törölt lapok keresése',
'undelete-search-box' => 'Törölt lapok keresése',
'undelete-search-prefix' => 'A megadott szavakkal kezdődő oldalak megjelenítése:',
'undelete-search-submit' => 'Keresés',
@@ -2422,6 +2473,7 @@ Lásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és hel
'undelete-bad-store-key' => 'Nem állítható helyre a(z) $1 időbélyeggel ellátott változat: a fájl már hiányzott törlés előtt.',
'undelete-cleanup-error' => 'Hiba történt a nem használt „$1†archivált fájl törlésekor.',
'undelete-missing-filearchive' => 'Nem állítható helyre a(z) $1 azonosítószámú fájlarchívum, mert nincs az adatbázisban. Lehet, hogy már korábban helyreállították.',
+'undelete-error' => 'Hiba a lap helyreállítása során',
'undelete-error-short' => 'Hiba történt a fájl helyreállítása során: $1',
'undelete-error-long' => 'Hiba történt a fájl helyreállítása során:
@@ -2542,6 +2594,7 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
'blocklist-userblocks' => 'Fiókblokkolások elrejtése',
'blocklist-tempblocks' => 'Ideiglenes blokkolások elrejtése',
'blocklist-addressblocks' => 'IP-címek blokkolásainak elrejtése',
+'blocklist-rangeblocks' => 'Tartományblokkok elrejtése',
'blocklist-timestamp' => 'Időbélyeg',
'blocklist-target' => 'Célpont',
'blocklist-expiry' => 'Lejárat',
@@ -2564,6 +2617,7 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
'unblocklink' => 'blokk feloldása',
'change-blocklink' => 'blokkolás módosítása',
'contribslink' => 'szerkesztései',
+'emaillink' => 'e-mail küldése',
'autoblocker' => "Az általad használt IP-cím autoblokkolva van, mivel korábban a kitiltott „[[User:$1|$1]]†használta. ($1 blokkolásának indoklása: „'''$2'''â€) Ha nem te vagy $1, lépj kapcsolatba valamelyik adminisztrátorral, és kérd az autoblokk feloldását. Ne felejtsd el megírni neki, hogy kinek szóló blokkba ütköztél bele!",
'blocklogpage' => 'Blokkolási napló',
'blocklog-showlog' => 'Ez a felhasználó már blokkolva volt korábban. A blokkolási napló ide vonatkozó része alább látható:',
@@ -2686,9 +2740,6 @@ Kérlek, válassz egy másik nevet.',
'movepage-page-moved' => 'A(z) „$1†nevű lap át lett nevezve „$2†névre.',
'movepage-page-unmoved' => 'A(z) „$1†nevű lap nem nevezhető át „$2†névre.',
'movepage-max-pages' => '{{PLURAL:$1|Egy|$1}} lapnál több nem nevezhető át automatikusan, így a további lapok a helyükön maradnak.',
-'1movedto2' => '[[$1]] lapot átneveztem [[$2]] névre',
-'1movedto2_redir' => '[[$1]] lapot átneveztem [[$2]] névre (az átirányítást felülírva)',
-'move-redirect-suppressed' => 'átirányítás nélkül',
'movelogpage' => 'Ãtnevezési napló',
'movelogpagetext' => 'Az alábbiakban az átnevezett lapok listája látható.',
'movesubpage' => '{{PLURAL:$1|Allap|Allapok}}',
@@ -2701,7 +2752,7 @@ Kérlek, válassz egy másik nevet.',
Az átnevezés céljaként megadott „[[:$1]]†szócikk már létezik. Ha az átnevezést végre akarod hajtani, ezt a lapot törölni kell. Valóban ezt szeretnéd?',
'delete_and_move_confirm' => 'Igen, töröld a lapot',
-'delete_and_move_reason' => 'átnevezendő lap célneve felszabadítva',
+'delete_and_move_reason' => 'Törölve, hogy legyen hely átmozgatni [[$1]] lapot.',
'selfmove' => 'A cikk jelenlegi címe megegyezik azzal, amire át szeretnéd mozgatni. Egy szócikket saját magára mozgatni nem lehet.',
'immobile-source-namespace' => 'A(z) „$1†névtér lapjai nem nevezhetőek át',
'immobile-target-namespace' => 'A(z) „$1†névtérbe nem mozgathatsz át lapokat',
@@ -2735,9 +2786,11 @@ hogy az összes korábbi változatra és a teljes laptörténetekre szükséged
változatok és a legutolsó változtatásokra vonatkozó információk kellenek.
Az utóbbi esetben közvetlen hivatkozást is használhatsz, például a [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] a "[[{{MediaWiki:Mainpage}}]]" nevű lapot exportálja.',
+'exportall' => 'Összes lap exportálása',
'exportcuronly' => 'Csak a legfrissebb állapot, teljes laptörténet nélkül',
'exportnohistory' => "----
'''Megjegyzés:''' A lapok teljes előzményeinek ezen az űrlapon keresztül történő exportálása teljesítményporlbémák miatt letiltott.",
+'exportlistauthors' => 'Minden lap valamennyi szerkesztőjének hozzávétele',
'export-submit' => 'Exportálás',
'export-addcattext' => 'Lapok hozzáadása kategóriából:',
'export-addcat' => 'Hozzáadás',
@@ -2770,6 +2823,8 @@ Ha részt szeretnél venni a MediaWiki fordításában, látogass el a [//www.me
'thumbnail_error' => 'Hiba a bélyegkép létrehozásakor: $1',
'djvu_page_error' => 'A DjVu lap a tartományon kívülre esik',
'djvu_no_xml' => 'Nem olvasható ki a DjVu fájl XML-je',
+'thumbnail-temp-create' => 'Nem lehet ideiglenes bélyegkép fájlt létrehozni',
+'thumbnail-dest-create' => 'Nem lehet a bélyegképet a célhelyre menteni',
'thumbnail_invalid_params' => 'Érvénytelen bélyegkép paraméterek',
'thumbnail_dest_directory' => 'Nem hozható létre a célkönyvtár',
'thumbnail_image-type' => 'A képformátum nem támogatott',
@@ -2814,6 +2869,11 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
'import-upload' => 'XML-adatok feltöltése',
'import-token-mismatch' => 'Elveszett a session adat, próbálkozz újra.',
'import-invalid-interwiki' => 'A kijelölt wikiből nem lehet importálni.',
+'import-error-edit' => '„$1†lap nem került importálásra, mert nem szerkesztheted azt.',
+'import-error-create' => '„$1†lap nem került importálásra, mert nem hozhatod létre azt.',
+'import-error-interwiki' => '„$1†lap nem került importálásra, mert a név külső hivatkozásokra van fenntartva (interwiki).',
+'import-error-special' => '„$1†lap nem került importálásra, mert olyan speciális névtérbe tartozik, amelyen nem engedélyezettek a lapok.',
+'import-error-invalid' => '„$1†lap nem került importálásra, mert a neve nem érvényes.',
# Import log
'importlogpage' => 'Importnapló',
@@ -2823,72 +2883,85 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
'import-logentry-interwiki' => '$1 más wikiből áthozva',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|egy|$1}} változat innen: $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript tesztelés',
+'javascripttest-disabled' => 'Ez a funkció le van tiltva.',
+'javascripttest-title' => '$1 tesztek futtatása',
+'javascripttest-pagetext-noframework' => 'Ez az oldal JavaStript tesztek futtatására van fenntartva.',
+'javascripttest-pagetext-unknownframework' => 'Ismeretlen teszt keretrendszer: $1.',
+'javascripttest-pagetext-frameworks' => 'Kérlek válaszd valamelyik teszt keretrendszert az alábbiak közül: $1',
+'javascripttest-pagetext-skins' => 'Válassz egy megjelenítő felületet, amin a tesztet futtatod:',
+'javascripttest-qunit-intro' => 'Lásd a [$1 tesztelési dokumentációt] a mediawiki.org helyen.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit tesztcsomag',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'A szerkesztőlapod',
-'tooltip-pt-anonuserpage' => 'Az általad használt IP-címhez tartozó felhasználói lap',
-'tooltip-pt-mytalk' => 'A vitalapod',
-'tooltip-pt-anontalk' => 'Az általad használt IP-címről végrehajtott szerkesztések megvitatása',
-'tooltip-pt-preferences' => 'A beállításaid',
-'tooltip-pt-watchlist' => 'Az általad figyelemmel kísért oldalak utolsó változtatásai',
-'tooltip-pt-mycontris' => 'A közreműködéseid listája',
-'tooltip-pt-login' => 'Bejelentkezni javasolt, de nem kötelező.',
-'tooltip-pt-anonlogin' => 'Bejelentkezni javasolt, de nem kötelező.',
-'tooltip-pt-logout' => 'Kijelentkezés',
-'tooltip-ca-talk' => 'Az oldal tartalmának megvitatása',
-'tooltip-ca-edit' => 'Te is szerkesztheted ezt az oldalt. Mentés előtt használd az előnézet gombot.',
-'tooltip-ca-addsection' => 'Új szakasz nyitása',
-'tooltip-ca-viewsource' => 'Ez egy védett lap. Ide kattintva megnézheted a forrását.',
-'tooltip-ca-history' => 'A lap korábbi változatai',
-'tooltip-ca-protect' => 'A lap levédése',
-'tooltip-ca-unprotect' => 'Lapvédelem módosítása',
-'tooltip-ca-delete' => 'A lap törlése',
-'tooltip-ca-undelete' => 'A törölt lapváltozatok visszaállítása',
-'tooltip-ca-move' => 'A lap áthelyezése',
-'tooltip-ca-watch' => 'A lap hozzáadása a figyelőlistádhoz',
-'tooltip-ca-unwatch' => 'A lap eltávolítása a figyelőlistádról',
-'tooltip-search' => 'Keresés a wikin',
-'tooltip-search-go' => 'Ugrás a megadott lapra, ha létezik',
-'tooltip-search-fulltext' => 'Oldalak keresése a megadott szöveg alapján',
-'tooltip-p-logo' => 'Kezdőlap',
-'tooltip-n-mainpage' => 'A kezdőlap felkeresése',
-'tooltip-n-mainpage-description' => 'A kezdőlap megtekintése',
-'tooltip-n-portal' => 'A közösségről, miben segíthetsz, mit hol találsz meg',
-'tooltip-n-currentevents' => 'Háttérinformáció az aktuális eseményekről',
-'tooltip-n-recentchanges' => 'A wikiben történt legutóbbi változtatások listája',
-'tooltip-n-randompage' => 'Egy véletlenszerűen kiválasztott lap betöltése',
-'tooltip-n-help' => 'Ha bármi problémád van...',
-'tooltip-t-whatlinkshere' => 'Az erre a lapra hivatkozó más lapok listája',
-'tooltip-t-recentchangeslinked' => 'Az erről a lapról hivatkozott lapok utolsó változtatásai',
-'tooltip-feed-rss' => 'A lap tartalma RSS hírcsatorna formájában',
-'tooltip-feed-atom' => 'A lap tartalma Atom hírcsatorna formájában',
-'tooltip-t-contributions' => 'A felhasználó közreműködéseinek listája',
-'tooltip-t-emailuser' => 'Ãrj levelet ennek a felhasználónak!',
-'tooltip-t-upload' => 'Képek vagy egyéb fájlok feltöltése',
-'tooltip-t-specialpages' => 'Az összes speciális lap listája',
-'tooltip-t-print' => 'A lap nyomtatható változata',
-'tooltip-t-permalink' => 'Ãllandó hivatkozás a lap ezen változatához',
-'tooltip-ca-nstab-main' => 'A lap megtekintése',
-'tooltip-ca-nstab-user' => 'A felhasználói lap megtekintése',
-'tooltip-ca-nstab-media' => 'A fájlleíró lap megtekintése',
-'tooltip-ca-nstab-special' => 'Ez egy speciális lap, nem szerkesztheted.',
-'tooltip-ca-nstab-project' => 'A projektlap megtekintése',
-'tooltip-ca-nstab-image' => 'A képleíró lap megtekintése',
-'tooltip-ca-nstab-mediawiki' => 'A rendszerüzenet megtekintése',
-'tooltip-ca-nstab-template' => 'A sablon megtekintése',
-'tooltip-ca-nstab-help' => 'A súgólap megtekintése',
-'tooltip-ca-nstab-category' => 'A kategória megtekintése',
-'tooltip-minoredit' => 'A szerkesztés megjelölése apróként',
-'tooltip-save' => 'A változtatásaid elmentése',
-'tooltip-preview' => 'Mielőtt elmentenéd a lapot, ellenőrizd, biztosan úgy néz-e ki, ahogy szeretnéd!',
-'tooltip-diff' => 'Nézd meg, milyen változtatásokat végeztél eddig a szövegen',
-'tooltip-compareselectedversions' => 'A két kiválasztott változat közötti eltérések megjelenítése',
-'tooltip-watch' => 'Lap hozzáadása a figyelőlistádhoz',
-'tooltip-recreate' => 'A lap újra létrehozása a törlés ellenére',
-'tooltip-upload' => 'Feltöltés indítása',
-'tooltip-rollback' => '„Visszaállításâ€: egy kattintással visszavonja az utolsó felhasználó egy vagy több szerkesztését.',
-'tooltip-undo' => '„Visszavonásâ€: visszavonja ezt a szerkesztést, valamint megnyitja a szerkesztÅ‘t elÅ‘nézet módban. A szerkesztési összefoglalóban meg lehet adni a visszavonás okát.',
-'tooltip-preferences-save' => 'Beállítások mentése',
-'tooltip-summary' => 'Adj meg egy rövid összefoglalót',
+'tooltip-pt-userpage' => 'A szerkesztőlapod',
+'tooltip-pt-anonuserpage' => 'Az általad használt IP-címhez tartozó felhasználói lap',
+'tooltip-pt-mytalk' => 'A vitalapod',
+'tooltip-pt-anontalk' => 'Az általad használt IP-címről végrehajtott szerkesztések megvitatása',
+'tooltip-pt-preferences' => 'A beállításaid',
+'tooltip-pt-watchlist' => 'Az általad figyelemmel kísért oldalak utolsó változtatásai',
+'tooltip-pt-mycontris' => 'A közreműködéseid listája',
+'tooltip-pt-login' => 'Bejelentkezni javasolt, de nem kötelező.',
+'tooltip-pt-anonlogin' => 'Bejelentkezni javasolt, de nem kötelező.',
+'tooltip-pt-logout' => 'Kijelentkezés',
+'tooltip-ca-talk' => 'Az oldal tartalmának megvitatása',
+'tooltip-ca-edit' => 'Te is szerkesztheted ezt az oldalt. Mentés előtt használd az előnézet gombot.',
+'tooltip-ca-addsection' => 'Új szakasz nyitása',
+'tooltip-ca-viewsource' => 'Ez egy védett lap. Ide kattintva megnézheted a forrását.',
+'tooltip-ca-history' => 'A lap korábbi változatai',
+'tooltip-ca-protect' => 'A lap levédése',
+'tooltip-ca-unprotect' => 'Lapvédelem módosítása',
+'tooltip-ca-delete' => 'A lap törlése',
+'tooltip-ca-undelete' => 'A törölt lapváltozatok visszaállítása',
+'tooltip-ca-move' => 'A lap áthelyezése',
+'tooltip-ca-watch' => 'A lap hozzáadása a figyelőlistádhoz',
+'tooltip-ca-unwatch' => 'A lap eltávolítása a figyelőlistádról',
+'tooltip-search' => 'Keresés a wikin',
+'tooltip-search-go' => 'Ugrás a megadott lapra, ha létezik',
+'tooltip-search-fulltext' => 'Oldalak keresése a megadott szöveg alapján',
+'tooltip-p-logo' => 'Kezdőlap',
+'tooltip-n-mainpage' => 'A kezdőlap felkeresése',
+'tooltip-n-mainpage-description' => 'A kezdőlap megtekintése',
+'tooltip-n-portal' => 'A közösségről, miben segíthetsz, mit hol találsz meg',
+'tooltip-n-currentevents' => 'Háttérinformáció az aktuális eseményekről',
+'tooltip-n-recentchanges' => 'A wikiben történt legutóbbi változtatások listája',
+'tooltip-n-randompage' => 'Egy véletlenszerűen kiválasztott lap betöltése',
+'tooltip-n-help' => 'Ha bármi problémád van...',
+'tooltip-t-whatlinkshere' => 'Az erre a lapra hivatkozó más lapok listája',
+'tooltip-t-recentchangeslinked' => 'Az erről a lapról hivatkozott lapok utolsó változtatásai',
+'tooltip-feed-rss' => 'A lap tartalma RSS hírcsatorna formájában',
+'tooltip-feed-atom' => 'A lap tartalma Atom hírcsatorna formájában',
+'tooltip-t-contributions' => 'A felhasználó közreműködéseinek listája',
+'tooltip-t-emailuser' => 'Ãrj levelet ennek a felhasználónak!',
+'tooltip-t-upload' => 'Képek vagy egyéb fájlok feltöltése',
+'tooltip-t-specialpages' => 'Az összes speciális lap listája',
+'tooltip-t-print' => 'A lap nyomtatható változata',
+'tooltip-t-permalink' => 'Ãllandó hivatkozás a lap ezen változatához',
+'tooltip-ca-nstab-main' => 'A lap megtekintése',
+'tooltip-ca-nstab-user' => 'A felhasználói lap megtekintése',
+'tooltip-ca-nstab-media' => 'A fájlleíró lap megtekintése',
+'tooltip-ca-nstab-special' => 'Ez egy speciális lap, nem szerkesztheted.',
+'tooltip-ca-nstab-project' => 'A projektlap megtekintése',
+'tooltip-ca-nstab-image' => 'A képleíró lap megtekintése',
+'tooltip-ca-nstab-mediawiki' => 'A rendszerüzenet megtekintése',
+'tooltip-ca-nstab-template' => 'A sablon megtekintése',
+'tooltip-ca-nstab-help' => 'A súgólap megtekintése',
+'tooltip-ca-nstab-category' => 'A kategória megtekintése',
+'tooltip-minoredit' => 'A szerkesztés megjelölése apróként',
+'tooltip-save' => 'A változtatásaid elmentése',
+'tooltip-preview' => 'Mielőtt elmentenéd a lapot, ellenőrizd, biztosan úgy néz-e ki, ahogy szeretnéd!',
+'tooltip-diff' => 'Nézd meg, milyen változtatásokat végeztél eddig a szövegen',
+'tooltip-compareselectedversions' => 'A két kiválasztott változat közötti eltérések megjelenítése',
+'tooltip-watch' => 'Lap hozzáadása a figyelőlistádhoz',
+'tooltip-watchlistedit-normal-submit' => 'A kijelölt címek törlése',
+'tooltip-watchlistedit-raw-submit' => 'Figyelőlista frissítése',
+'tooltip-recreate' => 'A lap újra létrehozása a törlés ellenére',
+'tooltip-upload' => 'Feltöltés indítása',
+'tooltip-rollback' => '„Visszaállításâ€: egy kattintással visszavonja az utolsó felhasználó egy vagy több szerkesztését.',
+'tooltip-undo' => '„Visszavonásâ€: visszavonja ezt a szerkesztést, valamint megnyitja a szerkesztÅ‘t elÅ‘nézet módban. A szerkesztési összefoglalóban meg lehet adni a visszavonás okát.',
+'tooltip-preferences-save' => 'Beállítások mentése',
+'tooltip-summary' => 'Adj meg egy rövid összefoglalót',
# Stylesheets
'common.css' => '/* Közös CSS az összes felületnek */',
@@ -2986,9 +3059,6 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
# Patrol log
'patrol-log-page' => 'Ellenőrzési napló (patrol)',
'patrol-log-header' => 'Ez az ellenőrzött változatok naplója.',
-'patrol-log-line' => 'ellenőrzöttnek jelölte a(z) $2 $1 $3',
-'patrol-log-auto' => '(automatikus)',
-'patrol-log-diff' => '$1 azonosítójú változatát',
'log-show-hide-patrol' => 'járőrnapló $1',
# Image deletion
@@ -3015,11 +3085,11 @@ A futtatása során kárt tehet a számítógépedben.",
'file-info' => 'fájlméret: $1, MIME-típus: $2',
'file-info-size' => '$1 × $2 képpont, fájlméret: $3, MIME-típus: $4',
'file-info-size-pages' => '$1 × $2 képpont, fájlméret: $3, MIME típus: $4, $5 oldal',
-'file-nohires' => '<small>Nem érhető el nagyobb felbontású változat.</small>',
+'file-nohires' => 'Nem érhető el nagyobb felbontású változat.',
'svg-long-desc' => 'SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3',
'show-big-image' => 'A kép nagyfelbontású változata',
-'show-big-image-preview' => '<small>Az előnézet mérete: $1</small>',
-'show-big-image-other' => '<small>Más felbontás: $1.</small>',
+'show-big-image-preview' => 'Az előnézet mérete: $1',
+'show-big-image-other' => 'További {{PLURAL:$2|felbontás|felbontások}}: $1.',
'show-big-image-size' => '$1 × $2 képpont',
'file-info-gif-looped' => 'ismétlődik',
'file-info-gif-frames' => '{{PLURAL:$1|egy|$1}} képkocka',
@@ -3039,6 +3109,13 @@ A futtatása során kárt tehet a számítógépedben.",
'bydate' => 'dátum szerint',
'sp-newimages-showfrom' => 'Új fájlok mutatása $1 $2 után',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|egy|$1}} másodperccel',
+'minutes' => '{{PLURAL:$1|egy|$1}} perccel',
+'hours' => '{{PLURAL:$1|egy|$1}} órával',
+'days' => '{{PLURAL:$1|egy|$1}} nappal',
+'ago' => '$1 ezelőtt',
+
# Bad image list
'bad_image_list' => 'A formátum a következő:
@@ -3535,13 +3612,6 @@ Ez a megerősítő e-mail $4-ig érvényes.',
'scarytranscludefailed' => '[$1 sablon letöltése sikertelen]',
'scarytranscludetoolong' => '[Az URL túl hosszú]',
-# Trackbacks
-'trackbackbox' => 'Visszakövetések ehhez a szócikkhez:<br />
-$1',
-'trackbackremove' => '([$1 törlése])',
-'trackbacklink' => 'Visszakövetés',
-'trackbackdeleteok' => 'A visszakövetés törlése sikerült.',
-
# Delete conflict
'deletedwhileediting' => "'''Figyelmeztetés:''' A lapot a szerkesztés megkezdése után törölték!",
'confirmrecreate' => "Miután elkezdted szerkeszteni, [[User:$1|$1]] ([[User talk:$1|vita]]) törölte ezt a lapot a következő indokkal:
@@ -3624,6 +3694,9 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
'watchlisttools-edit' => 'A figyelőlista megtekintése és szerkesztése',
'watchlisttools-raw' => 'A nyers figyelőlista szerkesztése',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|vita]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ismeretlen tag kiterjesztés: $1',
'duplicate-defaultsort' => 'Figyelem: a(z) „$2†rendezÅ‘kulcs felülírja a korábbit („$1â€).',
@@ -3679,8 +3752,7 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'specialpages' => 'Speciális lapok',
'specialpages-note' => '----
* Mindenki számára elérhető speciális lapok.
-* <span class="mw-specialpagerestricted">Korlátozott hozzáférésű speciális lapok.</span>
-* <span class="mw-specialpagecached">Csak gyorsítótárazott adatokat tartalmazó speciális lapok.</span>',
+* <span class="mw-specialpagerestricted">Korlátozott hozzáférésű speciális lapok.</span>',
'specialpages-group-maintenance' => 'Ãllapotjelentések',
'specialpages-group-other' => 'További speciális lapok',
'specialpages-group-login' => 'Bejelentkezés / fiók létrehozása',
@@ -3722,13 +3794,16 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'tags-hitcount' => '{{PLURAL:$1|Egy|$1}} változtatás',
# Special:ComparePages
-'comparepages' => 'Lapok összehasonlítása',
-'compare-selector' => 'Lapváltozatok összehasonlítása',
-'compare-page1' => '1. lap',
-'compare-page2' => '2. lap',
-'compare-rev1' => '1. változat',
-'compare-rev2' => '2. változat',
-'compare-submit' => 'Összehasonlítás',
+'comparepages' => 'Lapok összehasonlítása',
+'compare-selector' => 'Lapváltozatok összehasonlítása',
+'compare-page1' => '1. lap',
+'compare-page2' => '2. lap',
+'compare-rev1' => '1. változat',
+'compare-rev2' => '2. változat',
+'compare-submit' => 'Összehasonlítás',
+'compare-invalid-title' => 'A megadott cím érvénytelen.',
+'compare-title-not-exists' => 'A megadott cím nem létezik.',
+'compare-revision-not-exists' => 'A megadott lapváltozat nem létezik.',
# Database error messages
'dberr-header' => 'A wikivel problémák vannak',
@@ -3755,4 +3830,89 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'sqlite-has-fts' => '$1 teljes szöveges keresés támogatással',
'sqlite-no-fts' => '$1 teljes szöveges keresés támogatása nélkül',
+# New logging system
+'logentry-delete-delete' => '$1 törölte a következő lapot: $3',
+'logentry-delete-restore' => '$1 helyreállította a következő lapot: $3',
+'logentry-delete-event' => '$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát $3 lapon: $4',
+'logentry-delete-revision' => '$1 módosította a(z) $3 című lap {{PLURAL:$5|egy|$1}} lapváltozatának láthatóságát: $4',
+'logentry-delete-event-legacy' => '$1 módosította a(z) $3 című lap naplóbejegyzéseinek láthatóságát',
+'logentry-delete-revision-legacy' => '$1 módosította a(z) $3 című lap lapváltozatainak láthatóságát',
+'logentry-suppress-delete' => '$1 elrejtette a következő lapot: $3',
+'logentry-suppress-event' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát $3 lapon: $4',
+'logentry-suppress-revision' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy változat|$5 változat}} láthatóságát $3 lapon: $4',
+'logentry-suppress-event-legacy' => '$1 rejtetten megváltoztatta napló bejegyzések láthatóságát a(z) $3 lapon',
+'logentry-suppress-revision-legacy' => '$1 rejtetten megváltoztatta változatok láthatóságát a(z) $3 lapon',
+'revdelete-content-hid' => 'tartalom elrejtve',
+'revdelete-summary-hid' => 'szerkesztési összefoglaló elrejtve',
+'revdelete-uname-hid' => 'szerkesztő elrejtve',
+'revdelete-content-unhid' => 'tartalom megjelenítve',
+'revdelete-summary-unhid' => 'szerkesztési összefoglalás megjelenítve',
+'revdelete-uname-unhid' => 'szerkesztő megjelenítve',
+'revdelete-restricted' => 'elrejtett az adminisztrátorok elől',
+'revdelete-unrestricted' => 'felfedett az adminisztrátoroknak',
+'logentry-move-move' => '$1 átnevezte a(z) $3 lapot a következő névre: $4',
+'logentry-move-move-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra átirányítás nélkül',
+'logentry-move-move_redir' => '$1 átmozgatta a(z) $3 lapot $4 lapra átirányítással',
+'logentry-move-move_redir-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra átirányítás nélkül',
+'logentry-patrol-patrol' => '$1 a(z) $3 lap $4 változatát ellenőrzöttnek jelölte',
+'logentry-patrol-patrol-auto' => '$1 a(z) $3 lap $4 változatát automatikusan ellenőrzöttnek jelölte',
+'logentry-newusers-newusers' => '$1 létrehozott egy felhasználói fiókot',
+'logentry-newusers-create' => '$1 létrehozott egy felhasználói fiókot',
+'logentry-newusers-create2' => '$1 létrehozott egy felhasználói fiókot $3',
+'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
+'newuserlog-byemail' => 'a jelszót kiküldtük a megadott e-mail címre',
+
+# Feedback
+'feedback-bugornote' => 'Ha kész technikai problémát részletesen leírni, akkor kérjük [$1 jelents egy hibát]. Egyébként használd az alábbi űrlapot. A hozzászólásod a „[$3 $2]†laphoz kerül felvételre, a szerkesztő neveddel és böngésződ típusával együtt.',
+'feedback-subject' => 'Tárgy:',
+'feedback-message' => 'Ãœzenet:',
+'feedback-cancel' => 'Mégse',
+'feedback-submit' => 'Visszajelzés elküldése',
+'feedback-adding' => 'Visszajelzés elmentése...',
+'feedback-error1' => 'Hiba: az API ismeretlen eredménnyel tért vissza',
+'feedback-error2' => 'Hiba: a szerkesztés nem sikerült',
+'feedback-error3' => 'Hiba: nem érkezett válasz az API-tól',
+'feedback-thanks' => 'Köszönjük. A visszajelzésed elküldve a „[$2 $1]†laphoz.',
+'feedback-close' => 'Kész',
+'feedback-bugcheck' => 'Nagyszerű! Ellenőrizd, hogy ez nem egy [$1 ismert hiba].',
+'feedback-bugnew' => 'Ellenőriztem. Új hiba jelentése',
+
+# API errors
+'api-error-badaccess-groups' => 'Nincs jogod fájlokat feltölteni erre a wikire.',
+'api-error-badtoken' => 'Belső hiba: hibás token.',
+'api-error-copyuploaddisabled' => 'Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.',
+'api-error-duplicate' => 'Már van {{PLURAL:$1|egy|néhány}} [$2 másik fájl] az oldalon ugyanilyen tartalommal',
+'api-error-duplicate-archive' => 'Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más [$2 más {{PLURAL:$1|fájl|fájlok}}] is ugyanezzel a tartalommal, de törlölve {{PLURAL:$1|lett|lettek}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Az azonos fájl, ami törölve lett|Azonos fájlok, amik törölve lettek}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duplikátum|Duplikátumok}}',
+'api-error-empty-file' => 'Az általad elküldött fájl üres volt.',
+'api-error-emptypage' => 'Új, üres lap létrehozása nem engedélyezett.',
+'api-error-fetchfileerror' => 'Belső hiba: valami baj történt a fájl beolvasása közben.',
+'api-error-file-too-large' => 'Az általad elküldött fájl túl nagy.',
+'api-error-filename-tooshort' => 'A fájlnév túl rövid.',
+'api-error-filetype-banned' => 'Tiltott fájltípus.',
+'api-error-filetype-missing' => 'Hiányzik a fájl kiterjesztése.',
+'api-error-hookaborted' => 'Az általad kezdeményezett módosítást nem lehet végrehajtani. (Egy bővítmény megakadályozta.)',
+'api-error-http' => 'Belső hiba: nem sikerült kapcsolódni a kiszolgálóhoz.',
+'api-error-illegal-filename' => 'Nem megengedett fájlnév.',
+'api-error-internal-error' => 'Belső hiba: valami baj történt a feltöltésed feldolgozása közben.',
+'api-error-invalid-file-key' => 'Belső hiba: a fájl nem található az ideiglenes tárhelyen.',
+'api-error-missingparam' => 'Belső hiba: paraméterek hiányoznak a kérésből.',
+'api-error-missingresult' => 'Belső hiba: nem sikerült megállapítani, hogy a másolás sikeres volt-e.',
+'api-error-mustbeloggedin' => 'Be kell jelentkezned fájlok feltöltéséhez.',
+'api-error-mustbeposted' => 'Belső hiba: a kérésnek HTTP POST-nak kell lennie.',
+'api-error-noimageinfo' => 'A feltöltés sikerült, de a szerver nem szolgáltatott semmilyen információt a fájlról.',
+'api-error-nomodule' => 'Belső hiba: nincs feltöltőmodul beállítva.',
+'api-error-ok-but-empty' => 'Belső hiba: nem érkezett válasz a kiszolgálótól.',
+'api-error-overwrite' => 'Létező fájlok felülírására nem engedélyezett.',
+'api-error-stashfailed' => 'Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.',
+'api-error-timeout' => 'A kiszolgáló nem adott választ a várt időn belül.',
+'api-error-unclassified' => 'Ismeretlen hiba történt',
+'api-error-unknown-code' => 'Ismeretlen hiba: „$1â€',
+'api-error-unknown-error' => 'Belső hiba: valami baj történt a fájl feltöltése közben.',
+'api-error-unknown-warning' => 'Ismeretlen figyelmeztetés: $1',
+'api-error-unknownerror' => 'Ismeretlen hiba: „$1â€.',
+'api-error-uploaddisabled' => 'A feltöltés le van tiltva ezen a wikin.',
+'api-error-verification-error' => 'A fájl feltehetőleg sérült, vagy hibás a kiterjesztése.',
+
);
diff --git a/languages/messages/MessagesHy.php b/languages/messages/MessagesHy.php
index 205ec28b..c46f8e33 100644
--- a/languages/messages/MessagesHy.php
+++ b/languages/messages/MessagesHy.php
@@ -91,109 +91,109 @@ $bookstoreList = array(
);
$magicWords = array(
- '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', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„Ô»ÕÔ¸', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸_ÕÔµÕŒ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕŽÔ±Õ†_Õ€Ô±ÕŠÔ±ÕŽÕˆÕ’Õ„Ô¸', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ•ÕÔ¸', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ•ÕÔ¸_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ•ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÕÔ±ÕÔ»Õ†', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô¸', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÔºÔ±Õ„Ô¸', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„Ô»ÕÔ¸', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸_ÕÔµÕŒ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕŽÔ±Õ†_Õ€Ô±ÕŠÔ±ÕŽÕˆÕ’Õ„Ô¸', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ•ÕÔ¸', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ•ÕÔ¸_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ•ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÕÔ±ÕÔ»Õ†', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô¸', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÔºÔ±Õ„Ô¸', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'Ô·Õ‹ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Õ†ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'Õ–Ô±Õ…Ô¼ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'Õ„Ô±ÕÕ†Ô±Ô¿Ô»Õ‘Õ†ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFUSERS' ),
- 'pagename' => array( '1', 'Ô·Õ‹Ô»_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'Ô·Õ‹Ô»_Ô±Õ†ÕˆÕ’Õ†Ô¸_2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'Ô±Õ†ÕŽÔ±Õ†Ô±ÕÔ±ÕÔ±Ô¾Õ”', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'Ô±Õ†ÕŽÔ±Õ†Ô±ÕÔ±ÕÔ±Ô¾Õ”_2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_ÕÔ±ÕÔ±Ô¾Õ”Ô¸', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_ÕÔ±ÕÔ±Ô¾Õ”Ô¸_2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Õ†ÔµÕÔ»_ÕÔ±ÕÔ±Ô¾Õ”Ô¸', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Õ†ÔµÕÔ»_ÕÔ±ÕÔ±Ô¾Õ”Ô¸_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ARTICLESPACE', 'Ô·Õ‹Ô»_Ô¼ÕÔ»ÕŽ_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'Ô·Õ‹Ô»_Ô¼ÕÔ»ÕŽ_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ÔµÕ†Ô¹Ô±Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ÔµÕ†Ô¹Ô±Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'Õ€Ô»Õ„Õ†Ô±Ô¿Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'Õ€Ô»Õ„Õ†Ô±Ô¿Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Ô»_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Ô»_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'Õ€ÕˆÕ‚ÕˆÕÔ´Õ', 'MSG:' ),
- 'msgnw' => array( '0', 'Õ€ÕˆÕ‚ÕˆÕÔ´_ԱՌԱՆՑ_ÕŽÔ»Õ”Ô»Ô»Õ', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'Õ´Õ«Õ¶Õ«', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'Õ´Õ«Õ¶Õ«=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'Õ¡Õ»Õ«Ö', 'right' ),
- 'img_left' => array( '1', 'Õ±Õ¡Õ­Õ«Ö', 'left' ),
- 'img_none' => array( '1', 'Õ¡Õ¼Õ¡Õ¶Ö', 'none' ),
- 'img_width' => array( '1', '$1ÖƒÖ„Õ½', '$1px' ),
- 'img_center' => array( '1', 'Õ¯Õ¥Õ¶Õ¿Ö€Õ¸Õ¶', 'center', 'centre' ),
- 'img_framed' => array( '1', 'Õ·Ö€Õ»Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬', 'framed', 'enframed', 'frame' ),
- 'img_page' => array( '1', 'Õ§Õ»Õ¨=$1', 'Õ§Õ» $1', 'page=$1', 'page $1' ),
- 'int' => array( '0', 'Õ†ÔµÕÕ”Õ', 'INT:' ),
- 'sitename' => array( '1', 'Ô¿Ô±Õ…Õ”Ô»_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'SITENAME' ),
- 'ns' => array( '0', 'Ô±ÕÕ', 'NS:' ),
- 'localurl' => array( '0', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ€Ô±ÕÕ‘ÔµÕ†Õ', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ€Ô±ÕÕ‘ÔµÕ†_2Õ', 'LOCALURLE:' ),
- 'server' => array( '0', 'ÕÔµÕÕŽÔµÕÔ¸', 'SERVER' ),
- 'servername' => array( '0', 'ÕÔµÕÕŽÔµÕÔ»_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ÕÕ”ÕÔ»ÕŠÕÔ»_ÕƒÔ±Õ†Ô±ÕŠÔ±ÕÕ€Ô¸', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'Õ€ÕˆÔ¼ÕˆÕŽÕ›', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__ԱՌԱՆՑ_ÕŽÔµÕÕ†Ô±Ô³ÕÔ»_Õ“ÕˆÕ“ÕˆÔ½Õ„Ô±Õ†__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__ԱՌԱՆՑ_ÕŠÔ±ÕÕˆÕ’Õ†Ô±Ô¿ÕˆÕ’Ô¹Õ…Ô±Õ†_Õ“ÕˆÕ“ÕˆÔ½Õ„Ô±Õ†__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ‡Ô±Ô²Ô±Ô¹Ô¸', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ‡Ô±Ô²Ô±Ô¹ÕŽÔ±_Õ•ÕÔ¸', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ‡Ô±Ô²Ô±Ô¹ÕŽÔ¸', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ‡Ô±Ô²Ô±Ô¹ÕŽÔ±_Õ•ÕÔ¸', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Õ€Ô±Õ„Ô±ÕÔ¸', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Õ•ÕÔ¸', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Õ•ÕÔ¸_2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Ô±Õ„Ô»ÕÔ¸', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_ÕÔ±ÕÔ»Õ†', 'REVISIONYEAR' ),
- 'plural' => array( '0', 'Õ€ÕˆÔ³Õ†Ô±Ô¿Ô»Õ', 'PLURAL:' ),
- 'fullurl' => array( '0', 'Ô¼ÕÔ»ÕŽ_Õ€Ô±ÕÕ‘ÔµÕ†Õ', 'FULLURL:' ),
- 'fullurle' => array( '0', 'Ô¼ÕÔ»ÕŽ_Õ€Ô±ÕÕ‘ÔµÕ†_2Õ', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'Õ“ÕˆÕ”ÕÔ±ÕÔ±ÕŒ_ÕÔ¿Ô¶Ô²Õ†Ô±ÕÔ±ÕŒÕ', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'Õ„ÔµÔ¾Ô±ÕÔ±ÕŒ_ÕÔ¿Ô¶Ô²Õ†Ô±ÕÔ±ÕŒÕ', 'UCFIRST:' ),
- 'lc' => array( '0', 'Õ“ÕˆÕ”ÕÔ±ÕÔ±ÕŒÕ', 'LC:' ),
- 'uc' => array( '0', 'Õ„ÔµÔ¾Ô±ÕÔ±ÕŒÕ', 'UC:' ),
- 'displaytitle' => array( '1', 'Õ‘ÕˆÕ’Õ…Õ‘_ÕÔ±Ô¼_ÕŽÔµÕÕ†Ô±Ô³Ô»ÕÔ¸', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Õ‰', 'R' ),
- 'newsectionlink' => array( '1', '__Õ€Õ‚ÕˆÕ’Õ„_Õ†ÕˆÕ_Ô²Ô±ÔºÕ†Ô»_ÕŽÕÔ±__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô¸', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'Õ„Õ‡Ô±Ô¿ÕŽÔ±Ô¾_Õ€Ô±ÕÕ‘ÔµÕ›', 'URLENCODE:' ),
- 'currenttimestamp' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô»_Ô´ÕÕˆÕ‡Õ„', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô»_Ô´ÕÕˆÕ‡Õ„', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'Õ†Ô±Õ„Ô±Ô¿Ô»_ÕˆÕ’Õ‚Õ‚ÕˆÕ’Ô¹Õ…ÕˆÕ’Õ†Ô¸', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#Ô¼ÔµÔ¶ÕˆÕ’Õ', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ÕŠÔ±ÕÕˆÕ’Õ†Ô±Ô¿ÕˆÕ’Ô¹Õ…Ô±Õ†_Ô¼ÔµÔ¶ÕˆÕ’Õ†', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'Ô·Õ‹ÔµÕ_Ô±Õ†ÕŽÔ±Õ†Ô±ÕÔ±ÕÔ±Ô¾Õ”ÕˆÕ’Õ„Õ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'Ô±Ô´Õ„Ô»Õ†Õ†ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ÕÔµÕŽÔµÔ¼_Ô¹Ô»ÕŽÔ¸', 'FORMATNUM' ),
- 'padleft' => array( '0', 'Ô¼ÕÔ±Õ‘Õ†ÔµÔ¼_ÕÔ±Ô½Ô»Õ‘', 'PADLEFT' ),
- 'padright' => array( '0', 'Ô¼ÕÔ±Õ‘Õ†ÔµÔ¼_Ô±Õ‹Ô»Õ‘', 'PADRIGHT' ),
- 'special' => array( '0', 'Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²', 'special' ),
- 'defaultsort' => array( '1', 'ԼՌՈՒԹՅԱՄԲ_Ô´Ô±ÕÔ±ÕŽÕˆÕÕˆÕ’Õ„Õ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ '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', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„Ô»ÕÔ¸', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸_ÕÔµÕŒ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕŽÔ±Õ†_Õ€Ô±ÕŠÔ±ÕŽÕˆÕ’Õ„Ô¸', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ•ÕÔ¸', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ•ÕÔ¸_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ•ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÕÔ±ÕÔ»Õ†', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô¸', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÔºÔ±Õ„Ô¸', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„Ô»ÕÔ¸', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸_ÕÔµÕŒ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Ô±Õ„ÕÕŽÔ±_Ô±Õ†ÕŽÔ±Õ†_Õ€Ô±ÕŠÔ±ÕŽÕˆÕ’Õ„Ô¸', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ•ÕÔ¸', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ•ÕÔ¸_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ•ÕÕŽÔ±_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÕÔ±ÕÔ»Õ†', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô¸', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÔºÔ±Õ„Ô¸', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'Ô·Õ‹ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Õ†ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Õ–Ô±Õ…Ô¼ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'Õ„Ô±ÕÕ†Ô±Ô¿Ô»Õ‘Õ†ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFUSERS' ),
+ 'pagename' => array( '1', 'Ô·Õ‹Ô»_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'Ô·Õ‹Ô»_Ô±Õ†ÕˆÕ’Õ†Ô¸_2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'Ô±Õ†ÕŽÔ±Õ†Ô±ÕÔ±ÕÔ±Ô¾Õ”', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'Ô±Õ†ÕŽÔ±Õ†Ô±ÕÔ±ÕÔ±Ô¾Õ”_2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_ÕÔ±ÕÔ±Ô¾Õ”Ô¸', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_ÕÔ±ÕÔ±Ô¾Õ”Ô¸_2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Õ†ÔµÕÔ»_ÕÔ±ÕÔ±Ô¾Õ”Ô¸', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Õ†ÔµÕÔ»_ÕÔ±ÕÔ±Ô¾Õ”Ô¸_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ARTICLESPACE', 'Ô·Õ‹Ô»_Ô¼ÕÔ»ÕŽ_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'Ô·Õ‹Ô»_Ô¼ÕÔ»ÕŽ_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ÔµÕ†Ô¹Ô±Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ÔµÕ†Ô¹Ô±Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'Õ€Ô»Õ„Õ†Ô±Ô¿Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'Õ€Ô»Õ„Õ†Ô±Ô¿Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'Õ”Õ†Õ†Ô±ÕÔ¿Õ„Ô±Õ†_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Ô»_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'Õ€ÕˆÔ´ÕŽÔ±Ô¾Ô»_Ô·Õ‹Ô»_Ô±Õ†ÕŽÔ±Õ†ÕˆÕ’Õ„Ô¸_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'Õ€ÕˆÕ‚ÕˆÕÔ´Õ', 'MSG:' ),
+ 'msgnw' => array( '0', 'Õ€ÕˆÕ‚ÕˆÕÔ´_ԱՌԱՆՑ_ÕŽÔ»Õ”Ô»Ô»Õ', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'Õ´Õ«Õ¶Õ«', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'Õ´Õ«Õ¶Õ«=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'Õ¡Õ»Õ«Ö', 'right' ),
+ 'img_left' => array( '1', 'Õ±Õ¡Õ­Õ«Ö', 'left' ),
+ 'img_none' => array( '1', 'Õ¡Õ¼Õ¡Õ¶Ö', 'none' ),
+ 'img_width' => array( '1', '$1ÖƒÖ„Õ½', '$1px' ),
+ 'img_center' => array( '1', 'Õ¯Õ¥Õ¶Õ¿Ö€Õ¸Õ¶', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'Õ·Ö€Õ»Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬', 'framed', 'enframed', 'frame' ),
+ 'img_page' => array( '1', 'Õ§Õ»Õ¨=$1', 'Õ§Õ» $1', 'page=$1', 'page $1' ),
+ 'int' => array( '0', 'Õ†ÔµÕÕ”Õ', 'INT:' ),
+ 'sitename' => array( '1', 'Ô¿Ô±Õ…Õ”Ô»_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'SITENAME' ),
+ 'ns' => array( '0', 'Ô±ÕÕ', 'NS:' ),
+ 'localurl' => array( '0', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ€Ô±ÕÕ‘ÔµÕ†Õ', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ€Ô±ÕÕ‘ÔµÕ†_2Õ', 'LOCALURLE:' ),
+ 'server' => array( '0', 'ÕÔµÕÕŽÔµÕÔ¸', 'SERVER' ),
+ 'servername' => array( '0', 'ÕÔµÕÕŽÔµÕÔ»_Ô±Õ†ÕˆÕ’Õ†Ô¸', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ÕÕ”ÕÔ»ÕŠÕÔ»_ÕƒÔ±Õ†Ô±ÕŠÔ±ÕÕ€Ô¸', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'Õ€ÕˆÔ¼ÕˆÕŽÕ›', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__ԱՌԱՆՑ_ÕŽÔµÕÕ†Ô±Ô³ÕÔ»_Õ“ÕˆÕ“ÕˆÔ½Õ„Ô±Õ†__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ԱՌԱՆՑ_ÕŠÔ±ÕÕˆÕ’Õ†Ô±Ô¿ÕˆÕ’Ô¹Õ…Ô±Õ†_Õ“ÕˆÕ“ÕˆÔ½Õ„Ô±Õ†__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ‡Ô±Ô²Ô±Ô¹Ô¸', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_Õ‡Ô±Ô²Ô±Ô¹ÕŽÔ±_Õ•ÕÔ¸', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ‡Ô±Ô²Ô±Ô¹ÕŽÔ¸', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_Õ‡Ô±Ô²Ô±Ô¹ÕŽÔ±_Õ•ÕÔ¸', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Õ€Ô±Õ„Ô±ÕÔ¸', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Õ•ÕÔ¸', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Õ•ÕÔ¸_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_Ô±Õ„Ô»ÕÔ¸', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô»_ÕÔ±ÕÔ»Õ†', 'REVISIONYEAR' ),
+ 'plural' => array( '0', 'Õ€ÕˆÔ³Õ†Ô±Ô¿Ô»Õ', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'Ô¼ÕÔ»ÕŽ_Õ€Ô±ÕÕ‘ÔµÕ†Õ', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'Ô¼ÕÔ»ÕŽ_Õ€Ô±ÕÕ‘ÔµÕ†_2Õ', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'Õ“ÕˆÕ”ÕÔ±ÕÔ±ÕŒ_ÕÔ¿Ô¶Ô²Õ†Ô±ÕÔ±ÕŒÕ', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'Õ„ÔµÔ¾Ô±ÕÔ±ÕŒ_ÕÔ¿Ô¶Ô²Õ†Ô±ÕÔ±ÕŒÕ', 'UCFIRST:' ),
+ 'lc' => array( '0', 'Õ“ÕˆÕ”ÕÔ±ÕÔ±ÕŒÕ', 'LC:' ),
+ 'uc' => array( '0', 'Õ„ÔµÔ¾Ô±ÕÔ±ÕŒÕ', 'UC:' ),
+ 'displaytitle' => array( '1', 'Õ‘ÕˆÕ’Õ…Õ‘_ÕÔ±Ô¼_ÕŽÔµÕÕ†Ô±Ô³Ô»ÕÔ¸', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Õ‰', 'R' ),
+ 'newsectionlink' => array( '1', '__Õ€Õ‚ÕˆÕ’Õ„_Õ†ÕˆÕ_Ô²Ô±ÔºÕ†Ô»_ÕŽÕÔ±__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÕÔ±ÕÔ²ÔµÕÔ±Ô¿Ô¸', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'Õ„Õ‡Ô±Ô¿ÕŽÔ±Ô¾_Õ€Ô±ÕÕ‘ÔµÕ›', 'URLENCODE:' ),
+ 'currenttimestamp' => array( '1', 'Ô¸Õ†Ô¹Ô±Õ‘Ô»Õ”_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô»_Ô´ÕÕˆÕ‡Õ„', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ÕÔµÕ‚Ô±Ô¿Ô±Õ†_ÔºÔ±Õ„Ô±Õ†Ô±Ô¿Ô»_Ô´ÕÕˆÕ‡Õ„', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'Õ†Ô±Õ„Ô±Ô¿Ô»_ÕˆÕ’Õ‚Õ‚ÕˆÕ’Ô¹Õ…ÕˆÕ’Õ†Ô¸', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#Ô¼ÔµÔ¶ÕˆÕ’Õ', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ÕŠÔ±ÕÕˆÕ’Õ†Ô±Ô¿ÕˆÕ’Ô¹Õ…Ô±Õ†_Ô¼ÔµÔ¶ÕˆÕ’Õ†', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'Ô·Õ‹ÔµÕ_Ô±Õ†ÕŽÔ±Õ†Ô±ÕÔ±ÕÔ±Ô¾Õ”ÕˆÕ’Õ„Õ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'Ô±Ô´Õ„Ô»Õ†Õ†ÔµÕÔ»_Õ”Ô±Õ†Ô±Ô¿Ô¸', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ÕÔµÕŽÔµÔ¼_Ô¹Ô»ÕŽÔ¸', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'Ô¼ÕÔ±Õ‘Õ†ÔµÔ¼_ÕÔ±Ô½Ô»Õ‘', 'PADLEFT' ),
+ 'padright' => array( '0', 'Ô¼ÕÔ±Õ‘Õ†ÔµÔ¼_Ô±Õ‹Ô»Õ‘', 'PADRIGHT' ),
+ 'special' => array( '0', 'Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ²', 'special' ),
+ 'defaultsort' => array( '1', 'ԼՌՈՒԹՅԱՄԲ_Ô´Ô±ÕÔ±ÕŽÕˆÕÕˆÕ’Õ„Õ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
);
$specialPageAliases = array(
@@ -623,14 +623,13 @@ $1',
Õ€Õ¡Õ¾Õ¡Õ¶Õ¡Õ¢Õ¡Ö€ Õ¡ÕµÕ¶ Õ¡Ö€Õ¤Õ¥Õ¶ Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ§ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¯Õ¸Õ²Õ´Õ«ÖÖ‰',
'badtitle' => 'Ô±Õ¶Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´',
'badtitletext' => 'Õ€Õ¡Ö€ÖÕ¾Õ¡Õ® Õ§Õ»Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨ Õ¡Õ¶Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬Õ« Õ§, Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§ Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ´Õ«Õ»-Õ¬Õ¥Õ¦Õ¾Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡Õ´ Õ«Õ¶Õ¿Õ¥Ö€Õ¾Õ«Ö„Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´ Õ§Ö‰ Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§, Õ¸Ö€ Õ¡ÕµÕ¶ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ¶Õ¥Ö€Ö‰',
-'perfcached' => 'Õ€Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€ÖÕ¾Õ¡Õ® Õ¥Õ¶ Ö„Õ¥Õ·Õ«Ö Ö‡ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¹Õ¡Ö€Õ¿Õ¡ÖÕ¸Õ¬Õ¥Õ¶ Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰',
-'perfcachedts' => 'Õ€Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€ÖÕ¾Õ¡Õ® Õ¥Õ¶ Ö„Õ¥Õ·Õ«Ö Ö‡ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¡Õ¶Õ£Õ¡Õ´ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Õ¬ Õ¥Õ¶ $1Ö‰',
+'perfcached' => 'Õ€Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€ÖÕ¾Õ¡Õ® Õ¥Õ¶ Ö„Õ¥Õ·Õ«Ö Ö‡ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¹Õ¡Ö€Õ¿Õ¡ÖÕ¸Õ¬Õ¥Õ¶ Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Õ€Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€ÖÕ¾Õ¡Õ® Õ¥Õ¶ Ö„Õ¥Õ·Õ«Ö Ö‡ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¡Õ¶Õ£Õ¡Õ´ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Õ¬ Õ¥Õ¶ $1Ö‰ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ô±ÕµÕ½ Õ§Õ»Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¸Ö‚Õ´Õ½ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¥Õ¶Ö‰ Ô±ÕµÕ½Õ¿Õ¥Õ²Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¡ÕµÕªÕ´ Õ¹Õ¥Õ¶ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ«Ö‰',
'wrong_wfQuery_params' => 'Ô±Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« ÕºÕ¡Ö€Õ¡Õ´Õ¥Õ¿Ö€Õ¥Ö€ wfQuery() Ö†Õ¸Ö‚Õ¶Õ¯ÖÕ«Õ¡ÕµÕ« Õ°Õ¡Õ´Õ¡Ö€<br />
Õ–Õ¸Ö‚Õ¶Õ¯ÖÕ«Õ¡. $1<br />
Õ€Õ¡ÕµÖÕ¸Ö‚Õ´. $2',
'viewsource' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ¥Õ¬Õ¡Õ¿Õ¥Ö„Õ½Õ¿Õ¨',
-'viewsourcefor' => '«$1» էջի',
'actionthrottled' => 'Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¥Ö',
'actionthrottledtext' => 'ÕˆÖ€ÕºÕ¥Õ½ Õ°Õ¡Õ¯Õ¡-Õ½ÕºÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ´Õ«Õ»Õ¸Ö, Õ¡ÕµÕ½ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¹Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Õ¯Õ¡Õ¿Õ¡Ö€Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Ö€Õ³ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ°Õ¡Õ¿Õ¾Õ¡Õ®Õ« Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ ÖƒÕ¸Ö€Õ±Õ¥Õ¬ Õ¯Ö€Õ¯Õ«Õ¶ Õ´Õ« Ö„Õ¡Õ¶Õ« Ö€Õ¸ÕºÕ¥ Õ¡Õ¶ÖÖ‰',
'protectedpagetext' => 'Ô±ÕµÕ½ Õ§Õ»Õ¨ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
@@ -816,9 +815,6 @@ $2',
ÕÕ¥Ö€ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ IP-Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ§ $3, Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ´Õ¡Õ¶ Õ«Õ¤Õ¥Õ¶Õ¿Õ«Ö†Õ«Õ¯Õ¡Õ¿Õ¸Ö€Õ¨Õ $5Ö‰
Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¶Õ·Õ¥Õ¬ Õ¡ÕµÕ½ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ±Õ¥Ö€ Õ°Õ¡Ö€ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Ö‰",
'blockednoreason' => 'ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¹Õ« Õ¿Ö€Õ¾Õ¥Õ¬',
-'blockedoriginalsource' => "«'''$1'''» էջի տեքստը բերված է ստորև։",
-'blockededitsource' => "«'''$1'''» էջի '''ձեր խմբագրումները''' հետևյալն են.",
-'whitelistedittitle' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€ Õ°Õ¡Ö€Õ¯Õ¡Õ¾Õ¸Ö€ Õ§ Õ´Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£',
'whitelistedittext' => 'Ô±Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ $1 Õ§Õ»Õ¥Ö€Õ¨ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'confirmedittext' => 'Ô·Õ»Õ¥Ö€Õ« Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ«Ö Õ¡Õ¼Õ¡Õ» Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Õ¾Õ¡Õ¾Õ¥Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ§Õ¬-Õ°Õ¡Õ½ÖÕ¥Õ¶Ö‰
Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¶Õ·Õ¥Õ¬ Ö‡ Õ¾Õ¡Õ¾Õ¥Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ§Õ¬-ÖƒÕ¸Õ½Õ¿Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ±Õ¥Ö€ [[Special:Preferences|Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«]] Õ´Õ¥Õ»Ö‰',
@@ -994,8 +990,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'revdelete-unsuppress' => 'Õ€Õ¡Õ¶Õ¥Õ¬ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ«Ö',
'revdelete-log' => 'ÕŠÕ¡Õ¿Õ³Õ¡Õ¼.',
'revdelete-submit' => 'Ô¿Õ«Ö€Õ¡Õ¼Õ¥Õ¬ Õ¨Õ¶Õ¿Ö€Õ¾Õ¡Õ® {{PLURAL:$1|Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ«|Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ«}} Õ¾Ö€Õ¡',
-'revdelete-logentry' => '«[[$1]]»-ի տարբերակների տեսանելիությունը փոփոխված է',
-'logdelete-logentry' => '«[[$1]]»-ի իրադարձությունների տեսանելիությունը փոփոխված է',
'revdelete-success' => "'''ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ« Õ¿Õ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¢Õ¡Ö€Õ¥Õ°Õ¡Õ»Õ¸Õ² Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¡Õ® Õ§Ö‰'''",
'logdelete-success' => "'''Ô»Ö€Õ¡Õ¤Õ¡Ö€Õ±Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¿Õ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÖƒÕ¸ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§Ö‰'''",
'revdel-restore' => 'Õ“Õ¸Õ­Õ¥Õ¬ Õ¿Õ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ«Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
@@ -1098,7 +1092,7 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'prefs-rc' => 'ÕŽÕ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
'prefs-watchlist' => 'Õ€Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯',
'prefs-watchlist-days' => 'Õ€Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Õ² Ö…Ö€Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨Õ',
-'prefs-watchlist-days-max' => '(7 Ö…Ö€Õ«Ö Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Ô¸Õ¶Õ¤Õ¡Ö€Õ±Õ¡Õ¯Õ¾Õ¡Õ® Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Õ² Ö…Ö€Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨Õ',
'prefs-watchlist-edits-max' => '(1000-Õ«Ö Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬)',
'prefs-watchlist-token' => 'Õ€Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ« Õ¯Õ¿Ö€Õ¸Õ¶.',
@@ -1602,11 +1596,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'activeusers' => 'Ô±Õ¯Õ¿Õ«Õ¾ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯',
# Special:Log/newusers
-'newuserlogpage' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
-'newuserlogpagetext' => 'ÕÕ¡ Õ¶Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¶ Õ§.',
-'newuserlog-create-entry' => 'Õ†Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö',
-'newuserlog-create2-entry' => 'Õ½Õ¿Õ¥Õ²Õ®Õ¥Ö Õ¶Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ Õ°Õ¡Õ·Õ«Õ¾ $1',
-'newuserlog-autocreate-entry' => 'Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿Õ«Õ¯ Õ°Õ¡Õ·Õ¾Õ« Õ½Õ¿Õ¥Õ²Õ®Õ¸Ö‚Õ´',
+'newuserlogpage' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
+'newuserlogpagetext' => 'ÕÕ¡ Õ¶Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¶ Õ§.',
# Special:ListGroupRights
'listgrouprights-members' => '(Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯)',
@@ -1711,7 +1702,6 @@ $NEWPAGE
'actioncomplete' => 'Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¾Õ¡Ö€Õ¿Õ¾Õ¡Õ® Õ§',
'deletedtext' => '«$1» էջը ջնջված է։
ÕÕ¥Õ½ $2Õ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
-'deletedarticle' => 'ջնջված է «[[$1]]»',
'dellogpage' => 'Õ‹Õ¶Õ»Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
'dellogpagetext' => 'ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ§ Õ¡Õ´Õ¥Õ¶Õ¡Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ»Õ¶Õ»Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨Ö‰',
'deletionlog' => 'Õ»Õ¶Õ»Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
@@ -1803,7 +1793,6 @@ $NEWPAGE
'undeletereset' => 'Õ„Õ¡Ö„Ö€Õ¥Õ¬',
'undeleteinvert' => 'Õ‡Ö€Õ»Õ¥Õ¬ Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
'undeletecomment' => 'Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶.',
-'undeletedarticle' => '«[[$1]]» վերականգնված է',
'undeletedrevisions' => 'Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¥Ö $1 Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯',
'undeletedrevisions-files' => 'Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¥Ö $1 {{PLURAL:$1|Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯}} Ö‡ $2 {{PLURAL:$2|Õ¶Õ«Õ·Ö„}}',
'undeletedfiles' => 'Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¾Õ¥Ö $1 {{PLURAL:$1|Õ¶Õ«Õ·Ö„}}',
@@ -2001,8 +1990,6 @@ $1',
'talkexists' => "'''Ô·Õ»Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¾Õ¥Ö, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ¯ÖÕ¾Õ¡Õ® Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ§Õ»Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§Ö€ Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¶Õ¸Ö€ Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ´Õ¢ Õ§Õ» Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥Ö€Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ«Õ¡Õ±Õ¸Ö‚Õ¬Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö„ Õ±Õ¥Õ¼Ö„Õ¸Õ¾Ö‰'''",
'movedto' => 'Õ¿Õ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§',
'movetalk' => 'ÕÕ¥Õ²Õ¡ÖƒÕ¸Õ­Õ¥Õ¬ Õ¦Õ¸Ö‚Õ£Õ¡Õ¯ÖÕ¾Õ¡Õ® Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ§Õ»Õ¨',
-'1movedto2' => '«[[$1]]» վերանվանված է «[[$2]]»',
-'1movedto2_redir' => '«[[$1]]» վերանվանված է «[[$2]]» վերահղմամբ',
'movelogpage' => 'ÕÕ¥Õ²Õ¡ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
'movelogpagetext' => 'ÕÕ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ§ Õ¾Õ¥Ö€Õ¡Õ¶Õ¾Õ¡Õ¶Õ¾Õ¡Õ® Õ§Õ»Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ¨Ö‰',
'movereason' => 'ÕŠÕ¡Õ¿Õ³Õ¡Õ¼.',
@@ -2196,8 +2183,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => 'ÕŠÕ¡Ö€Õ¥Õ¯Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
-'patrol-log-line' => 'Õ¶Õ·Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ§ $1Õ $2-Õ«Ö, ÕºÕ¡Ö€Õ¥Õ¯Õ¾Õ¥Õ¬ Õ§ $3',
-'patrol-log-auto' => '(Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿)',
# Image deletion
'deletedrevision' => 'Õ‹Õ¶Õ»Õ¾Õ¡Õ® Õ§ Õ°Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨ $1',
@@ -2221,7 +2206,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 էջեր',
'file-info' => 'Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ $1, MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ $2',
'file-info-size' => '$1 × $2 ÖƒÕ«Ö„Õ½Õ¥Õ¬, Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ¨Õ $3, MIME-Õ¿Õ¥Õ½Õ¡Õ¯Õ¨Õ $4',
-'file-nohires' => '<small>Ô²Õ¡Ö€Õ±Ö€ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯ Õ¹Õ¯Õ¡Ö‰</small>',
+'file-nohires' => 'Ô²Õ¡Ö€Õ±Ö€ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯ Õ¹Õ¯Õ¡Ö‰',
'svg-long-desc' => 'SVG-Õ¶Õ«Õ·Ö„, Õ¡Õ¶Õ¾Õ¡Õ¶Õ¡ÕºÕ¥Õ½ $1 × $2 ÖƒÕ«Ö„Õ½Õ¥Õ¬, Õ¶Õ«Õ·Ö„Õ« Õ¹Õ¡ÖƒÕ¨Õ $3',
'show-big-image' => 'Ô¼Ö€Õ«Õ¾ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢',
@@ -2236,9 +2221,9 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'Õ¾',
-'minutes-abbrev' => 'Ö€',
-'hours-abbrev' => 'Õª',
+'seconds-abbrev' => '$1 Õ¾',
+'minutes-abbrev' => '$1 Ö€',
+'hours-abbrev' => '$1 Õª',
# Bad image list
'bad_image_list' => 'Ô³Ö€Õ¡Õ±Ö‡Õ¨ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬Õ¶ Õ§.
@@ -2316,13 +2301,6 @@ $3
'scarytranscludefailed' => '[Õ‘Õ¡Õ¾Õ¸Ö„Õ $1 Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€Õ« Õ¯Õ¡Õ¶Õ¹Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Ö]',
'scarytranscludetoolong' => '[Õ‘Õ¡Õ¾Õ¸Ö„Õ URL-Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ¹Õ¡ÖƒÕ«Ö Õ¥Ö€Õ¯Õ¡Ö€ Õ§]',
-# Trackbacks
-'trackbackbox' => 'Ô±ÕµÕ½ Õ§Õ»Õ« Trackback-Õ¶Õ¥Ö€Õ¨.<br />
-$1',
-'trackbackremove' => '([$1 Õ»Õ¶Õ»Õ¥Õ¬])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback-Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¥ÖÖ‰',
-
# Delete conflict
'deletedwhileediting' => 'Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´. Õ±Õ¥Ö€ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´ Õ¡ÕµÕ½ Õ§Õ»Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ§Ö‰',
'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´]]) Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ»Õ¶Õ»Õ¥Õ¬ Õ§ Õ¡ÕµÕ½ Õ§Õ»Õ¨ Õ±Õ¥Ö€ Õ­Õ´Õ¡Õ¢Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ½Õ¯Õ½Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸Õ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾.
@@ -2431,4 +2409,9 @@ $1',
'dberr-problems' => 'Ô±ÕµÕ½ Õ¯Õ¡ÕµÖ„Õ¸Ö‚Õ´ Õ¡Õ¼Õ¡Õ»Õ¡ÖÕ¥Õ¬ Õ¥Õ¶ Õ¿Õ¥Õ­Õ¶Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ Õ­Õ¶Õ¤Õ«Ö€Õ¶Õ¥Ö€Ö‰ Õ€Õ¡ÕµÖÕ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ±Õ¥Ö€ Õ¶Õ¥Ö€Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨Ö‰',
'dberr-again' => 'Õ“Õ¸Ö€Õ±Õ¥Ö„ Õ´Õ« Ö„Õ¡Õ¶Õ« Ö€Õ¸ÕºÕ¥ Õ½ÕºÕ¡Õ½Õ¥Õ¬ Ö‡ Õ¾Õ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ§Õ»Õ¨Ö‰',
+# New logging system
+'logentry-delete-delete' => '$1 Õ»Õ¶Õ»Õ¥Ö Õ§Õ»Õ¨ $3',
+'logentry-delete-restore' => '$1 Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Ö Õ§Õ»Õ¨ $3',
+'logentry-newusers-create2' => '$1 ÕÕ¿Õ¥Õ²Õ®Õ¥Ö Õ¶Õ¸Ö€ Õ°Õ¡Õ·Õ«Õ¾ $3',
+
);
diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php
index 6a57b9c6..816d6673 100644
--- a/languages/messages/MessagesIa.php
+++ b/languages/messages/MessagesIa.php
@@ -46,12 +46,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'Tote_le_messages' ),
'Allpages' => array( 'Tote_le_paginas' ),
'Ancientpages' => array( 'Paginas_ancian' ),
+ 'Badtitle' => array( 'Titulo_invalide' ),
'Blankpage' => array( 'Pagina_vacue' ),
'Block' => array( 'Blocar', 'Blocar_IP', 'Blocar_usator' ),
'Blockme' => array( 'Blocar_me' ),
'Booksources' => array( 'Fontes_de_libros' ),
'BrokenRedirects' => array( 'Redirectiones_rupte' ),
'Categories' => array( 'Categorias' ),
+ 'ChangeEmail' => array( 'Cambiar_e-mail' ),
'ChangePassword' => array( 'Cambiar_contrasigno' ),
'ComparePages' => array( 'Comparar_paginas' ),
'Confirmemail' => array( 'Confirmar_e-mail' ),
@@ -61,6 +63,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Contributiones_delite' ),
'Disambiguations' => array( 'Disambiguationes' ),
'DoubleRedirects' => array( 'Redirectiones_duple' ),
+ 'EditWatchlist' => array( 'Modificar_observatorio' ),
'Emailuser' => array( 'Inviar_e-mail_a_un_usator' ),
'Export' => array( 'Exportar' ),
'Fewestrevisions' => array( 'Le_minus_versiones' ),
@@ -92,9 +95,11 @@ $specialPageAliases = array(
'Mycontributions' => array( 'Mi_contributiones' ),
'Mypage' => array( 'Mi_pagina' ),
'Mytalk' => array( 'Mi_discussion' ),
+ 'Myuploads' => array( 'Mi_files_incargate' ),
'Newimages' => array( 'Nove_files', 'Nove_imagines' ),
'Newpages' => array( 'Paginas_nove', 'Nove_paginas' ),
'PasswordReset' => array( 'Reinitialisar_contrasigno' ),
+ 'PermanentLink' => array( 'Ligamine_permanente' ),
'Popularpages' => array( 'Paginas_popular' ),
'Preferences' => array( 'Preferentias' ),
'Prefixindex' => array( 'Indice_de_prefixos' ),
@@ -111,6 +116,7 @@ $specialPageAliases = array(
'Specialpages' => array( 'Paginas_special' ),
'Statistics' => array( 'Statisticas' ),
'Tags' => array( 'Etiquettas' ),
+ 'Unblock' => array( 'Disblocar' ),
'Uncategorizedcategories' => array( 'Categorias_non_categorisate' ),
'Uncategorizedimages' => array( 'Files_non_categorisate', 'Imagines_non_categorisate' ),
'Uncategorizedpages' => array( 'Paginas_non_categorisate' ),
@@ -122,6 +128,7 @@ $specialPageAliases = array(
'Unusedtemplates' => array( 'Patronos_non_usate' ),
'Unwatchedpages' => array( 'Paginas_non_observate' ),
'Upload' => array( 'Incargar', 'Cargar' ),
+ 'UploadStash' => array( 'Pila_de_files_incargate' ),
'Userlogin' => array( 'Aperir_session', 'Identificar' ),
'Userlogout' => array( 'Clauder_session', 'Disconnecter' ),
'Userrights' => array( 'Derectos_de_usatores' ),
@@ -494,22 +501,24 @@ Per favor reporta isto a un [[Special:ListUsers/sysop|administrator]], faciente
'badarticleerror' => 'Iste action non pote esser effectuate super iste pagina.',
'cannotdelete' => 'Le pagina o file "$1" non poteva esser delite.
Es possibile que un altere persona lo ha ja delite.',
+'cannotdelete-title' => 'Non pote deler 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.',
-'perfcached' => 'Le sequente datos se recuperava del cache e possibilemente non es actual.',
-'perfcachedts' => 'Le sequente datos se recuperava del cache. Ultime actualisation: le $1.',
+'perfcached' => 'Le sequente datos esseva recuperate del cache e possibilemente non es actual. Un maximo de {{PLURAL:$1|un resultato|$1 resultatos}} es disponibile in le cache.',
+'perfcachedts' => 'Le sequente datos esseva recuperate del cache e ha essite actualisate le $3 a $4. Un maximo de {{PLURAL:$4|un resultato|$4 resultatos}} es disponibile in le cache.',
'querypage-no-updates' => 'Le actualisationes pro iste pagina es disactivate. Pro le momento, le datos hic non se cambiara.',
'wrong_wfQuery_params' => 'Parametros incorrecte a wfQuery()<br />
Function: $1<br />
Consulta: $2',
'viewsource' => 'Vider codice-fonte',
-'viewsourcefor' => 'de $1',
+'viewsource-title' => 'Le texto fonte de $1',
'actionthrottled' => 'Action limitate',
'actionthrottledtext' => 'Como mesura anti-spam, tu es limitate de executar iste action troppo de vices durante un curte periodo de tempore, e tu ha excedite iste limite.
Per favor reprova post alcun minutas.',
'protectedpagetext' => 'Iste pagina ha essite protegite contra modificationes.',
'viewsourcetext' => 'Tu pote vider e copiar le codice-fonte de iste pagina:',
+'viewyourtext' => "Tu pote vider e copiar le fonte de '''tu modificationes''' de iste pagina:",
'protectedinterface' => 'Iste pagina contine texto pro le interfacie del software, e es protegite pro impedir le abuso.',
'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.
@@ -620,6 +629,7 @@ Nos non inviara e-mail pro alcun del sequente functiones.',
'emailconfirmlink' => 'Confirmar tu adresse de e-mail',
'invalidemailaddress' => 'Le adresse de e-mail ha un formato invalide e non pote esser acceptate.
Entra un adresse ben formatate, o vacua ille campo.',
+'cannotchangeemail' => 'Le adresses de e-mail associate al contos non pote esser cambiate in iste wiki.',
'accountcreated' => 'Conto create',
'accountcreatedtext' => 'Le conto del usator $1 ha essite create.',
'createaccount-title' => 'Creation de un conto pro {{SITENAME}}',
@@ -636,6 +646,7 @@ Per favor attende ante de probar lo novemente.',
# E-mail sending
'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
+'user-mail-no-addy' => 'Tentava inviar e-mail sin adresse de e-mail.',
# Change password dialog
'resetpass' => 'Cambiar contrasigno',
@@ -657,16 +668,18 @@ Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasig
'resetpass-temp-password' => 'Contrasigno temporari:',
# Special:PasswordReset
-'passwordreset' => 'Reinitialisar contrasigno',
-'passwordreset-text' => 'Complete iste formulario pro reciper un rememoration in e-mail del datos de tu conto.',
-'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-username' => 'Nomine de usator:',
-'passwordreset-domain' => 'Dominio:',
-'passwordreset-email' => 'Adresse de e-mail:',
-'passwordreset-emailtitle' => 'Detalios del conto in {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Un persona (probabilemente tu, ab le adresse IP $1) requestava un rememoration del
+'passwordreset' => 'Reinitialisar contrasigno',
+'passwordreset-text' => 'Complete iste formulario pro reciper un rememoration in e-mail del datos de tu conto.',
+'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-username' => 'Nomine de usator:',
+'passwordreset-domain' => 'Dominio:',
+'passwordreset-capture' => 'Vider le e-mail resultante?',
+'passwordreset-capture-help' => 'Si tu marca iste quadrato, le e-mail (con le contrasigno temporari) non solmente essera inviate al usator, ma anque monstrate a te.',
+'passwordreset-email' => 'Adresse de e-mail:',
+'passwordreset-emailtitle' => 'Detalios del conto in {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Un persona (probabilemente tu, ab le adresse IP $1) requestava un rememoration del
detalios de tu conto in {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es
associate con iste adresse de e-mail:
@@ -677,7 +690,7 @@ Tu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona
requesta, o si tu te ha rememorate tu contrasigno original e non plus
vole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian
contrasigno.',
-'passwordreset-emailtext-user' => 'Le usator $1 in {{SITENAME}} requestava un rememoration del detalios de tu conto in {{SITENAME}}
+'passwordreset-emailtext-user' => 'Le usator $1 in {{SITENAME}} requestava un rememoration del detalios de tu conto in {{SITENAME}}
($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es associate con iste adresse de e-mail:
$2
@@ -687,9 +700,22 @@ Tu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona
requesta, o si tu te ha rememorate tu contrasigno original e non plus
vole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian
contrasigno.',
-'passwordreset-emailelement' => 'Nomine de usator: $1
+'passwordreset-emailelement' => 'Nomine de usator: $1
Contrasigno temporari: $2',
-'passwordreset-emailsent' => 'Un e-mail de rememoration ha essite inviate.',
+'passwordreset-emailsent' => 'Un e-mail de rememoration ha essite inviate.',
+'passwordreset-emailsent-capture' => 'Un e-mail de rememoration 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Cambiar adresse de e-mail',
+'changeemail-header' => 'Cambiar le adresse de e-mail del conto',
+'changeemail-text' => 'Completa iste formulario pro cambiar tu adresse de e-mail. Essera necessari entrar tu contrasigno pro confirmar iste cambio.',
+'changeemail-no-info' => 'Tu debe aperir un session pro poter acceder directemente a iste pagina.',
+'changeemail-oldemail' => 'Adresse de e-mail actual:',
+'changeemail-newemail' => 'Adresse de e-mail nove:',
+'changeemail-none' => '(nulle)',
+'changeemail-submit' => 'Cambiar e-mail',
+'changeemail-cancel' => 'Cancellar',
# Edit page toolbar
'bold_sample' => 'Texto grasse',
@@ -762,9 +788,6 @@ Nota que tu non pote utilisar le function "inviar e-mail a iste usator" salvo qu
Tu adresse IP actual es $3, e le ID del blocada es #$5.
Per favor include tote le detalios supra specificate in omne correspondentia.',
'blockednoreason' => 'nulle motivo specificate',
-'blockedoriginalsource' => "Le codice-fonte de '''$1''' se monstra infra:",
-'blockededitsource' => "Le texto de '''tu modificationes''' in '''$1''' se monstra infra:",
-'whitelistedittitle' => 'Identification requirite pro modificar',
'whitelistedittext' => 'Tu debe $1 pro poter modificar paginas.',
'confirmedittext' => 'Tu debe confirmar tu adresse de e-mail pro poter modificar paginas.
Per favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferences|preferentias de usator]].',
@@ -858,7 +881,7 @@ In addition, tu nos garanti que tu es le autor de isto, o que tu lo ha copiate d
Si tu non vole que tu scripto sia modificate impietosemente, alora non lo submitte hic.<br />
In addition, tu nos garanti que tu es le autor de isto, o que tu lo ha copiate de un ressource a dominio public o alteremente libere de derectos (vide $1 pro detalios).
'''Non submitte material subjecte a copyright sin autorisation expresse!'''",
-'longpageerror' => "'''Error: Le texto que tu submitteva occupa $1 kilobytes, excedente le maximo de $2 kilobytes.'''
+'longpageerror' => "'''Error: Le texto que tu submitteva occupa {{PLURAL:$1|un kilobyte|$1 kilobytes}}, excedente le maximo de {{PLURAL:$2|un kilobyte|$2 kilobytes}}.'''
Illo non pote esser salveguardate.",
'readonlywarning' => "'''Attention: Le base de datos ha essite blocate pro mantenentia, ergo tu non pote salveguardar tu modificationes in iste momento.'''
Nos recommenda copiar-e-collar le texto in un file de texto e salveguardar lo pro plus tarde.
@@ -1027,8 +1050,6 @@ Altere administratores in {{SITENAME}} continuara a poter acceder al contento ce
'revdelete-unsuppress' => 'Eliminar restrictiones super versiones restaurate',
'revdelete-log' => 'Motivo:',
'revdelete-submit' => 'Applicar al {{PLURAL:$1|version|versiones}} seligite',
-'revdelete-logentry' => 'cambiava le visibilitate de versiones pro [[$1]]',
-'logdelete-logentry' => 'cambiava le visibilitate de eventos pro [[$1]]',
'revdelete-success' => "'''Le visibilitate del version ha essite actualisate con successo.'''",
'revdelete-failure' => "'''Le visibilitate del version non poteva esser actualisate:'''
$1",
@@ -1040,15 +1061,6 @@ $1",
'revdel-restore-visible' => 'versiones visibile',
'pagehist' => 'Historia del pagina',
'deletedhist' => 'Historia delite',
-'revdelete-content' => 'contento',
-'revdelete-summary' => 'summario del modification',
-'revdelete-uname' => 'nomine de usator',
-'revdelete-restricted' => 'restrictiones applicate al administratores',
-'revdelete-unrestricted' => 'restrictiones eliminate pro administratores',
-'revdelete-hid' => 'celava $1',
-'revdelete-unhid' => 'revelava $1',
-'revdelete-log-message' => '$1 pro $2 {{PLURAL:$2|version|versiones}}',
-'logdelete-log-message' => '$1 pro $2 {{PLURAL:$2|evento|eventos}}',
'revdelete-hide-current' => 'Error de celar le entrata del $2 a $1: iste es le version actual.
Illo non pote esser celate.',
'revdelete-show-no-access' => 'Error de revelar le entrata del $2 a $1: iste entrata ha essite marcate como "restringite".
@@ -1208,12 +1220,14 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
'prefs-rc' => 'Modificationes recente',
'prefs-watchlist' => 'Observatorio',
'prefs-watchlist-days' => 'Numero de dies a monstrar in le observatorio:',
-'prefs-watchlist-days-max' => 'Maximo 7 dies',
+'prefs-watchlist-days-max' => 'Maximo $1 {{PLURAL:$1|die|dies}}',
'prefs-watchlist-edits' => 'Numero maxime de modificationes a monstrar in le observatorio expandite:',
'prefs-watchlist-edits-max' => 'Numero maxime: 1000',
'prefs-watchlist-token' => 'Indicio pro le observatorio:',
'prefs-misc' => 'Misc',
'prefs-resetpass' => 'Cambiar contrasigno',
+'prefs-changeemail' => 'Cambiar e-mail',
+'prefs-setemail' => 'Definir un adresse de e-mail',
'prefs-email' => 'Optiones de e-mail',
'prefs-rendering' => 'Apparentia',
'saveprefs' => 'Confirmar',
@@ -1273,6 +1287,7 @@ Le operation non pote esser disfacite.',
'yourrealname' => 'Nomine real:',
'yourlanguage' => 'Lingua:',
'yourvariant' => 'Variante de lingua de contento:',
+'prefs-help-variant' => 'Le variante o orthographia preferite pro le paginas de contento de iste wiki.',
'yournick' => 'Signatura:',
'prefs-help-signature' => 'Commentos in paginas de discussion debe esser signate con "<nowiki>~~~~</nowiki>" que essera convertite in tu signatura e un indication del data e hora.',
'badsig' => 'Signatura crude invalide; verificar le etiquettas HTML.',
@@ -1313,7 +1328,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'userrights-lookup-user' => 'Gerer gruppos de usatores',
'userrights-user-editname' => 'Entra un nomine de usator:',
'editusergroup' => 'Modificar gruppos de usatores',
-'editinguser' => "Cambiamento del derectos del usator '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Cambia le derectos del usator '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Modificar gruppos de usatores',
'saveusergroups' => 'Salveguardar gruppos de usatores',
'userrights-groupsmember' => 'Membro de:',
@@ -1407,13 +1422,13 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'right-autopatrol' => 'Marcar automaticamente le proprie modificationes como patruliate',
'right-patrolmarks' => 'Vider marcas de patrulia in le modificationes recente',
'right-unwatchedpages' => 'Vider un lista de paginas non observate',
-'right-trackback' => 'Submitter un retroligamine',
'right-mergehistory' => 'Fusionar le historia de paginas',
'right-userrights' => 'Modificar tote le derectos de usator',
'right-userrights-interwiki' => 'Modificar le derectos de usatores in altere wikis',
'right-siteadmin' => 'Blocar e disblocar le base de datos',
'right-override-export-depth' => 'Exportar paginas includente paginas ligate usque a un profunditate de 5',
'right-sendemail' => 'Inviar e-mail a altere usatores',
+'right-passwordreset' => 'Vider le e-mails pro reinitialisar le contrasigno',
# User rights log
'rightslog' => 'Registro de derectos de usator',
@@ -1447,16 +1462,17 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'action-suppressionlog' => 'vider iste registro private',
'action-block' => 'blocar iste usator de facer modificationes',
'action-protect' => 'cambiar le nivellos de protection pro iste pagina',
+'action-rollback' => 'revocar rapidemente le modificationes del ultime usator qui modificava un particular pagina',
'action-import' => 'importar iste pagina ab un altere wiki',
'action-importupload' => 'importar iste pagina ex un file incargate',
'action-patrol' => 'marcar le modificationes de alteros como patruliate',
'action-autopatrol' => 'haber tu modification marcate como patruliate',
'action-unwatchedpages' => 'vider le lista de paginas non observate',
-'action-trackback' => 'submitter un trackback',
'action-mergehistory' => 'fusionar le historia de iste pagina',
'action-userrights' => 'modificar tote le derectos de usator',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modification|modificationes}}',
@@ -1488,6 +1504,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'number_of_watching_users_pageview' => '[observate per $1 {{PLURAL:$1|usator|usatores}}]',
'rc_categories' => 'Limite a categorias (separar con "|")',
'rc_categories_any' => 'Qualcunque',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} post cambio',
'newsectionsummary' => '/* $1 */ nove section',
'rc-enhanced-expand' => 'Revelar detalios (require JavaScript)',
'rc-enhanced-hide' => 'Celar detalios',
@@ -1542,6 +1559,7 @@ Vide le [[Special:NewFiles|galeria de nove files]] pro un presentation plus visu
'minlength1' => 'Le nomines de file debe haber al minus un littera.',
'illegalfilename' => 'Le nomine de file "$1" contine characteres que non es permittite in le titulos de paginas.
Per favor renomina le file e tenta re-incargar lo.',
+'filename-toolong' => 'Nomines de file non pote esser plus longe de 240 bytes.',
'badfilename' => 'Le nomine del imagine esseva cambiate a "$1".',
'filetype-mime-mismatch' => 'Le extension del nomine del file ".$1" non corresponde a su typo MIME detegite ($2).',
'filetype-badmime' => 'Non es permittite incargar files del typo MIME "$1".',
@@ -1654,6 +1672,41 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
'upload-unknown-size' => 'Dimension incognite',
'upload-http-error' => 'Un error HTTP occurreva: $1',
+# File backend
+'backend-fail-stream' => 'Non poteva transmitter le file $1.',
+'backend-fail-backup' => 'Non poteva facer un copia de reserva del file $1.',
+'backend-fail-notexists' => 'Le file $1 non existe.',
+'backend-fail-hashes' => 'Non poteva obtener le "hashes" (summas de controlo) del files pro comparation.',
+'backend-fail-notsame' => 'Un file non identic jam existe a $1.',
+'backend-fail-invalidpath' => '$1 non es un cammino valide de immagazinage.',
+'backend-fail-delete' => 'Impossibile deler file $1.',
+'backend-fail-alreadyexists' => 'Le file $1 jam existe.',
+'backend-fail-store' => 'Non poteva immagazinar le file $1 a $2',
+'backend-fail-copy' => 'Impossibile copiar file $1 a $2',
+'backend-fail-move' => 'Impossibile displaciar file $1 a $2',
+'backend-fail-opentemp' => 'Non poteva aperir file temporari.',
+'backend-fail-writetemp' => 'Non poteva scriber in file temporari.',
+'backend-fail-closetemp' => 'Non poteva clauder file temporari.',
+'backend-fail-read' => 'Non poteva leger le file $1',
+'backend-fail-create' => 'Non poteva crear le file $1',
+'backend-fail-readonly' => 'Le systema de immagazinage "$1" es actualmente in lectura sol. Le sequente motivo esseva specificate: "$2"',
+'backend-fail-synced' => 'Le file "$1" es in un stato inconsistente inter le systemas interne de immagazinage',
+'backend-fail-connect' => 'Impossibile connecter al systema de immagazinage "$1".',
+'backend-fail-internal' => 'Un error incognite occurreva in le systema de immagazinage "$1".',
+'backend-fail-contenttype' => 'Non poteva determinar le typo de contento del file a immagazinar in "$1".',
+'backend-fail-batchsize' => 'Le systema de immagazinage ha recipite un lot de $1 {{PLURAL:$1|operation|operationes}} de file; le limite es $2 {{PLURAL:$2|operation|operationes}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Impossibile disblocar "$1"; illo non es blocate.',
+'lockmanager-fail-closelock' => 'Non poteva clauder le file de serratura pro "$1".',
+'lockmanager-fail-deletelock' => 'Non poteva deler le file de serratura pro "$1".',
+'lockmanager-fail-acquirelock' => 'Non poteva acquirer un serratura pro "$1".',
+'lockmanager-fail-openlock' => 'Non poteva aperir le file de serratura pro "$1".',
+'lockmanager-fail-releaselock' => 'Non poteva liberar le file de serratura pro "$1".',
+'lockmanager-fail-db-bucket' => 'Non poteva contactar sufficiente bases de datos de serratura in situla $1.',
+'lockmanager-fail-db-release' => 'Non poteva liberar le serraturas sur le base de datos $1.',
+'lockmanager-fail-svr-release' => 'Non poteva liberar le serraturas sur le servitor $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Un error esseva incontrate durante le apertura del file pro verification de ZIP.',
'zip-wrong-format' => 'Le file specificate non es un file ZIP.',
@@ -1670,6 +1723,7 @@ Un verification correcte de su securitate es impossibile.',
'uploadstash-badtoken' => 'Le execution de iste action non succedeva, forsan proque le datos del session expirava. Tenta lo de novo.',
'uploadstash-errclear' => 'Le radimento del files non succedeva.',
'uploadstash-refresh' => 'Refrescar le lista de files',
+'invalid-chunk-offset' => 'Position de segmento invalide',
# img_auth script messages
'img-auth-accessdenied' => 'Accesso refusate',
@@ -1778,23 +1832,24 @@ Le description de su [$2 pagina de description] ibi es monstrate in basso.',
'filerevert-badversion' => 'Non existe un version local anterior de iste file con le data e hora providite.',
# File deletion
-'filedelete' => 'Deler $1',
-'filedelete-legend' => 'Deler file',
-'filedelete-intro' => "Tu es super le puncto de deler le file '''[[Media:$1|$1]]''' con tote su historia.",
-'filedelete-intro-old' => "Tu va deler le version de '''[[Media:$1|$1]]''' del [$4 $3 a $2].",
-'filedelete-comment' => 'Motivo:',
-'filedelete-submit' => 'Deler',
-'filedelete-success' => "'''$1''' ha essite delite.",
-'filedelete-success-old' => "Le version de '''[[Media:$1|$1]]''' del $3 a $2 ha essite delite.",
-'filedelete-nofile' => "'''$1''' non existe.",
-'filedelete-nofile-old' => "Non existe un version archivate de '''$1''' con le attributos specificate.",
-'filedelete-otherreason' => 'Motivo altere/additional:',
-'filedelete-reason-otherlist' => 'Altere motivo',
-'filedelete-reason-dropdown' => '*Motivos habitual pro deletion
+'filedelete' => 'Deler $1',
+'filedelete-legend' => 'Deler file',
+'filedelete-intro' => "Tu es super le puncto de deler le file '''[[Media:$1|$1]]''' con tote su historia.",
+'filedelete-intro-old' => "Tu va deler le version de '''[[Media:$1|$1]]''' del [$4 $3 a $2].",
+'filedelete-comment' => 'Motivo:',
+'filedelete-submit' => 'Deler',
+'filedelete-success' => "'''$1''' ha essite delite.",
+'filedelete-success-old' => "Le version de '''[[Media:$1|$1]]''' del $3 a $2 ha essite delite.",
+'filedelete-nofile' => "'''$1''' non existe.",
+'filedelete-nofile-old' => "Non existe un version archivate de '''$1''' con le attributos specificate.",
+'filedelete-otherreason' => 'Motivo altere/additional:',
+'filedelete-reason-otherlist' => 'Altere motivo',
+'filedelete-reason-dropdown' => '*Motivos habitual pro deletion
** Violation de copyright
** File duplicate',
-'filedelete-edit-reasonlist' => 'Modificar motivos pro deletion',
-'filedelete-maintenance' => 'Deletion e restauration de files temporarimente disactivate durante mantenentia.',
+'filedelete-edit-reasonlist' => 'Modificar motivos pro deletion',
+'filedelete-maintenance' => 'Deletion e restauration de files temporarimente disactivate durante mantenentia.',
+'filedelete-maintenance-title' => 'Non pote deler file',
# MIME search
'mimesearch' => 'Recerca de typo MIME',
@@ -1893,6 +1948,8 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
'wantedpages' => 'Paginas plus demandate',
'wantedpages-badtitle' => 'Titulo invalide in le gruppo de resultatos: $1',
'wantedfiles' => 'Files desirate',
+'wantedfiletext-cat' => 'Le sequente files es usate ma non existe. Le files ab depositos distante pote esser listate malgrado que illos existe. Omne tal false positives essera <del>cancellate</del>. In addition, paginas que incorpora files que non existe es listate in [[:$1]].',
+'wantedfiletext-nocat' => 'Le sequente files es usate ma non existe. Files ab depositos distante pote esser listate malgrado que illos existe. Omne tal false positives essera <del>cancellate</del>.',
'wantedtemplates' => 'Patronos desirate',
'mostlinked' => 'Paginas le plus ligate',
'mostlinkedcategories' => 'Categorias le plus ligate',
@@ -1901,6 +1958,7 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
'mostimages' => 'Files le plus utilisate',
'mostrevisions' => 'Paginas le plus modificate',
'prefixindex' => 'Tote le paginas con prefixo',
+'prefixindex-namespace' => 'Tote le paginas con prefixo (spatio de nomines $1)',
'shortpages' => 'Paginas curte',
'longpages' => 'Paginas longe',
'deadendpages' => 'Paginas sin exito',
@@ -2012,12 +2070,8 @@ Protocollos supportate: <tt>$1</tt> (non include alcun de istes in tu recerca).'
'activeusers-noresult' => 'Nulle usator trovate.',
# Special:Log/newusers
-'newuserlogpage' => 'Registro de creation de usatores',
-'newuserlogpagetext' => 'Isto es un registro de creation de usatores.',
-'newuserlog-byemail' => 'contrasigno inviate per e-mail',
-'newuserlog-create-entry' => 'Nove usator',
-'newuserlog-create2-entry' => 'creava le nove conto $1',
-'newuserlog-autocreate-entry' => 'Conto create automaticamente',
+'newuserlogpage' => 'Registro de creation de usatores',
+'newuserlogpagetext' => 'Isto es un registro de creation de usatores.',
# Special:ListGroupRights
'listgrouprights' => 'Derectos del gruppos de usatores',
@@ -2049,7 +2103,7 @@ pro inviar e-mail a altere usatores.',
Le adresse de e-mail que tu indicava in [[Special:Preferences|tu preferentias de usator]] apparera
como le adresse del expeditor del e-mail, de modo que le destinatario pote responder directemente a te.',
'usermailererror' => 'Le objecto de e-mail retornava le error:',
-'defemailsubject' => 'E-mail de {{SITENAME}}',
+'defemailsubject' => 'E-mail del usator "$1" de {{SITENAME}}',
'usermaildisabled' => 'E-mail a usatores disactivate',
'usermaildisabledtext' => 'Tu non pote inviar e-mail a altere usatores in iste wiki',
'noemailtitle' => 'Nulle adresse de e-mail',
@@ -2105,7 +2159,7 @@ render lo plus facile de deteger.",
'watchmethod-list' => 'cerca modificationes recente in paginas sub observation',
'watchlistcontains' => 'Tu observatorio contine $1 {{PLURAL:$1|pagina|paginas}}.',
'iteminvalidname' => "Problema con entrata '$1', nomine invalide...",
-'wlnote' => "Infra es le ultime {{PLURAL:$1|modification|'''$1''' modificationes}} durante le ultime {{PLURAL:$2|hora|'''$2''' horas}}.",
+'wlnote' => "Ecce le ultime {{PLURAL:$1|modification|'''$1''' modificationes}} durante le ultime {{PLURAL:$2|hora|'''$2''' horas}}, a partir del $3 a $4.",
'wlshowlast' => 'Revelar ultime $1 horas $2 dies $3',
'watchlist-options' => 'Optiones del observatorio',
@@ -2171,8 +2225,6 @@ Per favor confirma que tu ha le intention de facer isto, que tu comprende le con
'actionfailed' => 'Action fallite',
'deletedtext' => '"$1" ha essite delite.
Vide $2 pro un registro de deletiones recente.',
-'deletedarticle' => 'deleva "[[$1]]"',
-'suppressedarticle' => 'supprimeva "[[$1]]"',
'dellogpage' => 'Registro de deletiones',
'dellogpagetext' => 'Infra es un lista del plus recente deletiones.
Tote le horas es in le fuso horari del servitor.',
@@ -2224,7 +2276,10 @@ Vide le [[Special:ProtectedPages|lista de paginas protegite]] pro le lista de pr
'unprotectedarticle' => 'removeva le protection de "[[$1]]"',
'movedarticleprotection' => 'displaciava le configurationes de protection ab "[[$2]]" verso "[[$1]]"',
'protect-title' => 'Cambiar nivello de protection de "$1"',
+'protect-title-notallowed' => 'Vider nivello de protection de "$1"',
'prot_1movedto2' => 'displaciava [[$1]] verso [[$2]]',
+'protect-badnamespace-title' => 'Spatio de nomines non protegibile',
+'protect-badnamespace-text' => 'Le paginas in iste spatio de nomines non pote esser protegite.',
'protect-legend' => 'Confirmar protection',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Expiration:',
@@ -2246,6 +2301,7 @@ Tu pote cambiar le nivello de protection de iste pagina, ma isto non cambiara le
'protect-level-sysop' => 'Administratores solmente',
'protect-summary-cascade' => 'in cascada',
'protect-expiring' => 'expira le $1 (UTC)',
+'protect-expiring-local' => 'expira le $1',
'protect-expiry-indefinite' => 'infinite',
'protect-cascade' => 'Proteger le paginas includite in iste pagina (protection in cascada)',
'protect-cantedit' => 'Tu non pote cambiar le nivellos de protection de iste pagina proque tu non ha le permission de modificar lo.',
@@ -2307,7 +2363,6 @@ Es possibile que le adresse URL es invalide, o que le version ha essite restaura
'undeletereset' => 'Reinitialisar',
'undeleteinvert' => 'Inverter selection',
'undeletecomment' => 'Motivo:',
-'undeletedarticle' => 'restaurava "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 version|$1 versiones}} restaurate',
'undeletedrevisions-files' => '{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate',
'undeletedfiles' => '$1 {{PLURAL:$1|archivo|archivos}} restaurate',
@@ -2317,6 +2372,7 @@ es possibile que un altere persona ha ja restaurate le pagina.',
Consulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
'undelete-header' => 'Vide [[Special:Log/delete|le registro de deletiones]] pro un lista de paginas recentemente delite.',
+'undelete-search-title' => 'Cercar in paginas delite',
'undelete-search-box' => 'Cercar paginas delite',
'undelete-search-prefix' => 'Monstrar paginas que comencia con:',
'undelete-search-submit' => 'Cercar',
@@ -2326,6 +2382,7 @@ Consulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deleti
'undelete-cleanup-error' => 'Error durante le deletion del file de archivo non usate "$1".',
'undelete-missing-filearchive' => 'Impossibile restaurar le file con ID de archvo $1 proque illo non es presente in le base de datos.
Es possibile que illo ha ja essite restaurate.',
+'undelete-error' => 'Error durante le restauration del pagina',
'undelete-error-short' => 'Error durante le restauration del file: $1',
'undelete-error-long' => 'Se incontrava errores durante le restauration del file:
@@ -2450,6 +2507,7 @@ a un adresse IP blocate previemente.',
'blocklist-userblocks' => 'Celar blocadas de conto',
'blocklist-tempblocks' => 'Celar blocadas temporari',
'blocklist-addressblocks' => 'Celar blocadas de singule adresse IP',
+'blocklist-rangeblocks' => 'Celar blocadas de gruppos de adresses IP',
'blocklist-timestamp' => 'Data e hora',
'blocklist-target' => 'Objectivo',
'blocklist-expiry' => 'Expira',
@@ -2472,6 +2530,7 @@ a un adresse IP blocate previemente.',
'unblocklink' => 'disblocar',
'change-blocklink' => 'cambiar blocada',
'contribslink' => 'contributiones',
+'emaillink' => 'inviar e-mail',
'autoblocker' => 'Automaticamente blocate proque tu adresse IP ha recentemente essite usate per "[[User:$1|$1]]".
Le motivo specificate pro le blocada de $1 es: "$2"',
'blocklogpage' => 'Registro de blocadas',
@@ -2603,9 +2662,6 @@ Per favor fusiona los manualmente.'''",
'movepage-page-moved' => 'Le pagina $1 ha essite renominate a $2.',
'movepage-page-unmoved' => 'Le pagina $1 non poteva esser renominate a $2.',
'movepage-max-pages' => 'Le maximo de $1 {{PLURAL:$1|pagina|paginas}} ha essite renominate e nulle altere pagina pote esser renominate automaticamente.',
-'1movedto2' => 'renominava [[$1]] verso [[$2]]',
-'1movedto2_redir' => 'renominava [[$1]] verso [[$2]] trans redirection',
-'move-redirect-suppressed' => 'redirection supprimite',
'movelogpage' => 'Registro de renominationes',
'movelogpagetext' => 'Infra es un lista de paginas renominate.',
'movesubpage' => '{{PLURAL:$1|Subpagina|Subpaginas}}',
@@ -2618,7 +2674,7 @@ Per favor fusiona los manualmente.'''",
Le pagina de destination "[[:$1]]" existe ja.
Esque tu vole deler lo pro permitter le renomination?',
'delete_and_move_confirm' => 'Si, deler le pagina',
-'delete_and_move_reason' => 'Delite pro permitter renomination',
+'delete_and_move_reason' => 'Delite pro permitter le renomination de "[[$1]]"',
'selfmove' => 'Le titulos de origine e de destination es identic;
non pote renominar un pagina al mesme titulo.',
'immobile-source-namespace' => 'Non pote renominar paginas in le spatio de nomines "$1"',
@@ -2647,9 +2703,11 @@ Isto pote esser importate in un altere wiki que usa MediaWiki via le [[Special:I
Pro exportar paginas, entra le titulos in le quadro de texto infra, un titulo per linea, e indica si tu vole haber le version currente con tote le versiones ancian, con le lineas de historia de paginas, o simplemente le version actual con le informationes super le ultime modification.
In le secunde caso tu pote etiam usar un ligamine, p.ex. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pro le pagina "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Exportar tote le paginas',
'exportcuronly' => 'Includer solmente le version actual, non le historia complete',
'exportnohistory' => "----
'''Nota:''' Le exportation del historia de paginas complete per medio de iste formulario ha essite disactivate pro motivos concernente le prestationes del servitor.",
+'exportlistauthors' => 'Includer un lista complete de contributores pro cata pagina',
'export-submit' => 'Exportar',
'export-addcattext' => 'Adder paginas del categoria:',
'export-addcat' => 'Adder',
@@ -2682,6 +2740,8 @@ Per favor visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'thumbnail_error' => 'Error durante le creation del miniatura: $1',
'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',
+'thumbnail-dest-create' => 'Impossibile salveguardar le miniatura in su destination',
'thumbnail_invalid_params' => 'Parametros de miniatura invalide',
'thumbnail_dest_directory' => 'Impossibile crear directorio de destination',
'thumbnail_image-type' => 'typo de imagine non supportate',
@@ -2726,6 +2786,11 @@ Salveguarda lo in tu computator e incarga lo hic.',
'import-upload' => 'Incargar datos XML',
'import-token-mismatch' => 'Perdita del datos del session. Per favor reprova.',
'import-invalid-interwiki' => 'Non pote importar ab le wiki specificate.',
+'import-error-edit' => 'Le pagina "$1" non es importate proque tu non ha le permission de modificar lo.',
+'import-error-create' => 'Le pagina "$1" non es importate proque tu non ha le permission de crear lo.',
+'import-error-interwiki' => 'Le pagina "$1" non es importate perque su nomine es reservate pro ligation externe (interwiki).',
+'import-error-special' => 'Le pagina "$1" non es importate perque illo pertine a un spatio de nomines special que non permitte paginas.',
+'import-error-invalid' => 'Le pagina "$1" non es importate perque su nomine es invalide.',
# Import log
'importlogpage' => 'Registro de importationes',
@@ -2735,74 +2800,87 @@ Salveguarda lo in tu computator e incarga lo hic.',
'import-logentry-interwiki' => 'importava $1 transwiki',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|version|versiones}} desde $2',
+# JavaScriptTest
+'javascripttest' => 'Test de JavaScript',
+'javascripttest-disabled' => 'Iste function es disactivate.',
+'javascripttest-title' => 'Execution de $1 tests',
+'javascripttest-pagetext-noframework' => 'Iste pagina es reservate pro le execution de tests de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Structura de test "$1" incognite.',
+'javascripttest-pagetext-frameworks' => 'Per favor selige un del sequente structuras de test: $1',
+'javascripttest-pagetext-skins' => 'Selige un apparentia con le qual executar le tests:',
+'javascripttest-qunit-intro' => 'Vide [$1 documentation de tests] sur mediawiki.org.',
+'javascripttest-qunit-heading' => 'Programmas de test QUnit de JavaScript de MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tu pagina de usator',
-'tooltip-pt-anonuserpage' => 'Le pagina de usator pro le adresse IP desde le qual tu face modificationes',
-'tooltip-pt-mytalk' => 'Tu pagina de discussion',
-'tooltip-pt-anontalk' => 'Discussion super le modificationes facite desde iste adresse IP',
-'tooltip-pt-preferences' => 'Mi preferentias',
-'tooltip-pt-watchlist' => 'Le lista de paginas del quales tu seque le modificationes',
-'tooltip-pt-mycontris' => 'Lista de tu contributiones',
-'tooltip-pt-login' => 'Nos recommenda que tu te authentica, ma non es obligatori.',
-'tooltip-pt-anonlogin' => 'Nos recommenda que tu te authentica, ma non es obligatori.',
-'tooltip-pt-logout' => 'Clauder session',
-'tooltip-ca-talk' => 'Discussiones a proposito del pagina de contento',
-'tooltip-ca-edit' => 'Tu pote modificar iste pagina.
+'tooltip-pt-userpage' => 'Tu pagina de usator',
+'tooltip-pt-anonuserpage' => 'Le pagina de usator pro le adresse IP desde le qual tu face modificationes',
+'tooltip-pt-mytalk' => 'Tu pagina de discussion',
+'tooltip-pt-anontalk' => 'Discussion super le modificationes facite desde iste adresse IP',
+'tooltip-pt-preferences' => 'Mi preferentias',
+'tooltip-pt-watchlist' => 'Le lista de paginas del quales tu seque le modificationes',
+'tooltip-pt-mycontris' => 'Lista de tu contributiones',
+'tooltip-pt-login' => 'Nos recommenda que tu te authentica, ma non es obligatori.',
+'tooltip-pt-anonlogin' => 'Nos recommenda que tu te authentica, ma non es obligatori.',
+'tooltip-pt-logout' => 'Clauder session',
+'tooltip-ca-talk' => 'Discussiones a proposito del pagina de contento',
+'tooltip-ca-edit' => 'Tu pote modificar iste pagina.
Per favor usa le previsualisation ante de publicar.',
-'tooltip-ca-addsection' => 'Initiar un nove section',
-'tooltip-ca-viewsource' => 'Iste pagina es protegite. Tu pote vider su codice fonte.',
-'tooltip-ca-history' => 'Versiones anterior de iste pagina',
-'tooltip-ca-protect' => 'Proteger iste pagina',
-'tooltip-ca-unprotect' => 'Cambiar le protection de iste pagina',
-'tooltip-ca-delete' => 'Deler iste pagina',
-'tooltip-ca-undelete' => 'Restaurar le modificationes facite a iste pagina ante que illo esseva delite',
-'tooltip-ca-move' => 'Renominar iste pagina',
-'tooltip-ca-watch' => 'Adder iste pagina a tu observatorio',
-'tooltip-ca-unwatch' => 'Remover iste pagina de tu observatorio',
-'tooltip-search' => 'Cercar in {{SITENAME}}',
-'tooltip-search-go' => 'Visitar un pagina con iste nomine exacte si existe',
-'tooltip-search-fulltext' => 'Cercar iste texto in le paginas',
-'tooltip-p-logo' => 'Pagina principal',
-'tooltip-n-mainpage' => 'Visitar le pagina principal',
-'tooltip-n-mainpage-description' => 'Visitar le pagina principal',
-'tooltip-n-portal' => 'A proposito del projecto, que tu pote facer, ubi trovar cosas',
-'tooltip-n-currentevents' => 'Informationes de fundo a proposito de eventos actual',
-'tooltip-n-recentchanges' => 'Le lista de modificationes recente in le wiki.',
-'tooltip-n-randompage' => 'Visitar un pagina qualcunque',
-'tooltip-n-help' => 'Le solutiones de vostre problemas',
-'tooltip-t-whatlinkshere' => 'Lista de tote le paginas wiki con ligamines a iste pagina',
-'tooltip-t-recentchangeslinked' => 'Modificationes recente in le paginas al quales iste pagina contine ligamines',
-'tooltip-feed-rss' => 'Syndication RSS pro iste pagina',
-'tooltip-feed-atom' => 'Syndication Atom pro iste pagina',
-'tooltip-t-contributions' => 'Vider le lista de contributiones de iste usator',
-'tooltip-t-emailuser' => 'Inviar un e-mail a iste usator',
-'tooltip-t-upload' => 'Incargar files',
-'tooltip-t-specialpages' => 'Lista de tote le paginas special',
-'tooltip-t-print' => 'Version imprimibile de iste pagina',
-'tooltip-t-permalink' => 'Ligamine permanente a iste version del pagina',
-'tooltip-ca-nstab-main' => 'Vider le pagina de contento',
-'tooltip-ca-nstab-user' => 'Vider le pagina de usator',
-'tooltip-ca-nstab-media' => 'Vider le pagina de media',
-'tooltip-ca-nstab-special' => 'Isto es un pagina special, tu non pote modificar le pagina mesme',
-'tooltip-ca-nstab-project' => 'Vider le pagina de projecto',
-'tooltip-ca-nstab-image' => 'Vider le pagina del file',
-'tooltip-ca-nstab-mediawiki' => 'Vider le message del systema',
-'tooltip-ca-nstab-template' => 'Vider le patrono',
-'tooltip-ca-nstab-help' => 'Vider le pagina de adjuta',
-'tooltip-ca-nstab-category' => 'Vider le pagina del categoria',
-'tooltip-minoredit' => 'Marcar iste modification como minor',
-'tooltip-save' => 'Confirmar tu modificationes',
-'tooltip-preview' => 'Per favor verifica tu modificationes ante que tu los publica!',
-'tooltip-diff' => 'Detaliar le modificationes que tu ha facite in le texto.',
-'tooltip-compareselectedversions' => 'Vider le differentias inter le seligite duo versiones de iste pagina.',
-'tooltip-watch' => 'Adder iste pagina a tu observatorio',
-'tooltip-recreate' => 'Recrear le pagina nonobstante que illo ha essite delite',
-'tooltip-upload' => 'Comenciar le incargamento',
-'tooltip-rollback' => '"Revocar" reverte le modification(es) de iste pagina del ultime contributor con un singule clic.',
-'tooltip-undo' => '"Disfacer" reverte iste modification e aperi le formulario de modification in modo de previsualisation.
+'tooltip-ca-addsection' => 'Initiar un nove section',
+'tooltip-ca-viewsource' => 'Iste pagina es protegite. Tu pote vider su codice fonte.',
+'tooltip-ca-history' => 'Versiones anterior de iste pagina',
+'tooltip-ca-protect' => 'Proteger iste pagina',
+'tooltip-ca-unprotect' => 'Cambiar le protection de iste pagina',
+'tooltip-ca-delete' => 'Deler iste pagina',
+'tooltip-ca-undelete' => 'Restaurar le modificationes facite a iste pagina ante que illo esseva delite',
+'tooltip-ca-move' => 'Renominar iste pagina',
+'tooltip-ca-watch' => 'Adder iste pagina a tu observatorio',
+'tooltip-ca-unwatch' => 'Remover iste pagina de tu observatorio',
+'tooltip-search' => 'Cercar in {{SITENAME}}',
+'tooltip-search-go' => 'Visitar un pagina con iste nomine exacte si existe',
+'tooltip-search-fulltext' => 'Cercar iste texto in le paginas',
+'tooltip-p-logo' => 'Pagina principal',
+'tooltip-n-mainpage' => 'Visitar le pagina principal',
+'tooltip-n-mainpage-description' => 'Visitar le pagina principal',
+'tooltip-n-portal' => 'A proposito del projecto, que tu pote facer, ubi trovar cosas',
+'tooltip-n-currentevents' => 'Informationes de fundo a proposito de eventos actual',
+'tooltip-n-recentchanges' => 'Le lista de modificationes recente in le wiki.',
+'tooltip-n-randompage' => 'Visitar un pagina qualcunque',
+'tooltip-n-help' => 'Le solutiones de vostre problemas',
+'tooltip-t-whatlinkshere' => 'Lista de tote le paginas wiki con ligamines a iste pagina',
+'tooltip-t-recentchangeslinked' => 'Modificationes recente in le paginas al quales iste pagina contine ligamines',
+'tooltip-feed-rss' => 'Syndication RSS pro iste pagina',
+'tooltip-feed-atom' => 'Syndication Atom pro iste pagina',
+'tooltip-t-contributions' => 'Vider le lista de contributiones de iste usator',
+'tooltip-t-emailuser' => 'Inviar un e-mail a iste usator',
+'tooltip-t-upload' => 'Incargar files',
+'tooltip-t-specialpages' => 'Lista de tote le paginas special',
+'tooltip-t-print' => 'Version imprimibile de iste pagina',
+'tooltip-t-permalink' => 'Ligamine permanente a iste version del pagina',
+'tooltip-ca-nstab-main' => 'Vider le pagina de contento',
+'tooltip-ca-nstab-user' => 'Vider le pagina de usator',
+'tooltip-ca-nstab-media' => 'Vider le pagina de media',
+'tooltip-ca-nstab-special' => 'Isto es un pagina special, tu non pote modificar le pagina mesme',
+'tooltip-ca-nstab-project' => 'Vider le pagina de projecto',
+'tooltip-ca-nstab-image' => 'Vider le pagina del file',
+'tooltip-ca-nstab-mediawiki' => 'Vider le message del systema',
+'tooltip-ca-nstab-template' => 'Vider le patrono',
+'tooltip-ca-nstab-help' => 'Vider le pagina de adjuta',
+'tooltip-ca-nstab-category' => 'Vider le pagina del categoria',
+'tooltip-minoredit' => 'Marcar iste modification como minor',
+'tooltip-save' => 'Confirmar tu modificationes',
+'tooltip-preview' => 'Per favor verifica tu modificationes ante que tu los publica!',
+'tooltip-diff' => 'Detaliar le modificationes que tu ha facite in le texto.',
+'tooltip-compareselectedversions' => 'Vider le differentias inter le seligite duo versiones de iste pagina.',
+'tooltip-watch' => 'Adder iste pagina a tu observatorio',
+'tooltip-watchlistedit-normal-submit' => 'Remover titulos',
+'tooltip-watchlistedit-raw-submit' => 'Actualisar observatorio',
+'tooltip-recreate' => 'Recrear le pagina nonobstante que illo ha essite delite',
+'tooltip-upload' => 'Comenciar le incargamento',
+'tooltip-rollback' => '"Revocar" reverte le modification(es) de iste pagina del ultime contributor con un singule clic.',
+'tooltip-undo' => '"Disfacer" reverte iste modification e aperi le formulario de modification in modo de previsualisation.
Es possibile adder un motivo in le summario.',
-'tooltip-preferences-save' => 'Confirmar preferentias',
-'tooltip-summary' => 'Entra un curte summario',
+'tooltip-preferences-save' => 'Confirmar preferentias',
+'tooltip-summary' => 'Entra un curte summario',
# Stylesheets
'common.css' => '/* Le CSS placiate hic se applicara a tote le stilos */',
@@ -2891,9 +2969,6 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
# Patrol log
'patrol-log-page' => 'Registro de patrulia',
'patrol-log-header' => 'Isto es un registro de versiones patruliate.',
-'patrol-log-line' => 'marcava $1 de $2 como patruliate $3',
-'patrol-log-auto' => '(automaticamente)',
-'patrol-log-diff' => 'le version $1',
'log-show-hide-patrol' => '$1 le registro de versiones patruliate',
# Image deletion
@@ -2920,11 +2995,11 @@ Le execution de illo pote compromitter le securitate de tu systema.",
'file-info' => 'grandor del file: $1, typo MIME: $2',
'file-info-size' => '$1 × $2 pixel, grandor del file: $3, typo MIME: $4',
'file-info-size-pages' => '$1 × $2 pixels, dimension del file: $3, typo MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}',
-'file-nohires' => '<small>Non disponibile in resolution plus alte.</small>',
+'file-nohires' => 'Non disponibile in resolution plus alte.',
'svg-long-desc' => 'File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
'show-big-image' => 'Plen resolution',
-'show-big-image-preview' => '<small> Dimension de iste previsualisation: $1.</small>',
-'show-big-image-other' => '<small>Altere resolutiones: $1.</small>',
+'show-big-image-preview' => ' Dimension de iste previsualisation: $1.',
+'show-big-image-other' => 'Altere {{PLURAL:$2|resolution|resolutiones}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'repetente',
'file-info-gif-frames' => '$1 {{PLURAL:$1|photogramma|photogrammas}}',
@@ -2944,6 +3019,13 @@ Le execution de illo pote compromitter le securitate de tu systema.",
'bydate' => 'per data',
'sp-newimages-showfrom' => 'Monstrar nove files a partir del $1 a $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 secunda|$1 secundas}}',
+'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
+'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
+'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'ago' => '$1 retro',
+
# Bad image list
'bad_image_list' => 'Le formato es como seque:
@@ -3447,13 +3529,6 @@ Iste codice de confirmation expirara a $4.',
'scarytranscludefailed' => '[Falleva de obtener le patrono pro $1]',
'scarytranscludetoolong' => '[URL es troppo longe]',
-# Trackbacks
-'trackbackbox' => 'Retroligamines a iste pagina:<br />
-$1',
-'trackbackremove' => '([$1 Deler])',
-'trackbacklink' => 'Retroligamine',
-'trackbackdeleteok' => 'Le retroligamine ha essite delite con successo.',
-
# Delete conflict
'deletedwhileediting' => "'''Attention:''' Iste pagina esseva delite post que tu comenciava a modificar lo!",
'confirmrecreate' => "Le usator [[User:$1|$1]] ([[User talk:$1|discussion]]) ha delite iste pagina post que tu comenciava a modificar lo, dante le motivo:
@@ -3534,6 +3609,9 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
'watchlisttools-edit' => 'Vider e modificar le observatorio',
'watchlisttools-raw' => 'Modificar observatorio crude',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])',
+
# Core parser functions
'unknown_extension_tag' => 'Etiquetta de extension incognite "$1"',
'duplicate-defaultsort' => 'Attention: Le clave de ordination predefinite "$2" supplanta le anterior clave de ordination predefinite "$1".',
@@ -3632,13 +3710,16 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
'tags-hitcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
# Special:ComparePages
-'comparepages' => 'Comparar paginas',
-'compare-selector' => 'Comparar versiones de pagina',
-'compare-page1' => 'Pagina 1',
-'compare-page2' => 'Pagina 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar paginas',
+'compare-selector' => 'Comparar versiones de pagina',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'Le titulo que tu specificava es invalide.',
+'compare-title-not-exists' => 'Le titulo que tu specificava non existe.',
+'compare-revision-not-exists' => 'Le version que tu specificava non existe.',
# Database error messages
'dberr-header' => 'Iste wiki ha un problema',
@@ -3665,4 +3746,90 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
'sqlite-has-fts' => '$1 con supporto de recerca de texto integre',
'sqlite-no-fts' => '$1 sin supporto de recerca de texto integre',
+# New logging system
+'logentry-delete-delete' => '$1 deleva le pagina $3',
+'logentry-delete-restore' => '$1 restaurava le pagina $3',
+'logentry-delete-event' => '$1 cambiava le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4',
+'logentry-delete-revision' => '$1 cambiava le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 cambiava le visibilitate de entratas de registro in $3',
+'logentry-delete-revision-legacy' => '$1 cambiava le visibilitate de versiones del pagina $3',
+'logentry-suppress-delete' => '$1 supprimeva le pagina $3',
+'logentry-suppress-event' => '$1 secretemente cambiava le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4',
+'logentry-suppress-revision' => '$1 secretemente cambiava le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 secretemente cambiava le visibilitate de entratas de registro in $3',
+'logentry-suppress-revision-legacy' => '$1 secretemente cambiava le visibilitate de versiones del pagina $3',
+'revdelete-content-hid' => 'contento celate',
+'revdelete-summary-hid' => 'summario del modification celate',
+'revdelete-uname-hid' => 'nomine de usator celate',
+'revdelete-content-unhid' => 'contento non plus celate',
+'revdelete-summary-unhid' => 'summario del modification non plus celate',
+'revdelete-uname-unhid' => 'nomine de usator non plus celate',
+'revdelete-restricted' => 'restrictiones applicate al administratores',
+'revdelete-unrestricted' => 'restrictiones eliminate pro administratores',
+'logentry-move-move' => '$1 renominava le pagina $3 a $4',
+'logentry-move-move-noredirect' => '$1 renominava le pagina $3 a $4 sin lassar un redirection',
+'logentry-move-move_redir' => '$1 renominava le pagina $3 a $4, superscribente un redirection',
+'logentry-move-move_redir-noredirect' => '$1 renominava le pagina $3 a $4, superscribente un redirection sin lassar un nove redirection',
+'logentry-patrol-patrol' => '$1 marcava le version $4 del pagina $3 como patruliate',
+'logentry-patrol-patrol-auto' => '$1 automaticamente marcava le version $4 del pagina $3 como patruliate',
+'logentry-newusers-newusers' => '$1 creava un conto de usator',
+'logentry-newusers-create' => '$1 creava un conto de usator',
+'logentry-newusers-create2' => '$1 creava un conto de usator $3',
+'logentry-newusers-autocreate' => 'Le conto $1 ha essite create automaticamente',
+'newuserlog-byemail' => 'contrasigno inviate per e-mail',
+
+# Feedback
+'feedback-bugornote' => 'Si tu es preste a describer un problema technic in detalio, per favor [$1 reporta un falta].
+Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite al pagina "[$3 $2]", con tu nomine de usator e le navigator del web que tu usa.',
+'feedback-subject' => 'Subjecto:',
+'feedback-message' => 'Message:',
+'feedback-cancel' => 'Cancellar',
+'feedback-submit' => 'Submitter opinion',
+'feedback-adding' => 'Le responsa es addite al pagina...',
+'feedback-error1' => 'Error: Resultato del API non recognoscite',
+'feedback-error2' => 'Error: Modification fallite',
+'feedback-error3' => 'Error: Nulle responsa del API',
+'feedback-thanks' => 'Gratias! Tu evalutation ha essite publicate in le pagina "[$2 $1]".',
+'feedback-close' => 'Finite',
+'feedback-bugcheck' => 'Bon! Ma per favor verifica que iste falta non es [$1 jam cognoscite].',
+'feedback-bugnew' => 'Si, io lo ha verificate; reportar un nove falta',
+
+# API errors
+'api-error-badaccess-groups' => 'Tu non ha le permission de incargar files in iste wiki.',
+'api-error-badtoken' => 'Error interne: indicio invalide.',
+'api-error-copyuploaddisabled' => 'Le incargamentos per URL es disactivate in iste servitor.',
+'api-error-duplicate' => 'Existe jam [$2 {{PLURAL:$1|un altere file|altere files}}] in le wiki con le mesme contento.',
+'api-error-duplicate-archive' => 'Il habeva jam {{PLURAL:$1|[$2 un altere file]|[$2 altere files]}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|File|Files}} duplicate que ha jam essite delite',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|File|Files}} duplicate',
+'api-error-empty-file' => 'Le file que tu submitteva es vacue.',
+'api-error-emptypage' => 'Le creation de nove paginas vacue non es permittite.',
+'api-error-fetchfileerror' => 'Error interne: qualcosa errava durante le obtention del file.',
+'api-error-file-too-large' => 'Le file que tu submitteva es troppo grande.',
+'api-error-filename-tooshort' => 'Le nomine del file es troppo curte.',
+'api-error-filetype-banned' => 'Iste typo de file es prohibite.',
+'api-error-filetype-missing' => 'Le nomine del file non ha un extension.',
+'api-error-hookaborted' => 'Le modification que tu ha tentate facer ha essite abortate per un extension.',
+'api-error-http' => 'Error interne: impossibile connecter al servitor.',
+'api-error-illegal-filename' => 'Iste nomine de file non es permittite.',
+'api-error-internal-error' => 'Error interne: qualcosa errava durante le processamento de tu file incargate in le wiki.',
+'api-error-invalid-file-key' => 'Error interne: file non trovate in le spatio de immagazinage temporari.',
+'api-error-missingparam' => 'Error interne: certe parametros mancava al requesta.',
+'api-error-missingresult' => 'Error interne: non poteva determinar si le copia succedeva.',
+'api-error-mustbeloggedin' => 'Es necessari aperir session pro incargar files.',
+'api-error-mustbeposted' => 'Error interne: le requesta require HTTP POST.',
+'api-error-noimageinfo' => 'Le incargamento succedeva, ma le servitor non forniva alcun information super le file.',
+'api-error-nomodule' => 'Error interne: nulle modulo de incargamento definite.',
+'api-error-ok-but-empty' => 'Error interne: nulle responsa del servitor.',
+'api-error-overwrite' => 'Superscriber un file existente non es permittite.',
+'api-error-stashfailed' => 'Error interne: le servitor non poteva immagazinar le file temporari.',
+'api-error-timeout' => 'Le servitor non ha respondite intra le tempore expectate.',
+'api-error-unclassified' => 'Un error incognite ha occurrite.',
+'api-error-unknown-code' => 'Error incognite: "$1"',
+'api-error-unknown-error' => 'Error interne: qualcosa errava durante le tentativa de incargar le file.',
+'api-error-unknown-warning' => 'Advertimento incognite: $1',
+'api-error-unknownerror' => 'Error incognite: "$1".',
+'api-error-uploaddisabled' => 'Le incargamento es disactivate in iste wiki.',
+'api-error-verification-error' => 'Le file pote esser corrumpite o su nomine pote haber un extension errate.',
+
);
diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php
index 32a81301..8ed4df9b 100644
--- a/languages/messages/MessagesId.php
+++ b/languages/messages/MessagesId.php
@@ -9,6 +9,7 @@
*
* @author -iNu-
* @author Aldnonymous
+ * @author Anakmalaysia
* @author ArdWar
* @author Bennylin
* @author Borgx
@@ -71,143 +72,144 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ALIH', '#REDIRECT' ),
- 'notoc' => array( '0', '__TANPADAFTARISI__', '__NIRDASI__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__TANPAGALERI__', '__NIRGAL__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__PAKSADAFTARISI__', '__PAKSADASI__', '__FORCETOC__' ),
- 'toc' => array( '0', '__DAFTARISI__', '__DASI__', '__TOC__' ),
- 'noeditsection' => array( '0', '__TANPASUNTINGANBAGIAN__', '__NIRSUBA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__TANPAKEPALA__', '__NIRLA__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'BULANKINI', 'BULANKINI2', 'BUKIN', 'BUKIN2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'BULANKINI1', 'BUKIN1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NAMABULANKINI', 'NAMBUKIN', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NAMAJENDERBULANKINI', 'NAMJENBUKIN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'NAMASINGKATBULANKINI', 'BULANINISINGKAT', 'NAMSINGBUKIN', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'HARIKINI', 'HARKIN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'HARIKINI2', 'HARKIN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NAMAHARIKINI', 'NAMHARKIN', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TAHUNKINI', 'TAKIN', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'WAKTUKINI', 'WAKIN', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'JAMKINI', 'JAKIN', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'BULANLOKAL', 'BULANLOKAL2', 'BULOK', 'BULOK2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'BULANLOKAL1', 'BULOK1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NAMABULANLOKAL', 'NAMBULOK', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'NAMAJENDERBULANLOKAL', 'NAMJENBULOK', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'NAMASINGKATBULANLOKAL', 'NAMSINGBULOK', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'HARILOKAL', 'HALOK', 'LOCALDAY' ),
- 'localday2' => array( '1', 'HARILOKAL2', 'HALOK2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NAMAHARILOKAL', 'NAMHALOK', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'TAHUNLOKAL', 'TALOK', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'WAKTULOKAL', 'WALOK', 'LOCALTIME' ),
- 'localhour' => array( '1', 'JAMLOKAL', 'JALOK', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'JUMLAHHALAMAN', 'JUMMAN', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'JUMLAHARTIKEL', 'JUMKEL', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'JUMLAHBERKAS', 'JUMKAS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'JUMLAHPENGGUNA', 'JUMPENG', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'JUMLAHPENGGUNAAKTIF', 'JUMPENGTIF', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'JUMLAHSUNTINGAN', 'JUMTING', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'JUMLAHTAMPILAN', 'JUMTAM', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NAMAHALAMAN', 'NAMMAN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NAMAHALAMANE', 'NAMMANE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'RUANGNAMA', 'RUNAM', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'RUANGNAMAE', 'RUNAME', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'RUANGBICARA', 'RUBIR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'RUANGBICARAE', 'RUBIRE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'RUANGUTAMA', 'RUANGARTIKEL', 'RUTAMA', 'RUTIKEL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'RUANGUTAMAE', 'RUANGARTIKELE', 'RUTAMAE', 'RUKELE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NAMAHALAMANLENGKAP', 'NAMALENGKAPHALAMAN', 'NAMMANKAP', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'AMAHALAMANLENGKAPE', 'NAMALENGKAPHALAMANE', 'NAMMANKAPE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NAMASUBHALAMAN', 'NAMAUPAHALAMAN', 'NAMUMAN', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NAMASUBHALAMANE', 'NAMAUPAHALAMANE', 'NAMUMANE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NAMAHALAMANDASAR', 'NAMADASARHALAMAN', 'NAMMANSAR', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NAMAHALAMANDASARE', 'NAMADASARHALAMANE', 'NAMMANSARE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NAMAHALAMANBICARA', 'NAMMANBIR', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NAMAHALAMANBICARAE', 'NAMMANBIRE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NAMAHALAMANUTAMA', 'NAMAHALAMANARTIKEL', 'NAMMANTAMA', 'NAMMANTIKEL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NAMAHALAMANUTAMAE', 'NAMAHALAMANARTIKELE', 'NAMMANTAMAE', 'NAMMANTIKELE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'PSN:', 'PESAN:', 'MSG:' ),
- 'subst' => array( '0', 'GNT:', 'GANTI:', 'SUBST:' ),
- 'msgnw' => array( '0', 'TPL:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'jmpl', 'jempol', 'mini', 'miniatur', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'jmpl=$1', 'jempol=$1', 'mini=$1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'ka', 'kanan', 'right' ),
- 'img_left' => array( '1', 'ki', 'kiri', 'left' ),
- 'img_none' => array( '1', 'nir', 'tanpa', 'none' ),
- 'img_center' => array( '1', 'pus', 'pusat', 'center', 'centre' ),
- 'img_framed' => array( '1', 'bing', 'bingkai', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'nirbing', 'tanpabingkai', 'frameless' ),
- 'img_page' => array( '1', 'hal=$1', 'halaman=$1', 'hal $1', 'halaman $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'lurus', 'lurus=$1', 'lurus $1', 'tegak', 'tegak=$1', 'tegak $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'tepi', 'batas', 'border' ),
- 'img_baseline' => array( '1', 'gada', 'garis_dasar', 'baseline' ),
- 'img_sub' => array( '1', 'upa', 'sub' ),
- 'img_top' => array( '1', 'atas', 'top' ),
- 'img_text_top' => array( '1', 'atek', 'atas-teks', 'text-top' ),
- 'img_middle' => array( '1', 'tengah', 'middle' ),
- 'img_bottom' => array( '1', 'bawah', 'bottom' ),
- 'img_text_bottom' => array( '1', 'batek', 'bawah-teks', 'text-bottom' ),
- 'img_link' => array( '1', 'pra=$1', 'pranala=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'al=$1', 'alternatif=$1', 'alt=$1' ),
- 'sitename' => array( '1', 'NAMASITUS', 'NAMSIT', 'SITENAME' ),
- 'ns' => array( '0', 'RN:', 'RUNAM:', 'NS:' ),
- 'localurl' => array( '0', 'URLLOKAL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLLOKALE', 'LOCALURLE:' ),
- 'server' => array( '0', 'PELADEN', 'SERVER' ),
- 'servername' => array( '0', 'NAMAPELADEN', 'NAMASERVER', 'NAMPEL', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'LOKASISKRIP', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'TATABAHASA', 'TASA', 'GRAMMAR:' ),
- 'gender' => array( '0', 'JANTINA', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__TANPAKONVERSIJUDUL__', '__NIRKODUL__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__TANPAKONVERSIISI__', '__NIRKOSI__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'MINGGUKINI', 'MIKIN', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'HARIDALAMMINGGU', 'HADAMI', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'MINGGULOKAL', 'MIKAL', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'HARIDALAMMINGGULOKAL', 'HADAMIKAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDREVISI', 'IREV', 'REVISIONID' ),
- 'revisionday' => array( '1', 'HARIREVISI', 'HAREV', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'HARIREVISI2', 'HAREV2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'BULANREVISI', 'BUREV', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'TAHUNREVISI', 'TAREV', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'STEMPELWAKTUREVISI', 'REKAMWAKTUREVISI', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'PENGGUNAREVISI', 'REVISIONUSER' ),
- 'plural' => array( '0', 'JAMAK:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URLLENGKAP:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLLENGKAPE', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'AKC:', 'AWALKECIL:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ABS:', 'AWALBESAR:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KC:', 'KECIL:', 'HURUFKECIL:', 'LC:' ),
- 'uc' => array( '0', 'BS:', 'BESAR:', 'HURUFBESAR:', 'UC:' ),
- 'raw' => array( '0', 'MENTAH:', 'RAW:' ),
- 'displaytitle' => array( '1', 'JUDULTAMPILAN', 'JUTAM', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'M', 'R' ),
- 'newsectionlink' => array( '1', '__PRANALABAGIANBARU__', '__PRABABA__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '_TANPAPRANALABAGIANBARU__', '__NIRPRABABA__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERSIKINI', 'VERKIN', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'KODEURL:', 'KODU:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'KODEJANGKAR', 'KOJANG', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'STEMPELWAKTUKINI', 'STEMWAKIN', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'STEMPELWAKTULOKAL', 'STEMWAKAL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'MARKAARAH', 'MARRAH', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#BAHASA:', '#BHS:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'BAHASAISI', 'BHSISI', 'BASI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'HALAMANDIRUANGNAMA:', 'HALDIRN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'JUMLAHADMIN', 'JUMLAHPENGURUS', 'JUMAD', 'JURUS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATANGKA', 'FORANG', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ISIKIRI', 'IKI', 'PADLEFT' ),
- 'padright' => array( '0', 'ISIKANAN', 'IKA', 'PADRIGHT' ),
- 'special' => array( '0', 'istimewa', 'spesial', 'special' ),
- 'defaultsort' => array( '1', 'URUTANBAKU:', 'UBUR:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'LOKASIBERKAS:', 'LOBER:', 'FILEPATH:' ),
- 'tag' => array( '0', 'kata_kunci', 'takun', 'tag' ),
- 'hiddencat' => array( '1', '__KATEGORITERSEMBUNYI__', '__KATSEM__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'HALAMANDIKATEGORI', 'HALDIKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'BESARHALAMAN', 'BESMAN', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEKS__', '__INDEX__' ),
- 'noindex' => array( '1', '__TANPAINDEKS__', '__NIRDEKS__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'JUMLAHDIKELOMPOK', 'JULDIPOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__PENGALIHANSTATIK__', '__PENGALIHANSTATIS__', '__PETIK__', '__PETIS__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'TINGKATPERLINDUNGAN', 'TIPER', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formattanggal', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#ALIH', '#REDIRECT' ),
+ 'notoc' => array( '0', '__TANPADAFTARISI__', '__NIRDASI__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__TANPAGALERI__', '__NIRGAL__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__PAKSADAFTARISI__', '__PAKSADASI__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__DAFTARISI__', '__DASI__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__TANPASUNTINGANBAGIAN__', '__NIRSUBA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__TANPAKEPALA__', '__NIRLA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'BULANKINI', 'BULANKINI2', 'BUKIN', 'BUKIN2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'BULANKINI1', 'BUKIN1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NAMABULANKINI', 'NAMBUKIN', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NAMAJENDERBULANKINI', 'NAMJENBUKIN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'NAMASINGKATBULANKINI', 'BULANINISINGKAT', 'NAMSINGBUKIN', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'HARIKINI', 'HARKIN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'HARIKINI2', 'HARKIN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NAMAHARIKINI', 'NAMHARKIN', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TAHUNKINI', 'TAKIN', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'WAKTUKINI', 'WAKIN', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'JAMKINI', 'JAKIN', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'BULANLOKAL', 'BULANLOKAL2', 'BULOK', 'BULOK2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'BULANLOKAL1', 'BULOK1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NAMABULANLOKAL', 'NAMBULOK', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'NAMAJENDERBULANLOKAL', 'NAMJENBULOK', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'NAMASINGKATBULANLOKAL', 'NAMSINGBULOK', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'HARILOKAL', 'HALOK', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'HARILOKAL2', 'HALOK2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NAMAHARILOKAL', 'NAMHALOK', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'TAHUNLOKAL', 'TALOK', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'WAKTULOKAL', 'WALOK', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'JAMLOKAL', 'JALOK', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'JUMLAHHALAMAN', 'JUMMAN', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'JUMLAHARTIKEL', 'JUMKEL', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'JUMLAHBERKAS', 'JUMKAS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'JUMLAHPENGGUNA', 'JUMPENG', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'JUMLAHPENGGUNAAKTIF', 'JUMPENGTIF', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'JUMLAHSUNTINGAN', 'JUMTING', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'JUMLAHTAMPILAN', 'JUMTAM', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NAMAHALAMAN', 'NAMMAN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NAMAHALAMANE', 'NAMMANE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'RUANGNAMA', 'RUNAM', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'RUANGNAMAE', 'RUNAME', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'RUANGBICARA', 'RUBIR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'RUANGBICARAE', 'RUBIRE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'RUANGUTAMA', 'RUANGARTIKEL', 'RUTAMA', 'RUTIKEL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'RUANGUTAMAE', 'RUANGARTIKELE', 'RUTAMAE', 'RUKELE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NAMAHALAMANLENGKAP', 'NAMALENGKAPHALAMAN', 'NAMMANKAP', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'AMAHALAMANLENGKAPE', 'NAMALENGKAPHALAMANE', 'NAMMANKAPE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NAMASUBHALAMAN', 'NAMAUPAHALAMAN', 'NAMUMAN', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NAMASUBHALAMANE', 'NAMAUPAHALAMANE', 'NAMUMANE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NAMAHALAMANDASAR', 'NAMADASARHALAMAN', 'NAMMANSAR', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NAMAHALAMANDASARE', 'NAMADASARHALAMANE', 'NAMMANSARE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NAMAHALAMANBICARA', 'NAMMANBIR', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NAMAHALAMANBICARAE', 'NAMMANBIRE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NAMAHALAMANUTAMA', 'NAMAHALAMANARTIKEL', 'NAMMANTAMA', 'NAMMANTIKEL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NAMAHALAMANUTAMAE', 'NAMAHALAMANARTIKELE', 'NAMMANTAMAE', 'NAMMANTIKELE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'PSN:', 'PESAN:', 'MSG:' ),
+ 'subst' => array( '0', 'GNT:', 'GANTI:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'TPL:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'jmpl', 'jempol', 'mini', 'miniatur', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'jmpl=$1', 'jempol=$1', 'mini=$1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'ka', 'kanan', 'right' ),
+ 'img_left' => array( '1', 'ki', 'kiri', 'left' ),
+ 'img_none' => array( '1', 'nir', 'tanpa', 'none' ),
+ 'img_center' => array( '1', 'pus', 'pusat', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'bing', 'bingkai', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'nirbing', 'tanpabingkai', 'frameless' ),
+ 'img_page' => array( '1', 'hal=$1', 'halaman=$1', 'hal $1', 'halaman $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'lurus', 'lurus=$1', 'lurus $1', 'tegak', 'tegak=$1', 'tegak $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'tepi', 'batas', 'border' ),
+ 'img_baseline' => array( '1', 'gada', 'garis_dasar', 'baseline' ),
+ 'img_sub' => array( '1', 'upa', 'sub' ),
+ 'img_top' => array( '1', 'atas', 'top' ),
+ 'img_text_top' => array( '1', 'atek', 'atas-teks', 'text-top' ),
+ 'img_middle' => array( '1', 'tengah', 'middle' ),
+ 'img_bottom' => array( '1', 'bawah', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'batek', 'bawah-teks', 'text-bottom' ),
+ 'img_link' => array( '1', 'pra=$1', 'pranala=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'al=$1', 'alternatif=$1', 'alt=$1' ),
+ 'sitename' => array( '1', 'NAMASITUS', 'NAMSIT', 'SITENAME' ),
+ 'ns' => array( '0', 'RN:', 'RUNAM:', 'NS:' ),
+ 'localurl' => array( '0', 'URLLOKAL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLLOKALE', 'LOCALURLE:' ),
+ 'server' => array( '0', 'PELADEN', 'SERVER' ),
+ 'servername' => array( '0', 'NAMAPELADEN', 'NAMASERVER', 'NAMPEL', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'LOKASISKRIP', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'TATABAHASA', 'TASA', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'JANTINA', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__TANPAKONVERSIJUDUL__', '__NIRKODUL__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__TANPAKONVERSIISI__', '__NIRKOSI__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'MINGGUKINI', 'MIKIN', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'HARIDALAMMINGGU', 'HADAMI', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'MINGGULOKAL', 'MIKAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'HARIDALAMMINGGULOKAL', 'HADAMIKAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDREVISI', 'IREV', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'HARIREVISI', 'HAREV', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'HARIREVISI2', 'HAREV2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'BULANREVISI', 'BUREV', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'BULANREVISI1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'TAHUNREVISI', 'TAREV', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'STEMPELWAKTUREVISI', 'REKAMWAKTUREVISI', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'PENGGUNAREVISI', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'JAMAK:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLLENGKAP:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLLENGKAPE', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'AKC:', 'AWALKECIL:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ABS:', 'AWALBESAR:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KC:', 'KECIL:', 'HURUFKECIL:', 'LC:' ),
+ 'uc' => array( '0', 'BS:', 'BESAR:', 'HURUFBESAR:', 'UC:' ),
+ 'raw' => array( '0', 'MENTAH:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'JUDULTAMPILAN', 'JUTAM', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'M', 'R' ),
+ 'newsectionlink' => array( '1', '__PRANALABAGIANBARU__', '__PRABABA__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '_TANPAPRANALABAGIANBARU__', '__NIRPRABABA__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERSIKINI', 'VERKIN', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'KODEURL:', 'KODU:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'KODEJANGKAR', 'KOJANG', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'STEMPELWAKTUKINI', 'STEMWAKIN', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'STEMPELWAKTULOKAL', 'STEMWAKAL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'MARKAARAH', 'MARRAH', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#BAHASA:', '#BHS:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'BAHASAISI', 'BHSISI', 'BASI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'HALAMANDIRUANGNAMA:', 'HALDIRN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'JUMLAHADMIN', 'JUMLAHPENGURUS', 'JUMAD', 'JURUS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATANGKA', 'FORANG', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ISIKIRI', 'IKI', 'PADLEFT' ),
+ 'padright' => array( '0', 'ISIKANAN', 'IKA', 'PADRIGHT' ),
+ 'special' => array( '0', 'istimewa', 'spesial', 'special' ),
+ 'defaultsort' => array( '1', 'URUTANBAKU:', 'UBUR:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'LOKASIBERKAS:', 'LOBER:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'kata_kunci', 'takun', 'tag' ),
+ 'hiddencat' => array( '1', '__KATEGORITERSEMBUNYI__', '__KATSEM__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'HALAMANDIKATEGORI', 'HALDIKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'BESARHALAMAN', 'BESMAN', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKS__', '__INDEX__' ),
+ 'noindex' => array( '1', '__TANPAINDEKS__', '__NIRDEKS__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'JUMLAHDIKELOMPOK', 'JULDIPOK', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__PENGALIHANSTATIK__', '__PENGALIHANSTATIS__', '__PETIK__', '__PETIS__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'TINGKATPERLINDUNGAN', 'TIPER', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formattanggal', 'formatdate', 'dateformat' ),
);
$specialPageAliases = array(
@@ -215,12 +217,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'Pesan_sistem', 'PesanSistem' ),
'Allpages' => array( 'Daftar_halaman', 'DaftarHalaman' ),
'Ancientpages' => array( 'Halaman_lama', 'HalamanLama' ),
+ 'Badtitle' => array( 'Judul_yang_buruk' ),
'Blankpage' => array( 'Halaman_kosong', 'HalamanKosong' ),
'Block' => array( 'Blokir_pengguna', 'BlokirPengguna' ),
'Blockme' => array( 'Blokir_saya', 'BlokirSaya' ),
'Booksources' => array( 'Sumber_buku', 'SumberBuku' ),
'BrokenRedirects' => array( 'Pengalihan_rusak', 'PengalihanRusak' ),
'Categories' => array( 'Daftar_kategori', 'DaftarKategori', 'Kategori' ),
+ 'ChangeEmail' => array( 'Ganti_surel', 'GantiSurel' ),
'ChangePassword' => array( 'Ganti_sandi', 'GantiSandi' ),
'ComparePages' => array( 'Bandingkan_halaman', 'BandingkanHalaman' ),
'Confirmemail' => array( 'Konfirmasi_surel', 'KonfirmasiSurel' ),
@@ -230,6 +234,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Kontribusi_yang_dihapus', 'KontribusiDihapus' ),
'Disambiguations' => array( 'Disambiguasi' ),
'DoubleRedirects' => array( 'Pengalihan_ganda', 'PengalihanGanda' ),
+ 'EditWatchlist' => array( 'Sunting_daftar_pantauan' ),
'Emailuser' => array( 'Surel_pengguna', 'SurelPengguna' ),
'Export' => array( 'Ekspor_halaman', 'Ekspor' ),
'Fewestrevisions' => array( 'Perubahan_tersedikit', 'PerubahanTersedikit' ),
@@ -261,9 +266,11 @@ $specialPageAliases = array(
'Mycontributions' => array( 'Kontribusi_saya', 'KontribusiSaya' ),
'Mypage' => array( 'Halaman_saya', 'HalamanSaya' ),
'Mytalk' => array( 'Pembicaraan_saya', 'PembicaraanSaya' ),
+ 'Myuploads' => array( 'Unggahan_saya' ),
'Newimages' => array( 'Berkas_baru', 'BerkasBaru' ),
'Newpages' => array( 'Halaman_baru', 'HalamanBaru' ),
'PasswordReset' => array( 'Reset_sandi', 'ResetSandi' ),
+ 'PermanentLink' => array( 'Pranala_permanen' ),
'Popularpages' => array( 'Halaman_populer', 'HalamanPopuler' ),
'Preferences' => array( 'Preferensi' ),
'Prefixindex' => array( 'Indeks_awalan', 'IndeksAwalan' ),
@@ -682,18 +689,20 @@ Silakan laporkan hal ini kepada salah seorang [[Special:ListUsers/sysop|Pengurus
'badarticleerror' => 'Tindakan ini tidak dapat dilaksanakan di halaman ini.',
'cannotdelete' => 'Halaman atau berkas "$1" tidak dapat dihapus.
Mungkin telah dihapus oleh orang lain.',
+'cannotdelete-title' => 'Tidak dapat menghapus 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:',
-'perfcachedts' => 'Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1.',
+'perfcached' => 'Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir: A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pemutakhiran dari halaman ini sedang dimatikan. Data yang ada di sini saat ini tidak akan dimuat ulang.',
'wrong_wfQuery_params' => 'Parameter salah ke wfQuery()<br />Fungsi: $1<br />Permintaan: $2',
'viewsource' => 'Lihat sumber',
-'viewsourcefor' => 'untuk $1',
+'viewsource-title' => 'Lihat sumber $1',
'actionthrottled' => 'Tindakan dibatasi',
'actionthrottledtext' => 'Anda dibatasi untuk melakukan tindakan ini terlalu banyak dalam waktu pendek. Silakan mencoba lagi setelah beberapa menit.',
'protectedpagetext' => 'Halaman ini telah dikunci untuk menghindari penyuntingan.',
'viewsourcetext' => 'Anda dapat melihat atau menyalin sumber halaman ini:',
+'viewyourtext' => "Anda dapat melihat atau menyalin sumber dari '''suntingan Anda''' ke halaman ini:",
'protectedinterface' => 'Halaman ini berisi teks antarmuka untuk digunakan oleh perangkat lunak dan telah dikunci untuk menghindari kesalahan.',
'editinginterface' => "'''Peringatan:''' Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka untuk perangkat lunak situs ini. Perubahan teks ini akan mempengaruhi tampilan pada antarmuka pengguna untuk pengguna lain.
Untuk terjemahan, harap gunakan [//translatewiki.net/wiki/Main_Page?setlang=id translatewiki.net], proyek pelokalan MediaWiki.",
@@ -790,6 +799,7 @@ Karenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain un
'emailconfirmlink' => 'Konfirmasikan alamat surel Anda',
'invalidemailaddress' => 'Alamat surel ini tidak dapat diterima karena formatnya tidak sesuai.
Harap masukkan alamat surel dalam format yang benar atau kosongkan isian tersebut.',
+'cannotchangeemail' => 'Alamat surel akun tidak dapat diubah di wiki ini.',
'accountcreated' => 'Akun dibuat',
'accountcreatedtext' => 'Akun pengguna untuk $1 telah dibuat.',
'createaccount-title' => 'Pembuatan akun untuk {{SITENAME}}',
@@ -805,6 +815,7 @@ Silakan menunggu sebelum mencoba lagi.',
# E-mail sending
'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
+'user-mail-no-addy' => 'Mencoba mengirimkan surel tanpa alamat surel.',
# Change password dialog
'resetpass' => 'Ganti kata sandi',
@@ -825,16 +836,18 @@ Anda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sa
'resetpass-temp-password' => 'Kata sandi sementara:',
# Special:PasswordReset
-'passwordreset' => 'Setel ulang sandi',
-'passwordreset-text' => 'Lengkapi formulir ini untuk menerima surel pengingat detail akun Anda.',
-'passwordreset-legend' => 'Setel ulang sandi',
-'passwordreset-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
-'passwordreset-username' => 'Nama pengguna:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'Alamat surel:',
-'passwordreset-emailtitle' => 'Detail akun di {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat
+'passwordreset' => 'Setel ulang sandi',
+'passwordreset-text' => 'Lengkapi formulir ini untuk menerima surel pengingat detail akun Anda.',
+'passwordreset-legend' => 'Setel ulang sandi',
+'passwordreset-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
+'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
+'passwordreset-username' => 'Nama pengguna:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Lihat surel yang dihasilkan?',
+'passwordreset-capture-help' => 'Jika Anda mencentang kotak ini, surel (dengan kata sandi sementara) akan ditampilkan ke Anda dan juga dikirim ke pengguna.',
+'passwordreset-email' => 'Alamat surel:',
+'passwordreset-emailtitle' => 'Detail akun di {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat
detail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut
terkait dengan alamat surel ini:
@@ -844,7 +857,7 @@ $2
Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
-'passwordreset-emailtext-user' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat detail akun untuk {{SITENAME}} ($4).
+'passwordreset-emailtext-user' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat detail akun untuk {{SITENAME}} ($4).
{{PLURAL:$3|Akun|Akun-akun}} berikut terkait dengan alamat surel ini:
$2
@@ -853,9 +866,22 @@ $2
Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
-'passwordreset-emailelement' => 'Nama pengguna: $1
+'passwordreset-emailelement' => 'Nama pengguna: $1
Sandi sementara: $2',
-'passwordreset-emailsent' => 'Surel pengingat telah dikirimkan.',
+'passwordreset-emailsent' => 'Surel pengingat telah dikirimkan.',
+'passwordreset-emailsent-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dikirim.',
+'passwordreset-emailerror-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dihasilkan, tetapi gagal mengirimkannya ke pengguna: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ubah alamat surel',
+'changeemail-header' => 'Ubah alamat surel akun',
+'changeemail-text' => 'Selesaikan formulir ini untuk mengubah alamat surel Anda. Anda perlu memasukkan sandi untuk mengkonfirmasi perubahan ini.',
+'changeemail-no-info' => 'Anda harus masuk log untuk mengakses halaman ini secara langsung.',
+'changeemail-oldemail' => 'Alamat surel saat ini:',
+'changeemail-newemail' => 'Alamat surel baru:',
+'changeemail-none' => '(tidak ada)',
+'changeemail-submit' => 'Ubah surel',
+'changeemail-cancel' => 'Batalkan',
# Edit page toolbar
'bold_sample' => 'Teks ini akan dicetak tebal',
@@ -925,9 +951,6 @@ Anda tidak dapat menggunakan fitur "kirim surel ke pengguna ini" kecuali Anda te
Alamat IP Anda saat ini adalah $3, dan ID pemblokiran adalah #$5.
Tolong sertakan informasi-informasi ini dalam setiap pertanyaan Anda.',
'blockednoreason' => 'tidak ada alasan yang diberikan',
-'blockedoriginalsource' => "Isi sumber '''$1''' ditunjukkan berikut ini:",
-'blockededitsource' => "Teks '''suntingan Anda''' terhadap '''$1''' ditunjukkan berikut ini:",
-'whitelistedittitle' => 'Perlu masuk log untuk menyunting',
'whitelistedittext' => 'Anda harus $1 untuk dapat menyunting halaman.',
'confirmedittext' => 'Anda harus mengkonfirmasikan dulu alamat surel Anda sebelum menyunting halaman.
Harap masukkan dan validasikan alamat surel Anda melalui [[Special:Preferences|halaman preferensi pengguna]] Anda.',
@@ -1007,7 +1030,7 @@ Jika Anda menyimpannya, perubahan-perubahan yang dibuat sejak revisi ini akan hi
'yourdiff' => 'Perbedaan',
'copyrightwarning' => "Perhatikan bahwa semua kontribusi terhadap {{SITENAME}} dianggap dilisensikan sesuai dengan $2 (lihat $1 untuk informasi lebih lanjut). Jika Anda tidak ingin tulisan Anda disunting dan disebarkan ke halaman web yang lain, jangan kirimkan ke sini.<br />Anda juga berjanji bahwa ini adalah hasil karya Anda sendiri, atau disalin dari sumber milik umum atau sumber bebas yang lain. '''JANGAN KIRIMKAN KARYA YANG DILINDUNGI HAK CIPTA TANPA IZIN!'''",
'copyrightwarning2' => "Perhatikan bahwa semua kontribusi terhadap {{SITENAME}} dapat disunting, diubah, atau dihapus oleh penyumbang lainnya. Jika Anda tidak ingin tulisan Anda disunting orang lain, jangan kirimkan ke sini.<br />Anda juga berjanji bahwa ini adalah hasil karya Anda sendiri, atau disalin dari sumber milik umum atau sumber bebas yang lain (lihat $1 untuk informasi lebih lanjut). '''JANGAN KIRIMKAN KARYA YANG DILINDUNGI HAK CIPTA TANPA IZIN!'''",
-'longpageerror' => "'''KESALAHAN: Teks yang Anda kirimkan sebesar $1 kilobita, yang berarti lebih besar dari jumlah maksimum $2 kilobita. Teks tidak dapat disimpan.'''",
+'longpageerror' => "'''KESALAHAN: Teks yang Anda kirimkan sebesar $1 kilobita, yang berarti lebih besar daripada jumlah maksimum $2 kilobita. Teks tidak dapat disimpan.'''",
'readonlywarning' => "'''PERINGATAN: Basis data sedang dikunci karena pemeliharaan, sehingga saat ini Anda tidak dapat menyimpan hasil suntingan Anda.
Anda mungkin perlu menyalin teks suntingan Anda ini dan menyimpannya ke sebuah berkas teks dan memuatkannya lagi setelah pemeliharaan selesai.'''
@@ -1172,8 +1195,6 @@ Pengurus {{SITENAME}} lain akan tetap dapat mengakses isi yang tersembunyi ini d
'revdelete-unsuppress' => 'Hapus batasan pada revisi yang dikembalikan',
'revdelete-log' => 'Alasan:',
'revdelete-submit' => 'Terapkan pada {{PLURAL:$1|revisi|revisi}} terpilih',
-'revdelete-logentry' => 'mengubah tampilan revisi untuk [[$1]]',
-'logdelete-logentry' => 'mengubah aturan penyembunyian dari [[$1]]',
'revdelete-success' => "'''Keterlihatan revisi berhasil diperbarui.'''",
'revdelete-failure' => "'''Keterlihatan revisi tak dapat diperbarui:'''
$1",
@@ -1185,15 +1206,6 @@ $1",
'revdel-restore-visible' => 'tampilan revisi',
'pagehist' => 'Versi terdahulu halaman',
'deletedhist' => 'Sejarah yang dihapus',
-'revdelete-content' => 'konten',
-'revdelete-summary' => 'ringkasan',
-'revdelete-uname' => 'nama pengguna',
-'revdelete-restricted' => 'akses telah dibatasi untuk opsis',
-'revdelete-unrestricted' => 'pembatasan akses opsis dihapuskan',
-'revdelete-hid' => 'sembunyikan $1',
-'revdelete-unhid' => 'tampilkan $1',
-'revdelete-log-message' => '$1 untuk $2 {{PLURAL:$2|revisi|revisi}}',
-'logdelete-log-message' => '$1 untuk $2 {{PLURAL:$2|peristiwa|peristiwa}}',
'revdelete-hide-current' => 'Gagal menyembunyikan revisi tertanggal $2, $1: ini adalah revisi terkini.
Revisi ini tidak dapat disembunyikan.',
'revdelete-show-no-access' => 'Gagal menampilkan revisi tertanggal $2, $1: revisi ini telah ditandai "terbatas".
@@ -1351,12 +1363,14 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
'prefs-rc' => 'Perubahan terbaru',
'prefs-watchlist' => 'Pemantauan',
'prefs-watchlist-days' => 'Jumlah hari maksimum yang ditampilkan di daftar pantauan:',
-'prefs-watchlist-days-max' => 'Maksimum 7 hari',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|hari|hari}}',
'prefs-watchlist-edits' => 'Jumlah suntingan maksimum yang ditampilkan di daftar pantauan yang lebih lengkap:',
'prefs-watchlist-edits-max' => 'Nilai maksimum: 1000',
'prefs-watchlist-token' => 'Token pantauan:',
'prefs-misc' => 'Lain-lain',
'prefs-resetpass' => 'Ganti kata sandi',
+'prefs-changeemail' => 'Ubah surel',
+'prefs-setemail' => 'Atur alamat surel',
'prefs-email' => 'Opsi surel',
'prefs-rendering' => 'Tampilan',
'saveprefs' => 'Simpan',
@@ -1415,6 +1429,7 @@ Pengembalian preferensi tidak dapat dibatalkan.',
'yourrealname' => 'Nama asli:',
'yourlanguage' => 'Bahasa:',
'yourvariant' => 'Varian bahasa isi:',
+'prefs-help-variant' => 'Varian atau ortografi pilihan Anda untuk menampilkan isi halaman wiki ini.',
'yournick' => 'Tanda tangan:',
'prefs-help-signature' => 'Komentar pada halaman pembicaraan perlu ditandatangani dengan "<nowiki>~~~~</nowiki>" yang akan diubah menjadi tanda tangan Anda dan waktu saat ini.',
'badsig' => 'Tanda tangan mentah tak sah; periksa tag HTML.',
@@ -1455,7 +1470,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'userrights-lookup-user' => 'Mengatur kelompok pengguna',
'userrights-user-editname' => 'Masukkan nama pengguna:',
'editusergroup' => 'Sunting kelompok pengguna',
-'editinguser' => "Mengganti hak akses pengguna '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Mengganti hak akses pengguna '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Sunting kelompok pengguna',
'saveusergroups' => 'Simpan kelompok pengguna',
'userrights-groupsmember' => 'Anggota dari:',
@@ -1549,13 +1564,13 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'right-autopatrol' => 'Menyunting dengan status suntingan secara otomatis ditandai terpantau',
'right-patrolmarks' => 'Melihat penandaan patroli perubahan terbaru',
'right-unwatchedpages' => 'Melihat daftar halaman-halaman yang tidak dipantau',
-'right-trackback' => 'Mengirimkan sebuah penjejakan balik',
'right-mergehistory' => 'Menggabungkan versi terdahulu halaman-halaman',
'right-userrights' => 'Menyunting seluruh hak pengguna',
'right-userrights-interwiki' => 'Menyunting hak para pengguna di wiki lain',
'right-siteadmin' => 'Mengunci dan membuka kunci basis data',
'right-override-export-depth' => 'Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5',
'right-sendemail' => 'Mengirim surel ke pengguna lain',
+'right-passwordreset' => 'Lihat surel pengaturulangan kata sandi',
# User rights log
'rightslog' => 'Log perubahan hak akses',
@@ -1589,16 +1604,17 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'action-suppressionlog' => 'melihat log privat ini',
'action-block' => 'memblokir pengguna ini dari menyunting',
'action-protect' => 'mengganti tingkat pelindungan halaman ini',
+'action-rollback' => 'mengembalikan dengan cepat suntingan-suntingan pengguna terakhir yang menyunting halaman tertentu',
'action-import' => 'mengimpor halaman ini dari wiki lain',
'action-importupload' => 'mengimpor halaman ini dari pemuatan berkas',
'action-patrol' => 'menandai suntingan pengguna lain sebagai terpatroli',
'action-autopatrol' => 'menandai suntingan Anda sendiri sebagai terpatroli',
'action-unwatchedpages' => 'melihat daftar halaman yang tidak dipantau',
-'action-trackback' => 'mengirimkan penjejak balik',
'action-mergehistory' => 'menggabungkan revisi-revisi terdahulu halaman ini',
'action-userrights' => 'menyunting semua hak pengguna',
'action-userrights-interwiki' => 'menyunting hak akses dari pengguna di wiki lain',
'action-siteadmin' => 'mengunci atau membuka kunci basis data',
+'action-sendemail' => 'kirim surel',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
@@ -1683,6 +1699,7 @@ Lihat [[Special:NewFiles|galeri berkas baru]] untuk tampilan visual.',
'ignorewarnings' => 'Abaikan peringatan apa pun',
'minlength1' => 'Nama berkas paling tidak harus terdiri dari satu huruf.',
'illegalfilename' => 'Nama berkas "$1" mengandung aksara yang tidak diperbolehkan ada dalam judul halaman. Silakan ubah nama berkas tersebut dan cobalah memuatkannya kembali.',
+'filename-toolong' => 'Nama berkas tidak boleh lebih panjang dari 240 bita.',
'badfilename' => 'Nama berkas telah diubah menjadi "$1".',
'filetype-mime-mismatch' => 'Ekstensi berkas ".$1" tidak cocok dengan jenis MIME yang terdeteksi dari berkas ($2).',
'filetype-badmime' => 'Berkas dengan tipe MIME "$1" tidak diperkenankan untuk dimuat.',
@@ -1771,6 +1788,17 @@ Silakan hubungi salah seorang [[Special:ListUsers/sysop|pengurus]].',
'upload-unknown-size' => 'Ukuran tidak diketahui',
'upload-http-error' => 'Kesalahan HTTP terjadi: $1',
+# File backend
+'backend-fail-stream' => 'Tidak bisa mengalikan berkas $1.',
+'backend-fail-backup' => 'Tidak dapat mencadangkan berkas $1.',
+'backend-fail-notexists' => 'Berkas $1 tidak ada.',
+'backend-fail-hashes' => 'Tidak bisa mendapatkan hash berkas sebagai perbandingan.',
+'backend-fail-notsame' => 'Berkas nonidentik telah ada di $1.',
+'backend-fail-invalidpath' => '$1 bukanlah lintasan penyimpanan yang valid.',
+'backend-fail-delete' => 'Tidak dapat menghapus berkas $1.',
+'backend-fail-alreadyexists' => 'Berkas $1 sudah ada.',
+'backend-fail-store' => 'Tidak dapat menyimpan berkas $1 di $2.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Timbul galat saat membuka berkas untuk pengecekan ZIP.',
'zip-wrong-format' => 'Berkas yang diberikan bukanlah berkas ZIP.',
@@ -2031,7 +2059,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
'listusers-editsonly' => 'Tampilkan hanya pengguna yang memiliki kontribusi',
'listusers-creationsort' => 'Urutkan menurut tanggal pembuatan',
'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
-'usercreated' => 'sejak $2, $1',
+'usercreated' => '{{GENDER:$3|Dibuat}} pada $1 pukul $2',
'newpages' => 'Halaman baru',
'newpages-username' => 'Nama pengguna:',
'ancientpages' => 'Halaman terlama',
@@ -2124,12 +2152,8 @@ Protokol yang didukung: <tt>$1</tt> (jangan tambahkan dalam pencarian Anda)',
'activeusers-noresult' => 'Pengguna tidak ditemukan.',
# Special:Log/newusers
-'newuserlogpage' => 'Log pengguna baru',
-'newuserlogpagetext' => 'Di bawah ini adalah log pendaftaran pengguna baru',
-'newuserlog-byemail' => 'kata sandi dikirim melalui surel',
-'newuserlog-create-entry' => 'mendaftar sebagai pengguna',
-'newuserlog-create2-entry' => 'membuat akun baru $1',
-'newuserlog-autocreate-entry' => 'akun pengguna dibuat secara otomatis',
+'newuserlogpage' => 'Log pengguna baru',
+'newuserlogpagetext' => 'Di bawah ini adalah log pendaftaran pengguna baru',
# Special:ListGroupRights
'listgrouprights' => 'Daftar kelompok pengguna',
@@ -2157,7 +2181,7 @@ Protokol yang didukung: <tt>$1</tt> (jangan tambahkan dalam pencarian Anda)',
'emailpagetext' => 'Anda dapat menggunakan formulir di bawah ini untuk mengirimkan surel ke pengguna ini.
Alamat surel yang Anda masukkan di [[Special:Preferences|preferensi akun Anda]] akan muncul sebagai alamat "Dari" dalam surel tersebut, sehingga penerima dapat langsung membalas kepada Anda.',
'usermailererror' => 'Kesalahan objek surat:',
-'defemailsubject' => 'Surel {{SITENAME}}',
+'defemailsubject' => 'Surel {{SITENAME}} dari pengguna "$1"',
'usermaildisabled' => 'Surel pengguna dinonaktifkan',
'usermaildisabledtext' => 'Anda tidak dapat mengirim surel pada pengguna lain di wiki ini',
'noemailtitle' => 'Tidak ada alamat surel',
@@ -2275,8 +2299,6 @@ Umpan balik dan bantuan lebih lanjut:
'actioncomplete' => 'Proses selesai',
'actionfailed' => 'Eksekusi gagal',
'deletedtext' => '"$1" telah dihapus. Lihat $2 untuk log terkini halaman yang telah dihapus.',
-'deletedarticle' => 'menghapus "[[$1]]"',
-'suppressedarticle' => '"[[$1]]" disembunyikan',
'dellogpage' => 'Log penghapusan',
'dellogpagetext' => 'Di bawah ini adalah log penghapusan halaman. Semua waktu yang ditunjukkan adalah waktu server.',
'deletionlog' => 'log penghapusan',
@@ -2341,6 +2363,7 @@ Lihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlind
'protect-level-sysop' => 'Hanya pengurus',
'protect-summary-cascade' => 'runtun',
'protect-expiring' => 'kedaluwarsa $1 (UTC)',
+'protect-expiring-local' => 'kedaluwarsa $1',
'protect-expiry-indefinite' => 'selamanya',
'protect-cascade' => 'Lindungi semua halaman yang termasuk dalam halaman ini (pelindungan runtun)',
'protect-cantedit' => 'Anda tidak dapat mengubah tingkatan pelindungan halaman ini karena Anda tidak memiliki hak untuk itu.',
@@ -2397,7 +2420,6 @@ Alasan penghapusan diberikan pada ringkasan di bawah ini, berikut rincian penggu
'undeletereset' => 'Reset',
'undeleteinvert' => 'Balikkan pilihan',
'undeletecomment' => 'Alasan:',
-'undeletedarticle' => '"$1" telah dikembalikan',
'undeletedrevisions' => '$1 {{PLURAL:$1|revisi|revisi}} telah dikembalikan',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revisi|revisi}} and $2 berkas dikembalikan',
'undeletedfiles' => '$1 {{PLURAL:$1|berkas|berkas}} dikembalikan',
@@ -2557,6 +2579,7 @@ Lihat [[Special:BlockList|Daftar IP]] untuk meninjau kembali pemblokiran.',
'unblocklink' => 'hilangkan blokir',
'change-blocklink' => 'ubah blokir',
'contribslink' => 'kontrib',
+'emaillink' => 'kirim surel',
'autoblocker' => 'Diblokir secara otomatis karena alamat IP Anda digunakan oleh "[[User:$1|$1]]".
Alasan yang diberikan untuk pemblokiran $1 adalah: "$2"',
'blocklogpage' => 'Log pemblokiran',
@@ -2669,9 +2692,6 @@ Dalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabung
'movepage-page-moved' => 'Halaman $1 telah dipindahkan ke $2.',
'movepage-page-unmoved' => 'Halaman $1 tidak dapat dipindahkan ke $2.',
'movepage-max-pages' => 'Sejumlah maksimum $1 {{PLURAL:$1|halaman|halaman}} telah dipindahkan dan tidak ada lagi yang akan dipindahkan secara otomatis.',
-'1movedto2' => 'memindahkan [[$1]] ke [[$2]]',
-'1movedto2_redir' => 'memindahkan [[$1]] ke [[$2]] melalui peralihan',
-'move-redirect-suppressed' => 'pengalihan tidak dibuat',
'movelogpage' => 'Log pemindahan',
'movelogpagetext' => 'Di bawah ini adalah log pemindahan halaman.',
'movesubpage' => '{{PLURAL:$1|Subhalaman|Subhalaman}}',
@@ -2793,6 +2813,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
'import-upload' => 'Memuat data XML',
'import-token-mismatch' => 'Kehilangan data sesi. Silakan mencoba kembali.',
'import-invalid-interwiki' => 'Tidak dapat mengimpor dari wiki tersebut.',
+'import-error-edit' => 'Halaman "$1" tidak diimpor karena Anda tidak diizinkan untuk menyuntingnya.',
+'import-error-create' => 'Halaman "$1" tidak diimpor karena Anda tidak diizinkan untuk membuatnya.',
# Import log
'importlogpage' => 'Log impor',
@@ -2950,9 +2972,6 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
# Patrol log
'patrol-log-page' => 'Log patroli',
'patrol-log-header' => 'Ini adalah log revisi terpatroli.',
-'patrol-log-line' => 'menandai $1 dari $2 terpatroli $3',
-'patrol-log-auto' => '(otomatis)',
-'patrol-log-diff' => 'revisi $1',
'log-show-hide-patrol' => '$1 log patroli',
# Image deletion
@@ -2979,11 +2998,11 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
'file-info-size-pages' => '$1 × $2 piksel, ukuran berkas: $3, jenis MIME: $4, $5 {{PLURAL:$5|halaman|halaman}}',
-'file-nohires' => '<small>Tak tersedia resolusi yang lebih tinggi.</small>',
+'file-nohires' => 'Tak tersedia resolusi yang lebih tinggi.',
'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, besar berkas: $3',
'show-big-image' => 'Resolusi penuh',
-'show-big-image-preview' => '<small>Ukuran pratayang ini: $1.</small>',
-'show-big-image-other' => '<small>Resolusi lain: $1.</small>',
+'show-big-image-preview' => 'Ukuran pratayang ini: $1.',
+'show-big-image-other' => 'Resolusi lain: $1.',
'show-big-image-size' => '$1 × $2 piksel',
'file-info-gif-looped' => 'melingkar',
'file-info-gif-frames' => '$1 {{PLURAL:$1||}}frame',
@@ -3004,9 +3023,9 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
'sp-newimages-showfrom' => 'Tampilkan berkas baru dimulai dari $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'd',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'j',
+'seconds-abbrev' => '$1d',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1j',
# Bad image list
'bad_image_list' => 'Formatnya sebagai berikut:
@@ -3504,13 +3523,6 @@ Kode konfirmasi ini akan kedaluwarsa pada $4.',
'scarytranscludefailed' => '[Pengambilan templat $1 gagal]',
'scarytranscludetoolong' => '[URL terlalu panjang]',
-# Trackbacks
-'trackbackbox' => 'Lacak balik untuk halaman ini:<br />
-$1',
-'trackbackremove' => '([$1 Hapus])',
-'trackbacklink' => 'Lacak balik',
-'trackbackdeleteok' => 'Pelacakan balik berhasil dihapus.',
-
# Delete conflict
'deletedwhileediting' => "'''Peringatan''': Halaman ini telah dihapus setelah Anda mulai melakukan penyuntingan!",
'confirmrecreate' => "Pengguna [[User:$1|$1]] ([[User talk:$1|bicara]]) telah menghapus halaman selagi Anda mulai melakukan penyuntingan dengan alasan:
@@ -3730,13 +3742,16 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'tags-hitcount' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
# Special:ComparePages
-'comparepages' => 'Bandingkan halaman',
-'compare-selector' => 'Bandingkan revisi halaman',
-'compare-page1' => 'Halaman 1',
-'compare-page2' => 'Halaman 2',
-'compare-rev1' => 'Revisi 1',
-'compare-rev2' => 'Revisi 2',
-'compare-submit' => 'Bandingkan',
+'comparepages' => 'Bandingkan halaman',
+'compare-selector' => 'Bandingkan revisi halaman',
+'compare-page1' => 'Halaman 1',
+'compare-page2' => 'Halaman 2',
+'compare-rev1' => 'Revisi 1',
+'compare-rev2' => 'Revisi 2',
+'compare-submit' => 'Bandingkan',
+'compare-invalid-title' => 'Judul yang Anda berikan tidak sah.',
+'compare-title-not-exists' => 'Judul yang Anda minta tidak ada.',
+'compare-revision-not-exists' => 'Revisi yang Anda minta tidak ada.',
# Database error messages
'dberr-header' => 'Wiki ini bermasalah',
@@ -3763,4 +3778,61 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'sqlite-has-fts' => '$1 dengan dukungan pencarian teks lengkap',
'sqlite-no-fts' => '$1 tanpa dukungan pencarian teks lengkap',
+# New logging system
+'revdelete-content-hid' => 'konten disembunyikan',
+'revdelete-summary-hid' => 'ringkasan suntingan disembunyikan',
+'revdelete-uname-hid' => 'nama pengguna disembunyikan',
+'revdelete-content-unhid' => 'konten tidak disembunyikan',
+'revdelete-summary-unhid' => 'ringkasan suntingan tidak disembunyikan',
+'revdelete-uname-unhid' => 'nama pengguna tidak disembunyikan',
+'revdelete-restricted' => 'akses telah dibatasi untuk opsis',
+'revdelete-unrestricted' => 'pembatasan akses opsis dihapuskan',
+'newuserlog-byemail' => 'kata sandi dikirim melalui surel',
+
+# Feedback
+'feedback-subject' => 'Perihal:',
+'feedback-message' => 'Pesan:',
+'feedback-cancel' => 'Batal',
+'feedback-submit' => 'Kirim Umpan Balik',
+'feedback-adding' => 'Menambahkan umpan balik ke halaman...',
+'feedback-error1' => 'Galat: Hasil tidak dikenal dari API',
+'feedback-error2' => 'Galat: Penyuntingan gagal',
+'feedback-error3' => 'Error: API tidak merespons',
+
+# API errors
+'api-error-badaccess-groups' => 'Anda tidak diizinkan mengunggah berkas ke wiki ini.',
+'api-error-badtoken' => 'Kesalahan internal: token buruk.',
+'api-error-copyuploaddisabled' => 'Mengunggah melalui URL dilarang pada peladen ini.',
+'api-error-duplicate' => 'Sudah ada {{PLURAL:$1|[$2 berkas lain]|[$2 berkas lain]}} dengan konten yang sama di situs ini',
+'api-error-duplicate-archive' => 'Ada {{PLURAL:$1|[$2 berkas]|[$2 berkas]}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Berkas|Berkas-berkas}} duplikat yang telah dihapus',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Berkas|Berkas}} duplikat',
+'api-error-empty-file' => 'Berkas yang Anda kirim kosong.',
+'api-error-fetchfileerror' => 'Kesalahan internal: terjadi kesalahan saat memperoleh berkas ini.',
+'api-error-file-too-large' => 'Berkas yang Anda kirim terlalu besar.',
+'api-error-filename-tooshort' => 'Nama berkas terlalu pendek.',
+'api-error-filetype-banned' => 'Jenis berkas ini dilarang.',
+'api-error-filetype-missing' => 'Berkas tidak memiliki ekstensi.',
+'api-error-hookaborted' => 'Modifikasi yang Anda coba lakukan dibatalkan oleh suatu kaitan ekstensi.',
+'api-error-http' => 'Kesalahan internal: tidak dapat menghubungkan ke peladen.',
+'api-error-illegal-filename' => 'Nama berkas tidak diperbolehkan.',
+'api-error-internal-error' => 'Kesalahan internal: terjadi masalah saat memproses unggahan Anda ke wiki ini.',
+'api-error-invalid-file-key' => 'Kesalahan internal: berkas tidak ditemukan di penyimpanan sementara.',
+'api-error-missingparam' => 'Kesalahan internal: parameter permintaan hilang.',
+'api-error-missingresult' => 'Kesalahan internal: tidak dapat menentukan apakah penyalinan berhasil.',
+'api-error-mustbeloggedin' => 'Anda harus masuk log untuk mengunggah berkas.',
+'api-error-mustbeposted' => 'Ada bug dalam perangkat lunak ini; tidak menggunakan metode HTTP yang tepat.',
+'api-error-noimageinfo' => 'Pengunggahan berhasil, tetapi peladen tidak memberikan informasi apa pun tentang berkas.',
+'api-error-nomodule' => 'Kesalahan internal: tidak ada modul unggahan yang ditetapkan.',
+'api-error-ok-but-empty' => 'Kesalahan internal: tidak ada tanggapan dari peladen.',
+'api-error-overwrite' => 'Tidak diizinkan untuk menimpa berkas yang sudah ada.',
+'api-error-stashfailed' => 'Kesalahan internal: server gagal menyimpan berkas sementara.',
+'api-error-timeout' => 'Peladen tidak merespons dalam waktu yang diharapkan.',
+'api-error-unclassified' => 'Terjadi galat yang tidak diketahui',
+'api-error-unknown-code' => 'Kesalahan tidak dikenal: "$1"',
+'api-error-unknown-error' => 'Kesalahan internal: terjadi kesalahan saat mencoba mengunggah berkas Anda.',
+'api-error-unknown-warning' => 'Peringatan tidak dikenal: $1',
+'api-error-uploaddisabled' => 'Pengunggahan dinonaktifkan di wiki ini.',
+'api-error-verification-error' => 'Berkas ini mungkin rusak atau memiliki ekstensi yang salah.',
+
);
diff --git a/languages/messages/MessagesIe.php b/languages/messages/MessagesIe.php
index 7c20f1fc..83b82774 100644
--- a/languages/messages/MessagesIe.php
+++ b/languages/messages/MessagesIe.php
@@ -413,7 +413,6 @@ It posse contene un o plu carácteres quel ne posse esser usat in titules.',
Function: $1<br />
Question: $2',
'viewsource' => 'Vider fonte',
-'viewsourcefor' => 'por $1',
'viewsourcetext' => 'Vu posse vider e copiar li contenete de ti págine:',
'titleprotected' => 'Ti titul ha esset gardat de creation per [[User:$1|$1]].
Li motive dat es "\'\'$2\'\'".',
@@ -507,7 +506,6 @@ Por preventer misusa, solmen un parol-clave amemora va esser inviat per {{PLURAL
Tui adresse de IP va esser registrat in historico de redactiones de ti págine.",
'summary-preview' => 'Prevision de summarium:',
'subject-preview' => 'Prevision de Tema/Division:',
-'whitelistedittitle' => 'Exige que vu es identificat por redacter',
'whitelistedittext' => 'Vu have que $1 por redacter págines.',
'loginreqtitle' => 'Apertion de session obligatori',
'accmailtitle' => 'Li passa-parol es inviat.',
@@ -602,13 +600,9 @@ Legende: '''({{int:cur}})''' = diferenties che ultim revision, '''({{int:last}})
# Revision deletion
'rev-delundel' => 'monstrar/ocultar',
-'revdelete-logentry' => 'alterat visibilitá de revision de "[[$1]]"',
'revdel-restore' => 'change visibilitá',
'revdel-restore-deleted' => 'revisiones deletet',
'revdel-restore-visible' => 'revisiones visibil',
-'revdelete-content' => 'contenete',
-'revdelete-hid' => 'ocu $1',
-'revdelete-log-message' => '$1 por $2 {{PLURAL:$2|revision|revisiones}}',
# Suppression log
'suppressionlog' => 'Diarium de supression',
@@ -941,7 +935,7 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
'deadendpages' => 'Págines sin exeada',
'listusers' => 'Liste de usatores',
'usereditcount' => '$1 {{PLURAL:$1|redaction|redactiones}}',
-'usercreated' => 'Creat in $1 in $2',
+'usercreated' => '{{GENDER:$3|Creat}} in $1 in $2',
'newpages' => 'Nov págines',
'ancientpages' => 'Li max old págines',
'move' => 'Mover',
@@ -982,8 +976,7 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
'linksearch-line' => '$1 es ligat de $2',
# Special:Log/newusers
-'newuserlogpage' => 'Diarium de creation de usator',
-'newuserlog-create-entry' => 'Nov conto de usator',
+'newuserlogpage' => 'Diarium de creation de usator',
# Special:ListGroupRights
'listgrouprights-members' => '(liste de membres)',
@@ -1032,8 +1025,6 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
'delete-legend' => 'Deleter',
'actioncomplete' => 'Processu complet',
'actionfailed' => 'Processu fallit',
-'deletedarticle' => 'deletet "[[$1]]"',
-'suppressedarticle' => "supresset ''[[$1]]''",
'dellogpage' => 'Diarium de deletion',
'deletecomment' => 'Motive:',
'deleteotherreason' => 'Altri motive:',
@@ -1082,7 +1073,6 @@ Vu posse have un catenun mal, o li revision posse have esset restaurat o removet
'undeletereset' => 'Recomensar',
'undeleteinvert' => 'Inverter selection',
'undeletecomment' => 'Motive:',
-'undeletedarticle' => 'restaurat "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisiones}} restaurat',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revision|$1 revisiones}} e {{PLURAL:$2|1 file|$2 files}} restaurat',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} restaurat',
@@ -1166,19 +1156,17 @@ $1',
'block-log-flags-nocreate' => 'creation de conto debilisat',
# Move page
-'movearticle' => 'Mover págine:',
-'movenologin' => 'Vu ne ha intrat',
-'newtitle' => 'Por nov titul:',
-'move-watch' => 'Vigilar ti págine',
-'movepagebtn' => 'Mover págine',
-'talkexists' => "'''Li págine itself esset movet successosimen, ma li págine de discussion ne posset esser movet pro que un ja existe in li nov titul.
+'movearticle' => 'Mover págine:',
+'movenologin' => 'Vu ne ha intrat',
+'newtitle' => 'Por nov titul:',
+'move-watch' => 'Vigilar ti págine',
+'movepagebtn' => 'Mover págine',
+'talkexists' => "'''Li págine itself esset movet successosimen, ma li págine de discussion ne posset esser movet pro que un ja existe in li nov titul.
Pleser fuse les manualmen.'''",
-'movedto' => 'movet por',
-'1movedto2' => '[[$1]] hat movet por [[$2]]',
-'1movedto2_redir' => 'movet [[$1]] por [[$2]] redirectionment ultra',
-'movelogpage' => 'Diarium de movementiones',
-'movereason' => 'Motive:',
-'revertmove' => 'reverter',
+'movedto' => 'movet por',
+'movelogpage' => 'Diarium de movementiones',
+'movereason' => 'Motive:',
+'revertmove' => 'reverter',
# Export
'export' => 'Exportar págines',
@@ -1273,10 +1261,6 @@ Pleser fuse les manualmen.'''",
# Scripts
'vector.js' => '/* Alquel JavaScript ci va esser cargat por usatores que usa li pelle Vector */',
-# Patrol log
-'patrol-log-line' => 'marcat $1 de $2 protectet $3',
-'patrol-log-diff' => 'revision $1',
-
# Browsing diffs
'previousdiff' => '↠Redaction anteriori',
'nextdiff' => 'Proxim redaction →',
@@ -1285,7 +1269,7 @@ Pleser fuse les manualmen.'''",
'thumbsize' => 'Mesura de miniatura:',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|págine|págines}}',
'file-info-size' => '$1 × $2 pixeles, dimension de file: $3, tip MIME: $4',
-'file-nohires' => '<small>Nequant resolution max alt disponibil.</small>',
+'file-nohires' => 'Nequant resolution max alt disponibil.',
'svg-long-desc' => '(file SVG, nominalmen $1 × $2 pixeles, mesura de file: $3)',
'show-big-image' => 'Resolution complet',
@@ -1331,13 +1315,6 @@ Altri va esser ocultat per contumacie.
'namespacesall' => 'omni',
'monthsall' => 'omni',
-# Trackbacks
-'trackbackbox' => 'Tracies de dorse por ti págine:<br /> $1',
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 Deleter])',
-'trackbacklink' => 'Tracie de dorse',
-'trackbackdeleteok' => 'Li tracie de dorse esset deletet che successe',
-
# Multipage image navigation
'imgmultigo' => 'Ear!',
diff --git a/languages/messages/MessagesIg.php b/languages/messages/MessagesIg.php
index da9ab124..5bbe1399 100644
--- a/languages/messages/MessagesIg.php
+++ b/languages/messages/MessagesIg.php
@@ -12,22 +12,36 @@
*/
$namespaceNames = array(
- NS_MEDIA => 'Nká',
+ NS_MEDIA => 'Midia',
NS_SPECIAL => 'Ihü_kárírí',
NS_TALK => 'Okwu',
- NS_USER => 'Ọ\'bànifé',
- NS_USER_TALK => 'Okwu_á»\'bànifé',
+ NS_USER => 'Ọbanife',
+ NS_USER_TALK => 'Okwu_á»banife',
NS_PROJECT_TALK => 'Okwu_$1',
- NS_FILE => 'Ãkwúkwó_orünotu',
- NS_FILE_TALK => 'Okwu_ákwúkwó_orünotu',
- NS_MEDIAWIKI => 'NkáWiki',
- NS_MEDIAWIKI_TALK => 'Okwu_NkáWiki',
+ NS_FILE => 'Usòrò',
+ NS_FILE_TALK => 'Okwu_usòrò',
+ NS_MEDIAWIKI => 'MidiaWiki',
+ NS_MEDIAWIKI_TALK => 'Okwu_MidiaWiki',
NS_TEMPLATE => 'Àtụ',
NS_TEMPLATE_TALK => 'Okwu_àtụ',
- NS_HELP => 'Nkwádá»',
- NS_HELP_TALK => 'Okwu_nkwádá»',
- NS_CATEGORY => 'Ébéoná»r',
- NS_CATEGORY_TALK => 'Okwu_ébéoná»r',
+ NS_HELP => 'Nkwadá»',
+ NS_HELP_TALK => 'Okwu_nkwadá»',
+ NS_CATEGORY => 'Òtù',
+ NS_CATEGORY_TALK => 'Okwu_òtù',
+);
+
+$namespaceAliases = array(
+ 'Nká' => NS_MEDIA,
+ 'Ọ\'bànifé' => NS_USER,
+ 'Okwu_á»\'bànifé' => NS_USER_TALK,
+ 'Ãkwúkwó_orünotu' => NS_FILE,
+ 'Okwu_ákwúkwó_orünotu' => NS_FILE_TALK,
+ 'NkáWiki' => NS_MEDIAWIKI,
+ 'Okwu_NkáWiki' => NS_MEDIAWIKI_TALK,
+ 'Nkwádá»' => NS_HELP,
+ 'Okwu_nkwádá»' => NS_HELP_TALK,
+ 'Ébéoná»r' => NS_CATEGORY,
+ 'Okwu_ébéoná»r' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
@@ -47,16 +61,16 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#KÚFÙ', '#REDIRECT' ),
- 'fullpagename' => array( '1', 'ÃHÀNÃLÉNKÈIHÃœ', 'FULLPAGENAME' ),
- 'msg' => array( '0', 'OZI:', 'MSG:' ),
- 'img_right' => array( '1', 'áká_ịkẹngạ', 'right' ),
- 'img_left' => array( '1', 'áká_èkpè', 'left' ),
- 'img_top' => array( '1', 'élú', 'top' ),
- 'img_middle' => array( '1', 'ẹtítì', 'middle' ),
- 'img_text_bottom' => array( '1', 'okpúrù-ede', 'text-bottom' ),
- 'displaytitle' => array( '1', 'ZIÃSHÃ', 'DISPLAYTITLE' ),
- 'pagesize' => array( '1', 'ÀSÃIHÃœ', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#KÚFÙ', '#REDIRECT' ),
+ 'fullpagename' => array( '1', 'ÃHÀNÃLÉNKÈIHÃœ', 'FULLPAGENAME' ),
+ 'msg' => array( '0', 'OZI:', 'MSG:' ),
+ 'img_right' => array( '1', 'áká_ịkẹngạ', 'right' ),
+ 'img_left' => array( '1', 'áká_èkpè', 'left' ),
+ 'img_top' => array( '1', 'élú', 'top' ),
+ 'img_middle' => array( '1', 'ẹtítì', 'middle' ),
+ 'img_text_bottom' => array( '1', 'okpúrù-ede', 'text-bottom' ),
+ 'displaytitle' => array( '1', 'ZIÃSHÃ', 'DISPLAYTITLE' ),
+ 'pagesize' => array( '1', 'ÀSÃIHÃœ', 'PAGESIZE' ),
);
$messages = array(
@@ -402,12 +416,11 @@ Biko chi ihe á na áká [[Special:ListUsers/sysop|onye íshí]], dètú URL.',
'badtitle' => 'Ishi edemede öjö',
'badtitletext' => 'Ãshí ihü à chá»rỠà díghị ézíbóté, efù, mà ȯ dị jikodo di jikodo nke ojö na nke íshí asụsụ-mmékotárí ma wiki-mmékotárí.
O nwèríkí nwé édé ótù ma nke ozor nke ékwéghị na íshí ihü.',
-'perfcached' => 'Ómárí á kachẹrẹ na o nwẹrẹ ki a kugwaghị ya na ogẹ di nso',
+'perfcached' => 'Ómárí á kachẹrẹ na o nwẹrẹ ki a kugwaghị ya na ogẹ di nso. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
'wrong_wfQuery_params' => 'Okè nke défiere gá Ãjújúwf()<br />
Orürü: $1<br />
Ãjújú: $2',
'viewsource' => 'Zi mkpurụ',
-'viewsourcefor' => 'màkà $1',
'actionthrottled' => 'Mmèmé a puziélé',
'protectedpagetext' => 'Ihüá cedolụ maka orürü ạ gáa bá.',
'viewsourcetext' => 'à nwèríkí lé na à jé mkpurụ ihüá:',
@@ -547,9 +560,6 @@ Lè mákwá na ÃŒ gágị jí "me á»\'bànifé nkeá e-mail", mà à nwéré e
IP gi bu $3, na ID nkwàchi bu #$5.
Biko tinyé cha ihe ńdía na ájújú nkeówulà I gi me.',
'blockednoreason' => 'amaghi ihe omẹrẹ ya maka',
-'blockedoriginalsource' => "Nkpurụ '''$1''' zịrị na alạ:",
-'blockededitsource' => "Mkpụrụ edemede nke '''orü gi''' nke '''$1''' zìrì na àlà:",
-'whitelistedittitle' => 'I kweshiri banyé I chori rüwa nga',
'whitelistedittext' => 'à gi $1 à rü na ihü.',
'nosuchsectiontitle' => 'Aná a hu nkeji',
'loginreqtitle' => 'I kweshiri banyé eba',
@@ -659,13 +669,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
'revdel-restore-deleted' => 'orürü gbakashịrị',
'pagehist' => 'Ãkíkó mbu maka ihüá',
'deletedhist' => 'Ãkíkó mbu bakashịrị',
-'revdelete-content' => 'iheníle',
-'revdelete-summary' => 'mmẹkotá orü',
-'revdelete-uname' => "áhà á»'bànifé",
-'revdelete-hid' => 'zonariri $1',
-'revdelete-unhid' => 'a zonariri $1',
-'revdelete-log-message' => '$1 màkà $2 {{PLURAL:$2|orübà|orübà}}',
-'logdelete-log-message' => '$1 màkà $2 {{PLURAL:$2|ihe mèrè|ihe mèrè}}',
'revdelete-reasonotherlist' => 'Mgbághàpụtá ozor',
'revdelete-edit-reasonlist' => 'Rüwa mgbághapụtà nkàchafu',
'revdelete-offender' => 'Ọde akwukwo nke orübà:',
@@ -768,7 +771,7 @@ Nwàné ótù okwu íshí na ihe à nè tú jí ''háníle:'' à tuó ihe nílé
'prefs-personal' => "Nkówá á»'bànifé",
'prefs-rc' => 'Gbanwere mere ogẹ di nso',
'prefs-watchlist' => 'Ndétụnlé',
-'prefs-watchlist-days-max' => 'Okè chi 7',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-misc' => 'Mcheta-ma-mchetaghim',
'prefs-resetpass' => 'Gbanwe okwu éjị à gáfe',
'prefs-email' => 'Màkà e-mail',
@@ -1102,8 +1105,7 @@ Ubwa, o na ga [[$2]].',
'activeusers-noresult' => "Ọ hügị á»'bànifé.",
# Special:Log/newusers
-'newuserlogpage' => "Ndétu nchétá ihe á»'bànifé kèrè",
-'newuserlog-create-entry' => "Ọ'bànifé ohúrù",
+'newuserlogpage' => "Ndétu nchétá ihe á»'bànifé kèrè",
# Special:ListGroupRights
'listgrouprights-group' => 'Ọtú',
@@ -1160,7 +1162,6 @@ Biko sí nà á» bụ ihe à chá»rá», na à mà ihe gi mè, na à nè me ya kÃ
'actioncomplete' => 'Ọ méchá',
'deletedtext' => '"$1" à gbákáshíálá.
Lé $2 màkà okwu gbásárá ihe Ỡgbakashiri màkà.',
-'deletedarticle' => 'gbakashịrị "[[$1]]"',
'dellogpage' => 'Ntínyé ngbákashị',
'deletecomment' => 'Màkà:',
'deleteotherreason' => 'Màkà ihe ozor kwa:',
@@ -1217,7 +1218,6 @@ Ngá bu ihe hé mèkwàrà nà ihü '''$1''':",
'undeleteviewlink' => 'lé',
'undeletereset' => 'Hafù ya otụ o di',
'undeletecomment' => 'Mgbághapụtà:',
-'undeletedarticle' => "dá»sèwàrị ''[[$1]]''",
'undelete-search-submit' => 'Chá»wa',
'undelete-show-file-submit' => 'Eeh',
@@ -1338,8 +1338,6 @@ Biko tinyé ha nà áká gi.'''",
'move-talk-subpages' => 'Páfù ihü-n-ímé nke ihü okwu (nè rú $1)',
'movepage-page-moved' => 'Ihü $1 a páfùrù gá $2.',
'movepage-page-unmoved' => 'Ihü $1 énweghịkị páfù gá $2.',
-'1movedto2' => 'páfùrù [[$1]] gá [[$2]]',
-'1movedto2_redir' => 'páfùrù [[$1]] gá [[$2]] na élú nkúfù',
'movelogpage' => 'Páfù ntínyé',
'movereason' => 'Mgbághapụtà:',
'revertmove' => 'gbanwe lá àzú',
@@ -1457,9 +1455,6 @@ Biko meríáríá ozor.',
# Spam protection
'spamprotectiontitle' => 'Ihe na zata maka cẹdolu ụrú',
-# Patrol log
-'patrol-log-diff' => 'orübà nke $1',
-
# Image deletion
'filedeleteerror-short' => 'Nsògbú í kàcha usòrò: $1',
@@ -1469,7 +1464,7 @@ Biko meríáríá ozor.',
# Media information
'file-info-size' => '$1 × $2 pixel, ívù akwukwo orunótu: $3, MIME nke: $4',
-'file-nohires' => '<small>Nke káchá mmá na ányá àdíghị.</small>',
+'file-nohires' => 'Nke káchá mmá na ányá àdíghị.',
'svg-long-desc' => 'usòrò SVG, nà áhà pixel $1 × $2, ívụ usòrò: $3',
'show-big-image' => 'Hü ya ka o dị',
'file-info-gif-looped' => 'etemte',
@@ -1581,10 +1576,6 @@ Nke ozor gí zonari na áká onwe ha.
'monthsall' => 'nke níle',
'limitall' => 'nke níle',
-# Trackbacks
-'trackbackremove' => '([$1 Kàcha])',
-'trackbacklink' => 'Nlá-nà-àzú',
-
# Delete conflict
'recreate' => 'Ké ya ohúrù',
diff --git a/languages/messages/MessagesIi.php b/languages/messages/MessagesIi.php
index 1dc08fea..386ae43c 100644
--- a/languages/messages/MessagesIi.php
+++ b/languages/messages/MessagesIi.php
@@ -10,7 +10,7 @@
* @author Biŋhai
*/
-$fallback = 'zh-cn';
+$fallback = 'zh-cn, zh-hans';
$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).
diff --git a/languages/messages/MessagesIk.php b/languages/messages/MessagesIk.php
index 2fa1fb3b..65eb8163 100644
--- a/languages/messages/MessagesIk.php
+++ b/languages/messages/MessagesIk.php
@@ -8,6 +8,7 @@
* @file
*
* @author Hercule
+ * @author Zanimum (on ik.wikipedia.org)
*/
$messages = array(
diff --git a/languages/messages/MessagesIke_cans.php b/languages/messages/MessagesIke_cans.php
index d5723012..d9167470 100644
--- a/languages/messages/MessagesIke_cans.php
+++ b/languages/messages/MessagesIke_cans.php
@@ -339,8 +339,6 @@ $messages = array(
'move-page-legend' => 'á…áŠá”ªá–… ᒪᑉá±á‘•á–…',
'movearticle' => 'á…áŠá”ªá–… ᒪᑉá±á‘•á–…',
'movedto' => 'á…áŠá”ªá–…',
-'1movedto2' => '[[$1]] ᓱá•á•‹á’ªá”ªá–… [[$2]]',
-'1movedto2_redir' => '[[$1]] ᓱá•á•‹á’ªá”ªá–… [[$2]] ᒥᓯᑉṠᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ á‹á“¯á‘¦ ᓇᑭᑦ',
'movelogpage' => 'á…áŠá”ªá–… á“‚á±',
'movereason' => 'áƒá“±á’ªá’ƒá“´á–…ᓯá…ᕈá“ᓇᑦᑎáŠá•á“‚á–…:',
'delete_and_move' => 'á“‚á¸á–…á‘Žá¹ áŠá’»á’ª á…áŠá”ªá–…',
diff --git a/languages/messages/MessagesIke_latn.php b/languages/messages/MessagesIke_latn.php
index e67c03a1..3265c55a 100644
--- a/languages/messages/MessagesIke_latn.php
+++ b/languages/messages/MessagesIke_latn.php
@@ -311,8 +311,6 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
'move-page-legend' => 'uajuq mappitaq',
'movearticle' => 'uajuq mappitaq',
'movedto' => 'uajuq',
-'1movedto2' => '[[$1]] surramajuq [[$2]]',
-'1movedto2_redir' => '[[$1]] surramajuq [[$2]] misippaa qaningani kamagijaq aasit nakit',
'movelogpage' => 'uajuq nipi',
'delete_and_move' => 'nipaqtipaa amma uajuq',
diff --git a/languages/messages/MessagesIlo.php b/languages/messages/MessagesIlo.php
index 0fa28e0e..9e91db97 100644
--- a/languages/messages/MessagesIlo.php
+++ b/languages/messages/MessagesIlo.php
@@ -372,23 +372,25 @@ Panngaasim ta ibagam kadagiti [[Special:ListUsers/sysop|administrador]], isurat
'badarticleerror' => 'Saan a matungpal daytoy nga aramid iti daytoy a panid.',
'cannotdelete' => 'Ti panid wenno ti papeles "$1" ket saan a maikkat.
Amangan no addan sabali a nangikkat.',
+'cannotdelete-title' => 'Saan a maikkat ti panid a "$1"',
'badtitle' => 'Madi a titulo',
'badtitletext' => 'Ti nakiddaw a titulo ti panid ket imbalido, blanko, wenno saan nga umno a naisilpo a titulo a maki-pagsasao wenno maki-wiki.
Adda ngata nagyan a maysa wenno ad-adu pay a kababalin a saan a mausar iti titulo.',
-'perfcached' => 'Ti sumaganad a data ket naka-cached ken mabalin a saan a napabaro.',
-'perfcachedts' => 'Ti sumaganad a data ket naka-cached, ken naudi a napabaro idi $1.',
+'perfcached' => 'Ti sumaganad a data ket naka-cached ken mabalin a saan a napabaro. T kangato a {{PLURAL:$1|maysa a nagbanagan ket|$1 dagiti nagbanagan}} ket magun-od idiay cache.',
+'perfcachedts' => 'Ti sumaganad a data ket naka-cached, ken naudi a napabaro idi $1. T kangato a {{PLURAL:$4|maysa a nagbanagan ket|$4 dagiti nagbanagan}} ket magun-od idiay cache.',
'querypage-no-updates' => 'Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado.
Saan a mipasaradiwa ita dagiti data ditoy.',
'wrong_wfQuery_params' => 'Kamali a parametro iti wfQuery()<br />
Opisio: $1<br />
Panagsapul: $2',
'viewsource' => 'Kitaen ti taudan',
-'viewsourcefor' => 'para iti $1',
+'viewsource-title' => 'Kitaen ti taudan iti $1',
'actionthrottled' => 'Napabuntog ti aramid',
'actionthrottledtext' => 'Para ti pagkontra ti spam, naipatingga ka ti pinagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalippasamon ti patingga.
Pangngaasi ta ipadas mo manen no madamdama.',
'protectedpagetext' => 'Nasalakniban daytoy a panid tapno pawilan ti panag-urnos.',
'viewsourcetext' => 'Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:',
+'viewyourtext' => "Mabalin mo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
'protectedinterface' => 'Daytoy a panid ket mangited ti teksto nga interface para iti software, ken nasalakniban tapno pawilan ti panag-abuso.',
'editinginterface' => "'''Ballaag:''' Ururnosam ti maysa a panid a maar-aramat a mangted iti teksto ti interface para iti software.
Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti agaramat nga interface dagiti sabali nga agar-aramat.
@@ -496,6 +498,7 @@ Awan ti e-surat nga ipatulod para dagitoy a langa.',
'emailconfirmlink' => 'Pasingkedam ti e-surat a pagtaengam',
'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat, ket kasla addaan ti saan a napudno a nakabuklan.
Pangngaasi ta ikkam ti nasayaat a nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
+'cannotchangeemail' => 'Dagiti pakabilangan nga e-surat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
'accountcreated' => 'Naaramiden ti pakabilangan',
'accountcreatedtext' => 'Naaramiden ti pakabilangan a pagaramat ni $1.',
'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
@@ -511,6 +514,7 @@ Pangaasim ta aguray ka sakbay nga agipadas manen.',
# E-mail sending
'php-mail-error-unknown' => 'Di am-ammo a biddut ti kukua ti PHP a surat () nga opisio.',
+'user-mail-no-addy' => 'Pinadas nga impatulod ti e-surat nga awan ti e-surat a pagtaengan na.',
# Change password dialog
'resetpass' => 'Sukatan ti kontrasenias',
@@ -533,16 +537,18 @@ Baka mabalin a nasukatam metten ti kontrasenias mo wenno nagkiddaw ka ti saan ng
'resetpass-temp-password' => 'Saan nga agnayon a kontrasenias:',
# Special:PasswordReset
-'passwordreset' => 'Ipasubli ti kontrasenias',
-'passwordreset-text' => 'Lippasem daytoy a kinabuklan tapno maipatulodan ka ti e-surat a palagipan kadagiti dsalaysay ti pakabilangam.',
-'passwordreset-legend' => 'Ipasubli ti kontrasenias',
-'passwordreset-disabled' => 'Naikkat dagiti pagisubli iti kontrasenias daytoy a wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a bukel ti data dita baba}}',
-'passwordreset-username' => 'Nagan ti agar-aramat:',
-'passwordreset-domain' => 'Pagturayan:',
-'passwordreset-email' => 'E-surat a pagtaengan:',
-'passwordreset-emailtitle' => 'Detalye ti pakabilangan iti {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Addaan (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti palagip para
+'passwordreset' => 'Ipasubli ti kontrasenias',
+'passwordreset-text' => 'Lippasem daytoy a kinabuklan tapno maipatulodan ka ti e-surat a palagipan kadagiti dsalaysay ti pakabilangam.',
+'passwordreset-legend' => 'Ipasubli ti kontrasenias',
+'passwordreset-disabled' => 'Naikkat dagiti pagisubli iti kontrasenias daytoy a wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a bukel ti data dita baba}}',
+'passwordreset-username' => 'Nagan ti agar-aramat:',
+'passwordreset-domain' => 'Pagturayan:',
+'passwordreset-capture' => 'Kayatmo a kitaen ti nagbanagan ti e-surat?',
+'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda saan nga agnayon a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
+'passwordreset-email' => 'E-surat a pagtaengan:',
+'passwordreset-emailtitle' => 'Detalye ti pakabilangan iti {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Addaan (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti palagip para
dagiti detalye ti pakabilangam para iti {{SITNAME}} ($4) . Ti sumaganad {{PLURAL:$3|a pakabilangan|a dadagiti pakabilangan}} ti agar-aramat ket
nakairaman iti daytoy nga e-surat a pagtaengan:
@@ -552,7 +558,7 @@ $2
Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a
panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken
agtuloy ka nga agusar ti daan a kontrasenias.',
-'passwordreset-emailtext-user' => 'Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti palagip para dagiti detalye ti pakabilangan iti {{SITENAME}}
+'passwordreset-emailtext-user' => 'Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti palagip para dagiti detalye ti pakabilangan iti {{SITENAME}}
($4) . Ti sumaganad {{PLURAL:$3|a pakabilangan|kadagiti pakabilangan}} ti agar-aramat ket
nakairaman iti daytoy nga e-surat a pagtaengan:
@@ -562,9 +568,22 @@ $2
Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a
panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken
agtuloy kan nga agusar ti daan a kontrasenias mo.',
-'passwordreset-emailelement' => 'Nagan ti agar-aramat: $1
+'passwordreset-emailelement' => 'Nagan ti agar-aramat: $1
Saan nga agnayon a kontrasenias: $2',
-'passwordreset-emailsent' => 'Maipatuloden ti e-surat a palagip.',
+'passwordreset-emailsent' => 'Maipatuloden ti e-surat a palagip.',
+'passwordreset-emailsent-capture' => 'Naipatulod ti palagip nga e-surat, a napaikita dita baba.',
+'passwordreset-emailerror-capture' => 'Naaramid ti palagip nga e-surat, a napaikita dita baba, ngem madi a napaitulod ti agar-aramat: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Sukatan ti e-surat a pagtaengan',
+'changeemail-header' => 'Sukatan ti e-surat a pagtaengan ti pakabilangan',
+'changeemail-text' => 'Lippasem daytoy a kabuklan ti panagsukat ti e-surat a pagtaengam. Masapul mo nga ikabil ti kontrasenias mo tapno mapasingkedan ti panagsukat.',
+'changeemail-no-info' => 'Masapul a nakastrekka tapno dagus ka a makapan ditoy a panid.',
+'changeemail-oldemail' => 'Agdama nga E-surat a pagtaengam:',
+'changeemail-newemail' => 'Baro nga e-surat a pagtaengam:',
+'changeemail-none' => '(awan)',
+'changeemail-submit' => 'Sukatan ti e-surat',
+'changeemail-cancel' => 'Ukasen',
# Edit page toolbar
'bold_sample' => 'Napuskol a teksto',
@@ -634,9 +653,6 @@ naserraan ti panag-usar na.
Ti tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.
Pangaasi nga iraman mo amin dagiti detalye ti amin a panagsaludsod mo.',
'blockednoreason' => 'awan ti naited a rason',
-'blockedoriginalsource' => "Makita iti baba ti taudan ti '''$1''':",
-'blockededitsource' => "Makita iti baba '''dagiti panangbalbaliwmo''' iti '''$1''':",
-'whitelistedittitle' => 'Masapul nga nakastrekka tapno makabaliwan ka',
'whitelistedittext' => 'Masapul a/nga $1 ka tapno makaurnos kadagiti panid.',
'confirmedittext' => 'Masapul a pasingkedam ti e-surat sakbay a makaurnos ka kadagiti panid.
Pangngaasim nga ikabil ken ipapudnom ti e-suratmo idiay [[Special:Preferences|kaykayat dagiti agar-aramat ]].',
@@ -729,8 +745,8 @@ Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno t
No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladam ngem iti maysa a nawaya a pagturayan ti publiko wenno pumadmad a libre a pagtaudan (kitaen ti $1 para iti detalye).
'''Saan a mangipan iti addaan ti karbengan ti pinagpablaak nga obra no awan ti pammalubos!'''",
-'longpageerror' => "'''Biddut: Ti teksto nga intedmo ket agatiddog iti $1 a kilobytes, nga at-atiddog ngem ti mayat $2 a kilobytes.
-Isut' gapuna a saan a maidulin.'''",
+'longpageerror' => "'''Biddut: Ti teksto nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kil-kilobyte}} a katiddog, nga at-atiddog ngem ti kangatuan iti {{PLURAL:$2|maysa a kilobyte|$2 kil-kilobyte}}.'''
+Isut' gapuna a saan a maidulin.",
'readonlywarning' => "'''Ballaag: Nakandadoan ti database tapno masimpaan, saan mo a mabalin nga idulin dagita inurnos mo tattan.'''
No kayatmo i \"cut-n-paste\" mo dagiti teksto iti teksto a papeles ken idulin mo no madamdama.
@@ -900,8 +916,6 @@ Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalin da a serrekan
'revdelete-unsuppress' => 'Ikkaten dagiti pannakaiparit kadagiti naisubli a binaliwan',
'revdelete-log' => 'Rason:',
'revdelete-submit' => 'Ipakat iti napili {{PLURAL:$1|a panamalbaliw|dagiti panamalbaliw}}',
-'revdelete-logentry' => 'nasuktan ti visibility ti [[$1]]',
-'logdelete-logentry' => 'nasuktan ti event visibility ti [[$1]]',
'revdelete-success' => "'''Balligi ti pinakabaro ti pinakakita ti pinagbaliwan.'''",
'revdelete-failure' => "'''Saan a napabaro ti pinakakita ti pinagbaliwan.'''
$1",
@@ -913,15 +927,6 @@ $1",
'revdel-restore-visible' => 'makita a pinagbaliwan',
'pagehist' => 'Pakasaritaan ti panid',
'deletedhist' => 'Naikkat a pakasaritaan',
-'revdelete-content' => 'linaon',
-'revdelete-summary' => 'pakabuklan ti panagedit',
-'revdelete-uname' => 'nagan ti agar-aramat',
-'revdelete-restricted' => 'naipakat dagiti pammarit kadagiti administrador',
-'revdelete-unrestricted' => 'naikkat dagiti pammarit para kadagiti administrador',
-'revdelete-hid' => 'ilemmeng ti $1',
-'revdelete-unhid' => 'saanen nga ilemmeng ti $1',
-'revdelete-log-message' => '$1 para iti $2 {{PLURAL:$2|a panamalbaliw|a panamalbaliw}}',
-'logdelete-log-message' => '$1 para iti $2 {{PLURAL:$2|a pasamak|a paspasamak}}',
'revdelete-hide-current' => 'Biddut ti pinakailemmeng ti banag napetsado a $2, $1: Daytoy ti kinaudian a pinagbaliwan.
Saan nga mailemmeng.',
'revdelete-show-no-access' => 'Biddut ti panagpakita ti banag a petsado a $2, $1: Daytoy ket namarkaan a "nakedngan".
@@ -1080,12 +1085,14 @@ Laglagipem laeng a dagiti listaan da a nagyan ti {{SITENAME}} saan a barbaro.',
'prefs-rc' => 'Kaudian a balbaliw',
'prefs-watchlist' => 'Listaan ti bambantayan',
'prefs-watchlist-days' => 'Manu nga aldaw nga agparang iti listaan ti bambantayan:',
-'prefs-watchlist-days-max' => 'Pinakangato a 7 nga aldaw',
+'prefs-watchlist-days-max' => 'Pinakangato nga $1 {{PLURAL:$1|aldaw|al-aldaw}}',
'prefs-watchlist-edits' => 'Pinakangato a bilang ti ipakita kadagiti sinukatan a napadakkel a bambantayan:',
'prefs-watchlist-edits-max' => 'Pinakangato a bilang: 1000',
'prefs-watchlist-token' => 'Tandaan ti bambantayan:',
'prefs-misc' => 'Sabsabali',
'prefs-resetpass' => 'Sukatan ti kontrasenias',
+'prefs-changeemail' => 'Sukatan ti e-surat a pagtaengan',
+'prefs-setemail' => 'Ikabil ti e-surat a pagtaengan',
'prefs-email' => 'Pagpilian ti e-surat',
'prefs-rendering' => 'Tabas',
'saveprefs' => 'Idulin',
@@ -1146,6 +1153,7 @@ Ngem saanto a mabalinen nga ipasubli.',
'yourrealname' => 'Pudno a nagan:',
'yourlanguage' => 'Pagsasao:',
'yourvariant' => 'Linaon ti sabali a pagsasao:',
+'prefs-help-variant' => 'Ti kaykayat mo a sabsabali a pinagsurat a maipakita kadagiti linaon ti panid daytoy a wiki.',
'yournick' => 'Baro a pirma:',
'prefs-help-signature' => 'Komentario kadagiti pakipatangan a panid ket mapirmaan koma iti "<nowiki>~~~~</nowiki>" nga agpabalin ti pirmam ken ti petsa.',
'badsig' => 'Saan a pudno a kilaw a pirma.
@@ -1189,6 +1197,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
'userrights-lookup-user' => 'Agtaripatu kadagiti bunggoy ti agar-aramat',
'userrights-user-editname' => 'Mangiserrek iti nagan-agar-aramat:',
'editusergroup' => 'Urnosen dagita bunggoy ti agar-aramat',
+'editinguser' => "Suksukatan ti karbengan ti agar-aramat ni '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Urnosen dagita bunggoy ti agar-aramat',
'saveusergroups' => 'Idulin dagita bunggoy ti agar-aramat',
'userrights-groupsmember' => 'Kameng iti:',
@@ -1282,13 +1291,13 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
'right-autopatrol' => 'Dagiti inurnos mo ket mamarkaan nga automatiko a napatruliaan',
'right-patrolmarks' => 'Kitaen dagiti kinaudian a binaliwan a napatruliaan a marka',
'right-unwatchedpages' => 'Kitaen ti listaan dagiti saan a nabambantayan a panid',
-'right-trackback' => 'Mangted iti trackback',
'right-mergehistory' => 'Pagtitiponen ti pakasaritaan dagiti panid',
'right-userrights' => 'Urnosen amin dagiti karbengan ti agar-aramat',
'right-userrights-interwiki' => 'Urnosen dagiti karbengan ti agar-aramat kadagiti agar-aramat iti sabsabali a wiki',
'right-siteadmin' => 'Ikandado ken lukatan ti database',
'right-override-export-depth' => 'Ipan dagiti panid ken iraman dagiti nasilpo a panid iti kauneg nga 5',
'right-sendemail' => 'Agpatulod ti e-surat kadagiti sabali nga agar-aramat',
+'right-passwordreset' => 'Kitaen dagiti e-surat ti naipasubli a kontrasenias',
# User rights log
'rightslog' => 'Listaan dagiti karbengan ti agar-aramat',
@@ -1322,16 +1331,17 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
'action-suppressionlog' => 'kitaen ti listaan a pribado',
'action-block' => 'serraan daytoy nga agar-aramat manipud ti panag-urnos',
'action-protect' => 'sukatan dagiti lessaad ti salaknib iti daytoy a panid',
+'action-rollback' => 'pardasan nga ipasubli dagiti inurnos ti kinaudi nga agar-aramat a nagurnos ti kaskasta a panid',
'action-import' => 'agala ka ti panid iti sabali a wiki',
'action-importupload' => 'alaem daytoy a panid idiay naipan a papeles',
'action-patrol' => 'Markaan a kas napatruliaan dagiti inurnos ti dadduma',
'action-autopatrol' => 'markaam dagiti napatruliam nga inurnos',
'action-unwatchedpages' => 'kitaen ti listaan dagiti saan a nabambantayan a panid',
-'action-trackback' => 'mangted iti trackback',
'action-mergehistory' => 'Pagtitiponen ti pakasaritaan daytoy a panid',
'action-userrights' => 'urnosen amin dagiti karbengan ti agar-aramat',
'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' => 'ipatulod dagiti e-surat',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
@@ -1363,6 +1373,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
'number_of_watching_users_pageview' => '[$1 bambantayan {{PLURAL:$1|ti agar-aramat|dagiti agar-aramat}}]',
'rc_categories' => 'Patingga dagiti kategoria (pagsisinaen ti "|")',
'rc_categories_any' => 'Uray ania',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} kalpasan ti panag-sukat',
'newsectionsummary' => '/* $1 */ baro a paset',
'rc-enhanced-expand' => 'Ipakita dagiti salaysay (masapul ti JavaScript)',
'rc-enhanced-hide' => 'Illemmeng dagiti detalye',
@@ -1417,6 +1428,7 @@ Kitaen dagiti [[Special:NewFiles|galleria ti baro a papeles]] ti adu pay a pinan
'minlength1' => 'Dagiti nagan ti papeles ket nasken uray a maysa laeng a letra wenno nasursurok.',
'illegalfilename' => 'Ti nagan ti papeles "$1" ket adda nagyan na a kababalin a saan a mabalin kadagiti titulo ti panid.
Pangngaasi ta naganan manen ti papeles ken padasen manen nga ipapan.',
+'filename-toolong' => 'Dagiti nagan ti papeles ket saan a mabalin nga at-atiddog ngem 240 bytes.',
'badfilename' => 'Nasukatan ti nagan ti papeles iti "$1".',
'filetype-mime-mismatch' => 'Ti pagpa-atiddog ti papeles ".$1" ket saan a kapada ti nakitaan a kita ti MIME iti papeles ($2).',
'filetype-badmime' => 'Dagiti papeles a kas MIME a kita "$1" ket saan a mapalubosan a maipan.',
@@ -1519,6 +1531,40 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
'upload-unknown-size' => 'Di ammo ti kadakkel na',
'upload-http-error' => 'Naka-adda ti biddut ti HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Saan a maiwaig ti papeles $1.',
+'backend-fail-backup' => 'Saan a maidulin ti papeles $1.',
+'backend-fail-notexists' => 'Ti papeles a $1 ket awanen.',
+'backend-fail-hashes' => 'Saana maala dagiti papeles a hash tapno maipada.',
+'backend-fail-notsame' => 'Addaan ti saan a kapada tipapeles idiay $1.',
+'backend-fail-invalidpath' => '$1 ket imbalido a pagnaan ti pagidulinan.',
+'backend-fail-delete' => 'Saan a maikkat ti papeles $1.',
+'backend-fail-alreadyexists' => 'Ti papeles $1 ket aaddanen.',
+'backend-fail-store' => 'Saan a maidulin ti papeles $1 idiay $2.',
+'backend-fail-copy' => 'Saan a makopia ti papeles $1 idiay $2.',
+'backend-fail-move' => 'Saan a maiyalis ti papeles $1 idiay $2.',
+'backend-fail-opentemp' => 'Saan a malukatan ti temporario a papeles.',
+'backend-fail-writetemp' => 'Saan a masuratan ti temporario a papeles.',
+'backend-fail-closetemp' => 'Saan a marikpan ti temporario a papeles.',
+'backend-fail-read' => 'Saan a mabasa ti papeles $1.',
+'backend-fail-create' => 'Saan a maaramid ti papeles $1.',
+'backend-fail-readonly' => 'Ti pagidulinan a kalikudan ti "$1" ket agdama a mabasa laeng. Ti rason a naited idi ket: "$2"',
+'backend-fail-synced' => 'Ti papeles "$1" ket bangking ti kasasaad na iti kinauneg a pagidulinan ti kalikudan',
+'backend-fail-connect' => 'Saan a makaikapet idiay pagidulinan a kalikudan "$1".',
+'backend-fail-internal' => 'Adda di amammo a biddut ti napasamak idiay pagidulinan a kalikudan "$1".',
+'backend-fail-contenttype' => 'Saan a maammoan ti kita ti linaon ti papeles nga idulin idiay "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Saan a malukatan ti "$1"; saan a nakandaduan.',
+'lockmanager-fail-closelock' => 'Saan a marikepan ti nakandaduan a papeles para iti "$1".',
+'lockmanager-fail-deletelock' => 'Saan a maikkat ti nakandaduan a papeles para iti "$1".',
+'lockmanager-fail-acquirelock' => 'Saan a makaala ti kandado para iti "$1".',
+'lockmanager-fail-openlock' => 'Saan a maluktan ti kandado ti papeles para iti "$1".',
+'lockmanager-fail-releaselock' => 'Saan a maibbatan ti kandado para iti "$1".',
+'lockmanager-fail-db-bucket' => 'Saan a makasilpo ti umanay a kandado kadagiti database idiay timba $1.',
+'lockmanager-fail-db-release' => 'Saan a maibbatan dagiti kandado idiay database $1.',
+'lockmanager-fail-svr-release' => 'Saan a maibbatan dagiti kandado idiay server $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Adda biddut a nasarakan idi panaglukat ti papeles ti panagkita a ZIP.',
'zip-wrong-format' => 'Ti nainagan a papeles ket saan a ZIP a papeles.',
@@ -1535,6 +1581,7 @@ Saan a matutup ti pinagkita ti seguridad na.',
'uploadstash-badtoken' => 'Ti pinag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talek mo ti panag-urnos ket nagpaso. Padasem manen.',
'uploadstash-errclear' => 'Ti pinagdalus kadagiti papeles ket napaay.',
'uploadstash-refresh' => 'Pasadiwaam dagiti listaan ti papeles',
+'invalid-chunk-offset' => 'Imbalido ti maysa a supli',
# img_auth script messages
'img-auth-accessdenied' => 'naiparit ti iseserrek',
@@ -1642,23 +1689,24 @@ Ti pagipalpalawag na idiay [$2 pagipalpalawag a panid ti papeles ] ket naipakit
'filerevert-badversion' => 'Awan ti napalubos a lokal a bersion daytoy a papeles nga adda naikkan dayta nga oras ken petsa.',
# File deletion
-'filedelete' => 'Ikkaten ti $1',
-'filedelete-legend' => 'ikkaten ti papeles',
-'filedelete-intro' => "Makarugi ka ti agikkat ti '''[[Media:$1|$1]]''' ken dagiti amin a pakasaritaan na.",
-'filedelete-intro-old' => "Ikikatem ti bersion daytoy '''[[Media:$1|$1]]''' nangrugi idi [$4 $3, $2].",
-'filedelete-comment' => 'Rason:',
-'filedelete-submit' => 'Ikkaten',
-'filedelete-success' => "Naikkaten ti '''$1'''.",
-'filedelete-success-old' => "Ti bersion iti '''[[Media:$1|$1]]''' nakarugi idi $3, $2 ket naikkaten.",
-'filedelete-nofile' => "awan ti '''$1''' .",
-'filedelete-nofile-old' => "Awan ti nailebbeng a bersion ti '''$1''' nga addaan ti naited a kakitkita na.",
-'filedelete-otherreason' => 'Sabali/nayon a rason:',
-'filedelete-reason-otherlist' => 'Sabali a rason',
-'filedelete-reason-dropdown' => '*Kadawyan a rasrason ti pannakaikkat
+'filedelete' => 'Ikkaten ti $1',
+'filedelete-legend' => 'ikkaten ti papeles',
+'filedelete-intro' => "Makarugi ka ti agikkat ti '''[[Media:$1|$1]]''' ken dagiti amin a pakasaritaan na.",
+'filedelete-intro-old' => "Ikikatem ti bersion daytoy '''[[Media:$1|$1]]''' nangrugi idi [$4 $3, $2].",
+'filedelete-comment' => 'Rason:',
+'filedelete-submit' => 'Ikkaten',
+'filedelete-success' => "Naikkaten ti '''$1'''.",
+'filedelete-success-old' => "Ti bersion iti '''[[Media:$1|$1]]''' nakarugi idi $3, $2 ket naikkaten.",
+'filedelete-nofile' => "awan ti '''$1''' .",
+'filedelete-nofile-old' => "Awan ti nailebbeng a bersion ti '''$1''' nga addaan ti naited a kakitkita na.",
+'filedelete-otherreason' => 'Sabali/nayon a rason:',
+'filedelete-reason-otherlist' => 'Sabali a rason',
+'filedelete-reason-dropdown' => '*Kadawyan a rasrason ti pannakaikkat
** Panagsalungasing iti karbengan ti pianagtulad
** Nadoble a papeles',
-'filedelete-edit-reasonlist' => 'Unosen ti rason ti pinagikkat',
-'filedelete-maintenance' => 'Saan nga agnayon a naibaldado ti pinagikkat ken pinagisubli dagiti papeles iti dagdama a pinagsimpa.',
+'filedelete-edit-reasonlist' => 'Unosen ti rason ti pinagikkat',
+'filedelete-maintenance' => 'Saan nga agnayon a naibaldado ti pinagikkat ken pinagisubli dagiti papeles iti dagdama a pinagsimpa.',
+'filedelete-maintenance-title' => 'Saan a maikkat daytoy a papeles',
# MIME search
'mimesearch' => 'Pagbiruk ti MIME',
@@ -1758,6 +1806,8 @@ Tattan ket naka baw-ing idiay [[$2]].',
'wantedpages' => 'Dagiti makidkiddaw a panid',
'wantedpages-badtitle' => 'Saan nga umisu a titulo idiay naikabil a pagbanagan: $1',
'wantedfiles' => 'Dagiti makidkiddaw a papeles',
+'wantedfiletext-cat' => 'Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles a naggapu kadagiti ganganaet a repositorio ket mailista uray pay no addaan da. No adda dagiti kasla adda dagitoy ket <del>maikkat</del> to. A maipanayon pay, dagiti pampanid nga agisengngat kadagiti papeles nga awan ket nailista idiay [[:$1]].',
+'wantedfiletext-nocat' => ' Dagiti sumaganad a papeles ket maus-usar ngem awanda met. Dagiti papeles a naggapu kadagiti ganganaet a repositorio ket mailista uray pay no addaan da. No adda dagiti kasla adda dagitoy ket <del>maikkat</del> to.',
'wantedtemplates' => 'Dagiti makidkiddaw a plantilia',
'mostlinked' => 'Dagiti panid a kaaduan iti nakasilpo',
'mostlinkedcategories' => 'Dagiti kategoria a kaaduan iti nakasilpo',
@@ -1766,6 +1816,7 @@ Tattan ket naka baw-ing idiay [[$2]].',
'mostimages' => 'Dagiti papeles a kaaduan iti nakasilpo',
'mostrevisions' => 'Dagiti artikulo a kaaduan ti pannakabalbaliwna',
'prefixindex' => 'Dagiti amin a panid nga adda ti pasaruno na',
+'prefixindex-namespace' => 'Amin a panid nga addaan ti pasaruno ($1 nagan ti luglugar)',
'shortpages' => 'Dagiti ababa a panid',
'longpages' => 'Dagiti atitiddog a panid',
'deadendpages' => 'Dagiti ngudo a panid',
@@ -1877,7 +1928,6 @@ Natapayaen a protokol: <tt>$1</tt> (saan mo nga inayun dagitoy iti panagbiruk mo
# Special:Log/newusers
'newuserlogpage' => 'Listaan dagiti naaramid nga agar-aramat',
'newuserlogpagetext' => 'Listaan dagiti panakaramid ti agar-aramat.',
-'newuserlog-byemail' => 'naipatulod ti kontrasenias ti e-surat',
# Special:ListGroupRights
'listgrouprights' => 'Dagiti karbengan ti bunggoy ti agar-aramat',
@@ -1906,7 +1956,7 @@ Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a m
'emailpagetext' => 'Mabalin mo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe daytoy nga agar-aramat.
Ti e-surat nga inkabil mo idiay [[Special:Preferences|kakaykayatam]] ket agparang a kas "Naggapu" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.',
'usermailererror' => 'Kita ti surat ket nangisubli ti biddut:',
-'defemailsubject' => 'email ti {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} e-surat naggapo ken ni "$1"',
'usermaildisabled' => 'Saan mo a mabalin ti agipatulod ti e-surat',
'usermaildisabledtext' => 'Saan mo a mabalin ti agipatulod ti e-surat kadagiti sabali nga agar-aramat ditoy a wiki',
'noemailtitle' => 'Awan ti e-surat a pagtaengan',
@@ -1960,7 +2010,7 @@ Mailistanto ditoy dagiti pinagsukat daytoy a panid iti masakbayan agraman ti kan
'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
'watchlistcontains' => 'Addaan ti listaan ti bambantayam iti $1 {{PLURAL:$1|a panid|a pampanid}}.',
'iteminvalidname' => "Parikut iti banag '$1', imbalido a nagan...",
-'wlnote' => "Adda iti baba {{PLURAL:$1|ti kaudian a pannakabaliw|dagiti kaudian '''$1''' a pannakabaliw}} iti naudi a {{PLURAL:$2|oras|'''$2''' oras}}.",
+'wlnote' => "Adda dita baba {{PLURAL:$1|ti kaudian a pinagsukat|dagiti kaudian '''$1''' a pinagsukat}} iti naudi a {{PLURAL:$2|oras|'''$2''' oras}}, sipud idi $3, $4.",
'wlshowlast' => 'Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw $3',
'watchlist-options' => 'Dagiti pagpilian ti listaan a bambantayan',
@@ -2026,7 +2076,6 @@ Pangngaasim ta pasingkedam a talaga a kayatmo nga aramiden daytoy, a maawatam ti
'actionfailed' => 'Napaay ti aramid',
'deletedtext' => 'Naikkaten ti "$1".
Kitaen ti $2 para iti panakrehistro dagiti naudi a naikkat.',
-'deletedarticle' => 'naikkaten ti "[[$1]]"',
'dellogpage' => 'Listaan ti panagikkat',
'dellogpagetext' => 'Adda dita baba ti listaan dagiti kaudian a panangikkat.',
'deletionlog' => 'listaan ti panagikkat',
@@ -2077,7 +2126,10 @@ Kitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti li
'unprotectedarticle' => 'naikkat ti salaknib ti "[[$1]]"',
'movedarticleprotection' => 'iyalis ti kasasaad ti salaknib manipud iti "[[$2]]" idiay "[[$1]]"',
'protect-title' => 'Sukatan ti lessaad ti salaknib para iti "$1"',
+'protect-title-notallowed' => 'Kitaen ti lessaad ti salaknib ti "$1"',
'prot_1movedto2' => '[[$1]] naiyalis iti [[$2]]',
+'protect-badnamespace-title' => 'Saan a mabalin a salakniban a nagan ti lugar',
+'protect-badnamespace-text' => 'Dagiti panid ditoy a nagan ti lugar ket saan a mabalin a masalakniban.',
'protect-legend' => 'Pasingkedan ti panagsalaknib',
'protectcomment' => 'Rason:',
'protectexpiry' => 'Agpaso:',
@@ -2099,6 +2151,7 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna nga tigna
'protect-level-sysop' => 'Dagiti administrador laeng',
'protect-summary-cascade' => 'agsariap',
'protect-expiring' => 'agpaso inton $1 (UTC)',
+'protect-expiring-local' => 'agpaso $1',
'protect-expiry-indefinite' => "inggana't inggana",
'protect-cascade' => 'Salakniban dagiti pampanid a nairaman iti daytoy a panid (babaen ti sariap a salaknib)',
'protect-cantedit' => 'Saanmo a masuktan ti lessaad ti salaknib daytoy a panid, ta awananka iti pammalubos nga agurnos',
@@ -2159,7 +2212,6 @@ Addaan ka ngata ti madi a panilpo, wenno ti pinagbaliwan ket naipasubli wenno na
'undeletereset' => 'Isubli',
'undeleteinvert' => 'Baliktaden ti napili',
'undeletecomment' => 'Rason:',
-'undeletedarticle' => 'naisubli ti "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 binaliwan|$1 dagiti binaliwan}} ti naisubli',
'undeletedrevisions-files' => '{{PLURAL:$1|1 binaliwan|$1 dagiti binaliwan}} ken {{PLURAL:$2|1 file|$2 dagiti papeles}} ti naisubli',
'undeletedfiles' => '{{PLURAL:$1|1 a papeles|$1 a papeles}} ti naisubli',
@@ -2169,6 +2221,7 @@ adda ngata immuna a nagikkat ti panid.',
Binsiren ti [[Special:Log/delete|listaan ti naik-ikkat]] para iti listaan dagiti naudi a naik-ikkat ken naisubsubli.",
'undelete-header' => 'Kitaen [[Special:Log/delete|ti listaan ti pinagikkat]] kadagiti kinaudian a naikkat a panid.',
+'undelete-search-title' => 'Biruken dagiti naikkat a pampanid',
'undelete-search-box' => 'Biruken dagiti naikkat a pampanid',
'undelete-search-prefix' => 'Ipakita dagiti pampanid nga agrugi iti:',
'undelete-search-submit' => 'Biruken',
@@ -2178,6 +2231,7 @@ Binsiren ti [[Special:Log/delete|listaan ti naik-ikkat]] para iti listaan dagiti
'undelete-cleanup-error' => 'Biddut ti pinagikkat ti saan a naususar a naidulin a papeles "$1".',
'undelete-missing-filearchive' => 'Saan a naipabalin ti pinagsubli ti ID ti papeles a nailebben $1 ngamin ket awan idiay database.
Baka laeng ket naikkaten.',
+'undelete-error' => 'Ballaag ti panagisubli ti pinagikkat ti panid',
'undelete-error-short' => 'Biddut ti panakaikkat ti papeles: $1',
'undelete-error-long' => 'Adda nasarakan a biddut idi pinasubli ti pinagikkat ti papeles:
@@ -2299,6 +2353,7 @@ Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra
'blocklist-userblocks' => 'Ilemmeng dagiti serra ti pakabilangan',
'blocklist-tempblocks' => 'Ilemmeng dagiti saan nga agnanayon a serra',
'blocklist-addressblocks' => 'Ilemmeng ti maysa a serra dagiti IP',
+'blocklist-rangeblocks' => 'Ilemming dagiti nasakup a serra',
'blocklist-timestamp' => 'Petsa ken oras',
'blocklist-target' => 'Puntaan',
'blocklist-expiry' => 'Agpaso',
@@ -2321,6 +2376,7 @@ Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra
'unblocklink' => 'saanen a naserraan',
'change-blocklink' => 'baliwan ti serra',
'contribslink' => 'aramid',
+'emaillink' => 'ipatulod ti e-surat',
'autoblocker' => 'Na-auto a serra ngamin ket ti IP a pagtaengan ket damdama nga inusar ni "[[User:$1|$1]]".
Ti rason nga inted ti $1\'s serra ket: "$2"',
'blocklogpage' => 'Listaan ti naserraan',
@@ -2450,8 +2506,6 @@ Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
'movepage-page-moved' => 'Naiyalis ti panid a $1 iti $2.',
'movepage-page-unmoved' => 'Saan a maiyalis ti panid $1 iti $2.',
'movepage-max-pages' => 'Ti kangato ti $1 {{PLURAL:$1|panid|dagiti panid}} ket naiyalis ken awan ti automatiko a maiyalis.',
-'1movedto2' => '[[$1]] naiyakar iti [[$2]]',
-'1movedto2_redir' => '[[$1]] naiyakar iti [[$2]] over redirect',
'movelogpage' => 'Listaan ti naiyalis',
'movelogpagetext' => 'Adda dita baba ti listaan dagiti naiyalis a pampanid.',
'movesubpage' => '{{PLURAL:$1|Apo ti panid|Dagiti apo ti panid}}',
@@ -2464,7 +2518,7 @@ Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
Ti pangipanan ti panid ket "[[:$1]]" addan.
Kayatmo nga ikkaten tapno makaiyalis ka?',
'delete_and_move_confirm' => 'Wen, ikkatenen ti panid',
-'delete_and_move_reason' => 'Naikkat tapno mawayaan ti pannakaiyakar',
+'delete_and_move_reason' => 'Naikkat tapno mawayaan ti panaka-iyalis idiay "[[$1]]"',
'selfmove' => 'Ti titulo ti taudan ken ti pangipanan ket agpadpada;
saan mo a maiyalis ti panid ti isu met laeng a panid.',
'immobile-source-namespace' => 'Saan a maiyalis dagiti panid idiay nagan ti lugar "$1"',
@@ -2495,9 +2549,11 @@ Daytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga us
Ti pinagipan ti panid, ikabil ti titulo dita kahon ti teksto dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a pinagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a pinagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a pinagurnos.
No iti kinaudi a kaso mabalin mo nga usaren ti panilpo, a kaspagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Ipan amin a pampanid',
'exportcuronly' => 'Iraman laeng ti agdadama pinagbaliwan, saan a ti amin a pakasaritaan',
'exportnohistory' => "----
'''Palagip:''' Ti pagipapan dagiti punno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pinakalaing ti pinagandar a rason.",
+'exportlistauthors' => 'Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid',
'export-submit' => 'Agipan',
'export-addcattext' => 'Nayunan dagiti panid a naggapu idiay kategoria:',
'export-addcat' => 'Inayon',
@@ -2530,6 +2586,8 @@ Pangngaasi ta bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Loca
'thumbnail_error' => 'Biddut ti panagaramid iti bassit nga imahen: $1',
'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 papeles',
+'thumbnail-dest-create' => 'Saan a maidulin ti basit nga imahen idiay pagipanan',
'thumbnail_invalid_params' => 'Imbalido a parametro ti imahen',
'thumbnail_dest_directory' => 'Saan a nakaaramid ti pangipanan a direktoria.',
'thumbnail_image-type' => 'Daytoy a kita ti imahen ket saan a nasuportaran.',
@@ -2577,6 +2635,11 @@ Awan ti saan nga agnayon a polder.',
'import-token-mismatch' => 'Napukaw ti gimong ti data.
Pangngaasi ta padasem manen.',
'import-invalid-interwiki' => 'Saan a makaala dita naited a wiki.',
+'import-error-edit' => 'Ti panid a "$1" ket saan a naala ngamin ket saan mo a mabalin nga urnosen.',
+'import-error-create' => 'Ti panid a "$1" ket saan a naala ngamin ket saan mo a mabalin nga aramiden.',
+'import-error-interwiki' => 'Ti panid "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
+'import-error-special' => 'Ti panid "$1" ket saan a naala ngamin ket bukod ti espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
+'import-error-invalid' => 'Ti panid "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
# Import log
'importlogpage' => 'Alaen ti listaan',
@@ -2586,73 +2649,86 @@ Pangngaasi ta padasem manen.',
'import-logentry-interwiki' => 'nai-transwiki ti $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|pinagbaliwan|dagiti pinagbaliwan}} manipud iti $2',
+# JavaScriptTest
+'javascripttest' => 'Subsubokan ti JavaScript',
+'javascripttest-disabled' => 'Daytoy nga opisio ket nabaldado.',
+'javascripttest-title' => 'Agpatpataray ti $1 a subsubokan',
+'javascripttest-pagetext-noframework' => 'Daytoy a panid ket nailasin para iti panagpataray ti subsubokan a JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Di amamo a pagsubsubokan a tabas "$1".',
+'javascripttest-pagetext-frameworks' => 'Pangngaasi nga agpili ti maysa kadagiti sumaganad a pagsubokan a tabas: $1',
+'javascripttest-pagetext-skins' => 'Agpili ti kudil a pangipatarayan ti pagsubokan:',
+'javascripttest-qunit-intro' => 'Kitaen [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Daytoy ti panid mo',
-'tooltip-pt-anonuserpage' => 'Ti panid ti agar-aramat daytoy nga IP a pagtaengan nga urnosem a kasla',
-'tooltip-pt-mytalk' => 'Pakitungtongam a panid',
-'tooltip-pt-anontalk' => 'Pakitungtungan ti pinagurnos a naggapu ditoy nga IP a pagtaengan',
-'tooltip-pt-preferences' => 'Dagiti kaykayatmo',
-'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem ti panagsuksutda',
-'tooltip-pt-mycontris' => 'Listaan dagiti naaramidmo',
-'tooltip-pt-login' => 'Maisingasing ti inka koma panag-serrek; nupay kasta ket saan a maipapilit',
-'tooltip-pt-anonlogin' => 'Maisingasing ti inka koma panag-serrek; nupay kasta ket saan a maipapilit',
-'tooltip-pt-logout' => 'Rummuar',
-'tooltip-ca-talk' => 'Pagtutungtongan maipapan iti linaon ti panid',
-'tooltip-ca-edit' => 'Mabalinmo a balbaliwan daytoy a panid. Pangngaasim ta aramaten ti buton ti ipadas sakbay nga idulinmo ti panid.',
-'tooltip-ca-addsection' => 'Mangirugi ti baro a paset',
-'tooltip-ca-viewsource' => 'Nasalakniban daytoy a panid.
+'tooltip-pt-userpage' => 'Daytoy ti panid mo',
+'tooltip-pt-anonuserpage' => 'Ti panid ti agar-aramat daytoy nga IP a pagtaengan nga urnosem a kasla',
+'tooltip-pt-mytalk' => 'Pakitungtongam a panid',
+'tooltip-pt-anontalk' => 'Pakitungtungan ti pinagurnos a naggapu ditoy nga IP a pagtaengan',
+'tooltip-pt-preferences' => 'Dagiti kaykayatmo',
+'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem ti panagsuksutda',
+'tooltip-pt-mycontris' => 'Listaan dagiti naaramidmo',
+'tooltip-pt-login' => 'Maisingasing ti inka koma panag-serrek; nupay kasta ket saan a maipapilit',
+'tooltip-pt-anonlogin' => 'Maisingasing ti inka koma panag-serrek; nupay kasta ket saan a maipapilit',
+'tooltip-pt-logout' => 'Rummuar',
+'tooltip-ca-talk' => 'Pagtutungtongan maipapan iti linaon ti panid',
+'tooltip-ca-edit' => 'Mabalinmo a balbaliwan daytoy a panid. Pangngaasim ta aramaten ti buton ti ipadas sakbay nga idulinmo ti panid.',
+'tooltip-ca-addsection' => 'Mangirugi ti baro a paset',
+'tooltip-ca-viewsource' => 'Nasalakniban daytoy a panid.
Mabalinmo a kitaen ti taudanna.',
-'tooltip-ca-history' => 'Dagiti napalabas a panagbalbaliw iti daytoy a panid.',
-'tooltip-ca-protect' => 'Salakniban daytoy a panid',
-'tooltip-ca-unprotect' => 'Sukatan ti salaknib daytoy a panid',
-'tooltip-ca-delete' => 'Ikkaten daytoy a panid',
-'tooltip-ca-undelete' => 'Isubli dagiti inurnos a panid sakbay a naikkat.',
-'tooltip-ca-move' => 'Iyalis daytoy a panid',
-'tooltip-ca-watch' => 'Inayon daytoy a panid kadagiti bambantayam',
-'tooltip-ca-unwatch' => 'Ikkatem daytoy a panid kadagiti bambantayam',
-'tooltip-search' => 'Biruken idiay {{SITENAME}}',
-'tooltip-search-go' => 'Inka idiay panid no adda kapada na a nagan',
-'tooltip-search-fulltext' => 'Birukem dagiti panid daytoy a testo',
-'tooltip-p-logo' => 'Sarungkaran ti umuna a panid',
-'tooltip-n-mainpage' => 'Sarungkaran ti umuna a panid',
-'tooltip-n-mainpage-description' => 'Sarungkaran ti umuna a panid',
-'tooltip-n-portal' => 'Maipapan iti gandat no ania ti maaramidam, no sadino ti pakasarak kadagiti bambanag',
-'tooltip-n-currentevents' => 'Agsapul iti lugar ti likud a pakaammo kadagiti agdama a paspasamak',
-'tooltip-n-recentchanges' => 'Listaan dagiti naudi a sinukatan iti wiki.',
-'tooltip-n-randompage' => 'Mangiparuar iti pugto a panid',
-'tooltip-n-help' => 'Ti lugar a pakasapulan.',
-'tooltip-t-whatlinkshere' => 'Listaan ti am-amin a pampanid ti wiki a nakasilpo ditoy',
-'tooltip-t-recentchangeslinked' => 'Kinaudian a sinukatan dagiti panid a nakasilpo ditoy a panid',
-'tooltip-feed-rss' => 'RSS na pakan para iti daytoy a panid',
-'tooltip-feed-atom' => 'Atom a pakan para itoy a panid',
-'tooltip-t-contributions' => 'Kitaen ti listaan dagiti naaramidan daytoy nga agar-aramat',
-'tooltip-t-emailuser' => 'Patulodan iti e-surat daytoy nga agar-aramat',
-'tooltip-t-upload' => 'Agipan iti papeles',
-'tooltip-t-specialpages' => 'Listaan ti am-amin nga espesial a pampanid',
-'tooltip-t-print' => 'Maimaldit a bersion ti panid',
-'tooltip-t-permalink' => 'Permanente a silpo idiay binaliwan daytoy a panid',
-'tooltip-ca-nstab-main' => 'Kitaen ti naglaon a panid',
-'tooltip-ca-nstab-user' => 'Kitaen ti panid ti agar-aramat',
-'tooltip-ca-nstab-media' => 'Kitaen ti panid ti midia',
-'tooltip-ca-nstab-special' => 'Maysa daytoy nga espesial a panid, saanmo a mismo a maurnos daytoy a panid',
-'tooltip-ca-nstab-project' => 'Kitaen ti panid ti gandat',
-'tooltip-ca-nstab-image' => 'Kitaen ti panid ti papeles',
-'tooltip-ca-nstab-mediawiki' => 'Kitaen ti mensahe ti sistema',
-'tooltip-ca-nstab-template' => 'Kitaen ti plantilia',
-'tooltip-ca-nstab-help' => 'Kitaen ti panid ti tulong',
-'tooltip-ca-nstab-category' => 'Kitaen ti panid ti kategoria',
-'tooltip-minoredit' => 'Markaan daytoy a kas bassit a panag-urnos',
-'tooltip-save' => 'Idulin dagiti sinukatam',
-'tooltip-preview' => 'Ipadas dagiti sinukatam, pangngaasim ta usarem daytoy sakbay nga idulinmo ti panid!',
-'tooltip-diff' => 'Ipakita no ania dagiti sinukatan nga inaramidmo iti testo',
-'tooltip-compareselectedversions' => 'Kitaen ti naggidiatan dagiti dua a napili a bersion daytoy a panid.',
-'tooltip-watch' => 'Inayon daytoy a panid iti listaan dagiti bambantayam',
-'tooltip-recreate' => 'Aramidem ti panid uray no naikkat idin.',
-'tooltip-upload' => 'Rugian ti agip-ipan',
-'tooltip-rollback' => '"Baliktaden" isubli ti inurnos (dagiti inurnos) ti daytoy a panid ti kinaudi a nangaramid iti maysa a takla',
-'tooltip-undo' => '"Ibabawi" ipasubli daytoy nga urnos ken lukatanna ti kinabuklan ti urnos iti panagpadas. Agpabalin daytoy a mangikabil ti rason idiay pinakabuklan.',
-'tooltip-preferences-save' => 'Idulin dagiti kaykayatmo',
-'tooltip-summary' => 'Ikabil ti bassit a pakabuklan',
+'tooltip-ca-history' => 'Dagiti napalabas a panagbalbaliw iti daytoy a panid.',
+'tooltip-ca-protect' => 'Salakniban daytoy a panid',
+'tooltip-ca-unprotect' => 'Sukatan ti salaknib daytoy a panid',
+'tooltip-ca-delete' => 'Ikkaten daytoy a panid',
+'tooltip-ca-undelete' => 'Isubli dagiti inurnos a panid sakbay a naikkat.',
+'tooltip-ca-move' => 'Iyalis daytoy a panid',
+'tooltip-ca-watch' => 'Inayon daytoy a panid kadagiti bambantayam',
+'tooltip-ca-unwatch' => 'Ikkatem daytoy a panid kadagiti bambantayam',
+'tooltip-search' => 'Biruken idiay {{SITENAME}}',
+'tooltip-search-go' => 'Inka idiay panid no adda kapada na a nagan',
+'tooltip-search-fulltext' => 'Birukem dagiti panid daytoy a testo',
+'tooltip-p-logo' => 'Sarungkaran ti umuna a panid',
+'tooltip-n-mainpage' => 'Sarungkaran ti umuna a panid',
+'tooltip-n-mainpage-description' => 'Sarungkaran ti umuna a panid',
+'tooltip-n-portal' => 'Maipapan iti gandat no ania ti maaramidam, no sadino ti pakasarak kadagiti bambanag',
+'tooltip-n-currentevents' => 'Agsapul iti lugar ti likud a pakaammo kadagiti agdama a paspasamak',
+'tooltip-n-recentchanges' => 'Listaan dagiti naudi a sinukatan iti wiki.',
+'tooltip-n-randompage' => 'Mangiparuar iti pugto a panid',
+'tooltip-n-help' => 'Ti lugar a pakasapulan.',
+'tooltip-t-whatlinkshere' => 'Listaan ti am-amin a pampanid ti wiki a nakasilpo ditoy',
+'tooltip-t-recentchangeslinked' => 'Kinaudian a sinukatan dagiti panid a nakasilpo ditoy a panid',
+'tooltip-feed-rss' => 'RSS na pakan para iti daytoy a panid',
+'tooltip-feed-atom' => 'Atom a pakan para itoy a panid',
+'tooltip-t-contributions' => 'Kitaen ti listaan dagiti naaramidan daytoy nga agar-aramat',
+'tooltip-t-emailuser' => 'Patulodan iti e-surat daytoy nga agar-aramat',
+'tooltip-t-upload' => 'Agipan iti papeles',
+'tooltip-t-specialpages' => 'Listaan ti am-amin nga espesial a pampanid',
+'tooltip-t-print' => 'Maimaldit a bersion ti panid',
+'tooltip-t-permalink' => 'Permanente a silpo idiay binaliwan daytoy a panid',
+'tooltip-ca-nstab-main' => 'Kitaen ti naglaon a panid',
+'tooltip-ca-nstab-user' => 'Kitaen ti panid ti agar-aramat',
+'tooltip-ca-nstab-media' => 'Kitaen ti panid ti midia',
+'tooltip-ca-nstab-special' => 'Maysa daytoy nga espesial a panid, saanmo a mismo a maurnos daytoy a panid',
+'tooltip-ca-nstab-project' => 'Kitaen ti panid ti gandat',
+'tooltip-ca-nstab-image' => 'Kitaen ti panid ti papeles',
+'tooltip-ca-nstab-mediawiki' => 'Kitaen ti mensahe ti sistema',
+'tooltip-ca-nstab-template' => 'Kitaen ti plantilia',
+'tooltip-ca-nstab-help' => 'Kitaen ti panid ti tulong',
+'tooltip-ca-nstab-category' => 'Kitaen ti panid ti kategoria',
+'tooltip-minoredit' => 'Markaan daytoy a kas bassit a panag-urnos',
+'tooltip-save' => 'Idulin dagiti sinukatam',
+'tooltip-preview' => 'Ipadas dagiti sinukatam, pangngaasim ta usarem daytoy sakbay nga idulinmo ti panid!',
+'tooltip-diff' => 'Ipakita no ania dagiti sinukatan nga inaramidmo iti testo',
+'tooltip-compareselectedversions' => 'Kitaen ti naggidiatan dagiti dua a napili a bersion daytoy a panid.',
+'tooltip-watch' => 'Inayon daytoy a panid iti listaan dagiti bambantayam',
+'tooltip-watchlistedit-normal-submit' => 'Ikkaten dagiti titulo',
+'tooltip-watchlistedit-raw-submit' => 'Pabaruen ti listaan ti bambantayan',
+'tooltip-recreate' => 'Aramidem ti panid uray no naikkat idin.',
+'tooltip-upload' => 'Rugian ti agip-ipan',
+'tooltip-rollback' => '"Baliktaden" isubli ti inurnos (dagiti inurnos) ti daytoy a panid ti kinaudi a nangaramid iti maysa a takla',
+'tooltip-undo' => '"Ibabawi" ipasubli daytoy nga urnos ken lukatanna ti kinabuklan ti urnos iti panagpadas. Agpabalin daytoy a mangikabil ti rason idiay pinakabuklan.',
+'tooltip-preferences-save' => 'Idulin dagiti kaykayatmo',
+'tooltip-summary' => 'Ikabil ti bassit a pakabuklan',
# Metadata
'notacceptable' => 'Ti server ti wiki ket saan a makaited ti data iti kinabuklan a saan a mabasa ti kliente.',
@@ -2705,8 +2781,6 @@ Daytoy ngata ket gapu ti panilpo a naiparit ti akin ruar a pagsaadan.',
# Patrol log
'patrol-log-page' => 'Listaan ti napatruliaan',
'patrol-log-header' => 'Daytoy ket listaan dagiti napatruliaan a pinagbaliwan.',
-'patrol-log-line' => 'ti namarkaan a $1 ti $2 pinatruliaanna ti $3',
-'patrol-log-auto' => '(automatiko)',
'log-show-hide-patrol' => '$1 listaan ti napatruliaan',
# Image deletion
@@ -2725,23 +2799,25 @@ $1',
'nextdiff' => 'Sumaruno a naurnos →',
# Media information
-'mediawarning' => "'''Ballaag'': Daytoy a papeles ket adda nagyan na a dakes a kodigo.
+'mediawarning' => "'''Ballaag'': Daytoy a papeles ket adda nagyan na a dakes a kodigo.
No usarem ket, baka makompromiso ti sistema.",
-'imagemaxsize' => "Ti patingga a kadakkel ti papeles:<br />''(para dagiti pagpalpalawag ti papeles a panid)''",
-'thumbsize' => 'Rukod ti imahen:',
-'widthheightpage' => '$1 × $2, $3 a {{PLURAL:$3|panid|pampanid}}',
-'file-info' => 'kadakkel ti papeles: $1, MIME a kita: $2',
-'file-info-size' => '$1 × $2 dagiti pixel, kadakkel ti papeles: $3, kita ti MIME: $4',
-'file-info-size-pages' => '$1 × $2 pixels, kadakkel ti papeles: $3, kita ti MIME: $4, $5 {{PLURAL:$5|panid|pampanid}}',
-'file-nohires' => '<small>Awan mabalin a nangatngato a resolusion.</small>',
-'svg-long-desc' => 'SVG a papeles, babassit ngem $1 × $2 pixels, kadakkel ti papeles: $3',
-'show-big-image' => 'Sibubukel a resolusion',
-'show-big-image-size' => '$1 × $2 pixels',
-'file-info-gif-looped' => 'nasiluan',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|kuadro| dagiti kuadro}}',
-'file-info-png-looped' => 'nasiluan',
-'file-info-png-repeat' => 'pinaayayam $1 {{PLURAL:$1|beses|beses}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|kuadro| dagiti kuadro}}',
+'imagemaxsize' => "Ti patingga a kadakkel ti papeles:<br />''(para dagiti pagpalpalawag ti papeles a panid)''",
+'thumbsize' => 'Rukod ti imahen:',
+'widthheightpage' => '$1 × $2, $3 a {{PLURAL:$3|panid|pampanid}}',
+'file-info' => 'kadakkel ti papeles: $1, MIME a kita: $2',
+'file-info-size' => '$1 × $2 dagiti pixel, kadakkel ti papeles: $3, kita ti MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixels, kadakkel ti papeles: $3, kita ti MIME: $4, $5 {{PLURAL:$5|panid|pampanid}}',
+'file-nohires' => 'Awan ti mabalin a nangatngato a resolusion.',
+'svg-long-desc' => 'SVG a papeles, babassit ngem $1 × $2 pixels, kadakkel ti papeles: $3',
+'show-big-image' => 'Sibubukel a resolusion',
+'show-big-image-preview' => 'Kadakkel na daytoy a pagpadas: $1.',
+'show-big-image-other' => 'Sabali a {{PLURAL:$2|resolusion|dagiti resolusion}}: $1.',
+'show-big-image-size' => '$1 × $2 pixels',
+'file-info-gif-looped' => 'nasiluan',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|kuadro| dagiti kuadro}}',
+'file-info-png-looped' => 'nasiluan',
+'file-info-png-repeat' => 'pinaayayam $1 {{PLURAL:$1|beses|beses}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kuadro| dagiti kuadro}}',
# Special:NewFiles
'newimages' => 'Galeria dagiti kabarbaro a papeles',
@@ -2755,6 +2831,13 @@ No usarem ket, baka makompromiso ti sistema.",
'bydate' => 'babaen ti petsa',
'sp-newimages-showfrom' => 'Iparang dagiti baro a papeles mangrugi iti $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 segundo|$1 segundo}}',
+'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|$1 oras$1 oras}}',
+'days' => '{{PLURAL:$1|$1 aldaw|$1 al-aldaw}}',
+'ago' => '$1 nagtapos',
+
# Bad image list
'bad_image_list' => 'Ti kinabuklan ket kas iti sumaganad:
@@ -3247,13 +3330,6 @@ Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
'scarytranscludefailed' => '[Napaay ti pinagala ti templeta ti $1]',
'scarytranscludetoolong' => '[Atiddog unay ti URL]',
-# Trackbacks
-'trackbackbox' => 'Dagiti trackbacks iti daytoy a panid:<br />
-$1',
-'trackbackremove' => '([$1 Ikkaten])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Sibaballigi a naikkat ti trackback.',
-
# Delete conflict
'deletedwhileediting' => "'''Ballaag''': Naikkaten daytoy a panid kalpasan a rinugiam nga agurnos!",
'confirmrecreate' => "Ti ([[User talk:$1|patungtungan]]) ti agar-aramat [[User:$1|$1]] ket inikkat na daytoy a panid idi kalkalpas mo a magirugi ti agurnos nga adda rason:
@@ -3334,6 +3410,9 @@ Mabalin mo met a [[Special:EditWatchlist|usaren ti dati a pinagurnos]].',
'watchlisttools-edit' => 'Kitaen ken baliwan ti listaan ti bambantayan',
'watchlisttools-raw' => 'Urnosen ti kilaw a bambantayan',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|patang]])',
+
# Core parser functions
'unknown_extension_tag' => 'Di ammo a pagpaatiddog a tag "$1"',
'duplicate-defaultsort' => '\'\'\'Ballaag:\'\'\' Kinasigud a pinagilasin ti "$2" ket sukatan na ti immuna a kinasigud a pinagilasin "$1".',
@@ -3387,6 +3466,10 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
# Special:SpecialPages
'specialpages' => 'Espesial a pampanid',
+'specialpages-note' => '----
+* Kadawyan nga espesial a pampanid.
+* <span class="mw-specialpagerestricted">Naiparit nga espesial a pampanid.</span>
+* <span class="mw-specialpagecached">Cached nga espesial a pampanid (baka nagpaso).</span>',
'specialpages-group-maintenance' => 'Dagiti pagsimpa a padamag',
'specialpages-group-other' => 'Sabsabali pay nga espesial a pampanid',
'specialpages-group-login' => 'Sumrek / agrehistro',
@@ -3428,13 +3511,16 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
'tags-hitcount' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
# Special:ComparePages
-'comparepages' => 'Ipada dagiti panid',
-'compare-selector' => 'Ipada dagiti panagbaliw ti panid',
-'compare-page1' => 'Panid 1',
-'compare-page2' => 'Panid 2',
-'compare-rev1' => 'Pinagbaliw 1',
-'compare-rev2' => 'Pinagbaliw 2',
-'compare-submit' => 'Ipada',
+'comparepages' => 'Ipada dagiti panid',
+'compare-selector' => 'Ipada dagiti panagbaliw ti panid',
+'compare-page1' => 'Panid 1',
+'compare-page2' => 'Panid 2',
+'compare-rev1' => 'Pinagbaliw 1',
+'compare-rev2' => 'Pinagbaliw 2',
+'compare-submit' => 'Ipada',
+'compare-invalid-title' => 'Ti titulo nga intedmo ket imbalido.',
+'compare-title-not-exists' => 'Awan met dayta titulo a nainaganam.',
+'compare-revision-not-exists' => 'Awan met ti pinagbaliw dayta titulo a nainaganam.',
# Database error messages
'dberr-header' => 'Adda ti pakirut na daytoy a wiki',
@@ -3462,4 +3548,90 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
'sqlite-has-fts' => '$1 adda ti suporta amin a teksto ti pinagbiruk',
'sqlite-no-fts' => '$1 awan ti suporta amin a teksto ti pinagbiruk',
+# New logging system
+'logentry-delete-delete' => 'inikkat ni $1 daytoy panid nga $3',
+'logentry-delete-restore' => 'insubli ni $1 daytoy panid nga $3',
+'logentry-delete-event' => '$1 pinagsukat ti pinagkita iti {{PLURAL:$5|listaan ti pasamak |$5 dagiti listaan ti pasamak }} iti $3: $4',
+'logentry-delete-revision' => '$1 pinagsukat ti pinagkita iti {{PLURAL:$5|pinagbaliw |$5 dagiti pinagbaliw}} iti panid $3: $4',
+'logentry-delete-event-legacy' => '$1 pinagsukat a pinagkita ti listaan dagiti pasamak idiay $3',
+'logentry-delete-revision-legacy' => '$1 pinagsukat a pinagkita dagiti pinagbaliw idiay panid $3',
+'logentry-suppress-delete' => '$1 napasardeng a panid $3',
+'logentry-suppress-event' => '$1 nasekreto pinagsukat ti pinagkita iti {{PLURAL:$5|listaan ti pasamak |$5 dagiti listaan ti pasamak }} iti $3: $4',
+'logentry-suppress-revision' => '$1 nasekreto pinagsukat ti pinagkita iti {{PLURAL:$5|pinagbaliw |$5 dagiti pinagbaliw}} iti panid $3: $4',
+'logentry-suppress-event-legacy' => '$1 nasekreto ti pinagsukat a pinagkita ti listaan dagiti pasamak idiay $3',
+'logentry-suppress-revision-legacy' => '$1 nasekreto ti pinagsukat a pinagkita dagiti pinagbaliw idiay panid $3',
+'revdelete-content-hid' => 'nailemmeng ti nagyan na',
+'revdelete-summary-hid' => 'nailemmeng ti pakabuklan a naurnos',
+'revdelete-uname-hid' => 'nailemmeng ti nagan ti agar-aramat',
+'revdelete-content-unhid' => 'saan a nailemmeng ti nagyan na',
+'revdelete-summary-unhid' => 'saan a nailemmeng ti pakabuklan a naurnos',
+'revdelete-uname-unhid' => 'saan a nailemmeng ti nagan ti agar-aramat',
+'revdelete-restricted' => 'naipakat dagiti pammarit kadagiti administrador',
+'revdelete-unrestricted' => 'naikkat dagiti pammarit para kadagiti administrador',
+'logentry-move-move' => 'inyalis ni $1 daytoy panid $3 idiay $4',
+'logentry-move-move-noredirect' => '$1 inyalis ti panid $3 idiay $4 nga awan ti naibati a baw-ing',
+'logentry-move-move_redir' => '$1 inyalis ti panid $3 idiay $4 nga adda baw-ing',
+'logentry-move-move_redir-noredirect' => '$1 iniyalis ti panid $3 idiay $4 nga inikkan ti baw-ing ngem saan a nagibati ti baw-ing',
+'logentry-patrol-patrol' => '$1 markaan ti pinagbaliw $4 ti panid $3 a napatruliaan',
+'logentry-patrol-patrol-auto' => '$1 automatik na markaan ti pinagbaliw $4 ti panid $3 a napatruliaan',
+'logentry-newusers-newusers' => '$1 nakaaramid ti pakabilangan ti agar-aramat',
+'logentry-newusers-create' => '$1 nakaaramid ti pakabilangan ti agar-aramat',
+'logentry-newusers-create2' => '$1 nakaaramid ti pakabilangan ti agar-aramat $3',
+'logentry-newusers-autocreate' => 'Ti pakabilangan $1 ket naaramid nga automatiko',
+'newuserlog-byemail' => 'naipatulod ti kontrasenias ti e-surat',
+
+# Feedback
+'feedback-bugornote' => 'No agsagana kan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi a [$1 ireporta ti kiteb].
+Nupay kasta, mau-sar mo ti nakabuklan dita baba. Ti komentario nga ited mo ket mainayon iti panid "[$3 $2], a mairaman ti nagan mo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.',
+'feedback-subject' => 'Suheto:',
+'feedback-message' => 'Mensahe:',
+'feedback-cancel' => 'Ukasen',
+'feedback-submit' => 'Agited ti Pagipagarupan',
+'feedback-adding' => 'Agnaynayon ti pagipagarupan iti panid...',
+'feedback-error1' => 'Biddut: Saan a malasin dagiti nagbanagan manipud iti API',
+'feedback-error2' => 'Biddut: Napaay ti pinagurnos',
+'feedback-error3' => 'Biddut: Awan ti sungbat manipud iti API',
+'feedback-thanks' => 'Agyaman! Ti panangparupaam ket naipablaak iti panid "[$2 $1]".',
+'feedback-close' => 'Nalpasen',
+'feedback-bugcheck' => 'Nasayaaten! Kitem tapno met saan a dagita adaanen a [$1 dagiti amammo a kiteb].',
+'feedback-bugnew' => 'Kinitak. Ireporta ti baro a kiteb',
+
+# API errors
+'api-error-badaccess-groups' => 'Saan mo a mabalin ti agipan kadagiti papeles iti daytoy a wiki.',
+'api-error-badtoken' => 'Kinauneg a biddut: Dakes a tandaan.',
+'api-error-copyuploaddisabled' => 'Ti mangipan babaen ti URL ket nabaldado ditoy a server.',
+'api-error-duplicate' => 'Adda {{PLURAL:$1|ket [$2 sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addan ditoy a pagsaadan nga agpada ti nagyan da.',
+'api-error-duplicate-archive' => 'Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabalia papeles]}} nga adda ditoy a pagsaadan nga agpada ti nagyan da, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.',
+'api-error-duplicate-archive-popup-title' => 'Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}} a naikkaten.',
+'api-error-duplicate-popup-title' => 'Duplikado {{PLURAL:$1|papeles|dagiti papeles}}',
+'api-error-empty-file' => 'Ti papeles nga intedmo ket awan ti nagyan na.',
+'api-error-emptypage' => 'Agar-aramid ti baro, dagiti awan ti linaon na a panid ket saan a maipalubos.',
+'api-error-fetchfileerror' => 'Kinauneg a biddut: Addaan ti dakes a napasamak idi agalala ti papeles.',
+'api-error-file-too-large' => 'Ti papeles nga intedmo ket dakkel unay.',
+'api-error-filename-tooshort' => 'Ti nagan daytoy a papeles ket bassit unay.',
+'api-error-filetype-banned' => 'Ti kita daytoy a papeles ket maiparit.',
+'api-error-filetype-missing' => 'Ti papeles ket agkurang ti pagpa-atiddog.',
+'api-error-hookaborted' => 'Ti pinagbabaro a pinadas mo ket napasardeng iti pangpa-atiddog a kawit.',
+'api-error-http' => 'Kinauneg a biddut: Saan a makaikabit idiay server.',
+'api-error-illegal-filename' => 'Ti nagan daytoy a papeles ket saan a maipalubos.',
+'api-error-internal-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak ti panagaramid ti panagipan mo iti daytoy a wiki.',
+'api-error-invalid-file-key' => 'Kinauneg a biddut: Saan a nabirukan ti papeles idiay temporario a nagidulinan.',
+'api-error-missingparam' => 'Kinauneg a biddut: Kurang dagiti parametro iti kiddaw.',
+'api-error-missingresult' => 'Kinauneg a biddut: Saan a na-ammoan no ti kopia ket nagballigi.',
+'api-error-mustbeloggedin' => 'Masapul a nakastrek ka tapno makaipan ka kadagiti papeles.',
+'api-error-mustbeposted' => 'Kinauneg a biddut: Ti kiddaw ket masapul ti HTTP POST.',
+'api-error-noimageinfo' => 'Balligi ti panag-ipan, ngem ti server ket saan a nagited kadakami ti pakaammo a maipanggep iti daytoy a papeles.',
+'api-error-nomodule' => 'Kinauneg a biddut: Awan ti panagipan a module a disso.',
+'api-error-ok-but-empty' => 'Kinauneg a biddut: Awan ti sungbat manipud idiay server.',
+'api-error-overwrite' => 'Saan a mabalin a suratan manen iti papeles nga adda ditan.',
+'api-error-stashfailed' => 'Kinauneg a biddut: Napaay ti server ti agidulin ti temporario a papeles',
+'api-error-timeout' => 'Saan a simmungbat ti server iti nanamnama nga oras.',
+'api-error-unclassified' => 'Adda di amammo a biddut a rumsua.',
+'api-error-unknown-code' => 'Di amamo a biddut: "$1"',
+'api-error-unknown-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak idi inpadas mo ti agipan ti papeles mo.',
+'api-error-unknown-warning' => 'Di am-ammo a ballaag: $1',
+'api-error-unknownerror' => 'Di amamo a biddut: "$1".',
+'api-error-uploaddisabled' => 'Nabaldado ti mangipapan iti daytoy a wiki.',
+'api-error-verification-error' => 'Dakes ngata daytoy a papeles, wenno addaan ti madi a pagpa-atiddog.',
+
);
diff --git a/languages/messages/MessagesInh.php b/languages/messages/MessagesInh.php
index a868950b..659e284e 100644
--- a/languages/messages/MessagesInh.php
+++ b/languages/messages/MessagesInh.php
@@ -463,17 +463,11 @@ $messages = array(
'revdelete-radio-set' => 'XӀаа',
'revdelete-radio-unset' => 'A',
'revdelete-log' => 'Бахьан',
-'revdelete-logentry' => '[[$1]] доржама оагӀувни бӀаÑанче хийцай',
'revdel-restore' => 'БӀаÑанче хувца',
'revdel-restore-deleted' => 'дӀадаьккха доржамаш',
'revdel-restore-visible' => 'бӀаргагушдола доржамаш',
'pagehist' => 'ОагӀува иÑкар',
'deletedhist' => 'ДӀадакхамий иÑкар',
-'revdelete-content' => 'чулоацаро',
-'revdelete-summary' => 'хувцамий лоацам',
-'revdelete-uname' => 'дакъалаьцархочунна цIи',
-'revdelete-hid' => 'къайла Ñ $1',
-'revdelete-log-message' => '$1ара $2чунна {{PLURAL:$2|доржама|доржамий}}',
# History merging
'mergehistory-list' => 'Ð’IашагIатоха хувцамий иÑкар',
@@ -744,7 +738,7 @@ $messages = array(
'prefixindex' => 'ОагIувнаший хьалхера цIи хьагойтар',
'shortpages' => 'Лоаца оагIувнаш',
'longpages' => 'Доккхий оагIувнаш',
-'usercreated' => '$1ара $2чуча даь да',
+'usercreated' => '{{GENDER:$3|Чуваьннав|ЧуÑьннай}} $1 $2',
'newpages' => 'Керда оагIувнаш',
'move' => 'ЦIи хувца',
'movethispage' => 'Укх оагIува цIи хувца',
@@ -777,8 +771,7 @@ $messages = array(
'linksearch-line' => '$1 тIа Iинк $2 юкъера',
# Special:Log/newusers
-'newuserlogpage' => 'Дакъалаьцархоший дIаÑзбeнна таптар',
-'newuserlog-create-entry' => 'Керда дакъалаьцархо',
+'newuserlogpage' => 'Дакъалаьцархоший дIаÑзбeнна таптар',
# Special:ListGroupRights
'listgrouprights-members' => '(тоабий дагарче)',
@@ -812,7 +805,6 @@ $messages = array(
'actionfailed' => 'Оттам даьдац',
'deletedtext' => '"$1" дIаÑккха хиннай.
ТIехьара дIадаьккха дагарчена хьожаргволаш/хьожаргьйолаш, $2 хьажа.',
-'deletedarticle' => ' "[[$1]]" дIадаьккхад',
'dellogpage' => 'ДIадаккхара тептар',
'deletecomment' => 'Бахьан:',
'deleteotherreason' => 'Кхыдола бахьан/тIатохар:',
@@ -852,7 +844,6 @@ $messages = array(
# Undelete
'undeletelink' => 'БIаргтаÑÑа/юхаметтаоттаде',
'undeleteviewlink' => 'бIаргтаÑÑа',
-'undeletedarticle' => '"[[$1]]" юха Ð¾Ñ‚Ñ‚Ð°Ñ Ñ',
# Namespace form on various pages
'namespace' => 'ЦIерий аренаш',
@@ -943,8 +934,6 @@ $messages = array(
'talkexists' => "'''ОагIувни цIи хьийца хиннай, амма дувцама оагIувни цIи хувца мегаш Ñц, изза мо цIи йолаш оагIув йоландаь. Дехар да, кулга новкъоÑталца цхьанна вIашагIатоха уш.'''",
'movedto' => 'керда цIи тилла Ñ',
'movetalk' => 'МаIан чулоаца дувцама оагIувни цIи хувца',
-'1movedto2' => '[[$1]] цIи цу тIа [[$2]] хийцай',
-'1movedto2_redir' => '[[$1]] цIи хийцай [[$2]] дIа-хьа оагIува тIа гIолла',
'movelogpage' => 'Хувцама тептар',
'movereason' => 'Бахьан',
'revertmove' => 'юхаÑккха',
@@ -1022,17 +1011,13 @@ $messages = array(
'tooltip-undo' => 'Я хувцам дIаÑккхи, бIаргатаÑÑар хьахокха, кара дале, дIаÑккха бахьан IочуÑзаде моттигаца.',
'tooltip-summary' => 'Лоаца чулоацам IочуÑзаде',
-# Patrol log
-'patrol-log-line' => '$1 долачаьрахь $2 $3 хьажав/хьажай',
-'patrol-log-diff' => '$1 доржам',
-
# Browsing diffs
'previousdiff' => '↠Хьалхара хувцам',
'nextdiff' => 'ТIайоагIа хувцам',
# Media information
'file-info-size' => '$1 × $2 фихÑам, паьла дуÑтам: $3, MIME-тайп: $4',
-'file-nohires' => '<small>Укхал доккхагIа доржам дац</small>',
+'file-nohires' => 'Укхал доккхагIа доржам дац',
'svg-long-desc' => 'SVG-паьл, $1 × $2 фихелашца, паьла дуÑтам: $3',
'show-big-image' => 'Хьадоккхадаь Ñурт',
diff --git a/languages/messages/MessagesIo.php b/languages/messages/MessagesIo.php
index 49291d7d..06e15a74 100644
--- a/languages/messages/MessagesIo.php
+++ b/languages/messages/MessagesIo.php
@@ -401,9 +401,8 @@ Forsan, ulu ja efacis ol.',
'badtitle' => 'Nekorekta titulo',
'badtitletext' => 'La solicitita pagino esas nevalida, vakua od esas
nekorekta interlinguale od interwikale ligilo.',
-'perfcached' => 'La sequanta datumi esas kashizita* e li povus ne aktualigesar nuntempe.',
+'perfcached' => 'La sequanta datumi esas kashizita* e li povus ne aktualigesar nuntempe. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
'viewsource' => 'Vidar font-kodo',
-'viewsourcefor' => 'de $1',
'protectedpagetext' => 'Ica pagino esis protektita por preventar redaktar.',
'viewsourcetext' => 'Vu povas vidar ed kopiar la fonto-kodexo di ta pagino:',
'ns-specialprotected' => 'On ne povas redaktar speciala pagini.',
@@ -516,9 +515,6 @@ Vua IP-adreso registragesos en la versionaro di ca pagino.",
'summary-preview' => 'Prevido di la rezumo:',
'blockedtitle' => 'La uzanto esas blokusita',
'blockednoreason' => 'nula motivo donesis',
-'blockedoriginalsource' => "La fonto di '''$1''' montresas infre:",
-'blockededitsource' => "La texto di '''vua redaktaji''' di '''$1''' es montrata infre:",
-'whitelistedittitle' => 'On mustas enskribar por redaktar',
'whitelistedittext' => 'Vu mustas $1 por redaktar pagini.',
'nosuchsectiontitle' => 'On ne povis trovar la seciono',
'loginreqtitle' => 'Eniro esas postulata',
@@ -631,12 +627,6 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
'revdel-restore-visible' => 'videbla revizadi',
'pagehist' => 'Pagino-versionaro',
'deletedhist' => 'Efacita versionaro',
-'revdelete-content' => 'kontenajo',
-'revdelete-summary' => 'redakto-rezumo',
-'revdelete-uname' => 'uzantonomo',
-'revdelete-hid' => 'celis $1',
-'revdelete-unhid' => 'revelis $1',
-'logdelete-log-message' => '$1 por $2 {{PLURAL:$2|evento|eventi}}',
'revdelete-otherreason' => 'Altra/suplementala motivo:',
'revdelete-reasonotherlist' => 'Altra motivo',
@@ -719,7 +709,7 @@ Probez prefixizar vua demando kun ''all:'' por serchar omna kontenajo (inkluzant
'prefs-rc' => 'Recenta chanji',
'prefs-watchlist' => 'Surveyo-listo',
'prefs-watchlist-days' => 'Dii montrata en surveyaji:',
-'prefs-watchlist-days-max' => 'Maximo 7 dii',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'Maxima nombro: 1000',
'prefs-misc' => 'Mixaji',
'prefs-resetpass' => 'Chanjar pasovorto',
@@ -1048,8 +1038,7 @@ Volutez kontrolar '''<tt>[[:$1]]</tt>''' se vu ne esas certa pri chanjar olu.
'activeusers-noresult' => 'Nula uzanto trovesis.',
# Special:Log/newusers
-'newuserlogpage' => 'Uzanto-kreo-registro',
-'newuserlog-create-entry' => 'Nova uzanto',
+'newuserlogpage' => 'Uzanto-kreo-registro',
# Special:ListGroupRights
'listgrouprights-group' => 'Grupo',
@@ -1114,7 +1103,6 @@ Volutez kontrolar '''<tt>[[:$1]]</tt>''' se vu ne esas certa pri chanjar olu.
'actioncomplete' => 'Ago kompletigita',
'deletedtext' => '"$1" efacesis.
Videz $2 por obtenar registro di recenta efaci.',
-'deletedarticle' => 'efacis "[[$1]]"',
'dellogpage' => 'Efaco-registraro',
'dellogpagetext' => 'Infre esas listo di la plu recenta efaci.',
'deletionlog' => 'registro di efaciti',
@@ -1182,7 +1170,6 @@ restauris ad lasta versiono da $2.',
'undeletelink' => 'vidar/restaurar',
'undeleteviewlink' => 'videz',
'undeletecomment' => 'Komento:',
-'undeletedarticle' => 'restaurita "[[$1]]"',
'undelete-search-box' => 'Serchez efacita pagini',
'undelete-search-submit' => 'Serchar',
'undelete-show-file-submit' => 'Yes',
@@ -1286,9 +1273,9 @@ Memorez [[Special:UnlockDB|efacar la blokuso]] kande vua mantenado finos.',
'unlockdbsuccesstext' => 'La datumaro desblokusesis.',
# Move page
-'move-page' => 'Movar $1',
-'move-page-legend' => 'Rinomizar pagino',
-'movepagetext' => "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.
+'move-page' => 'Movar $1',
+'move-page-legend' => 'Rinomizar pagino',
+'movepagetext' => "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.
La antea titulo konvertesos a ridirektilo a la nova titulo.
La ligili a la antea titulo dil pagino ne chanjesos.
Voluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].
@@ -1300,26 +1287,23 @@ Ico signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras sk
'''EGARDEZ!'''
Ica povas esar drastika chanjo e ne-esperinda por populara pagino;
voluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
-'movearticle' => 'Movez pagino:',
-'movenologin' => 'Sesiono ne iniciata',
-'movenologintext' => 'Vu mustas esar registragita uzanto ed [[Special:UserLogin|enirir]] por rinomizar pagino.',
-'newtitle' => 'A nova titulo:',
-'move-watch' => 'Surveyar ca pagino',
-'movepagebtn' => 'Movar pagino',
-'pagemovedsub' => 'Rinomizita sucese',
-'movepage-moved' => '\'\'\'"$1" esas movata ad "$2"\'\'\'',
-'articleexists' => 'Pagino kun sama nomo ja existas od la nomo
+'movearticle' => 'Movez pagino:',
+'movenologin' => 'Sesiono ne iniciata',
+'movenologintext' => 'Vu mustas esar registragita uzanto ed [[Special:UserLogin|enirir]] por rinomizar pagino.',
+'newtitle' => 'A nova titulo:',
+'move-watch' => 'Surveyar ca pagino',
+'movepagebtn' => 'Movar pagino',
+'pagemovedsub' => 'Rinomizita sucese',
+'movepage-moved' => '\'\'\'"$1" esas movata ad "$2"\'\'\'',
+'articleexists' => 'Pagino kun sama nomo ja existas od la nomo
qua vu selektis ne esas valida.
Voluntez selektar altra nomo.',
-'movedto' => 'rinomizita ad',
-'movetalk' => 'Rinomizar la debato-pagino se to esas aplikebla.',
-'1movedto2' => '[[$1]] movita a [[$2]]',
-'1movedto2_redir' => '[[$1]] movita a [[$2]] tra ridirektilo',
-'move-redirect-suppressed' => 'ridirektilo supresita',
-'movelogpage' => 'Movo-registraro',
-'movereason' => 'Motivo:',
-'revertmove' => 'rekuperar',
-'delete_and_move_confirm' => 'Yes, efacez la pagino',
+'movedto' => 'rinomizita ad',
+'movetalk' => 'Rinomizar la debato-pagino se to esas aplikebla.',
+'movelogpage' => 'Movo-registraro',
+'movereason' => 'Motivo:',
+'revertmove' => 'rekuperar',
+'delete_and_move_confirm' => 'Yes, efacez la pagino',
# Export
'export' => 'Exportacar pagini',
@@ -1421,17 +1405,13 @@ Vu darfos adjuntar kauso en la rezumo.',
# Spam protection
'spamprotectiontitle' => 'Filtrilo kontre spamo',
-# Patrol log
-'patrol-log-auto' => '(automata)',
-'patrol-log-diff' => 'revizado $1',
-
# Browsing diffs
'previousdiff' => '↠Plu anciena versiono',
'nextdiff' => 'Plu recenta versiono →',
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagino|pagini}}',
-'file-nohires' => '<small>Ne existas grandeso plu granda.</small>',
+'file-nohires' => 'Ne existas grandeso plu granda.',
'show-big-image' => 'Grandeso kompleta',
# Special:NewFiles
diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php
index 5adac674..a50e61ba 100644
--- a/languages/messages/MessagesIs.php
+++ b/languages/messages/MessagesIs.php
@@ -80,138 +80,148 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#tilvísun', '#TILVÃSUN', '#REDIRECT' ),
- 'nogallery' => array( '0', '__EMSAFN__', '__NOGALLERY__' ),
- 'currentday' => array( '1', 'NÚDAGUR', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'NÚDAGUR2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NÚDAGNAFN', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'NÚÃR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'NÚTÃMI', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'NÚKTÃMI', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'STMÃN', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'STMÃNNAFN', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'STMÃNST', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'STDAGUR', 'LOCALDAY' ),
- 'localday2' => array( '1', 'STDAGUR2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'STDAGNAFN', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'STÃR', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'STTÃMI', 'LOCALTIME' ),
- 'localhour' => array( '1', 'STKTÃMI', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'FJLSÃÃA', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'FJLGREINA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FJLSKJALA', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'FJLNOT', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'FJLBREYT', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'SÃÃUNAFN', 'PAGENAME' ),
- 'namespace' => array( '1', 'NAFNSVÆÃI', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'SPJALLSVÆÃI', 'TALKSPACE' ),
- 'fullpagename' => array( '1', 'FULLTSÃÃUNF', 'FULLPAGENAME' ),
- 'img_manualthumb' => array( '1', 'þumall', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'hægri', 'right' ),
- 'img_left' => array( '1', 'vinstri', 'left' ),
- 'img_none' => array( '1', 'engin', 'none' ),
- 'img_width' => array( '1', '$1dp', '$1px' ),
- 'img_center' => array( '1', 'miðja', 'center', 'centre' ),
- 'img_sub' => array( '1', 'undir', 'sub' ),
- 'img_super' => array( '1', 'yfir', 'super', 'sup' ),
- 'img_top' => array( '1', 'efst', 'top' ),
- 'img_bottom' => array( '1', 'neðst', 'bottom' ),
- 'img_text_bottom' => array( '1', 'texti-neðst', 'text-bottom' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'server' => array( '0', 'VEFÞJ', 'SERVER' ),
- 'servername' => array( '0', 'VEFÞJNF', 'SERVERNAME' ),
- 'grammar' => array( '0', 'MÃLFRÆÃI:', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'NÚVIKA', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'STVIKA', 'LOCALWEEK' ),
- 'plural' => array( '0', 'FLTALA:', 'PLURAL:' ),
- 'raw' => array( '0', 'HRÃ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'SÃNATITIL', 'DISPLAYTITLE' ),
- 'language' => array( '0', '#TUNGUMÃL', '#LANGUAGE:' ),
- 'special' => array( '0', 'kerfissíða', 'special' ),
+ 'redirect' => array( '0', '#tilvísun', '#TILVÃSUN', '#REDIRECT' ),
+ 'nogallery' => array( '0', '__EMSAFN__', '__NOGALLERY__' ),
+ 'currentday' => array( '1', 'NÚDAGUR', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NÚDAGUR2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NÚDAGNAFN', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'NÚÃR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'NÚTÃMI', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'NÚKTÃMI', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'STMÃN', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'STMÃNNAFN', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'STMÃNST', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'STDAGUR', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'STDAGUR2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'STDAGNAFN', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'STÃR', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'STTÃMI', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'STKTÃMI', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'FJLSÃÃA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'FJLGREINA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FJLSKJALA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'FJLNOT', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'FJLBREYT', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'SÃÃUNAFN', 'PAGENAME' ),
+ 'namespace' => array( '1', 'NAFNSVÆÃI', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'SPJALLSVÆÃI', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'FULLTSÃÃUNF', 'FULLPAGENAME' ),
+ 'img_manualthumb' => array( '1', 'þumall', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'hægri', 'right' ),
+ 'img_left' => array( '1', 'vinstri', 'left' ),
+ 'img_none' => array( '1', 'engin', 'none' ),
+ 'img_width' => array( '1', '$1dp', '$1px' ),
+ 'img_center' => array( '1', 'miðja', 'center', 'centre' ),
+ 'img_sub' => array( '1', 'undir', 'sub' ),
+ 'img_super' => array( '1', 'yfir', 'super', 'sup' ),
+ 'img_top' => array( '1', 'efst', 'top' ),
+ 'img_bottom' => array( '1', 'neðst', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'texti-neðst', 'text-bottom' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'server' => array( '0', 'VEFÞJ', 'SERVER' ),
+ 'servername' => array( '0', 'VEFÞJNF', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'MÃLFRÆÃI:', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'NÚVIKA', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'STVIKA', 'LOCALWEEK' ),
+ 'plural' => array( '0', 'FLTALA:', 'PLURAL:' ),
+ 'raw' => array( '0', 'HRÃ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'SÃNATITIL', 'DISPLAYTITLE' ),
+ 'language' => array( '0', '#TUNGUMÃL', '#LANGUAGE:' ),
+ 'special' => array( '0', 'kerfissíða', 'special' ),
);
$specialPageAliases = array(
+ 'Activeusers' => array( 'Virkir_notendur' ),
'Allmessages' => array( 'Meldingar' ),
- 'Allpages' => array( 'Allar síður' ),
- 'Ancientpages' => array( 'Elstu síður' ),
- 'Block' => array( 'Banna vistföng' ),
- 'Blockme' => array( 'Banna mig' ),
+ 'Allpages' => array( 'Allar_síður' ),
+ 'Ancientpages' => array( 'Elstu_síður' ),
+ 'Blankpage' => array( 'Auð_síða' ),
+ 'Block' => array( 'Banna_vistföng' ),
+ 'Blockme' => array( 'Banna_mig' ),
'Booksources' => array( 'Bókaheimildir' ),
- 'BrokenRedirects' => array( 'Brotnar tilvísanir' ),
+ 'BrokenRedirects' => array( 'Brotnar_tilvísanir' ),
'Categories' => array( 'Flokkar' ),
- 'ChangePassword' => array( 'Endurkalla aðgangsorðið' ),
- 'Confirmemail' => array( 'Staðfesta netfang' ),
+ 'ChangeEmail' => array( 'Breyta_netfangi' ),
+ 'ChangePassword' => array( 'Endurkalla_aðgangsorðið' ),
+ 'ComparePages' => array( 'Bera_saman_síður' ),
+ 'Confirmemail' => array( 'Staðfesta_netfang' ),
'Contributions' => array( 'Framlög' ),
- 'CreateAccount' => array( 'Búa til aðgang' ),
+ 'CreateAccount' => array( 'Búa_til_aðgang' ),
'Deadendpages' => array( 'Botnlangar' ),
- 'Disambiguations' => array( 'Tenglar í aðgreiningarsíður' ),
- 'DoubleRedirects' => array( 'Tvöfaldar tilvísanir' ),
- 'Emailuser' => array( 'Senda tölvupóst' ),
- 'Export' => array( 'Flytja út' ),
- 'Fewestrevisions' => array( 'Fæstar útgáfur' ),
+ 'DeletedContributions' => array( 'Edd_framlög' ),
+ 'Disambiguations' => array( 'Tenglar_í_aðgreiningarsíður' ),
+ 'DoubleRedirects' => array( 'Tvöfaldar_tilvísanir' ),
+ 'EditWatchlist' => array( 'Breyta_vaktlista' ),
+ 'Emailuser' => array( 'Senda_tölvupóst' ),
+ 'Export' => array( 'Flytja_út' ),
+ 'Fewestrevisions' => array( 'Fæstar_útgáfur' ),
'FileDuplicateSearch' => array( 'Afritunarskráarleit' ),
'Filepath' => array( 'Skráarslóð' ),
- 'Import' => array( 'Flytja inn' ),
- 'Invalidateemail' => array( 'Rangt netfang' ),
- 'BlockList' => array( 'Bönnuð vistföng' ),
+ 'Import' => array( 'Flytja_inn' ),
+ 'Invalidateemail' => array( 'Rangt_netfang' ),
+ 'BlockList' => array( 'Bönnuð_vistföng' ),
'Listadmins' => array( 'Stjórnendalisti' ),
'Listbots' => array( 'Vélmennalisti' ),
'Listfiles' => array( 'Myndalisti' ),
'Listgrouprights' => array( 'Réttindalisti' ),
'Listredirects' => array( 'Tilvísanalisti' ),
'Listusers' => array( 'Notendalisti' ),
- 'Lockdb' => array( 'Læsa gagnagrunni' ),
+ 'Lockdb' => array( 'Læsa_gagnagrunni' ),
'Log' => array( 'Aðgerðaskrár' ),
- 'Lonelypages' => array( 'Munaðarlausar síður' ),
- 'Longpages' => array( 'Langar síður' ),
- 'MergeHistory' => array( 'Sameina breytingaskrá' ),
+ 'Lonelypages' => array( 'Munaðarlausar_síður' ),
+ 'Longpages' => array( 'Langar_síður' ),
+ 'MergeHistory' => array( 'Sameina_breytingaskrá' ),
'MIMEsearch' => array( 'MIME-leit' ),
- 'Mostcategories' => array( 'Flestir flokkar' ),
- 'Mostimages' => array( 'Flestar myndir' ),
- 'Mostlinked' => array( 'Mest ítengt' ),
- 'Mostlinkedcategories' => array( 'Mest ítengdu flokkar' ),
- 'Mostlinkedtemplates' => array( 'Mest ítengdu snið' ),
- 'Mostrevisions' => array( 'Flestar útgáfur' ),
- 'Movepage' => array( 'Færa síðu' ),
- 'Mycontributions' => array( 'Framlög mín' ),
- 'Mypage' => array( 'Notandasíða mín' ),
- 'Mytalk' => array( 'Spjallasíða mín' ),
- 'Newimages' => array( 'Nýjar myndir' ),
- 'Newpages' => array( 'Nýjustu greinar' ),
- 'Popularpages' => array( 'Vinsælar síður' ),
+ 'Mostcategories' => array( 'Flestir_flokkar' ),
+ 'Mostimages' => array( 'Flestar_myndir' ),
+ 'Mostlinked' => array( 'Mest_ítengt' ),
+ 'Mostlinkedcategories' => array( 'Mest_ítengdu_flokkar' ),
+ 'Mostlinkedtemplates' => array( 'Mest_ítengdu_snið' ),
+ 'Mostrevisions' => array( 'Flestar_útgáfur' ),
+ 'Movepage' => array( 'Færa_síðu' ),
+ 'Mycontributions' => array( 'Framlög_mín' ),
+ 'Mypage' => array( 'Notandasíða_mín' ),
+ 'Mytalk' => array( 'Spjallasíða_mín' ),
+ 'Myuploads' => array( 'Upplöðin_mín' ),
+ 'Newimages' => array( 'Nýjar_myndir' ),
+ 'Newpages' => array( 'Nýjustu_greinar' ),
+ 'PasswordReset' => array( 'Endursetja_lykilorð' ),
+ 'Popularpages' => array( 'Vinsælar_síður' ),
'Preferences' => array( 'Stillingar' ),
'Prefixindex' => array( 'Forskeyti' ),
- 'Protectedpages' => array( 'Verndaðar síður' ),
- 'Protectedtitles' => array( 'Verndaðir titlar' ),
- 'Randompage' => array( 'Handahófsvalin síða' ),
- 'Randomredirect' => array( 'Handahófsvalin tilvísun' ),
- 'Recentchanges' => array( 'Nýlegar breytingar' ),
- 'Recentchangeslinked' => array( 'Nýlegar breytingar tengdar' ),
+ 'Protectedpages' => array( 'Verndaðar_síður' ),
+ 'Protectedtitles' => array( 'Verndaðir_titlar' ),
+ 'Randompage' => array( 'Handahófsvalin_síða' ),
+ 'Randomredirect' => array( 'Handahófsvalin_tilvísun' ),
+ 'Recentchanges' => array( 'Nýlegar_breytingar' ),
+ 'Recentchangeslinked' => array( 'Nýlegar_breytingar_tengdar' ),
'Revisiondelete' => array( 'Eyðingarendurskoðun' ),
'Search' => array( 'Leit' ),
- 'Shortpages' => array( 'Stuttar síður' ),
+ 'Shortpages' => array( 'Stuttar_síður' ),
'Specialpages' => array( 'Kerfissíður' ),
'Statistics' => array( 'Tölfræði' ),
- 'Uncategorizedcategories' => array( 'Óflokkaðir flokkar' ),
- 'Uncategorizedimages' => array( 'Óflokkaðar myndir' ),
- 'Uncategorizedpages' => array( 'Óflokkaðar síður' ),
- 'Uncategorizedtemplates' => array( 'Óflokkuð snið' ),
- 'Undelete' => array( 'Endurvekja eydda síðu' ),
- 'Unlockdb' => array( 'Opna gagnagrunn' ),
- 'Unusedcategories' => array( 'Ónotaðir flokkar' ),
- 'Unusedimages' => array( 'Munaðarlausar myndir' ),
- 'Unusedtemplates' => array( 'Ónotuð snið' ),
- 'Unwatchedpages' => array( 'Óvaktaðar síður' ),
- 'Upload' => array( 'Hlaða inn' ),
+ 'Unblock' => array( 'Afbönnun' ),
+ 'Uncategorizedcategories' => array( 'Óflokkaðir_flokkar' ),
+ 'Uncategorizedimages' => array( 'Óflokkaðar_myndir' ),
+ 'Uncategorizedpages' => array( 'Óflokkaðar_síður' ),
+ 'Uncategorizedtemplates' => array( 'Óflokkuð_snið' ),
+ 'Undelete' => array( 'Endurvekja_eydda_síðu' ),
+ 'Unlockdb' => array( 'Opna_gagnagrunn' ),
+ 'Unusedcategories' => array( 'Ónotaðir_flokkar' ),
+ 'Unusedimages' => array( 'Munaðarlausar_myndir' ),
+ 'Unusedtemplates' => array( 'Ónotuð_snið' ),
+ 'Unwatchedpages' => array( 'Óvaktaðar_síður' ),
+ 'Upload' => array( 'Hlaða_inn' ),
'Userlogin' => array( 'Innskrá' ),
'Userlogout' => array( 'Útskrá' ),
'Userrights' => array( 'Notandaréttindi' ),
'Version' => array( 'Útgáfa' ),
- 'Wantedcategories' => array( 'Eftirsóttir flokkar' ),
- 'Wantedpages' => array( 'Eftirsóttar síður' ),
+ 'Wantedcategories' => array( 'Eftirsóttir_flokkar' ),
+ 'Wantedpages' => array( 'Eftirsóttar_síður' ),
+ 'Wantedtemplates' => array( 'Eftirsótt_snið' ),
'Watchlist' => array( 'Vaktlistinn' ),
- 'Whatlinkshere' => array( 'Síður sem tengjast hingað' ),
- 'Withoutinterwiki' => array( 'Síður án tungumálatengla' ),
+ 'Whatlinkshere' => array( 'Síður_sem_tengjast_hingað' ),
+ 'Withoutinterwiki' => array( 'Síður_án_tungumálatengla' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -576,20 +586,22 @@ Gjörðu svo vel og tilkynntu atvikið til [[Special:ListUsers/sysop|stjórnanda
'badarticleerror' => 'Þetta er ekki hægt að framkvæma á síðunni.',
'cannotdelete' => 'Ekki var hægt að eyða síðunni "$1".
Líklegt er að einhver annar hafi gert það.',
+'cannotdelete-title' => 'Gat ekki eytt síðunni $1',
'badtitle' => 'Slæmur titill',
'badtitletext' => 'Umbeðin síðutitill er ógildur.',
-'perfcached' => 'Eftirfarandi er afrit af umbeðinni síðu og gæti því ekki verið nýjasta útgáfa hennar:',
-'perfcachedts' => 'Eftirfarandi gögn eru í skyndiminninu, og voru síðast uppfærð $1.',
+'perfcached' => 'Eftirfarandi er afrit af umbeðinni síðu og gæti því ekki verið nýjasta útgáfa hennar. Allt að {{PLURAL:$1|ein niðurstaða er aðgengileg|$1 niðurstöður eru aðgengilegar}} í skyndiminninu.',
+'perfcachedts' => 'Eftirfarandi gögn eru í skyndiminninu, og voru síðast uppfærð $1. Allt að {{PLURAL:$1|ein niðurstaða er aðgengileg|$1 niðurstöður eru aðgengilegar}} í skyndiminninu.',
'querypage-no-updates' => 'Lokað er fyrir uppfærslur af þessari síðu. Gögn sett hér munu ekki vistast.',
'wrong_wfQuery_params' => 'Röng færibreyta fyrir wfQuery()<br />
Virkni: $1<br />
Spurn: $2',
'viewsource' => 'Skoða efni',
-'viewsourcefor' => 'fyrir $1',
+'viewsource-title' => 'Skoða efni $1',
'actionthrottled' => 'Aðgerðin kafnaði',
'actionthrottledtext' => 'Til þess að verjast ruslpósti, er ekki hægt að framkvæma þessa aðgerð of oft, og þú hefur farið fram yfir þau takmörk. Gjörðu svo vel og reyndu aftur eftir nokkrar mínútur.',
'protectedpagetext' => 'Þessari síðu hefur verið læst til að koma í veg fyrir breytingar.',
'viewsourcetext' => 'Þú getur skoðað og afritað kóða þessarar síðu:',
+'viewyourtext' => "Þú getur skoðað og afritað kóða '''breytinganna þinna''' yfir á þessa síðu:",
'protectedinterface' => 'Þessi síða útvegar textann sem birtist í viðmóti hugbúnaðarins, og er læst til að koma í veg fyrir misnotkun.',
'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.
@@ -693,6 +705,7 @@ Til að koma í veg fyrir misnotkun, er aðeins ein áminning send {{PLURAL:$1|h
'emailconfirmlink' => 'Staðfesta netfang þitt',
'invalidemailaddress' => 'Ekki er hægt að taka við netfangi þínu þar sem að það er á ógildu formi.
Gjörðu svo vel og settu inn netfang á gildu formi eða tæmdu reitinn.',
+'cannotchangeemail' => 'Ekki er hægt að breyta netföngum notenda á þessum wiki',
'accountcreated' => 'Aðgangur búinn til',
'accountcreatedtext' => 'Notandaaðgangur fyrir $1 er tilbúinn.',
'createaccount-title' => 'Innskráningagerð á {{SITENAME}}',
@@ -709,6 +722,7 @@ Vinsamlegast reynið aftur síðar.',
# E-mail sending
'php-mail-error-unknown' => 'Óþekkt villa í PHP mail() aðgerð.',
+'user-mail-no-addy' => 'Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.',
# Change password dialog
'resetpass' => 'Breyta lykilorði',
@@ -730,32 +744,47 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
'resetpass-temp-password' => 'Tímabundið lykilorð:',
# Special:PasswordReset
-'passwordreset' => 'Endurstilla lykilorð',
-'passwordreset-text' => 'Fylltu út þennan reit til að fá tölvupóst um áminningu um notendauplýsingarnar þínar.',
-'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-username' => 'Notandanafn:',
-'passwordreset-domain' => 'Lén:',
-'passwordreset-email' => 'Netfang:',
-'passwordreset-emailtitle' => 'Notendaupplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
+'passwordreset' => 'Endurstilla lykilorð',
+'passwordreset-text' => 'Fylltu út þennan reit til að fá tölvupóst um áminningu um notendauplýsingarnar þínar.',
+'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-username' => 'Notandanafn:',
+'passwordreset-domain' => 'Lén:',
+'passwordreset-capture' => 'Sjá áminninguna sem var send í tölvupósti?',
+'passwordreset-capture-help' => 'Ef þú hakar við þennan reit verður tölvupósturinn (með tímabundna lykilorðinu) sýndur þér og einnig sendur notandanum.',
+'passwordreset-email' => 'Netfang:',
+'passwordreset-emailtitle' => 'Notendaupplýsingar á {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
$2
Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
-'passwordreset-emailtext-user' => 'Notandinn $1 á {{SITENAME}} hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
+'passwordreset-emailtext-user' => 'Notandinn $1 á {{SITENAME}} hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
$2
Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
-'passwordreset-emailelement' => 'Notendanafn: $1
+'passwordreset-emailelement' => 'Notendanafn: $1
Tímabundið lykilorð: $2',
-'passwordreset-emailsent' => 'Ãminning hefur verið send í tölvupósti.',
+'passwordreset-emailsent' => 'Ãminning hefur verið send í tölvupósti.',
+'passwordreset-emailsent-capture' => 'Ãminning hefur verið send í tölvupósti, sem er sýnd 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Breyting netfangs',
+'changeemail-header' => 'Breyta skráðu netfangi',
+'changeemail-text' => 'Fylltu út þetta eyðublað til að breyta netfanginu þínu. Þú þarft að slá inn lykilorðið þitt til að staðfesta breytinguna.',
+'changeemail-no-info' => 'Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.',
+'changeemail-oldemail' => 'Núverandi netfang:',
+'changeemail-newemail' => 'Nýtt netfang:',
+'changeemail-none' => '(ekkert)',
+'changeemail-submit' => 'Breyta netfangi',
+'changeemail-cancel' => 'Hætta við',
# Edit page toolbar
'bold_sample' => 'Feitletraður texti',
@@ -826,9 +855,6 @@ Athugaðu að þú getur ekki notað „Senda þessum notanda tölvupóst“ að
Núverandi vistfang þitt er $3, og bönnunarnúmerið er #$5.
Vinsamlegast tilgreindu allt að ofanverðu í fyrirspurnum þínum.",
'blockednoreason' => 'engin ástæða gefin',
-'blockedoriginalsource' => "Efni '''$1''' er sýnt fyrir neðan:",
-'blockededitsource' => "Texti '''þinna breytinga''' á '''$1''' eru sýndar að neðan:",
-'whitelistedittitle' => 'Innskráningar er þörf til að breyta',
'whitelistedittext' => 'Þú þarft að $1 til að breyta síðum.',
'confirmedittext' => 'Þú verður að staðfesta netfangið þitt áður en þú getur breytt síðum. Vinsamlegast stilltu og staðfestu netfangið þitt í gegnum [[Special:Preferences|stillingarnar]].',
'nosuchsectiontitle' => 'Hluti ekki til',
@@ -913,7 +939,7 @@ Lausn er í gildi sem leyfir þér að breyta síðum: Stafatákn sem eru ekki Ã
Ef þú vilt ekki að textanum verði breytt skaltu ekki senda hann inn hér.<br />
Þú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).
'''EKKI SENDA INN HÖFUNDARRÉTTARVARIà EFNI ÃN LEYFIS RÉTTHAFA!'''",
-'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er $1 kílóbæti að lengd, en hámarkið er $2 kílóbæti. Ekki er hægt að vista textann.'''",
+'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er {{PLURAL:$1|eitt kílóbæti|$1 kílóbæti}} að lengd, en hámarkið er {{PLURAL:$2|eitt kílóbæti|$2 kílóbæti}}. Ekki er hægt að vista textann.'''",
'readonlywarning' => "'''AÃVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.
Þú kannt að vilja að klippa og líma textann í textaskjal og vista hann fyrir síðar.'''
@@ -1059,12 +1085,6 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
'revdel-restore-visible' => 'sýnilegar breytingar',
'pagehist' => 'Breytingaskrá',
'deletedhist' => 'Eyðingaskrá',
-'revdelete-content' => 'efni',
-'revdelete-summary' => 'breytingarágrip',
-'revdelete-uname' => 'notandanafn',
-'revdelete-restricted' => 'hömlur settar á stjórnendur',
-'revdelete-unrestricted' => 'fjarlægja hömlur á stjórnendur',
-'revdelete-log-message' => '$1 fyrir $2 {{PLURAL:$2|breytingu|breytingar}}',
'revdelete-edit-reasonlist' => 'Eyðingarástæður',
# History merging
@@ -1186,12 +1206,14 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
'prefs-rc' => 'Nýlegar breytingar',
'prefs-watchlist' => 'Vaktlistinn',
'prefs-watchlist-days' => 'Fjöldi daga sem vaktlistinn nær yfir:',
-'prefs-watchlist-days-max' => 'Hámark 7 dagar',
+'prefs-watchlist-days-max' => 'Hámark $1 {{PLURAL:$1|dagur|dagar}}',
'prefs-watchlist-edits' => 'Fjöldi breytinga sem vaktlistinn nær yfir:',
'prefs-watchlist-edits-max' => 'Hámarkstala: 1000',
'prefs-watchlist-token' => 'Tóki vaktlistans:',
'prefs-misc' => 'Aðrar stillingar',
'prefs-resetpass' => 'Breyta lykilorði',
+'prefs-changeemail' => 'Breyta netfangi',
+'prefs-setemail' => 'Skrá netfang',
'prefs-email' => 'Tölvupóststillingar',
'prefs-rendering' => 'Útlit',
'saveprefs' => 'Vista',
@@ -1250,6 +1272,7 @@ Ekki er hægt að taka þessa breytingu til baka.',
'yourrealname' => 'Fullt nafn:',
'yourlanguage' => 'Viðmótstungumál:',
'yourvariant' => 'Útgáfa:',
+'prefs-help-variant' => 'Þín sérvalda útgáfa eða réttritun til að birta innihald síðna í.',
'yournick' => 'Undirskrift:',
'prefs-help-signature' => 'Ummæli á spjallsíðum eiga að vera skrifuð undir með "<nowiki>~~~~</nowiki>" sem verður breytt í undirskrift þína og dagsetningu.',
'badsig' => 'Ógild hrá undirskrift. Athugaðu HTML-kóða.',
@@ -1291,7 +1314,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'userrights-lookup-user' => 'Yfirlit notandahópa',
'userrights-user-editname' => 'Skráðu notandanafn:',
'editusergroup' => 'Breyta notandahópum',
-'editinguser' => "Breyti réttindum '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Breyti réttindum '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Breyta notandahópum',
'saveusergroups' => 'Vista notandahóp',
'userrights-groupsmember' => 'Meðlimur:',
@@ -1424,6 +1447,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'action-suppressionlog' => 'Skoða þessa einrænu aðgerðarskrá',
'action-block' => 'Banna notandanum að gera breytingar',
'action-protect' => 'breyta verndunarstigum fyrir þessa síðu',
+'action-rollback' => 'Taka snögglega aftur breytingar síðasta notanda sem breytti ákveðinni síðu',
'action-import' => 'Flytja inn þessa skrá frá öðrum wiki',
'action-importupload' => 'Flytja inn þessa síðu frá skráar upphali',
'action-patrol' => 'Merkja breytingar annara sem yfirfarnar',
@@ -1433,6 +1457,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'action-userrights' => 'breyta öllum notandaréttindum',
'action-userrights-interwiki' => 'breyta notandaréttindum annarra notenda á öðrum wiki-verkefnum',
'action-siteadmin' => 'læsa eða opna gagnagrunninn',
+'action-sendemail' => 'senda tölvupósta',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|breyting|breytingar}}',
@@ -1464,6 +1489,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'number_of_watching_users_pageview' => '[{{PLURAL:$1|notandi skoðandi|$1 notendur skoðandi}}]',
'rc_categories' => 'Takmark á flokkum (aðskilja með "|")',
'rc_categories_any' => 'Alla',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bæt|bæti}} eftir breytingu',
'newsectionsummary' => 'Nýr hluti: /* $1 */',
'rc-enhanced-expand' => 'Sýna upplýsingar (þarfnast JavaScript)',
'rc-enhanced-hide' => 'Fela ítarefni',
@@ -1518,6 +1544,7 @@ Sjá [[Special:NewFiles|myndasafn nýrra mynda]] fyrir myndrænna yfirlit.',
'minlength1' => 'Skráarnöfn þurfa að vera að minnsta kosti einn stafur að lengd',
'illegalfilename' => 'Skráarnafnið „$1“ inniheldur stafi sem eru ekki leyfðir í síðutitlum.
Gjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.',
+'filename-toolong' => 'Skráarnöfn mega ekki vera lengri en 240 bæt.',
'badfilename' => 'Skáarnafninu hefur verið breytt í „$1“.',
'filetype-mime-mismatch' => 'Skráarendingin ".$1" samræmist ekki MIME gerð skráarinnar ($2).',
'filetype-badmime' => 'Skrárir af MIME-gerðinni „$1“ er ekki leyfilegt að hlaða inn.',
@@ -1615,6 +1642,20 @@ Ef vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjó
'upload-unknown-size' => 'Óþekkt stærð',
'upload-http-error' => 'HTTP villa kom upp við upphal skráarinnar: $1',
+# File backend
+'backend-fail-backup' => 'Öryggisafritun skráarinnar $1 mistókst.',
+'backend-fail-notexists' => 'Skráin $1 er ekki til.',
+'backend-fail-invalidpath' => '$1 er ekki gildur geymslustaður.',
+'backend-fail-delete' => 'Mistókst að eyða skránni $1.',
+'backend-fail-alreadyexists' => 'Skráin $1 er þegar til.',
+'backend-fail-store' => 'Mistókst að vista skrá $1 á $2.',
+'backend-fail-copy' => 'Mistókst að afrita skjal $1 á $2.',
+'backend-fail-move' => 'Mistókst að færa skrá $1 á $2.',
+'backend-fail-opentemp' => 'Mistókst að opna tímabundna skrá.',
+'backend-fail-closetemp' => 'Mistókst að loka tímabundinni skrá.',
+'backend-fail-read' => 'Mistókst að lesa skrá $1.',
+'backend-fail-create' => 'Mistókst að búa til skrá $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Mistök við opnun skráarinnar fyrir ZIP athuganir.',
'zip-wrong-format' => 'Skráin var ekki ZIP skrá.',
@@ -1732,23 +1773,24 @@ Hér fyrir neðan er afrit af [$2 skráarsíðunni þar].',
'filerevert-badversion' => 'Það er ekki til nein fyrri staðbundin útgáfa af þessari skrá með þessum tímastimpli.',
# File deletion
-'filedelete' => 'Eyði „$1“',
-'filedelete-legend' => 'Eyða skrá',
-'filedelete-intro' => "Þú ert að eyða '''[[Media:$1|$1]]''' ásamt breytingarskrá hennar.",
-'filedelete-intro-old' => "Þú ert í þann mund að eyða útgáfu '''[[Media:$1|$1]]''' frá [$4 $3, kl. $2].",
-'filedelete-comment' => 'Ãstæða:',
-'filedelete-submit' => 'Eyða',
-'filedelete-success' => "'''$1''' hefur verið eytt.",
-'filedelete-success-old' => "Útgáfu '''[[Media:$1|$1]]''' frá $3, kl. $2 hefur verið eytt.",
-'filedelete-nofile' => "'''$1''' er ekki til.",
-'filedelete-nofile-old' => 'Ekkert skjalasafn af $1 er til með tilgreindum táknum.',
-'filedelete-otherreason' => 'Aðrar/fleiri ástæður:',
-'filedelete-reason-otherlist' => 'Önnur ástæða',
-'filedelete-reason-dropdown' => '* Algengar eyðingarástæður
+'filedelete' => 'Eyði „$1“',
+'filedelete-legend' => 'Eyða skrá',
+'filedelete-intro' => "Þú ert að eyða '''[[Media:$1|$1]]''' ásamt breytingarskrá hennar.",
+'filedelete-intro-old' => "Þú ert í þann mund að eyða útgáfu '''[[Media:$1|$1]]''' frá [$4 $3, kl. $2].",
+'filedelete-comment' => 'Ãstæða:',
+'filedelete-submit' => 'Eyða',
+'filedelete-success' => "'''$1''' hefur verið eytt.",
+'filedelete-success-old' => "Útgáfu '''[[Media:$1|$1]]''' frá $3, kl. $2 hefur verið eytt.",
+'filedelete-nofile' => "'''$1''' er ekki til.",
+'filedelete-nofile-old' => 'Ekkert skjalasafn af $1 er til með tilgreindum táknum.',
+'filedelete-otherreason' => 'Aðrar/fleiri ástæður:',
+'filedelete-reason-otherlist' => 'Önnur ástæða',
+'filedelete-reason-dropdown' => '* Algengar eyðingarástæður
** Höfundarréttarbrot
** Endurtekin skrá',
-'filedelete-edit-reasonlist' => 'Eyðingarástæður',
-'filedelete-maintenance' => 'à meðan viðhaldi stendur er lokað fyrir eyðingu og endurvakningu skráa.',
+'filedelete-edit-reasonlist' => 'Eyðingarástæður',
+'filedelete-maintenance' => 'à meðan viðhaldi stendur er lokað fyrir eyðingu og endurvakningu skráa.',
+'filedelete-maintenance-title' => 'Mistókst að eyða skrá',
# MIME search
'mimesearch' => 'MIME-leit',
@@ -1845,6 +1887,8 @@ Hún er tilvísun á [[$2]].',
'wantedpages' => 'Eftirsóttar síður',
'wantedpages-badtitle' => 'Ógildur titill í listanum: $1',
'wantedfiles' => 'Eftirsóttar skrár',
+'wantedfiletext-cat' => 'Eftirfarandi skrár eru í notkun en eru ekki til. Skrár frá skráarsöfnum gætu verið á listanum þrátt fyrir að þær séu til. Allar ástæðulausar færslur verða <del>yfirstrikaðar</del>. Þar að auki, eru síður sem innifala skrár sem eru ekki til á lista [[:$1]].',
+'wantedfiletext-nocat' => 'Eftirfarandi skrár eru í notkun en eru ekki til. Skrár frá srkáarsöfnum gætu verið á listanum þrátt fyrir að þær séu til. Allar ástæðulausar færslur verða <del>yfirstrikaðar</del>.',
'wantedtemplates' => 'Eftirsótt snið',
'mostlinked' => 'Mest ítengdu síður',
'mostlinkedcategories' => 'Mest ítengdu flokkar',
@@ -1853,6 +1897,7 @@ Hún er tilvísun á [[$2]].',
'mostimages' => 'Mest ítengdu skrárnar',
'mostrevisions' => 'Síður eftir fjölda breytinga',
'prefixindex' => 'Allar síður með forskeyti',
+'prefixindex-namespace' => 'Allar síður með forskeyti ($1 nafnrými)',
'shortpages' => 'Stuttar síður',
'longpages' => 'Langar síður',
'deadendpages' => 'Botnlangar',
@@ -1869,7 +1914,7 @@ Hún er tilvísun á [[$2]].',
'listusers-editsonly' => 'Sýna eingöngu notendur með breytingar',
'listusers-creationsort' => 'Raða eftir stofndegi',
'usereditcount' => '$1 {{PLURAL:$1|breyting|breytingar}}',
-'usercreated' => 'Stofnað $1 $2',
+'usercreated' => '{{GENDER:$3|Stofnað|}} $1 $2',
'newpages' => 'Nýjustu greinar',
'newpages-username' => 'Notandanafn:',
'ancientpages' => 'Elstu síður',
@@ -1962,12 +2007,8 @@ Studdar samskiptareglur: <tt>$1</tt> (ekki bæta neinum af þessum í leitina)',
'activeusers-noresult' => 'Enginn notandi fannst.',
# Special:Log/newusers
-'newuserlogpage' => 'Skrá yfir nýja notendur',
-'newuserlogpagetext' => 'Þetta er skrá yfir nýskráða notendur.',
-'newuserlog-byemail' => 'lykilorð sent með tölvupósti',
-'newuserlog-create-entry' => 'Nýr notandi',
-'newuserlog-create2-entry' => 'bjó til notanda fyrir $1',
-'newuserlog-autocreate-entry' => 'Aðgangur búinn til sjálfkrafa',
+'newuserlogpage' => 'Skrá yfir nýja notendur',
+'newuserlogpagetext' => 'Þetta er skrá yfir nýskráða notendur.',
# Special:ListGroupRights
'listgrouprights' => 'Notandahópréttindi',
@@ -1996,7 +2037,7 @@ Studdar samskiptareglur: <tt>$1</tt> (ekki bæta neinum af þessum í leitina)',
'emailpagetext' => 'Hafi notandi tilgreint netfang í stillingunum sínum er hægt að senda póst til hans hér.
Póstfangið sem þú tilgreindir í [[Special:Preferences|stillingunum þínum]] birtist í "Frá:" hluta tölvupóstsins, svo að viðtakandi þess geti svarað beint til þín.',
'usermailererror' => 'Póst hlutur skilaði villu:',
-'defemailsubject' => 'Varðandi {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} netfang notanda "$1"',
'usermaildisabled' => 'Netfang notenda er óvirkt',
'usermaildisabledtext' => 'Þú getur ekki sent tölvupóst til annara notenda á þessum wiki',
'noemailtitle' => 'Ekkert póstfang',
@@ -2050,7 +2091,7 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar, og
'watchmethod-list' => 'leita að breytingum í vöktuðum síðum',
'watchlistcontains' => 'Vaktlistinn þinn inniheldur {{PLURAL:$1|$1 síðu|$1 síður}}.',
'iteminvalidname' => 'Vandamál með „$1“, rangt nafn...',
-'wlnote' => "Að neðan {{PLURAL:$1|er síðasta breyting|eru síðustu '''$1''' breytingar}} {{PLURAL:$2|síðastliðinn klukkutímann|síðastliðna '''$2''' klukkutímana}}.",
+'wlnote' => "Hér fyrir neðan {{PLURAL:$1|er síðasta breyting|eru síðustu '''$1''' breytingar}} {{PLURAL:$2|síðastliðinn klukkutímann|síðastliðna '''$2''' klukkutímana}}, frá $3, $4.",
'wlshowlast' => 'Sýna síðustu $1 klukkutíma, $2 daga, $3',
'watchlist-options' => 'Vaktlistastillingar',
@@ -2115,7 +2156,6 @@ Vinsamlegast staðfestu það að þú ætlir að gera svo, það að þú skilj
'actionfailed' => 'Aðgerð mistókst',
'deletedtext' => '„$1“ hefur verið eytt.
Sjá lista yfir nýlegar eyðingar í $2.',
-'deletedarticle' => 'eyddi „[[$1]]“',
'dellogpage' => 'Eyðingaskrá',
'dellogpagetext' => 'Að neðan gefur að líta lista yfir síður sem nýlega hefur verið eytt.',
'deletionlog' => 'eyðingaskrá',
@@ -2163,7 +2203,10 @@ Sjáðu [[Special:ProtectedPages|Verndunarskrá]] fyrir núverandi lista yfir ve
'unprotectedarticle' => 'afverndaði „[[$1]]“',
'movedarticleprotection' => 'verndunarstilling hefur verið færð frá „[[$2]]“ á „[[$1]]“',
'protect-title' => 'Vernda „$1“',
+'protect-title-notallowed' => 'Skoða verndunarstig $1',
'prot_1movedto2' => '[[$1]] færð á [[$2]]',
+'protect-badnamespace-title' => 'Óverndanlegt nafnrými',
+'protect-badnamespace-text' => 'Síður í þessu nafnrými geta ekki verið verndaðar.',
'protect-legend' => 'Verndunarstaðfesting',
'protectcomment' => 'Ãstæða:',
'protectexpiry' => 'Rennur út:',
@@ -2185,6 +2228,7 @@ Núverandi staða síðunnar er '''$1''':",
'protect-level-sysop' => 'Leyfa aðeins stjórnendur',
'protect-summary-cascade' => 'keðjuvörn',
'protect-expiring' => 'rennur út $1 (UTC)',
+'protect-expiring-local' => 'rennur út $1',
'protect-expiry-indefinite' => 'ótiltekinn',
'protect-cascade' => 'Vernda innifaldar síður í þessari síðu (keðjuvörn)',
'protect-cantedit' => 'Þú getur ekki breytt verndunarstigi þessarar síðu, vegna þess að þú hefur ekki réttindin til að breyta því.',
@@ -2244,7 +2288,6 @@ Innihald greinarinnar er einungis aðgengilegt möppudýrum.',
'undeletereset' => 'Endurstilla',
'undeleteinvert' => 'Snúa vali við',
'undeletecomment' => 'Ãstæða:',
-'undeletedarticle' => 'endurvakti „[[$1]]“',
'undeletedrevisions' => '$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar',
'undeletedfiles' => '{{PLURAL:$1|Ein skrá endurvakin|$1 skrár endurvaktar}}',
@@ -2253,6 +2296,7 @@ Innihald greinarinnar er einungis aðgengilegt möppudýrum.',
Skoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og endurvakningar.",
'undelete-header' => 'Sjá [[Special:Log/delete|eyðingarskrá]] fyrir síður sem nýlega hefur verið eytt.',
+'undelete-search-title' => 'Leita í eyddum síðum',
'undelete-search-box' => 'Leita að eyddum síðum',
'undelete-search-prefix' => 'Sýna síður sem byrja á:',
'undelete-search-submit' => 'Leita',
@@ -2262,6 +2306,7 @@ Skoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og end
'undelete-cleanup-error' => 'Villa við eyðingu ónotaðs skjalasafns $1',
'undelete-missing-filearchive' => 'Mistókst að endurvekja skjalasafn með auðkenninu $1 því það er ekki til í gagnabankanum.
Mögulega er þegar búið að endurvekja það.',
+'undelete-error' => 'Mistókst að endurvekja síðu.',
'undelete-error-short' => 'Villa við endurvakningu skráar: $1',
'undelete-error-long' => 'Það kom upp villa við endurvakningu skráarinnar:
@@ -2383,6 +2428,7 @@ Sjá [[Special:BlockList|bannaðar notendur og vistföng]] fyrir yfirlit yfir nÃ
'blocklist-userblocks' => 'Fela notendabönn',
'blocklist-tempblocks' => 'Fela tímabundin bönn',
'blocklist-addressblocks' => 'Fela einstök bönn vistfanga',
+'blocklist-rangeblocks' => 'Fela fjöldabönn',
'blocklist-timestamp' => 'Tímastimpill',
'blocklist-target' => 'Beinist að',
'blocklist-expiry' => 'Rennur út',
@@ -2405,6 +2451,7 @@ Sjá [[Special:BlockList|bannaðar notendur og vistföng]] fyrir yfirlit yfir nÃ
'unblocklink' => 'afbanna',
'change-blocklink' => 'breyta bönnun',
'contribslink' => 'framlög',
+'emaillink' => 'senda tölvupóst',
'autoblocker' => 'Vistfang þitt er bannað vegna þess að það hefur nýlega verið notað af „[[User:$1|$1]]“.
Ãstæðan fyrir því að $1 var bannaður er: „$2“',
'blocklogpage' => 'Bönnunarskrá',
@@ -2520,9 +2567,6 @@ Gjörðu svo vel og færðu hana handvirkt.'''",
'movepage-page-moved' => 'Síðan $1 hefur verið færð á $2.',
'movepage-page-unmoved' => 'Ekki var hægt að færa síðuna $1 á $2.',
'movepage-max-pages' => 'Hámarkinu, $1 {{PLURAL:$1|síða|síður}}, hefur verið náð og verða engar fleiri færðar sjálfvirkt.',
-'1movedto2' => '[[$1]] færð á [[$2]]',
-'1movedto2_redir' => '[[$1]] færð á [[$2]] yfir tilvísun',
-'move-redirect-suppressed' => 'tilvísun leynd',
'movelogpage' => 'Flutningaskrá',
'movelogpagetext' => 'Þetta er listi yfir síður sem nýlega hafa verið færðar.',
'movesubpage' => '{{Plural:$1|Undirsíða|Undirsíður}}',
@@ -2535,7 +2579,7 @@ Gjörðu svo vel og færðu hana handvirkt.'''",
Síðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til fyrir flutningi?',
'delete_and_move_confirm' => 'Já, eyða síðunni',
-'delete_and_move_reason' => 'Eytt til að rýma til fyrir flutning',
+'delete_and_move_reason' => 'Eytt til að rýma til fyrir flutning frá "[[$1]]"',
'selfmove' => 'Nýja nafnið er það sama og gamla, þú verður að velja annað nafn.',
'immobile-source-namespace' => 'Get ekki fært síður í nafnrýminu „$1“',
'immobile-target-namespace' => 'Get ekki fært síður inn í nafnrýmið „$1“',
@@ -2569,6 +2613,7 @@ Ef síðari möguleikinn á við getur þú einnig notað tengil, til dæmis
'exportcuronly' => 'Aðeins núverandi útgáfu án breytingaskrár',
'exportnohistory' => "----
'''Athugaðu:''' Að flytja út alla breytingasögu síðna á þennan hátt hefur verið óvirkjað vegna ástæðna afkasta.",
+'exportlistauthors' => 'Innifela tæmandi lista af breytingum fyrir allar síður',
'export-submit' => 'Flytja',
'export-addcattext' => 'Bæta við síðum frá flokkinum:',
'export-addcat' => 'Bæta við',
@@ -2645,6 +2690,8 @@ Tímabundin mappa fannst ekki.',
'import-token-mismatch' => 'Týnd setu gögn.
Vinsamlegast reyndu aftur.',
'import-invalid-interwiki' => 'Get ekki flutt inn frá þessum wiki.',
+'import-error-edit' => 'Síðan "$1" var ekki flutt inn því þú hefur ekki réttindi til að breyta henni.',
+'import-error-create' => 'Síðan "$1" var ekki flutt inn því þú hefur ekki réttindi til að stofna hana.',
# Import log
'importlogpage' => 'Innflutningsskrá',
@@ -2654,72 +2701,77 @@ Vinsamlegast reyndu aftur.',
'import-logentry-interwiki' => 'flutti inn $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|breyting|breytingar}} frá $2',
+# JavaScriptTest
+'javascripttest-pagetext-skins' => 'Veldu þema sem á að keyra prófanirnar á:',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Notandasíðan þín',
-'tooltip-pt-anonuserpage' => 'Notandasíðan fyrir vistfangið þitt',
-'tooltip-pt-mytalk' => 'Spjallsíðan þín',
-'tooltip-pt-anontalk' => 'Spjallsíðan fyrir þetta vistfang',
-'tooltip-pt-preferences' => 'Almennar stillingar',
-'tooltip-pt-watchlist' => 'Listi yfir síður sem þú fylgist með breytingum á',
-'tooltip-pt-mycontris' => 'Listi yfir framlög þín',
-'tooltip-pt-login' => 'Þú ert hvattur/hvött til að innskrá þig, það er hinsvegar ekki skylda.',
-'tooltip-pt-anonlogin' => 'Þú ert hvattur/hvött til að innskrá þig, það er hinsvegar ekki nauðsynlegt.',
-'tooltip-pt-logout' => 'Útskráning',
-'tooltip-ca-talk' => 'Spallsíða þessarar síðu',
-'tooltip-ca-edit' => 'Þú getur breytt síðu þessari, vinsamlegast notaðu „forskoða“ hnappinn áður en þú vistar',
-'tooltip-ca-addsection' => 'Bæta nýjum hluta við',
-'tooltip-ca-viewsource' => 'Síða þessi er vernduð. Þú getur þó skoðað frumkóða hennar.',
-'tooltip-ca-history' => 'Eldri útgáfur af síðunni.',
-'tooltip-ca-protect' => 'Vernda þessa síðu',
-'tooltip-ca-unprotect' => 'Afvernda þessa síðu',
-'tooltip-ca-delete' => 'Eyða þessari síðu',
-'tooltip-ca-undelete' => 'Endurvekja breytingar á þessari síðu áður en að henni var eytt',
-'tooltip-ca-move' => 'Færa þessa síðu',
-'tooltip-ca-watch' => 'Bæta þessari síðu við á vaktlistann',
-'tooltip-ca-unwatch' => 'Fjarlægja þessa síðu af vaktlistanum',
-'tooltip-search' => 'Leit á þessari Wiki',
-'tooltip-search-go' => 'Fara á síðu með þessu nafni ef hún er til',
-'tooltip-search-fulltext' => 'Leita á síðunum eftir þessum texta',
-'tooltip-p-logo' => 'Forsíða',
-'tooltip-n-mainpage' => 'Forsíða {{SITENAME}}',
-'tooltip-n-mainpage-description' => 'Heimsækja forsíðuna',
-'tooltip-n-portal' => 'Um verkefnið, hvernig er hægt að hjálpa og hvar á að byrja',
-'tooltip-n-currentevents' => 'Finna upplýsingar um líðandi stund',
-'tooltip-n-recentchanges' => 'Listi yfir nýlegar breytingar.',
-'tooltip-n-randompage' => 'Handahófsvalin síða',
-'tooltip-n-help' => 'Efnisyfirlit yfir hjálparsíður.',
-'tooltip-t-whatlinkshere' => 'Listi yfir síður sem tengjast í þessa',
-'tooltip-t-recentchangeslinked' => 'Nýlegar breytingar á ítengdum síðum',
-'tooltip-feed-rss' => 'RSS fyrir þessa síðu',
-'tooltip-feed-atom' => 'Atom fyrir þessa síðu',
-'tooltip-t-contributions' => 'Sýna framlagslista þessa notanda',
-'tooltip-t-emailuser' => 'Senda þessum notanda tölvupóst',
-'tooltip-t-upload' => 'Hlaða inn skrám',
-'tooltip-t-specialpages' => 'Listi yfir kerfissíður',
-'tooltip-t-print' => 'Prentanleg útgáfa af þessari síðu',
-'tooltip-t-permalink' => 'Varanlegur tengill',
-'tooltip-ca-nstab-main' => 'Sýna síðuna',
-'tooltip-ca-nstab-user' => 'Sýna notandasíðuna',
-'tooltip-ca-nstab-media' => 'Sýna margmiðlunarsíðuna',
-'tooltip-ca-nstab-special' => 'Þetta er kerfissíða, þér er óhæft að breyta henni.',
-'tooltip-ca-nstab-project' => 'Sýna verkefnasíðuna',
-'tooltip-ca-nstab-image' => 'Sýna skráarsíðu',
-'tooltip-ca-nstab-mediawiki' => 'Sýna kerfisskilaboðin',
-'tooltip-ca-nstab-template' => 'Sýna sniðið',
-'tooltip-ca-nstab-help' => 'Sýna hjálparsíðuna',
-'tooltip-ca-nstab-category' => 'Sýna efnisflokkasíðuna',
-'tooltip-minoredit' => 'Merkja þessa breytingu sem minniháttar',
-'tooltip-save' => 'Vista breytingarnar',
-'tooltip-preview' => 'Forskoða breytingarnar, vinsamlegast gerðu þetta áður en þú vistar!',
-'tooltip-diff' => 'Sýna hvaða breytingar þú gerðir á textanum.',
-'tooltip-compareselectedversions' => 'Sjá breytingarnar á þessari grein á milli útgáfanna sem þú valdir.',
-'tooltip-watch' => 'Bæta þessari síðu á vaktlistann þinn',
-'tooltip-recreate' => 'Endurvekja síðuna þó henni hafi verið eytt',
-'tooltip-upload' => 'Hefja innhleðslu',
-'tooltip-rollback' => '"taka aftur" breytir greininni til síðasta höfundar með einum smelli',
-'tooltip-undo' => '"Tek aftur þessa breytingu" breytir aftur til síðustu breytingu og opnar breytinguna í forskoðun. Hægt er að bæta við ástæðu í breytingarávarpinu.',
-'tooltip-preferences-save' => 'Vista stillingar',
-'tooltip-summary' => 'Bættu við stuttu ágripi',
+'tooltip-pt-userpage' => 'Notandasíðan þín',
+'tooltip-pt-anonuserpage' => 'Notandasíðan fyrir vistfangið þitt',
+'tooltip-pt-mytalk' => 'Spjallsíðan þín',
+'tooltip-pt-anontalk' => 'Spjallsíðan fyrir þetta vistfang',
+'tooltip-pt-preferences' => 'Almennar stillingar',
+'tooltip-pt-watchlist' => 'Listi yfir síður sem þú fylgist með breytingum á',
+'tooltip-pt-mycontris' => 'Listi yfir framlög þín',
+'tooltip-pt-login' => 'Þú ert hvattur/hvött til að innskrá þig, það er hinsvegar ekki skylda.',
+'tooltip-pt-anonlogin' => 'Þú ert hvattur/hvött til að innskrá þig, það er hinsvegar ekki nauðsynlegt.',
+'tooltip-pt-logout' => 'Útskráning',
+'tooltip-ca-talk' => 'Spallsíða þessarar síðu',
+'tooltip-ca-edit' => 'Þú getur breytt síðu þessari, vinsamlegast notaðu „forskoða“ hnappinn áður en þú vistar',
+'tooltip-ca-addsection' => 'Bæta nýjum hluta við',
+'tooltip-ca-viewsource' => 'Síða þessi er vernduð. Þú getur þó skoðað frumkóða hennar.',
+'tooltip-ca-history' => 'Eldri útgáfur af síðunni.',
+'tooltip-ca-protect' => 'Vernda þessa síðu',
+'tooltip-ca-unprotect' => 'Afvernda þessa síðu',
+'tooltip-ca-delete' => 'Eyða þessari síðu',
+'tooltip-ca-undelete' => 'Endurvekja breytingar á þessari síðu áður en að henni var eytt',
+'tooltip-ca-move' => 'Færa þessa síðu',
+'tooltip-ca-watch' => 'Bæta þessari síðu við á vaktlistann',
+'tooltip-ca-unwatch' => 'Fjarlægja þessa síðu af vaktlistanum',
+'tooltip-search' => 'Leit á þessari Wiki',
+'tooltip-search-go' => 'Fara á síðu með þessu nafni ef hún er til',
+'tooltip-search-fulltext' => 'Leita á síðunum eftir þessum texta',
+'tooltip-p-logo' => 'Forsíða',
+'tooltip-n-mainpage' => 'Forsíða {{SITENAME}}',
+'tooltip-n-mainpage-description' => 'Heimsækja forsíðuna',
+'tooltip-n-portal' => 'Um verkefnið, hvernig er hægt að hjálpa og hvar á að byrja',
+'tooltip-n-currentevents' => 'Finna upplýsingar um líðandi stund',
+'tooltip-n-recentchanges' => 'Listi yfir nýlegar breytingar.',
+'tooltip-n-randompage' => 'Handahófsvalin síða',
+'tooltip-n-help' => 'Efnisyfirlit yfir hjálparsíður.',
+'tooltip-t-whatlinkshere' => 'Listi yfir síður sem tengjast í þessa',
+'tooltip-t-recentchangeslinked' => 'Nýlegar breytingar á ítengdum síðum',
+'tooltip-feed-rss' => 'RSS fyrir þessa síðu',
+'tooltip-feed-atom' => 'Atom fyrir þessa síðu',
+'tooltip-t-contributions' => 'Sýna framlagslista þessa notanda',
+'tooltip-t-emailuser' => 'Senda þessum notanda tölvupóst',
+'tooltip-t-upload' => 'Hlaða inn skrám',
+'tooltip-t-specialpages' => 'Listi yfir kerfissíður',
+'tooltip-t-print' => 'Prentanleg útgáfa af þessari síðu',
+'tooltip-t-permalink' => 'Varanlegur tengill',
+'tooltip-ca-nstab-main' => 'Sýna síðuna',
+'tooltip-ca-nstab-user' => 'Sýna notandasíðuna',
+'tooltip-ca-nstab-media' => 'Sýna margmiðlunarsíðuna',
+'tooltip-ca-nstab-special' => 'Þetta er kerfissíða, þér er óhæft að breyta henni.',
+'tooltip-ca-nstab-project' => 'Sýna verkefnasíðuna',
+'tooltip-ca-nstab-image' => 'Sýna skráarsíðu',
+'tooltip-ca-nstab-mediawiki' => 'Sýna kerfisskilaboðin',
+'tooltip-ca-nstab-template' => 'Sýna sniðið',
+'tooltip-ca-nstab-help' => 'Sýna hjálparsíðuna',
+'tooltip-ca-nstab-category' => 'Sýna efnisflokkasíðuna',
+'tooltip-minoredit' => 'Merkja þessa breytingu sem minniháttar',
+'tooltip-save' => 'Vista breytingarnar',
+'tooltip-preview' => 'Forskoða breytingarnar, vinsamlegast gerðu þetta áður en þú vistar!',
+'tooltip-diff' => 'Sýna hvaða breytingar þú gerðir á textanum.',
+'tooltip-compareselectedversions' => 'Sjá breytingarnar á þessari grein á milli útgáfanna sem þú valdir.',
+'tooltip-watch' => 'Bæta þessari síðu á vaktlistann þinn',
+'tooltip-watchlistedit-normal-submit' => 'Fjarlægja titla',
+'tooltip-watchlistedit-raw-submit' => 'Uppfæra vaktlistann',
+'tooltip-recreate' => 'Endurvekja síðuna þó henni hafi verið eytt',
+'tooltip-upload' => 'Hefja innhleðslu',
+'tooltip-rollback' => '"taka aftur" breytir greininni til síðasta höfundar með einum smelli',
+'tooltip-undo' => '"Tek aftur þessa breytingu" breytir aftur til síðustu breytingu og opnar breytinguna í forskoðun. Hægt er að bæta við ástæðu í breytingarávarpinu.',
+'tooltip-preferences-save' => 'Vista stillingar',
+'tooltip-summary' => 'Bættu við stuttu ágripi',
# Stylesheets
'common.css' => '/* Allt CSS sem sett er hér mun virka á öllum þemum. */',
@@ -2787,9 +2839,6 @@ Vinsamlegast reyndu aftur.',
# Patrol log
'patrol-log-page' => 'Yfirferðarskrá',
'patrol-log-header' => 'Þetta er skrá yfir yfirfarnar breytingar.',
-'patrol-log-line' => 'merkti $2 frá $1 $3 sem yfirfarna',
-'patrol-log-auto' => 'sjálfkrafa',
-'patrol-log-diff' => 'útgáfu $1',
'log-show-hide-patrol' => '$1 Listi yfir vaktaðar síður',
# Image deletion
@@ -2806,22 +2855,24 @@ Vinsamlegast reyndu aftur.',
'nextdiff' => 'Nýrri breyting →',
# Media information
-'mediawarning' => "'''AÃVÖRUN''': Þessi skrá kann að hafa meinfýsinn kóða, ef keyrður kann hann að stofna kerfinu þínu í hættu.",
-'imagemaxsize' => "Takmarka myndastærð:<br />''(fyrir skráarsíður)''",
-'thumbsize' => 'Stærð smámynda:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|síða|síður}}',
-'file-info' => 'stærð skráar: $1, MIME-tegund: $2',
-'file-info-size' => '$1 × $2 dílar, stærð skráar: $3, MIME-gerð: $4',
-'file-info-size-pages' => '$1 x $2 dílar, skráarstærð: $3, MIME-gerð: $4, $5 {{PLURAL:$5|síða|síður}} tengja í skránna.',
-'file-nohires' => '<small>Það er engin hærri upplausn til.</small>',
-'svg-long-desc' => 'SVG-skrá, að nafni til $1 × $2 dílar, skráarstærð: $3',
-'show-big-image' => 'Mesta upplausn',
-'show-big-image-size' => '$1 x $2 dílar',
-'file-info-gif-looped' => 'síendurtekin hreyfimynd',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
-'file-info-png-looped' => 'síendurtekin hreyfimynd',
-'file-info-png-repeat' => 'spilað {{PLURAL:$1|einu sinni|$1 sinnum}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
+'mediawarning' => "'''AÃVÖRUN''': Þessi skrá kann að hafa meinfýsinn kóða, ef keyrður kann hann að stofna kerfinu þínu í hættu.",
+'imagemaxsize' => "Takmarka myndastærð:<br />''(fyrir skráarsíður)''",
+'thumbsize' => 'Stærð smámynda:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|síða|síður}}',
+'file-info' => 'stærð skráar: $1, MIME-tegund: $2',
+'file-info-size' => '$1 × $2 dílar, stærð skráar: $3, MIME-gerð: $4',
+'file-info-size-pages' => '$1 x $2 dílar, skráarstærð: $3, MIME-gerð: $4, $5 {{PLURAL:$5|síða|síður}} tengja í skránna.',
+'file-nohires' => 'Það er engin hærri upplausn til.',
+'svg-long-desc' => 'SVG-skrá, að nafni til $1 × $2 dílar, skráarstærð: $3',
+'show-big-image' => 'Mesta upplausn',
+'show-big-image-preview' => 'Stærð þessarar forskoðunar: $1',
+'show-big-image-other' => '{{PLURAL:$2|Önnur upplausn|Aðrar upplausnir}}: $1.',
+'show-big-image-size' => '$1 x $2 dílar',
+'file-info-gif-looped' => 'síendurtekin hreyfimynd',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
+'file-info-png-looped' => 'síendurtekin hreyfimynd',
+'file-info-png-repeat' => 'spilað {{PLURAL:$1|einu sinni|$1 sinnum}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|rammi|rammar}}',
# Special:NewFiles
'newimages' => 'Myndasafn nýlegra skráa',
@@ -2835,6 +2886,13 @@ Vinsamlegast reyndu aftur.',
'bydate' => 'eftir dagsetningu',
'sp-newimages-showfrom' => 'Leita af nýjum skráum frá $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|ein sekúnda|$1 sekúndur}}',
+'minutes' => '{{PLURAL:$1|ein mínúta|$1 mínútur}}',
+'hours' => '{{PLURAL:$1|einn klukkutími|$1 klukkutímar}}',
+'days' => '{{PLURAL:$1|einn dagur|$1 dagar}}',
+'ago' => '$1 síðan',
+
# Bad image list
'bad_image_list' => 'Sniðið er eftirfarandi:
@@ -3263,13 +3321,6 @@ $5
'scarytranscludefailed' => '[Gat ekki sótt snið fyrir $1]',
'scarytranscludetoolong' => '[vefslóðin er of löng]',
-# Trackbacks
-'trackbackbox' => 'Varanlegir tenglar fyrir þessa grein:<br />
-$1',
-'trackbackremove' => '([$1 eydd])',
-'trackbacklink' => 'Varanlegur tengill',
-'trackbackdeleteok' => 'Varanlega tenglinum var eytt.',
-
# Delete conflict
'deletedwhileediting' => "'''Viðvörun''': Þessari síðu var eytt eftir að þú fórst að breyta henni!",
'confirmrecreate' => "Notandi [[User:$1|$1]] ([[User talk:$1|spjall]]) eyddi þessari síðu eftir að þú fórst að breyta henni út af:
@@ -3348,6 +3399,9 @@ einn titil í hverri línu.
'watchlisttools-edit' => 'Skoða og breyta vaktlistanum',
'watchlisttools-raw' => 'Breyta opnum vaktlistanum',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|spjall]])',
+
# Core parser functions
'unknown_extension_tag' => 'Óþekkt tákn "$1"',
'duplicate-defaultsort' => '\'\'\'Viðvörun:\'\'\' Sjálfgildur flýtihnappur "$2" tekur yfir fyrri flýtihnapp "$1".',
@@ -3397,6 +3451,9 @@ Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálf
# Special:SpecialPages
'specialpages' => 'Kerfissíður',
+'specialpages-note' => '----
+* Venjulegar kerfisíður.
+* <span class="mw-specialpagerestricted">Kerfisíður með takmörkuðum aðgangi.</span>',
'specialpages-group-maintenance' => 'Viðhaldsskýrslur',
'specialpages-group-other' => 'Aðrar kerfissíður',
'specialpages-group-login' => 'Innskrá / Búa til aðgang',
@@ -3438,13 +3495,16 @@ Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálf
'tags-hitcount' => '$1 {{PLURAL:$1|breyting|breytingar}}',
# Special:ComparePages
-'comparepages' => 'Bera saman síður',
-'compare-selector' => 'Bera saman útgáfur síðna',
-'compare-page1' => 'Síða 1',
-'compare-page2' => 'Síða 2',
-'compare-rev1' => 'Útgáfa 1',
-'compare-rev2' => 'Útgáfa 2',
-'compare-submit' => 'Bera saman',
+'comparepages' => 'Bera saman síður',
+'compare-selector' => 'Bera saman útgáfur síðna',
+'compare-page1' => 'Síða 1',
+'compare-page2' => 'Síða 2',
+'compare-rev1' => 'Útgáfa 1',
+'compare-rev2' => 'Útgáfa 2',
+'compare-submit' => 'Bera saman',
+'compare-invalid-title' => 'Titillinn sem þú gafst upp er ógildur.',
+'compare-title-not-exists' => 'Umbeðinn titill er ekki til.',
+'compare-revision-not-exists' => 'Umbeðin útgáfa er ekki til.',
# Database error messages
'dberr-header' => 'Vandamál við þennan wiki',
@@ -3472,4 +3532,88 @@ Tæknilegir örðugleikar eru á þessari síðu.',
'sqlite-has-fts' => '$1 með fullum texta leitar stuðningi',
'sqlite-no-fts' => '$1 án fullum texta leitar stuðningi',
+# New logging system
+'logentry-delete-delete' => '$1 eyddi síðunni $3',
+'logentry-delete-restore' => '$1 endurvakti $3',
+'logentry-delete-event' => '$1 breytti sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-delete-revision' => '$1 breytti sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-delete-event-legacy' => '$1 breytti sýnileika færslna á $3',
+'logentry-delete-revision-legacy' => '$1 breytti sýnileika útgáfna á $3',
+'logentry-suppress-delete' => '$1 bældi niður síðuna $3',
+'logentry-suppress-event' => '$1 breytti leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-suppress-revision' => '$1 breytti leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-suppress-event-legacy' => '$1 breytti leynilega sýnileika færslna á $3',
+'logentry-suppress-revision-legacy' => '$1 breytti leynilega sýnileika útgáfna á $3',
+'revdelete-content-hid' => 'efni falið',
+'revdelete-summary-hid' => 'breytingarágrip falið',
+'revdelete-uname-hid' => 'notandanafn falið',
+'revdelete-content-unhid' => 'efni birt',
+'revdelete-summary-unhid' => 'breytingarágrip birt',
+'revdelete-uname-unhid' => 'notandanafn birt',
+'revdelete-restricted' => 'hömlur settar á stjórnendur',
+'revdelete-unrestricted' => 'fjarlægja hömlur á stjórnendur',
+'logentry-move-move' => '$1 færði $3 á $4',
+'logentry-move-move-noredirect' => '$1 færði $3 á $4 án þess að skilja eftir tilvísun',
+'logentry-move-move_redir' => '$1 færði $3 á $4 yfir tilvísun',
+'logentry-move-move_redir-noredirect' => '$1 færði $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
+'logentry-patrol-patrol' => '$1 merkti útgáfu $3 frá $4 sem yfirfarna',
+'logentry-patrol-patrol-auto' => '$1 merkti sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
+'logentry-newusers-newusers' => '$1 stofnaði notanda aðgang',
+'logentry-newusers-create' => '$1 stofnaði notanda aðgang',
+'logentry-newusers-create2' => '$1 stofnaði aðganginn $3',
+'logentry-newusers-autocreate' => 'Aðgangurinn $1 var stofnaður sjálfvirkt',
+'newuserlog-byemail' => 'lykilorð sent með tölvupósti',
+
+# Feedback
+'feedback-bugornote' => 'Ef þú ert reiðubúinn að lýsa tæknilegri villu í smáatriðum, vinsamlegast [$1 tilkynntu villu].
+Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemdin þín verður bætt við síðuna "[$3 $2]" ásamt notendanafni og nafni vafrarans sem þú ert að nota.',
+'feedback-subject' => 'Fyrirsögn:',
+'feedback-message' => 'Skilaboð:',
+'feedback-cancel' => 'Hætta við',
+'feedback-submit' => 'Senda svörun',
+'feedback-adding' => 'Bæti við svörun á síðuna...',
+'feedback-error1' => 'Villa: Óþekkt útkoma frá API',
+'feedback-error2' => 'Villa: Breytingin mistókst',
+'feedback-error3' => 'Villa: Ekkert svar frá API',
+'feedback-thanks' => 'Takk! Ãbendingu þinni hefur verið bætt við á síðuna "[$2 $1]".',
+'feedback-close' => 'Búið',
+'feedback-bugcheck' => 'Frábært! Athugaðu hvort þessi villa hafi verið [$1 tilkynnt áður].',
+'feedback-bugnew' => 'Ég athugaði það. Tilkynna nýja villu.',
+
+# API errors
+'api-error-badaccess-groups' => 'Þú hefur ekki leyfi til að hlaða inn skrám.',
+'api-error-badtoken' => 'Innri villa: Skemmdur tóki.',
+'api-error-copyuploaddisabled' => 'Ekki er hægt að hlaða upp með vefslóð á þessum vefþjón.',
+'api-error-duplicate' => 'Það {{PLURAL:$1|er [$2 önnur skrá]|eru[$2 aðrar skrár]}} þegar til á vefsvæðinu sem hafa sama innihald.',
+'api-error-duplicate-archive' => 'Það {{PLURAL:$1|var [$2 önnur skrá]|voru [$2 aðrar skrár]}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.',
+'api-error-duplicate-archive-popup-title' => 'Eins {{PLURAL:$1|skrá|skrár}} sem {{PLURAL:$1|hefur|hafa}} þegar verið eytt.',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Afrituð skrá|Afritaðar skrár}}',
+'api-error-empty-file' => 'Skráin sem þú valdir er tóm.',
+'api-error-fetchfileerror' => 'Innri villa: Mistókst að sækja skránna.',
+'api-error-file-too-large' => 'Skráin sem þú valdir er of stór.',
+'api-error-filename-tooshort' => 'Skráarnafnið er of stutt',
+'api-error-filetype-banned' => 'Þessi gerð skráar er bönnuð.',
+'api-error-filetype-missing' => 'Skráin hefur enga skráarendingu.',
+'api-error-hookaborted' => 'Hætt var við breytinguna sem þú reyndir að gera af viðbótar haka.',
+'api-error-http' => 'Innri villa: Get ekki tengst vefþjón.',
+'api-error-illegal-filename' => 'Þetta skráarnafn er ekki leyft.',
+'api-error-internal-error' => 'Innri villa: Mistókst að vinna úr upphali þínu.',
+'api-error-invalid-file-key' => 'Innri villa: Skrá fannst ekki í tímabundinni geymslu.',
+'api-error-missingparam' => 'Innri villa: Breytur vantar í beiðni.',
+'api-error-missingresult' => 'Innri villa: Gat ekki ákvarðað hvort tókst að afrita.',
+'api-error-mustbeloggedin' => 'Þú verður að vera skráður inn til að hlaða inn skrám.',
+'api-error-mustbeposted' => 'Innri villa: Beiðnin þarfnast HTTP POST.',
+'api-error-noimageinfo' => 'Upphleðsla skráarinnar tókst, en vefþjónninn gaf okkur engar upplýsingar um skránna.',
+'api-error-nomodule' => 'Innri villa: Engin upphlaðs eining valin.',
+'api-error-ok-but-empty' => 'Innri villa: ekkert svar frá vefþjón.',
+'api-error-overwrite' => 'Óheimilt er að skrifa yfir skrá sem er þegar til.',
+'api-error-stashfailed' => 'Innri villa: Vefþjónninn gat ekki geymt tímabundna skrá.',
+'api-error-timeout' => 'Vefþjónninn svaraði ekki á tilætluðum tíma.',
+'api-error-unclassified' => 'Óþekkt villa kom upp.',
+'api-error-unknown-code' => 'Óþekkt villa: "$1"',
+'api-error-unknown-error' => 'Innri villa: Eitthvað fór úrskeiðis þegar að skráinni þinni var hlaðið inn.',
+'api-error-unknown-warning' => 'Óþekkt viðvörun: $1',
+'api-error-uploaddisabled' => 'Ekki er leyft að hlaða inn á þessum wiki.',
+'api-error-verification-error' => 'Þessi skrá gæti verið skemmd, eða með vitlausa skráarendingu.',
+
);
diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php
index 96ee453c..2a6d2078 100644
--- a/languages/messages/MessagesIt.php
+++ b/languages/messages/MessagesIt.php
@@ -11,6 +11,7 @@
* @author Airon90
* @author Amire80
* @author Andria
+ * @author Aushulz
* @author Beta16
* @author Blaisorblade
* @author Broc
@@ -57,6 +58,7 @@
* @author Vajotwo
* @author Valepert
* @author Xpensive
+ * @author ZioNicco
* @author לערי ריינה×רט
*/
@@ -84,7 +86,7 @@ $namespaceAliases = array(
'Discussioni_immagine' => NS_FILE_TALK,
);
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$dateFormats = array(
'mdy time' => 'H:i',
@@ -105,6 +107,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Messaggi' ),
'Allpages' => array( 'TutteLePagine' ),
'Ancientpages' => array( 'PagineMenoRecenti' ),
+ 'Badtitle' => array( 'TitoloErrato' ),
'Blankpage' => array( 'PaginaVuota' ),
'Block' => array( 'Blocca' ),
'Blockme' => array( 'BloccaProxy' ),
@@ -118,8 +121,9 @@ $specialPageAliases = array(
'CreateAccount' => array( 'CreaAccount' ),
'Deadendpages' => array( 'PagineSenzaUscita' ),
'DeletedContributions' => array( 'ContributiCancellati' ),
- 'Disambiguations' => array( 'Disambigue' ),
+ 'Disambiguations' => array( 'Disambigua', 'Disambigue' ),
'DoubleRedirects' => array( 'RedirectDoppi' ),
+ 'EditWatchlist' => array( 'ModifcaListaSeguiti' ),
'Emailuser' => array( 'InviaEMail' ),
'Export' => array( 'Esporta' ),
'Fewestrevisions' => array( 'PagineConMenoRevisioni' ),
@@ -151,6 +155,7 @@ $specialPageAliases = array(
'Mycontributions' => array( 'MieiContributi' ),
'Mypage' => array( 'MiaPaginaUtente', 'MiaPagina' ),
'Mytalk' => array( 'MieDiscussioni' ),
+ 'Myuploads' => array( 'MieiUpload' ),
'Newimages' => array( 'ImmaginiRecenti' ),
'Newpages' => array( 'PaginePiùRecenti' ),
'PasswordReset' => array( 'ReimpostaPassword' ),
@@ -195,59 +200,59 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'MESECORRENTE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'NOMEMESECORRENTE', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NOMEMESECORRENTEGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'MESECORRENTEABBREV', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'GIORNOCORRENTE', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'GIORNOCORRENTE2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMEGIORNOCORRENTE', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANNOCORRENTE', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ORARIOATTUALE', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORACORRENTE', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MESELOCALE', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'NOMEMESELOCALE', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'NOMEMESELOCALEGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'MESELOCALEABBREV', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'GIORNOLOCALE', 'LOCALDAY' ),
- 'localday2' => array( '1', 'GIORNOLOCALE2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMEGIORNOLOCALE', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANNOLOCALE', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ORARIOLOCALE', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ORALOCALE', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMEROPAGINE', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMEROARTICOLI', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMEROFILE', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMEROUTENTI', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NUMEROUTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NUMEROEDIT', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NUMEROVISITE', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'TITOLOPAGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'TITOLOPAGINAE', 'PAGENAMEE' ),
- 'subpagename' => array( '1', 'NOMESOTTOPAGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOMESOTTOPAGINAE', 'SUBPAGENAMEE' ),
- 'subst' => array( '0', 'SOST:', 'SUBST:' ),
- 'img_right' => array( '1', 'destra', 'right' ),
- 'img_left' => array( '1', 'sinistra', 'left' ),
- 'img_none' => array( '1', 'nessuno', 'none' ),
- 'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'bordo', 'border' ),
- 'sitename' => array( '1', 'NOMESITO', 'SITENAME' ),
- 'servername' => array( '0', 'NOMESERVER', 'SERVERNAME' ),
- 'gender' => array( '0', 'GENERE:', 'GENDER:' ),
- 'currentweek' => array( '1', 'SETTIMANACORRENTE', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'SETTIMANALOCALE', 'LOCALWEEK' ),
- 'plural' => array( '0', 'PLURALE:', 'PLURAL:' ),
- 'language' => array( '0', '#LINGUA', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'NUMEROADMIN', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'speciale', 'special' ),
- 'pagesincategory' => array( '1', 'PAGINEINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'DIMENSIONEPAGINA', 'PESOPAGINA', 'PAGESIZE' ),
- 'index' => array( '1', '__INDICE__', '__INDEX__' ),
- 'noindex' => array( '1', '__NOINDICE__', '__NOINDEX__' ),
- 'protectionlevel' => array( '1', 'LIVELLOPROTEZIONE', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
+ 'currentmonth' => array( '1', 'MESECORRENTE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'NOMEMESECORRENTE', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NOMEMESECORRENTEGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'MESECORRENTEABBREV', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'GIORNOCORRENTE', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'GIORNOCORRENTE2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMEGIORNOCORRENTE', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANNOCORRENTE', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ORARIOATTUALE', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORACORRENTE', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MESELOCALE', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'NOMEMESELOCALE', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'NOMEMESELOCALEGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'MESELOCALEABBREV', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'GIORNOLOCALE', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'GIORNOLOCALE2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMEGIORNOLOCALE', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANNOLOCALE', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ORARIOLOCALE', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ORALOCALE', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMEROPAGINE', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMEROARTICOLI', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMEROFILE', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMEROUTENTI', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NUMEROUTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NUMEROEDIT', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NUMEROVISITE', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'TITOLOPAGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'TITOLOPAGINAE', 'PAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOMESOTTOPAGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOMESOTTOPAGINAE', 'SUBPAGENAMEE' ),
+ 'subst' => array( '0', 'SOST:', 'SUBST:' ),
+ 'img_right' => array( '1', 'destra', 'right' ),
+ 'img_left' => array( '1', 'sinistra', 'left' ),
+ 'img_none' => array( '1', 'nessuno', 'none' ),
+ 'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'bordo', 'border' ),
+ 'sitename' => array( '1', 'NOMESITO', 'SITENAME' ),
+ 'servername' => array( '0', 'NOMESERVER', 'SERVERNAME' ),
+ 'gender' => array( '0', 'GENERE:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'SETTIMANACORRENTE', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'SETTIMANALOCALE', 'LOCALWEEK' ),
+ 'plural' => array( '0', 'PLURALE:', 'PLURAL:' ),
+ 'language' => array( '0', '#LINGUA', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'NUMEROADMIN', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'speciale', 'special' ),
+ 'pagesincategory' => array( '1', 'PAGINEINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'DIMENSIONEPAGINA', 'PESOPAGINA', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDICE__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NOINDICE__', '__NOINDEX__' ),
+ 'protectionlevel' => array( '1', 'LIVELLOPROTEZIONE', 'PROTECTIONLEVEL' ),
);
$linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
@@ -611,20 +616,22 @@ Si prega di segnalare l\'accaduto a un [[Special:ListUsers/sysop|amministratore]
'badarticleerror' => 'Operazione non consentita per questa pagina.',
'cannotdelete' => 'Non è stato possibile cancellare il file "$1".
Potrebbe essere stato già cancellato da qualcun altro.',
+'cannotdelete-title' => 'Impossibile eliminare la pagina "$1"',
'badtitle' => 'Titolo non corretto',
'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato o con caratteri non ammessi oppure deriva da un errore nei collegamenti tra siti wiki diversi o versioni in lingue diverse dello stesso sito.',
-'perfcached' => "I dati che seguono sono estratti da una copia ''cache'' del database, non aggiornati in tempo reale.",
-'perfcachedts' => "I dati che seguono sono estratti da una copia ''cache'' del database. Ultimo aggiornamento: $1.",
+'perfcached' => "I dati che seguono sono estratti da una copia ''cache'' del database, e potrebbero non essere aggiornati. Un massimo di {{PLURAL:$1|un risultato è disponibile|$1 risultati sono disponibili}} in cache.",
+'perfcachedts' => "I dati che seguono sono estratti da una copia ''cache'' del database, il cui ultimo aggiornamento risale al $1. Un massimo di {{PLURAL:$4|un risultato è disponibile|$4 risultati sono disponibili}} in cache.",
'querypage-no-updates' => 'Gli aggiornamenti della pagina sono temporaneamente sospesi. I dati in essa contenuti non verranno aggiornati.',
'wrong_wfQuery_params' => 'Errore nei parametri inviati alla funzione wfQuery()<br />
Funzione: $1<br />
Query: $2',
'viewsource' => 'Visualizza sorgente',
-'viewsourcefor' => 'di $1',
+'viewsource-title' => 'Visualizza sorgente di $1',
'actionthrottled' => 'Azione ritardata',
'actionthrottledtext' => "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che in questo caso è stato superato. Si prega di riprovare tra qualche minuto.",
'protectedpagetext' => 'Questa pagina è stata protetta per impedirne la modifica.',
'viewsourcetext' => 'È possibile visualizzare e copiare il codice sorgente di questa pagina:',
+'viewyourtext' => "È possibile visualizzare e copiare il codice sorgente delle '''tue modifiche''' a questa pagina:",
'protectedinterface' => "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software; è quindi protetta per evitare possibili abusi.",
'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.
Per le traduzioni, considera la possibilità di usare [//translatewiki.net/wiki/Main_Page?setlang=it translatewiki.net], il progetto MediaWiki per la localizzazione.",
@@ -719,6 +726,7 @@ Perciò, gli utenti che usano questo indirizzo IP non possono creare altri accou
'noemailprefs' => 'Indicare un indirizzo e-mail per attivare queste funzioni.',
'emailconfirmlink' => 'Confermare il proprio indirizzo e-mail',
'invalidemailaddress' => "L'indirizzo e-mail indicato ha un formato non valido. Inserire un indirizzo valido o svuotare la casella.",
+'cannotchangeemail' => 'Gli indirizzi e-mail non possono essere modificati in questo wiki.',
'accountcreated' => 'Accesso creato',
'accountcreatedtext' => "È stato creato un accesso per l'utente $1.",
'createaccount-title' => 'Creazione di un accesso a {{SITENAME}}',
@@ -735,6 +743,7 @@ Riprovare più tardi.',
# E-mail sending
'php-mail-error-unknown' => 'Errore sconosciuto nella funzione PHP mail()',
+'user-mail-no-addy' => 'Hai cercato di inviare una e-mail senza un indirizzo.',
# Change password dialog
'resetpass' => 'Cambia la password',
@@ -755,16 +764,18 @@ La password potrebbe essere stata già cambiata, oppure potrebbe essere stata ri
'resetpass-temp-password' => 'Password temporanea:',
# Special:PasswordReset
-'passwordreset' => 'Reimposta password',
-'passwordreset-text' => 'Completa questo modulo per ricevere i dettagli del tuo account via e-mail.',
-'passwordreset-legend' => 'Reimposta password',
-'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Immetti una delle porzioni di dati qui sotto}}',
-'passwordreset-username' => 'Nome utente:',
-'passwordreset-domain' => 'Dominio:',
-'passwordreset-email' => 'Indirizzo e-mail:',
-'passwordreset-emailtitle' => 'Dettagli account su {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo e-mail sono:
+'passwordreset' => 'Reimposta password',
+'passwordreset-text' => 'Completa questo modulo per ricevere i dettagli del tuo account via e-mail.',
+'passwordreset-legend' => 'Reimposta password',
+'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
+'passwordreset-pretext' => '{{PLURAL:$1||Immetti una delle porzioni di dati qui sotto}}',
+'passwordreset-username' => 'Nome utente:',
+'passwordreset-domain' => 'Dominio:',
+'passwordreset-capture' => 'Visualizzare il contenuto del messaggio e-mail?',
+'passwordreset-capture-help' => "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
+'passwordreset-email' => 'Indirizzo e-mail:',
+'passwordreset-emailtitle' => 'Dettagli account su {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo e-mail sono:
$2
@@ -772,7 +783,7 @@ $2
Dovresti accedere e scegliere una nuova password ora.
Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
-'passwordreset-emailtext-user' => "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo e-mail sono:
+'passwordreset-emailtext-user' => "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo e-mail sono:
$2
@@ -780,9 +791,22 @@ $2
Dovresti accedere e scegliere una nuova password ora.
Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
-'passwordreset-emailelement' => 'Nome utente: $1
+'passwordreset-emailelement' => 'Nome utente: $1
Password temporanea: $2',
-'passwordreset-emailsent' => 'È stata inviata una e-mail di promemoria.',
+'passwordreset-emailsent' => 'È stata inviata una e-mail di promemoria.',
+'passwordreset-emailsent-capture' => "E' stato inviato un e-mail promemoria, il contenuto è riportato di seguito.",
+'passwordreset-emailerror-capture' => "E' stata generata l'e-mail promemoria riportata di seguito. L'invio all'utente non è riuscito: $1",
+
+# Special:ChangeEmail
+'changeemail' => "Modifica l'indirizzo e-mail",
+'changeemail-header' => "Modifica l'indirizzo e-mail dell'account",
+'changeemail-text' => 'Completa questo modulo per cambiare il tuo indirizzo e-mail. Sarà necessario inserire la password per confermare la modifica.',
+'changeemail-no-info' => "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
+'changeemail-oldemail' => 'Indirizzo e-mail attuale:',
+'changeemail-newemail' => 'Nuovo indirizzo e-mail:',
+'changeemail-none' => '(nessuno)',
+'changeemail-submit' => 'Modifica e-mail',
+'changeemail-cancel' => 'Annulla',
# Edit page toolbar
'bold_sample' => 'Grassetto',
@@ -852,9 +876,6 @@ Si noti che la funzione 'Scrivi all'utente' non è attiva se non è stato regist
L'indirizzo IP attuale è $3, il numero ID del blocco è #$5
Si prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
'blockednoreason' => 'nessuna motivazione indicata',
-'blockedoriginalsource' => "Di seguito viene mostrato il codice sorgente della pagina '''$1''':",
-'blockededitsource' => "Di seguito vengono mostrate le '''modifiche apportate''' alla pagina '''$1''':",
-'whitelistedittitle' => 'Accesso necessario per la modifica delle pagine',
'whitelistedittext' => 'Per modificare le pagine è necessario $1.',
'confirmedittext' => "Per essere abilitati alla modifica delle pagine è necessario confermare il proprio indirizzo e-mail. Per impostare e confermare l'indirizzo servirsi delle [[Special:Preferences|preferenze]].",
'nosuchsectiontitle' => 'Impossibile trovare la sezione',
@@ -928,7 +949,8 @@ Inviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scri
Se non desideri che i tuoi testi possano essere alterati, non inviarli qui.<br />
Inviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scritto da te personalmente oppure è stato copiato da una fonte di pubblico dominio o similarmente libera (vedi $1 per maggiori dettagli).
'''Non inviare materiale protetto da copyright senza autorizzazione!'''",
-'longpageerror' => "'''ERRORE: Il testo inviato è lungo $1 kilobyte, più della dimensione massima consentita ($2 kilobyte). Il testo non può essere salvato.'''",
+'longpageerror' => "'''Errore: il testo inviato è lungo {{PLURAL:$1|1|$1}} kilobyte, che è maggiore della dimensione massima consentita ({{PLURAL:$2|1|$2}} kilobyte).'''
+Il testo non può essere salvato.",
'readonlywarning' => "'''ATTENZIONE: Il database è stato bloccato per manutenzione, è quindi impossibile salvare le modifiche in questo momento. Per non perderle, è possibile copiare quanto inserito finora nella casella di modifica, incollarlo in un programma di elaborazione testi e salvarlo in attesa dello sblocco del database.'''
L'amministratore che ha bloccato il database ha fornito questa spiegazione: $1",
@@ -1090,8 +1112,6 @@ Gli altri amministratori di {{SITENAME}} potranno accedere comunque ai contenuti
'revdelete-unsuppress' => 'Elimina le limitazioni sulle revisioni ripristinate',
'revdelete-log' => 'Motivo:',
'revdelete-submit' => 'Applica {{PLURAL:$1|alla revisione selezionata|alle revisioni selezionate}}',
-'revdelete-logentry' => 'ha modificato la visibilità per le revisioni di [[$1]]',
-'logdelete-logentry' => "ha modificato la visibilità dell'evento [[$1]]",
'revdelete-success' => "'''Visibilità della revisione aggiornata correttamente.'''",
'revdelete-failure' => "'''La visibilità della versione non può essere aggiornata:'''
$1",
@@ -1103,15 +1123,6 @@ $1",
'revdel-restore-visible' => 'revisioni visibili',
'pagehist' => 'Cronologia della pagina',
'deletedhist' => 'Cronologia cancellata',
-'revdelete-content' => 'contenuto',
-'revdelete-summary' => 'oggetto della modifica',
-'revdelete-uname' => 'nome utente',
-'revdelete-restricted' => 'limitazioni ai soli amministratori attivate',
-'revdelete-unrestricted' => 'limitazioni ai soli amministratori rimosse',
-'revdelete-hid' => 'nascosto $1',
-'revdelete-unhid' => 'rendi visibile $1',
-'revdelete-log-message' => '$1 per $2 {{PLURAL:$2|revisione|revisioni}}',
-'logdelete-log-message' => '$1 per $2 {{PLURAL:$2|evento|eventi}}',
'revdelete-hide-current' => "Impossibile nascondere l'oggetto con data $1 $2 in quanto è la revisione corrente.",
'revdelete-show-no-access' => 'Impossibile mostrare l\'oggetto con data $1 $2 in quanto è stato identificato come "riservato" e non si dispone del relativo accesso.',
'revdelete-modify-no-access' => 'Impossibile modificare l\'oggetto con data $1 $2 in quanto è stato identificato come "riservato" e non si dispone del relativo accesso.',
@@ -1261,12 +1272,14 @@ $1",
'prefs-rc' => 'Ultime modifiche',
'prefs-watchlist' => 'Osservati speciali',
'prefs-watchlist-days' => 'Numero di giorni da mostrare negli osservati speciali:',
-'prefs-watchlist-days-max' => 'Massimo 7 giorni',
+'prefs-watchlist-days-max' => 'Massimo $1 {{PLURAL:$1|giorno|giorni}}',
'prefs-watchlist-edits' => 'Numero di modifiche da mostrare con le funzioni avanzate:',
'prefs-watchlist-edits-max' => 'Numero massimo: 1000',
'prefs-watchlist-token' => 'Token Osservati speciali:',
'prefs-misc' => 'Varie',
'prefs-resetpass' => 'Cambia password',
+'prefs-changeemail' => 'Modifica e-mail',
+'prefs-setemail' => 'Imposta un indirizzo e-mail',
'prefs-email' => 'Opzioni email',
'prefs-rendering' => 'Aspetto',
'saveprefs' => 'Salva le preferenze',
@@ -1324,6 +1337,7 @@ L'operazione non può essere annullata.",
'yourrealname' => 'Nome vero:',
'yourlanguage' => "Lingua dell'interfaccia:",
'yourvariant' => 'Variante della lingua:',
+'prefs-help-variant' => 'La variante o grafia in cui preferisci che le pagine del wiki ti siano mostrate.',
'yournick' => 'Soprannome (nickname):',
'prefs-help-signature' => 'I commenti nelle pagine di discussione devono essere firmati con "<nowiki>~~~~</nowiki>" che verrà convertito nella propria firma seguita dalla data.',
'badsig' => 'Errore nella firma non standard, verificare i tag HTML.',
@@ -1363,7 +1377,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'userrights-lookup-user' => 'Gestione dei gruppi utente',
'userrights-user-editname' => 'Inserire il nome utente:',
'editusergroup' => 'Modifica gruppi utente',
-'editinguser' => "Modifica dei diritti assegnati all'utente '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modifica diritti utente dell'utente '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Modifica gruppi utente',
'saveusergroups' => 'Salva gruppi utente',
'userrights-groupsmember' => 'Appartiene ai gruppi:',
@@ -1457,13 +1471,13 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'right-autopatrol' => 'Segna automaticamente le proprie modifiche come verificate',
'right-patrolmarks' => 'Usa la funzione di verifica delle ultime modifiche',
'right-unwatchedpages' => 'Visualizza una lista di pagine non osservate',
-'right-trackback' => 'Invia un trackback',
'right-mergehistory' => 'Fonde la cronologia delle pagine',
'right-userrights' => "Modifica tutti i diritti dell'utente",
'right-userrights-interwiki' => 'Modifica i diritti degli utenti di altre wiki',
'right-siteadmin' => 'Blocca e sblocca il database',
'right-override-export-depth' => 'Esporta le pagine includendo le pagine collegate fino ad una profondità di 5',
'right-sendemail' => 'Invia e-mail ad altri utenti',
+'right-passwordreset' => 'Vede i messaggi di reimpostazione della password',
# User rights log
'rightslog' => 'Diritti degli utenti',
@@ -1497,16 +1511,17 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'action-suppressionlog' => 'visionare questo log privato',
'action-block' => 'bloccare questo utente in scrittura',
'action-protect' => 'modificare i livelli di protezione per questa pagina',
+'action-rollback' => "Annullamento rapido delle modifiche dell'ultimo utente che ha modificato una determinata pagina",
'action-import' => "importare questa pagina da un'altra wiki",
'action-importupload' => 'importare questa pagina tramite upload da file',
'action-patrol' => 'segnare le modifiche degli altri utenti come verificate',
'action-autopatrol' => 'segnare le proprie modifiche come verificate',
'action-unwatchedpages' => 'visionare la lista di pagine non osservate',
-'action-trackback' => 'inviare una trackback',
'action-mergehistory' => 'unire la cronologia di questa pagina',
'action-userrights' => 'modificare tutti i diritti degli utenti',
'action-userrights-interwiki' => 'modificare i diritti degli utenti su altre wiki',
'action-siteadmin' => 'bloccare e sbloccare il database',
+'action-sendemail' => 'inviare e-mail',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modifica|modifiche}}',
@@ -1538,6 +1553,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'number_of_watching_users_pageview' => '[osservata da {{PLURAL:$1|un utente|$1 utenti}}]',
'rc_categories' => 'Limita alle categorie (separate da "|")',
'rc_categories_any' => 'Qualsiasi',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} dopo la modifica',
'newsectionsummary' => '/* $1 */ nuova sezione',
'rc-enhanced-expand' => 'Mostra dettagli (richiede JavaScript)',
'rc-enhanced-hide' => 'Nascondi dettagli',
@@ -1589,6 +1605,7 @@ Consultare la [[Special:NewFiles|galleria dei nuovi file]] per una visione d'ins
'ignorewarnings' => 'Ignora i messaggi di avvertimento del sistema',
'minlength1' => "Il nome del file dev'essere composto da almeno un carattere.",
'illegalfilename' => 'Il nome "$1" contiene dei caratteri non ammessi nei titoli delle pagine. Dare al file un nome diverso e provare a caricarlo di nuovo.',
+'filename-toolong' => 'I nomi dei file non possono superare i 240 byte.',
'badfilename' => 'Il nome del file è stato convertito in "$1".',
'filetype-mime-mismatch' => 'L\'estensione del file ".$1" non corrisponde al tipo MIME rilevato dal file ($2).',
'filetype-badmime' => 'Non è consentito caricare file di tipo MIME "$1".',
@@ -1686,6 +1703,41 @@ $1',
'upload-unknown-size' => 'Dimensione sconosciuta',
'upload-http-error' => 'Si è verificato un errore HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Impossibile trasmettere il file $1.',
+'backend-fail-backup' => 'Impossibile eseguire il backup del file $1 .',
+'backend-fail-notexists' => 'Il file $1 non esiste.',
+'backend-fail-hashes' => 'Impossibile ottenere hash dei file per confronto.',
+'backend-fail-notsame' => 'Esiste già un file non identico a $1 .',
+'backend-fail-invalidpath' => '$1 non è un percorso di archiviazione valido.',
+'backend-fail-delete' => 'Impossibile eliminare il file $1 .',
+'backend-fail-alreadyexists' => 'Il file $1 esiste già.',
+'backend-fail-store' => 'Impossibilie memorizzare file $1 in $2 .',
+'backend-fail-copy' => 'Impossibile copiare il file $1 in $2 .',
+'backend-fail-move' => 'Impossibile spostare file $1 in $2 .',
+'backend-fail-opentemp' => 'Impossibile aprire il file temporaneo.',
+'backend-fail-writetemp' => 'Impossibile creare il file temporaneo.',
+'backend-fail-closetemp' => 'Impossibile chiudere il file temporaneo.',
+'backend-fail-read' => 'Impossibile leggere il file $1 .',
+'backend-fail-create' => 'Impossibile creare il file $1 .',
+'backend-fail-readonly' => 'Il backend "$1" è attualmente di sola lettura. La ragione indicata è: "$2"',
+'backend-fail-synced' => 'Il file "$1" è in uno stato non coerente nei backend di memoria interna.',
+'backend-fail-connect' => 'Impossibile connettersi al backend di memoria "$1".',
+'backend-fail-internal' => 'Si è verificato un errore sconosciuto nel backend di memoria "$1".',
+'backend-fail-contenttype' => 'Impossibile determinare la tipologia del file da archiviare in "$1".',
+'backend-fail-batchsize' => 'Il backend di memoria ha programmato una serie di $1 {{PLURAL:$1|operazione|operazioni}} su file; il limite è di $2 {{PLURAL:$2|operazione|operazioni}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Impossibile sbloccare "$1"; non è bloccato.',
+'lockmanager-fail-closelock' => 'Non riuscita chiusura del file di blocco per "$1".',
+'lockmanager-fail-deletelock' => 'Non riuscita cancellazione del file di blocco per "$1".',
+'lockmanager-fail-acquirelock' => 'Non riuscita acquisizione blocco per "$1".',
+'lockmanager-fail-openlock' => 'Non riuscita apertura del file di blocco per "$1".',
+'lockmanager-fail-releaselock' => 'Non riuscito rilascio del blocco per "$1".',
+'lockmanager-fail-db-bucket' => 'Impossibile contattare i necessari database di blocco nel bucket $1.',
+'lockmanager-fail-db-release' => 'Impossibile revocare i blocchi sul database $1.',
+'lockmanager-fail-svr-release' => 'Impossibile revocare i blocchi sul server $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => "Si è verificato un errore durante l'apertura del file per i controlli ZIP.",
'zip-wrong-format' => 'Il file specificato non è un file ZIP.',
@@ -1702,6 +1754,7 @@ Non può essere adeguatamente controllato per la sicurezza.',
'uploadstash-badtoken' => 'Questa azione non ha avuto successo, forse perché le tue credenziali di modifica sono scadute. Prova ancora.',
'uploadstash-errclear' => 'La cancellazione dei file non ha avuto successo.',
'uploadstash-refresh' => "Aggiorna l'elenco dei file",
+'invalid-chunk-offset' => 'Offset della parte non valido.',
# img_auth script messages
'img-auth-accessdenied' => 'Accesso negato',
@@ -1808,23 +1861,24 @@ Di seguito viene mostrata la descrizione presente nella [$2 pagina di descrizion
'filerevert-badversion' => 'Non esistono versioni locali precedenti del file con il timestamp richiesto.',
# File deletion
-'filedelete' => 'Cancella $1',
-'filedelete-legend' => 'Cancella il file',
-'filedelete-intro' => "Stai per cancellare il file '''[[Media:$1|$1]]''' con tutta la sua cronologia.",
-'filedelete-intro-old' => "Stai cancellando la versione di '''[[Media:$1|$1]]''' del [$4 $2, $3].",
-'filedelete-comment' => 'Motivo:',
-'filedelete-submit' => 'Cancella',
-'filedelete-success' => "Il file '''$1''' è stato cancellato.",
-'filedelete-success-old' => "La versione del file '''[[Media:$1|$1]]''' del $2, $3 è stata cancellata.",
-'filedelete-nofile' => "Non esiste un file '''$1'''.",
-'filedelete-nofile-old' => "In archivio non ci sono versioni di '''$1''' con le caratteristiche indicate",
-'filedelete-otherreason' => 'Altra motivazione o motivazione aggiuntiva:',
-'filedelete-reason-otherlist' => 'Altra motivazione',
-'filedelete-reason-dropdown' => '*Motivazioni più comuni per la cancellazione
+'filedelete' => 'Cancella $1',
+'filedelete-legend' => 'Cancella il file',
+'filedelete-intro' => "Stai per cancellare il file '''[[Media:$1|$1]]''' con tutta la sua cronologia.",
+'filedelete-intro-old' => "Stai cancellando la versione di '''[[Media:$1|$1]]''' del [$4 $2, $3].",
+'filedelete-comment' => 'Motivo:',
+'filedelete-submit' => 'Cancella',
+'filedelete-success' => "Il file '''$1''' è stato cancellato.",
+'filedelete-success-old' => "La versione del file '''[[Media:$1|$1]]''' del $2, $3 è stata cancellata.",
+'filedelete-nofile' => "Non esiste un file '''$1'''.",
+'filedelete-nofile-old' => "In archivio non ci sono versioni di '''$1''' con le caratteristiche indicate",
+'filedelete-otherreason' => 'Altra motivazione o motivazione aggiuntiva:',
+'filedelete-reason-otherlist' => 'Altra motivazione',
+'filedelete-reason-dropdown' => '*Motivazioni più comuni per la cancellazione
** Violazione di copyright
** File duplicato',
-'filedelete-edit-reasonlist' => 'Modifica le motivazioni per la cancellazione',
-'filedelete-maintenance' => 'Cancellazione e recupero di file temporaneamente disattivati durante la manutenzione.',
+'filedelete-edit-reasonlist' => 'Modifica le motivazioni per la cancellazione',
+'filedelete-maintenance' => 'Cancellazione e recupero di file temporaneamente disattivati durante la manutenzione.',
+'filedelete-maintenance-title' => 'Impossibile eliminare il file',
# MIME search
'mimesearch' => 'Ricerca in base al tipo MIME',
@@ -1919,6 +1973,8 @@ I redirect <del>cancellati</del> sono stati corretti.',
'wantedpages' => 'Pagine più richieste',
'wantedpages-badtitle' => 'Titolo non valido nel gruppo di risultati: $1',
'wantedfiles' => 'File richiesti',
+'wantedfiletext-cat' => 'I seguenti file sono richiamati da wikilink, ma non esistono. I file ospitati su repository esterni potrebbero essere elencati anche se di fatto esistenti. Questi falsi positivi saranno <del>barrati</del>. Le pagine che incorporano i file che non esistono sono elencate in [[:$1]].',
+'wantedfiletext-nocat' => 'I seguenti file sono richiamati da wikilink, ma non esistono. I file ospitati su repository esterni potrebbero essere elencati anche se di fatto esistenti. Questi falsi positivi saranno <del>barrati</del>.',
'wantedtemplates' => 'Template richiesti',
'mostlinked' => 'Pagine più richiamate',
'mostlinkedcategories' => 'Categorie più richiamate',
@@ -1927,6 +1983,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
'mostimages' => 'File più richiamati',
'mostrevisions' => 'Voci con più revisioni',
'prefixindex' => 'Indice delle voci per lettere iniziali',
+'prefixindex-namespace' => 'Tutte le pagine con il prefisso del namespace $1',
'shortpages' => 'Pagine più corte',
'longpages' => 'Pagine più lunghe',
'deadendpages' => 'Pagine senza uscita',
@@ -1943,7 +2000,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
'listusers-editsonly' => 'Mostra solo utenti con dei contributi',
'listusers-creationsort' => 'Ordina per data di creazione',
'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
-'usercreated' => 'Creato il $1 alle $2',
+'usercreated' => '{{GENDER:$3|Creato/a}} il $1 alle $2',
'newpages' => 'Pagine più recenti',
'newpages-username' => 'Nome utente:',
'ancientpages' => 'Pagine meno recenti',
@@ -2037,12 +2094,8 @@ Protocolli supportati: <tt>$1</tt> (non aggiungere nessuno di questi nella tua r
'activeusers-noresult' => 'Nessun utente risponde ai criteri impostati.',
# Special:Log/newusers
-'newuserlogpage' => 'Nuovi utenti',
-'newuserlogpagetext' => 'Di seguito sono elencate le utenze di nuova creazione.',
-'newuserlog-byemail' => 'password inviata via mail',
-'newuserlog-create-entry' => "ha appena creato un'utenza",
-'newuserlog-create2-entry' => 'ha registrato il nuovo nome utente $1',
-'newuserlog-autocreate-entry' => "ha creato un'utenza automaticamente",
+'newuserlogpage' => 'Nuovi utenti',
+'newuserlogpagetext' => 'Di seguito sono elencate le utenze di nuova creazione.',
# Special:ListGroupRights
'listgrouprights' => 'Diritti del gruppo utente',
@@ -2070,7 +2123,7 @@ Potrebbero esserci [[{{MediaWiki:Listgrouprights-helppage}}|ulteriori informazio
'emailpage' => "Invia un messaggio e-mail all'utente",
'emailpagetext' => 'Usare il modulo sottostante per inviare un messaggio e-mail all\'utente indicato. L\'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo "Da:" del messaggio per consentire al destinatario di rispondere direttamente.',
'usermailererror' => "L'oggetto mail ha restituito l'errore:",
-'defemailsubject' => 'Messaggio da {{SITENAME}}',
+'defemailsubject' => 'Messaggio da {{SITENAME}} dall\'utente "$1"',
'usermaildisabled' => 'e-mail utente disabilitata',
'usermaildisabledtext' => 'Non è possibile inviare e-mail ad altri utenti su questo wiki',
'noemailtitle' => 'Nessun indirizzo e-mail',
@@ -2126,7 +2179,7 @@ il titolo della pagina apparirà in '''grassetto''' nella pagina delle [[Special
'watchmethod-list' => 'controllo degli osservati speciali per modifiche recenti',
'watchlistcontains' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina|$1 pagine}}.',
'iteminvalidname' => "Problemi con la pagina '$1', nome non valido...",
-'wlnote' => "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le '''$1''' modifiche più recenti apportate}} {{PLURAL:$2|nella scorsa ora|nelle scorse '''$2''' ore}}.",
+'wlnote' => "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le '''$1''' modifiche più recenti apportate}} {{PLURAL:$2|nella scorsa ora|nelle scorse '''$2''' ore}}; i dati sono aggiornati alle $4 del $3.",
'wlshowlast' => 'Mostra le ultime $1 ore $2 giorni $3',
'watchlist-options' => 'Opzioni osservati speciali',
@@ -2189,8 +2242,6 @@ Per commentare e ricevere aiuto:
'actionfailed' => 'Azione fallita',
'deletedtext' => 'La pagina "$1" è stata cancellata.
Consultare il log delle $2 per un elenco delle pagine cancellate di recente.',
-'deletedarticle' => 'ha cancellato "[[$1]]"',
-'suppressedarticle' => 'ha soppresso "[[$1]]"',
'dellogpage' => 'Cancellazioni',
'dellogpagetext' => 'Di seguito sono elencate le pagine cancellate di recente.',
'deletionlog' => 'cancellazioni',
@@ -2233,7 +2284,10 @@ Vedi la [[Special:ProtectedPages|lista delle pagine protette]] per l'elenco dell
'unprotectedarticle' => 'ha sprotetto "[[$1]]"',
'movedarticleprotection' => 'ha spostato la protezione da "[[$2]]" a "[[$1]]"',
'protect-title' => 'Modifica del livello di protezione per "$1"',
+'protect-title-notallowed' => 'Visualizza il livello di protezione di " $1 "',
'prot_1movedto2' => 'ha spostato [[$1]] a [[$2]]',
+'protect-badnamespace-title' => 'Namespace non suscettibile di protezione',
+'protect-badnamespace-text' => 'Le pagine di questo namespace non possono essere protette.',
'protect-legend' => 'Conferma la protezione',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Scadenza:',
@@ -2253,6 +2307,7 @@ Le impostazioni correnti per la pagina sono '''$1''':",
'protect-level-sysop' => 'Solo amministratori',
'protect-summary-cascade' => 'ricorsiva',
'protect-expiring' => 'scadenza: $1 (UTC)',
+'protect-expiring-local' => 'scade il $1',
'protect-expiry-indefinite' => 'infinito',
'protect-cascade' => 'Protezione ricorsiva (estende la protezione a tutte le pagine incluse in questa).',
'protect-cantedit' => 'Non è possibile modificare i livelli di protezione per la pagina in quanto non si dispone dei permessi necessari per modificare la pagina stessa.',
@@ -2309,7 +2364,6 @@ Il testo contenuto nelle revisioni cancellate è disponibile solo agli amministr
'undeletereset' => 'Reimposta',
'undeleteinvert' => 'Inverti selezione',
'undeletecomment' => 'Motivo:',
-'undeletedarticle' => 'ha recuperato "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|Una revisione recuperata|$1 revisioni recuperate}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una revisione|$1 revisioni}} e $2 file recuperati',
'undeletedfiles' => '{{PLURAL:$1|Un file recuperato|$1 file recuperati}}',
@@ -2318,6 +2372,7 @@ Il testo contenuto nelle revisioni cancellate è disponibile solo agli amministr
Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
'undelete-header' => 'Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni più recenti.',
+'undelete-search-title' => 'Ricerca nelle pagine cancellate',
'undelete-search-box' => 'Ricerca nelle pagine cancellate',
'undelete-search-prefix' => 'Mostra le pagine il cui titolo inizia con:',
'undelete-search-submit' => 'Cerca',
@@ -2326,6 +2381,7 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
'undelete-bad-store-key' => 'Impossibile annullare la cancellazione della revisione del file con timestamp $1: file non disponibile prima della cancellazione.',
'undelete-cleanup-error' => 'Errore nella cancellazione del file di archivio non utilizzato "$1".',
'undelete-missing-filearchive' => "Impossibile ripristinare l'ID $1 dell'archivio file in quanto non è presente nel database. Potrebbe essere stato già ripristinato.",
+'undelete-error' => 'Errore nel ripristino della pagina',
'undelete-error-short' => 'Errore nel ripristino del file: $1',
'undelete-error-long' => 'Si sono verificati degli errori nel tentativo di annullare la cancellazione del file:
@@ -2447,6 +2503,7 @@ Sei sicuro di voler continuare?',
'blocklist-userblocks' => 'Nascondi i blocchi degli account',
'blocklist-tempblocks' => 'Nascondi i blocchi temporanei',
'blocklist-addressblocks' => 'Nascondi i blocchi di un solo IP',
+'blocklist-rangeblocks' => 'Nascondi i blocchi di range',
'blocklist-timestamp' => 'Data e ora',
'blocklist-target' => 'Destinazione',
'blocklist-expiry' => 'Scade',
@@ -2469,6 +2526,7 @@ Sei sicuro di voler continuare?',
'unblocklink' => 'sblocca',
'change-blocklink' => 'cambia blocco',
'contribslink' => 'contributi',
+'emaillink' => 'invia e-mail',
'autoblocker' => 'Bloccato automaticamente perché l\'indirizzo IP è condiviso con l\'utente "[[User:$1|$1]]".
Il blocco dell\'utente $1 è stato imposto per il seguente motivo: "$2".',
'blocklogpage' => 'Blocchi',
@@ -2576,9 +2634,6 @@ Scegliere un titolo diverso per la pagina.',
'movepage-page-moved' => 'La pagina $1 è stata spostata a $2.',
'movepage-page-unmoved' => 'La pagina $1 non può essere spostata a $2.',
'movepage-max-pages' => 'È stato spostato il numero massimo di $1 {{PLURAL:$1|pagina|pagine}} e non potranno essere spostate ulteriori pagine automaticamente.',
-'1movedto2' => 'ha spostato [[$1]] a [[$2]]',
-'1movedto2_redir' => 'ha spostato [[$1]] a [[$2]] tramite redirect',
-'move-redirect-suppressed' => 'redirect soppresso',
'movelogpage' => 'Spostamenti',
'movelogpagetext' => 'Di seguito sono elencate le pagine spostate di recente.',
'movesubpage' => '{{PLURAL:$1|Sottopagina|Sottopagine}}',
@@ -2591,7 +2646,7 @@ Scegliere un titolo diverso per la pagina.',
La pagina specificata come destinazione "[[:$1]]" esiste già. Vuoi cancellarla per proseguire con lo spostamento?',
'delete_and_move_confirm' => 'Sì, sovrascrivi la pagina esistente',
-'delete_and_move_reason' => 'Cancellata per rendere possibile lo spostamento',
+'delete_and_move_reason' => 'Cancellata per rendere possibile lo spostamento da "[[$1]]"',
'selfmove' => 'Il nuovo titolo è uguale al vecchio; impossibile spostare la pagina su se stessa.',
'immobile-source-namespace' => 'Non è possibile spostare pagine del namespace "$1"',
'immobile-target-namespace' => 'Non è possibile spostare pagine nel namespace "$1"',
@@ -2620,9 +2675,11 @@ Per favore, scegli un nome diverso.',
Per esportare le pagine indicare i titoli nella casella di testo sottostante, uno per riga, e specificare se si desidera ottenere l'ultima versione e tutte le versioni precedenti, con i dati della cronologia della pagina, oppure soltanto l'ultima versione e i dati corrispondenti all'ultima modifica.
In quest'ultimo caso si può anche utilizzare un collegamento, ad esempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per esportare \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Esporta tutte le pagine',
'exportcuronly' => "Includi solo la revisione attuale, non l'intera cronologia",
'exportnohistory' => "----
'''Nota:''' l'esportazione dell'intera cronologia delle pagine attraverso questa interfaccia è stata disattivata per motivi legati alle prestazioni del sistema.",
+'exportlistauthors' => "Includi l'elenco completo dei contributori per ogni pagina",
'export-submit' => 'Esporta',
'export-addcattext' => 'Aggiungi pagine dalla categoria:',
'export-addcat' => 'Aggiungi',
@@ -2655,6 +2712,8 @@ Visitare [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//tra
'thumbnail_error' => 'Errore nella creazione della miniatura: $1',
'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',
+'thumbnail-dest-create' => 'Impossibile salvare la miniatura nella destinazione',
'thumbnail_invalid_params' => 'Parametri miniatura non corretti',
'thumbnail_dest_directory' => 'Impossibile creare la directory di destinazione',
'thumbnail_image-type' => 'Tipo di immagine non supportato',
@@ -2698,6 +2757,11 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'import-upload' => 'Carica dati XML',
'import-token-mismatch' => 'I dati relativi alla sessione sono andati persi. Riprovare.',
'import-invalid-interwiki' => 'Impossibile importare dal progetto wiki indicato.',
+'import-error-edit' => 'La pagina "$1" non è stata importata poiché non sei autorizzato a modificarla.',
+'import-error-create' => 'La pagina "$1" non è stata importata poiché non sei autorizzato a crearla.',
+'import-error-interwiki' => 'La pagina "$1" non viene importata perché il suo nome è riservato per il collegamento esterno (interwiki).',
+'import-error-special' => 'La pagina "$1" non viene importata perché appartiene a un namespace speciale che non permette pagine.',
+'import-error-invalid' => 'La pagina "$1" non viene importata perché il suo nome non è valido.',
# Import log
'importlogpage' => 'Importazioni',
@@ -2707,72 +2771,85 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'import-logentry-interwiki' => 'ha trasferito da altra wiki la pagina $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|una revisione importata|$1 revisioni importate}} da $2',
+# JavaScriptTest
+'javascripttest' => 'Sperimentazione JavaScript',
+'javascripttest-disabled' => 'Questa funzione è disabilitata.',
+'javascripttest-title' => 'In esecuzione test per $1',
+'javascripttest-pagetext-noframework' => "Questa pagina è riservata all'esecuzione di test di JavaScript.",
+'javascripttest-pagetext-unknownframework' => 'Framework di test sconosciuto "$1".',
+'javascripttest-pagetext-frameworks' => 'Per cortesia, scegli uno dei seguenti framework per i test: $1',
+'javascripttest-pagetext-skins' => 'Scegli una skin con cui eseguire i test:',
+'javascripttest-qunit-intro' => 'Vedi su mediawiki.org la [$1 documentazione riguardante i test].',
+'javascripttest-qunit-heading' => 'Suite di test di JavaScript per QUnit in MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'La tua pagina utente',
-'tooltip-pt-anonuserpage' => 'La pagina utente di questo indirizzo IP',
-'tooltip-pt-mytalk' => 'La tua pagina di discussione',
-'tooltip-pt-anontalk' => 'Discussioni sulle modifiche fatte da questo indirizzo IP',
-'tooltip-pt-preferences' => 'Le mie preferenze',
-'tooltip-pt-watchlist' => 'La lista delle pagine che stai tenendo sotto osservazione',
-'tooltip-pt-mycontris' => 'Elenco dei tuoi contributi',
-'tooltip-pt-login' => 'La registrazione è consigliata, anche se non obbligatoria',
-'tooltip-pt-anonlogin' => 'La registrazione è consigliata, anche se non obbligatoria',
-'tooltip-pt-logout' => 'Uscita (logout)',
-'tooltip-ca-talk' => 'Vedi le discussioni relative a questa pagina',
-'tooltip-ca-edit' => 'Puoi modificare questa pagina. Per favore usa il pulsante di anteprima prima di salvare',
-'tooltip-ca-addsection' => 'Inizia una nuova sezione',
-'tooltip-ca-viewsource' => 'Questa pagina è protetta, ma puoi vedere il suo codice sorgente',
-'tooltip-ca-history' => 'Versioni precedenti di questa pagina',
-'tooltip-ca-protect' => 'Proteggi questa pagina',
-'tooltip-ca-unprotect' => 'Modifica la protezione di questa pagina',
-'tooltip-ca-delete' => 'Cancella questa pagina',
-'tooltip-ca-undelete' => "Ripristina la pagina com'era prima della cancellazione",
-'tooltip-ca-move' => 'Sposta questa pagina (cambia titolo)',
-'tooltip-ca-watch' => 'Aggiungi questa pagina alla tua lista degli osservati speciali',
-'tooltip-ca-unwatch' => 'Elimina questa pagina dalla tua lista degli osservati speciali',
-'tooltip-search' => "Cerca all'interno di {{SITENAME}}",
-'tooltip-search-go' => 'Vai a una pagina con il titolo indicato, se esiste',
-'tooltip-search-fulltext' => 'Cerca il testo indicato nelle pagine',
-'tooltip-p-logo' => 'Visita la pagina principale',
-'tooltip-n-mainpage' => 'Visita la pagina principale',
-'tooltip-n-mainpage-description' => 'Visita la pagina principale',
-'tooltip-n-portal' => 'Descrizione del progetto, cosa puoi fare, dove trovare le cose',
-'tooltip-n-currentevents' => 'Informazioni sugli eventi di attualità',
-'tooltip-n-recentchanges' => 'Elenco delle ultime modifiche del sito',
-'tooltip-n-randompage' => 'Mostra una pagina a caso',
-'tooltip-n-help' => 'Pagine di aiuto',
-'tooltip-t-whatlinkshere' => 'Elenco di tutte le pagine che sono collegate a questa',
-'tooltip-t-recentchangeslinked' => 'Elenco delle ultime modifiche alle pagine collegate a questa',
-'tooltip-feed-rss' => 'Feed RSS per questa pagina',
-'tooltip-feed-atom' => 'Feed Atom per questa pagina',
-'tooltip-t-contributions' => 'Lista dei contributi di questo utente',
-'tooltip-t-emailuser' => 'Invia un messaggio e-mail a questo utente',
-'tooltip-t-upload' => 'Carica file multimediali',
-'tooltip-t-specialpages' => 'Lista di tutte le pagine speciali',
-'tooltip-t-print' => 'Versione stampabile di questa pagina',
-'tooltip-t-permalink' => 'Collegamento permanente a questa versione della pagina',
-'tooltip-ca-nstab-main' => 'Vedi la voce',
-'tooltip-ca-nstab-user' => 'Vedi la pagina utente',
-'tooltip-ca-nstab-media' => 'Vedi la pagina del file multimediale',
-'tooltip-ca-nstab-special' => 'Questa è una pagina speciale, non può essere modificata',
-'tooltip-ca-nstab-project' => 'Vedi la pagina di servizio',
-'tooltip-ca-nstab-image' => 'Vedi la pagina del file',
-'tooltip-ca-nstab-mediawiki' => 'Vedi il messaggio di sistema',
-'tooltip-ca-nstab-template' => 'Vedi il template',
-'tooltip-ca-nstab-help' => 'Vedi la pagina di aiuto',
-'tooltip-ca-nstab-category' => 'Vedi la pagina della categoria',
-'tooltip-minoredit' => 'Segnala come modifica minore',
-'tooltip-save' => 'Salva le modifiche',
-'tooltip-preview' => 'Anteprima delle modifiche (consigliata prima di salvare)',
-'tooltip-diff' => 'Guarda le modifiche apportate al testo',
-'tooltip-compareselectedversions' => 'Guarda le differenze tra le due versioni selezionate di questa pagina.',
-'tooltip-watch' => 'Aggiungi questa pagina alla tua lista degli osservati speciali',
-'tooltip-recreate' => 'Ricrea la pagina anche se è stata cancellata',
-'tooltip-upload' => 'Inizia il caricamento',
-'tooltip-rollback' => '"Rollback" annulla le modifiche a questa pagina dell\'ultimo contributore con un solo clic.',
-'tooltip-undo' => '"Annulla" permette di annullare questa modifica e apre il modulo di modifica in modalità di anteprima. Permette di inserire una motivazione nell\'oggetto della modifica.',
-'tooltip-preferences-save' => 'Salva le preferenze',
-'tooltip-summary' => 'Inserire una breve sintesi',
+'tooltip-pt-userpage' => 'La tua pagina utente',
+'tooltip-pt-anonuserpage' => 'La pagina utente di questo indirizzo IP',
+'tooltip-pt-mytalk' => 'La tua pagina di discussione',
+'tooltip-pt-anontalk' => 'Discussioni sulle modifiche fatte da questo indirizzo IP',
+'tooltip-pt-preferences' => 'Le mie preferenze',
+'tooltip-pt-watchlist' => 'La lista delle pagine che stai tenendo sotto osservazione',
+'tooltip-pt-mycontris' => 'Elenco dei tuoi contributi',
+'tooltip-pt-login' => 'La registrazione è consigliata, anche se non obbligatoria',
+'tooltip-pt-anonlogin' => 'La registrazione è consigliata, anche se non obbligatoria',
+'tooltip-pt-logout' => 'Uscita (logout)',
+'tooltip-ca-talk' => 'Vedi le discussioni relative a questa pagina',
+'tooltip-ca-edit' => 'Puoi modificare questa pagina. Per favore usa il pulsante di anteprima prima di salvare',
+'tooltip-ca-addsection' => 'Inizia una nuova sezione',
+'tooltip-ca-viewsource' => 'Questa pagina è protetta, ma puoi vedere il suo codice sorgente',
+'tooltip-ca-history' => 'Versioni precedenti di questa pagina',
+'tooltip-ca-protect' => 'Proteggi questa pagina',
+'tooltip-ca-unprotect' => 'Modifica la protezione di questa pagina',
+'tooltip-ca-delete' => 'Cancella questa pagina',
+'tooltip-ca-undelete' => "Ripristina la pagina com'era prima della cancellazione",
+'tooltip-ca-move' => 'Sposta questa pagina (cambia titolo)',
+'tooltip-ca-watch' => 'Aggiungi questa pagina alla tua lista degli osservati speciali',
+'tooltip-ca-unwatch' => 'Elimina questa pagina dalla tua lista degli osservati speciali',
+'tooltip-search' => "Cerca all'interno di {{SITENAME}}",
+'tooltip-search-go' => 'Vai a una pagina con il titolo indicato, se esiste',
+'tooltip-search-fulltext' => 'Cerca il testo indicato nelle pagine',
+'tooltip-p-logo' => 'Visita la pagina principale',
+'tooltip-n-mainpage' => 'Visita la pagina principale',
+'tooltip-n-mainpage-description' => 'Visita la pagina principale',
+'tooltip-n-portal' => 'Descrizione del progetto, cosa puoi fare, dove trovare le cose',
+'tooltip-n-currentevents' => 'Informazioni sugli eventi di attualità',
+'tooltip-n-recentchanges' => 'Elenco delle ultime modifiche del sito',
+'tooltip-n-randompage' => 'Mostra una pagina a caso',
+'tooltip-n-help' => 'Pagine di aiuto',
+'tooltip-t-whatlinkshere' => 'Elenco di tutte le pagine che sono collegate a questa',
+'tooltip-t-recentchangeslinked' => 'Elenco delle ultime modifiche alle pagine collegate a questa',
+'tooltip-feed-rss' => 'Feed RSS per questa pagina',
+'tooltip-feed-atom' => 'Feed Atom per questa pagina',
+'tooltip-t-contributions' => 'Lista dei contributi di questo utente',
+'tooltip-t-emailuser' => 'Invia un messaggio e-mail a questo utente',
+'tooltip-t-upload' => 'Carica file multimediali',
+'tooltip-t-specialpages' => 'Lista di tutte le pagine speciali',
+'tooltip-t-print' => 'Versione stampabile di questa pagina',
+'tooltip-t-permalink' => 'Collegamento permanente a questa versione della pagina',
+'tooltip-ca-nstab-main' => 'Vedi la voce',
+'tooltip-ca-nstab-user' => 'Vedi la pagina utente',
+'tooltip-ca-nstab-media' => 'Vedi la pagina del file multimediale',
+'tooltip-ca-nstab-special' => 'Questa è una pagina speciale, non può essere modificata',
+'tooltip-ca-nstab-project' => 'Vedi la pagina di servizio',
+'tooltip-ca-nstab-image' => 'Vedi la pagina del file',
+'tooltip-ca-nstab-mediawiki' => 'Vedi il messaggio di sistema',
+'tooltip-ca-nstab-template' => 'Vedi il template',
+'tooltip-ca-nstab-help' => 'Vedi la pagina di aiuto',
+'tooltip-ca-nstab-category' => 'Vedi la pagina della categoria',
+'tooltip-minoredit' => 'Segnala come modifica minore',
+'tooltip-save' => 'Salva le modifiche',
+'tooltip-preview' => 'Anteprima delle modifiche (consigliata prima di salvare)',
+'tooltip-diff' => 'Guarda le modifiche apportate al testo',
+'tooltip-compareselectedversions' => 'Guarda le differenze tra le due versioni selezionate di questa pagina.',
+'tooltip-watch' => 'Aggiungi questa pagina alla tua lista degli osservati speciali',
+'tooltip-watchlistedit-normal-submit' => 'Rimuovi i titoli',
+'tooltip-watchlistedit-raw-submit' => 'Aggiorna la lista degli osservati speciali',
+'tooltip-recreate' => 'Ricrea la pagina anche se è stata cancellata',
+'tooltip-upload' => 'Inizia il caricamento',
+'tooltip-rollback' => '"Rollback" annulla le modifiche a questa pagina dell\'ultimo contributore con un solo clic.',
+'tooltip-undo' => '"Annulla" permette di annullare questa modifica e apre il modulo di modifica in modalità di anteprima. Permette di inserire una motivazione nell\'oggetto della modifica.',
+'tooltip-preferences-save' => 'Salva le preferenze',
+'tooltip-summary' => 'Inserire una breve sintesi',
# Stylesheets
'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
@@ -2859,9 +2936,6 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
# Patrol log
'patrol-log-page' => 'Modifiche verificate',
'patrol-log-header' => 'Di seguito sono elencate le verifiche delle modifiche.',
-'patrol-log-line' => 'ha segnato la $1 alla pagina $2 come verificata $3',
-'patrol-log-auto' => '(verifica automatica)',
-'patrol-log-diff' => 'modifica $1',
'log-show-hide-patrol' => '$1 log delle modifiche verificate',
# Image deletion
@@ -2887,11 +2961,11 @@ $1',
'file-info' => 'dimensione del file: $1, tipo MIME: $2',
'file-info-size' => '$1 × $2 pixel, dimensione del file: $3, tipo MIME: $4',
'file-info-size-pages' => '$1 × $2 pixel, dimensione del file: $3, tipo MIME: $4, $5 {{PLURAL:$5|pagina|pagine}}',
-'file-nohires' => '<small>Non sono disponibili versioni a risoluzione più elevata.</small>',
+'file-nohires' => 'Non sono disponibili versioni a risoluzione più elevata.',
'svg-long-desc' => 'file in formato SVG, dimensioni nominali $1 × $2 pixel, dimensione del file: $3',
'show-big-image' => 'Versione ad alta risoluzione',
-'show-big-image-preview' => '<small>Dimensioni di questa anteprima: $1.</small>',
-'show-big-image-other' => '<small>Altre risoluzioni: $1.</small>',
+'show-big-image-preview' => 'Dimensioni di questa anteprima: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Altra risoluzione|Altre risoluzioni}}: $1.',
'show-big-image-size' => '$1 × $2 pixel',
'file-info-gif-looped' => 'ciclico',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frame}}',
@@ -2911,6 +2985,13 @@ $1',
'bydate' => 'per data',
'sp-newimages-showfrom' => 'Mostra i file più recenti a partire dalle ore $2 del $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|un secondo|$1 secondi}}',
+'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
+'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
+'days' => '{{PLURAL:$1|un giorno|$1 giorni}}',
+'ago' => '$1 fa',
+
# Bad image list
'bad_image_list' => "Il formato è il seguente:
@@ -3413,13 +3494,6 @@ Questo codice di conferma scadrà automaticamente alle $4.',
'scarytranscludefailed' => '[Errore: Impossibile ottenere il template $1]',
'scarytranscludetoolong' => '[Errore: URL troppo lunga]',
-# Trackbacks
-'trackbackbox' => 'Informazioni di trackback per questa voce:<br />
-$1',
-'trackbackremove' => '([$1 Elimina])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Informazioni di trackback eliminate correttamente.',
-
# Delete conflict
'deletedwhileediting' => "'''Attenzione''': questa pagina è stata cancellata dopo che hai cominciato a modificarla!",
'confirmrecreate' => "L'utente [[User:$1|$1]] ([[User talk:$1|discussioni]]) ha cancellato questa pagina dopo che hai iniziato a modificarla, per il seguente motivo: ''$2''
@@ -3508,6 +3582,9 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
'hebrew-calendar-m10' => 'Tammuz',
'hebrew-calendar-m10-gen' => 'Tammuz',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussioni]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tag estensione sconosciuto: "$1"',
'duplicate-defaultsort' => 'Attenzione: la chiave di ordinamento predefinita "$2" sostituisce la precedente "$1".',
@@ -3606,13 +3683,16 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'tags-hitcount' => '$1 {{PLURAL:$1|modifica|modifiche}}',
# Special:ComparePages
-'comparepages' => 'Confronta le pagine',
-'compare-selector' => 'Confronta le revisioni di una pagina',
-'compare-page1' => 'Pagina 1',
-'compare-page2' => 'Pagina 2',
-'compare-rev1' => 'Revisione 1',
-'compare-rev2' => 'Revisione 2',
-'compare-submit' => 'Confronta',
+'comparepages' => 'Confronta le pagine',
+'compare-selector' => 'Confronta le revisioni di una pagina',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Revisione 1',
+'compare-rev2' => 'Revisione 2',
+'compare-submit' => 'Confronta',
+'compare-invalid-title' => 'Il titolo che hai specificato non è valido.',
+'compare-title-not-exists' => 'Il titolo che hai specificato non esiste.',
+'compare-revision-not-exists' => 'La revisione che hai specificato non esiste.',
# Database error messages
'dberr-header' => 'Questa wiki ha un problema',
@@ -3639,4 +3719,89 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'sqlite-has-fts' => '$1 con la possibilità di ricerca completa nel testo',
'sqlite-no-fts' => '$1 senza la possibilità di ricerca completa nel testo',
+# New logging system
+'logentry-delete-delete' => '$1 ha cancellato la pagina $3',
+'logentry-delete-restore' => '$1 ha ripristinato "$3"',
+'logentry-delete-event' => '$1 ha modificato la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
+'logentry-delete-revision' => '$1 ha modificato la visibilità per {{PLURAL:$5|una revisione|$5 revisioni}} della pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 ha modificato la visibilità di alcune azioni del registro di "$3"',
+'logentry-delete-revision-legacy' => '$1 ha modificato la visibilità per le revisioni della pagina $3',
+'logentry-suppress-delete' => '$1 ha nascosto la pagina "$3"',
+'logentry-suppress-event' => '$1 ha segretamente modificato la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
+'logentry-suppress-revision' => '$1 ha segretamente modificato la visibilità di {{PLURAL:$5|una versione|$5 versioni}} di "$3": $4',
+'logentry-suppress-event-legacy' => '$1 ha segretamente modificato la visibilità di alcune azioni del registro di "$3"',
+'logentry-suppress-revision-legacy' => '$1 ha segretamente modificato la visibilità di alcune versioni di "$3"',
+'revdelete-content-hid' => 'contenuto nascosto',
+'revdelete-summary-hid' => 'oggetto della modifica nascosto',
+'revdelete-uname-hid' => 'nome utente nascosto',
+'revdelete-content-unhid' => 'contenuto ripristinato',
+'revdelete-summary-unhid' => 'oggetto ripristinato',
+'revdelete-uname-unhid' => 'nome utente ripristinato',
+'revdelete-restricted' => 'limitazioni ai soli amministratori attivate',
+'revdelete-unrestricted' => 'limitazioni ai soli amministratori rimosse',
+'logentry-move-move' => '$1 ha spostato la pagina $3 a $4',
+'logentry-move-move-noredirect' => '$1 ha spostato la pagina $3 a $4 senza lasciare redirect',
+'logentry-move-move_redir' => '$1 ha spostato la pagina $3 a $4 tramite redirect',
+'logentry-move-move_redir-noredirect' => '$1 ha spostato la pagina $3 a $4 al posto di un redirect senza lasciare redirect',
+'logentry-patrol-patrol' => '$1 ha segnato la versione $4 della pagina $3 come verificata',
+'logentry-patrol-patrol-auto' => '$1 ha segnato automaticamente la versione $4 della pagina $3 come verificata',
+'logentry-newusers-newusers' => "$1 ha creato un'utenza",
+'logentry-newusers-create' => "$1 ha creato un'utenza",
+'logentry-newusers-create2' => "$1 ha creato un'utenza $3",
+'logentry-newusers-autocreate' => "L'utenza $1 è stata creata automaticamente",
+'newuserlog-byemail' => 'password inviata via mail',
+
+# Feedback
+'feedback-bugornote' => 'Se si è in grado di descrivere il problema tecnico riscontrato in maniera precisa, [$1 segnalate il bug]. In alternativa, si può usare il modulo semplificato sottostante. Il commento inserito sarà aggiunto alla pagina "[$3 $2]", insieme al proprio nome utente e al browser in uso.',
+'feedback-subject' => 'Oggetto:',
+'feedback-message' => 'Messaggio:',
+'feedback-cancel' => 'Annulla',
+'feedback-submit' => 'Invia feedback',
+'feedback-adding' => 'Inserimento del feedback nella pagina...',
+'feedback-error1' => 'Errore: Dalla API è arrivato un risultato non riconosciuto',
+'feedback-error2' => 'Errore: Non è stato possibile eseguire la modifica',
+'feedback-error3' => 'Errore: Nessuna risposta dalla API',
+'feedback-thanks' => 'Grazie! Il tuo feedback è stato pubblicato alla pagina "[$2 $1]".',
+'feedback-close' => 'Fatto',
+'feedback-bugcheck' => 'Ottimo! Verifica che non sia già fra i [$1 bug conosciuti].',
+'feedback-bugnew' => 'Controllo effettuato. Segnala un nuovo bug',
+
+# API errors
+'api-error-badaccess-groups' => 'Non sei autorizzato a caricare documenti su questa wiki.',
+'api-error-badtoken' => 'Errore interno: token errato.',
+'api-error-copyuploaddisabled' => 'Il caricamento tramite URL è disabilitato su questo server.',
+'api-error-duplicate' => "Sul sito {{PLURAL:$1|c'è già [$2 un altro documento]|ci sono già [$2 altri documenti]}} con lo stesso contenuto.",
+'api-error-duplicate-archive' => "{{PLURAL:$1|C'era [$2 un altro file]|C'erano [$2 altri file]}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
+'api-error-duplicate-archive-popup-title' => 'File duplicat{{PLURAL:$1|o che è già stato cancellato|i che sono già stati cancellati}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|documento duplicato|documenti duplicati}}',
+'api-error-empty-file' => 'Il file selezionato era vuoto.',
+'api-error-emptypage' => 'La creazione di nuove pagine vuote non è consentita.',
+'api-error-fetchfileerror' => "Errore interno: c'è stato un problema durante il recupero del documento.",
+'api-error-file-too-large' => 'Il file selezionato era troppo grande.',
+'api-error-filename-tooshort' => 'Il nome del file è troppo breve.',
+'api-error-filetype-banned' => 'Questo tipo di file non è accettato.',
+'api-error-filetype-missing' => "Al file manca l'estensione.",
+'api-error-hookaborted' => "La modifica hai tentato di fare è stata interrotta da un passaggio dell'estensione.",
+'api-error-http' => 'Errore interno: impossibile connettersi al server.',
+'api-error-illegal-filename' => 'Il nome del file non è ammesso.',
+'api-error-internal-error' => "Errore interno: qualcosa è andato storto con l'elaborazione del tuo caricamento sulla wiki.",
+'api-error-invalid-file-key' => 'Errore interno: file non presente nella cartella dei file temporanei.',
+'api-error-missingparam' => 'Errore interno: parametri della richiesta mancanti.',
+'api-error-missingresult' => 'Errore interno: impossibile determinare se la copia è riuscita.',
+'api-error-mustbeloggedin' => "Devi aver effettuato l'accesso per caricare i file.",
+'api-error-mustbeposted' => 'Errore interno: la richiesta richiede HTTP POST.',
+'api-error-noimageinfo' => 'Il caricamento è riuscito, ma il server non ci ha dato alcuna informazione sul file.',
+'api-error-nomodule' => 'Errore interno: non è stato impostato il modulo di caricamento.',
+'api-error-ok-but-empty' => 'Errore interno: nessuna risposta dal server.',
+'api-error-overwrite' => 'Sovrascrivere un file esistente non è consentito.',
+'api-error-stashfailed' => 'Errore interno: il server non è riuscito a memorizzare il documento temporaneo.',
+'api-error-timeout' => 'Il server non ha risposto entro il tempo previsto.',
+'api-error-unclassified' => 'Si è verificato un errore sconosciuto.',
+'api-error-unknown-code' => 'Errore sconosciuto: "$1"',
+'api-error-unknown-error' => 'Errore interno: qualcosa è andato storto provando a caricare il file.',
+'api-error-unknown-warning' => 'Avviso sconosciuto: $1',
+'api-error-unknownerror' => 'Errore sconosciuto: "$1".',
+'api-error-uploaddisabled' => 'Il caricamento è disabilitato su questa wiki.',
+'api-error-verification-error' => "Questo file potrebbe essere danneggiato, o avere l'estensione sbagliata.",
+
);
diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php
index eb76119e..e0e6f7c4 100644
--- a/languages/messages/MessagesJa.php
+++ b/languages/messages/MessagesJa.php
@@ -32,6 +32,7 @@
* @author Likibp
* @author Lovekhmer
* @author Marine-Blue
+ * @author Miya
* @author Mizusumashi
* @author Muttley
* @author Mzm5zbC3
@@ -107,12 +108,14 @@ $specialPageAliases = array(
'Allmessages' => array( 'メッセージ一覧', 'システムメッセージã®ä¸€è¦§', '表示メッセージã®ä¸€è¦§' ),
'Allpages' => array( 'ページ一覧', '全ページ' ),
'Ancientpages' => array( 'æ›´æ–°ã•ã‚Œã¦ã„ãªã„ページ' ),
+ 'Badtitle' => array( 'ä¸æ­£ãªãƒšãƒ¼ã‚¸å' ),
'Blankpage' => array( '白紙ページ' ),
'Block' => array( '投稿ブロック', 'ブロック' ),
'Blockme' => array( '自己ブロック' ),
'Booksources' => array( '文献資料' ),
'BrokenRedirects' => array( 'è¿·å­ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ', '壊れãŸãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ' ),
'Categories' => array( 'カテゴリ', 'カテゴリ一覧' ),
+ 'ChangeEmail' => array( 'メールアドレスã®å¤‰æ›´' ),
'ChangePassword' => array( 'パスワードã®å¤‰æ›´', 'パスワード変更', 'パスワードå†ç™ºè¡Œ', 'パスワードã®å†ç™ºè¡Œ' ),
'ComparePages' => array( 'ページã®æ¯”較' ),
'Confirmemail' => array( 'メールアドレスã®ç¢ºèª' ),
@@ -122,6 +125,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( '削除ã•ã‚ŒãŸæŠ•ç¨¿è¨˜éŒ²', '削除ã•ã‚ŒãŸæŠ•ç¨¿å±¥æ­´', '削除歴' ),
'Disambiguations' => array( '曖昧ã•å›žé¿ã®ãƒšãƒ¼ã‚¸', '曖昧ã•å›žé¿' ),
'DoubleRedirects' => array( '二é‡ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ' ),
+ 'EditWatchlist' => array( 'ウォッãƒãƒªã‚¹ãƒˆã®ç·¨é›†', 'ウォッãƒãƒªã‚¹ãƒˆç·¨é›†' ),
'Emailuser' => array( 'メールé€ä¿¡', 'ウィキメール' ),
'Export' => array( 'データ書ã出ã—', 'データー書ã出ã—', 'エクスãƒãƒ¼ãƒˆ' ),
'Fewestrevisions' => array( '編集履歴ã®å°‘ãªã„ページ', '版ã®å°‘ãªã„é …ç›®', '版ã®å°‘ãªã„ページ' ),
@@ -186,6 +190,7 @@ $specialPageAliases = array(
'Unusedtemplates' => array( '使ã‚ã‚Œã¦ã„ãªã„テンプレート', '未使用テンプレート' ),
'Unwatchedpages' => array( 'ウォッãƒã•ã‚Œã¦ã„ãªã„ページ' ),
'Upload' => array( 'アップロード' ),
+ 'UploadStash' => array( '未公開アップロード' ),
'Userlogin' => array( 'ログイン' ),
'Userlogout' => array( 'ログアウト' ),
'Userrights' => array( '利用者権é™', '利用者権é™ã®å¤‰æ›´' ),
@@ -200,154 +205,154 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#転é€', '#リダイレクト', '#転é€', '#リダイレクト', '#REDIRECT' ),
- 'notoc' => array( '0', '__目次éžè¡¨ç¤º__', '__目次éžè¡¨ç¤ºï¼¿ï¼¿', '__NOTOC__' ),
- 'nogallery' => array( '0', '__ギャラリーéžè¡¨ç¤º__', '__ギャラリーéžè¡¨ç¤ºï¼¿ï¼¿', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__目次強制__', '__目次強制__', '__FORCETOC__' ),
- 'toc' => array( '0', '__目次__', '__目次__', '__TOC__' ),
- 'noeditsection' => array( '0', '__節編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤ºï¼¿ï¼¿', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__見出ã—éžè¡¨ç¤º__', '__見出ã—éžè¡¨ç¤ºï¼¿ï¼¿', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ç¾åœ¨ã®æœˆ', 'å”定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ç¾åœ¨ã®æœˆ1', 'å”定月1', 'å”定月1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ç¾åœ¨ã®æœˆå', 'å”定月å', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ç¾åœ¨ã®æœˆå±žæ ¼', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ç¾åœ¨ã®æœˆçœç•¥å½¢', 'çœç•¥å”定月', 'å”定月çœç•¥', 'å”定月çœç•¥å½¢', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ç¾åœ¨ã®æ—¥', 'å”定日', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ç¾åœ¨ã®æ—¥2', 'å”定日2', 'å”定日2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ç¾åœ¨ã®æ›œæ—¥å', 'å”定曜日', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ç¾åœ¨ã®å¹´', 'å”定年', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ç¾åœ¨ã®æ™‚刻', 'å”定時間', 'å”定時刻', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ç¾åœ¨ã®æ™‚', 'å”定時', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', '地方時ã®æœˆ', 'ç¾åœ°æœˆ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', '地方時ã®æœˆ1', 'ç¾åœ°æœˆ1', 'ç¾åœ°æœˆï¼‘', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', '地方時ã®æœˆå1', 'ç¾åœ°æœˆå', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', '地方時ã®æœˆå±žæ ¼', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', '地方時ã®æœˆçœç•¥å½¢', 'çœç•¥ç¾åœ°æœˆ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', '地方時ã®æ—¥', 'ç¾åœ°æ—¥', 'ローカルデイ', 'LOCALDAY' ),
- 'localday2' => array( '1', '地方時ã®æ—¥2', 'ç¾åœ°æ—¥2', 'ç¾åœ°æ—¥ï¼’', 'LOCALDAY2' ),
- 'localdayname' => array( '1', '地方時ã®æ›œæ—¥å', 'ç¾åœ°æ›œæ—¥', 'ローカルデイãƒãƒ¼ãƒ ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', '地方時ã®å¹´', 'ç¾åœ°å¹´', 'ローカルイヤー', 'LOCALYEAR' ),
- 'localtime' => array( '1', '地方時ã®æ™‚刻', 'ç¾åœ°æ™‚é–“', 'ローカルタイム', 'LOCALTIME' ),
- 'localhour' => array( '1', '地方時ã®æ™‚', 'ç¾åœ°æ™‚', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ページ数', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', '記事数', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ファイル数', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', '利用者数', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', '活動利用者数', '有効ãªåˆ©ç”¨è€…æ•°', '有効利用者数', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', '編集回数', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', '閲覧回数', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ページå', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ページåE', 'ページåï¼¥', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'åå‰ç©ºé–“', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'åå‰ç©ºé–“E', 'åå‰ç©ºé–“ï¼¥', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'トーク空間', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'トーク空間E', 'トーク空間E', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', '主空間', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', '主空間E', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', '完全ãªãƒšãƒ¼ã‚¸å', 'フルページå', '完全ãªè¨˜äº‹å', '完全記事å', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', '完全ãªãƒšãƒ¼ã‚¸åE', 'フルページåE', 'フルページåï¼¥', '完全ãªãƒšãƒ¼ã‚¸åï¼¥', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'サブページå', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'サブページåE', 'サブページåï¼¥', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', '親ページå', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', '親ページåE', '親ページåï¼¥', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'トークページå', '会話ページå', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'トークページåE', '会話ページåE', '会話ページåï¼¥', 'トークページåï¼¥', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', '主ページå', '記事ページå', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', '主ページåE', '記事ページåE', '主ページåï¼¥', '記事ページåï¼¥', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'メッセージ:', 'MSG:' ),
- 'subst' => array( '0', '展開:', '展開:', 'SUBST:' ),
- 'safesubst' => array( '0', '安全展開:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'ウィキ無効メッセージ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'サムãƒã‚¤ãƒ«', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', '代替画åƒ=$1', 'サムãƒã‚¤ãƒ«=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'å³', 'right' ),
- 'img_left' => array( '1', 'å·¦', 'left' ),
- 'img_none' => array( '1', 'ãªã—', 'ç„¡ã—', 'none' ),
- 'img_width' => array( '1', '$1ピクセル', '$1px' ),
- 'img_center' => array( '1', '中央', 'center', 'centre' ),
- 'img_framed' => array( '1', 'フレーム', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'フレームãªã—', 'frameless' ),
- 'img_page' => array( '1', 'ページ=$1', 'ページ $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'å³ä¸Š', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', '境界', 'ボーダー', 'border' ),
- 'img_baseline' => array( '1', '下線', 'ベースライン', 'baseline' ),
- 'img_sub' => array( '1', '下付ã', 'sub' ),
- 'img_super' => array( '1', '上付ã', 'super', 'sup' ),
- 'img_top' => array( '1', '上端', 'top' ),
- 'img_text_top' => array( '1', '文上端', 'text-top' ),
- 'img_middle' => array( '1', '中心', 'middle' ),
- 'img_bottom' => array( '1', '下端', 'bottom' ),
- 'img_text_bottom' => array( '1', '文下端', 'text-bottom' ),
- 'img_link' => array( '1', 'リンク=$1', 'link=$1' ),
- 'img_alt' => array( '1', '代替文=$1', 'alt=$1' ),
- 'int' => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'INT:' ),
- 'sitename' => array( '1', 'サイトå', 'サイトãƒãƒ¼ãƒ ', 'SITENAME' ),
- 'ns' => array( '0', 'åå‰ç©ºé–“:', 'åå‰ç©ºé–“:', 'å空:', 'å空:', 'NS:' ),
- 'nse' => array( '0', 'åå‰ç©ºé–“E:', 'NSE:' ),
- 'localurl' => array( '0', 'ローカルURL:', 'ローカルURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ローカルURLE:', 'ローカルURLE:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', '記事パス', 'ARTICLEPATH' ),
- 'server' => array( '0', 'サーãƒãƒ¼', 'サーãƒ', 'SERVER' ),
- 'servername' => array( '0', 'サーãƒãƒ¼å', 'サーãƒãƒ¼ãƒãƒ¼ãƒ ', 'サーãƒå', 'サーãƒãƒãƒ¼ãƒ ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'スクリプトパス', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'スタイルパス', 'STYLEPATH' ),
- 'grammar' => array( '0', '文法:', 'GRAMMAR:' ),
- 'gender' => array( '0', '性別:', '性別:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__タイトル変æ›ç„¡åŠ¹__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦ï¼¿ï¼¿', '__タイトルéžè¡¨ç¤º__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__内容変æ›ç„¡åŠ¹__', '__内容変æ›æŠ‘制__', '__内容変æ›æŠ‘制__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ç¾åœ¨ã®é€±', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ç¾åœ¨ã®æ›œæ—¥ç•ªå·', 'CURRENTDOW' ),
- 'localweek' => array( '1', '地方時ã®é€±', 'ç¾åœ°é€±', 'ローカルウィーク', 'LOCALWEEK' ),
- 'localdow' => array( '1', '地方時ã®æ›œæ—¥ç•ªå·', 'LOCALDOW' ),
- 'revisionid' => array( '1', '版ã®ID', 'リビジョンID', '差分ID', 'リビジョンID', '差分ID', 'REVISIONID' ),
- 'revisionday' => array( '1', '版ã®æ—¥', 'リビジョン日', '差分日', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', '版ã®æ—¥2', 'リビジョン日2', '差分日2', 'リビジョン日2', '差分日2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', '版ã®æœˆ', 'リビジョン月', '差分月', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', '版ã®æœˆ1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', '版ã®å¹´', 'リビジョン年', '差分年', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', '版ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'リビジョンタイムスタンプ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', '版ã®åˆ©ç”¨è€…', 'リビジョンユーザー', 'リビジョンユーザ', 'リビジョン利用者', '差分利用者', 'REVISIONUSER' ),
- 'plural' => array( '0', '複数:', '複数:', 'PLURAL:' ),
- 'fullurl' => array( '0', '完全ãªURL:', 'フルURL:', '完全ãªï¼µï¼²ï¼¬ï¼š', 'フルURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', '完全ãªURLE:', 'フルURLE:', '完全ãªï¼µï¼²ï¼¬ï¼¥ï¼š', 'フルURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', '先頭å°æ–‡å­—:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', '先頭大文字:', 'UCFIRST:' ),
- 'lc' => array( '0', 'å°æ–‡å­—:', 'LC:' ),
- 'uc' => array( '0', '大文字:', 'UC:' ),
- 'raw' => array( '0', '生:', 'RAW:' ),
- 'displaytitle' => array( '1', '表示タイトル:', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', '生', 'R' ),
- 'newsectionlink' => array( '1', '__æ–°ã—ã„節リンク__', '__æ–°ã—ã„セクションリンク__', '__新セクションリンク__', '__新ã—ã„セクションリンク__', '__新セクションリンク__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__æ–°ã—ã„節リンクéžè¡¨ç¤º__', '__æ–°ã—ã„セクションリンクéžè¡¨ç¤º__', '__新ã—ã„セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__新セクションリンクéžè¡¨ç¤º__', '__新セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'ウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'MediaWikiãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'メディアウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLエンコード:', 'URLエンコード:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'アンカー用エンコード', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'ç¾åœ¨ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'å”定タイムスタンプ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', '地方時ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ç¾åœ°ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ローカルタイムスタンプ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'æ–¹å‘å°', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#言語:', '#言語:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', '内容言語', '記事言語', 'プロジェクト言語', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'åå‰ç©ºé–“内ページ数', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', '管ç†è€…æ•°', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'æ•°æ•´å½¢', 'FORMATNUM' ),
- 'padleft' => array( '0', '補充左', 'PADLEFT' ),
- 'padright' => array( '0', '補充å³', 'PADRIGHT' ),
- 'special' => array( '0', '特別', 'special' ),
- 'defaultsort' => array( '1', 'デフォルトソート:', 'デフォルトソート:', 'デフォルトソートキー:', 'デフォルトカテゴリソート:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ファイルパス:', 'ファイルパス:', 'FILEPATH:' ),
- 'tag' => array( '0', 'ã‚¿ã‚°', 'tag' ),
- 'hiddencat' => array( '1', '__カテゴリéžè¡¨ç¤º__', '__カテéžè¡¨ç¤º__', '__éžè¡¨ç¤ºã‚«ãƒ†__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'カテゴリ内ページ数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ページサイズ', 'PAGESIZE' ),
- 'index' => array( '1', '__インデックス__', '__インデックス__', '__INDEX__' ),
- 'noindex' => array( '1', '__インデックス拒å¦__', '__インデックス拒å¦ï¼¿ï¼¿', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'グループ人数', 'グループ所属人数', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__é™çš„転é€__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹ï¼¿ï¼¿', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹__', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹ï¼¿ï¼¿', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'ä¿è­·ãƒ¬ãƒ™ãƒ«', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', '日付整形', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'パス', 'PATH' ),
- 'url_wiki' => array( '0', 'ウィキ', 'WIKI' ),
- 'url_query' => array( '0', 'クエリー', 'QUERY' ),
+ 'redirect' => array( '0', '#転é€', '#リダイレクト', '#転é€', '#リダイレクト', '#REDIRECT' ),
+ 'notoc' => array( '0', '__目次éžè¡¨ç¤º__', '__目次éžè¡¨ç¤ºï¼¿ï¼¿', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ギャラリーéžè¡¨ç¤º__', '__ギャラリーéžè¡¨ç¤ºï¼¿ï¼¿', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__目次強制__', '__目次強制__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__目次__', '__目次__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__節編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤ºï¼¿ï¼¿', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__見出ã—éžè¡¨ç¤º__', '__見出ã—éžè¡¨ç¤ºï¼¿ï¼¿', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ç¾åœ¨ã®æœˆ', 'å”定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ç¾åœ¨ã®æœˆ1', 'å”定月1', 'å”定月1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ç¾åœ¨ã®æœˆå', 'å”定月å', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ç¾åœ¨ã®æœˆå±žæ ¼', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ç¾åœ¨ã®æœˆçœç•¥å½¢', 'çœç•¥å”定月', 'å”定月çœç•¥', 'å”定月çœç•¥å½¢', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ç¾åœ¨ã®æ—¥', 'å”定日', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ç¾åœ¨ã®æ—¥2', 'å”定日2', 'å”定日2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ç¾åœ¨ã®æ›œæ—¥å', 'å”定曜日', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ç¾åœ¨ã®å¹´', 'å”定年', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ç¾åœ¨ã®æ™‚刻', 'å”定時間', 'å”定時刻', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ç¾åœ¨ã®æ™‚', 'å”定時', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', '地方時ã®æœˆ', 'ç¾åœ°æœˆ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', '地方時ã®æœˆ1', 'ç¾åœ°æœˆ1', 'ç¾åœ°æœˆï¼‘', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', '地方時ã®æœˆå1', 'ç¾åœ°æœˆå', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', '地方時ã®æœˆå±žæ ¼', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', '地方時ã®æœˆçœç•¥å½¢', 'çœç•¥ç¾åœ°æœˆ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', '地方時ã®æ—¥', 'ç¾åœ°æ—¥', 'ローカルデイ', 'LOCALDAY' ),
+ 'localday2' => array( '1', '地方時ã®æ—¥2', 'ç¾åœ°æ—¥2', 'ç¾åœ°æ—¥ï¼’', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', '地方時ã®æ›œæ—¥å', 'ç¾åœ°æ›œæ—¥', 'ローカルデイãƒãƒ¼ãƒ ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', '地方時ã®å¹´', 'ç¾åœ°å¹´', 'ローカルイヤー', 'LOCALYEAR' ),
+ 'localtime' => array( '1', '地方時ã®æ™‚刻', 'ç¾åœ°æ™‚é–“', 'ローカルタイム', 'LOCALTIME' ),
+ 'localhour' => array( '1', '地方時ã®æ™‚', 'ç¾åœ°æ™‚', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ページ数', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', '記事数', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ファイル数', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', '利用者数', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', '活動利用者数', '有効ãªåˆ©ç”¨è€…æ•°', '有効利用者数', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', '編集回数', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', '閲覧回数', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ページå', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ページåE', 'ページåï¼¥', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'åå‰ç©ºé–“', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'åå‰ç©ºé–“E', 'åå‰ç©ºé–“ï¼¥', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'トーク空間', 'ノート空間', '会話空間', 'トークスペース', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'トーク空間E', 'トーク空間E', 'ノート空間E', '会話空間E', 'ノート空間E', '会話空間E', 'トークスペースE', 'トークスペースE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', '主空間', '標準空間', '記事空間', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', '主空間E', '標準空間E', '標準空間E', '記事空間E', '記事空間E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', '完全ãªãƒšãƒ¼ã‚¸å', 'フルページå', '完全ãªè¨˜äº‹å', '完全記事å', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', '完全ãªãƒšãƒ¼ã‚¸åE', 'フルページåE', 'フルページåï¼¥', '完全ãªãƒšãƒ¼ã‚¸åï¼¥', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'サブページå', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'サブページåE', 'サブページåï¼¥', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', '親ページå', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', '親ページåE', '親ページåï¼¥', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'トークページå', '会話ページå', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'トークページåE', '会話ページåE', '会話ページåï¼¥', 'トークページåï¼¥', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', '主ページå', '記事ページå', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', '主ページåE', '記事ページåE', '主ページåï¼¥', '記事ページåï¼¥', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'メッセージ:', 'MSG:' ),
+ 'subst' => array( '0', '展開:', '展開:', 'SUBST:' ),
+ 'safesubst' => array( '0', '安全展開:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'ウィキ無効メッセージ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'サムãƒã‚¤ãƒ«', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', '代替画åƒ=$1', 'サムãƒã‚¤ãƒ«=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'å³', 'right' ),
+ 'img_left' => array( '1', 'å·¦', 'left' ),
+ 'img_none' => array( '1', 'ãªã—', 'ç„¡ã—', 'none' ),
+ 'img_width' => array( '1', '$1ピクセル', '$1px' ),
+ 'img_center' => array( '1', '中央', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'フレーム', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'フレームãªã—', 'frameless' ),
+ 'img_page' => array( '1', 'ページ=$1', 'ページ $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'å³ä¸Š', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', '境界', 'ボーダー', 'border' ),
+ 'img_baseline' => array( '1', '下線', 'ベースライン', 'baseline' ),
+ 'img_sub' => array( '1', '下付ã', 'sub' ),
+ 'img_super' => array( '1', '上付ã', 'super', 'sup' ),
+ 'img_top' => array( '1', '上端', 'top' ),
+ 'img_text_top' => array( '1', '文上端', 'text-top' ),
+ 'img_middle' => array( '1', '中心', 'middle' ),
+ 'img_bottom' => array( '1', '下端', 'bottom' ),
+ 'img_text_bottom' => array( '1', '文下端', 'text-bottom' ),
+ 'img_link' => array( '1', 'リンク=$1', 'link=$1' ),
+ 'img_alt' => array( '1', '代替文=$1', 'alt=$1' ),
+ 'int' => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'INT:' ),
+ 'sitename' => array( '1', 'サイトå', 'サイトãƒãƒ¼ãƒ ', 'SITENAME' ),
+ 'ns' => array( '0', 'åå‰ç©ºé–“:', 'åå‰ç©ºé–“:', 'å空:', 'å空:', 'NS:' ),
+ 'nse' => array( '0', 'åå‰ç©ºé–“E:', 'NSE:' ),
+ 'localurl' => array( '0', 'ローカルURL:', 'ローカルURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ローカルURLE:', 'ローカルURLE:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', '記事パス', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'サーãƒãƒ¼', 'サーãƒ', 'SERVER' ),
+ 'servername' => array( '0', 'サーãƒãƒ¼å', 'サーãƒãƒ¼ãƒãƒ¼ãƒ ', 'サーãƒå', 'サーãƒãƒãƒ¼ãƒ ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'スクリプトパス', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'スタイルパス', 'STYLEPATH' ),
+ 'grammar' => array( '0', '文法:', 'GRAMMAR:' ),
+ 'gender' => array( '0', '性別:', '性別:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__タイトル変æ›ç„¡åŠ¹__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦__', '__タイトルコンãƒãƒ¼ãƒˆæ‹’å¦ï¼¿ï¼¿', '__タイトルéžè¡¨ç¤º__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__内容変æ›ç„¡åŠ¹__', '__内容変æ›æŠ‘制__', '__内容変æ›æŠ‘制__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ç¾åœ¨ã®é€±', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ç¾åœ¨ã®æ›œæ—¥ç•ªå·', 'CURRENTDOW' ),
+ 'localweek' => array( '1', '地方時ã®é€±', 'ç¾åœ°é€±', 'ローカルウィーク', 'LOCALWEEK' ),
+ 'localdow' => array( '1', '地方時ã®æ›œæ—¥ç•ªå·', 'LOCALDOW' ),
+ 'revisionid' => array( '1', '版ã®ID', 'リビジョンID', '差分ID', 'リビジョンID', '差分ID', 'REVISIONID' ),
+ 'revisionday' => array( '1', '版ã®æ—¥', 'リビジョン日', '差分日', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', '版ã®æ—¥2', 'リビジョン日2', '差分日2', 'リビジョン日2', '差分日2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', '版ã®æœˆ', 'リビジョン月', '差分月', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', '版ã®æœˆ1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', '版ã®å¹´', 'リビジョン年', '差分年', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', '版ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'リビジョンタイムスタンプ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', '版ã®åˆ©ç”¨è€…', 'リビジョンユーザー', 'リビジョンユーザ', 'リビジョン利用者', '差分利用者', 'REVISIONUSER' ),
+ 'plural' => array( '0', '複数:', '複数:', 'PLURAL:' ),
+ 'fullurl' => array( '0', '完全ãªURL:', 'フルURL:', '完全ãªï¼µï¼²ï¼¬ï¼š', 'フルURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', '完全ãªURLE:', 'フルURLE:', '完全ãªï¼µï¼²ï¼¬ï¼¥ï¼š', 'フルURLE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', '先頭å°æ–‡å­—:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', '先頭大文字:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'å°æ–‡å­—:', 'LC:' ),
+ 'uc' => array( '0', '大文字:', 'UC:' ),
+ 'raw' => array( '0', '生:', 'RAW:' ),
+ 'displaytitle' => array( '1', '表示タイトル:', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', '生', 'R' ),
+ 'newsectionlink' => array( '1', '__æ–°ã—ã„節リンク__', '__æ–°ã—ã„セクションリンク__', '__新セクションリンク__', '__新ã—ã„セクションリンク__', '__新セクションリンク__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__æ–°ã—ã„節リンクéžè¡¨ç¤º__', '__æ–°ã—ã„セクションリンクéžè¡¨ç¤º__', '__新ã—ã„セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__新セクションリンクéžè¡¨ç¤º__', '__新セクションリンクéžè¡¨ç¤ºï¼¿ï¼¿', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'ウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'MediaWikiãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'メディアウィキãƒãƒ¼ã‚¸ãƒ§ãƒ³', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLエンコード:', 'URLエンコード:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'アンカー用エンコード', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ç¾åœ¨ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'å”定タイムスタンプ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', '地方時ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ç¾åœ°ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—', 'ローカルタイムスタンプ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'æ–¹å‘å°', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#言語:', '#言語:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', '内容言語', '記事言語', 'プロジェクト言語', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'åå‰ç©ºé–“内ページ数', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', '管ç†è€…æ•°', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'æ•°æ•´å½¢', 'FORMATNUM' ),
+ 'padleft' => array( '0', '補充左', 'PADLEFT' ),
+ 'padright' => array( '0', '補充å³', 'PADRIGHT' ),
+ 'special' => array( '0', '特別', 'special' ),
+ 'defaultsort' => array( '1', 'デフォルトソート:', 'デフォルトソート:', 'デフォルトソートキー:', 'デフォルトカテゴリソート:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ファイルパス:', 'ファイルパス:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'ã‚¿ã‚°', 'tag' ),
+ 'hiddencat' => array( '1', '__カテゴリéžè¡¨ç¤º__', '__カテéžè¡¨ç¤º__', '__éžè¡¨ç¤ºã‚«ãƒ†__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'カテゴリ内ページ数', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ページサイズ', 'PAGESIZE' ),
+ 'index' => array( '1', '__インデックス__', '__インデックス__', '__INDEX__' ),
+ 'noindex' => array( '1', '__インデックス拒å¦__', '__インデックス拒å¦ï¼¿ï¼¿', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'グループ人数', 'グループ所属人数', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__é™çš„転é€__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹__', '__二é‡è»¢é€è§£æ¶ˆç„¡åŠ¹ï¼¿ï¼¿', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹__', '__二é‡è»¢é€ä¿®æ­£ç„¡åŠ¹ï¼¿ï¼¿', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ä¿è­·ãƒ¬ãƒ™ãƒ«', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', '日付整形', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'パス', 'PATH' ),
+ 'url_wiki' => array( '0', 'ウィキ', 'WIKI' ),
+ 'url_query' => array( '0', 'クエリー', 'QUERY' ),
);
$messages = array(
@@ -709,23 +714,25 @@ URLã‚’é–“é•ã£ã¦æ‰“ã£ãŸã‹ã€æ­£ã—ããªã„リンクを辿ã£ãŸå¯èƒ½æ€§ã
'badarticleerror' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯è¦æ±‚ã•ã‚ŒãŸæ“作を行ãˆã¾ã›ã‚“。',
'cannotdelete' => '指定ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚ã‚‹ã„ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã€Œ$1ã€ã‚’削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
ã™ã§ã«ä»–ã®äººã«ã‚ˆã£ã¦å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
+'cannotdelete-title' => '「$1ã€ã¨ã„ã†ãƒšãƒ¼ã‚¸ã‚’削除ã§ãã¾ã›ã‚“',
'badtitle' => 'ä¸æ­£ãªãƒšãƒ¼ã‚¸å',
'badtitletext' => 'è¦æ±‚ã•ã‚ŒãŸãƒšãƒ¼ã‚¸åã¯ã€ç„¡åŠ¹ã€ç©ºã€ã¾ãŸã¯æ­£ã—ããªã„言語間リンク・ウィキ間リンクã®ãƒšãƒ¼ã‚¸åã§ã™ã€‚
ページåã«åˆ©ç”¨ã§ããªã„文字ãŒ1ã¤ä»¥ä¸Šå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
-'perfcached' => '以下ã®ãƒ‡ãƒ¼ã‚¿ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§ã‚ã‚Šã€æœ€æ–°ã®æ›´æ–°ã‚’å映ã—ã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
-'perfcachedts' => '以下ã®ãƒ‡ãƒ¼ã‚¿ã¯$1ã«æœ€çµ‚æ›´æ–°ã•ã‚ŒãŸã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§ã™ã€‚',
+'perfcached' => '以下ã®ãƒ‡ãƒ¼ã‚¿ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ãŠã‚Šã€æœ€æ–°ã®çŠ¶æ…‹ã§ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚最大$1件ã¾ã§ã®çµæžœãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§åˆ©ç”¨å¯èƒ½ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'perfcachedts' => '以下ã®ãƒ‡ãƒ¼ã‚¿ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ãŠã‚Šã€æœ€å¾Œã«æ›´æ–°ã•ã‚ŒãŸæ—¥æ™‚ã¯$1ã§ã™ã€‚最大$4件ã¾ã§ã®çµæžœãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§åˆ©ç”¨å¯èƒ½ã«ãªã£ã¦ã„ã¾ã™ã€‚',
'querypage-no-updates' => 'ページã®æ›´æ–°ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚
以下ã®ãƒ‡ãƒ¼ã‚¿ã®æ›´æ–°ã¯ç¾åœ¨è¡Œã‚ã‚Œã¦ã„ã¾ã›ã‚“。',
'wrong_wfQuery_params' => 'wfQuery()ã¸èª¤ã£ãŸå¼•æ•°ãŒæ¸¡ã•ã‚Œã¾ã—ãŸã€‚<br />
関数:$1<br />
クエリ:$2',
'viewsource' => 'ソースを表示',
-'viewsourcefor' => '$1ã®ã‚½ãƒ¼ã‚¹',
+'viewsource-title' => '$1ã®ã‚½ãƒ¼ã‚¹ã‚’表示',
'actionthrottled' => 'æ“作ãŒé€Ÿåº¦è¦åˆ¶ã•ã‚Œã¾ã—ãŸ',
'actionthrottledtext' => '短時間ã«ã“ã®æ“作を大é‡ã«è¡Œã£ãŸãŸã‚ã€ã‚¹ãƒ‘ム対策ã¨ã—ã¦è¨­å®šã•ã‚Œã¦ã„る制é™ã‚’超ãˆã¾ã—ãŸã€‚
å°‘ã—時間をãŠã„ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦æ“作ã—ã¦ãã ã•ã„。',
'protectedpagetext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ç·¨é›†ã§ããªã„よã†ã«ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'viewsourcetext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚½ãƒ¼ã‚¹ã‚’閲覧ã—ã€ã‚³ãƒ”ーã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼š',
+'viewyourtext' => "ã“ã®ãƒšãƒ¼ã‚¸ã«å¯¾ã™ã‚‹'''ã‚ãªãŸã®ç·¨é›†'''ã®ã‚½ãƒ¼ã‚¹ã‚’閲覧ã—ã€ã‚³ãƒ”ーã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼š",
'protectedinterface' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒä¿å­˜ã•ã‚Œã¦ãŠã‚Šã€ã„ãŸãšã‚‰ãªã©ã®é˜²æ­¢ã®ãŸã‚ã«ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'editinginterface' => "'''警告:'''ソフトウェアã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ä½¿ç”¨ã•ã‚Œã¦ã„るテキストを編集ã—ã¦ã„ã¾ã™ã€‚
ã“ã®ãƒšãƒ¼ã‚¸ã®å¤‰æ›´ã¯ã™ã¹ã¦ã®åˆ©ç”¨è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã«å½±éŸ¿ã—ã¾ã™ã€‚
@@ -834,6 +841,7 @@ $2',
'emailconfirmlink' => 'メールアドレスを確èªã™ã‚‹',
'invalidemailaddress' => '入力ã•ã‚ŒãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæ­£ã—ã„å½¢å¼ã«å¾“ã£ã¦ã„ãªã„ãŸã‚ã€å—ã‘付ã‘られã¾ã›ã‚“。
æ­£ã—ã„å½¢å¼ã§å…¥åŠ›ã—ç›´ã™ã‹ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹æ¬„を空ã«ã—ã¦ãŠã„ã¦ãã ã•ã„。',
+'cannotchangeemail' => 'ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’変更ã§ãã¾ã›ã‚“。',
'accountcreated' => 'アカウントを作æˆã—ã¾ã—ãŸ',
'accountcreatedtext' => '利用者アカウント:$1ãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚',
'createaccount-title' => '{{SITENAME}}ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆ',
@@ -850,6 +858,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHPã®mail()関数ã§ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼',
+'user-mail-no-addy' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãªã—ã§ã€é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—よã†ã¨ã—ã¾ã—ãŸã€‚',
# Change password dialog
'resetpass' => 'パスワードã®å¤‰æ›´',
@@ -872,16 +881,18 @@ $2',
'resetpass-temp-password' => '仮パスワード:',
# Special:PasswordReset
-'passwordreset' => 'パスワードã®å†è¨­å®š',
-'passwordreset-text' => 'ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«å›žç­”ã™ã‚‹ã¨ã€ã”自身ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è©³ç´°ãŒé›»å­ãƒ¡ãƒ¼ãƒ«ã§é€šçŸ¥ã•ã‚Œã¾ã™ã€‚',
-'passwordreset-legend' => 'パスワードã®å†è¨­å®š',
-'passwordreset-disabled' => 'パスワードã®å†è¨­å®šã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||以下ã®ãƒ‡ãƒ¼ã‚¿ã®ã†ã¡ã®ã²ã¨ã¤ã‚’入力ã—ã¦ãã ã•ã„。}}',
-'passwordreset-username' => '利用者å:',
-'passwordreset-domain' => 'ドメイン:',
-'passwordreset-email' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹:',
-'passwordreset-emailtitle' => '{{SITENAME}}上ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è©³ç´°',
-'passwordreset-emailtext-ip' => 'ã©ãªãŸã‹ãŒï¼ˆãŠãらãã‚ãªãŸã€IP アドレス $1 )ã‚ãªãŸã® {{SITENAME}} ($4)
+'passwordreset' => 'パスワードã®å†è¨­å®š',
+'passwordreset-text' => 'ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«å›žç­”ã™ã‚‹ã¨ã€ã”自身ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è©³ç´°ãŒé›»å­ãƒ¡ãƒ¼ãƒ«ã§é€šçŸ¥ã•ã‚Œã¾ã™ã€‚',
+'passwordreset-legend' => 'パスワードã®å†è¨­å®š',
+'passwordreset-disabled' => 'パスワードã®å†è¨­å®šã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'passwordreset-pretext' => '{{PLURAL:$1||以下ã®ãƒ‡ãƒ¼ã‚¿ã®ã†ã¡ã®ã²ã¨ã¤ã‚’入力ã—ã¦ãã ã•ã„。}}',
+'passwordreset-username' => '利用者å:',
+'passwordreset-domain' => 'ドメイン:',
+'passwordreset-capture' => 'é€ã‚‰ã‚Œã‚‹ãƒ¡ãƒ¼ãƒ«ã®å†…容を見ã¾ã™ã‹ï¼Ÿ',
+'passwordreset-capture-help' => 'ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€åˆ©ç”¨è€…ã«é€ã‚‰ã‚Œã‚‹ãƒ¡ãƒ¼ãƒ«ã®å†…容(一時的ãªãƒ‘スワードをå«ã‚€ï¼‰ã‚’ã‚ãªãŸã‚‚見るã“ã¨ãŒã§ãã¾ã™ã€‚',
+'passwordreset-email' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹:',
+'passwordreset-emailtitle' => '{{SITENAME}}上ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è©³ç´°',
+'passwordreset-emailtext-ip' => 'ã©ãªãŸã‹ãŒï¼ˆãŠãらãã‚ãªãŸã€IP アドレス $1 )ã‚ãªãŸã® {{SITENAME}} ($4)
ã«ãŠã‘るアカウントã®è©³ç´°æƒ…報をé€ä¿¡ã™ã‚‹ã‚ˆã†ç”³è«‹ã•ã‚Œã¾ã—ãŸã€‚
下記ã®åˆ©ç”¨è€…{{PLURAL:$3|アカウント}}ãŒã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ç´ä»˜ã‘られã¦ã„ã¾ã™ã€‚
@@ -892,7 +903,7 @@ $2
ã“ã®ç”³è«‹ãŒä»–ã®ã ã‚Œã‹ã«ã‚ˆã‚‹ã‚‚ã®ã§ã‚ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã‚ãªãŸãŒè‡ªèº«ã®å…ƒã€…ã®ãƒ‘スワードを
覚ãˆã¦ãŠã‚Šã€å¤‰ãˆãŸããªã„å ´åˆã«ã¯ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視ã—ã¦
以å‰ã®ãƒ‘スワードを使ã„続ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
-'passwordreset-emailtext-user' => '{{SITENAME}} ã®åˆ©ç”¨è€… $1 ãŒã‚ãªãŸã® {{SITENAME}} ($4)
+'passwordreset-emailtext-user' => '{{SITENAME}} ã®åˆ©ç”¨è€… $1 ãŒã‚ãªãŸã® {{SITENAME}} ($4)
ã«ãŠã‘るアカウントã®è©³ç´°æƒ…報をé€ä¿¡ã™ã‚‹ã‚ˆã†ç”³è«‹ã•ã‚Œã¾ã—ãŸã€‚
下記ã®åˆ©ç”¨è€…{{PLURAL:$3|アカウント}}ãŒã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ç´ä»˜ã‘られã¦ã„ã¾ã™ã€‚
@@ -903,9 +914,22 @@ $2
ã“ã®ç”³è«‹ãŒä»–ã®ã ã‚Œã‹ã«ã‚ˆã‚‹ã‚‚ã®ã§ã‚ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã‚ãªãŸãŒè‡ªèº«ã®å…ƒã€…ã®ãƒ‘スワードを
覚ãˆã¦ãŠã‚Šã€å¤‰ãˆãŸããªã„å ´åˆã«ã¯ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視ã—ã¦
以å‰ã®ãƒ‘スワードを使ã„続ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
-'passwordreset-emailelement' => '利用者å: $1
+'passwordreset-emailelement' => '利用者å: $1
仮パスワード: $2',
-'passwordreset-emailsent' => '確èªã®ãƒ¡ãƒ¼ãƒ«ãŒé€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚',
+'passwordreset-emailsent' => '確èªã®ãƒ¡ãƒ¼ãƒ«ãŒé€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚',
+'passwordreset-emailsent-capture' => '確èªã®ãƒ¡ãƒ¼ãƒ«ãŒé€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚以下ã«è¡¨ç¤ºã—ã¾ã™ã€‚',
+'passwordreset-emailerror-capture' => '生æˆã•ã‚ŒãŸç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’以下ã«è¡¨ç¤ºã—ã¦ã„ã¾ã™ãŒã€åˆ©ç”¨è€…ã¸ã®é€ä¿¡ã«ã¯å¤±æ•—ã—ã¾ã—ãŸ: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'メールアドレスã®å¤‰æ›´',
+'changeemail-header' => 'アカウントã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’変更',
+'changeemail-text' => 'ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã¸å…¥åŠ›ã™ã‚‹ã“ã¨ã§ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚メールアドレスã®å¤‰æ›´ã‚’完了ã™ã‚‹ãŸã‚ã«ã¯ã€ãƒ‘スワードを入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'changeemail-no-info' => 'ã“ã®ãƒšãƒ¼ã‚¸ã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'changeemail-oldemail' => 'ç¾åœ¨ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼š',
+'changeemail-newemail' => 'æ–°ã—ã„メールアドレス:',
+'changeemail-none' => '(ãªã—)',
+'changeemail-submit' => 'メールアドレスを変更',
+'changeemail-cancel' => '中止',
# Edit page toolbar
'bold_sample' => '太字',
@@ -977,9 +1001,6 @@ $1ã¾ãŸã¯ä»–ã®[[{{MediaWiki:Grouppage-sysop}}|管ç†è€…]]ã«ã“ã®ä»¶ã«ã¤ã
ç¾åœ¨åˆ©ç”¨ä¸­ã®IPアドレスã¯$3 ã€ã“ã®ãƒ–ロックIDã¯&#x23;$5ã§ã™ã€‚
å•ã„åˆã‚ã›ã‚’è¡Œã†éš›ã«ã¯ã€ã“ã®æƒ…報を必ãšæ›¸ã„ã¦ãã ã•ã„。",
'blockednoreason' => 'ç†ç”±ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“',
-'blockedoriginalsource' => "以下ã«'''$1'''ã®ã‚½ãƒ¼ã‚¹ã‚’示ã—ã¾ã™ï¼š",
-'blockededitsource' => "'''$1'''ã¸ã®'''編集'''を以下ã«ç¤ºã—ã¾ã™ï¼š",
-'whitelistedittitle' => '編集ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ãŒå¿…è¦',
'whitelistedittext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯$1ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'confirmedittext' => 'ページã®ç·¨é›†ã‚’始ã‚ã‚‹å‰ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç¢ºèªã‚’ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
[[Special:Preferences|個人設定]]ã§ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã€ç¢ºèªã‚’è¡Œã£ã¦ãã ã•ã„。',
@@ -1071,7 +1092,7 @@ IPアドレスã¯è¤‡æ•°ã®åˆ©ç”¨è€…ã®é–“ã§å…±æœ‰ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒã‚ã‚Š
自信ã®æŠ•ç¨¿ãŒä»–人ã«ã‚ˆã£ã¦é æ…®ãªã編集ã•ã‚Œã‚‹ã“ã¨ã‚’望ã¾ãªã„å ´åˆã¯ã€ã“ã“ã«ã¯æŠ•ç¨¿ã—ãªã„ã§ãã ã•ã„。<br />
ã¾ãŸã€æŠ•ç¨¿ã•ã‚Œã‚‹ã‚‚ã®ã¯ã€è‡ªèº«ã«ã‚ˆã£ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ã‹ã€ãƒ‘ブリック・ドメインã€ã¾ãŸã¯ãã‚Œã«é¡žã™ã‚‹ãƒ•ãƒªãƒ¼ãªè³‡æ–™ã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’ç´„æŸã—ã¦ãã ã•ã„(詳細ã¯$1ã‚’å‚照)。
'''著作権ä¿è­·ã•ã‚Œã¦ã„る作å“ã‚’ã€è¨±è«¾ãªã—ã«æŠ•ç¨¿ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ï¼'''",
-'longpageerror' => "'''エラー:投稿ã•ã‚ŒãŸæ–‡ç« ã¯ã¯$1キロãƒã‚¤ãƒˆã®é•·ã•ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯æŠ•ç¨¿ã§ãる最大ã®é•·ã•ã§ã‚ã‚‹$2キロãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ã€‚'''
+'longpageerror' => "'''エラー:投稿ã•ã‚ŒãŸæ–‡ç« ã¯ {{PLURAL:$1|1キロãƒã‚¤ãƒˆ|$1キロãƒã‚¤ãƒˆ}}ã®é•·ã•ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯æŠ•ç¨¿ã§ãる最大ã®é•·ã•ã§ã‚ã‚‹{{PLURAL:$2|$2キロãƒã‚¤ãƒˆ|$2キロãƒã‚¤ãƒˆ}}を超ãˆã¦ã„ã¾ã™ã€‚'''
ã“ã®ç·¨é›†ã¯ä¿å­˜ã§ãã¾ã›ã‚“。",
'readonlywarning' => "'''警告:データベースãŒãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ç¾åœ¨ã¯ç·¨é›†ã‚’ä¿å­˜ã§ãã¾ã›ã‚“。'''
å¿…è¦ã§ã‚ã‚Œã°æ–‡ç« ã‚’カットアンドペーストã—ã¦ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¿å­˜ã—ã€å¾Œã»ã©ä¿å­˜ã‚’ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。
@@ -1241,8 +1262,6 @@ $3ãŒç¤ºã—ãŸç†ç”±ã¯ ''$2'' ã§ã™ã€‚",
'revdelete-unsuppress' => '復元版ã«å¯¾ã™ã‚‹åˆ¶é™ã‚’除去',
'revdelete-log' => 'ç†ç”±ï¼š',
'revdelete-submit' => 'é¸æŠžã—ãŸ{{PLURAL:$1|版}}ã«é©ç”¨',
-'revdelete-logentry' => '「[[$1]]ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ',
-'logdelete-logentry' => '「[[$1]]ã€ã®æ“作ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ',
'revdelete-success' => "'''版ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚'''",
'revdelete-failure' => "'''版ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š'''
$1",
@@ -1254,15 +1273,6 @@ $1",
'revdel-restore-visible' => '閲覧å¯èƒ½ãªç‰ˆ',
'pagehist' => 'ページã®å±¥æ­´',
'deletedhist' => '削除ã•ã‚ŒãŸå±¥æ­´',
-'revdelete-content' => '本文',
-'revdelete-summary' => '編集内容ã®è¦ç´„',
-'revdelete-uname' => '利用者å',
-'revdelete-restricted' => '管ç†è€…ã«å¯¾ã™ã‚‹åˆ¶é™ã®é©ç”¨',
-'revdelete-unrestricted' => '管ç†è€…ã«å¯¾ã™ã‚‹åˆ¶é™ã®é™¤åŽ»',
-'revdelete-hid' => '$1ã‚’éš ã—ã¾ã—ãŸ',
-'revdelete-unhid' => '$1ã®ç‰ˆæŒ‡å®šå‰Šé™¤ã‚’解除ã—ã¾ã—ãŸ',
-'revdelete-log-message' => '$2版ã«å¯¾ã—ã¦$1',
-'logdelete-log-message' => '$2ã®{{PLURAL:$2|æ“作}}ã«å¯¾ã—ã¦$1',
'revdelete-hide-current' => '$1$2ã®é …ç›®ã®éžè¡¨ç¤ºã«å¤±æ•—ã—ã¾ã—ãŸï¼šã“ã‚Œã¯æœ€æ–°ç‰ˆã§ã‚ã‚‹ãŸã‚。
éš ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。',
'revdelete-show-no-access' => '$1$2ã®é …ç›®ã®è¡¨ç¤ºã«å¤±æ•—ã—ã¾ã—ãŸï¼šã“ã®é …ç›®ã¯ã€Œåˆ¶é™ä»˜ãã€ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
@@ -1423,12 +1433,14 @@ $1",
'prefs-rc' => '最近ã®æ›´æ–°',
'prefs-watchlist' => 'ウォッãƒãƒªã‚¹ãƒˆ',
'prefs-watchlist-days' => 'ウォッãƒãƒªã‚¹ãƒˆã«è¡¨ç¤ºã™ã‚‹æ—¥æ•°ï¼š',
-'prefs-watchlist-days-max' => '(最大7日間)',
+'prefs-watchlist-days-max' => '最大$1{{PLURAL:$1|日|日間}}',
'prefs-watchlist-edits' => '拡張ウォッãƒãƒªã‚¹ãƒˆã«è¡¨ç¤ºã™ã‚‹ä»¶æ•°ï¼š',
'prefs-watchlist-edits-max' => '最大数:1000',
'prefs-watchlist-token' => 'ウォッãƒãƒªã‚¹ãƒˆã®ãƒˆãƒ¼ã‚¯ãƒ³ï¼š',
'prefs-misc' => 'ãã®ä»–',
'prefs-resetpass' => 'パスワードã®å¤‰æ›´',
+'prefs-changeemail' => 'メールアドレスを変更',
+'prefs-setemail' => 'メールアドレスを設定',
'prefs-email' => 'メールã®è¨­å®š',
'prefs-rendering' => '表示',
'saveprefs' => 'ä¿å­˜',
@@ -1488,6 +1500,7 @@ $1",
'yourrealname' => '本å:',
'yourlanguage' => '使用言語:',
'yourvariant' => 'コンテンツ言語変種:',
+'prefs-help-variant' => 'ã‚ãªãŸãŒã“ã®ã‚¦ã‚£ã‚­ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«è¡¨ç¤ºã«ä½¿ã„ãŸã„言語変種ã¾ãŸã¯æ­£æ›¸æ³•',
'yournick' => 'æ–°ã—ã„ç½²å:',
'prefs-help-signature' => 'トークページ上ã§ã®ç™ºè¨€ã«ã¯ã€Œ<nowiki>~~~~</nowiki>ã€ã¨ä»˜ã‘ã¦ç½²åã™ã‚‹ã¹ãã§ã™ã€‚ã“ã‚Œã¯è‡ªåˆ†ã®ç½²åã«æ™‚刻å°ã‚’付加ã—ãŸã‚‚ã®ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚',
'badsig' => 'ç½²å用ã®ã‚½ãƒ¼ã‚¹ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。
@@ -1529,7 +1542,7 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'userrights-lookup-user' => '利用者グループを管ç†',
'userrights-user-editname' => '利用者åを入力:',
'editusergroup' => '利用者グループを編集',
-'editinguser' => "利用者'''[[User:$1|$1]]'''([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])ã®æ¨©é™ã‚’変更",
+'editinguser' => "利用者''' [[User:$1|$1]]''' $2 ã®æ¨©é™ã‚’変更",
'userrights-editusergroup' => '利用者グループを編集',
'saveusergroups' => '利用者グループをä¿å­˜',
'userrights-groupsmember' => '所属グループ:',
@@ -1623,13 +1636,13 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'right-autopatrol' => '自分ã®ç·¨é›†ã‚’自動的ã«å·¡å›žæ¸ˆã¿ã«ã™ã‚‹',
'right-patrolmarks' => '最近ã®æ›´æ–°ã§å·¡å›žæ¸ˆã¿å°ã‚’閲覧',
'right-unwatchedpages' => 'ウォッãƒã•ã‚Œã¦ã„ãªã„ページ一覧ã®é–²è¦§',
-'right-trackback' => 'トラックãƒãƒƒã‚¯ã®æŠ•ç¨¿',
'right-mergehistory' => 'ページ履歴ã®çµ±åˆ',
'right-userrights' => '全利用者権é™ã®ç·¨é›†',
'right-userrights-interwiki' => 'ä»–ã®ã‚¦ã‚£ã‚­ã®åˆ©ç”¨è€…ã®åˆ©ç”¨è€…権é™ã®ç·¨é›†',
'right-siteadmin' => 'データベースã®ãƒ­ãƒƒã‚¯ãŠã‚ˆã³ãƒ­ãƒƒã‚¯è§£é™¤',
'right-override-export-depth' => 'リンク先ページを5階層ã¾ã§å«ã‚ã¦æ›¸ã出ã™',
'right-sendemail' => 'ä»–ã®åˆ©ç”¨è€…ã¸é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹',
+'right-passwordreset' => 'パスワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’閲覧ã™ã‚‹',
# User rights log
'rightslog' => '利用者権é™å¤‰æ›´è¨˜éŒ²',
@@ -1663,16 +1676,17 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'action-suppressionlog' => 'ã“ã®éžå…¬é–‹è¨˜éŒ²ã®è¡¨ç¤º',
'action-block' => 'ã“ã®åˆ©ç”¨è€…ã®ç·¨é›†ã‚’ブロック',
'action-protect' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®ä¿è­·ãƒ¬ãƒ™ãƒ«ã®å¤‰æ›´',
+'action-rollback' => '特定ページを最後ã«ç·¨é›†ã—ãŸåˆ©ç”¨è€…ã®ç·¨é›†ã®å³æ™‚å·»ã戻ã—',
'action-import' => 'ä»–ã®ã‚¦ã‚£ã‚­ã‹ã‚‰ã®ã“ã®ãƒšãƒ¼ã‚¸ã®å–ã‚Šè¾¼ã¿',
'action-importupload' => 'ファイルアップロードã‹ã‚‰ã“ã®ãƒšãƒ¼ã‚¸ã®å–ã‚Šè¾¼ã¿',
'action-patrol' => 'ä»–ã®åˆ©ç”¨è€…ã®ç·¨é›†ã‚’巡回済ã¿ã«ã™ã‚‹',
'action-autopatrol' => '自身ã®ç·¨é›†ã‚’巡回済ã¿ã«ã™ã‚‹',
'action-unwatchedpages' => 'ウォッãƒã•ã‚Œã¦ã„ãªã„ページ一覧ã®è¡¨ç¤º',
-'action-trackback' => 'トラックãƒãƒƒã‚¯ã®æŠ•ç¨¿',
'action-mergehistory' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®å±¥æ­´çµ±åˆ',
'action-userrights' => '全利用者権é™ã®å¤‰æ›´',
'action-userrights-interwiki' => 'ä»–ã®ã‚¦ã‚£ã‚­ä¸Šã®åˆ©ç”¨è€…ã®åˆ©ç”¨è€…権é™å¤‰æ›´',
'action-siteadmin' => 'データベースã®ãƒ­ãƒƒã‚¯ã‚‚ã—ãã¯ãƒ­ãƒƒã‚¯è§£é™¤',
+'action-sendemail' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡',
# Recent changes
'nchanges' => '$1回ã®å¤‰æ›´',
@@ -1705,6 +1719,7 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'number_of_watching_users_pageview' => '[$1人ã®åˆ©ç”¨è€…ãŒã‚¦ã‚©ãƒƒãƒã—ã¦ã„ã¾ã™]',
'rc_categories' => 'カテゴリをé™å®šï¼ˆã€Œ|ã€ã§åŒºåˆ‡ã‚‹ï¼‰',
'rc_categories_any' => 'ã™ã¹ã¦',
+'rc-change-size-new' => '変更後ã¯$1ãƒã‚¤ãƒˆ',
'newsectionsummary' => '/* $1 */ æ–°ã—ã„節',
'rc-enhanced-expand' => '詳細を表示(JavaScriptãŒå¿…è¦ï¼‰',
'rc-enhanced-hide' => '詳細をéžè¡¨ç¤º',
@@ -1759,6 +1774,7 @@ HTMLタグを見直ã—ã¦ãã ã•ã„。',
'minlength1' => 'ファイルåã¯1文字以上ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'illegalfilename' => 'ファイルå「$1ã€ã«ãƒšãƒ¼ã‚¸åã¨ã—ã¦è¨±å¯ã•ã‚Œã¦ã„ãªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
ファイルåを変更ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ã‚¢ãƒƒãƒ—ロードã—ã¦ãã ã•ã„。',
+'filename-toolong' => '240ãƒã‚¤ãƒˆã‚’超ãˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'badfilename' => 'ファイルåã¯ã€Œ$1ã€ã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'filetype-mime-mismatch' => 'ファイルã®æ‹¡å¼µå­ã€Œ$1ã€ãŒMIMEタイプ「$2ã€ã¨ä¸€è‡´ã—ã¾ã›ã‚“。',
'filetype-badmime' => 'MIMEタイプ「$1ã€ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロードã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
@@ -1876,6 +1892,26 @@ $1',
'upload-unknown-size' => 'サイズä¸æ˜Ž',
'upload-http-error' => 'HTTPエラー発生:$1',
+# File backend
+'backend-fail-stream' => 'ファイル $1 をストリームã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-backup' => 'ファイル $1 ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-notexists' => 'ファイル $1 ã¯å­˜åœ¨ã—ã¾ã›ã‚“。',
+'backend-fail-notsame' => 'ファイルå $1 ã¯ã™ã§ã«é•ã†ãƒ•ã‚¡ã‚¤ãƒ«ãŒä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚',
+'backend-fail-invalidpath' => '$1 ã¯ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ‘スã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。',
+'backend-fail-delete' => 'ファイル $1 を削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-alreadyexists' => 'ファイル $1 ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚',
+'backend-fail-store' => 'ファイル $1 ã‚’ $2 ã«æ ¼ç´ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-copy' => 'ファイル $1 ã‚’ $2 ã«ã‚³ãƒ”ーã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-move' => 'ファイル $1 ã‚’ $2 ã«ç§»å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-opentemp' => '一時ファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-writetemp' => '一時ファイルã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-closetemp' => '一時ファイルを閉ã˜ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-read' => 'ファイル $1 を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-create' => 'ファイル $1 を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-readonly' => 'ストレージãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã€Œ$1ã€ã¯ç¾åœ¨èª­ã¿å–り専用ã§ã™ã€‚ç†ç”±:「$2ã€',
+'backend-fail-synced' => 'ファイル「$1ã€ã¯ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å†…部ã«ãŠã„ã¦ä¸ä¸€è‡´ã®çŠ¶æ…‹ã«ã‚ã‚Šã¾ã™ã€‚',
+'backend-fail-contenttype' => '「$1ã€ã«ä¿å­˜ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žãŒåˆ¤æ–­ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ZIPã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã£ãŸéš›ã«ã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚',
'zip-wrong-format' => '指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ZIPファイルã§ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
@@ -1892,6 +1928,7 @@ $1',
'uploadstash-badtoken' => '実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã‚Œã¯ã€ç·¨é›†ã™ã‚‹ãŸã‚ã®èªè¨¼ãŒç„¡åŠ¹ã«ãªã£ãŸãŸã‚ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚å†åº¦ãŠè©¦ã—ãã ã•ã„。',
'uploadstash-errclear' => 'ファイルã®æ¶ˆåŽ»ã«å¤±æ•—ã—ã¾ã—ãŸã€‚',
'uploadstash-refresh' => 'ファイルã®ä¸€è¦§ã‚’æ›´æ–°',
+'invalid-chunk-offset' => 'ä¸æ­£ãªãƒãƒ£ãƒ³ã‚¯ã‚ªãƒ•ã‚»ãƒƒãƒˆ',
# img_auth script messages
'img-auth-accessdenied' => 'アクセスãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ',
@@ -2001,23 +2038,24 @@ URLãŒæ­£ã—ã„ã‚‚ã®ã§ã‚ã‚Šã€ã‚¦ã‚§ãƒ–サイトãŒç¨¼åƒã—ã¦ã„ã‚‹ã“ã¨ã‚
'filerevert-badversion' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«æŒ‡å®šã•ã‚ŒãŸæ™‚刻å°ã‚’æŒã¤éŽåŽ»ã®ç‰ˆã¯ã‚ã‚Šã¾ã›ã‚“。',
# File deletion
-'filedelete' => '$1ã®å‰Šé™¤',
-'filedelete-legend' => 'ファイルã®å‰Šé™¤',
-'filedelete-intro' => "'''[[Media:$1|$1]]'''ã‚’ã™ã¹ã¦ã®å±¥æ­´ã¨ã¨ã‚‚ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚",
-'filedelete-intro-old' => "'''[[Media:$1|$1]]'''ã®[$4 $2$3ã®ç‰ˆ]を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚",
-'filedelete-comment' => 'ç†ç”±ï¼š',
-'filedelete-submit' => '削除',
-'filedelete-success' => "'''$1''' ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚",
-'filedelete-success-old' => "'''[[Media:$1|$1]]'''ã®$2$3ã®ç‰ˆã¯å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚",
-'filedelete-nofile' => "'''$1'''ã¯å­˜åœ¨ã—ã¾ã›ã‚“。",
-'filedelete-nofile-old' => "指定ã•ã‚ŒãŸå±žæ€§ã‚’æŒã¤'''$1'''ã®å¤ã„版ã¯å­˜åœ¨ã—ã¾ã›ã‚“。",
-'filedelete-otherreason' => 'ä»–ã®ã€ã¾ãŸã¯è¿½åŠ ã®ç†ç”±ï¼š',
-'filedelete-reason-otherlist' => 'ãã®ä»–ã®ç†ç”±',
-'filedelete-reason-dropdown' => '*よãã‚る削除ç†ç”±
+'filedelete' => '$1ã®å‰Šé™¤',
+'filedelete-legend' => 'ファイルã®å‰Šé™¤',
+'filedelete-intro' => "'''[[Media:$1|$1]]'''ã‚’ã™ã¹ã¦ã®å±¥æ­´ã¨ã¨ã‚‚ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚",
+'filedelete-intro-old' => "'''[[Media:$1|$1]]'''ã®[$4 $2$3ã®ç‰ˆ]を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚",
+'filedelete-comment' => 'ç†ç”±ï¼š',
+'filedelete-submit' => '削除',
+'filedelete-success' => "'''$1''' ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚",
+'filedelete-success-old' => "'''[[Media:$1|$1]]'''ã®$2$3ã®ç‰ˆã¯å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚",
+'filedelete-nofile' => "'''$1'''ã¯å­˜åœ¨ã—ã¾ã›ã‚“。",
+'filedelete-nofile-old' => "指定ã•ã‚ŒãŸå±žæ€§ã‚’æŒã¤'''$1'''ã®å¤ã„版ã¯å­˜åœ¨ã—ã¾ã›ã‚“。",
+'filedelete-otherreason' => 'ä»–ã®ã€ã¾ãŸã¯è¿½åŠ ã®ç†ç”±ï¼š',
+'filedelete-reason-otherlist' => 'ãã®ä»–ã®ç†ç”±',
+'filedelete-reason-dropdown' => '*よãã‚る削除ç†ç”±
** 著作権侵害
** é‡è¤‡ãƒ•ã‚¡ã‚¤ãƒ«',
-'filedelete-edit-reasonlist' => '削除ç†ç”±ã‚’編集ã™ã‚‹',
-'filedelete-maintenance' => 'メンテナンス中ã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®å‰Šé™¤ã¨å¾©å¸°ã¯ä¸€æ™‚çš„ã«ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'filedelete-edit-reasonlist' => '削除ç†ç”±ã‚’編集ã™ã‚‹',
+'filedelete-maintenance' => 'メンテナンス中ã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®å‰Šé™¤ã¨å¾©å¸°ã¯ä¸€æ™‚çš„ã«ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'filedelete-maintenance-title' => 'ファイルを削除ã§ãã¾ã›ã‚“',
# MIME search
'mimesearch' => 'MIMEタイプ検索',
@@ -2125,6 +2163,7 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'mostimages' => '被リンク数ã®å¤šã„ファイル',
'mostrevisions' => '版ã®å¤šã„ページ',
'prefixindex' => '先頭ãŒåŒã˜å…¨ãƒšãƒ¼ã‚¸',
+'prefixindex-namespace' => '先頭ãŒåŒã˜å…¨ãƒšãƒ¼ã‚¸ï¼ˆ$1åå‰ç©ºé–“)',
'shortpages' => '短ã„ページ',
'longpages' => 'é•·ã„ページ',
'deadendpages' => 'è¡Œãæ­¢ã¾ã‚Šãƒšãƒ¼ã‚¸',
@@ -2141,7 +2180,7 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'listusers-editsonly' => '投稿記録ã®ã‚る利用者ã®ã¿ã‚’表示',
'listusers-creationsort' => '作æˆæ—¥é †ã«æ•´åˆ—',
'usereditcount' => '$1回ã®ç·¨é›†',
-'usercreated' => '$1$2ã«ä½œæˆ',
+'usercreated' => '$1 $2 ã«{{GENDER:$3|作æˆ}}',
'newpages' => 'æ–°ã—ã„ページ',
'newpages-username' => '利用者å:',
'ancientpages' => '最å¤ã®ãƒšãƒ¼ã‚¸',
@@ -2235,12 +2274,8 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'activeusers-noresult' => '利用者ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
# Special:Log/newusers
-'newuserlogpage' => 'アカウント作æˆè¨˜éŒ²',
-'newuserlogpagetext' => '以下ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã®è¨˜éŒ²ã§ã™ã€‚',
-'newuserlog-byemail' => 'パスワードを電å­ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã—ã¾ã—ãŸ',
-'newuserlog-create-entry' => 'æ–°è¦åˆ©ç”¨è€…アカウント',
-'newuserlog-create2-entry' => 'ãŒæ–°è¦ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ $1 を作æˆã—ã¾ã—ãŸ',
-'newuserlog-autocreate-entry' => 'アカウントãŒè‡ªå‹•çš„ã«ä½œæˆã•ã‚Œã¾ã—ãŸ',
+'newuserlogpage' => 'アカウント作æˆè¨˜éŒ²',
+'newuserlogpagetext' => '以下ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã®è¨˜éŒ²ã§ã™ã€‚',
# Special:ListGroupRights
'listgrouprights' => '利用者グループã®æ¨©é™',
@@ -2269,7 +2304,7 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'emailpagetext' => '下ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’通ã˜ã¦ã€ã“ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
å—信者ãŒç›´æŽ¥è¿”事を出ã›ã‚‹ã‚ˆã†ã€[[Special:Preferences|利用者ã®å€‹äººè¨­å®š]]ã§ç™»éŒ²ã—ãŸé›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒãƒ¡ãƒ¼ãƒ«ä¸­ã§ã€Œå·®å‡ºäººã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ã—ã¦è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚',
'usermailererror' => 'メールãŒä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã—ãŸï¼š',
-'defemailsubject' => '{{SITENAME}} é›»å­ãƒ¡ãƒ¼ãƒ«',
+'defemailsubject' => '利用者「$1ã€ã‹ã‚‰ã® {{SITENAME}} é›»å­ãƒ¡ãƒ¼ãƒ«',
'usermaildisabled' => '利用者メール機能ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™',
'usermaildisabledtext' => 'ã“ã®ã‚¦ã‚£ã‚­ä¸Šã§ä»–ã®åˆ©ç”¨è€…ã¸ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。',
'noemailtitle' => 'メールアドレスãŒã‚ã‚Šã¾ã›ã‚“',
@@ -2323,7 +2358,7 @@ contenttype/subtypeã®å½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„(例:<tt>image/jpeg</
'watchmethod-list' => 'ウォッãƒã•ã‚Œã¦ã„るページ内ã®æœ€è¿‘ã®æ›´æ–°ã‚’確èªä¸­',
'watchlistcontains' => 'ウォッãƒãƒªã‚¹ãƒˆã«ã¯ã€$1ページãŒç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'iteminvalidname' => '項目「$1ã€ã¯å•é¡ŒãŒã‚ã‚Šã¾ã™ã€åå‰ãŒä¸æ­£ã§ã™ãƒ»ãƒ»ãƒ»',
-'wlnote' => "以下ã¯æœ€è¿‘'''$2'''時間ã«ãŠã‘ã‚‹ã€æœ€ã‚‚æ–°ã—ã„'''$1'''編集ã§ã™ã€‚",
+'wlnote' => "$3 $4ã¾ã§ã®{{PLURAL:$2|'''$2'''時間}}ã«ãªã•ã‚ŒãŸ'''$1'''件ã®å¤‰æ›´ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã§ã™ã€‚",
'wlshowlast' => '次ã®æœŸé–“ã§è¡¨ç¤ºï¼š$1時間ã€$2日間ã€$3',
'watchlist-options' => 'ウォッãƒãƒªã‚¹ãƒˆã®ã‚ªãƒ—ション',
@@ -2388,8 +2423,6 @@ $UNWATCHURL
'actionfailed' => 'æ“作失敗',
'deletedtext' => '「$1ã€ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚
最近ã®å‰Šé™¤ã«é–¢ã—ã¦ã¯ã€$2ã‚’å‚ç…§ã—ã¦ãã ã•ã„。',
-'deletedarticle' => '「[[$1]]ã€ã‚’削除ã—ã¾ã—ãŸ',
-'suppressedarticle' => '「[[$1]]ã€ã‚’隠蔽ã—ã¾ã—ãŸ',
'dellogpage' => '削除記録',
'dellogpagetext' => '以下ã¯ã€æœ€è¿‘ã®å‰Šé™¤ã¨å¾©å¸°ã®ä¸€è¦§ã§ã™ã€‚',
'deletionlog' => '削除記録',
@@ -2440,7 +2473,10 @@ $2ã«ã‚ˆã‚‹æœ€å¾Œã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'unprotectedarticle' => '「[[$1]]ã€ã®ä¿è­·ã‚’解除ã—ã¾ã—ãŸ',
'movedarticleprotection' => 'ä¿è­·ã®è¨­å®šã‚’「[[$2]]ã€ã‹ã‚‰ã€Œ[[$1]]ã€ã¸ç§»å‹•ã—ã¾ã—ãŸ',
'protect-title' => '「$1ã€ã®ä¿è­·ãƒ¬ãƒ™ãƒ«ã‚’変更',
+'protect-title-notallowed' => '「$1ã€ã®ä¿è­·ãƒ¬ãƒ™ãƒ«ã‚’表示',
'prot_1movedto2' => '[[$1]] ã‚’ [[$2]] ã¸ç§»å‹•',
+'protect-badnamespace-title' => 'ä¿è­·ä¸å¯èƒ½ãªåå‰ç©ºé–“',
+'protect-badnamespace-text' => 'ã“ã®åå‰ç©ºé–“ã®ãƒšãƒ¼ã‚¸ã¯ä¿è­·ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。',
'protect-legend' => 'ä¿è­·ã®ç¢ºèª',
'protectcomment' => 'ç†ç”±ï¼š',
'protectexpiry' => '有効期é™ï¼š',
@@ -2462,6 +2498,7 @@ $2ã«ã‚ˆã‚‹æœ€å¾Œã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'protect-level-sysop' => '管ç†è€…ã®ã¿',
'protect-summary-cascade' => '連続',
'protect-expiring' => '$1(UTC)ã§è‡ªå‹•çš„ã«è§£é™¤',
+'protect-expiring-local' => 'æœŸé™ $1',
'protect-expiry-indefinite' => '無期é™',
'protect-cascade' => 'ã“ã®ãƒšãƒ¼ã‚¸ã«èª­ã¿è¾¼ã¾ã‚Œã¦ã„るページをä¿è­·ã™ã‚‹ï¼ˆã‚«ã‚¹ã‚±ãƒ¼ãƒ‰ä¿è­·ï¼‰',
'protect-cantedit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®ç·¨é›†æ¨©é™ãŒãªã„ãŸã‚ã€ä¿è­·ãƒ¬ãƒ™ãƒ«ã‚’変更ã§ãã¾ã›ã‚“。',
@@ -2522,7 +2559,6 @@ $2ã«ã‚ˆã‚‹æœ€å¾Œã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'undeletereset' => 'リセット',
'undeleteinvert' => 'é¸æŠžã‚’å転',
'undeletecomment' => 'ç†ç”±ï¼š',
-'undeletedarticle' => '「[[$1]]ã€ã‚’復元ã—ã¾ã—ãŸ',
'undeletedrevisions' => '$1版を復元ã—ã¾ã—ãŸ',
'undeletedrevisions-files' => '$1版ã¨$2ファイルを復元ã—ã¾ã—ãŸ',
'undeletedfiles' => '$1ファイルを復帰ã—ã¾ã—ãŸ',
@@ -2532,6 +2568,7 @@ $2ã«ã‚ˆã‚‹æœ€å¾Œã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
最近ã®å‰Šé™¤ã¨å¾©å¸°ã®è¨˜éŒ²ã«ã¤ã„ã¦ã¯[[Special:Log/delete|削除記録]]ã‚’å‚ç…§ã—ã¦ãã ã•ã„。",
'undelete-header' => '最近削除ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã¯[[Special:Log/delete|削除記録]]ã§ç¢ºèªã§ãã¾ã™ã€‚',
+'undelete-search-title' => '削除ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã®æ¤œç´¢',
'undelete-search-box' => '削除ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’検索',
'undelete-search-prefix' => '表示を開始ã™ã‚‹ãƒšãƒ¼ã‚¸å:',
'undelete-search-submit' => '検索',
@@ -2541,6 +2578,7 @@ $2ã«ã‚ˆã‚‹æœ€å¾Œã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'undelete-cleanup-error' => '未使用ã®ä¿å­˜ç‰ˆã®ãƒ•ã‚¡ã‚¤ãƒ«ã€Œ$1ã€ã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
'undelete-missing-filearchive' => 'データベースã«å­˜åœ¨ã—ãªã„ãŸã‚ã€ID$1ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å­˜ç‰ˆã‚’復元ã§ãã¾ã›ã‚“。
æ—¢ã«å¾©å¸°ã•ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
+'undelete-error' => 'ページã®å¾©å¸°ã‚¨ãƒ©ãƒ¼',
'undelete-error-short' => 'ファイルã®å¾©å¸°ã‚¨ãƒ©ãƒ¼ï¼š$1',
'undelete-error-long' => 'ファイルã®å¾©å¸°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼š
@@ -2662,6 +2700,7 @@ $1',
'blocklist-userblocks' => 'アカウントã®ãƒ–ロックをéžè¡¨ç¤º',
'blocklist-tempblocks' => '有期ブロックをéžè¡¨ç¤º',
'blocklist-addressblocks' => 'å˜ä¸€IPã®ãƒ–ロックをéžè¡¨ç¤º',
+'blocklist-rangeblocks' => 'レンジブロックをéžè¡¨ç¤º',
'blocklist-timestamp' => 'タイムスタンプ',
'blocklist-target' => '対象',
'blocklist-expiry' => '期é™',
@@ -2684,6 +2723,7 @@ $1',
'unblocklink' => 'ブロックを解除',
'change-blocklink' => '設定を変更',
'contribslink' => '投稿記録',
+'emaillink' => 'é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚‹',
'autoblocker' => '使用中ã®IPアドレスãŒã€Œ[[User:$1|$1]]ã€ã«ä½¿ç”¨ã•ã‚ŒãŸãŸã‚ã€è‡ªå‹•ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚
$1ã®ãƒ–ロックã®ç†ç”±ã¯ã€Œ$2ã€ã§ã™ã€‚',
'blocklogpage' => 'ブロック記録',
@@ -2812,9 +2852,6 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'movepage-page-moved' => 'ページ$1ã¯$2ã¸ç§»å‹•ã•ã‚Œã¾ã—ãŸã€‚',
'movepage-page-unmoved' => 'ページ$1ã¯$2ã¸ç§»å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'movepage-max-pages' => '自動的ã«ç§»å‹•ã§ãã‚‹{{PLURAL:$1|ページ}}㯠$1件ã¾ã§ã§ã€ãれ以上ã¯ç§»å‹•ã•ã‚Œã¾ã›ã‚“。',
-'1movedto2' => '[[$1]]ã‚’[[$2]]ã¸ç§»å‹•',
-'1movedto2_redir' => '「[[$1]]ã€ã‚’ã“ã®ãƒšãƒ¼ã‚¸ã‚ã¦ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã€Œ[[$2]]ã€ã¸ç§»å‹•',
-'move-redirect-suppressed' => 'リダイレクトéžä½œæˆ',
'movelogpage' => '移動記録',
'movelogpagetext' => '以下ã¯å…¨ã¦ã®ãƒšãƒ¼ã‚¸ç§»å‹•ã®ä¸€è¦§ã§ã™ã€‚',
'movesubpage' => '{{PLURAL:$1|下ä½ãƒšãƒ¼ã‚¸}}',
@@ -2827,7 +2864,7 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
移動先「[[:$1]]ã€ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚
移動ã™ã‚‹ãŸã‚ã«ã“ã®ãƒšãƒ¼ã‚¸ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ',
'delete_and_move_confirm' => 'ページを削除ã—ã¾ã™',
-'delete_and_move_reason' => '移動ã®ãŸã‚ã«å‰Šé™¤',
+'delete_and_move_reason' => '「[[$1]]ã€ã‹ã‚‰ã®ç§»å‹•ã®ãŸã‚ã«å‰Šé™¤',
'selfmove' => '移動元ã¨ç§»å‹•å…ˆã®ãƒšãƒ¼ã‚¸åãŒåŒã˜ã§ã™ã€‚
自分自身ã¸ã¯ç§»å‹•ã§ãã¾ã›ã‚“。',
'immobile-source-namespace' => '$1åå‰ç©ºé–“ã®ãƒšãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。',
@@ -2861,6 +2898,7 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'exportcuronly' => '完全ãªå±¥æ­´ã¯å«ã‚ãšã€æœ€æ–°ç‰ˆã®ã¿ã‚’å«ã‚ã‚‹',
'exportnohistory' => "----
'''注æ„:'''è² è·ä¸Šã®ç†ç”±ã«ã‚ˆã‚Šã€ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«ã‚ˆã‚‹ãƒšãƒ¼ã‚¸ã®å®Œå…¨ãªå±¥æ­´ã®æ›¸ã出ã—ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚",
+'exportlistauthors' => 'å„ページã®æŠ•ç¨¿è€…ã®å®Œå…¨ãªä¸€è¦§ã‚’å«ã‚ã‚‹',
'export-submit' => '書ã出ã—',
'export-addcattext' => 'カテゴリã‹ã‚‰ãƒšãƒ¼ã‚¸ã‚’追加:',
'export-addcat' => '追加',
@@ -2941,6 +2979,8 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
'import-token-mismatch' => 'セッションデータをæ失ã—ã¾ã—ãŸã€‚
ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。',
'import-invalid-interwiki' => '指定ã•ã‚ŒãŸã‚¦ã‚£ã‚­ã‹ã‚‰å–ã‚Šè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'import-error-edit' => 'ã‚ãªãŸã«ãã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹è¨±å¯ãŒãªã„ãŸã‚ã€ãƒšãƒ¼ã‚¸ã€Œ$1ã€ã¯å–ã‚Šè¾¼ã¾ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚',
+'import-error-create' => 'ã‚ãªãŸã«ãã®ãƒšãƒ¼ã‚¸ã‚’作æˆã™ã‚‹è¨±å¯ãŒãªã„ãŸã‚ã€ãƒšãƒ¼ã‚¸ã€Œ$1ã€ã¯å–ã‚Šè¾¼ã¾ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚',
# Import log
'importlogpage' => 'å–ã‚Šè¾¼ã¿è¨˜éŒ²',
@@ -3115,9 +3155,6 @@ hideuser権é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックを閲
# Patrol log
'patrol-log-page' => '巡回記録',
'patrol-log-header' => '以下ã¯å·¡å›žã•ã‚ŒãŸç‰ˆã®è¨˜éŒ²ã§ã™ã€‚',
-'patrol-log-line' => '$2ã®$1を巡回$3',
-'patrol-log-auto' => '(自動)',
-'patrol-log-diff' => '$1版',
'log-show-hide-patrol' => '巡回記録を$1',
# Image deletion
@@ -3145,11 +3182,11 @@ $1',
'file-info' => 'ファイルサイズ:$1ã€MIMEタイプ:$2',
'file-info-size' => '$1×$2ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºï¼š$3ã€MIMEタイプ:$4',
'file-info-size-pages' => '$1 × $2 ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º: $3ã€MIMEタイプ: $4ã€$5ページ{{PLURAL:$5}}。',
-'file-nohires' => '<small>高解åƒåº¦ç‰ˆã¯ã‚ã‚Šã¾ã›ã‚“。</small>',
+'file-nohires' => '高解åƒåº¦ç‰ˆã¯ã‚ã‚Šã¾ã›ã‚“。',
'svg-long-desc' => 'SVGファイルã€$1×$2ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºï¼š$3',
'show-big-image' => '高解åƒåº¦ã§ã®ç”»åƒ',
-'show-big-image-preview' => '<small> ã“ã®ãƒ—レビューã®ã‚µã‚¤ã‚º: $1。</small>',
-'show-big-image-other' => '<small>ãã®ä»–ã®è§£åƒåº¦: $1。</small>',
+'show-big-image-preview' => ' ã“ã®ãƒ—レビューã®ã‚µã‚¤ã‚º: $1。',
+'show-big-image-other' => 'ãã®ä»–ã®{{PLURAL:$2|解åƒåº¦}}: $1。',
'show-big-image-size' => '$1 × $2 ピクセル',
'file-info-gif-looped' => 'ループã—ã¾ã™',
'file-info-gif-frames' => '$1フレーム',
@@ -3171,6 +3208,11 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1〠$2 × $3',
+'seconds' => '{{PLURAL:$1|$1秒}}',
+'minutes' => '{{PLURAL:$1|$1分}}',
+'hours' => '{{PLURAL:$1|$1時間}}',
+'days' => '{{PLURAL:$1|$1æ—¥}}',
+'ago' => '$1å‰',
# Bad image list
'bad_image_list' => '書å¼ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ï¼š
@@ -3726,13 +3768,6 @@ $5
'scarytranscludefailed' => '[$1ã«å¯¾ã—ã¦ãƒ†ãƒ³ãƒ—レートã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ]',
'scarytranscludetoolong' => '[URLãŒé•·ã™ãŽã¾ã™]',
-# Trackbacks
-'trackbackbox' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¸ã®ãƒˆãƒ©ãƒƒã‚¯ãƒãƒƒã‚¯ï¼š<br />
-$1',
-'trackbackremove' => '([$1 削除])',
-'trackbacklink' => 'トラックãƒãƒƒã‚¯',
-'trackbackdeleteok' => 'トラックãƒãƒƒã‚¯ã¯æ­£å¸¸ã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚',
-
# Delete conflict
'deletedwhileediting' => "'''警告:'''ã“ã®ãƒšãƒ¼ã‚¸ãŒã€ç·¨é›†é–‹å§‹å¾Œã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸï¼",
'confirmrecreate' => "[[User:$1|$1]]([[User talk:$1|トーク]])ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã®ç·¨é›†é–‹å§‹å¾Œã«ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’ã€æ¬¡ã®ç†ç”±ã§å‰Šé™¤ã—ã¾ã—ãŸã€‚
@@ -3887,6 +3922,9 @@ $1',
'hebrew-calendar-m11-gen' => 'アブ',
'hebrew-calendar-m12-gen' => 'エルール',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|トーク]])',
+
# Core parser functions
'unknown_extension_tag' => 'ä¸æ˜Žãªæ‹¡å¼µæ©Ÿèƒ½ã‚¿ã‚°ã€Œ$1ã€ã§ã™',
'duplicate-defaultsort' => "'''警告:'''既定ã®ä¸¦ã³æ›¿ãˆã‚­ãƒ¼ã€Œ$2ã€ãŒã€ãã®å‰ã«æ›¸ã‹ã‚Œã¦ã„る既定ã®ä¸¦ã³æ›¿ãˆã‚­ãƒ¼ã€Œ$1ã€ã‚’上書ãã—ã¦ã„ã¾ã™ã€‚",
@@ -3940,9 +3978,10 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
# Special:SpecialPages
'specialpages' => '特別ページ',
-'specialpages-note' => '* 通常ã®ç‰¹åˆ¥ãƒšãƒ¼ã‚¸ã€‚
-* <span class="mw-specialpagerestricted">制é™ã•ã‚Œã¦ã„る特別ページ。</span>
-* <span class="mw-specialpagecached">(廃止ã•ã‚ŒãŸã‹ã‚‚ã—ã‚Œãªã„)キャッシュã•ã‚ŒãŸç‰¹åˆ¥ãƒšãƒ¼ã‚¸ã€‚</span>',
+'specialpages-note' => '----
+* 通常ã®ç‰¹åˆ¥ãƒšãƒ¼ã‚¸
+* <span class="mw-specialpagerestricted">制é™ã•ã‚Œã¦ã„る特別ページ</span>
+* <span class="mw-specialpagecached">(廃止ã•ã‚ŒãŸã‹ã‚‚ã—ã‚Œãªã„)キャッシュã•ã‚ŒãŸç‰¹åˆ¥ãƒšãƒ¼ã‚¸</span>',
'specialpages-group-maintenance' => 'メンテナンス報告',
'specialpages-group-other' => 'ãã®ä»–ã®ç‰¹åˆ¥ãƒšãƒ¼ã‚¸',
'specialpages-group-login' => 'ログイン/利用者登録',
@@ -3984,13 +4023,16 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'tags-hitcount' => '$1回ã®å¤‰æ›´',
# Special:ComparePages
-'comparepages' => 'ページã®æ¯”較',
-'compare-selector' => 'ページã®ç‰ˆã‚’比較',
-'compare-page1' => 'ページ1',
-'compare-page2' => 'ページ2',
-'compare-rev1' => '版1',
-'compare-rev2' => '版2',
-'compare-submit' => '比較ã™ã‚‹',
+'comparepages' => 'ページã®æ¯”較',
+'compare-selector' => 'ページã®ç‰ˆã‚’比較',
+'compare-page1' => 'ページ1',
+'compare-page2' => 'ページ2',
+'compare-rev1' => '版1',
+'compare-rev2' => '版2',
+'compare-submit' => '比較ã™ã‚‹',
+'compare-invalid-title' => '指定ã—ãŸãƒšãƒ¼ã‚¸åã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。',
+'compare-title-not-exists' => '指定ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã¯å­˜åœ¨ã—ã¾ã›ã‚“。',
+'compare-revision-not-exists' => '指定ã•ã‚ŒãŸç‰ˆã¯å­˜åœ¨ã—ã¾ã›ã‚“。',
# Database error messages
'dberr-header' => 'å•é¡Œç™ºç”Ÿä¸­ã§ã™',
@@ -4018,4 +4060,83 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'sqlite-has-fts' => '$1(全文検索ã‚り)',
'sqlite-no-fts' => '$1(全文検索ãªã—)',
+# New logging system
+'logentry-delete-delete' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’削除ã—ã¾ã—ãŸ',
+'logentry-delete-restore' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’復帰ã—ã¾ã—ãŸ',
+'logentry-delete-event' => '$1 ãŒ$3ã§{{PLURAL:$5|記録項目|$5件ã®è¨˜éŒ²é …ç›®}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ: $4',
+'logentry-delete-revision' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã§{{PLURAL:$5|版|$5個ã®ç‰ˆ}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ: $4',
+'logentry-delete-event-legacy' => '$1 ãŒ$3ã§è¨˜éŒ²é …ç›®ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ',
+'logentry-delete-revision-legacy' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ',
+'logentry-suppress-delete' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’隠蔽ã—ã¾ã—ãŸ',
+'logentry-suppress-event' => '$1 ãŒ$3ã§{{PLURAL:$5|記録項目|$5件ã®è¨˜éŒ²é …ç›®}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸ: $4',
+'logentry-suppress-revision' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã§{{PLURAL:$5|版|$5個ã®ç‰ˆ}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸ: $4',
+'logentry-suppress-event-legacy' => '$1 ãŒ$3ã§è¨˜éŒ²é …ç›®ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸ',
+'logentry-suppress-revision-legacy' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸ',
+'revdelete-content-hid' => '本文ã®ä¸å¯è¦–化',
+'revdelete-summary-hid' => '編集è¦ç´„ã®ä¸å¯è¦–化',
+'revdelete-uname-hid' => '利用者åã®ä¸å¯è¦–化',
+'revdelete-content-unhid' => '本文ã®å¯è¦–化',
+'revdelete-summary-unhid' => '編集è¦ç´„ã®å¯è¦–化',
+'revdelete-uname-unhid' => '利用者åã®å¯è¦–化',
+'revdelete-restricted' => '管ç†è€…ã«å¯¾ã™ã‚‹åˆ¶é™ã®é©ç”¨',
+'revdelete-unrestricted' => '管ç†è€…ã«å¯¾ã™ã‚‹åˆ¶é™ã®é™¤åŽ»',
+'logentry-move-move' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’「$4ã€ã¸ã¨ç§»å‹•ã—ã¾ã—ãŸ',
+'logentry-move-move-noredirect' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’「$4ã€ã¸ã¨ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’残ã•ãšã«ç§»å‹•ã—ã¾ã—ãŸ',
+'logentry-move-move_redir' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’リダイレクトã®ã€Œ$4ã€ã¸ã¨ç§»å‹•ã—ã¾ã—ãŸ',
+'logentry-move-move_redir-noredirect' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’リダイレクトã®ã€Œ$4ã€ã¸ã¨ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’残ã•ãšã«ç§»å‹•ã—ã¾ã—ãŸ',
+'logentry-patrol-patrol' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆ $4をパトロール済ã¿ã¨ã—ã¾ã—ãŸ',
+'logentry-patrol-patrol-auto' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆ $4を自動的ã«ãƒ‘トロール済ã¿ã¨ã—ã¾ã—ãŸ',
+'logentry-newusers-newusers' => '$1 ãŒåˆ©ç”¨è€…アカウントを作æˆã—ã¾ã—ãŸ',
+'logentry-newusers-create' => '$1 ãŒåˆ©ç”¨è€…アカウントを作æˆã—ã¾ã—ãŸ',
+'logentry-newusers-create2' => '$1 ãŒåˆ©ç”¨è€…アカウント「$3ã€ã‚’作æˆã—ã¾ã—ãŸ',
+'logentry-newusers-autocreate' => 'アカウント「$1ã€ãŒè‡ªå‹•çš„ã«ä½œæˆã•ã‚Œã¾ã—ãŸ',
+'newuserlog-byemail' => 'パスワードを電å­ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã—ã¾ã—ãŸ',
+
+# Feedback
+'feedback-subject' => '件å:',
+'feedback-message' => 'メッセージ:',
+'feedback-cancel' => 'キャンセル',
+'feedback-submit' => 'フィードãƒãƒƒã‚¯ã‚’é€ä¿¡',
+'feedback-adding' => 'ページã¸ã®ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã‚’追加ã™ã‚‹...',
+'feedback-error1' => 'エラー:APIã‹ã‚‰èªè­˜ã•ã‚Œãªã„çµæžœãŒè¿”ã£ã¦ãã¾ã—ãŸ',
+'feedback-error2' => 'エラー:編集ã«å¤±æ•—ã—ã¾ã—ãŸ',
+'feedback-error3' => 'エラー:APIã‹ã‚‰ã®å¿œç­”ãŒã‚ã‚Šã¾ã›ã‚“',
+'feedback-close' => '完了',
+
+# API errors
+'api-error-badaccess-groups' => 'ã“ã®ã‚¦ã‚£ã‚­ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロードãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'api-error-badtoken' => '内部エラー:トークンãŒä¸æ­£ã§ã™ã€‚',
+'api-error-copyuploaddisabled' => 'URLã«ã‚ˆã‚‹ã‚¢ãƒƒãƒ—ロードã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'api-error-duplicate' => '当ウェブサイト上ã«ã¯ã€æ—¢ã«åŒã˜å†…容ã®[$2 別ファイル]ãŒå­˜åœ¨ã—ã¦ã„ã¾ã™{{PLURAL:$1|}}。',
+'api-error-duplicate-archive' => 'åŒã˜å†…容ã§æ—¢ã«å‰Šé™¤æ¸ˆã¿ã®{{PLURAL:$1|[$2 別ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒ]|[$2 別ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã„ãã¤ã‹]}}サイト上ã«ã‚ã‚Šã¾ã™ã€‚',
+'api-error-duplicate-archive-popup-title' => 'ã™ã§ã«å‰Šé™¤ã•ã‚ŒãŸé‡è¤‡{{PLURAL:$1|ファイル|ファイル}}',
+'api-error-duplicate-popup-title' => 'é‡è¤‡ãƒ•ã‚¡ã‚¤ãƒ«{{PLURAL:$1|}}',
+'api-error-empty-file' => 'é€ä¿¡ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ç©ºã§ã—ãŸã€‚',
+'api-error-fetchfileerror' => '内部エラー:ファイルã®å–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'api-error-file-too-large' => 'é€ä¿¡ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯å¤§ãã™ãŽã¾ã™ã€‚',
+'api-error-filename-tooshort' => 'ファイルåãŒçŸ­ã™ãŽã¾ã™ã€‚',
+'api-error-filetype-banned' => 'ã“ã®å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'api-error-filetype-missing' => 'ファイルã«æ‹¡å¼µå­ãŒã‚ã‚Šã¾ã›ã‚“。',
+'api-error-hookaborted' => '拡張機能ã®ãƒ•ãƒƒã‚¯ã«ã‚ˆã£ã¦ã€ä¿®æ­£ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸã€‚',
+'api-error-http' => '内部エラー:サービスã¸ã®æŽ¥ç¶šã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'api-error-illegal-filename' => 'ファイルåãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'api-error-internal-error' => '内部エラー:ウィキ上ã§ã‚¢ãƒƒãƒ—ロードを処ç†ã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'api-error-invalid-file-key' => '内部エラー:一時格ç´å ´æ‰€ã«ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
+'api-error-missingparam' => '内部エラー:リクエストã®ãƒ‘ラメータãŒè¶³ã‚Šã¾ã›ã‚“。',
+'api-error-missingresult' => '内部エラー:複製ã«æˆåŠŸã—ãŸã‹åˆ¤æ–­ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'api-error-mustbeloggedin' => 'ファイルをアップロードã™ã‚‹ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'api-error-mustbeposted' => 'ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã«ãƒã‚°ãŒã‚ã‚Šã¾ã—ãŸã€‚é©åˆ‡ãªHTTPメソッドを使用ã—ã¦ã„ã¾ã›ã‚“。',
+'api-error-noimageinfo' => 'アップロードã«ã¯æˆåŠŸã—ã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹æƒ…報を返ã—ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'api-error-nomodule' => '内部エラー:アップロードを処ç†ã™ã‚‹ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'api-error-ok-but-empty' => '内部エラー:サーãƒãƒ¼ã‹ã‚‰ã®å¿œç­”ãŒã‚ã‚Šã¾ã›ã‚“。',
+'api-error-overwrite' => '既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ä¸Šæ›¸ãã™ã‚‹ã“ã¨ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'api-error-stashfailed' => '内部エラー:サーãƒãƒ¼ã¯ä¸€æ™‚ファイルを格ç´ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'api-error-timeout' => 'サーãƒãƒ¼ãŒæ±ºã‚られãŸæ™‚間内ã«å¿œç­”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'api-error-unclassified' => 'ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'api-error-unknown-code' => 'ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ï¼šã€Œ$1ã€',
+'api-error-unknown-error' => '内部エラー:ファイルã®ã‚¢ãƒƒãƒ—ロードã®é€”中ã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'api-error-unknown-warning' => '原因ä¸æ˜Žã®è­¦å‘Š:$1',
+'api-error-uploaddisabled' => 'ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ã‚¢ãƒƒãƒ—ロードã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'api-error-verification-error' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯å£Šã‚Œã¦ã„ã‚‹ã‹ã€é–“é•ã£ãŸæ‹¡å¼µå­ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+
);
diff --git a/languages/messages/MessagesJam.php b/languages/messages/MessagesJam.php
index b97521ef..f1775611 100644
--- a/languages/messages/MessagesJam.php
+++ b/languages/messages/MessagesJam.php
@@ -371,15 +371,14 @@ Di piej ar fail "$1" kudn diliit.
Imaita aredi diliit bai smadi els.',
'badtitle' => 'Bad taikl',
'badtitletext' => 'Di piej taikl yu rikwes invalid, emti, ar a inkarek lingk inta-langwij ar inta-wiki taikl. Imaita kantien wan ar muo kiarakta we kyaahn yuuz ina taikl.',
-'perfcached' => 'Di falarin dieta kiash ahn maita no op tu diet.',
-'perfcachedts' => 'Di falarin dieta kiash, ahn laas opdiet $1.',
+'perfcached' => 'Di falarin dieta kiash ahn maita no op tu diet. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Di falarin dieta kiash, ahn laas opdiet $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Opdiet fi dis piej korantli disiebl.
Dieta ya no go rifresh fi nou.',
'wrong_wfQuery_params' => 'Inkarek paramita tu wfQuery()<br />
Fongshan: $1<br />
Kwieri: $2',
'viewsource' => 'Vyuu Suos',
-'viewsourcefor' => 'fi $1',
'actionthrottled' => 'Akshan chratl',
'actionthrottledtext' => 'Az anti-spam meja, yu limit frahn pofaam dis akshan tomoch taim ina shaat spies a taim, ahn yu exiid di limit.
Begyu chrai agen ina fyuu minit.',
@@ -594,9 +593,6 @@ Nuot se yu kyaahn yuuz di "e-miel dis yuuza" fiicha anles yu gat a valid e-miel
Yu korant IP ajress a $3, ahn di blak ID a #$5.
Begyu inkluud aal abov ditiel ina eni kwieri yu mek.',
'blockednoreason' => 'no riizn no gi',
-'blockedoriginalsource' => "Di suos a '''$1''' shuo biluo:",
-'blockededitsource' => "Di tex a '''yu edit''' tu '''$1''' shuo biluo:",
-'whitelistedittitle' => 'Lagiin rikwaya fi edit',
'whitelistedittext' => 'Yu afi $1 fi edit piej',
'confirmedittext' => 'Yu mos kanfoerm yu e-miel ajres bifuo yu edit piej.
Begyu set ahn validiet yu e-miel ajres chruu yu [[Special:Preferences|yuuza prefransdem]].',
@@ -839,8 +835,7 @@ Piej pahn [[Special:Watchlist|yu wachlis]] dem '''buol'''.",
'linksearch' => 'Extoernal lingk',
# Special:Log/newusers
-'newuserlogpage' => 'Yuuza krieshan lag',
-'newuserlog-create-entry' => 'Nyuu yuuza akount',
+'newuserlogpage' => 'Yuuza krieshan lag',
# Special:ListGroupRights
'listgrouprights-members' => '(lis a memba)',
@@ -872,7 +867,6 @@ Begyu kanfoerm se yu inten fi du dis, se yu andastan di kansikwens, ahn se yu a
'actioncomplete' => 'Akshan kompliit',
'deletedtext' => '"$1" don diliit.
Si $2 fi a rekaad a riisant diliishan.',
-'deletedarticle' => 'diliitid "[[$1]]"',
'dellogpage' => 'Diliishan lag',
'deletecomment' => 'Riizn:',
'deleteotherreason' => 'Ada/adishanal riizn:',
@@ -906,8 +900,7 @@ Yu kiahn chienj dis piej protekshan lebl, bot inaa go afek di kiaskiedn proteksh
'restriction-level' => 'Rischrikshan lebl:',
# Undelete
-'undeletelink' => 'vyuu/ristuor',
-'undeletedarticle' => 'don ristuor "[[$1]]"',
+'undeletelink' => 'vyuu/ristuor',
# Namespace form on various pages
'namespace' => 'Niemspies',
@@ -988,8 +981,6 @@ Begyu chuuz aneda niem.',
Begyu moerj dem manyuali.'''",
'movedto' => 'muuv gaan a',
'movetalk' => 'Muuv asuosietid taak piej',
-'1movedto2' => '[[$1]] muuv gaan a [[$2]]',
-'1movedto2_redir' => 'muuv [[$1]] tu [[$2]] uoba ridirek',
'movelogpage' => 'Muuv lag',
'movereason' => 'Riizn:',
'revertmove' => 'rivoert',
@@ -1061,7 +1052,7 @@ Yu kiahn vyuu isuos.',
# Media information
'file-info-size' => '$1 × $2 pixl, fail saiz: $3, MIME taip: $4',
-'file-nohires' => '<small>No aya rezaluushan no avielobl.</small>',
+'file-nohires' => 'No aya rezaluushan no avielobl.',
'svg-long-desc' => 'SVG fail, naminali $1 × $2 pixl, fail saiz: $3',
'show-big-image' => 'Ful rezaluushan',
diff --git a/languages/messages/MessagesJbo.php b/languages/messages/MessagesJbo.php
index 5781be80..54cdcee4 100644
--- a/languages/messages/MessagesJbo.php
+++ b/languages/messages/MessagesJbo.php
@@ -9,6 +9,7 @@
*
* @author (vinny)
* @author Homo logos
+ * @author Inego (on jbo.wikipedia.org)
* @author Malafaya
* @author OldakQuill
* @author PierreAbbat
@@ -255,9 +256,8 @@ $messages = array(
'unwatching' => "co'u jundi",
# Delete
-'deletedarticle' => "pu daspo la'e lu [[$1]] li'u",
-'dellogpage' => 'plivei fi loi nu daspo',
-'deletionlog' => 'plivei fi loi nu daspo',
+'dellogpage' => 'plivei fi loi nu daspo',
+'deletionlog' => 'plivei fi loi nu daspo',
# Rollback
'rollbacklink' => 'lamxru',
@@ -285,7 +285,6 @@ $messages = array(
# Move page
'movedto' => 'te muvdu',
-'1movedto2' => "le pu se cmene lu [[$1]] li'u cu ca se cmene lu [[$2]] li'u",
'revertmove' => 'xruti',
# Tooltip help for the actions
diff --git a/languages/messages/MessagesJut.php b/languages/messages/MessagesJut.php
index da706381..6a6e4df2 100644
--- a/languages/messages/MessagesJut.php
+++ b/languages/messages/MessagesJut.php
@@ -303,7 +303,6 @@ MySQL æ returnerede fejl "$3: $4".',
Funksje: $1<br />
Førespørgsel: $2',
'viewsource' => 'Ves æ kelde',
-'viewsourcefor' => 'før $1',
'viewsourcetext' => "Du ken dog se og åfskreve'n keldekode til æ side:",
# Login and logout pages
@@ -610,11 +609,8 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
'linksearch-error' => "Wildkårter må ken benyttes i'n stårt åf håstnavnet.",
# Special:Log/newusers
-'newuserlogpage' => 'Brugeråprettelseslog',
-'newuserlogpagetext' => "Dett'er en log åver de senest åprettede brugere.",
-'newuserlog-byemail' => 'kodeort tilsend via e-mail',
-'newuserlog-create-entry' => 'Ny bruger',
-'newuserlog-create2-entry' => 'åprettede brugerkonto før $1',
+'newuserlogpage' => 'Brugeråprettelseslog',
+'newuserlogpagetext' => "Dett'er en log åver de senest åprettede brugere.",
# E-mail user
'emailuser' => 'E-mail til denne bruger',
@@ -642,7 +638,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
[[{{MediaWiki:Policy-url}}]].",
'actioncomplete' => 'Gennemført',
'deletedtext' => '"$1" er slettet. Sæg $2 før en førtegnelse åver de nyeste sletnenger.',
-'deletedarticle' => 'slettede "[[$1]]"',
'dellogpage' => 'Sletnengslog',
'deletecomment' => 'Begrundelse:',
'deleteotherreason' => 'Anden/uddybende begrundelse:',
@@ -744,7 +739,6 @@ navn du harst valgt er ekke gyldegt. Vælg et andet navn.',
'talkexists' => 'Æ side blev flyttet korrekt, men den tilhørende diskusjeside ken ekke flyttes, førdi der ålrede eksisterer en ve den nye titel. Du erst nødt til at flette dem sammen manuelt.',
'movedto' => 'flyttet til',
'movetalk' => 'Flyt også\'n "diskusjeside", hves den eksisterer.',
-'1movedto2' => '[[$1]] flyttet til [[$2]]',
'movelogpage' => 'Flyttelog',
'movereason' => 'Begrundelse:',
'revertmove' => 'gendan',
@@ -810,7 +804,7 @@ navn du harst valgt er ekke gyldegt. Vælg et andet navn.',
# Media information
'file-info-size' => '$1 × $2 pixel, gøretstørrelse: $3, MIME-senenge: $4',
-'file-nohires' => '<small>Engen højere åpløsnenge fundet.</small>',
+'file-nohires' => 'Engen højere åpløsnenge fundet.',
'svg-long-desc' => 'SVG gøret, wønetstørrelse $1 × $2 pixel, gøretstørrelse: $3',
'show-big-image' => 'Hersenenge i større åpløsnenge',
@@ -862,4 +856,7 @@ Kun endholtet åf æ liste (lenjer startende ve *) bliver brugt. Den første hen
# Special:SpecialPages
'specialpages' => 'Sonst sider',
+# New logging system
+'newuserlog-byemail' => 'kodeort tilsend via e-mail',
+
);
diff --git a/languages/messages/MessagesJv.php b/languages/messages/MessagesJv.php
index ed94d9fb..4719880f 100644
--- a/languages/messages/MessagesJv.php
+++ b/languages/messages/MessagesJv.php
@@ -398,12 +398,11 @@ Yèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'')
Manawa wis dibusak déning wong liya.',
'badtitle' => 'Judhulé ora sah',
'badtitletext' => 'Judhul kaca sing panjenengan ora bisa dituduhaké, kosong, utawa dadi judhul antar-basa utawa judhul antar-wiki. Iku bisa uga ana sawijining utawa luwih aksara sing ora bisa didadèkaké judhul.',
-'perfcached' => 'Data iki dijupuk saka <em>cache</em> lan mbokmenawa dudu data pungkasan:',
-'perfcachedts' => 'Data iki dijupuk saka <em>cache</em>, lan dianyaraké ing pungkasan ing $1.',
+'perfcached' => 'Data iki dijupuk saka <em>cache</em> lan mbokmenawa dudu data pungkasan. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Data iki dijupuk saka <em>cache</em>, lan dianyaraké ing pungkasan ing $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.',
'wrong_wfQuery_params' => 'Parameter salah menyang wfQuery()<br />Fungsi: $1<br />Panyuwunan: $2',
'viewsource' => 'Tuduhna sumber',
-'viewsourcefor' => 'saka $1',
'actionthrottled' => 'Tindakan diwatesi',
'actionthrottledtext' => 'Minangka sawijining pepesthèn anti-spam, panjenengan diwatesi nglakoni tindhakan iki sing cacahé kakèhan ing wektu cendhak.
Mangga dicoba manèh ing sawetara menit.',
@@ -598,9 +597,6 @@ Panjenengan ora bisa nganggo fitur "kirim e-mail panganggo iki" kejaba panjeneng
ID pamblokiran panjenengan iku #$5 lan alamat IP panjenengan iku $3. Tulung sertakna informasi ing dhuwur kabèh iki saben ngajokaké pitakonan panjenengan. Matur nuwun.',
'blockednoreason' => 'ora ana alesan sing diwènèhaké',
-'blockedoriginalsource' => "Isi sumber '''$1''' dituduhaké ing ngisor iki:",
-'blockededitsource' => "Tèks '''suntingan panjenengan''' tumrap ing '''$1''' dituduhaké ing ngisor iki:",
-'whitelistedittitle' => 'Prelu log mlebu kanggo nyunting',
'whitelistedittext' => 'Panjenengan kudu $1 supaya bisa nyunting artikel.',
'confirmedittext' => 'Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng nyunting sawijining kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nglakoni panyuntingan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]',
'nosuchsectiontitle' => 'Bagéan ora ditemokaké',
@@ -811,8 +807,6 @@ Pangurus {{SITENAME}} liyané bakal tetep bisa ngaksès isi sing kadhelikaké ik
'revdelete-unsuppress' => 'Busak watesan ing revisi sing dibalèkaké',
'revdelete-log' => 'Alesan:',
'revdelete-submit' => 'Trapna ing {{PLURAL:$1|révisi|révisi}} kapilih',
-'revdelete-logentry' => 'owahna tampilan revisi kanggo [[$1]]',
-'logdelete-logentry' => 'owahna aturan pandhelikan saka [[$1]]',
'revdelete-success' => 'Aturan pandhelikan revisi bisa kasil ditrapaké.',
'revdelete-failure' => "'''Mode tampilan révisi ora bisa disèt:'''
$1",
@@ -822,15 +816,6 @@ $1",
'revdel-restore' => 'Ngowahi visiblitas (pangatonan)',
'pagehist' => 'Sajarah kaca',
'deletedhist' => 'Sajarah sing dibusak',
-'revdelete-content' => 'isi',
-'revdelete-summary' => 'ringkesan suntingan',
-'revdelete-uname' => 'jeneng panganggo',
-'revdelete-restricted' => 'rèstriksi ditrapaké marang para opsis',
-'revdelete-unrestricted' => 'rèstriksi marang para opsis dijabel',
-'revdelete-hid' => 'delikna $1',
-'revdelete-unhid' => 'buka pandelikan $1',
-'revdelete-log-message' => '$1 kanggo $2 {{PLURAL:$2|révisi|révisi}}',
-'logdelete-log-message' => '$1 kanggo $2 {{PLURAL:$2|prastawa|prastawa}}',
'revdelete-hide-current' => 'Gagal ndhelikaké révisi tanggal $2, $1: iki arupa révisi paling anyar.
Révisi iki ora bisa didhelikaké.',
'revdelete-show-no-access' => 'Gagal nampilaké révisi tanggal $1, jam $2: révisi iki wis ditandhani "kawates".
@@ -976,7 +961,7 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
'prefs-rc' => 'Owah-owahan pungkasan',
'prefs-watchlist' => 'Dhaftar pangawasan',
'prefs-watchlist-days' => 'Cacahé dina sing dituduhaké ing dhaftar pangawasan:',
-'prefs-watchlist-days-max' => 'Maksimum 7 dina',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Cacahé suntingan maksimum sing dituduhaké ing dhaftar pangawasan sing luwih jangkep:',
'prefs-watchlist-edits-max' => 'Gunggung maksimum: 1000',
'prefs-watchlist-token' => 'Token pantauan:',
@@ -1166,7 +1151,6 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
'right-autopatrol' => 'Gawé supaya suntingan-suntingan ditandhani minangka wis dipatroli',
'right-patrolmarks' => 'Ndeleng tandha-tandha patroli owah-owahan anyar',
'right-unwatchedpages' => 'Tuduhna daftar kaca-kaca sing ora diawasi',
-'right-trackback' => 'Kirimna trackback',
'right-mergehistory' => 'Gabungna sajarah kaca-kaca',
'right-userrights' => 'Sunting kabèh hak-hak panganggo',
'right-userrights-interwiki' => 'Sunting hak-hak para panganggo ing situs-situs wiki liya',
@@ -1210,7 +1194,6 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
'action-patrol' => 'nandhani suntingan panganggo liya minangka wis kapriksa',
'action-autopatrol' => 'nandhani suntingan panjenengan dhéwé minangka wis kapriksa',
'action-unwatchedpages' => 'pirsani dhaftar kaca-kaca sing ora kaawasi',
-'action-trackback' => 'kirim panjejak balik',
'action-mergehistory' => 'nggabungaké sajarah kaca iki',
'action-userrights' => 'ngowahi kabèh hak panganggo',
'action-userrights-interwiki' => 'ngowahi hak aksès saka panganggo ing wiki liya',
@@ -1668,12 +1651,8 @@ Deleng uga [[Special:WantedCategories|kategori sing diperlokaké]].',
'activeusers-noresult' => 'Panganggo ora ditemokaké.',
# Special:Log/newusers
-'newuserlogpage' => 'Log panganggo anyar',
-'newuserlogpagetext' => 'Ing ngisor iki kapacak log pandaftaran panganggo anyar.',
-'newuserlog-byemail' => 'tembung sandhi wis dikirim liwat e-mail',
-'newuserlog-create-entry' => 'Panganggo anyar',
-'newuserlog-create2-entry' => 'gawé akun anyar $1',
-'newuserlog-autocreate-entry' => 'akun panganggo digawé otomatis',
+'newuserlogpage' => 'Log panganggo anyar',
+'newuserlogpagetext' => 'Ing ngisor iki kapacak log pandaftaran panganggo anyar.',
# Special:ListGroupRights
'listgrouprights' => 'Hak-hak grup panganggo',
@@ -1800,8 +1779,6 @@ Umpan balik lan pitulung sabanjuré:
'actioncomplete' => 'Proses tuntas',
'actionfailed' => 'Tindakan gagal',
'deletedtext' => '"$1" sampun kabusak. Coba pirsani $2 kanggé log paling énggal kaca ingkang kabusak.',
-'deletedarticle' => 'mbusak "[[$1]]"',
-'suppressedarticle' => 'ndelikaké "[[$1]]"',
'dellogpage' => 'Cathetan pambusakan',
'dellogpagetext' => 'Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.',
'deletionlog' => 'Cathetan sing dibusak',
@@ -1927,7 +1904,6 @@ Panjenengan mbokmenawa ngetutaké pranala sing salah, utawa revisi iku wis dipul
'undeletereset' => "''Reset''",
'undeleteinvert' => 'Walik pilihan',
'undeletecomment' => 'Alesan:',
-'undeletedarticle' => '"$1" wis dibalèkaké',
'undeletedrevisions' => '$1 {{PLURAL:$1|révisi|révisi}} wis dibalèkaké',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|révisi|révisi}} lan $2 berkas dibalèkaké',
'undeletedfiles' => '$1 {{PLURAL:$1|berkas|berkas}} dibalèkaké',
@@ -2154,9 +2130,6 @@ Ing kasus-kasus iku, yèn panjenengan gayuh, panjenengan bisa mindhahaké utawa
'movepage-page-moved' => 'Kaca $1 wis dipindhah menyang $2.',
'movepage-page-unmoved' => 'Kaca $1 ora bisa dialihaké menyang $2.',
'movepage-max-pages' => 'Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh sing bakal dialihaké sacara otomatis.',
-'1movedto2' => 'Ngalihaké [[$1]] menyang [[$2]]',
-'1movedto2_redir' => '[[$1]] dipunalihaken menyang [[$2]] via pangalihan',
-'move-redirect-suppressed' => 'pengalihan ditahan',
'movelogpage' => 'Log pamindhahan',
'movelogpagetext' => 'Ing ngisor iki kapacak log pangalihan kaca.',
'movesubpage' => '{{PLURAL:$1|Anak-kaca|Anak-kaca}}',
@@ -2381,9 +2354,6 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
# Patrol log
'patrol-log-page' => 'Log patroli',
'patrol-log-header' => 'Iki log revisi sing wis dipatroli.',
-'patrol-log-line' => 'nandhani $1 saka $2 sing dipatroli $3',
-'patrol-log-auto' => '(otomatis)',
-'patrol-log-diff' => 'révisi $1',
'log-show-hide-patrol' => '$1 log patroli',
# Image deletion
@@ -2408,7 +2378,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}',
'file-info' => 'ukuran berkas: $1, tipe MIME: $2',
'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
-'file-nohires' => '<small>Ora ana résolusi sing luwih dhuwur.</small>',
+'file-nohires' => 'Ora ana résolusi sing luwih dhuwur.',
'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3',
'show-big-image' => 'Résolusi kebak',
'file-info-gif-looped' => 'mubeng',
@@ -2759,13 +2729,6 @@ Konfirmasi iki bakal kadaluwarsa ing $4.',
'scarytranscludefailed' => '[Olèhé njupuk cithakan $1 gagal]',
'scarytranscludetoolong' => '[URL-é kedawan]',
-# Trackbacks
-'trackbackbox' => 'Ngrunut balik kanggo kaca iki:<br />
-$1',
-'trackbackremove' => '([$1 Busak])',
-'trackbacklink' => 'Lacak balik',
-'trackbackdeleteok' => 'Pelacakan balik bisa dibusak.',
-
# Delete conflict
'deletedwhileediting' => "'''Pènget''': Kaca iki wis kabusak sawisé panjenengan miwiti nyunting!",
'confirmrecreate' => "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:
@@ -2952,4 +2915,9 @@ Katrangan tampilan:
'htmlform-reset' => 'Batalna pangowahan',
'htmlform-selectorother-other' => 'Liya',
+# New logging system
+'revdelete-restricted' => 'rèstriksi ditrapaké marang para opsis',
+'revdelete-unrestricted' => 'rèstriksi marang para opsis dijabel',
+'newuserlog-byemail' => 'tembung sandhi wis dikirim liwat e-mail',
+
);
diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php
index 12464bd9..111f0fa8 100644
--- a/languages/messages/MessagesKa.php
+++ b/languages/messages/MessagesKa.php
@@ -124,16 +124,16 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ', '#REDIRECT' ),
- 'nogallery' => array( '0', '__უგáƒáƒšáƒ”რეáƒ__', '__NOGALLERY__' ),
- 'subst' => array( '0', 'მიდგმ:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'მინიáƒáƒ¢áƒ˜áƒ£áƒ áƒ', 'მინი', 'მინიáƒáƒ¡áƒšáƒ˜', 'ცერáƒáƒ“ენáƒ', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ•', 'right' ),
- 'img_left' => array( '1', 'მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ•', 'left' ),
- 'img_width' => array( '1', '$1პქ', '$1px' ),
- 'img_center' => array( '1', 'ცენტრი', 'center', 'centre' ),
- 'img_border' => array( '1', 'სáƒáƒ–ღვáƒáƒ áƒ˜', 'border' ),
- 'special' => array( '0', 'სპეციáƒáƒšáƒ£áƒ áƒ˜', 'special' ),
+ 'redirect' => array( '0', '#გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ', '#REDIRECT' ),
+ 'nogallery' => array( '0', '__უგáƒáƒšáƒ”რეáƒ__', '__NOGALLERY__' ),
+ 'subst' => array( '0', 'მიდგმ:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'მინიáƒáƒ¢áƒ˜áƒ£áƒ áƒ', 'მინი', 'მინიáƒáƒ¡áƒšáƒ˜', 'ცერáƒáƒ“ენáƒ', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ•', 'right' ),
+ 'img_left' => array( '1', 'მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ•', 'left' ),
+ 'img_width' => array( '1', '$1პქ', '$1px' ),
+ 'img_center' => array( '1', 'ცენტრი', 'center', 'centre' ),
+ 'img_border' => array( '1', 'სáƒáƒ–ღვáƒáƒ áƒ˜', 'border' ),
+ 'special' => array( '0', 'სპეციáƒáƒšáƒ£áƒ áƒ˜', 'special' ),
);
$linkPrefixExtension = true;
@@ -498,21 +498,23 @@ $1',
'badarticleerror' => 'ეს მáƒáƒ¥áƒ›áƒ”დებრვერ შესრულდებრáƒáƒ› გვერდზე.',
'cannotdelete' => 'გვერდის áƒáƒœ ფáƒáƒ˜áƒšáƒ˜áƒ¡ „$1“ წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ.
შესáƒáƒ«áƒšáƒáƒ, იგი უკვე წáƒáƒ¨áƒáƒšáƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ.',
+'cannotdelete-title' => 'გვერდის „$1“ წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ',
'badtitle' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ—áƒáƒ£áƒ áƒ˜',
'badtitletext' => 'მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ გვერდის სáƒáƒ—áƒáƒ£áƒ áƒ˜ იყრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜, ცáƒáƒ áƒ˜áƒ”ლი, áƒáƒœ წáƒáƒ áƒ›áƒáƒáƒ“გენდრშეცდáƒáƒ›áƒ˜áƒ— გáƒáƒ™áƒ”თებულ ბმულს ენáƒáƒ—áƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒœ ინტერ-ვიკი სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ“áƒáƒœ.',
-'perfcached' => 'შემდეგი მáƒáƒœáƒáƒªáƒ”მები áƒáƒ¦áƒ”ბულირქეშიდáƒáƒœ დრშესáƒáƒ«áƒšáƒáƒ áƒáƒ  მáƒáƒ˜áƒªáƒáƒ•áƒ¡ ბáƒáƒšáƒ ცვლილებებს',
-'perfcachedts' => 'შემდეგი მáƒáƒœáƒáƒªáƒ”მები ქეშიდáƒáƒœáƒáƒ áƒáƒ¦áƒ”ბული ისინი ბáƒáƒšáƒáƒ¯áƒ”რ გáƒáƒœáƒáƒ®áƒšáƒ“ნენ $1 რიცხვში.',
+'perfcached' => 'შემდეგი მáƒáƒœáƒáƒªáƒ”მები áƒáƒ¦áƒ”ბულირქეშიდáƒáƒœ დრშესáƒáƒ«áƒšáƒáƒ áƒáƒ  შეიცáƒáƒ•áƒ“ენენ ბáƒáƒšáƒ ცვლილებებს. ქეშში ინáƒáƒ®áƒ”ბრმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|ჩáƒáƒœáƒáƒ¬áƒ”რი}}.',
+'perfcachedts' => 'შემდეგი მáƒáƒœáƒáƒªáƒ”მები áƒáƒ¦áƒ”ბულირქეშიდáƒáƒœ, უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლáƒáƒ“ ის გáƒáƒœáƒáƒ®áƒšáƒ“რ$1. ქეშში ინáƒáƒ®áƒ”ბრმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $4 {{PLURAL:$4|ჩáƒáƒœáƒáƒ¬áƒ”რი}}.',
'querypage-no-updates' => 'áƒáƒ› გვერდის გáƒáƒœáƒáƒ®áƒšáƒ”ბრგáƒáƒ—იშულიáƒ.
წáƒáƒ áƒ›áƒáƒ“გენილი მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  გáƒáƒœáƒáƒ®áƒšáƒ“ებáƒ.',
'wrong_wfQuery_params' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები ფუნქციისáƒáƒ—ვის wfQuery()<br />
ფუნქციáƒ: $1<br />
მáƒáƒ—ხáƒáƒ•áƒœáƒ: $2',
'viewsource' => 'იხილე წყáƒáƒ áƒ',
-'viewsourcefor' => '$1-ის',
+'viewsource-title' => 'იხილეთ წყáƒáƒ áƒ გვერდისთვის $1',
'actionthrottled' => 'სიჩქáƒáƒ áƒ˜áƒ¡ შეზღუდვáƒ.',
'actionthrottledtext' => 'სპáƒáƒ›áƒ—áƒáƒœ ბრძáƒáƒšáƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბით áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ შემდეგი მáƒáƒœáƒáƒªáƒ”მების მრáƒáƒ•áƒáƒšáƒ¯áƒ”რ გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ. გთხáƒáƒ•áƒ— გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒáƒ— იგი მáƒáƒ’ვიáƒáƒœáƒ”ბით.',
'protectedpagetext' => 'ეს გვერდი დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბისთვის.',
'viewsourcetext' => 'თქვენ შეგიძლიáƒáƒ— ნáƒáƒ®áƒáƒ— áƒáƒ› გვერდის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜ დრმისი áƒáƒ¡áƒšáƒ˜ შექმნáƒáƒ—:',
+'viewyourtext' => "თქვენ შეგიძლიáƒáƒ— იხილáƒáƒ— დრდáƒáƒáƒ™áƒáƒžáƒ˜áƒ áƒáƒ— '''თქვენი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბების''' სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ტექსტი áƒáƒ› გვერდზე:",
'protectedinterface' => 'ეს გვერდი პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ინტერფეისის ნáƒáƒ¬áƒ˜áƒšáƒ˜áƒ დრდáƒáƒªáƒ£áƒšáƒ˜áƒ ვáƒáƒœáƒ“áƒáƒšáƒ˜áƒ–მის áƒáƒ¦áƒ™áƒ•áƒ”თის მიზნით.',
'editinginterface' => "'''ყურáƒáƒ“ღებáƒ:''' თქვენ რედáƒáƒ¥áƒ¢áƒáƒ áƒáƒ‘თ გვერდს, რáƒáƒ›áƒ”ლიც პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ინტერფეისის ტექსტს შეიცáƒáƒ•áƒ¡. áƒáƒ› გვერდზე გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ”ვს სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსáƒáƒ›áƒ£áƒ¨áƒáƒ ინტერფეისის შეცვლáƒáƒ¡áƒáƒª. თáƒáƒ áƒ’მáƒáƒœáƒ˜áƒ¡áƒáƒ—ვის უმჯáƒáƒ‘ესირგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— [//translatewiki.net/wiki/Main_Page?setlang=ka translatewiki.net], მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡ ლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ”ქტი.",
'sqlhidden' => '(SQL მáƒáƒ—ხáƒáƒ•áƒœáƒ გáƒáƒ£áƒ¥áƒ›áƒ”ბულიáƒ)',
@@ -617,6 +619,7 @@ $1 სáƒáƒáƒ—ში.',
'emailconfirmlink' => 'დáƒáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”თ თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი',
'invalidemailaddress' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒ  იქნრმიღებული, ვინáƒáƒ˜áƒ“áƒáƒœ იგი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ—áƒáƒ წáƒáƒ áƒ›áƒáƒ“გენილი.
გთხáƒáƒ•áƒ—, სწáƒáƒ áƒáƒ“ შეიყვáƒáƒœáƒáƒ— იგი áƒáƒœ წáƒáƒ¨áƒáƒšáƒáƒ— ეს ველი.',
+'cannotchangeemail' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ების შეცვლრáƒáƒ› ვიკიში შეუძლებელიáƒ.',
'accountcreated' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ შეიქმნáƒ',
'accountcreatedtext' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1-სთვის შექმნილიáƒ.',
'createaccount-title' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნრ{{SITENAME}}-თვის',
@@ -632,6 +635,7 @@ $1 სáƒáƒáƒ—ში.',
# E-mail sending
'php-mail-error-unknown' => 'áƒáƒ›áƒáƒ£áƒªáƒœáƒáƒ‘ი შეცდáƒáƒ›áƒ PHP-ის mail() ფუნქციáƒáƒ¨áƒ˜',
+'user-mail-no-addy' => 'ცდილáƒáƒ‘დრელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒáƒ¡ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის გáƒáƒ áƒ”შე.',
# Change password dialog
'resetpass' => 'შეცვáƒáƒšáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
@@ -652,18 +656,31 @@ $1 სáƒáƒáƒ—ში.',
'resetpass-temp-password' => 'დრáƒáƒ”ბითი პáƒáƒ áƒáƒšáƒ˜:',
# Special:PasswordReset
-'passwordreset' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ',
-'passwordreset-text' => 'შეáƒáƒ•áƒ¡áƒ”თ ეს ფáƒáƒ áƒ›áƒ, რáƒáƒ—რელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ— მიიღáƒáƒ— შეხსენებრთქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების შესáƒáƒ®áƒ”ბ.',
-'passwordreset-legend' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ',
-'passwordreset-disabled' => 'áƒáƒ› ვიკიში პáƒáƒ áƒáƒšáƒ˜áƒ¡ კვლáƒáƒ• დáƒáƒ§áƒ”ნების ფუნქცირგáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
-'passwordreset-pretext' => '{{PLURAL:$1||შეიყვáƒáƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მულ მáƒáƒœáƒáƒªáƒ”მთრერთ-ერთი ნáƒáƒ¬áƒ˜áƒšáƒ˜.}}',
-'passwordreset-username' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
-'passwordreset-domain' => 'დáƒáƒ›áƒ”ნი:',
-'passwordreset-email' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი:',
-'passwordreset-emailtitle' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მები {{SITENAME}}-თვის',
-'passwordreset-emailelement' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი: $1
+'passwordreset' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ',
+'passwordreset-text' => 'შეáƒáƒ•áƒ¡áƒ”თ ეს ფáƒáƒ áƒ›áƒ, რáƒáƒ—რელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ— მიიღáƒáƒ— შეხსენებრთქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების შესáƒáƒ®áƒ”ბ.',
+'passwordreset-legend' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ',
+'passwordreset-disabled' => 'áƒáƒ› ვიკიში პáƒáƒ áƒáƒšáƒ˜áƒ¡ კვლáƒáƒ• დáƒáƒ§áƒ”ნების ფუნქცირგáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
+'passwordreset-pretext' => '{{PLURAL:$1||შეიყვáƒáƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მულ მáƒáƒœáƒáƒªáƒ”მთრერთ-ერთი ნáƒáƒ¬áƒ˜áƒšáƒ˜.}}',
+'passwordreset-username' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
+'passwordreset-domain' => 'დáƒáƒ›áƒ”ნი:',
+'passwordreset-capture' => 'გáƒáƒ›áƒáƒ¡áƒ£áƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ ხილვáƒ?',
+'passwordreset-email' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი:',
+'passwordreset-emailtitle' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მები {{SITENAME}}-თვის',
+'passwordreset-emailelement' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი: $1
დრáƒáƒ”ბითი პáƒáƒ áƒáƒšáƒ˜: $2',
-'passwordreset-emailsent' => 'შესáƒáƒ®áƒ¡áƒ”ნებელი ელ.ფáƒáƒ¡áƒ¢áƒ გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ.',
+'passwordreset-emailsent' => 'შესáƒáƒ®áƒ¡áƒ”ნებელი ელ.ფáƒáƒ¡áƒ¢áƒ გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ.',
+'passwordreset-emailsent-capture' => 'ქვემáƒáƒ— ნáƒáƒ©áƒ•áƒ”ნები შესáƒáƒ®áƒ¡áƒ”ნებელი წერილი გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ.',
+
+# Special:ChangeEmail
+'changeemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის შეცვლáƒ',
+'changeemail-header' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის შეცვლáƒ',
+'changeemail-text' => 'შეáƒáƒ•áƒ¡áƒ”თ ეს ფáƒáƒ áƒ›áƒ თქვენი ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის შესáƒáƒªáƒ•áƒšáƒ”ლáƒáƒ“. თქვენი პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეყვáƒáƒœáƒ დáƒáƒ’ჭირდებáƒáƒ— áƒáƒ› ცვლილების დáƒáƒ¡áƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბლáƒáƒ“.',
+'changeemail-no-info' => 'თქვენ áƒáƒ•áƒ¢áƒ˜áƒ áƒ˜áƒ–ებული უნდრიყáƒáƒ— áƒáƒ› გვერდთáƒáƒœ უშუáƒáƒšáƒ წვდáƒáƒ›áƒ˜áƒ¡áƒ—ვის.',
+'changeemail-oldemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მისáƒáƒ›áƒáƒ áƒ—ი:',
+'changeemail-newemail' => 'áƒáƒ®áƒáƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი:',
+'changeemail-none' => '(áƒáƒ áƒáƒ¤áƒ”რი)',
+'changeemail-submit' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შეცვლáƒ',
+'changeemail-cancel' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
# Edit page toolbar
'bold_sample' => 'მუქი ტექსტი',
@@ -734,9 +751,6 @@ $1 სáƒáƒáƒ—ში.',
თქვენი IP — $3. თქვენი დáƒáƒ‘ლáƒáƒ™áƒ•áƒ˜áƒ¡ სáƒáƒ˜áƒ“ენტიფიკáƒáƒªáƒ˜áƒ ნáƒáƒ›áƒ”რირ$5. გთხáƒáƒ•áƒ— მიუთითáƒáƒ— ეს ნáƒáƒ›áƒ”რი, ნებისმიერ მიმáƒáƒ¬áƒ”რáƒáƒ¨áƒ˜.",
'blockednoreason' => 'სáƒáƒ‘áƒáƒ‘ი მითითებული áƒáƒ  áƒáƒ áƒ˜áƒ¡',
-'blockedoriginalsource' => "'''$1'''-ის წყáƒáƒ áƒ მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ ქვემáƒáƒ—:",
-'blockededitsource' => "ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ '''$1'''-ში თქვენი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ტექსტი:",
-'whitelistedittitle' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრსáƒáƒ­áƒ˜áƒ áƒáƒ”ბს სისტემáƒáƒ¨áƒ˜ შესვლáƒáƒ¡',
'whitelistedittext' => 'გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბისáƒáƒ—ვის თქვენ გესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒáƒ— $1.',
'confirmedittext' => 'გვერდების დáƒáƒ áƒ”დáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ›áƒ“ე უნდრდáƒáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒáƒ— თქვენი ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი. გთხáƒáƒ•áƒ— [[Special:Preferences|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒ›áƒ”ტრებში]] მიუთითáƒáƒ— დრდáƒáƒáƒ›áƒáƒ¬áƒ›áƒáƒ— ელფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი.',
'nosuchsectiontitle' => 'სექცირáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს',
@@ -821,7 +835,7 @@ $1 სáƒáƒáƒ—ში.',
*თუ áƒáƒ  გსურთ, რáƒáƒ› თქვენი ნáƒáƒ›áƒ£áƒ¨áƒ”ვáƒáƒ áƒ˜ შეუზღუდáƒáƒ•áƒáƒ“ იქნეს რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული, მáƒáƒ¡ áƒáƒ¥ ნუ გáƒáƒœáƒáƒ—áƒáƒ•áƒ¡áƒ”ბთ.<br />
*თქვენ áƒáƒ’რეთვე პირáƒáƒ‘áƒáƒ¡ დებთ, რáƒáƒ› თქვენს მიერ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბული ტექსტი თქვენი დáƒáƒ¬áƒ”რილიáƒ, áƒáƒœ გáƒáƒ“მáƒáƒ¬áƒ”რილირსáƒáƒ–áƒáƒ’áƒáƒ“áƒáƒ”ბრივი დáƒáƒ›áƒ”ნიდáƒáƒœ áƒáƒœ მსგáƒáƒ•áƒ¡áƒ˜ თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ წყáƒáƒ áƒáƒ“áƒáƒœ. (იხ. $1 დეტáƒáƒšáƒ”ბისთვის).
*'''ნუ შემáƒáƒ˜áƒ¢áƒáƒœáƒ— სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებებით დáƒáƒªáƒ£áƒš ნáƒáƒ¨áƒ áƒáƒ›áƒ¡ áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ¡ ნებáƒáƒ áƒ—ვის გáƒáƒ áƒ”შე!'''",
-'longpageerror' => "'''შეცდáƒáƒ›áƒ: თქვენს მიერ შემáƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ტექსტი $1 კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒ, რáƒáƒª áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბ $2 კბ-ს. მისი შენáƒáƒ®áƒ•áƒ შეუძლებელიáƒ.'''",
+'longpageerror' => "'''შეცდáƒáƒ›áƒ: თქვენს მიერ áƒáƒ™áƒ áƒ”ფილი ტექსტის ზáƒáƒ›áƒ {{PLURAL:$1|$1 კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒ}}, რáƒáƒª áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბáƒ, დáƒáƒ“გენილ {{PLURAL:$2|$2 კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒáƒœ}} ზღვáƒáƒ áƒ¡. გვერდის შენáƒáƒ®áƒ•áƒ შეუძლებელიáƒ.'''",
'readonlywarning' => "'''გáƒáƒ¤áƒ áƒ—ხილებáƒ''': მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რდáƒáƒ®áƒ£áƒ áƒ£áƒšáƒ˜áƒ პერიáƒáƒ“ული შემáƒáƒ¬áƒ›áƒ”ბისთვის, შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ თქვენ ვერ შეძლებთ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ¡ áƒáƒ› მáƒáƒ›áƒ”ნტში.
სáƒáƒ¡áƒ£áƒ áƒ•áƒ”ლირტექსტის áƒáƒ¡áƒšáƒ˜ შეინáƒáƒ®áƒáƒ— ტექსტურ რედáƒáƒ¥áƒ¢áƒáƒ áƒ¨áƒ˜ დრმáƒáƒ’ვიáƒáƒœáƒ”ბით შემáƒáƒ˜áƒ¢áƒáƒœáƒáƒ—.
@@ -989,8 +1003,6 @@ $3 -ემ áƒáƒ›áƒ’ვáƒáƒ áƒ˜ áƒáƒ®áƒ¡áƒœáƒ : ''$2''",
'revdelete-unsuppress' => 'მáƒáƒ®áƒ¡áƒ”ნით შეზღუდვრვერსიების áƒáƒ¦áƒ“გენისგáƒáƒœ',
'revdelete-log' => 'მიზეზი:',
'revdelete-submit' => '{{PLURAL:$1|áƒáƒ áƒ©áƒ”ული ვერსიის|áƒáƒ áƒ©áƒ”ული ვერსიების}} გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებáƒ',
-'revdelete-logentry' => 'გვერდის ვერსიის ხილვáƒáƒ“áƒáƒ‘ის შეცვლრ[[$1]]',
-'logdelete-logentry' => 'შეცვლილირმáƒáƒ•áƒšáƒ”ნის ხილვáƒáƒ“áƒáƒ‘რ[[$1]]-თვის',
'revdelete-success' => "'''ვერსიის ხილვáƒáƒ“áƒáƒ‘რშეიცვáƒáƒšáƒ.'''",
'revdelete-failure' => "'''ვერსიის ხილვáƒáƒ“áƒáƒ‘რáƒáƒ  შეიძლებრდáƒáƒ§áƒ”ნებული იქნáƒáƒ¡:'''
$1",
@@ -1002,15 +1014,6 @@ $1",
'revdel-restore-visible' => 'ხილვáƒáƒ“ი ვერსიები',
'pagehist' => 'გვერდის ისტáƒáƒ áƒ˜áƒ',
'deletedhist' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ისტáƒáƒ áƒ˜áƒ',
-'revdelete-content' => 'შინáƒáƒáƒ áƒ¡áƒ˜',
-'revdelete-summary' => 'ცვლილებების áƒáƒ¦áƒ¬áƒ”რáƒ',
-'revdelete-uname' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი',
-'revdelete-restricted' => 'შეზღუდვრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒ“მი',
-'revdelete-unrestricted' => 'შეზღუდვები მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒ“მი',
-'revdelete-hid' => 'დáƒáƒ›áƒáƒšáƒ $1',
-'revdelete-unhid' => 'áƒáƒ¦áƒ“გრ$1',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|ვერსიáƒ|ვერსიები|ვერსიებისთვის}}',
-'logdelete-log-message' => '$1 $2 {{PLURAL:$2|მáƒáƒ•áƒšáƒ”ნისáƒáƒ—ვის|მáƒáƒ•áƒšáƒ”ნისáƒáƒ—ვის}}',
'revdelete-hide-current' => 'ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒáƒšáƒ•áƒ˜áƒ¡ შეცდიმრ$2, $1: ეს áƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ›áƒ”დი ვერსიáƒ:
იგი áƒáƒ  შეიძლებრდáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜ იქნáƒáƒ¡.',
'revdelete-show-no-access' => 'ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ $2-დáƒáƒœ, $1: ეს ჩáƒáƒœáƒáƒ¬áƒ”რი მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ რáƒáƒ’áƒáƒ áƒª «შეზღუდული». თქვენ მáƒáƒ¡ ვერ იხილáƒáƒ•áƒ—.',
@@ -1165,12 +1168,14 @@ $1",
'prefs-rc' => 'ბáƒáƒšáƒ ცვლილებები',
'prefs-watchlist' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒ',
'prefs-watchlist-days' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜ სáƒáƒ©áƒ•áƒ”ნებელი დღეები:',
-'prefs-watchlist-days-max' => 'მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› 7 დღე',
+'prefs-watchlist-days-max' => 'მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღე|დღე}}',
'prefs-watchlist-edits' => 'ცვლილებების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის ჩვენებრვრცელ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜:',
'prefs-watchlist-edits-max' => 'მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: 1000',
'prefs-watchlist-token' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის ტáƒáƒ™áƒ”ნი:',
'prefs-misc' => 'სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒ',
'prefs-resetpass' => 'შეცვáƒáƒšáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
+'prefs-changeemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შეცვლáƒ',
+'prefs-setemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ§áƒ”ნებáƒ',
'prefs-email' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები',
'prefs-rendering' => 'იერსáƒáƒ®áƒ”',
'saveprefs' => 'შენáƒáƒ®áƒ•áƒ',
@@ -1269,7 +1274,7 @@ $1",
'userrights-lookup-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების მáƒáƒ áƒ—ვáƒ',
'userrights-user-editname' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის შეტáƒáƒœáƒ:',
'editusergroup' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'editinguser' => "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) უფლებების შეცვლáƒ",
+'editinguser' => "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებების შეცვლრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრგáƒáƒ£áƒ™áƒ”თეთ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფებს',
'saveusergroups' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების შენáƒáƒ®áƒ•áƒ',
'userrights-groupsmember' => 'ჯგუფის წევრი:',
@@ -1363,7 +1368,6 @@ $1",
'right-autopatrol' => 'შესწáƒáƒ áƒ”ბები áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ áƒáƒ¦áƒ˜áƒœáƒ˜áƒ¨áƒœáƒ”ბრრáƒáƒ’áƒáƒ áƒª პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბáƒáƒ“ი',
'right-patrolmarks' => 'პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ¡ ხილვრბáƒáƒšáƒ ცვლილებებში',
'right-unwatchedpages' => 'áƒáƒ áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ áƒ”ბáƒáƒ“ი გვერდების სიის ხილვáƒ',
-'right-trackback' => 'Trackback-ის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
'right-mergehistory' => 'გáƒáƒáƒ”რთიáƒáƒœáƒ”თ გვერდების ისტáƒáƒ áƒ˜áƒ',
'right-userrights' => 'ყველრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებების შეცვლáƒ',
'right-userrights-interwiki' => 'შეáƒáƒ¡áƒ¬áƒáƒ áƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებები სხვრვიკიზე',
@@ -1403,16 +1407,17 @@ $1",
'action-suppressionlog' => 'áƒáƒ› კერძრჟურნáƒáƒšáƒ˜áƒ¡ ხილვáƒ',
'action-block' => 'áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ',
'action-protect' => 'áƒáƒ› გვერდის დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლáƒ',
+'action-rollback' => 'გáƒáƒ áƒ™áƒ•áƒ”ულ გვერდზე ბáƒáƒšáƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის სწრáƒáƒ¤áƒ˜ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
'action-import' => 'áƒáƒ› გვერდის იმპáƒáƒ áƒ¢áƒ˜ სხვრვიკიდáƒáƒœ',
'action-importupload' => 'áƒáƒ› გვერდის იმპáƒáƒ áƒ¢áƒ˜ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ',
'action-patrol' => 'სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის შესწáƒáƒ áƒ”ბის მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ შემáƒáƒ¬áƒ›áƒ”ბულáƒáƒ“',
'action-autopatrol' => 'თქვენი ცვლილების მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბáƒáƒ“ით',
'action-unwatchedpages' => 'იმ გვერდების ხილვáƒ, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ áƒáƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ¨áƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡ შესული',
-'action-trackback' => 'trackback-ის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
'action-mergehistory' => 'áƒáƒ› გვერდის ისტáƒáƒ áƒ˜áƒ˜áƒ¡ შერწყმáƒ',
'action-userrights' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების ცვლილებáƒ',
'action-userrights-interwiki' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების უფლებების შეცვლრსხვრვიკიებში',
'action-siteadmin' => 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ დრგáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ',
+'action-sendemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ”ბის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
# Recent changes
'nchanges' => '$1 ცვლილებáƒ',
@@ -1444,6 +1449,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის/ები კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜]',
'rc_categories' => 'მხáƒáƒšáƒáƒ“ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბიდáƒáƒœ (გáƒáƒœáƒáƒªáƒáƒšáƒ™áƒ”ვეთ "|"-ის მიხედვით)',
'rc_categories_any' => 'ნებისმიერი',
+'rc-change-size-new' => 'ზáƒáƒ›áƒ ცვლილების შემდეგ áƒáƒ áƒ˜áƒ¡: {{PLURAL:$1|ბáƒáƒ˜áƒ¢áƒ˜|ბáƒáƒ˜áƒ¢áƒ˜}}',
'newsectionsummary' => '/* $1 */ áƒáƒ®áƒáƒšáƒ˜ სექციáƒ',
'rc-enhanced-expand' => 'დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებრ(მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ ჯáƒáƒ•áƒáƒ¡áƒ™áƒ áƒ˜áƒžáƒ¢áƒ¡)',
'rc-enhanced-hide' => 'დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒáƒšáƒ•áƒ',
@@ -1497,6 +1503,7 @@ $1",
'ignorewarnings' => 'უგულებელყáƒáƒ•áƒ˜ ნებისმიერი გáƒáƒ¤áƒ áƒ—ხილებáƒ',
'minlength1' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი უნდრიყáƒáƒ¡ áƒáƒ áƒáƒœáƒáƒ™áƒšáƒ”ბ ერთი áƒáƒ¡áƒ.',
'illegalfilename' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი "$1" შეიცáƒáƒ•áƒ¡ სიმბáƒáƒšáƒáƒ”ბს, რáƒáƒ›áƒ”ლთრგáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒª áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნებáƒáƒ“áƒáƒ áƒ—ული სáƒáƒ—áƒáƒ£áƒ áƒ”ბში. გთხáƒáƒ•áƒ—, შეცვáƒáƒšáƒáƒ— ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი დრსცáƒáƒ“áƒáƒ— მისი ხელმეáƒáƒ áƒ”დ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ.',
+'filename-toolong' => 'ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრáƒáƒ­áƒáƒ áƒ‘ებდეს 240 ბáƒáƒ˜áƒ¢áƒ¡.',
'badfilename' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ®áƒ”ლებრშეცვლილირ"$1"-ით.',
'filetype-mime-mismatch' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ".$1" áƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბრáƒáƒ¦áƒ›áƒáƒ©áƒ”ნილ MIME ტიპის ($2) ფáƒáƒ˜áƒšáƒ¡.',
'filetype-badmime' => '"$1" MIME ტიპის ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრდáƒáƒ¨áƒ•áƒ”ბული áƒáƒ  áƒáƒ áƒ˜áƒ¡.',
@@ -1588,6 +1595,20 @@ $1',
'upload-unknown-size' => 'უცნáƒáƒ‘ი ზáƒáƒ›áƒ',
'upload-http-error' => 'მáƒáƒ®áƒ“რHTTP შეცდáƒáƒ›áƒ: $1',
+# File backend
+'backend-fail-stream' => 'ფáƒáƒ˜áƒšáƒ˜ $1 ტრáƒáƒœáƒ¡áƒšáƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-backup' => 'ფáƒáƒ˜áƒšáƒ˜ $1 სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ™áƒ”თებრვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-notexists' => 'ფáƒáƒ˜áƒšáƒ˜ $1 áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
+'backend-fail-delete' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის წáƒáƒ¨áƒšáƒ ვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-alreadyexists' => 'ფáƒáƒ˜áƒšáƒ˜ $1 უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
+'backend-fail-store' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის შენáƒáƒ®áƒ•áƒ $2-ზე ვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-copy' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის კáƒáƒžáƒ˜áƒ áƒ”ბრ$2-ში ვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-move' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ $2-ში ვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-opentemp' => 'დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ ვერ ხერხდებáƒ.',
+'backend-fail-closetemp' => 'დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ ვერ ხერხდებáƒ.',
+'backend-fail-read' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის წáƒáƒ™áƒ˜áƒ—ხვრვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-create' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'წáƒáƒ áƒ›áƒáƒ˜áƒ¥áƒ›áƒœáƒ შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ZIP შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ—ვის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡.',
'zip-wrong-format' => 'მáƒáƒªáƒ”მული ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ ZIP-ფáƒáƒ˜áƒšáƒ˜.',
@@ -1712,23 +1733,24 @@ $1',
'filerevert-badversion' => 'áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ფáƒáƒ˜áƒšáƒ˜áƒ¡ წინრლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ ვერსირმáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ—რდრდრáƒáƒ˜áƒ—',
# File deletion
-'filedelete' => '$1 წáƒáƒ¨áƒšáƒ',
-'filedelete-legend' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ',
-'filedelete-intro' => "თქვენ შლით '''[[Media:$1|$1]]''' მისი ისტáƒáƒ áƒ˜áƒ˜áƒ—.",
-'filedelete-intro-old' => '<span class="plainlinks">თქვენ შლით ვერსიáƒáƒ¡ \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3, $2]-დáƒáƒœ.</span>',
-'filedelete-comment' => 'მიზეზი:',
-'filedelete-submit' => 'წáƒáƒ¨áƒšáƒ',
-'filedelete-success' => "'''$1''' წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ.",
-'filedelete-success-old' => "ვერსირ'''[[Media:$1|$1]]''' $3 $2-დáƒáƒœ წáƒáƒ˜áƒ¨áƒáƒšáƒ.",
-'filedelete-nofile' => "'''$1''' áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.",
-'filedelete-nofile-old' => "მითითებული áƒáƒ¢áƒ áƒ˜áƒ‘უტებით '''$1'''-ის áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ áƒ”ბული ვერსირáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.",
-'filedelete-otherreason' => 'სხვáƒ/დáƒáƒ›áƒáƒ¢áƒ”ბითი მიზეზი:',
-'filedelete-reason-otherlist' => 'სხვრმიზეზი',
-'filedelete-reason-dropdown' => '* წáƒáƒ¨áƒšáƒ˜áƒ¡ ხშირი მიზეზები
+'filedelete' => '$1 წáƒáƒ¨áƒšáƒ',
+'filedelete-legend' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ',
+'filedelete-intro' => "თქვენ შლით '''[[Media:$1|$1]]''' მისი ისტáƒáƒ áƒ˜áƒ˜áƒ—.",
+'filedelete-intro-old' => '<span class="plainlinks">თქვენ შლით ვერსიáƒáƒ¡ \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3, $2]-დáƒáƒœ.</span>',
+'filedelete-comment' => 'მიზეზი:',
+'filedelete-submit' => 'წáƒáƒ¨áƒšáƒ',
+'filedelete-success' => "'''$1''' წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ.",
+'filedelete-success-old' => "ვერსირ'''[[Media:$1|$1]]''' $3 $2-დáƒáƒœ წáƒáƒ˜áƒ¨áƒáƒšáƒ.",
+'filedelete-nofile' => "'''$1''' áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.",
+'filedelete-nofile-old' => "მითითებული áƒáƒ¢áƒ áƒ˜áƒ‘უტებით '''$1'''-ის áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ áƒ”ბული ვერსირáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.",
+'filedelete-otherreason' => 'სხვáƒ/დáƒáƒ›áƒáƒ¢áƒ”ბითი მიზეზი:',
+'filedelete-reason-otherlist' => 'სხვრმიზეზი',
+'filedelete-reason-dropdown' => '* წáƒáƒ¨áƒšáƒ˜áƒ¡ ხშირი მიზეზები
** სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებების დáƒáƒ áƒ¦áƒ•áƒ”ვáƒ
** ფáƒáƒ˜áƒšáƒ˜-დუბლიკáƒáƒ¢áƒ˜',
-'filedelete-edit-reasonlist' => 'წáƒáƒ¨áƒšáƒ˜áƒ¡ მიზეზების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'filedelete-maintenance' => 'ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ დრáƒáƒ¦áƒ“გენრდრáƒáƒ”ბით გáƒáƒ—იშულირტექნიკური სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ‘ის გáƒáƒœáƒ›áƒáƒ•áƒšáƒáƒ‘áƒáƒ¨áƒ˜.',
+'filedelete-edit-reasonlist' => 'წáƒáƒ¨áƒšáƒ˜áƒ¡ მიზეზების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+'filedelete-maintenance' => 'ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ დრáƒáƒ¦áƒ“გენრდრáƒáƒ”ბით გáƒáƒ—იშულირტექნიკური სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ‘ის გáƒáƒœáƒ›áƒáƒ•áƒšáƒáƒ‘áƒáƒ¨áƒ˜.',
+'filedelete-maintenance-title' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ ვერ ხერხდებáƒ',
# MIME search
'mimesearch' => 'MIME ძიებáƒ',
@@ -1835,6 +1857,7 @@ $1',
'mostimages' => 'ყველáƒáƒ–ე მეტი ბმულების მქáƒáƒœáƒ” ფáƒáƒ˜áƒšáƒ”ბი',
'mostrevisions' => 'ყველáƒáƒ–ე მეტáƒáƒ“ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული სტáƒáƒ¢áƒ˜áƒ”ბი',
'prefixindex' => 'ყველრგვერდი (თáƒáƒ•áƒ¡áƒáƒ áƒ—ით)',
+'prefixindex-namespace' => 'ყველრპრეფიქსიáƒáƒœáƒ˜ გვერდი ($1 სáƒáƒ®áƒ”ლთრსივრცე)',
'shortpages' => 'მáƒáƒ™áƒšáƒ” გვერდები',
'longpages' => 'გრძელი გვერდები',
'deadendpages' => 'ჩიხის გვერდები',
@@ -1851,7 +1874,7 @@ $1',
'listusers-editsonly' => 'áƒáƒ©áƒ•áƒ”ნთ მხáƒáƒšáƒáƒ“ ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები, რáƒáƒ›áƒšáƒ”ბსáƒáƒª ერთი შესწáƒáƒ áƒ”ბრáƒáƒ¥áƒ•áƒ¡ გáƒáƒ™áƒ”თებული.',
'listusers-creationsort' => 'დáƒáƒáƒšáƒáƒ’ეთ შექმნის თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ მიხედვით.',
'usereditcount' => '$1 რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'usercreated' => 'შექმნილირ$1 $2-ში',
+'usercreated' => '{{GENDER:$3|შექმნილიáƒ}} $2-ზე $1-ში',
'newpages' => 'áƒáƒ®áƒáƒšáƒ˜ გვერდები',
'newpages-username' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
'ancientpages' => 'ხáƒáƒœáƒ“áƒáƒ–მული გვერდები',
@@ -1945,12 +1968,8 @@ $1',
'activeusers-noresult' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები áƒáƒ  áƒáƒ áƒ˜áƒáƒœ ნáƒáƒžáƒáƒ•áƒœáƒ˜.',
# Special:Log/newusers
-'newuserlogpage' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
-'newuserlogpagetext' => 'ბáƒáƒšáƒ დრáƒáƒ¡ დáƒáƒ áƒ”გისტრირებულ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსიáƒ',
-'newuserlog-byemail' => 'პáƒáƒ áƒáƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ—áƒáƒ გáƒáƒ›áƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜',
-'newuserlog-create-entry' => 'áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი',
-'newuserlog-create2-entry' => 'შექმნრáƒáƒ®áƒáƒšáƒ˜ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1',
-'newuserlog-autocreate-entry' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ შექმნილი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
+'newuserlogpage' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
+'newuserlogpagetext' => 'ბáƒáƒšáƒ დრáƒáƒ¡ დáƒáƒ áƒ”გისტრირებულ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსიáƒ',
# Special:ListGroupRights
'listgrouprights' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების უფლებები',
@@ -1978,7 +1997,7 @@ $1',
'emailpage' => 'ელ. ფáƒáƒ¡áƒ¢áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
'emailpagetext' => 'თუ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრთáƒáƒ•áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრებში ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მáƒáƒ¥áƒ›áƒ”დი მისáƒáƒ›áƒáƒ áƒ—ი მიუთითáƒ, ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ áƒ›áƒ˜áƒ¡ შევსებისáƒáƒ¡ შეგიძლიáƒáƒ— მისთვის შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•áƒœáƒ. ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი, რáƒáƒ›áƒ”ლიც [[Special:Preferences|თქვენს პáƒáƒ áƒáƒ›áƒ”ტრებში]] მიუთითეთ, დáƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ áƒ“ებრ„გáƒáƒ›áƒáƒ›áƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡â€œ ველში, რáƒáƒ—რáƒáƒ“რესáƒáƒ¢áƒ›áƒ პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒªáƒ”მრშეძლáƒáƒ¡.',
'usermailererror' => 'ელ. ფáƒáƒ¡áƒ¢áƒ დáƒáƒ‘რუნდრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ:',
-'defemailsubject' => 'წერილი ვიკიპედიიდáƒáƒœ, თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ ქáƒáƒ áƒ—ული ენციკლáƒáƒžáƒ”დიიდáƒáƒœ.',
+'defemailsubject' => 'ელ-ფáƒáƒ¡áƒ¢áƒ სáƒáƒ˜áƒ¢áƒ˜áƒ¡ {{SITENAME}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისგáƒáƒœ „$1“',
'usermaildisabled' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის e-mail გáƒáƒ—იშულიáƒ',
'usermaildisabledtext' => 'თქვენ ვერ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ— e-mail-ს.',
'noemailtitle' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი მითითებული áƒáƒ  áƒáƒ áƒ˜áƒ¡',
@@ -2034,7 +2053,7 @@ $1',
'watchmethod-list' => 'მიმდინáƒáƒ áƒ”áƒáƒ‘ს თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ქვეშ მყáƒáƒ¤áƒ˜ გვერდების შემáƒáƒ¬áƒ›áƒ”ბრუáƒáƒ®áƒšáƒ”სი შესწáƒáƒ áƒ”ბების მიხედვით.',
'watchlistcontains' => 'თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სირშეიცáƒáƒ•áƒ¡ $1 გვერდს.',
'iteminvalidname' => '„$1-ს“ პრáƒáƒ‘ლემრáƒáƒ¥áƒ•áƒ¡, სáƒáƒ®áƒ”ლი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ...',
-'wlnote' => 'ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ ბáƒáƒšáƒ $1 ცვლილებრუკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი <b>$2</b> სáƒáƒáƒ—ის გáƒáƒœáƒ›áƒáƒ•áƒšáƒáƒ‘áƒáƒ¨áƒ˜.',
+'wlnote' => "ქვემáƒáƒ— {{PLURAL:$1|ნáƒáƒ©áƒ•áƒ”ნებირბáƒáƒšáƒ ცვლილებáƒ|ნáƒáƒ©áƒ•áƒ”ნებირბáƒáƒšáƒ '''$1''' ცვლილებáƒ}} უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი {{PLURAL:$2|სáƒáƒáƒ—ის|'''$2''' სáƒáƒáƒ—ის}} მáƒáƒœáƒ«áƒ˜áƒšáƒ–ე, $3, $4 მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ით.",
'wlshowlast' => 'áƒáƒ©áƒ•áƒ”ნე ბáƒáƒšáƒ $1 სáƒáƒáƒ—ის $2 დღის $3',
'watchlist-options' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის პáƒáƒ áƒáƒ›áƒ”ტრები',
@@ -2097,8 +2116,6 @@ $UNWATCHURL
'actioncomplete' => 'მáƒáƒ¥áƒ›áƒ”დებრშესრულებულიáƒ',
'actionfailed' => 'მáƒáƒ¥áƒ›áƒ”დებრვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ',
'deletedtext' => '„$1“ წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ. ბáƒáƒšáƒ წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ გვერდების სირიხილეთ $2-ში.',
-'deletedarticle' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ „[[$1]]“',
-'suppressedarticle' => 'დáƒáƒ›áƒáƒšáƒ «[[$1]]»-მáƒ',
'dellogpage' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ—áƒ_სიáƒ',
'dellogpagetext' => 'ქვემáƒáƒ— იხილეთ áƒáƒ®áƒšáƒáƒ“ წáƒáƒ¨áƒšáƒ˜áƒšáƒ—რსიáƒ.',
'deletionlog' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ—რსიáƒ',
@@ -2146,7 +2163,9 @@ $UNWATCHURL
'unprotectedarticle' => '„[[$1]]“-დáƒáƒœ დáƒáƒªáƒ•áƒ მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ',
'movedarticleprotection' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების გáƒáƒ“áƒáƒ¢áƒáƒœáƒ გვერდიდáƒáƒœ „[[$2]]“ გვერდზე „[[$1]]“',
'protect-title' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლრგვერდისთვის „$1“',
+'protect-title-notallowed' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ ხილვრგვერდისთვის „$1“',
'prot_1movedto2' => '[[$1]] გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ გვერდზე [[$2]]',
+'protect-badnamespace-title' => 'დáƒáƒ£áƒªáƒ•áƒ”ლი სáƒáƒ®áƒ”ლთრსივრცე',
'protect-legend' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ',
'protectcomment' => 'მიზეზი:',
'protectexpiry' => 'ვáƒáƒ“áƒ',
@@ -2167,6 +2186,7 @@ $UNWATCHURL
'protect-level-sysop' => 'მხáƒáƒšáƒáƒ“ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბი',
'protect-summary-cascade' => 'იერáƒáƒ áƒ¥áƒ˜áƒ£áƒšáƒ˜',
'protect-expiring' => 'ვáƒáƒ“რგáƒáƒ¡áƒ“ის: $1 (UTC)',
+'protect-expiring-local' => 'ვáƒáƒ“ის გáƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ $1',
'protect-expiry-indefinite' => 'გáƒáƒœáƒ£áƒ¡áƒáƒ–ღვრელი',
'protect-cascade' => 'áƒáƒ› გვერდში ჩáƒáƒ áƒ—ული გვერდების დáƒáƒªáƒ•áƒ (იერáƒáƒ áƒ¥áƒ˜áƒ£áƒšáƒ˜ დáƒáƒªáƒ•áƒ)',
'protect-cantedit' => 'თქვენ áƒáƒ  შეგიძლიáƒáƒ— áƒáƒ› გვერდის დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლáƒ, ვინáƒáƒ˜áƒ“áƒáƒœ áƒáƒ  გáƒáƒ¥áƒ•áƒ— მისი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ნებáƒáƒ áƒ—ვáƒ.',
@@ -2224,7 +2244,6 @@ $UNWATCHURL
'undeletereset' => 'გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ',
'undeleteinvert' => 'გáƒáƒáƒ£áƒ¥áƒ›áƒ”თ გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ',
'undeletecomment' => 'მიზეზი:',
-'undeletedarticle' => 'áƒáƒ¦áƒ“გენილირ"[[$1]]"',
'undeletedrevisions' => '$1 ვერსირáƒáƒ¦áƒ“გენილიáƒ',
'undeletedrevisions-files' => '$1 ვერსირდრ$2 ფáƒáƒ˜áƒšáƒ˜ áƒáƒ¦áƒ“გენილიáƒ',
'undeletedfiles' => '$1 ფáƒáƒ˜áƒšáƒ˜ áƒáƒ¦áƒ“გენილიáƒ',
@@ -2233,6 +2252,7 @@ $UNWATCHURL
უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი წáƒáƒ¨áƒšáƒ˜áƒšáƒ—რდრáƒáƒ¦áƒ“გენის სირშეგიძლიáƒáƒ— ნáƒáƒ®áƒáƒ— [[Special:Log/delete|წáƒáƒ¨áƒšáƒ˜áƒšáƒ—რსიáƒáƒ¨áƒ˜]].",
'undelete-header' => 'ბáƒáƒšáƒáƒ¡ წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ გვერდების სიის ნáƒáƒ®áƒ•áƒ შეიძლებრ[[Special:Log/delete|წáƒáƒ¨áƒšáƒáƒ—რჟურნáƒáƒšáƒ¨áƒ˜]].',
+'undelete-search-title' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ გვერდების ძიებáƒ',
'undelete-search-box' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ გვერდების ძიებáƒ',
'undelete-search-prefix' => 'უჩვენეთ გვერდები, რáƒáƒ›áƒšáƒ”ბიც იწყებრáƒáƒ›áƒ’ვáƒáƒ áƒáƒ“:',
'undelete-search-submit' => 'ძიებáƒ',
@@ -2241,6 +2261,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'შეუძლებელირწáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრ$1-ში – იგი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘დრწáƒáƒ¨áƒšáƒáƒ›áƒ“ე.',
'undelete-cleanup-error' => 'გáƒáƒ›áƒáƒ£áƒ§áƒ”ნებელი სáƒáƒ áƒ¥áƒ˜áƒ•áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ «$1» წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ:',
'undelete-missing-filearchive' => 'შეუძლებელირფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრáƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ— $1, რáƒáƒ“გáƒáƒœáƒáƒª ის áƒáƒ  áƒáƒ áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜. შესáƒáƒ«áƒšáƒ”ბელირფáƒáƒ˜áƒšáƒ˜ უკვე áƒáƒ¦áƒ“გენილიáƒ.',
+'undelete-error' => 'შეცდáƒáƒ›áƒ გვერდის áƒáƒ¦áƒ“გენისáƒáƒ¡',
'undelete-error-short' => 'შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒáƒ¨áƒ˜: $1',
'undelete-error-long' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენისáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ˜áƒ¨áƒ•áƒ შეცდáƒáƒ›áƒ”ბი
@@ -2384,6 +2405,7 @@ $1',
'unblocklink' => 'ბლáƒáƒ™áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ',
'change-blocklink' => 'ბლáƒáƒ™áƒ˜áƒ¡ შეცვლáƒ',
'contribslink' => 'წვლილი',
+'emaillink' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ',
'autoblocker' => 'თქვენ áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ ბლáƒáƒ™áƒ˜áƒ áƒ”ბული ხáƒáƒ áƒ—, ვინáƒáƒ˜áƒ“áƒáƒœ თქვენი IP მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒ®áƒšáƒáƒ®áƒáƒœ იქნრგáƒáƒ›áƒáƒ§áƒ”ნებული "[[User:$1|$1]]"–ის მიერ. $1-ის ბლáƒáƒ™áƒ˜áƒ áƒ”ბის მიზეზი: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ—რáƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•áƒ',
'blocklog-showlog' => 'ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ.
@@ -2493,9 +2515,6 @@ $1',
'movepage-page-moved' => 'გვერდი $1 გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნრ$2-ში.',
'movepage-page-unmoved' => 'გვერდი $1 áƒáƒ  შეიძლებრგáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნáƒáƒ¡ $2-ზე.',
'movepage-max-pages' => '$1 {{PLURAL:$1|გვერდი გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ|გვერდები გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ”ს|გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ გვერდების}} — ეს ნáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜áƒ. áƒáƒ•áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ მეტი გვერდის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ áƒáƒ  შეიძლებáƒ.',
-'1movedto2' => '[[$1]] გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ გვერდზე [[$2]]',
-'1movedto2_redir' => '[[$1]] გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ [[$2]]-ზე გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებულ გვერდში',
-'move-redirect-suppressed' => 'გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ',
'movelogpage' => 'გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეგისტრáƒáƒªáƒ˜áƒ',
'movelogpagetext' => 'ქვემáƒáƒ— წáƒáƒ áƒ›áƒáƒ“გენილირგáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒš გვერდთრსიáƒ.',
'movesubpage' => '{{PLURAL:$1|ქვეგვერდი|ქვეგვერდები}}',
@@ -2508,7 +2527,7 @@ $1',
სტáƒáƒ¢áƒ˜áƒ დáƒáƒ¡áƒáƒ®áƒ”ლებით "[[:$1]]" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გსურთ მისი წáƒáƒ¨áƒšáƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის áƒáƒ“გილის დáƒáƒ¡áƒáƒ—მáƒáƒ‘áƒáƒ“?',
'delete_and_move_confirm' => 'დიáƒáƒ®, წáƒáƒ¨áƒáƒšáƒ”თ ეს გვერდი',
-'delete_and_move_reason' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის áƒáƒ“გილის დáƒáƒ¡áƒáƒ—მáƒáƒ‘áƒáƒ“',
+'delete_and_move_reason' => 'წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ "[[$1]]"-დáƒáƒœ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის áƒáƒ“გილის დáƒáƒ¡áƒáƒ—მáƒáƒ‘áƒáƒ“',
'selfmove' => 'წყáƒáƒ áƒ დრდáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ”ბის სáƒáƒ—áƒáƒ£áƒ áƒ”ბი მსგáƒáƒ•áƒ¡áƒ˜áƒ; შეუძლებელირგვერდის სáƒáƒ™áƒ£áƒ—áƒáƒ  თáƒáƒ•áƒ–ე გáƒáƒ“áƒáƒ¢áƒáƒœáƒ.',
'immobile-source-namespace' => 'შეუძლებელირსáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრ«$1» სáƒáƒ®áƒ”ლთრსივრცეში',
'immobile-target-namespace' => 'შეუძლებელირგვერდის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ «$1» სáƒáƒ®áƒ”ლთრსივრცეში',
@@ -2537,6 +2556,7 @@ $1',
გვერდის ექსპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბისთვის შეიყვáƒáƒœáƒ”თ მáƒáƒ—ი სáƒáƒ®áƒ”ლები თითრხáƒáƒ–ზე დრáƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ, თუ გსურთ სტáƒáƒ¢áƒ˜áƒ˜áƒ¡ ყველრვერსიის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ, თუ მხáƒáƒšáƒáƒ“ ბáƒáƒšáƒ ვერსიისáƒ.
თქვენ შეგიძლიáƒáƒ— áƒáƒ¡áƒ”ვე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— სპეციáƒáƒšáƒ£áƒ áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ი გვერდის მხáƒáƒšáƒáƒ“ ბáƒáƒšáƒ ვერსიის სáƒáƒ”ქსპáƒáƒ áƒ¢áƒáƒ“. მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“ [[{{MediaWiki:Mainpage}}]] ეს áƒáƒ áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'ყველრგვერდის ექსპáƒáƒ áƒ¢áƒ˜',
'exportcuronly' => 'მიუთითეთ მხáƒáƒšáƒáƒ“ მიმდინáƒáƒ áƒ” ცვლილებáƒ, დრáƒáƒ áƒ სრული ისტáƒáƒ áƒ˜áƒ',
'exportnohistory' => "----
'''ყურáƒáƒ“ღებáƒ:''' გვერდის ყველრვერსიის ექსპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბრგáƒáƒ—იშუკირსერვერზე დáƒáƒ¢áƒ•áƒ˜áƒ áƒ¢áƒ•áƒ˜áƒ¡ გáƒáƒ›áƒ.",
@@ -2624,72 +2644,80 @@ $1',
'import-logentry-interwiki' => '«$1» — ტრáƒáƒœáƒ¡áƒ•áƒ˜áƒ™áƒ˜ იმპáƒáƒ áƒ¢áƒ˜',
'import-logentry-interwiki-detail' => '$1 ცვლილებრ$2-დáƒáƒœ',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-ის ტესტირებáƒ',
+'javascripttest-disabled' => 'ეს ფუნქცირგáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
+'javascripttest-title' => 'მიმდინáƒáƒ áƒ”áƒáƒ‘ს $1-ის ტესტირებáƒ',
+'javascripttest-qunit-intro' => 'იხილეთ [$1 ტესტირების დáƒáƒ™áƒ£áƒ›áƒ”ნტები] mediawiki.org-ზე.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'თქვენი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდი',
-'tooltip-pt-anonuserpage' => 'ჩემი IP-ის მქáƒáƒœáƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდი',
-'tooltip-pt-mytalk' => 'თქვენი გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდი',
-'tooltip-pt-anontalk' => 'ჩემი IP-ის გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდი',
-'tooltip-pt-preferences' => 'ჩემი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
-'tooltip-pt-watchlist' => 'გვერდების სიáƒ, რáƒáƒ›áƒ”ლთრცვლილებებს თქვენ უთვáƒáƒšáƒ—ვáƒáƒšáƒ”ბთ',
-'tooltip-pt-mycontris' => 'თქვენი წვლილის სიáƒ',
-'tooltip-pt-login' => 'სáƒáƒ¡áƒ£áƒ áƒ•áƒ”ლირდáƒáƒ áƒ”გისტრირდეთ, თუმცრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირáƒáƒ áƒáƒ.',
-'tooltip-pt-anonlogin' => 'áƒáƒ¥ შეიძლებრრეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ•áƒšáƒ, თუმცრეს სáƒáƒ•áƒáƒšáƒ“ებულრáƒáƒ  áƒáƒ áƒ˜áƒ¡',
-'tooltip-pt-logout' => 'გáƒáƒ¡áƒ•áƒšáƒ',
-'tooltip-ca-talk' => 'შიგთáƒáƒ•áƒ¡áƒ˜áƒ¡ გვერდის გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
-'tooltip-ca-edit' => 'თქვენ შეგიძლიáƒáƒ— áƒáƒ› გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ. გთხáƒáƒ•áƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხედვის ღილáƒáƒ™áƒ˜ სáƒáƒœáƒáƒ› გვერდს შეინáƒáƒ®áƒáƒ•áƒ—.',
-'tooltip-ca-addsection' => 'áƒáƒ®áƒáƒšáƒ˜ სექციის შექმნáƒ',
-'tooltip-ca-viewsource' => 'გვერდი დáƒáƒªáƒ£áƒšáƒ˜áƒ. შეგიძლიáƒáƒ— იხილáƒáƒ— მისი წყáƒáƒ áƒ.',
-'tooltip-ca-history' => 'áƒáƒ› გვერდის ბáƒáƒšáƒ ვერსიები.',
-'tooltip-ca-protect' => 'გვერდის დáƒáƒªáƒ•áƒ',
-'tooltip-ca-unprotect' => 'áƒáƒ› გვერდის დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლáƒ',
-'tooltip-ca-delete' => 'áƒáƒ› გვერდის წáƒáƒ¨áƒšáƒ',
-'tooltip-ca-undelete' => 'áƒáƒ¦áƒáƒ“გინეთ გვერდის ცვლილებები მის წáƒáƒ¨áƒšáƒáƒ›áƒ“ე.',
-'tooltip-ca-move' => 'áƒáƒ› გვერდის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ',
-'tooltip-ca-watch' => 'დáƒáƒáƒ›áƒáƒ¢áƒ”თ ეს გვერდი თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¡',
-'tooltip-ca-unwatch' => 'მáƒáƒ®áƒ¡áƒ”ნით ეს გვერდი თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიიდáƒáƒœ',
-'tooltip-search' => 'ძიებრ{{SITENAME}}',
-'tooltip-search-go' => 'მáƒáƒ˜áƒ«áƒ˜áƒ” გვერდი ზუსტáƒáƒ“ áƒáƒ› სáƒáƒ®áƒ”ლით',
-'tooltip-search-fulltext' => 'მáƒáƒ«áƒ”ბნე გვერდები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ› ტექსტს შეიცáƒáƒ•áƒ”ნ',
-'tooltip-p-logo' => 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
-'tooltip-n-mainpage' => 'იხილეთ მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
-'tooltip-n-mainpage-description' => 'იხილეთ მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
-'tooltip-n-portal' => 'პრáƒáƒ”ქტის შესáƒáƒ®áƒ”ბ, რრშეგიძლიáƒáƒ— გáƒáƒáƒ™áƒ”თáƒáƒ—, სáƒáƒ“ იპáƒáƒ•áƒáƒ—',
-'tooltip-n-currentevents' => 'გáƒáƒ˜áƒ’ეთ ვრცელი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ მიმდინáƒáƒ áƒ” მáƒáƒ•áƒšáƒ”ნებზე',
-'tooltip-n-recentchanges' => 'ვიკიში ბáƒáƒšáƒ ცვლილებების სიáƒ.',
-'tooltip-n-randompage' => 'შემთხვევითი გვერდის ჩვენებáƒ',
-'tooltip-n-help' => 'გვერდი, სáƒáƒ“áƒáƒª იპáƒáƒ•áƒ˜áƒ—.',
-'tooltip-t-whatlinkshere' => 'ყველრვიკი გვერდის სიáƒ, რáƒáƒ›áƒšáƒ”ბშიც ეს გვერდირმითითებული',
-'tooltip-t-recentchangeslinked' => 'ბáƒáƒšáƒ ცვლილებები áƒáƒ› გვერდთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბულ გვერდებზე',
-'tooltip-feed-rss' => 'მáƒáƒªáƒ”მული გვერდის RSS áƒáƒ áƒ®áƒ˜áƒ¡ ტრáƒáƒœáƒ¡áƒáƒšáƒáƒªáƒ˜áƒ',
-'tooltip-feed-atom' => 'მáƒáƒªáƒ”მული გვერდის Atom áƒáƒ áƒ®áƒ˜áƒ¡ ტრáƒáƒœáƒ¡áƒáƒšáƒáƒªáƒ˜áƒ',
-'tooltip-t-contributions' => 'იხილეთ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვლილის სიáƒ',
-'tooltip-t-emailuser' => 'გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ” ელ. ფáƒáƒ¡áƒ¢áƒ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
-'tooltip-t-upload' => 'ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ მედიáƒáƒ¤áƒáƒ˜áƒšáƒ”ბი',
-'tooltip-t-specialpages' => 'ყველრსპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდის სიáƒ',
-'tooltip-t-print' => 'áƒáƒ› გვერდის დáƒáƒ¡áƒáƒ‘ეჭდი ვერსიáƒ',
-'tooltip-t-permalink' => 'მუდმივი ბმული გვერდის áƒáƒ› ვერსიáƒáƒ–ე',
-'tooltip-ca-nstab-main' => 'შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ჩვენებáƒ',
-'tooltip-ca-nstab-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდის ჩვენებáƒ',
-'tooltip-ca-nstab-media' => 'მედიáƒ-ფáƒáƒ˜áƒšáƒ˜',
-'tooltip-ca-nstab-special' => 'ეს სპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდიáƒ. მისი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრáƒáƒ  შეგიძლიáƒáƒ—.',
-'tooltip-ca-nstab-project' => 'იხილეთ პრáƒáƒ”ქტის გვერდი',
-'tooltip-ca-nstab-image' => 'სურáƒáƒ—ის გვერდის ჩვენებáƒ',
-'tooltip-ca-nstab-mediawiki' => 'იხილე სისტემური შეტყáƒáƒ‘ინებáƒ',
-'tooltip-ca-nstab-template' => 'თáƒáƒ áƒ’ის ჩვენებáƒ',
-'tooltip-ca-nstab-help' => 'იხილეთ დáƒáƒ®áƒ›áƒáƒ áƒ”ბის გვერდი',
-'tooltip-ca-nstab-category' => 'გვერდის კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ˜áƒ¡ ჩვენებáƒ',
-'tooltip-minoredit' => 'მáƒáƒœáƒ˜áƒ¨áƒœáƒ” რáƒáƒ’áƒáƒ áƒª მცირე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ[alt-i]',
-'tooltip-save' => 'დáƒáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ” ცვლილებები',
-'tooltip-preview' => 'წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დე ცვლილებებს, გთხáƒáƒ•áƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— ეს შენáƒáƒ®áƒ•áƒáƒ›áƒ“ე! [alt-p]',
-'tooltip-diff' => 'ტექსტში შეტáƒáƒœáƒ˜áƒšáƒ˜ ცვლილებების ჩვენებáƒ. [alt-v]',
-'tooltip-compareselectedversions' => 'იხილეთ áƒáƒ› გვერდის áƒáƒ  შერჩეულ ვერსიáƒáƒ¡ შáƒáƒ áƒ˜áƒ¡ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბები.',
-'tooltip-watch' => 'áƒáƒ› გვერდის დáƒáƒ›áƒáƒ¢áƒ”ბრთქვენს სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡ სიáƒáƒ¡ [alt-w]',
-'tooltip-recreate' => 'áƒáƒ¦áƒáƒ“გინე ეს გვერდი მიუხედáƒáƒ•áƒáƒ“ იმისáƒ, რáƒáƒ› წáƒáƒ¨áƒšáƒ˜áƒš იქნáƒ',
-'tooltip-upload' => 'დáƒáƒ˜áƒ¬áƒ§áƒ”თ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
-'tooltip-rollback' => 'ბáƒáƒšáƒ რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ მიერ გáƒáƒ™áƒ”თებული ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრერთი დáƒáƒ­áƒ”რით',
-'tooltip-undo' => 'შეტáƒáƒœáƒ˜áƒšáƒ˜ ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრდრწინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვის ჩვენებáƒ, გáƒáƒ£áƒ¥áƒ›áƒ”ბის მიზეზის სქáƒáƒšáƒ˜áƒáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“.',
-'tooltip-preferences-save' => 'შეინáƒáƒ®áƒ”თ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
-'tooltip-summary' => 'შეიყვáƒáƒœáƒ”თ მáƒáƒ™áƒšáƒ” სქáƒáƒšáƒ˜áƒ',
+'tooltip-pt-userpage' => 'თქვენი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდი',
+'tooltip-pt-anonuserpage' => 'ჩემი IP-ის მქáƒáƒœáƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდი',
+'tooltip-pt-mytalk' => 'თქვენი გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდი',
+'tooltip-pt-anontalk' => 'ჩემი IP-ის გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდი',
+'tooltip-pt-preferences' => 'ჩემი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
+'tooltip-pt-watchlist' => 'გვერდების სიáƒ, რáƒáƒ›áƒ”ლთრცვლილებებს თქვენ უთვáƒáƒšáƒ—ვáƒáƒšáƒ”ბთ',
+'tooltip-pt-mycontris' => 'თქვენი წვლილის სიáƒ',
+'tooltip-pt-login' => 'სáƒáƒ¡áƒ£áƒ áƒ•áƒ”ლირდáƒáƒ áƒ”გისტრირდეთ, თუმცრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირáƒáƒ áƒáƒ.',
+'tooltip-pt-anonlogin' => 'áƒáƒ¥ შეიძლებრრეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ•áƒšáƒ, თუმცრეს სáƒáƒ•áƒáƒšáƒ“ებულრáƒáƒ  áƒáƒ áƒ˜áƒ¡',
+'tooltip-pt-logout' => 'გáƒáƒ¡áƒ•áƒšáƒ',
+'tooltip-ca-talk' => 'შიგთáƒáƒ•áƒ¡áƒ˜áƒ¡ გვერდის გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
+'tooltip-ca-edit' => 'თქვენ შეგიძლიáƒáƒ— áƒáƒ› გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ. გთხáƒáƒ•áƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხედვის ღილáƒáƒ™áƒ˜ სáƒáƒœáƒáƒ› გვერდს შეინáƒáƒ®áƒáƒ•áƒ—.',
+'tooltip-ca-addsection' => 'áƒáƒ®áƒáƒšáƒ˜ სექციის შექმნáƒ',
+'tooltip-ca-viewsource' => 'გვერდი დáƒáƒªáƒ£áƒšáƒ˜áƒ. შეგიძლიáƒáƒ— იხილáƒáƒ— მისი წყáƒáƒ áƒ.',
+'tooltip-ca-history' => 'áƒáƒ› გვერდის ბáƒáƒšáƒ ვერსიები.',
+'tooltip-ca-protect' => 'გვერდის დáƒáƒªáƒ•áƒ',
+'tooltip-ca-unprotect' => 'áƒáƒ› გვერდის დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლáƒ',
+'tooltip-ca-delete' => 'áƒáƒ› გვერდის წáƒáƒ¨áƒšáƒ',
+'tooltip-ca-undelete' => 'áƒáƒ¦áƒáƒ“გინეთ გვერდის ცვლილებები მის წáƒáƒ¨áƒšáƒáƒ›áƒ“ე.',
+'tooltip-ca-move' => 'áƒáƒ› გვერდის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ',
+'tooltip-ca-watch' => 'დáƒáƒáƒ›áƒáƒ¢áƒ”თ ეს გვერდი თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¡',
+'tooltip-ca-unwatch' => 'მáƒáƒ®áƒ¡áƒ”ნით ეს გვერდი თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიიდáƒáƒœ',
+'tooltip-search' => 'ძიებრ{{SITENAME}}',
+'tooltip-search-go' => 'მáƒáƒ˜áƒ«áƒ˜áƒ” გვერდი ზუსტáƒáƒ“ áƒáƒ› სáƒáƒ®áƒ”ლით',
+'tooltip-search-fulltext' => 'მáƒáƒ«áƒ”ბნე გვერდები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ› ტექსტს შეიცáƒáƒ•áƒ”ნ',
+'tooltip-p-logo' => 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
+'tooltip-n-mainpage' => 'იხილეთ მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
+'tooltip-n-mainpage-description' => 'იხილეთ მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
+'tooltip-n-portal' => 'პრáƒáƒ”ქტის შესáƒáƒ®áƒ”ბ, რრშეგიძლიáƒáƒ— გáƒáƒáƒ™áƒ”თáƒáƒ—, სáƒáƒ“ იპáƒáƒ•áƒáƒ—',
+'tooltip-n-currentevents' => 'გáƒáƒ˜áƒ’ეთ ვრცელი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ მიმდინáƒáƒ áƒ” მáƒáƒ•áƒšáƒ”ნებზე',
+'tooltip-n-recentchanges' => 'ვიკიში ბáƒáƒšáƒ ცვლილებების სიáƒ.',
+'tooltip-n-randompage' => 'შემთხვევითი გვერდის ჩვენებáƒ',
+'tooltip-n-help' => 'გვერდი, სáƒáƒ“áƒáƒª იპáƒáƒ•áƒ˜áƒ—.',
+'tooltip-t-whatlinkshere' => 'ყველრვიკი გვერდის სიáƒ, რáƒáƒ›áƒšáƒ”ბშიც ეს გვერდირმითითებული',
+'tooltip-t-recentchangeslinked' => 'ბáƒáƒšáƒ ცვლილებები áƒáƒ› გვერდთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბულ გვერდებზე',
+'tooltip-feed-rss' => 'მáƒáƒªáƒ”მული გვერდის RSS áƒáƒ áƒ®áƒ˜áƒ¡ ტრáƒáƒœáƒ¡áƒáƒšáƒáƒªáƒ˜áƒ',
+'tooltip-feed-atom' => 'მáƒáƒªáƒ”მული გვერდის Atom áƒáƒ áƒ®áƒ˜áƒ¡ ტრáƒáƒœáƒ¡áƒáƒšáƒáƒªáƒ˜áƒ',
+'tooltip-t-contributions' => 'იხილეთ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვლილის სიáƒ',
+'tooltip-t-emailuser' => 'გáƒáƒ£áƒ’ზáƒáƒ•áƒœáƒ” ელ. ფáƒáƒ¡áƒ¢áƒ áƒáƒ› მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს',
+'tooltip-t-upload' => 'ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ეთ მედიáƒáƒ¤áƒáƒ˜áƒšáƒ”ბი',
+'tooltip-t-specialpages' => 'ყველრსპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდის სიáƒ',
+'tooltip-t-print' => 'áƒáƒ› გვერდის დáƒáƒ¡áƒáƒ‘ეჭდი ვერსიáƒ',
+'tooltip-t-permalink' => 'მუდმივი ბმული გვერდის áƒáƒ› ვერსიáƒáƒ–ე',
+'tooltip-ca-nstab-main' => 'შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ჩვენებáƒ',
+'tooltip-ca-nstab-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გვერდის ჩვენებáƒ',
+'tooltip-ca-nstab-media' => 'მედიáƒ-ფáƒáƒ˜áƒšáƒ˜',
+'tooltip-ca-nstab-special' => 'ეს სპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდიáƒ. მისი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრáƒáƒ  შეგიძლიáƒáƒ—.',
+'tooltip-ca-nstab-project' => 'იხილეთ პრáƒáƒ”ქტის გვერდი',
+'tooltip-ca-nstab-image' => 'სურáƒáƒ—ის გვერდის ჩვენებáƒ',
+'tooltip-ca-nstab-mediawiki' => 'იხილე სისტემური შეტყáƒáƒ‘ინებáƒ',
+'tooltip-ca-nstab-template' => 'თáƒáƒ áƒ’ის ჩვენებáƒ',
+'tooltip-ca-nstab-help' => 'იხილეთ დáƒáƒ®áƒ›áƒáƒ áƒ”ბის გვერდი',
+'tooltip-ca-nstab-category' => 'გვერდის კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ˜áƒ¡ ჩვენებáƒ',
+'tooltip-minoredit' => 'მáƒáƒœáƒ˜áƒ¨áƒœáƒ” რáƒáƒ’áƒáƒ áƒª მცირე რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ[alt-i]',
+'tooltip-save' => 'დáƒáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ” ცვლილებები',
+'tooltip-preview' => 'წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დე ცვლილებებს, გთხáƒáƒ•áƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— ეს შენáƒáƒ®áƒ•áƒáƒ›áƒ“ე! [alt-p]',
+'tooltip-diff' => 'ტექსტში შეტáƒáƒœáƒ˜áƒšáƒ˜ ცვლილებების ჩვენებáƒ. [alt-v]',
+'tooltip-compareselectedversions' => 'იხილეთ áƒáƒ› გვერდის áƒáƒ  შერჩეულ ვერსიáƒáƒ¡ შáƒáƒ áƒ˜áƒ¡ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბები.',
+'tooltip-watch' => 'áƒáƒ› გვერდის დáƒáƒ›áƒáƒ¢áƒ”ბრთქვენს სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒáƒ¡ სიáƒáƒ¡ [alt-w]',
+'tooltip-watchlistedit-normal-submit' => 'áƒáƒ áƒ©áƒ”ული სáƒáƒ—áƒáƒ£áƒ áƒ”ბის წáƒáƒ¨áƒšáƒ',
+'tooltip-watchlistedit-raw-submit' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ',
+'tooltip-recreate' => 'áƒáƒ¦áƒáƒ“გინე ეს გვერდი მიუხედáƒáƒ•áƒáƒ“ იმისáƒ, რáƒáƒ› წáƒáƒ¨áƒšáƒ˜áƒš იქნáƒ',
+'tooltip-upload' => 'დáƒáƒ˜áƒ¬áƒ§áƒ”თ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
+'tooltip-rollback' => 'ბáƒáƒšáƒ რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ მიერ გáƒáƒ™áƒ”თებული ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრერთი დáƒáƒ­áƒ”რით',
+'tooltip-undo' => 'შეტáƒáƒœáƒ˜áƒšáƒ˜ ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრდრწინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვის ჩვენებáƒ, გáƒáƒ£áƒ¥áƒ›áƒ”ბის მიზეზის სქáƒáƒšáƒ˜áƒáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“.',
+'tooltip-preferences-save' => 'შეინáƒáƒ®áƒ”თ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
+'tooltip-summary' => 'შეიყვáƒáƒœáƒ”თ მáƒáƒ™áƒšáƒ” სქáƒáƒšáƒ˜áƒ',
# Stylesheets
'common.css' => '/** áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS ყველრგáƒáƒ áƒ”კáƒáƒœáƒ–ე იმáƒáƒ¥áƒ›áƒ”დებს */',
@@ -2760,9 +2788,6 @@ $1',
# Patrol log
'patrol-log-page' => 'პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბის ჟურნáƒáƒšáƒ˜',
'patrol-log-header' => 'ეს áƒáƒ áƒ˜áƒ¡ პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულ ვერსიáƒáƒ—რჟურნáƒáƒšáƒ˜.',
-'patrol-log-line' => 'შემáƒáƒ¬áƒ›áƒ“რ$1 $2 $3-დáƒáƒœ',
-'patrol-log-auto' => '(áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜)',
-'patrol-log-diff' => 'ვერსირ$1',
'log-show-hide-patrol' => '$1 პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბის ჟურნáƒáƒšáƒ˜',
# Image deletion
@@ -2789,11 +2814,11 @@ $1',
'file-info' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $1, MIME ტიპი: $2',
'file-info-size' => '$1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3, MIME ტიპი: $4',
'file-info-size-pages' => '$1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3, MIME ტიპი: $4, $5 გვერდი',
-'file-nohires' => '<small>უფრრმáƒáƒ¦áƒáƒšáƒ˜ გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რáƒáƒ  áƒáƒ áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბელი.</small>',
+'file-nohires' => 'უფრრმáƒáƒ¦áƒáƒšáƒ˜ გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რáƒáƒ  áƒáƒ áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბელი.',
'svg-long-desc' => 'ფáƒáƒ˜áƒšáƒ˜ SVG, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒáƒ“ $1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3',
'show-big-image' => 'სრული გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘áƒ',
-'show-big-image-preview' => '<small>ზáƒáƒ›áƒ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვისáƒáƒ¡: $1.</small>',
-'show-big-image-other' => '<small>სხვრგáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘áƒ: $1.</small>',
+'show-big-image-preview' => 'ზáƒáƒ›áƒ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვისáƒáƒ¡: $1.',
+'show-big-image-other' => 'სხვრ{{PLURAL:$2|გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ|გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ}}: $1.',
'show-big-image-size' => '$1 × $2 პიქსელი',
'file-info-gif-looped' => 'დáƒáƒ áƒ’áƒáƒšáƒ˜áƒšáƒ˜',
'file-info-gif-frames' => '$1 კáƒáƒ“რი',
@@ -2813,6 +2838,13 @@ $1',
'bydate' => 'თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ—',
'sp-newimages-showfrom' => 'áƒáƒ®áƒáƒšáƒ˜ ფáƒáƒ˜áƒšáƒ”ბის ჩვენებრდáƒáƒ¬áƒ§áƒ”ბული $2, $1-იდáƒáƒœ',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '$1 წáƒáƒ›áƒ˜áƒ¡',
+'minutes' => '$1 წუთის',
+'hours' => '$1 სáƒáƒáƒ—ის',
+'days' => '$1 დღის',
+'ago' => '$1 წინ',
+
# Bad image list
'bad_image_list' => 'ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შემდეგიáƒ:
@@ -3313,13 +3345,6 @@ $5
'scarytranscludefailed' => '[$1-თáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ]',
'scarytranscludetoolong' => '[URL ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks áƒáƒ› სტáƒáƒ¢áƒ˜áƒ˜áƒ¡áƒ—ვის:<br />
-$1',
-'trackbackremove' => '([$1 წáƒáƒ¨áƒáƒšáƒ”])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback წáƒáƒ áƒ›áƒáƒ¢áƒ”ბულáƒáƒ“ წáƒáƒ˜áƒ¨áƒáƒšáƒ',
-
# Delete conflict
'deletedwhileediting' => "'''ყურáƒáƒ“ღებáƒ''': ეს გვერდი წáƒáƒ˜áƒ¨áƒáƒšáƒ მáƒáƒ¡ შემდეგ, რáƒáƒª თქვენ მისი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრდáƒáƒ˜áƒ¬áƒ§áƒ”თ!",
'confirmrecreate' => "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ[[User:$1|$1]] ([[User talk:$1|გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ]]) წáƒáƒ¨áƒáƒšáƒ ეს გვერდი მáƒáƒ¡ შემდეგ რáƒáƒª თქვენ დáƒáƒ˜áƒ¬áƒ§áƒ”თ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრშემდეგი მიზეზით:
@@ -3406,6 +3431,9 @@ $1',
'watchlisttools-edit' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის ხილვრდრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'watchlisttools-raw' => 'კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრტექსტის ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ]])',
+
# Core parser functions
'unknown_extension_tag' => 'უცნáƒáƒ‘ი დáƒáƒ›áƒáƒ¢áƒ”ბის «$1» თეგი',
'duplicate-defaultsort' => "'''ყურáƒáƒ“ღებáƒ.'''სáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბის გáƒáƒ¡áƒáƒ¦áƒ”ბს «$2»-ს გáƒáƒáƒ­áƒ áƒ˜áƒ¡ წინრგáƒáƒ¡áƒáƒ¦áƒ”ბს «$1»-ს.",
@@ -3460,8 +3488,7 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'specialpages' => 'სპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდები',
'specialpages-note' => '----
* ჩვეულებრივი სპეცგვერდები.
-* <strong class="mw-specialpagerestricted">სპეცგვერდები შეზღუდული მისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒáƒ‘ით.</strong>
-* <span class="mw-specialpagecached">ქეშირებული სპეცგვერდები.</span>',
+* <span class="mw-specialpagerestricted">სპეცგვერდები შეზღუდული მისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒáƒ‘ით.</span>',
'specialpages-group-maintenance' => 'ტექნიკური მáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”ბის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი',
'specialpages-group-other' => 'სხვრსპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდები',
'specialpages-group-login' => 'შესვლრ/ რეგისტრáƒáƒªáƒ˜áƒ',
@@ -3501,13 +3528,16 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'tags-hitcount' => '$1 ცვლილებáƒ',
# Special:ComparePages
-'comparepages' => 'გვერდების შედáƒáƒ áƒ”ბáƒ',
-'compare-selector' => 'გვერდების ვერსიების შედáƒáƒ áƒ”ბáƒ',
-'compare-page1' => '1 გვერდი',
-'compare-page2' => '2 გვერდი',
-'compare-rev1' => 'პირველი ვერსიáƒ',
-'compare-rev2' => 'მეáƒáƒ áƒ” ვერსიáƒ',
-'compare-submit' => 'შედáƒáƒ áƒ”ბáƒ',
+'comparepages' => 'გვერდების შედáƒáƒ áƒ”ბáƒ',
+'compare-selector' => 'გვერდების ვერსიების შედáƒáƒ áƒ”ბáƒ',
+'compare-page1' => '1 გვერდი',
+'compare-page2' => '2 გვერდი',
+'compare-rev1' => 'პირველი ვერსიáƒ',
+'compare-rev2' => 'მეáƒáƒ áƒ” ვერსიáƒ',
+'compare-submit' => 'შედáƒáƒ áƒ”ბáƒ',
+'compare-invalid-title' => 'თქვენ მიერ მითითებულირდáƒáƒ£áƒ¨áƒ•áƒ”ბელი სáƒáƒ®áƒ”ლი.',
+'compare-title-not-exists' => 'თქვენ მიერ მითითებული სáƒáƒ®áƒ”ლი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
+'compare-revision-not-exists' => 'თქვენ მიერ მითითებული ვერსირáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
# Database error messages
'dberr-header' => 'ეს ვიკი გáƒáƒœáƒ˜áƒªáƒ“ის პრáƒáƒ‘ლემáƒáƒ¡',
@@ -3534,4 +3564,70 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'sqlite-has-fts' => '$1 სრული ტექსტის ძიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რით',
'sqlite-no-fts' => '$1 სრული ტექსტის ძიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რის გáƒáƒ áƒ”შე',
+# New logging system
+'logentry-delete-delete' => '$1 წáƒáƒ¨áƒáƒšáƒ გვერდი: $3',
+'logentry-delete-restore' => '$1 áƒáƒ¦áƒáƒ“გინრგვერდი $3',
+'logentry-delete-revision-legacy' => '$1 შეცვáƒáƒšáƒ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ გვერდზე $3',
+'revdelete-content-hid' => 'შინáƒáƒáƒ áƒ¡áƒ˜ დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ',
+'revdelete-summary-hid' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის áƒáƒ¦áƒ¬áƒ”რრდáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ',
+'revdelete-uname-hid' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი დáƒáƒ¤áƒáƒ áƒ£áƒšáƒ˜áƒ',
+'revdelete-content-unhid' => 'შინáƒáƒáƒ áƒ¡áƒ˜ გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ',
+'revdelete-summary-unhid' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის áƒáƒ¦áƒ¬áƒ”რრგáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ',
+'revdelete-uname-unhid' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ',
+'revdelete-restricted' => 'შეზღუდვრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒ“მი',
+'revdelete-unrestricted' => 'შეზღუდვები მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒ“მი',
+'logentry-move-move' => '$1 გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ გვერდი $3 $4-ზე',
+'logentry-newusers-newusers' => '$1 შექმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
+'logentry-newusers-create' => '$1 შექმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
+'logentry-newusers-create2' => '$1 შექმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ $3 áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
+'logentry-newusers-autocreate' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1 áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ შეიქმნáƒ',
+'newuserlog-byemail' => 'პáƒáƒ áƒáƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ—áƒáƒ გáƒáƒ›áƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜',
+
+# Feedback
+'feedback-subject' => 'თემáƒ:',
+'feedback-message' => 'შეტყáƒáƒ‘ინებáƒ:',
+'feedback-cancel' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
+'feedback-submit' => 'შეფáƒáƒ¡áƒ”ბის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
+'feedback-adding' => 'თქვენი შეფáƒáƒ¡áƒ”ბის შენáƒáƒ®áƒ•áƒ...',
+'feedback-error1' => 'შეცდáƒáƒ›áƒ. API-ს მáƒáƒ£áƒšáƒáƒ“ნელი რეზულტáƒáƒ¢áƒ˜.',
+'feedback-error2' => 'შეცდáƒáƒ›áƒ: რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ',
+'feedback-error3' => 'შეცდáƒáƒ›áƒ. áƒáƒ  áƒáƒ áƒ˜áƒ¡ API-ს პáƒáƒ¡áƒ£áƒ®áƒ˜ .',
+'feedback-thanks' => 'გმáƒáƒ“ლáƒáƒ‘თ! თქვენი შეფáƒáƒ¡áƒ”ბრგáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბულირ„[$2 $1]“ გვერდზე.',
+'feedback-close' => 'გáƒáƒ™áƒ”თდáƒ',
+'feedback-bugnew' => 'მე შევáƒáƒ›áƒáƒ¬áƒ›áƒ”. áƒáƒ®áƒáƒšáƒ˜ შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებáƒ',
+
+# API errors
+'api-error-badaccess-groups' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒ› ვიკიში ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის უფლებáƒ.',
+'api-error-badtoken' => 'შიდრშეცდáƒáƒ›áƒ: ცუდი ტáƒáƒ™áƒ”ნი.',
+'api-error-copyuploaddisabled' => 'áƒáƒ› სერვერზე URL-მისáƒáƒ›áƒáƒ áƒ—ის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრგáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
+'api-error-duplicate' => 'უკვე {{PLURAL:$1|áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს [$2 სხვრფáƒáƒ˜áƒšáƒ˜]|áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს [$2 სხვრმსგáƒáƒ•áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜]}} áƒáƒœáƒáƒšáƒáƒ’იური შინáƒáƒáƒ áƒ¡áƒ˜áƒ—.',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|ფáƒáƒ˜áƒšáƒ˜áƒ¡|ფáƒáƒ˜áƒšáƒ˜áƒ¡}} დუბლიკáƒáƒ¢áƒ˜.',
+'api-error-empty-file' => 'áƒáƒ áƒ©áƒ”ული ფáƒáƒ˜áƒšáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ.',
+'api-error-emptypage' => 'áƒáƒ®áƒáƒšáƒ˜, ცáƒáƒ áƒ˜áƒ”ლი გვერდების შექმნრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ.',
+'api-error-fetchfileerror' => 'შიდრშეცდáƒáƒ›áƒ: ფáƒáƒ˜áƒšáƒ˜áƒ¡ მიღებისáƒáƒ¡ მáƒáƒ®áƒ“რრáƒáƒ¦áƒáƒª შეცდáƒáƒ›áƒ.',
+'api-error-file-too-large' => 'áƒáƒ áƒ©áƒ”ული ფáƒáƒ˜áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ.',
+'api-error-filename-tooshort' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ზედმეტáƒáƒ“ მáƒáƒ™áƒšáƒ”áƒ',
+'api-error-filetype-banned' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ ეს ტიპი áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ',
+'api-error-filetype-missing' => 'ფáƒáƒ˜áƒšáƒ¡ áƒáƒ™áƒšáƒ˜áƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ•áƒ”ბáƒ.',
+'api-error-hookaborted' => 'თქვენ მიერ შემáƒáƒ—áƒáƒ•áƒáƒ–ებული ცვლილებრმáƒáƒ˜áƒœáƒ˜áƒ¨áƒœáƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜.',
+'api-error-http' => 'áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირშეცდáƒáƒ›áƒ სერვერთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბისáƒáƒ¡.',
+'api-error-illegal-filename' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ ეს სáƒáƒ®áƒ”ლი áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ.',
+'api-error-internal-error' => 'შიდრშეცდáƒáƒ›áƒ: ვიკიში თქვენი áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბისáƒáƒ¡ მáƒáƒ®áƒ“რშეცდáƒáƒ›áƒ.',
+'api-error-invalid-file-key' => 'სერვერმრვერ იპáƒáƒ•áƒ თქვენ მიერ მითითებული ფáƒáƒ˜áƒšáƒ˜',
+'api-error-missingparam' => 'შიდრშეცდáƒáƒ›áƒ: მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები დáƒáƒ˜áƒ™áƒáƒ áƒ’áƒ.',
+'api-error-missingresult' => 'შიდრშეცდáƒáƒ›áƒ. ვერ მáƒáƒ®áƒ”რხდრიმის დáƒáƒ“გენáƒ, იყრთუ áƒáƒ áƒ კáƒáƒžáƒ˜áƒ áƒ”ბრწáƒáƒ áƒ›áƒáƒ¢áƒ”ბული.',
+'api-error-mustbeloggedin' => 'ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ¡áƒáƒ¢áƒ•áƒ˜áƒ áƒ—áƒáƒ“ თქვენ უნდრშეხვიდეთ სისტემáƒáƒ¨áƒ˜.',
+'api-error-mustbeposted' => 'პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ შეცდáƒáƒ›áƒ; გáƒáƒ›áƒáƒ§áƒ”ნებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ HTTP-მეთáƒáƒ“ი.',
+'api-error-nomodule' => 'შიდრშეცდáƒáƒ›áƒ. áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მáƒáƒ“ული áƒáƒ  áƒáƒ áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურირებული.',
+'api-error-ok-but-empty' => 'შიდრშეცდáƒáƒ›áƒ. სერვერს áƒáƒ  დáƒáƒ£áƒ‘რუნებირინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ.',
+'api-error-overwrite' => 'áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ შეცვლრმიუღებელიáƒ.',
+'api-error-stashfailed' => 'შიდრშეცდáƒáƒ›áƒ. ვიკიმ ვერ შეძლრდრáƒáƒ”ბით ფáƒáƒ˜áƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ.',
+'api-error-unclassified' => 'áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირუცნáƒáƒ‘ი შეცდáƒáƒ›áƒ.',
+'api-error-unknown-code' => 'უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ : „$1“',
+'api-error-unknown-error' => 'შიდრშეცდáƒáƒ›áƒ: ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირუცნáƒáƒ‘ი შეცდáƒáƒ›áƒ.',
+'api-error-unknown-warning' => 'უცნáƒáƒ‘ი გáƒáƒ¤áƒ áƒ—ხილებáƒ: „$1“.',
+'api-error-unknownerror' => 'უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ: „$1“.',
+'api-error-uploaddisabled' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის მექáƒáƒœáƒ˜áƒ–მი áƒáƒ› ვიკიზე გáƒáƒ›áƒáƒ áƒ—ულიáƒ',
+'api-error-verification-error' => 'ეს ფáƒáƒ˜áƒšáƒ˜ áƒáƒœ რáƒáƒ˜áƒ›áƒ” შეცდáƒáƒ›áƒáƒ¡ შეიცáƒáƒ•áƒ¡, áƒáƒœ áƒáƒ  áƒáƒ¥áƒ•áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ.',
+
);
diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php
index a2dd3717..4c3cf773 100644
--- a/languages/messages/MessagesKaa.php
+++ b/languages/messages/MessagesKaa.php
@@ -16,7 +16,7 @@
* @author Urhixidur
*/
-$fallback = 'kk-latn';
+$fallback = 'kk-latn, kk-cyrl';
$separatorTransformTable = array(
',' => "\xc2\xa0",
@@ -483,15 +483,14 @@ Eger bular orınlı bolmasa, bag'darlamadag'ı qa'tege tuwrı kelgen bolıwın'Ä
Bunı basqa birew aldınlaw o\'shigen bolıwı mu\'mkin.',
'badtitle' => 'Jaramsız atama',
'badtitletext' => "Sorag'an betin'izdin' ataması natuwrı, bos, tillerara yamasa inter-wiki ataması natuwrı ko'rsetilgen. Atamada qollanıwg'a bolmaytug'ın bir yamasa bir neshe simvollar bolıwı mu'mkin.",
-'perfcached' => "To'mendegi mag'lıwmat keshlengen ha'mde jan'alanbag'an bolıwı mu'mkin.",
-'perfcachedts' => "To'mendegi mag'lıwmat keshlengen, aqırg'ı keshlengen waqtı: $1",
+'perfcached' => "To'mendegi mag'lıwmat keshlengen ha'mde jan'alanbag'an bolıwı mu'mkin. Keshte en' ko'bi menen {{PLURAL:$1|juwap|$1 juwap}} saqalanadı.",
+'perfcachedts' => "To'mendegi mag'lıwmat keshlengen, aqırg'ı keshlengen waqtı: $1. Keshte en' ko'bi menen {{PLURAL:$4|juwap|$4 juwap}} saqalanadı.",
'querypage-no-updates' => "Bul bettin' jan'alanıwı ha'zirshe o'shirilgen.
Bul jerde keltirilgen mag'lıwmatlar o'zgertilmeydi.",
'wrong_wfQuery_params' => 'wfQuery() funktsiyası ushın natuwrı parametrler berilgen<br />
Funktsiya: $1<br />
Soraw: $2',
'viewsource' => "Deregin ko'riw",
-'viewsourcefor' => '$1 ushın',
'actionthrottled' => "Ha'reket toqtatıldı",
'actionthrottledtext' => "Spamg'a qarsı gu'res esabında, bunday ha'reketti qısqa waqıtta dım ko'p ma'rte bejeriwin'iz sheklenedi, ha'mde siz usı limitten o'tip ketkensiz.
Birneshe minuttan keyin qaytadan ha'reket qılıp ko'rin'.",
@@ -663,10 +662,6 @@ Siz [[Special:Preferences|akkaunt sazlawların'ızda]] haqıyqıy e-mailin'izdı
Sizin' ha'zirgi IP adresin'iz: \$3, bloklaw IDı: #\$5.
Usılardın' birewin yamasa ekewinde ha'r bir sorawın'ızg'a qosın'.",
'blockednoreason' => 'hesh sebep keltirilmegen',
-'blockedoriginalsource' => "'''$1''' degennin' deregi
-to'mende ko'rsetilgen:",
-'blockededitsource' => "'''$1''' degennin' '''siz ozgertken''' teksti to'mende ko'rsetilgen:",
-'whitelistedittitle' => "O'zgertiw ushın sistemag'a kiriwin'iz kerek",
'whitelistedittext' => "Betterdi o'zgertiw ushın $1 sha'rt.",
'confirmedittext' => "Betlerge o'zgeris kiritiwin'iz ushın aldın E-pochta adresin'izdi tastıyıqlawın'ız kerek.
E-pochta adresin'izdi [[Special:Preferences|paydalanıwshı sazlawları bo'limi]] arqalı ko'rsetin' ha'm jaramlılıg'ın tekserin'.",
@@ -781,22 +776,11 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
'revdelete-unsuppress' => 'Qayta tiklengen nusqalardan sheklewlerdi alıp taslaw',
'revdelete-log' => 'Sebep:',
'revdelete-submit' => "Saylang'an {{PLURAL:$1|nusqag'a|nusqalarg'a}} qollaw",
-'revdelete-logentry' => "[[$1]] nusqa ko'rinisin o'zgertti",
-'logdelete-logentry' => "[[$1]] waqıya ko'rinisi o'zgerdi",
'revdelete-success' => "'''Nusqa ko'rinisi tabıslı jan'alandı.'''",
'logdelete-success' => "'''Jurnal ko'rinisi tabıslı ornatıldı.'''",
'revdel-restore' => "Ko'rinisin o'zgertiw",
'pagehist' => 'Bet tariyxı',
'deletedhist' => "O'shirilgenler tariyxı",
-'revdelete-content' => "mag'lıwmat",
-'revdelete-summary' => "o'zgerislerdin' qısqasha mazmunı",
-'revdelete-uname' => 'paydalanıwshı atı',
-'revdelete-restricted' => "administratorlarg'a qollanılg'an sheklewler",
-'revdelete-unrestricted' => "administratorlardan alıp taslang'an sheklewler",
-'revdelete-hid' => '$1 jasırıldı',
-'revdelete-unhid' => "$1 ko'rsetildi",
-'revdelete-log-message' => "$2 ushın $1 {{PLURAL:$2|o'zgeris|o'zgeris}}",
-'logdelete-log-message' => '$2 {{PLURAL:$2|waqıya|waqıya}} ushın $1',
# Suppression log
'suppressionlog' => 'Jasırıw jurnalı',
@@ -912,7 +896,7 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'prefs-rc' => "Aqırg'ı o'zgerisler",
'prefs-watchlist' => 'Baqlaw dizimi',
'prefs-watchlist-days' => "Baqlaw dizimindegi ku'nlerdin' ko'rsetiw sanı:",
-'prefs-watchlist-days-max' => "Maksimum 7 ku'n",
+'prefs-watchlist-days-max' => "Maksimum $1 {{PLURAL:$1|ku'n|ku'n}}",
'prefs-watchlist-edits' => "Ken'eytilgen baqlaw dizimindegi o'zgeristerdin' en' ko'p ko'rsetiw sanı:",
'prefs-watchlist-edits-max' => 'Maksimum: 1000',
'prefs-misc' => 'Basqa',
@@ -1035,7 +1019,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'right-import' => 'Basqa wikilerden betlerdi import qılıw',
'right-importupload' => 'Fayldi aploud qılıw arqalı betlerdi import qılıw',
'right-unwatchedpages' => "Baqlanbag'an betler dizimin qaraw",
-'right-trackback' => 'Trackbackti jiberiw',
'right-mergehistory' => "Betlerdin' tariyxın birlestiriw",
'right-userrights' => "Paydalanıwshılardın' barlıq huquqların o'zgertiw",
'right-userrights-interwiki' => "Basqa wikilerdegi paydalanıwshının' huquqların o'zgertiw",
@@ -1075,7 +1058,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'action-import' => 'bul betti basqa wikiden import qılıw',
'action-importupload' => 'bul betti fayl aploudı arqalı aploud qılıw',
'action-unwatchedpages' => "baqlanbaytug'ın betlerdin' dizimin ko'riw",
-'action-trackback' => '"trackback"tı jiberiw',
'action-mergehistory' => "bul bettin' tariyxın birlestiriw",
'action-userrights' => "paydalanıwshılardın barlıq huquqların o'zgertiw",
'action-userrights-interwiki' => "basqa wikilerdegi paydalanıwshılar huquqların o'zgertiw",
@@ -1394,12 +1376,8 @@ Ja'nede [[Special:WantedCategories|kerekli kategoriyalardı]] qarap ko'rin'.",
'listusers-noresult' => 'Paydalanıwshı tabılmadı.',
# Special:Log/newusers
-'newuserlogpage' => 'Paydalanıwshılardı esapqa alıw jurnalı',
-'newuserlogpagetext' => 'Bul paydalanıwshılardı esapqa alıw jurnalı',
-'newuserlog-byemail' => 'parol e-mail arqalı jiberildi',
-'newuserlog-create-entry' => "Jan'a paydalanıwshı",
-'newuserlog-create2-entry' => "jan'a akkaunt jarattı $1",
-'newuserlog-autocreate-entry' => 'Akkaunt avtomatik halda jaratıldı',
+'newuserlogpage' => 'Paydalanıwshılardı esapqa alıw jurnalı',
+'newuserlogpagetext' => 'Bul paydalanıwshılardı esapqa alıw jurnalı',
# Special:ListGroupRights
'listgrouprights' => 'Paydalanıwshılar toparı huqıqları',
@@ -1481,7 +1459,6 @@ Bunın' aqıbetin tu'singenin'izdi ha'm [[{{MediaWiki:Policy-url}}]] siyasatına
'actioncomplete' => "Ha'reket tamamlandı",
'deletedtext' => "\"\$1\" o'shirildi.
Aqırg'ı o'shirilgenlerdin' dizimin ko'riw ushin \$2 ni qaran'",
-'deletedarticle' => '"[[$1]]" o\'shirildi',
'dellogpage' => "O'shiriw jurnalı",
'dellogpagetext' => "To'mende en' aqırg'ı o'shirilgenlerdin' dizimi keltirilgen",
'deletionlog' => "o'shiriw jurnalı",
@@ -1552,7 +1529,6 @@ Aqırg'ı o'shirilgenlerdin' dizimin ko'riw ushin \$2 ni qaran'",
'undeletebtn' => 'Qayta tiklew',
'undeletelink' => "ko'riw/qayta tiklew",
'undeletecomment' => 'Sebep:',
-'undeletedarticle' => '"[[$1]]" qayta tiklendi',
'undeletedrevisions' => '{{PLURAL:$1|1 nusqa|$1 nusqa}} qayta tiklendi',
'undeletedrevisions-files' => "{{PLURAL:$1|1 nusqa|$1 nusqa}} ha'm {{PLURAL:$2|1 fayl|$2 fayl}} qayta tiklendi",
'undeletedfiles' => '{{PLURAL:$1|1 fayl|$1 fayl}} qayta tiklendi',
@@ -1695,8 +1671,6 @@ Basqa atama saylan'",
'talkexists' => "'''Bettin' o'zi a'wmetli ko'shirildi, biraq sa'wbet beti ko'shirilmedi sebebi jan'a atamanın' sa'wbet beti bar eken. Olardı o'zin'iz qoldan qosın'.'''",
'movedto' => "betke ko'shirildi",
'movetalk' => "Baylanıslı sa'wbet betin ko'shiriw",
-'1movedto2' => "[[$1]] beti [[$2]] degenge ko'shirildi",
-'1movedto2_redir' => "[[$1]] beti [[$2]] degen burıwshıg'a ko'shirildi",
'movelogpage' => "Ko'shiriw jurnalı",
'movelogpagetext' => "To'mende ko'shirilgen betlerdin' dizimi keltirilgen.",
'movereason' => 'Sebep:',
@@ -1811,9 +1785,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'siteusers' => '{{SITENAME}} {{PLURAL:$2|paydalanıwshı|paydalanıwshıları}} $1',
'creditspage' => 'Bet avtorları',
-# Patrol log
-'patrol-log-auto' => '(avtomatlasqan)',
-
# Image deletion
'deletedrevision' => "$1 eski nusqasın o'shirdi",
'filedeleteerror-short' => "Fayl o'shiriw qateligi: $1",
@@ -1828,7 +1799,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|bet|bet}}',
'file-info' => "fayldın' ha'jmi: $1, MIME tu'ri: $2",
'file-info-size' => "$1 × $2 piksel, fayldın' ha'jmi: $3, MIME tu'ri: $4",
-'file-nohires' => '<small>Bunnan joqarı imkaniyatlı tabılmadı.</small>',
+'file-nohires' => 'Bunnan joqarı imkaniyatlı tabılmadı.',
'svg-long-desc' => "SVG fayl, $1 × $2 piksel belgilengen, fayldın' ha'jmi: $3",
'show-big-image' => 'Joqarı imkaniyatlı',
@@ -1842,7 +1813,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'hours-abbrev' => 'st',
+'hours-abbrev' => '$1st',
# Bad image list
'bad_image_list' => "Formatı to'mendegishe:
@@ -1920,9 +1891,6 @@ $5
Bul tastıyıqlaw kodının' pitetug'ın waqtı: $4.",
-# Trackbacks
-'trackbackremove' => "([$1 O'shir])",
-
# Delete conflict
'recreate' => 'Qaytadan jaratıw',
@@ -1985,4 +1953,9 @@ Bul tastıyıqlaw kodının' pitetug'ın waqtı: $4.",
'specialpages' => 'Arnawlı betler',
'specialpages-group-users' => "Paydalanıwshılar ha'm olardın' huqıqları",
+# New logging system
+'revdelete-restricted' => "administratorlarg'a qollanılg'an sheklewler",
+'revdelete-unrestricted' => "administratorlardan alıp taslang'an sheklewler",
+'newuserlog-byemail' => 'parol e-mail arqalı jiberildi',
+
);
diff --git a/languages/messages/MessagesKab.php b/languages/messages/MessagesKab.php
index 74985bd8..291d92e1 100644
--- a/languages/messages/MessagesKab.php
+++ b/languages/messages/MessagesKab.php
@@ -308,14 +308,13 @@ Win (anedbal) isekker-itt yenna-d: $1',
'cannotdelete' => 'Ur yezmir ara ad yemḥu asebter neÉ£ afaylu i tebÉ£iá¸. (Ahat amdan wayeḠyemḥa-t.)',
'badtitle' => 'Azwel ur yelhi',
'badtitletext' => 'Asebter i testeqsiḠfell-as maÄÄi á¹£aḥiḥ, d ilem, neÉ£ yella ugul deg wezday seg wikipedia s tutlayt tayeḠneÉ£ deg wezday n wiki nniá¸en. Ahat tesÉ›a asekkil ur yezmir ara ad yettuseqdac deg wezwel.',
-'perfcached' => 'TalÉ£ut deg ukessar seg lkac u waqila maÄÄi d tasiwelt taneggarut.',
-'perfcachedts' => 'Talɣut deg ukessar seg lkac, tasiwelt taneggarut n wass $1.',
+'perfcached' => 'TalÉ£ut deg ukessar seg lkac u waqila maÄÄi d tasiwelt taneggarut. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Talɣut deg ukessar seg lkac, tasiwelt taneggarut n wass $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ibeddlen n usebter-agi ur ttbanen ara tura. Tilɣa ines qrib a d-banen.',
'wrong_wfQuery_params' => 'Imsektayen maÄÄi á¹£aḥiḥ deg wfQuery()<br />
Tawuri: $1<br />
Query: $2',
'viewsource' => 'Ẓer aɣbalu',
-'viewsourcefor' => 'n $1',
'protectedpagetext' => 'Asebter-agi d amsekker.',
'viewsourcetext' => 'TzemreḠad twaliḠu txedmeḠalsaru n uɣbalu n usebter-agi:',
'protectedinterface' => 'Asebter-agi d amsekker axaá¹­er yettuseqdac i weá¸ris n software.',
@@ -447,9 +446,6 @@ $1 iɛekkel-it u yenna-d ''$2''.
TzemreḠad tmeslayeḠakk d $1 neÉ£ [[{{MediaWiki:Grouppage-sysop}}|anedbal]] nniá¸en iwakken ad tsmelayem É£ef uÉ›ekkil-nni.
Lukan ur tefkiḠara email saḥih deg [[Special:Preferences|isemyifiyen n wemseqdac]], ur tezmireḠara ad tazneḠemail. Tansa n IP inek n tura d $3, ID n uɛekkil d #$5. Smekti-ten u fka-ten i unedbal-nni.",
-'blockedoriginalsource' => "AÉ£ablu n '''$1''' hat deg ukessar:",
-'blockededitsource' => "Aá¸ris n '''ubeddel inek''' i '''$1''' hat deg ukessar:",
-'whitelistedittitle' => 'Yessefk ad tkecmeḠiwakken ad tbeddleá¸',
'whitelistedittext' => 'Yessefk ad $1 iwakken ad tbeddleḠisebtar.',
'confirmedittext' => 'Yessefk ad tsentmeḠtansa e-mail inek uqbel abeddel. Xtar tansa e-mail di [[Special:Preferences|isemyifiyen n wemseqdac]].',
'nosuchsectiontitle' => 'Amur ulac-it',
@@ -589,8 +585,6 @@ Inedbalen wiyaḠdeg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
'revdelete-unsuppress' => 'Kkes icekkilen ɣef tisiwal i yuɣalen-d',
'revdelete-log' => 'Ayɣer',
'revdelete-submit' => 'Eg-it i tasiwelt tettwafren',
-'revdelete-logentry' => 'asekkud n tasiwelt tettubeddel i [[$1]]',
-'logdelete-logentry' => 'asekkud n tamirt tettubeddel i [[$1]]',
'revdelete-success' => "'''Asekkud n tasiwelt yettuxdem.'''",
'logdelete-success' => "'''Asekkud n tamirt yettuxdem.'''",
@@ -1058,7 +1052,6 @@ Tadhelt:
'actioncomplete' => 'Axdam yekfa',
'deletedtext' => '"$1" yettumḥa.
Ẓer $2 i aɣmis n yimḥayin imaynuten.',
-'deletedarticle' => '"[[$1]]" yettumḥa',
'dellogpage' => 'Aɣmis n umḥay',
'dellogpagetext' => 'Deg ukessar, yella wumuɣ n yimḥayin imaynuten.',
'deletionlog' => 'Aɣmis n umḥay',
@@ -1181,8 +1174,6 @@ Xtar yiwen nniá¸en.',
'talkexists' => "'''AsemmimeḠn usebter yekfa, meɛna asebter n umyannan ines ur yettusemmimeḠara axaṭer yella yagi yiwen s yisem kif-kif. G leɛnayek, xdem-it weḥd-ek.'''",
'movedto' => 'yettusmimeḠar',
'movetalk' => 'SmimeḠasebter n umyannan (n umagrad-nni)',
-'1movedto2' => '[[$1]] yettusmimeḠar [[$2]]',
-'1movedto2_redir' => '[[$1]] yettusmimeḠar [[$2]] s redirect',
'movelogpage' => 'AÉ£mis n usemmimeá¸',
'movelogpagetext' => 'Akessar yella wumuÉ£ n isebtar yettusmimeá¸en.',
'movereason' => 'Ayɣer',
@@ -1329,8 +1320,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
# Patrol log
'patrol-log-page' => 'AÉ£mis n usenqad',
-'patrol-log-line' => 'Yercem tasiwelt $1 n $2 "yettwassenqden" $3',
-'patrol-log-auto' => '(otomatik)',
# Image deletion
'deletedrevision' => 'Tasiwelt taqdimt $1 tettumḥa.',
@@ -1345,7 +1334,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'thumbsize' => 'Tiddi n tugna tamecṭuḥt:',
'file-info' => 'tiddi n ufaylu: $1, anaw n MIME: $2',
'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
-'file-nohires' => '<small>Ulac resolution i tameqqrant fell-as.</small>',
+'file-nohires' => 'Ulac resolution i tameqqrant fell-as.',
'show-big-image' => 'Resolution tameqqrant',
# Special:NewFiles
@@ -1411,13 +1400,6 @@ ad yemmut ass $4.',
'scarytranscludefailed' => '[Ur yezmir ara a d-yawi talɣa n $1; suref-aɣ]',
'scarytranscludetoolong' => '[URL d aɣezfan bezzaf; suref-aɣ]',
-# Trackbacks
-'trackbackbox' => 'Izdayen n zdeffir n umagrad-agi:<br />
-$1',
-'trackbackremove' => '([$1 Mḥu])',
-'trackbacklink' => 'Azday n zdeffir',
-'trackbackdeleteok' => 'Azday n zdeffir yettumḥa.',
-
# Delete conflict
'deletedwhileediting' => 'AÉ£tal: Asebter-agi yettumḥa qbel ad tebdiḠa t-tbeddleá¸!',
'confirmrecreate' => "Amseqdac [[User:$1|$1]] ([[User talk:$1|Meslay]]) yemḥu asebter-agi beɛd ad tebdiḠabeddel axaṭer:
diff --git a/languages/messages/MessagesKbd_cyrl.php b/languages/messages/MessagesKbd_cyrl.php
index 1c6b8b6b..340a0545 100644
--- a/languages/messages/MessagesKbd_cyrl.php
+++ b/languages/messages/MessagesKbd_cyrl.php
@@ -370,15 +370,14 @@ $1',
ÐÑмыщӀ гуÑÑ€Ñм ирихагъÑнкӀ хъун.',
'badtitle' => 'ЦӀÑÑ€ хъунукъым',
'badtitletext' => 'УзщӀÑÑƒÐ¿Ñ‰Ó€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀым и цӀÑÑ€ Ñ‚ÑÑ€Ñзкъым, нÑщӀ, мытÑÑ€Ñзу интервикир Ð¸Ñ Ð±Ð·Ñ-зÑхуÑкур щытщ. И цӀÑм дÑÐ¼Ñ‹Ð³ÑŠÑ ÐµÐ¼Ñ‹ÐºÓ€ÑƒÑÐ°Ð»ÑŠÑ Ñ…ÑтынкӀи хъун.',
-'perfcached' => 'Мы ӀохугъуÑÑ…ÑÑ€ кÑшым къыхахÑ, Ñужырей зÑхъуÑкӀыгъуÑÑ…ÑÑ€ химыубыдÑнкӀи мÑхъу.',
-'perfcachedts' => 'Мы ӀохугъуÑÑ…ÑÑ€ кÑшым къыхахÑ, ÑÑƒÐ¶Ñ‹Ñ€ÐµÑƒÑ ÐºÑŠÑ‹Ñ‰Ñ‹Ð³ÑŠÑщӀÑÑ€ÑщӀыжар $1.',
+'perfcached' => 'Мы ӀохугъуÑÑ…ÑÑ€ кÑшым къыхахÑ, Ñужырей зÑхъуÑкӀыгъуÑÑ…ÑÑ€ химыубыдÑнкӀи мÑхъу. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Мы ӀохугъуÑÑ…ÑÑ€ кÑшым къыхахÑ, ÑÑƒÐ¶Ñ‹Ñ€ÐµÑƒÑ ÐºÑŠÑ‹Ñ‰Ñ‹Ð³ÑŠÑщӀÑÑ€ÑщӀыжар $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Мы напÑкӀуÑцӀым и къÑгъÑщӀÑÑ€ÑщӀыныр джыпÑту Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
Ó€Ð¾Ñ…ÑƒÐ³ÑŠÑƒÑ Ð¼Ñ‹Ð´Ðµ Ñ…ÑÑ‚Ñ…ÑÑ€ Ð°ÐºÑ‚ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ…ÑŠÑƒÐ½ÑƒÐºÑŠÑ‹Ð¼.',
'wrong_wfQuery_params' => 'Параметыр емыкӀу wfQuery-м()<br />
ФункциÑ: $1<br />
ЩӀÑлъÑуÑгъуÑ: $2',
'viewsource' => 'Ð¥ÑплъÑн',
-'viewsourcefor' => '$1 щхьÑкӀÑ',
'actionthrottled' => 'ЩӀÑхыгъÑм ÑƒÐ±Ñ‹Ð´Ñ‹Ð³ÑŠÑ Ð¸Ó€Ñ',
'actionthrottledtext' => 'Ðнти-Ñпамым пÑщытыным шъхьÑкӀÑ, зÑÐ¼Ð°Ð½Ñ‹Ð³ÑŠÑƒÑ ÐºÓ€ÑщӀым уигугъÑÑ€ куÑду и къÑгъÑÑÑбÑпыныр Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‰.
ДÑÐºÑŠÐ¸ÐºÑŠÑ Ð·Ñ‹Ñ‚Ó€ÑƒÑ‰ тегъÑкӀи, иджыри Ð·Ñ Ñ‰Ó€Ñ‹Ð¶.',
@@ -586,9 +585,6 @@ $2',
Уи IP-адреÑÑ‹Ñ€ - $3, теубыдыгъуÑм и идентификаторыр - #$5.
Уи тхыгъÑÑ…Ñм ахÑÑ€ Ð¸Ð³ÑŠÑƒÐ²ÑƒÑ€Ñ Ñ‰Ó€Ñ‹.',
'blockednoreason' => 'щхьÑуÑыгъуÑÑ€ итхакъым',
-'blockedoriginalsource' => 'Ð˜Ñ‰Ó€Ð³ÑŠÑ‹Ð¼ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ «$1» и тхыгъÑÑ€ гъÑлъÑгъуа.',
-'blockededitsource' => "ИщӀагъым гъÑлъÑгъуа Ñ‚Ñ…Ñ‹Ð³ÑŠÑ '''уи зÑхъуÑкӀыгъуÑÑ…ÑÑ€''' напÑкӀуÑцӀ «$1» щыщхÑÑ€.",
-'whitelistedittitle' => 'ЗÑпхъуÑкӀыфыным щхьÑÐºÓ€Ñ ÑиÑтемÑм зыкъебгъÑцӀыхун хуÑй.',
'whitelistedittext' => '$1 ухуÑныкъу щытщ, напÑкӀуÑцӀхÑÑ€ зÑпхъуÑкӀыным щхьÑкӀÑ.',
'confirmedittext' => 'Уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ бгъÑзÑнкӀÑн хуÑйщ, напÑкӀуÑцӀхÑÑ€ бгъÑÑ‚ÑÑ€Ñзыным ипÑкӀÑ.
[[Special:Preferences|ЗÑгъÑзÑхуÑÐ³ÑŠÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀым]] уи ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и адреÑÑ‹Ñ€ итхи гъÑзанкӀÑ.',
@@ -834,8 +830,6 @@ $3 ар Ð·Ñ‚ÐµÑƒÑ…ÑƒÐ°ÑƒÑ ÐºÑŠÐ¸Ñ‚Ñ…Ñ‹Ñ€: ''$2''",
'revdelete-unsuppress' => 'ВерÑÐ¸Ñ Ð·ÑÑ„Ó€ÑгъувÑжахÑм теубыдыгъуÑÑ…ÑÑ€ Ñтехыжын',
'revdelete-log' => 'Зытеухуар:',
'revdelete-submit' => 'КъÑгъÑщхьÑпÑн {{PLURAL:$1|верÑÐ¸Ñ Ñ…Ñхам|верÑÐ¸Ñ Ñ…ÑхахÑм}}',
-'revdelete-logentry' => 'ÐапÑкӀуÑцӀ [[$1]]-м и верÑÐ¸Ñ Ð³ÑŠÑлъÑгъуÑныр зÑÑхъуÑкӀащ',
-'logdelete-logentry' => 'Хъыбар [[$1]]-м и гъÑлъÑгъуÑныр зÑхъуÑкӀащ',
'revdelete-success' => "'''ВерÑиÑм и гъÑлъÑгъуÑныр узыншу и зÑхъуÑкӀыгъуÑÑ€ зÑÑ„Ó€ÑкӀащ.'''",
'revdelete-failure' => "'''ВерÑиÑм и гъÑлъÑгъуÑныр зÑхъуÑкӀа хъунукъым:'''
$1",
@@ -847,15 +841,6 @@ $1",
'revdel-restore-visible' => 'гъÑлъÑгъуа верÑиÑÑ…ÑÑ€',
'pagehist' => 'ÐапÑкӀуÑцӀым и тхыдÑ',
'deletedhist' => 'ИхыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð´Ñ',
-'revdelete-content' => 'Ñ…ÑÑ‚Ñ‹Ñ€',
-'revdelete-summary' => 'зÑхъуÑкӀыгъуÑÑ…Ñм Ñ Ñ‚ÐµÐ¿ÑÑлъыхьыгъуÑ',
-'revdelete-uname' => 'цӀыхухÑтым и цӀÑÑ€',
-'revdelete-restricted' => 'теубыдыгъуÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм ÑтохуÑ',
-'revdelete-unrestricted' => 'теубыдыгъуÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм Ñтеха',
-'revdelete-hid' => 'гъÑпшкӀуар $1',
-'revdelete-unhid' => 'гъÑлъÑгъуар $1',
-'revdelete-log-message' => '$1 $2 щхьÑÐºÓ€Ñ {{PLURAL:$2|верÑиÑÑ…ÑÑ€|верÑиÑÑ…Ñм|верÑиÑÑ…Ñм}}',
-'logdelete-log-message' => '$1 $2 щхьÑÐºÓ€Ñ {{PLURAL:$2|хъыбархÑÑ€|хъыбархÑм|хъыбархÑм}}',
'revdelete-hide-current' => 'Ð¥Ñтхам и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2, $1: мыр верÑÐ¸Ñ ÐµÐºÓ€ÑƒÑкӀ.
ÐÑ€ гъÑÐ¿ÑˆÐºÓ€ÑƒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚Ñ‹Ñ„Ñ‹Ð½Ñƒ.',
'revdelete-show-no-access' => 'Тхылъым и зÑтехыгъÑм и Ñ…ÑукъуÑÐ³ÑŠÑƒÑ $2, $1: а тхыгъÑÑ€ зÑрхÑÑ‚Ñ‹Ñ€ «теубыда» хуÑду.
@@ -931,7 +916,7 @@ $1",
'prefs-rc' => 'ГъÑÑ‚ÑÑ€ÑÐ·Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ó€ÑÑ…ÑÑ€',
'prefs-watchlist' => 'ЩӀÑлъыплъыгъуÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
'prefs-watchlist-days' => 'МахуÑÑ…Ñм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€:',
-'prefs-watchlist-days-max' => 'Махуибл мынÑхъыбу',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€ нÑхъыбÑдыду, кӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑлъÑгъуар:',
'prefs-watchlist-edits-max' => 'ÐÑхъыбÑдыду: 1000',
'prefs-watchlist-token' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ и токен:',
@@ -1045,8 +1030,7 @@ $1",
'linksearch' => 'КІуÑцІ техьÑпІÑÑ…ÑÑ€',
# Special:Log/newusers
-'newuserlogpage' => 'ЦӀыхухÑÑ‚Ñ…Ñм Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
-'newuserlog-create-entry' => 'ЦӀыхухÑтыщӀÑ',
+'newuserlogpage' => 'ЦӀыхухÑÑ‚Ñ…Ñм Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
# Special:ListGroupRights
'listgrouprights-members' => '(гупым и тхылъ)',
@@ -1078,7 +1062,6 @@ $1",
'actioncomplete' => 'ЛÑжьыгъÑÑ€ гъÑзÑнщIащ',
'deletedtext' => '«$1» ираха.
Еплъ $2 ÑÑƒÐ¶Ñ‹Ñ€ÐµÑƒÑ Ð¸Ñ€Ð°Ñ…Ð°Ñ…Ñм ÑрахахÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ.',
-'deletedarticle' => 'ихащ «[[$1]]»',
'dellogpage' => 'ИрахыжахÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
'deletecomment' => 'ЩхьÑуÑыгъуÑ:',
'deleteotherreason' => 'ÐÑгъуÑщӀ щхьÑуÑыгъуÑ/щӀыгъупхъÑ:',
@@ -1110,8 +1093,7 @@ $1",
'restriction-level' => 'ХуитыныгъÑм и уровень:',
# Undelete
-'undeletelink' => 'Ñ…ÑплъÑн/Ð¸Ð¿Ó€Ñ Ð¸Ð³ÑŠÑувÑжын',
-'undeletedarticle' => 'зыщIыжар "[[$1]]"',
+'undeletelink' => 'Ñ…ÑплъÑн/Ð¸Ð¿Ó€Ñ Ð¸Ð³ÑŠÑувÑжын',
# Namespace form on various pages
'namespace' => 'ЦIÑÑ…Ñм и проÑтранÑтвÑ:',
@@ -1192,8 +1174,6 @@ $1",
'talkexists' => "'''ÐапÑкӀуÑцӀым и цӀÑÑ€ зÑхъуÑкӀащ, Ð°ÑƒÑ Ð½Ð°Ð¿ÑкӀуÑцӀ тепÑÑлъыхьыгъуÑм и цӀÑÑ€ зÑпхъуÑкӀ хъукъым, апхуÑÐ´Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ зÑрщыӀÑм щхьÑкӀÑ. УÑÑ€-уÑру Ó€ÑÑ€Ñ‹Ñ‰Ó€ÐºÓ€Ñ Ð·ÑÑ…ÑбгъÑÑ…ÑŒÑн хуÑйхÑ.'''",
'movedto' => 'зÑдзÑкIащ мыпхуÑдÑу',
'movetalk' => 'ÐапÑкӀуÑцӀ тепÑÑÐ»ÑŠÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ‚ÐµÑƒÑ…ÑƒÐ°Ð¼ и цӀÑÑ€ зÑхъуÑкӀын',
-'1movedto2' => '«[[$1]]» - мыбы къикӀыу «[[$2]]» - мыпхуÑдÑу и цӀÑÑ€ хъуÑжын',
-'1movedto2_redir' => '«[[$1]]»-м и цӀÑÑ€ хъуÑжащ «[[$2]]» къегъÑзÑкӀам ищхьÑкӀÑ',
'movelogpage' => 'ЦӀÑхъуÑкӀынхÑм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
'movereason' => 'ЩхьÑуÑыгъуÑ:',
'revertmove' => 'гъÑзÑжын',
@@ -1264,7 +1244,7 @@ $1",
# Media information
'file-info-size' => '$1 × $2 пикÑелу, файлым и инагъыр: $3, MIME-тип: $4',
-'file-nohires' => '<small>Ин плъыфÑу къÑгъÑлъÑгъуÑн щыIÑкъым.</small>',
+'file-nohires' => 'Ин плъыфÑу къÑгъÑлъÑгъуÑн щыIÑкъым.',
'svg-long-desc' => 'SVG файл, номиналу $1 × $2 пикÑел, файлым и инагъыр: $3',
'show-big-image' => 'СурÑÑ‚Ñ‹Ñ€ нÑÑ…ÑŠ къабзÑу',
@@ -1325,4 +1305,8 @@ $1",
# Special:SpecialPages
'specialpages' => 'СпецнапÑкӀуÑцӀхÑÑ€',
+# New logging system
+'revdelete-restricted' => 'теубыдыгъуÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм ÑтохуÑ',
+'revdelete-unrestricted' => 'теубыдыгъуÑÑ…ÑÑ€ Ñ‚Ñ…ÑŒÑмадÑÑ…Ñм Ñтеха',
+
);
diff --git a/languages/messages/MessagesKhw.php b/languages/messages/MessagesKhw.php
index 352db14a..c1554ff0 100644
--- a/languages/messages/MessagesKhw.php
+++ b/languages/messages/MessagesKhw.php
@@ -12,6 +12,8 @@
$fallback = 'ur';
+$rtl = true;
+
$messages = array(
# User preference toggles
'tog-underline' => 'ربطو خط کشیدگی',
@@ -346,12 +348,11 @@ MySQL جواب٠خطاء پرائے "$3: $4"',
'badtitle' => 'خراب عنوان',
'badtitletext' => "'درخاس Ø´Ø¯Û ØµÙØ­ÛÙˆ عنوان ناقص، خالی، یا Ú©ÛŒÛ ØºÙ„Ø· ربط Ø´Ø¯Û Ø¨ÛŒÙ† لسانی یا بین ویکی عنوان شیر.
شاید ھیارا ای یا زیات ھش حرو٠موجود شینی Ú©Û Ú¾ÛŒØª عنوانا استعمال نو بونیان.',",
-'perfcached' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û Ø´ÛŒØ± وا ھمو بیکا امکان شیر',
-'perfcachedts' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û Ø´ÛŒØ± وا آخری بار ھمو بتاریخیت $1 کورونو Ûوئے.',
+'perfcached' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û Ø´ÛŒØ± وا ھمو بیکا امکان شیر A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û Ø´ÛŒØ± وا آخری بار ھمو بتاریخیت $1 کورونو Ûوئے. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ú¾ÛŒÛ ØµÙØ­ÛÙˆ بچے بتاریخات ÙÛŒ الحال ناقابل ساوزینو بیتی شینی.
ھمو ڈیٹا ھنیسے ØªØ§Ø²Û Ú©ÙˆØ±ÙˆÙ†Ùˆ نو بوئے',
'viewsource' => 'مسودو لوڑے',
-'viewsourcefor' => 'بچے $1',
'actionthrottledtext' => 'بطور٠ای ضدسپم تدبیر، ØªÛ Ù…Ø®ØªØµØ§Ø± ÙˆØ®ØªÛ Ú©Ø¦ÛŒ دÙØ¹Û Ú¾ÛŒÛ Ú©ÙˆØ±ÙˆÙ…Ùˆ کوریکو وجھین محدود کورونو Ûوئے، وا تو Ú¾ÛŒÛ Ø­Ø¯Ùˆ پار کوری آسوس.
براÛ٠کرم، ای کما میلیٹ Ø¢Ú†Û Ú©Ú¾ÙˆØ´Ø´ کورے',
'protectedpagetext' => 'Ú¾ÛŒÛ ØµÙØ­ÛÙˆ تدویناری محÙوظ لاکھیکو بچے قل٠لیگینو بیتی شیر',
@@ -504,9 +505,6 @@ MySQL جواب٠خطاء پرائے "$3: $4"',
'subject-preview' => 'عنوان/Ø´Û Ø³Ø±Ø®ÛŒÙˆ پیش منظر:',
'blockedtitle' => 'صارÙÙˆ بلاک کورونو بیتی شیر',
'blockednoreason' => 'Ú©ÛŒÛ ÙˆØ¬Û Ø¯ÛŒÙˆÙ†Ùˆ نو Ú¾ÙˆÛŒ',
-'blockedoriginalsource' => "'''$1''' مآخذو موڑا دیونو بیتی شیر:",
-'blockededitsource' => "'''$1''' کورونو بیرو'''ØªÛ ØªØ±Ù…ÛŒÙ…Ø§Ù†''' متن موڑا دیونو بیتی شیر:",
-'whitelistedittitle' => 'ترمیم کوریکو بچے Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ Ø¨ÛŒÚ© لازمی شیر',
'whitelistedittext' => 'ترمیم کوریکو بچے $1 ضروری شیر.',
'nosuchsectiontitle' => 'Ù‚Ø·Ø¹Û Ù…Ù„Ø§Ùˆ نو Ú¾ÙˆÛŒ',
'loginreqtitle' => 'Ø¯Ø§Ø®Ù„Û / اندراج لازم',
@@ -574,9 +572,6 @@ MySQL جواب٠خطاء پرائے "$3: $4"',
'revdel-restore' => 'ظاÛریتو تبدیل کورے',
'revdel-restore-deleted' => 'Ø­Ø°Ù Ø´Ø¯Û Ø±ÙˆÛŒÚ˜Ù†Ø²',
'revdel-restore-visible' => 'ویزیبل رویژنز',
-'revdelete-content' => 'Ùھرست',
-'revdelete-hid' => '$1 کھوشت ھوی',
-'revdelete-log-message' => '$1 بچے $2 {{PLURAL:$2|نظرثانی|نظرثانی}}',
# Merge log
'revertmerge' => 'غیر ضم',
@@ -809,8 +804,7 @@ HTML tags لوڑے.',",
'linksearch-line' => '$1 مربوط شیر $2 ری',
# Special:Log/newusers
-'newuserlogpage' => 'نوشتۂ آمد صارÙ',
-'newuserlog-create-entry' => 'نوغ یوزر',
+'newuserlogpage' => 'نوشتۂ آمد صارÙ',
# Special:ListGroupRights
'listgrouprights-members' => 'ممبارانن Ùھرست',
@@ -841,7 +835,6 @@ HTML tags لوڑے.',",
'actionfailed' => 'ØªÛ Ø§ÛŒÚ©Ø´Ù† ناکام ÛÙˆÛŒ',
'deletedtext' => '"$1" حذ٠کورونو بیتی شیر ۔
Ø­Ø§Ù„ÛŒÛ Ø­Ø°Ù Ø´Ø¯Ú¯ÛŒÙˆ تاریخ نامو بچے $2 لوڑے',
-'deletedarticle' => 'Ø­Ø°Ù Ø´Ø¯Û "[[$1]]"',
'dellogpage' => 'نوشتۂ حذ٠شدگی',
'deletecomment' => 'وجÛ',
'deleteotherreason' => 'جوو/اÙضاÙÛŒ وجÛ',
@@ -873,7 +866,6 @@ HTML tags لوڑے.',",
'undelete' => 'ضائع کاردو صÙحاتن لوڑے',
'undeletelink' => 'لوڑے/بحال کورے',
'undeleteviewlink' => 'لوڑے',
-'undeletedarticle' => 'بحال "[[$1]]"',
# Namespace form on various pages
'namespace' => 'نامو ژاغÛ:',
@@ -931,19 +923,17 @@ HTML tags لوڑے.',",
'block-log-flags-nocreate' => 'Ú©Ú¾Ø§ØªÛ Ú©Ú¾ÙˆÙ„Ø§Ùˆ کوریکو سورا پاوپندی شیر',
# Move page
-'movearticle' => 'مـنـتـقـل کـورے',
-'newtitle' => 'نوغ عنوان',
-'move-watch' => 'صÙØ­Û Ø²ÛŒØ± نظر',
-'movepagebtn' => 'منتقل',
-'pagemovedsub' => 'انتقال کامیاب',
-'movepage-moved' => '\'\'\'"$1" Ú¾ÛŒÛ ÙˆÙˆØ´Ú©ÛŒ منتقل کورونو Ú¾ÙˆÛŒ "$2"\'\'\'',
-'articleexists' => 'Ú¾ÛŒÛ Ø¹Ù†ÙˆØ§Ù†Ùˆ سورا Ú©ÛŒÛ ØµÙØ­Û Ù¾Ø±ÙˆØ´Ù¹ÛŒØ§Ø±ÛŒ موجودشیر یا ØªÛ Ø¯Ø±Ø®ÙˆØ§Ø³Øª کاردو نام مستعمل نیکی براۓ Ù…Ûربانی خور نامو منتخب کورے۔',
-'movedto' => 'آلونو ھوی',
-'1movedto2' => '[[$1]] ووشکی [[$2]] منتقل',
-'1movedto2_redir' => 'آلونو ھوی[[$1]] ری[[$2]] ری ڈایریکٹ کوری',
-'movelogpage' => 'نوشتۂ منتقلی',
-'movereason' => 'واجھÛ',
-'revertmove' => 'رجوغ',
+'movearticle' => 'مـنـتـقـل کـورے',
+'newtitle' => 'نوغ عنوان',
+'move-watch' => 'صÙØ­Û Ø²ÛŒØ± نظر',
+'movepagebtn' => 'منتقل',
+'pagemovedsub' => 'انتقال کامیاب',
+'movepage-moved' => '\'\'\'"$1" Ú¾ÛŒÛ ÙˆÙˆØ´Ú©ÛŒ منتقل کورونو Ú¾ÙˆÛŒ "$2"\'\'\'',
+'articleexists' => 'Ú¾ÛŒÛ Ø¹Ù†ÙˆØ§Ù†Ùˆ سورا Ú©ÛŒÛ ØµÙØ­Û Ù¾Ø±ÙˆØ´Ù¹ÛŒØ§Ø±ÛŒ موجودشیر یا ØªÛ Ø¯Ø±Ø®ÙˆØ§Ø³Øª کاردو نام مستعمل نیکی براۓ Ù…Ûربانی خور نامو منتخب کورے۔',
+'movedto' => 'آلونو ھوی',
+'movelogpage' => 'نوشتۂ منتقلی',
+'movereason' => 'واجھÛ',
+'revertmove' => 'رجوغ',
# Export
'export' => 'برآمد صÙحات',
@@ -1014,16 +1004,13 @@ HTML tags لوڑے.',",
'tooltip-undo' => '"واپس" یا لوظ آچیا Ú©Ù„Ú© کوریکو سوم Ø¬Ø³ØªÛ ØªÛ ØµÙØ­Û Ú©Ú†Ø§ ØªÛ Ù¾Ø´ÛŒÙ†Ùˆ بوی Ú¾Û’ سوم Ø¬Ø³ØªÛ ØªÙˆ واپس کوریکو ÙˆØ¬Û Ù†ÛŒÙˆÛŒØ´ÛŒÚ©Ùˆ بوس',
'tooltip-summary' => 'ای مختصار سمری ساوزاوے',
-# Patrol log
-'patrol-log-diff' => '$1 نظرثانی',
-
# Browsing diffs
'previousdiff' => ' ↠پرانو تدوین',
'nextdiff' => 'صÙØ­ÛÙˆ نم:',
# Media information
'file-info-size' => '$1 × $2 پکسلز, ÙÙ„ سایز: $3, MIME ٹایپ: $4',
-'file-nohires' => '<small>ھموغاری لوٹ ریزولیوشن دستیاب نیکی.</small>',
+'file-nohires' => 'ھموغاری لوٹ ریزولیوشن دستیاب نیکی.',
'svg-long-desc' => 'SVG Ùایل, nominally $1 × $2 پکسلز, Ùایل سایز: $3',
'show-big-image' => 'لوٹ کوری پشاوے',
diff --git a/languages/messages/MessagesKiu.php b/languages/messages/MessagesKiu.php
index 94828b97..ccbcd510 100644
--- a/languages/messages/MessagesKiu.php
+++ b/languages/messages/MessagesKiu.php
@@ -378,15 +378,14 @@ Beno ke, verênde terefê kesê de bini ra esteriya.',
'badtitle' => 'Sernameo xırabın',
'badtitletext' => "Sernamê pela ke sıma wast, nêvêrde, thal, ya girê mabênê zoni ğelet ya ki sernamê mabênê ''wiki'' bi.
Beno ke, tede jü ya ki jêdê isareti estê ke sernameu de nêgurinê.",
-'perfcached' => 'Ni daey nımıteyê u beno ke rocaney niyê.',
-'perfcachedts' => 'Ni daey nımıteyê, u tewr peyên $1 de biyê rocaniy.',
+'perfcached' => 'Ni daey nımıteyê u beno ke rocaney niyê. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ni daey nımıteyê, u tewr peyên $1 de biyê rocaniy. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Rocane-biyaena na pele nıka cadaiyê.
Daey ita nıka newe nêbenê.',
'wrong_wfQuery_params' => 'Parametreo ÄŸelet serba wfPers()<br />
Fonksiyon: $1<br />
Pers: $2',
'viewsource' => 'Çımey bıvêne',
-'viewsourcefor' => 'serba $1i',
'actionthrottled' => 'Faeliyet xenekıt',
'actionthrottledtext' => "Berqestiya tedbirê ''anti-spam''i ra vırastena ni faeliyeti rê sıma zafê rey zemano senık de sindor viarna ra.
Kerem kerê, deqêna oncia bıcerrebnê.",
@@ -526,9 +525,6 @@ Tarixê vurnaena na pele de, hurêndia leqeme de numra tuya IPy qeyd bena.",
'subject-preview' => 'Verqaytê mewzuy/serrêze:',
'blockedtitle' => 'Karber kilıt bi',
'blockednoreason' => 'sebeb nêdiyo',
-'blockedoriginalsource' => "Çımê pela '''$1'''i is cêr dero:",
-'blockededitsource' => "Meqalê '''vurnaisunê to''' be pela '''$1'''i cêr dero:",
-'whitelistedittitle' => 'Serba vurnaene gunê cı kuyê',
'whitelistedittext' => 'Serba vurnaene $1.',
'nosuchsectiontitle' => 'Qısım nêşikiya bıvêniyo',
'nosuchsectiontext' => 'To waşt ke jü qısım kuyê, uyo ke çino.
@@ -669,13 +665,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
'revdel-restore-visible' => 'revizyonê asaey',
'pagehist' => 'Tarixê pele',
'deletedhist' => 'Tarixo esterıte',
-'revdelete-content' => 'zerrek',
-'revdelete-summary' => 'xulasa vurnaene',
-'revdelete-uname' => 'namê karberi',
-'revdelete-hid' => 'bınımne $1',
-'revdelete-unhid' => 'bıasne $1',
-'revdelete-log-message' => '$1 rê $2 {{PLURAL:$2|çımraviarnais|çımraviarnaişi}}',
-'logdelete-log-message' => '$1 rê $2 {{PLURAL:$2|hadisa|hadisey}}',
'revdelete-otherreason' => 'Sebebo bin/ilaweki:',
'revdelete-reasonotherlist' => 'Sebebo bin',
'revdelete-edit-reasonlist' => 'Sebebunê esterıtene bıvurne',
@@ -921,14 +910,13 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
'rc-enhanced-hide' => 'Tefsilatu bınımne',
# Recent changes linked
-'recentchangeslinked' => 'Ney sero vurnaene',
-'recentchangeslinked-toolbox' => 'Ney sero vurnaene',
-'recentchangeslinked-title' => 'Heqa "$1"i de vurnais',
-'recentchangeslinked-backlink' => '↠$1',
-'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.
+'recentchangeslinked' => 'Ney sero vurnaene',
+'recentchangeslinked-toolbox' => 'Ney sero vurnaene',
+'recentchangeslinked-title' => 'Heqa "$1"i de vurnais',
+'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:',
-'recentchangeslinked-to' => 'Hurêndia pela ke yena daene, vurnaisunê pelunê ke dae ra girêdaiyê, inu bıasne',
+'recentchangeslinked-page' => 'Namê pele:',
+'recentchangeslinked-to' => 'Hurêndia pela ke yena daene, vurnaisunê pelunê ke dae ra girêdaiyê, inu bıasne',
# Upload
'upload' => 'Dosya bar ke',
@@ -1093,8 +1081,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
'activeusers' => 'Lista karberunê fealu',
# Special:Log/newusers
-'newuserlogpage' => 'Qeydê karberiê newey',
-'newuserlog-create-entry' => 'Hesabê karberê newey',
+'newuserlogpage' => 'Qeydê karberiê newey',
# Special:ListGroupRights
'listgrouprights-group' => 'Kome',
@@ -1144,7 +1131,6 @@ Eke ferqê neticê na kerdene de bena u no kar be gorê [[{{MediaWiki:Policy-url
'actionfailed' => 'Fealiyet era ser nêkot',
'deletedtext' => '"$1" esteriya.
Serba diyaena esterıteyunê peyênu $2 bıvêne.',
-'deletedarticle' => '"[[$1]]" esterıt',
'dellogpage' => 'Qeydê esterıtene',
'deletecomment' => 'Sebeb:',
'deleteotherreason' => 'Sebebo bin/ilaweki:',
@@ -1172,6 +1158,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
'protect-level-sysop' => 'Teyna idarekeri',
'protect-summary-cascade' => 'qedemein',
'protect-expiring' => 'tarixê qediyaene $1 (UTC)',
+'protect-expiring-local' => '$1 de qedino',
'protect-expiry-indefinite' => 'bêmıdet',
'protect-cascade' => 'Pelê ke na pele derê bısevekne (seveknaena qedemeine)',
'protect-cantedit' => 'Tı nêşikina sinorê kilıtbiyaena na pele bıvurnê, çıke desturê to be vurnaene çino.',
@@ -1210,7 +1197,6 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
'undeletereset' => 'Vaz be',
'undeleteinvert' => 'Weçinıtey ters bıçarne',
'undeletecomment' => 'Sebeb:',
-'undeletedarticle' => 'peyser ard "[[$1]]"',
'undelete-search-submit' => 'Cıfeteliye',
'undelete-show-file-submit' => 'Heya',
@@ -1241,7 +1227,6 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
'whatlinkshere' => 'Çı itay rê gırê beno',
'whatlinkshere-title' => 'Pelê ke be "$1"i bestninê pa',
'whatlinkshere-page' => 'Pele:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Ni pelgi '''[[:$1]]'''i asnenê:",
'nolinkshere' => "Pelgê ke '''[[:$1]]'''i asnenê çinê.",
'isredirect' => 'pela ciheti',
@@ -1279,6 +1264,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
'unblocklink' => 'ra ke',
'change-blocklink' => 'mani bıvurne',
'contribslink' => 'iştıraki',
+'emaillink' => 'e-poste bırusne',
'autoblocker' => 'Sıma otomatikmen kılit biy, çıke adresa sımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gurenina.
Sebebê kılit-biyaena $1\'i: "$2"o',
'blocklogpage' => 'Protokolê kilıti',
@@ -1327,8 +1313,6 @@ Kerem ke, nameo de bin bıcerrebne.',
Kerem ke, zerreki ebe ho dest bere.'''",
'movedto' => 'berd be',
'movetalk' => 'Pela hurênaişiê alaqedare bere',
-'1movedto2' => '[[$1]] berd be [[$2]]',
-'1movedto2_redir' => 'serrêza [[$1]]ine berde be pela [[$2]]ine',
'movelogpage' => 'Qeydê berdene',
'movereason' => 'Sebeb:',
'revertmove' => 'raçarnaene',
@@ -1418,16 +1402,13 @@ Têser-kerdena jü sebebi rê xulasa de imkan dano cı.',
# Stylesheets
'common.css' => '/* CSSo ke itaro, serba çermu pêroine gurenino */',
-# Patrol log
-'patrol-log-diff' => 'revizyon $1',
-
# Browsing diffs
'previousdiff' => '↠Vurnaiso khanêr',
'nextdiff' => 'Vurnaena newêre →',
# Media information
'file-info-size' => '$1 × $2 piksel, gırsênia dosya: $3, MIME tipê cı: $4',
-'file-nohires' => '<small>Tewrêna berz rovıleşiyaene nêbena.</small>',
+'file-nohires' => 'Tewrêna berz rovıleşiyaene nêbena.',
'svg-long-desc' => 'Dosya SVGy, seha ke $1 × $2 pixels, gırşênia dosya: $3',
'show-big-image' => 'Rovıleşiyaena tame',
diff --git a/languages/messages/MessagesKk_arab.php b/languages/messages/MessagesKk_arab.php
index b0eea8cc..0bab0a87 100644
--- a/languages/messages/MessagesKk_arab.php
+++ b/languages/messages/MessagesKk_arab.php
@@ -184,130 +184,130 @@ $dateFormats = array(
* This array can be modified at runtime with the LanguageGetMagic hook
*/
$magicWords = array(
- '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', 'اعىمداعىاي', 'ÐҒЫМДÐҒЫÐЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'اعىمداعىاياتاۋى', 'ÐҒЫМДÐҒЫÐЙÐТÐУЫ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'اعىمداعىايىلىكاتاۋى', 'ÐҒЫМДÐҒЫÐЙІЛІКÐТÐУЫ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'اعىمداعىايجىيىر', 'اعىمداعىايقىسقا', 'ÐҒЫМДÐҒЫÐЙЖИЫР', 'ÐҒЫМДÐҒЫÐЙҚЫСҚÐ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'اعىمداعىكۇن', 'ÐҒЫМДÐҒЫКҮÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'اعىمداعىكۇن2', 'ÐҒЫМДÐҒЫКҮÐ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'اعىمداعىكۇناتاۋى', 'ÐҒЫМДÐҒЫКҮÐÐТÐУЫ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'اعىمداعىجىل', 'ÐҒЫМДÐҒЫЖЫЛ', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'اعىمداعىۋاقىت', 'ÐҒЫМДÐҒЫУÐҚЫТ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'اعىمداعىساعات', 'ÐҒЫМДÐҒЫСÐÒ’ÐТ', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'جەرگىلىكتىاي', 'ЖЕРГІЛІКТІÐЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'جەرگىلىكتىاياتاۋى', 'ЖЕРГІЛІКТІÐЙÐТÐУЫ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'جەرگىلىكتىايىلىكاتاۋى', 'ЖЕРГІЛІКТІÐЙІЛІКÐТÐУЫ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'جەرگىلىكتىايجىيىر', 'جەرگىلىكتىايقىسقاشا', 'جەرگىلىكتىايقىسقا', 'ЖЕРГІЛІКТІÐЙЖИЫР', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐШÐ', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'جەرگىلىكتىكۇن', 'ЖЕРГІЛІКТІКҮÐ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'جەرگىلىكتىكۇن2', 'ЖЕРГІЛІКТІКҮÐ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'جەرگىلىكتىكۇناتاۋى', 'ЖЕРГІЛІКТІКҮÐÐТÐУЫ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'جەرگىلىكتىجىل', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'جەرگىلىكتىۋاقىت', 'ЖЕРГІЛІКТІУÐҚЫТ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'جەرگىلىكتىساعات', 'ЖЕРГІЛІКТІСÐÒ’ÐТ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'بەتسانى', 'БЕТСÐÐЫ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ماقالاسانى', 'ÐœÐÒšÐЛÐСÐÐЫ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'Ùايلسانى', 'ФÐЙЛСÐÐЫ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'قاتىسۋشىسانى', 'ÒšÐТЫСУШЫСÐÐЫ', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'وڭدەمەسانى', 'تۇزەتۋسانى', 'ӨҢДЕМЕСÐÐЫ', 'ТҮЗЕТУСÐÐЫ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'بەتاتاۋى', 'БЕТÐТÐУЫ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'بەتاتاۋى2', 'БЕТÐТÐУЫ2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ەسىماياسى', 'ЕСІМÐЯСЫ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ەسىماياسى2', 'ЕСІМÐЯСЫ2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'تالقىلاۋاياسى', 'ТÐЛҚЫЛÐУÐЯСЫ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'تالقىلاۋاياسى2', 'ТÐЛҚЫЛÐУÐЯСЫ2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'تاقىرىپبەتى', 'ماقالابەتى', 'ТÐҚЫРЫПБЕТІ', 'ÐœÐÒšÐЛÐБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'تاقىرىپبەتى2', 'ماقالابەتى2', 'ТÐҚЫРЫПБЕТІ2', 'ÐœÐÒšÐЛÐБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'تولىقبەتاتاۋى', 'ТОЛЫҚБЕТÐТÐУЫ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'تولىقبەتاتاۋى2', 'ТОЛЫҚБЕТÐТÐУЫ2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'بەتشەاتاۋى', 'استىڭعىبەتاتاۋى', 'БЕТШЕÐТÐУЫ', 'ÐСТЫҢҒЫБЕТÐТÐУЫ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'بەتشەاتاۋى2', 'استىڭعىبەتاتاۋى2', 'БЕТШЕÐТÐУЫ2', 'ÐСТЫҢҒЫБЕТÐТÐУЫ2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'نەگىزگىبەتاتاۋى', 'ÐЕГІЗГІБЕТÐТÐУЫ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'نەگىزگىبەتاتاۋى2', 'ÐЕГІЗГІБЕТÐТÐУЫ2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'تالقىلاۋبەتاتاۋى', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'تالقىلاۋبەتاتاۋى2', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'تاقىرىپبەتاتاۋى', 'ماقالابەتاتاۋى', 'ТÐҚЫРЫПБЕТÐТÐУЫ', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'تاقىرىپبەتاتاۋى2', 'ماقالابەتاتاۋى2', 'ТÐҚЫРЫПБЕТÐТÐУЫ2', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'حبر:', 'ХБР:', 'MSG:' ),
- 'subst' => array( '0', 'بادەل:', 'БӘДЕЛ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'ۋىيكىيسىزحبر:', 'УИКИСІЗХБР:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'نوباي', 'нобай', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'نوباي=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'وڭعا', 'وڭ', 'оңға', 'оң', 'right' ),
- 'img_left' => array( '1', 'سولعا', 'سول', 'Ñолға', 'Ñол', 'left' ),
- 'img_none' => array( '1', 'ەشقانداي', 'جوق', 'ешқандай', 'жоқ', 'none' ),
- 'img_width' => array( '1', '$1 نۇكتە', '$1 нүкте', '$1px' ),
- 'img_center' => array( '1', 'ورتاعا', 'ورتا', 'ортаға', 'орта', 'center', 'centre' ),
- 'img_framed' => array( '1', 'سۇرمەلى', 'Ñүрмелі', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'سۇرمەسىز', 'ÑүрмеÑіз', 'frameless' ),
- 'img_page' => array( '1', 'بەت=$1', 'بەت $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'تىكتى', 'تىكتىك=$1', 'تىكتىك $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'جىييەكتى', 'жиекті', 'border' ),
- 'img_baseline' => array( '1', 'تىرەكجول', 'тірекжол', 'baseline' ),
- 'img_sub' => array( '1', 'استىلىعى', 'است', 'аÑтылығы', 'аÑÑ‚', 'sub' ),
- 'img_super' => array( '1', 'ۇستىلىگى', 'ۇست', 'Ò¯Ñтілігі', 'Ò¯ÑÑ‚', 'super', 'sup' ),
- 'img_top' => array( '1', 'ۇستىنە', 'Ò¯Ñтіне', 'top' ),
- 'img_text_top' => array( '1', 'ماتىن-ۇستىندە', 'мәтін-Ò¯Ñтінде', 'text-top' ),
- 'img_middle' => array( '1', 'ارالىعىنا', 'аралығына', 'middle' ),
- 'img_bottom' => array( '1', 'استىنا', 'аÑтына', 'bottom' ),
- 'img_text_bottom' => array( '1', 'ماتىن-استىندا', 'мәтін-аÑтында', 'text-bottom' ),
- 'int' => array( '0', 'ىشكى:', 'ІШКІ:', 'INT:' ),
- 'sitename' => array( '1', 'توراپاتاۋى', 'ТОРÐПÐТÐУЫ', 'SITENAME' ),
- 'ns' => array( '0', 'ەا:', 'ەسىمايا:', 'ЕÐ:', 'ЕСІМÐЯ:', 'NS:' ),
- 'localurl' => array( '0', 'جەرگىلىكتىجاي:', 'ЖЕРГІЛІКТІЖÐЙ:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'جەرگىلىكتىجاي2:', 'ЖЕРГІЛІКТІЖÐЙ2:', 'LOCALURLE:' ),
- 'server' => array( '0', 'سەرۆەر', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'سەرۆەراتاۋى', 'СЕРВЕРÐТÐУЫ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'امىرجولى', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'سەپتىگى:', 'سەپتىك:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__تاقىرىپاتىنتۇرلەندىرگىزبەۋ__', '__تاتجوق__', '__اتاۋالماستىرعىزباۋ__', '__ااباۋ__', '__ТÐҚЫРЫПÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ТÐТЖОҚ__', '__ÐТÐУÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐÐБÐУ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__ماعلۇماتىنتۇرلەندىرگىزبەۋ__', '__ماتجوق__', '__ماعلۇماتالماستىرعىزباۋ__', '__ماباۋ__', '__ÐœÐҒЛҰМÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ÐœÐТЖОҚ__', '__ÐœÐҒЛҰМÐТÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐœÐБÐУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'اعىمداعىاپتاسى', 'اعىمداعىاپتا', 'ÐҒЫМДÐҒЫÐПТÐСЫ', 'ÐҒЫМДÐҒЫÐПТÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'اعىمداعىاپتاكۇنى', 'ÐҒЫМДÐҒЫÐПТÐКҮÐІ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'جەرگىلىكتىاپتاسى', 'جەرگىلىكتىاپتا', 'ЖЕРГІЛІКТІÐПТÐСЫ', 'ЖЕРГІЛІКТІÐПТÐ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'جەرگىلىكتىاپتاكۇنى', 'ЖЕРГІЛІКТІÐПТÐКҮÐІ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'تۇزەتۋنومىرٴى', 'نۇسقانومىرٴى', 'ТҮЗЕТУÐӨМІРІ', 'ÐҰСҚÐÐӨМІРІ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'تۇزەتۋكۇنى', 'نۇسقاكۇنى', 'ТҮЗЕТУКҮÐІ', 'ÐҰСҚÐКҮÐІ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'تۇزەتۋكۇنى2', 'نۇسقاكۇنى2', 'ТҮЗЕТУКҮÐІ2', 'ÐҰСҚÐКҮÐІ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'تۇزەتۋايى', 'نۇسقاايى', 'ТҮЗЕТУÐЙЫ', 'ÐҰСҚÐÐЙЫ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'تۇزەتۋجىلى', 'نۇسقاجىلى', 'ТҮЗЕТУЖЫЛЫ', 'ÐҰСҚÐЖЫЛЫ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'تۇزەتۋۋاقىتىتاڭباسى', 'نۇسقاۋاقىتتۇيىندەمەسى', 'ТҮЗЕТУУÐҚЫТЫТÐҢБÐСЫ', 'ÐҰСҚÐУÐҚЫТТҮЙІÐДЕМЕСІ', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'كوپشەتۇرى:', 'كوپشە:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'تولىقجايى:', 'تولىقجاي:', 'ТОЛЫҚЖÐЙЫ:', 'ТОЛЫҚЖÐЙ:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'تولىقجايى2:', 'تولىقجاي2:', 'ТОЛЫҚЖÐЙЫ2:', 'ТОЛЫҚЖÐЙ2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'كا1:', 'كىشىارىپپەن1:', 'КӘ1:', 'КІШІӘРІППЕÐ1:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'با1:', 'باسارىپپەن1:', 'БӘ1:', 'БÐСӘРІППЕÐ1:', 'UCFIRST:' ),
- 'lc' => array( '0', 'كا:', 'كىشىارىپپەن:', 'КӘ:', 'КІШІӘРІППЕÐ:', 'LC:' ),
- 'uc' => array( '0', 'با:', 'باسارىپپەن:', 'БӘ:', 'БÐСӘРІППЕÐ:', 'UC:' ),
- 'raw' => array( '0', 'قام:', 'ÒšÐÐœ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'كورسەتىلەتىناتاۋ', 'КӨРІÐЕТІÐТÐҚЫРЫÐПÐТЫ', 'КӨРСЕТІЛЕТІÐÐТÐУ', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Ù‚', 'Òš', 'R' ),
- 'newsectionlink' => array( '1', '__جاڭابولىمسىلتەمەسى__', '__ЖÐÒ¢ÐБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'باعدارلامانۇسقاسى', 'БÐҒДÐРЛÐÐœÐÐҰСҚÐСЫ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'جايدىمۇقامداۋ:', 'ЖÐЙДЫМҰҚÐМДÐУ:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'جاكىردىمۇقامداۋ', 'ЖӘКІРДІМҰҚÐМДÐУ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'اعىمداعىۋاقىتتۇيىندەمەسى', 'اعىمداعىۋاقىتتۇيىن', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐДЕМЕСІ', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'جەرگىلىكتىۋاقىتتۇيىندەمەسى', 'جەرگىلىكتىۋاقىتتۇيىن', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐДЕМЕСІ', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'باعىتبەلگىسى', 'БÐҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#تىل:', '#ТІЛ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ماعلۇماتتىلى', 'ÐœÐҒЛҰМÐТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'ەسىمايابەتسانى:', 'ەابەتسانى:', 'ايابەتسانى:', 'ЕСІМÐЯБЕТСÐÐЫ:', 'ЕÐБЕТСÐÐЫ:', 'ÐЯБЕТСÐÐЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'اكىمشىسانى', 'ӘКІМШІСÐÐЫ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'سانپىشىمى', 'СÐÐПІШІМІ', 'FORMATNUM' ),
- 'padleft' => array( '0', 'سولعاىعىس', 'سولىعىس', 'СОЛҒÐЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
- 'padright' => array( '0', 'وڭعاىعىس', 'وڭىعىس', 'ОҢҒÐЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
- 'special' => array( '0', 'ارنايى', 'арнайы', 'special' ),
- 'defaultsort' => array( '1', 'ادەپكىسۇرىپتاۋ:', 'ادەپكىساناتسۇرىپتاۋ:', 'ادەپكىسۇرىپتاۋكىلتى:', 'ادەپكىسۇرىپ:', 'ӘДЕПКІСҰРЫПТÐУ:', 'ӘДЕПКІСÐÐÐТСҰРЫПТÐУ:', 'ӘДЕПКІСҰРЫПТÐУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'Ùايلمەكەنى:', 'ФÐЙЛМЕКЕÐІ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'بەلگى', 'белгі', 'tag' ),
- 'hiddencat' => array( '1', '__جاسىرىنسانات__', '__ЖÐСЫРЫÐСÐÐÐТ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'ساناتتاعىبەتتەر', 'СÐÐÐТТÐҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'بەتمولشەرى', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
+ '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', 'اعىمداعىاي', 'ÐҒЫМДÐҒЫÐЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'اعىمداعىاياتاۋى', 'ÐҒЫМДÐҒЫÐЙÐТÐУЫ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'اعىمداعىايىلىكاتاۋى', 'ÐҒЫМДÐҒЫÐЙІЛІКÐТÐУЫ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'اعىمداعىايجىيىر', 'اعىمداعىايقىسقا', 'ÐҒЫМДÐҒЫÐЙЖИЫР', 'ÐҒЫМДÐҒЫÐЙҚЫСҚÐ', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'اعىمداعىكۇن', 'ÐҒЫМДÐҒЫКҮÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'اعىمداعىكۇن2', 'ÐҒЫМДÐҒЫКҮÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'اعىمداعىكۇناتاۋى', 'ÐҒЫМДÐҒЫКҮÐÐТÐУЫ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'اعىمداعىجىل', 'ÐҒЫМДÐҒЫЖЫЛ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'اعىمداعىۋاقىت', 'ÐҒЫМДÐҒЫУÐҚЫТ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'اعىمداعىساعات', 'ÐҒЫМДÐҒЫСÐÒ’ÐТ', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'جەرگىلىكتىاي', 'ЖЕРГІЛІКТІÐЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'جەرگىلىكتىاياتاۋى', 'ЖЕРГІЛІКТІÐЙÐТÐУЫ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'جەرگىلىكتىايىلىكاتاۋى', 'ЖЕРГІЛІКТІÐЙІЛІКÐТÐУЫ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'جەرگىلىكتىايجىيىر', 'جەرگىلىكتىايقىسقاشا', 'جەرگىلىكتىايقىسقا', 'ЖЕРГІЛІКТІÐЙЖИЫР', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐШÐ', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'جەرگىلىكتىكۇن', 'ЖЕРГІЛІКТІКҮÐ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'جەرگىلىكتىكۇن2', 'ЖЕРГІЛІКТІКҮÐ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'جەرگىلىكتىكۇناتاۋى', 'ЖЕРГІЛІКТІКҮÐÐТÐУЫ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'جەرگىلىكتىجىل', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'جەرگىلىكتىۋاقىت', 'ЖЕРГІЛІКТІУÐҚЫТ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'جەرگىلىكتىساعات', 'ЖЕРГІЛІКТІСÐÒ’ÐТ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'بەتسانى', 'БЕТСÐÐЫ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ماقالاسانى', 'ÐœÐÒšÐЛÐСÐÐЫ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Ùايلسانى', 'ФÐЙЛСÐÐЫ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'قاتىسۋشىسانى', 'ÒšÐТЫСУШЫСÐÐЫ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'وڭدەمەسانى', 'تۇزەتۋسانى', 'ӨҢДЕМЕСÐÐЫ', 'ТҮЗЕТУСÐÐЫ', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'بەتاتاۋى', 'БЕТÐТÐУЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'بەتاتاۋى2', 'БЕТÐТÐУЫ2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ەسىماياسى', 'ЕСІМÐЯСЫ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ەسىماياسى2', 'ЕСІМÐЯСЫ2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'تالقىلاۋاياسى', 'ТÐЛҚЫЛÐУÐЯСЫ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'تالقىلاۋاياسى2', 'ТÐЛҚЫЛÐУÐЯСЫ2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'تاقىرىپبەتى', 'ماقالابەتى', 'ТÐҚЫРЫПБЕТІ', 'ÐœÐÒšÐЛÐБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'تاقىرىپبەتى2', 'ماقالابەتى2', 'ТÐҚЫРЫПБЕТІ2', 'ÐœÐÒšÐЛÐБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'تولىقبەتاتاۋى', 'ТОЛЫҚБЕТÐТÐУЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'تولىقبەتاتاۋى2', 'ТОЛЫҚБЕТÐТÐУЫ2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'بەتشەاتاۋى', 'استىڭعىبەتاتاۋى', 'БЕТШЕÐТÐУЫ', 'ÐСТЫҢҒЫБЕТÐТÐУЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'بەتشەاتاۋى2', 'استىڭعىبەتاتاۋى2', 'БЕТШЕÐТÐУЫ2', 'ÐСТЫҢҒЫБЕТÐТÐУЫ2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'نەگىزگىبەتاتاۋى', 'ÐЕГІЗГІБЕТÐТÐУЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'نەگىزگىبەتاتاۋى2', 'ÐЕГІЗГІБЕТÐТÐУЫ2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'تالقىلاۋبەتاتاۋى', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'تالقىلاۋبەتاتاۋى2', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'تاقىرىپبەتاتاۋى', 'ماقالابەتاتاۋى', 'ТÐҚЫРЫПБЕТÐТÐУЫ', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'تاقىرىپبەتاتاۋى2', 'ماقالابەتاتاۋى2', 'ТÐҚЫРЫПБЕТÐТÐУЫ2', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'حبر:', 'ХБР:', 'MSG:' ),
+ 'subst' => array( '0', 'بادەل:', 'БӘДЕЛ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'ۋىيكىيسىزحبر:', 'УИКИСІЗХБР:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'نوباي', 'нобай', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'نوباي=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'وڭعا', 'وڭ', 'оңға', 'оң', 'right' ),
+ 'img_left' => array( '1', 'سولعا', 'سول', 'Ñолға', 'Ñол', 'left' ),
+ 'img_none' => array( '1', 'ەشقانداي', 'جوق', 'ешқандай', 'жоқ', 'none' ),
+ 'img_width' => array( '1', '$1 نۇكتە', '$1 нүкте', '$1px' ),
+ 'img_center' => array( '1', 'ورتاعا', 'ورتا', 'ортаға', 'орта', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'سۇرمەلى', 'Ñүрмелі', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'سۇرمەسىز', 'ÑүрмеÑіз', 'frameless' ),
+ 'img_page' => array( '1', 'بەت=$1', 'بەت $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'تىكتى', 'تىكتىك=$1', 'تىكتىك $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'جىييەكتى', 'жиекті', 'border' ),
+ 'img_baseline' => array( '1', 'تىرەكجول', 'тірекжол', 'baseline' ),
+ 'img_sub' => array( '1', 'استىلىعى', 'است', 'аÑтылығы', 'аÑÑ‚', 'sub' ),
+ 'img_super' => array( '1', 'ۇستىلىگى', 'ۇست', 'Ò¯Ñтілігі', 'Ò¯ÑÑ‚', 'super', 'sup' ),
+ 'img_top' => array( '1', 'ۇستىنە', 'Ò¯Ñтіне', 'top' ),
+ 'img_text_top' => array( '1', 'ماتىن-ۇستىندە', 'мәтін-Ò¯Ñтінде', 'text-top' ),
+ 'img_middle' => array( '1', 'ارالىعىنا', 'аралығына', 'middle' ),
+ 'img_bottom' => array( '1', 'استىنا', 'аÑтына', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'ماتىن-استىندا', 'мәтін-аÑтында', 'text-bottom' ),
+ 'int' => array( '0', 'ىشكى:', 'ІШКІ:', 'INT:' ),
+ 'sitename' => array( '1', 'توراپاتاۋى', 'ТОРÐПÐТÐУЫ', 'SITENAME' ),
+ 'ns' => array( '0', 'ەا:', 'ەسىمايا:', 'ЕÐ:', 'ЕСІМÐЯ:', 'NS:' ),
+ 'localurl' => array( '0', 'جەرگىلىكتىجاي:', 'ЖЕРГІЛІКТІЖÐЙ:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'جەرگىلىكتىجاي2:', 'ЖЕРГІЛІКТІЖÐЙ2:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'سەرۆەر', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'سەرۆەراتاۋى', 'СЕРВЕРÐТÐУЫ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'امىرجولى', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'سەپتىگى:', 'سەپتىك:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__تاقىرىپاتىنتۇرلەندىرگىزبەۋ__', '__تاتجوق__', '__اتاۋالماستىرعىزباۋ__', '__ااباۋ__', '__ТÐҚЫРЫПÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ТÐТЖОҚ__', '__ÐТÐУÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐÐБÐУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ماعلۇماتىنتۇرلەندىرگىزبەۋ__', '__ماتجوق__', '__ماعلۇماتالماستىرعىزباۋ__', '__ماباۋ__', '__ÐœÐҒЛҰМÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ÐœÐТЖОҚ__', '__ÐœÐҒЛҰМÐТÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐœÐБÐУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'اعىمداعىاپتاسى', 'اعىمداعىاپتا', 'ÐҒЫМДÐҒЫÐПТÐСЫ', 'ÐҒЫМДÐҒЫÐПТÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'اعىمداعىاپتاكۇنى', 'ÐҒЫМДÐҒЫÐПТÐКҮÐІ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'جەرگىلىكتىاپتاسى', 'جەرگىلىكتىاپتا', 'ЖЕРГІЛІКТІÐПТÐСЫ', 'ЖЕРГІЛІКТІÐПТÐ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'جەرگىلىكتىاپتاكۇنى', 'ЖЕРГІЛІКТІÐПТÐКҮÐІ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'تۇزەتۋنومىرٴى', 'نۇسقانومىرٴى', 'ТҮЗЕТУÐӨМІРІ', 'ÐҰСҚÐÐӨМІРІ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'تۇزەتۋكۇنى', 'نۇسقاكۇنى', 'ТҮЗЕТУКҮÐІ', 'ÐҰСҚÐКҮÐІ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'تۇزەتۋكۇنى2', 'نۇسقاكۇنى2', 'ТҮЗЕТУКҮÐІ2', 'ÐҰСҚÐКҮÐІ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'تۇزەتۋايى', 'نۇسقاايى', 'ТҮЗЕТУÐЙЫ', 'ÐҰСҚÐÐЙЫ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'تۇزەتۋجىلى', 'نۇسقاجىلى', 'ТҮЗЕТУЖЫЛЫ', 'ÐҰСҚÐЖЫЛЫ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'تۇزەتۋۋاقىتىتاڭباسى', 'نۇسقاۋاقىتتۇيىندەمەسى', 'ТҮЗЕТУУÐҚЫТЫТÐҢБÐСЫ', 'ÐҰСҚÐУÐҚЫТТҮЙІÐДЕМЕСІ', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'كوپشەتۇرى:', 'كوپشە:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'تولىقجايى:', 'تولىقجاي:', 'ТОЛЫҚЖÐЙЫ:', 'ТОЛЫҚЖÐЙ:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'تولىقجايى2:', 'تولىقجاي2:', 'ТОЛЫҚЖÐЙЫ2:', 'ТОЛЫҚЖÐЙ2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'كا1:', 'كىشىارىپپەن1:', 'КӘ1:', 'КІШІӘРІППЕÐ1:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'با1:', 'باسارىپپەن1:', 'БӘ1:', 'БÐСӘРІППЕÐ1:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'كا:', 'كىشىارىپپەن:', 'КӘ:', 'КІШІӘРІППЕÐ:', 'LC:' ),
+ 'uc' => array( '0', 'با:', 'باسارىپپەن:', 'БӘ:', 'БÐСӘРІППЕÐ:', 'UC:' ),
+ 'raw' => array( '0', 'قام:', 'ÒšÐÐœ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'كورسەتىلەتىناتاۋ', 'КӨРІÐЕТІÐТÐҚЫРЫÐПÐТЫ', 'КӨРСЕТІЛЕТІÐÐТÐУ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Ù‚', 'Òš', 'R' ),
+ 'newsectionlink' => array( '1', '__جاڭابولىمسىلتەمەسى__', '__ЖÐÒ¢ÐБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'باعدارلامانۇسقاسى', 'БÐҒДÐРЛÐÐœÐÐҰСҚÐСЫ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'جايدىمۇقامداۋ:', 'ЖÐЙДЫМҰҚÐМДÐУ:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'جاكىردىمۇقامداۋ', 'ЖӘКІРДІМҰҚÐМДÐУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'اعىمداعىۋاقىتتۇيىندەمەسى', 'اعىمداعىۋاقىتتۇيىن', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐДЕМЕСІ', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'جەرگىلىكتىۋاقىتتۇيىندەمەسى', 'جەرگىلىكتىۋاقىتتۇيىن', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐДЕМЕСІ', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'باعىتبەلگىسى', 'БÐҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#تىل:', '#ТІЛ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ماعلۇماتتىلى', 'ÐœÐҒЛҰМÐТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ەسىمايابەتسانى:', 'ەابەتسانى:', 'ايابەتسانى:', 'ЕСІМÐЯБЕТСÐÐЫ:', 'ЕÐБЕТСÐÐЫ:', 'ÐЯБЕТСÐÐЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'اكىمشىسانى', 'ӘКІМШІСÐÐЫ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'سانپىشىمى', 'СÐÐПІШІМІ', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'سولعاىعىس', 'سولىعىس', 'СОЛҒÐЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
+ 'padright' => array( '0', 'وڭعاىعىس', 'وڭىعىس', 'ОҢҒÐЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
+ 'special' => array( '0', 'ارنايى', 'арнайы', 'special' ),
+ 'defaultsort' => array( '1', 'ادەپكىسۇرىپتاۋ:', 'ادەپكىساناتسۇرىپتاۋ:', 'ادەپكىسۇرىپتاۋكىلتى:', 'ادەپكىسۇرىپ:', 'ӘДЕПКІСҰРЫПТÐУ:', 'ӘДЕПКІСÐÐÐТСҰРЫПТÐУ:', 'ӘДЕПКІСҰРЫПТÐУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'Ùايلمەكەنى:', 'ФÐЙЛМЕКЕÐІ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'بەلگى', 'белгі', 'tag' ),
+ 'hiddencat' => array( '1', '__جاسىرىنسانات__', '__ЖÐСЫРЫÐСÐÐÐТ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'ساناتتاعىبەتتەر', 'СÐÐÐТТÐҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'بەتمولشەرى', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
);
$specialPageAliases = array(
@@ -704,14 +704,13 @@ MySQL قايتارعان قاتەسى «$3: $4»',
'badtitle' => 'جارامسىز تاقىرىپ اتى',
'badtitletext' => 'سۇرالعان بەت تاقىرىبىنىڭ اتى جارامسىز, بوس, تىلارالىق سىلتەمەسى نە ۋىيكىي-ارالىق تاقىرىپ اتى بۇرىس ەنگىزىلگەن.
مىندا تاقىرىپ اتىندا قولدالمايتىن بىرقاتار تاڭبالار بولۋى مۇمكىن.',
-'perfcached' => 'كەلەسى دەرەك بۇركەمەلەنگەن, سوندىقتان تولىقتاي جاڭالانماعان بولۋى مۇمكىن.',
-'perfcachedts' => 'كەلەسى دەرەك بۇركەمەلەنگەن, سوڭعى جاڭالانلعان كەزى: $1.',
+'perfcached' => 'كەلەسى دەرەك بۇركەمەلەنگەن, سوندىقتان تولىقتاي جاڭالانماعان بولۋى مۇمكىن. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'كەلەسى دەرەك بۇركەمەلەنگەن, سوڭعى جاڭالانلعان كەزى: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'بۇل بەتتىڭ جاڭارتىلۋى اعىمدا وشىرىلگەن. دەرەكتەرى قازىر وزگەرتىلمەيدى.',
'wrong_wfQuery_params' => 'wfQuery() Ùۋنكتسىيياسى ٴۇشىن بۇرىس باپتالىمدارى بار<br />
جەتە: $1<br />
سۇرانىم: $2',
'viewsource' => 'قاينار كوزىن قاراۋ',
-'viewsourcefor' => '$1 دەگەن ٴۇشىن',
'actionthrottled' => 'ارەكەت باسەڭدەتىلدى',
'actionthrottledtext' => 'سپامعا قارسى كۇرەس ەسەبىندە, وسى ارەكەتتى قىسقا ۋاقىتتا تىم كوپ رەت ورىنداۋىڭىز شەكتەلىندى, جانە بۇل شەكتەۋ شاماسىنان اسىپ كەتكەنسىز.
بىرنەشە ٴمىينوتتان قايتا بايقاپ كورىڭىز.',
@@ -890,9 +889,6 @@ IP مەكەنجايىڭىز بۇل بەتتىڭ تۇزەتۋ تارىيحىندØ
بۇعاتاۋ ٴنومىرىڭىز: $5.
بۇل ٴنومىردى ٴاربىر سۇرانىمىڭىزدارعا كىرىستىرىڭىز.",
'blockednoreason' => 'ەش سەبەبى كەلتىرىلمەگەن',
-'blockedoriginalsource' => "'''$1''' دەگەننىڭ قاينار كوزى تومەندە كورسەتىلەدى:",
-'blockededitsource' => "'''$1''' دەگەنگە جاسالعان '''وڭدەمەلەرىڭىزدىڭ''' ٴماتىنى تومەندە كورسەتىلەدى:",
-'whitelistedittitle' => 'وڭدەۋ ٴۇشىن كىرۋىڭىز ٴجون.',
'whitelistedittext' => 'بەتتەردى وڭدەۋ ٴۇشىن $1 ٴجون.',
'confirmedittext' => 'بەتتەردى وڭدەۋ ٴۇشىن الدىن الا ە-پوشتا مەكەنجايىڭىزدى قۇپتاۋىڭىز ٴجون.
ە-پوشتا مەكەنجايىڭىزدى [[Special:Preferences|پايدالانۋشىلىق باپتالىمدارىڭىز]] ارقىلى قويىڭىز دا جارامدىلىعىن تەكسەرىپ شىعىڭىز.',
@@ -1068,22 +1064,11 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
'revdelete-unsuppress' => 'قالپىنا كەلتىرىلگەن تۇزەتۋلەردەن تىيىمداردى الاستاۋ',
'revdelete-log' => 'سەبەبى:',
'revdelete-submit' => 'بولەكتەنگەن تۇزەتۋگە قولدانۋ',
-'revdelete-logentry' => '[[$1]] دەگەننىڭ تۇزەتۋ كورىنىسىن وزگەرتتى',
-'logdelete-logentry' => '[[$1]] دەگەننىڭ وقىيعا كورىنىسىن وزگەرتتى',
'revdelete-success' => "'''تۇزەتۋ كورىنىسى ٴساتتى قويىلدى.'''",
'logdelete-success' => "'''جۋرنال كورىنىسى ٴساتتى قويىلدى.'''",
'revdel-restore' => 'كورىنىسىن وزگەرتۋ',
'pagehist' => 'بەت تارىيحى',
'deletedhist' => 'جويىلعان تارىيحى',
-'revdelete-content' => 'ماعلۇمات',
-'revdelete-summary' => 'وڭدەمەنىڭ قىسقاشا مازمۇنداماسى',
-'revdelete-uname' => 'قاتىسۋشى اتى',
-'revdelete-restricted' => 'اكىمشىلەرگە تىيىمدار قولدادى',
-'revdelete-unrestricted' => 'اكىمشىلەردەن تىيىمداردى الاستادى',
-'revdelete-hid' => '$1 جاسىردى',
-'revdelete-unhid' => '$1 اشتى',
-'revdelete-log-message' => '$2 تۇزەتۋ ٴۇشىن $1',
-'logdelete-log-message' => '$2 وقىيعا ٴۇشىن $1',
'revdelete-edit-reasonlist' => 'جويۋ سەبەپتەرىن وڭدەۋ',
# Suppression log
@@ -1327,7 +1312,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
'right-autopatrol' => 'ٴوز وڭدەمەلەرىن زەرتتەلدى دەپ وزدىكتىك بەلگىلەۋ',
'right-patrolmarks' => 'جۋىقتاعى وزگەرىستەردەگى زەرتتەۋ بەلگىلەرىن كورۋ',
'right-unwatchedpages' => 'باقىلانىلماعان بەت ٴتىزىمىن كورۋ',
-'right-trackback' => 'اڭىستاۋدى جونەلتۋ',
'right-mergehistory' => 'بەتتەردىڭ تارىيحىن قوسىپ بەرۋ',
'right-userrights' => 'قاتىسۋشىلاردىڭ بارلىق قۇقىقتارىن وڭدەۋ',
'right-userrights-interwiki' => 'باسقا ۇىيكىيلەردەگى قاتىسۋشىلاردىڭ قۇقىقتارىن وڭدەۋ',
@@ -1713,10 +1697,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'قاتىسۋشى تابىلعان جوق.',
# Special:Log/newusers
-'newuserlogpage' => 'تىركەلۋ جۋرنالى',
-'newuserlogpagetext' => 'بۇل قاتىسۋشى تىركەلگى جاساۋ جۋرنالى',
-'newuserlog-create-entry' => 'جاڭا قاتىسۋشى',
-'newuserlog-create2-entry' => 'جاڭا تىركەلگى جاسادى — $1',
+'newuserlogpage' => 'تىركەلۋ جۋرنالى',
+'newuserlogpagetext' => 'بۇل قاتىسۋشى تىركەلگى جاساۋ جۋرنالى',
# Special:ListGroupRights
'listgrouprights' => 'قاتىسۋشى توبى قۇقىقتارى',
@@ -1829,8 +1811,6 @@ $NEWPAGE
'actioncomplete' => 'ارەكەت ٴبىتتى',
'deletedtext' => '«$1» جويىلدى.
جۋىقتاعى جويۋلار تۋرالى جازبالارىن $2 دەگەننەن قاراڭىز.',
-'deletedarticle' => '«[[$1]]» دەگەندى جويدى',
-'suppressedarticle' => '«[[$1]]» دەگەندى شەتتەتتى',
'dellogpage' => 'جويۋ_جۋرنالى',
'dellogpagetext' => 'تومەندە جۋىقتاعى جويۋلاردىڭ ٴتىزىمى بەرىلگەن.',
'deletionlog' => 'جويۋ جۋرنالى',
@@ -1945,7 +1925,6 @@ $2 سوڭعى نۇسقاسىنا وزگەرتتى.',
'undeletelink' => 'قالپىنا كەلتىرۋ',
'undeletereset' => 'قايتا قوي',
'undeletecomment' => 'ماندەمەسى:',
-'undeletedarticle' => '«[[$1]]» قالپىنا كەلتىرىلدى',
'undeletedrevisions' => '$1 تۇزەتۋ قالپىنا كەلتىرىلدى',
'undeletedrevisions-files' => '$1 تۇزەتۋ جانە $2 Ùايل قالپىنا كەلتىرىلدى',
'undeletedfiles' => '$1 Ùايل قالپىنا كەلتىرىلدى',
@@ -2158,8 +2137,6 @@ $1 بۇعاتتاۋى ٴۇشىن كەلتىرىلگەن سەبەبى: «$2».',
'movepage-page-moved' => '$1 دەگەن بەت $2 دەگەنگە جىلجىتىلدى.',
'movepage-page-unmoved' => '$1 دەگەن بەت $2 دەگەنگە جىلجىتىلمايدى.',
'movepage-max-pages' => 'بارىنشا $1 بەت جىلجىتىلدى دا مىننان كوبى وزدىكتىك جىلجىلتىلمايدى.',
-'1movedto2' => '[[$1]] دەگەندى [[$2]] دەگەنگە جىلجىتتى',
-'1movedto2_redir' => '[[$1]] دەگەندى [[$2]] دەگەن ايداعىش ۇستىنە جىلجىتتى',
'movelogpage' => 'جىلجىتۋ جۋرنالى',
'movelogpagetext' => 'تومەندە جىلجىتىلعان بەتتەردىڭ ٴتىزىمى بەرىلىپ تۇر.',
'movereason' => 'سەبەبى:',
@@ -2378,9 +2355,6 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەتÙ
# Patrol log
'patrol-log-page' => 'زەرتتەۋ جۋرنالى',
-'patrol-log-line' => '$2 دەگەننىڭ $1 تۇزەتۋىن زەرتتەلدى دەپ بەلگىلەدى $3',
-'patrol-log-auto' => '(وزدىكتىك)',
-'patrol-log-diff' => 'ٴنومىر $1',
# Image deletion
'deletedrevision' => 'ەسكى تۇزەتۋىن جويدى: $1',
@@ -2405,7 +2379,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 بەت',
'file-info' => 'Ùايل مولشەرى: $1, MIME ٴتۇرى: $2',
'file-info-size' => '$1 × $2 نۇكتە, Ùايل مولشەرى: $3, MIME ٴتۇرى: $4',
-'file-nohires' => '<small>جوعارى اجىراتىلىمدىعى جەتىمسىز.</small>',
+'file-nohires' => 'جوعارى اجىراتىلىمدىعى جەتىمسىز.',
'svg-long-desc' => 'SVG Ùايلى, كەسىمدى $1 × $2 نۇكتە, Ùايل مولشەرى: $3',
'show-big-image' => 'جوعارى اجىراتىلىمدى',
@@ -2421,9 +2395,9 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'س',
-'minutes-abbrev' => 'مىين',
-'hours-abbrev' => 'ساع',
+'seconds-abbrev' => '$1س',
+'minutes-abbrev' => '$1مىين',
+'hours-abbrev' => '$1ساع',
# Bad image list
'bad_image_list' => 'ٴپىشىمى تومەندەگىدەي:
@@ -2755,13 +2729,6 @@ $5
'scarytranscludefailed' => '[$1 ٴۇشىن Û‡Ù„Ú¯Ù‰ كەلتىرۋى ٴساتسىز ٴبىتتى; عاÙÛ‹ ەتىڭىز]',
'scarytranscludetoolong' => '[URL تىم ۇزىن; عاÙÛ‹ ەتىڭىز]',
-# Trackbacks
-'trackbackbox' => 'بۇل بەتتىڭ اڭىستاۋلارى:<br />
-$1',
-'trackbackremove' => '([$1 جويۋ])',
-'trackbacklink' => 'اڭىستاۋ',
-'trackbackdeleteok' => 'اڭىستاۋ ٴساتتى جويىلدى.',
-
# Delete conflict
'deletedwhileediting' => 'قۇلاقتاندىرۋ: بۇل بەتتى وڭدەۋىڭىزدى باستاعاندا, وسى بەت جويىلدى!',
'confirmrecreate' => "بۇل بەتتى وڭدەۋىڭىزدى باستاعاندا [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|تالقىلاۋى]]) وسى بەتتى جويدى, كەلتىرگەن سەبەبى:
@@ -2944,4 +2911,8 @@ $1',
'specialpages-group-redirects' => 'ايدايتىن ارنايى بەتتەر',
'specialpages-group-spam' => 'سپام قۇرالدارى',
+# New logging system
+'revdelete-restricted' => 'اكىمشىلەرگە تىيىمدار قولدادى',
+'revdelete-unrestricted' => 'اكىمشىلەردەن تىيىمداردى الاستادى',
+
);
diff --git a/languages/messages/MessagesKk_cn.php b/languages/messages/MessagesKk_cn.php
index e96d890f..fba4e9ff 100644
--- a/languages/messages/MessagesKk_cn.php
+++ b/languages/messages/MessagesKk_cn.php
@@ -10,4 +10,4 @@
*/
# Inherit everything for now
-$fallback = 'kk-arab';
+$fallback = 'kk-arab, kk-cyrl';
diff --git a/languages/messages/MessagesKk_cyrl.php b/languages/messages/MessagesKk_cyrl.php
index 1c48fc94..649a6b4f 100644
--- a/languages/messages/MessagesKk_cyrl.php
+++ b/languages/messages/MessagesKk_cyrl.php
@@ -153,130 +153,130 @@ $dateFormats = array(
);
$magicWords = array(
- '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', 'ÐҒЫМДÐҒЫÐЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ÐҒЫМДÐҒЫÐЙÐТÐУЫ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ÐҒЫМДÐҒЫÐЙІЛІКÐТÐУЫ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ÐҒЫМДÐҒЫÐЙЖИЫР', 'ÐҒЫМДÐҒЫÐЙҚЫСҚÐ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ÐҒЫМДÐҒЫКҮÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ÐҒЫМДÐҒЫКҮÐ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ÐҒЫМДÐҒЫКҮÐÐТÐУЫ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ÐҒЫМДÐҒЫЖЫЛ', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ÐҒЫМДÐҒЫУÐҚЫТ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ÐҒЫМДÐҒЫСÐÒ’ÐТ', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ЖЕРГІЛІКТІÐЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'ЖЕРГІЛІКТІÐЙÐТÐУЫ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ЖЕРГІЛІКТІÐЙІЛІКÐТÐУЫ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ЖЕРГІЛІКТІÐЙЖИЫР', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐШÐ', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ЖЕРГІЛІКТІКҮÐ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ЖЕРГІЛІКТІКҮÐ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ЖЕРГІЛІКТІКҮÐÐТÐУЫ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ЖЕРГІЛІКТІУÐҚЫТ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ЖЕРГІЛІКТІСÐÒ’ÐТ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'БЕТСÐÐЫ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ÐœÐÒšÐЛÐСÐÐЫ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ФÐЙЛСÐÐЫ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ÒšÐТЫСУШЫСÐÐЫ', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'ӨҢДЕМЕСÐÐЫ', 'ТҮЗЕТУСÐÐЫ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'БЕТÐТÐУЫ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'БЕТÐТÐУЫ2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ЕСІМÐЯСЫ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ЕСІМÐЯСЫ2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ТÐЛҚЫЛÐУÐЯСЫ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ТÐЛҚЫЛÐУÐЯСЫ2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ТÐҚЫРЫПБЕТІ', 'ÐœÐÒšÐЛÐБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ТÐҚЫРЫПБЕТІ2', 'ÐœÐÒšÐЛÐБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ТОЛЫҚБЕТÐТÐУЫ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ТОЛЫҚБЕТÐТÐУЫ2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'БЕТШЕÐТÐУЫ', 'ÐСТЫҢҒЫБЕТÐТÐУЫ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'БЕТШЕÐТÐУЫ2', 'ÐСТЫҢҒЫБЕТÐТÐУЫ2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ÐЕГІЗГІБЕТÐТÐУЫ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ÐЕГІЗГІБЕТÐТÐУЫ2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ТÐҚЫРЫПБЕТÐТÐУЫ', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ТÐҚЫРЫПБЕТÐТÐУЫ2', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'ХБР:', 'MSG:' ),
- 'subst' => array( '0', 'БӘДЕЛ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'УИКИСІЗХБР:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'нобай', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'оңға', 'оң', 'right' ),
- 'img_left' => array( '1', 'Ñолға', 'Ñол', 'left' ),
- 'img_none' => array( '1', 'ешқандай', 'жоқ', 'none' ),
- 'img_width' => array( '1', '$1 нүкте', '$1px' ),
- 'img_center' => array( '1', 'ортаға', 'орта', 'center', 'centre' ),
- 'img_framed' => array( '1', 'Ñүрмелі', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'ÑүрмеÑіз', 'frameless' ),
- 'img_page' => array( '1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'жиекті', 'border' ),
- 'img_baseline' => array( '1', 'тірекжол', 'baseline' ),
- 'img_sub' => array( '1', 'аÑтылығы', 'аÑÑ‚', 'sub' ),
- 'img_super' => array( '1', 'Ò¯Ñтілігі', 'Ò¯ÑÑ‚', 'super', 'sup' ),
- 'img_top' => array( '1', 'Ò¯Ñтіне', 'top' ),
- 'img_text_top' => array( '1', 'мәтін-Ò¯Ñтінде', 'text-top' ),
- 'img_middle' => array( '1', 'аралығына', 'middle' ),
- 'img_bottom' => array( '1', 'аÑтына', 'bottom' ),
- 'img_text_bottom' => array( '1', 'мәтін-аÑтында', 'text-bottom' ),
- 'int' => array( '0', 'ІШКІ:', 'INT:' ),
- 'sitename' => array( '1', 'ТОРÐПÐТÐУЫ', 'SITENAME' ),
- 'ns' => array( '0', 'ЕÐ:', 'ЕСІМÐЯ:', 'NS:' ),
- 'localurl' => array( '0', 'ЖЕРГІЛІКТІЖÐЙ:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЖЕРГІЛІКТІЖÐЙ2:', 'LOCALURLE:' ),
- 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'СЕРВЕРÐТÐУЫ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__ТÐҚЫРЫПÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ТÐТЖОҚ__', '__ÐТÐУÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐÐБÐУ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__ÐœÐҒЛҰМÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ÐœÐТЖОҚ__', '__ÐœÐҒЛҰМÐТÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐœÐБÐУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ÐҒЫМДÐҒЫÐПТÐСЫ', 'ÐҒЫМДÐҒЫÐПТÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ÐҒЫМДÐҒЫÐПТÐКҮÐІ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ЖЕРГІЛІКТІÐПТÐСЫ', 'ЖЕРГІЛІКТІÐПТÐ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ЖЕРГІЛІКТІÐПТÐКҮÐІ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ТҮЗЕТУÐӨМІРІ', 'ÐҰСҚÐÐӨМІРІ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ТҮЗЕТУКҮÐІ', 'ÐҰСҚÐКҮÐІ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ТҮЗЕТУКҮÐІ2', 'ÐҰСҚÐКҮÐІ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'ТҮЗЕТУÐЙЫ', 'ÐҰСҚÐÐЙЫ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ТҮЗЕТУЖЫЛЫ', 'ÐҰСҚÐЖЫЛЫ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'ТҮЗЕТУУÐҚЫТЫТÐҢБÐСЫ', 'ÐҰСҚÐУÐҚЫТТҮЙІÐДЕМЕСІ', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ТОЛЫҚЖÐЙЫ:', 'ТОЛЫҚЖÐЙ:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ТОЛЫҚЖÐЙЫ2:', 'ТОЛЫҚЖÐЙ2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'КӘ1:', 'КІШІӘРІППЕÐ1:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'БӘ1:', 'БÐСӘРІППЕÐ1:', 'UCFIRST:' ),
- 'lc' => array( '0', 'КӘ:', 'КІШІӘРІППЕÐ:', 'LC:' ),
- 'uc' => array( '0', 'БӘ:', 'БÐСӘРІППЕÐ:', 'UC:' ),
- 'raw' => array( '0', 'ÒšÐÐœ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'КӨРІÐЕТІÐТÐҚЫРЫÐПÐТЫ', 'КӨРСЕТІЛЕТІÐÐТÐУ', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Òš', 'R' ),
- 'newsectionlink' => array( '1', '__ЖÐÒ¢ÐБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'БÐҒДÐРЛÐÐœÐÐҰСҚÐСЫ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ЖÐЙДЫМҰҚÐМДÐУ:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ЖӘКІРДІМҰҚÐМДÐУ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐДЕМЕСІ', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐДЕМЕСІ', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'БÐҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#ТІЛ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ÐœÐҒЛҰМÐТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'ЕСІМÐЯБЕТСÐÐЫ:', 'ЕÐБЕТСÐÐЫ:', 'ÐЯБЕТСÐÐЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ӘКІМШІСÐÐЫ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'СÐÐПІШІМІ', 'FORMATNUM' ),
- 'padleft' => array( '0', 'СОЛҒÐЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
- 'padright' => array( '0', 'ОҢҒÐЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
- 'special' => array( '0', 'арнайы', 'special' ),
- 'defaultsort' => array( '1', 'ӘДЕПКІСҰРЫПТÐУ:', 'ӘДЕПКІСÐÐÐТСҰРЫПТÐУ:', 'ӘДЕПКІСҰРЫПТÐУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ФÐЙЛМЕКЕÐІ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'белгі', 'tag' ),
- 'hiddencat' => array( '1', '__ЖÐСЫРЫÐСÐÐÐТ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'СÐÐÐТТÐҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
+ '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', 'ÐҒЫМДÐҒЫÐЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ÐҒЫМДÐҒЫÐЙÐТÐУЫ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐҒЫМДÐҒЫÐЙІЛІКÐТÐУЫ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ÐҒЫМДÐҒЫÐЙЖИЫР', 'ÐҒЫМДÐҒЫÐЙҚЫСҚÐ', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ÐҒЫМДÐҒЫКҮÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ÐҒЫМДÐҒЫКҮÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐҒЫМДÐҒЫКҮÐÐТÐУЫ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ÐҒЫМДÐҒЫЖЫЛ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ÐҒЫМДÐҒЫУÐҚЫТ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ÐҒЫМДÐҒЫСÐÒ’ÐТ', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ЖЕРГІЛІКТІÐЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'ЖЕРГІЛІКТІÐЙÐТÐУЫ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ЖЕРГІЛІКТІÐЙІЛІКÐТÐУЫ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ЖЕРГІЛІКТІÐЙЖИЫР', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐШÐ', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ЖЕРГІЛІКТІКҮÐ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ЖЕРГІЛІКТІКҮÐ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ЖЕРГІЛІКТІКҮÐÐТÐУЫ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ЖЕРГІЛІКТІУÐҚЫТ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ЖЕРГІЛІКТІСÐÒ’ÐТ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'БЕТСÐÐЫ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ÐœÐÒšÐЛÐСÐÐЫ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ФÐЙЛСÐÐЫ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ÒšÐТЫСУШЫСÐÐЫ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ӨҢДЕМЕСÐÐЫ', 'ТҮЗЕТУСÐÐЫ', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'БЕТÐТÐУЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'БЕТÐТÐУЫ2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ЕСІМÐЯСЫ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ЕСІМÐЯСЫ2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ТÐЛҚЫЛÐУÐЯСЫ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ТÐЛҚЫЛÐУÐЯСЫ2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ТÐҚЫРЫПБЕТІ', 'ÐœÐÒšÐЛÐБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ТÐҚЫРЫПБЕТІ2', 'ÐœÐÒšÐЛÐБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ТОЛЫҚБЕТÐТÐУЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ТОЛЫҚБЕТÐТÐУЫ2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'БЕТШЕÐТÐУЫ', 'ÐСТЫҢҒЫБЕТÐТÐУЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'БЕТШЕÐТÐУЫ2', 'ÐСТЫҢҒЫБЕТÐТÐУЫ2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ÐЕГІЗГІБЕТÐТÐУЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ÐЕГІЗГІБЕТÐТÐУЫ2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ТÐҚЫРЫПБЕТÐТÐУЫ', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ТÐҚЫРЫПБЕТÐТÐУЫ2', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'ХБР:', 'MSG:' ),
+ 'subst' => array( '0', 'БӘДЕЛ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'УИКИСІЗХБР:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'нобай', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'оңға', 'оң', 'right' ),
+ 'img_left' => array( '1', 'Ñолға', 'Ñол', 'left' ),
+ 'img_none' => array( '1', 'ешқандай', 'жоқ', 'none' ),
+ 'img_width' => array( '1', '$1 нүкте', '$1px' ),
+ 'img_center' => array( '1', 'ортаға', 'орта', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'Ñүрмелі', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'ÑүрмеÑіз', 'frameless' ),
+ 'img_page' => array( '1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'жиекті', 'border' ),
+ 'img_baseline' => array( '1', 'тірекжол', 'baseline' ),
+ 'img_sub' => array( '1', 'аÑтылығы', 'аÑÑ‚', 'sub' ),
+ 'img_super' => array( '1', 'Ò¯Ñтілігі', 'Ò¯ÑÑ‚', 'super', 'sup' ),
+ 'img_top' => array( '1', 'Ò¯Ñтіне', 'top' ),
+ 'img_text_top' => array( '1', 'мәтін-Ò¯Ñтінде', 'text-top' ),
+ 'img_middle' => array( '1', 'аралығына', 'middle' ),
+ 'img_bottom' => array( '1', 'аÑтына', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'мәтін-аÑтында', 'text-bottom' ),
+ 'int' => array( '0', 'ІШКІ:', 'INT:' ),
+ 'sitename' => array( '1', 'ТОРÐПÐТÐУЫ', 'SITENAME' ),
+ 'ns' => array( '0', 'ЕÐ:', 'ЕСІМÐЯ:', 'NS:' ),
+ 'localurl' => array( '0', 'ЖЕРГІЛІКТІЖÐЙ:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЖЕРГІЛІКТІЖÐЙ2:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'СЕРВЕРÐТÐУЫ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__ТÐҚЫРЫПÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ТÐТЖОҚ__', '__ÐТÐУÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐÐБÐУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ÐœÐҒЛҰМÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ÐœÐТЖОҚ__', '__ÐœÐҒЛҰМÐТÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐœÐБÐУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ÐҒЫМДÐҒЫÐПТÐСЫ', 'ÐҒЫМДÐҒЫÐПТÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ÐҒЫМДÐҒЫÐПТÐКҮÐІ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ЖЕРГІЛІКТІÐПТÐСЫ', 'ЖЕРГІЛІКТІÐПТÐ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ЖЕРГІЛІКТІÐПТÐКҮÐІ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ТҮЗЕТУÐӨМІРІ', 'ÐҰСҚÐÐӨМІРІ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ТҮЗЕТУКҮÐІ', 'ÐҰСҚÐКҮÐІ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ТҮЗЕТУКҮÐІ2', 'ÐҰСҚÐКҮÐІ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'ТҮЗЕТУÐЙЫ', 'ÐҰСҚÐÐЙЫ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ТҮЗЕТУЖЫЛЫ', 'ÐҰСҚÐЖЫЛЫ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ТҮЗЕТУУÐҚЫТЫТÐҢБÐСЫ', 'ÐҰСҚÐУÐҚЫТТҮЙІÐДЕМЕСІ', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ТОЛЫҚЖÐЙЫ:', 'ТОЛЫҚЖÐЙ:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ТОЛЫҚЖÐЙЫ2:', 'ТОЛЫҚЖÐЙ2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'КӘ1:', 'КІШІӘРІППЕÐ1:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'БӘ1:', 'БÐСӘРІППЕÐ1:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'КӘ:', 'КІШІӘРІППЕÐ:', 'LC:' ),
+ 'uc' => array( '0', 'БӘ:', 'БÐСӘРІППЕÐ:', 'UC:' ),
+ 'raw' => array( '0', 'ÒšÐÐœ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'КӨРІÐЕТІÐТÐҚЫРЫÐПÐТЫ', 'КӨРСЕТІЛЕТІÐÐТÐУ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Òš', 'R' ),
+ 'newsectionlink' => array( '1', '__ЖÐÒ¢ÐБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'БÐҒДÐРЛÐÐœÐÐҰСҚÐСЫ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ЖÐЙДЫМҰҚÐМДÐУ:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ЖӘКІРДІМҰҚÐМДÐУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐДЕМЕСІ', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐДЕМЕСІ', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'БÐҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#ТІЛ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ÐœÐҒЛҰМÐТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ЕСІМÐЯБЕТСÐÐЫ:', 'ЕÐБЕТСÐÐЫ:', 'ÐЯБЕТСÐÐЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ӘКІМШІСÐÐЫ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'СÐÐПІШІМІ', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'СОЛҒÐЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
+ 'padright' => array( '0', 'ОҢҒÐЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
+ 'special' => array( '0', 'арнайы', 'special' ),
+ 'defaultsort' => array( '1', 'ӘДЕПКІСҰРЫПТÐУ:', 'ӘДЕПКІСÐÐÐТСҰРЫПТÐУ:', 'ӘДЕПКІСҰРЫПТÐУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ФÐЙЛМЕКЕÐІ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'белгі', 'tag' ),
+ 'hiddencat' => array( '1', '__ЖÐСЫРЫÐСÐÐÐТ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'СÐÐÐТТÐҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
);
$specialPageAliases = array(
@@ -722,22 +722,24 @@ $1',
'badarticleerror' => 'ОÑындай әрекет мына бетте атқарылмайды.',
'cannotdelete' => '«$1» бетін немеÑе файлын жою мүмкін емеÑ.
Мұны әлдекім жойған болуы мүмкін.',
+'cannotdelete-title' => '«$1» бетін жою мүмкін емеÑ',
'badtitle' => 'ЖарамÑыз тақырып аты',
'badtitletext' => 'Сұралған бет тақырыбының аты жарамÑыз, боÑ, тіларалық ÑілтемеÑÑ– не уики-аралық тақырып аты Ð±Ò±Ñ€Ñ‹Ñ ÐµÐ½Ð³Ñ–Ð·Ñ–Ð»Ð³ÐµÐ½.
Мында тақырып атында қолдалмайтын бірқатар таңбалар болуы мүмкін.',
-'perfcached' => 'КелеÑÑ– дерек бүркемеленген, Ñондықтан толықтай жаңаланмаған болуы мүмкін.',
-'perfcachedts' => 'КелеÑÑ– дерек бүркемеленген, Ñоңғы жаңаланлған кезі: $1.',
+'perfcached' => 'КелеÑÑ– дерек бүркемеленген, Ñондықтан толықтай жаңаланбаған болуы мүмкін. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'КелеÑÑ– дерек бүркемеленген, Ñоңғы жаңаланған кезі: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Бұл беттің жаңартылуы ағымда өшірілген. Деректері қазір өзгертілмейді.',
'wrong_wfQuery_params' => 'wfQuery() функциÑÑÑ‹ үшін Ð±Ò±Ñ€Ñ‹Ñ Ð±Ð°Ð¿Ñ‚Ð°Ð»Ñ‹Ð¼Ð´Ð°Ñ€Ñ‹ бар<br />
Жете: $1<br />
Сұраным: $2',
'viewsource' => 'Қайнар көзін қарау',
-'viewsourcefor' => '$1 деген үшін',
+'viewsource-title' => '$1 бетінің баÑтапқы мәтінін қарау',
'actionthrottled' => 'Әрекет бәÑеңдетілді',
'actionthrottledtext' => 'Спамға қарÑÑ‹ ÐºÒ¯Ñ€ÐµÑ ÐµÑебінде, оÑÑ‹ әрекетті қыÑқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамаÑынан аÑып кеткенÑіз.
Бірнеше минуттан қайта байқап көріңіз.',
'protectedpagetext' => 'Өңдеуді қақпайлау үшін бұл бет құлыпталынған.',
'viewsourcetext' => 'Бұл беттің қайнар көзін қарауыңызға және көшіріп алуыңызға болады:',
+'viewyourtext' => 'ОÑÑ‹ бет арқылы "өзіңіз жаÑаған өңдеулердің" баÑтапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.',
'protectedinterface' => 'Бұл бет бағдарламалық жаÑақтаманың тілдеÑу мәтінін жетіÑтіреді, Ñондықтан қиÑнатты қақпайлау үшін өзгертуі құлыпталған.',
'editinginterface' => "'''Құлақтандыру:''' Бағдарламалық жаÑақтаманың тілдеÑу мәтінін жетіÑтіретін бетін өңдеп жатырÑыз.
Бұл беттің өзгертуі баÑқа қатыÑушыларға пайдаланушылық тілдеÑуі қалай көрінетіне Ó™Ñер етеді.
@@ -924,9 +926,6 @@ IP мекенжайыңыз бұл беттің түзету тарихында
Бұғатау нөміріңіз: $5.
Бұл нөмірді әрбір Ñұранымыңыздарға кіріÑтіріңіз.",
'blockednoreason' => 'еш Ñебебі келтірілмеген',
-'blockedoriginalsource' => "'''$1''' дегеннің қайнар көзі төменде көрÑетіледі:",
-'blockededitsource' => "'''$1''' дегенге жаÑалған '''өңдемелеріңіздің''' мәтіні төменде көрÑетіледі:",
-'whitelistedittitle' => 'Өңдеу үшін кіруіңіз жөн.',
'whitelistedittext' => 'Беттерді өңдеу үшін $1 жөн.',
'confirmedittext' => 'Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.
Е-пошта мекенжайыңызды [[{{#special:Preferences}}|пайдаланушылық бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын текÑеріп шығыңыз.',
@@ -1104,22 +1103,11 @@ $3 келтірілген Ñебебі: ''$2''",
'revdelete-unsuppress' => 'Қалпына келтірілген түзетулерден тиымдарды алаÑтау',
'revdelete-log' => 'Себебі:',
'revdelete-submit' => 'Бөлектенген түзетуге қолдану',
-'revdelete-logentry' => '[[$1]] дегеннің түзету көрініÑін өзгертті',
-'logdelete-logentry' => '[[$1]] дегеннің оқиға көрініÑін өзгертті',
'revdelete-success' => "'''Түзету көрініÑÑ– Ñәтті қойылды.'''",
'logdelete-success' => "'''Журнал көрініÑÑ– Ñәтті қойылды.'''",
'revdel-restore' => 'КөрініÑін өзгерту',
'pagehist' => 'Бет тарихы',
'deletedhist' => 'Жойылған тарихы',
-'revdelete-content' => 'мағлұмат',
-'revdelete-summary' => 'өңдеменің қыÑқаша мазмұндамаÑÑ‹',
-'revdelete-uname' => 'қатыÑушы аты',
-'revdelete-restricted' => 'әкімшілерге тиымдар қолдады',
-'revdelete-unrestricted' => 'әкімшілерден тиымдарды алаÑтады',
-'revdelete-hid' => '$1 жаÑырды',
-'revdelete-unhid' => '$1 ашты',
-'revdelete-log-message' => '$2 түзету үшін $1',
-'logdelete-log-message' => '$2 оқиға үшін $1',
'revdelete-edit-reasonlist' => 'Жою Ñебептерін өңдеу',
# Suppression log
@@ -1383,7 +1371,6 @@ $3 келтірілген Ñебебі: ''$2''",
'right-autopatrol' => 'Өз өңдемелерін зерттелді деп өздіктік белгілеу',
'right-patrolmarks' => 'Жуықтағы өзгеріÑтердегі зерттеу белгілерін көру',
'right-unwatchedpages' => 'Бақыланылмаған бет тізімін көру',
-'right-trackback' => 'ÐңыÑтауды жөнелту',
'right-mergehistory' => 'Беттердің тарихын қоÑып беру',
'right-userrights' => 'ҚатыÑушылардың барлық құқықтарын өңдеу',
'right-userrights-interwiki' => 'БаÑқа үикилердегі қатыÑушылардың құқықтарын өңдеу',
@@ -1783,10 +1770,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'ҚатыÑушы табылған жоқ.',
# Special:Log/newusers
-'newuserlogpage' => 'Тіркелу журналы',
-'newuserlogpagetext' => 'Бұл қатыÑушы тіркелгі жаÑау журналы',
-'newuserlog-create-entry' => 'Жаңа қатыÑушы',
-'newuserlog-create2-entry' => 'жаңа тіркелгі жаÑады — $1',
+'newuserlogpage' => 'Тіркелу журналы',
+'newuserlogpagetext' => 'Бұл қатыÑушы тіркелгі жаÑау журналы',
# Special:ListGroupRights
'listgrouprights' => 'ҚатыÑушы тобы құқықтары',
@@ -1901,8 +1886,6 @@ $NEWPAGE
'actioncomplete' => 'Әрекет бітті',
'deletedtext' => '«$1» жойылды.
Жуықтағы жоюлар туралы жазбаларын $2 дегеннен қараңыз.',
-'deletedarticle' => '«[[$1]]» дегенді жойды',
-'suppressedarticle' => '«[[$1]]» дегенді шеттетті',
'dellogpage' => 'Жою_журналы',
'dellogpagetext' => 'Төменде жуықтағы жоюлардың тізімі берілген.',
'deletionlog' => 'жою журналы',
@@ -2017,7 +2000,6 @@ $2 Ñоңғы нұÑқаÑына өзгертті.',
'undeletelink' => 'қалпына келтіру',
'undeletereset' => 'Қайта қой',
'undeletecomment' => 'МәндемеÑÑ–:',
-'undeletedarticle' => '«[[$1]]» қалпына келтірілді',
'undeletedrevisions' => '$1 түзету қалпына келтірілді',
'undeletedrevisions-files' => '$1 түзету және $2 файл қалпына келтірілді',
'undeletedfiles' => '$1 файл қалпына келтірілді',
@@ -2244,8 +2226,6 @@ $1 бұғаттауы үшін келтірілген Ñебебі: «$2».',
'movepage-page-moved' => '$1 деген бет $2 дегенге жылжытылды.',
'movepage-page-unmoved' => '$1 деген бет $2 дегенге жылжытылмайды.',
'movepage-max-pages' => 'Барынша $1 бет жылжытылды да мыннан көбі өздіктік жылжылтылмайды.',
-'1movedto2' => '[[$1]] дегенді [[$2]] дегенге жылжытты',
-'1movedto2_redir' => '[[$1]] дегенді [[$2]] деген айдағыш Ò¯Ñтіне жылжытты',
'movelogpage' => 'Жылжыту журналы',
'movelogpagetext' => 'Төменде жылжытылған беттердің тізімі беріліп тұр.',
'movereason' => 'Жылжытудың Ñебебі:',
@@ -2467,9 +2447,6 @@ MediaWiki жүйеÑінің [[{{#special:Import}}|Ñырттан алу бетÑ
# Patrol log
'patrol-log-page' => 'Зерттеу журналы',
-'patrol-log-line' => '$2 дегеннің $1 түзетуін зерттелді деп белгіледі $3',
-'patrol-log-auto' => '(өздіктік)',
-'patrol-log-diff' => 'нөмір $1',
# Image deletion
'deletedrevision' => 'ЕÑкі түзетуін жойды: $1',
@@ -2494,7 +2471,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 бет',
'file-info' => 'Файл мөлшері: $1, MIME түрі: $2',
'file-info-size' => '$1 × $2 нүкте, файл мөлшері: $3, MIME түрі: $4',
-'file-nohires' => '<small>Жоғары ажыратылымдығы жетімÑіз.</small>',
+'file-nohires' => 'Жоғары ажыратылымдығы жетімÑіз.',
'svg-long-desc' => 'SVG файлы, кеÑімді $1 × $2 нүкте, файл мөлшері: $3',
'show-big-image' => 'Жоғары ажыратылымды',
@@ -2511,9 +2488,9 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'Ñ',
-'minutes-abbrev' => 'мин',
-'hours-abbrev' => 'Ñағ',
+'seconds-abbrev' => '$1Ñ',
+'minutes-abbrev' => '$1мин',
+'hours-abbrev' => '$1Ñағ',
# Bad image list
'bad_image_list' => 'Пішімі төмендегідей:
@@ -2845,13 +2822,6 @@ $5
'scarytranscludefailed' => '[$1 үшін үлгі келтіруі ÑәтÑіз бітті; ғафу етіңіз]',
'scarytranscludetoolong' => '[URL тым ұзын; ғафу етіңіз]',
-# Trackbacks
-'trackbackbox' => 'Бұл беттің аңыÑтаулары:<br />
-$1',
-'trackbackremove' => '([$1 Жою])',
-'trackbacklink' => 'ÐңыÑтау',
-'trackbackdeleteok' => 'ÐңыÑтау Ñәтті жойылды.',
-
# Delete conflict
'deletedwhileediting' => 'Құлақтандыру: Бұл бетті өңдеуіңізді баÑтағанда, оÑÑ‹ бет жойылды!',
'confirmrecreate' => "Бұл бетті өңдеуіңізді баÑтағанда [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|талқылауы]]) оÑÑ‹ бетті жойды, келтірген Ñебебі:
@@ -3038,4 +3008,8 @@ $1',
'blankpage' => 'Ð‘Ð¾Ñ Ð±ÐµÑ‚',
'intentionallyblankpage' => 'Бұл бет әдейі Ð±Ð¾Ñ Ò›Ð°Ð»Ð´Ñ‹Ñ€Ñ‹Ð»Ò“Ð°Ð½',
+# New logging system
+'revdelete-restricted' => 'әкімшілерге тиымдар қолдады',
+'revdelete-unrestricted' => 'әкімшілерден тиымдарды алаÑтады',
+
);
diff --git a/languages/messages/MessagesKk_latn.php b/languages/messages/MessagesKk_latn.php
index 037d72ca..8b80e58c 100644
--- a/languages/messages/MessagesKk_latn.php
+++ b/languages/messages/MessagesKk_latn.php
@@ -154,129 +154,129 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#AÃDAW', '#ÐЙДÐУ', '#REDIRECT' ),
- 'notoc' => array( '0', '__MAZMUNSIZ__', '__MSIZ__', '__ÐœÐЗМҰÐСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__QOÃMASIZ__', '__QSIZ__', '__ҚОЙМÐСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__MAZMUNDATQIZW__', '__MQIZW__', '__ÐœÐЗМҰÐДÐТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__MAZMUNI__', '__MZMN__', '__ÐœÐЗМҰÐЫ__', '__МЗМÐ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BÖLÄ°DÄ°MÖNDEMEW__', '__BÖLÄ°MÖNDETKÄ°ZBEW__', '__БӨЛІДІМӨÐДЕМЕУ__', '__БӨЛІМӨÐДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'AÄžIMDAÄžIAÃ', 'ÐҒЫМДÐҒЫÐЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'AÄžIMDAÄžIAÃATAWI', 'ÐҒЫМДÐҒЫÐЙÐТÐУЫ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'AÄžIMDAÄžIAÃÄ°LÄ°KATAWI', 'ÐҒЫМДÐҒЫÐЙІЛІКÐТÐУЫ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'AÄžIMDAÄžIAÃJÃIR', 'AÄžIMDAÄžIAÃQISQA', 'ÐҒЫМДÐҒЫÐЙЖИЫР', 'ÐҒЫМДÐҒЫÐЙҚЫСҚÐ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'AÄžIMDAÄžIKÃœN', 'ÐҒЫМДÐҒЫКҮÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'AÄžIMDAÄžIKÃœN2', 'ÐҒЫМДÐҒЫКҮÐ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'AÄžIMDAÄžIKÃœNATAWI', 'ÐҒЫМДÐҒЫКҮÐÐТÐУЫ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AÄžIMDAÄžIJIL', 'ÐҒЫМДÐҒЫЖЫЛ', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AÄžIMDAÄžIWAQIT', 'ÐҒЫМДÐҒЫУÐҚЫТ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'AÄžIMDAÄžISAÄžAT', 'ÐҒЫМДÐҒЫСÐÒ’ÐТ', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃ', 'ЖЕРГІЛІКТІÐЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃATAWI', 'ЖЕРГІЛІКТІÐЙÐТÐУЫ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃÄ°LÄ°KATAWI', 'ЖЕРГІЛІКТІÐЙІЛІКÐТÐУЫ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃJÃIR', 'JERGÄ°LÄ°KTÄ°AÃQISQAÅžA', 'JERGÄ°LÄ°KTÄ°AÃQISQA', 'ЖЕРГІЛІКТІÐЙЖИЫР', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐШÐ', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'JERGÄ°LÄ°KTÄ°KÃœN', 'ЖЕРГІЛІКТІКҮÐ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'JERGÄ°LÄ°KTÄ°KÃœN2', 'ЖЕРГІЛІКТІКҮÐ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'JERGÄ°LÄ°KTÄ°KÃœNATAWI', 'ЖЕРГІЛІКТІКҮÐÐТÐУЫ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'JERGİLİKTİJIL', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'JERGÄ°LÄ°KTÄ°WAQIT', 'ЖЕРГІЛІКТІУÐҚЫТ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'JERGÄ°LÄ°KTÄ°SAÄžAT', 'ЖЕРГІЛІКТІСÐÒ’ÐТ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'BETSANI', 'БЕТСÐÐЫ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'MAQALASANI', 'ÐœÐÒšÐЛÐСÐÐЫ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FAÃLSANI', 'ФÐЙЛСÐÐЫ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'QATISWÅžISANI', 'ÒšÐТЫСУШЫСÐÐЫ', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'ÖÑDEMESANI', 'TÃœZETWSANI', 'ӨҢДЕМЕСÐÐЫ', 'ТҮЗЕТУСÐÐЫ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'BETATAWI', 'БЕТÐТÐУЫ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'BETATAWI2', 'БЕТÐТÐУЫ2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ESÄ°MAYASI', 'ЕСІМÐЯСЫ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESÄ°MAYASI2', 'ЕСІМÐЯСЫ2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'TALQILAWAYASI', 'ТÐЛҚЫЛÐУÐЯСЫ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'TALQILAWAYASI2', 'ТÐЛҚЫЛÐУÐЯСЫ2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'TAQIRIPBETÄ°', 'MAQALABETÄ°', 'ТÐҚЫРЫПБЕТІ', 'ÐœÐÒšÐЛÐБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'TAQIRIPBETÄ°2', 'MAQALABETÄ°2', 'ТÐҚЫРЫПБЕТІ2', 'ÐœÐÒšÐЛÐБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'TOLIQBETATAWI', 'ТОЛЫҚБЕТÐТÐУЫ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'TOLIQBETATAWI2', 'ТОЛЫҚБЕТÐТÐУЫ2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'BETÅžEATAWI', 'ASTIÑĞIBETATAWI', 'БЕТШЕÐТÐУЫ', 'ÐСТЫҢҒЫБЕТÐТÐУЫ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'BETÅžEATAWI2', 'ASTIÑĞIBETATAWI2', 'БЕТШЕÐТÐУЫ2', 'ÐСТЫҢҒЫБЕТÐТÐУЫ2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NEGÄ°ZGÄ°BETATAWI', 'ÐЕГІЗГІБЕТÐТÐУЫ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NEGÄ°ZGÄ°BETATAWI2', 'ÐЕГІЗГІБЕТÐТÐУЫ2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'TALQILAWBETATAWI', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'TALQILAWBETATAWI2', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'TAQIRIPBETATAWI', 'MAQALABETATAWI', 'ТÐҚЫРЫПБЕТÐТÐУЫ', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'TAQIRIPBETATAWI2', 'MAQALABETATAWI2', 'ТÐҚЫРЫПБЕТÐТÐУЫ2', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'XBR:', 'ХБР:', 'MSG:' ),
- 'subst' => array( '0', 'BÄDEL:', 'БӘДЕЛ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'WÃKÃSÄ°ZXBR:', 'УИКИСІЗХБР:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'nobaý', 'нобай', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'nobaý=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'oñğa', 'oñ', 'оңға', 'оң', 'right' ),
- 'img_left' => array( '1', 'solÄŸa', 'sol', 'Ñолға', 'Ñол', 'left' ),
- 'img_none' => array( '1', 'eşqandaý', 'joq', 'ешқандай', 'жоқ', 'none' ),
- 'img_width' => array( '1', '$1 nükte', '$1 нүкте', '$1px' ),
- 'img_center' => array( '1', 'ortağa', 'orta', 'ортаға', 'орта', 'center', 'centre' ),
- 'img_framed' => array( '1', 'sürmeli', 'Ñүрмелі', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sürmesiz', 'ÑүрмеÑіз', 'frameless' ),
- 'img_page' => array( '1', 'bet=$1', 'bet $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'tikti', 'tiktik=$1', 'tiktik $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'jïekti', 'жиекті', 'border' ),
- 'img_baseline' => array( '1', 'tirekjol', 'тірекжол', 'baseline' ),
- 'img_sub' => array( '1', 'astılığı', 'ast', 'аÑтылығы', 'аÑÑ‚', 'sub' ),
- 'img_super' => array( '1', 'üstiligi', 'üst', 'Ò¯Ñтілігі', 'Ò¯ÑÑ‚', 'super', 'sup' ),
- 'img_top' => array( '1', 'üstine', 'Ò¯Ñтіне', 'top' ),
- 'img_text_top' => array( '1', 'mätin-üstinde', 'мәтін-Ò¯Ñтінде', 'text-top' ),
- 'img_middle' => array( '1', 'aralığına', 'аралығына', 'middle' ),
- 'img_bottom' => array( '1', 'astına', 'аÑтына', 'bottom' ),
- 'img_text_bottom' => array( '1', 'mätin-astında', 'мәтін-аÑтында', 'text-bottom' ),
- 'int' => array( '0', 'İŞKİ:', 'ІШКІ:', 'INT:' ),
- 'sitename' => array( '1', 'TORAPATAWI', 'ТОРÐПÐТÐУЫ', 'SITENAME' ),
- 'ns' => array( '0', 'EA:', 'ESÄ°MAYA:', 'ЕÐ:', 'ЕСІМÐЯ:', 'NS:' ),
- 'localurl' => array( '0', 'JERGÄ°LÄ°KTÄ°JAÃ:', 'ЖЕРГІЛІКТІЖÐЙ:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'JERGÄ°LÄ°KTÄ°JAÃ2:', 'ЖЕРГІЛІКТІЖÐЙ2:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'SERVERATAWI', 'СЕРВЕРÐТÐУЫ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ÄMİRJOLI', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'SEPTİGİ:', 'SEPTİK:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__TAQIRIPATINTÃœRLENDÄ°RGÄ°ZBEW__', '__TATJOQ__', '__ATAWALMASTIRÄžIZBAW__', '__AABAW__', '__ТÐҚЫРЫПÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ТÐТЖОҚ__', '__ÐТÐУÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐÐБÐУ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__MAÄžLUMATINTÃœRLENDÄ°RGÄ°ZBEW__', '__MATJOQ__', '__MAÄžLUMATALMASTIRÄžIZBAW__', '__MABAW__', '__ÐœÐҒЛҰМÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ÐœÐТЖОҚ__', '__ÐœÐҒЛҰМÐТÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐœÐБÐУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'AÄžIMDAÄžIAPTASI', 'AÄžIMDAÄžIAPTA', 'ÐҒЫМДÐҒЫÐПТÐСЫ', 'ÐҒЫМДÐҒЫÐПТÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'AÄžIMDAÄžIAPTAKÃœNÄ°', 'ÐҒЫМДÐҒЫÐПТÐКҮÐІ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'JERGÄ°LÄ°KTÄ°APTASI', 'JERGÄ°LÄ°KTÄ°APTA', 'ЖЕРГІЛІКТІÐПТÐСЫ', 'ЖЕРГІЛІКТІÐПТÐ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'JERGÄ°LÄ°KTÄ°APTAKÃœNÄ°', 'ЖЕРГІЛІКТІÐПТÐКҮÐІ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'TÃœZETWNÖMÄ°RÄ°', 'NUSQANÖMÄ°RÄ°', 'ТҮЗЕТУÐӨМІРІ', 'ÐҰСҚÐÐӨМІРІ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'TÃœZETWKÃœNÄ°', 'NUSQAKÃœNÄ°', 'ТҮЗЕТУКҮÐІ', 'ÐҰСҚÐКҮÐІ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'TÃœZETWKÃœNÄ°2', 'NUSQAKÃœNÄ°2', 'ТҮЗЕТУКҮÐІ2', 'ÐҰСҚÐКҮÐІ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'TÃœZETWAÃI', 'NUSQAAÃI', 'ТҮЗЕТУÐЙЫ', 'ÐҰСҚÐÐЙЫ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'TÃœZETWJILI', 'NUSQAJILI', 'ТҮЗЕТУЖЫЛЫ', 'ÐҰСҚÐЖЫЛЫ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'TÃœZETWWAQITITAÑBASI', 'NUSQAWAQITTÃœÃÄ°NDEMESÄ°', 'ТҮЗЕТУУÐҚЫТЫТÐҢБÐСЫ', 'ÐҰСҚÐУÐҚЫТТҮЙІÐДЕМЕСІ', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'KÖPŞETÜRİ:', 'KÖPŞE:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TOLIQJAÃI:', 'TOLIQJAÃ:', 'ТОЛЫҚЖÐЙЫ:', 'ТОЛЫҚЖÐЙ:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'TOLIQJAÃI2:', 'TOLIQJAÃ2:', 'ТОЛЫҚЖÐЙЫ2:', 'ТОЛЫҚЖÐЙ2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'KÄ1:', 'KİŞİÄRÄ°PPEN1:', 'КӘ1:', 'КІШІӘРІППЕÐ1:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'BÄ1:', 'BASÄRÄ°PPEN1:', 'БӘ1:', 'БÐСӘРІППЕÐ1:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KÄ:', 'KİŞİÄRÄ°PPEN:', 'КӘ:', 'КІШІӘРІППЕÐ:', 'LC:' ),
- 'uc' => array( '0', 'BÄ:', 'BASÄRÄ°PPEN:', 'БӘ:', 'БÐСӘРІППЕÐ:', 'UC:' ),
- 'raw' => array( '0', 'QAM:', 'ÒšÐÐœ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'KÖRÄ°NETÄ°NTAQIRIAPATI', 'KÖRSETÄ°LETÄ°NATAW', 'КӨРІÐЕТІÐТÐҚЫРЫÐПÐТЫ', 'КӨРСЕТІЛЕТІÐÐТÐУ', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Q', 'Òš', 'R' ),
- 'newsectionlink' => array( '1', '__JAÑABÖLÄ°MSÄ°LTEMESÄ°__', '__ЖÐÒ¢ÐБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'BAÄžDARLAMANUSQASI', 'БÐҒДÐРЛÐÐœÐÐҰСҚÐСЫ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'JAÃDIMUQAMDAW:', 'ЖÐЙДЫМҰҚÐМДÐУ:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'JÄKÄ°RDÄ°MUQAMDAW', 'ЖӘКІРДІМҰҚÐМДÐУ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'AÄžIMDAÄžIWAQITTÃœÃÄ°NDEMESÄ°', 'AÄžIMDAÄžIWAQITTÃœÃÄ°N', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐДЕМЕСІ', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'JERGÄ°LÄ°KTÄ°WAQITTÃœÃÄ°NDEMESÄ°', 'JERGÄ°LÄ°KTÄ°WAQITTÃœÃÄ°N', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐДЕМЕСІ', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'BAÄžITBELGÄ°SÄ°', 'БÐҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#TİL:', '#ТІЛ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'MAÄžLUMATTÄ°LÄ°', 'ÐœÐҒЛҰМÐТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'ESÄ°MAYABETSANI:', 'EABETSANI:', 'AYABETSANI:', 'ЕСІМÐЯБЕТСÐÐЫ:', 'ЕÐБЕТСÐÐЫ:', 'ÐЯБЕТСÐÐЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ÄKÄ°MŞİSANI', 'ӘКІМШІСÐÐЫ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'SANPİŞİMÄ°', 'СÐÐПІШІМІ', 'FORMATNUM' ),
- 'padleft' => array( '0', 'SOLÄžAIÄžIS', 'SOLIÄžIS', 'СОЛҒÐЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
- 'padright' => array( '0', 'OÑĞAIÄžIS', 'OÑIÄžIS', 'ОҢҒÐЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
- 'special' => array( '0', 'arnaýı', 'арнайы', 'special' ),
- 'defaultsort' => array( '1', 'ÄDEPKÄ°SURIPTAW:', 'ÄDEPKÄ°SANATSURIPTAW:', 'ÄDEPKÄ°SURIPTAWKÄ°LTÄ°:', 'ÄDEPKÄ°SURIP:', 'ӘДЕПКІСҰРЫПТÐУ:', 'ӘДЕПКІСÐÐÐТСҰРЫПТÐУ:', 'ӘДЕПКІСҰРЫПТÐУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'FAÃLMEKENÄ°:', 'ФÐЙЛМЕКЕÐІ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'belgi', 'белгі', 'tag' ),
- 'hiddencat' => array( '1', '__JASIRINSANAT__', '__ЖÐСЫРЫÐСÐÐÐТ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'SANATTAÄžIBETTER', 'СÐÐÐТТÐҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'BETMÖLŞERİ', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#AÃDAW', '#ÐЙДÐУ', '#REDIRECT' ),
+ 'notoc' => array( '0', '__MAZMUNSIZ__', '__MSIZ__', '__ÐœÐЗМҰÐСЫЗ__', '__МСЫЗ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__QOÃMASIZ__', '__QSIZ__', '__ҚОЙМÐСЫЗ__', '__ҚСЫЗ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__MAZMUNDATQIZW__', '__MQIZW__', '__ÐœÐЗМҰÐДÐТҚЫЗУ__', '__МҚЫЗУ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__MAZMUNI__', '__MZMN__', '__ÐœÐЗМҰÐЫ__', '__МЗМÐ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BÖLÄ°DÄ°MÖNDEMEW__', '__BÖLÄ°MÖNDETKÄ°ZBEW__', '__БӨЛІДІМӨÐДЕМЕУ__', '__БӨЛІМӨÐДЕТКІЗБЕУ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'AÄžIMDAÄžIAÃ', 'ÐҒЫМДÐҒЫÐЙ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'AÄžIMDAÄžIAÃATAWI', 'ÐҒЫМДÐҒЫÐЙÐТÐУЫ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'AÄžIMDAÄžIAÃÄ°LÄ°KATAWI', 'ÐҒЫМДÐҒЫÐЙІЛІКÐТÐУЫ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'AÄžIMDAÄžIAÃJÃIR', 'AÄžIMDAÄžIAÃQISQA', 'ÐҒЫМДÐҒЫÐЙЖИЫР', 'ÐҒЫМДÐҒЫÐЙҚЫСҚÐ', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'AÄžIMDAÄžIKÃœN', 'ÐҒЫМДÐҒЫКҮÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'AÄžIMDAÄžIKÃœN2', 'ÐҒЫМДÐҒЫКҮÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'AÄžIMDAÄžIKÃœNATAWI', 'ÐҒЫМДÐҒЫКҮÐÐТÐУЫ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AÄžIMDAÄžIJIL', 'ÐҒЫМДÐҒЫЖЫЛ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AÄžIMDAÄžIWAQIT', 'ÐҒЫМДÐҒЫУÐҚЫТ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'AÄžIMDAÄžISAÄžAT', 'ÐҒЫМДÐҒЫСÐÒ’ÐТ', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃ', 'ЖЕРГІЛІКТІÐЙ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃATAWI', 'ЖЕРГІЛІКТІÐЙÐТÐУЫ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃÄ°LÄ°KATAWI', 'ЖЕРГІЛІКТІÐЙІЛІКÐТÐУЫ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'JERGÄ°LÄ°KTÄ°AÃJÃIR', 'JERGÄ°LÄ°KTÄ°AÃQISQAÅžA', 'JERGÄ°LÄ°KTÄ°AÃQISQA', 'ЖЕРГІЛІКТІÐЙЖИЫР', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐШÐ', 'ЖЕРГІЛІКТІÐЙҚЫСҚÐ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'JERGÄ°LÄ°KTÄ°KÃœN', 'ЖЕРГІЛІКТІКҮÐ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'JERGÄ°LÄ°KTÄ°KÃœN2', 'ЖЕРГІЛІКТІКҮÐ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'JERGÄ°LÄ°KTÄ°KÃœNATAWI', 'ЖЕРГІЛІКТІКҮÐÐТÐУЫ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'JERGİLİKTİJIL', 'ЖЕРГІЛІКТІЖЫЛ', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'JERGÄ°LÄ°KTÄ°WAQIT', 'ЖЕРГІЛІКТІУÐҚЫТ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'JERGÄ°LÄ°KTÄ°SAÄžAT', 'ЖЕРГІЛІКТІСÐÒ’ÐТ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'BETSANI', 'БЕТСÐÐЫ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'MAQALASANI', 'ÐœÐÒšÐЛÐСÐÐЫ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FAÃLSANI', 'ФÐЙЛСÐÐЫ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'QATISWÅžISANI', 'ÒšÐТЫСУШЫСÐÐЫ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ÖÑDEMESANI', 'TÃœZETWSANI', 'ӨҢДЕМЕСÐÐЫ', 'ТҮЗЕТУСÐÐЫ', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'BETATAWI', 'БЕТÐТÐУЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'BETATAWI2', 'БЕТÐТÐУЫ2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ESÄ°MAYASI', 'ЕСІМÐЯСЫ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESÄ°MAYASI2', 'ЕСІМÐЯСЫ2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'TALQILAWAYASI', 'ТÐЛҚЫЛÐУÐЯСЫ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'TALQILAWAYASI2', 'ТÐЛҚЫЛÐУÐЯСЫ2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'TAQIRIPBETÄ°', 'MAQALABETÄ°', 'ТÐҚЫРЫПБЕТІ', 'ÐœÐÒšÐЛÐБЕТІ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'TAQIRIPBETÄ°2', 'MAQALABETÄ°2', 'ТÐҚЫРЫПБЕТІ2', 'ÐœÐÒšÐЛÐБЕТІ2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'TOLIQBETATAWI', 'ТОЛЫҚБЕТÐТÐУЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'TOLIQBETATAWI2', 'ТОЛЫҚБЕТÐТÐУЫ2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'BETÅžEATAWI', 'ASTIÑĞIBETATAWI', 'БЕТШЕÐТÐУЫ', 'ÐСТЫҢҒЫБЕТÐТÐУЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'BETÅžEATAWI2', 'ASTIÑĞIBETATAWI2', 'БЕТШЕÐТÐУЫ2', 'ÐСТЫҢҒЫБЕТÐТÐУЫ2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NEGÄ°ZGÄ°BETATAWI', 'ÐЕГІЗГІБЕТÐТÐУЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NEGÄ°ZGÄ°BETATAWI2', 'ÐЕГІЗГІБЕТÐТÐУЫ2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'TALQILAWBETATAWI', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'TALQILAWBETATAWI2', 'ТÐЛҚЫЛÐУБЕТÐТÐУЫ2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'TAQIRIPBETATAWI', 'MAQALABETATAWI', 'ТÐҚЫРЫПБЕТÐТÐУЫ', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'TAQIRIPBETATAWI2', 'MAQALABETATAWI2', 'ТÐҚЫРЫПБЕТÐТÐУЫ2', 'ÐœÐÒšÐЛÐБЕТÐТÐУЫ2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'XBR:', 'ХБР:', 'MSG:' ),
+ 'subst' => array( '0', 'BÄDEL:', 'БӘДЕЛ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'WÃKÃSÄ°ZXBR:', 'УИКИСІЗХБР:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'nobaý', 'нобай', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'nobaý=$1', 'нобай=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'oñğa', 'oñ', 'оңға', 'оң', 'right' ),
+ 'img_left' => array( '1', 'solÄŸa', 'sol', 'Ñолға', 'Ñол', 'left' ),
+ 'img_none' => array( '1', 'eşqandaý', 'joq', 'ешқандай', 'жоқ', 'none' ),
+ 'img_width' => array( '1', '$1 nükte', '$1 нүкте', '$1px' ),
+ 'img_center' => array( '1', 'ortağa', 'orta', 'ортаға', 'орта', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'sürmeli', 'Ñүрмелі', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'sürmesiz', 'ÑүрмеÑіз', 'frameless' ),
+ 'img_page' => array( '1', 'bet=$1', 'bet $1', 'бет=$1', 'бет $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'tikti', 'tiktik=$1', 'tiktik $1', 'тікті', 'тіктік=$1', 'тіктік $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'jïekti', 'жиекті', 'border' ),
+ 'img_baseline' => array( '1', 'tirekjol', 'тірекжол', 'baseline' ),
+ 'img_sub' => array( '1', 'astılığı', 'ast', 'аÑтылығы', 'аÑÑ‚', 'sub' ),
+ 'img_super' => array( '1', 'üstiligi', 'üst', 'Ò¯Ñтілігі', 'Ò¯ÑÑ‚', 'super', 'sup' ),
+ 'img_top' => array( '1', 'üstine', 'Ò¯Ñтіне', 'top' ),
+ 'img_text_top' => array( '1', 'mätin-üstinde', 'мәтін-Ò¯Ñтінде', 'text-top' ),
+ 'img_middle' => array( '1', 'aralığına', 'аралығына', 'middle' ),
+ 'img_bottom' => array( '1', 'astına', 'аÑтына', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'mätin-astında', 'мәтін-аÑтында', 'text-bottom' ),
+ 'int' => array( '0', 'İŞKİ:', 'ІШКІ:', 'INT:' ),
+ 'sitename' => array( '1', 'TORAPATAWI', 'ТОРÐПÐТÐУЫ', 'SITENAME' ),
+ 'ns' => array( '0', 'EA:', 'ESÄ°MAYA:', 'ЕÐ:', 'ЕСІМÐЯ:', 'NS:' ),
+ 'localurl' => array( '0', 'JERGÄ°LÄ°KTÄ°JAÃ:', 'ЖЕРГІЛІКТІЖÐЙ:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'JERGÄ°LÄ°KTÄ°JAÃ2:', 'ЖЕРГІЛІКТІЖÐЙ2:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'SERVERATAWI', 'СЕРВЕРÐТÐУЫ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ÄMİRJOLI', 'ӘМІРЖОЛЫ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'SEPTİGİ:', 'SEPTİK:', 'СЕПТІГІ:', 'СЕПТІК:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__TAQIRIPATINTÃœRLENDÄ°RGÄ°ZBEW__', '__TATJOQ__', '__ATAWALMASTIRÄžIZBAW__', '__AABAW__', '__ТÐҚЫРЫПÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ТÐТЖОҚ__', '__ÐТÐУÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐÐБÐУ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__MAÄžLUMATINTÃœRLENDÄ°RGÄ°ZBEW__', '__MATJOQ__', '__MAÄžLUMATALMASTIRÄžIZBAW__', '__MABAW__', '__ÐœÐҒЛҰМÐТЫÐТҮРЛЕÐДІРГІЗБЕУ__', '__ÐœÐТЖОҚ__', '__ÐœÐҒЛҰМÐТÐЛМÐСТЫРҒЫЗБÐУ__', '__ÐœÐБÐУ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'AÄžIMDAÄžIAPTASI', 'AÄžIMDAÄžIAPTA', 'ÐҒЫМДÐҒЫÐПТÐСЫ', 'ÐҒЫМДÐҒЫÐПТÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'AÄžIMDAÄžIAPTAKÃœNÄ°', 'ÐҒЫМДÐҒЫÐПТÐКҮÐІ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'JERGÄ°LÄ°KTÄ°APTASI', 'JERGÄ°LÄ°KTÄ°APTA', 'ЖЕРГІЛІКТІÐПТÐСЫ', 'ЖЕРГІЛІКТІÐПТÐ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'JERGÄ°LÄ°KTÄ°APTAKÃœNÄ°', 'ЖЕРГІЛІКТІÐПТÐКҮÐІ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'TÃœZETWNÖMÄ°RÄ°', 'NUSQANÖMÄ°RÄ°', 'ТҮЗЕТУÐӨМІРІ', 'ÐҰСҚÐÐӨМІРІ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'TÃœZETWKÃœNÄ°', 'NUSQAKÃœNÄ°', 'ТҮЗЕТУКҮÐІ', 'ÐҰСҚÐКҮÐІ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'TÃœZETWKÃœNÄ°2', 'NUSQAKÃœNÄ°2', 'ТҮЗЕТУКҮÐІ2', 'ÐҰСҚÐКҮÐІ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'TÃœZETWAÃI', 'NUSQAAÃI', 'ТҮЗЕТУÐЙЫ', 'ÐҰСҚÐÐЙЫ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'TÃœZETWJILI', 'NUSQAJILI', 'ТҮЗЕТУЖЫЛЫ', 'ÐҰСҚÐЖЫЛЫ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'TÃœZETWWAQITITAÑBASI', 'NUSQAWAQITTÃœÃÄ°NDEMESÄ°', 'ТҮЗЕТУУÐҚЫТЫТÐҢБÐСЫ', 'ÐҰСҚÐУÐҚЫТТҮЙІÐДЕМЕСІ', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'KÖPŞETÜRİ:', 'KÖPŞE:', 'КӨПШЕТҮРІ:', 'КӨПШЕ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'TOLIQJAÃI:', 'TOLIQJAÃ:', 'ТОЛЫҚЖÐЙЫ:', 'ТОЛЫҚЖÐЙ:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'TOLIQJAÃI2:', 'TOLIQJAÃ2:', 'ТОЛЫҚЖÐЙЫ2:', 'ТОЛЫҚЖÐЙ2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'KÄ1:', 'KİŞİÄRÄ°PPEN1:', 'КӘ1:', 'КІШІӘРІППЕÐ1:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'BÄ1:', 'BASÄRÄ°PPEN1:', 'БӘ1:', 'БÐСӘРІППЕÐ1:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KÄ:', 'KİŞİÄRÄ°PPEN:', 'КӘ:', 'КІШІӘРІППЕÐ:', 'LC:' ),
+ 'uc' => array( '0', 'BÄ:', 'BASÄRÄ°PPEN:', 'БӘ:', 'БÐСӘРІППЕÐ:', 'UC:' ),
+ 'raw' => array( '0', 'QAM:', 'ÒšÐÐœ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'KÖRÄ°NETÄ°NTAQIRIAPATI', 'KÖRSETÄ°LETÄ°NATAW', 'КӨРІÐЕТІÐТÐҚЫРЫÐПÐТЫ', 'КӨРСЕТІЛЕТІÐÐТÐУ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Q', 'Òš', 'R' ),
+ 'newsectionlink' => array( '1', '__JAÑABÖLÄ°MSÄ°LTEMESÄ°__', '__ЖÐÒ¢ÐБӨЛІМСІЛТЕМЕСІ__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'BAÄžDARLAMANUSQASI', 'БÐҒДÐРЛÐÐœÐÐҰСҚÐСЫ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'JAÃDIMUQAMDAW:', 'ЖÐЙДЫМҰҚÐМДÐУ:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'JÄKÄ°RDÄ°MUQAMDAW', 'ЖӘКІРДІМҰҚÐМДÐУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'AÄžIMDAÄžIWAQITTÃœÃÄ°NDEMESÄ°', 'AÄžIMDAÄžIWAQITTÃœÃÄ°N', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐДЕМЕСІ', 'ÐҒЫМДÐҒЫУÐҚЫТТҮЙІÐ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'JERGÄ°LÄ°KTÄ°WAQITTÃœÃÄ°NDEMESÄ°', 'JERGÄ°LÄ°KTÄ°WAQITTÃœÃÄ°N', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐДЕМЕСІ', 'ЖЕРГІЛІКТІУÐҚЫТТҮЙІÐ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'BAÄžITBELGÄ°SÄ°', 'БÐҒЫТБЕЛГІСІ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#TİL:', '#ТІЛ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'MAÄžLUMATTÄ°LÄ°', 'ÐœÐҒЛҰМÐТТІЛІ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ESÄ°MAYABETSANI:', 'EABETSANI:', 'AYABETSANI:', 'ЕСІМÐЯБЕТСÐÐЫ:', 'ЕÐБЕТСÐÐЫ:', 'ÐЯБЕТСÐÐЫ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ÄKÄ°MŞİSANI', 'ӘКІМШІСÐÐЫ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'SANPİŞİMÄ°', 'СÐÐПІШІМІ', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'SOLÄžAIÄžIS', 'SOLIÄžIS', 'СОЛҒÐЫҒЫС', 'СОЛЫҒЫС', 'PADLEFT' ),
+ 'padright' => array( '0', 'OÑĞAIÄžIS', 'OÑIÄžIS', 'ОҢҒÐЫҒЫС', 'ОҢЫҒЫС', 'PADRIGHT' ),
+ 'special' => array( '0', 'arnaýı', 'арнайы', 'special' ),
+ 'defaultsort' => array( '1', 'ÄDEPKÄ°SURIPTAW:', 'ÄDEPKÄ°SANATSURIPTAW:', 'ÄDEPKÄ°SURIPTAWKÄ°LTÄ°:', 'ÄDEPKÄ°SURIP:', 'ӘДЕПКІСҰРЫПТÐУ:', 'ӘДЕПКІСÐÐÐТСҰРЫПТÐУ:', 'ӘДЕПКІСҰРЫПТÐУКІЛТІ:', 'ӘДЕПКІСҰРЫП:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'FAÃLMEKENÄ°:', 'ФÐЙЛМЕКЕÐІ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'belgi', 'белгі', 'tag' ),
+ 'hiddencat' => array( '1', '__JASIRINSANAT__', '__ЖÐСЫРЫÐСÐÐÐТ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'SANATTAÄžIBETTER', 'СÐÐÐТТÐҒЫБЕТТЕР', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'BETMÖLŞERİ', 'БЕТМӨЛШЕРІ', 'PAGESIZE' ),
);
$specialPageAliases = array(
@@ -671,14 +671,13 @@ Bunı basqa birew aldaqaşan joýğan mümkin.',
'badtitle' => 'Jaramsız taqırıp atı',
'badtitletext' => 'Suralğan bet taqırıbınıñ atı jaramsız, bos, tilaralıq siltemesi ne wïkï-aralıq taqırıp atı burıs engizilgen.
Mında taqırıp atında qoldalmaýtın birqatar tañbalar bolwı mümkin.',
-'perfcached' => 'Kelesi derek bürkemelengen, sondıqtan tolıqtaý jañalanmağan bolwı mümkin.',
-'perfcachedts' => 'Kelesi derek bürkemelengen, soñğı jañalanlğan kezi: $1.',
+'perfcached' => 'Kelesi derek bürkemelengen, sondıqtan tolıqtaý jañalanmağan bolwı mümkin. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Kelesi derek bürkemelengen, soñğı jañalanlğan kezi: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Bul bettiñ jañartılwı ağımda öşirilgen. Derekteri qazir özgertilmeýdi.',
'wrong_wfQuery_params' => 'wfQuery() fwnkcïyası üşin burıs baptalımdarı bar<br />
Jete: $1<br />
Suranım: $2',
'viewsource' => 'Qaýnar közin qaraw',
-'viewsourcefor' => '$1 degen üşin',
'actionthrottled' => 'Äreket bäseñdetildi',
'actionthrottledtext' => 'Spamğa qarsı küres esebinde, osı äreketti qısqa waqıtta tım köp ret orındawıñız şektelindi, jäne bul şektew şamasınan asıp ketkensiz.
Birneşe mïnöttan qaýta baýqap köriñiz.',
@@ -857,9 +856,6 @@ Añğartpa: [[{{#special:Preferences}}|Paýdalanwşılıq baptalımdarıñızdı
Buğataw nömiriñiz: $5.
Bul nömirdi ärbir suranımıñızdarğa kiristiriñiz.",
'blockednoreason' => 'eÅŸ sebebi keltirilmegen',
-'blockedoriginalsource' => "'''$1''' degenniñ qaýnar közi tömende körsetiledi:",
-'blockededitsource' => "'''$1''' degenge jasalğan '''öñdemeleriñizdiñ''' mätini tömende körsetiledi:",
-'whitelistedittitle' => 'Öñdew üşin kirwiñiz jön.',
'whitelistedittext' => 'Betterdi öñdew üşin $1 jön.',
'confirmedittext' => 'Betterdi öñdew üşin aldın ala E-poşta mekenjaýıñızdı quptawıñız jön.
E-poşta mekenjaýıñızdı [[{{#special:Preferences}}|paýdalanwşılıq baptalımdarıñız]] arqılı qoýıñız da jaramdılığın tekserip şığıñız.',
@@ -1035,22 +1031,11 @@ keltirilgen tüzetw joq, ne ağımdıq tüzetwdi jasırw üşin ärekettenip kö
'revdelete-unsuppress' => 'Qalpına keltirilgen tüzetwlerden tïımdardı alastaw',
'revdelete-log' => 'Sebebi:',
'revdelete-submit' => 'Bölektengen tüzetwge qoldanw',
-'revdelete-logentry' => '[[$1]] degenniñ tüzetw körinisin özgertti',
-'logdelete-logentry' => '[[$1]] degenniñ oqïğa körinisin özgertti',
'revdelete-success' => "'''Tüzetw körinisi sätti qoýıldı.'''",
'logdelete-success' => "'''Jwrnal körinisi sätti qoýıldı.'''",
'revdel-restore' => 'Körinisin özgertw',
'pagehist' => 'Bet tarïxı',
'deletedhist' => 'Joýılğan tarïxı',
-'revdelete-content' => 'maÄŸlumat',
-'revdelete-summary' => 'öñdemeniñ qısqaşa mazmundaması',
-'revdelete-uname' => 'qatıswşı atı',
-'revdelete-restricted' => 'äkimşilerge tïımdar qoldadı',
-'revdelete-unrestricted' => 'äkimşilerden tïımdardı alastadı',
-'revdelete-hid' => '$1 jasırdı',
-'revdelete-unhid' => '$1 aştı',
-'revdelete-log-message' => '$2 tüzetw üşin $1',
-'logdelete-log-message' => '$2 oqïğa üşin $1',
'revdelete-edit-reasonlist' => 'Joyw sebepterin öñdew',
# Suppression log
@@ -1294,7 +1279,6 @@ Eger bunı jetistirwdi tañdasañız, bul tüzetwiñizdiñ awtorlığın anıqta
'right-autopatrol' => 'Öz öñdemelerin zertteldi dep özdiktik belgilew',
'right-patrolmarks' => 'Jwıqtağı özgeristerdegi zerttew belgilerin körw',
'right-unwatchedpages' => 'Baqılanılmağan bet tizimin körw',
-'right-trackback' => 'Añıstawdı jöneltw',
'right-mergehistory' => 'Betterdiñ tarïxın qosıp berw',
'right-userrights' => 'Qatıswşılardıñ barlıq quqıqtarın öñdew',
'right-userrights-interwiki' => 'Basqa üïkïlerdegi qatıswşılardıñ quqıqtarın öñdew',
@@ -1680,10 +1664,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Qatıswşı tabılğan joq.',
# Special:Log/newusers
-'newuserlogpage' => 'Tirkelw jwrnalı',
-'newuserlogpagetext' => 'Bul qatıswşı tirkelgi jasaw jwrnalı',
-'newuserlog-create-entry' => 'Jaña qatıswşı',
-'newuserlog-create2-entry' => 'jaña tirkelgi jasadı — $1',
+'newuserlogpage' => 'Tirkelw jwrnalı',
+'newuserlogpagetext' => 'Bul qatıswşı tirkelgi jasaw jwrnalı',
# Special:ListGroupRights
'listgrouprights' => 'Qatıswşı tobı quqıqtarı',
@@ -1796,8 +1778,6 @@ Osını istew nïetiñizdi, saldarın baýımdawıñızdı jäne [[{{{{ns:mediaw
'actioncomplete' => 'Äreket bitti',
'deletedtext' => '«$1» joýıldı.
Jwıqtağı joywlar twralı jazbaların $2 degennen qarañız.',
-'deletedarticle' => '«[[$1]]» degendi joýdı',
-'suppressedarticle' => '«[[$1]]» degendi şettetti',
'dellogpage' => 'Joyw_jwrnalı',
'dellogpagetext' => 'Tömende jwıqtağı joywlardıñ tizimi berilgen.',
'deletionlog' => 'joyw jwrnalı',
@@ -1912,7 +1892,6 @@ Siltemeñiz jaramsız, ne tüzetw qalpına keltirilgen, nemese murağattan alast
'undeletelink' => 'qalpına keltirw',
'undeletereset' => 'Qaýta qoý',
'undeletecomment' => 'Mändemesi:',
-'undeletedarticle' => '«[[$1]]» qalpına keltirildi',
'undeletedrevisions' => '$1 tüzetw qalpına keltirildi',
'undeletedrevisions-files' => '$1 tüzetw jäne $2 faýl qalpına keltirildi',
'undeletedfiles' => '$1 faýl qalpına keltirildi',
@@ -2126,8 +2105,6 @@ Bunı qolmen qosıñız.'''",
'movepage-page-moved' => '$1 degen bet $2 degenge jıljıtıldı.',
'movepage-page-unmoved' => '$1 degen bet $2 degenge jıljıtılmaýdı.',
'movepage-max-pages' => 'Barınşa $1 bet jıljıtıldı da mınnan köbi özdiktik jıljıltılmaýdı.',
-'1movedto2' => '[[$1]] degendi [[$2]] degenge jıljıttı',
-'1movedto2_redir' => '[[$1]] degendi [[$2]] degen aýdağış üstine jıljıttı',
'movelogpage' => 'Jıljıtw jwrnalı',
'movelogpagetext' => 'Tömende jıljıtılğan betterdiñ tizimi berilip tur.',
'movereason' => 'Sebebi:',
@@ -2346,9 +2323,6 @@ Bunıñ sebebi şettik torap siltemesinen bolwı mümkin.',
# Patrol log
'patrol-log-page' => 'Zerttew jwrnalı',
-'patrol-log-line' => '$2 degenniñ $1 tüzetwin zertteldi dep belgiledi $3',
-'patrol-log-auto' => '(özdiktik)',
-'patrol-log-diff' => 'nömir $1',
# Image deletion
'deletedrevision' => 'Eski tüzetwin joýdı: $1',
@@ -2373,7 +2347,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 bet',
'file-info' => 'Faýl mölşeri: $1, MIME türi: $2',
'file-info-size' => '$1 × $2 nükte, faýl mölşeri: $3, MIME türi: $4',
-'file-nohires' => '<small>Joğarı ajıratılımdığı jetimsiz.</small>',
+'file-nohires' => 'Joğarı ajıratılımdığı jetimsiz.',
'svg-long-desc' => 'SVG faýlı, kesimdi $1 × $2 nükte, faýl mölşeri: $3',
'show-big-image' => 'Joğarı ajıratılımdı',
@@ -2389,8 +2363,8 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'minutes-abbrev' => 'mïn',
-'hours-abbrev' => 'saÄŸ',
+'minutes-abbrev' => '$1mïn',
+'hours-abbrev' => '$1saÄŸ',
# Bad image list
'bad_image_list' => 'Pişimi tömendegideý:
@@ -2722,13 +2696,6 @@ Quptaw kodı merzimi bitetin kezi: $4.',
'scarytranscludefailed' => '[$1 üşin ülgi keltirwi sätsiz bitti; ğafw etiñiz]',
'scarytranscludetoolong' => '[URL tım uzın; ğafw etiñiz]',
-# Trackbacks
-'trackbackbox' => 'Bul bettiñ añıstawları:<br />
-$1',
-'trackbackremove' => '([$1 Joyw])',
-'trackbacklink' => 'Añıstaw',
-'trackbackdeleteok' => 'Añıstaw sätti joýıldı.',
-
# Delete conflict
'deletedwhileediting' => 'Qulaqtandırw: Bul betti öñdewiñizdi bastağanda, osı bet joýıldı!',
'confirmrecreate' => "Bul betti öñdewiñizdi bastağanda [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|talqılawı]]) osı betti joýdı, keltirgen sebebi:
@@ -2907,4 +2874,8 @@ Swretter tolıq ajıratılımdığımen körsetiledi, basqa faýl türlerine qat
'specialpages-group-redirects' => 'Aýdaýtın arnaýı better',
'specialpages-group-spam' => 'Spam quraldarı',
+# New logging system
+'revdelete-restricted' => 'äkimşilerge tïımdar qoldadı',
+'revdelete-unrestricted' => 'äkimşilerden tïımdardı alastadı',
+
);
diff --git a/languages/messages/MessagesKk_tr.php b/languages/messages/MessagesKk_tr.php
index 41d530a3..05627f90 100644
--- a/languages/messages/MessagesKk_tr.php
+++ b/languages/messages/MessagesKk_tr.php
@@ -10,4 +10,4 @@
*/
# Inherit everything for now
-$fallback = 'kk-latn';
+$fallback = 'kk-latn, kk-cyrl';
diff --git a/languages/messages/MessagesKl.php b/languages/messages/MessagesKl.php
index 1db9a86e..bb90decd 100644
--- a/languages/messages/MessagesKl.php
+++ b/languages/messages/MessagesKl.php
@@ -10,6 +10,7 @@
* @author Aputtu
* @author Iketsi
* @author Kaare
+ * @author Kaniina (on kl.wikipedia.org)
* @author Qaqqalik
* @author לערי ריינה×רט
*/
@@ -415,9 +416,6 @@ Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].'
# Special:LinkSearch
'linksearch-ok' => 'Ujaruk',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Atuisoq nutaaq',
-
# Watchlist
'watchlist' => 'Ersersimasut',
'mywatchlist' => 'Nuisatiffikka',
@@ -436,7 +434,6 @@ Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].'
'delete-confirm' => 'Peeruk "$1"',
'actioncomplete' => 'Naammassivoq',
'deletedtext' => '"$1" peerpoq. Takukkit $2 peerneqarsimasut kingulliit.',
-'deletedarticle' => 'peerpaa "[[$1]]"',
# Rollback
'revertpage' => 'Inisseqqiineq [[User:$1|$1]]-meersoq, peerneqarpoq [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])-meersoq',
@@ -447,7 +444,6 @@ Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].'
# Undelete
'undeletebtn' => 'Inisseqqiguk',
-'undeletedarticle' => 'inisseqqippaa "[[$1]]"',
'undelete-search-submit' => 'Ujarlerit',
# Namespace form on various pages
@@ -487,13 +483,11 @@ Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].'
'blocklogentry' => 'asserpaa [[$1]] $2-mik sivissusilimmik $3',
# Move page
-'movearticle' => 'Qupperneq nuuguk',
-'move-watch' => 'Qupperneq ersersimatiguk',
-'movepagebtn' => 'Qupperneq nuuguk',
-'pagemovedsub' => 'Nuunnera iluatsippoq',
-'movepage-moved' => 'Qupperneq \'\'\'"$1" uunga nuuppoq "$2"\'\'\'',
-'1movedto2' => '[[$1]] nuuppaa [[$2]]-mut',
-'1movedto2_redir' => '[[$1]] nuunneqarsimavoq [[$2]]-mut adresse-ia aqqutigalugu allanngortillugu',
+'movearticle' => 'Qupperneq nuuguk',
+'move-watch' => 'Qupperneq ersersimatiguk',
+'movepagebtn' => 'Qupperneq nuuguk',
+'pagemovedsub' => 'Nuunnera iluatsippoq',
+'movepage-moved' => 'Qupperneq \'\'\'"$1" uunga nuuppoq "$2"\'\'\'',
# Namespace 8 related
'allmessages-language' => 'Oqaatsit:',
@@ -537,9 +531,6 @@ Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].'
# Attribution
'lastmodifiedatby' => 'Una qupperneq kingullermik allanngortinneqarsimavoq $2, $1 $3-mit.',
-# Patrol log
-'patrol-log-line' => 'nalunaaqqutserpaa $1 $2 misissorneqarsimasutut $3',
-
# Browsing diffs
'previousdiff' => '↠Assigiinngissut siulia',
'nextdiff' => 'Assigiinngissut tullia →',
diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php
index f59d4487..49492908 100644
--- a/languages/messages/MessagesKm.php
+++ b/languages/messages/MessagesKm.php
@@ -189,76 +189,76 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#បញ្ជូនបន្áž', '#ប្ដូរទីážáž¶áŸ†áž„ទៅ', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ', '#ប្ដូរទីážáž¶áŸ†áž„', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„', '#ប្ដូរចំណងជើង', '#REDIRECT' ),
- 'notoc' => array( '0', '__លាក់មាážáž·áž€áž¶__', '__លាក់បញ្ជីអážáŸ’ážáž”áž‘__', '__គ្មានមាážáž·áž€áž¶__', '__គ្មានបញ្ជីអážáŸ’ážáž”áž‘__', '__កុំបង្ហាញមាážáž·áž€áž¶__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__លាក់វិចិážáŸ’រសាល__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__បង្ážáŸ†áž˜áž¶ážáž·áž€áž¶__', '__បង្ážáŸ†áž”ញ្ជីអážáŸ’ážáž”áž‘__', '__បង្ážáŸ†áž¢áŸ„យបង្ហាញមាážáž·áž€áž¶__', '__FORCETOC__' ),
- 'toc' => array( '0', '__មាážáž·áž€áž¶__', '__បញ្ជីអážáŸ’ážáž”áž‘__', '__TOC__' ),
- 'noeditsection' => array( '0', '__ផ្នែកមិនážáŸ’រូវកែប្រែ__', '__មិនមានផ្នែកកែប្រែ__', '__លាក់ផ្នែកកែប្រែ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__លាក់បឋមកážáž¶__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ážáŸ‚áž“áŸáŸ‡', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ឈ្មោះážáŸ‚áž“áŸáŸ‡', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'ážáŸ’ងៃនáŸáŸ‡', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'ឈ្មោះážáŸ’ងៃនáŸáŸ‡', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ឆ្នាំនáŸáŸ‡', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'áž–áŸáž›áž“áŸáŸ‡', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ម៉ោងនáŸáŸ‡', 'ម៉ោងឥឡូវ', 'CURRENTHOUR' ),
- 'localyear' => array( '1', 'LOCALDAYNAME', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'áž–áŸáž›ážœáŸáž›áž¶áž€áŸ’នុងážáŸ†áž”ន់', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ម៉ោងážáŸ†áž”ន់', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ចំនួនទំពáŸážš', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ចំនួនអážáŸ’ážáž”áž‘', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ចំនួនឯកសារ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ចំនួនអ្នកប្រើប្រាស់', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'ចំនួនកំណែប្រែ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'ឈ្មោះទំពáŸážš', 'PAGENAME' ),
- 'namespace' => array( '1', 'លំហឈ្មោះ', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'លំហឈ្មោះទំពáŸážšáž–ិភាក្សា', 'TALKSPACE' ),
- 'fullpagename' => array( '1', 'ឈ្មោះទំពáŸážšáž–áŸáž‰', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'ឈ្មោះទំពáŸážšážšáž„', 'SUBPAGENAME' ),
- 'talkpagename' => array( '1', 'ឈ្មោះទំពáŸážšáž–ិភាក្សា', 'TALKPAGENAME' ),
- 'msg' => array( '0', 'សារ:', 'MSG:' ),
- 'msgnw' => array( '0', 'សារមិនមែនជាកូដវិគី:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'រូបភាពážáž¼áž…', 'រូបážáž¼áž…', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'រូបភាពážáž¼áž…=$1', 'រូបážáž¼áž…=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'ស្ážáž¶áŸ†', 'ážáž¶áž„ស្ážáž¶áŸ†', 'right' ),
- 'img_left' => array( '1', 'ធ្វáŸáž„', 'ážáž¶áž„ធ្វáŸáž„', 'left' ),
- 'img_none' => array( '1', 'áž‘áž‘áŸ', 'គ្មាន', 'none' ),
- 'img_width' => array( '1', '$1ភីកសែល', '$1ភស', '$1px' ),
- 'img_center' => array( '1', 'កណ្ážáž¶áž›', 'center', 'centre' ),
- 'img_framed' => array( '1', 'ស៊ុម', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'គ្មានស៊ុម', 'frameless' ),
- 'img_page' => array( '1', 'ទំពáŸážš=$1', 'ទំពáŸážš$1', 'page=$1', 'page $1' ),
- 'img_top' => array( '1', 'ផ្នែកលើ', 'ផ្នែកážáž¶áž„លើ', 'top' ),
- 'img_text_top' => array( '1', 'ឃ្លានៅផ្នែកážáž¶áž„លើ', 'ឃ្លាផ្នែកážáž¶áž„លើ', 'text-top' ),
- 'img_middle' => array( '1', 'ផ្នែកកណ្ážáž¶áž›', 'middle' ),
- 'img_bottom' => array( '1', 'បាáž', 'ផ្នែកបាáž', 'bottom' ),
- 'img_text_bottom' => array( '1', 'ឃ្លានៅផ្នែកបាáž', 'ឃ្លាផ្នែកបាáž', 'text-bottom' ),
- 'img_link' => array( '1', 'ážáŸ†áž“ភ្ជាប់=$1', 'ážáŸ†ážŽáž—្ជាប់=$1', 'link=$1' ),
- 'sitename' => array( '1', 'ឈ្មោះវិបសាយ', 'ឈ្មោះគáŸáž áž‘ំពáŸážš', 'SITENAME' ),
- 'ns' => array( '0', 'លឈ:', 'NS:' ),
- 'server' => array( '0', 'ម៉ាស៊ីនបម្រើសáŸážœáž¶', 'SERVER' ),
- 'servername' => array( '0', 'ឈ្មោះម៉ាស៊ីនបម្រើសáŸážœáž¶', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ផ្លូវស្រ្គីប', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ážœáŸáž™áŸ’យាករណáŸ:', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'សប្ដាហáŸáž“áŸáŸ‡', 'CURRENTWEEK' ),
- 'plural' => array( '0', 'ពហុវចនៈ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URLáž–áŸáž‰:', 'FULLURL:' ),
- 'displaytitle' => array( '1', 'បង្ហាញចំណងជើង', 'បង្ហាញចំនងជើង', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'ážš', 'R' ),
- 'newsectionlink' => array( '1', '__ážáŸ†áž“ភ្ជាប់ផ្នែកážáŸ’មី__', '__ážáŸ†ážŽáž—្ជាប់ផ្នែកážáŸ’មី__', '__NEWSECTIONLINK__' ),
- 'language' => array( '0', '#ភាសា:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'កូដភាសា', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'numberofadmins' => array( '1', 'ចំនួនអ្នកអភិបាល', 'ចំនួនអ្នកážáŸ‚ទាំប្រពáŸáž“្ធ', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'ពិសáŸážŸ', 'special' ),
- 'filepath' => array( '0', 'ផ្លូវនៃឯកសារ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'ប្លាក', 'tag' ),
- 'hiddencat' => array( '1', '__ចំណាážáŸ‹ážáŸ’នាក់ក្រុមមិនបានបង្ហាញ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'ចំនួនទំពáŸážšáž€áŸ’នុងចំនាážáŸ‹ážáŸ’នាក់ក្រុម', 'ចំនួនទំពáŸážšáž€áŸ’នុងចំណាážáŸ‹ážáŸ’នាក់ក្រុម', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ទំហំទំពáŸážš', 'PAGESIZE' ),
- 'index' => array( '1', '__លិបិក្រម__', '__INDEX__' ),
- 'noindex' => array( '1', '__មិនមានលិបិក្រម__', '__NOINDEX__' ),
- 'staticredirect' => array( '1', '__ស្ážáž·ážáž·áž‘ំពáŸážšáž”ញ្ជូនបន្áž__', '__STATICREDIRECT__' ),
+ 'redirect' => array( '0', '#បញ្ជូនបន្áž', '#ប្ដូរទីážáž¶áŸ†áž„ទៅ', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ', '#ប្ដូរទីážáž¶áŸ†áž„', '#ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„', '#ប្ដូរចំណងជើង', '#REDIRECT' ),
+ 'notoc' => array( '0', '__លាក់មាážáž·áž€áž¶__', '__លាក់បញ្ជីអážáŸ’ážáž”áž‘__', '__គ្មានមាážáž·áž€áž¶__', '__គ្មានបញ្ជីអážáŸ’ážáž”áž‘__', '__កុំបង្ហាញមាážáž·áž€áž¶__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__លាក់វិចិážáŸ’រសាល__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__បង្ážáŸ†áž˜áž¶ážáž·áž€áž¶__', '__បង្ážáŸ†áž”ញ្ជីអážáŸ’ážáž”áž‘__', '__បង្ážáŸ†áž¢áŸ„យបង្ហាញមាážáž·áž€áž¶__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__មាážáž·áž€áž¶__', '__បញ្ជីអážáŸ’ážáž”áž‘__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ផ្នែកមិនážáŸ’រូវកែប្រែ__', '__មិនមានផ្នែកកែប្រែ__', '__លាក់ផ្នែកកែប្រែ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__លាក់បឋមកážáž¶__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ážáŸ‚áž“áŸáŸ‡', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ឈ្មោះážáŸ‚áž“áŸáŸ‡', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'ážáŸ’ងៃនáŸáŸ‡', 'CURRENTDAY' ),
+ 'currentdayname' => array( '1', 'ឈ្មោះážáŸ’ងៃនáŸáŸ‡', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ឆ្នាំនáŸáŸ‡', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'áž–áŸáž›áž“áŸáŸ‡', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ម៉ោងនáŸáŸ‡', 'ម៉ោងឥឡូវ', 'CURRENTHOUR' ),
+ 'localyear' => array( '1', 'LOCALDAYNAME', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'áž–áŸáž›ážœáŸáž›áž¶áž€áŸ’នុងážáŸ†áž”ន់', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ម៉ោងážáŸ†áž”ន់', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ចំនួនទំពáŸážš', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ចំនួនអážáŸ’ážáž”áž‘', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ចំនួនឯកសារ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ចំនួនអ្នកប្រើប្រាស់', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ចំនួនកំណែប្រែ', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'ឈ្មោះទំពáŸážš', 'PAGENAME' ),
+ 'namespace' => array( '1', 'លំហឈ្មោះ', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'លំហឈ្មោះទំពáŸážšáž–ិភាក្សា', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'ឈ្មោះទំពáŸážšáž–áŸáž‰', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'ឈ្មោះទំពáŸážšážšáž„', 'SUBPAGENAME' ),
+ 'talkpagename' => array( '1', 'ឈ្មោះទំពáŸážšáž–ិភាក្សា', 'TALKPAGENAME' ),
+ 'msg' => array( '0', 'សារ:', 'MSG:' ),
+ 'msgnw' => array( '0', 'សារមិនមែនជាកូដវិគី:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'រូបភាពážáž¼áž…', 'រូបážáž¼áž…', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'រូបភាពážáž¼áž…=$1', 'រូបážáž¼áž…=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'ស្ážáž¶áŸ†', 'ážáž¶áž„ស្ážáž¶áŸ†', 'right' ),
+ 'img_left' => array( '1', 'ធ្វáŸáž„', 'ážáž¶áž„ធ្វáŸáž„', 'left' ),
+ 'img_none' => array( '1', 'áž‘áž‘áŸ', 'គ្មាន', 'none' ),
+ 'img_width' => array( '1', '$1ភីកសែល', '$1ភស', '$1px' ),
+ 'img_center' => array( '1', 'កណ្ážáž¶áž›', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'ស៊ុម', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'គ្មានស៊ុម', 'frameless' ),
+ 'img_page' => array( '1', 'ទំពáŸážš=$1', 'ទំពáŸážš$1', 'page=$1', 'page $1' ),
+ 'img_top' => array( '1', 'ផ្នែកលើ', 'ផ្នែកážáž¶áž„លើ', 'top' ),
+ 'img_text_top' => array( '1', 'ឃ្លានៅផ្នែកážáž¶áž„លើ', 'ឃ្លាផ្នែកážáž¶áž„លើ', 'text-top' ),
+ 'img_middle' => array( '1', 'ផ្នែកកណ្ážáž¶áž›', 'middle' ),
+ 'img_bottom' => array( '1', 'បាáž', 'ផ្នែកបាáž', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'ឃ្លានៅផ្នែកបាáž', 'ឃ្លាផ្នែកបាáž', 'text-bottom' ),
+ 'img_link' => array( '1', 'ážáŸ†áž“ភ្ជាប់=$1', 'ážáŸ†ážŽáž—្ជាប់=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'ឈ្មោះវិបសាយ', 'ឈ្មោះគáŸáž áž‘ំពáŸážš', 'SITENAME' ),
+ 'ns' => array( '0', 'លឈ:', 'NS:' ),
+ 'server' => array( '0', 'ម៉ាស៊ីនបម្រើសáŸážœáž¶', 'SERVER' ),
+ 'servername' => array( '0', 'ឈ្មោះម៉ាស៊ីនបម្រើសáŸážœáž¶', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ផ្លូវស្រ្គីប', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ážœáŸáž™áŸ’យាករណáŸ:', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'សប្ដាហáŸáž“áŸáŸ‡', 'CURRENTWEEK' ),
+ 'plural' => array( '0', 'ពហុវចនៈ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLáž–áŸáž‰:', 'FULLURL:' ),
+ 'displaytitle' => array( '1', 'បង្ហាញចំណងជើង', 'បង្ហាញចំនងជើង', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'ážš', 'R' ),
+ 'newsectionlink' => array( '1', '__ážáŸ†áž“ភ្ជាប់ផ្នែកážáŸ’មី__', '__ážáŸ†ážŽáž—្ជាប់ផ្នែកážáŸ’មី__', '__NEWSECTIONLINK__' ),
+ 'language' => array( '0', '#ភាសា:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'កូដភាសា', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'numberofadmins' => array( '1', 'ចំនួនអ្នកអភិបាល', 'ចំនួនអ្នកážáŸ‚ទាំប្រពáŸáž“្ធ', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'ពិសáŸážŸ', 'special' ),
+ 'filepath' => array( '0', 'ផ្លូវនៃឯកសារ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'ប្លាក', 'tag' ),
+ 'hiddencat' => array( '1', '__ចំណាážáŸ‹ážáŸ’នាក់ក្រុមមិនបានបង្ហាញ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'ចំនួនទំពáŸážšáž€áŸ’នុងចំនាážáŸ‹ážáŸ’នាក់ក្រុម', 'ចំនួនទំពáŸážšáž€áŸ’នុងចំណាážáŸ‹ážáŸ’នាក់ក្រុម', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ទំហំទំពáŸážš', 'PAGESIZE' ),
+ 'index' => array( '1', '__លិបិក្រម__', '__INDEX__' ),
+ 'noindex' => array( '1', '__មិនមានលិបិក្រម__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '__ស្ážáž·ážáž·áž‘ំពáŸážšáž”ញ្ជូនបន្áž__', '__STATICREDIRECT__' ),
);
$messages = array(
@@ -610,10 +610,11 @@ $1',
'cannotdelete' => 'មិនអាច​លុបចោលទំពáŸážšáž¬áž¯áž€ážŸáž¶ážšážŠáŸ‚លមានឈ្មោះ "$1"បានទáŸáŸ”
វាប្រហែលជាážáŸ’រូវបាន​នរណាម្នាក់ផ្សáŸáž„ទៀážáž›áž»áž”ចោលហើយ។',
+'cannotdelete-title' => 'មិនអាចលុបទំពáŸážš "$1"',
'badtitle' => 'ចំណងជើង​មិនល្អ',
'badtitletext' => 'ចំណងជើងទំពáŸážšážŠáŸ‚លបានស្នើ គ្មានសុពលភាព, áž‘áž‘áŸ, ឬ ចំណងជើងážáŸ†ážŽáž—្ជាប់អន្ážážšáž—ាសាឬអន្ážážšážœáž·áž‚ី មិនážáŸ’រឹមážáŸ’រូវ ។ ប្រហែលជាមានážáž½áž¢áž€áŸ’សរមួយឬច្រើន ដែលជាážáž½áž¢áž€áŸ’សរហាមប្រើ​ក្នុង​ចំណងជើង។',
-'perfcached' => 'ទិន្ននáŸáž™áž‘ាំងនáŸáŸ‡ážáŸ’រូវបានដាក់ទៅសážáž·áž—្ជាប់និងប្រហែលជាមិនទាន់សមáŸáž™ ។',
-'perfcachedts' => 'ទិន្ននáŸáž™ážáž¶áž„ក្រោមនáŸáŸ‡ážáŸ’រូវបានដាក់ក្នុងសážáž·áž—្ជាប់ áž“áž·áž„ បានážáŸ’រូវបន្ទាន់សមáŸáž™áž…ុងក្រោយនៅ $1។',
+'perfcached' => 'ទិន្ននáŸáž™áž‘ាំងនáŸáŸ‡ážáŸ’រូវបានដាក់ទៅសážáž·áž—្ជាប់និងប្រហែលជាមិនទាន់សមáŸáž™ ។ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ទិន្ននáŸáž™ážáž¶áž„ក្រោមនáŸáŸ‡ážáŸ’រូវបានដាក់ក្នុងសážáž·áž—្ជាប់ áž“áž·áž„ បានážáŸ’រូវបន្ទាន់សមáŸáž™áž…ុងក្រោយនៅ $1។ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'ការបន្ទាន់សមáŸáž™ážŸáž˜áŸ’រាប់ទំពáŸážšáž“áŸáŸ‡áž‚ឺមិនអាចធ្វើទៅរួចទáŸáž“ាពáŸáž›áž¥áž¡áž¼ážœáž‘áŸáŸ”
ទិន្ននáŸáž™áž“ៅទីនáŸáŸ‡áž“ឹងមិនážáŸ’រូវផ្លាស់ប្ដូរážáŸ’មីនាពáŸáž›áž”ច្ចុប្បន្នទáŸáŸ”',
@@ -621,13 +622,14 @@ $1',
មុážáž„ារ​៖ $1<br />
អង្កáŸážâ€‹áŸ– $2',
'viewsource' => 'មើល​កូដ',
-'viewsourcefor' => 'សម្រាប់ $1',
+'viewsource-title' => 'មើលកូដរបស់ $1',
'actionthrottled' => 'សកម្មភាពážáŸ’រូវបានកម្រិáž',
'actionthrottledtext' => 'ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកážáŸ’រូវបាន​គáŸáž€áŸ†áž áž·ážáž˜áž·áž“ឱ្យ​ធ្វើសកម្មភាពនáŸáŸ‡â€‹áž…្រើនដងពáŸáž€áž‘áŸâ€‹áž€áŸ’នុងរយៈពáŸáž›ážáŸ’លីមួយ។
សូមព្យាយាមម្ដងទៀážáž€áŸ’នុងរយៈពáŸáž›áž”៉ុន្មាននាទីទៀážáŸ”',
'protectedpagetext' => 'ទំពáŸážšáž“áŸáŸ‡áž”ានážáŸ’រូវចាក់សោមិនឱ្យកែប្រែ​។',
'viewsourcetext' => 'អ្នកអាចមើលនិងចម្លងកូដរបស់ទំពáŸážšáž“áŸáŸ‡áŸ–',
+'viewyourtext' => "អ្នកអាចមើលនិងចម្លងកូដរបស់'''ការកែប្រែរបស់អ្នក'''ទៅកាន់ទំពáŸážšáž“áŸáŸ‡áŸ–",
'protectedinterface' => 'ទំពáŸážšáž“áŸáŸ‡ ផ្ដល់នូវ អážáŸ’ážáž”ទអន្ážážšáž˜áž»áž សម្រាប់ផ្នែកទន់, áž“áž·áž„ បានážáŸ’រូវចាក់សោ ដើម្បីចៀសវាង ការបំពាន ។',
'editinginterface' => "'''ប្រយáŸážáŸ’ន៖''' អ្នកកំពុងážáŸ‚កែប្រែទំពáŸážšážŠáŸ‚លបានប្រើប្រាស់​ដើម្បីផ្ដល់នូវអន្ážážšáž˜áž»ážážŸáž˜áŸ’រាប់ផ្នែកទន់​។ បំលាស់ប្ដូរចំពោះទំពáŸážšáž“áŸáŸ‡â€‹áž“ឹងប៉ះពាល់ដល់ទំពáŸážšáž¢áž“្ážážšáž˜áž»ážáž“ៃអ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិបសាយនáŸáŸ‡áŸ” សម្រាប់ការបកប្រែ សូមពិចារណាប្រើប្រាស់ [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] (áž”áŸážáž¶ážœáž·áž‚ី) គម្រោង​អន្ážážšáž‡áž¶ážáž¼áž”នីយកម្ម​នៃមáŸážŒáž¶ážœáž·áž‚ី ។",
'sqlhidden' => '(ការអង្កáŸáž SQL ážáŸ’រូវបិទបាំង)',
@@ -748,6 +750,7 @@ $2',
'invalidemailaddress' => 'អាសយដ្ឋានអ៊ីមែល​នáŸáŸ‡áž˜áž·áž“អាចទទួលយកបានទáŸâ€‹ážŠáŸ„យសារវាមានទម្រង់​​មិនážáŸ’រឹមážáŸ’រូវ។
សូមបញ្ចូល​អាសយដ្ឋានមួយ​ដែលមាន​ទម្រង់​ážáŸ’រឹមážáŸ’រូវ ឬមួយកáŸáž‘ុកវាលនោះឱ្យនៅទំនáŸážšâ€‹â€‹áŸ”',
+'cannotchangeemail' => 'អាសយដ្ឋានអ៊ីមែលរបស់គណនីមិនអាចប្ដូរបានទáŸáž“ៅលើវិគីនáŸáŸ‡áŸ”',
'accountcreated' => 'គណនីរបស់លោកអ្នកážáŸ’រូវបានបង្កើážáž áž¾áž™',
'accountcreatedtext' => 'គណនីឈ្មោះ $1 ážáŸ’រូវបានបង្កើážáž áž¾áž™áŸ”',
'createaccount-title' => 'ការបង្កើážáž‚ណនីសម្រាប់{{SITENAME}}',
@@ -765,6 +768,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន០mail() របស់ PHP',
+'user-mail-no-addy' => 'បានព្យាយាមផ្ញើអ៊ីមែលដោយមិនបានដាក់អាសដ្ឋានអ៊ីមែល។',
# Change password dialog
'resetpass' => '​ប្ážáž¼ážšâ€‹áž–ាក្យសំងាážáŸ‹â€‹',
@@ -788,18 +792,33 @@ $2',
'resetpass-temp-password' => 'ពាក្យសំងាážáŸ‹áž”ណ្ážáŸ„ះអាសន្ន:',
# Special:PasswordReset
-'passwordreset' => 'កំណážáŸ‹â€‹áž–ាក្យសំងាážáŸ‹â€‹ážŸáž¶áž¡áž¾áž„វិញ',
-'passwordreset-text' => 'បំពáŸáž‰ážŸáŸ†ážŽáž»áŸ†áž”ែបបទនáŸáŸ‡ážŠáž¾áž˜áŸ’បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីពáŸážáŸŒáž˜áž¶áž“លំអិážážšáž”ស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'ប្ដូរទៅពាក្យសំងាážáŸ‹ážŠáž¾áž˜',
-'passwordreset-disabled' => 'មុážáž„ារប្ដូរទៅពាក្យសំងាážáŸ‹ážŠáž¾áž˜ážáŸ’រូវបានបិទមិនអោយប្រើនៅលើវិគីនáŸáŸ‡áŸ”',
-'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្ននáŸáž™ážáž¶áž„ក្រោម}}',
-'passwordreset-username' => 'អážáŸ’ážáž“ាម៖',
-'passwordreset-domain' => 'ដូម៉ែន៖',
-'passwordreset-email' => 'អាសយដ្ឋានអ៊ីមែល៖',
-'passwordreset-emailtitle' => 'áž–áŸážáŸŒáž˜áž¶áž“លំអិážáž–ីគណនីនៅលើ {{SITENAME}}',
-'passwordreset-emailelement' => 'ឈ្មោះអ្នកប្រើប្រាស់៖ $1
+'passwordreset' => 'កំណážáŸ‹â€‹áž–ាក្យសំងាážáŸ‹â€‹ážŸáž¶áž¡áž¾áž„វិញ',
+'passwordreset-text' => 'បំពáŸáž‰ážŸáŸ†ážŽáž»áŸ†áž”ែបបទនáŸáŸ‡ážŠáž¾áž˜áŸ’បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីពáŸážáŸŒáž˜áž¶áž“លំអិážážšáž”ស់គណនីរបស់អ្នក។',
+'passwordreset-legend' => 'ប្ដូរទៅពាក្យសំងាážáŸ‹ážŠáž¾áž˜',
+'passwordreset-disabled' => 'មុážáž„ារប្ដូរទៅពាក្យសំងាážáŸ‹ážŠáž¾áž˜ážáŸ’រូវបានបិទមិនអោយប្រើនៅលើវិគីនáŸáŸ‡áŸ”',
+'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្ននáŸáž™ážáž¶áž„ក្រោម}}',
+'passwordreset-username' => 'អážáŸ’ážáž“ាម៖',
+'passwordreset-domain' => 'ដូម៉ែន៖',
+'passwordreset-capture' => 'មើលអ៊ីមែលលទ្ធផល?',
+'passwordreset-capture-help' => 'ប្រសិនបើអ្នកគូសធីកប្រអប់នáŸáŸ‡ អ៊ីមែល (ដែលមានពាក្យសំងាážáŸ‹áž”ណ្ដោះអាសន្ន) មិនážáŸ’រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងážáŸ’រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
+'passwordreset-email' => 'អាសយដ្ឋានអ៊ីមែល៖',
+'passwordreset-emailtitle' => 'áž–áŸážáŸŒáž˜áž¶áž“លំអិážáž–ីគណនីនៅលើ {{SITENAME}}',
+'passwordreset-emailelement' => 'ឈ្មោះអ្នកប្រើប្រាស់៖ $1
áž›áŸážážŸáž˜áŸ’ងាážáŸ‹áž”ណ្ដោះអាសន្ន៖ $2',
-'passwordreset-emailsent' => 'អីុមែលរំលឹកមួយបានផ្ញើទៅហើយ។',
+'passwordreset-emailsent' => 'អីុមែលរំលឹកមួយបានផ្ញើទៅហើយ។',
+'passwordreset-emailsent-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញážáž¶áž„ក្រោមážáŸ’រូវបានផ្ញើទៅហើយ។',
+'passwordreset-emailerror-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញážáž¶áž„ក្រោមážáŸ’រូវបានបង្កើážáž áž¾áž™ ប៉ុន្ážáŸ‚ការផ្ញើទៅកាន់អ្នកប្រើប្រាស់មិនបានសំរáŸáž…áž‘áŸáŸ– $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
+'changeemail-header' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលសំរាប់គណនីនáŸáŸ‡',
+'changeemail-text' => 'សូមបំពáŸáž‰ážŸáŸ†áž“ុំបែបបទនáŸáŸ‡ážŠáž¾áž˜áŸ’បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលរបស់អ្នក។ អ្នកនឹងážáŸ’រូវបញ្ចូលពាក្យសំងាážáŸ‹ážŠáž¾áž˜áŸ’បីអះអាងលើការផ្លាស់ប្ដូរនáŸáŸ‡áŸ”',
+'changeemail-no-info' => 'អ្នក​ចាំបាច់​ážáŸ’រូវážáŸ‚​កážáŸ‹ážˆáŸ’មោះចូល ដើម្បី​ចូលទៅកាន់​ទំពáŸážšâ€‹áž“áŸáŸ‡â€‹ážŠáŸ„យផ្ទាល់​។',
+'changeemail-oldemail' => 'អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖',
+'changeemail-newemail' => 'អាសយដ្ឋានអ៊ីមែលážáŸ’មី៖',
+'changeemail-none' => '(គ្មាន​)',
+'changeemail-submit' => 'ផ្លាស់ប្ដូរអ៊ីមែល',
+'changeemail-cancel' => 'បោះបង់',
# Edit page toolbar
'bold_sample' => 'អក្សរដិáž',
@@ -878,9 +897,6 @@ $2',
អាសយដ្ឋានIPបច្ចុប្បន្នរបស់អ្នកគឺ $3។ អážáŸ’ážáž›áŸážáž áž¶áž˜ážƒáž¶ážáŸ‹áž‚ឺ #$5។
សូមបញ្ចូលពáŸážáŸŒáž˜áž¶áž“លំអិážáž‘ាំងអស់ážáž¶áž„លើនáŸáŸ‡ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានáŸáŸ‡áŸ”',
'blockednoreason' => 'គ្មានហáŸážáž»áž•áž›â€‹ážáŸ’រូវបានលើកឡើង',
-'blockedoriginalsource' => "កូដនៃទំពáŸážš '''$1''' ážáŸ’រូវបានបង្ហាញដូចážáž¶áž„ក្រោម៖",
-'blockededitsource' => "ážáŸ’លឹមសារ​នៃ '''កំណែប្រែ​របស់អ្នក''' លើទំពáŸážš '''$1''' ážáŸ’រូវបាន​បង្ហាញ​ážáž¶áž„ក្រោម ៖",
-'whitelistedittitle' => 'ážáž˜áŸ’រូវអោយកážáŸ‹ážˆáŸ’មោះចូលដើម្បីកែប្រែ',
'whitelistedittext' => 'អ្នកážáŸ’រូវážáŸ‚ $1 ដើម្បី​កែប្រែ​ážáŸ’លឹមសារទំពáŸážšáŸ”',
'confirmedittext' => 'អ្នកážáŸ’រូវážáŸ‚ផ្ទៀងផ្ទាážáŸ‹áž”ញ្ជាក់អាសយដ្ឋានអ៊ីមែលរបស់អ្នកមុននឹងកែប្រែážáŸ’លឹមសារអážáŸ’ážáž”ទ។
@@ -1125,8 +1141,6 @@ $2',
'revdelete-unsuppress' => 'ដកចáŸáž‰áž€áž¶ážšážŠáž¶áž€áŸ‹áž€áŸ†áž áž·ážáž›áž¾áž€áŸ†ážŽáŸ‚ដែលបានស្ážáž¶ážšáž¡áž¾áž„វិញ',
'revdelete-log' => 'មូលហáŸážáž»áŸ–',
'revdelete-submit' => 'អនុវážáŸ’ážáž‘ៅលើ{{PLURAL:$1|កំណែ|កំណែទាំងឡាយ}}ដែលបានជ្រើសយក',
-'revdelete-logentry' => 'បានផ្លាស់ប្ážáž¼ážšáž‚ំហើញកំណែនៃ[[$1]]',
-'logdelete-logentry' => 'បានផ្លាស់ប្ážáž¼ážšáž‚ំហើញហáŸážáž»áž€áž¶ážšáž“ៃ[[$1]]',
'revdelete-success' => "'''បន្ទាន់សមáŸáž™áž‚ំហើញកំណែបានសំរáŸáž…។'''",
'revdelete-failure' => "'''មិន​អាចបន្ទាន់សមáŸáž™áž‚ំហើញនៃ​កំណែប្រែ​បាន​៖'''
$1",
@@ -1138,15 +1152,6 @@ $1",
'revdel-restore-visible' => 'កំណែដែលអាលមើលឃើញ',
'pagehist' => 'ប្រវážáŸ’ážáž·áž‘ំពáŸážš',
'deletedhist' => 'ប្រវážáŸ’ážáž·ážŠáŸ‚áž›ážáŸ’រូវបានលុប',
-'revdelete-content' => 'ážáŸ’លឹមសារ',
-'revdelete-summary' => 'កែប្រែចំណារពន្យល់',
-'revdelete-uname' => 'អážáŸ’ážáž“ាម',
-'revdelete-restricted' => 'បានអនុវážáŸ’ážáž€áž¶ážšážŠáž¶áž€áŸ‹áž€áŸ†áž áž·ážáž…ំពោះអ្នកអភិបាល',
-'revdelete-unrestricted' => 'បានដកការដាក់កំហិážáž…áŸáž‰ážŸáž˜áŸ’រាប់អ្នកអភិបាល',
-'revdelete-hid' => 'បានលាក់$1',
-'revdelete-unhid' => 'ឈប់លាក់$1',
-'revdelete-log-message' => '$1 ចំពោះ $2 {{PLURAL:$2|កំណែ​ប្រែ​}}',
-'logdelete-log-message' => '$1 ចំពោះ $2 {{PLURAL:$2|ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸ|ព្រឹážáŸ’ážáž·áž€áž¶ážšážŽáŸ}}',
'revdelete-hide-current' => 'មាន​កំហុស​ពáŸáž›â€‹áž€áŸ†áž–ុង​លាក់​បាំង​វážáŸ’ážáž»â€‹ážŠáŸ‚ល​មាន​កាល​បរិច្ឆáŸáž‘ $2, $1៖ áž“áŸáŸ‡â€‹áž‚ឺ​ជា​កំណែបច្ចុប្បន្ន​។​
វា​មិន​អាច​លាក់​បាំង​បាន​ទáŸâ€‹áŸ”',
'revdelete-show-no-access' => 'មាន​កំហុស​ពáŸáž›â€‹áž€áŸ†áž–ុង​បង្ហាញ​វážáŸ’ážáž»â€‹ážŠáŸ‚ល​មាន​កាល​បរិច្ឆáŸáž‘ $2, $1៖ ážœážáŸ’ážáž»â€‹áž“áŸáŸ‡â€‹ážáŸ’រូវ​បាន​កážáŸ‹â€‹ážŸáž˜áŸ’គាល់​ជា"ការ​ដាក់​កំហិážâ€‹"​។​
@@ -1302,11 +1307,13 @@ $1",
'prefs-rc' => 'បំលាស់ប្ដូរážáŸ’មីៗ',
'prefs-watchlist' => 'បញ្ជីážáž¶áž˜ážŠáž¶áž“',
'prefs-watchlist-days' => 'ចំនួនážáŸ’ងៃážáŸ’រូវបង្ហាញក្នុងបញ្ជីážáž¶áž˜ážŠáž¶áž“៖',
-'prefs-watchlist-days-max' => 'អážáž·áž”រមា ៧ážáŸ’ងៃ',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'ចំនួនអážáž·áž”រមានៃបំលាស់ប្ážáž¼ážšážáŸ’រូវបង្ហាញក្នុងបញ្ជីážáž¶áž˜ážŠáž¶áž“ដែលបានពង្រីក៖',
'prefs-watchlist-edits-max' => 'ចំនួនអážáž·áž”រមា៖ ១០០០',
'prefs-misc' => 'ផ្សáŸáž„ៗ',
'prefs-resetpass' => 'ប្ážáž¼ážšáž–ាក្យសំងាážáŸ‹',
+'prefs-changeemail' => 'ផ្លាស់ប្ដូរអ៊ីមែល',
+'prefs-setemail' => 'ដាក់អាសយដ្ឋានអ៊ីមែលមួយ',
'prefs-email' => '
ជំរើសទាក់ទិននឹងអ៊ីមែល',
'prefs-rendering' => 'ការរចនា',
@@ -1404,7 +1411,7 @@ $1",
'userrights-lookup-user' => 'គ្រប់គ្រងក្រុមអ្នកប្រើប្រាស់',
'userrights-user-editname' => 'បញ្ចូលអážáŸ’ážáž“ាម៖',
'editusergroup' => 'កែប្រែក្រុមអ្នកប្រើប្រាស់',
-'editinguser' => "ការប្ដូរសិទ្ធិអ្នកប្រើប្រាស់ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "ប្ដូរសិទ្ធរបស់អ្នកប្រើប្រាស់ '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'កែប្រែក្រុមអ្នកប្រើប្រាស់',
'saveusergroups' => 'រក្សាក្រុមអ្នកប្រើប្រាស់ទុក',
'userrights-groupsmember' => 'ក្រុមសមាជិកភាព៖',
@@ -1495,13 +1502,13 @@ $1",
'right-autopatrol' => 'កážáŸ‹ážŸáž˜áŸ’គាល់ដោយស្វáŸáž™áž”្រវážáŸ’ážáž·áž“ូវកំណែប្រែរបស់ážáŸ’ញុំážáž¶áž‡áž¶áž€áŸ†áž“ែប្រែបានល្បាáž',
'right-patrolmarks' => 'មើក​កំណážáŸ‹â€‹ážŸáž˜áŸ’គាល់​ល្បាážâ€‹ážŠáŸ‚ល​ផ្លាស់​ប្ážáž¼ážšâ€‹ážáŸ’មី​ៗ​',
'right-unwatchedpages' => 'បង្ហាញបញ្ជីទំពáŸážšáž“ានាដែលមិនážáŸ’រូវបានមើល',
-'right-trackback' => 'ដាក់ស្នើការ​ážáž¶áž˜â€‹ážŠáž¶áž“​',
'right-mergehistory' => 'ច្របាច់ប្រវážáŸ’ážáž·ážšáž”ស់ទំពáŸážšáž“ានាបញ្ចូលគ្នា',
'right-userrights' => 'កែប្រែរាល់សិទ្ធិនៃអ្នកប្រើប្រាស់',
'right-userrights-interwiki' => 'កែប្រែសិទ្ធិអ្នកប្រើប្រាស់នៅលើវិគីផ្សáŸáž„ៗទៀáž',
'right-siteadmin' => 'ចាក់សោនិងបើកសោមូលដ្ឋានទិន្ននáŸáž™',
'right-override-export-depth' => 'នាំចáŸáž‰áž‘ំពáŸážšážšáž½áž˜áž‘ាំងទំពáŸážšážŠáŸ‚លមានភ្ជាប់ážáŸ†ážŽáž—្ជាប់​រហូážážŠáž›áŸ‹áž›áŸ†ážŠáž¶áž”់ទី៥',
'right-sendemail' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ',
+'right-passwordreset' => 'មើលអ៊ីមែលសំរាប់កំណážáŸ‹áž–ាក្យសំងាážáŸ‹áž¡áž¾áž„វិញ',
# User rights log
'rightslog' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការប្ážáž¼ážšážŸáž·áž‘្ធិអ្នកប្រើប្រាស់',
@@ -1540,7 +1547,6 @@ $1",
'action-patrol' => 'ចំណាំកំណែប្រែរបស់អ្នកដទៃážáž¶áž”ានល្បាáž',
'action-autopatrol' => 'ផ្ដល់សិទ្ធិឱ្យគáŸáž…ំណាំកំណែរបស់អ្នកážáž¶áž”ានល្បាáž',
'action-unwatchedpages' => 'មើលបញ្ជីនៃទំពáŸážšáž˜áž·áž“ážáž¶áž˜ážŠáž¶áž“',
-'action-trackback' => 'ដាក់​ស្មើ​ការ​ážáž¶áž˜ážŠáž¶áž˜',
'action-mergehistory' => 'ច្របាច់បញ្ចូលប្រវážáŸ’ážáž·ážšáž”ស់ទំពáŸážšáž“áŸáŸ‡',
'action-userrights' => 'កែប្រែសិទ្ធិរបស់អ្នកប្រើប្រាស់ទាំងអស់',
'action-userrights-interwiki' => 'កែប្រែសិទ្ធិនានារបស់អ្នកប្រើប្រាស់នៅលើវិគីដទៃ',
@@ -1573,7 +1579,6 @@ $1",
'minoreditletter' => 'ážáž·áž…',
'newpageletter' => 'ážáŸ’មី',
'boteditletter' => 'រូបយន្áž',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[មាន{{PLURAL:$1|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}}$1នាក់កំពុងមើល]',
'rc_categories' => 'កម្រិážáž‘ីážáž¶áŸ†áž„ចំណាážáŸ‹ážáŸ’នាក់ក្រុម(ážážŽáŸ’ឌដោយសញ្ញា "|")',
'rc_categories_any' => 'មួយណាកáŸáž”ាន',
@@ -1633,6 +1638,7 @@ $1",
'ignorewarnings' => 'មិនážáŸ’វល់​ការព្រមាន​ណាមួយ',
'minlength1' => 'ឈ្មោះឯកសារ​ážáŸ’រូវមាន​យ៉ាងážáž·áž…​១​អក្សរ។',
'illegalfilename' => 'ឈ្មោះឯកសារ "$1" មាន​អក្សរ​ហាមឃាážáŸ‹â€‹â€‹áž€áŸ’នុងចំណងជើងទំពáŸážšáŸ” សូម​ប្ážáž¼ážšážˆáŸ’មោះ​ឯកសារ ហើយ​ព្យាយាមផ្ទុកវា​ឡើង​ម្ážáž„ទៀážáŸ”',
+'filename-toolong' => 'ឈ្មោះឯកសារមិនអាចវែងជាង 240 បៃទáŸáŸ”',
'badfilename' => 'ឈ្មោះឯកសារ បានážáŸ’រូវប្ážáž¼ážš ជា "$1" ។',
'filetype-mime-mismatch' => 'កន្ទុយរបស់ឯកសារ ".$1" មិនážáŸ’រូវគ្នានឹងប្រភáŸáž‘ MIME របស់ឯកសារ ($2) áž‘áŸáŸ”',
'filetype-badmime' => 'ឯកសារ​ប្រភáŸáž‘ MIME "$1" មិនážáŸ’រូវបាន​អនុញ្ញាážâ€‹áž±áŸ’យផ្ទុកឡើង។',
@@ -1995,7 +2001,7 @@ $1',
'listusers-editsonly' => 'បង្ហាញážáŸ‚អ្នកប្រើប្រាស់ដែលបានកែប្រែអážáŸ’ážáž”ទប៉ុណ្ណោះ',
'listusers-creationsort' => 'ážáŸ†ážšáŸ€áž”ážáž¶áž˜áž›áŸ†ážŠáž¶áž”់កាលបរិច្ឆáŸáž‘បង្កើáž',
'usereditcount' => '$1 {{PLURAL:$1|កំណែប្រែ|កំណែប្រែ}}',
-'usercreated' => 'បានបង្កើážáž“ៅážáŸ’ងៃទី$1 ម៉ោង $2',
+'usercreated' => '{{GENDER:$3|បានបង្កើáž}}នៅ$1 $2',
'newpages' => 'ទំពáŸážšážáŸ’មីៗ',
'newpages-username' => 'អážáŸ’ážáž“ាម៖',
'ancientpages' => 'ទំពáŸážšâ€‹áž…ាស់ៗ',
@@ -2089,12 +2095,8 @@ $1',
'activeusers-noresult' => 'អ្នកប្រើប្រាស់​រកមិនឃើញ​។​',
# Special:Log/newusers
-'newuserlogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž‚ណនី',
-'newuserlogpagetext' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž¢áŸ’នកប្រើប្រាស់។',
-'newuserlog-byemail' => 'ពាក្យសំងាážáŸ‹ážáŸ’រូវបានផ្ញើážáž¶áž˜áž¢áŸŠáž¸áž˜áŸ‚áž›',
-'newuserlog-create-entry' => 'អ្នកប្រើប្រាស់ážáŸ’មី',
-'newuserlog-create2-entry' => "បាន​បង្កើážâ€‹áž‚ណនី​ážáŸ’មី​សម្រាប់ '''$1'''",
-'newuserlog-autocreate-entry' => 'គណនីážáŸ’រូវបានបង្កើážážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž·',
+'newuserlogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž‚ណនី',
+'newuserlogpagetext' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž¢áŸ’នកប្រើប្រាស់។',
# Special:ListGroupRights
'listgrouprights' => 'សិទ្ធិនិងក្រុមអ្នកប្រើប្រាស់',
@@ -2122,7 +2124,7 @@ $1',
'emailpagetext' => 'អ្នក​អាច​ប្រើសំនុំ​បែប​បទ​ážáž¶áž„​ក្រោម​ក្នុង​ការ​ផ្ញើ​សារ​ជា​អ៊ីមែល​ទៅ​កាន់​អ្នក​ប្រើប្រាស់​នáŸáŸ‡â€‹áŸ”
អាសយដ្ឋាន​អ៊ីមែល​ដែល​អ្នក​បាន​វាយ​បញ្ចូល​ក្នុង​[[Special:Preferences|ចំណង់ចំណូល​ចិážáŸ’ážâ€‹]]​របស់​អ្នក នឹង​បង្ហាញ​ជា​អាសយដ្ឋាន​អ៊ីមែល "From" ដូច្នោះ​អ្នក​ទទួល​នឹង​អាច​ឆ្លើយ​ážáž”​ទៅ​អ្នក​វិញ​ដោយ​ផ្ទាល់​។',
'usermailererror' => 'កំហុសឆ្គងក្នុងចំណងជើងអ៊ីមែល៖',
-'defemailsubject' => 'អ៊ីមែលពី{{SITENAME}}',
+'defemailsubject' => 'អ៊ីមែល{{SITENAME}}ពី "$1"',
'usermaildisabled' => 'មិនប្រើអ៊ីមែល',
'usermaildisabledtext' => 'អ្នកមិនអាចផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់ដទៃទៀážáž“ៅលើវិគីនáŸáŸ‡áž”ានទáŸ',
'noemailtitle' => 'គ្មានអាសយដ្ឋានអ៊ីមែល',
@@ -2175,7 +2177,7 @@ $1',
'watchmethod-list' => 'ឆែកមើលទំពáŸážšážáŸ’រូវបានážáž¶áž˜ážŠáž¶áž“ចំពោះកំណែប្រែážáŸ’មីៗ',
'watchlistcontains' => 'បញ្ជីážáž¶áž˜ážŠáž¶áž“ របស់អ្នក មាន $1 {{PLURAL:$1|ទំពáŸážš|ទំពáŸážš}}។',
'iteminvalidname' => "មានបញ្ហាជាមួយនឹង'$1'​។ ឈ្មោះគឺមិនážáŸ’រឹមážáŸ’រូវ...",
-'wlnote' => "ážáž¶áž„ក្រោមនáŸáŸ‡áž‡áž¶ {{PLURAL:$1|បំលាស់ប្ážáž¼ážšáž…ុងក្រោយ|'''$1'''បំលាស់ប្ážáž¼ážšáž…ុងក្រោយ}}ក្នុងរយះពáŸáž›{{PLURAL:$2|'''$2'''ម៉ោង}}ចុងក្រោយ។",
+'wlnote' => "ážáž¶áž„ក្រោមនáŸáŸ‡áž‡áž¶ {{PLURAL:$1|បំលាស់ប្ážáž¼ážšáž…ុងក្រោយ|'''$1'''បំលាស់ប្ážáž¼ážšáž…ុងក្រោយ}}ក្នុងរយះពáŸáž›{{PLURAL:$2|'''$2'''ម៉ោង}}ចុងក្រោយ áž‚áž·ážáž…ាប់ពី $3, $4។",
'wlshowlast' => 'បង្ហាញ $1ម៉ោងចុងក្រោយ $2ážáŸ’ងៃចុងក្រោយ ឬ$3',
'watchlist-options' => 'ជម្រើសនានាក្នុងបញ្ជីážáž¶áž˜ážŠáž¶áž“',
@@ -2246,8 +2248,6 @@ $UNWATCHURL
'deletedtext' => '"$1"ážáŸ’រូវបានលុបចោលរួចហើយ។
សូមមើល$2សំរាប់បញ្ជីនៃការលុបចោលនាពáŸáž›ážáŸ’មីៗ។',
-'deletedarticle' => 'បានលុបចោល"[[$1]]"',
-'suppressedarticle' => 'បាន​ហាម​ឃាážáŸ‹â€‹ "[[$1]]"',
'dellogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការលុបចោល',
'dellogpagetext' => 'ážáž¶áž„ក្រោមជាបញ្ជីនៃការលុបចោលážáŸ’មីៗបំផុážáŸ”',
'deletionlog' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការលុបចោល',
@@ -2295,7 +2295,10 @@ $UNWATCHURL
'unprotectedarticle' => 'ដកការការពារពី "[[$1]]"',
'movedarticleprotection' => 'បាន​ផ្លាស់​ប្ដូរ​ទី​ážáž¶áŸ†áž„​ការ​កំណážáŸ‹â€‹áž€áž¶ážšâ€‹áž€áž¶ážšáž–ារ​ពី"[[$2]]" ទៅ​ "[[$1]]"',
'protect-title' => 'ការពារ "$1"',
+'protect-title-notallowed' => 'មើលកំរិážáž€áž¶ážšáž–ាររបស់ "$1"',
'prot_1movedto2' => 'បានប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ [[$1]] ទៅ [[$2]]',
+'protect-badnamespace-title' => 'លំហឈ្មោះដែលមិនអាចការពារបាន',
+'protect-badnamespace-text' => 'ទំពáŸážšážŠáŸ‚លស្ážáž·ážáž“ៅក្នុងលំហឈ្មោះនáŸáŸ‡áž˜áž·áž“អាចការពារបានទáŸáŸ”',
'protect-legend' => 'ផ្ទៀងផ្ទាážáŸ‹áž”ញ្ជាក់ការការពារ',
'protectcomment' => 'មូលហáŸážáž»áŸ–',
'protectexpiry' => 'áž•áž»ážáž€áŸ†ážŽážáŸ‹áŸ–',
@@ -2317,6 +2320,7 @@ $UNWATCHURL
'protect-level-sysop' => 'សម្រាប់ážáŸ‚អ្នកážáŸ‚ទាំប្រពáŸáž“្ធ',
'protect-summary-cascade' => 'ការពារជា​ážáŸ’នាក់',
'protect-expiring' => 'áž•áž»ážáž€áŸ†ážŽážáŸ‹ $1 (UTC)',
+'protect-expiring-local' => 'áž•áž»ážáž€áŸ†ážŽážáŸ‹ $1',
'protect-expiry-indefinite' => 'គ្មានកំណážáŸ‹',
'protect-cascade' => 'ការពារគ្រប់ទំពáŸážšážŠáŸ‚លឋិážáž€áŸ’នុងទំពáŸážšáž“áŸáŸ‡ (ការពារជាážáŸ’នាក់)',
'protect-cantedit' => 'អ្នកមិនអាចផ្លាស់ប្ដូរកម្រិážáž€áž¶ážšáž–ារនៃទំពáŸážšáž“áŸáŸ‡áž‘០ព្រោះអ្នកគ្មានការអនុញ្ញាážáž€áŸ’នុងការកែប្រែវា។',
@@ -2378,7 +2382,6 @@ $UNWATCHURL
'undeletereset' => 'ធ្វើឱ្យដូចដើមវិញ',
'undeleteinvert' => 'ក្រៅពីនោះ',
'undeletecomment' => 'មូលហáŸážáž»áŸ–',
-'undeletedarticle' => 'បានស្ážáž¶ážš"[[$1]]"ឡើងវិញ',
'undeletedrevisions' => 'បានស្ážáž¶ážšáž¡áž¾áž„វិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}',
'undeletedrevisions-files' => 'បានស្ážáž¶ážšáž¡áž¾áž„វិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}áž“áž·áž„{{PLURAL:$2|១ឯកសារ|$2ឯកសារ}}',
'undeletedfiles' => '{{PLURAL:$1|១ ឯកសារ|$1 ឯកសារ}} ážáŸ’រូវបានស្ដារឡើងវិញ',
@@ -2389,6 +2392,7 @@ $UNWATCHURL
សូម​ចូល​ទៅ [[Special:Log/delete|កំណážáŸ‹áž áŸážáž»â€‹áž“ៃ​ការលុប]] ដើម្បី​ពិនិážáŸ’យ​មើល​កំណážáŸ‹ážáŸ’រា​នៃ​ការលុប​និង​ការ​ស្ដារ​ឡើង​វិញ​។",
'undelete-header' => 'មើលទំពáŸážšážŠáŸ‚áž›ážáŸ’រូវបានលុបចោលážáŸ’មីៗក្នុង[[Special:Log/delete|កំណážáŸ‹áž áŸážáž»áž“ៃការលុបចោល]]។',
+'undelete-search-title' => 'ស្វែងរកទំពáŸážšážŠáŸ‚áž›ážáŸ’រូវបានលុបចោល',
'undelete-search-box' => 'ស្វែងរកទំពáŸážšážŠáŸ‚លបានážáŸ’រូវលុបចោល',
'undelete-search-prefix' => 'បង្ហាញទំពáŸážšáž…ាប់ផ្ážáž¾áž˜ážŠáŸ„យ៖',
'undelete-search-submit' => 'ស្វែងរក',
@@ -2399,6 +2403,7 @@ $UNWATCHURL
'undelete-missing-filearchive' => 'មិនអាចស្ដារឡើងវិញនូវឯកសារក្នុងឃ្លាំងដែលមានអážáŸ’ážáž›áŸáž $1 ព្រោះវាគ្មាននៅក្នុងមូលដ្ឋានទិន្ននáŸáž™áž‘áŸáŸ”
ប្រហែលជាážáž¶ážáŸ’រូវបានស្ដារឡើងវិញរួចហើយ។',
+'undelete-error' => 'បញ្ហាពáŸáž›ážˆáž”់លុបទំពáŸážš',
'undelete-error-short' => 'បញ្ហាក្នុងការស្ដារឯកសារ ៖ $1',
'undelete-error-long' => 'កំហុសផ្សáŸáž„ៗបានកើážáž¡áž¾áž„ក្នុងពáŸáž›áž€áŸ†áž–ុងឈប់លុបឯកសារនáŸáŸ‡áŸ–
$1',
@@ -2534,6 +2539,7 @@ $1',
'unblocklink' => 'ដកការហាមឃាážáŸ‹',
'change-blocklink' => 'ផ្លាស់ប្ដូរការហាមឃាážáŸ‹',
'contribslink' => 'ការរួមចំណែក',
+'emaillink' => 'ផ្ញើអ៊ីមែល',
'autoblocker' => 'អ្នកបានážáŸ’រូវបានហាមឃាážáŸ‹ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž· ពីព្រោះអាសយដ្ឋានIPរបស់អ្នកážáŸ’រូវបានប្រើប្រាស់ដោយ"[[User:$1|$1]]"។ មូលហáŸážáž»áž›áž¾áž€áž¡áž¾áž„ចំពោះការហាមឃាážáŸ‹$1គឺ៖ "$2"',
'blocklogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការហាមឃាážáŸ‹',
'blocklog-showlog' => 'អ្នកប្រើប្រាស់នáŸáŸ‡ážáŸ’រូវបានរាំងážáŸ’ទប់មុននáŸáŸ‡áž˜áŸ’ដងហើយ។
@@ -2635,9 +2641,6 @@ $1',
'movepage-page-moved' => 'ទំពáŸážš$1ážáŸ’រូវបានប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅកាន់$2ហើយ។',
'movepage-page-unmoved' => 'ទំពáŸážš$1មិនអាចប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ$2បានទáŸáŸ”',
'movepage-max-pages' => 'ទំពáŸážšáž¢ážáž·áž”រមាចំនួន $1 {{PLURAL:$1|ទំពáŸážš|ទំពáŸážš}} ážáŸ’រូវបានប្ដូរទីážáž¶áŸ†áž„ហើយ áž áŸážáž»áž“áŸáŸ‡áž“ឹងគ្មានការប្ដូរទីážáž¶áŸ†áž„ជាស្វáŸáž™áž”្រវážáŸ’ážáž·áž‘ៀážáž‘áŸáŸ”',
-'1movedto2' => 'បានប្ដូរទីážáž¶áŸ†áž„ [[$1]] ទៅ [[$2]]',
-'1movedto2_redir' => 'ទំពáŸážš [[$1]] ážáŸ’រូវបានប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ [[$2]] ážáž¶áž˜ážšáž™áŸˆáž€áž¶ážšáž”ញ្ជូនបន្ážáŸ”',
-'move-redirect-suppressed' => 'ážáŸ†áž“បញ្ជូនបន្ážážáŸ’រូវបានលុបចោល',
'movelogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការប្ដូរទីážáž¶áŸ†áž„',
'movelogpagetext' => 'ážáž¶áž„ក្រោមនáŸáŸ‡áž‡áž¶áž”ញ្ជីនៃទំពáŸážšážŠáŸ‚áž›ážáŸ’រូវបានប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„។',
'movesubpage' => '{{PLURAL:$1|ទំពáŸážšážšáž„|ទំពáŸážšážšáž„}}',
@@ -2650,7 +2653,7 @@ $1',
"[[:$1]]"ដែលជាទីážáž¶áŸ†áž„ទំពáŸážšážáŸ’រូវបញ្ជូនទៅ មានរួចជាស្រáŸáž…ហើយ។
ážáž¾áž¢áŸ’នកចង់លុបវាដើម្បីជាវិធីសម្រាប់ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„áž‘áŸ?',
'delete_and_move_confirm' => 'យល់ព្រម​លុប​ទំពáŸážšâ€‹áž“áŸáŸ‡',
-'delete_and_move_reason' => 'បានលុបដើម្បីផ្លាស់ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„',
+'delete_and_move_reason' => 'ážáŸ’រូវបានលុបដើម្បីផ្លាស់ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ពី "[[$1]]"',
'selfmove' => 'ចំណងជើងប្រភពនិងចំណងជើងគោលដៅគឺážáŸ‚មួយ។
មិនអាចប្ដូរទីážáž¶áŸ†áž„ទំពáŸážšáž˜áž½áž™áž‘ៅលើážáŸ’លួនវាបានទáŸáŸ”',
@@ -2890,9 +2893,6 @@ $1',
# Patrol log
'patrol-log-page' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការážáž¶áž˜ážŠáž¶áž“',
'patrol-log-header' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃកំណែ​ប្រែ​ដែល​បាន​ážáž¶áž˜ážŠáž¶áž“',
-'patrol-log-line' => 'បានចំណាំការល្បាហ$1 នៃ $2 ážáž¶ បានážáŸ’ážšáž½ážáž–áž·áž“áž·ážáŸ’áž™ $3',
-'patrol-log-auto' => '(ស្វáŸáž™áž”្រវážáŸ’ážáž·)',
-'patrol-log-diff' => 'កំណែប្រែ​ $1',
'log-show-hide-patrol' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការážáž¶áž˜ážŠáž¶áž“ $1',
# Image deletion
@@ -2917,7 +2917,7 @@ $1',
'widthheightpage' => '$1 × $2, $3{{PLURAL:$3|ទំពáŸážš|ទំពáŸážš}}',
'file-info' => 'ទំហំឯកសារ៖ $1, ប្រភáŸáž‘ MIME ៖ $2',
'file-info-size' => '$1 × $2 ភីកសែល ទំហំឯកសារ៖ $3 ប្រភáŸáž‘ MIME៖ $4',
-'file-nohires' => '<small>គ្មានភាពម៉ážáŸ‹ ដែលážáŸ’ពស់ជាង។</small>',
+'file-nohires' => 'គ្មានភាពម៉ážáŸ‹ ដែលážáŸ’ពស់ជាង។',
'svg-long-desc' => 'ឯកសារប្រភáŸáž‘SVG $1 × $2 ភីកសែល ទំហំឯកសារ៖ $3',
'show-big-image' => 'រូបភាពពáŸáž‰',
'show-big-image-size' => '$1 × $2 ភីកសែ',
@@ -2940,9 +2940,14 @@ $1',
'sp-newimages-showfrom' => 'បង្ហាញឯកសារážáŸ’មីៗចាប់ពី$2 $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'វិ​.',
-'minutes-abbrev' => 'និ​.',
-'hours-abbrev' => 'ម៉.',
+'seconds-abbrev' => '$1វិ​.',
+'minutes-abbrev' => '$1និ​.',
+'hours-abbrev' => '$1ម៉.',
+'seconds' => '{{PLURAL:$1|$1 វិនាទី|$1 វិនាទី}}',
+'minutes' => '{{PLURAL:$1|$1 នាទី|$1 នាទី}}',
+'hours' => '{{PLURAL:$1|$1 ម៉ោង|$1 ម៉ោង}}',
+'days' => '{{PLURAL:$1|$1 ážáŸ’ងៃ|$1 ážáŸ’ងៃ}}',
+'ago' => '$1 មុន',
# Bad image list
'bad_image_list' => 'ទម្រង់ ដូចážáž‘ៅ ៖
@@ -3247,13 +3252,6 @@ $5
# Scary transclusion
'scarytranscludetoolong' => '[URL វែងជ្រុល]',
-# Trackbacks
-'trackbackbox' => 'ážáž¶áž˜ážŠáž¶áž“​ážáŸ’រឡប់​វិញ​ (Trackback) សម្រាប់​ទំពáŸážšâ€‹áž“áŸáŸ‡áŸ–<br />
-$1',
-'trackbackremove' => '([$1 លុបចáŸáž‰])',
-'trackbacklink' => 'ážáž¶áž˜ážŠáž¶áž“​ážáŸ’រឡប់​វិញ​ (Trackback)',
-'trackbackdeleteok' => 'ážáž¶áž˜ážŠáž¶áž“​ážáŸ’រឡប់​វិញ​ (Trackback)ážáŸ’រូវ​បាន​លុប​ដោយ​ជោគជáŸáž™â€‹áŸ”​',
-
# Delete conflict
'deletedwhileediting' => "'''ប្រយáŸážáŸ’áž“''' ៖ ទំពáŸážšáž“áŸáŸ‡áž”ានážáŸ’រូវលុបចោល បន្ទាប់ពីអ្នកបានចាប់ផ្ážáž¾áž˜áž€áŸ‚ប្រែ!",
'confirmrecreate' => "អ្នកប្រើប្រាស់ [[User:$1|$1]] ([[User talk:$1|talk]]) បានលុបទំពáŸážšáž“áŸáŸ‡áž…ោលបន្ទាប់ពីអ្នកចាប់ផ្ដើមកែប្រែវា ដោយមានហáŸážáž»áž•áž›ážáž¶áŸ–
@@ -3347,6 +3345,9 @@ $1',
'watchlisttools-edit' => 'មើលនិងកែប្រែបញ្ជីážáž¶áž˜ážŠáž¶áž“',
'watchlisttools-raw' => 'កែប្រែបញ្ជីážáž¶áž˜ážŠáž¶áž“ឆៅ',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ការពិភាក្សា]])',
+
# Core parser functions
'unknown_extension_tag' => 'ស្លាក​នៃផ្នែកបន្ážáŸ‚ម "$1" មិនស្គាល់',
@@ -3391,10 +3392,8 @@ $1',
# Special:SpecialPages
'specialpages' => 'ទំពáŸážšâ€‹áž–ិសáŸážŸâ€‹áŸ—',
-'specialpages-note' => '----
-* ទំពáŸážšáž–ិសáŸážŸáŸ—ធម្មážáž¶áŸ”
+'specialpages-note' => '* ទំពáŸážšáž–ិសáŸážŸáŸ—ធម្មážáž¶áŸ”
* <span class="mw-specialpagerestricted">ទំពáŸážšáž–ិសáŸážŸáŸ—ដែលមានការដាក់កំហិážáŸ”</span>
-
* <span class="mw-specialpagecached">ទំពáŸážšáž–ិសáŸážŸáŸ—សំរាប់រក្សាទុក។</span>',
'specialpages-group-maintenance' => 'របាយការណáŸáž“ានាអំពីážáŸ†áž áŸ‚ទាំ',
'specialpages-group-other' => 'ទំពáŸážšáž–ិសáŸážŸáŸ—ផ្សáŸáž„ៗទៀáž',
@@ -3427,13 +3426,15 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}',
# Special:ComparePages
-'comparepages' => 'ប្រៀបធៀបទំពáŸážš',
-'compare-selector' => 'ប្រៀបធៀបកំណែទំពáŸážš',
-'compare-page1' => 'ទំពáŸážš ១',
-'compare-page2' => 'ទំពáŸážš ២',
-'compare-rev1' => 'កំណែ ១',
-'compare-rev2' => 'កំណែ ២',
-'compare-submit' => 'ប្រៀបធៀប',
+'comparepages' => 'ប្រៀបធៀបទំពáŸážš',
+'compare-selector' => 'ប្រៀបធៀបកំណែទំពáŸážš',
+'compare-page1' => 'ទំពáŸážš ១',
+'compare-page2' => 'ទំពáŸážš ២',
+'compare-rev1' => 'កំណែ ១',
+'compare-rev2' => 'កំណែ ២',
+'compare-submit' => 'ប្រៀបធៀប',
+'compare-invalid-title' => 'ចំណងជើងដែលអ្នកបានផ្ដល់អោយមិនážáŸ’រឹមážáŸ’រូវទáŸ',
+'compare-title-not-exists' => 'ចំណងជើងដែលអ្នកផ្ដល់អោយមិនមានទáŸáŸ”',
# Database error messages
'dberr-header' => 'វិគីនáŸáŸ‡áž˜áž¶áž“បញ្ហា',
@@ -3456,4 +3457,17 @@ $1',
'htmlform-reset' => 'ធ្វើដូចដើមវិញ',
'htmlform-selectorother-other' => 'ផ្សáŸáž„ទៀáž',
+# New logging system
+'revdelete-restricted' => 'បានអនុវážáŸ’ážáž€áž¶ážšážŠáž¶áž€áŸ‹áž€áŸ†áž áž·ážáž…ំពោះអ្នកអភិបាល',
+'revdelete-unrestricted' => 'បានដកការដាក់កំហិážáž…áŸáž‰ážŸáž˜áŸ’រាប់អ្នកអភិបាល',
+'logentry-move-move' => '$1 បានប្ដូរទីážáž¶áŸ†áž„ទំពáŸážš $3 ពី $4',
+'logentry-move-move-noredirect' => '$1 បានប្ដូរទីážáž¶áŸ†áž„ ទំពáŸážš $3 ពី $4 ដោយមិនបន្សល់ទុកážáŸ†áž“ភ្ជាប់បញ្ជូនបន្áž',
+'logentry-move-move_redir' => '$1 បានប្ដូរទីážáž¶áŸ†áž„ ទំពáŸážš $3 ពី $4 ážáž¶áž˜ážšáž™áŸˆáž€áž¶ážšáž”ញ្ជូនបន្áž',
+'logentry-move-move_redir-noredirect' => '$1 បានប្ដូរទីážáž¶áŸ†áž„ ទំពáŸážš $3 ពី $4 ážáž¶áž˜ážšáž™áŸˆáž€áž¶ážšáž”ញ្ជូនបន្ហដោយមិនបន្សល់ទុកážáŸ†áž“ភ្ជាប់បញ្ជូនបន្áž',
+'logentry-newusers-newusers' => '$1 បានបង្កើហគណនីអ្នកប្រើប្រាស់មួយ',
+'logentry-newusers-create' => '$1 បានបង្កើហគណនីអ្នកប្រើប្រាស់មួយ',
+'logentry-newusers-create2' => '$1 បានបង្កើហគណនីអ្នកប្រើប្រាស់មួយ $3',
+'logentry-newusers-autocreate' => 'គណនី $1 ážáŸ’រូវ បានបង្កើហដោយស្វáŸáž™áž”្រវážáŸ’ážáž·',
+'newuserlog-byemail' => 'ពាក្យសំងាážáŸ‹ážáŸ’រូវបានផ្ញើážáž¶áž˜áž¢áŸŠáž¸áž˜áŸ‚áž›',
+
);
diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php
index 855044b9..fbba8bec 100644
--- a/languages/messages/MessagesKn.php
+++ b/languages/messages/MessagesKn.php
@@ -58,6 +58,8 @@ $digitTransformTable = array(
'9' => '೯', # &#x0cef;
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'ಲಿಂಕà³à²—ಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ',
@@ -408,14 +410,14 @@ MySQL ಹಿಂದಿರà³à²—ಿಸಿದ ದೋಷ "$3: $4"',
'formerror' => 'ದೋಷ: ಅರà³à²œà²¿ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಲಿಲà³à²²',
'badarticleerror' => 'ಈ ಪà³à²Ÿà²¦ ಮೇಲೆ ನೀವೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿à²¦ ಕಾರà³à²¯à²µà²¨à³à²¨à³ ನಡೆಸಲಾಗದà³.',
'cannotdelete' => 'ಈ ಪà³à²Ÿ ಅಥವಾ ಚಿತà³à²°à²µà²¨à³à²¨à³ ಅಳಿಸಲಾಗಲಿಲà³à²². (ಬೇರೊಬà³à²¬ ಸದಸà³à²¯à²°à²¿à²‚ದ ಆಗಲೇ ಅಳಿಸಲà³à²ªà²Ÿà³à²Ÿà²¿à²°à²¬à²¹à³à²¦à³.)',
+'cannotdelete-title' => '"$1" ಪà³à²Ÿà²µà²¨à³à²¨à³ ಅಳಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²²',
'badtitle' => 'ಸರಿಯಿಲà³à²²à²¦ ಹೆಸರà³',
'badtitletext' => 'ನೀವೠಕೋರಿದ ಪà³à²Ÿà²¦ ಶೀರà³à²·à²¿à²•à³† ಸಿಂಧà³à²µà²²à³à²²à²¦à³à²¦à³ ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲà³à²²à²¦ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರà³à²•à²µà²¾à²—ಿದೆ.
ಅದರಲà³à²²à²¿ ಒಂದೠಅಥವ ಹೆಚà³à²šà³ ಶೀರà³à²·à²¿à²•à³†à²¯à²²à³à²²à²¿ ಬಳಸಲೠನಿಷಿದà³à²§à²µà²¾à²—ಿರà³à²µ ಅಕà³à²·à²°à²—ಳೠಇರಬಹà³à²¦à³.',
-'perfcached' => 'ಈ ಕೆಳಗಿನ ಮಾಹಿತಿಯೠcache ಇಂದ ಬಂದಿರà³à²µà³à²¦à³ ಮತà³à²¤à³ ಪà³à²°à²¸à²•à³à²¤ ಸà³à²¥à²¿à²¤à²¿à²¯à²¨à³à²¨à³ ಬಿಂಬಿಸದಿರಬಹà³à²¦à³.',
-'perfcachedts' => 'ಈ ಕೆಳಗಿನ ಮಾಹಿತಿ cache ಆಗಿರà³à²µà³à²¦à³, ಮತà³à²¤à³ ಇದರ ಕೊನೆಯ ಬದಲಾವಣೆ ಆಗಿರà³à²µà³à²¦à³ $1.',
+'perfcached' => 'ಈ ಕೆಳಗಿನ ಮಾಹಿತಿಯೠcache ಇಂದ ಬಂದಿರà³à²µà³à²¦à³ ಮತà³à²¤à³ ಪà³à²°à²¸à²•à³à²¤ ಸà³à²¥à²¿à²¤à²¿à²¯à²¨à³à²¨à³ ಬಿಂಬಿಸದಿರಬಹà³à²¦à³. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ಈ ಕೆಳಗಿನ ಮಾಹಿತಿ cache ಆಗಿರà³à²µà³à²¦à³, ಮತà³à²¤à³ ಇದರ ಕೊನೆಯ ಬದಲಾವಣೆ ಆಗಿರà³à²µà³à²¦à³ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'ಈ ಪà³à²Ÿà²¦ ಅಪà³à²¡à³‡à²Ÿà³â€à²—ಳನà³à²¨à³ ಪà³à²°à²¸à²•à³à²¤à²µà²¾à²—ಿ ನಿಲà³à²—ಡೆ ಮಾಡಲಾಗಿದೆ. ಇಲà³à²²à²¿à²°à³à²µ ಮಾಹಿತಿಯನà³à²¨à³ ಸದà³à²¯à²•à³à²•à³† ನವೀಕರಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²².',
'viewsource' => 'ಆಕರ ವೀಕà³à²·à²¿à²¸à³',
-'viewsourcefor' => '$1 ಪà³à²Ÿà²•à³à²•à³†',
'protectedpagetext' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸಂಪಾದನೆ ಮಾಡಲಾಗದಂತೆ ಸಂರಕà³à²·à²¿à²¸à²²à²¾à²—ಿದೆ.',
'viewsourcetext' => 'ಈ ಪà³à²Ÿà²¦ ಮೂಲವನà³à²¨à³ ನೀವೠವೀಕà³à²·à²¿à²¸à²¬à²¹à³à²¦à³ ಮತà³à²¤à³ ನಕಲೠಮಾಡಬಹà³à²¦à³:',
'protectedinterface' => 'ಈ ಪà³à²Ÿà²µà³ ತಂತà³à²°à²¾à²‚ಶವೠಉಪಯೋಗಿಸà³à²µ ಪಠà³à²¯à²µà²¨à³à²¨à³ ದೊರಕಿಸà³à²¤à³à²¤à²¦à³†. ದà³à²°à³à²ªà²¯à³‹à²— ಆಗದಿರಲೆಂದೠಇದನà³à²¨à³ ಸಂರಕà³à²·à²¿à²¸à²²à²¾à²—ಿದೆ.',
@@ -591,9 +593,6 @@ $2',
ನಿಮà³à²® ಪà³à²°à²¸à³à²¤à²• à²à²ªà²¿ ವಿಳಾಸ $3, ಮತà³à²¤à³ ಈ ತಡೆಯ ಸಂಖà³à²¯à³† $5.
ನೀವೠಸಂಪರà³à²•à²¿à²¸à²¿à²¦à²¾à²— ದಯವಿಟà³à²Ÿà³ ಈ ವಿವರಣೆಗಳನà³à²¨à³ ಸೇರಿಸಿ.',
'blockednoreason' => 'ಯಾವ ಕಾರಣವೂ ನೀಡಲಾಗಿಲà³à²²',
-'blockedoriginalsource' => "'''$1''' ರ ಮೂಲವನà³à²¨à³ ಕೆಳಗೆ ತೋರಲಾಗಿದೆ:",
-'blockededitsource' => "'''$1''' ಪà³à²Ÿà²¦à²²à³à²²à²¿à²¨ '''ನಿಮà³à²® ಸಂಪಾದನೆಗಳ''' ಪಠà³à²¯à²µà²¨à³à²¨à³ ಕೆಳಗೆ ತೋರಲಾಗಿದೆ:",
-'whitelistedittitle' => 'ಸಂಪಾದನೆ ಮಾಡಲೠಲಾಗೠಇನೠಆಗಿರಬೇಕà³',
'whitelistedittext' => 'ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸಂಪಾದಿಸಲೠನೀವೠ$1 ಆಗಬೇಕà³.',
'confirmedittext' => 'ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸಂಪಾದಿಸà³à²µ ಮà³à²¨à³à²¨ ನೀವೠನಿಮà³à²® ಇ-ಅಂಚೆ ವಿಳಾಸವನà³à²¨à³ ಧೃಡೀಕರಿಸಬೇಕà³.
ದಯವಿಟà³à²Ÿà³ [[Special:Preferences|ಬಳಕೆದಾರ ಆಯà³à²•à³†à²—ಳà³]] ಪà³à²Ÿà²¦à²²à³à²²à²¿ ತಮà³à²® ಇ-ಅಂಚೆ ವಿಳಾಸವನà³à²¨à³ ನಮೂದಿಸಿ ಮತà³à²¤à³ ಧೃಡೀಕರಿಸಿ.',
@@ -756,18 +755,11 @@ $2',
'revdelete-unsuppress' => 'ಪà³à²¨à²ƒ ಸà³à²¥à²¾à²ªà²¿à²¸à²¿à²¦ ಬದಲಾವಣೆಗಳ ಮೇಲಿನ ನಿಬಂಧನೆಗಳನà³à²¨à³ ತೆಗೆ',
'revdelete-log' => 'ಕಾರಣ:',
'revdelete-submit' => 'ಆಯà³à²•à³† ಮಾಡಿದ ಬದಲಾವಣೆಗೆ ಅನà³à²µà²¯à²¿à²¸à³',
-'revdelete-logentry' => '[[$1]] ರ ಸಂಪಾದನೆಯ ಕಾಣಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ಬದಲಾಯಿಸಲಾಯಿತà³',
'revdel-restore' => 'ಕಾಣಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ಬದಲಾಯಿಸà³',
'revdel-restore-deleted' => 'ಅಳಿಸಿಹಾಕಲಾದ ಆವೃತà³à²¤à²¿à²—ಳà³',
'revdel-restore-visible' => 'ಕಾಣà³à²µ ಆವೃತà³à²¤à²¿à²—ಳà³',
'pagehist' => 'ಪà³à²Ÿà²¦ ಇತಿಹಾಸ',
'deletedhist' => 'ಅಳಿಸಲà³à²ªà²Ÿà³à²Ÿ ಇತಿಹಾಸ',
-'revdelete-content' => 'ಮಾಹಿತಿ',
-'revdelete-summary' => 'ಸಂಪಾದನೆಯ ತಾತà³à²ªà²°à³à²¯',
-'revdelete-uname' => 'ಬಳಕೆಯ ಹೆಸರà³',
-'revdelete-restricted' => 'ನಿರà³à²µà²¾à²¹à²•à²°à²¿à²—ೆ ನಿಬಂಧನೆಗಳನà³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²²à²¾à²¯à²¿à²¤à³',
-'revdelete-unrestricted' => 'ನಿರà³à²µà²¾à²¹à²•à²° ನಿಬಂಧನೆಗಳನà³à²¨à³ ತೆಗೆಯಲಾಯಿತà³',
-'revdelete-hid' => '$1 ಅಡಗಿಸಲಾಯಿತà³',
'revdelete-otherreason' => 'ಇತರ/ಹೆಚà³à²šà³à²µà²°à²¿ ಕಾರಣ:',
'revdelete-reasonotherlist' => 'ಇತರ ಕಾರಣ',
'revdelete-edit-reasonlist' => 'ಅಳಿಸà³à²µà²¿à²•à³†à²¯ ಕಾರಣಗಳನà³à²¨à³ ಸಂಪಾದಿಸà³',
@@ -888,7 +880,7 @@ $2',
'prefs-rc' => 'ಇತà³à²¤à³€à²šà²¿à²¨ ಬದಲಾವಣೆಗಳà³',
'prefs-watchlist' => 'ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿',
'prefs-watchlist-days' => 'ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²²à³à²²à²¿ ತೋರಿಸಲಾಗà³à²µ ದಿನಗಳà³:',
-'prefs-watchlist-days-max' => 'ಗರಿಷà³à²  à³­ ದಿನಗಳà³',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'ವಿಸà³à²¤à³ƒà²¤ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²²à³à²²à²¿ ತೋರಿಸಬೇಕಾದ ಗರಿಷà³à²  ಬದಲಾವಣೆಗಳà³:',
'prefs-watchlist-edits-max' => 'ಗರಿಷà³à²  ಸಂಖà³à²¯à³†: ೧೦೦೦',
'prefs-misc' => 'ಇತರೆ',
@@ -1366,8 +1358,7 @@ $2',
'activeusers' => 'ಸಕà³à²°à²¿à²¯ ಸದಸà³à²¯à²° ಪಟà³à²Ÿà²¿',
# Special:Log/newusers
-'newuserlogpage' => 'ಸದಸà³à²¯à²¤à³à²µ ಸೃಷà³à²Ÿà²¿à²—ಳ ದಾಖಲೆ',
-'newuserlog-create-entry' => 'ಹೊಸ ಸದಸà³à²¯à²¤à³à²µ ಖಾತೆ',
+'newuserlogpage' => 'ಸದಸà³à²¯à²¤à³à²µ ಸೃಷà³à²Ÿà²¿à²—ಳ ದಾಖಲೆ',
# Special:ListGroupRights
'listgrouprights' => 'ಬಳಕೆದಾರ ಗà³à²‚ಪೠಹಕà³à²•à³à²—ಳà³',
@@ -1444,7 +1435,6 @@ $2',
'actioncomplete' => 'ಕಾರà³à²¯ ಸಂಪೂರà³à²£',
'deletedtext' => '"$1" ಅನà³à²¨à³ ಅಳಿಸಲಾಯಿತà³.
ಇತà³à²¤à³€à²šà³†à²—ಿನ ಅಳಿಸà³à²µà²¿à²•à³†à²—ಳ ಪಟà³à²Ÿà²¿à²—ಾಗಿ $2 ಅನà³à²¨à³ ನೋಡಿ.',
-'deletedarticle' => '"$1" ಅಳಿಸಲಾಯಿತà³',
'dellogpage' => 'ಅಳಿಸà³à²µà²¿à²•à³† ದಾಖಲೆ',
'dellogpagetext' => 'ಇತà³à²¤à³€à²šà²¿à²¨ ಅಳಿಸà³à²µà²¿à²•à³†à²—ಳ ಪಟà³à²Ÿà²¿ ಕೆಳಗಿದೆ.',
'deletionlog' => 'ಅಳಿಸà³à²µà²¿à²•à³† ದಿನಚರಿ',
@@ -1520,7 +1510,6 @@ $2',
'undeletelink' => 'ವೀಕà³à²·à²¿à²¸à³/ಹಿಂದಿನಂತಾಗಿಸà³',
'undeleteviewlink' => 'ನೋಡà³',
'undeletecomment' => 'ಕಾರಣ:',
-'undeletedarticle' => '"[[$1]]" ಅನà³à²¨à³ ಹಿಂದಿನಂತೆ ಮಾಡà³',
'undelete-header' => 'ಇತà³à²¤à³€à²šà³†à²—ೆ ಅಳಿಸಲಾದ ಪà³à²Ÿà²—ಳಿಗೆ [[Special:Log/delete|ಅಳಿಸà³à²µà²¿à²•à³† ದಿನಚರಿ]] ಅನà³à²¨à³ ನೋಡಿ.',
'undelete-search-box' => 'ಅಳಿಸಲà³à²ªà²Ÿà³à²Ÿ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಹà³à²¡à³à²•à³',
'undelete-search-prefix' => 'ಇದರಿಂದ ಪà³à²°à²¾à²°à²‚ಭವಾಗà³à²µ ಪà³à²Ÿà²—ಳನà³à²¨à³ ತೋರà³:',
@@ -1676,8 +1665,6 @@ $2',
ದಯವಿಟà³à²Ÿà³ ಕೈಯಾರೆ ಈ ಎರಡೠಪà³à²Ÿà²—ಳನà³à²¨à³ ಒಂದಾಗಿಸಿ.'''",
'movedto' => 'ಸà³à²¥à²³à²¾à²‚ತರಿಸಲà³à²ªà²Ÿà³à²Ÿ ನೆಲೆ',
'movetalk' => 'ಜೊತೆಗಿನ ಚರà³à²šà³† ಪà³à²Ÿà²µà²¨à³à²¨à³‚ ಸà³à²¥à²³à²¾à²‚ತರಿಸà³',
-'1movedto2' => '[[$1]] - [[$2]] ಪà³à²Ÿà²•à³à²•à³† ಸà³à²¥à²³à²¾à²‚ತರಿಸಲಾಗಿದೆ',
-'1movedto2_redir' => '[[$1]] - [[$2]] ಪà³à²Ÿ ರಿಡೈರೆಕà³à²Ÿà³ ಮೂಲಕ ಸà³à²¥à²³à²¾à²‚ತರಿಸಲಾಗಿದೆ',
'movelogpage' => 'ಸà³à²¥à²³à²¾à²‚ತರಿಕೆ ದಾಖಲೆ',
'movelogpagetext' => 'ಸà³à²¥à²³à²¾à²‚ತರಿಸಲಾಗಿರà³à²µ ಪà³à²Ÿà²—ಳ ಪಟà³à²Ÿà²¿ ಕೆಳಗಿದೆ.',
'movereason' => 'ಕಾರಣ:',
@@ -1804,9 +1791,6 @@ $2',
'siteusers' => '{{SITENAME}} {{PLURAL:$2|ಸದಸà³à²¯|ಸದಸà³à²¯à²°à³}} $1',
'creditspage' => 'ಪà³à²Ÿà²¦ ಗೌರವಗಳà³',
-# Patrol log
-'patrol-log-diff' => 'ಆವೃತà³à²¤à²¿ $1',
-
# Image deletion
'deletedrevision' => 'ಹಳೆ ಆವೃತà³à²¤à²¿ $1 ಅನà³à²¨à³ ಅಳಿಸಲಾಗಿದೆ',
'filedeleteerror-short' => 'ಈ ಫೈಲನà³à²¨à³ ಅಳಿಸà³à²µà³à²¦à²°à²²à³à²²à²¿ ದೋಷ: $1',
@@ -1824,7 +1808,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|ಪà³à²Ÿ|ಪà³à²Ÿà²—ಳà³}}',
'file-info' => 'ಫೈಲಿನ ಗಾತà³à²°: $1, MIME ಪà³à²°à²•à²¾à²°: $2',
'file-info-size' => '$1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³, ಫೈಲಿನ ಗಾತà³à²°: $3, MIME ಪà³à²°à²•à²¾à²°: $4',
-'file-nohires' => '<small>ಇದಕà³à²•à²¿à²‚ತ ಹೆಚà³à²šà²¿à²¨ ವಿವರವಾದ ನೋಟ ಇಲà³à²².</small>',
+'file-nohires' => 'ಇದಕà³à²•à²¿à²‚ತ ಹೆಚà³à²šà²¿à²¨ ವಿವರವಾದ ನೋಟ ಇಲà³à²².',
'svg-long-desc' => 'SVG ಫೈಲà³, ಸà³à²®à²¾à²°à²¾à²—ಿ $1 × $2 ಚಿತà³à²°à²¬à²¿à²‚ದà³à²—ಳà³, ಫೈಲಿನ ಗಾತà³à²°: $3',
'show-big-image' => 'ಅತಿ ಹೆಚà³à²šà³ ವಿವರವಾದ ನೋಟ',
@@ -2003,9 +1987,6 @@ $5
# Scary transclusion
'scarytranscludetoolong' => '[URL ತà³à²‚ಬ ಉದà³à²¦à²µà²¾à²—ಿದೆ]',
-# Trackbacks
-'trackbackremove' => '([$1 ಅಳಿಸà³])',
-
# Delete conflict
'deletedwhileediting' => "'''ಸೂಚನೆ''': ನೀವೠಸಂಪಾದನೆ ಪà³à²°à²¾à²°à²‚ಭಿಸಿದ ನಂತರ ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಅಳಿಸಲಾಗಿದೆ!",
'confirmrecreate' => "ಸದಸà³à²¯ [[User:$1|$1]] ([[User talk:$1|ಚರà³à²šà³†]]) ನೀವೠಸಂಪಾದನೆ ಶà³à²°à³ ಮಾಡಿದ ಮೇಲೆ ಕೆಳಗಿನ ಕಾರಣ ನೀಡಿ ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಅಳಿಸಿದà³à²¦à²¾à²°à³†:
@@ -2115,4 +2096,8 @@ $5
# HTML forms
'htmlform-selectorother-other' => 'ಇತರ',
+# New logging system
+'revdelete-restricted' => 'ನಿರà³à²µà²¾à²¹à²•à²°à²¿à²—ೆ ನಿಬಂಧನೆಗಳನà³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²²à²¾à²¯à²¿à²¤à³',
+'revdelete-unrestricted' => 'ನಿರà³à²µà²¾à²¹à²•à²° ನಿಬಂಧನೆಗಳನà³à²¨à³ ತೆಗೆಯಲಾಯಿತà³',
+
);
diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php
index 6e79b2bf..e7675974 100644
--- a/languages/messages/MessagesKo.php
+++ b/languages/messages/MessagesKo.php
@@ -152,136 +152,136 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#넘겨주기', '#REDIRECT' ),
- 'notoc' => array( '0', '__목차숨김__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__목차보임__', '__FORCETOC__' ),
- 'toc' => array( '0', '__목차__', '__TOC__' ),
- 'noeditsection' => array( '0', '__단ë½íŽ¸ì§‘숨김__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__í—¤ë”숨김__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', '현재월1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', '현재월ì´ë¦„', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', '현재월ì´ë¦„소유격', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', '현재월ì´ë¦„약ìž', 'CURRENTMONTHABBREV' ),
- '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' ),
- 'localmonth' => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', '지역월1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', '지역월ì´ë¦„', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', '지역월ì´ë¦„소유격', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', '지역월ì´ë¦„약ìž', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', '지역ì¼', 'LOCALDAY' ),
- 'localday2' => array( '1', '지역ì¼2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', '지역요ì¼', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', '지역년', 'LOCALYEAR' ),
- 'localtime' => array( '1', '지역시분', '지역시ê°', 'LOCALTIME' ),
- 'localhour' => array( '1', '지역시', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', '모든문서수', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', '문서수', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', '파ì¼ìˆ˜', '그림수', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', '사용ìžìˆ˜', '계정수', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', '활ë™ì¤‘ì¸ì‚¬ìš©ìžìˆ˜', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', '편집수', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', '조회수', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', '문서ì´ë¦„', 'PAGENAME' ),
- 'pagenamee' => array( '1', '문서ì´ë¦„E', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ì´ë¦„공간', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ì´ë¦„공간E', 'NAMESPACEE' ),
- 'talkspace' => array( '1', '토론ì´ë¦„공간', 'TALKSPACE' ),
- 'talkspacee' => array( '1', '토론ì´ë¦„공간E', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', '본문서ì´ë¦„공간', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', '본문서ì´ë¦„공간E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', '전체문서ì´ë¦„', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', '전체문서ì´ë¦„E', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', '하위문서ì´ë¦„', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', '하위문서ì´ë¦„E', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ìƒìœ„문서ì´ë¦„', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ìƒìœ„문서ì´ë¦„E', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', '토론문서ì´ë¦„', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', '토론문서ì´ë¦„E', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', '본문서ì´ë¦„', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', '본문서ì´ë¦„E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', '메시지:', 'MSG:' ),
- 'subst' => array( '0', '풀기:', 'SUBST:' ),
- 'safesubst' => array( '0', '안전풀기:', 'SAFESUBST:' ),
- 'img_thumbnail' => array( '1', '섬네ì¼', 'ì¸ë„¤ì¼', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', '섬네ì¼=$1', 'ì¸ë„¤ì¼=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', '오른쪽', 'right' ),
- 'img_left' => array( '1', '왼쪽', 'left' ),
- 'img_none' => array( '1', 'ì—†ìŒ', 'none' ),
- 'img_width' => array( '1', '$1픽셀', '$1px' ),
- 'img_center' => array( '1', '가운ë°', 'center', 'centre' ),
- 'img_framed' => array( '1', '프레임', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', '프레임없ìŒ', 'frameless' ),
- 'img_page' => array( '1', '문서=$1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'í…Œë‘리', 'border' ),
- 'img_baseline' => array( '1', '밑줄', 'baseline' ),
- 'img_sub' => array( '1', '아래첨ìž', 'sub' ),
- 'img_super' => array( '1', '위첨ìž', 'super', 'sup' ),
- 'img_top' => array( '1', '위', 'top' ),
- 'img_middle' => array( '1', '중간', 'middle' ),
- 'img_bottom' => array( '1', '아래', 'bottom' ),
- 'img_link' => array( '1', 'ë§í¬=$1', 'link=$1' ),
- 'sitename' => array( '1', '사ì´íŠ¸ì´ë¦„', 'SITENAME' ),
- 'ns' => array( '0', 'ì´ë¦„:', 'ì´ë¦„공간:', 'NS:' ),
- 'nse' => array( '0', 'ì´ë¦„E:', 'ì´ë¦„공간E:', 'NSE:' ),
- 'localurl' => array( '0', '지역주소:', 'LOCALURL:' ),
- 'localurle' => array( '0', '지역주소E:', 'LOCALURLE:' ),
- 'server' => array( '0', '서버', 'SERVER' ),
- 'servername' => array( '0', '서버ì´ë¦„', 'SERVERNAME' ),
- 'scriptpath' => array( '0', '스í¬ë¦½íŠ¸ê²½ë¡œ', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', '스타ì¼ê²½ë¡œ', 'STYLEPATH' ),
- 'grammar' => array( '0', '문법:', 'GRAMMAR:' ),
- 'gender' => array( '0', '성별:', 'GENDER:' ),
- 'currentweek' => array( '1', '현재주', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', '현재요ì¼ìˆ«ìž', 'CURRENTDOW' ),
- 'localweek' => array( '1', '지역주', 'LOCALWEEK' ),
- 'localdow' => array( '1', '지역요ì¼ìˆ«ìž', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'íŒë²ˆí˜¸', 'REVISIONID' ),
- 'revisionday' => array( '1', 'íŒì¼', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'íŒì¼2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'íŒì›”', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'íŒì›”1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'íŒë…„', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'íŒíƒ€ìž„스탬프', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'íŒì‚¬ìš©ìž', 'REVISIONUSER' ),
- 'plural' => array( '0', '복수:', '복수형:', 'PLURAL:' ),
- 'fullurl' => array( '0', '전체주소:', 'FULLURL:' ),
- 'fullurle' => array( '0', '전체주소E:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', '첫소문ìž:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', '첫대문ìž:', 'UCFIRST:' ),
- 'lc' => array( '0', '소문ìž:', 'LC:' ),
- 'uc' => array( '0', '대문ìž:', 'UC:' ),
- 'displaytitle' => array( '1', '제목표시', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', '현재버전', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', '주소ì¸ì½”딩:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', '책갈피ì¸ì½”딩', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', '현재타임스탬프', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', '지역타임스탬프', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#언어:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', '기본언어', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'ì´ë¦„공간문서수', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', '관리ìžìˆ˜', 'NUMBEROFADMINS' ),
- 'special' => array( '0', '특수기능', 'special' ),
- 'defaultsort' => array( '1', '기본정렬:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', '파ì¼ê²½ë¡œ:', '그림경로:', 'FILEPATH:' ),
- 'tag' => array( '0', '태그', 'tag' ),
- 'hiddencat' => array( '1', '__숨ì€ë¶„류__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', '분류문서수', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', '문서í¬ê¸°', 'PAGESIZE' ),
- 'index' => array( '1', '__색ì¸__', '__INDEX__' ),
- 'noindex' => array( '1', '__색ì¸ê±°ë¶€__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', '권한별사용ìžìˆ˜', '그룹별사용ìžìˆ˜', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', '날짜형ì‹', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#넘겨주기', '#REDIRECT' ),
+ 'notoc' => array( '0', '__목차숨김__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__목차보임__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__목차__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__단ë½íŽ¸ì§‘숨김__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__í—¤ë”숨김__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', '현재월1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', '현재월ì´ë¦„', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', '현재월ì´ë¦„소유격', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', '현재월ì´ë¦„약ìž', 'CURRENTMONTHABBREV' ),
+ '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' ),
+ 'localmonth' => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', '지역월1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', '지역월ì´ë¦„', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', '지역월ì´ë¦„소유격', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', '지역월ì´ë¦„약ìž', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', '지역ì¼', 'LOCALDAY' ),
+ 'localday2' => array( '1', '지역ì¼2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', '지역요ì¼', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', '지역년', 'LOCALYEAR' ),
+ 'localtime' => array( '1', '지역시분', '지역시ê°', 'LOCALTIME' ),
+ 'localhour' => array( '1', '지역시', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', '모든문서수', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', '문서수', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', '파ì¼ìˆ˜', '그림수', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', '사용ìžìˆ˜', '계정수', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', '활ë™ì¤‘ì¸ì‚¬ìš©ìžìˆ˜', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', '편집수', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', '조회수', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', '문서ì´ë¦„', 'PAGENAME' ),
+ 'pagenamee' => array( '1', '문서ì´ë¦„E', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ì´ë¦„공간', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ì´ë¦„공간E', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', '토론ì´ë¦„공간', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', '토론ì´ë¦„공간E', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', '본문서ì´ë¦„공간', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', '본문서ì´ë¦„공간E', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', '전체문서ì´ë¦„', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', '전체문서ì´ë¦„E', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', '하위문서ì´ë¦„', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', '하위문서ì´ë¦„E', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ìƒìœ„문서ì´ë¦„', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ìƒìœ„문서ì´ë¦„E', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', '토론문서ì´ë¦„', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', '토론문서ì´ë¦„E', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', '본문서ì´ë¦„', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', '본문서ì´ë¦„E', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', '메시지:', 'MSG:' ),
+ 'subst' => array( '0', '풀기:', 'SUBST:' ),
+ 'safesubst' => array( '0', '안전풀기:', 'SAFESUBST:' ),
+ 'img_thumbnail' => array( '1', '섬네ì¼', 'ì¸ë„¤ì¼', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', '섬네ì¼=$1', 'ì¸ë„¤ì¼=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', '오른쪽', 'right' ),
+ 'img_left' => array( '1', '왼쪽', 'left' ),
+ 'img_none' => array( '1', 'ì—†ìŒ', 'none' ),
+ 'img_width' => array( '1', '$1픽셀', '$1px' ),
+ 'img_center' => array( '1', '가운ë°', 'center', 'centre' ),
+ 'img_framed' => array( '1', '프레임', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', '프레임없ìŒ', 'frameless' ),
+ 'img_page' => array( '1', '문서=$1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'í…Œë‘리', 'border' ),
+ 'img_baseline' => array( '1', '밑줄', 'baseline' ),
+ 'img_sub' => array( '1', '아래첨ìž', 'sub' ),
+ 'img_super' => array( '1', '위첨ìž', 'super', 'sup' ),
+ 'img_top' => array( '1', '위', 'top' ),
+ 'img_middle' => array( '1', '중간', 'middle' ),
+ 'img_bottom' => array( '1', '아래', 'bottom' ),
+ 'img_link' => array( '1', 'ë§í¬=$1', 'link=$1' ),
+ 'sitename' => array( '1', '사ì´íŠ¸ì´ë¦„', 'SITENAME' ),
+ 'ns' => array( '0', 'ì´ë¦„:', 'ì´ë¦„공간:', 'NS:' ),
+ 'nse' => array( '0', 'ì´ë¦„E:', 'ì´ë¦„공간E:', 'NSE:' ),
+ 'localurl' => array( '0', '지역주소:', 'LOCALURL:' ),
+ 'localurle' => array( '0', '지역주소E:', 'LOCALURLE:' ),
+ 'server' => array( '0', '서버', 'SERVER' ),
+ 'servername' => array( '0', '서버ì´ë¦„', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', '스í¬ë¦½íŠ¸ê²½ë¡œ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', '스타ì¼ê²½ë¡œ', 'STYLEPATH' ),
+ 'grammar' => array( '0', '문법:', 'GRAMMAR:' ),
+ 'gender' => array( '0', '성별:', 'GENDER:' ),
+ 'currentweek' => array( '1', '현재주', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', '현재요ì¼ìˆ«ìž', 'CURRENTDOW' ),
+ 'localweek' => array( '1', '지역주', 'LOCALWEEK' ),
+ 'localdow' => array( '1', '지역요ì¼ìˆ«ìž', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'íŒë²ˆí˜¸', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'íŒì¼', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'íŒì¼2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'íŒì›”', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'íŒì›”1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'íŒë…„', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'íŒíƒ€ìž„스탬프', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'íŒì‚¬ìš©ìž', 'REVISIONUSER' ),
+ 'plural' => array( '0', '복수:', '복수형:', 'PLURAL:' ),
+ 'fullurl' => array( '0', '전체주소:', 'FULLURL:' ),
+ 'fullurle' => array( '0', '전체주소E:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', '첫소문ìž:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', '첫대문ìž:', 'UCFIRST:' ),
+ 'lc' => array( '0', '소문ìž:', 'LC:' ),
+ 'uc' => array( '0', '대문ìž:', 'UC:' ),
+ 'displaytitle' => array( '1', '제목표시', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', '현재버전', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', '주소ì¸ì½”딩:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', '책갈피ì¸ì½”딩', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', '현재타임스탬프', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', '지역타임스탬프', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#언어:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', '기본언어', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'ì´ë¦„공간문서수', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', '관리ìžìˆ˜', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', '특수기능', 'special' ),
+ 'defaultsort' => array( '1', '기본정렬:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', '파ì¼ê²½ë¡œ:', '그림경로:', 'FILEPATH:' ),
+ 'tag' => array( '0', '태그', 'tag' ),
+ 'hiddencat' => array( '1', '__숨ì€ë¶„류__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', '분류문서수', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', '문서í¬ê¸°', 'PAGESIZE' ),
+ 'index' => array( '1', '__색ì¸__', '__INDEX__' ),
+ 'noindex' => array( '1', '__색ì¸ê±°ë¶€__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', '권한별사용ìžìˆ˜', '그룹별사용ìžìˆ˜', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', '날짜형ì‹', 'formatdate', 'dateformat' ),
);
$bookstoreList = array(
@@ -655,19 +655,21 @@ $1',
'formerror' => '오류: ì–‘ì‹ì„ 제출할 수 없습니다.',
'badarticleerror' => 'ì§€ê¸ˆì˜ ëª…ë ¹ì€ ì´ ë¬¸ì„œì—서는 실행할 수 없습니다.',
'cannotdelete' => '"$1" 문서나 파ì¼ì„ 삭제할 수 없습니다. ì´ë¯¸ ì‚­ì œë˜ì—ˆì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
+'cannotdelete-title' => '"$1" 문서를 삭제할 수 없습니다.',
'badtitle' => 'ìž˜ëª»ëœ ì œëª©',
'badtitletext' => '문서 ì œëª©ì´ ìž˜ëª»ë˜ì—ˆê±°ë‚˜ 비어있습니다.',
-'perfcached' => 'ë‹¤ìŒ ìžë£ŒëŠ” ìºì‹œëœ 것ì´ë¯€ë¡œ 현재 ìƒí™©ì„ ë°˜ì˜í•˜ì§€ ì•Šì„ ìˆ˜ 있습니다.',
-'perfcachedts' => 'ë‹¤ìŒ ìžë£ŒëŠ” ìºì‹œëœ 것으로, $1ì— ë§ˆì§€ë§‰ìœ¼ë¡œ 갱신ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'perfcached' => 'ë‹¤ìŒ ìžë£ŒëŠ” ìºì‹œëœ 것ì´ë¯€ë¡œ 현재 ìƒí™©ì„ ë°˜ì˜í•˜ì§€ ì•Šì„ ìˆ˜ 있습니다. ìºì‹œì— 최대 {{PLURAL:$1|$1ê°œì˜ ê²°ê³¼}}ê°€ 있습니다.',
+'perfcachedts' => 'ë‹¤ìŒ ìžë£ŒëŠ” ìºì‹œëœ 것으로, $1ì— ë§ˆì§€ë§‰ìœ¼ë¡œ 갱신ë˜ì—ˆìŠµë‹ˆë‹¤. ìºì‹œì— 최대 {{PLURAL:$4|$4ê°œì˜ ê²°ê³¼}}ê°€ 있습니다.',
'querypage-no-updates' => 'ì´ ë¬¸ì„œì˜ ê°±ì‹ ì´ í˜„ìž¬ 비활성화ë˜ì–´ 있습니다. ìžë£Œê°€ ìž ì‹œ 갱신ë˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤.',
'wrong_wfQuery_params' => 'wfQuery()ì—ì„œ ìž˜ëª»ëœ ë§¤ê°œë³€ìˆ˜ ë°œìƒ<br />함수: $1<br />쿼리: $2',
'viewsource' => '내용 보기',
-'viewsourcefor' => '$1ì˜ ë¬¸ì„œ ë‚´ìš©',
+'viewsource-title' => '$1 문서 내용 보기',
'actionthrottled' => 'ë™ìž‘ 중지',
'actionthrottledtext' => 'ìŠ¤íŒ¸ì„ ë§‰ê¸° 위해 ì§§ì€ ì‹œê°„ ì•ˆì— ì´ ìž‘ì—…ì„ ë„ˆë¬´ ë§Žì´ í•˜ëŠ” ê²ƒì„ ë§‰ê³  있습니다.
ì œí•œì„ ë„˜ì—ˆìœ¼ë‹ˆ 몇 분 ë’¤ì— ìƒˆë¡œ ì‹œë„하세요.',
'protectedpagetext' => 'ì´ ë¬¸ì„œëŠ” 편집할 수 ì—†ë„ë¡ ë³´í˜¸ë˜ì–´ 있습니다.',
'viewsourcetext' => 'ë¬¸ì„œì˜ ì›ë³¸ì„ 보거나 복사할 수 있습니다:',
+'viewyourtext' => "ë‹¹ì‹ ì€ ì´ ë¬¸ì„œì— ë‚¨ê¸´ '''ë‹¹ì‹ ì˜ íŽ¸ì§‘''' ë‚´ìš©ì„ ë³´ê±°ë‚˜ 복사할 수 있습니다:",
'protectedinterface' => 'ì´ ë¬¸ì„œëŠ” 소프트웨어 ì¸í„°íŽ˜ì´ìŠ¤ì— ì“°ì´ëŠ” 문서로, 잠겨 있습니다.',
'editinginterface' => "'''경고''': 소프트웨어ì—ì„œ 사용하는 메시지 문서를 고치고 있습니다. ì´ê²ƒì€ 모든 사용ìžì—게 ì˜í–¥ì„ ë¼ì¹©ë‹ˆë‹¤. 번역ë˜ì§€ ì•Šì€ ë©”ì‹œì§€ë¥¼ 번역하려는 경우ì—는, [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]ì— ì°¸ì—¬í•˜ë©´ 메시지 ë²ˆì—­ì„ ë¯¸ë””ì–´ìœ„í‚¤ì— ì§ì ‘ ë°˜ì˜í•  수 있습니다.",
'sqlhidden' => '(SQL 쿼리 숨겨ì§)',
@@ -762,6 +764,7 @@ $2',
'emailconfirmlink' => 'ì´ë©”ì¼ ì£¼ì†Œ 확ì¸',
'invalidemailaddress' => 'ì´ë©”ì¼ ì£¼ì†Œì˜ í˜•ì‹ì´ 잘못ë˜ì–´ ì¸ì‹í•  수 없습니다.
ì •ìƒì ì¸ 형ì‹ì˜ ì´ë©”ì¼ì„ 입력하거나 ì¹¸ì„ ë¹„ì›Œ 주세요.',
+'cannotchangeemail' => 'ì´ ìœ„í‚¤ì—서는 ê³„ì •ì˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 바꿀 수 없습니다.',
'accountcreated' => '계정 만들어ì§',
'accountcreatedtext' => '‘$1’ ì‚¬ìš©ìž ê³„ì •ì´ ë§Œë“¤ì–´ì¡ŒìŠµë‹ˆë‹¤.',
'createaccount-title' => '{{SITENAME}} 계정 만들기',
@@ -777,6 +780,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHPì˜ mail() 함수ì—ì„œ ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'user-mail-no-addy' => '받는 ì´ì˜ ì´ë©”ì¼ ì£¼ì†Œê°€ 없다면 ì´ë©”ì¼ì„ 보낼 수 없습니다.',
# Change password dialog
'resetpass' => '비밀번호 바꾸기',
@@ -797,30 +801,45 @@ $2',
'resetpass-temp-password' => '임시 비밀번호:',
# Special:PasswordReset
-'passwordreset' => '암호 재설정',
-'passwordreset-text' => 'ì´ë©”ì¼ì„ 통해 계정 정보를 ë°›ì„ ìˆ˜ 있습니다. ì•„ëž˜ì˜ ì¹¸ì„ ì±„ì›Œì£¼ì„¸ìš”.',
-'passwordreset-legend' => '암호 초기화',
-'passwordreset-disabled' => 'ì´ ìœ„í‚¤ì—서는 암호 초기화 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않습니다.',
-'passwordreset-pretext' => '{{PLURAL:$1||ì•„ëž˜ì— í•œ 가지 정보를 입력해주십시오}}',
-'passwordreset-username' => '계정 ì´ë¦„:',
-'passwordreset-domain' => 'ë„ë©”ì¸:',
-'passwordreset-email' => 'ì´ë©”ì¼ ì£¼ì†Œ:',
-'passwordreset-emailtitle' => '{{SITENAME}} 계정 ìƒì„¸ ì •ë³´',
-'passwordreset-emailtext-ip' => 'IP 주소 $1ì„ ì‚¬ìš©í•˜ëŠ” 누군가(ì•„ë§ˆë„ ë‹¹ì‹ ì´), {{SITENAME}} ($4)ì˜ ë¹„ë°€ë²ˆí˜¸ 찾기를 요청하였습니다. ì´ ì´ë©”ì¼ ì£¼ì†Œì™€ ì—°ê´€ëœ ê³„ì •ì˜ ëª©ë¡ìž…니다:
+'passwordreset' => '암호 재설정',
+'passwordreset-text' => 'ì´ë©”ì¼ì„ 통해 계정 정보를 ë°›ì„ ìˆ˜ 있습니다. ì•„ëž˜ì˜ ì¹¸ì„ ì±„ì›Œì£¼ì„¸ìš”.',
+'passwordreset-legend' => '암호 초기화',
+'passwordreset-disabled' => 'ì´ ìœ„í‚¤ì—서는 암호 초기화 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않습니다.',
+'passwordreset-pretext' => '{{PLURAL:$1||ì•„ëž˜ì— í•œ 가지 정보를 입력해주십시오}}',
+'passwordreset-username' => '계정 ì´ë¦„:',
+'passwordreset-domain' => 'ë„ë©”ì¸:',
+'passwordreset-capture' => '발송 ê²°ê³¼ ì´ë©”ì¼ì„ 보시겠습니까?',
+'passwordreset-capture-help' => 'ì´ ìƒìžì— ì²´í¬í•˜ë©´ ì´ë©”ì¼ì´ ë°œì†¡ëœ ì¦‰ì‹œ ìž„ì‹œ 비밀번호가 담긴 ì´ë©”ì¼ì„ ë³¼ 수 있습니다.',
+'passwordreset-email' => 'ì´ë©”ì¼ ì£¼ì†Œ:',
+'passwordreset-emailtitle' => '{{SITENAME}} 계정 ìƒì„¸ ì •ë³´',
+'passwordreset-emailtext-ip' => 'IP 주소 $1ì„ ì‚¬ìš©í•˜ëŠ” 누군가(ì•„ë§ˆë„ ë‹¹ì‹ ì´), {{SITENAME}} ($4)ì˜ ë¹„ë°€ë²ˆí˜¸ 찾기를 요청하였습니다. ì´ ì´ë©”ì¼ ì£¼ì†Œì™€ ì—°ê´€ëœ ê³„ì •ì˜ ëª©ë¡ìž…니다:
$2
ì´ {{PLURAL:$3|ìž„ì‹œ 비밀번호}}ì˜ íš¨ë ¥ì€ $5ì¼ í›„ 만료ë©ë‹ˆë‹¤.
ì´ ë¹„ë°€ë²ˆí˜¸ë¡œ 로그ì¸í•œ 후 비밀번호를 변경하십시오. 만약 ë‹¹ì‹ ì´ ì•„ë‹Œ 다른 ì‚¬ëžŒì´ ìš”ì²­í•˜ì˜€ê±°ë‚˜, ì›ëž˜ì˜ 비밀번호를 기억해냈다면, ì´ ë©”ì‹œì§€ë¥¼ 무시하고 ì´ì „ì˜ ë¹„ë°€ë²ˆí˜¸ë¥¼ ê³„ì† ì‚¬ìš©í•  수 있습니다.',
-'passwordreset-emailtext-user' => '{{SITENAME}} ($4)ì˜ ì‚¬ìš©ìž $1ì´ ë¹„ë°€ë²ˆí˜¸ 찾기를 요청하였습니다. ì´ ì´ë©”ì¼ ì£¼ì†Œì™€ ì—°ê´€ëœ ê³„ì •ì˜ ëª©ë¡ìž…니다:
+'passwordreset-emailtext-user' => '{{SITENAME}} ($4)ì˜ ì‚¬ìš©ìž $1ì´ ë¹„ë°€ë²ˆí˜¸ 찾기를 요청하였습니다. ì´ ì´ë©”ì¼ ì£¼ì†Œì™€ ì—°ê´€ëœ ê³„ì •ì˜ ëª©ë¡ìž…니다:
$2
ì´ {{PLURAL:$3|ìž„ì‹œ 비밀번호}}ì˜ íš¨ë ¥ì€ $5ì¼ í›„ 만료ë©ë‹ˆë‹¤.
ì´ ë¹„ë°€ë²ˆí˜¸ë¡œ 로그ì¸í•œ 후 비밀번호를 변경하십시오. 만약 ë‹¹ì‹ ì´ ì•„ë‹Œ 다른 ì‚¬ëžŒì´ ìš”ì²­í•˜ì˜€ê±°ë‚˜, ì›ëž˜ì˜ 비밀번호를 기억해냈다면, ì´ ë©”ì‹œì§€ë¥¼ 무시하고 ì´ì „ì˜ ë¹„ë°€ë²ˆí˜¸ë¥¼ ê³„ì† ì‚¬ìš©í•  수 있습니다.',
-'passwordreset-emailelement' => '계정 ì´ë¦„: $1
+'passwordreset-emailelement' => '계정 ì´ë¦„: $1
임시 비밀번호: $2',
-'passwordreset-emailsent' => '비밀번호 찾기 ì´ë©”ì¼ì„ 보냈습니다.',
+'passwordreset-emailsent' => '비밀번호 찾기 ì´ë©”ì¼ì„ 보냈습니다.',
+'passwordreset-emailsent-capture' => '비밀번호 찾기 ì´ë©”ì¼ì´ 발송ë˜ì—ˆìœ¼ë©°, ì•„ëž˜ì— í‘œì‹œë˜ì–´ 있습니다.',
+'passwordreset-emailerror-capture' => '비밀번호 찾기 ì´ë©”ì¼ì´ ìƒì„±ë˜ì–´ ì•„ëž˜ì— í‘œì‹œë˜ì—ˆì§€ë§Œ 발송하는 ë°ì—는 실패했습니다: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail 주소 변경',
+'changeemail-header' => '계정 ë©”ì¼ ì£¼ì†Œ 변경',
+'changeemail-text' => 'ì´ë©”ì¼ ì£¼ì†Œë¥¼ 바꾸려면 ì´ ì–‘ì‹ì„ 채워주십시오. 변경 ë‚´ìš©ì„ í™•ì¸í•˜ê¸° 위해 ë‹¹ì‹ ì˜ ë¹„ë°€ë²ˆí˜¸ë¥¼ 입력해야합니다.',
+'changeemail-no-info' => 'ì´ íŠ¹ìˆ˜ ë¬¸ì„œì— ì§ì ‘ 접근하려면 반드시 로그ì¸í•´ì•¼ 합니다.',
+'changeemail-oldemail' => '현재 E-mail 주소 :',
+'changeemail-newemail' => '새 ì´ë©”ì¼ ì£¼ì†Œ:',
+'changeemail-none' => '(ì—†ìŒ)',
+'changeemail-submit' => 'ì´ë©”ì¼ ì£¼ì†Œ 변경',
+'changeemail-cancel' => '취소',
# Edit page toolbar
'bold_sample' => 'êµµì€ ê¸€ì”¨',
@@ -885,9 +904,6 @@ $1, ë˜ëŠ” [[{{MediaWiki:Grouppage-sysop}}|다른 관리ìž]]ì—게 ì°¨ë‹¨ì— ëŒ
ë‹¹ì‹ ì˜ í˜„ìž¬ IP 주소는 $3ì´ê³ , 차단 ID는 #$5입니다.
문ì˜í•  ë•Œì— ì´ ì •ë³´ë¥¼ ê°™ì´ ì•Œë ¤ì£¼ì„¸ìš”.",
'blockednoreason' => 'ì´ìœ ë¥¼ 입력하지 ì•ŠìŒ',
-'blockedoriginalsource' => "ì•„ëž˜ì— '''$1'''ì˜ ë‚´ìš©ì´ ë‚˜ì™€ 있습니다:",
-'blockededitsource' => "ì•„ëž˜ì— '''$1'''ì—ì„œì˜ '''ë‹¹ì‹ ì˜ íŽ¸ì§‘'''ì´ ë‚˜ì™€ 있습니다:",
-'whitelistedittitle' => '편집하려면 ë¡œê·¸ì¸ í•„ìš”',
'whitelistedittext' => '문서를 편집하려면 $1해야 합니다.',
'confirmedittext' => '문서를 고치려면 ì´ë©”ì¼ ì¸ì¦ 절차가 필요합니다. [[Special:Preferences|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì—ì„œ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하고 ì´ë©”ì¼ ì£¼ì†Œ ì¸ì¦ì„ í•´ 주시기 ë°”ëžë‹ˆë‹¤.',
'nosuchsectiontitle' => 'ì¹¸ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ',
@@ -963,7 +979,8 @@ $1, ë˜ëŠ” [[{{MediaWiki:Grouppage-sysop}}|다른 관리ìž]]ì—게 ì°¨ë‹¨ì— ëŒ
'copyrightwarning2' => "{{SITENAME}}ì—ì„œì˜ ëª¨ë“  기여는 다른 사용ìžê°€ 편집, 수정, 삭제할 수 있다는 ì ì„ 유ì˜í•´ 주세요. 만약 ì—¬ê¸°ì— ë™ì˜í•˜ì§€ 않는다면, 문서를 저장하지 ë§ì•„ 주세요.<br />
ë˜í•œ, ì§ì ‘ 작성했거나 í¼ë¸”릭 ë„ë©”ì¸ê³¼ ê°™ì€ ìžìœ  문서ì—ì„œ 가져왔다는 ê²ƒì„ ë³´ì¦í•´ì•¼ 합니다 (ìžì„¸í•œ ë‚´ìš©ì— ëŒ€í•´ì„œëŠ” $1 문서를 ì½ì–´ 주세요).
'''ì €ìž‘ê¶Œì´ ìžˆëŠ” ë‚´ìš©ì„ í—ˆê°€ ì—†ì´ ì €ìž¥í•˜ì§€ 마세요!'''",
-'longpageerror' => "'''오류: ë¬¸ì„œì˜ í¬ê¸°ê°€ $1킬로바ì´íŠ¸ë¡œì„œ 가능한 최대 í¬ê¸°ì¸ $2킬로바ì´íŠ¸ë³´ë‹¤ í½ë‹ˆë‹¤. 저장할 수 없습니다.'''",
+'longpageerror' => "'''오류: ë¬¸ì„œì˜ í¬ê¸°ê°€ {{PLURAL:$1|$1킬로바ì´íŠ¸}}ë¡œ 최대 í¬ê¸°ì¸ {{PLURAL:$2|$2킬로바ì´íŠ¸}}보다 í½ë‹ˆë‹¤.'''
+저장할 수 없습니다.",
'readonlywarning' => "'''주ì˜: ë°ì´í„°ë² ì´ìŠ¤ê°€ 관리를 위해 잠겨 있습니다. ë”°ë¼ì„œ 문서를 편집한 ë‚´ìš©ì„ ì§€ê¸ˆ 저장할 수 없습니다.
편집 ë‚´ìš©ì„ ë³µì‚¬ 붙여넣기 ë“±ì„ ì‚¬ìš©í•˜ì—¬ ì¼ë‹¨ 다른 ê³³ì— ì €ìž¥í•œ 후, ë‚˜ì¤‘ì— ë‹¤ì‹œ ì‹œë„í•´ 주세요.'''
@@ -1129,8 +1146,6 @@ $2ê°œ 보다 ì ê²Œ ì¨ì•¼ 하지만 ì§€ê¸ˆì€ $1개를 ì“°ê³  있습니다.",
'revdelete-unsuppress' => 'ë³µêµ¬ëœ íŒì— 대한 ì œí•œì„ í•´ì œ',
'revdelete-log' => 'ì´ìœ :',
'revdelete-submit' => 'ì„ íƒí•œ {{PLURAL:$1|íŒ}}ì— ì ìš©',
-'revdelete-logentry' => '[[$1]]ì˜ íŒì˜ ë³´ì´ê¸° ì„¤ì •ì„ ë³€ê²½í•¨',
-'logdelete-logentry' => '[[$1]]ì˜ ë¡œê·¸ ë³´ì´ê¸° ì„¤ì •ì„ ë³€ê²½í•¨',
'revdelete-success' => "'''íŒì˜ ë³´ì´ê¸° ì„¤ì •ì´ ì„±ê³µì ìœ¼ë¡œ 변경ë˜ì—ˆìŠµë‹ˆë‹¤.'''",
'revdelete-failure' => "'''특정 íŒ ë³´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì§€ 못했습니다:'''
$1",
@@ -1142,15 +1157,6 @@ $1",
'revdel-restore-visible' => 'ê³µê°œëœ íŒ',
'pagehist' => '문서 역사',
'deletedhist' => 'ì‚­ì œëœ ì—­ì‚¬',
-'revdelete-content' => 'ë‚´ìš©',
-'revdelete-summary' => '편집 요약',
-'revdelete-uname' => 'ì‚¬ìš©ìž ì´ë¦„',
-'revdelete-restricted' => '관리ìžì—게 ì œí•œì„ ì ìš©í•¨',
-'revdelete-unrestricted' => '관리ìžì— 대한 ì œí•œì„ í•´ì œí•¨',
-'revdelete-hid' => '$1ì„ ìˆ¨ê¹€',
-'revdelete-unhid' => '$1ì„ ìˆ¨ê¹€ 해제함',
-'revdelete-log-message' => '$2ê°œì˜ íŒì— 대해 $1',
-'logdelete-log-message' => '$2ê°œì˜ ë¡œê·¸ì— ëŒ€í•´ $1',
'revdelete-hide-current' => '$1 $2 íŒì„ 숨기는 ë„중 오류 ë°œìƒ: ì´ íŒì€ 현재 íŒìž…니다.
현재 íŒì€ 숨길 수 없습니다.',
'revdelete-show-no-access' => '$1 $2 íŒì„ ë³´ì´ëŠ” ë° ì˜¤ë¥˜ ë°œìƒ: ì´ íŒì€ "제한"으로 표시ë˜ì–´ 있습니다.
@@ -1307,12 +1313,14 @@ $1",
'prefs-rc' => '최근 바뀜',
'prefs-watchlist' => '주시문서 목ë¡',
'prefs-watchlist-days' => '주시문서 목ë¡ì—ì„œ ë³¼ 날짜 수:',
-'prefs-watchlist-days-max' => '최대 7ì¼',
+'prefs-watchlist-days-max' => '최대 $1{{PLURAL:$1|ì¼}}',
'prefs-watchlist-edits' => '주시문서 목ë¡ì—ì„œ ë³¼ 편집 수:',
'prefs-watchlist-edits-max' => '최대 개수: 1000',
'prefs-watchlist-token' => '주시문서 토í°:',
'prefs-misc' => '기타',
'prefs-resetpass' => '비밀번호 바꾸기',
+'prefs-changeemail' => 'ì´ë©”ì¼ ì£¼ì†Œ 바꾸기',
+'prefs-setemail' => 'ì´ë©”ì¼ ì£¼ì†Œ 설정하기',
'prefs-email' => 'ì´ë©”ì¼ ì„¤ì •',
'prefs-rendering' => '문서 ë³´ì´ê¸° 설정',
'saveprefs' => '저장',
@@ -1372,6 +1380,7 @@ $1",
'yourrealname' => '실명:',
'yourlanguage' => '언어:',
'yourvariant' => '언어 변종:',
+'prefs-help-variant' => '위키 ë‚´ìš©ì„ í‘œì‹œí•  ë•Œ 사용할 언어 변종ì´ë‚˜ ì² ìž ì²´ê³„ë¥¼ ì„ íƒí•´ì£¼ì„¸ìš”.',
'yournick' => '새 서명:',
'prefs-help-signature' => '토론 ë¬¸ì„œì— ê¸€ì„ ì“´ 후ì—는 ë§ˆì§€ë§‰ì— ì„œëª…ì„ í•´ì•¼ 합니다. “<nowiki>~~~~</nowiki>†기호를 추가하면 서명과 글 작성 ì‹œê°ì´ ìžë™ìœ¼ë¡œ ìž…ë ¥ë©ë‹ˆë‹¤.',
'badsig' => 'ì„œëª…ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤. HTML 태그를 확ì¸í•´ì£¼ì„¸ìš”.',
@@ -1412,7 +1421,7 @@ $1",
'userrights-lookup-user' => 'ì‚¬ìš©ìž ê¶Œí•œ 관리',
'userrights-user-editname' => '계정 ì´ë¦„:',
'editusergroup' => 'ì‚¬ìš©ìž ê·¸ë£¹ 편집',
-'editinguser' => "'''[[User:$1|$1]]'''([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) 사용ìžì˜ 권한 변경",
+'editinguser' => "ì‚¬ìš©ìž '''[[User:$1|$1]]''' $2ì˜ ê¶Œí•œ 변경",
'userrights-editusergroup' => 'ì‚¬ìš©ìž ê·¸ë£¹ 편집',
'saveusergroups' => 'ì‚¬ìš©ìž ê¶Œí•œ 저장',
'userrights-groupsmember' => '현재 권한:',
@@ -1506,13 +1515,13 @@ $1",
'right-autopatrol' => 'ìžì‹ ì˜ íŽ¸ì§‘ì„ ìžë™ìœ¼ë¡œ 검토',
'right-patrolmarks' => '최근 바뀜ì—ì„œ 검토 표시를 보기',
'right-unwatchedpages' => '주시ë˜ì§€ 않는 문서 ëª©ë¡ ë³´ê¸°',
-'right-trackback' => '트랙백 보내기',
'right-mergehistory' => 'ë¬¸ì„œì˜ ì—­ì‚¬ë¥¼ 합침',
'right-userrights' => '모든 사용ìžì˜ 권한 ì¡°ì •',
'right-userrights-interwiki' => '다른 ìœ„í‚¤ì˜ ì‚¬ìš©ìž ê¶Œí•œì„ ì¡°ì •',
'right-siteadmin' => 'ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 잠그거나 잠금 í•´ì œ',
'right-override-export-depth' => '5단계로 ë§í¬ëœ 문서를 í¬í•¨í•˜ì—¬ 문서를 내보내기',
'right-sendemail' => '다른 사용ìžì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°',
+'right-passwordreset' => '암호 재설정 ì´ë©”ì¼ì„ 보기',
# User rights log
'rightslog' => 'ì‚¬ìš©ìž ê¶Œí•œ 기ë¡',
@@ -1546,16 +1555,17 @@ $1",
'action-suppressionlog' => '비공개 ê¸°ë¡ ë³´ê¸°',
'action-block' => 'ì´ ì‚¬ìš©ìžë¥¼ 편집하지 못하ë„ë¡ ì°¨ë‹¨',
'action-protect' => 'ì´ ë¬¸ì„œì˜ ë³´í˜¸ ì„¤ì •ì„ ë³€ê²½í•˜ê¸°',
+'action-rollback' => '특정 문서를 마지막으로 편집한 사용ìžì˜ 모든 íŽ¸ì§‘ì„ ê°„íŽ¸í•˜ê²Œ ë˜ëŒë¦¬ê¸°',
'action-import' => '다른 위키ì—ì„œ ì´ ë¬¸ì„œë¥¼ 가져오기',
'action-importupload' => 'íŒŒì¼ ì˜¬ë¦¬ê¸°ë¥¼ 통해 문서를 가져올',
'action-patrol' => '다른 사용ìžì˜ íŽ¸ì§‘ì„ ê²€í† ëœ ê²ƒìœ¼ë¡œ 표시하기',
'action-autopatrol' => 'ìžì‹ ì˜ íŽ¸ì§‘ì„ ê²€í† ëœ ê²ƒìœ¼ë¡œ 표시할',
'action-unwatchedpages' => '주시ë˜ì§€ 않는 문서 ëª©ë¡ ë³´ê¸°',
-'action-trackback' => '트랙백 보내기',
'action-mergehistory' => 'ì´ ë¬¸ì„œì˜ ì—­ì‚¬ 합치기',
'action-userrights' => '모든 사용ìžì˜ ê¶Œí•œì„ ì¡°ì •',
'action-userrights-interwiki' => '다른 ìœ„í‚¤ì˜ ì‚¬ìš©ìž ê¶Œí•œì„ ì¡°ì •',
'action-siteadmin' => 'ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 잠그거나 잠금 해제하기',
+'action-sendemail' => 'ì´ë©”ì¼ ë³´ë‚´ê¸°',
# Recent changes
'nchanges' => '$1개 바뀜',
@@ -1587,6 +1597,7 @@ $1",
'number_of_watching_users_pageview' => '[$1ëª…ì´ ì£¼ì‹œí•˜ê³  있ìŒ]',
'rc_categories' => 'ë‹¤ìŒ ë¶„ë¥˜ë¡œ 제한 (‘|’로 구분)',
'rc_categories_any' => '모ë‘',
+'rc-change-size-new' => '변경 후 $1 {{PLURAL:$1|ë°”ì´íŠ¸}}',
'newsectionsummary' => '새 주제: /* $1 */',
'rc-enhanced-expand' => '세부 ê¸°ë¡ ë³´ê¸° (ìžë°”스í¬ë¦½íŠ¸ í•„ìš”)',
'rc-enhanced-hide' => 'ì„¸ë¶€ê¸°ë¡ ìˆ¨ê¸°ê¸°',
@@ -1640,6 +1651,7 @@ $1",
'ignorewarnings' => '모든 경고 무시하기',
'minlength1' => 'íŒŒì¼ ì´ë¦„ì€ ì ì–´ë„ 1ê¸€ìž ì´ìƒì´ì–´ì•¼ 합니다.',
'illegalfilename' => 'íŒŒì¼ ì´ë¦„ "$1"ì—는 문서 제목으로 허용ë˜ì§€ 않는 글ìžê°€ í¬í•¨ë˜ì–´ 있습니다. ì´ë¦„ì„ ë°”ê¾¸ì–´ 다시 ì‹œë„í•´ 주세요.',
+'filename-toolong' => 'íŒŒì¼ ì´ë¦„ì€ 240ë°”ì´íŠ¸ë¥¼ ë„˜ì„ ìˆ˜ 없습니다.',
'badfilename' => 'íŒŒì¼ ì´ë¦„ì´ â€˜$1’(으)ë¡œ 바뀌었습니다.',
'filetype-mime-mismatch' => 'íŒŒì¼ í™•ìž¥ìž ".$1"와 ì´ íŒŒì¼ì˜ MIME($2)ê°€ ì¼ì¹˜í•˜ì§€ 않습니다.',
'filetype-badmime' => '‘$1’ MIMEì„ ê°€ì§„ 파ì¼ì€ 올릴 수 없습니다.',
@@ -1746,6 +1758,41 @@ $1',
'upload-unknown-size' => 'í¬ê¸°ë¥¼ ì•Œ 수 ì—†ìŒ',
'upload-http-error' => 'HTTP 오류 ë°œìƒ: $1',
+# File backend
+'backend-fail-stream' => '$1 파ì¼ì„ 스트리ë°í•  수 없습니다.',
+'backend-fail-backup' => '$1 파ì¼ì„ 백업할 수 없습니다.',
+'backend-fail-notexists' => '$1 파ì¼ì´ 존재하지 않습니다.',
+'backend-fail-hashes' => 'ë¹„êµ í•´ì‹œê°’ì„ ì–»ì§€ 못했습니다.',
+'backend-fail-notsame' => '$1 파ì¼ê³¼ ê°™ì€ ì´ë¦„ì„ ê°€ì§„ 다른 파ì¼ì´ 존재합니다.',
+'backend-fail-invalidpath' => '$1 경로가 유효하지 않습니다.',
+'backend-fail-delete' => '$1 파ì¼ì„ 삭제할 수 없습니다.',
+'backend-fail-alreadyexists' => '$1 파ì¼ì´ ì´ë¯¸ 존재합니다.',
+'backend-fail-store' => '$1 파ì¼ì„ $2 ê²½ë¡œì— ì €ìž¥í•˜ì§€ 못했습니다.',
+'backend-fail-copy' => '$1 파ì¼ì„ $2 ê²½ë¡œì— ë³µì‚¬í•˜ì§€ 못했습니다.',
+'backend-fail-move' => '$1 파ì¼ì„ $2 경로로 ì´ë™í•˜ì§€ 못했습니다.',
+'backend-fail-opentemp' => 'ìž„ì‹œ 파ì¼ì„ ì—´ 수 없습니다.',
+'backend-fail-writetemp' => 'ìž„ì‹œ 파ì¼ì„ 쓸 수 없습니다.',
+'backend-fail-closetemp' => 'ìž„ì‹œ 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다.',
+'backend-fail-read' => '$1 파ì¼ì„ ì½ì„ 수 없습니다.',
+'backend-fail-create' => '$1 파ì¼ì„ 쓸 수 없습니다.',
+'backend-fail-readonly' => '‘$1’ 저장 백엔드가 ì½ê¸° 전용입니다. ìžì„¸í•œ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: “$2â€',
+'backend-fail-synced' => 'íŒŒì¼ "$1"ì€ ë‚´ë¶€ 저장 ë°±ì—”ë“œì— ë¶ˆì•ˆì •í•œ ìƒíƒœë¡œ 있습니다.',
+'backend-fail-connect' => "'$1' 저장 ë°±ì—”ë“œì— ì ‘ì†í•˜ì§€ 못했습니다.",
+'backend-fail-internal' => '"$1" 저장 ë°±ì—”ë“œì— ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'backend-fail-contenttype' => '"$1"ì— ì €ìž¥í•˜ê¸° 위한 파ì¼ì˜ ë‚´ìš© ìœ í˜•ì„ íŒë³„하지 못했습니다.',
+'backend-fail-batchsize' => '저장 백엔드ì—ì„œ $1ê°œì˜ íŒŒì¼ {{PLURAL:$1|ìž‘ì—…}}ì´ ìŒ“ì—¬ 있습니다; 한계는 $2개입니다.',
+
+# Lock manager
+'lockmanager-notlocked' => '‘$1’ ê²½ë¡œì˜ ìž ê¸ˆì„ í’€ 수 없습니다. 해당 경로는 잠겨 있지 않습니다.',
+'lockmanager-fail-closelock' => '‘$1â€™ì— ëŒ€í•œ 잠금 파ì¼ì„ 닫지 못했습니다.',
+'lockmanager-fail-deletelock' => '‘$1â€™ì— ëŒ€í•œ 잠금 파ì¼ì„ 삭제하지 못했습니다.',
+'lockmanager-fail-acquirelock' => '‘$1â€™ì— ëŒ€í•œ ìž ê¸ˆì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤.',
+'lockmanager-fail-openlock' => '‘$1â€™ì— ëŒ€í•œ 잠금 파ì¼ì„ 열지 못했습니다.',
+'lockmanager-fail-releaselock' => '‘$1â€™ì— ëŒ€í•œ ìž ê¸ˆì„ í•´ì œí•˜ì§€ 못했습니다.',
+'lockmanager-fail-db-bucket' => 'ë°ì´í„°ë² ì´ìŠ¤ì˜ 버킷 $1ì˜ ìž ê¸ˆì„ í’€ì§€ 못했습니다.',
+'lockmanager-fail-db-release' => 'ë°ì´í„°ë² ì´ìŠ¤ $1ì˜ ìž ê¸ˆì„ í’€ì§€ 못했습니다.',
+'lockmanager-fail-svr-release' => '서버 $1ì˜ ìž ê¸ˆì„ í’€ì§€ 못했습니다.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ZIP íŒŒì¼ ê²€ì‚¬ë¥¼ 위해 파ì¼ì„ 여는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
'zip-wrong-format' => '지정한 파ì¼ì´ ZIP 파ì¼ì´ 아닙니다.',
@@ -1762,6 +1809,7 @@ $1',
'uploadstash-badtoken' => 'ì´ ë™ìž‘ì„ ìˆ˜í–‰í•˜ëŠ” ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. 편집 토í°ì´ 만료ë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 보십시오.',
'uploadstash-errclear' => '파ì¼ì„ 제거하는 ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤.',
'uploadstash-refresh' => 'íŒŒì¼ ëª©ë¡ì„ 새로고침',
+'invalid-chunk-offset' => 'ì²­í¬ ì˜¤í”„ì…‹ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
# img_auth script messages
'img-auth-accessdenied' => 'ì ‘ê·¼ 거부ë¨',
@@ -1866,23 +1914,24 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'filerevert-badversion' => '주어진 타임스탬프를 가진 파ì¼ì˜ 로컬 ë²„ì „ì´ ì—†ìŠµë‹ˆë‹¤.',
# File deletion
-'filedelete' => '$1 삭제하기',
-'filedelete-legend' => 'íŒŒì¼ ì‚­ì œí•˜ê¸°',
-'filedelete-intro' => "'''[[Media:$1|$1]]''' 파ì¼ê³¼ 모든 역사를 삭제합니다.",
-'filedelete-intro-old' => "'''[[Media:$1|$1]]''' 파ì¼ì˜ [$4 $2 $3] ë²„ì „ì„ ì‚­ì œí•©ë‹ˆë‹¤.",
-'filedelete-comment' => 'ì´ìœ :',
-'filedelete-submit' => '삭제',
-'filedelete-success' => "'''$1''' 파ì¼ì„ 삭제했습니다.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' 파ì¼ì˜ $2 $3 ë²„ì „ì„ ì‚­ì œí–ˆìŠµë‹ˆë‹¤.",
-'filedelete-nofile' => "'''$1''' 파ì¼ì´ 존재하지 않습니다.",
-'filedelete-nofile-old' => "해당 ì¡°ê±´ì— ë§žëŠ” 과거 '''$1''' 파ì¼ì´ 존재하지 않습니다.",
-'filedelete-otherreason' => '다른 ì´ìœ /추가ì ì¸ ì´ìœ :',
-'filedelete-reason-otherlist' => '다른 ì´ìœ ',
-'filedelete-reason-dropdown' => '*ì¼ë°˜ì ì¸ ì‚­ì œ ì´ìœ 
+'filedelete' => '$1 삭제하기',
+'filedelete-legend' => 'íŒŒì¼ ì‚­ì œí•˜ê¸°',
+'filedelete-intro' => "'''[[Media:$1|$1]]''' 파ì¼ê³¼ 모든 역사를 삭제합니다.",
+'filedelete-intro-old' => "'''[[Media:$1|$1]]''' 파ì¼ì˜ [$4 $2 $3] ë²„ì „ì„ ì‚­ì œí•©ë‹ˆë‹¤.",
+'filedelete-comment' => 'ì´ìœ :',
+'filedelete-submit' => '삭제',
+'filedelete-success' => "'''$1''' 파ì¼ì„ 삭제했습니다.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' 파ì¼ì˜ $2 $3 ë²„ì „ì„ ì‚­ì œí–ˆìŠµë‹ˆë‹¤.",
+'filedelete-nofile' => "'''$1''' 파ì¼ì´ 존재하지 않습니다.",
+'filedelete-nofile-old' => "해당 ì¡°ê±´ì— ë§žëŠ” 과거 '''$1''' 파ì¼ì´ 존재하지 않습니다.",
+'filedelete-otherreason' => '다른 ì´ìœ /추가ì ì¸ ì´ìœ :',
+'filedelete-reason-otherlist' => '다른 ì´ìœ ',
+'filedelete-reason-dropdown' => '*ì¼ë°˜ì ì¸ ì‚­ì œ ì´ìœ 
** 저작권 침해
** ì¤‘ë³µëœ íŒŒì¼',
-'filedelete-edit-reasonlist' => 'ì‚­ì œ ì´ìœ  편집',
-'filedelete-maintenance' => 'ì ê²€ 중ì—는 ìž„ì‹œì ìœ¼ë¡œ 삭제와 복구를 í•  수 없습니다.',
+'filedelete-edit-reasonlist' => 'ì‚­ì œ ì´ìœ  편집',
+'filedelete-maintenance' => 'ì ê²€ 중ì—는 ìž„ì‹œì ìœ¼ë¡œ 삭제와 복구를 í•  수 없습니다.',
+'filedelete-maintenance-title' => '파ì¼ì„ 삭제할 수 없습니다',
# MIME search
'mimesearch' => 'MIME 검색',
@@ -1981,6 +2030,8 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'wantedpages' => '필요한 문서 목ë¡',
'wantedpages-badtitle' => '문서 ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤: $1',
'wantedfiles' => '필요한 íŒŒì¼ ëª©ë¡',
+'wantedfiletext-cat' => 'ë‹¤ìŒ íŒŒì¼ì€ ì“°ì´ê³ ëŠ” 있지만 없는 파ì¼ìž…니다. 외부 ì €ìž¥ì†Œì— ìžˆëŠ” 파ì¼ì€ 실제로는 있지만 여기 ì˜¬ë¼ ìžˆì„ ìˆ˜ 있습니다. 그런 오류는 <del>삭제선</del>ì´ ê·¸ì–´ì§ˆ 것입니다. ë˜í•œ 없는 파ì¼ì„ í¬í•¨í•˜ê³  있는 문서는 [[:$1]]ì— ì˜¬ë¼ ìžˆìŠµë‹ˆë‹¤.',
+'wantedfiletext-nocat' => 'ë‹¤ìŒ íŒŒì¼ì€ ì“°ì´ê³ ëŠ” 있지만 없는 파ì¼ìž…니다. 외부 ì €ìž¥ì†Œì— ìžˆëŠ” 파ì¼ì€ 실제로는 있지만 여기 ì˜¬ë¼ ìžˆì„ ìˆ˜ 있습니다. 그런 오류는 <del>삭제선</del>ì´ ê·¸ì–´ì§ˆ 것입니다.',
'wantedtemplates' => '필요한 í‹€ 목ë¡',
'mostlinked' => '가장 ë§Žì´ ì—°ê²°ëœ ë¬¸ì„œ 목ë¡',
'mostlinkedcategories' => '가장 ë§Žì´ ì—°ê²°ëœ ë¶„ë¥˜ 목ë¡',
@@ -1989,6 +2040,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'mostimages' => '가장 ë§Žì´ ì‚¬ìš©ëœ íŒŒì¼ ëª©ë¡',
'mostrevisions' => '가장 ë§Žì´ íŽ¸ì§‘ëœ ë¬¸ì„œ 목ë¡',
'prefixindex' => 'ì ‘ë‘ì–´ì— ë”°ë¥¸ 문서 목ë¡',
+'prefixindex-namespace' => 'ì ‘ë‘ì–´ê°€ 있는 모든 문서 ($1 ì´ë¦„공간)',
'shortpages' => 'ì§§ì€ ë¬¸ì„œ 목ë¡',
'longpages' => '긴 문서 목ë¡',
'deadendpages' => '막다른 문서 목ë¡',
@@ -2005,7 +2057,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'listusers-editsonly' => '기여가 있는 사용ìžë§Œ 보기',
'listusers-creationsort' => '계정 등ë¡ì¼ 순으로 ì •ë ¬',
'usereditcount' => '편집 $1개',
-'usercreated' => '$1 $2ì— ê³„ì • ìƒì„±',
+'usercreated' => '$1 $2ì— ê³„ì • {{GENDER:$3|ìƒì„±ë¨}}',
'newpages' => '새 문서 목ë¡',
'newpages-username' => 'ì´ë¦„:',
'ancientpages' => 'ì˜¤ëž˜ëœ ë¬¸ì„œ 목ë¡',
@@ -2098,12 +2150,8 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'activeusers-noresult' => '사용ìžê°€ 없습니다.',
# Special:Log/newusers
-'newuserlogpage' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡',
-'newuserlogpagetext' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡ìž…니다.',
-'newuserlog-byemail' => 'ì´ë©”ì¼ë¡œ 보낸 암호',
-'newuserlog-create-entry' => '새 사용ìž',
-'newuserlog-create2-entry' => '$1 ê³„ì •ì„ ìƒˆë¡œ 만듦',
-'newuserlog-autocreate-entry' => 'ê³„ì •ì´ ìžë™ìœ¼ë¡œ 만들어졌습니다.',
+'newuserlogpage' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡',
+'newuserlogpagetext' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡ìž…니다.',
# Special:ListGroupRights
'listgrouprights' => 'ì‚¬ìš©ìž ê¶Œí•œ 목ë¡',
@@ -2132,7 +2180,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'emailpagetext' => 'ì´ ì‚¬ìš©ìžê°€ 환경 ì„¤ì •ì— ì˜¬ë°”ë¥¸ ì´ë©”ì¼ ì£¼ì†Œë¥¼ ì ì—ˆë‹¤ë©´, 아래 ì–‘ì‹ì„ 통해 ì´ë©”ì¼ì„ 보낼 수 있습니다.
ì´ë©”ì¼ì„ ë°›ì€ ì‚¬ìš©ìžê°€ 바로 답장할 수 있ë„ë¡ í•˜ê¸° 위해 ë‹¹ì‹ ì´ [[Special:Preferences|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì— ì ì€ ì´ë©”ì¼ ì£¼ì†Œê°€ "발신ìž" ì •ë³´ì— ë“¤ì–´ê°‘ë‹ˆë‹¤. ë”°ë¼ì„œ 수신ìžê°€ 당신ì—게 ì§ì ‘ ë‹µìž¥ì„ ë³´ë‚¼ 수 있습니다.',
'usermailererror' => 'ë©”ì¼ ê°ì²´ì—ì„œ 오류 ë°œìƒ:',
-'defemailsubject' => '{{SITENAME}} ì´ë©”ì¼',
+'defemailsubject' => '"$1" 사용ìžê°€ 보낸 {{SITENAME}} ì´ë©”ì¼',
'usermaildisabled' => 'ì‚¬ìš©ìž ì´ë©”ì¼ ë¹„í™œì„±í™”ë¨',
'usermaildisabledtext' => 'ë‹¹ì‹ ì€ ì´ ìœ„í‚¤ì—ì„œ 다른 사용ìžì—게 ë©”ì¼ì„ 보낼 수 없습니다',
'noemailtitle' => 'ì´ë©”ì¼ ì£¼ì†Œ ì—†ìŒ',
@@ -2186,7 +2234,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'watchmethod-list' => '최근 íŽ¸ì§‘ì„ í™•ì¸í•˜ê³ ìž ì£¼ì‹œëœ ë¬¸ì„œ 확ì¸',
'watchlistcontains' => '문서 $1개를 주시하고 있습니다.',
'iteminvalidname' => '"$1" í•­ëª©ì— ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. ì´ë¦„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤...',
-'wlnote' => "다ìŒì€ 최근 '''$2'''시간 ë™ì•ˆ ë°”ë€ ë¬¸ì„œ '''$1'''ê°œ 입니다.",
+'wlnote' => "다ìŒì€ 최근 '''$2'''시간 ë™ì•ˆ ë°”ë€ ë¬¸ì„œ '''$1'''ê°œ 입니다. ($3 $4 기준)",
'wlshowlast' => '최근 $1 시간 $2 ì¼ ë˜ëŠ” $3 ë™ì•ˆì— ë°”ë€ ë¬¸ì„œ',
'watchlist-options' => '주시문서 ëª©ë¡ ì„¤ì •',
@@ -2249,8 +2297,6 @@ $UNWATCHURL
'actioncomplete' => '명령 완료',
'actionfailed' => '명령 실패',
'deletedtext' => '‘$1’ 문서를 삭제했습니다. 최근 ì‚­ì œ 기ë¡ì€ $2ì— ìžˆìŠµë‹ˆë‹¤.',
-'deletedarticle' => '사용ìžê°€ [[$1]] 문서를 삭제하였습니다.',
-'suppressedarticle' => '"[[$1]]"를 숨김',
'dellogpage' => 'ì‚­ì œ 기ë¡',
'dellogpagetext' => 'ì•„ëž˜ì˜ ëª©ë¡ì€ ìµœê·¼ì— ì‚­ì œëœ ë¬¸ì„œë“¤ìž…ë‹ˆë‹¤.',
'deletionlog' => 'ì‚­ì œ 기ë¡',
@@ -2295,7 +2341,10 @@ $UNWATCHURL
'unprotectedarticle' => '‘[[$1]]’ 문서를 보호 해제함',
'movedarticleprotection' => 'ë¬¸ì„œì˜ ë³´í˜¸ ì„¤ì •ì„ "[[$2]]"ì—ì„œ "[[$1]]"으로 옮김',
'protect-title' => '‘$1’ 보호하기',
+'protect-title-notallowed' => '‘$1’ ë¬¸ì„œì˜ ë³´í˜¸ 수준 보기',
'prot_1movedto2' => '[[$1]] 문서를 [[$2]] 문서로 ì´ë™í•¨',
+'protect-badnamespace-title' => '보호할 수 없는 ì´ë¦„공간',
+'protect-badnamespace-text' => 'ì´ ì´ë¦„ê³µê°„ì— ìžˆëŠ” 문서는 보호할 수 없습니다.',
'protect-legend' => '보호 확ì¸',
'protectcomment' => 'ì´ìœ :',
'protectexpiry' => '보호 기간:',
@@ -2314,6 +2363,7 @@ $UNWATCHURL
'protect-level-sysop' => '관리ìžë§Œ 가능',
'protect-summary-cascade' => '연쇄ì ',
'protect-expiring' => '$1 (UTC)ì— ë§Œë£Œ',
+'protect-expiring-local' => '$1ì— í•´ì œ',
'protect-expiry-indefinite' => '무기한',
'protect-cascade' => 'ì—°ì‡„ì  ë³´í˜¸ - ì´ ë¬¸ì„œì—ì„œ 사용ë˜ëŠ” 다른 문서를 함께 보호합니다.',
'protect-cantedit' => 'ì´ ë¬¸ì„œì˜ ë³´í˜¸ ì„¤ì •ì„ ë°”ê¿€ ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
@@ -2373,7 +2423,6 @@ $UNWATCHURL
'undeletereset' => '초기화',
'undeleteinvert' => 'ì„ íƒ ë°˜ì „',
'undeletecomment' => 'ì´ìœ :',
-'undeletedarticle' => '"[[$1]]" 문서를 복구하였습니다.',
'undeletedrevisions' => 'íŒ $1개를 복구했습니다',
'undeletedrevisions-files' => 'íŒ $1개와 íŒŒì¼ $2개를 복구했습니다.',
'undeletedfiles' => 'íŒŒì¼ $1개를 복구했습니다',
@@ -2383,6 +2432,7 @@ $UNWATCHURL
[[Special:Log/delete|ì‚­ì œ 기ë¡]]ì—ì„œ ìµœê·¼ì˜ ì‚­ì œ/복구 기ë¡ì„ ë³¼ 수 있습니다.",
'undelete-header' => 'ìµœê·¼ì— ì‚­ì œí•œ ë¬¸ì„œì— ëŒ€í•œ 기ë¡ì€ [[Special:Log/delete|여기]]ì—ì„œ ë³¼ 수 있습니다.',
+'undelete-search-title' => 'ì‚­ì œëœ ë¬¸ì„œ 찾기',
'undelete-search-box' => 'ì‚­ì œëœ ë¬¸ì„œ 찾기',
'undelete-search-prefix' => '다ìŒìœ¼ë¡œ 시작하는 문서 보기:',
'undelete-search-submit' => '찾기',
@@ -2392,6 +2442,7 @@ $UNWATCHURL
'undelete-cleanup-error' => '사용ë˜ì§€ 않는 ë³´ì¡´ëœ íŒŒì¼ "$1"ì„ ì‚­ì œí•˜ëŠ” ë° ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
'undelete-missing-filearchive' => 'ë°ì´í„°ë² ì´ìŠ¤ì— 존재하지 않기 ë•Œë¬¸ì— íŒŒì¼ ë³´ì¡´ IDê°€ $1ì¸ íŒŒì¼ì„ 복구할 수 없습니다.
ì´ë¯¸ 복구ë˜ì—ˆì„ 수 있습니다.',
+'undelete-error' => '문서 복구 중 오류',
'undelete-error-short' => 'íŒŒì¼ ë³µêµ¬ 오류: $1',
'undelete-error-long' => '파ì¼ì„ 복구하는 중 오류 ë°œìƒ:
@@ -2511,6 +2562,7 @@ $1',
'blocklist-userblocks' => 'ê³„ì •ì— ëŒ€í•œ 차단 숨기기',
'blocklist-tempblocks' => 'ê¸°í•œì´ ì •í•´ì§„ ì°¨ë‹¨ì„ ìˆ¨ê¸°ê¸°',
'blocklist-addressblocks' => 'ë‹¹ì¼ IP ì°¨ë‹¨ì„ ìˆ¨ê¸°ê¸°',
+'blocklist-rangeblocks' => 'ê´‘ì—­ ì°¨ë‹¨ì„ ìˆ¨ê¸°ê¸°',
'blocklist-timestamp' => '날짜/ì‹œê°',
'blocklist-target' => '차단 대ìƒ',
'blocklist-expiry' => '차단 기한',
@@ -2533,6 +2585,7 @@ $1',
'unblocklink' => '차단 해제',
'change-blocklink' => '차단 설정 변경',
'contribslink' => '기여',
+'emaillink' => 'ì´ë©”ì¼ ë³´ë‚´ê¸°',
'autoblocker' => 'ë‹¹ì‹ ì˜ IP 주소는 ìµœê·¼ì— "[[User:$1|$1]]" 사용ìžê°€ 사용하였기 ë•Œë¬¸ì— ìžë™ìœ¼ë¡œ 차단ë˜ì—ˆìŠµë‹ˆë‹¤.
$1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'blocklogpage' => '차단 기ë¡',
@@ -2657,9 +2710,6 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'movepage-page-moved' => '‘$1’ 문서를 ‘$2’ 문서로 ì´ë™í–ˆìŠµë‹ˆë‹¤.',
'movepage-page-unmoved' => '‘$1’ 문서를 ‘$2’ 문서로 ì´ë™í•  수 없습니다.',
'movepage-max-pages' => '문서를 최대 $1ê°œ ì´ë™í–ˆìŠµë‹ˆë‹¤. 나머지 문서는 ìžë™ ì´ë™í•˜ì§€ 않습니다.',
-'1movedto2' => '[[$1]] 문서를 [[$2]](으)로 옮김',
-'1movedto2_redir' => '[[$1]] 문서를 [[$2]](으)ë¡œ 옮기면서 넘겨주기를 ë®ì–´ 씀',
-'move-redirect-suppressed' => '넘겨주기가 ìƒì„±ë˜ì§€ ì•ŠìŒ',
'movelogpage' => 'ì´ë™ 기ë¡',
'movelogpagetext' => '아래는 옮겨진 ë¬¸ì„œì˜ ëª©ë¡ìž…니다.',
'movesubpage' => '{{PLURAL:$1}}하위 문서',
@@ -2673,7 +2723,7 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
ì´ë™í•˜ë ¤ëŠ” 제목으로 ëœ â€˜[[:$1]]’ 문서가 ì´ë¯¸ 존재합니다.
삭제하고 ì´ë™í• ê¹Œìš”?',
'delete_and_move_confirm' => '네. 문서를 삭제합니다',
-'delete_and_move_reason' => '문서를 ì´ë™í•˜ê¸° 위해 삭제함',
+'delete_and_move_reason' => '"[[$1]]"ì—ì„œ 문서를 ì´ë™í•˜ê¸° 위해 삭제함',
'selfmove' => 'ì´ë™í•˜ë ¤ëŠ” ì œëª©ì´ ì›ëž˜ 제목과 같습니다. ì´ë™í•  수 없습니다.',
'immobile-source-namespace' => '"$1" ì´ë¦„ê³µê°„ì— ì†í•œ 문서는 ì´ë™ì‹œí‚¬ 수 없습니다.',
'immobile-target-namespace' => '"$1" ì´ë¦„ê³µê°„ì— ì†í•œ 문서는 ì´ë™ì‹œí‚¬ 수 없습니다.',
@@ -2702,9 +2752,11 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
문서를 내보내려면, 내보내려는 문서 ì œëª©ì„ í•œ ì¤„ì— í•˜ë‚˜ì”© 입력해주세요. 그리고 ë¬¸ì„œì˜ ì „ì²´ 역사가 필요한지, í˜¹ì€ í˜„ìž¬ ë²„ì „ë§Œì´ í•„ìš”í•œì§€ë¥¼ ì„ íƒí•´ 주세요.
특정 문서를 내보내려면, 예를 들어 ‘[[{{MediaWiki:Mainpage}}]]’ 문서를 내보내려면 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ë§í¬ë¥¼ 사용할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
+'exportall' => '모든 문서를 내보내기',
'exportcuronly' => '현재 버전만 í¬í•¨í•˜ê³ , ì „ì²´ 역사는 í¬í•¨í•˜ì§€ ì•ŠìŒ',
'exportnohistory' => "----
'''주ì˜:''' ì „ì²´ 문서 역사를 내보내는 ê¸°ëŠ¥ì€ ì„±ëŠ¥ 문제로 ì¸í•´ 비활성ë˜ì–´ 있습니다.",
+'exportlistauthors' => 'ê°ê° 문서마다 모든 기여ìžì˜ 목ë¡ì„ í¬í•¨',
'export-submit' => '내보내기',
'export-addcattext' => 'ë¶„ë¥˜ì— ìžˆëŠ” 문서 추가:',
'export-addcat' => '추가',
@@ -2736,6 +2788,8 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'thumbnail_error' => '섬네ì¼ì„ 만드는 중 오류 ë°œìƒ: $1',
'djvu_page_error' => 'DjVu 페ì´ì§€ 범위 벗어남',
'djvu_no_xml' => 'DjVu 파ì¼ì˜ XML 정보를 ì½ì„ 수 ì—†ìŒ',
+'thumbnail-temp-create' => 'ìž„ì‹œ ì„¬ë„¤ì¼ íŒŒì¼ì„ ìƒì„±í•  수 없습니다.',
+'thumbnail-dest-create' => 'ëŒ€ìƒ ê²½ë¡œì— ì„¬ë„¤ì¼ì„ 저장할 수 없습니다.',
'thumbnail_invalid_params' => 'ì„¬ë„¤ì¼ ë§¤ê°œë³€ìˆ˜ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.',
'thumbnail_dest_directory' => '새 ëª©ì  ë””ë ‰í† ë¦¬ë¥¼ ìƒì„±í•  수 없습니다.',
'thumbnail_image-type' => '해당 íŒŒì¼ í˜•ì‹ì€ 지ì›í•˜ì§€ 않습니다',
@@ -2783,6 +2837,11 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'import-upload' => 'XML ë°ì´í„° 올리기',
'import-token-mismatch' => '세션 ë°ì´í„°ê°€ ì†ì‹¤ë˜ì—ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„해주세요.',
'import-invalid-interwiki' => '해당 위키ì—ì„œ 문서를 가져올 수 없습니다.',
+'import-error-edit' => '현재 문서를 편집할 ê¶Œí•œì´ ì—†ê¸° ë•Œë¬¸ì— â€˜$1’ 문서를 불러올 수 없습니다.',
+'import-error-create' => '현재 문서를 ìƒì„±í•  ê¶Œí•œì´ ì—†ê¸° ë•Œë¬¸ì— â€˜$1’ 문서를 불러올 수 없습니다.',
+'import-error-interwiki' => '문서 "$1"ì€ ì œëª©ì´ ë°”ê¹¥ 고리(ì¸í„°ìœ„키)용으로 할당ë˜ì–´ 있기 ë•Œë¬¸ì— ê°€ì ¸ì˜¤ì§€ 않습니다.',
+'import-error-special' => '문서 "$1"ì€ íŠ¹ìˆ˜ ë¬¸ì„œì— ì†í•´ 있기 ë•Œë¬¸ì— ê°€ì ¸ì˜¤ì§€ 않습니다.',
+'import-error-invalid' => '문서 "$1"ì€ ì œëª©ì´ ìž˜ëª»ë˜ì—ˆê¸° ë•Œë¬¸ì— ê°€ì ¸ì˜¤ì§€ 않습니다.',
# Import log
'importlogpage' => '가져오기 기ë¡',
@@ -2792,73 +2851,86 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'import-logentry-interwiki' => '$1 문서를 다른 위키ì—ì„œ 가져왔습니다.',
'import-logentry-interwiki-detail' => '$2ì—ì„œ íŒ $1개를 가져옴',
+# JavaScriptTest
+'javascripttest' => 'ìžë°”스í¬ë¦½íŠ¸ 테스트',
+'javascripttest-disabled' => 'ì´ ê¸°ëŠ¥ì€ ë¹„í™œì„±í™”ë¼ ìžˆìŠµë‹ˆë‹¤.',
+'javascripttest-title' => '$1 테스트 실행',
+'javascripttest-pagetext-noframework' => 'ì´ íŽ˜ì´ì§€ëŠ” ìžë°”스í¬ë¦½íŠ¸ 테스트를 실행하기 위한 ìš©ë„ë¡œ 할당ë˜ì–´ 있습니다.',
+'javascripttest-pagetext-unknownframework' => '실험용 í”„ë ˆìž„ì›Œí¬ "$1"를 ì•Œ 수 없습니다.',
+'javascripttest-pagetext-frameworks' => 'ë‹¤ìŒ ì‹¤í—˜ìš© í”„ë ˆìž„ì›Œí¬ ì¤‘ 하나를 ì„ íƒí•˜ì‹­ì‹œì˜¤: $1',
+'javascripttest-pagetext-skins' => '실험할 ìŠ¤í‚¨ì„ ê³ ë¥´ì‹­ì‹œì˜¤:',
+'javascripttest-qunit-intro' => 'mediawiki.orgì˜ [$1 테스트 설명서]를 참고하십시오.',
+'javascripttest-qunit-heading' => '미디어위키 ìžë°”스í¬ë¦½íŠ¸ QUnit 실험군',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'ë‚´ ì‚¬ìš©ìž ë¬¸ì„œ',
-'tooltip-pt-anonuserpage' => '현재 사용하는 IPì˜ ì‚¬ìš©ìž ë¬¸ì„œ',
-'tooltip-pt-mytalk' => '내 토론 문서',
-'tooltip-pt-anontalk' => '현재 사용하는 IP를 위한 ì‚¬ìš©ìž í† ë¡  문서',
-'tooltip-pt-preferences' => 'ì‚¬ìš©ìž í™˜ê²½ 설정',
-'tooltip-pt-watchlist' => '주시문서 목ë¡',
-'tooltip-pt-mycontris' => '내가 편집한 글',
-'tooltip-pt-login' => 'ê¼­ 로그ì¸í•´ì•¼ 하는 ê²ƒì€ ì•„ë‹ˆì§€ë§Œ, 로그ì¸ì„ 권장합니다.',
-'tooltip-pt-anonlogin' => 'ê¼­ 필요한 ê²ƒì€ ì•„ë‹ˆì§€ë§Œ, 로그ì¸ì„ 하면 편리한 ì ì´ 많습니다.',
-'tooltip-pt-logout' => '로그아웃',
-'tooltip-ca-talk' => 'ë¬¸ì„œì˜ ë‚´ìš©ì— ëŒ€í•œ 토론 문서',
-'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 ì „ì— ë¯¸ë¦¬ë³´ê¸°ë¥¼ í•´ 주세요.',
-'tooltip-ca-addsection' => '칸 추가하기',
-'tooltip-ca-viewsource' => '문서가 잠겨 있습니다. ë¬¸ì„œì˜ ì†ŒìŠ¤ë§Œ ë³¼ 수 있습니다.',
-'tooltip-ca-history' => 'ë¬¸ì„œì˜ ê³¼ê±° 버전들',
-'tooltip-ca-protect' => '문서 보호하기',
-'tooltip-ca-unprotect' => 'ì´ ë¬¸ì„œì˜ ë³´í˜¸ ì„¤ì •ì„ ë³€ê²½í•˜ê¸°',
-'tooltip-ca-delete' => '문서 삭제하기',
-'tooltip-ca-undelete' => 'ì‚­ì œëœ ë¬¸ì„œ 복구하기',
-'tooltip-ca-move' => '문서 ì´ë™í•˜ê¸°',
-'tooltip-ca-watch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì— 추가합니다.',
-'tooltip-ca-unwatch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì—ì„œ 제거합니다.',
-'tooltip-search' => '{{SITENAME}} 찾기',
-'tooltip-search-go' => 'ì´ ì´ë¦„ì˜ ë¬¸ì„œê°€ 존재하면 ê·¸ 문서로 바로가기',
-'tooltip-search-fulltext' => 'ì´ ë¬¸ìžì—´ì´ í¬í•¨ëœ 문서 찾기',
-'tooltip-p-logo' => '대문 방문하기',
-'tooltip-n-mainpage' => '대문으로',
-'tooltip-n-mainpage-description' => '대문으로',
-'tooltip-n-portal' => '프로ì íŠ¸ 소개, ë‹¹ì‹ ì´ í•  수 있는 것, 사ì´íŠ¸ë§µ',
-'tooltip-n-currentevents' => 'ìµœê·¼ì˜ ì†Œì‹ì„ 봅니다.',
-'tooltip-n-recentchanges' => 'ì´ ìœ„í‚¤ì—ì„œ 최근 ë°”ë€ ë‚´ìš©ì˜ ëª©ë¡',
-'tooltip-n-randompage' => 'ìž„ì˜ ë¬¸ì„œë¡œ 갑니다.',
-'tooltip-n-help' => 'ë„움ë§',
-'tooltip-t-whatlinkshere' => '여기로 ì—°ê²°ëœ ëª¨ë“  ë¬¸ì„œì˜ ëª©ë¡',
-'tooltip-t-recentchangeslinked' => '여기로 ì—°ê²°ëœ ëª¨ë“  ë¬¸ì„œì˜ ë³€ê²½ ë‚´ì—­',
-'tooltip-feed-rss' => 'ì´ ë¬¸ì„œì˜ RSS 피드입니다.',
-'tooltip-feed-atom' => 'ì´ ë¬¸ì„œì˜ Atom 피드입니다.',
-'tooltip-t-contributions' => 'ì´ ì‚¬ìš©ìžì˜ 기여 목ë¡ì„ 봅니다.',
-'tooltip-t-emailuser' => 'ì´ ì‚¬ìš©ìžì—게 ì´ë©”ì¼ì„ 보냅니다.',
-'tooltip-t-upload' => '파ì¼ì„ 올립니다.',
-'tooltip-t-specialpages' => '모든 특수 ë¬¸ì„œì˜ ëª©ë¡',
-'tooltip-t-print' => 'ì´ ë¬¸ì„œì˜ ì¸ì‡„ìš© 버전',
-'tooltip-t-permalink' => 'ë¬¸ì„œì˜ í˜„ìž¬ ë²„ì „ì— ëŒ€í•œ 고유ë§í¬',
-'tooltip-ca-nstab-main' => '문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-user' => 'ì‚¬ìš©ìž ë¬¸ì„œ ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-media' => '미디어 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-special' => 'ì´ê²ƒì€ 특수 문서로, 편집할 수 없습니다.',
-'tooltip-ca-nstab-project' => '프로ì íŠ¸ 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-image' => 'íŒŒì¼ ë¬¸ì„œ ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-mediawiki' => '시스템 메시지 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-template' => 'í‹€ 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-help' => 'ë„ì›€ë§ ë¬¸ì„œ ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-ca-nstab-category' => '분류 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
-'tooltip-minoredit' => '사소한 편집으로 표시하기',
-'tooltip-save' => '편집 ë‚´ìš©ì„ ì €ìž¥í•˜ê¸°',
-'tooltip-preview' => '편집 미리 보기. 저장하기 ì „ì— ê¼­ 미리 보기를 í•´ 주세요.',
-'tooltip-diff' => 'ì›ëž˜ì˜ 문서와 현재 편집하는 문서를 비êµí•˜ê¸°',
-'tooltip-compareselectedversions' => 'ì´ ë¬¸ì„œì—ì„œ ì„ íƒí•œ ë‘ ë²„ì „ê°„ì˜ ì°¨ì´ë¥¼ 비êµ',
-'tooltip-watch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì— 추가',
-'tooltip-recreate' => '문서를 편집하는 중 ì‚­ì œë˜ì–´ë„ 새로 만들기',
-'tooltip-upload' => 'íŒŒì¼ ì˜¬ë¦¬ê¸° 시작',
-'tooltip-rollback' => '"ë˜ëŒë¦¬ê¸°" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ ë¬¸ì„œì— ëŒ€í•œ 마지막 기여ìžì˜ íŽ¸ì§‘ì„ ëª¨ë‘ ë˜ëŒë¦´ 수 있습니다.',
-'tooltip-undo' => '"편집 취소" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ íŽ¸ì§‘ì´ ë˜ëŒë ¤ì§€ê³ , ì°¨ì´ë³´ê¸° ê¸°ëŠ¥ì´ ë¯¸ë¦¬ë³´ê¸° 형ì‹ìœ¼ë¡œ 나타납니다.
+'tooltip-pt-userpage' => 'ë‚´ ì‚¬ìš©ìž ë¬¸ì„œ',
+'tooltip-pt-anonuserpage' => '현재 사용하는 IPì˜ ì‚¬ìš©ìž ë¬¸ì„œ',
+'tooltip-pt-mytalk' => '내 토론 문서',
+'tooltip-pt-anontalk' => '현재 사용하는 IP를 위한 ì‚¬ìš©ìž í† ë¡  문서',
+'tooltip-pt-preferences' => 'ì‚¬ìš©ìž í™˜ê²½ 설정',
+'tooltip-pt-watchlist' => '주시문서 목ë¡',
+'tooltip-pt-mycontris' => '내가 편집한 글',
+'tooltip-pt-login' => 'ê¼­ 로그ì¸í•´ì•¼ 하는 ê²ƒì€ ì•„ë‹ˆì§€ë§Œ, 로그ì¸ì„ 권장합니다.',
+'tooltip-pt-anonlogin' => 'ê¼­ 필요한 ê²ƒì€ ì•„ë‹ˆì§€ë§Œ, 로그ì¸ì„ 하면 편리한 ì ì´ 많습니다.',
+'tooltip-pt-logout' => '로그아웃',
+'tooltip-ca-talk' => 'ë¬¸ì„œì˜ ë‚´ìš©ì— ëŒ€í•œ 토론 문서',
+'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 ì „ì— ë¯¸ë¦¬ë³´ê¸°ë¥¼ í•´ 주세요.',
+'tooltip-ca-addsection' => '칸 추가하기',
+'tooltip-ca-viewsource' => '문서가 잠겨 있습니다. ë¬¸ì„œì˜ ì†ŒìŠ¤ë§Œ ë³¼ 수 있습니다.',
+'tooltip-ca-history' => 'ë¬¸ì„œì˜ ê³¼ê±° 버전들',
+'tooltip-ca-protect' => '문서 보호하기',
+'tooltip-ca-unprotect' => 'ì´ ë¬¸ì„œì˜ ë³´í˜¸ ì„¤ì •ì„ ë³€ê²½í•˜ê¸°',
+'tooltip-ca-delete' => '문서 삭제하기',
+'tooltip-ca-undelete' => 'ì‚­ì œëœ ë¬¸ì„œ 복구하기',
+'tooltip-ca-move' => '문서 ì´ë™í•˜ê¸°',
+'tooltip-ca-watch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì— 추가합니다.',
+'tooltip-ca-unwatch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì—ì„œ 제거합니다.',
+'tooltip-search' => '{{SITENAME}} 찾기',
+'tooltip-search-go' => 'ì´ ì´ë¦„ì˜ ë¬¸ì„œê°€ 존재하면 ê·¸ 문서로 바로가기',
+'tooltip-search-fulltext' => 'ì´ ë¬¸ìžì—´ì´ í¬í•¨ëœ 문서 찾기',
+'tooltip-p-logo' => '대문 방문하기',
+'tooltip-n-mainpage' => '대문으로',
+'tooltip-n-mainpage-description' => '대문으로',
+'tooltip-n-portal' => '프로ì íŠ¸ 소개, ë‹¹ì‹ ì´ í•  수 있는 것, 사ì´íŠ¸ë§µ',
+'tooltip-n-currentevents' => 'ìµœê·¼ì˜ ì†Œì‹ì„ 봅니다.',
+'tooltip-n-recentchanges' => 'ì´ ìœ„í‚¤ì—ì„œ 최근 ë°”ë€ ë‚´ìš©ì˜ ëª©ë¡',
+'tooltip-n-randompage' => 'ìž„ì˜ ë¬¸ì„œë¡œ 갑니다.',
+'tooltip-n-help' => 'ë„움ë§',
+'tooltip-t-whatlinkshere' => '여기로 ì—°ê²°ëœ ëª¨ë“  ë¬¸ì„œì˜ ëª©ë¡',
+'tooltip-t-recentchangeslinked' => '여기로 ì—°ê²°ëœ ëª¨ë“  ë¬¸ì„œì˜ ë³€ê²½ ë‚´ì—­',
+'tooltip-feed-rss' => 'ì´ ë¬¸ì„œì˜ RSS 피드입니다.',
+'tooltip-feed-atom' => 'ì´ ë¬¸ì„œì˜ Atom 피드입니다.',
+'tooltip-t-contributions' => 'ì´ ì‚¬ìš©ìžì˜ 기여 목ë¡ì„ 봅니다.',
+'tooltip-t-emailuser' => 'ì´ ì‚¬ìš©ìžì—게 ì´ë©”ì¼ì„ 보냅니다.',
+'tooltip-t-upload' => '파ì¼ì„ 올립니다.',
+'tooltip-t-specialpages' => '모든 특수 ë¬¸ì„œì˜ ëª©ë¡',
+'tooltip-t-print' => 'ì´ ë¬¸ì„œì˜ ì¸ì‡„ìš© 버전',
+'tooltip-t-permalink' => 'ë¬¸ì„œì˜ í˜„ìž¬ ë²„ì „ì— ëŒ€í•œ 고유ë§í¬',
+'tooltip-ca-nstab-main' => '문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-user' => 'ì‚¬ìš©ìž ë¬¸ì„œ ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-media' => '미디어 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-special' => 'ì´ê²ƒì€ 특수 문서로, 편집할 수 없습니다.',
+'tooltip-ca-nstab-project' => '프로ì íŠ¸ 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-image' => 'íŒŒì¼ ë¬¸ì„œ ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-mediawiki' => '시스템 메시지 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-template' => 'í‹€ 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-help' => 'ë„ì›€ë§ ë¬¸ì„œ ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-ca-nstab-category' => '분류 문서 ë‚´ìš©ì„ ë´…ë‹ˆë‹¤.',
+'tooltip-minoredit' => '사소한 편집으로 표시하기',
+'tooltip-save' => '편집 ë‚´ìš©ì„ ì €ìž¥í•˜ê¸°',
+'tooltip-preview' => '편집 미리 보기. 저장하기 ì „ì— ê¼­ 미리 보기를 í•´ 주세요.',
+'tooltip-diff' => 'ì›ëž˜ì˜ 문서와 현재 편집하는 문서를 비êµí•˜ê¸°',
+'tooltip-compareselectedversions' => 'ì´ ë¬¸ì„œì—ì„œ ì„ íƒí•œ ë‘ ë²„ì „ê°„ì˜ ì°¨ì´ë¥¼ 비êµ',
+'tooltip-watch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì— 추가',
+'tooltip-watchlistedit-normal-submit' => '항목 제거하기',
+'tooltip-watchlistedit-raw-submit' => '주시문서 ëª©ë¡ ê°±ì‹ í•˜ê¸°',
+'tooltip-recreate' => '문서를 편집하는 중 ì‚­ì œë˜ì–´ë„ 새로 만들기',
+'tooltip-upload' => 'íŒŒì¼ ì˜¬ë¦¬ê¸° 시작',
+'tooltip-rollback' => '"ë˜ëŒë¦¬ê¸°" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ ë¬¸ì„œì— ëŒ€í•œ 마지막 기여ìžì˜ íŽ¸ì§‘ì„ ëª¨ë‘ ë˜ëŒë¦´ 수 있습니다.',
+'tooltip-undo' => '"편집 취소" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ íŽ¸ì§‘ì´ ë˜ëŒë ¤ì§€ê³ , ì°¨ì´ë³´ê¸° ê¸°ëŠ¥ì´ ë¯¸ë¦¬ë³´ê¸° 형ì‹ìœ¼ë¡œ 나타납니다.
편집 ìš”ì•½ì— ì´ íŽ¸ì§‘ì„ ì™œ ë˜ëŒë¦¬ëŠ”ì§€ì— ëŒ€í•œ ì´ìœ ë¥¼ 쓸 수 있습니다.',
-'tooltip-preferences-save' => '환경 설정 저장하기',
-'tooltip-summary' => 'ì§§ì€ íŽ¸ì§‘ ìš”ì•½ì„ ì ì–´ì£¼ì„¸ìš”',
+'tooltip-preferences-save' => '환경 설정 저장하기',
+'tooltip-summary' => 'ì§§ì€ íŽ¸ì§‘ ìš”ì•½ì„ ì ì–´ì£¼ì„¸ìš”',
# Stylesheets
'common.css' => '/** ì´ CSS ì„¤ì •ì€ ëª¨ë“  ìŠ¤í‚¨ì— ì ìš©ë©ë‹ˆë‹¤ */',
@@ -2933,9 +3005,6 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
# Patrol log
'patrol-log-page' => '검토 기ë¡',
'patrol-log-header' => '문서 ê²€í† ì— ëŒ€í•œ 기ë¡ìž…니다.',
-'patrol-log-line' => '$2 ë¬¸ì„œì˜ $1ì„ ê²€í† í•¨ $3',
-'patrol-log-auto' => '(ìžë™)',
-'patrol-log-diff' => 'ì œ$1번 íŒ',
'log-show-hide-patrol' => '검토 기ë¡ì„ $1',
# Image deletion
@@ -2961,11 +3030,11 @@ $1',
'file-info' => 'íŒŒì¼ í¬ê¸°: $1, MIME 종류: $2',
'file-info-size' => '$1 × $2 픽셀, íŒŒì¼ í¬ê¸°: $3, MIME 종류: $4',
'file-info-size-pages' => '$1 × $2 픽셀, íŒŒì¼ í¬ê¸°: $3, MIME 형ì‹: $4, $5{{PLURAL:$5|쪽}}',
-'file-nohires' => '<small>최대 í•´ìƒë„입니다.</small>',
+'file-nohires' => '최대 í•´ìƒë„입니다.',
'svg-long-desc' => 'SVG 파ì¼, 실제 í¬ê¸° $1 × $2 픽셀, íŒŒì¼ í¬ê¸° $3',
'show-big-image' => '최대 í•´ìƒë„',
-'show-big-image-preview' => '<small>미리 보기 í¬ê¸°: $1.</small>',
-'show-big-image-other' => '<small>다른 í•´ìƒë„: $1.</small>',
+'show-big-image-preview' => '미리 보기 í¬ê¸°: $1.',
+'show-big-image-other' => '다른 {{PLURAL:$2|í•´ìƒë„}}: $1.',
'show-big-image-size' => '$1 × $2 픽셀',
'file-info-gif-looped' => '반복ë¨',
'file-info-gif-frames' => '$1 프레임',
@@ -2985,6 +3054,13 @@ $1',
'bydate' => '날짜',
'sp-newimages-showfrom' => '$1 $2부터 올ë¼ì˜¨ íŒŒì¼ ëª©ë¡ ë³´ê¸°',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '$1ì´ˆ',
+'minutes' => '$1분',
+'hours' => '$1시간',
+'days' => '$1ì¼',
+'ago' => '$1 ì „',
+
# Bad image list
'bad_image_list' => '형ì‹ì€ 아래와 같습니다.
@@ -3483,13 +3559,6 @@ $5
'scarytranscludefailed' => '[$1 í‹€ì„ ë¶ˆëŸ¬ì˜¤ëŠ” ë°ì— 실패했습니다]',
'scarytranscludetoolong' => '[URLì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤]',
-# Trackbacks
-'trackbackbox' => 'ì´ ë¬¸ì„œì— ë‹¬ë¦° 트랙백:<br />
-$1',
-'trackbackremove' => '([$1 삭제])',
-'trackbacklink' => '트랙백',
-'trackbackdeleteok' => 'íŠ¸ëž™ë°±ì„ ì‚­ì œí–ˆìŠµë‹ˆë‹¤.',
-
# Delete conflict
'deletedwhileediting' => "'''주ì˜''': ë‹¹ì‹ ì´ ì´ ë¬¸ì„œë¥¼ íŽ¸ì§‘í•˜ë˜ ì¤‘ì— ì´ ë¬¸ì„œê°€ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤.",
'confirmrecreate' => '[[User:$1|$1]] 사용ìž([[User talk:$1|토론]])ê°€ ë‹¹ì‹ ì´ íŽ¸ì§‘í•˜ëŠ” ë„ì¤‘ì— ë¬¸ì„œë¥¼ 삭제했습니다. ì‚­ì œ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다:
@@ -3570,6 +3639,9 @@ $1',
'watchlisttools-edit' => '주시문서 ëª©ë¡ ë³´ê¸°/편집하기',
'watchlisttools-raw' => '주시문서 ëª©ë¡ ì§ì ‘ 편집하기',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|토론]])',
+
# Core parser functions
'unknown_extension_tag' => '알 수 없는 확장 기능 태그 "$1"',
'duplicate-defaultsort' => '\'\'\'경고:\'\'\' 기본 ì •ë ¬ 키 "$2"ê°€ ì´ì „ì˜ ê¸°ë³¸ ì •ë ¬ 키 "$1"를 ë®ì–´ì“°ê³  있습니다.',
@@ -3625,8 +3697,7 @@ $1',
'specialpages' => '특수 문서 목ë¡',
'specialpages-note' => '----
* ì¼ë°˜ 특수 문서.
-* <span class="mw-specialpagerestricted">ì œí•œëœ íŠ¹ìˆ˜ 문서.</span>
-* <span class="mw-specialpagecached">ìºì‹œë˜ëŠ” 특수 문서.</span>',
+* <span class="mw-specialpagerestricted">ì œí•œëœ íŠ¹ìˆ˜ 문서.</span>',
'specialpages-group-maintenance' => '관리용 목ë¡',
'specialpages-group-other' => '다른 특수 문서',
'specialpages-group-login' => 'ë¡œê·¸ì¸ / 등ë¡',
@@ -3668,13 +3739,16 @@ $1',
'tags-hitcount' => '$1개 바뀜',
# Special:ComparePages
-'comparepages' => '문서 비êµ',
-'compare-selector' => 'ë¬¸ì„œì˜ íŠ¹ì •íŒ ë¹„êµ',
-'compare-page1' => '첫 번째 문서',
-'compare-page2' => 'ë‘ ë²ˆì§¸ 문서',
-'compare-rev1' => '첫 번째 íŒ',
-'compare-rev2' => 'ë‘ ë²ˆì§¸ íŒ',
-'compare-submit' => '비êµí•˜ê¸°',
+'comparepages' => '문서 비êµ',
+'compare-selector' => 'ë¬¸ì„œì˜ íŠ¹ì •íŒ ë¹„êµ',
+'compare-page1' => '첫 번째 문서',
+'compare-page2' => 'ë‘ ë²ˆì§¸ 문서',
+'compare-rev1' => '첫 번째 íŒ',
+'compare-rev2' => 'ë‘ ë²ˆì§¸ íŒ',
+'compare-submit' => '비êµí•˜ê¸°',
+'compare-invalid-title' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'compare-title-not-exists' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ 문서가 존재하지 않습니다.',
+'compare-revision-not-exists' => 'ë‹¹ì‹ ì´ ì§€ì •í•œ íŒì´ 없습니다.',
# Database error messages
'dberr-header' => 'ì´ ìœ„í‚¤ì— ë¬¸ì œê°€ 있습니다.',
@@ -3701,4 +3775,90 @@ $1',
'sqlite-has-fts' => '$1 (본문 전체 검색)',
'sqlite-no-fts' => '$1 (ë³¸ë¬¸ì€ ê²€ìƒ‰ì—ì„œ 제외)',
+# New logging system
+'logentry-delete-delete' => '$1 사용ìžê°€ $3 문서를 삭제하였습니다.',
+'logentry-delete-restore' => '$1 사용ìžê°€ $3 문서를 복구하였습니다.',
+'logentry-delete-event' => '$1 사용ìžê°€ $3ì˜ $5ê°œì˜ ê¸°ë¡ì— 대해 표시 ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
+'logentry-delete-revision' => '$1 사용ìžê°€ $3 ë¬¸ì„œì˜ {{PLURAL:$5}}ê°œ íŽ¸ì§‘ì˜ ì„¤ì •ì„ ë³€ê²½í•˜ì˜€ìŠµë‹ˆë‹¤: $4',
+'logentry-delete-event-legacy' => '$1 사용ìžê°€ $3 문서 기ë¡ì˜ 표시 ì„¤ì •ì„ ë³€ê²½í•˜ì˜€ìŠµë‹ˆë‹¤.',
+'logentry-delete-revision-legacy' => '$1 사용ìžê°€ $3 문서 íŽ¸ì§‘ì˜ í‘œì‹œ ì„¤ì •ì„ ë³€ê²½í•˜ì˜€ìŠµë‹ˆë‹¤.',
+'logentry-suppress-delete' => '$1 사용ìžê°€ $3 문서를 숨겼습니다.',
+'logentry-suppress-event' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3ì˜ {{PLURAL:$5|$5ê°œì˜ ê¸°ë¡}}ì— ëŒ€í•´ 표시 ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
+'logentry-suppress-revision' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ {{PLURAL:$5|$5ê°œì˜ íŒ}}ì— ëŒ€í•´ 표시 ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
+'logentry-suppress-event-legacy' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3ì˜ í•­ëª©ì— ëŒ€í•œ 표시 ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
+'logentry-suppress-revision-legacy' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ íŠ¹ì • íŒì— 대한 표시 ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
+'revdelete-content-hid' => 'ë‚´ìš© 숨겨ì§',
+'revdelete-summary-hid' => '편집 요약 숨겨ì§',
+'revdelete-uname-hid' => '계정 ì´ë¦„ 숨겨ì§',
+'revdelete-content-unhid' => 'ë‚´ìš© 숨김 í•´ì œë¨',
+'revdelete-summary-unhid' => '편집 요약 숨김 í•´ì œë¨',
+'revdelete-uname-unhid' => '계정 ì´ë¦„ 숨김 í•´ì œë¨',
+'revdelete-restricted' => '관리ìžì—게 ì œí•œì„ ì ìš©í•¨',
+'revdelete-unrestricted' => '관리ìžì— 대한 ì œí•œì„ í•´ì œí•¨',
+'logentry-move-move' => '$1 사용ìžê°€ $3 문서를 $4ë¡œ 옮겼습니다.',
+'logentry-move-move-noredirect' => '$1 사용ìžê°€ $3 문서를 넘겨주기를 ìƒì„±í•˜ì§€ ì•Šê³  $4ë¡œ 옮겼습니다.',
+'logentry-move-move_redir' => '$1 사용ìžê°€ $3 문서를 $4ë¡œ 옮기면서 넘겨주기를 ë®ì–´ì¼ìŠµë‹ˆë‹¤.',
+'logentry-move-move_redir-noredirect' => '$1 사용ìžê°€ $3 문서를 $4ë¡œ 넘겨주기를 남기지 않으면서 옮기면서 옮길 대ìƒì— ìžˆë˜ ë„˜ê²¨ì£¼ê¸°ë¥¼ ë®ì–´ì¼ìŠµë‹ˆë‹¤..',
+'logentry-patrol-patrol' => '$1 사용ìžê°€ $3 ë¬¸ì„œì˜ $4íŒì„ 검토한 것으로 표시했습니다.',
+'logentry-patrol-patrol-auto' => '$1 사용ìžê°€ ìžë™ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ $4íŒì„ 검토한 것으로 표시했습니다.',
+'logentry-newusers-newusers' => '$1 사용ìžê°€ ê³„ì •ì„ ìƒì„±í–ˆìŠµë‹ˆë‹¤.',
+'logentry-newusers-create' => '$1 사용ìžê°€ ê³„ì •ì„ ìƒì„±í–ˆìŠµë‹ˆë‹¤.',
+'logentry-newusers-create2' => '$1 사용ìžê°€ $3 ê³„ì •ì„ ìƒì„±í–ˆìŠµë‹ˆë‹¤.',
+'logentry-newusers-autocreate' => '$1 ê³„ì •ì´ ìžë™ì ìœ¼ë¡œ ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'newuserlog-byemail' => 'ì´ë©”ì¼ë¡œ 보낸 암호',
+
+# Feedback
+'feedback-bugornote' => 'ê¸°ìˆ ì  ë¬¸ì œë¥¼ 구체ì ìœ¼ë¡œ 설명할 준비가 ë˜ì—ˆë‹¤ë©´ [$1 버그를 ì‹ ê³ ]í•´ 주세요.
+아니면 ì•„ëž˜ì— ì‰¬ìš´ ì–‘ì‹ì„ 쓸 수 있습니다. ë‹¹ì‹ ì˜ ì˜ê²¬ì€ 계정 ì´ë¦„ê³¼ 사용 ì¤‘ì¸ ë¸Œë¼ìš°ì € 정보와 함께 "[$3 $2]"ì— ë‚¨ê²¨ì§ˆ 것입니다.',
+'feedback-subject' => '제목:',
+'feedback-message' => 'ë‚´ìš©:',
+'feedback-cancel' => '취소',
+'feedback-submit' => '피드백 제출',
+'feedback-adding' => 'ë¬¸ì„œì— í”¼ë“œë°±ì„ ì˜¬ë¦¬ëŠ” 중...',
+'feedback-error1' => '오류: API 실행 결과를 ì¸ì‹í•  수 ì—†ìŒ',
+'feedback-error2' => '오류: 편집 실패',
+'feedback-error3' => '오류: APIê°€ ì‘답하지 ì•ŠìŒ',
+'feedback-thanks' => 'ê°ì‚¬í•©ë‹ˆë‹¤! ‘[$2 $1]’ ë¬¸ì„œì— ë‹¹ì‹ ì˜ ì˜ê²¬ì„ 남겼습니다.',
+'feedback-close' => '완료',
+'feedback-bugcheck' => 'ê°ì‚¬í•©ë‹ˆë‹¤! 혹시 해당 ì‚¬í•­ì´ [$1 ê¸°ì¡´ì˜ ë²„ê·¸ 리í¬íŠ¸]ì— ì˜¬ë¼ì™€ 있는지 확ì¸í•´ì£¼ì„¸ìš”.',
+'feedback-bugnew' => '확ì¸í–ˆìŠµë‹ˆë‹¤. 새로운 버그 리í¬íŠ¸ë¥¼ 작성합니다.',
+
+# API errors
+'api-error-badaccess-groups' => 'ë‹¹ì‹ ì€ ì´ ìœ„í‚¤ì— íŒŒì¼ì„ 올릴 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
+'api-error-badtoken' => '내부 오류: 토í°ì´ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'api-error-copyuploaddisabled' => 'ì´ ì„œë²„ì—ì„œ URLì„ í†µí•´ íŒŒì¼ ì˜¬ë¦¬ê¸°ê°€ 비활성화ë˜ì–´ 있습니다.',
+'api-error-duplicate' => 'ì´ ìœ„í‚¤ì— ë‚´ìš©ì´ ë˜‘ê°™ì€ {{PLURAL:$1|[$2 다른 파ì¼]}}ì´ ìžˆìŠµë‹ˆë‹¤.',
+'api-error-duplicate-archive' => 'ê°™ì€ ë‚´ìš©ì„ ë‹´ê³  ìžˆë˜ {{PLURAL:$1|[$2 다른 파ì¼]}}ì´ ìžˆì—ˆì§€ë§Œ ì´ {{PLURAL:$1|파ì¼|파ì¼ë“¤}}ì€ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤.',
+'api-error-duplicate-archive-popup-title' => 'ì¤‘ë³µëœ {{PLURAL:$1|파ì¼}}ì´ ì´ë¯¸ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤.',
+'api-error-duplicate-popup-title' => 'ì¤‘ë³µëœ {{PLURAL:$1|파ì¼}}',
+'api-error-empty-file' => 'ë‹¹ì‹ ì´ ì˜¬ë¦¬ë ¤ëŠ” 파ì¼ì´ 비어 있습니다.',
+'api-error-emptypage' => '새 문서로 빈 문서를 만들 수 없습니다.',
+'api-error-fetchfileerror' => '내부 오류: 파ì¼ì„ 불러오는 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'api-error-file-too-large' => 'ë‹¹ì‹ ì´ ì˜¬ë¦¬ë ¤ëŠ” 파ì¼ì´ 너무 í½ë‹ˆë‹¤.',
+'api-error-filename-tooshort' => 'íŒŒì¼ ì´ë¦„ì´ ë„ˆë¬´ 짧습니다.',
+'api-error-filetype-banned' => 'ì´ëŸ° 형ì‹ì˜ 파ì¼ì€ 올릴 수 없습니다.',
+'api-error-filetype-missing' => 'íŒŒì¼ ì´ë¦„ì— í™•ìž¥ìžê°€ 없습니다.',
+'api-error-hookaborted' => 'ë‹¹ì‹ ì´ ì‹œë„í•œ ìˆ˜ì •ì´ í™•ìž¥ 기능 í›…ì— ì˜í•´ 중단ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'api-error-http' => '내부 오류: ì„œë²„ì— ì—°ê²°í•  수 없습니다.',
+'api-error-illegal-filename' => 'ì´ íŒŒì¼ ì´ë¦„ì„ ì‚¬ìš©í•  수 없습니다.',
+'api-error-internal-error' => '내부 오류: ë‹¹ì‹ ì´ ì˜¬ë¦° 파ì¼ì„ 위키ì—ì„œ 처리하는 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'api-error-invalid-file-key' => '내부 오류: ìž„ì‹œ 저장소ì—ì„œ 파ì¼ì„ 찾지 못했습니다.',
+'api-error-missingparam' => '내부 오류: 요청 중 매개변수가 누ë½ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'api-error-missingresult' => '내부 오류: 파ì¼ì˜ 복제가 성공했는지 íŒë‹¨í•  수 없습니다.',
+'api-error-mustbeloggedin' => '파ì¼ì„ 올리기 위해서는 로그ì¸í•´ì•¼ 합니다.',
+'api-error-mustbeposted' => 'ì´ ì†Œí”„íŠ¸ì›¨ì–´ì— ë²„ê·¸ê°€ 있습니다; 올바른 HTTP 전송 ë°©ì‹ì„ 사용하지 않았습니다.',
+'api-error-noimageinfo' => 'íŒŒì¼ ì˜¬ë¦¬ê¸°ëŠ” 성공했지만 서버가 파ì¼ì— 대해 ì–´ë– í•œ ì •ë³´ë„ ì£¼ì§€ 않았습니다.',
+'api-error-nomodule' => '내부 오류: 올리기 ëª¨ë“ˆì´ ì„¤ì •ë˜ì§€ 않았습니다.',
+'api-error-ok-but-empty' => '내부 오류: 서버ì—ì„œ ì‘ë‹µì´ ì—†ìŠµë‹ˆë‹¤.',
+'api-error-overwrite' => 'ì´ë¯¸ 있는 파ì¼ì„ ë®ì–´ì“¸ 수 없습니다.',
+'api-error-stashfailed' => '내부 오류: 서버가 ìž„ì‹œ 파ì¼ì„ 저장하지 못했습니다.',
+'api-error-timeout' => '서버가 ì œ 시간 ë‚´ì— ì‘답하지 않았습니다.',
+'api-error-unclassified' => 'ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'api-error-unknown-code' => '알 수 없는 오류: "$1"',
+'api-error-unknown-error' => '내부 오류: 파ì¼ì„ 올리려 하는 ë„ì¤‘ì— ë¬´ì—‡ì¸ê°€ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'api-error-unknown-warning' => 'ì›ì¸ ë¶ˆëª…ì˜ ê²½ê³ : $1',
+'api-error-unknownerror' => '알 수 없는 오류: "$1".',
+'api-error-uploaddisabled' => 'ì´ ìœ„í‚¤ì—ì„œ íŒŒì¼ ì˜¬ë¦¬ê¸°ê°€ 비활성화ë˜ì–´ 있습니다.',
+'api-error-verification-error' => '파ì¼ì´ ì†ìƒë˜ì—ˆê±°ë‚˜ ìž˜ëª»ëœ í™•ìž¥ìžë¥¼ 사용하고 있습니다.',
+
);
diff --git a/languages/messages/MessagesKoi.php b/languages/messages/MessagesKoi.php
index 904256c7..62f23bb9 100644
--- a/languages/messages/MessagesKoi.php
+++ b/languages/messages/MessagesKoi.php
@@ -493,8 +493,7 @@ $messages = array(
'linksearch' => 'Вики Ñайöдз Ñ‹ÑтöттÑз',
# Special:Log/newusers
-'newuserlogpage' => 'УджкериÑьö гижöтчан журнал',
-'newuserlog-create-entry' => 'Виль уджкериÑÑŒ',
+'newuserlogpage' => 'УджкериÑьö гижöтчан журнал',
# Special:ListGroupRights
'listgrouprights-members' => '(уджкериÑÑезлöн нимлёдз)',
@@ -529,7 +528,6 @@ $messages = array(
'confirmdeletetext' => 'Ð¢Ñ Ð¼Ã¶Ð´Ð°Ð½ быдÑöн чышкыны лиÑтбок (нето ÑерпаÑ) да ÑылiÑÑŒ иÑториÑ. БылиÑÑŒ Ñ Ñ‚Ñ Ð¼Ã¶Ð´Ð°Ð½ Ñiйö керны, вежöртан Ñ Ð±ÑƒÑ€Ð°, мыйö Ñтö Ð²ÐµÑ€Ð¼Ð°Ñ Ð²Ð°Ð¹Ã¶Ñ‚Ð½Ñ‹, и керан Ñ ÑÑ‚iйö [[{{MediaWiki:Policy-url}}]] туйдöттÑз Ñьöртi',
'actioncomplete' => 'КерÑьöм',
'deletedtext' => '«$1» чышкöм. Видзöт $2-иÑÑŒ Ð¼ÐµÐ´Ð±Ã¶Ñ€ÑŒÑ Ñ‡Ñ‹ÑˆÐºÃ¶Ð¼Ð¼ÐµÑö.',
-'deletedarticle' => 'Ñ‡Ñ‹ÑˆÐºÐ¸Ñ "[[$1]]"',
'dellogpage' => 'Шупкан чукöр',
'deletecomment' => 'МылÑ:',
'deleteotherreason' => 'Эшö Ð¼Ñ‹Ð»Ñ Ñ‡Ñ‹ÑˆÐºÃ¶Ð¼:',
@@ -567,9 +565,8 @@ $messages = array(
'maximum-size' => 'МедгыриÑÑŒ ыжда:',
# Undelete
-'undeletelink' => 'видзöтны/керны важмоз',
-'undeletecomment' => 'МылÑ:',
-'undeletedarticle' => "бöр ÐºÐµÑ€Ð¸Ñ ''[[$1]]''",
+'undeletelink' => 'видзöтны/керны важмоз',
+'undeletecomment' => 'МылÑ:',
# Namespace form on various pages
'namespace' => 'Ðиммез чукöр:',
@@ -639,8 +636,6 @@ $messages = array(
'talkexists' => "'''ЛиÑтбоклiÑÑŒ ним вежöм ни, а ÑÑ‹ йылiÑÑŒ ÑёрнитанлiÑÑŒ абу, Ð¼Ñ‹Ð»Ñ ÑÑтшöм жö нима лиÑтбок Ñм ни. Öтлаöт жö нiйö кипонiÑÑŒ.'''",
'movedto' => 'Ð½Ñ‹Ð¼Ñ‹Ñ Ð²ÐµÐ¶Ã¶Ð¼ … вылö',
'movetalk' => 'Вежны ним и Ñёрнитан лиÑтбокыÑлiÑÑŒ',
-'1movedto2' => 'Ð²ÐµÐ¶Ð¸Ñ Â«[[$1]]»-лiÑÑŒ нимÑö «[[$2]]» вылö',
-'1movedto2_redir' => '«[[$1]]»-лö ÑетiÑö виль ним «[[$2]]» мöдлаö иньдöтöм веÑьтын',
'movelogpage' => 'Юрниммез вежöм йылiÑÑŒ',
'movereason' => 'МылÑ:',
'revertmove' => 'керны важмоз',
@@ -718,7 +713,7 @@ $messages = array(
# Media information
'file-info-size' => '$1 × $2 пикÑел, файллöн ыжда: $3, MIME-тип: $4',
-'file-nohires' => '<small>Буржыка тыдалан верÑÐ¸Ñ Ð°Ð±Ñƒ.</small>',
+'file-nohires' => 'Буржыка тыдалан верÑÐ¸Ñ Ð°Ð±Ñƒ.',
'svg-long-desc' => 'SVG-файл, гижöм Ñьöртi $1 × $2 пикÑел, файллöн ыжда: $3',
'show-big-image' => 'Буржыка тыдалан ÑерпаÑ',
diff --git a/languages/messages/MessagesKrc.php b/languages/messages/MessagesKrc.php
index 03a5e620..2cf4aef4 100644
--- a/languages/messages/MessagesKrc.php
+++ b/languages/messages/MessagesKrc.php
@@ -36,6 +36,9 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑны_Ñюзюу',
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'Джибериулени черт:',
@@ -391,15 +394,14 @@ $1',
Башха къошулуучу кетерген болургъа боллукъду аны.',
'badtitle' => 'Джарамагъан ат',
'badtitletext' => 'Сорулгъан бетни аты терÑди, бошду, неда интервики аты Ñ‚ÐµÑ€Ñ Ð´Ð¶Ð°Ð·Ñ‹Ð»Ð³ÑŠÐ°Ð½Ð´Ñ‹. Келишмеген (хайырланыргъа болмагъан) Ñимволла хайырланыргъада боллукъдула атында.',
-'perfcached' => 'Бу Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÑшден алыннганды, ахыр тюрлениулени кёзгюзмезге боллукъду.',
-'perfcachedts' => 'Бу Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÑшден алыннгынды, ахыр кере ол $1 джангыртылыннганды.',
+'perfcached' => 'Бу Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÑшден алыннганды, ахыр тюрлениулени кёзгюзмезге боллукъду. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Бу Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÑшден алыннгынды, ахыр кере ол $1 джангыртылыннганды. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Бу бетни буÑагъатда джангыртыргъа болмайды.
Мында келтирилген Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÑŠÐ°Ð±Ñ‹Ð» Ñтилинник тюйюлдю.',
'wrong_wfQuery_params' => 'wfQuery()<br /> функциÑгъа джарамагъан параметрле<br />
ФункциÑ: $1<br />
Соруу: $2',
'viewsource' => 'Къарау',
-'viewsourcefor' => '«$1» бет',
'actionthrottled' => 'Терклик чекленнгенди',
'actionthrottledtext' => 'Спамгъа къаршчы кюрешиуню Ñебебинден, аз заманны ичинде бу амал бла кёб кере хайырланыу тыйылыбды. Кечирек джангыдан кёрюгюз.',
'protectedpagetext' => 'Бу бет тюрлендириуге джабылыбды.',
@@ -587,9 +589,6 @@ $2',
Сизни IP-адреÑигиз — $3, блокну идентификатору — #$5.
Бу информациÑны ажымÑыз чертигиз билдириулеригизде.",
'blockednoreason' => 'Чурум белгиленмегенди',
-'blockedoriginalsource' => 'Тюбю бла «$1» бетни текÑти кёргюзюледи.',
-'blockededitsource' => "Тюбю бла «$1» бетде '''Ñизни тюрлендириулеригизни''' текÑти кёргюзюледи.",
-'whitelistedittitle' => 'Тюрлендирир ючюн тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керекди',
'whitelistedittext' => 'Бетни тюрлендирир ючюн $1 тыйыншлыÑыз.',
'confirmedittext' => 'Бетни тюрледирирни аллы бла Ñиз Ñлектрон почтагъызны адреÑин бегитирге керекÑиз.
[[Special:Preferences|Джарашдырыуланы бетинде]] джазыгъыз Ñм бегитигиз Ñлектрон почтагъызны адреÑин.',
@@ -835,8 +834,6 @@ $3 джанындан берилген Ñылтау: ''$2''",
'revdelete-unsuppress' => 'Ызына къайтарылгъан верÑиÑладан тыйгъычланы кетер',
'revdelete-log' => 'Чурум:',
'revdelete-submit' => '{{PLURAL:$1|Сайланнган верÑиÑ|Сайланнган верÑиÑлада}} хайырлан',
-'revdelete-logentry' => '[[$1]] ючюн верÑиÑны кёрюнюую тюрленди',
-'logdelete-logentry' => '[[$1]] ючюн болууну кёрюнюую тюрленнгенди',
'revdelete-success' => "'''ВерÑиÑны кёрюнюую джетишимли тюрлендирилгенди'''",
'revdelete-failure' => "'''ВерÑиÑны кёрюнюую тюрленеллик тюлдю'''
$1",
@@ -848,15 +845,6 @@ $1",
'revdel-restore-visible' => 'кёрюннген верÑиÑла',
'pagehist' => 'Бетни тарихи',
'deletedhist' => 'Кетериулени тарихи',
-'revdelete-content' => 'контент',
-'revdelete-summary' => 'тюрлениулени ачыкълау',
-'revdelete-uname' => 'къошулуучуну аты',
-'revdelete-restricted' => 'админиÑтраторла ючюн Ñтилген чеклениуле',
-'revdelete-unrestricted' => 'админиÑтратолра ючюн Ñтилген чеклениуле къоратылгъандыла',
-'revdelete-hid' => 'джашырылыныб $1',
-'revdelete-unhid' => 'ачыкъ $1',
-'revdelete-log-message' => ' $2 {{PLURAL:$2|верÑиÑ|верÑиÑ}} ючюн $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|болуу|болуу}} ючюн $1',
'revdelete-hide-current' => '$2 $1 даталада джазыуну джашырыууну халаты: бу буÑагъатдагъы верÑиÑÑыды.
Джашырыламаз.',
'revdelete-show-no-access' => '$2 $1 замандагъы джазыуну ачыуда халат: бу джазыу «чеклендирилген» кибик белгиленнгенди.
@@ -1012,7 +1000,7 @@ $1",
'prefs-rc' => 'ÐÑ…Ñ‹Ñ€ тюрлениуле',
'prefs-watchlist' => 'Къарауну ÑпиÑогу',
'prefs-watchlist-days' => 'Къарауну ÑпиÑогунда кёргюзюллюк кюнню Ñаны:',
-'prefs-watchlist-days-max' => '(Ñм кёб 7кюн)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Къарауну кенглешдирилген ÑпиÑогунда кёргюзюллюк тюрлениулени Ñаны:',
'prefs-watchlist-edits-max' => 'МакÑимум Ñаны:1000',
'prefs-watchlist-token' => 'Къарауну ÑпиÑогуну токени:',
@@ -1211,7 +1199,6 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'right-autopatrol' => 'Тюрлениуле автоматик оÑмакъланнган кибик белгиленедиле',
'right-patrolmarks' => 'ÐÑ…Ñ‹Ñ€ тюрлениулени оÑмакъланыуларыны белгилерине къара',
'right-unwatchedpages' => 'Къаралмагъан бетлени ÑпиÑогуна къара',
-'right-trackback' => 'Trackback-ны ашырыу',
'right-mergehistory' => 'Бетлени тарихлерини бирлешдир',
'right-userrights' => 'Бютеу къошулуучуланы хакъларыны тюрлендириу',
'right-userrights-interwiki' => 'Башха викиледеги къошулуучуларыны хакъларын тюрлендир',
@@ -1255,7 +1242,6 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'action-patrol' => 'башхаланы тюрлендириулерин патруль Ñтилиннгенлеча белгилеу',
'action-autopatrol' => 'кеÑими тюрлендириулерими патруль Ñтилиннгенлеча белгилеу',
'action-unwatchedpages' => 'киши кёзюнде тутмагъан бетлени тизмеÑине къарау',
-'action-trackback' => 'trackback ашырыу',
'action-mergehistory' => 'бу бетлени тарихлерин бирлешдириу',
'action-userrights' => 'къошулуучуну бютеу хакъларын тюрлендириу',
'action-userrights-interwiki' => 'къошулуучуланы башха викиледе хакъларын тюрлендириу',
@@ -1301,7 +1287,6 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'recentchangeslinked-feed' => 'Байламлы тюрлендириуле',
'recentchangeslinked-toolbox' => 'Байламлы тюрлендириуле',
'recentchangeslinked-title' => '$1 бет бла байламлы тюрлендириуле',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'Берилген кёзюуню ичинде белгиленнген бетге байламлы башха бетледе тюрлениуле болмагъандыла',
'recentchangeslinked-summary' => "Белгиленнген бет (неда белгиленнген категориÑгъа киргенле) джиберген бетледе джангы тюрлениулени тизмеÑи.
[[Special:Watchlist|Кёзде тургъан тизмеге]] кирген бетле '''чертилибдиле'''.",
@@ -1555,7 +1540,6 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
# File reversion
'filerevert' => '$1 файлны ÑÑки халына къайтыу',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'Файлны ÑÑки халына къайтар',
'filerevert-intro' => "'''[[Media:$1|$1]]''' медиÑÑыны [$4 $3, $2 замандагъы верÑиÑÑÑ‹]ны ызына къайтарыгъыз.",
'filerevert-comment' => 'Чурум:',
@@ -1566,7 +1550,6 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
# File deletion
'filedelete' => '$1 — кетериу',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'Файлны кетер',
'filedelete-intro' => "'''[[Media:$1|$1]]''' файлны бютеу тарихи бла бирге кетере тураÑыз",
'filedelete-intro-old' => "'''[[Media:$1|$1]]''' файлны [$4 $3, $2] замандагъы верÑиÑÑын кетере тураÑыз.",
@@ -1793,13 +1776,8 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'activeusers-noresult' => 'Къошлуучу табылмады.',
# Special:Log/newusers
-'newuserlogpage' => 'Къошулуучуланы региÑтрациÑларыны журналы',
-'newuserlogpagetext' => 'Кёб болмай региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтген къошулуучуланы ÑпиÑогу.',
-'newuserlog-byemail' => 'пароль Ñлектрон почта бла джиберилгенди',
-'newuserlog-create-entry' => 'Джангы къошулуучу
-Джангы къошулуучу',
-'newuserlog-create2-entry' => '$1 джангы тергеу джазыуну къурады',
-'newuserlog-autocreate-entry' => 'Тергеу джазыу (аккаунт) автомат халда къуралды',
+'newuserlogpage' => 'Къошулуучуланы региÑтрациÑларыны журналы',
+'newuserlogpagetext' => 'Кёб болмай региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтген къошулуучуланы ÑпиÑогу.',
# Special:ListGroupRights
'listgrouprights' => 'Къошулуучуланы къауумуну хакълары',
@@ -1931,7 +1909,6 @@ $UNWATCHURL
'exbeforeblank' => "Кетериуню алындагъы ичи: '$1'",
'exblank' => 'бет бош Ñди',
'delete-confirm' => '«$1» — кетериу',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Кетер',
'historywarning' => "'''ЭÑгериу:''' кетериле тургъан бетни $1 {{PLURAL:$1|верÑиÑлы|верÑиÑлы}} тарихи барды:",
'confirmdeletetext' => 'Сиз бетни (неда Ñуратны) бютеу тюрлениу тарихи бла толу кетерирге ÑоргъанÑыз.
@@ -1940,8 +1917,6 @@ $UNWATCHURL
'actionfailed' => 'Этим джетишимÑиз болду',
'deletedtext' => '«$1» бет кетерилди.
ÐÑ…Ñ‹Ñ€ кетерилгенлени ÑпиÑогун кёрюр ючюн, $2на къарагъыз.',
-'deletedarticle' => '«[[$1]]» кетерилди',
-'suppressedarticle' => '«[[$1]]» джашырылды',
'dellogpage' => 'Кетерилгенлени журналы',
'dellogpagetext' => 'Тюбюндеги ÑпиÑок ахыр кетериулени журналыды.',
'deletionlog' => 'кетериулени журналы',
@@ -1992,7 +1967,6 @@ $2 тюрлендирген алгъаракъ верÑиÑÑына къайты
'movedarticleprotection' => 'Къоруулауну джарашдырыулары "[[$2]]" бетден "[[$1]]" бетге кёчюрюлгенди',
'protect-title' => '"$1" ючюн къоруулау дараджаны Ñайлагъыз',
'prot_1movedto2' => '[[$1]] бетни джангы аты: [[$2]]',
-'protect-backlink' => '↠$1',
'protect-legend' => 'Къоруулауну къабыл ÑÑ‚',
'protectcomment' => 'Чурум:',
'protectexpiry' => 'Бошалады:',
@@ -2069,7 +2043,6 @@ $2 тюрлендирген алгъаракъ верÑиÑÑына къайты
'undeletereset' => 'Ðриула',
'undeleteinvert' => 'Сайлауну ызына бур',
'undeletecomment' => 'Чурум:',
-'undeletedarticle' => '«[[$1]]» орнуна келтирилди',
'undeletedrevisions' => '$1 {{PLURAL:$1|тюрлендириу|тюрлендириу}} ызына къайтарылды',
'undeletedrevisions-files' => '{{PLURAL:$1|1 верÑиÑ|$1 верÑиÑ}} бла {{PLURAL:$2|1 файл|$2 файл}} ызына къайтарылды',
'undeletedfiles' => '{{PLURAL:$1|1 файл|$1 файл}} ызына къайтарылды',
@@ -2325,9 +2298,6 @@ $1',
'movepage-page-moved' => '$1 бет $2 бетге атын ауушдурду.',
'movepage-page-unmoved' => '$1 бет $2 бетге атын ауушдуралмаз.',
'movepage-max-pages' => 'Эм кёб $1 {{PLURAL:$1|бет|бет}} атын тюрлендирди Ñм андан аÑламы автомат халда атын тюрлендирелмез.',
-'1movedto2' => '«[[$1]]» бет «[[$2]]» бетге тюрленилинди',
-'1movedto2_redir' => '«[[$1]]» бет «[[$2]]» бетге тюрленди джибериуню ÑŽÑÑŽ бла',
-'move-redirect-suppressed' => 'джибериу баÑдырылды',
'movelogpage' => 'Ðтла тюрлениуню журналы',
'movelogpagetext' => 'Тюбюнде болгъан ÑпиÑок аты тюрлендирилген бетлени кёргюзеди.',
'movesubpage' => '{{PLURAL:$1|Subpage|Бет тюбле}}',
@@ -2574,9 +2544,6 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
# Patrol log
'patrol-log-page' => 'Патруль Ñтиуню журналы',
'patrol-log-header' => 'Бу оÑмакъланнган верÑиÑланы журналыды.',
-'patrol-log-line' => '$3 Ñыналгъан кибик $2 $1 верÑÐ¸Ñ Ð±ÐµÐ»Ð³Ð¸Ð»ÐµÐ½Ð´Ð¸',
-'patrol-log-auto' => '(автомат халда)',
-'patrol-log-diff' => 'верÑÐ¸Ñ $1',
'log-show-hide-patrol' => 'ОÑмакълауну журналы $1',
# Image deletion
@@ -2603,7 +2570,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|бет|бет}}',
'file-info' => 'файлны ёлчеми: $1, MIME типи: $2',
'file-info-size' => '$1 × $2 пикÑель, файлны ёлчеми: $3, MIME типи: $4',
-'file-nohires' => '<small>Мындан ары ачыкъланнган верÑиÑÑÑ‹ джокъду</small>',
+'file-nohires' => 'Мындан ары ачыкъланнган верÑиÑÑÑ‹ джокъду',
'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пикÑель, файлны ёлчеми: $3',
'show-big-image' => 'Толу ачыкълау',
'file-info-gif-looped' => 'тогъайланнганды',
@@ -2984,13 +2951,6 @@ $5
'scarytranscludefailed' => '[$1 ючюн шаблон алымы тындырылмады]',
'scarytranscludetoolong' => '[URL аÑыры узунду]',
-# Trackbacks
-'trackbackbox' => 'Бу бет ючюн trackback :<br />
-$1',
-'trackbackremove' => '([$1 кетер])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback кетерилди',
-
# Delete conflict
'deletedwhileediting' => "'''ЭÑериу''': Бу бет Ñиз тюрлендириб башлагъандан Ñора кетерилгенди!",
'confirmrecreate' => "Бу бетни [[User:$1|$1]] ([[User talk:$1|Ñюзюу]]) къошулуучу, Ñиз бетде тюрлендириуле Ñтген заманда кетергенди, чуруму:
@@ -3256,4 +3216,9 @@ MediaWiki хайырлы боллукъду деген умут бла джайÑ
'sqlite-has-fts' => '$1 толу текÑÑ‚ излеуню хайырландыргъан',
'sqlite-no-fts' => '$1 толу текÑÑ‚ излеуню хайырландыра билмеген',
+# New logging system
+'revdelete-restricted' => 'админиÑтраторла ючюн Ñтилген чеклениуле',
+'revdelete-unrestricted' => 'админиÑтратолра ючюн Ñтилген чеклениуле къоратылгъандыла',
+'newuserlog-byemail' => 'пароль Ñлектрон почта бла джиберилгенди',
+
);
diff --git a/languages/messages/MessagesKs_arab.php b/languages/messages/MessagesKs_arab.php
index 942da910..b4655091 100644
--- a/languages/messages/MessagesKs_arab.php
+++ b/languages/messages/MessagesKs_arab.php
@@ -7,9 +7,9 @@
* @ingroup Language
* @file
*
+ * @author Rk_kaul (on ks.wikipedia.org)
*/
-# @todo FIXME: Inherit almost everything for now
$rtl = true;
$digitTransformTable = array(
@@ -23,7 +23,10 @@ $digitTransformTable = array(
'7' => 'Ù§', # &#x0667;
'8' => 'Ù¨', # &#x0668;
'9' => 'Ù©', # &#x0669;
- '.' => 'Ù«', # &#x066b; wrong table ?
+);
+
+$separatorTransformTable = array(
+ '.' => 'Ù«', # &#x066b;
',' => 'Ù¬', # &#x066c;
);
diff --git a/languages/messages/MessagesKs_deva.php b/languages/messages/MessagesKs_deva.php
index d4f16eea..99cdd866 100644
--- a/languages/messages/MessagesKs_deva.php
+++ b/languages/messages/MessagesKs_deva.php
@@ -7,10 +7,9 @@
* @ingroup Language
* @file
*
+ * @author Rk_kaul (on ks.wikipedia.org)
*/
-# @todo FIXME: Inherit almost everything for now
-
$digitTransformTable = array(
'0' => '०', # &#x0966;
'1' => '१', # &#x0967;
diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php
index e9b5df2b..7a9df62c 100644
--- a/languages/messages/MessagesKsh.php
+++ b/languages/messages/MessagesKsh.php
@@ -65,32 +65,38 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Meedije' => NS_MEDIA,
- 'Spezial' => NS_SPECIAL,
- 'Shpezjal' => NS_SPECIAL,
- 'Medmaacher' => NS_USER,
- 'Medmaacher_Klaaf' => NS_USER_TALK,
- 'Beld' => NS_FILE,
- 'Belld' => NS_FILE,
- 'Belder_Klaaf' => NS_FILE_TALK,
- 'Bellder_Klaaf' => NS_FILE_TALK,
- 'MedijaWikki' => NS_MEDIAWIKI,
- 'MedijaWikki_Klaaf' => NS_MEDIAWIKI_TALK,
- 'Hülp' => NS_HELP,
- 'Hülp_Klaaf' => NS_HELP_TALK,
- 'Sachjrop' => NS_CATEGORY,
- 'Saachjrop' => NS_CATEGORY,
- 'Saachjropp' => NS_CATEGORY,
- 'Kattejori' => NS_CATEGORY,
- 'Kategorie' => NS_CATEGORY,
- 'Katejori' => NS_CATEGORY,
- 'Sachjrop_Klaaf' => NS_CATEGORY_TALK,
- 'Saachjroppe_Klaaf' => NS_CATEGORY_TALK,
- 'Saachjrupp_Klaaf' => NS_CATEGORY_TALK,
- 'Kattejori_Klaaf' => NS_CATEGORY_TALK,
- 'Kattejorije_Klaaf' => NS_CATEGORY_TALK,
- 'Kategorie_Klaaf' => NS_CATEGORY_TALK,
- 'Katejorije_Klaaf' => NS_CATEGORY_TALK,
+ 'Medium' => NS_MEDIA,
+ 'Meedije' => NS_MEDIA,
+ 'Meedijum' => NS_MEDIA,
+ 'Spezial' => NS_SPECIAL,
+ 'Shpezjal' => NS_SPECIAL,
+ 'Medmaacher' => NS_USER,
+ 'Metmaacherin' => NS_USER,
+ 'Medmaacherin' => NS_USER,
+ 'Metmaacheren' => NS_USER,
+ 'Medmaacheren' => NS_USER,
+ 'Medmaacher_Klaaf' => NS_USER_TALK,
+ 'Beld' => NS_FILE,
+ 'Belld' => NS_FILE,
+ 'Belder_Klaaf' => NS_FILE_TALK,
+ 'Bellder_Klaaf' => NS_FILE_TALK,
+ 'MedijaWikki' => NS_MEDIAWIKI,
+ 'MedijaWikki_Klaaf' => NS_MEDIAWIKI_TALK,
+ 'Hülp' => NS_HELP,
+ 'Hülp_Klaaf' => NS_HELP_TALK,
+ 'Sachjrop' => NS_CATEGORY,
+ 'Saachjrop' => NS_CATEGORY,
+ 'Saachjropp' => NS_CATEGORY,
+ 'Kattejori' => NS_CATEGORY,
+ 'Kategorie' => NS_CATEGORY,
+ 'Katejori' => NS_CATEGORY,
+ 'Sachjrop_Klaaf' => NS_CATEGORY_TALK,
+ 'Saachjroppe_Klaaf' => NS_CATEGORY_TALK,
+ 'Saachjrupp_Klaaf' => NS_CATEGORY_TALK,
+ 'Kattejori_Klaaf' => NS_CATEGORY_TALK,
+ 'Kattejorije_Klaaf' => NS_CATEGORY_TALK,
+ 'Kategorie_Klaaf' => NS_CATEGORY_TALK,
+ 'Katejorije_Klaaf' => NS_CATEGORY_TALK,
);
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -191,13 +197,13 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ÖMLEIDE_OP', '#ÖMLEIDE', '#LEIDT_ÖM_OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
- 'nogallery' => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__NOGALLERY__' ),
- 'toc' => array( '0', '__ENHALLT__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
- 'img_right' => array( '1', 'rähß', 'räts', 'rechts', 'right' ),
- 'img_left' => array( '1', 'lengks', 'lenks', 'links', 'left' ),
- 'language' => array( '0', '#SHPROOCH:', '#SPROCH:', '#SPRACHE:', '#LANGUAGE:' ),
- 'hiddencat' => array( '1', '__VERSHTOCHE_SAACHJRUPP__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+ 'redirect' => array( '0', '#ÖMLEIDE_OP', '#ÖMLEIDE', '#LEIDT_ÖM_OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
+ 'nogallery' => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__NOGALLERY__' ),
+ 'toc' => array( '0', '__ENHALLT__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
+ 'img_right' => array( '1', 'rähß', 'räts', 'rechts', 'right' ),
+ 'img_left' => array( '1', 'lengks', 'lenks', 'links', 'left' ),
+ 'language' => array( '0', '#SHPROOCH:', '#SPROCH:', '#SPRACHE:', '#LANGUAGE:' ),
+ 'hiddencat' => array( '1', '__VERSHTOCHE_SAACHJRUPP__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
);
$imageFiles = array(
@@ -562,6 +568,7 @@ un doht em och de URL vun dä Sigg heh sage.',
'formerror' => 'Dat es donevve jejange: Wor nix, met däm Fomular.',
'badarticleerror' => 'Dat jeiht met heh dä Sigg nit ze maache.',
'cannotdelete' => 'De Sigg oder de Datei „$1“ fottzeschmieße es nit müjjelich. Maach sin, dat ene andere Metmaacher flöcker wor, hät et vürher jedon, un jetz es se ald fott.',
+'cannotdelete-title' => 'Mer künne di Sigg „$1“ nit fott schmiiße.',
'badtitle' => 'Verkihrte Ãœvverschreff',
'badtitletext' => 'De Ãœvverschreff es esu nit en Odenung. Et muss jet dren stonn.
Et künnt sin, dat ein vun de speziell Zeiche dren steiht,
@@ -569,18 +576,21 @@ wat en Ãœvverschrefte nit erlaub es.
Et künnt ussinn, wie ene InterWikiLink,
dat jeiht ävver nit.
Muss De repareere.',
-'perfcached' => 'De Daate heenoh kumme usem Zweschespeicher (Cache) un künnte nit mieh janz de allerneuste sin.',
-'perfcachedts' => 'De Daate heenoh kumme usem Zweschespeicher (Cache) un woodte aam $2 öm $3 opjenumme. Se künnte nit janz de allerneuste sin.',
+'perfcached' => 'Di Daate heh noh kumme usem Zweschespeicher (<l lang="en">cache</i>) un künnte nit mieh janz de allerneuste sin.
+{{PLURAL:$1|Bloß ein Antwoot es|Nit mieh wi $1 Antwoote sin|Kein Antwoot es}} doh faßjehallde un ze han.',
+'perfcachedts' => 'De Daate heenoh kumme usem Zweschespeicher (Cache) un woodte aam $2 öm $3 opjenumme. Se künnte nit janz de allerneuste sin.
+{{PLURAL:$4|Bloß ein Antwoot es|Nit mieh wi $4 Antwoote sind|Kein Antwoot es}} doh ze han.',
'querypage-no-updates' => "'''Heh die Sigg weed nit mieh op ene neue Stand jebraat.'''",
'wrong_wfQuery_params' => 'Verkihrte Parameter för: <strong><code>wfQuery()</code></strong><br />
De Funktion es: „<code>$1</code>“<br />
De Aanfroch es: „<code>$2</code>“<br />',
'viewsource' => 'Wikitex aanluure',
-'viewsourcefor' => 'för de Sigg: „$1“',
+'viewsource-title' => 'Der Wikitäx vun dä Sigg „$1“ belooere.',
'actionthrottled' => "Dat ka'mer nit esu öff maache",
'actionthrottledtext' => 'Dat darf mer nor en jeweße Zahl Mole hengerenander maache. Do bes jrad aan de Jrenz jekumme. Kannze jo en e paar Menutte widder probeere.',
'protectedpagetext' => 'Die Sigg es jeschöz, un mer kann se nit ändere.',
'viewsourcetext' => 'Heh es dä Sigg ier Wikitex zom Belooere un Koppeere:',
+'viewyourtext' => 'Do kanns Ding Änderonge aan heh dä Sigg beloore un kopeere:',
'protectedinterface' => 'Op dä Sigg heh steiht Tex usem Interface vun de Wiki-Soffwär. Dröm es die jäje Änderunge jeschötz, domet keine Mess domet aanjestallt weed.',
'editinginterface' => '<strong>Opjepass:</strong>
Op dä Sigg heh steiht Tex uß em Ingerfäiß vun de Wiki-Soffwär. Dröm es
@@ -725,6 +735,7 @@ för der Momang nit noch mit Metmaacher neu aanmellde.',
'noemailprefs' => 'Dun en E-Mail Adress endrage, domet dat et all fluppe kann.',
'emailconfirmlink' => 'Dun Ding <i lang="en">e-mail</i> Adress bestätije looße',
'invalidemailaddress' => 'Wat De do als en Adreß för Ding <i lang="en">e-mail</i> aanjejovve häs, süht noh Dress us. En <i lang="en">e-mail</i> Adreß en däm Format, dat jitt et nit. Muss De repareere - oder Do mähs dat Feld leddich un schrievs nix eren. Un dann versök et noch ens.',
+'cannotchangeemail' => 'Sing <i lang="en">e-mail<i> Addreß kam_mer ehe em Wiki nit ändere.',
'accountcreated' => 'Aanjemeldt',
'accountcreatedtext' => 'De Aanmeldung för dä Metmaacher „<strong>$1</strong>“ es dorsch, De kanns jetz enlogge.',
'createaccount-title' => 'Enne neue Metmaacher aanmelde för {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
@@ -746,6 +757,7 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
# E-mail sending
'php-mail-error-unknown' => 'Nit bekannte Fähler met dä Funxjohn <code lang="en">mail()</code> vum PHP',
+'user-mail-no-addy' => 'Do häs versöhg en <i lang="en">e-mail</i> der ohne en Adräß ze verschecke',
# Change password dialog
'resetpass' => 'Passwood tuusche udder neu ußjävve',
@@ -767,16 +779,18 @@ Do häs Der enzwesche e neuZweschepasswood jehollt.',
'resetpass-temp-password' => 'Zweschepasswood:',
# Special:PasswordReset
-'passwordreset' => 'Et Paßwoot zeröck säze',
-'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm en <i lang="en">e-mail</i> ze krijje, woh jät övver der Zohjang heh obb et Wiki för Desch dren shteiht.',
-'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-username' => 'Metmaacher Name:',
-'passwordreset-domain' => 'Domähn:',
-'passwordreset-email' => 'De Adräß för de <i lang="en">e-mail</i>:',
-'passwordreset-emailtitle' => 'Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Do künns et sällver jewääse sin, öhnswää hät vun dä Adräß $1 en Internet öm
+'passwordreset' => 'Et Paßwoot zeröck säze',
+'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm en <i lang="en">e-mail</i> ze krijje, woh jät övver der Zohjang heh obb et Wiki för Desch dren shteiht.',
+'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-username' => 'Metmaacher Name:',
+'passwordreset-domain' => 'Domähn:',
+'passwordreset-capture' => 'Wells De di <i lang="en">e-mail</i> beloore?',
+'passwordreset-capture-help' => 'Wann De heh e Krüzje määß, kriß de di <i lang="en">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.',
+'passwordreset-email' => 'De Adräß för de <i lang="en">e-mail</i>:',
+'passwordreset-emailtitle' => 'Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Do künns et sällver jewääse sin, öhnswää hät vun dä Adräß $1 en Internet öm
en e-mail jefrooch, met Daate övver Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
$4
Heh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:
@@ -788,7 +802,7 @@ Donn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi
Do dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot
entsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann
moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
-'passwordreset-emailtext-user' => 'Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm en e-mail jefrooch,
+'passwordreset-emailtext-user' => 'Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm en e-mail jefrooch,
met Daate övver Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
$4
Heh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:
@@ -800,9 +814,23 @@ Donn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi
Do dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot
entsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann
moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
-'passwordreset-emailelement' => 'Metmaacher Name: $1
+'passwordreset-emailelement' => 'Metmaacher Name: $1
Eijmohl-Paßwoot: $2',
-'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom Zohjang heh es verscheck.',
+'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom Zohjang heh es verscheck.',
+'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> es verscheck. 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.',
+
+# Special:ChangeEmail
+'changeemail' => 'Donn Ding Address för de <i lang="en">e-mail</i> ändere',
+'changeemail-header' => 'Donn en Adräß för de <i lang="en">e-mail</i> ändere',
+'changeemail-text' => 'Föll dat Fommulaa uß, öm Ding Adräß för de <i lang="en">e-mail</i> ze ändere.
+Do moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje.',
+'changeemail-no-info' => 'Do mööts ald enjelogg sin, öm tiräk op di Sigg jonn ze dörve',
+'changeemail-oldemail' => 'Ding Address för de <i lang="en">e-mail</i> es jäz:',
+'changeemail-newemail' => 'Ding neue Address för de <i lang="en">e-mail</i> sull wääde:',
+'changeemail-none' => '(kein)',
+'changeemail-submit' => 'Lohß jonn!',
+'changeemail-cancel' => 'Ophüre',
# Edit page toolbar
'bold_sample' => 'Fätte Schreff',
@@ -883,9 +911,6 @@ Dun en Ding Aanfroge nenne:
Do kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}\$5 {{int:ipblocklist}}]</span> loore.",
'blockednoreason' => 'Keine Aanlass aanjejovve',
-'blockedoriginalsource' => 'Dä orjenal Wiki Tex vun dä Sigg „<strong>$1</strong>“ steiht heh drunger:',
-'blockededitsource' => 'Dä Wiki Tex vun <strong>Dinge Änderunge</strong> aan dä Sigg „<strong>$1</strong>“ steiht heh drunger:',
-'whitelistedittitle' => 'Enlogge es nüdich för Sigge ze Ändere',
'whitelistedittext' => 'Do mööts ald $1, öm heh em Wiki Sigge ändere ze dürfe.',
'confirmedittext' => 'Do muss Ding E-Mail Adress ald bestätich han, ih dat De heh Sigge ändere darfs.
Drag Ding E-Mail Adress en Ding [[Special:Preferences|ming Enstellunge]] en, un dun „Dun Ding E-Mail Adress bestätije looße“ klicke.',
@@ -1005,9 +1030,8 @@ Bes De secher, watte mähs?
'copyrightwarning2' => 'De Beidräch {{GRAMMAR:en|{{SITENAME}}}} künne vun andere Metmaacher ömjemodelt
oder fottjeschmesse wääde. Wann Der dat nit rääch es, schriev nix. Et es och nüdich, dat et vun Dir selvs es, oder dat Do dat Rääch häs, et hee öffentlich wigger ze jevve. Süch $1. Wann et nit stemmp, oder Do kanns et nit nohwiese, künnt Dich dat en dr Bau bränge!',
'longpageerror' => "'''Janz schlemme Fähler:'''
-Dä Tex, dä De heh jescheck häs, dä es '''$1''' Kilobyte jroß.
-Dat sin mieh wie '''$2''' Kilobyte. Dat künne mer nit speichere!
-'''Maach kleiner Stöcke drus.'''<br />",
+Dä Tex, dä De heh jescheck häs, dä es {{PLURAL:$1|ein|$1|kei}} Kilobyte jruuß.
+Dat {{PLURAL:$2|es mieh wie ei|sin mieh wie $2|es kei}} Kilobyte. Dat künne mer nit speichere!",
'readonlywarning' => "'''Opjepass:'''
De Daatebank es jesperrt woode, wo Do ald am Ändere wors.
Dä.
@@ -1177,8 +1201,6 @@ dem Wiki singe Installation dat anders fassjelaht woode es.",
'revdelete-unsuppress' => 'De Beschrängkonge för der widderjehollte Versione ophevve',
'revdelete-log' => 'Aanlaß odder Jrund:',
'revdelete-submit' => 'Op de aanjekrützte {{PLURAL:$1|Version|Versione|-nix-}} aanwende',
-'revdelete-logentry' => 'Zojang zo de Versione verändert för „[[$1]]“',
-'logdelete-logentry' => 'hät em [[$1]] verstoche udder widder seeschba jemaat:',
'revdelete-success' => "'''De Version woot verstoche odder seeschba jemaat.'''",
'revdelete-failure' => "'''Dä Version ier Seeschbaakeit kunnte mer nit ändere:'''
$1",
@@ -1189,15 +1211,6 @@ $1",
'revdel-restore-visible' => 'seeshtba Versione',
'pagehist' => 'Älldere Versione',
'deletedhist' => 'Fottjeschmesse Versione',
-'revdelete-content' => 'dä Enhalt fun dä Sigg',
-'revdelete-summary' => 'dä Täx en „{{int:summary}}“',
-'revdelete-uname' => 'dä Metmaachername',
-'revdelete-restricted' => ', och för de Wiki-Köbesse',
-'revdelete-unrestricted' => ', och för de Wiki-Köbesse',
-'revdelete-hid' => '$1 verstoche',
-'revdelete-unhid' => '$1 weder seeschbaa jemaat',
-'revdelete-log-message' => 'hät för {{PLURAL:$1|eij Version|$2 Versione|nix}} $1',
-'logdelete-log-message' => '$1 för {{PLURAL:$2|eine Endraach|$2 Endräch|keine Endraach}} em Logboch',
'revdelete-hide-current' => 'Ene Fähler es opjetodde beim Verschteische. De Version vum $1 öm $2 Uhr es de neuste Version, un kann dröm nit verschtoche wääde.',
'revdelete-show-no-access' => 'Ene Fähler es opjetodde beim Aanloore. De Version vum $1 öm $2 Uhr es verschtoche, un De häß dröm keine Zohjang doh drop.',
'revdelete-modify-no-access' => 'Ene Fähler es opjetodde beim Ändere. De Version vum $1 öm $2 Uhr es verschtoche, un De häß dröm keine Zohjang doh drop.',
@@ -1361,12 +1374,14 @@ dat dänne ihr Daate topaktuell sin,
'prefs-rc' => 'Neuste Änderunge',
'prefs-watchlist' => 'De Oppassliss',
'prefs-watchlist-days' => 'Aanzahl Daare för en ming Oppassliss aanzezeije:',
-'prefs-watchlist-days-max' => 'Nit mieh wie 7 Dääch',
+'prefs-watchlist-days-max' => 'Nit mieh wie {{PLURAL:$1|eine Daach|$1 Dääch|keine Daach}}',
'prefs-watchlist-edits' => 'Aanzahl Änderunge för en ming verjrößerte Oppassliss aanzezeije:',
'prefs-watchlist-edits-max' => 'Nit mieh wie 1000',
'prefs-watchlist-token' => 'Oppassleß-Kennzeishe:',
'prefs-misc' => 'Söns',
'prefs-resetpass' => 'Dat Passwood ändere',
+'prefs-changeemail' => 'Donn en Adräß för de <i lang="en">e-mail</i> ändere',
+'prefs-setemail' => 'Donn en Adräß för de <i lang="en">e-mail</i> faßlääje',
'prefs-email' => '<i lang="en">e-mail</i>',
'prefs-rendering' => 'Et Sigge-Aanzeije',
'saveprefs' => 'Fasshalde',
@@ -1426,6 +1441,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'yourrealname' => 'Dinge richtije Name *',
'yourlanguage' => 'Die Sproch, die et Wiki kalle soll:',
'yourvariant' => 'Der Dijaläk, de Schriefwies, de Zoot Shprooch för der Enhald.',
+'prefs-help-variant' => 'Der Dijaläk udder de Schriefwies udder de Zoot Shprooch, di De för der Enhald.vun Sigge am leevsde häs.',
'yournick' => 'Ding&nbsp;„Ongerschreff“&nbsp;*',
'prefs-help-signature' => '* Beidrääsch op Klaafsigge sullte met „<nowiki>~~~~</nowiki>“ ophüere, dat weed beim Afshpeishere en Ding „Ongerschreff“ met de Uhrzig un em Dattum ömjewandelt.',
'badsig' => 'Di Ungeschreff jëijd_esu nit — luer noh dem HTML do_dren un maach et rėshtėsh.',
@@ -1464,7 +1480,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'userrights-lookup-user' => 'Metmaacherjruppe verwalde',
'userrights-user-editname' => 'Däm Metmaacher singe Name:',
'editusergroup' => 'Metmaacher ier Jruppe un Räächde ändere',
-'editinguser' => "Heh deihs De {{GENDER:$1|däm|däm|däm Metmaacher|dä|däm}} '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) {{GENDER:$1|sing|sing|sing|ier|sing}} Rääschte ändere.",
+'editinguser' => "Heh deihs De däm '''[[User:$1|$1]]''' $2 sing Rääschde ändere.",
'userrights-editusergroup' => 'Metmaacher en Jruppe donn un uß Jruppe nämme',
'saveusergroups' => 'Metmaacherjruppe avspeichere',
'userrights-groupsmember' => 'Dä Metmaacher es en {{PLURAL:$1|dä Jropp:|dä Jroppe:|keine Jropp.}}',
@@ -1559,13 +1575,13 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'right-autopatrol' => 'De eije Änderunge automattesch als „Nohjeloohrt“ makeere',
'right-patrolmarks' => 'De „noch nit Nohjeloohrt“ Zeiche en de „{{int:recentchanges}}“ jezeich krijje',
'right-unwatchedpages' => 'De Liss med Sigge beloore, die ein keine Oppasliss dren sin',
-'right-trackback' => 'Trackback övvermedelle',
'right-mergehistory' => 'Ahle Versione vun ongerscheedlijje Sigge zosammedonn',
'right-userrights' => 'Metmaacher ier Rääschte ändere',
'right-userrights-interwiki' => 'Metmaacher ier Rääschte in ander Wikis ändere',
'right-siteadmin' => 'De Datebank deeschmaache un opmaache för Änderunge',
'right-override-export-depth' => 'Beim Sigge Expoteere de Sigge metnämme, woh Lingks drop jon — beß fönef Schredde wigk',
'right-sendemail' => '<i lang="en">e-mail</i> aan ander Metmaacher schecke',
+'right-passwordreset' => 'De <i lang="en">e-mails</i> vum Paßwoot neu Säze aanloore',
# User rights log
'rightslog' => 'Logboch för Änderunge aan Metmaacher-Räächde',
@@ -1599,16 +1615,17 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'action-suppressionlog' => 'hee dat jeheime Logboch aanzeloore',
'action-block' => 'hee dämm Metmaacher et Sigge Ändere ze verbeede',
'action-protect' => 'hee dä Sigg iere Sigge-Schotz ze ändere',
+'action-rollback' => 'all de letzte Änderunge fom letzte Metmaacher aan ene beshtemmpte Sigg flöck retur ze maache',
'action-import' => 'hee di Sigg uss enem andere Wiki ze empotteere',
'action-importupload' => 'hee di Sigg uss ene huhjelaade Datei ze impotteere',
'action-patrol' => 'anderlüx Änderunge als „nohjeloort“ ze makeere',
'action-autopatrol' => 'Ding eije Änderunge sälver als „nohjeloort“ ze makeere',
'action-unwatchedpages' => 'de Leß met de Sigg en kei Oppassleß aanzeloore',
-'action-trackback' => 'e <i lang="en">trackback</i> enzedraare',
'action-mergehistory' => 'hee dä Sigg ier Verjangeheit un Versijon met ene andere zosamme ze lääje',
'action-userrights' => 'alle Metmaacher ier Rääschte ze ändere',
'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',
# Recent changes
'nchanges' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Kein Änderung}}',
@@ -1641,6 +1658,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'rc_categories' => 'Nor de Saachjruppe (met „|“ dozwesche):',
'rc_categories_any' => 'All, wat mer han',
'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Bytes|Bytes}} noh dem Ändere',
'newsectionsummary' => 'Neu Avschnet /* $1 */',
'rc-enhanced-expand' => 'Einzelheite zeije (bruch JavaSkripp)',
'rc-enhanced-hide' => 'Einzelheite versteiche',
@@ -1650,7 +1668,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-backlink' => 'â†&nbsp;$1',
'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.
@@ -1705,6 +1722,7 @@ die mer en Titele vun Sigge nit bruche kann.
<br />
Sök Der statt „$1“ jet anders us,
un dann muss de dat Dinge noch ens huhlade.',
+'filename-toolong' => 'Name för Dateije künne nit mih wi 240 Bytes lang sind.',
'badfilename' => 'De Datei es en „$1“ ömjedäuf.',
'filetype-mime-mismatch' => 'Dä Datei ier Ängk vum Name (<code lang="en">.$1</code>) paß nit zo dä <i lang="en">MIME</i>-Zoot (<code lang="en">$2</code>)',
'filetype-badmime' => 'Dateie mem MIME-Typ „<code>$1</code>“ wulle mer nit huhjelade krijje.',
@@ -1824,6 +1842,33 @@ Wann et nit flupp, verzäll et enem [[Special:ListUsers/sysop|Wiki-Köbes]].',
'upload-unknown-size' => 'Mer weße nit, wi jruuß',
'upload-http-error' => 'Ene <i lang="en">HTTP</i>-Fäähler es opjetrodde: $1',
+# File backend
+'backend-fail-stream' => 'Mer kunnte di Dattei $1 nit övverdraare.',
+'backend-fail-backup' => 'Mer kunnte kein Sescherongskopih vun dä Dattei $1 maache.',
+'backend-fail-notexists' => 'En Dattei $1 jidd et nit.',
+'backend-fail-hashes' => 'Mer kunnte kein Pröfsomme vun dä Datteje träcke zom verjliesche.',
+'backend-fail-notsame' => 'En Dattei mem Name $1 jidd et ald, di es ävver ongerscheidlesch.',
+'backend-fail-delete' => 'Mer kunnte di Dattei $1 nit fottschmiiße.',
+'backend-fail-alreadyexists' => 'En Dattei $1 jidd et ald.',
+'backend-fail-store' => 'Mer kunnte di Dattei $1 nit onger $2 affschpeischere.',
+'backend-fail-copy' => 'Mer kunnte di Dattei $1 nit noh $2 koppÄ—Ä—ere.',
+'backend-fail-move' => 'Mer kunnte di Dattei $1 nit op $2 ömdäufe.',
+'backend-fail-opentemp' => 'Mer kunnte de Zweschedattei no opmaache.',
+'backend-fail-writetemp' => 'Mer kunnte nit en de Zweschedattei schriive.',
+'backend-fail-closetemp' => 'Mer kunnte de Zweschedattei no zohmaache.',
+'backend-fail-read' => 'Mer kunnte di Dattei $1 nit lässe.',
+'backend-fail-create' => 'Mer kunnte di Dattei $1 nit aanlääje.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Mer kunnte „$1“ nit freijävve. Ed es nit jeschpächt.',
+'lockmanager-fail-closelock' => 'Mer kunnte di Schpärdatei för „$1“ nit zohmaache.',
+'lockmanager-fail-deletelock' => 'Mer kunnte di Schpärdatei för „$1“ nit fottschmiiße.',
+'lockmanager-fail-acquirelock' => 'Mer kunnte kein Schpärr för „$1“ krijje.',
+'lockmanager-fail-openlock' => 'Mer kunnte di Schpärdatei för „$1“ nit opmaache.',
+'lockmanager-fail-releaselock' => 'Mer kunnte di Schpärr för „$1“ nit ophävve.',
+'lockmanager-fail-db-release' => 'Mer kunnte di Schpärre för de Daatebangk „$1“ nit ophävve.',
+'lockmanager-fail-svr-release' => 'Mer kunnte di Schpärre för dä ẞööver „$1“ nit ophävve.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Ene Fähler es opjetrodde, wi me di ZIP-Sammel_Dattei ußpacke wullte för der Enhallt ze proofe.',
'zip-wrong-format' => 'De aanjejovve Dattei es kein ZIP-Sammel_Dattei.',
@@ -1840,6 +1885,7 @@ Se kann nit aanjemäße jeprööf wääde, of se sescher es.',
'uploadstash-badtoken' => 'Dat ze donn hät nit jeflupp. Velleich wohre Ding Daate zom Deil verschött jejange udder afjeloufe. Versöhg et nor_rens.',
'uploadstash-errclear' => 'Mer kunnte de Dateie nit fottschmieße.',
'uploadstash-refresh' => 'De Leß met de Dateie op ene neue Shtand bränge',
+'invalid-chunk-offset' => 'Ene onjöltijje Aanfangspungk för dä Rötsch',
# img_auth script messages
'img-auth-accessdenied' => 'Keine Zohjang',
@@ -1940,7 +1986,6 @@ Dat sellve shteiht hee dronger.',
# File reversion
'filerevert' => '„$1“ zerök holle',
-'filerevert-backlink' => 'â†&nbsp;$1',
'filerevert-legend' => 'Datei zeröck holle',
'filerevert-intro' => '<span class="plainlinks">Do bes di Datei \'\'\'[[Media:$1|$1]]\'\'\' op di [$4 Version fum $2 öm $3 Uhr] zeröck aam sätze.</span>',
'filerevert-comment' => 'Jrond:',
@@ -1950,25 +1995,25 @@ Dat sellve shteiht hee dronger.',
'filerevert-badversion' => 'Mer han kei Version fun dä Datei för dä aanjejovve Zickpunk.',
# File deletion
-'filedelete' => 'Schmieß „$1“ fott',
-'filedelete-backlink' => 'â†&nbsp;$1',
-'filedelete-legend' => 'Schmieß de Datei fott',
-'filedelete-intro' => "Do beß di Datei '''„[[Media:$1|$1]]“''' am Fottschmieße, un och all ier vörrije Versione, der Text övver se, un all de Änderunge draan.",
-'filedelete-intro-old' => '<span class="plainlinks">Do schmiiß de Version [$4 fum $2 öm $3 Uhr] fun dä Datei „[[Media:$1|$1]]“ fott.</span>',
-'filedelete-comment' => 'Aanlaß odder Jrund:',
-'filedelete-submit' => 'Fottschmieße',
-'filedelete-success' => "'''„$1“''' es fottjeschmeße.",
-'filedelete-success-old' => "Fun dä Datei '''„[[Media:$1|$1]]“''' es jäz di Version fum $2 öm $3 Uhr fottjeschmeße woode.",
-'filedelete-nofile' => "„$1“''' jidd_et nit.",
-'filedelete-nofile-old' => "Fun '''„$1“''' ham_mer kein arschiveete Version met dä Eijeschaffte.",
-'filedelete-otherreason' => 'Ander Jrund oder Zosätzlich:',
-'filedelete-reason-otherlist' => 'Ne andere Jrund',
-'filedelete-reason-dropdown' => '* Alljemein Jrönd
+'filedelete' => 'Schmieß „$1“ fott',
+'filedelete-legend' => 'Schmieß de Datei fott',
+'filedelete-intro' => "Do beß di Datei '''„[[Media:$1|$1]]“''' am Fottschmieße, un och all ier vörrije Versione, der Text övver se, un all de Änderunge draan.",
+'filedelete-intro-old' => '<span class="plainlinks">Do schmiiß de Version [$4 fum $2 öm $3 Uhr] fun dä Datei „[[Media:$1|$1]]“ fott.</span>',
+'filedelete-comment' => 'Aanlaß odder Jrund:',
+'filedelete-submit' => 'Fottschmieße',
+'filedelete-success' => "'''„$1“''' es fottjeschmeße.",
+'filedelete-success-old' => "Fun dä Datei '''„[[Media:$1|$1]]“''' es jäz di Version fum $2 öm $3 Uhr fottjeschmeße woode.",
+'filedelete-nofile' => "„$1“''' jidd_et nit.",
+'filedelete-nofile-old' => "Fun '''„$1“''' ham_mer kein arschiveete Version met dä Eijeschaffte.",
+'filedelete-otherreason' => 'Ander Jrund oder Zosätzlich:',
+'filedelete-reason-otherlist' => 'Ne andere Jrund',
+'filedelete-reason-dropdown' => '* Alljemein Jrönd
** Wä dat Denge huhjelade hät, wollt et esu
** Wohr jäje et Urhävverrääsch
** Dubbelt',
-'filedelete-edit-reasonlist' => 'De Jrönde för et Fottschmieße beärbeide',
-'filedelete-maintenance' => 'Datteie Fottschmiiße un widder zerök Holle jeiht jez jrad nit, mer hann Waadong.',
+'filedelete-edit-reasonlist' => 'De Jrönde för et Fottschmieße beärbeide',
+'filedelete-maintenance' => 'Datteie Fottschmiiße un widder zerök Holle jeiht jez jrad nit, mer hann Waadong.',
+'filedelete-maintenance-title' => 'Di Dattei künne mer nit fottschmiiße',
# MIME search
'mimesearch' => 'Dateie üvver dänne ehre <span lang="en">MIME</span>-Typ söke',
@@ -2082,6 +2127,7 @@ Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
'mostimages' => 'Dateie met de miehste Links drop',
'mostrevisions' => 'Atikkele met de miehste Änderunge',
'prefixindex' => 'All Sigge, dänne ehr Name met enem bestemmte Wood oder Tex aanfängk',
+'prefixindex-namespace' => 'All Sigge med enem beschtemmpte Aanfang (Appachtemang $1 )',
'shortpages' => 'Atikele zoteet vun koot noh lang',
'longpages' => 'Atikele zoteet vun lang noh koot',
'deadendpages' => 'Atikele ohne Links dren',
@@ -2209,12 +2255,8 @@ De Brauserprotokolle, di beim Söke aanjejovve wäde künne, sen: <tt>$1</tt>es'
'activeusers-noresult' => 'Kein Metmaacher jefonge.',
# Special:Log/newusers
-'newuserlogpage' => 'Logboch för neu Metmaachere',
-'newuserlogpagetext' => 'He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.',
-'newuserlog-byemail' => 'dat Passwood wood med de e-mail loßjescheck',
-'newuserlog-create-entry' => 'eß enne nöüje Metmaacher',
-'newuserlog-create2-entry' => 'hät ene nöüje Zojang enjerėshdt för „$1“',
-'newuserlog-autocreate-entry' => 'dä Metmaacher wood automattesch aanjemelldt',
+'newuserlogpage' => 'Logboch för neu Metmaachere',
+'newuserlogpagetext' => 'He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.',
# Special:ListGroupRights
'listgrouprights' => 'Metmaacher-Jruppe-Rääschte',
@@ -2250,7 +2292,7 @@ die weed als em Avsender sing Adress en die E-Mail enjedrage.
Domet kann, wä die E-Mail kritt, drop antwoote, un die Antwood jeiht tirek aan Dech.
Alles klor?',
'usermailererror' => 'Dat E-Mail-Objek jov ene Fähler us:',
-'defemailsubject' => 'e-mail {{GRAMMAR:fun|{{SITENAME}}}}.',
+'defemailsubject' => 'e-mail fum $1 {{GRAMMAR:fun|{{SITENAME}}}}.',
'usermaildisabled' => 'De <i lang="en">e-mail</i> zwesche Metmaachere es ußjeschalt',
'usermaildisabledtext' => 'Do kanns kein <i lang="en">e-mail</i> aan ander Metmaacher heh en dämm Wiki schecke',
'noemailtitle' => 'Kein E-Mail Adress',
@@ -2308,7 +2350,7 @@ dann klick op „Nimieh drop oppasse“ wann De die Sigg om Schirm häs.",
'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}}.',
'iteminvalidname' => 'Dä Endrach „$1“ hät ene kapodde Name.',
-'wlnote' => '{{PLURAL:$1|Hee es de letzte Änderung us|Hee sin de letzte <strong>$1</strong> Änderunge us|Mer han kein Äbderunge en}} de letzte {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}}.',
+'wlnote' => '{{PLURAL:$1|Hee es de letzte Änderung us|Hee sin de letzte <strong>$1</strong> Änderunge us|Mer han kein Äbderunge en}} de letzte {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.',
'wlshowlast' => 'Zeich de letzte | $1 | Stunde | $2 | Dage | $3 | aan, dun',
'watchlist-options' => 'Eijeschaffte fun de Oppassless',
@@ -2366,7 +2408,6 @@ Do kanns hee noh Hölp luure:
'exbeforeblank' => 'drop stundt vörher: „$1“',
'exblank' => 'drop stundt nix',
'delete-confirm' => '„$1“ fottschmieße',
-'delete-backlink' => 'â†&nbsp;$1',
'delete-legend' => 'Fottschmieße',
'historywarning' => '<strong>Opjepass:</strong> Die Sigg, di De fott schmiiße wells, hät {{PLURAL:$1|ein ällder Version|ald Stöcker $1 ällder Versione|jaa kei ällder Versione}}.',
'confirmdeletetext' => 'Do bes koot dovör, en Sigg för iwich fottzeschmieße. Dobei verschwind och de janze Verjangenheit vun dä Sigg us de Daatebank, met all ehr Änderunge un Metmaacher Name, un all dä Opwand, dä do dren stich. Do muss heh jetz bestätije, dat de versteihs, wat dat bedügg, un dat De weiß, wat Do do mähs.
@@ -2374,8 +2415,6 @@ Do kanns hee noh Hölp luure:
'actioncomplete' => 'Erledich',
'actionfailed' => 'Dat es donevve jejange',
'deletedtext' => 'De Sigg „$1“ es jetz fottjeschmesse woode. Luur Der „$2“ aan, do häs De en Liss met de Neuste fottjeschmesse Sigge.',
-'deletedarticle' => 'hät fottjeschmesse: „[[$1]]“',
-'suppressedarticle' => 'han „[[$1]]“ verstoche',
'dellogpage' => 'Logboch met de fottjeschmesse Sigge',
'dellogpagetext' => 'Hee sin de Sigge oppjeliss, die et neus fottjeschmesse woodte.',
'deletionlog' => 'Dat Logboch fum Sigge-Fottschmieße',
@@ -2418,8 +2457,10 @@ En Leß met de [[Special:ProtectedPages|em Momang jeschözde Sigge]] ham_mer och
'unprotectedarticle' => 'hät der Schotz för di Sigg „[[$1]]“ opjehovve udder verändert.',
'movedarticleprotection' => 'hät de Enstellunge för der Sigge-Schotz fun „[[$2]]“ noh „[[$1]]“ övvernomme',
'protect-title' => 'Sigge Schotz för „$1“ ändere',
+'protect-title-notallowed' => 'Dä Schotz för di Sigg „$1“ ändere',
'prot_1movedto2' => 'hät de Sigg vun „[[$1]]“ en „[[$2]]“ ömjenannt.',
-'protect-backlink' => 'â†&nbsp;$1',
+'protect-badnamespace-title' => 'Appachtemang nit schözbaa.',
+'protect-badnamespace-text' => 'En dämm Appachtemang kam_mer kein Sigge schöze.',
'protect-legend' => 'Sigg schötze',
'protectcomment' => 'Aanlaß odder Jrund:',
'protectexpiry' => 'Duur, wi lang:',
@@ -2439,6 +2480,7 @@ Di Sigg '''„$1“:''' es jetz jrad:",
'protect-level-sysop' => 'Nor de Wiki-Köbesse dranlooße',
'protect-summary-cascade' => 'met Schotz-Kaskad',
'protect-expiring' => 'bes öm $3 Uhr (UTC) aam $2',
+'protect-expiring-local' => 'löüf uß: $1',
'protect-expiry-indefinite' => 'för iewich',
'protect-cascade' => 'Maach en Schoz-Kaskaade — all de Schablone en dä Sigg krijje dersellve Schoz, wi die Sigg sellver en kritt.',
'protect-cantedit' => 'Do kanns dä Siggeschotz heh nit ändere, esu lang wie De di Sigg nit ändere darfs.',
@@ -2499,7 +2541,6 @@ Versione för die neu Sigg enjerich. Die neu Sigg weed nit ersetz.',
'undeletereset' => 'De Felder usleere',
'undeleteinvert' => 'De Ußwahl ömdrije',
'undeletecomment' => 'Jrond (för en et Logboch):',
-'undeletedarticle' => '„$1“ zeröckjehollt',
'undeletedrevisions' => '{{PLURAL:$1|ein Version|$1 Versione}} zeröckjehollt',
'undeletedrevisions-files' => 'Zesammejenomme {{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} vun {{PLURAL:$2|eine Datei|<strong>$2</strong> Dateie|<strong>nix</strong>}} zeröckjehollt',
'undeletedfiles' => '{{PLURAL:$1|Ein Datei|<strong>$1</strong> Dateie|<strong>Kein</strong> Dateie}} zeröckjehollt',
@@ -2508,6 +2549,7 @@ Versione för die neu Sigg enjerich. Die neu Sigg weed nit ersetz.',
Luur Der et [[Special:Log/delete|Logboch met de fottjeschmesse Sigge]] aan, do häs De de Neuste fottjeschmesse
un widder herjehollte Sigge.',
'undelete-header' => 'Loor Der [[Special:Log/delete|{{LCFIRST:{{int:deletionlog}}}}]] aan, doh fengks De de och neulesch fottjeschmesse Sigge.',
+'undelete-search-title' => 'Noh fottjeschmesse Sigge söke',
'undelete-search-box' => 'Noh fottjeschmesse Sigge söke',
'undelete-search-prefix' => 'Zeisch Sigge, di aanfange met:',
'undelete-search-submit' => 'Söhke',
@@ -2516,6 +2558,7 @@ un widder herjehollte Sigge.',
'undelete-bad-store-key' => 'Dä Dattei ier Version fun dä Zick $1 kunnte mer nit zeröck holle: Di Datei wohr ald beim Fottschmieße ja nimmieh do.',
'undelete-cleanup-error' => 'Fähler beim Fottschmieße vun de Archiv-Version „$1“, die nit jebruch wood.',
'undelete-missing-filearchive' => 'De Datei met dä Archiv-Nommer $1 künne mer nit zerök holle. Di ham_mer nit in de Datebangk. Künnt sinn, di es ald zeröckjehollt.',
+'undelete-error' => 'Ene Fähler es opjetrodde beim Zerökholle',
'undelete-error-short' => 'Fähler beim Zerökholle fun de Datei $1',
'undelete-error-long' => 'Mer wollte en Datei widder zeröckholle, ävver dobei sin_er Fääler opjefalle:
@@ -2562,7 +2605,6 @@ De neuste Sperr ier Enndraach em Logbooch es:',
'whatlinkshere' => 'Wat noh heh link',
'whatlinkshere-title' => 'Sigge, woh Links op „$1“ dren sen',
'whatlinkshere-page' => 'Sigg:',
-'whatlinkshere-backlink' => 'â†&nbsp;$1',
'linkshere' => 'Dat sin de Sigge, die op <strong>„[[:$1]]“</strong> linke dun:',
'nolinkshere' => 'Kein Sigg link noh <strong>„[[:$1]]“</strong>.',
'nolinkshere-ns' => 'Nix link op <strong>„[[:$1]]“</strong> en dämm Appachtemang.',
@@ -2643,6 +2685,7 @@ Wells De dat?',
'blocklist-userblocks' => 'De einzel Metmaacher ier Sperre ußblende',
'blocklist-tempblocks' => 'De Sperre op Zick ußblende',
'blocklist-addressblocks' => 'De einzel <i lang="en">IP</i>-Addresse ier Sperre ußblende',
+'blocklist-rangeblocks' => 'Don de Sperre för ene Berett ußblände',
'blocklist-timestamp' => 'Zick wann jesperrt',
'blocklist-target' => 'Jesperrt woodt',
'blocklist-expiry' => 'Jesperrt beß',
@@ -2665,6 +2708,7 @@ Wells De dat?',
'unblocklink' => 'widder freijevve',
'change-blocklink' => 'Sperr ändere',
'contribslink' => 'Beidräch',
+'emaillink' => 'Scheck en <span lang="en">e-mail</span>',
'autoblocker' => 'Automattisch jesperrt. Ding IP_Adress wood vör kootem vun däm Metmaacher „[[User:$1|$1]]“ jebruch. Dä es jesperrt woode wäje: „$2“',
'blocklogpage' => 'Logboch met Metmaacher-Sperre',
'blocklog-showlog' => 'Heh dä Metmaacher es ald fröjer jeshperrt woode. Dat Logbooch vum Metmaacher-Sperre onge künnt doh jät mieh zoh saare.',
@@ -2794,9 +2838,6 @@ En dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un e
'movepage-page-moved' => 'Di eejemoolijje Sigg „$1“ es jëz op „$2“ ömjenannt.',
'movepage-page-unmoved' => 'Mer kůnnte di Sigg „$1“ nit op „$2“ ömnënne.',
'movepage-max-pages' => 'Mer han jëtz {{PLURAL:$1|ëijn Sigg|$1 Sigge|kein Sigg}} ömjenanndt. Mieh jeiht nit automatėsch.',
-'1movedto2' => 'hät de Sigg vun „[[$1]]“ en „[[$2]]“ ömjenannt.',
-'1movedto2_redir' => 'hät de Sigg vun „[[$1]]“ en „[[$2]]“ ömjenannt un doför de ahl Ömleitungs-Sigg fottjeschmesse.',
-'move-redirect-suppressed' => 'Ömleidung ongerdrök',
'movelogpage' => 'Logboch vum Sigge Ömnenne',
'movelogpagetext' => 'Heh sin de Neuste ömjenannte Sigge opjeliss, un wä et jedon hät.',
'movesubpage' => '{{PLURAL:$1|Ungersigg|Ungersigge|Ungersigge}}',
@@ -2808,7 +2849,7 @@ En dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un e
'delete_and_move_text' => '== Dä! Dubbelte Name ==
Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?',
'delete_and_move_confirm' => 'Jo, dun di Sigg fottschmieße.',
-'delete_and_move_reason' => 'Fottjeschmesse, öm Platz för et Ömnenne ze maache',
+'delete_and_move_reason' => 'Fottjeschmesse, öm de Sigg [[$1]] ömnenne ze künne.',
'selfmove' => 'Du Doof! - dä ahle Name un dä neue Name es däselve - do hät et Ömnenne winnich Senn.',
'immobile-source-namespace' => 'Sigge en dämm Appachtemang „$1“ künne nit ömjenannt wääde',
'immobile-target-namespace' => 'Sigge künne nit en dat Appachtemang „$1“ erenn ömjenannt wääde',
@@ -2840,10 +2881,12 @@ Schriev de Titele vun dä Sigge en dat Feld för Tex enzejevve, unge, eine Titel
Dann dun onoch ussöke, ov De all de vörherije Versione vun dä Sigge han wells, oder nor de aktuelle met dä Informatione vun de letzte Änderung.
En däm Fall künns De, för en einzelne Sigg, och ene tirekte Link bruche, zom Beispill „[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]“ för de Sigg „[[{{MediaWiki:Mainpage}}]]“ ze exporteere.",
+'exportall' => 'Alle Sigge Äxpotteere',
'exportcuronly' => 'Bloß de aktuelle Version usjevve (un <strong>nit</strong> de janze ahle Versione onoch met dobei dun)',
'exportnohistory' => '----
<strong>Opjepass:</strong> de janze Versione Exporteere es heh em Wiki avjeschalt. Schad, ävver et wör en
zo jroße Lass för dä ẞööver.',
+'exportlistauthors' => 'Donn en kumpläte Lėß met dä Schriiver för en Sigg dobei',
'export-submit' => 'Loss_Jonn!',
'export-addcattext' => 'Sigge dobei donn us dä Saachjrupp:',
'export-addcat' => 'Dobei donn',
@@ -2876,6 +2919,8 @@ Wenn De jenerell aan [//www.mediawiki.org/wiki/Localisation MediaWiki singe Öve
'thumbnail_error' => 'Ene Fähler es opjetauch beim Maache vun enem Breefmarke/Thumbnail-Beldche: „$1“',
'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.',
+'thumbnail-dest-create' => 'Mer kunnte kein Minnibeldscher faßhallde, woh se hen sulle.',
'thumbnail_invalid_params' => 'Ene Parameter för et Breefmarke-Belldsche (<i lang="en">thumbnail</i>) Maache wohr nit en Odenung',
'thumbnail_dest_directory' => 'Dat Verzeichnis för dat erin ze donn kunte mer nit aanlääje.',
'thumbnail_image-type' => 'Di Zoot Beld künne mer nit met ömjonn',
@@ -2921,6 +2966,11 @@ Dat ahle Versione Huhlade es avjeschalt, un es nit müjjelich.',
'import-token-mismatch' => 'Schadt. Et senn nit alle Date heh aanjekumme.
Bes esu joot, un versök et noch ens.',
'import-invalid-interwiki' => 'Us dämm jenannte Wiki künne mer nix Importeere.',
+'import-error-edit' => 'Di Sigg „$1“ es nit impoteet woode. Do häs nit et Rääsch, se ze ändre.',
+'import-error-create' => 'Di Sigg „$1“ es nit impoteet woode. Do häs nit et Rääsch, se aanzlääje.',
+'import-error-interwiki' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name för et Verlengke noh ußerhallef, pä Engerwiki-Lengk, jebruch weed.',
+'import-error-special' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name en enem besöndere Appachtemang litt, woh kein Sigge dren zohjelohße sin.',
+'import-error-invalid' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name nit jöltesch es.',
# Import log
'importlogpage' => 'Logboch met emporteerte Sigge',
@@ -2930,74 +2980,81 @@ Bes esu joot, un versök et noch ens.',
'import-logentry-interwiki' => 'hät tirek vum ander Wiki emporteet: „$1“',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|ein Version|$1 Versione|kein Version}} vun „$2“',
+# JavaScriptTest
+'javascripttest-disabled' => 'Di Funxjon es ußjeschalldt.',
+'javascripttest-title' => 'De Prööfunge „$1“ loufe.',
+'javascripttest-pagetext-unknownframework' => 'Dä Prööfrahme „$1“ es onbikannt.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Don Ding eije Metmaachersigg aanzeije',
-'tooltip-pt-anonuserpage' => 'Metmaachersigg för die IP-Adress, vun wo uß De jraad Ding Änderunge un Äjänzunge aam Wiki am maache bes',
-'tooltip-pt-mytalk' => 'Dun Ding eije Klaafsigg aanzeije',
-'tooltip-pt-anontalk' => 'Klaaf övver Änderunge, di vun dä IP-Adress uß jemaat wodte',
-'tooltip-pt-preferences' => 'De eije Enstellunge',
-'tooltip-pt-watchlist' => 'De Liss met de Sigge en Dinge eije Oppassliss',
-'tooltip-pt-mycontris' => 'en Liss met Dinge eije Beidräch',
-'tooltip-pt-login' => 'Do moß Desch nit Enlogge, kannz_E ävver jähn maache!',
-'tooltip-pt-anonlogin' => 'Wöhr nett wann De enlogge dääts, moß ävver nit.',
-'tooltip-pt-logout' => 'Uslogge',
-'tooltip-ca-talk' => 'Dun die Sigg met däm Klaaf övver heh de Sigg aanzeije',
-'tooltip-ca-edit' => 'De kanns die Sigg heh ändere — für em Avspeichere, donn eetß ens enen Bleck op de Vör-Aansich',
-'tooltip-ca-addsection' => 'Donn heh enne neue Afschnett opmaache.',
-'tooltip-ca-viewsource' => "Die Sigg es jeschötz. Dä Wikitex kam'mer ävver beloore.",
-'tooltip-ca-history' => 'Ällder Versione vun dä Sigg',
-'tooltip-ca-protect' => 'Dun die Sigg schötze',
-'tooltip-ca-unprotect' => 'Donn dä Schoz vun dä Sigg heh verändere udder ophävve.',
-'tooltip-ca-delete' => 'Dun die Sigg fottschmieße',
-'tooltip-ca-undelete' => 'Don de Änderunge widder zerök holle, di aan dä Sigg heh jemat woode wore, ih dat se fottjeschmesse wood',
-'tooltip-ca-move' => 'Dun die Sigg ömbenenne',
-'tooltip-ca-watch' => 'Dun die Sigg en Ding Oppassliss opnemme',
-'tooltip-ca-unwatch' => 'Schmieß die Sigg us Dinge eije Oppassliss erus',
-'tooltip-search' => '{{ucfirst:{{GRAMMAR:en|{{SITENAME}}}}}} söke',
-'tooltip-search-go' => 'Jank noh dä Sigg med jenou dämm Name',
-'tooltip-search-fulltext' => 'Sök noh Sigge, wo dä Tex dren enthallde es',
-'tooltip-p-logo' => 'Houpsigg',
-'tooltip-n-mainpage' => 'Houpsigk aanzeije',
-'tooltip-n-mainpage-description' => 'Jangk op de {{int:Mainpage}}.',
-'tooltip-n-portal' => 'Övver dat Projek heh, wat De donn un wie de metmaache kanns, wat wo ze fenge es',
-'tooltip-n-currentevents' => 'Heh kreß De e beßje Enfommazjohn övver wat jraad am Jang eß',
-'tooltip-n-recentchanges' => 'En Leß met de neuste Änderunge heh aam Wiki.',
-'tooltip-n-randompage' => 'Dun en janz zofällije Sigg ußßem Wikki trecke un aanzeije',
-'tooltip-n-help' => 'Do kriss De jehollfe',
-'tooltip-t-whatlinkshere' => 'En Liss met all de Sigge, die ene Link noh heh han',
-'tooltip-t-recentchangeslinked' => 'De neuste Änderunge aan Sigge, wo vun heh dä Sigg uß Links drop jon',
-'tooltip-feed-rss' => 'Dä RSS-Abonnomang-Kannal (Feed) för heh di Sigg',
-'tooltip-feed-atom' => 'Dä Atom-Abonnomang-Kannal (Feed) för heh di Sigg',
-'tooltip-t-contributions' => 'Donn de Liß met Bedträch vun däm Metmaacher beloore',
-'tooltip-t-emailuser' => 'Scheck en E-Mail aan dä Metmaacher',
-'tooltip-t-upload' => 'Dateie huhlade',
-'tooltip-t-specialpages' => 'Liss met de {{int:nstab-special}}e',
-'tooltip-t-print' => 'De Drock-Aansich för heh die Sigg',
-'tooltip-t-permalink' => 'Ene iewich haltbare Lenk (Permalink) op jenou die Version vun heh dä Sigg, die de jrad süühß un am beloore bes',
-'tooltip-ca-nstab-main' => 'Don dä Enhallt vun dä Sigg aanzeije',
-'tooltip-ca-nstab-user' => 'Dun die Metmaachersig aanzeije',
-'tooltip-ca-nstab-media' => 'Don de Sigg övver en Mediendatei aanzeije',
-'tooltip-ca-nstab-special' => "Dat is en {{int:nstab-special}}. Do kam'mer nix draan verändere.",
-'tooltip-ca-nstab-project' => 'Dun die Projeksigg aanzeije',
-'tooltip-ca-nstab-image' => 'Dun die Sigg üvver heh di Dattei aanzeije',
-'tooltip-ca-nstab-mediawiki' => 'En Täx vum MediaWiki-System aanzeije',
-'tooltip-ca-nstab-template' => 'Dun die Schabloon aanzeije',
-'tooltip-ca-nstab-help' => 'Donn en Sigg met Hölp aanzeije',
-'tooltip-ca-nstab-category' => 'Dun die Saachjrupp aanzeije',
-'tooltip-minoredit' => 'Deit Ding Änderunge als klein Mini-Änderunge markeere.',
-'tooltip-save' => 'Deit Ding Änderunge avspeichere.',
-'tooltip-preview' => 'Liss de Vör-Aansich vun dä Sigg un vun Dinge Änderunge ih datte se Avspeichere deis!',
-'tooltip-diff' => 'Zeich Ding Änderunge am Tex aan.',
-'tooltip-compareselectedversions' => 'Dun de Ungerscheid zwesche dä beids usjewählde Versione zeije.',
-'tooltip-watch' => 'Op die Sigg heh oppasse.',
-'tooltip-recreate' => 'En fottjeschmesse Sigg widder zeröckholle',
-'tooltip-upload' => 'Mem Dattei-Huhlaade loßlääje',
-'tooltip-rollback' => 'Nemmp alle Änderunge zeröck, di dä Läzde jemaat hät, dä aan dä Sigg övverhoup jet jedonn hät. Deit nimmieh frore un määd ene automattesche Endraach en „{{int:Summary}}“',
-'tooltip-undo' => '„{{UCfirst:{{int:editundo}}}}“ määt der förije Zostand
+'tooltip-pt-userpage' => 'Don Ding eije Metmaachersigg aanzeije',
+'tooltip-pt-anonuserpage' => 'Metmaachersigg för die IP-Adress, vun wo uß De jraad Ding Änderunge un Äjänzunge aam Wiki am maache bes',
+'tooltip-pt-mytalk' => 'Dun Ding eije Klaafsigg aanzeije',
+'tooltip-pt-anontalk' => 'Klaaf övver Änderunge, di vun dä IP-Adress uß jemaat wodte',
+'tooltip-pt-preferences' => 'De eije Enstellunge',
+'tooltip-pt-watchlist' => 'De Liss met de Sigge en Dinge eije Oppassliss',
+'tooltip-pt-mycontris' => 'en Liss met Dinge eije Beidräch',
+'tooltip-pt-login' => 'Do moß Desch nit Enlogge, kannz_E ävver jähn maache!',
+'tooltip-pt-anonlogin' => 'Wöhr nett wann De enlogge dääts, moß ävver nit.',
+'tooltip-pt-logout' => 'Uslogge',
+'tooltip-ca-talk' => 'Dun die Sigg met däm Klaaf övver heh de Sigg aanzeije',
+'tooltip-ca-edit' => 'De kanns die Sigg heh ändere — für em Avspeichere, donn eetß ens enen Bleck op de Vör-Aansich',
+'tooltip-ca-addsection' => 'Donn heh enne neue Afschnett opmaache.',
+'tooltip-ca-viewsource' => "Die Sigg es jeschötz. Dä Wikitex kam'mer ävver beloore.",
+'tooltip-ca-history' => 'Ällder Versione vun dä Sigg',
+'tooltip-ca-protect' => 'Dun die Sigg schötze',
+'tooltip-ca-unprotect' => 'Donn dä Schoz vun dä Sigg heh verändere udder ophävve.',
+'tooltip-ca-delete' => 'Dun die Sigg fottschmieße',
+'tooltip-ca-undelete' => 'Don de Änderunge widder zerök holle, di aan dä Sigg heh jemat woode wore, ih dat se fottjeschmesse wood',
+'tooltip-ca-move' => 'Dun die Sigg ömbenenne',
+'tooltip-ca-watch' => 'Dun die Sigg en Ding Oppassliss opnemme',
+'tooltip-ca-unwatch' => 'Schmieß die Sigg us Dinge eije Oppassliss erus',
+'tooltip-search' => '{{ucfirst:{{GRAMMAR:en|{{SITENAME}}}}}} söke',
+'tooltip-search-go' => 'Jank noh dä Sigg med jenou dämm Name',
+'tooltip-search-fulltext' => 'Sök noh Sigge, wo dä Tex dren enthallde es',
+'tooltip-p-logo' => 'Houpsigg',
+'tooltip-n-mainpage' => 'Houpsigk aanzeije',
+'tooltip-n-mainpage-description' => 'Jangk op de {{int:Mainpage}}.',
+'tooltip-n-portal' => 'Övver dat Projek heh, wat De donn un wie de metmaache kanns, wat wo ze fenge es',
+'tooltip-n-currentevents' => 'Heh kreß De e beßje Enfommazjohn övver wat jraad am Jang eß',
+'tooltip-n-recentchanges' => 'En Leß met de neuste Änderunge heh aam Wiki.',
+'tooltip-n-randompage' => 'Dun en janz zofällije Sigg ußßem Wikki trecke un aanzeije',
+'tooltip-n-help' => 'Do kriss De jehollfe',
+'tooltip-t-whatlinkshere' => 'En Liss met all de Sigge, die ene Link noh heh han',
+'tooltip-t-recentchangeslinked' => 'De neuste Änderunge aan Sigge, wo vun heh dä Sigg uß Links drop jon',
+'tooltip-feed-rss' => 'Dä RSS-Abonnomang-Kannal (Feed) för heh di Sigg',
+'tooltip-feed-atom' => 'Dä Atom-Abonnomang-Kannal (Feed) för heh di Sigg',
+'tooltip-t-contributions' => 'Donn de Liß met Bedträch vun däm Metmaacher beloore',
+'tooltip-t-emailuser' => 'Scheck en E-Mail aan dä Metmaacher',
+'tooltip-t-upload' => 'Dateie huhlade',
+'tooltip-t-specialpages' => 'Liss met de {{int:nstab-special}}e',
+'tooltip-t-print' => 'De Drock-Aansich för heh die Sigg',
+'tooltip-t-permalink' => 'Ene iewich haltbare Lenk (Permalink) op jenou die Version vun heh dä Sigg, die de jrad süühß un am beloore bes',
+'tooltip-ca-nstab-main' => 'Don dä Enhallt vun dä Sigg aanzeije',
+'tooltip-ca-nstab-user' => 'Dun die Metmaachersig aanzeije',
+'tooltip-ca-nstab-media' => 'Don de Sigg övver en Mediendatei aanzeije',
+'tooltip-ca-nstab-special' => "Dat is en {{int:nstab-special}}. Do kam'mer nix draan verändere.",
+'tooltip-ca-nstab-project' => 'Dun die Projeksigg aanzeije',
+'tooltip-ca-nstab-image' => 'Dun die Sigg üvver heh di Dattei aanzeije',
+'tooltip-ca-nstab-mediawiki' => 'En Täx vum MediaWiki-System aanzeije',
+'tooltip-ca-nstab-template' => 'Dun die Schabloon aanzeije',
+'tooltip-ca-nstab-help' => 'Donn en Sigg met Hölp aanzeije',
+'tooltip-ca-nstab-category' => 'Dun die Saachjrupp aanzeije',
+'tooltip-minoredit' => 'Deit Ding Änderunge als klein Mini-Änderunge markeere.',
+'tooltip-save' => 'Deit Ding Änderunge avspeichere.',
+'tooltip-preview' => 'Liss de Vör-Aansich vun dä Sigg un vun Dinge Änderunge ih datte se Avspeichere deis!',
+'tooltip-diff' => 'Zeich Ding Änderunge am Tex aan.',
+'tooltip-compareselectedversions' => 'Dun de Ungerscheid zwesche dä beids usjewählde Versione zeije.',
+'tooltip-watch' => 'Op die Sigg heh oppasse.',
+'tooltip-watchlistedit-normal-submit' => 'Donn de Titele met Hökche eruß schmieße.',
+'tooltip-watchlistedit-raw-submit' => 'Oppassliss neu fasshallde',
+'tooltip-recreate' => 'En fottjeschmesse Sigg widder zeröckholle',
+'tooltip-upload' => 'Mem Dattei-Huhlaade loßlääje',
+'tooltip-rollback' => 'Nemmp alle Änderunge zeröck, di dä Läzde jemaat hät, dä aan dä Sigg övverhoup jet jedonn hät. Deit nimmieh frore un määd ene automattesche Endraach en „{{int:Summary}}“',
+'tooltip-undo' => '„{{UCfirst:{{int:editundo}}}}“ määt der förije Zostand
fun dä Sigg op, zom Beärbeide un widder Afspeichere.
Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
-'tooltip-preferences-save' => 'Enstellunge faßhallde',
-'tooltip-summary' => 'Jif en koote Zesammefassung en',
+'tooltip-preferences-save' => 'Enstellunge faßhallde',
+'tooltip-summary' => 'Jif en koote Zesammefassung en',
# Stylesheets
'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
@@ -3095,9 +3152,6 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
# Patrol log
'patrol-log-page' => 'Logboch vun de nohjeloorte Änderunge',
'patrol-log-header' => '<!-- -->',
-'patrol-log-line' => 'hät $1 von „$2“ $3 nohjeloort.',
-'patrol-log-auto' => '(automatisch)',
-'patrol-log-diff' => 'de Version $1',
'log-show-hide-patrol' => '$1 et Logbuch vum Sigge nohlooere',
# Image deletion
@@ -3123,11 +3177,11 @@ $1',
'file-info' => 'Dateiömfang: $1, MIME-Tüp: <code>$2</code>',
'file-info-size' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, de Datei hät $3, dä MIME-Typ es: <code>$4</code>',
'file-info-size-pages' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, Ömfang:&nbsp;$3, <i lang="en">MIME</i> Zoot: $4, met {{PLURAL:$5|ein Sigg|$5 Sigge|kein Sigge}}',
-'file-nohires' => '<small>Mer han kein hüütere Oplösung vun däm Beld.</small>',
+'file-nohires' => 'Mer han kein hüütere Oplösung vun däm Beld.',
'svg-long-desc' => 'SVG-Datei, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle}} huh, dä Dateiömfang es $3',
'show-big-image' => 'Jröößer Oplöösung',
-'show-big-image-preview' => '<small>Heh di Vör_Aanseesch es $1 jruuß.</small>',
-'show-big-image-other' => '<small>Ander Oplühsunge: $1.</small>',
+'show-big-image-preview' => 'Heh di Vör_Aanseesch es $1 jruuß.',
+'show-big-image-other' => '{{PLURAL:$2|Ander Oplühsung|Ander Oplühsunge|kein ander Oplühsunge}}: $1.',
'show-big-image-size' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh',
'file-info-gif-looped' => 'läuf emmer widder vun vürre',
'file-info-gif-frames' => '{{PLURAL:$1|ei einzel Beld|$1 einzel Belder|kei einzel Beld}}',
@@ -3148,9 +3202,14 @@ $1',
'sp-newimages-showfrom' => 'Zeich de neu Dateie av däm $1 öm $2 Uhr',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'Sek.',
-'minutes-abbrev' => 'Min.',
-'hours-abbrev' => 'Std.',
+'seconds-abbrev' => '$1&nbsp;Sek.',
+'minutes-abbrev' => '$1&nbsp;Min.',
+'hours-abbrev' => '$1&nbsp;Std.',
+'seconds' => '{{PLURAL:$1|eine Sekund|$1 Sekunde|keine Sekund}}',
+'minutes' => '{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}',
+'hours' => '{{PLURAL:$1|eine Shtundt|$1 Shtunde|keine Shtundt}}',
+'days' => '{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}',
+'ago' => 'vür $1',
# Bad image list
'bad_image_list' => '<strong>Fomat:</strong>
@@ -3674,13 +3733,6 @@ Domet deiß De tirek sare, dat De di Adress nit bestätije wells.',
'scarytranscludefailed' => '[De Schablon „$1“ enzebinge hät nit jeflupp]',
'scarytranscludetoolong' => '[Schad, de URL es ze lang]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks för heh di Sigg:<br />
-$1',
-'trackbackremove' => '([$1 Fottschmieße])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback es fottjeschmesse.',
-
# Delete conflict
'deletedwhileediting' => '<strong>Opjepass:</strong> De Sigg wood fottjeschmesse, nohdäm Do ald aanjefange häs, dran ze Ändere.
Em <span class="plainlinks">[{{fullurl:Special:Log|type=delete&page=}}{{FULLPAGENAMEE}} Logboch vum Sigge-Fottschmieße]</span> künnt der Jrund shtonn.
@@ -3800,6 +3852,7 @@ De könnts Ding Oppassliss ävver och [[Special:EditWatchlist|övver e Fomulaa m
'hebrew-calendar-m12' => 'Elul',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Klaafe]])',
'timezone-utc' => 'UTC',
# Core parser functions
@@ -3903,13 +3956,16 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
'tags-hitcount' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|kein Änderunge}}',
# Special:ComparePages
-'comparepages' => 'Sigge verjliesche',
-'compare-selector' => 'Versione vun Sigge verjlieshe',
-'compare-page1' => 'De ein Sigg',
-'compare-page2' => 'De ander Sigg',
-'compare-rev1' => 'de ein Version',
-'compare-rev2' => 'de ander Version',
-'compare-submit' => 'Verjlieshe!',
+'comparepages' => 'Sigge verjliesche',
+'compare-selector' => 'Versione vun Sigge verjlieshe',
+'compare-page1' => 'De ein Sigg',
+'compare-page2' => 'De ander Sigg',
+'compare-rev1' => 'de ein Version',
+'compare-rev2' => 'de ander Version',
+'compare-submit' => 'Verjlieshe!',
+'compare-invalid-title' => 'Dä aanjejovve Tettel es nit jöltesch',
+'compare-title-not-exists' => 'De aanjejovve Sigg jidd_et nit.',
+'compare-revision-not-exists' => 'Dä aanjejovve Version jidd_et jaa nit.',
# Database error messages
'dberr-header' => 'Dat Wiki heh häd en Schwierischkeit',
@@ -3937,4 +3993,91 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
'sqlite-has-fts' => 'Version $1 (un kann en janze Täxte söhke)',
'sqlite-no-fts' => 'Version $1 (kann ävver nit en janze Täxte söhke)',
+# New logging system
+'logentry-delete-delete' => 'Dä $1 hät di Sigg „$3“ fottjeschmeße.',
+'logentry-delete-restore' => 'Dä $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt..',
+'logentry-delete-event' => 'Dä $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
+'logentry-delete-revision' => 'Dä $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-delete-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ verändert.',
+'logentry-delete-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ verändert.',
+'logentry-suppress-delete' => 'Dä $1 hät di Sigg „$3“ ongerdröck.',
+'logentry-suppress-event' => 'Dä $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
+'logentry-suppress-revision' => 'Dä $1 hät heimlesh för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-suppress-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ heimlesch verändert.',
+'logentry-suppress-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
+'revdelete-content-hid' => 'der Enhalt verstoche',
+'revdelete-summary-hid' => 'dat Fäld „{{int:summary}}“ vershtoche',
+'revdelete-uname-hid' => 'der Name vum Metmaacher verstoche',
+'revdelete-content-unhid' => 'der Enhalt öffentlesh jemaat',
+'revdelete-summary-unhid' => 'dat Fäld „{{int:summary}}“ öffentlesh jemaat',
+'revdelete-uname-unhid' => 'der Name vum Metmaacher öffentlesh jemaat',
+'revdelete-restricted' => ', och för de Wiki-Köbesse',
+'revdelete-unrestricted' => ', och för de Wiki-Köbesse',
+'logentry-move-move' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
+'logentry-move-move-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
+'logentry-move-move_redir' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleingungssigg fottjeschmeße.',
+'logentry-move-move_redir-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongssigg fottjeschmeße un kein neue Ömliedongssig aanjelaat.',
+'logentry-patrol-patrol' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
+'logentry-patrol-patrol-auto' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
+'logentry-newusers-newusers' => 'Dä $1 hät ene neue Metmaacher aanjelaat.',
+'logentry-newusers-create' => 'Dä $1 hät ene Metmaacher aanjelaat.',
+'logentry-newusers-create2' => 'Dä $1 hät dä $3 als ene neue Metmaacher aanjelaat.',
+'logentry-newusers-autocreate' => 'Dä $1 wood automattesch als Metmaacher aanjelaat.',
+'newuserlog-byemail' => 'dat Passwood wood med de e-mail loßjescheck',
+
+# Feedback
+'feedback-bugornote' => 'Wann de em Bejreff bes, övver e täschesch Probleem ze schrieve, bes esu jood un donn dat als en [$1 Fählermäldong].
+Söns, nemm dat koote Fommulaa heh dronger.
+Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg „[$3 $2]“ drop.',
+'feedback-subject' => 'Theema:',
+'feedback-message' => 'Nohreesch:',
+'feedback-cancel' => 'Stopp! Avbreche!',
+'feedback-submit' => 'Lohß jonn!',
+'feedback-adding' => 'Ben di Röckmäldong op di Sigg aam donn&nbsp;…',
+'feedback-error1' => 'Fähler: dat <i lang="en">API</i> säät jät, wat mer nit kenne',
+'feedback-error2' => 'Fähler: de Sigg ze ändere es donävve jejange',
+'feedback-error3' => 'Fähler: dat <i lang="en">API</i> joov kein Antwoot',
+'feedback-thanks' => 'Joot. Dinge Beidraach kütt op die Sigg "[$2 $1]".',
+'feedback-close' => 'Jedonn.',
+'feedback-bugcheck' => 'Joot. Donn op jeede Vall nohlooer, dat dat bes jäz noch nit [$1 bikannt wohr].',
+'feedback-bugnew' => 'Hann esch nohjelooert. Esch jävven ene neue Fähler enn.',
+
+# API errors
+'api-error-badaccess-groups' => 'Do häs nit et Rääsch, Datteije en heh dat Wiki huhzelaade.',
+'api-error-badtoken' => 'Fähler: et Kännzeijsche (<i lang="en">token</i>) es kappott.',
+'api-error-copyuploaddisabled' => 'Et Huhlaade vun enem <i lang="en">URL</i> es op däm ẞööver heh nit zohjelohße.',
+'api-error-duplicate' => 'Mer han em Wiki ald {{PLURAL:$1|[$2 en Dattei]|[$2 $1 andere Datteije]|[$2 kein Dattei]}} mem akeraat sellve Enhalldt.',
+'api-error-duplicate-archive' => 'Mer hatte {{PLURAL:$1|[$2 en ander Dattei]|[$2 ander Datteije]|[$2 kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.',
+'api-error-duplicate-archive-popup-title' => 'Ald fottjeschmeße {{PLURAL:$1|es de dubbelte Datei:|sen de dubbelte Dateije:|es kein dubbelte Datteije woode.}}',
+'api-error-duplicate-popup-title' => 'Di {{PLURAL:$1|Datei es|Dateie sen|Datei es}} ald doh!',
+'api-error-empty-file' => 'En dä huhjelaade Dattei wohr jaa_nix dren.',
+'api-error-emptypage' => 'Neu läddijje Sigge aanzelääje es verbodde.',
+'api-error-fetchfileerror' => 'Fähler: Beim eronger Laade hät jät nit jeflupp.',
+'api-error-file-too-large' => 'De huhjelaade Dattei wohr ze jruß.',
+'api-error-filename-tooshort' => 'Der Name för di Dattei es ze koot.',
+'api-error-filetype-banned' => 'Di Zoot Dattei es nit zohjelohße.',
+'api-error-filetype-missing' => 'Dä Dattei iehre Naame hät kein Endong.',
+'api-error-hookaborted' => 'Ding Änderung wood vun enem Zohsazprojramm nit zohjelohße.',
+'api-error-http' => 'Fähler: Mer krijje kein Verbendung mem ẞööver.',
+'api-error-illegal-filename' => 'Der Name för di Dattei es verbodde.',
+'api-error-internal-error' => 'Fähler: Noh em Huhlaade en et Wiki es em Wiki jät scheif jeloufe.',
+'api-error-invalid-file-key' => 'Fähler: En Dattei wohr nit em Zwescheschpeischer ze fenge.',
+'api-error-missingparam' => 'Fähler: Doh fähle Parrameetere en däm, wat aan dä ẞööver övvermeddelt woode es.',
+'api-error-missingresult' => 'Fähler: Mer kunnte nit eruß krijje, ob et Koppeere joht jejange wohr.',
+'api-error-mustbeloggedin' => 'För Datteije huh_ze_laade moß de ald enjelogg sinn.',
+'api-error-mustbeposted' => 'Fähler: Mer hätt dat mt <code lang="en">HTTP POST</code> schecke mößße.',
+'api-error-noimageinfo' => 'Et Huhlaade hät jeflupp, ävver der ẞööver hät ons övver di Dattei nix verzallt.',
+'api-error-nomodule' => 'Fähler: Mer han kei Modul för et Huhlssde faßjelaat.',
+'api-error-ok-but-empty' => 'Fähler: Mer krijje kein Antwoot vum ẞööver.',
+'api-error-overwrite' => 'En Dattei ze övverschrieve es nit zohjelohße.',
+'api-error-stashfailed' => 'Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.',
+'api-error-timeout' => 'Dä ẞööver hät en dä jewennde Zick nit jeantwoot.',
+'api-error-unclassified' => 'Ene Fähler es opjetrodde, der mer nit kenne.',
+'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
+'api-error-unknown-error' => 'Fähler: Mer han et Huhlaade versöhk, ävver et es jät donävve jejange.',
+'api-error-unknown-warning' => 'En onbikannte Warnong: $1',
+'api-error-unknownerror' => 'Ene onbikannte Fähler: „$1“',
+'api-error-uploaddisabled' => 'Et Huhlaade es en heh däm Wiki nit zohjelohße.',
+'api-error-verification-error' => 'Di Dattei künnt kappott sin, udder en verkehte Endong em Naame han.',
+
);
diff --git a/languages/messages/MessagesKu_latn.php b/languages/messages/MessagesKu_latn.php
index e7970886..0a5f4a82 100644
--- a/languages/messages/MessagesKu_latn.php
+++ b/languages/messages/MessagesKu_latn.php
@@ -58,28 +58,28 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'notoc' => array( '0', '_NAVEROKTUNE_', '__NOTOC__' ),
- 'nogallery' => array( '0', '_GALERÃŽTUNE_', '__NOGALLERY__' ),
- 'toc' => array( '0', '_NAVEROK_', '__TOC__' ),
- 'noheader' => array( '0', '_SERÃŽTUNE_', '__NOHEADER__' ),
- 'currentday' => array( '1', 'ROJA_NIHA', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ROJA_NIHA2', 'CURRENTDAY2' ),
- 'numberofpages' => array( '1', 'HEJMARA_RÛPELAN', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'HEJMARA_GOTARAN', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'HEJMARA_DOSYEYAN', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'HEJMARA_BIKARHÊNERAN', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'HEJMARA_BIKARHÊNERÊN_ÇALAK', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'HEJMARA_GUHERANDINAN', 'NUMBEROFEDITS' ),
- 'subpagename' => array( '1', 'BINRÛPEL', 'SUBPAGENAME' ),
- 'img_right' => array( '1', 'rast', 'right' ),
- 'img_left' => array( '1', 'çep', 'left' ),
- 'img_link' => array( '1', 'lînk=$', 'link=$1' ),
- 'grammar' => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ZAYEND.', 'GENDER:' ),
- 'plural' => array( '0', 'PIRRJIMAR:', 'PLURAL:' ),
- 'currentversion' => array( '1', 'VERSIYONA_NIHA', 'CURRENTVERSION' ),
- 'numberofadmins' => array( '1', 'HEJMARA_ADAMÃŽNISTRATORAN', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'taybet', 'special' ),
+ 'notoc' => array( '0', '_NAVEROKTUNE_', '__NOTOC__' ),
+ 'nogallery' => array( '0', '_GALERÃŽTUNE_', '__NOGALLERY__' ),
+ 'toc' => array( '0', '_NAVEROK_', '__TOC__' ),
+ 'noheader' => array( '0', '_SERÃŽTUNE_', '__NOHEADER__' ),
+ 'currentday' => array( '1', 'ROJA_NIHA', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ROJA_NIHA2', 'CURRENTDAY2' ),
+ 'numberofpages' => array( '1', 'HEJMARA_RÛPELAN', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'HEJMARA_GOTARAN', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'HEJMARA_DOSYEYAN', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'HEJMARA_BIKARHÊNERAN', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'HEJMARA_BIKARHÊNERÊN_ÇALAK', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'HEJMARA_GUHERANDINAN', 'NUMBEROFEDITS' ),
+ 'subpagename' => array( '1', 'BINRÛPEL', 'SUBPAGENAME' ),
+ 'img_right' => array( '1', 'rast', 'right' ),
+ 'img_left' => array( '1', 'çep', 'left' ),
+ 'img_link' => array( '1', 'lînk=$', 'link=$1' ),
+ 'grammar' => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ZAYEND.', 'GENDER:' ),
+ 'plural' => array( '0', 'PIRRJIMAR:', 'PLURAL:' ),
+ 'currentversion' => array( '1', 'VERSIYONA_NIHA', 'CURRENTVERSION' ),
+ 'numberofadmins' => array( '1', 'HEJMARA_ADAMÃŽNISTRATORAN', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'taybet', 'special' ),
);
$messages = array(
@@ -410,14 +410,13 @@ Sedema girtinê ev e: $1',
'badtitle' => 'Sernivîsa nebaş',
'badtitletext' => 'Sernavê rûpelê yê xwestî ne derbasdar, vala an jî ne xwediyê girêdaneke rast e.
Dibe ku di sernavê de karakterên nayên bikaranîn hatibin nivîsandin.',
-'perfcached' => 'Ev dane hatine veşartin û belkî ne rojane bin.',
-'perfcachedts' => 'Ev dane hatiye veşartin û cara paşîn $1 hatiye rojanekirin.',
+'perfcached' => 'Ev dane hatine veşartin û belkî ne rojane bin. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ev dane hatiye veşartin û cara paşîn $1 hatiye rojanekirin. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Fonksiyona rojanekirinê ya vê rûpelê hatiye sekinandin. Daneyên vir nayên rojanekirin.',
'wrong_wfQuery_params' => 'Parametreyên şaş ji bo wfQuery()<br />
Fonksiyon: $1<br />
Pirs: $2',
'viewsource' => 'Çavkaniyê bibîne',
-'viewsourcefor' => 'ji $1 re',
'actionthrottled' => 'Hejmara guherandinên hatine hesibandin',
'actionthrottledtext' => 'Te ev tişt di demeke gelekî kin de kir. Ji kerema xwe çend xulekan bisekine û carekî din biceribîne.',
'protectedpagetext' => 'Ev rûpel ji bo nenivîsandinê hatiye parastin.',
@@ -511,6 +510,9 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
'usernamehasherror' => 'Divê karakterên xerab ji bo navê bikarhêner neyên bikaranîn',
'loginlanguagelabel' => 'Ziman: $1',
+# E-mail sending
+'user-mail-no-addy' => 'Hewl da e-nameyekê bê navnîşana e-nameyê bişîne',
+
# Change password dialog
'resetpass' => 'Şîfreyê biguherîne',
'resetpass_announce' => 'Te xwe bi şîfreyekê qeydkir, yê bi e-nameyekê ji te ra hate şandin. Ji bo xelaskirinê qeydkirinê, tu niha gireke şîfreyeka nuh binivisînê.',
@@ -536,6 +538,14 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
Şîfreya niha:$2',
'passwordreset-emailsent' => 'E-nameyeke bibîrxistinê hate şandin.',
+# Special:ChangeEmail
+'changeemail' => 'E-nameyê biguherîne',
+'changeemail-oldemail' => 'Navnîşana E-nameya niha:',
+'changeemail-newemail' => 'Navnîşana E-nameya nû:',
+'changeemail-none' => '(nîne)',
+'changeemail-submit' => 'E-nameyê biguherîne',
+'changeemail-cancel' => 'Betal bike',
+
# Edit page toolbar
'bold_sample' => 'Nivîsa stûr',
'bold_tip' => 'Nivîsa stûr',
@@ -602,9 +612,6 @@ Zanibe ku tu nikarî e-nameya bişînî heta tu di [[Special:Preferences|tercihÃ
*Sedema astengkirinê: $2
*ID'ya astengkirinê: #$5",
'blockednoreason' => 'sedem nehatiye gotin',
-'blockedoriginalsource' => "Çavkaniya '''$1''' tê weşandin:",
-'blockededitsource' => "Nivîsarên '''guherandinên te''' di '''$1''' da tê wêşandan:",
-'whitelistedittitle' => 'Ji bo guherandinê vê gotarê tu gireke xwe qeydbikê.',
'whitelistedittext' => 'Ji bo guherandina rûpelan, $1 pêwîst e.',
'confirmedittext' => 'Tu gireke adrêsa e-nameya xwe nasbikê berî tu rûpelan diguherînê. Xêra xwe adrêsa e-nameya ya xwe di [[Special:Preferences|tercihên xwe]] da binivisîne û nasbike.',
'nosuchsectiontitle' => 'Beşekî wisa tune ye',
@@ -745,11 +752,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
'revdel-restore-visible' => 'guhertoyên berbiçav',
'pagehist' => 'Dîroka rûpelê',
'deletedhist' => 'Dîroka jêbirî',
-'revdelete-content' => 'naverok',
-'revdelete-summary' => 'kurteyê biguherîne',
-'revdelete-uname' => 'navê bikarhêner',
-'revdelete-hid' => '$1 veÅŸart',
-'revdelete-unhid' => '$1 nîşanbide',
'revdelete-otherreason' => 'Sedemekî din:',
'revdelete-reasonotherlist' => 'Sedemekî din',
'revdelete-edit-reasonlist' => 'Sedemên jêbirinê biguherîne',
@@ -847,10 +849,12 @@ Sedema qedexekirina $3 ev e: ''$2''",
'prefs-personal' => 'Profîla bikarhêner',
'prefs-rc' => 'Guherandinên dawî',
'prefs-watchlist' => 'Lîsteya şopandinê',
-'prefs-watchlist-days-max' => 'Ne zêdetirî 7 rojan',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'Hejmara mezintirîn: 1000',
'prefs-misc' => 'Eyarên cuda',
'prefs-resetpass' => 'Şifreyê biguherîne',
+'prefs-changeemail' => 'E-nameyê biguherîne',
+'prefs-setemail' => 'Navnîşana E-nameyê binivîse',
'prefs-email' => 'Vebijarkên E-nameyê',
'prefs-rendering' => 'Rû',
'saveprefs' => 'Tercîhan qeyd bike',
@@ -922,7 +926,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
'userrights-lookup-user' => 'Birêvebirina koman',
'userrights-user-editname' => 'Navekî bikarhêneriyê binivîse:',
'editusergroup' => 'Komên bikarhêneran biguherîne',
-'editinguser' => "Mafên bikarhêner '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) tên xeyrandin",
+'editinguser' => "Mafên bikarhêner '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) tên guhertin",
'userrights-editusergroup' => 'Grûpên bikarhêneran biguherîne',
'saveusergroups' => 'Komên bikarhêneran tomar bike',
'userrights-groupsmember' => 'Endamê/a:',
@@ -1319,9 +1323,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
'activeusers-noresult' => 'Tu bikarhêner nehate dîtin.',
# Special:Log/newusers
-'newuserlogpage' => 'Çêkirina hesabê nû',
-'newuserlog-byemail' => 'şîfre bi e-nameyê hate şandin',
-'newuserlog-create-entry' => 'Bikarhênerê/a nû',
+'newuserlogpage' => 'Çêkirina hesabê nû',
# Special:ListGroupRights
'listgrouprights' => 'Mafên koma bikarhêner',
@@ -1431,7 +1433,6 @@ Naverroka berî betalkirinê ev bû:'$1'",
'actioncomplete' => 'Çalakî pêk hat',
'actionfailed' => 'Çalakî têkçû',
'deletedtext' => '"$1" hat jêbirin. Ji bo qeyda rûpelên ku di dema nêzîk de hatin jêbirin binêre $2.',
-'deletedarticle' => '"[[$1]]" hat jêbirin',
'dellogpage' => 'Jêbirina rûpelê',
'dellogpagetext' => 'Li jêr lîsteyek ji jêbirinên dawî heye.',
'deletionlog' => 'jêbirina rûpelê',
@@ -1475,6 +1476,7 @@ Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
'protect-level-autoconfirmed' => 'Bikarhênerên neqeydkirî astengbike',
'protect-level-sysop' => 'Tenê rêveber (admîn)',
'protect-expiring' => 'heta rojê $1 (UTC)',
+'protect-expiring-local' => 'di $1 de dema wê xilas dibe',
'protect-othertime' => 'Demeke din:',
'protect-othertime-op' => 'dema din',
'protect-otherreason' => 'Sedemekî din:',
@@ -1511,7 +1513,6 @@ Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
'undeletereset' => 'Nû bike',
'undeleteinvert' => 'Hilbijartinê şûnde vegerîne',
'undeletecomment' => 'Sedem:',
-'undeletedarticle' => '"[[$1]]" dîsa çêkir',
'undeletedrevisions' => '{{PLURAL:$1|Verzyonek dîsa hate|$1 verzyon dîsa hatin}} çêkirin',
'undeletedrevisions-files' => '{{PLURAL:$1|Verzyonek|$1 verzyon}} û {{PLURAL:$2|medyayek hate|$2 medya hatin}} çêkirin',
'undeletedfiles' => '{{PLURAL:$1|Medyayek hate|$1 medya hatin}} çêkirin',
@@ -1623,6 +1624,7 @@ Sedemekê binivîse!',
'ipblocklist-legend' => 'Bikarhênerekî astengkirî bibîne',
'blocklist-userblocks' => 'Astengkirina hesaban veşêre',
'blocklist-tempblocks' => 'Astengkirinên demkî veşêre',
+'blocklist-rangeblocks' => 'Astengkirinên cur bi cur veşêre',
'blocklist-by' => 'Astengkirina rêveber',
'blocklist-params' => 'Parametreyan asteng bike',
'blocklist-reason' => 'Sedem',
@@ -1642,6 +1644,7 @@ Sedemekê binivîse!',
'unblocklink' => 'astengkirinê rake',
'change-blocklink' => 'Astengkirinê biguherîne',
'contribslink' => 'beşdarî',
+'emaillink' => 'e-name bişîne',
'autoblocker' => 'Otomatîk hat bestin jiberku IP-ya we û ya "[[User:$1|$1]]" yek in. Sedem: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'Astengkirina bikarhêner',
'blocklogentry' => '"[[$1]]" ji bo dema $2 $3 hatîye asteng kirin',
@@ -1704,8 +1707,6 @@ da bikarî navê wê rûpelê biguherînî.',
'movepage-page-exists' => 'Rûpela $1 berê heye û ew nikane otomatîk were jêbirin.',
'movepage-page-moved' => 'Rûpela $1 çû cihê $2.',
'movepage-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
-'1movedto2' => '[[$1]] çû cihê [[$2]]',
-'1movedto2_redir' => '[[$1]] çû cihê [[$2]] ser redirect',
'movelogpage' => 'Nav guherandin',
'movelogpagetext' => 'Li jêr lîsteyek ji rûpelan ku navê wan hatiye guherandin heye.',
'movereason' => 'Sedem',
@@ -1845,9 +1846,6 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
# Patrol log
'patrol-log-page' => 'Têketina kontrolkirinê',
-'patrol-log-line' => '$1 ji $2 hate kontrolkirin $3',
-'patrol-log-auto' => '(otomatîk)',
-'patrol-log-diff' => 'revîzyona $1',
# Image deletion
'deletedrevision' => 'Guhertoya berê $1 hate jêbirin.',
@@ -1864,7 +1862,7 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
'widthheightpage' => '$1 × $2, $3 rûpel',
'file-info' => 'mezinbûnê data: $1, MIME-typ: $2',
'file-info-size' => '$1 × $2 pixel, mezinbûnê data: $3, MIME-typ: $4',
-'file-nohires' => '<small>Versyonekî jê mezintir tune.</small>',
+'file-nohires' => 'Versyonekî jê mezintir tune.',
'svg-long-desc' => "Data'ya SVG, mezinbûna rast: $1 × $2 pixel; mezinbûna data'yê: $3",
'show-big-image' => 'Mezînbûn',
@@ -1989,9 +1987,6 @@ Lê eger ev *ne* tu bû, li lînkê netikîne. Ev e-nameya di rojê $4 da netê
'scarytranscludefailed' => '[Anîna şablona $1 biserneket; biborîne]',
'scarytranscludetoolong' => '[URL zêde dirêj e; bibore]',
-# Trackbacks
-'trackbackremove' => '([$1 jêbibe])',
-
# Delete conflict
'deletedwhileediting' => 'Hîşyar: Piştî te guherandinê xwe dest pê kir ev rûpela hate jêbirin!',
'confirmrecreate' => "Bikarhêner [[User:$1|$1]] ([[User talk:$1|nîqaş]]) vê rûpelê jêbir, piştî te destpêkir bi guherandinê. Sedemê jêbirinê ev bû:
@@ -2099,4 +2094,15 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
'htmlform-reset' => 'Guherandinan vegerîne',
'htmlform-selectorother-other' => 'Yên din',
+# New logging system
+'revdelete-uname-hid' => 'navê bikarhêneriyê yê veşartî',
+'logentry-newusers-newusers' => '$1 hesabekî bikarhêneriyê çêkir',
+'logentry-newusers-create' => '$1 hesabekî bikarhêneriyê çêkir',
+'newuserlog-byemail' => 'şîfre bi e-nameyê hate şandin',
+
+# Feedback
+'feedback-subject' => 'Mijar:',
+'feedback-message' => 'Peyam:',
+'feedback-cancel' => 'Betal bike',
+
);
diff --git a/languages/messages/MessagesKw.php b/languages/messages/MessagesKw.php
index 2d575232..b4aba570 100644
--- a/languages/messages/MessagesKw.php
+++ b/languages/messages/MessagesKw.php
@@ -327,7 +327,6 @@ $messages = array(
'filenotfound' => 'Nag aljem cavos an restren "$1".',
'badtitle' => 'Titel drog',
'viewsource' => 'Gweles an bednfenten',
-'viewsourcefor' => 'rag $1',
# Login and logout pages
'welcomecreation' => '== Dynnargh, $1! ==
@@ -471,10 +470,9 @@ Alwhedh: '''({{int:cur}})''' = dyffrans gen an amendyans diwettha, '''({{int:las
'history-feed-item-nocomment' => '$1 dhe $2',
# Revision deletion
-'rev-delundel' => 'disqwedhes/cudha',
-'revdel-restore' => 'chanjya an hewelder',
-'pagehist' => 'Istory an folen',
-'revdelete-uname' => 'hanow-usyer',
+'rev-delundel' => 'disqwedhes/cudha',
+'revdel-restore' => 'chanjya an hewelder',
+'pagehist' => 'Istory an folen',
# History merging
'mergehistory-reason' => 'Acheson:',
@@ -780,8 +778,7 @@ En '''tew''' ew folednow eus war agas [[Special:Watchlist|rol golyas]].",
'listusers-submit' => 'Disqwedhes',
# Special:Log/newusers
-'newuserlogpage' => 'Covnoten gwryans devnydhyoryon',
-'newuserlog-create-entry' => 'Devnydhyer noweth',
+'newuserlogpage' => 'Covnoten gwryans devnydhyoryon',
# Special:ListGroupRights
'listgrouprights-members' => '(rol an esely)',
@@ -815,7 +812,6 @@ En '''tew''' ew folednow eus war agas [[Special:Watchlist|rol golyas]].",
'actioncomplete' => 'An gwryans ew cowlwres',
'deletedtext' => '"$1" yw dileys.
Gwelowgh $2 rag covadh a dhileanjow a-dhiwedhes.',
-'deletedarticle' => 'a dhileas "[[$1]]"',
'dellogpage' => 'Covnoten dilea',
'deletecomment' => 'Acheson:',
'deleteotherreason' => 'Acheson aral/keworansel:',
@@ -846,7 +842,6 @@ Gwelowgh $2 rag covadh a dhileanjow a-dhiwedhes.',
# Undelete
'undeletelink' => 'gweles/daswul',
'undeleteviewlink' => 'gweles',
-'undeletedarticle' => 'a wrug restorya "[[$1]]"',
'undelete-search-submit' => 'Whila',
'undelete-show-file-submit' => 'Ea',
@@ -917,8 +912,6 @@ Gwelowgh $2 rag covadh a dhileanjow a-dhiwedhes.',
'pagemovedsub' => 'An gwarnyans a sowenas',
'movepage-moved' => '\'\'\'Gwayes ew "$1" war-tu "$2"\'\'\'',
'movedto' => 'gwayes war-tu',
-'1movedto2' => '[[$1]] gwayes war-tu [[$2]]',
-'1movedto2_redir' => 'a wayas [[$1]] war-tu [[$2]] dres daswedyans',
'movelogpage' => 'Covnoten gwaya',
'movereason' => 'Acheson:',
'revertmove' => 'trebuchya',
@@ -1009,7 +1002,7 @@ Whi a ell gweles hy fednfenten.',
# Media information
'file-info-size' => '$1 × $2 pixel, mens an restren: $3, sort MIME : $4',
-'file-nohires' => '<small>Nag eus clerder uhella cavadow.</small>',
+'file-nohires' => 'Nag eus clerder uhella cavadow.',
'svg-long-desc' => 'Restren SVG, $1 × $2 pixel en hanow, mens an restren: $3',
'show-big-image' => 'Clerder leun',
@@ -1040,9 +1033,6 @@ Whi a ell gweles hy fednfenten.',
'namespacesall' => 'oll',
'monthsall' => 'oll',
-# Trackbacks
-'trackbackremove' => '([$1 Dilea])',
-
# Multipage image navigation
'imgmultipageprev' => '↠folen kens',
'imgmultipagenext' => 'folen nessa →',
diff --git a/languages/messages/MessagesKy.php b/languages/messages/MessagesKy.php
index e893dfe8..fca23081 100644
--- a/languages/messages/MessagesKy.php
+++ b/languages/messages/MessagesKy.php
@@ -201,7 +201,6 @@ $messages = array(
'badtitletext' => 'Талап кылынган барак аталышы туура ÑмеÑ, бош, же тилдер-аралык же уики-аралык аталышы туура ÑÐ¼ÐµÑ ÑˆÐ¸Ð»Ñ‚ÐµÐ¼ÐµÐ»ÐµÐ½Ð³ÐµÐ½.
Балким аталышта колдонулбай турган бир же андан көп белги камтылган.',
'viewsource' => 'Байкоо',
-'viewsourcefor' => '$1 үчүн',
# Login and logout pages
'welcomecreation' => '== Кош келиңиз, $1! ==
@@ -264,7 +263,6 @@ $messages = array(
'showdiff' => 'Өзгөртүүлөрдү көрÑÓ©Ñ‚',
'anoneditwarning' => "'''ЭÑкертүү:''' Сиз каттоодон өткөн жокÑуз.
IP дарегиңиз бул барактын оңдоо тарыхына жазылат.",
-'whitelistedittitle' => 'Оңдоо үчүн катоодон өтүү зарыл',
'accmailtitle' => 'СырÑөз жөнөтүлдү.',
'accmailtext' => '"$1" үчүн ÑÑ‹Ñ€Ñөз $2 ге жөнөтүлдү.',
'newarticle' => '(Жаңы)',
@@ -504,6 +502,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'prefixindex' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¼ÐµÐ½ÐµÐ½ бардык барактар',
'shortpages' => 'КыÑка макалалар',
'listusers' => 'Колдонуучулар тизмеÑи',
+'usercreated' => "$1 күнү $2'да {{GENDER:$3|катталды}}.",
'newpages' => 'Жаңы барактар',
'ancientpages' => 'Эң ÑÑки барактар',
'move' => 'Ðталышын өзгөртүү',
@@ -568,7 +567,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'confirm' => 'ЫраÑтоо',
'actioncomplete' => 'Иш-аракет жыйынтыкталды',
'actionfailed' => 'Ðракет натыйжаÑыз болду',
-'deletedarticle' => 'өчүрүлдү "[[$1]]"',
'dellogpage' => 'Өчүрүлгөндөрдүн тизмеÑи',
'deletecomment' => 'Себеп',
@@ -730,6 +728,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
# Media information
'file-info-size' => '$1 × $2 пикÑел, файлдын көлөмү: $3, MIME тиби: $4',
+'file-nohires' => 'Мындан дагы толук чечилиши жок.',
'svg-long-desc' => 'SVG файл, шарттуу түрдө $1 × $2 пикÑел, файлдын көлөмү: $3',
'show-big-image' => 'Толук чечилиши',
diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php
index 4c3d093e..d40a0c7f 100644
--- a/languages/messages/MessagesLa.php
+++ b/languages/messages/MessagesLa.php
@@ -471,7 +471,6 @@ Fortasse usor alius iam deleverat.',
Functio: $1<br />
Inquisitio: $2',
'viewsource' => 'Fontem inspicere',
-'viewsourcefor' => 'pro $1',
'actionthrottled' => 'Actio strangulata',
'protectedpagetext' => 'Haec pagina protecta est, ut emendationes prohibeantur.',
'viewsourcetext' => 'Fontem videas et exscribeas:',
@@ -575,6 +574,11 @@ Hunc nuntium ignorare potes, si nolis hac ratione uti.',
'passwordreset-emailelement' => 'Nomen usoris: $1
Momentarius Tessera: $2',
+# Special:ChangeEmail
+'changeemail-none' => '(nulla)',
+'changeemail-submit' => 'Inscriptionem electronicam mutare',
+'changeemail-cancel' => 'Abrogare',
+
# Edit page toolbar
'bold_sample' => 'Litterae pingues',
'bold_tip' => 'Litterae pingues',
@@ -637,9 +641,6 @@ Nota bene te non posse proprietate "Litteras electronicas usori mittere" uti, ni
Locus IP tuus temporarius $3 est et numerus obstructionis tuus est #$5. Quaesumus te eos scripturum si quaestiones ullas roges.',
'blockednoreason' => 'nulla causa data',
-'blockedoriginalsource' => "Fons '''$1''' subter monstratur:",
-'blockededitsource' => "Textus '''tuarum emendationum''' in '''$1''' subter monstratur:",
-'whitelistedittitle' => 'Conventum aperiendum ut recenseas',
'whitelistedittext' => 'Necesse est tibi $1 priusquam paginas recenseas.',
'confirmedittext' => 'Tua inscriptio electronica est adfirmanda priusquam paginas recenseas. Quaesumus eam selige et adfirma per tuas [[Special:Preferences|praeferentias]].',
'nosuchsectiontitle' => 'Haec pars inveniri non potest',
@@ -775,17 +776,9 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
'revdelete-radio-set' => 'Ita vero',
'revdelete-radio-unset' => 'Minime',
'revdelete-log' => 'Causa:',
-'revdelete-logentry' => 'mutavit visibilitatem emendationis paginae [[$1]]',
'revdel-restore' => 'visibilitatem mutare',
'pagehist' => 'Historia paginae',
'deletedhist' => 'Historia deleta',
-'revdelete-content' => 'contenta',
-'revdelete-summary' => 'summarium recensionis',
-'revdelete-uname' => 'nomen usoris',
-'revdelete-hid' => 'celavit $1',
-'revdelete-unhid' => 'monstravit $1',
-'revdelete-log-message' => '$1 {{PLURAL:$2|unius emendationis|$2 emendationum}}',
-'logdelete-log-message' => '$1 {{PLURAL:$2|unius eventi|$2 eventorum}}',
'revdelete-edit-reasonlist' => 'Causas deletionum recensere',
# Suppression log
@@ -896,7 +889,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
'prefs-rc' => 'Nuper mutata',
'prefs-watchlist' => 'Paginae custoditae',
'prefs-watchlist-days' => 'Numerus dierum displicandus in paginis tuis custoditis:',
-'prefs-watchlist-days-max' => 'Maximum 7 dies',
+'prefs-watchlist-days-max' => 'Numerus maximus: $1 {{PLURAL:$1|dies|dies}}',
'prefs-watchlist-edits' => 'Numerus recensionum displicandus in paginis tuis custoditis extensis:',
'prefs-watchlist-edits-max' => 'Numerus maximus: 1000',
'prefs-misc' => 'Misc',
@@ -971,7 +964,7 @@ Si vis id dare, opera tua tibi ascribentur.',
'userrights-lookup-user' => 'Greges usorum regere',
'userrights-user-editname' => 'Nomen usoris inscribe:',
'editusergroup' => 'Greges usorum recensere',
-'editinguser' => "Modificare potestates usoris '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modificare potestates usoris '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Greges usorum recensere',
'saveusergroups' => 'Greges usorum servare',
'userrights-groupsmember' => 'In grege aut in gregibus:',
@@ -1037,7 +1030,6 @@ Si vis id dare, opera tua tibi ascribentur.',
'right-import' => 'Paginas ex vicis aliis importare',
'right-importupload' => 'Paginas ex fasciculo imponendo importare',
'right-unwatchedpages' => 'Indicem paginarum non custoditarum inspicere',
-'right-trackback' => 'Praebere retronexum',
'right-mergehistory' => 'Historias paginarum confundere',
'right-userrights' => 'Omnes potestates usorum recensere',
'right-userrights-interwiki' => 'Potestates usorum aliis in vicis recensere',
@@ -1073,7 +1065,6 @@ Si vis id dare, opera tua tibi ascribentur.',
'action-import' => 'paginam ex vico alio importare',
'action-importupload' => 'paginam ex fasciculo imponendo importare',
'action-unwatchedpages' => 'indicem paginarum non custoditarum inspicere',
-'action-trackback' => 'praebere retronexum',
'action-mergehistory' => 'historiam huius paginae confundere',
'action-userrights' => 'omnes potestates usorum recensere',
'action-userrights-interwiki' => 'potestates usorum aliis in vicis recensere',
@@ -1422,12 +1413,8 @@ Vide etiam [[Special:WantedCategories|categorias desideratas]].',
'activeusers-noresult' => 'Nullus usor inventus.',
# Special:Log/newusers
-'newuserlogpage' => 'Index rationum novarum creatarum',
-'newuserlogpagetext' => 'Hic est index rationum novarum creatarum.',
-'newuserlog-byemail' => 'tessera missa litteris electronicis',
-'newuserlog-create-entry' => 'Usor novus',
-'newuserlog-create2-entry' => 'creavit novam rationem $1',
-'newuserlog-autocreate-entry' => 'Ratio automatice creata',
+'newuserlogpage' => 'Index rationum novarum creatarum',
+'newuserlogpagetext' => 'Hic est index rationum novarum creatarum.',
# Special:ListGroupRights
'listgrouprights' => 'Gregum usorum potestates',
@@ -1449,7 +1436,7 @@ Vide etiam [[Special:WantedCategories|categorias desideratas]].',
'emailpage' => 'Mittere litteras electronicas huic usori',
'emailpagetext' => 'Forma subter nuntium ad usorem mittet.
Inscriptio electronica quam in [[Special:Preferences|praeferentiis tuis]] dedis ut "Ab" inscriptione apparebit. Hoc modo usor tibi directe respondere poterit.',
-'defemailsubject' => '{{SITENAME}} - Litterae electronicae',
+'defemailsubject' => '{{SITENAME}} - Litterae electronicae ab usore "$1"',
'noemailtitle' => 'Nulla inscriptio electronica',
'noemailtext' => 'Hic usor inscriptionem electronicam ratam non dedit.',
'nowikiemailtitle' => 'Litterae electronicae non permissae',
@@ -1491,7 +1478,7 @@ Si paginam ex indice paginarum custoditarum removere vis, imprime \"decustodire\
'watchmethod-list' => 'paginas custoditas quaerens pro recensitis recentibus',
'watchlistcontains' => 'Index paginarum custoditarum tuus $1 {{PLURAL:$1|paginam|paginas}} habet.',
'iteminvalidname' => "Aerumna cum pagina '$1', nomen non est rectum...",
-'wlnote' => "Subter {{PLURAL:$1|est mutatio proxima|sunt '''$1''' mutationes proximae}} in {{PLURAL:$2|proxima hora|proximis '''$2''' horis}}.",
+'wlnote' => "Subter {{PLURAL:$1|est mutatio proxima|sunt '''$1''' mutationes proximae}} in {{PLURAL:$2|proxima hora|proximis '''$2''' horis}} ex $4, $3.",
'wlshowlast' => 'Monstrare proximas $1 horas $2 dies $3',
'watchlist-options' => 'Indicis paginarum custoditarum praeferentiae',
@@ -1547,8 +1534,6 @@ Adfirma quaesumus te paginam re vera delere velle, te consequentias intellere, e
'actioncomplete' => 'Actum perfectum',
'actionfailed' => 'Actum non feliciter evenit',
'deletedtext' => '"$1" deletum est. Vide $2 pro indice deletionum recentum.',
-'deletedarticle' => 'delevit "[[$1]]"',
-'suppressedarticle' => 'supprimit "[[$1]]"',
'dellogpage' => 'Index deletionum',
'dellogpagetext' => 'Subter est index deletionum recentissimarum.',
'deletionlog' => 'index deletionum',
@@ -1644,7 +1629,6 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
'undeletereset' => 'Reperscriptare',
'undeleteinvert' => 'Selectionem invertere',
'undeletecomment' => 'Causa:',
-'undeletedarticle' => 'restituit "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 emendatio recuperata|$1 emendationes recuperatae}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 emendatio recuperata|$1 emendationes recuperatae}} et {{PLURAL:1 fasciculus recuperatus|$2 fasciculi recuperati}}',
'undeletedfiles' => '{{PLURAL:$1|1 fasciculus recuperatus|$1 fasciculi recuperati}}',
@@ -1843,9 +1827,6 @@ Quaesumus, titulum alterum elige.',
'move-talk-subpages' => 'Movere subpaginas paginae disputationis (tenus $1)',
'movepage-page-moved' => 'Pagina $1 mota est ad $2.',
'movepage-page-unmoved' => 'Pagina $1 ad $2 moveri non potuit.',
-'1movedto2' => 'movit [[$1]] ad [[$2]]',
-'1movedto2_redir' => 'movit [[$1]] ad [[$2]] praeter redirectionem',
-'move-redirect-suppressed' => 'sine redirectione',
'movelogpage' => 'Acta motionum',
'movesubpage' => '{{PLURAL:$1|Subpagina|Subpaginae}}',
'movesubpagetext' => 'Huic paginae {{PLURAL:$1|est una subpagina subter monstrata|sunt $1 subpaginae subter monstratae}}.',
@@ -1856,7 +1837,7 @@ Quaesumus, titulum alterum elige.',
'delete_and_move_text' => '==Deletio necesse est==
Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic moveatur?',
'delete_and_move_confirm' => 'Ita, paginam delere',
-'delete_and_move_reason' => 'Deleta ut moveatur',
+'delete_and_move_reason' => 'Deleta ut moveatur ex "[[$1]]"',
'immobile-source-namespace' => 'Paginae spatii nominalis "$1" moveri non possunt.',
'immobile-target-namespace' => 'Paginae in spatium nominale "$1" moveri non possunt.',
'immobile-source-page' => 'Haec pagina moveri non potest.',
@@ -1994,8 +1975,6 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
# Patrol log
'patrol-log-page' => 'Acta emendationum circumitarum',
-'patrol-log-auto' => '(automatica)',
-'patrol-log-diff' => 'emendatio $1',
'log-show-hide-patrol' => '$1 acta emendationum circumitarum',
# Image deletion
@@ -2012,7 +1991,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|paginae}}',
'file-info' => 'magnitudo fasciculi: $1, typus MIME: $2',
'file-info-size' => '$1 × $2 elementa imaginalia, magnitudo fasciculi: $3, typus MIME: $4',
-'file-nohires' => '<small>Nulla maior resolutio exstat.</small>',
+'file-nohires' => 'Nulla maior resolutio exstat.',
'svg-long-desc' => 'fasciculus SVG, nominale $1 × $2 elementa imaginalia, magnitudo fasciculi: $3',
'show-big-image' => 'Resolutio completa',
'file-info-gif-frames' => '$1 {{PLURAL:$1|replum|repla}}',
@@ -2262,10 +2241,6 @@ Hic codex adfirmationis exibit $4.',
'confirmemail_invalidated' => 'Adfirmatio inscriptionis electronicae abrogata est',
'invalidateemail' => 'Adfimationem inscriptionis electronicae abrogare',
-# Trackbacks
-'trackbackremove' => '([$1 Delere])',
-'trackbacklink' => 'Retronexus',
-
# Delete conflict
'deletedwhileediting' => "'''Monitio:''' Haec pagina deleta est postquam inceperis eam recensere!",
'confirmrecreate' => "Usor [[User:$1|$1]] ([[User talk:$1|disputatio]]) delevit hanc paginam postquam eam emendare inceperis cum ratione:
@@ -2322,6 +2297,9 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
'watchlisttools-edit' => 'Indicem paginarum custoditarum inspicere vel recensere',
'watchlisttools-raw' => 'Indicem paginarum custoditarum quasi textum recensere',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|disputatio]])',
+
# Special:Version
'version' => 'Versio',
'version-specialpages' => 'Paginae speciales',
@@ -2381,4 +2359,7 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
'htmlform-reset' => 'Mutationes abrogare',
'htmlform-selectorother-other' => 'Aliud',
+# New logging system
+'newuserlog-byemail' => 'tessera missa litteris electronicis',
+
);
diff --git a/languages/messages/MessagesLad.php b/languages/messages/MessagesLad.php
index f1976413..e2f73240 100644
--- a/languages/messages/MessagesLad.php
+++ b/languages/messages/MessagesLad.php
@@ -133,8 +133,8 @@ $specialPageAliases = array(
'Protectedtitles' => array( 'TítůlosGuardados' ),
'Randompage' => array( 'KualunkeHoja' ),
'Randomredirect' => array( 'KualunkeDireksyón' ),
- 'Recentchanges' => array( 'TrokamientosFreskos' ),
- 'Recentchangeslinked' => array( 'TrokamientosÈnterassados' ),
+ 'Recentchanges' => array( 'TrocamientosFreskos' ),
+ 'Recentchangeslinked' => array( 'TrocamientosÈnterassados' ),
'Revisiondelete' => array( 'EfassarRēvizyón' ),
'RevisionMove' => array( 'TaxireaRēvizyón' ),
'Search' => array( 'Buscar' ),
@@ -169,12 +169,12 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#DIRIJAR', '#DIRECCIÓN', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
- 'fullpagename' => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'NOMBREDEHOJICA', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
- 'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'img_left' => array( '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ),
- 'img_none' => array( '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+ 'redirect' => array( '0', '#DIRIJAR', '#DIRECCIÓN', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+ 'fullpagename' => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'NOMBREDEHOJICA', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
+ 'msg' => array( '0', 'MSJ:', 'MSG:' ),
+ 'img_left' => array( '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ),
+ 'img_none' => array( '1', 'dinguna', 'dinguno', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
);
$messages = array(
@@ -476,7 +476,6 @@ Si puede ser mete un [[Special:ListUsers/sysop|administrador]] en corriente y ta
'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
'viewsource' => 'Ver su manadero',
-'viewsourcefor' => 'para $1',
# Login and logout pages
'yourname' => 'Su nombre de usuario',
@@ -512,6 +511,10 @@ Si puede ser, escoge un otro nombre.',
'passwordreset-domain' => 'Dominio:',
'passwordreset-email' => 'Adresso de letral:',
+# Special:ChangeEmail
+'changeemail-submit' => 'Trocar letral',
+'changeemail-cancel' => 'Anular',
+
# Edit page toolbar
'bold_sample' => 'Teksto gordo',
'bold_tip' => 'Teksto gordo',
@@ -622,7 +625,6 @@ Leyenda: (act) = diferencias con la versión actual,
'revdel-restore-deleted' => 'enderechamientos efaçados',
'revdel-restore-visible' => 'enderechamientos viźivles',
'pagehist' => 'La storia de la hoja',
-'revdelete-content' => 'contenido',
'revdelete-reasonotherlist' => 'Otra razón',
# History merging
@@ -697,7 +699,7 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
'prefs-rc' => 'Los Trocamientos de Alcabo',
'prefs-watchlist' => 'Lista de los Trocamientos Preferidos',
'prefs-watchlist-days' => 'El número de los días a mostrar en la lista de los trocamientos preferidos:',
-'prefs-watchlist-days-max' => '7 días a lo más muncho',
+'prefs-watchlist-days-max' => '$1 {{PLURAL:$1|días|días}} a lo más muncho',
'prefs-resetpass' => 'Trocar la parola',
'prefs-rendering' => 'Vista',
'saveprefs' => 'Enrejistrar',
@@ -847,9 +849,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
'linksearch' => 'Linkes eksternos',
# Special:Log/newusers
-'newuserlogpage' => 'Registro de creación de usuarios',
-'newuserlog-byemail' => 'kóddiche mandado con letral',
-'newuserlog-create-entry' => 'Usuario nuevo',
+'newuserlogpage' => 'Registro de creación de usuarios',
# Special:ListGroupRights
'listgrouprights-members' => '(ver los miembros de este grupo)',
@@ -884,7 +884,6 @@ resultados, i que lo estás haziendo de acorddo con las [[{{MediaWiki:Policy-url
'actioncomplete' => 'Aksion kompleta',
'deletedtext' => '"$1" fue efassado.
Mira $2 para un registro de los efassados nuevos.',
-'deletedarticle' => 'efassó «[[$1]]»',
'dellogpage' => 'Registro de efassados',
'deletecomment' => 'Razón:',
'deleteotherreason' => 'Otra razón:',
@@ -924,7 +923,6 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
# Undelete
'undeletelink' => 've/trae atrás',
'undeleteviewlink' => 've',
-'undeletedarticle' => 'restoró «[[$1]]»',
# Namespace form on various pages
'namespace' => 'Espacio de nombres:',
@@ -1006,8 +1004,6 @@ Si puede ser, escoge otro nombre.',
'talkexists' => 'La hoja fue renombrada con reuxito, ma la diskussión no se pudo renombrar porque ya egziste una en el título nuevo. Si puede ser, házelo manualmente.',
'movedto' => 'renombrado a',
'movetalk' => 'Renombrar la hoja de diskussión también, si es possible.',
-'1movedto2' => 'El muevo nombre de la hoja [[$1]]; ya es [[$2]]',
-'1movedto2_redir' => '[[$1]] fue taxireado a [[$2]] sovre una direksión',
'movelogpage' => 'Registro de traslados',
'movereason' => 'Razón:',
'revertmove' => 'àbolta',
@@ -1090,7 +1086,7 @@ Puedes ver su manadero',
# Media information
'file-info-size' => '$1 × $2 píkseles; boy del arxivo: $3; tipo MIME: $4',
-'file-nohires' => '<small>No disponible a mayor resolución.</small>',
+'file-nohires' => 'No disponible a mayor resolución.',
'svg-long-desc' => 'arxivo SVG, nominalmente $1 × $2 píkseles, boy del arxivo: $3',
'show-big-image' => 'Resolución original',
@@ -1160,9 +1156,6 @@ Los otros campos se van a guardar por defecto.
'confirmemail_sent' => 'Konfirmasion de pósta embiada.',
'confirmemail_success' => 'Su direksion de pósta a sido konfirmada. Agóra puedes registrarse e kolaborar en el wiki.',
-# Trackbacks
-'trackbackremove' => '([$1 Efasár])',
-
# Delete conflict
'recreate' => 'Krear de muevo',
@@ -1229,4 +1222,13 @@ Los otros campos se van a guardar por defecto.
# HTML forms
'htmlform-selectorother-other' => 'Otro',
+# New logging system
+'logentry-newusers-autocreate' => 'El cuento $1 fue crîado otomatika mente',
+'newuserlog-byemail' => 'kóddiche mandado con letral',
+
+# Feedback
+'feedback-subject' => 'Sujeto',
+'feedback-message' => 'Messaje',
+'feedback-cancel' => 'Anular',
+
);
diff --git a/languages/messages/MessagesLb.php b/languages/messages/MessagesLb.php
index 365d19ae..99b2fa15 100644
--- a/languages/messages/MessagesLb.php
+++ b/languages/messages/MessagesLb.php
@@ -144,27 +144,27 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#VIRULEEDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
- 'numberofarticles' => array( '1', 'Artikelen', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'Fichieren', 'DATEIANZAHL', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'Benotzerzuel', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'Aktiv_Benotzer', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
- 'pagename' => array( '1', 'Säitennumm', 'SEITENNAME', 'PAGENAME' ),
- 'namespace' => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
- 'subjectspace' => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectpagename' => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'img_right' => array( '1', 'riets', 'rechts', 'right' ),
- 'img_left' => array( '1', 'lénks', 'links', 'left' ),
- 'img_none' => array( '1', 'ouni', 'ohne', 'none' ),
- 'img_center' => array( '1', 'zentréiert', 'zentriert', 'center', 'centre' ),
- 'img_framed' => array( '1', 'gerummt', 'gerahmt', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'net_gerummt', 'rahmenlos', 'frameless' ),
- 'img_border' => array( '1', 'bord', 'rand', 'border' ),
- 'grammar' => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
- 'plural' => array( '0', 'PLURAL', 'PLURAL:' ),
- 'formatnum' => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
- 'special' => array( '0', 'spezial', 'special' ),
- 'hiddencat' => array( '1', '__VERSTOPPTE_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+ 'redirect' => array( '0', '#VIRULEEDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
+ 'numberofarticles' => array( '1', 'Artikelen', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Fichieren', 'DATEIANZAHL', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'Benotzerzuel', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'Aktiv_Benotzer', 'AKTIVE_BENUTZER', 'NUMBEROFACTIVEUSERS' ),
+ 'pagename' => array( '1', 'Säitennumm', 'SEITENNAME', 'PAGENAME' ),
+ 'namespace' => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
+ 'subjectspace' => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectpagename' => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'img_right' => array( '1', 'riets', 'rechts', 'right' ),
+ 'img_left' => array( '1', 'lénks', 'links', 'left' ),
+ 'img_none' => array( '1', 'ouni', 'ohne', 'none' ),
+ 'img_center' => array( '1', 'zentréiert', 'zentriert', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'gerummt', 'gerahmt', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'net_gerummt', 'rahmenlos', 'frameless' ),
+ 'img_border' => array( '1', 'bord', 'rand', 'border' ),
+ 'grammar' => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
+ 'plural' => array( '0', 'PLURAL', 'PLURAL:' ),
+ 'formatnum' => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
+ 'special' => array( '0', 'spezial', 'special' ),
+ 'hiddencat' => array( '1', '__VERSTOPPTE_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
);
$messages = array(
@@ -526,20 +526,22 @@ Mellt dëst w.e.g. bei engem [[Special:ListUsers/sysop|Administrateur]] a vergie
'badarticleerror' => 'Dës Aktioun kann net op dëser Säit duerchgefouert ginn.',
'cannotdelete' => 'D\'Bild oder d\'Säit "$1" konnt net geläscht ginn.
Et ka sinn datt et scho vun engem Anere geläscht gouf.',
+'cannotdelete-title' => 'D\'Säit "$1" kann net geläscht 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 Cache a si méiglecherweis net aktuell:',
-'perfcachedts' => 'Dës Donnéeë kommen aus dem Cache, lescht Aktualisatioun: $1',
+'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.',
+'perfcachedts' => "Dës Donnéeë kommen aus dem Tësche späicher, a goufe fir d'lescht den $1 aktualiséiert. Maximal {{PLURAL:$4|ee Resultat ass|$4 Resultater sinn}} am Tësche späicher disponibel.",
'querypage-no-updates' => "D'Aktualiséierung vun dëser Säit ass zur Zäit ausgeschalt. D'Date gi bis op weideres net aktualiséiert.'''",
'wrong_wfQuery_params' => 'Falsche Parameter fir wfQuery()<br />
Funktioun: $1<br />
Ufro: $2',
'viewsource' => 'Quelltext kucken',
-'viewsourcefor' => 'fir $1',
+'viewsource-title' => 'Quelltext vun der Säit $1 weisen',
'actionthrottled' => 'Dës Aktioun gouf gebremst',
'actionthrottledtext' => 'Fir géint de Spam virzegoen, ass dës Aktioun esou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.',
'protectedpagetext' => 'Dës Säit ass fir Ännerunge gespaart.',
'viewsourcetext' => 'Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren:',
+'viewyourtext' => "Dir kënnt de Quelltext vun '''Ären Ännerungen''' op dëser Säit kucken a kopéieren:",
'protectedinterface' => 'Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software an dofir ass si gespaart fir Mëssbrauch ze verhënneren.',
'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 gesi ginn. Fir d'Iwwersetzungen z'änneren invitéiere mir Iech de [//translatewiki.net/wiki/Main_Page?setlang=lb Projet translatewiki.net] vun den internationale Messagen ze benotzen.",
'sqlhidden' => '(SQL-Offro verstoppt)',
@@ -638,6 +640,7 @@ Dowéinst ass et bis ewell net méiglech, fir déi folgend Funktiounen E-Mailen
'emailconfirmlink' => 'Confirméiert är E-Mailadress w.e.g..',
'invalidemailaddress' => 'Dës E-Mailadress gëtt net akzeptéiert well se en ongëltegt Format (z.B. ongëlteg Zeechen) ze hu schéngt.
Gitt eng valabel E-Mailadress an oder loosst dëst Feld eidel.',
+'cannotchangeemail' => 'Mailadresse vu Benotzerkonte kënnen op dëser Wiki net geännert ginn.',
'accountcreated' => 'De Kont gouf geschaf',
'accountcreatedtext' => 'De Benotzerkont fir $1 gouf geschaf.',
'createaccount-title' => 'Opmaache vun engem Benotzerkont op {{SITENAME}}',
@@ -654,6 +657,7 @@ Waart w.e.g. ier Dir et nach eng Kéier versicht.",
# E-mail sending
'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Fonctioun',
+'user-mail-no-addy' => 'Huet versicht eng Mail ouni Mailadress ze schécken',
# Change password dialog
'resetpass' => 'Passwuert änneren',
@@ -675,18 +679,33 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
'resetpass-temp-password' => 'Temporäert Passwuert:',
# Special:PasswordReset
-'passwordreset' => 'Passwuert zrécksetzen',
-'passwordreset-text' => 'Fëllt dëse Formulaire aus fir eng E-Mail Erënnerung vun den Detailer vun Ärem Benotzerkont ze kréien.',
-'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-username' => 'Benotzernumm:',
-'passwordreset-domain' => 'Domaine:',
-'passwordreset-email' => 'E-Mailadress:',
-'passwordreset-emailtitle' => 'Detailer vum Benotzerkont op{{SITENAME}}',
-'passwordreset-emailelement' => 'Benotzernumm: $1
+'passwordreset' => 'Passwuert zrécksetzen',
+'passwordreset-text' => 'Fëllt dëse Formulaire aus fir eng E-Mail Erënnerung vun den Detailer vun Ärem Benotzerkont ze kréien.',
+'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-username' => 'Benotzernumm:',
+'passwordreset-domain' => 'Domaine:',
+'passwordreset-capture' => "D'Mail kucken?",
+'passwordreset-capture-help' => 'Wann Dir dës Këscht ukräizt, gëtt de Mail (mam temporäre Passwuert) Iech gewisen an dem Benotzer geschéckt.',
+'passwordreset-email' => 'E-Mailadress:',
+'passwordreset-emailtitle' => 'Detailer vum Benotzerkont op{{SITENAME}}',
+'passwordreset-emailelement' => 'Benotzernumm: $1
Temporärt Passwuert: $2',
-'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
+'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
+'passwordreset-emailsent-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt.",
+'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",
+
+# Special:ChangeEmail
+'changeemail' => 'Mailadress änneren',
+'changeemail-header' => 'Mailadress vum Benotzerkont änneren',
+'changeemail-text' => "Fëllt dëse Formulaire aus fir Är Mailadress z'änneren. Dir musst Äert Passwuert aginn fir dës Ännerung ze confirméieren.",
+'changeemail-no-info' => 'Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.',
+'changeemail-oldemail' => 'Aktuell Mailadress:',
+'changeemail-newemail' => 'Nei Mailadress:',
+'changeemail-none' => '(keng)',
+'changeemail-submit' => 'Mailadress änneren',
+'changeemail-cancel' => 'Ofbriechen',
# Edit page toolbar
'bold_sample' => 'Fettgedréckten Text',
@@ -761,9 +780,6 @@ Bedenkt datt Dir d\'Fonctioun "Dësem Benotzer eng E-Mail schécken" benotze kë
Är aktuell IP-Adress ass $3 an d\'Nummer vun Ärer Spär ass $5.
Gitt dës Donnéeë w.e.g bei allen Ufroen zu dëser Spär un.',
'blockednoreason' => 'Kee Grond uginn',
-'blockedoriginalsource' => "De Quelltext vun '''$1''' steet hei drënner:",
-'blockededitsource' => "Den Text vun '''Ären Ännerungen''' op '''$1''' steet hei drënner:",
-'whitelistedittitle' => "Login noutwännesch fir z'änneren",
'whitelistedittext' => 'Dir musst Iech $1, fir Säiten änneren ze kënnen.',
'confirmedittext' => 'Dir musst är E-Mail-Adress confirméieren, ier Dir Ännerunge maache kënnt.
Gitt w.e.g. eng E-Mailadrss a validéiert se op äre [[Special:Preferences|Benotzerastellungen]].',
@@ -844,7 +860,7 @@ Dir verspriecht ausserdeem datt Dir dësen Text selwer verfaasst hutt, oder aus
'''DROT KEE COPYRECHTLECH GESCHÃœTZTE CONTENU OUNI ERLAABNES AN!'''",
'copyrightwarning2' => "W.e.g. notéiert datt all Kontributiounen op {{SITENAME}} vun anere Benotzer verännert oder geläscht kënne ginn. Wann dir dat net wëllt, da setzt näischt heihinner.<br />
Dir verspriecht ausserdeem datt dir dësen Text selwer verfaasst hutt, oder aus dem Domaine public oder anere fräie Quelle kopéiert hutt. (cf. $1 fir méi Detailler). '''DROT KEE COPYRECHTLECH GESCHÜTZTE CONTENU AN!'''",
-'longpageerror' => "'''FEELER: Den Text, den Dir Versicht ze späicheren, huet $1 KB. Dëst ass méi wéi den erlaabte Maximum vun $2 KB – dofir kann den Text net gespäichert ginn.'''",
+'longpageerror' => "'''FEELER: Den Text, den Dir Versicht ze späicheren, huet {{PLURAL:$1|1 Kilobyte|$1 Kilobytes}}. Dëst ass méi wéi den erlaabte Maximum vun {{PLURAL:$2|1 Kilobyte|$2 Kilobytes}}''' Dofir kann den Text net gespäichert ginn.",
'readonlywarning' => "'''OPGEPASST: D'Datebank gouf wéinst Maintenanceaarbechte fir Säitenännerunge gespaart, dofir kënnt Dir déi Säit den Ament net ofspäicheren. Versuergt den Text a versicht d'Ännerunge méi spéit nach emol ze maachen.'''
Den Administrateur den d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
@@ -1004,8 +1020,6 @@ Aner {{SITENAME}}-Administrateure kënnen de geläschten Inhalt oder aner geläs
'revdelete-unsuppress' => 'Limitatiounen fir restauréiert Versiounen ophiewen',
'revdelete-log' => 'Grond:',
'revdelete-submit' => 'Op déi gewielte {{PLURAL:$1|Versioun|Versiounen}} uwenden',
-'revdelete-logentry' => 'Sichtbarkeet vun der Versioun gouf geännert fir [[$1]]',
-'logdelete-logentry' => "huet d'Sichtbarkeet vun [[$1]] geännert",
'revdelete-success' => "'''Sichtbarkeet vun de Versioune gouf aktualiséiert.''''",
'revdelete-failure' => "'''Sichtbarkeet vun der Versioun konnt net aktualiséiert ginn:'''
$1",
@@ -1017,15 +1031,6 @@ $1",
'revdel-restore-visible' => 'sichtbar Versiounen',
'pagehist' => 'Versioune vun dëser Säit',
'deletedhist' => 'Geläschte Versiounen',
-'revdelete-content' => 'Inhalt',
-'revdelete-summary' => 'Resumé änneren',
-'revdelete-uname' => 'Benotzernumm',
-'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
-'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
-'revdelete-hid' => '$1 verstoppen',
-'revdelete-unhid' => '$1 weisen',
-'revdelete-log-message' => '$1 fir $2 {{PLURAL:$2|Versioun|Versiounen}}',
-'logdelete-log-message' => '$1 fir $2 {{PLURAL:$2|Evenement|Evenementer}}',
'revdelete-hide-current' => 'Feeler beim Verstoppe vum Objet vum $2 ëm $1: et ass déi aktuell Versioun.
Si kann net verstoppt ginn.',
'revdelete-show-no-access' => 'Feeler beim Weise vum Objet vum $1 ëm $2 Auer: dësen Objet gouf als "limitéiert2 markéiert.
@@ -1184,12 +1189,14 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
'prefs-rc' => 'Rezent Ännerungen',
'prefs-watchlist' => 'Iwwerwaachungslëscht',
'prefs-watchlist-days' => 'Zuel vun den Deeg, déi an der Iwwerwaachungslëscht ugewise solle ginn:',
-'prefs-watchlist-days-max' => 'Maximal 7 Deeg',
+'prefs-watchlist-days-max' => 'Maximal $1 {{PLURAL:$1|Dag|Deeg}}',
'prefs-watchlist-edits' => 'Maximal Zuel vun den Ännerungen déi an der erweiderter Iwwerwaachungslëscht ugewise solle ginn:',
'prefs-watchlist-edits-max' => 'Maximal Zuel: 1000',
'prefs-watchlist-token' => 'Iwwerwaachungslëscht-Token:',
'prefs-misc' => 'Verschiddenes',
'prefs-resetpass' => 'Passwuert änneren',
+'prefs-changeemail' => 'Mailadress änneren',
+'prefs-setemail' => 'Eng Mailadress festleeën',
'prefs-email' => 'E-Mail-Optiounen',
'prefs-rendering' => 'Ausgesinn',
'saveprefs' => 'Späicheren',
@@ -1249,6 +1256,7 @@ Dëst kann net réckgängeg gemaach ginn.",
'yourrealname' => 'Richtegen Numm:',
'yourlanguage' => 'Sprooch:',
'yourvariant' => 'Sproochvariant fir den Inhalt:',
+'prefs-help-variant' => 'Är léifste Variant oder Orthographie an där Inhaltssäite vun dëser Wiki gewise solle ginn.',
'yournick' => 'Ënnerschrëft:',
'prefs-help-signature' => 'Bemierkungen op Diskussiounssäite solle mat "<nowiki>~~~~</nowiki>" ënnerschriwwe ginn. Dëst gëtt dann an Är Ënnerschrëft an en Zäitstempel ëmgewandelt.',
'badsig' => "D'Syntax vun ärer Ënnerschëft ass net korrekt; iwwerpréift w.e.g. ären HTML Code.",
@@ -1288,7 +1296,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
'userrights-lookup-user' => 'Benotzergrupp verwalten',
'userrights-user-editname' => 'Benotzernumm uginn:',
'editusergroup' => 'Benotzergruppen änneren',
-'editinguser' => "Ännere vun de Rechter vum Benotzer '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ännere vun de Rechter vum Benotzer '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Benotzergruppen änneren',
'saveusergroups' => 'Benotzergruppe späicheren',
'userrights-groupsmember' => 'Member vun:',
@@ -1382,13 +1390,13 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
'right-autopatrol' => 'Déi eegen Ännerungen automatesch als nogekuckt markéieren',
'right-patrolmarks' => 'Markéierung "nogekuckt" an de rezenten Ännerunge weisen',
'right-unwatchedpages' => 'Lëscht vun den net iwwerwaachte Säite weisen',
-'right-trackback' => 'En Trackback matdeelen',
'right-mergehistory' => 'Zesummeféierung vum Historique vun de Versioune vu Säiten',
'right-userrights' => 'All Benotzerrechter änneren',
'right-userrights-interwiki' => 'Benotzerrechter vu Benotzer op anere Wiki-Siten änneren',
'right-siteadmin' => "Datebank spären an d'Spär ophiewen",
'right-override-export-depth' => 'Säiten exportéieren inklusiv de verlinkte Säite bis zu enger Déift vu 5',
'right-sendemail' => 'Anere Benotzer E-Maile schécken',
+'right-passwordreset' => 'Maile vum Zrécksetze vum Passwuert weisen',
# User rights log
'rightslog' => 'Logbuch vun de Benotzerrechter',
@@ -1422,16 +1430,17 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
'action-suppressionlog' => 'dës privat Lëscht ze kucken',
'action-block' => 'dëse Benotzer fir Ännerungen ze spären',
'action-protect' => 'de Protectiounsstatus vun dëser Säit änneren',
+'action-rollback' => "Ännerunge vum läschte Benotzer vun enger spezieller Säit séier z'récksetzen ''(rollback)''",
'action-import' => "dës Säit aus enger anerer Wiki z'importéieren",
'action-importupload' => "dës Säit duerch d'Eropluede vun engem Fichier importéieren",
'action-patrol' => "d'Ännerunge vun Aneren als nogekuckt markéieren",
'action-autopatrol' => 'eegen Ännerungen als nogekuckt ze markéieren',
'action-unwatchedpages' => "d'Lëscht vun den net iwwerwaachte Säiten ze kucken",
-'action-trackback' => "en ''Trackback'' matzedeelen",
'action-mergehistory' => "d'Versiounsgeschicht vun dëser Säit zesummenzeféieren",
'action-userrights' => "all Benotzerrechter z'änneren",
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
@@ -1464,6 +1473,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
'rc_categories' => 'Nëmme Säiten aus de Kategorien (getrennt mat "|"):',
'rc_categories_any' => 'All',
'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Bytes}} no der Ännerung',
'newsectionsummary' => 'Neien Abschnitt /* $1 */',
'rc-enhanced-expand' => 'Detailer weisen (erfuedert JavaScript)',
'rc-enhanced-hide' => 'Detailer verstoppen',
@@ -1517,6 +1527,7 @@ Kuckt [[Special:NewFiles|d'Gallerie vun de neie Fichieren]] wann Dir méi e visu
'ignorewarnings' => 'Ignoréier all Iwwerschreiwungswarnungen',
'minlength1' => "D'Nimm vu Fichiere musse mindestens e Buschtaf am Numm hunn.",
'illegalfilename' => 'Am Fichiersnumm "$1" sti Schrëftzeechen, déi net am Numm vun enger Säit erlaabt sinn. W.e.g. nennt de Fichier anescht, a probéiert dann nach eng Kéier.',
+'filename-toolong' => 'Nimm vu Fichieren däerfen net méi laang si wéi 240 Byten.',
'badfilename' => 'Den Numm vum Fichier gouf an "$1" ëmgeännert.',
'filetype-mime-mismatch' => 'Dateierweiderung ".$1" passt net op de MIME-Typ vum Fichier ($2).',
'filetype-badmime' => 'Fichiere vum MIME-Typ "$1" kënnen net eropgeluede ginn.',
@@ -1611,6 +1622,31 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
'upload-unknown-size' => 'Onbekannte Gréisst',
'upload-http-error' => 'Et ass en HTTP-Feeler geschitt: $1',
+# File backend
+'backend-fail-stream' => 'De Fichier $1 konnt net iwwerdroe ginn.',
+'backend-fail-backup' => 'De Fichier $1 konnt net geséchert ginn.',
+'backend-fail-notexists' => 'De Fichier $1 gëtt et net.',
+'backend-fail-notsame' => 'Et gëtt schonn en net-identesche Fichier op $1.',
+'backend-fail-invalidpath' => '$1 ass keng valabel Plaz fir ze späicheren.',
+'backend-fail-delete' => 'De Fichier $1 konnt net geläscht ginn.',
+'backend-fail-alreadyexists' => 'De Fichier $1 gëtt et schonn.',
+'backend-fail-store' => 'De Fichier $1 konnt net op $2 gespäichert ginn.',
+'backend-fail-copy' => 'De Fichier $1 konnt net op $2 kopéiert ginn.',
+'backend-fail-move' => 'De Fichier $1 konnt net op $2 geréckelt ginn.',
+'backend-fail-opentemp' => 'Den temporäre Fichier konnt net opgemaach ginn.',
+'backend-fail-writetemp' => 'Den temporäre Fichier konnt net geännert ginn.',
+'backend-fail-closetemp' => 'Den temporäre Fichier konnt net zougemaach ginn.',
+'backend-fail-read' => 'De Fichier $1 konnt net geliest ginn.',
+'backend-fail-create' => 'De Fichier $1 konnt net ugeluecht ginn.',
+'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" konnt net fräigeschalt ginn; $1 ass net gespaart.',
+'lockmanager-fail-closelock' => 'De Spärfichier fir "$1" konnt net zougemaach ginn.',
+'lockmanager-fail-deletelock' => 'De Spärfichier fir "$1" konnt net geläscht ginn.',
+'lockmanager-fail-db-release' => "D'Spären op der Datebank $1 konnten net fräigeschalt ginn.",
+'lockmanager-fail-svr-release' => "D'Spären um Server $1 konnten net fräigeschalt ginn.",
+
# ZipDirectoryReader
'zip-file-open-error' => 'Beim Opmaache vum ZIP-Fichier ass e Feeler geschitt.',
'zip-wrong-format' => 'De Fichier deen Dir uginn hutt war kee ZIP Fichier.',
@@ -1735,23 +1771,24 @@ D'Beschreiwung op senger [$2 Beschreiwungssäit] steet hei ënnendrënner.",
'filerevert-badversion' => 'Et gëtt keng Versioun vun deem Fichier mat der Zäitinformatioun déi Dir uginn hutt.',
# File deletion
-'filedelete' => 'Läsch "$1"',
-'filedelete-legend' => 'Fichier läschen',
-'filedelete-intro' => "Dir läscht de Fichier '''[[Media:$1|$1]]''' mat all senge Versiounen (Historique).",
-'filedelete-intro-old' => "Dir läscht d'Versioun $4 vum $2, $3 Auer vum Fichier '''„[[Media:$1|$1]]“'''.",
-'filedelete-comment' => 'Grond:',
-'filedelete-submit' => 'Läschen',
-'filedelete-success' => "'''$1''' gouf geläscht.",
-'filedelete-success-old' => "D'Versioun vu(n) '''[[Media:$1|$1]]''' vum $2, $3 Auer gouf geläscht.",
-'filedelete-nofile' => "'''$1''' gëtt et net.",
-'filedelete-nofile-old' => "Et gëtt vun '''$1''' keng archivéiert Versioun mat den Attributer déi dir uginn hutt.",
-'filedelete-otherreason' => 'Aneren/zousätzleche Grond:',
-'filedelete-reason-otherlist' => 'Anere Grond',
-'filedelete-reason-dropdown' => "* Allgemeng Läschgrënn
+'filedelete' => 'Läsch "$1"',
+'filedelete-legend' => 'Fichier läschen',
+'filedelete-intro' => "Dir läscht de Fichier '''[[Media:$1|$1]]''' mat all senge Versiounen (Historique).",
+'filedelete-intro-old' => "Dir läscht d'Versioun $4 vum $2, $3 Auer vum Fichier '''„[[Media:$1|$1]]“'''.",
+'filedelete-comment' => 'Grond:',
+'filedelete-submit' => 'Läschen',
+'filedelete-success' => "'''$1''' gouf geläscht.",
+'filedelete-success-old' => "D'Versioun vu(n) '''[[Media:$1|$1]]''' vum $2, $3 Auer gouf geläscht.",
+'filedelete-nofile' => "'''$1''' gëtt et net.",
+'filedelete-nofile-old' => "Et gëtt vun '''$1''' keng archivéiert Versioun mat den Attributer déi dir uginn hutt.",
+'filedelete-otherreason' => 'Aneren/zousätzleche Grond:',
+'filedelete-reason-otherlist' => 'Anere Grond',
+'filedelete-reason-dropdown' => "* Allgemeng Läschgrënn
** Verletzung vun den Droits d'auteur
** De Fichier gëtt et nach eng Kéier an der Datebank",
-'filedelete-edit-reasonlist' => 'Läschgrënn änneren',
-'filedelete-maintenance' => 'Läschen a Restauréiere vu Fichieren temporär ausgeschalt wéinst Maintenance.',
+'filedelete-edit-reasonlist' => 'Läschgrënn änneren',
+'filedelete-maintenance' => 'Läschen a Restauréiere vu Fichieren temporär ausgeschalt wéinst Maintenance.',
+'filedelete-maintenance-title' => 'De Fichier kann net geläscht ginn',
# MIME search
'mimesearch' => 'No MIME-Zort sichen',
@@ -1857,6 +1894,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
'mostimages' => 'Dacks benotzte Biller',
'mostrevisions' => 'Säite mat de meeschte Versiounen',
'prefixindex' => 'All Säite mat Prefix',
+'prefixindex-namespace' => 'All Säite mat Prefix (Nummraum $1)',
'shortpages' => 'Kuerz Säiten',
'longpages' => 'Laang Säiten',
'deadendpages' => 'Sakgaasse-Säiten',
@@ -1966,12 +2004,8 @@ Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
'activeusers-noresult' => 'Keng Benotzer fonnt.',
# Special:Log/newusers
-'newuserlogpage' => 'Logbuch vun den neien Umeldungen',
-'newuserlogpagetext' => "Dëst ass d'Lescht vun de Benotzernimm déi ugeluecht goufen.",
-'newuserlog-byemail' => "d'Passwuert gouf per E-Mail geschéckt",
-'newuserlog-create-entry' => 'Neie Benotzer',
-'newuserlog-create2-entry' => 'huet den neie Benotzerkont $1 opgemaach',
-'newuserlog-autocreate-entry' => 'Benotzerkont gouf automatesch gemaach',
+'newuserlogpage' => 'Logbuch vun den neien Umeldungen',
+'newuserlogpagetext' => "Dëst ass d'Lescht vun de Benotzernimm déi ugeluecht goufen.",
# Special:ListGroupRights
'listgrouprights' => 'Rechter vun de Benotzergruppen',
@@ -2000,7 +2034,7 @@ Et ginn [[{{MediaWiki:Listgrouprights-helppage}}|zousätzlech Informatiounen]] i
'emailpagetext' => 'Dir kënnt mat dësem Formulaire dësem Benotzer en E-Mail-Message schécken.
D\'E-Mailadress, déi Dir an [[Special:Preferences|Ären Astellungen]] aginn hutt, steet an der "From" Adress vun der Mail, sou datt den Destinataire Iech direkt äntwerte kann.',
'usermailererror' => 'E-Mail-Objet mellt deen heite Feeler:',
-'defemailsubject' => 'E-Mail vu(n) {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} E-Mail vum Benotzer "$1"',
'usermaildisabled' => 'Benotzer E-Mail ausgeschalt',
'usermaildisabledtext' => 'Dir kënnt op dëser Wiki anere Benotzer keng E-Mail schécken',
'noemailtitle' => 'Keng E-Mailadress',
@@ -2055,7 +2089,7 @@ Wann dir dës Säit net méi iwwerwaache wëllt, klickt op \"Net méi iwwerwaach
'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}}.',
'iteminvalidname' => "Problem mat dem Objet '$1', ongëltegen Numm ...",
-'wlnote' => "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht '''$1''' Ännerunge}} vun {{PLURAL:$2|der leschter Stonn|de leschte(n) '''$2''' Stonnen}}.",
+'wlnote' => "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht '''$1''' Ännerunge}} vun {{PLURAL:$2|der leschter Stonn|de leschte(n) '''$2''' Stonnen}}, Stand: $3 ëm $4 Auer.",
'wlshowlast' => "D'Ännerunge vun de leschte(n) $1 Stonnen, $2 Deeg oder $3 (an de leschten 30 Deeg) weisen.",
'watchlist-options' => 'Optioune vun der Iwwerwaachungslëscht',
@@ -2123,8 +2157,6 @@ W.e.g. confirméiert, datt Dir dëst wierklech wëllt, datt Dir d'Konsequenze ve
'actioncomplete' => 'Aktioun ofgeschloss',
'actionfailed' => 'Aktioun huet net fonctionnéiert',
'deletedtext' => '"$1" gouf geläscht. Kuckt $2 fir eng Lëscht vun de Säiten déi viru Kuerzem geläscht goufen.',
-'deletedarticle' => 'huet "[[$1]]" geläscht',
-'suppressedarticle' => 'geläscht "$1"',
'dellogpage' => 'Läschlëscht',
'dellogpagetext' => 'Hei fannt dir eng Lëscht mat rezent geläschte Säiten. All Auerzäiten sinn déi vum Server.',
'deletionlog' => 'Läschlëscht',
@@ -2173,7 +2205,10 @@ Kuckt d'[[Special:ProtectedPages|Lëscht vun de gespaarte Säite]] fir eng Lësc
'unprotectedarticle' => 'huet d\'Spär vu(n) "[[$1]]" opgehuewen',
'movedarticleprotection' => 'huet de Säiteschutz vun "[[$2]]" op "[[$1]]" geännert',
'protect-title' => 'Ännerung vun der Protectioun vu(n) „$1“',
+'protect-title-notallowed' => 'Den Niveau vun der Protectioun vu(n) "$1" weisen',
'prot_1movedto2' => '[[$1]] gouf op [[$2]] geréckelt',
+'protect-badnamespace-title' => 'Nummraum deen net gespaart ka ginn',
+'protect-badnamespace-text' => 'Säiten an dësem Nummraum kënnen net gespaart ginn.',
'protect-legend' => "Confirméiert d'Protectioun",
'protectcomment' => 'Grond:',
'protectexpiry' => 'Dauer vun der Spär:',
@@ -2194,6 +2229,7 @@ Hei sinn déi aktuell Astellunge fir d'Säit '''$1''':",
'protect-level-sysop' => 'Nëmmen Administrateuren',
'protect-summary-cascade' => 'Protectioun a Kaskaden',
'protect-expiring' => 'bis $1 (UTC)',
+'protect-expiring-local' => 'bis $1',
'protect-expiry-indefinite' => 'net definéiert',
'protect-cascade' => "Kaskade-Spär – alleguerten d'Schablounen déi an dës Säit agebonne si ginn och gespaart.",
'protect-cantedit' => "Dir kënnt d'Spär vun dëser Säit net änneren, well Dir net déi néideg Rechter hutt fir déi Säit z'änneren.",
@@ -2250,7 +2286,6 @@ An esou Fäll däerf déi neiste Versioun net markéiert ginn oder déi neiste g
'undeletereset' => 'Ofbriechen',
'undeleteinvert' => 'Auswiel ëmdréinen',
'undeletecomment' => 'Grond:',
-'undeletedarticle' => 'huet "[[$1]]" restauréiert',
'undeletedrevisions' => '$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert',
'undeletedfiles' => '$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert',
@@ -2259,6 +2294,7 @@ An esou Fäll däerf déi neiste Versioun net markéiert ginn oder déi neiste g
Am [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
'undelete-header' => 'Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläschte Säiten.',
+'undelete-search-title' => 'Geläschte Säite sichen',
'undelete-search-box' => 'Sichen no geläschte Säiten',
'undelete-search-prefix' => 'Weis Säiten déi esou ufänken:',
'undelete-search-submit' => 'Sichen',
@@ -2267,6 +2303,7 @@ Am [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréier
'undelete-bad-store-key' => "D'Versioun vum Fichier mat dem Zäitstempel $1 konnt net restauréiert ginn: De Fichier war scho virum Läschen net méi do.",
'undelete-cleanup-error' => 'Feeler beim Läsche vun der onbenotzter Archiv-Versioun $1.',
'undelete-missing-filearchive' => 'De Fichier mat der Archiv-ID $1 kann net restauréiert ginn, well en net an der Datebank ass. Méiglecherweis gouf e scho restauréiert.',
+'undelete-error' => 'Feeler beim Restauréiere vun der Säit',
'undelete-error-short' => 'Feeler beim Restauréiere vum Fichier: $1',
'undelete-error-long' => 'Beim Restauréiere vun engem Fichier goufe Feeler fonnt:
@@ -2386,6 +2423,7 @@ Kuckt d'[[Special:BlockList|IP Spär-Lëscht]] fir all Spären ze gesin.",
'blocklist-userblocks' => 'Benotzerspäre verstoppen',
'blocklist-tempblocks' => 'Temporär Späre verstoppen',
'blocklist-addressblocks' => 'Eenzel IP-Späre verstoppen',
+'blocklist-rangeblocks' => 'Späre vu ganzen IP-Beräicher verstoppen',
'blocklist-timestamp' => 'Zäitstempel',
'blocklist-target' => 'Zil',
'blocklist-expiry' => 'Spär bis',
@@ -2408,6 +2446,7 @@ Kuckt d'[[Special:BlockList|IP Spär-Lëscht]] fir all Spären ze gesin.",
'unblocklink' => 'Spär ophiewen',
'change-blocklink' => 'Spär änneren',
'contribslink' => 'Kontributiounen',
+'emaillink' => 'Mail schécken',
'autoblocker' => 'Dir sidd automatesch gespaart well dir eng IP Adress mam "[[User:$1|$1]]" deelt.
De Grond dee fir d\'Spär vum $1 ugi gouf ass: "$2".',
'blocklogpage' => 'Spärlëscht',
@@ -2533,9 +2572,6 @@ An deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéiere
'movepage-page-moved' => "D'Säit $1 gouf op $2 geréckelt.",
'movepage-page-unmoved' => "D'Säit $1 konnt net op $2 geréckelt ginn.",
'movepage-max-pages' => 'Déi Maximalzuel vu(n) $1 {{PLURAL:$1|Säit gouf|Säite goufe}} gouf geréckelt. All déi aner Säite kënnen net automatesch geréckelt ginn.',
-'1movedto2' => '[[$1]] gouf op [[$2]] geréckelt',
-'1movedto2_redir' => '[[$1]] gouf op [[$2]] geréckelt, dobäi gouf eng Viruleedung iwwerschriwwen.',
-'move-redirect-suppressed' => 'Viruleedung ewechgehol',
'movelogpage' => 'Réckellëscht',
'movelogpagetext' => 'Dëst ass eng Lëscht vun alle geréckelte Säiten.',
'movesubpage' => '{{PLURAL:$1|Ënnersäit|Ënnersäiten}}',
@@ -2546,7 +2582,7 @@ An deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéiere
'delete_and_move' => 'Läschen a réckelen',
'delete_and_move_text' => '== Läsche vun der Destinatiounssäit néideg == D\'Säit "[[:$1]]" existéiert schonn. Wëll der se läsche fir d\'Réckelen ze erméiglechen?',
'delete_and_move_confirm' => "Jo, läsch d'Destinatiounssäit",
-'delete_and_move_reason' => 'Geläscht fir Plaz ze maache fir eng Säit heihin ze réckelen',
+'delete_and_move_reason' => 'Geläscht fir Plaz ze maache fir "[[$1]]" heihin ze réckelen',
'selfmove' => 'Source- an Destinatiounsnumm sinn dselwecht; eng Säit kann net op sech selwer geréckelt ginn.',
'immobile-source-namespace' => 'Säite am Nummraum: $1 kënnen net geréckelt ginn',
'immobile-target-namespace' => 'Säite kënnen net an den Nummraum: $1 geréckelt ginn',
@@ -2573,9 +2609,11 @@ Sicht Iech w.e.g. en aneren Numm.',
Fir eng Säit z'exportéieren, gitt den Titel an d'Textkëscht heidrënner an, een Titel pro Linn, a wielt aus op Dir nëmmen déi aktuell Versioun oder all Versioune mam ganzen Historique exportéiere wëllt.
Wann nëmmen déi aktuell Versioun exportéiert soll ginn, kënnt Dir och e Link benotze wéi z.B [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d'\"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'All Säiten Exportéieren',
'exportcuronly' => 'Nëmmen déi aktuell Versioun exportéieren an net de ganzen Historique',
'exportnohistory' => "----
'''Hiwäis:''' Den Export vu komplette Versiounshistoriquen ass aus Performancegrënn bis op weideres net méiglech.",
+'exportlistauthors' => 'Fir all Säit eng komplett Lëscht vun deenen déi un der Säit matgeschafft hunn drasetzen',
'export-submit' => 'Exportéieren',
'export-addcattext' => 'Säiten aus Kategorie derbäisetzen:',
'export-addcat' => 'Derbäisetzen',
@@ -2608,6 +2646,8 @@ Besicht w.e.g. [//www.mediawiki.org/wiki/Localisation MediaWiki Localisatioun] a
'thumbnail_error' => 'Feeler beim Erstelle vun der Miniatur: $1',
'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",
+'thumbnail-dest-create' => "D'Miniatur bild konnt net do gespäichert gi wou dat virgesinn ass",
'thumbnail_invalid_params' => 'Ongëlteg Miniatur-Parameter',
'thumbnail_dest_directory' => 'Den Zilepertoire konnt net ugeluecht ginn.',
'thumbnail_image-type' => 'Bildtyp gëtt net ënnerstëtzt',
@@ -2652,6 +2692,11 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
'import-upload' => 'XML-Daten importéieren',
'import-token-mismatch' => "D'Date vun ärer Sessioun si verluer gaang. Versicht et w.e.g. nach eemol.",
'import-invalid-interwiki' => 'Aus der Wiki déi Dir uginn hutt kann näischt importéiert ginn.',
+'import-error-edit' => 'D\'Säit "$1" gouf net importéiert well Dir se net änneren däerft.',
+'import-error-create' => 'D\'Säit "$1" gouf net importéiert well Dir se net uleeën däerft.',
+'import-error-interwiki' => 'D\'Säit "$1" gouf net importéiert well deen Numm fir extern Linken (Interwiki) reservéiert ass.',
+'import-error-special' => 'D\'Säit "$1" gouf net importéiert well se zu engem speziellen Nummraum gehéiert an deem et keng Säite gëtt.',
+'import-error-invalid' => 'D\'Säit "$1" gouf net importéiert well hiren Numm net valabel ass.',
# Import log
'importlogpage' => 'Lëscht vun den Säitenimporten',
@@ -2661,73 +2706,83 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
'import-logentry-interwiki' => 'huet $1 importéiert (Transwiki)',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Versioun|Versioune}} vum $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-Test',
+'javascripttest-disabled' => 'Dës Funktioun ass ausgeschalt.',
+'javascripttest-title' => '$1-Tester ginn elo gemaach',
+'javascripttest-pagetext-noframework' => 'Dës Säit ass fir Java-Script-Tester reservéiert.',
+'javascripttest-pagetext-unknownframework' => 'Onbekannten Test-Framework "$1".',
+'javascripttest-qunit-intro' => "Kuckt d'[$1 Dokumentatioun vun den Tester] op mediawiki.org",
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Är Benotzersäit',
-'tooltip-pt-anonuserpage' => 'Benotzersäit vun der IP-Adress vun där aus Dir den Ament Ännerunge maachtt',
-'tooltip-pt-mytalk' => 'Är Diskussiounssäit',
-'tooltip-pt-anontalk' => "Diskussioun iwwer d'Ännerungen déi vun dëser IP-Adress aus gemaach gi sinn",
-'tooltip-pt-preferences' => 'Meng Astellungen',
-'tooltip-pt-watchlist' => 'Lëscht vu Säiten, bei deenen Dir op Ännerungen oppasst',
-'tooltip-pt-mycontris' => 'Lëscht vun äre Kontributiounen',
-'tooltip-pt-login' => 'Sech umelle gëtt gäre gesinn, Dir musst et awer net maachen.',
-'tooltip-pt-anonlogin' => 'Et wier gutt, Dir géift Iech aloggen, och wann et keng Musse-Saach ass.',
-'tooltip-pt-logout' => 'Ofmellen',
-'tooltip-ca-talk' => 'Diskussioun iwwer de Säiteninhalt',
-'tooltip-ca-edit' => 'Dës Säit ka geännert ginn. Maacht vun der Méiglechkeet Gebrauch fir ze "kucken ouni ofzespäicheren" a kuckt ob alles an der Rei ass ier der ofspäichert.',
-'tooltip-ca-addsection' => 'En neien Abschnitt ufänken.',
-'tooltip-ca-viewsource' => 'Dës Säit ass gespaart. Nëmmen de Quelltext ka gewise ginn.',
-'tooltip-ca-history' => 'Vireg Versioune vun dëser Säit',
-'tooltip-ca-protect' => 'Dës Säit spären',
-'tooltip-ca-unprotect' => "D'Spär vun dëser Säit änneren",
-'tooltip-ca-delete' => 'Dës Säit läschen',
-'tooltip-ca-undelete' => 'Dës Säit restauréieren',
-'tooltip-ca-move' => 'Dës Säit réckelen',
-'tooltip-ca-watch' => 'Dës Säit op Är Iwwerwaachungslëscht bäisetzen',
-'tooltip-ca-unwatch' => 'Dës Säit vun der Iwwerwaachungslëscht erofhuelen',
-'tooltip-search' => 'Op {{SITENAME}} sichen',
-'tooltip-search-go' => 'Direkt op genee déi Säit goen, wann et se gëtt.',
-'tooltip-search-fulltext' => 'No Säite sichen, an deenen dësen Text dran ass',
-'tooltip-p-logo' => "Besicht d'Haaptsäit",
-'tooltip-n-mainpage' => "Besicht d'Haaptsäit",
-'tooltip-n-mainpage-description' => "Besicht d'Haaptsäit",
-'tooltip-n-portal' => 'Iwwer de Portal, wat Dir maache kënnt, wou wat ze fannen ass',
-'tooltip-n-currentevents' => "D'Aktualitéit a wat derhannert ass",
-'tooltip-n-recentchanges' => 'Lëscht vun de rezenten Ännerungen op {{SITENAME}}.',
-'tooltip-n-randompage' => 'Zoufälleg Säit',
-'tooltip-n-help' => 'Hëllefsäiten weisen.',
-'tooltip-t-whatlinkshere' => 'Lëscht vun alle Säiten, déi heihi linken',
-'tooltip-t-recentchangeslinked' => 'Rezent Ännerungen op Säiten, déi von hei verlinkt sinn',
-'tooltip-feed-rss' => 'RSS-Feed fir dës Säit',
-'tooltip-feed-atom' => 'Atom-Feed fir dës Säit',
-'tooltip-t-contributions' => 'Lëscht vun de Kontributioune vun dësem Benotzer',
-'tooltip-t-emailuser' => 'Dësem Benotzer eng E-Mail schécken',
-'tooltip-t-upload' => 'Biller oder Mediefichieren eroplueden',
-'tooltip-t-specialpages' => 'Lëscht vun alle Spezialsäiten',
-'tooltip-t-print' => 'Versioun vun dëser Säit fir auszedrécken',
-'tooltip-t-permalink' => 'Permanente Link op dës Versioun vun dëser Säit',
-'tooltip-ca-nstab-main' => 'Contenu vun der Säit weisen',
-'tooltip-ca-nstab-user' => 'Benotzersäit weisen',
-'tooltip-ca-nstab-media' => 'Mediesäit weisen',
-'tooltip-ca-nstab-special' => 'Dëst ass eng Spezialsäit. Si kann net geännert ginn.',
-'tooltip-ca-nstab-project' => 'Portalsäit weisen',
-'tooltip-ca-nstab-image' => 'Billersäit weisen',
-'tooltip-ca-nstab-mediawiki' => 'Systemmessage weisen',
-'tooltip-ca-nstab-template' => 'Schabloun weisen',
-'tooltip-ca-nstab-help' => 'Hëllefssäite weisen',
-'tooltip-ca-nstab-category' => 'Kategoriesäit weisen',
-'tooltip-minoredit' => 'Dës Ännerung als kleng markéieren.',
-'tooltip-save' => 'Ännerunge späicheren',
-'tooltip-preview' => 'Kuckt är Ännerungen ouni ofzespäicheren, Benotzt dëst w.e.g. virum späicheren!',
-'tooltip-diff' => 'Weist wéi eng Ännerungen Dir beim Text gemaach hutt.',
-'tooltip-compareselectedversions' => "D'Ënnerscheeder op dëser Säit tëscht den zwou gewielte Versioune weisen.",
-'tooltip-watch' => 'Dës Säit op Är Iwwerwaachungslëscht bäisetzen',
-'tooltip-recreate' => "D'Säit nees uleeën, obwuel se geläscht gi war.",
-'tooltip-upload' => 'Mam eroplueden ufänken',
-'tooltip-rollback' => '"Zrécksetzen" mécht all Ännerunge vum leschten "Auteur" an engem Klick nees réckgängeg.',
-'tooltip-undo' => '"Zréck" setzt dës Ännerung zréck a mécht den Ännerungsformulaire am Modus "kucken ouni ofzespäicheren" op.
+'tooltip-pt-userpage' => 'Är Benotzersäit',
+'tooltip-pt-anonuserpage' => 'Benotzersäit vun der IP-Adress vun där aus Dir den Ament Ännerunge maachtt',
+'tooltip-pt-mytalk' => 'Är Diskussiounssäit',
+'tooltip-pt-anontalk' => "Diskussioun iwwer d'Ännerungen déi vun dëser IP-Adress aus gemaach gi sinn",
+'tooltip-pt-preferences' => 'Meng Astellungen',
+'tooltip-pt-watchlist' => 'Lëscht vu Säiten, bei deenen Dir op Ännerungen oppasst',
+'tooltip-pt-mycontris' => 'Lëscht vun äre Kontributiounen',
+'tooltip-pt-login' => 'Sech umelle gëtt gäre gesinn, Dir musst et awer net maachen.',
+'tooltip-pt-anonlogin' => 'Et wier gutt, Dir géift Iech aloggen, och wann et keng Musse-Saach ass.',
+'tooltip-pt-logout' => 'Ofmellen',
+'tooltip-ca-talk' => 'Diskussioun iwwer de Säiteninhalt',
+'tooltip-ca-edit' => 'Dës Säit ka geännert ginn. Maacht vun der Méiglechkeet Gebrauch fir ze "kucken ouni ofzespäicheren" a kuckt ob alles an der Rei ass ier der ofspäichert.',
+'tooltip-ca-addsection' => 'En neien Abschnitt ufänken.',
+'tooltip-ca-viewsource' => 'Dës Säit ass gespaart. Nëmmen de Quelltext ka gewise ginn.',
+'tooltip-ca-history' => 'Vireg Versioune vun dëser Säit',
+'tooltip-ca-protect' => 'Dës Säit spären',
+'tooltip-ca-unprotect' => "D'Spär vun dëser Säit änneren",
+'tooltip-ca-delete' => 'Dës Säit läschen',
+'tooltip-ca-undelete' => 'Dës Säit restauréieren',
+'tooltip-ca-move' => 'Dës Säit réckelen',
+'tooltip-ca-watch' => 'Dës Säit op Är Iwwerwaachungslëscht bäisetzen',
+'tooltip-ca-unwatch' => 'Dës Säit vun der Iwwerwaachungslëscht erofhuelen',
+'tooltip-search' => 'Op {{SITENAME}} sichen',
+'tooltip-search-go' => 'Direkt op genee déi Säit goen, wann et se gëtt.',
+'tooltip-search-fulltext' => 'No Säite sichen, an deenen dësen Text dran ass',
+'tooltip-p-logo' => "Besicht d'Haaptsäit",
+'tooltip-n-mainpage' => "Besicht d'Haaptsäit",
+'tooltip-n-mainpage-description' => "Besicht d'Haaptsäit",
+'tooltip-n-portal' => 'Iwwer de Portal, wat Dir maache kënnt, wou wat ze fannen ass',
+'tooltip-n-currentevents' => "D'Aktualitéit a wat derhannert ass",
+'tooltip-n-recentchanges' => 'Lëscht vun de rezenten Ännerungen op {{SITENAME}}.',
+'tooltip-n-randompage' => 'Zoufälleg Säit',
+'tooltip-n-help' => 'Hëllefsäiten weisen.',
+'tooltip-t-whatlinkshere' => 'Lëscht vun alle Säiten, déi heihi linken',
+'tooltip-t-recentchangeslinked' => 'Rezent Ännerungen op Säiten, déi von hei verlinkt sinn',
+'tooltip-feed-rss' => 'RSS-Feed fir dës Säit',
+'tooltip-feed-atom' => 'Atom-Feed fir dës Säit',
+'tooltip-t-contributions' => 'Lëscht vun de Kontributioune vun dësem Benotzer',
+'tooltip-t-emailuser' => 'Dësem Benotzer eng E-Mail schécken',
+'tooltip-t-upload' => 'Biller oder Mediefichieren eroplueden',
+'tooltip-t-specialpages' => 'Lëscht vun alle Spezialsäiten',
+'tooltip-t-print' => 'Versioun vun dëser Säit fir auszedrécken',
+'tooltip-t-permalink' => 'Permanente Link op dës Versioun vun dëser Säit',
+'tooltip-ca-nstab-main' => 'Contenu vun der Säit weisen',
+'tooltip-ca-nstab-user' => 'Benotzersäit weisen',
+'tooltip-ca-nstab-media' => 'Mediesäit weisen',
+'tooltip-ca-nstab-special' => 'Dëst ass eng Spezialsäit. Si kann net geännert ginn.',
+'tooltip-ca-nstab-project' => 'Portalsäit weisen',
+'tooltip-ca-nstab-image' => 'Billersäit weisen',
+'tooltip-ca-nstab-mediawiki' => 'Systemmessage weisen',
+'tooltip-ca-nstab-template' => 'Schabloun weisen',
+'tooltip-ca-nstab-help' => 'Hëllefssäite weisen',
+'tooltip-ca-nstab-category' => 'Kategoriesäit weisen',
+'tooltip-minoredit' => 'Dës Ännerung als kleng markéieren.',
+'tooltip-save' => 'Ännerunge späicheren',
+'tooltip-preview' => 'Kuckt är Ännerungen ouni ofzespäicheren, Benotzt dëst w.e.g. virum späicheren!',
+'tooltip-diff' => 'Weist wéi eng Ännerungen Dir beim Text gemaach hutt.',
+'tooltip-compareselectedversions' => "D'Ënnerscheeder op dëser Säit tëscht den zwou gewielte Versioune weisen.",
+'tooltip-watch' => 'Dës Säit op Är Iwwerwaachungslëscht bäisetzen',
+'tooltip-watchlistedit-normal-submit' => 'Säiten erofhuelen',
+'tooltip-watchlistedit-raw-submit' => 'Iwwerwaachungslëscht aktualiséieren',
+'tooltip-recreate' => "D'Säit nees uleeën, obwuel se geläscht gi war.",
+'tooltip-upload' => 'Mam eroplueden ufänken',
+'tooltip-rollback' => '"Zrécksetzen" mécht all Ännerunge vum leschten "Auteur" an engem Klick nees réckgängeg.',
+'tooltip-undo' => '"Zréck" setzt dës Ännerung zréck a mécht den Ännerungsformulaire am Modus "kucken ouni ofzespäicheren" op.
Erlaabt et e Grond an de Resumé derbäizesetzen.',
-'tooltip-preferences-save' => 'Astellunge späicheren',
-'tooltip-summary' => 'Gitt e kuerze Resumé an',
+'tooltip-preferences-save' => 'Astellunge späicheren',
+'tooltip-summary' => 'Gitt e kuerze Resumé an',
# Stylesheets
'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick'' */",
@@ -2804,9 +2859,6 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
# Patrol log
'patrol-log-page' => 'Logbuch vun den iwwerkuckte Versiounen',
'patrol-log-header' => "Dëst ass d'Logbuch vun den nogekuckte Versiounen.",
-'patrol-log-line' => 'huet d\'$1 vu(n) "$2" als nogekuckt markéiert $3',
-'patrol-log-auto' => '(automatesch)',
-'patrol-log-diff' => 'Versioun $1',
'log-show-hide-patrol' => 'Kontroll-Logbuch $1',
# Image deletion
@@ -2833,11 +2885,11 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
'file-info' => 'Fichiersgréisst: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 Pixel, Fichiersgréisst: $3, MIME-Typ: $4',
'file-info-size-pages' => '$1 × $2 Pixelen, Gréisst vum Fichier: $3, MIME Typ: $4, $5 {{PLURAL:$5|Säit|Säiten}}',
-'file-nohires' => '<small>Et gëtt keng méi héich Opléisung.</small>',
+'file-nohires' => 'Et gëtt keng méi héich Opléisung.',
'svg-long-desc' => 'SVG-Fichier, Basisgréisst: $1 × $2 Pixel, Gréisst vum Fichier: $3',
'show-big-image' => 'Voll Opléisung',
-'show-big-image-preview' => '<small>Gréisst vun dësem Preview: $1.</small>',
-'show-big-image-other' => '<small>Aner Gréissten: $1.</small>',
+'show-big-image-preview' => 'Gréisst vun dësem Preview: $1.',
+'show-big-image-other' => 'Aner {{PLURAL:$2|Opléisung|Opléisungen}}: $1.',
'show-big-image-size' => '$1 × $2 Pixel',
'file-info-gif-looped' => 'endlos Schleef',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Biller}}',
@@ -2857,6 +2909,13 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
'bydate' => 'no Datum',
'sp-newimages-showfrom' => 'Nei Biller weisen, ugefaang den $1 ëm $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|enger Sekonn|$1 Sekonnen}}',
+'minutes' => '{{PLURAL:$1|enger Minutt|$1 Minutten}}',
+'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
+'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
+'ago' => 'viru(n) $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3334,13 +3393,6 @@ Dëse Confirmatiouns-Code leeft den $4 of.',
'scarytranscludefailed' => "[D'Siche no der Schabloun fir $1 huet net funktionéiert]",
'scarytranscludetoolong' => "[D'URL ass ze laang]",
-# Trackbacks
-'trackbackbox' => "''Trackbacke'' fir dës Säit:<br />
-$1",
-'trackbackremove' => '([$1 läschen])',
-'trackbacklink' => 'Zréckverfollegen',
-'trackbackdeleteok' => "Den ''Trackback'' gouf geläscht.",
-
# Delete conflict
'deletedwhileediting' => "'''Opgepasst''': Dës Säit gouf geläscht nodeems datt dir ugefaangen hutt se z'änneren!",
'confirmrecreate' => "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit geläscht, nodeems datt där ugefaangen hutt drun ze schaffen. D'Begrënnung war: ''$2'' Bestätegt w.e.g., datt Dir dës Säit wierklich erëm nei opmaache wëllt.",
@@ -3419,6 +3471,9 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
'watchlisttools-edit' => 'Iwwerwaachungslëscht weisen an änneren',
'watchlisttools-raw' => 'Net-formatéiert Iwwerwaachungslëscht änneren',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussioun]])',
+
# Core parser functions
'unknown_extension_tag' => 'Onbekannten Erweiderungs-Tag "$1"',
'duplicate-defaultsort' => 'Opgepasst: Den Zortéierschlëssel "$2" iwwerschreift de viregen Zortéierschlëssel "$1".',
@@ -3517,13 +3572,16 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'tags-hitcount' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
# Special:ComparePages
-'comparepages' => 'Säite vergläichen',
-'compare-selector' => 'Versioune vu Säite vergläichen',
-'compare-page1' => 'Säit 1',
-'compare-page2' => 'Säit 2',
-'compare-rev1' => 'Versioun 1',
-'compare-rev2' => 'Versioun 2',
-'compare-submit' => 'Vergläichen',
+'comparepages' => 'Säite vergläichen',
+'compare-selector' => 'Versioune vu Säite vergläichen',
+'compare-page1' => 'Säit 1',
+'compare-page2' => 'Säit 2',
+'compare-rev1' => 'Versioun 1',
+'compare-rev2' => 'Versioun 2',
+'compare-submit' => 'Vergläichen',
+'compare-invalid-title' => 'Den Titel deen Dir uginn hutt ass net valabel.',
+'compare-title-not-exists' => 'Den Titel deen Dir uginn hutt gëtt et net.',
+'compare-revision-not-exists' => "D'Versioun déi Dir uginn hutt gëtt et net.",
# Database error messages
'dberr-header' => 'Dës Wiki huet e Problem',
@@ -3550,4 +3608,84 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'sqlite-has-fts' => "$1 ënnerstëtzt d'Volltextsich",
'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
+# New logging system
+'logentry-delete-delete' => "$1 huet d'Säit $3 geläscht",
+'logentry-delete-restore' => "$1 huet d'Säit $3 restauréiert",
+'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
+'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
+'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
+'logentry-suppress-delete' => "$1 huet d'Säit $3 ewechgeholl",
+'logentry-suppress-event-legacy' => "$1 huet diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
+'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 geännert",
+'revdelete-content-hid' => 'Inhalt verstoppt',
+'revdelete-summary-hid' => 'Resumé vun der Ännerung verstoppt',
+'revdelete-uname-hid' => 'Benotzernumm verstoppt',
+'revdelete-content-unhid' => 'Inhalt net verstoppt',
+'revdelete-summary-unhid' => 'Resumé vun der Ännerung net verstoppt',
+'revdelete-uname-unhid' => 'Benotzernumm net verstoppt',
+'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
+'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
+'logentry-move-move' => "$1 huet d'Säit $3 op $4 geréckelt",
+'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt ouni eng Viruleedung unzeleeën",
+'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
+'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
+'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
+'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt markéiert",
+'logentry-newusers-newusers' => '$1 huet e Benotzerkont ugeluecht',
+'logentry-newusers-create' => '$1 huet e Benotzerkont ugeluecht',
+'logentry-newusers-create2' => '$1 huet ee Benotzerkont ugeluecht $3',
+'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
+'newuserlog-byemail' => "d'Passwuert gouf per E-Mail geschéckt",
+
+# Feedback
+'feedback-subject' => 'Sujet:',
+'feedback-message' => 'Message:',
+'feedback-cancel' => 'Ofbriechen',
+'feedback-submit' => 'Feedback schécken',
+'feedback-adding' => "Feedback gëtt bäi d'Säit derbäigesat...",
+'feedback-error1' => 'Feeler: Resultat vum API gouf net erkannt',
+'feedback-error2' => "Feeler: D'Ännerung gouf net gespäichert",
+'feedback-error3' => 'Feeler: Keng Äntwert vum API',
+'feedback-thanks' => 'Merci! Äre Feedback gouf op der Säit "[$2 $1]" gespäichert.',
+'feedback-close' => 'Fäerdeg',
+'feedback-bugcheck' => 'Super! Kuckt just no ob et net ee vun de schonns [$1 bekannte Feeler] ass.',
+'feedback-bugnew' => 'Ech hunn et nogekuckt. Den neie Bug mellen',
+
+# API errors
+'api-error-badaccess-groups' => 'Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.',
+'api-error-badtoken' => 'Interne Feeler: falschen Token.',
+'api-error-copyuploaddisabled' => "D'Eroplueden iwwer eng URL ass op dësem Server desaktivéiert.",
+'api-error-duplicate' => 'Et gëtt schonn {{PLURAL:$1|[$2 en anere Fichier]|[$2 aner Fichiere]}} mat dem selwechten Inhalt op dem Site',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duebele Fichier, dee scho geläscht gouf|Duebel Fichieren, déi scho geläscht goufen}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duebele Fichier|Duebel Fichieren}}',
+'api-error-empty-file' => 'De Fichier deen Dir geschéckt hutt war eidel.',
+'api-error-emptypage' => 'Et ass net erlaabt nei, eidel Säiten unzeleeën.',
+'api-error-fetchfileerror' => 'Interne Feeler: beim Opruffe vum Fichier huet eppes net fonctionnéiert.',
+'api-error-file-too-large' => 'De Fichier deen Dir geschéckt hutt war ze grouss.',
+'api-error-filename-tooshort' => 'Den Numm vum Fichier ass ze kuerz.',
+'api-error-filetype-banned' => 'Dësen Typ vu Fichier ass net zougelooss.',
+'api-error-filetype-missing' => "D'Erweiderung vum Fichier feelt.",
+'api-error-hookaborted' => "D'Ännerung déi Dir versicht hutt ze maachen ass duerch en 'extension-hook' ofgebrach ginn.",
+'api-error-http' => 'Interne Feeler: net méiglech sech op de Server ze connectéieren.',
+'api-error-illegal-filename' => 'Den Numm vum Fichier ass net erlaabt.',
+'api-error-internal-error' => 'Interne Feeler: Et ass eppes schif gaang beim Verschaffe vum eropgeluedene Fichier op der Wiki.',
+'api-error-invalid-file-key' => 'Interne Feeler: de Fichier gouf op der temporärer Späicherplaz net fonnt.',
+'api-error-missingparam' => 'Interne Feeler: E vun de Parameter feelt an der Ufro.',
+'api-error-missingresult' => "Interne Feeler: et konnt net festgestallt ginn ob d'Kopie eppes ginn ass.",
+'api-error-mustbeloggedin' => 'Dir musst ageloggt si fir Fichieren eropzelueden.',
+'api-error-mustbeposted' => 'An dëser Software ass e Feeler; se benotzt net déi richteg HTTP-Method.',
+'api-error-noimageinfo' => "D'Eroplueden huet fonctionnéiert, awer de Server huet eis keng Informatiounen iwwer de Fichier ginn.",
+'api-error-nomodule' => "Interne Feeler: de Modul fir d'Eroplueden ass net agestallt.",
+'api-error-ok-but-empty' => 'Interne Feeler: keng Äntwert vum Server.',
+'api-error-overwrite' => "D'Iwwerschreiwe vun engem Fichier ass net erlaabt.",
+'api-error-stashfailed' => 'Interne Feeler: de Server konnt den temporäre Fichier net späicheren.',
+'api-error-timeout' => 'De Server huet net bannen där Zäit geäntwert déi virgesinn ass.',
+'api-error-unclassified' => 'En onbekannte Feeler ass geschitt',
+'api-error-unknown-code' => 'Onbekannte Feeler: "$1"',
+'api-error-unknown-error' => 'Interne Feeler: beim Versuch fir Äre Fichier eropzelueden ass eppes schif gaang',
+'api-error-unknown-warning' => 'Onbekannte Warnung: $1',
+'api-error-unknownerror' => 'Onbekannte Feeler: "$1".',
+'api-error-uploaddisabled' => "D'Eroplueden ass op dëser Wiki ausgeschalt.",
+'api-error-verification-error' => 'Dëse Fichier kéint korrupt sinn, oder en huet eng falsch Erweiderung.',
+
);
diff --git a/languages/messages/MessagesLbe.php b/languages/messages/MessagesLbe.php
index c72fc1bb..abc9e2c6 100644
--- a/languages/messages/MessagesLbe.php
+++ b/languages/messages/MessagesLbe.php
@@ -39,6 +39,9 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑлиÑÑÑа_ихтилат',
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$linkTrail = '/^([a-zабвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑÓ€1“»]+)(.*)$/sDu';
$messages = array(
diff --git a/languages/messages/MessagesLez.php b/languages/messages/MessagesLez.php
index e13267c1..cc0d9467 100644
--- a/languages/messages/MessagesLez.php
+++ b/languages/messages/MessagesLez.php
@@ -14,6 +14,8 @@
* @author Reedy
*/
+$fallback = 'ru';
+
$messages = array(
# User preference toggles
'tog-underline' => 'ЭлÑчIунрин кIаникай цIар чIугун',
@@ -271,7 +273,6 @@ $messages = array(
'badtitle' => 'Ииже текъвер тIвар',
'badtitletext' => 'ТIалабзавай ччин Ñ Ð²Ð¸Ñ‡ÐµÐ» амал алачир Ñ, Ñ Ð¸Ñ‡Iи Ñ, ва Ñ Ñ‡Iаларарадин ва Ñ Ð²Ð¸ÐºÐ¸Ð°Ñ€Ð°Ð´Ð¸Ð½ кьилин цlарар чlурукlа къалурнава. Мумкин Ñ, кьилин цlарара Ñад ва Ñ Ð°Ð´Ð°Ð»Ð°Ð¹ гзаф рехъ гун виже текъвер Ñимволар кардик кутунвайди Ñ.',
'viewsource' => 'Килигун',
-'viewsourcefor' => 'идаз $1',
# Virus scanner
'virus-unknownscanner' => 'Малумтушир антивируÑ',
@@ -405,15 +406,10 @@ $messages = array(
'revdelete-radio-set' => 'Эхь',
'revdelete-radio-unset' => 'Ваъ',
'revdelete-log' => 'Кар',
-'revdelete-logentry' => 'Дегишарна акунвал "[[$1]]"',
'revdel-restore' => 'Ðквадайвал дегишарун',
'revdel-restore-deleted' => 'Ðлуднавай жуьреÑÑ€',
'revdel-restore-visible' => 'Ðквадай дегишвилер',
'pagehist' => 'Ччинин тарих',
-'revdelete-content' => 'Къйеда',
-'revdelete-uname' => 'ишлемишчидин тIар',
-'revdelete-hid' => 'чуьнуьх авунай $1',
-'revdelete-log-message' => '$1 идай $2 {{PLURAL:$2|Жуьре|ЖуьреÑÑ€}}',
'revdelete-edit-reasonlist' => 'Ðлудунин Ñебебар дуьзар хъувун',
'revdelete-offender' => 'Ðвтордин жуьре:',
@@ -512,6 +508,8 @@ $messages = array(
'prefs-watchlist-token' => 'Гуьзетунин ÑиÑгьдин лишан',
'prefs-misc' => 'Муькуь низамарунар',
'prefs-resetpass' => 'Парол дегишарун',
+'prefs-changeemail' => 'Э-почта дегишарун',
+'prefs-setemail' => 'Э-почта Ñцигна туькIуьрун',
'prefs-email' => 'E-mail туькlуьрунин кьадарар',
'prefs-rendering' => 'КЪецепатан акунар',
'saveprefs' => 'Хуьн',
@@ -676,7 +674,7 @@ $messages = array(
'prefixindex' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð³Ð°Ð»Ð°Ð¹ вири ччинар',
'shortpages' => 'Куьруь хъувун',
'longpages' => 'Яргъи хъувун',
-'usercreated' => 'И чIава туькlуьрнава: $1 $2',
+'usercreated' => '{{GENDER:$3|Created}} идав $1 идал $2',
'newpages' => 'ЦIийи ччинар',
'move' => 'ТIвар Ñхцигун',
'movethispage' => 'Юзун и хъувун',
@@ -710,8 +708,7 @@ $messages = array(
'linksearch-line' => '$2-ай $1-аз ÑлÑчlун',
# Special:Log/newusers
-'newuserlogpage' => 'Иштиракчийрин туькlуьрунин журнал',
-'newuserlog-create-entry' => 'ЦIийи ишлемишчидин чин',
+'newuserlogpage' => 'Иштиракчийрин туькlуьрунин журнал',
# Special:ListGroupRights
'listgrouprights-members' => '(уьзвийрин ÑиÑгь)',
@@ -744,7 +741,6 @@ $messages = array(
'actioncomplete' => 'Кар авунва',
'actionfailed' => 'Кар йиз алакьнавач',
'deletedtext' => '"$1" чlурнайтир. Килиг $2 Ñхиримжи чlурунар ахтармишун.',
-'deletedarticle' => 'къакъудун "[[$1]]"',
'dellogpage' => 'Ðлудунин журнал',
'deletecomment' => 'Кар',
'deleteotherreason' => 'МаÑÑа/ ва мад кар',
@@ -782,7 +778,6 @@ $messages = array(
'undeletelink' => 'Килигун/гуьнгуьна хтун',
'undeleteviewlink' => 'Килигун',
'undeletecomment' => 'Кар',
-'undeletedarticle' => 'Туькlуьр хъувуна "[[$1]]"',
'undelete-show-file-submit' => 'Э',
# Namespace form on various pages
@@ -864,8 +859,6 @@ $messages = array(
'talkexists' => "'''Чарчин тlар дегишарна, чарчин ихтилатар дегишар жезатуш, вучиз лагьайтlа ихтилатар цlийи чарчел фена.Галкlура гълелди.'''",
'movedto' => 'хтана иниз',
'movetalk' => 'Югъун,галкlана рахун',
-'1movedto2' => 'хъфена [[$1]] идал [[$2]]',
-'1movedto2_redir' => 'къфена [[$1]] идаз [[$2]] ракъурунар',
'movelogpage' => 'Тlвар Ñхцигунрин журнал',
'movereason' => 'Фагьум:',
'revertmove' => 'Рахкъурун',
@@ -942,17 +935,13 @@ $messages = array(
'tooltip-undo' => '«ГЬич авун» авунвай дуьзар хъувун paxкурзава ва Ñифтедин килигунин режимда дуьзар хъувундин форма ахъа йийзва. Им нетижадиз Ñебеб алава йийз мумкинвал гузва',
'tooltip-summary' => 'Куьруь нетижа гьадрун',
-# Patrol log
-'patrol-log-line' => 'кхьена $1 идай $2 ахтармишнава $3',
-'patrol-log-diff' => 'жуьре $1',
-
# Browsing diffs
'previousdiff' => 'Вилик алатай дуьзар хъувун',
'nextdiff' => 'ЦIийи дегишунар',
# Media information
'file-info-size' => '$1 × $2 пикÑелар, файлдин кьадар: $3, MIME жуьре: $4',
-'file-nohires' => '<small>Чlехи ахъаюн авай жуьре авач.</small>',
+'file-nohires' => 'Идалайни Ñ…ÑŠÑан ери авайд туш',
'svg-long-desc' => 'SVG файл, номилдаказ $1 $2 × пикÑелÑÑ€, файлдин кьадар: $3',
'show-big-image' => 'Мадни Ñ…ÑŠÑан еридин шикил',
diff --git a/languages/messages/MessagesLfn.php b/languages/messages/MessagesLfn.php
index 1a1b03b6..9f736166 100644
--- a/languages/messages/MessagesLfn.php
+++ b/languages/messages/MessagesLfn.php
@@ -272,7 +272,6 @@ $messages = array(
'badtitle' => 'Titulo es mal',
'badtitletext' => 'La titulo de la paje tu ia desira ia es nonlegal, es vacua, o es un titulo intervici o interlingual no liada coreta. Es posable ce es un o plu simboles ce no pote es usada en titulos.',
'viewsource' => 'Vide la orijin',
-'viewsourcefor' => 'per $1',
'viewsourcetext' => 'Tu pote vide e copia la orijin de esta paje:',
# Login and logout pages
@@ -704,7 +703,6 @@ Si tu vole sutrae la paje de tu lista de pajes oservada en la futur, clica a \"n
'actioncomplete' => 'Ata completada',
'deletedtext' => '"$1" ia es sutraeda.
Vide $2 per un catalogo de sutraes resente.',
-'deletedarticle' => 'sutraeda "[[$1]]"',
'dellogpage' => 'catalogo de sutraes',
'deletecomment' => 'Razona:',
'deleteotherreason' => 'Otra/plu razona:',
@@ -827,8 +825,6 @@ En esta casos, tu va nesesa move o fusa la paje per mano, si desirada.",
'talkexists' => "'''La paje se mesma ia es moveda, ma la paje de discutes no pote es moveda, per ce un esiste ja a la titulo nova. Per favore, fusa los per mano'''",
'movedto' => 'moveda a',
'movetalk' => 'Move la paje de discutes ance',
-'1movedto2' => '[[$1]] es moveda a [[$2]]',
-'1movedto2_redir' => '[[$1]] es moveda a [[$2]] tra redirije',
'movelogpage' => 'Move arcive',
'movelogpagetext' => 'A su es un lista de pajes moveda',
'movereason' => 'Razona:',
@@ -904,7 +900,7 @@ En esta casos, tu va nesesa move o fusa la paje per mano, si desirada.",
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|paje|pajes}}',
'file-info-size' => '$1 × $2 pixel, grandia de fix: $3, MIME tipo: $4',
-'file-nohires' => '<small>No plu densia posable.</small>',
+'file-nohires' => 'No plu densia posable.',
'svg-long-desc' => 'SVG fix, per nom $1 × $2 pixeles, grandia de fix: $3',
'show-big-image' => 'Densia masima',
diff --git a/languages/messages/MessagesLg.php b/languages/messages/MessagesLg.php
index 18c1249e..6c61d265 100644
--- a/languages/messages/MessagesLg.php
+++ b/languages/messages/MessagesLg.php
@@ -367,15 +367,14 @@ Kisoboka nti waliwo eyakwesoose.',
'badtitle' => 'Buzibu ku linnya lya lupapula',
'badtitletext' => "Onoonyezza erinnya ly'olupapula eritakkirizibwa, oba ery'olupapula olwereere, oba ery'oluli ku wiki endala nga teruyungidwa ku eno obulungi.<br />
Erinnya eryo liyinza ate okubaamu ennukuta oba obubonero ebitakkirizibwa mu mannya ga mpapula.",
-'perfcached' => "Data eddako wano eva mu ggwanika zzibizi era eyinz'obutatuukana n'eyennono.",
-'perfcachedts' => "Data eddako wano eva mu ggwanika zzibizi, yasemba okutuukanizibwa n'ey'ennono ku saawa $3, nga $2.",
+'perfcached' => "Data eddako wano eva mu ggwanika zzibizi era eyinz'obutatuukana n'eyennono. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "Data eddako wano eva mu ggwanika zzibizi, yasemba okutuukanizibwa n'ey'ennono ku saawa $3, nga $2. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Ku ssaawa eno olupapula luno terukkiriza kukyusibwamu.<br />
Data eruliko ejjakugira nga tekyuka.',
'wrong_wfQuery_params' => 'wfQuery() kirimu paramita ensobu zino<br />
Mukolo: $1<br />
Ekiragiro ekinoonyeza mu ggwanika lya data: $2',
'viewsource' => "Kebera obulambike obw'ennono obw'olupapula luno",
-'viewsourcefor' => 'obwa $1',
'actionthrottled' => 'Ekikolwa kigaanidwa',
'actionthrottledtext' => "Okulwanyisa abasindika obubaka kiyaaye, twateekawo ekkomo ery'emirundi omuntu gy'ayinza okukola ekikolwa ekyo.<br />
Gwe olituuseeko.<br />
@@ -604,9 +603,6 @@ Ekya 'Memba ono musindikire e-mail' toosobole okukikozesa okugyako nga mu [[Spec
Kakano endagiriro eya 'IP' gy'oliko eri $3, yo ennamba eya natti gyebakusibye eri #$5.<br />
Gw'ogenda okwogera naye ku natti mutegeeze ensonga zonna ezinnyonyodwa wano.",
'blockednoreason' => 'tebawadde ensonga',
-'blockedoriginalsource' => "Ensibuko ya '''$1''' eragidwa wano awaddako:",
-'blockededitsource' => "Ebigambo ebya '''by'okyusizza''' ku '''$1''' biragidwa wano awaddako:",
-'whitelistedittitle' => 'Okukyusa ku bino, wetaaga okuba nga oyingidde',
'whitelistedittext' => '$1 olyoke osobole okukyusa ku mpapula.',
'confirmedittext' => "Kyetaagisa osooke okutukakasiza E-mail yo olyoke okkirizibwe okukyusa mu mpapula.<br />
Endagiriro yo eya E-mail osobola okugitutegeeza n'okugitukakasiza ku lupapula lwo olwa '[[Special:Preferences|Enteekateeka yange]]'.",
@@ -797,13 +793,11 @@ oba ku gano agali ku lupapula luno.<br />
'history-feed-item-nocomment' => 'Bya $1, nga $2',
# Revision deletion
-'rev-delundel' => 'laga/kisa',
-'rev-showdeleted' => 'laga',
-'revdelete-log' => 'Nsonga:',
-'revdel-restore' => "tegeka ebiba biragibwa n'ebikisibwa",
-'pagehist' => "Ennanda y'olupapula luno",
-'revdelete-content' => 'ebirimu',
-'revdelete-uname' => "ery'obwa memba",
+'rev-delundel' => 'laga/kisa',
+'rev-showdeleted' => 'laga',
+'revdelete-log' => 'Nsonga:',
+'revdel-restore' => "tegeka ebiba biragibwa n'ebikisibwa",
+'pagehist' => "Ennanda y'olupapula luno",
# Merge log
'revertmerge' => 'Yawula ebigattidwa',
@@ -1031,8 +1025,7 @@ W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipedi
'linksearch-ok' => 'Noonya',
# Special:Log/newusers
-'newuserlogpage' => "Olukalala olw'ebifudeyo mu kukolawo akawunti empya",
-'newuserlog-create-entry' => 'Akawunti empya',
+'newuserlogpage' => "Olukalala olw'ebifudeyo mu kukolawo akawunti empya",
# Special:ListGroupRights
'listgrouprights-members' => '(lukalala lwa bamemba)',
@@ -1071,7 +1064,6 @@ Kakasa nti kino ky'oyagala, era nti otegeera bye kinaaleetawo, era nti kikkirizi
'deletedtext' => 'Olupapula "$1" lugyidwawo.
Kebera olukalala $2 okumanya ebifa ku byakagyibwawo.',
-'deletedarticle' => 'olupapula olwa "[[$1]]" lugyidwawo',
'dellogpage' => 'Ebigyidwawo',
'deletecomment' => 'Nsonga:',
'deleteotherreason' => 'Nsonga ndala:',
@@ -1118,7 +1110,6 @@ Oyinz'okukyusa okusibibwa kw'olupapula luno, naye tekijjakukyusa ebikugizo ebivu
'undeletebtn' => 'Luzzewo',
'undeletelink' => 'lukebere/luzzewo',
'undeletecomment' => 'Nsonga:',
-'undeletedarticle' => '"[[$1]]" luzzidwawo',
'undelete-search-submit' => 'Noonya',
# Namespace form on various pages
@@ -1211,8 +1202,6 @@ Londayo eddala.',
Yogera nange gwe olina okugyegattira ku eyo esangidwawo.'''",
'movedto' => 'kati lutumidwa',
'movetalk' => "N'olupapula olwa yogera nange lwakwo lusimbulize",
-'1movedto2' => 'olupapula [[$1]] lukyusidwa luyitibwe [[$2]]',
-'1movedto2_redir' => 'olupapula [[$1]] kati lukutwalabutwazi ku [[$2]], ebyalulingako kaakano gye bisangibwa',
'movelogpage' => 'Ebikyusidwa manya',
'movereason' => 'Nsonga:',
'revertmove' => 'zaawo erinya ekkadde',
@@ -1309,7 +1298,7 @@ Ob'oyagala okuyamba ku kuvvuunula eby'omu MediaWiki yonna, kebera ku [//www.medi
# Media information
'file-info-size' => 'pikseli $1 ku $2 , bunene bwa fayiro: $3, kika kya MIME: $4',
-'file-nohires' => '<small>Tewali kisingako wano.</small>',
+'file-nohires' => 'Tewali kisingako wano.',
'svg-long-desc' => 'Fayiro ya kika kya SVG, ya pikselo $1 ku $2 awamu, ya obunene bwa: $3',
'show-big-image' => 'Laga ekifaananyi ekijjuvu',
diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php
index 47ea91e7..ecd01923 100644
--- a/languages/messages/MessagesLi.php
+++ b/languages/messages/MessagesLi.php
@@ -514,20 +514,22 @@ Maak hievan melding bie 'ne [[Special:ListUsers/sysop|systeembeheerder]] van {{S
'badarticleerror' => 'Dees hanjeling kan neet waere oetgeveurd op dees pagina.',
'cannotdelete' => 'Kós de pagina of \'t besjtand "$1" neet ewegsjaffe.
Mesjiens haet emes angers det al gedaon.',
+'cannotdelete-title' => 'Pagina "$1" kin neet gewösj waere',
'badtitle' => 'Óngeljige paginatitel',
'badtitletext' => 'De opgevraogde pagina is neet besjikbaar of laeg.',
-'perfcached' => "De gegaeves koume oet 'n cache en zeen mäögelik neet actueel:",
-'perfcachedts' => "De getuunde gegaeves komme oet 'n cache en zeen veur 't letst biejgewèrk op $1.",
+'perfcached' => "De gegaeves koume oet 'n cache en zeen mäögelik neet actueel. 't Geuf {{PLURAL:$1|maximaal ei rizzeltaot|maximaal $1 rizzeltaote}} inne cache.",
+'perfcachedts' => "De getuunde gegaeves komme oet 'n cache en zeen veur 't letst biejgewèrk op $1. Maximaal guuef 't {{PLURAL:$4|ei rizzeltaot|$4 rizzeltaote}} inne cache.",
'querypage-no-updates' => "Deze pagina kin op 't memènt neet biegewirk waere. Deze gegaeves waere neet verfrisj.",
'wrong_wfQuery_params' => 'Verkeerde paramaeters veur wfQuery()<br />
Funksie: $1<br />
Query: $2',
'viewsource' => 'Bekiek brónteks',
-'viewsourcefor' => 'van $1',
+'viewsource-title' => 'Bekiek brón van $1',
'actionthrottled' => 'Hanjeling taengegehauwe',
'actionthrottledtext' => "Es maotregel taege spam is 't aantal keer per tiedseinheid dets te dees hanjeling kèns verrichte beperk. De höbs de limiet euversjreje. Perbeer 't euver 'n aantal minute obbenuuj.",
'protectedpagetext' => 'Dees pagina is beveilig. Bewirke is neet meugelik.',
'viewsourcetext' => 'De kèns de brónteks van dees pagina bekieke en kopiëre:',
+'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)',
@@ -623,6 +625,7 @@ e-mail óntvange veur alle volgende toepassinge.',
'noemailprefs' => "Gaef 'n e-mailadres op om deze functies te gebroeke.",
'emailconfirmlink' => 'Bevèstig dien e-mailadres',
'invalidemailaddress' => "'t E-mailadres is neet geaccepteerd omdet 't 'n ongeldige opmaak haet. Gaef a.u.b. 'n geldig e-mailadres op of laot 't veld laeg.",
+'cannotchangeemail' => 'E-mailadresse kinne neet waere verangerdj óp deze wiki.',
'accountcreated' => 'Gebroeker aangemaak',
'accountcreatedtext' => 'De gebroeker $1 is aangemaak.',
'createaccount-title' => 'Gebroekers aanmake veur {{SITENAME}}',
@@ -639,6 +642,7 @@ Doe mós effe wachte ierdets te 't obbenuuts kens perbere.",
# E-mail sending
'php-mail-error-unknown' => "Dao haet ziech 'n ónbekénde fout veurgedaon in de mail()-functie van PHP",
+'user-mail-no-addy' => "Perbeerdjes 'ne mail te sjikke zónger 'n adres",
# Change password dialog
'resetpass' => 'Wachwaord obbenuuts insjtèlle',
@@ -658,32 +662,47 @@ Meugelik höbs doe dien wachwaord al gewiezig of 'n nuuj tiedelik wachwaord aang
'resetpass-temp-password' => 'Tiedelik wachwaord:',
# 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-email' => 'E-mailadres:',
-'passwordreset-emailtitle' => 'Gebroekersgegaeves óp {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Emes, wersjienlik doe, vanaaf 't IP-adres $1, haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.
+'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?',
+'passwordreset-capture-help' => "Es se dit vekske aanvènks, weurt d'n e-mail (mit e tiedelik wachwaord) nao de gebroek gesjik en ouch aan dich getuind.",
+'passwordreset-email' => 'E-mailadres:',
+'passwordreset-emailtitle' => 'Gebroekersgegaeves óp {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Emes, wersjienlik doe, vanaaf 't IP-adres $1, haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.
De volgende {{PLURAL:$3|gebroeker is|gebroekers zint}} gekoppeld aan dit e-mailadres:
$2
{{PLURAL:$3|Dit tiedelik wachwaord vervilt|Dees tiedelike wachweurd vervallen}} euver {{PLURAL:$5|einen daag|$5 daag}}.
Mel dich aan en veranger 't wachwaord noe. Es se dit verzeuk neet zelf hes gedaon, of es se 't oorspronkelik wachwaord nog kins en 't neet anges wils, laot dit berich den en blief dien aad wachwaord gebroeke.",
-'passwordreset-emailtext-user' => "Gebroeker $1 op de site {{SITENAME}} haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.
+'passwordreset-emailtext-user' => "Gebroeker $1 op de site {{SITENAME}} haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.
De volgende {{PLURAL:$3|gebroeker is|gebroekers zint}} gekoppeld aan dit e-mailadres:
$2
{{PLURAL:$3|Dit tiedelik wachwaord vervilt|Dees tiedelike wachweurd vervallen}} euver {{PLURAL:$5|einen daag|$5 daag}}.
Mel dich aan en veranger 't wachwaord noe. Es se dit verzeuk neet zelf hes gedaon, of es se 't oorspronkelik wachwaord nog kins en 't neet anges wils, laot dit berich den en blief dien aad wachwaord gebroeke.",
-'passwordreset-emailelement' => 'Gebroekersnaam: $1
+'passwordreset-emailelement' => 'Gebroekersnaam: $1
Tiedelik wachwaord: $2',
-'passwordreset-emailsent' => "d'r Is per mail 'n herinnering versjik.",
+'passwordreset-emailsent' => "d'r Is per mail 'n herinnering versjik.",
+'passwordreset-emailsent-capture' => "d'r Is 'ne herinneringse-mail versjik. Deze weurt hieónger getuind.",
+'passwordreset-emailerror-capture' => "d'r Is 'ne herinneringse-mail aangemaak. Deze weurt hieónger getuind. 't Verzènje nao de gebroeker is mislök óm de volgende raeje: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Veranger dien e-mailadres',
+'changeemail-header' => "Veranger 't e-mailadres van miene gebroekersnaam",
+'changeemail-text' => 'Völ dit form in óm dien e-mailadres te verangere. Doe mós dien wachwaord inveuren óm dees veranger te bevestige.',
+'changeemail-no-info' => 'Doe moos aangemeld zien ierdets doe dees pagina gebroeke kens.',
+'changeemail-oldemail' => 'Hujig mailadres:',
+'changeemail-newemail' => 'Nuuj mailadres:',
+'changeemail-none' => '(gein)',
+'changeemail-submit' => 'Veranger e-mail',
+'changeemail-cancel' => 'Braek aaf',
# Edit page toolbar
'bold_sample' => 'Vètten teks',
@@ -747,9 +766,6 @@ Doe kins deze blokkaasj bespraeke mèt $1 of 'ne angere [[{{MediaWiki:Grouppage-
Dien nömmer vanne blokkaasj is #$5 èn dien IP-adres is $3.
Vermeld det esse örges euver deze blokkaasj reageers.",
'blockednoreason' => 'geine ree opgegaeve',
-'blockedoriginalsource' => "Hiej onger stuit de bronteks van '''$1''':",
-'blockededitsource' => "Hiej onger stuit de teks van '''dien bewèrkinge''' aan '''$1''':",
-'whitelistedittitle' => 'Geer mót óch inlogke óm te bewirke',
'whitelistedittext' => 'Geer mót uch $1 óm pajzená te bewirke.',
'confirmedittext' => "De mós dien e-mailadres bevestige veurdats te kèns bewirke.
Veur dien e-mailadres in en bevestig 'm bie [[Special:Preferences|dien veurkäöre]].",
@@ -829,8 +845,7 @@ De mós dien eige verangeringe dao-in inpasse.
'copyrightwarning2' => "Mèrk op dat alle biedrages aan {{SITENAME}} kinne weure verangerd, aangepas of weggehaold door anger luuj. As te neet wils dat dienen tèks zoemer kint weure aangepas mós te 't hie neet plaatsje.<br />
De beluifs ós ouch dats te dezen tèks zelf höbs gesjreve, of gekopieerd van 'n brón in 't publiek domein of get vergliekbaars (zuug $1 veur details).
'''HIE GEIN AUTEURSRECHTELIK BESJIRMP WERK ZÓNGER TOESJTUMMING!'''",
-'longpageerror' => "'''ERROR: De teks diese höbs toegevoegd haet is $1 kilobyte
-groot, wat groter is dan 't maximum van $2 kilobyte. Opslaon is neet meugelik.'''",
+'longpageerror' => "Fout: De teks diese höbs toegevoegd haet is {{PLURAL:$1|'ne kilobyte|$1 kilobyte}} groet, wat groeter is es 't maximum van {{PLURAL:$2|'ne kilobyte|$2 kilobyte}}. Opslaon is neet meugelik.'''",
'readonlywarning' => "WAARSJUWING: De database is vasgezèt veur ongerhoud, dus op 't mement kins e dien verangeringe neet opsjlaon. De kins dien tèks 't biste opsjlaon in 'n tèksbesjtand om 't later hie nog es te prebere.
t Is geslaote waenger: $1",
@@ -996,8 +1011,6 @@ Anger beheerders van {{SITENAME}} kinne de verborge inhoud benäöjere en de ver
'revdelete-unsuppress' => 'Verwijder beperkinge op truuk gezatte wieziginge',
'revdelete-log' => 'Reeje:',
'revdelete-submit' => 'Pas toe op de geselecteerde {{PLURAL:$1|bewèrking|bewèrkinger}}',
-'revdelete-logentry' => 'zichbaarheid van bewerkinge is gewiezig veur [[$1]]',
-'logdelete-logentry' => 'gewiezigde zichbaarheid van gebeurtenis [[$1]]',
'revdelete-success' => "'''Wieziging zichbaarheid succesvol ingesteld.'''",
'revdelete-failure' => "'''De zichbaarheid veur de versie kos neet ingesteld waere.'''
$1",
@@ -1009,15 +1022,6 @@ $1",
'revdel-restore-visible' => 'zichber versies',
'pagehist' => 'Paginagesjiedenis',
'deletedhist' => 'Verwiederde gesjiedenis',
-'revdelete-content' => 'inhoud',
-'revdelete-summary' => 'samevatting bewerke',
-'revdelete-uname' => 'gebroekersnaam',
-'revdelete-restricted' => 'haet beperkinge aan beheerders opgelag',
-'revdelete-unrestricted' => 'haet beperkinge veur beheerders opgehaeve',
-'revdelete-hid' => 'haet $1 verborge',
-'revdelete-unhid' => 'haet $1 zichbaar gemaak',
-'revdelete-log-message' => '$1 veur $2 {{PLURAL:$2|versie|versies}}',
-'logdelete-log-message' => '$1 veur $2 {{PLURAL:$2|logbookregel|logbookregels}}',
'revdelete-hide-current' => "dr Is 'n fout opgetraoje bie 't verberge van 't objek van $1 óm $2 oer: dit is de hudige versie.
Dees versie kan neet verbórge waere.",
'revdelete-show-no-access' => 'dr Is \'n fout opgetraoje bie \'t weergaeve van \'t objek van $1 óm $2 oer: dit objek is gemarkeerdj es "besjermp".
@@ -1177,12 +1181,14 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
'prefs-rc' => 'Recènte verangeringe en weergaaf van sjtumpkes',
'prefs-watchlist' => 'Volglies',
'prefs-watchlist-days' => 'Te tuine daag in de volglies:',
-'prefs-watchlist-days-max' => 'Maximaal 7 daag',
+'prefs-watchlist-days-max' => 'Maximaal $1 {{PLURAL:$1|daag|daag}}',
'prefs-watchlist-edits' => 'Maximaal aantal bewirkinge in de oetgebreide volglies:',
'prefs-watchlist-edits-max' => 'Maximaal aantal: 1000',
'prefs-watchlist-token' => 'Volgliessläötel:',
'prefs-misc' => 'Anger insjtèllinge',
'prefs-resetpass' => 'Wachwaord wiezige',
+'prefs-changeemail' => 'Veranger e-mail',
+'prefs-setemail' => "Stel 'n e-mailadres in",
'prefs-email' => 'E-mailopsjes',
'prefs-rendering' => 'Oeterlik',
'saveprefs' => 'Veurkäöre opsjlaon',
@@ -1242,6 +1248,7 @@ Dees hanjeling kin neet ongedaon gemaak waere.',
'yourrealname' => 'Dienen echte naam*',
'yourlanguage' => 'Taal van de gebroekersinterface',
'yourvariant' => 'Sjpraokvariantj veur inhawd:',
+'prefs-help-variant' => "Dien veurkäörsvariante of -spelling óm de inhawdspagina's van dizze wiki in te tuine.",
'yournick' => "Diene bienaam (veur ''handjteikeninge'')",
'prefs-help-signature' => 'Reacties op de euverlèkpagina\'s waere meistal ongerteikend mit "<nowiki>~~~~</nowiki>".
De tildes waeren omgezat in dien handjteikening en nen datum en tied van de bewirking.',
@@ -1283,7 +1290,7 @@ Deze informatie is zichbaar veur angere gebroekers.',
'userrights-lookup-user' => 'Beheer gebroekersgróppe',
'userrights-user-editname' => "Veur 'ne gebroekersnaam in:",
'editusergroup' => 'Bewirk gebroekersgróppe',
-'editinguser' => "Bezig mit bewèrke van 't gebroekersrech van '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Bezig mit 't bewèrke van de gebroekersrechte van gebroeker '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Bewirk gebroekersgróppe',
'saveusergroups' => 'Gebroekersgróppe opsjlaon',
'userrights-groupsmember' => 'Leed van:',
@@ -1377,13 +1384,13 @@ Deze informatie is zichbaar veur angere gebroekers.',
'right-autopatrol' => 'Bewerkinge waere automatisch es gecontroleerd gemarkeerd',
'right-patrolmarks' => 'Kontraolteikes in recènte verangeringe bekieke.',
'right-unwatchedpages' => "'n lies mit pagina's die neet op 'n volglies staon bekieke",
-'right-trackback' => "'n trackback opgeve",
'right-mergehistory' => "De gesjiedenis van pagina's samevoege",
'right-userrights' => 'Alle gebroekersrechte bewerke',
'right-userrights-interwiki' => "Gebroekersrechte van gebroekers in angere wiki's wijzige",
'right-siteadmin' => 'De database blokkere en weer vriegaeve',
'right-override-export-depth' => "Export paazjes midin geslinkdje paazjes mit 'n deepdje ven 5",
'right-sendemail' => 'Versjik e-mail aan anger gebroekers',
+'right-passwordreset' => 'Bekiek e-mails van ópnuuj ingestèldje wachwäörd',
# User rights log
'rightslog' => 'Gebroekersrechtelogbook',
@@ -1417,16 +1424,17 @@ Deze informatie is zichbaar veur angere gebroekers.',
'action-suppressionlog' => 'dit besjirmp logbook betrachte',
'action-block' => "deze gebroeker 'n bewirkingsblokkaad op lèkge",
'action-protect' => "'t beveiligingsniveau van dees pagina aan passe",
+'action-rollback' => 'drej bewèrkinge vanne lèste bewèrkendje gebroeker snel trögk',
'action-import' => "dees pagina van 'n angere wiki importere",
'action-importupload' => "dees pagina van 'n besjtandsupload importere",
'action-patrol' => 'bewerkinge van angere es gecontroleerd te markere',
'action-autopatrol' => 'eige bewerkinge as gecontroleerd te laote markere',
'action-unwatchedpages' => "de lies met pagina's die neet op 'n volglies staon te bekieke",
-'action-trackback' => 'ne trackback op te gaeve',
'action-mergehistory' => 'de gesjiedenis van deze pagina same te voge',
'action-userrights' => 'alle gebroekersrechte te bewerke',
'action-userrights-interwiki' => "gebroekersrechte van gebroekers van anger wiki's te bewerke",
'action-siteadmin' => 'de database aaf te sloete of aope te stelle',
+'action-sendemail' => 'Sjik e-mails',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|bewerking|bewerkinge}}',
@@ -1458,6 +1466,7 @@ Deze informatie is zichbaar veur angere gebroekers.',
'number_of_watching_users_pageview' => "[$1 {{PLURAL:$1|keer|keer}} op 'ne volglies]",
'rc_categories' => 'Beperk tot allein categorieë (sjeij mit \'n "|")',
'rc_categories_any' => 'Iddere',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} nao verangering',
'newsectionsummary' => '/* $1 */ nuje subkop',
'rc-enhanced-expand' => 'Details weergaeve (JavaScript verplich)',
'rc-enhanced-hide' => 'Details verberge',
@@ -1513,6 +1522,7 @@ De lètste link is bedoeld veur mediabesjtande die gein plaetje zeen.",
'ignorewarnings' => 'Negeer alle waarsjuwinge',
'minlength1' => 'Bestandsname mòtte minstes éine letter bevatte.',
'illegalfilename' => 'De bestandjsnaam "$1" bevat ongeldige karakters. Gaef \'t bestandj \'ne angere naam, en probeer \'t dan opnuuj te uploade.',
+'filename-toolong' => 'Bestenj moge gein name höbbe die lenger zeen es 240 bytes.',
'badfilename' => 'De naom van \'t besjtand is verangerd in "$1".',
'filetype-mime-mismatch' => 'Extensie ".$1" kömp neet euverein mit \'t MIME-type van \'t bestandj ($2).',
'filetype-badmime' => '\'t Is neet toegestaon om bestenj van MIME type "$1" te uploade.',
@@ -1602,6 +1612,41 @@ Gank trök nao t [[Special:Upload/stash/$1|uploadformuleer]] om dit perbleem te
'upload-unknown-size' => 'Ónbekèndje gruuedje',
'upload-http-error' => 'dr Is n HTTP-fout opgetraoje: $1',
+# File backend
+'backend-fail-stream' => "'t Waes neet mäögelik 't besjtand $1 te streame.",
+'backend-fail-backup' => "'t Waes neet mäögeljk 'n reservekopie van 't besjtand $1 te make.",
+'backend-fail-notexists' => "'t Besjtand $1 besjteit neet.",
+'backend-fail-hashes' => "'t Waes neet mäögelik de hashes veur 't besjtand op te haole um ze te vergelieke.",
+'backend-fail-notsame' => "Dao besjteit al 'n neet-identiek besjtand op de plaats $1.",
+'backend-fail-invalidpath' => '$1 is gein geljig opslaagpad.',
+'backend-fail-delete' => 'Kós bestjand $1 neet ewegsjaffe.',
+'backend-fail-alreadyexists' => "'t Besjtand $1 besjteit al.",
+'backend-fail-store' => "'t Waes neet mäögelik 't besjtand $1 op te sloon op lokasie $2.",
+'backend-fail-copy' => 'Besjtand $1 kós neet nao $2 gekopieerd waere.',
+'backend-fail-move' => 'Besjtand $1 kós neet nao $2 verplaats waere.',
+'backend-fail-opentemp' => "'t Waes neet mäögelik 'n tiedelik besjtand te äöpene.",
+'backend-fail-writetemp' => "'t Waes neet mäögelik nao 'n tiedelik besjtand te sjrieve.",
+'backend-fail-closetemp' => "'t Waes neet mäögelik 'n tiedelik besjtand te sjlete.",
+'backend-fail-read' => 'Kós bestjand $1 neet laeze.',
+'backend-fail-create' => 'Kós bestjand $1 neet aanmake.',
+'backend-fail-readonly' => 'Vannen opslaag "$1" kin op dit memènt allein gelaeze waere. De opgegaeve raeje is: "$2"',
+'backend-fail-synced' => '\'t Bestandj "$1" bevindj zich in \'nen ónsamehangendje toestandj inne intern opslaagbackends.',
+'backend-fail-connect' => 'Kós de bestandjsbackend neet verbinje mitte opslaagbackend "$1".',
+'backend-fail-internal' => '\'n Ónbekèndje fout is ópgetaoje innen opslaagbackend "$1".',
+'backend-fail-contenttype' => 'Kós \'t inhawdtype van \'t bestnadj óm es "$1" op te slaon neet bepaole.',
+'backend-fail-batchsize' => 'Reiks van $1 {{PLURAL:$1|bestandjsoperatie|bestandjsoperaties}} in de opslaagbackend; de limiet is $2 {{PLURAL:$2|operatie|operaties}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kós "$1" neet vrijgaeve; \'t waes neet vergrendeld.',
+'lockmanager-fail-closelock' => 'Kós \'t vergrendelingsbesjtand veur "$1" neet sjlete.',
+'lockmanager-fail-deletelock' => 'Kós \'t vergrendelingsbesjtand veur "$1" neet ewegsjaffe.',
+'lockmanager-fail-acquirelock' => 'Kós "$1" neet vergrendele.',
+'lockmanager-fail-openlock' => 'Kós \'t vergrendelingsbesjtand veur "$1" neet äöpene.',
+'lockmanager-fail-releaselock' => 'Kós de vergrendeling veur "$1" neet opheffe.',
+'lockmanager-fail-db-bucket' => 'Kós neet in kontak kómme mit genóg vergrendelingsdatabases in de bucket $1.',
+'lockmanager-fail-db-release' => "'t Waar neet meugelik ómme vergrendeling veure database $1 óp tö höffe.",
+'lockmanager-fail-svr-release' => "'t Waar neet meugelik ómme vergrendeling veure server $1 óp tö höffe.",
+
# ZipDirectoryReader
'zip-file-open-error' => "d'r Woor 'n fout bie 't äöpene van 't bestandj veur ZIP-controle.",
'zip-wrong-format' => "'t Opgegaeve bestandj waar gein ZIP-bestandj.",
@@ -1618,6 +1663,7 @@ De veiligheid kin neet waere gekónterleerdj.",
'uploadstash-badtoken' => "Kin de hanjeling neet oetveure. Dit kump mesjien omdet dien bewèrkingsrefs verloupe zeen. Perbeer 't obbenuits.",
'uploadstash-errclear' => 'Wisse van bestandj mislök.',
'uploadstash-refresh' => 'Wèrk lies van bestenj bie',
+'invalid-chunk-offset' => 'Óngèljige chunckaafzatj',
# img_auth script messages
'img-auth-accessdenied' => 'Toegank geweigerd',
@@ -1723,23 +1769,24 @@ De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
'filerevert-badversion' => "d'r is geine vörge lokale versie van dit bestand mit 't opgegaeve tiejdstip.",
# File deletion
-'filedelete' => 'Wis $1',
-'filedelete-legend' => 'Wis bestand',
-'filedelete-intro' => "Doe bös '''[[Media:$1|$1]]''' aan 't wisse, mit al ieëder versies.",
-'filedelete-intro-old' => "Doe bös de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan 't wisse.",
-'filedelete-comment' => 'Reeje:',
-'filedelete-submit' => 'Wisse',
-'filedelete-success' => "'''$1''' is gewis.",
-'filedelete-success-old' => "De versie vae '''[[Media:$1|$1]]''' ven $3, $2 is gewis.</span>",
-'filedelete-nofile' => "'''$1''' besteit neet.",
-'filedelete-nofile-old' => "d'r is geine versie van '''$1''' in 't archief met de aangegaeve eigensjappe.",
-'filedelete-otherreason' => 'Angere/additionele ree:',
-'filedelete-reason-otherlist' => 'Angere ree',
-'filedelete-reason-dropdown' => '*Väölveurkómmende ree veur wisse
+'filedelete' => 'Wis $1',
+'filedelete-legend' => 'Wis bestand',
+'filedelete-intro' => "Doe bös '''[[Media:$1|$1]]''' aan 't wisse, mit al ieëder versies.",
+'filedelete-intro-old' => "Doe bös de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan 't wisse.",
+'filedelete-comment' => 'Reeje:',
+'filedelete-submit' => 'Wisse',
+'filedelete-success' => "'''$1''' is gewis.",
+'filedelete-success-old' => "De versie vae '''[[Media:$1|$1]]''' ven $3, $2 is gewis.</span>",
+'filedelete-nofile' => "'''$1''' besteit neet.",
+'filedelete-nofile-old' => "d'r is geine versie van '''$1''' in 't archief met de aangegaeve eigensjappe.",
+'filedelete-otherreason' => 'Angere/additionele ree:',
+'filedelete-reason-otherlist' => 'Angere ree',
+'filedelete-reason-dropdown' => '*Väölveurkómmende ree veur wisse
** Auteursrechsjenjing
** Duplicaatbestandj',
-'filedelete-edit-reasonlist' => 'Reeje veur verwiedering bewèrke',
-'filedelete-maintenance' => 'Verwiedere en trökplaatse is tiedelik neet meugelik waeges ongerhaadswerkzaamhede.',
+'filedelete-edit-reasonlist' => 'Reeje veur verwiedering bewèrke',
+'filedelete-maintenance' => 'Verwiedere en trökplaatse is tiedelik neet meugelik waeges ongerhaadswerkzaamhede.',
+'filedelete-maintenance-title' => 'Kin bestandj neet wösje',
# MIME search
'mimesearch' => 'Zeuk op MIME-type',
@@ -1837,6 +1884,8 @@ De pafina's zeen ouk neet as sjabloon opgenome.",
'wantedpages' => "Gewunsjde pazjena's",
'wantedpages-badtitle' => "Verkeerde titel in 't rizzeltaot gezatj: $1",
'wantedfiles' => 'Neet-bestaonde bestenj mit verwiezinge',
+'wantedfiletext-cat' => "De volgendje bestenj waere gebroek meh bestaon neet. Bestenj van extern repository's kinne zeen opgenómmen in de lies, óndanks det ze bestaon. Dergelik valsj positieve waere <del>doorgehaoldj waergaeve</del>. Pagina's die neet-bestaondje bestenj insloete staon op de pagina [[:$1]].",
+'wantedfiletext-nocat' => "De volgendje bestenj waere gebroek meh bestaon neet. Bestenj van extern repository's kinne zeen opgenómmen in de lies, óndanks det ze bestaon. Dergelik valsj positieve waere <del>doorgehaoldj waergaeve</del>.",
'wantedtemplates' => 'Neet-bestaonde sjablone mit verwiezinge',
'mostlinked' => "Meis gelinkde pazjena's",
'mostlinkedcategories' => 'Meis-gelinkde categorië',
@@ -1845,6 +1894,7 @@ De pafina's zeen ouk neet as sjabloon opgenome.",
'mostimages' => 'Meis gelinkde aafbeildinge',
'mostrevisions' => 'Artikele mit de meiste bewirkinge',
'prefixindex' => "Alle pagina's op veurvoegsel",
+'prefixindex-namespace' => "Alle pagina's mit 't veurvoogsel (naomruumdje $1)",
'shortpages' => 'Korte artikele',
'longpages' => 'Lang artikele',
'deadendpages' => "Doedloupende pazjena's",
@@ -1861,7 +1911,7 @@ De pafina's zeen ouk neet as sjabloon opgenome.",
'listusers-editsonly' => 'Allein gebroekers mit bewèrkinge weergaeve',
'listusers-creationsort' => 'Sortere op registratiedatum',
'usereditcount' => '$1 {{PLURAL:$1|bewèrking|bewèrkinge}}',
-'usercreated' => 'aangemaak óp $1 óm $2',
+'usercreated' => '{{GENDER:$3|aangemaak}} óp $1 óm $2',
'newpages' => "Nuuj pagina's",
'newpages-username' => 'Gebroekersnaam:',
'ancientpages' => 'Artikele die lank neet bewèrk zeen',
@@ -1955,12 +2005,8 @@ Haet mèndestes e toepleveldomein, wie beveurbeildj "*.org".<br />
'activeusers-noresult' => 'Gein gebroekers gevónje.',
# Special:Log/newusers
-'newuserlogpage' => 'Logbook nuuj gebroekers',
-'newuserlogpagetext' => 'Hiej ónger saton de nuuj ingesjreve gebroekers.',
-'newuserlog-byemail' => 'wachwaord is versjik per e-mail',
-'newuserlog-create-entry' => "is 'ne nuje gebroeker",
-'newuserlog-create2-entry' => 'haet de gebroeker $1 aangemaak',
-'newuserlog-autocreate-entry' => 'Gebroeker automatisch aangemaak',
+'newuserlogpage' => 'Logbook nuuj gebroekers',
+'newuserlogpagetext' => 'Hiej ónger saton de nuuj ingesjreve gebroekers.',
# Special:ListGroupRights
'listgrouprights' => 'Rechte van gebroekersgróppe',
@@ -1989,7 +2035,7 @@ Infermasie daoreuver èn de individueel rechter vinjs te [[{{MediaWiki:Listgroup
'emailpagetext' => "Es deze gebroeker e geljig e-mailadres haet opgegaeve den kint g'r via dit formuleer e berich sjikke. 't E-mailadres wat geer heet opgegeve bie eur [[Special:Preferences|veurkäöre]] zal es versjikker aangegaeve waere.
Dae kin dös drek reazjere.",
'usermailererror' => "Foutmeljing biej 't zenje:",
-'defemailsubject' => 'E-mail van {{SITENAME}}',
+'defemailsubject' => 'E-mail van {{SITENAME}}-gebroeker "$1"',
'usermaildisabled' => 'Gebroeker e-mail oetgezatj.',
'usermaildisabledtext' => 'Doe kèns geinen e-mail sjikke nao anger gebroekers op deze wiki',
'noemailtitle' => 'Gein e-mailadres bekènd veur deze gebroeker',
@@ -2043,7 +2089,7 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
'watchmethod-list' => "controlere van gevolgde pazjena's veur recènte verangeringe",
'watchlistcontains' => "Dien volglies bevat $1 {{PLURAL:$1|pazjena|pazjena's}}.",
'iteminvalidname' => "Probleem mit object '$1', ongeljige naam...",
-'wlnote' => "Hieonger {{PLURAL:$1|steit de lètste verangering|staon de lètste $1 verangeringe}} van {{PLURAL:$2|'t lètse oer|de lètste <b>$2</b> oer}}.",
+'wlnote' => "Hieónger {{PLURAL:$1|steit de lètste verangering|staon de lètste $1 verangeringe}} van {{PLURAL:$2|'t lètste oer|de lètste <b>$2</b> oer}} óp $3 óm $4.",
'wlshowlast' => 'Tuin lètste $1 ore $2 daag $3',
'watchlist-options' => 'Opties veur volglies',
@@ -2103,8 +2149,6 @@ Kónfermeer hiejónger dat dit inderdaod dien bedoeling is, dats doe de gevolge
'actioncomplete' => 'Actie voltoeid',
'actionfailed' => 'Hanjeling mislök',
'deletedtext' => '"$1" is eweggesjaf. Bekiek $2 veur \'n euverzich van recènt eweggesjafde pagina\'s.',
-'deletedarticle' => '"[[$1]]" is eweggesjaf',
-'suppressedarticle' => 'haet "[[$1]]" verborge',
'dellogpage' => 'Wislogbook',
'dellogpagetext' => "Hie volg 'n lies van de meis recènt eweggesjafde pagina's en besjtandje.",
'deletionlog' => 'Wislogbook',
@@ -2149,7 +2193,10 @@ Zuug de [[Special:ProtectedPages|lies mit beveiligde pazjena's]] veur alle hujig
'unprotectedarticle' => 'haet de besjerming van [[$1]] opgeheve',
'movedarticleprotection' => 'haet beveiligingsinstellinge verplaats van "[[$2]]" nao "[[$1]]"',
'protect-title' => 'Besjerme van "$1"',
+'protect-title-notallowed' => 'Bekiek \'t beveiligingsniveau veur "$1"',
'prot_1movedto2' => '[[$1]] verplaats nao [[$2]]',
+'protect-badnamespace-title' => 'Neet te beveilige naamruumdje',
+'protect-badnamespace-text' => "Pagina's in dees naamruumdje kinne neet beveilig waere.",
'protect-legend' => 'Bevèstig besjerme',
'protectcomment' => 'Reeje:',
'protectexpiry' => 'Verlöp:',
@@ -2170,6 +2217,7 @@ Dit zeen de hujige insjtellinge veur de pagina '''$1''':",
'protect-level-sysop' => 'Allein systeemwèrkers',
'protect-summary-cascade' => 'kaskaad',
'protect-expiring' => 'verlöp op $1',
+'protect-expiring-local' => 'verlöp $1',
'protect-expiry-indefinite' => 'verlöp neet',
'protect-cascade' => "Kaskaadbeveiliging - beveilig alle pagina's en sjablone die in dees pagina opgenómme zeen (let op: dit kin groete gevolge höbbe).",
'protect-cantedit' => "De kèns 't beveiligingsniveau van dees pagina neet verangere, ómdets te gein rech höbs 't te bewirke.",
@@ -2225,7 +2273,6 @@ Es d'r 'ne nuuj pagina mit dezelfde naam is aangemaak sins de pagina is eweggesj
'undeletereset' => 'Reset',
'undeleteinvert' => 'Ómgedriejde selectie',
'undeletecomment' => 'Reeje:',
-'undeletedarticle' => '"$1" is truukgeplaatsj.',
'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} truukgeplaatsj',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|versie|versies}} en $2 {{PLURAL:$2|bestandj|bestenj}} trökgeplaats',
'undeletedfiles' => '$1 {{PLURAL:$1|bestandj|bestenj}} trökgeplaats',
@@ -2234,6 +2281,7 @@ Es d'r 'ne nuuj pagina mit dezelfde naam is aangemaak sins de pagina is eweggesj
In 't [[Special:Log/delete|logbook verwiederde pazjena's]] staon recènte verwiederinge en herstelhanjelinge.",
'undelete-header' => "Zuug [[Special:Log/delete|'t logbook verwiederde pazjena's]] veur recènt verwiederde pazjena's.",
+'undelete-search-title' => "Doorzeuk verwiederde pazjena's",
'undelete-search-box' => "Doorzeuk verwiederde pazjena's",
'undelete-search-prefix' => "Tuin pagina's die beginne mit:",
'undelete-search-submit' => 'Zeuk',
@@ -2242,6 +2290,7 @@ In 't [[Special:Log/delete|logbook verwiederde pazjena's]] staon recènte verwie
'undelete-bad-store-key' => "Bestandsversie van tiedstip $1 kos neet hersteld waere: 't bestand miste al veurdet 't waerde verwiederd.",
'undelete-cleanup-error' => 'Fout bie \'t herstelle van ongebroek archiefbestand "$1".',
'undelete-missing-filearchive' => "'t Luk neet om ID $1 trök te plaatse omdet 't neet in de database is. Mesjien is 't al trökgeplaats.",
+'undelete-error' => "d'r Is 'n fout bie 't wösje vanne pagina",
'undelete-error-short' => "Fout bie 't herstelle van bestand: $1",
'undelete-error-long' => "d'r Zeen foute opgetraeje bie 't herstelle van 't bestand:
@@ -2361,6 +2410,7 @@ Zuug de [[Special:BlockList|lies van geblokkeerde IP-adresse]].',
'blocklist-userblocks' => 'Verberg geblokkeerde gebroekers',
'blocklist-tempblocks' => 'Verberg tiedelike bloks',
'blocklist-addressblocks' => 'Verberg bloks van ei IP-adres',
+'blocklist-rangeblocks' => 'Verberg IP-adresbloks',
'blocklist-timestamp' => 'Tied',
'blocklist-target' => 'Doel',
'blocklist-expiry' => 'Verlöp',
@@ -2383,6 +2433,7 @@ Zuug de [[Special:BlockList|lies van geblokkeerde IP-adresse]].',
'unblocklink' => 'óntblók',
'change-blocklink' => 'blokkaasj verangere',
'contribslink' => 'biedrages',
+'emaillink' => 'sjik mail',
'autoblocker' => 'Ómdets te \'n IP-adres deils mit "[[User:$1|$1]]" (geblokkeerd mit raeje "$2") bis te automatisch geblokkeerd.',
'blocklogpage' => 'Blokkeerlogbook',
'blocklog-showlog' => "Dizze gebroeker is eerder geblokkeerd gewaes.
@@ -2499,9 +2550,6 @@ Haaj d'r raekening mit det allein de pagina wuuertj hernömp, ''neet'' de gebroe
'movepage-page-moved' => 'De pazjena $1 is hernömp nao $2.',
'movepage-page-unmoved' => 'De pazjena $1 kós neet hernömp waere nao $2.',
'movepage-max-pages' => "'t Maximaal aantal automatisch te hernömme pazjena's is bereik ({{PLURAL:$1|$1|$1}}). De euverige pazjena's waere neet automatisch hernömp.",
-'1movedto2' => '[[$1]] verplaats nao [[$2]]',
-'1movedto2_redir' => '[[$1]] euver redirect verplaats nao [[$2]]',
-'move-redirect-suppressed' => 'redirek óngerdrök',
'movelogpage' => "Logbook verplaatsde pagina's",
'movelogpagetext' => "Dit is de lies van verplaatsde pazjena's.",
'movesubpage' => "{{PLURAL:$1|Subpaasj|Subpazjena's}}",
@@ -2514,7 +2562,7 @@ Haaj d'r raekening mit det allein de pagina wuuertj hernömp, ''neet'' de gebroe
De doeltitel "[[:$1]]" besjteit al. Wils te dit artikel wisse óm ruumde te make veur de verplaatsing?',
'delete_and_move_confirm' => 'Jao, wis de pazjena',
-'delete_and_move_reason' => 'Gewis óm artikel te kónne verplaatse',
+'delete_and_move_reason' => 'Gewis óm artikel [[$1]] te kónne verplaatse',
'selfmove' => "De kèns 'n pazjena neet verplaatse nao dezelfde paginanaam.",
'immobile-source-namespace' => 'Pagina\'s in de naamruumde "$1" kinne nwet hernump waere',
'immobile-target-namespace' => 'Pagina\'s kinne neet hernömp waere nao de naamruumde "$1"',
@@ -2544,9 +2592,11 @@ Kees 'nen angere bestandjsnaam.",
Gaef in 't óngersjtaonde veldj de name van de te exportere pazjena's op, ein pazjena per regel, en gaef aan ofs te alle versies mit de bewerkingssamevatting of allein de hujige versies mit de bewirkingssamevatting wils exportere.
In 't letste geval kèns te ouch 'ne link gebroeken, bieveurbild [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de pazjena \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => "Exporteer alle pagina's",
'exportcuronly' => 'Allein de letste versie, neet de volledige gesjiedenis',
'exportnohistory' => "----
'''Let op:''' 't exportere van de ganse gesjiedenis is oetgezat waeges prestatieree.",
+'exportlistauthors' => "Nöm 'n vól auteurslies op veur eder paasj",
'export-submit' => 'Exportere',
'export-addcattext' => "Voeg pagina's toe van categorie:",
'export-addcat' => 'Toevoege',
@@ -2579,6 +2629,8 @@ Bezeuk [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//trans
'thumbnail_error' => "Fout bie 't aanmake van thumbnail: $1",
'djvu_page_error' => 'DjVu-pagina boete bereik',
'djvu_no_xml' => "De XML veur 't DjVu-bestandj kos neet opgehaald waere",
+'thumbnail-temp-create' => "'t Waar neet meugelik e tiejelik miniatuurbestandj aan te make.",
+'thumbnail-dest-create' => "'t Waar neet meugelik 't miniatuurbestandj óp de doellocatie óp te slaon.",
'thumbnail_invalid_params' => 'Onzjuste thumbnailparamaetere',
'thumbnail_dest_directory' => 'Neet in staat doel directory aan te make',
'thumbnail_image-type' => 'Dit besjtandjstype waert neet ongersjteund',
@@ -2623,6 +2675,11 @@ Slaon de oetveur op dien eige systeem op, en voeg dae dao nao hiej toe.',
'import-upload' => 'XML-gegaeves uploade',
'import-token-mismatch' => "De sessiegegaeves zeen verlaore gegange. Perbeer 't opnuuj.",
'import-invalid-interwiki' => "'t Is neet mäögelik van de aangegeve wiki te importere.",
+'import-error-edit' => 'De pagina "$1" is neet geïmporteerd omdes se neet de rechte hes óm dees te bewèrke.',
+'import-error-create' => 'De pagina "$1" is neet geïmporteerd omdes se neet de rechte hes óm dees aan te make.',
+'import-error-interwiki' => 'De pagina "$1" is neet geïmporteerd omdet deze naam is gereserveerd veur extern verwiezinge (interwiki).',
+'import-error-special' => 'Pagina "$1" is neet geïmporteerd omdet deze is geplaats in \'n speciaal naamruumdje wo gein pagina\'s in geplaats kinne waere.',
+'import-error-invalid' => 'De pagina" "$1" is neet geïmporteerd omdet de naam óngeljig is.',
# Import log
'importlogpage' => 'Importlogbook',
@@ -2632,73 +2689,86 @@ Slaon de oetveur op dien eige systeem op, en voeg dae dao nao hiej toe.',
'import-logentry-interwiki' => 'transwiki veur $1 geslaag',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versie|versies}} van $2',
+# JavaScriptTest
+'javascripttest' => 'Tes JavaScript',
+'javascripttest-disabled' => 'Dees funksje steit oet.',
+'javascripttest-title' => 'Veur tes oet veur $1',
+'javascripttest-pagetext-noframework' => "Dees pagina is gerizzerveerd veur 't oetveure van JavaScriptteste.",
+'javascripttest-pagetext-unknownframework' => 'Ónbekèndje testframework "$1".',
+'javascripttest-pagetext-frameworks' => 'Kees ein vanne volgende tesframeworks: $1',
+'javascripttest-pagetext-skins' => "Kees 'n oeterlik óm de teste op te laote loupe:",
+'javascripttest-qunit-intro' => 'Zuuch de [$1 tesdocumentatie] op mediawiki.org.',
+'javascripttest-qunit-heading' => 'QUnit tessuite veur MediaWiki JavaScript',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Dien gebroekerspagina',
-'tooltip-pt-anonuserpage' => 'De gebroekerspazjena veur dit IP adres',
-'tooltip-pt-mytalk' => 'Dien euverlèkpagina',
-'tooltip-pt-anontalk' => 'Euverlèk euver verangeringe doer dit IP addres',
-'tooltip-pt-preferences' => 'Mien veurkäöre',
-'tooltip-pt-watchlist' => "De lies van gevolgde pagina's.",
-'tooltip-pt-mycontris' => 'Lies van dien biedrage',
-'tooltip-pt-login' => "De weurs aangemeudig om d'ch aan te melje, meh 't is neet verplich.",
-'tooltip-pt-anonlogin' => 'De weurs aangemodigd om in te logge, meh t is neet verplich.',
-'tooltip-pt-logout' => 'Aafmelde',
-'tooltip-ca-talk' => 'Euverlèk euver dit artikel',
-'tooltip-ca-edit' => 'De kins dees pagina verangere.',
-'tooltip-ca-addsection' => "Begin 'n nuuj sectie",
-'tooltip-ca-viewsource' => 'Dees pagina is besjirmp. De kins häör brontèks betrachte.',
-'tooltip-ca-history' => 'Auw versies van dees pagina.',
-'tooltip-ca-protect' => 'Besjirm dees pagina',
-'tooltip-ca-unprotect' => 'Veranger de beveiliging van dees pagina',
-'tooltip-ca-delete' => 'Sjaf dees pagina eweg',
-'tooltip-ca-undelete' => 'Hersjtèl de verangeringe van dees pazjena van veurdat ze gewist woerd',
-'tooltip-ca-move' => 'Verplaats dees pagina',
-'tooltip-ca-watch' => 'Dees pagina bie bie dien volglies zètte',
-'tooltip-ca-unwatch' => 'Dees pagina van dien volglies ewegsjaffe',
-'tooltip-search' => 'Doorzeuk {{SITENAME}}',
-'tooltip-search-go' => "Gank nao 'n pagina mit dezelfde naam es die besjteit",
-'tooltip-search-fulltext' => "Zeuk de pagina's veur dees teks",
-'tooltip-p-logo' => 'Veurblaad',
-'tooltip-n-mainpage' => "Bezeuk 't Veurblaad",
-'tooltip-n-mainpage-description' => "Bezeuk 't Veurblaad",
-'tooltip-n-portal' => "Euver 't projek, wats te kins doon, woes te dinger kins vènje",
-'tooltip-n-currentevents' => "Achtergrondinfo van 't nuujs",
-'tooltip-n-recentchanges' => 'De lies van recènte verangeringe in de wiki.',
-'tooltip-n-randompage' => "Laaj 'n willekäörige pagina",
-'tooltip-n-help' => 'De plaats óm informatie euver dit projek te vènje.',
-'tooltip-t-whatlinkshere' => "Lies van alle wikipagina's die hiehaer verwieze",
-'tooltip-t-recentchangeslinked' => "Recènte verangeringe in pagina's woehaer dees pagina verwis",
-'tooltip-feed-rss' => 'RSS feed veur dees pagina',
-'tooltip-feed-atom' => 'Atom feed veur dees pagina',
-'tooltip-t-contributions' => 'Bekiek de lies van contributies van dizze gebroeker',
-'tooltip-t-emailuser' => 'Sjtuur inne mail noa dizze gebroeker',
-'tooltip-t-upload' => 'Upload besjtande',
-'tooltip-t-specialpages' => "Lies van alle speciaal pagina's",
-'tooltip-t-print' => 'Printvruntelike versie van deze pagina',
-'tooltip-t-permalink' => 'Permanente link nao dees versie van de pagina',
-'tooltip-ca-nstab-main' => 'Betrach de pagina',
-'tooltip-ca-nstab-user' => 'Bekiek de gebroekerspagina',
-'tooltip-ca-nstab-media' => 'Bekiek de mediapazjena',
-'tooltip-ca-nstab-special' => "Dit is 'n speciaal pagina, de kins dees pagina zelf neet bewirke",
-'tooltip-ca-nstab-project' => 'Bekiek de projèkpagina',
-'tooltip-ca-nstab-image' => 'Bekiek de besjtandspagina',
-'tooltip-ca-nstab-mediawiki' => 'Bekiek t systeimberich',
-'tooltip-ca-nstab-template' => 'Bekiek t sjabloon',
-'tooltip-ca-nstab-help' => 'Bekiek de helppazjena',
-'tooltip-ca-nstab-category' => 'Betrach de categoriepagina',
-'tooltip-minoredit' => "Markeer dit es 'n klein verangering",
-'tooltip-save' => 'Bewaar dien verangeringe',
-'tooltip-preview' => 'Betrach dien verangeringe veurdets te ze definitief opsjleis!',
-'tooltip-diff' => 'Betrach dien verangeringe in de teks.',
-'tooltip-compareselectedversions' => 'Betrach de versjille tösje de twie geselecteerde versies van dees pagina.',
-'tooltip-watch' => 'Doog dees pagina bie aan dien volglies',
-'tooltip-recreate' => 'Maak deze pagina opnuuj aan ondanks irdere verwiedering',
-'tooltip-upload' => 'Uploade',
-'tooltip-rollback' => 'Mit "trökdrieje" driejs doe mit eine klik de bewirking(e) trök van de lètste gebroeker dee dees pagina haet bewirk.',
-'tooltip-undo' => 'Mit "óngedaon make" driejs te dees bewirking trök en koms te in \'t bewirkingsvinster.
+'tooltip-pt-userpage' => 'Dien gebroekerspagina',
+'tooltip-pt-anonuserpage' => 'De gebroekerspazjena veur dit IP adres',
+'tooltip-pt-mytalk' => 'Dien euverlèkpagina',
+'tooltip-pt-anontalk' => 'Euverlèk euver verangeringe doer dit IP addres',
+'tooltip-pt-preferences' => 'Mien veurkäöre',
+'tooltip-pt-watchlist' => "De lies van gevolgde pagina's.",
+'tooltip-pt-mycontris' => 'Lies van dien biedrage',
+'tooltip-pt-login' => "De weurs aangemeudig om d'ch aan te melje, meh 't is neet verplich.",
+'tooltip-pt-anonlogin' => 'De weurs aangemodigd om in te logge, meh t is neet verplich.',
+'tooltip-pt-logout' => 'Aafmelde',
+'tooltip-ca-talk' => 'Euverlèk euver dit artikel',
+'tooltip-ca-edit' => 'De kins dees pagina verangere.',
+'tooltip-ca-addsection' => "Begin 'n nuuj sectie",
+'tooltip-ca-viewsource' => 'Dees pagina is besjirmp. De kins häör brontèks betrachte.',
+'tooltip-ca-history' => 'Auw versies van dees pagina.',
+'tooltip-ca-protect' => 'Besjirm dees pagina',
+'tooltip-ca-unprotect' => 'Veranger de beveiliging van dees pagina',
+'tooltip-ca-delete' => 'Sjaf dees pagina eweg',
+'tooltip-ca-undelete' => 'Hersjtèl de verangeringe van dees pazjena van veurdat ze gewist woerd',
+'tooltip-ca-move' => 'Verplaats dees pagina',
+'tooltip-ca-watch' => 'Dees pagina bie bie dien volglies zètte',
+'tooltip-ca-unwatch' => 'Dees pagina van dien volglies ewegsjaffe',
+'tooltip-search' => 'Doorzeuk {{SITENAME}}',
+'tooltip-search-go' => "Gank nao 'n pagina mit dezelfde naam es die besjteit",
+'tooltip-search-fulltext' => "Zeuk de pagina's veur dees teks",
+'tooltip-p-logo' => 'Veurblaad',
+'tooltip-n-mainpage' => "Bezeuk 't Veurblaad",
+'tooltip-n-mainpage-description' => "Bezeuk 't Veurblaad",
+'tooltip-n-portal' => "Euver 't projek, wats te kins doon, woes te dinger kins vènje",
+'tooltip-n-currentevents' => "Achtergrondinfo van 't nuujs",
+'tooltip-n-recentchanges' => 'De lies van recènte verangeringe in de wiki.',
+'tooltip-n-randompage' => "Laaj 'n willekäörige pagina",
+'tooltip-n-help' => 'De plaats óm informatie euver dit projek te vènje.',
+'tooltip-t-whatlinkshere' => "Lies van alle wikipagina's die hiehaer verwieze",
+'tooltip-t-recentchangeslinked' => "Recènte verangeringe in pagina's woehaer dees pagina verwis",
+'tooltip-feed-rss' => 'RSS feed veur dees pagina',
+'tooltip-feed-atom' => 'Atom feed veur dees pagina',
+'tooltip-t-contributions' => 'Bekiek de lies van contributies van dizze gebroeker',
+'tooltip-t-emailuser' => 'Sjtuur inne mail noa dizze gebroeker',
+'tooltip-t-upload' => 'Upload besjtande',
+'tooltip-t-specialpages' => "Lies van alle speciaal pagina's",
+'tooltip-t-print' => 'Printvruntelike versie van deze pagina',
+'tooltip-t-permalink' => 'Permanente link nao dees versie van de pagina',
+'tooltip-ca-nstab-main' => 'Betrach de pagina',
+'tooltip-ca-nstab-user' => 'Bekiek de gebroekerspagina',
+'tooltip-ca-nstab-media' => 'Bekiek de mediapazjena',
+'tooltip-ca-nstab-special' => "Dit is 'n speciaal pagina, de kins dees pagina zelf neet bewirke",
+'tooltip-ca-nstab-project' => 'Bekiek de projèkpagina',
+'tooltip-ca-nstab-image' => 'Bekiek de besjtandspagina',
+'tooltip-ca-nstab-mediawiki' => 'Bekiek t systeimberich',
+'tooltip-ca-nstab-template' => 'Bekiek t sjabloon',
+'tooltip-ca-nstab-help' => 'Bekiek de helppazjena',
+'tooltip-ca-nstab-category' => 'Betrach de categoriepagina',
+'tooltip-minoredit' => "Markeer dit es 'n klein verangering",
+'tooltip-save' => 'Bewaar dien verangeringe',
+'tooltip-preview' => 'Betrach dien verangeringe veurdets te ze definitief opsjleis!',
+'tooltip-diff' => 'Betrach dien verangeringe in de teks.',
+'tooltip-compareselectedversions' => 'Betrach de versjille tösje de twie geselecteerde versies van dees pagina.',
+'tooltip-watch' => 'Doog dees pagina bie aan dien volglies',
+'tooltip-watchlistedit-normal-submit' => "Pazjena's ewegsjaffe",
+'tooltip-watchlistedit-raw-submit' => 'Volglies biewirke',
+'tooltip-recreate' => 'Maak deze pagina opnuuj aan ondanks irdere verwiedering',
+'tooltip-upload' => 'Uploade',
+'tooltip-rollback' => 'Mit "trökdrieje" driejs doe mit eine klik de bewirking(e) trök van de lètste gebroeker dee dees pagina haet bewirk.',
+'tooltip-undo' => 'Mit "óngedaon make" driejs te dees bewirking trök en koms te in \'t bewirkingsvinster.
Doe kans in de bewirkingssamevatting \'n reej opgaeve.',
-'tooltip-preferences-save' => 'Slaon veurkäöre óp',
-'tooltip-summary' => "Veur 'n kórte samevatting in",
+'tooltip-preferences-save' => 'Slaon veurkäöre óp',
+'tooltip-summary' => "Veur 'n kórte samevatting in",
# Metadata
'notacceptable' => "De wikiserver kin de gegaeves neet levere in 'ne vorm dae diene client kin laeze.",
@@ -2756,9 +2826,6 @@ Meistal wörd dit door 'ne zwarte externe link veroorzaak.",
# Patrol log
'patrol-log-page' => 'Markeerlogbook',
'patrol-log-header' => 'Dit logbook bevat versies die gemarkeerd zeen es gecontroleerd.',
-'patrol-log-line' => 'markeerde versie $1 van $2 es gecontroleerd $3',
-'patrol-log-auto' => '(automatisch)',
-'patrol-log-diff' => 'versie $1',
'log-show-hide-patrol' => 'Markeerlogbook $1',
# Image deletion
@@ -2777,22 +2844,24 @@ $1",
'nextdiff' => 'Volgende bewirking →',
# Media information
-'mediawarning' => "'''Waorsjuwing''': Dit bestandj kin 'n anger kood höbbe, door 't te doorveure in dien systeem kin 't gecompromeerde dinger oplevere.",
-'imagemaxsize' => "Meximale aafbeildjingsaafmaeting:<b r/>''(veur besjrievingspaasj)''",
-'thumbsize' => 'Gruutde vanne thumbnail:',
-'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|pazjena|pazjena's}}",
-'file-info' => 'bestandsgruutde: $1, MIME-type: $2',
-'file-info-size' => '$1 × $2 pixels, besjtandjgruutde: $3, MIME-type: $4',
-'file-info-size-pages' => "$1 × $2 pixels, bestandjsgreudje: $3, MIME-type: $4, $5 {{PLURAL:$5|pagina|pagina's}}",
-'file-nohires' => '<small>Gein hogere resolutie besjikbaar.</small>',
-'svg-long-desc' => 'SVG-bestandj, nominaal $1 × $2 pixels, bestandsgruutde: $3',
-'show-big-image' => 'Vol resolutie',
-'show-big-image-size' => '$1 × $2 pixels',
-'file-info-gif-looped' => 'herhaolendj',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|kader|kadere}}',
-'file-info-png-looped' => 'herhaolendj',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|kieër|kieër}} aafgespeelj',
-'file-info-png-frames' => '$1 {{PLURAL:$1|kader|kadere}}',
+'mediawarning' => "'''Waorsjuwing''': Dit bestandj kin 'n anger kood höbbe, door 't te doorveure in dien systeem kin 't gecompromeerde dinger oplevere.",
+'imagemaxsize' => "Meximale aafbeildjingsaafmaeting:<b r/>''(veur besjrievingspaasj)''",
+'thumbsize' => 'Gruutde vanne thumbnail:',
+'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|pazjena|pazjena's}}",
+'file-info' => 'bestandsgruutde: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 pixels, besjtandjgruutde: $3, MIME-type: $4',
+'file-info-size-pages' => "$1 × $2 pixels, bestandjsgreudje: $3, MIME-type: $4, $5 {{PLURAL:$5|pagina|pagina's}}",
+'file-nohires' => 'Gein hogere resolutie besjikbaar.',
+'svg-long-desc' => 'SVG-bestandj, nominaal $1 × $2 pixels, bestandsgruutde: $3',
+'show-big-image' => 'Vol resolutie',
+'show-big-image-preview' => 'Greudje van dees veurvertoening: $1.',
+'show-big-image-other' => 'Anger {{PLURAL:$2|resolutie|resoluties}}: $1.',
+'show-big-image-size' => '$1 × $2 pixels',
+'file-info-gif-looped' => 'herhaolendj',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|kader|kadere}}',
+'file-info-png-looped' => 'herhaolendj',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|kieër|kieër}} aafgespeelj',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kader|kadere}}',
# Special:NewFiles
'newimages' => 'Nuuj plaetjes',
@@ -2806,6 +2875,13 @@ $1",
'bydate' => 'op datum',
'sp-newimages-showfrom' => 'Tuin nuuj besjtande vanaaf $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekónd|$1 sekónd}}',
+'minutes' => '{{PLURAL:$1|$1 menuut|$1 menuut}}',
+'hours' => '{{PLURAL:$1|$1 oer|$1 oer}}',
+'days' => '{{PLURAL:$1|$1 daag|$1 daag}}',
+'ago' => '$1 trögk',
+
# Bad image list
'bad_image_list' => "De opmaak is es volg:
@@ -3297,13 +3373,6 @@ De bevestigingscode vervilt op \$4.",
'scarytranscludefailed' => '[Sjabloon $1 kós neet opgehaold waer]',
'scarytranscludetoolong' => '[URL is te lank]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks veur deze pazjena:<br />
-$1',
-'trackbackremove' => '([$1 Wusje])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'De trackback is gewusj.',
-
# Delete conflict
'deletedwhileediting' => "'''Waorsjoewing''': Dees pazjena is gewis naodats doe bis begós mit bewirke!",
'confirmrecreate' => "Gebroeker [[User:$1|$1]] ([[User talk:$1|euverlèk]]) heet dees pagina eweggesjaf naodats doe mèt bewirke begós mèt de rae:
@@ -3386,6 +3455,9 @@ De kèns ouch [[Special:EditWatchlist|'t sjtanderd bewirkingssjirm gebroeke]].",
'watchlisttools-edit' => 'Volglies bekieke en bewirke',
'watchlisttools-raw' => 'Roew volglies bewirke',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|euverlègk]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ónbekindje tag "$1"',
'duplicate-defaultsort' => 'Waarsjuwing: De standaardsortering "$2" krieg veurrang veur de sortering "$1".',
@@ -3440,8 +3512,9 @@ Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes
# Special:SpecialPages
'specialpages' => "Speciaal pagina's",
'specialpages-note' => '----
-* <span class="mw-specialpagerestricted">Normale speciaal pagina\'s.</span>
-* <span class="mw-specialpagerestricted">Speciaal pagina\'s mèt allein gegeves oet de cache.</span>',
+* Normaal speciaal pagina\'s
+* <strong class="mw-specialpagerestricted">Beperk toegankelike speciaal pagina\'s</strong>
+* <span class="mw-specialpagecached">Speciaal pagina\'s mit allein gegaeves oete cache (meugelik verajerd)</span>',
'specialpages-group-maintenance' => 'Óngerhajingsrapporter',
'specialpages-group-other' => "Euverige speciaal pazjena's",
'specialpages-group-login' => 'Aanmelje / registrere',
@@ -3483,13 +3556,16 @@ Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes
'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wieziginge}}',
# Special:ComparePages
-'comparepages' => "Vergeliek pazjena's",
-'compare-selector' => 'Vergeliek pazjenaversies',
-'compare-page1' => 'Paasj 1',
-'compare-page2' => 'Paasj 2',
-'compare-rev1' => 'Versie 1',
-'compare-rev2' => 'Versie 2',
-'compare-submit' => 'Vergeliek',
+'comparepages' => "Vergeliek pazjena's",
+'compare-selector' => 'Vergeliek pazjenaversies',
+'compare-page1' => 'Paasj 1',
+'compare-page2' => 'Paasj 2',
+'compare-rev1' => 'Versie 1',
+'compare-rev2' => 'Versie 2',
+'compare-submit' => 'Vergeliek',
+'compare-invalid-title' => 'De opgegaeve pazjenanaam is óngeljig.',
+'compare-title-not-exists' => 'Aangegaeve titel besteit neet.',
+'compare-revision-not-exists' => 'Aangegaeve versie besteit neet.',
# Database error messages
'dberr-header' => "Deze wiki haet 'n probleem",
@@ -3516,4 +3592,90 @@ Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes
'sqlite-has-fts' => 'Zeuk versie $1 mit óngersteuning veur "full-text"',
'sqlite-no-fts' => 'Zeuk versie $1 zónger óngersteuning veur "fulltext"',
+# New logging system
+'logentry-delete-delete' => '$1 haef de pagina $3 gewösj',
+'logentry-delete-restore' => '$1 haet de pagina $3 trögkgezat',
+'logentry-delete-event' => "$1 haet de zichbaarheid van {{PLURAL:$5|'ne logbookregel|$5 logbookregels}} van $3 gewiezig: $4",
+'logentry-delete-revision' => "$1 haet de zichbaarheid van {{PLURAL:$5|'n versie|$5 versies}} van $3 gewiezig: $4",
+'logentry-delete-event-legacy' => '$1 haet de zichbaarheid van logbookregels van $3 gewiezig',
+'logentry-delete-revision-legacy' => '$1 haet de zichbaarheid van versies van de pagina $3 gewiezig.',
+'logentry-suppress-delete' => '$1 haet de pagina $3 ongerdrök',
+'logentry-suppress-event' => "$1 haet heimelik de zichbaarheid van {{PLURAL:$5|'ne logbookregel|$5 logbookregels}} van $3 gewiezig: $4",
+'logentry-suppress-revision' => "$1 haet heimelik de zichbaarheid van {{PLURAL:$5|'n versie|$5 versies}} van $3 gewiezig: $4",
+'logentry-suppress-event-legacy' => '$1 haet heimelik de zichbaarheid van logbookregels van $3 gewiezig',
+'logentry-suppress-revision-legacy' => '$1 haet heimelik de zichbaarheid van versies van de pagina $3 gewiezig.',
+'revdelete-content-hid' => 'inhawd verbórge',
+'revdelete-summary-hid' => 'bewirkingssamevatting verbórge',
+'revdelete-uname-hid' => 'gebroekersnaam verbórge',
+'revdelete-content-unhid' => 'inhawd zichbaar gemaak',
+'revdelete-summary-unhid' => 'bewirkingssamevatting zichbaar gemaak',
+'revdelete-uname-unhid' => 'gebroekersnaam ónthöld',
+'revdelete-restricted' => 'haet beperkinge aan beheerders opgelag',
+'revdelete-unrestricted' => 'haet beperkinge veur beheerders opgehaeve',
+'logentry-move-move' => '$1 verplaatsde pagina $3 nao $4',
+'logentry-move-move-noredirect' => "$1 verplaatsde pagina $3 nao $4 zonger 'n doorverwiezing achter te laote",
+'logentry-move-move_redir' => "$1 verplaatsde pagina $3 nao $4 euver 'ne redirek",
+'logentry-move-move_redir-noredirect' => "$1 verplaatsde pagina $3 nao $4 euver 'ne redirek zonger 'n doorverwiezing achter te laote",
+'logentry-patrol-patrol' => '$1 haet versie $4 van pagina $3 es gecontroleerd gemarkeerd',
+'logentry-patrol-patrol-auto' => '$1 haet versie $4 van pagina $3 autematis es gecontroleerd gemarkeerd',
+'logentry-newusers-newusers' => "$1 haet 'ne gebroeker aangemaak",
+'logentry-newusers-create' => "$1 haet 'ne gebroeker aangemaak",
+'logentry-newusers-create2' => "$1 haet 'ne gebroeker $3 aangemaak",
+'logentry-newusers-autocreate' => 'De gebroeker $1 is autematis aangemaak',
+'newuserlog-byemail' => 'wachwaord is versjik per e-mail',
+
+# Feedback
+'feedback-bugornote' => 'Es se zewied bös óm e technisch perbleem in détail te besjrieve, [$1 rapperteer \'ne bug].
+Anges kin se-n ouch \'t einvawdig formeleer hieónger gebroeke. Dien commentaar zal waere toegeveug ane pagina "[$3 $2]", same mit diene gebroekersnaam enne browser dae se gebruuks.',
+'feedback-subject' => 'Óngerwerp:',
+'feedback-message' => 'Berich:',
+'feedback-cancel' => 'Braek aaf',
+'feedback-submit' => 'Slaon feedback óp',
+'feedback-adding' => 'Feedback weurt aan pagina toegevoeg...',
+'feedback-error1' => 'Fout: ónbekind rizzeltaot vanne API',
+'feedback-error2' => 'Fout: bewirking mislök',
+'feedback-error3' => 'Fout: gein reactie vanne API',
+'feedback-thanks' => 'Danke! Diene feedback is oppe pagina "[$2 $1]" geplaats.',
+'feedback-close' => 'Gedaon',
+'feedback-bugcheck' => "Good! Kónterleer ef of 't neet al ein vanne [$1 bekèndje bugs] is.",
+'feedback-bugnew' => "Gekónterleerdj. Mèlj 'ne nuuj bug.",
+
+# API errors
+'api-error-badaccess-groups' => 'Doe moogs gein bestenj uploade óp deze wiki.',
+'api-error-badtoken' => 'Intern fout: toke is slech.',
+'api-error-copyuploaddisabled' => 'Uploade via URL steit óp deze server oet.',
+'api-error-duplicate' => "d'r {{PLURAL:$1|steit al [$2 e bestandj]|staon al [$2 bestenj]}} mit dezelfden inhawd oppe wiki.",
+'api-error-duplicate-archive' => "d'r {{PLURAL:$1|Waar al [$2 'n anger bestandj]|woren al [$2 $1 anger bestenj]}} óppe site mitte zelfdjen inhawd, meh {{PLURAL:$1|det is|die zeen}} gewösj.",
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplicaatbestandj det al gewösj is|Duplicaatbestenj die al gewösj zeen}}',
+'api-error-duplicate-popup-title' => 'Zelfde {{PLURAL:$1|bestandj|bestenj}}',
+'api-error-empty-file' => 't Bestandj det se perbeers te uploade had gein inhald.',
+'api-error-emptypage' => "Doe maags gein nuuj, laeg pagina's aanmake.",
+'api-error-fetchfileerror' => "Intern fout: d'r is get fout gegange bie 't óphaole van 't bestandj.",
+'api-error-file-too-large' => 't Bestandj det se perbeers te uploade waas te groet.',
+'api-error-filename-tooshort' => "t Bestandj det se perbeers te uploade had 'ne te kórte bestandjsnaam.",
+'api-error-filetype-banned' => 't Bestandj det se perbeers te uploade waas van e neet-toegelaote bestandjstype.',
+'api-error-filetype-missing' => "'t Bestandj haet gein extensie.",
+'api-error-hookaborted' => "De wieziging die se perbeers te make is aafgebraoke door 'nen oetbreidingshook.",
+'api-error-http' => "Intern fout: d'r kós gein verbinjing gemaak waere mitte server.",
+'api-error-illegal-filename' => 'Deze bestandjsnaam is neet toegelaote.',
+'api-error-internal-error' => "Intern fout: d'r is get fout gegange tiedes 't verwirke vanne upload dore wiki.",
+'api-error-invalid-file-key' => "Intern fout: 't bestandj is neet aangetróffe inne tiedeliken ópslaag.",
+'api-error-missingparam' => "Intern fout: neet alle paramaeters zeen in 't verzeuk mitgeleverdj.",
+'api-error-missingresult' => "Intern fout: 't waar neet meugelik vas te stèllen of 't kopiejere is geslaag.",
+'api-error-mustbeloggedin' => 'Doe mós aangemèldj zeen óm bestenj te kinnen uploade.',
+'api-error-mustbeposted' => 'Inter fout: aanvraog vereis HTTP-POST.',
+'api-error-noimageinfo' => "De upload is aafgeróndj, meh de server haet gein gegaeves van 't bestandj vriegegaeve.",
+'api-error-nomodule' => "Intern fout: d'r is gein uploadmodule ingesteldj.",
+'api-error-ok-but-empty' => 'Intern fout: de server haet gein gegaeves trögkgeleverdj.',
+'api-error-overwrite' => 'E bestandj euversjrieve geit neet.',
+'api-error-stashfailed' => "Intern fout: de server kós 't tiedelik bestandj neet ópslaon.",
+'api-error-timeout' => 'De server haet neet inne verwachde tied geantjweurd.',
+'api-error-unclassified' => "dr Is 'n ónbekènde fout opgetraoje.",
+'api-error-unknown-code' => 'Intern fout: "$1"',
+'api-error-unknown-error' => "Intern fout: d'r is get fout gegange tiedes 't uploade van 't bestandj.",
+'api-error-unknown-warning' => 'Onbekinde waorsjuwing: $1',
+'api-error-unknownerror' => 'Ónbekèndje fout: "$1"',
+'api-error-uploaddisabled' => 'Upload steit oet óp deze wiki.',
+'api-error-verification-error' => "Dit bestandj is meugelik besjadig of haet 'n ónjuuste extensie.",
+
);
diff --git a/languages/messages/MessagesLij.php b/languages/messages/MessagesLij.php
index cd72c474..d5468210 100644
--- a/languages/messages/MessagesLij.php
+++ b/languages/messages/MessagesLij.php
@@ -376,7 +376,6 @@ Pe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|
'badtitle' => "O tìtolo o no l'è corretto.",
'badtitletext' => "O tittolo da paggina çercâa o l'è vêuo, sballiòu o con caratteri no accettæ, oppûre o deriva da 'n errô inti collegamenti tra scîti Wiki diversci o verscioîn in léngue diversce do mæximo scîto.",
'viewsource' => 'Veddi a fonte',
-'viewsourcefor' => 'de $1',
'protectedpagetext' => "'Sta paggina a l'è stæta protezûa pe impedîghe a modiffica.",
'viewsourcetext' => "O l'è poscibbile vedde e copiâ o còddice sorgente de 'sta paggina:",
@@ -498,9 +497,6 @@ Ti pêu contattâ \$1 ou 'n âtro
Dagghe a mente a che no ti pêu ûsâ o comando \"manda na littia elettronega a sto utente\" se non ti g'hæ 'n indirisso de posta elettronega registroö in te têu [[Special:Preferences|preferense]] e se o no l'è stæto bloccòu ascì.
O têu blòcco ID o l'è \$5. Pe piaxei metti 'sto ID in tûtte e domande che ti fæ.",
-'blockedoriginalsource' => "A fònte de '''$1''' a l'è chi sotta:",
-'blockededitsource' => "O testo de i '''teu cangiamenti''' a '''$1''' o l'è chi sotta:",
-'whitelistedittitle' => "Bezêugna registrâse pe modificâ 'na pagina.",
'whitelistedittext' => 'Pe cangia sta pagina devvi $1.',
'loginreqtitle' => "Besêugna registrâse primma de modificâ 'sta paggina.",
'accmailtitle' => 'Pòula segretta spedïa',
@@ -823,6 +819,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
'protectedpages' => 'Paggine protette',
'protectedtitles' => 'Tittoli protezûi',
'listusers' => "Lista d'ûtenti",
+'usercreated' => '{{GENDER:$3|Creòu/â}} o $1 a-a $2',
'newpages' => 'Pagine ciù reçenti',
'ancientpages' => 'Paggine ciû vëgie',
'move' => 'Mescia',
@@ -926,7 +923,6 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
'actioncomplete' => 'Açion finïa',
'actionfailed' => 'Açión falîa',
'deletedtext' => 'A paggina "$1" a l\'è stæta scassâa. Consûltâ o $2 pe \'na lista de-e paggine scassæ de reçente.',
-'deletedarticle' => 'O s\'ha scassòu "[[$1]]"',
'dellogpage' => 'Registro de-e cose scassæ',
'deletecomment' => 'Raxon:',
'deleteotherreason' => 'Ûn âtro motivo',
@@ -1089,8 +1085,6 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
'talkexists' => "'''A paggina a l'è stæta stramûâa correttamente, ma o no l'è stæto poscibbile stramûâ a paggina de discûxon perché ghe n'è zà 'n'âtra co-o nêuvo tittolo. O se deive inserî manualmente i contegnûi de tûtte e doe.'''",
'movedto' => 'Stramûâa a',
'movetalk' => 'Stramûâ anche a paggina de discûxon',
-'1movedto2' => '[[$1]] mesciòu a [[$2]]',
-'1movedto2_redir' => '[[$1]] mescioö a [[$2]] redirect',
'movelogpage' => 'Lista di remesci',
'movereason' => 'Raxon',
'revertmove' => 'Ristorâ',
@@ -1188,7 +1182,7 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
# Media information
'thumbsize' => 'Dimescion da a imàginetta:',
'file-info-size' => '$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4',
-'file-nohires' => '<small>No ghe son verscioîn a resolûxon ciû ærta.</small>',
+'file-nohires' => 'No ghe son verscioìn a rezoluçion ciù âta.',
'svg-long-desc' => "archivio in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioìn de l'archivio: $3",
'show-big-image' => "Verscion d'ærta resolûxon",
diff --git a/languages/messages/MessagesLiv.php b/languages/messages/MessagesLiv.php
index cdb7f7f4..fc2f1193 100644
--- a/languages/messages/MessagesLiv.php
+++ b/languages/messages/MessagesLiv.php
@@ -298,13 +298,9 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
# Revision deletion
'rev-delundel' => 'nägÅ£/vaÅ— jarÄ',
-'revdelete-logentry' => 'mõitiņtīz līed [[$1]] redaktsij nǟdõbõzt',
'revdel-restore' => 'Mõitiņt nǟdõbõzt',
'revdel-restore-deleted' => 'jarÄ kiÅ¡tÄntõd redaktsijõd',
'revdel-restore-visible' => 'nǟdõbõd redaktsijõd',
-'revdelete-content' => 'sižÄli',
-'revdelete-hid' => '$1 jarÄ vaÅ—tõd',
-'revdelete-log-message' => '{{PLURAL:$2| Īd|$2}} redaktsijõ $1',
# Merge log
'revertmerge' => 'KÄ«eld jarÄ kubbõ vieddimi',
@@ -463,7 +459,7 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'nbytes' => '$1 {{PLURAL:$1|bait|baitõ}}',
'nmembers' => '$1 {{PLURAL:$1|nõtkõm| nõtkõmḑi}}',
'prefixindex' => 'AmÄd pēļikÄ“rad prefiksõks',
-'usercreated' => 'Konto lÅ«omiz Äiga: $1 kÄ«ela $2',
+'usercreated' => 'Konto {{GENDER:$3|lÅ«omiz}} Äiga: $1 kÄ«ela $2',
'newpages' => 'Ūd lēḑõd',
'move' => 'Vīž',
'movethispage' => 'ViedÄgid se lÄ«edpÅ«ol tuoiz nim alÄ',
@@ -495,8 +491,7 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'linksearch-line' => '$1 um sidtõd līedst $2',
# Special:Log/newusers
-'newuserlogpage' => 'Kȭlbatijizt lūomiz log',
-'newuserlog-create-entry' => 'Ūž kȭlbatiji',
+'newuserlogpage' => 'Kȭlbatijizt lūomiz log',
# Special:ListGroupRights
'listgrouprights-members' => '(nõtkõmd nimkēra)',
@@ -527,7 +522,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'actioncomplete' => 'AÅ¾Ä tÄ«edõd',
'actionfailed' => 'Tīemi äb-vȯņštīz',
'deletedtext' => ' "$1" um jarÄ kiÅ¡tÄntõd. JarÄ kiÅ¡tÄntõd lēḑõd Ät tÅ«odõd nimkÄ“ras $2.',
-'deletedarticle' => 'jarÄ kiÅ¡tÄntõd "[[$1]]"',
'dellogpage' => 'JarÄ kiÅ¡tÄntimiz log',
'deletecomment' => 'SÄ«:',
'deleteotherreason' => 'MÅ« agÄ jÅ«rõ pandõb sÄ«:',
@@ -561,7 +555,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
# Undelete
'undeletelink' => 'vaņ/lūo ūtstõ',
'undeleteviewlink' => 'vaņ',
-'undeletedarticle' => 'tÅ«oi tÄgiž lÄ«ed "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Nim-rūim:',
@@ -638,8 +631,6 @@ Až sugÄ«z nei, sÅd lÄ«ed tÅdõs kädÅ«dõks jeddõpēḑõn sÅtõ agÄ jÅ«rÃ
'talkexists' => "'''Lēḑ um jeddõpēḑõn sÅtõd, bet nõvpidÄmiz-lÄ«edtõ äb sÅnd jeddõpēḑõn sÅtõ, sÄ«estõ ku Å«d nim allõ um nõvpidÄmiz-lēḑ jubÄ vȯlmizõs. PÅlaks viedÄgid nõvpidÄmiz-lēḑõd īž kubbõ.'''",
'movedto' => 'Jeddõpēḑõn sÅtõd pēļizkÄ“ra alÄ:',
'movetalk' => 'SÅtõgid jeddõpēḑõn ka nõvpidÄmiz lēḑ',
-'1movedto2' => 'vīž jarÄ lÄ«ed [[$1]] nim [[$2]] jÅ«rõ',
-'1movedto2_redir' => ' vīž jarÄ lÄ«ed [[$1]] ja sÅtiz sÄ«e pēļizkÄ“ra [[$2]] alÄ',
'movelogpage' => 'JarÄ vÄ«miz log',
'movereason' => 'SÄ«:',
'revertmove' => 'kÄ«erõgid tÄgiž',
@@ -711,17 +702,13 @@ Až sugÄ«z nei, sÅd lÄ«ed tÅdõs kädÅ«dõks jeddõpēḑõn sÅtõ agÄ jÅ«rÃ
'tooltip-undo' => '"ViedÄgid jarÄ" tÄ«eb tijÄks/kÄ«eldõbjarÄ sÄ«e mõitõks ja ovÄtõb redigÄ«erimiz läb tekstõ jedmõl-vaņtlimizõks. Neiīž tÄ“g võigid sÇŸl kÄ“ratõ, mis vȯļ sÄ«e jarÄ vÄ«miz sÄ«.',
'tooltip-summary' => 'KÄ“ratigid lÄ«tõ kubbõ-võtÄmi',
-# Patrol log
-'patrol-log-line' => 'paņ merk ku $1 līeds $2 kontroļļtõd $3',
-'patrol-log-diff' => 'versij $1',
-
# Browsing diffs
'previousdiff' => '↠Jedmõli redaktsij',
'nextdiff' => 'Jo ūd redigīerimizt',
# Media information
'file-info-size' => ' $1 × $2 piksõlt, bildÄ sÅ«rit: $3, MIME tÄ«p: $4',
-'file-nohires' => '<small>Sīestõ sūrimmõ bildõ äb ūo.</small>',
+'file-nohires' => 'Sīestõ sūrimmõ bildõ äb ūo.',
'svg-long-desc' => 'SVG fail, originÄli sÅ«rit $1 × $2 piksõlt, fail sÅ«rit: $3',
'show-big-image' => 'täuž rezolūtsij',
diff --git a/languages/messages/MessagesLmo.php b/languages/messages/MessagesLmo.php
index 8e04f66d..6077ace0 100644
--- a/languages/messages/MessagesLmo.php
+++ b/languages/messages/MessagesLmo.php
@@ -95,10 +95,10 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'img_right' => array( '1', 'drita', 'destra', 'right' ),
- 'img_left' => array( '1', 'manzína', 'sinistra', 'left' ),
- 'img_none' => array( '1', 'nissön', 'nessuno', 'none' ),
- 'sitename' => array( '1', 'NUMSIT', 'NOMESITO', 'SITENAME' ),
+ 'img_right' => array( '1', 'drita', 'destra', 'right' ),
+ 'img_left' => array( '1', 'manzína', 'sinistra', 'left' ),
+ 'img_none' => array( '1', 'nissön', 'nessuno', 'none' ),
+ 'sitename' => array( '1', 'NUMSIT', 'NOMESITO', 'SITENAME' ),
);
$messages = array(
@@ -412,7 +412,6 @@ Per piasè, fa raport a 'n'[[Special:ListUsers/sysop|aministradur]], cun la nota
'badtitle' => 'Títul mía bun',
'badtitletext' => "El titul de la pagina ciamada a l'è vöj, sbajaa o cun carater minga acetaa, opüra al vegn d'un erur in di ligam intra sit wiki diferent o versión in lenguv diferent de l'istess sit.",
'viewsource' => 'Còdas surgent',
-'viewsourcefor' => 'de $1',
'protectedpagetext' => "Cula pagina chi l'è stata blucà per impedinn la mudifica.",
'viewsourcetext' => "L'è pussibil vèd e cupià el codes surgent de cula pagina chí:",
'editinginterface' => "'''Ocio''': Te see adree a mudifegà una pàgina che la se dröva per generà 'l test de l'interfacia del prugrama. Qualsìa mudìfega fada la cambierà l'interfacia de tüt i druvadur. Se te gh'hee intenzión de fà una tradüzión, per piasì cunsiderà la pussibilità de druvà [//translatewiki.net/wiki/Main_Page?setlang=lmo translatewiki.net], 'l pruget de lucalizazión de MediaWiki.",
@@ -947,8 +946,7 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada chÃ
'activeusers-from' => 'Fàm vedè i dupradur a partì da:',
# Special:Log/newusers
-'newuserlogpage' => 'Rrgister di druvat növ',
-'newuserlog-create-entry' => 'Druvadur növ',
+'newuserlogpage' => 'Rrgister di druvat növ',
# Special:ListGroupRights
'listgrouprights' => 'Dirit del grüp di druvat',
@@ -1018,7 +1016,6 @@ Per fà di cumünicazion de servizzi e per cercà jüt:
Per piasè, dà la cunferma che te gh'hee intenzión de andà inanz cun 'l scancelament, che te see al curent di cunseguenz, e che te see adree a fàl segónd i regulament de [[{{MediaWiki:Policy-url}}]].",
'actioncomplete' => 'Aziun cumpletada',
'deletedtext' => 'La pagina "$1" l\'è stada scancelada. Varda el $2 per una lista di ültim scancelaziun.',
-'deletedarticle' => 'l\'ha scancelaa "[[$1]]"',
'dellogpage' => 'Register di scancelament',
'deletionlog' => 'log di scancelament',
'reverted' => 'Bütada sü turna la versión de prima.',
@@ -1084,7 +1081,6 @@ Quest chì a hinn i regulazión curent per la pagina '''$1''':",
'undelete-nodiff' => "Per questa pagina gh'è nanca una revisiun precedenta.",
'undeletebtn' => 'Rimett a post',
'undeletelink' => 'Varda/büta indree',
-'undeletedarticle' => 'rimetüü a post "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 versiun}} rimetüü a post',
# Namespace form on various pages
@@ -1217,8 +1213,6 @@ Che 'l scerna, per piasè, un nom diferent per quel articul chì.",
'talkexists' => "'''La pagina a l'è stada spustada ben, ma'l s'è pudüü minga spustà la pagina de discüssión perchè gh'en è giamò un altra cun l'istess nom. Per piasè met insema i cuntegnüü di dò paginn a man'''",
'movedto' => 'spustaa vers:',
'movetalk' => 'Sposta anca la pagina de discüssión',
-'1movedto2' => '[[$1]] spustaa in [[$2]]',
-'1movedto2_redir' => '[[$1]] movuu in [[$2]] par redirezion',
'movelogpage' => 'Register di San Martin',
'movereason' => 'Resón:',
'revertmove' => "büta indree a 'mè che l'era",
@@ -1309,7 +1303,7 @@ Che 'l scerna, per piasè, un nom diferent per quel articul chì.",
'imagemaxsize' => 'Limitá i imagin süi pagin da descrizziún dii imagin a:',
'thumbsize' => 'Dimensiún diapusitiif:',
'file-info-size' => '$1 × $2 pixel, dimensión : $3, sort MIME: $4',
-'file-nohires' => '<small>Nissüna resulüzión püssee granda dispunibila.</small>',
+'file-nohires' => 'Nissüna resulüzión püssee granda dispunibila.',
'svg-long-desc' => "archivi in furmaa SVG, dimensión nominaj $1 × $2 pixel, dimensión de l'archivi: $3",
'show-big-image' => 'Versión a resolüzión volta',
diff --git a/languages/messages/MessagesLn.php b/languages/messages/MessagesLn.php
index b72a2366..14fcf89e 100644
--- a/languages/messages/MessagesLn.php
+++ b/languages/messages/MessagesLn.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Bombo (on ln.wikipedia.org)
* @author Eruedin
* @author Moyogo
*/
@@ -225,10 +226,9 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'enterlockreason' => 'Ópésa ntína mpé ntángo ya kokanisa ya bofúngi ya litákoli ya kabo',
'internalerror' => 'Zíko ya káti',
'internalerror_info' => 'Zíko ya káti: $1',
-'perfcached' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lÉ›lÉ”Ì tɛ̂.',
-'perfcachedts' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lÉ›lÉ”Ì tɛ̂. Bizalí bya $1.',
+'perfcached' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lÉ›lÉ”Ì tɛ̂. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lÉ›lÉ”Ì tɛ̂. Bizalí bya $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'viewsource' => 'KomÉ”Ìnisa mosólo',
-'viewsourcefor' => 'na $1',
# Login and logout pages
'yourname' => 'Nkómbó ya mosáleli:',
@@ -481,8 +481,7 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'categories' => 'Ndéngé',
# Special:Log/newusers
-'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
-'newuserlog-create-entry' => 'Konti ya mosáleli ya sika',
+'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
# E-mail user
'emailuser' => 'Kotíndela yÄ› mÉ›ÌlÉ›',
@@ -513,7 +512,6 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
# Delete
'deletepage' => 'Kolímwisa lonkásá loye',
-'deletedarticle' => 'elímwísí "[[$1]]"',
'dellogpage' => 'zuluná ya bolímwisi',
'deletionlog' => 'zuluná ya bolímwisi',
'deletecomment' => 'Ntína:',
@@ -545,7 +543,6 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
# Undelete
'undeletelink' => 'komɔnisa / kozóngisa',
'undeleteviewlink' => 'KomÉ”Ìnisa',
-'undeletedarticle' => 'Ezóngísí « [[$1]] »',
# Namespace form on various pages
'namespace' => 'Ntáká ya nkómbó :',
diff --git a/languages/messages/MessagesLo.php b/languages/messages/MessagesLo.php
index 58776568..efa1695e 100644
--- a/languages/messages/MessagesLo.php
+++ b/languages/messages/MessagesLo.php
@@ -338,7 +338,6 @@ $messages = array(
'cannotdelete' => 'ບà»à»ˆàºªàº²àº¡àº²àº”ລຶບໜ້າ ຫຼື ໄຟລ໌ ໄດ້. (ມັນອາດຈະຖືàºàº¥àº¶àºšà»‚ດàºà»ƒàºœàºœàº¹à»‰à»œàº¶à»ˆàº‡à»àº¥à»‰àº§.)',
'badtitle' => 'ຫົວຂà»à»‰àºšà»à»ˆàº–ືàºàº•à»‰àº­àº‡',
'viewsource' => 'ເບິ່ງຊອສ໌',
-'viewsourcefor' => 'ສຳຫຼັບ $1',
'namespaceprotected' => "ທ່ານບà»à»ˆà»„ດ້ຮັບອະນຸàºàº²àº” ໃຫ້ ດັດà»àºà»‰ ໜ້າ ໃນ '''$1'''.",
# Login and logout pages
@@ -410,8 +409,6 @@ $messages = array(
'showdiff' => 'ສະà»àº”ງສ່ວນຕ່າງ',
'anoneditwarning' => "'''ເຕືອນ:''' ທ່ານ ບà»à»ˆà»„ດ້ເຊັນເຂົ້າ. ທີ່ຢູ່ IP ຂອງ ທ່ານ ຈະຖືàºàºšàº±àº™àº—ຶàºà»„ວ້ ໃນ ປະຫວັດàºàº²àº™àº”ັດà»àºà»‰ ຂອງ ໜ້ານີ້.",
'blockedtitle' => 'ຜູ້ໃຊ້ຖືàºàº«à»‰àº²àº¡',
-'blockededitsource' => "ເນື້ອໃນ ຂອງ '''àºàº²àº™àº”ັດà»àº›àº‡à»‚ດàºàº—່ານ '''ຕà»à»ˆàºàº±àºš '''$1''' ມີດັ່ງລຸ່ມນີ້:",
-'whitelistedittitle' => 'ຕ້ອງເຊັນເຂົ້າ ຈຶ່ງຈະສາມາດດັດà»àºà»‰à»„ດ້',
'whitelistedittext' => 'ທ່ານ ຈະຕ້ອງ $1 ເພື່ອ ຈະດັດà»àºà»‰.',
'loginreqtitle' => 'ຈຳເປັນຕ້ອງ ເຊັນເຂົ້າ',
'loginreqlink' => 'ເຊັນເຂົ້າ',
@@ -693,10 +690,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'ສະà»àº”ງ',
# Special:Log/newusers
-'newuserlogpage' => 'ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµàºœàº¹à»‰à»ƒàºŠà»‰',
-'newuserlogpagetext' => 'ນີ້à»àº¡à»ˆàº™ ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡ ບັນຊີຜູ້ໃຊ້ໃà»à»ˆ',
-'newuserlog-create-entry' => 'ຜູ້ໃຊ້ໃà»à»ˆ',
-'newuserlog-create2-entry' => 'ໄດ້ສ້າງບັນຊີ ໃຫ້ $1',
+'newuserlogpage' => 'ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµàºœàº¹à»‰à»ƒàºŠà»‰',
+'newuserlogpagetext' => 'ນີ້à»àº¡à»ˆàº™ ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡ ບັນຊີຜູ້ໃຊ້ໃà»à»ˆ',
# E-mail user
'emailuser' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້',
@@ -740,7 +735,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Delete
'confirm' => 'ຢືນຢັນ',
'actioncomplete' => 'ສຳເລັດ',
-'deletedarticle' => 'ໄດ້ລຶບ "[[$1]]"',
'dellogpage' => 'ບັນທຶຠàºàº²àº™àº¥àº¶àºš',
'dellogpagetext' => 'ຂ້າງລຸ່ມ à»àº¡à»ˆàº™ ລາàºàºàº²àº™ àºàº²àº™àº¥àº¶àºšàº«àº¼à»‰àº²àºªàº¸àº”.',
'deletionlog' => 'ບັນທຶຠàºàº²àº™àº¥àº¶àºš',
@@ -834,8 +828,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
àºàº°àº¥àº¸àº™àº²à»€àº¥àº·àº­àºàºŠàº·à»ˆàº­àº·à»ˆàº™.',
'movedto' => 'ໄດ້ຖືàºàºà»‰àº²àºà»„ປ',
'movetalk' => 'àºà»‰àº²àºàº—ັງ ໜ້າສົນທະນາ ທີ່ àºà»ˆàº½àº§àºžàº±àº™.',
-'1movedto2' => '[[$1]] àºà»‰àº²àºà»„ປ [[$2]]',
-'1movedto2_redir' => '[[$1]] àºà»‰àº²àºà»„ປ [[$2]] ທັບ àºàº²àº™à»‚ອນໜ້າ',
'movelogpage' => 'ບັນທຶàºàºàº²àº™àºà»‰àº²àº',
'movereason' => 'ເຫດຜົນ:',
'delete_and_move' => 'ລຶບ à»àº¥àº° àºà»‰àº²àº',
diff --git a/languages/messages/MessagesLoz.php b/languages/messages/MessagesLoz.php
index c5c75f22..772deef7 100644
--- a/languages/messages/MessagesLoz.php
+++ b/languages/messages/MessagesLoz.php
@@ -269,7 +269,6 @@ $messages = array(
Fung'ksyun: $1<br />
Query: $2",
'viewsource' => "Kamukile ng'i",
-'viewsourcefor' => 'di $1',
'viewsourcetext' => 'A sa kamukile wiki-selt di bye petulo:',
'sqlhidden' => '(SQL query sa cwankekile)',
@@ -373,8 +372,6 @@ $1 bolok a. Lyangutukezireason sa ''$2''.
A bulelezi $1/[[{{MediaWiki:Grouppage-sysop}}|xetewi sesop]] bolok.
A ni sebilize 'meli sebelu' ka a ni afi adresi di meli kwa zwa [[Special:Preferences|petohoni]] e no sa bolok di sebelize.
A IP sa $3, e ID di bolok sa #$5. Bulelezi IP e ID kwa bukizisize.",
-'blockedoriginalsource' => "Olige di '''$1''' sa kamukile:",
-'blockededitsource' => "Selt di '''zwa hloli ye ng'i''' di '''$1''' sa kamukile:",
'whitelistedittext' => "A sa $1 di hloli ye ng'i petulo.",
'nosuchsectiontitle' => 'Ni di lyangutukezi',
'loginreqlink' => 'menuhile',
@@ -756,7 +753,6 @@ A sa afi kulobala di zwa mukoloko di kentezi, tampi \"ngambu kentezi\".",
'confirmdeletetext' => 'A sa afi kulobala petulo e bundau. A sa ukisize a sa ni bufosi e a sa iki di [[{{MediaWiki:Policy-url}}|polisi]].',
'actioncomplete' => 'Sa afi',
'deletedtext' => '"$1" sa afi kulobala. Fatukile $2 di desu di afi kulobala nca.',
-'deletedarticle' => 'sa afi kulobala "[[$1]]"',
'dellogpage' => 'Desu di afi kulobala',
'deletecomment' => 'Lyangutukezi:',
'deleteotherreason' => 'Xetewi/ewi lyangutukezi:',
@@ -808,7 +804,6 @@ Petohoni di petulo '''$1''' sa:",
'undeletebtn' => 'Ati-afi kulobala',
'undeletereset' => 'Lisetize',
'undeletecomment' => 'Lyangutukezi:',
-'undeletedarticle' => 'sa ati-afi kulobala "[[$1]]"',
'undelete-search-box' => 'Fatukile afi kulobala petulo',
'undelete-search-prefix' => 'Kamukile petulo di:',
'undelete-search-submit' => 'Fatukile',
@@ -889,8 +884,6 @@ Teri yaki, a nyanganyisize.",
'talkexists' => "'''No bufosi di nyanganyisize petulo, bufosi di nyanganyisize bulelezi, tubi hani.'''",
'movedto' => 'nyanganyisize di',
'movetalk' => 'Nyanganyisize petulo di bulelezi',
-'1movedto2' => '[[$1]] nyanganyisize di [[$2]]',
-'1movedto2_redir' => '[[$1]] nyanganyisize di [[$2]] alo petulo abezi',
'movelogpage' => 'Desu di nyanganyisize',
'movelogpagetext' => 'Bye mukoloko sa mukoloko di petulo nyanganyisize.',
'movereason' => 'Lyangutukezi:',
@@ -984,9 +977,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'siteuser' => '{{SITENAME}} sebelu $1',
'siteusers' => '{{SITENAME}} sebelu $1',
-# Patrol log
-'patrol-log-auto' => '(auto)',
-
# Image deletion
'filedeleteerror-short' => 'Bufosi di afi kulobala di media/imegi: $1',
'filedeleteerror-long' => 'Bufosi sa, abi sa afi kulobala di media/imegi:
@@ -1000,7 +990,7 @@ $1',
# Media information
'widthheightpage' => '$1 × $2, $3 petulo',
'file-info-size' => '$1 × $2 pixel, imegi: $3, MIME type: $4',
-'file-nohires' => '<small>A sa risolusi aku balise.</small>',
+'file-nohires' => 'A sa risolusi aku balise.',
'svg-long-desc' => 'SVG imegi, nominali $1 × $2 pixel, imega: $3',
'show-big-image' => 'Risolusi bakisize',
@@ -1047,9 +1037,6 @@ Xete ling'ki kwa lina sa konsidisize desepo. Petulo dimedi inlinenikusize.",
'namespacesall' => 'xeti',
'monthsall' => 'xeti',
-# Trackbacks
-'trackbackremove' => '([$1 afi kulobala])',
-
# action=purge
'confirm_purge_button' => 'Afi',
diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
index 5a809bb1..b487a540 100644
--- a/languages/messages/MessagesLt.php
+++ b/languages/messages/MessagesLt.php
@@ -138,28 +138,28 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PERADRESAVIMAS', '#REDIRECT' ),
- 'notoc' => array( '0', '__BETURIN__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEGALERIJOS__', '__NOGALLERY__' ),
- 'toc' => array( '0', '__TURINYS__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEREDAGSEKC__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'DABARTINISMÄ–NESIS', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'DABARTINIOMÄ–NESIOPAVADINIMAS', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'DABARTINÄ–DIENA', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DABARTINÄ–DIENA2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'DABARTINÄ–SDIENOSPAVADINIMAS', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'DABARTINIAIMETAI', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'DABARTINISLAIKAS', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'DABARTINÄ–VALANDA', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'PUSLAPIŲSKAIČIUS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'STRAIPSNIŲSKAIČIUS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FAILŲSKAIČIUS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NAUDOTOJŲSKAIČIUS', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'KEITIMŲSKAIČIUS', 'NUMBEROFEDITS' ),
- 'img_thumbnail' => array( '1', 'miniatiūra', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniatiūra=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'dešinėje', 'right' ),
- 'img_left' => array( '1', 'kairÄ—je', 'left' ),
+ 'redirect' => array( '0', '#PERADRESAVIMAS', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BETURIN__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEGALERIJOS__', '__NOGALLERY__' ),
+ 'toc' => array( '0', '__TURINYS__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEREDAGSEKC__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'DABARTINISMÄ–NESIS', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'DABARTINIOMÄ–NESIOPAVADINIMAS', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'DABARTINÄ–DIENA', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DABARTINÄ–DIENA2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'DABARTINÄ–SDIENOSPAVADINIMAS', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'DABARTINIAIMETAI', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'DABARTINISLAIKAS', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'DABARTINÄ–VALANDA', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'PUSLAPIŲSKAIČIUS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'STRAIPSNIŲSKAIČIUS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FAILŲSKAIČIUS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NAUDOTOJŲSKAIČIUS', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'KEITIMŲSKAIČIUS', 'NUMBEROFEDITS' ),
+ 'img_thumbnail' => array( '1', 'miniatiūra', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatiūra=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'dešinėje', 'right' ),
+ 'img_left' => array( '1', 'kairÄ—je', 'left' ),
);
$fallback8bitEncoding = 'windows-1257';
@@ -535,20 +535,22 @@ Prašome apie tai pranešti [[Special:ListUsers/sysop|administratoriui]], nepami
'badarticleerror' => 'Veiksmas negalimas Å¡iam puslapiui.',
'cannotdelete' => 'Nepavyko ištrinti puslapio ar failo „$1“.
Galbūt jį jau kažkas kitas ištrynė.',
+'cannotdelete-title' => 'Negalite ištrinti puslapio "$1"',
'badtitle' => 'Blogas pavadinimas',
'badtitletext' => 'Nurodytas puslapio pavadinimas buvo neleistinas, tuÅ¡Äias arba neteisingai sujungtas tarpkalbinis arba tarpprojektinis pavadinimas. Jame gali bÅ«ti vienas ar daugiau simbolių, neleistinų pavadinimuose',
-'perfcached' => 'Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi.',
-'perfcachedts' => 'Rodoma išsaugota duomenų kopija, kuri buvo atnaujinta $1.',
+'perfcached' => 'Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi. Maksimaliai $1 {{PLURAL:$1|rezultatas|rezultatai|rezultatų}} yra saugoma.',
+'perfcachedts' => 'Rodoma išsaugota duomenų kopija, kuri buvo atnaujinta $2 $3. Maksimaliai $4 {{PLURAL:$4|rezultatas|rezultatai|rezultatų}} yra saugoma.',
'querypage-no-updates' => 'Atnaujinimai Å¡iam puslapiui dabar yra iÅ¡jungti. Duomenys Äia dabar nebus atnaujinti.',
'wrong_wfQuery_params' => 'Neteisingi parametrai į funkciją wfQuery()<br />
Funkcija: $1<br />
Užklausa: $2',
'viewsource' => 'Žiūrėti kodą',
-'viewsourcefor' => 'puslapiui $1',
+'viewsource-title' => 'Peržiūrėti šaltinį $1',
'actionthrottled' => 'Veiksmas apribotas',
'actionthrottledtext' => 'Kad bÅ«tų apsisaugota nuo reklamų, jums neleidžiama daug kartų atlikti šį veiksmÄ… per trumpÄ… laiko tarpÄ…, bet jÅ«s pasiekÄ—te šį limitÄ…. PraÅ¡ome vÄ—l pamÄ—ginti po kelių minuÄių.',
'protectedpagetext' => 'Šis puslapis yra užrakintas, saugant jį nuo redagavimo.',
'viewsourcetext' => 'Jūs galite žiūrėti ir kopijuoti puslapio kodą:',
+'viewyourtext' => "Jūs galite matyti ir kopijuoti '''savo redagavimų''' tekstą į šį puslapį:",
'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 naudojams. Jei norite išversti, siūlome pasinaudoti [//translatewiki.net/wiki/Main_Page?setlang=lt „translatewiki.net“], „MediaWiki“ lokalizacijos projektu.",
'sqlhidden' => '(SQL užklausa paslėpta)',
@@ -651,6 +653,7 @@ nebus siunÄiami nei vienai žemiau iÅ¡vardintai paslaugai.',
'emailconfirmlink' => 'Patvirtinkite savo el. pašto adresą',
'invalidemailaddress' => 'El. pašto adresas negali būti priimtas, nes atrodo, kad jis nėra teisingo formato.
PraÅ¡ome įvesti gerai suformuotÄ… adresÄ… arba palikite tÄ… laukelį tuÅ¡ÄiÄ….',
+'cannotchangeemail' => 'Paskyros e-mail adresas Å¡iame viki negali bÅ«ti keiÄiamas.',
'accountcreated' => 'Paskyra sukurta',
'accountcreatedtext' => 'Naudotojo paskyra $1 buvo sukurta.',
'createaccount-title' => '{{SITENAME}} paskyros kūrimas',
@@ -667,6 +670,7 @@ Palaukite prieš bandant vėl.',
# E-mail sending
'php-mail-error-unknown' => 'Nežinoma klaida PHP mail() funkcijoje',
+'user-mail-no-addy' => 'Bandyta išsiųsti elektroninį laišką be el. pašto adreso.',
# Change password dialog
'resetpass' => 'Keisti slaptažodį',
@@ -687,20 +691,35 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
'resetpass-temp-password' => 'Laikinas slaptažodis:',
# Special:PasswordReset
-'passwordreset' => 'Atstatyti slaptažodį',
-'passwordreset-text' => 'Užpildykite šią formą, norėdami gauti el priminimas jūsų sąskaitos informaciją.',
-'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-username' => 'Naudotojo vardas:',
-'passwordreset-domain' => 'Domenas:',
-'passwordreset-email' => 'E-pašto adresas:',
-'passwordreset-emailtitle' => 'Paskyros informacija apie {{sitename}}',
-'passwordreset-emailtext-ip' => 'Kažkas (tikriausiai jūs, IP adresu $1 ) paprašė informacijos priminimas jūsų! N! sąskaitą {{sitename}} ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}} N!! N!, susijusių su šiuo e-pašto adresą!: N!! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai}} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
-'passwordreset-emailtext-user' => 'Vartotojo $1 d. {{sitename}} prašoma informacija priminimas jūsų sąskaitos {{sitename}}! N! ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}}, susijusių su šiuo e-pašto adresą:! N! N! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai }} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
-'passwordreset-emailelement' => 'Naudotojo vardas: $1
+'passwordreset' => 'Atstatyti slaptažodį',
+'passwordreset-text' => 'Užpildykite šią formą, norėdami gauti el priminimas jūsų sąskaitos informaciją.',
+'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-username' => 'Naudotojo vardas:',
+'passwordreset-domain' => 'Domenas:',
+'passwordreset-capture' => 'Peržiūrėti galutinį e-mail laišką?',
+'passwordreset-capture-help' => 'Jei jÅ«s Äia pažymÄ—site, tai e-mail laiÅ¡kas (su laikinuoju slaptažodžiu) bus parodytas jums prieÅ¡ iÅ¡siunÄiant jį naudotojui.',
+'passwordreset-email' => 'E-pašto adresas:',
+'passwordreset-emailtitle' => 'Paskyros informacija apie {{sitename}}',
+'passwordreset-emailtext-ip' => 'Kažkas (tikriausiai jūs, IP adresu $1 ) paprašė informacijos priminimas jūsų! N! sąskaitą {{sitename}} ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}} N!! N!, susijusių su šiuo e-pašto adresą!: N!! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai}} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
+'passwordreset-emailtext-user' => 'Vartotojo $1 d. {{sitename}} prašoma informacija priminimas jūsų sąskaitos {{sitename}}! N! ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}}, susijusių su šiuo e-pašto adresą:! N! N! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai }} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
+'passwordreset-emailelement' => 'Naudotojo vardas: $1
Laikinas slaptažodis: $2',
-'passwordreset-emailsent' => 'Priminimo laiškas buvo išsiųstas.',
+'passwordreset-emailsent' => 'Priminimo laiškas buvo išsiųstas.',
+'passwordreset-emailsent-capture' => 'Priminimo e-mail laiškas bus pasiųstas, toks koks parodytas.',
+'passwordreset-emailerror-capture' => 'Priminimo e-mail laiškas buvo sugeneruotas, toks koks parodytas, bet pasiuntimas naudotojui buvo nesėkmingas: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Pakeisti el. pašto adresą',
+'changeemail-header' => 'Keisti paskyros el. pašto adresą',
+'changeemail-text' => 'Užpildykite šią formą, jei norite pakeisti savo el. pašto adresą. Jums reikės įvesti savo slaptažodį, siekiant patvirtinti šį pakeitimą.',
+'changeemail-no-info' => 'Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.',
+'changeemail-oldemail' => 'Dabartinis el. pašto adresas:',
+'changeemail-newemail' => 'Naujas el. pašto adresas:',
+'changeemail-none' => '(nÄ—ra)',
+'changeemail-submit' => 'Keisti el. pašto adresą',
+'changeemail-cancel' => 'Atšaukti',
# Edit page toolbar
'bold_sample' => 'Paryškintas tekstas',
@@ -769,9 +788,6 @@ Jūs negalite naudotis funkcija „Rašyti laišką šiam naudotojui“, jei nes
Jūsų IP adresas yra $3, blokavimo ID yra $5.
Prašome nurodyti šiuos duomenis visais atvejais, kai kreipiatės dėl blokavimo.",
'blockednoreason' => 'priežastis nenurodyta',
-'blockedoriginalsource' => "Žemiau yra rodomas '''$1''' turinys:",
-'blockededitsource' => "''Jūsų keitimų'' tekstas puslapiui '''$1''' yra rodomas žemiau:",
-'whitelistedittitle' => 'Norint redaguoti reikia prisijungti',
'whitelistedittext' => 'JÅ«s turite $1, kad redaguotumÄ—te puslapius.',
'confirmedittext' => 'Jums reikia patvirtinti el. pašto adresą, prieš redaguojant puslapius.
Prašome nurodyti ir patvirtinti jūsų el. pašto adresą per jūsų [[Special:Preferences|naudotojo nustatymus]].',
@@ -853,8 +869,7 @@ JÅ«s taip pat pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas turinys arba kopijuot
Taip pat jÅ«s pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas tekstas arba kopijuotas
iš viešų ar panašių nemokamų šaltinių (detaliau - $1).
'''NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!'''",
-'longpageerror' => "'''KLAIDA: Tekstas, kurį pateikėte, yra $1 kilobaitų ilgio,
-kuris yra didesnis nei daugiausiai leistini $2 kilobaitai. Jis nebus išsaugotas.'''",
+'longpageerror' => "'''KLAIDA: Tekstas, kurį pateikėte, yra $1 {{PLURAL:$1|kilobaito|kilobaitų|kilobaitų}} ilgio, tai yra didesnis nei yra leistina. Yra leidžiami tiktai $2 {{PLURAL:$2|kilobaitas|kilobaitai|kilobaitų}}.''' Jis nebus išsaugotas.",
'readonlywarning' => "'''DÄ–MESIO: Duomenų bazÄ— buvo užrakinta techninei profilaktikai, todÄ—l Å¡iuo metu negalÄ—site iÅ¡saugoti savo pakeitimų. SiÅ«lome nusikopijuoti tekstÄ… į tekstinį failÄ… ir vÄ—liau jį Äia iÅ¡saugoti.'''
Ją užrakinusio administratoriaus paaiškinimas: $1",
@@ -1022,8 +1037,6 @@ Kiti administratoriai iÅ¡ {{SITENAME}} vistiek galÄ—s pasiekti paslÄ—ptÄ… turinÄ
'revdelete-unsuppress' => 'Å alinti apribojimus atkurtose versijose',
'revdelete-log' => 'Priežastis:',
'revdelete-submit' => 'Taikyti {{PLURAL:$1|pasirinktai versijai|pasirinktoms versijoms}}',
-'revdelete-logentry' => 'pakeistas [[$1]] versijos matomumas',
-'logdelete-logentry' => 'pakeistas [[$1]] įvykio matomumas',
'revdelete-success' => "'''Versijos matomumas sÄ—kmingai pakeistas.'''",
'revdelete-failure' => "'''Versijos rodomumas negali būti nustatytas:'''
$1",
@@ -1035,15 +1048,6 @@ $1",
'revdel-restore-visible' => 'Matomos versijos',
'pagehist' => 'Puslapio istorija',
'deletedhist' => 'IÅ¡trinta istorija',
-'revdelete-content' => 'turinys',
-'revdelete-summary' => 'keitimo komentaras',
-'revdelete-uname' => 'naudotojo vardas',
-'revdelete-restricted' => 'uždėti apribojimai administratoriams',
-'revdelete-unrestricted' => 'pašalinti apribojimai administratoriams',
-'revdelete-hid' => 'slÄ—pti $1',
-'revdelete-unhid' => 'atslÄ—pti $1',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|versijai|versijoms|versijų}}',
-'logdelete-log-message' => '$1 $2 {{PLURAL:$2|įvykiui|įvykiams|įvykių}}',
'revdelete-hide-current' => 'Klaida slepiant $1, $2 keitimÄ…: tai yra dabartinÄ— versija.
Ji negali būti paslėpta.',
'revdelete-show-no-access' => 'Klaida rodant $1, $2 keitimą: jis pažymėtas ženklu „apribotas“.
@@ -1200,12 +1204,14 @@ Prašome patikrinti sąrašus.',
'prefs-rc' => 'Naujausi keitimai',
'prefs-watchlist' => 'Stebimų sąrašas',
'prefs-watchlist-days' => 'Dienos rodomos stebimųjų sąraše:',
-'prefs-watchlist-days-max' => 'Daugiausiai 7 dienos',
+'prefs-watchlist-days-max' => 'Daugiausiai 7 {{PLURAL:$1|diena|dienos|dienų}}',
'prefs-watchlist-edits' => 'Kiek daugiausia keitimų rodyti išplėstiniame stebimųjų sąraše:',
'prefs-watchlist-edits-max' => 'Didžiausias skaiÄius: 1000',
'prefs-watchlist-token' => 'Stebimųjų sąrašo raktas:',
'prefs-misc' => 'Įvairūs nustatymai',
'prefs-resetpass' => 'Keisti slaptažodį',
+'prefs-changeemail' => 'Keisti el. pašto adresą',
+'prefs-setemail' => 'Nustatyti el. pašto adresą',
'prefs-email' => 'El. pašto nustatymai',
'prefs-rendering' => 'IÅ¡vaizda',
'saveprefs' => 'IÅ¡saugoti',
@@ -1265,6 +1271,7 @@ Tai nebeatšaukiama.',
'yourrealname' => 'Tikrasis vardas:',
'yourlanguage' => 'SÄ…sajos kalba:',
'yourvariant' => 'Kalbos variantas:',
+'prefs-help-variant' => 'Puslapio tūrinis šioje viki yra rodomas, naudojant jūsų pasirinktą variantą arba rašymo kryptį.',
'yournick' => 'Parašas:',
'prefs-help-signature' => 'Komentarai aptarimų puslapiuose turėtų būti pasirašyti su „<nowiki>~~~~</nowiki>“, kuris bus paverstas į jūsų parašą ir laiką.',
'badsig' => 'Neteisingas parašas; patikrinkite HTML žymes.',
@@ -1306,7 +1313,7 @@ Jei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.',
'userrights-lookup-user' => 'Tvarkyti naudotojo grupes',
'userrights-user-editname' => 'Įveskite naudotojo vardą:',
'editusergroup' => 'Redaguoti naudotojo grupes',
-'editinguser' => "Taisomos naudotojo '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])
+'editinguser' => "Taisomos naudotojo '''[[User:$1|$1]]''' $2
teisÄ—s",
'userrights-editusergroup' => 'Redaguoti naudotojų grupes',
'saveusergroups' => 'Saugoti naudotojų grupes',
@@ -1401,13 +1408,13 @@ teisÄ—s",
'right-autopatrol' => 'Keitimai automatiškai pažymimi kaip patikrinti',
'right-patrolmarks' => 'Atžymų apie patikrą peržiūra naujausiuose keitimuose',
'right-unwatchedpages' => 'Žiūrėti nestebimų puslapių sąrašą',
-'right-trackback' => 'Siųsti „Trackback“ nuorodą',
'right-mergehistory' => 'Sulieti puslapių istorijas',
'right-userrights' => 'Redaguoti visų naudotojų teises',
'right-userrights-interwiki' => 'Keisti naudotojų teises kitose wiki svetainėse',
'right-siteadmin' => 'Atrakinti ir užrakinti duomenų bazę',
'right-override-export-depth' => 'Eksportuoti puslapius įtraukiant susietus puslapius iki 5 lygio gylio',
'right-sendemail' => 'Siųsti el. laišką kitiems naudotojams',
+'right-passwordreset' => 'Peržiūrėti slaptažodžio pakeitimo e-mail laiškus',
# User rights log
'rightslog' => 'Naudotojų teisių istorija',
@@ -1441,16 +1448,17 @@ teisÄ—s",
'action-suppressionlog' => 'peržiūrėti šį privatų registrą',
'action-block' => 'neleisti Å¡iam naudotojui redaguoti',
'action-protect' => 'pakeisti apsaugos lygius Å¡iam puslapiui',
+'action-rollback' => 'greitai atmesti paskutinio naudotojo atliktų tam tikro puslapio pakeitimų',
'action-import' => 'importuoti šį puslapį iš kitos wiki',
'action-importupload' => 'importuoti šį puslapį iš įkelto failo',
'action-patrol' => 'pažymėti kitų keitimus kaip patikrintus',
'action-autopatrol' => 'savo keitimų pažymėjimas patikrintais',
'action-unwatchedpages' => 'žiūrėti nestebimų puslapių sąrašą',
-'action-trackback' => 'priimti trackback nuorodÄ…',
'action-mergehistory' => 'sulieti Å¡io puslapio istorijÄ…',
'action-userrights' => 'keisti visų naudotojų teises',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}',
@@ -1482,6 +1490,7 @@ teisÄ—s",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|stebintis naudotojas|stebintys naudotojai|stebinÄių naudotojų}}]',
'rc_categories' => 'Rodyti tik šias kategorijas (atskirkite naudodami „|“)',
'rc_categories_any' => 'Bet kokia',
+'rc-change-size-new' => '$1 {{PLURAL:$1|baitas|baitai|baitų}} po pakeitimo',
'newsectionsummary' => '/* $1 */ naujas skyrius',
'rc-enhanced-expand' => 'Rodyti detales (reikia JavaScript)',
'rc-enhanced-hide' => 'SlÄ—pti detales',
@@ -1534,6 +1543,7 @@ Norėdami panaudoti įkeltą failą puslapyje, naudokite tokias nuorodas:
'ignorewarnings' => 'Ignuoruoti bet kokius įspėjimus',
'minlength1' => 'Failo pavadinimas turi būti bent viena raidė.',
'illegalfilename' => 'Failo varde „$1“ yra simbolių, neleidžiamų puslapio pavadinimuose. Prašome pervadint failą ir mėginkite įkelti jį iš naujo.',
+'filename-toolong' => 'Failo vardas negali būti ilgesnis nei 240 baitų.',
'badfilename' => 'Failo pavadinimas pakeistas į „$1“.',
'filetype-mime-mismatch' => 'Failo plėtinys „.$1“ neatitinka nustatyto šio failo MIME tipo($2).',
'filetype-badmime' => 'Neleidžiama įkelti „$1“ MIME tipo failų.',
@@ -1624,6 +1634,37 @@ Prašome susisiekti su [[Special:ListUsers/sysop|sistemos administratoriumi]].',
'upload-unknown-size' => 'Nežinomas dydis',
'upload-http-error' => 'Įvyko HTTP klaida: $1',
+# File backend
+'backend-fail-stream' => 'Negali būti apdorotas failas $1.',
+'backend-fail-backup' => 'Negali būti išsaugotas failas $1.',
+'backend-fail-notexists' => 'Failas $1 neegzistuoja.',
+'backend-fail-hashes' => 'Negalima gauti failo maišos palyginimui.',
+'backend-fail-notsame' => 'Jau egzistuoja neidentiškas failas $1.',
+'backend-fail-invalidpath' => '$1 yra neteisinga saugojimo nuoroda.',
+'backend-fail-delete' => 'Negalima panaikinti failo $1.',
+'backend-fail-alreadyexists' => 'Failas $1 jau egzistuoja.',
+'backend-fail-store' => 'Negalima išsaugoti failo $1 kaip $2.',
+'backend-fail-copy' => 'Negalima nukopijuoti failo $1 į $2.',
+'backend-fail-move' => 'Negalima pervadinti failo $1 į $2.',
+'backend-fail-opentemp' => 'Negalima atidaryti laikino failo.',
+'backend-fail-writetemp' => 'Negalima rašyti į laikiną failą.',
+'backend-fail-closetemp' => 'Negalima uždaryti laikino failo.',
+'backend-fail-read' => 'Negalima nuskaityti failo $1.',
+'backend-fail-create' => 'Negalima sukurti failo $1.',
+'backend-fail-readonly' => 'Galutinė saugykla "$1" dabar yra skirta tik skaitymui. Buvo nurodyta priežastis: "$2"',
+'backend-fail-synced' => 'Failas "$1", esantis vidinėje galutinėje saugykloje, yra pažymėtas kaip nepilnas.',
+'backend-fail-connect' => 'Negalima prisijungti prie galutinÄ—s saugyklos "$1".',
+'backend-fail-internal' => 'Nežinoma klaida įvyko galutinėje saugykloje "$1".',
+'backend-fail-contenttype' => 'Negalima nustatyti failo turinio tipo, kuris saugomas "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Negalima atrakinti "$1", nes jis nėra užrakintas.',
+'lockmanager-fail-closelock' => 'Negalima uždaryti rakinimų failo dėl "$1".',
+'lockmanager-fail-deletelock' => 'Negalima panaikinti rakinimų failo dėl "$1".',
+'lockmanager-fail-acquirelock' => 'Negalima nustatyti rakinimo dÄ—l "$1".',
+'lockmanager-fail-openlock' => 'Negalima atidaryti rakinimų failo dėl "$1".',
+'lockmanager-fail-releaselock' => 'Negalima panaikinti rakinimo dÄ—l "$1".',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Įvyko klaida atidarant ZIP patikrinimus failą.',
'zip-wrong-format' => 'Nurodytas failas nÄ—ra ZIP failas.',
@@ -1744,23 +1785,24 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
'filerevert-badversion' => 'Nėra jokių ankstesnių vietinių šio failo versijų su pateiktu laiku.',
# File deletion
-'filedelete' => 'Trinti $1',
-'filedelete-legend' => 'Trinti failÄ…',
-'filedelete-intro' => "Jūs ketinate ištrinti failą '''[[Media:$1|$1]]''' su visa istorija.",
-'filedelete-intro-old' => '<span class="plainlinks">JÅ«s trinate \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3, $2] versijÄ….</span>',
-'filedelete-comment' => 'Priežastis:',
-'filedelete-submit' => 'Trinti',
-'filedelete-success' => "'''$1''' buvo ištrintas.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' $3, $2 versija buvo ištrinta.",
-'filedelete-nofile' => "'''$1''' neegzistuoja.",
-'filedelete-nofile-old' => "NÄ—ra jokios '''$1''' suarchyvuotos versijos su nurodytais atributais.",
-'filedelete-otherreason' => 'Kita/papildoma priežastis:',
-'filedelete-reason-otherlist' => 'Kita priežastis',
-'filedelete-reason-dropdown' => '*Dažnos trynimo priežastys
+'filedelete' => 'Trinti $1',
+'filedelete-legend' => 'Trinti failÄ…',
+'filedelete-intro' => "Jūs ketinate ištrinti failą '''[[Media:$1|$1]]''' su visa istorija.",
+'filedelete-intro-old' => '<span class="plainlinks">JÅ«s trinate \'\'\'[[Media:$1|$1]]\'\'\' [$4 $3, $2] versijÄ….</span>',
+'filedelete-comment' => 'Priežastis:',
+'filedelete-submit' => 'Trinti',
+'filedelete-success' => "'''$1''' buvo ištrintas.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' $3, $2 versija buvo ištrinta.",
+'filedelete-nofile' => "'''$1''' neegzistuoja.",
+'filedelete-nofile-old' => "NÄ—ra jokios '''$1''' suarchyvuotos versijos su nurodytais atributais.",
+'filedelete-otherreason' => 'Kita/papildoma priežastis:',
+'filedelete-reason-otherlist' => 'Kita priežastis',
+'filedelete-reason-dropdown' => '*Dažnos trynimo priežastys
** Autorystės teisių pažeidimai
** Pasikartojantis failas',
-'filedelete-edit-reasonlist' => 'Keisti trynimo priežastis',
-'filedelete-maintenance' => 'Failų trynimas ir atkūrimas laikinai išjungtas dėl profilaktikos.',
+'filedelete-edit-reasonlist' => 'Keisti trynimo priežastis',
+'filedelete-maintenance' => 'Failų trynimas ir atkūrimas laikinai išjungtas dėl profilaktikos.',
+'filedelete-maintenance-title' => 'Negalima panaikinti failo',
# MIME search
'mimesearch' => 'MIME paieška',
@@ -1857,6 +1899,8 @@ Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, tai
'wantedpages' => 'Geidžiamiausi puslapiai',
'wantedpages-badtitle' => 'Neleistinas pavadinimas rezultatų rinkinyje: $1',
'wantedfiles' => 'Trokštami failai',
+'wantedfiletext-cat' => 'Sekantys failai yra naudojami, bet neegzistuoja. ÄŒia failai iÅ¡ iÅ¡orinių saugyklų gali bÅ«ti iÅ¡vardinti, nors jie jose ir egzistuoja. Failai netenkinantys Å¡ių sÄ…lygų gali bÅ«ti <del>perbraukti</del>. Papildomai peržiÅ«rÄ—kite [[:$1|puslapius]], kuriuose yra naudojami Äia iÅ¡vardinti neegzistuojantys failai.',
+'wantedfiletext-nocat' => 'Sekantys failai yra naudojami, bet neegzistuoja. Čia failai iš išorinių saugyklų gali būti išvardinti, nors jie jose ir egzistuoja. Failai netenkinantys šių sąlygų gali būti <del>perbraukti</del>.',
'wantedtemplates' => 'Trokštami šablonai',
'mostlinked' => 'Daugiausiai nurodomi puslapiai',
'mostlinkedcategories' => 'Daugiausiai nurodomos kategorijos',
@@ -1865,6 +1909,7 @@ Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, tai
'mostimages' => 'Daugiausiai nurodomi failai',
'mostrevisions' => 'Puslapiai su daugiausiai keitimų',
'prefixindex' => 'Visi puslapiai pagal pavadinimo pradžią',
+'prefixindex-namespace' => 'Visi puslapiai prasidedantys ($1 vardų sritis)',
'shortpages' => 'Trumpiausi puslapiai',
'longpages' => 'Ilgiausi puslapiai',
'deadendpages' => 'Puslapiai-aklavietÄ—s',
@@ -1881,7 +1926,7 @@ Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, tai
'listusers-editsonly' => 'Rodyti tik keitimus atlikusius naudotojus',
'listusers-creationsort' => 'Rodyti pagal paskyros sukūrimo datą',
'usereditcount' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}',
-'usercreated' => 'Paskyra sukurta $1 $2',
+'usercreated' => '{{GENDER:$3|Naudotojo|Naudotojos|Naudotojo}} $3 paskyra sukurta $1 $2',
'newpages' => 'Naujausi puslapiai',
'newpages-username' => 'Naudotojo vardas:',
'ancientpages' => 'Seniausi puslapiai',
@@ -1974,12 +2019,8 @@ Palaikomi protokolai: <tt>$1</tt> (nei vieno iš jų nenurodykite paieškoje).',
'activeusers-noresult' => 'Nerasta jokių naudotojų.',
# Special:Log/newusers
-'newuserlogpage' => 'PrisiregistravÄ™ naudotojai',
-'newuserlogpagetext' => 'Tai naudotojų kūrimo sąrašas.',
-'newuserlog-byemail' => 'slaptažodis nusiųstas elektroniniu paštu',
-'newuserlog-create-entry' => 'Naujas naudotojas',
-'newuserlog-create2-entry' => 'sukurta nauja paskyra $1',
-'newuserlog-autocreate-entry' => 'Paskyra sukurta automatiškai',
+'newuserlogpage' => 'PrisiregistravÄ™ naudotojai',
+'newuserlogpagetext' => 'Tai naudotojų kūrimo sąrašas.',
# Special:ListGroupRights
'listgrouprights' => 'Naudotojų grupių teisės',
@@ -2008,7 +2049,7 @@ Palaikomi protokolai: <tt>$1</tt> (nei vieno iš jų nenurodykite paieškoje).',
'emailpagetext' => 'Jūs gali pasinaudoti šia forma norėdami nusiųsti el. laišką šiam naudotojui.
El. pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.',
'usermailererror' => 'Pašto objektas grąžino klaidą:',
-'defemailsubject' => '{{SITENAME}} el. paštas',
+'defemailsubject' => '{{SITENAME}} el. pašto iš vartotojo " $1 "',
'usermaildisabled' => 'Naudotojo elektroninis paštas išjungtas',
'usermaildisabledtext' => 'Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.',
'noemailtitle' => 'Nėra el. pašto adreso',
@@ -2063,7 +2104,7 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
'watchlistcontains' => 'Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.',
'iteminvalidname' => 'Problema su elementu „$1“, neteisingas vardas...',
-'wlnote' => "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}.",
+'wlnote' => "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
'wlshowlast' => 'Rodyti paskutinių $1 valandų, $2 dienų ar $3 pakeitimus',
'watchlist-options' => 'Stebimųjų sąrašo parinktys',
@@ -2129,8 +2170,6 @@ Prašome patvirtinti, kad jūs tikrai norite tai padaryti, žinote apie galimus
'actionfailed' => 'Veiksmas atšauktas',
'deletedtext' => '„$1“ ištrintas.
Paskutinių šalinimų istorija - $2.',
-'deletedarticle' => 'ištrynė „[[$1]]“',
-'suppressedarticle' => 'apribotas „[[$1]]“',
'dellogpage' => 'Šalinimų istorija',
'dellogpagetext' => 'Žemiau pateikiamas paskutinių trynimų sąrašas.',
'deletionlog' => 'šalinimų istorija',
@@ -2176,7 +2215,10 @@ Dabar veikianÄių puslapių apsaugų sÄ…raÅ¡Ä… rasite [[Special:ProtectedPages|
'unprotectedarticle' => 'pašalino apsaugą nuo „[[$1]]“',
'movedarticleprotection' => 'perkelti apsaugos nustatymai iš „[[$2]]“ į „[[$1]]“',
'protect-title' => 'Nustatomas apsaugos lygis puslapiui „$1“',
+'protect-title-notallowed' => 'Peržiūrėti "$1" apsaugos lygį',
'prot_1movedto2' => '[[$1]] pervadintas į [[$2]]',
+'protect-badnamespace-title' => 'Neapsaugota vardų sritis',
+'protect-badnamespace-text' => 'Puslapiai šioje vardų srityje negali būti apsaugoti.',
'protect-legend' => 'Užrakinimo patvirtinimas',
'protectcomment' => 'Priežastis:',
'protectexpiry' => 'Baigia galioti:',
@@ -2197,6 +2239,7 @@ Dabar veikianÄių puslapių apsaugų sÄ…raÅ¡Ä… rasite [[Special:ProtectedPages|
'protect-level-sysop' => 'Tik administratoriai',
'protect-summary-cascade' => 'pakopinÄ— apsauga',
'protect-expiring' => 'baigia galioti $1 (UTC)',
+'protect-expiring-local' => 'baigia galioti $1',
'protect-expiry-indefinite' => 'neribotai',
'protect-cascade' => 'Apsaugoti puslapius, įtrauktus į šį puslapį (pakopinė apsauga).',
'protect-cantedit' => 'Jūs negalite keisti šio puslapio apsaugojimo lygių, nes neturite teisių jo redaguoti.',
@@ -2254,7 +2297,6 @@ Tokiais atvejais, jums reikia atžymėti arba atslėpti naujausią ištrintą ve
'undeletereset' => 'IÅ¡ naujo',
'undeleteinvert' => 'Žymėti priešingai',
'undeletecomment' => 'Priežastis:',
-'undeletedarticle' => 'atkurta „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}',
'undeletedrevisions-files' => '{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}',
'undeletedfiles' => '{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}',
@@ -2263,6 +2305,7 @@ Tokiais atvejais, jums reikia atžymėti arba atslėpti naujausią ištrintą ve
Peržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
'undelete-header' => 'Žiūrėkite [[Special:Log/delete|trynimo istorijoje]] paskiausiai ištrintų puslapių.',
+'undelete-search-title' => 'Panaikintų puslapių paieška',
'undelete-search-box' => 'Ieškoti ištrintų puslapių',
'undelete-search-prefix' => 'Rodyti puslapius pradedant su:',
'undelete-search-submit' => 'Ieškoti',
@@ -2271,6 +2314,7 @@ Peržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti pasku
'undelete-bad-store-key' => 'Nepavyksta atkurti failo versijos su laiku $1: failas buvo dingęs pries ištrynimą.',
'undelete-cleanup-error' => 'Klaida trinant nenaudotą archyvo failą „$1“.',
'undelete-missing-filearchive' => 'Nepavyksta atkurti failo archyvo ID $1, nes jo nėra duomenų bazėje. Jis gali būti jau atkurtas.',
+'undelete-error' => 'Klaida panaikinant puslapį',
'undelete-error-short' => 'Klaida atkuriant failÄ…: $1',
'undelete-error-long' => 'Įvyko klaidų atkuriant failą:
@@ -2392,6 +2436,7 @@ ankÅ¡Äiau užblokuotam IP adresui ar naudotojui.',
'blocklist-userblocks' => 'Slėpti į blokus',
'blocklist-tempblocks' => 'SlÄ—pti laikinus blokavimus',
'blocklist-addressblocks' => 'Slėpti vieną IP blokų',
+'blocklist-rangeblocks' => 'SlÄ—pti diapazono blokai',
'blocklist-timestamp' => 'Laiko žymė',
'blocklist-target' => 'TikslinÄ—',
'blocklist-expiry' => 'Galioja iki',
@@ -2414,6 +2459,7 @@ ankÅ¡Äiau užblokuotam IP adresui ar naudotojui.',
'unblocklink' => 'atblokuoti',
'change-blocklink' => 'keisti blokavimo nustatymus',
'contribslink' => 'įnašas',
+'emaillink' => 'pasiųsti e-mail laišką',
'autoblocker' => 'Jūs buvote automatiškai užblokuotas, nes jūsų IP adresą neseniai naudojo „[[User:$1|$1]]“. Nurodyta naudotojo $1 blokavimo priežastis: „$2“.',
'blocklogpage' => 'Blokavimų istorija',
'blocklog-showlog' => 'Šis naudotojas buvo užblokuotas.
@@ -2552,9 +2598,6 @@ Prašome sujungti šiuos puslapius.'''",
'movepage-page-moved' => 'Puslapis $1 perkeltas į $2.',
'movepage-page-unmoved' => 'Puslapio $1 negalima perkelti į $2.',
'movepage-max-pages' => 'Daugiausiai $1 {{PLURAL:$1|puslapis buvo perkeltas|puslapiai buvo perkelti|puslapių buvo perkelta}} ir daugiau nebus perkelta automatiškai.',
-'1movedto2' => '[[$1]] pervadintas į [[$2]]',
-'1movedto2_redir' => '[[$1]] pervadintas į [[$2]] (anksÄiau buvo nukreipiamasis)',
-'move-redirect-suppressed' => 'nukreipimas nesukurtas',
'movelogpage' => 'Pervardinimų istorija',
'movelogpagetext' => 'Pervardintų puslapių sąrašas.',
'movesubpage' => '{{PLURAL:$1|Subpuslapis|Subpuslapiai}}',
@@ -2567,7 +2610,7 @@ Prašome sujungti šiuos puslapius.'''",
Paskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?',
'delete_and_move_confirm' => 'Taip, trinti puslapį',
-'delete_and_move_reason' => 'IÅ¡trinta dÄ—l perkÄ—limo',
+'delete_and_move_reason' => 'Ištrinta dėl perkėlimo iš "[[$1]]"',
'selfmove' => 'Šaltinio ir paskirties pavadinimai yra tokie patys; negalima pervardinti puslapio į save.',
'immobile-source-namespace' => 'Negalima perkelti puslapių vardų srityje „$1“',
'immobile-target-namespace' => 'Perkelti puslapius į „$1“ vardų sritį negalima',
@@ -2597,9 +2640,11 @@ Prašome pasirinkti kitą pavadinimą.',
NorÄ—dami eksportuoti puslapius, įveskite pavadinimus žemiau esanÄiame tekstiniame lauke po vienÄ… pavadinimÄ… eilutÄ—je, taip pat pasirinkite ar norite eksportuoti ir istorijÄ… ar tik dabartinÄ™ versijÄ… su paskutinio redagavimo informacija.
Pastaruoju atveju, jūs taip pat galite naudoti nuorodą, pvz. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] puslapiui „[[{{MediaWiki:Mainpage}}]]“.',
+'exportall' => 'Eksportuoti visus puslapius',
'exportcuronly' => 'Eksportuoti tik dabartinę versiją, neįtraukiant istorijos',
'exportnohistory' => "----
'''Pastaba:''' Pilnos puslapių istorijos eksportavimas naudojantis šia forma yra išjungtas dėl spartos.",
+'exportlistauthors' => 'Įtraukti kiekvieno puslapio pilną visų redaktorių sąrašą',
'export-submit' => 'Eksportuoti',
'export-addcattext' => 'Pridėti puslapius iš kategorijos:',
'export-addcat' => 'PridÄ—ti',
@@ -2632,6 +2677,8 @@ Aplankykite [//www.mediawiki.org/wiki/Localisation „MediaWiki“ lokaliziciją
'thumbnail_error' => 'Klaida kuriant sumažintą paveikslėlį: $1',
'djvu_page_error' => 'DjVu puslapis nepasiekiamas',
'djvu_no_xml' => 'Nepavyksta gauti XML DjVu failui',
+'thumbnail-temp-create' => 'Negalima sukurti laikinos failo miniatiūros',
+'thumbnail-dest-create' => 'Negalima išsaugoti failo miniatiūros',
'thumbnail_invalid_params' => 'Neleistini miniatiūros parametrai',
'thumbnail_dest_directory' => 'Nepavyksta sukurti paskirties aplanko',
'thumbnail_image-type' => 'PaveikslÄ—lio tipas nÄ—ra palaikomas',
@@ -2676,6 +2723,11 @@ IÅ¡saugokite jį savo kompiuteryje ir įkelkite jį Äia.',
'import-upload' => 'Įkelti XML duomenis',
'import-token-mismatch' => 'Sesijos duomenys prarasti. Bandykite iš naujo.',
'import-invalid-interwiki' => 'Nepavyko importuoti iš nurodyto wiki projekto.',
+'import-error-edit' => 'Puslapis "$1" nebuvo įkeltas, kadangi jūs neturite teisės jį redaguoti.',
+'import-error-create' => 'Puslapis "$1" nebuvo įkeltas, kadangi jūs neturite teisės jį sukurti.',
+'import-error-interwiki' => 'Puslapis "$1" nebuvo įkeltas, kadangi jo pavadinimas yra rezervuotas išorinei nuorodai (interviki).',
+'import-error-special' => 'Puslapis "$1" nebuvo įkeltas, kadangi jis priklauso specialiai vardų sriÄiai, kurioje yra negalimi puslapiai.',
+'import-error-invalid' => 'Puslapis "$1" nebuvo įkeltas, kadangi jo vardas yra neteisingas.',
# Import log
'importlogpage' => 'Importo istorija',
@@ -2685,73 +2737,85 @@ IÅ¡saugokite jį savo kompiuteryje ir įkelkite jį Äia.',
'import-logentry-interwiki' => 'tarpprojektinis $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} iš $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript testavimas',
+'javascripttest-disabled' => 'Ši funkcija yra išjungta.',
+'javascripttest-title' => 'Vykdomas $1 testavimas',
+'javascripttest-pagetext-noframework' => 'Å is puslapis yra skirtas vykdyti JavaScript testavimus.',
+'javascripttest-pagetext-unknownframework' => 'Nežinoma "$1" testavimo struktūra.',
+'javascripttest-pagetext-frameworks' => 'Prašome pasirinkti vieną iš išvardintų testavimo struktūrų: $1',
+'javascripttest-pagetext-skins' => 'Pasirinkite naudotojo sąsajos išvaizdą, kuriai atliksite testavimą:',
+'javascripttest-qunit-intro' => 'Peržiūrėkite [$1 testavimo dokumentaciją]',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Jūsų naudotojo puslapis',
-'tooltip-pt-anonuserpage' => 'Naudotojo puslapis jūsų IP adresui',
-'tooltip-pt-mytalk' => 'Jūsų aptarimo puslapis',
-'tooltip-pt-anontalk' => 'Pakeitimų aptarimas, darytus naudojant šį IP adresą',
-'tooltip-pt-preferences' => 'Mano nustatymai',
-'tooltip-pt-watchlist' => 'Puslapių sąrašas, kuriuos jūs pasirinkote stebėti.',
-'tooltip-pt-mycontris' => 'Jūsų darytų keitimų sąrašas',
-'tooltip-pt-login' => 'Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.',
-'tooltip-pt-anonlogin' => 'Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.',
-'tooltip-pt-logout' => 'Atsijungti',
-'tooltip-ca-talk' => 'Puslapio turinio aptarimas',
-'tooltip-ca-edit' => 'Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuką prieš išsaugodami.',
-'tooltip-ca-addsection' => 'PradÄ—ti naujÄ… aptariamÄ… temÄ…',
-'tooltip-ca-viewsource' => 'Puslapis yra užrakintas. Galite pažiūrėti turinį.',
-'tooltip-ca-history' => 'AnkstesnÄ—s puslapio versijos.',
-'tooltip-ca-protect' => 'Užrakinti šį puslapį',
-'tooltip-ca-unprotect' => 'Keisti Å¡io puslapio apsaugÄ…',
-'tooltip-ca-delete' => 'Ištrinti šį puslapį',
-'tooltip-ca-undelete' => 'Atkurti puslapį su visais darytais keitimais',
-'tooltip-ca-move' => 'Pervadinti puslapį',
-'tooltip-ca-watch' => 'Pridėti puslapį į stebimųjų sąrašą',
-'tooltip-ca-unwatch' => 'Pašalinti puslapį iš stebimųjų sąrašo',
-'tooltip-search' => 'Ieškoti šiame projekte',
-'tooltip-search-go' => 'Eiti į puslapį su tokiu pavadinimu, jei toks yra',
-'tooltip-search-fulltext' => 'Ieškoti puslapių su šiuo tekstu',
-'tooltip-p-logo' => 'Pradinis puslapis',
-'tooltip-n-mainpage' => 'Eiti į pradinį puslapį',
-'tooltip-n-mainpage-description' => 'Eiti į pradinį puslapį',
-'tooltip-n-portal' => 'Apie projektÄ…, kÄ… galima daryti, kur kÄ… rasti',
-'tooltip-n-currentevents' => 'Raskite naujausiÄ… informacijÄ…',
-'tooltip-n-recentchanges' => 'Paskutinių keitimų sąrašas šiame projekte.',
-'tooltip-n-randompage' => 'Įkelti atsitiktinį puslapį',
-'tooltip-n-help' => 'Vieta, kur rasite rūpimus atsakymus.',
-'tooltip-t-whatlinkshere' => 'Puslapių sÄ…raÅ¡as, rodanÄių į Äia',
-'tooltip-t-recentchangeslinked' => 'Paskutiniai keitimai puslapiuose, pasiekiamuose iš šio puslapio',
-'tooltip-feed-rss' => 'Å io puslapio RSS Å¡altinis',
-'tooltip-feed-atom' => 'Å io puslapio Atom Å¡altinis',
-'tooltip-t-contributions' => 'Rodyti šio naudotojo keitimų sąrašą',
-'tooltip-t-emailuser' => 'Siųsti laišką šiam naudotojui',
-'tooltip-t-upload' => 'Įkelti failus',
-'tooltip-t-specialpages' => 'Specialiųjų puslapių sąrašas',
-'tooltip-t-print' => 'Å io puslapio versija spausdinimui',
-'tooltip-t-permalink' => 'Nuolatinė nuoroda į šią puslapio versiją',
-'tooltip-ca-nstab-main' => 'Rodyti puslapio turinį',
-'tooltip-ca-nstab-user' => 'Rodyti naudotojo puslapį',
-'tooltip-ca-nstab-media' => 'Rodyti media puslapį',
-'tooltip-ca-nstab-special' => 'Å is puslapis yra specialusis - jo negalima redaguoti.',
-'tooltip-ca-nstab-project' => 'Rodyti projekto puslapį',
-'tooltip-ca-nstab-image' => 'Rodyti failo puslapį',
-'tooltip-ca-nstab-mediawiki' => 'Rodyti sisteminį pranešimą',
-'tooltip-ca-nstab-template' => 'Rodyti Å¡ablonÄ…',
-'tooltip-ca-nstab-help' => 'Rodyti pagalbos puslapį',
-'tooltip-ca-nstab-category' => 'Rodyti kategorijos puslapį',
-'tooltip-minoredit' => 'Pažymėti keitimą kaip smulkų',
-'tooltip-save' => 'IÅ¡saugoti pakeitimus',
-'tooltip-preview' => 'Pakeitimų peržiūra, prašome pažiūrėti prieš išsaugant!',
-'tooltip-diff' => 'Rodo, kokius pakeitimus padarÄ—te tekste.',
-'tooltip-compareselectedversions' => 'Žiūrėti dviejų pasirinktų puslapio versijų skirtumus.',
-'tooltip-watch' => 'Pridėti šį puslapį į stebimųjų sąrašą',
-'tooltip-recreate' => 'Atkurti puslapį nepaisant to, kad jis buvo ištrintas',
-'tooltip-upload' => 'Pradėti įkėlimą',
-'tooltip-rollback' => 'Atšaukti atmestus šio puslapio pakeitimus į paskutinę versiją vienu spustelėjimu',
-'tooltip-undo' => '„Anuliuoti“ atmeta šį keitimą ir atveria ankstesnės versijos redagavimo formą.
+'tooltip-pt-userpage' => 'Jūsų naudotojo puslapis',
+'tooltip-pt-anonuserpage' => 'Naudotojo puslapis jūsų IP adresui',
+'tooltip-pt-mytalk' => 'Jūsų aptarimo puslapis',
+'tooltip-pt-anontalk' => 'Pakeitimų aptarimas, darytus naudojant šį IP adresą',
+'tooltip-pt-preferences' => 'Mano nustatymai',
+'tooltip-pt-watchlist' => 'Puslapių sąrašas, kuriuos jūs pasirinkote stebėti.',
+'tooltip-pt-mycontris' => 'Jūsų darytų keitimų sąrašas',
+'tooltip-pt-login' => 'Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.',
+'tooltip-pt-anonlogin' => 'Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.',
+'tooltip-pt-logout' => 'Atsijungti',
+'tooltip-ca-talk' => 'Puslapio turinio aptarimas',
+'tooltip-ca-edit' => 'Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuką prieš išsaugodami.',
+'tooltip-ca-addsection' => 'PradÄ—ti naujÄ… aptariamÄ… temÄ…',
+'tooltip-ca-viewsource' => 'Puslapis yra užrakintas. Galite pažiūrėti turinį.',
+'tooltip-ca-history' => 'AnkstesnÄ—s puslapio versijos.',
+'tooltip-ca-protect' => 'Užrakinti šį puslapį',
+'tooltip-ca-unprotect' => 'Keisti Å¡io puslapio apsaugÄ…',
+'tooltip-ca-delete' => 'Ištrinti šį puslapį',
+'tooltip-ca-undelete' => 'Atkurti puslapį su visais darytais keitimais',
+'tooltip-ca-move' => 'Pervadinti puslapį',
+'tooltip-ca-watch' => 'Pridėti puslapį į stebimųjų sąrašą',
+'tooltip-ca-unwatch' => 'Pašalinti puslapį iš stebimųjų sąrašo',
+'tooltip-search' => 'Ieškoti šiame projekte',
+'tooltip-search-go' => 'Eiti į puslapį su tokiu pavadinimu, jei toks yra',
+'tooltip-search-fulltext' => 'Ieškoti puslapių su šiuo tekstu',
+'tooltip-p-logo' => 'Pradinis puslapis',
+'tooltip-n-mainpage' => 'Eiti į pradinį puslapį',
+'tooltip-n-mainpage-description' => 'Eiti į pradinį puslapį',
+'tooltip-n-portal' => 'Apie projektÄ…, kÄ… galima daryti, kur kÄ… rasti',
+'tooltip-n-currentevents' => 'Raskite naujausiÄ… informacijÄ…',
+'tooltip-n-recentchanges' => 'Paskutinių keitimų sąrašas šiame projekte.',
+'tooltip-n-randompage' => 'Įkelti atsitiktinį puslapį',
+'tooltip-n-help' => 'Vieta, kur rasite rūpimus atsakymus.',
+'tooltip-t-whatlinkshere' => 'Puslapių sÄ…raÅ¡as, rodanÄių į Äia',
+'tooltip-t-recentchangeslinked' => 'Paskutiniai keitimai puslapiuose, pasiekiamuose iš šio puslapio',
+'tooltip-feed-rss' => 'Å io puslapio RSS Å¡altinis',
+'tooltip-feed-atom' => 'Å io puslapio Atom Å¡altinis',
+'tooltip-t-contributions' => 'Rodyti šio naudotojo keitimų sąrašą',
+'tooltip-t-emailuser' => 'Siųsti laišką šiam naudotojui',
+'tooltip-t-upload' => 'Įkelti failus',
+'tooltip-t-specialpages' => 'Specialiųjų puslapių sąrašas',
+'tooltip-t-print' => 'Å io puslapio versija spausdinimui',
+'tooltip-t-permalink' => 'Nuolatinė nuoroda į šią puslapio versiją',
+'tooltip-ca-nstab-main' => 'Rodyti puslapio turinį',
+'tooltip-ca-nstab-user' => 'Rodyti naudotojo puslapį',
+'tooltip-ca-nstab-media' => 'Rodyti media puslapį',
+'tooltip-ca-nstab-special' => 'Å is puslapis yra specialusis - jo negalima redaguoti.',
+'tooltip-ca-nstab-project' => 'Rodyti projekto puslapį',
+'tooltip-ca-nstab-image' => 'Rodyti failo puslapį',
+'tooltip-ca-nstab-mediawiki' => 'Rodyti sisteminį pranešimą',
+'tooltip-ca-nstab-template' => 'Rodyti Å¡ablonÄ…',
+'tooltip-ca-nstab-help' => 'Rodyti pagalbos puslapį',
+'tooltip-ca-nstab-category' => 'Rodyti kategorijos puslapį',
+'tooltip-minoredit' => 'Pažymėti keitimą kaip smulkų',
+'tooltip-save' => 'IÅ¡saugoti pakeitimus',
+'tooltip-preview' => 'Pakeitimų peržiūra, prašome pažiūrėti prieš išsaugant!',
+'tooltip-diff' => 'Rodo, kokius pakeitimus padarÄ—te tekste.',
+'tooltip-compareselectedversions' => 'Žiūrėti dviejų pasirinktų puslapio versijų skirtumus.',
+'tooltip-watch' => 'Pridėti šį puslapį į stebimųjų sąrašą',
+'tooltip-watchlistedit-normal-submit' => 'Å alinti puslapius',
+'tooltip-watchlistedit-raw-submit' => 'Atnaujinti stebimųjų sąrašą',
+'tooltip-recreate' => 'Atkurti puslapį nepaisant to, kad jis buvo ištrintas',
+'tooltip-upload' => 'Pradėti įkėlimą',
+'tooltip-rollback' => 'Atšaukti atmestus šio puslapio pakeitimus į paskutinę versiją vienu spustelėjimu',
+'tooltip-undo' => '„Anuliuoti“ atmeta šį keitimą ir atveria ankstesnės versijos redagavimo formą.
Leidžia pridėti atmetimo priežastį komentaruose',
-'tooltip-preferences-save' => 'IÅ¡saugoti nustatymus',
-'tooltip-summary' => 'Įvesti trumpą santrauką',
+'tooltip-preferences-save' => 'IÅ¡saugoti nustatymus',
+'tooltip-summary' => 'Įvesti trumpą santrauką',
# Stylesheets
'common.css' => '/** Čia įdėtas CSS bus taikomas visoms išvaizdoms */',
@@ -2822,9 +2886,6 @@ Leidžia pridėti atmetimo priežastį komentaruose',
# Patrol log
'patrol-log-page' => 'Patikrinimo istorija',
'patrol-log-header' => 'Tai patvirtintų versijų sąrašas.',
-'patrol-log-line' => 'Puslapio „$2“ $1 pažymėta kaip patikrinta $3',
-'patrol-log-auto' => '(automatiškai)',
-'patrol-log-diff' => 'versija $1',
'log-show-hide-patrol' => '$1 patvirtinimų sąrašą',
# Image deletion
@@ -2851,11 +2912,11 @@ Jį paleidus jūsų sistema gali būti pažeista.",
'file-info' => 'failo dydis: $1, MIME tipas: $2',
'file-info-size' => '$1 × $2 taškų, failo dydis: $3, MIME tipas: $4',
'file-info-size-pages' => '$1 × $2 taškų, failo dydis: $3, MIME tipas: $4, $5 {{PLURAL:$5|page|pages}}',
-'file-nohires' => '<small>Geresnė raiška negalima.</small>',
+'file-nohires' => 'Geresnė raiška negalima.',
'svg-long-desc' => 'SVG failas, formaliai $1 × $2 taškų, failo dydis: $3',
'show-big-image' => 'Pilna raiška',
-'show-big-image-preview' => '<small>Sumažintos iliustracijos dydis: $1 .</small>',
-'show-big-image-other' => '<small>Kitos rezoliucijos: $1 .</small>',
+'show-big-image-preview' => 'Sumažintos iliustracijos dydis: $1 .',
+'show-big-image-other' => '{{PLURAL:$2|Kita rezoliucija|Kitos $2 rezoliucijos|Kitų $2 rezoliucijų}}: $1 .',
'show-big-image-size' => '$1 × $2 taškų',
'file-info-gif-looped' => 'ciklinis',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kadras|kadrai|kadrų}}',
@@ -2875,6 +2936,13 @@ Jį paleidus jūsų sistema gali būti pažeista.",
'bydate' => 'pagal datÄ…',
'sp-newimages-showfrom' => 'Rodyti naujus failus pradedant nuo $1 $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekundę|$1 sekundes|$1 sekundžių}}',
+'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ų}}',
+'ago' => 'prieš $1',
+
# Bad image list
'bad_image_list' => 'Formatas yra toks:
@@ -3374,13 +3442,6 @@ $5
'scarytranscludefailed' => '[Šablono gavimas iš $1 nepavyko]',
'scarytranscludetoolong' => '[URL per ilgas]',
-# Trackbacks
-'trackbackbox' => 'Šio puslapio „Trackback“ nuorodos:<br />
-$1',
-'trackbackremove' => '([$1 Trinti])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback buvo sėkmingai ištrintas.',
-
# Delete conflict
'deletedwhileediting' => 'Dėmesio: Šis puslapis ištrintas po to, kai pradėjote redaguoti!',
'confirmrecreate' => "Naudotojas [[User:$1|$1]] ([[User talk:$1|aptarimas]]) ištrynė šį puslapį po to, kai pradėjote jį redaguoti. Trynimo priežastis:
@@ -3466,6 +3527,9 @@ Jūs taip pat galite [[Special:EditWatchlist|naudoti standartinį redaktorių]].
'watchlisttools-edit' => 'Rodyti ir redaguoti stebimųjų sąrašą',
'watchlisttools-raw' => 'Redaguoti grynąjį sąrašą',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|aptarimas]])',
+
# Core parser functions
'unknown_extension_tag' => 'Nežinoma priedo žymė „$1“',
'duplicate-defaultsort' => 'Ä®spÄ—jimas: Numatytasis rikiavimo raktas „$2“ pakeiÄia ankstesnį numatytÄ…jį rikiavimo raktÄ… „$1“.',
@@ -3564,13 +3628,16 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
'tags-hitcount' => '$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}',
# Special:ComparePages
-'comparepages' => 'Palyginti puslapius',
-'compare-selector' => 'Palyginti puslapio keitimus',
-'compare-page1' => 'Puslapis 1',
-'compare-page2' => 'Puslapis 2',
-'compare-rev1' => 'Pirma versija',
-'compare-rev2' => 'Antra versija',
-'compare-submit' => 'Palyginti',
+'comparepages' => 'Palyginti puslapius',
+'compare-selector' => 'Palyginti puslapio keitimus',
+'compare-page1' => 'Puslapis 1',
+'compare-page2' => 'Puslapis 2',
+'compare-rev1' => 'Pirma versija',
+'compare-rev2' => 'Antra versija',
+'compare-submit' => 'Palyginti',
+'compare-invalid-title' => 'Jūsų nurodytas pavadinimas neleistinas.',
+'compare-title-not-exists' => 'Pavadinimas, kurį nurodėte, neegzistuoja.',
+'compare-revision-not-exists' => 'Keitimas, kurį nurodėte, neegzistuoja.',
# Database error messages
'dberr-header' => 'Ši svetainė turi problemų.',
@@ -3597,4 +3664,40 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
'sqlite-has-fts' => '$1 su visatekstės paieškos palaikymu',
'sqlite-no-fts' => '$1 be visatekstės paieškos palaikymo',
+# New logging system
+'logentry-delete-delete' => '$1 panaikino puslapį $3',
+'logentry-delete-restore' => '$1 atstatė puslapį $3',
+'revdelete-restricted' => 'uždėti apribojimai administratoriams',
+'revdelete-unrestricted' => 'pašalinti apribojimai administratoriams',
+'newuserlog-byemail' => 'slaptažodis nusiųstas elektroniniu paštu',
+
+# Feedback
+'feedback-subject' => 'Tema:',
+'feedback-message' => 'Pranešimas:',
+'feedback-cancel' => 'Atšaukti',
+'feedback-submit' => 'Siųsti Atsiliepimą',
+'feedback-adding' => 'Pridedamas atsiliepimas į puslapį ...',
+'feedback-error2' => 'Klaida: Redagavimas nepavyko',
+
+# API errors
+'api-error-badaccess-groups' => 'Jums neleidžiama įkelti failus į šią wiki.',
+'api-error-copyuploaddisabled' => 'Siuntimas pagal URL yra išjungtas šiame serveryje.',
+'api-error-duplicate-popup-title' => 'Dubliuoti {{PLURAL:$1|failÄ…|failus}}',
+'api-error-empty-file' => 'Pateikta failas buvo tuÅ¡Äias.',
+'api-error-file-too-large' => 'Failą, kurį pateikėte buvo per didelis.',
+'api-error-filename-tooshort' => 'Failo vardas yra per trumpas.',
+'api-error-filetype-banned' => 'Šis failų tipas yra uždraustas.',
+'api-error-http' => 'VidinÄ— klaida: nepavyko prisijungti prie serverio.',
+'api-error-illegal-filename' => 'Failo vardas neleidžiamas.',
+'api-error-invalid-file-key' => 'VidinÄ— klaida: failas nerastas saugykloje.',
+'api-error-mustbeloggedin' => 'Jūs turite būti prisijungęs kad galėtumėte įkelti failus.',
+'api-error-mustbeposted' => 'Vidinė klaida: prašymas reikalauja HTTP POST.',
+'api-error-ok-but-empty' => 'Vidinė klaida: nėra atsakymo iš serverio.',
+'api-error-overwrite' => 'Perrašymas esamą failą neleidžiamas.',
+'api-error-unclassified' => 'Įvyko nežinoma klaida',
+'api-error-unknown-code' => 'Nežinoma klaida: " $1 "',
+'api-error-unknown-error' => 'Vidinė klaida: kažkas nutiko bandant įkelti failą.',
+'api-error-unknown-warning' => 'Nežinomas įspėjimas: $1',
+'api-error-uploaddisabled' => 'Įkėlimas išjungtas šioje wiki.',
+
);
diff --git a/languages/messages/MessagesLtg.php b/languages/messages/MessagesLtg.php
index 3bb46078..55e3580e 100644
--- a/languages/messages/MessagesLtg.php
+++ b/languages/messages/MessagesLtg.php
@@ -275,6 +275,9 @@ Par to var ziņuot [[Special:ListUsers/sysop|kaidam administratoram]], nūruodū
'passwordreset-username' => 'SlÄgvuords:',
'passwordreset-email' => 'E-posta adress:',
+# Special:ChangeEmail
+'changeemail-cancel' => 'Atsaukt',
+
# Edit page toolbar
'bold_sample' => 'Pamalnais roksts',
'bold_tip' => 'Pamalnais roksts',
@@ -357,7 +360,6 @@ n = nasvareigs lobuojums.',
'revdelete-log' => 'Īmesle:',
'revdel-restore' => 'maineit radzameibu',
'pagehist' => 'Puslopys viesture',
-'revdelete-uname' => 'slÄgvuords',
'revdelete-otherreason' => 'Cyta/papyldoma Ä«mesle:',
'revdelete-reasonotherlist' => 'Cyta Ä«mesle',
@@ -591,8 +593,7 @@ Lopys, kas ir tovÄ [[Special:Watchlist|puorraugamÅ«s rokstu sarokstÄ]] ir '''r
'listusers-submit' => 'Paruodeit',
# Special:Log/newusers
-'newuserlogpage' => 'Jaunūs lītuotuoju registrs',
-'newuserlog-create-entry' => 'RegistrÄts lÄ«tuotuojvuords',
+'newuserlogpage' => 'Jaunūs lītuotuoju registrs',
# Special:ListGroupRights
'listgrouprights-members' => '(dalinīku saroksts)',
@@ -628,7 +629,6 @@ Ka vÄluok puordÅ«muosi i nagribiesi vairs puorraudzeit itÅ« lopu, spÄ«d iz sait
'actioncomplete' => 'Darbeiba pabeigta',
'deletedtext' => '"$1" beja iztreits.
Kab apsavÄ“rtu pÄdejuo iztreitÅ« sarokstu, verÄ«s $2.',
-'deletedarticle' => 'dzÄsts "[[$1]]"',
'dellogpage' => 'Iztreišonys registris',
'deletionlog' => 'iztreišonys registru',
'deletecomment' => 'Īmesle:',
@@ -665,8 +665,7 @@ Pašreizejī lopys '''$1''' īstatejumi ir:",
'restriction-move' => 'Puorceļt',
# Undelete
-'undeletelink' => 'apsavērt/atjaunynuot',
-'undeletedarticle' => 'atjaunynoju "[[$1]]"',
+'undeletelink' => 'apsavērt/atjaunynuot',
# Namespace form on various pages
'namespace' => 'Vuordu pluots:',
@@ -750,8 +749,6 @@ Ka gribiesi, tod tev itei sarunu lopa byus juopuolīk voi juoapvīnoj pošam.",
'talkexists' => "'''Itei lopa tyka puorvītuota veiksmeigai, bet tuos sarunu lopu navarieja puorvītuot, deļ tuo ka jaunuo nūsaukuma lopai jau ir diskuseju lopa. Lyudzu apvīnoj ituos sarunu lopys pats.'''",
'movedto' => 'puorvītuota iz',
'movetalk' => 'Puorceļt sasītū sprīžu.',
-'1movedto2' => '"[[$1]]" puorsauÄu par "[[$2]]"',
-'1movedto2_redir' => '[[$1]] tyka puorsauktys par [[$2]], lītojūt puoradresaceju',
'movelogpage' => 'Puorvītuošonys registrs',
'movesubpage' => '{{PLURAL:$1|Zampuslopa|Zampuslopys}}',
'movereason' => 'Īmesle:',
@@ -843,7 +840,7 @@ Tys ļaun davÄ«nuot pamatuojumu kÅ«psavylkumÄ.',
# Media information
'file-info-size' => '$1 × $2 pikseli, faila izmÄrs: $3, MIME tips: $4',
-'file-nohires' => '<small>Augstuoka izškirtspieja nav pīejama.</small>',
+'file-nohires' => 'Augstuoka izškirtspieja nav pīejama.',
'svg-long-desc' => 'SVG fails, definÄtais lelums $1 × $2 pikseli, faila lelums: $3',
'show-big-image' => 'PylnÄ lelumÄ',
diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php
index 96ed4f7e..048a72d0 100644
--- a/languages/messages/MessagesLv.php
+++ b/languages/messages/MessagesLv.php
@@ -23,7 +23,7 @@
* @author לערי ריינה×רט
*/
-/*
+/**
* @copyright Copyright © 2006, Niklas Laxström
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
@@ -399,16 +399,16 @@ Par to varat ziņot [[Special:ListUsers/sysop|kÄdam administratoram]], norÄdot
'formerror' => 'Kļūda: neizdevÄs nosÅ«tÄ«t saturu',
'badarticleerror' => 'Å o darbÄ«bu nevar veikt Å¡ajÄ lapÄ.',
'cannotdelete' => 'Nevar izdzÄ“st lapu vai failu $1. IespÄ“jams, to jau ir izdzÄ“sis kÄds cits.',
+'cannotdelete-title' => 'Nevar izdzēst lapu "$1"',
'badtitle' => 'Nepiemērots nosaukums',
'badtitletext' => 'PieprasÄ«tÄ lapa ir kļūdaina, tukÅ¡a, vai nepareizi saistÄ«ts starpvalodu vai starp-vikiju virsrakstas. Tas var saturÄ“t vienu vai vairÄkus simbolus, ko nedrÄ«kst izmantot nosaukumos.',
-'perfcached' => 'Šie dati ir no servera kešatmiņas un var būt novecojuši:',
-'perfcachedts' => "Šie dati ir no servera kešatmiņas (''cache''), kas pēdējo reizi bija atjaunota $1.",
+'perfcached' => 'Šie dati ir no servera kešatmiņas un var būt novecojuši. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => "Šie dati ir no servera kešatmiņas (''cache''), kas pēdējo reizi bija atjaunota $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Å Ä«s lapas atjaunoÅ¡ana pagaidÄm ir atslÄ“gta. Te esoÅ¡ie dati tuvÄkajÄ laikÄ netiks atjaunoti.',
'wrong_wfQuery_params' => 'Nekorekti wfQuery() parametri<br />
Funkcija: $1<br />
VaicÄjums: $2',
'viewsource' => 'Aplūkot kodu',
-'viewsourcefor' => 'Lapa: $1',
'actionthrottled' => 'Darbība netika atļauta',
'protectedpagetext' => 'Å Ä« lapa ir aizsargÄta lai novÄ“rstu tÄs izmainÄ«Å¡anu.',
'viewsourcetext' => 'Tu vari apskatīties un nokopēt šīs lapas vikitekstu:',
@@ -499,6 +499,7 @@ TÄdēļ Å¡obrÄ«d no Å¡Ä«s IP adreses vairs nevar izveidot jaunus kontus.',
'noemailprefs' => 'NorÄdi e-pasta adresi, lai lietotu Å¡Ä«s iespÄ“jas.',
'emailconfirmlink' => 'ApstiprinÄt tavu e-pasta adresi',
'invalidemailaddress' => 'E-pasta adrese nevar tikt apstiprinÄta, jo izskatÄs nederÄ«ga. LÅ«dzu ievadi korekti noformÄ“tu e-pasta adresi, vai arÄ« atstÄj to lauku tukÅ¡u.',
+'cannotchangeemail' => 'Konta e-pasta adresi nevar nomainÄ«t Å¡ajÄ wiki.',
'accountcreated' => 'Konts izveidots',
'accountcreatedtext' => 'LietotÄja konts priekÅ¡ $1 tika izveidots.',
'createaccount-title' => 'LietotÄja konta izveidoÅ¡ana {{grammar:lokatÄ«vs|{{SITENAME}}}}',
@@ -529,16 +530,28 @@ Tu jau esi veiksmīgi nomainījis savu galveno paroli, vai arī esi pieprasījis
'resetpass-temp-password' => 'Pagaidu parole:',
# Special:PasswordReset
-'passwordreset' => 'Paroles atiestatīšana',
-'passwordreset-legend' => 'Atiestatīt paroli',
-'passwordreset-disabled' => 'Paroles atiestates Å¡ajÄ viki ir atspÄ“jotas.',
-'passwordreset-username' => 'LietotÄjvÄrds:',
-'passwordreset-domain' => 'Domēns:',
-'passwordreset-email' => 'E-pasta adrese:',
-'passwordreset-emailtitle' => 'Konta informÄcija {{SITENAME}}',
-'passwordreset-emailelement' => 'LietotÄjvÄrds: $1
+'passwordreset' => 'Paroles atiestatīšana',
+'passwordreset-legend' => 'Atiestatīt paroli',
+'passwordreset-disabled' => 'Paroles atiestates Å¡ajÄ viki ir atspÄ“jotas.',
+'passwordreset-username' => 'LietotÄjvÄrds:',
+'passwordreset-domain' => 'Domēns:',
+'passwordreset-capture' => 'Apskatīt izveidoto e-pastu?',
+'passwordreset-email' => 'E-pasta adrese:',
+'passwordreset-emailtitle' => 'Konta informÄcija {{SITENAME}}',
+'passwordreset-emailelement' => 'LietotÄjvÄrds: $1
Pagaidu parole: $2',
-'passwordreset-emailsent' => 'AtgÄdinÄjuma e-pasts ir nosÅ«tÄ«ts.',
+'passwordreset-emailsent' => 'AtgÄdinÄjuma e-pasts ir nosÅ«tÄ«ts.',
+'passwordreset-emailsent-capture' => 'AtgÄdinÄjuma e-pasta ziņojums ir nosÅ«tÄ«ts, tas parÄdÄ«ts zemÄk.',
+'passwordreset-emailerror-capture' => 'AtgÄdinÄjuma e-pasta ziņojums tika izveidots, tas parÄdÄ«ts zemÄk, bet nosÅ«tÄ«Å¡ana lietotÄjam neizdevÄs: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Mainīt e-pasta adresi',
+'changeemail-header' => 'Mainīt konta e-pasta adresi',
+'changeemail-oldemail' => 'PaÅ¡reizÄ“jÄ e-pasta adrese:',
+'changeemail-newemail' => 'JaunÄ e-pasta adrese:',
+'changeemail-none' => '(nav)',
+'changeemail-submit' => 'Mainīt e-pastu',
+'changeemail-cancel' => 'Atcelt',
# Edit page toolbar
'bold_sample' => 'Teksts boldÄ',
@@ -609,8 +622,6 @@ Atceries, ka tu nevari lietot "sÅ«tÄ«t e-pastu Å¡im lietotÄjam" iespÄ“ju, ja tu
Tava paÅ¡reizÄ“jÄ IP adrese ir $3 un bloka ID ir $5.
Lūdzu iekļauj šos visos ziņojumos, kurus sūti adminiem, apspriežot šo bloku.',
'blockednoreason' => 'iemesls nav norÄdÄ«ts',
-'blockedoriginalsource' => "'''$1''' kods ir parÄdÄ«ts zemÄk:",
-'whitelistedittitle' => 'Lai varÄ“tu rediģēt, Å¡eit jÄielogojas.',
'whitelistedittext' => 'Tev $1 lai varētu rediģēt lapas.',
'confirmedittext' => 'Lai varÄ“tu izmainÄ«t lapas, vispirms jÄapstiprina savu e-pasta adresi.
NorÄdi un apstiprini e-pasta adresi savos [[Special:Preferences|lietotÄja uzstÄdÄ«jumos]].',
@@ -825,8 +836,6 @@ SÄ«kÄku informÄciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'revdelete-unsuppress' => 'Atcelt ierobežojumus atjaunotajÄm versijÄm',
'revdelete-log' => 'Iemesls:',
'revdelete-submit' => 'PiemÄ“rot {{PLURAL:$1|izvÄ“lÄ“tajai versijai|izvÄ“lÄ“tajÄm versijÄm}}',
-'revdelete-logentry' => 'izmainīja lapas "[[$1]]" versiju redzamību',
-'logdelete-logentry' => 'izmainīja ar lapu "[[$1]]" saistīto darbību redzamību',
'revdelete-success' => "'''Versiju redzamÄ«ba veiksmÄ«gi atjauninÄta.'''",
'revdelete-failure' => "'''Versiju redzamÄ«bu nav iespÄ“jams atjauninÄt:'''
$1",
@@ -838,13 +847,6 @@ $1",
'revdel-restore-visible' => 'redzamÄs versijas',
'pagehist' => 'Lapas vēsture',
'deletedhist' => 'Vēsture dzēsta',
-'revdelete-content' => 'saturs',
-'revdelete-summary' => 'izmaiņu kopsavilkums',
-'revdelete-uname' => 'lietotÄja vÄrds',
-'revdelete-restricted' => 'piemērot administratoriem ierobežojumus',
-'revdelete-unrestricted' => 'noņemt administratoriem ierobežojumus',
-'revdelete-hid' => 'paslēpa $1',
-'revdelete-unhid' => 'atjaunoja $1',
'revdelete-modify-missing' => 'Kļūda, mainot vienumu ar ID $1: tas ir pazudis no datubÄzes!',
'revdelete-reason-dropdown' => '*BiežÄkie dzÄ“Å¡anas iemesli
** autortiesÄ«bu pÄrkÄpums
@@ -977,12 +979,14 @@ PagaidÄm vari meklÄ“t, izmantojot Google vai Yahoo.
'prefs-rc' => 'PÄ“dÄ“jÄs izmaiņas',
'prefs-watchlist' => 'UzraugÄmie raksti',
'prefs-watchlist-days' => 'Dienu skaits, kuras parÄdÄ«t uzraugÄmo rakstu sarakstÄ:',
-'prefs-watchlist-days-max' => 'Ne vairÄk kÄ 7 dienas',
+'prefs-watchlist-days-max' => 'Ne vairÄk kÄ $1 {{PLURAL:$1|dienu|dienas}}',
'prefs-watchlist-edits' => 'Izmaiņu skaits, kuras rÄdÄ«t izvÄ“rstajÄ uzraugÄmo rakstu sarakstÄ:',
'prefs-watchlist-edits-max' => 'Ne vairÄk kÄ 1000',
'prefs-watchlist-token' => 'UzraugÄmo lapu saraksta marÄ·ieris:',
'prefs-misc' => 'DažÄdi',
'prefs-resetpass' => 'Mainīt paroli',
+'prefs-changeemail' => 'Mainīt e-pastu',
+'prefs-setemail' => 'UzstÄdÄ«t e-pasta adresi',
'prefs-email' => 'E-pasta uzstÄdÄ«jumi',
'prefs-rendering' => 'Izskats',
'saveprefs' => 'SaglabÄt',
@@ -1167,12 +1171,12 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'right-autopatrol' => 'IespÄ“ja, ka ikviens paÅ¡a veiktais labojums tiek automÄtiski atzÄ«mÄ“ts kÄ pÄrbaudÄ«ts',
'right-patrolmarks' => 'ApskatÄ«t pÄ“dÄ“jo izmaiņu lapu pÄrbaužu atzÄ«mes',
'right-unwatchedpages' => 'Apskatīt neuzraudzīto lapu sarakstu',
-'right-trackback' => 'Iesniegt atsauÄpaziņoÅ¡anu',
'right-mergehistory' => 'Apvienot lapu vēsturi',
'right-userrights' => 'MainÄ«t visu lietotÄju tiesÄ«bas',
'right-userrights-interwiki' => 'MainÄ«t lietotÄju tiesÄ«bas citÄs VikipÄ“dijÄs',
'right-siteadmin' => 'BloÄ·Ä“t un atbloÄ·Ä“t datubÄzi',
'right-sendemail' => 'SÅ«tÄ«t e-pastu citiem lietotÄjiem',
+'right-passwordreset' => 'Apskatīt paroles atiestatīšanas e-pasta ziņojumus',
# User rights log
'rightslog' => 'LietotÄju tiesÄ«bu reÄ£istrs',
@@ -1208,11 +1212,11 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'action-patrol' => 'atzÄ«mÄ“t citu labojumus kÄ pÄrbaudÄ«tus',
'action-autopatrol' => 'iespÄ“ja savus labojumus atzÄ«mÄ“t kÄ pÄrbaudÄ«tus',
'action-unwatchedpages' => 'apskatīt neuzraudzīto lapu sarakstu',
-'action-trackback' => 'iesniegt atsauÄpaziņoÅ¡anu',
'action-mergehistory' => 'apvienot šīs lapas vēsturi',
'action-userrights' => 'mainÄ«t visu lietotÄju tiesÄ«bas',
'action-userrights-interwiki' => 'mainÄ«t lietotÄju tiesÄ«bas citÄs VikipÄ“dijÄs',
'action-siteadmin' => 'bloÄ·Ä“t vai atbloÄ·Ä“t datubÄzi',
+'action-sendemail' => 'sūtīt e-pastus',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
@@ -1315,6 +1319,7 @@ PÄrskatÄmÄka versija ir pieejama [[Special:NewFiles|jauno attÄ“lu galerijÄ]]
'ignorewarnings' => 'IgnorÄ“t visus brÄ«dinÄjumus',
'minlength1' => 'Failu vÄrdiem jÄbÅ«t vismaz vienu simbolu gariem.',
'illegalfilename' => 'Faila nosaukumÄ "$1" ir simboli, kas nav atļauti virsrakstos. LÅ«dzu, pÄrdÄ“vÄ“ failu un mÄ“Ä£ini to vÄ“lreiz augÅ¡uplÄdÄ“t.',
+'filename-toolong' => 'Failu nosaukumi nedrÄ«kst pÄrsniegt 240 baitus.',
'badfilename' => 'Attēla nosaukums ir nomainīts, tagad tas ir "$1".',
'filetype-mime-mismatch' => 'Faila paplaÅ¡inÄjums ".$1" neatbilst noteiktajam MIME tipam ($2).',
'filetype-badmime' => 'Å eit nav atļauts augÅ¡uplÄdÄ“t failus ar MIME tipu "$1".',
@@ -1395,6 +1400,22 @@ LÅ«dzu, sazinieties ar [[Special:ListUsers/sysop|administratoru.]]',
'upload-unknown-size' => 'NezinÄms izmÄ“rs',
'upload-http-error' => 'HTTP kļūda: $1',
+# File backend
+'backend-fail-stream' => 'Nevar straumēt failu $1.',
+'backend-fail-backup' => 'Nevar dublēt failu $1.',
+'backend-fail-notexists' => 'Fails $1 nepastÄv.',
+'backend-fail-hashes' => 'NeizdevÄs iegÅ«t failu kontrolsummas salÄ«dzinÄÅ¡anai.',
+'backend-fail-notsame' => 'Neidentisks fails jau pastÄv $1.',
+'backend-fail-delete' => 'Nevar izdzēst failu $1.',
+'backend-fail-alreadyexists' => 'Fails $1 jau pastÄv.',
+'backend-fail-copy' => 'Nevar kopēt failu $1 uz $2.',
+'backend-fail-move' => 'Nevar pÄrvietot failu $1 uz $2.',
+'backend-fail-opentemp' => 'Nevar atvērt pagaidu failu.',
+'backend-fail-writetemp' => 'Nevar ierakstīt pagaidu failu.',
+'backend-fail-closetemp' => 'Nevar aizvērt pagaidu failu.',
+'backend-fail-read' => 'Nevar lasīt failu $1.',
+'backend-fail-create' => 'Nevar izveidot failu $1.',
+
# ZipDirectoryReader
'zip-wrong-format' => 'NorÄdÄ«tais fails nebija ZIP fails.',
@@ -1695,12 +1716,8 @@ SkatÄ«t arÄ« [[Special:WantedCategories|''sarkanÄs'' kategorijas]].",
'activeusers-noresult' => 'Neviens lietotÄjs nav atrasts.',
# Special:Log/newusers
-'newuserlogpage' => 'Jauno lietotÄju reÄ£istrs',
-'newuserlogpagetext' => 'Jauno lietotÄjvÄrdu reÄ£istrs.',
-'newuserlog-byemail' => 'parole nosūtīta pa e-pastu',
-'newuserlog-create-entry' => 'ReÄ£istrÄ“ts lietotÄjvÄrds',
-'newuserlog-create2-entry' => 'izveidoja jaunu kontu $1',
-'newuserlog-autocreate-entry' => 'AutomÄtiski reÄ£istrÄ“ts lietotÄjvÄrds',
+'newuserlogpage' => 'Jauno lietotÄju reÄ£istrs',
+'newuserlogpagetext' => 'Jauno lietotÄjvÄrdu reÄ£istrs.',
# Special:ListGroupRights
'listgrouprights' => 'LietotÄju grupu tiesÄ«bas',
@@ -1725,7 +1742,7 @@ Papildu informÄciju par katru individuÄlu piekļuves tiesÄ«bu veidu, iespÄ“jam
'emailpagetext' => 'Ar Å¡o veidni ir iespÄ“jams nosÅ«tÄ«t e-pastu Å¡im lietotÄjam.
TÄ e-pasta adrese, kuru tu esi norÄdÄ«jis [[Special:Preferences|savÄ izvēļu lapÄ]], parÄdÄ«sies e-pasta "From" lauciņÄ, tÄdejÄdi saņēmÄ“js varÄ“s tev atbildÄ“t.',
'usermailererror' => 'Pasta objekts atgrieza kļūdu:',
-'defemailsubject' => 'E-pasts par {{grammar:akuzatīvs|{{SITENAME}}}}',
+'defemailsubject' => '{{SITENAME}} e-pasts no lietotÄja "$1"',
'usermaildisabled' => 'LietotÄja e-pasts atslÄ“gts',
'usermaildisabledtext' => 'JÅ«s nevarat sÅ«tÄ«t e-pastu citiem lietotÄjiem Å¡ajÄ viki',
'noemailtitle' => 'Nav e-pasta adreses',
@@ -1836,7 +1853,6 @@ PapildinformÄcija:
'actionfailed' => 'DarbÄ«ba neizdevÄs',
'deletedtext' => 'Lapa "$1" ir izdzēsta.
Šeit var apskatīties pēdējos izdzēstos: "$2".',
-'deletedarticle' => 'izdzēsa "[[$1]]"',
'dellogpage' => 'Dzēšanas reģistrs',
'dellogpagetext' => 'Å ajÄ lapÄ ir pÄ“dÄ“jo dzÄ“sto lapu saraksts.',
'deletionlog' => 'dzēšanas reģistrs',
@@ -1880,6 +1896,7 @@ Lūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlrei
'unprotectedarticle' => 'atcēla "[[$1]]" aizsardzību',
'movedarticleprotection' => 'pÄrcÄ“la aizsardzÄ«bu no "[[$2]]" uz "[[$1]]"',
'protect-title' => 'IzmainÄ«t "$1" aizsargÄÅ¡anas lÄ«meni?',
+'protect-title-notallowed' => 'Apskatīt "$1" aizsrdzības līmeni',
'prot_1movedto2' => '"[[$1]]" pÄrdÄ“vÄ“ju par "[[$2]]"',
'protect-legend' => 'ApstiprinÄt aizsargÄÅ¡anu',
'protectcomment' => 'Iemesls:',
@@ -1896,6 +1913,7 @@ Pašreizējie lapas '''$1''' iestatījumi ir:",
'protect-level-sysop' => 'Tikai adminiem',
'protect-summary-cascade' => 'kaskÄde',
'protect-expiring' => 'līdz $1 (UTC)',
+'protect-expiring-local' => 'beidzas $1',
'protect-expiry-indefinite' => 'bezgalīgs',
'protect-cascade' => "AizsargÄt Å¡ajÄ lapÄ iekļautÄs lapas (veidnes) ''(cascading protection)''",
'protect-cantedit' => 'Tu nevari izmainÄ«t Å¡Ä«s lapas aizsardzÄ«bas lÄ«meņus, tÄpÄ“c, ka tur nevari izmainÄ«t Å¡o lapu.',
@@ -1955,7 +1973,6 @@ Vai nu tu Å¡eit esi nonÄcis lietojot kļūdainu saiti, vai arÄ« Å¡Ä« versija ja
'undeletereset' => 'Notīrīt',
'undeleteinvert' => 'Izvēlēties pretēji',
'undeletecomment' => 'Iemesls:',
-'undeletedarticle' => 'atjaunoja "[[$1]]"',
'undeletedrevisions' => '$1 {{PLURAL:$1|versija|versijas}} {{PLURAL:$1|atjaunota|atjaunotas}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versija|$1 versijas}} un {{PLURAL:$2|1 fails|$2 faili}} atjaunoti',
'undeletedfiles' => '{{PLURAL:$1|1 fails atjaunots|$1 faili atjaunoti}}',
@@ -1965,6 +1982,7 @@ kÄds cits iespÄ“jams to ir atjaunojis ÄtrÄk.',
[[Special:Log/delete|DzÄ“Å¡anas reÄ£istrÄ]] ir informÄcija par pÄ“dÄ“jÄm dzÄ“Å¡anÄm un atjaunoÅ¡anÄm.",
'undelete-header' => 'Nesen dzÄ“stajÄm lapÄm skatÄ«t [[Special:Log/delete|dzÄ“Å¡anas reÄ£istru]].',
+'undelete-search-title' => 'MeklÄ“t izdzÄ“stÄs lapas',
'undelete-search-box' => 'MeklÄ“t izdzÄ“stÄs lapas',
'undelete-search-prefix' => 'RÄdÄ«t lapas sÄkot ar:',
'undelete-search-submit' => 'Meklēt',
@@ -2099,6 +2117,7 @@ Visus blokus var apskatÄ«ties [[Special:BlockList|IP bloku sarakstÄ]].',
'unblocklink' => 'atbloÄ·Ä“t',
'change-blocklink' => 'izmainīt bloku',
'contribslink' => 'devums',
+'emaillink' => 'nosūtīt e-pastu',
'autoblocker' => 'Tava IP ir nobloÄ·Ä“ta automÄtiski, tÄpÄ“c, ka to nesen lietojis "[[User:$1|$1]]".
Viņa bloķēšanas iemesls bija: "$2"',
'blocklogpage' => 'Bloķēšanas reģistrs',
@@ -2192,9 +2211,6 @@ Ja tomÄ“r vÄ“lÄ“sies, tad tev Å¡Ä« diskusiju lapa bÅ«s jÄpÄrvieto vai jÄapvie
'movepage-page-exists' => 'Lapa $1 jau eksistÄ“ un to nevar pÄrrakstÄ«t automÄtiski.',
'movepage-page-moved' => 'Lapa $1 tika pÄrvietota uz $2.',
'movepage-page-unmoved' => 'Lapu $1 nevarÄ“ja pÄrvietot uz $2.',
-'1movedto2' => '"[[$1]]" pÄrdÄ“vÄ“ju par "[[$2]]"',
-'1movedto2_redir' => '[[$1]] tika pÄrdÄ“vÄ“ts par [[$2]], izmantojot pÄradresÄciju',
-'move-redirect-suppressed' => 'pÄradresÄcija netika izveidota',
'movelogpage' => 'PÄrvietoÅ¡anas reÄ£istrs',
'movelogpagetext' => 'Lapu pÄrvietoÅ¡anas (pÄrdÄ“vÄ“Å¡anas) reÄ£istrs.',
'movesubpage' => '{{PLURAL:$1|Apakšlapa|Apakšlapas}}',
@@ -2207,7 +2223,7 @@ Ja tomÄ“r vÄ“lÄ“sies, tad tev Å¡Ä« diskusiju lapa bÅ«s jÄpÄrvieto vai jÄapvie
Mērķa lapa "[[:$1]]" jau eksistē.
Vai tu to gribi izdzÄ“st, lai atbrÄ«votu vietu pÄrvietoÅ¡anai?',
'delete_and_move_confirm' => 'JÄ, dzÄ“st lapu',
-'delete_and_move_reason' => 'IzdzÄ“sts, lai atbrÄ«votu vietu pÄrvietoÅ¡anai',
+'delete_and_move_reason' => 'IzdzÄ“sts, lai atbrÄ«votu vietu pÄrvietoÅ¡anai no "[[$1]]"',
'selfmove' => 'Izejas un mÄ“rÄ·a lapu nosaukumi ir vienÄdi;
nevar pÄrvietot lapu uz sevi.',
'immobile-source-namespace' => 'Nevar pÄrvietot lapas vÄrdtelpÄ "$1"',
@@ -2437,9 +2453,6 @@ To visticamÄk izraisÄ«ja ÄrÄ“ja saite uz melnajÄ sarakstÄ esoÅ¡u interneta v
# Patrol log
'patrol-log-page' => 'PÄrbaudes reÄ£istrs',
'patrol-log-header' => 'Å is ir pÄrbaudÄ«to versiju reÄ£istrs.',
-'patrol-log-line' => '"$2" lapas $1 atzÄ«mÄ“ta kÄ pÄrbaudÄ«ta $3',
-'patrol-log-auto' => '(automÄtiski)',
-'patrol-log-diff' => 'versija $1',
'log-show-hide-patrol' => '$1 pÄrbaudes reÄ£istrs',
# Image deletion
@@ -2464,11 +2477,11 @@ $1',
'file-info' => 'faila izmērs: $1, MIME tips: $2',
'file-info-size' => '$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4',
'file-info-size-pages' => '$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4, $5 {{PLURAL:$5|lapa|lapas}}',
-'file-nohires' => '<small>AugstÄka izÅ¡Ä·irtspÄ“ja nav pieejama.</small>',
+'file-nohires' => 'AugstÄka izÅ¡Ä·irtspÄ“ja nav pieejama.',
'svg-long-desc' => 'SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3',
'show-big-image' => 'PilnÄ izmÄ“rÄ',
-'show-big-image-preview' => '<small>Šī priekšskata izmērs: $1.</small>',
-'show-big-image-other' => '<small>Citi izmēri: $1.</small>',
+'show-big-image-preview' => 'Šī priekšskata izmērs: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Cits izmērs|Citi izmēri}}: $1.',
'show-big-image-size' => '$1 × $2 pikseļi',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kadrs|kadri}}',
'file-info-png-repeat' => 'spēlēts $1 {{PLURAL:$1|reizi|reizes}}',
@@ -2486,6 +2499,13 @@ $1',
'bydate' => '<b>pēc datuma</b>',
'sp-newimages-showfrom' => 'RÄdÄ«t jaunos attÄ“lus sÄkot no $1, $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunde|$1 sekundes}}',
+'minutes' => '{{PLURAL:$1|$1 minūte|$1 minūtes}}',
+'hours' => '{{PLURAL:$1|$1 stunda|$1 stundas}}',
+'days' => '{{PLURAL:$1|$1 diena|$1 dienas}}',
+'ago' => 'pirms $1',
+
# Bad image list
'bad_image_list' => 'FormÄts:
@@ -2853,9 +2873,6 @@ Si apstiprinajuma koda deriguma termins ir $4.',
'scarytranscludefailed' => '[NeizdevÄs ienest veidni $1.]',
'scarytranscludetoolong' => '[URL adrese ir pÄrÄk gara.]',
-# Trackbacks
-'trackbackremove' => '([$1 Dzēst])',
-
# Delete conflict
'deletedwhileediting' => "'''BrÄ«dinÄjums:''' Å Ä« lapa tika izdzÄ“sta, pÄ“c tam, kad tu to sÄki izmainÄ«t!",
'confirmrecreate' => "LietotÄjs [[User:$1|$1]] ([[User talk:$1|diskusija]]) izdzÄ“sa Å¡o lapu, pÄ“c tam, kad tu to biji sÄcis rediģēt, ar iemeslu:
@@ -3005,13 +3022,16 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'tags-hitcount' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
# Special:ComparePages
-'comparepages' => 'SalÄ«dzinÄt lapas',
-'compare-selector' => 'SalÄ«dzinÄt lapu versijas',
-'compare-page1' => '1. lapa',
-'compare-page2' => '2. lapa',
-'compare-rev1' => '1. versija',
-'compare-rev2' => '2. versija',
-'compare-submit' => 'SalÄ«dzinÄt',
+'comparepages' => 'SalÄ«dzinÄt lapas',
+'compare-selector' => 'SalÄ«dzinÄt lapu versijas',
+'compare-page1' => '1. lapa',
+'compare-page2' => '2. lapa',
+'compare-rev1' => '1. versija',
+'compare-rev2' => '2. versija',
+'compare-submit' => 'SalÄ«dzinÄt',
+'compare-invalid-title' => 'NorÄdÄ«tais nosaukums nav derÄ«gs.',
+'compare-title-not-exists' => 'NorÄdÄ«tais nosaukums neeksistÄ“.',
+'compare-revision-not-exists' => 'NorÄdÄ«tÄ versija neeksistÄ“.',
# Database error messages
'dberr-header' => 'Šim viki ir problēma',
@@ -3039,4 +3059,41 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'sqlite-has-fts' => '$1 ar pilnteksta meklēšanas atbalstu',
'sqlite-no-fts' => '$1 bez pilnteksta meklēšanas atbalsta',
+# New logging system
+'logentry-delete-delete' => '$1 izdzēsa lapu $3',
+'logentry-delete-restore' => '$1 atjaunoja lapu $3',
+'revdelete-content-hid' => 'saturs slēpts',
+'revdelete-summary-hid' => 'labojuma kopsavilkums slēpts',
+'revdelete-uname-hid' => 'lietotÄjvÄrds slÄ“pts',
+'revdelete-content-unhid' => 'satura slēpšana atcelta',
+'revdelete-summary-unhid' => 'labojuma kopsavilkuma slēpšana atcelta',
+'revdelete-uname-unhid' => 'lietotÄjvÄrda slÄ“pÅ¡ana atcelta',
+'revdelete-restricted' => 'piemērot administratoriem ierobežojumus',
+'revdelete-unrestricted' => 'noņemt administratoriem ierobežojumus',
+'logentry-newusers-autocreate' => 'Konts $1 tika izveidots automÄtiski',
+'newuserlog-byemail' => 'parole nosūtīta pa e-pastu',
+
+# Feedback
+'feedback-subject' => 'Temats:',
+'feedback-message' => 'Ziņojums:',
+'feedback-cancel' => 'Atcelt',
+'feedback-submit' => 'Iesniegt atsauksmes',
+'feedback-adding' => 'Atsauksmes tiek pievienotas lapai...',
+'feedback-error1' => 'Kļūda: API neatpazÄ«ts rezultÄts',
+'feedback-error2' => 'Kļūda: Labojums neizdevÄs',
+'feedback-error3' => 'Kļūda: Nav atbildes no API',
+'feedback-thanks' => 'Paldies! JÅ«su atsauksmes ir ievietotas lapÄ "[$2 $1]".',
+'feedback-close' => 'Gatavs',
+'feedback-bugnew' => 'Es pÄrbaudÄ«ju. Ziņot par jaunu kļūdu',
+
+# API errors
+'api-error-filename-tooshort' => 'Faila nosaukums ir pÄrÄk Ä«ss.',
+'api-error-http' => 'Iekšēja kļūda: Nevar izveidot savienojumu ar serveri.',
+'api-error-ok-but-empty' => 'Iekšēja kļūda: Nav atbildes no servera.',
+'api-error-timeout' => 'Serveris neatbildÄ“ja paredzÄ“tajÄ laikÄ.',
+'api-error-unclassified' => 'NezinÄma kļūda.',
+'api-error-unknown-code' => 'NezinÄma kļūda: " $1 "',
+'api-error-unknown-warning' => 'NezinÄms brÄ«dinÄjums: $1',
+'api-error-uploaddisabled' => 'AugÅ¡upielÄde Å¡ajÄ wiki ir atslÄ“gta.',
+
);
diff --git a/languages/messages/MessagesLzh.php b/languages/messages/MessagesLzh.php
index 610113f7..3afefa99 100644
--- a/languages/messages/MessagesLzh.php
+++ b/languages/messages/MessagesLzh.php
@@ -410,13 +410,12 @@ $1',
'cannotdelete' => 'é æˆ–檔"$1"刪矣,ä¸å¾©ç‚ºä¹‹ã€‚',
'badtitle' => '無此題',
'badtitletext' => '或別ã€æˆ–缺ã€æˆ–é•ã€æˆ–他山謬éˆï¼Œæ­¤é¡Œä¸å­˜ä¹Ÿã€‚',
-'perfcached' => '下為謄本,æä¸æ–°ä¹Ÿã€‚',
-'perfcachedts' => '下為謄本,$1新之。',
+'perfcached' => '下為謄本,æä¸æ–°ä¹Ÿã€‚ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => '下為謄本,$1新之。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'wrong_wfQuery_params' => 'wfQuery()åƒæ•¸è¬¬ç„¶<br />
函å¼ï¼š $1<br />
å•èªžï¼š $2',
'viewsource' => '覽æº',
-'viewsourcefor' => '$1',
'actionthrottled' => '無為',
'actionthrottledtext' => '基å垃圾之é‡ï¼Œæ–¼çŸ­æ™‚中é™æ¬²ï¼Œçˆ¾ä¹‹ä¸Šé™å·²éŽã€‚數分後å†è©¦ä¹‹ã€‚',
'protectedpagetext' => '該é è¢«éŒ®ç„¡çº‚也。',
@@ -586,9 +585,6 @@ $2',
* 見ç¦ä¹‹äººï¼š$7
存惑å¯è©¢$1,或[[{{MediaWiki:Grouppage-sysop}}|有秩]],[[Special:Preferences|簿註]]無驛則信ä¸é£ã€‚å¦ï¼Œå­ç”¨IP $3,ç¦è™Ÿç‚º#$5。詢時切附之。",
-'blockedoriginalsource' => "'''$1'''本æºå¦‚下:",
-'blockededitsource' => "å­'''$1纂文'''如下:",
-'whitelistedittitle' => '登簿以纂',
'whitelistedittext' => '$1後方å¯çº‚文。',
'confirmedittext' => '驛證方å¯çº‚文。惠見[[Special:Preferences|簿註]]。',
'nosuchsectiontitle' => '無尋節',
@@ -798,8 +794,6 @@ $2',
'revdelete-unsuppress' => '復審解é™',
'revdelete-log' => '因:',
'revdelete-submit' => '擇{{PLURAL:$1|審}}使之',
-'revdelete-logentry' => '「[[$1]]ã€ä¹‹è¦‹å¯©å‹•çŸ£',
-'logdelete-logentry' => '「[[$1]]ã€ä¹‹äº‹è¦‹å‹•çŸ£',
'revdelete-success' => "'''見審已更也。'''",
'revdelete-failure' => "'''見審無更也:'''
$1",
@@ -811,15 +805,6 @@ $1",
'revdel-restore-visible' => 'å¯è¦‹ä¹‹å¯©',
'pagehist' => 'é å²',
'deletedhist' => '刪å²',
-'revdelete-content' => 'å­—',
-'revdelete-summary' => '摘',
-'revdelete-uname' => 'ç°¿å',
-'revdelete-restricted' => '應é™è‡³æœ‰ç§©',
-'revdelete-unrestricted' => '除é™è‡ªæœ‰ç§©',
-'revdelete-hid' => 'éš±$1',
-'revdelete-unhid' => 'éžéš±$1',
-'revdelete-log-message' => '$1之修$2',
-'logdelete-log-message' => '$1之事$2',
'revdelete-hide-current' => '錯è—æ–¼$1 $2項:ç¾ä¹‹å¯©ä¹Ÿï¼Œç„¡è—之。',
'revdelete-show-no-access' => '錯示於$1 $2項:「é™ã€ä¹‹é …,爾無通行權也。',
'revdelete-modify-no-access' => '錯改於$1 $2項:「é™ã€ä¹‹é …,爾無通行權也。',
@@ -961,7 +946,7 @@ $1",
'prefs-rc' => '近易',
'prefs-watchlist' => '哨站',
'prefs-watchlist-days' => '哨報有日',
-'prefs-watchlist-days-max' => '最大有七',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => '哨站有易',
'prefs-watchlist-edits-max' => '最多之é‡ï¼šä¸€åƒ',
'prefs-watchlist-token' => '哨幣:',
@@ -1160,7 +1145,6 @@ $1",
'right-autopatrol' => '將己纂自示為已巡查',
'right-patrolmarks' => '察近巡查記之易',
'right-unwatchedpages' => '看未哨之é ',
-'right-trackback' => '交一trackback',
'right-mergehistory' => 'ä½µé ä¹‹å²',
'right-userrights' => '纂簿權',
'right-userrights-interwiki' => '纂å¦wiki他簿之權',
@@ -1202,7 +1186,6 @@ $1",
'action-patrol' => '示他纂為巡',
'action-autopatrol' => '示己纂為巡',
'action-unwatchedpages' => '查無哨',
-'action-trackback' => '交trackback',
'action-mergehistory' => '併此é ä¹‹å²',
'action-userrights' => '纂全權',
'action-userrights-interwiki' => '纂他wiki上之權',
@@ -1675,12 +1658,8 @@ $1',
'activeusers-noresult' => '無簿矣。',
# Special:Log/newusers
-'newuserlogpage' => '誌簿',
-'newuserlogpagetext' => '此為誌簿之記也',
-'newuserlog-byemail' => '號發自電郵',
-'newuserlog-create-entry' => 'æ–°ç°¿',
-'newuserlog-create2-entry' => '已註$1之簿',
-'newuserlog-autocreate-entry' => '已自註之簿',
+'newuserlogpage' => '誌簿',
+'newuserlogpagetext' => '此為誌簿之記也',
# Special:ListGroupRights
'listgrouprights' => '權任一覽',
@@ -1807,8 +1786,6 @@ $NEWPAGE
'actioncomplete' => 'æˆçŸ£',
'actionfailed' => '敗矣',
'deletedtext' => '"$1"刪矣,見誌刪於$2。',
-'deletedarticle' => '刪焉「[[$1]]ã€',
-'suppressedarticle' => '廢焉「[[$1]]ã€',
'dellogpage' => '誌刪',
'dellogpagetext' => '近刪如下:',
'deletionlog' => '誌刪',
@@ -1920,7 +1897,6 @@ $NEWPAGE
'undeletereset' => '歸白',
'undeleteinvert' => 'å相',
'undeletecomment' => '因:',
-'undeletedarticle' => '還焉"[[$1]]"',
'undeletedrevisions' => '$1審已還',
'undeletedrevisions-files' => '$1審ã€$2檔已還',
'undeletedfiles' => '$1檔已還',
@@ -2146,9 +2122,6 @@ $1',
'movepage-page-moved' => 'é $1é·$2矣。',
'movepage-page-unmoved' => 'é $1é·$2ä¸æˆã€‚',
'movepage-max-pages' => '上之$1é é·çŸ£åŒéžè‡ªé·ä¹‹ä¸‹ã€‚',
-'1movedto2' => '[[$1]]é·è‡³[[$2]]',
-'1movedto2_redir' => '[[$1]]é·è‡³[[$2]]為渡',
-'move-redirect-suppressed' => '渡押',
'movelogpage' => '誌é·',
'movelogpagetext' => 'é é·å¦‚下:',
'movereason' => 'å› ',
@@ -2404,8 +2377,6 @@ $1',
# Patrol log
'patrol-log-page' => '誌哨',
'patrol-log-header' => '此乃誌哨也。',
-'patrol-log-line' => '令哨$2之$1$3',
-'patrol-log-auto' => '(自行)',
'log-show-hide-patrol' => '$1誌巡',
# Image deletion
@@ -2431,7 +2402,7 @@ $1',
'widthheightpage' => '$1矩$2,共$3é ',
'file-info' => '大å°ï¼š$1,MIME類型:$2',
'file-info-size' => 'åƒç´ $1矩$2,大å°ï¼š$3,MIME類型:$4',
-'file-nohires' => '<small>無以更晰。</small>',
+'file-nohires' => '無以更晰。',
'svg-long-desc' => 'SVG檔,貌有åƒç´ $1矩$2,幅$3',
'show-big-image' => '全幅',
'file-info-gif-looped' => '循',
@@ -2578,13 +2549,6 @@ $5
'scarytranscludefailed' => '[$1模ä¸å¾—]',
'scarytranscludetoolong' => '[網å€éŽé•·]',
-# Trackbacks
-'trackbackbox' => '此文之引:<br />
-$1',
-'trackbackremove' => '([$1刪])',
-'trackbacklink' => '迴響',
-'trackbackdeleteok' => 'Trackback 刪矣。',
-
# Delete conflict
'deletedwhileediting' => '警:纂中見刪。',
'confirmrecreate' => "[[User:$1|$1]]([[User talk:$1|議]])刪之有由:
@@ -2776,4 +2740,9 @@ MediaWiki乃為用之發,無擔之責也;亦無售目之默擔也。åƒGNUé€
'sqlite-has-fts' => '$1 å«å…¨æ–‡ä¹‹å°‹',
'sqlite-no-fts' => '$1 ä¸å«å…¨æ–‡ä¹‹å°‹',
+# New logging system
+'revdelete-restricted' => '應é™è‡³æœ‰ç§©',
+'revdelete-unrestricted' => '除é™è‡ªæœ‰ç§©',
+'newuserlog-byemail' => '號發自電郵',
+
);
diff --git a/languages/messages/MessagesLzz.php b/languages/messages/MessagesLzz.php
index d052708c..c50dbb6f 100644
--- a/languages/messages/MessagesLzz.php
+++ b/languages/messages/MessagesLzz.php
@@ -460,8 +460,7 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
'linksearch' => 'Galeni kʼontaktʼepe',
# Special:Log/newusers
-'newuserlogpage' => 'Ağani maxmareş kʼayitʼepe',
-'newuserlog-create-entry' => 'AÄŸani maxmare',
+'newuserlogpage' => 'Ağani maxmareş kʼayitʼepe',
# Special:ListGroupRights
'listgrouprights-members' => '(makʼaturepeşi listʼe)',
@@ -498,7 +497,6 @@ Am dulyaşen na yeçkindasen zararepe giçkinna do am dulya [[{{MediaWiki:Policy
'actioncomplete' => 'Aksiyoni içodinu.',
'deletedtext' => '"$1" nijilu.
Xolosi oras jileri na renanpe oz*iru ÅŸeni: $2.',
-'deletedarticle' => '"[[$1]]" aya nijilu',
'dellogpage' => 'Ojiluşi kʼayitʼepe',
'deletecomment' => 'MuÅŸen:',
'deleteotherreason' => 'Majurani/ilave sebebi:',
@@ -533,7 +531,6 @@ Am butʼkʼaÅŸi oçvuÅŸi sinori gaktirinen; ama am oktiroba, kʼademoni oçvaluÅ
# Undelete
'undeletelink' => 'i3ʼkʼedi/komoiği',
-'undeletedarticle' => '[[$1]] goiktu.',
'undelete-search-submit' => 'Mgori',
'undelete-show-file-submit' => 'Ho',
@@ -613,8 +610,6 @@ Mu iqʼven başka coxo doçʼari.',
'talkexists' => "'''Butʼkʼa dido kʼai itirinu, mara oğarğaluşi butʼkʼa var itirinu çunki na itirinasen coxos zate ar butʼkʼa rtʼu. Mu iqʼven butʼkʼaşi doloçʼareli nç'arape majurani butʼkʼaşa ti-skani kʼala itirini.'''",
'movedto' => 'itirinu:',
'movetalk' => 'Korenna, "oğarğaluşi" butʼkʼa muşiti mendiği.',
-'1movedto2' => '[[$1]] butʼkʼa muşişi ağani coxo: [[$2]]',
-'1movedto2_redir' => '[[$1]] stʼatʼiaşi adresi iktirinu do ağani adresi [[$2]] butʼkʼaşa niçinu',
'movelogpage' => 'Coxo oktirobaşi kʼayitʼepe',
'movereason' => 'MuÅŸen:',
'revertmove' => 'komoiÄŸi',
@@ -686,7 +681,7 @@ Mu iqʼven başka coxo doçʼari.',
# Media information
'file-info-size' => '$1 × $2 pikseli, dosyaşi didinoba: $3, MIME type: $4',
-'file-nohires' => '<small>Çkva kʼai ozʼiramuşis na uğun versiyoni va ren.</small>',
+'file-nohires' => 'Çkva kʼai ozʼiramuşis na uğun versiyoni va ren.',
'svg-long-desc' => 'SVG dosya, coxoten $1 × $2 pʼikʼseli, dosyaşi didinoba: $3',
'show-big-image' => 'Tam ozʼiramuşi',
diff --git a/languages/messages/MessagesMai.php b/languages/messages/MessagesMai.php
index ebcc3fa3..5de2ecc6 100644
--- a/languages/messages/MessagesMai.php
+++ b/languages/messages/MessagesMai.php
@@ -285,6 +285,7 @@ $1',
'ok' => 'ठीक अछि',
'pagetitle-view-mainpage' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}}',
+'backlinksubtitle' => '↠$1',
'retrievedfrom' => 'पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿ सà¥à¤¥à¤² "$1"',
'youhavenewmessages' => 'अहाठलग अछि $1 ($2).',
'newmessageslink' => 'नव संदेश सभ',
@@ -380,22 +381,24 @@ $1',
'formerror' => 'फॉरà¥à¤® नै पठा सकल',
'badarticleerror' => 'ई कà¥à¤°à¤¿à¤¯à¤¾ ठपनà¥à¤¨à¤¾à¤ªà¤° नै कà¤à¤² जा सकैà¤à¥¤',
'cannotdelete' => 'पनà¥à¤¨à¤¾ व संचिका "$1" मेटाà¤à¤² नै जा सकल।',
+'cannotdelete-title' => 'पनà¥à¤¨à¤¾ "$1" नै मेटा सकल',
'badtitle' => 'खराप शीरà¥à¤·à¤•',
'badtitletext' => 'आगà¥à¤°à¤¹ कà¤à¤² पनà¥à¤¨à¤¾à¤• शीरà¥à¤·à¤• गलत, खाली, वा गलत समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ अनà¥à¤¤à¤°-नà¥à¤¹à¤¾à¤·à¤¾ अनà¥à¤¤à¤° विकी शीरà¥à¤·à¤• छी। ई à¤à¤• वा बेशी कलाकार यà¥à¤•à¥à¤¤ भऽ सकैठजे शीरà¥à¤·à¤•à¤®à¥‡ पà¥à¤°à¤¯à¥à¤•à¥à¤¤ नै कà¤à¤² जा सकैà¤à¥¤',
-'perfcached' => 'ई दतà¥à¤¤à¤¾à¤‚श उपसà¥à¤®à¥ƒà¤¤à¤¿à¤• आधारपर अछि आ भऽ सकैठजे अदà¥à¤¯à¤¤à¤¨ नै हà¥à¤…à¤à¥¤',
-'perfcachedts' => 'ई दतà¥à¤¤à¤¾à¤‚श उपसà¥à¤®à¥ƒà¤¤à¤¿à¤®à¥‡ अछि, आ à¤à¤•à¤° अनà¥à¤¤à¤¿à¤® परिवरà¥à¤§à¤¨ भेल अछि $1 केà¤à¥¤',
+'perfcached' => 'ई दतà¥à¤¤à¤¾à¤‚श उपसà¥à¤®à¥ƒà¤¤à¤¿à¤• आधारपर अछि आ भऽ सकैठजे अदà¥à¤¯à¤¤à¤¨ नै हà¥à¤…à¤à¥¤ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ई दतà¥à¤¤à¤¾à¤‚श उपसà¥à¤®à¥ƒà¤¤à¤¿à¤®à¥‡ अछि, आ à¤à¤•à¤° अनà¥à¤¤à¤¿à¤® परिवरà¥à¤§à¤¨ भेल अछि $1 केà¤à¥¤ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'ठपनà¥à¤¨à¤¾à¤• नवीनीकरण अखन बनà¥à¤¨ अछि।
à¤à¤¤à¥à¤•à¥à¤•à¤¾ दतà¥à¤¤à¤¾à¤‚श अखन नवीकरण नै कà¤à¤² जाà¤à¤¤à¥¤',
'wrong_wfQuery_params' => 'अमानà¥à¤¯ परिमिति ठलेल wfQuery()<br />
कà¥à¤°à¤¿à¤¯à¤¾ : $1<br />
अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾: $2',
'viewsource' => 'जड़ि देखू',
-'viewsourcefor' => '$1 लेल।',
+'viewsource-title' => '"$1" लेल जड़ि देखू',
'actionthrottled' => 'कà¥à¤°à¤¿à¤¯à¤¾à¤•à¥‡à¤ मोकल गेल',
'actionthrottledtext' => 'अनपेकà¥à¤·à¤¿à¤¤ संदेश रोका लेल, अहाà¤à¤•à¥‡à¤ ठकà¥à¤°à¤¿à¤¯à¤¾à¤•à¥‡à¤ कमà¥à¤®à¥‡ कालमे सीमासठबेशी बेर करबासठरोकल गेल अछि, अहाठओइ सीमाकेठपार कऽ गेल छी।
कृपया किछॠकाल बाद फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
'protectedpagetext' => 'ई पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ रोकबा लेल संरकà¥à¤·à¤¿à¤¤ अछि।',
'viewsourcetext' => 'अहाठठपनà¥à¤¨à¤¾à¤• जड़िकेठदेख आ अनà¥à¤•à¥ƒà¤¤ कऽ सकै छी:',
+'viewyourtext' => "अहाठ'''अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨''' केठदेख आ à¤à¤¤à¤ उतारि सकै छी:",
'protectedinterface' => 'ई पनà¥à¤¨à¤¾ तंतà¥à¤°à¤¾à¤‚श लेल मधà¥à¤¯à¤¸à¥à¤¥ पाठक वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ करैत अछि, आ अपशबà¥à¤¦ रोकबाक बà¥à¤¯à¥‹à¤‚त करैत अछि।',
'editinginterface' => "'''चेतौनी''' अहाठà¤à¤•à¤Ÿà¤¾ à¤à¤¹à¥‡à¤¨ पनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी जे तंतà¥à¤°à¤¾à¤‚शक मधà¥à¤¯à¤¸à¥à¤¥ पनà¥à¤¨à¤¾à¤•à¥‡à¤ पाठ देबा लेल पà¥à¤°à¤¯à¥‹à¤— भऽ रहल अछि।
ठपनà¥à¤¨à¤¾à¤®à¥‡ परिवरà¥à¤¤à¤¨ दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लेल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ मधà¥à¤¯à¤¸à¥à¤¥à¤• रूपमे परिवरà¥à¤¤à¤¨ करत।
@@ -498,6 +501,7 @@ $2',
'emailconfirmlink' => 'अपन ई-पतà¥à¤° संकेत सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करू',
'invalidemailaddress' => 'अमानà¥à¤¯ पà¥à¤°à¤¾à¤°à¥‚पक कारण ठई-पतà¥à¤° संकेतकेठसà¥à¤µà¥€à¤•à¤¾à¤° नै कà¤à¤² जा सकैà¤à¥¤
à¤à¤•à¤Ÿà¤¾ मानà¥à¤¯ ई-पतà¥à¤° संकेत लिखू वा ओइ सà¥à¤¥à¤¾à¤¨à¤•à¥‡à¤ खाली करू।',
+'cannotchangeemail' => 'खाता ई-पतà¥à¤° संकेत ठविकीपर बदलल नै जा सकैà¤à¥¤',
'accountcreated' => 'खाता खà¥à¤œà¤¿ गेल',
'accountcreatedtext' => '$1 लेल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता खà¥à¤œà¤¿ गेल।',
'createaccount-title' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} लेल खाता निरà¥à¤®à¤¾à¤£',
@@ -514,6 +518,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'पी.à¤à¤š.पी.क संदेश कारà¥à¤¯() मे अजà¥à¤žà¤¾à¤¤ दोष',
+'user-mail-no-addy' => 'बिन ई-पतà¥à¤° संकेतक ई-पतà¥à¤° पठेबाक पà¥à¤°à¤¯à¤¾à¤¸',
# Change password dialog
'resetpass' => 'कूटशबà¥à¤¦ बदलू',
@@ -536,28 +541,43 @@ $2',
'resetpass-temp-password' => 'तातà¥à¤•à¤¾à¤²à¤¿à¤• कूटशबà¥à¤¦',
# Special:PasswordReset
-'passwordreset' => 'कूटशबà¥à¤¦ फेरसठबनाउ',
-'passwordreset-text' => 'ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ अपन खाता विवरणक सà¥à¤®à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ करबा लेल ठफॉरà¥à¤®à¤•à¥‡à¤ भरू।',
-'passwordreset-legend' => 'कूटशबà¥à¤¦ फेरसठबनाउ',
-'passwordreset-disabled' => 'कूटशबà¥à¤¦ फेरसठबनाà¤à¤¬ ठविकीपर अकà¥à¤·à¤® कà¤à¤² अछि।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचाà¤à¤• दतà¥à¤¤à¤¾à¤‚शक à¤à¤•à¤Ÿà¤¾ भागक पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करू}}',
-'passwordreset-username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®',
-'passwordreset-domain' => 'कà¥à¤·à¥‡à¤¤à¥à¤°:',
-'passwordreset-email' => 'ई-पतà¥à¤° संकेत',
-'passwordreset-emailtitle' => 'लेखा विवरण {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²à¤• नाम}}',
-'passwordreset-emailtext-ip' => 'कियो (समà¥à¤­à¤µà¤¤à¤ƒ अहाà¤, अनà¥à¤¤à¤°à¥à¤œà¤¾à¤² सेवा कलà¥à¤ªà¤• $1 सà¤) अपन लेखा विवरणक पà¥à¤¨à¤ƒà¤¸à¥à¤®à¤°à¤£à¤• लेल अनà¥à¤°à¥‹à¤§ केलहà¥à¤ ठलेल {{ अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²à¤• नाम}} ($4). ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ {{PLURAL:$3|लेखा अछि| लेखा सभ अछि}}
+'passwordreset' => 'कूटशबà¥à¤¦ फेरसठबनाउ',
+'passwordreset-text' => 'ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ अपन खाता विवरणक सà¥à¤®à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ करबा लेल ठफॉरà¥à¤®à¤•à¥‡à¤ भरू।',
+'passwordreset-legend' => 'कूटशबà¥à¤¦ फेरसठबनाउ',
+'passwordreset-disabled' => 'कूटशबà¥à¤¦ फेरसठबनाà¤à¤¬ ठविकीपर अकà¥à¤·à¤® कà¤à¤² अछि।',
+'passwordreset-pretext' => '{{PLURAL:$1||नीचाà¤à¤• दतà¥à¤¤à¤¾à¤‚शक à¤à¤•à¤Ÿà¤¾ भागक पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करू}}',
+'passwordreset-username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®',
+'passwordreset-domain' => 'कà¥à¤·à¥‡à¤¤à¥à¤°:',
+'passwordreset-capture' => 'परिणाम ई-पतà¥à¤° देखू?',
+'passwordreset-capture-help' => 'जठअहाठठबकà¥à¤¶à¤¾à¤•à¥‡à¤ देखै छी, ई-पतà¥à¤° (तातà¥à¤•à¤¾à¤²à¤¿à¤• कूटशबà¥à¤¦à¤• संग) अहाà¤à¤•à¥‡à¤ देखाà¤à¤² जाà¤à¤¤ आ संगे पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ पठाà¤à¤² जाà¤à¤¤à¥¤',
+'passwordreset-email' => 'ई-पतà¥à¤° संकेत',
+'passwordreset-emailtitle' => 'लेखा विवरण {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²à¤• नाम}}',
+'passwordreset-emailtext-ip' => 'कियो (समà¥à¤­à¤µà¤¤à¤ƒ अहाà¤, अनà¥à¤¤à¤°à¥à¤œà¤¾à¤² सेवा कलà¥à¤ªà¤• $1 सà¤) अपन लेखा विवरणक पà¥à¤¨à¤ƒà¤¸à¥à¤®à¤°à¤£à¤• लेल अनà¥à¤°à¥‹à¤§ केलहà¥à¤ ठलेल {{ अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²à¤• नाम}} ($4). ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ {{PLURAL:$3|लेखा अछि| लेखा सभ अछि}}
ठई-पतà¥à¤° संकेतसठसमà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤:
$2
{{PLURAL:$3|ई अलà¥à¤ªà¤•à¤¾à¤²à¤• कूटशबà¥à¤¦| ई सभ अलà¥à¤ªà¤•à¤¾à¤²à¤• कूटशबà¥à¤¦}} खतम भऽ जाà¤à¤¤ {{PLURAL:$5|à¤à¤• दिन|$5 पाà¤à¤š दिन}}.
अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू आ à¤à¤•à¤Ÿà¤¾ नव कूटशबà¥à¤¦ चà¥à¤¨à¥‚।. जौं कियो आन ई आगà¥à¤°à¤¹ केने अछि, वा अहाà¤à¤•à¥‡à¤ अपन पà¥à¤°à¤¾à¤¨ कूटशबà¥à¤¦ मोन पड़ि गेल अछि , आ आब à¤à¤•à¤°à¤¾ बदलबाक इचà¥à¤›à¤¾ नै राखै छी तठअहाठठसंदेशकेठबिसरि जाउ आ अपन पà¥à¤°à¤¾à¤¨ कूटशबà¥à¤¦à¤• पà¥à¤°à¤¯à¥‹à¤— करैत रहू।',
-'passwordreset-emailtext-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ $1 {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पर अहाà¤à¤• खाता विवरणक {{SITENAME}} लेल फेरसठ($4) आगà¥à¤°à¤¹ केने छथि। ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ठई-पतà¥à¤° संकेतसठजà¥à¤¡à¤¼à¤²: $2
+'passwordreset-emailtext-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ $1 {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पर अहाà¤à¤• खाता विवरणक {{SITENAME}} लेल फेरसठ($4) आगà¥à¤°à¤¹ केने छथि। ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ठई-पतà¥à¤° संकेतसठजà¥à¤¡à¤¼à¤²: $2
{{PLURAL:$3| ई असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦|ई सभ असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦}} खतम भऽ जाà¤à¤¤ {{PLURAL:$5|à¤à¤• दिन|$5 दिन}} मे।
अहाठसमà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू आ à¤à¤•à¤Ÿà¤¾ नव कूटशबà¥à¤¦ आब चà¥à¤¨à¥‚। जठकियो दोसर ई आगà¥à¤°à¤¹ केने छथि, वा जठअहाà¤à¤•à¥‡à¤ अपन मूल कूटशबà¥à¤¦ मोन पड़ि गेल अछि, आ अहाठआब ओइ कूटशबà¥à¤¦à¤•à¥‡à¤ नै बदलऽ चाहै छी, अहाठठसंदेशकेठबिसरि सकै छी आ अपन पà¥à¤°à¤¾à¤¨ कूटशबà¥à¤¦à¤• पà¥à¤°à¤¯à¥‹à¤— जारी राखि सकै छी।',
-'passwordreset-emailelement' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾: $1
+'passwordreset-emailelement' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾: $1
असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦: $2',
-'passwordreset-emailsent' => 'à¤à¤•à¤Ÿà¤¾ ई-पतà¥à¤° मोन पाड़बा लेल पठाओल गेल अछि।',
+'passwordreset-emailsent' => 'à¤à¤•à¤Ÿà¤¾ ई-पतà¥à¤° मोन पाड़बा लेल पठाओल गेल अछि।',
+'passwordreset-emailsent-capture' => 'à¤à¤•à¤Ÿà¤¾ सà¥à¤®à¤°à¤£ ई-पतà¥à¤° पठाà¤à¤² गेल अछि, जे नीचाठदेखाà¤à¤² अछि।',
+'passwordreset-emailerror-capture' => 'à¤à¤•à¤Ÿà¤¾ सà¥à¤®à¤°à¤£ ई-पतà¥à¤° बनाà¤à¤² गेल अछि, जे नीचाठदेखाà¤à¤² अछि, मà¥à¤¦à¤¾ पà¥à¤°à¥à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ à¤à¤•à¤°à¤¾ पठेबाक पà¥à¤°à¤¯à¤¾à¤¸ विफल भेल: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ई-पतà¥à¤° संकेत बदलू',
+'changeemail-header' => 'ई-पतà¥à¤° पता खाता बदलू',
+'changeemail-text' => 'अपन ई-पतà¥à¤° संकेत बदलबा लेल ठआवेदनकेठभरू। अहाà¤à¤•à¥‡à¤ ठपरिवरà¥à¤¤à¤¨à¤• अनà¥à¤®à¥‹à¤¦à¤¨ लेल अपन कूटशबà¥à¤¦ भरठपड़त।',
+'changeemail-no-info' => 'अहाà¤à¤•à¥‡à¤ ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ सोà¤à¥‡ देखबाले समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ हà¥à¤…ठपड़त।',
+'changeemail-oldemail' => 'अखà¥à¤¨à¤•à¤¾ ई-पतà¥à¤° संकेत:',
+'changeemail-newemail' => 'नव ई-पतà¥à¤° संकेत:',
+'changeemail-none' => '(कोनो नै)',
+'changeemail-submit' => 'ई-पतà¥à¤° संकेत बदलू',
+'changeemail-cancel' => 'खतम',
# Edit page toolbar
'bold_sample' => 'गà¤à¤¹à¥€à¤° लेखन',
@@ -626,9 +646,6 @@ $2
अहाà¤à¤• वरà¥à¤¤à¤®à¤¾à¤¨ अनिकेत अछि $3, आ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ संखà¥à¤¯à¤¾ अछि # $5 ।
ठसभ विवरणक उलà¥à¤²à¥‡à¤– अहाठअपन कोनो कà¤à¤² जाइबला पà¥à¤°à¤¶à¥à¤¨à¤®à¥‡ करू।',
'blockednoreason' => 'कोनो कारण देल नै अछि।',
-'blockedoriginalsource' => "'''$1''' क कारण नीचाठदेल अछि।",
-'blockededitsource' => "'''अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨ सभ''' क पाठ '''$1''' क सनà¥à¤¦à¤°à¥à¤­à¤®à¥‡ नीचाठदेल अछि:",
-'whitelistedittitle' => 'समà¥à¤ªà¤¾à¤¦à¤¨ लेल समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ आवशà¥à¤¯à¤• अछि',
'whitelistedittext' => 'अहाà¤à¤•à¥‡à¤ $1पनà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ करबा लेल',
'confirmedittext' => 'पनà¥à¤¨à¤¾ सभक समà¥à¤ªà¤¾à¤¦à¤¨ केलासठपूरà¥à¤µ अहाठअपन ई-पतà¥à¤° संकेतकेठसतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करू।
कृपा कऽ अपन ई-पतà¥à¤° पता दरà¥à¤œ करू आ सतà¥à¤¯à¤¾à¤ªà¤¿à¤¤ करू ठसठ[[Special:Preferences|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पसिनà¥à¤¨ सभ]]',
@@ -883,8 +900,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'revdelete-unsuppress' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ संशोधल लेल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
'revdelete-log' => 'कारण:',
'revdelete-submit' => 'किछॠचà¥à¤¨à¤²à¤ªà¤° लागू करू{{PLURAL:$1|संशोधन|संशोधन सभ}}',
-'revdelete-logentry' => '"[[$1]]"क बदलल संशोधन दृशà¥à¤¯à¤¤à¤¾',
-'logdelete-logentry' => '"[[$1]]"क बदलल घटना दृशà¥à¤¯à¤¤à¤¾',
'revdelete-success' => "'''संशोधन दृशà¥à¤¯à¤¤à¤¾ सफलतापूरà¥à¤µà¤• अदà¥à¤¯à¤¤à¤¨ कà¤à¤² गेल।'''",
'revdelete-failure' => "$1'''संशोधन दृशà¥à¤¯à¤¤à¤¾ अदà¥à¤¯à¤¤à¤¨ नै कà¤à¤² जा सकल:'''",
'logdelete-success' => "'''वृतà¥à¤¤à¤²à¥‡à¤– दृशà¥à¤¯à¤¤à¤¾ सफलतासठनिरà¥à¤§à¤¾à¤°à¤¿à¤¤ भेल।'''",
@@ -894,15 +909,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'revdel-restore-visible' => 'देखाइ दैत संशोधन सभ',
'pagehist' => 'पनà¥à¤¨à¤¾à¤• इतिहास',
'deletedhist' => 'मेटाà¤à¤² इतिहास',
-'revdelete-content' => 'विषय सूची',
-'revdelete-summary' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सारांश',
-'revdelete-uname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®',
-'revdelete-restricted' => 'संचालक लेल पà¥à¤°à¤¾à¤¯à¥‹à¤—िक पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
-'revdelete-unrestricted' => 'संचालक लेल हटाओल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
-'revdelete-hid' => 'नà¥à¤•à¤¾à¤‰ $1',
-'revdelete-unhid' => 'आनू $1',
-'revdelete-log-message' => '$2 लेल $1{{PLURAL:$2|संशोधन|संशोधन सभ}}',
-'logdelete-log-message' => '$2 लेल $1 {{PLURAL:$2|घटना|घटना सभ}}',
'revdelete-hide-current' => 'तिथि $2, $1 क अनà¥à¤•à¥à¤°à¤®à¤•à¥‡à¤ नà¥à¤•à¥‡à¤¬à¤¾ काल भà¥à¤°à¤®: ई वरà¥à¤¤à¤®à¤¾à¤¨ संशोधन छी।
ई नà¥à¤•à¤¾à¤à¤² नै जा सकैà¤à¥¤',
'revdelete-show-no-access' => 'तिथि $2, $1क बौसà¥à¤¤à¥à¤• देखेबामे भà¥à¤°à¤®: ई बौसà¥à¤¤à¥ "पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤" चिनà¥à¤¹à¤¿à¤¤ कà¤à¤² गेल अछि।',
@@ -1064,12 +1070,14 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'prefs-rc' => 'हालक परिवरà¥à¤¤à¤¨',
'prefs-watchlist' => 'साकांकà¥à¤·-सूची',
'prefs-watchlist-days' => 'साकांकà¥à¤·-सूचीमे à¤à¤¤à¥‡à¤• दिन देखाà¤à¤²:',
-'prefs-watchlist-days-max' => 'बेसीसठबेसी ७ दिन',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'बढ़ाà¤à¤² साकांकà¥à¤· सूचीमे अधिकतम परिवरà¥à¤¤à¤¨ देखाà¤à¤¬:',
'prefs-watchlist-edits-max' => 'बेसीसठबेसी:१०००',
'prefs-watchlist-token' => 'साकांकà¥à¤·-सूची खेप:',
'prefs-misc' => 'आर',
'prefs-resetpass' => 'कूटशबà¥à¤¦ बदलू',
+'prefs-changeemail' => 'ई-पतà¥à¤° संकेत बदलू',
+'prefs-setemail' => 'ई-पतà¥à¤° संकेत निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करू',
'prefs-email' => 'ई-पतà¥à¤° चà¥à¤¨à¤¾à¤µ',
'prefs-rendering' => 'मà¥à¤à¤¹à¤•à¤¾à¤¨',
'saveprefs' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू',
@@ -1131,6 +1139,7 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'yourrealname' => 'असली नाम:',
'yourlanguage' => 'भाषा:',
'yourvariant' => 'भाषा सामिगà¥à¤°à¥€ पà¥à¤°à¤•à¤¾à¤°:',
+'prefs-help-variant' => 'अहाà¤à¤• मोनमाफिक पà¥à¤°à¤•à¤¾à¤° वा भाषा-विशिषà¥à¤Ÿà¤¤à¤¾ ठविकीकेठदेखेबा लेल।',
'yournick' => 'नव पहिचान:',
'prefs-help-signature' => 'वारà¥à¤¤à¤¾ पनà¥à¤¨à¤¾ सभपर टिपà¥à¤ªà¤£à¥€ "<nowiki>~~~~</nowiki>" दà¥à¤µà¤¾à¤°à¤¾ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤¿à¤¤ हà¥à¤…ठजे अहाà¤à¤• हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° आ समय-संकेतसठमेल खाà¤à¥¤',
'badsig' => 'अमानà¥à¤¯ पà¥à¤°à¤¾à¤°à¤®à¥à¤­à¤¿à¤• पहिचान।
@@ -1174,7 +1183,7 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'userrights-lookup-user' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभक पà¥à¤°à¤¬à¤¨à¥à¤§ करू',
'userrights-user-editname' => 'à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® लिखू:',
'editusergroup' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
-'editinguser' => "'''[[User:$1|$1]]''' क पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार बदलल जा रहल अछि '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार बदलब '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
'saveusergroups' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— सभकेठसà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करू',
'userrights-groupsmember' => 'क सदसà¥à¤¯:',
@@ -1269,13 +1278,13 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'right-autopatrol' => 'अपन समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठसंचालित देखाउ',
'right-patrolmarks' => 'हालक परिवरà¥à¤¤à¤¨à¤®à¥‡ संचालन चेनà¥à¤¹ देखू',
'right-unwatchedpages' => 'बिना संचालित पनà¥à¤¨à¤¾ सभक सूचीकेठदेखू',
-'right-trackback' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ दिअ',
'right-mergehistory' => 'पनà¥à¤¨à¤¾à¤• इतिहास सभकेठमिजà¥à¤à¤° करू',
'right-userrights' => 'सभटा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारकेठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
'right-userrights-interwiki' => 'दोसर विकीपर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
'right-siteadmin' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू आ फेर पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
'right-override-export-depth' => '५ परत धरि जा पनà¥à¤¨à¤¾ सभ निरà¥à¤¯à¤¾à¤¤, जइमे लागिबला पनà¥à¤¨à¤¾ सभ शामिल अछि, करू।',
'right-sendemail' => 'ई-पतà¥à¤° दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लोकनिकेठपठाउ',
+'right-passwordreset' => 'कूटशबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤£ ई-पतà¥à¤° देखू',
# User rights log
'rightslog' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार वृतà¥à¤¤à¤²à¥‡à¤–',
@@ -1309,16 +1318,17 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'action-suppressionlog' => 'ठवà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त वृतà¥à¤¤à¤²à¥‡à¤–केठदेखू',
'action-block' => 'ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤ रोकू',
'action-protect' => 'ठपनà¥à¤¨à¤¾à¤• सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° बदलू',
+'action-rollback' => 'कृपा कऽ अनà¥à¤¤à¤¿à¤® पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ पà¥à¤°à¤¤à¥à¤¯à¤¾à¤µà¤°à¥à¤¤à¤¿à¤¤ करू जे à¤à¤• खास पनà¥à¤¨à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ केलनà¥à¤¹à¤¿',
'action-import' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ दोसर विकीसठआनू',
'action-importupload' => 'ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ संचिका उपारोपणसठआनू',
'action-patrol' => 'दोसराक समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ संचालित देखाउ',
'action-autopatrol' => 'अपन समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ संचालित देखाउ',
'action-unwatchedpages' => 'बिना संचालित पनà¥à¤¨à¤¾ सभक सूचीकेठदेखू',
-'action-trackback' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ दिअ',
'action-mergehistory' => 'पनà¥à¤¨à¤¾à¤• इतिहासकेठमिजà¥à¤à¤° करू',
'action-userrights' => 'सभटा पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारकेठसमà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
'action-userrights-interwiki' => 'दोसर विकीपर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकारक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
'action-siteadmin' => 'दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤•à¥‡à¤ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू आ फेर पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाउ',
+'action-sendemail' => 'ई-पतà¥à¤° पठाउ',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¥à¤¤à¤¨|परिवरà¥à¤¤à¥à¤¤à¤¨}}',
@@ -1348,7 +1358,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'newpageletter' => 'न',
'boteditletter' => 'ब',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 देखै अछि {{PLURAL:$1|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ सभ}}]',
'rc_categories' => 'संवरà¥à¤— सीमित ("|" सठहटाउ)',
'rc_categories_any' => 'कोनो',
@@ -1404,6 +1413,7 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'minlength1' => 'संचिका नाम सभ à¤à¤• वरà¥à¤£à¤¸à¤ कम नै हà¥à¤…à¤',
'illegalfilename' => '"$1" संचिकानाममे वरà¥à¤£ अछि जे पनà¥à¤¨à¤¾ शीरà¥à¤·à¤• लेल मानà¥à¤¯ नै अछि।
कृपा कऽ संचिकाक नाम बदलू आ फेरसठउपारोपित करू।',
+'filename-toolong' => 'संचिकानाम 240 बाइटसठपैघ नै भऽ सकैà¤à¥¤',
'badfilename' => 'संचिकानाम बदलि कऽ "$1" कà¤à¤² गेल।',
'filetype-mime-mismatch' => '".$1" संचिका विसà¥à¤¤à¤¾à¤° माइम पà¥à¤°à¤•à¤¾à¤°à¤• संचिका ($2) सठमेल नै खाइà¤à¥¤',
'filetype-badmime' => 'माइम पà¥à¤°à¤•à¤¾à¤° "$1" सन संचिका उपारोपण लेल मानà¥à¤¯ नै अछि।',
@@ -1521,6 +1531,7 @@ $1',
'uploadstash-badtoken' => 'ओइ कारà¥à¤¯à¤• समà¥à¤ªà¤¾à¤¦à¤¨ असफल रहल, पà¥à¤°à¤¾à¤¯à¤ƒ अहाà¤à¤• समà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯à¤¤à¤¾ खतम भऽ गेल अछि। फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
'uploadstash-errclear' => 'संचिका सभकेठखतम करब असफल रहल।',
'uploadstash-refresh' => 'संचिका सभक सूचीकेठताजा करू।',
+'invalid-chunk-offset' => 'à¤à¤•à¤Ÿà¥à¤ à¥‡ अमानà¥à¤¯ बौसà¥à¤¤à¥',
# img_auth script messages
'img-auth-accessdenied' => 'पà¥à¤°à¤µà¥‡à¤¶ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤',
@@ -1630,23 +1641,24 @@ $1',
'filerevert-badversion' => 'ओइ कालक कोनो पà¥à¤°à¤¾à¤¨ सà¥à¤¥à¤¾à¤¨à¥€à¤¯ संसà¥à¤•à¤°à¤£ ठसंचिकाक नै अछि।',
# File deletion
-'filedelete' => '$1 केठमेटाउ',
-'filedelete-legend' => 'संचिका मेटाउ',
-'filedelete-intro' => "अहाठसंचिका '''[[Media:$1|$1]]''' केठà¤à¤•à¤° सभटा इतिहासक संग मेटाबैबला छी।",
-'filedelete-intro-old' => "अहाठ'''[[Media:$1|$1]]''' à¤à¤•à¤° संसà¥à¤•à¤°à¤£ [$4 $3, $2] केठमेटाबैबला छी।",
-'filedelete-comment' => 'कारण:',
-'filedelete-submit' => 'मेटाउ',
-'filedelete-success' => "'''$1''' मेटाà¤à¤² गेल।",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' à¤à¤•à¤° संसà¥à¤•à¤°à¤£ $3, $2 केठमेटा देल गेल।",
-'filedelete-nofile' => "'''$1''' नै अछि।",
-'filedelete-nofile-old' => "'''$1''' à¤à¤•à¤° कोनो संचित संसà¥à¤•à¤°à¤£ खास गà¥à¤£à¤• संग नै अछि।",
-'filedelete-otherreason' => 'दोसर/ अतिरिकà¥à¤¤ कारण:',
-'filedelete-reason-otherlist' => 'दोसर कारण',
-'filedelete-reason-dropdown' => '* सामानà¥à¤¯ हटेबाक कारण
+'filedelete' => '$1 केठमेटाउ',
+'filedelete-legend' => 'संचिका मेटाउ',
+'filedelete-intro' => "अहाठसंचिका '''[[Media:$1|$1]]''' केठà¤à¤•à¤° सभटा इतिहासक संग मेटाबैबला छी।",
+'filedelete-intro-old' => "अहाठ'''[[Media:$1|$1]]''' à¤à¤•à¤° संसà¥à¤•à¤°à¤£ [$4 $3, $2] केठमेटाबैबला छी।",
+'filedelete-comment' => 'कारण:',
+'filedelete-submit' => 'मेटाउ',
+'filedelete-success' => "'''$1''' मेटाà¤à¤² गेल।",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' à¤à¤•à¤° संसà¥à¤•à¤°à¤£ $3, $2 केठमेटा देल गेल।",
+'filedelete-nofile' => "'''$1''' नै अछि।",
+'filedelete-nofile-old' => "'''$1''' à¤à¤•à¤° कोनो संचित संसà¥à¤•à¤°à¤£ खास गà¥à¤£à¤• संग नै अछि।",
+'filedelete-otherreason' => 'दोसर/ अतिरिकà¥à¤¤ कारण:',
+'filedelete-reason-otherlist' => 'दोसर कारण',
+'filedelete-reason-dropdown' => '* सामानà¥à¤¯ हटेबाक कारण
** सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
** दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• संचिका',
-'filedelete-edit-reasonlist' => 'मेटेबाक कारणक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
-'filedelete-maintenance' => 'सà¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ कालमे संचिकाकेठमेटà¤à¤¬à¤¾à¤• आ फेरसठअनबाक कà¥à¤°à¤¿à¤¯à¤¾ कनी काल लेल अशकà¥à¤¤ कà¤à¤² गेल अछि।',
+'filedelete-edit-reasonlist' => 'मेटेबाक कारणक समà¥à¤ªà¤¾à¤¦à¤¨ करू',
+'filedelete-maintenance' => 'सà¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ कालमे संचिकाकेठमेटà¤à¤¬à¤¾à¤• आ फेरसठअनबाक कà¥à¤°à¤¿à¤¯à¤¾ कनी काल लेल अशकà¥à¤¤ कà¤à¤² गेल अछि।',
+'filedelete-maintenance-title' => 'संचिका हटा नै सकैà¤',
# MIME search
'mimesearch' => 'माइम खोज',
@@ -1770,7 +1782,7 @@ $1',
'listusers-editsonly' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करैबला पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ मातà¥à¤° देखाउ',
'listusers-creationsort' => 'निरà¥à¤®à¤¾à¤£ तिथिक हिसाबसठछाà¤à¤Ÿà¥‚',
'usereditcount' => '$1 {{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨|समà¥à¤ªà¤¾à¤¦à¤¨ सभ}}',
-'usercreated' => '$1 केठबनाà¤à¤² गेल $2 बजे',
+'usercreated' => '{{GENDER:$3| बनैलक|बनैलकिनà¥à¤¹}} $1 तिथि पर $2 काले',
'newpages' => 'नव पनà¥à¤¨à¤¾ सभ',
'newpages-username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®:',
'ancientpages' => 'सभसठपà¥à¤°à¤¾à¤¨ पनà¥à¤¨à¤¾ सभ',
@@ -1863,12 +1875,8 @@ $1',
'activeusers-noresult' => 'कोनो पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै भेटल',
# Special:Log/newusers
-'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ रचना वृतà¥à¤¤à¤²à¥‡à¤–',
-'newuserlogpagetext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ निरà¥à¤®à¤¾à¤£à¤• वृतà¥à¤¤à¤²à¥‡à¤– अछि।',
-'newuserlog-byemail' => 'कूटशबà¥à¤¦ ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ पठाà¤à¤² गेल',
-'newuserlog-create-entry' => 'नव पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता',
-'newuserlog-create2-entry' => 'नव खाता $1 बनेलौं',
-'newuserlog-autocreate-entry' => 'खाता सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठबनल',
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ रचना वृतà¥à¤¤à¤²à¥‡à¤–',
+'newuserlogpagetext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ निरà¥à¤®à¤¾à¤£à¤• वृतà¥à¤¤à¤²à¥‡à¤– अछि।',
# Special:ListGroupRights
'listgrouprights' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— अधिकार',
@@ -1897,7 +1905,7 @@ $1',
'emailpagetext' => 'अहाà¤à¤• नीचाà¤à¤• आवेदन-पतà¥à¤° ठपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ई-पतà¥à¤° संदेश पठेबा लेल पà¥à¤°à¤¯à¥‹à¤— कऽ सकै छी।
ई-पतà¥à¤° जे अहाठ[[Special:Preferences|your user preferences]] मे देलहà¥à¤ से ई-पतà¥à¤°"à¤à¤¤à¤à¤¸à¤" पतासठदेखाà¤à¤¤, से पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¥à¤¤à¤¾ सोà¤à¥‡ अहाà¤à¤•à¥‡à¤ उतà¥à¤¤à¤° देबामे समरà¥à¤¥ हेताह।',
'usermailererror' => 'ई-पतà¥à¤° बौसà¥à¤¤à¥ घà¥à¤°à¤² भà¥à¤°à¤®:',
-'defemailsubject' => '{{जालसà¥à¤¥à¤²}} ई-पतà¥à¤°',
+'defemailsubject' => '{{जालसà¥à¤¥à¤²}} पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ "$1" सठई-पतà¥à¤°',
'usermaildisabled' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ ई-पतà¥à¤° अशकà¥à¤¤',
'usermaildisabledtext' => 'अहाठदोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤•à¥‡à¤ ठविकीपर ई-पतà¥à¤° नै पठा सकै छिà¤à¥¤',
'noemailtitle' => 'कोनो ई-पतà¥à¤° पता नै',
@@ -1952,7 +1960,7 @@ $1',
'watchmethod-list' => 'साकांकà¥à¤·-सूचीक हालक समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ देखि रहल छी',
'watchlistcontains' => 'अहाà¤à¤• साकांकà¥à¤·-सूचीमे अछि $1 {{PLURAL:$1|पनà¥à¤¨à¤¾|पनà¥à¤¨à¤¾}}।',
'iteminvalidname' => "'$1' क संग समसà¥à¤¯à¤¾, अमानà¥à¤¯ नाम ...",
-'wlnote' => "नीचाठ{{PLURAL:$1|is the last change|are the last '''$1''' changes}} अनà¥à¤¤à¤¿à¤® {{PLURAL:$2|hour|'''$2''' hours}}।",
+'wlnote' => "नीचाठ{{PLURAL:$1|is the last change|are the last '''$1''' changes}} अनà¥à¤¤à¤¿à¤® {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
'wlshowlast' => 'देखाउ अनà¥à¤¤à¤¿à¤® $1 घणà¥à¤Ÿà¤¾ $2 दिन $3',
'watchlist-options' => 'साकांकà¥à¤·à¤¸à¥‚चीक विकलà¥à¤ª सभ',
@@ -2017,8 +2025,6 @@ $UNWATCHURL
'actionfailed' => 'कारà¥à¤¯ नै भेल',
'deletedtext' => '"$1" केठमेटा देल गेल अछि।
देखू $2 हालक मेटाà¤à¤² सामिगà¥à¤°à¥€à¤• अभिलेख लेल।',
-'deletedarticle' => 'मेटाà¤à¤² "[[$1]]"',
-'suppressedarticle' => 'दबाà¤à¤² "[[$1]]"',
'dellogpage' => 'मेटाà¤à¤² सामिगà¥à¤°à¥€à¤• वृतà¥à¤¤à¤²à¥‡à¤–',
'dellogpagetext' => 'नीचाठà¤à¤•à¤¦à¤® हालक मेटाà¤à¤²à¤¬à¤²à¤¾ सूची अछि।',
'deletionlog' => 'मेटाà¤à¤² सामिगà¥à¤°à¥€à¤• वृतà¥à¤¤à¤²à¥‡à¤–',
@@ -2066,7 +2072,10 @@ $2 केर संपादित आखिरी अवतरण क पà¥à¤¨
'unprotectedarticle' => 'अरकà¥à¤·à¤¿à¤¤ केलौं "[[$1]]"',
'movedarticleprotection' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° "[[$2]]" से बदल क "[[$1]]" क देल गेल.',
'protect-title' => '"$1" लेल रकà¥à¤·à¤¾ सà¥à¤¤à¤° बदलू',
+'protect-title-notallowed' => '"$1" लेल रकà¥à¤·à¤¾ सà¥à¤¤à¤° देखू',
'prot_1movedto2' => '[[$1]] गेल à¤à¤¤à¤¯ [[$2]]',
+'protect-badnamespace-title' => 'अरकà¥à¤·à¤¿à¤¤ नाम-गाम',
+'protect-badnamespace-text' => 'ठनामगामक पनà¥à¤¨à¤¾à¤®à¥‡ सà¥à¤°à¤•à¥à¤·à¤¾ समà¥à¤­à¤µ नै।',
'protect-legend' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤¤à¤¾ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करू.',
'protectcomment' => 'कारण:',
'protectexpiry' => 'खतम हà¤à¤¤:',
@@ -2088,6 +2097,7 @@ $2 केर संपादित आखिरी अवतरण क पà¥à¤¨
'protect-level-sysop' => 'माइनजन मातà¥à¤°',
'protect-summary-cascade' => 'तराउपड़ी',
'protect-expiring' => 'खतम हà¤à¤¤ $1 (UTC)',
+'protect-expiring-local' => 'खतम होइठ$1',
'protect-expiry-indefinite' => 'अनिशà¥à¤šà¤¿à¤¤',
'protect-cascade' => 'रकà¥à¤·à¤¿à¤¤ पनà¥à¤¨à¤¾ ठपनà¥à¤¨à¤¾à¤ªà¤° संकलित अछि (तराउपड़ी रकà¥à¤·à¤¾)',
'protect-cantedit' => 'अहाठठपनà¥à¤¨à¤¾à¤• रकà¥à¤·à¤¾ सà¥à¤¤à¤°à¤®à¥‡ परिवरà¥à¤¤à¤¨ नै कऽ सकै छी, कारण अहाà¤à¤•à¥‡à¤ à¤à¤•à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करबाक अनà¥à¤®à¤¤à¤¿ नै अछि।',
@@ -2148,7 +2158,6 @@ $2 केर संपादित आखिरी अवतरण क पà¥à¤¨
'undeletereset' => 'फेरसठशà¥à¤°à¥‚ करू',
'undeleteinvert' => 'उनटा चयन',
'undeletecomment' => 'कारण:',
-'undeletedarticle' => 'फेरसठओहिना "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisions}} घà¥à¤°à¤¾à¤à¤²',
'undeletedrevisions-files' => '{{PLURAL:$1|1 संशोधन|$1 संशोधन}} and {{PLURAL:$2|1 संचिका|$2 संचिका}} आनल',
'undeletedfiles' => '{{PLURAL:$1|1 संचिका|$1 संचिका सभ}} आनल',
@@ -2157,6 +2166,7 @@ $2 केर संपादित आखिरी अवतरण क पà¥à¤¨
'undeletedpage' => "'''$1 आनि लेल गेल'''$1
पूछू [[Special:Log/delete|deletion log]] वरà¥à¤¤à¤®à¤¾à¤¨ मेटाà¤à¤² आ आनल सूची लेल।",
'undelete-header' => 'देखू [[Special:Log/delete|the deletion log]] हालक मेटाà¤à¤² पनà¥à¤¨à¤¾ लेल।',
+'undelete-search-title' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾à¤•à¥‡à¤ ताकू',
'undelete-search-box' => 'मेटाà¤à¤² पनà¥à¤¨à¤¾ सभकेठताकू',
'undelete-search-prefix' => 'से शà¥à¤°à¥ भेल पनà¥à¤¨à¤¾ देखाबू.',
'undelete-search-submit' => 'ताकू',
@@ -2166,6 +2176,7 @@ $2 केर संपादित आखिरी अवतरण क पà¥à¤¨
'undelete-cleanup-error' => 'बिना पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² संचिका "$1" केठमेटेबामे भà¥à¤°à¤® संकेत।',
'undelete-missing-filearchive' => 'संचिका पेटार चेनà¥à¤¹ $1 केठनै आनि सकल कारण ई दतà¥à¤¤à¤¨à¤¿à¤§à¤¿à¤®à¥‡ नै अछि।
ई पहिनहिये आनि लेल गेल हà¤à¤¤à¥¤',
+'undelete-error' => 'पà¥à¤¨à¤ƒ पनà¥à¤¨à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¿à¤®à¥‡ भà¥à¤°à¤®',
'undelete-error-short' => 'संचिका अनबामे भà¥à¤°à¤® : $1',
'undelete-error-long' => 'संचिका अनबामे भà¥à¤°à¤® संकेत भेटल:
$1',
@@ -2286,6 +2297,7 @@ $1',
'blocklist-userblocks' => 'खाता पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§-सूची नà¥à¤•à¤¾à¤‰',
'blocklist-tempblocks' => 'असà¥à¤¥à¤¾à¤¯à¥€ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§-सूची नà¥à¤•à¤¾à¤‰',
'blocklist-addressblocks' => 'à¤à¤•à¤² अनिकेत पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ नà¥à¤•à¤¾à¤‰',
+'blocklist-rangeblocks' => 'कà¥à¤·à¥‡à¤¤à¥à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ नà¥à¤•à¤¾à¤‰',
'blocklist-timestamp' => 'समà¤à¤•à¤¾à¤²',
'blocklist-target' => 'लकà¥à¤·à¥à¤¯',
'blocklist-expiry' => 'खतम हà¤à¤¤:',
@@ -2308,6 +2320,7 @@ $1',
'unblocklink' => 'नै बारल',
'change-blocklink' => 'खणà¥à¤¡ बदलू',
'contribslink' => 'योगदान',
+'emaillink' => 'ई-पतà¥à¤° पठाउ',
'autoblocker' => 'अहाà¤à¤• अनिकेत "[[User:$1|$1]]" दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¯à¥‹à¤—क कारण सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूपेठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ भऽ गेल।
$1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
'blocklogpage' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ वृतà¥à¤¤à¤²à¥‡à¤–',
@@ -2439,9 +2452,6 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
'movepage-page-moved' => 'पनà¥à¤¨à¤¾ $1 केठ$2 लग घसका देल गेल अछि।',
'movepage-page-unmoved' => 'पनà¥à¤¨à¤¾ $1 केठ$2 लग नै घसकाà¤à¤² जा सकैà¤à¥¤',
'movepage-max-pages' => 'बेसी सें बेसी $1 पृषà¥à¤  बदलि के {{PLURAL:$1| क देल गेल अछि|क देल गेल अछि}}, आब आर पृषà¥à¤  अपने आप नहि बदलत.',
-'1movedto2' => '[[$1]] गेल à¤à¤¤à¤¯ [[$2]]',
-'1movedto2_redir' => 'घसकाà¤à¤² [[$1]] सठ[[$2]] घà¥à¤°à¥ˆà¤¸à¤ फराक',
-'move-redirect-suppressed' => 'दबाà¤à¤²à¤•à¥‡à¤ घà¥à¤®à¤¾à¤‰',
'movelogpage' => 'वृतà¥à¤¤à¤²à¥‡à¤– हटाउ',
'movelogpagetext' => 'नाम बदलल गेल लेख क सूचि नीचां देल गेल अछि',
'movesubpage' => '{{PLURAL:$1|उप पृषà¥à¤ |उप पृषà¥à¤ }}',
@@ -2454,7 +2464,7 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
लकà¥à¤·à¥à¤¯ पृषà¥à¤  "[[:$1]]" पहिने सें असà¥à¤¤à¤¿à¤¤à¥à¤µ में अछि.
नाम के बदलहि ले की अहां à¤à¤•à¤°à¤¾ हटाबय चाहैत छी ?',
'delete_and_move_confirm' => 'हà¤, पनà¥à¤¨à¤¾ मेटाउ',
-'delete_and_move_reason' => 'घसकेबा लेल जगह बनेबा लेल मेटाà¤à¤² गेल',
+'delete_and_move_reason' => '"[[$1]]" सठघसकेबा लेल जगह बनेबा लेल मेटाà¤à¤² गेल',
'selfmove' => 'सà¥à¤°à¥‹à¤¤ आ लकà¥à¤·à¥à¤¯à¤• शीरà¥à¤·à¤• à¤à¤• अछि;
पृषà¥à¤  अपà¥à¤ªà¤¨ ठाम पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित नहि भ सकत.',
'immobile-source-namespace' => 'नामसà¥à¤¥à¤¾à¤¨ "$1" मे पनà¥à¤¨à¤¾à¤•à¥‡à¤ नै घसका सकल',
@@ -2487,6 +2497,7 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
'exportcuronly' => 'अखà¥à¤¨à¤•à¤¾ संशोधन मातà¥à¤° लिअ, पूरा इतिहास नै।',
'exportnohistory' => "----
'''सूचना:''' परिणाम कà¥à¤¶à¤²à¤¤à¤¾à¤•à¥‡à¤ देखैत पनà¥à¤¨à¤¾à¤• समà¥à¤ªà¥‚रà¥à¤£ इतिहासक निरà¥à¤¯à¤¾à¤¤ अशकà¥à¤¤ कà¤à¤² गेल अछि।",
+'exportlistauthors' => 'सभ पनà¥à¤¨à¤¾à¤• समà¥à¤ªà¥‚रà¥à¤£ योगदानकरà¥à¤¤à¤¾à¤• सूची जोड़ू',
'export-submit' => 'निरà¥à¤¯à¤¾à¤¤',
'export-addcattext' => 'अहि शà¥à¤°à¥‡à¤£à¥€ केर पनà¥à¤¨à¤¾ जोडू',
'export-addcat' => 'जोडू',
@@ -2567,6 +2578,8 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
'import-token-mismatch' => 'à¤à¤• उखराहाक दतà¥à¤¤à¤¾à¤‚श खतम भऽ गेल।
फेरसठपà¥à¤°à¤¯à¤¾à¤¸ करू।',
'import-invalid-interwiki' => 'विशिषà¥à¤Ÿ विकीसठआयात नै कऽ सकै छी।',
+'import-error-edit' => '"$1" पनà¥à¤¨à¤¾ आयातित नै कà¤à¤² गेल अछि कारण अहाà¤à¤•à¥‡à¤ à¤à¤•à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करबाक अधिकार नै अछि।',
+'import-error-create' => '"$1" पनà¥à¤¨à¤¾ आयातित नै कà¤à¤² गेल अछि कारण अहाà¤à¤•à¥‡à¤ à¤à¤•à¤°à¤¾ निरà¥à¤®à¤¾à¤£ करबाक अधिकार नै अछि।',
# Import log
'importlogpage' => 'लॉगक आयात',
@@ -2702,9 +2715,6 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
# Patrol log
'patrol-log-page' => 'संचालन वृतà¥à¤¤à¤²à¥‡à¤–',
'patrol-log-header' => 'ई संचालित संशोधन सभक वृतà¥à¤¤à¤²à¥‡à¤– छी।',
-'patrol-log-line' => 'चेनà¥à¤¹à¤¾à¤¸à¥€ देल $2 क $1 संचालित $3',
-'patrol-log-auto' => '(सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤)',
-'patrol-log-diff' => 'संशोधन $1',
'log-show-hide-patrol' => '$1 निरीकà¥à¤·à¤£ वृतà¥à¤¤à¤²à¥‡à¤–',
# Image deletion
@@ -2734,8 +2744,8 @@ $1',
'file-nohires' => '<छोट>à¤à¤¸à¤ बेशी आननà¥à¤¤à¤°à¥à¤¯ उपलबà¥à¤§ नै अछि।</छोट>',
'svg-long-desc' => 'à¤à¤¸.वी.जी. फाइल, मामूली रूपमे $1 × $2 चितà¥à¤°à¤•à¤£, फाइलक आकार: $3',
'show-big-image' => 'पूरà¥à¤£ आननà¥à¤¤à¤°à¥à¤¯',
-'show-big-image-preview' => '<small>ठपूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯à¤• आकार: $1.</small>',
-'show-big-image-other' => '<small>दोसर आकार: $1.</small>',
+'show-big-image-preview' => 'ठपूरà¥à¤µà¤¦à¥ƒà¤¶à¥à¤¯à¤• आकार: $1.',
+'show-big-image-other' => 'दोसर {{PLURAL:$2|resolution|resolutions}}: $1।',
'show-big-image-size' => '$1 × $2 चितà¥à¤°à¤¾à¤£à¥',
'file-info-gif-looped' => 'घà¥à¤°à¤¿à¤¯à¤¾à¤à¤²',
'file-info-gif-frames' => '$1 {{PLURAL:$1|खाका |खाका सभ }}',
@@ -2756,7 +2766,16 @@ $1',
'sp-newimages-showfrom' => '$2, $1 सं शà¥à¤°à¥‚ होइबला नव संचिका देखाउ',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2 × $3',
+'video-dims' => '$1, $2 × $3',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
+'days-abbrev' => '$1d',
+'seconds' => '{{PLURAL:$1|$1 सेकेणà¥à¤¡|$1 सेकेणà¥à¤¡}}',
+'minutes' => '{{PLURAL:$1|$1 मिनट|$1 मिनट}}',
+'hours' => '{{PLURAL:$1|$1 घणà¥à¤Ÿà¤¾|$1 घणà¥à¤Ÿà¤¾}}',
+'days' => '{{PLURAL:$1|$1 दिन|$1 दिन}}',
+'ago' => '$1 पहिने',
# Bad image list
'bad_image_list' => 'फॉरà¥à¤®à¥‡à¤Ÿ निमà¥à¤¨ पà¥à¤°à¤•à¤¾à¤°à¥‡à¤ अछि:
@@ -3275,13 +3294,6 @@ $5
'scarytranscludefailed' => '[नमूना आनब विफल भेल $1 लेल]',
'scarytranscludetoolong' => 'यूआरà¤à¤² बड़ पैग अछि',
-# Trackbacks
-'trackbackbox' => 'अहि पृषà¥à¤ à¤• लेल :<br />
-$1',
-'trackbackremove' => '([$1 हटाऊ])',
-'trackbacklink' => 'टà¥à¤°à¥ˆà¤•à¤¬à¥ˆà¤•',
-'trackbackdeleteok' => 'टà¥à¤°à¥ˆà¤•à¤¬à¥ˆà¤• के सफलता पूरà¥à¤µà¤• मिटा देल गेल',
-
# Delete conflict
'deletedwhileediting' => "'''Warning''': अहां जखन सें संपादन शà¥à¤°à¥‚ केने छी, ओकर बाद से ई पृषà¥à¤  के मिटा देल गेल अछि.",
'confirmrecreate' => "पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ [[User:$1|$1]] ([[User talk:$1|वारà¥à¤¤à¤¾]]) अहाà¤à¤• कारण सहित समà¥à¤ªà¤¾à¤¦à¤¨à¤• बाद ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ मेटा देलक:
@@ -3364,6 +3376,9 @@ $1',
'watchlisttools-edit' => 'साकांकà¥à¤·à¤¸à¥‚चीकेठदेखू आ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
'watchlisttools-raw' => 'काà¤à¤š साकांकà¥à¤·à¤¸à¥‚ची संपादित करू',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])',
+
# Core parser functions
'unknown_extension_tag' => 'अजà¥à¤žà¤¾à¤¤ बढ़ाà¤à¤² चेनà¥à¤¹ "$1"',
'duplicate-defaultsort' => '\'\'\'चेतौनी:\'\'\' पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ विनà¥à¤¯à¤¾à¤¸ चाभी "$2" पहिलà¥à¤•à¤¾ पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ विनà¥à¤¯à¤¾à¤¸ चाभी "$1" केठखतम करैà¤à¥¤',
@@ -3462,13 +3477,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¤¨|परिवरà¥à¤¤à¤¨ सभ}}',
# Special:ComparePages
-'comparepages' => 'पनà¥à¤¨à¤¾ सभक तà¥à¤²à¤¨à¤¾ करू',
-'compare-selector' => 'पनà¥à¤¨à¤¾ सभक संशोधनक तà¥à¤²à¤¨à¤¾ करू',
-'compare-page1' => 'पनà¥à¤¨à¤¾ १',
-'compare-page2' => 'पनà¥à¤¨à¤¾ २',
-'compare-rev1' => 'संशोधन १',
-'compare-rev2' => 'संशोधन २',
-'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करू',
+'comparepages' => 'पनà¥à¤¨à¤¾ सभक तà¥à¤²à¤¨à¤¾ करू',
+'compare-selector' => 'पनà¥à¤¨à¤¾ सभक संशोधनक तà¥à¤²à¤¨à¤¾ करू',
+'compare-page1' => 'पनà¥à¤¨à¤¾ १',
+'compare-page2' => 'पनà¥à¤¨à¤¾ २',
+'compare-rev1' => 'संशोधन १',
+'compare-rev2' => 'संशोधन २',
+'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करू',
+'compare-invalid-title' => 'जे शीरà¥à¤·à¤• अहाठदेलौं से अमानà¥à¤¯ अछि।',
+'compare-title-not-exists' => 'जे शीरà¥à¤·à¤• अहाठकहलौं से अछिये नै।',
+'compare-revision-not-exists' => 'जे संशोधन अहाठकहलौं से अछिये नै।',
# Database error messages
'dberr-header' => 'ठविकीमे à¤à¤•à¤Ÿà¤¾ समसà¥à¤¯à¤¾ अछि',
@@ -3496,4 +3514,49 @@ $1',
'sqlite-has-fts' => '$1 पूरà¥à¤£-पाठ खोज सहायता यà¥à¤•à¥à¤¤',
'sqlite-no-fts' => '$1 बिन पूरà¥à¤£-पाठ खोज सहायताक',
+# New logging system
+'logentry-delete-delete' => '$1 {{लिंग:$2|deleted}} page $3',
+'logentry-delete-restore' => '$1 {{लिंग:$2|restored}} page $3',
+'logentry-delete-event' => '$1 {{लिंग:$2|changed}} à¤à¤•à¤° दृशà¥à¤¯{{PLURAL:$5| à¤à¤•à¤Ÿà¤¾ वृतà¥à¤¤à¤²à¥‡à¤–|$5 वृतà¥à¤¤à¤²à¥‡à¤–}} $3: $4 केà¤',
+'logentry-delete-revision' => '$1 {{लिंग:$2|changed}} à¤à¤•à¤° दृशà¥à¤¯{{PLURAL:$5| à¤à¤•à¤Ÿà¤¾ संशोधन|$5 संशोधन}} पनà¥à¤¨à¤¾ $3: $4 पर',
+'logentry-delete-event-legacy' => '$1 {{लिंग:$2|changed}} $3 पर वृतà¥à¤¤à¤²à¥‡à¤– दृशà¥à¤¯',
+'logentry-delete-revision-legacy' => '$1 {{लिंग:$2|changed}} $3 पर वृतà¥à¤¤à¤²à¥‡à¤– संशोधन',
+'logentry-suppress-delete' => '$1 {{लिंग:$2|दबाà¤à¤²}} page $3',
+'logentry-suppress-event' => '$1 चोरिसठ{{लिंग:$2|changed}} à¤à¤•à¤° दृशà¥à¤¯{{PLURAL:$5| à¤à¤•à¤Ÿà¤¾ वृतà¥à¤¤à¤²à¥‡à¤–|$5 वृतà¥à¤¤à¤²à¥‡à¤–}} $3: $4 पर',
+'logentry-suppress-revision' => '$1 चोरिसठ{{लिंग:$2|changed}} à¤à¤•à¤° दृशà¥à¤¯{{PLURAL:$5| à¤à¤•à¤Ÿà¤¾ संशोधन|$5 संशोधन}} $3: $4 पर',
+'logentry-suppress-event-legacy' => '$1 नà¥à¤•à¤¾ कऽ {{लिंग:$2|changed}} $3 पर वृतà¥à¤¤à¤²à¥‡à¤– दृशà¥à¤¯',
+'logentry-suppress-revision-legacy' => '$1 नà¥à¤•à¤¾ कऽ {{लिंग:$2|changed}} $3 पर संशोधन दृशà¥à¤¯',
+'revdelete-content-hid' => 'सामिगà¥à¤°à¥€ नà¥à¤•à¤¾à¤à¤²',
+'revdelete-summary-hid' => 'नà¥à¤•à¤¾à¤à¤² सारांश समà¥à¤ªà¤¾à¤¦à¤¨',
+'revdelete-uname-hid' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® नà¥à¤•à¤¾à¤à¤²',
+'revdelete-content-unhid' => 'सामिगà¥à¤°à¥€ सोà¤à¤¾à¤',
+'revdelete-summary-unhid' => 'सोà¤à¤¾à¤à¤• सारांश समà¥à¤ªà¤¾à¤¦à¤¨',
+'revdelete-uname-unhid' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤® सोà¤à¤¾à¤',
+'revdelete-restricted' => 'संचालक लेल पà¥à¤°à¤¾à¤¯à¥‹à¤—िक पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
+'revdelete-unrestricted' => 'संचालक लेल हटाओल पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§',
+'logentry-move-move' => '$1 हटाà¤à¤² पनà¥à¤¨à¤¾ $3 सठ$4',
+'logentry-move-move-noredirect' => '$1 {{लिंग:$2|हटाà¤à¤²}} पनà¥à¤¨à¤¾ $3 सठ$4 घà¥à¤®à¥Œà¤†à¤•à¥‡à¤ बिना छोड़ने',
+'logentry-move-move_redir' => '$1 {{लिंग:$2|हटाà¤à¤²}} पनà¥à¤¨à¤¾ $3 सठ$4 घà¥à¤®à¥Œà¤†à¤• अतिरिकà¥à¤¤',
+'logentry-move-move_redir-noredirect' => '$1 {{लिंग:$2|हटाà¤à¤²}} पनà¥à¤¨à¤¾ $3 सठ$4 घà¥à¤®à¥Œà¤†à¤• अतितिकà¥à¤¤ घà¥à¤®à¥Œà¤†à¤•à¥‡à¤ बिना छोड़ने',
+'logentry-patrol-patrol' => '$1 {{लिंग:$2|चिनà¥à¤¹à¤¿à¤¤}} संशोधन $4 $3 पनà¥à¤¨à¤¾à¤• निरीकà¥à¤·à¤¿à¤¤',
+'logentry-patrol-patrol-auto' => '$1 सà¥à¤µà¤¤à¤ƒ {{लिंग:$2|चिनà¥à¤¹à¤¿à¤¤}} संशोधन $4 $3 पनà¥à¤¨à¤¾à¤• निरीकà¥à¤·à¤¿à¤¤',
+'logentry-newusers-newusers' => '$1 {{लिंग:$2|बनाà¤à¤²}} à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता',
+'logentry-newusers-create' => '$1 {{लिंग:$2|बनाà¤à¤²}} à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता',
+'logentry-newusers-create2' => '$1 {{लिंग:$2|बनाà¤à¤²}} {{लिंग:$4|à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता}} $3',
+'logentry-newusers-autocreate' => 'खाता $1 छल {{लिंग:$2|बनाà¤à¤²}} सà¥à¤µà¤¤à¤ƒ',
+'newuserlog-byemail' => 'कूटशबà¥à¤¦ ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ पठाà¤à¤² गेल',
+
+# API errors
+'api-error-badaccess-groups' => 'अहि विकी सें अहां कोनो पà¥à¤°à¤¾à¤°à¥‚प लोड नहि क सकब.',
+'api-error-filename-tooshort' => 'ई संचिका नाम बड छोट अछि |',
+'api-error-filetype-banned' => 'ठतरहक संचिका नाम पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित अछि।',
+'api-error-http' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®: वितरकसठसमà¥à¤ªà¤°à¥à¤• करबामे असफल',
+'api-error-illegal-filename' => 'ठतरहक संचिका नाम अमानà¥à¤¯ अछि।',
+'api-error-mustbeposted' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®: आगà¥à¤°à¤¹à¤• लेल परिपाठà¥à¤¯ संचार संविद पाठ चाही।',
+'api-error-nomodule' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®: कोनो उपारोपण तरीका निरà¥à¤§à¤¾à¤°à¤¿à¤¤ नै अछि।',
+'api-error-ok-but-empty' => 'आनà¥à¤¤à¤°à¤¿à¤• भà¥à¤°à¤®: वितरकसठकोनो समà¥à¤ªà¤°à¥à¤• नै',
+'api-error-unclassified' => 'à¤à¤•à¤Ÿà¤¾ अबूठभà¥à¤°à¤® आà¤à¤²',
+'api-error-unknown-code' => 'अबूठभà¥à¤°à¤®:"$1"',
+'api-error-uploaddisabled' => 'ठविकीपर उपारोपण अशकà¥à¤¤ कà¤à¤² गेल अछि।',
+
);
diff --git a/languages/messages/MessagesMap_bms.php b/languages/messages/MessagesMap_bms.php
index 2bdb8c1e..167d510e 100644
--- a/languages/messages/MessagesMap_bms.php
+++ b/languages/messages/MessagesMap_bms.php
@@ -7,11 +7,12 @@
* @ingroup Language
* @file
*
+ * @author Slamet Serayu (on map-bms.wikipedia.org)
* @author StefanusRA
* @author לערי ריינה×רט
*/
-$fallback = 'jv';
+$fallback = 'jv, id';
$messages = array(
# User preference toggles
@@ -368,20 +369,25 @@ A',
'badarticleerror' => 'Tindakan kiye ora teyeng dilakokna nang kaca kiye.',
'cannotdelete' => 'Kaca utawa berkas "$1" ora teyeng dibusek.
Kiye ndeyane anu wis dibusek nang wong sejen.',
+'cannotdelete-title' => 'Ora teyeng mbusek 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.',
+'perfcached' => "Data kiye dijikot sekang singgahan (''cache'') lan ndeyane dudu data pungkasan. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "Data kiye dijikot sekang singgahan (''cache''), lan dianyarna keri dhewek dong $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Update nggo kaca kiye lagi dipateni.
Data sing ana nang kene sekiye ora teyeng dibaleni unggah maning.',
'wrong_wfQuery_params' => 'Parameter salah maring wfQuery()<br />
Fungsi: $1<br />
Panyuwunan: $2',
'viewsource' => 'Deleng sumbere',
+'viewsource-title' => 'Deleng sumbere nggo $1',
'actionthrottled' => 'Tindakan diwatesi',
'actionthrottledtext' => 'Kanggo ngukur anti-spam, Rika diwatesi gole nglakoni tikdakan kiye keseringen nang wektu sing cendhak, lan Rika uwis nglewati watese kuwe.
Monggo dijajal maning nang sawetara menit.',
'protectedpagetext' => 'Kaca kiye uwis dikunci ben ora teyeng disunting.',
'viewsourcetext' => 'Rika teyeng ndeleng lan nyalin sumbere kaca kiye:',
+'viewyourtext' => "Rika teyeng ndeleng lan nyalin sumbere '''suntingane Rika''' nang kaca kiye:",
'protectedinterface' => 'Kaca kiye isine teks antarmuka ding dienggo piranti lunak, lan uwis dikunci nggo menghindari kasalahan.',
'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.
@@ -493,6 +499,7 @@ Sedurunge dikonfirmasi Rika ora teyeng nggunakna fitur imel.',
'emailconfirmlink' => 'Konfirmasikna alamat imel-e Rika',
'invalidemailaddress' => 'Alamat imel ora teyeng ditampa jalaran formate ora bener.
Monggo lebokna alamat imel nganggo format sing bener utawa dikosongna baen isian kuwe mau.',
+'cannotchangeemail' => 'Alamat imel akun ora teyeng diganti nang wiki kiye.',
'accountcreated' => 'Akun wis digawe',
'accountcreatedtext' => 'Akun panganggo nggo $1 wis digawe.',
'createaccount-title' => 'Gawe akun kanggo {{SITENAME}}',
@@ -509,6 +516,7 @@ Tulung ngenteni sedela sedurunge njajal maning.',
# E-mail sending
'php-mail-error-unknown' => 'Kasalahan sing ora genah nang fungsi mail() PHP.',
+'user-mail-no-addy' => 'Njajal ngirimna imel tanpa nganggo alamat imel.',
# Change password dialog
'resetpass' => 'Ganti tembung sandhi',
@@ -530,18 +538,33 @@ Rika ndeyan uwis kasil ngganti tembung sandhine Rika utawa wis njaluk tembung s
'resetpass-temp-password' => 'Tembung sandhi sauntara:',
# Special:PasswordReset
-'passwordreset' => "Tembung sandhi di-''reset''",
-'passwordreset-text' => 'Lengkapi formulir kiye ben nampa imel ngelingna detil akune 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-username' => 'Jeneng panganggo:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'Alamat imel:',
-'passwordreset-emailtitle' => 'Detil akun nang {{SITENAME}}',
-'passwordreset-emailelement' => 'Jeneng panganggo: $1
+'passwordreset' => "Tembung sandhi di-''reset''",
+'passwordreset-text' => 'Lengkapi formulir kiye ben nampa imel ngelingna detil akune 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-username' => 'Jeneng panganggo:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Deleng imel hasile?',
+'passwordreset-capture-help' => 'Angger Rika nyonteng kotak kiye, imel (sing isi tembung sandhi sauntara) bakal ditidokna maring Rika barengan karo dikirimna maring panganggo.',
+'passwordreset-email' => 'Alamat imel:',
+'passwordreset-emailtitle' => 'Detil akun nang {{SITENAME}}',
+'passwordreset-emailelement' => 'Jeneng panganggo: $1
Tembung sandhi sauntara: $2',
-'passwordreset-emailsent' => 'Imel nggo ngelingna uwis dikirim.',
+'passwordreset-emailsent' => 'Imel nggo ngelingna uwis dikirim.',
+'passwordreset-emailsent-capture' => 'Imel kanggo ngelingna 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Ganti alamat imel',
+'changeemail-header' => 'Ganti alamat imel-e akun',
+'changeemail-text' => 'Rampungna formulir kiye kanggo ngganti alamat imel Rika. Rika bakal perlu nglebokna tembung sandhi Rika nggo konfirmasi owahan kiye.',
+'changeemail-no-info' => 'Rika kudu mlebu log kanggo ngakses kaca kiye sacara langsung.',
+'changeemail-oldemail' => 'Alamat imel sekiye:',
+'changeemail-newemail' => 'Alamat imel anyar:',
+'changeemail-none' => '(ora ana)',
+'changeemail-submit' => 'Ganti imel',
+'changeemail-cancel' => 'Ora sida',
# Edit page toolbar
'bold_sample' => 'Tèks kiye bakal dicithak kandel',
@@ -916,11 +939,14 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
'prefs-rc' => 'Owah-owahan pungkasan',
'prefs-watchlist' => 'Daftar pangawasan',
'prefs-watchlist-days' => 'Cacahé dina sing ditidokna nang daftar pangawasan:',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|dina|dina}}',
'prefs-watchlist-edits' => 'Jumlah suntingan maksimum sing ditidokna nang daftar pangawasan sing luwih jangkep:',
'prefs-watchlist-edits-max' => 'Gunggung maksimum: 1000',
'prefs-watchlist-token' => 'Token pantauan:',
'prefs-misc' => 'Liya-liya',
'prefs-resetpass' => 'Ganti tembung sandhi',
+'prefs-changeemail' => 'Ganti alamat imel',
+'prefs-setemail' => 'Atur alamat imel',
'prefs-email' => 'Opsi imel',
'prefs-rendering' => 'Tampilan',
'saveprefs' => 'Simpen',
@@ -979,6 +1005,7 @@ Pambalikan kiye ora teyeng dibatalna.',
'yourrealname' => 'Jeneng asli:',
'yourlanguage' => 'Basa:',
'yourvariant' => 'Varian basa isi:',
+'prefs-help-variant' => 'Preferensi varian utawa ortografi-ne Rika nggo nampilna isi kaca nang wiki kiye.',
'yournick' => 'Tapak asta anyar:',
'prefs-help-signature' => 'Komentar nang kaca dhiskusi kudu ditapak astani nganggo "<nowiki>~~~~</nowiki>" sing bakal dikonversi dadi tapak astane Rika lan wektu sekiye.',
'badsig' => 'Tapak asta mentah ora sah.
@@ -1022,6 +1049,7 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
'userrights-lookup-user' => 'Ngatur kelompok panganggo',
'userrights-user-editname' => 'Lebokna jeneng panganggo:',
'editusergroup' => 'Sunting kelompok panganggo',
+'editinguser' => "Ngganti hak akses nggo pangganggo '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Sunting kelompok panganggo',
'saveusergroups' => 'Simpen kelompok panganggo',
'userrights-groupsmember' => 'Anggota sekang:',
@@ -1148,7 +1176,6 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
'action-suppressionlog' => 'deleng log privat kiye',
'action-block' => 'mblokir panganggo kiye ben ora teyeng nyunting',
'action-unwatchedpages' => 'Ndeleng daftar kaca-kaca sing ora diawasi',
-'action-trackback' => 'kirimna panjejak balik',
'action-mergehistory' => 'Ngabungna sajarah kaca kiye',
'action-userrights' => 'Nyunting kabeh hak-hak panganggo',
'action-userrights-interwiki' => 'nyunting hak-hak panganggo nang wiki liyane',
@@ -1366,7 +1393,7 @@ Kiye sekiye dialihna maring [[$2]].',
'listusers-editsonly' => 'Tidokna mung panganggo sing duwe kontribusi',
'listusers-creationsort' => 'Urutna miturut tanggal gawene',
'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
-'usercreated' => 'Digawe dong jam $1 tanggal $2',
+'usercreated' => '{{GENDER:$3|Digawe}} dong tanggal $1 jam $2',
'newpages' => 'Kaca anyar',
'newpages-username' => 'Jeneng panganggo:',
'ancientpages' => 'Kaca-kaca paling tuwa',
@@ -1448,8 +1475,6 @@ Tulung di pastekna disit nek Rika pancen arep nglakokna kiye, Rika wis ngerti ko
'actionfailed' => 'Tindakan gagal',
'deletedtext' => '"$1" uwis dibusek.
Deleng $2 nggo log/cathetan pambusekan paling anyar.',
-'deletedarticle' => 'mbusek "[[$1]]"',
-'suppressedarticle' => 'ngumpetna "[[$1]]"',
'dellogpage' => 'Log pambusakan',
'dellogpagetext' => 'Nang ngisor kiye kuwe daftar pambusekan sing paling anyar.',
'deletionlog' => 'Log pambusekan',
@@ -1599,6 +1624,7 @@ Rika teyeng ngowaih tingkat pangreksan nggo kaca kiye, ningen perkara iku ora aw
Kaca sing dituju "[[:$1]]" wis ana isine.
Apa Rika kepengin mbusek kuwe ben teyeng dipindahna?',
'delete_and_move_confirm' => 'Ya, busek kaca kuwe',
+'delete_and_move_reason' => 'Dibusek nggo gawe dalan nggo mindah sekang "[[$1]]"',
'selfmove' => 'Judul sumber lan sing dituju padha baen;
ora teyeng mindahna kaca maring awake dhewek.',
'immobile-source-namespace' => 'Ora teyeng mindahna kaca nang bilik jeneng "$1"',
@@ -1682,6 +1708,7 @@ Rika mung teyeng deleng sumbere thok',
# Media information
'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
+'file-nohires' => 'Ora ana résolusi sing luwih dhuwur.',
'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3',
'show-big-image' => 'Résolusi kebak',
diff --git a/languages/messages/MessagesMdf.php b/languages/messages/MessagesMdf.php
index bfc0e1de..41efaec2 100644
--- a/languages/messages/MessagesMdf.php
+++ b/languages/messages/MessagesMdf.php
@@ -470,14 +470,13 @@ $messages = array(
Сонь, улема, кинге нардазе ни.',
'badtitle' => 'ÐÑ„ кондÑÑти лем',
'badtitletext' => 'Вешф лопань лемоц аф Ñ‚Ñфтама Ñли шава, шÑтьта кÑлень-ётка Ñли викинь-ётка лемÑна аф лац Ñюлмафт. Сонь ÑÑа, улема ащи Ñ„ÐºÑ Ñли ÑÑда лама башка Ñ‚ÑштькÑÑ‚Ñ‚ конат конÑкÑонди аф кондÑÑтихть.',
-'perfcached' => 'Вешф програмонь информациеÑÑŒ Ñёрматфоль ÑÑлек ванфневи файлхнень ÑÑа ди, улема, ÑирелгодÑÑŒ.',
-'perfcachedts' => 'Ð¢Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¾Ð½ÑŒ информациеÑÑŒ Ñёрматфоль ÑÑлек ванфневи файлхнень ÑÑа ди мекольцеда одонзаф $1.',
+'perfcached' => 'Вешф програмонь информациеÑÑŒ Ñёрматфоль ÑÑлек ванфневи файлхнень ÑÑа ди, улема, ÑирелгодÑÑŒ. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ð¢Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¾Ð½ÑŒ информациеÑÑŒ Ñёрматфоль ÑÑлек ванфневи файлхнень ÑÑа ди мекольцеда одонзаф $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ одонзапне Ñ‚Ñни аф тиевихть. ИнформациеÑÑŒ Ñ‚ÑÑа Ñ‚Ñни аф одонзави.',
'wrong_wfQuery_params' => 'ÐÑ„ кондÑÑти параметратне функциÑÑа wfQuery()<br />
Функцие: $1<br />
ВешфкÑ: $2',
'viewsource' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ Ð»Ð¸Ñьмоть',
-'viewsourcefor' => 'Лопа $1',
'actionthrottled' => 'КурокÑшиÑÑŒ кирьфтаф',
'actionthrottledtext' => 'Лудна мархта тюрема туфталонкÑа Ñ‚Ñ Ñ‚ÐµÐ²Ñ‚ÑŒ ламокÑÑ‚ÑŒ тиемаÑÑŒ Ð½ÑŽÑ€ÑŒÑ…ÐºÐ¾Ð½Ñ Ñ‘Ñ‚ÐºÐ° пингÑта кардаф. ЭнÑльттÑма Ð¼ÑŠÑ€Ð´Ð°Ð¼Ñ Ñ‚Ñ Ñ‚ÐµÐ²Ñ‚Ð¸ мъзÑрошка минутода меле.',
'protectedpagetext' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ñ Ñувама пÑкÑтаф лопань петнема кардамать Ñюнеда.',
@@ -653,9 +652,6 @@ $2',
Тонь ID Ñ‚Ñни $3, Ñёлгомать ID #$5.
Сувафтт Ð½Ñ Ð°Ð½Ñ†ÑйнÑтне Ñрь кодама тонь вешфкÑот.',
'blockednoreason' => 'туфтал апак макÑÑ‚',
-'blockedoriginalsource' => "Ванк '''$1'''-Ñ‚ÑŒ лиÑьмоц ала:",
-'blockededitsource' => "'''$1''' лопанди '''тонь петнематнень''' текÑÑ‚Ñна ала:",
-'whitelistedittitle' => 'Петнема тиеманди ÑÑ€Ñви Ñувама лемÑÑŒ',
'whitelistedittext' => 'Лопань петнеманкÑа ÑÑ€Ñви $1.',
'confirmedittext' => 'Тондейть ÑÑ€Ñви кемокÑÑ‚Ð°Ð¼Ñ Ñ‚Ð¾Ð½ÑŒ Ñлектрононь адреÑцень лопань петнемада инголе. ЭнÑльттÑма, путт Ñди кемокÑтак тонь Ñлектрононь адреÑце тонь [[Special:Preferences|тиить арафнематне|тиить арафнематнень]] вельде.',
'nosuchsectiontitle' => 'Стама Ñекцие аш',
@@ -849,22 +845,11 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'revdelete-unsuppress' => 'Ð’Ð°Ð»Ñ…Ñ‚Ð¾Ð¼Ñ Ð¼ÑŠÑ€Ð´Ð°Ñ„ верзиÑтнень кардамаÑнон',
'revdelete-log' => 'Туфтал:',
'revdelete-submit' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ²Ñ ÐºÐ¾Ñ‡ÐºÐ°Ñ„ {{PLURAL:$1|верзие|верзиет}}',
-'revdelete-logentry' => '[[$1]]-нь верзиенц нÑевомац полафтÑÑŒ',
-'logdelete-logentry' => '[[$1]]-Ñ Ñёрматфть нÑевомац полафтÑÑŒ',
'revdelete-success' => "'''Верзиеть нÑевоманц одонзафозь лац.'''",
'logdelete-success' => "'''Сёрматфть нÑевомац арафтовÑÑŒ лац.'''",
'revdel-restore' => 'ÐŸÐ¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ð½Ñевомац',
'pagehist' => 'Лопать иÑториÑц',
'deletedhist' => 'Ðардаф иÑториÑц',
-'revdelete-content' => 'потмоц',
-'revdelete-summary' => 'Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ð½ÑŽÑ€ÑŒÑ…ÐºÑÐ½Ñ Ð»Ð¸Ñ…Ñ‚ÐµÐ¼Ð°Ñ‚ÑŒ',
-'revdelete-uname' => 'тиить лемоц',
-'revdelete-restricted' => 'нолдаф Ñ‚ÐµÐ²Ñ ÐºÐ°Ñ€Ð´Ð°Ñ„ÐºÑне ÑиÑтемонь вÑтикÑненди',
-'revdelete-unrestricted' => 'ÑиÑтемонь вÑтикÑненди кардафкÑне валхтфт',
-'revdelete-hid' => '$1 кÑшф',
-'revdelete-unhid' => '$1 апак кÑштт',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|верзиенди|верзиетненди}}',
-'logdelete-log-message' => '$1 $2 {{PLURAL:$2|тевти|тефненди}}',
'revdelete-edit-reasonlist' => 'ÐŸÐµÑ‚Ð½ÐµÐ¼Ñ Ð½Ð°Ñ€Ð´Ð°Ð¼Ð°Ð½ÑŒ туфталхне',
# Suppression log
@@ -993,7 +978,7 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'prefs-rc' => 'Мекольце полафнемат',
'prefs-watchlist' => 'Мельгеванома',
'prefs-watchlist-days' => 'МъзÑра шит нÑÑ„Ñ‚ÐµÐ¼Ñ Ð¼ÐµÐ»ÑŒÐ³ÐµÐ²Ð°Ð½Ð¾Ð¼Ð°Ñа:',
-'prefs-watchlist-days-max' => '(макÑимум 7 шит)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Иньоцю полафнематнень лувкÑÑÑŒ нÑфтеви келептьф мельгеваномаÑа:',
'prefs-watchlist-edits-max' => '(макÑимум луфкÑ: 1000)',
'prefs-misc' => 'Калмоча',
@@ -1147,7 +1132,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'right-autopatrol' => 'ЭÑÑŒ петнематнень ÐºÐ°Ñ€Ð¼Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ñ‚ÑÑˆÑ‚ÐµÐ²Ð¾Ð¼Ñ Ð¿Ð°Ñ‚Ñ€ÑƒÐ»Ð¸ÑфокÑ',
'right-patrolmarks' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ð¼ÐµÐºÐ¾Ð»ÑŒÑ†Ðµ полафнематнень патрулиÑÑ„Ð¾ÐºÑ Ñ‚Ñштефнень ёткÑа',
'right-unwatchedpages' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ Ð°Ñ„ мельгеваномаÑа лопатнень лувомать',
-'right-trackback' => 'КемокÑÑ‚Ð°Ð¼Ñ Ð¼ÐµÐºÐ¸ кеворемать нолдамац',
'right-mergehistory' => 'Ð¨Ð¾Ð²Ð¾Ñ€ÑŒÑ„Ñ‚ÐµÐ¼Ñ Ð¸ÑториÑнь лопатне',
'right-userrights' => 'ÐŸÐµÑ‚Ð½ÐµÐ¼Ñ Ñембе тиихнень видекÑÑнон',
'right-userrights-interwiki' => 'ÐŸÐµÑ‚Ð½ÐµÐ¼Ñ Ñ‚Ð¸Ð¸Ñ…Ð½ÐµÐ½ÑŒ видекÑнон Ð¸Ð»Ñ Ð²Ð¸ÐºÐ¸Ñ‚ÑŒ лопаÑонза',
@@ -1189,7 +1173,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'action-patrol' => 'Ñ‚ÑÑˆÑ‚ÐµÐ¼Ñ Ð¸Ð»Ñтнень петнемаÑна патрулиÑфокÑ',
'action-autopatrol' => 'Ñ‚Ñштть тонь петнемацень патрулиÑфокÑ',
'action-unwatchedpages' => 'нÑÑ„Ñ‚ÐµÐ¼Ñ Ð¼ÐµÐ»ÑŒÐ³ÐµÐ²Ð°Ð½Ð¾Ð¼Ð°Ñ„Ñ‚Ð¾Ð¼Ð° лопатнень лувомаÑнон',
-'action-trackback' => 'Ð½Ð¾Ð»Ð´Ð°Ð¼Ñ Ð¼ÐµÐºÐ¸ кеворема',
'action-mergehistory' => 'ÑˆÐ¾Ð²Ð¾Ñ€ÐµÐ¼Ñ Ñ‚Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ иÑториÑнц',
'action-userrights' => 'Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ñембе тиихнень видекÑÑнон',
'action-userrights-interwiki' => 'Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ñ‚Ð¸Ð¸Ñ…Ð½ÐµÐ½ÑŒ Ð¸Ð»Ñ Ð²Ð¸ÐºÐ¸Ñтонь тиинь видекÑÑнон',
@@ -1593,12 +1576,8 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'listusers-noresult' => 'Тиихть иÑÑ‚ÑŒ мув.',
# Special:Log/newusers
-'newuserlogpage' => 'Тиинь ушедоманзон лувомаÑна',
-'newuserlogpagetext' => 'Ð¢Ñ Ñ‚Ð¸Ð¸Ð½ÑŒ ушедоманзон лувомаÑна.',
-'newuserlog-byemail' => 'Ñувама валце кучф Ñлектрононь ÑёрмаÑа',
-'newuserlog-create-entry' => 'Од тии',
-'newuserlog-create2-entry' => 'тиф од ÑёрматфтомаÑÑŒ $1',
-'newuserlog-autocreate-entry' => 'СёрматфтомаÑÑŒ ÑÑлек тиф',
+'newuserlogpage' => 'Тиинь ушедоманзон лувомаÑна',
+'newuserlogpagetext' => 'Ð¢Ñ Ñ‚Ð¸Ð¸Ð½ÑŒ ушедоманзон лувомаÑна.',
# Special:ListGroupRights
'listgrouprights' => 'Тиихнень полгаÑнон видекÑонза',
@@ -1724,8 +1703,6 @@ $UNWATCHURL
ЭнÑльттÑма, кемокÑтак тон Ð°Ñ„ÐºÑƒÐºÑ Ñ‘Ñ€Ð°Ñ‚ Ñ‚Ñнь тиемÑ, Ñди тон шарьхкодьÑак мезе лиÑи Ñ‚Ñда меле, ди тон Ñембе Ñ‚Ñнь тиÑак [[{{MediaWiki:Policy-url}}|политик]] корÑÑ.',
'actioncomplete' => 'Тевонь тиемаÑÑŒ анок',
'deletedtext' => 'ЛопаÑÑŒ "$1" нардафоль. Ванк $2 мекольце нардаматнень нÑфтеманкÑа.',
-'deletedarticle' => 'нардаф "[[$1]]"',
-'suppressedarticle' => 'кÑшф "[[$1]]"',
'dellogpage' => 'Ðардамань лувома',
'dellogpagetext' => 'Ватт ÑÑда мекольце нардаматнень лувомаÑÑŒ ала.',
'deletionlog' => 'нардамань лувома',
@@ -1840,7 +1817,6 @@ $UNWATCHURL
'undeletereset' => 'ВалхтомÑ',
'undeleteinvert' => 'Ð’Ð°Ð»Ñ…Ñ‚Ð¾Ð¼Ñ ÐºÐ¾Ñ‡ÐºÐ°Ð¼Ð°',
'undeletecomment' => 'ÐœÑльполаткÑ:',
-'undeletedarticle' => 'мърдафтф "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 верзие|$1 верзиет}} мърдафтфт',
'undeletedrevisions-files' => '{{PLURAL:$1|1 верзие|$1 верзиет}} Ñди {{PLURAL:$2|1 файл|$2 файлхт}} мърдафтфт',
'undeletedfiles' => '{{PLURAL:$1|1 файл|$1 файлхт}} мърдафтфт',
@@ -2067,9 +2043,6 @@ $1',
'movepage-page-moved' => 'ЛопаÑÑŒ $1 шашфтфоль $2-Ñ.',
'movepage-page-unmoved' => 'Лопать $1 аш кода ÑˆÐ°ÑˆÑ„Ñ‚Ð¾Ð¼Ñ $2-Ñ.',
'movepage-max-pages' => 'Сембода лама $1 {{PLURAL:$1|лопа|лопат}} шашфтфольхть Ð¸Ð»Ñ Ð²Ð°ÑÑ‚Ñ Ð¸ фкÑвок ÑÑда тов аф кармай ÑÑлек шашфтовома.',
-'1movedto2' => '[[$1]] шашфтфоль [[$2]]Ñ',
-'1movedto2_redir' => '[[$1]] шашфтфоль [[$2]]Ñ Ð¸Ð»Ñ Ð²Ð°ÑÑ‚Ñ ÑƒÐ¼Ð±Ð¾Ñ€Ð¾Ð½Ð´Ð°Ñ„Ñ‚Ð¾Ð¼Ð° вельде',
-'move-redirect-suppressed' => 'ÑƒÐ¼Ð±Ð¾Ñ€Ð¾Ð½Ð´Ð°Ñ„Ñ‚Ñ„Ñ‚ÐºÑ Ð»Ð¾Ñ‚ÐºÐ°Ñ„Ñ‚Ñ„Ð¾Ð»ÑŒ',
'movelogpage' => 'Ð˜Ð»Ñ Ð²Ð°ÑÑ‚Ñ ÑˆÐ°ÑˆÑ„Ñ‚Ð¾Ð¼Ð°Ð½ÑŒ лувомаÑÑŒ',
'movelogpagetext' => 'Ðла од ваÑÑ‚Ñ ÑˆÐ°ÑˆÑ„Ñ‚Ñ„ лопатнень лувомаÑÑŒ.',
'movereason' => 'Туфтал:',
@@ -2273,8 +2246,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Патрулень лувомаÑÑŒ',
'patrol-log-header' => 'Патруль ала верзиетнень лувомаÑÑŒ.',
-'patrol-log-line' => 'Ñ‚Ñштьфольхть $2-Ñта $1 патрулень варжафкÑÐ¾ÐºÑ $3',
-'patrol-log-auto' => '(ÑÑÑŒ тиеви)',
'log-show-hide-patrol' => '$1 патрулень лувомаÑÑŒ',
# Image deletion
@@ -2300,7 +2271,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|лопа|лопат}}',
'file-info' => 'файлонь кувалмоц: $1, MIME Ñортоц: $2',
'file-info-size' => '$1 × $2 пикÑелхть, файлть кувалмоц: $3, MIME Ñорт: $4',
-'file-nohires' => '<small>СÑда лама анцÑйнÑтнень мархта Ð°Ñ€Ñ…Ñ‚Ð¾Ñ„ÐºÑ Ð°Ñˆ.</small>',
+'file-nohires' => 'СÑда лама анцÑйнÑтнень мархта Ð°Ñ€Ñ…Ñ‚Ð¾Ñ„ÐºÑ Ð°Ñˆ.',
'svg-long-desc' => 'SVG файл, $1 × $2 пикÑельхть, file файлть кувалмоц: $3',
'show-big-image' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ð¿ÑшкÑе кувалмонц',
@@ -2653,13 +2624,6 @@ $5
'scarytranscludefailed' => '[Шаблон латцема $1-нди изь лиÑев]',
'scarytranscludetoolong' => '[URL вельф кувака]',
-# Trackbacks
-'trackbackbox' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ð½Ð´Ð¸ меки кеворемат:<br />
-$1',
-'trackbackremove' => '([$1 ÐардафкÑ])',
-'trackbacklink' => 'Меки кеворема',
-'trackbackdeleteok' => 'Меки кеворемать нардамаÑÑŒ мольÑÑŒ лац.',
-
# Delete conflict
'deletedwhileediting' => "'''Инголе кардама''': Ð¢Ñ Ð»Ð¾Ð¿Ð°ÑÑŒ нардафоль Ñ‘Ñ‚ тон кармать петнеманза!",
'confirmrecreate' => "ТииÑÑŒ [[User:$1|$1]] ([[User talk:$1|корхнема]]) нардазе Ñ‚Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ мъзÑрда тон кармать петнемонза Ñ‚Ñ Ñ‚ÑƒÑ„Ñ‚Ð°Ð»Ð¾Ð½ÐºÑа:
@@ -2805,4 +2769,9 @@ $1',
#Путт Ñембе ваÑу валзюлмафкÑонь пакшензон Ñ‚Ñ Ð»ÑƒÑ„Ñ‚ÑŒ (Ñтрокать) вельфке. Катт Ñ‚Ñ Ð»ÑƒÑ„Ñ‚ÑŒ (Ñтрокать) ÑÑ‚Ð°Ð¼ÐºÑ ÐºÐ¾Ð´Ð°Ð¼ÐºÑ Ñон ульÑÑŒ</pre>',
+# New logging system
+'revdelete-restricted' => 'нолдаф Ñ‚ÐµÐ²Ñ ÐºÐ°Ñ€Ð´Ð°Ñ„ÐºÑне ÑиÑтемонь вÑтикÑненди',
+'revdelete-unrestricted' => 'ÑиÑтемонь вÑтикÑненди кардафкÑне валхтфт',
+'newuserlog-byemail' => 'Ñувама валце кучф Ñлектрононь ÑёрмаÑа',
+
);
diff --git a/languages/messages/MessagesMg.php b/languages/messages/MessagesMg.php
index ae9468c4..e1394129 100644
--- a/languages/messages/MessagesMg.php
+++ b/languages/messages/MessagesMg.php
@@ -15,72 +15,72 @@
*/
$magicWords = array(
- 'redirect' => array( '0', '#FIHODINANA', '#REDIRECTION', '#REDIRECT' ),
- 'notoc' => array( '0', '__TSYASIANALAHATRA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__TSYASIANAGALLERY__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__TEREONYLAHATRA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
- 'toc' => array( '0', '__LAHATRA__', '__LAHAT__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
- 'noeditsection' => array( '0', '__TSYAZOOVAINA__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'VOLANA', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'VOLANA1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ANARAMBOLANA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ANARAMBOLANAGEN', 'ANARANAVOLANA', 'CURRENTMONTHNAME', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ANARAMBOLANAFOHY', 'ANARANAVOLANAFOHY', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ANDRO', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ANDRO2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ANARANANDRO', 'ANARANAANDRO', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TAONA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'LERA', 'HORAIREACTUEL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'VOLANAANTOERANA', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'VOLANAANTOERANA1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ANARAMBOLANAANTOERANA', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ANARAMBOLANAANTOERANAGEN', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ANARAMBOLANAANTOERANAFOHY', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ANDROANTOERANA', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ANDROANTOERANA2', 'JOUR2LOCAL', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ANARANANDROANTOERANA', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'TAONAANTOERANA', 'ANNEELOCALE', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LERAANTOERANA', 'HORAIRELOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ORAANTOERANA', 'HEURELOCALE', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ISAPEJY', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ISALAHATSORATRA', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ISARAKITRA', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ISAMPIKAMBANA', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ISAMPIKAMBANAMANOVA', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ISAFANOVANA', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'ISATOPIMASO', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ANARAMPEJY', 'ANARANAPEJY', 'NOMPAGE', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ANARAMPEJYX', 'ANARANAPEJYX', 'NOMPAGEX', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ANARANTSEHATRA', 'ANARANASEHATRA', 'ESPACENOMMAGE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ANARANTSEHATRAX', 'ANARANASEHATRAX', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'PEJINDRESAKA', 'PEJYRESAKA', 'DINIKA', 'ESPACEDISCUSSION', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'PEJINDRESAKAX', 'PEJYRESAKAX', 'DINIKAX', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'TOERANALAHATSORATRA', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'TOERANNYLAHATSORATRA', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ANARAMPEJYFENO', 'ANARANAPEJYFENO', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ANARAMPEJYFENOX', 'ANARANAPEJYFENOX', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ANARANAZANAPEJY', 'ANARANJANAPEJY', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ANARANJANAPEJYX', 'ANARANAZANAPEJYX', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ANARANAFOTOPEJY', 'ANARAMPOTOPEJY', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ANARANAFOTOPEJYE', 'ANARAMPOTOPEJYE', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ANARAMPEJINDRESAKA', 'ANARANAPEJINDRESAKA', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
- 'img_right' => array( '1', 'ankavanana', 'droite', 'right' ),
- 'img_left' => array( '1', 'ankavia', 'gauche', 'left' ),
- 'img_none' => array( '1', 'tsymisy', 'néant', 'neant', 'none' ),
- 'img_center' => array( '1', 'ampivoany', 'anivony', 'centré', 'center', 'centre' ),
- 'img_page' => array( '1', 'pejy $1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'sisiny', 'bordure', 'border' ),
- 'img_top' => array( '1', 'ambony', 'haut', 'top' ),
- 'img_middle' => array( '1', 'anivo', 'milieu', 'middle' ),
- 'img_bottom' => array( '1', 'ambany', 'bas', 'bottom' ),
- 'currentweek' => array( '1', 'HERINANDRO', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ALAHADY', 'JDSACTUEL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'HERINANDROANTOERANA', 'SEMAINELOCALE', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ALAHADYANTOERANA', 'JDSLOCAL', 'LOCALDOW' ),
- 'fullurl' => array( '0', 'URLREHETRA:', 'URLCOMPLETE:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLREHETRAX:', 'URLCOMPLETEX:', 'FULLURLE:' ),
- 'displaytitle' => array( '1', 'ASEHOLOHATENY', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
+ 'redirect' => array( '0', '#FIHODINANA', '#REDIRECTION', '#REDIRECT' ),
+ 'notoc' => array( '0', '__TSYASIANALAHATRA__', '__AUCUNSOMMAIRE__', '__AUCUNETDM__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__TSYASIANAGALLERY__', '__AUCUNEGALERIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__TEREONYLAHATRA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__LAHATRA__', '__LAHAT__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__TSYAZOOVAINA__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'VOLANA', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'VOLANA1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ANARAMBOLANA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ANARAMBOLANAGEN', 'ANARANAVOLANA', 'CURRENTMONTHNAME', 'NOMGENMOISACTUEL', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ANARAMBOLANAFOHY', 'ANARANAVOLANAFOHY', 'ABREVMOISACTUEL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ANDRO', 'JOURACTUEL', 'JOUR1ACTUEL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ANDRO2', 'JOUR2ACTUEL', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ANARANANDRO', 'ANARANAANDRO', 'NOMJOURACTUEL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TAONA', 'ANNEEACTUELLE', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'LERA', 'HORAIREACTUEL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORA', 'HEUREACTUELLE', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'VOLANAANTOERANA', 'MOISLOCAL', 'MOIS2LOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'VOLANAANTOERANA1', 'MOIS1LOCAL', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ANARAMBOLANAANTOERANA', 'NOMMOISLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ANARAMBOLANAANTOERANAGEN', 'NOMGENMOISLOCAL', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ANARAMBOLANAANTOERANAFOHY', 'ABREVMOISLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ANDROANTOERANA', 'JOURLOCAL', 'JOUR1LOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ANDROANTOERANA2', 'JOUR2LOCAL', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ANARANANDROANTOERANA', 'NOMJOURLOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'TAONAANTOERANA', 'ANNEELOCALE', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LERAANTOERANA', 'HORAIRELOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ORAANTOERANA', 'HEURELOCALE', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ISAPEJY', 'NOMBREPAGES', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ISALAHATSORATRA', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ISARAKITRA', 'NOMBREFICHIERS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ISAMPIKAMBANA', 'NOMBREUTILISATEURS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ISAMPIKAMBANAMANOVA', 'NOMBREUTILISATEURSACTIFS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ISAFANOVANA', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ISATOPIMASO', 'NOMBREVUES', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ANARAMPEJY', 'ANARANAPEJY', 'NOMPAGE', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ANARAMPEJYX', 'ANARANAPEJYX', 'NOMPAGEX', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ANARANTSEHATRA', 'ANARANASEHATRA', 'ESPACENOMMAGE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ANARANTSEHATRAX', 'ANARANASEHATRAX', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'PEJINDRESAKA', 'PEJYRESAKA', 'DINIKA', 'ESPACEDISCUSSION', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'PEJINDRESAKAX', 'PEJYRESAKAX', 'DINIKAX', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'TOERANALAHATSORATRA', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'TOERANNYLAHATSORATRA', 'ESPACESUJETX', 'ESPACEARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ANARAMPEJYFENO', 'ANARANAPEJYFENO', 'NOMPAGECOMPLET', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ANARAMPEJYFENOX', 'ANARANAPEJYFENOX', 'NOMPAGECOMPLETX', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ANARANAZANAPEJY', 'ANARANJANAPEJY', 'NOMSOUSPAGE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ANARANJANAPEJYX', 'ANARANAZANAPEJYX', 'NOMSOUSPAGEX', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ANARANAFOTOPEJY', 'ANARAMPOTOPEJY', 'NOMBASEDEPAGE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ANARANAFOTOPEJYE', 'ANARAMPOTOPEJYE', 'NOMBASEDEPAGEX', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ANARAMPEJINDRESAKA', 'ANARANAPEJINDRESAKA', 'NOMPAGEDISCUSSION', 'TALKPAGENAME' ),
+ 'img_right' => array( '1', 'ankavanana', 'droite', 'right' ),
+ 'img_left' => array( '1', 'ankavia', 'gauche', 'left' ),
+ 'img_none' => array( '1', 'tsymisy', 'néant', 'neant', 'none' ),
+ 'img_center' => array( '1', 'ampivoany', 'anivony', 'centré', 'center', 'centre' ),
+ 'img_page' => array( '1', 'pejy $1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'sisiny', 'bordure', 'border' ),
+ 'img_top' => array( '1', 'ambony', 'haut', 'top' ),
+ 'img_middle' => array( '1', 'anivo', 'milieu', 'middle' ),
+ 'img_bottom' => array( '1', 'ambany', 'bas', 'bottom' ),
+ 'currentweek' => array( '1', 'HERINANDRO', 'SEMAINEACTUELLE', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ALAHADY', 'JDSACTUEL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'HERINANDROANTOERANA', 'SEMAINELOCALE', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ALAHADYANTOERANA', 'JDSLOCAL', 'LOCALDOW' ),
+ 'fullurl' => array( '0', 'URLREHETRA:', 'URLCOMPLETE:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLREHETRAX:', 'URLCOMPLETEX:', 'FULLURLE:' ),
+ 'displaytitle' => array( '1', 'ASEHOLOHATENY', 'AFFICHERTITRE', 'DISPLAYTITLE' ),
);
$fallback = 'fr';
@@ -123,7 +123,7 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Activeusers' => array( 'Mpikambana_manova_matetika' ),
+ 'Activeusers' => array( 'Mpikambana_mavitrika' ),
'Allmessages' => array( 'Hafatra_rehetra' ),
'Allpages' => array( 'Pejy_rehetra' ),
'Ancientpages' => array( 'Pejy_antitra' ),
@@ -134,13 +134,15 @@ $specialPageAliases = array(
'BrokenRedirects' => array( 'Fihodinana_tapaka' ),
'Categories' => array( 'Sokajy' ),
'ChangePassword' => array( 'Hiova_tenimiafina' ),
- 'Confirmemail' => array( 'Hankatò_ny_adiresy_imailaka' ),
+ 'ComparePages' => array( 'Fampitaha_pejy' ),
+ 'Confirmemail' => array( 'Fankatoavana_ny_adiresy_imailaka' ),
'Contributions' => array( 'Fandraisan\'anjara' ),
'CreateAccount' => array( 'Hamorona_kaonty' ),
'Deadendpages' => array( 'Pejy_tsy_misy_rohy' ),
'DeletedContributions' => array( 'Fandraisan\'anjara_voafafa' ),
'Disambiguations' => array( 'Pejy_mitovy_anarana' ),
'DoubleRedirects' => array( 'Fihodinana_miroa' ),
+ 'EditWatchlist' => array( 'Hanova_ny_pejy_arahana' ),
'Emailuser' => array( 'Handefa_imailaka' ),
'Export' => array( 'Hamoa-pejy' ),
'Fewestrevisions' => array( 'Pejy_vitsy_mpanova_indrindra' ),
@@ -183,6 +185,7 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Fanovàna_farany' ),
'Recentchangeslinked' => array( 'Fanarahana_ny_rohy' ),
'Revisiondelete' => array( 'Santiôna_voafafa' ),
+ 'RevisionMove' => array( 'Fanalana_santiôna' ),
'Search' => array( 'Fikarohana' ),
'Shortpages' => array( 'Pejy_fohy' ),
'Specialpages' => array( 'Pejy_manokana' ),
@@ -572,15 +575,14 @@ Mihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tomp
Mety efa nataon'ny hafa angamba ny famafàna.",
'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' => 'Ireto angona ireto dia nalaina tao anaty cache koa mety ho efa lany daty.:',
-'perfcachedts' => "Aminy ''cache'' daholo ny ''data'' misy ato, tamin'ny $1 ny data tato no natao ''mise à jour''.",
+'perfcached' => 'Ireto angona ireto dia nalaina tao anaty cache koa mety ho efa lany daty. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => "Aminy ''cache'' daholo ny ''data'' misy ato, tamin'ny $1 ny data tato no natao ''mise à jour''. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => "Tsy nalefa ny ''mise à jour'' (update) hoan'ity pejy ity.
Mety tsy misy fifandraisana amin'ny zavamisy ankehitriny ny zavamisy ao anatin'ity pejy ity..",
'wrong_wfQuery_params' => "Misy tsy fetezana amin'ny wfQuery()<br />
Asa : $1<br />
fangatahana : $2",
'viewsource' => 'Hijery fango',
-'viewsourcefor' => "ho an'ny $1",
'actionthrottled' => 'Tao voafetra',
'actionthrottledtext' => "Mba hiady amin'ny spam, ny hatetika momba ny fanaovana io otao io dia ferana ho foifoy, ary niaotra io fetra io ianao.
Andramo indray afaka minitra vitsivitsy.",
@@ -708,6 +710,7 @@ Andraso kely ary andramo indray.",
# E-mail sending
'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
+'user-mail-no-addy' => 'Nanandrana nandefa imailaka tsy misy adiresy imailaka.',
# Change password dialog
'resetpass' => 'Hanova ny tenimiafina',
@@ -751,6 +754,17 @@ Hitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {
Tenimiafina miserana : $2',
'passwordreset-emailsent' => 'Nalefa ny imailaka fampatsiahivana.',
+# Special:ChangeEmail
+'changeemail' => 'Hanova ny adiresy imailaka',
+'changeemail-header' => "Hanova ny adiresy imailak'ilay kaonty",
+'changeemail-text' => 'Fenoy ity pejy fenoina ity mba hanova ny adiresy imailakao. Ilainao atsofoka ny tenimiafinao mba hampihatra ilay fanovana.',
+'changeemail-no-info' => 'Mila tafiditra ianao vao avaka mijery ity pejy ity.',
+'changeemail-oldemail' => 'Adiresy imailaka ankehitriny :',
+'changeemail-newemail' => 'Adiresy imailaka vaovao :',
+'changeemail-none' => '(tsy misy)',
+'changeemail-submit' => 'Hanova ny adiresy imailaka',
+'changeemail-cancel' => 'Adinoy',
+
# Edit page toolbar
'bold_sample' => 'Soratra matavy',
'bold_tip' => 'Soratra matavy',
@@ -820,9 +834,6 @@ Jereo koa fa tsy afaka mampiasa ny asa ''emailuser'' ianao ra tsy nanometraka ny
$3 izao ny adiresinao, ary ny isa ny fisakananai dia $5.
Soraty ireo fanoroana ireo anatin'ny fangatahana ataonao.",
'blockednoreason' => 'tsy nisy antony nomeny',
-'blockedoriginalsource' => "Eto amban'ny kaody fango ny '''$1''' :",
-'blockededitsource' => "Eo amban'ny votoatin'ny '''nosoratanao''' nataonao tamin'ny '''$1'''",
-'whitelistedittitle' => 'Midira/Misorata anarana',
'whitelistedittext' => "Mila $1 aloha ianao vao afaka manova/mamorona pejy eto amin'ity wiki ity.",
'confirmedittext' => "Tsy maintsy marihina ny adiresy imailakao aloha no manova pejy.
Ampidiro sy Checkeo ny adiresy imailakao amin'ny [[Special:Preferences|safidinao]].",
@@ -1072,8 +1083,6 @@ Afaka mijery ny lahatsoratra nasitrika sy mamerina azy ny mpandrindra hafa ny {{
'revdelete-unsuppress' => "Hanala ny fepetra eo amin'ny santiôna naverina",
'revdelete-log' => 'Antony :',
'revdelete-submit' => "Ahàtra amin'ny santiôna nofidiana {{PLURAL:$1}}",
-'revdelete-logentry' => "nanova ny fahitan'ny/i [[$1]]",
-'logdelete-logentry' => "nanova ny fahitan'ny zava-mitranga ny/n'i [[$1]]",
'revdelete-success' => "'''Voaova soa aman-tsara ny fahitana ny santiôna.'''",
'revdelete-failure' => "'''Ny fisehon'ity santiôna ity dia tsy afaka natao update'''
$1",
@@ -1085,15 +1094,6 @@ $1",
'revdel-restore-visible' => 'santiôna hita',
'pagehist' => "Tantaran'ilay pejy",
'deletedhist' => 'Tantara voafafa',
-'revdelete-content' => 'votoatiny',
-'revdelete-summary' => "ambangovangon'ny fanovàna",
-'revdelete-uname' => 'anarana mpikambana',
-'revdelete-restricted' => "nametraka fanerena ho an'ny mpandrindra",
-'revdelete-unrestricted' => "fanerena nesorina tamin'ny mpandrindra",
-'revdelete-hid' => 'nanitrika ny $1',
-'revdelete-unhid' => "nanala fanitriana (hoan'(ny)) $1",
-'revdelete-log-message' => "$1 ho an'ny{{PLURAL:$2||}} $2",
-'logdelete-log-message' => "zava-miseho $1 amin'ny $2{{PLURAL:}}",
'revdelete-hide-current' => "Tsi-fetezana tamin'ny zavatra voadaty tamin'ny $1 tamin'ny $2 : io ny reviziôna ankehitriny.
Tsy azo fafana izy.",
'revdelete-show-no-access' => "Tsi-fetazana teo am-panehoana ny zavatra voadaty tamin'ny $1 tamin'ny $2 : izy io dia mitondra ny marika « voafetra ».
@@ -1250,12 +1250,14 @@ ihany no miseho amin'ny vokatry ny karoka).",
'prefs-rc' => 'Vao niova',
'prefs-watchlist' => 'Lisitry ny pejy arahana-maso',
'prefs-watchlist-days' => "Isa ny andro haseho anatin'ny lisitra ny pejy arahana-maso",
-'prefs-watchlist-days-max' => '7 andro fara-fahabetsany',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => "Isa ny fanovana aseho eo amin'ny fanaraha-maso navelatra:",
'prefs-watchlist-edits-max' => 'Isa fara-fahabetsany : 1000',
'prefs-watchlist-token' => "token ho an'ny lisitry ny pejy arahi-maso:",
'prefs-misc' => 'Hafa',
'prefs-resetpass' => 'Hanova tenimiafina',
+'prefs-changeemail' => 'Hanova ny adiresy imailaka',
+'prefs-setemail' => 'Hampiditra adiresy imailaka',
'prefs-email' => 'Safidy mikasika ny imailaka',
'prefs-rendering' => 'Fampisehoana',
'saveprefs' => 'Tehirizo',
@@ -1444,7 +1446,6 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'right-autopatrol' => 'Manamarika ny fanovany efa nomarihana',
'right-patrolmarks' => "Mijery ny mariky ny fanamarihana any amin'ny fanovana farany",
'right-unwatchedpages' => 'Mijery ny lisitry ny pejy tsy arahina',
-'right-trackback' => 'Manampy trackback',
'right-mergehistory' => 'Manatsonika ny tantaram-pejy',
'right-userrights' => "Manova ny fahefan'ny mpikambana",
'right-userrights-interwiki' => "Manova ny fahefan'ny mpikambana any amin'ny wiki hafa",
@@ -1489,7 +1490,6 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'action-patrol' => 'marihana ho hita ity version ity',
'action-autopatrol' => 'manana ny fanovanao voamarina',
'action-unwatchedpages' => 'hijery ny lisitry ny pejy tsy arahina',
-'action-trackback' => 'mandefa trackback',
'action-mergehistory' => 'Manatambatra ny tantaram-pejy',
'action-userrights' => "hanova ny fahefan'ny mpikambana rehetra",
'action-userrights-interwiki' => "hanova ny fahefan'ny mpikambana any amin'ny wiki hafa",
@@ -1907,7 +1907,7 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
'listusers-editsonly' => "Ny mpikambana manam-pandraisan'anjara ihany no aseho",
'listusers-creationsort' => "Afantina amin'ny daty fanokafana",
'usereditcount' => 'fanovana $1 {{PLURAL:}}',
-'usercreated' => "Voasokatra tamin'ny $1 tamin'ny $2",
+'usercreated' => "Noforonina ny {{GENDER:$3}} $1 tamin'ny $2",
'newpages' => 'pejy Vaovao',
'newpages-username' => 'Solonanarana:',
'ancientpages' => 'Ireo pejy tranainy indrindra',
@@ -1999,12 +1999,8 @@ Prôtôkôly zaka : <tt>$1</tt>.',
'activeusers-noresult' => 'Tsy nahitana mpikambana.',
# Special:Log/newusers
-'newuserlogpage' => 'Tatitr’asan’ny fanokafana kaontim-pikambana',
-'newuserlogpagetext' => "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
-'newuserlog-byemail' => 'tenimiafina nalefa imailaka',
-'newuserlog-create-entry' => 'Mpikambana vaovao',
-'newuserlog-create2-entry' => 'namorona ny kaonty vaovao $1',
-'newuserlog-autocreate-entry' => 'Kaonty namboarina ho azy',
+'newuserlogpage' => 'Tatitr’asan’ny fanokafana kaontim-pikambana',
+'newuserlogpagetext' => "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
# Special:ListGroupRights
'listgrouprights' => "Fahefan'ny vondrom-pikambana",
@@ -2148,8 +2144,6 @@ fantatrao ny vokany ary mahalala ianao fa tsy mifanipaka amin'ny
'actionfailed' => 'Tsy nandeha ny tao',
'deletedtext' => 'Voafafa i "$1".
Jereo amin\'ny $2 ny lisitry ny famafana pejy faramparany.',
-'deletedarticle' => 'namafa « [[$1]] »',
-'suppressedarticle' => 'namafa « [[$1]] »',
'dellogpage' => 'Laogim-pamafana pejy',
'dellogpagetext' => 'Eto ambany eto ny lisitry ny famafana pejy/sary faramparany.',
'deletionlog' => 'laogim-pamafàna',
@@ -2195,7 +2189,9 @@ Ho ann'y fanazavana fanampiny, jereo [[Special:ProtectedPages|ny lisitry ny pejy
'unprotectedarticle' => "nanala ny fiarovana an'i « [[$1]] »",
'movedarticleprotection' => 'nanova ny safidim-piarovana : « [[$2]] » lasa « [[$1]] »',
'protect-title' => "Hanova ny lentam-piarovana ho an'i « $1 »",
+'protect-title-notallowed' => "Hijery ny lentam-piarovana ho an'i « [[$1]] »",
'prot_1movedto2' => '[[$1]] voaova anarana ho [[$2]]',
+'protect-badnamespace-title' => 'Anaran-tsehatra tsy azo arovana',
'protect-legend' => 'Fanekena ny fiarovana pejy',
'protectcomment' => 'Antony :',
'protectexpiry' => 'Daty fitsaharana :',
@@ -2273,7 +2269,6 @@ Mety rohy tsy izy no anananao, na mety voafafa na naverina tamin'ny tahiry ilay
'undeletereset' => 'Hamerina',
'undeleteinvert' => 'Hampifamaidika ny safidy',
'undeletecomment' => 'Antony :',
-'undeletedarticle' => 'namerina ny « [[$1]] »',
'undeletedrevisions' => 'voaverina ny {{PLURAL:$1|fanovana|fanovana}} $1',
'undeletedfiles' => 'rakitra voaverina $1 {{PLURAL:$1}}',
'cannotundelete' => 'Tsy nandeha soa aman-tsara ilay famerenana ;
@@ -2540,9 +2535,6 @@ mifanaraka amin'ilay anarana vaovao. Azafady mba atambaro izay pejin-dresaka iza
'movepage-page-exists' => 'Efa misy ny pejy $1 ary tsy afaka soloina ho azy.',
'movepage-page-moved' => 'Voaova anarana lasa $2 ilay pejy $1.',
'movepage-page-unmoved' => 'Tsy afaka novaina anarana $2 ilay pejy $1.',
-'1movedto2' => 'Novana ho [[$2]] ilay takelaka [[$1]]',
-'1movedto2_redir' => 'Redirection: Novaina ho [[$2]] i [[$1]]',
-'move-redirect-suppressed' => 'fihodinana voafafa',
'movelogpage' => 'Ny laogim-panisahana',
'movelogpagetext' => 'Lisitry ny pejy nafindra toerana.',
'movesubpage' => 'Zana-pejy{{PLURAL:$1||}} $1',
@@ -2618,6 +2610,8 @@ Etsy amin'ny toerana farany dia afaka mampiasa rohy ihany koa ianao, ohatra [[{{
'thumbnail_error' => 'Tsy fetezana eo am-panamboarana ilay saritapaka : $1',
'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',
+'thumbnail-dest-create' => "Tsy nahatahiry ilay thumbnail tany amin'ny tanjona",
'thumbnail_invalid_params' => 'Parametatry ny saritapaka tsy mety',
'thumbnail_dest_directory' => 'Tsy mety amboarina ilay petra-drakitra tanjona',
'thumbnail_image-type' => 'Karazan-drakitra tsy zaka',
@@ -2789,9 +2783,6 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
# Patrol log
'patrol-log-page' => "Laogin'ny fanovana voamarina",
'patrol-log-header' => "Ity dia laogy mikasikan'ny fanovana voamarina.",
-'patrol-log-line' => "nanamarika ny $1 an'i $2 ho voamarina $3",
-'patrol-log-auto' => '(mandeha ho azy)',
-'patrol-log-diff' => 'fanovana faha $1',
'log-show-hide-patrol' => "$1 ny laogy mikasikan'ny santiôna voamarina",
# Image deletion
@@ -2817,7 +2808,7 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
'widthheightpage' => '$1 × $2, pejy $3{{PLURAL:}}',
'file-info' => 'Haben-drakitra : $1, karazana MIME : $2',
'file-info-size' => "$1 × $2 teboka, haben'ilay rakitra : $3, endrika MIME : $4",
-'file-nohires' => "<small>Tsy misy sary ngeza non'io</small>",
+'file-nohires' => "Tsy misy sary ngeza non'io",
'svg-long-desc' => 'rakitra SVG, habe $1 × $2 teboka, habe : $3',
'show-big-image' => "Hijery ny tena haben'ny sary",
'show-big-image-size' => '$1 × $2 teboka',
@@ -3011,13 +3002,6 @@ Io fango fanamarinana io dia miasa hatramin\'ny $4.',
'scarytranscludefailed' => "[Ny voaaka soa aman-tsara ilay endrika ho an'i $1]",
'scarytranscludetoolong' => '[Lava loatra ny URL]',
-# Trackbacks
-'trackbackbox' => "Tirakibaky mankany amin'ity pejy ity :<br />
-$1",
-'trackbackremove' => '([$1 esorina])',
-'trackbacklink' => 'Tirakibaky',
-'trackbackdeleteok' => 'Voafafa soa aman-tsara ilay trackback.',
-
# Delete conflict
'deletedwhileediting' => 'Fampitandremana: Nisy namafa ity pejy ity raha mbola teo am-panovana azy ianao!',
'confirmrecreate' => "Nofafan'i [[User:$1|$1]] ([[User talk:$1|dinika]]) ity lahatsoratra ity taorian'ny nanombohanao nanova azy. Ny antony dia:
@@ -3186,4 +3170,9 @@ Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindr
'htmlform-reset' => 'Hanala ny fanovana',
'htmlform-selectorother-other' => 'Hafa',
+# New logging system
+'revdelete-restricted' => "nametraka fanerena ho an'ny mpandrindra",
+'revdelete-unrestricted' => "fanerena nesorina tamin'ny mpandrindra",
+'newuserlog-byemail' => 'tenimiafina nalefa imailaka',
+
);
diff --git a/languages/messages/MessagesMhr.php b/languages/messages/MessagesMhr.php
index 44f186b7..5a1a8424 100644
--- a/languages/messages/MessagesMhr.php
+++ b/languages/messages/MessagesMhr.php
@@ -60,6 +60,9 @@ $namespaceAliases = array(
'Категорийын_каҥашымаш' => NS_CATEGORY_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$specialPageAliases = array(
'Preferences' => array( 'Келыштарымаш' ),
'Recentchanges' => array( 'Пытартыш_тӧрлатымаш-влак' ),
@@ -69,14 +72,14 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'img_right' => array( '1', 'пурла', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'шола', 'Ñлева', 'left' ),
- 'img_border' => array( '1', 'чек', 'граница', 'border' ),
- 'img_sub' => array( '1', 'йымалне', 'под', 'sub' ),
- 'img_super' => array( '1', 'ӱмбалне', 'над', 'super', 'sup' ),
- 'img_top' => array( '1', 'кӱшычын', 'Ñверху', 'top' ),
- 'img_middle' => array( '1', 'покшелне', 'поÑередине', 'middle' ),
- 'img_bottom' => array( '1', 'ӱлычын', 'Ñнизу', 'bottom' ),
+ 'img_right' => array( '1', 'пурла', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'шола', 'Ñлева', 'left' ),
+ 'img_border' => array( '1', 'чек', 'граница', 'border' ),
+ 'img_sub' => array( '1', 'йымалне', 'под', 'sub' ),
+ 'img_super' => array( '1', 'ӱмбалне', 'над', 'super', 'sup' ),
+ 'img_top' => array( '1', 'кӱшычын', 'Ñверху', 'top' ),
+ 'img_middle' => array( '1', 'покшелне', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'ӱлычын', 'Ñнизу', 'bottom' ),
);
$messages = array(
@@ -329,7 +332,6 @@ $messages = array(
'badtitle' => 'Сай огыл лӱм',
'badtitletext' => 'Йодмо лаштыкын лӱмжӧ йоҥылыш, але Ñра, але йылме кокла але интер-вики лӱмжӧ йоҥылыш. Ðла лӱмыштӧ кӱлдымӧ тамга улыт.',
'viewsource' => 'Тӱҥалтыш текÑÑ‚',
-'viewsourcefor' => '$1 лан',
# Virus scanner
'virus-badscanner' => "Келыштарымаш йоҥылыш: палыдыме Ð²Ð¸Ñ€ÑƒÑ Ñканер: ''$1''",
@@ -471,10 +473,6 @@ $messages = array(
'revdel-restore' => 'Койымашым вашталташ',
'pagehist' => 'Лаштыкын Ñртымгорно',
'deletedhist' => 'Шӧрымо Ñртымгорно',
-'revdelete-content' => 'кӧргӧ',
-'revdelete-summary' => 'тӧрлатымаш-влакым возен ончыктымаш',
-'revdelete-uname' => 'Пайдаланышын лӱмжӧ',
-'revdelete-hid' => '$1 шылтыме',
'revdelete-otherreason' => 'ВеÑ/ешартыш амал:',
'revdelete-reasonotherlist' => 'Ð’ÐµÑ Ð°Ð¼Ð°Ð»',
@@ -767,8 +765,7 @@ $messages = array(
'activeusers-hidesysops' => 'Сайтвиктарыше-влакым шылташ',
# Special:Log/newusers
-'newuserlogpage' => 'У пайдаланыше региÑтрацийым Ñртарыме журнал',
-'newuserlog-create-entry' => 'У пайдаланыше',
+'newuserlogpage' => 'У пайдаланыше региÑтрацийым Ñртарыме журнал',
# Special:ListGroupRights
'listgrouprights-members' => '(тӱшкаште улшо-влак)',
@@ -807,7 +804,6 @@ $messages = array(
'actioncomplete' => 'Ыштыме',
'deletedtext' => '«$1» шӧрымӧ.
Ончо $2 пытартыш шӧрымӧ-влак лӱмер гыч.',
-'deletedarticle' => '«[[$1]]» шӧрымӧ',
'dellogpage' => 'Шӧрымӧ нерген журнал',
'deletionlog' => 'шӧрымӧ нерген журнал',
'deletecomment' => 'Ðмал:',
@@ -844,7 +840,6 @@ $messages = array(
# Undelete
'undeletelink' => 'ончалаш/тӧрлатен шындаш',
-'undeletedarticle' => '«[[$1]]» тӧрлатен шынден',
'undelete-search-submit' => 'Кычал',
# Namespace form on various pages
@@ -934,9 +929,6 @@ $messages = array(
'talkexists' => "'''Лаштыкым куÑарыме гынат, тудын каҥашымаш лаштыкшым тыгай лӱман лаштык улмылан кӧра куÑараш огеш лий. Ðуным шке кидет дене иктыш ушно.'''",
'movedto' => 'лаштыкыш куÑарыме',
'movetalk' => 'Каҥашымаш лаштыкым куÑараш',
-'1movedto2' => '[[$1]] лаштыкым [[$2]] лаштыкыш куÑарыме',
-'1movedto2_redir' => '[[$1]] лаштыкым [[$2]] лаштыкыш куÑарыме ӱмбал Ð²ÐµÑ Ð²ÐµÑ€ÐµÑˆ колтымаш',
-'move-redirect-suppressed' => 'Ð²ÐµÑ Ð²ÐµÑ€ÐµÐº колтымаш ыштыме огыл',
'movelogpage' => 'КуÑарыме нерген журнал',
'movereason' => 'Ðмал:',
'revertmove' => 'мӧҥгешла пӧртылаш',
@@ -1014,7 +1006,7 @@ $messages = array(
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|лаштык|лаштык}}',
'file-info-size' => '$1 × $2 пикÑел, файлын кугытшо: $3, MIME-тип: $4',
-'file-nohires' => '<small>Кугурак чаплык уке.</small>',
+'file-nohires' => 'Кугурак чаплык уке.',
'svg-long-desc' => 'SVG файл, шкенжын кугытшо: $1 × $2 пикÑел, файлын кугытшо: $3',
'show-big-image' => 'Шкенжын чаплыкше',
diff --git a/languages/messages/MessagesMin.php b/languages/messages/MessagesMin.php
index c48023fc..1745815a 100644
--- a/languages/messages/MessagesMin.php
+++ b/languages/messages/MessagesMin.php
@@ -371,12 +371,11 @@ Sila laporkan ka [[Special:ListUsers/sysop|Pengurus]], dengan manandokan alamat
Mungkin alah dihapuih jo urang lain.',
'badtitle' => 'Judul indak sah',
'badtitletext' => 'Permintaan judul laman indak sah, kosong, atau antarbaso atau antarwiki yang salah sambuang. Mungkin juo ado kandungan karakter yang indak buliah digunoan untuak judul.',
-'perfcached' => 'Data barikuik iko diambiak dari singgahan dan mungkin indak data nan baharu:',
-'perfcachedts' => 'Data barikut iko diambiak dari singgahan dan tarakhir dipabaharui pado $1.',
+'perfcached' => 'Data barikuik iko diambiak dari singgahan dan mungkin indak data nan baharu. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Data barikut iko diambiak dari singgahan dan tarakhir dipabaharui pado $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pamutakhiran dari laman iko sadang dimatian. Data nan ado di siko saat iko indak akan dimuaik ulang.',
'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamintaan: $2',
'viewsource' => 'Lihek sumber',
-'viewsourcefor' => 'untuak $1',
'actionthrottled' => 'Tindakan dibatasi',
'actionthrottledtext' => 'Anda dibatasi untuak malakuan tindakan iko talalu banyak dalam waktu singkek. Sila mancubo laik satalah bara menit.',
'protectedpagetext' => 'Laman iko alah dikunci untuak manghindari panyuntiangan.',
@@ -615,9 +614,6 @@ Sanak indak dapek manggunoan fitur "kirim surel ka pangguno iko" kacuali Sanak a
Alamat IP Sanak saat ini adolah $3, dan ID pamblokiran adolah #$5.
Toloang saratokan informasi-informasi iko dalam satiok patanyaan Sanak.',
'blockednoreason' => 'indak ado alasan nan diagiah.',
-'blockedoriginalsource' => "Isi sumber dari '''$1''' ditunjuakan barikuik iko:",
-'blockededitsource' => "Teks '''suntiangan Sanak''' tahadap '''$1''' ditunjuakan barikuik iko:",
-'whitelistedittitle' => 'Paralu masuak log untuak manyuntiang',
'whitelistedittext' => 'Sanak harus $1 untuak dapek manyuntiang laman.',
'confirmedittext' => 'Sanak harus mangkonfirmasian dahulu alamaik surel Sanak sabalun manyuntiang laman.
Harap masuakan dan validasian alamaik surel Sanak malalui [[Special:Preferences|laman preferensi pangguno]] Sanak.',
@@ -767,13 +763,9 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
# Revision deletion
'rev-delundel' => 'tampilkan/suruakkan',
-'revdelete-logentry' => 'Maubah tampilan revisi untuak "[[$1]]"',
'revdel-restore' => 'Ganti tampilan',
'revdel-restore-deleted' => 'revisi nan lah tahapuih',
'revdel-restore-visible' => 'tampilan revisi',
-'revdelete-content' => 'kandungan',
-'revdelete-hid' => 'suruakan $1',
-'revdelete-log-message' => '$1 untuak $2 {{PLURAL:$2|revisi|revisi}}',
# Merge log
'revertmerge' => 'Batal bergabung',
@@ -969,8 +961,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
'linksearch-line' => '$1 tapauik dari $2',
# Special:Log/newusers
-'newuserlogpage' => 'Log pangguno baru',
-'newuserlog-create-entry' => 'Mendaftar sabagai pangguno',
+'newuserlogpage' => 'Log pangguno baru',
# Special:ListGroupRights
'listgrouprights-members' => '(senarai anggota)',
@@ -1004,7 +995,6 @@ Pastikan awak mainginkannyo, dan awak lah tahu sagalo akibatnyo dan sasuai jo [[
'actionfailed' => 'Aksi gagal',
'deletedtext' => '"$1" lah dihapuih.
Lihek $2 untuak rekam jejak laman yang lah dihapuih.',
-'deletedarticle' => 'dihapuih "[[$1]]"',
'dellogpage' => 'Log penghapusan',
'deletecomment' => 'Alasan:',
'deleteotherreason' => 'Alasan lain/tambahan:',
@@ -1040,7 +1030,6 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
# Undelete
'undeletelink' => 'tampilkan/pulihkan',
'undeleteviewlink' => 'liek',
-'undeletedarticle' => 'dipulihkan "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Ruangnamo:',
@@ -1119,8 +1108,6 @@ Dalam kasus tu, apobilo diinginkan, awak dapek mamindahkan atau manggabuangkan l
'talkexists' => "'''Laman tersebut berhasil dipindahkan, tapi laman otanyo indak dapek dipindahkan karano lah ado laman ota pado judul yang baru. Silakan digabuang laman ota tu sacaro manual.'''",
'movedto' => 'dipindahkan ka',
'movetalk' => 'Pindahkan laman ota yang takaik',
-'1movedto2' => 'mamindahkan [[$1]] ka [[$2]]',
-'1movedto2_redir' => 'mamindahkan [[$1]] ka [[$2]] malalui peralihan',
'movelogpage' => 'Log pemindahan',
'movereason' => 'Alasan:',
'revertmove' => 'kembalikan',
@@ -1200,17 +1187,13 @@ Awak hanyo buliah lihek sumber se',
# Metadata
'notacceptable' => 'Layanan wiki indak manyadioan data dalam format yang dapek dibaco dek pelanggan awak.',
-# Patrol log
-'patrol-log-line' => 'manandoi $1 dari $2 nan tajago $3',
-'patrol-log-diff' => 'revisi $1',
-
# Browsing diffs
'previousdiff' => '↠Revisi sabalunnyo',
'nextdiff' => 'Revisi salanjuiknyo →',
# Media information
'file-info-size' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4',
-'file-nohires' => '<small>Indak tasadio resolusi yang labiah tinggi.</small>',
+'file-nohires' => 'Indak tasadio resolusi yang labiah tinggi.',
'svg-long-desc' => 'SVG berkas, nominal $1 × $2 piksel, ukuran berkas: $3',
'show-big-image' => 'Resolusi penuh',
diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php
index a16cb6ef..b3600a3f 100644
--- a/languages/messages/MessagesMk.php
+++ b/languages/messages/MessagesMk.php
@@ -23,7 +23,7 @@
*/
$namespaceNames = array(
- NS_MEDIA => 'Медија',
+ NS_MEDIA => 'Медиум',
NS_SPECIAL => 'Специјална',
NS_TALK => 'Разговор',
NS_USER => 'КориÑник',
@@ -42,8 +42,9 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Специјални' => NS_SPECIAL,
- 'Слика' => NS_FILE,
+ 'Медија' => NS_MEDIA,
+ 'Специјални' => NS_SPECIAL,
+ 'Слика' => NS_FILE,
'Разговор_за_Ñлика' => NS_FILE_TALK,
);
@@ -96,12 +97,14 @@ $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( 'СмениЕ-пошта' ),
'ChangePassword' => array( 'СмениЛозинка' ),
'ComparePages' => array( 'СпоредиСтраници' ),
'Confirmemail' => array( 'Потврди_е-пошта' ),
@@ -191,127 +194,132 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#пренаÑочување', '#види', '#ПренаÑочување', '#ПРЕÐÐСОЧУВÐЊЕ', '#REDIRECT' ),
- 'notoc' => array( '0', '__БЕЗСОДРЖИÐÐ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__БЕЗГÐЛЕРИЈÐ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__СОСОДРЖИÐÐ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__СОДРЖИÐÐ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__БЕЗ_УРЕДУВÐЊЕ_ÐÐ_ПОДÐÐСЛОВИ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗÐÐСЛОВ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ТЕКОВЕÐМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ТЕКОВЕÐМЕСЕЦ1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ТЕКОВЕÐМЕСЕЦСКР', 'CURRENTMONTHABBREV' ),
- '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' ),
- 'localmonth' => array( '1', 'МЕСЕЦ_ЛОКÐЛÐО', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'МЕСЕЦ_ЛОКÐЛÐО1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'МЕСЕЦИМЕ_ЛОКÐЛÐО', 'LOCALMONTHNAME' ),
- 'localday' => array( '1', 'ДЕÐ_ЛОКÐЛÐО', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ДЕÐ2_ЛОКÐЛÐО', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ИМЕÐÐДЕÐ_ЛОКÐЛÐО', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ГОДИÐÐ_ЛОКÐЛÐО', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ВРЕМЕ_ЛОКÐЛÐО', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ЧÐС_ЛОКÐЛÐО', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'БРОЈÐÐСТРÐÐИЦИ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'БРОЈСТÐТИИ', 'БРОЈÐÐСТÐТИИ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'БРОЈÐÐПОДÐТОТЕКИ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'БРОЈÐÐКОРИСÐИЦИ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'БРОЈÐÐÐКТИВÐИКОРИСÐИЦИ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'БРОЈÐÐУРЕДУВÐЊÐ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'БРОЈÐÐПРЕГЛЕДУВÐЊÐ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'СТРÐÐИЦÐИ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ИМЕПРОСТОР', 'ИМЕÐСКИПРОСТОР', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'РÐЗГОВОРПРОСТОР', 'TALKSPACE' ),
- 'fullpagename' => array( '1', 'ЦЕЛОСÐОИМЕÐÐСТРÐÐИЦÐ', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'ИМЕÐÐПОТСТРÐÐИЦÐ', 'SUBPAGENAME' ),
- 'basepagename' => array( '1', 'ИМЕÐÐОСÐОВÐÐСТРÐÐИЦÐ', 'BASEPAGENAME' ),
- 'talkpagename' => array( '1', 'СТРÐÐИЦÐЗÐРÐЗГОВОР', 'TALKPAGENAME' ),
- 'subjectpagename' => array( '1', 'ИМЕÐÐСТÐТИЈÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subst' => array( '0', 'ЗÐМЕÐИ:', 'SUBST:' ),
- 'safesubst' => array( '0', 'БЕЗБЗÐМЕÐИ', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'мини', 'мини-Ñлика', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'мини-Ñлика=$1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'деÑно', 'д', 'right' ),
- 'img_left' => array( '1', 'лево', 'л', 'left' ),
- 'img_none' => array( '1', 'н', 'нема', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1п', '$1px' ),
- 'img_center' => array( '1', 'центар', 'ц', 'center', 'centre' ),
- 'img_framed' => array( '1', 'рамка', 'ворамка', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'безрамка', 'frameless' ),
- 'img_page' => array( '1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'иÑправено', 'иÑправено=$1', 'иÑправено $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'граничник', 'граница', 'border' ),
- 'img_baseline' => array( '1', 'оÑновналинија', 'baseline' ),
- 'img_sub' => array( '1', 'долениндекÑ', 'дол', 'sub' ),
- 'img_super' => array( '1', 'горениндекÑ', 'гор', 'super', 'sup' ),
- 'img_top' => array( '1', 'врв', 'најгоре', 'top' ),
- 'img_text_top' => array( '1', 'текÑÑ‚-врв', 'текÑÑ‚-најгоре', 'text-top' ),
- 'img_middle' => array( '1', 'Ñредина', 'middle' ),
- 'img_bottom' => array( '1', 'дно', 'најдолу', 'bottom' ),
- 'img_text_bottom' => array( '1', 'текÑÑ‚-дно', 'текÑÑ‚-најдолу', 'text-bottom' ),
- 'img_link' => array( '1', 'врÑка=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'алт=$1', 'alt=$1' ),
- 'sitename' => array( '1', 'ИМЕÐÐМРЕЖÐОМЕСТО', 'SITENAME' ),
- 'localurl' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐ:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐИ:', 'LOCALURLE:' ),
- 'server' => array( '0', 'ОПСЛУЖУВÐЧ', 'SERVER' ),
- 'servername' => array( '0', 'ИМЕÐÐОПСЛУЖУВÐЧ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ПÐТЕКÐÐÐСКРИПТÐ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
- 'currentweek' => array( '1', 'ТЕКОВÐÐСЕДМИЦÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ТЕКОВЕÐДЕÐВОСЕДМИЦÐТÐ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'СЕДМИЦÐ_ЛОКÐЛÐО', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ЛОКÐЛЕÐДЕÐВОСЕДМИЦÐТÐ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ÐÐЗÐÐКÐÐÐРЕВИЗИЈÐ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЕÐÐÐРЕВИЗИЈÐ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЕÐÐÐРЕВИЗИЈÐ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МЕСЕЦÐÐРЕВИЗИЈÐ', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'МЕСЕЦÐÐРЕВИЗИЈÐ1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'ГОДИÐÐÐÐРЕВИЗИЈÐ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'ВРЕМЕÐÐРЕВИЗИЈÐ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'КОРИСÐИКÐÐÐÐРЕВИЗИЈÐ', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПОЛÐÐURL:', 'FULLURL:' ),
- 'raw' => array( '0', 'СИРОВО:', 'РЕД:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ПРИКÐЖИÐÐСЛОВ', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'ТЕКОВÐÐВЕРЗИЈÐ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ШИФРИРÐЈURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ШИФРИРÐЈКОТВÐ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'ОЗÐÐЧЕÐОТЕКОВÐОВРЕМЕ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ОЗÐÐЧЕÐОЛОКÐЛÐОВРЕМЕ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'ОЗÐÐКÐЗÐÐÐСОКÐ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#ЈÐЗИК:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ЈÐЗИКÐÐСОДРЖИÐÐТÐ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'СТРÐÐИЦИВОИМЕÐСКИПРОСТОР', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'БРОЈÐÐÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ФОРМÐТБРОЈ', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ПОСТÐВИЛЕВО', 'PADLEFT' ),
- 'padright' => array( '0', 'ПОСТÐВИДЕСÐО', 'PADRIGHT' ),
- 'special' => array( '0', 'Ñпецијална', 'Ñпецијални', 'special' ),
- 'defaultsort' => array( '1', 'ОСÐОВÐОПОДРЕДУВÐЊЕ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ПОДÐТОТЕЧÐÐПÐТЕКÐ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'ознака', 'tag' ),
- 'hiddencat' => array( '1', '__СКРИЕÐÐ_КÐТЕГОРИЈÐ__', '__СКРИЕÐÐКÐТЕГОРИЈÐ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'СТРÐÐИЦИВОКÐТЕГОРИЈÐ', 'СТРÐÐИЦИВОКÐТ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ГОЛЕМИÐÐ_ÐÐ_СТРÐÐИЦÐ', 'PAGESIZE' ),
- 'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
- 'noindex' => array( '1', '__БЕЗИÐДЕКС__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'БРОЈВОГРУПÐ', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__СТÐТИЧÐОПРЕÐÐСОЧУВÐЊЕ__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'ÐИВОÐÐЗÐШТИТÐ', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'форматнадатум', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'ПÐТЕКÐ', 'PATH' ),
- 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
- 'url_query' => array( '0', 'БÐРÐЊЕ', 'QUERY' ),
+ 'redirect' => array( '0', '#пренаÑочување', '#види', '#ПренаÑочување', '#ПРЕÐÐСОЧУВÐЊЕ', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БЕЗСОДРЖИÐÐ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__БЕЗГÐЛЕРИЈÐ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__СОСОДРЖИÐÐ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__СОДРЖИÐÐ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БЕЗ_УРЕДУВÐЊЕ_ÐÐ_ПОДÐÐСЛОВИ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__БЕЗÐÐСЛОВ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ТЕКОВЕÐМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ТЕКОВЕÐМЕСЕЦ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ТЕКОВЕÐМЕСЕЦСКР', 'CURRENTMONTHABBREV' ),
+ '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' ),
+ 'localmonth' => array( '1', 'МЕСЕЦ_ЛОКÐЛÐО', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'МЕСЕЦ_ЛОКÐЛÐО1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'МЕСЕЦИМЕ_ЛОКÐЛÐО', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'МЕСЕЦИМЕ_ЛОКÐЛÐО_ГЕÐИТИВ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'МЕСЕЦИМЕ_ЛОКÐЛÐО_КРÐТЕÐКÐ', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ДЕÐ_ЛОКÐЛÐО', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ДЕÐ2_ЛОКÐЛÐО', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ИМЕÐÐДЕÐ_ЛОКÐЛÐО', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ГОДИÐÐ_ЛОКÐЛÐО', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ВРЕМЕ_ЛОКÐЛÐО', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ЧÐС_ЛОКÐЛÐО', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'БРОЈÐÐСТРÐÐИЦИ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'БРОЈСТÐТИИ', 'БРОЈÐÐСТÐТИИ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'БРОЈÐÐПОДÐТОТЕКИ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'БРОЈÐÐКОРИСÐИЦИ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'БРОЈÐÐÐКТИВÐИКОРИСÐИЦИ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'БРОЈÐÐУРЕДУВÐЊÐ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'БРОЈÐÐПРЕГЛЕДУВÐЊÐ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'СТРÐÐИЦÐИ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ИМЕПРОСТОР', 'ИМЕÐСКИПРОСТОР', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'РÐЗГОВОРПРОСТОР', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'ЦЕЛОСÐОИМЕÐÐСТРÐÐИЦÐ', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'ИМЕÐÐПОТСТРÐÐИЦÐ', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'ИМЕÐÐОСÐОВÐÐСТРÐÐИЦÐ', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'СТРÐÐИЦÐЗÐРÐЗГОВОР', 'TALKPAGENAME' ),
+ 'subjectpagename' => array( '1', 'ИМЕÐÐСТÐТИЈÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subst' => array( '0', 'ЗÐМЕÐИ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'БЕЗБЗÐМЕÐИ', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'мини', 'мини-Ñлика', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'мини-Ñлика=$1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'деÑно', 'д', 'right' ),
+ 'img_left' => array( '1', 'лево', 'л', 'left' ),
+ 'img_none' => array( '1', 'н', 'нема', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1п', '$1px' ),
+ 'img_center' => array( '1', 'центар', 'ц', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'рамка', 'ворамка', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'безрамка', 'frameless' ),
+ 'img_page' => array( '1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'иÑправено', 'иÑправено=$1', 'иÑправено $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'граничник', 'граница', 'border' ),
+ 'img_baseline' => array( '1', 'оÑновналинија', 'baseline' ),
+ 'img_sub' => array( '1', 'долениндекÑ', 'дол', 'sub' ),
+ 'img_super' => array( '1', 'горениндекÑ', 'гор', 'super', 'sup' ),
+ 'img_top' => array( '1', 'врв', 'најгоре', 'top' ),
+ 'img_text_top' => array( '1', 'текÑÑ‚-врв', 'текÑÑ‚-најгоре', 'text-top' ),
+ 'img_middle' => array( '1', 'Ñредина', 'middle' ),
+ 'img_bottom' => array( '1', 'дно', 'најдолу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'текÑÑ‚-дно', 'текÑÑ‚-најдолу', 'text-bottom' ),
+ 'img_link' => array( '1', 'врÑка=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'алт=$1', 'alt=$1' ),
+ 'sitename' => array( '1', 'ИМЕÐÐМРЕЖÐОМЕСТО', 'SITENAME' ),
+ 'localurl' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐ:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐИ:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'ОПСЛУЖУВÐЧ', 'SERVER' ),
+ 'servername' => array( '0', 'ИМЕÐÐОПСЛУЖУВÐЧ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ПÐТЕКÐÐÐСКРИПТÐ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'ТЕКОВÐÐСЕДМИЦÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ТЕКОВЕÐДЕÐВОСЕДМИЦÐТÐ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'СЕДМИЦÐ_ЛОКÐЛÐО', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ЛОКÐЛЕÐДЕÐВОСЕДМИЦÐТÐ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ÐÐЗÐÐКÐÐÐРЕВИЗИЈÐ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕÐÐÐРЕВИЗИЈÐ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕÐÐÐРЕВИЗИЈÐ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЕЦÐÐРЕВИЗИЈÐ', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'МЕСЕЦÐÐРЕВИЗИЈÐ1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'ГОДИÐÐÐÐРЕВИЗИЈÐ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ВРЕМЕÐÐРЕВИЗИЈÐ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'КОРИСÐИКÐÐÐÐРЕВИЗИЈÐ', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПОЛÐÐURL:', 'FULLURL:' ),
+ 'raw' => array( '0', 'СИРОВО:', 'РЕД:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ПРИКÐЖИÐÐСЛОВ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'П', 'R' ),
+ 'currentversion' => array( '1', 'ТЕКОВÐÐВЕРЗИЈÐ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ШИФРИРÐЈURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ШИФРИРÐЈКОТВÐ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ОЗÐÐЧЕÐОТЕКОВÐОВРЕМЕ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ОЗÐÐЧЕÐОЛОКÐЛÐОВРЕМЕ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ОЗÐÐКÐЗÐÐÐСОКÐ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#ЈÐЗИК:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ЈÐЗИКÐÐСОДРЖИÐÐТÐ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'СТРÐÐИЦИВОИМЕÐСКИПРОСТОР', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'БРОЈÐÐÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ФОРМÐТБРОЈ', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ПОСТÐВИЛЕВО', 'PADLEFT' ),
+ 'padright' => array( '0', 'ПОСТÐВИДЕСÐО', 'PADRIGHT' ),
+ 'special' => array( '0', 'Ñпецијална', 'Ñпецијални', 'special' ),
+ 'defaultsort' => array( '1', 'ОСÐОВÐОПОДРЕДУВÐЊЕ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ПОДÐТОТЕЧÐÐПÐТЕКÐ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'ознака', 'tag' ),
+ 'hiddencat' => array( '1', '__СКРИЕÐÐКÐТ__', '__СКРИЕÐÐКÐТЕГОРИЈÐ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'СТРÐÐИЦИВОКÐТЕГОРИЈÐ', 'СТРÐÐИЦИВОКÐТ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ГОЛЕМИÐÐ_ÐÐ_СТРÐÐИЦÐ', 'PAGESIZE' ),
+ 'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
+ 'noindex' => array( '1', '__БЕЗИÐДЕКС__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'БРОЈВОГРУПÐ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__СТÐТИЧÐОПРЕÐÐСОЧУВÐЊЕ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ÐИВОÐÐЗÐШТИТÐ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'форматнадатум', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ПÐТЕКÐ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
+ 'url_query' => array( '0', 'БÐРÐЊЕ', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', 'безгрешки', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', 'беззамена', 'noreplace' ),
);
$linkTrail = '/^([a-zабвгдѓежзѕијклљмнњопрÑтќуфхцчџш]+)(.*)$/sDu';
@@ -682,22 +690,24 @@ $1',
'badarticleerror' => 'Ова дејÑтво не може да Ñе Ñпроведе на оваа Ñтраница.',
'cannotdelete' => 'Страницата или податотеката „$1“ не можеше да Ñе избрише.
Можеби некој друг веќе ја избришал.',
+'cannotdelete-title' => 'Ðе можам да ја избришам Ñтраницата „$1“',
'badtitle' => 'Лош наÑлов',
'badtitletext' => 'Бараниот наÑлов е грешен, празен или погрешно поврзан меѓујазичен или интер-вики наÑлов. Може да Ñодржи еден или повеќе знаци што не можат да Ñе кориÑтат во наÑлови.',
-'perfcached' => 'Следните податоци Ñе кеширани и може да не Ñе тековни.',
-'perfcachedts' => 'Следните податоци Ñе кеширани, поÑледен пат подновени на $1.',
+'perfcached' => 'Следните податоци Ñе кеширани и може да не Ñе тековни. Во кешот {{PLURAL:$1|е доÑтапен највеќе еден резултат|Ñе доÑтапни највеќе $1 резултати}}.',
+'perfcachedts' => 'Следните податоци Ñе кеширани, поÑледен пат подновени на $1. Во кешот {{PLURAL:$4|е доÑтапен највеќе еден резултат|Ñе доÑтапни највеќе $4 резултати}}.',
'querypage-no-updates' => 'Подновите на оваа Ñтраница моментално Ñе оневозможени.
Податоците овде во моментов нема да Ñе подновуваат.',
'wrong_wfQuery_params' => 'Грешни параметри до wfQuery()<br />
Функција: $1<br />
Барање: $2',
'viewsource' => 'Преглед',
-'viewsourcefor' => 'за $1',
+'viewsource-title' => 'Преглед на кодот на $1',
'actionthrottled' => 'ДејÑтвото е уÑпорено',
'actionthrottledtext' => 'Како анти-Ñпам мерка, ограничени Ñте од вршење на ова дејÑтво премногу пати во краток временÑки период, а го преминавте ограничувањето.
Ве молиме обидете Ñе повторно за неколку минути.',
'protectedpagetext' => 'Оваа Ñтраница е заклучена за уредувања.',
'viewsourcetext' => 'Можете да го погледнете и копирате кодот на оваа Ñтраница:',
+'viewyourtext' => "Можете да го погледнете и копирате кодот на '''вашите уредувања''' на оваа Ñтраница:",
'protectedinterface' => 'Оваа Ñтраница Ñодржи текÑÑ‚ од поÑредникот на програмот и е заклучена поради можна злоупотреба.',
'editinginterface' => "'''Предупредување:''' Уредувате Ñтраница која е дел од кориÑничкиот поÑредник на програмÑката опрема на МедијаВики.
Промените на оваа Ñтраница ќе предизвикаат промена на кориÑничкиот поÑредник кај оÑтанатите кориÑници.
@@ -805,6 +815,7 @@ $2',
'emailconfirmlink' => 'Потврдете ја вашата е-поштенÑка адреÑа',
'invalidemailaddress' => 'Е-поштенÑката адреÑа не може да биде прифатена бидејќи има неважечки формат.
Ве молиме, внеÑете важечки формат или иÑпразнете го тоа поле.',
+'cannotchangeemail' => 'Ðа ова вики не може да Ñе менува е-пошта на Ñметките.',
'accountcreated' => 'КориÑничката Ñметка е направена',
'accountcreatedtext' => 'КориÑничката Ñметка за $1 беше направена.',
'createaccount-title' => 'Создавање на Ñметка за {{SITENAME}}',
@@ -821,6 +832,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'Ðепозната грешка во функцијата mail() на PHP',
+'user-mail-no-addy' => 'Се обидовте да иÑпратите порака без да внеÑете адреÑа',
# Change password dialog
'resetpass' => 'Промена на лозинка',
@@ -842,16 +854,18 @@ $2',
'resetpass-temp-password' => 'Привремена лозинка:',
# Special:PasswordReset
-'passwordreset' => 'Менување на лозинка',
-'passwordreset-text' => 'Пополнете го образецов за да ви иÑпратиме потÑетник за вашите најавни податоци по е-пошта.',
-'passwordreset-legend' => 'Ðова лозинка',
-'passwordreset-disabled' => 'Ðа ова вики е оневозможено задавање на нова лозинка.',
-'passwordreset-pretext' => '{{PLURAL:$1||Подолу внеÑете еден податок}}',
-'passwordreset-username' => 'КориÑничко име:',
-'passwordreset-domain' => 'Домен:',
-'passwordreset-email' => 'Е-пошта:',
-'passwordreset-emailtitle' => 'Ðајавни податоци за {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ðекој (веројатно вие, од IP-адреÑата $1) побара потÑетник на вашите
+'passwordreset' => 'Менување на лозинка',
+'passwordreset-text' => 'Пополнете го образецов за да ви иÑпратиме потÑетник за вашите најавни податоци по е-пошта.',
+'passwordreset-legend' => 'Ðова лозинка',
+'passwordreset-disabled' => 'Ðа ова вики е оневозможено задавање на нова лозинка.',
+'passwordreset-pretext' => '{{PLURAL:$1||Подолу внеÑете еден податок}}',
+'passwordreset-username' => 'КориÑничко име:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Да ја прикажам пораката?',
+'passwordreset-capture-help' => 'Ðко го штиклирате кутивчево, ќе ви Ñе прикаже пораката (Ñо привремената лозинка) и иÑтата ќе му биде иÑпратена на кориÑникот.',
+'passwordreset-email' => 'Е-пошта:',
+'passwordreset-emailtitle' => 'Ðајавни податоци за {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Ðекој (веројатно вие, од IP-адреÑата $1) побара потÑетник на вашите
најавни податоци за {{SITENAME}} ($4). Оваа е-поштенÑка адреÑа е наведена во
{{PLURAL:$3|Ñледнава кориÑничка Ñметка|Ñледниве кориÑнички Ñметки}}:
@@ -861,7 +875,7 @@ $2
Сега треба да Ñе најавите и да внеÑете нова лозинка. Ðко ова барање го
поÑтавил некој друг, или пак во меѓувреме Ñте Ñе Ñетиле на лозинката, и не Ñакате
да ја менувате, тогаш Ñлободно занемарете ја поракава и продолжете да ја кориÑтите Ñтарата.',
-'passwordreset-emailtext-user' => 'КориÑникот $1 на {{SITENAME}} побара да потÑетник за вашите најавни податоци на {{SITENAME}}
+'passwordreset-emailtext-user' => 'КориÑникот $1 на {{SITENAME}} побара да потÑетник за вашите најавни податоци на {{SITENAME}}
($4). Оваа е-поштенÑка адреÑа е наведена во {{PLURAL:$3|Ñледнава кориÑничка Ñметка|Ñледниве кориÑнички Ñметки}}:
$2
@@ -870,9 +884,22 @@ $2
Сега треба да Ñе најавите и да внеÑете нова лозинка. Ðко ова барање го
поÑтавил некој друг, или пак во меѓувреме Ñте Ñе Ñетиле на лозинката, и не Ñакате
да ја менувате, тогаш Ñлободно занемарете ја поракава и продолжете да ја кориÑтите Ñтарата.',
-'passwordreset-emailelement' => 'КориÑничко име: $1
+'passwordreset-emailelement' => 'КориÑничко име: $1
Привремена лозинка: $2',
-'passwordreset-emailsent' => 'ИÑпратен е потÑетник по е-пошта',
+'passwordreset-emailsent' => 'ИÑпратен е потÑетник по е-пошта',
+'passwordreset-emailsent-capture' => 'ИÑпратен е потÑетник по е-пошта (прикажан подолу).',
+'passwordreset-emailerror-capture' => 'Создаден е потÑетник за иÑпраќање по е-пошта (прикажан подолу), но не уÑпеав да го иÑпратам на кориÑникот: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Смени е-пошта',
+'changeemail-header' => 'Промена на е-пошта за Ñметката',
+'changeemail-text' => 'Пополнете го образецов за да ја Ñмените е-поштата. За да ја потврдите промената, ќе треба да ја внеÑете лозинката.',
+'changeemail-no-info' => 'Мора да бидете најавени ако Ñакате да имате директен приÑтап до оваа Ñтраница.',
+'changeemail-oldemail' => 'Тековна е-пошта:',
+'changeemail-newemail' => 'Ðова е-пошта:',
+'changeemail-none' => '(нема)',
+'changeemail-submit' => 'Смени е-пошта',
+'changeemail-cancel' => 'Откажи',
# Edit page toolbar
'bold_sample' => 'Задебелен текÑÑ‚',
@@ -943,9 +970,6 @@ $2
Вашата IP-адреÑа е $3, a ID на блокирањеto е $5.
Ве молиме наведете ги овие детали доколку реагирате на блокирањето.",
'blockednoreason' => 'не е дадено образложение',
-'blockedoriginalsource' => "Кодот на '''$1''' е прикажан подолу:",
-'blockededitsource' => "ТекÑтот на '''вашите уредувања''' на '''$1''' е прикажан подолу:",
-'whitelistedittitle' => 'Мора да Ñте најавени доколку Ñакате да уредувате',
'whitelistedittext' => 'Мора да Ñте $1 за да уредувате Ñтраници.',
'confirmedittext' => 'Морате да ја потврдите вашата е-поштенÑка адреÑа пред да уредувате Ñтраници.
ПоÑтавете ја и валидирајте ја вашата е-поштенÑка адреÑа преку вашите [[Special:Preferences|нагодувања]].',
@@ -1035,7 +1059,8 @@ $2
'copyrightwarning2' => "Ве молиме, имајте предвид дека Ñите придонеÑи кон {{SITENAME}} можат да бидат уредувани, менувани или отÑтранети од други кориÑници. Ðко не Ñакате вашиот текÑÑ‚ да биде менуван и редиÑтрибуиран Ñлободно, не го иÑпраќајте овде.<br />
ИÑто така потврдувате дека текÑтот Ñте го напишале Ñами, или Ñте го копирале од јавен домен или Ñличен Ñлободен извор (видетe $1 за детали).<br />
'''ÐЕ ПРÐÐŒÐЈТЕ ТЕКСТОВИ ЗÐШТИТЕÐИ СО ÐВТОРСКИ ПРÐВРБЕЗ ДОЗВОЛÐ!'''",
-'longpageerror' => "'''ГРЕШКÐ: ТекÑтот што го внеÑовте е голем $1 килобајти, што е повеќе од макÑималните $2 килобајти. Ðе може да Ñе зачува.'''",
+'longpageerror' => "'''Грешка: ТекÑтот што го внеÑовте е голем {{PLURAL:$1|еден килобајт|$1 килобајти}}, што ја надминува границата од {{PLURAL:$2|еден килобајт|$2 килобајти}}.'''
+Затоа нема да може да Ñе зачува.",
'readonlywarning' => "'''ПРЕДУПРЕДУВÐЊЕ: Базата на податоци е заклучена заради одржување, па нема да можете да ги зачувате вашите промени Ñега.
Пробајте да го зачувате текÑтот локално (cut & paste) во некоја податотека и да го пратите подоцна.'''
@@ -1203,8 +1228,6 @@ $2
'revdelete-unsuppress' => 'ОтÑтрани ограничувања на обновени ревизии',
'revdelete-log' => 'Причина:',
'revdelete-submit' => 'Примени на одбрани {{PLURAL:$1|ревизија|ревизии}}',
-'revdelete-logentry' => 'променета е видливоÑÑ‚ на ревизија на [[$1]]',
-'logdelete-logentry' => 'променета видливоÑÑ‚ на наÑтан од [[$1]]',
'revdelete-success' => "'''ВидливоÑта на ревизијата е уÑпешно изменета.'''",
'revdelete-failure' => "'''ВидливоÑта на ревизијата не можеше да Ñе измени:'''
$1",
@@ -1216,15 +1239,6 @@ $1",
'revdel-restore-visible' => 'видливи ревизии',
'pagehist' => 'ИÑторија на Ñтраницата',
'deletedhist' => 'ИÑторија на бришења',
-'revdelete-content' => 'Ñодржина',
-'revdelete-summary' => 'Ð¾Ð¿Ð¸Ñ Ð½Ð° уредување',
-'revdelete-uname' => 'кориÑничко име',
-'revdelete-restricted' => 'применети ограничувања на ÑиÑтем оператори',
-'revdelete-unrestricted' => 'отÑтранети ограничувања за ÑиÑтем оператори',
-'revdelete-hid' => 'Ñкрив $1',
-'revdelete-unhid' => 'прикажи $1',
-'revdelete-log-message' => '$1 за $2 {{PLURAL:$2|ревизија|ревизии}}',
-'logdelete-log-message' => '$1 од $2 {{PLURAL:$2|наÑтан|наÑтани}}',
'revdelete-hide-current' => 'Грешка при Ñокривање на Ñтавката датирана на $2, $1: ова е актуелна ревизија.',
'revdelete-show-no-access' => 'Грешка при прикажување на Ñтавката датирана на $2, $1: оваа Ñтавка е означена како „ограничена“. Ðемате приÑтап до неа.',
'revdelete-modify-no-access' => 'Грешка при промена на Ñтавката датирана на $2, $1: оваа Ñтавка била означена како „ограничена“. Ðемате приÑтап до неа.',
@@ -1380,12 +1394,14 @@ $1",
'prefs-rc' => 'Скорешни промени',
'prefs-watchlist' => 'СпиÑок на набљудувања',
'prefs-watchlist-days' => 'Број на денови за приказ во ÑпиÑокот на набљудувања:',
-'prefs-watchlist-days-max' => 'Ðајвеќе 7 дена',
+'prefs-watchlist-days-max' => 'Ðајвеќе $1 {{PLURAL:$1|ден|дена}}',
'prefs-watchlist-edits' => 'МакÑимален број на прикажани промени во проширениот ÑпиÑок на набљудувања:',
'prefs-watchlist-edits-max' => 'Ðајвеќе: 1000',
'prefs-watchlist-token' => 'Жетон на ÑпиÑок на набљудувања:',
'prefs-misc' => 'Други нагодувања',
'prefs-resetpass' => 'Смени лозинка',
+'prefs-changeemail' => 'Смени е-пошта',
+'prefs-setemail' => 'ПоÑтавање на е-пошта',
'prefs-email' => 'Ðагодувања за е-пошта',
'prefs-rendering' => 'Изглед',
'saveprefs' => 'Зачувај',
@@ -1444,6 +1460,7 @@ $1",
'yourrealname' => 'ВиÑтинÑко име:',
'yourlanguage' => 'Јазик:',
'yourvariant' => 'Јазична варијанта на Ñодржината:',
+'prefs-help-variant' => 'Вашата претпочитана варијанта или Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð·Ð° приказ на ÑодржинÑките Ñтраници на ова вики.',
'yournick' => 'ПотпиÑ:',
'prefs-help-signature' => 'Коментарите на Ñтраниците за разговор треба да Ñе потпишуваат Ñо „<nowiki>~~~~</nowiki>“ кое ќе Ñе претвори во вашиот Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ð¸ време.',
'badsig' => 'Грешка во потпиÑот.
@@ -1486,7 +1503,7 @@ $1",
'userrights-lookup-user' => 'Раководење Ñо кориÑнички групи',
'userrights-user-editname' => 'ВнеÑете кориÑничко име:',
'editusergroup' => 'Уреди кориÑнички групи',
-'editinguser' => "Менување на кориÑничките права на кориÑникот '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Менување на кориÑничките права на кориÑникот '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Уреди ги кориÑничките групи',
'saveusergroups' => 'Зачувај ги кориÑничките групи',
'userrights-groupsmember' => 'Член на:',
@@ -1581,13 +1598,13 @@ $1",
'right-autopatrol' => 'СопÑтвените уредувања автоматÑки да Ñе обележуваат како иÑпатролирани',
'right-patrolmarks' => 'Преглед на одбележаните патролирања на Ñкорешните промени',
'right-unwatchedpages' => 'Прегледување на ÑпиÑок на ненабљудувани Ñтраници',
-'right-trackback' => 'Потврдување на враќање',
'right-mergehistory' => 'Спојување на иÑториите на Ñтраниците',
'right-userrights' => 'Уредување на Ñите кориÑнички права',
'right-userrights-interwiki' => 'Уредување на кориÑнички права на кориÑници на други викија',
'right-siteadmin' => 'Заклучување и отклучување на базата на податоци',
'right-override-export-depth' => 'Извезување на Ñтраници вклучувајќи поврзани Ñтраници Ñо длабочина до 5',
'right-sendemail' => 'ИÑпраќање на е-пошта до други кориÑници',
+'right-passwordreset' => 'Преглед на пораки по е-пошта за промена на лозинка',
# User rights log
'rightslog' => 'Дневник на менувања на кориÑнички права',
@@ -1621,16 +1638,17 @@ $1",
'action-suppressionlog' => 'преглед на овој приватен дневник',
'action-block' => 'оневозможи го овој кориÑник да уредува',
'action-protect' => 'измени го Ñтепенот на заштита на оваа Ñтраница',
+'action-rollback' => 'брзо враќање на измени направени од поÑледниот уредник на Ñтраницата',
'action-import' => 'увези ја оваа Ñтраница од друго вики',
'action-importupload' => 'увези ја оваа Ñтраница од подигната податотека',
'action-patrol' => 'означи ги уредувањата на другите како проверени',
'action-autopatrol' => 'вашите уредувања да Ñе обележуват како иÑпатролирани',
'action-unwatchedpages' => 'преглед на ÑпиÑок на ненабљудувани Ñтраници',
-'action-trackback' => 'потврда на враќање',
'action-mergehistory' => 'Ñпојување на иÑторијата на оваа Ñтраница',
'action-userrights' => 'уредување на Ñите кориÑнички права',
'action-userrights-interwiki' => 'уредување на кориÑнички права на кориÑници на други викија',
'action-siteadmin' => 'заклучување или отклучување на базата на податоци',
+'action-sendemail' => 'иÑпраќање на е-пошта',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|промена|промени}}',
@@ -1663,6 +1681,7 @@ $1",
'rc_categories' => 'Само од категории (одделувајќи Ñо „|“)',
'rc_categories_any' => 'Било кои',
'rc-change-size' => '$1',
+'rc-change-size-new' => '$1 {{PLURAL:$1|бајт|бајти}} по промената',
'newsectionsummary' => '/* $1 */ ново заглавие',
'rc-enhanced-expand' => 'Прикажување на детали (потребно JavaScript)',
'rc-enhanced-hide' => 'Сокривање на детали',
@@ -1672,7 +1691,6 @@ $1",
'recentchangeslinked-feed' => 'Поврзани промени',
'recentchangeslinked-toolbox' => 'Поврзани промени',
'recentchangeslinked-title' => 'Промени поврзани Ñо „$1“',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'Ðема промени на поврзаните Ñтраници во зададениот период.',
'recentchangeslinked-summary' => "Ова е ÑпиÑок на промени направени на Ñтраниците поврзани преку назначената Ñтраница (или до членови на назначената категорија).
Страниците на [[Special:Watchlist|вашиот ÑпиÑок на набљудувања]] Ñе прикажани '''задебелено'''.",
@@ -1718,6 +1736,7 @@ $1",
'minlength1' => 'Името на податотеката мора да Ñодржи барем една буква.',
'illegalfilename' => 'Името на податотеката „$1“ Ñодржи знаци што не Ñе дозволени во наÑлови на Ñтраници.
Преименувајте ја подигнете ја повторно.',
+'filename-toolong' => 'Имињата на податотеките не Ñмеат да бидат подолги од 240 бајти.',
'badfilename' => 'Името на податотеката е променето во „$1“.',
'filetype-mime-mismatch' => 'Податотечната наÑтавка „.$1“ не одговара на утврдениот MIME-тип на податотеката ($2).',
'filetype-badmime' => 'Податотеките од MIME-тип „$1“ не Ñе дозволени за подигање.',
@@ -1829,6 +1848,41 @@ $1',
'upload-unknown-size' => 'Ðепозната големина',
'upload-http-error' => 'HTTP грешка: $1',
+# File backend
+'backend-fail-stream' => 'Ðе можев да ја емитувам податотеката $1.',
+'backend-fail-backup' => 'Ðе можев да направам резерва на податотеката $1.',
+'backend-fail-notexists' => 'Податотеката $1 не поÑтои.',
+'backend-fail-hashes' => 'Ðе можев да добијам податотечни тараби за Ñпоредба.',
+'backend-fail-notsame' => 'Веќе поÑтои неиÑтоветна податотека - $1.',
+'backend-fail-invalidpath' => '$1 не е важечка патека за Ñкладирање.',
+'backend-fail-delete' => 'Ðе можев да ја избришам податотеката $1.',
+'backend-fail-alreadyexists' => 'Податотеката $1 веќе поÑтои.',
+'backend-fail-store' => 'Ðе можев да ја Ñкладирам податотеката $1 во $2.',
+'backend-fail-copy' => 'Ðе можев да ја иÑкопирам податотеката $1 во $2.',
+'backend-fail-move' => 'Ðе можев да ја премеÑтам податотеката $1 во $2.',
+'backend-fail-opentemp' => 'Ðе можев да отворам привремена податотека.',
+'backend-fail-writetemp' => 'Ðе можев да запишам во привремената податотека.',
+'backend-fail-closetemp' => 'Ðе можев да ја затворам привремената податотека.',
+'backend-fail-read' => 'Ðе можев да ја прочитам податотеката $1',
+'backend-fail-create' => 'Ðе можев да ја Ñоздадам податотеката $1',
+'backend-fail-readonly' => 'Складишната оÑнова „$1“ моментално не може да Ñе запишува. Ðаведената причина глаÑи: „$2“',
+'backend-fail-synced' => 'Податотеката „$1“ е во ÑоÑтојба недоÑледна во рамките на внатрешните Ñкладишни оÑнови',
+'backend-fail-connect' => 'Ðе можев да Ñе поврзам Ñо Ñкладишната оÑнова „$1“.',
+'backend-fail-internal' => 'Се појави непозната грешка во Ñкладишната оÑнова „$1“.',
+'backend-fail-contenttype' => 'Ðе можев да утврдам каква Ñодржина има податотеката што треба да ја Ñкладирам во „$1“.',
+'backend-fail-batchsize' => 'Складишната оÑнова доби блок од $1 податочна {{PLURAL:$1|операција|операции}}, а ограничувањето е $2 {{PLURAL:$2|операција|операции}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ðе можев да го отклучам „$1“ бидејќи не е заклучен.',
+'lockmanager-fail-closelock' => 'Ðе можев да ја затворам податотеката-катанец за „$1“.',
+'lockmanager-fail-deletelock' => 'Ðе можев да ја избришам податотеката-катанец за „$1“.',
+'lockmanager-fail-acquirelock' => 'Ðе можев да добијам катанец за „$1“.',
+'lockmanager-fail-openlock' => 'Ðе можев да ја отворам податотеката-катанец за „$1“.',
+'lockmanager-fail-releaselock' => 'Ðе можев да го оÑлободам катанецот за „$1“.',
+'lockmanager-fail-db-bucket' => 'Ðе можев да контактирам доволно податотеки-катанци во Ñадот $1',
+'lockmanager-fail-db-release' => 'Ðе можев да ги оÑлободам катанците на базата $1',
+'lockmanager-fail-svr-release' => 'Ðе можев да ги оÑлободам катанците на опÑлужувачот $1',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Се појави грешка при отворањето на податотеката за да Ñе провери ZIP.',
'zip-wrong-format' => 'Ðаведената податотека не е од типот ZIP.',
@@ -1845,6 +1899,7 @@ $1',
'uploadstash-badtoken' => 'Ðе уÑпеав да го извршам бараното дејÑтво, можеби поради тоа што вашиот ÑигурноÑен жетон е иÑтечен. Обидете Ñе повторно.',
'uploadstash-errclear' => 'ЧиÑтењето на податотеките не уÑпеа.',
'uploadstash-refresh' => 'Превчитај го ÑпиÑокот на податотеки',
+'invalid-chunk-offset' => 'Ðеважечка појдовна точка',
# img_auth script messages
'img-auth-accessdenied' => 'Оневозможен приÑтап',
@@ -1946,7 +2001,6 @@ $1',
# File reversion
'filerevert' => 'Врати $1',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'Врати податотека',
'filerevert-intro' => "Ја враќате '''[[Media:$1|$1]]''' на [$4 верзијата од $3, $2].",
'filerevert-comment' => 'Причина:',
@@ -1956,24 +2010,24 @@ $1',
'filerevert-badversion' => 'Ðема претходна локална верзија на оваа податотека Ñо даденото време.',
# File deletion
-'filedelete' => 'Избриши го $1',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'Избриши податотека',
-'filedelete-intro' => "Ја бришете податотеката '''[[Media:$1|$1]]''' заедно Ñо нејзината иÑторија.",
-'filedelete-intro-old' => "Вие ја бришете верзијата на '''[[Media:$1|$1]]''' од [$4 $3, $2].",
-'filedelete-comment' => 'Причина:',
-'filedelete-submit' => 'Избриши',
-'filedelete-success' => "'''$1''' е избришана.",
-'filedelete-success-old' => "Верзијата на '''[[Media:$1|$1]]''' од $3, $2 ч. е избришана.",
-'filedelete-nofile' => "'''$1''' не поÑтои.",
-'filedelete-nofile-old' => "Ðе поÑтојат архивирани верзии на '''$1''' Ñо атрибути како што Ñе наведени.",
-'filedelete-otherreason' => 'Друга/дополнителна причина:',
-'filedelete-reason-otherlist' => 'Друга причина',
-'filedelete-reason-dropdown' => '*Вообичаени причини за бришење
+'filedelete' => 'Избриши го $1',
+'filedelete-legend' => 'Избриши податотека',
+'filedelete-intro' => "Ја бришете податотеката '''[[Media:$1|$1]]''' заедно Ñо нејзината иÑторија.",
+'filedelete-intro-old' => "Вие ја бришете верзијата на '''[[Media:$1|$1]]''' од [$4 $3, $2].",
+'filedelete-comment' => 'Причина:',
+'filedelete-submit' => 'Избриши',
+'filedelete-success' => "'''$1''' е избришана.",
+'filedelete-success-old' => "Верзијата на '''[[Media:$1|$1]]''' од $3, $2 ч. е избришана.",
+'filedelete-nofile' => "'''$1''' не поÑтои.",
+'filedelete-nofile-old' => "Ðе поÑтојат архивирани верзии на '''$1''' Ñо атрибути како што Ñе наведени.",
+'filedelete-otherreason' => 'Друга/дополнителна причина:',
+'filedelete-reason-otherlist' => 'Друга причина',
+'filedelete-reason-dropdown' => '*Вообичаени причини за бришење
** Прекршување на Copyright
** Дуплирање на податотеки',
-'filedelete-edit-reasonlist' => 'Уреди причини за бришење',
-'filedelete-maintenance' => 'Бришење и враќање на податотеки е привремено оневозможено поради одржување на базата на податоци.',
+'filedelete-edit-reasonlist' => 'Уреди причини за бришење',
+'filedelete-maintenance' => 'Бришење и враќање на податотеки е привремено оневозможено поради одржување на базата на податоци.',
+'filedelete-maintenance-title' => 'Ðе можам да ја избришам податотеката',
# MIME search
'mimesearch' => 'Пребарување по MIME',
@@ -2073,6 +2127,8 @@ $1',
'wantedpages' => 'Потребни Ñтраници',
'wantedpages-badtitle' => 'Ðевалиден наÑлов во резултатите: $1',
'wantedfiles' => 'Потребни податотеки',
+'wantedfiletext-cat' => 'Следниве податотеки Ñе кориÑтат, но не поÑтојат. Податотеките од други Ñкладишта може да Ñе наведени дури и ако поÑтојат. Таквите ќе бидат <del>поништени</del> од ÑпиÑокот. Покрај ова, Ñтраниците што Ñодржат податотеки кои не поÑтојат Ñе наведени на [[:$1]].',
+'wantedfiletext-nocat' => 'Следниве податотеки Ñе кориÑтат, но не поÑтојат. Податотеките од други Ñкладишта може да Ñе наведени дури и ако поÑтојат. Таквите ќе бидат <del>поништени</del> од ÑпиÑокот.',
'wantedtemplates' => 'Потребни шаблони',
'mostlinked' => 'Ðајмногу врÑки до Ñтраници',
'mostlinkedcategories' => 'Ðајмногу врÑки до категории',
@@ -2081,6 +2137,7 @@ $1',
'mostimages' => 'Ðајмногу врÑки до податотеки',
'mostrevisions' => 'Статии Ñо најмногу верзии',
'prefixindex' => 'Страници Ñо префикÑ',
+'prefixindex-namespace' => 'Сите Ñтраници Ñо Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ (именÑки проÑтор $1)',
'shortpages' => 'Кратки Ñтраници',
'longpages' => 'Долги Ñтраници',
'deadendpages' => 'ЌорÑокак Ñтраници',
@@ -2192,12 +2249,8 @@ $1',
'activeusers-noresult' => 'Ðема пронајдено кориÑници.',
# Special:Log/newusers
-'newuserlogpage' => 'Дневник на региÑтрирања на кориÑници',
-'newuserlogpagetext' => 'Ова е дневник на региÑтрирани кориÑници.',
-'newuserlog-byemail' => 'иÑпратена лозинка по е-пошта',
-'newuserlog-create-entry' => 'Ðов кориÑник',
-'newuserlog-create2-entry' => 'Ñоздадено нова кориÑничка Ñметка $1',
-'newuserlog-autocreate-entry' => 'ÐвтоматÑки Ñоздадена кориÑничка Ñметка',
+'newuserlogpage' => 'Дневник на региÑтрирања на кориÑници',
+'newuserlogpagetext' => 'Ова е дневник на региÑтрирани кориÑници.',
# Special:ListGroupRights
'listgrouprights' => 'Права на кориÑнички групи',
@@ -2226,7 +2279,7 @@ $1',
'emailpagetext' => 'Можете да го кориÑтите Ñледниов образец за праќање на е-поштенÑка порака до овој кориÑник.
Е-поштенÑката адреÑа која ја имате наведено во [[Special:Preferences|вашите нагодувања]] ќе Ñе прикаже во „Од“ полето на е-пораката, Ñо што примачот ќе може да ви одговори директно вам.',
'usermailererror' => 'ÐаÑтана Ñледната грешка при праќање е-пошта:',
-'defemailsubject' => '{{SITENAME}} е-пошта',
+'defemailsubject' => '{{SITENAME}} — пиÑмо од кориÑникот „$1“',
'usermaildisabled' => 'КориÑничката е-пошта е оневозможена',
'usermaildisabledtext' => 'Ðе можете да иÑпратите е-порака до дрги кориÑници на ова вики',
'noemailtitle' => 'Ðема е-поштенÑка адреÑа',
@@ -2280,7 +2333,7 @@ $1',
'watchmethod-list' => 'Проверерка на набљудуваните Ñтраници во Ñкорешните уредувања',
'watchlistcontains' => 'Вашиот ÑпиÑок на набљудувања Ñодржи $1 {{PLURAL:$1|Ñтраница|Ñтраници}}.',
'iteminvalidname' => "Проблем Ñо елементот '$1', неважечко име...",
-'wlnote' => "Подолу {{PLURAL:$1|е прикажана поÑледната промена|Ñе прикажани поÑледните '''$1''' промени}} во {{PLURAL:$2|поÑледниов чаÑ|поÑледниве '''$2''' чаÑа}}.",
+'wlnote' => "Подолу {{PLURAL:$1|е прикажана поÑледната промена|Ñе прикажани поÑледните '''$1''' промени}} во {{PLURAL:$2|поÑледниов чаÑ|поÑледниве '''$2''' чаÑа}}, заклучно Ñо $3, $4 ч.",
'wlshowlast' => 'Прикажи ги поÑледните $1 чаÑа, $2 дена, $3',
'watchlist-options' => 'ПоÑтавки за ÑпиÑок на набљудувања',
@@ -2338,7 +2391,6 @@ $UNWATCHURL
'exbeforeblank' => "Ñодржината пред бришењето беше: '$1'",
'exblank' => 'Ñтраницата беше празна',
'delete-confirm' => 'Избриши „$1“',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Бришење',
'historywarning' => "'''Предупредување:''' Страницата којашто Ñакате да ја избришете има иÑторија Ñо околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
'confirmdeletetext' => 'Ðа пат Ñте трајно да избришете Ñтраница заедно Ñо нејзината иÑторија.
@@ -2346,8 +2398,6 @@ $UNWATCHURL
'actioncomplete' => 'ДејÑтвото е Ñпроведено',
'actionfailed' => 'ÐеуÑпешно дејÑтво',
'deletedtext' => '„$1“ е избришана. Евиденција на Ñкорешните бришења ќе најдете на $2.',
-'deletedarticle' => 'ја избриша „[[$1]]“',
-'suppressedarticle' => 'ја Ñкри „[[$1]]“',
'dellogpage' => 'Дневник на бришења',
'dellogpagetext' => 'Подолу е наведен ÑпиÑок на најновите бришења.',
'deletionlog' => 'дневник на бришењата',
@@ -2397,8 +2447,10 @@ $UNWATCHURL
'unprotectedarticle' => 'отÑтранета заштитата на „[[$1]]“',
'movedarticleprotection' => 'премеÑтени нагодувања за заштита од „[[$2]]“ во „[[$1]]“',
'protect-title' => 'Измена на Ñтепенот на заштита на „$1“',
+'protect-title-notallowed' => 'Преглед на Ñтепенот на заштита на „$1“',
'prot_1movedto2' => '[[$1]] премеÑтена како [[$2]]',
-'protect-backlink' => '↠$1',
+'protect-badnamespace-title' => 'Ðезаштитлив именÑки проÑтор',
+'protect-badnamespace-text' => 'Страниците во овој именÑки проÑтор не можат да Ñе заштитуваат.',
'protect-legend' => 'Потврдете ја заштитата',
'protectcomment' => 'Причина:',
'protectexpiry' => 'ИÑтекува:',
@@ -2420,6 +2472,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Само админиÑтратори',
'protect-summary-cascade' => 'каÑкада',
'protect-expiring' => 'иÑтекува на $1 (UTC)',
+'protect-expiring-local' => 'иÑтекува $1',
'protect-expiry-indefinite' => 'беÑконечно',
'protect-cascade' => 'Заштити Ñтраници вклучени во оваа Ñтраница (каÑкадна заштита)',
'protect-cantedit' => 'Ðе можете да го промените Ñтепенот на заштита на оваа Ñтраница, бидејќи немате дозвола за тоа.',
@@ -2481,7 +2534,6 @@ $UNWATCHURL
'undeletereset' => 'Врати',
'undeleteinvert' => 'Обратен избор',
'undeletecomment' => 'Причина:',
-'undeletedarticle' => 'обновена „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|1 измена е обновена|$1 измени Ñе обновени}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} Ñе вратени',
'undeletedfiles' => '{{PLURAL:$1|1 податотека е вратена|$1 податотеки Ñе вратени}}',
@@ -2490,6 +2542,7 @@ $UNWATCHURL
Погледнете го [[Special:Log/delete|дневникот на бришења]] за Ð¿Ð¾Ð¿Ð¸Ñ Ð½Ð° претходни бришења и обновувања.",
'undelete-header' => 'СпиÑокот на неодамна избришани Ñтраници ќе го најдете на [[Special:Log/delete|дневникот на бришења]].',
+'undelete-search-title' => 'Пребарување на избришани Ñтраници',
'undelete-search-box' => 'Пребарување на избришани Ñтраници',
'undelete-search-prefix' => 'Прикажи Ñтраници кои почнуваат Ñо:',
'undelete-search-submit' => 'Барај',
@@ -2499,6 +2552,7 @@ $UNWATCHURL
'undelete-cleanup-error' => 'Грешка при бришење на некориÑтената архивÑка податотека „$1“.',
'undelete-missing-filearchive' => 'Ðе можеше да Ñе врати ID $1 because од податочниот архив бидејќи тој не е во базата на податоци.
Можеби веќе бил избришан.',
+'undelete-error' => 'Се појави грешка при враќањето на избришаната Ñтраница',
'undelete-error-short' => 'Грешка при обновување на податотека: $1',
'undelete-error-long' => 'Се појавија грешки при обновувањето на податотеката:
@@ -2545,7 +2599,6 @@ $1',
'whatlinkshere' => 'Што води овде',
'whatlinkshere-title' => 'Страници Ñо врÑки што водат до „$1“',
'whatlinkshere-page' => 'Страница:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Следните Ñтраници имаат врÑка до '''[[:$1]]''':",
'nolinkshere' => "Ðема Ñтраници што водат кон '''[[:$1]]'''.",
'nolinkshere-ns' => "Ðема Ñтраници што водат кон '''[[:$1]]''' во избраниот именÑки проÑтор.",
@@ -2620,6 +2673,7 @@ $1',
'blocklist-userblocks' => 'Скриј блокирања на кориÑ. Ñметки',
'blocklist-tempblocks' => 'Скриј привремени блокирања',
'blocklist-addressblocks' => 'Скри блокирања на поединечни IP-адреÑи',
+'blocklist-rangeblocks' => 'Скриј опÑежни блокови',
'blocklist-timestamp' => 'Време и датум',
'blocklist-target' => 'Цел',
'blocklist-expiry' => 'ИÑтекува',
@@ -2642,6 +2696,7 @@ $1',
'unblocklink' => 'одблокирај',
'change-blocklink' => 'промена на блок',
'contribslink' => 'придонеÑи',
+'emaillink' => 'иÑпрати е-пошта',
'autoblocker' => 'ÐвтоматÑки Ñте блокирани бидејќи вашата IP-адреÑа била Ñкоро кориÑтена од „[[User:$1|$1]]“.
Причината за блокирање на $1 била: „$2“',
'blocklogpage' => 'Дневник на блокирања',
@@ -2771,9 +2826,6 @@ $1',
'movepage-page-moved' => 'Страницата $1 е премеÑтена на $2.',
'movepage-page-unmoved' => 'Страницата $1 не може да биде премеÑтена во $2.',
'movepage-max-pages' => 'МакÑимално $1 {{PLURAL:$1|Ñтраница|Ñтраници}} беа премеÑтени, повеќе не може да бидат автоматÑки премеÑтени.',
-'1movedto2' => '[[$1]] премеÑтена како [[$2]]',
-'1movedto2_redir' => '[[$1]] премеÑтена како [[$2]] преку пренаÑочување',
-'move-redirect-suppressed' => 'иÑклучено пренаÑочување',
'movelogpage' => 'Дневник на премеÑтувања',
'movelogpagetext' => 'Подолу е наведен ÑпиÑок на премеÑтени Ñтраници.',
'movesubpage' => '{{PLURAL:$1|ПотÑтраница|ПотÑтраници}}',
@@ -2786,7 +2838,7 @@ $1',
Целната Ñтатија „[[:$1]]“ веќе поÑтои.
Дали Ñакате да ја избришете за да оÑлободите меÑто за премеÑтувањето?',
'delete_and_move_confirm' => 'Да, избриши ја Ñтраницата',
-'delete_and_move_reason' => 'Избришано за да Ñе оÑлободи меÑто за премеÑтувањето',
+'delete_and_move_reason' => 'Избришано за да Ñе оÑлободи меÑто за премеÑтувањето од „[[$1]]“',
'selfmove' => 'Страницата не може да биде премеÑтена бидејќи целниот наÑлов Ñе Ñовпаѓа Ñо првобитниот наÑлов;
не може да Ñе премеÑти Ñтраница во Ñамата Ñебе.',
'immobile-source-namespace' => 'Ðе може да Ñе премеÑтуваат Ñтраници во именÑкиот проÑтор „$1“',
@@ -2817,9 +2869,11 @@ $1',
За извезување на Ñтраници, внеÑете ги наÑловите во полето прикажано подолу, еден наÑлов на Ñтатија во ред, потоа изберете дали Ñакате да ја извезете Ñамо поÑледната ревизија или и Ñите поÑтари ревизии.
Ðко ја Ñакате Ñамо тековната верзија, би можеле да иÑкориÑтите врÑка од видот [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за Ñтраницата „[[{{MediaWiki:Mainpage}}]]“.',
+'exportall' => 'Извези ги Ñите Ñтраници',
'exportcuronly' => 'Вклучи ја Ñамо тековната ревизија, а не Ñета иÑторија',
'exportnohistory' => "----
'''Ðапомена:''' извезувањето на целата иÑторија на Ñтраниците преку овој образец е оневозможено од перформанÑни причини.",
+'exportlistauthors' => 'Прикажувај полн ÑпиÑок на придонеÑи во Ñекоја Ñтраница',
'export-submit' => 'Извези',
'export-addcattext' => 'Додај Ñтраници од категорија:',
'export-addcat' => 'Додај',
@@ -2852,6 +2906,8 @@ $1',
'thumbnail_error' => 'Грешка при Ñоздавање на минијатурата: $1',
'djvu_page_error' => 'ÐедоÑтапна DjVu Ñтраница',
'djvu_no_xml' => 'Ðе е можно да Ñе излачи XML за DjVu податотеки',
+'thumbnail-temp-create' => 'Ðе можам да Ñоздадам привремена податотека на минијатурата',
+'thumbnail-dest-create' => 'Ðе можам да ја зачувам минијатурата во одредницата',
'thumbnail_invalid_params' => 'Параметрите на минијатурата Ñе погрешни',
'thumbnail_dest_directory' => 'Целниот именик не може да Ñе Ñоздаде',
'thumbnail_image-type' => 'Ðеподдржан тип на Ñлика',
@@ -2899,6 +2955,11 @@ $1',
'import-upload' => 'Подигни XML податоци',
'import-token-mismatch' => 'Губење на ÑеÑиÑките податоци. Обидете Ñе повторно.',
'import-invalid-interwiki' => 'Ðе можам да увезам од наведеното вики.',
+'import-error-edit' => 'Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.',
+'import-error-create' => 'Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја Ñоздадете.',
+'import-error-interwiki' => 'Страницата „$1“ не е увезена бидејќи името е резервирано за надворешни врÑки (меѓувики).',
+'import-error-special' => 'Страницата „$1“ не е увезена бидејќи припаѓа на поÑебен именÑки проÑтор што не дозволува Ñтраници.',
+'import-error-invalid' => 'Страницата „$1“ не е увезена бидејќи името Ñ Ðµ неважечко.',
# Import log
'importlogpage' => 'Дневник на увезувања',
@@ -2908,73 +2969,86 @@ $1',
'import-logentry-interwiki' => 'транÑвикифиран $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ревизија|ревизии}} од $2',
+# JavaScriptTest
+'javascripttest' => 'Проба на JavaScript',
+'javascripttest-disabled' => 'Оваа функција е оневозможена.',
+'javascripttest-title' => 'Вршам $1 проби',
+'javascripttest-pagetext-noframework' => 'Оваа Ñтраница е резервирана за вршење на проби Ñо JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Ðепозната рамка „$1“.',
+'javascripttest-pagetext-frameworks' => 'Изберете една од Ñледниве рамки: $1',
+'javascripttest-pagetext-skins' => 'Одберете Ñо кое руво да ја направите пробата:',
+'javascripttest-qunit-intro' => 'Вид. [$1 документација на иÑпробувањето] на mediawiki.org.',
+'javascripttest-qunit-heading' => 'JavaScript-програм за иÑпробување на МедијаВики „QUnit“',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Вашата кориÑничка Ñтраница',
-'tooltip-pt-anonuserpage' => 'КориÑничка Ñтраница за IP-адреÑата од која уредувате',
-'tooltip-pt-mytalk' => 'Вашата Ñтраница за разговор',
-'tooltip-pt-anontalk' => 'Разговор за уредувањата од оваа IP-адреÑа',
-'tooltip-pt-preferences' => 'Ваши нагодувања',
-'tooltip-pt-watchlist' => 'СпиÑок на Ñтраници кои Ñте избрале да ги набљудувате.',
-'tooltip-pt-mycontris' => 'СпиÑок на ваши придонеÑи',
-'tooltip-pt-login' => 'Ви препорачуваме да Ñе најавите, иако тоа не е задолжително.',
-'tooltip-pt-anonlogin' => 'Ви препорачуваме да Ñе најавите, иако тоа не е задолжително.',
-'tooltip-pt-logout' => 'Одјавете Ñе',
-'tooltip-ca-talk' => 'Разговор за Ñтраницата',
-'tooltip-ca-edit' => 'Можете да ја уредите оваа Ñтраница. Ве молиме кориÑтете го копчето за преглед пред зачувување.',
-'tooltip-ca-addsection' => 'Започни нов паÑуÑ',
-'tooltip-ca-viewsource' => 'Оваа Ñтраница е заштитена. Можете да го видите изворниот код.',
-'tooltip-ca-history' => 'Претходни верзии на оваа Ñтраница.',
-'tooltip-ca-protect' => 'Заштитете ја оваа Ñтраница',
-'tooltip-ca-unprotect' => 'Измени заштита Ñтраницава',
-'tooltip-ca-delete' => 'Избриши ја оваа Ñтраница',
-'tooltip-ca-undelete' => 'Обнови ги уредувањата направени на оваа Ñтраница пред да биде избришана',
-'tooltip-ca-move' => 'ПремеÑти ја оваа Ñтраница',
-'tooltip-ca-watch' => 'Додај ја Ñтраницава во ÑпиÑокот на набљудувања',
-'tooltip-ca-unwatch' => 'ОтÑтрани ја Ñтраницава од ÑпиÑокот на набљудувања',
-'tooltip-search' => 'Пребарај низ {{SITENAME}}',
-'tooltip-search-go' => 'Оди на Ñтраница Ñо ова име доколку поÑтои',
-'tooltip-search-fulltext' => 'Пребарај го овој текÑÑ‚ низ Ñтранците',
-'tooltip-p-logo' => 'Главна Ñтраница',
-'tooltip-n-mainpage' => 'ПоÑети ја главната Ñтраница',
-'tooltip-n-mainpage-description' => 'ПоÑети главна Ñтраница',
-'tooltip-n-portal' => 'За проектот, што можете да направите, каде да најдете некои работи',
-'tooltip-n-currentevents' => 'Ðајдете информации за тековните наÑтани',
-'tooltip-n-recentchanges' => 'СпиÑок на Ñкорешни промени на викито.',
-'tooltip-n-randompage' => 'Вчитај Ñлучајна Ñтраница',
-'tooltip-n-help' => 'МеÑто каде што може да Ñе информирате.',
-'tooltip-t-whatlinkshere' => 'СпиÑок на Ñите вики-Ñтраници што водат овде',
-'tooltip-t-recentchangeslinked' => 'Скорешни промени на Ñтраници Ñо врÑки на оваа Ñтраница',
-'tooltip-feed-rss' => 'RSS емитување за оваа Ñтраница',
-'tooltip-feed-atom' => 'Atom емитување за оваа Ñтраница',
-'tooltip-t-contributions' => 'СпиÑок на придонеÑи на овој кориÑник',
-'tooltip-t-emailuser' => 'ИÑпрати е-пошта на овој кориÑник',
-'tooltip-t-upload' => 'Подигни податотеки',
-'tooltip-t-specialpages' => 'СпиÑок на Ñите Ñпецијални Ñтраници',
-'tooltip-t-print' => 'Верзија за печатење на оваа Ñтраница',
-'tooltip-t-permalink' => 'ПоÑтојана врÑка до оваа верзија на Ñтраницата',
-'tooltip-ca-nstab-main' => 'Преглед на Ñодржината',
-'tooltip-ca-nstab-user' => 'Преглед на кориÑничката Ñтраница',
-'tooltip-ca-nstab-media' => 'Преглед на мултимедијалната податотека',
-'tooltip-ca-nstab-special' => 'Ова е Ñпецијална Ñтраница, не можете да ја уредувате',
-'tooltip-ca-nstab-project' => 'Преглед на проектната Ñтраница',
-'tooltip-ca-nstab-image' => 'Преглед на Ñтраницата на податотеката',
-'tooltip-ca-nstab-mediawiki' => 'Преглед на ÑиÑтемÑката порака',
-'tooltip-ca-nstab-template' => 'Преглед на шаблонот',
-'tooltip-ca-nstab-help' => 'Преглед на Ñтраницата за помош',
-'tooltip-ca-nstab-category' => 'Преглед на категоријата',
-'tooltip-minoredit' => 'Обележете ја промената како Ñитна',
-'tooltip-save' => 'Зачувајте ги вашите промени',
-'tooltip-preview' => 'Прегледајте ги вашите промени, ве молиме кориÑтете го ова пред зачувување!',
-'tooltip-diff' => 'Покажи кои промени ги направи во текÑтот.',
-'tooltip-compareselectedversions' => 'Видете ја разликата помеѓу двете избрани верзии на оваа Ñтраница.',
-'tooltip-watch' => 'Додај ја Ñтраницава во ÑпиÑокот на набљудувања',
-'tooltip-recreate' => 'Повторно Ñоздај ја Ñтраницата иако е избришана',
-'tooltip-upload' => 'Започни Ñо подигање',
-'tooltip-rollback' => '„Врати“ ги поништува поÑледните уредувања на оваа Ñтраница Ñо еден клик до уредувањата на претпоÑледниот придонеÑувач',
-'tooltip-undo' => '„Откажи“ го поништува ова уредување и отвора прозорец за уредување.
+'tooltip-pt-userpage' => 'Вашата кориÑничка Ñтраница',
+'tooltip-pt-anonuserpage' => 'КориÑничка Ñтраница за IP-адреÑата од која уредувате',
+'tooltip-pt-mytalk' => 'Вашата Ñтраница за разговор',
+'tooltip-pt-anontalk' => 'Разговор за уредувањата од оваа IP-адреÑа',
+'tooltip-pt-preferences' => 'Ваши нагодувања',
+'tooltip-pt-watchlist' => 'СпиÑок на Ñтраници кои Ñте избрале да ги набљудувате.',
+'tooltip-pt-mycontris' => 'СпиÑок на ваши придонеÑи',
+'tooltip-pt-login' => 'Ви препорачуваме да Ñе најавите, иако тоа не е задолжително.',
+'tooltip-pt-anonlogin' => 'Ви препорачуваме да Ñе најавите, иако тоа не е задолжително.',
+'tooltip-pt-logout' => 'Одјавете Ñе',
+'tooltip-ca-talk' => 'Разговор за Ñтраницата',
+'tooltip-ca-edit' => 'Можете да ја уредите оваа Ñтраница. Ве молиме кориÑтете го копчето за преглед пред зачувување.',
+'tooltip-ca-addsection' => 'Започни нов паÑуÑ',
+'tooltip-ca-viewsource' => 'Оваа Ñтраница е заштитена. Можете да го видите изворниот код.',
+'tooltip-ca-history' => 'Претходни верзии на оваа Ñтраница.',
+'tooltip-ca-protect' => 'Заштитете ја оваа Ñтраница',
+'tooltip-ca-unprotect' => 'Измени заштита Ñтраницава',
+'tooltip-ca-delete' => 'Избриши ја оваа Ñтраница',
+'tooltip-ca-undelete' => 'Обнови ги уредувањата направени на оваа Ñтраница пред да биде избришана',
+'tooltip-ca-move' => 'ПремеÑти ја оваа Ñтраница',
+'tooltip-ca-watch' => 'Додај ја Ñтраницава во ÑпиÑокот на набљудувања',
+'tooltip-ca-unwatch' => 'ОтÑтрани ја Ñтраницава од ÑпиÑокот на набљудувања',
+'tooltip-search' => 'Пребарај низ {{SITENAME}}',
+'tooltip-search-go' => 'Оди на Ñтраница Ñо ова име доколку поÑтои',
+'tooltip-search-fulltext' => 'Пребарај го овој текÑÑ‚ низ Ñтранците',
+'tooltip-p-logo' => 'Главна Ñтраница',
+'tooltip-n-mainpage' => 'ПоÑети ја главната Ñтраница',
+'tooltip-n-mainpage-description' => 'ПоÑети главна Ñтраница',
+'tooltip-n-portal' => 'За проектот, што можете да направите, каде да најдете некои работи',
+'tooltip-n-currentevents' => 'Ðајдете информации за тековните наÑтани',
+'tooltip-n-recentchanges' => 'СпиÑок на Ñкорешни промени на викито.',
+'tooltip-n-randompage' => 'Вчитај Ñлучајна Ñтраница',
+'tooltip-n-help' => 'МеÑто каде што може да Ñе информирате.',
+'tooltip-t-whatlinkshere' => 'СпиÑок на Ñите вики-Ñтраници што водат овде',
+'tooltip-t-recentchangeslinked' => 'Скорешни промени на Ñтраници Ñо врÑки на оваа Ñтраница',
+'tooltip-feed-rss' => 'RSS емитување за оваа Ñтраница',
+'tooltip-feed-atom' => 'Atom емитување за оваа Ñтраница',
+'tooltip-t-contributions' => 'СпиÑок на придонеÑи на овој кориÑник',
+'tooltip-t-emailuser' => 'ИÑпрати е-пошта на овој кориÑник',
+'tooltip-t-upload' => 'Подигни податотеки',
+'tooltip-t-specialpages' => 'СпиÑок на Ñите Ñпецијални Ñтраници',
+'tooltip-t-print' => 'Верзија за печатење на оваа Ñтраница',
+'tooltip-t-permalink' => 'ПоÑтојана врÑка до оваа верзија на Ñтраницата',
+'tooltip-ca-nstab-main' => 'Преглед на Ñодржината',
+'tooltip-ca-nstab-user' => 'Преглед на кориÑничката Ñтраница',
+'tooltip-ca-nstab-media' => 'Преглед на мултимедијалната податотека',
+'tooltip-ca-nstab-special' => 'Ова е Ñпецијална Ñтраница, не можете да ја уредувате',
+'tooltip-ca-nstab-project' => 'Преглед на проектната Ñтраница',
+'tooltip-ca-nstab-image' => 'Преглед на Ñтраницата на податотеката',
+'tooltip-ca-nstab-mediawiki' => 'Преглед на ÑиÑтемÑката порака',
+'tooltip-ca-nstab-template' => 'Преглед на шаблонот',
+'tooltip-ca-nstab-help' => 'Преглед на Ñтраницата за помош',
+'tooltip-ca-nstab-category' => 'Преглед на категоријата',
+'tooltip-minoredit' => 'Обележете ја промената како Ñитна',
+'tooltip-save' => 'Зачувајте ги вашите промени',
+'tooltip-preview' => 'Прегледајте ги вашите промени, ве молиме кориÑтете го ова пред зачувување!',
+'tooltip-diff' => 'Покажи кои промени ги направи во текÑтот.',
+'tooltip-compareselectedversions' => 'Видете ја разликата помеѓу двете избрани верзии на оваа Ñтраница.',
+'tooltip-watch' => 'Додај ја Ñтраницава во ÑпиÑокот на набљудувања',
+'tooltip-watchlistedit-normal-submit' => 'ОтÑтрани наÑлови',
+'tooltip-watchlistedit-raw-submit' => 'Поднови го ÑпиÑокот',
+'tooltip-recreate' => 'Повторно Ñоздај ја Ñтраницата иако е избришана',
+'tooltip-upload' => 'Започни Ñо подигање',
+'tooltip-rollback' => '„Врати“ ги поништува поÑледните уредувања на оваа Ñтраница Ñо еден клик до уредувањата на претпоÑледниот придонеÑувач',
+'tooltip-undo' => '„Откажи“ го поништува ова уредување и отвора прозорец за уредување.
Дозволува додавање на причина во опиÑот',
-'tooltip-preferences-save' => 'Зачувај',
-'tooltip-summary' => 'ВнеÑете кратко резиме',
+'tooltip-preferences-save' => 'Зачувај',
+'tooltip-summary' => 'ВнеÑете кратко резиме',
# Stylesheets
'common.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз Ñите рува */',
@@ -3073,9 +3147,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Дневник на патролирања',
'patrol-log-header' => 'Ова е дневник на патролирани ревизии.',
-'patrol-log-line' => 'означена $1 од $2 како патролирана $3',
-'patrol-log-auto' => '(автоматÑки)',
-'patrol-log-diff' => 'ревизија $1',
'log-show-hide-patrol' => '$1 дневник на патролирање',
# Image deletion
@@ -3103,11 +3174,11 @@ $1',
'file-info' => 'големина: $1, MIME-тип: $2',
'file-info-size' => '$1 × $2 пикÑели, големина: $3, MIME-тип: $4',
'file-info-size-pages' => '$1 × $2 пикÑели, големина: $3, MIME-тип: $4, $5 {{PLURAL:$5|Ñтраница|Ñтраници}}',
-'file-nohires' => '<small>Ðе е доÑтапна поголема резолуција.</small>',
+'file-nohires' => 'Ðе е доÑтапна поголема резолуција.',
'svg-long-desc' => 'SVG податотека, номинално $1 × $2 пикÑели, големина: $3',
'show-big-image' => 'ВиÑтинÑка големина',
-'show-big-image-preview' => '<small>Големина на овој преглед: $1.</small>',
-'show-big-image-other' => '<small>Други резолуции: $1.</small>',
+'show-big-image-preview' => 'Големина на овој преглед: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Друга резолуција|Други резолуции}}: $1.',
'show-big-image-size' => '$1 × $2 пикÑели',
'file-info-gif-looped' => 'кружно',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадри}}',
@@ -3129,10 +3200,15 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'Ñ',
-'minutes-abbrev' => 'м',
-'hours-abbrev' => 'ч',
-'days-abbrev' => 'д',
+'seconds-abbrev' => '$1 Ñ',
+'minutes-abbrev' => '$1 м',
+'hours-abbrev' => '$1 ч',
+'days-abbrev' => '$1 д',
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунди}}',
+'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
+'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа}}',
+'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
+'ago' => 'пред $1',
# Bad image list
'bad_image_list' => 'Форматот е Ñледниот:
@@ -3697,13 +3773,6 @@ $5
'scarytranscludefailed' => '[Преземањето на шаблонот за $1 не уÑпеа]',
'scarytranscludetoolong' => '[Премногу долго URL]',
-# Trackbacks
-'trackbackbox' => 'Враќања за оваа Ñтраница:<br />
-$1',
-'trackbackremove' => '([$1 Избриши])',
-'trackbacklink' => 'Враќање',
-'trackbackdeleteok' => 'Враќањето беше уÑпешно избришано.',
-
# Delete conflict
'deletedwhileediting' => "'''Предупредување''': Оваа Ñтраница беше избришана откако почнавте Ñо нејзино уредување!",
'confirmrecreate' => "КориÑникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша оваа Ñтраница откако вие почнавте Ñо уредување заради:
@@ -3753,10 +3822,26 @@ $1',
'autosumm-new' => 'Создадена Ñтраница Ñо: $1',
# Size units
-'size-bytes' => '$1 Б',
-'size-kilobytes' => '$1 КБ',
-'size-megabytes' => '$1 МБ',
-'size-gigabytes' => '$1 ГБ',
+'size-bytes' => '$1 Б',
+'size-kilobytes' => '$1 КБ',
+'size-megabytes' => '$1 МБ',
+'size-gigabytes' => '$1 ГБ',
+'size-terabytes' => '$1 ТБ',
+'size-petabytes' => '$1 ПБ',
+'size-exabytes' => '$1 ЕБ',
+'size-zetabytes' => '$1 ЗБ',
+'size-yottabytes' => '$1 ЈБ',
+
+# Bitrate units
+'bitrate-bits' => '$1 б/Ñ',
+'bitrate-kilobits' => '$1 кб/Ñ',
+'bitrate-megabits' => '$1 Мб/Ñ',
+'bitrate-gigabits' => '$1 Гб/Ñ',
+'bitrate-terabits' => '$1 Тб/Ñ',
+'bitrate-petabits' => '$1 Пб/Ñ',
+'bitrate-exabits' => '$1 Еб/Ñ',
+'bitrate-zetabits' => '$1 Зб/Ñ',
+'bitrate-yottabits' => '$1 Јб/Ñ',
# Live preview
'livepreview-loading' => 'Вчитувам...',
@@ -3856,6 +3941,9 @@ $1',
'hebrew-calendar-m11-gen' => 'Ðв',
'hebrew-calendar-m12-gen' => 'Елул',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ðепозната ознака на додатокот „$1“',
'duplicate-defaultsort' => 'Предупредување: ОÑновниот клуч за подредување „$2“ го поништува претходниот оÑновен клуч за подредување „$1“.',
@@ -3954,13 +4042,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|промена|промени}}',
# Special:ComparePages
-'comparepages' => 'Спореди Ñтраници',
-'compare-selector' => 'Споредба на ревизии на Ñтраници',
-'compare-page1' => 'Страница 1',
-'compare-page2' => 'Страница 2',
-'compare-rev1' => 'Ревизија 1',
-'compare-rev2' => 'Ревизија 2',
-'compare-submit' => 'Спореди',
+'comparepages' => 'Спореди Ñтраници',
+'compare-selector' => 'Споредба на ревизии на Ñтраници',
+'compare-page1' => 'Страница 1',
+'compare-page2' => 'Страница 2',
+'compare-rev1' => 'Ревизија 1',
+'compare-rev2' => 'Ревизија 2',
+'compare-submit' => 'Спореди',
+'compare-invalid-title' => 'Ðаведениот наÑлов е неважечки.',
+'compare-title-not-exists' => 'Ðаведениот наÑлов не поÑтои.',
+'compare-revision-not-exists' => 'Ðаведената ревизија не поÑтои.',
# Database error messages
'dberr-header' => 'Ова вики не функционира како што треба',
@@ -3987,4 +4078,90 @@ $1',
'sqlite-has-fts' => '$1 Ñо поддршка за пребарување по цели текÑтови',
'sqlite-no-fts' => '$1 без поддршка за пребарување по цели текÑтови',
+# New logging system
+'logentry-delete-delete' => '$1 ја избриша Ñтраницата $3',
+'logentry-delete-restore' => '$1 ја врати Ñтраницата $3',
+'logentry-delete-event' => '$1 ја измени видливоÑта на {{PLURAL:$5|наÑтан во дневникот|$5 наÑтани во дневникот}} на $3: $4',
+'logentry-delete-revision' => '$1 ја измени видливоÑта на {{PLURAL:$5|ревизија|$5 ревизии}} на Ñтраницата $3: $4',
+'logentry-delete-event-legacy' => '$1 ја измени видливоÑта на наÑтани во дневникот на $3',
+'logentry-delete-revision-legacy' => '$1 ја измени видливоÑта на ревизии на Ñтраницата $3',
+'logentry-suppress-delete' => '$1 ја потиÑна Ñтраницата $3',
+'logentry-suppress-event' => '$1 потајно ја измени видливоÑта на {{PLURAL:$5|наÑтан во дневникот|$5 наÑтани во дневникот}} на $3: $4',
+'logentry-suppress-revision' => '$1 потајно ја измени видливоÑта на {{PLURAL:$5|ревизија|$5 ревизии}} на Ñтраницата $3: $4',
+'logentry-suppress-event-legacy' => '$1 потајно ја измени видливоÑта на наÑтани во дневникот на $3',
+'logentry-suppress-revision-legacy' => '$1 потајно ја измени видливоÑта на ревизии на Ñтраницата $3',
+'revdelete-content-hid' => 'Ñодржината е Ñкриена',
+'revdelete-summary-hid' => 'опиÑот на уредувањето е Ñкриен',
+'revdelete-uname-hid' => 'кориÑничкото име е Ñкриено',
+'revdelete-content-unhid' => 'Ñодржината е откриена',
+'revdelete-summary-unhid' => 'опиÑот на уредувањето е откриен',
+'revdelete-uname-unhid' => 'кориÑничкото име е Ñкриено',
+'revdelete-restricted' => 'применети ограничувања на ÑиÑтем оператори',
+'revdelete-unrestricted' => 'отÑтранети ограничувања за ÑиÑтем оператори',
+'logentry-move-move' => '$1 ја премеÑти Ñтраницата $3 на $4',
+'logentry-move-move-noredirect' => '$1 ја премеÑти Ñтраницата $3 на $4 без да оÑтави пренаÑочување',
+'logentry-move-move_redir' => '$1 ја премеÑти Ñтраницата $3 на $4 презапишувајќи врз пренаÑочување',
+'logentry-move-move_redir-noredirect' => '$1 ја премеÑти Ñтраницата $3 на $4 презапишувајќи врз пренаÑочување без да оÑтави пренаÑочување',
+'logentry-patrol-patrol' => '$1 ја означи ревизијата $4 на Ñтраницата $3 како иÑпатролирана',
+'logentry-patrol-patrol-auto' => '$1 автоматÑки ја означи ревизијата $4 на Ñтраницата $3 како иÑпатролирана',
+'logentry-newusers-newusers' => '$1 направи кориÑничка Ñметка',
+'logentry-newusers-create' => '$1 направи кориÑничка Ñметка',
+'logentry-newusers-create2' => '$1 направи кориÑничка Ñметка $3',
+'logentry-newusers-autocreate' => 'Сметката $1 е Ñоздадена автоматÑки',
+'newuserlog-byemail' => 'иÑпратена лозинка по е-пошта',
+
+# Feedback
+'feedback-bugornote' => 'Ðко Ñте Ñпремни подробно да го опишете техничкиот проблем, тогаш [$1 пријавете грешка].
+Во Ñпротивно, поÑлужете Ñе Ñо едноÑтавниот образец подолу. Вашиот коментар ќе Ñтои на Ñтраницата „[$3 $2]“, заедно Ñо кориÑничкото име и прелиÑтувачот што го кориÑтите.',
+'feedback-subject' => 'ÐаÑлов:',
+'feedback-message' => 'Порака:',
+'feedback-cancel' => 'Откажи',
+'feedback-submit' => 'ПоднеÑи миÑлење',
+'feedback-adding' => 'Го додавам иÑкажаното миÑлење во Ñтраницата...',
+'feedback-error1' => 'Грешка: Ðепрепознаен резултат од прилогот (API)',
+'feedback-error2' => 'Грешка: Уредувањето не уÑпеа',
+'feedback-error3' => 'Грешка: Прилогот (API) не одговара',
+'feedback-thanks' => 'Благодариме! Вашиот одѕив е објавен на Ñтраницата „[$2 $1]“.',
+'feedback-close' => 'Готово',
+'feedback-bugcheck' => 'Одлично! Само проверете да не е една од [$1 веќе познатите грешки].',
+'feedback-bugnew' => 'Проверив. Пријави ја како нова грешка.',
+
+# API errors
+'api-error-badaccess-groups' => 'Ðе ви е дозволено да подигате податотеки на ова вики.',
+'api-error-badtoken' => 'Внатрешна грешка: неиÑправен жетон.',
+'api-error-copyuploaddisabled' => 'Подигањата Ñо URL Ñе оневозможени на овој опÑлужувач.',
+'api-error-duplicate' => 'Веќе {{PLURAL:$1|поÑтои [$2 друга податотека]|поÑтојат [$2 други податотеки]}} Ñо иÑтата Ñодржина',
+'api-error-duplicate-archive' => 'Ðа мрежното меÑто веќе {{PLURAL:$1|поÑтоела [$2 друга податотека]|поÑтоеле [$2 други податотеки]}} Ñо иÑтата Ñодржина, но во меѓувреме {{PLURAL:$1|е избришана|Ñе избришани}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Дуплирана податотека што е веќе избришана|Дуплирани податотеки што Ñе веќе избришани}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Дуплирана податотека|Дуплирани податотеки}}',
+'api-error-empty-file' => 'ПоднеÑената податотека е празна.',
+'api-error-emptypage' => 'Создавањето на нови празни Ñтраници не е дозволено.',
+'api-error-fetchfileerror' => 'Внатрешна грешка: нешто тргна наопаку при добивањето на податотеката.',
+'api-error-file-too-large' => 'ПоднеÑената податотека е преголема.',
+'api-error-filename-tooshort' => 'Името на податотеката е прекратко.',
+'api-error-filetype-banned' => 'Овој тип на податотека е забранет.',
+'api-error-filetype-missing' => 'Ðа податотеката Ñ Ð½ÐµÐ´Ð¾ÑтаÑува наÑтавка.',
+'api-error-hookaborted' => 'Измената што Ñе обидовте да ја направите е откажана од кука за наÑтавки.',
+'api-error-http' => 'Внатрешна грешка: не можам да Ñе поврзам Ñо опÑлужувачот.',
+'api-error-illegal-filename' => 'Податотеката има недозволено име.',
+'api-error-internal-error' => 'Внатрешна грешка: нешто тргна наопаку при обработката на она што го подигате на викито.',
+'api-error-invalid-file-key' => 'Внатрешна грешка: не ја пронајдов податотеката во привременото Ñкладиште.',
+'api-error-missingparam' => 'Внатрешна грешка: недоÑтаÑуваат параметри за барањето.',
+'api-error-missingresult' => 'Внатрешна грешка: не можев да одредам дали копирањето заврши уÑпешно.',
+'api-error-mustbeloggedin' => 'Мора да Ñте најавени за да можете да подигате податотеки.',
+'api-error-mustbeposted' => 'Во програмов има грешка. Ðе кориÑти иÑправен HTTP-метод.',
+'api-error-noimageinfo' => 'Погидањето уÑпеа, но опÑлужувачот не понуди никакви информации за податотеката.',
+'api-error-nomodule' => 'Внатрешна грешка: нема зададено модул за подигање.',
+'api-error-ok-but-empty' => 'Внатрешна грешка: опÑлужувачот не одговара.',
+'api-error-overwrite' => 'Презапишувањето врз поÑтоечки податотеки не е дозволено.',
+'api-error-stashfailed' => 'Внатрешна грешка: опÑлужувачот не уÑпеа да ја Ñкладира привремената податотека.',
+'api-error-timeout' => 'ОпÑлужувачот не одговори во очекуваното време.',
+'api-error-unclassified' => 'Се појави непозната грешка.',
+'api-error-unknown-code' => 'Ðепозната грешка: „$1“',
+'api-error-unknown-error' => 'Внатрешна грешка: нешто тргна наопаку при обидот да ја подигнете податотеката.',
+'api-error-unknown-warning' => 'Ðепознато предупредување: $1',
+'api-error-unknownerror' => 'Ðепозната грешка: „$1“.',
+'api-error-uploaddisabled' => 'Подигањето е оневозможено на ова вики.',
+'api-error-verification-error' => 'Податотеката е оштетена или има погрешна наÑтавка.',
+
);
diff --git a/languages/messages/MessagesMl.php b/languages/messages/MessagesMl.php
index 117c0f99..ba7aa33b 100644
--- a/languages/messages/MessagesMl.php
+++ b/languages/messages/MessagesMl.php
@@ -179,143 +179,148 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#തിരിചàµà´šàµà´µà´¿à´Ÿàµà´•', '#തിരിചàµà´šàµà´µà´¿à´Ÿàµ½', '#REDIRECT' ),
- 'notoc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚വേണàµà´Ÿ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__à´šà´¿à´¤àµà´°à´¸à´žàµà´šà´¯à´‚വേണàµà´Ÿ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚ഇടàµà´•__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚__', '__TOC__' ),
- 'noeditsection' => array( '0', '__സംശോധികàµà´•àµ‡à´£àµà´Ÿ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´µàµ‡à´£àµà´Ÿ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ഈമാസം', 'ഈമാസം2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ഈമാസം1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´•', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´‚à´—àµà´°à´¹à´‚', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´šàµà´°àµà´•àµà´•à´‚', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ഈദിവസം', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ഈദിവസം2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ഈദിവസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ഈവർഷം', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ഈസമയം', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ഈമണികàµà´•àµ‚ർ', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´‚', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´‚2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´‚1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´•', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´‚à´—àµà´°à´¹à´‚', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´šàµà´°àµà´•àµà´•à´‚', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¦à´¿à´µà´¸à´‚', 'LOCALDAY' ),
- 'localday2' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¦à´¿à´µà´¸à´‚2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¦à´¿à´µà´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´µàµ¼à´·à´‚', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¸à´®à´¯à´‚', 'LOCALTIME' ),
- 'localhour' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´£à´¿à´•àµà´•àµ‚ർ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'താളàµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ലേഖനങàµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'à´…à´‚à´—à´™àµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'സജീവോപയാകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ†à´£àµà´£à´‚', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'à´Žà´Ÿàµà´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´²àµà´•à´³àµà´Ÿàµ†à´£àµà´£à´‚', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'താളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'താളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'നാമമേഖല', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'നാമമേഖലസമഗàµà´°à´‚', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'സംവാദമേഖല', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'സംവാദമേഖലസമഗàµà´°à´‚', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'വിഷയമേഖല', 'ലേഖനമേഖല', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'വിഷയമേഖലസമഗàµà´°à´‚', 'ലേഖനമേഖലസമഗàµà´°à´‚', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'താളിനàµà´±àµ†à´®àµà´´àµà´µàµ»à´ªàµ‡à´°àµâ€Œ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'താളിനàµà´±àµ†à´®àµà´´àµà´µàµ»à´ªàµ‡à´°àµà´¸à´®à´—àµà´°à´‚', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'à´…à´¨àµà´¬à´¨àµà´§à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'à´…à´¨àµà´¬à´¨àµà´§à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµà´¸à´®à´—àµà´°à´‚', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'സംവാദതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'സംവാദതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ലേഖനതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ലേഖനതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'സനàµà´¦àµ‡à´¶à´‚:', 'MSG:' ),
- 'subst' => array( '0', 'ബദൽ:', 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'SUBST:' ),
- 'safesubst' => array( '0', 'സംരകàµà´·à´¿à´¤à´¬à´¦àµ½:', 'സംരകàµà´·à´¿à´¤à´¯àµàµ¾à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'മൂലരൂപം:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'ലഘàµà´šà´¿à´¤àµà´°à´‚', 'ലഘàµ', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'ലഘàµà´šà´¿à´¤àµà´°à´‚=$1', 'ലഘàµ=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'വലതàµà´¤àµâ€Œ', 'വലതàµâ€Œ', 'right' ),
- 'img_left' => array( '1', 'ഇടതàµà´¤àµâ€Œ', 'ഇടതàµâ€Œ', 'left' ),
- 'img_none' => array( '1', 'ശൂനàµà´¯à´‚', 'none' ),
- 'img_width' => array( '1', '$1ബിനàµà´¦àµ', '$1px' ),
- 'img_center' => array( '1', 'നടàµà´µà´¿àµ½', 'നടàµà´•àµà´•àµâ€Œ', 'center', 'centre' ),
- 'img_framed' => array( '1', 'à´šà´Ÿàµà´Ÿà´‚', 'à´šà´Ÿàµà´Ÿà´¤àµà´¤à´¿àµ½', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'à´šà´Ÿàµà´Ÿà´°à´¹à´¿à´¤à´‚', 'frameless' ),
- 'img_page' => array( '1', 'താൾ=$1', 'താൾ_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'നേരേകàµà´¤àµà´¤à´¨àµ†', 'നേരേകàµà´¤àµà´¤à´¨àµ†=$1', 'നേരേകàµà´¤àµà´¤à´¨àµ†_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'അതിർവര', 'border' ),
- 'img_baseline' => array( '1', 'താഴെയàµà´³àµà´³à´µà´°', 'baseline' ),
- 'img_sub' => array( '1', 'കീഴെയെഴàµà´¤àµà´¤àµ', 'sub' ),
- 'img_super' => array( '1', 'മേലേയെഴàµà´¤àµà´¤àµ', 'super', 'sup' ),
- 'img_top' => array( '1', 'മേലെ', 'top' ),
- 'img_text_top' => array( '1', 'à´Žà´´àµà´¤àµà´¤àµ-മേലെ', 'text-top' ),
- 'img_middle' => array( '1', 'മദàµà´§àµà´¯à´‚', 'middle' ),
- 'img_bottom' => array( '1', 'താഴെ', 'bottom' ),
- 'img_text_bottom' => array( '1', 'à´Žà´´àµà´¤àµà´¤àµ-താഴെ', 'text-bottom' ),
- 'img_link' => array( '1', 'à´•à´£àµà´£à´¿=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'പകരം=$1', 'alt=$1' ),
- 'sitename' => array( '1', 'സൈറàµà´±à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµ', 'SITENAME' ),
- 'ns' => array( '0', 'നാമേ:', 'NS:' ),
- 'localurl' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½à´‡:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'ലേഖനപഥം', 'ARTICLEPATH' ),
- 'server' => array( '0', 'സെർവർ', 'SERVER' ),
- 'servername' => array( '0', 'സെർവറിനàµà´±àµ†à´ªàµ‡à´°àµ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'à´¸àµà´•àµà´°à´¿à´ªàµà´±àµà´±àµà´ªà´¾à´¤àµà´¤àµ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'à´µàµà´¯à´¾à´•à´°à´£à´‚:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ലിംഗം:', 'GENDER:' ),
- 'currentweek' => array( '1', 'ആഴàµà´š', 'ആഴàµâ€Œà´š', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ദിവസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´…à´•àµà´•à´¤àµà´¤à´¿àµ½', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´†à´´àµà´š', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´†à´´àµâ€Œà´š', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ആഴàµà´šà´¯àµà´Ÿàµ†à´ªàµ‡à´°àµâ€Œà´…à´•àµà´•à´¤àµà´¤à´¿àµ½', 'ആഴàµâ€Œà´šà´¯àµà´Ÿàµ†à´ªàµ‡à´°àµâ€Œà´…à´•àµà´•à´¤àµà´¤à´¿àµ½', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'തിരàµà´¤àµà´¤àµ½à´…ടയാളം', 'REVISIONID' ),
- 'revisionday' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´µà´¸à´‚', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´¨à´‚', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´µà´¸à´‚2', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´¨à´‚2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´®à´¾à´¸à´‚', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´®à´¾à´¸à´‚1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´µàµ¼à´·à´‚', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¸à´®à´¯à´®àµà´¦àµà´°', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'അവസാനംതിരàµà´¤àµà´¤à´¿à´¯à´¯à´¾àµ¾', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ബഹàµà´µà´šà´¨à´‚:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'പൂർണàµà´£à´µà´¿à´²à´¾à´¸à´‚:', 'FULLURL:' ),
- 'raw' => array( '0', 'അസംസàµà´•àµƒà´¤à´‚:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ശീർഷകംപàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•', 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'à´µ', 'R' ),
- 'newsectionlink' => array( '1', '__à´ªàµà´¤à´¿à´¯à´µà´¿à´­à´¾à´—à´‚à´•à´£àµà´£à´¿__', '__à´ªàµà´¤à´¿à´¯à´–à´£àµà´¡à´¿à´•àµà´•à´£àµà´£à´¿__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__à´ªàµà´¤à´¿à´¯à´µà´¿à´­à´¾à´—à´‚à´•à´£àµà´£à´¿à´µàµ‡à´£àµà´Ÿ__', '__à´ªàµà´¤à´¿à´¯à´–à´£àµà´¡à´¿à´•àµà´•à´£àµà´£à´¿à´µàµ‡à´£àµà´Ÿ__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ഈപതിപàµà´ªàµ', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'സമയമàµà´¦àµà´°', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¸à´®à´¯à´®àµà´¦àµà´°', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'ദിശാസൂചിക', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#ഭാഷ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ഉളàµà´³à´Ÿà´•àµà´•à´­à´¾à´·', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'നാമമേഖലയിലàµà´³àµà´³à´¤à´¾à´³àµà´•àµ¾', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'കാരàµà´¯à´¨à´¿àµ¼à´µàµà´µà´¾à´¹à´•à´°àµà´Ÿàµ†à´Žà´£àµà´£à´‚', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ദശാംശഘടന', 'സംഖàµà´¯à´¾à´˜à´Ÿà´¨', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ഇടതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADLEFT' ),
- 'padright' => array( '0', 'വലതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADRIGHT' ),
- 'special' => array( '0', 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´‚', 'special' ),
- 'defaultsort' => array( '1', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½à´šà´¾à´µà´¿:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´µàµ¼à´—àµà´—à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'à´ªàµà´°à´®à´¾à´£à´ªà´¥à´‚:', 'FILEPATH:' ),
- 'tag' => array( '0', 'à´±àµà´±à´¾à´—àµ', 'tag' ),
- 'hiddencat' => array( '1', '‌‌__മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´‚വർഗàµà´—à´‚__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'വർഗàµà´—à´¤àµà´¤à´¿à´²àµà´³àµà´³à´¤à´¾à´³àµà´•àµ¾', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'താൾവലിപàµà´ªà´‚', 'PAGESIZE' ),
- 'index' => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
- 'noindex' => array( '1', '__സൂചികവേണàµà´Ÿ__', '__NOINDEX__' ),
- 'staticredirect' => array( '1', '_à´¸àµà´¥à´¿à´°à´¸àµà´¥à´¿à´¤à´¤à´¿à´°à´¿à´šàµà´šàµà´µà´¿à´Ÿàµ½_', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'സംരകàµà´·à´£à´¤à´²à´‚', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'പഥം', 'PATH' ),
- 'url_wiki' => array( '0', 'വികàµà´•à´¿', 'WIKI' ),
- 'url_query' => array( '0', 'à´•àµà´µà´±à´¿', 'QUERY' ),
+ 'redirect' => array( '0', '#തിരിചàµà´šàµà´µà´¿à´Ÿàµà´•', '#തിരിചàµà´šàµà´µà´¿à´Ÿàµ½', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚വേണàµà´Ÿ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__à´šà´¿à´¤àµà´°à´¸à´žàµà´šà´¯à´‚വേണàµà´Ÿ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚ഇടàµà´•__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__സംശോധികàµà´•àµ‡à´£àµà´Ÿ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´µàµ‡à´£àµà´Ÿ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ഈമാസം', 'ഈമാസം2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ഈമാസം1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´•', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´‚à´—àµà´°à´¹à´‚', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´šàµà´°àµà´•àµà´•à´‚', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ഈദിവസം', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ഈദിവസം2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ഈദിവസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ഈവർഷം', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ഈസമയം', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ഈമണികàµà´•àµ‚ർ', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´‚', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´‚2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´‚1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´•', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´‚à´—àµà´°à´¹à´‚', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´¾à´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´šàµà´°àµà´•àµà´•à´‚', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¦à´¿à´µà´¸à´‚', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¦à´¿à´µà´¸à´‚2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¦à´¿à´µà´¸à´¤àµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´µàµ¼à´·à´‚', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¸à´®à´¯à´‚', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´®à´£à´¿à´•àµà´•àµ‚ർ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'താളàµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ലേഖനങàµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'à´…à´‚à´—à´™àµà´™à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'സജീവോപയാകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†à´¯àµ†à´£àµà´£à´‚', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ†à´£àµà´£à´‚', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'à´Žà´Ÿàµà´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´²àµà´•à´³àµà´Ÿàµ†à´£àµà´£à´‚', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'താളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'താളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'നാമമേഖല', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'നാമമേഖലസമഗàµà´°à´‚', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'സംവാദമേഖല', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'സംവാദമേഖലസമഗàµà´°à´‚', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'വിഷയമേഖല', 'ലേഖനമേഖല', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'വിഷയമേഖലസമഗàµà´°à´‚', 'ലേഖനമേഖലസമഗàµà´°à´‚', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'താളിനàµà´±àµ†à´®àµà´´àµà´µàµ»à´ªàµ‡à´°àµâ€Œ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'താളിനàµà´±àµ†à´®àµà´´àµà´µàµ»à´ªàµ‡à´°àµà´¸à´®à´—àµà´°à´‚', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'à´…à´¨àµà´¬à´¨àµà´§à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'à´…à´¨àµà´¬à´¨àµà´§à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµà´¸à´®à´—àµà´°à´‚', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨à´¤à´¾à´³à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'സംവാദതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'സംവാദതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ലേഖനതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ലേഖനതാളിനàµà´±àµ†à´ªàµ‡à´°àµâ€Œà´¸à´®à´—àµà´°à´‚', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'സനàµà´¦àµ‡à´¶à´‚:', 'MSG:' ),
+ 'subst' => array( '0', 'ബദൽ:', 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'സംരകàµà´·à´¿à´¤à´¬à´¦àµ½:', 'സംരകàµà´·à´¿à´¤à´¯àµàµ¾à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'മൂലരൂപം:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'ലഘàµà´šà´¿à´¤àµà´°à´‚', 'ലഘàµ', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'ലഘàµà´šà´¿à´¤àµà´°à´‚=$1', 'ലഘàµ=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'വലതàµà´¤àµâ€Œ', 'വലതàµâ€Œ', 'right' ),
+ 'img_left' => array( '1', 'ഇടതàµà´¤àµâ€Œ', 'ഇടതàµâ€Œ', 'left' ),
+ 'img_none' => array( '1', 'ശൂനàµà´¯à´‚', 'none' ),
+ 'img_width' => array( '1', '$1ബിനàµà´¦àµ', '$1px' ),
+ 'img_center' => array( '1', 'നടàµà´µà´¿àµ½', 'നടàµà´•àµà´•àµâ€Œ', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'à´šà´Ÿàµà´Ÿà´‚', 'à´šà´Ÿàµà´Ÿà´¤àµà´¤à´¿àµ½', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'à´šà´Ÿàµà´Ÿà´°à´¹à´¿à´¤à´‚', 'frameless' ),
+ 'img_page' => array( '1', 'താൾ=$1', 'താൾ_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'നേരേകàµà´¤àµà´¤à´¨àµ†', 'നേരേകàµà´¤àµà´¤à´¨àµ†=$1', 'നേരേകàµà´¤àµà´¤à´¨àµ†_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'അതിർവര', 'border' ),
+ 'img_baseline' => array( '1', 'താഴെയàµà´³àµà´³à´µà´°', 'baseline' ),
+ 'img_sub' => array( '1', 'കീഴെയെഴàµà´¤àµà´¤àµ', 'sub' ),
+ 'img_super' => array( '1', 'മേലേയെഴàµà´¤àµà´¤àµ', 'super', 'sup' ),
+ 'img_top' => array( '1', 'മേലെ', 'top' ),
+ 'img_text_top' => array( '1', 'à´Žà´´àµà´¤àµà´¤àµ-മേലെ', 'text-top' ),
+ 'img_middle' => array( '1', 'മദàµà´§àµà´¯à´‚', 'middle' ),
+ 'img_bottom' => array( '1', 'താഴെ', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'à´Žà´´àµà´¤àµà´¤àµ-താഴെ', 'text-bottom' ),
+ 'img_link' => array( '1', 'à´•à´£àµà´£à´¿=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'പകരം=$1', 'alt=$1' ),
+ 'sitename' => array( '1', 'സൈറàµà´±à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµ', 'SITENAME' ),
+ 'ns' => array( '0', 'നാമേ:', 'NS:' ),
+ 'localurl' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½à´‡:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ലേഖനപഥം', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'സെർവർ', 'SERVER' ),
+ 'servername' => array( '0', 'സെർവറിനàµà´±àµ†à´ªàµ‡à´°àµ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'à´¸àµà´•àµà´°à´¿à´ªàµà´±àµà´±àµà´ªà´¥à´‚', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'à´¸àµà´±àµà´±àµˆàµ½à´ªà´¥à´‚', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'à´µàµà´¯à´¾à´•à´°à´£à´‚:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ലിംഗം:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´®à´¾à´±àµà´±àµ‡à´£àµà´Ÿ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚മാറàµà´±àµ‡à´£àµà´Ÿ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ആഴàµà´š', 'ആഴàµâ€Œà´š', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ദിവസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œà´…à´•àµà´•à´¤àµà´¤à´¿àµ½', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´†à´´àµà´š', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´†à´´àµâ€Œà´š', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ആഴàµà´šà´¯àµà´Ÿàµ†à´ªàµ‡à´°àµâ€Œà´…à´•àµà´•à´¤àµà´¤à´¿àµ½', 'ആഴàµâ€Œà´šà´¯àµà´Ÿàµ†à´ªàµ‡à´°àµâ€Œà´…à´•àµà´•à´¤àµà´¤à´¿àµ½', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'തിരàµà´¤àµà´¤àµ½à´…ടയാളം', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´µà´¸à´‚', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´¨à´‚', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´µà´¸à´‚2', 'തിരàµà´¤àµà´¤à´¿à´¯à´¦à´¿à´¨à´‚2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´®à´¾à´¸à´‚', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´®à´¾à´¸à´‚1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´µàµ¼à´·à´‚', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'തിരàµà´¤àµà´¤à´¿à´¯à´¸à´®à´¯à´®àµà´¦àµà´°', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'അവസാനംതിരàµà´¤àµà´¤à´¿à´¯à´¯à´¾àµ¾', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ബഹàµà´µà´šà´¨à´‚:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'പൂർണàµà´£à´µà´¿à´²à´¾à´¸à´‚:', 'FULLURL:' ),
+ 'raw' => array( '0', 'അസംസàµà´•àµƒà´¤à´‚:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ശീർഷകംപàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•', 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'à´µ', 'R' ),
+ 'newsectionlink' => array( '1', '__à´ªàµà´¤à´¿à´¯à´µà´¿à´­à´¾à´—à´‚à´•à´£àµà´£à´¿__', '__à´ªàµà´¤à´¿à´¯à´–à´£àµà´¡à´¿à´•àµà´•à´£àµà´£à´¿__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__à´ªàµà´¤à´¿à´¯à´µà´¿à´­à´¾à´—à´‚à´•à´£àµà´£à´¿à´µàµ‡à´£àµà´Ÿ__', '__à´ªàµà´¤à´¿à´¯à´–à´£àµà´¡à´¿à´•àµà´•à´£àµà´£à´¿à´µàµ‡à´£àµà´Ÿ__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ഈപതിപàµà´ªàµ', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'സമയമàµà´¦àµà´°', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´¸à´®à´¯à´®àµà´¦àµà´°', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ദിശാസൂചിക', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#ഭാഷ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ഉളàµà´³à´Ÿà´•àµà´•à´­à´¾à´·', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'നാമമേഖലയിലàµà´³àµà´³à´¤à´¾à´³àµà´•àµ¾', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'കാരàµà´¯à´¨à´¿àµ¼à´µàµà´µà´¾à´¹à´•à´°àµà´Ÿàµ†à´Žà´£àµà´£à´‚', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ദശാംശഘടന', 'സംഖàµà´¯à´¾à´˜à´Ÿà´¨', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ഇടതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADLEFT' ),
+ 'padright' => array( '0', 'വലതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADRIGHT' ),
+ 'special' => array( '0', 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´‚', 'special' ),
+ 'defaultsort' => array( '1', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½à´šà´¾à´µà´¿:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´µàµ¼à´—àµà´—à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'à´ªàµà´°à´®à´¾à´£à´ªà´¥à´‚:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'à´±àµà´±à´¾à´—àµ', 'tag' ),
+ 'hiddencat' => array( '1', '‌‌__മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´‚വർഗàµà´—à´‚__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'വർഗàµà´—à´¤àµà´¤à´¿à´²àµà´³àµà´³à´¤à´¾à´³àµà´•àµ¾', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'താൾവലിപàµà´ªà´‚', 'PAGESIZE' ),
+ 'index' => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
+ 'noindex' => array( '1', '__സൂചികവേണàµà´Ÿ__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '_à´¸àµà´¥à´¿à´°à´¸àµà´¥à´¿à´¤à´¤à´¿à´°à´¿à´šàµà´šàµà´µà´¿à´Ÿàµ½_', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'സംരകàµà´·à´£à´¤à´²à´‚', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'പഥം', 'PATH' ),
+ 'url_wiki' => array( '0', 'വികàµà´•à´¿', 'WIKI' ),
+ 'url_query' => array( '0', 'à´•àµà´µà´±à´¿', 'QUERY' ),
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'à´•à´£àµà´£à´¿à´•àµ¾à´•àµà´•àµ അടിവരയിടàµà´•:',
@@ -674,20 +679,22 @@ $1',
'badarticleerror' => 'താങàµà´•àµ¾ ചെയàµà´¯à´¾à´¨àµà´¦àµà´¦àµ‡à´¶à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ à´ˆ താളിൽ സാദàµà´§àµà´¯à´®à´²àµà´²',
'cannotdelete' => '"$1" à´Žà´¨àµà´¨ താൾ അഥവാ à´ªàµà´°à´®à´¾à´£à´‚ നീകàµà´•à´‚ ചെയàµà´¯à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².
അതൠമികàµà´•à´µà´¾à´±àµà´‚ മറàµà´±à´¾à´°àµ†à´™àµà´•à´¿à´²àµà´‚ നീകàµà´•à´‚ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿà´¾à´µà´¾à´‚.',
+'cannotdelete-title' => '"$1" à´Žà´¨àµà´¨ താൾ മായàµà´•àµà´•à´¾àµ» കഴിയിലàµà´²',
'badtitle' => 'അസാധàµà´µà´¾à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ',
'badtitletext' => 'താങàµà´•àµ¾ ആവശàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´³àµà´³ ഒരൠതാൾ നിലവിലിലàµà´². ഇതൠതെറàµà´±à´¾à´¯à´¿ à´…à´¨àµà´¤àµ¼à´­à´¾à´·à´¾/à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ à´•à´£àµà´£à´¿ ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤àµ മൂലമോ, തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ ഉപയോഗികàµà´•à´°àµà´¤à´¾à´¤àµà´¤ à´…à´•àµà´·à´°à´°àµ‚പങàµà´™àµ¾ ഉപയോഗിചàµà´šà´¤àµ മൂലമോ സംഭവിചàµà´šà´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚.',
-'perfcached' => 'താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വിവരം ശേഖരികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ ആയതിനാൽ ചിലപàµà´ªàµ‹àµ¾ നവീനമായിരികàµà´•à´¿à´²àµà´².',
-'perfcachedts' => 'താഴെയàµà´³àµà´³ വിവരങàµà´™àµ¾ ശേഖരിചàµà´šàµ വെചàµà´šà´µà´¯à´¿àµ½ പെടàµà´¨àµà´¨àµ, അവസാനം à´ªàµà´¤àµà´•àµà´•à´¿à´¯à´¤àµ $1-നൠആണàµâ€Œ.',
+'perfcached' => 'താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വിവരം ശേഖരിചàµà´šàµ വെചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ ചിലപàµà´ªàµ‹àµ¾ à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´®àµ†à´¨àµà´¨à´¿à´²àµà´². പരമാവധി {{PLURAL:$1|ഒരൠഫലം|$1 ഫലങàµà´™àµ¾}} ശേഖരിചàµà´šàµà´µàµ†à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯à´¿àµ½ ഉണàµà´Ÿàµ.',
+'perfcachedts' => 'താഴെയàµà´³àµà´³ വിവരങàµà´™àµ¾ ശേഖരിചàµà´šàµ വെചàµà´šà´µà´¯à´¿àµ½ പെടàµà´¨àµà´¨àµ, അവസാനം à´ªàµà´¤àµà´•àµà´•à´¿à´¯à´¤àµ $1-നൠആണàµâ€Œ. പരമാവധി {{PLURAL:$4|ഒരൠഫലം|$4 ഫലങàµà´™àµ¾}} ശേഖരിചàµà´šàµà´µàµ†à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯à´¿àµ½ ഉണàµà´Ÿàµ. സാധാരണ ഗതിയിൽ $4 ആയിരമായിരികàµà´•àµà´‚.',
'querypage-no-updates' => 'à´ˆ താളിനàµà´±àµ† à´ªàµà´¤àµà´•àµà´•àµ½ തൽകàµà´•à´¾à´²à´‚ നടകàµà´•àµà´¨àµà´¨à´¿à´²àµà´². ഇവിടàµà´³àµà´³ വിവരങàµà´™àµ¾ à´à´±àµà´±à´µàµà´‚ à´ªàµà´¤à´¿à´¯à´¤à´¾à´µà´£à´®àµ†à´¨àµà´¨à´¿à´²àµà´².',
'wrong_wfQuery_params' => 'wfQuery()à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´•àµà´•àµ തെറàµà´±à´¾à´¯ പരാമീറàµà´±à´±àµà´•àµ¾<br />
നിർദàµà´¦àµ‡à´¶à´‚: $1<br />
à´…à´¨àµà´µàµ‡à´·à´£à´‚: $2',
'viewsource' => 'മൂലരൂപം കാണàµà´•',
-'viewsourcefor' => 'താൾ $1',
+'viewsource-title' => '$1 à´Žà´¨àµà´¨ താളിനàµà´±àµ† മൂലരൂപം കാണàµà´•',
'actionthrottled' => 'à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ നടതàµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'actionthrottledtext' => 'പാഴെഴàµà´¤àµà´¤à´¿à´¨àµ†à´¤à´¿à´°àµ†à´¯àµà´³àµà´³ à´®àµàµ»à´•à´°àµà´¤àµ½ à´Žà´¨àµà´¨ നിലയിൽ ഒരേ à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ à´•àµà´±à´žàµà´ž സമയതàµà´¤à´¿à´¨àµà´³àµà´³à´¿àµ½ നിരവധി തവണ ആവർതàµà´¤à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ പരിമിതപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. താങàµà´•àµ¾ à´† പരിധി ലംഘിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´•àµà´±à´šàµà´šàµ മിനിറàµà´±àµà´•àµ¾à´•àµà´•àµ ശേഷം വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
'protectedpagetext' => 'à´ˆ താൾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» സാധികàµà´•à´¾à´¤àµà´¤ വിധം സംരകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤à´¾à´£àµ.',
'viewsourcetext' => 'താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താളിനàµà´±àµ† മൂലരൂപം കാണാനàµà´‚ പകർതàµà´¤à´¾à´¨àµà´‚ സാധികàµà´•àµà´‚:',
+'viewyourtext' => "താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താളിലെ '''താങàµà´•à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ†''' മൂലരൂപം കാണാനàµà´‚ പകർതàµà´¤à´¾à´¨àµà´‚ സാധികàµà´•àµà´‚:",
'protectedinterface' => 'à´ˆ താൾ സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯à´±à´¿à´¨àµà´±àµ† സമàµà´ªàµ¼à´•àµà´•à´®àµà´– à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ നൽകàµà´¨àµà´¨àµ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ à´¦àµà´°àµà´ªà´¯àµ‹à´—à´‚ തടയാൻ ബനàµà´§à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'editinginterface' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:''' സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯à´±à´¿àµ½ സമàµà´ªàµ¼à´•àµà´•à´®àµà´–à´‚ നിലനിർതàµà´¤àµà´¨àµà´¨ താളാണൠതാങàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» പോകàµà´¨àµà´¨à´¤àµ. à´ˆ താളിൽ താങàµà´•àµ¾ വരàµà´¤àµà´¤àµà´¨àµà´¨ മാറàµà´±à´™àµà´™àµ¾ ഉപയോകàµà´¤à´¾à´µàµ വികàµà´•à´¿ കാണàµà´¨àµà´¨ വിധതàµà´¤àµ† മാറàµà´±à´¿à´®à´±à´¿à´šàµà´šàµ‡à´•àµà´•à´¾à´‚. മീഡിയവികàµà´•à´¿ സനàµà´¦àµ‡à´¶à´™àµà´™à´³àµà´Ÿàµ† പരിഭാഷകൾകàµà´•àµ മീഡിയവികàµà´•à´¿ സനàµà´¦àµ‡à´¶à´™àµà´™à´³àµà´Ÿàµ† à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´µà´¤àµà´•à´°à´£ സംരംഭം ആയ [//translatewiki.net/wiki/Main_Page?setlang=ml ബീറàµà´±à´¾à´µà´¿à´•àµà´•à´¿] ഉപയോഗികàµà´•àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.",
'sqlhidden' => '(SQL query മറചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ)',
@@ -781,6 +788,7 @@ $2',
'emailconfirmlink' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'invalidemailaddress' => 'à´‡-മെയിൽ വിലാസം സാധàµà´µà´¾à´¯ രൂപതàµà´¤à´¿àµ½ à´…à´²àµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ à´¸àµà´µàµ€à´•à´¾à´°àµà´¯à´®à´²àµà´².
ദയവായി സാധàµà´µà´¾à´¯ രൂപതàµà´¤à´¿à´²àµà´³àµà´³ ഇമെയിൽ വിലാസം ചേർകàµà´•àµà´•à´¯àµ‹ ഇമെയിൽ വിലാസതàµà´¤à´¿à´¨àµà´³àµà´³ ഇട ഒഴിവാകàµà´•à´¿à´¯à´¿à´Ÿàµà´•à´¯àµ‹ ചെയàµà´¯àµà´•.',
+'cannotchangeemail' => 'à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´±àµ† ഇമെയിൽ വിലാസങàµà´™àµ¾ à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ മാറàµà´±à´¾à´¨à´¾à´µà´¿à´²àµà´².',
'accountcreated' => 'à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'accountcreatedtext' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨à´¾à´¯à´¿ à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'createaccount-title' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµ½',
@@ -796,6 +804,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'പി.à´Žà´šàµà´šàµ.പി.à´¯àµà´Ÿàµ† main() à´«à´™àµà´·à´¨à´¿àµ½ അപരിചിതമായ പിഴവàµ',
+'user-mail-no-addy' => 'à´‡-മെയിൽ വിലാസം ഇലàµà´²à´¾à´¤àµ†à´¯à´¾à´£àµ à´‡-മെയിൽ അയയàµà´•àµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´šà´¤àµ',
# Change password dialog
'resetpass' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´•',
@@ -815,32 +824,47 @@ $2',
'resetpass-temp-password' => 'താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
# Special:PasswordReset
-'passwordreset' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
-'passwordreset-text' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™àµ¾ സംബനàµà´§à´¿à´šàµà´š ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ ലഭികàµà´•à´¾à´¨à´¾à´¯à´¿ à´ˆ ഫോം പൂരിപàµà´ªà´¿à´•àµà´•àµà´•.',
-'passwordreset-legend' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
-'passwordreset-disabled' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´²àµà´•àµ¾ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ.',
-'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരൠവിവരശകലം നൽകàµà´•}}',
-'passwordreset-username' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
-'passwordreset-domain' => 'ഡൊമൈൻ:',
-'passwordreset-email' => 'ഇ-മെയിൽ വിലാസം:',
-'passwordreset-emailtitle' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™àµ¾',
-'passwordreset-emailtext-ip' => 'ആരോ ഒരാൾ (മികàµà´•à´µà´¾à´±àµà´‚ താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚, $1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½ നിനàµà´¨àµà´‚) {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† ($4) à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™à´³àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ˆ ഇമെയിൽ വിലാസവàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$3|à´…à´‚à´—à´¤àµà´µà´‚|à´…à´‚à´—à´¤àµà´µà´™àµà´™àµ¾}} താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
+'passwordreset' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'passwordreset-text' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™àµ¾ സംബനàµà´§à´¿à´šàµà´š ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ ലഭികàµà´•à´¾à´¨à´¾à´¯à´¿ à´ˆ ഫോം പൂരിപàµà´ªà´¿à´•àµà´•àµà´•.',
+'passwordreset-legend' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'passwordreset-disabled' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´²àµà´•àµ¾ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ.',
+'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരൠവിവരശകലം നൽകàµà´•}}',
+'passwordreset-username' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
+'passwordreset-domain' => 'ഡൊമൈൻ:',
+'passwordreset-capture' => 'ഫലമായàµà´£àµà´Ÿà´¾à´•àµà´¨àµà´¨ ഇമെയിൽ കാണണോ?',
+'passwordreset-capture-help' => 'à´ˆ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ശരി ചേർതàµà´¤à´¾àµ½, ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ അയയàµà´•àµà´•àµà´¨àµà´¨à´¤àµ‹à´ŸàµŠà´ªàµà´ªà´‚ ഇമെയിൽ (താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•à´¿à´¨àµŠà´ªàµà´ªà´‚) à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'passwordreset-email' => 'ഇ-മെയിൽ വിലാസം:',
+'passwordreset-emailtitle' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™àµ¾',
+'passwordreset-emailtext-ip' => 'ആരോ ഒരാൾ (മികàµà´•à´µà´¾à´±àµà´‚ താങàµà´•à´³à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚, $1 à´Žà´¨àµà´¨ à´.പി. വിലാസതàµà´¤à´¿àµ½ നിനàµà´¨àµà´‚) {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† ($4) à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™à´³àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ˆ ഇമെയിൽ വിലാസവàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$3|à´…à´‚à´—à´¤àµà´µà´‚|à´…à´‚à´—à´¤àµà´µà´™àµà´™àµ¾}} താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
$2
à´ˆ {{PLURAL:$3|താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµ|താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾}} {{PLURAL:$5|ഒരൠദിവസം|$5 ദിവസങàµà´™àµ¾}} കൊണàµà´Ÿàµ കാലഹരണപàµà´ªàµ†à´Ÿàµà´Ÿàµ പോകàµà´¨àµà´¨à´µà´¯à´¾à´£àµ.
താങàµà´•àµ¾ ഇപàµà´ªàµ‹àµ¾ തനàµà´¨àµ† à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šàµ രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´¨àµà´¨à´¤à´¾à´£àµ ഉചിതം. à´ˆ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨ മറàµà´±à´¾à´°àµ‹ ആണൠനടതàµà´¤à´¿à´¯à´¤àµ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½, യഥാർതàµà´¥ രഹസàµà´¯à´µà´¾à´•àµà´•àµ താങàµà´•àµ¾ ഓർമàµà´®à´¿à´•àµà´•àµà´•à´¯àµà´‚ അതൠമാറàµà´±à´¾àµ» ആഗàµà´°à´¹à´¿à´•àµà´•à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•à´¯àµà´‚ ആണെങàµà´•à´¿àµ½, à´ˆ സനàµà´¦àµ‡à´¶à´‚ അവഗണിചàµà´šàµ താങàµà´•à´³àµà´Ÿàµ† പഴയ രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´¤àµà´Ÿàµ¼à´¨àµà´¨àµà´‚ ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
-'passwordreset-emailtext-user' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† ഉപയോകàµà´¤à´¾à´µà´¾à´¯ $1 {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† ($4) à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™à´³àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ˆ à´‡-മെയിൽ വിലാസവàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$3|à´…à´‚à´—à´¤àµà´µà´‚|à´…à´‚à´—à´¤àµà´µà´™àµà´™àµ¾}} താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
+'passwordreset-emailtext-user' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† ഉപയോകàµà´¤à´¾à´µà´¾à´¯ $1 {{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† ($4) à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™à´³àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ ഓർമàµà´®à´•àµà´•àµà´±à´¿à´ªàµà´ªàµ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ˆ à´‡-മെയിൽ വിലാസവàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$3|à´…à´‚à´—à´¤àµà´µà´‚|à´…à´‚à´—à´¤àµà´µà´™àµà´™àµ¾}} താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
$2
à´ˆ {{PLURAL:$3|താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµ|താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾}} {{PLURAL:$5|ഒരൠദിവസം|$5 ദിവസങàµà´™àµ¾}} കൊണàµà´Ÿàµ കാലഹരണപàµà´ªàµ†à´Ÿàµà´Ÿàµ പോകàµà´¨àµà´¨à´µà´¯à´¾à´£àµ.
താങàµà´•àµ¾ ഇപàµà´ªàµ‹àµ¾ തനàµà´¨àµ† à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šàµ രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´¨àµà´¨à´¤à´¾à´£àµ ഉചിതം. à´ˆ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨ മറàµà´±à´¾à´°àµ‹ ആണൠനടതàµà´¤à´¿à´¯à´¤àµ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½, യഥാർതàµà´¥ രഹസàµà´¯à´µà´¾à´•àµà´•àµ താങàµà´•àµ¾ ഓർമàµà´®à´¿à´•àµà´•àµà´•à´¯àµà´‚ അതൠമാറàµà´±à´¾àµ» ആഗàµà´°à´¹à´¿à´•àµà´•à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•à´¯àµà´‚ ആണെങàµà´•à´¿àµ½, à´ˆ സനàµà´¦àµ‡à´¶à´‚ അവഗണിചàµà´šàµ താങàµà´•à´³àµà´Ÿàµ† പഴയ രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´¤àµà´Ÿàµ¼à´¨àµà´¨àµà´‚ ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
-'passwordreset-emailelement' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚: $1
+'passwordreset-emailelement' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚: $1
താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµ: $2',
-'passwordreset-emailsent' => 'ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
+'passwordreset-emailsent' => 'ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
+'passwordreset-emailsent-capture' => 'താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨, ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
+'passwordreset-emailerror-capture' => 'താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨, ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ സൃഷàµà´Ÿà´¿à´šàµà´šàµ, പകàµà´·àµ‡ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ അയയàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ഇമെയിൽ വിലാസതàµà´¤à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
+'changeemail-header' => 'à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´±àµ† ഇമെയിൽ വിലാസതàµà´¤à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
+'changeemail-text' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസതàµà´¤à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤à´¾àµ» à´ˆ ഫോം പൂരിപàµà´ªà´¿à´šàµà´šàµ നൽകàµà´•. മാറàµà´±à´‚ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿ താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ നൽകേണàµà´Ÿà´¤à´¾à´£àµ.',
+'changeemail-no-info' => 'à´ˆ താൾ നേരിടàµà´Ÿàµ കാണàµà´¨àµà´¨à´¤à´¿à´¨àµ താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+'changeemail-oldemail' => 'ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† ഇമെയിൽ വിലാസം:',
+'changeemail-newemail' => 'à´ªàµà´¤à´¿à´¯ ഇമെയിൽ വിലാസം:',
+'changeemail-none' => '(à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²)',
+'changeemail-submit' => 'ഇമെയിലിൽ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
+'changeemail-cancel' => 'റദàµà´¦à´¾à´•àµà´•àµà´•',
# Edit page toolbar
'bold_sample' => 'à´•à´Ÿàµà´ªàµà´ªà´¿à´šàµà´š à´Žà´´àµà´¤àµà´¤àµ',
@@ -903,9 +927,6 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
താങàµà´•à´³àµà´Ÿàµ† നിലവിലàµà´³àµà´³ à´.പി. വിലാസം $3 ആണàµ, താങàµà´•à´³àµà´Ÿàµ† തടയലിനàµà´±àµ† à´.à´¡à´¿. #$5 ആകàµà´¨àµà´¨àµ.
ദയവായി à´®àµà´•à´³à´¿àµ½ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വിവരങàµà´™à´³àµ†à´²àµà´²à´¾à´‚ താങàµà´•àµ¾ നടതàµà´¤àµà´¨àµà´¨ à´…à´¨àµà´µàµ‡à´·à´£à´™àµà´™à´³à´¿àµ½ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´µà´¾àµ» à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•.',
'blockednoreason' => 'കാരണമൊനàµà´¨àµà´‚ സൂചിപàµà´ªà´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
-'blockedoriginalsource' => "'''$1''' à´Žà´¨àµà´¨à´¤à´¿à´¨àµà´±àµ† മൂലരൂപം താഴെകàµà´•à´¾à´£à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:",
-'blockededitsource' => "'''$1''' à´Žà´¨àµà´¨ താളിൽ '''താങàµà´•àµ¾ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ†''' പൂർണàµà´£à´°àµ‚പം താഴെകàµà´•à´¾à´£à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:",
-'whitelistedittitle' => 'തിരàµà´¤àµà´¤à´¾àµ» ലോഗിൻ ചെയàµà´¯à´£à´‚',
'whitelistedittext' => 'താളàµà´•àµ¾ തിരàµà´¤àµà´¤à´¾àµ» താങàµà´•àµ¾ $1 ചെയàµà´¯àµ‡à´£àµà´Ÿà´¤à´¾à´£àµ',
'confirmedittext' => 'താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ താങàµà´•àµ¾ താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµ‡à´£àµà´Ÿà´¤à´¾à´£àµâ€Œ. ഇമെയിൽ വിലാസം à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿ സാധàµà´¤ പരിശോധികàµà´•à´¾àµ» [[Special:Preferences|à´Žà´¨àµà´±àµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾]] à´Žà´¨àµà´¨ സം‌വിധാനം ഉപയോഗികàµà´•àµà´•.',
'nosuchsectiontitle' => 'ഉപവിഭാഗം à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´²',
@@ -990,7 +1011,7 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
'copyrightwarning2' => "{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ താങàµà´•àµ¾ à´Žà´´àµà´¤à´¿ ചേർകàµà´•àµà´¨àµà´¨à´¤àµ†à´²àµà´²à´¾à´‚ മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•à´¯àµ‹, മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•à´¯àµ‹, ഒഴിവാകàµà´•àµà´•à´¯àµ‹ ചെയàµà´¤àµ‡à´•àµà´•à´¾à´‚. താങàµà´•àµ¾ à´Žà´´àµà´¤à´¿ ചേർകàµà´•àµà´¨àµà´¨à´¤àµ മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ തിരàµà´¤àµà´¤àµà´¨àµà´¨à´¤à´¿à´²àµ‹ ഒഴിവാകàµà´•àµà´¨àµà´¨à´¤à´¿à´²àµ‹ താങàµà´•àµ¾à´•àµà´•àµ എതിർപàµà´ªàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ ദയവായി ലേഖനമെഴàµà´¤à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•.
ഇതൠതാങàµà´•àµ¾à´¤àµà´¤à´¨àµà´¨àµ† à´Žà´´àµà´¤à´¿à´¯à´¤à´¾à´£àµ†à´¨àµà´¨àµà´‚, അതലàµà´²àµ†à´™àµà´•à´¿àµ½ പകർപàµà´ªà´µà´•à´¾à´¶ നിയമങàµà´™à´³àµà´Ÿàµ† പരിധിയിലിലàµà´²à´¾à´¤àµà´¤ ഉറവിടങàµà´™à´³à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´‚ പകർതàµà´¤à´¿à´¯à´¤à´¾à´£àµ†à´¨àµà´¨àµà´‚ ഉറപàµà´ªà´¾à´•àµà´•àµà´• (à´•àµà´Ÿàµà´¤àµ½ വിവരതàµà´¤à´¿à´¨àµ $1 കാണàµà´•).
'''പകർപàµà´ªà´µà´•à´¾à´¶ സംരകàµà´·à´£à´®àµà´³àµà´³ സൃഷàµà´Ÿà´¿à´•àµ¾ ഒരൠകാരണവശാലàµà´‚ ഇവിടെ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´•àµà´•à´°àµà´¤àµ!'''",
-'longpageerror' => "'''പിഴവàµ: താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´Žà´´àµà´¤àµà´¤àµà´•àµ¾à´•àµà´•àµ $1 കിലോബൈറàµà´±àµà´¸àµ വലിപàµà´ªà´®àµà´£àµà´Ÿàµ. പരമാവധി à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´¾à´¯ വലിപàµà´ªà´‚ $2 കിലോബൈറàµà´±àµà´¸àµ ആണàµâ€Œ. അതിനാലിതൠസേവൠചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².'''",
+'longpageerror' => "'''പിഴവàµ: താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´Žà´´àµà´¤àµà´¤àµà´•àµ¾à´•àµà´•àµ {{PLURAL:$1|ഒരൠകിലോബൈറàµà´±àµ|$1 കിലോബൈറàµà´±àµà´¸àµ}} വലിപàµà´ªà´®àµà´£àµà´Ÿàµ. പരമാവധി à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´¾à´¯ വലിപàµà´ªà´‚ {{PLURAL:$2|ഒരൠകിലോബൈറàµà´±àµ|$2 കിലോബൈറàµà´±àµà´¸àµ}} ആണàµâ€Œ. അതിനാലിതൠസേവൠചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².'''",
'readonlywarning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ പരിപാലനതàµà´¤à´¿à´¨àµ വേണàµà´Ÿà´¿ ബനàµà´§à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ താങàµà´•à´³à´¿à´ªàµà´ªàµ‹àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ സേവൠചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².''' താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ ഒരൠടെകàµà´¸àµà´±àµà´±àµ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´²àµ‡à´•àµà´•àµ പകർതàµà´¤à´¿ (à´•à´Ÿàµà´Ÿàµ & പേസàµà´±àµà´±àµ) പിനàµà´¨àµ€à´Ÿàµà´³àµà´³ ഉപയോഗതàµà´¤à´¿à´¨à´¾à´¯à´¿ സേവൠചെയàµà´¯àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ. ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ ബനàµà´§à´¿à´šàµà´š à´…à´¡àµà´®à´¿à´¨à´¿à´¸àµà´Ÿàµà´°àµ‡à´±àµà´±àµ¼ നൽകിയ വിശദീകരണം: $1",
'protectedpagewarning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: à´ˆ താൾ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´• പദവിയàµà´³àµà´³à´µàµ¼à´•àµà´•àµ മാതàµà´°à´‚ തിരàµà´¤àµà´¤à´¾àµ» സാധികàµà´•à´¾à´µàµà´¨àµà´¨ തരതàµà´¤à´¿àµ½ സം‌രകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.''' അവലംബമായി രേഖകളിൽ ലഭàµà´¯à´®à´¾à´¯ à´à´±àµà´±à´µàµà´‚ à´ªàµà´¤à´¿à´¯ വിവരം താഴെ നൽകിയിരികàµà´•àµà´¨àµà´¨àµ:",
'semiprotectedpagewarning' => "'''à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•:'''à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´µàµ¼à´•àµà´•àµà´®à´¾à´¤àµà´°à´‚ തിരàµà´¤àµà´¤à´¾àµ» സാധികàµà´•àµà´¨àµà´¨ വിധതàµà´¤à´¿àµ½ à´ˆ താൾ സംരകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. അവലംബമായി രേഖകളിലെ à´à´±àµà´±à´µàµà´‚ à´ªàµà´¤à´¿à´¯ വിവരം താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:",
@@ -1154,8 +1175,6 @@ $3 അതിനൠകാണിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ കാര
'revdelete-unsuppress' => 'à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´š പതിപàµà´ªàµà´•à´³à´¿à´²àµà´³àµà´³ നിയനàµà´¤àµà´°à´£à´™àµà´™àµ¾ ഒഴിവാകàµà´•àµà´•',
'revdelete-log' => 'കാരണം:',
'revdelete-submit' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ {{PLURAL:$1|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµ|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾à´•àµà´•àµ}} ബാധകമാകàµà´•àµà´•',
-'revdelete-logentry' => '"[[$1]]" à´Žà´¨àµà´¨ താളിനàµà´±àµ† പതിപàµà´ªàµà´•àµ¾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµ‡à´£àµà´Ÿ വിധം തിരàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logdelete-logentry' => '[[$1]] സാഹചരàµà´¯à´¤àµà´¤à´¿à´¨àµà´±àµ† à´ªàµà´°à´¦àµ¼à´¶à´¨à´ªà´°à´¤ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'revdelete-success' => "'''നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത വിജയകരമായി à´ªàµà´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.'''",
'revdelete-failure' => "'''നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ† ദർശനീയത à´ªàµà´¤àµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²:'''
$1",
@@ -1167,15 +1186,6 @@ $1",
'revdel-restore-visible' => 'ദൃശàµà´¯à´®à´¾à´¯ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾',
'pagehist' => 'താളിനàµà´±àµ† നാൾവഴി',
'deletedhist' => 'ഒഴിവാകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ നാൾവഴി',
-'revdelete-content' => 'ഉളàµà´³à´Ÿà´•àµà´•à´‚',
-'revdelete-summary' => 'തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† à´šàµà´°àµà´•àµà´•à´‚',
-'revdelete-uname' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚',
-'revdelete-restricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'revdelete-unrestricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ നീകàµà´•à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'revdelete-hid' => '$1 മറചàµà´šàµ',
-'revdelete-unhid' => '$1 à´ªàµà´°à´¤àµà´¯à´•àµà´·à´®à´¾à´•àµà´•à´¿',
-'revdelete-log-message' => '{{PLURAL:$2|ഒരൠനാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$2 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} $1',
-'logdelete-log-message' => '{{PLURAL:$2|സാഹചരàµà´¯à´™àµà´™à´³à´¿àµ½|$2 സാഹചരàµà´¯à´™àµà´™à´³à´¿àµ½}} $1',
'revdelete-hide-current' => '$2, $1 തീയതിയിലെ ഇനം മറയàµà´•àµà´•àµà´®àµà´ªàµ‹àµ¾ പിഴവൠസംഭവിചàµà´šàµ: ഇതൠഇപàµà´ªàµ‹à´´àµà´³àµà´³ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¾à´£àµ.
ഇതൠമറയàµà´•àµà´•à´¾àµ» കഴിയിലàµà´².',
'revdelete-show-no-access' => '$2, $1 തീയതി à´•àµà´±à´¿à´šàµà´š ഇനം à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµ: ഇതൠ"പരിമിതപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¤àµ†à´¨àµà´¨àµ" അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
@@ -1331,12 +1341,14 @@ $1",
'prefs-rc' => 'സമീപകാല മാറàµà´±à´™àµà´™àµ¾',
'prefs-watchlist' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µ',
'prefs-watchlist-days' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµ‡à´£àµà´Ÿ പരമാവധി ദിവസങàµà´™àµ¾:',
-'prefs-watchlist-days-max' => 'പരമാവധി 7 ദിവസം',
+'prefs-watchlist-days-max' => 'പരമാവധി {{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസങàµà´™àµ¾}}',
'prefs-watchlist-edits' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† വികസിത രൂപതàµà´¤à´¿àµ½ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµ‡à´£àµà´Ÿ പരമാവധി മാറàµà´±à´™àµà´™àµ¾:',
'prefs-watchlist-edits-max' => 'പരമാവധി 1000 തിരàµà´¤àµà´¤à´²àµà´•àµ¾',
'prefs-watchlist-token' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯àµà´•àµà´•àµà´³àµà´³ അടയാളപദം:',
'prefs-misc' => 'പലവക',
'prefs-resetpass' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´•',
+'prefs-changeemail' => 'ഇമെയിലിൽ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
+'prefs-setemail' => 'ഇമെയിൽ വിലാസം സജàµà´œà´®à´¾à´•àµà´•àµà´•',
'prefs-email' => 'ഇമെയിൽ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾',
'prefs-rendering' => 'ദൃശàµà´¯à´°àµ‚പം',
'saveprefs' => 'സേവൠചെയàµà´¯àµà´•',
@@ -1396,6 +1408,7 @@ $1",
'yourrealname' => 'യഥാർതàµà´¥ പേരàµâ€Œ:',
'yourlanguage' => 'ഭാഷ:',
'yourvariant' => 'ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഷയàµà´Ÿàµ† à´µàµà´¯à´¤àµà´¯à´¾à´¸à´®à´¾à´¨à´‚:',
+'prefs-help-variant' => 'à´ˆ വികàµà´•à´¿à´¯àµà´Ÿàµ† ഉളàµà´³à´Ÿà´•àµà´•à´‚ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿà´¾à´¨à´¾à´¯à´¿ താങàµà´•àµ¾ à´µàµà´¯à´¤àµà´¯à´¸àµà´¤à´®à´¾à´¯ ലേഖനരീതി à´Žà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'yournick' => 'à´’à´ªàµà´ªàµ:',
'prefs-help-signature' => 'സംവാദം താളിലെ à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³à´¿àµ½ "<nowiki>~~~~</nowiki>" ഉപയോഗിചàµà´šàµ à´’à´ªàµà´ªà´¿à´Ÿàµ‡à´£àµà´Ÿà´¤à´¾à´£àµ, അതൠതാങàµà´•à´³àµà´Ÿàµ† സമയമàµà´¦àµà´°à´¯àµ‹à´Ÿàµà´•àµ‚à´Ÿà´¿à´¯ à´’à´ªàµà´ªà´¾à´¯à´¿ à´¸àµà´µà´¯à´‚ മാറികàµà´•àµŠà´³àµà´³àµà´‚.',
'badsig' => 'à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´²à´¾à´¤àµà´¤ രൂപതàµà´¤à´¿à´²àµà´³àµà´³ à´’à´ªàµà´ªàµ. HTML ടാഗàµà´•àµ¾ പരിശോധികàµà´•àµà´•.',
@@ -1436,7 +1449,7 @@ $1",
'userrights-lookup-user' => 'ഉപയോകàµà´¤àµƒà´¸à´‚ഘങàµà´™à´³àµ† പരിപാലികàµà´•àµà´•',
'userrights-user-editname' => 'ഒരൠഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ ടൈപàµà´ªàµ ചെയàµà´¯àµà´•:',
'editusergroup' => 'ഉപയോകàµà´¤àµƒà´¸à´‚ഘങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
-'editinguser' => "'''[[User:$1|$1]]''' à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† ഉപയോകàµà´¤àµƒ അവകാശങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´¨àµà´¨àµ ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "'''[[User:$1|$1]]''' à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† ഉപയോകàµà´¤àµƒ അവകാശങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´¨àµà´¨àµ $2",
'userrights-editusergroup' => 'ഉപയോകàµà´¤àµƒà´¸à´®àµ‚ഹതàµà´¤à´¿à´²àµ† à´…à´‚à´—à´¤àµà´µà´‚ തിരàµà´¤àµà´¤àµà´•',
'saveusergroups' => 'ഉപയോകàµà´¤àµƒà´¸à´‚ഘങàµà´™àµ¾ സേവൠചെയàµà´¯àµà´•',
'userrights-groupsmember' => 'à´…à´‚à´—à´¤àµà´µà´®àµà´³àµà´³à´¤àµ:',
@@ -1531,13 +1544,13 @@ $1",
'right-autopatrol' => 'à´¸àµà´µà´¨àµà´¤à´‚ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ റോനàµà´¤àµ à´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
'right-patrolmarks' => 'à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™à´³à´¿à´²àµ† റോനàµà´¤àµà´šàµà´±àµà´±àµ½ രേഖകൾ പരിശോധികàµà´•àµà´•',
'right-unwatchedpages' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•à´¾à´¤àµà´¤ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാണàµà´•',
-'right-trackback' => 'ഒരൠപിനàµà´¤àµà´Ÿà´°àµ½ സമർപàµà´ªà´¿à´•àµà´•àµà´•',
'right-mergehistory' => 'താളàµà´•à´³àµà´Ÿàµ† നാൾവഴികൾ ലയിപàµà´ªà´¿à´•àµà´•àµà´•',
'right-userrights' => 'à´Žà´²àµà´²à´¾ ഉപയോകàµà´¤àµƒ അവകാശങàµà´™à´³àµà´‚ തിരàµà´¤àµà´¤àµà´•',
'right-userrights-interwiki' => 'മറàµà´±àµà´³àµà´³ വികàµà´•à´¿à´•à´³à´¿àµ½ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† അവകാശങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
'right-siteadmin' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´¤àµà´±à´•àµà´•àµà´•, പൂടàµà´Ÿàµà´•',
'right-override-export-depth' => 'à´•à´£àµà´£à´¿à´µà´¤àµà´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•à´³àµà´Ÿàµ† ആഴം 5 വരെയàµà´³àµà´³ താളàµà´•àµ¾ കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•',
'right-sendemail' => 'മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ അയയàµà´•àµà´•àµà´•',
+'right-passwordreset' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ ഇമെയിലàµà´•àµ¾ കാണàµà´•',
# User rights log
'rightslog' => 'ഉപയോകàµà´¤àµƒ അവകാശ രേഖ',
@@ -1571,16 +1584,17 @@ $1",
'action-suppressionlog' => 'à´ˆ à´¸àµà´µà´•à´¾à´°àµà´¯ രേഖ കാണàµà´•',
'action-block' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† തിരàµà´¤àµà´¤àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ തടയàµà´•',
'action-protect' => 'à´ˆ താളിനàµà´±àµ† സം‌രകàµà´·à´£ മാനതàµà´¤à´¿àµ½ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ വരàµà´¤àµà´¤àµà´•',
+'action-rollback' => 'ഒരൠപàµà´°à´¤àµà´¯àµ‡à´• താളിൽ അവസാനം തിരàµà´¤àµà´¤àµ½ നടതàµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† തിരàµà´¤àµà´¤à´²àµà´•àµ¾ പെടàµà´Ÿàµ†à´¨àµà´¨àµ ഒഴിവാകàµà´•àµà´•',
'action-import' => 'à´ˆ താൾ മറàµà´±àµŠà´°àµ വികàµà´•à´¿à´¯àµ€àµ½ നിനàµà´¨àµà´‚ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´•',
'action-importupload' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿àµ½ ഇനàµà´¨àµà´‚ à´ˆ താൾ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯àµà´•',
'action-patrol' => 'മറàµà´±àµà´³àµà´³à´µà´°àµà´Ÿàµ† തിരàµà´¤àµà´¤àµ½ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
'action-autopatrol' => 'താങàµà´•à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤à´²à´¿àµ½ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿',
'action-unwatchedpages' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•à´¾à´¤àµà´¤ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാടàµà´Ÿàµà´•',
-'action-trackback' => 'പിനàµà´¤àµà´Ÿà´°àµ½ സമർപàµà´ªà´¿à´•àµà´•àµà´•',
'action-mergehistory' => 'à´ˆ താളിനàµà´±àµ† നാൾവഴി ലയിപàµà´ªà´¿à´•àµà´•àµà´•',
'action-userrights' => 'à´Žà´²àµà´²à´¾ ഉപയോകàµà´¤àµƒ അവകാശങàµà´™à´³àµà´‚ തിരàµà´¤àµà´¤àµà´•',
'action-userrights-interwiki' => 'മറàµà´±àµ വികàµà´•à´¿à´•à´³à´¿àµ½ നിനàµà´¨àµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒ അവകാശങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
'action-siteadmin' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´¤àµà´±à´•àµà´•àµà´• à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ പൂടàµà´Ÿàµà´•',
+'action-sendemail' => 'ഇമെയിലàµà´•àµ¾ അയയàµà´•àµà´•àµà´•',
# Recent changes
'nchanges' => '{{PLURAL:$1|ഒരൠമാറàµà´±à´‚|$1 മാറàµà´±à´™àµà´™àµ¾}}',
@@ -1612,6 +1626,7 @@ $1",
'number_of_watching_users_pageview' => '[{{PLURAL:$1|ഒരൠഉപയോകàµà´¤à´¾à´µàµ|$1 ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾}} à´ˆ താൾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ]',
'rc_categories' => 'വർഗàµà´—à´™àµà´™à´³àµà´Ÿàµ† പരിധി ("|" ഉപയോഗിചàµà´šàµ പിരികàµà´•àµà´•)',
'rc_categories_any' => 'à´à´¤àµà´‚',
+'rc-change-size-new' => 'മാറàµà´±à´¤àµà´¤à´¿à´¨àµ ശേഷം {{PLURAL:$1|ഒരൠബൈറàµà´±àµ|$1 ബൈറàµà´±àµà´•àµ¾}}',
'newsectionsummary' => '/* $1 */ à´ªàµà´¤à´¿à´¯ ഉപവിഭാഗം',
'rc-enhanced-expand' => 'അധികവിവരങàµà´™àµ¾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´• (ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ സജàµà´œà´®à´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚)',
'rc-enhanced-hide' => 'അധികവിവരങàµà´™àµ¾ മറയàµà´•àµà´•àµà´•',
@@ -1664,6 +1679,7 @@ $1",
'ignorewarnings' => 'അറിയിപàµà´ªàµà´•àµ¾ അവഗണികàµà´•àµà´•',
'minlength1' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരിൽ à´’à´°à´•àµà´·à´°à´®àµ†à´™àµà´•à´¿à´²àµà´‚ ഉണàµà´Ÿà´¾à´µà´£à´‚.',
'illegalfilename' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† "$1" à´Žà´¨àµà´¨ പേരിൽ, താളിനàµà´±àµ† തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´²à´¾à´¤àµà´¤ à´šà´¿à´¹àµà´¨à´™àµà´™àµ¾ ഉണàµà´Ÿàµ. ദയവായി à´ªàµà´°à´®à´¾à´£à´‚ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ നടതàµà´¤à´¿ വീണàµà´Ÿàµà´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´µà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
+'filename-toolong' => 'à´ªàµà´°à´®à´¾à´£à´¨à´¾à´®à´™àµà´™àµ¾ 240 ബൈറàµà´±à´¿àµ½ അധികം വലിപàµà´ªà´®àµà´³àµà´³à´¤à´¾à´µà´°àµà´¤àµ.',
'badfilename' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠ"$1" à´Žà´¨àµà´¨à´¾à´•àµà´•à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'filetype-mime-mismatch' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´Žà´•àµà´¸àµà´±àµà´±àµ†àµ»à´·à´¨à´¾à´¯ ".$1" അതിനàµà´±àµ† മൈം(MIME) തരവàµà´®à´¾à´¯à´¿ ($2) യോജിചàµà´šàµ പോകàµà´¨àµà´¨à´¿à´²àµà´².',
'filetype-badmime' => '"$1" à´Žà´¨àµà´¨ മൈം(MIME) ഇനതàµà´¤à´¿à´²àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´².',
@@ -1759,6 +1775,12 @@ $1',
'upload-unknown-size' => 'വലിപàµà´ªà´‚ അറിയിലàµà´²',
'upload-http-error' => 'ഒരൠഎചàµà´šàµ.à´±àµà´±à´¿.à´±àµà´±à´¿.പി. പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $1',
+# File backend
+'backend-fail-stream' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ à´¸àµà´Ÿàµà´°àµ€à´‚ ചെയàµà´¯à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
+'backend-fail-notexists' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ നിലവിലിലàµà´².',
+'backend-fail-notsame' => '$1 à´Žà´¨àµà´¨àµ സമാനമലàµà´²à´¾à´¤àµà´¤ ഒരൠപàµà´°à´®à´¾à´£à´‚ നിലവിലàµà´£àµà´Ÿàµ.',
+'backend-fail-alreadyexists' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ നിലവിലàµà´£àµà´Ÿàµ.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'സിപൠ(ZIP) പരിശോധനകൾകàµà´•à´¾à´¯à´¿ à´ªàµà´°à´®à´¾à´£à´‚ à´¤àµà´±à´¨àµà´¨à´ªàµà´ªàµ‹àµ¾ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿.',
'zip-wrong-format' => 'നൽകിയിരികàµà´•àµà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ സിപൠ(ZIP) à´…à´²àµà´².',
@@ -1883,24 +1905,25 @@ $1',
'filerevert-badversion' => 'താങàµà´•àµ¾ തനàµà´¨ സമയവàµà´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨ à´®àµàµ» പതിപàµà´ªàµà´•àµ¾ à´’à´¨àµà´¨àµà´‚ തനàµà´¨àµ† à´ˆ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨à´¿à´²àµà´².',
# File deletion
-'filedelete' => '$1 മായàµà´•àµà´•àµà´•',
-'filedelete-legend' => 'à´ªàµà´°à´®à´¾à´£à´‚ മായàµà´•àµà´•àµà´•',
-'filedelete-intro' => "താങàµà´•àµ¾ '''[[Media:$1|$1]]''' à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ അതിനàµà´±àµ† à´Žà´²àµà´²à´¾ à´šà´°à´¿à´¤àµà´°à´µàµà´®à´Ÿà´•àµà´•à´‚ നീകàµà´•à´‚ ചെയàµà´¯à´¾àµ» പോവàµà´•à´¯à´¾à´£àµâ€Œ.",
-'filedelete-intro-old' => "താങàµà´•àµ¾ '''[[Media:$1|$1]]''' à´Žà´¨àµà´¨à´¤à´¿à´¨àµà´±àµ† [$3, $2-നൠഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨ $4] പതിപàµà´ªà´¾à´£àµ മായàµà´•àµà´•àµà´µà´¾àµ» പോകàµà´¨àµà´¨à´¤àµ.",
-'filedelete-comment' => 'കാരണം:',
-'filedelete-submit' => 'മായàµà´•àµà´•àµà´•',
-'filedelete-success' => "'''$1''' മായàµà´šàµà´šàµ à´•à´´à´¿à´žàµà´žàµ.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' à´Žà´¨àµà´¨ മീഡിയയàµà´Ÿàµ† $3, $2-വിൽ ഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨ പതിപàµà´ªàµ മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.",
-'filedelete-nofile' => "'''$1''' നിലവിലിലàµà´².",
-'filedelete-nofile-old' => "നൽകിയിരികàµà´•àµà´¨àµà´¨ വിവരണമനàµà´¸à´°à´¿à´šàµà´šàµà´³àµà´³ '''$1'''-à´¨àµà´±àµ† ആർകàµà´•àµˆà´µàµ പതിപàµà´ªàµ ലഭàµà´¯à´®à´²àµà´².",
-'filedelete-otherreason' => 'മറàµà´±àµ/കൂടàµà´¤àµ½ കാരണങàµà´™àµ¾:',
-'filedelete-reason-otherlist' => 'മറàµà´±àµ കാരണങàµà´™àµ¾',
-'filedelete-reason-dropdown' => '*നീകàµà´•à´‚ ചെയàµà´¯à´¾à´¨àµà´³àµà´³ സാധാരണ കാരണങàµà´™àµ¾
+'filedelete' => '$1 മായàµà´•àµà´•àµà´•',
+'filedelete-legend' => 'à´ªàµà´°à´®à´¾à´£à´‚ മായàµà´•àµà´•àµà´•',
+'filedelete-intro' => "താങàµà´•àµ¾ '''[[Media:$1|$1]]''' à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ അതിനàµà´±àµ† à´Žà´²àµà´²à´¾ à´šà´°à´¿à´¤àµà´°à´µàµà´®à´Ÿà´•àµà´•à´‚ നീകàµà´•à´‚ ചെയàµà´¯à´¾àµ» പോവàµà´•à´¯à´¾à´£àµâ€Œ.",
+'filedelete-intro-old' => "താങàµà´•àµ¾ '''[[Media:$1|$1]]''' à´Žà´¨àµà´¨à´¤à´¿à´¨àµà´±àµ† [$3, $2-നൠഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨ $4] പതിപàµà´ªà´¾à´£àµ മായàµà´•àµà´•àµà´µà´¾àµ» പോകàµà´¨àµà´¨à´¤àµ.",
+'filedelete-comment' => 'കാരണം:',
+'filedelete-submit' => 'മായàµà´•àµà´•àµà´•',
+'filedelete-success' => "'''$1''' മായàµà´šàµà´šàµ à´•à´´à´¿à´žàµà´žàµ.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' à´Žà´¨àµà´¨ മീഡിയയàµà´Ÿàµ† $3, $2-വിൽ ഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨ പതിപàµà´ªàµ മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.",
+'filedelete-nofile' => "'''$1''' നിലവിലിലàµà´².",
+'filedelete-nofile-old' => "നൽകിയിരികàµà´•àµà´¨àµà´¨ വിവരണമനàµà´¸à´°à´¿à´šàµà´šàµà´³àµà´³ '''$1'''-à´¨àµà´±àµ† ആർകàµà´•àµˆà´µàµ പതിപàµà´ªàµ ലഭàµà´¯à´®à´²àµà´².",
+'filedelete-otherreason' => 'മറàµà´±àµ/കൂടàµà´¤àµ½ കാരണങàµà´™àµ¾:',
+'filedelete-reason-otherlist' => 'മറàµà´±àµ കാരണങàµà´™àµ¾',
+'filedelete-reason-dropdown' => '*നീകàµà´•à´‚ ചെയàµà´¯à´¾à´¨àµà´³àµà´³ സാധാരണ കാരണങàµà´™àµ¾
** പകർപàµà´ªà´µà´•à´¾à´¶ ലംഘനം
** നിലവിലàµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പകർപàµà´ªàµ
** പകർപàµà´ªà´µà´•à´¾à´¶ വിവരങàµà´™àµ¾ ചേർതàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
-'filedelete-edit-reasonlist' => 'മായàµà´•àµà´•à´²à´¿à´¨àµà´±àµ† കാരണം തിരàµà´¤àµà´¤àµà´•',
-'filedelete-maintenance' => 'നനàµà´¨à´¾à´•àµà´•àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´™àµà´™àµ¾ à´ªàµà´°àµ‹à´—മികàµà´•àµà´¨àµà´¨à´¤à´¿à´¨à´¾àµ½ à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† മായàµà´•àµà´•à´²àµà´‚ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•à´²àµà´‚ താതàµà´•àµà´•à´¾à´²à´¿à´•à´®à´¾à´¯à´¿ നിർതàµà´¤à´¿à´µà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'filedelete-edit-reasonlist' => 'മായàµà´•àµà´•à´²à´¿à´¨àµà´±àµ† കാരണം തിരàµà´¤àµà´¤àµà´•',
+'filedelete-maintenance' => 'നനàµà´¨à´¾à´•àµà´•àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´™àµà´™àµ¾ à´ªàµà´°àµ‹à´—മികàµà´•àµà´¨àµà´¨à´¤à´¿à´¨à´¾àµ½ à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† മായàµà´•àµà´•à´²àµà´‚ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•à´²àµà´‚ താതàµà´•àµà´•à´¾à´²à´¿à´•à´®à´¾à´¯à´¿ നിർതàµà´¤à´¿à´µà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'filedelete-maintenance-title' => 'à´ªàµà´°à´®à´¾à´£à´‚ മായàµà´•àµà´•à´¾àµ» കഴിയിലàµà´²',
# MIME search
'mimesearch' => 'മൈം(MIME) തിരയൽ',
@@ -2004,6 +2027,7 @@ $1',
'mostimages' => 'à´à´±àµà´±à´µàµà´®à´§à´¿à´•à´‚ à´•à´£àµà´£à´¿ ചേർതàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾',
'mostrevisions' => 'à´à´±àµà´±à´µàµà´®à´§à´¿à´•à´‚ തിരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•àµ¾',
'prefixindex' => 'പൂർവàµà´µà´ªà´¦à´¤àµà´¤àµ‹à´Ÿàµ കൂടിയ à´Žà´²àµà´²à´¾ താളàµà´•à´³àµà´‚',
+'prefixindex-namespace' => 'പൂർവàµà´µà´ªà´¦à´®àµà´³àµà´³ à´Žà´²àµà´²à´¾ താളàµà´•à´³àµà´‚ (നാമമേഖല $1)',
'shortpages' => 'വിവരം à´à´±àµà´±à´µàµà´‚ à´•àµà´±à´µàµà´³àµà´³ താളàµà´•àµ¾',
'longpages' => 'വലിയ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
'deadendpages' => 'à´…à´¨àµà´¤àµ¼ വികàµà´•à´¿ à´•à´£àµà´£à´¿à´¯à´¾àµ½ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤ താളàµà´•àµ¾',
@@ -2114,12 +2138,8 @@ $1',
'activeusers-noresult' => 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³à´¿à´²àµà´²',
# Special:Log/newusers
-'newuserlogpage' => 'ഉപയോകàµà´¤àµƒ സൃഷàµà´Ÿà´¿à´¯àµà´Ÿàµ† രേഖ',
-'newuserlogpagetext' => 'à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ കാണാം.',
-'newuserlog-byemail' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´‡-മെയിൽ വഴി അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'newuserlog-create-entry' => 'à´ªàµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´µàµ',
-'newuserlog-create2-entry' => 'à´ªàµà´¤à´¿à´¯ à´…à´‚à´—à´¤àµà´µà´‚ $1 സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'newuserlog-autocreate-entry' => 'യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ à´…à´‚à´—à´¤àµà´µà´‚',
+'newuserlogpage' => 'ഉപയോകàµà´¤àµƒ സൃഷàµà´Ÿà´¿à´¯àµà´Ÿàµ† രേഖ',
+'newuserlogpagetext' => 'à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ കാണാം.',
# Special:ListGroupRights
'listgrouprights' => 'ഉപയോകàµà´¤àµƒà´µà´¿à´­à´¾à´—à´¤àµà´¤à´¿à´¨àµà´±àµ† അവകാശങàµà´™àµ¾',
@@ -2148,7 +2168,7 @@ $1',
'emailpagetext' => 'താഴെ കാണàµà´¨àµà´¨ ഫോം മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµâ€Œ ഇമെയിൽ അയകàµà´•à´¾àµ» ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.
[[Special:Preferences|ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഇമെയിൽ വിലാസം "ദാതാവàµ" ആയി വരàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ à´¸àµà´µàµ€à´•àµ¼à´¤àµà´¤à´¾à´µà´¿à´¨àµâ€Œ താങàµà´•àµ¾à´•àµà´•àµ നേരിടàµà´Ÿàµ മറàµà´ªà´Ÿà´¿ അയകàµà´•à´¾àµ» à´•à´´à´¿à´¯àµà´‚.',
'usermailererror' => 'മെയിലàµà´£àµà´Ÿà´¾à´¯ പിഴവൠതിരിചàµà´šà´¯à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:',
-'defemailsubject' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ നിനàµà´¨àµà´³àµà´³ ഇമെയിൽ',
+'defemailsubject' => '"$1" à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ അയചàµà´š {{SITENAME}} ഇമെയിൽ',
'usermaildisabled' => 'ഉപയോകàµà´¤àµƒ ഇമെയിൽ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'usermaildisabledtext' => 'à´ˆ വികàµà´•à´¿à´¯à´¿à´²àµ† മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ അയയàµà´•àµà´•à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´²',
'noemailtitle' => 'ഇമെയിൽ വിലാസം ഇലàµà´²',
@@ -2201,7 +2221,7 @@ $1',
'watchmethod-list' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿à´²àµ† à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ പരിശോധികàµà´•àµà´¨àµà´¨àµ',
'watchlistcontains' => 'താങàµà´•àµ¾ {{PLURAL:$1|താൾ|താളàµà´•àµ¾}} à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ.',
'iteminvalidname' => "ഇനം '$1' ൽ പിഴവàµ, അസാധàµà´µà´¾à´¯ പേരàµâ€Œ...",
-'wlnote' => "à´•à´´à´¿à´žàµà´ž {{PLURAL:$2|മണികàµà´•àµ‚റിൽ|'''$2''' മണികàµà´•àµ‚റിൽ}} നടനàµà´¨ {{PLURAL:$1|ഒരൠപàµà´¤à´¿à´¯ മാറàµà´±à´‚|'''$1''' à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾}} താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.",
+'wlnote' => "$3, $4-നൠകഴിഞàµà´ž {{PLURAL:$2|മണികàµà´•àµ‚റിൽ|'''$2''' മണികàµà´•àµ‚റിൽ}} നടനàµà´¨ {{PLURAL:$1|ഒരൠപàµà´¤à´¿à´¯ മാറàµà´±à´‚|'''$1''' à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾}} താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.",
'wlshowlast' => 'à´’à´Ÿàµà´µà´¿à´²à´¤àµà´¤àµ† $1 മണികàµà´•àµ‚à´±àµà´•àµ¾ $2 ദിനങàµà´™àµ¾, $3 à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
'watchlist-options' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾',
@@ -2264,8 +2284,6 @@ $UNWATCHURL
'actioncomplete' => 'à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ പൂർതàµà´¤à´¿à´¯à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'actionfailed' => 'à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'deletedtext' => '"$1" മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ നടനàµà´¨ മായàµà´•àµà´•à´²àµà´•à´³àµà´Ÿàµ† വിവരങàµà´™àµ¾ $2 ഉപയോഗിചàµà´šàµ കാണാം.',
-'deletedarticle' => '"[[$1]]" മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'suppressedarticle' => '"[[$1]]" à´’à´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'dellogpage' => 'മായàµà´•àµà´•àµ½ രേഖ',
'dellogpagetext' => 'സമീപകാലതàµà´¤àµ മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ കാണാം.',
'deletionlog' => 'മായàµà´•àµà´•àµ½ രേഖ',
@@ -2310,7 +2328,10 @@ $UNWATCHURL
'unprotectedarticle' => '"[[$1]]" à´Žà´¨àµà´¨ താളിനàµà´±àµ† സംരകàµà´·à´£à´‚ നീകàµà´•à´¿',
'movedarticleprotection' => '"[[$2]]" à´Žà´¨àµà´¨ താളിനàµà´±àµ† സംരകàµà´·à´£à´®à´¾à´¨à´™àµà´™àµ¾ "[[$1]]" à´Žà´¨àµà´¨ താളിലേകàµà´•àµ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'protect-title' => '"$1" താളിനൠസം‌രകàµà´·à´£à´®à´¾à´¨à´‚ സജàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'protect-title-notallowed' => '"$1" താളിനàµà´±àµ† സം‌രകàµà´·à´£à´®à´¾à´¨à´‚ കാണàµà´•',
'prot_1movedto2' => '[[$1]] à´Žà´¨àµà´¨ താളിനàµà´±àµ† പേർ [[$2]] à´Žà´¨àµà´¨à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'protect-badnamespace-title' => 'സംരകàµà´·à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¾à´¤àµà´¤ നാമമേഖല',
+'protect-badnamespace-text' => 'à´ˆ നാമമേഖലയിലെ താളàµà´•àµ¾ സംരകàµà´·à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¿à´²àµà´².',
'protect-legend' => 'സം‌രകàµà´·à´£à´‚ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'protectcomment' => 'കാരണം:',
'protectexpiry' => 'സംരകàµà´·à´£ കാലാവധി:',
@@ -2331,6 +2352,7 @@ $UNWATCHURL
'protect-level-sysop' => 'സിസോപàµà´ªàµà´•àµ¾ മാതàµà´°à´‚',
'protect-summary-cascade' => 'നിർà´à´°à´¿à´¤à´‚',
'protect-expiring' => 'കാലാവധി തീരàµà´¨àµà´¨à´¤àµ - $1 (UTC)',
+'protect-expiring-local' => '$1-നൠകാലഹരണപàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ',
'protect-expiry-indefinite' => 'അനിശàµà´šà´¿à´¤à´•à´¾à´²à´‚',
'protect-cascade' => 'à´ˆ താളിൽ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµ†à´²àµà´²à´¾à´‚ സംരകàµà´·à´¿à´•àµà´•àµà´• (നിർà´à´°à´¿à´¤ സംരകàµà´·à´£à´‚)',
'protect-cantedit' => 'à´ˆ താൾ തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ അധികാരമിലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ à´ˆ താളിനàµà´±àµ† സംരകàµà´·à´£à´®à´¾à´¨à´‚ മാറàµà´±àµà´µà´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ സാധികàµà´•àµà´•à´¯à´¿à´²àµà´².',
@@ -2390,7 +2412,6 @@ $UNWATCHURL
'undeletereset' => 'à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'undeleteinvert' => 'വിപരീതം തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•',
'undeletecomment' => 'കാരണം:',
-'undeletedarticle' => '"[[$1]]" à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šàµ',
'undeletedrevisions' => '{{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'undeletedrevisions-files' => '{{PLURAL:$1|ഒരൠപതിപàµà´ªàµà´‚|$1 പതിപàµà´ªàµà´•à´³àµà´‚}} {{PLURAL:$2|ഒരൠപàµà´°à´®à´¾à´£à´µàµà´‚|$2 à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´‚}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'undeletedfiles' => '{{PLURAL:$1|ഒരൠപàµà´°à´®à´¾à´£à´‚|$1 à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šàµ',
@@ -2399,6 +2420,7 @@ $UNWATCHURL
à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ നടനàµà´¨ ഒഴിവാകàµà´•à´²àµà´•à´³àµà´Ÿàµ‡à´¯àµà´‚ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¨à´™àµà´™à´³àµà´Ÿàµ‡à´¯àµà´‚ വിവരങàµà´™àµ¾ കാണാൻ [[Special:Log/delete|മായàµà´•àµà´•àµ½ ലോഗàµ]] കാണàµà´•.",
'undelete-header' => 'à´…à´Ÿàµà´¤àµà´¤à´•à´¾à´²à´¤àµà´¤àµ നീകàµà´•à´‚ചെയàµà´¤ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯àµà´•àµà´•àµ [[Special:Log/delete|നീകàµà´•à´‚ ചെയàµà´¯àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–]] കാണàµà´•.',
+'undelete-search-title' => 'നീകàµà´•à´‚ ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•àµ¾ തിരയàµà´•',
'undelete-search-box' => 'നീകàµà´•à´‚ചെയàµà´¤ താളàµà´•à´³à´¿àµ½ തിരയàµà´•',
'undelete-search-prefix' => 'à´ˆ വാകàµà´•à´¿àµ½ à´¤àµà´Ÿà´™àµà´™àµà´¨àµà´¨ താളàµà´•àµ¾ കാണികàµà´•àµà´•:',
'undelete-search-submit' => 'തിരയൂ',
@@ -2407,6 +2429,7 @@ $UNWATCHURL
'undelete-bad-store-key' => '$1 സമയതàµà´¤àµà´£àµà´Ÿà´¾à´•àµà´•à´¿à´¯ പതിപàµà´ªà´¿à´¨àµà´±àµ† മായàµà´•àµà´•àµàµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´µà´¾àµ» സാധിചàµà´šà´¿à´²àµà´²: മായàµà´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ‡ à´ªàµà´°à´®à´¾à´£à´‚ à´…à´ªàµà´°à´¤àµà´¯à´•àµà´·à´®à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'undelete-cleanup-error' => 'ഉപയോഗതàµà´¤à´¿à´²à´¿à´²àµà´²à´¾à´¤àµà´¤ "$1" à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ മായàµà´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവൠസംഭവിചàµà´šàµ.',
'undelete-missing-filearchive' => '$1 ആർകàµà´•àµˆà´µàµ à´à´¡à´¿à´¯àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´‚ ഡാറàµà´±à´¾à´¬àµ‡à´¸à´¿à´²à´¿à´²àµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ അതൠപàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿à´²àµà´². ചിലപàµà´ªàµ‹àµ¾ അതൠമàµàµ»à´ªàµ‡ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•à´¾à´‚.',
+'undelete-error' => 'താൾ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿',
'undelete-error-short' => 'à´ˆ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† മായàµà´•àµà´•àµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµ: $1',
'undelete-error-long' => 'à´ˆ à´ªàµà´°à´®à´¾à´£à´‚ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´µà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ പിഴവàµà´•àµ¾ സംഭവിചàµà´šàµ:
@@ -2527,6 +2550,7 @@ $1',
'blocklist-userblocks' => 'à´…à´‚à´—à´¤àµà´µ തടയലàµà´•àµ¾ മറയàµà´•àµà´•àµà´•',
'blocklist-tempblocks' => 'താതàµà´•à´¾à´²à´¿à´• തടയലàµà´•àµ¾ മറയàµà´•àµà´•àµà´•',
'blocklist-addressblocks' => 'à´’à´±àµà´±à´¯àµŠà´±àµà´± à´.പി. തടയലàµà´•àµ¾ മറയàµà´•àµà´•àµà´•',
+'blocklist-rangeblocks' => 'പരിധിയടചàµà´šàµà´³àµà´³ തടയലàµà´•àµ¾ മറയàµà´•àµà´•àµà´•',
'blocklist-timestamp' => 'സമയമàµà´¦àµà´°',
'blocklist-target' => 'ലകàµà´·àµà´¯à´‚',
'blocklist-expiry' => 'കാലാവധി',
@@ -2549,6 +2573,7 @@ $1',
'unblocklink' => 'à´¸àµà´µà´¤à´¨àµà´¤àµà´°à´®à´¾à´•àµà´•àµà´•',
'change-blocklink' => 'തടയലിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•',
'contribslink' => 'സംഭാവനകൾ',
+'emaillink' => 'ഇമെയിൽ അയയàµà´•àµà´•àµà´•',
'autoblocker' => 'താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം "[[User:$1|$1]]" à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ à´ˆ à´…à´Ÿàµà´¤àµà´¤àµ ഉപയോഗികàµà´•àµà´•à´¯àµà´‚ à´ªàµà´°à´¸àµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† വികàµà´•à´¿à´¯à´¿àµ½ നിനàµà´¨àµ തടയàµà´•à´¯àµà´‚ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤à´¾à´£àµâ€Œ. അതിനാൽ താങàµà´•à´³àµà´‚ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. $1à´¨àµà´±àµ† തടയലിനൠസൂചിപàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ കാരണം "$2" ആണàµâ€Œ.',
'blocklogpage' => 'തടയൽ രേഖ',
'blocklog-showlog' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µàµ à´®àµà´®àµà´ªàµ‡ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.
@@ -2677,9 +2702,6 @@ $1',
'movepage-page-moved' => '$1 à´Žà´¨àµà´¨ താൾ $2 à´Žà´¨àµà´¨àµ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'movepage-page-unmoved' => '$1 à´Žà´¨àµà´¨ താൾ $2 à´Žà´¨àµà´¨àµ മാറàµà´±à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².',
'movepage-max-pages' => 'പരമാവധി സാധàµà´¯à´®à´¾à´¯ {{PLURAL:$1|ഒരൠതാൾ|$1 താളàµà´•àµ¾}} മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, അതിൽ കൂടàµà´¤àµ½ മാറàµà´±à´¾àµ» à´¸àµà´µà´¤àµ‡ സാധàµà´¯à´®à´²àµà´².',
-'1movedto2' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±à´‚: [[$1]] >>> [[$2]]',
-'1movedto2_redir' => 'നിലവിലàµà´£àµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളിലേകàµà´•àµ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±à´‚: [[$1]] >>> [[$2]]',
-'move-redirect-suppressed' => 'തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ à´’à´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'movelogpage' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† രേഖ',
'movelogpagetext' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµ മാറàµà´±à´¿à´¯ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ കാണാം.',
'movesubpage' => '{{PLURAL:$1|ഉപതാൾ|ഉപതാളàµà´•àµ¾}}',
@@ -2692,7 +2714,7 @@ $1',
താങàµà´•àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´š "[[:$1]]" à´Žà´¨àµà´¨ താൾ നിലവിലàµà´£àµà´Ÿàµ. à´† താൾ മായàµà´šàµà´šàµ à´ªàµà´¤à´¿à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ നൽകേണàµà´Ÿà´¤àµà´£àµà´Ÿàµ‹?',
'delete_and_move_confirm' => 'ശരി, താൾ നീകàµà´•à´‚ ചെയàµà´¯àµà´•',
-'delete_and_move_reason' => 'താൾ മാറàµà´±à´¾à´¨à´¾à´¯à´¿ മായàµà´šàµà´šàµ',
+'delete_and_move_reason' => '"[[$1]]" à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ മാറàµà´±à´¾à´¨àµà´³àµà´³ സൗകരàµà´¯à´¤àµà´¤à´¿à´¨à´¾à´¯à´¿ മായàµà´šàµà´šàµ',
'selfmove' => 'à´¸àµà´°àµ‹à´¤à´¸àµà´¸à´¿à´¨àµà´±àµ† തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´‚ ലകàµà´·àµà´¯à´¤àµà´¤à´¿à´¨àµà´±àµ† തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´‚ à´’à´¨àµà´¨à´¾à´£àµâ€Œ. അതിനാൽ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´®à´¾à´±àµà´±à´‚ സാദàµà´§àµà´¯à´®à´²àµà´².',
'immobile-source-namespace' => '"$1" നാമമേഖലയിലെ താളàµà´•àµ¾ മാറàµà´±à´¾àµ» കഴിയിലàµà´²',
'immobile-target-namespace' => '"$1" നാമമേഖലയിലേയàµà´•àµà´•àµ താളàµà´•àµ¾ മാറàµà´±à´¾àµ» കഴിയിലàµà´²',
@@ -2720,9 +2742,11 @@ $1',
താളàµà´•àµ¾ കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯à´¾àµ», താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ പെടàµà´Ÿà´¿à´¯à´¿àµ½ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´•àµ¾, ഒരൠവരിയിൽ à´’à´¨àµà´¨àµ വീതം നൽകി, à´Žà´²àµà´²à´¾ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´‚ വേണോ അവസാനതàµà´¤àµ† തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† വിവരങàµà´™àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµ†à´¯àµà´³àµà´³ ഇപàµà´ªàµ‹à´´àµà´³àµà´³ പതിപàµà´ªàµ മാതàµà´°à´‚ മതിയോ à´Žà´¨àµà´¨àµ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤àµ നൽകàµà´•.
പിനàµà´¨àµ€à´Ÿàµ ഇതിനായി താങàµà´•àµ¾à´•àµà´•àµ ഒരൠകണàµà´£à´¿, ഉദാഹരണതàµà´¤à´¿à´¨àµ "[[{{MediaWiki:Mainpage}}]]" à´Žà´¨àµà´¨ താളിനൠ[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]], ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'exportall' => 'à´Žà´²àµà´²à´¾ താളàµà´‚ കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•',
'exportcuronly' => 'നിലവിലàµà´³àµà´³ പതിപàµà´ªàµ മാതàµà´°à´‚ ചേർകàµà´•àµà´•, പൂർണàµà´£ തിരàµà´¤àµà´¤àµ½ à´šà´°à´¿à´¤àµà´°à´‚ വേണàµà´Ÿ',
'exportnohistory' => "----
'''à´•àµà´±à´¿à´ªàµà´ªàµ:''' താളിനàµà´±àµ† à´®àµà´´àµà´µàµ» നാൾവഴിയàµà´‚ à´ˆ ഫോം ഉപയോഗിചàµà´šàµ കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´¨àµà´¨ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´®à´¿à´•à´µà´¿à´¨àµ† ബാധികàµà´•àµà´¨àµà´¨ à´ªàµà´°à´¶àµà´¨à´™àµà´™à´³à´¾àµ½ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².",
+'exportlistauthors' => 'ഓരോ താളിനàµà´±àµ‡à´¯àµà´‚ സംഭാവകരàµà´Ÿàµ† പൂർണàµà´£ പടàµà´Ÿà´¿à´• ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
'export-submit' => 'കയറàµà´±àµà´®à´¤à´¿ ചെയàµà´¯àµà´•',
'export-addcattext' => 'വർഗàµà´—à´¤àµà´¤à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´‚ താളàµà´•àµ¾ ചേർകàµà´•àµà´•:',
'export-addcat' => 'ചേർകàµà´•àµà´•',
@@ -2755,6 +2779,8 @@ $1',
'thumbnail_error' => 'ലഘàµà´šà´¿à´¤àµà´°à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµ: $1',
'djvu_page_error' => 'DjVu താൾ പരിധിയàµà´•àµà´•àµ à´ªàµà´±à´¤àµà´¤à´¾à´£àµ',
'djvu_no_xml' => 'DjVu à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ വേണàµà´Ÿà´¿ XML ശേഖരികàµà´•àµà´µà´¾àµ» പറàµà´±à´¿à´¯à´¿à´²àµà´²',
+'thumbnail-temp-create' => 'താതàµà´•à´¾à´²à´¿à´• ലഘàµà´šà´¿à´¤àµà´° à´ªàµà´°à´®à´¾à´£à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿à´²àµà´²',
+'thumbnail-dest-create' => 'ലഘàµà´šà´¿à´¤àµà´°à´‚ ലകàµà´·àµà´¯à´¤àµà´¤à´¿àµ½ സേവൠചെയàµà´¯à´¾à´¨à´¾à´¯à´¿à´²àµà´²',
'thumbnail_invalid_params' => 'ലഘàµà´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨à´¾à´µà´¶àµà´¯à´®à´¾à´¯ à´šà´°à´™àµà´™àµ¾ അസാധàµà´µà´¾à´£àµ',
'thumbnail_dest_directory' => 'ലകàµà´·àµà´¯ ഡയറകàµà´Ÿà´±à´¿ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´µà´¾àµ» സാധിചàµà´šà´¿à´²àµà´²',
'thumbnail_image-type' => 'à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† തരം പിനàµà´¤àµà´£à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´²àµà´²',
@@ -2802,6 +2828,9 @@ $1',
'import-upload' => 'à´Žà´•àµà´¸àµ.à´Žà´‚.എൽ. ഡേറàµà´± à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´•',
'import-token-mismatch' => 'സെഷൻ ഡാറàµà´± നഷàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¿à´¨à´¾àµ½ ദയവായി വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµ‚à´•',
'import-invalid-interwiki' => 'താങàµà´•àµ¾ നിർദàµà´¦àµ‡à´¶à´¿à´šàµà´š വികàµà´•à´¿à´¯à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´‚ ഇറകàµà´•àµà´®à´¤à´¿à´šàµ†à´¯àµà´¯à´¾àµ» സാധിചàµà´šà´¿à´²àµà´²',
+'import-error-edit' => '"$1" à´Žà´¨àµà´¨ താൾ തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿ താങàµà´•àµ¾à´•àµà´•àµ ഇലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ അതൠഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¤à´¿à´²àµà´².',
+'import-error-create' => '"$1" à´Žà´¨àµà´¨ താൾ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿ താങàµà´•àµ¾à´•àµà´•àµ ഇലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ അതൠഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¤à´¿à´²àµà´².',
+'import-error-invalid' => 'പേരൠഅസാധàµà´µà´¾à´¯à´¤à´¿à´¨à´¾àµ½ "$1" à´Žà´¨àµà´¨ താൾ ഇറകàµà´•àµà´®à´¤à´¿ ചെയàµà´¯à´¿à´²àµà´².',
# Import log
'importlogpage' => 'ഇറകàµà´•àµà´®à´¤à´¿ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–',
@@ -2811,72 +2840,82 @@ $1',
'import-logentry-interwiki' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ ഇറകàµà´•àµà´®à´¤à´¿ $1',
'import-logentry-interwiki-detail' => '$2 à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ {{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}}',
+# JavaScriptTest
+'javascripttest' => 'ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ പരീകàµà´·à´£à´‚',
+'javascripttest-disabled' => 'à´ˆ à´ªàµà´°à´•àµà´°à´¿à´¯ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'javascripttest-title' => '$1 പരീകàµà´·à´£à´™àµà´™àµ¾ നടകàµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ',
+'javascripttest-pagetext-noframework' => 'à´ˆ താൾ ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ പരീകàµà´·à´£à´™àµà´™àµ¾ നടതàµà´¤à´¾à´¨à´¾à´¯à´¿ മാറàµà´±à´¿à´µàµ†à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'javascripttest-pagetext-skins' => 'പരീകàµà´·à´£à´™àµà´™àµ¾ നടതàµà´¤à´¾à´¨àµà´³àµà´³ ദൃശàµà´¯à´°àµ‚പം തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•:',
+'javascripttest-qunit-heading' => 'മീഡിയവികàµà´•à´¿ ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ à´•àµà´¯àµ‚യൂണിറàµà´±àµ പരീകàµà´·à´£àµ‹à´ªà´¾à´§à´¿',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'താങàµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒà´¤à´¾àµ¾',
-'tooltip-pt-anonuserpage' => 'താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസതàµà´¤à´¿à´¨àµà´±àµ† ഉപയോകàµà´¤àµƒà´¤à´¾àµ¾',
-'tooltip-pt-mytalk' => 'താങàµà´•à´³àµà´Ÿàµ† സംവാദം താൾ',
-'tooltip-pt-anontalk' => 'à´ˆ à´.പി. വിലാസതàµà´¤à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´³àµà´³ തിരàµà´¤àµà´¤à´²àµà´•à´³àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ സം‌വാദം',
-'tooltip-pt-preferences' => 'താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾',
-'tooltip-pt-watchlist' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿à´²àµ† മാറàµà´±à´™àµà´™àµ¾',
-'tooltip-pt-mycontris' => 'താങàµà´•à´³àµà´Ÿàµ† സേവനങàµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
-'tooltip-pt-login' => 'ലോഗിൻ ചെയàµà´¯à´£à´®àµ†à´¨àµà´¨àµ നിർബനàµà´§à´‚ ഇലàµà´²àµ†à´™àµà´•à´¿à´²àµà´‚ ലോഗിൻ ചെയàµà´¯àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.',
-'tooltip-pt-anonlogin' => 'ലോഗിൻ ചെയàµà´¤àµ തിരàµà´¤àµà´¤àµ½ നടതàµà´¤àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.',
-'tooltip-pt-logout' => 'ലോഗൗടàµà´Ÿàµ ചെയàµà´¯à´¾à´¨àµà´³àµà´³ à´•à´£àµà´£à´¿',
-'tooltip-ca-talk' => 'വിവരദായക താളിനെകàµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ ചർചàµà´š',
-'tooltip-ca-edit' => 'താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താൾ തിരàµà´¤àµà´¤à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ. തിരàµà´¤àµà´¤à´¿à´¯ താൾ സേവൠചെയàµà´¯àµ‚à´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ à´ªàµà´°à´¿à´µàµà´¯àµ‚ കാണàµà´•.',
-'tooltip-ca-addsection' => 'à´ªàµà´¤à´¿à´¯ വിഭാഗം à´¤àµà´Ÿà´™àµà´™àµà´•',
-'tooltip-ca-viewsource' => 'à´ˆ താൾ സം‌രകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താളിനàµà´±àµ† മൂലരൂപം കാണാവàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.',
-'tooltip-ca-history' => 'à´ˆ താളിനàµà´±àµ† പഴയ പതിപàµà´ªàµà´•àµ¾.',
-'tooltip-ca-protect' => 'à´ˆ താൾ സം‌രകàµà´·à´¿à´•àµà´•àµà´•',
-'tooltip-ca-unprotect' => 'à´ˆ താളിനàµà´±àµ† സംരകàµà´·à´£à´¤àµà´¤à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
-'tooltip-ca-delete' => 'à´ˆ താൾ നീകàµà´•à´‚ ചെയàµà´¯àµà´•',
-'tooltip-ca-undelete' => 'à´ˆ താൾ നീകàµà´•à´‚ ചെയàµà´¤à´¤à´¿à´¨àµà´®àµà´®àµà´ªàµ വരàµà´¤àµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•',
-'tooltip-ca-move' => 'à´ˆ താളിനàµà´±àµ† തലകàµà´•àµ†à´Ÿàµà´Ÿàµàµâ€Œ മാറàµà´±àµà´•',
-'tooltip-ca-watch' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´ˆ താൾ ചേർകàµà´•àµà´•',
-'tooltip-ca-unwatch' => 'à´ˆ താൾ ഞാൻ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½à´¨à´¿à´¨àµà´¨àµ നീകàµà´•àµà´•',
-'tooltip-search' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ തിരയàµà´•',
-'tooltip-search-go' => 'à´ˆ പേരിൽ ഒരൠതാളàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ അതിലേകàµà´•àµ പോവàµà´•.',
-'tooltip-search-fulltext' => 'à´ˆ പദമàµà´³àµà´³ താളàµà´•àµ¾ തേടàµà´•',
-'tooltip-p-logo' => 'à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•',
-'tooltip-n-mainpage' => 'à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•',
-'tooltip-n-mainpage-description' => 'à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•',
-'tooltip-n-portal' => 'പദàµà´§à´¤à´¿ താളിനെകàµà´•àµà´±à´¿à´šàµà´šàµ, താങàµà´•àµ¾à´•àµà´•àµ†à´¨àµà´¤àµŠà´•àµà´•àµ† ചെയàµà´¯à´¾à´‚, കാരàµà´¯à´™àµà´™àµ¾ എവിടെനിനàµà´¨àµ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´‚',
-'tooltip-n-currentevents' => 'സമകാലീനസംഭവങàµà´™à´³àµà´Ÿàµ† പശàµà´šà´¾à´¤àµà´¤à´²à´‚ à´…à´¨àµà´µàµ‡à´·à´¿à´•àµà´•àµà´•',
-'tooltip-n-recentchanges' => 'വികàµà´•à´¿à´¯à´¿à´²àµ† സമീപകാലമാറàµà´±à´™àµà´™àµ¾',
-'tooltip-n-randompage' => 'à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ ഒരൠതാൾ à´¤àµà´±à´•àµà´•àµ‚',
-'tooltip-n-help' => 'സഹായം ലഭàµà´¯à´®à´¾à´¯ ഇടം',
-'tooltip-t-whatlinkshere' => 'à´ˆ താളിലേകàµà´•àµ à´•à´£àµà´£à´¿à´¯à´¾àµ½ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´Žà´²àµà´²à´¾ വികàµà´•à´¿ താളàµà´•à´³àµà´Ÿàµ‡à´¯àµà´‚ പടàµà´Ÿà´¿à´•.',
-'tooltip-t-recentchangeslinked' => 'താളàµà´•à´³à´¿à´²àµ† à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾',
-'tooltip-feed-rss' => 'à´ˆ താളിനàµà´±àµ† ആർ.à´Žà´¸àµ.à´Žà´¸àµ. ഫീഡàµ',
-'tooltip-feed-atom' => 'à´ˆ താളിനàµà´±àµ† ആറàµà´±à´‚ ഫീഡàµ',
-'tooltip-t-contributions' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഭാവനകളàµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാണàµà´•',
-'tooltip-t-emailuser' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµà´•',
-'tooltip-t-upload' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´µà´¾àµ»',
-'tooltip-t-specialpages' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¤à´¾à´³àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
-'tooltip-t-print' => 'à´ˆ താളിനàµà´±àµ† à´…à´šàµà´šà´Ÿà´¿ രൂപം',
-'tooltip-t-permalink' => 'താളിനàµà´±àµ† à´ˆ പതിപàµà´ªà´¿à´¨àµà´±àµ† à´¸àµà´¥à´¿à´°à´‚ à´•à´£àµà´£à´¿',
-'tooltip-ca-nstab-main' => 'വിവരദായക താൾ കാണàµà´•',
-'tooltip-ca-nstab-user' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† താൾ കാണàµà´•',
-'tooltip-ca-nstab-media' => 'മീഡിയ താൾ കാണàµà´•',
-'tooltip-ca-nstab-special' => "ഇതൊരൠ'''à´ªàµà´°à´¤àµà´¯àµ‡à´•''' താളാണàµâ€Œ. ഇതൠതിരàµà´¤àµà´¤àµà´• സാധàµà´¯à´®à´²àµà´².",
-'tooltip-ca-nstab-project' => 'പദàµà´§à´¤à´¿ താൾ കാണàµà´•',
-'tooltip-ca-nstab-image' => 'à´ªàµà´°à´®à´¾à´£ താൾ കാണàµà´•',
-'tooltip-ca-nstab-mediawiki' => 'à´µàµà´¯à´µà´¸àµà´¥à´¾à´¸à´¨àµà´¦àµ‡à´¶à´‚ കാണàµà´•',
-'tooltip-ca-nstab-template' => 'ഫലകം കാണàµà´•',
-'tooltip-ca-nstab-help' => 'സഹായം താൾ കാണàµà´•',
-'tooltip-ca-nstab-category' => 'വർഗàµà´—à´‚ താൾ കാണàµà´•',
-'tooltip-minoredit' => 'ഇതൠഒരൠചെറàµà´¤à´¿à´°àµà´¤àµà´¤à´²à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
-'tooltip-save' => 'മാറàµà´±à´™àµà´™àµ¾ സംരകàµà´·à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'tooltip-preview' => 'താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ† ഫലം à´Žà´™àµà´™à´¨àµ†à´¯à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´®àµ†à´¨àµà´¨àµ കാണàµà´¨àµà´¨à´¤à´¿à´¨àµ താൾ സംരകàµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ à´ˆ ബടàµà´Ÿàµº ഉപയോഗികàµà´•àµà´•!',
-'tooltip-diff' => 'താങàµà´•àµ¾ ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿àµ½ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ à´à´¤àµŠà´•àµà´•àµ†à´¯àµ†à´¨àµà´¨àµ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
-'tooltip-compareselectedversions' => 'à´ˆ താളിനàµà´±àµ† താങàµà´•àµ¾ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ à´°à´£àµà´Ÿàµ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ കാണàµà´•.',
-'tooltip-watch' => 'à´ˆ താൾ താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±àµà´•.',
-'tooltip-recreate' => 'താൾ മായàµà´šàµà´šà´¤à´¾à´£àµ†à´™àµà´•à´¿à´²àµà´‚ à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´•',
-'tooltip-upload' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ à´¤àµà´Ÿà´™àµà´™àµà´•',
-'tooltip-rollback' => 'അവസാനതàµà´¤àµ† ആൾ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•à´³àµ† ഒരൊറàµà´± à´•àµà´²à´¿à´•àµà´•àµ കൊണàµà´Ÿàµ à´®àµàµ» അവസàµà´¥à´¯à´¿à´²àµ‡à´•àµà´•àµ തിരിചàµà´šàµà´µàµ†à´¯àµà´•àµà´•à´¾àµ» "റോൾബാകàµà´•àµ" സഹായികàµà´•àµà´¨àµà´¨àµ.',
-'tooltip-undo' => 'മാറàµà´±à´‚ തിരസàµà´•à´°à´¿à´•àµà´•àµà´• à´Žà´¨àµà´¨à´¤àµ à´ˆ മാറàµà´±à´‚ à´®àµàµ» അവസàµà´¥à´¯à´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±àµà´•à´¯àµà´‚ അതൠഎഡിറàµà´±àµ ഫോമിൽ à´ªàµà´°à´¿à´µàµà´¯àµ‚ ആയി കാടàµà´Ÿàµà´•à´¯àµà´‚ ചെയàµà´¯àµà´‚. à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† കാരണം à´šàµà´°àµà´•àµà´•à´®à´¾à´¯à´¿ നൽകാൻ സാധികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
-'tooltip-preferences-save' => 'à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ ഓർതàµà´¤àµà´µàµ†à´¯àµà´•àµà´•àµà´•',
-'tooltip-summary' => 'ചെറിയൊരൠചàµà´°àµà´•àµà´•à´‚ ചേർകàµà´•àµà´•',
+'tooltip-pt-userpage' => 'താങàµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒà´¤à´¾àµ¾',
+'tooltip-pt-anonuserpage' => 'താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസതàµà´¤à´¿à´¨àµà´±àµ† ഉപയോകàµà´¤àµƒà´¤à´¾àµ¾',
+'tooltip-pt-mytalk' => 'താങàµà´•à´³àµà´Ÿàµ† സംവാദം താൾ',
+'tooltip-pt-anontalk' => 'à´ˆ à´.പി. വിലാസതàµà´¤à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´³àµà´³ തിരàµà´¤àµà´¤à´²àµà´•à´³àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ സം‌വാദം',
+'tooltip-pt-preferences' => 'താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾',
+'tooltip-pt-watchlist' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿à´²àµ† മാറàµà´±à´™àµà´™àµ¾',
+'tooltip-pt-mycontris' => 'താങàµà´•à´³àµà´Ÿàµ† സേവനങàµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
+'tooltip-pt-login' => 'ലോഗിൻ ചെയàµà´¯à´£à´®àµ†à´¨àµà´¨àµ നിർബനàµà´§à´‚ ഇലàµà´²àµ†à´™àµà´•à´¿à´²àµà´‚ ലോഗിൻ ചെയàµà´¯àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.',
+'tooltip-pt-anonlogin' => 'ലോഗിൻ ചെയàµà´¤àµ തിരàµà´¤àµà´¤àµ½ നടതàµà´¤àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.',
+'tooltip-pt-logout' => 'ലോഗൗടàµà´Ÿàµ ചെയàµà´¯à´¾à´¨àµà´³àµà´³ à´•à´£àµà´£à´¿',
+'tooltip-ca-talk' => 'വിവരദായക താളിനെകàµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ ചർചàµà´š',
+'tooltip-ca-edit' => 'താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താൾ തിരàµà´¤àµà´¤à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ. തിരàµà´¤àµà´¤à´¿à´¯ താൾ സേവൠചെയàµà´¯àµ‚à´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ à´ªàµà´°à´¿à´µàµà´¯àµ‚ കാണàµà´•.',
+'tooltip-ca-addsection' => 'à´ªàµà´¤à´¿à´¯ വിഭാഗം à´¤àµà´Ÿà´™àµà´™àµà´•',
+'tooltip-ca-viewsource' => 'à´ˆ താൾ സം‌രകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താളിനàµà´±àµ† മൂലരൂപം കാണാവàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.',
+'tooltip-ca-history' => 'à´ˆ താളിനàµà´±àµ† പഴയ പതിപàµà´ªàµà´•àµ¾.',
+'tooltip-ca-protect' => 'à´ˆ താൾ സം‌രകàµà´·à´¿à´•àµà´•àµà´•',
+'tooltip-ca-unprotect' => 'à´ˆ താളിനàµà´±àµ† സംരകàµà´·à´£à´¤àµà´¤à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
+'tooltip-ca-delete' => 'à´ˆ താൾ നീകàµà´•à´‚ ചെയàµà´¯àµà´•',
+'tooltip-ca-undelete' => 'à´ˆ താൾ നീകàµà´•à´‚ ചെയàµà´¤à´¤à´¿à´¨àµà´®àµà´®àµà´ªàµ വരàµà´¤àµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•',
+'tooltip-ca-move' => 'à´ˆ താളിനàµà´±àµ† തലകàµà´•àµ†à´Ÿàµà´Ÿàµàµâ€Œ മാറàµà´±àµà´•',
+'tooltip-ca-watch' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´ˆ താൾ ചേർകàµà´•àµà´•',
+'tooltip-ca-unwatch' => 'à´ˆ താൾ ഞാൻ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½à´¨à´¿à´¨àµà´¨àµ നീകàµà´•àµà´•',
+'tooltip-search' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ തിരയàµà´•',
+'tooltip-search-go' => 'à´ˆ പേരിൽ ഒരൠതാളàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½ അതിലേകàµà´•àµ പോവàµà´•.',
+'tooltip-search-fulltext' => 'à´ˆ പദമàµà´³àµà´³ താളàµà´•àµ¾ തേടàµà´•',
+'tooltip-p-logo' => 'à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•',
+'tooltip-n-mainpage' => 'à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•',
+'tooltip-n-mainpage-description' => 'à´ªàµà´°à´§à´¾à´¨à´¤à´¾àµ¾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•',
+'tooltip-n-portal' => 'പദàµà´§à´¤à´¿ താളിനെകàµà´•àµà´±à´¿à´šàµà´šàµ, താങàµà´•àµ¾à´•àµà´•àµ†à´¨àµà´¤àµŠà´•àµà´•àµ† ചെയàµà´¯à´¾à´‚, കാരàµà´¯à´™àµà´™àµ¾ എവിടെനിനàµà´¨àµ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´‚',
+'tooltip-n-currentevents' => 'സമകാലീനസംഭവങàµà´™à´³àµà´Ÿàµ† പശàµà´šà´¾à´¤àµà´¤à´²à´‚ à´…à´¨àµà´µàµ‡à´·à´¿à´•àµà´•àµà´•',
+'tooltip-n-recentchanges' => 'വികàµà´•à´¿à´¯à´¿à´²àµ† സമീപകാലമാറàµà´±à´™àµà´™àµ¾',
+'tooltip-n-randompage' => 'à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ ഒരൠതാൾ à´¤àµà´±à´•àµà´•àµ‚',
+'tooltip-n-help' => 'സഹായം ലഭàµà´¯à´®à´¾à´¯ ഇടം',
+'tooltip-t-whatlinkshere' => 'à´ˆ താളിലേകàµà´•àµ à´•à´£àµà´£à´¿à´¯à´¾àµ½ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´Žà´²àµà´²à´¾ വികàµà´•à´¿ താളàµà´•à´³àµà´Ÿàµ‡à´¯àµà´‚ പടàµà´Ÿà´¿à´•.',
+'tooltip-t-recentchangeslinked' => 'താളàµà´•à´³à´¿à´²àµ† à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾',
+'tooltip-feed-rss' => 'à´ˆ താളിനàµà´±àµ† ആർ.à´Žà´¸àµ.à´Žà´¸àµ. ഫീഡàµ',
+'tooltip-feed-atom' => 'à´ˆ താളിനàµà´±àµ† ആറàµà´±à´‚ ഫീഡàµ',
+'tooltip-t-contributions' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഭാവനകളàµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാണàµà´•',
+'tooltip-t-emailuser' => 'à´ˆ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ ഇമെയിൽ അയകàµà´•àµà´•',
+'tooltip-t-upload' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´µà´¾àµ»',
+'tooltip-t-specialpages' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¤à´¾à´³àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
+'tooltip-t-print' => 'à´ˆ താളിനàµà´±àµ† à´…à´šàµà´šà´Ÿà´¿ രൂപം',
+'tooltip-t-permalink' => 'താളിനàµà´±àµ† à´ˆ പതിപàµà´ªà´¿à´¨àµà´±àµ† à´¸àµà´¥à´¿à´°à´‚ à´•à´£àµà´£à´¿',
+'tooltip-ca-nstab-main' => 'വിവരദായക താൾ കാണàµà´•',
+'tooltip-ca-nstab-user' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† താൾ കാണàµà´•',
+'tooltip-ca-nstab-media' => 'മീഡിയ താൾ കാണàµà´•',
+'tooltip-ca-nstab-special' => "ഇതൊരൠ'''à´ªàµà´°à´¤àµà´¯àµ‡à´•''' താളാണàµâ€Œ. ഇതൠതിരàµà´¤àµà´¤àµà´• സാധàµà´¯à´®à´²àµà´².",
+'tooltip-ca-nstab-project' => 'പദàµà´§à´¤à´¿ താൾ കാണàµà´•',
+'tooltip-ca-nstab-image' => 'à´ªàµà´°à´®à´¾à´£ താൾ കാണàµà´•',
+'tooltip-ca-nstab-mediawiki' => 'à´µàµà´¯à´µà´¸àµà´¥à´¾à´¸à´¨àµà´¦àµ‡à´¶à´‚ കാണàµà´•',
+'tooltip-ca-nstab-template' => 'ഫലകം കാണàµà´•',
+'tooltip-ca-nstab-help' => 'സഹായം താൾ കാണàµà´•',
+'tooltip-ca-nstab-category' => 'വർഗàµà´—à´‚ താൾ കാണàµà´•',
+'tooltip-minoredit' => 'ഇതൠഒരൠചെറàµà´¤à´¿à´°àµà´¤àµà´¤à´²à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
+'tooltip-save' => 'മാറàµà´±à´™àµà´™àµ¾ സംരകàµà´·à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'tooltip-preview' => 'താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ† ഫലം à´Žà´™àµà´™à´¨àµ†à´¯à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´®àµ†à´¨àµà´¨àµ കാണàµà´¨àµà´¨à´¤à´¿à´¨àµ താൾ സംരകàµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµàµ»à´ªàµ à´ˆ ബടàµà´Ÿàµº ഉപയോഗികàµà´•àµà´•!',
+'tooltip-diff' => 'താങàµà´•àµ¾ ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿àµ½ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ à´à´¤àµŠà´•àµà´•àµ†à´¯àµ†à´¨àµà´¨àµ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+'tooltip-compareselectedversions' => 'à´ˆ താളിനàµà´±àµ† താങàµà´•àµ¾ തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ à´°à´£àµà´Ÿàµ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ കാണàµà´•.',
+'tooltip-watch' => 'à´ˆ താൾ താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±àµà´•.',
+'tooltip-watchlistedit-normal-submit' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´•àµ¾ നീകàµà´•à´‚ചെയàµà´¯àµà´•',
+'tooltip-watchlistedit-raw-submit' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• à´ªàµà´¤àµà´•àµà´•àµà´•',
+'tooltip-recreate' => 'താൾ മായàµà´šàµà´šà´¤à´¾à´£àµ†à´™àµà´•à´¿à´²àµà´‚ à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´•',
+'tooltip-upload' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ à´¤àµà´Ÿà´™àµà´™àµà´•',
+'tooltip-rollback' => 'അവസാനതàµà´¤àµ† ആൾ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•à´³àµ† ഒരൊറàµà´± à´•àµà´²à´¿à´•àµà´•àµ കൊണàµà´Ÿàµ à´®àµàµ» അവസàµà´¥à´¯à´¿à´²àµ‡à´•àµà´•àµ തിരിചàµà´šàµà´µàµ†à´¯àµà´•àµà´•à´¾àµ» "റോൾബാകàµà´•àµ" സഹായികàµà´•àµà´¨àµà´¨àµ.',
+'tooltip-undo' => 'മാറàµà´±à´‚ തിരസàµà´•à´°à´¿à´•àµà´•àµà´• à´Žà´¨àµà´¨à´¤àµ à´ˆ മാറàµà´±à´‚ à´®àµàµ» അവസàµà´¥à´¯à´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±àµà´•à´¯àµà´‚ അതൠഎഡിറàµà´±àµ ഫോമിൽ à´ªàµà´°à´¿à´µàµà´¯àµ‚ ആയി കാടàµà´Ÿàµà´•à´¯àµà´‚ ചെയàµà´¯àµà´‚. à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† കാരണം à´šàµà´°àµà´•àµà´•à´®à´¾à´¯à´¿ നൽകാൻ സാധികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'tooltip-preferences-save' => 'à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ ഓർതàµà´¤àµà´µàµ†à´¯àµà´•àµà´•àµà´•',
+'tooltip-summary' => 'ചെറിയൊരൠചàµà´°àµà´•àµà´•à´‚ ചേർകàµà´•àµà´•',
# Stylesheets
'common.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´Žà´²àµà´²à´¾ ദൃശàµà´¯à´°àµ‚പങàµà´™àµ¾à´•àµà´•àµà´‚ ബാധകമായിരികàµà´•àµà´‚ */',
@@ -2948,9 +2987,6 @@ $1',
# Patrol log
'patrol-log-page' => 'റോനàµà´¤àµà´šàµà´±àµà´±àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–',
'patrol-log-header' => 'റോനàµà´¤àµà´šàµà´±àµà´±à´ªàµà´ªàµ†à´Ÿàµà´Ÿ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† രേഖയാണിതàµ',
-'patrol-log-line' => '$2 താളിലെ $1 റോനàµà´¤àµà´šàµà´±àµà´±à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ $3',
-'patrol-log-auto' => '(à´¸àµà´µà´¯à´‚)',
-'patrol-log-diff' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ $1',
'log-show-hide-patrol' => 'റോനàµà´¤àµà´šàµà´±àµà´±àµ½ രേഖ $1',
# Image deletion
@@ -2976,11 +3012,11 @@ $1',
'file-info' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $1, മൈം തരം: $2',
'file-info-size' => '$1 × $2 പികàµà´¸àµ½, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3, മൈം തരം: $4',
'file-info-size-pages' => '$1 × $2 പികàµà´¸àµ½, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3, മൈം തരം: $4, {{PLURAL:$5|ഒരൠതാൾ|$5 താളàµà´•àµ¾}}',
-'file-nohires' => '<small>കൂടàµà´¤àµ½ à´µàµà´¯à´•àµà´¤à´¤à´¯àµà´³àµà´³ à´šà´¿à´¤àµà´°à´‚ ലഭàµà´¯à´®à´²àµà´².</small>',
+'file-nohires' => 'കൂടàµà´¤àµ½ à´µàµà´¯à´•àµà´¤à´¤à´¯àµà´³àµà´³ à´šà´¿à´¤àµà´°à´‚ ലഭàµà´¯à´®à´²àµà´².',
'svg-long-desc' => 'SVG à´ªàµà´°à´®à´¾à´£à´‚, നാമമാതàµà´°à´®à´¾à´¯ $1 × $2 പികàµà´¸à´²àµà´•àµ¾, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3',
'show-big-image' => 'പൂർണàµà´£ റെസലൂഷൻ',
-'show-big-image-preview' => '<small>à´ˆ à´ªàµà´°à´¿à´µàµà´¯àµ‚വിനàµà´±àµ† വലിപàµà´ªà´‚: $1.</small>',
-'show-big-image-other' => '<small>മറàµà´±àµ റെസലൂഷനàµà´•àµ¾: $1.</small>',
+'show-big-image-preview' => 'à´ˆ à´ªàµà´°à´¿à´µàµà´¯àµ‚വിനàµà´±àµ† വലിപàµà´ªà´‚: $1.',
+'show-big-image-other' => 'മറàµà´±àµ {{PLURAL:$2|റെസലൂഷൻ|റെസലൂഷനàµà´•àµ¾}}: $1.',
'show-big-image-size' => '$1 × $2 പികàµà´¸à´²àµà´•àµ¾',
'file-info-gif-looped' => 'à´ªàµà´¨à´°à´¾à´µàµ¼à´¤àµà´¤à´¿à´¤à´‚',
'file-info-gif-frames' => '{{PLURAL:$1|ഒരൠചടàµà´Ÿà´‚|$1 à´šà´Ÿàµà´Ÿà´™àµà´™àµ¾}}',
@@ -3000,6 +3036,13 @@ $1',
'bydate' => 'ദിനകàµà´°à´®à´¤àµà´¤à´¿àµ½',
'sp-newimages-showfrom' => '$2, $1 നൠശേഷം à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|ഒരൠസെകàµà´•à´¨àµà´±àµ|$1 സെകàµà´•à´¨àµà´±àµ}}',
+'minutes' => '{{PLURAL:$1|ഒരൠമിനിറàµà´±àµ|$1 മിനിറàµà´±àµ}}',
+'hours' => '{{PLURAL:$1|ഒരൠമണികàµà´•àµ‚ർ|$1 മണികàµà´•àµ‚ർ}}',
+'days' => '{{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസം}}',
+'ago' => '$1 à´®àµà´®àµà´ªàµ',
+
# Bad image list
'bad_image_list' => 'à´Žà´´àµà´¤àµà´¤àµ രീതി താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
@@ -3478,13 +3521,6 @@ $5
'scarytranscludefailed' => '[$1-നൠഫലകം à´•à´£àµà´Ÿàµà´ªà´¿à´Ÿà´¿à´•àµà´•à´¾àµ» പറàµà´±à´¿à´¯à´¿à´²àµà´²]',
'scarytranscludetoolong' => '[വളരെ നീളകàµà´•àµ‚à´Ÿàµà´¤à´²àµà´³àµà´³ യൂ.ആർ.എൽ.]',
-# Trackbacks
-'trackbackbox' => 'à´ˆ താളിനàµà´³àµà´³ പിനàµà´¤àµà´Ÿà´°à´²àµà´•àµ¾: <br />
-$1',
-'trackbackremove' => '([$1 മായàµà´•àµà´•àµà´•])',
-'trackbacklink' => 'പിനàµà´¤àµà´Ÿà´°àµ½',
-'trackbackdeleteok' => 'à´ˆ പിനàµà´¤àµà´Ÿà´°àµ½ വിജയകരമായി മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
-
# Delete conflict
'deletedwhileediting' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ''': താങàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» à´¤àµà´Ÿà´™àµà´™à´¿à´¯ ശേഷം താൾ മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ!",
'confirmrecreate' => "താങàµà´•àµ¾ à´ˆ താൾ തിരàµà´¤àµà´¤à´¾àµ» à´¤àµà´Ÿà´™àµà´™à´¿à´¯à´¤à´¿à´¨àµà´¶àµ‡à´·à´‚ [[User:$1|$1]] ([[User talk:$1|talk]]) à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ ഇങàµà´™à´¨àµ† ഒരൠകാരണം നൽകി à´ˆ താൾ നീകàµà´•à´‚ ചെയàµà´¤àµ:
@@ -3563,6 +3599,9 @@ $1',
'watchlisttools-edit' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാടàµà´Ÿàµà´•, തിരàµà´¤àµà´¤àµà´•',
'watchlisttools-raw' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† മൂലരൂപം തിരàµà´¤àµà´¤àµà´•',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|സംവാദം]])',
+
# Core parser functions
'unknown_extension_tag' => 'à´…à´œàµà´žà´¾à´¤à´®à´¾à´¯ à´…à´¨àµà´¬à´¨àµà´§ à´±àµà´±à´¾à´—ൠ"$1"',
'duplicate-defaultsort' => '\'\'\'à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:\'\'\' à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ ചാവിയായ "$2" à´®àµà´®àµà´ªàµ à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ ചാവിയായിരàµà´¨àµà´¨ "$1" à´Žà´¨àµà´¨à´¤à´¿à´¨àµ† അതിലംഘികàµà´•àµà´¨àµà´¨àµ.',
@@ -3661,13 +3700,16 @@ $1',
'tags-hitcount' => '{{PLURAL:$1|ഒരൠമാറàµà´±à´‚|$1 മാറàµà´±à´™àµà´™àµ¾}}',
# Special:ComparePages
-'comparepages' => 'താളàµà´•àµ¾ താരതമàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
-'compare-selector' => 'താളിനàµà´±àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾ താരതമàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
-'compare-page1' => 'താൾ 1',
-'compare-page2' => 'താൾ 2',
-'compare-rev1' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ 1',
-'compare-rev2' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ 2',
-'compare-submit' => 'താരതമàµà´¯à´‚ ചെയàµà´¯àµà´•',
+'comparepages' => 'താളàµà´•àµ¾ താരതമàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
+'compare-selector' => 'താളിനàµà´±àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾ താരതമàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
+'compare-page1' => 'താൾ 1',
+'compare-page2' => 'താൾ 2',
+'compare-rev1' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ 1',
+'compare-rev2' => 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ 2',
+'compare-submit' => 'താരതമàµà´¯à´‚ ചെയàµà´¯àµà´•',
+'compare-invalid-title' => 'താങàµà´•àµ¾ നൽകിയ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ അസാധàµà´µà´¾à´£àµ.',
+'compare-title-not-exists' => 'താങàµà´•àµ¾ നൽകിയ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ നിലവിലിലàµà´².',
+'compare-revision-not-exists' => 'താങàµà´•àµ¾ à´µàµà´¯à´•àµà´¤à´®à´¾à´•àµà´•à´¿à´¯ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ നിലവിലിലàµà´².',
# Database error messages
'dberr-header' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ à´ªàµà´°à´¶àµà´¨à´®àµà´£àµà´Ÿàµ',
@@ -3695,4 +3737,88 @@ $1',
'sqlite-has-fts' => 'പൂർണàµà´£-à´Žà´´àµà´¤àµà´¤àµ തിരചàµà´šà´¿àµ½ പിനàµà´¤àµà´£à´¯àµà´³àµà´³ $1',
'sqlite-no-fts' => 'പൂർണàµà´£-à´Žà´´àµà´¤àµà´¤àµ തിരചàµà´šà´¿àµ½ പിനàµà´¤àµà´£à´¯à´¿à´²àµà´²à´¾à´¤àµà´¤ $1',
+# New logging system
+'logentry-delete-delete' => '$3 à´Žà´¨àµà´¨ താൾ $1 മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-delete-restore' => '$3 à´Žà´¨àµà´¨ താൾ $1 à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-delete-event' => '$3 à´Žà´¨àµà´¨ {{PLURAL:$5|രേഖയിലെ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ†|രേഖയിലെ $5 മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†}} ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
+'logentry-delete-revision' => '$3 à´Žà´¨àµà´¨ താളിലെ {{PLURAL:$5|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$5 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
+'logentry-delete-event-legacy' => '$3 à´Žà´¨àµà´¨ രേഖയിലെ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-delete-revision-legacy' => '$3 à´Žà´¨àµà´¨ താളിലെ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-suppress-delete' => '$3 à´Žà´¨àµà´¨ താൾ $1 à´’à´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-suppress-event' => '$3 à´Žà´¨àµà´¨ {{PLURAL:$5|രേഖയിലെ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ†|രേഖയിലെ $5 മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†}} ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
+'logentry-suppress-revision' => '$3 à´Žà´¨àµà´¨ താളിലെ {{PLURAL:$5|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$5 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
+'logentry-suppress-event-legacy' => '$3 à´Žà´¨àµà´¨ രേഖയിലെ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-suppress-revision-legacy' => '$3 à´Žà´¨àµà´¨ താളിലെ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-content-hid' => 'ഉളàµà´³à´Ÿà´•àµà´•à´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-summary-hid' => 'തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† à´šàµà´°àµà´•àµà´•à´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-uname-hid' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-content-unhid' => 'ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† മറയàµà´•àµà´•àµ½ നീകàµà´•à´‚ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-summary-unhid' => 'തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† à´šàµà´°àµà´•àµà´•à´‚ മറചàµà´šà´¤àµ ഒഴിവാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-uname-unhid' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ മറചàµà´šà´¤àµ ഒഴിവാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-restricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'revdelete-unrestricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ നീകàµà´•à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-move-move' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $3 à´Žà´¨àµà´¨ താൾ $4 ആയി മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-move-move-noredirect' => '$3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´¯àµà´•àµà´•àµ തിരിചàµà´šàµà´µà´¿à´Ÿà´²à´¿à´²àµà´²à´¾à´¤àµ† $1 മാറàµà´±à´¿',
+'logentry-patrol-patrol' => '$3 à´Žà´¨àµà´¨ താളിനàµà´±àµ† $4 à´Žà´¨àµà´¨ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ $1 അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-patrol-patrol-auto' => '$3 à´Žà´¨àµà´¨ താളിനàµà´±àµ† $4 à´Žà´¨àµà´¨ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ $1 à´¸àµà´µà´¤àµ‡ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-newusers-newusers' => '$1 ഒരൠഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-newusers-create' => '$1 ഒരൠഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-newusers-create2' => '$3 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ $1 സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-newusers-autocreate' => '$1 à´Žà´¨àµà´¨ à´…à´‚à´—à´¤àµà´µà´‚ à´¸àµà´µà´¯à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'newuserlog-byemail' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´‡-മെയിൽ വഴി അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+
+# Feedback
+'feedback-bugornote' => 'സാങàµà´•àµ‡à´¤à´¿à´• à´ªàµà´°à´¶àµà´¨à´‚ à´Žà´¨àµà´¤à´¾à´£àµ†à´¨àµà´¨àµ വിവരിചàµà´šàµ†à´´àµà´¤à´¾àµ» താങàµà´•àµ¾ തയàµà´¯à´¾à´±à´¾à´£àµ†à´™àµà´•à´¿àµ½ [$1 ബഗൠഅറിയികàµà´•àµà´•].
+à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ താങàµà´•àµ¾à´•àµà´•àµ താഴെ à´Žà´³àµà´ªàµà´ªà´¤àµà´¤à´¿à´¨à´¾à´¯à´¿ നൽകിയിരികàµà´•àµà´¨àµà´¨ ഫോം ഉപയോഗികàµà´•à´¾à´‚. താങàµà´•à´³àµà´Ÿàµ† à´•àµà´±à´¿à´ªàµà´ªàµ "[$3 $2]" താളിൽ, താങàµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´µàµà´‚ ഉപയോഗികàµà´•àµà´¨àµà´¨ à´¬àµà´°àµ—സറിനàµà´±àµ† പേരോടàµà´‚ കൂടി ചേർകàµà´•àµà´¨àµà´¨à´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚.',
+'feedback-subject' => 'വിഷയം:',
+'feedback-message' => 'സനàµà´¦àµ‡à´¶à´‚:',
+'feedback-cancel' => 'റദàµà´¦à´¾à´•àµà´•àµà´•',
+'feedback-submit' => 'à´…à´­à´¿à´ªàµà´°à´¾à´¯à´‚ സമർപàµà´ªà´¿à´•àµà´•àµà´•',
+'feedback-adding' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´­à´¿à´ªàµà´°à´¾à´¯à´™àµà´™àµ¾ താളിലേയàµà´•àµà´•àµ ചേർകàµà´•àµà´¨àµà´¨àµ...',
+'feedback-error1' => 'പിഴവàµ: à´Ž.പി.à´.യിൽ നിനàµà´¨àµà´‚ തിരിചàµà´šà´±à´¿à´¯à´¾à´¨à´¾à´•à´¾à´¤àµà´¤ ഫലം',
+'feedback-error2' => 'പിഴവàµ: തിരàµà´¤àµà´¤àµ½ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ',
+'feedback-error3' => 'പിഴവàµ: à´Ž.പി.à´.യിൽ നിനàµà´¨àµà´‚ യാതൊരൠപàµà´°à´¤à´¿à´•à´°à´£à´µàµà´®à´¿à´²àµà´²',
+'feedback-thanks' => 'നനàµà´¦à´¿! താങàµà´•à´³àµà´Ÿàµ† à´ªàµà´°à´¤à´¿à´•à´°à´£à´‚ "[$2 $1]" à´Žà´¨àµà´¨ താളിൽ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
+'feedback-close' => 'ചെയàµà´¤àµ à´•à´´à´¿à´žàµà´žàµ.',
+'feedback-bugcheck' => 'കൊളàµà´³à´¾à´‚! [$1 അറിയാവàµà´¨àµà´¨ ബഗàµà´•à´³à´¿àµ½] à´’à´¨àµà´¨à´²àµà´² à´Žà´¨àµà´¨àµ à´’à´¨àµà´¨àµ പരിശോധിചàµà´šàµ‡à´•àµà´•àµà´•.',
+'feedback-bugnew' => 'ഞാൻ പരിശോധിചàµà´šàµ. à´ªàµà´¤à´¿à´¯àµŠà´°àµ ബഗൠചേർകàµà´•àµà´•',
+
+# API errors
+'api-error-badaccess-groups' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯à´¾àµ» താങàµà´•àµ¾à´•àµà´•à´¨àµà´µà´¾à´¦à´®à´¿à´²àµà´².',
+'api-error-badtoken' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´—àµà´£à´•à´°à´®à´²àµà´²à´¾à´¤àµà´¤ ചീടàµà´Ÿàµ.',
+'api-error-copyuploaddisabled' => 'യൂ.ആർ.എൽ. ഉപയോഗിചàµà´šàµà´³àµà´³ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ à´ˆ സെർവറിൽ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´¸à´œàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'api-error-duplicate' => 'വികàµà´•à´¿à´¯à´¿àµ½ ഇതേ ഉളàµà´³à´Ÿà´•àµà´•à´®àµà´³àµà´³ {{PLURAL:$1|[$2 മറàµà´±àµŠà´°àµ à´ªàµà´°à´®à´¾à´£à´‚]|[$2 മറàµà´±àµ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾]}} à´®àµà´®àµà´ªàµ‡à´¯àµà´£àµà´Ÿàµ.',
+'api-error-duplicate-archive' => 'സൈറàµà´±à´¿àµ½ ഇതേ ഉളàµà´³à´Ÿà´•àµà´•à´®àµà´³àµà´³ {{PLURAL:$1|[$2 മറàµà´±àµŠà´°àµ à´ªàµà´°à´®à´¾à´£à´‚]|[$2 മറàµà´±àµ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾]}} ഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨àµ, പകàµà´·àµ‡ {{PLURAL:$1|à´…à´¤àµ|à´…à´µ}} മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
+'api-error-duplicate-archive-popup-title' => 'പകർപàµà´ªàµ {{PLURAL:$1|à´ªàµà´°à´®à´¾à´£à´‚|à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾}} à´®àµà´®àµà´ªàµ‡à´¤à´¨àµà´¨àµ† മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ',
+'api-error-duplicate-popup-title' => 'അപര{{PLURAL:$1|à´ªàµà´°à´®à´¾à´£à´‚|à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾}}',
+'api-error-empty-file' => 'താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´ªàµà´°à´®à´¾à´£à´‚ ശൂനàµà´¯à´®à´¾à´£àµ.',
+'api-error-emptypage' => 'ശൂനàµà´¯à´®à´¾à´¯ à´ªàµà´¤à´¿à´¯ താളàµà´•àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
+'api-error-fetchfileerror' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´ªàµà´°à´®à´¾à´£à´‚ ശേഖരിചàµà´šàµà´•àµŠà´£àµà´Ÿà´¿à´°àµà´¨àµà´¨à´ªàµà´ªàµ‹àµ¾ à´Žà´¨àµà´¤àµ‹ പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿.',
+'api-error-file-too-large' => 'താങàµà´•àµ¾ സമർപàµà´ªà´¿à´šàµà´š à´ªàµà´°à´®à´¾à´£à´‚ വളരെ വലàµà´¤à´¾à´£àµ.',
+'api-error-filename-tooshort' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠവളരെചàµà´šàµ†à´±àµà´¤à´¾à´£àµ.',
+'api-error-filetype-banned' => 'à´ˆ തരതàµà´¤à´¿à´²àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ നിരോധിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'api-error-filetype-missing' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ à´Žà´•àµà´¸àµâ€Œà´±àµà´±àµ†àµ»à´·àµ» ഇലàµà´².',
+'api-error-hookaborted' => 'താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´š മാറàµà´±à´‚ ഒരൠഅനàµà´¬à´¨àµà´§à´¤àµà´¤à´¿à´¨àµà´±àµ† കൊളàµà´¤àµà´¤à´¿à´¨à´¾àµ½ റദàµà´¦à´¾à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
+'api-error-http' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: സെർവറàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´¾àµ» à´•à´´à´¿à´¯àµà´¨àµà´¨à´¿à´²àµà´².',
+'api-error-illegal-filename' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠഅനàµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´².',
+'api-error-internal-error' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: താങàµà´•à´³àµà´Ÿàµ† à´…à´ªàµâ€Œà´²àµ‹à´¡àµ കൈകാരàµà´¯à´‚ ചെയàµà´¤à´ªàµà´ªàµ‹àµ¾ à´Žà´¨àµà´¤àµ‹ à´•àµà´´à´ªàµà´ªà´£àµà´Ÿà´¾à´¯à´¿.',
+'api-error-invalid-file-key' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: താതàµà´•à´¾à´²à´¿à´• സംഭരണിയിൽ നിനàµà´¨àµ à´ªàµà´°à´®à´¾à´£à´‚ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´².',
+'api-error-missingparam' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´ˆ à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨à´¯à´¿àµ½ ആവശàµà´¯à´®à´¾à´¯ à´šà´°à´™àµà´™àµ¾ ലഭിചàµà´šà´¿à´²àµà´².',
+'api-error-missingresult' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: പകർതàµà´¤àµ½ വിജയകരമായിരàµà´¨àµà´¨àµ‹ à´Žà´¨àµà´¨àµ നിർണàµà´£à´¯à´¿à´•àµà´•à´¾à´¨à´¾à´µàµà´¨àµà´¨à´¿à´²àµà´².',
+'api-error-mustbeloggedin' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯à´¾àµ» താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+'api-error-mustbeposted' => 'à´ˆ സോഫàµà´±àµà´±àµâ€Œà´µàµ‡à´±à´¿àµ½ ബഗൠഉണàµà´Ÿàµ; ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤àµ ശരിയായ à´Žà´šàµà´šàµ.à´±àµà´±à´¿.à´±àµà´±à´¿.പി. രീതിയലàµà´².',
+'api-error-noimageinfo' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ വിജയകരമായിരàµà´¨àµà´¨àµ, പകàµà´·àµ‡ സെർവർ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµ യാതൊരൠവിവരവàµà´‚ ഇവിടെ തനàµà´¨à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'api-error-nomodule' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ഘടകം സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'api-error-ok-but-empty' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: സെർവറിൽ നിനàµà´¨àµ à´ªàµà´°à´¤à´¿à´•à´°à´£à´®àµŠà´¨àµà´¨àµà´‚ ലഭികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
+'api-error-overwrite' => 'നിലവിലàµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´®àµà´•à´³à´¿àµ½ à´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµ½ à´…à´¨àµà´µà´¦à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+'api-error-stashfailed' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´ªàµà´°à´®à´¾à´£à´‚ താതàµà´•à´¾à´²à´¿à´•à´®à´¾à´¯à´¿ സംഭരികàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ സെർവർ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
+'api-error-timeout' => 'à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ കാലാവധികàµà´•àµà´³àµà´³à´¿àµ½ സെർവർ à´ªàµà´°à´¤à´¿à´•à´°à´¿à´šàµà´šà´¿à´²àµà´².',
+'api-error-unclassified' => 'അപരിചിതമായ പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'api-error-unknown-code' => 'അപരിചിതമായ പിഴവàµ: "$1"',
+'api-error-unknown-error' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´ªàµà´°à´®à´¾à´£à´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯à´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ à´Žà´¨àµà´¤àµ‹ à´•àµà´´à´ªàµà´ªà´®àµà´£àµà´Ÿà´¾à´¯à´¿.',
+'api-error-unknown-warning' => 'അപരിചിതമായ à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: $1',
+'api-error-unknownerror' => 'അപരിചിതമായ പിഴവàµ: "$1".',
+'api-error-uploaddisabled' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ à´…à´ªàµâ€Œà´²àµ‹à´¡à´¿à´™àµ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ.',
+'api-error-verification-error' => 'à´ˆ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿àµ½ പിഴവàµà´£àµà´Ÿàµ, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ തെറàµà´±à´¾à´¯ à´Žà´•àµà´¸àµâ€Œà´±àµà´±àµ†àµ»à´·à´¨à´¾à´£àµà´³àµà´³à´¤àµ.',
+
);
diff --git a/languages/messages/MessagesMn.php b/languages/messages/MessagesMn.php
index b28bcdaf..dbd493ec 100644
--- a/languages/messages/MessagesMn.php
+++ b/languages/messages/MessagesMn.php
@@ -9,6 +9,7 @@
*
* @author Chinneeb
* @author E.shijir
+ * @author Kaganer
* @author Meno25
* @author Wisdom
* @author לערי ריינה×רט
@@ -399,20 +400,22 @@ $1',
'badarticleerror' => 'Ð­Ð½Ñ Ò¯Ð¹Ð»Ð´Ð»Ð¸Ð¹Ð³ ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñан дÑÑÑ€ гүйцÑтгÑÑ… боломжгүй байна.',
'cannotdelete' => '"$1" гÑÑÑн Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±ÑƒÑŽÑƒ файлыг уÑтгаж чадÑангүй.
Ó¨Ó©Ñ€ Ñ…ÑÑ€ÑглÑгч Ó©Ñ€Ñөж уÑтгаÑан байж магадгүй.',
+'cannotdelete-title' => '"$1" хуудÑыг уÑтгаж чадÑангүй',
'badtitle' => 'Болохгүй гарчиг',
'badtitletext' => 'ОруулÑан хуудаÑны нÑÑ€ тань хүчингүй, хооÑон, ÑÑвÑл буруу холбоÑон интер-Ñ…Ñл буюу интер-викигийн нÑÑ€ байна. ÐÑÑ€Ñнд Ñ…ÑÑ€ÑглÑгдÑж болохгүй Ñ‚ÑмдÑгт орÑон байж болзошгүй.',
-'perfcached' => 'Дараах тоо баримт нь нөөц хуулбар ÑƒÑ‡Ñ€Ð°Ð°Ñ Ñ…ÑƒÑƒÑ‡Ð¸Ñ€Ñан мÑдÑÑлÑлтÑй байж магадгүй.',
-'perfcachedts' => 'Дараах тоо баримт нөөц хуулбар бөгөөд хамгийн Ñүүлд $1-д шинÑчлÑгдÑÑн.',
+'perfcached' => 'Дараах тоо баримт нь нөөц хуулбар ÑƒÑ‡Ñ€Ð°Ð°Ñ Ñ…ÑƒÑƒÑ‡Ð¸Ñ€Ñан мÑдÑÑлÑлтÑй байж магадгүй. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Дараах тоо баримт нөөц хуулбар бөгөөд хамгийн Ñүүлд $1-д шинÑчлÑгдÑÑн. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Одоогийн байдлаар ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñанд шинÑчлÑлүүд хаагдÑан байна. Энд байгаа тоо баримт одоохондоо ÑÑргÑÑгдÑхгүй.',
'wrong_wfQuery_params' => 'wfQuery()-д буруу параметр оруулÑан байна<br />
Функц: $1<br />
ÐÑуудал: $2',
'viewsource' => 'Кодыг харах',
-'viewsourcefor' => '$1',
+'viewsource-title' => '$1 хуудÑын ÑÑ… Ñурвалжийг харах',
'actionthrottled' => 'ҮйлдÑл Ñ…Ñзгаарлагдлаа',
'actionthrottledtext' => 'Бид ÑÐ¿Ð°Ð¼Ð°Ð°Ñ Ñ…Ð°Ð¼Ð³Ð°Ð°Ð»Ð°Ñ…Ñ‹Ð½ тулд ÑÐ½Ñ Ò¯Ð¹Ð»Ð´Ð»Ð¸Ð¹Ð³ богино хугацаанд Ñ…ÑÑ‚ олон удаа давтахыг Ñ…Ñзгаарладаг. Та ÑнÑÑ…Ò¯Ò¯ Ñ…Ñзгаарт хүрÑÑн тул түр хүлÑÑгÑÑд дахин оролдоно уу.',
'protectedpagetext' => 'ЗаÑварлах Ñвдлыг Ñаатуулахын тулд ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн байна.',
'viewsourcetext' => 'Та ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны кодыг харах болон хуулж авах үйлдлийг хийх боломжтой:',
+'viewyourtext' => "Та ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñан дахь '''өөрийн өөрчлөлтөө''' хуулбарлаж, харж болно",
'protectedinterface' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹Ð½ харагдах байдалд ашиглагддаг текÑтийг агуулдаг тул түгжигдÑÑн байна.',
'editinginterface' => "'''Ðнхаар''': Та программын харагдах байдалд ашиглагддаг текÑтийг агуулÑан хуудÑыг заÑварлах гÑж байна.
Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñанд өөрчлөлт оруулÑнаар буÑад Ñ…ÑÑ€ÑглÑгчдийн программын харагдах байдалд нөлөөлөх болно.
@@ -518,6 +521,7 @@ $2',
'emailconfirmlink' => 'ÐœÑйл хаÑгаа баталгаажуулах',
'invalidemailaddress' => 'Таны мÑйл хаÑг нь хүчингүй форматтай байгаа тул зөвшөөрөгдөхгүй.
Зөв форматтай хаÑг оруул, ÑÑвÑл талбарыг хооÑлоно уу.',
+'cannotchangeemail' => 'Ð­Ð½Ñ Ð²Ð¸ÐºÐ¸-н бүртгÑлийн цахим шуудангийн хаÑг Ñолигдож болохгүй.',
'accountcreated' => 'БүртгÑл Ò¯Ò¯ÑгÑгдлÑÑ',
'accountcreatedtext' => '$1 Ñ…ÑÑ€ÑглÑгчийн бүртгÑл Ò¯Ò¯ÑгÑгдлÑÑ.',
'createaccount-title' => '{{SITENAME}}-н бүртгÑлийн Ò¯Ò¯ÑгÑл',
@@ -534,6 +538,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => "PHP's mail() функцÑд үл танигдах алдаа гарлаа.",
+'user-mail-no-addy' => 'Цахин шуудангийн хаÑгийг оруулалгүйгÑÑÑ€ шуудан Ñвуулахыг оролдлоо.',
# Change password dialog
'resetpass' => 'Ðууц үгÑÑ Ñолих',
@@ -555,18 +560,33 @@ $2',
'resetpass-temp-password' => 'Түр зуурын нууц үг:',
# Special:PasswordReset
-'passwordreset' => 'Ðууц үгийг ÑÑргÑÑÑ…',
-'passwordreset-text' => 'ЭнÑÑ…Ò¯Ò¯ маÑгтыг бөглөж Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллÑÑ Ð°Ð²Ð°Ð°Ñ€Ð°Ð¹.',
-'passwordreset-legend' => 'Ðууц үгÑÑ ÑÑргÑÑÑ…',
-'passwordreset-disabled' => 'Ð­Ð½Ñ Ð²Ð¸ÐºÐ¸-д нууц үгийг ÑÑргÑÑÑ… боломжгүй байна.',
-'passwordreset-pretext' => '{{PLURAL:$1||Доорх өгөгдлийн аль нÑг Ñ…ÑÑгийг оруулна уу}}',
-'passwordreset-username' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
-'passwordreset-domain' => 'Домайн:',
-'passwordreset-email' => 'Цахим шуудан:',
-'passwordreset-emailtitle' => '{{SITENAME}}-н бүртгÑлийн мÑдÑÑлÑл',
-'passwordreset-emailelement' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€: $1
+'passwordreset' => 'Ðууц үгийг ÑÑргÑÑÑ…',
+'passwordreset-text' => 'ЭнÑÑ…Ò¯Ò¯ маÑгтыг бөглөж Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллÑÑ Ð°Ð²Ð°Ð°Ñ€Ð°Ð¹.',
+'passwordreset-legend' => 'Ðууц үгÑÑ ÑÑргÑÑÑ…',
+'passwordreset-disabled' => 'Ð­Ð½Ñ Ð²Ð¸ÐºÐ¸-д нууц үгийг ÑÑргÑÑÑ… боломжгүй байна.',
+'passwordreset-pretext' => '{{PLURAL:$1||Доорх өгөгдлийн аль нÑг Ñ…ÑÑгийг оруулна уу}}',
+'passwordreset-username' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
+'passwordreset-domain' => 'Домайн:',
+'passwordreset-capture' => 'Цахим шуудангийн нууц үг ÑÑргÑÑÑ… шууданг үзÑÑ…',
+'passwordreset-capture-help' => 'Ð­Ð½Ñ Ð½Ò¯Ð´Ð¸Ð¹Ð³ чагталбал цахим шуудан түр нууц үгийн хамт танд Ñ…Ð°Ñ€Ð°Ð³Ð´Ð°Ñ…Ð°Ð°Ñ Ð³Ð°Ð´Ð½Ð°, шуудангаар тань очих болно.',
+'passwordreset-email' => 'Цахим шуудан:',
+'passwordreset-emailtitle' => '{{SITENAME}}-н бүртгÑлийн мÑдÑÑлÑл',
+'passwordreset-emailelement' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€: $1
Түр зуурын нууц үг: $2',
-'passwordreset-emailsent' => 'Сануулгын цахим шуудан Ñвууллаа.',
+'passwordreset-emailsent' => 'Сануулгын цахим шуудан Ñвууллаа.',
+'passwordreset-emailsent-capture' => 'Доор харуулÑнаар цахим шуудангийн Ñануулгыг Ñвууллаа.',
+'passwordreset-emailerror-capture' => 'Цахим шуудангийн Ñануулга доор харуулÑны дагуу хийгдÑан боловч $1 Ñ…ÑÑ€ÑглÑгчид хүрч чадÑангүй, алдаа гарлаа.',
+
+# Special:ChangeEmail
+'changeemail' => 'Цахим шуудангийн хаÑг Ñолих',
+'changeemail-header' => 'Цахим шуудангийн бүртгÑлийн хаÑг Ñолих',
+'changeemail-text' => 'Ð­Ð½Ñ Ð¼Ð°Ñгтийг бөглөж цахим шуудангийн хаÑгаа Ñолино уу. Өөрчлөлт хийхийн тулд нууц үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу.',
+'changeemail-no-info' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг үзÑÑ…Ñд Ñ…ÑÑ€ÑглÑгчийн нÑÑ€ÑÑÑ€ орÑон байх шаардлагатай.',
+'changeemail-oldemail' => 'Одоогийн цахим шуудан:',
+'changeemail-newemail' => 'Ð¨Ð¸Ð½Ñ Ñ†Ð°Ñ…Ð¸Ð¼ шуудангийн хаÑг:',
+'changeemail-none' => '(байхгүй)',
+'changeemail-submit' => 'Цахим шуудан Ñолих',
+'changeemail-cancel' => 'Цуцал',
# Edit page toolbar
'bold_sample' => 'ТодруулÑан бичиг',
@@ -636,9 +656,6 @@ $2',
Таны одоогийн IP хаÑг $3, таны түгжÑÑний дугаар #$5 байна.
ТүгжÑÑний талаарх аÑуултандаа дÑÑрх бүх зүйлÑийг туÑгаж өгөөрÑй.',
'blockednoreason' => 'шалтгаан өгөгдөөгүй байна',
-'blockedoriginalsource' => "'''$1'''-н кодыг доор үзүүлÑв:",
-'blockededitsource' => "Таны '''$1'''-д хийж байгаа '''заÑваруудын''' текÑтийг доор үзүүлÑв:",
-'whitelistedittitle' => 'ЗаÑварлахын тулд нÑвтрÑÑ… шаардлагатай',
'whitelistedittext' => 'ХуудÑуудад заÑвар хийхийн тулд та урьдаар $1 Ñ…ÑÑ€ÑгтÑй.',
'confirmedittext' => 'Та хуудÑуудыг заÑварлахдаа мÑйл хаÑгаа баталгаажуулах Ñ…ÑÑ€ÑгтÑй.
[[Special:Preferences|Ð¥ÑÑ€ÑглÑгчийн тохиргоо]] Ñ…ÑÑÑгт өөрийнхөө мÑйл хаÑгийг оруулж, баталгаажуулна уу.',
@@ -893,8 +910,6 @@ $3-н тодорхойлÑон шалтгаан нь ''$2''",
'revdelete-unsuppress' => 'СÑргÑÑгдÑÑн заÑварууд дахь Ñ…Ñзгаарлалтуудыг авч хаÑÑ…',
'revdelete-log' => 'Шалтгаан:',
'revdelete-submit' => 'СонгоÑон {{PLURAL:$1|заÑварт|заÑваруудад}} үйлчлүүлÑÑ…',
-'revdelete-logentry' => '[[$1]]-н заÑварын харагдах байдлыг өөрчиллөө',
-'logdelete-logentry' => '[[$1]]-н үйл Ñвдлын харагдах байдлыг өөрчиллөө',
'revdelete-success' => "'''ЗаÑварын үзÑгдÑÑ… байдлыг амжилттайгаар шинÑчиллÑÑ.'''",
'revdelete-failure' => "'''ЗаÑварын үзÑгдÑÑ… байдлыг шинÑчилж чадÑангүй:'''
$1",
@@ -906,15 +921,6 @@ $1",
'revdel-restore-visible' => 'үзÑгдÑÑ… заÑварууд',
'pagehist' => 'ХуудаÑны түүх',
'deletedhist' => 'УÑтгагдÑан түүх',
-'revdelete-content' => 'агуулга',
-'revdelete-summary' => 'заÑварын товч агуулга',
-'revdelete-uname' => 'Ñ…ÑÑ€ÑглÑгчийн нÑÑ€',
-'revdelete-restricted' => 'ÑиÑтемийн операторуудад тавигдÑан Ñ…Ñзгаарлалтууд',
-'revdelete-unrestricted' => 'ÑиÑтемийн Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€ÑƒÑƒÐ´Ð°Ð°Ñ Ð°Ð²Ñ‡ хаÑÑан Ñ…Ñзгаарлалтууд',
-'revdelete-hid' => 'нуугдÑан $1',
-'revdelete-unhid' => 'нууцлахаа болиулÑан $1',
-'revdelete-log-message' => '$2 заÑварт $1',
-'logdelete-log-message' => '$2 үйл Ñвдалд $1',
'revdelete-hide-current' => '$2, $1 огноотой зүйлийг нуухад алдаа гарав: ÑÐ½Ñ Ð±Ð¾Ð» одоогийн заÑвар.
Ðуух боломжгүй байна.',
'revdelete-show-no-access' => '$2, $1 огноотой зүйлийг харуулахад алдаа гарав: ÑнÑÑ…Ò¯Ò¯ зүйл "хориглогдÑон байна".
@@ -1073,12 +1079,14 @@ $1",
'prefs-rc' => 'Сүүлийн заÑварууд',
'prefs-watchlist' => 'Ð¥Ñнах жагÑаалт',
'prefs-watchlist-days' => 'Ð¥Ñнах жагÑаалтанд үзүүлÑÑ… өдрүүдийн тоо:',
-'prefs-watchlist-days-max' => 'Хамгийн ихдÑÑ 7 өдөр',
+'prefs-watchlist-days-max' => 'Хамгийн ихдÑÑ $1 {{PLURAL:$1|өдөр|өдөр}}',
'prefs-watchlist-edits' => 'ДÑлгÑрүүлÑÑн Ñ…Ñнах жагÑаалтанд үзүүлÑÑ… дÑÑд Ñ…ÑмжÑÑний өөрчлөлтүүдийн тоо:',
'prefs-watchlist-edits-max' => 'Хамгийн дÑÑд тоо: 1000',
'prefs-watchlist-token' => 'Ð¥Ñнаж буй хуудÑуудын жагÑаалтийн Ñ‚ÑмдÑг:',
'prefs-misc' => 'БуÑад',
'prefs-resetpass' => 'Ðууц үгÑÑ Ñолих',
+'prefs-changeemail' => 'Цахим шуудангийн хаÑг Ñолих',
+'prefs-setemail' => 'Цахим шууданг тохируулах',
'prefs-email' => 'И-мÑйлийн Ñонгох тохиргоо',
'prefs-rendering' => 'Харагдац',
'saveprefs' => 'Хадгалах',
@@ -1272,13 +1280,13 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'right-autopatrol' => 'Өөрийн хийÑÑн заÑваруудыг автоматаар манагдÑан гÑж Ñ‚ÑмдÑглүүлÑÑ…',
'right-patrolmarks' => 'Сүүлийн өөрчлөлтүүдийн манааны Ñ‚ÑмдÑглÑгÑÑнүүдийг үзÑÑ…',
'right-unwatchedpages' => 'Ð¥Ñнагдаагүй хуудÑуудын жагÑаалтыг үзÑÑ…',
-'right-trackback' => 'Тракбак Ñвуулах',
'right-mergehistory' => 'ХуудÑуудын түүхийг нийлүүлÑÑ…',
'right-userrights' => 'Ð¥ÑÑ€ÑглÑгчийн Ñрхүүдийг заÑварлах',
'right-userrights-interwiki' => 'БуÑад вики дÑÑрх Ñ…ÑÑ€ÑглÑгчдийн Ñрхүүдийг заÑварлах',
'right-siteadmin' => 'ÐœÑдÑÑллийн баазыг түгжих буюу нÑÑÑ…',
'right-override-export-depth' => '5 хүртÑлх гүний хуудÑуудыг холбогдÑон хуудÑуудтай хамт гаргах',
'right-sendemail' => 'БуÑад Ñ…ÑÑ€ÑглÑгчид руу и-мÑйл Ñвуулах',
+'right-passwordreset' => 'Цахим шуудангийн нууц үгийг ÑÑргÑÑн харах',
# User rights log
'rightslog' => 'Ð¥ÑÑ€ÑглÑгчдийн Ñрхийн лог',
@@ -1317,11 +1325,11 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'action-patrol' => 'буÑдын хийÑÑн заÑварыг манагдÑан гÑж Ñ‚ÑмдÑглÑÑ…',
'action-autopatrol' => 'өөрийн хийÑÑн заÑварыг манагдÑан гÑж Ñ‚ÑмдÑглÑÑ…',
'action-unwatchedpages' => 'Ñ…Ñнагдаагүй хуудÑуудын жагÑаалтыг үзÑÑ…',
-'action-trackback' => 'тракбак Ñвуулах',
'action-mergehistory' => 'ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны түүхийг нÑгтгÑÑ…',
'action-userrights' => 'Ñ…ÑÑ€ÑглÑгчийн бүх Ñрхүүдийг заÑварлах',
'action-userrights-interwiki' => 'буÑад викинүүд дÑÑрх Ñ…ÑÑ€ÑглÑгчийн Ñрхүүдийг заÑварлах',
'action-siteadmin' => 'мÑдÑÑллийн баазыг түгжих буюу нÑÑÑ…',
+'action-sendemail' => 'цахим шуудан Ñвуулах',
# Recent changes
'nchanges' => '$1 өөрчлөлт',
@@ -1353,6 +1361,7 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'number_of_watching_users_pageview' => '[$1 Ñ…ÑÑ€ÑглÑгч харж байна]',
'rc_categories' => 'Ðнгиллуудад Ñ…Ñзгаарлах ("|" Ñ‚ÑмдгÑÑÑ€ туÑгаарлах)',
'rc_categories_any' => 'Хамаагүй',
+'rc-change-size-new' => 'ӨөрчилÑний дараа $1 {{PLURAL:$1|байт|байт}}',
'newsectionsummary' => '/* $1 */ ÑˆÐ¸Ð½Ñ Ñ…ÑÑÑг',
'rc-enhanced-expand' => 'ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг үзүүлÑх (ЖаваСкрипт Ñ…ÑÑ€ÑглÑгдÑнÑ)',
'rc-enhanced-hide' => 'ДÑлгÑÑ€Ñнгүй мÑдÑÑллийг нуух (ЖаваСкрипт Ñ…ÑÑ€ÑглÑгдÑнÑ)',
@@ -1406,6 +1415,7 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'ignorewarnings' => 'Ямар ч анхааруулгыг үл тоомÑорлох',
'minlength1' => 'Файлын нÑрүүд доод тал нь нÑг Ò¯Ñгийн урттай байх Ñ‘Ñтой.',
'illegalfilename' => '"$1" файлын нÑÑ€Ñнд хуудаÑны нÑÑ€Ñнд Ñ…ÑÑ€ÑглÑÑ…ÑÑÑ Ñ…Ð¾Ñ€Ð¸Ð³Ð»Ð¾Ñон Ò¯Ñгүүд байна. Файлынхаа нÑрийг Ñолиод дахин оруулна уу.',
+'filename-toolong' => 'Файлын нÑÑ€ 240 Ð±Ð°Ð¹Ñ‚Ð°Ð°Ñ ÑƒÑ€Ñ‚ байж болохгүй',
'badfilename' => 'Файлын нÑÑ€ нь "$1" болж өөрчлөгдлөө.',
'filetype-mime-mismatch' => 'Таны ÑвуулÑан файлын өргөлтгөл ".$1" MIME-н төрөлтÑй ($2) файлтай тохирÑонгүй.',
'filetype-badmime' => '"$1" MIME төрлийн файлуудыг оруулахыг хориглоÑон байна.',
@@ -1506,6 +1516,21 @@ URL нь хүчинтÑй, мөн түүн руу орж болж байгаа Ñ
'upload-unknown-size' => 'Үл мÑдÑгдÑÑ… Ñ…ÑмжÑÑ',
'upload-http-error' => 'HTTP алдаа гарав: $1',
+# File backend
+'backend-fail-backup' => '$1 файлыг нөөцөлж чадÑангүй.',
+'backend-fail-notexists' => '$1 файл байхгүй байна.',
+'backend-fail-invalidpath' => '$1 хадгалах зам хуурамч байна.',
+'backend-fail-delete' => '$1 файлыг уÑтгаж чадÑангүй.',
+'backend-fail-alreadyexists' => '$1 файл аль Ñ…Ñдийн байж байна.',
+'backend-fail-store' => '$2 дахь $1 файлыг хадгалж чадÑангүй.',
+'backend-fail-copy' => '$1 файлыг $2-руу хуулж чадÑангүй.',
+'backend-fail-move' => '$1 файлыг $2-руу шилжүүлж чадÑангүй.',
+'backend-fail-opentemp' => 'Түр зуурыг файлыг нÑÑж чадÑангүй.',
+'backend-fail-writetemp' => 'Түр зуурын файлд бичиж чадÑангүй.',
+'backend-fail-closetemp' => 'Түр зуурын файлыг хааж чадÑангүй.',
+'backend-fail-read' => '$1 файлыг уншиж чадÑангүй.',
+'backend-fail-create' => '$1 файлыг Ò¯Ò¯ÑгÑж чадÑангүй.',
+
# img_auth script messages
'img-auth-accessdenied' => 'Хандах Ñрхгүй байна',
'img-auth-nopathinfo' => 'PATH_INFO байхгүй байна.
@@ -1611,23 +1636,24 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'filerevert-badversion' => 'ӨгөгдÑөн огнооны Ñ‚ÑмдÑгтÑй ÑÐ½Ñ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ дотоод хувилбар байхгүй байна.',
# File deletion
-'filedelete' => '$1-г уÑтга',
-'filedelete-legend' => 'Файлыг уÑтга',
-'filedelete-intro' => "Та '''[[Media:$1|$1]]'''-г бүр түүхтÑй нь уÑтгах гÑж байна.",
-'filedelete-intro-old' => '<span class="plainlinks">Та \'\'\'[[Media:$1|$1]]\'\'\'-н [$4 $3, $2]-н байдлаарх хувилбарыг уÑтгаж байна.</span>',
-'filedelete-comment' => 'Шалтгаан:',
-'filedelete-submit' => 'УÑтга',
-'filedelete-success' => "'''$1''' уÑтгагдлаа.",
-'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'-н $3, $2-ий байдлаарх хувилбар уÑтгагдлаа.</span>',
-'filedelete-nofile' => "'''$1''' байхгүй байна.",
-'filedelete-nofile-old' => "'''$1''' файлын өгөгдÑөн өгөгдөлтÑй архивлагдÑан хувилбар байхгүй байна.",
-'filedelete-otherreason' => 'Ó¨Ó©Ñ€/нÑмÑлт шалтгаан:',
-'filedelete-reason-otherlist' => 'Өөр шалтгаан',
-'filedelete-reason-dropdown' => '*ÐийтлÑг уÑтгах шалтгаанууд
+'filedelete' => '$1-г уÑтга',
+'filedelete-legend' => 'Файлыг уÑтга',
+'filedelete-intro' => "Та '''[[Media:$1|$1]]'''-г бүр түүхтÑй нь уÑтгах гÑж байна.",
+'filedelete-intro-old' => '<span class="plainlinks">Та \'\'\'[[Media:$1|$1]]\'\'\'-н [$4 $3, $2]-н байдлаарх хувилбарыг уÑтгаж байна.</span>',
+'filedelete-comment' => 'Шалтгаан:',
+'filedelete-submit' => 'УÑтга',
+'filedelete-success' => "'''$1''' уÑтгагдлаа.",
+'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'-н $3, $2-ий байдлаарх хувилбар уÑтгагдлаа.</span>',
+'filedelete-nofile' => "'''$1''' байхгүй байна.",
+'filedelete-nofile-old' => "'''$1''' файлын өгөгдÑөн өгөгдөлтÑй архивлагдÑан хувилбар байхгүй байна.",
+'filedelete-otherreason' => 'Ó¨Ó©Ñ€/нÑмÑлт шалтгаан:',
+'filedelete-reason-otherlist' => 'Өөр шалтгаан',
+'filedelete-reason-dropdown' => '*ÐийтлÑг уÑтгах шалтгаанууд
** Зохиогчийн ÑрхÑд халдÑан
** Файлыг давхар оруулÑан',
-'filedelete-edit-reasonlist' => 'УÑтгах шалтгаануудыг заÑварлах',
-'filedelete-maintenance' => 'Техникийн үзлÑгийн үеÑÑ€ файл уÑтгах, ÑÑргÑÑÑ… үйлдлийг түр хааÑан байна.',
+'filedelete-edit-reasonlist' => 'УÑтгах шалтгаануудыг заÑварлах',
+'filedelete-maintenance' => 'Техникийн үзлÑгийн үеÑÑ€ файл уÑтгах, ÑÑргÑÑÑ… үйлдлийг түр хааÑан байна.',
+'filedelete-maintenance-title' => 'Файлыг уÑтгаж чадÑангүй.',
# MIME search
'mimesearch' => 'MIME хайлт',
@@ -1744,7 +1770,7 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'listusers-editsonly' => 'ЗаÑвар хийÑÑн Ñ…ÑÑ€ÑглÑгчдийг л үзүүлÑÑ…',
'listusers-creationsort' => 'Ò®Ò¯ÑгÑÑÑн огноогоор ÑÑ€ÑмбÑлÑÑ…',
'usereditcount' => '$1 заÑвар',
-'usercreated' => '$1, $2-д Ò¯Ò¯ÑгÑв',
+'usercreated' => '$1-ны $2-цагт {{GENDER:$3|Ò¯Ò¯ÑгÑв}}',
'newpages' => 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ñууд',
'newpages-username' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
'ancientpages' => 'Хамгийн хуучин хуудÑууд',
@@ -1835,12 +1861,8 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'activeusers-noresult' => 'Ð¥ÑÑ€ÑглÑгч олдÑонгүй.',
# Special:Log/newusers
-'newuserlogpage' => 'Ð¥ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог',
-'newuserlogpagetext' => 'Ð­Ð½Ñ Ð½ÑŒ Ñ…ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог юм.',
-'newuserlog-byemail' => 'мÑйлÑÑÑ€ ÑвуулÑан нууц үг',
-'newuserlog-create-entry' => 'Ð¨Ð¸Ð½Ñ Ñ…ÑÑ€ÑглÑгчийн бүртгÑл',
-'newuserlog-create2-entry' => '$1 гÑÑÑн бүртгÑлийг Ò¯Ò¯ÑгÑв',
-'newuserlog-autocreate-entry' => 'Ðвтоматаар Ò¯Ò¯ÑгÑгдÑÑн бүртгÑл',
+'newuserlogpage' => 'Ð¥ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог',
+'newuserlogpagetext' => 'Ð­Ð½Ñ Ð½ÑŒ Ñ…ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог юм.',
# Special:ListGroupRights
'listgrouprights' => 'Ð¥ÑÑ€ÑглÑгчийн бүлгийн Ñрхүүд',
@@ -1978,8 +2000,6 @@ $NEWPAGE
'actionfailed' => 'Үйлдлийг гүйцÑтгÑж чадÑангүй',
'deletedtext' => '"$1" нь уÑтгагдлаа.
Сүүлд уÑтгагдÑан зүйлÑийг $2-Ñ Ñ…Ð°Ñ€Ð½Ð° уу.',
-'deletedarticle' => '"[[$1]]" нь уÑтгагдлаа',
-'suppressedarticle' => '"[[$1]]"-г далдаллаа',
'dellogpage' => 'УÑтгалын лог',
'dellogpagetext' => 'Доорх нь хамгийн Ñүүлд уÑтгагдÑан зүйлÑийн жагÑаалт.',
'deletionlog' => 'уÑтгалын лог',
@@ -2027,6 +2047,7 @@ $NEWPAGE
'unprotectedarticle' => '"[[$1]]"-ны хамгаалалтыг цуцлав',
'movedarticleprotection' => 'хамгаалалтын тохиргоог "[[$2]]"-Ñ "[[$1]]" руу зөөлөө',
'protect-title' => '"[[$1]]"-н хамгаалалтын түвшинг өөрчлөх',
+'protect-title-notallowed' => '"$1"-ын хамгаалагчдÑан түвшинг үзÑÑ…',
'prot_1movedto2' => '[[$1]] нь [[$2]] руу зөөгдлөө',
'protect-legend' => 'Хамгаалалтыг баталгаажуулах',
'protectcomment' => 'Шалтгаан:',
@@ -2049,6 +2070,7 @@ $NEWPAGE
'protect-level-sysop' => 'Зөвхөн ÑиÑтемийн операторууд',
'protect-summary-cascade' => 'давхар хамгаалалт',
'protect-expiring' => 'ДууÑах хугацаа: $1 (UTC)',
+'protect-expiring-local' => '$1 -нд хугацаа дууÑна',
'protect-expiry-indefinite' => 'тодорхойгүй хугацаагаар',
'protect-cascade' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñанд орÑон хуудÑуудыг хамгаалах (давхар хамгаалалт)',
'protect-cantedit' => 'Таньд ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг заÑварлах Ñрх байхгүй тул хамгаалалтын түвшинг өөрчилж болохгүй.',
@@ -2104,7 +2126,6 @@ $NEWPAGE
'undeletereset' => 'Дахин ÑхлүүлÑÑ…',
'undeleteinvert' => 'ЭÑÑ€ÑгÑÑÑ€ нь болгох',
'undeletecomment' => 'Шалтгаан:',
-'undeletedarticle' => '"[[$1]]"-ийг ÑÑргÑÑв',
'undeletedrevisions' => '{{PLURAL:$1|1 хувилбар|$1 хувилбар}} ÑÑргÑÑгдлÑÑ',
'undeletedrevisions-files' => '{{PLURAL:$1|1 заÑвар|$1 заÑвар}} ба {{PLURAL:$2|1 файл|$2 файл}} ÑÑргÑÑгдлÑÑ',
'undeletedfiles' => '{{PLURAL:$1|1 файл|$1 файл}} ÑÑргÑÑгдлÑÑ',
@@ -2113,6 +2134,7 @@ $NEWPAGE
Сүүлийн үед уÑтгагдÑан ба ÑÑргÑÑгдÑÑн зүйлүүдийн жагÑаалтыг [[Special:Log/delete|уÑтгалын бүртгÑл]] дÑÑÑ€ÑÑÑ Ñ…Ð°Ñ€Ð½Ð° уу.",
'undelete-header' => '[[Special:Log/delete|УÑтгалын бүртгÑл]]ÑÑÑ Ñүүлд уÑтгагдÑан хуудÑуудыг харна уу.',
+'undelete-search-title' => 'УÑтгагдÑан хуудÑыг хайх',
'undelete-search-box' => 'УÑтгагдÑан хуудÑÑƒÑƒÐ´Ð°Ð°Ñ Ñ…Ð°Ð¹Ñ…',
'undelete-search-prefix' => 'Доорхиор ÑÑ…ÑлÑÑн хуудÑуудыг харуул:',
'undelete-search-submit' => 'Хайлт',
@@ -2249,6 +2271,7 @@ $1',
'unblocklink' => 'түгжÑÑг тайлах',
'change-blocklink' => 'түгжÑÑг өөрчлөх',
'contribslink' => 'хувь нÑмÑÑ€',
+'emaillink' => 'цахим шуудан Ñвуулах',
'autoblocker' => 'Ðвтоматаар түгжигдлÑÑ. Учир нь таны IP хаÑгийг "[[User:$1|$1]]" нь Ñ…ÑÑ€ÑглÑж байжÑÑ. "$1"-г түгжих болÑон шалтгаан нь: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'ТүгжÑÑний лог',
'blocklog-showlog' => 'ЭнÑÑ…Ò¯Ò¯ Ñ…ÑÑ€ÑглÑгч өмнө нь түгжигдÑж байÑан байна.
@@ -2359,9 +2382,6 @@ $1',
'movepage-page-moved' => '$1 гÑÑ… Ñ…ÑƒÑƒÐ´Ð°Ñ $2 руу зөөгдлөө.',
'movepage-page-unmoved' => '$1 гÑÑ… Ñ…ÑƒÑƒÐ´Ð°Ñ $2 руу зөөгдөх боломжгүй байна.',
'movepage-max-pages' => 'ДÑÑд Ñ…ÑмжÑÑ Ð±Ð¾Ð»Ð¾Ñ… $1 Ñ…ÑƒÑƒÐ´Ð°Ñ Ð·Ó©Ó©Ð³Ð´Ñөн бөгөөд дахин автоматаар зөөх боломжгүй байна.',
-'1movedto2' => '[[$1]] нь [[$2]] руу зөөгдлөө',
-'1movedto2_redir' => '[[$1]] нь [[$2]] руу дахин чиглÑнÑ.',
-'move-redirect-suppressed' => 'чиглүүлÑгчийг хориглов',
'movelogpage' => 'Зөөлтийн лог',
'movelogpagetext' => 'Доорх нь зөөвөрлөгдÑөн хуудаÑны лиÑÑ‚.',
'movesubpage' => '{{PLURAL:$1|ДÑд хуудаÑ|ДÑд хуудÑууд}}',
@@ -2374,7 +2394,7 @@ $1',
ЗорьÑон Ñ…ÑƒÑƒÐ´Ð°Ñ "[[:$1]]"-г нь урьд нь оруулÑан байна.
Та зөөхөд зай гаргахын тулд уÑтгах уу?',
'delete_and_move_confirm' => 'Тийм, хуудÑыг уÑтга',
-'delete_and_move_reason' => 'Зөөхөд зай гаргахын тулд уÑтгагдÑан',
+'delete_and_move_reason' => '[[$1]] -Ñ Ð·Ó©Ó©Ñ…Ó©Ð´ зай гаргахын тулд уÑтгагдÑан',
'selfmove' => 'Зөөгдөх гÑж байгаа Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±Ð¾Ð»Ð¾Ð½ шинÑÑÑ€ нÑрлÑÑ… гÑж байгаа хуудаÑны нÑрүүд ижил байна;
хуудÑыг Ó©Ó©Ñ€ Ñ€Ò¯Ò¯ нь зөөж болохгүй.',
'immobile-source-namespace' => '"$1" нÑрний зай дотор хуудÑуудыг зөөх боломжгүй',
@@ -2494,72 +2514,73 @@ $1',
'import-logentry-interwiki-detail' => '$2-Ñ Ð°Ð²Ñан $1 заÑвар',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Таны Ñ…ÑÑ€ÑглÑгчийн хуудаÑ',
-'tooltip-pt-anonuserpage' => 'Таны Ñ…ÑÑ€ÑглÑж буй IP хаÑгийн Ñ…ÑÑ€ÑглÑгчийн хуудаÑ',
-'tooltip-pt-mytalk' => 'Таны Ñрианы хуудаÑ',
-'tooltip-pt-anontalk' => 'Ð­Ð½Ñ IP хаÑÐ³Ð°Ð°Ñ Ò¯Ð¹Ð»Ð´ÑÑн заÑваруудын тухай Ñ…ÑлÑлцүүлÑг',
-'tooltip-pt-preferences' => 'Миний тохиргоо',
-'tooltip-pt-watchlist' => 'ЗаÑварууд нь Ñ…Ñнагдаж буй хуудÑуудын жагÑаалт',
-'tooltip-pt-mycontris' => 'Таны оруулÑан хувь нÑмрийн жагÑаалт',
-'tooltip-pt-login' => 'Заавал хийх Ñ‘Ñтой зүйл биш боловч таныг нÑвтрÑхийг зөвлөж байна.',
-'tooltip-pt-anonlogin' => 'Таныг нÑвтрÑхийг зөвлөж байна, гÑхдÑÑ ÑÐ½Ñ Ð±Ð¾Ð» заавал хийх Ñ‘Ñтой зүйл биш.',
-'tooltip-pt-logout' => 'Гарах',
-'tooltip-ca-talk' => 'ХуудаÑны талаарх Ñ…ÑлÑлцүүлÑг',
-'tooltip-ca-edit' => 'Та ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг заÑварлах боломжтой. Хадгалахынхаа өмнө "Урьдчилан харах" товчлуурыг Ñ…ÑÑ€ÑглÑÐ½Ñ Ò¯Ò¯.',
-'tooltip-ca-addsection' => 'Ð¨Ð¸Ð½Ñ Ñ…ÑÑÑг Ò¯Ò¯ÑгÑÑ…',
-'tooltip-ca-viewsource' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ñ…Ð°Ð¼Ð³Ð°Ð°Ð»Ð°Ð³Ð´Ñан байна. Та зөвхөн кодыг нь харах боломжтой.',
-'tooltip-ca-history' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны өмнөх заÑварууд.',
-'tooltip-ca-protect' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг хамгаалах',
-'tooltip-ca-unprotect' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны хамгаалалтыг Ñолих',
-'tooltip-ca-delete' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг уÑтгах',
-'tooltip-ca-undelete' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг арилгахын өмнө хийÑÑн заÑваруудыг буцаах.',
-'tooltip-ca-move' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг зөөх',
-'tooltip-ca-watch' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг Ñ…Ñнах жагÑаалтандаа нÑмÑÑ…',
-'tooltip-ca-unwatch' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг өөрийн Ñ…Ñнаж буй хуудÑуудын жагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ Ñ…Ð°Ñах',
-'tooltip-search' => '{{SITENAME}}-Ñ Ñ…Ð°Ð¹Ñ…',
-'tooltip-search-go' => 'Яг ийм нÑртÑй Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±Ð°Ð¹Ð³Ð°Ð° бол түүн Ñ€Ò¯Ò¯ Ñвах',
-'tooltip-search-fulltext' => 'Ð­Ð½Ñ Ñ‚ÐµÐºÑтийг хуудÑÑƒÑƒÐ´Ð°Ð°Ñ Ñ…Ð°Ð¹Ñ…',
-'tooltip-p-logo' => 'Ðүүр хуудаÑ',
-'tooltip-n-mainpage' => 'Ðүүр хуудаÑÑ‚ зочлох',
-'tooltip-n-mainpage-description' => 'Ðүүр хуудаÑÑ‚ зочлох',
-'tooltip-n-portal' => 'Ð­Ð½Ñ Ñ‚Ó©Ñлийн тухай, түүн дÑÑÑ€ юу хийж болох, ба хаана зүйлÑийг мÑдÑж авах тухай',
-'tooltip-n-currentevents' => 'Сүүлийн үед болÑон үйл Ñвдлуудын тухай',
-'tooltip-n-recentchanges' => '{{SITENAME}} дÑÑ… хамгийн Ñүүлийн өөрчлөлтүүдийн жагÑаалт.',
-'tooltip-n-randompage' => 'СанамÑаргүй Ñ…ÑƒÑƒÐ´Ð°Ñ Ð´ÑƒÑƒÐ´Ð°Ñ…',
-'tooltip-n-help' => 'ТуÑлалцааг олох газар.',
-'tooltip-t-whatlinkshere' => 'Энд холбогдÑон бүх вики хуудÑуудын жагÑаалт',
-'tooltip-t-recentchangeslinked' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÐ½Ð°Ð°Ñ Ð»Ð¸Ð½Ðº хийгдÑÑн хуудÑуудын ÑˆÐ¸Ð½Ñ Ó©Ó©Ñ€Ñ‡Ð»Ó©Ð»Ñ‚Ò¯Ò¯Ð´',
-'tooltip-feed-rss' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны RSS фийд',
-'tooltip-feed-atom' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны Atom фийд',
-'tooltip-t-contributions' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчийн оруулÑан бүх хувь нÑмрийн жагÑаалтыг үзÑÑ…',
-'tooltip-t-emailuser' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…',
-'tooltip-t-upload' => 'Файлыг оруулах',
-'tooltip-t-specialpages' => 'ТуÑгай хуудаÑнуудын жагÑаалт',
-'tooltip-t-print' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны хувилж болох хувилбар',
-'tooltip-t-permalink' => 'ХуудаÑны одоогийн хувилбар луу очих тогтмол линк',
-'tooltip-ca-nstab-main' => 'Өгүүллийн хуудÑыг үзÑÑ…',
-'tooltip-ca-nstab-user' => 'Ð¥ÑÑ€ÑглÑгчийн хуудÑыг үзÑÑ…',
-'tooltip-ca-nstab-media' => 'Медиа хуудÑыг үзÑÑ….',
-'tooltip-ca-nstab-special' => 'Ð­Ð½Ñ Ð±Ð¾Ð» туÑгай хуудаÑ, та үүнийг шууд заÑварлах боломжгүй.',
-'tooltip-ca-nstab-project' => 'ТөÑлийн хуудÑыг үзÑÑ…',
-'tooltip-ca-nstab-image' => 'Файлын хуудÑыг үзÑÑ…',
-'tooltip-ca-nstab-mediawiki' => 'СиÑтемийн мÑдÑгдлийг үзÑÑ….',
-'tooltip-ca-nstab-template' => 'Загварыг үзÑÑ…',
-'tooltip-ca-nstab-help' => 'ТуÑламжийн хуудÑыг үзÑÑ…',
-'tooltip-ca-nstab-category' => 'Ðнгиллын хуудÑыг үзÑÑ…',
-'tooltip-minoredit' => 'Бага зÑргийн заÑвар гÑж Ñ‚ÑмдÑглÑÑ…',
-'tooltip-save' => 'ЗаÑваруудаа хадгалах',
-'tooltip-preview' => 'Өөрийн оруулах гÑж буй өөрчлөлтүүдийг урьдчилан харах. Үүнийг ашиглана уу!',
-'tooltip-diff' => 'Таны бичлÑгт үйлдÑÑн өөрчлөлтүүдийг харуул.',
-'tooltip-compareselectedversions' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны ÑонгоÑон хоёр хувилбарын Ñлгааг харна уу.',
-'tooltip-watch' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг өөрийн Ñ…Ñнах жагÑаалтандаа нÑмÑÑ…',
-'tooltip-recreate' => 'ÐрилгагдÑан хуудÑыг дахин ÑхлүүлÑÑ…',
-'tooltip-upload' => 'Ðплоудоо ÑхлÑÑ…',
-'tooltip-rollback' => '"Буцаах" функцÑÑÑ€ ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÑ‚ хийÑÑн заÑвар(ууд)ыг хамгийн Ñүүлийн заÑвар хийÑÑн хүний хувилбар руу ганц товшилтоор шилжүүлнÑ',
-'tooltip-undo' => '"Цуцлах" дÑÑÑ€ дарÑнаар ÑÐ½Ñ Ð·Ð°Ñварыг хуучны төлөвт шилжүүлÑн урьдчилж харах байдлаар заÑварлах талбарыг гаргана.
+'tooltip-pt-userpage' => 'Таны Ñ…ÑÑ€ÑглÑгчийн хуудаÑ',
+'tooltip-pt-anonuserpage' => 'Таны Ñ…ÑÑ€ÑглÑж буй IP хаÑгийн Ñ…ÑÑ€ÑглÑгчийн хуудаÑ',
+'tooltip-pt-mytalk' => 'Таны Ñрианы хуудаÑ',
+'tooltip-pt-anontalk' => 'Ð­Ð½Ñ IP хаÑÐ³Ð°Ð°Ñ Ò¯Ð¹Ð»Ð´ÑÑн заÑваруудын тухай Ñ…ÑлÑлцүүлÑг',
+'tooltip-pt-preferences' => 'Миний тохиргоо',
+'tooltip-pt-watchlist' => 'ЗаÑварууд нь Ñ…Ñнагдаж буй хуудÑуудын жагÑаалт',
+'tooltip-pt-mycontris' => 'Таны оруулÑан хувь нÑмрийн жагÑаалт',
+'tooltip-pt-login' => 'Заавал хийх Ñ‘Ñтой зүйл биш боловч таныг нÑвтрÑхийг зөвлөж байна.',
+'tooltip-pt-anonlogin' => 'Таныг нÑвтрÑхийг зөвлөж байна, гÑхдÑÑ ÑÐ½Ñ Ð±Ð¾Ð» заавал хийх Ñ‘Ñтой зүйл биш.',
+'tooltip-pt-logout' => 'Гарах',
+'tooltip-ca-talk' => 'ХуудаÑны талаарх Ñ…ÑлÑлцүүлÑг',
+'tooltip-ca-edit' => 'Та ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг заÑварлах боломжтой. Хадгалахынхаа өмнө "Урьдчилан харах" товчлуурыг Ñ…ÑÑ€ÑглÑÐ½Ñ Ò¯Ò¯.',
+'tooltip-ca-addsection' => 'Ð¨Ð¸Ð½Ñ Ñ…ÑÑÑг Ò¯Ò¯ÑгÑÑ…',
+'tooltip-ca-viewsource' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ñ…Ð°Ð¼Ð³Ð°Ð°Ð»Ð°Ð³Ð´Ñан байна. Та зөвхөн кодыг нь харах боломжтой.',
+'tooltip-ca-history' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны өмнөх заÑварууд.',
+'tooltip-ca-protect' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг хамгаалах',
+'tooltip-ca-unprotect' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны хамгаалалтыг Ñолих',
+'tooltip-ca-delete' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг уÑтгах',
+'tooltip-ca-undelete' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг арилгахын өмнө хийÑÑн заÑваруудыг буцаах.',
+'tooltip-ca-move' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг зөөх',
+'tooltip-ca-watch' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг Ñ…Ñнах жагÑаалтандаа нÑмÑÑ…',
+'tooltip-ca-unwatch' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг өөрийн Ñ…Ñнаж буй хуудÑуудын жагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ Ñ…Ð°Ñах',
+'tooltip-search' => '{{SITENAME}}-Ñ Ñ…Ð°Ð¹Ñ…',
+'tooltip-search-go' => 'Яг ийм нÑртÑй Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±Ð°Ð¹Ð³Ð°Ð° бол түүн Ñ€Ò¯Ò¯ Ñвах',
+'tooltip-search-fulltext' => 'Ð­Ð½Ñ Ñ‚ÐµÐºÑтийг хуудÑÑƒÑƒÐ´Ð°Ð°Ñ Ñ…Ð°Ð¹Ñ…',
+'tooltip-p-logo' => 'Ðүүр хуудаÑ',
+'tooltip-n-mainpage' => 'Ðүүр хуудаÑÑ‚ зочлох',
+'tooltip-n-mainpage-description' => 'Ðүүр хуудаÑÑ‚ зочлох',
+'tooltip-n-portal' => 'Ð­Ð½Ñ Ñ‚Ó©Ñлийн тухай, түүн дÑÑÑ€ юу хийж болох, ба хаана зүйлÑийг мÑдÑж авах тухай',
+'tooltip-n-currentevents' => 'Сүүлийн үед болÑон үйл Ñвдлуудын тухай',
+'tooltip-n-recentchanges' => '{{SITENAME}} дÑÑ… хамгийн Ñүүлийн өөрчлөлтүүдийн жагÑаалт.',
+'tooltip-n-randompage' => 'СанамÑаргүй Ñ…ÑƒÑƒÐ´Ð°Ñ Ð´ÑƒÑƒÐ´Ð°Ñ…',
+'tooltip-n-help' => 'ТуÑлалцааг олох газар.',
+'tooltip-t-whatlinkshere' => 'Энд холбогдÑон бүх вики хуудÑуудын жагÑаалт',
+'tooltip-t-recentchangeslinked' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÐ½Ð°Ð°Ñ Ð»Ð¸Ð½Ðº хийгдÑÑн хуудÑуудын ÑˆÐ¸Ð½Ñ Ó©Ó©Ñ€Ñ‡Ð»Ó©Ð»Ñ‚Ò¯Ò¯Ð´',
+'tooltip-feed-rss' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны RSS фийд',
+'tooltip-feed-atom' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны Atom фийд',
+'tooltip-t-contributions' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчийн оруулÑан бүх хувь нÑмрийн жагÑаалтыг үзÑÑ…',
+'tooltip-t-emailuser' => 'Ð­Ð½Ñ Ñ…ÑÑ€ÑглÑгчид мÑйл илгÑÑÑ…',
+'tooltip-t-upload' => 'Файлыг оруулах',
+'tooltip-t-specialpages' => 'ТуÑгай хуудаÑнуудын жагÑаалт',
+'tooltip-t-print' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны хувилж болох хувилбар',
+'tooltip-t-permalink' => 'ХуудаÑны одоогийн хувилбар луу очих тогтмол линк',
+'tooltip-ca-nstab-main' => 'Өгүүллийн хуудÑыг үзÑÑ…',
+'tooltip-ca-nstab-user' => 'Ð¥ÑÑ€ÑглÑгчийн хуудÑыг үзÑÑ…',
+'tooltip-ca-nstab-media' => 'Медиа хуудÑыг үзÑÑ….',
+'tooltip-ca-nstab-special' => 'Ð­Ð½Ñ Ð±Ð¾Ð» туÑгай хуудаÑ, та үүнийг шууд заÑварлах боломжгүй.',
+'tooltip-ca-nstab-project' => 'ТөÑлийн хуудÑыг үзÑÑ…',
+'tooltip-ca-nstab-image' => 'Файлын хуудÑыг үзÑÑ…',
+'tooltip-ca-nstab-mediawiki' => 'СиÑтемийн мÑдÑгдлийг үзÑÑ….',
+'tooltip-ca-nstab-template' => 'Загварыг үзÑÑ…',
+'tooltip-ca-nstab-help' => 'ТуÑламжийн хуудÑыг үзÑÑ…',
+'tooltip-ca-nstab-category' => 'Ðнгиллын хуудÑыг үзÑÑ…',
+'tooltip-minoredit' => 'Бага зÑргийн заÑвар гÑж Ñ‚ÑмдÑглÑÑ…',
+'tooltip-save' => 'ЗаÑваруудаа хадгалах',
+'tooltip-preview' => 'Өөрийн оруулах гÑж буй өөрчлөлтүүдийг урьдчилан харах. Үүнийг ашиглана уу!',
+'tooltip-diff' => 'Таны бичлÑгт үйлдÑÑн өөрчлөлтүүдийг харуул.',
+'tooltip-compareselectedversions' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны ÑонгоÑон хоёр хувилбарын Ñлгааг харна уу.',
+'tooltip-watch' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг өөрийн Ñ…Ñнах жагÑаалтандаа нÑмÑÑ…',
+'tooltip-watchlistedit-normal-submit' => 'Гарчигийг уÑтгах',
+'tooltip-recreate' => 'ÐрилгагдÑан хуудÑыг дахин ÑхлүүлÑÑ…',
+'tooltip-upload' => 'Ðплоудоо ÑхлÑÑ…',
+'tooltip-rollback' => '"Буцаах" функцÑÑÑ€ ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÑ‚ хийÑÑн заÑвар(ууд)ыг хамгийн Ñүүлийн заÑвар хийÑÑн хүний хувилбар руу ганц товшилтоор шилжүүлнÑ',
+'tooltip-undo' => '"Цуцлах" дÑÑÑ€ дарÑнаар ÑÐ½Ñ Ð·Ð°Ñварыг хуучны төлөвт шилжүүлÑн урьдчилж харах байдлаар заÑварлах талбарыг гаргана.
Товч агуулгын Ñ…ÑÑÑгт шалтгаан нÑмÑÑ… боломжтой болгоно.',
-'tooltip-preferences-save' => 'Тохиргоог хадгалах',
-'tooltip-summary' => 'Товч тайлбар оруулах',
+'tooltip-preferences-save' => 'Тохиргоог хадгалах',
+'tooltip-summary' => 'Товч тайлбар оруулах',
# Stylesheets
'common.css' => '/* Энд тавигдÑан CSS-үүд бүх арьÑанд нÑмÑгдÑÑ… болно */',
@@ -2617,9 +2638,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Эргүүлийн лог',
'patrol-log-header' => 'Ð­Ð½Ñ Ð½ÑŒ манагдÑан заÑваруудын лог юм.',
-'patrol-log-line' => '$2-н $1-г $3 манагдÑан гÑж Ñ‚ÑмдÑглÑв',
-'patrol-log-auto' => '(автомат)',
-'patrol-log-diff' => 'заÑвар $1',
'log-show-hide-patrol' => 'мануулын логийг $1',
# Image deletion
@@ -2644,7 +2662,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|хуудаÑ|хуудаÑ}}',
'file-info' => 'файлын Ñ…ÑмжÑÑ: $1, MIME төрөл: $2',
'file-info-size' => '$1 × $2 пикÑел, файлын Ñ…ÑмжÑÑ: $3, MIME төрөл: $4',
-'file-nohires' => '<small>Илүү чанартай хувилбар байхгүй байна.</small>',
+'file-nohires' => 'Илүү чанартай хувилбар байхгүй байна.',
'svg-long-desc' => 'SVG файл, $1 × $2 пикÑÑл, файлын Ñ…ÑмжÑÑ: $3',
'show-big-image' => 'Хамгийн Ñайн чанартай хувилбар',
'file-info-gif-looped' => 'ÑргÑлдÑÑн',
@@ -2665,6 +2683,9 @@ $1',
'bydate' => 'Огноогоор',
'sp-newimages-showfrom' => '$2, $1-Ñ ÑхлÑж ÑˆÐ¸Ð½Ñ Ñ„Ð°Ð¹Ð»ÑƒÑƒÐ´Ñ‹Ð³ үзүүлÑÑ…',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'ago' => '$1 -ын өмнө',
+
# Bad image list
'bad_image_list' => 'Формат дараах байдлаар байна:
@@ -3023,13 +3044,6 @@ $5
'scarytranscludefailed' => '[$1 загварыг авчирч чадÑангүй]',
'scarytranscludetoolong' => '[URL Ñ…ÑÑ‚ урт байна]',
-# Trackbacks
-'trackbackbox' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñны trackback:<br />
-$1',
-'trackbackremove' => '([$1 уÑтга])',
-'trackbacklink' => 'Тракбак',
-'trackbackdeleteok' => 'Тракбакыг амжилттай уÑтгалаа.',
-
# Delete conflict
'deletedwhileediting' => 'Ðнхаар: Таныг заÑвар хийж байх Ñвцад ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ ÑƒÑтгагдÑан байна!',
'confirmrecreate' => "Ð¥ÑÑ€ÑглÑгч [[User:$1|$1]] ([[User talk:$1|Ñриа]]) нь таныг ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг заÑварлаж байх хооронд дараах шалтгааны ÑƒÐ»Ð¼Ð°Ð°Ñ ÑƒÑтгажÑÑ:
@@ -3230,4 +3244,9 @@ $1',
'sqlite-has-fts' => '$1 (бүх текÑÑ‚ÑÑрх хайлтыг дÑмждÑг)',
'sqlite-no-fts' => '$1 (бүх текÑÑ‚ÑÑрх хайлтыг дÑмждÑггүй)',
+# New logging system
+'revdelete-restricted' => 'ÑиÑтемийн операторуудад тавигдÑан Ñ…Ñзгаарлалтууд',
+'revdelete-unrestricted' => 'ÑиÑтемийн Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€ÑƒÑƒÐ´Ð°Ð°Ñ Ð°Ð²Ñ‡ хаÑÑан Ñ…Ñзгаарлалтууд',
+'newuserlog-byemail' => 'мÑйлÑÑÑ€ ÑвуулÑан нууц үг',
+
);
diff --git a/languages/messages/MessagesMo.php b/languages/messages/MessagesMo.php
index 9d0bd700..caeb5ca0 100644
--- a/languages/messages/MessagesMo.php
+++ b/languages/messages/MessagesMo.php
@@ -367,8 +367,7 @@ $messages = array(
'linksearch' => 'ЛегÑтурь екÑтерне',
# Special:Log/newusers
-'newuserlogpage' => 'Журнал утилизаторь ной',
-'newuserlog-create-entry' => 'Конт ноу де утилизатор',
+'newuserlogpage' => 'Журнал утилизаторь ной',
# Special:ListGroupRights
'listgrouprights-members' => '(лиÑÑ‚Ñ Ð´Ðµ мембрь)',
@@ -394,7 +393,6 @@ $messages = array(
'actioncomplete' => 'Ðкциуне комплетÑ',
'deletedtext' => 'Паӂина «$1» а фоÑÑ‚ штÑÑ€ÑÑ.
Везь $2 пентру о лиÑÑ‚Ñ Ð° елементелор штерÑе речент.',
-'deletedarticle' => 'а ÑˆÑ‚ÐµÑ€Ñ Â«[[$1]]»',
'dellogpage' => 'Журнал штерӂерь',
'deletecomment' => 'Мотив:',
'deleteotherreason' => 'Мотив диферит/Ñуплиментар:',
@@ -426,8 +424,7 @@ $messages = array(
'restriction-level' => 'Ðивел де реÑтрикцие:',
# Undelete
-'undeletelink' => 'визуализÑзÑ/реÑтаурÑзÑ',
-'undeletedarticle' => 'а рекуперат «[[$1]]»',
+'undeletelink' => 'визуализÑзÑ/реÑтаурÑзÑ',
# Namespace form on various pages
'namespace' => 'Спациу де нуме:',
@@ -480,7 +477,6 @@ $messages = array(
'movearticle' => 'ДеплаÑÑÐ·Ñ Ð¿Ð°Ó‚Ð¸Ð½Ð°:',
'newtitle' => 'Титлул ноу:',
'movepagebtn' => 'ДеплаÑÑÐ·Ñ Ð¿Ð°Ó‚Ð¸Ð½Ð°',
-'1movedto2' => 'а деплаÑат [[$1]] ын [[$2]]',
'movelogpage' => 'Журнал деплаÑÑрь',
'movereason' => 'Мотив:',
'revertmove' => 'ревино',
@@ -547,7 +543,7 @@ $messages = array(
# Media information
'file-info-size' => '$1 × $2 пикÑель, мÑриме фишиер: $3, тип MIME: $4',
-'file-nohires' => '<small>Резолуций май марь ну Ñынт диÑпонибиле.</small>',
+'file-nohires' => 'Резолуций май марь ну Ñынт диÑпонибиле.',
'svg-long-desc' => 'фишиер SVG, ку дименÑÐ¸ÑƒÐ½Ñ Ð½Ð¾Ð¼Ð¸Ð½Ð°Ð»Ñ Ð´Ðµ $1 × $2 пикÑель, мÑриме фишиер: $3',
'show-big-image' => 'ÐœÑреште Ñ€ÐµÐ·Ð¾Ð»ÑƒÑ†Ð¸Ñ Ð¸Ð¼Ð°Ó‚Ð¸Ð½Ð¸Ð¹',
diff --git a/languages/messages/MessagesMr.php b/languages/messages/MessagesMr.php
index 2ebe761a..bb4ca548 100644
--- a/languages/messages/MessagesMr.php
+++ b/languages/messages/MessagesMr.php
@@ -10,6 +10,7 @@
* @author Aan
* @author Angela
* @author Ankitgadgil
+ * @author Balaji
* @author Chandu
* @author Dnyanesh325
* @author Harshalhayat
@@ -159,143 +160,143 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨', '#पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨', '#REDIRECT' ),
- 'notoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾à¤¨à¤•à¥‹__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¨à¤•à¥‹__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾à¤¹à¤µà¥€à¤š__', '__FORCETOC__' ),
- 'toc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__TOC__' ),
- 'noeditsection' => array( '0', '__असंपादनकà¥à¤·à¤®__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__शीरà¥à¤·à¤•à¤¨à¤¾à¤¹à¥€__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¥¨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¥§', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¨à¤¾à¤µ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'सदà¥à¤¯à¤¦à¤¿à¤µà¤¸', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'सदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥¨', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'सदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¤¨à¤¾à¤µ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'सदà¥à¤¯à¤µà¤°à¥à¤·', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'सदà¥à¤¯à¤µà¥‡à¤³', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'सदà¥à¤¯à¤¤à¤¾à¤¸', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¥¨', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¥§', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¤¨à¤¾à¤µ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸', 'LOCALDAY' ),
- 'localday2' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥¨', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¤¨à¤¾à¤µ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤µà¤°à¥à¤·', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤µà¥‡à¤³', 'LOCALTIME' ),
- 'localhour' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¤à¤¾à¤¸', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'पानसंखà¥à¤¯à¤¾', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'लेखसंखà¥à¤¯à¤¾', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'संचिकासंखà¥à¤¯à¤¾', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'सदसà¥à¤¯à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'सकà¥à¤°à¥€à¤¯à¤¸à¤¦à¤¸à¥à¤¯à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'संपादनसंखà¥à¤¯à¤¾', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'धडकसंखà¥à¤¯à¤¾', 'पà¥à¤°à¥‡à¤•à¥à¤·à¤¾à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'लेखनाव', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'लेखानावव', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'नामविशà¥à¤µ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'नामविशà¥à¤µà¤¾', 'नामविशà¥à¤µà¤¾à¤šà¥‡', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'चरà¥à¤šà¤¾à¤µà¤¿à¤¶à¥à¤µ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'चरà¥à¤šà¤¾à¤µà¤¿à¤¶à¥à¤µà¤¾', 'चरà¥à¤šà¤¾à¤µà¤¿à¤¶à¥à¤µà¤¾à¤šà¥‡', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'विषयविशà¥à¤µ', 'लेखविशà¥à¤µ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'विषयविशà¥à¤µà¤¾', 'लेखविशà¥à¤µà¤¾', 'विषयविशà¥à¤µà¤¾à¤šà¥‡', 'लेखविशà¥à¤µà¤¾à¤šà¥‡', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'पूरà¥à¤£à¤²à¥‡à¤–नाव', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'पूरà¥à¤£à¤²à¥‡à¤–नावे', 'अंशदà¥à¤µà¤¾', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'उपपाननाव', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'उपपाननावे', 'उपपाननावाचे', 'उपौंशदà¥à¤µà¤¾', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'मूळपाननाव', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'मूळपाननावे', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'चरà¥à¤šà¤¾à¤ªà¤¾à¤¨à¤¨à¤¾à¤µ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'चरà¥à¤šà¤¾à¤ªà¤¾à¤¨à¤¨à¤¾à¤µà¥‡', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'विषयपाननाव', 'लेखपाननाव', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'विषयपाननावे', 'लेखपाननावे', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'संदेश:', 'निरोप:', 'MSG:' ),
- 'subst' => array( '0', 'परà¥à¤¯à¤¾à¤¯:', 'समाविषà¥à¤Ÿà¥€:', 'अबाहà¥à¤¯:', 'निरकंसबिंब:', 'कंसतà¥à¤¯à¤¾à¤—:', 'साचाहिन:', 'साचानà¥à¤¤à¤°:', 'साचापरिसà¥à¤«à¥‹à¤Ÿ:', 'साचोदà¥à¤˜à¤¾à¤Ÿà¤¨:', 'SUBST:' ),
- 'msgnw' => array( '0', 'संदेशनवा:', 'निरोपनवा:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'इवलेसे', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'इवलेसे=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'उजवे', 'right' ),
- 'img_left' => array( '1', 'डावे', 'left' ),
- 'img_none' => array( '1', 'कोणतेचनाही', 'ननà¥à¤¨à¤¾', 'none' ),
- 'img_width' => array( '1', '$1अंश', '$1कणी', '$1पकà¥à¤·', '$1px' ),
- 'img_center' => array( '1', 'मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€', 'center', 'centre' ),
- 'img_framed' => array( '1', 'चौकट', 'फ़à¥à¤°à¥‡à¤®', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'विनाचौकट', 'विनाफ़à¥à¤°à¥‡à¤®', 'frameless' ),
- 'img_page' => array( '1', 'पान=$1', 'पान $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'उभा', 'उभा=$1', 'उभा $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'सीमा', 'border' ),
- 'img_baseline' => array( '1', 'तळरेषा', 'आधाररेषा', 'baseline' ),
- 'img_sub' => array( '1', 'अधो', 'sub' ),
- 'img_super' => array( '1', 'उरà¥à¤§à¥à¤µ', 'super', 'sup' ),
- 'img_top' => array( '1', 'अतà¥à¤¯à¥‚चà¥à¤š', 'top' ),
- 'img_text_top' => array( '1', 'मजकूर-शीरà¥à¤·', 'शीरà¥à¤·-मजकूर', 'text-top' ),
- 'img_middle' => array( '1', 'मधà¥à¤¯', 'middle' ),
- 'img_bottom' => array( '1', 'तळ', 'बूड', 'bottom' ),
- 'img_text_bottom' => array( '1', 'मजकà¥à¤°à¤¤à¤³', 'text-bottom' ),
- 'img_link' => array( '1', 'दà¥à¤µà¤¾=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'अलà¥à¤Ÿ=$1', 'alt=$1' ),
- 'int' => array( '0', 'इनà¥à¤Ÿ:', 'INT:' ),
- 'sitename' => array( '1', 'संकेतसà¥à¤¥à¤³à¤¨à¤¾à¤µ', 'SITENAME' ),
- 'ns' => array( '0', 'नावि:', 'NS:' ),
- 'nse' => array( '0', 'नाविअरिकà¥à¤¤:', 'नावà¥à¤¯à¤¾à¤°à¤¿à¤•à¥à¤¤:', 'नावà¥à¤¯à¤¾à¤–:', 'NSE:' ),
- 'localurl' => array( '0', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¥à¤¥à¤³:', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤‚केतसà¥à¤¥à¤³:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¥à¤¥à¤²à¥€:', 'LOCALURLE:' ),
- 'server' => array( '0', 'विदादाता', 'SERVER' ),
- 'servername' => array( '0', 'विदादातानाव', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'संहीतामारà¥à¤—', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'वà¥à¤¯à¤¾à¤•à¤°à¤£:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'लिंग:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__विनाशीरà¥à¤·à¤•à¤¬à¤¦à¤²__', '__विनाशीब__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__विनामजकà¥à¤°à¤¬à¤¦à¤²__', '__विनामब__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'सदà¥à¤¯à¤†à¤ à¤µà¤¡à¤¾', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'सदà¥à¤¯à¤‰à¤¤à¤°à¤£', 'सदà¥à¤¯à¤‰à¤¤à¤¾à¤°', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤†à¤ à¤µà¤¡à¤¾', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤‰à¤¤à¤°à¤£', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤‰à¤¤à¤¾à¤°', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'आवृतà¥à¤¤à¥€à¤•à¥à¤°à¥à¤®à¤¾à¤‚क', 'REVISIONID' ),
- 'revisionday' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤¨', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤¨à¥¨', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'आवृतà¥à¤¤à¥€à¤®à¤¾à¤¸', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'आवृतà¥à¤¤à¥€à¤µà¤°à¥à¤·', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'आवृतà¥à¤¤à¥€à¤®à¥à¤¦à¥à¤°à¤¾', 'आवृतà¥à¤¤à¥€à¤ à¤¸à¤¾', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'आवृतà¥à¤¤à¥€à¤¸à¤¦à¤¸à¥à¤¯', 'REVISIONUSER' ),
- 'plural' => array( '0', 'बहà¥à¤µà¤šà¤¨:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³', 'FULLURL:' ),
- 'fullurle' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤²à¥€:', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³à¥€:', 'FULLURLE:' ),
- 'raw' => array( '0', 'कचà¥à¤šà¥‡:', 'RAW:' ),
- 'displaytitle' => array( '1', 'शीरà¥à¤·à¤•à¤¦à¤¾à¤–वा', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'ॠ', 'R' ),
- 'newsectionlink' => array( '1', '__नवविभागदà¥à¤µà¤¾__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__विनानवविभागदà¥à¤µà¤¾__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'सदà¥à¤¯à¤†à¤µà¥ƒà¤¤à¥à¤¤à¥€', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'संकेतसà¥à¤¥à¤²à¥€à¤†à¤‚गà¥à¤²à¥à¤¸à¤‚केत:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'नांगरआंगà¥à¤²à¤¸à¤‚केत', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'सदà¥à¤¯à¤•à¤¾à¤²à¤®à¥à¤¦à¥à¤°à¤¾', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤•à¤¾à¤²à¤®à¥à¤¦à¥à¤°à¤¾', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'दिशाचिनà¥à¤¹', 'दिशादरà¥à¤¶à¤•', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#भाषा:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'मसà¥à¤¦à¤¾à¤­à¤¾à¤·à¤¾', 'मजकà¥à¤°à¤­à¤¾à¤·à¤¾', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'नामविशà¥à¤µà¤¾à¤¤à¥€à¤²à¤ªà¤¾à¤¨à¥‡:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'पà¥à¤°à¤šà¤¾à¤²à¤•à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'कà¥à¤°à¤®à¤ªà¤¦à¥à¤§à¤¤à¥€', 'FORMATNUM' ),
- 'padleft' => array( '0', 'डावाभरीव', 'भरीवडावा', 'PADLEFT' ),
- 'padright' => array( '0', 'उजवाभरीव', 'भरीवउजवा', 'PADRIGHT' ),
- 'special' => array( '0', 'विशेष', 'special' ),
- 'defaultsort' => array( '1', 'अविचलवरà¥à¤—:', 'अविचलवरà¥à¤—कळ:', 'अविचलवरà¥à¤—वरà¥à¤—ीकरण:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'संचिकामारà¥à¤—:', 'FILEPATH:' ),
- 'tag' => array( '0', 'खूण', 'खूणगाठ', 'tag' ),
- 'hiddencat' => array( '1', '__वरà¥à¤—लपवा__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'वरà¥à¤—ातीलपाने', 'वरà¥à¤—ीतपाने', 'शà¥à¤°à¥‡à¤£à¥€à¤¤à¤ªà¤¾à¤¨à¥‡', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'पानकà¥à¤·à¤®à¤¤à¤¾', 'PAGESIZE' ),
- 'index' => array( '1', '__कà¥à¤°à¤®à¥€à¤¤__', '__अनà¥à¤•à¥à¤°à¤®à¥€à¤¤__', '__INDEX__' ),
- 'noindex' => array( '1', '__विनाकà¥à¤°à¤®à¥€à¤¤__', '__विनाअनà¥à¤•à¥à¤°à¤®à¥€à¤¤__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'गटकà¥à¤°à¤®à¤¾à¤‚क', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__अविचलपà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'सà¥à¤°à¤•à¥à¤·à¤¾à¤¸à¥à¤¤à¤°', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'दिनांकनपदà¥à¤§à¤¤à¥€', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨', '#पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨', '#REDIRECT' ),
+ 'notoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾à¤¨à¤•à¥‹__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¨à¤•à¥‹__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾à¤¹à¤µà¥€à¤š__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__असंपादनकà¥à¤·à¤®__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__शीरà¥à¤·à¤•à¤¨à¤¾à¤¹à¥€__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¥¨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¥§', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¨à¤¾à¤µ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'सदà¥à¤¯à¤¦à¤¿à¤µà¤¸', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'सदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥¨', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'सदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¤¨à¤¾à¤µ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'सदà¥à¤¯à¤µà¤°à¥à¤·', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'सदà¥à¤¯à¤µà¥‡à¤³', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'सदà¥à¤¯à¤¤à¤¾à¤¸', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¥¨', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¥§', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¤¨à¤¾à¤µ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¹à¤¿à¤¨à¤¾à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥¨', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¤¨à¤¾à¤µ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤µà¤°à¥à¤·', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤µà¥‡à¤³', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¤à¤¾à¤¸', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'पानसंखà¥à¤¯à¤¾', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'लेखसंखà¥à¤¯à¤¾', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'संचिकासंखà¥à¤¯à¤¾', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'सदसà¥à¤¯à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'सकà¥à¤°à¥€à¤¯à¤¸à¤¦à¤¸à¥à¤¯à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'संपादनसंखà¥à¤¯à¤¾', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'धडकसंखà¥à¤¯à¤¾', 'पà¥à¤°à¥‡à¤•à¥à¤·à¤¾à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'लेखनाव', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'लेखानावव', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'नामविशà¥à¤µ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'नामविशà¥à¤µà¤¾', 'नामविशà¥à¤µà¤¾à¤šà¥‡', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'चरà¥à¤šà¤¾à¤µà¤¿à¤¶à¥à¤µ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'चरà¥à¤šà¤¾à¤µà¤¿à¤¶à¥à¤µà¤¾', 'चरà¥à¤šà¤¾à¤µà¤¿à¤¶à¥à¤µà¤¾à¤šà¥‡', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'विषयविशà¥à¤µ', 'लेखविशà¥à¤µ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'विषयविशà¥à¤µà¤¾', 'लेखविशà¥à¤µà¤¾', 'विषयविशà¥à¤µà¤¾à¤šà¥‡', 'लेखविशà¥à¤µà¤¾à¤šà¥‡', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'पूरà¥à¤£à¤²à¥‡à¤–नाव', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'पूरà¥à¤£à¤²à¥‡à¤–नावे', 'अंशदà¥à¤µà¤¾', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'उपपाननाव', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'उपपाननावे', 'उपपाननावाचे', 'उपौंशदà¥à¤µà¤¾', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'मूळपाननाव', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'मूळपाननावे', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'चरà¥à¤šà¤¾à¤ªà¤¾à¤¨à¤¨à¤¾à¤µ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'चरà¥à¤šà¤¾à¤ªà¤¾à¤¨à¤¨à¤¾à¤µà¥‡', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'विषयपाननाव', 'लेखपाननाव', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'विषयपाननावे', 'लेखपाननावे', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'संदेश:', 'निरोप:', 'MSG:' ),
+ 'subst' => array( '0', 'परà¥à¤¯à¤¾à¤¯:', 'समाविषà¥à¤Ÿà¥€:', 'अबाहà¥à¤¯:', 'निरकंसबिंब:', 'कंसतà¥à¤¯à¤¾à¤—:', 'साचाहिन:', 'साचानà¥à¤¤à¤°:', 'साचापरिसà¥à¤«à¥‹à¤Ÿ:', 'साचोदà¥à¤˜à¤¾à¤Ÿà¤¨:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'संदेशनवा:', 'निरोपनवा:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'इवलेसे', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'इवलेसे=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'उजवे', 'right' ),
+ 'img_left' => array( '1', 'डावे', 'left' ),
+ 'img_none' => array( '1', 'कोणतेचनाही', 'ननà¥à¤¨à¤¾', 'none' ),
+ 'img_width' => array( '1', '$1अंश', '$1कणी', '$1पकà¥à¤·', '$1px' ),
+ 'img_center' => array( '1', 'मधà¥à¤¯à¤µà¤°à¥à¤¤à¥€', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'चौकट', 'फ़à¥à¤°à¥‡à¤®', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'विनाचौकट', 'विनाफ़à¥à¤°à¥‡à¤®', 'frameless' ),
+ 'img_page' => array( '1', 'पान=$1', 'पान $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'उभा', 'उभा=$1', 'उभा $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'सीमा', 'border' ),
+ 'img_baseline' => array( '1', 'तळरेषा', 'आधाररेषा', 'baseline' ),
+ 'img_sub' => array( '1', 'अधो', 'sub' ),
+ 'img_super' => array( '1', 'उरà¥à¤§à¥à¤µ', 'super', 'sup' ),
+ 'img_top' => array( '1', 'अतà¥à¤¯à¥‚चà¥à¤š', 'top' ),
+ 'img_text_top' => array( '1', 'मजकूर-शीरà¥à¤·', 'शीरà¥à¤·-मजकूर', 'text-top' ),
+ 'img_middle' => array( '1', 'मधà¥à¤¯', 'middle' ),
+ 'img_bottom' => array( '1', 'तळ', 'बूड', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'मजकà¥à¤°à¤¤à¤³', 'text-bottom' ),
+ 'img_link' => array( '1', 'दà¥à¤µà¤¾=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'अलà¥à¤Ÿ=$1', 'alt=$1' ),
+ 'int' => array( '0', 'इनà¥à¤Ÿ:', 'INT:' ),
+ 'sitename' => array( '1', 'संकेतसà¥à¤¥à¤³à¤¨à¤¾à¤µ', 'SITENAME' ),
+ 'ns' => array( '0', 'नावि:', 'NS:' ),
+ 'nse' => array( '0', 'नाविअरिकà¥à¤¤:', 'नावà¥à¤¯à¤¾à¤°à¤¿à¤•à¥à¤¤:', 'नावà¥à¤¯à¤¾à¤–:', 'NSE:' ),
+ 'localurl' => array( '0', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¥à¤¥à¤³:', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤‚केतसà¥à¤¥à¤³:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¥à¤¥à¤²à¥€:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'विदादाता', 'SERVER' ),
+ 'servername' => array( '0', 'विदादातानाव', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'संहीतामारà¥à¤—', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'वà¥à¤¯à¤¾à¤•à¤°à¤£:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'लिंग:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__विनाशीरà¥à¤·à¤•à¤¬à¤¦à¤²__', '__विनाशीब__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__विनामजकà¥à¤°à¤¬à¤¦à¤²__', '__विनामब__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'सदà¥à¤¯à¤†à¤ à¤µà¤¡à¤¾', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'सदà¥à¤¯à¤‰à¤¤à¤°à¤£', 'सदà¥à¤¯à¤‰à¤¤à¤¾à¤°', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤†à¤ à¤µà¤¡à¤¾', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤‰à¤¤à¤°à¤£', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤‰à¤¤à¤¾à¤°', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'आवृतà¥à¤¤à¥€à¤•à¥à¤°à¥à¤®à¤¾à¤‚क', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤¨', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤¨à¥¨', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'आवृतà¥à¤¤à¥€à¤®à¤¾à¤¸', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'आवृतà¥à¤¤à¥€à¤µà¤°à¥à¤·', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'आवृतà¥à¤¤à¥€à¤®à¥à¤¦à¥à¤°à¤¾', 'आवृतà¥à¤¤à¥€à¤ à¤¸à¤¾', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'आवृतà¥à¤¤à¥€à¤¸à¤¦à¤¸à¥à¤¯', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'बहà¥à¤µà¤šà¤¨:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤²à¥€:', 'संपूरà¥à¤£à¤¸à¤‚सà¥à¤¥à¤³à¥€:', 'FULLURLE:' ),
+ 'raw' => array( '0', 'कचà¥à¤šà¥‡:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'शीरà¥à¤·à¤•à¤¦à¤¾à¤–वा', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'ॠ', 'R' ),
+ 'newsectionlink' => array( '1', '__नवविभागदà¥à¤µà¤¾__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__विनानवविभागदà¥à¤µà¤¾__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'सदà¥à¤¯à¤†à¤µà¥ƒà¤¤à¥à¤¤à¥€', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'संकेतसà¥à¤¥à¤²à¥€à¤†à¤‚गà¥à¤²à¥à¤¸à¤‚केत:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'नांगरआंगà¥à¤²à¤¸à¤‚केत', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'सदà¥à¤¯à¤•à¤¾à¤²à¤®à¥à¤¦à¥à¤°à¤¾', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤•à¤¾à¤²à¤®à¥à¤¦à¥à¤°à¤¾', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'दिशाचिनà¥à¤¹', 'दिशादरà¥à¤¶à¤•', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#भाषा:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'मसà¥à¤¦à¤¾à¤­à¤¾à¤·à¤¾', 'मजकà¥à¤°à¤­à¤¾à¤·à¤¾', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'नामविशà¥à¤µà¤¾à¤¤à¥€à¤²à¤ªà¤¾à¤¨à¥‡:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'पà¥à¤°à¤šà¤¾à¤²à¤•à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'कà¥à¤°à¤®à¤ªà¤¦à¥à¤§à¤¤à¥€', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'डावाभरीव', 'भरीवडावा', 'PADLEFT' ),
+ 'padright' => array( '0', 'उजवाभरीव', 'भरीवउजवा', 'PADRIGHT' ),
+ 'special' => array( '0', 'विशेष', 'special' ),
+ 'defaultsort' => array( '1', 'अविचलवरà¥à¤—:', 'अविचलवरà¥à¤—कळ:', 'अविचलवरà¥à¤—वरà¥à¤—ीकरण:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'संचिकामारà¥à¤—:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'खूण', 'खूणगाठ', 'tag' ),
+ 'hiddencat' => array( '1', '__वरà¥à¤—लपवा__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'वरà¥à¤—ातीलपाने', 'वरà¥à¤—ीतपाने', 'शà¥à¤°à¥‡à¤£à¥€à¤¤à¤ªà¤¾à¤¨à¥‡', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'पानकà¥à¤·à¤®à¤¤à¤¾', 'PAGESIZE' ),
+ 'index' => array( '1', '__कà¥à¤°à¤®à¥€à¤¤__', '__अनà¥à¤•à¥à¤°à¤®à¥€à¤¤__', '__INDEX__' ),
+ 'noindex' => array( '1', '__विनाकà¥à¤°à¤®à¥€à¤¤__', '__विनाअनà¥à¤•à¥à¤°à¤®à¥€à¤¤__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'गटकà¥à¤°à¤®à¤¾à¤‚क', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__अविचलपà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'सà¥à¤°à¤•à¥à¤·à¤¾à¤¸à¥à¤¤à¤°', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'दिनांकनपदà¥à¤§à¤¤à¥€', 'formatdate', 'dateformat' ),
);
$digitTransformTable = array(
@@ -313,6 +314,8 @@ $digitTransformTable = array(
$linkTrail = "/^([\xE0\xA4\x80-\xE0\xA5\xA3\xE0\xA5\xB1-\xE0\xA5\xBF\xEF\xBB\xBF\xE2\x80\x8D]+)(.*)$/sDu";
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'दà¥à¤µà¥à¤¯à¤¾à¤‚चे अधोरेखन:',
@@ -667,20 +670,22 @@ MySQL returned error "$3: $4".',
'formerror' => 'तà¥à¤°à¥à¤Ÿà¥€: फॉरà¥à¤® सबमीट करता आलेला नाही',
'badarticleerror' => 'या पानावर ही कृती करता येत नाही.',
'cannotdelete' => '$1 हे पान किंवा संचिका वगळता आलेली नाही. (आधीच इतर कà¥à¤£à¥€ वगळले असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.)',
+'cannotdelete-title' => '$1 ला वगळू शकत नाहि',
'badtitle' => 'चà¥à¤•à¥€à¤šà¥‡ शीरà¥à¤·à¤•',
'badtitletext' => 'आपण मागितलेले शीरà¥à¤·à¤• पान अयोगà¥à¤¯, रिकामे अथवा चूकीने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीरà¥à¤·à¤• आहे. तà¥à¤¯à¤¾à¤¤ à¤à¤• किंवा अधिक शीरà¥à¤·à¤•à¤…योगà¥à¤¯ चिनà¥à¤¹à¥‡ आहेत.',
-'perfcached' => 'खालील माहिती सयीमधà¥à¤¯à¥‡(कॅशे) ठेवली आहे तà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ ती नवीनतम नसावी.',
-'perfcachedts' => 'खालील माहिती सयीमधà¥à¤¯à¥‡(कॅशे) ठेवली आहे आणि शेवटी $1 ला बदलली होती.',
+'perfcached' => 'खालील माहिती सयीमधà¥à¤¯à¥‡(कॅशे) ठेवली आहे तà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ ती नवीनतम {{PLURAL:$1|one result is|$1 results }} नसावी.',
+'perfcachedts' => 'खालील माहिती सयीमधà¥à¤¯à¥‡(कॅशे) ठेवली आहे आणि शेवटी $1 ला {{PLURAL:$4|one result is|$4 results}} बदलली होती.',
'querypage-no-updates' => 'सधà¥à¤¯à¤¾ या पाना करिता नवीसंसà¥à¤•à¤°à¤£à¥‡ अनà¥à¤ªà¤²à¤¬à¥à¤§ केली आहेत.आतà¥à¤¤à¤¾à¤š येथील विदा ताजा होणार नाही.',
'wrong_wfQuery_params' => 'wfQuery()साठी चà¥à¤•à¥€à¤šà¥‡ पॅरेमीटरà¥à¤¸ दिलेले आहेत<br />
कारà¥à¤¯ (function): $1<br />
पृचà¥à¤›à¤¾ (Query): $2',
'viewsource' => 'सà¥à¤°à¥‹à¤¤ पहा',
-'viewsourcefor' => '$1 चा',
+'viewsource-title' => '$1 चा उगम बघा',
'actionthrottled' => 'कृती अवरूदà¥à¤§ (throttle) केली',
'actionthrottledtext' => 'आंतरजाल-चिखलणी विरोधी उपायाचà¥à¤¯à¤¾ दृषà¥à¤Ÿà¥€à¤¨à¥‡(anti-spam measure), ही कृती थोडà¥à¤¯à¤¾ कालावधीत असंखà¥à¤¯à¤µà¥‡à¤³à¤¾ करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत करणà¥à¤¯à¤¾à¤¤ आले आहे, आणि आपण या मरà¥à¤¯à¤¾à¤¦à¥‡à¤šà¥‡ उलà¥à¤²à¤‚घन केले आहे. कृपया थोडà¥à¤¯à¤¾ वेळाने पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
'protectedpagetext' => 'हे पान बदल होऊ नयेत मà¥à¤¹à¤£à¥à¤¨ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केले आहे.',
'viewsourcetext' => 'तà¥à¤®à¥à¤¹à¥€ या पानाचा सà¥à¤°à¥‹à¤¤ पाहू शकता व पà¥à¤°à¤¤ करू शकता:',
+'viewyourtext' => 'तà¥à¤®à¥à¤¹à¥€ या पानाचे सà¥à¤¤à¥à¤°à¥‹à¤¤ पाहू शकता व पà¥à¤°à¤¤ करू शकता',
'protectedinterface' => 'हे पान सॉफà¥à¤Ÿà¤µà¥‡à¤…रला इंटरफेस लेखन पà¥à¤°à¤µà¤¤à¥‡, मà¥à¤¹à¤£à¥‚न दà¥à¤°à¥‚पयोग टाळणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ संरकà¥à¤·à¤¿à¤¤ केलेले आहे.',
'editinginterface' => "'''सावधान:''' तà¥à¤®à¥à¤¹à¥€ संचेतनाचे(Software) संपरà¥à¤•à¤®à¤¾à¤§à¥à¤¯à¤® मजकà¥à¤° असलेले पान संपादीत करित आहात.या पानावरील बदल इतर उपयोगकरà¥à¤¤à¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ उपयोगकरà¥à¤¤à¤¾-संपरà¥à¤•à¤®à¤¾à¤§à¥à¤¯à¤®à¤¾à¤šà¥‡ सà¥à¤µà¤°à¥‚प पालटवू शकते.भाषांतरणांकरिता कृपया मिडीयाविकि सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¥€à¤•à¤°à¤£ पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤šà¥à¤¯à¤¾ [//translatewiki.net/wiki/Main_Page?setlang=mr बीटाविकि] सà¥à¤µà¤¿à¤§à¥‡à¤šà¤¾ उपयोग करणà¥à¤¯à¤¾à¤¬à¤¦à¥à¤¦à¤² विचार करा.",
'sqlhidden' => 'छूपी à¤à¤¸à¥à¤•à¥à¤¯à¥‚à¤à¤² पृचà¥à¤›à¤¾ (SQL query hidden)',
@@ -773,6 +778,7 @@ $2',
'noemailprefs' => 'खालील सà¥à¤µà¤¿à¤§à¤¾ कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¿à¤¤ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ इ-मेल पतà¥à¤¤à¤¾ पà¥à¤°à¤µà¤¾.',
'emailconfirmlink' => 'आपला ई-मेल पतà¥à¤¤à¤¾ तपासून पहा.',
'invalidemailaddress' => 'तà¥à¤®à¥à¤¹à¥€ दिलेला इमेल पतà¥à¤¤à¤¾ चà¥à¤•à¥€à¤šà¤¾ आहे, कारण तो योगà¥à¤¯à¤ªà¥à¤°à¤•à¤¾à¤°à¥‡ लिहिलेला नाही. कृपया योगà¥à¤¯à¤ªà¥à¤°à¤•à¤¾à¤°à¥‡ इमेल पतà¥à¤¤à¤¾ लिहा अथवा ती जागा मोकळी सोडा.',
+'cannotchangeemail' => 'या विकीवर खातà¥à¤¯à¤¾à¤šà¤¾ ईमेल बदलता येत नाही',
'accountcreated' => 'खाते उघडले.',
'accountcreatedtext' => '$1 चे सदसà¥à¤¯à¤–ाते उघडले.',
'createaccount-title' => '{{SITENAME}} साठीची सदसà¥à¤¯ नोंदणी',
@@ -788,6 +794,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'पीà¤à¤šà¤ªà¥€à¤šà¥à¤¯à¤¾ विपतà¥à¤°() परà¥à¤¯à¤¾à¤¯à¤¾à¤¤ अजà¥à¤žà¤¾à¤¤ चूक',
+'user-mail-no-addy' => 'ईमेल पतà¥à¤¤à¥à¤¯à¤¾ विना ईमेल पाठवणà¥à¤¯à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ केला',
# Change password dialog
'resetpass' => 'परवलीचा शबà¥à¤¦ बदला',
@@ -808,28 +815,43 @@ $2',
'resetpass-temp-password' => 'तातà¥à¤ªà¥à¤°à¤¤à¤¾ परवलीचा शबà¥à¤¦',
# Special:PasswordReset
-'passwordreset' => 'परवलीचा शबà¥à¤¦ पूरà¥à¤µà¤µà¤¤ करा',
-'passwordreset-text' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ खातà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ माहितीसंदरà¥à¤­à¤¾à¤¤ विपतà¥à¤°à¤¾à¤¦à¥à¤µà¤¾à¤°à¥‡ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• येणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ हा अरà¥à¤œ पूरà¥à¤£ भरा.',
-'passwordreset-legend' => 'परवलीचा शबà¥à¤¦ पूरà¥à¤µà¤µà¤¤ करा',
-'passwordreset-disabled' => 'या विकीवर परवलीचा शबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करता येत नाही.',
-'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीचà¥à¤¯à¤¾ भागांपैकी à¤à¤• भाग लिहा}}',
-'passwordreset-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ:',
-'passwordreset-domain' => 'डोमेन',
-'passwordreset-email' => 'विपतà¥à¤° पतà¥à¤¤à¤¾',
-'passwordreset-emailtitle' => '{{SITENAME}} वर खातà¥à¤¯à¤¾à¤šà¥€ माहिती',
-'passwordreset-emailtext-ip' => 'कà¥à¤£à¥€à¤¤à¤°à¥€ (कदाचित तà¥à¤®à¥à¤¹à¥€, अंकपतà¥à¤¤à¤¾ $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शबà¥à¤¦à¤¾à¤‚क पाठवावा’ अशी विनंती केली आहे ($4).
+'passwordreset' => 'परवलीचा शबà¥à¤¦ पूरà¥à¤µà¤µà¤¤ करा',
+'passwordreset-text' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ खातà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ माहितीसंदरà¥à¤­à¤¾à¤¤ विपतà¥à¤°à¤¾à¤¦à¥à¤µà¤¾à¤°à¥‡ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• येणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ हा अरà¥à¤œ पूरà¥à¤£ भरा.',
+'passwordreset-legend' => 'परवलीचा शबà¥à¤¦ पूरà¥à¤µà¤µà¤¤ करा',
+'passwordreset-disabled' => 'या विकीवर परवलीचा शबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करता येत नाही.',
+'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीचà¥à¤¯à¤¾ भागांपैकी à¤à¤• भाग लिहा}}',
+'passwordreset-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ:',
+'passwordreset-domain' => 'डोमेन',
+'passwordreset-capture' => 'ईमेल कशी असेल ते बघायचेय ?',
+'passwordreset-capture-help' => 'या चौकटित खूण केली तर, ईमेल (तातà¥à¤ªà¥à¤°à¥à¤¤à¥à¤¯à¤¾ परवली शबà¥à¤¦à¤¾ सोबत) दखवणà¥à¤¯à¤¤ व पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¥à¤¤à¥à¤¯à¤¸ पाठवणà¥à¤¯à¤¤ येइल',
+'passwordreset-email' => 'विपतà¥à¤° पतà¥à¤¤à¤¾',
+'passwordreset-emailtitle' => '{{SITENAME}} वर खातà¥à¤¯à¤¾à¤šà¥€ माहिती',
+'passwordreset-emailtext-ip' => 'कà¥à¤£à¥€à¤¤à¤°à¥€ (कदाचित तà¥à¤®à¥à¤¹à¥€, अंकपतà¥à¤¤à¤¾ $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शबà¥à¤¦à¤¾à¤‚क पाठवावा’ अशी विनंती केली आहे ($4).
"$2" सदसà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क "$3" à¤à¤¾à¤²à¤¾ आहे.
तà¥à¤®à¥à¤¹à¥€ आता पà¥à¤°à¤µà¥‡à¤¶ करा व तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क बदला. तà¥à¤®à¤šà¤¾ असà¥à¤¥à¤¾à¤¯à¥€ शबà¥à¤¦à¤¾à¤‚क {{PLURAL:$5|à¤à¤•à¤¾ दिवसात|$5 दिवसांत}} संपेल.
जर ही विनंती इतर कà¥à¤£à¥€ केली असेल किंवा तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क आठवला असेल आणि तà¥à¤®à¥à¤¹à¥€ तो आता बदलू इचà¥à¤›à¤¿à¤¤ नसाल तर, तà¥à¤®à¥à¤¹à¥€ हा संदेश दà¥à¤°à¥à¤²à¤•à¥à¤·à¤¿à¤¤ करून जà¥à¤¨à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क वापरत राहू शकता.',
-'passwordreset-emailtext-user' => 'कà¥à¤£à¥€à¤¤à¤°à¥€ (कदाचित तà¥à¤®à¥à¤¹à¥€, सदसà¥à¤¯ $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शबà¥à¤¦à¤¾à¤‚क पाठवावा’ अशी विनंती केली आहे ($4).
+'passwordreset-emailtext-user' => 'कà¥à¤£à¥€à¤¤à¤°à¥€ (कदाचित तà¥à¤®à¥à¤¹à¥€, सदसà¥à¤¯ $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शबà¥à¤¦à¤¾à¤‚क पाठवावा’ अशी विनंती केली आहे ($4).
"$2" सदसà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क "$3" à¤à¤¾à¤²à¤¾ आहे.
तà¥à¤®à¥à¤¹à¥€ आता पà¥à¤°à¤µà¥‡à¤¶ करा व तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क बदला. तà¥à¤®à¤šà¤¾ असà¥à¤¥à¤¾à¤¯à¥€ शबà¥à¤¦à¤¾à¤‚क {{PLURAL:$5|à¤à¤•à¤¾ दिवसात|$5 दिवसांत}} संपेल.
जर ही विनंती इतर कà¥à¤£à¥€ केली असेल किंवा तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क आठवला असेल आणि तà¥à¤®à¥à¤¹à¥€ तो आता बदलू इचà¥à¤›à¤¿à¤¤ नसाल तर, तà¥à¤®à¥à¤¹à¥€ हा संदेश दà¥à¤°à¥à¤²à¤•à¥à¤·à¤¿à¤¤ करून जà¥à¤¨à¤¾ परवलीचा शबà¥à¤¦à¤¾à¤‚क वापरत राहू शकता.',
-'passwordreset-emailelement' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ: $1
+'passwordreset-emailelement' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ: $1
असà¥à¤¥à¤¾à¤¯à¥€ परवलीचा शबà¥à¤¦: $2',
-'passwordreset-emailsent' => 'आठवणीसाठी à¤à¤• विपतà¥à¤° पाठवणà¥à¤¯à¤¾à¤¤ आले आहे.',
+'passwordreset-emailsent' => 'आठवणीसाठी à¤à¤• विपतà¥à¤° पाठवणà¥à¤¯à¤¾à¤¤ आले आहे.',
+'passwordreset-emailsent-capture' => 'खाली दाखवलà¥à¤¯à¤¾à¤¨à¥à¤¸à¤¾à¤° आठवणीकरता ईमेल पाठवला आहे',
+'passwordreset-emailerror-capture' => 'आठवणीकरता खाली दाखवलà¥à¤¯à¤¾à¤¨à¥à¤¸à¤¾à¤° ईमेल तयार केला होता, पण पà¥à¤°à¤¯à¥‹à¤—करता $1 ला पाठवता आला नाही',
+
+# Special:ChangeEmail
+'changeemail' => 'इमेल पतà¥à¤¤à¤¾ बदला',
+'changeemail-header' => 'आपलà¥à¤¯à¤¾ खातà¥à¤¯à¤¾à¤šà¤¾ ईमेल पतà¥à¤¤à¤¾ बदला.',
+'changeemail-text' => 'आपला ई-मेल पतà¥à¤¤ बदलणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ हे आवेदनपतà¥à¤° भरा. या बदलाची पà¥à¤·à¥à¤Ÿà¥€ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ टाकावा लागेल.',
+'changeemail-no-info' => 'हे पान थेट बघणà¥à¤¯à¤¾à¤¸à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ पà¥à¤°à¤µà¥‡à¤¶ करावा लगेल.',
+'changeemail-oldemail' => 'सधà¥à¤¯à¤¾à¤šà¤¾ ईमेल पतà¥à¤¤à¤¾ :',
+'changeemail-newemail' => 'नवा ईमेल पतà¥à¤¤à¤¾:',
+'changeemail-none' => '(दिलेला नाही)',
+'changeemail-submit' => 'ईमेल बदला',
+'changeemail-cancel' => 'रदà¥à¤¦ करा',
# Edit page toolbar
'bold_sample' => 'ठळक मजकूर',
@@ -893,9 +915,6 @@ $2',
तà¥à¤®à¤šà¤¾ सà¥à¤¥à¤—न कà¥à¤° $5 आहे. कृपया तूमचà¥à¤¯à¤¾ कोणतà¥à¤¯à¤¾à¤¹à¥€ शंकासमाधाना साठी हा कà¥à¤°à¤‚मांक नमà¥à¤¦ करा.',
'blockednoreason' => 'कारण दिलेले नाही',
-'blockedoriginalsource' => "'''$1''' चा सà¥à¤°à¥‹à¤¤ खाली दिलà¥à¤¯à¤¾à¤ªà¥à¤°à¤®à¤¾à¤£à¥‡:",
-'blockededitsource' => "'''$1'''ला '''तà¥à¤®à¤šà¥€ संपादने'''चा मजकà¥à¤° खाली दाखवला आहे:",
-'whitelistedittitle' => 'संपादनासाठी सदसà¥à¤¯ मà¥à¤¹à¤£à¥‚न पà¥à¤°à¤µà¥‡à¤¶ आवशà¥à¤¯à¤• आहे.',
'whitelistedittext' => 'लेखांचे संपादन करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आधी $1 करा.',
'confirmedittext' => 'तà¥à¤®à¥à¤¹à¥€ संपादने करणà¥à¤¯à¤¾à¤ªà¥à¤°à¥à¤µà¥€ तà¥à¤®à¤šà¤¾ विपतà¥à¤° पतà¥à¤¤à¤¾ पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ करणे आवशà¥à¤¯à¤• आहे.Please set and validate तà¥à¤®à¤šà¤¾ विपतà¥à¤° पतà¥à¤¤à¤¾ तà¥à¤®à¤šà¥à¤¯à¤¾[[Special:Preferences|सदसà¥à¤¯ पसंती]]तून लिहा व सिदà¥à¤§ करा.',
'nosuchsectiontitle' => 'असा विभाग नाही.',
@@ -967,7 +986,7 @@ $2',
तà¥à¤®à¥à¤¹à¥€ येथे लेखन करताना हे सà¥à¤¦à¥à¤§à¤¾ गृहित धरलेले असते की येथे केलेले लेखन तà¥à¤®à¤šà¥‡ सà¥à¤µà¤¤à¤ƒà¤šà¥‡ आणि केवळ सà¥à¤µà¤¤à¤ƒà¤šà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° (कॉपीराईट) मालकीचे आहे किंवा पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¾à¤¨à¥‡ गठीत न होणारà¥â€à¤¯à¤¾ सारà¥à¤µà¤œà¤¨à¤¿à¤• जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤°à¤¾à¤¤à¥‚न घेतले आहे किंवा ततà¥à¤¸à¤® मà¥à¤•à¥à¤¤ सà¥à¤°à¥‹à¤¤à¤¾à¤¤à¥‚न घेतले आहे. तà¥à¤®à¥à¤¹à¥€ संपादन करताना तसे वचन देत आहात. '''पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¯à¥à¤•à¥à¤¤ लेखन सà¥à¤¯à¥‹à¤—à¥à¤¯ परवानगीशिवाय मà¥à¤³à¥€à¤š चढवू/भरू नये!'''",
'copyrightwarning2' => "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपलà¥à¤¯à¤¾ लेखनाचे मà¥à¤•à¥à¤¤ संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />
तà¥à¤®à¥à¤¹à¥€ येथे लेखन करताना हे सà¥à¤¦à¥à¤§à¤¾ गृहित धरलेले असते की येथे केलेले लेखन तà¥à¤®à¤šà¥‡ सà¥à¤µà¤¤à¤ƒà¤šà¥‡ आणि केवळ सà¥à¤µà¤¤à¤ƒà¤šà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° (कॉपीराईट) मालकीचे आहे किंवा पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¾à¤¨à¥‡ गठीत न होणारà¥â€à¤¯à¤¾ सारà¥à¤µà¤œà¤¨à¤¿à¤• जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤°à¤¾à¤¤à¥‚न घेतले आहे किंवा ततà¥à¤¸à¤® मà¥à¤•à¥à¤¤ सà¥à¤°à¥‹à¤¤à¤¾à¤¤à¥‚न घेतले आहे. तà¥à¤®à¥à¤¹à¥€ संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¯à¥à¤•à¥à¤¤ लेखन सà¥à¤¯à¥‹à¤—à¥à¤¯ परवानगीशिवाय मà¥à¤³à¥€à¤š चढवू/भरू नये!'''",
-'longpageerror' => "'''तà¥à¤°à¥‚टी:आपण दिलेला मजकà¥à¤° जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ शकà¥à¤¯ $2 किलोबाईट पेकà¥à¤·à¤¾ अधिक लांबीचा $1 किलोबाईट आहे.तो जतन केला जाऊ शकत नाही.'''",
+'longpageerror' => 'तà¥à¤°à¥‚टी:आपण दिलेला मजकà¥à¤° जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ शकà¥à¤¯ {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेकà¥à¤·à¤¾ अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही',
'readonlywarning' => "सावधान:विदागारास भरण-पोषणाकरिता ताळे ठोकले आहे,तà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ सधà¥à¤¯à¤¾ तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥‡ संपादन जतन करू शकत नाही.जर तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हवे असेल तर नंतर उपयोग करणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ दृषà¥à¤Ÿà¥€à¤¨à¥‡, तà¥à¤®à¥à¤¹à¥€ मजकà¥à¤° ’मजकà¥à¤° संचिकेत’(टेकà¥à¤¸à¥à¤Ÿ फाईल मधà¥à¤¯à¥‡) कापून-चिटकवू शकता.'''
विदागारास ताळे ठोकलेलà¥à¤¯à¤¾ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚नी $1 असे सà¥à¤ªà¤·à¥à¤Ÿà¥€à¤•à¤°à¤£à¥‡ दीले आहे",
'protectedpagewarning' => "'''सूचना: हे सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पान आहे. फकà¥à¤¤ पà¥à¤°à¤šà¤¾à¤²à¤• याचà¥à¤¯à¤¾à¤¤ बदल करॠशकतात.'''",
@@ -1132,8 +1151,6 @@ $3ने ''$2'' कारण दिले आहे.",
'revdelete-unsuppress' => 'पà¥à¤°à¥à¤¨à¤¸à¥à¤¥à¤¾à¤ªà¥€à¤¤ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚वरील बंधने ऊठवा',
'revdelete-log' => 'कारण:',
'revdelete-submit' => 'निवडलेलà¥à¤¯à¤¾ {{PLURAL:$1|आवृतà¥à¤¤à¥€à¤²à¤¾|आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚ना}} लागू करा',
-'revdelete-logentry' => '[[$1]]ची आवरà¥à¤¤à¤¨ सदृशà¥à¤¯à¤¤à¤¾ बदलली.',
-'logdelete-logentry' => '[[$1]]ची घटना सदृशà¥à¤¯à¤¤à¤¾ बदलली.',
'revdelete-success' => "'''आवरà¥à¤¤à¤¨à¤¾à¤‚ची दृशà¥à¤¯à¤¤à¤¾ यशसà¥à¤µà¥€à¤ªà¤£à¥‡ अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ केली.'''",
'revdelete-failure' => "'''आवरà¥à¤¤à¤¨ दृशà¥à¤¯à¤¤à¤¾ अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ करता येत नाही:'''
$1",
@@ -1145,15 +1162,6 @@ $1",
'revdel-restore-visible' => 'दृषà¥à¤¯ आवरà¥à¤¤à¤¨à¥‡',
'pagehist' => 'पानाचा इतिहास',
'deletedhist' => 'वगळलेला इतिहास',
-'revdelete-content' => 'कंटेंट',
-'revdelete-summary' => 'संपादन माहिती',
-'revdelete-uname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®',
-'revdelete-restricted' => 'पà¥à¤°à¤¬à¤‚धकांना बंधने दिली',
-'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धकांची बंधने काढली',
-'revdelete-hid' => 'लपवा $1',
-'revdelete-unhid' => 'अनहिड $1',
-'revdelete-log-message' => '$2 {{PLURAL:$2|आवॄतà¥à¤¤à¥€|आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚}}साठी $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|घटने|घटनां}}साठी $1',
'revdelete-hide-current' => '$1 मधील $2 या वेळचे आवरà¥à¤¤à¤¨ लपवता येत नाही, : ते सदà¥à¤¯ पà¥à¤¨à¤°à¤¾à¤µà¤°à¥à¤¤à¤¨ आहे.
ते लपवता येत नाही.',
'revdelete-show-no-access' => '$2, $1 ची वसà¥à¤¤à¥‚ दाखवताना अडचण: ती "पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित" खूण असलेली आहे.
@@ -1309,12 +1317,14 @@ $1",
'prefs-rc' => 'अलीकडील बदल',
'prefs-watchlist' => 'पहाऱà¥à¤¯à¤¾à¤šà¥€ सूची',
'prefs-watchlist-days' => 'पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत दिसणारà¥â€à¤¯à¤¾ दिवसांची संखà¥à¤¯à¤¾:',
-'prefs-watchlist-days-max' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ ७ दिवस.',
+'prefs-watchlist-days-max' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ $1 {{PLURAL:$1|दिवस|दिवस}}',
'prefs-watchlist-edits' => 'वाढीव पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत दिसणारà¥â€à¤¯à¤¾ संपादनांची संखà¥à¤¯à¤¾:',
'prefs-watchlist-edits-max' => 'अधिकतम अंक: १०००.',
'prefs-watchlist-token' => 'पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीचा बिलà¥à¤²à¤¾:',
'prefs-misc' => 'इतर',
'prefs-resetpass' => 'परवलीचा शबà¥à¤¦ बदला.',
+'prefs-changeemail' => 'विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ बदला',
+'prefs-setemail' => 'तà¥à¤®à¤šà¤¾ इमेल पतà¥à¤¤à¤¾ लिहा.',
'prefs-email' => 'विपतà¥à¤° परà¥à¤¯à¤¾à¤¯',
'prefs-rendering' => 'देखावा',
'saveprefs' => 'जतन करा',
@@ -1373,6 +1383,7 @@ $1",
'yourrealname' => 'तà¥à¤®à¤šà¥‡ खरे नाव:',
'yourlanguage' => 'भाषा:',
'yourvariant' => 'भाषा वेगळे आशय:',
+'prefs-help-variant' => 'या विकीची पाने दाखवणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ पसंतीचे शà¥à¤¦à¥à¤§à¤²à¥‡à¤–न',
'yournick' => 'आपले उपनाव (सहीसाठी)',
'prefs-help-signature' => 'चरà¥à¤šà¤¾ पानावरील टिपणाखाली "<nowiki>~~~~</nowiki>" लिहावे मà¥à¤¹à¤£à¤œà¥‡ तà¥à¤¯à¤¾à¤šà¥‡ रूपांतर आपली सही व सही करणà¥à¤¯à¤¾à¤šà¥€ वेळ यात होईल.',
'badsig' => 'अयोगà¥à¤¯ कचà¥à¤šà¥€ सही;HTML खूणा तपासा.',
@@ -1412,7 +1423,7 @@ $1",
'userrights-lookup-user' => 'सदसà¥à¤¯ गटांचे(गà¥à¤°à¥‚पà¥à¤¸) वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤ªà¤¨ करा.',
'userrights-user-editname' => 'सदसà¥à¤¯ नाव टाका:',
'editusergroup' => 'सदसà¥à¤¯ गट (गà¥à¤°à¥‚पà¥à¤¸) संपादीत करा',
-'editinguser' => "सदसà¥à¤¯ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])चे सदसà¥à¤¯ अधिकारात बदल केला जात आहे.",
+'editinguser' => "सदसà¥à¤¯ '''[[User:$1|$1]]''' $2 चे सदसà¥à¤¯ अधिकारात बदल केला जात आहे.",
'userrights-editusergroup' => 'सदसà¥à¤¯ मंडळे संपादीत करा',
'saveusergroups' => 'सदसà¥à¤¯ गट जतन करा',
'userrights-groupsmember' => '(चा) सभासद:',
@@ -1506,13 +1517,13 @@ $1",
'right-autopatrol' => 'संपादने आपोआप तपासलेली (patrolled) मà¥à¤¹à¤£à¥‚न जतन करा',
'right-patrolmarks' => 'अलीकडील बदलांमधील तपासलà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ खूणा पहा',
'right-unwatchedpages' => 'न पाहिलेलà¥à¤¯à¤¾ पानांची यादी पहा',
-'right-trackback' => 'à¤à¤• विपरित पथ पाठवा',
'right-mergehistory' => 'पानांचा इतिहास à¤à¤•à¤¤à¥à¤°à¤¿à¤¤ करा',
'right-userrights' => 'सरà¥à¤µ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादा',
'right-userrights-interwiki' => 'इतर विकिंवर सदसà¥à¤¯ अधिकार बदला',
'right-siteadmin' => 'माहितीसाठà¥à¤¯à¤¾à¤²à¤¾ कà¥à¤²à¥à¤ª लावा अथवा काढा',
'right-override-export-depth' => 'पाने निरà¥à¤¯à¤¾à¤¤ करा (आंतरिक जेडलेली पाने पाचवà¥à¤¯à¤¾ पतळी परà¥à¤¯à¤‚त समाविषà¥à¤Ÿ करà¥à¤¨).',
'right-sendemail' => 'इतर सदसà¥à¤¯à¤¾à¤‚ना विपतà¥à¤°à¥‡ पाठवा',
+'right-passwordreset' => 'परवलीचा शबà¥à¤¦ (पासवरà¥à¤¡) पà¥à¤¨:सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ केलà¥à¤¯à¤¾à¤šà¥€ इ मेल पहा.',
# User rights log
'rightslog' => 'सदसà¥à¤¯ आधिकार नोंद',
@@ -1546,16 +1557,17 @@ $1",
'action-suppressionlog' => 'ही खासगी यादी पहा',
'action-block' => 'या सदसà¥à¤¯à¤¾à¤¸ संपादन करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
'action-protect' => 'या पानाशाठी सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ बदला',
+'action-rollback' => 'या आधीचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤šà¥‡ नà¥à¤•à¤¤à¥‡à¤š संपादन केलेले à¤à¤–ादे विशिषà¥à¤Ÿ पानाचे बदल लवकर आधीचà¥à¤¯ सà¥à¤¥à¤¿à¤¤à¥€à¤¤ नà¥à¤¯à¤¾',
'action-import' => 'दà¥à¤¸à¤°à¥â€à¤¯à¤¾ विकीवरà¥à¤¨ हे पान आयात करा',
'action-importupload' => 'चढविलेलà¥à¤¯à¤¾ संचिकेतून पान आयात करा',
'action-patrol' => 'इतरांची संपादने तपासलेली मà¥à¤¹à¤£à¥‚न जतन करा',
'action-autopatrol' => 'आपलà¥à¤¯à¤¾ बदलास देखरेखी खाली असलà¥à¤¯à¤¾à¤šà¥‡ सà¥à¤šà¤µà¤¾',
'action-unwatchedpages' => 'न पाहिलेलà¥à¤¯à¤¾ पानांची यादी पहा',
-'action-trackback' => 'à¤à¤• विपरित पथ पाठवा',
'action-mergehistory' => 'पानाचा इतिहास विलीन करा',
'action-userrights' => 'सरà¥à¤µ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादित करा',
'action-userrights-interwiki' => 'इतर विकिंवरचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादित करा',
'action-siteadmin' => 'माहितीसाठà¥à¤¯à¤¾à¤²à¤¾ कà¥à¤²à¥à¤ª लावा अथवा काढा',
+'action-sendemail' => 'विपतà¥à¤°à¥‡ (ई-मेलà¥à¤¸) पाठवा.',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|बदल|बदल}}',
@@ -1587,6 +1599,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|सदसà¥à¤¯à¤¾à¤¨à¥‡|सदसà¥à¤¯à¤¾à¤‚नी}} पहारा दिलेला आहे]',
'rc_categories' => 'वरà¥à¤—ांपपà¥à¤°à¤¤à¥‡ मरà¥à¤¯à¤¾à¤¦à¥€à¤¤ ठेवा ("|"ने वेगळे करा)',
'rc_categories_any' => 'कोणतेही',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} बदला',
'newsectionsummary' => '/* $1 */ नवीन विभाग',
'rc-enhanced-expand' => 'अधिक माहिती दाखवा (जावासà¥à¤•à¥à¤°à¥€à¤ªà¥à¤Ÿà¤šà¥€ गरज)',
'rc-enhanced-hide' => 'अधिक माहिती लपवा',
@@ -1638,6 +1651,7 @@ $1",
'ignorewarnings' => 'सरà¥à¤µ सà¥à¤šà¤¨à¤¾à¤‚कडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा',
'minlength1' => 'संचिकानाम किमान à¤à¤• अकà¥à¤·à¤°à¤¾à¤šà¥‡ हवे.',
'illegalfilename' => '"$1" या संचिकानामात शीरà¥à¤·à¤•à¤¾à¤¤ चालू न शकणारी अकà¥à¤·à¤°à¥‡ आहेत. कृपया संचिकानाम बदलून पà¥à¤¨à¥à¤¹à¤¾ चढवणà¥à¤¯à¤¾à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
+'filename-toolong' => '२४० बाईटपेकà¥à¤·à¤¾ फाईलचे नांव सà¥à¤µà¥€à¤•à¤¾à¤°à¤²à¥‡ जाणार नाही.',
'badfilename' => 'संचिकेचे नाव बदलून "$1" असे केले आहे.',
'filetype-mime-mismatch' => 'संचिका विसà¥à¤¤à¤¾à¤°à¤• ".$1" ठरवलेलà¥à¤¯à¤¾ à¤à¤®à¤†à¤¯à¤à¤®à¤ˆ संचिकापà¥à¤°à¤•à¤¾à¤°à¤¾à¤‚शी जà¥à¤³à¤¤ नाही ($2).',
'filetype-badmime' => 'विविधामाप(माईम) "$1" पà¥à¤°à¤•à¤¾à¤°à¤šà¥à¤¯à¤¾ संचिका चढवणà¥à¤¯à¤¾à¤¸ परवानगी नाही.',
@@ -1723,6 +1737,41 @@ $1',
'upload-unknown-size' => 'अजà¥à¤žà¤¾à¤¤ आकारमान',
'upload-http-error' => 'à¤à¤• à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€ चूक उदà¥à¤­à¤µà¤²à¥€: $1',
+# File backend
+'backend-fail-stream' => '$1 या संचिकेचा सà¥à¤¤à¥à¤°à¥‹à¤¤ शोधता आला नाही.',
+'backend-fail-backup' => '$1 या संचिकेची आधारपà¥à¤°à¤¤ बनविता आली नाही.',
+'backend-fail-notexists' => '$1 ही संचिका असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
+'backend-fail-hashes' => 'तà¥à¤²à¤¨à¤¾ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ फाइल हाशेस मिळाले नाही',
+'backend-fail-notsame' => ' $1 येथे यापेकà¥à¤·à¤¾ विभिनà¥à¤¨ असलेली संचिका पूरà¥à¤µà¥€à¤š विदà¥à¤¯à¤®à¤¾à¤¨ आहे',
+'backend-fail-invalidpath' => '$1 हा वैध संगà¥à¤°à¤¾à¤¹à¤•-पथ नाही.',
+'backend-fail-delete' => '$1 ही संचिका (फाईल) बनवता आली नाही.',
+'backend-fail-alreadyexists' => '$1 ही संचिका अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे.',
+'backend-fail-store' => '$1 ही संचिका $2मधे साठवू शकत नाही.',
+'backend-fail-copy' => '"$1" संचिकेची "$2" ही पà¥à¤°à¤¤ करता आली नाही.',
+'backend-fail-move' => 'संचिका $1 पासून $2मधे हलवता आली नाही.',
+'backend-fail-opentemp' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ संचिका उघडणे जमले नाही.',
+'backend-fail-writetemp' => 'तातà¥à¤ªà¥à¤°à¤¤à¥à¤¯à¤¾ संचिकेत लिहिणे जमले नाही.',
+'backend-fail-closetemp' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ संचिका बंद करणे जमले नाही.',
+'backend-fail-read' => '$1 ही संचिका वाचता आली नाही.',
+'backend-fail-create' => '$1 ही संचिका बनवता आली नाही.',
+'backend-fail-readonly' => 'पारà¥à¤¶à¥à¤µà¤­à¥Œà¤®à¥€à¤• साठवण "$1" “फकà¥à¤¤ वाचा†असे आहे. दिलेले कारण "$2" आहे.',
+'backend-fail-synced' => 'अंतरà¥à¤—त पारà¥à¤¶à¥à¤µà¤­à¥Œà¤®à¥€à¤• साठवणीतील फाईल "$1" विसंगत आहे.',
+'backend-fail-connect' => 'पारà¥à¤¶à¥à¤µà¤­à¥Œà¤®à¥€à¤• साठा "$1"शी संबंध जोडू शकत नाही.',
+'backend-fail-internal' => 'पारà¥à¤¶à¥à¤µà¤­à¥Œà¤®à¥€à¤• साठा "$1" यात अजà¥à¤žà¤¾à¤¤ चूक à¤à¤¾à¤²à¥€ आहे.',
+'backend-fail-contenttype' => '"$1" मधà¥à¤¯à¥‡ ठेवलेलà¥à¤¯à¤¾ फाईलचा महितीचा पà¥à¤°à¤•à¤¾à¤° कळत नाही',
+'backend-fail-batchsize' => 'पारà¥à¤¶à¥à¤µà¤­à¥Œà¤®à¥€à¤• साठयातील बॅच $1 फाईल{{PLURAL:$1|operation|operations}}; मधे मरà¥à¤¯à¤¾à¤¦à¥€à¤¤ कसà¥à¤¤ $२ {{PLURAL:$2|operation|operations}} असू शकते',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" ला मोकळे करता आले नाही;ते कà¥à¤²à¥à¤ªà¤¬à¤‚द नाही.',
+'lockmanager-fail-closelock' => '"$1" साठी लॉक फाइल बंद करू शकत नाही',
+'lockmanager-fail-deletelock' => '"$1" साठी लॉक फाइल वगळू शकत नाही',
+'lockmanager-fail-acquirelock' => '"$1" साठी लॉक फाइल मिळवू शकत नाही',
+'lockmanager-fail-openlock' => '"$1" साठी लॉक फाइल उघडू शकत नाही',
+'lockmanager-fail-releaselock' => '"$1" साठी लॉक उघडू शकत नाही',
+'lockmanager-fail-db-bucket' => '$1 बासà¥à¤•à¥‡à¤Ÿ मधील कà¥à¤²à¥‚प बंद डेटाबेसशी पà¥à¤°à¥‡à¤¸à¤¾ संपरà¥à¤• होवू शकत नाही',
+'lockmanager-fail-db-release' => '"$1" डाटाबेस वरील लॉक उघडू शकत नाही',
+'lockmanager-fail-svr-release' => 'सरà¥à¤µà¥à¤¹à¤° "$1" वरीलॠलॉक उघडू शकत नाही',
+
# ZipDirectoryReader
'zip-file-open-error' => 'संचीका ZIP तपासणीसाठी उघडताना तà¥à¤°à¥à¤Ÿà¥€ आली.',
'zip-wrong-format' => 'ही संचिका "à¤à¤¿à¤ª" पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ नाही.',
@@ -1739,6 +1788,7 @@ $1',
'uploadstash-badtoken' => 'हि कृती अयशसà¥à¤µà¥€ होती. कदाचित आपलà¥à¤¯à¤¾ संपादन अधिकारपतà¥à¤°à¤¾à¤šà¥€ (editing credentials) मà¥à¤¦à¤¤ संपली.',
'uploadstash-errclear' => 'संचिका सà¥à¤µà¤šà¥à¤› करणे अयशसà¥à¤µà¥€.',
'uploadstash-refresh' => 'संचिकांची यादी ताजीतवानी करा',
+'invalid-chunk-offset' => 'अगà¥à¤°à¤¾à¤¹à¥à¤¯ चंक ऑफसेट',
# img_auth script messages
'img-auth-accessdenied' => 'परवानगी नाही',
@@ -1845,23 +1895,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
'filerevert-badversion' => 'दिलेलेलà¥à¤¯à¤¾ वेळ मापनानà¥à¤¸à¤¾à¤°,या संचिकेकरिता कोणतीही पूरà¥à¤µà¥€à¤šà¥€ सà¥à¤¥à¤¾à¤¨à¤¿à¤• आवृतà¥à¤¤à¥€ नाही.',
# File deletion
-'filedelete' => '$1 वगळा',
-'filedelete-legend' => 'संचिका वगळा',
-'filedelete-intro' => "तà¥à¤®à¥à¤¹à¥€ '''[[Media:$1|$1]]''' वगळत आहात.",
-'filedelete-intro-old' => "[$4 $3, $2]चà¥à¤¯à¤¾ वेळेचे '''[[Media:$1|$1]]'''चे आवरà¥à¤¤à¤¨ तà¥à¤®à¥à¤¹à¥€ वगळत आहात.",
-'filedelete-comment' => 'कारण:',
-'filedelete-submit' => 'वगळा',
-'filedelete-success' => "'''$1'''वगळणà¥à¤¯à¤¾à¤¤ आले.",
-'filedelete-success-old' => '<span class="plainlinks">$3, $2 वेळी \'\'\'[[Media:$1|$1]]\'\'\' चे आवरà¥à¤¤à¤¨ वगळणà¥à¤¯à¤¾à¤¤ आले आहे .</span>',
-'filedelete-nofile' => "'''$1''' असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.",
-'filedelete-nofile-old' => "सांगितलेलà¥à¤¯à¤¾ गà¥à¤£à¤§à¤°à¥à¤®à¤¾à¤¨à¥à¤¸à¤¾à¤° '''$1'''चे कोणतेही विदा आवरà¥à¤¤à¤¨ संचित नाही.",
-'filedelete-otherreason' => 'इतर/शिवाय अधिक कारण:',
-'filedelete-reason-otherlist' => 'इतर कारण',
-'filedelete-reason-dropdown' => '*वगळणà¥à¤¯à¤¾à¤šà¥€ सामानà¥à¤¯ कारणे
+'filedelete' => '$1 वगळा',
+'filedelete-legend' => 'संचिका वगळा',
+'filedelete-intro' => "तà¥à¤®à¥à¤¹à¥€ '''[[Media:$1|$1]]''' वगळत आहात.",
+'filedelete-intro-old' => "[$4 $3, $2]चà¥à¤¯à¤¾ वेळेचे '''[[Media:$1|$1]]'''चे आवरà¥à¤¤à¤¨ तà¥à¤®à¥à¤¹à¥€ वगळत आहात.",
+'filedelete-comment' => 'कारण:',
+'filedelete-submit' => 'वगळा',
+'filedelete-success' => "'''$1'''वगळणà¥à¤¯à¤¾à¤¤ आले.",
+'filedelete-success-old' => '<span class="plainlinks">$3, $2 वेळी \'\'\'[[Media:$1|$1]]\'\'\' चे आवरà¥à¤¤à¤¨ वगळणà¥à¤¯à¤¾à¤¤ आले आहे .</span>',
+'filedelete-nofile' => "'''$1''' असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.",
+'filedelete-nofile-old' => "सांगितलेलà¥à¤¯à¤¾ गà¥à¤£à¤§à¤°à¥à¤®à¤¾à¤¨à¥à¤¸à¤¾à¤° '''$1'''चे कोणतेही विदा आवरà¥à¤¤à¤¨ संचित नाही.",
+'filedelete-otherreason' => 'इतर/शिवाय अधिक कारण:',
+'filedelete-reason-otherlist' => 'इतर कारण',
+'filedelete-reason-dropdown' => '*वगळणà¥à¤¯à¤¾à¤šà¥€ सामानà¥à¤¯ कारणे
** पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
** जà¥à¤³à¥€ संचिका',
-'filedelete-edit-reasonlist' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे संपादीत करा',
-'filedelete-maintenance' => 'फाईल वगळने आणि पà¥à¤¨à¥:सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणà¥',
+'filedelete-edit-reasonlist' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे संपादीत करा',
+'filedelete-maintenance' => 'फाईल वगळने आणि पà¥à¤¨à¥:सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणà¥',
+'filedelete-maintenance-title' => 'संचिका (फाईल) वगळू शकत नाही.',
# MIME search
'mimesearch' => 'विविधामाप (माईम) शोधा',
@@ -1956,6 +2007,8 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'wantedpages' => 'पाहिजे असलेले लेख',
'wantedpages-badtitle' => 'परिणामाचà¥à¤¯à¤¾ यादीत अवैध शीरà¥à¤·à¤•: $1',
'wantedfiles' => 'पाहिजे असलेलà¥à¤¯à¤¾ संचिका',
+'wantedfiletext-cat' => 'पà¥à¤¢à¥€à¤² फाइलà¥à¤¸ वापरलà¥à¤¯à¤¾ असतील पण आता असà¥à¤¤à¥€à¤¤à¥à¤µà¤¾à¤¤ नाहीत. बाहेरील ठिकाणांचà¥à¤¯à¤¾ फाइलà¥à¤¸ येथे दिसतात पण असतीलच असे नाही. अशा फाइलà¥à¤¸ आढळलà¥à¤¯à¤¾à¤¸ वगळलà¥à¤¯à¤¾ जातील. अशी पाने [[:$1]] येथे दिसतील.',
+'wantedfiletext-nocat' => 'पà¥à¤¢à¥€à¤² फाइलà¥à¤¸ वापरलà¥à¤¯à¤¾ असतील पण आता असà¥à¤¤à¥€à¤¤à¥à¤µà¤¾à¤¤ नाहीत. बाहेरील ठिकाणांचà¥à¤¯à¤¾ फाइलà¥à¤¸ येथे दिसतात पण असतीलच असे नाही. अशा फाइलà¥à¤¸ आढळलà¥à¤¯à¤¾à¤¸ वगळलà¥à¤¯à¤¾ जातील.',
'wantedtemplates' => 'पाहिजे असलेले साचे',
'mostlinked' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• जोडलेली पाने',
'mostlinkedcategories' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• जोडलेले वरà¥à¤—',
@@ -1964,6 +2017,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'mostimages' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• जोडलेली चितà¥à¤°à¥‡',
'mostrevisions' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• बदललेले लेख',
'prefixindex' => 'उपसरà¥à¤— असणारà¥â€à¤¯à¤¾ लेखांची यादी',
+'prefixindex-namespace' => '($1 नामविशà¥à¤µ) हा उपसरà¥à¤— असणारी सरà¥à¤µ पाने',
'shortpages' => 'छोटी पाने',
'longpages' => 'मोठी पाने',
'deadendpages' => 'टोकाची पाने',
@@ -1980,7 +2034,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'listusers-editsonly' => 'फकà¥à¤¤ संपादनांसहित सदसà¥à¤¯ दाखवा',
'listusers-creationsort' => 'निरà¥à¤®à¤¿à¤¤à¥€à¤šà¥à¤¯à¤¾ तारखेपà¥à¤°à¤®à¤¾à¤£à¥‡ लावा',
'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}',
-'usercreated' => '$2 दिवशी $1 वेळी तयार à¤à¤¾à¤²à¥‡',
+'usercreated' => '{{GENDER:$3|बनावला}} या $1 अत $2',
'newpages' => 'नवीन पाने',
'newpages-username' => 'सदसà¥à¤¯ नाव:',
'ancientpages' => 'जà¥à¤¨à¥€ पाने',
@@ -2071,12 +2125,8 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'activeusers-noresult' => 'à¤à¤•à¤¹à¥€ सदसà¥à¤¯ सापडला नाही.',
# Special:Log/newusers
-'newuserlogpage' => 'नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद',
-'newuserlogpagetext' => 'ही नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद यादी आहे.',
-'newuserlog-byemail' => 'परवलीचा शबà¥à¤¦ इमेलमारà¥à¤«à¤¤ पाठविलेला आहे',
-'newuserlog-create-entry' => 'नवीन सदसà¥à¤¯',
-'newuserlog-create2-entry' => '$1 साठी सदसà¥à¤¯à¤¤à¥à¤µ घेतले.',
-'newuserlog-autocreate-entry' => 'खाते आपोआप तयार à¤à¤¾à¤²à¥‡',
+'newuserlogpage' => 'नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद',
+'newuserlogpagetext' => 'ही नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद यादी आहे.',
# Special:ListGroupRights
'listgrouprights' => 'सदसà¥à¤¯ गट अधिकार',
@@ -2103,7 +2153,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'emailpage' => 'विपतà¥à¤° (ईमेल) उपयोगकरà¥à¤¤à¤¾',
'emailpagetext' => 'जर या सदसà¥à¤¯à¤¾à¤¨à¥‡ पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤ विपतà¥à¤° (ईमेल)पतà¥à¤¤à¤¾ तीचà¥à¤¯à¤¾ अथवा तà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ पसंतीत नमà¥à¤¦ केला असेल,तर खालील सारणी तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ à¤à¤•(च) संदेश पाठवेल.तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ [[Special:Preferences|सदसà¥à¤¯ पसंतीत]] नमà¥à¤¦ केलेला विपतà¥à¤° पतà¥à¤¤à¤¾ "कडून" पतà¥à¤¤à¥à¤¯à¤¾à¤¤ येईल मà¥à¤¹à¤£à¤œà¥‡ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•à¤°à¤¤à¤¾ आपलà¥à¤¯à¤¾à¤²à¤¾ उतà¥à¤¤à¤° देऊ शकेल.',
'usermailererror' => 'पतà¥à¤° बाब तà¥à¤°à¥à¤Ÿà¥€ वापस पाठवली:',
-'defemailsubject' => '{{SITENAME}} विपतà¥à¤°',
+'defemailsubject' => '{{SITENAME}} "$1" सदसà¥à¤¯à¤¾à¤•à¤¡à¥‚न विपतà¥à¤°',
'usermaildisabled' => 'सदसà¥à¤¯ विपतà¥à¤° निषà¥à¤•à¥à¤°à¥€à¤¯ आहे',
'usermaildisabledtext' => 'या विकीवर तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ इतर सदसà¥à¤¯à¤¾à¤‚ना विपतà¥à¤°à¥‡ पाठवता येत नाहीत',
'noemailtitle' => 'विपतà¥à¤° पतà¥à¤¤à¤¾ नाही',
@@ -2158,7 +2208,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
'watchmethod-list' => 'अलिकडील बदलांकरिता पहारà¥â€à¤¯à¤¾à¤¤à¥€à¤² पानांचा तपास',
'watchlistcontains' => 'तà¥à¤®à¤šà¤¾ $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
'iteminvalidname' => "'$1'बाबीस समसà¥à¤¯à¤¾, अमानà¥à¤¯ नाव...",
-'wlnote' => "खाली गेलà¥à¤¯à¤¾ {{PLURAL:$2|तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल आहे|शेवटाचे '''$1'''बदल आहेत }}.",
+'wlnote' => "खाली $3, $4 परà¥à¤¯à¤‚तचे गेलà¥à¤¯à¤¾ {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
'wlshowlast' => 'मागील $1 तास $2 दिवस $3 पहा',
'watchlist-options' => 'पहाऱà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीचे परà¥à¤¯à¤¾à¤¯',
@@ -2219,8 +2269,6 @@ $UNWATCHURL
'actioncomplete' => 'काम पूरà¥à¤£',
'actionfailed' => 'कृती अयशसà¥à¤µà¥€ à¤à¤¾à¤²à¥€',
'deletedtext' => '"$1" हा लेख वगळला. अलीकडे वगळलेले लेख पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ $2 पहा.',
-'deletedarticle' => '"[[$1]]" लेख वगळला.',
-'suppressedarticle' => '"[[$1]]" ला दाबले (सपà¥à¤°à¥‡à¤¸)',
'dellogpage' => 'वगळलà¥à¤¯à¤¾à¤šà¥€ नोंद',
'dellogpagetext' => 'नà¥à¤•à¤¤à¥à¤¯à¤¾à¤š वगळलेलà¥à¤¯à¤¾ पानांची यादी खाली आहे.',
'deletionlog' => 'वगळलà¥à¤¯à¤¾à¤šà¥€ नोंद',
@@ -2264,7 +2312,10 @@ $UNWATCHURL
'unprotectedarticle' => '"[[$1]]" असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केला.',
'movedarticleprotection' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ "[[$2]]" येथून "[[$1]]" येथे हलवली.',
'protect-title' => '"$1" सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करत आहे',
+'protect-title-notallowed' => '"$1" ची सà¥à¤°à¤•à¥à¤·à¤¾ पातळी पहा',
'prot_1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले.',
+'protect-badnamespace-title' => 'असà¥à¤°à¤•à¥à¤·à¤£à¥€à¤¯ नामविशà¥à¤µ',
+'protect-badnamespace-text' => 'या नामविशà¥à¤µà¤¾à¤¤à¥€à¤² पाने सà¥à¤°à¤•à¥à¤·à¥€à¤¤ करता येत नाहीत',
'protect-legend' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€à¤¤à¥€à¤² बदल निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करा',
'protectcomment' => 'कारण:',
'protectexpiry' => 'संपणà¥à¤¯à¤¾à¤šà¤¾ कालावधी:',
@@ -2283,6 +2334,7 @@ $UNWATCHURL
'protect-level-sysop' => 'केवळ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚साठी',
'protect-summary-cascade' => 'शिडी',
'protect-expiring' => '$1 (UTC) ला संपेल',
+'protect-expiring-local' => '$1 ला समà¥à¤ªà¤¤à¥‡',
'protect-expiry-indefinite' => 'अनंत',
'protect-cascade' => 'या पानात असलेली पाने सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा (सà¥à¤°à¤•à¥à¤·à¤¾ शिडी)',
'protect-cantedit' => 'तà¥à¤®à¥à¤¹à¥€ या पानाची सà¥à¤°à¤•à¥à¤·à¤¾ पातळी बदलू शकत नाही कारण तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तसे करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
@@ -2338,7 +2390,6 @@ $UNWATCHURL
'undeletereset' => 'पूरà¥à¤µà¤µà¤¤',
'undeleteinvert' => 'निवड उलट करा',
'undeletecomment' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾:',
-'undeletedarticle' => '"[[$1]]" पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
'undeletedrevisions' => '{{PLURAL:$1|1 आवरà¥à¤¤à¤¨|$1 आवरà¥à¤¤à¤¨à¥‡}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
'undeletedrevisions-files' => '{{PLURAL:$1|1 आवरà¥à¤¤à¤¨|$1 आवरà¥à¤¤à¤¨à¥‡}}आणि {{PLURAL:$2|1 संचिका|$2 संचिका}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
'undeletedfiles' => '{{PLURAL:$1|1 संचिका|$1 संचिका}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
@@ -2347,6 +2398,7 @@ $UNWATCHURL
अलिकडिल वगळलेलà¥à¤¯à¤¾ आणि पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤¾à¤‚चà¥à¤¯à¤¾ नोंदीकरिता [[Special:Log/delete|वगळलà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ नोंदी]] पहा .",
'undelete-header' => 'अलिकडील वगळलेलà¥à¤¯à¤¾ पानांकरिता [[Special:Log/delete|वगळलेलà¥à¤¯à¤¾ नोंदी]] पहा.',
+'undelete-search-title' => 'वगळलेली पाने शोधा',
'undelete-search-box' => 'वगळलेली पाने शोधा',
'undelete-search-prefix' => 'पासून सूरू होणारी पाने दाखवा:',
'undelete-search-submit' => 'शोध',
@@ -2355,6 +2407,7 @@ $UNWATCHURL
'undelete-bad-store-key' => '$1 वेळ दिलेली संचिका आवरà¥à¤¤à¤¨ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करता येत नाही:संचिका वगळणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ पासून मिळाली नवà¥à¤¹à¤¤à¥€.',
'undelete-cleanup-error' => 'न वापरलेली विदा संचिका "$1" वगळताना तà¥à¤°à¥‚टी दाखवते.',
'undelete-missing-filearchive' => 'संचिका विदासà¥à¤®à¥ƒà¤¤à¥€ ID $1 पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करू शकत नाही कारण ती विदागारात उपलबà¥à¤§ नाही. ती आधीच पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ केली असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ सà¥à¤¦à¥à¤§à¤¾ असू शकते.',
+'undelete-error' => 'जर पाना काढà¥à¤¨ नाही टाकले तर पान शीरà¥à¤·à¤•',
'undelete-error-short' => 'संचिकेचे वगळणे उलटवताना तà¥à¤°à¥‚टी: $1',
'undelete-error-long' => 'संचिकेचे वगळणे उलटवताना तà¥à¤°à¥‚टींचा अडथळा आला:
@@ -2476,6 +2529,7 @@ $1',
'blocklist-userblocks' => 'खाते पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन लपवा',
'blocklist-tempblocks' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धने लपवा',
'blocklist-addressblocks' => 'à¤à¤•à¤² अंकपतà¥à¤¤à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धने दाखवू नका',
+'blocklist-rangeblocks' => 'अभिसीमा गट लपवा',
'blocklist-timestamp' => 'वेळशिकà¥à¤•à¤¾',
'blocklist-target' => 'लकà¥à¤·à¥à¤¯',
'blocklist-expiry' => 'संपणà¥à¤¯à¤¾à¤šà¤¾ कालावधी',
@@ -2498,6 +2552,7 @@ $1',
'unblocklink' => 'सोडवा',
'change-blocklink' => 'बà¥à¤²à¥‰à¤• बदला',
'contribslink' => 'योगदान',
+'emaillink' => 'ई-मेल पाठवा.',
'autoblocker' => 'सà¥à¤µà¤¯à¤‚चलितपà¥à¤°à¤¤à¤¿à¤¬à¤‚धन केले गेले कारण तà¥à¤®à¤šà¤¾ अंकपतà¥à¤¤à¤¾ अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 चà¥à¤¯à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धनाकरिता दिलेले कारण: "$2" आहे.',
'blocklogpage' => 'बà¥à¤²à¥‰à¤• यादी',
'blocklog-showlog' => 'या सदसà¥à¤¯à¤¾à¤µà¤° आधी बनà¥à¤¦à¥€ घालनà¥à¤¯à¤¾à¤¤ आली आहे. बनà¥à¤¦à¥€ सनà¥à¤¦à¤°à¥à¤­à¤¾à¤¤à¥€à¤² अधिक नोनà¥à¤¦à¥€ येथे आहेत',
@@ -2624,9 +2679,6 @@ $1',
'movepage-page-moved' => '$1 हे पान $2 या मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले.',
'movepage-page-unmoved' => '$1 हे पान $2 या मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करता आलेले नाही.',
'movepage-max-pages' => 'जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ $1 {{PLURAL:$1|पान|पाने}} सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करणà¥à¤¯à¤¾à¤¤ {{PLURAL:$1|आलेले आहे|आलेली आहेत}} व आता आणखी पाने आपोआप सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत होणार नाहीत.',
-'1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले.',
-'1movedto2_redir' => '[[$1]] हे पान [[$2]] मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले (पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨).',
-'move-redirect-suppressed' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ लपवले',
'movelogpage' => 'सà¥à¤¥à¤¾à¤‚नांतराची नोंद',
'movelogpagetext' => 'सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केलेलà¥à¤¯à¤¾ पानांची यादी.',
'movesubpage' => '{{PLURAL:$1|उपपान|उपपाने}}',
@@ -2639,7 +2691,7 @@ $1',
लकà¥à¤·à¥à¤¯à¤ªà¤¾à¤¨ "[[:$1]]" आधीच असà¥à¤¤à¥€à¤¤à¥à¤µà¤¾à¤¤ आहे.सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तराचा मारà¥à¤— मोकळाकरणà¥à¤¯à¤¾ करिता तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ ते वगळावयाचे आहे काय?',
'delete_and_move_confirm' => 'होय, पान वगळा',
-'delete_and_move_reason' => 'आधीचे पान वगळून सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तर केले',
+'delete_and_move_reason' => '"[[$1]]" पासून वगळून सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तर केले.',
'selfmove' => 'सà¥à¤°à¥‹à¤¤ आणि लकà¥à¤·à¥à¤¯ पाने समान आहेत; à¤à¤–ादे पान सà¥à¤µà¤¤:चà¥à¤¯à¤¾à¤š जागी सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करता येत नाही.',
'immobile-source-namespace' => 'नामविशà¥à¤µ "$1" मधील पाने हलवता आली नाहीत.',
'immobile-target-namespace' => 'नामविशà¥à¤µ "$1" मधà¥à¤¯à¥‡ पाने हलवता आली नाहीत.',
@@ -2666,9 +2718,11 @@ $1',
पाने निरà¥à¤¯à¤¾à¤¤ करणà¥à¤¯à¤¾ करिता,à¤à¤•à¤¾ ओळीत à¤à¤• मथळा असे, खालील मजकà¥à¤° रकानà¥à¤¯à¤¾à¤¤ मथळे भरा आणि तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ ’सधà¥à¤¯à¤¾à¤šà¥€ आवृतà¥à¤¤à¥€ तसेच सरà¥à¤µ जà¥à¤¨à¥à¤¯à¤¾ आवृतà¥à¤¤à¥€ ,पानाचà¥à¤¯à¤¾ इतिहास ओळी सोबत’, किंवा ’केवळ सधà¥à¤¯à¤¾à¤šà¥€ आवृतà¥à¤¤à¥€ शेवटचà¥à¤¯à¤¾ संपादनाचà¥à¤¯à¤¾ माहिती सोबत’ हवी आहे का ते निवडा.
तà¥à¤®à¥à¤¹à¥€ नंतरचà¥à¤¯à¤¾ बाबतीत à¤à¤–ादा दà¥à¤µà¤¾ सà¥à¤¦à¥à¤§à¤¾ वापरू शकता, उदाहरणारà¥à¤¥ "[[{{MediaWiki:Mainpage}}]]" पाना करिता [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] .',
+'exportall' => 'सरà¥à¤µ पान à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ करा',
'exportcuronly' => 'संपूरà¥à¤£ इतिहास नको,केवळ आताचे आवरà¥à¤¤à¤¨ आंरà¥à¤¤à¤­à¥‚त करा',
'exportnohistory' => "----
'''सूचना:''' या फॉरà¥à¤®à¤šà¤¾ वापर करून पानाचा पूरà¥à¤£ इतिहास निरà¥à¤¯à¤¾à¤¤ करणà¥à¤¯à¤¾à¤šà¥€ सà¥à¤µà¤¿à¤§à¤¾ कारà¥à¤¯à¤•à¥à¤¶à¤²à¤¤à¥‡à¤šà¥à¤¯à¤¾ कारणंनी अनà¥à¤ªà¤²à¥à¤¬à¥à¤¢ ठेवली आहे.",
+'exportlistauthors' => 'पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• पानासाठी योगदातà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ पूरà¥à¤£ सूचीचा(यादीचा) समावेश करावा',
'export-submit' => 'निरà¥à¤¯à¤¾à¤¤ करा',
'export-addcattext' => 'वरà¥à¤—ीकरणातून पाने भरा:',
'export-addcat' => 'भर',
@@ -2700,6 +2754,8 @@ $1',
'thumbnail_error' => 'इवलेसे चितà¥à¤° बनविणà¥à¤¯à¤¾à¤¤ अडथळा आलेला आहे: $1',
'djvu_page_error' => 'टपà¥à¤ªà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ बाहेरचे DjVu पान',
'djvu_no_xml' => 'DjVu संचिकेकरिता XML ओढणà¥à¤¯à¤¾à¤¤ असमरà¥à¤¥',
+'thumbnail-temp-create' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ इवलीशी संचिका बनविता आली नाही',
+'thumbnail-dest-create' => 'इषà¥à¤Ÿà¤¸à¥à¤¥à¤³à¥€ ईवलीशी संचिका जतन करता आली नाही',
'thumbnail_invalid_params' => 'इवलà¥à¤¯à¤¾à¤¶à¤¾à¤šà¤¿à¤¤à¥à¤°à¤¾à¤šà¤¾ अयोगà¥à¤¯ परिचय',
'thumbnail_dest_directory' => 'लकà¥à¤·à¥à¤¯ धारिकेचà¥à¤¯à¤¾ निरà¥à¤®à¤¿à¤¤à¥€à¤¸ असमरà¥à¤¥',
'thumbnail_image-type' => 'चितà¥à¤°à¤ªà¥à¤°à¤•à¤¾à¤° समरà¥à¤¥à¤¿à¤¤ नाही',
@@ -2744,6 +2800,11 @@ $1',
'import-token-mismatch' => 'अधिवेशन माहितीची हानी.
कृपया पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
'import-invalid-interwiki' => 'नमूद केलेलà¥à¤¯à¤¾ विकिमधून आयात करू शकत नाही.',
+'import-error-edit' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ संपादनाची परवानगी नसलà¥à¤¯à¤¾à¤¨à¥‡ $1 पान आयात केले गेले नाही.',
+'import-error-create' => 'तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ $1 तयार करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नसलà¥à¤¯à¤¾à¤¨à¥‡ ते आयात केले गेले नाही.',
+'import-error-interwiki' => 'इंटर विकी लिंक साठी $1 पान आरकà¥à¤·à¤¿à¤¤ केलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ ते इमà¥à¤ªà¥‹à¤°à¥à¤Ÿ करू शकत नाही',
+'import-error-special' => 'विशेष नामविशà¥à¤µà¤¾à¤¸à¤¾à¤ à¥€ $1 पान आरकà¥à¤·à¤¿à¤¤ केलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ ते इमà¥à¤ªà¥‹à¤°à¥à¤Ÿ करू शकत नाही. या नामविशà¥à¤µà¤¾à¤¤ पाने असत नाहीत.',
+'import-error-invalid' => 'नाव अयोगà¥à¤¯ असलà¥à¤¯à¤¾à¤¨à¥‡ $1 पान इमà¥à¤ªà¥‹à¤°à¥à¤Ÿ करू शकत नाही.',
# Import log
'importlogpage' => 'ईमà¥à¤ªà¥‹à¤°à¥à¤Ÿ सूची',
@@ -2753,73 +2814,86 @@ $1',
'import-logentry-interwiki' => 'आंतरविकिकरण $1',
'import-logentry-interwiki-detail' => '$2 पासून $1 {{PLURAL:$1|आवरà¥à¤¤à¤¨|आवरà¥à¤¤à¤¨à¥‡}}',
+# JavaScriptTest
+'javascripttest' => 'जावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ तपासणी',
+'javascripttest-disabled' => 'हे कारà¥à¤¯ अवरूदà¥à¤§ केले आहे.',
+'javascripttest-title' => '$1 टेसà¥à¤Ÿ चालू आहेत',
+'javascripttest-pagetext-noframework' => 'हे पान जावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ तपासणी साठी सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केले आहे',
+'javascripttest-pagetext-unknownframework' => 'अजà¥à¤žà¤¾à¤¤ तपासणीचे ठिकाण $1',
+'javascripttest-pagetext-frameworks' => 'कृपया टेसà¥à¤Ÿà¤¿à¤‚ग साठी पà¥à¤¢à¥€à¤² पैकी वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ / पदà¥à¤§à¤¤ निवडावी: $1',
+'javascripttest-pagetext-skins' => 'टेसà¥à¤Ÿ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ योगà¥à¤¯ ती सà¥à¤•à¥€à¤¨ निवडावी',
+'javascripttest-qunit-intro' => 'mediawiki.org वर [$1 testing documentation] पहा',
+'javascripttest-qunit-heading' => 'मीडिया विकी जावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ कयू यूनिट टेसà¥à¤Ÿ ची जागा',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'तà¥à¤®à¤šà¥‡ सदसà¥à¤¯ पान',
-'tooltip-pt-anonuserpage' => 'तà¥à¤®à¥à¤¹à¥€ जà¥à¤¯à¤¾ अंकपतà¥à¤¤à¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¥‡ संपादीत करत आहात तà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ हे सदसà¥à¤¯ पान',
-'tooltip-pt-mytalk' => 'तà¥à¤®à¤šà¥‡ चरà¥à¤šà¤¾ पान',
-'tooltip-pt-anontalk' => 'या अंकपतà¥à¤¤à¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ संपादनांबदà¥à¤¦à¤² चरà¥à¤šà¤¾',
-'tooltip-pt-preferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
-'tooltip-pt-watchlist' => 'तà¥à¤®à¥à¤¹à¥€ पहारा दिलेलà¥à¤¯à¤¾ पानांची यादी',
-'tooltip-pt-mycontris' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ योगदानांची यादी',
-'tooltip-pt-login' => 'आपणांस सदसà¥à¤¯à¤¤à¥à¤µ घेणà¥à¤¯à¤¾à¤šà¥€ विनंती करणà¥à¤¯à¤¾à¤¤ येत आहे. सदसà¥à¤¯à¤¤à¥à¤µ घेणे अनिवारà¥à¤¯ नाही.',
-'tooltip-pt-anonlogin' => 'आपण खातà¥à¤¯à¤¾à¤¤ दाखल वà¥à¤¹à¤¾à¤µà¥‡ या करिता पà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¨ देतो, अरà¥à¤¥à¤¾à¤¤ ते अतà¥à¤¯à¤¾à¤µà¤¶à¥à¤¯à¤• नाही.',
-'tooltip-pt-logout' => 'बाहेर पडा',
-'tooltip-ca-talk' => 'कंटेंट पानाबदà¥à¤¦à¤²à¤šà¥à¤¯à¤¾ चरà¥à¤šà¤¾',
-'tooltip-ca-edit' => 'तà¥à¤®à¥à¤¹à¥€ हे पान बदà¥à¤²à¥‚ शकता. कृपया जतन करणà¥à¤¯à¤¾à¤ªà¥à¤°à¥à¤µà¥€ à¤à¤²à¤• कळ वापरून पहा.',
-'tooltip-ca-addsection' => 'नवीन चरà¥à¤šà¤¾ सà¥à¤°à¥‚ करा',
-'tooltip-ca-viewsource' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ आहे. तà¥à¤®à¥à¤¹à¥€ याचा सà¥à¤°à¥‹à¤¤ पाहू शकता.',
-'tooltip-ca-history' => 'या पानाचà¥à¤¯à¤¾ जà¥à¤¨à¥à¤¯à¤¾ आवृतà¥à¤¯à¤¾.',
-'tooltip-ca-protect' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
-'tooltip-ca-unprotect' => 'पृषà¥à¤  असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
-'tooltip-ca-delete' => 'हे पान वगळा',
-'tooltip-ca-undelete' => 'या पानाची वगळणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ केलेली संपादने पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
-'tooltip-ca-move' => 'हे पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करा.',
-'tooltip-ca-watch' => 'हे पान तà¥à¤®à¤šà¥à¤¯à¤¾ पहाऱà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीमधà¥à¤¯à¥‡ टाका',
-'tooltip-ca-unwatch' => 'हे पान पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीतून काढा.',
-'tooltip-search' => '{{SITENAME}} शोधा',
-'tooltip-search-go' => 'या नेमकà¥à¤¯à¤¾ नावाचà¥à¤¯à¤¾ पानाकडे,असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलà¥à¤¯à¤¾à¤¸, चला',
-'tooltip-search-fulltext' => 'या मजकà¥à¤°à¤¾à¤•à¤°à¤¿à¤¤à¤¾ पान शोधा',
-'tooltip-p-logo' => 'मà¥à¤–पृषà¥à¤ ',
-'tooltip-n-mainpage' => 'मà¥à¤–पृषà¥à¤ à¤¾à¤²à¤¾ भेट दà¥à¤¯à¤¾',
-'tooltip-n-mainpage-description' => 'मà¥à¤–पृषà¥à¤ à¤¾à¤²à¤¾ भेट दà¥à¤¯à¤¾',
-'tooltip-n-portal' => 'पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤¬à¤¦à¥à¤¦à¤², तà¥à¤®à¥à¤¹à¥€ काय करू शकता, कà¥à¤ à¥‡ काय सापडेल',
-'tooltip-n-currentevents' => 'सदà¥à¤¯ घटनांबदà¥à¤¦à¤²à¤šà¥€ माहिती',
-'tooltip-n-recentchanges' => 'विकिवरील अलीकडील बदलांची यादी',
-'tooltip-n-randompage' => 'कोणतेही अविशिषà¥à¤Ÿ पान पाहा',
-'tooltip-n-help' => 'साहायà¥à¤¯ मिळवणà¥à¤¯à¤¾à¤šà¥‡ ठिकाण',
-'tooltip-t-whatlinkshere' => 'येथे जोडलेलà¥à¤¯à¤¾ सरà¥à¤µ विकिपानांची यादी',
-'tooltip-t-recentchangeslinked' => 'येथà¥à¤¨ जोडलेलà¥à¤¯à¤¾ सरà¥à¤µ पानांवरील अलीकडील बदल',
-'tooltip-feed-rss' => 'या पानाकरिता आर.à¤à¤¸.à¤à¤¸. रसद',
-'tooltip-feed-atom' => 'या पानाकरिता à¤à¤Ÿà¤® रसद',
-'tooltip-t-contributions' => 'या सदसà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ योगदानांची यादी पहा',
-'tooltip-t-emailuser' => 'या सदसà¥à¤¯à¤¾à¤²à¤¾ इमेल पाठवा',
-'tooltip-t-upload' => 'चितà¥à¤°à¥‡ किंवा माधà¥à¤¯à¤® संचिका चढवा',
-'tooltip-t-specialpages' => 'सरà¥à¤µ विशेष पृषà¥à¤ à¤¾à¤‚ची यादी',
-'tooltip-t-print' => 'या पानाची छापणà¥à¤¯à¤¾à¤¯à¥‹à¤—à¥à¤¯ आवृतà¥à¤¤à¥€',
-'tooltip-t-permalink' => 'पानाचà¥à¤¯à¤¾ या आवरà¥à¤¤à¤¨à¤¾à¤šà¤¾ शाशà¥à¤µà¤¤ दà¥à¤µà¤¾',
-'tooltip-ca-nstab-main' => 'मजकà¥à¤°à¤¾à¤šà¥‡ पान पहा',
-'tooltip-ca-nstab-user' => 'सदसà¥à¤¯ पान पहा',
-'tooltip-ca-nstab-media' => 'माधà¥à¤¯à¤® पान पहा',
-'tooltip-ca-nstab-special' => 'हे विशेष पान आहे; तà¥à¤®à¥à¤¹à¥€ ते बदलू शकत नाही.',
-'tooltip-ca-nstab-project' => 'पà¥à¤°à¤•à¤²à¥à¤ª पान पहा',
-'tooltip-ca-nstab-image' => 'चितà¥à¤° पान पहा',
-'tooltip-ca-nstab-mediawiki' => 'सिसà¥à¤Ÿà¥€à¤® संदेश पहा',
-'tooltip-ca-nstab-template' => 'साचा पहा',
-'tooltip-ca-nstab-help' => 'साहायà¥à¤¯ पान पहा',
-'tooltip-ca-nstab-category' => 'वरà¥à¤— पान पहा',
-'tooltip-minoredit' => 'बदल छोटा असलà¥à¤¯à¤¾à¤šà¥€ नोंद करा',
-'tooltip-save' => 'तà¥à¤®à¥à¤¹à¥€ केलेले बदल जतन करा',
-'tooltip-preview' => 'तà¥à¤®à¥à¤¹à¥€ केलेलà¥à¤¯à¤¾ बदलांची à¤à¤²à¤• पहा, जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ कृपया हे वापरा!',
-'tooltip-diff' => 'या पाठà¥à¤¯à¤¾à¤¤à¥€à¤² तà¥à¤®à¥à¤¹à¥€ केलेले बदल दाखवा.',
-'tooltip-compareselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील बदल दाखवा.',
-'tooltip-watch' => 'हे पान तà¥à¤®à¤šà¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत टाका.',
-'tooltip-recreate' => 'हे पान मागे वगळले असले तरी नवनिरà¥à¤®à¥€à¤¤ करा',
-'tooltip-upload' => 'चढवणे सà¥à¤°à¥‚करा',
-'tooltip-rollback' => '"दà¥à¤°à¥à¤¤à¤®à¤¾à¤˜à¤¾à¤°". यादà¥à¤µà¤¾à¤°à¥‡ शेवटचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤¨à¥‡ या पानात केलेली संपादने à¤à¤•à¤¾ à¤à¤Ÿà¤•à¥à¤¯à¤¾à¤¤ उलटवली जातात.',
-'tooltip-undo' => '"रदà¥à¤¦ करा" हे संपादन उलटविते व संपादन खिडकी उघडते.
+'tooltip-pt-userpage' => 'तà¥à¤®à¤šà¥‡ सदसà¥à¤¯ पान',
+'tooltip-pt-anonuserpage' => 'तà¥à¤®à¥à¤¹à¥€ जà¥à¤¯à¤¾ अंकपतà¥à¤¤à¥à¤¯à¤¾à¤¨à¥à¤µà¤¯à¥‡ संपादीत करत आहात तà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ हे सदसà¥à¤¯ पान',
+'tooltip-pt-mytalk' => 'तà¥à¤®à¤šà¥‡ चरà¥à¤šà¤¾ पान',
+'tooltip-pt-anontalk' => 'या अंकपतà¥à¤¤à¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ संपादनांबदà¥à¤¦à¤² चरà¥à¤šà¤¾',
+'tooltip-pt-preferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
+'tooltip-pt-watchlist' => 'तà¥à¤®à¥à¤¹à¥€ पहारा दिलेलà¥à¤¯à¤¾ पानांची यादी',
+'tooltip-pt-mycontris' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ योगदानांची यादी',
+'tooltip-pt-login' => 'आपणांस सदसà¥à¤¯à¤¤à¥à¤µ घेणà¥à¤¯à¤¾à¤šà¥€ विनंती करणà¥à¤¯à¤¾à¤¤ येत आहे. सदसà¥à¤¯à¤¤à¥à¤µ घेणे अनिवारà¥à¤¯ नाही.',
+'tooltip-pt-anonlogin' => 'आपण खातà¥à¤¯à¤¾à¤¤ दाखल वà¥à¤¹à¤¾à¤µà¥‡ या करिता पà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¨ देतो, अरà¥à¤¥à¤¾à¤¤ ते अतà¥à¤¯à¤¾à¤µà¤¶à¥à¤¯à¤• नाही.',
+'tooltip-pt-logout' => 'बाहेर पडा',
+'tooltip-ca-talk' => 'कंटेंट पानाबदà¥à¤¦à¤²à¤šà¥à¤¯à¤¾ चरà¥à¤šà¤¾',
+'tooltip-ca-edit' => 'तà¥à¤®à¥à¤¹à¥€ हे पान बदà¥à¤²à¥‚ शकता. कृपया जतन करणà¥à¤¯à¤¾à¤ªà¥à¤°à¥à¤µà¥€ à¤à¤²à¤• कळ वापरून पहा.',
+'tooltip-ca-addsection' => 'नवीन चरà¥à¤šà¤¾ सà¥à¤°à¥‚ करा',
+'tooltip-ca-viewsource' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ आहे. तà¥à¤®à¥à¤¹à¥€ याचा सà¥à¤°à¥‹à¤¤ पाहू शकता.',
+'tooltip-ca-history' => 'या पानाचà¥à¤¯à¤¾ जà¥à¤¨à¥à¤¯à¤¾ आवृतà¥à¤¯à¤¾.',
+'tooltip-ca-protect' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
+'tooltip-ca-unprotect' => 'पृषà¥à¤  असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
+'tooltip-ca-delete' => 'हे पान वगळा',
+'tooltip-ca-undelete' => 'या पानाची वगळणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ केलेली संपादने पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+'tooltip-ca-move' => 'हे पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करा.',
+'tooltip-ca-watch' => 'हे पान तà¥à¤®à¤šà¥à¤¯à¤¾ पहाऱà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीमधà¥à¤¯à¥‡ टाका',
+'tooltip-ca-unwatch' => 'हे पान पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीतून काढा.',
+'tooltip-search' => '{{SITENAME}} शोधा',
+'tooltip-search-go' => 'या नेमकà¥à¤¯à¤¾ नावाचà¥à¤¯à¤¾ पानाकडे,असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलà¥à¤¯à¤¾à¤¸, चला',
+'tooltip-search-fulltext' => 'या मजकà¥à¤°à¤¾à¤•à¤°à¤¿à¤¤à¤¾ पान शोधा',
+'tooltip-p-logo' => 'मà¥à¤–पृषà¥à¤ ',
+'tooltip-n-mainpage' => 'मà¥à¤–पृषà¥à¤ à¤¾à¤²à¤¾ भेट दà¥à¤¯à¤¾',
+'tooltip-n-mainpage-description' => 'मà¥à¤–पृषà¥à¤ à¤¾à¤²à¤¾ भेट दà¥à¤¯à¤¾',
+'tooltip-n-portal' => 'पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤¬à¤¦à¥à¤¦à¤², तà¥à¤®à¥à¤¹à¥€ काय करू शकता, कà¥à¤ à¥‡ काय सापडेल',
+'tooltip-n-currentevents' => 'सदà¥à¤¯ घटनांबदà¥à¤¦à¤²à¤šà¥€ माहिती',
+'tooltip-n-recentchanges' => 'विकिवरील अलीकडील बदलांची यादी',
+'tooltip-n-randompage' => 'कोणतेही अविशिषà¥à¤Ÿ पान पाहा',
+'tooltip-n-help' => 'साहायà¥à¤¯ मिळवणà¥à¤¯à¤¾à¤šà¥‡ ठिकाण',
+'tooltip-t-whatlinkshere' => 'येथे जोडलेलà¥à¤¯à¤¾ सरà¥à¤µ विकिपानांची यादी',
+'tooltip-t-recentchangeslinked' => 'येथà¥à¤¨ जोडलेलà¥à¤¯à¤¾ सरà¥à¤µ पानांवरील अलीकडील बदल',
+'tooltip-feed-rss' => 'या पानाकरिता आर.à¤à¤¸.à¤à¤¸. रसद',
+'tooltip-feed-atom' => 'या पानाकरिता à¤à¤Ÿà¤® रसद',
+'tooltip-t-contributions' => 'या सदसà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ योगदानांची यादी पहा',
+'tooltip-t-emailuser' => 'या सदसà¥à¤¯à¤¾à¤²à¤¾ इमेल पाठवा',
+'tooltip-t-upload' => 'चितà¥à¤°à¥‡ किंवा माधà¥à¤¯à¤® संचिका चढवा',
+'tooltip-t-specialpages' => 'सरà¥à¤µ विशेष पृषà¥à¤ à¤¾à¤‚ची यादी',
+'tooltip-t-print' => 'या पानाची छापणà¥à¤¯à¤¾à¤¯à¥‹à¤—à¥à¤¯ आवृतà¥à¤¤à¥€',
+'tooltip-t-permalink' => 'पानाचà¥à¤¯à¤¾ या आवरà¥à¤¤à¤¨à¤¾à¤šà¤¾ शाशà¥à¤µà¤¤ दà¥à¤µà¤¾',
+'tooltip-ca-nstab-main' => 'मजकà¥à¤°à¤¾à¤šà¥‡ पान पहा',
+'tooltip-ca-nstab-user' => 'सदसà¥à¤¯ पान पहा',
+'tooltip-ca-nstab-media' => 'माधà¥à¤¯à¤® पान पहा',
+'tooltip-ca-nstab-special' => 'हे विशेष पान आहे; तà¥à¤®à¥à¤¹à¥€ ते बदलू शकत नाही.',
+'tooltip-ca-nstab-project' => 'पà¥à¤°à¤•à¤²à¥à¤ª पान पहा',
+'tooltip-ca-nstab-image' => 'चितà¥à¤° पान पहा',
+'tooltip-ca-nstab-mediawiki' => 'सिसà¥à¤Ÿà¥€à¤® संदेश पहा',
+'tooltip-ca-nstab-template' => 'साचा पहा',
+'tooltip-ca-nstab-help' => 'साहायà¥à¤¯ पान पहा',
+'tooltip-ca-nstab-category' => 'वरà¥à¤— पान पहा',
+'tooltip-minoredit' => 'बदल छोटा असलà¥à¤¯à¤¾à¤šà¥€ नोंद करा',
+'tooltip-save' => 'तà¥à¤®à¥à¤¹à¥€ केलेले बदल जतन करा',
+'tooltip-preview' => 'तà¥à¤®à¥à¤¹à¥€ केलेलà¥à¤¯à¤¾ बदलांची à¤à¤²à¤• पहा, जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ कृपया हे वापरा!',
+'tooltip-diff' => 'या पाठà¥à¤¯à¤¾à¤¤à¥€à¤² तà¥à¤®à¥à¤¹à¥€ केलेले बदल दाखवा.',
+'tooltip-compareselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील बदल दाखवा.',
+'tooltip-watch' => 'हे पान तà¥à¤®à¤šà¥à¤¯à¤¾ पहारà¥â€à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीत टाका.',
+'tooltip-watchlistedit-normal-submit' => 'शीरà¥à¤·à¤•à¥‡ काढवीत',
+'tooltip-watchlistedit-raw-submit' => 'पाहणà¥à¤¯à¤¾à¤šà¥€ सूची अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ करावी',
+'tooltip-recreate' => 'हे पान मागे वगळले असले तरी नवनिरà¥à¤®à¥€à¤¤ करा',
+'tooltip-upload' => 'चढवणे सà¥à¤°à¥‚करा',
+'tooltip-rollback' => '"दà¥à¤°à¥à¤¤à¤®à¤¾à¤˜à¤¾à¤°". यादà¥à¤µà¤¾à¤°à¥‡ शेवटचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤¨à¥‡ या पानात केलेली संपादने à¤à¤•à¤¾ à¤à¤Ÿà¤•à¥à¤¯à¤¾à¤¤ उलटवली जातात.',
+'tooltip-undo' => '"रदà¥à¤¦ करा" हे संपादन उलटविते व संपादन खिडकी उघडते.
तà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ तà¥à¤®à¥à¤¹à¥€ बदलांचा आढावा देऊ शकता.',
-'tooltip-preferences-save' => 'माà¤à¥à¤¯à¤¾ पसंती जतन करा',
-'tooltip-summary' => 'लहान सारांश लिहा',
+'tooltip-preferences-save' => 'माà¤à¥à¤¯à¤¾ पसंती जतन करा',
+'tooltip-summary' => 'लहान सारांश लिहा',
# Metadata
'notacceptable' => 'विकि विदादाता तà¥à¤®à¤šà¤¾ घेता वाचू शकेल अशा सà¥à¤µà¤°à¥‚पात(संरचनेत) विदा पà¥à¤°à¤µà¥‚ शकत नाही.',
@@ -2884,9 +2958,6 @@ $1',
# Patrol log
'patrol-log-page' => 'टेहळणीतील नोंदी',
'patrol-log-header' => 'ही पाहणीनंतरचà¥à¤¯à¤¾ निरिकà¥à¤·à¤£à¤¾à¤šà¥€ नोंद आहे.',
-'patrol-log-line' => '$2चे $1 $3 गसà¥à¤¤ घातलà¥à¤¯à¤¾à¤šà¥€ खूण केली',
-'patrol-log-auto' => '(सà¥à¤µà¤¯à¤‚चलीत)',
-'patrol-log-diff' => 'आवरà¥à¤¤à¤¨ $1',
'log-show-hide-patrol' => '$1 गसà¥à¤¤à¥€à¤šà¥€ नोंद',
# Image deletion
@@ -2912,11 +2983,11 @@ $1',
'file-info' => 'संचिकेचा आकार:$1,विविधामापमाईमपà¥à¤°à¤•à¤¾à¤°: $2',
'file-info-size' => '$1 × $2 pixel, संचिकेचा आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4',
'file-info-size-pages' => '$1 × $2 पिकà¥à¤¸à¥‡à¤², संचिका आकारमान: $3, à¤à¤®à¤†à¤¯à¤à¤®à¤ˆ पà¥à¤°à¤•à¤¾à¤°: $4, $5 {{PLURAL:$5|पान|पाने}}',
-'file-nohires' => '<small>यापेकà¥à¤·à¤¾ जासà¥à¤¤ मोठे चितà¥à¤° उपलबà¥à¤§ नाही.</small>',
+'file-nohires' => 'यापेकà¥à¤·à¤¾ मोठे चितà¥à¤° उपलबà¥à¤§ नाही.',
'svg-long-desc' => 'SVG संचिका, साधारणपणे $1 × $2 pixels, संचिकेचा आकार: $3',
'show-big-image' => 'संपूरà¥à¤£ रिजोलà¥à¤¯à¥‚शन',
-'show-big-image-preview' => '<small>या à¤à¤²à¤•à¥‡à¤šà¤¾ आकार: $1. पिकà¥à¤¸à¥‡à¤²</small>',
-'show-big-image-other' => '<small>इतर रिà¤à¥‰à¤²à¥à¤¯à¥à¤¶à¤¨à¥à¤¸: $1.</small>',
+'show-big-image-preview' => 'या à¤à¤²à¤•à¥‡à¤šà¤¾ आकार: $1. पिकà¥à¤¸à¥‡à¤²',
+'show-big-image-other' => 'इतर {{PLURAL:$2|resolution|resolutions}}: $1.',
'show-big-image-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²',
'file-info-gif-looped' => 'विळखà¥à¤¯à¤¾à¤¤ सापडलेले',
'file-info-gif-frames' => '$1 {{PLURAL:$1|चौकट|चौकटी}}',
@@ -2936,6 +3007,17 @@ $1',
'bydate' => 'तारखेनà¥à¤¸à¤¾à¤°',
'sp-newimages-showfrom' => '$2, $1 पासूनचà¥à¤¯à¤¾ नवीन संचिका दाखवा',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1से',
+'minutes-abbrev' => '$1मि',
+'hours-abbrev' => '$1ता',
+'days-abbrev' => '$1दि',
+'seconds' => '{{PLURAL:$1|$1 सेकंद|$1 सेकंद}}',
+'minutes' => '{{PLURAL:$1|$1 मिनिट|$1 मिनिट}}',
+'hours' => '{{PLURAL:$1|$1 तास|$1 तास}}',
+'days' => '{{PLURAL:$1|$1 दिवस|$1 दिवस}}',
+'ago' => '$1 पूरà¥à¤µà¥€',
+
# Bad image list
'bad_image_list' => 'रूपरेषा खालीलपà¥à¤°à¤®à¤¾à¤£à¥‡ आहे:
@@ -3424,13 +3506,6 @@ $5
'scarytranscludefailed' => '[कà¥à¤·à¤®à¤¸à¥à¤µ;$1करिताची साचा ओढी फसली]',
'scarytranscludetoolong' => '[आंतरजालपतà¥à¤¤à¤¾ खूप लांब आहे]',
-# Trackbacks
-'trackbackbox' => 'या पानाकरिता मागेवळून पहा:<br />
-$1',
-'trackbackremove' => '([$1 वगळा])',
-'trackbacklink' => 'पाठीमाग(पाठलाग)',
-'trackbackdeleteok' => 'पाठलाग यशसà¥à¤µà¥€à¤ªà¤£à¥‡ वगळला.',
-
# Delete conflict
'deletedwhileediting' => 'â€â€™à¤¸à¥‚चना:â€â€™ तà¥à¤®à¥à¤¹à¥€ संपादन सà¥à¤°à¥‚ केलà¥à¤¯à¤¾à¤¨à¤‚तर हे पान वगळले गेले आहे.',
'confirmrecreate' => "तà¥à¤®à¥à¤¹à¥€ संपादन सà¥à¤°à¥‚ केलà¥à¤¯à¤¾à¤¨à¤‚तर सदसà¥à¤¯ [[User:$1|$1]] ([[User talk:$1|चरà¥à¤šà¤¾]])ने हे पान पà¥à¤¢à¥€à¤² कारणाने वगळले:
@@ -3514,6 +3589,9 @@ $1',
'watchlisttools-edit' => 'पहाऱà¥à¤¯à¤¾à¤šà¥€ सूची पहा आणि संपादित करा',
'watchlisttools-raw' => 'कचà¥à¤šà¥€ पहाऱà¥à¤¯à¤¾à¤šà¥€ सूची संपादीत करा',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|चरà¥à¤šà¤¾]])',
+
# Core parser functions
'unknown_extension_tag' => 'अजà¥à¤žà¤¾à¤¤ विसà¥à¤¤à¤¾à¤° खूण "$1"',
'duplicate-defaultsort' => '\'\'\'वॉरà¥à¤¨à¤¿à¤‚ग:\'\'\' डिफॉलà¥à¤Ÿ सॉरà¥à¤Ÿ की "$2"ओवरà¥à¤°à¤¾à¤‡à¤¡à¥à¤¸ अरà¥à¤²à¥€à¤¯à¤° डिफॉलà¥à¤Ÿ सॉरà¥à¤Ÿ की "$1".',
@@ -3608,13 +3686,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|बदल|बदल}}',
# Special:ComparePages
-'comparepages' => 'पानांची तà¥à¤²à¤¨à¤¾ करा',
-'compare-selector' => 'पानांचà¥à¤¯à¤¾ आवरà¥à¤¤à¤¨à¤¾à¤‚ची तà¥à¤²à¤¨à¤¾ करा',
-'compare-page1' => 'पान १',
-'compare-page2' => 'पान २',
-'compare-rev1' => 'आवरà¥à¤¤à¤¨ १',
-'compare-rev2' => 'आवरà¥à¤¤à¤¨ २',
-'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करा',
+'comparepages' => 'पानांची तà¥à¤²à¤¨à¤¾ करा',
+'compare-selector' => 'पानांचà¥à¤¯à¤¾ आवरà¥à¤¤à¤¨à¤¾à¤‚ची तà¥à¤²à¤¨à¤¾ करा',
+'compare-page1' => 'पान १',
+'compare-page2' => 'पान २',
+'compare-rev1' => 'आवरà¥à¤¤à¤¨ १',
+'compare-rev2' => 'आवरà¥à¤¤à¤¨ २',
+'compare-submit' => 'तà¥à¤²à¤¨à¤¾ करा',
+'compare-invalid-title' => 'तà¥à¤®à¥à¤¹à¥€ नमà¥à¤¦ केलेले शीरà¥à¤·à¤• अगà¥à¤°à¤¾à¤¹à¥à¤¯ आहे.',
+'compare-title-not-exists' => 'या नावाने काहीही असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
+'compare-revision-not-exists' => 'आपण नमà¥à¤¦ करत असलेली आवृतà¥à¤¤à¥€ असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
# Database error messages
'dberr-header' => 'या विकीत à¤à¤• चूक आहे',
@@ -3641,4 +3722,89 @@ $1',
'sqlite-has-fts' => 'पूरà¥à¤£-मजकूर शोध समरà¥à¤¥à¤¨à¤¾à¤¸à¤¹à¤¿à¤¤ $1',
'sqlite-no-fts' => 'पूरà¥à¤£-मजकूर शोध समरà¥à¤¥à¤¨à¤¾à¤µà¤¿à¤°à¤¹à¤¿à¤¤ $1',
+# New logging system
+'logentry-delete-delete' => '$1 वगळले पान $3',
+'logentry-delete-restore' => '$1 restored पृषà¥à¤  $3',
+'logentry-delete-event' => ' $3: $4 वरील {{PLURAL:$5|à¤à¤•à¤¾ नोंद घटने |$5 lनोंद घटनां}} ची दृषà¥à¤¯à¤¤à¤¾ $1 बदलली',
+'logentry-delete-revision' => '$3: $4 पानावरील {{PLURAL:$5|à¤à¤•à¤¾ आवृतà¥à¤¤à¥€ |$5 lआवृतà¥à¤¯à¤¾à¤‚}} ची दृषà¥à¤¯à¤¤à¤¾ $1 बदलली',
+'logentry-delete-event-legacy' => '$3 वरील नोंदींची दृषà¥à¤¯à¤¤à¤¾ $1 बदलली',
+'logentry-delete-revision-legacy' => '$3 वरील आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚ची दृषà¥à¤¯à¤¤à¤¾ $1 बदलली',
+'logentry-suppress-delete' => '$1 लपवले पान $3',
+'logentry-suppress-event' => ' $3: $4 वरील {{PLURAL:$5|à¤à¤•à¤¾ नोंद घटने |$5 lनोंद घटनां}} ची दृषà¥à¤¯à¤¤à¤¾ $1 ने गà¥à¤ªà¥à¤¤à¤¤à¥‡à¤¨à¥‡ बदलली',
+'logentry-suppress-revision' => '$3: $4 वरील {{PLURAL:$5|आवृतà¥à¤¤à¥€|$5 lआवृतà¥à¤¯à¤¾à¤‚}} ची दृषà¥à¤¯à¤¤à¤¾ $1 ने गà¥à¤ªà¥à¤¤à¤¤à¥‡à¤¨à¥‡ बदलली',
+'logentry-suppress-event-legacy' => '$3 वरील नोंदींची दृषà¥à¤¯à¤¤à¤¾ $1 ने गोपनियतेने बदलली',
+'logentry-suppress-revision-legacy' => '$3 वरील आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚ची दृषà¥à¤¯à¤¤à¤¾ $1 ने गोपनियतेने बदलली',
+'revdelete-content-hid' => 'माहिती लपवली आहे',
+'revdelete-summary-hid' => 'बदलांचा आढावा लà¥à¤ªà¥à¤¤',
+'revdelete-uname-hid' => 'सदसà¥à¤¯à¤¨à¤¾à¤® लपवलेले आहे',
+'revdelete-content-unhid' => 'माहिती लपवलीनाही',
+'revdelete-summary-unhid' => 'बदलांचा आढावा दृषà¥à¤¯',
+'revdelete-uname-unhid' => 'सदसà¥à¤¯à¤¨à¤¾à¤® लपवलेले नाही',
+'revdelete-restricted' => 'पà¥à¤°à¤¬à¤‚धकांना बंधने दिली',
+'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धकांची बंधने काढली',
+'logentry-move-move' => ' $3पान $4 कडे $1 सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत',
+'logentry-move-move-noredirect' => '$1 ने $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ न करता $4 येथे सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले',
+'logentry-move-move_redir' => '$1 यांनी $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ लावà¥à¤¨ $4 येथे हलवले',
+'logentry-move-move_redir-noredirect' => '$1 ने $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ न करता $4 येथे पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¤¾à¤µà¤° सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले',
+'logentry-patrol-patrol' => ' $3 पानाचà¥à¤¯à¤¾ $1 सà¥à¤šà¤µà¤²à¥‡à¤²à¥à¤¯à¤¾ $4 आवृतà¥à¤¤à¥€à¤¸ गसà¥à¤¤ घातली',
+'logentry-patrol-patrol-auto' => ' $3 पानाचà¥à¤¯à¤¾ $1 सà¥à¤šà¤µà¤²à¥‡à¤²à¥à¤¯à¤¾ $4 आवृतà¥à¤¤à¥€à¤¸ सà¥à¤µà¤¯à¤‚चलित गसà¥à¤¤ घातली',
+'logentry-newusers-newusers' => 'à¤à¤• सदसà¥à¤¯à¤–ाते $1 तयार केले',
+'logentry-newusers-create' => 'à¤à¤• सदसà¥à¤¯à¤–ाते $1 तयार केले',
+'logentry-newusers-create2' => '$1 ने सदसà¥à¤¯ खाते $3 निरà¥à¤®à¤¿à¤¤ केले आहे.',
+'logentry-newusers-autocreate' => '$1 खाते सà¥à¤µà¤¯à¤®à¥‡à¤µ निरà¥à¤®à¤¿à¤¤ à¤à¤¾à¤²à¥‡ आहे.',
+'newuserlog-byemail' => 'परवलीचा शबà¥à¤¦ इमेलमारà¥à¤«à¤¤ पाठविलेला आहे',
+
+# Feedback
+'feedback-bugornote' => 'जर आपण तांतà¥à¤°à¤¿à¤• पà¥à¤°à¤¶à¥à¤¨ विसà¥à¤¤à¥ƒà¤¤à¤ªà¤£à¥‡ मांडणà¥à¤¯à¤¾à¤¸ तयार असाल तर कृपया ($1 गणकदोष वृतांत) पाठवा. नपेकà¥à¤·à¤¾, खाली देणà¥à¤¯à¤¾à¤¤ आलेले सोपे आवेदनपतà¥à¤° वापरा. आपली टिपà¥à¤ªà¤£à¥€ "[ $3, $2]" या पानास आपले सदसà¥à¤¯à¤¨à¤¾à¤µ व आपण कोणता बà¥à¤°à¤¾à¤‰à¤œà¤° वापरता यासह जोडणà¥à¤¯à¤¾à¤¤ येईल.',
+'feedback-subject' => 'विषय:',
+'feedback-message' => 'संदेश:',
+'feedback-cancel' => 'रदà¥à¤¦ करा',
+'feedback-submit' => 'पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ दà¥à¤¯à¤¾',
+'feedback-adding' => 'आपला पशà¥à¤šà¤ªà¥à¤°à¤¦à¤¾à¤¯ (फिडबॅक) जोडत आहोत या पानास.......',
+'feedback-error1' => 'चूक: API कडून अनोळखी परिणाम',
+'feedback-error2' => 'तà¥à¤°à¥à¤Ÿà¥€: संपादन रदà¥à¤¦',
+'feedback-error3' => 'तà¥à¤°à¥à¤Ÿà¥€:à¤à¤ªà¥€à¤†à¤¯ तरà¥à¤«à¥‡ काहीच पà¥à¤°à¤¤à¥à¤¯à¥à¤¤à¥à¤¤à¤° नाही',
+'feedback-thanks' => ' "[$2 $1]" या पानात आपला पशà¥à¤šà¤ªà¥à¤°à¤¦à¤¾à¤¯ (फिडबॅक) टाकत आहोत.',
+'feedback-close' => 'à¤à¤¾à¤²à¥‡',
+'feedback-bugcheck' => 'उतà¥à¤¤à¤®! फकà¥à¤¤ à¤à¤•à¤¦à¤¾ खातà¥à¤°à¥€ करा की हा [$1 अगोदरच माहिती असलेला बग] तर नाहीये.',
+'feedback-bugnew' => 'मी तपासले आहे. हा à¤à¤• नवीन बग मà¥à¤¹à¤£à¥‚न नोंद करावी',
+
+# API errors
+'api-error-badaccess-groups' => 'आपणास हà¥à¤¯à¤¾ विकीवर संचिका चढवणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही',
+'api-error-badtoken' => 'अंतरà¥à¤—त चूक: अयोगà¥à¤¯ टोकन',
+'api-error-copyuploaddisabled' => "या विदागारावर 'संकेतसà¥à¤¥à¤³à¤¾à¤µà¤°à¥€à¤² संचिका चढविणे' अकà¥à¤·à¤® करणà¥à¤¯à¤¾à¤¤ आले आहे.",
+'api-error-duplicate' => 'या संकेतसà¥à¤¥à¤³à¤¾à¤µà¤° यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे [$2 दà¥à¤¸à¤°à¥€ संचिका]| [$2 दà¥à¤¸à¤±à¥à¤¯à¤¾ संचिका]}} आहेत.',
+'api-error-duplicate-archive' => '{{PLURAL:$1| [$2 another file]| [$2 some other files]}} हे याच नावाने साईट वर आहे आणि पान {{PLURAL:$1|it was|they were}} वगळले गेले आहे',
+'api-error-duplicate-archive-popup-title' => 'नकà¥à¤•à¤² {{PLURAL:$1|संचिका|संचिका}} जà¥à¤¯à¤¾ पूरà¥à¤µà¥€à¤š वगळलà¥à¤¯à¤¾ आहेत',
+'api-error-duplicate-popup-title' => 'पà¥à¤°à¤¤à¤¿à¤°à¥‚पक {{PLURAL:$1|संचिका|संचिका}}',
+'api-error-empty-file' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ केलेली संचिका रिकामी होती.',
+'api-error-emptypage' => 'नवीन आणि मोकळी पाने बनवायला परवानगी नाही',
+'api-error-fetchfileerror' => 'अंतरà¥à¤—त चूक: फाइल मिळवतांना काहीतरी चूक à¤à¤¾à¤²à¥€ आहे',
+'api-error-file-too-large' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ केलेली संचिका आकाराने खूप मोठी होती.',
+'api-error-filename-tooshort' => 'संचिकेचे नाव खूपच छोटे आहे.',
+'api-error-filetype-banned' => 'यापà¥à¤°à¤•à¤¾à¤°à¤šà¥€ संचिका पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'api-error-filetype-missing' => 'या संचिकेस विसà¥à¤¤à¤¾à¤°(à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन) नाही.',
+'api-error-hookaborted' => 'तà¥à¤®à¥à¤¹à¥€ केलेला बदल extension ने उलटवला आहे',
+'api-error-http' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€: सरà¥à¤µà¥à¤¹à¤°à¤¶à¥€ जोडणी होऊ शकली नाही.',
+'api-error-illegal-filename' => 'हे संचिकानाम पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'api-error-internal-error' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€:आपण विकिवर चढविलेलà¥à¤¯à¤¾ संचिकेवर पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ करतांना काहीतरी चà¥à¤•à¤²à¥‡ आहे.',
+'api-error-invalid-file-key' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€: तातà¥à¤ªà¥à¤°à¤¤à¥à¤¯à¤¾ साठवणीत संचिका सापडली नाही.',
+'api-error-missingparam' => 'अंतरà¥à¤—त चूक: मागणीतील काही नोंदी राहून गेलà¥à¤¯à¤¾ आहेत',
+'api-error-missingresult' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¥€ : पà¥à¤°à¤¤ यशसà¥à¤µà¥€ à¤à¤¾à¤²à¥€ कि नाही हे ठरवता येत नाही',
+'api-error-mustbeloggedin' => 'संचिका चढविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आपण दाखल होणे जरूरी आहे.',
+'api-error-mustbeposted' => 'अंतरà¥à¤—त चूक: मागणी पूरà¥à¤£ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ HTTP POST असायला हवे',
+'api-error-noimageinfo' => 'डाटा अपलोड यशसà¥à¤µà¥€ à¤à¤¾à¤²à¥‡ आहे पण सरà¥à¤µà¥à¤¹à¤° कडून तशी माहिती अजून मिळाली नाही',
+'api-error-nomodule' => 'अंतरà¥à¤—त चूक: module set चढवलेला नाही',
+'api-error-ok-but-empty' => 'आंतरिक तà¥à¤°à¥à¤Ÿà¥€ : विदादाता पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ देत नहीं',
+'api-error-overwrite' => 'असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलेलà¥à¤¯à¤¾ संचिकेवर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आहे.',
+'api-error-stashfailed' => 'इनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¥€ : विदादाता तातà¥à¤ªà¥à¤°à¤¤à¥à¤¯à¤¾ सà¥à¤µà¤°à¥à¤ªà¤¾à¤šà¥à¤¯à¤¾ संचिका जमा करणà¥à¤¯à¤¾à¤¤ अयशसà¥à¤µà¥€',
+'api-error-timeout' => 'अपेकà¥à¤·à¤¿à¤¤ वेळेत विदागार (server)ने पà¥à¤°à¤¤à¤¿à¤¸à¤¾à¤¦ दिला नाही.',
+'api-error-unclassified' => 'à¤à¤• अजà¥à¤žà¤¾à¤¤ चूक उदà¥à¤­à¤µà¤²à¥€.',
+'api-error-unknown-code' => 'अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¥€: "$1"',
+'api-error-unknown-error' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€:आपली संचिका चढवितांना काहीतरी चà¥à¤•à¤²à¥‡ आहे.',
+'api-error-unknown-warning' => 'अजà¥à¤žà¤¾à¤¤ इशारा : $1',
+'api-error-unknownerror' => 'अजà¥à¤žà¤¾à¤¤ चूक $1',
+'api-error-uploaddisabled' => 'चढवणà¥à¤¯à¤¾à¤šà¥‡ कारà¥à¤¯ हà¥à¤¯à¤¾ विकिवर अवरà¥à¤¦à¥à¤§ करणà¥à¤¯à¤¾à¤¤ आले आहे',
+'api-error-verification-error' => 'ही संचिका भà¥à¤°à¤·à¥à¤Ÿ(करपà¥à¤Ÿ) à¤à¤¾à¤²à¥€ किंवा चà¥à¤•à¤¿à¤šà¤¾ विसà¥à¤¤à¤¾à¤°(à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन) असलेली असू शकते.',
+
);
diff --git a/languages/messages/MessagesMrj.php b/languages/messages/MessagesMrj.php
index 68e847ab..c62fb84e 100644
--- a/languages/messages/MessagesMrj.php
+++ b/languages/messages/MessagesMrj.php
@@ -41,6 +41,9 @@ $namespaceAliases = array(
'Категори_кӓнгӓшӹмӓш' => NS_CATEGORY_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'Ðжедмӓшвлӓм ыдыралаш',
@@ -482,8 +485,7 @@ $messages = array(
'linksearch' => 'Тӱнӹш ажедмӓшвлӓ',
# Special:Log/newusers
-'newuserlogpage' => 'Сирӹшӹвлӓм региÑтрируйышы журнал',
-'newuserlog-create-entry' => 'У Ñирӹшӹ',
+'newuserlogpage' => 'Сирӹшӹвлӓм региÑтрируйышы журнал',
# Special:ListGroupRights
'listgrouprights-members' => '(группын ÑпиÑокшы)',
@@ -513,7 +515,6 @@ $messages = array(
'actioncomplete' => 'Лачокат ӹштӹмӹ',
'deletedtext' => '«$1» карангдымы.
Ðнжы: $2 тидӹ мам карангдымы Ñ‚Ó¹ ÑпиÑокым анжыкта',
-'deletedarticle' => '«[[$1]]» карангдымы',
'dellogpage' => 'Мам карангдымы анжыктышы Ñирмӓш',
'deletecomment' => 'Ӓмӓлжӹ:',
'deleteotherreason' => 'Ð’ÐµÑ Ó“Ð¼Ó“Ð»/ынгылдарал:',
@@ -545,8 +546,7 @@ $messages = array(
'restriction-level' => 'Пыраш лимӹ кӱкшӹц:',
# Undelete
-'undeletelink' => 'анжен лӓктӓш/угӹц ӹштӓш',
-'undeletedarticle' => 'мӹнгеш шӹндӹмӹ «[[$1]]»',
+'undeletelink' => 'анжен лӓктӓш/угӹц ӹштӓш',
# Namespace form on various pages
'namespace' => 'Лӹмвлӓн кымдецӹштӹ:',
@@ -617,8 +617,6 @@ $messages = array(
'talkexists' => "'''Ӹлӹштӓш лӹм вашталтымы, но техень лӹмӓн ӹлӹштӓш тӹтежӓт улы, кӓнгӓшӹмӓш ӹлӹштӓшӹн лӹмжӹм вашталташ ак ли. Пуры лидӓ, кид доно нӹнӹм ушыда.'''",
'movedto' => 'техеньӹш вашталтымы',
'movetalk' => 'Ти кӓнгӓшӹмӓш ӹлӹштӓшӹн лӹмжӹм вашталташ',
-'1movedto2' => 'лӹмӹм вашталтымы «[[$1]]» в «[[$2]]»',
-'1movedto2_redir' => '«[[$1]]» у лӹмӹм пумы «[[$2]]» Ð²ÐµÑ Ð²Ó“Ñ€Ñ‹Ñˆ колтымы вӹлец',
'movelogpage' => 'Лӹмвлӓм вашталтымы журнал',
'movereason' => 'Ӓмӓлжӹ:',
'revertmove' => 'лишӹц колтымаш',
@@ -689,7 +687,7 @@ $messages = array(
# Media information
'file-info-size' => '$1 × $2 пикÑел, файлын размержӹ: $3, MIME-тип: $4',
-'file-nohires' => '<small>Кого разрешени доно верÑи уке.</small>',
+'file-nohires' => 'Кого разрешени доно верÑи уке.',
'svg-long-desc' => 'SVG-файл, номинально $1 × $2 пикÑель, файлын размержӹ: $3',
'show-big-image' => 'Кӱкшӹрӓк разрешениӓн изображени',
diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php
index 9700e335..10d88059 100644
--- a/languages/messages/MessagesMs.php
+++ b/languages/messages/MessagesMs.php
@@ -68,36 +68,36 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#LENCONG', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'BULANSEMASA', 'BULANSEMASA2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'BULANSEMASA1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NAMABULANSEMASA', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NAMABULANSEMASAGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'SINGBULANSEMASA', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'HARISEMASA', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'HARISEMASA2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NAMAHARISEMASA', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TAHUNSEMASA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'WAKTUSEMASA', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'JAMSEMASA', 'CURRENTHOUR' ),
- 'pagename' => array( '1', 'NAMALAMAN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
- 'fullpagename' => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NAMALAMANPENUHE', 'FULLPAGENAMEE' ),
- 'msg' => array( '0', 'PESAN:', 'MSG:' ),
- 'subst' => array( '0', 'TUKAR:', 'SUBST:' ),
- 'img_right' => array( '1', 'kiri', 'right' ),
- 'img_left' => array( '1', 'kanan', 'left' ),
- 'img_none' => array( '1', 'tiada', 'none' ),
- 'img_center' => array( '1', 'tengah', 'center', 'centre' ),
- 'sitename' => array( '1', 'NAMATAPAK', 'SITENAME' ),
- 'ns' => array( '0', 'RN:', 'NS:' ),
- 'nse' => array( '0', 'RNE:', 'NSE:' ),
- 'currentweek' => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
+ 'redirect' => array( '0', '#LENCONG', '#REDIRECT' ),
+ 'currentmonth' => array( '1', 'BULANSEMASA', 'BULANSEMASA2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'BULANSEMASA1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NAMABULANSEMASA', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NAMABULANSEMASAGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'SINGBULANSEMASA', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'HARISEMASA', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'HARISEMASA2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NAMAHARISEMASA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TAHUNSEMASA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'WAKTUSEMASA', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'JAMSEMASA', 'CURRENTHOUR' ),
+ 'pagename' => array( '1', 'NAMALAMAN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
+ 'fullpagename' => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NAMALAMANPENUHE', 'FULLPAGENAMEE' ),
+ 'msg' => array( '0', 'PESAN:', 'MSG:' ),
+ 'subst' => array( '0', 'TUKAR:', 'SUBST:' ),
+ 'img_right' => array( '1', 'kiri', 'right' ),
+ 'img_left' => array( '1', 'kanan', 'left' ),
+ 'img_none' => array( '1', 'tiada', 'none' ),
+ 'img_center' => array( '1', 'tengah', 'center', 'centre' ),
+ 'sitename' => array( '1', 'NAMATAPAK', 'SITENAME' ),
+ 'ns' => array( '0', 'RN:', 'NS:' ),
+ 'nse' => array( '0', 'RNE:', 'NSE:' ),
+ 'currentweek' => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
);
$specialPageAliases = array(
@@ -555,21 +555,23 @@ Sila catat URL bagi laman ini dan laporkan perkara ini kepada seorang [[Special:
'badarticleerror' => 'Tindakan ini tidak boleh dilaksanakan pada laman ini.',
'cannotdelete' => 'Laman atau fail $1 tidak dapat dihapuskan.
Ia mungkin telah pun dihapuskan oleh orang lain.',
+'cannotdelete-title' => 'Laman "$1" tidak dapat dihapuskan',
'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 berikut adalah teragregat dan mungkin bukan yang terkini.',
-'perfcachedts' => 'Data berikut adalah teragregat dan dikemaskinikan buat kali terakhir pada $1.',
+'perfcached' => 'Data yang berikut disimpan dalam cache dan mungkin tidak terkemas kini. Semaksimum {{PLURAL:$1|satu hasil|$1 hasil}} terdapat dalam cache.',
+'perfcachedts' => 'Data yang berikut disimpan dalam cache dan kali terakhir dikemaskinikan pada $1. Semaksimum {{PLURAL:$4|satu hasil|$4 hasil}} terdapat dalam cache.',
'querypage-no-updates' => 'Buat masa ini, pengkemaskinian laman ini telah dilumpuhkan.
Data yang ada di sini tidak akan disegarkan semula sekarang.',
'wrong_wfQuery_params' => 'Parameter salah bagi wfQuery()<br />
Fungsi: $1<br />
Pertanyaan: $2',
'viewsource' => 'Lihat sumber',
-'viewsourcefor' => 'bagi $1',
+'viewsource-title' => 'Lihat sumber bagi $1',
'actionthrottled' => 'Tindakan didikitkan',
'actionthrottledtext' => 'Untuk mencegah spam, anda dihadkan daripada melakukan tindakan ini berulang kali dalam ruang waktu yang singkat, dan anda telah melebihi had tersebut. Sila cuba lagi selepas beberapa minit.',
'protectedpagetext' => 'Laman ini telah dikunci untuk menghalang penyuntingan.',
'viewsourcetext' => 'Anda boleh melihat dan menyalin sumber bagi laman ini:',
+'viewyourtext' => "Anda boleh melihat dan menyalin sumber '''suntingan anda''' kepada laman ini:",
'protectedinterface' => 'Laman ini menyediakan teks antara muka bagi perisian ini, akan tetapi dikunci untuk menghalang penyalahgunaan.',
'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. Untuk melakukan penterjemahan, anda boleh menggunakan [//translatewiki.net/wiki/Main_Page?setlang=ms translatewiki.net], sebuah projek penyetempatan MediaWiki.",
'sqlhidden' => '(Pertanyaan SQL disorokkan)',
@@ -664,6 +666,7 @@ e-mel bagi ciri-ciri berikut tidak boleh dikirim.',
'noemailprefs' => 'Anda perlu menetapkan alamat e-mel terlebih dahulu untuk menggunakan ciri-ciri ini.',
'emailconfirmlink' => 'Sahkan alamat e-mel anda.',
'invalidemailaddress' => 'Alamat e-mel tersebut tidak boleh diterima kerana ia tidak sah. Sila masukkan alamat e-mel yang betul atau kosongkan sahaja ruangan tersebut.',
+'cannotchangeemail' => 'Alamat e-mel akaun tidak boleh diubah di wiki ini.',
'accountcreated' => 'Akaun dibuka',
'accountcreatedtext' => 'Akaun pengguna bagi $1 telah dibuka.',
'createaccount-title' => 'Pembukaan akaun {{SITENAME}}',
@@ -681,6 +684,7 @@ Sila tunggu sebentar dan cuba lagi.',
# E-mail sending
'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
+'user-mail-no-addy' => 'E-eml cuba dihantar tanpa alamat e-mel',
# Change password dialog
'resetpass' => 'Tukar kata laluan',
@@ -701,28 +705,43 @@ Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan
'resetpass-temp-password' => 'Kata laluan sementara:',
# Special:PasswordReset
-'passwordreset' => 'Set semula kata laluan',
-'passwordreset-text' => 'Isikan borang ini untuk menerima peringatan butiran akaun anda melalui e-mel.',
-'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-username' => 'Nama pengguna:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'Alamat e-mel:',
-'passwordreset-emailtitle' => 'Butiran akaun di {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ada orang (mungkin anda, dari alamat IP $1) yang memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
+'passwordreset' => 'Set semula kata laluan',
+'passwordreset-text' => 'Isikan borang ini untuk menerima peringatan butiran akaun anda melalui e-mel.',
+'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-username' => 'Nama pengguna:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Lihat e-mel yang terhasil?',
+'passwordreset-capture-help' => 'Jika anda menandai ruang ini, e-mel (yang membawa kata laluan sementara) akan ditunjukkan kepada anda dan juga dihantar kepada pengguna itu.',
+'passwordreset-email' => 'Alamat e-mel:',
+'passwordreset-emailtitle' => 'Butiran akaun di {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Ada orang (mungkin anda, dari alamat IP $1) yang memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
$2
{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa {{PLURAL:$5|sehari|$5 hari}}. Anda mesti log masuk dan buat kata laluan baru sekarang juga. Jika permohonan ini dibuat oleh orang lain, ataupun jika anda teringat balik kata laluan lama anda, dan tidak ingin lagi untuk menukarnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
-'passwordreset-emailtext-user' => 'Pengguna $1 di {{SITENAME}} memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
+'passwordreset-emailtext-user' => 'Pengguna $1 di {{SITENAME}} memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
$2
{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa {{PLURAL:$5|sehari|$5 hari}}. Anda mesti log masuk dan buat kata laluan baru sekarang juga. Jika permohonan ini dibuat oleh orang lain, ataupun jika anda teringat balik kata laluan lama anda, dan tidak ingin lagi untuk menukarnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
-'passwordreset-emailelement' => 'Nama pengguna: $1
+'passwordreset-emailelement' => 'Nama pengguna: $1
Kata laluan sementara: $2',
-'passwordreset-emailsent' => 'E-mel peringatan telah dihantar.',
+'passwordreset-emailsent' => 'E-mel peringatan telah dihantar.',
+'passwordreset-emailsent-capture' => 'E-mel peringatan (seperti di bawah) telah dihantar.',
+'passwordreset-emailerror-capture' => 'E-mel peringatan (seperti di bawah) telah dihasilkan tetapi tidak dapat dihantar kepada pengguna: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Tukar alamat e-mel',
+'changeemail-header' => 'Tukar alamat e-mel akaun',
+'changeemail-text' => 'Lengkapkan borang ini untuk menukar alamat e-mel anda. Anda akan perlu mengisikan kata laluan untuk mengesahkan perubahan ini.',
+'changeemail-no-info' => 'Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.',
+'changeemail-oldemail' => 'Alamat e-mel sekarang:',
+'changeemail-newemail' => 'Alamat e-mel baru:',
+'changeemail-none' => '(tiada)',
+'changeemail-submit' => 'Tukar E-mel',
+'changeemail-cancel' => 'Batalkan',
# Edit page toolbar
'bold_sample' => 'Teks tebal',
@@ -790,10 +809,6 @@ Sila ambil perhatian bahawa anda tidak boleh menggunakan ciri "e-melkan pengguna
Alamat IP semasa anda ialah $3, dan ID sekatan ialah #$5. Sila sertakan maklumat-maklumat ini dalam pertanyaan nanti.',
'blockednoreason' => 'tiada sebab diberikan',
-'blockedoriginalsource' => "Sumber bagi '''$1'''
-ditunjukkan di bawah:",
-'blockededitsource' => "Teks bagi '''suntingan anda''' terhadap '''$1''' ditunjukkan di bawah:",
-'whitelistedittitle' => 'Log masuk dahulu untuk menyunting',
'whitelistedittext' => 'Anda hendaklah $1 terlebih dahulu untuk menyunting laman.',
'confirmedittext' => 'Anda perlu mengesahkan alamat e-mel anda terlebih dahulu untuk menyunting mana-mana laman. Sila tetapkan dan sahkan alamat e-mel anda melalui [[Special:Preferences|laman keutamaan]].',
'nosuchsectiontitle' => 'Tidak ada bahagian ini',
@@ -875,8 +890,8 @@ Anda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau disal
Anda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau
disalin daripada domain awam atau mana-mana sumber bebas lain (lihat $1 untuk butiran lanjut).
'''JANGAN KIRIM KARYA HAK CIPTA ORANG LAIN TANPA KEBENARAN!'''",
-'longpageerror' => "'''RALAT: Panjang teks yang dikirim ialah $1 kilobait,
-melebihi had maksimum $2 kilobait. Ia tidak boleh disimpan.'''",
+'longpageerror' => "'''Ralat: Teks yang anda serahkan itu panjangnya {{PLURAL:$1|1|$1}} kilobait, iaitu lebih panjang daripada had maksimum {{PLURAL:$2|1|$2}} kilobait.'''
+Oleh itu, ia tidak boleh disimpan.",
'readonlywarning' => "'''AMARAN: Pangkalan data telah dikunci untuk penyenggaraan. Justeru, anda tidak boleh menyimpan suntingan anda pada masa sekarang.
Anda boleh menyalin teks anda ke dalam komputer anda terlebih dahulu dan simpan teks tersebut di sini pada masa akan datang.'''
@@ -1042,8 +1057,6 @@ Pentadbir {{SITENAME}} boleh melihat kandungan tersebut dan menyahhapuskannya se
'revdelete-unsuppress' => 'Buang batasan pada semakan yang dipulihkan',
'revdelete-log' => 'Sebab:',
'revdelete-submit' => 'Kenakan ke atas {{PLURAL:$1|versi|versi}} yang dipilih',
-'revdelete-logentry' => 'menukar kebolehnampakan semakan [[$1]]',
-'logdelete-logentry' => 'menukar kebolehnampakan peristiwa bagi [[$1]]',
'revdelete-success' => "'''Kebolehnampakan semakan berjaya ditetapkan.'''",
'revdelete-failure' => "'''Keterlihatan semakan tidak dapat dikemaskini:'''
$1",
@@ -1055,15 +1068,6 @@ $1",
'revdel-restore-visible' => 'semakan nampak',
'pagehist' => 'Sejarah laman',
'deletedhist' => 'Sejarah yang dihapuskan',
-'revdelete-content' => 'kandungan',
-'revdelete-summary' => 'ringkasan',
-'revdelete-uname' => 'nama pengguna',
-'revdelete-restricted' => 'mengenakan sekatan pada penyelia',
-'revdelete-unrestricted' => 'menarik sekatan daripada penyelia',
-'revdelete-hid' => 'menyembunyikan $1',
-'revdelete-unhid' => 'memunculkan $1',
-'revdelete-log-message' => '$1 bagi {{PLURAL:$2|sebuah|$2 buah}} semakan',
-'logdelete-log-message' => '$1 bagi $2 peristiwa',
'revdelete-hide-current' => 'Ralat menyembunyikan item bertarikh $2, $1: ini adalah versi semasa.
Ia tidak dapat disembunyikan.',
'revdelete-show-no-access' => 'Ralat menunjukkan item bertarikh $2, $1: item ini telah ditanda "larangan".
@@ -1222,12 +1226,14 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
'prefs-rc' => 'Perubahan terkini',
'prefs-watchlist' => 'Senarai pantau',
'prefs-watchlist-days' => 'Had bilangan hari dalam senarai pantau:',
-'prefs-watchlist-days-max' => 'Maksimum 7 hari',
+'prefs-watchlist-days-max' => 'Maksimum $1 hari',
'prefs-watchlist-edits' => 'Had maksimum perubahan untuk ditunjukkan dalam senarai pantau penuh:',
'prefs-watchlist-edits-max' => 'Had: 1000',
'prefs-watchlist-token' => 'Token senarai pantau:',
'prefs-misc' => 'Pelbagai',
'prefs-resetpass' => 'Tukar kata laluan',
+'prefs-changeemail' => 'Tukar E-mel',
+'prefs-setemail' => 'Tetapkan alamat e-mel',
'prefs-email' => 'Pilihan e-mel',
'prefs-rendering' => 'Penampilan',
'saveprefs' => 'Simpan',
@@ -1289,6 +1295,7 @@ Tindakan ini tidak boleh dibatalkan.',
'yourrealname' => 'Nama sebenar:',
'yourlanguage' => 'Bahasa:',
'yourvariant' => 'Varian bahasa kandungan:',
+'prefs-help-variant' => 'Varian atau ortografi pilihan anda untuk memaparkan laman-laman kandungan wiki anda.',
'yournick' => 'Nama samaran:',
'prefs-help-signature' => 'Komen di laman perbincangan harus ditandatangani dengan "<nowiki>~~~~</nowiki>" yang akan ditukar menjadi tandatangan anda dan cap waktu.',
'badsig' => 'Tandatangan mentah tidak sah; sila semak tag HTML.',
@@ -1327,7 +1334,7 @@ Tindakan ini tidak boleh dibatalkan.',
'userrights-lookup-user' => 'Urus kumpulan pengguna',
'userrights-user-editname' => 'Masukkan nama pengguna:',
'editusergroup' => 'Sunting Kumpulan Pengguna',
-'editinguser' => "Mengubah hak pengguna '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Mengubah hak pengguna '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Ubah kumpulan pengguna',
'saveusergroups' => 'Simpan Kumpulan Pengguna',
'userrights-groupsmember' => 'Ahli bagi:',
@@ -1422,13 +1429,13 @@ Tindakan ini tidak boleh dibatalkan.',
'right-autopatrol' => 'Suntingannya ditandakan sebagai telah diperiksa secara automatik',
'right-patrolmarks' => 'Melihat tanda pemeriksaan dalam senarai perubahan terkini',
'right-unwatchedpages' => 'Melihat senarai laman yang tidak dipantau',
-'right-trackback' => 'Mengirim jejak balik',
'right-mergehistory' => 'Menggabungkan sejarah laman',
'right-userrights' => 'Menyerahkan dan menarik balik sebarang hak pengguna',
'right-userrights-interwiki' => 'Menyerahkan dan menarik balik hak pengguna di wiki lain',
'right-siteadmin' => 'Mengunci dan membuka kunci pangkalan data',
'right-override-export-depth' => 'Mengeksport laman termasuk laman dipaut sehingga kedalaman 5',
'right-sendemail' => 'Mengirim e-mel kepada pengguna-pengguna lain',
+'right-passwordreset' => 'Lihat e-mel set semula kata laluan',
# User rights log
'rightslog' => 'Log hak pengguna',
@@ -1462,16 +1469,17 @@ Tindakan ini tidak boleh dibatalkan.',
'action-suppressionlog' => 'melihat log sulit ini',
'action-block' => 'menyekat pengguna ini daripada menyunting',
'action-protect' => 'mengubah aras perlindungan bagi laman ini',
+'action-rollback' => 'mengundurkan suntingan-suntingan pengguna terkini yang menyunting laman tertentu dengan cepat',
'action-import' => 'mengimport laman ini dari wiki lain',
'action-importupload' => 'mengimport laman ini dengan memuat naik fail',
'action-patrol' => 'menanda ronda suntingan orang lain',
'action-autopatrol' => 'menanda ronda suntingan anda sendiri',
'action-unwatchedpages' => 'melihat senarai laman tidak dipantau',
-'action-trackback' => 'mengirim jejak balik',
'action-mergehistory' => 'menggabungkan sejarah laman ini',
'action-userrights' => 'mengubah semua hak pengguna',
'action-userrights-interwiki' => 'mengubah hak pengguna dari wiki lain',
'action-siteadmin' => 'mengunci atau membuka kunci pangkalan data wiki ini',
+'action-sendemail' => 'menghantar e-mel',
# Recent changes
'nchanges' => '$1 perubahan',
@@ -1501,11 +1509,11 @@ Tindakan ini tidak boleh dibatalkan.',
'newpageletter' => 'B',
'boteditletter' => 'b',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 pemantau]',
'rc_categories' => 'Hadkan kepada kategori (asingkan dengan "|")',
'rc_categories_any' => 'Semua',
'rc-change-size' => '$1',
+'rc-change-size-new' => '$1 bait selepas perubahan',
'newsectionsummary' => '/* $1 */ bahagian baru',
'rc-enhanced-expand' => 'Papar butiran (JavaScript diperlukan)',
'rc-enhanced-hide' => 'Sorokkan butiran',
@@ -1515,7 +1523,6 @@ Tindakan ini tidak boleh dibatalkan.',
'recentchangeslinked-feed' => 'Perubahan berkaitan',
'recentchangeslinked-toolbox' => 'Perubahan berkaitan',
'recentchangeslinked-title' => 'Perubahan berkaitan dengan $1',
-'recentchangeslinked-backlink' => '↠$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:',
@@ -1559,6 +1566,7 @@ Untuk menyertakan sebarang fail ke dalam sesebuah laman, gunakan pautan dengan s
'ignorewarnings' => 'Abaikan sebarang amaran',
'minlength1' => 'Panjang nama fail mestilah sekurang-kurangnya satu huruf.',
'illegalfilename' => 'Nama fail "$1" mengandungi aksara yang tidak dibenarkan dalam tajuk laman. Sila tukar nama fail ini dan muat naik sekali lagi.',
+'filename-toolong' => 'Nama fail tidak boleh melebihi 240 bait.',
'badfilename' => 'Nama fail telah ditukar kepada "$1".',
'filetype-mime-mismatch' => 'Sambungan fail ".$1" tidak padan dengan jenis MIME fail ($2).',
'filetype-badmime' => 'Memuat naik fail jenis MIME "$1" adalah tidak dibenarkan.',
@@ -1659,6 +1667,41 @@ Sila hubungi [[Special:ListUsers/sysop|pentadbir sistem]].',
'upload-unknown-size' => 'Saiz tidak diketahui',
'upload-http-error' => 'Berlaku ralat HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Fail $1 tidak dapat distrimkan.',
+'backend-fail-backup' => 'Fail $1 tidak dapat disandarkan.',
+'backend-fail-notexists' => 'Fail $1 tidak wujud.',
+'backend-fail-hashes' => 'Cincangan fail untuk perbandingan tidak dapat diperoleh.',
+'backend-fail-notsame' => 'Satu fail yang tidak seiras sudah wujud di $1.',
+'backend-fail-invalidpath' => '$1 bukan laluan storan yang sah.',
+'backend-fail-delete' => 'Fail $1 tidak dapat dihapuskan.',
+'backend-fail-alreadyexists' => 'Fail $1 sudah wujud.',
+'backend-fail-store' => 'Fail $1 tidak dapat distorkan di $2.',
+'backend-fail-copy' => 'Fail $1 tidak dapat disalin ke $2.',
+'backend-fail-move' => 'Fail $1 tidak dapat dipindahkan ke $2.',
+'backend-fail-opentemp' => 'Fail sementara tidak dapat dibuka.',
+'backend-fail-writetemp' => 'Fail sementara tidak dapat ditulisi.',
+'backend-fail-closetemp' => 'Fail sementara tidak dapat ditutup.',
+'backend-fail-read' => 'Fail $1 tidak dapat dibaca.',
+'backend-fail-create' => 'Fail $1 tidak dapat diwujudkan.',
+'backend-fail-readonly' => 'Backend storan "$1" kini dalam mod baca sahaja. Sebab yang diberikan ialah: "$2"',
+'backend-fail-synced' => 'Fail "$1" berada dalam keadaan yang tidak sejajar dalam backend storan dalaman',
+'backend-fail-connect' => 'Tidak dapat bersambung dengan backend storan "$1".',
+'backend-fail-internal' => 'Berlakunya ralat yang tidak dikenali dalam backend storan "$1".',
+'backend-fail-contenttype' => 'Jenis kandungan fail untuk disimpan di "$1" tidak dapat ditentukan.',
+'backend-fail-batchsize' => 'Backend storan diberi $1 operasi fail dalam satu kelompok; hadnya ialah $2 operasi.',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" tidak dapat dibuka; ia tidak terkunci.',
+'lockmanager-fail-closelock' => 'Fail kunci untuk "$1" tidak dapat ditutup.',
+'lockmanager-fail-deletelock' => 'Fail kunci untuk "$1" tidak dapat dihapuskan.',
+'lockmanager-fail-acquirelock' => 'Kunci untuk "$1" tidak dapat diperoleh.',
+'lockmanager-fail-openlock' => 'Fail kunci untuk "$1" tidak dapat dibuka.',
+'lockmanager-fail-releaselock' => 'Kunci untuk "$1" tidak dapat dikeluarkan.',
+'lockmanager-fail-db-bucket' => 'Di baldi $1 tidak dapat dihubungi pangkalan data selak yang secukupnya.',
+'lockmanager-fail-db-release' => 'Selak-selak tidak dapat dikeluarkan di pangkalan data $1.',
+'lockmanager-fail-svr-release' => 'Selak-selak tidak dapat dikeluarkan di pelayan $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Wujud ralat ketika membuka fail untuk pemeriksaan ZIP.',
'zip-wrong-format' => 'Fail yang dinyatakan bukan fail ZIP.',
@@ -1675,6 +1718,7 @@ Ia tidak dapat diperiksa dengan betul demi keselamatan.',
'uploadstash-badtoken' => 'Tindakan tadi tidak berjaya, mungkin kerana kelayakan menyunting anda telah luput. Cuba lagi.',
'uploadstash-errclear' => 'Gagal membersihkan fail-fail tersebut.',
'uploadstash-refresh' => 'Segarkan semula senarai fail',
+'invalid-chunk-offset' => 'Ofset ketulan tidak sah',
# img_auth script messages
'img-auth-accessdenied' => 'Capaian ditolak',
@@ -1781,24 +1825,25 @@ Penerangan pada [$2 laman penerangan failnya] di sana ditunjukkan di bawah.',
'filerevert-badversion' => 'Tiada versi tempatan bagi fail ini dengan cap waktu yang dinyatakan.',
# File deletion
-'filedelete' => 'Hapuskan $1',
-'filedelete-legend' => 'Hapuskan fail',
-'filedelete-intro' => "Anda sudah hendak menghapuskan fail '''[[Media:$1|$1]]''' berserta semua sejarahnya.",
-'filedelete-intro-old' => '<span class="plainlinks">Anda sedang menghapuskan versi \'\'\'[[Media:$1|$1]]\'\'\' pada [$4 $3, $2].</span>',
-'filedelete-comment' => 'Sebab:',
-'filedelete-submit' => 'Hapuskan',
-'filedelete-success' => "'''$1''' telah dihapuskan.",
-'filedelete-success-old' => "Versi '''[[Media:$1|$1]]''' pada $3, $2 telah dihapuskan.",
-'filedelete-nofile' => "'''$1''' tidak wujud.",
-'filedelete-nofile-old' => "Tiada versi arkib bagi '''$1''' dengan sifat-sifat yang dinyatakan.",
-'filedelete-otherreason' => 'Sebab lain/tambahan:',
-'filedelete-reason-otherlist' => 'Sebab lain',
-'filedelete-reason-dropdown' => '
+'filedelete' => 'Hapuskan $1',
+'filedelete-legend' => 'Hapuskan fail',
+'filedelete-intro' => "Anda sudah hendak menghapuskan fail '''[[Media:$1|$1]]''' berserta semua sejarahnya.",
+'filedelete-intro-old' => '<span class="plainlinks">Anda sedang menghapuskan versi \'\'\'[[Media:$1|$1]]\'\'\' pada [$4 $3, $2].</span>',
+'filedelete-comment' => 'Sebab:',
+'filedelete-submit' => 'Hapuskan',
+'filedelete-success' => "'''$1''' telah dihapuskan.",
+'filedelete-success-old' => "Versi '''[[Media:$1|$1]]''' pada $3, $2 telah dihapuskan.",
+'filedelete-nofile' => "'''$1''' tidak wujud.",
+'filedelete-nofile-old' => "Tiada versi arkib bagi '''$1''' dengan sifat-sifat yang dinyatakan.",
+'filedelete-otherreason' => 'Sebab lain/tambahan:',
+'filedelete-reason-otherlist' => 'Sebab lain',
+'filedelete-reason-dropdown' => '
*Sebab-sebab lazim
** Melanggar hak cipta
** Fail berulang',
-'filedelete-edit-reasonlist' => 'Ubah sebab-sebab hapus',
-'filedelete-maintenance' => 'Ciri penghapusan dan pemulihan fail telah dilumpuhkan buat sementara sepanjang proses penyenggaraan.',
+'filedelete-edit-reasonlist' => 'Ubah sebab-sebab hapus',
+'filedelete-maintenance' => 'Ciri penghapusan dan pemulihan fail telah dilumpuhkan buat sementara sepanjang proses penyenggaraan.',
+'filedelete-maintenance-title' => 'Fail tidak boleh dihapuskan',
# MIME search
'mimesearch' => 'Carian MIME',
@@ -1892,6 +1937,8 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
'wantedpages' => 'Laman dikehendaki',
'wantedpages-badtitle' => 'Tajuk tidak sah dalam set keputusan: $1',
'wantedfiles' => 'Fail dikehendaki',
+'wantedfiletext-cat' => 'Fail-fail yang berikut digunakan tetapi tidak wujud. Fail-fail dari repositori asing mungkin tersenarai walaupun wujud. Sebarang positif palsu sedemikian akan <del>dipotong</del>. Begitu juga, laman-laman yang terbenam fail-fail yang tidak wujud adalah tersenarai dalam [[:$1]].',
+'wantedfiletext-nocat' => 'Fail-fail yang berikut digunakan tetapi tidak wujud. Fail-fail dari repositori asing mungkin tersenarai walaupun wujud. Sebarang positif palsu sedemikian akan <del>dipotong</del>.',
'wantedtemplates' => 'Templat dikehendaki',
'mostlinked' => 'Laman dipaut terbanyak',
'mostlinkedcategories' => 'Kategori dipaut terbanyak',
@@ -1900,6 +1947,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
'mostimages' => 'Imej dipaut terbanyak',
'mostrevisions' => 'Rencana dengan semakan terbanyak',
'prefixindex' => 'Indeks awalan',
+'prefixindex-namespace' => 'Semua laman dengan awalan (ruang nama $1)',
'shortpages' => 'Laman pendek',
'longpages' => 'Laman panjang',
'deadendpages' => 'Laman buntu',
@@ -1916,7 +1964,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
'listusers-editsonly' => 'Hanya papar pengguna yang telah membuat suntingan',
'listusers-creationsort' => 'Susun mengikut tarikh penciptaan',
'usereditcount' => '$1 suntingan',
-'usercreated' => 'Dicipta pada $1, $2',
+'usercreated' => '{{GENDER:$3|Dibuat}} pada $1, $2',
'newpages' => 'Laman baru',
'newpages-username' => 'Nama pengguna:',
'ancientpages' => 'Laman lapuk',
@@ -2009,12 +2057,8 @@ Protokol yang disokong: <tt>$1</tt> (jangan bubuh sebarang protokol ini dalam ca
'activeusers-noresult' => 'Tiada pengguna dijumpai.',
# Special:Log/newusers
-'newuserlogpage' => 'Log akaun baru',
-'newuserlogpagetext' => 'Yang berikut ialah log penciptaan pengguna.',
-'newuserlog-byemail' => 'kata laluan dihantar melalui e-mel',
-'newuserlog-create-entry' => 'Pengguna baru',
-'newuserlog-create2-entry' => 'membuka akaun $1',
-'newuserlog-autocreate-entry' => 'Akaun dibuka secara automatik',
+'newuserlogpage' => 'Log akaun baru',
+'newuserlogpagetext' => 'Yang berikut ialah log penciptaan pengguna.',
# Special:ListGroupRights
'listgrouprights' => 'Hak kumpulan pengguna',
@@ -2046,7 +2090,7 @@ terlebih dahulu dan mempunyai alamat e-mel yang sah dalam
Alamat e-mel yang ditetapkan dalam [[Special:Preferences|keutamaan anda]] akan digunakan sebagai alamat "Daripada" dalam e-mel tersebut supaya si penerima boleh membalasnya.',
'usermailererror' => 'Objek Mail memulangkan ralat:',
-'defemailsubject' => 'E-mel {{SITENAME}}',
+'defemailsubject' => 'E-mel {{SITENAME}} daripada pengguna "$1"',
'usermaildisabled' => 'E-mel pengguna telah dilumpuhkan',
'usermaildisabledtext' => 'Anda tidak boleh mengirim e-mel kepada pengguna lain di wiki ini',
'noemailtitle' => 'Tiada alamat e-mel',
@@ -2104,7 +2148,7 @@ Jika anda mahu membuang laman tersebut daripada senarai pantau, klik \"Nyahpanta
'watchmethod-list' => 'menyemak suntingan terkini pada laman-laman yang dipantau',
'watchlistcontains' => 'Terdapat $1 laman dalam senarai pantau anda.',
'iteminvalidname' => "Terdapat masalah dengan item '$1', nama tidak sah...",
-'wlnote' => "Yang berikut ialah '''$1''' perubahan terakhir sejak '''$2''' jam yang lalu.",
+'wlnote' => "Berikut ialah {{PLURAL:$1|perubahan|'''$1''' perubahan}} yang terkini dalam {{PLURAL:$2|sejam|'''$2''' jam}} yang lalu, tepat pada $3, $4.",
'wlshowlast' => 'Tunjukkan $1 jam / $2 hari yang lalu / $3.',
'watchlist-options' => 'Pilihan senarai pantau',
@@ -2171,8 +2215,6 @@ akibatnya, dan perbuatan anda mematuhi [[{{MediaWiki:Policy-url}}|dasar kami]].'
'actionfailed' => 'Tindakan gagal',
'deletedtext' => '"$1" telah dihapuskan.
Sila lihat $2 untuk rekod penghapusan terkini.',
-'deletedarticle' => 'menghapuskan "[[$1]]"',
-'suppressedarticle' => 'menahan "[[$1]]"',
'dellogpage' => 'Log penghapusan',
'dellogpagetext' => 'Yang berikut ialah senarai penghapusan terkini.',
'deletionlog' => 'log penghapusan',
@@ -2217,7 +2259,10 @@ Lihat [[Special:ProtectedPages|senarai laman terlindung]] untuk senarai laman-la
'unprotectedarticle' => '"[[$1]]" digugurkan perlindungannya',
'movedarticleprotection' => 'memindahkan tetapan perlindungan dari "[[$2]]" ke "[[$1]]"',
'protect-title' => 'Ubah tahap perlindungan bagi "$1"',
+'protect-title-notallowed' => 'Lihat tahap perlindungan bagi "$1"',
'prot_1movedto2' => '[[$1]] dipindahkan ke [[$2]]',
+'protect-badnamespace-title' => 'Ruang nama yang tidak boleh dilindungi',
+'protect-badnamespace-text' => 'Laman-laman dalam ruang nama ini tidak boleh dilindungi.',
'protect-legend' => 'Sahkan perlindungan',
'protectcomment' => 'Sebab:',
'protectexpiry' => 'Sehingga:',
@@ -2238,6 +2283,7 @@ Ini adalah tetapan semasa bagi laman '''$1''':",
'protect-level-sysop' => 'Pentadbir sahaja',
'protect-summary-cascade' => 'melata',
'protect-expiring' => 'sehingga $1 (UTC)',
+'protect-expiring-local' => 'luput $1',
'protect-expiry-indefinite' => 'tak terbatas',
'protect-cascade' => 'Lindungi semua laman yang terkandung dalam laman ini (perlindungan melata)',
'protect-cantedit' => 'Anda tidak dibenarkan menukar peringkat perlindungan bagi laman ini.',
@@ -2296,7 +2342,6 @@ atau semakan tersebut telah dipulihkan atau dibuang daripada arkib.',
'undeletereset' => 'set semula',
'undeleteinvert' => 'Kecualikan pilihan',
'undeletecomment' => 'Sebab:',
-'undeletedarticle' => '"[[$1]]" telah dipulihkan',
'undeletedrevisions' => '$1 semakan dipulihkan',
'undeletedrevisions-files' => '$1 semakan dan $2 fail dipulihkan',
'undeletedfiles' => '$1 fail dipulihkan',
@@ -2305,6 +2350,7 @@ atau semakan tersebut telah dipulihkan atau dibuang daripada arkib.',
Sila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.",
'undelete-header' => 'Lihat [[Special:Log/delete|log penghapusan]] untuk laman-laman yang baru dihapuskan.',
+'undelete-search-title' => 'Cari laman yang dihapuskan',
'undelete-search-box' => 'Cari laman yang dihapuskan',
'undelete-search-prefix' => 'Tunjukkan laman bermula dengan:',
'undelete-search-submit' => 'Cari',
@@ -2313,6 +2359,7 @@ Sila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkin
'undelete-bad-store-key' => 'Semakan pada $1 tidak boleh dinyahhapuskan: fail telah hilang.',
'undelete-cleanup-error' => 'Ralat ketika menyahhhapuskan fail "$1" dalam arkib yang tidak digunakan.',
'undelete-missing-filearchive' => 'Arkib fail dengan ID $1 tidak dapat dipulihkan kerana tiada dalam pangkalan data. Ia mungkin telah pun dinyahhapuskan.',
+'undelete-error' => 'Ralat ketika menyahhapuskan laman',
'undelete-error-short' => 'Ralat ketika menyahhapuskan fail: $1',
'undelete-error-long' => 'Berlaku ralat ketika menyahhapuskan fail tersebut:
@@ -2435,6 +2482,7 @@ dirosakkan).',
'blocklist-userblocks' => 'Sorokkan sekatan akaun',
'blocklist-tempblocks' => 'Sorokkan sekatan sementara',
'blocklist-addressblocks' => 'Sorokkan sekatan IP tunggal',
+'blocklist-rangeblocks' => 'Sorokkan sekatan julat',
'blocklist-timestamp' => 'Cop masa',
'blocklist-target' => 'Sasaran',
'blocklist-expiry' => 'Luput',
@@ -2457,6 +2505,7 @@ dirosakkan).',
'unblocklink' => 'nyahsekat',
'change-blocklink' => 'ubah sekatan',
'contribslink' => 'sumb.',
+'emaillink' => 'hantar e-mel',
'autoblocker' => 'Disekat secara automatik kerana baru-baru ini alamat IP anda digunakan oleh "[[User:$1|$1]]". Sebab sekatan $1 ialah: "$2"',
'blocklogpage' => 'Log sekatan',
'blocklog-showlog' => 'Pengguna ini pernah disekat sebelum ini. Log sekatan disediakan di bawah sebagai rujukan:',
@@ -2580,9 +2629,6 @@ Sila pilih nama lain.',
'movepage-page-moved' => 'Laman $1 telah dipindahkan ke $2.',
'movepage-page-unmoved' => 'Laman $1 tidak dapat dipindahkan ke $2.',
'movepage-max-pages' => 'Jumlah maksimum $1 laman telah dipindahkan secara automatik.',
-'1movedto2' => '[[$1]] dipindahkan ke [[$2]]',
-'1movedto2_redir' => '[[$1]] dipindahkan ke [[$2]] menerusi pelencongan',
-'move-redirect-suppressed' => 'halang pelencongan',
'movelogpage' => 'Log pemindahan',
'movelogpagetext' => 'Yang berikut ialah senarai pemindahan laman.',
'movesubpage' => '{{PLURAL:$1|Sublaman|Sublaman}}',
@@ -2595,7 +2641,7 @@ Sila pilih nama lain.',
Laman destinasi "[[:$1]]" telah pun wujud. Adakah anda mahu menghapuskannya supaya laman ini dapat dipindahkan?',
'delete_and_move_confirm' => 'Ya, hapuskan laman ini',
-'delete_and_move_reason' => 'Dihapuskan supaya laman lain dapat dipindahkan',
+'delete_and_move_reason' => 'Dihapuskan untuk membuka laluan untuk pemindahan dari "[[$1]]"',
'selfmove' => 'Tajuk sumber dan tajuk destinasi tidak boleh sama.',
'immobile-source-namespace' => 'Anda tidak boleh memindahkan laman dari ruang nama "$1"',
'immobile-target-namespace' => 'Anda tidak boleh memindahkan mana-mana laman ke dalam ruang nama "$1"',
@@ -2624,9 +2670,11 @@ Fail ini boleh diimport ke dalam wiki lain yang menggunakan perisian MediaWiki m
Untuk mengeksport laman, masukkan tajuk dalam kotak teks di bawah (satu tajuk bagi setiap baris) dan pilih sama ada anda mahukan semua versi dan catatan sejarah atau hanya versi semasa berserta maklumat mengenai suntingan terakhir.
Dalam pilihan kedua tadi, anda juga boleh menggunakan pautan, umpamanya [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] untuk laman "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Eksport semua laman',
'exportcuronly' => 'Hanya eksport semakan semasa, bukan keseluruhan sejarah.',
'exportnohistory' => "----
'''Catatan:''' Ciri eksport sejarah penuh laman melalui borang ini telah dimatikan atas sebab-sebab prestasi.",
+'exportlistauthors' => 'Sertakan senarai penuh penyumbang untuk setiap laman',
'export-submit' => 'Eksport',
'export-addcattext' => 'Tambah laman daripada kategori:',
'export-addcat' => 'Tambahkan',
@@ -2659,6 +2707,8 @@ Sila lawat [//www.mediawiki.org/wiki/Localisation Penyetempatan MediaWiki] dan [
'thumbnail_error' => 'Berlaku ralat ketika mencipta gambar kenit: $1',
'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',
+'thumbnail-dest-create' => 'Gambar kenit tidak dapat disimpan dalam destinasi',
'thumbnail_invalid_params' => 'Parameter gambar kenit tidak sah',
'thumbnail_dest_directory' => 'Direktori destinasi gagal diwujudkan',
'thumbnail_image-type' => 'Jenis imej tidak disokong',
@@ -2703,6 +2753,11 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'import-upload' => 'Muat naik data XML',
'import-token-mismatch' => 'Data sesi telah hilang. Sila cuba lagi.',
'import-invalid-interwiki' => 'Wiki yang dinyatakan tidak boleh diimport.',
+'import-error-edit' => 'Laman "$1" tidak diimport kerana anda tidak dibenarkan untuk menyuntingnya.',
+'import-error-create' => 'Laman "$1" tidak diimport kerana anda tidak dibenarkan untuk menciptanya.',
+'import-error-interwiki' => 'Laman "$1" tidak diimport kerana namanya ditempah untuk pemautan luaran (antara wiki).',
+'import-error-special' => 'Laman "$1" tidak diimport kerana ia tergolong dalam ruang nama khas yang tidak membenarkan laman.',
+'import-error-invalid' => 'Laman "$1" tidak diimport kerana namanya tidak sah.',
# Import log
'importlogpage' => 'Log import',
@@ -2712,72 +2767,85 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'import-logentry-interwiki' => '$1 dipindahkan ke wiki lain',
'import-logentry-interwiki-detail' => '$1 semakan daripada $2',
+# JavaScriptTest
+'javascripttest' => 'Ujian JavaScript',
+'javascripttest-disabled' => 'Fungsi ini dimatikan.',
+'javascripttest-title' => 'Ujian $1 sedang dijalankan',
+'javascripttest-pagetext-noframework' => 'Laman ini ditempah untuk menjalankan ujian JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Kerangka "$1" tidak dikenali.',
+'javascripttest-pagetext-frameworks' => 'Sila pilih salah satu kerangka yang berikut: $1',
+'javascripttest-pagetext-skins' => 'Sila pilih satu kulit untuk menjalankan ujian:',
+'javascripttest-qunit-intro' => 'Rujuk [$1 dokumentasi ujian] di mediawiki.org.',
+'javascripttest-qunit-heading' => 'Suit ujian MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Laman pengguna anda',
-'tooltip-pt-anonuserpage' => 'Laman pengguna bagi alamat IP anda',
-'tooltip-pt-mytalk' => 'Laman perbualan anda',
-'tooltip-pt-anontalk' => 'Perbincangan mengenai penyuntingan daripada alamat IP anda',
-'tooltip-pt-preferences' => 'Keutamaan saya',
-'tooltip-pt-watchlist' => 'Senarai laman yang anda pantau',
-'tooltip-pt-mycontris' => 'Senarai sumbangan anda',
-'tooltip-pt-login' => 'Walaupun tidak wajib, anda digalakkan supaya log masuk.',
-'tooltip-pt-anonlogin' => 'Walaupun tidak wajib, anda digalakkan supaya log masuk.',
-'tooltip-pt-logout' => 'Log keluar',
-'tooltip-ca-talk' => 'Perbincangan mengenai laman kandungan',
-'tooltip-ca-edit' => "Anda boleh menyunting laman ini. Sila tekan butang 'pralihat' terlebih dahulu sebelum menyimpan.",
-'tooltip-ca-addsection' => 'Buka bahagian baru',
-'tooltip-ca-viewsource' => 'Laman ini dilindungi. Anda boleh melihat sumbernya.',
-'tooltip-ca-history' => 'Versi-versi terdahulu bagi laman ini.',
-'tooltip-ca-protect' => 'Lindungi laman ini',
-'tooltip-ca-unprotect' => 'Ubah tahap perlindungan laman ini',
-'tooltip-ca-delete' => 'Hapuskan laman ini',
-'tooltip-ca-undelete' => 'Balikkan suntingan yang dilakukan kepada laman ini sebelum ia dihapuskan',
-'tooltip-ca-move' => 'Pindahkan laman ini',
-'tooltip-ca-watch' => 'Tambahkan laman ini ke dalam senarai pantau anda',
-'tooltip-ca-unwatch' => 'Buang laman ini daripada senarai pantau anda',
-'tooltip-search' => 'Cari dalam {{SITENAME}}',
-'tooltip-search-go' => 'Pergi ke laman dengan nama tepat ini, jika ada',
-'tooltip-search-fulltext' => 'Cari laman dengan teks ini',
-'tooltip-p-logo' => 'Laman Utama',
-'tooltip-n-mainpage' => 'Kunjungi Laman Utama',
-'tooltip-n-mainpage-description' => 'Kunjungi laman utama',
-'tooltip-n-portal' => 'Maklumat mengenai projek ini',
-'tooltip-n-currentevents' => 'Cari maklumat latar belakang mengenai peristiwa semasa',
-'tooltip-n-recentchanges' => 'Senarai perubahan terkini dalam wiki ini.',
-'tooltip-n-randompage' => 'Buka laman rawak',
-'tooltip-n-help' => 'Tempat mencari jawapan.',
-'tooltip-t-whatlinkshere' => 'Senarai laman wiki yang mengandungi pautan ke laman ini',
-'tooltip-t-recentchangeslinked' => 'Perubahan terkini bagi semua laman yang dipaut dari laman ini',
-'tooltip-feed-rss' => 'Suapan RSS bagi laman ini',
-'tooltip-feed-atom' => 'Suapan Atom bagi laman ini',
-'tooltip-t-contributions' => 'Lihat senarai sumbangan pengguna ini',
-'tooltip-t-emailuser' => 'Kirim e-mel kepada pengguna ini',
-'tooltip-t-upload' => 'Muat naik imej atau fail media',
-'tooltip-t-specialpages' => 'Senarai laman khas',
-'tooltip-t-print' => 'Versi boleh cetak bagi laman ini',
-'tooltip-t-permalink' => 'Pautan kekal ke versi ini',
-'tooltip-ca-nstab-main' => 'Lihat laman kandungan',
-'tooltip-ca-nstab-user' => 'Lihat laman pengguna',
-'tooltip-ca-nstab-media' => 'Lihat laman media',
-'tooltip-ca-nstab-special' => 'Ini adalah sebuah laman khas, anda tidak boleh menyunting laman ini secara terus.',
-'tooltip-ca-nstab-project' => 'Lihat laman projek',
-'tooltip-ca-nstab-image' => 'Lihat laman imej',
-'tooltip-ca-nstab-mediawiki' => 'Lihat pesanan sistem',
-'tooltip-ca-nstab-template' => 'Lihat templat',
-'tooltip-ca-nstab-help' => 'Lihat laman bantuan',
-'tooltip-ca-nstab-category' => 'Lihat laman kategori',
-'tooltip-minoredit' => 'Tandakan sebagai suntingan kecil',
-'tooltip-save' => 'Simpan perubahan',
-'tooltip-preview' => 'Semak perubahan yang anda lakukan terlebih dahulu, kemudian sila tekan butang ini sebelum menyimpan!',
-'tooltip-diff' => 'Tunjukkan perubahan yang anda telah lakukan kepada teks ini.',
-'tooltip-compareselectedversions' => 'Lihat perbezaan antara dua versi laman ini yang dipilih.',
-'tooltip-watch' => 'Tambahkan laman ini ke dalam senarai pantau anda',
-'tooltip-recreate' => 'Cipta semula laman ini walaupun ia telah dihapuskan',
-'tooltip-upload' => 'Muat naik',
-'tooltip-rollback' => 'Balikkan semua suntingan oleh penyumbang terakhir pada laman ini dengan satu klik.',
-'tooltip-undo' => 'Balikkan suntingan ini dan buka borang sunting dalam mod pralihat. Sebab boleh dinyatakan dalam ruangan ringkasan.',
-'tooltip-preferences-save' => 'Simpan keutamaan',
-'tooltip-summary' => 'Masukkan ringkasan pendek',
+'tooltip-pt-userpage' => 'Laman pengguna anda',
+'tooltip-pt-anonuserpage' => 'Laman pengguna bagi alamat IP anda',
+'tooltip-pt-mytalk' => 'Laman perbualan anda',
+'tooltip-pt-anontalk' => 'Perbincangan mengenai penyuntingan daripada alamat IP anda',
+'tooltip-pt-preferences' => 'Keutamaan saya',
+'tooltip-pt-watchlist' => 'Senarai laman yang anda pantau',
+'tooltip-pt-mycontris' => 'Senarai sumbangan anda',
+'tooltip-pt-login' => 'Walaupun tidak wajib, anda digalakkan supaya log masuk.',
+'tooltip-pt-anonlogin' => 'Walaupun tidak wajib, anda digalakkan supaya log masuk.',
+'tooltip-pt-logout' => 'Log keluar',
+'tooltip-ca-talk' => 'Perbincangan mengenai laman kandungan',
+'tooltip-ca-edit' => "Anda boleh menyunting laman ini. Sila tekan butang 'pralihat' terlebih dahulu sebelum menyimpan.",
+'tooltip-ca-addsection' => 'Buka bahagian baru',
+'tooltip-ca-viewsource' => 'Laman ini dilindungi. Anda boleh melihat sumbernya.',
+'tooltip-ca-history' => 'Versi-versi terdahulu bagi laman ini.',
+'tooltip-ca-protect' => 'Lindungi laman ini',
+'tooltip-ca-unprotect' => 'Ubah tahap perlindungan laman ini',
+'tooltip-ca-delete' => 'Hapuskan laman ini',
+'tooltip-ca-undelete' => 'Balikkan suntingan yang dilakukan kepada laman ini sebelum ia dihapuskan',
+'tooltip-ca-move' => 'Pindahkan laman ini',
+'tooltip-ca-watch' => 'Tambahkan laman ini ke dalam senarai pantau anda',
+'tooltip-ca-unwatch' => 'Buang laman ini daripada senarai pantau anda',
+'tooltip-search' => 'Cari dalam {{SITENAME}}',
+'tooltip-search-go' => 'Pergi ke laman dengan nama tepat ini, jika ada',
+'tooltip-search-fulltext' => 'Cari laman dengan teks ini',
+'tooltip-p-logo' => 'Laman Utama',
+'tooltip-n-mainpage' => 'Kunjungi Laman Utama',
+'tooltip-n-mainpage-description' => 'Kunjungi laman utama',
+'tooltip-n-portal' => 'Maklumat mengenai projek ini',
+'tooltip-n-currentevents' => 'Cari maklumat latar belakang mengenai peristiwa semasa',
+'tooltip-n-recentchanges' => 'Senarai perubahan terkini dalam wiki ini.',
+'tooltip-n-randompage' => 'Buka laman rawak',
+'tooltip-n-help' => 'Tempat mencari jawapan.',
+'tooltip-t-whatlinkshere' => 'Senarai laman wiki yang mengandungi pautan ke laman ini',
+'tooltip-t-recentchangeslinked' => 'Perubahan terkini bagi semua laman yang dipaut dari laman ini',
+'tooltip-feed-rss' => 'Suapan RSS bagi laman ini',
+'tooltip-feed-atom' => 'Suapan Atom bagi laman ini',
+'tooltip-t-contributions' => 'Lihat senarai sumbangan pengguna ini',
+'tooltip-t-emailuser' => 'Kirim e-mel kepada pengguna ini',
+'tooltip-t-upload' => 'Muat naik imej atau fail media',
+'tooltip-t-specialpages' => 'Senarai laman khas',
+'tooltip-t-print' => 'Versi boleh cetak bagi laman ini',
+'tooltip-t-permalink' => 'Pautan kekal ke versi ini',
+'tooltip-ca-nstab-main' => 'Lihat laman kandungan',
+'tooltip-ca-nstab-user' => 'Lihat laman pengguna',
+'tooltip-ca-nstab-media' => 'Lihat laman media',
+'tooltip-ca-nstab-special' => 'Ini adalah sebuah laman khas, anda tidak boleh menyunting laman ini secara terus.',
+'tooltip-ca-nstab-project' => 'Lihat laman projek',
+'tooltip-ca-nstab-image' => 'Lihat laman imej',
+'tooltip-ca-nstab-mediawiki' => 'Lihat pesanan sistem',
+'tooltip-ca-nstab-template' => 'Lihat templat',
+'tooltip-ca-nstab-help' => 'Lihat laman bantuan',
+'tooltip-ca-nstab-category' => 'Lihat laman kategori',
+'tooltip-minoredit' => 'Tandakan sebagai suntingan kecil',
+'tooltip-save' => 'Simpan perubahan',
+'tooltip-preview' => 'Semak perubahan yang anda lakukan terlebih dahulu, kemudian sila tekan butang ini sebelum menyimpan!',
+'tooltip-diff' => 'Tunjukkan perubahan yang anda telah lakukan kepada teks ini.',
+'tooltip-compareselectedversions' => 'Lihat perbezaan antara dua versi laman ini yang dipilih.',
+'tooltip-watch' => 'Tambahkan laman ini ke dalam senarai pantau anda',
+'tooltip-watchlistedit-normal-submit' => 'Gugurkan tajuk-tajuk',
+'tooltip-watchlistedit-raw-submit' => 'Kemas kini senarai pantau',
+'tooltip-recreate' => 'Cipta semula laman ini walaupun ia telah dihapuskan',
+'tooltip-upload' => 'Muat naik',
+'tooltip-rollback' => 'Balikkan semua suntingan oleh penyumbang terakhir pada laman ini dengan satu klik.',
+'tooltip-undo' => 'Balikkan suntingan ini dan buka borang sunting dalam mod pralihat. Sebab boleh dinyatakan dalam ruangan ringkasan.',
+'tooltip-preferences-save' => 'Simpan keutamaan',
+'tooltip-summary' => 'Masukkan ringkasan pendek',
# Stylesheets
'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
@@ -2852,9 +2920,6 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
# Patrol log
'patrol-log-page' => 'Log pemeriksaan',
'patrol-log-header' => 'Yang berikut ialah log rondaan bagi semakan.',
-'patrol-log-line' => 'menandakan $1 bagi $2 sebagai telah diperiksa $3',
-'patrol-log-auto' => '(automatik)',
-'patrol-log-diff' => 's$1',
'log-show-hide-patrol' => '$1 log rondaan',
# Image deletion
@@ -2882,11 +2947,11 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
'file-info' => 'saiz file: $1, jenis MIME: $2',
'file-info-size' => '$1 × $2 piksel, saiz fail: $3, jenis MIME: $4',
'file-info-size-pages' => '$1 × $2 piksel, saiz fail: $3, jenis MIME: $4, $5 laman',
-'file-nohires' => '<small>Tiada leraian lebih besar.</small>',
+'file-nohires' => 'Tiada leraian lebih besar.',
'svg-long-desc' => 'Fail SVG, ukuran dasar $1 × $2 piksel, saiz fail: $3',
'show-big-image' => 'Leraian penuh',
-'show-big-image-preview' => '<small>Saiz pratonton ini: $1.</small>',
-'show-big-image-other' => '<small>Leraian lain: $1.</small>',
+'show-big-image-preview' => 'Saiz pralihat ini: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Leraian|Leraian-leraian}} lain: $1.',
'show-big-image-size' => '$1 × $2 piksel',
'file-info-gif-looped' => 'berulang',
'file-info-gif-frames' => '$1 bingkai',
@@ -2907,11 +2972,14 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
'sp-newimages-showfrom' => 'Tunjukkan imej baru bermula daripada $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 's',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'j',
-'days-abbrev' => 'h',
+'video-dims' => '$1, $2 × $3',
+'hours-abbrev' => '$1j',
+'days-abbrev' => '$1h',
+'seconds' => '$1 saat',
+'minutes' => '$1 minit',
+'hours' => '$1 jam',
+'days' => '$1 hari',
+'ago' => '$1 yang lalu',
# Bad image list
'bad_image_list' => 'Berikut adalah format yang digunakan:
@@ -3404,13 +3472,6 @@ Kod pengesahan ini akan luput pada $4.',
'scarytranscludefailed' => '[Gagal mendapatkan templat $1]',
'scarytranscludetoolong' => '[URL terlalu panjang]',
-# Trackbacks
-'trackbackbox' => 'Jejak balik bagi laman ini:<br />
-$1',
-'trackbackremove' => '([$1 Hapus])',
-'trackbacklink' => 'Jejak balik',
-'trackbackdeleteok' => 'Jejak balik dihapuskan.',
-
# Delete conflict
'deletedwhileediting' => "'''Amaran''': Laman ini dihapuskan ketika anda sedang menyuntingnya!",
'confirmrecreate' => "Pengguna [[User:$1|$1]] ([[User talk:$1|perbincangan]]) telah menghapuskan laman ini ketika anda sedang menyunting atas sebab berikut:
@@ -3504,6 +3565,9 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
'hijri-calendar-m11' => 'Zulkaedah',
'hijri-calendar-m12' => 'Zulhijah',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bincang]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tag penyambung "$1" tidak dikenali',
'duplicate-defaultsort' => '\'\'\'Amaran\'\'\': Kunci susunan asali "$2" membatalkan kunci susunan asali "$1" yang sebelumnya.',
@@ -3602,13 +3666,16 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'tags-hitcount' => '$1 perubahan',
# Special:ComparePages
-'comparepages' => 'Perbandingan laman',
-'compare-selector' => 'Bandingkan semakan laman',
-'compare-page1' => 'Laman 1',
-'compare-page2' => 'Laman 2',
-'compare-rev1' => 'Semakan 1',
-'compare-rev2' => 'Semakan 2',
-'compare-submit' => 'Bandingkan',
+'comparepages' => 'Perbandingan laman',
+'compare-selector' => 'Bandingkan semakan laman',
+'compare-page1' => 'Laman 1',
+'compare-page2' => 'Laman 2',
+'compare-rev1' => 'Semakan 1',
+'compare-rev2' => 'Semakan 2',
+'compare-submit' => 'Bandingkan',
+'compare-invalid-title' => 'Tajuk yang anda nyatakan tidak sah.',
+'compare-title-not-exists' => 'Tajuk yang anda nyatakan tidak wujud.',
+'compare-revision-not-exists' => 'Semakan yang anda nyatakan tidak wujud.',
# Database error messages
'dberr-header' => 'Wiki ini dilanda masalah',
@@ -3635,4 +3702,90 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'sqlite-has-fts' => '$1 dengan sokongan carian teks penuh',
'sqlite-no-fts' => '$1 tanpa sokongan carian teks penuh',
+# New logging system
+'logentry-delete-delete' => '$1 menghapuskan laman $3',
+'logentry-delete-restore' => '$1 memulihkan laman $3',
+'logentry-delete-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3: $4',
+'logentry-delete-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3: $4',
+'logentry-delete-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3',
+'logentry-delete-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3',
+'logentry-suppress-delete' => '$1 menyekat laman $3',
+'logentry-suppress-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3 secara rahsia: $4',
+'logentry-suppress-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3 secara rahsia: $4',
+'logentry-suppress-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3 secara rahsia',
+'logentry-suppress-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3 secara rahsia',
+'revdelete-content-hid' => 'kandungan tersorok',
+'revdelete-summary-hid' => 'ringkasan suntingan tersorok',
+'revdelete-uname-hid' => 'nama pengguna tersorok',
+'revdelete-content-unhid' => 'kandungan terdedah',
+'revdelete-summary-unhid' => 'ringkasan suntingan terdedah',
+'revdelete-uname-unhid' => 'nama pengguna terdedah',
+'revdelete-restricted' => 'mengenakan sekatan pada penyelia',
+'revdelete-unrestricted' => 'menarik sekatan daripada penyelia',
+'logentry-move-move' => '$1 memindahkan laman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 mengalihkan laman $3 ke $4 tanpa meninggalkan lencongan',
+'logentry-move-move_redir' => '$1 mengalihkan laman $3 ke $4 pada lencongan',
+'logentry-move-move_redir-noredirect' => '$1 mengalihkan laman $3 ke $4 pada satu lencongan tanpa meninggalkan lencongan',
+'logentry-patrol-patrol' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda',
+'logentry-patrol-patrol-auto' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda secara automatik',
+'logentry-newusers-newusers' => '$1 membuka akaun pengguna',
+'logentry-newusers-create' => '$1 membuka akaun pengguna',
+'logentry-newusers-create2' => '$1 membuka akaun pengguna $3',
+'logentry-newusers-autocreate' => 'Akaun $1 dibuka secara automatik',
+'newuserlog-byemail' => 'kata laluan dihantar melalui e-mel',
+
+# Feedback
+'feedback-bugornote' => 'Jika anda bersedia untuk menerangkan masalah teknikal secara terperinci, sila [$1 laporkan pepijat].
+Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dicatatkan pada laman "[$3 $2]", beserta nama pengguna anda dan pelayar yang anda gunakan.',
+'feedback-subject' => 'Perkara:',
+'feedback-message' => 'Pesanan:',
+'feedback-cancel' => 'Batalkan',
+'feedback-submit' => 'Hantar Maklum Balas',
+'feedback-adding' => 'Maklum balas sedang diisikan ke dalam laman...',
+'feedback-error1' => 'Perhatian: Hasil dari API tidak dikenali',
+'feedback-error2' => 'Perhatian: Penyuntingan gagal',
+'feedback-error3' => 'Perhatian: Tiada gerak balas dari API',
+'feedback-thanks' => 'Terima kasih! Maklum balas anda telah dicatatkan pada laman "[$2 $1]".',
+'feedback-close' => 'Siap',
+'feedback-bugcheck' => 'Bagus! Cuma pastikan itu bukan salah satu [$1 pepijat] yang sedia diketahui.',
+'feedback-bugnew' => 'Saya dah semak. Laporkan pepijat baru',
+
+# API errors
+'api-error-badaccess-groups' => 'Anda tidak dibenarkan memuat naik fail di wiki ini.',
+'api-error-badtoken' => 'Ralat dalaman: token tak elok.',
+'api-error-copyuploaddisabled' => 'Ciri memuat naik melalui URL dimatikan di pelayan ini.',
+'api-error-duplicate' => 'Di tapak ini sudah ada {{PLURAL:$1|[$2 satu fail lain]|[$2 fail-fail lain]}} yang sama kandungannya.',
+'api-error-duplicate-archive' => 'Di tapak ini pernah ada {{PLURAL:$1|[$2 satu fail lain]|[$2 fail-fail lain]}} yang sama kandungannya, tetapi telah dihapuskan.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Fail|Fail-fail}} pendua yang sudah dihapuskan',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Fail|Fail-fail}} pendua',
+'api-error-empty-file' => 'Fail yang anda serahkan adalah kosong.',
+'api-error-emptypage' => 'Anda tidak dibenarkan membuat laman baru yang kosong.',
+'api-error-fetchfileerror' => 'Ralat dalaman: ada malasah ketika mengambil fail itu.',
+'api-error-file-too-large' => 'Fail yang anda serahkan adalah terlalu besar.',
+'api-error-filename-tooshort' => 'Nama fail ini terlalu pendek.',
+'api-error-filetype-banned' => 'Fail jenis ini adalah dilarang.',
+'api-error-filetype-missing' => 'Fail ini tiada sambungannya.',
+'api-error-hookaborted' => 'Pengubahsuaian yang anda buat telah disekat oleh cangkuk sambungan.',
+'api-error-http' => 'Ralat dalaman: tidak dapat bersambung dengan pelayan.',
+'api-error-illegal-filename' => 'Nama fail ini tidak dibenarkan.',
+'api-error-internal-error' => 'Ralat dalaman: ada masalah ketika memproseskan muat naik anda di wiki ini.',
+'api-error-invalid-file-key' => 'Ralat dalaman: fail tidak dijumpai dalam storan sementara.',
+'api-error-missingparam' => 'Ralat dalaman: kekosongan parameter pada permohonan.',
+'api-error-missingresult' => 'Ralat dalaman: tidak dapat ditentukan sama ada penyalinan berjaya.',
+'api-error-mustbeloggedin' => 'Anda mesti log masuk untuk memuat naik fail.',
+'api-error-mustbeposted' => 'Ralat dalaman: permohonan memerlukan POST HTTP.',
+'api-error-noimageinfo' => 'Muat naik berjaya, tetapi pelayan tidak memberi kita sebarang maklumat tentang fail itu.',
+'api-error-nomodule' => 'Ralat dalaman: tiada modul muat naik yang ditetapkan.',
+'api-error-ok-but-empty' => 'Ralat dalaman: tiada gerak balas dari pelayan.',
+'api-error-overwrite' => 'Menulis ganti fail yang telah wujud adalah tidak dibenarkan.',
+'api-error-stashfailed' => 'Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.',
+'api-error-timeout' => 'Pelayan tidak bergerak balas dalam tempoh yang diharapkan.',
+'api-error-unclassified' => 'Berlakunya ralat yang tidak diketahui',
+'api-error-unknown-code' => 'Ralat tidak diketahui: "$1"',
+'api-error-unknown-error' => 'Ralat dalaman: ada masalah apabila cuba memuat naik fail anda.',
+'api-error-unknown-warning' => 'Amaran tidak diketahui: $1',
+'api-error-unknownerror' => 'Ralat tidak dikenali: "$1".',
+'api-error-uploaddisabled' => 'Ciri muat naik dimatikan di wiki ini.',
+'api-error-verification-error' => 'Fail ini mungkin tercemar atau tersalah sambungannya.',
+
);
diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php
index 454f19b5..04c6840c 100644
--- a/languages/messages/MessagesMt.php
+++ b/languages/messages/MessagesMt.php
@@ -53,20 +53,22 @@ $specialPageAliases = array(
'Allmessages' => array( 'MessaġġiKollha' ),
'Allpages' => array( 'PaġniKollha' ),
'Ancientpages' => array( 'PaġniQodma', 'PaġniAntiki' ),
+ 'Badtitle' => array( 'TitluĦażin' ),
'Blankpage' => array( 'PaġnaVojta' ),
'Block' => array( 'BlokkaIP' ),
'Blockme' => array( 'Imblukkani' ),
'Booksources' => array( 'SorsiKotba' ),
- 'BrokenRedirects' => array( 'RindirizziMiksura', 'RiindirizziMiksura' ),
+ 'BrokenRedirects' => array( 'RindirizziMiksura' ),
'Categories' => array( 'Kategoriji' ),
'ChangePassword' => array( 'BiddelPassword' ),
+ 'ComparePages' => array( 'IkkomparaPaġni' ),
'Confirmemail' => array( 'KonfermaPostaElettronika' ),
'Contributions' => array( 'Kontribuzzjonijiet' ),
'CreateAccount' => array( 'OħloqKont' ),
'Deadendpages' => array( 'PaġniWieqfa' ),
'DeletedContributions' => array( 'KontribuzzjonijietImħassra' ),
'Disambiguations' => array( 'Diżambigwazzjoni' ),
- 'DoubleRedirects' => array( 'RindirizziDoppji', 'RiindirizziDoppji' ),
+ 'DoubleRedirects' => array( 'RindirizziDoppji' ),
'Emailuser' => array( 'IbgħatUtent' ),
'Export' => array( 'Esporta' ),
'Fewestrevisions' => array( 'L-InqasReviżjonijiet' ),
@@ -80,7 +82,7 @@ $specialPageAliases = array(
'Listbots' => array( 'ListaBots' ),
'Listfiles' => array( 'ListaStampi', 'ListaFajls' ),
'Listgrouprights' => array( 'ListaDrittijietGruppi' ),
- 'Listredirects' => array( 'ListaRindirizzi', 'ListaRiindirizzi' ),
+ 'Listredirects' => array( 'ListaRindirizzi' ),
'Listusers' => array( 'Utenti', 'ListaUtenti' ),
'Lockdb' => array( 'AgħlaqDB' ),
'Log' => array( 'Reġistru', 'Reġistri' ),
@@ -140,133 +142,133 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#RINDIRIZZA', '#REDIRECT' ),
- 'notoc' => array( '0', '__EBDAWERREJ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__EBDAGALLERIJA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__SFORZAWERREJ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__WERREJ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__EBDASEZZJONIMODIFIKA__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'XAHARKURRENTI', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ISEMXAHARKURRENTI', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'Ä ENISEMXAHARKURRENTI', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ABBREVXAHARKURRENTI', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'Ä URNATAKURRENTI', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'Ä URNATAKURRENTI2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ISEMÄ URNATAKURRENTI', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'SENAKURRENTI', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ĦINKURRENTI', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'SIEGĦAKURRENTI', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'XAHARLOKALI', 'XAHARLOKALI2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'XAHARLOKALI1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ISEMXAHARLOKALI', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'Ä ENISEMXAHARLOKALI', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ABBREVXAHARLOKALI', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'Ä URNATALOKALI', 'LOCALDAY' ),
- 'localday2' => array( '1', 'Ä URNATALOKALI2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ISEMTAL-Ä URNATALOKALI', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'SENALOKALI', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ĦINLOKALI', 'LOCALTIME' ),
- 'localhour' => array( '1', 'SIEGĦALOKALI', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMRUTA\'PAÄ NI', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMRUTA\'ARTIKLI', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMRUTA\'FAJLS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMRUTA\'UTENTI', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NUMRUTA\'UTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NUMBRUTA\'MODIFIKI', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NUMRUTA\'VISTI', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ISEMTAL-PAÄ NA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ISEMTAL-PAÄ NAE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'SPAZJUTAL-ISEM', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'SPAZJUTAL-ISEME', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'SPAZJUTA\'DISKUSSJONI', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'SPAZJUTA\'DISKUSSJONIE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'SPAZJUTAS-SUÄ Ä ETT', 'SPAZJUTAL-ARTIKLU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'fullpagename' => array( '1', 'ISEMSĦIĦTAL-PAĠNA', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ISEMTAL-PAĠNASĦIĦAE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ISEMTAS-SOTTOPAÄ NA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ISEMTAS-SUBPAÄ NAE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ISEMBAŻIKUTAL-PAĠNA', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ISEMTAL-PAĠNATAL-BAŻIE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ISEMPAÄ NATA\'DISKUSSJONI', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ISEMTAL-PAÄ NATAD-DISKUSSJONIE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ISEMTAS-SUÄ Ä ETTTAL-PAÄ NA', 'ISEMTAL-ARTIKLUTAL-PAÄ NA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ISEMTAS-SUÄ Ä ETTTAL-PAÄ NAE', 'ISEMTAL-ARTIKLUTAL-PAÄ NAE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'MSÄ :', 'MSG:' ),
- 'subst' => array( '0', 'BIDDEL:', 'SUBST:' ),
- 'msgnw' => array( '0', 'MSÄ EW:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'daqsminuri', 'minuri', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'daqsminuri=$1', 'minuri=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'lemin', 'right' ),
- 'img_left' => array( '1', 'xellug', 'left' ),
- 'img_none' => array( '1', 'xejn', 'none' ),
- 'img_center' => array( '1', 'nofs', 'Ä‹entrali', 'Ä‹entru', 'center', 'centre' ),
- 'img_framed' => array( '1', 'tilat', 'b\'tilar', 'tilar', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bla_tilar', 'frameless' ),
- 'img_page' => array( '1', 'paġna=$1', 'paġna $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'wieqaf', 'wieqaf=$1', 'wieqaf $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'bordura', 'burdura', 'border' ),
- 'img_baseline' => array( '1', 'bażi_tal-linja', 'baseline' ),
- 'img_sub' => array( '1', 'bid', 'sub' ),
- 'img_super' => array( '1', 'tajjeb', 'super', 'sup' ),
- 'img_top' => array( '1', 'fuq', 'top' ),
- 'img_text_top' => array( '1', 'test-fuq', 'text-top' ),
- 'img_bottom' => array( '1', 'taħt', 'bottom' ),
- 'img_text_bottom' => array( '1', 'test-taħt', 'text-bottom' ),
- 'img_link' => array( '1', 'ħolqa=$1', 'link=$1' ),
- 'sitename' => array( '1', 'ISEMTAS-SIT', 'SITENAME' ),
- 'ns' => array( '0', 'IS:', 'NS:' ),
- 'localurl' => array( '0', 'URLLOKALI:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLLOKALIE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'ISEMTAS-SERVER', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'DESTINAZZJONITA\'SKRITT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMMATIKA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'SESS:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__EBDAKONVERTURTITLU__', '__EBDAKT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__EBDAKONVERTURKONTENUT__', '__EBDAKK__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ĠIMGĦAKURRENTI', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'Ä TÄ KURRENTI', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ĠIMGĦALOKALI', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'Ä TÄ LOKALI', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDTAR-REVIŻJONI', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ĠURNATATAR-REVIŻJONI', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ĠURNATATAR-REVIŻJONI2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'XAHARTAR-REVIŻJONI', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'SENATAR-REVIŻJONI', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'TIMBRUTAR-REVIŻJONI', 'REVISIONTIMESTAMP' ),
- 'fullurl' => array( '0', 'URLSĦIĦA:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLSĦIĦAE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'IBDAKÅ»:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'IBDAKK:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KÅ»:', 'LC:' ),
- 'uc' => array( '0', 'KK:', 'UC:' ),
- 'displaytitle' => array( '1', 'URITITLU', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__ĦOLQASEZZJONIĠDIDA__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__EBDAĦOLQASEZZJONIĠDIDA__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERŻJONIKURRENTI', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLKODIÄŠI:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ANKRAKODIÄŠI', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'TIMBRUTAL-ĦINKURRENTI', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'TIMBRUTAL-ĦINLOKALI', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'MARKATAD-DIREZZJONI', 'MARKADIRE', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#LINGWA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'LINGWATAL-KONTENUT', 'LINGKONTENUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAÄ NIFL-ISPAZJUTAL-ISEM:', 'PAÄ NISI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NUMRUTA\'AMMIN', 'NUMBEROFADMINS' ),
- 'padleft' => array( '0', 'PADXELLUG', 'PADLEFT' ),
- 'padright' => array( '0', 'PADLEMIN', 'PADRIGHT' ),
- 'special' => array( '0', 'speċjali', 'special' ),
- 'defaultsort' => array( '1', 'DEFAULTSORTJA:', 'DEFAULTSORTJAÄŠAVETTA:', 'DEFAULTKATEGORIJISORTJA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'DESTINAZZJONITAL-FAJL:', 'FILEPATH:' ),
- 'tag' => array( '0', 'tabella', 'tag' ),
- 'hiddencat' => array( '1', '__KATMOĦBIJA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAÄ NIFIL-KATEGORIJA', 'PAÄ NIFILK', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'DAQSTAL-PAÄ NI', 'PAGESIZE' ),
- 'index' => array( '1', '__INDIÄŠI__', '__INDEX__' ),
- 'noindex' => array( '1', '__EBDAINDIÄŠI__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NUMRUFIL-GRUPP', 'NUMFIL-GRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__RIINDIRIZZSTATIKU__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'LIVELLITA\'PROTEZZJONI', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#RINDIRIZZA', '#REDIRECT' ),
+ 'notoc' => array( '0', '__EBDAWERREJ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__EBDAGALLERIJA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__SFORZAWERREJ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__WERREJ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__EBDASEZZJONIMODIFIKA__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'XAHARKURRENTI', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ISEMXAHARKURRENTI', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'Ä ENISEMXAHARKURRENTI', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ABBREVXAHARKURRENTI', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'Ä URNATAKURRENTI', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'Ä URNATAKURRENTI2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ISEMÄ URNATAKURRENTI', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'SENAKURRENTI', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ĦINKURRENTI', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'SIEGĦAKURRENTI', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'XAHARLOKALI', 'XAHARLOKALI2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'XAHARLOKALI1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ISEMXAHARLOKALI', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'Ä ENISEMXAHARLOKALI', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ABBREVXAHARLOKALI', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'Ä URNATALOKALI', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'Ä URNATALOKALI2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ISEMTAL-Ä URNATALOKALI', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'SENALOKALI', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ĦINLOKALI', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'SIEGĦALOKALI', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMRUTA\'PAÄ NI', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMRUTA\'ARTIKLI', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMRUTA\'FAJLS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMRUTA\'UTENTI', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NUMRUTA\'UTENTIATTIVI', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NUMBRUTA\'MODIFIKI', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NUMRUTA\'VISTI', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ISEMTAL-PAÄ NA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ISEMTAL-PAÄ NAE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'SPAZJUTAL-ISEM', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'SPAZJUTAL-ISEME', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'SPAZJUTA\'DISKUSSJONI', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'SPAZJUTA\'DISKUSSJONIE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'SPAZJUTAS-SUÄ Ä ETT', 'SPAZJUTAL-ARTIKLU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'fullpagename' => array( '1', 'ISEMSĦIĦTAL-PAĠNA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ISEMTAL-PAĠNASĦIĦAE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ISEMTAS-SOTTOPAÄ NA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ISEMTAS-SUBPAÄ NAE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ISEMBAŻIKUTAL-PAĠNA', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ISEMTAL-PAĠNATAL-BAŻIE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ISEMPAÄ NATA\'DISKUSSJONI', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ISEMTAL-PAÄ NATAD-DISKUSSJONIE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ISEMTAS-SUÄ Ä ETTTAL-PAÄ NA', 'ISEMTAL-ARTIKLUTAL-PAÄ NA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ISEMTAS-SUÄ Ä ETTTAL-PAÄ NAE', 'ISEMTAL-ARTIKLUTAL-PAÄ NAE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'MSÄ :', 'MSG:' ),
+ 'subst' => array( '0', 'BIDDEL:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'MSÄ EW:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'daqsminuri', 'minuri', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'daqsminuri=$1', 'minuri=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'lemin', 'right' ),
+ 'img_left' => array( '1', 'xellug', 'left' ),
+ 'img_none' => array( '1', 'xejn', 'none' ),
+ 'img_center' => array( '1', 'nofs', 'Ä‹entrali', 'Ä‹entru', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'tilat', 'b\'tilar', 'tilar', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bla_tilar', 'frameless' ),
+ 'img_page' => array( '1', 'paġna=$1', 'paġna $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'wieqaf', 'wieqaf=$1', 'wieqaf $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'bordura', 'burdura', 'border' ),
+ 'img_baseline' => array( '1', 'bażi_tal-linja', 'baseline' ),
+ 'img_sub' => array( '1', 'bid', 'sub' ),
+ 'img_super' => array( '1', 'tajjeb', 'super', 'sup' ),
+ 'img_top' => array( '1', 'fuq', 'top' ),
+ 'img_text_top' => array( '1', 'test-fuq', 'text-top' ),
+ 'img_bottom' => array( '1', 'taħt', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'test-taħt', 'text-bottom' ),
+ 'img_link' => array( '1', 'ħolqa=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'ISEMTAS-SIT', 'SITENAME' ),
+ 'ns' => array( '0', 'IS:', 'NS:' ),
+ 'localurl' => array( '0', 'URLLOKALI:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLLOKALIE:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'ISEMTAS-SERVER', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'DESTINAZZJONITA\'SKRITT', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMMATIKA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SESS:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__EBDAKONVERTURTITLU__', '__EBDAKT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__EBDAKONVERTURKONTENUT__', '__EBDAKK__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ĠIMGĦAKURRENTI', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'Ä TÄ KURRENTI', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ĠIMGĦALOKALI', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'Ä TÄ LOKALI', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDTAR-REVIŻJONI', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ĠURNATATAR-REVIŻJONI', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ĠURNATATAR-REVIŻJONI2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'XAHARTAR-REVIŻJONI', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'SENATAR-REVIŻJONI', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'TIMBRUTAR-REVIŻJONI', 'REVISIONTIMESTAMP' ),
+ 'fullurl' => array( '0', 'URLSĦIĦA:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLSĦIĦAE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'IBDAKÅ»:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'IBDAKK:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KÅ»:', 'LC:' ),
+ 'uc' => array( '0', 'KK:', 'UC:' ),
+ 'displaytitle' => array( '1', 'URITITLU', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__ĦOLQASEZZJONIĠDIDA__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__EBDAĦOLQASEZZJONIĠDIDA__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERŻJONIKURRENTI', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLKODIÄŠI:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ANKRAKODIÄŠI', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'TIMBRUTAL-ĦINKURRENTI', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'TIMBRUTAL-ĦINLOKALI', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'MARKATAD-DIREZZJONI', 'MARKADIRE', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#LINGWA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'LINGWATAL-KONTENUT', 'LINGKONTENUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAÄ NIFL-ISPAZJUTAL-ISEM:', 'PAÄ NISI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NUMRUTA\'AMMIN', 'NUMBEROFADMINS' ),
+ 'padleft' => array( '0', 'PADXELLUG', 'PADLEFT' ),
+ 'padright' => array( '0', 'PADLEMIN', 'PADRIGHT' ),
+ 'special' => array( '0', 'speċjali', 'special' ),
+ 'defaultsort' => array( '1', 'DEFAULTSORTJA:', 'DEFAULTSORTJAÄŠAVETTA:', 'DEFAULTKATEGORIJISORTJA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'DESTINAZZJONITAL-FAJL:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'tabella', 'tag' ),
+ 'hiddencat' => array( '1', '__KATMOĦBIJA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAÄ NIFIL-KATEGORIJA', 'PAÄ NIFILK', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'DAQSTAL-PAÄ NI', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDIÄŠI__', '__INDEX__' ),
+ 'noindex' => array( '1', '__EBDAINDIÄŠI__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NUMRUFIL-GRUPP', 'NUMFIL-GRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__RIINDIRIZZSTATIKU__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'LIVELLITA\'PROTEZZJONI', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
);
$messages = array(
@@ -627,21 +629,23 @@ Jekk din mhix ir-raġuni, wisq probabli sibt problema fis-software. Jekk jogħġ
'badarticleerror' => 'Din l-azzjoni ma setgħetx isseħħ fuq din il-paġna.',
'cannotdelete' => 'Il-paġna jew il-fajl "$1" ma jistax jiġi mħassar.
Jista\' jkun li diġà ġie mħassar minn xi ħaddieħor.',
+'cannotdelete-title' => 'Il-paġna "$1" ma setgħetx titħassar',
'badtitle' => 'Titlu ħażin',
'badtitletext' => "It-titlu tal-paġna rikjesta huwa invalidu, vojt, jew ġej minn żball fil-ħolqa bejn siti wiki differenti jew verżjonijiet ta' lingwi differenti tal-istess sit. Jista' wkoll ikollu wieħed jew aktar karattri li ma jistgħux jintużaw għat-titli.",
-'perfcached' => "L-informazzjoni li jmiss huwa kopja ''cache'' u jista' ma jkunx aġġornat.",
-'perfcachedts' => "Id-dati segwenti huma estratt ta' kopja cache tad-database. L-aħħar aġġornament: $1.",
+'perfcached' => "L-informazzjoni li jmiss huwa kopja ''cache'' u jista' ma jkunx aġġornat. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "Id-dati segwenti huma estratt ta' kopja cache tad-database. L-aħħar aġġornament: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Aġġornamenti għal din il-paġna huma temporalment sospesi. L-Informazzjoni hawnhekk preżentament mhux qiegħed jiġi aġġornat.',
'wrong_wfQuery_params' => 'Parametri skoretti għal wfQuery()<br />
Funżjoni: $1<br />
Rikjesta: $2',
'viewsource' => 'Ara s-sors',
-'viewsourcefor' => 'għal $1',
+'viewsource-title' => "Ara s-sors ta' $1",
'actionthrottled' => 'Azzjoni miżmuma',
'actionthrottledtext' => "Bħala miżura għal kontra l-ispam, inti limitat li tagħmel din l-azzjoni għal ħafna drabi f'spazju ta' ħin żgħir, u inti qbiżt dan il-limitu.
Jekk jogħġbok erġa' prova fi ftit minuti oħra.",
'protectedpagetext' => "Din il-paġna ġiet protetta sabiex twaqqaf kull tip ta' modifika.",
'viewsourcetext' => "Tista' tara u tikkopja s-sors ta' din il-paġna:",
+'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)',
@@ -738,6 +742,7 @@ Bħala riżultat, il-viżitaturi li jużaw dan l-IP ma jistgħux għall-mument,
'emailconfirmlink' => 'Ikkonferma l-indirizz tal-posta elettronika tiegħek',
'invalidemailaddress' => 'L-indirizz tal-posta elettronika ma jistax jiġi aċċettat għax jidher li għandu format ħażin.
Jekk jogħġbok daħħal indirizz validu jew inkella ħassru.',
+'cannotchangeemail' => 'L-indirizzi elettroniċi ma jistgħux jiġu mibdula fuq din il-wiki.',
'accountcreated' => 'Il-kont inħoloq',
'accountcreatedtext' => 'Inħoloq kont tal-utent għal $1.',
'createaccount-title' => 'Ħolqien tal-kont għal {{SITENAME}}',
@@ -754,6 +759,7 @@ Jekk jogħġbok stenna qabel ma terġa' tipprova.",
# E-mail sending
'php-mail-error-unknown' => 'Żball mhux magħruf fil-funzjoni mail() tal-PHP.',
+'user-mail-no-addy' => 'Pruvajt tibgħat posta elettronika mingħajr indirizz.',
# Change password dialog
'resetpass' => 'Biddel il-password',
@@ -775,28 +781,43 @@ Jista' jkun li int diġà biddilt il-password, jew għamilt rikjesta għal passw
'resetpass-temp-password' => 'Password temporanja:',
# 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-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-email' => 'Indirizz elettroniku:',
-'passwordreset-emailtitle' => 'Dettalji tal-kont fuq {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Xi ħadd (probabilment int, mill-indirizz IP $1) għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). {{PLURAL:$3|L-utent assoċjat|L-utenti assoċjati}} ma' dan l-indirizz elettroniku huma:
+'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-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ġġ?',
+'passwordreset-capture-help' => 'Jekk tagħżel din il-kaxxa, l-indirizz elettroniku (bil-password temporanja) se jiġi muri lilek barra milli jintbagħat lill-utent.',
+'passwordreset-email' => 'Indirizz elettroniku:',
+'passwordreset-emailtitle' => 'Dettalji tal-kont fuq {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Xi ħadd (probabilment int, mill-indirizz IP $1) għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). {{PLURAL:$3|L-utent assoċjat|L-utenti assoċjati}} ma' dan l-indirizz elettroniku huma:
$2
{{PLURAL:$3|Din il-password temporanja se tiskadi|Dawn il-passwords temporanji se jiskadu}} fi żmien {{PLURAL:$5|ġurnata|$5 jum}}. Inti għadek tidħol fil-kont tiegħek u tagħżel password ġdida issa. Jekk xi ħadd ieħor għamel din ir-rikjesta, jew jekk ftakart il-password oriġinali, u m'għadikx trid tbiddilha, inti tista' tinjora dan il-messaġġ u tibqa' tuża' l-password il-qadima.",
-'passwordreset-emailtext-user' => "L-utent $1 fuq {{SITENAME}} għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). {{PLURAL:$3|L-utent assoċjat|L-utenti assoċjati}} ma' dan l-indirizz elettroniku huma:
+'passwordreset-emailtext-user' => "L-utent $1 fuq {{SITENAME}} għamel rikjesta sabiex jingħata password ġdida sabiex jaċċessa l-{{SITENAME}} ($4). {{PLURAL:$3|L-utent assoċjat|L-utenti assoċjati}} ma' dan l-indirizz elettroniku huma:
$2
{{PLURAL:$3|Din il-password temporanja se tiskadi|Dawn il-passwords temporanji se jiskadu}} fi żmien {{PLURAL:$5|ġurnata|$5 jum}}. Inti għadek tidħol fil-kont tiegħek u tagħżel password ġdida issa. Jekk xi ħadd ieħor għamel din ir-rikjesta, jew jekk ftakart il-password oriġinali, u m'għadikx trid tbiddilha, inti tista' tinjora dan il-messaġġ u tibqa' tuża' l-password il-qadima.",
-'passwordreset-emailelement' => 'Isem tal-utent: $1
+'passwordreset-emailelement' => 'Isem tal-utent: $1
Password temporanja: $2',
-'passwordreset-emailsent' => 'Intbagħtet ittra-e bħala tfakkira.',
+'passwordreset-emailsent' => 'Intbagħtet ittra-e bħala tfakkira.',
+'passwordreset-emailsent-capture' => 'Intbagħtet ittra-e bħala tfakkira, bil-kontenut jidher hawn taħt.',
+'passwordreset-emailerror-capture' => "Ġiet ġenerata ittra-e ta' tfakkira, li l-kontenut tagħha jidher hawn taħt. Madanakollu, il-posta ma ntbagħtitx lill-utent: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Biddel l-indirizz elettroniku',
+'changeemail-header' => 'Biddel l-indirizz elettroniku tal-kont',
+'changeemail-text' => 'Kompli din il-formola sabiex tbiddel l-indirizz elettroniku. Trid iddaħħal il-password biex tikkonferma din il-bidla.',
+'changeemail-no-info' => 'Trid tkun dħalt fil-kont tiegħek sabiex taċċessa direttament din il-paġna.',
+'changeemail-oldemail' => 'Indirizz elettroniku attwali:',
+'changeemail-newemail' => 'Indirizz elettroniku Ä¡did:',
+'changeemail-none' => '(xejn)',
+'changeemail-submit' => 'Biddel l-indirizz elettroniku',
+'changeemail-cancel' => 'Annulla',
# Edit page toolbar
'bold_sample' => 'Tipa ħoxna',
@@ -868,9 +889,6 @@ Għandek tkun taf li ma tistax tuża l-faċilità ta' \"ibgħat email lil dan l-
L-IP kurrenti tiegħek huwa \$3, u l-ID ta' l-imblukkar huwa #\$5.<br />
Jekk jogħġbok inkludi mqar wieħed minn dawn it-tnejn f'kwalunkwe rikjesta.",
'blockednoreason' => 'ma ingħatat l-ebda raġuni',
-'blockedoriginalsource' => "Is-sors tal-paġna '''$1''' jinsab hawn taħt:",
-'blockededitsource' => "It-test tal-'''modifiki tiegħek''' f' '''$1''' jinstab hawn taħt:",
-'whitelistedittitle' => "Trid tidħol sabiex tkun tista' timmodifika l-paġna",
'whitelistedittext' => "Int trid $1 biex tkun tista' timodifika l-paġni.",
'confirmedittext' => "Jinħtieġ li tikkonferma l-indirizz tal-e-mail tiegħek sabiex tkun tista' timmodifika l-paġni.
Jekk jogħġbok, issettja u kkonferma l-indirizz tal-e-mail tiegħek mill-[[Special:Preferences|preferenzi tal-utent]].",
@@ -1118,8 +1136,6 @@ L-amminstraturi l-oħrajn fuq {{SITENAME}} xorta jkunu jistgħu jidħlu fuq il-k
'revdelete-unsuppress' => 'Neħħi limiti fuq reviżjonijiet irkuprati',
'revdelete-log' => 'Raġuni:',
'revdelete-submit' => 'Applika lir-{{PLURAL:$1|reviżjoni magħżulha|reviżjonijiet magħżula}}',
-'revdelete-logentry' => "Il-Visibilitá tar-reviżjoni ta' [[$1]] inbidlet",
-'logdelete-logentry' => "Il-Visibilitá tal-avveniment ta' $1 inbidlet",
'revdelete-success' => "'''Il-viżibilità tar-reviżjoni ġiet aġġornata b'suċċess.'''",
'revdelete-failure' => "'''Il-viżibilità tar-reviżjoni ma tistax tiġi aġġornata:'''
$1",
@@ -1131,15 +1147,6 @@ $1",
'revdel-restore-visible' => 'reviżjonijiet viżibbli',
'pagehist' => 'Kronoloġija tal-paġna',
'deletedhist' => 'Kronoloġija mħassra',
-'revdelete-content' => 'kontenut',
-'revdelete-summary' => 'Taqsira tal-modifika',
-'revdelete-uname' => 'isem tal-utent',
-'revdelete-restricted' => "limiti applikati 'l amministraturi",
-'revdelete-unrestricted' => "neħħi l-limiti 'l amministraturi",
-'revdelete-hid' => 'aħbi $1',
-'revdelete-unhid' => 'uri $1',
-'revdelete-log-message' => '$1 għal $2 {{PLURAL:$2|revision|reviżjoni}}',
-'logdelete-log-message' => '$1 għal $2 {{PLURAL:$2|event|avvenimenti}}',
'revdelete-hide-current' => 'L-oġġett bid-data $1 $2 ma jistax jinħeba minħabba li huwa r-reviżjoni attwali.',
'revdelete-show-no-access' => 'L-oġġett bid-data $1 $2 ma jistax jintwera: dan l-oġġett huwa mmarkat bħala "ristrett" u int m\'għandekx aċċess għalih.',
'revdelete-modify-no-access' => 'L-oġġett bid-data $1 $2 ma jistax jiġi modifikat: dan l-oġġett huwa mmarkat bħala "ristrett" u int m\'għandekx aċċess għalih.',
@@ -1296,11 +1303,13 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
'prefs-rc' => 'Modifiki riċenti',
'prefs-watchlist' => 'Osservazzjoni speċjali',
'prefs-watchlist-days' => "Numru ta' ġranet li għandu jintwera fil-osservazzjoni speċjali:",
-'prefs-watchlist-days-max' => "Massimu ta' 7 Ä¡ranet",
+'prefs-watchlist-days-max' => "Massimu ta' $1 {{PLURAL:$1|Ä¡urnata|Ä¡ranet}}",
'prefs-watchlist-edits' => "Numru ta' modifiki li tista' turi bil-funżjoni avvanzata:",
'prefs-watchlist-edits-max' => 'Numru massimu: 1000',
'prefs-misc' => 'Varji',
'prefs-resetpass' => 'Biddel il-password',
+'prefs-changeemail' => 'Biddel l-indirizz elettroniku',
+'prefs-setemail' => 'Issettja indirizz elettroniku',
'prefs-email' => 'Opzjonijiet għall-posta elettronika',
'prefs-rendering' => 'Dehra',
'saveprefs' => 'Salva l-preferenzi',
@@ -1360,6 +1369,7 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'yourrealname' => 'Isem proprju:',
'yourlanguage' => 'Lingwa:',
'yourvariant' => 'Varjant tal-lingwa:',
+'prefs-help-variant' => 'Il-varjant jew l-ortografija li tippreferixxi li jidhru l-paġni tal-wiki.',
'yournick' => 'Firma:',
'prefs-help-signature' => "Kummenti fuq il-paġni ta' diskussjoni jridu jiġu ffirmati b'permezz ta' \"<nowiki>~~~~</nowiki>\" li jiġu maqluba għall-firma tiegħek u d-data.",
'badsig' => 'Il-firma mhux standard, hija invalida; iċċekkja t-tags tal-HTML.',
@@ -1398,7 +1408,7 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'userrights-lookup-user' => 'Ä estjoni tal-gruppi tal-utent',
'userrights-user-editname' => 'Daħħal isem tal-utent:',
'editusergroup' => 'Immodifika l-gruppi tal-utent',
-'editinguser' => "Modifika tad-drittijiet tal-utent '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modifika tad-drittijiet tal-utent '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Immodifika l-gruppi tal-utent',
'saveusergroups' => 'Salva l-gruppi tal-utent',
'userrights-groupsmember' => "Membru ta':",
@@ -1492,13 +1502,13 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'right-autopatrol' => 'Marka awtomatikament il-modifiki tiegħek bħalha verifikati',
'right-patrolmarks' => "Uża l-funzjoni ta' verifika tat-tibdil riċenti",
'right-unwatchedpages' => "Uri lista ta' paġni mhux osservati",
-'right-trackback' => "Ibgħat ''trackback''",
'right-mergehistory' => 'Agħqqad il-kronoloġija tal-paġni',
'right-userrights' => 'Modifika d-drittijiet tal-utenti kollha',
'right-userrights-interwiki' => "Modifika d-drittijiet tal-utenti ta' wiki oħrajn",
'right-siteadmin' => 'Agħlaq u iftaħ id-database',
'right-override-export-depth' => "Jesporta paġni li jinkludu paġni b'ħoloq sa fond ta' 5",
'right-sendemail' => 'Jibgħat ittri-e lil utenti oħra',
+'right-passwordreset' => 'Jara l-messaġġi tal-impostazzjoni mill-ġdid tal-password',
# User rights log
'rightslog' => 'Drittijiet tal-utenti',
@@ -1537,11 +1547,11 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'action-patrol' => "timmarka l-modifiki ta' utenti oħrajn bħala verifikati",
'action-autopatrol' => 'timmarka l-modifiki tiegħek stess bħala verifikati',
'action-unwatchedpages' => "uri l-lista ta' paġni li mhumiex osservati",
-'action-trackback' => "tibgħat ''trackback''",
'action-mergehistory' => "waħħad il-kronoloġija ta' din il-paġna",
'action-userrights' => 'timmodifika d-drittijiet kollha tal-utenti',
'action-userrights-interwiki' => 'timmodifika d-drittijiet tal-utenti fuq wikis oħra',
'action-siteadmin' => 'timblokka jew tiżblokka d-databażi',
+'action-sendemail' => 'ibgħat l-ittri-e',
# Recent changes
'nchanges' => '{{PLURAL:$1|modifika $1 |$1 modifiki}}',
@@ -1990,7 +2000,7 @@ Kull filliera għandha ħolqa għall-ewwel u t-tieni riindirizz, kif ukoll fejn
'listusers-editsonly' => 'Uri biss utenti li għamlu xi modifika',
'listusers-creationsort' => 'Irranġa l-lista skont id-data tal-ħolqien tal-kont',
'usereditcount' => '$1 {{PLURAL:$1|kontribuzzjonijiet|kontribuzzjoni}}',
-'usercreated' => 'Maħluq nhar il-$1 fil-$2',
+'usercreated' => '{{GENDER:$3|Maħluq}} nhar il-$1 fil-$2',
'newpages' => 'Paġni ġodda',
'newpages-username' => 'Isem tal-utent:',
'ancientpages' => 'L-iktar paġni qodma',
@@ -2082,12 +2092,8 @@ Protokolli aċċettati: <tt>$1</tt>',
'activeusers-noresult' => 'L-ebda utent ma nstab.',
# Special:Log/newusers
-'newuserlogpage' => 'Utenti Ä¡odda',
-'newuserlogpagetext' => "Dan hu reġistru tal-kreazzjoni ta' kontijiet ġodda.",
-'newuserlog-byemail' => "il-password intbagħtet permezz ta' posta elettronika",
-'newuserlog-create-entry' => 'Utent Ä¡did',
-'newuserlog-create2-entry' => 'irreġistra l-isem tal-utent ġdid $1',
-'newuserlog-autocreate-entry' => 'Kont maħluq awtomatikament',
+'newuserlogpage' => 'Utenti Ä¡odda',
+'newuserlogpagetext' => "Dan hu reġistru tal-kreazzjoni ta' kontijiet ġodda.",
# Special:ListGroupRights
'listgrouprights' => 'Drittijiet tal-grupp tal-utenti',
@@ -2115,7 +2121,7 @@ Jista' jkun hemm [[{{MediaWiki:Listgrouprights-helppage}}|aktar informazzjoni]]
'emailpage' => 'Ibgħat messaġġ lil dan l-utent bil-posta elettronika',
'emailpagetext' => "Huwa possibbli li tuża' l-formola t'hawn taħt biex tibgħat posta elettronika għal dan l-utent. L-indirizz li daħħalt fil-[[Special:Preferences|preferenzi]] jidher fl-ispazju \"Minn:\" tal-messaġġ, biex dak li jirċievi l-messaġġ ikun jista' jagħtik risposta.",
'usermailererror' => 'L-oġġett tal-posta ta l-problema:',
-'defemailsubject' => 'Messaġġ minn {{SITENAME}}',
+'defemailsubject' => 'Messaġ minn {{SITENAME}} mingħand l-utent "$1"',
'usermaildisabled' => 'Il-posta elettronika tal-utent mhux attivata',
'usermaildisabledtext' => 'Ma tistax tibgħat posta elettronika lil utenti oħrajn fuq din il-wiki',
'noemailtitle' => 'L-Ebda indirizz tal-posta elettronika',
@@ -2171,7 +2177,7 @@ Jekk f'xi ħin tkun tixtieq tneħħi l-paġna mil-lista ta' osservazzjoni tiegħ
'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}}.",
'iteminvalidname' => "Problema bil-paġna'$1', l-isem mhux validu...",
-'wlnote' => "Hawn taħt hawn {{PLURAL:$1|l-aħħar modifika|l-aħħar '''$1''' modifiki}} fl-aħħar {{PLURAL:$2|siegħa|'''$2''' siegħat}}.",
+'wlnote' => "Hawn taħt hawn {{PLURAL:$1|l-aħħar modifika|l-aħħar '''$1''' modifiki}} fl-aħħar {{PLURAL:$2|siegħa|'''$2''' siegħat}}, sal-$3, fil-$4.",
'wlshowlast' => 'Uri l-aħħar $1 siegħat $2 ġranet $3',
'watchlist-options' => "Opzjonijiet tal-lista ta' osservazzjoni",
@@ -2234,8 +2240,6 @@ Biex tgħaddi l-kummenti tiegħek u biex tikseb aktar għajnuna:
'actionfailed' => 'Azzjoni fallita',
'deletedtext' => 'Il-paġna "$1" ġiet imħassra.
Ikkonsulta r-$2 biex tara paġni li ġew imħassra riċentament.',
-'deletedarticle' => 'ħassar "[[$1]]"',
-'suppressedarticle' => 'Neħħi "[[$1]]"',
'dellogpage' => 'Tħassir',
'dellogpagetext' => 'Hawn taħt hawn lista tal-paġni li ġew imħassra riċentament.',
'deletionlog' => 'reġistru tat-tħassir',
@@ -2300,6 +2304,7 @@ Il-Preferenzi kurrenti ta' din il-paġni huma '''$1''':",
'protect-level-sysop' => 'Amministraturi biss',
'protect-summary-cascade' => 'rikorsiv',
'protect-expiring' => 'jiskadi $1 (UTC)',
+'protect-expiring-local' => 'tiskadi fil-$1',
'protect-expiry-indefinite' => 'indefinit',
'protect-cascade' => "Protezzjoni rikorsiva (testendi l-protezzjoni 'l paġni kollha inklużi f'din il-paġna).",
'protect-cantedit' => "Ma tistax timodifika l-livelli ta' protezzjoni ta' din il-paġna, għax int m'għandhekx il-permessi neċessarji.",
@@ -2357,7 +2362,6 @@ Int jista' jkollhok link ħażin, jew jista' jkun li ir-reviżjoni ġie rkuprat
'undeletereset' => 'Irrisettja',
'undeleteinvert' => 'Inverti s-selezzjoni',
'undeletecomment' => 'Raġuni:',
-'undeletedarticle' => 'Ä¡ie irkuprat "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|reviżjoni irkuprata|$1 reviżjonijiet irkuprati}}',
'undeletedrevisions-files' => '{{PLURAL:$1|reviżjoni waħda|$1 reviżjonijiet}} u {{PLURAL:$2|fajl wieħed irkuprat|$2 fajls irkuprati}}',
'undeletedfiles' => '{{PLURAL:$1|file wieħed|$1 fajls}} irkuprati',
@@ -2367,6 +2371,7 @@ jista' jkun li xi ħadd ieħor irkupra l-paġna qabel.",
Ikkonsulta r-[[Special:Log/delete|reġistru tat-tħassir]] biex tara t-tħassir u l-irkuprar ta' paġni l-aktar riċenti.",
'undelete-header' => 'Ara r-[[Special:Log/delete|reġistru tat-tħassir]] għal paġni mħassra riċentament.',
+'undelete-search-title' => 'Fittex paġni mħassra',
'undelete-search-box' => 'Fittex paġni mħassra',
'undelete-search-prefix' => "Uri l-paġni li t-titlu jibda' bl-ittri:",
'undelete-search-submit' => 'Fittex',
@@ -2376,6 +2381,7 @@ Ikkonsulta r-[[Special:Log/delete|reġistru tat-tħassir]] biex tara t-tħassir
'undelete-cleanup-error' => 'Problema fit-tħassir ta\' fajl "$1" tal-arkivju li mhux użat.',
'undelete-missing-filearchive' => "Impossibli tirkupra l-fajl tal-arkivju b'ID $1 minħabba li mhux qiegħed fid-database.
Jista' jkun li Ä¡a Ä¡ie rkuprat.",
+'undelete-error' => 'Żball fl-irkuprar tal-paġna',
'undelete-error-short' => 'Problema fl-irkuprar tal-fajl: $1',
'undelete-error-long' => 'Kien hemm problemi waqt il-fajl kien qiegħed jiġi rkuprat:
@@ -2497,6 +2503,7 @@ Ara l-[[Special:BlockList|lista tal-IP imblukkati]] biex tara l-blokki attivi.',
'blocklist-userblocks' => 'Aħbi blokki tal-kontijiet',
'blocklist-tempblocks' => 'Aħbi blokki temporanji',
'blocklist-addressblocks' => 'Aħbi blokki waħdanija tal-IP',
+'blocklist-rangeblocks' => "Aħbi blokki ta' firxiet",
'blocklist-timestamp' => 'Data u ħin',
'blocklist-target' => 'Destinazzjoni',
'blocklist-expiry' => 'Skadenza',
@@ -2519,6 +2526,7 @@ Ara l-[[Special:BlockList|lista tal-IP imblukkati]] biex tara l-blokki attivi.',
'unblocklink' => 'żblokka',
'change-blocklink' => 'biddel il-blokk',
'contribslink' => 'kontributi',
+'emaillink' => 'ibgħat ittra-e',
'autoblocker' => 'Blokkat awtomatikament minħabba li l-indirizz tal-IP ġie użat mill-utent "[[User:$1|$1]]". Ir-Raġuni li ġiet mogħtija għall-imblokk ta\' $1 kienet: "$2":',
'blocklogpage' => 'Blokki',
'blocklog-showlog' => 'Dan l-utent ġie imblukkat qabel. Ir-reġistru tal-blokki jinsab hawn taħt bħala referenza:',
@@ -2634,9 +2642,6 @@ Jekk jogħġbok, waħħad iż-żewġ paġni manwalment.'''",
'movepage-page-moved' => 'Il-Paġna $1 ġiet imċaqilqa għal $2.',
'movepage-page-unmoved' => 'Il-Paġna $1 ma setgħatx tiġi mċaqilqa għal $2.',
'movepage-max-pages' => "Ġie mċaqlaq in-numru massimu ta' {{PLURAL:$1|paġna u ma jistax jiġi mċaqlaq aktar awtomatikament|$1 paġni u ma jistgħux jiġu mċaqilqa aktar awtomatikament.}}",
-'1movedto2' => '[[$1]] tmexxa lejn [[$2]]',
-'1movedto2_redir' => "[[$1]] tmexxa lejn [[$2]] permezz ta' riindirizzament",
-'move-redirect-suppressed' => 'rindirizz mrażżan',
'movelogpage' => "Reġistru tat-tmexxija ta' paġni",
'movelogpagetext' => "Hawn taħt jinsab lista ta' paġni mċaqilqa.",
'movesubpage' => '{{PLURAL:$1|Sottopaġna|Sottopaġna}}',
@@ -2649,7 +2654,7 @@ Jekk jogħġbok, waħħad iż-żewġ paġni manwalment.'''",
Il-Paġna tad-destinazzjoni "[[:$1]]" ġa teżisti.
Trid tħassara sabiex tkun tista\' tagħmel triq għal ċaqlieqa?',
'delete_and_move_confirm' => 'Iva, ħassar il-paġna',
-'delete_and_move_reason' => 'Imħassra sabiex tagħmel triq għal ċaqlieqa',
+'delete_and_move_reason' => 'Imħassra sabiex isseħħ it-tmexxija minn "[[$1]]"',
'selfmove' => 'It-Titli tas-sors u destinazzjoni huma l-istess;
ma tistax iċaqlaq paġna fuqha nnifsa.',
'immobile-source-namespace' => 'Mhuwiex possibbli li tmexxi paġni fl-ispazju tal-isem "$1"',
@@ -2681,6 +2686,7 @@ Fl-aħħar każ inti tista' tuża ħolqa, per eżempju
'exportcuronly' => 'Inkludi biss reviżjonijiet kurrenti, mhux kronoloġiji sħaħ',
'exportnohistory' => "----
'''Nota:''' L-Esportazzjoni tal-kronoloġija kollha tal-paġni min-naħa waħda għall-oħra din l-''interface'' ġiet disattivata għar-raġunijiet marbutin tal-għemil.",
+'exportlistauthors' => "Inkludi lista sħiħa ta' kontributuri għal kull paġna",
'export-submit' => 'Esporta',
'export-addcattext' => 'Żied paġni mill-kategorija:',
'export-addcat' => 'Żied',
@@ -2712,6 +2718,8 @@ Fl-aħħar każ inti tista' tuża ħolqa, per eżempju
'thumbnail_error' => "Problema fil-ħolqien ta' ''thumbnail'': $1",
'djvu_page_error' => 'Numru tal-paġna DjVu bla klassifika',
'djvu_no_xml' => 'Impossibli ġġib il-XML għal fajl DjVu',
+'thumbnail-temp-create' => 'Huwa impossibbli li jinħoloq fajl temporanju għall-minjatura',
+'thumbnail-dest-create' => 'Huwa impossibbli li l-minjatura tiġi salvata fid-destinazzjoni',
'thumbnail_invalid_params' => 'Parametri invalidi għall-minjatura',
'thumbnail_dest_directory' => 'Impossibli toħloq id-direttorju tad-destinazzjoni',
'thumbnail_image-type' => "Tip ta' stampa mhux aċċettat",
@@ -2755,6 +2763,8 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
'import-upload' => "Tella' data XML",
'import-token-mismatch' => "Telfien tad-dati tas-sessjoni. Jekk jogħġbok erġa' pprova.",
'import-invalid-interwiki' => 'Ma jistax jiġi importat mill-wiki indikata.',
+'import-error-edit' => 'Il-paġna "$1" ma ġietx impurtata minħabba li mintix awtorizzat li timmodifikaha.',
+'import-error-create' => 'Il-paġna "$1" ma ġietx impurtata minħabba li mintix awtorizzat li toħloqha.',
# Import log
'importlogpage' => 'Importazzjoni',
@@ -2913,9 +2923,6 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
# Patrol log
'patrol-log-page' => 'Modifiki verifikati',
'patrol-log-header' => "Dan huwa reġistru ta' reviżjonijiet verifikati.",
-'patrol-log-line' => 'immarka r-$1 tal-paġna $2 bħala verifikata $3',
-'patrol-log-auto' => '(verifika awtomatika)',
-'patrol-log-diff' => 'reviżjoni $1',
'log-show-hide-patrol' => '$1 r-reġistru tal-modifiki verifikati',
# Image deletion
@@ -2934,22 +2941,24 @@ $1',
'nextdiff' => 'Id-differenza suċċessiva →',
# Media information
-'mediawarning' => "'''Twissija''': Dan il-fajl jista' jinkludi ġo fih kodiċi malizzjuż. L-eżekuzzjoni tiegħu jista' jagħmel ħsara s-sistema informatika tiegħek.",
-'imagemaxsize' => "Daqs massimu tal-istampa:<br />''(għall-paġni ta' deskrizzjoni tal-fajl)''",
-'thumbsize' => 'Daqs tal-minjatura:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|paġna|paġni}}',
-'file-info' => "Dimensjoni: $1, tip ta' MIME: $2",
-'file-info-size' => "$1 × $2 pixel, dimensjoni: $3, tip ta' MIME: $4",
-'file-info-size-pages' => '$1 × $2 pixels, daqs tal-fajl: $3, tip MIME: $4, $5 {{PLURAL:$5|paġna|paġni}}',
-'file-nohires' => "<small>Mhux disponibli verżjonijiet b'risoluzzjoni akbar.</small>",
-'svg-long-desc' => 'Fajl fil-format SVG, dimensjoni nominali $1 × $2 pixel, dimensjoni tal-fajl: $3',
-'show-big-image' => "Verżjoni b'risoluzzjoni sħiħa",
-'show-big-image-size' => '$1 × $2 pixels',
-'file-info-gif-looped' => 'Ä‹iklika',
-'file-info-gif-frames' => '{{PLURAL:$1|frejm wieħed|$1 frejms}}',
-'file-info-png-looped' => 'Ä‹iklika',
-'file-info-png-repeat' => 'ripetuta {{PLURAL:$1|darba|$1 darbiet}}',
-'file-info-png-frames' => '{{PLURAL:$1|frejm wieħed|$1 frejms}}',
+'mediawarning' => "'''Twissija''': Dan il-fajl jista' jinkludi ġo fih kodiċi malizzjuż. L-eżekuzzjoni tiegħu jista' jagħmel ħsara s-sistema informatika tiegħek.",
+'imagemaxsize' => "Daqs massimu tal-istampa:<br />''(għall-paġni ta' deskrizzjoni tal-fajl)''",
+'thumbsize' => 'Daqs tal-minjatura:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|paġna|paġni}}',
+'file-info' => "Dimensjoni: $1, tip ta' MIME: $2",
+'file-info-size' => "$1 × $2 pixel, dimensjoni: $3, tip ta' MIME: $4",
+'file-info-size-pages' => '$1 × $2 pixels, daqs tal-fajl: $3, tip MIME: $4, $5 {{PLURAL:$5|paġna|paġni}}',
+'file-nohires' => "Mhux disponibli verżjonijiet b'risoluzzjoni akbar.",
+'svg-long-desc' => 'Fajl fil-format SVG, dimensjoni nominali $1 × $2 pixel, dimensjoni tal-fajl: $3',
+'show-big-image' => "Verżjoni b'risoluzzjoni sħiħa",
+'show-big-image-preview' => 'Daqs tad-dehra proviżorja: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Riżoluzzjoni|Riżoluzzjonijiet}} oħra: $1',
+'show-big-image-size' => '$1 × $2 pixels',
+'file-info-gif-looped' => 'Ä‹iklika',
+'file-info-gif-frames' => '{{PLURAL:$1|frejm wieħed|$1 frejms}}',
+'file-info-png-looped' => 'Ä‹iklika',
+'file-info-png-repeat' => 'ripetuta {{PLURAL:$1|darba|$1 darbiet}}',
+'file-info-png-frames' => '{{PLURAL:$1|frejm wieħed|$1 frejms}}',
# Special:NewFiles
'newimages' => "Gallerija ta' fajls Ä¡odda",
@@ -2964,7 +2973,12 @@ $1',
'sp-newimages-showfrom' => "Uri l-fajls l-aktar riċenti mill-ħin $2 ta' $1",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'S',
+'hours-abbrev' => '$1S',
+'seconds' => '{{PLURAL:$1|sekonda|$1 sekondi}}',
+'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuti}}',
+'hours' => '{{PLURAL:$1|siegħa|$1 sigħat}}',
+'days' => '{{PLURAL:$1|Ä¡urnata|$1 Ä¡ranet}}',
+'ago' => '$1 ilu',
# Bad image list
'bad_image_list' => "Il-format huwa kif imiss:
@@ -3450,13 +3464,6 @@ Dan il-kodiċi ta\' konferma se jiskadi fil-$4.',
'scarytranscludefailed' => '[Problema: Impossibli Ä¡Ä¡ib il-mudell $1]',
'scarytranscludetoolong' => '[Problema: URL wisq twil]',
-# Trackbacks
-'trackbackbox' => 'Informazzjoni tat-Trackbacks għal din il-paġna:<br />
-$1',
-'trackbackremove' => '([$1 Ħassar])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => "Informazzjoni ta' trackback imħassar tajjeb.",
-
# Delete conflict
'deletedwhileediting' => "'''Twissija''': Din il-paġna ġiet imħassra wara li int bdejt timmodifikaha!",
'confirmrecreate' => "L-Utent [[User:$1|$1]] ([[User talk:$1|diskussjoni]]) ħassar din il-paġna wara li bdejt tagħmel il-modifiki bir-raġuni:
@@ -3658,13 +3665,16 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
'tags-hitcount' => '$1 {{PLURAL:$1|bidla|bidliet}}',
# Special:ComparePages
-'comparepages' => 'Qabbel il-paġni',
-'compare-selector' => "Ikkumpara reviżjonijiet ta' paġna",
-'compare-page1' => 'Paġna 1',
-'compare-page2' => 'Paġna 2',
-'compare-rev1' => 'Reviżjoni 1',
-'compare-rev2' => 'Reviżjoni 2',
-'compare-submit' => 'Qabbel',
+'comparepages' => 'Qabbel il-paġni',
+'compare-selector' => "Ikkumpara reviżjonijiet ta' paġna",
+'compare-page1' => 'Paġna 1',
+'compare-page2' => 'Paġna 2',
+'compare-rev1' => 'Reviżjoni 1',
+'compare-rev2' => 'Reviżjoni 2',
+'compare-submit' => 'Qabbel',
+'compare-invalid-title' => 'It-titlu li speċifikajt huwa invalidu.',
+'compare-title-not-exists' => 'It-titlu li speċifikajt huwa ma jeżistix.',
+'compare-revision-not-exists' => 'Ir-reviżjoni li speċifikajt ma teżistix.',
# Database error messages
'dberr-header' => 'Din il-wiki għandha problema',
@@ -3691,4 +3701,26 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
'sqlite-has-fts' => "$1 bil-possibilità ta' tfittxija kompluta fit-test",
'sqlite-no-fts' => "$1 mingħajr il-possibilità ta' tfittxija kompluta fit-test",
+# New logging system
+'revdelete-restricted' => "limiti applikati 'l amministraturi",
+'revdelete-unrestricted' => "neħħi l-limiti 'l amministraturi",
+'logentry-move-move' => '$1 mexxa l-paġna $3 għal $4',
+'logentry-move-move-noredirect' => '$1 mexxa l-paġna $3 għal $4 mingħajr ma ħalla rindirizz',
+'logentry-move-move_redir' => '$1 mexxa l-paġna $3 għal $4 fuq rindrizz',
+'logentry-move-move_redir-noredirect' => '$1 mexxa l-paġna $3 għal $4 fuq rindirizz mingħajr ma ħalla rindirizz',
+'newuserlog-byemail' => "il-password intbagħtet permezz ta' posta elettronika",
+
+# Feedback
+'feedback-subject' => 'Suġġett:',
+'feedback-message' => 'Messaġġ:',
+'feedback-cancel' => 'Annulla',
+'feedback-submit' => 'Ibgħat r-rispons',
+'feedback-error1' => 'Żball: Riżultat mhux rikonoxxut mill-API',
+'feedback-error2' => 'Żball: Modifika mhux esegwita',
+'feedback-error3' => 'Żball: L-ebda risposta mill-API',
+'feedback-thanks' => 'Grazzi! Ir-rispons tiegħek ġie ippubblikat fuq il-paġna "[$2 $1]".',
+'feedback-close' => 'Lest',
+'feedback-bugcheck' => 'Tajjeb ħafna! Ivverifika li mhux diġà fost id-[$1 difetti magħrufa].',
+'feedback-bugnew' => 'Ikkontrollajt. Irrapporta d-difett',
+
);
diff --git a/languages/messages/MessagesMwl.php b/languages/messages/MessagesMwl.php
index d9941a40..eff2234b 100644
--- a/languages/messages/MessagesMwl.php
+++ b/languages/messages/MessagesMwl.php
@@ -64,17 +64,17 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ANCAMINAR', '#REDIRECIONAMENTO', '#REDIRECT' ),
- 'img_right' => array( '1', 'dreita', 'direita', 'right' ),
- 'img_left' => array( '1', 'squierda', 'esquerda', 'left' ),
- 'img_none' => array( '1', 'nanhun', 'nenhum', 'none' ),
- 'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_middle' => array( '1', 'meio', 'middle' ),
- 'language' => array( '0', '#LHENGUA:', '#IDIOMA:', '#LANGUAGE:' ),
- 'filepath' => array( '0', 'CAMINOFEXEIRO:', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
- 'tag' => array( '0', 'eitiqueta', 'tag' ),
- 'pagesize' => array( '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
- 'staticredirect' => array( '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
+ 'redirect' => array( '0', '#ANCAMINAR', '#REDIRECIONAMENTO', '#REDIRECT' ),
+ 'img_right' => array( '1', 'dreita', 'direita', 'right' ),
+ 'img_left' => array( '1', 'squierda', 'esquerda', 'left' ),
+ 'img_none' => array( '1', 'nanhun', 'nenhum', 'none' ),
+ 'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_middle' => array( '1', 'meio', 'middle' ),
+ 'language' => array( '0', '#LHENGUA:', '#IDIOMA:', '#LANGUAGE:' ),
+ 'filepath' => array( '0', 'CAMINOFEXEIRO:', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
+ 'tag' => array( '0', 'eitiqueta', 'tag' ),
+ 'pagesize' => array( '1', 'TAMANHOFEXEIRO', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
+ 'staticredirect' => array( '1', '_ANCAMINARSTATICO_', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
);
$messages = array(
@@ -360,7 +360,6 @@ Por fabor, diç esto a un [[Special:ListUsers/sysop|admenistrador]], dezindo la
'badtitletext' => 'La páigina que pediste ye ambálida, bazia, ó ua lhigaçon mal feita dun títalo antre-lhéngua ó antre-biqui.
Puode tener un ó mais carateres que nun puoden ser outelizados an títalos.',
'viewsource' => 'Ber código',
-'viewsourcefor' => 'pa $1',
'actionthrottled' => 'Acion lhemitada',
'viewsourcetext' => 'Tu puodes ber i copiar l código desta páigina:',
@@ -529,10 +528,8 @@ Legenda: (atu) = defrénças de la berson atual,
'history-feed-item-nocomment' => '$1 a $2',
# Revision deletion
-'rev-delundel' => 'amostrar/scunder',
-'revdel-restore' => 'Demudar besiblidade',
-'revdelete-content' => 'cuntenido',
-'revdelete-uname' => 'nome de outelizador',
+'rev-delundel' => 'amostrar/scunder',
+'revdel-restore' => 'Demudar besiblidade',
# History merging
'mergehistory-submit' => 'Misturar eidiçones',
@@ -854,8 +851,7 @@ Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an
'listusers-submit' => 'Amostrar',
# Special:Log/newusers
-'newuserlogpage' => 'Registro de criaçon de outelizadores',
-'newuserlog-create-entry' => 'Nuobo outelizador',
+'newuserlogpage' => 'Registro de criaçon de outelizadores',
# Special:ListGroupRights
'listgrouprights-rights' => 'Dreitos',
@@ -896,7 +892,6 @@ Por fabor, bei se ye esso que quieres fazer, que antendes las cunsequéncias i s
'actioncomplete' => 'Acion acabada',
'deletedtext' => '"$1" fue elhiminada.
Consulte $2 para um registo de eliminações recentes.',
-'deletedarticle' => 'botado pa la rue "[[$1]]"',
'dellogpage' => 'Registro de botado fuora',
'deletecomment' => 'Rezon:',
'deleteotherreason' => 'Rezon adicional:',
@@ -936,9 +931,8 @@ Esta ye la cunfiguraçon atual pa la páigina '''$1''':",
'restriction-move' => 'Arrastrar',
# Undelete
-'undeletebtn' => 'Recuperar',
-'undeletelink' => 'ber/restourar',
-'undeletedarticle' => 'restourado "[[$1]]"',
+'undeletebtn' => 'Recuperar',
+'undeletelink' => 'ber/restourar',
# Namespace form on various pages
'namespace' => 'Spácio de nomes:',
@@ -1020,8 +1014,6 @@ Por fabor, scuolhe outro nome.',
'talkexists' => "'''La páigina an si fui arrastrada cun éisito. Inda assi, la páigina de çcusson nun fui arrastrada, ua beç que yá eisistie ua cun este títalo. Por fabor, ajunta-las a la mano.'''",
'movedto' => 'arrastrado pa',
'movetalk' => 'Arrastrar tamien la páigina de çcusson associada.',
-'1movedto2' => '[[$1]] fui arrastrado pa [[$2]]',
-'1movedto2_redir' => 'arrastreste [[$1]] pa [[$2]] nun ancaminamiento',
'movelogpage' => "Registro d'arrastros",
'movereason' => 'Rezon:',
'revertmove' => 'poner al robés',
@@ -1115,7 +1107,7 @@ Premite ajuntar la rezon de la eidiçon ne l sumário.',
# Media information
'file-info-size' => '$1 × $2 pixel, tamanho: $3, tipo MIME: $4',
-'file-nohires' => '<small>Sin resoluçon maior çponible.</small>',
+'file-nohires' => 'Sin resoluçon maior çponible.',
'svg-long-desc' => 'fexeiro SVG, de $1 × $2 pixeles, tamanho: $3',
'show-big-image' => 'Resoluçon cumpleta',
diff --git a/languages/messages/MessagesMy.php b/languages/messages/MessagesMy.php
index 5a5b36ed..64e532c5 100644
--- a/languages/messages/MessagesMy.php
+++ b/languages/messages/MessagesMy.php
@@ -367,7 +367,6 @@ $1',
'badtitle' => 'ညံ့ဖျင်းသော á€á€±á€«á€„်းစဉ်',
'badtitletext' => 'á€á€±á€¬á€„်းဆိုထားသော စာမျက်နှာ á€á€±á€«á€„်းစဉ်သည် á€á€›á€¬á€¸á€™á€á€„်ပါ (သို့) ဗလာဖြစ်နေသည် (သို့) အá€á€¼á€¬á€¸á€˜á€¬á€žá€¬á€™á€»á€¬á€¸(inter-language or inter-wiki title)သို့ မှားယွင်းစွာ လင့်á€á€»á€­á€á€ºá€‘ားသည်á‹',
'viewsource' => 'ရင်းမြစ်ကို ကြည့်ရန်',
-'viewsourcefor' => '$1 အá€á€½á€€á€º',
'protectedpagetext' => 'ဤစာမျက်နှာအား á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€›á€”ိုင်ရန် ထိန်းသိမ်းထားသည်á‹',
'namespaceprotected' => "'''$1''' စာညွှန်းဖြင့် စာမျက်နှာကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”် á€á€½á€„့်ပြုá€á€»á€€á€º မရှိပါá‹",
'ns-specialprotected' => 'အထူးစာမျက်နှာများကို á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€›á€”ိုင်ပါá‹',
@@ -494,8 +493,6 @@ $1',
'subject-preview' => 'အကြောင်းအရာ/á€á€±á€«á€„်းကြီးပိုင်း နမူနာ -',
'blockedtitle' => 'အသုံးပြုသူကို ပိá€á€ºá€•á€„်ထားသည်',
'blockednoreason' => 'အကြောင်းပြá€á€»á€€á€º မပေးထားပါ',
-'blockedoriginalsource' => "'''$1''' á ရင်းမြစ်ကို အောက်á€á€½á€„် ပြထားသည် -",
-'whitelistedittitle' => 'ပြင်ဆင်ရန် log in á€á€„်ထားဖို့ လိုသည်',
'whitelistedittext' => 'စာမျက်နှာများကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”် $1ရမည်á‹',
'nosuchsectiontitle' => 'အပိုင်းကို ရှာမရနိုင်ပါ',
'loginreqtitle' => 'login á€á€„်ထားရန် လိုသည်',
@@ -610,22 +607,12 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် á
'revdelete-unsuppress' => 'ပြန်လည်ထိန်းသိမ်းထားသော မူများမှ ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ ဖယ်ရှားရန်',
'revdelete-log' => 'အ​ကြောင်း​ပြ​á€á€»á€€á€º:',
'revdelete-submit' => 'ရွေးá€á€»á€šá€ºá€‘ားသော {{PLURAL:$1|မူ|မူများ}}ကို သက်ရောက်စေရန်',
-'revdelete-logentry' => '"[[$1]]" á မူá မြင်နိုင်စွမ်းကို ပြောင်းလဲရန်',
-'logdelete-logentry' => '"[[$1]]" á အဖြစ်အပျက် မြင်နိုင်စွမ်းကို ပြောင်းလဲရန်',
'revdelete-success' => "'''မူမြင်နိုင်စွမ်းရှိမှုကို အောင်မြင်စွာ update လုပ်ပြီးပါပြီá‹'''",
'revdel-restore' => 'မည်မျှ ရှုမြင်နိုင်သည်ကို ပြောင်းရန်',
'revdel-restore-deleted' => 'ဖျက်ပစ်လိုက်သောမူများ',
'revdel-restore-visible' => 'မြင်နိုင်သော မူများ',
'pagehist' => 'စာမျက်နှာ မှá€á€ºá€á€™á€ºá€¸',
'deletedhist' => 'ဖျက်ပစ်လိုက်သော မှá€á€ºá€á€™á€ºá€¸',
-'revdelete-content' => 'မာá€á€­á€€á€¬',
-'revdelete-summary' => 'အကျဉ်းá€á€»á€¯á€•á€ºá€€á€­á€¯ á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်',
-'revdelete-uname' => 'အသုံးပြုသူအမည်',
-'revdelete-restricted' => 'အက်ဒမင်များသို့ ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸ သက်ရောက်ရန်',
-'revdelete-unrestricted' => 'အက်ဒမင်များအá€á€½á€€á€º ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ ဖယ်ရှားရန်',
-'revdelete-hid' => '$1 ကို á€á€¾á€€á€ºá€‘ားသည်',
-'revdelete-unhid' => '$1 ကို မá€á€¾á€€á€ºá€á€±á€¬á€·á€•á€«',
-'revdelete-log-message' => '$1 အá€á€½á€€á€º á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€° $2 {{PLURAL:$2|á€á€¯|á€á€¯}}',
'revdelete-otherreason' => 'အá€á€¼á€¬á€¸á€žá€±á€¬/နောက်ထပ် အကြောင်းပြá€á€»á€€á€º -',
'revdelete-reasonotherlist' => 'အá€á€¼á€¬á€¸ အကြောင်းပြá€á€»á€€á€º',
'revdelete-edit-reasonlist' => 'ဖျက်ပစ်လိုက်ရသော အကြောင်းရင်းများကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်',
@@ -750,7 +737,7 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
'prefs-rc' => 'လá€á€ºâ€‹á€â€‹á€œá€±á€¬á€¡â€‹á€•á€¼á€±á€¬á€„်း​အ​လဲ​',
'prefs-watchlist' => 'စောင့်ကြည့်စာရင်း',
'prefs-watchlist-days' => 'စောင့်ကြည့်စာရင်းá€á€½á€„် ပြရန်နေ့များ',
-'prefs-watchlist-days-max' => 'အလွန်ဆုံး ᇠရက်',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'á€á€»á€²á€·á€‘ားသော စောင့်ကြည့်စာရင်းá€á€½á€„် ပြရန် အပြောင်းအလဲá€á€­á€¯á€·á အများဆုံး အရေအá€á€½á€€á€º',
'prefs-watchlist-edits-max' => 'အများဆုံးအရေအá€á€½á€€á€º - áá€á€á€',
'prefs-watchlist-token' => 'စောင့်ကြည့်စာရင်း á€á€­á€¯á€€á€„် -',
@@ -1281,12 +1268,8 @@ Your e-mail address is not revealed when other users contact you.
'activeusers-noresult' => 'အသုံးပြုသူ မá€á€½á€±á€·á€•á€«á‹',
# Special:Log/newusers
-'newuserlogpage' => 'အသုံးပြုသူအသစ်ရောက်လာá€á€¼á€„်း မှá€á€ºá€á€™á€ºá€¸',
-'newuserlogpagetext' => 'ဤသည်မှာ အသုံးပြုသူအသစ် ဖá€á€ºá€á€®á€¸á€™á€¾á€¯ မှá€á€ºá€á€™á€ºá€¸ ဖြစ်သည်á‹',
-'newuserlog-byemail' => 'စကားá€á€¾á€€á€ºá€€á€­á€¯ အီးမေးဖြင့် ပို့လိုက်ပါပြီá‹',
-'newuserlog-create-entry' => 'အသုံးပြုသူအသစ်',
-'newuserlog-create2-entry' => 'အကောင့်သစ် $1 ကို ဖန်á€á€®á€¸á€›á€”်',
-'newuserlog-autocreate-entry' => 'အကောင့်ကို အလိုအလျောက် ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€–ြစ်သည်á‹',
+'newuserlogpage' => 'အသုံးပြုသူအသစ်ရောက်လာá€á€¼á€„်း မှá€á€ºá€á€™á€ºá€¸',
+'newuserlogpagetext' => 'ဤသည်မှာ အသုံးပြုသူအသစ် ဖá€á€ºá€á€®á€¸á€™á€¾á€¯ မှá€á€ºá€á€™á€ºá€¸ ဖြစ်သည်á‹',
# Special:ListGroupRights
'listgrouprights' => 'အသုံးပြုသူအုပ်စု အá€á€½á€„့်အရေးများ',
@@ -1359,7 +1342,6 @@ Your e-mail address is not revealed when other users contact you.
'actionfailed' => 'ဆောင်ရွက်မှုမအောင်မြင်ပါ',
'deletedtext' => '"$1" ကို ဖျက်ပစ်လိုက်ပြီးဖြစ်သည်á‹
လá€á€ºá€á€œá€±á€¬á€–ျက်ထားသည်များá မှá€á€ºá€á€™á€ºá€¸á€€á€­á€¯ $2 á€á€½á€„် ကြည့်ပါá‹',
-'deletedarticle' => '[[$1]] ကို ဖျက်လိုက်သည်',
'dellogpage' => 'ဖျက်ထားသည်များ မှá€á€ºá€á€™á€ºá€¸',
'deletionlog' => 'ဖျက်ပစ်သည့်မှá€á€ºá€á€™á€ºá€¸',
'deletecomment' => 'အ​ကြောင်း​ပြ​á€á€»á€€á€º -',
@@ -1425,7 +1407,6 @@ Your e-mail address is not revealed when other users contact you.
'undeletereset' => 'Reset á€á€»á€›á€”်',
'undeleteinvert' => 'selection ကို ပြောင်းပြန်လှန်ရန်',
'undeletecomment' => 'အ​ကြောင်း​ပြ​á€á€»á€€á€º -',
-'undeletedarticle' => '"[[$1]]" ကို ပြန်လည် ပြောင်းလဲလိုက်ပြီး',
'undeletedrevisions' => '{{PLURAL:$1|မူá€á€…်á€á€¯|မူ $1 á€á€¯}} ကိုပြန်လည် ထိန်းသိမ်းပြီး',
'undelete-search-box' => 'ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်',
'undelete-search-submit' => 'ရှာ​ဖွေ​ရန်​',
@@ -1533,9 +1514,9 @@ Your e-mail address is not revealed when other users contact you.
'proxyblocksuccess' => 'ပြီးပါပြီá‹',
# Move page
-'move-page' => '$1 ကို ရွှေ့ရန်',
-'move-page-legend' => 'စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်',
-'movepagetext' => "အောက်ပါပုံစံကို အသုံးပြုပါက စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်းá မှá€á€ºá€á€™á€ºá€¸á€”ှင့်á€á€€á€½ ရွှေ့ပေးမည် ဖြစ်သည်á‹
+'move-page' => '$1 ကို ရွှေ့ရန်',
+'move-page-legend' => 'စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်',
+'movepagetext' => "အောက်ပါပုံစံကို အသုံးပြုပါက စာမျက်နှာကို အမည်ပြောင်းလဲပေးမည် ဖြစ်ပြီး အမည်သစ်သို့ ယင်းá မှá€á€ºá€á€™á€ºá€¸á€”ှင့်á€á€€á€½ ရွှေ့ပေးမည် ဖြစ်သည်á‹
အမည်ဟောင်းသည် အမည်သစ်သို့ ပြန်ညွှန်းပေးမည် ဖြစ်သည်á‹
သင်သည် မူလá€á€±á€«á€„်းစဉ်သို့ ပြန်ညွှန်းများကို အလိုအလျောက် အပ်ဒိá€á€º update လုပ်နိုင်သည်á‹
အကယ်á မပြုလုပ်လိုပါက [[Special:DoubleRedirects|နှစ်á€á€«á€‘ပ်]][[Special:BrokenRedirects|ပြန်ညွှန်း အပျက်များ]] ကို မှá€á€ºá€žá€¬á€¸á€›á€”် မမေ့ပါနှင့်á‹
@@ -1547,36 +1528,33 @@ Your e-mail address is not revealed when other users contact you.
'''သá€á€­á€•á€±á€¸á€á€»á€€á€º!'''
ဤသည်မှာ လူဖá€á€ºá€™á€»á€¬á€¸á€žá€±á€¬ စာမျက်နှာá€á€…်á€á€¯á€–ြစ်ပါက မမျှော်လင့်ထားသောአကြီးမားသော အပြောင်းအလဲá€á€…်á€á€¯ ဖြစ်ပေါ်လာနိုင်သည်á‹
ထို့ကြောင့် ဆက်လက် မဆောင်ရွက်မီ သင်သည် နောက်ဆက်á€á€½á€² အကျိုးဆက်များကို နားလည်ကြောင်း ကျေးဇူးပြုá သေá€á€»á€¬á€•á€«á€…ေá‹",
-'movepagetalktext' => "ဆက်နွယ်နေသော ဆွေးနွေးá€á€»á€€á€º စာမျက်နှာကို '''အောက်ပါအကြောင်းများ မရှိá€á€²á€·á€•á€«á€€''' အလိုအလျောက် ရွှေ့ပစ်မည် ဖြစ်သည်á‹
+'movepagetalktext' => "ဆက်နွယ်နေသော ဆွေးနွေးá€á€»á€€á€º စာမျက်နှာကို '''အောက်ပါအကြောင်းများ မရှိá€á€²á€·á€•á€«á€€''' အလိုအလျောက် ရွှေ့ပစ်မည် ဖြစ်သည်á‹
*အကယ်á ဗလာမဟုá€á€ºá€žá€±á€¬ ဆွေးနွေးá€á€»á€€á€ºá€…ာမျက်နှာသည် အမည်အသစ်အောက်á€á€½á€„် ရှိနှင့်ပြီး ဖြစ်á€á€¼á€„်း (သို့)
*အောက်ပါ သေá€á€¹á€á€¬á€„ယ် box ကို မှá€á€ºá€žá€¬á€¸á€á€¼á€„်းá‹
ဤကိစ္စမျိုး ကြုံလာá€á€²á€·á€•á€«á€€ သင် ဆန္ဒရှိလျှင် စာမျက်နှာကို မိမိကိုယ်á€á€­á€¯á€„် သွားရောက်ရွှေ့ပြောင်း ပေါင်းစပ်နိုင်သည်á‹",
-'movearticle' => 'စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန် -',
-'movenologin' => 'logged in á€á€„်မထားပါ',
-'newtitle' => 'á€á€±á€«á€„်းစဉ်အသစ်သို့:',
-'move-watch' => 'မူရင်းစာမျက်နှာနှင့် ဦးá€á€Šá€ºá€‘ားသော စာမျက်နှာá€á€­á€¯á€·á€€á€­á€¯ စောင့်ကြည့်ရန်',
-'movepagebtn' => 'စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်',
-'pagemovedsub' => 'ပြောင်းရွှေ့á€á€¼á€„်းအောင်မြင်သည်',
-'movepage-moved' => '\'\'\'"$1" ကို "$2" သို့ ရွှေ့ပြီးဖြစ်သည်\'\'\'',
-'movepage-moved-redirect' => 'ပြန်ညွှန်းá€á€…်á€á€¯á€€á€­á€¯ ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€–ြစ်သည်á‹',
-'articleexists' => 'ထိုအမည်ဖြင့် စာမျက်နှာá€á€…်á€á€¯ ရှိနှင့်ပြီးဖြစ်သည် (သို့) သင်ရွေးလိုက်သော အမည်သည် á€á€›á€¬á€¸á€™á€á€„်ပါá‹
+'movearticle' => 'စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန် -',
+'movenologin' => 'logged in á€á€„်မထားပါ',
+'newtitle' => 'á€á€±á€«á€„်းစဉ်အသစ်သို့:',
+'move-watch' => 'မူရင်းစာမျက်နှာနှင့် ဦးá€á€Šá€ºá€‘ားသော စာမျက်နှာá€á€­á€¯á€·á€€á€­á€¯ စောင့်ကြည့်ရန်',
+'movepagebtn' => 'စာ​မျက်​နှာ​ကို ရွှေ့ပြောင်းရန်',
+'pagemovedsub' => 'ပြောင်းရွှေ့á€á€¼á€„်းအောင်မြင်သည်',
+'movepage-moved' => '\'\'\'"$1" ကို "$2" သို့ ရွှေ့ပြီးဖြစ်သည်\'\'\'',
+'movepage-moved-redirect' => 'ပြန်ညွှန်းá€á€…်á€á€¯á€€á€­á€¯ ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€–ြစ်သည်á‹',
+'articleexists' => 'ထိုအမည်ဖြင့် စာမျက်နှာá€á€…်á€á€¯ ရှိနှင့်ပြီးဖြစ်သည် (သို့) သင်ရွေးလိုက်သော အမည်သည် á€á€›á€¬á€¸á€™á€á€„်ပါá‹
ကျေးဇူးပြုá အá€á€¼á€¬á€¸á€¡á€™á€Šá€ºá€á€…်á€á€¯á€€á€­á€¯ ရွေးပေးပါá‹',
-'talkexists' => "'''စာမျက်နှာကို အောင်မြင်စွာ ရွှေ့ပြီးဖြစ်သည်ዠသို့သော် ဆွေးနွေးá€á€»á€€á€º စာမျက်နှာကိုမူ ရွေ့မရနိုင်ပါዠအကြောင်းမှာ á€á€±á€«á€„်းစဉ်အသစ်á€á€½á€„် ရှိပြီးဖြစ်သောကြောင့် ဖြစ်သည်á‹
+'talkexists' => "'''စာမျက်နှာကို အောင်မြင်စွာ ရွှေ့ပြီးဖြစ်သည်ዠသို့သော် ဆွေးနွေးá€á€»á€€á€º စာမျက်နှာကိုမူ ရွေ့မရနိုင်ပါዠအကြောင်းမှာ á€á€±á€«á€„်းစဉ်အသစ်á€á€½á€„် ရှိပြီးဖြစ်သောကြောင့် ဖြစ်သည်á‹
ကျေးဇူးပြုá ယင်းá€á€­á€¯á€·á€€á€­á€¯ မိမိဘာသာ ပြန်ပေါင်းပေးပါá‹'''",
-'movedto' => 'ရွေ့​ပြောင်း​ရန်​နေ​ရာ​',
-'movetalk' => 'ယှက်နွယ်နေသော ဆွေးနွေးá€á€»á€€á€ºá€…ာမျက်နှာများကို ရွှေ့ရန်',
-'movepage-page-moved' => 'စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့ပြီးပြီ ဖြစ်သည်á‹',
-'movepage-page-unmoved' => 'စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့မရနိုင်ပါá‹',
-'1movedto2' => '[[$1]] မှ​ [[$2]] သို့​',
-'1movedto2_redir' => 'redirect ပြန်ညွှန်းရာá€á€½á€„် [[$1]] မှ [[$2]] သို့ ရွှေ့ပြီးဖြစ်သည်',
-'move-redirect-suppressed' => 'ပြန်ညွှန်းá€á€¼á€„်း မရှိပါ',
-'movelogpage' => 'ရွှေ့ပြောင်းá€á€¼á€„်း မှá€á€ºá€á€™á€ºá€¸',
-'movereason' => 'အ​ကြောင်း​ပြ​á€á€»á€€á€º -',
-'revertmove' => 'ပြောင်းရန်',
-'delete_and_move' => 'ဖျက်ပြီးရွှေ့ရန်',
-'delete_and_move_confirm' => 'ဟုá€á€ºá€•á€«á€žá€Šá€ºá‹ စာမျက်နှာကို ဖျက်ပါá‹',
-'immobile-source-page' => 'ဤစာမျက်နှာကို ရွှေ့မရပါá‹',
+'movedto' => 'ရွေ့​ပြောင်း​ရန်​နေ​ရာ​',
+'movetalk' => 'ယှက်နွယ်နေသော ဆွေးနွေးá€á€»á€€á€ºá€…ာမျက်နှာများကို ရွှေ့ရန်',
+'movepage-page-moved' => 'စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့ပြီးပြီ ဖြစ်သည်á‹',
+'movepage-page-unmoved' => 'စာမျက်နှာ $1 ကို $2 သို့ ရွှေ့မရနိုင်ပါá‹',
+'movelogpage' => 'ရွှေ့ပြောင်းá€á€¼á€„်း မှá€á€ºá€á€™á€ºá€¸',
+'movereason' => 'အ​ကြောင်း​ပြ​á€á€»á€€á€º -',
+'revertmove' => 'ပြောင်းရန်',
+'delete_and_move' => 'ဖျက်ပြီးရွှေ့ရန်',
+'delete_and_move_confirm' => 'ဟုá€á€ºá€•á€«á€žá€Šá€ºá‹ စာမျက်နှာကို ဖျက်ပါá‹',
+'immobile-source-page' => 'ဤစာမျက်နှာကို ရွှေ့မရပါá‹',
# Export
'export' => 'စာမျက်နှာများကို Export ထုá€á€ºá€›á€”်',
@@ -1686,10 +1664,6 @@ Your e-mail address is not revealed when other users contact you.
# Attribution
'others' => 'အá€á€¼á€¬á€¸',
-# Patrol log
-'patrol-log-line' => '$3 စောင့်ကြည့်နေသော $2 á $1 ကို မှá€á€ºá€žá€¬á€¸á€œá€­á€¯á€€á€ºá€žá€Šá€º',
-'patrol-log-diff' => 'မူ $1',
-
# Image deletion
'filedeleteerror-short' => 'ဖိုင်ဖျက်ရာá€á€½á€„် အမှားအယွင်း - $1',
@@ -1699,7 +1673,7 @@ Your e-mail address is not revealed when other users contact you.
# Media information
'file-info-size' => '$1 × $2 pixels, ဖိုင်အရွယ်အစား - $3, MIME အမျိုးအစား $4',
-'file-nohires' => '<small>သည်ထက်ကြီးသော resolution မရှိပါ.</small>',
+'file-nohires' => 'သည်ထက်ကြီးသော resolution မရှိပါ.',
'svg-long-desc' => 'SVG ဖိုင်, $1 × $2 pixels ကို အကြံပြုသည်, ဖိုင်အရွယ်အစား - $3',
'show-big-image' => 'resolution အပြည့်',
@@ -1940,4 +1914,21 @@ Your e-mail address is not revealed when other users contact you.
'htmlform-reset' => 'ပြောင်းလဲထားသည်များ မလုပ်á€á€±á€¬á€·á€›á€”်',
'htmlform-selectorother-other' => 'အá€á€¼á€¬á€¸',
+# New logging system
+'revdelete-restricted' => 'အက်ဒမင်များသို့ ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸ သက်ရောက်ရန်',
+'revdelete-unrestricted' => 'အက်ဒမင်များအá€á€½á€€á€º ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ ဖယ်ရှားရန်',
+'newuserlog-byemail' => 'စကားá€á€¾á€€á€ºá€€á€­á€¯ အီးမေးဖြင့် ပို့လိုက်ပါပြီá‹',
+
+# API errors
+'api-error-filename-tooshort' => 'ဖိုင်အမည်သည် á€á€­á€¯á€œá€½á€”်းသည်á‹',
+'api-error-filetype-banned' => 'ဤဖိုင်အမျိုးအစားကို á€á€¬á€¸á€™á€¼á€…်ထားသည်á‹',
+'api-error-http' => 'အá€á€½á€„်းပိုင်းအမှား - ဆာဗာကို မဆက်သွယ်နိုင်ပါá‹',
+'api-error-illegal-filename' => 'ဖိုင်အမည်ကို á€á€½á€„့်မပြုပါá‹',
+'api-error-mustbeloggedin' => 'ဖိုင်á€á€„်ရန် login á€á€„်ထားရမည်á‹',
+'api-error-ok-but-empty' => 'အá€á€½á€„်းပိုင်းအမှား - ဆာဗာထံမှ á€á€¯á€¶á€·á€•á€¼á€”်မှု မရပါá‹',
+'api-error-unknown-code' => 'အမည်မသိ အမှား - "$1"',
+'api-error-unknown-warning' => 'အမည်မသိ သá€á€­á€•á€±á€¸á€á€»á€€á€º - $1',
+'api-error-uploaddisabled' => 'ဤá€á€®á€€á€®á€á€½á€„် ဖိုင်á€á€„်á€á€¼á€„်း ပိá€á€ºá€‘ားသည်á‹',
+'api-error-verification-error' => 'ဖိုင်ပျက်နေသည် (သို့) ဖိုင်နောက်ဆက် extension မှားနေသည်á‹',
+
);
diff --git a/languages/messages/MessagesMyv.php b/languages/messages/MessagesMyv.php
index 61e78c56..ea38ddd6 100644
--- a/languages/messages/MessagesMyv.php
+++ b/languages/messages/MessagesMyv.php
@@ -40,6 +40,9 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑдо кортамоÑÑŒ',
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$specialPageAliases = array(
'Allmessages' => array( 'ВеÑеПачтÑмнÑÑ‚ÑŒ' ),
'Allpages' => array( 'ВеÑеЛопат' ),
@@ -111,75 +114,75 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'currentmonth' => array( '1', 'МОЛИЦЯКОВ', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'МОЛИЦЯКОВЛЕМ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'МОЛИЦЯКОВЛЕМГЕÐ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'МОЛИЦЯКОВКИРЬТЯÐЬХВОРМÐ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'МОЛИЦЯЧЫ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'МОЛИЦЯЧЫ2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'МОЛИЦЯЧЫЛЕМ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'МОЛИЦЯИЕ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'МОЛИЦЯШКÐ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'МОЛИЦЯЦЯС', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ТЕСКЭÐЬКОВ', 'МЕСТÐЫЙ_МЕСЯЦ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'ТЕСКЭÐЬКОВЛЕМ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ТЕСКЭÐЬКОВЛЕМГЕÐ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ТЕСКЭÐЬКОВКИРЬТЯÐЬХВОРМÐ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ТЕСКЭÐЬЧЫ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ТЕСКЭÐЬЧЫ2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ТЕСКЭÐЬЧЫЛЕМ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ТЕСКЭÐЬИЕ', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ТЕСКЭÐЬШКÐ', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ТЕСКЭÐЬЦЯС', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ЗЯРОЛОПÐТ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ЗЯРОСÐРМÐДОВКСТ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ЗЯРОФÐЙЛÐТ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ЗЯРОТЕИЦЯТ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'ЗЯРОВИТÐЕМÐТПЕТÐЕМÐТ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'ЛОПÐЛЕМ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
- 'namespace' => array( '1', 'ЛЕМПОТМО', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'КОРТÐМОПОТМО', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
- 'fullpagename' => array( '1', 'ЛОПÐЛЕМКУВÐКÐСТО', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
- 'talkpagename' => array( '1', 'КОРТÐМОЛОПÐЛЕМ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
- 'msg' => array( '0', 'ПÐЧТЯМÐЭ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
- 'img_thumbnail' => array( '1', 'кенжешка', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'вить_кедь', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'керш_кедь', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'вейкеÑк_араÑÑŒ', 'без', 'none' ),
- 'img_center' => array( '1', 'куншкаÑо', 'центр', 'center', 'centre' ),
- 'img_framed' => array( '1', 'кундÑо', 'обрамить', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'кундовтомо', 'безрамки', 'frameless' ),
- 'img_page' => array( '1', 'лопа=$1', 'лопа $1', 'Ñтраница=$1', 'Ñтраница $1', 'Ñтраница $1', 'page=$1', 'page $1' ),
- 'img_top' => array( '1', 'верькÑ', 'Ñверху', 'top' ),
- 'img_text_top' => array( '1', 'текÑÑ‚-верькÑ', 'текÑÑ‚-Ñверху', 'text-top' ),
- 'img_middle' => array( '1', 'куншка', 'поÑередине', 'middle' ),
- 'img_bottom' => array( '1', 'алкÑ', 'Ñнизу', 'bottom' ),
- 'img_text_bottom' => array( '1', 'текÑÑ‚-алкÑ', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
- 'sitename' => array( '1', 'СÐЙТЛЕМ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
- 'gender' => array( '0', 'СЫМЕ:', 'ПОЛ:', 'GENDER:' ),
- 'currentweek' => array( '1', 'МОЛИЦЯ_ТÐРГО', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'МОЛИЦЯ_ЧИ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ТЕСКЭÐЬТÐРГО', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
- 'revisionid' => array( '1', 'ЛИЯКСТОМТОМÐID', 'ИД_ВЕРСИИ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ЛИЯКСТОМТОМÐЧЫ', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ЛИЯКСТОМТОМÐЧЫ2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'ЛИЯКСТОМТОМÐКОВ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ЛИЯКСТОМТОМÐИЕ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
- 'plural' => array( '0', 'ЛÐМОÐЬЧИСЛÐ', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
- 'lcfirst' => array( '0', 'Ð’ÐСЕÐЦЕ_ТЕШТЬКЕСЬ_ВИШКИÐЕ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'Ð’ÐСЕÐЦЕ_ТЕШТЬКЕСЬ_ПОКШ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'ВИШКÐ_ТЕШТЬКЕСЭ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
- 'uc' => array( '0', 'ПОШК_ТЕШТЬКЕСЭ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
- 'raw' => array( '0', 'ВЕРЕКСТЭ', 'ÐЕОБРÐБ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ÐЕВТЕМС_КОÐЯКС', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'ТЕВÐТЕВЕРСИЯ', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
- 'language' => array( '0', '#КЕЛЕСЬ:', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'ЗЯРОÐДМИÐТÐЭДЕ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'башка_тевень', 'ÑлужебнаÑ', 'special' ),
- 'filepath' => array( '0', 'ФÐЙЛÐÐЬКИ', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
- 'pagesize' => array( '1', 'ЛОПÐКУВÐЛМО', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
- 'url_path' => array( '0', 'ЯÐ', 'ПУТЬ', 'PATH' ),
- 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
+ 'currentmonth' => array( '1', 'МОЛИЦЯКОВ', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'МОЛИЦЯКОВЛЕМ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'МОЛИЦЯКОВЛЕМГЕÐ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'МОЛИЦЯКОВКИРЬТЯÐЬХВОРМÐ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'МОЛИЦЯЧЫ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'МОЛИЦЯЧЫ2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'МОЛИЦЯЧЫЛЕМ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'МОЛИЦЯИЕ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'МОЛИЦЯШКÐ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'МОЛИЦЯЦЯС', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ТЕСКЭÐЬКОВ', 'МЕСТÐЫЙ_МЕСЯЦ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'ТЕСКЭÐЬКОВЛЕМ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ТЕСКЭÐЬКОВЛЕМГЕÐ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ТЕСКЭÐЬКОВКИРЬТЯÐЬХВОРМÐ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ТЕСКЭÐЬЧЫ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ТЕСКЭÐЬЧЫ2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ТЕСКЭÐЬЧЫЛЕМ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ТЕСКЭÐЬИЕ', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ТЕСКЭÐЬШКÐ', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ТЕСКЭÐЬЦЯС', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ЗЯРОЛОПÐТ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ЗЯРОСÐРМÐДОВКСТ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ЗЯРОФÐЙЛÐТ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ЗЯРОТЕИЦЯТ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ЗЯРОВИТÐЕМÐТПЕТÐЕМÐТ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'ЛОПÐЛЕМ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'namespace' => array( '1', 'ЛЕМПОТМО', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'КОРТÐМОПОТМО', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'ЛОПÐЛЕМКУВÐКÐСТО', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
+ 'talkpagename' => array( '1', 'КОРТÐМОЛОПÐЛЕМ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
+ 'msg' => array( '0', 'ПÐЧТЯМÐЭ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'img_thumbnail' => array( '1', 'кенжешка', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'вить_кедь', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'керш_кедь', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'вейкеÑк_араÑÑŒ', 'без', 'none' ),
+ 'img_center' => array( '1', 'куншкаÑо', 'центр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'кундÑо', 'обрамить', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'кундовтомо', 'безрамки', 'frameless' ),
+ 'img_page' => array( '1', 'лопа=$1', 'лопа $1', 'Ñтраница=$1', 'Ñтраница $1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_top' => array( '1', 'верькÑ', 'Ñверху', 'top' ),
+ 'img_text_top' => array( '1', 'текÑÑ‚-верькÑ', 'текÑÑ‚-Ñверху', 'text-top' ),
+ 'img_middle' => array( '1', 'куншка', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'алкÑ', 'Ñнизу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'текÑÑ‚-алкÑ', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
+ 'sitename' => array( '1', 'СÐЙТЛЕМ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'gender' => array( '0', 'СЫМЕ:', 'ПОЛ:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'МОЛИЦЯ_ТÐРГО', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'МОЛИЦЯ_ЧИ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ТЕСКЭÐЬТÐРГО', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
+ 'revisionid' => array( '1', 'ЛИЯКСТОМТОМÐID', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ЛИЯКСТОМТОМÐЧЫ', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ЛИЯКСТОМТОМÐЧЫ2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'ЛИЯКСТОМТОМÐКОВ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ЛИЯКСТОМТОМÐИЕ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+ 'plural' => array( '0', 'ЛÐМОÐЬЧИСЛÐ', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
+ 'lcfirst' => array( '0', 'Ð’ÐСЕÐЦЕ_ТЕШТЬКЕСЬ_ВИШКИÐЕ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'Ð’ÐСЕÐЦЕ_ТЕШТЬКЕСЬ_ПОКШ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ВИШКÐ_ТЕШТЬКЕСЭ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
+ 'uc' => array( '0', 'ПОШК_ТЕШТЬКЕСЭ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
+ 'raw' => array( '0', 'ВЕРЕКСТЭ', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ÐЕВТЕМС_КОÐЯКС', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
+ 'currentversion' => array( '1', 'ТЕВÐТЕВЕРСИЯ', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#КЕЛЕСЬ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'ЗЯРОÐДМИÐТÐЭДЕ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'башка_тевень', 'ÑлужебнаÑ', 'special' ),
+ 'filepath' => array( '0', 'ФÐЙЛÐÐЬКИ', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
+ 'pagesize' => array( '1', 'ЛОПÐКУВÐЛМО', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'ЯÐ', 'ПУТЬ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
);
$messages = array(
@@ -505,7 +508,6 @@ $messages = array(
'badtitle' => 'ÐÐ¼Ð°ÑˆÑ‚Ð¾Ð²Ð¸ÐºÑ ÐºÐ¾Ð½ÑкÑ',
'badtitletext' => 'Вешезь лопанть Ð»ÐµÐ¼ÐµÐ·Ñ Ð°Ð²Ð¾Ð»ÑŒ виде, чаво, Ñли аволь видеÑÑ‚Ñ Ñюлмазь келеньйутковань Ñли интервикинь лем. ПарÑк, лемÑÑнть Ñ‚ÐµÐ²Ñ Ð½Ð¾Ð»Ð´Ð°Ð·ÑŒ Ð°Ð½Ð¾Ð»Ð´Ð°Ð²Ð¸ÐºÑ Ñ‚ÐµÑˆÐºÑÑ‚.',
'viewsource' => 'Ð’Ð°Ð½Ð½Ð¾Ð¼Ñ Ð»Ð¸ÑьмапрÑнть',
-'viewsourcefor' => ' $1 -нь юртозо',
'actionthrottled' => 'Тев тееманть куроккÑÑ‡Ð¸Ð·Ñ ÐºÐ¸Ñ€Ñ‚Ñзь',
'protectedpagetext' => 'Те лопаÑÑŒ панжома ÑкшÑÑ, илÑзо понго Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ñ - Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ ÐºÐ¸Ð½ÐµÐ½ÑŒÐ³Ð°Ðº.',
'viewsourcetext' => 'Те лопанть лиÑьмапрÑÑÑŒ маштови ваномÑкак, лангÑтонзо ÑÐ°ÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸ÑÑк:',
@@ -588,6 +590,9 @@ $messages = array(
'accountcreatedtext' => '$1-нь ÑовицÑнь таркаÑÑŒ теевÑÑŒ-шкавÑÑŒ.',
'loginlanguagelabel' => 'Кель: $1',
+# E-mail sending
+'user-mail-no-addy' => 'ТерÑвтыть ÐºÑƒÑ‡Ð¾Ð¼Ñ Ðµ-Ñёрма е-Ñёрмапарговтомо.',
+
# Change password dialog
'resetpass' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ñовамо валот',
'resetpass_header' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ñовамо валот',
@@ -609,6 +614,13 @@ $messages = array(
'passwordreset-emailelement' => 'ТеицÑнь леметь: $1
Ðурькине шкань Ñалававалот: $2',
+# Special:ChangeEmail
+'changeemail-oldemail' => 'Ðеень е-Ñёрмапаргот:',
+'changeemail-newemail' => 'Од е-Ñёрмапаргот:',
+'changeemail-none' => '(араÑÑŒ мезе невтемÑ)',
+'changeemail-submit' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ðµ-Ñёрмапаргот',
+'changeemail-cancel' => 'Ð¡Ð°ÐµÐ¼Ñ Ð¼ÐµÐºÐµÐ²',
+
# Edit page toolbar
'bold_sample' => 'Эчке текÑÑ‚',
'bold_tip' => 'Эчке текÑÑ‚',
@@ -657,8 +669,6 @@ $messages = array(
IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ — #$5. ИнеÑкеть, кевкÑтемат улить, невттÑÑ Ð½ÐµÑ‚Ð½ÐµÐ½ÑŒ лангÑ.",
'blockednoreason' => 'тувтал апак макÑо',
-'blockedoriginalsource' => "'''$1''' -нть лиÑьмапрÑзо неÑви ало:",
-'whitelistedittitle' => 'Витнемань-петнемань теемга ÑÑ€Ñви Ñовамо лем',
'whitelistedittext' => 'Лопанть Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ñ - Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ ÑÑ€Ñви $1.',
'nosuchsectiontitle' => 'ЯвкÑоÑÑŒ а муеви',
'nosuchsectiontext' => 'Варчить витнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ ÑвкÑ, кона араÑÑŒ.
@@ -772,18 +782,11 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'revdelete-radio-same' => '(илÑк лиÑкÑтомто)',
'revdelete-log' => 'ТувталоÑÑŒ:',
'revdelete-submit' => 'ÐÑ€Ð°Ð²Ñ‚Ð¾Ð¼Ñ ÐºÐ¾Ñ‡ÐºÐ°Ð·ÑŒ {{PLURAL:$1|лиÑкÑтомтомантень|лиÑкÑтомтоматненень}}',
-'revdelete-logentry' => '[[$1]]-нть лиÑкÑтомтоманть неÑвомазо полавтовÑÑŒ',
'revdel-restore' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ð½ÐµÑвомачынзÑ',
'revdel-restore-deleted' => 'нардазь верзиÑтне',
'revdel-restore-visible' => 'неÑÐ²Ð¸Ñ†Ñ Ð²ÐµÑ€Ð·Ð¸ÑÑ‚',
'pagehist' => 'Лопанть Ð¸ÐºÐµÐ»ÑŒÐºÑ ÑƒÐ¼Ð°Ð·Ð¾',
'deletedhist' => 'Ðардань Ð¸ÐºÐµÐ»ÑŒÐºÑ ÑƒÐ¼Ð°Ð·Ð¾',
-'revdelete-content' => 'потмозо',
-'revdelete-summary' => 'витнемадо-петнемадо нурькине йовтавкÑ',
-'revdelete-uname' => 'СовицÑнь леметь',
-'revdelete-hid' => '$1 кекшезь',
-'revdelete-unhid' => '$1 ливтезь лангÑ',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|лиÑкÑтомтомань туртов|лиÑкÑтомтоматнень туртов}}',
'revdelete-reasonotherlist' => 'Ð›Ð¸Ñ Ñ‚ÑƒÐ²Ñ‚Ð°Ð»',
'revdelete-edit-reasonlist' => 'ВитнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ð½Ð°Ñ€Ð´Ð°Ð¼Ð¾Ð½ÑŒ тувталтнÑÑÑ',
'revdelete-offender' => 'ВерÑиÑнть теицÑзо:',
@@ -894,10 +897,12 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'prefs-personal' => 'ТеицÑдо',
'prefs-rc' => 'Чиень полавтнемат',
'prefs-watchlist' => 'Ванома лемриÑьме',
-'prefs-watchlist-days-max' => 'ВеÑемеде ÐºÑƒÐ²Ð°Ñ‚ÑŒÑ 7 чиÑ',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'ВеÑемеде покш цётоÑÑŒ: 1000',
'prefs-misc' => 'Минеть-Ñюнот',
'prefs-resetpass' => 'Салава валонь полавтома',
+'prefs-changeemail' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ðµ-Ñёрмапаргот',
+'prefs-setemail' => 'ÐŸÑƒÑ‚Ð¾Ð¼Ñ Ðµ-Ñёрмапарго',
'prefs-email' => 'Е-Ñёрмат-мезть',
'prefs-rendering' => 'ТюÑозо-лангозо',
'saveprefs' => 'ВанÑтомÑ',
@@ -1007,6 +1012,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'right-mergehistory' => 'ВейтьÑÑндÑÐ¼Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð½ÐµÐ½ÑŒ юроÑÑ‚-путовкÑоÑÑ‚',
'right-userrights' => 'ВитнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ ÑовицÑнь веÑе видечитнень',
'right-siteadmin' => 'Датабазань Ñёлгомо ды панжомо',
+'right-passwordreset' => 'ЛиÑÐ»Ð³Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ñ‚ÐµÐ¸Ñ†Ñнь Ñовамо вал ([[Special:PasswordReset|башка лопа]])',
# User rights log
'rightslog' => 'УÑькетеицÑнть видечинть кемекÑтома',
@@ -1358,11 +1364,8 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'activeusers-noresult' => 'ЯкинзÑ-Ð¿Ð°ÐºÐ¸Ð½Ð·Ñ Ð°Ñ€Ð°ÑÑ‚ÑŒ',
# Special:Log/newusers
-'newuserlogpage' => 'ТеицÑнь шкамодо-теемадо конёв',
-'newuserlogpagetext' => 'Те теицÑнь шкавкÑто журнал',
-'newuserlog-byemail' => 'Ñалава валот кучозь е-ÑёрмаÑо',
-'newuserlog-create-entry' => 'Од ÑовицÑ',
-'newuserlog-create2-entry' => 'шкить од Ñовамо тарка $1',
+'newuserlogpage' => 'ТеицÑнь шкамодо-теемадо конёв',
+'newuserlogpagetext' => 'Те теицÑнь шкавкÑто журнал',
# Special:ListGroupRights
'listgrouprights' => 'Ð¢ÐµÐ¸Ñ†Ñ ÐºÑƒÑ€Ð¾Ð½Ñ‚ÑŒ видечинзÑ',
@@ -1432,7 +1435,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'actionfailed' => 'Тев теемаÑÑŒ Ñзь лиÑе',
'deletedtext' => '"$1"-ÑÑŒ ульнеÑÑŒ нардазь.
Вант $2 тоÑо веÑи уаль умоконь нардавкÑне.',
-'deletedarticle' => 'нардазь "[[$1]]"',
'dellogpage' => 'Ðардазде мезе йовтамÑ',
'deletionlog' => 'нардамонь Ñёрмалема',
'reverted' => 'Вельмевтезь лопань Ñеде икелень лиÑкÑтомтома',
@@ -1504,7 +1506,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'undeleteviewlink' => 'ваномÑ',
'undeleteinvert' => 'Кочказень Ñ‚Ð°Ñ€ÐºÐ°Ñ Ð°Ð¿Ð°ÐºÐ¾Ð½ÑŒ кочкамо',
'undeletecomment' => 'ТувталоÑÑŒ:',
-'undeletedarticle' => 'вельмевтезь "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 лиÑкÑтомтома|$1 лиÑкÑтомтомат}} вельмевтезь',
'undeletedrevisions-files' => '{{PLURAL:$1|1 лиÑкÑтомтома|$1 лиÑкÑтомтомат}} ды {{PLURAL:$2|1 файла|$2 файлат}} вельмевтезь',
'undeletedfiles' => '{{PLURAL:$1|1 файла|$1 файлат}} вельмевтезь',
@@ -1647,8 +1648,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'movetalk' => 'Печтевтемань кортамо лопа',
'movepage-page-moved' => '"$1" лопаÑÑŒ печтевтезь "$2"-Ñ.',
'movepage-page-unmoved' => 'Лопа $1 Ñзь печтевтеве $2 лопаÑ.',
-'1movedto2' => '[[$1]] печтевтезь тей [[$2]]',
-'1movedto2_redir' => '«[[$1]]» таркаÑÑŒ печтевтезь «[[$2]]» таркантень Ñеде тов ютавтомканть вельде',
'movelogpage' => 'Печтевтемань журнал',
'movesubpage' => '{{PLURAL:$1|ÐлкÑлопа|ÐлкÑлопа}}',
'movesubpagetext' => 'Те лопаÑонть ало невтеви $1 {{PLURAL:$1|алкÑлопа|алкÑлопа}}.',
@@ -1810,8 +1809,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
# Patrol log
'patrol-log-page' => 'ВанÑтнемадо конёв',
-'patrol-log-auto' => '(ÑонÑÑŒ теи)',
-'patrol-log-diff' => 'верÑÐ¸Ñ $1',
'log-show-hide-patrol' => '$1 патрулонь журналонть',
# Image deletion
@@ -1826,7 +1823,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'widthheightpage' => '$1 × $2, {{PLURAL:$3|лопа|$3 лопат}}',
'file-info' => 'файлонть-путовкÑонть Ñталмозо: $1, MIME типезе: $2',
'file-info-size' => '$1 × $2 пикÑельть, файлонть-путовкÑонть Ñталмозо: $3, MIME типезе: $4',
-'file-nohires' => '<small>ÐраÑÑŒ верÑÐ¸Ñ Ð¿Ð¾ÐºÑˆ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€Ñ‚Ð¾.</small>',
+'file-nohires' => 'ÐраÑÑŒ верÑÐ¸Ñ Ð¿Ð¾ÐºÑˆ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€Ñ‚Ð¾.',
'svg-long-desc' => 'SVG файла, $1 × $2 пикÑельть, файланть покшолмазо: $3',
'show-big-image' => 'ПешкÑе теевкÑеÑÑŒ',
'file-info-gif-looped' => 'кирькÑÑÑ Ð°Ñ€Ð°Ð²Ñ‚Ð¾Ð·ÑŒ',
@@ -2063,10 +2060,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
# Scary transclusion
'scarytranscludetoolong' => '[URL пек кувака]',
-# Trackbacks
-'trackbackremove' => '([$1 ÐардамÑ])',
-'trackbacklink' => 'Мекев потамо ÑÑкелькÑÑнь-ÑÑкелькÑÑнь',
-
# Delete conflict
'recreate' => 'Шкак-тейть одов',
@@ -2174,4 +2167,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'htmlform-reset' => 'Ð¡Ð°ÐµÐ¼Ñ Ð¼ÐµÐºÐµÐ² полавтоматнень',
'htmlform-selectorother-other' => 'ЛиÑ',
+# New logging system
+'newuserlog-byemail' => 'Ñалава валот кучозь е-ÑёрмаÑо',
+
);
diff --git a/languages/messages/MessagesMzn.php b/languages/messages/MessagesMzn.php
index a8913e45..9b3aec39 100644
--- a/languages/messages/MessagesMzn.php
+++ b/languages/messages/MessagesMzn.php
@@ -11,6 +11,7 @@
* @author Ebraminio
* @author Firuz
* @author Mjbmr
+ * @author Parthava (on mzn.wikipedia.org)
* @author Spacebirdy
* @author محک
*/
@@ -23,51 +24,105 @@ $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_MEDIAWIKI => 'مدیاویکی',
+ NS_MEDIAWIKI_TALK => 'مدیاویکی_گپ',
NS_TEMPLATE => 'شابلون',
NS_TEMPLATE_TALK => 'شابلون_گپ',
- NS_HELP => 'رانه‌ما',
- NS_HELP_TALK => 'رانه‌مائه_گپ',
+ NS_HELP => 'رانما',
+ NS_HELP_TALK => 'رانما_گپ',
NS_CATEGORY => 'رج',
NS_CATEGORY_TALK => 'رج_گپ',
);
$namespaceAliases = array(
+ 'مه‌دیا' => NS_MEDIA,
'مدیا' => NS_MEDIA,
'ویژه' => NS_SPECIAL,
- 'بحث' => NS_TALK,
+ 'بحث' => NS_TALK,
'کاربر' => NS_USER,
- 'بحث_کاربر' => NS_USER_TALK,
- 'بحث_$1' => NS_PROJECT_TALK,
+ 'بحث_کاربر' => NS_USER_TALK,
+ 'بحث_$1' => NS_PROJECT_TALK,
'تصویر' => NS_FILE,
'پرونده' => NS_FILE,
- 'بحث_تصویر' => NS_FILE_TALK,
- 'بحث_پرونده' => NS_FILE_TALK,
+ 'بحث_تصویر' => NS_FILE_TALK,
+ 'بحث_پرونده' => NS_FILE_TALK,
'مدیاویکی' => NS_MEDIAWIKI,
'مه‌دیا ویکی' => NS_MEDIAWIKI,
- 'بحث_مدیاویکی' => NS_MEDIAWIKI_TALK,
+ 'مه‌دیاویکی' => NS_MEDIAWIKI,
+ 'مه‌دیاویکی_گپ' => NS_MEDIAWIKI_TALK,
+ 'بحث_مدیاویکی' => NS_MEDIAWIKI_TALK,
'مه‌دیا ویکی گپ' => NS_MEDIAWIKI_TALK,
'الگو' => NS_TEMPLATE,
- 'بحث_الگو' => NS_TEMPLATE_TALK,
+ 'بحث_الگو' => NS_TEMPLATE_TALK,
'راهنما' => NS_HELP,
- 'بحث_راهنما' => NS_HELP_TALK,
+ 'رانه‌ما' => NS_HELP,
+ 'رانه‌مائه_گپ' => NS_HELP_TALK,
+ 'بحث_راهنما' => NS_HELP_TALK,
'رانه‌مای گپ' => NS_HELP_TALK,
'رده' => NS_CATEGORY,
- 'بحث_رده' => NS_CATEGORY_TALK,
+ 'بحث_رده' => NS_CATEGORY_TALK,
);
$magicWords = array(
- 'redirect' => array( '0', '#بور', '#تغییرمسیر', '#REDIRECT' ),
- 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'تعداد_صÙحه‌ها', 'ولگ‌ئون_نمره', 'وألگ‌ئون_نومره', 'NUMBEROFPAGES' ),
+ 'redirect' => array( '0', '#بور', '#تغییرمسیر', '#REDIRECT' ),
+ 'notoc' => array( '0', '__بی‌Ùهرست__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__بی‌نگارخنه__', '__بی‌نگارخانه__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__باÙهرست__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__Ùهرست__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', 'بی‌عنوان__', '__بی‌عنوان__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_اسایی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'نام‌ماه‌اضاÙÙ‡', 'نام_ماه_اضاÙÙ‡', 'نام‌ماه‌کنونی‌اضاÙÙ‡', 'نام_ماه_کنونی_اضاÙÙ‡', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'مخÙÙ‌نام‌ماه', 'مخÙÙ_نام_ماه', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'روز', 'روزکنونی', 'روز_کنونی', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'روز۲', 'روز_۲', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'نام‌روز', 'نام_روز', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'سال', 'سال‌کنونی', 'سال_کنونی', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'زمان‌کنونی', 'زمان_کنونی', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ساعت', 'ساعت‌کنونی', 'ساعت_کنونی', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ماه‌محلی', 'ماه_محلی', 'ماه‌محلی۲', 'ماه_محلی۲', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'ماه‌محلی۱', 'ماه_محلی۱', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'نام‌ماه‌محلی', 'نام_ماه_محلی', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'نام‌ماه‌محلی‌اضاÙÙ‡', 'نام_ماه_محلی_اضاÙÙ‡', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'مخÙÙ‌ماه‌محلی', 'مخÙÙ_ماه_محلی', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'روزمحلی', 'روز_محلی', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'روزمحلی۲', 'روز_محلی_۲', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'نام‌روزمحلی', 'نام_روز_محلی', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'سال‌محلی', 'سال_محلی', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'زمون_محلی', 'زمان_محلی', 'زمان‌محلی', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ساعت‌محلی', 'ساعت_محلی', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'تعدادصÙحه‌ها', 'تعداد_صÙحه‌ها', 'ولگ‌ئون_نمره', 'وألگ‌ئون_نومره', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'تعدادکارورون', 'تعدادکاربران', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'کارورون_Ùعال', 'کاربران_Ùعال', 'کاربران‌Ùعال', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'تعداددچی‌یه‌ئون', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'تعدادبازدید', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'نام‌صÙحه', 'نام_صÙحه', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'نام‌صÙحه‌کد', 'نام_صÙحه_کد', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'Ùضای‌نام', 'Ùضای_نام', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'Ùضای‌نام‌کد', 'Ùضای_نام_کد', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'Ùضای‌گپ', 'Ùضای_Ú¯Ù¾', 'Ùضای‌بحث', 'Ùضای_بحث', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'Ùضای‌گپ_کد', 'Ùضای_Ú¯Ù¾_کد', 'Ùضای‌بحث‌کد', 'Ùضای_بحث_کد', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'Ùضای‌موضوع', 'Ùضای‌مقاله', 'Ùضای_موضوع', 'Ùضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'int' => array( '0', 'ترجمه:', 'INT:' ),
+ 'sitename' => array( '1', 'نام‌وبگاه', 'نام_وبگاه', 'SITENAME' ),
+ 'ns' => array( '0', 'ÙÙ†:', 'NS:' ),
+ 'nse' => array( '0', 'ÙÙ†Ú©:', 'NSE:' ),
+ 'localurl' => array( '0', 'نشونی:', 'نشانی:', 'LOCALURL:' ),
+ 'grammar' => array( '0', 'دستور_زبون:', 'دستور_زوون:', 'دستورزبان:', 'دستور_زبان:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'جنسیت:', 'جنس:', 'GENDER:' ),
);
$messages = array(
@@ -412,12 +467,11 @@ $2، $1',
'cannotdelete' => 'صÙحه یا تصویر «$1» ره ننشنه پاک هاکردن.
ممکنه قبلاً Ùرد دیگری وه ره پاک هاکردبوئه.',
'badtitle' => 'نقش عنوان',
-'perfcached' => 'داده‌ئون زیر حاÙظهٔ موقت جه بَییته بَینه Ùˆ ممکن هسته کاملاً به‌روز نوائن.',
+'perfcached' => 'داده‌ئون زیر حاÙظهٔ موقت جه بَییته بَینه Ùˆ ممکن هسته کاملاً به‌روز نوائن. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
'wrong_wfQuery_params' => 'پارامترون wfQuery()‎ غلطه<br />
تابع: $1<br />
پرس‌وجو: $2',
'viewsource' => 'منبع ره بدی‌ین',
-'viewsourcefor' => '$1 ره وسه',
'actionthrottled' => 'شمه پیش ره بیتنه',
'protectedpagetext' => 'این صÙحه دچی‌ین وسّه زلÙین بزه بیّه.',
'viewsourcetext' => 'بتونّی متن مبدأ این صÙحه ره هارشین یا ونجه نسخه بَیرین:',
@@ -505,7 +559,6 @@ $2، $1',
شمه یاد دواشه که اگه شه ایمیل ره ننوشت بائین نتونی مدیرا وسه ایمیل بزنین اگه ایمیل ره ننوشنی ترجیحات دله بنویسین[[Special:Preferences|اینجه ایمیل ره بنویس]]
نشونی آی‌پی شما $3 Ùˆ شماره قطع دسترسی شما $5 هسته. حتما این دÙتا شوماره ره Ú¯Ù¾ بزوئن دله به کار بورین.",
'blockednoreason' => 'معلوم نی‌یه چچی وسه اینتی بیّه!',
-'whitelistedittitle' => 'جورهاکردن وسه ونه سیستم ره دله بیی',
'newarticle' => '(ترنه)',
'blocked-notice-logextract' => 'دسترسی اینتا کارور الآن دوستوئه.
آخرین مورد سیاهه قطع دسترسی زیر بموئه:',
@@ -750,9 +803,8 @@ $2، $1',
'enotif_anon_editor' => 'نشناسی‌یه کارور $1',
# Delete
-'deletepage' => 'صÙحه پاک هاکردن',
-'deletedarticle' => 'وربـأئـیـتـه بأیه "[[$1]]"',
-'dellogpage' => 'وه ره بییته‌ئون گوزارش',
+'deletepage' => 'صÙحه پاک هاکردن',
+'dellogpage' => 'وه ره بییته‌ئون گوزارش',
# Rollback
'rollback' => 'دچی‌یه‌ئون ره واچی‌ین',
@@ -767,8 +819,7 @@ $2، $1',
'restriction-upload' => 'باربی‌یشتن',
# Undelete
-'undeletelink' => 'بـأویـنـه‌ن / ده‌واره جـا بـیـه‌شـتـه‌ن',
-'undeletedarticle' => 'جـا دأکـه‌Ùـتـه "[[$1]]"',
+'undeletelink' => 'بـأویـنـه‌ن / ده‌واره جـا بـیـه‌شـتـه‌ن',
# Namespace form on various pages
'namespace' => 'نوم‌جا:',
@@ -811,7 +862,6 @@ $2، $1',
'newtitle' => 'ترنه نوم:',
'movepage-moved' => "'''ای «$1» ولـگ، بورده «$2» ره.'''",
'movetalk' => '«گپ» صÙحه هم، اگه وانه، بوره.',
-'1movedto2' => '[[$1]] بـورده [[$2]] ره',
'revertmove' => 'واچـیـه‌ن',
'delete_and_move_confirm' => 'أره، پاک هاکه‌ن وه ره',
@@ -944,4 +994,54 @@ $5
'specialpages' => 'شا صÙحه‌ئون',
'specialpages-group-maintenance' => 'چله‌بندی صÙحه‌ئون',
+# New logging system
+'logentry-newusers-newusers' => '$1 بساتن اتا حساب کاروری',
+'logentry-newusers-create' => '$1 بساتن اتا حساب کاروری',
+
+# Feedback
+'feedback-subject' => 'موضوع:',
+'feedback-message' => 'پیغوم:',
+'feedback-cancel' => 'ول هاکردن',
+'feedback-submit' => 'ارسال پیشنهادات و انتقادات',
+'feedback-adding' => 'بی‌یشتن پیشنهادات و انتقادات...',
+'feedback-error1' => 'خطا: جواب‌ئون نشناسی‌یه API جه',
+'feedback-error2' => 'خطا: شکست دچی‌ین سر',
+'feedback-error3' => 'خطا: جواب ندائن API',
+
+# API errors
+'api-error-badaccess-groups' => 'شما اجازهٔ باربی‌یشتن پرونده‌ها ره این ویکی دله ندارنی.',
+'api-error-badtoken' => 'خطای داخلی: کد امنیتی اشتبائه (Bad token).',
+'api-error-copyuploaddisabled' => 'باربی‌یشتن با استÙاده از نشونی اینترنتی این کارساز دله غیرÙعاله.',
+'api-error-duplicate' => '{{PLURAL:$1|[$2 پروندهٔ دیگه‌یی]|[$2 چن پروندهٔ دیگه]}} وب‌گاه دله با محتوای ات‌تی دیی‌یه.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|[$2 پروندهٔ دیگه‌یی]|[$2 چن پروندهٔ دیگه]}} وب‌گاه دله با محتوای اتجور وجود داشته، ولی حذ٠{{PLURAL:$1|بیی‌یه|بیی‌نه}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|پروندهٔ|پرونده‌ئون}} تکراری که اسا حذ٠بیی‌نه',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|پرونده|پرونده‌ئون}} تکراری',
+'api-error-empty-file' => 'پرونده‌ای که شما برسنینی خالی بی‌یه.',
+'api-error-fetchfileerror' => 'خطای داخلی: زمون بییتن پرونده، اتا چی درست پیش نشی‌یه.',
+'api-error-file-too-large' => 'پرونده‌ای که شما برسنینی خله خله گت بی‌یه.',
+'api-error-filename-tooshort' => 'پرونده ایسم خله خله پچیکه.',
+'api-error-filetype-banned' => 'این نوع پرونده ممنوعه.',
+'api-error-filetype-missing' => 'پرونده Ùرمت ندانّه.',
+'api-error-hookaborted' => 'اصلاحیه‌ای Ú©Ù‡ شما خاسنی وه ره بساجین، اÙزونه وه ره تله دمبدائه.',
+'api-error-http' => 'خطای داخلی: نتومبی به به سرور اتصال هادیم',
+'api-error-illegal-filename' => 'پرونده ایسم مجاز نی‌یه.',
+'api-error-internal-error' => 'خطای داخلی: با پردازش باربی‌یشتن شما ویکی سر، ات چی اشتباه پیش بورده.',
+'api-error-invalid-file-key' => 'خطای داخلی: پرونده حاÙظهٔ موقت سر دنی‌ئه.',
+'api-error-missingparam' => 'خطای داخلی: پارامترون درخاست ره ندارمی.',
+'api-error-missingresult' => 'خطای داخلی: نتونّی بÙهمین کپی‌رایت موÙÙ‚ بی‌یه یا نا.',
+'api-error-mustbeloggedin' => 'باربی‌یشتن پرونده‌ها وسّه شما ونه کاروری ایسم جا دَواشین.',
+'api-error-mustbeposted' => 'خطای داخلی: درخواست ونه روش POST HTTP جا ارسال بوو.',
+'api-error-noimageinfo' => 'باربی‌یشتن موÙÙ‚ بی‌یه، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده اما ره ندائه.',
+'api-error-nomodule' => 'خطای داخلی: ماژول باربی‌یشتن تنظیم نیی‌ئه.',
+'api-error-ok-but-empty' => 'خطای داخلی : سرور جه جواب نموئه.',
+'api-error-overwrite' => 'جای بنویشتن اتا پرونده موجود مجاز نی‌یه.',
+'api-error-stashfailed' => 'خطای داخلی: کارساز نتونده پرونده موقت ره ذخیره هاکنه.',
+'api-error-timeout' => 'کارساز زمون انتظار جواب ندائه.',
+'api-error-unclassified' => 'اتا خطای نشناسته دکته.',
+'api-error-unknown-code' => 'خطای نشناسی‌یه: " $1 "',
+'api-error-unknown-error' => 'خطای داخلی: زمونی که شما تلاش کاردنی باربی‌یشتن پرونده ره انجوم هادین، اتا چی اشتباه پیش بورده.',
+'api-error-unknown-warning' => 'اخطار نشناسی‌یه: $1',
+'api-error-uploaddisabled' => 'باربی‌یشتن این ویکی دله غیرÙعاله.',
+'api-error-verification-error' => 'ممکن هسته Ú©Ù‡ پرونده رÙÙ‚Ùد بورد بائه یا پسوند غلط داره.',
+
);
diff --git a/languages/messages/MessagesNa.php b/languages/messages/MessagesNa.php
index 7c3a2bb6..d45886f4 100644
--- a/languages/messages/MessagesNa.php
+++ b/languages/messages/MessagesNa.php
@@ -108,8 +108,7 @@ $messages = array(
'unwatch' => 'Eab krak',
# Delete
-'confirm' => 'Oebwigaga',
-'deletedarticle' => 'iyababa "[[$1]]"',
+'confirm' => 'Oebwigaga',
# Contributions
'contributions' => 'Mana engame totow inne',
diff --git a/languages/messages/MessagesNah.php b/languages/messages/MessagesNah.php
index 9f8e23c4..77d0f5a3 100644
--- a/languages/messages/MessagesNah.php
+++ b/languages/messages/MessagesNah.php
@@ -364,7 +364,6 @@ Hueli tlein Äquin Åquipolo achtopa.',
'badtitletext' => 'ZÄzanilli ticnequi in Ä«tÅca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tÅcÄhuicpa.
Hueliz quimpiya tlahtÅl tlein ahmo mohuelÄ«tih motequitiltia tÅcÄpan.',
'viewsource' => 'TiquittÄz tlahtÅlcaquiliztilÅni',
-'viewsourcefor' => '$1 Ä«techcopa',
'actionthrottled' => 'TlachÄ«hualiztli Åmotzacuili',
'viewsourcetext' => 'TihuelÄ«ti tiquitta auh ticcopÄ«na inÄ«n zÄzanilli Ä«tlahtÅlcaquiliztilÅni:',
'sqlhidden' => '(TlatÄ“moliztli SQL omotlÄti)',
@@ -476,9 +475,6 @@ Occeppa xicalaqui niman ticmatīz.',
'summary-preview' => 'TlahcuilÅltÅn achtochÄ«hualiztli:',
'blockedtitle' => 'Ōmotzacuili tlatequitiltilīlli',
'blockednoreason' => 'ahmo cah Ä«xtlamatiliztli',
-'blockedoriginalsource' => "NicÄn motta '''$1''' Ä«tlahtÅlcaquiliztilÅni:",
-'blockededitsource' => "'''Mopatlaliz''' Ä«tlahtÅl Ä«pan '''$1''' motta nicÄn:",
-'whitelistedittitle' => 'Tihuīquilia timocalaqui ic patla',
'whitelistedittext' => 'TihuÄ«quilia $1 ic ticpatla zÄzaniltin.',
'nosuchsectiontitle' => 'In xeliuhcÄyÅtl ahmo ÅquinÄmic',
'loginreqtitle' => 'Ximocalaqui',
@@ -509,7 +505,7 @@ TihuelÄ«ti [[Special:Search/{{PAGENAME}}|tictÄ“moa inÄ«n zÄzaniltÅcÄcopa]] oc
'yourdiff' => 'Ahneneuhquiliztli',
'copyrightwarning' => "<small>TimitztlÄtlauhtiah xiquitta mochi mopatlaliz cana {{SITENAME}} tlatzayÄna Ä«pan $2 (huÄ“hca Åmpa xiquitta $1). Ä€queh tlÄcah quipatlazqueh in motlahcuilÅl auh tlatzayÄna occeppa; intlÄ ahmÅ ticnequi, zÄtÄ“pan ahmÅ titlahcuilÅz nicÄn. NÅ mitzihtoah in Åtitlahcuiloh ahmÅ quipiya in copyright nozo in yÅllÅxoxouhqui tlahcuilÅlli. '''¡AHMÅŒ XITÄ’QUITILTIA AHYÅŒLLÅŒXOXOUHQUI TLAHCUILÅŒLLI!'''</small>",
'copyrightwarning2' => "<small>Ä€queh tlÄcah quipatlazqueh in motlahcuilÅl auh tlatzayÄna occeppa; intlÄ ahmÅ ticnequi, zÄtÄ“pan ahmÅ titlahcuilÅz nicÄn {{SITENAME}}. NÅ mitzihtoah in Åtitlahcuiloh ahmÅ quipiya in copyright nozo in yÅllÅxoxouhqui tlahcuilÅlli (huÄ“hca Åmpa xiquitta $1). '''¡AHMÅŒ TIQUINTEQUITILTIA AHYÅŒLLÅŒXOXOUHQUI TLAHCUILÅŒLLI!'''</small>",
-'longpageerror' => "'''AHCUALLÅŒTL: MotlahcuilÅl cah huÄ“iyac $1 KB, huehca Åmpa $2 KB. Ahmo mopiyÄz.'''",
+'longpageerror' => "'''AiuhcÄyÅtl: In tlahcuilÅlli tlein Åtiquihuah tlatamachÄ«hua {{PLURAL:$1|cÄ“ kilobyte|$1 kilobyte}}, tzonÄ“hua {{PLURAL:$2|cÄ“ kilobyte|$2 kilobyte}}. Ahmo mopiyÄz.'''",
'templatesused' => '{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn tlaìxtlapalli:',
'templatesusedpreview' => '{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn achtochìwalistli:',
'templatesusedsection' => '{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn tlaxélòlistli:',
@@ -576,13 +572,6 @@ Hueliz Åmopolo huiqui nozo Åmozacac.
'revdel-restore' => 'TicpatlÄz tlattaliztli',
'pagehist' => 'ZÄzanilli tlahcuilÅlloh',
'deletedhist' => 'ÅŒtlapolo tlahcuilÅlloh',
-'revdelete-content' => 'tlapiyaliztli',
-'revdelete-summary' => 'ticpatlÄz tlahcuilÅltÅn',
-'revdelete-uname' => 'tlatÄ“quitiltilÄ«ltÅcÄitl',
-'revdelete-hid' => 'xictlÄtia $1',
-'revdelete-unhid' => 'tiquittÄz $1',
-'revdelete-log-message' => '$1 ic $2 {{PLURAL:$2|tlachiyaliztli|tlachiyaliztli}}',
-'logdelete-log-message' => '$1 īhuīc $2 {{PLURAL:$2|tlachīhualiztli|tlachīhualiztli}}',
'revdelete-edit-reasonlist' => 'TiquimpatlÄz Ä«xtlamatiliztli tlapoloaliztechcopa',
# History merging
@@ -1010,17 +999,13 @@ Nò mà má»ta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
# Special:ListUsers
'listusers-submit' => 'TiquittÄz',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Yancuīc tlatequitiltilīlli',
-'newuserlog-create2-entry' => 'YancuÄ«c cuenta ÅmochÄ«uh $1',
-
# Special:ListGroupRights
'listgrouprights-group' => 'OlÅlli',
'listgrouprights-rights' => 'Huelītiliztli',
# E-mail user
'emailuser' => 'Tique-mailīz inīn tlatequitiltilīlli',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} correo tlatequitiltilīlhuīc $1',
'emailfrom' => 'Īhuīcpa:',
'emailto' => 'Īhuīc:',
'emailmessage' => 'TlahcuilÅltzintli:',
@@ -1085,7 +1070,6 @@ TÄ“tlamachÄ«tÄ«liztli Ä«huÄn oc yeh tÄ“palehuiliztli:
'actioncomplete' => 'CÄ“ntetl',
'deletedtext' => '"$1" Åmopolo.
Xiquitta $2 ic yancuīc tlapololiztli.',
-'deletedarticle' => 'Åmopolo "[[$1]]"',
'dellogpage' => 'Tlapololiztli tlahcuilÅlloh',
'deletionlog' => 'tlapololiztli tlahcuilÅlloh',
'deletecomment' => 'Īxtlamatiliztli:',
@@ -1125,7 +1109,6 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
'undeletebtn' => 'AhticpolÅz',
'undeletelink' => 'tiquittaz/ticpahtīz',
'undeleteviewlink' => 'tiquittÄz',
-'undeletedarticle' => 'Åticcualtilih "[[$1]]"',
'undelete-search-box' => 'TiquintlatÄ“mÅz zÄzaniltin ÅmopolÅz',
'undelete-search-prefix' => 'TiquittÄz zÄzaniltin mopÄ“hua Ä«ca:',
'undelete-search-submit' => 'TlatÄ“mÅz',
@@ -1226,8 +1209,6 @@ Hueliz cah inÄ«n huÄ“yi tlapatlaliztli. TimitztlÄtlauhtia ticmatÄ«z cuallÅtl a
'movetalk' => 'TiczacÄz nÅ tÄ“ixnÄmiquiliztli tlahcuilÅltechcopa.',
'movepage-page-moved' => 'ZÄzanilli $1 Åmozacac Ä«huÄ«c $2.',
'movepage-page-unmoved' => 'Ahmo huelīti $1 mozaca īhuīc $2.',
-'1movedto2' => '[[$1]] Åmozacac Ä«huÄ«c [[$2]]',
-'1movedto2_redir' => '[[$1]] Åmozacac Ä«huÄ«c [[$2]] tlacuepalpampa',
'movelogpage' => 'Tlazacaliztli tlahcuilÅlloh',
'movereason' => 'Īxtlamatiliztli:',
'revertmove' => 'tlacuepÄz',
@@ -1344,7 +1325,7 @@ Hueliz cah inÄ«n huÄ“yi tlapatlaliztli. TimitztlÄtlauhtia ticmatÄ«z cuallÅtl a
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:|zÄzanilli|zÄzanilli}}',
'file-info-size' => '$1 × $2 pixel; zÄzanilli octacayÅtl: $3; machiyÅtl MIME: $4',
-'file-nohires' => '<small>Ahmo ia achi cualli ahmo occē īxiptli.</small>',
+'file-nohires' => 'Ahmo ia achi cualli ahmo occē īxiptli.',
'show-big-image' => 'Mochi cuallÅtl',
# Special:NewFiles
@@ -1437,9 +1418,6 @@ Niman tihuelÄ«ti [[Special:UserLogin|timocalaqui]] auh ticpactiÄz huiquitica.',
# Scary transclusion
'scarytranscludetoolong' => '[In URL achi huel huēiyac ca]',
-# Trackbacks
-'trackbackremove' => '([$1 TicpolÅz])',
-
# Delete conflict
'recreate' => 'TicchÄ«huÄz occeppa',
@@ -1505,9 +1483,9 @@ Niman tihuelÄ«ti [[Special:UserLogin|timocalaqui]] auh ticpactiÄz huiquitica.',
# Special:SpecialPages
'specialpages' => 'Nònkuâkìskàtlaìxtlapaltìn',
'specialpages-note' => '----
-* Kèn sanỉman nònkuâkìskàtlaìxtlapaltìn.
-* <span class="mw-specialpagerestricted>Âmò tlakàwiltìn nònkuâkìskàtlaìxtlapaltìn.</span>
-* <span class="mw-specialpagecached">Tlatlaìxkopìnèuhtìn nònkuâkìskàtlaìxtlapaltìn.</span>',
+* Yeliztli nÅncuahquÄ«zqui Ämatl.
+* <span class="mw-specialpagerestricted">TlaquÄ«xtÄ«lli nÅncuahquÄ«zqui Ämatl.</span>
+* <span class="mw-specialpagecached">TlatlÄtÄ«lli nÅncuahquÄ«zqui Ämatl (aocmo monemitÄ«a).</span>',
'specialpages-group-other' => 'Oksẻki nònkuâkìskàtlaìxtlapaltìn',
'specialpages-group-login' => 'Ximocalaqui / ximomachiyÅmaca',
'specialpages-group-changes' => 'YancuÄ«c tlapatlaliztli Ä«huÄn tlahcuilÅlloh',
diff --git a/languages/messages/MessagesNan.php b/languages/messages/MessagesNan.php
index 4c92eadb..ce5c731a 100644
--- a/languages/messages/MessagesNan.php
+++ b/languages/messages/MessagesNan.php
@@ -374,22 +374,24 @@ NÄ mÌ„-sÄ« hit chióng chêng-hêng, lí khó-lêng tú tioÌh nÅ„g-thé ê chh
'formerror' => 'Chhò-gÅ·: bô-hoat-tÅ· kÄ pió sàng chhut khì.',
'badarticleerror' => 'BÄ“-tàng tiàm chit iaÌh chip-hêng chit ê tÅng-chok.',
'cannotdelete' => 'Bô-hoat-tÅ· kÄ "$1" hit ê iaÌh aÌh-sÄ« iáâ¿-siÅng thâi tiÄu. (Khó-lêng paÌt-lâng í-keng kÄ thâi tiÄu ah.)',
+'cannotdelete-title' => '無法度共"$1"這é åˆ£æŽ‰',
'badtitle' => 'M̄-chiâ⿠piau-tê',
'badtitletext' => 'Iau-kiû ê piau-tê sÄ« bô-hÄu ê, khang ê, aÌh-sÄ« liân-kiat chhò-gÅ· ê inter-language/inter-wiki piau-tê.',
-'perfcached' => 'Ä’-kha ê chu-liÄu tùi lâi--ê, só·-í bÄ«-pit oân-choân hoán-èng siÅng sin ê chÅng-hóng.',
-'perfcachedts' => 'Ä’-kha ê chu-liÄu tùi lâi--ê, tÄ« $1 keng-sin--koè.',
+'perfcached' => 'Ä’-kha ê chu-liÄu tùi lâi--ê, só·-í bÄ«-pit oân-choân hoán-èng siÅng sin ê chÅng-hóng. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ä’-kha ê chu-liÄu tùi lâi--ê, tÄ« $1 keng-sin--koè. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Chit-má bÄ“-sái kái chit iaÌh.
Chia ê chu-liÄu bÄ“-tàng sui tiông-sin chéng-lí.',
'wrong_wfQuery_params' => 'Chhò-ngÅ͘ ê chham-sò͘ chhoân hÅ͘ wfQuery()<br />
Hâm-sò͘: $1<br />
Cha-sûn: $2',
'viewsource' => 'Khoà⿠goân-sú lÅe-iông',
-'viewsourcefor' => '$1 ê',
+'viewsource-title' => '看$1的內容',
'actionthrottled' => 'TÅng-chok hông tóng leh.',
'actionthrottledtext' => 'Ūi-tioÌh thê-hông lah-sap ê chhú-tì, lí Å« hông hÄn-chè tÄ« té sî-kan lÄi chò siuâ¿ chÄ“ pái chit ê tÅng-chok, taâ¿ lí í-keng chhiau-koè hÄn-chè.
Chhiá⿠tÄ« kúi hun-cheng hÄu chiah koh chhì.',
'protectedpagetext' => 'Chit iaÌh hông só tiâu leh, bÄ“ pian-chiÌp tit.',
'viewsourcetext' => 'Lí Ä“-sái khoà⿠iaÌh khó͘-pih chit iaÌh ê goân-sú loÄ“-iông:',
+'viewyourtext' => "你會使共'''你的編輯'''的內容拷備來這é ï¼š",
'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.
@@ -487,6 +489,7 @@ TiÅ-sÄ« kóng, tÄ« chit-má iÅng chit ê IP bÄng-chí ê lâng bÄ“-sái koh k
'emailconfirmlink' => 'Chhiá⿠khak-jÄ«n lí ê e-mail chÅ«-chí Å«-hÄu',
'invalidemailaddress' => 'é›»å­æ‰¹çš„地å€ç„¡æ­£ç¢ºï¼Œè¦æ ¼æ¯‹è‘—,
è«‹æ‹ä¸€ä¸ªç¬¦åˆè¦æ ¼çš„地å€æŠ‘是放空格。',
+'cannotchangeemail' => 'å£åº§çš„e-mailä½å€ç„¡æ³•åº¦ä½‡é€™ä¸ªwiki改',
'accountcreated' => 'å£åº§é–‹å¥½çŸ£',
'accountcreatedtext' => '$1çš„å£åº§é–‹å¥½çŸ£',
'createaccount-title' => '佇{{SITENAME}}開好å£åº§',
@@ -503,6 +506,7 @@ TiÅ-sÄ« kóng, tÄ« chit-má iÅng chit ê IP bÄng-chí ê lâng bÄ“-sái koh k
# E-mail sending
'php-mail-error-unknown' => '佇PHP的 mail() 函數的未知錯誤',
+'user-mail-no-addy' => 'SiÅ«â¿ beh kià tiÄn-chú-phoe, mÌ„-koh bô siá tÄ“-chí.',
# Change password dialog
'resetpass' => 'Kái biÌt-bé',
@@ -523,32 +527,46 @@ TiÅ-sÄ« kóng, tÄ« chit-má iÅng chit ê IP bÄng-chí ê lâng bÄ“-sái koh k
'resetpass-temp-password' => 'Lîm-sî ê biÌt-bé:',
# Special:PasswordReset
-'passwordreset' => 'Têng siat biÌt-bé',
-'passwordreset-text' => '完æˆé€™ä¸ªè¡¨ï¼Œå°±é€šæ”¶è‘—一å°æ醒你å£åº§è©³æƒ…çš„é›»å­æ‰¹ã€‚',
-'passwordreset-legend' => 'Têng siat biÌt-bé',
-'passwordreset-disabled' => '佇這个Wiki已經ç¦æ­¢é‡è¨­å¯†ç¢¼',
-'passwordreset-pretext' => '{{PLURAL:$1||æ‹ä¸‹è·¤è³‡æ–™å…§åº•çš„一个}}',
-'passwordreset-username' => 'Lí ê iÅng-chiá miâ-chheng:',
-'passwordreset-domain' => '網域:',
-'passwordreset-email' => 'TiÄn-chú-phoe tÄ“-chí:',
-'passwordreset-emailtitle' => '佇{{SITENAME}}é¢é ‚çš„çš„å£åº§è©³ç´°',
-'passwordreset-emailtext-ip' => '有人(å¯èƒ½æ˜¯ä½ ï¼Œå°$1這IP)è¦æ±‚發一个{{SITENAME}}($4)å£åº§è©³æƒ…çš„æ示。彼个用戶{{PLURAL:$3|是|是}}佮下跤電å­æ‰¹åœ°å€æœ‰é—œä¿‚:
+'passwordreset' => 'Têng siat biÌt-bé',
+'passwordreset-text' => '完æˆé€™ä¸ªè¡¨ï¼Œå°±é€šæ”¶è‘—一å°æ醒你å£åº§è©³æƒ…çš„é›»å­æ‰¹ã€‚',
+'passwordreset-legend' => 'Têng siat biÌt-bé',
+'passwordreset-disabled' => '佇這个Wiki已經ç¦æ­¢é‡è¨­å¯†ç¢¼',
+'passwordreset-pretext' => '{{PLURAL:$1||æ‹ä¸‹è·¤è³‡æ–™å…§åº•çš„一个}}',
+'passwordreset-username' => 'Lí ê iÅng-chiá miâ-chheng:',
+'passwordreset-domain' => '網域:',
+'passwordreset-capture' => '敢欲看產生的電å­æ‰¹ï¼Ÿ',
+'passwordreset-capture-help' => '若你é¸é€™ä¸ªæ¡†ï¼Œé›»å­æ‰¹ï¼ˆåŒ…括臨時的密碼)會予你看著,而且傳é€äºˆç”¨è€…。',
+'passwordreset-email' => 'TiÄn-chú-phoe tÄ“-chí:',
+'passwordreset-emailtitle' => '佇{{SITENAME}}é¢é ‚çš„çš„å£åº§è©³ç´°',
+'passwordreset-emailtext-ip' => '有人(å¯èƒ½æ˜¯ä½ ï¼Œå°$1這IP)è¦æ±‚發一个{{SITENAME}}($4)å£åº§è©³æƒ…çš„æ示。彼个用戶{{PLURAL:$3|是|是}}佮下跤電å­æ‰¹åœ°å€æœ‰é—œä¿‚:
$2
{{PLURAL:$3|這个臨時密碼|é®çš„臨時密碼}}會佇{{PLURAL:$5|一工 |$5å·¥}}內到期。
你這馬應該登入,而且é¸æ“‡ä¸€ä¸ªæ–°å¯†ç¢¼ã€‚若是別人åšçš„è¦æ±‚,抑是你已經記
起來你的密碼,你閣無想欲改,你會當å…管這个信æ¯ï¼Œè€Œä¸”繼續用你的密碼。',
-'passwordreset-emailtext-user' => '佇{{SITENAME}}的用者$1è¦æ±‚發一个{{SITENAME}}($4)å£åº§è©³æƒ…çš„æ示。彼个用者{{PLURAL:$3|是|是}}佮下跤電å­æ‰¹åœ°å€æœ‰é—œä¿‚:
+'passwordreset-emailtext-user' => '佇{{SITENAME}}的用者$1è¦æ±‚發一个{{SITENAME}}($4)å£åº§è©³æƒ…çš„æ示。彼个用者{{PLURAL:$3|是|是}}佮下跤電å­æ‰¹åœ°å€æœ‰é—œä¿‚:
$2
{{PLURAL:$3|這个臨時密碼|é®çš„臨時密碼}}會佇{{PLURAL:$5|一工 |$5å·¥}}內到期。
你這馬應該登入,而且é¸ä¸€ä¸ªæ–°å¯†ç¢¼ã€‚若是別人åšçš„è¦æ±‚,抑是你已經記
起來你的密碼,你閣無想欲改,你會當å…管這个信æ¯ï¼Œè€Œä¸”繼續用你的密碼。',
-'passwordreset-emailelement' => 'IÅng-chiá: $1
+'passwordreset-emailelement' => 'IÅng-chiá: $1
Lîm-sî ê biÌt-bé: $2',
-'passwordreset-emailsent' => 'Chit hong thê-chhí⿠ê tiÄn-chú-phoe í-keng kià chhut.',
+'passwordreset-emailsent' => 'Chit hong thê-chhí⿠ê tiÄn-chú-phoe í-keng kià chhut.',
+'passwordreset-emailsent-capture' => '一張æ醒的電å­æ‰¹å·²ç¶“寄出,佇下é¢é€šçœ‹è‘—。',
+'passwordreset-emailerror-capture' => '一張æ醒的電å­æ‰¹å·²ç¶“寫好,佇下é¢é€šçœ‹è‘—,毋éŽé€è¢‚到用者: $1。',
+
+# Special:ChangeEmail
+'changeemail' => 'Kái tiÄn-chú-phoe ê tÄ“-chí',
+'changeemail-header' => '改å£åº§çš„é›»å­æ‰¹åœ°å€ã€‚',
+'changeemail-text' => '共這个表寫了,æ‰é€šæ”¹ä½ çš„é›»å­æ‰¹åœ°å€ï¼Œä½ å˜›æ„›æ‹å¯†ç¢¼ä¾†ç¢ºå®šä½ æ¬²æ”¹ã€‚',
+'changeemail-oldemail' => 'Chit-má ê E-mail tē-chí:',
+'changeemail-newemail' => 'Sin E-mail ê chū-chí:',
+'changeemail-none' => '(無)',
+'changeemail-submit' => '改電å­æ‰¹',
+'changeemail-cancel' => 'Chhú-siau',
# Edit page toolbar
'bold_sample' => 'Chho·-thé bûn-jī',
@@ -616,9 +634,6 @@ Lîm-sî ê biÌt-bé: $2',
你這馬的IP地å€æ˜¯$3,被å°éŽ–用者ID是 #$5,
請佇你的查詢當中,註明é¢é ‚所有的資料。",
'blockednoreason' => '無寫ç†ç”±',
-'blockedoriginalsource' => "下跤顯示的是'''$1'''的原始碼:",
-'blockededitsource' => "ä½ å°'''$1'''所'''編輯'''的文字顯示佇下跤:",
-'whitelistedittitle' => 'Su-iàu teng-jiÌp chiah Ä“-sái siu-kái',
'whitelistedittext' => 'Lí ài $1 chiah ē-sái siu-kái.',
'confirmedittext' => '佇改這é é€²å‰ï¼Œä½ æ„›ç¢ºèªä½ çš„é›»å­æ‰¹åœ°å€ï¼Œ
è«‹é€éŽ[[Special:Preferences|用者設便]]的設定來驗證你的電å­æ‰¹åœ°å€ã€‚',
@@ -702,7 +717,7 @@ Lí ê kái-piàn tÄ« Ä“-kha ê bûn-jÄ«-keh. Lí su-iàu chiÅng lí chò ê kÃ
若你無希望你寫的文字hông無情修改,就毋莫佇é®æ交。<br />
你嘛å‘阮ä¿è­‰é€™æ˜¯ä½ å®¶å·±å¯«çš„,抑是å°ç„¡ç‰ˆæ¬ŠæŠ‘有授權(看$1的說明)çš„é抄來的。
'''毋通無授權就é€å‡ºæœ‰ç‰ˆæ¬Šä½œå“ï¼'''",
-'longpageerror' => "'''錯誤: ä½ é€å‡ºä¾†çš„文章長度有$1KB,這大éŽ$2KB的上大界é™ã€‚'''
+'longpageerror' => "'''錯誤: ä½ é€å‡ºä¾†çš„文章長度有{{PLURAL:$1|1 KB|$1 KB}} ,這大éŽ{{PLURAL:$2|1 KB|$2 KB}}的上大界é™ã€‚'''
伊無法度ä¿å­˜ã€‚",
'readonlywarning' => "'''CHÙ-ÃŒ: Chu-liÄu-khò· taâ¿ só tiâu leh thang pÄn î-siu khang-khòe, só·-í lí hiÄn-chú-sî bô thang pó-chûn jÄ«n-hô phian-chiÌp hÄng-boÌk. Lí Ä“-sái kÄ siong-koan pÅ·-hÅ«n tah--jiÌp-khì 1-ê bûn-jÄ« tóng-àn pó-chûn, Äu-chhiú chiah koh kè-sioÌk.'''
@@ -869,8 +884,6 @@ $3å…±ç¦æ­¢çš„原因是 ''$2''。",
'revdelete-unsuppress' => 'å…±æ¢å¾©çš„修訂本徙掉é™åˆ¶',
'revdelete-log' => 'ç†ç”±ï¼š',
'revdelete-submit' => 'å°æ‰€é¸çš„{{PLURAL:$1|修訂本}}來施實',
-'revdelete-logentry' => '改"[[$1]]"修訂本的å¯è¦‹æ€§è³ª',
-'logdelete-logentry' => '改"[[$1]]"的一个事件å¯è¦‹æ€§è³ª',
'revdelete-success' => "'''改修訂本是毋是通予人看,已經改好矣'''",
'revdelete-failure' => "'''改修訂本是毋是通予人看的動作無æˆåŠŸ'''
$1",
@@ -882,15 +895,6 @@ $1",
'revdel-restore-visible' => '看會著的修訂本',
'pagehist' => 'é çš„æ­·å²',
'deletedhist' => '已經刣掉的歷å²',
-'revdelete-content' => '內容',
-'revdelete-summary' => '編輯概è¦',
-'revdelete-uname' => '用者å稱',
-'revdelete-restricted' => '已經共é™åˆ¶ç”¨ä½‡ç®¡è£¡å“¡',
-'revdelete-unrestricted' => '徙走å°ç®¡è£¡å“¡çš„é™åˆ¶',
-'revdelete-hid' => 'éš±è— $1',
-'revdelete-unhid' => 'ç„¡éš±è— $1',
-'revdelete-log-message' => '$1的{{PLURAL:$2|个|个}}修訂本',
-'logdelete-log-message' => '$1的{{PLURAL:$2|項|項}}事件',
'revdelete-hide-current' => '當咧隱è—佇$1 $2的項目錯誤:這是這馬的修訂本,袂使隱è—。',
'revdelete-show-no-access' => '當咧顯示佇$1 $2的項目錯誤:這个項目已經標示åš"有é™åˆ¶",
你袂當處ç†ã€‚',
@@ -1045,12 +1049,14 @@ $1",
'prefs-rc' => 'Chòe-kīn ê kái-piàn & stub ê hián-sī',
'prefs-watchlist' => 'Kàm-sÄ«-toaâ¿',
'prefs-watchlist-days' => 'Kàm-sÄ«-toaâ¿ hián-sÄ« kúi kang lÄi--ê:',
-'prefs-watchlist-days-max' => '上濟七工',
+'prefs-watchlist-days-max' => '上濟$1 {{PLURAL:$1|工|工}}',
'prefs-watchlist-edits' => 'Khok-chhiong ê kàm-sÄ«-toaâ¿ tioÌh hián-sÄ« kúi hÄng pian-chiÌp:',
'prefs-watchlist-edits-max' => '上大的數目:1000',
'prefs-watchlist-token' => '監視列表的密鑰:',
'prefs-misc' => 'Kî-tha⿠ê siat-tēng',
'prefs-resetpass' => '改密碼',
+'prefs-changeemail' => '改電å­æ‰¹çš„地å€',
+'prefs-setemail' => '設定一个電å­æ‰¹åœ°å€',
'prefs-email' => 'é›»å­æ‰¹çš„é¸é …',
'prefs-rendering' => '外觀',
'saveprefs' => 'Pó-chûn siat-tēng',
@@ -1110,6 +1116,7 @@ $1",
'yourrealname' => 'Lí ê chin miâ:',
'yourlanguage' => 'Kài-bīn gú-giân:',
'yourvariant' => 'é å…§å®¹çš„語文:',
+'prefs-help-variant' => '你希望這个Wiki的內容顯示的時陣所使用的語文',
'yournick' => 'Lí ê sió-miâ (chhiam-miâ iÅng):',
'prefs-help-signature' => '佇討論é çš„評論應該愛用「<nowiki>~~~~</nowiki>ã€ç°½å,彼會轉變åšä½ çš„ç°½å佮戳å°ä¸€ä¸ªæ™‚間。',
'badsig' => '錯誤的原始簽å,
@@ -1153,6 +1160,7 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'userrights-lookup-user' => '管ç†ç”¨è€…的陣營',
'userrights-user-editname' => '輸入一个用者å稱:',
'editusergroup' => '設定用者的陣營',
+'editinguser' => "改用者'''[[User:$1|$1]]'''$2 的使用權利",
'userrights-editusergroup' => '設定用者的陣營',
'saveusergroups' => 'ä¿å­˜ç”¨è€…的陣營',
'userrights-groupsmember' => 'æˆå“¡ï¼š',
@@ -1246,13 +1254,13 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'right-autopatrol' => '家己的編輯自動標示åšå·¡éŽ',
'right-patrolmarks' => '看最近巡查編輯的標記',
'right-unwatchedpages' => '看é ç„¡äººç›£è¦–的清單',
-'right-trackback' => 'é€å‡ºä¸€ä¸ªtrackback',
'right-mergehistory' => '相佮一寡é çš„æ­·å²',
'right-userrights' => '編輯所有用者的權利é™åˆ¶',
'right-userrights-interwiki' => '編輯å°å…¶å®ƒwiki來的用者權é™',
'right-siteadmin' => 'å°éŽ–閣開鎖資料庫',
'right-override-export-depth' => '輸出é ï¼ŒåŒ…括連到的é åˆ°5層深',
'right-sendemail' => '寄電å­æ‰¹äºˆå…¶ä»–用者',
+'right-passwordreset' => '看é‡è¨­å¯†ç¢¼çš„é›»å­æ‰¹',
# User rights log
'rightslog' => '用者使用權記錄',
@@ -1286,16 +1294,17 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'action-suppressionlog' => '看這个ç§äººè¨˜éŒ„',
'action-block' => 'å°éŽ–這个用者,予伊袂當編輯',
'action-protect' => '改這é çš„ä¿è­·å±¤ç´š',
+'action-rollback' => 'å…±æŸä¸€é çš„頂一个用戶所åšçš„編輯鉸轉去',
'action-import' => 'å°åˆ¥ä¸ªWiki匯入這é ',
'action-importupload' => 'å°ä¸€ä¸ªä¸Šè¼‰æª”案匯入這é ',
'action-patrol' => '標示其它的編輯是巡éŽçš„',
'action-autopatrol' => '你的編輯標示åšå·²å·¡æŸ¥éŽ',
'action-unwatchedpages' => '看無予人監視的é åˆ—å–®',
-'action-trackback' => 'é€äº¤ä¸€ä¸ªtrackback',
'action-mergehistory' => '相佮這é çš„æ­·å²',
'action-userrights' => '編輯所有用者的權é™',
'action-userrights-interwiki' => '編輯å°å…¶å®ƒwiki來的用者權é™',
'action-siteadmin' => 'å°éŽ–抑開鎖資料庫',
+'action-sendemail' => '寄電å­æ‰¹',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|改|改}}',
@@ -1327,6 +1336,7 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'number_of_watching_users_pageview' => '[$1个愛注æ„çš„{{PLURAL:$1|用者|用者}}]',
'rc_categories' => '分類界線(以"|"分開)',
'rc_categories_any' => '任何',
+'rc-change-size-new' => '改了後有$1 {{PLURAL:$1|字元|字元}} 。',
'newsectionsummary' => '/* $1 */ 新段è½',
'rc-enhanced-expand' => '看內容(愛有JavaScript)',
'rc-enhanced-hide' => 'è—內容',
@@ -1380,6 +1390,7 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'minlength1' => '檔案的å上少愛有一字',
'illegalfilename' => '檔案å“$1â€æœ‰è¢‚用得用佇標題的字,
請改å了後é‡æ–°ä¸Šè¼‰ã€‚',
+'filename-toolong' => '檔案的å長度袂使超éŽ240ä½å…ƒçµ„',
'badfilename' => 'Iáâ¿-siÅng ê miâ í-keng kái chò "$1".',
'filetype-mime-mismatch' => '副檔å ".$1" ä½® ($2)çš„MIMEé¡žåž‹ç„¡åˆã€‚',
'filetype-badmime' => 'MIME類別"$1"的檔案袂當上載',
@@ -1479,6 +1490,24 @@ $1',
'upload-unknown-size' => '大å°æ¯‹çŸ¥',
'upload-http-error' => '發生一个HTTP錯誤:$1',
+# File backend
+'backend-fail-stream' => '無法度串æµæª”案$1',
+'backend-fail-backup' => '無法度備份檔案$1',
+'backend-fail-notexists' => '無$1這个檔案',
+'backend-fail-hashes' => '無法度讀著檔案散列值(hashe)通比並',
+'backend-fail-notsame' => '已經有$1ä»åã€ç„¡ä»æ¬¾çš„檔案。',
+'backend-fail-invalidpath' => '$1這个囥的路徑怪怪',
+'backend-fail-delete' => 'Bô-hoat-tÅ· kÄ tóng-àn "$1" thâi tiÄu',
+'backend-fail-alreadyexists' => '已經有$1這个檔案。',
+'backend-fail-store' => '無法度æ¢è¤‡ä½‡$2的檔案$1。',
+'backend-fail-copy' => '無法度共佇$1的檔案khop去$2。',
+'backend-fail-move' => '無法度共佇$1的檔案徙去$2。',
+'backend-fail-opentemp' => '無法度建立臨時檔案',
+'backend-fail-writetemp' => '無法度寫入去臨時檔案',
+'backend-fail-closetemp' => '無法度徙掉臨時檔案',
+'backend-fail-read' => '無法度讀$1這个檔案',
+'backend-fail-create' => '無法度建立$1這个檔案。',
+
# img_auth script messages
'img-auth-accessdenied' => '拒絕讀寫',
'img-auth-notindir' => '你欲用的路徑無佇事先設定的上載目錄當中。',
@@ -1745,12 +1774,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'activeusers-hidesysops' => '掩管ç†å“¡',
# Special:Log/newusers
-'newuserlogpage' => '用者建立的記錄',
-'newuserlogpagetext' => '這是開用者å£åº§çš„記錄',
-'newuserlog-byemail' => '用電å­æ‰¹å¯„密碼',
-'newuserlog-create-entry' => '新用者å£åº§',
-'newuserlog-create2-entry' => '開一个$1çš„æ–°å£åº§',
-'newuserlog-autocreate-entry' => 'å£åº§å·²ç¶“自動開好',
+'newuserlogpage' => '用者建立的記錄',
+'newuserlogpagetext' => '這是開用者å£åº§çš„記錄',
# Special:ListGroupRights
'listgrouprights' => '用者陣權利',
@@ -1832,8 +1857,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'actioncomplete' => 'Chip-hêng sêng-kong',
'actionfailed' => 'åšç„¡æˆ',
'deletedtext' => '"$1" í-keng thâi tiÄu. Tùi $2 khoàâ¿-Ä“-tioÌh chòe-kÄ«n thâi ê kì-loÌk.',
-'deletedarticle' => 'Thâi tiÄu "[[$1]]"',
-'suppressedarticle' => 'å…±"[[$1]]"å´æŽ‰',
'dellogpage' => '刣掉的記錄',
'dellogpagetext' => 'Ã-hÄ liaÌt chhut chòe-kÄ«n thâi tiÄu ê hÄng-boÌk.',
'deletionlog' => '刣掉的記錄',
@@ -1886,6 +1909,7 @@ Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-s
'protect-unchain-permissions' => '解除更加ä¿è­·çš„é¸é …',
'protect-locked-blocked' => "你袂當佇å°éŽ–的時陣改ä¿è­·ç­‰ç´šï¼Œ
下跤是'''$1'''這馬的ä¿è­·ç­‰ç´š:",
+'protect-expiring-local' => '佇$1到期',
'protect-cascade' => 'Cascading protection - pó-hÅ͘ jÄ«m-hô pau-hâm tÄ« chit iaÌh ê iaÌh.',
'protect-othertime' => '其他的時間:',
'protect-othertime-op' => '其他的時間',
@@ -1918,7 +1942,6 @@ Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-s
'undeleteviewlink' => 'Khoàâ¿',
'undeletereset' => '設便',
'undeletecomment' => 'ç†ç”±ï¼š',
-'undeletedarticle' => 'kiù "[[$1]]"',
'undelete-search-box' => 'æ£åˆ£æŽ‰çš„é ',
# Namespace form on various pages
@@ -1993,6 +2016,7 @@ Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-s
'unblocklink' => 'å–消å°éŽ–',
'change-blocklink' => '改å°éŽ–',
'contribslink' => 'kòng-hiàn',
+'emaillink' => '寄電å­æ‰¹',
'autoblocker' => 'ChÅ«-tÅng kìm-chí lí sú-iÅng, in-Å«i lí kap "$1" kong-ke kÄng 1 ê IP chÅ«-chí (kìm-chí lí-iû "$2").',
'blocklogpage' => 'å°éŽ–記錄',
'blocklogentry' => 'hong-só [[$1]], siat kî-hÄn chì $2 $3',
@@ -2051,8 +2075,6 @@ Liâu--loÌh-khì chìn-chêng, chhiá⿠seng khak-tÄ“ng lí Å« liáu-kái chia
'movetalk' => 'SÅ«n-sòa sóa thó-lÅ«n-iaÌh',
'movepage-page-moved' => '$1 í-keng sóa khì tī $2.',
'movepage-page-unmoved' => '$1這é è¢‚當徙去$2',
-'1movedto2' => '[[$1]] sóa khì tī [[$2]]',
-'1movedto2_redir' => '[[$1]] sóa khì [[$2]] (choán-iaÌh thiàu kòe)',
'movelogpage' => 'å¾™ä½è¨˜éŒ„',
'movelogpagetext' => 'Ä’-kha liaÌt-chhut hông soá-Å«i ê iaÌh.',
'movenosubpage' => '這é ç„¡ä¸‹é ',
@@ -2161,9 +2183,6 @@ Lí ē-sái khoà⿠i ê goân-sú-bé.',
# Patrol log
'patrol-log-page' => '巡查記錄',
'patrol-log-header' => '這是一个已經巡查éŽçš„修訂本記錄',
-'patrol-log-line' => '$2的版本$1已經記號åšå·¡æŸ¥éŽ$3',
-'patrol-log-auto' => '(自動)',
-'patrol-log-diff' => '修訂本 $1',
'log-show-hide-patrol' => '$1巡查記錄',
# Image deletion
@@ -2178,7 +2197,7 @@ Lí ē-sái khoà⿠i ê goân-sú-bé.',
'imagemaxsize' => 'Iáâ¿-siÅng biô-suÌt-iaÌh ê tô· keÌk-ke hián-sÄ« jÅa tÅa tiuâ¿:',
'thumbsize' => 'Sok-tô· (thumbnail) jÅa tÅa tiuâ¿:',
'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大細:$3,MIME類型:$4',
-'file-nohires' => '<small>Bô khah koân ê kái-sek-tÅ͘.</small>',
+'file-nohires' => 'Bô khah koân ê kái-sek-tÅ͘.',
'svg-long-desc' => 'SVG 檔案,一般的長闊:$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3',
'show-big-image' => '檔案解æžåº¦',
@@ -2380,4 +2399,9 @@ Chit tiuâ¿ phoe ê khak-jÄ«n-bé Ä“ chÅ«-tÅng tÄ« $4 kòe-kî.',
'htmlform-required' => '這个數é‡æ„›å¯«',
'htmlform-selectorother-other' => '其他',
+# New logging system
+'revdelete-restricted' => '已經共é™åˆ¶ç”¨ä½‡ç®¡è£¡å“¡',
+'revdelete-unrestricted' => '徙走å°ç®¡è£¡å“¡çš„é™åˆ¶',
+'newuserlog-byemail' => '用電å­æ‰¹å¯„密碼',
+
);
diff --git a/languages/messages/MessagesNap.php b/languages/messages/MessagesNap.php
index 3e03722c..0693038a 100644
--- a/languages/messages/MessagesNap.php
+++ b/languages/messages/MessagesNap.php
@@ -246,21 +246,20 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
'image_tip' => 'Fiura ncuorporata',
# Edit pages
-'minoredit' => 'Chisto è nu cagnamiénto piccerillo',
-'watchthis' => "Tiene d'uocchio chesta paggena",
-'savearticle' => "Sarva 'a paggena",
-'preview' => 'Anteprimma',
-'showpreview' => 'Vere anteprimma',
-'showdiff' => "Fa veré 'e cagnamiente",
-'blockededitsource' => "Ccà sotto venono mmustate 'e '''cagnamiente fatte''' â paggena '''$1''':",
-'loginreqtitle' => "Pe' cagnà chesta paggena abbesognate aseguì ll'acciesso ô sito.",
-'loginreqlink' => "aseguì ll'acciesso",
-'loginreqpagetext' => "Pe' veré ate ppaggene abbesognate $1.",
-'accmailtitle' => "'O password è stato mannato.",
-'accmailtext' => '\'A password pe ll\'utente "$1" fuje mannata ô nnerizzo $2.',
-'previewnote' => "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena NUN songo ancora sarvate!'''",
-'editing' => "Cagnamiento 'e $1",
-'templatesused' => "Template ausate 'a chesta paggena:",
+'minoredit' => 'Chisto è nu cagnamiénto piccerillo',
+'watchthis' => "Tiene d'uocchio chesta paggena",
+'savearticle' => "Sarva 'a paggena",
+'preview' => 'Anteprimma',
+'showpreview' => 'Vere anteprimma',
+'showdiff' => "Fa veré 'e cagnamiente",
+'loginreqtitle' => "Pe' cagnà chesta paggena abbesognate aseguì ll'acciesso ô sito.",
+'loginreqlink' => "aseguì ll'acciesso",
+'loginreqpagetext' => "Pe' veré ate ppaggene abbesognate $1.",
+'accmailtitle' => "'O password è stato mannato.",
+'accmailtext' => '\'A password pe ll\'utente "$1" fuje mannata ô nnerizzo $2.',
+'previewnote' => "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena NUN songo ancora sarvate!'''",
+'editing' => "Cagnamiento 'e $1",
+'templatesused' => "Template ausate 'a chesta paggena:",
# "Undo" feature
'undo-summary' => "Canciella 'o cagnamiento $1 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|Chiàcchiera]])",
@@ -373,7 +372,6 @@ Also see [[Special:WantedCategories|wanted categories]].",
'exblank' => "'a paggena era vacante",
'actioncomplete' => 'Azzione fernuta',
'deletedtext' => 'Qauccheruno ha scancellata \'a paggena "$1". Addumannà \'o $2 pe na lista d"e ppaggene scancellate urdemamente.',
-'deletedarticle' => 'ha scancellato "[[$1]]"',
'dellogpage' => 'Scancellazione',
'deletionlog' => 'Log d"e scancellazione',
'deletecomment' => 'Raggióne',
@@ -419,8 +417,6 @@ Also see [[Special:WantedCategories|wanted categories]].",
'movepagebtn' => "Spusta 'a paggena",
'articleexists' => "Na paggena cu chisto nomme asiste già, o pure 'o nomme scegliuto nun è buono. Scegliere n'ato titulo.",
'movedto' => 'spustata a',
-'1movedto2' => 'ha spustato [[$1]] a [[$2]]',
-'1movedto2_redir' => '[[$1]] spustata a [[$2]] trammeto redirect',
'movereason' => 'Raggióne',
'delete_and_move' => 'Scancèlla e spusta',
'delete_and_move_confirm' => "Sì, suprascrivi 'a paggena asistente",
@@ -476,9 +472,6 @@ Also see [[Special:WantedCategories|wanted categories]].",
'confirmemail_needlogin' => "Abbesognate $1 pe cunfirmà 'o nnerizzo 'e e-mail d''o vuosto.",
'confirmemail_loggedin' => "'O nnerizzo 'e e-mail è vàleto",
-# Trackbacks
-'trackbackremove' => '([$1 Scarta])',
-
# Delete conflict
'deletedwhileediting' => 'Attenziòne: quaccherùno have scancellàto chesta pàggena prìmma ca tu accuminciàste â scrìvere!',
diff --git a/languages/messages/MessagesNb.php b/languages/messages/MessagesNb.php
index 725251f0..1869eea2 100644
--- a/languages/messages/MessagesNb.php
+++ b/languages/messages/MessagesNb.php
@@ -17,20 +17,291 @@
* @author Finnrind
* @author Guaca
* @author H92
+ * @author Harald Khan
* @author Jóna Þórunn
* @author Kph
+ * @author Kph-no
* @author Laaknor
* @author Najami
* @author Nghtwlkr
* @author Njardarlogar
* @author Nsaa
+ * @author Purodha
* @author Qaqqalik
+ * @author Samuelsen
* @author Simny
+ * @author Sjurhamre
* @author Stigmj
+ * @author Teak
* @author לערי ריינה×רט
*/
-$fallback = 'no';
+$bookstoreList = array(
+ 'Antikvariat.net' => 'http://www.antikvariat.net/',
+ 'Frida' => 'http://wo.uio.no/as/WebObjects/frida.woa/wa/fres?action=sok&isbn=$1&visParametre=1&sort=alfabetisk&bs=50',
+ 'Bibsys' => 'http://ask.bibsys.no/ask/action/result?cmd=&kilde=biblio&fid=isbn&term=$1&op=and&fid=bd&term=&arstall=&sortering=sortdate-&treffPrSide=50',
+ 'Akademika' => 'http://www.akademika.no/sok.php?ts=4&sok=$1',
+ 'Haugenbok' => 'http://www.haugenbok.no/resultat.cfm?st=extended&isbn=$1',
+ 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+);
+
+$namespaceNames = array(
+ NS_MEDIA => 'Medium',
+ NS_SPECIAL => 'Spesial',
+ NS_TALK => 'Diskusjon',
+ NS_USER => 'Bruker',
+ NS_USER_TALK => 'Brukerdiskusjon',
+ NS_PROJECT_TALK => '$1-diskusjon',
+ NS_FILE => 'Fil',
+ NS_FILE_TALK => 'Fildiskusjon',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki-diskusjon',
+ NS_TEMPLATE => 'Mal',
+ NS_TEMPLATE_TALK => 'Maldiskusjon',
+ NS_HELP => 'Hjelp',
+ NS_HELP_TALK => 'Hjelpdiskusjon',
+ NS_CATEGORY => 'Kategori',
+ NS_CATEGORY_TALK => 'Kategoridiskusjon',
+);
+
+$namespaceAliases = array(
+ 'Bilde' => NS_FILE,
+ 'Bildediskusjon' => NS_FILE_TALK,
+);
+
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
+$linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'M j., Y',
+ 'mdy both' => 'M j., Y "kl." H:i',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j. M Y',
+ 'dmy both' => 'j. M Y "kl." H:i',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y M j.',
+ 'ymd both' => 'Y M j. "kl." H:i',
+);
+
+$specialPageAliases = array(
+ 'Activeusers' => array( 'Aktive_brukere' ),
+ 'Allmessages' => array( 'Alle_systembeskjeder' ),
+ 'Allpages' => array( 'Alle_sider' ),
+ 'Ancientpages' => array( 'Gamle_sider' ),
+ 'Badtitle' => array( 'Ugyldig_tittel' ),
+ 'Blankpage' => array( 'Blank_side' ),
+ 'Block' => array( 'Blokker', 'Blokker_IP', 'Blokker_bruker' ),
+ 'Blockme' => array( 'Blokker_meg' ),
+ 'Booksources' => array( 'Bokkilder' ),
+ 'BrokenRedirects' => array( 'Ødelagte_omdirigeringer' ),
+ 'Categories' => array( 'Kategorier' ),
+ 'ChangePassword' => array( 'Endre_passord', 'TIlbakestill_passord' ),
+ 'ComparePages' => array( 'Sammenlign_sider' ),
+ 'Confirmemail' => array( 'Bekreft_e-postadresse' ),
+ 'Contributions' => array( 'Bidrag' ),
+ 'CreateAccount' => array( 'Opprett_konto' ),
+ 'Deadendpages' => array( 'Blindveisider' ),
+ 'DeletedContributions' => array( 'Slettede_bidrag' ),
+ 'Disambiguations' => array( 'Pekere' ),
+ 'DoubleRedirects' => array( 'Doble_omdirigeringer' ),
+ 'Emailuser' => array( 'E-post' ),
+ 'Export' => array( 'Eksporter' ),
+ 'Fewestrevisions' => array( 'Færrest_revisjoner' ),
+ 'FileDuplicateSearch' => array( 'Filduplikatsøk' ),
+ 'Filepath' => array( 'Filsti' ),
+ 'Import' => array( 'Importer' ),
+ 'Invalidateemail' => array( 'Ugyldiggjøre_e-post' ),
+ 'BlockList' => array( 'Blokkeringsliste', 'IP-blokkeringsliste' ),
+ 'LinkSearch' => array( 'Lenkesøk' ),
+ 'Listadmins' => array( 'Administratorliste', 'Administratorer' ),
+ 'Listbots' => array( 'Robotliste', 'Liste_over_roboter' ),
+ 'Listfiles' => array( 'Filliste', 'Bildeliste', 'Billedliste' ),
+ 'Listgrouprights' => array( 'Grupperettigheter' ),
+ 'Listredirects' => array( 'Omdirigeringsliste' ),
+ 'Listusers' => array( 'Brukerliste' ),
+ 'Lockdb' => array( 'LÃ¥s_database' ),
+ 'Log' => array( 'Logg', 'Logger' ),
+ 'Lonelypages' => array( 'Foreldreløse_sider' ),
+ 'Longpages' => array( 'Lange_sider' ),
+ 'MergeHistory' => array( 'Flett_historikk' ),
+ 'MIMEsearch' => array( 'MIME-søk' ),
+ 'Mostcategories' => array( 'Flest_kategorier' ),
+ 'Mostimages' => array( 'Mest_lenkede_filer', 'Flest_filer', 'Flest_bilder' ),
+ 'Mostlinked' => array( 'Mest_lenkede_sider', 'Mest_lenket' ),
+ 'Mostlinkedcategories' => array( 'Mest_lenkede_kategorier', 'Mest_brukte_kategorier' ),
+ 'Mostlinkedtemplates' => array( 'Mest_lenkede_maler', 'Mest_brukte_maler' ),
+ 'Mostrevisions' => array( 'Flest_revisjoner' ),
+ 'Movepage' => array( 'Flytt_side' ),
+ 'Mycontributions' => array( 'Mine_bidrag' ),
+ 'Mypage' => array( 'Min_side' ),
+ 'Mytalk' => array( 'Min_diskusjon' ),
+ 'Newimages' => array( 'Nye_filer', 'Nye_bilder' ),
+ 'Newpages' => array( 'Nye_sider' ),
+ 'PasswordReset' => array( 'Nullstill_passord' ),
+ 'Popularpages' => array( 'Populære_sider' ),
+ 'Preferences' => array( 'Innstillinger' ),
+ 'Prefixindex' => array( 'Prefiksindeks' ),
+ 'Protectedpages' => array( 'Beskyttede_sider' ),
+ 'Protectedtitles' => array( 'Beskyttede_titler' ),
+ 'Randompage' => array( 'Tilfeldig', 'Tilfeldig_side' ),
+ 'Randomredirect' => array( 'Tilfeldig_omdirigering' ),
+ 'Recentchanges' => array( 'Siste_endringer' ),
+ 'Recentchangeslinked' => array( 'Relaterte_endringer' ),
+ 'Revisiondelete' => array( 'Revisjonssletting' ),
+ 'RevisionMove' => array( 'Revisjonsflytting' ),
+ 'Search' => array( 'Søk' ),
+ 'Shortpages' => array( 'Korte_sider' ),
+ 'Specialpages' => array( 'Spesialsider' ),
+ 'Statistics' => array( 'Statistikk' ),
+ 'Tags' => array( 'Tagger' ),
+ 'Unblock' => array( 'Avblokker' ),
+ 'Uncategorizedcategories' => array( 'Ukategoriserte_kategorier' ),
+ 'Uncategorizedimages' => array( 'Ukategoriserte_filer', 'Ukategoriserte_bilder' ),
+ 'Uncategorizedpages' => array( 'Ukategoriserte_sider' ),
+ 'Uncategorizedtemplates' => array( 'Ukategoriserte_maler' ),
+ 'Undelete' => array( 'Gjenopprett' ),
+ 'Unlockdb' => array( 'Ã…pne_database' ),
+ 'Unusedcategories' => array( 'Ubrukte_kategorier' ),
+ 'Unusedimages' => array( 'Ubrukte_filer', 'Ubrukte_bilder' ),
+ 'Unusedtemplates' => array( 'Ubrukte_maler' ),
+ 'Unwatchedpages' => array( 'Uovervåkede_sider' ),
+ 'Upload' => array( 'Last_opp' ),
+ 'Userlogin' => array( 'Logg_inn' ),
+ 'Userlogout' => array( 'Logg_ut' ),
+ 'Userrights' => array( 'Brukerrettigheter' ),
+ 'Version' => array( 'Versjon' ),
+ 'Wantedcategories' => array( 'Ønskede_kategorier' ),
+ 'Wantedfiles' => array( 'Ønskede_filer' ),
+ 'Wantedpages' => array( 'Ønskede_sider', 'Ødelagte_lenker' ),
+ 'Wantedtemplates' => array( 'Ønskede_maler' ),
+ 'Watchlist' => array( 'Overvåkningsliste', 'Overvåkingsliste' ),
+ 'Whatlinkshere' => array( 'Lenker_hit' ),
+ 'Withoutinterwiki' => array( 'Uten_interwiki' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
+ 'notoc' => array( '0', '__INGENINNHOLDSFORTEGNELSE__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__INTETGALLERI__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__TVINGINNHOLDSFORTEGNELSE__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INNHOLDSFORTEGNELSE__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__INGENSEKSJONSREDIGERING__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'NÅVÆRENDEMÅNED', 'NÅVÆRENDEMÅNED2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'NÅVÆRENDEMÅNED1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NÅVÆRENDEMÅNEDSNAVN', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NÅVÆRENDEMÅNEDSNAVNGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'NÅVÆRENDEMÅNEDSNAVNKORT', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'NÅVÆRENDEDAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NÅVÆRENDEDAG2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NÅVÆRENDEDAGSNAVN', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'NÅVÆRENDEÅR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'NÅVÆRENDETID', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'NÅVÆRENDETIME', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALMÃ…NED', 'LOKALMÃ…NED2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALMÃ…NED1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKALMÃ…NEDSNAVN', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKALMÃ…NEDSNAVNGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKALMÃ…NEDSNAVNKORT', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALDAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKALDAGSNAVN', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALTÃ…R', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALTID', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALTIME', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ANTALLSIDER', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ANTALLARTIKLER', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ANTALLFILER', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ANTALLBRUKERE', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ANTALLAKTIVEBRUKERE', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ANTALLREDIGERINGER', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ANTALLVISNINGER', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'SIDENAVN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SIDENAVNE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAVNEROM', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NAVNEROME', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUSJONSROM', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUSJONSROME', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'SUBJEKTROM', 'ARTIKKELROM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'SUBJEKTROME', 'ARTIKKELROME', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'FULLTSIDENAVN', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'FULLTSIDENAVNE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'UNDERSIDENAVN', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'UNDERSIDENAVNE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'GRUNNSIDENAVN', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'GRUNNSIDENAVNE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'DISKUSJONSSIDENAVN', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'DISKUSJONSSIDENAVNE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'SUBJEKTSIDENAVN', 'ARTIKKELSIDENAVN', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'SUBJEKTSIDENAVNE', 'ARTIKKELSIDENAVNE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'høyre', 'right' ),
+ 'img_left' => array( '1', 'venstre', 'left' ),
+ 'img_none' => array( '1', 'ingen', 'none' ),
+ 'img_center' => array( '1', 'sentrer', 'senter', 'midtstilt', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'ramme', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'rammeløs', 'ingenramme', 'frameless' ),
+ 'img_page' => array( '1', 'side=$1', 'side $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'portrett', 'portrett=$1', 'portrett_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_baseline' => array( '1', 'grunnlinje', 'baseline' ),
+ 'img_top' => array( '1', 'topp', 'top' ),
+ 'img_middle' => array( '1', 'midt', 'middle' ),
+ 'img_bottom' => array( '1', 'bunn', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tekst-bunn', 'text-bottom' ),
+ 'img_link' => array( '1', 'lenke=$1', 'link=$1' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ARTIKKELSTI', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'TJENER', 'SERVER' ),
+ 'servername' => array( '0', 'TJENERNAVN', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTSTI', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'STILSTI', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'KJØNN:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__INGENTITTELKONVERTERING__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__INGENINNHOLDSKONVERTERING__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'NÅVÆRENDEUKE', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'NÅVÆRENDEUKEDAG', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALUKE', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'LOKALUKEDAG', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'REVISJONSID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'REVISJONSDAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'REVISJONSDAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'REVISJONSMÃ…NED', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'REVISJONSMÃ…NED1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'REVISJONSÃ…R', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'REVISJONSTIDSSTEMPEL', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'REVISJONSBRUKER', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'FLERTALL:', 'PLURAL:' ),
+ 'raw' => array( '0', 'RÃ…:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'VISTITTEL', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__NYSEKSJONSLENKE__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__INGENNYSEKSJONSLENKE__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'NÅVÆRENDEVERSJON', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'NÅVÆRENDETIDSSTEMPEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKALTTIDSSTEMPEL', 'LOCALTIMESTAMP' ),
+ 'contentlanguage' => array( '1', 'INNHOLDSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'SIDERINAVNEROM:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ANTALLADMINISTRATORER', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'spesial', 'special' ),
+ 'defaultsort' => array( '1', 'STANDARDSORTERING', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'FILSTI:', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__SKJULTKATEGORI__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'SIDESTØRRELSE', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKSER__', '__INDEX__' ),
+ 'noindex' => array( '1', '__INGENINDEKSERING__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NUMMERIGRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STATISTOMDIRIGERING__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'BESKYTTELSESNIVÃ…', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'datoformat', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'STI', 'PATH' ),
+ 'url_query' => array( '0', 'SPØRRING', 'QUERY' ),
+);
$messages = array(
# User preference toggles
@@ -390,21 +661,23 @@ Vennligst rapporter dette til en [[Special:ListUsers/sysop|administrator]], oppg
'badarticleerror' => 'Handlingen kan ikke utføres på denne siden.',
'cannotdelete' => 'Siden eller fila «$1» kunne ikke slettes.
Den kan ha blitt slettet av noen andre.',
+'cannotdelete-title' => 'Kan ikke slette siden «$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.',
-'perfcached' => 'Følgende data er mellomlagret og kan derfor være foreldet.',
-'perfcachedts' => 'Følgende data er mellomlagret, og ble sist oppdatert $1.',
+'perfcached' => 'Følgende data er en tidligere kopi og ikke nødvendigvis den siste versjonen i databasen. Maksimalt {{PLURAL:$1|ett resultat|$1 resultater}} er {{PLURAL:$1|tilgjengelig|tilgjengelige}} som tidligere kopier.',
+'perfcachedts' => 'Følgende data er en tidligere kopi, og ble sist oppdatert $1. Maksimalt {{PLURAL:$4|ett resultat|$4 resultater}} er {{PLURAL:$4|tilgjengelig|tilgjengelige}} som tidligere kopier.',
'querypage-no-updates' => 'Oppdateringer for denne siden er slått av. Data her blir ikke gjenoppfrisket.',
'wrong_wfQuery_params' => 'Gale paramtere til wfQuery()<br />
Funksjon: $1<br />
Spørring: $2',
'viewsource' => 'Vis kilde',
-'viewsourcefor' => 'for $1',
+'viewsource-title' => 'Vis kilden til $1',
'actionthrottled' => 'Handlingsgrense overskredet',
'actionthrottledtext' => 'For å beskytte mot spam, kan du ikke utføre denne handlingen for mange ganger i løpet av et kort tidssrom, og du har overskredet denne grensen. Prøv igjen om noen minutter.',
'protectedpagetext' => 'Denne siden har blitt låst for redigeringer.',
'viewsourcetext' => 'Du kan se og kopiere kilden til denne siden:',
+'viewyourtext' => "Du kan se og kopiere kilden til '''dine endringer''' på denne siden:",
'protectedinterface' => 'Denne siden viser brukergrensesnittet for programvaren, og er låst for å hindre misbruk.',
'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes i grensesnittet for programvaren.
Endringer på denne siden vil påvirke hvordan grensesnittet vil se ut.
@@ -505,6 +778,7 @@ Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
'emailconfirmlink' => 'Bekreft e-postadressen din.',
'invalidemailaddress' => 'Din e-postadresse kan ikke aksepteres, fordi den er ugyldig formatert.
Skriv inn en fungerende e-postadresse eller tøm feltet.',
+'cannotchangeemail' => 'E-postadresser knyttet til brukerkontoer kan ikke endres på denne wikien.',
'accountcreated' => 'Konto opprettet',
'accountcreatedtext' => 'Brukerkontoen for $1 har blitt opprettet.',
'createaccount-title' => 'Kontooppretting på {{SITENAME}}',
@@ -519,6 +793,7 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
# E-mail sending
'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
+'user-mail-no-addy' => 'Forsøkte å sende e-post uten e-postadresse',
# Change password dialog
'resetpass' => 'Endre passord',
@@ -539,16 +814,18 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
'resetpass-temp-password' => 'Midlertidig passord:',
# Special:PasswordReset
-'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å motta en påminnelse om kontoopplysningene dine i en e-post.',
-'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-username' => 'Brukernavn:',
-'passwordreset-domain' => 'Domene:',
-'passwordreset-email' => 'E-postadresse:',
-'passwordreset-emailtitle' => 'Kontodetaljer på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en påminnelse om dine
+'passwordreset' => 'Passordresetting',
+'passwordreset-text' => 'Fyll ut dette skjemaet for å motta en påminnelse om kontoopplysningene dine i en e-post.',
+'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-username' => 'Brukernavn:',
+'passwordreset-domain' => 'Domene:',
+'passwordreset-capture' => 'Vise resulterende e-post?',
+'passwordreset-capture-help' => 'Hvis du krysser av her, vil du se e-posten (med foreløpig passord) i tillegg til at den blir sendt til brukeren.',
+'passwordreset-email' => 'E-postadresse:',
+'passwordreset-emailtitle' => 'Kontodetaljer på {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en påminnelse om dine
kontodetaljer for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er
tilknyttet denne e-postadressen:
@@ -559,7 +836,7 @@ Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
passord.',
-'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en påminnelse om kontodetaljene dine for {{SITENAME}}
+'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en påminnelse om kontodetaljene dine for {{SITENAME}}
($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:
$2
@@ -569,9 +846,22 @@ Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
passord.',
-'passwordreset-emailelement' => 'Brukernavn: $1
+'passwordreset-emailelement' => 'Brukernavn: $1
Midlertidig passord: $2',
-'passwordreset-emailsent' => 'En påminnelse har blitt sendt på e-post.',
+'passwordreset-emailsent' => 'En påminnelse har blitt sendt på e-post.',
+'passwordreset-emailsent-capture' => 'E-posten under er sendt ut som en påminnelse.',
+'passwordreset-emailerror-capture' => 'E-posten, som du ser under, ble forsøkt sendt til brukeren, men dette mislyktes: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Endre e-postadresse',
+'changeemail-header' => 'Endre kontoens e-postadresse',
+'changeemail-text' => 'Fyll ut dette skjemaet for å endre din e-postadresse. Du må oppgi ditt passord for å bekrefte endringen.',
+'changeemail-no-info' => 'Du må være innlogget for å få direkte tilgang til denne siden.',
+'changeemail-oldemail' => 'Nåværende e-postadresse:',
+'changeemail-newemail' => 'Ny e-postadresse:',
+'changeemail-none' => '(ingen)',
+'changeemail-submit' => 'Endre e-post',
+'changeemail-cancel' => 'Avbryt',
# Edit page toolbar
'bold_sample' => 'Fet tekst',
@@ -642,9 +932,6 @@ Merk at du ikke kan bruke «E-post til denne brukeren»-funksjonen med mindre du
Din IP-adresse er $3, og blokkerings-ID-en er #$5.
Vennligst ta med all denne informasjonen ved henvendelser.",
'blockednoreason' => 'ingen grunn gitt',
-'blockedoriginalsource' => "Kildekoden til '''$1''' vises nedenfor:",
-'blockededitsource' => "Kildekoden '''dine endringer''' på '''$1''' vises nedenfor:",
-'whitelistedittitle' => 'Du må logge inn for å redigere',
'whitelistedittext' => 'Du må $1 for å redigere artikler.',
'confirmedittext' => 'Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].',
'nosuchsectiontitle' => 'Finner ikke avsnittet',
@@ -731,7 +1018,8 @@ Du lover oss også at du har skrevet teksten selv, eller kopiert den fra en kild
Om du ikke vil at dine bidrag skal kunne redigeres fritt, ikke legg det til her.<br />
Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som er i offentlig eie eller en lignende fri ressurs (se $1 for detaljer).
'''Ikke legg til opphavsrettsbeskyttet materiale uten tillatelse!'''",
-'longpageerror' => "'''FEIL: Teksten du prøvde å lagre er $1&nbsp;kB lang, dvs. lenger enn det maksimale $2&nbsp;kB. Den kan ikke lagres.'''",
+'longpageerror' => "'''Feil: Teksten du ønsker å lagre er {{PLURAL:$1|én kilobyte|$1 kilobyte}} stor. Dette er større enn det tillatte maksimum på {{PLURAL:$2|én kilobyte|$2 kilobyte}}.'''
+Den kan ikke lagres.",
'readonlywarning' => "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,
så du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å
kopiere teksten din til en tekstfil, så du kan lagre den til senere.'''
@@ -896,8 +1184,6 @@ Andre administratorer på {{SITENAME}} vil fortsatt kunne se det skjulte innhold
'revdelete-unsuppress' => 'Fjern betingelser på gjenopprettede revisjoner',
'revdelete-log' => 'Ã…rsak:',
'revdelete-submit' => 'Utfør på {{PLURAL:$1|valgt revisjon|valgte revisjoner}}',
-'revdelete-logentry' => 'endre revisjonssynlighet for [[$1]]',
-'logdelete-logentry' => 'endre hendelsessynlighet for [[$1]]',
'revdelete-success' => "'''Revisjonssynlighet vellykket oppdatert.'''",
'revdelete-failure' => "'''Kunne ikke endre versjonssynligheten:'''
$1",
@@ -909,15 +1195,6 @@ $1",
'revdel-restore-visible' => 'synlige revisjoner',
'pagehist' => 'Sidehistorikk',
'deletedhist' => 'Slettet historikk',
-'revdelete-content' => 'innhold',
-'revdelete-summary' => 'redigeringssammendrag',
-'revdelete-uname' => 'brukernavn',
-'revdelete-restricted' => 'begrensninger gjelder også administratorer',
-'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
-'revdelete-hid' => 'skjulte $1',
-'revdelete-unhid' => 'synliggjorde $1',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|revisjon|revisjoner}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|element|elementer}}',
'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldende revisjonen.
Den kan ikke skjules.',
'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
@@ -1074,12 +1351,14 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
'prefs-rc' => 'Siste endringer',
'prefs-watchlist' => 'Overvåkningsliste',
'prefs-watchlist-days' => 'Dager som skal vises i overvåkningslisten:',
-'prefs-watchlist-days-max' => 'Maksimalt 7 dager',
+'prefs-watchlist-days-max' => 'Maksimalt $1 {{PLURAL:$1|dag|dager}}',
'prefs-watchlist-edits' => 'Antall redigeringer som skal vises i utvidet overvåkningsliste:',
'prefs-watchlist-edits-max' => 'Maksimum antall: 1000',
'prefs-watchlist-token' => 'Nøkkel for overvåkningsliste',
'prefs-misc' => 'Diverse',
'prefs-resetpass' => 'Endre passord',
+'prefs-changeemail' => 'Endre e-postadresse',
+'prefs-setemail' => 'Oppgi en e-postadresse',
'prefs-email' => 'Alternativer for e-post',
'prefs-rendering' => 'Utseende',
'saveprefs' => 'Lagre',
@@ -1139,6 +1418,7 @@ Dette kan ikke tilbakestilles.',
'yourrealname' => 'Virkelig navn:',
'yourlanguage' => 'Språk:',
'yourvariant' => 'Språkvariant for innhold:',
+'prefs-help-variant' => 'Din foretrukne variant eller ortografi for å vise innholdssider på denne wikien i.',
'yournick' => 'Signatur:',
'prefs-help-signature' => 'Kommentarer på diskusjonssider bør alltid signeres med «<nowiki>~~~~</nowiki>», som vil bli konvertert til din signatur med tidspunkt.',
'badsig' => 'Ugyldig råsignatur; sjekk HTML-elementer.',
@@ -1178,7 +1458,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
'userrights-lookup-user' => 'Ordne brukergrupper',
'userrights-user-editname' => 'Skriv inn et brukernavn:',
'editusergroup' => 'Endre brukergrupper',
-'editinguser' => "Endring av rettigheter for bruker '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Endrer brukerrettighetene til '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Rediger brukergrupper',
'saveusergroups' => 'Lagre brukergrupper',
'userrights-groupsmember' => 'Medlem av:',
@@ -1273,13 +1553,13 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
'right-autopatrol' => 'FÃ¥r sine egne redigeringer merket som patruljerte',
'right-patrolmarks' => 'Bruke patruljeringsfunksjoner i siste endringer',
'right-unwatchedpages' => 'Se listen over uovervåkede sider',
-'right-trackback' => 'Gi tilbakemelding',
'right-mergehistory' => 'Flette sidehistorikker',
'right-userrights' => 'Redigere alle brukerrettigheter',
'right-userrights-interwiki' => 'Redigere rettigheter for brukere på andre wikier',
'right-siteadmin' => 'Låse og låse opp databasen',
'right-override-export-depth' => 'Eksporter sider inkludert lenkede sider til en dypde på 5',
'right-sendemail' => 'Send e-post til andre brukere',
+'right-passwordreset' => 'Vis e-poster over tilbakestilte passord',
# User rights log
'rightslog' => 'Brukerrettighetslogg',
@@ -1313,16 +1593,17 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
'action-suppressionlog' => 'se denne private loggen',
'action-block' => 'blokkere denne brukeren fra å redigere',
'action-protect' => 'endre denne sidens beskyttelsesnivåer',
+'action-rollback' => 'tilbakestill raskt endringene til den siste brukeren som redigerte en bestemt side',
'action-import' => 'importere denne siden fra en annen wiki',
'action-importupload' => 'importere denne siden fra en opplastet fil',
'action-patrol' => 'merke andre brukeres redigeringer som patruljert',
'action-autopatrol' => 'merke redigeringene dine som patruljert',
'action-unwatchedpages' => 'vise listen over uovervåkede sider',
-'action-trackback' => 'levere tilbakemelding',
'action-mergehistory' => 'flette sidens historikk',
'action-userrights' => 'redigere alle brukerrettigheter',
'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
'action-siteadmin' => 'låse eller låse opp databasen',
+'action-sendemail' => 'send e-post',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
@@ -1354,6 +1635,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
'number_of_watching_users_pageview' => '[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]',
'rc_categories' => 'Begrens til kategorier (skilletegn: «|»)',
'rc_categories_any' => 'Alle',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} etter endring',
'newsectionsummary' => '/* $1 */ ny seksjon',
'rc-enhanced-expand' => 'Vis detaljer (krever JavaScript)',
'rc-enhanced-hide' => 'Skjul detaljer',
@@ -1407,6 +1689,7 @@ Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
'ignorewarnings' => 'Ignorer eventuelle advarsler',
'minlength1' => 'Filnavn må være på minst én bokstav.',
'illegalfilename' => 'Filnavnet «$1» inneholder ugyldige tegn. Gi filen et nytt navn og prøv igjen.',
+'filename-toolong' => 'Filnavn kan ikke overstige 240 bytes.',
'badfilename' => 'Navnet på filen er blitt endret til «$1».',
'filetype-mime-mismatch' => 'Filendelsen «.$1» tilsvarer ikke MIME-typen som oppgis i filen ($2).',
'filetype-badmime' => 'Filer av typen «$1» kan ikke lastes opp.',
@@ -1511,6 +1794,41 @@ Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
'upload-unknown-size' => 'Ukjent størrelse',
'upload-http-error' => 'En HTTP-feil oppstod: $1',
+# File backend
+'backend-fail-stream' => 'Kunne ikke strømme filen $1.',
+'backend-fail-backup' => 'Kunne ikke sikkerhetskopiere filen $1.',
+'backend-fail-notexists' => 'Filen $1 finnes ikke.',
+'backend-fail-hashes' => 'Kunne ikke hente filnumre for sammenligning.',
+'backend-fail-notsame' => 'En ikke-identisk fil finnes allerede på $1.',
+'backend-fail-invalidpath' => '$1 er ikke en gyldig lagringsbane.',
+'backend-fail-delete' => 'Kunne ikke slette filen $1.',
+'backend-fail-alreadyexists' => 'Filen $1 finnes allerede.',
+'backend-fail-store' => 'Kunne ikke lagre filen $1 på $2.',
+'backend-fail-copy' => 'Kunne ikke kopiere filen $1 til $2.',
+'backend-fail-move' => 'Kunne ikke flytte filen $1 til $2.',
+'backend-fail-opentemp' => 'Kunne ikke åpne den midlertidige filen.',
+'backend-fail-writetemp' => 'Kunne ikke skrive til den midlertidige filen.',
+'backend-fail-closetemp' => 'Kunne ikke lukke den midlertidige filen.',
+'backend-fail-read' => 'Kunne ikke lese filen $1.',
+'backend-fail-create' => 'Kunne ikke opprette filen $1.',
+'backend-fail-readonly' => 'Underliggende "$1" er satt skrivebeskyttet fordi: "$2"',
+'backend-fail-synced' => 'Fila «$1» er i en inkonsistent status innen de interne bakstykkene',
+'backend-fail-connect' => 'Kunne ikke koble til filbackend «$1».',
+'backend-fail-internal' => 'En ukjent feil oppsto i filbackend «$1».',
+'backend-fail-contenttype' => 'Kunne ikke avgjøre innholdstypen til filen som skal lagres på «$1».',
+'backend-fail-batchsize' => 'Bakgrunnsprosesseringen belastet med {{PLURAL:$1|en filoperasjon|en samling av $1 filoperasjoner}}; grensen er $2.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kunne ikke låse opp «$1» fordi den er ikke låst.',
+'lockmanager-fail-closelock' => 'Kunne ikke lukke låsefilen for «$1».',
+'lockmanager-fail-deletelock' => 'Kunne ikke slette låsefilen for «$1».',
+'lockmanager-fail-acquirelock' => 'Kunne ikke skaffe lås for «$1».',
+'lockmanager-fail-openlock' => 'Kunne ikke åpne låsefilen for «$1».',
+'lockmanager-fail-releaselock' => 'Kunne ikke frigi låsen for «$1».',
+'lockmanager-fail-db-bucket' => 'Kunne ikke kontakte nok låsedatabaser i bøtten $1.',
+'lockmanager-fail-db-release' => 'Kunne ikke frigi låser på databasen $1.',
+'lockmanager-fail-svr-release' => 'Kunne ikke frigi låser på tjeneren $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Det oppsto en feil under åpning av filen for ZIP-sjekking.',
'zip-wrong-format' => 'Den angitte filen var ikke en ZIP-fil.',
@@ -1527,6 +1845,7 @@ Den kan ikke sikkerhetskontrolleres.',
'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi dine redigeringsrettigheter har utløpt. Prøv igjen.',
'uploadstash-errclear' => 'Fjerning av filene var mislykket.',
'uploadstash-refresh' => 'Oppdater listen over filer',
+'invalid-chunk-offset' => 'Ugyldig delforskyvning',
# img_auth script messages
'img-auth-accessdenied' => 'Ingen tilgang',
@@ -1632,23 +1951,24 @@ Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
'filerevert-badversion' => 'Det er ingen tidligere lokal versjon av denne filen med det gitte tidstrykket.',
# File deletion
-'filedelete' => 'Slett $1',
-'filedelete-legend' => 'Slett fil',
-'filedelete-intro' => "Du er i ferd med å slette filen '''[[Media:$1|$1]]''' sammen med hele dens historikk.",
-'filedelete-intro-old' => "Du sletter versjonen av '''[[Media:$1|$1]]''' à [$4 $3, $2].",
-'filedelete-comment' => 'Ã…rsak:',
-'filedelete-submit' => 'Slett',
-'filedelete-success' => "'''$1''' ble slettet.",
-'filedelete-success-old' => "Versjonen av '''[[Media:$1|$1]]''' à $3, $2 ble slettet.",
-'filedelete-nofile' => "'''$1''' finnes ikke.",
-'filedelete-nofile-old' => "Det er ingen arkivert versjon av '''$1''' med de gitte attributtene.",
-'filedelete-otherreason' => 'Annen/utdypende grunn:',
-'filedelete-reason-otherlist' => 'Annen grunn',
-'filedelete-reason-dropdown' => '*Vanlige slettingsgrunner
+'filedelete' => 'Slett $1',
+'filedelete-legend' => 'Slett fil',
+'filedelete-intro' => "Du er i ferd med å slette filen '''[[Media:$1|$1]]''' sammen med hele dens historikk.",
+'filedelete-intro-old' => "Du sletter versjonen av '''[[Media:$1|$1]]''' à [$4 $3, $2].",
+'filedelete-comment' => 'Ã…rsak:',
+'filedelete-submit' => 'Slett',
+'filedelete-success' => "'''$1''' ble slettet.",
+'filedelete-success-old' => "Versjonen av '''[[Media:$1|$1]]''' à $3, $2 ble slettet.",
+'filedelete-nofile' => "'''$1''' finnes ikke.",
+'filedelete-nofile-old' => "Det er ingen arkivert versjon av '''$1''' med de gitte attributtene.",
+'filedelete-otherreason' => 'Annen/utdypende grunn:',
+'filedelete-reason-otherlist' => 'Annen grunn',
+'filedelete-reason-dropdown' => '*Vanlige slettingsgrunner
** Opphavsrettsbrudd
** Duplikatfil',
-'filedelete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'filedelete-maintenance' => 'Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.',
+'filedelete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
+'filedelete-maintenance' => 'Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.',
+'filedelete-maintenance-title' => 'Kan ikke slette fil',
# MIME search
'mimesearch' => 'MIME-søk',
@@ -1745,6 +2065,8 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
'wantedpages' => 'Etterspurte sider',
'wantedpages-badtitle' => 'Ugyldig tittel i resultatene: $1',
'wantedfiles' => 'Ønskede filer',
+'wantedfiletext-cat' => 'Følgende filer refereres, men eksisterer ikke. Filer fra fremmede samlinger kan listes selv om de ikke finnes. Alle slik falske treff vil <del>strykes</del>. I tillegg er sider som har innebygde, ikke-eksisterende filer listet opp i [[:$1]].',
+'wantedfiletext-nocat' => 'Følgende filer er referert, men eksisterer ikke. Filer fra fremmede samlinger kan være opplistet selv om de ikke finnes. Alle slike falske referanser vil bli <del>fjernet</del>.',
'wantedtemplates' => 'Etterspurte maler',
'mostlinked' => 'Sider med flest lenker til seg',
'mostlinkedcategories' => 'Kategorier med flest sider',
@@ -1753,6 +2075,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
'mostimages' => 'Mest brukte filer',
'mostrevisions' => 'Artikler med flest revisjoner',
'prefixindex' => 'Alle sider med prefiks',
+'prefixindex-namespace' => 'All sider med prefiks ($1 navnerom)',
'shortpages' => 'Korte sider',
'longpages' => 'Lange sider',
'deadendpages' => 'Blindveisider',
@@ -1769,7 +2092,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
'listusers-editsonly' => 'Vis bare brukere med redigeringer',
'listusers-creationsort' => 'Sorter etter opprettelsesdato',
'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
-'usercreated' => 'Opprettet den $1 på $2',
+'usercreated' => '{{GENDER:$3|Opprettet}} $2 $1',
'newpages' => 'Nye sider',
'newpages-username' => 'Brukernavn:',
'ancientpages' => 'Eldste sider',
@@ -1862,12 +2185,8 @@ Støttede protokoller: <tt>$1</tt> (ikke legg til noen av disse i søket ditt).'
'activeusers-noresult' => 'Ingen brukere funnet.',
# Special:Log/newusers
-'newuserlogpage' => 'Brukeropprettelseslogg',
-'newuserlogpagetext' => 'Dette er en logg over brukeropprettelser.',
-'newuserlog-byemail' => 'passord sendt på e-post',
-'newuserlog-create-entry' => 'Ny brukerkonto',
-'newuserlog-create2-entry' => 'opprettet kontoen $1',
-'newuserlog-autocreate-entry' => 'Konto opprettet automatisk',
+'newuserlogpage' => 'Brukeropprettelseslogg',
+'newuserlogpagetext' => 'Dette er en logg over brukeropprettelser.',
# Special:ListGroupRights
'listgrouprights' => 'Rettigheter for brukergrupper',
@@ -1896,7 +2215,7 @@ Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrou
'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
Den e-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil dukke opp i «fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
'usermailererror' => 'E-postobjekt returnerte feilen:',
-'defemailsubject' => '{{SITENAME}} e-post',
+'defemailsubject' => '{{SITENAME}}-type e-post fra bruker "$1"',
'usermaildisabled' => 'Brukerepost deaktivert',
'usermaildisabledtext' => 'Du kan ikke sende epost til andre brukere på denne wikien',
'noemailtitle' => 'Ingen e-postadresse',
@@ -1950,7 +2269,7 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
'watchmethod-list' => 'sjekker siste endringer for sider i overvåkningslisten',
'watchlistcontains' => 'Overvåkningslisten inneholder $1 {{PLURAL:$1|side|sider}}.',
'iteminvalidname' => 'Problem med «$1», ugyldig navn&nbsp;…',
-'wlnote' => "Under er {{PLURAL:$1|den siste endringen|de siste '''$1''' endringer}} i løpet av {{PLURAL:$2|den siste timen|de siste '''$2''' timene}}.",
+'wlnote' => "Nedenfor er {{PLURAL:$1|den siste endringen|de siste '''$1''' endringene}} {{PLURAL:$2|den siste timen|de siste '''$2''' timene}}, fra den $3, kl. $4",
'wlshowlast' => 'Vis siste $1 timer $2 dager $3',
'watchlist-options' => 'Alternativ for overvåkningslisten',
@@ -2016,8 +2335,6 @@ Bekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og a
'actionfailed' => 'Handling mislyktes',
'deletedtext' => '«$1» er slettet.
Se $2 for en oversikt over de siste slettingene.',
-'deletedarticle' => 'slettet «[[$1]]»',
-'suppressedarticle' => 'fjernet «[[$1]]»',
'dellogpage' => 'Slettingslogg',
'dellogpagetext' => 'Under er ei liste over nylige slettinger.',
'deletionlog' => 'slettingslogg',
@@ -2060,7 +2377,10 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeld
'unprotectedarticle' => 'fjernet beskyttelse av «[[$1]]»',
'movedarticleprotection' => 'flyttet beskyttelsesinnstillinger fra «[[$2]]» til «[[$1]]»',
'protect-title' => 'Låser «$1»',
+'protect-title-notallowed' => 'Vis beskyttelsesnivået til «$1»',
'prot_1movedto2' => '[[$1]] flyttet til [[$2]]',
+'protect-badnamespace-title' => 'Navnerom som ikke kan beskyttes',
+'protect-badnamespace-text' => 'Sider i dette navnerommet kan ikke beskyttes.',
'protect-legend' => 'Bekreft låsing',
'protectcomment' => 'Ã…rsak:',
'protectexpiry' => 'Utløper:',
@@ -2080,6 +2400,7 @@ Du kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen
'protect-level-sysop' => 'Kun administratorer',
'protect-summary-cascade' => 'dypbeskyttelse',
'protect-expiring' => 'utløper $1 (UTC)',
+'protect-expiring-local' => 'løper ut $1',
'protect-expiry-indefinite' => 'ubestemt',
'protect-cascade' => 'Beskytt sider som er inkludert på denne siden (dypbeskyttelse)',
'protect-cantedit' => 'Du kan ikke endre beskyttelsesnivået til denne siden fordi du ikke har tillatelse til å redigere den.',
@@ -2135,7 +2456,6 @@ Dersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gje
'undeletereset' => 'Nullstill',
'undeleteinvert' => 'Inverter valg',
'undeletecomment' => 'Ã…rsak:',
-'undeletedarticle' => 'gjenopprettet «[[$1]]»',
'undeletedrevisions' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet',
'undeletedrevisions-files' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet',
'undeletedfiles' => '{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet',
@@ -2144,6 +2464,7 @@ Dersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gje
Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
'undelete-header' => 'Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.',
+'undelete-search-title' => 'Søk i slettede sider',
'undelete-search-box' => 'Søk i slettede sider',
'undelete-search-prefix' => 'Vis sider som starter med:',
'undelete-search-submit' => 'Søk',
@@ -2152,6 +2473,7 @@ Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger
'undelete-bad-store-key' => 'Kan ikke gjenopprette filrevisjon med tidstrykk $1: fil manglet før sletting',
'undelete-cleanup-error' => 'Feil i sletting av ubrukt arkivfil «$1».',
'undelete-missing-filearchive' => 'Klarte ikke å gjenopprette filarkivet med ID $1 fordi det ikke er i databasen. Det kan ha blitt gjenopprettet tidligere.',
+'undelete-error' => 'Feil under gjenoppretting av siden',
'undelete-error-short' => 'Feil under filgjenoppretting: $1',
'undelete-error-long' => 'Feil oppsto under filgjenoppretting:
@@ -2271,6 +2593,7 @@ Se [[Special:BlockList|blokkeringslisten]] for alle blokkeringer.',
'blocklist-userblocks' => 'Skjul kontoblokkeringer',
'blocklist-tempblocks' => 'Skjul midlertidige blokkeringer',
'blocklist-addressblocks' => 'Skjul individuelle IP-blokkeringer',
+'blocklist-rangeblocks' => 'Skjul intervallblokker',
'blocklist-timestamp' => 'Tidsstempel',
'blocklist-target' => 'MÃ¥l',
'blocklist-expiry' => 'Utløper',
@@ -2293,6 +2616,7 @@ Se [[Special:BlockList|blokkeringslisten]] for alle blokkeringer.',
'unblocklink' => 'opphev blokkering',
'change-blocklink' => 'endre blokkering',
'contribslink' => 'bidrag',
+'emaillink' => 'send e-post',
'autoblocker' => 'Du ble automatisk blokkert fordi du deler IP-adresse med «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».',
'blocklogpage' => 'Blokkeringslogg',
'blocklog-showlog' => 'Denne brukeren har blitt blokkert før.
@@ -2418,9 +2742,6 @@ Du er nødt til å flette dem manuelt.'''",
'movepage-page-moved' => 'Siden $1 har blitt flyttet til $2.',
'movepage-page-unmoved' => 'Siden $1 kunne ikke flyttes til $2.',
'movepage-max-pages' => 'Grensen på {{PLURAL:$1|én side|$1 sider}} er nådd; ingen flere sider vil bli flyttet automatisk.',
-'1movedto2' => 'flyttet [[$1]] til [[$2]]',
-'1movedto2_redir' => 'flyttet [[$1]] til [[$2]] over omdirigeringsside',
-'move-redirect-suppressed' => 'ingen omdirigering',
'movelogpage' => 'Flyttelogg',
'movelogpagetext' => 'Her er ei liste over sider som har blitt flyttet.',
'movesubpage' => '{{PLURAL:$1|Underside|Undersider}}',
@@ -2432,7 +2753,7 @@ Du er nødt til å flette dem manuelt.'''",
'delete_and_move_text' => '==Sletting nødvendig==
Målsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan flyttes dit?',
'delete_and_move_confirm' => 'Ja, slett siden',
-'delete_and_move_reason' => 'Slettet for å muliggjøre flytting',
+'delete_and_move_reason' => 'Slettet for å muliggjøre flytting fra "[[$1]]"',
'selfmove' => 'Kilde- og destinasjonstittel er den samme; kan ikke flytte siden.',
'immobile-source-namespace' => 'Kan ikke flytte sider i navnerommet «$1»',
'immobile-target-namespace' => 'Kan ikke flytte sider til navnerommet «$1»',
@@ -2462,9 +2783,11 @@ Dette kan senere importeres til en annen wiki som bruker MediaWiki ved hjelp av
For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per linje, og velg om du vil ha kun nåværende versjon, eller alle versjoner i historikken.
Dersom du bare vil ha nåværende versjon, kan du også bruke en lenke, for eksempel [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for siden «[[{{MediaWiki:Mainpage}}]]».',
+'exportall' => 'Eksporter alle sider',
'exportcuronly' => 'Ta bare med den nåværende versjonen, ikke hele historikken.',
'exportnohistory' => "----
'''Merk:''' Eksportering av hele historikken gjennom dette skjemaet har blitt slått av av ytelsesgrunner.",
+'exportlistauthors' => 'Inkluder en fullstendig liste over bidragsytere for hver side',
'export-submit' => 'Eksporter',
'export-addcattext' => 'Legg til sider fra kategori:',
'export-addcat' => 'Legg til',
@@ -2497,6 +2820,8 @@ Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med overse
'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
'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',
+'thumbnail-dest-create' => 'Kan ikke lagre miniatyrbilde til målbanen',
'thumbnail_invalid_params' => 'Ugyldige miniatyrparametere, eller PNG-fil med flere piksler enn 12,5 millioner.',
'thumbnail_dest_directory' => 'Klarte ikke å opprette målmappe',
'thumbnail_image-type' => 'Bildetypen støttes ikke',
@@ -2539,6 +2864,11 @@ Lagre den på din egen datamaskin og last den opp her.',
'import-upload' => 'Last opp XML-data',
'import-token-mismatch' => 'Sesjonsdata mistet. Venligst prøv igjen.',
'import-invalid-interwiki' => 'Kan ikke importere fra angitt wiki.',
+'import-error-edit' => 'Siden «$1» ble ikke importert siden du ikke har tillatelse til å redigere den.',
+'import-error-create' => 'Siden «$1» ble ikke importert siden du ikke har tillatelse til å opprette den.',
+'import-error-interwiki' => 'Siden «$1» ble ikke importert fordi navnet er reservert for ekstern lenking (interwiki).',
+'import-error-special' => 'Siden «$1» ble ikke importert fordi den tilhører et spesialnavnerom som ikke tillater sider.',
+'import-error-invalid' => 'Siden «$1» ble ikke importert fordi navnet er ugyldig.',
# Import log
'importlogpage' => 'Importlogg',
@@ -2548,73 +2878,86 @@ Lagre den på din egen datamaskin og last den opp her.',
'import-logentry-interwiki' => 'transwikiimporterte $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} fra $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-testing',
+'javascripttest-disabled' => 'Denne funksjonen er deaktivert.',
+'javascripttest-title' => 'Kjører $1 tester',
+'javascripttest-pagetext-noframework' => 'Denne siden er reservert for å kjøre JavaScript-tester.',
+'javascripttest-pagetext-unknownframework' => 'Ukjent testerammeverk "$1".',
+'javascripttest-pagetext-frameworks' => 'Vennligst velg en av følgende testerammeverk: $1',
+'javascripttest-pagetext-skins' => 'Velg et utseende for testene:',
+'javascripttest-qunit-intro' => 'Se [$1 testedokumentasjonen] på mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit testsuite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Din brukerside',
-'tooltip-pt-anonuserpage' => 'Brukersiden for IP-adressen du redigerer fra',
-'tooltip-pt-mytalk' => 'Din diskusjonsside',
-'tooltip-pt-anontalk' => 'Diskusjon om redigeringer fra denne IP-adressen',
-'tooltip-pt-preferences' => 'Dine innstillinger',
-'tooltip-pt-watchlist' => 'Liste over sider du overvåker for endringer.',
-'tooltip-pt-mycontris' => 'Liste over dine bidrag',
-'tooltip-pt-login' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk',
-'tooltip-pt-anonlogin' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk.',
-'tooltip-pt-logout' => 'Logg ut',
-'tooltip-ca-talk' => 'Diskusjon om innholdssiden',
-'tooltip-ca-edit' => 'Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.',
-'tooltip-ca-addsection' => 'Start et nytt avsnitt',
-'tooltip-ca-viewsource' => 'Denne siden er beskyttet.
+'tooltip-pt-userpage' => 'Din brukerside',
+'tooltip-pt-anonuserpage' => 'Brukersiden for IP-adressen du redigerer fra',
+'tooltip-pt-mytalk' => 'Din diskusjonsside',
+'tooltip-pt-anontalk' => 'Diskusjon om redigeringer fra denne IP-adressen',
+'tooltip-pt-preferences' => 'Dine innstillinger',
+'tooltip-pt-watchlist' => 'Liste over sider du overvåker for endringer.',
+'tooltip-pt-mycontris' => 'Liste over dine bidrag',
+'tooltip-pt-login' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk',
+'tooltip-pt-anonlogin' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk.',
+'tooltip-pt-logout' => 'Logg ut',
+'tooltip-ca-talk' => 'Diskusjon om innholdssiden',
+'tooltip-ca-edit' => 'Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.',
+'tooltip-ca-addsection' => 'Start et nytt avsnitt',
+'tooltip-ca-viewsource' => 'Denne siden er beskyttet.
Du kan se på kildeteksten',
-'tooltip-ca-history' => 'Tidligere revisjoner av denne siden',
-'tooltip-ca-protect' => 'Beskytt denne siden',
-'tooltip-ca-unprotect' => 'Endre beskyttelsen av denne siden',
-'tooltip-ca-delete' => 'Slett denne siden',
-'tooltip-ca-undelete' => 'Gjenopprett redigerenge som ble gjort på denne siden før den ble slettet.',
-'tooltip-ca-move' => 'Flytt denne siden',
-'tooltip-ca-watch' => 'Legg denne siden til overvåkningslisten din',
-'tooltip-ca-unwatch' => 'Fjern denne siden fra din overvåkningsliste',
-'tooltip-search' => 'Søk i {{SITENAME}}',
-'tooltip-search-go' => 'GÃ¥ til en side med dette navnet om den finnes',
-'tooltip-search-fulltext' => 'Søk etter sider som innholder denne teksten',
-'tooltip-p-logo' => 'Hovedside',
-'tooltip-n-mainpage' => 'GÃ¥ til hovedsiden',
-'tooltip-n-mainpage-description' => 'GÃ¥ til hovedsiden',
-'tooltip-n-portal' => 'Om prosjektet, hva du kan gjøre, hvor du kan finne ting',
-'tooltip-n-currentevents' => 'Finn bakgrunnsinformasjon om aktuelle hendelser',
-'tooltip-n-recentchanges' => 'Liste over siste endringer på wikien.',
-'tooltip-n-randompage' => 'Vis en tilfeldig side',
-'tooltip-n-help' => 'Stedet for å få hjelp',
-'tooltip-t-whatlinkshere' => 'Liste over alle wikisider som lenker hit',
-'tooltip-t-recentchangeslinked' => 'Siste endringer i sider som blir lenket fra denne siden',
-'tooltip-feed-rss' => 'RSS-mating for denne siden',
-'tooltip-feed-atom' => 'Atom-mating for denne siden',
-'tooltip-t-contributions' => 'Vis liste over bidrag fra denne brukeren',
-'tooltip-t-emailuser' => 'Send en e-post til denne brukeren',
-'tooltip-t-upload' => 'Last opp filer',
-'tooltip-t-specialpages' => 'Liste over alle spesialsider',
-'tooltip-t-print' => 'Utskriftsvennlig versjon av denne siden',
-'tooltip-t-permalink' => 'Permanent lenke til denne revisjonen av siden',
-'tooltip-ca-nstab-main' => 'Vis innholdssiden',
-'tooltip-ca-nstab-user' => 'Vis brukersiden',
-'tooltip-ca-nstab-media' => 'Vis mediasiden',
-'tooltip-ca-nstab-special' => 'Dette er en spesialside og kan ikke redigeres',
-'tooltip-ca-nstab-project' => 'Vis prosjektsiden',
-'tooltip-ca-nstab-image' => 'Vis filsiden',
-'tooltip-ca-nstab-mediawiki' => 'Vis systembeskjeden',
-'tooltip-ca-nstab-template' => 'Vis malen',
-'tooltip-ca-nstab-help' => 'Vis hjelpesiden',
-'tooltip-ca-nstab-category' => 'Vis kategorisiden',
-'tooltip-minoredit' => 'Merk dette som en mindre endring',
-'tooltip-save' => 'Lagre endringene dine',
-'tooltip-preview' => 'Forhåndsvis endringene dine, vennligst gjør dette før du lagrer!',
-'tooltip-diff' => 'Vis hvilke endringer du har gjort på teksten',
-'tooltip-compareselectedversions' => 'Se forskjellen mellom de to valgte revisjonene av denne siden',
-'tooltip-watch' => 'Legg denne siden til overvåkningslisten din',
-'tooltip-recreate' => 'Gjenopprett siden til tross for at den har blitt slettet',
-'tooltip-upload' => 'Start opplasting',
-'tooltip-rollback' => '«Tilbakestill»-knappen tilbakestiller den siste bidragsyterens endring(er) på denne siden med ett klikk',
-'tooltip-undo' => '«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.',
-'tooltip-preferences-save' => 'Lagre innstillinger',
-'tooltip-summary' => 'Skriv et kort sammendrag',
+'tooltip-ca-history' => 'Tidligere revisjoner av denne siden',
+'tooltip-ca-protect' => 'Beskytt denne siden',
+'tooltip-ca-unprotect' => 'Endre beskyttelsen av denne siden',
+'tooltip-ca-delete' => 'Slett denne siden',
+'tooltip-ca-undelete' => 'Gjenopprett redigerenge som ble gjort på denne siden før den ble slettet.',
+'tooltip-ca-move' => 'Flytt denne siden',
+'tooltip-ca-watch' => 'Legg denne siden til overvåkningslisten din',
+'tooltip-ca-unwatch' => 'Fjern denne siden fra din overvåkningsliste',
+'tooltip-search' => 'Søk i {{SITENAME}}',
+'tooltip-search-go' => 'GÃ¥ til en side med dette navnet om den finnes',
+'tooltip-search-fulltext' => 'Søk etter sider som innholder denne teksten',
+'tooltip-p-logo' => 'Hovedside',
+'tooltip-n-mainpage' => 'GÃ¥ til hovedsiden',
+'tooltip-n-mainpage-description' => 'GÃ¥ til hovedsiden',
+'tooltip-n-portal' => 'Om prosjektet, hva du kan gjøre, hvor du kan finne ting',
+'tooltip-n-currentevents' => 'Finn bakgrunnsinformasjon om aktuelle hendelser',
+'tooltip-n-recentchanges' => 'Liste over siste endringer på wikien.',
+'tooltip-n-randompage' => 'Vis en tilfeldig side',
+'tooltip-n-help' => 'Stedet for å få hjelp',
+'tooltip-t-whatlinkshere' => 'Liste over alle wikisider som lenker hit',
+'tooltip-t-recentchangeslinked' => 'Siste endringer i sider som blir lenket fra denne siden',
+'tooltip-feed-rss' => 'RSS-mating for denne siden',
+'tooltip-feed-atom' => 'Atom-mating for denne siden',
+'tooltip-t-contributions' => 'Vis liste over bidrag fra denne brukeren',
+'tooltip-t-emailuser' => 'Send en e-post til denne brukeren',
+'tooltip-t-upload' => 'Last opp filer',
+'tooltip-t-specialpages' => 'Liste over alle spesialsider',
+'tooltip-t-print' => 'Utskriftsvennlig versjon av denne siden',
+'tooltip-t-permalink' => 'Permanent lenke til denne revisjonen av siden',
+'tooltip-ca-nstab-main' => 'Vis innholdssiden',
+'tooltip-ca-nstab-user' => 'Vis brukersiden',
+'tooltip-ca-nstab-media' => 'Vis mediasiden',
+'tooltip-ca-nstab-special' => 'Dette er en spesialside og kan ikke redigeres',
+'tooltip-ca-nstab-project' => 'Vis prosjektsiden',
+'tooltip-ca-nstab-image' => 'Vis filsiden',
+'tooltip-ca-nstab-mediawiki' => 'Vis systembeskjeden',
+'tooltip-ca-nstab-template' => 'Vis malen',
+'tooltip-ca-nstab-help' => 'Vis hjelpesiden',
+'tooltip-ca-nstab-category' => 'Vis kategorisiden',
+'tooltip-minoredit' => 'Merk dette som en mindre endring',
+'tooltip-save' => 'Lagre endringene dine',
+'tooltip-preview' => 'Forhåndsvis endringene dine, vennligst gjør dette før du lagrer!',
+'tooltip-diff' => 'Vis hvilke endringer du har gjort på teksten',
+'tooltip-compareselectedversions' => 'Se forskjellen mellom de to valgte revisjonene av denne siden',
+'tooltip-watch' => 'Legg denne siden til overvåkningslisten din',
+'tooltip-watchlistedit-normal-submit' => 'Fjern titler',
+'tooltip-watchlistedit-raw-submit' => 'Oppdater overvåkningsliste',
+'tooltip-recreate' => 'Gjenopprett siden til tross for at den har blitt slettet',
+'tooltip-upload' => 'Start opplasting',
+'tooltip-rollback' => '«Tilbakestill»-knappen tilbakestiller den siste bidragsyterens endring(er) på denne siden med ett klikk',
+'tooltip-undo' => '«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.',
+'tooltip-preferences-save' => 'Lagre innstillinger',
+'tooltip-summary' => 'Skriv et kort sammendrag',
# Stylesheets
'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
@@ -2698,9 +3041,6 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
# Patrol log
'patrol-log-page' => 'Godkjenningslogg',
'patrol-log-header' => 'Dette er en logg over patruljerte sideversjoner.',
-'patrol-log-line' => 'merket $1 av $2 godkjent $3',
-'patrol-log-auto' => '(automatisk)',
-'patrol-log-diff' => 'versjon $1',
'log-show-hide-patrol' => '$1 patruljeringslogg',
# Image deletion
@@ -2727,11 +3067,11 @@ Ved å åpne den kan systemet ditt kompromitteres.",
'file-info' => 'filstørrelse: $1, MIME-type: $2',
'file-info-size' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4',
'file-info-size-pages' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4, $5 {{PLURAL:$5|side|sider}}',
-'file-nohires' => '<small>Ingen høyere oppløsning tilgjengelig.</small>',
+'file-nohires' => 'Ingen høyere oppløsning tilgjengelig.',
'svg-long-desc' => 'SVG-fil, standardoppløsning $1 × $2 piksler, filstørrelse: $3',
'show-big-image' => 'Full oppløsning',
-'show-big-image-preview' => '<small>Størrelsen på denne forhåndsvisningen: $1.</small>',
-'show-big-image-other' => '<small>Andre oppløsninger: $1.</small>',
+'show-big-image-preview' => 'Størrelse på denne forhåndsvisningen: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Annen oppløsning|Andre oppløsninger}}: $1.',
'show-big-image-size' => '$1 × $2 piksler',
'file-info-gif-looped' => 'gjentas',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ramme|rammer}}',
@@ -2751,6 +3091,14 @@ Ved å åpne den kan systemet ditt kompromitteres.",
'bydate' => 'etter dato',
'sp-newimages-showfrom' => 'Vis nye filer fra og med $2 $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'hours-abbrev' => '$1t',
+'seconds' => '{{PLURAL:$1|$1 sekund|$1 sekunder}}',
+'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutter}}',
+'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dager}}',
+'ago' => '$1 siden',
+
# Bad image list
'bad_image_list' => 'Formatet er som følger:
@@ -3242,13 +3590,6 @@ Denne bekreftelseskoden går ut på dato $4.',
'scarytranscludefailed' => '[Malen kunne ikke hentes for $1]',
'scarytranscludetoolong' => '[URL-en er for lang]',
-# Trackbacks
-'trackbackbox' => 'Tilbakesporinger for denne siden:<br />
-$1',
-'trackbackremove' => '([$1 Slett])',
-'trackbacklink' => 'Tilbakesporing',
-'trackbackdeleteok' => 'Tilbakesporingen ble slettet.',
-
# Delete conflict
'deletedwhileediting' => "'''Advarsel:''' Denne siden har blitt slettet etter at du begynte å redigere den!",
'confirmrecreate' => '«[[User:$1|$1]]» ([[User talk:$1|diskusjon]]) slettet siden etter at du begynte å redigere den, med begrunnelsen «$2». Vennligst bekreft at du vil gjenopprette siden.',
@@ -3358,6 +3699,9 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
'hebrew-calendar-m11-gen' => 'Ab',
'hebrew-calendar-m12-gen' => 'Elúl',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ukjent tilleggsmerking «$1»',
'duplicate-defaultsort' => 'Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».',
@@ -3411,9 +3755,10 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
# Special:SpecialPages
'specialpages' => 'Spesialsider',
-'specialpages-note' => '* Normale spesialsider.
-* <span class="mw-specialpagerestricted">Beskyttede spesialsider.</span>
-* <span class="mw-specialpagecached">Cachede spesialsider (kan være utgått).</span>',
+'specialpages-note' => '----
+* Normale spesialsider.
+* <span class="mw-specialpagerestricted">Spesialsider med begrenset tilgang.</span>
+* <span class="mw-specialpagecached">Spesialsider som oppdateres periodisk (kan være foreldede).</span>',
'specialpages-group-maintenance' => 'Vedlikeholdsrapporter',
'specialpages-group-other' => 'Andre spesialsider',
'specialpages-group-login' => 'Innlogging / registrering',
@@ -3455,13 +3800,16 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
'tags-hitcount' => '{{PLURAL:$1|én endring|$1 endringer}}',
# Special:ComparePages
-'comparepages' => 'Sammenlign sider',
-'compare-selector' => 'Sammenlign siderevisjoner',
-'compare-page1' => 'Side 1',
-'compare-page2' => 'Side 2',
-'compare-rev1' => 'Revisjon 1',
-'compare-rev2' => 'Revisjon 2',
-'compare-submit' => 'Sammenlign',
+'comparepages' => 'Sammenlign sider',
+'compare-selector' => 'Sammenlign siderevisjoner',
+'compare-page1' => 'Side 1',
+'compare-page2' => 'Side 2',
+'compare-rev1' => 'Revisjon 1',
+'compare-rev2' => 'Revisjon 2',
+'compare-submit' => 'Sammenlign',
+'compare-invalid-title' => 'Tittelen du oppga er ugyldig.',
+'compare-title-not-exists' => 'Tittelen du oppga eksisterer ikke.',
+'compare-revision-not-exists' => 'Versjonen du oppga eksisterer ikke.',
# Database error messages
'dberr-header' => 'Wikien har et problem',
@@ -3488,4 +3836,90 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
+# New logging system
+'logentry-delete-delete' => '$1 slettet siden $3',
+'logentry-delete-restore' => '$1 gjenopprettet siden $3',
+'logentry-delete-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
+'logentry-delete-revision' => '$1 endret synlighet av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
+'logentry-delete-event-legacy' => '$1 endret synlighet av loggede hendelser på $3',
+'logentry-delete-revision-legacy' => '$1 endret synlighet av revisjoner på side $3',
+'logentry-suppress-delete' => '$1 skjult side $3',
+'logentry-suppress-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
+'logentry-suppress-event-legacy' => '$1 endret skjult synligheten av loggede hendelser på $3',
+'logentry-suppress-revision-legacy' => '$1 endret skjult synligheten av revisjoner på side $3',
+'revdelete-content-hid' => 'innhold skjult',
+'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
+'revdelete-uname-hid' => 'brukernavn skjult',
+'revdelete-content-unhid' => 'innhold synlig',
+'revdelete-summary-unhid' => 'redigeringsbeskrivelse synlig',
+'revdelete-uname-unhid' => 'brukernavn synlig',
+'revdelete-restricted' => 'begrensninger gjelder også administratorer',
+'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
+'logentry-move-move' => '$1 flyttet siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 flyttet siden $3 til $4 uten å etterlate en omdirigering',
+'logentry-move-move_redir' => '$1 flyttet siden $3 til $4 over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 flyttet siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
+'logentry-patrol-patrol' => '$1 markerte revisjon $4 av siden $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1 markerte automatisk revisjon $4 av siden $3 som patruljert',
+'logentry-newusers-newusers' => '$1 opprettet en brukerkonto',
+'logentry-newusers-create' => '$1 oppretteten brukerkonto',
+'logentry-newusers-create2' => '$1 opprettet en brukerkonto $3',
+'logentry-newusers-autocreate' => 'Konto $1 ble opprettet automatisk',
+'newuserlog-byemail' => 'passord sendt på e-post',
+
+# Feedback
+'feedback-bugornote' => 'Hvis du er klar til å sende inn en detaljert feilrapport, vennligst [$1 rapporter en feil].
+Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. Kommentaren din vil bli lagt til siden "[$3 $2]", sammen med brukernavnet ditt og informasjon om hvilken nettleser du bruker.',
+'feedback-subject' => 'Emne:',
+'feedback-message' => 'Melding:',
+'feedback-cancel' => 'Avbryt',
+'feedback-submit' => 'Send tilbakemelding',
+'feedback-adding' => 'Tilføyer tilbakmelding til side ...',
+'feedback-error1' => 'Feil: Ukjent resultat fra API',
+'feedback-error2' => 'Feil: Redigering feilet',
+'feedback-error3' => 'Feil: Ingen respons fra API',
+'feedback-thanks' => 'Din tilbakemelding til siden "[ $2 $1 ]" er sendt. Takk skal du ha!',
+'feedback-close' => 'Utført',
+'feedback-bugcheck' => 'Suprert! Bare sjekk at den ikke er en av de [$1 kjente feilene]',
+'feedback-bugnew' => 'Jeg sjekket. Rapporter en ny bug.',
+
+# API errors
+'api-error-badaccess-groups' => 'Du har ikke tillatelse til å laste opp filer til denne wikien.',
+'api-error-badtoken' => 'Intern feil: Ugyldig token.',
+'api-error-copyuploaddisabled' => 'Opplasting ved URL er deaktivert på denne tjeneren.',
+'api-error-duplicate' => 'Det er allerede {{PLURAL:$1|en [$2 annen fil]|flere [$2 andre filer]}} på denne siden med samme innhold.',
+'api-error-duplicate-archive' => 'Det fantes {{PLURAL:$1|[$2 en annen fil]|[$2 noen andre filer]}} på siden som hadde samme innhold, men {{PLURAL:$1|den|de}} ble slettet.',
+'api-error-duplicate-archive-popup-title' => 'Duplikat-{{PLURAL:$1|fil|filer}} som allerede har blitt slettet',
+'api-error-duplicate-popup-title' => 'Duplikat {{PLURAL:$1|fil|filer}}',
+'api-error-empty-file' => 'Filen du sendte inn var tom.',
+'api-error-emptypage' => 'Det er ikke tillatt å opprette nye, tomme sider.',
+'api-error-fetchfileerror' => 'Intern feil: Noe gikk galt ved henting av denne filen.',
+'api-error-file-too-large' => 'Filen du la inn var for stor.',
+'api-error-filename-tooshort' => 'Filnavnet er for kort.',
+'api-error-filetype-banned' => 'Denne filtypen er ikke tillatt.',
+'api-error-filetype-missing' => 'Filen mangler filendelse.',
+'api-error-hookaborted' => 'Endringen du prøvde å gjøre ble avbrutt av en utvidelsestilkobling.',
+'api-error-http' => 'Intern feil: kan ikke få forbindelse til server.',
+'api-error-illegal-filename' => 'Filnavnet er ikke tillatt.',
+'api-error-internal-error' => 'Intern feil: Noe gikk galt ved prosessering av din opplastning til wikien.',
+'api-error-invalid-file-key' => 'Intern feil: Fil ble ikke funnet i midlertidig lagerplass',
+'api-error-missingparam' => 'Intern feil: Manglende parameter i forespørselen',
+'api-error-missingresult' => 'Intern feil: Kan ikke bekrefte at kopieringen var vellykket.',
+'api-error-mustbeloggedin' => 'Du må være logget inn for å laste opp filer.',
+'api-error-mustbeposted' => 'Intern feil: forespørsel krever HTTP POST.',
+'api-error-noimageinfo' => 'Opplastingen var vellykket, men serveren returnerte ikke noe informasjon om filen.',
+'api-error-nomodule' => 'Intern feil: ingen opplastningsmodul har blitt valgt.',
+'api-error-ok-but-empty' => 'Intern feil: ingen svar fra server.',
+'api-error-overwrite' => 'Det er ikke tillatt å overskrive eksisterende filer.',
+'api-error-stashfailed' => 'Internal error: tjeneren greide ikke å lagre midlertidig fil.',
+'api-error-timeout' => 'Serveren svarte ikke innenfor forventet tid.',
+'api-error-unclassified' => 'En ukjent feil har oppstått',
+'api-error-unknown-code' => 'Ukjent feil: "$1"',
+'api-error-unknown-error' => 'Intern feil: Noe gikk galt ved opplastning av filen din.',
+'api-error-unknown-warning' => 'Ukjent advarsel: $1',
+'api-error-unknownerror' => 'Ukjent feil: «$1».',
+'api-error-uploaddisabled' => 'Opplastning har blitt deaktivert på denne wikien.',
+'api-error-verification-error' => 'Filen kan være korrupt, eller ha feil filendelse.',
+
);
diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php
index e903d854..a518c43f 100644
--- a/languages/messages/MessagesNds.php
+++ b/languages/messages/MessagesNds.php
@@ -55,33 +55,33 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#wiederleiden', '#WEITERLEITUNG', '#REDIRECT' ),
- 'notoc' => array( '0', '__KEENINHOLTVERTEKEN__', '__KEIN_INHALTSVERZEICHNIS__', '__NOTOC__' ),
- 'forcetoc' => array( '0', '__WIESINHOLTVERTEKEN__', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INHOLTVERTEKEN__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
- 'noeditsection' => array( '0', '__KEENÄNNERNLINK__', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'AKTMAAND', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'AKTMAANDNAAM', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'AKTMAANDNAAMGEN', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
- 'currentday' => array( '1', 'AKTDAG', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'AKTDAGNAAM', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AKTJOHR', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AKTTIED', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
- 'numberofarticles' => array( '1', 'ARTIKELTALL', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
- 'pagename' => array( '1', 'SIETNAAM', 'SEITENNAME', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SIETNAAME', 'SEITENNAME_URL', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAAMRUUM', 'NAMENSRAUM', 'NAMESPACE' ),
- 'img_thumbnail' => array( '1', 'duum', 'miniatur', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'rechts', 'right' ),
- 'img_left' => array( '1', 'links', 'left' ),
- 'img_none' => array( '1', 'keen', 'ohne', 'none' ),
- 'img_center' => array( '1', 'merrn', 'zentriert', 'center', 'centre' ),
- 'img_framed' => array( '1', 'rahmt', 'gerahmt', 'framed', 'enframed', 'frame' ),
- 'sitename' => array( '1', 'STEEDNAAM', 'PROJEKTNAME', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'localurl' => array( '0', 'STEEDURL:', 'LOKALE_URL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'STEEDURLE:', 'LOCALURLE:' ),
- 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+ 'redirect' => array( '0', '#wiederleiden', '#WEITERLEITUNG', '#REDIRECT' ),
+ 'notoc' => array( '0', '__KEENINHOLTVERTEKEN__', '__KEIN_INHALTSVERZEICHNIS__', '__NOTOC__' ),
+ 'forcetoc' => array( '0', '__WIESINHOLTVERTEKEN__', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INHOLTVERTEKEN__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__KEENÄNNERNLINK__', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'AKTMAAND', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'AKTMAANDNAAM', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'AKTMAANDNAAMGEN', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
+ 'currentday' => array( '1', 'AKTDAG', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
+ 'currentdayname' => array( '1', 'AKTDAGNAAM', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AKTJOHR', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AKTTIED', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
+ 'numberofarticles' => array( '1', 'ARTIKELTALL', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
+ 'pagename' => array( '1', 'SIETNAAM', 'SEITENNAME', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SIETNAAME', 'SEITENNAME_URL', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAAMRUUM', 'NAMENSRAUM', 'NAMESPACE' ),
+ 'img_thumbnail' => array( '1', 'duum', 'miniatur', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'rechts', 'right' ),
+ 'img_left' => array( '1', 'links', 'left' ),
+ 'img_none' => array( '1', 'keen', 'ohne', 'none' ),
+ 'img_center' => array( '1', 'merrn', 'zentriert', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'rahmt', 'gerahmt', 'framed', 'enframed', 'frame' ),
+ 'sitename' => array( '1', 'STEEDNAAM', 'PROJEKTNAME', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'localurl' => array( '0', 'STEEDURL:', 'LOKALE_URL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'STEEDURLE:', 'LOCALURLE:' ),
+ 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
);
@@ -570,20 +570,22 @@ Wenn dat nich de Fall is, denn hest du villicht en Fehler in de Software funnen.
'formerror' => 'Fehler: De Software kunn dat Formular nich verarbeiden',
'badarticleerror' => 'Disse Aktschoon kann op disse Siet nich anwennt warrn.',
'cannotdelete' => 'De Software kunn "$1" nich wegsmieten. Mööglicherwies is de al vun en annern wegsmeten worrn.',
+'cannotdelete-title' => 'De Sied "$1" kunn nich wegsmeten warrn.',
'badtitle' => 'Ungülligen Titel',
'badtitletext' => 'De Titel vun de opropene Siet weer ungüllig, leddig, oder en ungülligen Spraaklink vun en annern Wiki.',
-'perfcached' => 'Disse Daten kamen ut den Cache un sünd mööglicherwies nich aktuell:',
-'perfcachedts' => 'Disse Daten sünd ut’n Cache, tolest aktuell maakt worrn sünd se $1.',
+'perfcached' => "Disse Daten kamen ut den Cache un sünd mööglicherwies nich aktuell. Op't Höögst {{PLURAL:$1|en Resultat is|$1 Resultaten sünd}} in'n Cache verföögbor.",
+'perfcachedts' => "Disse Daten sünd ut’n Cache, tolest aktuell maakt worrn sünd se $1. Op't Höögst {{PLURAL:$4|en Resultat is|$4 Resultaten sünd}} in'n Cache verföögbor.",
'querypage-no-updates' => "'''Dat aktuell Maken vun disse Siet is opstunns utstellt. De Daten warrt för’t Eerste veröllert blieven.'''",
'wrong_wfQuery_params' => 'Falschen Parameter för wfQuery()<br />
Funktschoon: $1<br />
Query: $2',
'viewsource' => 'Dokmentborn ankieken',
-'viewsourcefor' => 'för $1',
+'viewsource-title' => 'De Born vun $1 wiesen.',
'actionthrottled' => 'Akschoon in de Tall begrenzt',
'actionthrottledtext' => 'Disse Akschoon kann blot en bestimmte Tall mal in en bestimmte Tiet utföhrt warrn. Du hest disse Grenz nu anreckt. Versöök dat later noch wedder.',
'protectedpagetext' => 'Disse Siet is sparrt, dat een se nich ännern kann.',
'viewsourcetext' => 'Kannst den Borntext vun disse Siet ankieken un koperen:',
+'viewyourtext' => "Du kannst '''dien Ännern''' an de Born vun düsse Sied ankieken un koperen:",
'protectedinterface' => 'Op disse Siet staht Narichtentexte för dat System un de Siet is dorüm sparrt.',
'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.
@@ -675,6 +677,7 @@ In de E-Mail steiht, wat du doon musst.',
'noemailprefs' => 'Geev en E-Mail-Adress an, dat du disse Funkschonen bruken kannst.',
'emailconfirmlink' => 'Nettbreef-Adress bestätigen',
'invalidemailaddress' => 'Mit de E-Mail-Adress weer nix antofangen, dor stimmt wat nich mit dat Format. Geev en k’rekkte Adress in oder laat dat Feld leddig.',
+'cannotchangeemail' => 'De E-Mail-Adressen köönt op disse Sied nich ännert warrn.',
'accountcreated' => 'Brukerkonto inricht',
'accountcreatedtext' => 'Dat Brukerkonto $1 is nee opstellt worrn.',
'createaccount-title' => 'Konto anleggen för {{SITENAME}}',
@@ -690,6 +693,7 @@ Tööv en Stoot, ehrdat du dat noch wedder versöchst.',
# E-mail sending
'php-mail-error-unknown' => 'Unbekennten Fehler in PHP sien mail()-Funkschoon',
+'user-mail-no-addy' => 'Versöch en E-Mail ahn E-Mail-Adress to sennen.',
# Change password dialog
'resetpass' => 'Passwoord ännern',
@@ -712,6 +716,9 @@ Villicht hest du dien Passwoord al ännert oder noch wedder en nee temporär Pas
'passwordreset' => 'Passwoord torüchsetten',
'passwordreset-legend' => 'Passwoord torüchsetten',
+# Special:ChangeEmail
+'changeemail' => 'E-Mail-Adress ännern',
+
# Edit page toolbar
'bold_sample' => 'Fetten Text',
'bold_tip' => 'Fetten Text',
@@ -779,9 +786,6 @@ Wenn du över de Sperr snacken wist, denn mell di bi $1 oder een vun de [[{{Medi
* Grund för’n Block: $2
* Wokeen hett blockt: $1",
'blockednoreason' => 'keen Grund angeven',
-'blockedoriginalsource' => "De Borntext vun '''$1''' warrt hier wiest:",
-'blockededitsource' => "De Text vun '''diene Ännern''' an '''$1''':",
-'whitelistedittitle' => 'de Sied to ännern is dat nödig, anmellt to wesen',
'whitelistedittext' => 'Du musst di $1, dat du Sieden ännern kannst.',
'confirmedittext' => 'Du musst dien E-Mail-Adress bestätigen, dat du wat ännern kannst. Stell dien E-Mail-Adress in de [[Special:Preferences|{{int:preferences}}]] in un bestätig ehr.',
'nosuchsectiontitle' => 'Dissen Afsnitt gifft dat nich',
@@ -1006,8 +1010,6 @@ As Administrater kannst du [$1 mit dissen Lenk] den Ãœnnerscheed ankieken.',
'revdelete-unsuppress' => 'Inschränkungen för wedderhaalte Versionen wegdoon',
'revdelete-log' => 'Grund:',
'revdelete-submit' => 'Op utwählte Version anwennen',
-'revdelete-logentry' => 'Sichtborkeit vun Version för [[$1]] ännert',
-'logdelete-logentry' => 'Sichtborkeit vun Begeevnis för [[$1]] ännert',
'revdelete-success' => "'''Sichtborkeit vun Version mit Spood ännert.'''",
'revdelete-failure' => "'''Sichtborkeit vun de Version kunn nich ännert warrn.'''
$1",
@@ -1017,15 +1019,6 @@ $1",
'revdel-restore-visible' => 'sichtbore Verschonen',
'pagehist' => 'Versionshistorie',
'deletedhist' => 'wegsmetene Versionen',
-'revdelete-content' => 'Inholt',
-'revdelete-summary' => 'Tosamenfaten',
-'revdelete-uname' => 'Brukernaam',
-'revdelete-restricted' => 'Inschränkungen för Administraters instellt',
-'revdelete-unrestricted' => 'Inschränkungen för Administraters rutnahmen',
-'revdelete-hid' => 'hett $1 versteken',
-'revdelete-unhid' => 'hett $1 wedder sichtbor maakt',
-'revdelete-log-message' => '$1 för $2 {{PLURAL:$2|Version|Versionen}}',
-'logdelete-log-message' => '$1 för $2 {{PLURAL:$2|Logbook-Indrag|Logbook-Indrääg}}',
'revdelete-edit-reasonlist' => 'Grünn för’t Wegsmieten ännern',
# Suppression log
@@ -1161,7 +1154,7 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
'prefs-rc' => 'Letzte Ännern un Wiesen vun kotte Sieten',
'prefs-watchlist' => 'Oppasslist',
'prefs-watchlist-days' => 'Maximumtall Daag, de in de Oppasslist wiest warrt:',
-'prefs-watchlist-days-max' => 'Maximal 7 Daag',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Maximumtall Daag, de in de verwiederte Oppasslist wiest warrt:',
'prefs-watchlist-edits-max' => 'Maximaltall: 1000',
'prefs-watchlist-token' => 'Oppasslistenslötel:',
@@ -1353,7 +1346,6 @@ Dat kann nich wedder ungeschehn maakt warrn.',
'right-autopatrol' => 'Egene Ännern automaatsch as nakeken marken',
'right-patrolmarks' => 'Nakeken-Teken in de Ne’esten Ännern ankieken',
'right-unwatchedpages' => 'List mit Sieden, de op kene Oppasslist staht, ankieken',
-'right-trackback' => 'Trackback övermiddeln',
'right-mergehistory' => 'Versionsgeschichten tohoopföhren',
'right-userrights' => 'Brukerrechten ännern',
'right-userrights-interwiki' => 'Brukerrechten op annere Wikis ännern',
@@ -1396,7 +1388,6 @@ Dat kann nich wedder ungeschehn maakt warrn.',
'action-patrol' => 'anner Brukers jemehr Ännern as nakeken to marken',
'action-autopatrol' => 'egen Ännern as nakeken to marken',
'action-unwatchedpages' => 'de List mit Sieden, de op kene Oppasslist staht, antokieken',
-'action-trackback' => 'en Trackback to överdragen',
'action-mergehistory' => 'de Versionengeschichten vun disse Sied tohooptoföhren',
'action-userrights' => 'all Brukerrechten to ännern',
'action-userrights-interwiki' => 'de Rechten vun Brukers op annere Wikis to ännern',
@@ -1827,12 +1818,8 @@ Kiek ok bi de [[Special:WantedCategories|wünschten Kategorien]].',
'activeusers-noresult' => 'Keen Brukers funnen.',
# Special:Log/newusers
-'newuserlogpage' => 'Ne’e-Bruker-Logbook',
-'newuserlogpagetext' => 'Dit is dat Logbook för nee opstellte Brukerkonten.',
-'newuserlog-byemail' => 'Passwoord per E-Mail toschickt',
-'newuserlog-create-entry' => 'Nee Bruker',
-'newuserlog-create2-entry' => 'hett nee Brukerkonto „$1“ opstellt',
-'newuserlog-autocreate-entry' => 'Brukerkonto automaatsch opstellt',
+'newuserlogpage' => 'Ne’e-Bruker-Logbook',
+'newuserlogpagetext' => 'Dit is dat Logbook för nee opstellte Brukerkonten.',
# Special:ListGroupRights
'listgrouprights' => 'Brukergruppen-Rechten',
@@ -1961,8 +1948,6 @@ Segg to, dat du över de Folgen Bescheed weetst un dat du in Övereenstimmen mit
'actioncomplete' => 'Akschoon trech',
'actionfailed' => 'Akschoon fehlslaan',
'deletedtext' => 'De Artikel „$1“ is nu wegsmeten. Op $2 gifft dat en Logbook vun de letzten Löschakschonen.',
-'deletedarticle' => '„[[$1]]“ wegsmeten',
-'suppressedarticle' => 'hett „[[$1]]“ versteken',
'dellogpage' => 'Lösch-Logbook',
'dellogpagetext' => 'Hier is en List vun de letzten Löschen.',
'deletionlog' => 'Lösch-Logbook',
@@ -2082,7 +2067,6 @@ Den Text vun de wegsmetene Sied köönt blot Administraters sehn.',
'undeletereset' => 'Afbreken',
'undeleteinvert' => 'Utwahl ümkehrn',
'undeletecomment' => 'Grund:',
-'undeletedarticle' => '„[[$1]]“ wedderhaalt',
'undeletedrevisions' => '{{PLURAL:$1|ene Version|$1 Versionen}} wedderhaalt',
'undeletedrevisions-files' => '{{PLURAL:$1|Ene Version|$1 Versionen}} un {{PLURAL:$2|ene Datei|$2 Datein}} wedderhaalt',
'undeletedfiles' => '{{PLURAL:$1|ene Datei|$1 Datein}} wedderhaalt',
@@ -2316,9 +2300,6 @@ Diskuschoonssiet nich, vun wegen dat dat dor al ene Siet mit dissen Titel gifft.
'movepage-page-moved' => 'De Siet „$1“ is nu schaven na „$2“.',
'movepage-page-unmoved' => 'De Siet „$1“ kunn nich na „$2“ schaven warrn.',
'movepage-max-pages' => 'De Maximaltall vun $1 {{PLURAL:$1|Siet|Sieden}} is schaven. All de annern Sieden warrt nich automaatsch schaven.',
-'1movedto2' => '[[$1]] is nu na [[$2]] verschaven.',
-'1movedto2_redir' => '[[$1]] is nu na [[$2]] verschaven un hett den olen Redirect överschreven.',
-'move-redirect-suppressed' => 'Redirect ünnerdrückt',
'movelogpage' => 'Schuuv-Logbook',
'movelogpagetext' => 'Dit is ene List vun all schavene Sieden.',
'movesubpage' => '{{PLURAL:$1|Ãœnnersiede|Ãœnnersieden}}',
@@ -2543,9 +2524,6 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
# Patrol log
'patrol-log-page' => 'Nakiek-Logbook',
'patrol-log-header' => 'Dit is dat Patrolleer-Logbook.',
-'patrol-log-line' => '$1 vun $2 as nakeken markt $3',
-'patrol-log-auto' => '(automaatsch)',
-'patrol-log-diff' => 'Version $1',
'log-show-hide-patrol' => 'Nakiek-Logbook $1',
# Image deletion
@@ -2570,7 +2548,7 @@ $1',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|Ene Siet|$3 Sieden}}',
'file-info' => 'Grött: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 Pixel, Grött: $3, MIME-Typ: $4',
-'file-nohires' => '<small>Gifft dat Bild nich grötter.</small>',
+'file-nohires' => 'Gifft dat Bild nich grötter.',
'svg-long-desc' => 'SVG-Datei, Utgangsgrött: $1 × $2 Pixel, Dateigrött: $3',
'show-big-image' => 'Dat Bild wat grötter',
'file-info-gif-looped' => 'löppt as Slööp',
@@ -2926,13 +2904,6 @@ Wenn du dat nich sülvst wesen büst, denn folg den Lenk nich. De Bestätigungsk
'scarytranscludefailed' => '[Vörlaag halen för $1 hett nich klappt]',
'scarytranscludetoolong' => '[URL is to lang]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks för disse Sied:<br />
-$1',
-'trackbackremove' => '([$1 wegsmieten])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback mit Spood wegsmeten.',
-
# Delete conflict
'deletedwhileediting' => "'''Wohrschau''': Disse Siet is wegsmeten worrn, wieldes du ehr graad ännert hest!",
'confirmrecreate' => "De Bruker [[User:$1|$1]] ([[User talk:$1|talk]]) hett disse Siet wegsmeten, nadem du dat Ännern anfungen hest. He hett as Grund schreven:
@@ -3129,4 +3100,9 @@ Geev den Dateinaam ahn den Tosatz „{{ns:file}}:“ an.',
'sqlite-has-fts' => '$1 mit Stöhn för Vulltext-Söök',
'sqlite-no-fts' => '$1 ahn Stöhn för Vulltext-Söök',
+# New logging system
+'revdelete-restricted' => 'Inschränkungen för Administraters instellt',
+'revdelete-unrestricted' => 'Inschränkungen för Administraters rutnahmen',
+'newuserlog-byemail' => 'Passwoord per E-Mail toschickt',
+
);
diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php
index 5a25762f..81a29276 100644
--- a/languages/messages/MessagesNds_nl.php
+++ b/languages/messages/MessagesNds_nl.php
@@ -23,30 +23,35 @@ $fallback = 'nl';
$namespaceNames = array(
NS_MEDIA => 'Media',
- NS_SPECIAL => 'Speciaal',
+ NS_SPECIAL => 'Spesiaal',
NS_TALK => 'Overleg',
NS_USER => 'Gebruker',
NS_USER_TALK => 'Overleg_gebruker',
NS_PROJECT_TALK => 'Overleg_$1',
- NS_FILE => 'Ofbeelding',
- NS_FILE_TALK => 'Overleg_ofbeelding',
+ NS_FILE => 'Bestaand',
+ NS_FILE_TALK => 'Overleg_bestaand',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'Overleg_MediaWiki',
NS_TEMPLATE => 'Mal',
NS_TEMPLATE_TALK => 'Overleg_mal',
NS_HELP => 'Hulpe',
NS_HELP_TALK => 'Overleg_hulpe',
- NS_CATEGORY => 'Kattegerie',
- NS_CATEGORY_TALK => 'Overleg_kattegerie',
+ NS_CATEGORY => 'Kategorie',
+ NS_CATEGORY_TALK => 'Overleg_kategorie',
);
$namespaceAliases = array(
- 'Speciaol' => NS_SPECIAL,
- 'Sjabloon' => NS_TEMPLATE,
- 'Overleg_sjabloon' => NS_TEMPLATE_TALK,
- 'Categorie' => NS_CATEGORY,
- 'Overleg_categorie' => NS_CATEGORY_TALK,
- 'Overleg_help' => NS_HELP_TALK,
+ 'Speciaol' => NS_SPECIAL,
+ 'Speciaal' => NS_SPECIAL,
+ 'Sjabloon' => NS_TEMPLATE,
+ 'Overleg_sjabloon' => NS_TEMPLATE_TALK,
+ 'Ofbeelding' => NS_FILE,
+ 'Overleg_ofbeelding' => NS_FILE_TALK,
+ 'Categorie' => NS_CATEGORY,
+ 'Overleg_categorie' => NS_CATEGORY_TALK,
+ 'Kattegerie' => NS_CATEGORY,
+ 'Overleg_categorie' => NS_CATEGORY_TALK,
+ 'Overleg_kattegerie' => NS_HELP_TALK,
);
$dateFormats = array(
@@ -69,171 +74,173 @@ $bookstoreList = array(
#!!# Translation <b>HLEERSTE:</b> is used more than once for <a href="#mw-sp-magic-lcfirst">lcfirst</a> and <a href="#mw-sp-magic-ucfirst">ucfirst</a>.
$magicWords = array(
- 'redirect' => array( '0', '#DEURVERWIEZING', '#DOORVERWIJZING', '#REDIRECT' ),
- 'notoc' => array( '0', '__GIENONDERWARPEN__', '__GEENINHOUD__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__GIENGALLERIEJE__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORCEERONDERWARPEN__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ONDERWARPEN__', '__INHOUD__', '__TOC__' ),
- 'noeditsection' => array( '0', '__GIENBEWARKSECTIE__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__GIENKOPJEN__', '__GEENKOP__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'DISSEMAOND', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'DISSEMAONDNAAM', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'DISSEMAONDGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'DISSEMAONDOFK', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DISSEDAG', 'HUIDIGEDAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DISSEDAG2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'DISSEDAGNAAM', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'DITJAOR', 'HUIDIGJAAR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'DISSETIED', 'HUIDIGETIJD', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'DITURE', 'HUIDIGUUR', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALEMAOND', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALEMAOND1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKALEMAONDNAAM', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKALEMAONDNAAMGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LOKALEMAONDOFK', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALEDAG', 'PLAATSELIJKEDAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALEDAG2', 'PLAATSELIJKEDAG2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKALEDAGNAAM', 'PLAATSELIJKEDAGNAAM', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKAALJAOR', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALETIED', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKAALURE', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ANTALPAGINAS', 'ANTALPAGINA\'S', 'ANTALPAGINA’S', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ANTALARTIKELS', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ANTALBESTANDEN', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ANTALGEBRUKERS', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ANTALACTIEVEGEBRUKERS', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ANTALBEWARKINGEN', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'ANTALKERENBEKEKEN', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'PAGINANAAM', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAAMRUUMTE', 'NAAMRUIMTE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NAAMRUUMTEE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'OVERLEGRUUMTE', 'OVERLEGRUIMTE', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'OVERLEGRUUMTEE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ONDERWARPRUUMTE', 'ARTIKELRUUMTE', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ONDERWARPRUUMTEE', 'ARTIKELRUUMTEE', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'HELEPAGINANAAM', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'HELEPAGINANAAME', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'BAOSISPAGINANAAM', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'BAOSISPAGINANAAME', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ONDERWARPPAGINANAAM', 'ARTIKELPAGINANAAM', 'ONDERWERPPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ONDERWARPPAGINANAAME', 'ARTIKELPAGINANAAME', 'ONDERWERPPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'BERICH:', 'BERICHT:', 'MSG:' ),
- 'subst' => array( '0', 'VERVANG:', 'VERV:', 'SUBST:' ),
- 'msgnw' => array( '0', 'BERICHNW', 'BERICHTNW', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'duumnegel', 'doemnaegel', 'miniatuur', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'duumnegel=$1', 'doemnegel=$1', 'miniatuur=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'rechs', 'rechts', 'right' ),
- 'img_left' => array( '1', 'links', 'left' ),
- 'img_none' => array( '1', 'gien', 'geen', 'none' ),
- 'img_center' => array( '1', 'ecentreerd', 'gecentreerd', 'center', 'centre' ),
- 'img_framed' => array( '1', 'umraand', 'omkaderd', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'kaoderloos', 'kaderloos', 'frameless' ),
- 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'rechop', 'rechop=$1', 'rechop $1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'raand', 'rand', 'border' ),
- 'img_baseline' => array( '1', 'grondliende', 'grondlijn', 'baseline' ),
- 'img_top' => array( '1', 'boven', 'top' ),
- 'img_text_top' => array( '1', 'tekse-boven', 'tekst-boven', 'text-top' ),
- 'img_middle' => array( '1', 'midden', 'middle' ),
- 'img_bottom' => array( '1', 'benejen', 'beneden', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekse-benejen', 'tekst-beneden', 'text-bottom' ),
- 'img_link' => array( '1', 'verwiezing=$', 'verwijzing=$1', 'link=$1' ),
- 'sitename' => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
- 'servername' => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMMATICA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GESLACH:', 'GESLACHT:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__GIENTITELCONVERSIE__', '__GIENTC__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__GEENPAGINANAAMCONVERSIE__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__GIENINHOUDCONVERSIE__', '__GIENIC__', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'DISSEWEKE', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'DISSEDVDW', 'HUIDIGEDVDW', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALEWEKE', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'LOKALEDVDW', 'PLAATSELIJKEDVDW', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'REVISIEID', 'REVISIE-ID', 'VERSIEID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'REVISIEDAG', 'VERSIEDAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'REVISIEDAG2', 'VERSIEDAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'REVISIEMAOND', 'VERSIEMAAND', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'REVISIEJAOR', 'VERSIEJAAR', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'REVISIETIEDSTEMPEL', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'VERSIEGEBRUKER', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
- 'plural' => array( '0', 'MEERVOUD:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'FULLURL:' ),
- 'fullurle' => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'HLEERSTE:', 'KLEERSTE:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KL:', 'LC:' ),
- 'uc' => array( '0', 'HL:', 'UC:' ),
- 'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
- 'displaytitle' => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'CODEERURL', 'URLCODEREN', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'CODEERANKER', 'ANKERCODEREN', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'DISSETIEDSTEMPEL', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKALETIEDSTEMPEL', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#TAAL:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAGINASINNAAMRUUMTE', 'PAGINA’SINNAAMRUUMTE', 'PAGINA\'SINNAAMRUUMTE', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ANTALBEHEERDERS', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
- 'padleft' => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
- 'padright' => array( '0', 'RECHSOPVULLEN', 'RECHTSOPVULLEN', 'PADRIGHT' ),
- 'special' => array( '0', 'speciaal', 'special' ),
- 'defaultsort' => array( '1', 'STANDARDSORTERING:', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'BESTANSPAD:', 'BESTANDSPAD:', 'FILEPATH:' ),
- 'tag' => array( '0', 'etiket', 'label', 'tag' ),
- 'hiddencat' => array( '1', '__VERBÖRGENKAT__', '__VERBORGENCAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGINASINKATTEGERIE', 'PAGINASINKAT', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
- 'noindex' => array( '1', '__GIENINDEX__', '__GEENINDEX__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'ANTALINGROEP', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__STAOTISCHEDEURVERWIEZING__', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'BEVEILIGINGSNIVO', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'daotumopmaak', 'datumopmaak', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#DEURVERWIEZING', '#DOORVERWIJZING', '#REDIRECT' ),
+ 'notoc' => array( '0', '__GIENONDERWARPEN__', '__GEENINHOUD__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__GIENGALLERIEJE__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORSEERONDERWARPEN__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ONDERWARPEN__', '__INHOUD__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__GIENBEWARKSEKSIE__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__GIENKOPJEN__', '__GEENKOP__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'DISSEMAOND', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'DISSEMAONDNAAM', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'DISSEMAONDGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'DISSEMAONDAOFK', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'DISSEDAG', 'HUIDIGEDAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DISSEDAG2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'DISSEDAGNAAM', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'DITJAOR', 'HUIDIGJAAR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'DISSETIED', 'HUIDIGETIJD', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'DITURE', 'HUIDIGUUR', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALEMAOND', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALEMAOND1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKALEMAONDNAAM', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKALEMAONDNAAMGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKALEMAONDAOFK', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALEDAG', 'PLAATSELIJKEDAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALEDAG2', 'PLAATSELIJKEDAG2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKALEDAGNAAM', 'PLAATSELIJKEDAGNAAM', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKAALJAOR', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALETIED', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKAALURE', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ANTALPAGINAS', 'ANTALPAGINA\'S', 'ANTALPAGINA’S', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ANTALARTIKELS', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ANTALBESTANDEN', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ANTALGEBRUKERS', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ANTALAKTIEVEGEBRUKERS', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ANTALBEWARKINGEN', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ANTALKERENBEKEKEN', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'PAGINANAAM', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAAMRUUMTE', 'NAAMRUIMTE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NAAMRUUMTEE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'OVERLEGRUUMTE', 'OVERLEGRUIMTE', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'OVERLEGRUUMTEE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ONDERWARPRUUMTE', 'ARTIKELRUUMTE', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ONDERWARPRUUMTEE', 'ARTIKELRUUMTEE', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'HELEPAGINANAAM', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'HELEPAGINANAAME', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'BAOSISPAGINANAAM', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'BAOSISPAGINANAAME', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ONDERWARPPAGINANAAM', 'ARTIKELPAGINANAAM', 'ONDERWERPPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ONDERWARPPAGINANAAME', 'ARTIKELPAGINANAAME', 'ONDERWERPPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'BERICHT:', 'MSG:' ),
+ 'subst' => array( '0', 'VERVANG:', 'VERV:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'BERICHTNW', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'miniatuur', 'duumnegel', 'doemnaegel', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatuur=$1', 'duumnegel=$1', 'doemnaegel=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'rechts', 'right' ),
+ 'img_left' => array( '1', 'links', 'left' ),
+ 'img_none' => array( '1', 'gien', 'geen', 'none' ),
+ 'img_center' => array( '1', 'esentreerd', 'gecentreerd', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'umraand', 'omkaderd', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'kaoderloos', 'kaderloos', 'frameless' ),
+ 'img_page' => array( '1', 'pagina=$1', 'pagina_$1', 'pagina $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'raand', 'rand', 'border' ),
+ 'img_baseline' => array( '1', 'grondliende', 'grondlijn', 'baseline' ),
+ 'img_top' => array( '1', 'boven', 'top' ),
+ 'img_text_top' => array( '1', 'tekste-boven', 'tekst-boven', 'text-top' ),
+ '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=$', 'verwijzing=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTPAD', 'SCRIPTPAD', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'STIELPAD', 'STIJLPAD', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMMATIKA:', 'GRAMMATICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GESLACHTE:', 'GESLACHT:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__GIENTITELKONVERSIE__', '__GIENTC__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__GEENPAGINANAAMCONVERSIE__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__GIENINHOUDKONVERSIE__', '__GIENIC__', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'DISSEWEKE', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'DISSEDVDW', 'HUIDIGEDVDW', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALEWEKE', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'LOKALEDVDW', 'PLAATSELIJKEDVDW', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'REVISIEID', 'REVISIE-ID', 'VERSIEID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'REVISIEDAG', 'VERSIEDAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'REVISIEDAG2', 'VERSIEDAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'REVISIEMAOND', 'VERSIEMAAND', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'REVISIEJAOR', 'VERSIEJAAR', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'REVISIETIEDSTEMPEL', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'VERSIEGEBRUKER', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'MEERVOUD:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KL:', 'LC:' ),
+ 'uc' => array( '0', 'HL:', 'UC:' ),
+ 'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLKODEREN', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ANKERKODEREN', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'DISSETIEDSTEMPEL', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKALETIEDSTEMPEL', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#TAAL:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAGINASINNAAMRUUMTE', 'PAGINA’SINNAAMRUUMTE', 'PAGINA\'SINNAAMRUUMTE', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ANTALBEHEERDERS', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
+ 'padright' => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
+ 'special' => array( '0', 'spesiaal', 'speciaal', 'special' ),
+ 'defaultsort' => array( '1', 'STANDARDSORTERING:', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'BESTAANDSPAD:', 'BESTANDSPAD:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'etiket', 'label', 'tag' ),
+ 'hiddencat' => array( '1', '__VERBÖRGENKAT__', '__VERBORGENCAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGINASINKATEGORIE', 'PAGINASINKAT', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__GIENINDEX__', '__GEENINDEX__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'ANTALINGROEP', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STAOTIESEDEURVERWIEZING__', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'BEVEILIGINGSNIVO', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'daotumopmaak', 'datumopmaak', 'formatdate', 'dateformat' ),
+ 'url_query' => array( '0', 'ZEUKOPDRACHTE', 'ZOEKOPDRACHT', 'QUERY' ),
);
$specialPageAliases = array(
- 'Activeusers' => array( 'Actieve_gebrukers' ),
- 'Allmessages' => array( 'Alle_systeemteksen' ),
+ 'Activeusers' => array( 'Aktieve_gebrukers' ),
+ 'Allmessages' => array( 'Alle_systeemteksten' ),
'Allpages' => array( 'Alle_pagina\'s' ),
'Ancientpages' => array( 'Oudste_pagina\'s' ),
'Blankpage' => array( 'Lege_pagina' ),
'Block' => array( 'Blokkeer_IP' ),
'Blockme' => array( 'Blokkeer_mien' ),
- 'Booksources' => array( 'Boekinfermasie' ),
+ 'Booksources' => array( 'Boekinformasie' ),
'BrokenRedirects' => array( 'Ebreuken_deurverwiezingen' ),
- 'Categories' => array( 'Kattegerieën' ),
- 'ChangePassword' => array( 'Wachwoord_wiezigen' ),
- 'Confirmemail' => array( 'Netpos_bevestigen' ),
+ 'Categories' => array( 'Kategorieën' ),
+ 'ChangePassword' => array( 'Wachtwoord_wiezigen' ),
+ 'Confirmemail' => array( 'Netpost_bevestigen' ),
'Contributions' => array( 'Biedragen' ),
'CreateAccount' => array( 'Gebruker_anmaken' ),
'Deadendpages' => array( 'Gien_verwiezingen' ),
- 'DeletedContributions' => array( 'Vort-ehaolen_gebrukersbiedragen' ),
+ 'DeletedContributions' => array( 'Vort-edaone_gebrukersbiedragen' ),
'Disambiguations' => array( 'Deurverwiespagina\'s' ),
'DoubleRedirects' => array( 'Dubbele_deurverwiezingen' ),
- 'Emailuser' => array( 'Berich_sturen' ),
+ 'Emailuser' => array( 'Bericht_sturen' ),
'Export' => array( 'Uutvoeren' ),
'Fewestrevisions' => array( 'Minste_bewarkingen' ),
- 'FileDuplicateSearch' => array( 'Dubbele_bestanen_zeuken' ),
- 'Filepath' => array( 'Bestaanslokasie' ),
+ 'FileDuplicateSearch' => array( 'Dubbele_bestaanden_zeuken' ),
+ 'Filepath' => array( 'Bestaandslokasie' ),
'Import' => array( 'Invoeren' ),
- 'Invalidateemail' => array( 'Netpos_ongeldig' ),
+ 'Invalidateemail' => array( 'Netpost_ongeldig' ),
'BlockList' => array( 'IP-blokkeerlieste' ),
'LinkSearch' => array( 'Verwiezingen_zeuken' ),
'Listadmins' => array( 'Beheerderslieste' ),
'Listbots' => array( 'Botlieste' ),
- 'Listfiles' => array( 'Ofbeeldingenlieste' ),
- 'Listgrouprights' => array( 'Groepsrechen_bekieken' ),
+ 'Listfiles' => array( 'Bestaandslieste' ),
+ 'Listgrouprights' => array( 'Groepsrechten_bekieken' ),
'Listredirects' => array( 'Deurverwiezingslieste' ),
'Listusers' => array( 'Gebrukerslieste' ),
'Lockdb' => array( 'Databanke_blokkeren' ),
@@ -242,55 +249,55 @@ $specialPageAliases = array(
'Longpages' => array( 'Lange_artikels' ),
'MergeHistory' => array( 'Geschiedenisse_bie_mekaar_doon' ),
'MIMEsearch' => array( 'MIME-zeuken' ),
- 'Mostcategories' => array( 'Meeste_kattegerieën' ),
- 'Mostimages' => array( 'Meeste_ofbeeldingen' ),
+ 'Mostcategories' => array( 'Meeste_kategorieën' ),
+ 'Mostimages' => array( 'Meestgebruukten_bestaanden' ),
'Mostlinked' => array( 'Meest_naor_verwezen_pagina\'s' ),
- 'Mostlinkedcategories' => array( 'Meestgebruken_kattegerieën' ),
- 'Mostlinkedtemplates' => array( 'Meest_naor_verwezen_mallen' ),
+ 'Mostlinkedcategories' => array( 'Meestgebruukten_kategorieën' ),
+ 'Mostlinkedtemplates' => array( 'Meestgebruken_mallen' ),
'Mostrevisions' => array( 'Meeste_bewarkingen' ),
'Movepage' => array( 'Herneum_pagina' ),
'Mycontributions' => array( 'Mien_biedragen' ),
'Mypage' => array( 'Mien_gebrukerspagina' ),
'Mytalk' => array( 'Mien_overleg' ),
'Myuploads' => array( 'Mien_in-elaojen_bestanen' ),
- 'Newimages' => array( 'Nieje_ofbeeldingen' ),
+ 'Newimages' => array( 'Nieje_bestaanden' ),
'Newpages' => array( 'Nieje_pagina\'s' ),
- 'PasswordReset' => array( 'Wachwoord_opniej_instellen' ),
+ 'PasswordReset' => array( 'Wachtwoord_opniej_instellen' ),
'PermanentLink' => array( 'Vaste_verwiezing' ),
'Popularpages' => array( 'Populaire_artikels' ),
'Preferences' => array( 'Veurkeuren' ),
'Prefixindex' => array( 'Veurvoegselindex' ),
- 'Protectedpages' => array( 'Beveiligen_pagina\'s' ),
- 'Protectedtitles' => array( 'Beveiligen_titels' ),
- 'Randompage' => array( 'Zomer_een_artikel' ),
- 'Randomredirect' => array( 'Willekeurige_deurverwiezing' ),
+ 'Protectedpages' => array( 'Beveiligden_pagina\'s' ),
+ 'Protectedtitles' => array( 'Beveiligden_titels' ),
+ 'Randompage' => array( 'Zo_mer_n_artikel' ),
+ 'Randomredirect' => array( 'Zo_mer_n_deurverwiezing' ),
'Recentchanges' => array( 'Leste_wiezigingen' ),
'Recentchangeslinked' => array( 'Volg_verwiezingen' ),
'Revisiondelete' => array( 'Versie_vortdoon' ),
- 'RevisionMove' => array( 'Versie_verplaosen' ),
+ 'RevisionMove' => array( 'Versie_verplaotsen' ),
'Search' => array( 'Zeuken' ),
'Shortpages' => array( 'Korte_artikels' ),
- 'Specialpages' => array( 'Speciale_pagina\'s' ),
- 'Statistics' => array( 'Staotestieken' ),
+ 'Specialpages' => array( 'Spesiale_pagina\'s' ),
+ 'Statistics' => array( 'Staotistieken' ),
'Tags' => array( 'Etiketten' ),
- 'Uncategorizedcategories' => array( 'Kattergieën_zonder_kattegerie' ),
- 'Uncategorizedimages' => array( 'Ofbeeldingen_zonder_kattegerie' ),
- 'Uncategorizedpages' => array( 'Pagina\'s_zonder_kattegerie' ),
- 'Uncategorizedtemplates' => array( 'Mallen_zonder_kattegerie' ),
- 'Undelete' => array( 'Weerummeplaosen' ),
+ 'Uncategorizedcategories' => array( 'Kategorieën_zonder_kategorie' ),
+ 'Uncategorizedimages' => array( 'Bestaanden_zonder_kategorie' ),
+ 'Uncategorizedpages' => array( 'Pagina\'s_zonder_kategorie' ),
+ 'Uncategorizedtemplates' => array( 'Mallen_zonder_kategorie' ),
+ 'Undelete' => array( 'Weerummeplaotsen' ),
'Unlockdb' => array( 'Databanke_vriegeven' ),
- 'Unusedcategories' => array( 'Ongebruken_kattegerieën' ),
- 'Unusedimages' => array( 'Ongebruken_ofbeeldingen' ),
- 'Unusedtemplates' => array( 'Ongebruken_mallen' ),
- 'Unwatchedpages' => array( 'Neet-evolgen_pagina\'s' ),
- 'Upload' => array( 'Bestanen_opsturen' ),
- 'UploadStash' => array( 'Bestanenstallige' ),
+ 'Unusedcategories' => array( 'Ongebruukten_kategorieën' ),
+ 'Unusedimages' => array( 'Ongebruukten_bestaanden' ),
+ 'Unusedtemplates' => array( 'Ongebruukten_mallen' ),
+ 'Unwatchedpages' => array( 'Niet-evolgden_pagina\'s' ),
+ 'Upload' => array( 'Bestaanden_opsturen' ),
+ 'UploadStash' => array( 'Bestaandenstallige' ),
'Userlogin' => array( 'Anmelden' ),
- 'Userlogout' => array( 'Ofmelden' ),
- 'Userrights' => array( 'Gebrukersrechen' ),
+ 'Userlogout' => array( 'Aofmelden' ),
+ 'Userrights' => array( 'Gebrukersrechten' ),
'Version' => array( 'Versie' ),
- 'Wantedcategories' => array( 'Gewunste_kattegerieën' ),
- 'Wantedfiles' => array( 'Gewunste_bestanen' ),
+ 'Wantedcategories' => array( 'Gewunste_kategorieën' ),
+ 'Wantedfiles' => array( 'Gewunste_bestaanden' ),
'Wantedpages' => array( 'Gewunste_pagina\'s' ),
'Wantedtemplates' => array( 'Gewunste_mallen' ),
'Watchlist' => array( 'Volglieste' ),
@@ -659,20 +666,22 @@ Meld t dan effen bie n [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENA
'badarticleerror' => 'Disse haandeling kan op disse pagina niet uutevoerd wörden.',
'cannotdelete' => 'De pagina of t bestaand "$1" kon niet vortedaon wörden.
t Kan ween dat n aander t al vortedaon hef.',
+'cannotdelete-title' => 'Pagina "$1" kan niet vortedaon wörden',
'badtitle' => 'Ongeldige naam',
'badtitletext' => 'De naam van de op-evreugen pagina is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.',
-'perfcached' => 'Disse gegevens kwammen uut t tussengeheugen en bin warschienlik niet aktueel:',
-'perfcachedts' => 'De informasie die hieronder steet, is op-esleugen, en is van $1.',
+'perfcached' => 'Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is maximaal een resultaot|bin maximaal $1 resultaoten}} beschikbaor in t tussengeheugen.',
+'perfcachedts' => 'Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is maximaal een resultaot|bin maximaal $4 resultaoten}} beschikbaor in t tussengeheugen.',
'querypage-no-updates' => "'''Disse pagina wörden niet meer bie-ewörken.'''",
'wrong_wfQuery_params' => 'Parameters veur wfQuery() waren verkeerd<br />
Funksie: $1<br />
Zeukopdrachte: $2',
'viewsource' => 'Brontekste bekieken',
-'viewsourcefor' => 'veur "$1"',
+'viewsource-title' => 'Bron bekieken van $1',
'actionthrottled' => 'Haandeling tegen-ehuilen',
'actionthrottledtext' => "As maotregel tegen t plaotsen van ongewunste verwiezingen, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
'protectedpagetext' => 'Disse pagina is beveiligd um bewarkingen te veurkoemen.',
'viewsourcetext' => 'Je kunnen de brontekste van disse pagina bewarken en bekieken:',
+'viewyourtext' => "Je kunnen '''joew bewarkingen''' an de brontekste van disse pagina bekieken en kopiëren:",
'protectedinterface' => 'Op disse pagina steet n tekste die gebruukt wörden veur systeemteksten van de wiki. Allinnig beheerders kunnen disse pagina bewarken.',
'editinginterface' => "'''Waorschuwing:''' je bewarken n pagina die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Overweeg veur vertalingen um [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net] te gebruken, t vertalingsprojekt veur MediaWiki.",
'sqlhidden' => '(SQL-zeukopdrachte verbörgen)',
@@ -774,6 +783,7 @@ Um misbruuk te veurkoemen wörden der mer één wachtwoordherinnering per {{PLUR
'emailconfirmlink' => 'Bevestig netpostadres',
'invalidemailaddress' => 't Netpostadres kon niet aksepteerd wörden umdat de opmaak ongeldig is.
Voer de juuste opmaak van t adres in of laot t veld leeg.',
+'cannotchangeemail' => 't Netpostadres veur n gebruker kan op disse wiki niet ewiezigd wörden.',
'accountcreated' => 'Gebrukersprofiel is an-emaakt',
'accountcreatedtext' => 'De gebrukersnaam veur $1 is an-emaakt.',
'createaccount-title' => 'Gebrukers anmaken veur {{SITENAME}}',
@@ -790,6 +800,7 @@ Je mutten effen wachten veurda'j t opniej proberen kunnen.",
# E-mail sending
'php-mail-error-unknown' => 'Der was n onbekende fout mit de mail()-funksie van PHP',
+'user-mail-no-addy' => 'Eprobeerd n berichjen te versturen zonder n netpostadres',
# Change password dialog
'resetpass' => 'Wachtwoord wiezigen',
@@ -810,32 +821,47 @@ Misschien he'j t wachtwoord al ewiezigd of n niej veurlopig wachtwoord an-evreug
'resetpass-temp-password' => 'Veurlopig wachtwoord:',
# Special:PasswordReset
-'passwordreset' => 'Wachtwoord opniej instellen',
-'passwordreset-text' => 'Vul dit formulier in zoda-w joe netpost kunnen sturen mit de gebrukersgegevens.',
-'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-username' => 'Gebruker:',
-'passwordreset-domain' => 'Domein:',
-'passwordreset-email' => 'Netpostadres:',
-'passwordreset-emailtitle' => 'Gebrukersgegevens op {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Der hef der ene, warschienlik jie zelf, gebrukersgegevens veur {{SITENAME}} ($4) op-evreugen vanaof t IP-adres $1.
+'passwordreset' => 'Wachtwoord opniej instellen',
+'passwordreset-text' => 'Vul dit formulier in zoda-w joe netpost kunnen sturen mit de gebrukersgegevens.',
+'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-username' => 'Gebruker:',
+'passwordreset-domain' => 'Domein:',
+'passwordreset-capture' => 'De resulterende netpost bekieken?',
+'passwordreset-capture-help' => "A'j dit vakjen anvinken, dan krie'j t netpostbericht (mit t tiedelike wachtwoord) te zien en t wörden naor de gebruker estuurd.",
+'passwordreset-email' => 'Netpostadres:',
+'passwordreset-emailtitle' => 'Gebrukersgegevens op {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Der hef der ene, warschienlik jie zelf, gebrukersgegevens veur {{SITENAME}} ($4) op-evreugen vanaof t IP-adres $1.
De volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:
$2
{{PLURAL:$3|Dit tiedelike wachtwoord vervuilt|Disse tiedelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.
Meld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
-'passwordreset-emailtext-user' => "De gebruker $1 van {{SITENAME}} hef joew gebrukersgegevens veur {{SITENAME}} ($4) op-evreugen vanaof t IP-adres $1.
+'passwordreset-emailtext-user' => "De gebruker $1 van {{SITENAME}} hef joew gebrukersgegevens veur {{SITENAME}} ($4) op-evreugen vanaof t IP-adres $1.
De volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:
$2
{{PLURAL:$3|Dit tiedelike wachtwoord vervuilt|Disse tiedelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.
Meld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
-'passwordreset-emailelement' => 'Gebrukersnaam: $1
+'passwordreset-emailelement' => 'Gebrukersnaam: $1
Tiedelik wachtwoord: $2',
-'passwordreset-emailsent' => 'Der is per netpost n herinnering verstuurd.',
+'passwordreset-emailsent' => 'Der is per netpost n herinnering verstuurd.',
+'passwordreset-emailsent-capture' => "Der is n herinneringsbericht verstuurd. Dit ku'j hieronder lezen.",
+'passwordreset-emailerror-capture' => "Der is n herinneringsbericht an-emaakt. Dit ku'j hieronder lezen. t Versturne naor de gebruker is mislokt um de volgende reden: $1",
+
+# Special:ChangeEmail
+'changeemail' => 'Wiezig netpostadres',
+'changeemail-header' => 'Netpostadres wiezigen',
+'changeemail-text' => "Vul dit formulier in um joew netpostadres te wiezigen. Um disse wieziging te bevestigen mö'j je wachtwoord invoeren.",
+'changeemail-no-info' => 'Je mutten an-emeld ween um drekt toegang te hebben tot disse pagina.',
+'changeemail-oldemail' => 't Ouwe netpostadres:',
+'changeemail-newemail' => 't Nieje netpostadres:',
+'changeemail-none' => '(gien)',
+'changeemail-submit' => 'Netpostadres wiezigen',
+'changeemail-cancel' => 'Aofbreken',
# Edit page toolbar
'bold_sample' => 'Vet-edrokten tekste',
@@ -907,9 +933,6 @@ NB: je kunnen de opsie "n bericht sturen" niet gebruken, behalven a\'j n geldig
Joew IP-adres is $3 en joew blokkeernummer is $5.
Geef disse nummers deur a\'j kontakt mit ene opnemen over de blokkering.',
'blockednoreason' => 'gien reden op-egeven',
-'blockedoriginalsource' => "De brontekste van '''$1''' steet hieronder:",
-'blockededitsource' => "De tekste van '''joew eigen bewarkingen''' an '''$1''' steet hieronder:",
-'whitelistedittitle' => "Um disse pagina te bewarken, mö'j je anmelden",
'whitelistedittext' => "Um pagina's te kunnen wiezigen, mö'j $1 ween",
'confirmedittext' => "Je mutten je netpostadres bevestigen veurda'j bewarken kunnen. Vul je adres in en bevestig t via [[Special:Preferences|mien veurkeuren]].",
'nosuchsectiontitle' => 'Disse seksie besteet niet',
@@ -991,7 +1014,7 @@ Deur op \"Pagina opslaon\" te klikken beleuf je ons da'j disse tekste zelf eschr
'copyrightwarning2' => "Waort je dat alle biedragen an {{SITENAME}} deur aander volk bewarkt of vortedaon kan wörden. A'j niet willen dat joew tekste deur aander volk bewarkt wörden, slao de tekste dan niet op.<br />
Deur op \"Pagina opslaon\" te klikken beleuf je ons da'j disse tekste zelf eschreven hebben, of over-eneumen hebben uut n vrieje, openbaore bron (zie \$1 veur meer informasie).
'''Gebruuk gien spul mit auteursrechten, a'j daor gien toestemming veur hebben!'''",
-'longpageerror' => "'''Foutmelding: de tekste die'j opslaon willen is $1 kilobytes. Dit is groter as t toe-estaone maximum van $2 kilobytes. Joew tekste kan niet op-esleugen wörden.'''",
+'longpageerror' => "'''Foutmelding: de tekste die'j opslaon willen is {{PLURAL:$1|een kilobyte|$1 kilobytes}}. Dit is groter as t toe-estaone maximum van $2 kilobytes. Joew tekste kan niet op-esleugen wörden.'''",
'readonlywarning' => "'''Waorschuwing: De databanke is op dit moment in onderhoud; t is daorumme niet meugelik um pagina's te wiezigen.
Je kunnen de tekste t beste bie joew eigen systeem opslaon en laoter opniej proberen de pagina te bewarken.'''
@@ -1153,8 +1176,6 @@ Beheerders van {{SITENAME}} kunnen de verbörgen inhoud bekieken en t weerummepl
'revdelete-unsuppress' => 'Beparkingen veur weerummezetten versies vortdoon',
'revdelete-log' => 'Reden:',
'revdelete-submit' => 'Toepassen op de ekeuzen {{PLURAL:$1|bewarking|bewarkingen}}',
-'revdelete-logentry' => 'zichtbaorheid van bewarkingen is ewiezigd veur [[$1]]',
-'logdelete-logentry' => 'wiezigen zichtbaorheid van gebeurtenisse [[$1]]',
'revdelete-success' => "'''De zichtbaorheid van de wieziging is bie-ewörken.'''",
'revdelete-failure' => "'''De zichtbaorheid veur de wieziging kon niet bie-ewörken wörden:'''
$1",
@@ -1166,15 +1187,6 @@ $1",
'revdel-restore-visible' => 'zichtbaore versies',
'pagehist' => 'Paginageschiedenisse',
'deletedhist' => 'Geschiedenisse die vortehaold is',
-'revdelete-content' => 'inhoud',
-'revdelete-summary' => 'samenvatting bewarken',
-'revdelete-uname' => 'gebrukersnaam',
-'revdelete-restricted' => 'hef beparkingen an beheerders op-eleg',
-'revdelete-unrestricted' => 'hef beparkingen veur beheerders deraof ehaold',
-'revdelete-hid' => 'hef $1 verbörgen',
-'revdelete-unhid' => 'hef $1 zichtbaor emaak',
-'revdelete-log-message' => '$1 veur $2 {{PLURAL:$2|versie|versies}}',
-'logdelete-log-message' => '$1 veur $2 {{PLURAL:$2|logboekregel|logboekregels}}',
'revdelete-hide-current' => 'Fout bie t verbargen van t objekt van $1 um $2 uur: dit is de versie van noen.
Disse versie kan niet verbörgen wörden.',
'revdelete-show-no-access' => 'Fout bie t weergeven van t objekt van $1 um $2 uur: dit objekt is emarkeerd as "beveilig".
@@ -1328,12 +1340,14 @@ Kiek de logboeken nao.',
'prefs-rc' => 'Leste wiezigingen',
'prefs-watchlist' => 'Volglieste',
'prefs-watchlist-days' => 'Antal dagen in de volglieste bekieken:',
-'prefs-watchlist-days-max' => 'Maximaal 7 dagen',
+'prefs-watchlist-days-max' => 'Maximaal $1 {{PLURAL:$1|dag|dagen}}',
'prefs-watchlist-edits' => 'Antal wiezigingen in de uutebreiden volglieste:',
'prefs-watchlist-edits-max' => 'Maximale antal: 1.000',
'prefs-watchlist-token' => 'Volgliestesleutel',
'prefs-misc' => 'Overig',
'prefs-resetpass' => 'Wachtwoord wiezigen',
+'prefs-changeemail' => 'Netpostadres wiezigen',
+'prefs-setemail' => 'Stel n netpostadres in',
'prefs-email' => 'Instellingen veur netpost',
'prefs-rendering' => 'Paginaweergave',
'saveprefs' => 'Veurkeuren opslaon',
@@ -1393,6 +1407,7 @@ Disse haandeling kan niet ongedaonemaakt wörden.',
'yourrealname' => 'Echte naam (niet verplicht)',
'yourlanguage' => 'Taal veur systeemteksten',
'yourvariant' => 'Taalvariaant veur inhoud:',
+'prefs-help-variant' => "Joew veurkeursvariaant of -spelling um de inhoudspagina's van disse wiki in weer te geven.",
'yournick' => 'Alias veur ondertekeningen',
'prefs-help-signature' => 'Reaksies op de overlegpagina\'s mutten ondertekend wörden mit "<nowiki>~~~~</nowiki>", dit wörden dan ummezet in joew ondertekening mit daorbie de daotum en tied van de bewarking.',
'badsig' => 'Ongeldige haandtekening; HTML naokieken.',
@@ -1433,7 +1448,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'userrights-lookup-user' => 'Beheer gebrukersgroepen',
'userrights-user-editname' => 'Vul n gebrukersnaam in:',
'editusergroup' => 'Bewark gebrukersgroepen',
-'editinguser' => "Doonde mit t wiezigen van de gebrukersrechten van '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Doonde mit t wiezigen van de gebrukersrechten van '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Bewark gebrukersgroep',
'saveusergroups' => 'Gebrukergroepen opslaon',
'userrights-groupsmember' => 'Lid van:',
@@ -1527,13 +1542,13 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'right-autopatrol' => 'Bewarkingen wörden automaties as ekontroleerd emarkeerd',
'right-patrolmarks' => 'Kontroletekens in leste wiezigingen bekieken',
'right-unwatchedpages' => "Bekiek n lieste mit pagina's die niet op n volglieste staon",
-'right-trackback' => 'n Trackback opgeven',
'right-mergehistory' => "De geschiedenisse van pagina's bie mekaar doon",
'right-userrights' => 'Alle gebrukersrechten bewarken',
'right-userrights-interwiki' => "Gebrukersrechten van gebrukers in aandere wiki's wiezigen",
'right-siteadmin' => 'De databanke blokkeren en weer vriegeven',
'right-override-export-depth' => "Pagina's uutvoeren, oek de pagina's waor naor verwezen wörden, tot n diepte van 5",
'right-sendemail' => 'Bericht versturen naor aandere gebrukers',
+'right-passwordreset' => 'Bekiek netpostberichten veur t opniej instellen van joew wachtwoord',
# User rights log
'rightslog' => 'Gebrukersrechtenlogboek',
@@ -1567,16 +1582,17 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'action-suppressionlog' => 'dit bescharmde logboek bekieken',
'action-block' => 'disse gebruker blokkeren',
'action-protect' => 't beveiligingsnivo van disse pagina anpassen',
+'action-rollback' => 'bewarkingen van de leste gebruker die n pagina hef ewiezigd rap weerummedreien',
'action-import' => 'disse pagina van n aandere wiki invoeren',
'action-importupload' => 'disse pagina invoeren vanaof n op-estuurd bestaand',
'action-patrol' => 'bewarkingen van aander volk as ekontroleerd markeren',
'action-autopatrol' => 'eigen bewarkingen as ekontroleerd markeren',
'action-unwatchedpages' => "bekiek de liest mit pagina's die niet evolgd wörden",
-'action-trackback' => 'n trackback opgeven',
'action-mergehistory' => 'de geschiedenisse van disse pagina samenvoegen',
'action-userrights' => 'alle gebrukersrechten bewarken',
'action-userrights-interwiki' => "de rechten van gebrukers op aandere wiki's bewarken",
'action-siteadmin' => 'de databanke blokkeren of vriegeven',
+'action-sendemail' => 'netpostberichten versturen',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
@@ -1609,6 +1625,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|keer|keer}} op n volglieste]',
'rc_categories' => 'Beparking tot kategorieën (scheien mit "|")',
'rc_categories_any' => 'alles',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} nao de wieziging',
'newsectionsummary' => 'Niej onderwarp: /* $1 */',
'rc-enhanced-expand' => "Details bekieken (hier he'j JavaScript veur neudig)",
'rc-enhanced-hide' => 'Details verbargen',
@@ -1662,6 +1679,7 @@ Zie de [[Special:NewFiles|uutstalling mit media]] veur n overzichte.',
'ignorewarnings' => 'Negeer waorschuwingen',
'minlength1' => 'Bestaandsnamen mutten uut tenminsten één letter bestaon.',
'illegalfilename' => 'Der staon karakters in bestaandsnaam "$1" die niet in namen van artikels veur maggen koemen. Geef t bestaand n aandere naam, en probeer t dan opniej toe te voegen.',
+'filename-toolong' => 'Bestaandsnamen maggen niet langer ween as 240 bytes.',
'badfilename' => 'De naam van t bestaand is ewiezigd naor "$1".',
'filetype-mime-mismatch' => 'De bestaandsextensie ".$1" heurt niet bie t MIME-type van t bestaand ($2).',
'filetype-badmime' => 'Bestaanden mit t MIME-type "$1" ma\'j hier niet opsturen.',
@@ -1756,6 +1774,41 @@ As t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/
'upload-unknown-size' => 'Onbekende grootte',
'upload-http-error' => 'Der is n HTTP-fout op-etrejen: $1',
+# File backend
+'backend-fail-stream' => 't Was niet meugelik t bestaand $1 te streumen.',
+'backend-fail-backup' => 't Was niet meugelik n reservekopie van t bestaand $1 te maken.',
+'backend-fail-notexists' => 't Bestaand $1 besteet niet.',
+'backend-fail-hashes' => 'De klutsweerde veur t bestaand kon niet op-ehaold wörden um t te vergelieken.',
+'backend-fail-notsame' => 'Der steet al n niet-geliek bestaand op de plaotse $1.',
+'backend-fail-invalidpath' => '$1 is gien geldig opslagpad.',
+'backend-fail-delete' => 't Bestaand $1 kon niet vortedaon wörden.',
+'backend-fail-alreadyexists' => 't Bestaand $1 besteet al.',
+'backend-fail-store' => 'Kon t bestaand $1 niet opslaon op lokasie $2.',
+'backend-fail-copy' => 'Kon t bestaand $1 niet kopiëren naor $2.',
+'backend-fail-move' => 'Kon t bestaand $1 niet verplaotsen naor $2.',
+'backend-fail-opentemp' => 'Kon gien tiedelik bestaand openen.',
+'backend-fail-writetemp' => 'Kon niet naor n tiedelik bestaand schrieven.',
+'backend-fail-closetemp' => 'Kon niet n tiedelik bestaand sluten.',
+'backend-fail-read' => 'Kon t bestaand $1 niet lezen.',
+'backend-fail-create' => 'Kon t bestaand $1 niet anmaken.',
+'backend-fail-readonly' => 'Van de opslag "$1" kan op dit moment allinnig elezen wörden. De op-egeven reden was: "$2"',
+'backend-fail-synced' => 't Bestaand "$1" bevient zich in n inkonsistente toestaand in de interne opslagbackends.',
+'backend-fail-connect' => 'Kon gien verbiending maken mit t opslagbackend "$1".',
+'backend-fail-internal' => 'Der is n onbekende fout op-etreden in t opslagbackend "$1".',
+'backend-fail-contenttype' => 'Kon t inhoudstype van t bestaand um op "$1" op te slaon niet bepaolen.',
+'backend-fail-batchsize' => 'Reeks van $1 bestaands{{PLURAL:$1|operasie|operasies}} in de opslagbackend; de limiet is $2 {{PLURAL:$2|operasie|operasies}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kon "$1" niet vriegeven; dit objekt is niet vergrendeld.',
+'lockmanager-fail-closelock' => 'Kon t vergrendelingsbestaand veur "$1" niet sluten.',
+'lockmanager-fail-deletelock' => 'Kon t vergrendelingsbestaand veur "$1" niet vortdoon.',
+'lockmanager-fail-acquirelock' => 'Kon "$1" niet vergrendelen.',
+'lockmanager-fail-openlock' => 'Kon t vergrendelingsbestaand veur "$1" niet openen.',
+'lockmanager-fail-releaselock' => 'Kon vergrendeling van "$1" der niet aof haolen.',
+'lockmanager-fail-db-bucket' => 'Kon niet in kontakt koemen mit genog vergrendelingsdatabanken in de nemmer $1.',
+'lockmanager-fail-db-release' => 'Kon de vergrendeling veur de databanke $1 niet deraof haolen.',
+'lockmanager-fail-svr-release' => 'Kon de vergrendeling veur de server $1 der niet aof haolen.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Der is wat fout egaon bie t los doon van t bestaand veur de ZIP-kontrole.',
'zip-wrong-format' => 't Op-egeven bestaand was gien ZIP-bestaand.',
@@ -1772,6 +1825,7 @@ De veiligheid kan niet ekontroleerd wörden.',
'uploadstash-badtoken' => 't Uutvoeren van de haandeling is mislokt. Dit kump warschienlik deurdat joew bewarkingsreferensies verleupen bin. Probeer t opniej.',
'uploadstash-errclear' => 't Vortdoon van de bestaanden is mislokt.',
'uploadstash-refresh' => 'Lieste mit bestaanden biewarken',
+'invalid-chunk-offset' => 'Ongeldig startpunt',
# img_auth script messages
'img-auth-accessdenied' => 'Toegang eweigerd',
@@ -1875,23 +1929,24 @@ De [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.',
'filerevert-badversion' => 'Der is gien veurige lokale versie van dit bestaand mit de op-egeven tied.',
# File deletion
-'filedelete' => '$1 vortdoon',
-'filedelete-legend' => 'Bestaand vortdoon',
-'filedelete-intro' => "Je doon t bestaand '''[[Media:$1|$1]]''' noen vort samen mit de geschiedenisse dervan.",
-'filedelete-intro-old' => "Je bin de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] vort an t doon.",
-'filedelete-comment' => 'Reden:',
-'filedelete-submit' => 'Vortdoon',
-'filedelete-success' => "'''$1''' is vortedaon.",
-'filedelete-success-old' => "De versie van '''[[Media:$1|$1]]''' van $3, $2 is vortedaon.",
-'filedelete-nofile' => "'''$1''' besteet niet.",
-'filedelete-nofile-old' => "Der is gien versie van '''$1''' in t archief mit de an-egeven eigenschappen.",
-'filedelete-otherreason' => 'Aandere reden:',
-'filedelete-reason-otherlist' => 'Aandere reden',
-'filedelete-reason-dropdown' => "*Veulveurkoemende redens veur t vortdoon van pagina's
+'filedelete' => '$1 vortdoon',
+'filedelete-legend' => 'Bestaand vortdoon',
+'filedelete-intro' => "Je doon t bestaand '''[[Media:$1|$1]]''' noen vort samen mit de geschiedenisse dervan.",
+'filedelete-intro-old' => "Je bin de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] vort an t doon.",
+'filedelete-comment' => 'Reden:',
+'filedelete-submit' => 'Vortdoon',
+'filedelete-success' => "'''$1''' is vortedaon.",
+'filedelete-success-old' => "De versie van '''[[Media:$1|$1]]''' van $3, $2 is vortedaon.",
+'filedelete-nofile' => "'''$1''' besteet niet.",
+'filedelete-nofile-old' => "Der is gien versie van '''$1''' in t archief mit de an-egeven eigenschappen.",
+'filedelete-otherreason' => 'Aandere reden:',
+'filedelete-reason-otherlist' => 'Aandere reden',
+'filedelete-reason-dropdown' => "*Veulveurkoemende redens veur t vortdoon van pagina's
** Auteursrechtenschending
** Dit bestaand he'w dubbel",
-'filedelete-edit-reasonlist' => 'Reden veur t vortdoon bewarken',
-'filedelete-maintenance' => 't Vortdoon en weerummeplaotsen kan noen effen niet umda-w bezig bin mit onderhoud.',
+'filedelete-edit-reasonlist' => 'Reden veur t vortdoon bewarken',
+'filedelete-maintenance' => 't Vortdoon en weerummeplaotsen kan noen effen niet umda-w bezig bin mit onderhoud.',
+'filedelete-maintenance-title' => 'Kan bestaand niet vortdoon',
# MIME search
'mimesearch' => 'Zeuken op MIME-type',
@@ -1989,6 +2044,8 @@ Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina h
'wantedpages' => "Gewunste pagina's",
'wantedpages-badtitle' => 'Ongeldige paginanaam in resultaot: $1',
'wantedfiles' => 'Gewunste bestaanden',
+'wantedfiletext-cat' => "De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>. Pagina's die niet-bestaonde bestaanden insluten staon op de pagina [[:$1]].",
+'wantedfiletext-nocat' => 'De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>.',
'wantedtemplates' => 'Gewunste mallen',
'mostlinked' => "Pagina's waor t meest naor verwezen wörden",
'mostlinkedcategories' => 'Meestgebruukten kategorieën',
@@ -1997,6 +2054,7 @@ Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina h
'mostimages' => 'Meestgebruukten bestaanden',
'mostrevisions' => 'Artikels mit de meeste bewarkingen',
'prefixindex' => "Alle pagina's op veurvoegsel",
+'prefixindex-namespace' => "Alle pagina's mit t veurvoegsel (naamruumte $1)",
'shortpages' => 'Korte artikels',
'longpages' => 'Lange artikels',
'deadendpages' => "Pagina's zonder verwiezingen",
@@ -2013,7 +2071,7 @@ Meestentieds is leste pagina de gewunste doelpagina, waor oek de eerste pagina h
'listusers-editsonly' => 'Allinnig gebrukers mit bewarkingen laoten zien',
'listusers-creationsort' => 'Sorteren op inschriefdaotum',
'usereditcount' => '$1 {{PLURAL:$1|bewarking|bewarkingen}}',
-'usercreated' => 'An-emaakt op $1 um $2',
+'usercreated' => '{{GENDER:$3|Eregistreerd}} op $1 um $2',
'newpages' => 'Nieje artikels',
'newpages-username' => 'Gebrukersnaam:',
'ancientpages' => 'Oudste artikels',
@@ -2109,12 +2167,8 @@ Ondersteunde protokollen: <tt>$1</tt> (zet t niet in joew zeukopdrachte).',
'activeusers-noresult' => 'Gien aktieve gebrukers evunnen.',
# Special:Log/newusers
-'newuserlogpage' => 'Logboek mit anwas',
-'newuserlogpagetext' => 'Hieronder staon de niej in-eschreven gebrukers',
-'newuserlog-byemail' => 'wachtwoord is verstuurd via de netpost',
-'newuserlog-create-entry' => 'Nieje gebruker',
-'newuserlog-create2-entry' => 'hef nieje gebruker $1 eregistreerd',
-'newuserlog-autocreate-entry' => 'Gebruker automaties an-emaakt',
+'newuserlogpage' => 'Logboek mit anwas',
+'newuserlogpagetext' => 'Hieronder staon de niej in-eschreven gebrukers',
# Special:ListGroupRights
'listgrouprights' => 'Rechten van gebrukersgroepen',
@@ -2144,7 +2198,7 @@ Meer informasie over de rechten ku'j [[{{MediaWiki:Listgrouprights-helppage}}|hi
t Adres da'j op-egeven hebben bie [[Special:Preferences|joew veurkeuren]] zal as aofzender gebruukt wörden.
De ontvanger kan dus drek beantwoorden.",
'usermailererror' => 'Foutmelding bie t versturen:',
-'defemailsubject' => 'Bericht van {{SITENAME}}',
+'defemailsubject' => 'Bericht van {{SITENAME}}-gebruker "$1"',
'usermaildisabled' => 'n Persoonlik berichjen sturen geet niet.',
'usermaildisabledtext' => 'Je kunnen gien berichjes sturen naor aandere gebrukers van disse wiki',
'noemailtitle' => 'Gebruker hef gien netpostadres op-egeven',
@@ -2198,7 +2252,7 @@ Toekomstige wiezigingen op disse pagina en de overlegpagina zullen hier vermeld
'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
'watchlistcontains' => "Der {{PLURAL:$1|steet 1 pagina|staon $1 pagina's}} op joew volglieste.",
'iteminvalidname' => "Verkeerde naam '$1'",
-'wlnote' => 'Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofeleupen ure|de leste $2 uren}}.',
+'wlnote' => 'Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofeleupen ure|de leste $2 uren}} vanaof $3 um $4.',
'wlshowlast' => 'Laot de aofeleupen $1 ure $2 dagen $3 zien',
'watchlist-options' => 'Opsies veur de volglieste',
@@ -2262,8 +2316,6 @@ Bevestig hieronder dat dit inderdaod de bedoeling is, da'j de gevolgen begriepen
'actioncomplete' => 'Uutevoerd',
'actionfailed' => 'De haandeling is mislokt.',
'deletedtext' => 't Artikel "$1" is vortedaon. Zie de "$2" veur n lieste van pagina\'s die as lest vortedaon bin.',
-'deletedarticle' => '"[[$1]]" vortedaon',
-'suppressedarticle' => 'hef "[[$1]]" verbörgen',
'dellogpage' => 'Vortdologboek',
'dellogpagetext' => "Hieronder steet n lieste van pagina's en bestaanden die as lest vortedaon bin.",
'deletionlog' => 'Vortdologboek',
@@ -2310,7 +2362,10 @@ Zie de [[Special:ProtectedPages|lieste mit pagina's die beveiligd bin]] veur t h
'unprotectedarticle' => 'hef de beveiliging van "[[$1]]" deraof ehaold',
'movedarticleprotection' => 'hef de beveiligingsinstellingen over-ezet van "[[$2]]" naor "[[$1]]"',
'protect-title' => 'Instellen van beveiligingsnivo veur "$1"',
+'protect-title-notallowed' => 'Beveiligingsnivo veur "$1" bekieken',
'prot_1movedto2' => '[[$1]] is ewiezigd naor [[$2]]',
+'protect-badnamespace-title' => 'Niet te beveiligen naamruumte',
+'protect-badnamespace-text' => "Pagina's in disse naamruumte kunnen niet beveiligd wörden.",
'protect-legend' => 'Beveiliging bevestigen',
'protectcomment' => 'Reden:',
'protectexpiry' => 'Duur',
@@ -2330,6 +2385,7 @@ Hier staon de instellingen zo as ze noen bin veur de pagina '''$1''':",
'protect-level-sysop' => 'Allinnig beheerders',
'protect-summary-cascade' => 'kaskade',
'protect-expiring' => 'löp aof op $1 (UTC)',
+'protect-expiring-local' => 'vervuilt op $1',
'protect-expiry-indefinite' => 'onbepark',
'protect-cascade' => "Kaskadebeveiliging (beveilig alle pagina's en mallen die in disse pagina op-eneumen bin)",
'protect-cantedit' => "Je kunnen t beveiligingsnivo van disse pagina niet wiezigen, umda'j gien rechten hebben um t te bewarken.",
@@ -2386,7 +2442,6 @@ In dat geval mö'j de leste versie as zichtbaor instellen.",
'undeletereset' => 'Herstel',
'undeleteinvert' => 'Seleksie ummekeren',
'undeletecomment' => 'Reden:',
-'undeletedarticle' => '"[[$1]]" is weerummeplaotst',
'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} weerummeplaotst',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestaand|$2 bestaanden}} bin weerummeplaotst',
'undeletedfiles' => '{{PLURAL:$1|1 bestaand|$1 bestaanden}} weerummeplaotst',
@@ -2395,6 +2450,7 @@ In dat geval mö'j de leste versie as zichtbaor instellen.",
Bekiek t [[Special:Log/delete|vortdologboek]] veur n overzichte van pagina's die kortens vortedaon en weerummeplaotst bin.",
'undelete-header' => 'Zie t [[Special:Log/delete|vortdologboek ]] veur spul dat krek vortedaon is.',
+'undelete-search-title' => "Vortedaone pagina's zeuken",
'undelete-search-box' => "Deurzeuk vortedaone pagina's",
'undelete-search-prefix' => "Bekiek pagina's vanaof:",
'undelete-search-submit' => 'Zeuk',
@@ -2404,6 +2460,7 @@ Bekiek t [[Special:Log/delete|vortdologboek]] veur n overzichte van pagina's die
'undelete-cleanup-error' => 'Fout bie t herstellen van t ongebruukten archiefbestaand "$1".',
'undelete-missing-filearchive' => 't Lokten niet um ID $1 weerumme te plaotsen umdat t niet in de databanke is.
Misschien is t al weerummeplaotst.',
+'undelete-error' => 'Der is wat fout egaon bie t vortdoon van de pagina',
'undelete-error-short' => 'Fout bie t herstellen van t bestaand: $1',
'undelete-error-long' => 'Fouten bie t herstellen van t bestaand:
@@ -2523,6 +2580,7 @@ Op de [[Special:BlockList|IP-blokkeerlieste]] steet n lieste mit alle blokkering
'blocklist-userblocks' => 'Verbarg gebrukers die eblokkeerd bin',
'blocklist-tempblocks' => 'Tiedelike blokkeringen verbargen',
'blocklist-addressblocks' => 'Blokkering van één IP-adres verbargen',
+'blocklist-rangeblocks' => 'IP-adresblokkeringen verbargen',
'blocklist-timestamp' => 'Tiedstip',
'blocklist-target' => 'Doel',
'blocklist-expiry' => 'Vervuilt',
@@ -2545,6 +2603,7 @@ Op de [[Special:BlockList|IP-blokkeerlieste]] steet n lieste mit alle blokkering
'unblocklink' => 'deblokkeer',
'change-blocklink' => 'blokkering wiezigen',
'contribslink' => 'biedragen',
+'emaillink' => 'netpostbericht sturen',
'autoblocker' => 'Vanzelf eblokkeerd umdat t IP-adres overenekump mit t IP-adres van [[User:$1|$1]], die eblokkeerd is mit as reden: "$2"',
'blocklogpage' => 'Blokkeerlogboek',
'blocklog-showlog' => 'Disse gebruker is al eerder eblokkeerd.
@@ -2667,9 +2726,6 @@ Zörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
'movepage-page-unmoved' => 'De pagina $1 kon niet herneumd wörden naor $2.',
'movepage-max-pages' => "t Maximale antal automaties te herneumen pagina's is bereikt ({{PLURAL:$1|$1|$1}}).
De overige pagina's wörden niet automaties herneumd.",
-'1movedto2' => '[[$1]] is ewiezigd naor [[$2]]',
-'1movedto2_redir' => '[[$1]] is ewiezigd over de deurverwiezing [[$2]] hinne',
-'move-redirect-suppressed' => 'deurverwiezing onderdrokken',
'movelogpage' => 'Herneumlogboek',
'movelogpagetext' => "Hieronder steet n lieste mit pagina's die herneumd bin.",
'movesubpage' => "{{PLURAL:$1|Subpagina|Subpagina's}}",
@@ -2681,7 +2737,7 @@ De overige pagina's wörden niet automaties herneumd.",
'delete_and_move_text' => '==Mut vortedaon wörden==
<div style="color: red"> Onder de nieje naam "[[:$1]]" besteet al n artikel. Wi\'j t vortdoon um plaotse te maken veur t herneumen?</div>',
'delete_and_move_confirm' => 'Ja, disse pagina vortdoon',
-'delete_and_move_reason' => 'Vortedaon vanwegen naamwieziging',
+'delete_and_move_reason' => 'Vortedaon vanwegen de herneuming van "[[$1]]"',
'selfmove' => 'De naam kan niet ewiezigd wörden naor de naam die t al hef.',
'immobile-source-namespace' => 'Pagina\'s in de naamruumte "$1" kunnen niet herneumd wörden',
'immobile-target-namespace' => 'Pagina\'s kunnen niet herneumd wörden naor de naamruumte "$1"',
@@ -2709,9 +2765,11 @@ Kies n aandere bestaandsnaam.',
Zet in t onderstaonde veld de namen van de pagina's die'j uutvoeren willen, één pagina per regel, en geef an o'j alle versies mit de bewarkingssamenvatting uutvoeren willen of allinnig de leste versies mit de bewarkingssamenvatting.
A'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de pagina \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => "Alle pagina's uutvoeren",
'exportcuronly' => 'Allinnig de actuele versie, niet de veurgeschiedenisse',
'exportnohistory' => "----
'''NB:''' t uutvoeren van de hele geschiedenisse is uuteschakeld vanwegen prestasieredens.",
+'exportlistauthors' => 'De hele auteurslieste opnemen veur elke pagina',
'export-submit' => 'Uutvoeren',
'export-addcattext' => "Pagina's derbie doon uut de kategorie:",
'export-addcat' => 'Derbie doon',
@@ -2744,6 +2802,8 @@ Kiek oek effen bie [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie]
'thumbnail_error' => 'Fout bie t laojen van de miniatuuraofbeelding: $1',
'djvu_page_error' => 'DjVu-pagina buten bereik',
'djvu_no_xml' => 'Kon de XML-gegevens veur t DjVu-bestaand niet oproepen',
+'thumbnail-temp-create' => 'Kon gien tiedelik miniatuurbestaand anmaken.',
+'thumbnail-dest-create' => 'Kon gien miniatuurbestaand op de doellokasie opslaon.',
'thumbnail_invalid_params' => 'Ongeldige parameters veur de miniatuuraofbeelding',
'thumbnail_dest_directory' => 'De bestemmingsmap kon niet an-emaakt wörden.',
'thumbnail_image-type' => 'Dit bestaandstype wörden niet ondersteund',
@@ -2791,6 +2851,11 @@ De tiedelike map is niet anwezig.',
'import-upload' => 'XML-gegevens derbie doon',
'import-token-mismatch' => 'De sessiegegevens bin verleuren egaon. Probeer t opniej.',
'import-invalid-interwiki' => 't Is niet meugelik um van de an-egeven wiki in te voeren.',
+'import-error-edit' => 'De pagina "$1" is niet in-evoerd umda\'j de rechten niet hebben um t te bewarken.',
+'import-error-create' => 'De pagina "$1" is niet in-evoerd umda\'j de rechten niet hebben um t an te maken.',
+'import-error-interwiki' => 'De pagina "$1" is niet in-evoerd umdat disse naam ereserveerd is veur externe verwiezingen (interwiki).',
+'import-error-special' => 'Pagina "$1" is niet in-evoerd umdat t eplaotst is in n spesiale naamruumte waor gien pagina\'s in eplaotst kunnen wörden.',
+'import-error-invalid' => 'De pagina" "$1" is niet in-evoerd umdat de naam ongeldig is.',
# Import log
'importlogpage' => 'Invoerlogboek',
@@ -2800,73 +2865,86 @@ De tiedelike map is niet anwezig.',
'import-logentry-interwiki' => 'transwiki $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versie|versies}} van $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript testen',
+'javascripttest-disabled' => 'Disse funksie steet uut.',
+'javascripttest-title' => 'Tests uutvoeren veur $1',
+'javascripttest-pagetext-noframework' => 'Disse pagina is ereserveerd veur t uutvoeren van JavaScript-testen.',
+'javascripttest-pagetext-unknownframework' => 'Onbekend testraamwark "$1".',
+'javascripttest-pagetext-frameworks' => 'Kies een van de volgende testraamwarken: $1',
+'javascripttest-pagetext-skins' => 'Kies n vormgeving um de tests mee uut te voeren:',
+'javascripttest-qunit-intro' => 'Zie de [$1 testdokumentasie] op mediawiki.org.',
+'javascripttest-qunit-heading' => 'QUnit testsuite veur MediaWiki JavaScript',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Oew gebroekersbladziede',
-'tooltip-pt-anonuserpage' => "Gebroekersbladziede vuur t IP-adres da'j broekt",
-'tooltip-pt-mytalk' => 'Oew oaverlegbladziede',
-'tooltip-pt-anontalk' => 'Oaverlegbladziede van n naamlozen gebroeker van dit IP-adres',
-'tooltip-pt-preferences' => 'Miene vuurkeuren',
-'tooltip-pt-watchlist' => 'Lieste van bladzieden die op miene volglieste stoan',
-'tooltip-pt-mycontris' => 'Liest van oew biejdraegen',
-'tooltip-pt-login' => 'Iej wördt van harte oetneugd um oe an te melden as gebroeker, mer t is nich verplicht',
-'tooltip-pt-anonlogin' => 'Iej wördt van harte oetneugd um oe an te maelden as gebroeker, mer t is nich verplicht',
-'tooltip-pt-logout' => 'Ofmaelden',
-'tooltip-ca-talk' => 'Loat n oaverlegtekst oaver disse bladziede zeen',
-'tooltip-ca-edit' => 'Bewaerk disse bladziede',
-'tooltip-ca-addsection' => 'Niej oonderwaerp tovogen',
-'tooltip-ca-viewsource' => 'Disse bladziede is beveiligd taegen veraanderen. Iej könt wal kieken noar de bladziede',
-'tooltip-ca-history' => 'Oaldere versies van disse bladziede',
-'tooltip-ca-protect' => 'Beveilig disse bladziede taegen veraanderen',
-'tooltip-ca-unprotect' => 'De beveiliging vuur disse bladziede wiezigen',
-'tooltip-ca-delete' => 'Smiet disse bladziede vort',
-'tooltip-ca-undelete' => 'Haal n inhoald van disse bladziede oet n emmer',
-'tooltip-ca-move' => 'Gef disse bladziede nen aanderen titel',
-'tooltip-ca-watch' => 'Voog disse bladziede to an oewe volglieste',
-'tooltip-ca-unwatch' => 'Smiet disse bladziede van oewe voalglieste',
-'tooltip-search' => '{{SITENAME}} duurzeukn',
-'tooltip-search-go' => 'Noar n bladziede mit disse naam goan as t besteet',
-'tooltip-search-fulltext' => "De pagina's vuur disse tekst zeuken",
-'tooltip-p-logo' => 'Goa noar t vuurblad',
-'tooltip-n-mainpage' => 'Goa noar t vuurblad',
-'tooltip-n-mainpage-description' => 'Goa noar t vuurblad',
-'tooltip-n-portal' => 'Informoasie oaver t projekt: wel, wat, ho en woarum',
-'tooltip-n-currentevents' => 'Achtergroondinformoasie oaver dinge in t niejs',
-'tooltip-n-recentchanges' => 'Lieste van pas verrichte veraanderingen',
-'tooltip-n-randompage' => 'Loat ne willekeurige bladziede zeen',
-'tooltip-n-help' => 'Hölpinformoasie oaver {{SITENAME}}',
-'tooltip-t-whatlinkshere' => 'Lieste van alle bladzieden die hiernoar verwiezen',
-'tooltip-t-recentchangeslinked' => 'Pas verrichte veraanderingen die noar disse bladziede verwiezen',
-'tooltip-feed-rss' => 'RSS-voer vuur disse bladziede',
-'tooltip-feed-atom' => 'Atom-voer vuur disse bladziede',
-'tooltip-t-contributions' => 'Lieste met biejdraegen van disse gebroeker',
-'tooltip-t-emailuser' => 'Stuur disse gebroeker n netpostbericht',
-'tooltip-t-upload' => 'Laad ofbeeldingen en/of geluudsmateriaal',
-'tooltip-t-specialpages' => 'Lieste van alle biejzeundere bladzieden',
-'tooltip-t-print' => 'De ofdrukboare versie van disse bladziede',
-'tooltip-t-permalink' => 'Verbeending vuur altied noar de versie van disse bladziede van vandaag-an-n-dag',
-'tooltip-ca-nstab-main' => 'Loat n tekst van t artikel zeen',
-'tooltip-ca-nstab-user' => 'Loat de gebroekersbladziede zeen',
-'tooltip-ca-nstab-media' => 'Loat n mediatekst zeen',
-'tooltip-ca-nstab-special' => "Dit is ne biejzeundere bladziede die'j nich könt veraanderen",
-'tooltip-ca-nstab-project' => 'Loat de projektbladziede zeen',
-'tooltip-ca-nstab-image' => 'Loat de bestaandsbladziede zeen',
-'tooltip-ca-nstab-mediawiki' => 'Loat de systeemtekstbladziede zeen',
-'tooltip-ca-nstab-template' => 'Loat de malbladziede zeen',
-'tooltip-ca-nstab-help' => 'Loat de hölpbladziede zeen',
-'tooltip-ca-nstab-category' => 'Loat de rubriekbladziede zeen',
-'tooltip-minoredit' => 'Markeer as n klaene wieziging',
-'tooltip-save' => 'Wiezigingen opsloan',
-'tooltip-preview' => "Bekiek oew versie vuurda'j t opsloan (anbeveulen)!",
-'tooltip-diff' => 'Bekiek oew aegen wiezigingen',
-'tooltip-compareselectedversions' => 'Bekiek de verschillen tussen de ekeuzen versies.',
-'tooltip-watch' => 'Voog disse bladziede to an oew volglieste',
-'tooltip-recreate' => 'Disse bladziede opniej anmaken, ondanks t feit dat t vortdoan is.',
-'tooltip-upload' => 'Bestaanden tovogen',
-'tooltip-rollback' => 'Mit "weerummedreien" kö\'j mit één klik de bewaerking(en) van n leste gebroeker dee disse bladziede bewaerkt hef terugdraeien.',
-'tooltip-undo' => 'A\'j op "weerummedreien" klikken geet t bewaerkingsvaenster lös en kö\'j ne vurige versie terugzetten.
+'tooltip-pt-userpage' => 'Oew gebroekersbladziede',
+'tooltip-pt-anonuserpage' => "Gebroekersbladziede vuur t IP-adres da'j broekt",
+'tooltip-pt-mytalk' => 'Oew oaverlegbladziede',
+'tooltip-pt-anontalk' => 'Oaverlegbladziede van n naamlozen gebroeker van dit IP-adres',
+'tooltip-pt-preferences' => 'Miene vuurkeuren',
+'tooltip-pt-watchlist' => 'Lieste van bladzieden die op miene volglieste stoan',
+'tooltip-pt-mycontris' => 'Liest van oew biejdraegen',
+'tooltip-pt-login' => 'Iej wördt van harte oetneugd um oe an te melden as gebroeker, mer t is nich verplicht',
+'tooltip-pt-anonlogin' => 'Iej wördt van harte oetneugd um oe an te maelden as gebroeker, mer t is nich verplicht',
+'tooltip-pt-logout' => 'Ofmaelden',
+'tooltip-ca-talk' => 'Loat n oaverlegtekst oaver disse bladziede zeen',
+'tooltip-ca-edit' => 'Bewaerk disse bladziede',
+'tooltip-ca-addsection' => 'Niej oonderwaerp tovogen',
+'tooltip-ca-viewsource' => 'Disse bladziede is beveiligd taegen veraanderen. Iej könt wal kieken noar de bladziede',
+'tooltip-ca-history' => 'Oaldere versies van disse bladziede',
+'tooltip-ca-protect' => 'Beveilig disse bladziede taegen veraanderen',
+'tooltip-ca-unprotect' => 'De beveiliging vuur disse bladziede wiezigen',
+'tooltip-ca-delete' => 'Smiet disse bladziede vort',
+'tooltip-ca-undelete' => 'Haal n inhoald van disse bladziede oet n emmer',
+'tooltip-ca-move' => 'Gef disse bladziede nen aanderen titel',
+'tooltip-ca-watch' => 'Voog disse bladziede to an oewe volglieste',
+'tooltip-ca-unwatch' => 'Smiet disse bladziede van oewe voalglieste',
+'tooltip-search' => '{{SITENAME}} duurzeukn',
+'tooltip-search-go' => 'Noar n bladziede mit disse naam goan as t besteet',
+'tooltip-search-fulltext' => "De pagina's vuur disse tekst zeuken",
+'tooltip-p-logo' => 'Goa noar t vuurblad',
+'tooltip-n-mainpage' => 'Goa noar t vuurblad',
+'tooltip-n-mainpage-description' => 'Goa noar t vuurblad',
+'tooltip-n-portal' => 'Informoasie oaver t projekt: wel, wat, ho en woarum',
+'tooltip-n-currentevents' => 'Achtergroondinformoasie oaver dinge in t niejs',
+'tooltip-n-recentchanges' => 'Lieste van pas verrichte veraanderingen',
+'tooltip-n-randompage' => 'Loat ne willekeurige bladziede zeen',
+'tooltip-n-help' => 'Hölpinformoasie oaver {{SITENAME}}',
+'tooltip-t-whatlinkshere' => 'Lieste van alle bladzieden die hiernoar verwiezen',
+'tooltip-t-recentchangeslinked' => 'Pas verrichte veraanderingen die noar disse bladziede verwiezen',
+'tooltip-feed-rss' => 'RSS-voer vuur disse bladziede',
+'tooltip-feed-atom' => 'Atom-voer vuur disse bladziede',
+'tooltip-t-contributions' => 'Lieste met biejdraegen van disse gebroeker',
+'tooltip-t-emailuser' => 'Stuur disse gebroeker n netpostbericht',
+'tooltip-t-upload' => 'Laad ofbeeldingen en/of geluudsmateriaal',
+'tooltip-t-specialpages' => 'Lieste van alle biejzeundere bladzieden',
+'tooltip-t-print' => 'De ofdrukboare versie van disse bladziede',
+'tooltip-t-permalink' => 'Verbeending vuur altied noar de versie van disse bladziede van vandaag-an-n-dag',
+'tooltip-ca-nstab-main' => 'Loat n tekst van t artikel zeen',
+'tooltip-ca-nstab-user' => 'Loat de gebroekersbladziede zeen',
+'tooltip-ca-nstab-media' => 'Loat n mediatekst zeen',
+'tooltip-ca-nstab-special' => "Dit is ne biejzeundere bladziede die'j nich könt veraanderen",
+'tooltip-ca-nstab-project' => 'Loat de projektbladziede zeen',
+'tooltip-ca-nstab-image' => 'Loat de bestaandsbladziede zeen',
+'tooltip-ca-nstab-mediawiki' => 'Loat de systeemtekstbladziede zeen',
+'tooltip-ca-nstab-template' => 'Loat de malbladziede zeen',
+'tooltip-ca-nstab-help' => 'Loat de hölpbladziede zeen',
+'tooltip-ca-nstab-category' => 'Loat de rubriekbladziede zeen',
+'tooltip-minoredit' => 'Markeer as n klaene wieziging',
+'tooltip-save' => 'Wiezigingen opsloan',
+'tooltip-preview' => "Bekiek oew versie vuurda'j t opsloan (anbeveulen)!",
+'tooltip-diff' => 'Bekiek oew aegen wiezigingen',
+'tooltip-compareselectedversions' => 'Bekiek de verschillen tussen de ekeuzen versies.',
+'tooltip-watch' => 'Voog disse bladziede to an oew volglieste',
+'tooltip-watchlistedit-normal-submit' => "Pagina's vortdoon",
+'tooltip-watchlistedit-raw-submit' => 'Volglieste biewarken',
+'tooltip-recreate' => 'Disse bladziede opniej anmaken, ondanks t feit dat t vortdoan is.',
+'tooltip-upload' => 'Bestaanden tovogen',
+'tooltip-rollback' => 'Mit "weerummedreien" kö\'j mit één klik de bewaerking(en) van n leste gebroeker dee disse bladziede bewaerkt hef terugdraeien.',
+'tooltip-undo' => 'A\'j op "weerummedreien" klikken geet t bewaerkingsvaenster lös en kö\'j ne vurige versie terugzetten.
Iej könt in de bewearkingssamenvatting n reden opgeven.',
-'tooltip-preferences-save' => 'Vuurkeuren opsloan',
-'tooltip-summary' => 'Voer ne korte samenvatting in',
+'tooltip-preferences-save' => 'Vuurkeuren opsloan',
+'tooltip-summary' => 'Voer ne korte samenvatting in',
# Metadata
'notacceptable' => 'De wikiserver kan de gegevens niet leveren in n vorm die joew kliënt kan lezen.',
@@ -2929,9 +3007,6 @@ Meestentieds kump dit deur n uutgaonde verwiezing die op de zwarte lieste steet.
# Patrol log
'patrol-log-page' => 'Markeerlogboek',
'patrol-log-header' => 'In dit logboek staon de versies die emarkeerd bin as ekontroleerd.',
-'patrol-log-line' => '$1 van $2 emarkeerd as ekontroleerd $3',
-'patrol-log-auto' => '(automaties)',
-'patrol-log-diff' => 'versie $1',
'log-show-hide-patrol' => 'Markeerlogboek $1',
# Image deletion
@@ -2958,11 +3033,11 @@ $1',
'file-info' => 'Bestaandsgrootte: $1, MIME-type: $2',
'file-info-size' => '$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4',
'file-info-size-pages' => "$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|pagina|pagina's}}",
-'file-nohires' => '<small>Gien hogere resolusie beschikbaor.</small>',
+'file-nohires' => 'Gien hogere resolusie beschikbaor.',
'svg-long-desc' => 'SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3',
'show-big-image' => 'Volle resolusie',
-'show-big-image-preview' => '<small>Grootte van disse weergave: $1.</small>',
-'show-big-image-other' => '<small>Aandere resolusies: $1.</small>',
+'show-big-image-preview' => 'Grootte van disse weergave: $1.',
+'show-big-image-other' => 'Aandere {{PLURAL:$2|resolusie|resolusies}}: $1.',
'show-big-image-size' => '$1 × $2 beeldpunten',
'file-info-gif-looped' => 'herhaolend',
'file-info-gif-frames' => '$1 {{PLURAL:$1|beeld|beelden}}',
@@ -2982,6 +3057,13 @@ $1',
'bydate' => 'op daotum',
'sp-newimages-showfrom' => 'Bekiek nieje bestaanden vanaof $1, $2',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekonde|$1 sekonden}}',
+'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
+'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'ago' => '$1 eleen',
+
# Bad image list
'bad_image_list' => "De opmaak is as volgt:
@@ -3472,13 +3554,6 @@ De bevestigingskode zal verlopen op $4.',
'scarytranscludefailed' => '[De mal $1 kon niet op-ehaold wörden]',
'scarytranscludetoolong' => '[URL is te lang]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks veur disse pagina:<br />
-$1',
-'trackbackremove' => '([$1 vortdoon])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'De trackback is vortedaon.',
-
# Delete conflict
'deletedwhileediting' => "'''Waorschuwing''': disse pagina is vortedaon terwiel jie t an t bewarken waren!",
'confirmrecreate' => "Gebruker [[User:$1|$1]] ([[User talk:$1|Overleg]]) hef disse pagina vortedaon naoda'j begunnen bin mit joew wieziging, mit opgave van de volgende reden: ''$2''. Bevestig da'j t artikel herschrieven willen.",
@@ -3559,6 +3634,9 @@ Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].",
'watchlisttools-edit' => 'Volglieste bekieken en bewarken',
'watchlisttools-raw' => 'Roewe volglieste bewarken',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])',
+
# Core parser functions
'unknown_extension_tag' => 'Onbekende tag "$1"',
'duplicate-defaultsort' => 'Waorschuwing: de standardsortering "$2" krig veurrang veur de sortering "$1".',
@@ -3659,13 +3737,16 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
# Special:ComparePages
-'comparepages' => "Pagina's vergelieken",
-'compare-selector' => 'Paginaversies vergelieken',
-'compare-page1' => 'Pagina 1',
-'compare-page2' => 'Pagina 2',
-'compare-rev1' => 'Versie 1',
-'compare-rev2' => 'Versie 2',
-'compare-submit' => 'Vergelieken',
+'comparepages' => "Pagina's vergelieken",
+'compare-selector' => 'Paginaversies vergelieken',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versie 1',
+'compare-rev2' => 'Versie 2',
+'compare-submit' => 'Vergelieken',
+'compare-invalid-title' => "De titel die'j op-egeven hebben, is ongeldig.",
+'compare-title-not-exists' => "De titel die'j op-egeven hebben, besteet niet.",
+'compare-revision-not-exists' => "De versie die'j op-egeven hebben, besteet niet.",
# Database error messages
'dberr-header' => 'Disse wiki hef n probleem',
@@ -3692,4 +3773,90 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
'sqlite-no-fts' => 'Versie $1 zonder ondersteuning veur "full-text" zeuken',
+# New logging system
+'logentry-delete-delete' => '$1 hef de pagina $3 vortedaon',
+'logentry-delete-restore' => '$1 hef de pagina $3 weerummezet',
+'logentry-delete-event' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 ewiezigd: $4',
+'logentry-delete-revision' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 ewiezigd: $4',
+'logentry-delete-event-legacy' => '$1 hef de zichtbaorheid van logboekregels van $3 ewiezigd',
+'logentry-delete-revision-legacy' => '$1 hef de zichtbaorheid van versies van de pagina $3 ewiezigd.',
+'logentry-suppress-delete' => '$1 hef de pagina $3 onderdrokt',
+'logentry-suppress-event' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 sluuksem ewiezigd: $4',
+'logentry-suppress-revision' => '$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 sluuksem ewiezigd: $4',
+'logentry-suppress-event-legacy' => '$1 hef de zichtbaorheid van logboekregels van $3 sluuksem ewiezigd',
+'logentry-suppress-revision-legacy' => '$1 hef de zichtbaorheid van versies van de pagina $3 sluuksem ewiezigd.',
+'revdelete-content-hid' => 'inhoud verbörgen',
+'revdelete-summary-hid' => 'bewarkingssamenvatting verbörgen',
+'revdelete-uname-hid' => 'gebrukersnaam verbörgen',
+'revdelete-content-unhid' => 'inhoud zichtbaor emaakt',
+'revdelete-summary-unhid' => 'bewarkingssamenvatting zichtbaor emaakt',
+'revdelete-uname-unhid' => 'gebrukersnaam zichtbaor emaakt',
+'revdelete-restricted' => 'hef beparkingen an beheerders op-eleg',
+'revdelete-unrestricted' => 'hef beparkingen veur beheerders deraof ehaold',
+'logentry-move-move' => '$1 herneumden de pagina $3 naor $4',
+'logentry-move-move-noredirect' => '$1 herneumden de pagina $3 naor $4 zonder n deurverwiezing achter te laoten',
+'logentry-move-move_redir' => '$1 herneumden de pagina $3 naor $4 over n deurverwiezing heer',
+'logentry-move-move_redir-noredirect' => '$1 herneumden de pagina $3 naor $4 over n deurverwiezing heer zonder n deurverwiezing achter te laoten',
+'logentry-patrol-patrol' => '$1 hef versie $4 van pagina $3 as ekontroleerd emarkeerd',
+'logentry-patrol-patrol-auto' => '$1 hef versie $4 van pagina $3 automaties as ekontroleerd emarkeerd',
+'logentry-newusers-newusers' => '$1 hef n gebruker an-emaakt',
+'logentry-newusers-create' => '$1 hef n gebruker an-emaakt',
+'logentry-newusers-create2' => '$1 hef n gebruker $3 an-emaakt',
+'logentry-newusers-autocreate' => 'De gebruker $1 is automaties an-emaakt',
+'newuserlog-byemail' => 'wachtwoord is verstuurd via de netpost',
+
+# Feedback
+'feedback-bugornote' => 'A\'j zovere bin um n technies probleem nauwkeurig te beschrieven, [$1 meld dan n programmafout].
+Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zullen op de pagina "[$3 $2]" ezet wörden, samen mit joew gebrukersnaam en de webkieker die\'j gebruken.',
+'feedback-subject' => 'Onderwarp:',
+'feedback-message' => 'Bericht:',
+'feedback-cancel' => 'Aofbreken',
+'feedback-submit' => 'Troegkoppeling opslaon',
+'feedback-adding' => 'Joew troegkoppeling wörden op de pagina ezet...',
+'feedback-error1' => 'Fout: onbekend resultaot uut de API',
+'feedback-error2' => 'Fout: de bewarking is mislokt',
+'feedback-error3' => 'Fout: gien reaksie van de API',
+'feedback-thanks' => 'Bedankt! Joew troegkoppeling is op de pagina "[$2 $1]" ezet.',
+'feedback-close' => 'Ree',
+'feedback-bugcheck' => 'Mooi! Kiek nao of t niet al één van de [$1 bekende problemen] is.',
+'feedback-bugnew' => 'Ik heb t nao-ekeken. Meld n nieje programmafout',
+
+# API errors
+'api-error-badaccess-groups' => 'Je maggen gien bestaanden in disse wiki inlaojen.',
+'api-error-badtoken' => 'Interne fout: t token klopt niet.',
+'api-error-copyuploaddisabled' => 'Bestaanden opsturen via n webadres is uutezet op disse server.',
+'api-error-duplicate' => 'Der {{PLURAL:$1|steet al [$2 n bestaand]|staon al [$2 bestaanden]}} mit de zelfde inhoud in de wiki.',
+'api-error-duplicate-archive' => 'Der {{PLURAL:$1|was al [$2 n aander bestaand]|waren al [$2 $1 aandere bestaanden]}} op de webstee mit de zelfde inhoud, mer {{PLURAL:$1|dat is|die bin}} vortedaon.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplikaotbestaand dat al vortedaon is|Duplikaotbestaanden die al vortedaon bin}}',
+'api-error-duplicate-popup-title' => 'Zelfde {{PLURAL:$1|bestaand|bestaanden}}',
+'api-error-empty-file' => "t Bestaand da'j op-estuurd hebben is leeg.",
+'api-error-emptypage' => "Je maggen gien lege nieje pagina's anmaken.",
+'api-error-fetchfileerror' => 'Interne fout: der is iets verkeerd egaon mit t ophaolen van t bestaand.',
+'api-error-file-too-large' => "t Bestaand da'j op-estuurd hebben is te groot.",
+'api-error-filename-tooshort' => 'De bestaandsnaam is te kort.',
+'api-error-filetype-banned' => 'Dit bestaandstype is niet toe-estaon.',
+'api-error-filetype-missing' => 't Bestaand hef gien extensie.',
+'api-error-hookaborted' => "De wieziging die'j proberen deur te voeren is aofebreuken deur n extra uutbreiding.",
+'api-error-http' => 'Interne fout: der kon gien verbiending emaakt wörden mit de server.',
+'api-error-illegal-filename' => 'Disse bestaandsnaam mag niet.',
+'api-error-internal-error' => 'Interne fout: der is iets verkeerd egaon tiedens t verwarken van joew op-estuurden bestaand deur de wiki.',
+'api-error-invalid-file-key' => 'Interne fout: t bestaand stung niet in de tiedelike opslag.',
+'api-error-missingparam' => 'Interne fout: niet alle parameters bin in t verzeuk mee-eleverd.',
+'api-error-missingresult' => 'Interne fout: kon niet vaststellen of t kopiëren wel wol lokken.',
+'api-error-mustbeloggedin' => 'Je mutten an-emeld ween um bestaanden te kunnen opsturen.',
+'api-error-mustbeposted' => 'Der zit n fout in de programmatuur. Der wörden gien gebruukemaakt van de juuste HTTP-methode.',
+'api-error-noimageinfo' => 't Opsturen van t bestaand is aoferond, mer de server hef gien gegevens over t bestaand egeven.',
+'api-error-nomodule' => 'Interne fout: der is gien inlaodmodule in-esteld.',
+'api-error-ok-but-empty' => 'Interne fout: de server hef gien gegevens weerestuurd.',
+'api-error-overwrite' => 'Je maggen gien bestaond bestaand overschrieven.',
+'api-error-stashfailed' => 'Interne fout: de server kon t tiedelike bestaand niet opslaon.',
+'api-error-timeout' => 'De server hef niet binnen de verwachte tied antwoord egeven.',
+'api-error-unclassified' => 'Der is n onbekende fout op-etrejen',
+'api-error-unknown-code' => 'Interne fout: "$1"',
+'api-error-unknown-error' => 'Interne fout: der is iets verkeerd egaon tiedens t opsturen van joew bestaand.',
+'api-error-unknown-warning' => 'Onbekende waorschuwing: $1',
+'api-error-unknownerror' => 'Onbekende fout: "$1"',
+'api-error-uploaddisabled' => 'Je kunnen gien bestaanden opsturen in deze wiki.',
+'api-error-verification-error' => 'Dit bestaand is meugelik beschaodigd of hef n onjuuste extensie.',
+
);
diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php
index c73b0300..dbef9add 100644
--- a/languages/messages/MessagesNe.php
+++ b/languages/messages/MessagesNe.php
@@ -319,6 +319,7 @@ $1',
'ok' => 'हà¥à¤¨à¥à¤›',
'pagetitle' => '$1 - {{SITENAME}}',
'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '↠$1',
'retrievedfrom' => ' "$1" बाट निकालिà¤à¤•à¥‹',
'youhavenewmessages' => 'तपाईंको लागि ($2) मा $1 छ ।',
'newmessageslink' => 'नयाठसनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚',
@@ -415,22 +416,24 @@ $1',
'badarticleerror' => 'यो कारà¥à¤¯ यस पृषà¥à¤ à¤®à¤¾ गरà¥à¤¨ मिलà¥à¤¦à¥ˆà¤¨à¥¤',
'cannotdelete' => '"$1" पृषà¥à¤  वा फ़ाइल मेटà¥à¤¨à¤¸à¤•à¤¿à¤à¤¨à¥¤
यो अघिबाट नैं मेटिà¤à¤•à¥‹ हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
+'cannotdelete-title' => 'पृषà¥à¤  "$1" लाई मेटà¥à¤¨ सकिà¤à¤¨',
'badtitle' => 'गलत शीरà¥à¤·à¤•',
'badtitletext' => 'अनà¥à¤°à¥‹à¤§ गरेको पृषà¥à¤  शीरà¥à¤·à¤• अमानà¥à¤¯, खाली वा गलत रà¥à¤ªà¤®à¤¾ अनà¥à¤¤à¤° भाषा वा अनà¥à¤¤à¤° विकी समà¥à¤¬à¤¨à¥à¤§ गरिà¤à¤•à¥‹ थियो। यसमा शीरà¥à¤·à¤•à¤®à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ नमिलà¥à¤¨à¥‡ à¤à¤• वा बढी अकà¥à¤·à¤°à¤¹à¤°à¥‚ रहेका हà¥à¤¨à¤¸à¤•à¥à¤›à¤¨à¥ ।',
-'perfcached' => 'तलको डाटाहरॠकà¥à¤¯à¤¾à¤šà¤®à¤¾ रहेका कà¥à¤°à¤¾à¤¹à¤°à¥ हà¥à¤¨à¥à¥¤ अपटà¥à¤¡à¥‡à¤Ÿ नहà¥à¤¨à¤ªà¤¨à¤¿ सकà¥à¤›à¤¨à¥à¥¤',
-'perfcachedts' => 'तलको डाटाहरॠकà¥à¤¯à¤¾à¤šà¤®à¤¾ रहेका कà¥à¤°à¤¾à¤¹à¤°à¥ हà¥à¤¨à¥ र यो पछिलà¥à¤²à¥‹ पलà¥à¤Ÿ $1 मा अपडेट गरीà¤à¤•à¥‹ थियो ।',
+'perfcached' => 'तलको डाटाहरॠकà¥à¤¯à¤¾à¤šà¤®à¤¾ रहेका कà¥à¤°à¤¾à¤¹à¤°à¥ हà¥à¤¨à¥à¥¤ अपटà¥à¤¡à¥‡à¤Ÿ नहà¥à¤¨à¤ªà¤¨à¤¿ सकà¥à¤›à¤¨à¥à¥¤ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'तलको डाटाहरॠकà¥à¤¯à¤¾à¤šà¤®à¤¾ रहेका कà¥à¤°à¤¾à¤¹à¤°à¥ हà¥à¤¨à¥ र यो पछिलà¥à¤²à¥‹ पलà¥à¤Ÿ $1 मा अपडेट गरीà¤à¤•à¥‹ थियो । A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'यो पृषà¥à¤ à¤•à¥‹ अदà¥à¤¯à¤¤à¤¨ कारà¥à¤¯ निसà¥à¤•à¥à¤°à¤¿à¤¯ गरिà¤à¤•à¥‹ छ।
यहाà¤à¤•à¥‹ डेटा हालमा ताजा पारिने छैन।',
'wrong_wfQuery_params' => ' wfQuery()को लागि गलत पà¥à¤¯à¤¾à¤°à¤¾à¤®à¥‡à¤Ÿà¤°<br />
कारà¥à¤¯: $1<br />
खोज: $2',
'viewsource' => 'सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸',
-'viewsourcefor' => '$1 को लागि',
+'viewsource-title' => ' $1 को सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸',
'actionthrottled' => 'कारà¥à¤¯ रोकियो',
'actionthrottledtext' => 'सà¥à¤ªà¤¾à¤®à¤¬à¤¾à¤Ÿ बचà¥à¤¨à¥‡ तरिकाको रà¥à¤ªà¤®à¤¾ , तपाईà¤à¤²à¤¾à¤ˆ यो कारà¥à¤¯ थोरै समयमा धेरै पटक गरà¥à¤¨à¤¬à¤¾à¤Ÿ सिमित गरिà¤à¤•à¥‹ छ, र तपाईले आफà¥à¤¨à¥‹ सिमा पार गरिसकà¥à¤¨à¥ भयो ।
कृपया केही मिनेटहरॠपछि पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'protectedpagetext' => 'यो पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ हà¥à¤¨à¤¬à¤¾à¤Ÿ बचाउन समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¤¾ रोक लगाइà¤à¤•à¥‹ छ।',
'viewsourcetext' => 'तपाईà¤à¤²à¥‡ यस पृषà¥à¤ à¤•à¥‹ सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨ र पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¥€ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।',
+'viewyourtext' => "यस पृषà¥à¤ à¤®à¤¾ रहेका '''तपाईà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥''' हेरà¥à¤¨ या पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¥€ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› :",
'protectedinterface' => 'यो पृषà¥à¤ à¤²à¥‡ सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤•à¥‹ लागि अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¤¡à¤¾ पाठ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤› , र यसलाई दà¥à¤°à¥à¤ªà¤¯à¥‹à¤— हà¥à¤¨à¤¬à¤¾à¤Ÿ बचाउन तालà¥à¤šà¤¾ मारिà¤à¤•à¥‹ छ।',
'editinginterface' => "'''चेतावनी:''' तपाईं यसà¥à¤¤à¥‹ पृषà¥à¤ à¤²à¤¾à¤ˆ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥à¤à¤¦à¥ˆà¤›, जसले सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤•à¥‹ लागि अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¥‹à¤¡à¤¼à¤¾ (interface) पाठ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤›à¥¤
यसको परिवरà¥à¤¤à¤¨à¤²à¥‡ अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¥‹à¤¡à¤¼à¤¾à¤•à¥‹ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤®à¤¾ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤›à¥¤
@@ -532,6 +535,7 @@ $2',
'noemailprefs' => 'निमà¥à¤¨ सà¥à¤µà¤¿à¤§à¤¾à¤¹à¤°à¥ रामà¥à¤°à¤°à¥€ काम गरà¥à¤¨à¤•à¥‹ लागि तपाईको अभिरà¥à¤šà¤¿à¤®à¤¾ आफà¥à¤¨à¥‹ ई-मेल ठेगाना खà¥à¤²à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'emailconfirmlink' => 'तपाईंको ई-मेल ठेगाना पकà¥à¤•à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'invalidemailaddress' => 'ई-मेल ठेगाना सà¥à¤µà¥€à¤•à¤¾à¤° गरà¥à¤¨ सकिà¤à¤¨ किन भनें यो सही पà¥à¤°à¤¾à¤°à¥‚पमा छैन, कृपया सही पà¥à¤°à¤¾à¤°à¥‚पको ठेगाना दिनà¥à¤¹à¥‹à¤¸à¥à¥¤',
+'cannotchangeemail' => 'यस विकिमा तपाईको खातासà¤à¤— समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ इमेल ठेगाना परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकिनà¥à¤¨ ।',
'accountcreated' => 'खाता खोलियो',
'accountcreatedtext' => '$1 कोलागि पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ खाता खोलियो।',
'createaccount-title' => '{{SITENAME}}कोलागि खाता खोलà¥à¤¨à¥‡ काम',
@@ -545,6 +549,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHP मेल() कà¥à¤°à¤¿à¤¯à¤¾à¤®à¤¾ अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿',
+'user-mail-no-addy' => 'इमेल ठेगाना बिना नै इमेल पठाउन खोजिà¤à¤•à¥‹ थियो।',
# Change password dialog
'resetpass' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -573,6 +578,7 @@ $2',
'passwordreset-pretext' => '{{PLURAL:$1||तल दिà¤à¤•à¤¾ आà¤à¤•à¤¡à¤¼à¤¾à¤•à¤¾ टà¥à¤•à¥à¤°à¤¾ मधà¥à¤¯à¥‡ à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥}}',
'passwordreset-username' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾-नाम:',
'passwordreset-domain' => 'डोमेन',
+'passwordreset-capture' => 'निसà¥à¤•à¤¨à¥‡ इमेलको नमà¥à¤¨à¤¾ हेरà¥à¤¨à¥‡ ?',
'passwordreset-email' => 'इमेल ठेगाना:',
'passwordreset-emailtitle' => '{{SITENAME}}मा खाता विवरण',
'passwordreset-emailtext-ip' => 'कसैले (सायद तपाईंले, $1 आई पी ठेगानाबाट) {{SITENAME}} ($4)मा तपाईंको खाता विवरणको निमà¥à¤¤à¤¿ à¤à¤‰à¤Ÿà¤¾ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤•à¤•à¥‹ अनà¥à¤°à¥‹à¤§ गरेको छ। निमà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ {{PLURAL:$3|खाता यस इमेल ठेगानासित समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ छ|खाताहरॠयस इमेल ठेगानासित समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ छनà¥}}:
@@ -591,6 +597,17 @@ $2
असà¥à¤¥à¤¾à¤ˆ पासवरà¥à¤¡: $2',
'passwordreset-emailsent' => 'à¤à¤‰à¤Ÿà¤¾ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• इमेल पठाइयो।',
+# Special:ChangeEmail
+'changeemail' => 'इमेल ठेगाना परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
+'changeemail-header' => 'खाताको इमेल ठेगाना परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
+'changeemail-text' => 'आफà¥à¤¨à¥‹ इमेल ठेगाना परिवरà¥à¤¤à¤¨ गरà¥à¤¨ यो फारम भरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥¤ यसलाई पà¥à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨ तपाईले आफà¥à¤¨à¥‹ पासवरà¥à¤¡ हालà¥à¤¨à¥ परà¥à¤¨à¥‡à¤›à¥¤',
+'changeemail-no-info' => 'यस पृषà¥à¤ à¤®à¤¾ सिधै जानको लागि पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥ परà¥à¤¨à¥‡ हà¥à¤¨à¥à¤› ।',
+'changeemail-oldemail' => 'हालको इमेल-ठेगाना:',
+'changeemail-newemail' => 'नयाठइमेल-ठेगाना:',
+'changeemail-none' => '(कà¥à¤¨à¥ˆ पनि हैन)',
+'changeemail-submit' => 'इमेल परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡',
+'changeemail-cancel' => 'रदà¥à¤¦ गरà¥à¤¨à¥‡',
+
# Edit page toolbar
'bold_sample' => 'गाढा अकà¥à¤·à¤°',
'bold_tip' => 'गाढा अकà¥à¤·à¤°',
@@ -660,9 +677,6 @@ $2
तपाईंको वरà¥à¤¤à¤®à¤¾à¤¨ IP ठेगाना हो- $3, अनि रोक लगाइà¤à¤•à¥‹ ID हो- #$5.
कृपया कà¥à¤¨à¥ˆ बेला सोधनी गरà¥à¤¨à¥ परे उपरà¥à¤¯à¥à¤•à¥à¤¤ विवरण दरà¥à¤¶à¤¾à¤‰à¤¨à¥ होला।",
'blockednoreason' => 'कारण दिइà¤à¤•à¥‹ छैन',
-'blockedoriginalsource' => "'''$1''' को सà¥à¤°à¥‹à¤¤ तल देखाइà¤à¤•à¥‹ छ:",
-'blockededitsource' => "'''$1'''को '''तपाईà¤à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨'''को पाठ तल देखाइà¤à¤•à¥‹ छ:",
-'whitelistedittitle' => 'समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¤•à¥‹ लागि पà¥à¤°à¤µà¥‡à¤¶ (लग इन) आवशà¥à¤¯à¤• छ',
'whitelistedittext' => 'पाना समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨ तपाà¤à¤ˆà¤²à¥‡ $1 गरà¥à¤¨à¥ परà¥à¤¦à¤›à¥¤',
'confirmedittext' => 'तपाईंले पृषà¥à¤  संपादन गरà¥à¤¨à¤…घि आफà¥à¤¨à¥‹ ई-मेल ठेगानाको पà¥à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤
कृपया ई-मेल ठेगाना तयार गरी [[Special:Preferences|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अभिरूचि]] मारà¥à¤«à¤¤ मंजà¥à¤° गराउनà¥à¤¹à¥‹à¤¸à¥à¥¤',
@@ -748,7 +762,7 @@ $2
'copyrightwarning2' => "कृपया धà¥à¤¯à¤¾à¤¨ दिनà¥à¤¹à¥‹à¤¸à¥ यस {{SITENAME}}मा दिइà¤à¤•à¤¾ योगदानहरà¥à¤²à¤¾à¤ˆ अनà¥à¤¯ योगदाताहरà¥à¤¦à¥à¤µà¤¾à¤°à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ गरिनेछ, परिवरà¥à¤¤à¤¨ गरिनेछ अथवा हटाइनेछ। यदि तपाईंको लेखलाई निरà¥à¤¦à¤¯à¤¤à¤¾ पूरà¥à¤µà¤• समà¥à¤ªà¤¾à¤¦à¤¨ गरेको चाहनà¥à¤¹à¥à¤¨à¥à¤¨ भनें तà¥à¤¯à¥‹ यहाठनदिनà¥à¤¹à¥‹à¤¸à¥à¥¤<br />
यदि तपाईं किटानसाथ भनà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› कि यो लेख तपाईं आफै लेखेको हो अथवा सारà¥à¤µà¤œà¤¨à¤¿à¤• जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤° अथवा मà¥à¤•à¥à¤¤ संसाधनबाट लिइà¤à¤•à¥‹ हो (विवरणकोलागि हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ $1 ).
'''कपीराइट भà¤à¤•à¥‹ रचना अनà¥à¤®à¤¤à¤¿ बिना यहाठनदिनà¥à¤¹à¥‹à¤¸à¥!'''",
-'longpageerror' => "'''तà¥à¤°à¥à¤Ÿà¤¿: तपाईंले बà¥à¤à¤¾à¤à¤•à¥‹ पाठ $1 किलोबाइट लामो छ, जो अधिकतम $2 किलोबाइटभनà¥à¤¦à¤¾ लामो छ।'''
+'longpageerror' => "'''तà¥à¤°à¥à¤Ÿà¤¿: तपाईंले बà¥à¤à¤¾à¤à¤•à¥‹ पाठ {{PLURAL:$1|one किलोबाइट|$1 किलोबाइट}} लामो छ, जो अधिकतम {{PLURAL:$2|one किलोबाइट|$2 किलोबाइट}} भनà¥à¤¦à¤¾ लामो छ।'''
यो संगà¥à¤°à¤¹à¤¿à¤¤ हà¥à¤¨ सकà¥à¤¤à¥ˆà¤¨à¥¤",
'readonlywarning' => "'''चेतावनी: आà¤à¤•à¤¡à¤¼à¤¾ मरमà¥à¤®à¤¤à¤¿à¤•à¥‹ निमà¥à¤¤à¤¿ बनà¥à¤¦ गरिà¤à¤•à¥‹à¤›, यसकारण तपाईं आफà¥à¤¨à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ अहिले संगà¥à¤°à¤¹ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨à¥¤'''
@@ -908,8 +922,6 @@ $2
'revdelete-unsuppress' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ पà¥à¤¨à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿à¤¬à¤¾à¤Ÿ बनà¥à¤¦à¥‡à¤œ हटाउने',
'revdelete-log' => 'कारण :',
'revdelete-submit' => '{{PLURAL:$1|छानिà¤à¤•à¥‹ संशोधन|छानिà¤à¤•à¤¾ संशोधनहरà¥}}मा पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡',
-'revdelete-logentry' => '[[$1]] को पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ दृषà¥à¤Ÿà¤¿ परिवरà¥à¤¤à¤¨ गरियो',
-'logdelete-logentry' => '[[$1]] को पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ घटना दृषà¥à¤Ÿà¤¿ परिवरà¥à¤¤à¤¨ गरियो',
'revdelete-success' => "'''संशोधन दृशà¥à¤¯à¤¤à¤¾ सफलतापूरà¥à¤µà¤• अदà¥à¤¯à¤¤à¤¨ भयो।'''",
'revdelete-failure' => "'''संशोधन दृशà¥à¤¯à¤¤à¤¾ अदà¥à¤¯à¤¤à¤¨ गरà¥à¤¨ सकिà¤à¤¨:'''
$1",
@@ -921,15 +933,6 @@ $1",
'revdel-restore-visible' => 'पà¥à¤°à¤•à¤Ÿ संशोधन',
'pagehist' => 'पृषà¥à¤ à¤•à¥‹ इतिहास',
'deletedhist' => 'मेटाà¤à¤•à¤¾ इतिहास',
-'revdelete-content' => 'सामगà¥à¤°à¥€',
-'revdelete-summary' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सारांश',
-'revdelete-uname' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ नाम',
-'revdelete-restricted' => 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¤¹à¤°à¥à¤®à¤¾à¤¥à¤¿ सीमितता लागू गरियो',
-'revdelete-unrestricted' => 'पà¥à¤°à¤µà¤¨à¥à¤§à¤•à¤•à¥‹à¤²à¤¾à¤—ि निषेधहरॠहटाइयो ।',
-'revdelete-hid' => ' $1 लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
-'revdelete-unhid' => ' $1 नलà¥à¤•à¤¾à¤‰à¤¨à¥‡',
-'revdelete-log-message' => '$1 $2 को लागि{{PLURAL:$2|पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨|पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥}}',
-'logdelete-log-message' => '$1 $2को लागि {{PLURAL:$2|घटना|घटनाहरà¥}}',
'revdelete-hide-current' => '$2, $1: मिति गरिà¤à¤•à¤¾ वसà¥à¤¤à¥à¤¹à¤°à¥ लà¥à¤•à¤¾à¤‰à¤¨ मिलेन यो नै सबैभनà¥à¤¦à¤¾ नयाठसंसà¥à¤•à¤°à¤£ हो ।
यसलाई लà¥à¤•à¤¾à¤‰à¤¨ मिलà¥à¤¦à¥ˆà¤¨ ।',
'revdelete-show-no-access' => ' $2समय र $1 मिति भà¤à¤•à¥‹ वसà¥à¤¤à¥ देखाउन सकिà¤à¤¨: यसलाई "निषेधित"भनि चिनो लगाइà¤à¤•à¥‹ छ।
@@ -1085,12 +1088,14 @@ $1",
'prefs-rc' => 'नयाठपरिवरà¥à¤¤à¤¨à¤¹à¤°à¥',
'prefs-watchlist' => 'अवलोकन पृषà¥à¤ ',
'prefs-watchlist-days' => 'निगरानी सूचीमा देखाउन दिनहरà¥:',
-'prefs-watchlist-days-max' => 'धेरैमा ७ दिनहरà¥',
+'prefs-watchlist-days-max' => 'धेरैमा $1 {{PLURAL:$1|दिन|दिन}}',
'prefs-watchlist-edits' => 'उचà¥à¤šà¤¤à¤® परिवरà¥à¤¤à¤¨ संखà¥à¤¯à¤¾ बढाइà¤à¤•à¥‹ निगरानी सूचीमा देखाउनको लागि :',
'prefs-watchlist-edits-max' => 'उचà¥à¤šà¤¤à¤® संखà¥à¤¯à¤¾ : १०००',
'prefs-watchlist-token' => 'अवलोकन सूची टोकन:',
'prefs-misc' => 'साधारण',
'prefs-resetpass' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ परिवरà¥à¤°à¤¤à¤¨',
+'prefs-changeemail' => 'इमेल परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡',
+'prefs-setemail' => 'इमेल ठेगाना पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥‡',
'prefs-email' => 'इमेल विकलà¥à¤ªà¤¹à¤°à¥',
'prefs-rendering' => 'सà¥à¤µà¤°à¥à¤ª',
'saveprefs' => 'संगà¥à¤°à¤¹',
@@ -1288,13 +1293,13 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'right-autopatrol' => 'आफà¥à¤¨à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥ पटà¥à¤°à¥‹à¤²(गसà¥à¤¤à¥€) गरिà¤à¤•à¥‹ रà¥à¤ªà¤®à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-patrolmarks' => 'हालका समà¥à¤ªà¤¾à¤¦à¤¨ पटà¥à¤°à¥‹à¤²(गसà¥à¤¤à¥€) चिनो लगाउने',
'right-unwatchedpages' => 'निगरानी नगरिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ सूचीहेरà¥à¤¨à¥‡',
-'right-trackback' => 'टà¥à¤°à¥à¤¯à¤¾à¤•à¤¬à¥à¤¯à¤¾à¤• बà¥à¤à¤¾à¤‰à¤¨à¥‡',
'right-mergehistory' => 'पृषà¥à¤ à¤•à¤¾ इतिहासहरॠबà¥à¤à¤¾à¤‰à¤¨à¥‡',
'right-userrights' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ अधिकारहरॠसमà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-userrights-interwiki' => 'अरॠविकिहरà¥à¤®à¤¾ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤•à¥‹ अधिकार समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-siteadmin' => 'डेटाबेसको तालà¥à¤šà¤¾à¤®à¤¾à¤°à¥à¤¨à¥‡ र तालà¥à¤šà¤¾à¤–ोलà¥à¤¨à¥‡',
'right-override-export-depth' => 'गहिराइ ५ समà¥à¤®à¤•à¥‹ लिंकगरिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ सहित निरà¥à¤¯à¤¾à¤¤ गरà¥à¤¨à¥‡',
'right-sendemail' => 'अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ इमेल गरà¥à¤¨à¥‡',
+'right-passwordreset' => 'पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡ ईमेलहरॠहेरà¥à¤¨à¥à¤¹à¥‹à¤¸',
# User rights log
'rightslog' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकार लग',
@@ -1333,11 +1338,11 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'action-patrol' => 'अरà¥à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤²à¤¾à¤ˆ निगरानीको चिनà¥à¤¹ लगाउने',
'action-autopatrol' => 'तपाईंको समà¥à¤ªà¤¾à¤¦à¤¨à¤²à¤¾à¤ˆ गशà¥à¤¤ रà¥à¤ªà¤®à¤¾ दाग दिनà¥à¤¹à¥‹à¤¸à¥',
'action-unwatchedpages' => 'अवलोकन नगरिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ सूची हेरà¥à¤¨à¥‡',
-'action-trackback' => 'टà¥à¤°à¥à¤¯à¤¾à¤•à¤¬à¥à¤¯à¤¾à¤• (trackback) बà¥à¤à¤¾à¤‰à¤¨à¥‡',
'action-mergehistory' => 'यस पृषà¥à¤ à¤•à¥‹ इतिहासलाई मिसाउने',
'action-userrights' => 'सबै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ अधिकारहरॠसमà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'action-userrights-interwiki' => 'अरॠविकिका पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकारलाई समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'action-siteadmin' => 'डेटाबेस बनà¥à¤¦à¤—रà¥à¤¨à¥‡ वा खोलà¥à¤¨à¥‡',
+'action-sendemail' => 'इमेलहरॠपठाउने',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¤¨|परिवरà¥à¤¤à¤¨à¤¹à¤°à¥}}',
@@ -1367,7 +1372,6 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'newpageletter' => 'न',
'boteditletter' => 'बो',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 निगरानी गरà¥à¤¦à¥ˆ{{PLURAL:$1|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥}}]',
'rc_categories' => 'शà¥à¤°à¥‡à¤£à¥€à¤¹à¤°à¥à¤®à¤¾ सीमित ("|" ले छà¥à¤Ÿà¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥)',
'rc_categories_any' => 'कà¥à¤¨à¥ˆ',
@@ -1381,7 +1385,6 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'recentchangeslinked-feed' => 'संबनà¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¹à¤°à¥',
'recentchangeslinked-toolbox' => 'संबनà¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¹à¤°à¥',
'recentchangeslinked-title' => '"$1"समà¥à¤µà¤¨à¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¸à¤à¤—',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'जोडिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤®à¤¾ दिइà¤à¤•à¥‹ समयावधीमा कà¥à¤¨à¥ˆ पनि परिवरà¥à¤¤à¤¨ भà¤à¤•à¥‹ छैन ।',
'recentchangeslinked-summary' => "यो सूची निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ पृषà¥à¤  (वा निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ शà¥à¤°à¥‡à¤£à¥€)सित जोड़िà¤à¤•à¤¾ भरà¥à¤–रै परिवरà¥à¤¤à¤¨ भà¤à¤•à¤¾ पृषà¥à¤ à¤•à¥‹ हो। [[Special:Watchlist|तपाईà¤à¤•à¥‹ निगरानी सूची]]का पृषà¥à¤ à¤¹à¤°à¥ '''गाढा अकà¥à¤·à¤°à¤®à¤¾''' छनà¥à¥¤",
'recentchangeslinked-page' => 'पृषà¥à¤  नाम:',
@@ -1493,6 +1496,18 @@ $1',
'upload-unknown-size' => 'अजà¥à¤žà¤¾à¤¤ आकार',
'upload-http-error' => 'HTTP तà¥à¤°à¥à¤Ÿà¤¿ भयो: $1',
+# File backend
+'backend-fail-delete' => ' $1 फाइल मेटà¥à¤¨ सकिà¤à¤¨ ।',
+'backend-fail-alreadyexists' => ' $1 पहिके देखि नै रहेको छ ।',
+'backend-fail-store' => 'फाइल $1 लाई $2 मा संगà¥à¤°à¤¹ गरà¥à¤¨ सकिà¤à¤¨ ।',
+'backend-fail-copy' => 'फाइल $1 लाई $2 मा पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¥€ गरà¥à¤¨ सकिà¤à¤¨ ।',
+'backend-fail-move' => 'फाइल $1 लाई $2 मा सारà¥à¤¨ सकिà¤à¤¨ ।',
+'backend-fail-opentemp' => 'असà¥à¤¥à¤¾à¤‡ फाइल खोलà¥à¤¨ सकिà¤à¤¨',
+'backend-fail-writetemp' => 'असà¥à¤¥à¤¾à¤‡ फाइलमा लेखà¥à¤¨ सकिà¤à¤¨',
+'backend-fail-closetemp' => 'असà¥à¤¥à¤¾à¤‡ फाइल बनà¥à¤¦ गरà¥à¤¨ सकिà¤à¤¨',
+'backend-fail-read' => 'फाइल $1 खोलà¥à¤¨ सकिà¤à¤¨ ।',
+'backend-fail-create' => 'फाइल $1 सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨ सकिà¤à¤¨',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ZIP परीकà¥à¤·à¤£à¤•à¥‹ लागि फाइल खोलà¥à¤¦à¤¾ à¤à¤• तà¥à¤°à¥à¤Ÿà¥€ भेटीयो ।',
'zip-wrong-format' => 'खà¥à¤²à¤¾à¤‡à¤à¤•à¥‹ फाइल ZIP फाइल हैन ।',
@@ -1788,11 +1803,7 @@ $1',
'activeusers-noresult' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥ भेटिà¤à¤¨à¤¨à¥à¥¤',
# Special:Log/newusers
-'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शà¥à¤°à¥ƒà¤œà¤¨à¤¾ लग',
-'newuserlog-byemail' => 'इ मेलबाट पठाइà¤à¤•à¥‹ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦',
-'newuserlog-create-entry' => 'नयाठपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
-'newuserlog-create2-entry' => 'नयाठखाता $1 खोलियो',
-'newuserlog-autocreate-entry' => 'खाता सà¥à¤µà¤¤à¤ƒ निरà¥à¤®à¤¾à¤£ गरियो',
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शà¥à¤°à¥ƒà¤œà¤¨à¤¾ लग',
# Special:ListGroupRights
'listgrouprights' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ समूह अधिकार',
@@ -1818,7 +1829,7 @@ $1',
'emailuser' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउनà¥à¤¹à¥‹à¤¸à¥',
'emailpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ इमेल गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'usermailererror' => 'मेल अबà¥à¤œà¥‡à¤•à¥à¤Ÿà¤²à¥‡ देखाà¤à¤•à¥‹ तà¥à¤°à¥à¤Ÿà¤¿:',
-'defemailsubject' => '{{SITENAME}} ई-मेल',
+'defemailsubject' => '{{SITENAME}} पà¥à¤°à¤¯à¤ªà¥‹à¤—करà¥à¤¤à¤¾ "$1" बाट इमेल',
'usermaildisabled' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ ई-मेल निरसà¥à¤¤ गरिà¤à¤•à¥‹',
'usermaildisabledtext' => 'यस विकिमा तपाईं अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ ई-मेल पठाउन सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨',
'noemailtitle' => 'ईमेल ठेगाना नभà¤à¤•à¥‹',
@@ -1873,7 +1884,7 @@ $1',
'watchmethod-list' => 'समà¥à¤ªà¤¦à¤¾à¤¨ गरिà¤à¤•à¤¾ निगरानी सà¥à¤šà¥€à¤®à¤¾ रहेका पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ जाà¤à¤šà¥à¤¦à¥ˆ',
'watchlistcontains' => 'तपाईको निगरानी सà¥à¤šà¥€à¤®à¤¾ $1 {{PLURAL:$1|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}रहेका छनॠ।',
'iteminvalidname' => "वसà¥à¤¤à¥ '$1'मा समसà¥à¤¯à¤¾ , अमानà¥à¤¯ नाम...",
-'wlnote' => "विगत {{PLURAL:$2|घणà¥à¤Ÿà¤¾à¤®à¤¾|'''$2''' घणà¥à¤Ÿà¤¾à¤¹à¤°à¥à¤®à¤¾}} {{PLURAL:$1|गरिà¤à¤•à¥‹ अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨ तल दिइà¤à¤•à¥‹à¤›|गरिà¤à¤•à¤¾ अनà¥à¤¤à¤¿à¤® '''$1''' परिवरà¥à¤¤à¤¨à¤¹à¤°à¥ तल दिइà¤à¤•à¤¾à¤›à¤¨à¥}}।",
+'wlnote' => "$3 र $4 अनà¥à¤¸à¤¾à¤° विगत {{PLURAL:$2|घणà¥à¤Ÿà¤¾à¤®à¤¾|'''$2''' घणà¥à¤Ÿà¤¾à¤¹à¤°à¥à¤®à¤¾}} {{PLURAL:$1|गरिà¤à¤•à¥‹ अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨ तल दिइà¤à¤•à¥‹à¤›|गरिà¤à¤•à¤¾ अनà¥à¤¤à¤¿à¤® '''$1''' परिवरà¥à¤¤à¤¨à¤¹à¤°à¥ तल दिइà¤à¤•à¤¾ छनà¥}}।",
'wlshowlast' => 'पछिलà¥à¤²à¤¾ $2 दिनहरूका $3 $1 घणà¥à¤Ÿà¤¾à¤¹à¤°à¥‚का देखाउनà¥à¤¹à¥‹à¤¸à¥',
'watchlist-options' => 'निगरानि सूची विकलà¥à¤ª',
@@ -1931,7 +1942,6 @@ $UNWATCHURL
'exbeforeblank' => 'खालि गरà¥à¤¨à¥ भनà¥à¤¦à¤¾ अघिको सामगà¥à¤°à¥€ थियो: "$1"',
'exblank' => 'पृषà¥à¤  खाली छ',
'delete-confirm' => 'मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ "$1"',
-'delete-backlink' => '↠$1 \\',
'delete-legend' => 'मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'historywarning' => ' चेतावनी: तपाईंले मेटाउन लागà¥à¤¨à¥à¤­à¤à¤•à¥‹ पृषà¥à¤ à¤•à¥‹ इतिहासको लगभग $1 {{PLURAL:$1|पà¥à¤¨à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿ छ|पà¥à¤¨à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿à¤¹à¤°à¥ छनà¥}}:',
'confirmdeletetext' => 'तपाई यो पृषà¥à¤  र यसको इतिहास मेटà¥à¤¨ गइरहनॠभà¤à¤•à¥‹à¤›à¥¤ कृपया पà¥à¤·à¥à¤Ÿà¤¿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ कि [[{{MediaWiki:Policy-url}}|नियम]] मà¥à¤¤à¤¾à¤¬à¤¿à¤• तपाईं मेटà¥à¤¨ गइरहनॠभà¤à¤•à¥‹à¤›à¥¤',
@@ -1939,8 +1949,6 @@ $UNWATCHURL
'actionfailed' => 'कारà¥à¤¯ असफल',
'deletedtext' => '"$1" मेटिà¤à¤•à¥‹ छ।
हालै हटाइà¤à¤•à¥‹ सूची $2 मा हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
-'deletedarticle' => '"[[$1]]" मेटियो',
-'suppressedarticle' => '"[[$1]]"लाई दमन गरियो \\',
'dellogpage' => 'मेटाà¤à¤•à¥‹ लग',
'dellogpagetext' => 'हालका सबैभनà¥à¤¦à¤¾ नयाठमेटाहरॠनिमà¥à¤¨ सà¥à¤šà¥€à¤®à¤¾ रहेका छनà¥à¥¤',
'deletionlog' => 'मेटाइà¤à¤•à¥‹ लग',
@@ -2058,7 +2066,6 @@ $3दà¥à¤µà¤¾à¤°à¤¾ $1को ($4को समय $5 मा) मेटाइà¤
'undeletereset' => 'रिसेट गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'undeleteinvert' => ' चयन उलà¥à¤Ÿà¥à¤¯à¤¾à¤‰à¤¨à¥‡',
'undeletecomment' => 'कारण :',
-'undeletedarticle' => '"[[$1]]" मा फरà¥à¤•à¤¾à¤‡à¤¯à¥‹',
'undeletedrevisions' => '{{PLURAL:$1|à¤à¤‰à¤Ÿà¤¾ संशोधन|$1 संशोधनहरà¥}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ गरियो',
'undeletedrevisions-files' => '{{PLURAL:$1|à¤à¤‰à¤Ÿà¤¾ संशोधन|$1 संशोधनहरà¥}} र {{PLURAL:$2|à¤à¤‰à¤Ÿà¤¾ फाइल|$2 फाइलहरà¥}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ गरियो',
'undeletedfiles' => '{{PLURAL:$1|१ फाइल|$1 फाइलहरॠ}} पूरà¥à¤µà¤¸à¥à¤¥à¤¿à¤¤à¤¿à¤®à¤¾ लà¥à¤¯à¤¾à¤‡à¤¯à¥‹',
@@ -2121,7 +2128,6 @@ $3दà¥à¤µà¤¾à¤°à¤¾ $1को ($4को समय $5 मा) मेटाइà¤
'whatlinkshere' => 'यहाठके जोडिनà¥à¤›',
'whatlinkshere-title' => '$1 सà¤à¤— जोडिà¤à¤•à¤¾ पानाहरू',
'whatlinkshere-page' => 'पृषà¥à¤ :',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "निमà¥à¤¨ पृषà¥à¤ à¤¹à¤°à¥ '''[[:$1]]''' मा जोडिनà¥à¤› :",
'nolinkshere' => " '''[[:$1]]'''मा लिंक भà¤à¤•à¤¾ पà¥à¤¯à¤¾à¤•à¥‡à¤œà¥‡à¤œà¤¹à¤°à¥ छैननà¥",
'nolinkshere-ns' => "चà¥à¤¨à¤¿à¤à¤•à¥‹ नामसà¥à¤¥à¤¾à¤¨à¤®à¤¾ '''[[:$1]]''' सित जोड़िने पृषà¥à¤ à¤¹à¤°à¥ छैननà¥à¥¤",
@@ -2196,6 +2202,7 @@ $3दà¥à¤µà¤¾à¤°à¤¾ $1को ($4को समय $5 मा) मेटाइà¤
'blocklist-userblocks' => 'खाता निषेधित लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'blocklist-tempblocks' => 'असà¥à¤¥à¤¾à¤ˆ रोकहरॠलà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'blocklist-addressblocks' => 'à¤à¤•à¥à¤²à¥‹ आई पी रोक लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
+'blocklist-rangeblocks' => 'रेनà¥à¤œ रोकहरॠलà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'blocklist-timestamp' => 'समयछाप',
'blocklist-target' => 'लकà¥à¤·à¥à¤¯',
'blocklist-expiry' => 'सकिनेछ',
@@ -2329,9 +2336,6 @@ $1को बनà¥à¤¦à¥‡à¤œà¤•à¥‹ कारण : "$2" हो',
'movepage-page-moved' => ' $1 पृषà¥à¤ à¤²à¤¾à¤ˆ $2 मा सारियो ।',
'movepage-page-unmoved' => '$1 पृषà¥à¤ à¤²à¤¾à¤ˆ $2 मा सारà¥à¤¨ सकिà¤à¤¨ ।',
'movepage-max-pages' => 'अधिकतम $1 {{PLURAL:$1|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}} सारिसकिà¤à¤•à¥‹ छ र अरॠसà¥à¤µà¤¤: सारिने छैन ।',
-'1movedto2' => '[[$1]] लाई [[$2]]मा सारियो',
-'1movedto2_redir' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤à¤®à¤¾ [[$1]]लाई [[$2]]मा सारियो',
-'move-redirect-suppressed' => 'अनà¥à¤ªà¥à¤°à¥‡à¤·à¤£ अवरोध भयो',
'movelogpage' => 'लग सारà¥à¤¨à¥‡',
'movelogpagetext' => 'सबै सारिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ सूची तल दिइà¤à¤•à¥‹à¤›à¥¤',
'movesubpage' => '{{PLURAL:$1|उपपृषà¥à¤ |उपपृषà¥à¤ à¤¹à¤°à¥}}',
@@ -2435,73 +2439,75 @@ $1को बनà¥à¤¦à¥‡à¤œà¤•à¥‹ कारण : "$2" हो',
'import-logentry-interwiki-detail' => '$2 देखि $1 {{PLURAL:$1|पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨|पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥}}',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'तपाईको पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤ ',
-'tooltip-pt-anonuserpage' => 'तपाईले जà¥à¤¨ IP ठेगानाको रà¥à¤ªà¤®à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¦à¥ˆ हà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› , तà¥à¤¯à¤¸à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤  निमà¥à¤¨ छ :',
-'tooltip-pt-mytalk' => 'तपाईको वारà¥à¤¤à¤¾ पृषà¥à¤ ',
-'tooltip-pt-anontalk' => 'यो IP ठेगानाबाट गरिà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¤¾ बारेमा बारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
-'tooltip-pt-preferences' => 'तपाईंका अभिरà¥à¤šà¤¿à¤¹à¤°à¥‚',
-'tooltip-pt-watchlist' => 'पृषà¥à¤ à¤¹à¤°à¥‚को सूची जसका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚लाई तपाईà¤à¤²à¥‡ निगरानी गरिरहनॠभà¤à¤•à¥‹ छ',
-'tooltip-pt-mycontris' => 'तपाईको योगदानको सूची',
-'tooltip-pt-login' => 'तपाईà¤à¤²à¤¾à¤ˆ पà¥à¤°à¤µà¥‡à¤¶à¤—रà¥à¤¨ सà¥à¤à¤¾à¤µ दिइनà¥à¤› ; तर यो जरà¥à¤°à¥€ भने छैन',
-'tooltip-pt-anonlogin' => 'तपाईà¤à¤²à¤¾à¤ˆ लग-इन गरà¥à¤¨ पà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¨ गरिनà¥à¤›, तर यो अनिवारà¥à¤¯ चाà¤à¤¹à¥€ होइन।',
-'tooltip-pt-logout' => 'निरà¥à¤—मन (लग आउट) गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-talk' => 'सामगà¥à¤°à¥€ पृषà¥à¤ à¤¬à¤¾à¤°à¥‡à¤®à¤¾ छलफल',
-'tooltip-ca-edit' => 'तपाईà¤à¤²à¥‡ यो पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।
+'tooltip-pt-userpage' => 'तपाईको पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤ ',
+'tooltip-pt-anonuserpage' => 'तपाईले जà¥à¤¨ IP ठेगानाको रà¥à¤ªà¤®à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¦à¥ˆ हà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› , तà¥à¤¯à¤¸à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤  निमà¥à¤¨ छ :',
+'tooltip-pt-mytalk' => 'तपाईको वारà¥à¤¤à¤¾ पृषà¥à¤ ',
+'tooltip-pt-anontalk' => 'यो IP ठेगानाबाट गरिà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¤¾ बारेमा बारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
+'tooltip-pt-preferences' => 'तपाईंका अभिरà¥à¤šà¤¿à¤¹à¤°à¥‚',
+'tooltip-pt-watchlist' => 'पृषà¥à¤ à¤¹à¤°à¥‚को सूची जसका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚लाई तपाईà¤à¤²à¥‡ निगरानी गरिरहनॠभà¤à¤•à¥‹ छ',
+'tooltip-pt-mycontris' => 'तपाईको योगदानको सूची',
+'tooltip-pt-login' => 'तपाईà¤à¤²à¤¾à¤ˆ पà¥à¤°à¤µà¥‡à¤¶à¤—रà¥à¤¨ सà¥à¤à¤¾à¤µ दिइनà¥à¤› ; तर यो जरà¥à¤°à¥€ भने छैन',
+'tooltip-pt-anonlogin' => 'तपाईà¤à¤²à¤¾à¤ˆ लग-इन गरà¥à¤¨ पà¥à¤°à¥‹à¤¤à¥à¤¸à¤¾à¤¹à¤¨ गरिनà¥à¤›, तर यो अनिवारà¥à¤¯ चाà¤à¤¹à¥€ होइन।',
+'tooltip-pt-logout' => 'निरà¥à¤—मन (लग आउट) गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-talk' => 'सामगà¥à¤°à¥€ पृषà¥à¤ à¤¬à¤¾à¤°à¥‡à¤®à¤¾ छलफल',
+'tooltip-ca-edit' => 'तपाईà¤à¤²à¥‡ यो पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।
कृपया संगà¥à¤°à¤¹ â€à¤ªà¤¹à¤¿à¤²à¥‡ पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ बटन पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤²à¤¾ ।',
-'tooltip-ca-addsection' => 'नयाठखणà¥à¤¡ सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-viewsource' => 'यो पृषà¥à¤  सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•à¥‹ छ। यसको शà¥à¤°à¥‹à¤¤ हेरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤',
-'tooltip-ca-history' => 'यस पृषà¥à¤ à¤•à¥‹ पहिलेका पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥',
-'tooltip-ca-protect' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ संरकà¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-unprotect' => 'यस पृषà¥à¤ à¤•à¥‹ सà¥à¤°à¤•à¥à¤·à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡',
-'tooltip-ca-delete' => 'यो पृषà¥à¤  मेटाउनà¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-undelete' => 'मेटिपको भठपनि यो पृषà¥à¤ à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥ पà¥à¤¨:पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-move' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ सारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-watch' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ तपाईà¤à¤•à¥‹ अवलोकनसूचीमा थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-unwatch' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ तपाईà¤à¤•à¥‹ अवलोकनसूचीबाट हटाउनà¥à¤¹à¥‹à¤¸à¥',
-'tooltip-search' => '{{SITENAME}} मा खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-search-go' => 'यदि यो नामको पृषà¥à¤  रहेको छ भने तà¥à¤¯à¤¸à¤®à¤¾ जाने',
-'tooltip-search-fulltext' => 'यो पाठको लागि पृषà¥à¤ à¤¹à¤°à¥ खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-p-logo' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
-'tooltip-n-mainpage' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ à¤®à¤¾ जाने',
-'tooltip-n-mainpage-description' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ à¤®à¤¾ जानà¥à¤¹à¥‹à¥à¤¸à¥',
-'tooltip-n-portal' => 'आयोजनाका बारेमा , तपाईठके गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› , सामगà¥à¤°à¥€ कहाठभेटà¥à¤Ÿà¤¾à¤‰à¤¨à¥‡',
-'tooltip-n-currentevents' => 'हालैको घटनाको बारेमा पृषà¥à¤ à¤­à¥‚मि जानकारी पतà¥à¤¤à¤¾à¤²à¤—ाउनà¥à¤¹à¥‹à¤¸à¥',
-'tooltip-n-recentchanges' => 'विकिमा गरिà¤à¤•à¤¾ हालैका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥à¤•à¥‹ सूची',
-'tooltip-n-randompage' => 'जà¥à¤¨ कà¥à¤¨à¥ˆ पृषà¥à¤  खोलà¥à¤¨à¥‡',
-'tooltip-n-help' => 'पतà¥à¤¤à¤¾à¤²à¤—ाउनॠपरà¥à¤¨à¥‡ सà¥à¤¥à¤¾à¤¨',
-'tooltip-t-whatlinkshere' => 'यो सित जोड़िà¤à¤•à¤¾ सबै विकि पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ सूची',
-'tooltip-t-recentchangeslinked' => 'यस पृषà¥à¤ à¤®à¤¾ जोडिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤®à¤¾ हालैको परिवरà¥à¤¤à¤¨',
-'tooltip-feed-rss' => 'यो पृषà¥à¤ à¤•à¥‹ लागि RSS फिड',
-'tooltip-feed-atom' => 'यो पृषà¥à¤ à¤•à¥‹ लागि Atom फिड',
-'tooltip-t-contributions' => 'यस पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ योगदानहरूको सूची हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-t-emailuser' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ इमेल पठाउनà¥à¤¹à¥‹à¤¸à¥',
-'tooltip-t-upload' => 'फाइल उरà¥à¤§à¥à¤µà¤­à¤°à¤£(upload) गरà¥à¤¨à¥‡',
-'tooltip-t-specialpages' => 'सबै विशेष पृषà¥à¤ à¤¹à¤°à¥‚को सूची',
-'tooltip-t-print' => 'यो पृषà¥à¤ à¤•à¥‹ मà¥à¤¦à¥à¤°à¤£ योगà¥à¤¯ संसà¥à¤•à¤°à¤£',
-'tooltip-t-permalink' => 'पृषà¥à¤ à¤•à¥‹ यो पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤•à¥‹ लागि सà¥à¤¥à¤¾à¤ˆ लिङà¥à¤•',
-'tooltip-ca-nstab-main' => 'सामगà¥à¤°à¥€ पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸',
-'tooltip-ca-nstab-user' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-media' => 'मिडिया पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-special' => 'यो विशेष पृषà¥à¤  हो , तपाईà¤à¤²à¥‡ आफै समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨',
-'tooltip-ca-nstab-project' => 'आयोजान पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-image' => 'फाइल पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-mediawiki' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ सनà¥à¤¦à¥‡à¤¶ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-template' => 'टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ(नमूना) हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-help' => 'सहायता पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-ca-nstab-category' => 'शà¥à¤°à¥‡à¤£à¥€ पृषà¥à¤  हेरà¥à¤¨à¥‡',
-'tooltip-minoredit' => 'यसलाई सामानà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‹ रà¥à¤ªà¤®à¤¾ चिनो लगाउने',
-'tooltip-save' => 'तपाईà¤à¤²à¥‡ गरेका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚ संगà¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-preview' => 'तपाईà¤à¤•à¥‹ परिवरà¥à¤¤à¤¨à¤•à¥‹ पूरà¥à¤µà¤°à¥‚प , कृपया संगà¥à¤°à¤¹ गरà¥à¤¨à¥ अघि यो पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤²à¤¾ !',
-'tooltip-diff' => 'तपाईà¤à¤²à¥‡ पाठमा के के परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹ भनेर देखाउने',
-'tooltip-compareselectedversions' => 'यस पृषà¥à¤ à¤•à¥‹ छानिà¤à¤•à¤¾ दà¥à¤ˆ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ बीच फरक हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-watch' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ तपाईà¤à¤•à¥‹ अवलोकनसूचीमा थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-recreate' => 'मेटिà¤à¤•à¥‹ भठता पनि यो पृषà¥à¤Ÿ पà¥à¤¨:निरà¥à¤®à¤¾à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
-'tooltip-upload' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£(upload) सà¥à¤°à¥à¤—रà¥à¤¨à¥‡',
-'tooltip-rollback' => '"पूरà¥à¤µà¤°à¥à¤ª" ले यो पृषà¥à¤ à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨(हरà¥) खारेज गरी पृषà¥à¤ à¤²à¤¾à¤ˆ पछिलà¥à¤²à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¤¾ à¤à¤• कà¥à¤²à¤¿à¤•à¤®à¤¾ पà¥à¤°à¥â€à¤¯à¤¾à¤‡ दिनà¥à¤›',
-'tooltip-undo' => '"रदà¥à¤¦"ले पछिलà¥à¤²à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ खारेज गरी पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨à¤®à¤¾ देखाउà¤à¤› ।
+'tooltip-ca-addsection' => 'नयाठखणà¥à¤¡ सà¥à¤°à¥ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-viewsource' => 'यो पृषà¥à¤  सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•à¥‹ छ। यसको शà¥à¤°à¥‹à¤¤ हेरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤',
+'tooltip-ca-history' => 'यस पृषà¥à¤ à¤•à¥‹ पहिलेका पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¹à¤°à¥',
+'tooltip-ca-protect' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ संरकà¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-unprotect' => 'यस पृषà¥à¤ à¤•à¥‹ सà¥à¤°à¤•à¥à¤·à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡',
+'tooltip-ca-delete' => 'यो पृषà¥à¤  मेटाउनà¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-undelete' => 'मेटिपको भठपनि यो पृषà¥à¤ à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥ पà¥à¤¨:पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-move' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ सारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-watch' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ तपाईà¤à¤•à¥‹ अवलोकनसूचीमा थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-unwatch' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ तपाईà¤à¤•à¥‹ अवलोकनसूचीबाट हटाउनà¥à¤¹à¥‹à¤¸à¥',
+'tooltip-search' => '{{SITENAME}} मा खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-search-go' => 'यदि यो नामको पृषà¥à¤  रहेको छ भने तà¥à¤¯à¤¸à¤®à¤¾ जाने',
+'tooltip-search-fulltext' => 'यो पाठको लागि पृषà¥à¤ à¤¹à¤°à¥ खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-p-logo' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
+'tooltip-n-mainpage' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ à¤®à¤¾ जाने',
+'tooltip-n-mainpage-description' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ à¤®à¤¾ जानà¥à¤¹à¥‹à¥à¤¸à¥',
+'tooltip-n-portal' => 'आयोजनाका बारेमा , तपाईठके गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› , सामगà¥à¤°à¥€ कहाठभेटà¥à¤Ÿà¤¾à¤‰à¤¨à¥‡',
+'tooltip-n-currentevents' => 'हालैको घटनाको बारेमा पृषà¥à¤ à¤­à¥‚मि जानकारी पतà¥à¤¤à¤¾à¤²à¤—ाउनà¥à¤¹à¥‹à¤¸à¥',
+'tooltip-n-recentchanges' => 'विकिमा गरिà¤à¤•à¤¾ हालैका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥à¤•à¥‹ सूची',
+'tooltip-n-randompage' => 'जà¥à¤¨ कà¥à¤¨à¥ˆ पृषà¥à¤  खोलà¥à¤¨à¥‡',
+'tooltip-n-help' => 'पतà¥à¤¤à¤¾à¤²à¤—ाउनॠपरà¥à¤¨à¥‡ सà¥à¤¥à¤¾à¤¨',
+'tooltip-t-whatlinkshere' => 'यो सित जोड़िà¤à¤•à¤¾ सबै विकि पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ सूची',
+'tooltip-t-recentchangeslinked' => 'यस पृषà¥à¤ à¤®à¤¾ जोडिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤®à¤¾ हालैको परिवरà¥à¤¤à¤¨',
+'tooltip-feed-rss' => 'यो पृषà¥à¤ à¤•à¥‹ लागि RSS फिड',
+'tooltip-feed-atom' => 'यो पृषà¥à¤ à¤•à¥‹ लागि Atom फिड',
+'tooltip-t-contributions' => 'यस पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¤¾ योगदानहरूको सूची हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-t-emailuser' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤²à¤¾à¤ˆ इमेल पठाउनà¥à¤¹à¥‹à¤¸à¥',
+'tooltip-t-upload' => 'फाइल उरà¥à¤§à¥à¤µà¤­à¤°à¤£(upload) गरà¥à¤¨à¥‡',
+'tooltip-t-specialpages' => 'सबै विशेष पृषà¥à¤ à¤¹à¤°à¥‚को सूची',
+'tooltip-t-print' => 'यो पृषà¥à¤ à¤•à¥‹ मà¥à¤¦à¥à¤°à¤£ योगà¥à¤¯ संसà¥à¤•à¤°à¤£',
+'tooltip-t-permalink' => 'पृषà¥à¤ à¤•à¥‹ यो पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨à¤•à¥‹ लागि सà¥à¤¥à¤¾à¤ˆ लिङà¥à¤•',
+'tooltip-ca-nstab-main' => 'सामगà¥à¤°à¥€ पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸',
+'tooltip-ca-nstab-user' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-media' => 'मिडिया पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-special' => 'यो विशेष पृषà¥à¤  हो , तपाईà¤à¤²à¥‡ आफै समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨',
+'tooltip-ca-nstab-project' => 'आयोजान पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-image' => 'फाइल पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-mediawiki' => 'पà¥à¤°à¤£à¤¾à¤²à¥€ सनà¥à¤¦à¥‡à¤¶ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-template' => 'टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ(नमूना) हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-help' => 'सहायता पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-ca-nstab-category' => 'शà¥à¤°à¥‡à¤£à¥€ पृषà¥à¤  हेरà¥à¤¨à¥‡',
+'tooltip-minoredit' => 'यसलाई सामानà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‹ रà¥à¤ªà¤®à¤¾ चिनो लगाउने',
+'tooltip-save' => 'तपाईà¤à¤²à¥‡ गरेका परिवरà¥à¤¤à¤¨à¤¹à¤°à¥‚ संगà¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-preview' => 'तपाईà¤à¤•à¥‹ परिवरà¥à¤¤à¤¨à¤•à¥‹ पूरà¥à¤µà¤°à¥‚प , कृपया संगà¥à¤°à¤¹ गरà¥à¤¨à¥ अघि यो पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤²à¤¾ !',
+'tooltip-diff' => 'तपाईà¤à¤²à¥‡ पाठमा के के परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤­à¤¯à¥‹ भनेर देखाउने',
+'tooltip-compareselectedversions' => 'यस पृषà¥à¤ à¤•à¥‹ छानिà¤à¤•à¤¾ दà¥à¤ˆ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ बीच फरक हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-watch' => 'यो पृषà¥à¤ à¤²à¤¾à¤ˆ तपाईà¤à¤•à¥‹ अवलोकनसूचीमा थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-watchlistedit-normal-submit' => 'शीरà¥à¤·à¤•à¤¹à¤°à¥‚ हटाउने',
+'tooltip-watchlistedit-raw-submit' => 'निगरानी सूची अधà¥à¤¯à¤¾à¤µà¤§à¤¿ गरà¥à¤¨à¥‡',
+'tooltip-recreate' => 'मेटिà¤à¤•à¥‹ भठता पनि यो पृषà¥à¤Ÿ पà¥à¤¨:निरà¥à¤®à¤¾à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
+'tooltip-upload' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£(upload) सà¥à¤°à¥à¤—रà¥à¤¨à¥‡',
+'tooltip-rollback' => '"पूरà¥à¤µà¤°à¥à¤ª" ले यो पृषà¥à¤ à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨(हरà¥) खारेज गरी पृषà¥à¤ à¤²à¤¾à¤ˆ पछिलà¥à¤²à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¤¾ à¤à¤• कà¥à¤²à¤¿à¤•à¤®à¤¾ पà¥à¤°à¥â€à¤¯à¤¾à¤‡ दिनà¥à¤›',
+'tooltip-undo' => '"रदà¥à¤¦"ले पछिलà¥à¤²à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ खारेज गरी पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨à¤®à¤¾ देखाउà¤à¤› ।
यसले सारांशमा कारण राखà¥à¤¨ दिनेछ।',
-'tooltip-preferences-save' => 'अभिरà¥à¤šà¤¿à¤¹à¤°à¥ संगà¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
-'tooltip-summary' => 'छोटो सारांश हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-preferences-save' => 'अभिरà¥à¤šà¤¿à¤¹à¤°à¥ संगà¥à¤°à¤¹ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'tooltip-summary' => 'छोटो सारांश हालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
# Stylesheets
'common.css' => '/* यहाठराखिà¤à¤•à¤¾ CSS सबै खोलहरà¥à¤®à¤¾ लागॠहà¥à¤¨à¥‡à¤›à¤¨à¥ */',
@@ -2579,9 +2585,6 @@ $1को बनà¥à¤¦à¥‡à¤œà¤•à¥‹ कारण : "$2" हो',
# Patrol log
'patrol-log-page' => 'निगरानीको लग',
'patrol-log-header' => 'गसà¥à¤¤à¥€ गरिà¤à¤•à¤¾ संसà¥à¤•à¤°à¤£à¤¹à¤°à¥à¤•à¥‹ लग यस पà¥à¤°à¤•à¤¾à¤° रहेका छनॠ।',
-'patrol-log-line' => ' $2को $1 लाई गसà¥à¤¤à¥€ $3 भनी चिनो लगाइयो \\',
-'patrol-log-auto' => '(सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤)',
-'patrol-log-diff' => 'पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ $1',
'log-show-hide-patrol' => '$1 निगरानी लग',
# Image deletion
@@ -2600,24 +2603,26 @@ $1',
'nextdiff' => 'नयाठसमà¥à¤ªà¤¾à¤¦à¤¨ →',
# Media information
-'mediawarning' => "'''चेतावनी''': यो फाइलमा घातक कोडहरॠपनि हà¥à¤¨à¤¸à¤•à¥à¤›à¤¨
+'mediawarning' => "'''चेतावनी''': यो फाइलमा घातक कोडहरॠपनि हà¥à¤¨à¤¸à¤•à¥à¤›à¤¨
यसलाई सञà¥à¤šà¤¾à¤²à¤¨ गरेर तपाईको पà¥à¤°à¤£à¤¾à¤²à¥€à¤®à¤¾ नियनà¥à¤¤à¥à¤°à¤£ गरिन सकà¥à¤› ।",
-'imagemaxsize' => "तसà¥à¤µà¤¿à¤° आकार सिमा:<br />''(फाइल जानकारी पृषà¥à¤ à¤•à¥‹ लागि )''",
-'thumbsize' => 'थमà¥à¤¬à¤¨à¥‡à¤² आकार:',
-'widthheight' => '$1 × $2',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}',
-'file-info' => 'फाइल आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2',
-'file-info-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4',
-'file-info-size-pages' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4, $5 {{PLURAL:$5|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}',
-'file-nohires' => '<small>उचà¥à¤š रिजोलà¥à¤¯à¥à¤¶à¤¨ अनà¥à¤ªà¤²à¤¬à¥à¤§</small>',
-'svg-long-desc' => 'SVG फाइल,साधारण $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3',
-'show-big-image' => 'पूरा रिजोलà¥à¤¯à¥à¤¶à¤¨',
-'show-big-image-size' => '$1 × $2 पिकà¥à¤¸à¤²',
-'file-info-gif-looped' => 'चकृय गरिà¤à¤•à¥‹',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®|फà¥à¤°à¥‡à¤®à¤¹à¤°à¥}}',
-'file-info-png-looped' => 'ग़ाà¤à¤ à¥‹ परेको',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|पलà¥à¤Ÿ|पलà¥à¤Ÿ}} खेलियो',
-'file-info-png-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®|फà¥à¤°à¥‡à¤®à¤¹à¤°à¥}}',
+'imagemaxsize' => "तसà¥à¤µà¤¿à¤° आकार सिमा:<br />''(फाइल जानकारी पृषà¥à¤ à¤•à¥‹ लागि )''",
+'thumbsize' => 'थमà¥à¤¬à¤¨à¥‡à¤² आकार:',
+'widthheight' => '$1 × $2',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}',
+'file-info' => 'फाइल आकार: $1, MIME पà¥à¤°à¤•à¤¾à¤°: $2',
+'file-info-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4',
+'file-info-size-pages' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3, MIME पà¥à¤°à¤•à¤¾à¤°: $4, $5 {{PLURAL:$5|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}',
+'file-nohires' => 'उचà¥à¤š रिजोलà¥à¤¯à¥à¤¶à¤¨ अनà¥à¤ªà¤²à¤¬à¥à¤§',
+'svg-long-desc' => 'SVG फाइल,साधारण $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¹à¤°à¥, फाइल आकार: $3',
+'show-big-image' => 'पूरा रिजोलà¥à¤¯à¥à¤¶à¤¨',
+'show-big-image-preview' => 'यस पूरà¥à¤µ रà¥à¤ªà¤•à¥‹ आकार: $1.',
+'show-big-image-other' => 'अरॠरिजोलà¥à¤¯à¥à¤¶à¤¨à¤¹à¤°à¥: $1।',
+'show-big-image-size' => '$1 × $2 पिकà¥à¤¸à¤²',
+'file-info-gif-looped' => 'चकृय गरिà¤à¤•à¥‹',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®|फà¥à¤°à¥‡à¤®à¤¹à¤°à¥}}',
+'file-info-png-looped' => 'ग़ाà¤à¤ à¥‹ परेको',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|पलà¥à¤Ÿ|पलà¥à¤Ÿ}} खेलियो',
+'file-info-png-frames' => '$1 {{PLURAL:$1|फà¥à¤°à¥‡à¤®|फà¥à¤°à¥‡à¤®à¤¹à¤°à¥}}',
# Special:NewFiles
'newimages' => 'नयाठफाइलहरà¥à¤•à¥‹ गà¥à¤¯à¤¾à¤²à¤°à¥€',
@@ -2632,7 +2637,16 @@ $1',
'sp-newimages-showfrom' => '$2 $1 देखिका फाइलहरू देखाउने',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2 × $3',
+'video-dims' => '$1, $2 × $3',
+'seconds-abbrev' => '$1 सेकेनà¥à¤¡',
+'minutes-abbrev' => '$1 मिनेट',
+'hours-abbrev' => '$1 घणà¥à¤Ÿà¤¾',
+'days-abbrev' => '$1 दिन',
+'seconds' => '{{PLURAL:$1|$1 सेकेनà¥à¤¡|$1 सेकेनà¥à¤¡à¤¹à¤°à¥}}',
+'minutes' => '{{PLURAL:$1|$1 मिनेट|$1 मिनेटहरà¥}}',
+'hours' => '{{PLURAL:$1|$1 घणà¥à¤Ÿà¤¾|$1 घणà¥à¤Ÿà¤¾à¤¹à¤°à¥}}',
+'days' => '{{PLURAL:$1|$1 दिन|$1 दिनहरà¥}}',
+'ago' => '$1 पहिले',
# Bad image list
'bad_image_list' => '(* बाट शà¥à¤°à¥ हà¥à¤¨à¥‡ पंकà¥à¤¤à¤¿)को विषय सूची मातà¥à¤° मानà¥à¤¯ छ। पंकà¥à¤¤à¤¿à¤•à¥‹ पहिलो लिङà¥à¤• नरामà¥à¤°à¥‹ फाइलसित लिङà¥à¤• हà¥à¤¨à¥ˆà¤ªà¤°à¥à¤› । à¤à¤‰à¤Ÿà¥ˆ पंकà¥à¤¤à¤¿à¤®à¤¾ कà¥à¤¨à¥ˆ पछिबाट हà¥à¤¨à¥‡ लिंकलाई अपवाद मानिनेछ अरà¥à¤¥à¤¾à¤¤à¥ जà¥à¤¨ पृषà¥à¤ à¤®à¤¾ फाइल इन-लाइन हà¥à¤¨à¤¸à¤•à¥à¤›à¥¤',
@@ -3119,15 +3133,6 @@ $5
'scarytranscludefailed' => '[ $1को लागि टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ लà¥à¤¯à¤¾à¤‰à¤¨ असफल]',
'scarytranscludetoolong' => '[URL अति लामो छ ]',
-# Trackbacks
-'trackbackbox' => 'यस पृषà¥à¤ à¤•à¥‹ लागि टà¥à¤°à¥à¤¯à¤¾à¤•à¤¬à¥à¤¯à¤¾à¤•:<br />
-$1',
-'trackback' => '; $4 $5: [$2 $1]',
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥])',
-'trackbacklink' => 'टà¥à¤°à¥à¤¯à¤¾à¤• बà¥à¤¯à¤¾à¤•',
-'trackbackdeleteok' => 'टà¥à¤°à¤¾à¤•à¤¬à¥à¤¯à¤¾à¤• सफलतापूरà¥à¤µà¤• हटाइयो।',
-
# Delete conflict
'deletedwhileediting' => "'''चेतावनी''': तपाईंले समà¥à¤ªà¤¾à¤¦à¤¨ सà¥à¤°à¥ गरेपछि यो पृषà¥à¤  मेटिà¤à¤•à¥‹à¤›!",
'confirmrecreate' => "पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ [[User:$1|$1]] ([[User talk:$1|वारà¥à¤¤à¤¾à¤²à¤¾à¤ª]])ले तपाईंले समà¥à¤ªà¤¾à¤¦à¤¨ सà¥à¤°à¥ गरेपछि यो पृषà¥à¤  मेटेकाछनॠ। कारण थियो:
@@ -3281,6 +3286,7 @@ $1',
'hebrew-calendar-m12-gen' => 'à¤à¤²à¤²à¥',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]]',
'timezone-utc' => 'यà¥à¤Ÿà¤¿à¤¸à¥€(UTC)',
# Core parser functions
@@ -3380,13 +3386,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|परिवरà¥à¤¤à¤¨|परिवरà¥à¤¤à¤¨à¤¹à¤°à¥}}',
# Special:ComparePages
-'comparepages' => 'पृषà¥à¤ à¤¹à¤°à¥ दाजà¥à¤¨à¥‡',
-'compare-selector' => 'पृषà¥à¤  संसà¥à¤•à¤°à¤£à¤¹à¤°à¥ दाजà¥à¤¨à¥‡',
-'compare-page1' => 'पृषà¥à¤  1',
-'compare-page2' => 'पृषà¥à¤  2',
-'compare-rev1' => 'संशोधन 1',
-'compare-rev2' => 'संशोधन 2',
-'compare-submit' => 'दà¤à¤œà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'comparepages' => 'पृषà¥à¤ à¤¹à¤°à¥ दाजà¥à¤¨à¥‡',
+'compare-selector' => 'पृषà¥à¤  संसà¥à¤•à¤°à¤£à¤¹à¤°à¥ दाजà¥à¤¨à¥‡',
+'compare-page1' => 'पृषà¥à¤  1',
+'compare-page2' => 'पृषà¥à¤  2',
+'compare-rev1' => 'संशोधन 1',
+'compare-rev2' => 'संशोधन 2',
+'compare-submit' => 'दà¤à¤œà¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'compare-invalid-title' => 'तपाईले खà¥à¤²à¤¾à¤‰à¤¨à¥ भà¤à¤•à¥‹ शिरà¥à¤·à¤• अमानà¥à¤¯ छ।',
+'compare-title-not-exists' => 'तपाईले खà¥à¤²à¤¾à¤‰à¤¨à¥ भà¤à¤•à¥‹ शिरà¥à¤·à¤• उपलबà¥à¤§ छैन ।',
+'compare-revision-not-exists' => 'तपाईले खà¥à¤²à¤¾à¤‰à¤¨à¥ भà¤à¤•à¥‹ संसà¥à¤•à¤°à¤£ उपलबà¥à¤§ छैन ।',
# Database error messages
'dberr-header' => 'यो विकिमा समसà¥à¤¯à¤¾ छ',
@@ -3414,4 +3423,40 @@ $1',
'sqlite-has-fts' => '$1 पूरा पाठ खोज समरà¥à¤¥à¤¨ सहित',
'sqlite-no-fts' => '$1 पूरा पाठ खोज समरà¥à¤¥à¤¨ बिना',
+# New logging system
+'revdelete-restricted' => 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¤¹à¤°à¥à¤®à¤¾à¤¥à¤¿ सीमितता लागू गरियो',
+'revdelete-unrestricted' => 'पà¥à¤°à¤µà¤¨à¥à¤§à¤•à¤•à¥‹à¤²à¤¾à¤—ि निषेधहरॠहटाइयो ।',
+'newuserlog-byemail' => 'इ मेलबाट पठाइà¤à¤•à¥‹ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦',
+
+# API errors
+'api-error-badaccess-groups' => 'यस विकिमा तपाईंलाई फाइल अपलोड गरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ छैन।',
+'api-error-copyuploaddisabled' => 'यस सरà¥à¤µà¤°à¤®à¤¾ URL दà¥à¤µà¤¾à¤°à¤¾ अपलोड गरà¥à¤¨à¥‡ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ निसà¥à¤•à¥à¤°à¤¿à¤¯ गरिà¤à¤•à¥‹à¤›à¥¤',
+'api-error-duplicate' => 'यस साइटमा पहिलेबाट यसà¥à¤¤à¥ˆ सामगà¥à¤°à¥€ {{PLURAL:$1|भà¤à¤•à¥‹ [$2 अरà¥à¤•à¥‹ फाइल छ]|भà¤à¤•à¤¾ [$2 केहि अरॠफाइलहरॠछनà¥]}} ।',
+'api-error-duplicate-archive' => 'यस साइटमा पहिलेबाट यसà¥à¤¤à¥ˆ सामगà¥à¤°à¥€ {{PLURAL:$1|भà¤à¤•à¥‹ [$2 अरà¥à¤•à¥‹ फाइल थियो]|भà¤à¤•à¤¾ [$2 केहि अरॠफाइलहरॠथिà¤]}} ।
+तर {{PLURAL:$1|यो मेटाइà¤à¤•à¥‹ थियो|यी मेटाइà¤à¤•à¤¾ थिà¤}} ।',
+'api-error-duplicate-archive-popup-title' => 'पहिले {{PLURAL:$1|मेटाइà¤à¤•à¥‹ फाइलको|मेटाइà¤à¤•à¤¾ फाइलहरà¥à¤•à¥‹}} नकल पà¥à¤°à¤¤à¤¿ बनाउने।',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|फाइल|फाइलहरà¥}} नकल पà¥à¤°à¤¤à¤¿ बनाउने',
+'api-error-empty-file' => 'तपाईंले बà¥à¤à¤¾à¤à¤•à¥‹ फाइल खालि छ।',
+'api-error-file-too-large' => 'तपाईंले बà¥à¤à¤¾à¤à¤•à¥‹ फाइल अति ठूलो छ।',
+'api-error-filename-tooshort' => 'फाइलको नाम अति छोटो भयो।',
+'api-error-filetype-banned' => 'यस पà¥à¤°à¤•à¤¾à¤°à¤•à¥‹ फाइलमाथि पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ छ।',
+'api-error-filetype-missing' => 'फाइलमा à¤à¤•à¥à¤¸à¥à¤Ÿà¥‡à¤¨à¥à¤¶à¤¨à¤•à¥‹ अभाव छ।',
+'api-error-hookaborted' => 'à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤¨à¥à¤¶à¤¨ हà¥à¤•à¤²à¥‡ गरà¥à¤¦à¤¾ यस फाइललाई नयाठरà¥à¤ª दिने कà¥à¤°à¤¿à¤¯à¤¾ रदà¥à¤¦ भयो।',
+'api-error-http' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: सरà¥à¤µà¤°à¤¸à¤¿à¤¤ जोड़न असमरà¥à¤¥',
+'api-error-illegal-filename' => 'यसà¥à¤¤à¥‹ फाइल नामको अनà¥à¤®à¤¤à¤¿ छैन।',
+'api-error-invalid-file-key' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: असà¥à¤¥à¤¾à¤ˆ भणà¥à¤¡à¤¾à¤°à¤®à¤¾ फाइल पाइà¤à¤¨à¥¤',
+'api-error-missingparam' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: अनà¥à¤°à¥‹à¤§à¤®à¤¾ पैरामीटरहरà¥à¤•à¥‹ कमी',
+'api-error-missingresult' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: कपी सफल भयो भà¤à¤¨ भनेर निशà¥à¤šà¤¯ गरà¥à¤¨à¥‡ सकिà¤à¤¨à¥¤',
+'api-error-mustbeloggedin' => 'फाइल अपलोड गरà¥à¤¨ तपाईंले पà¥à¤°à¤µà¥‡à¤¶ गरेको हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
+'api-error-mustbeposted' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: अनà¥à¤°à¥‹à¤§à¤•à¥‹ निमà¥à¤¤à¤¿ HTTP POST को आवशà¥à¤¯à¤•à¤¤à¤¾',
+'api-error-noimageinfo' => 'अपलोड सफल भयो, तर सरà¥à¤µà¤°à¤²à¥‡ फाइलको बारेमा कà¥à¤¨à¥ˆ सूचना दिà¤à¤¨à¥¤',
+'api-error-nomodule' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: अपलोड मोडà¥à¤² सेट नगरिà¤à¤•à¥‹à¥¤',
+'api-error-ok-but-empty' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: सरà¥à¤µà¤°à¤¬à¤¾à¤Ÿ कà¥à¤¨à¥ˆ उतà¥à¤¤à¤° आà¤à¤¨à¥¤',
+'api-error-overwrite' => 'वरà¥à¤¤à¤®à¤¾à¤¨ फाइलमाथि अधिलेखन(Overwriting)को अनà¥à¤®à¤¤à¤¿ छैन।',
+'api-error-stashfailed' => 'आनà¥à¤¤à¤°à¤¿à¤• तà¥à¤°à¥à¤Ÿà¤¿: असà¥à¤¥à¤¾à¤ˆ फाइल राखà¥à¤¨ सरà¥à¤µà¤° असफल भयो।',
+'api-error-timeout' => 'अपेकà¥à¤·à¤¿à¤¤ समय भितà¥à¤°à¤®à¤¾ सरà¥à¤µà¤°à¤²à¥‡ पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ देखाà¤à¤¨à¥¤',
+'api-error-unknown-code' => 'अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿: "$1"',
+'api-error-unknown-warning' => 'अजà¥à¤žà¤¾à¤¤ चेतावनी: $1',
+'api-error-uploaddisabled' => 'यस विकिमा अपलोड निसà¥à¤•à¥à¤°à¤¿à¤¯ गरिà¤à¤•à¥‹à¤›à¥¤',
+
);
diff --git a/languages/messages/MessagesNew.php b/languages/messages/MessagesNew.php
index 91cc8c0e..4adffe49 100644
--- a/languages/messages/MessagesNew.php
+++ b/languages/messages/MessagesNew.php
@@ -363,9 +363,6 @@ MySQL नं इरर "<tt>$3: $4</tt>" कà¥à¤¯à¤‚गॠदà¥à¥¤',
# Special:Categories
'categories' => 'पà¥à¤šà¤ƒà¤¤',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'नà¥à¤¹à¥à¤®à¥à¤¹ छà¥à¤¯à¥‡à¤²à¥‡à¤®à¤¿',
-
# Restrictions (nouns)
'restriction-edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
diff --git a/languages/messages/MessagesNiu.php b/languages/messages/MessagesNiu.php
index dae02593..3c14a805 100644
--- a/languages/messages/MessagesNiu.php
+++ b/languages/messages/MessagesNiu.php
@@ -115,14 +115,13 @@ Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
'passwordreset-username' => 'Matahigoa he tagata',
# Edit pages
-'summary' => 'Fakakatoakatoa:',
-'minoredit' => 'Ko e fakahakohako fakatote',
-'watchthis' => 'Onoono e lau e',
-'savearticle' => 'Taofi e lau',
-'showpreview' => 'Fakakite e foliga',
-'showdiff' => 'Fakakite e tau hikihiki',
-'whitelistedittitle' => 'Kua lata ke loko ini ke fakahakohako',
-'loginreqlink' => 'hu ki loto',
+'summary' => 'Fakakatoakatoa:',
+'minoredit' => 'Ko e fakahakohako fakatote',
+'watchthis' => 'Onoono e lau e',
+'savearticle' => 'Taofi e lau',
+'showpreview' => 'Fakakite e foliga',
+'showdiff' => 'Fakakite e tau hikihiki',
+'loginreqlink' => 'hu ki loto',
# History pages
'currentrev' => 'Kitekiteaga mogonei',
@@ -214,7 +213,6 @@ Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
'movenologin' => 'Ai la hu ki loto',
'move-watch' => 'Onoono e lau e',
'movedto' => 'kua une ke he',
-'1movedto2' => '[[$1]] kua une ke he [[$2]]',
'movereason' => 'Kakano:',
# Namespace 8 related
diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php
index 604b3ea6..1b0332cf 100644
--- a/languages/messages/MessagesNl.php
+++ b/languages/messages/MessagesNl.php
@@ -8,6 +8,7 @@
* @file
*
* @author Annabel
+ * @author B4bol4t
* @author DasRakel
* @author Effeietsanders
* @author Erwin
@@ -30,9 +31,11 @@
* @author Paul B
* @author Romaine
* @author SPQRobin
+ * @author Saruman
* @author Servien
* @author Siebrand
* @author Slomox
+ * @author TBloemink
* @author Tedjuh10
* @author Tjcool007
* @author Troefkaart
@@ -90,145 +93,150 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#DOORVERWIJZING', '#REDIRECT' ),
- 'notoc' => array( '0', '__GEENINHOUD__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INHOUD__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__GEENKOP__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'HUIDIGJAAR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HUIDIGETIJD', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HUIDIGUUR', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
- 'localhour' => array( '1', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'PAGINANAAM', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAAMRUIMTE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NAAMRUIMTEE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'OVERLEGRUIMTE', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ONDERWERPPAGINANAAM', 'ARTIKELPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ONDERWERPPAGINANAAME', 'ARTIKELPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'BERICHT:', 'MSG:' ),
- 'subst' => array( '0', 'VERV:', 'SUBST:' ),
- 'safesubst' => array( '0', 'VEILIGVERV:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'BERICHTNW', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'miniatuur', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniatuur=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'rechts', 'right' ),
- 'img_left' => array( '1', 'links', 'left' ),
- 'img_none' => array( '1', 'geen', 'none' ),
- 'img_center' => array( '1', 'gecentreerd', 'center', 'centre' ),
- 'img_framed' => array( '1', 'omkaderd', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'kaderloos', 'frameless' ),
- 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'rand', 'border' ),
- 'img_baseline' => array( '1', 'grondlijn', 'baseline' ),
- 'img_top' => array( '1', 'boven', 'top' ),
- 'img_text_top' => array( '1', 'tekst-boven', 'text-top' ),
- 'img_middle' => array( '1', 'midden', 'middle' ),
- 'img_bottom' => array( '1', 'beneden', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekst-beneden', 'text-bottom' ),
- 'img_link' => array( '1', 'verwijzing=$1', 'link=$1' ),
- 'sitename' => array( '1', 'SITENAAM', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'ARTIKELPAD', 'ARTICLEPATH' ),
- 'servername' => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'STIJLPAD', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMMATICA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GESLACHT:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__GEENPAGINANAAMCONVERSIE__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'HUIDIGEDVDW', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'PLAATSELIJKEDVDW', 'LOKALEDVDW', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'VERSIEID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'VERSIEDAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'VERSIEDAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'VERSIEMAAND', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'VERSIEMAAND1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'VERSIEJAAR', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
- 'plural' => array( '0', 'MEERVOUD:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'VOLLEDIGEURL', 'FULLURL:' ),
- 'fullurle' => array( '0', 'VOLLEDIGEURLE', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KL:', 'LC:' ),
- 'uc' => array( '0', 'HL:', 'UC:' ),
- 'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
- 'displaytitle' => array( '1', 'TOONTITEL', 'TITELTONEN', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'V', 'R' ),
- 'newsectionlink' => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#TAAL:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
- 'padleft' => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
- 'padright' => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
- 'special' => array( '0', 'speciaal', 'special' ),
- 'defaultsort' => array( '1', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'BESTANDSPAD:', 'FILEPATH:' ),
- 'tag' => array( '0', 'label', 'tag' ),
- 'hiddencat' => array( '1', '__VERBORGENCAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
- 'noindex' => array( '1', '__GEENINDEX__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'datumopmaak', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'PAD', 'PATH' ),
- 'url_query' => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
+ 'redirect' => array( '0', '#DOORVERWIJZING', '#REDIRECT' ),
+ 'notoc' => array( '0', '__GEENINHOUD__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INHOUD__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__GEENKOP__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'HUIDIGEDAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'HUIDIGJAAR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HUIDIGETIJD', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HUIDIGUUR', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALEMAAND1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AANTALACTIEVEGEBRUIKERS', 'ACTIEVEGEBRUIKERS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'AANTALKERENBEKEKEN', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'PAGINANAAM', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAAMRUIMTE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'OVERLEGRUIMTE', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ONDERWERPRUIMTEE', 'ARTIKELRUIMTEE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'VOLLEDIGEPAGINANAAM', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'OVERLEGPAGINANAAME', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ONDERWERPPAGINANAAM', 'ARTIKELPAGINANAAM', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ONDERWERPPAGINANAAME', 'ARTIKELPAGINANAAME', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'BERICHT:', 'MSG:' ),
+ 'subst' => array( '0', 'VERV:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'VEILIGVERV:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'BERICHTNW', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'miniatuur', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatuur=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'rechts', 'right' ),
+ 'img_left' => array( '1', 'links', 'left' ),
+ 'img_none' => array( '1', 'geen', 'none' ),
+ 'img_center' => array( '1', 'gecentreerd', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'omkaderd', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'kaderloos', 'frameless' ),
+ 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'rechtop', 'rechtop=$1', 'rechtop$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'rand', 'border' ),
+ 'img_baseline' => array( '1', 'grondlijn', 'baseline' ),
+ 'img_top' => array( '1', 'boven', 'top' ),
+ 'img_text_top' => array( '1', 'tekst-boven', 'text-top' ),
+ 'img_middle' => array( '1', 'midden', 'middle' ),
+ 'img_bottom' => array( '1', 'beneden', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tekst-beneden', 'text-bottom' ),
+ 'img_link' => array( '1', 'verwijzing=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'SITENAAM', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ARTIKELPAD', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'PAGINAID', 'PAGEID' ),
+ 'servername' => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'STIJLPAD', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMMATICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GESLACHT:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__GEENPAGINANAAMCONVERSIE__', '__GEENTITELCONVERSIE__', '__GEENTC__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__GEENINHOUDCONVERSIE__', '__GEENIC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'HUIDIGEWEEK', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'HUIDIGEDVDW', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'PLAATSELIJKEWEEK', 'LOKALEWEEK', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'PLAATSELIJKEDVDW', 'LOKALEDVDW', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'VERSIEID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'VERSIEDAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'VERSIEDAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'VERSIEMAAND', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'VERSIEMAAND1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'VERSIEJAAR', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'MEERVOUD:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'VOLLEDIGEURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'VOLLEDIGEURLE:', 'FULLURLE:' ),
+ 'canonicalurl' => array( '0', 'CANOIEKEURL:', 'CANONICALURL:' ),
+ 'canonicalurle' => array( '0', 'CANONIEKEURLE:', 'CANONICALURLE:' ),
+ 'lcfirst' => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KL:', 'LC:' ),
+ 'uc' => array( '0', 'HL:', 'UC:' ),
+ 'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'V', 'R' ),
+ 'newsectionlink' => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'HUIDIGETIJDSTEMPEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'PLAATSELIJKETIJDSTEMPEL', 'LOKALETIJDSTEMPEL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'RICHTINGMARKERING', 'RICHTINGSMARKERING', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#TAAL:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'INHOUDSTAAL', 'INHOUDTAAL', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAGINASINNAAMRUIMTE', 'PAGINA’SINNAAMRUIMTE', 'PAGINA\'SINNAAMRUIMTE', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'AANTALBEHEERDERS', 'AANTALADMINS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATTEERNUM', 'NUMFORMATTEREN', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
+ 'padright' => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
+ 'special' => array( '0', 'speciaal', 'special' ),
+ 'defaultsort' => array( '1', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'BESTANDSPAD:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'label', 'tag' ),
+ 'hiddencat' => array( '1', '__VERBORGENCAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGINASINCATEGORIE', 'PAGINASINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PAGINAGROOTTE', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__GEENINDEX__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'AANTALINGROEP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STATISCHEDOORVERWIJZING__', '__STATISCHEREDIRECT__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'BEVEILIGINGSNIVEAU', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'datumopmaak', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'PAD', 'PATH' ),
+ 'url_query' => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', 'geenfout', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', 'nietvervangen', 'noreplace' ),
);
$specialPageAliases = array(
@@ -236,6 +244,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'AlleBerichten', 'Systeemberichten' ),
'Allpages' => array( 'AllePaginas', 'AllePagina’s', 'AllePagina\'s' ),
'Ancientpages' => array( 'OudstePaginas', 'OudstePagina’s', 'OudstePagina\'s' ),
+ 'Badtitle' => array( 'OnjuistePaginanaam' ),
'Blankpage' => array( 'LegePagina' ),
'Block' => array( 'Blokkeren', 'IPblokkeren', 'BlokkeerIP', 'BlokkeerIp' ),
'Blockme' => array( 'BlokkeerMij', 'MijBlokkeren' ),
@@ -693,18 +702,19 @@ Maak hiervan melding bij een [[Special:ListUsers/sysop|beheerder]] van {{SITENAM
'badarticleerror' => 'Deze handeling kan niet op deze pagina worden uitgevoerd.',
'cannotdelete' => 'De pagina of het bestand "$1" kon niet verwijderd worden.
Mogelijk is deze al door iemand anders verwijderd.',
+'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
'badtitle' => 'Ongeldige paginanaam',
'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikinaamverwijzing.
Wellicht bevat de paginanaam niet toegestane karakters.',
-'perfcached' => 'De gegevens komen uit een cache en zijn mogelijk niet actueel.',
-'perfcachedts' => 'De gegevens komen uit een cache en zijn voor het laatst bijgewerkt op $1.',
+'perfcached' => 'Deze gegevens komen uit een cache en zijn mogelijk niet actueel. Er {{PLURAL:$1|is maximaal één resultaat|zijn maximaal $1 resultaten}} beschikbaar in de cache.',
+'perfcachedts' => 'Deze gegevens komen uit een cache die voor het laatst is bijgewerkt op $2 om $3. Er {{PLURAL:$4|is maximaal één resultaat|zijn maximaal $4 resultaten}} beschikbaar in de cache.',
'querypage-no-updates' => 'Deze pagina wordt niet bijgewerkt.
Gegevens op deze pagina worden niet ververst.',
'wrong_wfQuery_params' => 'Verkeerde parameters voor wfQuery()<br />
Functie: $1<br />
Zoekopdracht: $2',
'viewsource' => 'Brontekst bekijken',
-'viewsourcefor' => 'van $1',
+'viewsource-title' => 'Brontekst bekijken van $1',
'actionthrottled' => 'Handeling tegengehouden',
'actionthrottledtext' => 'Als maatregel tegen spam is het aantal keren per tijdseenheid dat u deze handeling kunt verrichten beperkt.
De limiet is overschreden.
@@ -712,6 +722,7 @@ Probeer het over een aantal minuten opnieuw.',
'protectedpagetext' => 'Deze pagina is beveiligd.
Bewerken is niet mogelijk.',
'viewsourcetext' => 'U kunt de brontekst van deze pagina bekijken en kopiëren:',
+'viewyourtext' => "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
'protectedinterface' => 'Deze pagina bevat tekst voor berichten van de software en is beveiligd om misbruik te voorkomen.',
'editinginterface' => "'''Waarschuwing:''' U bewerkt een pagina die interfacetekst voor de software bevat.
Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen.
@@ -826,6 +837,7 @@ U ontvangt geen e-mail voor de onderstaande functies.',
'emailconfirmlink' => 'Bevestig uw e-mailadres',
'invalidemailaddress' => 'Het e-mailadres is niet aanvaard, omdat het een ongeldige opmaak heeft.
Geef een geldig e-mailadres op of laat het veld leeg.',
+'cannotchangeemail' => 'Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.',
'accountcreated' => 'Gebruiker aangemaakt',
'accountcreatedtext' => 'De gebruiker $1 is aangemaakt.',
'createaccount-title' => 'Gebruikers registreren voor {{SITENAME}}',
@@ -843,6 +855,7 @@ Wacht even voordat u het opnieuw probeert.',
# E-mail sending
'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
+'user-mail-no-addy' => 'Geprobeerd een e-mail te verzenden zonder een e-mailadres.',
# Change password dialog
'resetpass' => 'Wachtwoord wijzigen',
@@ -865,32 +878,47 @@ Mogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aan
'resetpass-temp-password' => 'Tijdelijk wachtwoord:',
# Special:PasswordReset
-'passwordreset' => 'Wachtwoord opnieuw instellen',
-'passwordreset-text' => 'Vul dit formulier in zodat we u een e-mail kunnen sturen met uw gebruikersgegevens.',
-'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-username' => 'Gebruiker:',
-'passwordreset-domain' => 'Domein:',
-'passwordreset-email' => 'E-mailadres:',
-'passwordreset-emailtitle' => 'Gebruikersgegevens op {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 uw gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.
+'passwordreset' => 'Wachtwoord opnieuw instellen',
+'passwordreset-text' => 'Vul dit formulier in zodat we u een e-mail kunnen sturen met uw gebruikersgegevens.',
+'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-username' => 'Gebruiker:',
+'passwordreset-domain' => 'Domein:',
+'passwordreset-capture' => 'De resulterende e-mail bekijken?',
+'passwordreset-capture-help' => 'Als u dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan u weergegeven.',
+'passwordreset-email' => 'E-mailadres:',
+'passwordreset-emailtitle' => 'Gebruikersgegevens op {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 uw 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 u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.',
-'passwordreset-emailtext-user' => 'Gebruiker $1 op de site {{SITENAME}} heeft uw gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.
+'passwordreset-emailtext-user' => 'Gebruiker $1 op de site {{SITENAME}} heeft uw 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 u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.',
-'passwordreset-emailelement' => 'Gebruikersnaam: $1
+'passwordreset-emailelement' => 'Gebruikersnaam: $1
Tijdelijk wachtwoord: $2',
-'passwordreset-emailsent' => 'Er is per e-mail een herinnering verzonden.',
+'passwordreset-emailsent' => 'Er is per e-mail een herinnering verzonden.',
+'passwordreset-emailsent-capture' => 'Er is een herinneringse-mail verzonden. Deze wordt hieronder weergegeven.',
+'passwordreset-emailerror-capture' => 'Er is een herinneringse-mail aangemaakt. Deze wordt hieronder weergegeven. Het verzonden naar de gebruiker is mislukt om de volgende reden: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mailadres wijzigen',
+'changeemail-header' => 'Het e-mailadres van mijn gebruiker wijzigen',
+'changeemail-text' => 'Vul dit formulier in om uw e-mailadres te wijzigen. U moet uw wachtwoord invoeren om deze wijziging te bevestigen.',
+'changeemail-no-info' => 'U moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.',
+'changeemail-oldemail' => 'Huidig e-mailadres:',
+'changeemail-newemail' => 'Nieuw e-mailadres:',
+'changeemail-none' => '(geen)',
+'changeemail-submit' => 'E-mailadres wijzigen',
+'changeemail-cancel' => 'Annuleren',
# Edit page toolbar
'bold_sample' => 'Vetgedrukte tekst',
@@ -963,9 +991,6 @@ U kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij u een
Uw huidige IP-adres is $3 en het blokkadenummer is #$5.
Vermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.',
'blockednoreason' => 'geen reden opgegeven',
-'blockedoriginalsource' => "Hieronder staat de brontekst van '''$1''':",
-'blockededitsource' => "Hieronder staat de tekst van '''uw bewerkingen''' aan '''$1''':",
-'whitelistedittitle' => 'Voor bewerken is aanmelden verplicht',
'whitelistedittext' => "U moet $1 om pagina's te bewerken.",
'confirmedittext' => 'U moet uw e-mailadres bevestigen voor u kunt bewerken.
Voer uw e-mailadres in en bevestig het via [[Special:Preferences|uw voorkeuren]].',
@@ -1057,8 +1082,8 @@ Hierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven of overgenome
Als u niet wilt dat uw teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />
U belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).
'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
-'longpageerror' => "'''FOUT: de tekst die u hebt toegevoegd is $1 kilobyte groot, wat groter is dan het maximum van $2 kilobyte.
-Opslaan is niet mogelijk.'''",
+'longpageerror' => "'''Fout: de tekst die u hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''
+Opslaan is niet mogelijk.",
'readonlywarning' => "'''Waarschuwing: de database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus u kunt deze nu niet opslaan.'''
Het is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.
@@ -1227,8 +1252,6 @@ Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud benaderen en de ve
'revdelete-unsuppress' => 'Beperkingen op teruggezette wijzigingen verwijderen',
'revdelete-log' => 'Reden:',
'revdelete-submit' => 'Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}',
-'revdelete-logentry' => 'heeft zichtbaarheid van bewerkingen voor [[$1]] gewijzigd',
-'logdelete-logentry' => 'wijzigde zichtbaarheid van gebeurtenis [[$1]]',
'revdelete-success' => "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
'revdelete-failure' => "'''De zichtbaarheid van de wijziging kon niet bijgewerkt worden:'''
$1",
@@ -1240,15 +1263,6 @@ $1",
'revdel-restore-visible' => 'zichtbare versies',
'pagehist' => 'paginageschiedenis',
'deletedhist' => 'verwijderde geschiedenis',
-'revdelete-content' => 'inhoud',
-'revdelete-summary' => 'bewerkingssamenvatting',
-'revdelete-uname' => 'gebruikersnaam',
-'revdelete-restricted' => 'heeft beperkingen aan beheerders opgelegd',
-'revdelete-unrestricted' => 'heeft beperkingen voor beheerders opgeheven',
-'revdelete-hid' => 'heeft $1 verborgen',
-'revdelete-unhid' => 'heeft $1 zichtbaar gemaakt',
-'revdelete-log-message' => '$1 voor $2 {{PLURAL:$2|versie|versies}}',
-'logdelete-log-message' => '$1 voor $2 {{PLURAL:$2|logboekregel|logboekregels}}',
'revdelete-hide-current' => 'Er is een fout opgetreden bij het verbergen van het object van $1 om $2 uur: dit is de huidige versie.
Deze versie kan niet verborgen worden.',
'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".
@@ -1411,12 +1425,14 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
'prefs-rc' => 'Recente wijzigingen',
'prefs-watchlist' => 'Volglijst',
'prefs-watchlist-days' => 'Dagen weer te geven in de volglijst:',
-'prefs-watchlist-days-max' => 'Maximaal 7 dagen',
+'prefs-watchlist-days-max' => 'Maximaal $1 {{PLURAL:$1|dag|dagen}}',
'prefs-watchlist-edits' => 'Maximaal aantal bewerkingen in de uitgebreide volglijst:',
'prefs-watchlist-edits-max' => 'Maximale aantal: 1000',
'prefs-watchlist-token' => 'Volglijstsleutel:',
'prefs-misc' => 'Diversen',
'prefs-resetpass' => 'Wachtwoord wijzigen',
+'prefs-changeemail' => 'E-mailadres wijzigen',
+'prefs-setemail' => 'Een e-mailadres instellen',
'prefs-email' => 'E-mail',
'prefs-rendering' => 'Uiterlijk',
'saveprefs' => 'Opslaan',
@@ -1476,6 +1492,7 @@ Deze handeling kan niet ongedaan gemaakt worden.',
'yourrealname' => 'Uw echte naam:',
'yourlanguage' => 'Taal:',
'yourvariant' => 'Taalvariant voor inhoud:',
+'prefs-help-variant' => "Uw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
'yournick' => 'Tekst voor ondertekening:',
'prefs-help-signature' => 'Reacties op de overlegpagina\'s worden meestal ondertekend met "<nowiki>~~~~</nowiki>".
De tildes worden omgezet in uw ondertekening en een datum en tijd van de bewerking.',
@@ -1517,7 +1534,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
'userrights-lookup-user' => 'Gebruikersgroepen beheren',
'userrights-user-editname' => 'Voer een gebruikersnaam in:',
'editusergroup' => 'Gebruikersgroepen wijzigen',
-'editinguser' => "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Gebruikersgroepen wijzigen',
'saveusergroups' => 'Gebruikersgroepen opslaan',
'userrights-groupsmember' => 'Lid van:',
@@ -1611,13 +1628,13 @@ Deze informatie is zichtbaar voor andere gebruikers.',
'right-autopatrol' => 'Bewerkingen automatisch als gecontroleerd gemarkeerd krijgen',
'right-patrolmarks' => 'Controletekens in recente wijzigingen bekijken',
'right-unwatchedpages' => "Een lijst met pagina's die niet op een volglijst staan bekijken",
-'right-trackback' => "Terugverwijzende pagina's opgeven",
'right-mergehistory' => "De geschiedenis van pagina's samenvoegen",
'right-userrights' => 'Alle gebruikersrechten bewerken',
'right-userrights-interwiki' => "Gebruikersrechten van gebruikers in andere wiki's wijzigen",
'right-siteadmin' => 'De database blokkeren en weer vrijgeven',
'right-override-export-depth' => "Pagina's exporteren inclusief pagina's waarnaar verwezen wordt tot een diepte van vijf",
'right-sendemail' => 'E-mail versturen aan andere gebruikers',
+'right-passwordreset' => 'E-mails voor wachtwoord opnieuw instellen bekijken',
# User rights log
'rightslog' => 'Gebruikersrechtenlogboek',
@@ -1651,16 +1668,17 @@ Deze informatie is zichtbaar voor andere gebruikers.',
'action-suppressionlog' => 'dit beschermde logboek te bekijken',
'action-block' => 'deze gebruiker een bewerkingsblokkade op te leggen',
'action-protect' => 'het beveiligingsniveau van deze pagina aan te passen',
+'action-rollback' => 'bewerkingen van de laatste gebruiker die een pagina heeft bewerkt snel terugdraaien',
'action-import' => 'deze pagina van een andere wiki te importeren',
'action-importupload' => 'deze pagina van een bestandsupload te importeren',
'action-patrol' => 'bewerkingen van anderen als gecontroleerd te markeren',
'action-autopatrol' => 'eigen bewerkingen als gecontroleerd te laten markeren',
'action-unwatchedpages' => "de lijst met pagina's die niet op een volglijst staan te bekijken",
-'action-trackback' => 'een terugverwijzende pagina op te geven',
'action-mergehistory' => 'de geschiedenis van deze pagina samen te voegen',
'action-userrights' => 'alle gebruikersrechten te bewerken',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|bewerking|bewerkingen}}',
@@ -1692,6 +1710,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|keer|keer}} op een volglijst]',
'rc_categories' => 'Beperken tot categorieën (scheiden met een "|")',
'rc_categories_any' => 'Elke',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} na de wijziging',
'newsectionsummary' => '/* $1 */ nieuwe subkop',
'rc-enhanced-expand' => 'Details weergeven (JavaScript verplicht)',
'rc-enhanced-hide' => 'Details verbergen',
@@ -1748,6 +1767,7 @@ Zie de [[Special:NewFiles|galerij met nieuwe bestanden]] voor een visueler overz
'minlength1' => 'Bestandsnamen moeten minstens één letter bevatten.',
'illegalfilename' => 'De bestandsnaam "$1" bevat ongeldige tekens die niet gebruikt mogen worden in paginanamen.
Geef het bestand een andere naam, en probeer het dan opnieuw te uploaden.',
+'filename-toolong' => 'Bestandsnamen mogen niet langer zijn dan 240 bytes.',
'badfilename' => 'De naam van het bestand is gewijzigd in "$1".',
'filetype-mime-mismatch' => 'De bestandsextensie ".$1" hoort niet bij het MIME-type van het bestand ($2).',
'filetype-badmime' => 'Het is niet toegestaan om bestanden van MIME-type "$1" te uploaden.',
@@ -1864,6 +1884,41 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
'upload-unknown-size' => 'Onbekende grootte',
'upload-http-error' => 'Er is een HTTP-fout opgetreden: $1',
+# File backend
+'backend-fail-stream' => 'Het was niet mogelijk het bestand $1 te streamen.',
+'backend-fail-backup' => 'Het was niet mogelijk een reservekopie van het bestand $1 te maken.',
+'backend-fail-notexists' => 'Het bestand $1 bestaat niet.',
+'backend-fail-hashes' => 'Het was niet mogelijk de hashes voor het bestand op te halen om ze te vergelijken.',
+'backend-fail-notsame' => 'Er staat al een niet-identiek bestand op de plaats $1.',
+'backend-fail-invalidpath' => '$1 is geen geldig opslagpad.',
+'backend-fail-delete' => 'Het bestand $1 kon niet verwijderd worden.',
+'backend-fail-alreadyexists' => 'Het bestand $1 bestaat al.',
+'backend-fail-store' => 'Het was niet mogelijk het bestand $1 op te slaan op locatie $2.',
+'backend-fail-copy' => 'Het was niet mogelijk het bestand $1 te kopiëren naar $2.',
+'backend-fail-move' => 'Het was niet mogelijk het bestand $1 te verplaatsen naar $2.',
+'backend-fail-opentemp' => 'Het was niet mogelijk een tijdelijk bestand te openen.',
+'backend-fail-writetemp' => 'Het was niet mogelijk naar een tijdelijk bestand te schrijven.',
+'backend-fail-closetemp' => 'Het was niet mogelijk een tijdelijk bestand te sluiten.',
+'backend-fail-read' => 'Het was niet mogelijk het bestand $1 te lezen.',
+'backend-fail-create' => 'Het was niet mogelijk het bestand $1 aan te maken.',
+'backend-fail-readonly' => 'Het opslagbackend "$1" kan op dit moment alleen gelezen worden. De opgegeven reden was: "$2"',
+'backend-fail-synced' => 'Het bestand "$1" bevindt zich in een inconsistente toestand in de interne opslagbackends.',
+'backend-fail-connect' => 'Het was niet mogelijk een verbinding te maken met het opslagbackend "$1".',
+'backend-fail-internal' => 'Er is een onbekende fout opgetreden in het opslagbackend "$1".',
+'backend-fail-contenttype' => 'Kon het inhoudstype van het bestand om op "$1" op te slaan niet bepalen.',
+'backend-fail-batchsize' => 'Reeks van $1 bestands{{PLURAL:$1|operatie|operaties}} in de opslagbackend; de limiet is $2 {{PLURAL:$2|operatie|operaties}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Het was niet mogelijk "$1" vrij te geven; dit object is niet vergrendeld.',
+'lockmanager-fail-closelock' => 'Het was niet mogelijk het vergrendelingsbestand voor "$1" te sluiten.',
+'lockmanager-fail-deletelock' => 'Het was niet mogelijk het vergrendelingsbestand voor "$1" te verwijderen.',
+'lockmanager-fail-acquirelock' => 'Het was niet mogelijk "$1" te vergrendelen.',
+'lockmanager-fail-openlock' => 'Het was niet mogelijk het vergrendelingsbestand voor "$1" te openen.',
+'lockmanager-fail-releaselock' => 'Het was niet mogelijk vergrendeling van "$1" op te heffen.',
+'lockmanager-fail-db-bucket' => 'Het was niet mogelijk om in contact te komen met voldoende vergrendelingsdatabases in de bucket $1.',
+'lockmanager-fail-db-release' => 'Het was niet mogelijk om de vergrendeling voor de database $1 op te heffen.',
+'lockmanager-fail-svr-release' => 'Het was niet mogelijk om de vergrendeling voor de server $1 op te heffen.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Er is een fout opgetreden bij het openen van het bestand voor de ZIP-controle.',
'zip-wrong-format' => 'Het opgegeven bestand was geen ZIP-bestand.',
@@ -1880,6 +1935,7 @@ De veiligheid kan niet worden gecontroleerd.',
'uploadstash-badtoken' => 'Het uitvoeren van de handeling is mislukt. Dit komt mogelijk doordat uw bewerkingsreferenties zijn verlopen. Probeer het opnieuw.',
'uploadstash-errclear' => 'Het verwijderen van de bestanden is mislukt.',
'uploadstash-refresh' => 'Lijst met bestanden bijwerken',
+'invalid-chunk-offset' => 'Ongeldige chunkoffset',
# img_auth script messages
'img-auth-accessdenied' => 'Toegang geweigerd',
@@ -1990,23 +2046,24 @@ De [$2 pagina met de bestandsbeschrijving] wordt hieronder weergegeven.',
'filerevert-badversion' => 'Er is geen vorige lokale versie van dit bestand met het opgegeven tijdstip.',
# File deletion
-'filedelete' => '"$1" verwijderen',
-'filedelete-legend' => 'Bestand verwijderen',
-'filedelete-intro' => "U staat op het punt om het bestand '''[[Media:$1|$1]]''' te verwijderen, inclusief alle eerdere versies.",
-'filedelete-intro-old' => "U bent de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan het verwijderen.",
-'filedelete-comment' => 'Reden:',
-'filedelete-submit' => 'Verwijderen',
-'filedelete-success' => "'''$1''' is verwijderd.",
-'filedelete-success-old' => "De versie van '''[[Media:$1|$1]]''' van $3, $2 is verwijderd.",
-'filedelete-nofile' => "'''$1''' bestaat niet.",
-'filedelete-nofile-old' => "Er is geen versie van '''$1''' in het archief met de aangegeven eigenschappen.",
-'filedelete-otherreason' => 'Andere reden:',
-'filedelete-reason-otherlist' => 'Andere reden',
-'filedelete-reason-dropdown' => '*Veel voorkomende redenen voor verwijderen
+'filedelete' => '"$1" verwijderen',
+'filedelete-legend' => 'Bestand verwijderen',
+'filedelete-intro' => "U staat op het punt om het bestand '''[[Media:$1|$1]]''' te verwijderen, inclusief alle eerdere versies.",
+'filedelete-intro-old' => "U bent de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan het verwijderen.",
+'filedelete-comment' => 'Reden:',
+'filedelete-submit' => 'Verwijderen',
+'filedelete-success' => "'''$1''' is verwijderd.",
+'filedelete-success-old' => "De versie van '''[[Media:$1|$1]]''' van $3, $2 is verwijderd.",
+'filedelete-nofile' => "'''$1''' bestaat niet.",
+'filedelete-nofile-old' => "Er is geen versie van '''$1''' in het archief met de aangegeven eigenschappen.",
+'filedelete-otherreason' => 'Andere reden:',
+'filedelete-reason-otherlist' => 'Andere reden',
+'filedelete-reason-dropdown' => '*Veel voorkomende redenen voor verwijderen
** Auteursrechtenschending
** Duplicaatbestand',
-'filedelete-edit-reasonlist' => 'Redenen voor verwijderen bewerken',
-'filedelete-maintenance' => 'Het verwijderen en terugplaatsen is tijdelijk niet mogelijk wegens onderhoudswerkzaamheden.',
+'filedelete-edit-reasonlist' => 'Redenen voor verwijderen bewerken',
+'filedelete-maintenance' => 'Het verwijderen en terugplaatsen is tijdelijk niet mogelijk wegens onderhoudswerkzaamheden.',
+'filedelete-maintenance-title' => 'Bestand verwijderen is niet mogelijk',
# MIME search
'mimesearch' => 'Zoeken op MIME-type',
@@ -2107,6 +2164,8 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
'wantedpages' => "Niet-bestaande pagina's met verwijzingen",
'wantedpages-badtitle' => 'Ongeldige paginanaam in resultaat: $1',
'wantedfiles' => 'Niet-bestaande bestanden met verwijzingen',
+'wantedfiletext-cat' => "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>. Pagina's die niet-bestaande bestanden insluiten staan op de pagina [[:$1]].",
+'wantedfiletext-nocat' => 'De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>.',
'wantedtemplates' => 'Niet-bestaande sjablonen met verwijzingen',
'mostlinked' => "Pagina's waar het meest naar verwezen wordt",
'mostlinkedcategories' => 'Categorieën waar het meest naar verwezen wordt',
@@ -2115,6 +2174,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
'mostimages' => 'Meestgebruikte bestanden',
'mostrevisions' => "Pagina's met de meeste bewerkingen",
'prefixindex' => "Alle pagina's op voorvoegsel",
+'prefixindex-namespace' => "Alle pagina's met het voorvoegsel (naamruimte $1)",
'shortpages' => "Korte pagina's",
'longpages' => "Lange pagina's",
'deadendpages' => "Pagina's zonder verwijzingen",
@@ -2227,12 +2287,8 @@ Ondersteunde protocollen: <tt>$1</tt> (voeg deze niet toe in uw zoekopdracht).',
'activeusers-noresult' => 'Geen actieve gebruikers gevonden.',
# Special:Log/newusers
-'newuserlogpage' => 'Logboek nieuwe gebruikers',
-'newuserlogpagetext' => 'Hieronder staan de nieuw ingeschreven gebruikers',
-'newuserlog-byemail' => 'wachtwoord is verzonden per e-mail',
-'newuserlog-create-entry' => 'Nieuwe gebruiker',
-'newuserlog-create2-entry' => 'heeft gebruiker $1 ingeschreven',
-'newuserlog-autocreate-entry' => 'Gebruiker automatisch aangemaakt',
+'newuserlogpage' => 'Logboek nieuwe gebruikers',
+'newuserlogpagetext' => 'Hieronder staan de nieuw ingeschreven gebruikers',
# Special:ListGroupRights
'listgrouprights' => 'Rechten van gebruikersgroepen',
@@ -2262,7 +2318,7 @@ Er kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individu
Het e-mailadres dat u hebt opgegeven bij [[Special:Preferences|uw voorkeuren]] wordt als afzender gebruikt.
De ontvanger kan dus direct naar u reageren.',
'usermailererror' => 'Foutmelding bij het verzenden:',
-'defemailsubject' => 'E-mail van {{SITENAME}}',
+'defemailsubject' => 'E-mail van {{SITENAME}}-gebruiker "$1"',
'usermaildisabled' => 'Gebruikerse-mail uitgeschakeld',
'usermaildisabledtext' => 'U kunt geen e-mail verzenden naar andere gebruikers op deze wiki',
'noemailtitle' => 'Van deze gebruiker is geen e-mailadres bekend',
@@ -2316,7 +2372,7 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
'watchmethod-list' => "controleer pagina's op volglijst op wijzigingen",
'watchlistcontains' => "Er {{PLURAL:$1|staat 1 pagina|staan $1 pagina's}} op uw volglijst.",
'iteminvalidname' => "Probleem met object '$1', ongeldige naam…",
-'wlnote' => 'Hieronder {{PLURAL:$1|staat de laaste wijziging|staan de laatste $1 wijzigingen}} in {{PLURAL:$2|het laatste uur|de laatste $2 uur}}.',
+'wlnote' => 'Hieronder {{PLURAL:$1|staat de laaste wijziging|staan de laatste $1 wijzigingen}} in {{PLURAL:$2|het laatste uur|de laatste $2 uur}} per $3 om $4.',
'wlshowlast' => 'Laatste $1 uur, $2 dagen bekijken ($3)',
'watchlist-options' => 'Opties voor volglijst',
@@ -2380,8 +2436,6 @@ Bevestig hieronder dat dit inderdaad uw bedoeling is, dat u de gevolgen begrijpt
'actionfailed' => 'De handeling is mislukt.',
'deletedtext' => '"$1" is verwijderd.
Zie het $2 voor een overzicht van recente verwijderingen.',
-'deletedarticle' => 'verwijderde "[[$1]]"',
-'suppressedarticle' => 'heeft "[[$1]]" verborgen',
'dellogpage' => 'Verwijderingslogboek',
'dellogpagetext' => "Hieronder wordt een lijst met recent verwijderde pagina's en bestanden weergegeven.",
'deletionlog' => 'verwijderingslogboek',
@@ -2431,7 +2485,10 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
'unprotectedarticle' => 'heeft de beveiliging van "[[$1]]" opgeheven',
'movedarticleprotection' => 'heeft beveiligingsinstellingen verplaatst van "[[$2]]" naar "[[$1]]"',
'protect-title' => 'Instellen van beveiligingsniveau voor "$1"',
+'protect-title-notallowed' => 'Beveiligingsniveau voor "$1" bekijken',
'prot_1movedto2' => '[[$1]] is hernoemd naar [[$2]]',
+'protect-badnamespace-title' => 'Niet te beveiligen naamruimte',
+'protect-badnamespace-text' => "Pagina's in deze naamruimte kunnen niet beveiligd worden.",
'protect-legend' => 'Beveiliging bevestigen',
'protectcomment' => 'Reden:',
'protectexpiry' => 'Duur:',
@@ -2453,6 +2510,7 @@ Het beveiligingsniveau wijzigen heeft geen enkel effect.",
'protect-level-sysop' => 'Alleen beheerders',
'protect-summary-cascade' => 'cascade',
'protect-expiring' => 'vervalt op $2 om $3 (UTC)',
+'protect-expiring-local' => 'vervalt op $1',
'protect-expiry-indefinite' => 'vervalt niet',
'protect-cascade' => "Cascadebeveiliging: hiermee worden alle pagina's en sjablonen die in deze pagina opgenomen zijn beveiligd (let op: dit kan grote gevolgen hebben)",
'protect-cantedit' => 'U kunt het beveiligingsniveau van deze pagina niet wijzigen, omdat u geen rechten hebt om het te bewerken.',
@@ -2512,7 +2570,6 @@ Mogelijk hebt u een verkeerde verwijzing of is de versie hersteld of verwijderd
'undeletereset' => 'Fomulier wissen',
'undeleteinvert' => 'Omgekeerde selectie',
'undeletecomment' => 'Reden:',
-'undeletedarticle' => '"[[$1]]" is teruggeplaatst',
'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} teruggeplaatst',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst',
'undeletedfiles' => '{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst',
@@ -2522,6 +2579,7 @@ Misschien heeft een andere gebruiker de pagina al teruggeplaatst.',
In het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.",
'undelete-header' => "Zie het [[Special:Log/delete|verwijderingslogboek]] voor recent verwijderde pagina's.",
+'undelete-search-title' => "Verwijderde pagina's zoeken",
'undelete-search-box' => "Verwijderde pagina's doorzoeken",
'undelete-search-prefix' => "Pagina's bekijken die beginnen met:",
'undelete-search-submit' => 'Zoeken',
@@ -2531,6 +2589,7 @@ In het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen
'undelete-cleanup-error' => 'Fout bij het herstellen van ongebruikt archiefbestand "$1".',
'undelete-missing-filearchive' => 'Het lukt niet om ID $1 terug te plaatsen, omdat deze niet in de database te vinden is.
Misschien is deze versie al teruggeplaatst.',
+'undelete-error' => 'Er is een fout opgetreden tijdens het verwijderen van de pagina',
'undelete-error-short' => 'Fout bij het herstellen van bestand: $1',
'undelete-error-long' => 'Er zijn fouten opgetreden bij het herstellen van het bestand:
@@ -2652,6 +2711,7 @@ Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blo
'blocklist-userblocks' => 'Geblokkeerde gebruikers verbergen',
'blocklist-tempblocks' => 'Tijdelijke blokkades verbergen',
'blocklist-addressblocks' => 'Blokkades van één IP-adres verbergen',
+'blocklist-rangeblocks' => 'IP-adresblokken verbergen',
'blocklist-timestamp' => 'Tijdstip',
'blocklist-target' => 'Doel',
'blocklist-expiry' => 'Vervalt',
@@ -2674,6 +2734,7 @@ Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blo
'unblocklink' => 'deblokkeren',
'change-blocklink' => 'blokkade wijzigen',
'contribslink' => 'bijdragen',
+'emaillink' => 'e-mail verzenden',
'autoblocker' => "Automatisch geblokkeerd omdat het IP-adres overeenkomt met dat van [[User:\$1|\$1]], die geblokkeerd is om de volgende reden: \"'''\$2'''\"",
'blocklogpage' => 'Blokkeerlogboek',
'blocklog-showlog' => 'Deze gebruiker is voorheen geblokkeerd geweest.
@@ -2805,9 +2866,6 @@ Combineer de overlegpagina's handmatig.'''",
'movepage-page-unmoved' => 'De pagina $1 kon niet hernoemd worden naar $2.',
'movepage-max-pages' => "Het maximale aantal automatisch te hernoemen pagina's is bereikt ({{PLURAL:$1|$1|$1}}).
De overige pagina's worden niet automatisch hernoemd.",
-'1movedto2' => 'hernoemde [[$1]] naar [[$2]]',
-'1movedto2_redir' => '[[$1]] hernoemd over de doorverwijzing [[$2]]',
-'move-redirect-suppressed' => 'doorverwijzing onderdrukt',
'movelogpage' => 'Hernoemingslogboek',
'movelogpagetext' => "Hieronder staan hernoemde pagina's.",
'movesubpage' => "{{PLURAL:$1|Subpagina|Subpagina's}}",
@@ -2820,7 +2878,7 @@ De overige pagina's worden niet automatisch hernoemd.",
Onder de naam "[[:$1]]" bestaat al een pagina.
Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
'delete_and_move_confirm' => 'Ja, de pagina verwijderen',
-'delete_and_move_reason' => 'Verwijderd in verband met hernoeming',
+'delete_and_move_reason' => 'Verwijderd in verband met hernoeming van "[[$1]]"',
'selfmove' => 'U kunt een pagina niet hernoemen naar dezelfde paginanaam.',
'immobile-source-namespace' => 'Pagina\'s in de naamruimte "$1" kunnen niet hernoemd worden',
'immobile-target-namespace' => 'Pagina\'s kunnen niet hernoemd worden naar de naamruimte "$1"',
@@ -2851,9 +2909,11 @@ 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 u alle versies met de bewerkingssamenvatting of alleen de huidige versies met de bewerkingssamenvatting wilt exporteren.
In het laatste geval kunt u ook een verwijzing gebruiken, bijvoorbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] voor de pagina "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => "Alle pagina's exporteren",
'exportcuronly' => 'Alleen de laatste versie, niet de volledige geschiedenis',
'exportnohistory' => "----
'''Let op:''' het exporteren van de gehele geschiedenis is uitgeschakeld wegens prestatieredenen.",
+'exportlistauthors' => 'Volledige auteurslijst opnemen voor iedere pagina',
'export-submit' => 'Exporteren',
'export-addcattext' => "Pagina's toevoegen van categorie:",
'export-addcat' => 'Toevoegen',
@@ -2886,6 +2946,8 @@ Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//tran
'thumbnail_error' => 'Fout bij het aanmaken van de miniatuurafbeelding: $1',
'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.',
+'thumbnail-dest-create' => 'Het was niet mogelijk het miniatuurbestand op de doellocatie op te slaan.',
'thumbnail_invalid_params' => 'Onjuiste parameters voor miniatuurafbeelding',
'thumbnail_dest_directory' => 'Niet in staat doelmap aan te maken',
'thumbnail_image-type' => 'Dit bestandstype wordt niet ondersteund',
@@ -2933,6 +2995,11 @@ Een tijdelijke map is niet aanwezig.',
'import-upload' => 'XML-gegevens uploaden',
'import-token-mismatch' => 'De sessiegegevens zijn verloren gegaan. Probeer het opnieuw.',
'import-invalid-interwiki' => 'Het is niet mogelijk van de aangegeven wiki te importeren.',
+'import-error-edit' => 'De pagina "$1" is niet geïmporteerd omdat u niet de rechten hebt om die te bewerken.',
+'import-error-create' => 'De pagina "$1" is niet geïmporteerd omdat u niet de rechten hebt om die aan te maken.',
+'import-error-interwiki' => 'De pagina "$1" is niet geïmporteerd omdat deze naam is gereserveerd voor externe verwijzingen (interwiki).',
+'import-error-special' => 'Pagina "$1" is niet geïmporteerd omdat deze is geplaatst in een speciale naamruimte waar geen pagina\'s in geplaatst kunnen worden.',
+'import-error-invalid' => 'De pagina" "$1" is niet geïmporteerd omdat de naam ongeldig is.',
# Import log
'importlogpage' => 'Importlogboek',
@@ -2942,72 +3009,85 @@ Een tijdelijke map is niet aanwezig.',
'import-logentry-interwiki' => 'importeerde $1 via transwiki',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versie|versies}} van $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript testen',
+'javascripttest-disabled' => 'Deze functie is uitgeschakeld.',
+'javascripttest-title' => 'Tests uitvoeren voor $1',
+'javascripttest-pagetext-noframework' => 'Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.',
+'javascripttest-pagetext-unknownframework' => 'Onbekend testframework "$1".',
+'javascripttest-pagetext-frameworks' => 'Kies een van de volgende testframeworks: $1',
+'javascripttest-pagetext-skins' => 'Kies een vormgeving om de tests mee uit te voeren:',
+'javascripttest-qunit-intro' => 'Zie de [$1 testdocumentatie] op mediawiki.org.',
+'javascripttest-qunit-heading' => 'QUnit testsuite voor MediaWiki JavaScript',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Uw gebruikerspagina',
-'tooltip-pt-anonuserpage' => 'Gebruikerspagina voor uw IP-adres',
-'tooltip-pt-mytalk' => 'Uw overlegpagina',
-'tooltip-pt-anontalk' => 'Overlegpagina van de anonieme gebruiker van dit IP-adres',
-'tooltip-pt-preferences' => 'Mijn voorkeuren',
-'tooltip-pt-watchlist' => "Overzicht van pagina's die u volgt",
-'tooltip-pt-mycontris' => 'Overzicht van uw bijdragen',
-'tooltip-pt-login' => 'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht',
-'tooltip-pt-anonlogin' => 'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht',
-'tooltip-pt-logout' => 'Afmelden',
-'tooltip-ca-talk' => 'Overleg over deze pagina',
-'tooltip-ca-edit' => 'U kunt deze pagina bewerken. Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
-'tooltip-ca-addsection' => 'Nieuw kopje toevoegen',
-'tooltip-ca-viewsource' => 'Deze pagina is beveiligd. U kunt wel de broncode bekijken.',
-'tooltip-ca-history' => 'Eerdere versies van deze pagina',
-'tooltip-ca-protect' => 'Deze pagina beveiligen',
-'tooltip-ca-unprotect' => 'De beveiliging voor deze pagina wijzigen',
-'tooltip-ca-delete' => 'Deze pagina verwijderen',
-'tooltip-ca-undelete' => 'Verwijderde bewerkingen van deze pagina terugplaatsen',
-'tooltip-ca-move' => 'Deze pagina hernoemen',
-'tooltip-ca-watch' => 'Deze pagina aan mijn volglijst toevoegen',
-'tooltip-ca-unwatch' => 'Deze pagina van mijn volglijst verwijderen',
-'tooltip-search' => '{{SITENAME}} doorzoeken',
-'tooltip-search-go' => 'Naar een pagina met deze naam gaan als die bestaat',
-'tooltip-search-fulltext' => "Alle pagina's op deze tekst doorzoeken",
-'tooltip-p-logo' => 'Naar de hoofdpagina gaan',
-'tooltip-n-mainpage' => 'Naar de hoofdpagina gaan',
-'tooltip-n-mainpage-description' => 'Naar de hoofdpagina gaan',
-'tooltip-n-portal' => 'Informatie over het project: wie, wat, hoe en waarom',
-'tooltip-n-currentevents' => 'Achtergrondinformatie over actuele zaken',
-'tooltip-n-recentchanges' => 'De lijst met recente wijzigingen in deze wiki.',
-'tooltip-n-randompage' => 'Een willekeurige pagina bekijken',
-'tooltip-n-help' => 'Hulpinformatie over deze wiki',
-'tooltip-t-whatlinkshere' => "Lijst met alle pagina's die naar deze pagina verwijzen",
-'tooltip-t-recentchangeslinked' => "Recente wijzigingen in pagina's waar deze pagina naar verwijst",
-'tooltip-feed-rss' => 'RSS-feed voor deze pagina',
-'tooltip-feed-atom' => 'Atom-feed voor deze pagina',
-'tooltip-t-contributions' => 'Een lijst met bijdragen van deze gebruiker',
-'tooltip-t-emailuser' => 'Een e-mail naar deze gebruiker verzenden',
-'tooltip-t-upload' => 'Bestanden uploaden',
-'tooltip-t-specialpages' => "Lijst met alle speciale pagina's",
-'tooltip-t-print' => 'Printvriendelijke versie van deze pagina',
-'tooltip-t-permalink' => 'Permanente verwijzing naar deze versie van de pagina',
-'tooltip-ca-nstab-main' => 'Inhoudspagina bekijken',
-'tooltip-ca-nstab-user' => 'Gebruikerspagina bekijken',
-'tooltip-ca-nstab-media' => 'Mediapagina bekijken',
-'tooltip-ca-nstab-special' => 'Dit is een speciale pagina, u kunt de pagina zelf niet bewerken',
-'tooltip-ca-nstab-project' => 'Projectpagina bekijken',
-'tooltip-ca-nstab-image' => 'Bestandspagina bekijken',
-'tooltip-ca-nstab-mediawiki' => 'Systeembericht bekijken',
-'tooltip-ca-nstab-template' => 'Sjabloon bekijken',
-'tooltip-ca-nstab-help' => 'Hulppagina bekijken',
-'tooltip-ca-nstab-category' => 'Categoriepagina bekijken',
-'tooltip-minoredit' => 'Deze wijziging als een kleine wijziging markeren',
-'tooltip-save' => 'Uw wijzigingen opslaan',
-'tooltip-preview' => 'Een voorvertoning maken. Gebruik dit voordat u opslaat!',
-'tooltip-diff' => 'Gemaakte wijzigingen bekijken (zoals het in de geschiedenis zal te zien zijn)',
-'tooltip-compareselectedversions' => 'De verschillen tussen de geselecteerde versies van deze pagina bekijken.',
-'tooltip-watch' => 'Deze pagina aan uw volglijst toevoegen',
-'tooltip-recreate' => 'Deze pagina opnieuw aanmaken ondanks eerdere verwijdering',
-'tooltip-upload' => 'Uploaden',
-'tooltip-rollback' => 'Met "terugdraaien" draait u met één klik de bewerking(en) terug van de laatste gebruiker die deze pagina heeft bewerkt.',
-'tooltip-undo' => 'Met "ongedaan maken" draait u deze bewerking terug en komt in het bewerkingsvenster. U kunt in de bewerkingssamenvatting een reden opgeven.',
-'tooltip-preferences-save' => 'Voorkeuren opslaan',
-'tooltip-summary' => 'Voer een korte samenvatting in',
+'tooltip-pt-userpage' => 'Uw gebruikerspagina',
+'tooltip-pt-anonuserpage' => 'Gebruikerspagina voor uw IP-adres',
+'tooltip-pt-mytalk' => 'Uw overlegpagina',
+'tooltip-pt-anontalk' => 'Overlegpagina van de anonieme gebruiker van dit IP-adres',
+'tooltip-pt-preferences' => 'Mijn voorkeuren',
+'tooltip-pt-watchlist' => "Overzicht van pagina's die u volgt",
+'tooltip-pt-mycontris' => 'Overzicht van uw bijdragen',
+'tooltip-pt-login' => 'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht',
+'tooltip-pt-anonlogin' => 'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht',
+'tooltip-pt-logout' => 'Afmelden',
+'tooltip-ca-talk' => 'Overleg over deze pagina',
+'tooltip-ca-edit' => 'U kunt deze pagina bewerken. Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
+'tooltip-ca-addsection' => 'Nieuw kopje toevoegen',
+'tooltip-ca-viewsource' => 'Deze pagina is beveiligd. U kunt wel de broncode bekijken.',
+'tooltip-ca-history' => 'Eerdere versies van deze pagina',
+'tooltip-ca-protect' => 'Deze pagina beveiligen',
+'tooltip-ca-unprotect' => 'De beveiliging voor deze pagina wijzigen',
+'tooltip-ca-delete' => 'Deze pagina verwijderen',
+'tooltip-ca-undelete' => 'Verwijderde bewerkingen van deze pagina terugplaatsen',
+'tooltip-ca-move' => 'Deze pagina hernoemen',
+'tooltip-ca-watch' => 'Deze pagina aan mijn volglijst toevoegen',
+'tooltip-ca-unwatch' => 'Deze pagina van mijn volglijst verwijderen',
+'tooltip-search' => '{{SITENAME}} doorzoeken',
+'tooltip-search-go' => 'Naar een pagina met deze naam gaan als die bestaat',
+'tooltip-search-fulltext' => "Alle pagina's op deze tekst doorzoeken",
+'tooltip-p-logo' => 'Naar de hoofdpagina gaan',
+'tooltip-n-mainpage' => 'Naar de hoofdpagina gaan',
+'tooltip-n-mainpage-description' => 'Naar de hoofdpagina gaan',
+'tooltip-n-portal' => 'Informatie over het project: wie, wat, hoe en waarom',
+'tooltip-n-currentevents' => 'Achtergrondinformatie over actuele zaken',
+'tooltip-n-recentchanges' => 'De lijst met recente wijzigingen in deze wiki.',
+'tooltip-n-randompage' => 'Een willekeurige pagina bekijken',
+'tooltip-n-help' => 'Hulpinformatie over deze wiki',
+'tooltip-t-whatlinkshere' => "Lijst met alle pagina's die naar deze pagina verwijzen",
+'tooltip-t-recentchangeslinked' => "Recente wijzigingen in pagina's waar deze pagina naar verwijst",
+'tooltip-feed-rss' => 'RSS-feed voor deze pagina',
+'tooltip-feed-atom' => 'Atom-feed voor deze pagina',
+'tooltip-t-contributions' => 'Een lijst met bijdragen van deze gebruiker',
+'tooltip-t-emailuser' => 'Een e-mail naar deze gebruiker verzenden',
+'tooltip-t-upload' => 'Bestanden uploaden',
+'tooltip-t-specialpages' => "Lijst met alle speciale pagina's",
+'tooltip-t-print' => 'Printvriendelijke versie van deze pagina',
+'tooltip-t-permalink' => 'Permanente verwijzing naar deze versie van de pagina',
+'tooltip-ca-nstab-main' => 'Inhoudspagina bekijken',
+'tooltip-ca-nstab-user' => 'Gebruikerspagina bekijken',
+'tooltip-ca-nstab-media' => 'Mediapagina bekijken',
+'tooltip-ca-nstab-special' => 'Dit is een speciale pagina, u kunt de pagina zelf niet bewerken',
+'tooltip-ca-nstab-project' => 'Projectpagina bekijken',
+'tooltip-ca-nstab-image' => 'Bestandspagina bekijken',
+'tooltip-ca-nstab-mediawiki' => 'Systeembericht bekijken',
+'tooltip-ca-nstab-template' => 'Sjabloon bekijken',
+'tooltip-ca-nstab-help' => 'Hulppagina bekijken',
+'tooltip-ca-nstab-category' => 'Categoriepagina bekijken',
+'tooltip-minoredit' => 'Deze wijziging als een kleine wijziging markeren',
+'tooltip-save' => 'Uw wijzigingen opslaan',
+'tooltip-preview' => 'Een voorvertoning maken. Gebruik dit voordat u opslaat!',
+'tooltip-diff' => 'Gemaakte wijzigingen bekijken (zoals het in de geschiedenis zal te zien zijn)',
+'tooltip-compareselectedversions' => 'De verschillen tussen de geselecteerde versies van deze pagina bekijken.',
+'tooltip-watch' => 'Deze pagina aan uw volglijst toevoegen',
+'tooltip-watchlistedit-normal-submit' => "Pagina's verwijderen",
+'tooltip-watchlistedit-raw-submit' => 'Volglijst bijwerken',
+'tooltip-recreate' => 'Deze pagina opnieuw aanmaken ondanks eerdere verwijdering',
+'tooltip-upload' => 'Uploaden',
+'tooltip-rollback' => 'Met "terugdraaien" draait u met één klik de bewerking(en) terug van de laatste gebruiker die deze pagina heeft bewerkt.',
+'tooltip-undo' => 'Met "ongedaan maken" draait u deze bewerking terug en komt in het bewerkingsvenster. U kunt in de bewerkingssamenvatting een reden opgeven.',
+'tooltip-preferences-save' => 'Voorkeuren opslaan',
+'tooltip-summary' => 'Voer een korte samenvatting in',
# Stylesheets
'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
@@ -3106,9 +3186,6 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
# Patrol log
'patrol-log-page' => 'Markeerlogboek',
'patrol-log-header' => 'Dit logboek bevat versies die gemarkeerd zijn als gecontroleerd.',
-'patrol-log-line' => 'markeerde versie $1 van $2 als gecontroleerd $3',
-'patrol-log-auto' => '(automatisch)',
-'patrol-log-diff' => 'versie $1',
'log-show-hide-patrol' => 'Markeerlogboek $1',
# Image deletion
@@ -3136,11 +3213,11 @@ $1',
'file-info' => 'bestandsgrootte: $1, MIME-type: $2',
'file-info-size' => '$1 × $2 pixels, bestandsgrootte: $3, MIME-type: $4',
'file-info-size-pages' => "$1 × $2 pixels, bestandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|pagina|pagina's}}",
-'file-nohires' => '<small>Geen hogere resolutie beschikbaar.</small>',
+'file-nohires' => 'Geen hogere resolutie beschikbaar.',
'svg-long-desc' => 'SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3',
'show-big-image' => 'Volledige resolutie',
-'show-big-image-preview' => '<small>Grootte van deze voorvertoning: $1.</small>',
-'show-big-image-other' => '<small>Andere resoluties: $1.</small>',
+'show-big-image-preview' => 'Grootte van deze voorvertoning: $1.',
+'show-big-image-other' => 'Andere {{PLURAL:$2|resolutie|resoluties}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'herhalend',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frames}}',
@@ -3161,7 +3238,12 @@ $1',
'sp-newimages-showfrom' => 'Nieuwe bestanden bekijken vanaf $1 om $2.',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'u',
+'hours-abbrev' => '$1u',
+'seconds' => '{{PLURAL:$1|$1 seconde|$1 seconden}}',
+'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
+'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'ago' => '$1 geleden',
# Bad image list
'bad_image_list' => "De opmaak is als volgt:
@@ -3660,13 +3742,6 @@ De bevestigingscode vervalt op $4.',
'scarytranscludefailed' => '[Het sjabloon $1 kon niet opgehaald worden]',
'scarytranscludetoolong' => '[De URL is te lang]',
-# Trackbacks
-'trackbackbox' => "Terugverwijzende pagina's voor deze pagina:<br />
-$1",
-'trackbackremove' => '([$1 Verwijderen])',
-'trackbacklink' => 'Terugverwijzende pagina',
-'trackbackdeleteok' => 'De terugverwijzende pagina is verwijderd.',
-
# Delete conflict
'deletedwhileediting' => "'''Let op''': deze pagina is verwijderd terwijl u bezig was met uw bewerking!",
'confirmrecreate' => "Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:
@@ -3768,6 +3843,9 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
'iranian-calendar-m11' => 'Elfde Perzische maand',
'iranian-calendar-m12' => 'Twaalfde Perzische maand',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])',
+
# Core parser functions
'unknown_extension_tag' => 'Onbekende tag "$1"',
'duplicate-defaultsort' => 'Waarschuwing: De standaardsortering "$2" krijgt voorrang voor de sortering "$1".',
@@ -3867,13 +3945,16 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'tags-hitcount' => '$1 {{PLURAL:$1|wijziging|wijzigingen}}',
# Special:ComparePages
-'comparepages' => "Pagina's vergelijken",
-'compare-selector' => 'Paginaversies vergelijken',
-'compare-page1' => 'Pagina 1',
-'compare-page2' => 'Pagina 2',
-'compare-rev1' => 'Versie 1',
-'compare-rev2' => 'Versie 2',
-'compare-submit' => 'Vergelijken',
+'comparepages' => "Pagina's vergelijken",
+'compare-selector' => 'Paginaversies vergelijken',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versie 1',
+'compare-rev2' => 'Versie 2',
+'compare-submit' => 'Vergelijken',
+'compare-invalid-title' => 'De titel die u hebt opgegeven is ongeldig.',
+'compare-title-not-exists' => 'De titel die u hebt opgegeven bestaat niet.',
+'compare-revision-not-exists' => 'De versie die u hebt opgegeven bestaat niet.',
# Database error messages
'dberr-header' => 'Deze wiki heeft een probleem',
@@ -3900,4 +3981,90 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'sqlite-has-fts' => 'Versie $1 met ondersteuning voor "full-text" zoeken',
'sqlite-no-fts' => 'Versie $1 zonder ondersteuning voor "full-text" zoeken',
+# New logging system
+'logentry-delete-delete' => '$1 heeft de pagina $3 verwijderd',
+'logentry-delete-restore' => '$1 heeft de pagina $3 teruggeplaatst',
+'logentry-delete-event' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
+'logentry-delete-revision' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
+'logentry-delete-event-legacy' => '$1 heeft de zichtbaarheid van logboekregels van $3 gewijzigd',
+'logentry-delete-revision-legacy' => '$1 heeft de zichtbaarheid van versies van de pagina $3 gewijzigd.',
+'logentry-suppress-delete' => '$1 heeft de pagina $3 onderdrukt',
+'logentry-suppress-event' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
+'logentry-suppress-revision' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
+'logentry-suppress-event-legacy' => '$1 heeft heimelijk de zichtbaarheid van logboekregels van $3 gewijzigd',
+'logentry-suppress-revision-legacy' => '$1 heeft heimelijk de zichtbaarheid van versies van de pagina $3 gewijzigd.',
+'revdelete-content-hid' => 'inhoud verborgen',
+'revdelete-summary-hid' => 'bewerkingssamenvatting verborgen',
+'revdelete-uname-hid' => 'gebruikersnaam verborgen',
+'revdelete-content-unhid' => 'inhoud zichtbaar gemaakt',
+'revdelete-summary-unhid' => 'bewerkingssamenvatting zichtbaar gemaakt',
+'revdelete-uname-unhid' => 'gebruikersnaam zichtbaar gemaakt',
+'revdelete-restricted' => 'heeft beperkingen aan beheerders opgelegd',
+'revdelete-unrestricted' => 'heeft beperkingen voor beheerders opgeheven',
+'logentry-move-move' => '$1 heeft pagina $3 naar $4 hernoemd',
+'logentry-move-move-noredirect' => '$1 hernoemde pagina $3 naar $4 zonder een doorverwijzing achter te laten',
+'logentry-move-move_redir' => '$1 hernoemde pagina $3 naar $4 over een doorverwijzing',
+'logentry-move-move_redir-noredirect' => '$1 heeft pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten',
+'logentry-patrol-patrol' => '$1 heeft versie $4 van pagina $3 als gecontroleerd gemarkeerd',
+'logentry-patrol-patrol-auto' => '$1 heeft versie $4 van pagina $3 automatisch als gecontroleerd gemarkeerd',
+'logentry-newusers-newusers' => '$1 heeft een gebruiker aangemaakt',
+'logentry-newusers-create' => '$1 heeft een gebruiker aangemaakt',
+'logentry-newusers-create2' => '$1 heeft een gebruiker $3 aangemaakt',
+'logentry-newusers-autocreate' => 'De gebruiker $1 is automatisch aangemaakt',
+'newuserlog-byemail' => 'wachtwoord is verzonden per e-mail',
+
+# Feedback
+'feedback-bugornote' => 'Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].
+Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw commentaar zal worden toegevoegd aan de pagina "[$3 $2]", samen met uw gebruikersnaam en de browser die u gebruikt.',
+'feedback-subject' => 'Onderwerp:',
+'feedback-message' => 'Bericht:',
+'feedback-cancel' => 'Annuleren',
+'feedback-submit' => 'Terugkoppeling opslaan',
+'feedback-adding' => 'Uw terugkoppeling wordt aan de pagina toegevoegd...',
+'feedback-error1' => 'Fout: onbekend resultaat uit de API',
+'feedback-error2' => 'Fout: de bewerking is mislukt',
+'feedback-error3' => 'Fout: geen reactie van de API',
+'feedback-thanks' => 'Bedankt! Uw terugkoppeling is op de pagina "[$2 $1]" geplaatst.',
+'feedback-close' => 'Afgerond',
+'feedback-bugcheck' => 'Geweldig! Controleer even of het niet al één van de [$1 bekende problemen] is.',
+'feedback-bugnew' => 'Heb ik gecontroleerd; nieuw probleem melden',
+
+# API errors
+'api-error-badaccess-groups' => 'U mag geen bestanden uploaden in deze wiki.',
+'api-error-badtoken' => 'Interne fout: het token klopt niet.',
+'api-error-copyuploaddisabled' => 'Uploaden via URL is uitgeschakeld op deze server.',
+'api-error-duplicate' => 'Er {{PLURAL:$1|staat al [$2 een bestand]|staan al [$2 bestanden]}} met dezelfde inhoud in de wiki.',
+'api-error-duplicate-archive' => 'Er {{PLURAL:$1|was al [$2 een ander bestand]|waren al [$2 $1 andere bestanden]}} op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplicaatbestand dat al verwijderd is|Duplicaatbestanden die al verwijderd zijn}}',
+'api-error-duplicate-popup-title' => 'Zelfde {{PLURAL:$1|bestand|bestanden}}',
+'api-error-empty-file' => 'Het bestand dat u hebt geüpload is leeg.',
+'api-error-emptypage' => "Het aanmaken van nieuwe, lege pagina's is niet toegestaan.",
+'api-error-fetchfileerror' => 'Interne fout: er is iets misgegaan bij het ophalen van het bestand.',
+'api-error-file-too-large' => 'Het bestand dat u hebt geüpload is te groot.',
+'api-error-filename-tooshort' => 'De bestandsnaam is te kort.',
+'api-error-filetype-banned' => 'Dit bestandstype mag niet geüpload worden.',
+'api-error-filetype-missing' => 'Het bestand heeft geen extensie.',
+'api-error-hookaborted' => 'De wijziging die u probeert te maken is afgebroken door een uitbreiding.',
+'api-error-http' => 'Interne fout: er kon geen verbinding gemaakt worden met de server.',
+'api-error-illegal-filename' => 'Deze bestandsnaam is niet toegestaan.',
+'api-error-internal-error' => 'Interne fout: er is iets misgegaan tijdens het verwerken van uw upload door de wiki.',
+'api-error-invalid-file-key' => 'Interne fout: het bestand is niet aangetroffen in de tijdelijke opslag.',
+'api-error-missingparam' => 'Interne fout: niet alle parameters zijn in het verzoek meegeleverd.',
+'api-error-missingresult' => 'Interne fout: het was niet mogelijk vast te stellen of het kopiëren is geslaagd.',
+'api-error-mustbeloggedin' => 'U moet aangemeld zijn om bestanden te kunnen uploaden.',
+'api-error-mustbeposted' => 'Er zit een fout in de software. Er wordt geen gebruik gemaakt van de juiste HTTP-methode.',
+'api-error-noimageinfo' => 'De upload is afgerond, maar de server heeft geen gegevens over het bestand verstrekt.',
+'api-error-nomodule' => 'Interne fout: er is geen uploadmodule ingesteld.',
+'api-error-ok-but-empty' => 'Interne fout: de server heeft geen gegevens teruggeleverd.',
+'api-error-overwrite' => 'Het overschrijven van een bestand bestand is niet toegestaan.',
+'api-error-stashfailed' => 'Interne fout: de server kon het tijdelijke bestand niet opslaan.',
+'api-error-timeout' => 'De server heeft niet binnen de verwachte tijd geantwoord.',
+'api-error-unclassified' => 'Er is een onbekende fout opgetreden',
+'api-error-unknown-code' => 'Interne fout: "$1"',
+'api-error-unknown-error' => 'Interne fout: er is iets misgegaan tijdens het uploaden van uw bestand.',
+'api-error-unknown-warning' => 'Onbekende waarschuwing: $1',
+'api-error-unknownerror' => 'Onbekende fout: "$1"',
+'api-error-uploaddisabled' => 'Uploaden is niet mogelijk in deze wiki.',
+'api-error-verification-error' => 'Dit bestand is mogelijk beschadigd of heeft een onjuiste extensie.',
+
);
diff --git a/languages/messages/MessagesNl_informal.php b/languages/messages/MessagesNl_informal.php
index 7268b847..270bd02a 100644
--- a/languages/messages/MessagesNl_informal.php
+++ b/languages/messages/MessagesNl_informal.php
@@ -157,7 +157,6 @@ Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je e
Je huidige IP-adres is $3 en het blokkadenummer is #$5.
Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
-'blockededitsource' => "Hieronder staat de tekst van '''je bewerkingen''' aan '''$1''':",
'whitelistedittext' => "Je moet $1 om pagina's te bewerken.",
'confirmedittext' => 'Je moet je e-mailadres bevestigen voor je kunt bewerken.
Voer je e-mailadres in en bevestig het via [[Special:Preferences|je voorkeuren]].',
diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php
index acb127b4..3ce461cd 100644
--- a/languages/messages/MessagesNn.php
+++ b/languages/messages/MessagesNn.php
@@ -9,6 +9,7 @@
*
* @author Boivie
* @author Dittaeva
+ * @author Diupwijk
* @author Eirik
* @author Finnrind
* @author Frokor
@@ -97,74 +98,74 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#omdiriger', '#REDIRECT' ),
- 'notoc' => array( '0', '__INGAINNHALDSLISTE__', '__INGENINNHOLDSLISTE__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__INKJEGALLERI__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ALLTIDINNHALDSLISTE__', '__ALLTIDINNHOLDSLISTE__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INNHALDSLISTE__', '__INNHOLDSLISTE__', '__TOC__' ),
- 'noeditsection' => array( '0', '__INGABOLKENDRING__', '__INGABOLKREDIGERING__', '__INGENDELENDRING__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'MÃ…NADNO', 'MÃ…NEDNÃ…', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'MÃ…NADNONAMN', 'MÃ…NEDNÃ…NAVN', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'MÃ…NADNOKORT', 'MÃ…NEDNÃ…KORT', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DAGNO', 'DAGNÃ…', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DAGNO2', 'DAGNÃ…2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'DAGNONAMN', 'DAGNÃ…NAVN', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'Ã…RNO', 'Ã…RNÃ…', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'TIDNO', 'TIDNÃ…', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'TIMENO', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'SIDETAL', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'INNHALDSSIDETAL', 'INNHOLDSSIDETALL', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'FILTAL', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'BRUKARTAL', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'AKTIVEBRUKARAR', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ENDRINGSTAL', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'SIDENAMN', 'SIDENAVN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SIDENAMNE', 'SIDENAVNE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAMNEROM', 'NAVNEROM', 'NAMESPACE' ),
- 'fullpagename' => array( '1', 'FULLTSIDENAMN', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'UNDERSIDENAMN', 'SUBPAGENAME' ),
- 'basepagename' => array( '1', 'HOVUDSIDENAMN', 'BASEPAGENAME' ),
- 'talkpagename' => array( '1', 'DISKUSJONSSIDENAMN', 'TALKPAGENAME' ),
- 'subst' => array( '0', 'LIMINN:', 'SUBST:' ),
- 'msgnw' => array( '0', 'IKWIKMELD:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'mini', 'miniatyr', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'mini=$1', 'miniatyr=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'høgre', 'høyre', 'right' ),
- 'img_left' => array( '1', 'venstre', 'left' ),
- 'img_none' => array( '1', 'ingen', 'none' ),
- 'img_width' => array( '1', '$1pk', '$1px' ),
- 'img_center' => array( '1', 'sentrum', 'center', 'centre' ),
- 'img_framed' => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
- 'img_link' => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALLENKJEE:', 'LOKALLENKEE:', 'LOCALURLE:' ),
- 'server' => array( '0', 'TENAR', 'TJENER', 'SERVER' ),
- 'servername' => array( '0', 'TENARNAMN', 'TJENERNAVN', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTSTIG', 'SKRIPTSTI', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'KJØNN:', 'GENDER:' ),
- 'currentweek' => array( '1', 'VEKENRNO', 'UKENRNÃ…', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'VEKEDAGNRNO', 'UKEDAGNRNÃ…', 'CURRENTDOW' ),
- 'revisionid' => array( '1', 'VERSJONSID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'VERSJONSDAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'VERSJONSDAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'VERSJONSMÃ…NAD', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'VERSJONSMÃ…NAD1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'VERSJONSÃ…R', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'VERSJONSTIDSTEMPEL', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'VERSJONSBRUKAR', 'REVISIONUSER' ),
- 'plural' => array( '0', 'FLEIRTAL:', 'PLURAL:' ),
- 'currentversion' => array( '1', 'VERSJONNO', 'CURRENTVERSION' ),
- 'language' => array( '0', '#SPRÃ…K:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'INNHALDSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'SIDERINAMNEROM', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
- 'filepath' => array( '0', 'FILSTIG', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'SIDERIKAT', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'protectionlevel' => array( '1', 'VERNENIVÃ…', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#omdiriger', '#REDIRECT' ),
+ 'notoc' => array( '0', '__INGAINNHALDSLISTE__', '__INGENINNHOLDSLISTE__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__INKJEGALLERI__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ALLTIDINNHALDSLISTE__', '__ALLTIDINNHOLDSLISTE__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INNHALDSLISTE__', '__INNHOLDSLISTE__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__INGABOLKENDRING__', '__INGABOLKREDIGERING__', '__INGENDELENDRING__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'MÃ…NADNO', 'MÃ…NEDNÃ…', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'MÃ…NADNONAMN', 'MÃ…NEDNÃ…NAVN', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'MÃ…NADNOKORT', 'MÃ…NEDNÃ…KORT', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'DAGNO', 'DAGNÃ…', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DAGNO2', 'DAGNÃ…2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'DAGNONAMN', 'DAGNÃ…NAVN', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'Ã…RNO', 'Ã…RNÃ…', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'TIDNO', 'TIDNÃ…', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'TIMENO', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'SIDETAL', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'INNHALDSSIDETAL', 'INNHOLDSSIDETALL', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FILTAL', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'BRUKARTAL', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AKTIVEBRUKARAR', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ENDRINGSTAL', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'SIDENAMN', 'SIDENAVN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SIDENAMNE', 'SIDENAVNE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAMNEROM', 'NAVNEROM', 'NAMESPACE' ),
+ 'fullpagename' => array( '1', 'FULLTSIDENAMN', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'UNDERSIDENAMN', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'HOVUDSIDENAMN', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'DISKUSJONSSIDENAMN', 'TALKPAGENAME' ),
+ 'subst' => array( '0', 'LIMINN:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'IKWIKMELD:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'mini', 'miniatyr', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'mini=$1', 'miniatyr=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'høgre', 'høyre', 'right' ),
+ 'img_left' => array( '1', 'venstre', 'left' ),
+ 'img_none' => array( '1', 'ingen', 'none' ),
+ 'img_width' => array( '1', '$1pk', '$1px' ),
+ 'img_center' => array( '1', 'sentrum', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
+ 'img_link' => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALLENKJEE:', 'LOKALLENKEE:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'TENAR', 'TJENER', 'SERVER' ),
+ 'servername' => array( '0', 'TENARNAMN', 'TJENERNAVN', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTSTIG', 'SKRIPTSTI', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'KJØNN:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'VEKENRNO', 'UKENRNÃ…', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'VEKEDAGNRNO', 'UKEDAGNRNÃ…', 'CURRENTDOW' ),
+ 'revisionid' => array( '1', 'VERSJONSID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'VERSJONSDAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'VERSJONSDAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'VERSJONSMÃ…NAD', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'VERSJONSMÃ…NAD1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'VERSJONSÃ…R', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VERSJONSTIDSTEMPEL', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'VERSJONSBRUKAR', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'FLEIRTAL:', 'PLURAL:' ),
+ 'currentversion' => array( '1', 'VERSJONNO', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#SPRÃ…K:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'INNHALDSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'SIDERINAMNEROM', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
+ 'filepath' => array( '0', 'FILSTIG', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'SIDERIKAT', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'protectionlevel' => array( '1', 'VERNENIVÃ…', 'PROTECTIONLEVEL' ),
);
$namespaceNames = array(
@@ -637,14 +638,15 @@ Meld gjerne problemet til ein [[Special:ListUsers/sysop|administrator]] og oppgj
'badarticleerror' => 'Handlinga kan ikkje utførast på denne sida.',
'cannotdelete' => 'Kunne ikkje slette sida eller fila «$1».
Ho kan allereie vere sletta av andre.',
+'cannotdelete-title' => 'Kan ikkje sletta sida «$1»',
'badtitle' => 'Feil i tittelen',
'badtitletext' => 'Den ønskte tittelen var ulovleg, tom eller feillenkja frå ein annan wiki. Kanskje inneheld han eitt eller fleire teikn som ikkje kan brukast i sidetitlar.',
-'perfcached' => 'Det følgjande er frå mellomlageret åt tenaren og er ikkje nødvendigvis oppdatert.',
-'perfcachedts' => 'Desse data er mellomlagra, og vart sist oppdaterte $1.',
+'perfcached' => 'Det følgjande er frå mellomlageret åt tenaren og er ikkje nødvendigvis oppdatert. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Desse data er mellomlagra, og vart sist oppdaterte $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Oppdatering av denne sida er slått av, og data her vil ikkje verte fornya.',
'wrong_wfQuery_params' => 'Feil parameter gjevne til wfQuery()<br />Funksjon: $1<br />Førespurnad: $2',
'viewsource' => 'Sjå kjelda',
-'viewsourcefor' => 'for $1',
+'viewsource-title' => 'Sjå kjelda til $1',
'actionthrottled' => 'Handlinga vart stoppa',
'actionthrottledtext' => 'For å hindre spamming kan du ikkje utføre denne handlinga for mange gonger på kort tid. Ver venleg og prøv igjen litt seinare.',
'protectedpagetext' => 'Denne sida er verna for å hindre endring.',
@@ -741,6 +743,7 @@ Grunna dette vil ikkje vitjande som nyttar denne IP-adressa kunna oppretta nye k
'noemailprefs' => 'Oppgje ei e-postadresse i innstillingane dine for at desse funksjonane skal verke.',
'emailconfirmlink' => 'Stadfest e-post-adressa di',
'invalidemailaddress' => 'E-postadressa kan ikkje nyttast sidan formatet truleg er feil. Skriv ei fungerande adresse eller tøm feltet.',
+'cannotchangeemail' => 'Epost-adresser knytta til brukarkonti kan ikkje endrast på denne wikien.',
'accountcreated' => 'Brukarkonto oppretta',
'accountcreatedtext' => 'Brukarkontoen til $1 er oppretta.',
'createaccount-title' => 'Oppretting av brukarkonto på {{SITENAME}}',
@@ -755,6 +758,7 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
# E-mail sending
'php-mail-error-unknown' => 'Ukjend feil i PHPs mail()-funksjon',
+'user-mail-no-addy' => '↓Prøvde å senda e-post utan e-postadresse',
# Change password dialog
'resetpass' => 'Endra passord',
@@ -775,24 +779,38 @@ Du kan allereie ha byta passordet, eller ha bede om å få eit nytt mellombels p
'resetpass-temp-password' => 'Mellombels passord:',
# Special:PasswordReset
-'passwordreset' => 'Attendestilling av passord',
-'passwordreset-text' => '↓Fyll ut dette skjemaet for å motta ei påminning om kontoopplysningane dine i ein e-post.',
-'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-username' => 'Brukarnamn:',
-'passwordreset-domain' => 'Domene:',
-'passwordreset-email' => '↓E-postadresse:',
-'passwordreset-emailtitle' => '↓Kontodetaljar på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nokon (sannsynleg deg, frå IP-adresse $1) ba om ei påminning om kontodetaljane dine for {{SITENAME}} ($4). Følgjane brukar {{PLURAL:$3|brukar|brukarar}} er assosiert med denne epost-adressa:
+'passwordreset' => 'Attendestilling av passord',
+'passwordreset-text' => '↓Fyll ut dette skjemaet for å motta ei påminning om kontoopplysningane dine i ein e-post.',
+'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-username' => 'Brukarnamn:',
+'passwordreset-domain' => 'Domene:',
+'passwordreset-capture' => 'Vis resulterande epost',
+'passwordreset-capture-help' => 'Huk av her dersom du vil sjå eposten (med førebels passord) i tillegg til at han blir sendt til brukaren.',
+'passwordreset-email' => '↓E-postadresse:',
+'passwordreset-emailtitle' => '↓Kontodetaljar på {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Nokon (sannsynleg deg, frå IP-adresse $1) ba om ei påminning om kontodetaljane dine for {{SITENAME}} ($4). Følgjane brukar {{PLURAL:$3|brukar|brukarar}} er assosiert med denne epost-adressa:
$2
{{PLURAL:$3|Dette førebelse passordet|Desse førebelse passorda}} vil løpe ut om {{PLURAL:$5|ein dag|$5 dagar}}.
Du bør logge inn og velje eit nytt passord no. Dersom nokon andre kom med denne førespurnaden, eller dersom du hugsar ditt opprinnelege passord, og du ikkje ynskjar å endre det, kan du ignorere denne eposten, og halde fram med å bruke ditt gamle passord.',
-'passwordreset-emailelement' => '↓Brukarnamn: $1
+'passwordreset-emailelement' => '↓Brukarnamn: $1
Mellombels passord: $2',
-'passwordreset-emailsent' => '↓Ei påminning har vorte sendt på e-post.',
+'passwordreset-emailsent' => '↓Ei påminning har vorte sendt på e-post.',
+'passwordreset-emailsent-capture' => 'Eposten under er sendt ut som ei påminning.',
+
+# Special:ChangeEmail
+'changeemail' => '↓Endre e-postadresse',
+'changeemail-header' => '↓Endre kontoen si e-postadresse',
+'changeemail-text' => '↓Fyll ut dette skjemaet for å endra di e-postadresse. Du må oppgje passordet ditt for å stadfesta endringa.',
+'changeemail-no-info' => '↓Du må vera pålogga for å få tilgang direkte til denne sida.',
+'changeemail-oldemail' => '↓Noverande e-postadresse:',
+'changeemail-newemail' => 'Ny e-postadresse:',
+'changeemail-none' => '↓(ingen)',
+'changeemail-submit' => '↓Endre e-post',
+'changeemail-cancel' => '↓Avbryt',
# Edit page toolbar
'bold_sample' => 'Halvfeit skrift',
@@ -857,9 +875,6 @@ Du kan kontakte $1 eller ein annan [[{{MediaWiki:Grouppage-sysop}}|administrator
IP-adressa di er $3, og blokkeringnummeret ditt er #$5.
Ver venleg og opplyse dette ved eventuelle førespurnader.",
'blockednoreason' => 'inga grunngjeving',
-'blockedoriginalsource' => "Kjeldekoden til '''$1''' er vist nedanfor:",
-'blockededitsource' => "Teksten i '''endringane dine''' på '''$1''' er vist nedanfor:",
-'whitelistedittitle' => 'Du lyt logge inn for å gjera endringar',
'whitelistedittext' => 'Du lyt $1 for å endre sider.',
'confirmedittext' => 'Du må stadfeste e-postadressa di før du kan endre sidene. Ver venleg og legg inn og stadfest e-postadressa di i [[Special:Preferences|innstillingane dine]].',
'nosuchsectiontitle' => 'Kan ikkje finna bolk',
@@ -1097,8 +1112,6 @@ Andre administratorar på {{SITENAME}} kan framleis sjå det gøymde innhaldet o
'revdelete-unsuppress' => 'Fjern avgrensingane på dei attoppretta versjonane',
'revdelete-log' => 'Ã…rsak:',
'revdelete-submit' => 'Bruk på {{PLURAL:$1|den valde versjonen|dei valde versjonane}}',
-'revdelete-logentry' => 'endra versjonsvisinga til [[$1]]',
-'logdelete-logentry' => 'endra visinga av loggoppføringane til [[$1]]',
'revdelete-success' => "'''Endringa av versjonsvisinga var vellukka.'''",
'revdelete-failure' => "'''Kunne ikkje oppatera korleis versjonen vert synt:'''
$1",
@@ -1110,15 +1123,6 @@ $1",
'revdel-restore-visible' => 'synlege versjonar',
'pagehist' => 'Sidehistorikk',
'deletedhist' => 'Sletta historikk',
-'revdelete-content' => 'innhald',
-'revdelete-summary' => 'Samandrag',
-'revdelete-uname' => 'brukarnamn',
-'revdelete-restricted' => 'la til avgrensingar for administratorar',
-'revdelete-unrestricted' => 'fjerna avgrensingar for administratorar',
-'revdelete-hid' => 'løynde $1',
-'revdelete-unhid' => 'gjorde $1 synleg',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|versjon|versjonar}}',
-'logdelete-log-message' => '$1 for {{PLURAL:$2|eitt element|$2 element}}',
'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldande revisjonen.
Han kan ikkje skjulast.',
'revdelete-show-no-access' => 'Feil under vising av objekt datert $2, $1: dette objektet har vorte markert "avgrensa".
@@ -1276,12 +1280,14 @@ Ver merksam på at registra deira kan vera utdaterte.',
'prefs-rc' => 'Siste endringar',
'prefs-watchlist' => 'Overvakingsliste',
'prefs-watchlist-days' => 'Tal på dagar som viser i overvakingslista:',
-'prefs-watchlist-days-max' => 'Høgst sju dagar',
+'prefs-watchlist-days-max' => 'Høgst {{PLURAL:$1|éin dag|$1 dagar}}',
'prefs-watchlist-edits' => 'Talet på endringar som viser i den utvida overvakingslista:',
'prefs-watchlist-edits-max' => 'Høgst 1000',
'prefs-watchlist-token' => 'Emne på overvakingslista:',
'prefs-misc' => 'Andre',
'prefs-resetpass' => 'Endra passord',
+'prefs-changeemail' => '↓Endre e-postadresse',
+'prefs-setemail' => '↓Oppgje ei e-postadresse',
'prefs-email' => 'Val for e-post',
'prefs-rendering' => 'Utsjånad',
'saveprefs' => 'Lagre',
@@ -1473,13 +1479,13 @@ Dette kan ikke tilbakestillast.',
'right-autopatrol' => 'FÃ¥ sine eigne endringar automatisk merkte som godkjende',
'right-patrolmarks' => 'Vis godkjende endringar i siste endringar',
'right-unwatchedpages' => 'Sjå lista over sider som ikkje er overvaka',
-'right-trackback' => 'Gje tilbakemelding',
'right-mergehistory' => 'Flette sidehistorikkar',
'right-userrights' => 'Endre alle brukarrettar',
'right-userrights-interwiki' => 'Endre rettar for brukarar på andre wikiar',
'right-siteadmin' => 'Låse og låse opp databasen',
'right-override-export-depth' => 'Eksporter sider inkludert lenkte sider til ei djupn på 5',
'right-sendemail' => 'Senda e-post til andre brukarar',
+'right-passwordreset' => 'Stilla attende passordet for ein brukar ([[Special:PasswordReset|spesialsida]])',
# User rights log
'rightslog' => 'Brukartilgangslogg',
@@ -1518,11 +1524,11 @@ Dette kan ikke tilbakestillast.',
'action-patrol' => 'merke andre endringar av andre brukar som patruljert',
'action-autopatrol' => 'merke endringane dine som partuljert',
'action-unwatchedpages' => 'vise lista over uovervaka sider',
-'action-trackback' => 'levere tilbakemelding',
'action-mergehistory' => 'flette historikken til denne sida',
'action-userrights' => 'endre alle brukarrettar',
'action-userrights-interwiki' => 'endre brukarrettar for brukarar på andre wikiar',
'action-siteadmin' => 'låse eller låse opp databasen',
+'action-sendemail' => 'senda e-postar',
# Recent changes
'nchanges' => '{{PLURAL:$1|Éi endring|$1 endringar}}',
@@ -1563,7 +1569,6 @@ Dette kan ikke tilbakestillast.',
'recentchangeslinked-feed' => 'Relaterte endringar',
'recentchangeslinked-toolbox' => 'Relaterte endringar',
'recentchangeslinked-title' => 'Endringar relaterte til «$1»',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'Det er ikkje gjort endringar på sidene som var lenkja hit i den oppgjevne perioden.',
'recentchangeslinked-summary' => "Denne spesialsida inneheld alle endringane som er gjort på sider som vert ''lenkja til'' frå denne (eller på sider i ein viss kategori). Dei av sidene du har på [[Special:Watchlist|overvakingslista]] di er '''utheva'''.",
'recentchangeslinked-page' => 'Sidenamn:',
@@ -1807,23 +1812,24 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
'filerevert-badversion' => 'Det finst ingen tidlegare lokal versjon av denne fila frå det oppgjevne tidspunktet.',
# File deletion
-'filedelete' => 'Slett $1',
-'filedelete-legend' => 'Slett fil',
-'filedelete-intro' => "Du er i ferd med å sletta fila '''[[Media:$1|$1]]''' i lag med heile historikken hennar.",
-'filedelete-intro-old' => "Du slettar versjonen av '''[[Media:$1|$1]]''' frå [$4 $3, $2].",
-'filedelete-comment' => 'Ã…rsak:',
-'filedelete-submit' => 'Slett',
-'filedelete-success' => "'''$1''' er sletta.",
-'filedelete-success-old' => "Versjonen av '''[[Media:$1|$1]]''' frå $3, $2 er sletta.",
-'filedelete-nofile' => "'''$1''' finst ikkje.",
-'filedelete-nofile-old' => "Det finst ingen arkivert versjon av '''$1''' med dei oppgjevne attributta.",
-'filedelete-otherreason' => 'Annan grunn/tilleggsgrunn:',
-'filedelete-reason-otherlist' => 'Annan grunn',
-'filedelete-reason-dropdown' => '*Vanlege grunnar for sletting
+'filedelete' => 'Slett $1',
+'filedelete-legend' => 'Slett fil',
+'filedelete-intro' => "Du er i ferd med å sletta fila '''[[Media:$1|$1]]''' i lag med heile historikken hennar.",
+'filedelete-intro-old' => "Du slettar versjonen av '''[[Media:$1|$1]]''' frå [$4 $3, $2].",
+'filedelete-comment' => 'Ã…rsak:',
+'filedelete-submit' => 'Slett',
+'filedelete-success' => "'''$1''' er sletta.",
+'filedelete-success-old' => "Versjonen av '''[[Media:$1|$1]]''' frå $3, $2 er sletta.",
+'filedelete-nofile' => "'''$1''' finst ikkje.",
+'filedelete-nofile-old' => "Det finst ingen arkivert versjon av '''$1''' med dei oppgjevne attributta.",
+'filedelete-otherreason' => 'Annan grunn/tilleggsgrunn:',
+'filedelete-reason-otherlist' => 'Annan grunn',
+'filedelete-reason-dropdown' => '*Vanlege grunnar for sletting
** Brot på opphavsretten
** Ligg dobbelt',
-'filedelete-edit-reasonlist' => 'Endre grunnar til sletting',
-'filedelete-maintenance' => 'Sletting og attoppretting af filer er mellombels ikkje mogleg på grunn av vedlikehald.',
+'filedelete-edit-reasonlist' => 'Endre grunnar til sletting',
+'filedelete-maintenance' => 'Sletting og attoppretting af filer er mellombels ikkje mogleg på grunn av vedlikehald.',
+'filedelete-maintenance-title' => 'Kan ikkje sletta fila',
# MIME search
'mimesearch' => 'MIME-søk',
@@ -1939,7 +1945,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
'listusers-editsonly' => 'Vis berre brukarar med endringar',
'listusers-creationsort' => 'Sorter etter opprettingsdato',
'usereditcount' => '{{PLURAL:$1|éi endring|$1 endringar}}',
-'usercreated' => 'Oppretta den $1 $2',
+'usercreated' => '{{GENDER:$3|Oppretta}} den $1 $2',
'newpages' => 'Nye sider',
'newpages-username' => 'Brukarnamn:',
'ancientpages' => 'Eldste sider',
@@ -2028,12 +2034,8 @@ Sjå òg [[Special:WantedCategories|ønska kategoriar]].',
'activeusers-noresult' => 'Ingen brukarar funne.',
# Special:Log/newusers
-'newuserlogpage' => 'Brukaropprettingslogg',
-'newuserlogpagetext' => 'Dette er ein logg over oppretta brukarkontoar.',
-'newuserlog-byemail' => 'passordet er sendt på e-post',
-'newuserlog-create-entry' => 'Ny brukar',
-'newuserlog-create2-entry' => 'oppretta kontoen $1',
-'newuserlog-autocreate-entry' => 'Konto oppretta automatisk',
+'newuserlogpage' => 'Brukaropprettingslogg',
+'newuserlogpagetext' => 'Dette er ein logg over oppretta brukarkontoar.',
# Special:ListGroupRights
'listgrouprights' => 'Rettar for brukargrupper',
@@ -2061,7 +2063,7 @@ Sjå òg [[Special:WantedCategories|ønska kategoriar]].',
'emailpagetext' => 'Du kan nytte skjemaet nedanfor til å sende ein e-post til denne brukaren.
E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukke opp i «frå»-feltet på denne e-posten, så mottakaren er i stand til å svare.',
'usermailererror' => 'E-post systemet gav feilmelding:',
-'defemailsubject' => '{{SITENAME}} e-post',
+'defemailsubject' => '{{SITENAME}} epost frå brukar "$1"',
'usermaildisabled' => 'Brukare-post slegen av',
'usermaildisabledtext' => 'Du kan ikkje senda e-postar til andre brukarar på wikien',
'noemailtitle' => 'Inga e-postadresse',
@@ -2112,7 +2114,7 @@ Om du seinare vil fjerne sida frå overvakingslista, klikk på «Fjern overvakin
'watchmethod-list' => 'sjekkar om dei overvaka sidene er vortne endra i det siste',
'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
'iteminvalidname' => 'Problem med «$1», ugyldig namn...',
-'wlnote' => 'Nedanfor er {{PLURAL:$1|den siste endringa|dei siste $1 endringane}} {{PLURAL:$2|den siste timen|dei siste $2 timane}}.',
+'wlnote' => "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.",
'wlshowlast' => 'Vis siste $1 timar $2 dagar $3',
'watchlist-options' => 'Alternativ for overvakingslista',
@@ -2172,8 +2174,6 @@ Tilbakemeldingar og anna hjelp:
'actioncomplete' => 'Ferdig',
'actionfailed' => 'Handlinga kunne ikkje verta utførd',
'deletedtext' => '«$1» er sletta. Sjå $2en for eit oversyn over dei siste slettingane.',
-'deletedarticle' => 'sletta «[[$1]]»',
-'suppressedarticle' => 'gøymde «[[$1]]»',
'dellogpage' => 'Slettelogg',
'dellogpagetext' => 'Her er ei liste over dei siste slettingane.',
'deletionlog' => 'slettelogg',
@@ -2292,7 +2292,6 @@ Innhaldet i dei sletta versjonane er berre tilgjengeleg for administratorar.',
'undeletereset' => 'Nullstill',
'undeleteinvert' => 'Inverter val',
'undeletecomment' => 'Ã…rsak:',
-'undeletedarticle' => 'attoppretta «[[$1]]»',
'undeletedrevisions' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} attoppretta.',
'undeletedrevisions-files' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} og {{PLURAL:$2|éi fil|$2 filer}} er attoppretta',
'undeletedfiles' => '{{PLURAL:$1|Éi fil|$1 filer}} er attoppretta',
@@ -2424,6 +2423,7 @@ Sjå [[Special:BlockList|blokkeringslista]] for alle blokkeringane.',
'blocklist-userblocks' => 'Gøym kontoblokkeringar',
'blocklist-tempblocks' => 'Gøym mellombelse blokkeringar',
'blocklist-addressblocks' => 'Gøym einskilde IP-blokkeringar',
+'blocklist-rangeblocks' => 'Gøym intervallblokkeringar',
'blocklist-timestamp' => 'Tidsmerkje',
'blocklist-target' => 'MÃ¥l',
'blocklist-expiry' => 'Endar',
@@ -2445,6 +2445,7 @@ Sjå [[Special:BlockList|blokkeringslista]] for alle blokkeringane.',
'unblocklink' => 'opphev blokkering',
'change-blocklink' => 'endra blokkering',
'contribslink' => 'bidrag',
+'emaillink' => 'send e-post',
'autoblocker' => 'Automatisk blokkert fordi du deler IP-adresse med [[User:$1|$1]]. Grunngjeving gjeve for blokkeringa av $1 var: «$2».',
'blocklogpage' => 'Blokkeringslogg',
'blocklog-showlog' => 'Denne brukaren har tidlegare vorte blokkert.
@@ -2554,9 +2555,6 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
'movepage-page-moved' => 'Sida $1 har blitt flytta til $2.',
'movepage-page-unmoved' => 'Sida $1 kunne ikkje flyttast til $2.',
'movepage-max-pages' => 'Grensa på {{PLURAL:$1|éi side|$1 sider}} er nådd; ingen fleire sider kjem til å verte flytta automatisk.',
-'1movedto2' => '«[[$1]]» flytt til «[[$2]]»',
-'1movedto2_redir' => '«[[$1]]» flytt over omdirigering til «[[$2]]»',
-'move-redirect-suppressed' => 'inga omdirigering',
'movelogpage' => 'Flyttelogg',
'movelogpagetext' => 'Under er ei liste over sider som er flytte.',
'movesubpage' => '{{PLURAL:$1|Underside|Undersider}}',
@@ -2569,7 +2567,7 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flytting?',
'delete_and_move_confirm' => 'Ja, slett sida',
-'delete_and_move_reason' => 'Sletta for å gje rom for flytting',
+'delete_and_move_reason' => 'Sletta for å gi rom for flytting frå "[[$1]]"',
'selfmove' => 'Kjelde- og måltitlane er like; kan ikkje flytte sida over seg sjølv.',
'immobile-source-namespace' => 'Kan ikkje flytte sider i namnerommet «$1»',
'immobile-target-namespace' => 'Kan ikkje flytte sider til namnerommet «$1»',
@@ -2602,6 +2600,7 @@ Dersom du berre vil ha noverande versjon, kan du også bruke ei lenkje, til døm
'exportcuronly' => 'Berre eksporter siste versjonen, ikkje med heile historikken.',
'exportnohistory' => "----
'''Merk:''' Å eksportere heile sidehistorikkar gjennom dette skjemaet er slått av grunna problem med ytinga.",
+'exportlistauthors' => 'Tak med ei heil liste over bidragsytarar for kvar side',
'export-submit' => 'Eksporter',
'export-addcattext' => 'Legg til sider frå kategori:',
'export-addcat' => 'Legg til',
@@ -2675,6 +2674,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
'import-upload' => 'Last opp XML-data',
'import-token-mismatch' => 'Mista sesjonsdata. Ver venleg og prøv om att.',
'import-invalid-interwiki' => 'Kan ikkje importera frå den valde wikien.',
+'import-error-edit' => '«$1» blei ikkje importert av di du ikkje har løyve til å redigere henne.',
+'import-error-create' => 'Side $1 blei ikkje importert av di du ikkje har løyve til å redigere henne.',
# Import log
'importlogpage' => 'Importeringslogg',
@@ -2835,9 +2836,6 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
# Patrol log
'patrol-log-page' => 'Patruljeringslogg',
'patrol-log-header' => 'Dette er ein logg over patruljerte sideversjonar.',
-'patrol-log-line' => 'merkte $1 av $2 godkjend $3',
-'patrol-log-auto' => '(automatisk)',
-'patrol-log-diff' => 'versjon $1',
'log-show-hide-patrol' => '$1 patruljeringslogg',
# Image deletion
@@ -2856,21 +2854,22 @@ $1',
'nextdiff' => 'Nyare endring →',
# Media information
-'mediawarning' => "'''Åtvaring''': Denne fila kan innehalda skadeleg programkode, ved å køyra programmet kan systemet ditt ta skade.",
-'imagemaxsize' => "Avgrens storleiken for bilete:<br />''(for sider som skildrar filer)''",
-'thumbsize' => 'Miniatyrstørrelse:',
-'widthheightpage' => '$1 × $2, {{PLURAL:$3|éi side|$3 sider}}',
-'file-info' => 'filstorleik: $1, MIME-type: $2',
-'file-info-size' => '$1 × $2 pikslar, filstorleik: $3, MIME-type: $4',
-'file-nohires' => '<small>Høgare oppløysing er ikkje tilgjengeleg.</small>',
-'svg-long-desc' => 'SVG-fil, standardoppløysing: $1 × $2 pikslar, filstorleik: $3',
-'show-big-image' => 'Full oppløysing',
-'show-big-image-other' => '<small>Andre oppløysingar: $1.</small>',
-'show-big-image-size' => '$1 × $2 pikslar',
-'file-info-gif-looped' => 'gjentatt',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|rame|ramer}}',
-'file-info-png-looped' => '↓oppatteke',
-'file-info-png-repeat' => 'spela av {{PLURAL:$1|éin gong|$1 gonger}}',
+'mediawarning' => "'''Åtvaring''': Denne fila kan innehalda skadeleg programkode, ved å køyra programmet kan systemet ditt ta skade.",
+'imagemaxsize' => "Avgrens storleiken for bilete:<br />''(for sider som skildrar filer)''",
+'thumbsize' => 'Miniatyrstørrelse:',
+'widthheightpage' => '$1 × $2, {{PLURAL:$3|éi side|$3 sider}}',
+'file-info' => 'filstorleik: $1, MIME-type: $2',
+'file-info-size' => '$1 × $2 pikslar, filstorleik: $3, MIME-type: $4',
+'file-nohires' => 'Høgare oppløysing er ikkje tilgjengeleg.',
+'svg-long-desc' => 'SVG-fil, standardoppløysing: $1 × $2 pikslar, filstorleik: $3',
+'show-big-image' => 'Full oppløysing',
+'show-big-image-preview' => 'Storleiken på førehandsvisinga: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Anna oppløysing|Andre oppløysingar}}: $1.',
+'show-big-image-size' => '$1 × $2 pikslar',
+'file-info-gif-looped' => 'gjentatt',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|rame|ramer}}',
+'file-info-png-looped' => '↓oppatteke',
+'file-info-png-repeat' => 'spela av {{PLURAL:$1|éin gong|$1 gonger}}',
# Special:NewFiles
'newimages' => 'Filgalleri',
@@ -3303,13 +3302,6 @@ Denne stadfestingskoden vert forelda $4.',
'scarytranscludefailed' => '[Henting av mal for $1 gjekk ikkje]',
'scarytranscludetoolong' => '[URL-en er for lang]',
-# Trackbacks
-'trackbackbox' => 'Attendelenkjer for denne sida:<br />
-$1',
-'trackbackremove' => '([$1 Slett])',
-'trackbacklink' => 'Attendelenkje',
-'trackbackdeleteok' => 'Attendelenkja vart sletta.',
-
# Delete conflict
'deletedwhileediting' => "'''Åtvaring:''' Denne sida har vorte sletta etter du starta å endre henne!",
'confirmrecreate' => "Brukaren «[[User:$1|$1]]» ([[User talk:$1|brukardiskusjon]]) sletta denne sida medan du endra henne, og gav denne grunnen: ''$2''
@@ -3390,6 +3382,9 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
'watchlisttools-edit' => 'Vis og endre overvakingslista',
'watchlisttools-raw' => 'Endre på overvakingslista i råformat',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ukjend tilleggsmerking «$1»',
'duplicate-defaultsort' => 'Åtvaring: Standarsorteringa «$2» tar over for den tidlegare sorteringa «$1».',
@@ -3515,4 +3510,61 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
'sqlite-no-fts' => '$1 utan støtte for fulltekstsøk',
+# New logging system
+'logentry-delete-delete' => '$1 sletta sida $3',
+'logentry-delete-restore' => '$1 attoppretta sida $3',
+'revdelete-content-hid' => 'innhald gøymt',
+'revdelete-summary-hid' => 'endringsamandrag gøymt',
+'revdelete-restricted' => 'la til avgrensingar for administratorar',
+'revdelete-unrestricted' => 'fjerna avgrensingar for administratorar',
+'logentry-move-move' => '$1 flytte sida $3 til $4',
+'logentry-move-move-noredirect' => '$1 flytte sida $3 til $4 utan å lata etter ei omdirigering',
+'logentry-move-move_redir' => '$1 flytte sida $3 til $4 over ei omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 flytte sida $3 til $4 over ei omdirigering utan å lata etter ei omdirigering',
+'logentry-newusers-newusers' => '$1 oppretta ein brukarkonto',
+'logentry-newusers-create' => '$1 oppretta ein brukarkonto',
+'logentry-newusers-create2' => '$1 oppretta brukarkontoen $3',
+'logentry-newusers-autocreate' => 'Kontoen $1 vart oppretta av seg sjølv',
+'newuserlog-byemail' => 'passordet er sendt på e-post',
+
+# Feedback
+'feedback-subject' => 'Emne:',
+'feedback-message' => 'Melding:',
+'feedback-cancel' => 'Bryt av',
+'feedback-submit' => 'Send attendemelding',
+'feedback-adding' => 'Legg til attendemeldinga til sida...',
+'feedback-error1' => 'Feil: Ukjent resultat frå API',
+'feedback-error2' => 'Feil: Brigdinga gjekk ikkje',
+'feedback-error3' => 'Feil: Saknar svar frå API',
+
+# API errors
+'api-error-badaccess-groups' => 'Du har ikkje løyve til å lasta opp filer til wikien.',
+'api-error-duplicate' => 'Det finst {{PLURAL:$1|[$2 ei anna fil]|[$2 andre filer]}} på nettstaden med same innhaldet.',
+'api-error-duplicate-archive' => 'Det fanst {{PLURAL:$1|[$2 ei anna fil]|[$2 andre filer]}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Tvifelt fil|Tvifelte filer}} som alt er sletta',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Tvifelt fil|Tvifelte filer}}',
+'api-error-empty-file' => 'Fila du sende var tom.',
+'api-error-emptypage' => 'Det er ikkje tillate å oppretta nye tomme sider.',
+'api-error-fetchfileerror' => 'Intern feil: Noko gjekk gale då fila vart henta.',
+'api-error-file-too-large' => 'Fila du sende var for stor.',
+'api-error-filename-tooshort' => 'Filnamnet er for stutt.',
+'api-error-filetype-banned' => 'Denne filtypen er ikkje tillaten.',
+'api-error-filetype-missing' => 'Fila saknar ei ending.',
+'api-error-http' => 'Intern feil: kan ikkje kopla til tenaren.',
+'api-error-illegal-filename' => 'Filnamnet er ikkje tillate.',
+'api-error-internal-error' => 'Intern feil: Noko gjekk gale med handsaminga av opplastinga di til wikien.',
+'api-error-invalid-file-key' => 'Intern feil: Fila vart ikkje funnen i mellombels lagringsplass.',
+'api-error-mustbeloggedin' => 'Du lyt vera innlogga for å lasta opp filer.',
+'api-error-noimageinfo' => 'Opplastinga gjekk greitt, men tenaren gav oss ikkje noko informasjon om fila.',
+'api-error-ok-but-empty' => 'Intern feil: ikkje noko svar frå tenaren.',
+'api-error-overwrite' => 'Det er ikkje tillate å skriva over filer som alt finst.',
+'api-error-timeout' => 'Tenaren svara ikkje innan tida svar var venta.',
+'api-error-unclassified' => 'Det oppstod ein ukjend feil.',
+'api-error-unknown-code' => 'Ukjend feil: «$1»',
+'api-error-unknown-error' => 'Intern feil: Noko gjekk gale då fila di vart freista lasta opp.',
+'api-error-unknown-warning' => 'Ukjend åtvaring: $1',
+'api-error-unknownerror' => 'Ukjend feil: «$1».',
+'api-error-uploaddisabled' => 'Det er ikkje høve til å lasta opp filer til wikien.',
+'api-error-verification-error' => 'Fila kan vera øydelagd eller ha rang filending.',
+
);
diff --git a/languages/messages/MessagesNo.php b/languages/messages/MessagesNo.php
index 968847c2..85d565cb 100644
--- a/languages/messages/MessagesNo.php
+++ b/languages/messages/MessagesNo.php
@@ -6,3745 +6,7 @@
*
* @ingroup Language
* @file
- *
- * @author Audun
- * @author Boivie
- * @author Brik
- * @author Byrial
- * @author Eirik
- * @author EivindJ
- * @author Event
- * @author Finnrind
- * @author Guaca
- * @author H92
- * @author Harald Khan
- * @author Jon Harald Søby
- * @author Jóna Þórunn
- * @author Kph
- * @author Kph-no
- * @author Laaknor
- * @author Najami
- * @author Nghtwlkr
- * @author Nsaa
- * @author Purodha
- * @author Qaqqalik
- * @author Samuelsen
- * @author Simny
- * @author Sjurhamre
- * @author Stigmj
- * @author Teak
- * @author לערי ריינה×רט
+ * @comment Deprecated language code. Falls back to 'nb'.
*/
-$bookstoreList = array(
- 'Antikvariat.net' => 'http://www.antikvariat.net/',
- 'Frida' => 'http://wo.uio.no/as/WebObjects/frida.woa/wa/fres?action=sok&isbn=$1&visParametre=1&sort=alfabetisk&bs=50',
- 'Bibsys' => 'http://ask.bibsys.no/ask/action/result?cmd=&kilde=biblio&fid=isbn&term=$1&op=and&fid=bd&term=&arstall=&sortering=sortdate-&treffPrSide=50',
- 'Akademika' => 'http://www.akademika.no/sok.php?ts=4&sok=$1',
- 'Haugenbok' => 'http://www.haugenbok.no/resultat.cfm?st=extended&isbn=$1',
- 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
-);
-
-$namespaceNames = array(
- NS_MEDIA => 'Medium',
- NS_SPECIAL => 'Spesial',
- NS_TALK => 'Diskusjon',
- NS_USER => 'Bruker',
- NS_USER_TALK => 'Brukerdiskusjon',
- NS_PROJECT_TALK => '$1-diskusjon',
- NS_FILE => 'Fil',
- NS_FILE_TALK => 'Fildiskusjon',
- NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki-diskusjon',
- NS_TEMPLATE => 'Mal',
- NS_TEMPLATE_TALK => 'Maldiskusjon',
- NS_HELP => 'Hjelp',
- NS_HELP_TALK => 'Hjelpdiskusjon',
- NS_CATEGORY => 'Kategori',
- NS_CATEGORY_TALK => 'Kategoridiskusjon',
-);
-
-$namespaceAliases = array(
- 'Bilde' => NS_FILE,
- 'Bildediskusjon' => NS_FILE_TALK,
-);
-
-$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
-$linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
-
-$dateFormats = array(
- 'mdy time' => 'H:i',
- 'mdy date' => 'M j., Y',
- 'mdy both' => 'M j., Y "kl." H:i',
-
- 'dmy time' => 'H:i',
- 'dmy date' => 'j. M Y',
- 'dmy both' => 'j. M Y "kl." H:i',
-
- 'ymd time' => 'H:i',
- 'ymd date' => 'Y M j.',
- 'ymd both' => 'Y M j. "kl." H:i',
-);
-
-$specialPageAliases = array(
- 'Activeusers' => array( 'Aktive_brukere' ),
- 'Allmessages' => array( 'Alle_systembeskjeder' ),
- 'Allpages' => array( 'Alle_sider' ),
- 'Ancientpages' => array( 'Gamle_sider' ),
- 'Blankpage' => array( 'Blank_side' ),
- 'Block' => array( 'Blokker', 'Blokker_IP', 'Blokker_bruker' ),
- 'Blockme' => array( 'Blokker_meg' ),
- 'Booksources' => array( 'Bokkilder' ),
- 'BrokenRedirects' => array( 'Ødelagte_omdirigeringer' ),
- 'Categories' => array( 'Kategorier' ),
- 'ChangePassword' => array( 'Endre_passord', 'TIlbakestill_passord' ),
- 'ComparePages' => array( 'Sammenlign_sider' ),
- 'Confirmemail' => array( 'Bekreft_e-postadresse' ),
- 'Contributions' => array( 'Bidrag' ),
- 'CreateAccount' => array( 'Opprett_konto' ),
- 'Deadendpages' => array( 'Blindveisider' ),
- 'DeletedContributions' => array( 'Slettede_bidrag' ),
- 'Disambiguations' => array( 'Pekere' ),
- 'DoubleRedirects' => array( 'Doble_omdirigeringer' ),
- 'Emailuser' => array( 'E-post' ),
- 'Export' => array( 'Eksporter' ),
- 'Fewestrevisions' => array( 'Færrest_revisjoner' ),
- 'FileDuplicateSearch' => array( 'Filduplikatsøk' ),
- 'Filepath' => array( 'Filsti' ),
- 'Import' => array( 'Importer' ),
- 'Invalidateemail' => array( 'Ugyldiggjøre_e-post' ),
- 'BlockList' => array( 'Blokkeringsliste', 'IP-blokkeringsliste' ),
- 'LinkSearch' => array( 'Lenkesøk' ),
- 'Listadmins' => array( 'Administratorliste', 'Administratorer' ),
- 'Listbots' => array( 'Robotliste', 'Liste_over_roboter' ),
- 'Listfiles' => array( 'Filliste', 'Bildeliste', 'Billedliste' ),
- 'Listgrouprights' => array( 'Grupperettigheter' ),
- 'Listredirects' => array( 'Omdirigeringsliste' ),
- 'Listusers' => array( 'Brukerliste' ),
- 'Lockdb' => array( 'LÃ¥s_database' ),
- 'Log' => array( 'Logg', 'Logger' ),
- 'Lonelypages' => array( 'Foreldreløse_sider' ),
- 'Longpages' => array( 'Lange_sider' ),
- 'MergeHistory' => array( 'Flett_historikk' ),
- 'MIMEsearch' => array( 'MIME-søk' ),
- 'Mostcategories' => array( 'Flest_kategorier' ),
- 'Mostimages' => array( 'Mest_lenkede_filer', 'Flest_filer', 'Flest_bilder' ),
- 'Mostlinked' => array( 'Mest_lenkede_sider', 'Mest_lenket' ),
- 'Mostlinkedcategories' => array( 'Mest_lenkede_kategorier', 'Mest_brukte_kategorier' ),
- 'Mostlinkedtemplates' => array( 'Mest_lenkede_maler', 'Mest_brukte_maler' ),
- 'Mostrevisions' => array( 'Flest_revisjoner' ),
- 'Movepage' => array( 'Flytt_side' ),
- 'Mycontributions' => array( 'Mine_bidrag' ),
- 'Mypage' => array( 'Min_side' ),
- 'Mytalk' => array( 'Min_diskusjon' ),
- 'Newimages' => array( 'Nye_filer', 'Nye_bilder' ),
- 'Newpages' => array( 'Nye_sider' ),
- 'PasswordReset' => array( 'Nullstill_passord' ),
- 'Popularpages' => array( 'Populære_sider' ),
- 'Preferences' => array( 'Innstillinger' ),
- 'Prefixindex' => array( 'Prefiksindeks' ),
- 'Protectedpages' => array( 'Beskyttede_sider' ),
- 'Protectedtitles' => array( 'Beskyttede_titler' ),
- 'Randompage' => array( 'Tilfeldig', 'Tilfeldig_side' ),
- 'Randomredirect' => array( 'Tilfeldig_omdirigering' ),
- 'Recentchanges' => array( 'Siste_endringer' ),
- 'Recentchangeslinked' => array( 'Relaterte_endringer' ),
- 'Revisiondelete' => array( 'Revisjonssletting' ),
- 'RevisionMove' => array( 'Revisjonsflytting' ),
- 'Search' => array( 'Søk' ),
- 'Shortpages' => array( 'Korte_sider' ),
- 'Specialpages' => array( 'Spesialsider' ),
- 'Statistics' => array( 'Statistikk' ),
- 'Tags' => array( 'Tagger' ),
- 'Unblock' => array( 'Avblokker' ),
- 'Uncategorizedcategories' => array( 'Ukategoriserte_kategorier' ),
- 'Uncategorizedimages' => array( 'Ukategoriserte_filer', 'Ukategoriserte_bilder' ),
- 'Uncategorizedpages' => array( 'Ukategoriserte_sider' ),
- 'Uncategorizedtemplates' => array( 'Ukategoriserte_maler' ),
- 'Undelete' => array( 'Gjenopprett' ),
- 'Unlockdb' => array( 'Ã…pne_database' ),
- 'Unusedcategories' => array( 'Ubrukte_kategorier' ),
- 'Unusedimages' => array( 'Ubrukte_filer', 'Ubrukte_bilder' ),
- 'Unusedtemplates' => array( 'Ubrukte_maler' ),
- 'Unwatchedpages' => array( 'Uovervåkede_sider' ),
- 'Upload' => array( 'Last_opp' ),
- 'Userlogin' => array( 'Logg_inn' ),
- 'Userlogout' => array( 'Logg_ut' ),
- 'Userrights' => array( 'Brukerrettigheter' ),
- 'Version' => array( 'Versjon' ),
- 'Wantedcategories' => array( 'Ønskede_kategorier' ),
- 'Wantedfiles' => array( 'Ønskede_filer' ),
- 'Wantedpages' => array( 'Ønskede_sider', 'Ødelagte_lenker' ),
- 'Wantedtemplates' => array( 'Ønskede_maler' ),
- 'Watchlist' => array( 'Overvåkningsliste', 'Overvåkingsliste' ),
- 'Whatlinkshere' => array( 'Lenker_hit' ),
- 'Withoutinterwiki' => array( 'Uten_interwiki' ),
-);
-
-$magicWords = array(
- 'redirect' => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
- 'notoc' => array( '0', '__INGENINNHOLDSFORTEGNELSE__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__INTETGALLERI__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__TVINGINNHOLDSFORTEGNELSE__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INNHOLDSFORTEGNELSE__', '__TOC__' ),
- 'noeditsection' => array( '0', '__INGENSEKSJONSREDIGERING__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'NÅVÆRENDEMÅNED', 'NÅVÆRENDEMÅNED2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'NÅVÆRENDEMÅNED1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NÅVÆRENDEMÅNEDSNAVN', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NÅVÆRENDEMÅNEDSNAVNGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'NÅVÆRENDEMÅNEDSNAVNKORT', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'NÅVÆRENDEDAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'NÅVÆRENDEDAG2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NÅVÆRENDEDAGSNAVN', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'NÅVÆRENDEÅR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'NÅVÆRENDETID', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'NÅVÆRENDETIME', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALMÃ…NED', 'LOKALMÃ…NED2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALMÃ…NED1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKALMÃ…NEDSNAVN', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKALMÃ…NEDSNAVNGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LOKALMÃ…NEDSNAVNKORT', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALDAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKALDAGSNAVN', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKALTÃ…R', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALTID', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKALTIME', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ANTALLSIDER', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ANTALLARTIKLER', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ANTALLFILER', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ANTALLBRUKERE', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ANTALLAKTIVEBRUKERE', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ANTALLREDIGERINGER', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'ANTALLVISNINGER', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'SIDENAVN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SIDENAVNE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAVNEROM', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NAVNEROME', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'DISKUSJONSROM', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'DISKUSJONSROME', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'SUBJEKTROM', 'ARTIKKELROM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'SUBJEKTROME', 'ARTIKKELROME', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'FULLTSIDENAVN', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'FULLTSIDENAVNE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'UNDERSIDENAVN', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'UNDERSIDENAVNE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'GRUNNSIDENAVN', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'GRUNNSIDENAVNE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'DISKUSJONSSIDENAVN', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'DISKUSJONSSIDENAVNE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'SUBJEKTSIDENAVN', 'ARTIKKELSIDENAVN', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'SUBJEKTSIDENAVNE', 'ARTIKKELSIDENAVNE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'img_thumbnail' => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'høyre', 'right' ),
- 'img_left' => array( '1', 'venstre', 'left' ),
- 'img_none' => array( '1', 'ingen', 'none' ),
- 'img_center' => array( '1', 'sentrer', 'senter', 'center', 'centre' ),
- 'img_framed' => array( '1', 'ramme', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'ingenramme', 'frameless' ),
- 'img_page' => array( '1', 'side=$1', 'side $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'portrett', 'portrett=$1', 'portrett_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_baseline' => array( '1', 'grunnlinje', 'baseline' ),
- 'img_top' => array( '1', 'topp', 'top' ),
- 'img_middle' => array( '1', 'midt', 'middle' ),
- 'img_bottom' => array( '1', 'bunn', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekst-bunn', 'text-bottom' ),
- 'img_link' => array( '1', 'lenke=$1', 'link=$1' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'ARTIKKELSTI', 'ARTICLEPATH' ),
- 'server' => array( '0', 'TJENER', 'SERVER' ),
- 'servername' => array( '0', 'TJENERNAVN', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTSTI', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'STILSTI', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMMATIKK:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'KJØNN:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__INGENTITTELKONVERTERING__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__INGENINNHOLDSKONVERTERING__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'NÅVÆRENDEUKE', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'NÅVÆRENDEUKEDAG', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALUKE', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'LOKALUKEDAG', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'REVISJONSID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'REVISJONSDAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'REVISJONSDAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'REVISJONSMÃ…NED', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'REVISJONSMÃ…NED1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'REVISJONSÃ…R', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'REVISJONSTIDSSTEMPEL', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'REVISJONSBRUKER', 'REVISIONUSER' ),
- 'plural' => array( '0', 'FLERTALL:', 'PLURAL:' ),
- 'raw' => array( '0', 'RÃ…:', 'RAW:' ),
- 'displaytitle' => array( '1', 'VISTITTEL', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__NYSEKSJONSLENKE__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__INGENNYSEKSJONSLENKE__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'NÅVÆRENDEVERSJON', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'NÅVÆRENDETIDSSTEMPEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKALTTIDSSTEMPEL', 'LOCALTIMESTAMP' ),
- 'contentlanguage' => array( '1', 'INNHOLDSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'SIDERINAVNEROM:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ANTALLADMINISTRATORER', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'spesial', 'special' ),
- 'defaultsort' => array( '1', 'STANDARDSORTERING', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'FILSTI:', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__SKJULTKATEGORI__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'SIDERIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'SIDESTØRRELSE', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEKSER__', '__INDEX__' ),
- 'noindex' => array( '1', '__INGENINDEKSERING__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NUMMERIGRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__STATISTOMDIRIGERING__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'BESKYTTELSESNIVÃ…', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'datoformat', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'STI', 'PATH' ),
- 'url_query' => array( '0', 'SPØRRING', 'QUERY' ),
-);
-
-$messages = array(
-# User preference toggles
-'tog-underline' => 'Strek under lenker:',
-'tog-highlightbroken' => 'Formater lenker til ikke-eksisterende sider <a href="" class="new">slik</a> (alternativt: slik<a href="" class="internal">?</a>).',
-'tog-justify' => 'Blokkjusterte avsnitt',
-'tog-hideminor' => 'Skjul mindre redigeringer i siste endringer',
-'tog-hidepatrolled' => 'Skjul patruljerte redigeringer i siste endringer',
-'tog-newpageshidepatrolled' => 'Skjul patruljerte sider fra listen over nye sider.',
-'tog-extendwatchlist' => 'Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste',
-'tog-usenewrc' => 'Forbedret siste endringer (krever JavaScript)',
-'tog-numberheadings' => 'Autonummerer overskrifter',
-'tog-showtoolbar' => 'Vis verktøylinje (JavaScript)',
-'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke (JavaScript)',
-'tog-editsection' => 'Rediger avsnitt ved hjelp av [rediger]-lenke',
-'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift (JavaScript)',
-'tog-showtoc' => 'Vis innholdsfortegnelse (for sider med flere enn tre avsnitt)',
-'tog-rememberpassword' => 'Husk meg i denne nettleseren (i høyst $1 {{PLURAL:$1|dag|dager}})',
-'tog-watchcreations' => 'Overvåk sider jeg oppretter',
-'tog-watchdefault' => 'Overvåk alle sider jeg redigerer',
-'tog-watchmoves' => 'Overvåk sider jeg flytter',
-'tog-watchdeletion' => 'Overvåk sider jeg sletter',
-'tog-minordefault' => 'Merk i utgangspunktet alle redigeringer som mindre',
-'tog-previewontop' => 'Flytt forhåndsvisningen foran redigeringsboksen',
-'tog-previewonfirst' => 'Bruk forhåndsvisning ved første redigering av en side',
-'tog-nocache' => 'Deaktiver nettlesermellomlagring av sider («caching»)',
-'tog-enotifwatchlistpages' => 'Send meg en e-post når sider på overvåkningslisten blir endret',
-'tog-enotifusertalkpages' => 'Send meg en e-post ved endringer av brukerdiskusjonssiden min',
-'tog-enotifminoredits' => 'Send meg en e-post også ved mindre sideendringer',
-'tog-enotifrevealaddr' => 'Vis min e-postadresse i utgående meldinger',
-'tog-shownumberswatching' => 'Vis antall overvåkende brukere',
-'tog-oldsig' => 'Nåværende signatur:',
-'tog-fancysig' => 'Signatur som wikitekst uten automatisk lenke',
-'tog-externaleditor' => 'Bruk ekstern behandler som standard (kun for viderekomne, 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, 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 egne endringer fra overvåkningslisten',
-'tog-watchlisthidebots' => 'Skjul robotendringer fra overvåkningslisten',
-'tog-watchlisthideminor' => 'Skjul mindre endringer fra overvåkningslisten',
-'tog-watchlisthideliu' => 'Skjul endringer av innloggede brukere fra overvåkningslisten',
-'tog-watchlisthideanons' => 'Skjul endringer av anonyme brukere fra overvåkningslisten',
-'tog-watchlisthidepatrolled' => 'Skjul patruljerte endringer fra overvåkningslisten',
-'tog-nolangconversion' => 'Slå av variantkonvertering',
-'tog-ccmeonemails' => 'Send meg kopier av e-poster jeg sender til andre brukere',
-'tog-diffonly' => 'Ikke vis sideinnhold under differ',
-'tog-showhiddencats' => 'Vis skjulte kategorier',
-'tog-norollbackdiff' => 'Ikke vis diff etter tilbakestilling',
-
-'underline-always' => 'Alltid',
-'underline-never' => 'Aldri',
-'underline-default' => 'Bruk nettleserstandard',
-
-# Font style option in Special:Preferences
-'editfont-style' => 'Endre stilen for skrifttypen i området:',
-'editfont-default' => 'Nettleserstandard',
-'editfont-monospace' => 'Skrift med fast bredde',
-'editfont-sansserif' => 'Sans-serif',
-'editfont-serif' => 'Serif',
-
-# Dates
-'sunday' => 'søndag',
-'monday' => 'mandag',
-'tuesday' => 'tirsdag',
-'wednesday' => 'onsdag',
-'thursday' => 'torsdag',
-'friday' => 'fredag',
-'saturday' => 'lørdag',
-'sun' => 'søn',
-'mon' => 'man',
-'tue' => 'tir',
-'wed' => 'ons',
-'thu' => 'tor',
-'fri' => 'fre',
-'sat' => 'lør',
-'january' => 'januar',
-'february' => 'februar',
-'march' => 'mars',
-'april' => 'april',
-'may_long' => 'mai',
-'june' => 'juni',
-'july' => 'juli',
-'august' => 'august',
-'september' => 'september',
-'october' => 'oktober',
-'november' => 'november',
-'december' => 'desember',
-'january-gen' => 'januar',
-'february-gen' => 'februar',
-'march-gen' => 'mars',
-'april-gen' => 'april',
-'may-gen' => 'mai',
-'june-gen' => 'juni',
-'july-gen' => 'juli',
-'august-gen' => 'august',
-'september-gen' => 'september',
-'october-gen' => 'oktober',
-'november-gen' => 'november',
-'december-gen' => 'desember',
-'jan' => 'jan',
-'feb' => 'feb',
-'mar' => 'mar',
-'apr' => 'apr',
-'may' => 'mai',
-'jun' => 'jun',
-'jul' => 'jul',
-'aug' => 'aug',
-'sep' => 'sep',
-'oct' => 'okt',
-'nov' => 'nov',
-'dec' => 'des',
-
-# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
-'category_header' => 'Sider i kategorien «$1»',
-'subcategories' => 'Underkategorier',
-'category-media-header' => 'Filer i kategorien «$1»',
-'category-empty' => "''Denne kategorien inneholder for tiden ingen artikler eller filer.''",
-'hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}}',
-'hidden-category-category' => 'Skjulte kategorier',
-'category-subcat-count' => '{{PLURAL:$2|Denne kategorien har kun den følgende underkategorien.|Denne kategorien har følgende {{PLURAL:$1|underkategori|$1 underkategorier}}, av totalt $2.}}',
-'category-subcat-count-limited' => 'Kategorien har følgende {{PLURAL:$1|underkategori|$1 underkategorier}}.',
-'category-article-count' => '{{PLURAL:$2|Denne kategorien inneholder kun den følgende siden.|Følgende {{PLURAL:$1|side|$1 sider}} er i denne kategorien, av totalt $2.}}',
-'category-article-count-limited' => 'Følgende {{PLURAL:$1|side|$1 sider}} er i denne kategorien.',
-'category-file-count' => '{{PLURAL:$2|Denne kategorien inneholder kun den følgende filen.|Følgende {{PLURAL:$1|fil|$1 filer}} er i denne kategorien, av totalt $2.}}',
-'category-file-count-limited' => 'Følgende {{PLURAL:$1|fil|$1 filer}} er i denne kategorien.',
-'listingcontinuesabbrev' => 'forts.',
-'index-category' => 'Indekserte sider',
-'noindex-category' => 'Ikke-indekserte sider',
-'broken-file-category' => 'Sider med brutte fillenker',
-
-'about' => 'Om',
-'article' => 'Innholdsside',
-'newwindow' => '(Ã¥pnes i et nytt vindu)',
-'cancel' => 'Avbryt',
-'moredotdotdot' => 'Mer …',
-'mypage' => 'Min side',
-'mytalk' => 'Min diskusjonsside',
-'anontalk' => 'Brukerdiskusjon for denne IP-adressen',
-'navigation' => 'Navigasjon',
-'and' => '&#32;og',
-
-# Cologne Blue skin
-'qbfind' => 'Finn',
-'qbbrowse' => 'Bla gjennom',
-'qbedit' => 'Rediger',
-'qbpageoptions' => 'Sideinnstillinger',
-'qbpageinfo' => 'Sideinformasjon',
-'qbmyoptions' => 'Egne innstillinger',
-'qbspecialpages' => 'Spesialsider',
-'faq' => 'Ofte stilte spørsmål',
-'faqpage' => 'Project:Ofte stilte spørsmål',
-
-# Vector skin
-'vector-action-addsection' => 'Nytt emne',
-'vector-action-delete' => 'Slett',
-'vector-action-move' => 'Flytt',
-'vector-action-protect' => 'Beskytt',
-'vector-action-undelete' => 'Gjenopprett',
-'vector-action-unprotect' => 'Endre beskyttelse',
-'vector-simplesearch-preference' => 'Aktiver forbedrede søkeforslag (kun for drakten Vector)',
-'vector-view-create' => 'Opprett',
-'vector-view-edit' => 'Rediger',
-'vector-view-history' => 'Vis historikk',
-'vector-view-view' => 'Les',
-'vector-view-viewsource' => 'Vis kilden',
-'actions' => 'Handlinger',
-'namespaces' => 'Navnerom',
-'variants' => 'Varianter',
-
-'errorpagetitle' => 'Feil',
-'returnto' => 'Tilbake til $1.',
-'tagline' => 'Fra {{SITENAME}}',
-'help' => 'Hjelp',
-'search' => 'Søk',
-'searchbutton' => 'Søk',
-'go' => 'GÃ¥',
-'searcharticle' => 'GÃ¥',
-'history' => 'Sidehistorikk',
-'history_short' => 'Historikk',
-'updatedmarker' => 'oppdatert siden mitt forrige besøk',
-'printableversion' => 'Utskriftsvennlig versjon',
-'permalink' => 'Permanent lenke',
-'print' => 'Skriv ut',
-'view' => 'Vis',
-'edit' => 'Rediger',
-'create' => 'Opprett',
-'editthispage' => 'Rediger siden',
-'create-this-page' => 'Opprett denne siden',
-'delete' => 'Slett',
-'deletethispage' => 'Slett denne siden',
-'undelete_short' => 'Gjenopprett {{PLURAL:$1|én revisjon|$1 revisjoner}}',
-'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
-'protect' => 'Beskytt',
-'protect_change' => 'endre',
-'protectthispage' => 'LÃ¥s siden',
-'unprotect' => 'Endre beskyttelse',
-'unprotectthispage' => 'Endre beskyttelsen av denne siden',
-'newpage' => 'Ny side',
-'talkpage' => 'Diskuter denne siden',
-'talkpagelinktext' => 'Diskusjon',
-'specialpage' => 'Spesialside',
-'personaltools' => 'Personlige verktøy',
-'postcomment' => 'Ny seksjon',
-'articlepage' => 'Vis innholdsside',
-'talk' => 'Diskusjon',
-'views' => 'Visninger',
-'toolbox' => 'Verktøy',
-'userpage' => 'Vis brukerside',
-'projectpage' => 'Vis prosjektside',
-'imagepage' => 'Vis filside',
-'mediawikipage' => 'Vis beskjedside',
-'templatepage' => 'Vis mal',
-'viewhelppage' => 'Vis hjelpeside',
-'categorypage' => 'Vis kategoriside',
-'viewtalkpage' => 'Vis diskusjon',
-'otherlanguages' => 'På andre språk',
-'redirectedfrom' => '(Omdirigert fra $1)',
-'redirectpagesub' => 'Omdirigeringsside',
-'lastmodifiedat' => 'Denne siden ble sist endret $1 kl. $2.',
-'viewcount' => 'Denne siden er vist $1 {{PLURAL:$1|gang|ganger}}.',
-'protectedpage' => 'LÃ¥st side',
-'jumpto' => 'GÃ¥ til:',
-'jumptonavigation' => 'navigasjon',
-'jumptosearch' => 'søk',
-'view-pool-error' => 'Beklager, serverne er overbelastet for øyeblikket.
-For mange brukere forsøker å se denne siden.
-Vennligst vent en stund før du prøver å besøke denne siden på nytt.
-
-$1',
-'pool-timeout' => 'Tidsavbudd mens man ventet på låsing',
-'pool-queuefull' => 'Køen er full',
-'pool-errorunknown' => 'Ukjent feil',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Om {{SITENAME}}',
-'aboutpage' => 'Project:Om',
-'copyright' => 'Innholdet er tilgjengelig under $1.',
-'copyrightpage' => '{{ns:project}}:Opphavsrett',
-'currentevents' => 'Aktuelt',
-'currentevents-url' => 'Project:Aktuelt',
-'disclaimers' => 'Forbehold',
-'disclaimerpage' => 'Project:Generelle forbehold',
-'edithelp' => 'Redigeringshjelp',
-'edithelppage' => 'Help:Redigering',
-'helppage' => 'Help:Innhold',
-'mainpage' => 'Hovedside',
-'mainpage-description' => 'Hovedside',
-'policy-url' => 'Project:Retningslinjer',
-'portal' => 'Prosjektportal',
-'portal-url' => 'Project:Prosjektportal',
-'privacy' => 'Personvern',
-'privacypage' => 'Project:Personvern',
-
-'badaccess' => 'Rettighetsfeil',
-'badaccess-group0' => 'Du har ikke tilgang til å utføre handlingen du prøvde på.',
-'badaccess-groups' => 'Handlingen du prøvde å utføre kan kun utføres av brukere i {{PLURAL:$2|gruppa|gruppene}} $1.',
-
-'versionrequired' => 'Versjon $1 av MediaWiki påtrengt',
-'versionrequiredtext' => 'Versjon $1 av MediaWiki er nødvendig for å bruke denne siden. Se [[Special:Version|versjonsiden]]',
-
-'ok' => 'OK',
-'retrievedfrom' => 'Hentet fra «$1»',
-'youhavenewmessages' => 'Du har $1 ($2).',
-'newmessageslink' => 'nye meldinger',
-'newmessagesdifflink' => 'siste endring',
-'youhavenewmessagesmulti' => 'Du har nye beskjeder på $1',
-'editsection' => 'rediger',
-'editold' => 'rediger',
-'viewsourceold' => 'vis kilde',
-'editlink' => 'rediger',
-'viewsourcelink' => 'vis kilde',
-'editsectionhint' => 'Rediger avsnitt: $1',
-'toc' => 'Innhold',
-'showtoc' => 'vis',
-'hidetoc' => 'skjul',
-'collapsible-collapse' => 'skjul',
-'collapsible-expand' => 'vis',
-'thisisdeleted' => 'Se eller gjenopprett $1?',
-'viewdeleted' => 'Vis $1?',
-'restorelink' => '{{PLURAL:$1|én slettet revisjon|$1 slettede revisjoner}}',
-'feedlinks' => 'Mating:',
-'feed-invalid' => 'Ugyldig matingstype.',
-'feed-unavailable' => 'Abonnementskilder er ikke tilgjengelig',
-'site-rss-feed' => '$1 RSS-mating',
-'site-atom-feed' => '$1 Atom-mating',
-'page-rss-feed' => '«$1» RSS-mating',
-'page-atom-feed' => '«$1» Atom-mating',
-'red-link-title' => '$1 (siden finnes ikke)',
-'sort-descending' => 'Sorter i synkende rekkefølge',
-'sort-ascending' => 'Sorter i stigende rekkefølge',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Side',
-'nstab-user' => 'Brukerside',
-'nstab-media' => 'Mediaside',
-'nstab-special' => 'Spesialside',
-'nstab-project' => 'Prosjektside',
-'nstab-image' => 'Fil',
-'nstab-mediawiki' => 'Melding',
-'nstab-template' => 'Mal',
-'nstab-help' => 'Hjelp',
-'nstab-category' => 'Kategori',
-
-# Main script and global functions
-'nosuchaction' => 'Funksjonen finnes ikke',
-'nosuchactiontext' => 'Handlingen spesifisert i URL-en er ugyldig.
-Du kan ha skrevet URL-en feil, eller fulgt en link som var feil.
-Det kan også være en bug i {{SITENAME}}.',
-'nosuchspecialpage' => 'En slik spesialside finnes ikke',
-'nospecialpagetext' => 'Du ba om en ugyldig spesialside; en liste over gyldige spesialsider finnes på [[Special:SpecialPages|{{int:specialpages}}]].',
-
-# 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',
-'readonlytext' => 'Databasen er for øyeblikket skrivebeskyttet, sannsynligvis på grunn av rutinemessig vedlikehold.
-
-Administratoren som låste databasen ga forklaringen: $1',
-'missing-article' => 'Databasen fant ikke teksten på siden som den burde ha funnet, med navnet «$1» $2.
-
-Dette skyldes vanligvis at man følger en utdatert diff- eller historikklenke til en side som har blitt slettet.
-
-Om dette ikke er tilfellet kan du ha oppdaget en feil i programvaren.
-Vennligst rapporter dette til en [[Special:ListUsers/sysop|administrator]], oppgi da nettadressen.',
-'missingarticle-rev' => '(revisjon#: $1)',
-'missingarticle-diff' => '(diff: $1, $2)',
-'readonly_lag' => 'Databasen er automatisk skrivebeskyttet så slavetjenerne kan ta igjen mestertjeneren',
-'internalerror' => 'Intern feil',
-'internalerror_info' => 'Intern feil: $1',
-'fileappenderrorread' => 'Klarte ikke å lese «$1» når data skulle tilføyes.',
-'fileappenderror' => 'Kunne ikke legge "$1" til "$2".',
-'filecopyerror' => 'Klarte ikke å kopiere filen «$1» til «$2».',
-'filerenameerror' => 'Klarte ikke å døpe om filen «$1» til «$2».',
-'filedeleteerror' => 'Klarte ikke å slette filen «$1».',
-'directorycreateerror' => 'Klarte ikke å opprette mappe «$1».',
-'filenotfound' => 'Klarte ikke å finne filen «$1».',
-'fileexistserror' => 'Klarte ikke å skrive til filen «$1»: filen finnes fra før',
-'unexpected' => 'Uventet verdi: «$1»=«$2».',
-'formerror' => 'Feil: klarte ikke å sende skjema',
-'badarticleerror' => 'Handlingen kan ikke utføres på denne siden.',
-'cannotdelete' => 'Kunne ikke slette filen «$1». Den kan ha blitt slettet av noen andre.',
-'badtitle' => 'Ugyldig tittel',
-'badtitletext' => 'Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.
-Det kan inneholder en eller flere tegn som ikke kan brukes i titler.',
-'perfcached' => 'Følgende data er en lagret kopi, og ikke nødvendigvis den siste versjonen i databasen.',
-'perfcachedts' => 'Følgende data er en lagret kopi, og ble sist oppdatert $1.',
-'querypage-no-updates' => 'Oppdateringer for denne siden er slått av. Data her blir ikke gjenoppfrisket.',
-'wrong_wfQuery_params' => 'Gale paramtere til wfQuery()<br />
-Funksjon: $1<br />
-Spørring: $2',
-'viewsource' => 'Vis kildetekst',
-'viewsourcefor' => 'for $1',
-'actionthrottled' => 'Handlingsgrense overskredet',
-'actionthrottledtext' => 'For å beskytte mot spam, kan du ikke utføre denne handlingen for mange ganger i løpet av et kort tidssrom, og du har overskredet denne grensen. Prøv igjen om noen minutter.',
-'protectedpagetext' => 'Denne siden har blitt låst for redigeringer.',
-'viewsourcetext' => 'Du kan se og kopiere kilden til denne siden:',
-'protectedinterface' => 'Denne siden viser brukergrensesnittet for programvaren, og er låst for å hindre misbruk.',
-'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes i grensesnittet for programvaren. Endringer på denne siden vil påvirke hvordan grensesnittet vil se ut. For oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=no 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.',
-'ns-specialprotected' => 'Sier i navnerommet {{ns:special}} kan ikke redigeres.',
-'titleprotected' => "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].
-Den angitte grunnen er ''$2''.",
-
-# Virus scanner
-'virus-badscanner' => "DÃ¥rlig konfigurasjon: ukjent virusskanner: ''$1''",
-'virus-scanfailed' => 'skanning mislyktes (kode $1)',
-'virus-unknownscanner' => 'ukjent antivirusprogram:',
-
-# Login and logout pages
-'logouttext' => "'''Du er nå logget ut.'''
-
-Du kan fortsette å bruke {{SITENAME}} anonymt, eller [[Special:UserLogin|logge inn igjen]] som samme eller annen bruker.
-Merk at noen sider kan vise at du fortsatt er logget inn fram til du tømmer mellomlageret i nettleseren.",
-'welcomecreation' => '==Velkommen, $1!==
-Brukerkontoen din har blitt opprettet.
-Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
-'yourname' => 'Brukernavn:',
-'yourpassword' => 'Passord:',
-'yourpasswordagain' => 'Gjenta passord',
-'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
-'securelogin-stick-https' => 'Vær fortsatt koblet til HTTPS etter innlogging',
-'yourdomainname' => 'Ditt domene',
-'externaldberror' => 'Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.',
-'login' => 'Logg inn',
-'nav-login-createaccount' => 'Logg inn eller opprett en konto',
-'loginprompt' => 'Du må ha slått på informasjonskapsler for å logge in på {{SITENAME}}.',
-'userlogin' => 'Logg inn eller opprett en konto',
-'userloginnocreate' => 'Logg inn',
-'logout' => 'Logg ut',
-'userlogout' => 'Logg ut',
-'notloggedin' => 'Ikke logget inn',
-'nologin' => "Er du ikke registrert? '''$1'''.",
-'nologinlink' => 'Opprett en konto',
-'createaccount' => 'Opprett konto',
-'gotaccount' => "Har du allerede et brukernavn? '''$1'''.",
-'gotaccountlink' => 'Logg inn',
-'userlogin-resetlink' => 'Har du glemt påloggingsdetaljene dine?',
-'createaccountmail' => 'per e-post',
-'createaccountreason' => 'Ã…rsak:',
-'badretype' => 'Passordene samsvarte ikke.',
-'userexists' => 'Brukernavnet er allerede i bruk.
-Velg et annet brukernavn.',
-'loginerror' => 'Innloggingsfeil',
-'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.',
-'nocookiesfornew' => 'Brukerkontoen ble ikke opprettet siden vi ikke kunne bekrefte dens kilde.
-Kontroller at du har aktivert informasjonskapsler, oppdater siden og prøv igjen.',
-'noname' => 'Du har ikke oppgitt et gyldig brukernavn.',
-'loginsuccesstitle' => 'Du er nå logget inn',
-'loginsuccess' => 'Du er nå logget inn på {{SITENAME}} som «$1».',
-'nosuchuser' => 'Det eksisterer ingen bruker ved navn «$1».
-Merk at det skilles mellom store og små bokstaver.
-Sjekk stavemåten eller [[Special:UserLogin/signup|opprett en ny konto]].',
-'nosuchusershort' => 'Det finnes ingen bruker ved navn «$1». Kontroller stavemåten.',
-'nouserspecified' => 'Du må oppgi et brukernavn.',
-'login-userblocked' => 'Brukeren er blokkert. Innlogging er ikke tillatt.',
-'wrongpassword' => 'Du har oppgitt et ugyldig passord. Prøv igjen.',
-'wrongpasswordempty' => 'Du oppga ikke noe passord. Prøv igjen.',
-'passwordtooshort' => 'Passord må ha minst {{PLURAL:$1|ett tegn|$1 tegn}}.',
-'password-name-match' => 'Passordet ditt må være anderledes enn brukernavnet.',
-'password-login-forbidden' => 'Bruken av disse brukernavn og passord har blitt forbudt.',
-'mailmypassword' => 'Send nytt passord',
-'passwordremindertitle' => 'Nytt midlertidig passord fra {{SITENAME}}',
-'passwordremindertext' => 'Noen (antagelig deg, fra IP-adressen $1) ba oss sende deg et nytt
-passord til {{SITENAME}} ($4). Et midlertidig passord for «$2» har
-blitt laget og er satt til «$3». Om det var det du ville, må du logge inn
-og velge et nytt passord nå. Det midlertidige passordet vil utgå om {{PLURAL:$5|én dag|$5 dager}}.
-
-Dersom denne forespørselen ble utført av noen andre, eller om du kom på passordet
-og ikke lenger ønsker å endre det, kan du ignorere denne beskjeden
-og fortsette å bruke det gamle passordet.',
-'noemail' => 'Det er ikke registrert noen e-postadresse for brukeren «$1».',
-'noemailcreate' => 'De må oppgi en gyldig e-postadresse.',
-'passwordsent' => 'Et nytt passord har blitt sendt til e-postadressen registrert på bruker «$1». Logg inn når du har mottatt det nye passordet.',
-'blocked-mailpassword' => 'IP-adressen din er blokkert fra å redigere, og for å forhindre misbruk kan du heller ikke bruke funksjonen som gir deg nytt passord.',
-'eauthentsent' => 'En bekreftelsesmelding ble sendt til gitte e-postadresse. Før andre e-poster kan sendes til kontoen må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
-'throttled-mailpassword' => 'En passordpåminnelse ble sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
-For å forhindre misbruk kan kun én passordpåminnelse sendes per {{PLURAL:$1|time|$1 timer}}.',
-'mailerror' => 'Feil under sending av e-post: $1',
-'acct_creation_throttle_hit' => 'Gjester med samme IP-adresse som deg har opprettet {{PLURAL:$1|én konto|$1 kontoer}} det siste døgnet, og det er ikke tillatt å opprette flere.
-Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
-'emailauthenticated' => 'Din e-postadresse ble bekreftet $2 $3.',
-'emailnotauthenticated' => 'Din e-postadresse er ikke bekreftet. Du vil ikke kunne motta e-post for noen av følgende egenskaper.',
-'noemailprefs' => 'Oppgi en e-postadresse for at disse funksjonene skal fungere.',
-'emailconfirmlink' => 'Bekreft e-postadressen din.',
-'invalidemailaddress' => 'Din e-postadresse kan ikke aksepteres, fordi den er ugyldig formatert.
-Skriv inn en fungerende e-postadresse eller tøm feltet.',
-'accountcreated' => 'Konto opprettet',
-'accountcreatedtext' => 'Brukerkonto for $1 har blitt opprettet.',
-'createaccount-title' => 'Kontooppretting på {{SITENAME}}',
-'createaccount-text' => 'Noen opprettet en konto for din e-postadresse på {{SITENAME}} ($4) med navnet «$2», med «$3» som passord. Du burde logge inn og endre passordet nå.
-
-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-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.',
-
-# E-mail sending
-'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
-
-# Change password dialog
-'resetpass' => 'Endre passord',
-'resetpass_announce' => 'Du logget inn med en midlertidig e-postkode. For å fullføre innloggingen må du oppgi et nytt passord her:',
-'resetpass_text' => '<!-- Legg til tekst her -->',
-'resetpass_header' => 'Endre passord',
-'oldpassword' => 'Gammelt passord:',
-'newpassword' => 'Nytt passord:',
-'retypenew' => 'Gjenta nytt passord:',
-'resetpass_submit' => 'Angi passord og logg inn',
-'resetpass_success' => 'Passordet ditt ble endret! Logger inn&nbsp;…',
-'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',
-'resetpass-submit-cancel' => 'Avbryt',
-'resetpass-wrong-oldpass' => 'Feil midlertidig eller nåværende passord.
-Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.',
-'resetpass-temp-password' => 'Midlertidig passord:',
-
-# Special:PasswordReset
-'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å motta en påminnelse om kontoopplysningene dine i en e-post.',
-'passwordreset-legend' => 'Tilbakestill passord',
-'passwordreset-disabled' => 'Tilbakestilling av passord har blitt deaktivert på denne wikien.',
-'passwordreset-pretext' => '{{PLURAL:$1||Angi en av datadelene nedenfor}}',
-'passwordreset-username' => 'Brukernavn:',
-'passwordreset-domain' => 'Domene:',
-'passwordreset-email' => 'E-postadresse:',
-'passwordreset-emailtitle' => 'Kontodetaljer på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en påminnelse om dine
-kontodetaljer for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er
-tilknyttet denne e-postadressen:
-
-$2
-
-{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.
-Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
-forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
-ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
-passord.',
-'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en påminnelse om kontodetaljene dine for {{SITENAME}}
-($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:
-
-$2
-
-{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{én dag|$5 dager}}.
-Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
-forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
-ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
-passord.',
-'passwordreset-emailelement' => 'Brukernavn: $1
-Midlertidig passord: $2',
-'passwordreset-emailsent' => 'En påminnelse har blitt sendt på e-post.',
-
-# Edit page toolbar
-'bold_sample' => 'Fet tekst',
-'bold_tip' => 'Fet tekst',
-'italic_sample' => 'Kursiv tekst',
-'italic_tip' => 'Kursiv tekst',
-'link_sample' => 'Lenketittel',
-'link_tip' => 'Intern lenke',
-'extlink_sample' => 'http://www.example.com lenketittel',
-'extlink_tip' => 'Ekstern lenke (husk prefikset http://)',
-'headline_sample' => 'Overskriftstekst',
-'headline_tip' => 'Overskrift, nivå 2',
-'nowiki_sample' => 'Sett inn uformatert tekst her',
-'nowiki_tip' => 'Ignorer wikiformatering',
-'image_sample' => 'Eksempel.jpg',
-'image_tip' => 'Innebygd fil',
-'media_sample' => 'Eksempel.ogg',
-'media_tip' => 'Fillenke',
-'sig_tip' => 'Din signatur med dato',
-'hr_tip' => 'Horisontal linje (bruk sparsomt)',
-
-# Edit pages
-'summary' => 'Redigeringsforklaring:',
-'subject' => 'Emne/overskrift:',
-'minoredit' => 'Dette er en mindre endring',
-'watchthis' => 'Overvåk denne siden',
-'savearticle' => 'Lagre siden',
-'preview' => 'Forhåndsvisning',
-'showpreview' => 'Forhåndsvisning',
-'showlivepreview' => 'Levende forhåndsvisning',
-'showdiff' => 'Vis endringer',
-'anoneditwarning' => "'''Advarsel:''' Du er ikke logget inn.
-IP-adressen din blir bevart i sidens redigeringshistorikk.",
-'anonpreviewwarning' => "''Du er ikke logget inn. Lagring vil registrere din IP-adresse i sidens redigeringshistorikk.''",
-'missingsummary' => "'''PÃ¥minnelse:''' Du har ikke lagt inn en redigeringsforklaring.
-Velger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
-'missingcommenttext' => 'Vennligst legg inn en kommentar under.',
-'missingcommentheader' => "'''PÃ¥minnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.
-Om du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
-'summary-preview' => 'Forhåndsvisning av redigeringsforklaring:',
-'subject-preview' => 'Forhåndsvisning av emne/overskrift:',
-'blockedtitle' => 'Brukeren er blokkert',
-'blockedtext' => "'''Ditt brukernavn eller din IP-adresse har blitt blokkert.'''
-
-Blokkeringen ble utført av $1. Grunnen som ble oppgitt var ''$2''.
-
-* Blokkeringen begynte: $8
-* Blokkeringen utgår: $6
-* Blokkering ment på: $7
-
-Du kan kontakte $1 eller en annen [[{{MediaWiki:Grouppage-sysop}}|administrator]] for å diskutere blokkeringen.
-Du kan ikke bruke «E-post til denne brukeren»-funksjonen med mindre du har oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]] og du ikke er blokkert fra å sende e-post.
-Din nåværende IP-adresse er $3, og blokkerings-ID-en er #$5.
-Vennligst ta all denne informasjonen ved henvendelser.",
-'autoblockedtext' => "Din IP-adresse har blitt automatisk blokkert fordi den ble brukt av en annen bruker som ble blokkert av $1.
-Den oppgitte grunnen var:
-
-:'''$2'''
-
-* Blokkeringen begynte: $8
-* Blokkeringen utgår: $6
-* Blokkeringen er ment for: $7
-
-Du kan kontakte $1 eller en av de andre [[{{MediaWiki:Grouppage-sysop}}|administratorene]] for å diskutere blokkeringen.
-
-Merk at du ikke kan bruke «E-post til denne brukeren»-funksjonen med mindre du har registrert en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].
-
-Din IP-adresse er $3, og blokkerings-ID-en er #$5.
-Vennligst ta med all denne informasjonen ved henvendelser.",
-'blockednoreason' => 'ingen grunn gitt',
-'blockedoriginalsource' => "Kildekoden til '''$1''' vises nedenfor:",
-'blockededitsource' => "Kildekoden '''dine endringer''' på '''$1''' vises nedenfor:",
-'whitelistedittitle' => 'Du må logge inn for å redigere',
-'whitelistedittext' => 'Du må $1 for å redigere artikler.',
-'confirmedittext' => 'Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].',
-'nosuchsectiontitle' => 'Finner ikke avsnittet',
-'nosuchsectiontext' => 'Du prøvde å redigere et avsnitt som ikke eksisterer.
-Det kan ha blitt flyttet eller slettet mens du så på siden.',
-'loginreqtitle' => 'Innlogging kreves',
-'loginreqlink' => 'logge inn',
-'loginreqpagetext' => 'Du må $1 for å se andre sider.',
-'accmailtitle' => 'Passord sendt.',
-'accmailtext' => 'Et tilfeldig passord for [[User talk:$1|$1]] har blitt sendt til $2.
-
-Passordet for denne nye kontoen [[Special:ChangePassword|kan endres]] når du logger inn.',
-'newarticle' => '(Ny)',
-'newarticletext' => "Du har fulgt en lenke til en side som ikke finnes ennå.
-For å opprette siden, begynn å skrive i boksen under (se [[{{MediaWiki:Helppage}}|hjelpesiden]] for mer informasjon).
-Om du havnet her ved en feil, trykk '''tilbake''' i nettleseren.",
-'anontalkpagetext' => "----
-''Dette er en diskusjonsside for en uregistrert bruker som ikke har opprettet konto eller ikke er logget inn.
-Vi er derfor nødt til å bruke den numeriske IP-adressen til å identifisere ham eller henne.
-En IP-adresse kan være delt mellom flere brukere.
-Hvis du er en uregistrert bruker og synes at du har fått irrelevante kommentarer på en slik side, [[Special:UserLogin/signup|opprett en konto]] eller [[Special:UserLogin|logg inn]] så vi unngår fremtidige forvekslinger med andre uregistrerte brukere.''",
-'noarticletext' => 'Det er for tiden ingen tekst på denne siden.
-Du kan [[Special:Search/{{PAGENAME}}|søke etter denne sidetittelen]] på andre sider,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søke i relaterte logger],
-eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} opprette siden]</span>.',
-'noarticletext-nopermission' => 'Det er ingen tekst på denne siden.
-Du kan [[Special:Search/{{PAGENAME}}|søke etter sidens tittel]] i andre sider, eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søke i relevante logger]</span>.',
-'userpage-userdoesnotexist' => 'Brukerkontoen «<nowiki>$1</nowiki>» er ikke registrert. Sjekk om du ønsker å opprette/redigere denne siden.',
-'userpage-userdoesnotexist-view' => 'Kontoen «$1» er ikke registrert.',
-'blocked-notice-logextract' => 'Denne brukeren er for tiden blokkert.
-Siste blokkeringsloggelement kan sees nedenfor.',
-'clearyourcache' => "'''Merk:''' Etter lagring vil det kanskje være nødvendig at nettleseren sletter hurtiglageret sitt for at endringene skal tre i kraft.
-* '''Firefox / Safari:''' hold ''Shift'' mens du klikker på ''Oppdater'' eller trykk ''Ctrl-F5'' eller ''Ctrl-R'' (''Command-R'' på en Mac)
-* '''Google Chrome:''' trykk ''Ctrl-Shift-R'' (''Command-Shift-R'' på en Mac)
-* '''Internet Explorer:''' hold ''Ctrl'' mens du klikker på ''Oppdater'' eller trykk ''Ctrl-F5''
-* '''Konqueror:''' klikk ''Oppdater'' eller trykk ''F5''
-* '''Opera:''' tøm hurtiglageret i ''Verktøy → Innstillinger''",
-'usercssyoucanpreview' => "'''Tips:''' Bruk '{{int:showpreview}}'-knappen for å teste din nye CSS før du lagrer.",
-'userjsyoucanpreview' => "'''Tips:''' Bruk '{{int:showpreview}}'-knappen for å teste ditt nye JS før du lagrer.",
-'usercsspreview' => "'''Husk at dette bare er en forhåndsvisning av din bruker-CSS og at den ikke er lagret!'''",
-'userjspreview' => "'''Husk at dette bare er en test eller forhåndsvisning av ditt bruker-JavaScript, og det ikke er lagret!'''",
-'sitecsspreview' => "'''Husk at du bare forhåndsviser denne CSS.'''
-'''Den har ikke blitt lagret ennå!'''",
-'sitejspreview' => "'''Husk at du bare forhåndsviser denne JavaScript-koden.'''
-'''Den har ikke blitt lagret ennå!'''",
-'userinvalidcssjstitle' => "'''Advarsel:''' Det finnes ikke noe utseende ved navn «$1». Husk at .css- og .js-sider bruker titler i små bokstaver, for eksempel {{ns:user}}:Eksempel/vector.css, ikke {{ns:user}}:Eksempel/Vector.css",
-'updated' => '(Oppdatert)',
-'note' => "'''Merk:'''",
-'previewnote' => "'''Husk at dette bare er en forhåndsvisning.'''
-Endringene dine har ikke blitt lagret ennå!",
-'previewconflict' => 'Slik vil teksten i redigeringsvinduet se ut dersom du lagrer den.',
-'session_fail_preview' => "'''Beklager! Klarte ikke å lagre redigeringen din. Prøv igjen. Om det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så inn igjen.'''",
-'session_fail_preview_html' => "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''
-
-''Fordi {{SITENAME}} har rå HTML slått på, er forhåndsvisningen skjult for å forhindre JavaScript-angrep.''
-
-'''Om dette er et legitimt redigeringsforsøk, prøv igjen. Om det da ikke fungerer, prøv å [[Special:UserLogout|logge ut]] og logge inn igjen.'''",
-'token_suffix_mismatch' => "'''Redigeringen din har blitt avvist fordi klienten din ikke hadde punktasjonstegn i redigeringsteksten. Redigeringen har blitt avvist for å hindre ødeleggelse av artikkelteksten. Dette forekommer av og til når man bruker vevbaserte anonyme proxytjenester.'''",
-'edit_form_incomplete' => "'''Deler av redigeringsskjemaet nådde ikke tjeneren; dobbelsjekk at redigeringen er korrekt og prøv igjen.'''",
-'editing' => 'Redigerer $1',
-'editingsection' => 'Redigerer $1 (avsnitt)',
-'editingcomment' => 'Redigerer $1 (ny seksjon)',
-'editconflict' => 'Redigeringskonflikt: $1',
-'explainconflict' => "Noen andre har endret teksten siden du begynte å redigere.
-Den øverste boksen inneholder den nåværende tekst.
-Dine endringer vises i den nederste boksen.
-Du er nødt til å flette dine endringer sammen med den nåværende teksten.
-'''Kun''' teksten i den øverste tekstboksen blir lagret når du trykker «{{int:savearticle}}».",
-'yourtext' => 'Din tekst',
-'storedversion' => 'Den lagrede versjonen',
-'nonunicodebrowser' => "'''ADVARSEL: Nettleseren din har ikke støtte for Unicode. Skru det på før du begynner å redigere artikler.'''",
-'editingold' => "'''ADVARSEL:
-Du redigerer en gammel versjon av denne siden.
-Hvis du lagrer den, vil alle endringer foretatt siden denne versjonen bli overskrevet.'''",
-'yourdiff' => 'Forskjeller',
-'copyrightwarning' => "Merk at alle bidrag til {{SITENAME}} anses som utgitt under $2 (se $1 for detaljer).
-Om du ikke vil at dine bidrag skal kunne redigeres og distribuert fritt etter andres forgodtbefinnende, ikke legg det til her.<br />
-Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som samsvarer med vilkårene eller ikke er vernet av opphavsrett.
-'''Ikke legg til opphavsbeskyttet materiale uten tillatelse!'''",
-'copyrightwarning2' => "Vennligst merk at alle bidrag til {{SITENAME}} kan bli redigert, endret eller fjernet av andre bidragsytere. Om du ikke vil at dine bidrag skal kunne redigeres fritt, ikke legg det til her.<br />
-Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som er i public domain eller lignende (se $1 for detaljer). '''IKKE LEGG TIL OPPHAVSBESKYTTET MATERIALE UTEN TILLATELSE!'''",
-'longpageerror' => "'''FEIL: Teksten du prøvde å lagre er $1&nbsp;kB lang, dvs. lenger enn det maksimale $2&nbsp;kB. Den kan ikke lagres.'''",
-'readonlywarning' => "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,
-så du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å
-kopiere teksten din til en tekstfil, så du kan lagre den til senere.'''
-
-Systemadministratoren som låste databasen oppga følgende årsak: $1",
-'protectedpagewarning' => "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''
-Det siste loggelementet er oppgitt under som referanse:",
-'semiprotectedpagewarning' => "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.
-Det siste loggelementet er oppgitt under som referanse:",
-'cascadeprotectedwarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede sider:<!--{{PLURAL:$1}}-->",
-'titleprotectedwarning' => "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|spesielle rettigheter]] kreves for å opprette den.'''
-Det siste loggelementet er oppgitt under som referanse:",
-'templatesused' => '{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:',
-'templatesusedpreview' => '{{PLURAL:$1|Mal|Maler}} brukt i denne forhåndsvisningen:',
-'templatesusedsection' => '{{PLURAL:$1|Mal|Maler}} brukt i denne seksjonen:',
-'template-protected' => '(beskyttet)',
-'template-semiprotected' => '(halvbeskyttet)',
-'hiddencategories' => 'Denne siden er medlem av {{PLURAL:$1|1 skjult kategori|$1 skjulte kategorier}}:',
-'edittools' => '<!-- Teksten her vil vises under redigerings- og opplastingsboksene. -->',
-'nocreatetitle' => 'Sideoppretting er begrenset',
-'nocreatetext' => '{{SITENAME}} har begrensede muligheter for oppretting av nye sider. Du kan gå tilbake og redigere en eksisterende side, eller [[Special:UserLogin|logge inn eller opprette en ny konto]].',
-'nocreate-loggedin' => 'Du har ikke tillatelse til å opprette sider.',
-'sectioneditnotsupported-title' => 'Seksjonsredigering støttes ikke',
-'sectioneditnotsupported-text' => 'Seksjonsredigering støttes ikke på denne siden.',
-'permissionserrors' => 'Tilgangsfeil',
-'permissionserrorstext' => 'Du har ikke tillatelse til å utføre dette, av følgende {{PLURAL:$1|grunn|grunner}}:',
-'permissionserrorstext-withaction' => 'Du har ikke tillatelse til å $2 {{PLURAL:$1|på grunn av|av følgende grunner}}:',
-'recreate-moveddeleted-warn' => "Advarsel: Du er i ferd med å opprette en side som tidligere har blitt slettet.'''
-
-Du bør vurdere om det er passende å fortsette å redigere denne siden.
-Slette- og flytteloggen for denne siden gjengis her:",
-'moveddeleted-notice' => 'Denne siden har blitt slettet.
-Slette- og flytteloggen vises nedenfor.',
-'log-fulllog' => 'Vis fullstendig logg',
-'edit-hook-aborted' => 'Redigering avbrutt av en funksjon, uten forklaring.',
-'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.',
-'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
-
-# Parser/template warnings
-'expensive-parserfunction-warning' => 'Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.
-
-Det burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..',
-'expensive-parserfunction-category' => 'Sider med for mange prosesskrevende parserfunksjoner',
-'post-expand-template-inclusion-warning' => 'Advarsel: Størrelsen på inkluderte maler er for stor.
-Noen maler vil ikke bli inkludert.',
-'post-expand-template-inclusion-category' => 'Sider som inneholder for store maler',
-'post-expand-template-argument-warning' => 'Advarsel: Siden inneholder ett eller flere malparametere som blir for lange når de utvides.
-Disse parameterne har blitt utelatt.',
-'post-expand-template-argument-category' => 'Sider med utelatte malparametere',
-'parser-template-loop-warning' => 'Mal-loop oppdaget: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Mal er brukt for mange ganger ($1)',
-'language-converter-depth-warning' => 'Dybdegrense for språkkonvertering overskredet ($1)',
-
-# "Undo" feature
-'undo-success' => 'Redigeringen kan omgjøres. Sjekk sammenligningen under for å bekrefte at du vil gjøre dette, og lagre endringene for å fullføre omgjøringen.',
-'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]] ([[User talk:$2|diskusjon]] | [[Special:Contributions/$2|{{int:contribslink}}]])',
-
-# Account creation failure
-'cantcreateaccounttitle' => 'Kan ikke opprette konto',
-'cantcreateaccount-text' => "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].
-
-Grunnen som ble oppgitt av $3 er ''$2''",
-
-# History pages
-'viewpagelogs' => 'Vis logger for denne siden',
-'nohistory' => 'Denne siden har ingen historikk.',
-'currentrev' => 'Nåværende versjon',
-'currentrev-asof' => 'Nåværende revisjon fra $1',
-'revisionasof' => 'Revisjonen fra $1',
-'revision-info' => 'Revisjon per $1 av $2',
-'previousrevision' => '↠Eldre revisjon',
-'nextrevision' => 'Nyere revisjon →',
-'currentrevisionlink' => 'Nåværende revisjon',
-'cur' => 'nå',
-'next' => 'neste',
-'last' => 'forrige',
-'page_first' => 'første',
-'page_last' => 'siste',
-'histlegend' => "Valg av diff: merk i radioboksene de revisjonene du ønsker å sammenligne og trykk linjeskift eller knappen nederst på siden.<br />
-Forklaring: '''({{int:cur}})''' = forskjell fra nåværende revisjon, '''({{int:last}})''' = forskjell fra foregående revisjon, '''{{int:minoreditletter}}''' = mindre endring.",
-'history-fieldset-title' => 'Bla i historikken',
-'history-show-deleted' => 'Kun slettede',
-'histfirst' => 'Første',
-'histlast' => 'Siste',
-'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
-'historyempty' => '(tom)',
-
-# Revision feed
-'history-feed-title' => 'Revisjonshistorikk',
-'history-feed-description' => 'Revisjonshistorikk for denne siden',
-'history-feed-item-nocomment' => '$1 på $2',
-'history-feed-empty' => 'Den etterspurte siden finnes ikke. Den kan ha blitt slettet fra wikien, eller fått et nytt navn. Prøv å [[Special:Search|søke]] etter beslektede sider.',
-
-# Revision deletion
-'rev-deleted-comment' => '(redigeringskommentar fjernet)',
-'rev-deleted-user' => '(brukernavn fjernet)',
-'rev-deleted-event' => '(fjernet loggoppføring)',
-'rev-deleted-user-contribs' => '[brukernavn eller IP-adresse fjernet – redigeringen vises ikke blant bidragene]',
-'rev-deleted-text-permission' => "Denne revisjonen har blitt '''slettet'''.
-Det kan være detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
-'rev-deleted-text-unhide' => "Denne siderevisjonen har blitt '''slettet'''.
-Se etter detaljer i slettingsloggen: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].
-Som administrator kan du fortsatt [$1 se revisjonen] om du ønsker det.",
-'rev-suppressed-text-unhide' => "Denne siderevisjonen har blitt '''skjult'''.
-Informasjon om dette kan finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].
-Som administrator kan du fortsatt [$1 se revisjonen] om du ønsker det.",
-'rev-deleted-text-view' => "Denne siderevisjonen har blitt '''slettet'''.
-Som administrator kan du fortsatt se den. Detaljer finnes i slettingsloggen: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
-'rev-suppressed-text-view' => "!Denne siderevisjonen har blitt '''skjult'''.
-Som administrator kan du se den; detaljer kan finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
-'rev-deleted-no-diff' => "Du kan ikke vise forskjellen fordi en av versjonene har blitt '''slettet'''.
-Det kan finnes flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
-'rev-suppressed-no-diff' => "Du kanne ikke se revisjonsforskjellen fordi en av revisjonene har blitt '''slettet'''.",
-'rev-deleted-unhide-diff' => "Én av revisjonene i denne diffen har blitt '''slettet'''.
-Det finnes flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].
-Som administrator kan du fortsatt [$1 se diffen] om du ønsker å gå videre.",
-'rev-suppressed-unhide-diff' => "En av siderevisjonene i denne diffen har blitt '''skjult'''.
-Det kan være detaljer i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].
-Som administrator kan du fortsatt [$1 se diffen] om du ønsker å gå videre.",
-'rev-deleted-diff-view' => "En av revisjonene i denne diffen har blitt '''slettet'''.
-Som administrator kan du se diffen; det kan finnes detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
-'rev-suppressed-diff-view' => "En av revisjonene i denne diffen har blitt '''skjult'''.
-Som administrator kan du se denne diffen; det kan finnes detaljer i [{{fullurl:{{#Special:Log}}/suppcess|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
-'rev-delundel' => 'vis/skjul',
-'rev-showdeleted' => 'vis',
-'revisiondelete' => 'Slett/gjenopprett revisjoner',
-'revdelete-nooldid-title' => 'Ugyldig målversjon',
-'revdelete-nooldid-text' => 'Du har ikke angitt en målversjon for denne funksjonen, den angitte versjonen finnes ikke, eller du forsøker å skjule den nåværende versjonen.',
-'revdelete-nologtype-title' => 'Ingen loggtype spesifisert',
-'revdelete-nologtype-text' => 'Du har ikke spesifisert en loggtype å utføre denne handlingen på.',
-'revdelete-nologid-title' => 'Ugyldig loggelement',
-'revdelete-nologid-text' => 'Du har enten ikke spesifisert ett loggelement å utføre på denne funksjonen, eller spesifisert element finnes ikke.',
-'revdelete-no-file' => 'Den spesifiserte filen finnes ikke.',
-'revdelete-show-file-confirm' => 'Er du sikker på at du ønsker å vise en slettet versjon av filen «<nowiki>$1</nowiki>» fra den $2 klokken $3?',
-'revdelete-show-file-submit' => 'Ja',
-'revdelete-selected' => "'''{{PLURAL:$2|Valgt revisjon|Valgte revisjoner}} av [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|Valgt loggoppføring|Valgte loggoppføringer}}:'''",
-'revdelete-text' => "'''Slettede versjoner og oppføringer vil fortsatt vises i sidehistorikken og loggene, men deler av innholdet vil ikke lenger bli offentliggjort.'''
-Andre administratorer på {{SITENAME}} vil fortsatt kunne se det skjulte innholdet, og kan gjenopprette det, med mindre videre begrensninger blir gitt av sideoperatørene.",
-'revdelete-confirm' => 'Bekreft at du ønsker å gjøre dette, at du forstår konsekvensene, og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].',
-'revdelete-suppress-text' => "Skjuling bør '''kun''' brukes i følgende tilfeller:
-* Mulig injurierende utsagn
-* Upassende personlige opplysninger, herunder
-*: ''privatadresser og -telefonnumre, fødselsnumre og lignende''",
-'revdelete-legend' => 'Fastsett synlighetsbegrensninger',
-'revdelete-hide-text' => 'Skjul revisjonstekst',
-'revdelete-hide-image' => 'Skjul filinnhold',
-'revdelete-hide-name' => 'Skjul handling og mål',
-'revdelete-hide-comment' => 'Skjul redigeringsforklaring',
-'revdelete-hide-user' => 'Skjul bidragsyters brukernavn eller IP',
-'revdelete-hide-restricted' => 'La disse begrensningene gjelde for administratorer også, og steng dette grensesnittet',
-'revdelete-radio-same' => '(ikke endre)',
-'revdelete-radio-set' => 'Ja',
-'revdelete-radio-unset' => 'Nei',
-'revdelete-suppress' => 'Skjul informasjon også fra administratorer',
-'revdelete-unsuppress' => 'Fjern betingelser på gjenopprettede revisjoner',
-'revdelete-log' => 'Ã…rsak:',
-'revdelete-submit' => 'Utfør på {{PLURAL:$1|valgt revisjon|valgte revisjoner}}',
-'revdelete-logentry' => 'endre revisjonssynlighet for [[$1]]',
-'logdelete-logentry' => 'endre hendelsessynlighet for [[$1]]',
-'revdelete-success' => "'''Versjonssynlighet vellykket oppdatert.'''",
-'revdelete-failure' => "'''Kunne ikke endre versjonssynligheten:'''
-$1",
-'logdelete-success' => "'''Hendelsessynlighet satt.'''",
-'logdelete-failure' => "'''Loggens synlighet kunne ikke bli stilt inn:'''
-$1",
-'revdel-restore' => 'endre synlighet',
-'revdel-restore-deleted' => 'slettede revisjoner',
-'revdel-restore-visible' => 'synlige revisjoner',
-'pagehist' => 'Sidehistorikk',
-'deletedhist' => 'Slettet historikk',
-'revdelete-content' => 'innhold',
-'revdelete-summary' => 'redigeringssammendrag',
-'revdelete-uname' => 'brukernavn',
-'revdelete-restricted' => 'begrensninger gjelder også administratorer',
-'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
-'revdelete-hid' => 'skjulte $1',
-'revdelete-unhid' => 'synliggjorde $1',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|revisjon|revisjoner}}',
-'logdelete-log-message' => '$1 for $2 {{PLURAL:$2|element|elementer}}',
-'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldende revisjonen.
-Den kan ikke skjules.',
-'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
-Du har ikke tilgang til det.',
-'revdelete-modify-no-access' => 'Feil under endring av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
-Du har ikke tilgang til det.',
-'revdelete-modify-missing' => 'Feil under endring av objekt ID $1: det mangler i databasen!',
-'revdelete-no-change' => "'''Advarsel:''' objektet datert $2 $1 hadde allerede synlighetsinnstillingene du forespurte.",
-'revdelete-concurrent-change' => 'Feil under endring av objektet datert $2, $1: dets status ser ut til å ha blitt endret av noen andre mens du prøvde å endre det.
-Vennligst sjekk loggen.',
-'revdelete-only-restricted' => 'Feil ved gjemming av objekt datert $2, $1: du kan ikke skjule objekt fra å vises for administratorer uten også å velge en av de andre visningsalternativene.',
-'revdelete-reason-dropdown' => '*Vanlige slettingsgrunner
-** Opphavsrettsbrudd
-** Upassende personopplysninger
-** Mulig falskt sladder',
-'revdelete-otherreason' => 'Annen/ytterligere årsak:',
-'revdelete-reasonotherlist' => 'Annen årsak',
-'revdelete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'revdelete-offender' => 'Forfatter av denne versjonen:',
-
-# Suppression log
-'suppressionlog' => 'Sideskjulingslogg',
-'suppressionlogtext' => 'Under er en liste over sider som er slettet eller blokkert med innhold skjult fra administratorer.
-Se [[Special:BlockList|IP-blokkeringsliste]] for oversikt over aktuelle utelukkelser og blokkeringer.',
-
-# History merging
-'mergehistory' => 'Flett sidehistorikker',
-'mergehistory-header' => 'Denne siden lar deg flette historikken til to sider.
-Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
-'mergehistory-box' => 'Flett historikken til to sider:',
-'mergehistory-from' => 'Kildeside:',
-'mergehistory-into' => 'MÃ¥lside:',
-'mergehistory-list' => 'Flettbar redigeringshistorikk',
-'mergehistory-merge' => 'Følgende revisjoner av [[:$1]] kan flettes til [[:$2]]. Du kan velge å flette kun de revisjonene som kom før tidspunktet gitt i tabellen. Merk at bruk av navigasjonslenkene vil resette denne kolonnen.',
-'mergehistory-go' => 'Vis flettbare redigeringer',
-'mergehistory-submit' => 'Flett revisjoner',
-'mergehistory-empty' => 'Ingen revisjoner kan flettes.',
-'mergehistory-success' => '{{PLURAL:$3|Én revisjon|$3 revisjoner}} av [[:$1]] ble flettet til [[:$2]].',
-'mergehistory-fail' => 'Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.',
-'mergehistory-no-source' => 'Kildesiden $1 finnes ikke.',
-'mergehistory-no-destination' => 'MÃ¥lsiden $1 finnes ikke.',
-'mergehistory-invalid-source' => 'Kildesiden må ha en gyldig tittel.',
-'mergehistory-invalid-destination' => 'Målsiden må ha en gyldig tittel.',
-'mergehistory-autocomment' => 'Flettet [[:$1]] inn i [[:$2]]',
-'mergehistory-comment' => 'Flettet [[:$1]] inn i [[:$2]]: $3',
-'mergehistory-same-destination' => 'Kilde- og målside kan ikke være den samme.',
-'mergehistory-reason' => 'Ã…rsak:',
-
-# Merge log
-'mergelog' => 'Flettingslogg',
-'pagemerge-logentry' => 'flettet [[$1]] til [[$2]] (revisjoner fram til $3)',
-'revertmerge' => 'Omgjør fletting',
-'mergelogpagetext' => 'Nedenfor er en liste over de nyligste flettingene av sidehistorikker.',
-
-# Diffs
-'history-title' => 'Revisjonshistorikk for «$1»',
-'difference' => '(Forskjell mellom revisjoner)',
-'difference-multipage' => '(Forskjell mellom sider)',
-'lineno' => 'Linje $1:',
-'compareselectedversions' => 'Sammenlign valgte revisjoner',
-'showhideselectedversions' => 'Vis/skjul valgte versjoner',
-'editundo' => 'angre',
-'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
-
-# Search results
-'searchresults' => 'Søkeresultat',
-'searchresults-title' => 'Søkeresultat for «$1»',
-'searchresulttext' => 'For mer informasjon om søking i {{SITENAME}}, se [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => "Du søkte etter '''[[:$1]]''' ([[Special:Prefixindex/$1|alle sider som begynner med «$1»]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle sider som lenker til «$1»]])",
-'searchsubtitleinvalid' => "Du søkte etter '''$1'''",
-'toomanymatches' => 'For mange mulige svar, prøv med en annen spørring',
-'titlematches' => 'Artikkeltitler med treff på forespørselen',
-'notitlematches' => 'Ingen sidetitler samsvarte med søket',
-'textmatches' => 'Artikkeltekster med treff på forespørselen',
-'notextmatches' => 'Inden sidetekst samsvarte med søket',
-'prevn' => 'forrige {{PLURAL:$1|$1}}',
-'nextn' => 'neste {{PLURAL:$1|$1}}',
-'prevn-title' => 'Forrige $1 {{PLURAL:$1|resultat|resultater}}',
-'nextn-title' => 'Neste $1 {{PLURAL:$1|resultat|resultater}}',
-'shown-title' => 'Vis $1 {{PLURAL:$1|resultat|resultater}} per side',
-'viewprevnext' => 'Vis ($1 {{int:pipe-separator}} $2) ($3)',
-'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',
-'searchprofile-images' => 'Multimedia',
-'searchprofile-everything' => 'Alt',
-'searchprofile-advanced' => 'Avansert',
-'searchprofile-articles-tooltip' => 'Søk i $1',
-'searchprofile-project-tooltip' => 'Søk i $1',
-'searchprofile-images-tooltip' => 'Søk etter filer',
-'searchprofile-everything-tooltip' => 'Søk i alt innhold (inkldert diskusjonssider)',
-'searchprofile-advanced-tooltip' => 'Søk i visse navnerom',
-'search-result-size' => '$1 ({{PLURAL:$2|ett|$2}} ord)',
-'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})',
-'search-result-score' => 'Relevans: $1&nbsp;%',
-'search-redirect' => '(omdirigering $1)',
-'search-section' => '(avsnitt $1)',
-'search-suggest' => 'Mente du: $1',
-'search-interwiki-caption' => 'Søsterprosjekt',
-'search-interwiki-default' => '$1-resultat:',
-'search-interwiki-more' => '(mer)',
-'search-mwsuggest-enabled' => 'med forslag',
-'search-mwsuggest-disabled' => 'ingen forslag',
-'search-relatedarticle' => 'Relatert',
-'mwsuggest-disable' => 'Slå av AJAX-forslag',
-'searcheverything-enable' => 'Søk i alle navnerom',
-'searchrelated' => 'relatert',
-'searchall' => 'alle',
-'showingresults' => "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
-'showingresultsnum' => "Nedenfor vises {{PLURAL:$3|'''ett''' resultat|'''$3''' resultater}} fra og med nummer '''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
-'nonefound' => "'''Merk''': Som standard søkes det kun i enkelte navnerom.
-For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler, osv), eller bruk det ønskede navnerommet som prefiks.",
-'search-nonefound' => 'Det var ingen resultater som passet til søket.',
-'powersearch' => 'Avansert søk',
-'powersearch-legend' => 'Avansert søk',
-'powersearch-ns' => 'Søk i navnerom:',
-'powersearch-redir' => 'Vis omdirigeringer',
-'powersearch-field' => 'Søk etter',
-'powersearch-togglelabel' => 'Merk:',
-'powersearch-toggleall' => 'Alle',
-'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.',
-
-# Preferences page
-'preferences' => 'Innstillinger',
-'mypreferences' => 'Innstillinger',
-'prefs-edits' => 'Antall redigeringer:',
-'prefsnologin' => 'Ikke logget inn',
-'prefsnologintext' => 'Du må være <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} logget inn]</span> for å endre brukerinnstillingene.',
-'changepassword' => 'Endre passord',
-'prefs-skin' => 'Utseende',
-'skin-preview' => 'Forhåndsvisning',
-'datedefault' => 'Ingen foretrukket',
-'prefs-beta' => 'Betafunksjoner',
-'prefs-datetime' => 'Dato og tid',
-'prefs-labs' => 'Lab-funksjoner',
-'prefs-personal' => 'Brukerdata',
-'prefs-rc' => 'Siste endringer',
-'prefs-watchlist' => 'Overvåkningsliste',
-'prefs-watchlist-days' => 'Dager som skal vises i overvåkningslisten:',
-'prefs-watchlist-days-max' => 'Maksimum 7 dager',
-'prefs-watchlist-edits' => 'Antall redigeringer som skal vises i utvidet overvåkningsliste:',
-'prefs-watchlist-edits-max' => 'Maksimum antall: 1000',
-'prefs-watchlist-token' => 'Nøkkel for overvåkningsliste',
-'prefs-misc' => 'Diverse',
-'prefs-resetpass' => 'Endre passord',
-'prefs-email' => 'Alternativer for e-post',
-'prefs-rendering' => 'Utseende',
-'saveprefs' => 'Lagre',
-'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',
-'resultsperpage' => 'Resultater per side:',
-'stub-threshold' => 'Grense for <span class="mw-stub-example">stubblenkeformatering</span>:',
-'stub-threshold-disabled' => 'Deaktivert',
-'recentchangesdays' => 'Antall dager som skal vises i siste endringer:',
-'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dag|dager}})',
-'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
-'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',
-'savedprefs' => 'Innstillingene ble lagret.',
-'timezonelegend' => 'Tidssone:',
-'localtime' => 'Lokaltid:',
-'timezoneuseserverdefault' => 'Bruk wikistandard ($1)',
-'timezoneuseoffset' => 'Annet (spesifiser forskjell)',
-'timezoneoffset' => 'Forskjell¹:',
-'servertime' => 'Serverens tid er nå:',
-'guesstimezone' => 'Hent tidssone fra nettleseren',
-'timezoneregion-africa' => 'Afrika',
-'timezoneregion-america' => 'Amerika',
-'timezoneregion-antarctica' => 'Antarktis',
-'timezoneregion-arctic' => 'Arktis',
-'timezoneregion-asia' => 'Asia',
-'timezoneregion-atlantic' => 'Atlanterhavet',
-'timezoneregion-australia' => 'Australia',
-'timezoneregion-europe' => 'Europe',
-'timezoneregion-indian' => 'Det indiske hav',
-'timezoneregion-pacific' => 'Stillehavet',
-'allowemail' => 'Tillat andre å sende meg e-post',
-'prefs-searchoptions' => 'Søkealternativ',
-'prefs-namespaces' => 'Navnerom',
-'defaultns' => 'Søk ellers i disse navnerommene:',
-'default' => 'standard',
-'prefs-files' => 'Filer',
-'prefs-custom-css' => 'Personlig CSS',
-'prefs-custom-js' => 'Personlig Javascript',
-'prefs-common-css-js' => 'Delt CSS/JS for alle drakter:',
-'prefs-reset-intro' => 'Du kan bruke denne siden til å tilbakestille innstillingene dine til standardinnstillingene.
-Dette kan ikke tilbakestilles.',
-'prefs-emailconfirm-label' => 'E-postbekreftelse:',
-'prefs-textboxsize' => 'Størrelse på redigeringsvindu',
-'youremail' => 'E-post:',
-'username' => 'Brukernavn:',
-'uid' => 'Bruker-ID:',
-'prefs-memberingroups' => 'Medlem i følgende {{PLURAL:$1|gruppe|grupper}}:',
-'prefs-registration' => 'Registreringstid:',
-'yourrealname' => 'Virkelig navn:',
-'yourlanguage' => 'Språk:',
-'yourvariant' => 'Språkvariant for innhold:',
-'yournick' => 'Signatur:',
-'prefs-help-signature' => 'Kommentarer på diskusjonssider bør alltid signeres med «<nowiki>~~~~</nowiki>», som vil bli konvertert til din signatur med tidspunkt.',
-'badsig' => 'Ugyldig råsignatur; sjekk HTML-elementer.',
-'badsiglength' => 'Signaturen er for lang.
-Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
-'yourgender' => 'Kjønn:',
-'gender-unknown' => 'Uspesifisert',
-'gender-male' => 'Mann',
-'gender-female' => 'Kvinne',
-'prefs-help-gender' => 'Valgfritt: brukes for kjønnskorrekt tekst av programvaren. Denne informasjonen vil være offentlig.',
-'email' => 'E-post',
-'prefs-help-realname' => '* Virkelig navn (valgfritt): dersom du velger å oppgi navnet, vil det bli brukt til å kreditere deg for ditt arbeid.',
-'prefs-help-email' => 'Å angi e-postadresse er valgfritt, men er nødvendig for å få tilsendt nytt passord om du skulle glemme det gamle.',
-'prefs-help-email-others' => 'Du kan også velge å la andre brukere kontakte deg via brukersiden din uten å røpe identiteten din.',
-'prefs-help-email-required' => 'E-postadresse er påkrevd.',
-'prefs-info' => 'Grunnleggende informasjon',
-'prefs-i18n' => 'Internasjonalisering',
-'prefs-signature' => 'Signatur',
-'prefs-dateformat' => 'Datoformat',
-'prefs-timeoffset' => 'Tidsforskyvning',
-'prefs-advancedediting' => 'Avanserte alternativ',
-'prefs-advancedrc' => 'Avanserte alternativ',
-'prefs-advancedrendering' => 'Avanserte alternativ',
-'prefs-advancedsearchoptions' => 'Avanserte alternativ',
-'prefs-advancedwatchlist' => 'Avanserte alternativ',
-'prefs-displayrc' => 'Visningsalternativ',
-'prefs-displaysearchoptions' => 'Visningsalternativer',
-'prefs-displaywatchlist' => 'Visningsalternativer',
-'prefs-diffs' => 'Forskjeller',
-
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'E-postadressen ser gyldig ut',
-'email-address-validity-invalid' => 'Skriv inn en gyldig e-postadresse',
-
-# User rights
-'userrights' => 'Brukerrettighetskontroll',
-'userrights-lookup-user' => 'Ordne brukergrupper',
-'userrights-user-editname' => 'Skriv inn et brukernavn:',
-'editusergroup' => 'Endre brukergrupper',
-'editinguser' => "Endrer brukerrettighetene til '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'Rediger brukergrupper',
-'saveusergroups' => 'Lagre brukergrupper',
-'userrights-groupsmember' => 'Medlem av:',
-'userrights-groupsmember-auto' => 'Implisitt medlem av:',
-'userrights-groups-help' => 'Du kan endre hvilke grupper denne brukeren er medlem av.
-* En avkrysset boks betyr at brukeren er medlem av gruppen.
-* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.
-* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.',
-'userrights-reason' => 'Ã…rsak:',
-'userrights-no-interwiki' => 'Du har ikke tillatelse til å endre brukerrettigheter på andre wikier.',
-'userrights-nodatabase' => 'Databasen $1 finnes ikke, eller er ikke lokal.',
-'userrights-nologin' => 'Du må [[Special:UserLogin|logge inn]] med en administratorkonto for å endre brukerrettigheter.',
-'userrights-notallowed' => 'Kontoen din har ikke tillatelse til å legge til eller fjerne brukerrettigheter.',
-'userrights-changeable-col' => 'Grupper du kan endre',
-'userrights-unchangeable-col' => 'Grupper du ikke kan endre',
-'userrights-irreversible-marker' => '$1 *',
-
-# Groups
-'group' => 'Gruppe:',
-'group-user' => 'Brukere',
-'group-autoconfirmed' => 'Autobekreftede brukere',
-'group-bot' => 'Roboter',
-'group-sysop' => 'Administratorer',
-'group-bureaucrat' => 'Byråkrater',
-'group-suppress' => 'Sidefjernere',
-'group-all' => '(alle)',
-
-'group-user-member' => 'bruker',
-'group-autoconfirmed-member' => 'autobekreftet bruker',
-'group-bot-member' => 'robot',
-'group-sysop-member' => 'administrator',
-'group-bureaucrat-member' => 'byråkrat',
-'group-suppress-member' => 'revisjonsfjerner',
-
-'grouppage-user' => '{{ns:project}}:Brukere',
-'grouppage-autoconfirmed' => '{{ns:project}}:Autobekreftede brukere',
-'grouppage-bot' => '{{ns:project}}:Roboter',
-'grouppage-sysop' => '{{ns:project}}:Administratorer',
-'grouppage-bureaucrat' => '{{ns:project}}:Byråkrater',
-'grouppage-suppress' => '{{ns:project}}:Historikkrydding',
-
-# Rights
-'right-read' => 'Se sider',
-'right-edit' => 'Redigere sider',
-'right-createpage' => 'Opprette sider (som ikke er diskusjonssider)',
-'right-createtalk' => 'Opprette diskusjonssider',
-'right-createaccount' => 'Opprette nye kontoer',
-'right-minoredit' => 'Marker endringer som mindre',
-'right-move' => 'Flytte sider',
-'right-move-subpages' => 'Flytte sider med undersider',
-'right-move-rootuserpages' => 'Flytte hovedbrukersider',
-'right-movefile' => 'Flytte filer',
-'right-suppressredirect' => 'Behøver ikke å opprette omdirigeringer ved sideflytting',
-'right-upload' => 'Laste opp filer',
-'right-reupload' => 'Skrive over eksisterende filer',
-'right-reupload-own' => 'Skrive over egne filer',
-'right-reupload-shared' => 'Skrive over delte filer lokalt',
-'right-upload_by_url' => 'Laste opp en fil via URL',
-'right-purge' => 'Rense mellomlageret for sider',
-'right-autoconfirmed' => 'Redigere halvlåste sider',
-'right-bot' => 'Bli behandlet som en automatisk prosess',
-'right-nominornewtalk' => 'Får ikke «Du har nye meldinger»-beskjeden ved mindre endringer på diskusjonsside',
-'right-apihighlimits' => 'Bruke API med høyere grenser',
-'right-writeapi' => 'Redigere via API',
-'right-delete' => 'Slette sider',
-'right-bigdelete' => 'Slette sider med stor historikk',
-'right-deleterevision' => 'Slette og gjenopprette enkeltrevisjoner av sider',
-'right-deletedhistory' => 'Se slettet sidehistorikk uten tilhørende sidetekst',
-'right-deletedtext' => 'Vis slettet tekst og endringer mellom slettede versjoner',
-'right-browsearchive' => 'Søke i slettede sider',
-'right-undelete' => 'Gjenopprette sider',
-'right-suppressrevision' => 'Se og gjenopprette skjulte siderevisjoner',
-'right-suppressionlog' => 'Se private logger',
-'right-block' => 'Blokkere andre brukere fra å redigere',
-'right-blockemail' => 'Blokkere brukere fra å sende e-post',
-'right-hideuser' => 'Blokkere et brukernavn og skjule det fra det offentlige',
-'right-ipblock-exempt' => 'Kan redigere fra blokkerte IP-adresser',
-'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
-'right-unblockself' => 'Fjern blokkering av seg selv',
-'right-protect' => 'Endre beskyttelsesnivåer',
-'right-editprotected' => 'Redigere beskyttede sider',
-'right-editinterface' => 'Redigere brukergrensesnittet',
-'right-editusercssjs' => 'Redigere andre brukeres CSS- og JS-filer',
-'right-editusercss' => 'Redigere andre brukeres CSS-filer',
-'right-edituserjs' => 'Redigere andre brukeres JS-filer',
-'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',
-'right-import' => 'Importere sider fra andre wikier',
-'right-importupload' => 'Importere sider via opplasting',
-'right-patrol' => 'Markere redigeringer som patruljerte',
-'right-autopatrol' => 'FÃ¥r sine egne redigeringer merket som patruljerte',
-'right-patrolmarks' => 'Bruke patruljeringsfunksjoner i siste endringer',
-'right-unwatchedpages' => 'Se listen over uovervåkede sider',
-'right-trackback' => 'Gi tilbakemelding',
-'right-mergehistory' => 'Flette sidehistorikker',
-'right-userrights' => 'Redigere alle brukerrettigheter',
-'right-userrights-interwiki' => 'Redigere rettigheter for brukere på andre wikier',
-'right-siteadmin' => 'Låse og låse opp databasen',
-'right-override-export-depth' => 'Eksporter sider inkludert lenkede sider til en dypde på 5',
-'right-sendemail' => 'Send e-post til andre brukere',
-
-# User rights log
-'rightslog' => 'Brukerrettighetslogg',
-'rightslogtext' => 'Dette er en logg over forandringer i brukerrettigheter.',
-'rightslogentry' => 'endret gruppe for $1 fra $2 til $3',
-'rightslogentry-autopromote' => 'ble automatisk forfremmet fra $2 til $3',
-'rightsnone' => '(ingen)',
-
-# Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'se denne siden',
-'action-edit' => 'redigere denne siden',
-'action-createpage' => 'opprette sider',
-'action-createtalk' => 'opprette diskusjonssider',
-'action-createaccount' => 'opprette denne kontoen',
-'action-minoredit' => 'merke denne redigeringen som mindre',
-'action-move' => 'flytte denne siden',
-'action-move-subpages' => 'flytte denne siden og dens undersider',
-'action-move-rootuserpages' => 'flytte hovedbrukersider',
-'action-movefile' => 'flytte denne filen',
-'action-upload' => 'laste opp denne filen',
-'action-reupload' => 'overskrive den nåværende filen',
-'action-reupload-shared' => 'overskrive denne filen på fellesdatabasen',
-'action-upload_by_url' => 'laste opp denne filen fra en URL',
-'action-writeapi' => 'bruke skrive-API-en',
-'action-delete' => 'slette denne siden',
-'action-deleterevision' => 'slette denne revisjonen',
-'action-deletedhistory' => 'se denne sidens slettede historikk',
-'action-browsearchive' => 'søke i slettede sider',
-'action-undelete' => 'gjenopprette denne siden',
-'action-suppressrevision' => 'se og gjenopprette denne skjulte revisjonen',
-'action-suppressionlog' => 'se denne private loggen',
-'action-block' => 'blokkere denne brukeren fra å redigere',
-'action-protect' => 'endre denne sidens beskyttelsesnivåer',
-'action-import' => 'importere denne siden fra en annen wiki',
-'action-importupload' => 'importere denne siden fra en opplastet fil',
-'action-patrol' => 'merke andre brukeres redigeringer som patruljert',
-'action-autopatrol' => 'merke redigeringene dine som patruljert',
-'action-unwatchedpages' => 'vise listen over uovervåkede sider',
-'action-trackback' => 'levere tilbakemelding',
-'action-mergehistory' => 'flette sidens historikk',
-'action-userrights' => 'redigere alle brukerrettigheter',
-'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
-'action-siteadmin' => 'låse eller låse opp databasen',
-
-# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
-'recentchanges' => 'Siste endringer',
-'recentchanges-legend' => 'Alternativ for siste endringer',
-'recentchangestext' => 'Vis de siste endringene til denne siden',
-'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
-'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
-'recentchanges-label-minor' => 'Dette er en mindre endring',
-'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
-'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
-'rcnote' => "Nedenfor vises {{PLURAL:$1|'''1''' endring|de siste '''$1''' endringene}} fra {{PLURAL:$2|det siste døgnet|de siste '''$2''' døgnene}}, per $5 $4.",
-'rcnotefrom' => "Nedenfor er endringene fra '''$2''' (opp til '''$1''' vises).",
-'rclistfrom' => 'Vis nye endringer med start fra $1',
-'rcshowhideminor' => '$1 mindre endringer',
-'rcshowhidebots' => '$1 roboter',
-'rcshowhideliu' => '$1 innloggede brukere',
-'rcshowhideanons' => '$1 anonyme brukere',
-'rcshowhidepatr' => '$1 godkjente endringer',
-'rcshowhidemine' => '$1 mine endringer',
-'rclinks' => 'Vis siste $1 endringer i de siste $2 dagene<br />$3',
-'diff' => 'diff',
-'hist' => 'hist',
-'hide' => 'Skjul',
-'show' => 'Vis',
-'minoreditletter' => 'm',
-'newpageletter' => 'N',
-'boteditletter' => 'b',
-'number_of_watching_users_pageview' => '[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]',
-'rc_categories' => 'Begrens til kategorier (skilletegn: «|»)',
-'rc_categories_any' => 'Alle',
-'newsectionsummary' => '/* $1 */ ny seksjon',
-'rc-enhanced-expand' => 'Vis detaljer (krever JavaScript)',
-'rc-enhanced-hide' => 'Skjul detaljer',
-
-# Recent changes linked
-'recentchangeslinked' => 'Relaterte endringer',
-'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:',
-'recentchangeslinked-to' => 'Vis endringer på sider som lenker til den gitte siden istedet',
-
-# Upload
-'upload' => 'Last opp fil',
-'uploadbtn' => 'Last opp fil',
-'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.',
-'upload_directory_missing' => 'Oppplastingsmappen ($1) mangler og kunne ikke opprettes av tjeneren.',
-'upload_directory_read_only' => 'Opplastingsmappa ($1) er ikke skrivbar for tjeneren.',
-'uploaderror' => 'Feil under opplasting av fil',
-'upload-recreate-warning' => "'''Advarsel: En fil med det navnet har blitt slettet eller flyttet.'''
-
-Slette- og flytteloggen for denne siden gjengis her:",
-'uploadtext' => "Bruk skjemaet nedenfor for å laste opp filer.
-For å se eller søke i eksisterende filer, gå til [[Special:FileList|listen over filer]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]].
-
-For å inkludere en fil på en side, bruk en slik lenke:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.jpg<nowiki>]]</nowiki></tt>''' for å bruke bildet i opprinnelig form
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.png|200px|thumb|left|Alternativ tekst<nowiki>]]</nowiki></tt>''' for å bruke bildet med en bredde på 200&nbsp;piksler, venstrestilt og med «Alternativ tekst» som beskrivelse
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}:Filnavn.ogg<nowiki>]]</nowiki></tt>''' for å lenke direkte til filen uten å vise den",
-'upload-permitted' => 'Tillatte filtyper: $1.',
-'upload-preferred' => 'Foretrukne filtyper: $1',
-'upload-prohibited' => 'Forbudte filtyper: $1.',
-'uploadlog' => 'opplastingslogg',
-'uploadlogpage' => 'Opplastingslogg',
-'uploadlogpagetext' => 'Her er en liste over de siste opplastede filene.
-Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
-'filename' => 'Filnavn',
-'filedesc' => 'Beskrivelse',
-'fileuploadsummary' => 'Beskrivelse:',
-'filereuploadsummary' => 'Filendringer:',
-'filestatus' => 'Opphavsrettsstatus:',
-'filesource' => 'Kilde:',
-'uploadedfiles' => 'Filer som er lastet opp',
-'ignorewarning' => 'Ignorer advarselen og lagre filen likevel',
-'ignorewarnings' => 'Ignorer eventuelle advarsler',
-'minlength1' => 'Filnavn må være på minst én bokstav.',
-'illegalfilename' => 'Filnavnet «$1» inneholder ugyldige tegn. Gi filen et nytt navn og prøv igjen.',
-'badfilename' => 'Navnet på filen er blitt endret til «$1».',
-'filetype-mime-mismatch' => 'Filendelsen «.$1» tilsvarer ikke MIME-typen som oppgis i filen ($2).',
-'filetype-badmime' => 'Filer av typen «$1» kan ikke lastes opp.',
-'filetype-bad-ie-mime' => 'Kan ikke laste opp denne filen fordi Internet Explorer ville detektert denne som «$1», noe som er ikke er tillatt, og en potensielt farlig filtype.',
-'filetype-unwanted-type' => "'''«.$1»''' er en uønsket filtype.
-{{PLURAL:$3|Foretrukken filtype|Foretrukne filtyper}} er $2.",
-'filetype-banned-type' => "{{PLURAL:$4|Filtypen|Filtypene}} '''«.$1»''' er ikke {{PLURAL:$4|tillatt|tillatte}}.
-{{PLURAL:$3|Tillatt filtype|Tillatte filtyper}} er $2.",
-'filetype-missing' => 'Filen har ingen endelse (som «.jpg»).',
-'empty-file' => 'Filen du sendte inn var tom.',
-'file-too-large' => 'Filen du sendte inn var for stor.',
-'filename-tooshort' => 'Filnavnet er for kort.',
-'filetype-banned' => 'Denne filtypen er forbudt.',
-'verification-error' => 'Denne filen bestod ikke filbekreftelsen.',
-'hookaborted' => 'Endringene du prøvde å gjøre ble avbrutt av en utvidelseskrok.',
-'illegal-filename' => 'Filnavnet er ikke tillatt.',
-'overwrite' => 'Overskriving av eksisterende filer er ikke tillatt.',
-'unknown-error' => 'En ukjent feil oppsto.',
-'tmp-create-error' => 'Kunne ikke opprette midlertidig fil.',
-'tmp-write-error' => 'Feil ved skriving av midlertidig fil.',
-'large-file' => 'Det er anbefalt at filen ikke er større enn $1; denne filen er $2.',
-'largefileserver' => 'Denne filen er større enn det tjeneren er satt opp til å tillate.',
-'emptyfile' => 'Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.',
-'windows-nonascii-filename' => 'Denne wikien støtter ikke filnavn med spesialtegn.',
-'fileexists' => "Ei fil med dette navnet finnes allerede.
-Sjekk '''<tt>[[:$1]]</tt>''' hvis du ikke er sikker på at du vil forandre den.
-[[$1|thumb]]",
-'filepageexists' => "Beskrivelsessiden for denne filen finnes allerede på '''<tt>[[:$1]]</tt>''', men ingen filer med dette navnet finnes. Sammendraget du skruver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å da lastet opp filen.
-[[$1|thumb]]",
-'fileexists-extension' => "En fil med et lignende navn finnes: [[$2|thumb]]
-* Navnet på din fil: '''<tt>[[:$1]]</tt>'''
-* Navn på eksisterende fil: '''<tt>[[:$2]]</tt>'''
-Velg et annet filnavn.",
-'fileexists-thumbnail-yes' => "Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]
-Vennligst sjekk filen '''<tt>[[:$1]]</tt>'''.
-Om filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.",
-'file-thumbnail-no' => "Filnavnet begynner med '''<tt>$1</tt>'''.
-Det virker som om det er et bilde av redusert størrelse ''(miniatyrbilde)''.
-Om du har dette bildet i stor utgave, last opp det, eller endre filnavnet på denne filen.",
-'fileexists-forbidden' => 'En fil med dette navnet finnes fra før, og kan ikke erstattes.
-Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Ei fil med dette navnet finnes fra før i det delte fillageret.
-Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'Denne filen er en dublett av følgende {{PLURAL:$1|fil|filer}}:',
-'file-deleted-duplicate' => 'En fil identisk med denne filen ([[:$1]]) har tidligere blitt slettet. Du bør sjekke denne filens slettehistorikk før du prøver å laste den opp på nytt.',
-'uploadwarning' => 'Opplastingsadvarsel',
-'uploadwarning-text' => 'Vennligst endre filbeskrivelsen nedenfor og prøv igjen.',
-'savefile' => 'Lagre fil',
-'uploadedimage' => 'lastet opp «[[$1]]»',
-'overwroteimage' => 'last opp en ny versjon av «[[$1]]»',
-'uploaddisabled' => 'Opplastingsfunksjonen er slått av',
-'copyuploaddisabled' => 'Opplasting via nettadresse deaktivert.',
-'uploadfromurl-queued' => 'Opplastingen din har blitt satt i kø.',
-'uploaddisabledtext' => 'Opplasting er slått av.',
-'php-uploaddisabledtext' => 'PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.',
-'uploadscripted' => 'Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.',
-'uploadvirus' => 'Denne filen inneholder virus! Detaljer: $1',
-'uploadjava' => 'Filen er en ZIP-fil som inneholder en Java-fil av typen .class.
-Det er ikke tillatt å laste opp Java-filer, fordi de kan omgå sikkerhetsrestriksjoner.',
-'upload-source' => 'Kildefil',
-'sourcefilename' => 'Velg en fil:',
-'sourceurl' => 'Kildens URL:',
-'destfilename' => 'Ønsket filnavn:',
-'upload-maxfilesize' => 'Maksimal filstørrelse: $1',
-'upload-description' => 'Filbeskrivelse',
-'upload-options' => 'Opplastingsvalg',
-'watchthisupload' => 'Overvåk denne filen',
-'filewasdeleted' => 'Ei fil ved dette navnet har blitt lastet opp tidligere, og så slettet. Sjekk $1 før du forsøker å laste det opp igjen.',
-'filename-bad-prefix' => "Navnet på filen du laster opp begynner med '''«$1»''', hvilket er et ikke-beskrivende navn som vanligvis brukes automatisk av digitalkameraer. Vennligst bruk et mer beskrivende navn på filen.",
-'filename-prefix-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
-# Syntaksen er som følger:
-# * Alt fra tegnet «#» til slutten av linja er en kommentar
-# * Alle linjer som ikke er blanke er et prefiks som vanligvis brukes automatisk av digitale kameraer
-CIMG # Casio
-DSC_ # Nikon
-DSCF # Fuji
-DSCN # Nikon
-DUW # noen mobiltelefontyper
-IMG # generisk
-JD # Jenoptik
-MGP # Pentax
-PICT # div.
- #</pre> <!-- leave this line exactly as it is -->',
-'upload-success-subj' => 'Opplastingen er gjennomført',
-'upload-success-msg' => 'Din opplasting fra [$2] var vellykket. Den er tilgjengelig her: [[:{{ns:file}}:$1]]',
-'upload-failure-subj' => 'Opplastingsproblem',
-'upload-failure-msg' => 'Det oppsto et problem med opplastingen din fra [$2]:
-
-$1',
-'upload-warning-subj' => 'Opplastingsadvarsel',
-'upload-warning-msg' => 'Det oppsto et problem med opplastingen din fra [$2]. Du kan gå tilbake til [[Special:Upload/stash/$1|opplastingsskjemaet]] for å løse dette problemet.',
-
-'upload-proto-error' => 'Gal protokoll',
-'upload-proto-error-text' => 'Fjernopplasting behøver adresser som begynner med <code>http://</code> eller <code>ftp://</code>.',
-'upload-file-error' => 'Intern feil',
-'upload-file-error-text' => 'En intern feil oppsto under forsøk på å lage en midlertidig fil på tjeneren. Vennligst kontakt en [[Special:ListUsers/sysop|administrator]].',
-'upload-misc-error' => 'Ukjent opplastingsfeil',
-'upload-misc-error-text' => 'En ukjent feil forekom under opplastingen.
-Bekreft at adressen er gyldig og tilgjengelig, og prøv igjen.
-Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
-'upload-too-many-redirects' => 'URL-en inneholdt for mange omdirigeringer',
-'upload-unknown-size' => 'Ukjent størrelse',
-'upload-http-error' => 'En HTTP-feil oppstod: $1',
-
-# ZipDirectoryReader
-'zip-file-open-error' => 'Det oppsto en feil under åpning av filen for ZIP-sjekking.',
-'zip-wrong-format' => 'Den angitte filen var ikke en ZIP-fil.',
-'zip-bad' => 'Filen er en skadd eller på annen måte uleselig ZIP-fil.
-Den kan ikke sikkerhetskontrolleres.',
-'zip-unsupported' => 'Filen er en ZIP-fil som bruker funksjoner som ikke støttes av MediaWiki.
-Den kan ikke sikkerhetskontrolleres.',
-
-# Special:UploadStash
-'uploadstash' => 'Last opp stash',
-'uploadstash-summary' => 'Denne siden gir tilgang til filer som har blitt lastet opp (eller er i ferd med å bli lastet opp) men som ennå ikke er publisert til wikien. Disse filene er ikke synlige for andre enn brukeren som lastet dem opp.',
-'uploadstash-clear' => 'Fjern stashede filer',
-'uploadstash-nofiles' => 'Du har ingen stashede filer.',
-'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi dine redigeringsrettigheter har utløpt. Prøv igjen.',
-'uploadstash-errclear' => 'Fjerning av filene var mislykket.',
-'uploadstash-refresh' => 'Oppdater listen over filer',
-
-# img_auth script messages
-'img-auth-accessdenied' => 'Ingen tilgang',
-'img-auth-nopathinfo' => 'Manglende PATH_INFO.
-Tjeneren din er ikke satt opp til å gi denne informasjonen.
-Den er kanskje CGI-basert og støtter ikke img_auth.
-[//www.mediawiki.org/wiki/Manual:Image_Authorization Se bildeautorisasjon.]',
-'img-auth-notindir' => 'Den ønskede stien finnes ikke i den oppsatte opplastingsmappa.',
-'img-auth-badtitle' => 'Kunne ikke lage en gyldig tittel ut fra «$1».',
-'img-auth-nologinnWL' => 'Du er ikke logget inn, og «$1» er ikke på hvitelista.',
-'img-auth-nofile' => 'Filen «$1» finnes ikke.',
-'img-auth-isdir' => 'Du prøver å få tilgang til mappa «$1».
-Kun filtilgang tillates.',
-'img-auth-streaming' => 'Sender «$1».',
-'img-auth-public' => 'Funksjonen til img_auth.php er å lage filer fra en privat wiki.
-Denne wikien er satt opp som en offentlig wiki.
-For best mulig sikkerhet er img_auth.php slått av.',
-'img-auth-noread' => 'Brukeren har ikke tilgang til å lese «$1».',
-'img-auth-bad-query-string' => 'URL-en har en ugyldig spørrestreng.',
-
-# HTTP errors
-'http-invalid-url' => 'Ugyldig internettadresse: $1',
-'http-invalid-scheme' => 'Internettadresser med «$1»-formen støttes ikke',
-'http-request-error' => 'HTTP-forespørselen feilet på grunn av en ukjent feil.',
-'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>
-'upload-curl-error6' => 'Kunne ikke nå adressen',
-'upload-curl-error6-text' => 'Adressen kunne ikke nås. Vennligst dobbelsjekk at adressen er korrekt og at siden er oppe.',
-'upload-curl-error28' => 'Opplastingstimeout',
-'upload-curl-error28-text' => 'Siden brukte for lang tid på å reagere. Vennligst sjekk at siden er oppe, og vent en kort stund for du prøver igjen. Vurder å prøve på en mindre hektisk tid.',
-
-'license' => 'Lisens:',
-'license-header' => 'Lisensiering',
-'nolicense' => 'Ingen spesifisert',
-'license-nopreview' => '(Forhåndsvisning ikke tilgjengelig)',
-'upload_source_url' => ' (en gyldig, offentlig tilgjengelig adresse)',
-'upload_source_file' => ' (en fil på din datamaskin)',
-
-# Special:ListFiles
-'listfiles-summary' => 'Denne spesialsiden viser alle opplastede filer.
-NÃ¥r den filtreres av en bruker, vises bare de sist opplastede versjonene av filen.',
-'listfiles_search_for' => 'Søk etter filnavn:',
-'imgfile' => 'fil',
-'listfiles' => 'Filliste',
-'listfiles_thumb' => 'Miniatyrbilde',
-'listfiles_date' => 'Dato',
-'listfiles_name' => 'Navn',
-'listfiles_user' => 'Bruker',
-'listfiles_size' => 'Størrelse (bytes)',
-'listfiles_description' => 'Beskrivelse',
-'listfiles_count' => 'Versjoner',
-
-# File description page
-'file-anchor-link' => 'Fil',
-'filehist' => 'Filhistorikk',
-'filehist-help' => 'Klikk på en dato/klokkeslett for å se filen slik den var da.',
-'filehist-deleteall' => 'slett alt',
-'filehist-deleteone' => 'slett',
-'filehist-revert' => 'tilbakestill',
-'filehist-current' => 'nåværende',
-'filehist-datetime' => 'Dato/tid',
-'filehist-thumb' => 'Miniatyrbilde',
-'filehist-thumbtext' => 'Miniatyrbilde av versjonen fra $1',
-'filehist-nothumb' => 'Intet miniatyrbilde',
-'filehist-user' => 'Bruker',
-'filehist-dimensions' => 'Dimensjoner',
-'filehist-filesize' => 'Filstørrelse',
-'filehist-comment' => 'Kommentar',
-'filehist-missing' => 'Fil mangler',
-'imagelinks' => 'Filbruk',
-'linkstoimage' => 'Følgende {{PLURAL:$1|side|$1 sider}} har lenker til denne filen:',
-'linkstoimage-more' => 'Mer enn $1 {{PLURAL:$1|side|sider}} lenker til denne filen.
-Følgende liste viser {{PLURAL:$1|den første siden|de $1 første sidene}}.
-En [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengelig.',
-'nolinkstoimage' => 'Det er ingen sider som bruker denne filen.',
-'morelinkstoimage' => 'Vis [[Special:WhatLinksHere/$1|flere lenker]] til denne filen.',
-'linkstoimage-redirect' => '$1 (filomdirigering) $2',
-'duplicatesoffile' => 'Følgende {{PLURAL:$1|fil er en dublett|filer er dubletter}} av denne filen ([[Special:FileDuplicateSearch/$2|fler detaljer]]):',
-'sharedupload' => 'Denne filen er fra $1 og kan bli brukt av andre prosjekter.',
-'sharedupload-desc-there' => 'Denne filen er fra $1 og kan brukes på andre prosjekter.
-Se [$2 filbeskrivelsessida] for mer informasjon.',
-'sharedupload-desc-here' => 'Denne filen er fra $1 og kan brukes av andre prosjekter.
-Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
-'filepage-nofile' => 'Det finnes ingen fil med dette navnet.',
-'filepage-nofile-link' => 'Ingen fil med dette navnet eksisterer, men du kan [$1 laste den opp].',
-'uploadnewversion-linktext' => 'Last opp en ny versjon av denne filen',
-'shared-repo-from' => 'fra $1',
-'shared-repo' => 'et delt fillager',
-
-# File reversion
-'filerevert' => 'Tilbakestill $1',
-'filerevert-legend' => 'Tilbakestill fil',
-'filerevert-intro' => "Du tilbakestiller '''[[Media:$1|$1]]''' til [$4 versjonen à $2, $3].",
-'filerevert-comment' => 'Ã…rsak:',
-'filerevert-defaultcomment' => 'Tilbakestilte til versjonen à $1, $2',
-'filerevert-submit' => 'Tilbakestill',
-'filerevert-success' => "'''[[Media:$1|$1]]''' ble tilbakestilt til [$4 versjonen à $2, $3].",
-'filerevert-badversion' => 'Det er ingen tidligere lokal versjon av denne filen med det gitte tidstrykket.',
-
-# File deletion
-'filedelete' => 'Slett $1',
-'filedelete-legend' => 'Slett fil',
-'filedelete-intro' => "Du er i ferd med å slette filen '''[[Media:$1|$1]]''' sammen med hele dens historikk.",
-'filedelete-intro-old' => "Du sletter versjonen av '''[[Media:$1|$1]]''' à [$4 $3, $2].",
-'filedelete-comment' => 'Ã…rsak:',
-'filedelete-submit' => 'Slett',
-'filedelete-success' => "'''$1''' ble slettet.",
-'filedelete-success-old' => "Versjonen av '''[[Media:$1|$1]]''' à $3, $2 ble slettet.",
-'filedelete-nofile' => "'''$1''' finnes ikke.",
-'filedelete-nofile-old' => "Det er ingen arkivert versjon av '''$1''' med de gitte attributtene.",
-'filedelete-otherreason' => 'Annen/utdypende grunn:',
-'filedelete-reason-otherlist' => 'Annen grunn',
-'filedelete-reason-dropdown' => '*Vanlige slettingsgrunner
-** Opphavsrettsbrudd
-** Duplikatfil',
-'filedelete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'filedelete-maintenance' => 'Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.',
-
-# MIME search
-'mimesearch' => 'MIME-søk',
-'mimesearch-summary' => 'Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <tt>image/jpeg</tt>.',
-'mimetype' => 'MIME-type:',
-'download' => 'last ned',
-
-# Unwatched pages
-'unwatchedpages' => 'Sider som ikke er overvåket',
-
-# List redirects
-'listredirects' => 'Liste over omdirigeringer',
-
-# Unused templates
-'unusedtemplates' => 'Ubrukte maler',
-'unusedtemplatestext' => 'Denne siden lister opp alle sider i malnavnerommet ({{ns:template}}:) som ikke er inkludert på en annen side. Husk å sjekke for andre slags lenker til malen før du sletter den.',
-'unusedtemplateswlh' => 'andre lenker',
-
-# Random page
-'randompage' => 'Tilfeldig side',
-'randompage-nopages' => 'Det er ingen sider i {{PLURAL:$2|det følgende navnrommet|de følgende navnrommene}}: $1.',
-
-# Random redirect
-'randomredirect' => 'Tilfeldig omdirigering',
-'randomredirect-nopages' => 'Det er ingen omdirigeringer i navnerommet $1.',
-
-# Statistics
-'statistics' => 'Statistikk',
-'statistics-header-pages' => 'Sidestatistikk',
-'statistics-header-edits' => 'Redigeringsstatistikk',
-'statistics-header-views' => 'Visningsstatistikk',
-'statistics-header-users' => 'Brukerstatistikk',
-'statistics-header-hooks' => 'Øvrig statistikk',
-'statistics-articles' => 'Innholdssider',
-'statistics-pages' => 'Sider',
-'statistics-pages-desc' => 'Alle sider på wikien, inkludert diskusjonssider, omdirigeringer o.l.',
-'statistics-files' => 'Opplastede filer',
-'statistics-edits' => 'Redigeringer siden {{SITENAME}} ble opprettet',
-'statistics-edits-average' => 'Gjennomsnittlig antall redigeringer per side',
-'statistics-views-total' => 'Totalt antall visninger',
-'statistics-views-total-desc' => 'Visninger av ikke-eksisterende sider og spesielsider inkluderes ikke',
-'statistics-views-peredit' => 'Visninger per redigering',
-'statistics-users' => 'Registrerte [[Special:ListUsers|brukere]]',
-'statistics-users-active' => 'Aktive brukere',
-'statistics-users-active-desc' => 'Brukere som har utført handlinger {{PLURAL:$1|det siste døgnet|de siste $1 dagene}}',
-'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]]",
-
-'doubleredirects' => 'Doble omdirigeringer',
-'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
-Hver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.
-<del>Gjennomstrøkne</del> sider har blitt fikset.',
-'double-redirect-fixed-move' => '[[$1]] har blitt flyttet, og er nå en omdirigering til [[$2]]',
-'double-redirect-fixed-maintenance' => 'Fikser dobbel omdirigering fra [[$1]] til [[$2]].',
-'double-redirect-fixer' => 'Omdirigeringsfikser',
-
-'brokenredirects' => 'Brutte omdirigeringer',
-'brokenredirectstext' => 'Følgende omdirigeringer peker til ikkeeksisterende sider:',
-'brokenredirects-edit' => 'rediger',
-'brokenredirects-delete' => 'slett',
-
-'withoutinterwiki' => 'Sider uten språklenker',
-'withoutinterwiki-summary' => 'Følgende sider lenker ikke til andre språkversjoner:',
-'withoutinterwiki-legend' => 'Prefiks',
-'withoutinterwiki-submit' => 'Vis',
-
-'fewestrevisions' => 'Artikler med færrest revisjoner',
-
-# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
-'ncategories' => '$1 {{PLURAL:$1|kategori|kategorier}}',
-'nlinks' => '$1 {{PLURAL:$1|lenke|lenker}}',
-'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmer}}',
-'nrevisions' => '$1 {{PLURAL:$1|revisjon|revisjoner}}',
-'nviews' => '$1 {{PLURAL:$1|visning|visninger}}',
-'nimagelinks' => 'Brukt på $1 {{PLURAL:$1|side|sider}}',
-'ntransclusions' => 'brukt på $1 {{PLURAL:$1|side|sider}}',
-'specialpage-empty' => 'Denne siden er tom.',
-'lonelypages' => 'Foreldreløse sider',
-'lonelypagestext' => 'Følgende sider blir ikke lenket til eller brukt på andre sider på {{SITENAME}}.',
-'uncategorizedpages' => 'Ukategoriserte sider',
-'uncategorizedcategories' => 'Ukategoriserte kategorier',
-'uncategorizedimages' => 'Ukategoriserte filer',
-'uncategorizedtemplates' => 'Ukategoriserte maler',
-'unusedcategories' => 'Ubrukte kategorier',
-'unusedimages' => 'Ubrukte filer',
-'popularpages' => 'Populære sider',
-'wantedcategories' => 'Ønskede kategorier',
-'wantedpages' => 'Etterspurte sider',
-'wantedpages-badtitle' => 'Ugyldig tittel i resultatene: $1',
-'wantedfiles' => 'Ønskede filer',
-'wantedtemplates' => 'Etterspurte maler',
-'mostlinked' => 'Sider med flest lenker til seg',
-'mostlinkedcategories' => 'Kategorier med flest sider',
-'mostlinkedtemplates' => 'Mest brukte maler',
-'mostcategories' => 'Sider med flest kategorier',
-'mostimages' => 'Mest brukte filer',
-'mostrevisions' => 'Artikler med flest revisjoner',
-'prefixindex' => 'Alle sider med prefiks',
-'shortpages' => 'Korte sider',
-'longpages' => 'Lange sider',
-'deadendpages' => 'Blindveisider',
-'deadendpagestext' => 'Følgende sider lenker ikke til andre sider på {{SITENAME}}.',
-'protectedpages' => 'LÃ¥ste sider',
-'protectedpages-indef' => 'Kun beskyttelser på ubestemt tid',
-'protectedpages-cascade' => 'Kun dypbeskyttelse',
-'protectedpagestext' => 'Følgende sider er låst for flytting eller redigering',
-'protectedpagesempty' => 'Ingen sider er for øyeblikket låst med disse paramterne.',
-'protectedtitles' => 'Beskyttede titler',
-'protectedtitlestext' => 'Følgende titler er beskyttet fra opprettelse',
-'protectedtitlesempty' => 'Ingen titler beskyttes med disse parameterne for øyeblikket.',
-'listusers' => 'Brukerliste',
-'listusers-editsonly' => 'Vis bare brukere med redigeringer',
-'listusers-creationsort' => 'Sorter etter opprettelsesdato',
-'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
-'usercreated' => '{{GENDER:$3|Opprettet}} $2 $1',
-'newpages' => 'Nye sider',
-'newpages-username' => 'Brukernavn:',
-'ancientpages' => 'Eldste sider',
-'move' => 'Flytt',
-'movethispage' => 'Flytt denne siden',
-'unusedimagestext' => 'Følgende filer eksisterer men er ikke innlagt på noen sider.
-Merk at andre sider kanskje lenker til en fil med en direkte lenke, så filen listes her selv om den faktisk er i bruk.',
-'unusedcategoriestext' => 'Følgende kategorier finnes, men det er ingen sider i dem.',
-'notargettitle' => 'Intet mål',
-'notargettext' => 'Du oppga ikke en målside eller bruker å utføre denne funksjonen på.',
-'nopagetitle' => 'MÃ¥lsiden finnes ikke',
-'nopagetext' => 'Siden du ville flytte finnes ikke.',
-'pager-newer-n' => '{{PLURAL:$1|1 nyere|$1 nyere}}',
-'pager-older-n' => '{{PLURAL:$1|1 eldre|$1 eldre}}',
-'suppress' => 'Historikkrydding',
-'querypage-disabled' => 'Denne spesialsiden er deaktivert av ytelsesårsaker.',
-
-# Book sources
-'booksources' => 'Bokkilder',
-'booksources-search-legend' => 'Søk etter bokkilder',
-'booksources-go' => 'GÃ¥',
-'booksources-text' => 'Under er en liste over lenker til andre sider som selger nye og brukte bøker, og kan også ha videre informasjon om bøker du leter etter:',
-'booksources-invalid-isbn' => 'Det gitte ISBN-nummeret er ugyldig; sjekk om du har angitt det riktig.',
-
-# Special:Log
-'specialloguserlabel' => 'Bruker:',
-'speciallogtitlelabel' => 'Tittel:',
-'log' => 'Logger',
-'all-logs-page' => 'Alle offentlige logger',
-'alllogstext' => 'Kombinert visning av alle loggene på {{SITENAME}}.
-Du kan minske antallet resultater ved å velge loggtype, brukernavn eller den siden som er påvirket (husk å skille mellom store og små bokstaver).',
-'logempty' => 'Ingen elementer i loggen.',
-'log-title-wildcard' => 'Søk i titler som starter med denne teksten',
-
-# Special:AllPages
-'allpages' => 'Alle sider',
-'alphaindexline' => '$1 til $2',
-'nextpage' => 'Neste side ($1)',
-'prevpage' => 'Forrige side ($1)',
-'allpagesfrom' => 'Vis sider fra og med:',
-'allpagesto' => 'Vis sider som slutter på:',
-'allarticles' => 'Alle sider',
-'allinnamespace' => 'Alle sider i $1-navnerommet',
-'allnotinnamespace' => 'Alle sider (ikke i $1-navnerommet)',
-'allpagesprev' => 'Forrige',
-'allpagesnext' => 'Neste',
-'allpagessubmit' => 'GÃ¥',
-'allpagesprefix' => 'Vis sider med prefikset:',
-'allpagesbadtitle' => 'Den angitte sidetittelen var ugyldig eller hadde et interwiki-prefiks. Den kan inneholde ett eller flere tegn som ikke kan brukes i titler.',
-'allpages-bad-ns' => '{{SITENAME}} har ikke navnerommet «$1».',
-
-# Special:Categories
-'categories' => 'Kategorier',
-'categoriespagetext' => 'Følgende {{PLURAL:$1|kategori|kategorier}} inneholder sider eller media.
-[[Special:UnusedCategories|Ubrukte kategorier]] vises ikke her.
-Se også [[Special:WantedCategories|ønskede kategorier]].',
-'categoriesfrom' => 'Vis kategorier fra og med:',
-'special-categories-sort-count' => 'soter etter antall',
-'special-categories-sort-abc' => 'sorter alfabetisk',
-
-# Special:DeletedContributions
-'deletedcontributions' => 'Slettede brukerbidrag',
-'deletedcontributions-title' => 'Slettede brukerbidrag',
-'sp-deletedcontributions-contribs' => 'bidrag',
-
-# Special:LinkSearch
-'linksearch' => 'Søk i eksterne lenker',
-'linksearch-pat' => 'Søkemønster:',
-'linksearch-ns' => 'Navnerom:',
-'linksearch-ok' => 'Søk',
-'linksearch-text' => 'Jokertegn som «*.wikipedia.org» kan brukes.<br />Støttede protokoller: <tt>$1</tt>',
-'linksearch-line' => '$1 lenkes fra $2',
-'linksearch-error' => 'Jokertegn kan kun brukes foran tjenernavnet.',
-
-# Special:ListUsers
-'listusersfrom' => 'Vis brukere fra og med:',
-'listusers-submit' => 'Vis',
-'listusers-noresult' => 'Ingen bruker funnet.',
-'listusers-blocked' => '(konto blokkert)',
-
-# Special:ActiveUsers
-'activeusers' => 'Liste over aktive brukere',
-'activeusers-intro' => 'Dette er en liste over brukere som har hatt en eller annen form for aktivitet innenfor {{PLURAL:$1|den siste dagen|de siste dagene}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}',
-'activeusers-from' => 'Vis brukere fra og med:',
-'activeusers-hidebots' => 'Skjul roboter',
-'activeusers-hidesysops' => 'Skjul administratorer',
-'activeusers-noresult' => 'Ingen brukere funnet.',
-
-# Special:Log/newusers
-'newuserlogpage' => 'Brukeropprettelseslogg',
-'newuserlogpagetext' => 'Dette er en logg over brukeropprettelser.',
-'newuserlog-byemail' => 'passord sendt på e-post',
-'newuserlog-create-entry' => 'Ny brukerkonto',
-'newuserlog-create2-entry' => 'opprettet kontoen $1',
-'newuserlog-autocreate-entry' => 'Konto opprettet automatisk',
-
-# Special:ListGroupRights
-'listgrouprights' => 'Rettigheter for brukergrupper',
-'listgrouprights-summary' => 'Følgende er en liste over brukergrupper som er definert på denne wikien, og hvilke rettigheter de har.
-Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrouprights-helppage}}|her]].',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Innvilget rettighet</span>
-* <span class="listgrouprights-granted">Tilbaketrukket rettighet</span>',
-'listgrouprights-group' => 'Gruppe',
-'listgrouprights-rights' => 'Rettigheter',
-'listgrouprights-helppage' => 'Help:Grupperettigheter',
-'listgrouprights-members' => '(liste over medlemmer)',
-'listgrouprights-addgroup' => 'Kan legge til {{PLURAL:$2|gruppa|gruppene}}: $1',
-'listgrouprights-removegroup' => 'Kan fjerne {{PLURAL:$2|gruppa|gruppene}}: $1',
-'listgrouprights-addgroup-all' => 'Kan legge til alle grupper',
-'listgrouprights-removegroup-all' => 'Kan fjerne alle grupper',
-'listgrouprights-addgroup-self' => 'Kan legge til {{PLURAL:$2|gruppe|gruppene}} til egen konto: $1',
-'listgrouprights-removegroup-self' => 'Kan ta vekk {{PLURAL:$2|gruppe|grupper}} fra egen konto: $1',
-'listgrouprights-addgroup-self-all' => 'Kan legge til alle grupper til egen konto',
-'listgrouprights-removegroup-self-all' => 'Kan ta bort alle grupper fra egen konto',
-
-# E-mail user
-'mailnologin' => 'Ingen avsenderadresse',
-'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
-'emailuser' => 'E-post til denne brukeren',
-'emailpage' => 'E-post til bruker',
-'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
-Den e-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil dukke opp i «fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
-'usermailererror' => 'E-postobjekt returnerte feilen:',
-'defemailsubject' => 'E-post fra {{SITENAME}}',
-'usermaildisabled' => 'Brukerepost deaktivert',
-'usermaildisabledtext' => 'Du kan ikke sende epost til andre brukere på denne wikien',
-'noemailtitle' => 'Ingen e-postadresse',
-'noemailtext' => 'Dene brukeren har ikke oppgitt en gyldig e-postadresse.',
-'nowikiemailtitle' => 'Ingen e-post tillatt',
-'nowikiemailtext' => 'Denne brukeren har valgt å ikke motta e-post fra andre brukere.',
-'emailnotarget' => 'Ikke-eksisterende eller ugyldig brukernavn for mottaker.',
-'emailtarget' => 'Skriv inn brukernavnet på mottakeren',
-'emailusername' => 'Brukernavn:',
-'emailusernamesubmit' => 'Send',
-'email-legend' => 'Send en e-post til en annen {{SITENAME}}-bruker',
-'emailfrom' => 'Fra:',
-'emailto' => 'Til:',
-'emailsubject' => 'Emne:',
-'emailmessage' => 'Beskjed:',
-'emailsend' => 'Send',
-'emailccme' => 'Send meg en kopi av beskjeden min.',
-'emailccsubject' => 'Kopi av din beskjed til $1: $2',
-'emailsent' => 'E-post sendt',
-'emailsenttext' => 'E-postbeskjeden er sendt',
-'emailuserfooter' => 'E-posten ble sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.',
-
-# User Messenger
-'usermessage-summary' => 'Etterlater en systembeskjed.',
-'usermessage-editor' => 'Systembudbringer',
-
-# Watchlist
-'watchlist' => 'Overvåkningsliste',
-'mywatchlist' => 'Overvåkningsliste',
-'watchlistfor2' => 'For $1 $2',
-'nowatchlist' => 'Du har ingenting i overvåkningslisten.',
-'watchlistanontext' => 'Vennligst $1 for å vise eller redigere sider på overvåkningslisten din.',
-'watchnologin' => 'Ikke logget inn',
-'watchnologintext' => 'Du må være [[Special:UserLogin|logget inn]] for å kunne endre overvåkningslisten.',
-'addwatch' => 'Legg til i overvåkningslisten',
-'addedwatchtext' => "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]].
-Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp her, og siden vil fremstå '''uthevet''' i [[Special:RecentChanges|listen over siste endringer]] for å gjøre det lettere å finne den.",
-'removewatch' => 'Fjern fra overvåkningslisten',
-'removedwatchtext' => 'Siden «[[:$1]]» er fjernet fra [[Special:Watchlist|overvåkningslisten din]].',
-'watch' => 'Overvåk',
-'watchthispage' => 'Overvåk denne siden',
-'unwatch' => 'Avslutt overvåkning',
-'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'''",
-'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}}.',
-'iteminvalidname' => 'Problem med «$1», ugyldig navn&nbsp;…',
-'wlnote' => "Nedenfor er {{PLURAL:$1|den siste endringen|de siste $1 endringene}} {{PLURAL:$2|den siste timen|de siste '''$2''' timene}}.",
-'wlshowlast' => 'Vis siste $1 timer $2 dager $3',
-'watchlist-options' => 'Alternativ for overvåkningslisten',
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Overvåker…',
-'unwatching' => 'Fjerner fra overvåkningsliste…',
-'watcherrortext' => 'Det oppsto en feil under endring av overvåkningsinnstillingene dine for «$1».',
-
-'enotif_mailer' => '{{SITENAME}}s påminnelsessystem',
-'enotif_reset' => 'Merk alle sider som besøkt',
-'enotif_newpagetext' => 'Dette er en ny side.',
-'enotif_impersonal_salutation' => '{{SITENAME}}-bruker',
-'changed' => 'endret',
-'created' => 'opprettet',
-'enotif_subject' => '{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED av $PAGEEDITOR',
-'enotif_lastvisited' => 'Se $1 for alle endringer siden ditt forrige besøk.',
-'enotif_lastdiff' => 'Se $1 for å se denne endringen.',
-'enotif_anon_editor' => 'anonym bruker $1',
-'enotif_body' => 'Kjære $WATCHINGUSERNAME,
-
-
-{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED den $PAGEEDITDATE av $PAGEEDITOR, se $PAGETITLE_URL for den nåværende revisjonen.
-
-$NEWPAGE
-
-Redigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT
-
-Kontakt brukeren:
-e-post: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
-
-Det vil ikke komme flere varsler om endringer på denne siden med mindre du besøker den.
-Du kan også fjerne varslingsflagg for alle overvåkede sider i overvåkningslisten din.
-
- Ditt vennlige varslingssystem for {{SITENAME}}
-
---
-For å endre innstillingene for e-postvarsler, se
-{{canonicalurl:{{#special:Preferences}}}}
-
-For å endre innstillingene for overvåkningslisten, se
-{{canonicalurl:{{#special:EditWatchlist}}}}
-
-For å slette en side fra overvåkningssiden, se
-$UNWATCHURL
-
-Tilbakemelding og videre assistanse:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
-
-# Delete
-'deletepage' => 'Slett side',
-'confirm' => 'Bekreft',
-'excontent' => 'Innholdet var: «$1»',
-'excontentauthor' => 'innholdet var «$1» (og eneste bidragsyter var [[Special:Contributions/$2|$2]])',
-'exbeforeblank' => 'innholdet før siden ble tømt var: «$1»',
-'exblank' => 'siden var tom',
-'delete-confirm' => 'Slett «$1»',
-'delete-legend' => 'Slett',
-'historywarning' => 'Advarsel: Siden du er i ferd med å slette har en historikk med omtrent {{PLURAL:$1|én revisjon|$1 revisjoner}}:',
-'confirmdeletetext' => 'Du holder på å slette en side sammen med historikken.
-Bekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].',
-'actioncomplete' => 'Gjennomført',
-'actionfailed' => 'Handling mislyktes',
-'deletedtext' => '«$1» er slettet.
-Se $2 for en oversikt over de siste slettingene.',
-'deletedarticle' => 'slettet «[[$1]]»',
-'suppressedarticle' => 'fjernet «[[$1]]»',
-'dellogpage' => 'Slettingslogg',
-'dellogpagetext' => 'Under er ei liste over nylige slettinger.',
-'deletionlog' => 'slettingslogg',
-'reverted' => 'Gjenopprettet en tidligere versjon',
-'deletecomment' => 'Ã…rsak:',
-'deleteotherreason' => 'Annen/utdypende grunn:',
-'deletereasonotherlist' => 'Annen grunn',
-'deletereason-dropdown' => '* Vanlige grunner for sletting
-** På forfatters forespørsel
-** Opphavsrettsbrudd
-** Vandalisme',
-'delete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'delete-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.',
-'delete-warning-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.',
-
-# Rollback
-'rollback' => 'Fjern redigeringer',
-'rollback_short' => 'Tilbakestill',
-'rollbacklink' => 'tilbakestill',
-'rollbackfailed' => 'Kunne ikke tilbakestille',
-'cantrollback' => 'Kan ikke fjerne redigering; den siste brukeren er den eneste forfatteren.',
-'alreadyrolled' => 'Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.
-
-Den siste redigeringen ble foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Redigeringskommentaren var: «''$1''»",
-'revertpage' => 'Tilbakestilte endring av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til siste versjon av [[User:$1|$1]]',
-'revertpage-nouser' => 'Tilbakestilte endringer av (fjernet brukernavn) til siste versjon av [[User:$1|$1]]',
-'rollback-success' => 'Tilbakestilte endringer av $1; endret til siste versjon av $2.',
-
-# Edit tokens
-'sessionfailure-title' => 'Sesjonsfeil',
-'sessionfailure' => "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
-
-# Protect
-'protectlogpage' => 'Beskyttelseslogg',
-'protectlogtext' => 'Nedenfor er en liste over endringer av sidebeskyttelser.
-Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeldende sidebeskyttelser.',
-'protectedarticle' => 'beskyttet «[[$1]]»',
-'modifiedarticleprotection' => 'endret beskyttelsesnivå for «[[$1]]»',
-'unprotectedarticle' => 'fjernet beskyttelse av «[[$1]]»',
-'movedarticleprotection' => 'flyttet beskyttelsesinnstillinger fra «[[$2]]» til «[[$1]]»',
-'protect-title' => 'Låser «$1»',
-'prot_1movedto2' => '[[$1]] flyttet til [[$2]]',
-'protect-legend' => 'Bekreft låsing',
-'protectcomment' => 'Ã…rsak:',
-'protectexpiry' => 'Utløper:',
-'protect_expiry_invalid' => 'Utløpstiden er ugyldig.',
-'protect_expiry_old' => 'Utløpstiden har allerede vært.',
-'protect-unchain-permissions' => 'LÃ¥s opp flere beskyttelsesinnstillinger',
-'protect-text' => "Du kan se og endre beskyttelsesnivået for siden '''$1''' her.",
-'protect-locked-blocked' => "Du kan ikke endre beskyttelsesnivåer mens du er blokkert. Dette er de nåværende innstillingene for siden '''$1''':",
-'protect-locked-dblock' => "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de nåværende innstillingene for siden '''$1''':",
-'protect-locked-access' => "Kontoen din har ikke tillatelse til å endre sidebeskyttelsesnivå.
-Dette er de nåværende innstillingene for siden '''$1''':",
-'protect-cascadeon' => 'Denne siden er for tiden beskyttet fordi den er inkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.
-Du kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.',
-'protect-default' => 'Tillat alle brukere',
-'protect-fallback' => 'Må ha «$1»-tillatelse',
-'protect-level-autoconfirmed' => 'Blokker nye og uregistrerte brukere',
-'protect-level-sysop' => 'Kun administratorer',
-'protect-summary-cascade' => 'dypbeskyttelse',
-'protect-expiring' => 'utløper $1 (UTC)',
-'protect-expiry-indefinite' => 'ubestemt',
-'protect-cascade' => 'Beskytt sider som er inkludert på denne siden (dypbeskyttelse)',
-'protect-cantedit' => 'Du kan ikke endre beskyttelsesnivået til denne siden fordi du ikke har tillatelse til å redigere den.',
-'protect-othertime' => 'Annen tid:',
-'protect-othertime-op' => 'annen tid',
-'protect-existing-expiry' => 'Gjeldende utløpstid: $3 $2',
-'protect-otherreason' => 'Annen/utdypende grunn:',
-'protect-otherreason-op' => 'Annen grunn',
-'protect-dropdown' => '*Vanlige låsingsårsaker
-** Gjentatt hærverk
-** Gjentatt spam
-** Redigeringskrig
-** Side med mange besøkende',
-'protect-edit-reasonlist' => 'Rediger låsingsgrunner',
-'protect-expiry-options' => '1 time:1 hour,1 dag:1 day,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite',
-'restriction-type' => 'Tillatelse:',
-'restriction-level' => 'Restriksjonsnivå:',
-'minimum-size' => 'Minimumstørrelse',
-'maximum-size' => 'Maksimumstørrelse:',
-'pagesize' => '(byte)',
-
-# Restrictions (nouns)
-'restriction-edit' => 'Redigering',
-'restriction-move' => 'Flytting',
-'restriction-create' => 'Opprett',
-'restriction-upload' => 'Last opp',
-
-# Restriction levels
-'restriction-level-sysop' => 'fullstendig låst',
-'restriction-level-autoconfirmed' => 'halvlåst',
-'restriction-level-all' => 'alle nivåer',
-
-# Undelete
-'undelete' => 'Vis slettede sider',
-'undeletepage' => 'Se og gjenopprett slettede sider',
-'undeletepagetitle' => "'''Følgende innhold er slettede revisjoner av [[:$1]].'''",
-'viewdeletedpage' => 'Vis slettede sider',
-'undeletepagetext' => 'Følgende {{PLURAL:$1|side|sider}} er slettet, men finnes fortsatt i arkivet og kan gjenopprettes. Arkivet blir periodevis slettet.',
-'undelete-fieldset-title' => 'Gjenopprett revisjoner',
-'undeleteextrahelp' => "For å gjenopprette hele sidens historikk, la alle boksene være tomme og klikk '''''{{int:undeletebtn}}'''''.
-For å gjenopprette kun deler, kryss av boksene for revisjonene du vil gjenopprette og klikk '''''{{int:undeletebtn}}'''''.",
-'undeleterevisions' => '{{PLURAL:$1|Én versjon arkivert|$1 versjoner arkiverte}}',
-'undeletehistory' => 'Om du gjenoppretter siden vil alle revisjoner gjenopprettes i historikken.
-Dersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gjenopprettede revisjonene dukke opp før denne i redigeringshistorikken.',
-'undeleterevdel' => 'Gjenoppretting kan ikke utføres dersom det resulterer i at den øverste revisjonen blir delvis slettet. I slike tilfeller må du fjerne merkingen av den nyeste slettede revisjonen.',
-'undeletehistorynoadmin' => 'Denne artikkelen har blitt slettet. Grunnen for slettingen vises i oppsummeringen nedenfor, sammen med detaljer om brukerne som redigerte siden før den ble slettet. Teksten i disse slettede revisjonene er kun tilgjengelig for administratorer.',
-'undelete-revision' => 'Slettet revisjon av $1 (per $4 $5) av $3:',
-'undeleterevision-missing' => 'Ugyldig eller manglende revisjon. Du kan ha en ødelagt lenke, eller revisjonen har blitt fjernet fra arkivet.',
-'undelete-nodiff' => 'Ingen tidligere revisjoner funnet.',
-'undeletebtn' => 'Gjenopprett',
-'undeletelink' => 'vis/gjenopprett',
-'undeleteviewlink' => 'vis',
-'undeletereset' => 'Nullstill',
-'undeleteinvert' => 'Inverter valg',
-'undeletecomment' => 'Ã…rsak:',
-'undeletedarticle' => 'gjenopprettet «[[$1]]»',
-'undeletedrevisions' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet',
-'undeletedrevisions-files' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet',
-'undeletedfiles' => '{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet',
-'cannotundelete' => 'Kunne ikke gjenopprette siden (den kan være gjenopprettet av noen andre).',
-'undeletedpage' => "'''$1 ble gjenopprettet'''
-
-Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
-'undelete-header' => 'Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.',
-'undelete-search-box' => 'Søk i slettede sider',
-'undelete-search-prefix' => 'Vis sider som starter med:',
-'undelete-search-submit' => 'Søk',
-'undelete-no-results' => 'Ingen passende sider funnet i slettingsarkivet.',
-'undelete-filename-mismatch' => 'Kan ikke gjenopprette filrevisjon med tidstrykk $1: ikke samsvarende filnavn',
-'undelete-bad-store-key' => 'Kan ikke gjenopprette filrevisjon med tidstrykk $1: fil manglet før sletting',
-'undelete-cleanup-error' => 'Feil i sletting av ubrukt arkivfil «$1».',
-'undelete-missing-filearchive' => 'Klarte ikke å gjenopprette filarkivet med ID $1 fordi det ikke er i databasen. Det kan ha blitt gjenopprettet tidligere.',
-'undelete-error-short' => 'Feil under filgjenoppretting: $1',
-'undelete-error-long' => 'Feil oppsto under filgjenoppretting:
-
-$1',
-'undelete-show-file-confirm' => 'Er du sikker på at du vil vise en slettet versjon av filen «<nowiki>$1</nowiki>» fra den $2 klokken $3?',
-'undelete-show-file-submit' => 'Ja',
-
-# Namespace form on various pages
-'namespace' => 'Navnerom:',
-'invert' => 'Inverter valg',
-'tooltip-invert' => 'Kryss av denne boksen for å skjule endringer på sider i det valgte navnerommet (og tilhørende navnerom hvis de er avkrysset også)',
-'namespace_association' => 'Tilknyttet navnerom',
-'tooltip-namespace_association' => 'Kryss av denne boksen for å også inkludere diskusjons- eller emnenavnerommet som er tilknyttet det valgte navnerommet',
-'blanknamespace' => '(Hoved)',
-
-# Contributions
-'contributions' => 'Brukerbidrag',
-'contributions-title' => 'Brukerbidrag av $1',
-'mycontris' => 'Egne bidrag',
-'contribsub2' => 'For $1 ($2)',
-'nocontribs' => 'Ingen endringer er funnet som passer disse kriteriene.',
-'uctop' => '(siste)',
-'month' => 'Fra måned (og tidligere):',
-'year' => 'Fra år (og tidligere):',
-
-'sp-contributions-newbies' => 'Vis kun bidrag fra nye kontoer',
-'sp-contributions-newbies-sub' => 'For nybegynnere',
-'sp-contributions-newbies-title' => 'Bidrag av nye kontoer',
-'sp-contributions-blocklog' => 'blokkeringslogg',
-'sp-contributions-deleted' => 'slettede brukerbidrag',
-'sp-contributions-uploads' => 'opplastinger',
-'sp-contributions-logs' => 'logger',
-'sp-contributions-talk' => 'diskusjon',
-'sp-contributions-userrights' => 'brukerrettighetskontroll',
-'sp-contributions-blocked-notice' => 'Denne brukeren er for tiden blokkert.
-Siste blokkeringsloggelement kan sees nedenfor.',
-'sp-contributions-blocked-notice-anon' => 'Denne IP-adressen er for tiden blokkert.
-Den siste oppføringen i blokkeringsloggen er vist nedenfor som referanse:',
-'sp-contributions-search' => 'Søk etter bidrag',
-'sp-contributions-username' => 'IP-adresse eller brukernavn:',
-'sp-contributions-toponly' => 'Vis kun endringer som er gjeldende revisjoner',
-'sp-contributions-submit' => 'Søk',
-
-# What links here
-'whatlinkshere' => 'Lenker hit',
-'whatlinkshere-title' => 'Sider som lenker til «$1»',
-'whatlinkshere-page' => 'Side:',
-'linkshere' => "Følgende sider lenker til '''[[:$1]]''':",
-'nolinkshere' => "Ingen sider lenker til '''[[:$1]]'''.",
-'nolinkshere-ns' => "Ingen sider lenker til '''[[:$1]]''' i valgte navnerom.",
-'isredirect' => 'omdirigeringsside',
-'istemplate' => 'transklusjon',
-'isimage' => 'fillenke',
-'whatlinkshere-prev' => '{{PLURAL:$1|forrige|forrige $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|neste|neste $1}}',
-'whatlinkshere-links' => '↠lenker',
-'whatlinkshere-hideredirs' => '$1 omdirigeringer',
-'whatlinkshere-hidetrans' => '$1 transkluderinger',
-'whatlinkshere-hidelinks' => '$1 lenker',
-'whatlinkshere-hideimages' => '$1 fillenker',
-'whatlinkshere-filters' => 'Filtre',
-
-# Block/unblock
-'autoblockid' => 'Autoblokker #$1',
-'block' => 'Blokker bruker',
-'unblock' => 'Fjern blokkering av bruker',
-'blockip' => 'Blokker bruker',
-'blockip-title' => 'Blokker bruker',
-'blockip-legend' => 'Blokker bruker',
-'blockiptext' => 'Bruk skjemaet under for å blokkere en IP-adresses tilgang til å redigere artikler. Dette må kun gjøres for å forhindre hærverk, og i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjene]]. Fyll ut en spesiell begrunnelse under.',
-'ipadressorusername' => 'IP-adresse eller brukernavn',
-'ipbexpiry' => 'Varighet:',
-'ipbreason' => 'Ã…rsak:',
-'ipbreasonotherlist' => 'Annen grunn',
-'ipbreason-dropdown' => '*Vanlige blokkeringsgrunner
-** Legger inn feilinformasjon
-** Fjerner innhold fra sider
-** Lenkespam
-** Legger inn vås
-** Truende oppførsel
-** Misbruk av flere kontoer
-** Uakseptabelt brukernavn',
-'ipb-hardblock' => 'Hindre innloggede brukere i å redigere fra denne IP-adressen',
-'ipbcreateaccount' => 'Hindre kontoopprettelse',
-'ipbemailban' => 'Forhindre brukeren fra å sende e-post',
-'ipbenableautoblock' => 'Blokker forrige IP-adresse brukt av denne brukeren automatisk, samt alle IP-adresser brukeren forsøker å redigere med i framtiden',
-'ipbsubmit' => 'Blokker denne brukeren',
-'ipbother' => 'Annen tid',
-'ipboptions' => '2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite',
-'ipbotheroption' => 'annet',
-'ipbotherreason' => 'Annen/utdypende grunn:',
-'ipbhidename' => 'Skjul brukernavn fra endringer og lister',
-'ipbwatchuser' => 'Overvåk brukerens brukerside og diskusjonsside',
-'ipb-disableusertalk' => 'Hindre denne brukeren i å redigere sin egen diskusjonsside mens han/hun er blokkert',
-'ipb-change-block' => 'Blokker brukeren på nytt med disse innstillingene',
-'ipb-confirm' => 'Bekreft blokkering',
-'badipaddress' => 'Ugyldig IP-adresse.',
-'blockipsuccesssub' => 'Blokkering utført',
-'blockipsuccesstext' => '­«[[Special:Contributions/$1|$1]]» har blitt blokkert.<br />
-Se [[Special:IPBlockList|blokkeringslisten]] for alle blokkeringer.',
-'ipb-blockingself' => 'Du er i ferd med å blokkere deg selv! Er du sikker på at du vil gjøre det?',
-'ipb-confirmhideuser' => 'Du er i ferd med å blokkere en bruker med «skjul bruker» aktivert. Dette vil skjule brukerens navn i alle lister og loggoppføringer. Er du sikker på at du vil gjøre dette?',
-'ipb-edit-dropdown' => 'Rediger blokkeringsgrunner',
-'ipb-unblock-addr' => 'Avblokker $1',
-'ipb-unblock' => 'Avblokker et brukernavn eller en IP-adresse',
-'ipb-blocklist' => 'Vis gjeldende blokkeringer',
-'ipb-blocklist-contribs' => 'Bidrag fra $1',
-'unblockip' => 'Opphev blokkering',
-'unblockiptext' => 'Bruk skjemaet under for å gjenopprette skriveadgangen for en tidligere blokkert adresse eller bruker.',
-'ipusubmit' => 'Opphev blokkering',
-'unblocked' => '[[User:$1|$1]] ble avblokkert',
-'unblocked-range' => '$1 har fått løftet blokkeringen',
-'unblocked-id' => 'Blokkering $1 ble fjernet',
-'blocklist' => 'Blokkerte brukere',
-'ipblocklist' => 'Blokkerte IP-adresser og brukernavn',
-'ipblocklist-legend' => 'Finn en blokkert bruker',
-'blocklist-userblocks' => 'Skjul kontoblokkeringer',
-'blocklist-tempblocks' => 'Skjul midlertidige blokkeringer',
-'blocklist-addressblocks' => 'Skjul individuelle IP-blokkeringer',
-'blocklist-timestamp' => 'Tidsstempel',
-'blocklist-target' => 'MÃ¥l',
-'blocklist-expiry' => 'Utløper',
-'blocklist-by' => 'Blokkerende admin',
-'blocklist-params' => 'Blokkeringsparametre',
-'blocklist-reason' => 'Ã…rsak',
-'ipblocklist-submit' => 'Søk',
-'ipblocklist-localblock' => 'Lokal blokkering',
-'ipblocklist-otherblocks' => '{{PLURAL:$1|Annen blokkering|Andre blokkeringer}}',
-'infiniteblock' => 'uendelig',
-'expiringblock' => 'utgår den $1 kl $2',
-'anononlyblock' => 'kun uregistrerte',
-'noautoblockblock' => 'autoblokkering slått av',
-'createaccountblock' => 'kontooppretting blokkert',
-'emailblock' => 'e-post blokkert',
-'blocklist-nousertalk' => 'kan ikke redigere sin egen diskusjonsside',
-'ipblocklist-empty' => 'Blokkeringslisten er tom.',
-'ipblocklist-no-results' => 'Den angitte IP-adressen eller brukeren er ikke blokkert.',
-'blocklink' => 'blokker',
-'unblocklink' => 'opphev blokkering',
-'change-blocklink' => 'endre blokkering',
-'contribslink' => 'bidrag',
-'autoblocker' => 'Du ble automatisk blokkert fordi du deler IP-adresse med «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».',
-'blocklogpage' => 'Blokkeringslogg',
-'blocklog-showlog' => 'Denne brukeren har blitt blokkert før.
-Blokkeringsloggen vises nedenfor.',
-'blocklog-showsuppresslog' => 'Denne brukeren har tidligere blitt blokkert og skjult.
-Skjulingsloggen vises nedenfor.',
-'blocklogentry' => 'blokkerte [[$1]] med en varighet på $2 $3',
-'reblock-logentry' => 'endret blokkeringsinnstillinger for [[$1]] med en varighet på $2 $3',
-'blocklogtext' => 'Dette er en logg som viser hvilke brukere som har blitt blokkert og avblokkert. Automatisk blokkerte IP-adresser vises ikke. Se [[Special:BlockList|blokkeringslisten]] for en liste over IP-adresser som er blokkert akkurat nå.',
-'unblocklogentry' => 'opphevet blokkeringen av $1',
-'block-log-flags-anononly' => 'kun uregistrerte brukere',
-'block-log-flags-nocreate' => 'kontooppretting deaktivert',
-'block-log-flags-noautoblock' => 'autoblokkering slått av',
-'block-log-flags-noemail' => 'e-post blokkert',
-'block-log-flags-nousertalk' => 'kan ikke redigere egen diskusjonsside',
-'block-log-flags-angry-autoblock' => 'utvidet autoblokkering aktivert',
-'block-log-flags-hiddenname' => 'brukernavn skjult',
-'range_block_disabled' => 'Muligheten til å blokkere flere IP-adresser om gangen er slått av.',
-'ipb_expiry_invalid' => 'Ugyldig utløpstid.',
-'ipb_expiry_temp' => 'For å skjule brukernavnet må blokkeringen være permanent.',
-'ipb_hide_invalid' => 'Kan ikke skjule denne kontoen. Den kan ha for mange redigeringer.',
-'ipb_already_blocked' => '«$1» er allerede blokkert',
-'ipb-needreblock' => '$1 er blokkert fra før. Vil du endre innstillingene?',
-'ipb-otherblocks-header' => '{{PLURAL:$1|Annen blokkering|Andre blokkeringer}}',
-'unblock-hideuser' => 'Du kan ikke løfte blokkeringen av denne brukeren siden dens brukernavn har blitt skjult.',
-'ipb_cant_unblock' => 'Feil: Blokk-ID $1 ikke funnet. Kan ha blitt avblokkert allerede.',
-'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',
-'cant-block-while-blocked' => 'Du kan ikke blokkere andre mens du selv er blokkert.',
-'cant-see-hidden-user' => 'Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.',
-'ipbblocked' => 'Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert',
-'ipbnounblockself' => 'Du har ikke tillatelse til å avblokkere deg selv',
-
-# Developer tools
-'lockdb' => 'LÃ¥s database',
-'unlockdb' => 'Ã…pne database',
-'lockdbtext' => 'Å låse databasen vil avbryte alle brukere fra å kunne
-redigere sider, endre deres innstillinger, redigere deres
-overvåkningsliste, og andre ting som krever endringer i databasen.
-Bekreft at du har til hensikt å gjøre dette, og at du vil
-låse opp databasen når vedlikeholdet er utført.',
-'unlockdbtext' => 'Å låse opp databasen vil si at alle brukere igjen
-kan redigere sider, endre sine innstillinger, redigere sin
-overvåkningsliste, og andre ting som krever endringer i databasen.
-Bekreft at du har til hensikt å gjøre dette.',
-'lockconfirm' => 'Ja, jeg vil virkelig låse databasen.',
-'unlockconfirm' => 'Ja, jeg vil virkelig låse opp databasen.',
-'lockbtn' => 'LÃ¥s databasen',
-'unlockbtn' => 'Ã…pne databasen',
-'locknoconfirm' => 'Du har ikke bekreftet handlingen.',
-'lockdbsuccesssub' => 'Databasen er nå låst',
-'unlockdbsuccesssub' => 'Databasen er nå lås opp',
-'lockdbsuccesstext' => 'Databasen er låst.<br />Husk å [[Special:UnlockDB|låse den opp]] når du er ferdig med vedlikeholdet.',
-'unlockdbsuccesstext' => 'Databasen er låst opp.',
-'lockfilenotwritable' => 'Kan ikke skrive til databasen. For å låse eller åpne databasen, må denne kunne skrives til av tjeneren.',
-'databasenotlocked' => 'Databasen er ikke låst.',
-'lockedbyandtime' => '(av $1 den $2, kl $3)',
-
-# Move page
-'move-page' => 'Flytt $1',
-'move-page-legend' => 'Flytt side',
-'movepagetext' => "Når du bruker skjemaet nedenfor døper du om en side og flytter hele historikken til det nye navnet.
-Den gamle tittelen blir en omdirigeringsside til den nye tittelen.
-Du kan oppdatere omdirigeringer som peker til den opprinnelige tittelen automatisk.
-Om du velger å ikke gjøre det, sjekk at flyttingen ikke fører til [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
-Du er ansvarlig for at lenker fortsetter å peke til de sidene de er ment å peke til.
-
-Legg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre den er tom eller er en omdirigeringsside uten historikk.
-Det betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil, og du kan ikke overskrive eksisterende sider ved et uhell.
-
-'''Advarsel!'''
-Dette kan være en drastisk og uventet endring for en populær side;
-vær sikker på at du forstår konsekvensene av dette før du fortsetter.",
-'movepagetext-noredirectfixer' => "Skjemaet nedenfor vil gi en side ny tittel og flytte historikken dens til det nye navnet.
-Den gamle tittelen vil bli en omdirigering til den nye.
-Sjekk om det blir [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
-Du er ansvarlig for å sjekke at lenker fortsetter å gå dit de skal.
-
-Merk at sider '''ikke''' blir flyttet om det allerede finnes en side med den tittelen, med mindre siden er tom eller en omdirigering og ikke har noen redigeringshistorikk.
-Dette betyr at du kan endre tittelen til en tittel siden hadde tidligere, og at du ikke kan skrive over en eksisterende side.
-
-'''Advarsel!'''
-Dette kan være en drastisk og uventen endring for en populær side;
-vær sikker på at du forstår konsekvensene av dette før du fortsetter.",
-'movepagetalktext' => "Den tilhørende diskusjonssiden vil automatisk bli flyttet sammen med siden '''med mindre:'''
-*Det allerede finnes en diskusjonsside som ikke er tom under det nye navnet, eller
-*Du fjerner markeringen i boksen nedenfor.
-
-I disse tilfellene er du nødt til å flytte eller flette siden manuelt, om ønskelig.",
-'movearticle' => 'Flytt side:',
-'moveuserpage-warning' => "'''Advarsel:''' Du er i ferd med å flytte en brukerside. Merk at kun siden vil bli flyttet; brukernavnet vil ''ikke'' bli endret.",
-'movenologin' => 'Ikke logget inn',
-'movenologintext' => 'Du må være registrert bruker og være [[Special:UserLogin|logget på]] for å flytte en side.',
-'movenotallowed' => 'Du har ikke tillatelse til å flytte sider.',
-'movenotallowedfile' => 'Du har ikke tillatelse til å flytte filer.',
-'cant-move-user-page' => 'Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).',
-'cant-move-to-user-page' => 'Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).',
-'newtitle' => 'Til ny tittel:',
-'move-watch' => 'Overvåk kilde- og målsiden',
-'movepagebtn' => 'Flytt side',
-'pagemovedsub' => 'Flytting gjennomført',
-'movepage-moved' => "'''«$1» ble flyttet til «$2»'''",
-'movepage-moved-redirect' => 'En omdirigering har blitt opprettet.',
-'movepage-moved-noredirect' => 'Det ble ikke opprettet en omdirigering.',
-'articleexists' => 'En side med det navnet finnes allerede eller det valgte navn er ugyldig.
-Velg et annet navn.',
-'cantmove-titleprotected' => 'Du kan ikke flytte en side til dette navnet, fordi den nye tittelen er beskyttet fra opprettelse.',
-'talkexists' => "'''Siden ble flyttet korrekt, men den tilhørende diskusjonssiden kunne ikke flyttes fordi det allerede finnes en under den nye tittelen.
-Du er nødt til å flette dem manuelt.'''",
-'movedto' => 'flyttet til',
-'movetalk' => 'Flytt tilhørende diskusjonsside.',
-'move-subpages' => 'Flytt alle undersider (opp til $1)',
-'move-talk-subpages' => 'Flytt alle undersider av diskusjonssiden (opp til $1)',
-'movepage-page-exists' => 'Siden $1 finnes allerede og kan ikke overskrives automatisk.',
-'movepage-page-moved' => 'Siden $1 har blitt flyttet til $2.',
-'movepage-page-unmoved' => 'Siden $1 kunne ikke flyttes til $2.',
-'movepage-max-pages' => 'Grensen på {{PLURAL:$1|én side|$1 sider}} er nådd; ingen flere sider vil bli flyttet automatisk.',
-'1movedto2' => 'flyttet [[$1]] til [[$2]]',
-'1movedto2_redir' => 'flyttet [[$1]] til [[$2]] over omdirigeringsside',
-'move-redirect-suppressed' => 'ingen omdirigering',
-'movelogpage' => 'Flyttelogg',
-'movelogpagetext' => 'Her er ei liste over sider som har blitt flyttet.',
-'movesubpage' => '{{PLURAL:$1|Underside|Undersider}}',
-'movesubpagetext' => 'Denne siden har {{PLURAL:$1|én underside|$1 undersider}} som vises nedenfor.',
-'movenosubpage' => 'Denne siden har ingen undersider.',
-'movereason' => 'Ã…rsak:',
-'revertmove' => 'tilbakestill',
-'delete_and_move' => 'Slett og flytt',
-'delete_and_move_text' => '==Sletting nødvendig==
-Målsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan flyttes dit?',
-'delete_and_move_confirm' => 'Ja, slett siden',
-'delete_and_move_reason' => 'Slettet grunnet flytting',
-'selfmove' => 'Kilde- og destinasjonstittel er den samme; kan ikke flytte siden.',
-'immobile-source-namespace' => 'Kan ikke flytte sider i navnerommet «$1»',
-'immobile-target-namespace' => 'Kan ikke flytte sider til navnerommet «$1»',
-'immobile-target-namespace-iw' => 'Du kan ikke flytte en side til et navn som er en interwikilenke.',
-'immobile-source-page' => 'Denne siden kan ikke flyttes.',
-'immobile-target-page' => 'Kan ikke flytte til det navnet.',
-'imagenocrossnamespace' => 'Kan ikke flytte filer til andre navnerom enn filnavnerommet',
-'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til filnavnerom',
-'imagetypemismatch' => 'Den nye filendelsen tilsvarer ikke filtypen',
-'imageinvalidfilename' => 'MÃ¥lnavnet er ugyldig',
-'fix-double-redirects' => 'Oppdater omdirigeringer som fører til den gamle tittelen',
-'move-leave-redirect' => 'La det være igjen en omdirigering',
-'protectedpagemovewarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan flytte den.
-Det siste loggelementet er oppgitt under som referanse:",
-'semiprotectedpagemovewarning' => "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan flytte den.
-Det siste loggelementet er oppgitt under som referanse:",
-'move-over-sharedrepo' => '== Filen finnes ==
-[[:$1]] finnes på en delt kilde. Dersom du flytter en fil til dette navnet, vil du overstyre den delte filen.',
-'file-exists-sharedrepo' => 'Det valgte filnavnet er allerede i bruk på en delt kilde.
-Vennligst velg et annet navn.',
-
-# Export
-'export' => 'Eksporter sider',
-'exporttext' => 'Du kan eksportere teksten og redigeringshistorikken for en bestemt side eller en gruppe sider i XML.
-Dette kan senere importeres til en annen wiki som bruker MediaWiki ved hjelp av [[Special:Import|importsiden]].
-
-For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per linje, og velg om du vil ha kun nåværende versjon, eller alle versjoner i historikken.
-
-Dersom du bare vil ha nåværende versjon, kan du også bruke en lenke, for eksempel [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for siden «[[{{MediaWiki:Mainpage}}]]».',
-'exportcuronly' => 'Ta bare med den nåværende versjonen, ikke hele historikken.',
-'exportnohistory' => "----
-'''Merk:''' Eksportering av hele historikken gjennom dette skjemaet har blitt slått av av ytelsesgrunner.",
-'export-submit' => 'Eksporter',
-'export-addcattext' => 'Legg til sider fra kategori:',
-'export-addcat' => 'Legg til',
-'export-addnstext' => 'Legg til sider fra navnerom:',
-'export-addns' => 'Legg til',
-'export-download' => 'Lagre som fil',
-'export-templates' => 'Ta med maler',
-'export-pagelinks' => 'Inkluder lenkede sider med en dybde på:',
-
-# Namespace 8 related
-'allmessages' => 'Systemmeldinger',
-'allmessagesname' => 'Navn',
-'allmessagesdefault' => 'Standardtekst',
-'allmessagescurrent' => 'Nåværende tekst',
-'allmessagestext' => 'Dette er en liste over tilgjengelige systemmeldinger i MediaWiki-navnerommet.
-Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med oversettelse av MediaWiki.',
-'allmessagesnotsupportedDB' => "''{{ns:special}}:Allmessages'' kan ikke brukes fordi '''\$wgUseDatabaseMessages''' er slått av.",
-'allmessages-filter-legend' => 'Filtrér',
-'allmessages-filter' => 'Filtrér etter tilpassningsgrad',
-'allmessages-filter-unmodified' => 'Uendret',
-'allmessages-filter-all' => 'Alle',
-'allmessages-filter-modified' => 'Endret',
-'allmessages-prefix' => 'Filtrer etter prefiks:',
-'allmessages-language' => 'Språk:',
-'allmessages-filter-submit' => 'GÃ¥',
-
-# Thumbnails
-'thumbnail-more' => 'Forstørr',
-'filemissing' => 'Filen mangler',
-'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
-'djvu_page_error' => 'DjVu-side ute av rekkevidde',
-'djvu_no_xml' => 'Klarte ikke å hente XML for DjVu-fil',
-'thumbnail_invalid_params' => 'Ugyldige miniatyrparametere, eller PNG-fil med flere piksler enn 12,5 millioner.',
-'thumbnail_dest_directory' => 'Klarte ikke å opprette målmappe',
-'thumbnail_image-type' => 'Bildetypen støttes ikke',
-'thumbnail_gd-library' => 'Ufullstendig konfigurering av GD library: mangler funksjonen $1',
-'thumbnail_image-missing' => 'Filen ser ut til å mangle: $1',
-
-# Special:Import
-'import' => 'Importer sider',
-'importinterwiki' => 'Transwiki-importering',
-'import-interwiki-text' => 'Velg en wiki og en side å importere. Revisjonsdatoer og bidragsyteres navn blir bevart. Alle transwiki-importeringer listes i [[Special:Log/import|importloggen]].',
-'import-interwiki-source' => 'Kildewiki/side:',
-'import-interwiki-history' => 'Kopier all historikk for denne siden',
-'import-interwiki-templates' => 'Inkluder alle maler',
-'import-interwiki-submit' => 'Importer',
-'import-interwiki-namespace' => 'MÃ¥lnavnerom:',
-'import-upload-filename' => 'Filnavn:',
-'import-comment' => 'Kommentar:',
-'importtext' => 'Importer filen fra kildewikien med [[Special:Export|eksporteringsverktøyet]].
-Lagre den på din egen datamaskin og last den opp her.',
-'importstart' => 'Importerer sider&nbsp;…',
-'import-revision-count' => '({{PLURAL:$1|Én revisjon|$1 revisjoner}})',
-'importnopages' => 'Ingen sider å importere.',
-'imported-log-entries' => 'Importerte $1 {{PLURAL:$1|loggoppføring|loggoppføringer}}.',
-'importfailed' => 'Importering mislyktes: $1',
-'importunknownsource' => 'Ukjent importkildetype',
-'importcantopen' => 'Kunne ikke åpne importfil',
-'importbadinterwiki' => 'Ugyldig interwikilenke',
-'importnotext' => 'Tom eller ingen tekst',
-'importsuccess' => 'Importering ferdig.',
-'importhistoryconflict' => 'Motstridende revisjoner finnes (siden kan ha blitt importert tidligere)',
-'importnosources' => 'Ingen transwikiimportkilder er angitt, og direkte historikkimporteringer er slått av.',
-'importnofile' => 'Ingen importfil opplastet.',
-'importuploaderrorsize' => 'Importfilopplasting mislyktes. Filen er større enn tillatt opplastingsstørrelse.',
-'importuploaderrorpartial' => 'Importfilopplasting mislyktes. Filen ble kun delvis opplastet.',
-'importuploaderrortemp' => 'Importfilopplasting mislyktes. En midlertidig mappe mangler.',
-'import-parse-failure' => 'Tolkningsfeil ved XML-import',
-'import-noarticle' => 'Ingen side å importere!',
-'import-nonewrevisions' => 'Alle revisjoner var importert fra før.',
-'xml-error-string' => '$1 på linje $2, kolonne $3 (byte: $4): $5',
-'import-upload' => 'Last opp XML-data',
-'import-token-mismatch' => 'Sesjonsdata mistet. Venligst prøv igjen.',
-'import-invalid-interwiki' => 'Kan ikke importere fra angitt wiki.',
-
-# Import log
-'importlogpage' => 'Importlogg',
-'importlogpagetext' => 'Administrativ import av sider med redigeringshistorikk fra andre wikier.',
-'import-logentry-upload' => 'importerte [[$1]] ved opplasting',
-'import-logentry-upload-detail' => 'Importerte {{PLURAL:$1|én revisjon|$1 revisjoner}}',
-'import-logentry-interwiki' => 'transwikiimporterte $1',
-'import-logentry-interwiki-detail' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} fra $2',
-
-# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Din brukerside',
-'tooltip-pt-anonuserpage' => 'Brukersiden for IP-adressen du redigerer fra',
-'tooltip-pt-mytalk' => 'Din diskusjonsside',
-'tooltip-pt-anontalk' => 'Diskusjon om redigeringer fra denne IP-adressen',
-'tooltip-pt-preferences' => 'Dine innstillinger',
-'tooltip-pt-watchlist' => 'Liste over sider du overvåker for endringer.',
-'tooltip-pt-mycontris' => 'Liste over dine bidrag',
-'tooltip-pt-login' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk',
-'tooltip-pt-anonlogin' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk.',
-'tooltip-pt-logout' => 'Logg ut',
-'tooltip-ca-talk' => 'Diskusjon om innholdssiden',
-'tooltip-ca-edit' => 'Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.',
-'tooltip-ca-addsection' => 'Start et nytt avsnitt',
-'tooltip-ca-viewsource' => 'Denne siden er beskyttet.
-Du kan se på kildeteksten',
-'tooltip-ca-history' => 'Tidligere revisjoner av denne siden',
-'tooltip-ca-protect' => 'Beskytt denne siden',
-'tooltip-ca-unprotect' => 'Endre beskyttelsen av denne siden',
-'tooltip-ca-delete' => 'Slett denne siden',
-'tooltip-ca-undelete' => 'Gjenopprett redigerenge som ble gjort på denne siden før den ble slettet.',
-'tooltip-ca-move' => 'Flytt denne siden',
-'tooltip-ca-watch' => 'Legg denne siden til overvåkningslisten din',
-'tooltip-ca-unwatch' => 'Fjern denne siden fra din overvåkningsliste',
-'tooltip-search' => 'Søk i {{SITENAME}}',
-'tooltip-search-go' => 'GÃ¥ til en side med dette navnet om den finnes',
-'tooltip-search-fulltext' => 'Søk etter sider som innholder denne teksten',
-'tooltip-p-logo' => 'Hovedside',
-'tooltip-n-mainpage' => 'GÃ¥ til hovedsiden',
-'tooltip-n-mainpage-description' => 'GÃ¥ til hovedsiden',
-'tooltip-n-portal' => 'Om prosjektet, hva du kan gjøre, hvor du kan finne ting',
-'tooltip-n-currentevents' => 'Finn bakgrunnsinformasjon om aktuelle hendelser',
-'tooltip-n-recentchanges' => 'Liste over siste endringer på wikien.',
-'tooltip-n-randompage' => 'Vis en tilfeldig side',
-'tooltip-n-help' => 'Stedet for å få hjelp',
-'tooltip-t-whatlinkshere' => 'Liste over alle wikisider som lenker hit',
-'tooltip-t-recentchangeslinked' => 'Siste endringer i sider som blir lenket fra denne siden',
-'tooltip-feed-rss' => 'RSS-mating for denne siden',
-'tooltip-feed-atom' => 'Atom-mating for denne siden',
-'tooltip-t-contributions' => 'Vis liste over bidrag fra denne brukeren',
-'tooltip-t-emailuser' => 'Send en e-post til denne brukeren',
-'tooltip-t-upload' => 'Last opp filer',
-'tooltip-t-specialpages' => 'Liste over alle spesialsider',
-'tooltip-t-print' => 'Utskriftsvennlig versjon av denne siden',
-'tooltip-t-permalink' => 'Permanent lenke til denne revisjonen av siden',
-'tooltip-ca-nstab-main' => 'Vis innholdssiden',
-'tooltip-ca-nstab-user' => 'Vis brukersiden',
-'tooltip-ca-nstab-media' => 'Vis mediasiden',
-'tooltip-ca-nstab-special' => 'Dette er en spesialside og kan ikke redigeres',
-'tooltip-ca-nstab-project' => 'Vis prosjektsiden',
-'tooltip-ca-nstab-image' => 'Vis filsiden',
-'tooltip-ca-nstab-mediawiki' => 'Vis systembeskjeden',
-'tooltip-ca-nstab-template' => 'Vis malen',
-'tooltip-ca-nstab-help' => 'Vis hjelpesiden',
-'tooltip-ca-nstab-category' => 'Vis kategorisiden',
-'tooltip-minoredit' => 'Merk dette som en mindre endring',
-'tooltip-save' => 'Lagre endringene dine',
-'tooltip-preview' => 'Forhåndsvis endringene dine, vennligst gjør dette før du lagrer!',
-'tooltip-diff' => 'Vis hvilke endringer du har gjort på teksten',
-'tooltip-compareselectedversions' => 'Se forskjellen mellom de to valgte revisjonene av denne siden',
-'tooltip-watch' => 'Legg denne siden til overvåkningslisten din',
-'tooltip-recreate' => 'Gjenopprett siden til tross for at den har blitt slettet',
-'tooltip-upload' => 'Start opplasting',
-'tooltip-rollback' => '«Tilbakestill»-knappen tilbakestiller den siste bidragsyterens endring(er) på denne siden med ett klikk',
-'tooltip-undo' => '«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.',
-'tooltip-preferences-save' => 'Lagre innstillinger',
-'tooltip-summary' => 'Skriv et kort sammendrag',
-
-# Stylesheets
-'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'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
-'notacceptable' => 'Tjeneren har ingen mulige måter å vise data i din nettleser.',
-
-# Attribution
-'anonymous' => '{{PLURAL:$1|Anonym bruker|Anonyme brukere}} av {{SITENAME}}',
-'siteuser' => '{{SITENAME}}-bruker $1',
-'anonuser' => '{{SITENAME}}s anonyme bruker $1',
-'lastmodifiedatby' => 'Denne siden ble sist redigert $1 kl. $2 av $3.',
-'othercontribs' => 'Basert på arbeid av $1.',
-'others' => 'andre',
-'siteusers' => '{{SITENAME}}-{{PLURAL:$2|bruker|brukere}} $1',
-'anonusers' => '{{SITENAME}}s {{PLURAL:$2|anonyme bruker|anonyme brukere}} $1',
-'creditspage' => 'Sidekrediteringer',
-'nocredits' => 'Ingen krediteringer er tilgjengelig for denne siden.',
-
-# Spam protection
-'spamprotectiontitle' => 'Søppelpostfilter',
-'spamprotectiontext' => 'Siden du ønsket å lagre ble blokkert av spamfilteret.
-Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nettsted.',
-'spamprotectionmatch' => 'Følgende tekst er det som aktiverte spamfilteret: $1',
-'spambot_username' => 'MediaWikis spamopprydning',
-'spam_reverting' => 'Tilbakestiller til siste versjon uten lenke til $1',
-'spam_blanking' => 'Alle revisjoner inneholdt lenke til $1, tømmer siden',
-
-# Info page
-'pageinfo-title' => 'Informasjon om «$1»',
-'pageinfo-header-edits' => 'Redigeringer',
-'pageinfo-header-watchlist' => 'Overvåkningsliste',
-'pageinfo-header-views' => 'Visninger',
-'pageinfo-subjectpage' => 'Side',
-'pageinfo-talkpage' => 'Diskusjonsside',
-'pageinfo-watchers' => 'Antall overvåkere',
-'pageinfo-edits' => 'Antall redigeringer',
-'pageinfo-authors' => 'Antall forskjellige forfattere',
-'pageinfo-views' => 'Antall visninger',
-'pageinfo-viewsperedit' => 'Visninger per redigering',
-
-# 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
-'markaspatrolleddiff' => 'Godkjenn endringen',
-'markaspatrolledtext' => 'Godkjenn denne siden',
-'markedaspatrolled' => 'Merket som godkjent',
-'markedaspatrolledtext' => 'Den valgte revisjonen av [[:$1]] har blitt markert som patruljert.',
-'rcpatroldisabled' => 'Siste endringer-patruljering er slått av',
-'rcpatroldisabledtext' => 'Siste endringer-patruljeringsfunksjonen er slått av.',
-'markedaspatrollederror' => 'Kan ikke merke som godkjent',
-'markedaspatrollederrortext' => 'Du må spesifisere en versjon å merke som godkjent.',
-'markedaspatrollederror-noautopatrol' => 'Du kan ikke merke dine egne endringer som godkjente.',
-
-# Patrol log
-'patrol-log-page' => 'Godkjenningslogg',
-'patrol-log-header' => 'Dette er en logg over patruljerte sideversjoner.',
-'patrol-log-line' => 'merket $1 av $2 godkjent $3',
-'patrol-log-auto' => '(automatisk)',
-'patrol-log-diff' => 'versjon $1',
-'log-show-hide-patrol' => '$1 patruljeringslogg',
-
-# Image deletion
-'deletedrevision' => 'Slettet gammel revisjon $1.',
-'filedeleteerror-short' => 'Feil under filsletting: $1',
-'filedeleteerror-long' => 'Feil oppsto under filsletting:
-
-$1',
-'filedelete-missing' => 'Filen «$1» kan ikke slettes fordi den ikke finnes.',
-'filedelete-old-unregistered' => 'Filrevisjonen «$1» finnes ikke i databasen.',
-'filedelete-current-unregistered' => 'Filen «$1» finnes ikke i databasen.',
-'filedelete-archive-read-only' => 'Arkivmappa «$1» kan ikke skrives av tjeneren.',
-
-# Browsing diffs
-'previousdiff' => '↠Forrige endring',
-'nextdiff' => 'Neste endring →',
-
-# Media information
-'mediawarning' => "'''Advarsel''': Denne filen kan inneholde farlig kode.
-Ved å åpne den kan systemet ditt kompromitteres.",
-'imagemaxsize' => "Bildestørrelsesgrense:<br />''(for filbeskrivelsessider)''",
-'thumbsize' => 'Miniatyrbildestørrelse:',
-'widthheightpage' => '$1×$2, {{PLURAL:$3|én side|$3 sider}}',
-'file-info' => 'filstørrelse: $1, MIME-type: $2',
-'file-info-size' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4',
-'file-info-size-pages' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4, $5 {{PLURAL:$5|side|sider}}',
-'file-nohires' => '<small>Ingen høyere oppløsning tilgjengelig.</small>',
-'svg-long-desc' => 'SVG-fil, standardoppløsning $1 × $2 piksler, filstørrelse: $3',
-'show-big-image' => 'Full oppløsning',
-'show-big-image-preview' => '<small>Størrelse på denne forhåndsvisningen: $1.</small>',
-'show-big-image-other' => '<small>Andre oppløsninger: $1.</small>',
-'show-big-image-size' => '$1 × $2 piksler',
-'file-info-gif-looped' => 'gjentas',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|ramme|rammer}}',
-'file-info-png-looped' => 'loopet',
-'file-info-png-repeat' => 'avspilt $1 {{PLURAL:$1|gang|ganger}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|bilde|bilder}}',
-
-# Special:NewFiles
-'newimages' => 'Galleri over nye filer',
-'imagelisttext' => "Dete er en liste med '''$1''' {{PLURAL:$1|fil|filer}} sortert $2.",
-'newimages-summary' => 'Denne spesialsiden viser de sist opplastede filene.',
-'newimages-legend' => 'Filnavn',
-'newimages-label' => 'Filnavn (helt eller delvis):',
-'showhidebots' => '($1 roboter)',
-'noimages' => 'Ingenting å se.',
-'ilsubmit' => 'Søk',
-'bydate' => 'etter dato',
-'sp-newimages-showfrom' => 'Vis nye filer fra og med $2 $1',
-
-# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 't',
-
-# Bad image list
-'bad_image_list' => 'Formatet er som følger:
-
-Kun listeelementer (linjer som starter med *) tas med.
-Den første lenken på en linje må være en lenke til en dårlig fil.
-Alle andre lenker på samme linje anses for å være unntak, altså sider der filen kan opptre.',
-
-# Metadata
-'metadata' => 'Metadata',
-'metadata-help' => 'Denne filen inneholder tilleggsinformasjon, antagligvis lagt til av digitalkameraet eller skanneren brukt til å lage eller digitalisere det.
-Hvis filen har blitt forandret fra utgangspunktet, kan enkelte detaljer være unøyaktige.',
-'metadata-expand' => 'Vis utvidede detaljer',
-'metadata-collapse' => 'Skjul utvidede detaljer',
-'metadata-fields' => 'Bildemetadatafelt listet i denne meldingen inkluderes på bildesiden når metadatatabellen er slått sammen.
-Andre vil skjules som standard.
-* make
-* model
-* datetimeoriginal
-* exposuretime
-* fnumber
-* isospeedratings
-* focallength
-* artist
-* copyright
-* imagedescription
-* gpslatitude
-* gpslongitude
-* gpsaltitude',
-
-# EXIF tags
-'exif-imagewidth' => 'Bredde',
-'exif-imagelength' => 'Høyde',
-'exif-bitspersample' => 'Bits per komponent',
-'exif-compression' => 'Kompresjonsskjema',
-'exif-photometricinterpretation' => 'Pixelsammensetning',
-'exif-orientation' => 'Retning',
-'exif-samplesperpixel' => 'Antall komponenter',
-'exif-planarconfiguration' => 'Dataarrangement',
-'exif-ycbcrsubsampling' => 'Subsamplingsforhold mellom Y og C',
-'exif-ycbcrpositioning' => 'Y- og C-posisjonering',
-'exif-xresolution' => 'Horisontal oppløsning',
-'exif-yresolution' => 'Vertikal oppløsning',
-'exif-stripoffsets' => 'Plassering for bildedata',
-'exif-rowsperstrip' => 'Antall rader per stripe',
-'exif-stripbytecounts' => 'Antall byte per kompresserte stripe',
-'exif-jpeginterchangeformat' => 'Offset til JPEG SOI',
-'exif-jpeginterchangeformatlength' => 'Byte med JPEG-data',
-'exif-whitepoint' => 'Hvitpunktkromatisitet',
-'exif-primarychromaticities' => 'Primærfargenes renhet',
-'exif-ycbcrcoefficients' => 'Koeffisienter fr fargeromstransformasjonsmatrise',
-'exif-referenceblackwhite' => 'Par av svarte og hvite referanseverdier',
-'exif-datetime' => 'Dato og tid for filendring',
-'exif-imagedescription' => 'Bildetittel',
-'exif-make' => 'Kameraprodusent',
-'exif-model' => 'Kameramodell',
-'exif-software' => 'Programvare brukt',
-'exif-artist' => 'Skaper',
-'exif-copyright' => 'Opphavsbeskyttelse tilhører',
-'exif-exifversion' => 'Exif-versjon',
-'exif-flashpixversion' => 'Støttet Flashpix-versjon',
-'exif-colorspace' => 'Fargerom',
-'exif-componentsconfiguration' => 'Betydning av hver komponent',
-'exif-compressedbitsperpixel' => 'Bildekompresjonsmodus',
-'exif-pixelydimension' => 'Bildebredde',
-'exif-pixelxdimension' => 'Bildehøyde',
-'exif-usercomment' => 'Brukerkommentarer',
-'exif-relatedsoundfile' => 'Relatert lydfil',
-'exif-datetimeoriginal' => 'Dato og tid for datagenerering',
-'exif-datetimedigitized' => 'Dato og tid for digitalisering',
-'exif-subsectime' => 'Endringstidspunkt, sekunddeler',
-'exif-subsectimeoriginal' => 'Eksponeringstidspunkt, sekunddeler',
-'exif-subsectimedigitized' => 'Digitaliseringstidspunkt, sekunddeler',
-'exif-exposuretime' => 'Eksponeringstid',
-'exif-exposuretime-format' => '$1 sek ($2)',
-'exif-fnumber' => 'F-nummer',
-'exif-exposureprogram' => 'Eksponeringsprogram',
-'exif-spectralsensitivity' => 'Spektralsensitivitet',
-'exif-isospeedratings' => 'Filmhastighet (ISO)',
-'exif-shutterspeedvalue' => 'APEX lukkerhastighet',
-'exif-aperturevalue' => 'APEX blenderåpning',
-'exif-brightnessvalue' => 'APEX lysstyrke',
-'exif-exposurebiasvalue' => 'Eksponeringsbias',
-'exif-maxaperturevalue' => 'Maksimal blender',
-'exif-subjectdistance' => 'Avstand til subjekt',
-'exif-meteringmode' => 'MÃ¥lingsmodus',
-'exif-lightsource' => 'Lyskilde',
-'exif-flash' => 'Blits',
-'exif-focallength' => 'Linsens brennvidde',
-'exif-subjectarea' => 'Motivområde',
-'exif-flashenergy' => 'Blitsenergi',
-'exif-focalplanexresolution' => 'Oppløsning i fokalplan X',
-'exif-focalplaneyresolution' => 'Oppløsning i fokalplan Y',
-'exif-focalplaneresolutionunit' => 'Enhet for oppløsning i fokalplan',
-'exif-subjectlocation' => 'Motivets beliggenhet',
-'exif-exposureindex' => 'Eksponeringsindeks',
-'exif-sensingmethod' => 'Avkjenningsmetode',
-'exif-filesource' => 'Filkilde',
-'exif-scenetype' => 'Scenetype',
-'exif-customrendered' => 'Tilpasset bildebehandling',
-'exif-exposuremode' => 'Eksponeringsmodus',
-'exif-whitebalance' => 'Hvit balanse',
-'exif-digitalzoomratio' => 'Digitalt zoomomfang',
-'exif-focallengthin35mmfilm' => 'Brennvidde på 35 mm-film',
-'exif-scenecapturetype' => 'Motivprogram',
-'exif-gaincontrol' => 'Scenekontroll',
-'exif-contrast' => 'Kontrast',
-'exif-saturation' => 'Metning',
-'exif-sharpness' => 'Skarphet',
-'exif-devicesettingdescription' => 'Beskrivelse av apparatets innstilling',
-'exif-subjectdistancerange' => 'Avstandsintervall til motiv',
-'exif-imageuniqueid' => 'Unik bilde-ID',
-'exif-gpsversionid' => 'Versjon for GPS-tagger',
-'exif-gpslatituderef' => 'nordlig eller sørlig breddegrad',
-'exif-gpslatitude' => 'Breddegrad',
-'exif-gpslongituderef' => 'Østlig eller vestlig breddegrad',
-'exif-gpslongitude' => 'Lengdegrad',
-'exif-gpsaltituderef' => 'Høydereferanse',
-'exif-gpsaltitude' => 'Høyde',
-'exif-gpstimestamp' => 'GPS-tid (atomklokke)',
-'exif-gpssatellites' => 'Satelitter brukt i måling',
-'exif-gpsstatus' => 'Mottakerstatus',
-'exif-gpsmeasuremode' => 'MÃ¥lingsmodus',
-'exif-gpsdop' => 'MÃ¥lingspresisjon',
-'exif-gpsspeedref' => 'Fartsenhet',
-'exif-gpsspeed' => 'GPS-mottakerens hastighet',
-'exif-gpstrackref' => 'Referanse for bevegelsesretning',
-'exif-gpstrack' => 'Bevegelsesretning',
-'exif-gpsimgdirectionref' => 'Referanse for bilderetning',
-'exif-gpsimgdirection' => 'Bilderetning',
-'exif-gpsmapdatum' => 'Brukt geodetisk data',
-'exif-gpsdestlatituderef' => 'Referanse for målbreddegrad',
-'exif-gpsdestlatitude' => 'MÃ¥lbreddegrad',
-'exif-gpsdestlongituderef' => 'Referanse for mållengdegrad',
-'exif-gpsdestlongitude' => 'MÃ¥llengdegrad',
-'exif-gpsdestbearingref' => 'Referanse for retning mot målet',
-'exif-gpsdestbearing' => 'Retning mot målet',
-'exif-gpsdestdistanceref' => 'Referanse for lengde til mål',
-'exif-gpsdestdistance' => 'Lengde til mål',
-'exif-gpsprocessingmethod' => 'Navn på GPS-prosesseringsmetode',
-'exif-gpsareainformation' => 'Navn på GPS-område',
-'exif-gpsdatestamp' => 'GPS-dato',
-'exif-gpsdifferential' => 'Differentiell GPS-korreksjon',
-'exif-jpegfilecomment' => 'JPEG-filkommentar',
-'exif-keywords' => 'Nøkkelord',
-'exif-worldregioncreated' => 'Verdensregionen som bildet ble tatt i',
-'exif-countrycreated' => 'Landet som bildet ble tatt i',
-'exif-countrycodecreated' => 'Landskoden som bildet ble tatt i',
-'exif-provinceorstatecreated' => 'Provinsen eller delstaten som bildet ble tatt i',
-'exif-citycreated' => 'Byen som bildet ble tatt i',
-'exif-sublocationcreated' => 'Bydelen som bildet ble tatt i',
-'exif-worldregiondest' => 'Verdensregionen vises',
-'exif-countrydest' => 'Landet vises',
-'exif-countrycodedest' => 'Landskoden vises',
-'exif-provinceorstatedest' => 'Provinsen eller delstaten vises',
-'exif-citydest' => 'Byen vises',
-'exif-sublocationdest' => 'Bydelen vises',
-'exif-objectname' => 'Kort tittel',
-'exif-specialinstructions' => 'Spesielle instruksjoner',
-'exif-headline' => 'Overskrift',
-'exif-credit' => 'Kreditt/Leverandør',
-'exif-source' => 'Kilde',
-'exif-editstatus' => 'Bildets redaksjonelle status',
-'exif-urgency' => 'Prioritet',
-'exif-fixtureidentifier' => 'Fiksturnavn',
-'exif-locationdest' => 'Avbildet plass',
-'exif-locationdestcode' => 'Avbildet plasseringskode',
-'exif-objectcycle' => 'Tid på dagen mediet er ment for',
-'exif-contact' => 'Kontaktinformasjon',
-'exif-writer' => 'Forfatter',
-'exif-languagecode' => 'Språk',
-'exif-iimversion' => 'IIM-versjon',
-'exif-iimcategory' => 'Kategori',
-'exif-iimsupplementalcategory' => 'Tilleggskategorier',
-'exif-datetimeexpires' => 'Ikke bruk etter',
-'exif-datetimereleased' => 'Utgitt den',
-'exif-originaltransmissionref' => 'Opprinnelig lokasjonskode for transmisjon',
-'exif-identifier' => 'Identifikator',
-'exif-lens' => 'Objektiv',
-'exif-serialnumber' => 'Kameraets serienummer',
-'exif-cameraownername' => 'Kameraets eier',
-'exif-label' => 'Etikett',
-'exif-datetimemetadata' => 'Dato metadata sist ble endret',
-'exif-nickname' => 'Bildets uformelle navn',
-'exif-rating' => 'Vurdering (av 5)',
-'exif-rightscertificate' => 'Rettighetsforvaltningssertifikat',
-'exif-copyrighted' => 'Opphavsrettsstatus',
-'exif-copyrightowner' => 'Opphavsrettsinnehaver',
-'exif-usageterms' => 'Bruksvilkår',
-'exif-webstatement' => 'Opphavsrettserklæring på internett',
-'exif-originaldocumentid' => 'Unik ID for originaldokumentet',
-'exif-licenseurl' => 'URL for opphavsrettslisens',
-'exif-morepermissionsurl' => 'Alternativ lisensieringsinformasjon',
-'exif-attributionurl' => 'Ved gjenbruk av dette arbeidet, vennligst inkluder en lenke til',
-'exif-preferredattributionname' => 'Ved gjenbruk av dette arbeidet, vennligst gi kreditt til',
-'exif-pngfilecomment' => 'PNG-filkommentar',
-'exif-disclaimer' => 'Ansvarsfraskrivelse',
-'exif-contentwarning' => 'Innholdsadvarsel',
-'exif-giffilecomment' => 'GIF-filkommentar',
-'exif-intellectualgenre' => 'Elementtype',
-'exif-subjectnewscode' => 'Emnekode',
-'exif-scenecode' => 'IPTC-scenekode',
-'exif-event' => 'Avbildet hendelse',
-'exif-organisationinimage' => 'Avbildet organisasjon',
-'exif-personinimage' => 'Avbildet person',
-'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-compression-1' => 'Ukomprimert',
-'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjørelengdekoding',
-'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
-'exif-compression-4' => 'CCITT Gruppe 4 faks-koding',
-
-'exif-copyrighted-true' => 'Opphavsrettsbeskyttet',
-'exif-copyrighted-false' => 'Ikke beskyttet av opphavsrett',
-
-'exif-unknowndate' => 'Ukjent dato',
-
-'exif-orientation-1' => 'Normal',
-'exif-orientation-2' => 'Snudd horisontalt',
-'exif-orientation-3' => 'Rotert 180°',
-'exif-orientation-4' => 'Snudd vertikalt',
-'exif-orientation-5' => 'Rotated 90° CCW and flipped vertically
-
-Rotert 90° mot klokka og vridd vertikalt',
-'exif-orientation-6' => 'Rotert 90° mot klokka',
-'exif-orientation-7' => 'Rotert 90° med klokka og vridd vertikalt',
-'exif-orientation-8' => 'Rotert 90° med klokka',
-
-'exif-planarconfiguration-1' => 'chunkformat',
-'exif-planarconfiguration-2' => 'planærformat',
-
-'exif-colorspace-65535' => 'Ukalibrert',
-
-'exif-componentsconfiguration-0' => 'finnes ikke',
-
-'exif-exposureprogram-0' => 'Ikke angitt',
-'exif-exposureprogram-1' => 'Manuell',
-'exif-exposureprogram-2' => 'Normalt program',
-'exif-exposureprogram-3' => 'Blenderprioritet',
-'exif-exposureprogram-4' => 'Slutterprioritet',
-'exif-exposureprogram-5' => 'Kunstnerlig program (prioriterer skarphetsdyp)',
-'exif-exposureprogram-6' => 'Bevegelsesprogram (prioriterer kortere sluttertid)',
-'exif-exposureprogram-7' => 'Portrettmodus (for nærbilder med ufokusert bakgrunn)',
-'exif-exposureprogram-8' => 'Landskapsmodus (for landskapsbilder med fokusert bakgrunn)',
-
-'exif-subjectdistance-value' => '$1 meter',
-
-'exif-meteringmode-0' => 'Ukjent',
-'exif-meteringmode-1' => 'Gjennomsnitt',
-'exif-meteringmode-2' => 'Sentrumsveid gjennomsnitt',
-'exif-meteringmode-3' => 'Spot',
-'exif-meteringmode-4' => 'Multispot',
-'exif-meteringmode-5' => 'Mønster',
-'exif-meteringmode-6' => 'Delvis',
-'exif-meteringmode-255' => 'Annet',
-
-'exif-lightsource-0' => 'Ukjent',
-'exif-lightsource-1' => 'Dagslys',
-'exif-lightsource-2' => 'Lysrør',
-'exif-lightsource-3' => 'Glødelampe',
-'exif-lightsource-4' => 'Blits',
-'exif-lightsource-9' => 'Fint vær',
-'exif-lightsource-10' => 'Overskyet',
-'exif-lightsource-11' => 'Skygge',
-'exif-lightsource-12' => 'Dagslyslysrør (D 5700 – 7100K)',
-'exif-lightsource-13' => 'Dagshvitt lysrør (N 4600 – 5400K)',
-'exif-lightsource-14' => 'Kaldhvitt lysrør (W 3900 – 4500K)',
-'exif-lightsource-15' => 'Hvitt lysrør (WW 3200 – 3700K)',
-'exif-lightsource-17' => 'Standardlys A',
-'exif-lightsource-18' => 'Standardlys B',
-'exif-lightsource-19' => 'Standardlys C',
-'exif-lightsource-24' => 'ISO studiobelysning',
-'exif-lightsource-255' => 'Annen lyskilde',
-
-# Flash modes
-'exif-flash-fired-0' => 'Blitz ikke utløst',
-'exif-flash-fired-1' => 'Blitz utløst',
-'exif-flash-return-0' => 'ingen funksjon for oppdaing av strobelys',
-'exif-flash-return-2' => 'strobelys ikke oppdaget',
-'exif-flash-return-3' => 'strobelys oppdaget',
-'exif-flash-mode-1' => 'tvunget blitzutløsning',
-'exif-flash-mode-2' => 'tvunget blitzløs',
-'exif-flash-mode-3' => 'automatisk modus',
-'exif-flash-function-1' => 'Ingen blitzfunksjon',
-'exif-flash-redeye-1' => 'røde-øyne-redusering',
-
-'exif-focalplaneresolutionunit-2' => 'tommer',
-
-'exif-sensingmethod-1' => 'Ikke angitt',
-'exif-sensingmethod-2' => 'Énchipsfargesensor',
-'exif-sensingmethod-3' => 'Tochipsfargesensor',
-'exif-sensingmethod-4' => 'Trechipsfargesensor',
-'exif-sensingmethod-5' => 'Fargesekvensiell områdesensor',
-'exif-sensingmethod-7' => 'Trilineær sensor',
-'exif-sensingmethod-8' => 'Fargesekvensiell linær sensor',
-
-'exif-filesource-3' => 'Digitalt stillbildekamera',
-
-'exif-scenetype-1' => 'Direktefotografert bilde',
-
-'exif-customrendered-0' => 'Normal prosess',
-'exif-customrendered-1' => 'Tilpasset prosess',
-
-'exif-exposuremode-0' => 'Automatisk eksponering',
-'exif-exposuremode-1' => 'Manuell eksponering',
-'exif-exposuremode-2' => 'Automatisk alternativeksponering',
-
-'exif-whitebalance-0' => 'Automatisk hvitbalanse',
-'exif-whitebalance-1' => 'Manuell hvitbalanse',
-
-'exif-scenecapturetype-0' => 'Standard',
-'exif-scenecapturetype-1' => 'Landskap',
-'exif-scenecapturetype-2' => 'Portrett',
-'exif-scenecapturetype-3' => 'Nattscene',
-
-'exif-gaincontrol-0' => 'Ingen',
-'exif-gaincontrol-1' => 'Økning av lavnivåforsterkning',
-'exif-gaincontrol-2' => 'Økning av høynivåforsterkning',
-'exif-gaincontrol-3' => 'Senkning av lavnivåforsterkning',
-'exif-gaincontrol-4' => 'Senkning av høynivåforsterkning',
-
-'exif-contrast-0' => 'Normal',
-'exif-contrast-1' => 'Myk',
-'exif-contrast-2' => 'Hard',
-
-'exif-saturation-0' => 'Normal',
-'exif-saturation-1' => 'Lav metningsgrad',
-'exif-saturation-2' => 'Høy metningsgrad',
-
-'exif-sharpness-0' => 'Normal',
-'exif-sharpness-1' => 'Myk',
-'exif-sharpness-2' => 'Hard',
-
-'exif-subjectdistancerange-0' => 'Ukjent',
-'exif-subjectdistancerange-1' => 'Makro',
-'exif-subjectdistancerange-2' => 'Nærbilde',
-'exif-subjectdistancerange-3' => 'Fjernbilde',
-
-# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-'exif-gpslatitude-n' => 'Nordlig breddegrad',
-'exif-gpslatitude-s' => 'Sørlig breddegrad',
-
-# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
-'exif-gpslongitude-e' => 'Østlig lengdegrad',
-'exif-gpslongitude-w' => 'Vestlig lengdegrad',
-
-# Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '{{PLURAL:$1|Én|$1}} meter over havet',
-'exif-gpsaltitude-below-sealevel' => '{{PLURAL:$1|Én|$1}} meter under havet',
-
-'exif-gpsstatus-a' => 'Måling pågår',
-'exif-gpsstatus-v' => 'MÃ¥lingsinteroperabilitet',
-
-'exif-gpsmeasuremode-2' => 'todimensjonell måling',
-'exif-gpsmeasuremode-3' => 'tredimensjonell måling',
-
-# Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'Kilometer per time',
-'exif-gpsspeed-m' => 'Miles per time',
-'exif-gpsspeed-n' => 'Knop',
-
-# Pseudotags used for GPSDestDistanceRef
-'exif-gpsdestdistance-k' => 'Kilometer',
-'exif-gpsdestdistance-m' => 'Miles',
-'exif-gpsdestdistance-n' => 'Nautiske mil',
-
-'exif-gpsdop-excellent' => 'Utmerket ($1)',
-'exif-gpsdop-good' => 'God ($1)',
-'exif-gpsdop-moderate' => 'Moderat ($1)',
-'exif-gpsdop-fair' => 'Middelmådig ($1)',
-'exif-gpsdop-poor' => 'DÃ¥rlig ($1)',
-
-'exif-objectcycle-a' => 'Kun morgen',
-'exif-objectcycle-p' => 'Kun kveld',
-'exif-objectcycle-b' => 'BÃ¥de morgen og kveld',
-
-# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
-'exif-gpsdirection-t' => 'Sann retning',
-'exif-gpsdirection-m' => 'Magnetisk retning',
-
-'exif-ycbcrpositioning-1' => 'Sentrert',
-'exif-ycbcrpositioning-2' => 'Co-lokalisert',
-
-'exif-dc-contributor' => 'Bidragsytere',
-'exif-dc-coverage' => 'Romlig eller timelig omfang av mediet',
-'exif-dc-date' => 'Dato(er)',
-'exif-dc-publisher' => 'Utgiver',
-'exif-dc-relation' => 'Relaterte media',
-'exif-dc-rights' => 'Rettigheter',
-'exif-dc-source' => 'Mediakilde',
-'exif-dc-type' => 'Mediatype',
-
-'exif-rating-rejected' => 'Avvist',
-
-'exif-isospeedratings-overflow' => 'Større enn 65535',
-
-'exif-iimcategory-ace' => 'Kunst, kultur og underholdning',
-'exif-iimcategory-clj' => 'Kriminalitet og jura',
-'exif-iimcategory-dis' => 'Katastrofer og ulykker',
-'exif-iimcategory-fin' => 'Økonomi og næringsliv',
-'exif-iimcategory-edu' => 'Utdanning',
-'exif-iimcategory-evn' => 'Miljø',
-'exif-iimcategory-hth' => 'Helse',
-'exif-iimcategory-hum' => 'Menneskelig interesse',
-'exif-iimcategory-lab' => 'Arbeidskraft',
-'exif-iimcategory-lif' => 'Livsstil og fritid',
-'exif-iimcategory-pol' => 'Politikk',
-'exif-iimcategory-rel' => 'Religion og livssyn',
-'exif-iimcategory-sci' => 'Vitenskap og teknologi',
-'exif-iimcategory-soi' => 'Sosiale problemer',
-'exif-iimcategory-spo' => 'Sport',
-'exif-iimcategory-war' => 'Krig, konflikt og uro',
-'exif-iimcategory-wea' => 'Vær',
-
-'exif-urgency-normal' => 'Normal ($1)',
-'exif-urgency-low' => 'Lav ($1)',
-'exif-urgency-high' => 'Høy ($1)',
-'exif-urgency-other' => 'Brukerdefinert prioritet ($1)',
-
-# External editor support
-'edit-externally' => 'Rediger denne filen med et eksternt program',
-'edit-externally-help' => '(Se [//www.mediawiki.org/wiki/Manual:External_editors oppsettsinstruksjonene] for mer informasjon)',
-
-# 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'alle',
-'namespacesall' => 'alle',
-'monthsall' => 'alle',
-'limitall' => 'alle',
-
-# E-mail address confirmation
-'confirmemail' => 'Bekreft e-postadresse',
-'confirmemail_noemail' => 'Du har ikke oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].',
-'confirmemail_text' => 'Du må bekrefte e-postadressen din før du kan benytte deg av e-posttjenester på {{SITENAME}}. Trykk på knappen under for å sende en bekreftelsesmelding til e-postadressen din. Meldingen vil inneholde en lenke med en kode; følg lenken for å bekrefte at e-postadressen er gyldig.',
-'confirmemail_pending' => 'En bekreftelseskode har allerede blitt sendt til deg på e-post; om du nylig opprettet kontoen din, kan du ønske å vente noen minutter før du spør om ny kode.',
-'confirmemail_send' => 'Send en bekreftelseskode.',
-'confirmemail_sent' => 'Bekreftelsesmelding sendt.',
-'confirmemail_oncreate' => 'En bekreftelseskode ble sendt til din e-postadresse. Denne koden er ikke nødvendig for å logge inn, men er nødvendig for å slå på e-postbaserte tjenester i denne wikien.',
-'confirmemail_sendfailed' => '{{SITENAME}} klarte ikke å sende bekreftelseskode.
-Sjekk e-postadressen for ugyldige tegn.
-
-E-postsenderen ga følgende melding: $1',
-'confirmemail_invalid' => 'Ugyldig bekreftelseskode. Koden kan ha utløpt.',
-'confirmemail_needlogin' => 'Du må $1 for å bekrefte e-postadressen din.',
-'confirmemail_success' => 'Din e-postadresse er nå bekreftet. Du kan nå logge inn og nyte wikien.',
-'confirmemail_loggedin' => 'E-postadressen din er bekreftet.',
-'confirmemail_error' => 'Noe gikk galt under lagringen av din bekreftelse.',
-'confirmemail_subject' => 'Bekreftelsesmelding fra {{SITENAME}}',
-'confirmemail_body' => 'Noen, antageligvis deg, har registrert kontoen «$2» på {{SITENAME}}, fra IP-adressen $1.
-
-For å bekrefte at denne kontoen tilhører deg og for å aktivere e-posttjenester på {{SITENAME}}, åpne følgende lenke i nettleseren din:
-
-$3
-
-Om du *ikke* registrerte kontoen, følg denne lenken for å avbryte bekreftelse av e-postadresse:
-
-$5
-
-Denne bekreftelseskoden utgår $4.',
-'confirmemail_body_changed' => 'Noen, antageligvis deg, fra IP-adresse $1,
-har endret e-postadressen til kontoen «$2» til denne adressen på {{SITENAME}}.
-
-For å bekrefte at denne kontoen virkelig er din og for å reaktivere e-postegenskaper på {{SITENAME}}, åpne denne lenken i nettleseren din:
-
-$3
-
-Dersom denne kontoen *ikke* tilhører deg, følg denne lenken
-for å avbryte e-postbekreftelsen:
-
-$5
-
-Denne bekreftelseskoden vil løpe ut $4.',
-'confirmemail_body_set' => 'Noen, trolig deg, har satt e-postadressen for kontoen «$2» til denne adressen på {{SITENAME}}, fra IP-adressen $1.
-
-For å bekrefte at denne kontoen tilhører deg og for å slå på e-posttjenestene på {{SITENAME}}, åpne denne lenka i nettleseren din:
-
-$3
-
-Om kontoen *ikke* tilhører deg, følg denne lenka for å avbryte bekreftelsen:
-
-$5
-
-Denne bekreftelseskoden går ut på dato $4.',
-'confirmemail_invalidated' => 'Bekreftelse av e-postadresse avbrutt',
-'invalidateemail' => 'Avbryt bekreftelse av e-postadresse',
-
-# Scary transclusion
-'scarytranscludedisabled' => '[Interwiki-transkludering er slått av]',
-'scarytranscludefailed' => '[Malen kunne ikke hentes for $1]',
-'scarytranscludetoolong' => '[URL-en er for lang]',
-
-# Trackbacks
-'trackbackbox' => 'Tilbakesporinger for denne siden:<br />
-$1',
-'trackbackremove' => '([$1 Slett])',
-'trackbacklink' => 'Tilbakesporing',
-'trackbackdeleteok' => 'Tilbakesporingen ble slettet.',
-
-# Delete conflict
-'deletedwhileediting' => "'''Advarsel:''' Denne siden har blitt slettet etter at du begynte å redigere den!",
-'confirmrecreate' => '«[[User:$1|$1]]» ([[User talk:$1|diskusjon]]) slettet siden etter at du begynte å redigere den, med begrunnelsen «$2». Vennligst bekreft at du vil gjenopprette siden.',
-'confirmrecreate-noreason' => 'Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) slettet denne siden etter at du begynte å redigere. Bekreft at du virkelig ønsker å gjenopprette denne siden.',
-'recreate' => 'Gjenopprett',
-
-# action=purge
-'confirm_purge_button' => 'OK',
-'confirm-purge-top' => "Vil du slette tjenerens mellomlagrede versjon (''cache'') av denne siden?",
-'confirm-purge-bottom' => 'Rensing av en side sletter mellomlageret og tvinger frem den nyeste versjonen.',
-
-# action=watch/unwatch
-'confirm-watch-button' => 'OK',
-'confirm-watch-top' => 'Legg denne siden til overvåkningslisten din?',
-'confirm-unwatch-button' => 'OK',
-'confirm-unwatch-top' => 'Fjern denne siden fra overvåkningslisten din?',
-
-# Multipage image navigation
-'imgmultipageprev' => '↠forrige side',
-'imgmultipagenext' => 'neste side &rarr;',
-'imgmultigo' => 'GÃ¥!',
-'imgmultigoto' => 'GÃ¥ til siden $1',
-
-# Table pager
-'ascending_abbrev' => 'stig.',
-'descending_abbrev' => 'synk.',
-'table_pager_next' => 'Neste side',
-'table_pager_prev' => 'Forrige side',
-'table_pager_first' => 'Første side',
-'table_pager_last' => 'Siste side',
-'table_pager_limit' => 'Vis $1 elementer per side',
-'table_pager_limit_label' => 'Element per side:',
-'table_pager_limit_submit' => 'GÃ¥',
-'table_pager_empty' => 'Ingen resultater',
-
-# Auto-summaries
-'autosumm-blank' => 'Tømmer siden',
-'autosumm-replace' => 'Erstatter siden med «$1»',
-'autoredircomment' => 'Omdirigerer til [[$1]]',
-'autosumm-new' => 'Ny side: $1',
-
-# Live preview
-'livepreview-loading' => 'Laster…',
-'livepreview-ready' => 'Laster&nbsp;… Klar!',
-'livepreview-failed' => 'Levende forhåndsvisning mislyktes. Prøv vanlig forhåndsvisning.',
-'livepreview-error' => 'Tilkobling mislyktes: $1 «$2»
-Prøv vanlig forhåndsvisning.',
-
-# Friendlier slave lag warnings
-'lag-warn-normal' => 'Endringer nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises muligens ikke i denne listen.',
-'lag-warn-high' => 'PÃ¥ grunn av stor databaseforsinkelse, vil ikke endringer som er nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises i denne listen.',
-
-# Watchlist editor
-'watchlistedit-numitems' => 'Overvåkningslisten din inneholder {{PLURAL:$1|én tittel|$1 titler}}, ikke inkludert diskusjonssider.',
-'watchlistedit-noitems' => 'Overvåkningslisten din inneholder ingen titler.',
-'watchlistedit-normal-title' => 'Rediger overvåkningsliste',
-'watchlistedit-normal-legend' => 'Fjern titler fra overvåkninglisten',
-'watchlistedit-normal-explain' => 'Titler på overvåkningslisten din vises nedenfor.
-For å fjerne en tittel, merk av boksen ved siden av den og klikk på «{{int:Watchlistedit-normal-submit}}».
-Du kan også [[Special:EditWatchlist/raw|redigere den rå overvåkningslisten]].',
-'watchlistedit-normal-submit' => 'Fjern titler',
-'watchlistedit-normal-done' => '{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet fra overvåkningslisten din:',
-'watchlistedit-raw-title' => 'Rediger rå overvåkningsliste',
-'watchlistedit-raw-legend' => 'Rediger rå overvåkningsliste',
-'watchlistedit-raw-explain' => 'Titler på overvåkningslisten din vises nedenunder, og kan redigeres ved å legge til eller fjerne fra listen;
-én tittel per linje.
-Når du er ferdig, trykk «{{int:Watchlistedit-raw-submit}}».
-Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
-'watchlistedit-raw-titles' => 'Titler:',
-'watchlistedit-raw-submit' => 'Oppdater overvåkningsliste',
-'watchlistedit-raw-done' => 'Overvåkningslisten din er oppdatert.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|Én tittel|$1 titler}} ble lagt til:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet:',
-
-# Watchlist editing tools
-'watchlisttools-view' => 'Vis relevante endringer',
-'watchlisttools-edit' => 'Vis og rediger overvåkningsliste',
-'watchlisttools-raw' => 'Rediger rå overvåkningsliste',
-
-# Hebrew month names
-'hebrew-calendar-m1' => 'Tisjri',
-'hebrew-calendar-m2' => 'Hesjván',
-'hebrew-calendar-m3' => 'Kislév',
-'hebrew-calendar-m4' => 'Tebét',
-'hebrew-calendar-m5' => 'Sjebát',
-'hebrew-calendar-m6' => 'Adár',
-'hebrew-calendar-m6a' => 'Adár I',
-'hebrew-calendar-m6b' => 'Adár II',
-'hebrew-calendar-m7' => 'Nisán',
-'hebrew-calendar-m8' => 'Ijár',
-'hebrew-calendar-m9' => 'Siván',
-'hebrew-calendar-m10' => 'Tammúz',
-'hebrew-calendar-m11' => 'Ab',
-'hebrew-calendar-m12' => 'Elúl',
-'hebrew-calendar-m1-gen' => 'Tisjri',
-'hebrew-calendar-m2-gen' => 'Hesjván',
-'hebrew-calendar-m3-gen' => 'Kislév',
-'hebrew-calendar-m4-gen' => 'Tebét',
-'hebrew-calendar-m5-gen' => 'Sjebát',
-'hebrew-calendar-m6-gen' => 'Adár',
-'hebrew-calendar-m6a-gen' => 'Adár I',
-'hebrew-calendar-m6b-gen' => 'Adár II',
-'hebrew-calendar-m7-gen' => 'Nisán',
-'hebrew-calendar-m8-gen' => 'Ijár',
-'hebrew-calendar-m9-gen' => 'Siván',
-'hebrew-calendar-m10-gen' => 'Tammúz',
-'hebrew-calendar-m11-gen' => 'Ab',
-'hebrew-calendar-m12-gen' => 'Elúl',
-
-# Core parser functions
-'unknown_extension_tag' => 'Ukjent tilleggsmerking «$1»',
-'duplicate-defaultsort' => 'Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».',
-
-# Special:Version
-'version' => 'Versjon',
-'version-extensions' => 'Installerte utvidelser',
-'version-specialpages' => 'Spesialsider',
-'version-parserhooks' => 'Parsertillegg',
-'version-variables' => 'Variabler',
-'version-antispam' => 'Søppelpostforebygging',
-'version-skins' => 'Drakter',
-'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',
-'version-hook-subscribedby' => 'Brukes av',
-'version-version' => '(versjon $1)',
-'version-license' => 'Lisens',
-'version-poweredby-credits' => "Denne wikien er drevet av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
-'version-poweredby-others' => 'andre',
-'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
-
-MediaWiki er distribuert i håp om at det vil være nyttig, men UTEN NOEN GARANTI; ikke engang implisitt garanti av SALGBARHET eller EGNETHET FOR ET BESTEMT FORMÅL. Se GNU General Public License for flere detaljer.
-
-Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Public License] sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [//www.gnu.org/licenses/old-licenses/gpl-2.0.html les det på nettet].',
-'version-software' => 'Installert programvare',
-'version-software-product' => 'Produkt',
-'version-software-version' => 'Versjon',
-
-# 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:FileDuplicateSearch
-'fileduplicatesearch' => 'Søk etter duplikatfiler',
-'fileduplicatesearch-summary' => 'Søk etter duplikatfiler basert på dets hash-verdi.',
-'fileduplicatesearch-legend' => 'Søk etter en duplikatfil',
-'fileduplicatesearch-filename' => 'Filnavn:',
-'fileduplicatesearch-submit' => 'Søk',
-'fileduplicatesearch-info' => '$1 × $2 piksler<br />Filstørrelse: $3<br />MIME-type: $4',
-'fileduplicatesearch-result-1' => 'Det er ingen duplikater av «$1».',
-'fileduplicatesearch-result-n' => 'Det er {{PLURAL:$2|ett duplikat|$2 duplikater}} av «$1».',
-'fileduplicatesearch-noresults' => 'Ingen ved navn «$1» funnet.',
-
-# Special:SpecialPages
-'specialpages' => 'Spesialsider',
-'specialpages-note' => '----
-* Normale spesialsider.
-* <span class="mw-specialpagerestricted">Spesialsider med begrenset tilgang.</span>
-* <span class="mw-specialpagecached">Spesialsider som oppdateres periodisk (kan være foreldede).</span>',
-'specialpages-group-maintenance' => 'Vedlikeholdsrapporter',
-'specialpages-group-other' => 'Andre spesialsider',
-'specialpages-group-login' => 'Innlogging / registrering',
-'specialpages-group-changes' => 'Siste endringer og logger',
-'specialpages-group-media' => 'Mediarapporter og opplastinger',
-'specialpages-group-users' => 'Brukere og rettigheter',
-'specialpages-group-highuse' => 'Ofte brukte sider',
-'specialpages-group-pages' => 'Sidelister',
-'specialpages-group-pagetools' => 'Sideverktøy',
-'specialpages-group-wiki' => 'Informasjon og verktøy for wikien',
-'specialpages-group-redirects' => 'Omdirigerende spesialsider',
-'specialpages-group-spam' => 'Spamverktøy',
-
-# Special:BlankPage
-'blankpage' => 'Tom side',
-'intentionallyblankpage' => 'Denne siden er tom med vilje',
-
-# External image whitelist
-'external_image_whitelist' => '#La denne linja være som den er<pre>
-#Skriv fragmenter av regulære uttrykk (delen som går mellom //) nedenfor
-#Disse vil sjekkes mot adresser til bilder fra eksterne sider
-#De som blir godkjent vil vises, ellers vil det gis en lenke til bildet
-#Linjer som begynner med # anses som kommentarer
-#Det skilles ikke mellom store og små bokstaver
-
-#Skriv alle fragmenter av regulære uttrykk over denne lina. La denne linja være som den er</pre>',
-
-# Special:Tags
-'tags' => 'Gyldige endringstagger',
-'tag-filter' => 'Filter for [[Special:Tags|tagger]]:',
-'tag-filter-submit' => 'Filtrer',
-'tags-title' => 'Tagger',
-'tags-intro' => 'Denne siden lister opp taggene programvaren kan merke en endring med, og hva de betyr.',
-'tags-tag' => 'Taggnavn',
-'tags-display-header' => 'Utseende på endringslister',
-'tags-description-header' => 'Fullstendig betydning',
-'tags-hitcount-header' => 'Taggede endringer',
-'tags-edit' => 'rediger',
-'tags-hitcount' => '{{PLURAL:$1|én endring|$1 endringer}}',
-
-# Special:ComparePages
-'comparepages' => 'Sammenlign sider',
-'compare-selector' => 'Sammenlign siderevisjoner',
-'compare-page1' => 'Side 1',
-'compare-page2' => 'Side 2',
-'compare-rev1' => 'Revisjon 1',
-'compare-rev2' => 'Revisjon 2',
-'compare-submit' => 'Sammenlign',
-
-# Database error messages
-'dberr-header' => 'Wikien har et problem',
-'dberr-problems' => 'Siden har tekniske problemer.',
-'dberr-again' => 'Prøv å oppdatere siden om noen minutter.',
-'dberr-info' => '(Kan ikke kontakte databasetjeneren: $1)',
-'dberr-usegoogle' => 'Du kan prøve å søke via Google imens.',
-'dberr-outofdate' => 'Merk at deres indeks over våre sider kan være utdatert.',
-'dberr-cachederror' => 'Følgende er en mellomlagret kopi av den etterspurte siden, og kan være foreldet.',
-
-# HTML forms
-'htmlform-invalid-input' => 'Det er problemer med noen av inndatene dine',
-'htmlform-select-badoption' => 'Verdien du valgte er ikke et gyldig alternativ.',
-'htmlform-int-invalid' => 'Verdien du valgte er ikke et heltall.',
-'htmlform-float-invalid' => 'Verdien du valgte er ikke et tall.',
-'htmlform-int-toolow' => 'Verdien du valgte er mindre enn minimum på $1',
-'htmlform-int-toohigh' => 'Verdien du valgte er over det mulige $1',
-'htmlform-required' => 'Denne verdien er påkrevd',
-'htmlform-submit' => 'Lagre',
-'htmlform-reset' => 'Omgjør endringer',
-'htmlform-selectorother-other' => 'Andre',
-
-# SQLite database support
-'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
-'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
-
-);
+$fallback = 'nb';
diff --git a/languages/messages/MessagesNov.php b/languages/messages/MessagesNov.php
index c362c3ee..210e0eb1 100644
--- a/languages/messages/MessagesNov.php
+++ b/languages/messages/MessagesNov.php
@@ -7,11 +7,12 @@
* @ingroup Language
* @file
*
+ * @author BRG (on nov.wikipedia.org)
* @author Chrisportelli
* @author MF-Warburg
* @author Malafaya
* @author Nov ialiste
- * @author nov.wikipedia.org sysops
+ * @author Wayne (on nov.wikipedia.org)
*/
$messages = array(
@@ -199,18 +200,17 @@ As a result, visitors using this IP address cannot create any more accounts at t
'image_sample' => 'Exemple.jpg',
# Edit pages
-'summary' => 'Resume:',
-'minoredit' => 'Dise es mikri modifiko',
-'watchthis' => 'Observa disi pagine',
-'savearticle' => 'Spara pagine',
-'showpreview' => 'Montra previdatu',
-'showdiff' => 'Montra chanjos',
-'blockedoriginalsource' => "Li fonte de '''$1''' bli montra subu:",
-'loginreqtitle' => 'Ensignato Postulat',
-'loginreqlink' => 'ensignata',
-'accmailtitle' => 'Pasa-vorde sendat.',
-'accmailtext' => 'Li pasa-vorde por "$1" ha bli senda a $2.',
-'yourtext' => 'Vun texte',
+'summary' => 'Resume:',
+'minoredit' => 'Dise es mikri modifiko',
+'watchthis' => 'Observa disi pagine',
+'savearticle' => 'Spara pagine',
+'showpreview' => 'Montra previdatu',
+'showdiff' => 'Montra chanjos',
+'loginreqtitle' => 'Ensignato Postulat',
+'loginreqlink' => 'ensignata',
+'accmailtitle' => 'Pasa-vorde sendat.',
+'accmailtext' => 'Li pasa-vorde por "$1" ha bli senda a $2.',
+'yourtext' => 'Vun texte',
# History pages
'currentrev' => 'Nuni revisione',
@@ -367,7 +367,6 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
'excontentauthor' => "kontenaje esed: '$1' (e li soli kontribuere esed '[[Special:Contributions/$2|$2]]')",
'exblank' => 'pagine esed vakui',
'actioncomplete' => 'Akto kompleti',
-'deletedarticle' => 'ekartad "[[$1]]"',
'dellogpage' => 'Loge de ekartos',
'dellogpagetext' => 'Subu es liste del maxim resenti ekartos.',
'deletionlog' => 'registre de ekartos',
@@ -408,12 +407,10 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
'movenologin' => 'Non ensignatat',
'move-watch' => 'Observa disi pagine',
'movedto' => 'movat a',
-'1movedto2' => '[[$1]] movat a [[$2]]',
-'1movedto2_redir' => '[[$1]] movat a [[$2]] via ri-adreso',
'movereason' => 'Resone:',
'delete_and_move' => 'Ekarta e mova',
'delete_and_move_confirm' => 'Yes, ekarta li pagine',
-'delete_and_move_reason' => 'Ekartat por fa spatie por movo',
+'delete_and_move_reason' => 'Ekartat por fa spatie por movo "[[$1]]"',
# Namespace 8 related
'allmessages' => 'Sisteme mesajes',
diff --git a/languages/messages/MessagesNso.php b/languages/messages/MessagesNso.php
index 8cf7ede3..d0c8c386 100644
--- a/languages/messages/MessagesNso.php
+++ b/languages/messages/MessagesNso.php
@@ -32,14 +32,14 @@ $namespaceNames = array(
);
$magicWords = array(
- 'currentmonth' => array( '1', 'KGWEDI_BJALE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'LEINA_KGWEDI_BJALE', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'LEHONO_LETSATSI', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'LEHONO_LETSATSI2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'LEHONO_LETSATSILEINA', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'NGWAGA_BJALE', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'NAKO_BJALE', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'IRI_BJALE', 'CURRENTHOUR' ),
+ 'currentmonth' => array( '1', 'KGWEDI_BJALE', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'LEINA_KGWEDI_BJALE', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'LEHONO_LETSATSI', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'LEHONO_LETSATSI2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'LEHONO_LETSATSILEINA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'NGWAGA_BJALE', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'NAKO_BJALE', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'IRI_BJALE', 'CURRENTHOUR' ),
);
$messages = array(
@@ -313,7 +313,6 @@ Bega se go [[Special:ListUsers/sysop|administrator]], o fana ka URL.',
'badtitle' => 'Taetlile ya bošula',
'badtitletext' => 'Letlakala le ga la dumelelwa, ga le na ditlhaka, goba hlomaganyo ya bogare-dipolelo goba bogare-wiki taetlele ga ya loka. Ekaba mohlomong taetlele enale hlaka goba dihlaka tšago sedumelelwe.',
'viewsource' => 'Lebelela mothopo',
-'viewsourcefor' => 'ya $1',
'protectedpagetext' => 'Letlakala le le notletšwe go thibela diphetogo.',
'viewsourcetext' => 'O ka lebelela goba wa kôpiša mothapo wa letlakala le:',
'namespaceprotected' => "Ga ona tokelo ya go fetola matlakala go '''$1''' .",
@@ -435,8 +434,6 @@ O ka se kgone go šumiša thulusu ya 'romela mošomiši molaetša' ka ntle gage
[[Special:Preferences|dikgatlhegelo]] gape ge o sa thibelwa go e šomiša.
IP atrese ya gago ke $3, ge ID ya go thiba ele #$5. Ka kgopelo šumiša ID le IP go dipoledišano ka moka tšeo dilego mabapi le go go thiba.",
'blockednoreason' => 'gago lebaka leo le filwego',
-'blockedoriginalsource' => "Mothopo wa '''$1''' oa botšhwa tlase:",
-'whitelistedittitle' => 'O swanela ke go tsena go fetola',
'whitelistedittext' => 'O swanela ke go $1 go fetola matlakala.',
'confirmedittext' => 'E-mail e swanetše ke go tiišetšwa pele ge o ka fetola matlakala. Ka kgopelo, tiišetša e-mail atrese ya gago go [[Special:Preferences|dikgatlhego tša mošomiši]].',
'nosuchsectiontitle' => 'Sekgao ga se humanege',
@@ -530,15 +527,11 @@ Leka [[Special:Search|go fetleka wikii]] go humana matlakala a mapsha.',
'rev-delundel' => 'Bontšha/Fihla',
'revdelete-hide-text' => 'Fihla dihlaka tša poeletšo',
'revdelete-log' => 'Lebaka:',
-'revdelete-logentry' => 'dipheto tša dipušeletšo tša ponagalo ya "[[$1]]"',
'revdel-restore' => '
fetola tshenolo',
'revdel-restore-deleted' => 'pušeletšo tšago phumulwa',
'revdel-restore-visible' => 'pušeletšo tšago bonagala',
'pagehist' => 'Histori ya letlakala',
-'revdelete-content' => 'mateng',
-'revdelete-hid' => 'fihlilwe $1',
-'revdelete-log-message' => '$1 ya $2 {{PLURAL:$2|pušeletšo|ya dipušeletšo}}',
# History merging
'mergehistory-from' => 'Letlakala la mothopo:',
@@ -639,7 +632,7 @@ Ga re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yon
# User rights
'editusergroup' => 'Fetola sehlopha sa bašomiši',
-'editinguser' => "Fetola mošomiši '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "O fetola mošomiši '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Fetola sehlopha sa bašomiši',
'saveusergroups' => 'Boloko Dihlopha tša bašomiši',
'userrights-groupsmember' => 'Leloko la:',
@@ -875,8 +868,7 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
'listusers-submit' => 'Bontšha',
# Special:Log/newusers
-'newuserlogpage' => '"Log" yago hlola mošumiši',
-'newuserlog-create-entry' => 'Tšhupaleloko ya mošumiši ye mphsa',
+'newuserlogpage' => '"Log" yago hlola mošumiši',
# Special:ListGroupRights
'listgrouprights-members' => '(Lenano la ditho)',
@@ -934,7 +926,6 @@ Ka kgopela sitlediša gore ke se o nyakago go sedira, le gore o kwešiša ditla
'actionfailed' => 'Tiro e padile',
'deletedtext' => '"$1" e phumutšwe.
Lebelela $2 go hweetša sedi ka diphulo tša bjale.',
-'deletedarticle' => 'E phumutšwe "[[$1]]"',
'dellogpage' => "''Log'' yago phumula",
'deletecomment' => 'Lebaka:',
'deleteotherreason' => 'Mabaka a mangwe:',
@@ -982,7 +973,6 @@ Seemo sa go lota ga letlakala '''$1''':",
'undeletelink' => 'Nyakorela/hlaphola',
'undeleteviewlink' => 'ponagalo',
'undeletecomment' => 'Lebaka:',
-'undeletedarticle' => 'hlaphola "[[$1]]"',
'undelete-search-prefix' => 'Laetśa matlakala a go thoma ka:',
'undelete-search-submit' => 'Fetleka',
@@ -1085,8 +1075,6 @@ Ka kgopelo, kgetha leina le lengwe.',
'talkexists' => "'''Letlakala le hudugile ka katlego, efele letlakala la dipolešano ga la huduga kage gobe go ina letlakala leineng le lemphsa. Ka kgopelo, a gahlanye ka bowena.'''",
'movedto' => 'hudugetše go',
'movetalk' => 'Huduša letlakala la dipoledišano la go hlobana le letlakala le',
-'1movedto2' => '[[$1]] e hudugile goya go [[$2]]',
-'1movedto2_redir' => 'hudušitše [[$1]] go [[$2]] godimo ga "redirect"',
'movelogpage' => "''log'' yago huduša",
'movereason' => 'Lebaka:',
'revertmove' => 'bušetša',
@@ -1176,10 +1164,6 @@ Ka kgopelo, kgetha leina le lengwe.',
'others' => 'tše dingwe',
'siteusers' => '{{SITENAME}} {{PLURAL:$2|mošumiši|bašumiši}} $1',
-# Patrol log
-'patrol-log-line' => 'maraka $1 ya $2 "patrolwa" ke $3',
-'patrol-log-diff' => 'Pušeletšo $1',
-
# Image deletion
'filedeleteerror-short' => 'Phošo go phumuleng faele: $1',
'filedeleteerror-long' => 'Diphošo di hlagile ge go phumulwa faele:
@@ -1194,7 +1178,7 @@ $1',
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|letlakala|matlakala}}',
'file-info-size' => '$1 × $2 pixel, bogolo ba faele: $3, Mohuta wa MIME: $4',
-'file-nohires' => "<small>Gago ''resolution'' ya go feta mo.</small>",
+'file-nohires' => "Gago ''resolution'' ya go feta mo.",
'svg-long-desc' => 'SVG faele, nominally $1 × $2 pixels, bogolo ba faele: $3',
'show-big-image' => "''resolution'' ya gofella",
diff --git a/languages/messages/MessagesNv.php b/languages/messages/MessagesNv.php
index 8de19b0a..9ca3c851 100644
--- a/languages/messages/MessagesNv.php
+++ b/languages/messages/MessagesNv.php
@@ -279,9 +279,6 @@ $3',
# Special:LinkSearch
'linksearch' => 'linksígíí tłʼóoʼdi siʼánígíí',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'choyoołʼįįhí ániidí',
-
# E-mail user
'emailuser' => 'E-mail bichʼįʼ áshłééh nisin',
@@ -304,9 +301,6 @@ $3',
'watching' => '(...)',
'unwatching' => '(...)',
-# Delete
-'deletedarticle' => '"[[$1]]" yiyiisxįÌ',
-
# Protect
'protectedarticle' => '"[[$1]]" bichʼąÌÄ…Ìh ííyá.',
'modifiedarticleprotection' => '"[[$1]]" biprotection level łahgo ályaa',
@@ -351,14 +345,12 @@ $3',
'blocklogentry' => '[[$1]] bichʼąÌÄ…Ìh niiníyá ($2 $3)',
# Move page
-'movearticle' => 'naaltsoos:',
-'newtitle' => 'naaltsoos bizhiʼ ániidí:',
-'move-watch' => 'shinááł',
-'movepagebtn' => '✔ bee lÄ…Ì ashÅ‚eeh',
-'movepage-moved' => '\'\'\'"$1" kʼad "$2" wolyé\'\'\'',
-'1movedto2' => 'naaltsoos "[[$1]]" → "[[$2]]"-góó yidiyiznááʼ',
-'1movedto2_redir' => 'naaltsoos "[[$1]]" → "[[$2]]"-góó yidiyiznááʼ (dah astsihí Å„tʼęÌÄ™Ìʼ)',
-'revertmove' => 'ńdíídleeł!',
+'movearticle' => 'naaltsoos:',
+'newtitle' => 'naaltsoos bizhiʼ ániidí:',
+'move-watch' => 'shinááł',
+'movepagebtn' => '✔ bee lÄ…Ì ashÅ‚eeh',
+'movepage-moved' => '\'\'\'"$1" kʼad "$2" wolyé\'\'\'',
+'revertmove' => 'ńdíídleeł!',
# Skin names
'skinname-monobook' => "NaaltsoosÅáa'ígíí",
diff --git a/languages/messages/MessagesNy.php b/languages/messages/MessagesNy.php
index 07ee51c5..7f1793e3 100644
--- a/languages/messages/MessagesNy.php
+++ b/languages/messages/MessagesNy.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Lycaon (on ny.wikipedia.org)
*/
$messages = array(
diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php
index b5ac8fbd..f0e62069 100644
--- a/languages/messages/MessagesOc.php
+++ b/languages/messages/MessagesOc.php
@@ -146,130 +146,130 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECCION', '#REDIRECT' ),
- 'notoc' => array( '0', '__CAPDETAULA__', '__PASCAPDESOMARI__', '__PASCAPDETDM__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__CAPDEGALARIÃ__', '__CAPDEGALARIA__', '__PASCAPDEDEGALARIÃ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORÇARTAULA__', '__FORÇARSOMARI__', '__FORÇARTDM__', '__FORCETOC__' ),
- 'toc' => array( '0', '__TAULA__', '__SOMARI__', '__TDM__', '__TOC__' ),
- 'noeditsection' => array( '0', '__SECCIONNONEDITABLA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__PASCAPDENTÈSTA__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MESCORRENT', 'MESACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'NOMMESCORRENT', 'NOMMESACTUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NOMGENMESCORRENT', 'NOMGENMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ABREVMESCORRENT', 'ABREVMESACTUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'JORNCORRENT', 'JORNACTUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'JORNCORRENT2', 'JORNACTUAL2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMJORNCORRENT', 'NOMJORNACTUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANNADACORRENTA', 'ANNADAACTUALA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'DATACORRENTA', 'DATAACTUALA', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORACORRENTA', 'ORAACTUALA', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'NOMMESLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'NOMGENMESLOCAL', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ABREVMESLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'JORNLOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'JORNLOCAL2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMJORNLOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANNADALOCALA', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ORARILOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NOMBREPAGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NOMBREFICHIÈRS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NOMBREUTILIZAIRES', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NOMBREUTILIZAIRESACTIUS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NOMBREEDICIONS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NOMBREVISTAS', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NOMPAGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NOMPAGINAX', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ESPACINOMENATGE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ESPACINOMENATGEX', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ESPACIDISCUSSION', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ESPACIDISCUSSIONX', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ESPACISUBJECTE', 'ESPACISUBJÈCTE', 'ESPACIARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ESPACISUBJECTEX', 'ESPACISUBJÈCTEX', 'ESPACIARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NOMPAGINACOMPLET', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NOMPAGINACOMPLETX', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NOMSOSPAGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOMSOSPAGINAX', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NOMBASADEPAGINA', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NOMBASADEPAGINAX', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NOMPAGINADISCUSSION', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NOMPAGINADISCUSSIONX', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NOMPAGINASUBJECTE', 'NOMPAGINASUBJÈCTE', 'NOMPAGINAARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NOMPAGINASUBJECTEX', 'NOMPAGINASUBJÈCTEX', 'NOMPAGINAARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'img_thumbnail' => array( '1', 'vinheta', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'vinheta=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'drecha', 'dreta', 'right' ),
- 'img_left' => array( '1', 'esquèrra', 'senèstra', 'gaucha', 'left' ),
- 'img_none' => array( '1', 'neant', 'nonrés', 'none' ),
- 'img_center' => array( '1', 'centrat', 'center', 'centre' ),
- 'img_framed' => array( '1', 'quadre', 'enquagrat', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'sens_quadre', 'frameless' ),
- 'img_upright' => array( '1', 'redreça', 'redreça$1', 'redreça $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'bordadura', 'border' ),
- 'img_baseline' => array( '1', 'linha_de_basa', 'baseline' ),
- 'img_sub' => array( '1', 'indici', 'ind', 'sub' ),
- 'img_super' => array( '1', 'exp', 'super', 'sup' ),
- 'img_top' => array( '1', 'naut', 'top' ),
- 'img_text_top' => array( '1', 'naut-tèxte', 'naut-txt', 'text-top' ),
- 'img_middle' => array( '1', 'mitan', 'middle' ),
- 'img_bottom' => array( '1', 'bas', 'bottom' ),
- 'img_text_bottom' => array( '1', 'bas-tèxte', 'bas-txt', 'text-bottom' ),
- 'img_link' => array( '1', 'ligam=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NOMSIT', 'NOMSITE_NOMSITI', 'SITENAME' ),
- 'ns' => array( '0', 'ESPACEN:', 'NS:' ),
- 'localurl' => array( '0', 'URLLOCALA:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLLOCALAX:', 'LOCALURLE:' ),
- 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
- 'servername' => array( '0', 'NOMSERVIDOR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CAMINESCRIPT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GENRE:', 'GENDER:' ),
- 'currentweek' => array( '1', 'SETMANACORRENTA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'JDSCORRENT', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'SETMANALOCALA', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'NUMÈROVERSION', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DATAVERSION', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DATAVERSION2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MESREVISION', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ANNADAREVISION', 'ANREVISION', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'ORAREVISION', 'REVISIONTIMESTAMP' ),
- 'fullurl' => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLCOMPLETAX:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'INITMINUS:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'INITMAJUS:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MINUS:', 'LC:' ),
- 'uc' => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
- 'raw' => array( '0', 'LINHA:', 'BRUT:', 'RAW:' ),
- 'displaytitle' => array( '1', 'AFICHARTÃTOL', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'BRUT', 'B', 'R' ),
- 'newsectionlink' => array( '1', '__LIGAMSECCIONNOVÈLA__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__PASCAPDELIGAMSECCIONNOVÈLA__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERSIONACTUALA', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ENCÃ’DAURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'ENCÃ’DAANCÃ’RA', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'INSTANTACTUAL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'MARCADIRECCION', 'MARCADIR', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#LENGA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'LENGACONTENGUT', 'LENGCONTENGUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAGINASDINSESPACI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
- 'padleft' => array( '0', 'BORRATGEESQUÈRRA', 'PADLEFT' ),
- 'padright' => array( '0', 'BORRATGEDRECHA', 'PADRIGHT' ),
- 'special' => array( '0', 'especial', 'special' ),
- 'defaultsort' => array( '1', 'ORDENA:', 'CLAUDETRIADA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CAMIN:', 'FILEPATH:' ),
- 'tag' => array( '0', 'balisa', 'tag' ),
- 'hiddencat' => array( '1', '__CATAMAGADA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGINASDINSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TALHAPAGINA', 'PAGESIZE' ),
- 'noindex' => array( '1', '__PASCAPDINDÈX__', '__NOINDEX__' ),
- 'staticredirect' => array( '1', '__REDIRECCIONESTATICA__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVÈLDEPROTECCION', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#REDIRECCION', '#REDIRECT' ),
+ 'notoc' => array( '0', '__CAPDETAULA__', '__PASCAPDESOMARI__', '__PASCAPDETDM__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__CAPDEGALARIÃ__', '__CAPDEGALARIA__', '__PASCAPDEDEGALARIÃ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORÇARTAULA__', '__FORÇARSOMARI__', '__FORÇARTDM__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__TAULA__', '__SOMARI__', '__TDM__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__SECCIONNONEDITABLA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__PASCAPDENTÈSTA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MESCORRENT', 'MESACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'NOMMESCORRENT', 'NOMMESACTUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NOMGENMESCORRENT', 'NOMGENMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ABREVMESCORRENT', 'ABREVMESACTUAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'JORNCORRENT', 'JORNACTUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'JORNCORRENT2', 'JORNACTUAL2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMJORNCORRENT', 'NOMJORNACTUAL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANNADACORRENTA', 'ANNADAACTUALA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'DATACORRENTA', 'DATAACTUALA', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORACORRENTA', 'ORAACTUALA', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'NOMMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'NOMGENMESLOCAL', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ABREVMESLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'JORNLOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'JORNLOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMJORNLOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANNADALOCALA', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ORARILOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NOMBREPAGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NOMBREARTICLES', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NOMBREFICHIÈRS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NOMBREUTILIZAIRES', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NOMBREUTILIZAIRESACTIUS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NOMBREEDICIONS', 'NOMBREMODIFS', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NOMBREVISTAS', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NOMPAGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NOMPAGINAX', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ESPACINOMENATGE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ESPACINOMENATGEX', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ESPACIDISCUSSION', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ESPACIDISCUSSIONX', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ESPACISUBJECTE', 'ESPACISUBJÈCTE', 'ESPACIARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ESPACISUBJECTEX', 'ESPACISUBJÈCTEX', 'ESPACIARTICLEX', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NOMPAGINACOMPLET', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NOMPAGINACOMPLETX', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOMSOSPAGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOMSOSPAGINAX', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NOMBASADEPAGINA', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NOMBASADEPAGINAX', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NOMPAGINADISCUSSION', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NOMPAGINADISCUSSIONX', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NOMPAGINASUBJECTE', 'NOMPAGINASUBJÈCTE', 'NOMPAGINAARTICLE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NOMPAGINASUBJECTEX', 'NOMPAGINASUBJÈCTEX', 'NOMPAGINAARTICLEX', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'vinheta', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'vinheta=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'drecha', 'dreta', 'right' ),
+ 'img_left' => array( '1', 'esquèrra', 'senèstra', 'gaucha', 'left' ),
+ 'img_none' => array( '1', 'neant', 'nonrés', 'none' ),
+ 'img_center' => array( '1', 'centrat', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'quadre', 'enquagrat', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'sens_quadre', 'frameless' ),
+ 'img_upright' => array( '1', 'redreça', 'redreça$1', 'redreça $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'bordadura', 'border' ),
+ 'img_baseline' => array( '1', 'linha_de_basa', 'baseline' ),
+ 'img_sub' => array( '1', 'indici', 'ind', 'sub' ),
+ 'img_super' => array( '1', 'exp', 'super', 'sup' ),
+ 'img_top' => array( '1', 'naut', 'top' ),
+ 'img_text_top' => array( '1', 'naut-tèxte', 'naut-txt', 'text-top' ),
+ 'img_middle' => array( '1', 'mitan', 'middle' ),
+ 'img_bottom' => array( '1', 'bas', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'bas-tèxte', 'bas-txt', 'text-bottom' ),
+ 'img_link' => array( '1', 'ligam=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NOMSIT', 'NOMSITE_NOMSITI', 'SITENAME' ),
+ 'ns' => array( '0', 'ESPACEN:', 'NS:' ),
+ 'localurl' => array( '0', 'URLLOCALA:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLLOCALAX:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
+ 'servername' => array( '0', 'NOMSERVIDOR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CAMINESCRIPT', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GENRE:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'SETMANACORRENTA', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'JDSCORRENT', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'SETMANALOCALA', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'JDSLOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'NUMÈROVERSION', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DATAVERSION', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DATAVERSION2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MESREVISION', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ANNADAREVISION', 'ANREVISION', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ORAREVISION', 'REVISIONTIMESTAMP' ),
+ 'fullurl' => array( '0', 'URLCOMPLETA:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLCOMPLETAX:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'INITMINUS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'INITMAJUS:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MINUS:', 'LC:' ),
+ 'uc' => array( '0', 'MAJUS:', 'CAPIT:', 'UC:' ),
+ 'raw' => array( '0', 'LINHA:', 'BRUT:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'AFICHARTÃTOL', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'BRUT', 'B', 'R' ),
+ 'newsectionlink' => array( '1', '__LIGAMSECCIONNOVÈLA__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__PASCAPDELIGAMSECCIONNOVÈLA__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERSIONACTUALA', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ENCÃ’DAURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ENCÃ’DAANCÃ’RA', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'INSTANTACTUAL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'INSTANTLOCAL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'MARCADIRECCION', 'MARCADIR', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#LENGA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'LENGACONTENGUT', 'LENGCONTENGUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAGINASDINSESPACI:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATNOMBRE', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'BORRATGEESQUÈRRA', 'PADLEFT' ),
+ 'padright' => array( '0', 'BORRATGEDRECHA', 'PADRIGHT' ),
+ 'special' => array( '0', 'especial', 'special' ),
+ 'defaultsort' => array( '1', 'ORDENA:', 'CLAUDETRIADA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CAMIN:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'balisa', 'tag' ),
+ 'hiddencat' => array( '1', '__CATAMAGADA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGINASDINSCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TALHAPAGINA', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__PASCAPDINDÈX__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '__REDIRECCIONESTATICA__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVÈLDEPROTECCION', 'PROTECTIONLEVEL' ),
);
$datePreferences = array(
@@ -648,14 +648,13 @@ Informatz-ne un [[Special:ListUsers/sysop|administrator]] aprèp aver notada lâ€
Benlèu la supression ja es estada efectuada per qualqu’un mai.',
'badtitle' => 'Títol marrit',
'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
-'perfcached' => 'Aquò es una version en escondedor e benlèu es pas a jorn.',
-'perfcachedts' => 'Las donadas seguentas son en escondedor, son doncas pas obligatòriament a jorn. La darrièra actualizacion data del $1.',
+'perfcached' => 'Aquò es una version en amagatal e es benlèu pas a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => "Las donadas que segon son dins l'amagatal, son doncas pas forçadament a jorn. La darrièra actualizacion data del $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Las mesas a jorn per aquesta pagina son actualamnt desactivadas. Las donadas çaijós son pas mesas a jorn.',
'wrong_wfQuery_params' => 'Paramètres incorrèctes sus wfQuery()<br />
Foncion : $1<br />
Requèsta : $2',
'viewsource' => 'Vejatz lo tèxte font',
-'viewsourcefor' => 'per $1',
'actionthrottled' => 'Accion limitada',
'actionthrottledtext' => "Per luchar contra lo spam, l’utilizacion d'aquesta accion es limitada a un cèrt nombre de còps dins una sosta pro corta. S'avèra qu'avètz depassat aqueste limit. Ensajatz tornamai dins qualques minutas.",
'protectedpagetext' => 'Aquesta pagina es estada protegida per empachar sa modificacion.',
@@ -796,6 +795,16 @@ Benlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl
'passwordreset-emailelement' => 'Utilizaire: $1
Senhal temporari: $2',
+# Special:ChangeEmail
+'changeemail' => "Cambiar l'adreça electronica:",
+'changeemail-header' => "Cambiar l'adreça electronica del compte",
+'changeemail-no-info' => 'Vos cal èsser connectat per aver accès a aquesta pagina.',
+'changeemail-oldemail' => 'Adreça electronica actuala:',
+'changeemail-newemail' => 'Novela adreça electronica:',
+'changeemail-none' => '(pas cap)',
+'changeemail-submit' => "Cambiar l'adreça electronica:",
+'changeemail-cancel' => 'Anullar',
+
# Edit page toolbar
'bold_sample' => 'Tèxte en gras',
'bold_tip' => 'Tèxte en gras',
@@ -864,9 +873,6 @@ Notatz que podètz pas utilizar la foncionalitat "Mandar un messatge a aqueste u
Vòstra adreça IP actuala es $3, e lo numèro de blocatge es $5.
Precisatz aquestas indicacions dins totas las requèstas que faretz.',
'blockednoreason' => 'Cap de rason balhada',
-'blockedoriginalsource' => "Lo còde font de '''$1''' es indicat çaijós :",
-'blockededitsource' => "Lo contengut de '''vòstras modificacions''' aportadas a '''$1''' es indicat çaijós :",
-'whitelistedittitle' => 'Connexion necessària per modificar lo contengut',
'whitelistedittext' => 'Vos cal èsser $1 per modificar las paginas.',
'confirmedittext' => "Vos cal confirmar vòstra adreça electronica abans de modificar l'enciclopèdia. Picatz e validatz vòstra adreça electronica amb l'ajuda de la pagina [[Special:Preferences|preferéncias]].",
'nosuchsectiontitle' => 'Impossible de trobar la seccion',
@@ -935,7 +941,7 @@ Vos va caler aportar vòstras modificacions al tèxte existent.
'yourdiff' => 'Diferéncias',
'copyrightwarning' => "Totas las contribucions a {{SITENAME}} son consideradas coma publicadas jols tèrmes de la $2 (vejatz $1 per mai de detalhs). Se desiratz pas que vòstres escriches sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Nos prometètz tanben qu'avètz escrich aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura.'''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
'copyrightwarning2' => "Totas las contribucions a {{SITENAME}} pòdon èsser modificadas o suprimidas per d’autres utilizaires. Se desiratz pas que vòstres escriches sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Tanben nos prometètz qu'avètz escrich aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura. (vejatz $1 per mai de detalhs). '''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
-'longpageerror' => "'''ERROR : Lo tèxte qu'avètz mandat es de $1 Ko, e depassa doncas lo limit autorizat dels $2 Ko. Lo tèxte pòt pas èsser salvat.'''",
+'longpageerror' => "'''ERROR : Lo tèxte qu'avètz mandat fa $1 Ko, que depassa doncas lo limit autorizat dels $2 Ko. Pòt pas èsser salvat.'''",
'readonlywarning' => "'''AVERTIMENT : La banca de donadas es estada varrolhada per mantenença, doncas poiretz pas salvar vòstras modificacions ara.
Podètz copiar lo tèxte dins un fichièr de tèxte e lo salvar per mai tard.'''
@@ -1099,8 +1105,6 @@ D’autres administrators sus {{SITENAME}} poiràn totjorn accedir al contengut
'revdelete-unsuppress' => 'Levar las restriccions sus las versions restablidas',
'revdelete-log' => 'Motiu :',
'revdelete-submit' => 'Aplicar {{PLURAL:$1|a la version seleccionada|a las versions seleccionadas}}',
-'revdelete-logentry' => 'La visibilitat de la version es estada modificada per [[$1]]',
-'logdelete-logentry' => 'La visibilitat de l’eveniment es estada modificada per [[$1]]',
'revdelete-success' => "'''Visibilitat de las versions mesas a jorn amb succès.'''",
'revdelete-failure' => "'''La visibilitat de la revision a pas pogut èsser mesa a jorn :'''
$1",
@@ -1112,15 +1116,6 @@ $1",
'revdel-restore-visible' => 'revisions visiblas',
'pagehist' => 'Istoric de la pagina',
'deletedhist' => 'Istoric de las supressions',
-'revdelete-content' => 'contengut',
-'revdelete-summary' => 'modificar lo somari',
-'revdelete-uname' => 'nom d’utilizaire',
-'revdelete-restricted' => 'aplicar las restriccions als administrators',
-'revdelete-unrestricted' => 'restriccions levadas pels administrators',
-'revdelete-hid' => 'amagar $1',
-'revdelete-unhid' => 'afichar $1',
-'revdelete-log-message' => '$1 per $2 {{PLURAL:$2|revision|revisions}}',
-'logdelete-log-message' => '$1 sus $2 {{PLURAL:$2|eveniment|eveniments}}',
'revdelete-hide-current' => "Error al moment de la supression de l'element datat del $1 e $2 : es la revision correnta.
Pòt pas èsser suprimit.",
'revdelete-show-no-access' => "Error al moment de l'afichatge de l'element datat del $1 e $2 : es marcat coma « restrench ».
@@ -1276,12 +1271,14 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
'prefs-rc' => 'Darrièrs cambiaments',
'prefs-watchlist' => 'Lista de seguiment',
'prefs-watchlist-days' => "Nombre de jorns d'afichar dins la lista de seguiment :",
-'prefs-watchlist-days-max' => 'Maximum 7 jorns',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => "Nombre de modificacions d'afichar dins la lista de seguiment espandida :",
'prefs-watchlist-edits-max' => 'Nombre maximum : 1000',
'prefs-watchlist-token' => 'Geton per la lista de seguiment :',
'prefs-misc' => 'Preferéncias divèrsas',
'prefs-resetpass' => 'Modificar lo senhal',
+'prefs-changeemail' => "Cambiar l'adreça electronica:",
+'prefs-setemail' => 'Entrar una adreça electronica',
'prefs-email' => 'Opcions del corrièr electronic',
'prefs-rendering' => 'Aparéncia',
'saveprefs' => 'Enregistrar las preferéncias',
@@ -1473,13 +1470,13 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'right-autopatrol' => 'Aver sos cambiaments marcats automaticament coma verificats',
'right-patrolmarks' => 'Utilizar las foncionalitats de la patrolha dels darrièrs cambiaments',
'right-unwatchedpages' => 'Veire la tièra de las paginas pas seguidas',
-'right-trackback' => 'Apondre de retroligams',
'right-mergehistory' => 'Fusionar los istorics de las paginas',
'right-userrights' => "Modificar totes los dreches d'un utilizaire",
'right-userrights-interwiki' => "Modificar los dreches d'utilizaires que son sus un autre wiki",
'right-siteadmin' => 'Varrolhar e desvarrolhar la banca de donadas',
'right-override-export-depth' => 'Exportar las paginas en incluent las paginas ligadas fins a una prigondor de 5 nivèls',
'right-sendemail' => 'Mandar un corrièl als autres utilizaires',
+'right-passwordreset' => 'Tòrna inicializar lo senhal d’un utilizaire ([[Special:PasswordReset|pagina especiala]])',
# User rights log
'rightslog' => "Istoric de las modificacions d'estatut",
@@ -1517,7 +1514,6 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'action-patrol' => 'marcar la modificacion dels autres coma patrolhada',
'action-autopatrol' => 'aver vòstra modificacion marcada coma patrolhada',
'action-unwatchedpages' => 'veire la lista de las paginas pas susvelhadas',
-'action-trackback' => 'sometre un retroligam',
'action-mergehistory' => "fusionar l’istoric d'aquesta pagina",
'action-userrights' => 'modificar totes los dreches d’utilizaire',
'action-userrights-interwiki' => 'modificar los dreches d’utilizaire e los sus d’autres wikis',
@@ -2033,12 +2029,8 @@ Vejatz tanben [[Special:WantedCategories|las categorias demandadas]].',
'activeusers-noresult' => "Cap d'utilizaire pas trobat.",
# Special:Log/newusers
-'newuserlogpage' => 'Istoric de las creacions de comptes',
-'newuserlogpagetext' => "Jornal de las creacions de comptes d'utilizaires.",
-'newuserlog-byemail' => 'senhal mandat per corrièr electronic',
-'newuserlog-create-entry' => 'Utilizaire novèl',
-'newuserlog-create2-entry' => 'a creat lo compte novèl $1',
-'newuserlog-autocreate-entry' => 'Compte creat automaticament',
+'newuserlogpage' => 'Istoric de las creacions de comptes',
+'newuserlogpagetext' => "Jornal de las creacions de comptes d'utilizaires.",
# Special:ListGroupRights
'listgrouprights' => "Dreches dels gropes d'utilizaires",
@@ -2181,8 +2173,6 @@ Confirmatz qu'es plan çò que volètz far, que ne comprenètz las consequéncia
'actionfailed' => 'L’accion a fracassat',
'deletedtext' => '"$1" es estat suprimit.
Vejatz $2 per una lista de las supressions recentas.',
-'deletedarticle' => 'a escafat «[[$1]]»',
-'suppressedarticle' => 'amagat « [[$1]] »',
'dellogpage' => 'Istoric dels escafaments',
'dellogpagetext' => 'Vaquí çaijós la lista de las supressions recentas.',
'deletionlog' => 'istoric dels escafaments',
@@ -2248,6 +2238,7 @@ Clicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi en
'protect-level-sysop' => 'Administrators unicament',
'protect-summary-cascade' => 'proteccion en cascada',
'protect-expiring' => 'expira lo $1',
+'protect-expiring-local' => 'expira lo $1',
'protect-expiry-indefinite' => 'indefinit',
'protect-cascade' => 'Proteccion en cascada - Protegís totas las paginas enclusas dins aquesta.',
'protect-cantedit' => "Podètz pas modificar los nivèls de proteccion d'aquesta pagina perque avètz pas la permission de l'editar.",
@@ -2306,7 +2297,6 @@ S'una pagina novèla amb lo meteis nom es estada creada dempuèi la supression,
'undeletereset' => 'Reïnicializar',
'undeleteinvert' => 'Inversar la seleccion',
'undeletecomment' => 'Motiu :',
-'undeletedarticle' => 'a restablit « [[$1]] »',
'undeletedrevisions' => '{{PLURAL:$1|1 revision restablida|$1 revisions restablidas}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revision|$1 revisions}} e {{PLURAL:$2|1 fichièr restablit|$2 fichièrs restablits}}',
'undeletedfiles' => '$1 {{PLURAL:$1|fichièr restablit|fichièrs restablits}}',
@@ -2450,6 +2440,7 @@ a partir d'una adreça IP precedentament blocada.",
'unblocklink' => 'desblocar',
'change-blocklink' => 'modificar lo blocatge',
'contribslink' => 'contribucions',
+'emaillink' => 'mandar un messatge',
'autoblocker' => 'Sètz estat autoblocat perque partejatz una adreça IP amb "[[User:$1|$1]]".
La rason balhada per $1 es : « $2 ».',
'blocklogpage' => 'Istoric dels blocatges',
@@ -2555,9 +2546,6 @@ jol nom novèl. Se vos plai, fusionatz-las manualament.",
'movepage-page-moved' => 'La pagina $1 es estada renomenada en $2.',
'movepage-page-unmoved' => 'La pagina $1 pòt èsser renomenada en $2.',
'movepage-max-pages' => "Lo maximum de $1 {{PLURAL:$1|pagina es estada renomenada|paginas son estadas renomenadas}} e cap d'autra o poirà pas èsser automaticament.",
-'1movedto2' => 'a renomenat [[$1]] en [[$2]]',
-'1movedto2_redir' => 'a redirigit [[$1]] cap a [[$2]]',
-'move-redirect-suppressed' => 'redireccion suprimida',
'movelogpage' => 'Istoric dels cambiaments de nom',
'movelogpagetext' => 'Vaquí la lista de las darrièras paginas renomenadas.',
'movesubpage' => '{{PLURAL:$1|Sospagina|Sospaginas}}',
@@ -2824,9 +2812,6 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
# Patrol log
'patrol-log-page' => 'Istoric de las versions patrolhadas',
'patrol-log-header' => 'Vaquí un jornal de las versions patrolhadas.',
-'patrol-log-line' => 'a marcat la version $1 de $2 coma verificada $3',
-'patrol-log-auto' => '(automatic)',
-'patrol-log-diff' => 'v$1',
'log-show-hide-patrol' => "$1 l'istoric de las versions patrolhadas",
# Image deletion
@@ -2852,7 +2837,7 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|paginas}}',
'file-info' => 'Talha del fichièr: $1, tipe MIME: $2',
'file-info-size' => '$1 × $2 pixèl, talha del fichièr: $3, tipe MIME: $4',
-'file-nohires' => '<small>Pas de resolucion mai nauta disponibla.</small>',
+'file-nohires' => 'Pas de resolucion mai nauta disponibla.',
'svg-long-desc' => 'Fichièr SVG, resolucion de $1 × $2 pixèls, talha : $3',
'show-big-image' => 'Imatge en resolucion mai nauta',
'file-info-gif-looped' => 'en bocla',
@@ -3244,13 +3229,6 @@ Aqueste còde de confirmacion expirarà lo $4.",
'scarytranscludefailed' => '[La recuperacion de modèl a pas capitat per $1]',
'scarytranscludetoolong' => '[L’URL es tròp longa]',
-# Trackbacks
-'trackbackbox' => 'Retroligams cap a aquesta pagina :<br />
-$1',
-'trackbackremove' => '([$1 Suprimir])',
-'trackbacklink' => 'Retroligam',
-'trackbackdeleteok' => 'Lo retroligam es estat suprimit amb succès.',
-
# Delete conflict
'deletedwhileediting' => "'''Atencion''' : aquesta pagina es estada suprimida aprèp qu'avètz començat de la modificar !",
'confirmrecreate' => "L'utilizaire [[User:$1|$1]] ([[User talk:$1|talk]]) a suprimit aquesta pagina, alara que l'aviatz començat d'editar, pel motiu seguent:
@@ -3450,4 +3428,9 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
'htmlform-reset' => 'Desfar las modificacions',
'htmlform-selectorother-other' => 'Autre',
+# New logging system
+'revdelete-restricted' => 'aplicar las restriccions als administrators',
+'revdelete-unrestricted' => 'restriccions levadas pels administrators',
+'newuserlog-byemail' => 'senhal mandat per corrièr electronic',
+
);
diff --git a/languages/messages/MessagesOm.php b/languages/messages/MessagesOm.php
index e7c938b6..2d6516a6 100644
--- a/languages/messages/MessagesOm.php
+++ b/languages/messages/MessagesOm.php
@@ -7,6 +7,8 @@
* @ingroup Language
* @file
*
+ * @author Diroma Elias (on om.wikipedia.org)
+ * @author Johannes Rohr (on om.wikipedia.org)
* @author Malafaya
* @author Node ue
*/
diff --git a/languages/messages/MessagesOr.php b/languages/messages/MessagesOr.php
index b557ebf6..43c44aa2 100644
--- a/languages/messages/MessagesOr.php
+++ b/languages/messages/MessagesOr.php
@@ -40,17 +40,17 @@ $namespaceNames = array(
NS_MEDIA => 'ମାଧà­à­Ÿà¬®',
NS_SPECIAL => 'ବିଶେଷ',
NS_TALK => 'ଆଲୋଚନା',
- NS_USER => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€',
- NS_USER_TALK => 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•_ଆଲୋଚନା',
- NS_PROJECT_TALK => 'ଉଇକିପିଡ଼ିଆ_ଆଲୋଚନା',
+ NS_USER => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€',
+ NS_USER_TALK => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•_ଆଲୋଚନା',
+ NS_PROJECT_TALK => '$1_ଆଲୋଚନା',
NS_FILE => 'ଫାଇଲ',
NS_FILE_TALK => 'ଫାଇଲ_ଆଲୋଚନା',
NS_MEDIAWIKI => 'ମିଡ଼ିଆଉଇକି',
NS_MEDIAWIKI_TALK => 'ମିଡ଼ିଆଉଇକି_ଆଲୋଚନା',
- NS_TEMPLATE => 'ଟେମà­à¬ªà¬²à­‡à¬Ÿ',
- NS_TEMPLATE_TALK => 'ଟେମà­à¬ªà¬²à­‡à¬Ÿ_ଆଲୋଚନା',
- NS_HELP => 'ସାହାଯà­à­Ÿ',
- NS_HELP_TALK => 'ସାହାଯà­à­Ÿ_ଆଲୋଚନା',
+ NS_TEMPLATE => 'ଛାଞà­à¬š',
+ NS_TEMPLATE_TALK => 'ଛାଞà­à¬š_ଆଲୋଚନା',
+ NS_HELP => 'ସହଯୋଗ',
+ NS_HELP_TALK => 'ସହଯୋଗ_ଆଲୋଚନା',
NS_CATEGORY => 'ଶà­à¬°à­‡à¬£à­€',
NS_CATEGORY_TALK => 'ଶà­à¬°à­‡à¬£à­€_ଆଲୋଚନା',
);
@@ -58,14 +58,21 @@ $namespaceNames = array(
$namespaceAliases = array(
'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à¬¿' => NS_USER,
'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à¬¿à¬à¬•_ଆଲୋଚନା' => NS_USER_TALK,
+ 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€' => NS_USER,
+ 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•_ଆଲୋଚନା' => NS_USER_TALK,
+ 'ଉଇକିପିଡ଼ିଆ_ଆଲୋଚନା' => NS_PROJECT_TALK,
'ଟେà¬à¬ªà¬²à­‡à¬Ÿ' => NS_TEMPLATE,
'ଟେà¬à¬ªà¬²à­‡à¬Ÿ_ଆଲୋଚନା' => NS_TEMPLATE_TALK,
+ 'ଟେମà­à¬ªà¬²à­‡à¬Ÿ' => NS_TEMPLATE,
+ 'ଟେମà­à¬ªà¬²à­‡à¬Ÿ_ଆଲୋଚନା' => NS_TEMPLATE_TALK,
'ବିଭାଗ' => NS_CATEGORY,
'ବିଭାଗିୟ_ଆଲୋଚନା' => NS_CATEGORY_TALK,
+ 'ସାହାଯà­à­Ÿ' => NS_HELP,
+ 'ସାହାଯà­à­Ÿ_ଆଲୋଚନା' => NS_HELP_TALK,
);
$specialPageAliases = array(
- 'Activeusers' => array( 'ସଚଳ_ଇଉଜର' ),
+ 'Activeusers' => array( 'ସଚଳ_ସଭà­à­Ÿ' ),
'Allmessages' => array( 'ସବà­_ମେସେଜ' ),
'Allpages' => array( 'ସବà­_ପୃଷà­à¬ à¬¾' ),
'Ancientpages' => array( 'ପà­à¬°à­à¬£à¬¾_' ),
@@ -77,7 +84,7 @@ $specialPageAliases = array(
'Categories' => array( 'ଶà­à¬°à­‡à¬£à­€' ),
'ChangeEmail' => array( 'ଇମେଲ_ବଦଳାଇବେ' ),
'ChangePassword' => array( 'ପାସବାରà­à¬¡à¬¼_ବଦଳାଇବେ' ),
- 'ComparePages' => array( 'ପୃଷà­à¬ à¬¾à¬•à­_ତଉଲ' ),
+ 'ComparePages' => array( 'ପୃଷà­à¬ à¬¾à¬•à­_ତଉଲିବେ' ),
'Confirmemail' => array( 'ଇମେଲ_ଥୟ_କରିବେ' ),
'Contributions' => array( 'ଅବଦାନ' ),
'CreateAccount' => array( 'ଖାତା_ଖୋଲିବେ' ),
@@ -110,13 +117,13 @@ $specialPageAliases = array(
'Mostimages' => array( 'ଅଧିକ_ଯୋଡ଼ା_ଫାଇଲ' ),
'Mostlinked' => array( 'ଅଧିକ_ଯୋଡ଼ା_ପୃଷà­à¬ à¬¾' ),
'Mostlinkedcategories' => array( 'ଅଧିକ_ଯୋଡ଼ା_ଶà­à¬°à­‡à¬£à­€' ),
- 'Mostlinkedtemplates' => array( 'ଅଧିକ_ଯୋଡ଼ା_ଟେମà­à¬ªà¬²à­‡à¬Ÿ' ),
- 'Mostrevisions' => array( 'ବେଶି_ସଙà­à¬•à¬³à¬¨' ),
+ 'Mostlinkedtemplates' => array( 'ଅଧିକ_ଯୋଡ଼ା_ଛାଞà­à¬š' ),
+ 'Mostrevisions' => array( 'ଅଧିକ_ସଙà­à¬•à¬³à¬¨' ),
'Movepage' => array( 'ପୃଷà­à¬ à¬¾à¬•à­_ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾' ),
'Mycontributions' => array( 'ମୋ_ଅବଦାନ' ),
'Mypage' => array( 'ମୋ_ପୃଷà­à¬ à¬¾' ),
'Mytalk' => array( 'ମୋ_ଆଲୋଚନା' ),
- 'Myuploads' => array( 'ମୋ_ଅପଲୋଡ' ),
+ 'Myuploads' => array( 'ମୋ_ଅପଲୋଡ଼' ),
'Newimages' => array( 'ନୂଆ_ଫାଇଲ' ),
'Newpages' => array( 'ନୂଆ_ପୃଷà­à¬ à¬¾' ),
'PermanentLink' => array( 'ଚିରକାଳର_ଲିଙà­à¬•' ),
@@ -126,123 +133,125 @@ $specialPageAliases = array(
'Protectedpages' => array( 'କିଳାଯାଇଥିବା_ପୃଷà­à¬ à¬¾' ),
'Protectedtitles' => array( 'କିଳାଯାଇଥିବା_ନାଆà¬' ),
'Randompage' => array( 'ଇଆଡà­_ଇଆଡà­' ),
- 'Randomredirect' => array( 'ଜାହିତାହି_ଫେରଣା' ),
+ 'Randomredirect' => array( 'ଜାହିତାହି_ଫେରଣାଲେଉଟାଣି' ),
'Recentchanges' => array( 'ନଗଦ_ବଦଳ' ),
'Recentchangeslinked' => array( 'ଜୋଡ଼ାଥିବା_ନଗଦ_ବଦଳ' ),
- 'Revisiondelete' => array( 'ସଙà­à¬•à¬³à¬¨à¬²à¬¿à¬­à¬¾à¬‡à¬¦à¬¿à¬…' ),
+ 'Revisiondelete' => array( 'ସଙà­à¬•à¬³à¬¨à¬²à¬¿à¬­à¬¾à¬‡à¬¦à¬¿à¬…ଦେବେ' ),
'RevisionMove' => array( 'ସଙà­à¬•à¬³à¬¨' ),
'Search' => array( 'ଖୋଜନà­à¬¤à­' ),
'Shortpages' => array( 'ଛୋଟ_ପୃଷà­à¬ à¬¾' ),
'Specialpages' => array( 'ବିଶେଷ_ପୃଷà­à¬ à¬¾' ),
'Statistics' => array( 'ଗଣନା' ),
- 'Tags' => array( 'ଟାଗ' ),
- 'Unblock' => array( 'ଫିଟାଇଦିଅ' ),
+ 'Tags' => array( 'ଚିହà­à¬¨à¬¸à¬®à­‚ହ' ),
+ 'Unblock' => array( 'ଫିଟାଇଦେବେ' ),
'Uncategorizedcategories' => array( 'ଅସଜଡ଼ା_ଶà­à¬°à­‡à¬£à­€' ),
'Uncategorizedimages' => array( 'ସଜଡ଼ା_ଶà­à¬°à­‡à¬£à­€à¬°_ଫାଇଲ' ),
'Uncategorizedpages' => array( 'ଅସଜଡ଼ା_ଫାଇଲସବà­' ),
- 'Uncategorizedtemplates' => array( 'ଅସଜଡ଼ା_ଟେମà­à¬ªà¬²à­‡à¬Ÿ' ),
- 'Undelete' => array( 'ଲିଭାଅ_ନାହିà¬' ),
+ 'Uncategorizedtemplates' => array( 'ଅସଜଡ଼ା_ଛାଞà­à¬š' ),
+ 'Undelete' => array( 'ଲିଭାନà­à¬¤à­_ନାହିà¬' ),
'Unlockdb' => array( 'DBଖୋଲିବା' ),
'Unusedcategories' => array( 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°_ହୋଇନଥିବା_ଶà­à¬°à­‡à¬£à­€' ),
'Unusedimages' => array( 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°_ହୋଇନଥିବା_ଫାଇଲ' ),
- 'Unusedtemplates' => array( 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°_ହୋଇନଥିବା_ଟେମà­à¬ªà¬²à­‡à¬Ÿ' ),
+ 'Unusedtemplates' => array( 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°_ହୋଇନଥିବା_ଛାଞà­à¬š' ),
'Unwatchedpages' => array( 'ଦେଖାଯାଇନଥିବା_ପୃଷà­à¬ à¬¾à¬¸à¬¬à­' ),
'Upload' => array( 'ଅପଲୋଡ଼' ),
'UploadStash' => array( 'ଷà­à¬Ÿà¬¾à¬¸_ଅପଲୋଡ଼_କରନà­à¬¤à­' ),
- 'Userlogin' => array( 'ଇଉଜର_ଲଗ_ଇନ' ),
- 'Userlogout' => array( 'ଇଉଜର_ଲଗ_ଆଉଟ' ),
- 'Userrights' => array( 'ଇଉଜର_ଅଧିକାର' ),
- 'Version' => array( 'ଭରସନ' ),
+ 'Userlogin' => array( 'ସଭà­à­Ÿ_ଲଗ_ଇନ' ),
+ 'Userlogout' => array( 'ସଭà­à­Ÿ_ଲଗ_ଆଉଟ' ),
+ 'Userrights' => array( 'ସଭà­à­Ÿ_ଅଧିକାର' ),
+ 'Version' => array( 'ସଂସà­à¬•à¬°à¬£' ),
'Wantedcategories' => array( 'ଦରକାରି_ଶà­à¬°à­‡à¬£à­€' ),
'Wantedfiles' => array( 'ଦରକାରି_ଫାଇଲ' ),
'Wantedpages' => array( 'ଦରକାରି_ପୃଷà­à¬ à¬¾' ),
- 'Wantedtemplates' => array( 'ଦରକାରି_ଟେମà­à¬ªà¬²à­‡à¬Ÿ' ),
+ 'Wantedtemplates' => array( 'ଦରକାରି_ଛାଞà­à¬š' ),
'Watchlist' => array( 'ଦେଖଣା_ତାଲିକା' ),
- 'Whatlinkshere' => array( 'à¬à¬ à¬¾à¬°à­‡_କଣ_ଲିà¬à¬•_ଅଛି' ),
+ 'Whatlinkshere' => array( 'à¬à¬ à¬¾à¬°à­‡_କଣ_ଲିଙà­à¬•_ଅଛି' ),
'Withoutinterwiki' => array( 'ଇଣà­à¬Ÿà¬°à¬‰à¬‡à¬•à¬¿_ବିନା' ),
);
$magicWords = array(
- 'redirect' => array( '0', '#ଲେଉଟାଣି', '#REDIRECT' ),
- 'noeditsection' => array( '0', '_ବଦଳା_ନହେବାଶà­à¬°à­‡à¬£à­€_', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ', 'à¬à¬¬à­‡à¬°_ମାସ୨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'à¬à¬¬à­‡à¬°_ମାସ', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ_ନାଆà¬', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ_ନାଆà¬_ସାଧାରଣ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ_ନାଆà¬_ସଂକà­à¬·à¬¿à¬ªà­à¬¤', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଦିନ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଦିନ୨', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଦିନ_ନାଆà¬', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ବରà­à¬·', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ସମୟ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଘଣà­à¬Ÿà¬¾', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'à¬à¬¬à­‡à¬°_ମାସ୧', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ମାସ୨', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ୧', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ମାସ୧ର_ନାଆà¬', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ମାସ୧_ନାଆà¬_ସାଧାରଣ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ମାସର୧_ନାଆà¬_ସଂକà­à¬·à¬¿à¬ªà­à¬¤', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'Local_ଦିନ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ଦିନ୨', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ଦିନ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ବରà­à¬·', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ସମୟ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ଘଣà­à¬Ÿà¬¾', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ପୃଷà­à¬ à¬¾_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ଲେଖା_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ଫାଇଲ_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ସଚଳ_ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ବଦଳ_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'କେତେଥର_ଦେଖାଯାଇଛି', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ପୃଷà­à¬ à¬¾_ନାଆà¬', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ପୃଷà­à¬ à¬¾_ନାମକାରଣକାରୀ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ନେମସà­à¬ªà­‡à¬¸', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ନେମସà­à¬ªà­‡à¬¸à¬•à¬¾à¬°à­€', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ଟକସà­à¬ªà­‡à¬¸', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ଟକସà­à¬ªà­‡à¬¸à¬•à¬¾à¬°à­€', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ବିଷୟସà­à¬ªà­‡à¬¸', 'ଲେଖାସà­à¬ªà­‡à¬¸', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'msg' => array( '0', 'ମେସେଜ:', 'MSG:' ),
- 'img_manualthumb' => array( '1', 'ନଖଦେଖଣା=$1', 'ଦେଖଣା=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'ଡାହାଣ', 'right' ),
- 'img_left' => array( '1', 'ବାଆà¬', 'left' ),
- 'img_none' => array( '1', 'କିଛି_ନà­à¬¹à­‡à¬', 'none' ),
- 'img_width' => array( '1', '$1_ପିକସେଲ', '$1px' ),
- 'img_center' => array( '1', 'କେନà­à¬¦à­à¬°', 'center', 'centre' ),
- 'img_framed' => array( '1', 'ଫà­à¬°à­‡à¬®à¬•à¬°à¬¾', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'ଫà­à¬°à­‡à¬®à¬¨à¬¥à¬¿à¬¬à¬¾', 'frameless' ),
- 'img_border' => array( '1', 'ବରà­à¬¡à¬°', 'border' ),
- 'img_baseline' => array( '1', 'ବେସଲାଇନ', 'baseline' ),
- 'img_top' => array( '1', 'ଉପର', 'top' ),
- 'img_text_top' => array( '1', 'ଲେଖା-ଉପର', 'text-top' ),
- 'img_middle' => array( '1', 'ମà¬à¬¿', 'middle' ),
- 'img_bottom' => array( '1', 'ତଳ', 'bottom' ),
- 'img_text_bottom' => array( '1', 'ଲେଖା-ତଳ', 'text-bottom' ),
- 'img_link' => array( '1', 'ଲିଙà­à¬•=$1', 'link=$1' ),
- 'articlepath' => array( '0', 'ଲେଖାର_ପଥ', 'ARTICLEPATH' ),
- 'server' => array( '0', 'ସରà­à¬­à¬°', 'SERVER' ),
- 'grammar' => array( '0', 'ବà­à­Ÿà¬¾à¬•à¬°à¬£', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ଲିଙà­à¬—', 'GENDER:' ),
- 'plural' => array( '0', 'ବହà­à¬¬à¬šà¬¨:', 'PLURAL:' ),
- 'raw' => array( '0', 'କଞà­à¬šà¬¾', 'RAW:' ),
- 'displaytitle' => array( '1', 'ଦେଖଣାନାଆà¬', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '_ନୂଆବିଭାଗଲିଙà­à¬•_', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '_ନୂଆ_ବିଭାଗ_ନକରିବା_ଲିଙà­à¬•_', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ନଗଦ_ରିଭିଜନ', 'CURRENTVERSION' ),
- 'numberofadmins' => array( '1', 'ପରିଛାମାନଙà­à¬•à¬¤à¬¾à¬²à¬¿à¬•à¬¾', 'NUMBEROFADMINS' ),
- 'padleft' => array( '0', 'ବାଆà¬à¬ªà­à­Ÿà¬¾à¬¡à¬¼', 'PADLEFT' ),
- 'padright' => array( '0', 'ଡାହାଣପà­à­Ÿà¬¾à¬¡à¬¼', 'PADRIGHT' ),
- 'special' => array( '0', 'ବିଶେଷ', 'special' ),
- 'filepath' => array( '0', 'ଫାଇଲରାହା:', 'FILEPATH:' ),
- 'tag' => array( '0', 'ଟାଗ', 'tag' ),
- 'hiddencat' => array( '1', '_ଲà­à¬šà¬¿à¬¥à¬¿à¬¬à¬¾à¬¬à¬¿à¬­à¬¾à¬—_', '__HIDDENCAT__' ),
- 'pagesize' => array( '1', 'ଫରଦଆକାର', 'PAGESIZE' ),
- 'protectionlevel' => array( '1', 'ପà­à¬°à¬¤à¬¿à¬°à¬•à­à¬·à¬¾à¬¸à­à¬¤à¬°', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'ତାରିଖରପà­à¬°à¬•à¬¾à¬°', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'ବାଟ', 'PATH' ),
- 'url_wiki' => array( '0', 'ଉଇକି', 'WIKI' ),
- 'url_query' => array( '0', 'ପà­à¬°à¬¶à­à¬¨', 'QUERY' ),
+ 'redirect' => array( '0', '#ଲେଉଟାଣି', '#REDIRECT' ),
+ 'noeditsection' => array( '0', '_ବଦଳା_ନହେବାଶà­à¬°à­‡à¬£à­€_', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ', 'à¬à¬¬à­‡à¬°_ମାସ୨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'à¬à¬¬à­‡à¬°_ମାସ', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ_ନାଆà¬', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ_ନାଆà¬_ସାଧାରଣ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ_ନାଆà¬_ସଂକà­à¬·à¬¿à¬ªà­à¬¤', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଦିନ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଦିନ୨', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଦିନ_ନାଆà¬', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ବରà­à¬·', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ସମୟ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ଘଣà­à¬Ÿà¬¾', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'à¬à¬¬à­‡à¬°_ମାସ୧', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ମାସ୨', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'à¬à¬¬à­‡à¬•à¬¾à¬°_ମାସ୧', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ମାସ୧ର_ନାଆà¬', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ମାସ୧_ନାଆà¬_ସାଧାରଣ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ମାସର୧_ନାଆà¬_ସଂକà­à¬·à¬¿à¬ªà­à¬¤', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'Local_ଦିନ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ଦିନ୨', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ଦିନ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ବରà­à¬·', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ସମୟ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ_ଘଣà­à¬Ÿà¬¾', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ପୃଷà­à¬ à¬¾_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ଲେଖା_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ଫାଇଲ_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ସଚଳ_ବà­à­Ÿà¬¬à¬¾à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬•_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ବଦଳ_ସଂଖà­à­Ÿà¬¾', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'କେତେଥର_ଦେଖାଯାଇଛି', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ପୃଷà­à¬ à¬¾_ନାଆà¬', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ପୃଷà­à¬ à¬¾_ନାମକାରଣକାରୀ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ନେମସà­à¬ªà­‡à¬¸', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ନେମସà­à¬ªà­‡à¬¸à¬•à¬¾à¬°à­€', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ଟକସà­à¬ªà­‡à¬¸', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ଟକସà­à¬ªà­‡à¬¸à¬•à¬¾à¬°à­€', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ବିଷୟସà­à¬ªà­‡à¬¸', 'ଲେଖାସà­à¬ªà­‡à¬¸', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'msg' => array( '0', 'ମେସେଜ:', 'MSG:' ),
+ 'img_manualthumb' => array( '1', 'ନଖଦେଖଣା=$1', 'ଦେଖଣା=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'ଡାହାଣ', 'right' ),
+ 'img_left' => array( '1', 'ବାଆà¬', 'left' ),
+ 'img_none' => array( '1', 'କିଛି_ନà­à¬¹à­‡à¬', 'none' ),
+ 'img_width' => array( '1', '$1_ପିକସେଲ', '$1px' ),
+ 'img_center' => array( '1', 'କେନà­à¬¦à­à¬°', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'ଫà­à¬°à­‡à¬®à¬•à¬°à¬¾', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'ଫà­à¬°à­‡à¬®à¬¨à¬¥à¬¿à¬¬à¬¾', 'frameless' ),
+ 'img_border' => array( '1', 'ବରà­à¬¡à¬°', 'border' ),
+ 'img_baseline' => array( '1', 'ବେସଲାଇନ', 'baseline' ),
+ 'img_top' => array( '1', 'ଉପର', 'top' ),
+ 'img_text_top' => array( '1', 'ଲେଖା-ଉପର', 'text-top' ),
+ 'img_middle' => array( '1', 'ମà¬à¬¿', 'middle' ),
+ 'img_bottom' => array( '1', 'ତଳ', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'ଲେଖା-ତଳ', 'text-bottom' ),
+ 'img_link' => array( '1', 'ଲିଙà­à¬•=$1', 'link=$1' ),
+ 'articlepath' => array( '0', 'ଲେଖାର_ପଥ', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'ସରà­à¬­à¬°', 'SERVER' ),
+ 'grammar' => array( '0', 'ବà­à­Ÿà¬¾à¬•à¬°à¬£', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ଲିଙà­à¬—', 'GENDER:' ),
+ 'plural' => array( '0', 'ବହà­à¬¬à¬šà¬¨:', 'PLURAL:' ),
+ 'raw' => array( '0', 'କଞà­à¬šà¬¾', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ଦେଖଣାନାଆà¬', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '_ନୂଆବିଭାଗଲିଙà­à¬•_', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '_ନୂଆ_ବିଭାଗ_ନକରିବା_ଲିଙà­à¬•_', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ନଗଦ_ରିଭିଜନ', 'CURRENTVERSION' ),
+ 'numberofadmins' => array( '1', 'ପରିଛାମାନଙà­à¬•à¬¤à¬¾à¬²à¬¿à¬•à¬¾', 'NUMBEROFADMINS' ),
+ 'padleft' => array( '0', 'ବାଆà¬à¬ªà­à­Ÿà¬¾à¬¡à¬¼', 'PADLEFT' ),
+ 'padright' => array( '0', 'ଡାହାଣପà­à­Ÿà¬¾à¬¡à¬¼', 'PADRIGHT' ),
+ 'special' => array( '0', 'ବିଶେଷ', 'special' ),
+ 'filepath' => array( '0', 'ଫାଇଲରାହା:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'ଟାଗ', 'tag' ),
+ 'hiddencat' => array( '1', '_ଲà­à¬šà¬¿à¬¥à¬¿à¬¬à¬¾à¬¬à¬¿à¬­à¬¾à¬—_', '__HIDDENCAT__' ),
+ 'pagesize' => array( '1', 'ଫରଦଆକାର', 'PAGESIZE' ),
+ 'protectionlevel' => array( '1', 'ପà­à¬°à¬¤à¬¿à¬°à¬•à­à¬·à¬¾à¬¸à­à¬¤à¬°', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'ତାରିଖରପà­à¬°à¬•à¬¾à¬°', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ବାଟ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ଉଇକି', 'WIKI' ),
+ 'url_query' => array( '0', 'ପà­à¬°à¬¶à­à¬¨', 'QUERY' ),
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'ତଳେ ଥିବା ଲିଙà­à¬•:',
@@ -599,23 +608,25 @@ $1',
'formerror' => 'ଭà­à¬²: ଫରà­à¬®à¬Ÿà¬¿ ପଠାଇ ପାରିଲà­à¬ ନାହିà¬',
'badarticleerror' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ à¬à¬¹à¬¿ କାମଟି ହୋଇପାରିବ ନାହିଠ।',
'cannotdelete' => '"$1" ପୃଷà­à¬ à¬¾ ବା ଫାଇଲଟି ଲିଭାଯାଇପାରିବ ନାହିଠ। à¬à¬¹à¬¾ ଆଗରୠକାହା ଦେଇ ବୋଧେ ଲିଭାଇ ଦିଆଯାଇଛି ।',
+'cannotdelete-title' => '"$1" ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭଯାଇପାରିବ ନାହିà¬',
'badtitle' => 'ଖରାପ ନାଆà¬',
'badtitletext' => 'ଆପଣ ଅନà­à¬°à­‹à¬§ କରିଥିବା ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଭà­à¬², ଖାଲି ଅଛି ବା ବାକି ଭାଷା ସାଙà­à¬—ରେ ଭà­à¬²à¬°à­‡ ଯୋଡ଼ା ଯାଇଛି ବା ଭà­à¬² ଇଣà­à¬Ÿà¬° ଉଇକି ନାମ ଦିଆଯାଇଛି ।
à¬à¬¥à¬¿à¬°à­‡ ଥିବା ଗୋଟିଠବା ଦà­à¬‡à¬Ÿà¬¿ ଅକà­à¬·à¬° ଶିରୋନାମା ଭାବରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇ ପାରିବ ନାହିଠ।',
-'perfcached' => 'ତଳଲିଖିତ ତଥà­à­Ÿà¬Ÿà¬¿ ଆଗରୠରହିଥିବା ତଥà­à­Ÿ, ତେଣୠନଗଦ ହୋଇନପାରେ ।',
-'perfcachedts' => 'ତଳଲିଖିତ ତଥà­à­Ÿ ଆଗରୠଥିବା ତଥà­à­Ÿ ଓ $1ରେ ଶେଷଥର ଅପଡେଟ ହୋଇଥିଲା ।',
+'perfcached' => 'ତଳଲିଖିତ ତଥà­à­Ÿà¬Ÿà¬¿ ଆଗରୠରହିଥିବା ତଥà­à­Ÿ, ତେଣୠନଗଦ ହୋଇନପାରେ । A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ତଳଲିଖିତ ତଥà­à­Ÿ ଆଗରୠଥିବା ତଥà­à­Ÿ ଓ $1ରେ ଶେଷଥର ଅପଡେଟ ହୋଇଥିଲା । A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ପାଇଠଅପଡେଟସବୠà¬à¬¬à­‡ ଅଚଳ କରାଯାଇଅଛି ।
à¬à¬ à¬¾à¬°à­‡ ଥିବା ତଥà­à­Ÿ ସବୠà¬à¬¬à­‡ ସତେଜ ହୋଇପାରିବ ନାହିଠ।',
'wrong_wfQuery_params' => 'wfQuery() ପାଇଠଭà­à¬² ପାରାମିଟର<br />
କାମ: $1<br />
ଖୋଜା ପà­à¬°à¬¶à­à¬¨: $2',
'viewsource' => 'ଉତà­à¬¸ ଦେଖିବେ',
-'viewsourcefor' => '$1 ନିମନà­à¬¤à­‡',
+'viewsource-title' => '$1 ନିମନà­à¬¤à­‡ ଆଧାର ଦେଖିବେ',
'actionthrottled' => 'କାମଟି ବନà­à¬¦ କରିଦିଆଗଲା',
'actionthrottledtext' => 'ସà­à¬ªà¬¾à¬®à¬•à­ ବନà­à¬¦ କରିବା ନିମନà­à¬¤à­‡ à¬à¬• ଅଳà­à¬ª ସମୟ ବିରତି ଭିତରେ ଆପଣଙà­à¬•à­ à¬à¬¹à¬¿ କାମଟୀ ବାରମà­à¬¬à¬¾à¬° କରିବାକୠଅନà­à¬®à¬¤à¬¿ ଦିଆଯାଉନାହିଠଓ ଆପଣ ସୀମା ପାର କରିଯାଇଛନà­à¬¤à¬¿ ।
ଦୟାକରି କିଛି ସମୟ ପରେ ଚେଷà­à¬Ÿà¬¾ କରନà­à¬¤à­ ।',
'protectedpagetext' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିବାରୠକିଳାଯାଇଛି ।',
'viewsourcetext' => 'ଆପଣ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬° ଲେଖା ଦେଖିପାରିବେ ଓ ନକଲ କରିପାରିବେ:',
+'viewyourtext' => "ଆପଣ '''ଆପଣଙà­à¬• ସମà­à¬ªà¬¾à¬¦à¬¿à¬¤ ''' ଅଧରଟିକୠଦେଖିପାରିବେ ଓ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬•à­ ନକଲ କରି ପାରିବେ",
'protectedinterface' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ସଫà­à¬Ÿà¬¬à­‡à¬° ନିମନà­à¬¤à­‡ ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸ ଲେଖା ଯୋଗାଇଥାଠଓ à¬à¬¹à¬¾ ଅବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à­ ରୋକିବା ନିମନà­à¬¤à­‡ କିଳାଯାଇଅଛି ।',
'editinginterface' => "'''ଚେତାବନୀ:''' ଆପଣ ସଫà­à¬Ÿà¬¬à­‡à¬°à¬° ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸ ଲେଖା ଯୋଗାଇବା ନିମନà­à¬¤à­‡ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଉଥିବା à¬à¬• ପୃଷà­à¬ à¬¾à¬° ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରà­à¬…ଛନà­à¬¤à¬¿ ।
à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬° କିଛି ବି ବଦଳ ବାକି ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬• ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸à¬° ଦେଖଣାକୠପà­à¬°à¬­à¬¾à¬¬à¬¿à¬¤ କରିବ ।
@@ -725,6 +736,7 @@ continue using your old password.',
'emailconfirmlink' => 'ଆପଣଙà­à¬• ଇମେଲ ଆଇ.ଡି.ଟି ଠିକ ବୋଲି ଥୟ କରନà­à¬¤à­',
'invalidemailaddress' => 'à¬à¬¹à¬¿ ଇ-ମେଲ ଠିକଣାଟି ସଠିକ ସଜାଣିରେ ନଥିବାରୠà¬à¬¹à¬¾à¬•à­ ଗà­à¬°à¬¹à¬£ କରାଯାଇପାରିବ ନାହିଠ।
ଦୟାକରି à¬à¬• ସଚଳ ଓ ଠିକ ସଜାଣିରେ ଥିବା ଇ-ମେଲ ଠିକଣା ଦିଅନà­à¬¤à­ ।',
+'cannotchangeemail' => 'ଖାତାରେ ଥିବା ଇମେଲ à¬à¬¹à¬¿ ଉଇକିରେ ବଦଳାଯାଇପାରିବ ନାହିଠ।',
'accountcreated' => 'ଖାତାଟି ଖୋଲାହୋଇଗଲା',
'accountcreatedtext' => '$1 ପାଇଠନୂଆ ଖାତାଟିଠତିଆରି ହୋଇଗଲା ।',
'createaccount-title' => '{{SITENAME}} ପାଇଠଖାତା ଖୋଲା',
@@ -741,6 +753,7 @@ continue using your old password.',
# E-mail sending
'php-mail-error-unknown' => 'PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସà­à¬¬à¬¿à¬§à¬¾ ।',
+'user-mail-no-addy' => 'à¬à¬• ଇ-ମେଲ ଠିକଣା ବିନା ଇ-ମେଲ ପଠାଇବାକୠଚେଷà­à¬Ÿà¬¾ କଲà­à¬ ।',
# Change password dialog
'resetpass' => 'ପାସୱରà­à¬¡à¬¼ ବଦଳାନà­à¬¤à­',
@@ -762,16 +775,18 @@ continue using your old password.',
'resetpass-temp-password' => 'ଅସà­à¬¥à¬¾à­Ÿà­€ ପାସବାରà­à¬¡à¬¼:',
# Special:PasswordReset
-'passwordreset' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­',
-'passwordreset-text' => 'ନିଜ ଖାତାର ସବିଶେଷ ବିବରଣୀ à¬à¬• ଇ-ମେଲରେ ପାଇବା ପାଇଠà¬à¬¹à¬¿ ଆବେଦନ ପତà­à¬°à¬Ÿà¬¿ ପୂରଣ କରନà­à¬¤à­ ।',
-'passwordreset-legend' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­',
-'passwordreset-disabled' => 'ପାସବାରà­à¬¡à¬¼à¬•à­ ପà­à¬°à¬¾à¬ªà­à¬°à¬¿ ମୂଳକୠଫେରାଇବା à¬à¬¹à¬¿ ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
-'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥà­à­Ÿà¬¸à¬®à­‚ହରୠକୌଣସି ଗୋଟିଠଦିଅନà­à¬¤à­}}',
-'passwordreset-username' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
-'passwordreset-domain' => 'ଡୋମେନ:',
-'passwordreset-email' => 'ଇ-ମେଲ ଠିକଣା:',
-'passwordreset-emailtitle' => '{{SITENAME}} ର ଖାତା ସବିଶେଷ',
-'passwordreset-emailtext-ip' => 'କେହି ଜଣେ (ବୋଧେ ଆପଣ, $1 IP ଠିକଣାରà­)
+'passwordreset' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­',
+'passwordreset-text' => 'ନିଜ ଖାତାର ସବିଶେଷ ବିବରଣୀ à¬à¬• ଇ-ମେଲରେ ପାଇବା ପାଇଠà¬à¬¹à¬¿ ଆବେଦନ ପତà­à¬°à¬Ÿà¬¿ ପୂରଣ କରନà­à¬¤à­ ।',
+'passwordreset-legend' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­',
+'passwordreset-disabled' => 'ପାସବାରà­à¬¡à¬¼à¬•à­ ପà­à¬°à¬¾à¬ªà­à¬°à¬¿ ମୂଳକୠଫେରାଇବା à¬à¬¹à¬¿ ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
+'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥà­à­Ÿà¬¸à¬®à­‚ହରୠକୌଣସି ଗୋଟିଠଦିଅନà­à¬¤à­}}',
+'passwordreset-username' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
+'passwordreset-domain' => 'ଡୋମେନ:',
+'passwordreset-capture' => 'ଯାଉଥିବା ଇ-ମେଲଟି ଦେଖିବେ?',
+'passwordreset-capture-help' => 'ଯଦି ଆପଣ ଘରଟିକୠଦେଖନà­à¬¤à¬¿ ତେବେ (ଅସà­à¬¥à¬¾à­Ÿà­€ ପାସୱାରà­à¬¡à¬¼ ସହିତ) ଇ-ମେଲଟି ଆପଣଙà­à¬•à­ ଦେଖାଯିବ ଓ ବାକି ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬•à­ ଚାଲିଯିବ ।',
+'passwordreset-email' => 'ଇ-ମେଲ ଠିକଣା:',
+'passwordreset-emailtitle' => '{{SITENAME}} ର ଖାତା ସବିଶେଷ',
+'passwordreset-emailtext-ip' => 'କେହି ଜଣେ (ବୋଧେ ଆପଣ, $1 IP ଠିକଣାରà­)
{{SITENAME}} ($4) ସାଇଟରେ ଥିବା ଆପଣଙà­à¬• ଖାତାର ସବିଶେଷ ଜାଣିବାକୠଅନà­à¬°à­‹à¬§ କରିଛନà­à¬¤à¬¿ । à¬à¬¹à¬¿ ଇମେଲ ଠିକଣା ସହିତ ତଳଲିଖିତ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• {{PLURAL:$3|ଖାତା|ଖାତାସମୂହ}} ଯୋଡ଼ା:
$2
@@ -780,7 +795,7 @@ $2
ଆପଣ à¬à¬¬à­‡ ଲଗ ଇନ କରି ନୂଆ ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿à¬ ବାଛନà­à¬¤à­ । ଯହି ଆଉ କେହି ଜଣେ à¬à¬¹à¬¿ ଅନà­à¬°à­‹à¬§ କରିଥାନà­à¬¤à¬¿
କିମà­à¬¬à¬¾ ଆପଣ à¬à¬¬à­‡ ନିଜର ମୂଳ ପାସବାରà­à¬¡à¬¼ ମନେ ପକାଇ ପାରିଥାନà­à¬¤à¬¿ ତେବେ à¬à¬¹à¬¿ ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿à¬•à­ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଠ।
ଆପଣ ନିଜ ପà­à¬°à­à¬£à¬¾ ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿ ଆଗପରି ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରିପାରନà­à¬¤à¬¿ ।',
-'passwordreset-emailtext-user' => '{{SITENAME}}ରେ ଥିବା ବà­à­Ÿà­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ $1 {{SITENAME}} ($4) ସାଇଟରେ ଥିବା ଆପଣଙà­à¬• ଖାତାର ସବିଶେଷ ଜାଣିବାକୠଅନà­à¬°à­‹à¬§ କରିଛନà­à¬¤à¬¿ । à¬à¬¹à¬¿ ଇମେଲ ଠିକଣା ସହିତ ତଳଲିଖିତ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• {{PLURAL:$3|ଖାତା|ଖାତାସମୂହ}} ଯୋଡ଼ା:
+'passwordreset-emailtext-user' => '{{SITENAME}}ରେ ଥିବା ବà­à­Ÿà­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ $1 {{SITENAME}} ($4) ସାଇଟରେ ଥିବା ଆପଣଙà­à¬• ଖାତାର ସବିଶେଷ ଜାଣିବାକୠଅନà­à¬°à­‹à¬§ କରିଛନà­à¬¤à¬¿ । à¬à¬¹à¬¿ ଇମେଲ ଠିକଣା ସହିତ ତଳଲିଖିତ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• {{PLURAL:$3|ଖାତା|ଖାତାସମୂହ}} ଯୋଡ଼ା:
$2
@@ -788,9 +803,22 @@ $2
ଆପଣ à¬à¬¬à­‡ ଲଗ ଇନ କରି ନୂଆ ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿à¬ ବାଛନà­à¬¤à­ । ଯହି ଆଉ କେହି ଜଣେ à¬à¬¹à¬¿ ଅନà­à¬°à­‹à¬§ କରିଥାନà­à¬¤à¬¿
କିମà­à¬¬à¬¾ ଆପଣ à¬à¬¬à­‡ ନିଜର ମୂଳ ପାସବାରà­à¬¡à¬¼ ମନେ ପକାଇ ପାରିଥାନà­à¬¤à¬¿ ତେବେ à¬à¬¹à¬¿ ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿à¬•à­ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଠ।
ଆପଣ ନିଜ ପà­à¬°à­à¬£à¬¾ ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿ ଆଗପରି ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରିପାରନà­à¬¤à¬¿ ।',
-'passwordreset-emailelement' => 'ଇଉଜର ନାମ: $1
+'passwordreset-emailelement' => 'ଇଉଜର ନାମ: $1
ଅସà­à¬¥à¬¾à­Ÿà­€ ପାସବାରà­à¬¡à¬¼: $2',
-'passwordreset-emailsent' => 'à¬à¬• ମନେପକାଇବା ଇ-ମେଲ ପଠାଇଦିଆଯାଇଅଛି ।',
+'passwordreset-emailsent' => 'à¬à¬• ମନେପକାଇବା ଇ-ମେଲ ପଠାଇଦିଆଯାଇଅଛି ।',
+'passwordreset-emailsent-capture' => 'ତଳେ ଦିଆଯାଇଥିବା ଭଳି ମନେପକାଇବା ଇ-ମେଲଟିଠପଠାଦିଆଗଲା ।',
+'passwordreset-emailerror-capture' => 'ଗୋଟିଠସବିଶେଷ à¬à¬®à­‡à¬²à¬Ÿà¬¿à¬ ବାହାରିଛି, ଯାହାକି ତଳେ ଅଛି, କିନà­à¬¤à­ à¬à¬¹à¬¾à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬•à­ ପଠାଇବାରେ ଅସଫଳ ହେଲା :$1',
+
+# Special:ChangeEmail
+'changeemail' => 'ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ',
+'changeemail-header' => 'ଖାତା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ',
+'changeemail-text' => 'ଆପଣା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବା ନିମନà­à¬¤à­‡ à¬à¬¹à¬¿ ଆବେଦନ ପତà­à¬°à¬Ÿà¬¿ ପୂରଣ କରନà­à¬¤à­ । ଆପଣଙà­à¬•à­ à¬à¬¹à¬¿ ବଦଳ ଥୟ କରିବା ପାଇଠନିଜର ପାସବାରà­à¬¡à¬¼ ଦେବାକୠପଡ଼ିବ ।',
+'changeemail-no-info' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ସିଧା ଖୋଲିବା ନିମନà­à¬¤à­‡ ଆପଣଙà­à¬•à­ ଲଗ ଇନ କରିବାକୠପଡ଼ିବ ।',
+'changeemail-oldemail' => 'à¬à¬¬à­‡à¬•à¬¾à¬° ଇ-ମେଲ ଠିକଣା:',
+'changeemail-newemail' => 'ନୂଆ ଇ-ମେଲ ଠିକଣା:',
+'changeemail-none' => '(କିଛି ନାହିà¬)',
+'changeemail-submit' => 'ଇ-ମେଲ ପରିରà­à¬¬à¬¤à­à¬¤à¬¨ କରନà­à¬¤à­',
+'changeemail-cancel' => 'ନାକଚ',
# Edit page toolbar
'bold_sample' => 'ମୋଟା ଲେଖା',
@@ -860,9 +888,6 @@ $1 ଦà­à¬µà¬¾à¬°à¬¾ ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରାଯାଇଛି
ଆପଣଙà­à¬• à¬à¬¬à­‡à¬•à¬¾à¬° IP ଠିକଣା ହେଲା $3, ଆଉ ଅଟକ ID ହେଲା #$5 ।
ଦୟାକରି ଆପଣ ପଚାରà­à¬¥à¬¿à¬¬à¬¾ ଯେକୌଣସି ପà­à¬°à¬¶à­à¬¨à¬°à­‡ ଉପରେ ଥିବା ସବିଶେଷ ଯୋଗ କରି ପଚାରିବେ ।',
'blockednoreason' => 'କିଛି କାରଣ ଦିଆଯାଇ ନାହିà¬',
-'blockedoriginalsource' => "'''$1'''ର ମୂଳାଧାର ତଳେ ଦିଆଯାଇଅଛି:",
-'blockededitsource' => "'''ଆପଣଙà­à¬• ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾''' ରୠ'''$1'''ର ଲେଖା ତଳେ ଦିଆଯାଇଅଛି:",
-'whitelistedittitle' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିବା ନିମନà­à¬¤à­‡ ଲଗ ଇନ ଦରକାର',
'whitelistedittext' => 'ପୃଷà­à¬ à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¨ ପାଇଠଆପଣଙà­à¬•à­ $1 କରିବାକୠପଡ଼ିବ ।',
'confirmedittext' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିବା ଆଗରୠଆପଣଙà­à¬•à­ ନିଜର ଇ-ମେଲ ଠିକଣାଟିକୠଥୟ କରିବାକୠପଡ଼ିବ ।
ଆପଣା [[Special:Preferences|ସଭà­à­Ÿ ପସନà­à¬¦]] ଭିତରୠବାଛି ନିଜ ଇ-ମେଲ ଠିକଣାଟିକୠଥୟ କରନà­à¬¤à­ ।',
@@ -1126,8 +1151,6 @@ $3ଙà­à¬• ଦେଇ ଦିଆଯାଇଥିବା କାରଣ ହେଲା '
'revdelete-unsuppress' => 'ଆଉଥରେ ସà­à¬¥à¬¾à¬ªà¬¿à¬¤ ସଙà­à¬•à¬³à¬¨à¬¸à¬¬à­à¬°à­‡ ଥିବା ବାରଣକୠବାହାର କରିଦିଅନà­à¬¤à­',
'revdelete-log' => 'କାରଣ:',
'revdelete-submit' => 'ବଛା {{PLURAL:$1|ସଙà­à¬•à¬³à¬¨|ସଙà­à¬•à¬³à¬¨à¬¸à¬¬à­}} ପାଇଠଲାଗୠକରନà­à¬¤à­',
-'revdelete-logentry' => '"[[$1]]"ର ଦେଖଣାର ସଙà­à¬•à¬³à¬¨à¬¸à¬¬à­à¬•à­ ବଦଳାଗଲା',
-'logdelete-logentry' => '"[[$1]]"ର ଘଟଣା ଦେଖଣା ବଦଳାଗଲା',
'revdelete-success' => "'''ସଙà­à¬•à¬³à¬¨ ଦେଖଣା ଭଲଭାବେ ସତେଜ କରାଗଲା ।'''",
'revdelete-failure' => "'''ସଙà­à¬•à¬³à¬¨ ଦେଖଣା ସତେଜ କରାଯାଇପାରିଲା ନାହିà¬:'''
$1",
@@ -1139,15 +1162,6 @@ $1",
'revdel-restore-visible' => 'ଦେଖାଯାଉଥିବା ସଙà­à¬•à¬³à¬¨à¬¸à¬¬à­',
'pagehist' => 'ପୃଷà­à¬ à¬¾à¬° ଇତିହାସ',
'deletedhist' => 'ଲିଭାଯାଇଥିବା ଇତିହାସ',
-'revdelete-content' => 'ଭିତର ଚିଜ',
-'revdelete-summary' => 'ସାରକଥା ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾',
-'revdelete-uname' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ',
-'revdelete-restricted' => 'ପରିଛାମାନଙà­à¬• ନିମନà­à¬¤à­‡ ଥିବା ବାରଣ',
-'revdelete-unrestricted' => 'ପରିଛାମାନଙà­à¬• ନିମନà­à¬¤à­‡ ଥିବା ବାରଣ ବାହାର କରିଦିଆଗଲା',
-'revdelete-hid' => '$1କୠଲà­à¬šà¬¾à¬—ଲା',
-'revdelete-unhid' => 'ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ $1କୠଦେଖାଇଦିଆଗଲା',
-'revdelete-log-message' => '$2 ପାଇଠ$1 {{PLURAL:$2|ସଂସà­à¬•à¬°à¬£|ସଂସà­à¬•à¬°à¬£ ମାନ}}',
-'logdelete-log-message' => '$2 {{PLURAL:$2|ଟି ଘଟଣା|ଟି ଘଟଣା}} ପାଇଠ$1',
'revdelete-hide-current' => '$2,$1 ତାରିଖରେ ହୋଇଥିବା ଲେଖାଗà­à¬¡à¬¿à¬• ଦେଖାଇବାରେ ଅସà­à¬¬à¬¿à¬§à¬¾ ହେଉଛି : à¬à¬¹à¬¾ ହେଉଛି ବରà­à¬¤à¬®à¬¾à¬¨à¬° ପà­à¬¨à¬ƒà¬¦à­‡à¬–ା ।
à¬à¬¹à¬¾à¬•à­ ଲà­à¬šà¬¾ ଯାଇପାରିବ ନାହି ।',
'revdelete-show-no-access' => "$2 ଦିନ, $1 ବେଳେ ଥିବା ବସà­à¬¤à­à¬°à­‡ ଭà­à¬²: à¬à¬¹à¬¿ ବସà­à¬¤à­à¬Ÿà¬¿ ''କିଳାଯାଇଛି'' ।
@@ -1307,12 +1321,14 @@ $1",
'prefs-rc' => 'ନଗଦ ବଦଳ',
'prefs-watchlist' => 'ଦେଖଣା ତାଲିକା',
'prefs-watchlist-days' => 'ଦେଖଣା ତାଲିକାରେ ଦେଖାଯିବା ଦିନ:',
-'prefs-watchlist-days-max' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ହେଲେ à­­ ଦିନ',
+'prefs-watchlist-days-max' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|ଦିନ|ଦିନ}}',
'prefs-watchlist-edits' => 'ବଢ଼ନà­à¬¤à¬¾ ଦେଖଣା ତାଲିକାରେ ଦେଖିହେବା ଭଳି ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ବଦଲ:',
'prefs-watchlist-edits-max' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ସଂଖà­à­Ÿà¬¾: ୧୦୦',
'prefs-watchlist-token' => 'ଦେଖଣା ତାଲିକା ଟୋକନ:',
'prefs-misc' => 'ବିଭିନà­à¬¨',
'prefs-resetpass' => 'ପାସୱରà­à¬¡à¬¼ ବଦଳାନà­à¬¤à­',
+'prefs-changeemail' => 'ଇ-ମେଲ ପରିରà­à¬¬à¬¤à­à¬¤à¬¨ କରନà­à¬¤à­',
+'prefs-setemail' => 'ଇ-ମେଲ ଠିକଣାଟିଠଥୟ କରିବେ',
'prefs-email' => 'ଇ-ମେଲ ବିକଳà­à¬ªà¬®à¬¾à¬¨',
'prefs-rendering' => 'ଦେଖଣା',
'saveprefs' => 'ସାଇତିବେ',
@@ -1372,6 +1388,7 @@ $1",
'yourrealname' => 'ପà­à¬°à¬•à­ƒà¬¤ ନାମ:',
'yourlanguage' => 'ଭାଷା:',
'yourvariant' => 'ଭିତର ଭାଗ ବିବିଧତା:',
+'prefs-help-variant' => 'à¬à¬¹à¬¿ ଉଇକିରେ ଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬° ଦେଖଣାରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ହୋଇପାରିବା ଭଳି ବନାନ ।',
'yournick' => 'ନୂଆ ସନà­à¬¤à¬•:',
'prefs-help-signature' => 'ଆଲୋଚନା ପୃଷà­à¬ à¬¾à¬°à­‡ ଦିଆଯାଉଥିବା ମତାମତରେ "<nowiki>~~~~</nowiki>" ଦେଇଦେଲେ ତାହା ସେଠାରେ ଆପେ ଆପେ ଆପଣଙà­à¬• ନାମ ଓ ସମୟକୠବଦଳିଯିବ ।',
'badsig' => 'ମୂଳ ସନà­à¬¤à¬•à¬Ÿà¬¿ ଅଚଳ ଅଟେ ।
@@ -1415,7 +1432,7 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'userrights-lookup-user' => 'ସଭà­à­Ÿ ଗୋଠ ପରିଚାଳନା କରିବେ',
'userrights-user-editname' => 'ଇଉଜର ନାମଟିଠଦିଅନà­à¬¤à­:',
'editusergroup' => 'ଇଉଜର ଗୋଠ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରନà­à¬¤à­',
-'editinguser' => "ବà­à­Ÿà¬¬â€Œà¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])ଙà­à¬•à¬° ସଭà­à­Ÿ ଅଧିକାର ବଦଳାଉଛà­",
+'editinguser' => "'''[[User:$1|$1]]''' $2 ଙà­à¬•à¬° ସଭà­à­Ÿ ଅଧିକାର ବଦଳାଉଅଛà­à¬",
'userrights-editusergroup' => 'ଇଉଜର ଗୋଠ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରନà­à¬¤à­',
'saveusergroups' => 'ଇଉଜର ଗୋଠ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରନà­à¬¤à­',
'userrights-groupsmember' => 'ସଭà­à­Ÿ ଗୋଠ:',
@@ -1509,13 +1526,13 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'right-autopatrol' => 'ଜଣକର ଆପଣା ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬¸à¬¬à­ ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ ହୋଇଯାଉ',
'right-patrolmarks' => 'ନଗଦ ବଦଳସବୠଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରି ଦେଖାଇବେ',
'right-unwatchedpages' => 'ଦେଖାଯାଇନଥିବା ପୃଷà­à¬ à¬¾à¬° à¬à¬• ତାଲିକା ଦେଖାଇବେ',
-'right-trackback' => 'à¬à¬• ଟà­à¬°à¬¾à¬•à¬¬à­à­Ÿà¬¾à¬• ଜମା କରିବେ',
'right-mergehistory' => 'ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à¬° ଇତିହାସ ମିଶାଇଦେବେ',
'right-userrights' => 'ଇଉଜର ଅଧିକାରସବà­à¬•à­ ବଦଳାଇବେ',
'right-userrights-interwiki' => 'ବାକି ଉଇକିର ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬• ସଭà­à­Ÿ ଅଧିକାର ବଦଳାଇବେ',
'right-siteadmin' => 'ଡାଟାବେସକୠକିଳିବେ ଓ ଖୋଲିବେ',
'right-override-export-depth' => '୫ଟି ଯାà¬à¬ ଯୋଡ଼ାଯାଇଥିବା ପୃଷà­à¬ à¬¾ ସହିତ ସବୠପୃଷà­à¬ à¬¾à¬•à­ ରପà­à¬¤à¬¾à¬¨à­€ କରିବେ',
'right-sendemail' => 'ବାକି ସଭà­à­Ÿ ମାନଙà­à¬•à­ ଇ-ମେଲ ପଠାଇବେ',
+'right-passwordreset' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ ଇମେଲ କରିବେ',
# User rights log
'rightslog' => 'ସଭà­à­Ÿà¬™à­à¬• ଅଧିକାରର ଲଗ',
@@ -1549,16 +1566,17 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'action-suppressionlog' => 'ବà­à­Ÿà¬•à­à¬¤à¬¿à¬—ତ ଲଗ ଦେଖାଇବେ',
'action-block' => 'à¬à¬¹à¬¿ ସଭà­à­Ÿà¬™à­à¬•à­ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬°à­ ବାରଣ କରିବେ',
'action-protect' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬° କିଳିବା ସà­à¬¤à¬°à¬•à­ ବଦଳାଇବେ',
+'action-rollback' => 'à¬à¬• ନିରà­à¬¦à­à¬¦à¬¿à¬·à­à¬Ÿ ପୃଷà­à¬ à¬¾à¬•à­ ବଦଳାଇଥିବା ଶେଷ ସଭà­à­Ÿà¬™à­à¬• ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬•à­ ସଙà­à¬—େସଙà­à¬—à­‡ ପà­à¬°à¬¾à¬ªà­à¬°à¬¿ ପଛକୠଫେରାଇଦେବେ',
'action-import' => 'ଆଉ à¬à¬• ଉଇକିରୠà¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଆଣିବେ',
'action-importupload' => 'à¬à¬• ଫାଇଲ ଅପଲୋଡ଼ରୠà¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଆଣିବେ',
'action-patrol' => 'ବାକି ମାନଙà­à¬• ବଦଳକୠଜଗାଯାଇଥିବା ବଦଳ ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରିବେ',
'action-autopatrol' => 'ଆପଣା ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬¸à¬¬à­à¬•à­ ଜଗାଯାଇଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରିବେ',
'action-unwatchedpages' => 'ଦେଖାଯାଇନଥିବା ପୃଷà­à¬ à¬¾à¬° à¬à¬• ତାଲିକା ଦେଖାଇବେ',
-'action-trackback' => 'à¬à¬• ଟà­à¬°à¬¾à¬•à¬¬à­à­Ÿà¬¾à¬• ଜମା କରିବେ',
'action-mergehistory' => 'ପୃଷà­à¬ à¬¾à¬° ଇତିହାସ ମିଶାଇଦେବେ',
'action-userrights' => 'ଇଉଜର ଅଧିକାରସବà­à¬•à­ ବଦଳାଇବେ',
'action-userrights-interwiki' => 'ବାକି ଉଇକିର ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬• ସଭà­à­Ÿ ଅଧିକାର ବଦଳାଇବେ',
'action-siteadmin' => 'ଡାଟାବେସକୠକିଳିବେ ଓ ଖୋଲିବେ',
+'action-sendemail' => 'ଇ-ମେଲ ପଠାଇବେ',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବà­}}',
@@ -1643,6 +1661,7 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'minlength1' => 'ଫାଇଲ ନାମଟି ଅତି କମରେ ଗୋଟିଠଅକà­à¬·à¬° ହୋଇଥିବା ଲୋଡ଼ା ।',
'illegalfilename' => '"$1" ନାମରେ ଥିବା ଫାଇଲର ନାମରେ ଥିବା ଅକà­à¬·à¬° ପୃଷà­à¬ à¬¾ ଶିରୋନାମାରେ ରଖିବା ପାଇଠଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।
ଦୟାକରି ଫାଇଲର ନାମଟି ବଦଳାନà­à¬¤à­ ଓ ଆଉଥରେ ଅପଲୋଡ଼ କରନà­à¬¤à­ ।',
+'filename-toolong' => 'ଫାଇଲ ନାମ ୨୦୦ ବାଇଟରୠଅଧିକ ନ ହେବା ଉଚିତ ।',
'badfilename' => 'ଫାଇଲ ନାମ "$1"କୠବଦଳାଇ ଦିଆଯାଇଛି ।',
'filetype-mime-mismatch' => 'ଫାଇଲ à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ ".$1" ଚିହà­à¬¨à¬Ÿ ହୋଇଥିବା MIME ଫାଇଲ ପà­à¬°à¬•à¬¾à¬° ସଙà­à¬—à­‡ ମେଳ ଖାଉନାହିଠ($2) ।',
'filetype-badmime' => '"$1" MIME ପà­à¬°à¬•à¬¾à¬°à¬° ଫାଇଲ ଅପଲୋଡ଼ କରିବା ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।',
@@ -1746,6 +1765,35 @@ $1',
'upload-unknown-size' => 'ଅଜଣା ଆକାର',
'upload-http-error' => 'HTTP ଅସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿à¬ ଘଟିଲା: $1',
+# File backend
+'backend-fail-stream' => 'ଷà­à¬Ÿà­à¬°à¬¿à¬® ଫାଇଲ $1ଟି ମିଳିଲା ନାହିଠ।',
+'backend-fail-backup' => 'ଭବିଷà­à­Ÿà¬¤ ପାଇଠଥିବା $1 ଫାଇଲଟି ମିଳିଲା ନାହିଠ।',
+'backend-fail-notexists' => '$1 ଫାଇଲଟି ମିଳିଲା ନାହିଠ।',
+'backend-fail-hashes' => 'ତà­à¬³à¬¨à¬¾ ପାଇଠଫାଇଲ ହାସ ମିଳିଲା ନାହିଠ।',
+'backend-fail-notsame' => '$1 ଠାରେ à¬à¬• ଅସମ ଫାଇଲ ଆଗରୠଅଛି ।',
+'backend-fail-invalidpath' => '$1 à¬à¬• ବୈଧ ସାଇତିବା ପଥ ନà­à¬¹à­‡à¬ ।',
+'backend-fail-delete' => '$1 ଫାଇଲଟି ଲିଭାଇ ପାରିବେ ନାହିଠ।',
+'backend-fail-alreadyexists' => '$1 ଫାଇଲଟି ଆଗରୠଅଛି ।',
+'backend-fail-store' => '$2 ଠାରେ $1 ଫାଇଲଟି ସାଇତାଯାଇ ପାରିଲା ନାହିଠ।',
+'backend-fail-copy' => '$1 ଫାଇଲଟିରୠ$2 କୠଫାଇଲ ନକଲ କରାଯାଇପାରିବ ନାହିଠ।',
+'backend-fail-move' => '$1 ରୠ$2 କୠଫାଇଲ ନକଲ କରିପାରିଲୠନାହିଠ।',
+'backend-fail-opentemp' => 'ଅସà­à¬¥à¬¾à­Ÿà­€ ଫାଇଲ ଖୋଲିହେଲା ନାହିଠ।',
+'backend-fail-writetemp' => 'ଅସà­à¬¥à¬¾à­Ÿà­€ ଫାଇଲ ତିଆରି କରିପାରିଲୠନାହିଠ।',
+'backend-fail-closetemp' => 'ଅସà­à¬¥à¬¾à­Ÿà­€ ଫାଇଲ ବନà­à¬¦ କରିହେଲା ନାହିଠ।',
+'backend-fail-read' => '$1 ଫାଇଲଟି ପଢ଼ିପାରିଲୠନାହିଠ।',
+'backend-fail-create' => '$1 ଫାଇଲଟି ତିଆରି କରିପାରିଲୠନାହିଠ।',
+
+# Lock manager
+'lockmanager-notlocked' => 'କିଳାଯାଇଥିବା "$1"କୠଖୋଲିପାରିଲୠନାହିà¬; à¬à¬¹à¬¾ ପà­à¬°à¬•à­ƒà¬¤à¬°à­‡ କିଳାଯାଇନାହିଠ।',
+'lockmanager-fail-closelock' => '"$1" ପାଇଠତାଲା ପରି କାମ କରିବା ଫାଇଲଟି ମିଳିଲାନାହିଠ।',
+'lockmanager-fail-deletelock' => '"$1" ଫାଇଲଟି କିଳାଯାଇଥିବାରୠଲିଭାଯାଇପାରିଲା ନାହିଠ।',
+'lockmanager-fail-acquirelock' => '"$1" ଚାବି ପାଇଠତାଲା ମିଳିଲା ନାହିଠ।',
+'lockmanager-fail-openlock' => '"$1" ଫାଇଲଟି କିଳାଯାଇଥିବାରୠଖୋଲାଯାଇ ପାରିଲା ନାହିଠ।',
+'lockmanager-fail-releaselock' => '"$1" ଚାବି ପାଇଠତାଲା ମିଳିଲା ନାହିଠ।',
+'lockmanager-fail-db-bucket' => '$1 à¬à­à¬¡à¬¼à¬¿à¬°à­‡ ଥିବା ସବୠକିଳାଯାଇଥିବା ଡାଟାବେସ ସହ ଯୋଗାଯୋଗ କରାଯାଇପାରିଲା ନାହିଠ।',
+'lockmanager-fail-db-release' => '$1 ଡାଟାବେସରେ ଲାଗିଥିବା ତାଲା ଖୋଲାଯାଇପାରିଲା ନାହିଠ।',
+'lockmanager-fail-svr-release' => '$1 ସରà­à¬­à¬°à¬°à­‡ ଲାଗିଥିବା ତାଲା ଖୋଲାଯାଇପାରିଲା ନାହିଠ।',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ZIP ପରଖିବା ପାଇଠଫାଇଲଟି ଖୋଲିଲା ବେଳେ ଅସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿à¬ ଘଟିଲା ।',
'zip-wrong-format' => 'ଦିଆଯାଇଥିବା ଫାଇଲଟି à¬à¬• ZIP ଫାଇଲ ନà­à¬¹à­‡à¬ ।',
@@ -1762,6 +1810,7 @@ $1',
'uploadstash-badtoken' => 'ସେହି କାମଟି କରିବାରେ ଅସଫଳ ହେଲà­, ବୋଧେ ଆପଣଙà­à¬• ଇଉଜର ନାମ ଓ ପାସବାରà­à¬¡à¬¼ ଆଦିର ମିଆଦ ପà­à¬°à¬¿à¬—ଲାଣି । ଆଉଥରେ ଚେଷà­à¬Ÿà¬¾ କରନà­à¬¤à­ ।',
'uploadstash-errclear' => 'ଫାଇଲମାନଙà­à¬•à¬° ଲିଭାଇବା ଅସଫଳ ରହିଲା ।',
'uploadstash-refresh' => 'ଫାଇଲମାନଙà­à¬•à¬° ତାଲିକାକୠସତେଜ କରିବେ',
+'invalid-chunk-offset' => 'ଅବୈଧ ଖରାପ ଅଫସେଟ',
# img_auth script messages
'img-auth-accessdenied' => 'ଭିତରକୠପଶିବାକୠବାରଣ କରାଗଲା',
@@ -1870,23 +1919,24 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
'filerevert-badversion' => 'à¬à¬¹à¬¿ ଫାଇଲର କିଛି ବି ଆଗର ସà­à¬¥à¬¾à¬¨à­€à­Ÿ ଫାଇଲ ନାହିଠଯେଉà¬à¬¥à¬¿à¬°à­‡ à¬à¬¹à¬¿ ସମୟ ଛିହà­à¬¨à¬Ÿà¬¿ ଦିଆଯାଇଛି ।',
# File deletion
-'filedelete' => 'ଲିଭାଇବା $1',
-'filedelete-legend' => 'ଫାଇଲଟି ଲିଭାଇବେ',
-'filedelete-intro' => "ଆପଣ '''[[Media:$1|$1]]''' ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଇତିହାସ ସମେତ ଲିଭାଇବାକୠଯାଉଛନà­à¬¤à¬¿ ।",
-'filedelete-intro-old' => "[$4 $3, $2] ବେଳେ ଆପଣ '''[[Media:$1|$1]]''' ସଂସà­à¬•à¬°à¬£à¬°à­ ଲିଭାଉ ଅଛନà­à¬¤à¬¿ ।",
-'filedelete-comment' => 'କାରଣ:',
-'filedelete-submit' => 'ଲିଭାଇବେ',
-'filedelete-success' => "'''$1''' ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇ ଦିଆଗଲା ।",
-'filedelete-success-old' => "$3, $2 ବେଳର '''[[Media:$1|$1]]''' ଟି ଲିଭାଇଦିଆଗଲା ।",
-'filedelete-nofile' => "'''$1'''ଟି ମିଳିଲା ନାହିଠ।",
-'filedelete-nofile-old' => "ଦିଆଯାଇଥିବା ବିଶେଷତା ଠିଆ '''$1'''ର ଗୋଟିଠବି ଅଭିଲେଖ ସଂସà­à¬•à¬°à¬£ ନାହିଠ।",
-'filedelete-otherreason' => 'ବାକି/ଅଧିକ କାରଣ:',
-'filedelete-reason-otherlist' => 'ଅଲଗା କାରଣ',
-'filedelete-reason-dropdown' => '*ସାଧାରଣ ଲିଭାଇବା କାରଣମାନ
+'filedelete' => 'ଲିଭାଇବା $1',
+'filedelete-legend' => 'ଫାଇଲଟି ଲିଭାଇବେ',
+'filedelete-intro' => "ଆପଣ '''[[Media:$1|$1]]''' ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଇତିହାସ ସମେତ ଲିଭାଇବାକୠଯାଉଛନà­à¬¤à¬¿ ।",
+'filedelete-intro-old' => "[$4 $3, $2] ବେଳେ ଆପଣ '''[[Media:$1|$1]]''' ସଂସà­à¬•à¬°à¬£à¬°à­ ଲିଭାଉ ଅଛନà­à¬¤à¬¿ ।",
+'filedelete-comment' => 'କାରଣ:',
+'filedelete-submit' => 'ଲିଭାଇବେ',
+'filedelete-success' => "'''$1''' ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇ ଦିଆଗଲା ।",
+'filedelete-success-old' => "$3, $2 ବେଳର '''[[Media:$1|$1]]''' ଟି ଲିଭାଇଦିଆଗଲା ।",
+'filedelete-nofile' => "'''$1'''ଟି ମିଳିଲା ନାହିଠ।",
+'filedelete-nofile-old' => "ଦିଆଯାଇଥିବା ବିଶେଷତା ଠିଆ '''$1'''ର ଗୋଟିଠବି ଅଭିଲେଖ ସଂସà­à¬•à¬°à¬£ ନାହିଠ।",
+'filedelete-otherreason' => 'ବାକି/ଅଧିକ କାରଣ:',
+'filedelete-reason-otherlist' => 'ଅଲଗା କାରଣ',
+'filedelete-reason-dropdown' => '*ସାଧାରଣ ଲିଭାଇବା କାରଣମାନ
** ସତà­à¬µà¬¾à¬§à¬¿à¬•à¬¾à¬° ଉଲà­à¬²à¬™à­à¬˜à¬¨
** ନକଲି ଫାଇଲ',
-'filedelete-edit-reasonlist' => 'ଲିଭାଇବା କାରଣମାନ ବଦଳାଇବେ',
-'filedelete-maintenance' => 'ରକà­à¬·à¬£à¬¾à¬¬à­‡à¬•à­à¬·à¬£ ନିମନà­à¬¤à­‡ ଫାଇଲ ଲିଭାଇବା ଓ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କିଛି କାଳ ପାଇଠଅଚଳ କରିଦିଆଯାଇଛି ।',
+'filedelete-edit-reasonlist' => 'ଲିଭାଇବା କାରଣମାନ ବଦଳାଇବେ',
+'filedelete-maintenance' => 'ରକà­à¬·à¬£à¬¾à¬¬à­‡à¬•à­à¬·à¬£ ନିମନà­à¬¤à­‡ ଫାଇଲ ଲିଭାଇବା ଓ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କିଛି କାଳ ପାଇଠଅଚଳ କରିଦିଆଯାଇଛି ।',
+'filedelete-maintenance-title' => 'à¬à¬¹à¬¿ ଫାଇଲକୠଲିଭାଯାଇପାରିବ ନାହି',
# MIME search
'mimesearch' => 'MIME ଖୋଜା',
@@ -1994,6 +2044,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
'mostimages' => 'ଫାଇଲରେ ବେଶି ଯୋଡ଼ାଯାଇଥିବା ଥିବା',
'mostrevisions' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ସଙà­à¬•à¬³à¬¨ ଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬®à­‚ହ',
'prefixindex' => 'ଆଗରୠକିଛି ଯୋଡ଼ା ସହ ଥିବା ସବୠଫରଦସବà­',
+'prefixindex-namespace' => 'ଉପସରà­à¬— ଲାଗିଥିବା ସବà­à¬¯à¬¾à¬• ପୃଷà­à¬ à¬¾ ($1 ଗୋଟି ନେମସà­à¬ªà­‡à¬¸)',
'shortpages' => 'ଛୋଟ ପୃଷà­à¬ à¬¾à¬¸à¬®à­‚ହ',
'longpages' => 'ଲମà­à¬¬à¬¾ ପୃଷà­à¬ à¬¾',
'deadendpages' => 'ଆଗକୠଯାଇପାରà­à¬¨à¬¥à¬¿à¬¬à¬¾ ପୃଷà­à¬ à¬¾',
@@ -2010,7 +2061,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
'listusers-editsonly' => 'କେବଳ କିଛି ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିଥିବା ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬•à­ ଦେଖାଇବେ',
'listusers-creationsort' => 'ତିଆରି ତାରିଖ ଅନà­à¬¸à¬¾à¬°à­‡ ସଜାଇବେ',
'usereditcount' => '$1 ଟି {{PLURAL:$1|ବଦଳ}}',
-'usercreated' => '$2 ଠାରେ $1ରେ ତିଆରି କରାଗଲା',
+'usercreated' => '$1 ତାରିଖ ଦିନ $2 ବେଳେ {{GENDER:$3|ତିଆରି କରାଗଲା}}',
'newpages' => 'ନୂଆ ପୃଷà­à¬ à¬¾',
'newpages-username' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
'ancientpages' => 'ସବà­à¬ à­ ପà­à¬°à¬¾à¬¤à¬¨ ପୃଷà­à¬ à¬¾',
@@ -2104,12 +2155,8 @@ A page is treated as disambiguation page if it uses a template which is linked f
'activeusers-noresult' => 'ଜଣେ ବି ସଭà­à­Ÿ ମିଳିଲେ ନାହିଠ।',
# Special:Log/newusers
-'newuserlogpage' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ତିଆରି ଲଗ',
-'newuserlogpagetext' => 'ସଭà­à­Ÿà¬™à­à¬•à¬° ଖାତା ଗଠନ ପାଇଠà¬à¬• ଇତିହାସ ଅଛି ।',
-'newuserlog-byemail' => 'ଇ-ମେଲରେ ପାସୱାରà­à¬¡à¬¼ ପଠାଇଦିଆଗଲା',
-'newuserlog-create-entry' => 'ନୂଆ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ଖାତା',
-'newuserlog-create2-entry' => '$1 ନାମରେ ନୂଆ ଖାତାଟିଠତିଆରି କରିଲà­à¬',
-'newuserlog-autocreate-entry' => 'ଖାତାଟି ଆପେଆପେ ତିଆରି ହୋଇଗଲା',
+'newuserlogpage' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ତିଆରି ଲଗ',
+'newuserlogpagetext' => 'ସଭà­à­Ÿà¬™à­à¬•à¬° ଖାତା ଗଠନ ପାଇଠà¬à¬• ଇତିହାସ ଅଛି ।',
# Special:ListGroupRights
'listgrouprights' => 'ସଭà­à­Ÿ ଗୋଠ ଅଧିକାରସମୂହ',
@@ -2138,7 +2185,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
'emailpagetext' => 'ତଳେ ଥିବା ଫରà­à¬® ବà­à­Ÿà¬¬à¬¹à¬° କରି ଆପଣ à¬à¬¹à¬¿ ସଭà­à­Ÿà¬¨à­à¬•à­€ ଇ-ମେଲ କରିପାରିବେ ।
[[Special:Preferences|ଅପନକ ପସନà­à¬¦]]ରେ ଥିବା ଇ-ମେଲ ଠିକଣା ପà­à¬°à­‡à¬°à¬• ଭାବରେ ଦେଖାଯିବ, ତେଣୠତିଥି ପାଇଥିବା ସଭà­à­Ÿ ଆପଣଙà­à¬•à­ ସିଧା ସଳଖ ଉତà­à¬¤à¬° ଦେଇପାରିବ ।',
'usermailererror' => 'ମେଲ ଭିତରେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ଅଛି ବୋଲି ଜାଣିବାକୠମିଳିଲା:',
-'defemailsubject' => '{{SITENAME}} ଇ-ମେଲ',
+'defemailsubject' => '{{SITENAME}} "$1" ସଭà­à­Ÿà¬™à­à¬• ଠାରୠଇ-ମେଲ କରିବେ',
'usermaildisabled' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ଈ-ମେଲ ଅଚଳ କରାଗଲା',
'usermaildisabledtext' => 'à¬à¬¹à¬¿ ଉଇକିରେ ଆପଣ ବାକି ସଭà­à­Ÿà¬™à­à¬•à­ ଇ ମେଲ କରିପାରିବେ ନାହିà¬',
'noemailtitle' => 'ଇ-ମେଲ ଠିକଣା ନାହିà¬',
@@ -2192,7 +2239,7 @@ A page is treated as disambiguation page if it uses a template which is linked f
'watchmethod-list' => 'ନଗଦ ବଦଳ ନିମନà­à¬¤à­‡ ଦେଖାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨ ପରଖà­à¬›à­à¬',
'watchlistcontains' => 'ଆପଣଙà­à¬• ଦେଖଣାତାଲିକାରେ $1 {{PLURAL:$1|ଗୋଟି ପୃଷà­à¬ à¬¾|ଗୋଟି ପୃଷà­à¬ à¬¾}} ରହିଅଛି ।',
'iteminvalidname' => "'$1' ଯୋଗà­à¬ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ହେଉଅଛି, ଭà­à¬² ନାମ...",
-'wlnote' => "ଗତ {{PLURAL:$2|ଘଣà­à¬Ÿà¬¾|'''$2''' ଘଣà­à¬Ÿà¬¾}} ଭିତରେ ହୋଇଥିବା {{PLURAL:$1|ଶେଷ ବଦଳ|ଶେଷ '''$1''' ଗୋଟି ବଦଳ}} ତଳେ ଦିଆଗଲା ।",
+'wlnote' => "$3, $4 ସà­à¬¦à­à¬§à¬¾ ବିଗତ {{PLURAL:$2|ଘଣà­à¬Ÿà­‡ ଭିତରେ|'''$2''' ଘଣà­à¬Ÿà¬¾ ଭିତରେ}} ଘଟିଥିବା {{PLURAL:$1|ଶେଷ ବଦଳଟି ଅଛି|ଶେଷ '''$1''' ଟି ବଦଳ}} ତଳେ ଦିଆଯାଇଛି ।",
'wlshowlast' => 'ଶେଷ $1 ଘଣà­à¬Ÿà¬¾ $2 ଦିନ $3 ଦେଖାଇବେ',
'watchlist-options' => 'ଦେଖଣା ବିକଳà­à¬ªà¬¸à¬¬à­',
@@ -2258,8 +2305,6 @@ $UNWATCHURL ଦେଖନà­à¬¤à­
'actionfailed' => 'କାମଟି ଅସଫଳ ହୋଇଗଲା',
'deletedtext' => '"$1"କୠଲିଭାଇ ଦିଆଗଲା ।
ନଗଦ ଲିଭାଯାଇଥିବା ଫାଇଲର ଇତିହାସ $2ରେ ଦେଖନà­à¬¤à­ ।',
-'deletedarticle' => '"[[$1]]" ଟି ଉଡ଼ିଗଲା',
-'suppressedarticle' => '"[[$1]]"କୠଚପାଇଆଗଲା',
'dellogpage' => 'ଲିଭାଇବା ଇତିହାସ',
'dellogpagetext' => 'ତଳେ ନଗଦ ଲିଭାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à¬° ତାଲିକା ରହିଅଛି ।',
'deletionlog' => 'ଲିଭାଇବା ଇତିହାସ',
@@ -2310,7 +2355,10 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
'unprotectedarticle' => '"[[$1]]"କୠକିଳାଯିବାରୠବà­à¬¨à¬¾à¬¹à¬¾à¬° କରାଗଲା',
'movedarticleprotection' => 'ସà­à¬°à¬•à­à¬·à¬¾ ସà­à¬¤à¬°à¬•à­ "[[$2]]" ରୠ"[[$1]]"କୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¦à¬¿à¬†à¬—ଲା',
'protect-title' => '"$1" ପାଇଠସà­à¬°à¬•à­à¬·à¬¾ ସà­à¬¤à¬°à¬•à­ ବଦଳାଇବେ',
+'protect-title-notallowed' => '"$1" ତମ ପà­à¬°à¬¤à¬¿à¬°à¬•à­à¬·à¬¾ ସà­à¬¤à¬° ଦେଖିବେ',
'prot_1movedto2' => '[[$1]] ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ [[$2]] କୠଘà­à¬žà­à¬šà¬¾à¬‡ ଦିଆଗଲା',
+'protect-badnamespace-title' => 'କିଳାହୋଇନଥିବା ନେମସà­à¬ªà­‡à¬¸',
+'protect-badnamespace-text' => 'à¬à¬¹à¬¿ ନେମସà­à¬ªà­‡à¬¸à¬¥à¬¿à¬¬à¬¾ ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬•à­ ସାଇତାଯାଇପାରିବ ନାହିଠ।',
'protect-legend' => 'କିଳଣାକୠଥୟ କରିବେ',
'protectcomment' => 'କାରଣ:',
'protectexpiry' => 'ଅଚଳ ହେବ:',
@@ -2332,6 +2380,7 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
'protect-level-sysop' => 'କେବଳ ପରିଛାମାନà¬à¬• ପାଇà¬',
'protect-summary-cascade' => 'କାସକେଡ଼ ହୋଇଥିବା',
'protect-expiring' => '$1 (ଇଉଟିସି)ରେ ଅଚଳ ହୋଇଯିବ',
+'protect-expiring-local' => '$1ରେ ଅଚଳ ହୋଇଯିବ',
'protect-expiry-indefinite' => 'ଅସିମୀତ',
'protect-cascade' => 'à¬à¬¹à¬¿ ଫରଦସହ ଜୋଡ଼ା ଫରଦସବà­à¬•à­ କିଳିଦିଅ (କାସକେଡ଼କରା ସà­à¬°à¬•à­à¬·à¬¾)',
'protect-cantedit' => 'ଆପଣ à¬à¬¹à¬¿ ସà­à¬°à¬•à­à¬·à¬¾ ସà­à¬¤à¬°à¬•à­ ବଦଳାଇ ପାରିବେ ନାହିà¬, କାହିà¬à¬•à¬¿ ନା à¬à¬¹à¬¾à¬•à­ ବଦଳାଇବା ପାଇଠଆପଣà¬à¬•à­ ଅନà­à¬®à¬¤à¬¿ ନାହିଠ.',
@@ -2392,7 +2441,6 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
'undeletereset' => 'ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨',
'undeleteinvert' => 'ବଛାଯାଇଥିବା ଲେଖାକୠଓଲଟେଇଦେବେ',
'undeletecomment' => 'କାରଣ:',
-'undeletedarticle' => '"[[$1]]" ମà­à¬•à­à¬³à¬¾à¬—ଲା',
'undeletedrevisions' => '{{PLURAL:$1|ଗୋଟିଠସଂକଳନ|$1 ଗୋଟି ସଂକଳନ}} ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଗଲା',
'undeletedrevisions-files' => '{{PLURAL:$1|ଗୋଟିଠସଂସà­à¬•à¬°à¬£|$1 ଗୋଟି ସଂସà­à¬•à¬°à¬£}} ଓ {{PLURAL:$2|ଗୋଟିଠଫାଇଲ|$2 ଗୋଟି ଫାଇଲ}} ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଗଲା',
'undeletedfiles' => '{{PLURAL:$1|ଗୋଟିଠଫାଇଲ|$1 ଗୋଟି ଫାଇଲ}} ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଗଲା',
@@ -2402,6 +2450,7 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
ନଗଦ ଲିଭାଇବା ଓ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ ପାଇଠ[[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନà­à¬¤à­ ।",
'undelete-header' => 'ନଗଦ ଲିଭାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬¬à­ ପାଇଠ[[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନà­à¬¤à­ ।',
+'undelete-search-title' => 'ଲିଭାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬•à­ ଖୋଜିବେ',
'undelete-search-box' => 'ଲିଭାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬•à­ ଖୋଜିବେ',
'undelete-search-prefix' => 'à¬à¬¹à¬¿ ଉପସରà­à¬— ସହିତ ଆରମà­à¬­ ହେଉଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬¬à­ ଦେଖାନà­à¬¤à­:',
'undelete-search-submit' => 'ଖୋଜିବା',
@@ -2411,6 +2460,7 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
'undelete-cleanup-error' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ହେଉନଥିବା ଅଭିଲେଖ ପୃଷà­à¬ à¬¾ "$1"କୠଲିଭାଇବାରେ ବିଫଳ ହେଲà­à¬ ।',
'undelete-missing-filearchive' => 'ଫାଇଲ ଅଭିଲେଖ ID $1 କୠପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରିବାରେ ଅସଫଳ ହେଲୠକାରଣ à¬à¬¹à¬¾ ଡାଟାବେସରେ ମିଳିଲା ନାହିଠ।
à¬à¬¹à¬¾ ବୋଧେ ଆଗରୠଲିଭାଯିବାରୠରୋକାଯାଇଛି ।',
+'undelete-error' => 'ଲିଭିଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬•à­ ଲେଉଟାଇବାରେ ଅସà­à¬¬à¬¿à¬§à¬¾',
'undelete-error-short' => 'ଲିଭାଯାଇଥିବା ଫାଇଲକୠଫେରାଇବାରେ ଅସà­à¬¬à¬¿à¬§à¬¾: $1',
'undelete-error-long' => 'ଲିଭାଯାଇଥିବା ତଳଲିଖିତ ଫାଇଲକୠଫେରାଇବାରେ ଅସà­à¬¬à¬¿à¬§à¬¾:
@@ -2532,6 +2582,7 @@ $1',
'blocklist-userblocks' => 'ଅଟକାଯାଇଥିବା ଖାତାସବୠଖୋଜିବେ',
'blocklist-tempblocks' => 'ଅସà­à¬¥à¬¾à­Ÿà­€ ଅଟକସବୠଲà­à¬šà¬¾à¬‡à¬¦à­‡à¬¬à­‡',
'blocklist-addressblocks' => 'ଗୋଟିକିଆ IP ଅଟକସବୠଲà­à¬šà¬¾à¬‡à¬¬à­‡',
+'blocklist-rangeblocks' => 'ରେଞà­à¬œ ବà­à¬²à¬•à¬¸à¬¬à­ ଲà­à¬šà¬¾à¬‡à¬¦à­‡à¬¬à­‡',
'blocklist-timestamp' => 'ସମୟଚିହà­à¬¨',
'blocklist-target' => 'ଲକà­à¬·',
'blocklist-expiry' => 'ଅଚଳ ହେବ',
@@ -2554,6 +2605,7 @@ $1',
'unblocklink' => 'ଛାଡ଼ିବା',
'change-blocklink' => 'ଓଗଳାକୠବଦଳାଇବେ',
'contribslink' => 'ଅବଦାନ',
+'emaillink' => 'ଇ-ମେଲ ପଠାଇବେ',
'autoblocker' => '"[[User:$1|$1]]"ଙà­à¬• ଦେଇ à¬à¬¹à¬¿ ମାତà­à¬° ଆପଣଙà­à¬• IP ଠିକଣାଟି ଆପେଆପେ ଅଟକାଯାଇଅଛି ।
$1ର ଅଟକ ପାଇଠଦିଆଯାଇଥିବା କାରଣଟି ହେଲା: "$2"',
'blocklogpage' => 'ଲଗଟିକୠଅଟକାଇଦେବେ',
@@ -2684,9 +2736,6 @@ $1ର ଅଟକ ପାଇଠଦିଆଯାଇଥିବା କାରଣଟି à
'movepage-page-moved' => '$1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ $2କୠଘà­à¬žà­à¬šà¬¾à¬‡ ଦିଆଗଲା ।',
'movepage-page-unmoved' => '$1 ପୃଷà­à¬ à¬¾à¬°à­ $2କୠଘà­à¬žà­à¬šà¬¾à¬¯à¬¾à¬‡ ପାରିବ ନାହିଠ।',
'movepage-max-pages' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ହେଲେ $1 ଗୋଟି {{PLURAL:$1|ପୃଷà­à¬ à¬¾|ପୃଷà­à¬ à¬¾}} ଘà­à¬žà­à¬šà¬¾à¬‡à¬¦à¬¿à¬†à¬¯à¬¾à¬‡à¬›à¬¿ ଓ ଆଉ ଅଧିକ ଆପେଆପେ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¦à¬¿à¬†à¬¯à¬¿à¬¬ ନାହିଠ।',
-'1movedto2' => '[[$1]]ରୠ[[$2]]କୠଘà­à¬žà­à¬šà¬¾à¬—ଲା',
-'1movedto2_redir' => '[[$1]]ରୠ[[$2]]କୠଲେଉଟାଇଦିଆଗଲା',
-'move-redirect-suppressed' => 'ଚା‌ପିରହିଥିବା ବସà­à¬¤à­à¬•à­ ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ କରାଗଲା',
'movelogpage' => 'ଲଗଟିକୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
'movelogpagetext' => 'ତଳେ ଘà­à¬žà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସବà­à¬¯à¬¾à¬• ପୃଷà­à¬ à¬¾à¬° ତାଲିକା ଦିଆଗଲା ।',
'movesubpage' => '{{PLURAL:$1|ସାନପୃଷà­à¬ à¬¾|ସାନପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨}}',
@@ -2699,7 +2748,7 @@ $1ର ଅଟକ ପାଇଠଦିଆଯାଇଥିବା କାରଣଟି à
ମà­à¬•à¬¾à¬® ପୃଷà­à¬ à¬¾ "[[:$1]]" ଟି ଆଗରୠଅଛି ।
ଆପଣ à¬à¬¹à¬¾à¬•à­ ଲିଭାଇ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾à¬•à­ ବାଟ କଢ଼ାଇବାକୠଚାହାନà­à¬¤à¬¿ କି?',
'delete_and_move_confirm' => 'ହà¬, à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଲିଭାଇଦେବେ',
-'delete_and_move_reason' => 'ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾à¬°à­‡ ସà­à¬¬à¬¿à¬§à¬¾ ନିମନà­à¬¤à­‡ ଲିଭାଇଦିଆଗଲା',
+'delete_and_move_reason' => '"[[$1]]" ପାଇଠପଥ ସଳଖ କରିବା ନିମନà­à¬¤à­‡ ଲିଭାଇଦିଆଗଲା',
'selfmove' => 'ମୂଳ ଓ ମà­à¬•à¬¾à¬® ନାମ à¬à¬•à¬¾ ଅଟନà­à¬¤à¬¿;
ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬ªà¬¾à¬°à¬¿à¬¬à­à¬ ନାହିଠ।',
'immobile-source-namespace' => '"$1" ନେମସà­à¬ªà­‡à¬¸ ଥିବା ପୃଷà­à¬ à¬¾à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬ªà¬¾à¬°à¬¿à¬¬à­à¬ ନାହିà¬',
@@ -2733,6 +2782,7 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'exportcuronly' => 'କେବଳ à¬à¬¬à­‡à¬•à¬° ସଂସà­à¬•à¬°à¬£à¬°à­‡ ଭରିଥାà¬, ପà­à¬°à¬¾ ଇତିହାସରେ ନà­à¬¹à­‡à¬',
'exportnohistory' => "----
'''ସୂଚନା:''' ଦେଖଣାରେ ଅସà­à¬¬à¬¿à¬§à¬¾ ହେବା କାରଣରୠପୃଷà­à¬ à¬¾à¬° ପà­à¬°à¬¾ ଇତିହାସ ରପà­à¬¤à¬¾à¬¨à¬¿ କରିବା ଅଚଳ କରାଯାଇଛି ।",
+'exportlistauthors' => 'ପà­à¬°à¬¤à¬¿ ପୃଷà­à¬ à¬¾ ନିମନà­à¬¤à­‡ ଅବଦାନକାରୀଙà­à¬•à¬° à¬à¬• ପà­à¬°à¬¾ ତାଲିକା ରଖିବେ',
'export-submit' => 'ପଠେଇବେ',
'export-addcattext' => 'ଶà­à¬°à­‡à¬£à­€à¬°à­ ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬•à­ ଯୋଡ଼ନà­à¬¤à­:',
'export-addcat' => 'ଯୋଡ଼ିବେ',
@@ -2765,6 +2815,8 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'thumbnail_error' => 'ନଖଦେଖଣା ତିଆରିବାରେ ଅସà­à¬¬à¬¿à¬§à¬¾: $1',
'djvu_page_error' => 'DjVu ପୃଷà­à¬ à¬¾ ସୀମା ବାହାରେ ରହିଅଛି',
'djvu_no_xml' => 'DjVu ଫାଇଲ ନିମନà­à¬¤à­‡ XML ଆଣିବାରେ ବିଫଳ ହେଲà­à¬',
+'thumbnail-temp-create' => 'à¬à¬• ଅସà­à¬¥à¬¾à­Ÿà­€ ଛୋଟଦେଖଣା ଫାଇଲ ତିଆରି କରିବାରେ ବିଫଳ ହେଲà­',
+'thumbnail-dest-create' => 'ଲକà­à¬·à¬¸à­à¬¥à¬³à¬°à­‡ ସାନଦେଖଣା ସାଇତିବାରେ ବିଫଳ ହେଲà­',
'thumbnail_invalid_params' => 'ଅଚଳ ସାନଦେଖଣା ପାରାମିଟର',
'thumbnail_dest_directory' => 'ମà­à¬•à¬¾à¬® ସୂଚି ତିଆରିବାରେ ବିଫଳ ହେଲà­à¬',
'thumbnail_image-type' => 'ଛବିର ପà­à¬°à¬•à¬¾à¬° ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬',
@@ -2813,6 +2865,8 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'import-token-mismatch' => 'ଅବଧି ତଥà­à­Ÿ ଲୋପପାଇଗଲାଣି ।
ଦୟାକରି ଆଉଥରେ ଚେଷà­à¬Ÿà¬¾ କରନà­à¬¤à­ ।',
'import-invalid-interwiki' => 'ଦିଆଯାଇଥିବା ଉଇକିରୠଆହରଣ କରାଯାଇପାରିବ ନାହିଠ।',
+'import-error-edit' => '"$1" ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଅଣାଯାଇନାହିଠକାରଣ ଆପଣଙà­à¬•à¬° à¬à¬¹à¬¾à¬•à­ ବଦଳାଇବା ଅଧିକାର ନାହିଠ।',
+'import-error-create' => '"$1" ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଅଣାଯାଇନାହିଠକାରଣ ଆପଣଙà­à¬•à¬° à¬à¬¹à¬¾à¬•à­ ତିଆରିକରିବା ଅଧିକାର ନାହିଠ।',
# Import log
'importlogpage' => 'ଇତିହାସ ଆହରଣ',
@@ -2941,9 +2995,6 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
# Patrol log
'patrol-log-page' => 'ଜଗିବା ଇତିହାସ',
'patrol-log-header' => 'à¬à¬¹à¬¾ à¬à¬• ଜଗାଯାଇଥିବା ସଂସà­à¬•à¬°à¬£à¬° ଇତିହାସ ।',
-'patrol-log-line' => '$2 ଦେଇ ଜଗାହୋଇଥିବା $3ର $1କୠସୂଚିତ କରାଗଲା',
-'patrol-log-auto' => '(ଆପେ ଆପେ)',
-'patrol-log-diff' => '$1 ସଙà­à¬•à¬³à¬¨',
'log-show-hide-patrol' => '$1 ଜଗିବା ଇତିହାସ',
# Image deletion
@@ -2970,11 +3021,11 @@ $1',
'file-info' => 'ଫାଇଲ ଆକାର: $1, MIME ପà­à¬°à¬•à¬¾à¬°: $2',
'file-info-size' => '$1 × $2 ପିକସେଲ, ଫାଇଲ ଆକାର: $3, à¬à¬®.ଆଇ.à¬à¬®.ଇର ପà­à¬°à¬•à¬¾à¬°: $4',
'file-info-size-pages' => '$1 × $2 ପିକà­à¬¸à­‡à¬², ଫାଇଲ ଆକାର: $3, MIME ପà­à¬°à¬•à¬¾à¬°: $4, $5 ଗୋଟି {{PLURAL:$5|ପୃଷà­à¬ à¬¾|ପୃଷà­à¬ à¬¾}}',
-'file-nohires' => '<small>ବଡ଼ ରେଜୋଲà­à¬¸à¬¨ ନାହିଠ।</small>',
+'file-nohires' => 'ବଡ଼ ରେଜୋଲà­à¬¸à¬¨ ନାହିଠ।',
'svg-long-desc' => 'SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକà­à¬¸à­‡à¬², ଫାଇଲ ଆକାର: $3',
'show-big-image' => 'ପà­à¬°à¬¾ ବଡ଼ ଆକାରରେ',
-'show-big-image-preview' => '<small>ଆଗଦେଖଣାର ଆକାର: $1 ।</small>',
-'show-big-image-other' => '<small>ବାକି ରେଜୋଲà­à¬¸à¬¨: $1.</small>',
+'show-big-image-preview' => 'à¬à¬¹à¬¿ ଦେଖଣାର ଆକାର: $1 ।',
+'show-big-image-other' => 'ବାକି {{PLURAL:$2|ରେଜୋଲà­à¬¸à¬¨|ରେଜୋଲà­à¬¸à¬¨}}: $1.',
'show-big-image-size' => '$1 × $2 ପିକà­à¬¸à­‡à¬²',
'file-info-gif-looped' => 'ଲà­à¬ª',
'file-info-gif-frames' => '$1 ଗୋଟି {{PLURAL:$1|ଫà­à¬°à­‡à¬®|ଫà­à¬°à­‡à¬®}}',
@@ -2994,6 +3045,13 @@ $1',
'bydate' => 'ତାରିଖ ଅନà­à¬¸à¬¾à¬°à­‡',
'sp-newimages-showfrom' => '$2, $1 ରେ ଆରମà­à¬­ ହେଉଥିବା ନୂଆ ଫାଇଲ ସବୠଦେଖାଇବେ',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 ସେକେଣà­à¬¡|$1 ସେକେଣà­à¬¡}}',
+'minutes' => '{{PLURAL:$1|$1 ମିନିଟ|$1 ମିନିଟ}}',
+'hours' => '{{PLURAL:$1|$1 ଘଣà­à¬Ÿà¬¾|$1 ଘଣà­à¬Ÿà¬¾}}',
+'days' => '{{PLURAL:$1|$1 ଦିନ|$1 ଦିନ}}',
+'ago' => '$1 ଆଗରà­',
+
# Bad image list
'bad_image_list' => 'ଗଢ଼ଣଟି à¬à¬®à¬¿à¬¤à¬¿ ହେବ:
@@ -3490,13 +3548,6 @@ $5
'scarytranscludefailed' => '[$1 ପାଇଠଛାଞà­à¬šà¬•à­ ପାଇବା ସମà­à¬­à¬¬ ହେଲାନାହିà¬]',
'scarytranscludetoolong' => '[URLଟି ଖà­à¬¬ ଲମà­à¬¬à¬¾]',
-# Trackbacks
-'trackbackbox' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬° ଅତୀତ ଓ ଇତିହାସ:<br />
-$1',
-'trackbackremove' => '([$1 ଲିଭାଇବା])',
-'trackbacklink' => 'ଅତୀତ ଇତିହାସ',
-'trackbackdeleteok' => 'ଅତୀତ ଇତିହାସ ସଫଳ ଭାବେ ଲିଭାଗଲା ।',
-
# Delete conflict
'deletedwhileediting' => "''' ସାବଧାନ ''' : ଆପଣ ବଦଳାଇବା ପାଇଠଆରମà­à¬­ କରିବା ପରେ ପରେ ହିଠà¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଲିଭାଇ ଦିଆଯାଇଛି !",
'confirmrecreate' => "ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ [[User:$1|$1]] ([[User talk:$1|talk]]) ଆପଣ ବଦଳାଇବା ଆରମà­à¬­ କରିବା ପରେ ପରେ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଲିଭାଇ ଦେଇଛନà­à¬¤à¬¿ ଓ à¬à¬¹à¬¾à¬° କାରଣ ହେଉଛି :
@@ -3579,6 +3630,9 @@ $1',
'watchlisttools-edit' => 'ଦେଖିବା ତାଲିକାଟିକୠଦେଖିବେ ଓ ବଦଳାଇବେ',
'watchlisttools-raw' => 'ଫାଙà­à¬•à¬¾ ଦେଖଣା ତାଲିକାଟିର ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିବେ',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ଆଲୋଚନା]])',
+
# Core parser functions
'unknown_extension_tag' => 'ଅଜଣା à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ ଚିହà­à¬¨ "$1"',
'duplicate-defaultsort' => '\'\'\'ସୂଚନା:\'\'\' ଆପେଆପେ କାମକରà­à¬¥à¬¿à¬¬à¬¾ "$2" ଆଗରୠଆପେ ଆପେ ସଜାଡà­à¬¥à¬¿à¬¬à¬¾ "$1"କୠବନà­à¬¦ କରିଦେଇଛି ।',
@@ -3634,8 +3688,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'specialpages' => 'ନିଆରା ପୃଷà­à¬ à¬¾',
'specialpages-note' => '----
* ସାଧାରଣ ବିଶେଷ ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨ ।
-* <span class="mw-specialpagerestricted">ସଂରକà­à¬·à¬¿à¬¤ ବିଶେଷ ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨ ।</span>
-* <span class="mw-specialpagecached">ସାଇତା ହୋଇଥିବା ପୃଷà­à¬ à¬¾ (ବୋଧେ ଆଉ ବà­à­Ÿà¬¬â€Œà¬¹à¬¾à¬° ହେଉନଥିବା) ।</span>',
+* <span class="mw-specialpagerestricted">କିଳାଯାଇଥିବା ବିଶେଷ ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨ ।</span>',
'specialpages-group-maintenance' => 'ରକà­à¬·à¬£à¬¾à¬¬à­‡à¬•à­à¬·à¬£à¬¾ ବିବରଣୀ',
'specialpages-group-other' => 'ବାକି ବିଶେଷ ପୃଷà­à¬ à¬¾',
'specialpages-group-login' => 'ଲଗଇନ / ଖାତା ଖୋଲିବେ',
@@ -3677,13 +3730,16 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'tags-hitcount' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବà­}}',
# Special:ComparePages
-'comparepages' => 'ବଦଳ ତà­à¬³à¬¨à¬¾ କରିବେ',
-'compare-selector' => 'ପୃଷà­à¬ à¬¾ ସଂସà­à¬•à¬°à¬£ ତà­à¬³à¬¨à¬¾ କରିବେ',
-'compare-page1' => 'ପୃଷà­à¬ à¬¾ à­§',
-'compare-page2' => 'ପୃଷà­à¬ à¬¾ à­¨',
-'compare-rev1' => 'ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à­à¬¤à¬¿à­§',
-'compare-rev2' => 'ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à­à¬¤à¬¿ à­¨',
-'compare-submit' => 'ତà­à¬³à¬¨à¬¾',
+'comparepages' => 'ବଦଳ ତà­à¬³à¬¨à¬¾ କରିବେ',
+'compare-selector' => 'ପୃଷà­à¬ à¬¾ ସଂସà­à¬•à¬°à¬£ ତà­à¬³à¬¨à¬¾ କରିବେ',
+'compare-page1' => 'ପୃଷà­à¬ à¬¾ à­§',
+'compare-page2' => 'ପୃଷà­à¬ à¬¾ à­¨',
+'compare-rev1' => 'ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à­à¬¤à¬¿à­§',
+'compare-rev2' => 'ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à­à¬¤à¬¿ à­¨',
+'compare-submit' => 'ତà­à¬³à¬¨à¬¾',
+'compare-invalid-title' => 'ଆପଣ ଦରà­à¬¶à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଶିରୋନାମା ବୈଧ ନà­à¬¹à­‡à¬ ।',
+'compare-title-not-exists' => 'ଆପଣ ଦରà­à¬¶à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଶିରୋନାମାଟି ଆଦୌ ନାହିଠ।',
+'compare-revision-not-exists' => 'ଆପଣ ଦରà­à¬¶à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à­à¬¤à¬¿ ଆଦୌ ନାହିଠ।',
# Database error messages
'dberr-header' => 'à¬à¬¹à¬¿ ଉଇକିରେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ଅଛି ।',
@@ -3711,4 +3767,88 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'sqlite-has-fts' => 'ପà­à¬°à¬¾ ଟେକà­à¬¸à­à¬Ÿ ଖୋଜା ସହଯୋଗ ସହିତ $1',
'sqlite-no-fts' => 'ପà­à¬°à¬¾ ଟେକà­à¬¸à­à¬Ÿ ଖୋଜା ସହଯୋଗ ବିନା $1',
+# New logging system
+'logentry-delete-delete' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇଦେଲେ',
+'logentry-delete-restore' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କଲେ',
+'logentry-delete-event' => '$1 $3 ବେଳେ {{PLURAL:$5|à¬à¬• ଇତିହାସର ଘଟଣାର|$5 ଇତିହାସର ଘଟଣାମାନଙà­à¬•à¬°}} ଦେଖଣା ବଦଳାଇ ଦେଲେ: $4',
+'logentry-delete-revision' => '$1 $3 ପୃଷà­à¬ à¬¾à¬°à­‡ {{PLURAL:$5|ସଙà­à¬•à¬³à¬¨à¬Ÿà¬¿à¬à¬°|$5 ସଙà­à¬•à¬³à¬¨à¬®à¬¾à¬¨à¬™à­à¬•à¬°}} ଦେଖଣା ବଦଳାଇ ଦେଲେ: $4',
+'logentry-delete-event-legacy' => '$1 $3 ରେ ଇତିହାସର ଘଟଣାସବà­à¬° ଦେଖଣା ବଦଳାଇଦେଲେ',
+'logentry-delete-revision-legacy' => '$1 $3 ପୃଷà­à¬ à¬¾à¬°à­‡ ଇତିହାସର ଘଟଣାସବà­à¬° ଦେଖଣା ବଦଳାଇଦେଲେ',
+'logentry-suppress-delete' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଚପାଇଦେଲେ',
+'logentry-suppress-event' => '$3 ବେଳେ $1 ଗୋପନ ଭାବରେ {{PLURAL:$5|ଇତିହାସର ଘଟଣାଟିà¬à¬°|$5 ଇତିହାସର ଘଟଣାବଳୀର}} ଦେଖଣା ବଦଳାଇଦେଲେ: $4',
+'logentry-suppress-revision' => '$1 ଗୋପନ ଭାବରେ $3 ପୃଷà­à¬ à¬¾à¬°à­‡ {{PLURAL:$5|ଇତିହାସର ଘଟଣାଟିà¬à¬°|$5 ଇତିହାସର ଘଟଣାବଳୀର}} ଦେଖଣା ବଦଳାଇଦେଲେ: $4',
+'logentry-suppress-event-legacy' => '$1 ଗୋପନ ଭାବରେ ବଦଳାଇଦେଲେ $3ରେ ଥିବା ଇତିହାସ ଘଟଣାମାନଙà­à¬•à¬° ଦେଖଣା ବଦଳାଇଦେଲେ',
+'logentry-suppress-revision-legacy' => '$1 ଗୋପନ ଭାବରେ ବଦଳାଇଦେଲେ $3 ପୃଷà­à¬ à¬¾à¬°à­‡ ଥିବା ଇତିହାସ ଘଟଣାମାନଙà­à¬•à¬° ଦେଖଣା ବଦଳାଇଦେଲେ',
+'revdelete-content-hid' => 'ଭିତର ଭାଗ ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬…ଛି',
+'revdelete-summary-hid' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ସାରକଥା ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬…ଛି',
+'revdelete-uname-hid' => 'ଇଉଜର ନାମ ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬…ଛି',
+'revdelete-content-unhid' => 'ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଭିତର ଭାଗ ଦେଖାଇବେ',
+'revdelete-summary-unhid' => 'ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ସାରକଥା ଦେଖାଇବେ',
+'revdelete-uname-unhid' => 'ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଇଉଜର ନାମ ଦେଖାଇବେ',
+'revdelete-restricted' => 'ପରିଛାମାନଙà­à¬• ନିମନà­à¬¤à­‡ ଥିବା ବାରଣ',
+'revdelete-unrestricted' => 'ପରିଛାମାନଙà­à¬• ନିମନà­à¬¤à­‡ ଥିବା ବାରଣ ବାହାର କରିଦିଆଗଲା',
+'logentry-move-move' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $4କୠଘà­à¬žà­à¬šà¬¾à¬‡à¬²à­‡',
+'logentry-move-move-noredirect' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $4କୠପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ ବିନା ଘà­à¬žà­à¬šà¬¾à¬‡à¬²à­‡',
+'logentry-move-move_redir' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $4କୠପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ ଛାଡ଼ି ଘà­à¬žà­à¬šà¬¾à¬‡à¬²à­‡',
+'logentry-move-move_redir-noredirect' => '$1 $3 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $4କୠପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£à¬•à­ ଛାଡ଼ି ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ ବିନା ଘà­à¬žà­à¬šà¬¾à¬‡à¬²à­‡',
+'logentry-patrol-patrol' => '$1 $3 ପୃଷà­à¬ à¬¾à¬° $4 ତମ ସଙà­à¬•à¬³à¬¨à¬•à­ ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କଲେ',
+'logentry-patrol-patrol-auto' => '$1 ଆପେଆପେ $3 ପୃଷà­à¬ à¬¾à¬° $4 ତମ ସଙà­à¬•à¬³à¬¨à¬•à­ ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କଲେ',
+'logentry-newusers-newusers' => '$1 ନୂଆ ସଭà­à­Ÿ ଖାତାଟିଠତିଆରି କଲେ',
+'logentry-newusers-create' => '$1 ନୂଆ ସଭà­à­Ÿ ଖାତାଟିଠତିଆରି କଲେ',
+'logentry-newusers-create2' => '$1 ନୂଆ ସଭà­à­Ÿ ଖାତାଟିଠ$3 ତିଆରି କଲେ',
+'logentry-newusers-autocreate' => '$1 ଖାତାଟି ଆପେଆପେ ତିଆରିହେଲା',
+'newuserlog-byemail' => 'ଇ-ମେଲରେ ପାସୱାରà­à¬¡à¬¼ ପଠାଇଦିଆଗଲା',
+
+# Feedback
+'feedback-bugornote' => 'ଦୟାକରି ଆପଣ à¬à¬• କାରିଗରି ଅସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿à¬ ଜଣାଇବା ପାଇଠଚାହà­à¬à¬¥à¬¿à¬²à­‡ ଦୟାକରି [$1 à¬à¬ à¬¾à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿ ଜଣାନà­à¬¤à­] ।
+ଅଥବା, ଆପଣ ତଳେ ଠିଆ ସହଜ ଆବେଦନ ପତà­à¬°à¬Ÿà¬¿ ପà­à¬°à¬£ କରିପାରିବେ । ଆପଣଙà­à¬• ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ନାମ ଓ ଆପଣ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬¥à¬¿à¬¬à¬¾ ବà­à¬°à¬¾à¬‰à¬œà¬° ଅନà­à¬¸à¬¾à¬°à­‡ ଆପଣଙà­à¬• ମତାମତ "[$3 $2]"ରେ ଯୋଡ଼ାଯିବ ।',
+'feedback-subject' => 'ବିଷୟ:',
+'feedback-message' => 'ଖବର:',
+'feedback-cancel' => 'ନାକଚ',
+'feedback-submit' => 'ମତାମତ ଦିଅନà­à¬¤à­',
+'feedback-adding' => 'ପୃଷà­à¬ à¬¾à¬°à­‡ ମତାମତ ଦେଉଛି...',
+'feedback-error1' => 'ଭà­à¬²: API ରୠଅଚିହà­à¬¨à¬¾ ଫଳାଫଳ',
+'feedback-error2' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ବିଫଳ ହେଲା',
+'feedback-error3' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: API ରୠକିଛି ଉତà­à¬¤à¬° ମିଳିଲା ନାହିà¬',
+'feedback-thanks' => 'ଧନà­à­Ÿà¬¬à¬¾à¬¦ ! ଆପଣଙà­à¬•à¬° ମତାମତ "[$2 $1]" ପୃଷà­à¬ à¬¾à¬°à­‡ ଦରà­à¬¶à¬¾à¬¯à¬¾à¬‡à¬›à¬¿ ।',
+'feedback-close' => 'ହୋଇଗଲା',
+'feedback-bugcheck' => 'ବହà­à¬¤ ଭଲ ! ଖାଲି ଦେଖିଦିଅନà­à¬¤à­ ଯେ à¬à¬¹à¬¾ ଆଗରୠଥିବା [$1 known bugs] ମଧà­à­Ÿà¬°à­ ନà­à¬¹à­‡à¬ ତ ।',
+'feedback-bugnew' => 'ମà­à¬ ଯାଞà­à¬š କରିଦେଲି । ନୂତନ ଅସà­à¬¬à¬¿à¬§à¬¾à¬° ବିବରଣ କରନà­à¬¤à­ ।',
+
+# API errors
+'api-error-badaccess-groups' => 'ଆପଣଙà­à¬•à­ à¬à¬¹à¬¿ ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୠଅନà­à¬®à¬¤à¬¿ ଦିଆଯାଇନାହିଠ।',
+'api-error-badtoken' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ଖରାପ ଟୋକନ ।',
+'api-error-copyuploaddisabled' => 'URL ଦେଇ ଅପଲୋଡ଼ କରିବା à¬à¬¹à¬¿ ସରà­à¬­à¬°à¬°à­‡ ଅଚଳ କରାଯାଇଅଛି ।',
+'api-error-duplicate' => 'à¬à¬¹à¬¿ ସାଇଟରେ ସେହି à¬à¬•à¬¾ ତଥà­à­Ÿ ଥିବା {{PLURAL:$1| [$2 ଆଉ à¬à¬• ଫାଇଲ] ରହିଅଛି|[$2 ଆଉ କିଛି ଫାଇଲ] ରହି ଅଛନà­à¬¤à¬¿}} ।',
+'api-error-duplicate-archive' => 'ସେହି ସାଇଟରେ ସେହି à¬à¬•à¬¾ ଭିତର ଭାଗ ସହିତ ଆଗରୠ{{PLURAL:$1|[$2 ଆଉ ଫାଇଲଟିà¬] ଥିଲା|[$2 ଆଉ କେତେକ ଫାଇଲ] ଥିଲା}}, କିନà­à¬¤à­ {{PLURAL:$1|ତାହାକà­|ସେସବà­à¬•à­}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।',
+'api-error-duplicate-archive-popup-title' => 'ଆଗରୠଲିଭାଯାଇଥିବା ନକଲି {{PLURAL:$1|ଗୋଟି ଫାଇଲ|ଗୋଟି ଫାଇଲ}}',
+'api-error-duplicate-popup-title' => 'ନକଲି {{PLURAL:$1|ଗୋଟି ଫାଇଲ|ଗୋଟି ଫାଇଲ}}',
+'api-error-empty-file' => 'ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ଖାଲି ଅଟେ ।',
+'api-error-fetchfileerror' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: à¬à¬¹à¬¿ ଫାଇଲଟି ପାଖରେ ପହଞà­à¬šà¬¿à¬¬à¬¾ ବେଳେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ହେଲା ।',
+'api-error-file-too-large' => 'ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ବିରାଟ ଅଟେ ।',
+'api-error-filename-tooshort' => 'ଫାଇଲ ନାମଟି ଖà­à¬¬ ଛୋଟ ।',
+'api-error-filetype-banned' => 'à¬à¬¹à¬¿ ପà­à¬°à¬•à¬¾à¬°à¬° ଫାଇଲ ବାରଣ କରାଯାଇଅଛି ।',
+'api-error-filetype-missing' => 'ଫାଇଲଟିର à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ ନାହିଠ।',
+'api-error-hookaborted' => 'à¬à¬• à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ ହà­à¬• ଦେଇ ଆପଣ କରà­à¬¥à¬¿à¬¬à¬¾ ବଦଳଟି ବନà­à¬¦ କରିଦିଆଗଲା ।',
+'api-error-http' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ସରà­à¬­à¬° ସହ ଯୋଡ଼ି ହେଉନାହିଠ।',
+'api-error-illegal-filename' => 'à¬à¬¹à¬¿ ଫାଇଲ ନାମଟି ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।',
+'api-error-internal-error' => 'ଆଭà­à­Ÿà¬¨à­à¬¤à¬°à­€à¬£ ଅସà­à¬¬à¬¿à¬§à¬¾: à¬à¬¹à¬¿ ଉଇକିରେ ଆପଣଙà­à¬• ଅପଲୋଡ଼ କରିବା କାଳରେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ଘଟିଲା ।',
+'api-error-invalid-file-key' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ଫାଇଲଟି ଅସà­à¬¥à¬¾à­Ÿà­€ ସାଇତାଘର ଭିତରୠମିଳିଲାନାହିଠ।',
+'api-error-missingparam' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ହଜିଯାଇଥିବା ପାରାମିଟର ସବà­à¬•à­ ଅନà­à¬°à­‹à¬§ କà­à¬°à¬®à­‡ ଦେଖାଇଦିଆଗଲା ।',
+'api-error-missingresult' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ନକଲ କରିବା ଠିକରେ ହେଲାକି ନାହିଠଜାଣି ପାରିଲା ନାହିଠ।',
+'api-error-mustbeloggedin' => 'ଫାଇଲ ଅପଲୋଡ଼ କରିବା ନିମନà­à¬¤à­‡ ଆପଣଙà­à¬•à­ ଲଗ ଇନ କରିବାକୠପଡ଼ିବ ।',
+'api-error-mustbeposted' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: କରାଯାଇଥିବା ଅନà­à¬°à­‹à¬§ ପାଇଠHTTP POST ଦରକାର ।',
+'api-error-noimageinfo' => 'ଅପଲୋଡ଼ ସଫଳ ହେଲା, କିନà­à¬¤à­ ସରà­à¬­à¬°à¬Ÿà¬¿ ଆମà­à¬­à¬™à­à¬•à­ ଫାଇଲଟୀ ବାବଦରେ କିଛି ବିବରଣୀ ଦେଲା ନାହିଠ।',
+'api-error-nomodule' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ଅପଲୋଡ଼ ମୋଡà­à¬² ଠିକ କରାଯାଇନାହିଠ।',
+'api-error-ok-but-empty' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ସରà­à¬­à¬° ଠାରୠକିଛି ଖବର ନାହିଠ।',
+'api-error-overwrite' => 'ଆଗରà­à¬¥à¬¿à¬¬à¬¾ à¬à¬• ଫାଇଲ ଉପରେ ମଡ଼ାଇବା ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।',
+'api-error-stashfailed' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ସରà­à¬­à¬° ଅସà­à¬¥à¬¾à­Ÿà­€ ଫାଇଲକୠସାଇତି ପାରିଲା ନାହିଠ।',
+'api-error-timeout' => 'ସରà­à¬­à¬° à¬à¬• ସୀମିତ କାଳ ଭିତରେ ଉତà­à¬¤à¬° ଦେଲାନାହିଠ।',
+'api-error-unclassified' => 'à¬à¬• ଅଜଣା ଅସà­à¬¬à¬¿à¬§à¬¾ ଘଟିଲା ।',
+'api-error-unknown-code' => 'ଅଜଣା ଅସà­à¬¬à¬¿à¬§à¬¾: "$1"',
+'api-error-unknown-error' => 'ଆଭà­à­Ÿà¬¨à­à¬¤à¬°à­€à¬£ ଅସà­à¬¬à¬¿à¬§à¬¾: ଫାଇଲଟି ଅପଲୋଡ଼ କରିବା କାଳରେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ଘଟିଲା ।',
+'api-error-unknown-warning' => 'ଅଜଣା ଚେତାବନୀ: $1',
+'api-error-uploaddisabled' => 'ଉଇକିରେ ଅପଲୋଡ଼ କରିବା ଅଚଳ କରାଯାଇଅଛି ।',
+'api-error-verification-error' => 'à¬à¬¹à¬¿ ଫାଇଲଟି ବୋଧ ହà­à¬ ନଷà­à¬Ÿ ହୋଇଯାଇଅଛି କିମà­à¬¬à¬¾ ଭà­à¬² à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ ଦିଆଯାଇଅଛି ।',
+
);
diff --git a/languages/messages/MessagesOs.php b/languages/messages/MessagesOs.php
index 8b356647..dcd01b7c 100644
--- a/languages/messages/MessagesOs.php
+++ b/languages/messages/MessagesOs.php
@@ -17,16 +17,16 @@
$fallback = 'ru';
$namespaceNames = array(
- NS_MEDIA => 'Media',
+ NS_MEDIA => 'Медиа',
NS_SPECIAL => 'Сæрмагонд',
NS_TALK => 'Тæрхон',
NS_USER => 'Ðрхайæг',
NS_USER_TALK => 'Ðрхайæджы_ныхаÑ',
- NS_PROJECT_TALK => 'ДиÑкуÑÑи_$1',
- NS_FILE => 'Ðыв',
- NS_FILE_TALK => 'Ðывы_тæрхон',
+ NS_PROJECT_TALK => '{{GRAMMAR:genitive|$1}}_тæрхон',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файлы_тæрхон',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'Тæрхон_MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki-йы_тæрхон',
NS_TEMPLATE => 'Шаблон',
NS_TEMPLATE_TALK => 'Шаблоны_тæрхон',
NS_HELP => 'ÆххуыÑ',
@@ -38,18 +38,24 @@ $namespaceNames = array(
$namespaceAliases = array(
'ДиÑкуÑÑи' => NS_TALK,
'Ðрхайæджы_диÑкуÑÑи' => NS_USER_TALK,
+ 'ДиÑкуÑÑи_$1' => NS_PROJECT_TALK,
+ 'Ðыв' => NS_FILE,
+ 'Ðывы_тæрхон' => NS_FILE_TALK,
'Ðывы_тыххæй_диÑкуÑÑи' => NS_FILE_TALK,
'ДиÑкуÑÑи_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'Тæрхон_MediaWiki' => NS_MEDIAWIKI_TALK,
'Шаблоны_тыххæй_диÑкуÑÑи' => NS_TEMPLATE_TALK,
'ÆххуыÑÑ‹_тыххæй_диÑкуÑÑи' => NS_HELP_TALK,
'Категорийы_тыххæй_диÑкуÑÑи' => NS_CATEGORY_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
$magicWords = array(
- 'redirect' => array( '0', '#РÐРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
- 'img_right' => array( '1', 'рахиз', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'галиу', 'Ñлева', 'left' ),
+ 'redirect' => array( '0', '#РÐРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'img_right' => array( '1', 'рахиз', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'галиу', 'Ñлева', 'left' ),
);
$linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|Ñ‘|ж|з|и|й|к|л|м|н|о|п|Ñ€|Ñ|Ñ‚|у|Ñ„|Ñ…|ц|ч|ш|щ|ÑŠ|Ñ‹|ÑŒ|Ñ|ÑŽ|Ñ|“|»)+)(.*)$/sDu';
@@ -347,7 +353,6 @@ $messages = array(
Æндæр иÑчи йæ аппæрÑта мыййаг.',
'badtitle' => 'Æнæмбæлон Ñæргонд',
'viewsource' => 'Код кæÑын',
-'viewsourcefor' => 'Ð¤Ð°Ñ€Ñ Â«$1»',
'protectedpagetext' => 'Ðцы Ñ„Ð°Ñ€Ñ Ñƒ ивынæй æхгæд.',
'viewsourcetext' => 'Ðцы фарÑÑ‹ код фенæн æмæ халдих кæнæн иÑ:',
'ns-specialprotected' => 'Сæрмагонд фæрÑтæ ({{ns:special}}) баивæн нæй.',
@@ -407,6 +412,9 @@ $messages = array(
'passwordreset-emailelement' => 'Ðрхайæджы ном: $1
РæÑтæгмæ пароль: $2',
+# Special:ChangeEmail
+'changeemail-cancel' => 'Ðыууадзын',
+
# Edit page toolbar
'bold_sample' => 'Бæзджын текÑÑ‚',
'bold_tip' => 'Бæзджын текÑÑ‚',
@@ -440,7 +448,6 @@ $messages = array(
'summary-preview' => 'Ивд афыÑÑ‚ уыдзæн:',
'blockedtitle' => 'Ðрхайæг хъодыгонд æрцыд',
'blockednoreason' => 'Ð°Ñ…Ñ…Ð¾Ñ Ð°Ð¼Ñ‹Ð½Ð´ не ’рцыд',
-'whitelistedittitle' => 'Ðцы текÑÑ‚ ивынмæ хъуамæ дæхи бацамонай ÑиÑтемæйæн',
'loginreqtitle' => 'Хъæуы бахизын',
'accmailtitle' => 'Пароль рарвыÑÑ‚ у.',
'newarticle' => '(Ðог)',
@@ -512,10 +519,6 @@ $messages = array(
'revdel-restore-deleted' => 'хафт ивдтытæ',
'revdel-restore-visible' => 'зынгæ ивдтытæ',
'pagehist' => 'ФарÑÑ‹ иÑтори',
-'revdelete-content' => 'мидиÑ',
-'revdelete-summary' => 'ивддзинады мидиÑ',
-'revdelete-uname' => 'архайæджы ном',
-'revdelete-hid' => 'ИÑÑ‚ $1',
'revdelete-reasonotherlist' => 'Æндæр аххоÑ',
'revdelete-offender' => 'ФарÑÑ‹ фæлтæры автор:',
@@ -828,7 +831,7 @@ $3',
'longpages' => 'Даргъ фæрÑтæ',
'protectedpages' => 'Æхгæд фæрÑтæ',
'listusers' => 'Ðрхайджыты номхыгъд',
-'usercreated' => 'Ð¤Ã¦Ð·Ñ‹Ð½Ð´Ð¸Ñ $1, {{grammar:superessive|$2}}',
+'usercreated' => '{{GENDER:$3|ФæзындиÑ}} $1, {{grammar:superessive|$2}}',
'newpages' => 'Ðог фæрÑтæ',
'newpages-username' => 'Ðрхайæг:',
'ancientpages' => 'Зæронддæр фæрÑтæ',
@@ -875,8 +878,7 @@ $3',
'listusers-submit' => 'РавдиÑын',
# Special:Log/newusers
-'newuserlogpage' => 'Ðрхайджыты фæзындты лог',
-'newuserlog-create-entry' => 'Ðог архайæджы аккаунт',
+'newuserlogpage' => 'Ðрхайджыты фæзындты лог',
# Special:ListGroupRights
'listgrouprights-group' => 'Къорд',
@@ -919,7 +921,6 @@ $3',
'delete-confirm' => 'Схаф "$1"',
'actioncomplete' => 'ÆххæÑÑ‚',
'actionfailed' => 'Ðæ рауадиÑ',
-'deletedarticle' => 'Ñхафта "[[$1]]"',
'dellogpage' => 'Ðппарыны лог',
'deletionlog' => 'аппарыны лог',
'deletecomment' => 'ÐххоÑ:',
@@ -1020,16 +1021,14 @@ $3',
'databasenotlocked' => 'Рарддон æхгæд неу.',
# Move page
-'movearticle' => 'СтатьÑйы ном баив',
-'movenologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
-'newtitle' => 'Ðог ном',
-'move-watch' => 'Ðцы фарÑмæ дæ цæÑÑ‚ æрдар',
-'movepagebtn' => 'ФарÑÑ‹ ном ивын',
-'1movedto2_redir' => "[[$1]] æрвыÑтимæ хаÑÑ‚ æрцыд [[$2]]'мæ",
-'move-redirect-suppressed' => 'рарвыÑÑ‚Ñ‹ Ñ„Ð°Ñ€Ñ Ð½Ã¦ бахъуыд',
-'movelogpage' => 'Ðомивдтыты лог',
-'movereason' => 'ÐххоÑ:',
-'revertmove' => 'раивын',
+'movearticle' => 'СтатьÑйы ном баив',
+'movenologin' => 'СиÑтемæйæн дæхи нæ бацамыдтай',
+'newtitle' => 'Ðог ном',
+'move-watch' => 'Ðцы фарÑмæ дæ цæÑÑ‚ æрдар',
+'movepagebtn' => 'ФарÑÑ‹ ном ивын',
+'movelogpage' => 'Ðомивдтыты лог',
+'movereason' => 'ÐххоÑ:',
+'revertmove' => 'раивын',
# Export
'export' => 'ФæрÑÑ‚Ñ‹ ÑкÑпорт',
@@ -1119,11 +1118,6 @@ $3',
'skinname-myskin' => 'Мæхи',
'skinname-chick' => 'Карк',
-# Patrol log
-'patrol-log-line' => 'баныÑан кодта $1 $2 фарÑæй патрулгондæй $3',
-'patrol-log-auto' => '(автоматон)',
-'patrol-log-diff' => 'ивд $1',
-
# Browsing diffs
'previousdiff' => '↠Зæронддæр ивд',
'nextdiff' => 'ФæÑтæдæр ивд →',
@@ -1132,6 +1126,7 @@ $3',
'thumbsize' => 'Къаддæргонды бæрц:',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|фарÑ|фарÑÑ‹}}',
'file-info-size' => '$1 × $2 пикÑелы, файлы уæз: $3, MIME тип: $4',
+'file-nohires' => 'Ðæй ын Ñтырдæр фæлтæр .',
'svg-long-desc' => 'SVG файл, номиналон $1 × $2 пикÑелы, файлы бæрц: $3',
'show-big-image' => 'Æнæхъæнæй',
@@ -1229,4 +1224,9 @@ $3',
# HTML forms
'htmlform-selectorother-other' => 'Æндæр',
+# Feedback
+'feedback-subject' => 'Сæр:',
+'feedback-message' => 'ФыÑтæг:',
+'feedback-close' => 'ÆххæÑÑ‚',
+
);
diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php
index c451b538..0885cf17 100644
--- a/languages/messages/MessagesPa.php
+++ b/languages/messages/MessagesPa.php
@@ -52,6 +52,8 @@ $digitTransformTable = array(
);
$linkTrail = '/^([à¨à¨‚ਃਅਆਇਈਉਊà¨à¨à¨“ਔਕਖਗਘਙਚਛਜà¨à¨žà¨Ÿà¨ à¨¡à¨¢à¨£à¨¤à¨¥à¨¦à¨§à¨¨à¨ªà¨«à¨¬à¨­à¨®à¨¯à¨°à¨²à¨³à¨µà¨¶à¨¸à¨¹à¨¼à¨¾à¨¿à©€à©à©‚ੇੈੋੌà©à©™à©šà©›à©œà©žà©°à©±à©²à©³a-z]+)(.*)$/sDu';
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'ਅੰਡਰ-ਲਾਈਨ ਲਿੰਕ:',
@@ -323,9 +325,9 @@ A list of valid special pages can be found at [[Special:SpecialPages]].',
'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ: $1',
'badtitle' => 'ਗਲਤ ਟਾਇਟਲ',
'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
-'viewsourcefor' => '$1 ਲਈ',
'protectedpagetext' => 'ਇਸ ਪੰਨੇ ਨੂੰ à¨à¨¡à¨¿à¨Ÿ ਕਰਨ ਦੀ ਮਨਾਹੀ ਹੈ।',
'viewsourcetext' => 'ਤà©à¨¸à©€à¨‚ ਇਸ ਪੰਨੇ ਦਾ ਸੋਮਾ ਦੇਖ ਸਕਦੇ ਹੋ ਤੇ ਉਸ ਦਾ ਉਤਾਰਾ ਵੀ ਲੈ ਸਕਦੇ ਹੋ।',
+'viewyourtext' => 'ਤà©à¨¸à©€à¨‚ ਇਸ ਪੰਨੇ ਬਾਰੇ " ਆਪਣੇ ਸੰਪਾਦਨਾਂ " ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ ਤੇ ਉਨà©à¨¹à¨¾à¨‚ ਦਾ ਉਤਾਰਾ ਵਿ ਲੈ ਸਕਦੇ ਹੋ।',
'protectedinterface' => 'ਇਹ ਪੰਨਾ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦਾ ਮੂਲ ਪਾਠ ਹੈ ,ਅਤੇ ਦà©à¨°à¨µà¨°à¨¤à©Œà¨‚ ਤੌਂ ਬਚਾਅ ਲਈ ਰਾਖਵਾਂ ਕੀਤਾ ਗਿਆ ਹੈ।',
'editinginterface' => "'''ਚਿਤਾਵਨੀ''' ਤà©à¨¸à©€à¨‚ à¨à¨¸à©‡ ਪੰਨੇ ਨੂੰ ਬਦਲ ਰਹੇ ਹੋ ਜੋ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦੇ ਮੂਲ ਪਾਠ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।
ਇਸ ਪੰਨੇ ਦੇ ਬਦਲਾਅ ਦà©à¨¸à¨°à©‡ ਵਰਤੋਂ ਕਰਣ ਵਾਲਿਆਂ ਲਈ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਇੰਟਰਫਲੇਸ ਦੀ ਸ਼ਕਲ ਤੇ ਅਸਰ ਪਾ ਦੇਣਗੇ।ਅਨà©à¨µà¨¾à¨¦ ਕਰਣ ਲਈ ,ਕਿਰਪਾ ਕਰਕੇ [//translatewiki.net/wiki/Main_Page?setlang=pa ਟà©à¨°à¨¾à¨‚ਸਲੇਟਵਿਕੀ.ਨੈਟ] ਦੀ ਵਰਤੌਂ ਕਰੋ,ਇਹ ਮੀਡੀਆਵਿਕੀ ਦੀ ਸਥਾਨਕੀਕਰਣ ਯੋਜਨਾ ਹੈ।",
@@ -450,7 +452,6 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨà©à¨•à¨¸à¨¾à¨¨ ਤੋਂ ਬਚਣ ਲਈ, $
'summary-preview' => 'ਸੰਖੇਪ à¨à¨²à¨•:',
'subject-preview' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ à¨à¨²à¨•:',
'blockedtitle' => 'ਯੂਜ਼ਰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ',
-'whitelistedittitle' => 'ਸੋਧਣ ਲਈ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ',
'whitelistedittext' => 'ਪੇਜ ਸੋਧਣ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° $1 ਕਰਨਾ ਪਵੇਗਾ।',
'nosuchsectiontitle' => 'ਇੰਠਦਾ ਕੋਈ ਸ਼ੈਕਸ਼ਨ ਨਹੀਂ ਹੈ।',
'loginreqtitle' => 'ਲਾਗਇਨ ਚਾਹੀਦਾ ਹੈ',
@@ -529,8 +530,6 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨà©à¨•à¨¸à¨¾à¨¨ ਤੋਂ ਬਚਣ ਲਈ, $
'revdel-restore-visible' => 'ਦà©à¨°à¨¿à¨¸à¨¼à¨Ÿ ਬਦਲਾਅ',
'pagehist' => 'ਪੇਜ ਦਾ ਅਤੀਤ',
'deletedhist' => 'ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ',
-'revdelete-content' => 'ਸਮਗੱਰੀ',
-'revdelete-summary' => 'ਸੰਖੇਪ ਸੋਧ',
# Merge log
'revertmerge' => 'ਬਿਨ-ਮਿਲਾਨ',
@@ -859,9 +858,6 @@ to upload files.',
'listusers-submit' => 'ਵੇਖੋ',
'listusers-noresult' => 'ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਲੱਭਿਆ।',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'ਨਵਾਂ ਯੂਜ਼ਰ ਅਕਾਊਂਟ',
-
# Special:ListGroupRights
'listgrouprights-group' => 'ਗਰà©à©±à¨ª',
'listgrouprights-members' => '(ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ)',
@@ -909,7 +905,6 @@ to upload files.',
'delete-confirm' => '"$1" ਹਟਾਓ',
'delete-legend' => 'ਹਟਾਓ',
'actioncomplete' => 'à¨à¨•à¨¸à¨¼à¨¨ ਪੂਰਾ ਹੋਇਆ',
-'deletedarticle' => '"[[$1]]" ਹਟਾਇਆ',
'dellogpage' => 'ਹਟਾਉਣ ਲਾਗ',
'deletecomment' => 'ਕਾਰਨ:',
'deleteotherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
@@ -1135,9 +1130,6 @@ to upload files.',
'skinname-chick' => 'ਚੀਚਕ',
'skinname-simple' => 'ਸੈਂਪਲ',
-# Patrol log
-'patrol-log-auto' => '(ਆਟੋਮੈਟਿਕ)',
-
# Browsing diffs
'previousdiff' => '↠ਪà©à¨°à¨¾à¨£à©€ ਸੋਧ',
'nextdiff' => 'ਅੰਤਰ ਅੱਗੇ →',
@@ -1224,10 +1216,6 @@ to upload files.',
# Scary transclusion
'scarytranscludetoolong' => '[ਅਫਸੋਸ ਹੈ ਕਿ URL ਬਹà©à¨¤ ਲੰਮਾ ਹੈ]',
-# Trackbacks
-'trackbackremove' => '([$1 ਹਟਾਓ])',
-'trackbacklink' => 'ਟਰੈਕਬੈਕ',
-
# Delete conflict
'recreate' => 'ਮà©à©œ-ਬਣਾਓ',
diff --git a/languages/messages/MessagesPag.php b/languages/messages/MessagesPag.php
index 07292047..2e95644b 100644
--- a/languages/messages/MessagesPag.php
+++ b/languages/messages/MessagesPag.php
@@ -94,7 +94,6 @@ $messages = array(
'cannotdelete' => 'Aga nabural so nibagan bolong o file. (Sarag ton abural la na arom.)',
'badtitle' => 'Aga sarag ya titulo',
'viewsource' => 'Nengnengen so pinanlapuan',
-'viewsourcefor' => 'para $1',
'viewsourcetext' => 'Sarag mon nengnengen san kopyaen so pinanlapuan na ayan bolong:',
# Login and logout pages
@@ -116,26 +115,23 @@ $messages = array(
'link_tip' => 'Gawing ed loob',
# Edit pages
-'minoredit' => 'Melag yan edit.',
-'watchthis' => 'Bantayan yan bolong',
-'preview' => 'Nengnengen',
-'showdiff' => 'Ipanengneng so binalo',
-'anoneditwarning' => "'''Pasakbay:''' Agka ni limmoob. Aka-record so IP address mo ed agawgawa ed bolong.",
-'blockedtitle' => 'Sebel ed sayan manag-usar',
-'blockednoreason' => 'anggapon katunungan so inter',
-'blockedoriginalsource' => "Wadyad leksab so pinanlapuan na '''$1''':",
-'blockededitsource' => "Wadyad leksab so text na '''saray binalom''' anggag '''$1''':",
-'whitelistedittitle' => 'Nakaukulan ya onloob umpian makapanbalo',
-'whitelistedittext' => 'Nakaukulan mo ya $1 umpian nabalo o nadagdagan ray bolobolong.',
-'loginreqtitle' => 'Nakaukulan kan Onloob',
-'loginreqlink' => 'onloob',
-'loginreqpagetext' => 'Nakaukulan kan $1 umpian nanengneng so arom ran bolobolong.',
-'accmailtitle' => 'Say Password impawet la.',
-'accmailtext' => 'Empawet ed $2 so password para ed $1.',
-'newarticle' => '(Balo)',
-'editing' => 'Babaloen so $1',
-'yourdiff' => 'Saray niduma',
-'copyrightwarning' => "Tandaan komon ya amin ya contribution para ed {{SITENAME}} et nonoten ya pinaolian onong ed $2 (nengnengen so $1 para ed detalye).
+'minoredit' => 'Melag yan edit.',
+'watchthis' => 'Bantayan yan bolong',
+'preview' => 'Nengnengen',
+'showdiff' => 'Ipanengneng so binalo',
+'anoneditwarning' => "'''Pasakbay:''' Agka ni limmoob. Aka-record so IP address mo ed agawgawa ed bolong.",
+'blockedtitle' => 'Sebel ed sayan manag-usar',
+'blockednoreason' => 'anggapon katunungan so inter',
+'whitelistedittext' => 'Nakaukulan mo ya $1 umpian nabalo o nadagdagan ray bolobolong.',
+'loginreqtitle' => 'Nakaukulan kan Onloob',
+'loginreqlink' => 'onloob',
+'loginreqpagetext' => 'Nakaukulan kan $1 umpian nanengneng so arom ran bolobolong.',
+'accmailtitle' => 'Say Password impawet la.',
+'accmailtext' => 'Empawet ed $2 so password para ed $1.',
+'newarticle' => '(Balo)',
+'editing' => 'Babaloen so $1',
+'yourdiff' => 'Saray niduma',
+'copyrightwarning' => "Tandaan komon ya amin ya contribution para ed {{SITENAME}} et nonoten ya pinaolian onong ed $2 (nengnengen so $1 para ed detalye).
No ag mo labay ya say inkorit mo ed sarag ya baloen odino ibonog ed anggan siopa, ag mo ipapalima dia.<br />
San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya public domain odino parehas ya libren resource.
'''AG MANPALIMA NA KIMEY YA WALAY COPYRIGHT TO YA ANGGAPOY ABOLOY!'''",
@@ -248,9 +244,6 @@ San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya pu
'linksearch-pat' => 'Anapen so pattern:',
'linksearch-ok' => 'Anapen',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Balon user',
-
# E-mail user
'emailuser' => 'E-mail so ayan user',
'emailfrom' => 'Manlapud',
@@ -283,7 +276,6 @@ No labay mon ekalen may bolong diad listaan na babantayan, tapik mo labat so \"e
'actioncomplete' => 'Asumpal lan agawa',
'deletedtext' => 'Abural lay "$1".
Pinengneng so $2 para ed listaan na saray abural ran balo.',
-'deletedarticle' => 'binural so "[[$1]]"',
'deletecomment' => 'Katonongan',
# Protect
@@ -330,7 +322,6 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
'movepagebtn' => 'Iyales so bolong',
'pagemovedsub' => 'Asumpal lan inyales',
'articleexists' => 'Wala lay bolong to may ngaran ya atan, odino aga valid so pinilim ya ngaran. Pili ka pa na arom ya ngaran.',
-'1movedto2' => 'say [[$1]] enyales paula ed [[$2]]',
'movereason' => 'Katonongan',
'delete_and_move' => 'Buralen san iyales',
'delete_and_move_confirm' => 'On, buralen yan page',
diff --git a/languages/messages/MessagesPam.php b/languages/messages/MessagesPam.php
index ba530527..30633f32 100644
--- a/languages/messages/MessagesPam.php
+++ b/languages/messages/MessagesPam.php
@@ -331,15 +331,14 @@ Pakisabi ya iti king metung a [[Special:ListUsers/sysop|administrator]], at pak
'cannotdelete' => "E mebura ing bulung o file a pinili mu. (Mapalyaring ati'nang aliwang memura kaniti.)",
'badtitle' => 'Matsurang pamansag',
'badtitletext' => 'E ya matatanggap o ala yang laman, o bansag yang inter-language o inter-wiki a e ustu pamisuglung, ing bansag ning bulung a paintunan mu. Mapalyaring atin yang metung o maygit pang letra o kulit (character) a e malyaring gamitan kareng bansag/pamagat.',
-'perfcached' => 'Makasimpan (cached) ya iting makatuking data, at mapalyaring e ne makapanaun.',
-'perfcachedts' => 'Makasimpan (cached) ya ing makatuking data, at tauli yang mibayu kanitang $1.',
+'perfcached' => 'Makasimpan (cached) ya iting makatuking data, at mapalyaring e ne makapanaun. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Makasimpan (cached) ya ing makatuking data, at tauli yang mibayu kanitang $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Updates for this page are currently disabled. Data here will not presently be refreshed.
Kasalungsungan yang makapatda ing pamagbayu (update) king bulung a ini. E la miyalilan ketang pekatauli (refreshed) deng makabiling data keti.',
'wrong_wfQuery_params' => 'E la ustu deng sukad (parameter) king wfQuery()<br />
Function: $1<br />
Query: $2',
'viewsource' => 'Lon ya ing pikuanan',
-'viewsourcefor' => 'para $1',
'actionthrottled' => 'Mepigil ing pamangimut',
'actionthrottledtext' => 'Metung ya kareng paralan ba yang sabatan ing spam ing pamaglimita king pamanulit king kimut (action) a iti kilub ning makuyad a panaun, at alagpusan mu ne itang angganan.
Pakisubukan mung pasibayu kaibat ning mapilang minutu.',
@@ -514,9 +513,6 @@ Tandanan mung e me maliaring gamitan ing serbisiung "i e-mail me ining talagamit
Ini ing kekang block ID: $5
Pakibanggit me iting ID neng atin kang pamangutang.',
'blockednoreason' => 'alang mibieng sangkan',
-'blockedoriginalsource' => "Makabili king lalam ing penibatan ning '''$1''':",
-'blockededitsource' => "Atyu king lalam ing makasulat ketang '''ding kekang in-edit''' king '''$1''' ('''your edits''' to '''$1'''):",
-'whitelistedittitle' => 'Kailangang mag-login bang makapag-edit',
'whitelistedittext' => 'Kailangan mung $1 bayu ka makapag-edit bulung.',
'confirmedittext' => "Kailangan meng kumpirman ing kekang e-mail address bayo mo a-edit deting bulung.
Pakisulat me at patutuan ing kekang e-mail address kapamilata'ning [[Special:Preferences|pinili ning talagamit]] (user preferences).",
@@ -691,22 +687,11 @@ Abusni da pa murin deng aliwang talapanibala (admin) king {{SITENAME}} itang lam
'revdelete-unsuppress' => 'Ilako ing pamagbawal kareng pamanaliling misubli',
'revdelete-log' => 'Sangkan:',
'revdelete-submit' => 'Ipairal ya kareng mepiling pamanalili (selected revision)',
-'revdelete-logentry' => 'miyalilan ing lino da reng mengayalili (revision visibility) king [[$1]]',
-'logdelete-logentry' => 'miyalilan ing lino da reng miliari (event visibility) king [[$1]]',
'revdelete-success' => "'''Mituldu na ing pamagbayu ning sala/kalinawan.'''",
'logdelete-success' => "'''Mituldu na ing sala/lino (visibility) ning tala (log).'''",
'revdel-restore' => 'Alilan ya ing mayaykit',
'pagehist' => 'Amlat ning bulung',
'deletedhist' => 'Meburang amlat',
-'revdelete-content' => 'laman',
-'revdelete-summary' => 'sampulung da reng mibayu (edit summary)',
-'revdelete-uname' => 'lagyungtalagamit',
-'revdelete-restricted' => 'ipairal la reng limitasiun kareng sysop',
-'revdelete-unrestricted' => 'ilako la reng makabawal kareng sysops',
-'revdelete-hid' => 'salikot $1',
-'revdelete-unhid' => 'ipakit $1',
-'revdelete-log-message' => '$1 para $2 {{PLURAL:$2|pamanalili|pamanalili}}',
-'logdelete-log-message' => '$1 para $2 {{PLURAL:$2|miliari|miliari}}',
'revdelete-edit-reasonlist' => 'I-edit la reng sangkan king pamamura',
# Suppression log
@@ -941,7 +926,6 @@ Nung ibie me, magamit ya bang kilalanan ing kekang ambag.',
'right-autopatrol' => 'Tambing lang tatakan antimong babanten (patrolled) deng me-edit',
'right-patrolmarks' => 'Lon la reng bayung miyalilan kareng tatak pamagbante (patrol marks)',
'right-unwatchedpages' => 'Lumawe kang tala da reng bulung a e babanten',
-'right-trackback' => 'Mamie kang trackback',
'right-mergehistory' => 'Pisanib la reng amlat (history) da reng bulung',
'right-userrights' => 'I-edit la ngan deng katulirang talagamit (user rights)',
'right-userrights-interwiki' => 'I-edit la reng katulirang talagamit (user rights) da reng talagamit kareng aliwang karinan a wiki',
@@ -1319,8 +1303,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Alang meyakit a talagamit.',
# Special:Log/newusers
-'newuserlogpage' => "Tala ning pamaglalang talagamit (''User creation log'')",
-'newuserlog-create-entry' => 'Bayung account a pang-talagamit',
+'newuserlogpage' => "Tala ning pamaglalang talagamit (''User creation log'')",
# Special:ListGroupRights
'listgrouprights' => 'Katuliran da reng grupung talagamit (user group rights)',
@@ -1435,8 +1418,6 @@ Pakikumpirma nung ini pin ing buri mung gawan, nung aintindian mu ing eganaganan
'actioncomplete' => 'Ing dapat mebuu ne.',
'deletedtext' => 'Mebura ya ing "$1".
Makasulat la king $2 deng pekabayung mebura.',
-'deletedarticle' => 'mebura ne ing "[[$1]]"',
-'suppressedarticle' => 'mesabat ya ing "[[$1]]"',
'dellogpage' => 'Tala da reng mebura',
'dellogpagetext' => 'Makabili la king lalam deng pekabayung mebura.',
'deletionlog' => 'tala da ring mebura',
@@ -1547,7 +1528,6 @@ Mapaliaring putut ya ing kekang suglung, o misubli (restored) ya o milako king s
'undeletelink' => 'lon/ibalik',
'undeletereset' => 'Isubli king sadia (reset)',
'undeletecomment' => 'Komentu:',
-'undeletedarticle' => 'misubli ya ing "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 pamagbayung|$1 pamagbayung}} misubli',
'undeletedrevisions-files' => '{{PLURAL:$1|1 pamagbayung|$1 pamagbayung}} ampong {{PLURAL:$2|1 simpan|$2 simpan}} a misubli',
'undeletedfiles' => '{{PLURAL:$1|1 simpan|$1 simpan}} a misubli',
@@ -1756,8 +1736,6 @@ Gumamit na kang aliwang lagyu.',
Nung malyari, tunggal-tunggal mu lang piyabe/piyanib.'''",
'movedto' => 'miyalis ya king',
'movetalk' => 'Iyalis me ing kayabe nang bulung-pisasabian (talk page)',
-'1movedto2' => 'Ing [[$1]] miyalis ya king [[$2]]',
-'1movedto2_redir' => 'Ing [[$1]] milipat ya king [[$2]] menaliwa dalan',
'movelogpage' => 'Iyalis ya ing tala/log',
'movelogpagetext' => 'Makabili ya king lalam ing tala (list) da reng bulung a miyalis.',
'movereason' => 'Sangkan:',
@@ -1953,7 +1931,6 @@ Mapaliaring ing sangkan metung yang suglung king karinan king kilual (link to an
# Patrol log
'patrol-log-page' => 'Tala ning pamagbante (patrol long)',
-'patrol-log-line' => 'mitatakan $1 kareng $2 babanten $3',
# Image deletion
'deletedrevision' => 'Meburang matuang pamagbayu $1',
@@ -1977,7 +1954,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 bulung',
'file-info' => 'dagul ning simpan [file]: $1, MIME type: $2',
'file-info-size' => '$1 × $2 pixel, sukad ning simpan: $3, MIME type: $4',
-'file-nohires' => '<small>Ala nang mas malino pa.</small>',
+'file-nohires' => 'Ala nang mas malino pa.',
'svg-long-desc' => 'SVG file, masasabing $1 × $2 pixels, dagul ning simpan: $3',
'show-big-image' => 'Pekamalino',
@@ -2259,9 +2236,6 @@ Mayari/mapasu ya ining confirmation code keng $4.',
# Scary transclusion
'scarytranscludetoolong' => '[Masiadu yang makaba ing URL; pasensia na ka]',
-# Trackbacks
-'trackbackremove' => '([$1 Buran])',
-
# Delete conflict
'deletedwhileediting' => 'Kapiadian: Mebura ya ing bulung ini kaibat mung migumpisang mag-edit!',
'recreate' => 'Lalangan yang pasibayu',
@@ -2342,4 +2316,8 @@ Mayari/mapasu ya ining confirmation code keng $4.',
'specialpages-group-users' => 'Talagamit ampong katuliran',
'specialpages-group-highuse' => 'Deng bulung a magamitan',
+# New logging system
+'revdelete-restricted' => 'ipairal la reng limitasiun kareng sysop',
+'revdelete-unrestricted' => 'ilako la reng makabawal kareng sysops',
+
);
diff --git a/languages/messages/MessagesPap.php b/languages/messages/MessagesPap.php
index 181dd414..bcc2e573 100644
--- a/languages/messages/MessagesPap.php
+++ b/languages/messages/MessagesPap.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Delaraha (on pap.wikipedia.org)
* @author Kamizu
* @author Sdm1985
* @author לערי ריינה×רט
@@ -161,7 +162,6 @@ Bo por haña un lista di tur [[Special:SpecialPages|{{int:specialpages}}]].',
'badtitle' => 'Título inválido',
'badtitletext' => 'E título di e página ku bo a pidi tabata inválido, bashí, òf un link pa un inter-idioma òf inter-wiki inkorekto.',
'viewsource' => 'Wak fuente',
-'viewsourcefor' => 'di $1',
# Login and logout pages
'welcomecreation' => '== Bon bini, $1! ==
@@ -184,18 +184,17 @@ No lubidá di kambia bo [[Special:Preferences|{{SITENAME}} preferensianan]].',
'accountcreatedtext' => 'E kuenta di uzadó pa $1 tabata trahá.',
# Edit pages
-'watchthis' => 'Observá e página aki',
-'anoneditwarning' => 'Bo no a outentiká bo mes.
+'watchthis' => 'Observá e página aki',
+'anoneditwarning' => 'Bo no a outentiká bo mes.
Bo por kambia página libremente, pero tene kuenta ku lo nota bo IP adrès den e historia di kambionan hasí na e página aki.',
-'blockedtitle' => 'Uzadó ta blokiá',
-'whitelistedittitle' => 'Mester outentiká promé pa editá',
-'confirmedittext' => 'Bo mester konfirmá bo e-mail adrès promé ku bo editá página. Por fabor duna i validá bo e-mail adrès via bo [[Special:Preferences|preferensianan]].',
-'accmailtitle' => 'Kontraseña mandá.',
-'accmailtext' => "E kontraseña pa '$1' tabata mandá pa $2.",
-'newarticle' => '(Nobo)',
-'anontalkpagetext' => "----''Esaki ta e página di diskushon pa un uzadó anonimo ku no a traha un kuenta ahinda, òf no sa uza e. Ta pa e rason aki nos tin ku uza IP adrès pa identifiká e persona. Diferente uzadó por uza e IP adrès aki. Si bo ta un uzadó anonimo i ta sinti ku komentario irelevante tabata mandá pa bo, por fabor [[Special:UserLogin|registrá un kuenta nobo òf outentiká bo mes]] pa evitá konfushon den futuro.''",
-'yourtext' => 'Bo teksto',
-'yourdiff' => 'Diferensianan',
+'blockedtitle' => 'Uzadó ta blokiá',
+'confirmedittext' => 'Bo mester konfirmá bo e-mail adrès promé ku bo editá página. Por fabor duna i validá bo e-mail adrès via bo [[Special:Preferences|preferensianan]].',
+'accmailtitle' => 'Kontraseña mandá.',
+'accmailtext' => "E kontraseña pa '$1' tabata mandá pa $2.",
+'newarticle' => '(Nobo)',
+'anontalkpagetext' => "----''Esaki ta e página di diskushon pa un uzadó anonimo ku no a traha un kuenta ahinda, òf no sa uza e. Ta pa e rason aki nos tin ku uza IP adrès pa identifiká e persona. Diferente uzadó por uza e IP adrès aki. Si bo ta un uzadó anonimo i ta sinti ku komentario irelevante tabata mandá pa bo, por fabor [[Special:UserLogin|registrá un kuenta nobo òf outentiká bo mes]] pa evitá konfushon den futuro.''",
+'yourtext' => 'Bo teksto',
+'yourdiff' => 'Diferensianan',
# History pages
'currentrev' => 'Revishon aktual',
@@ -349,11 +348,9 @@ Wak e [[Special:BlockList|lista di blokeonan]] pa wak tur blokeo aktivo.',
'unblocklogentry' => 'a desblokia $1',
# Move page
-'articleexists' => 'Tin un página ku e título ei kaba, òf e
+'articleexists' => 'Tin un página ku e título ei kaba, òf e
título ku bo a skohe no ta válido.
Por fabor skohe un otro título.',
-'1movedto2' => '[[$1]] mové pa [[$2]]',
-'1movedto2_redir' => '[[$1]] mové pa [[$2]] riba redirect',
# Namespace 8 related
'allmessages' => 'Mensahenan di sistema',
diff --git a/languages/messages/MessagesPcd.php b/languages/messages/MessagesPcd.php
index be6417c5..5009a2e3 100644
--- a/languages/messages/MessagesPcd.php
+++ b/languages/messages/MessagesPcd.php
@@ -305,7 +305,7 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
'badtitle' => 'Méchant tite',
'badtitletext' => "Ch'tite del pache écmindée n'est poin valabe, est vide, ou bin ch'est un tite inter-langue ou inter-proujé aveuc des méchands loïens. Pététe qu'il y o un ou des caractére(s) éq i feut poin mette din chés tites.",
'viewsource' => "Vir l'source",
-'viewsourcefor' => 'pou $1',
+'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.",
@@ -599,8 +599,7 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
'linksearch' => 'Loïens éstérieurs',
# Special:Log/newusers
-'newuserlogpage' => "Jornal éd chés créachons d'comptes d'uzeu",
-'newuserlog-create-entry' => "Nouvieu conpte d'uzeu",
+'newuserlogpage' => "Jornal éd chés créachons d'comptes d'uzeu",
# Special:ListGroupRights
'listgrouprights-members' => '(lisse éd chés mimbes)',
@@ -631,7 +630,6 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
'actioncomplete' => 'Plònne acchon',
'deletedtext' => "« $1 » o té défacé.
Vir $2 pou eune lisse d'chés darinnes défachons.",
-'deletedarticle' => 'défacé "[[$1]]"',
'dellogpage' => 'jornal éd chés défacions',
'deletecomment' => 'Motif:',
'deleteotherreason' => 'Motif eute/suplémintère :',
@@ -671,8 +669,7 @@ Vlo chés réglages del pache '''$1''' à ch'momint-chi:",
'restriction-level' => 'Nivieu éd réstricchon:',
# Undelete
-'undeletelink' => 'vir/érfoaire',
-'undeletedarticle' => 'érfoaire "[[$1]]"',
+'undeletelink' => 'vir/érfoaire',
# Namespace form on various pages
'namespace' => 'Éspace du nom:',
@@ -755,8 +752,6 @@ Din chés cas-lo, I feut érlonmer ou ratatouiller l'pache aveuc l'main.",
'talkexists' => "'''L'pache ale o té déplachée mais l'pache d'pérlache n'put poin éte déplachée ker il y o pécho eune pache d'pérlache aveuc ch'nouvieu nom. <br /> I feut foaire un touillache al main.'''",
'movedto' => 'Déplaché dsus',
'movetalk' => "Canjer ch'nom del pache d'pérlache apparièe",
-'1movedto2' => 'déplacher [[$1]] dsus [[$2]]',
-'1movedto2_redir' => "il o déplaché [[$1]] su [[$2]] in écatant l'érsin",
'movelogpage' => 'Jornal éd chés déplachemints',
'movereason' => 'Motif:',
'revertmove' => 'invérser',
@@ -832,7 +827,7 @@ Os pouvez vir l'source",
# Media information
'file-info-size' => '$1 × $2 picséls, diminchon dech fichié: $3, MIME tipe: $4',
-'file-nohires' => '<small>Poin éd pu grande résoluchon possibe.</small>',
+'file-nohires' => 'Poin éd pu grande résoluchon possibe.',
'svg-long-desc' => 'Fichié SVG, résoluchon éd $1 × $2 picsels, diminchon: $3',
'show-big-image' => 'Plinne résoluchon',
diff --git a/languages/messages/MessagesPdc.php b/languages/messages/MessagesPdc.php
index d9bf3c0f..d471b507 100644
--- a/languages/messages/MessagesPdc.php
+++ b/languages/messages/MessagesPdc.php
@@ -276,7 +276,6 @@ Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld
'missingarticle-diff' => '(Unnerschidd zwische Versione: $1, $2)',
'internalerror' => 'Interner Fehler',
'internalerror_info' => 'Interner Fehler: $1',
-'viewsourcefor' => 'fer $1',
'ns-specialprotected' => 'Besunnere Bledder sinn net zum Ennere.',
# Virus scanner
@@ -314,6 +313,9 @@ Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld
'passwordreset-emailelement' => 'Yuusernaame: $1
Paesswatt fer nau: $2',
+# Special:ChangeEmail
+'changeemail-none' => '(ken)',
+
# Edit page toolbar
'bold_sample' => 'Wadde fett gmarrickt',
'bold_tip' => 'Wadde fett gmarrickt',
@@ -375,8 +377,6 @@ Paesswatt fer nau: $2',
'revdelete-radio-unset' => 'Nee',
'revdelete-log' => 'Grund:',
'pagehist' => 'Gschicht',
-'revdelete-uname' => 'Yuuser-Naame',
-'revdelete-log-message' => '$1 fer $2 {{PLURAL:$2|Version|Versione}}',
'revdelete-otherreason' => 'Annere Grind dezu:',
'revdelete-reasonotherlist' => 'Annere Grind',
'revdelete-edit-reasonlist' => "Grind fer's Lesche ennere",
@@ -517,6 +517,7 @@ Paesswatt fer nau: $2',
'newpageletter' => 'N',
'boteditletter' => 'W',
'rc_categories_any' => 'All',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Beit|Beit}} nooch daer Ennering',
'newsectionsummary' => 'Neier Abschnitt /* $1 */',
# Recent changes linked
@@ -540,6 +541,9 @@ Paesswatt fer nau: $2',
'upload-unknown-size' => 'Unbekannte Grees',
'upload-http-error' => 'En HTTP-Fehler iss kumme: $1',
+# File backend
+'backend-fail-backup' => 'Des Feil $1 iss net zwettgmacht warre.',
+
# img_auth script messages
'img-auth-nofile' => 'Feil „$1“ gebt es net.',
@@ -679,7 +683,7 @@ Paesswatt fer nau: $2',
# E-mail user
'emailuser' => 'E-Poschd fer den Yuuser',
-'defemailsubject' => '{{SITENAME}}-E-Poschde',
+'defemailsubject' => '{{SITENAME}} - E-Poschde vun Yuuser „$1“',
'emailusername' => 'Yuuser-Naame:',
'emailfrom' => 'Vun:',
'emailto' => 'Fer:',
@@ -714,7 +718,6 @@ Paesswatt fer nau: $2',
'delete-legend' => 'Verwische',
'deletedtext' => '"$1" iss gelescht warre.
Guck $2 fer e Lischt vun de letscht Leschunge.',
-'deletedarticle' => 'hot „[[$1]]“ gelöscht',
'dellogpage' => 'Lischt vun gelöschte Bledder',
'deletecomment' => 'Grund:',
'deleteotherreason' => 'Annre Grind:',
@@ -808,8 +811,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'pagemovedsub' => 'Blatt iss gezoge warre',
'movepage-moved' => "'''Es Blatt „$1“ iss gezoge warre uff „$2“'''",
'movedto' => 'gezoge uff',
-'1movedto2' => 'hot „[[$1]]“ nooch „[[$2]]“ gezoge',
-'1movedto2_redir' => 'hot „[[$1]]“ nooch „[[$2]]“ gezoge unn debei e Weiderleiding iwwerschriwwe',
'movereason' => 'Grund:',
'revertmove' => 'zerick ziehe',
'delete_and_move_confirm' => 'Ya, es Blatt lösche',
@@ -903,6 +904,13 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'noimages' => 'Keene Feils gfunne.',
'ilsubmit' => 'Guck uff',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Sekund|$1 Sekunde}}',
+'minutes' => '{{PLURAL:$1|$1 Minudd|$1 Minudde}}',
+'hours' => '{{PLURAL:$1|ee Schtund|$1 Schtunde}}',
+'days' => '{{PLURAL:$1|een Daag|$1 Daag}}',
+'ago' => 'vor $1',
+
# Metadata
'metadata' => 'Metadaade',
@@ -931,9 +939,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
# Scary transclusion
'scarytranscludetoolong' => '[URL iss zu lang]',
-# Trackbacks
-'trackbackremove' => '([$1 lösche])',
-
# action=purge
'confirm_purge_button' => 'OK',
@@ -1013,4 +1018,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'htmlform-reset' => 'Enneringe losmache',
'htmlform-selectorother-other' => 'Annere',
+# Feedback
+'feedback-message' => 'Melding:',
+
);
diff --git a/languages/messages/MessagesPdt.php b/languages/messages/MessagesPdt.php
index c9f0fee0..a234ab38 100644
--- a/languages/messages/MessagesPdt.php
+++ b/languages/messages/MessagesPdt.php
@@ -243,7 +243,6 @@ Dit tjemm jeweenlich soo, wan een oola nich jelaschda Link jebruckt worde es.
Wan daut nich soo es, dan es doa vleicht een Fehla enne Software.
Bitte schriew eene Notiz aun [[Special:ListUsers/sysop|administrator]], en lot dem dee URL weete.',
'badtitle' => 'Schlajchta Titel',
-'viewsourcefor' => 'fer $1',
# Login and logout pages
'yourname' => 'Bruckanome:',
@@ -354,7 +353,6 @@ Bitte nemm eenen aundren.',
'recentchangeslinked-feed' => 'Endarunge aun velinkte Siede',
'recentchangeslinked-toolbox' => 'Endarunge aun velinkte Siede',
'recentchangeslinked-title' => 'Endarunge aun Siede, woone von "$1" velinkt send',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'Em utjesochten Tietrum es aun dee velinkte Siede nuscht aundasch jemoakt worde.',
'recentchangeslinked-summary' => "Dit es eene List mette latzte Endarunge aune velinkte Siede (ooda bie Kategorien von Mettjlieda von dise Kategorie). Dee Siede opp diene [[Special:Watchlist|your watchlist]] woare '''fat''' jewese.",
'recentchangeslinked-page' => 'Siednome:',
@@ -454,17 +452,16 @@ Bitte nemm eenen aundren.',
'sp-contributions-talk' => 'Beredsied',
# What links here
-'whatlinkshere' => 'Links opp dise Sied',
-'whatlinkshere-title' => 'Siede, woone opp "$1" eenen Link habe',
-'whatlinkshere-page' => 'Sied:',
-'whatlinkshere-backlink' => '↠$1',
-'linkshere' => "Dee neachste Siede habe eenen Link opp '''[[:$1]]''':",
-'nolinkshere' => "Tjeene Sied haft eenen Link opp '''[[:$1]]'''.",
-'nolinkshere-ns' => "Tjeene Siede habe eenen Link opp '''[[:$1]]''' em utjesochten Nomesrum.",
-'isredirect' => 'Wiedaleid-Sied',
-'istemplate' => 'Vealoag-Enbinje (Inklusioon)',
-'isimage' => 'Dotei-Link',
-'whatlinkshere-links' => '↠Links',
+'whatlinkshere' => 'Links opp dise Sied',
+'whatlinkshere-title' => 'Siede, woone opp "$1" eenen Link habe',
+'whatlinkshere-page' => 'Sied:',
+'linkshere' => "Dee neachste Siede habe eenen Link opp '''[[:$1]]''':",
+'nolinkshere' => "Tjeene Sied haft eenen Link opp '''[[:$1]]'''.",
+'nolinkshere-ns' => "Tjeene Siede habe eenen Link opp '''[[:$1]]''' em utjesochten Nomesrum.",
+'isredirect' => 'Wiedaleid-Sied',
+'istemplate' => 'Vealoag-Enbinje (Inklusioon)',
+'isimage' => 'Dotei-Link',
+'whatlinkshere-links' => '↠Links',
# Block/unblock
'ipboptions' => '2 Stunde:2 hours,1 Dach:1 day,3 Doag:3 days,1 Wäakj:1 week,2 Wäakje:2 weeks,1 Moonat:1 month,3 Moonate:3 months,6 Moonate:6 months,1 Joa:1 year,one Enj:infinite',
diff --git a/languages/messages/MessagesPfl.php b/languages/messages/MessagesPfl.php
index 9c5bf327..bac0984d 100644
--- a/languages/messages/MessagesPfl.php
+++ b/languages/messages/MessagesPfl.php
@@ -440,8 +440,7 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
'linksearch' => 'Externe Links',
# Special:Log/newusers
-'newuserlogpage' => 'Naiaameldungs-Logbuch',
-'newuserlog-create-entry' => 'Nais Benutzerkonto',
+'newuserlogpage' => 'Naiaameldungs-Logbuch',
# Special:ListGroupRights
'listgrouprights-members' => '(Mitgliederlischt)',
@@ -478,7 +477,6 @@ Bitte du bstätiche, dass Du des wllscht du, dass Du verstehsch, was des hääß
'actioncomplete' => 'Aktion fertich',
'deletedtext' => '"$1" isch gelescht worre.
Guck $2 fer e Lischt vun de letschte Leschunge.',
-'deletedarticle' => 'hot "[[$1]]" glescht',
'dellogpage' => 'Leschlogbuch',
'deletecomment' => 'Grund:',
'deleteotherreason' => 'Annere/zusätzliche Grund:',
@@ -516,11 +514,10 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
'restriction-move' => 'Verschiewe',
# Undelete
-'undelete' => 'Widderherschdelle',
-'undeletebtn' => 'Widderherschdelle',
-'undeletelink' => 'aagucke/wirrer herstelle',
-'undeletereset' => 'Zuricksetze',
-'undeletedarticle' => 'hot "[[$1]]" wirrer hergstellt',
+'undelete' => 'Widderherschdelle',
+'undeletebtn' => 'Widderherschdelle',
+'undeletelink' => 'aagucke/wirrer herstelle',
+'undeletereset' => 'Zuricksetze',
# Namespace form on various pages
'namespace' => 'Nomensraum',
@@ -610,8 +607,6 @@ Bitte nemm e annere Name.',
Bitte duu se vun Hand zammefiehre.'''",
'movedto' => 'verschowe uff',
'movetalk' => 'Dischbediersaid, wu dezu ghert, verschiewe',
-'1movedto2' => 'hot [[$1]] uff [[$2]] verschowwe',
-'1movedto2_redir' => 'hot [[$1]] uff [[$2]] verschowe un debai e Wairerlaidung iwwerschriwwe',
'movelogpage' => 'Verschiewungs-Logbuch',
'movereason' => 'Grund:',
'revertmove' => 'Zerick verschiewe',
@@ -691,7 +686,7 @@ Du kannscht e Grund in dr Zammfassung aagewwe',
# Media information
'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
-'file-nohires' => '<small>Ke hechere Ufflesung verfiechbar.</small>',
+'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
'show-big-image' => 'Gsamte Ergebnis',
diff --git a/languages/messages/MessagesPi.php b/languages/messages/MessagesPi.php
index f2b4ae55..1c2b21f4 100644
--- a/languages/messages/MessagesPi.php
+++ b/languages/messages/MessagesPi.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Eukesh (on pi.wikipedia.org)
* @author Vibhijain
*/
diff --git a/languages/messages/MessagesPih.php b/languages/messages/MessagesPih.php
index bfbff4ec..54a64ee6 100644
--- a/languages/messages/MessagesPih.php
+++ b/languages/messages/MessagesPih.php
@@ -7,7 +7,7 @@
* @ingroup Language
* @file
*
- * @author http://pih.wikipedia.org sysops
+ * @author Pall Mall (on pih.wikipedia.org)
*/
$messages = array(
diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php
index d87ee763..9afd48de 100644
--- a/languages/messages/MessagesPl.php
+++ b/languages/messages/MessagesPl.php
@@ -7,8 +7,11 @@
* @ingroup Language
* @file
*
+ * @author Bartek50003
+ * @author BdgwksxD
* @author Beau
* @author BeginaFelicysym
+ * @author Cysioland
* @author Derbeth
* @author Equadus
* @author Fizykaa
@@ -27,6 +30,8 @@
* @author Mikołka
* @author Nux
* @author Odder
+ * @author Olgak85
+ * @author Przemub
* @author Remedios44
* @author Remember the dot
* @author Rzuwig
@@ -37,6 +42,7 @@
* @author Szczepan1990
* @author Timpul
* @author ToSter
+ * @author Woytecr
* @author Wpedzich
* @author Ymar
* @author Žekřil71pl
@@ -99,21 +105,24 @@ $specialPageAliases = array(
'Allmessages' => array( 'Wszystkie_komunikaty' ),
'Allpages' => array( 'Wszystkie_strony' ),
'Ancientpages' => array( 'Stare_strony' ),
+ 'Badtitle' => array( 'Zły_tytuł' ),
'Blankpage' => array( 'Pusta_strona' ),
'Block' => array( 'Blokuj' ),
'Blockme' => array( 'Zablokuj_mnie' ),
'Booksources' => array( 'Książki' ),
'BrokenRedirects' => array( 'Zerwane_przekierowania' ),
'Categories' => array( 'Kategorie' ),
+ 'ChangeEmail' => array( 'Zmień_e-mail' ),
'ChangePassword' => array( 'Zmień_hasło', 'Resetuj_hasło' ),
'ComparePages' => array( 'Porównywanie_stron' ),
'Confirmemail' => array( 'Potwierdź_e-mail' ),
'Contributions' => array( 'Wkład' ),
- 'CreateAccount' => array( 'Stwórz_konto' ),
+ 'CreateAccount' => array( 'Utwórz_konto', 'Stwórz_konto' ),
'Deadendpages' => array( 'Bez_linków' ),
'DeletedContributions' => array( 'Usunięty_wkład' ),
'Disambiguations' => array( 'Ujednoznacznienia' ),
'DoubleRedirects' => array( 'Podwójne_przekierowania' ),
+ 'EditWatchlist' => array( 'Edytuj_obserwowane' ),
'Emailuser' => array( 'E-mail' ),
'Export' => array( 'Eksport' ),
'Fewestrevisions' => array( 'Najmniej_edycji' ),
@@ -132,7 +141,7 @@ $specialPageAliases = array(
'Log' => array( 'Rejestr', 'Logi' ),
'Lonelypages' => array( 'Porzucone_strony' ),
'Longpages' => array( 'Najdłuższe_strony' ),
- 'MergeHistory' => array( 'Połącz_historię' ),
+ 'MergeHistory' => array( 'Połącz_historie' ),
'MIMEsearch' => array( 'Wyszukiwanie_MIME' ),
'Mostcategories' => array( 'Najwięcej_kategorii' ),
'Mostimages' => array( 'Najczęściej_linkowane_pliki' ),
@@ -148,6 +157,7 @@ $specialPageAliases = array(
'Newimages' => array( 'Nowe_pliki' ),
'Newpages' => array( 'Nowe_strony' ),
'PasswordReset' => array( 'Wyczyść_hasło' ),
+ 'PermanentLink' => array( 'Niezmienny_link' ),
'Popularpages' => array( 'Popularne_strony' ),
'Preferences' => array( 'Preferencje' ),
'Prefixindex' => array( 'Strony_według_prefiksu' ),
@@ -176,6 +186,7 @@ $specialPageAliases = array(
'Unusedtemplates' => array( 'Nieużywane_szablony' ),
'Unwatchedpages' => array( 'Nieobserwowane_strony' ),
'Upload' => array( 'Prześlij' ),
+ 'UploadStash' => array( 'Schowane_pliki' ),
'Userlogin' => array( 'Zaloguj' ),
'Userlogout' => array( 'Wyloguj' ),
'Userrights' => array( 'Uprawnienia', 'Uprawnienia_użytkowników', 'Prawa_użytkowników' ),
@@ -190,63 +201,90 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PATRZ', '#PRZEKIERUJ', '#TAM', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZSPISU__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEZGALERII__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ZESPISEM__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SPIS__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEZEDYCJISEKCJI__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZNAGÅÓWKA__', '__NOHEADER__' ),
- 'localmonth' => array( '1', 'MIESIÄ„C', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'MIESIÄ„CNAZWA', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'MIESIÄ„CNAZWAD', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'MIESIÄ„CNAZWASKR', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'DZIEŃ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'DZIEŃ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'DZIEŃTYGODNIA', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ROK', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'CZAS', 'LOCALTIME' ),
- 'localhour' => array( '1', 'GODZINA', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'STRON', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ARTYKUÅÓW', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'PLIKÓW', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'UŻYTKOWNIKÓW', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'EDYCJI', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NAZWASTRONY', 'PAGENAME' ),
- 'namespace' => array( '1', 'NAZWAPRZESTRZENI', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'DYSKUSJA', 'TALKSPACE' ),
- 'fullpagename' => array( '1', 'PELNANAZWASTRONY', 'FULLPAGENAME' ),
- 'subst' => array( '0', 'podst:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'mały', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'mały=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'prawo', 'right' ),
- 'img_left' => array( '1', 'lewo', 'left' ),
- 'img_none' => array( '1', 'brak', 'none' ),
- 'img_center' => array( '1', 'centruj', 'center', 'centre' ),
- 'img_framed' => array( '1', 'ramka', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bezramki', 'bez_ramki', 'frameless' ),
- 'img_page' => array( '1', 'strona=$1', 'page=$1', 'page $1' ),
- 'img_border' => array( '1', 'tło', 'border' ),
- 'img_top' => array( '1', 'góra', 'top' ),
- 'img_middle' => array( '1', 'środek', 'middle' ),
- 'img_bottom' => array( '1', 'dół', 'bottom' ),
- 'sitename' => array( '1', 'PROJEKT', 'SITENAME' ),
- 'grammar' => array( '0', 'ODMIANA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'PÅEĆ:', 'GENDER:' ),
- 'localweek' => array( '1', 'TYDZIEŃROKU', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'DZIEŃTYGODNIANR', 'LOCALDOW' ),
- 'plural' => array( '0', 'MNOGA:', 'PLURAL:' ),
- 'lcfirst' => array( '0', 'ZMAÅEJ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MAÅE:', 'LC:' ),
- 'uc' => array( '0', 'WIELKIE:', 'DUŻE:', 'UC:' ),
- 'newsectionlink' => array( '1', '__LINKNOWEJSEKCJI__', '__NEWSECTIONLINK__' ),
- 'language' => array( '0', '#JĘZYK:', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'ADMINISTRATORÓW', 'NUMBEROFADMINS' ),
- 'padleft' => array( '0', 'DOLEWEJ', 'PADLEFT' ),
- 'padright' => array( '0', 'DOPRAWEJ', 'PADRIGHT' ),
- 'defaultsort' => array( '1', 'DOMYÅšLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'hiddencat' => array( '1', '__KATEGORIAUKRYTA__', '__HIDDENCAT__' ),
+ 'redirect' => array( '0', '#PATRZ', '#PRZEKIERUJ', '#TAM', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZSPISU__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALERII__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ZESPISEM__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SPIS__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEZEDYCJISEKCJI__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BEZNAGÅÓWKA__', '__NOHEADER__' ),
+ 'currentday' => array( '1', 'AKTUALNYDZIEŃ', 'CURRENTDAY' ),
+ 'currentdayname' => array( '1', 'NAZWADNIA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AKTUALNYROK', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AKTUALNYCZAS', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'AKTUALNAGODZINA', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MIESIÄ„C', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'MIESIÄ„CNAZWA', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'MIESIÄ„CNAZWAD', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'MIESIÄ„CNAZWASKR', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'DZIEŃ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'DZIEŃ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'DZIEŃTYGODNIA', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ROK', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'CZAS', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'GODZINA', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'STRON', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ARTYKUÅÓW', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'PLIKÓW', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'UŻYTKOWNIKÓW', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'LICZBAAKTYWNYCHUŻYTKOWNIKÓW', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'EDYCJI', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NAZWASTRONY', 'PAGENAME' ),
+ 'namespace' => array( '1', 'NAZWAPRZESTRZENI', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'DYSKUSJA', 'TALKSPACE' ),
+ 'fullpagename' => array( '1', 'PELNANAZWASTRONY', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'NAZWAPODSTRONY', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'BAZOWANAZWASTRONY', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'NAZWASTRONYDYSKUSJI', 'TALKPAGENAME' ),
+ 'subst' => array( '0', 'podst:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'mały', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'mały=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'prawo', 'right' ),
+ 'img_left' => array( '1', 'lewo', 'left' ),
+ 'img_none' => array( '1', 'brak', 'none' ),
+ 'img_center' => array( '1', 'centruj', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'ramka', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bezramki', 'bez_ramki', 'frameless' ),
+ 'img_page' => array( '1', 'strona=$1', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', 'tło', 'border' ),
+ 'img_top' => array( '1', 'góra', 'top' ),
+ 'img_middle' => array( '1', 'środek', 'middle' ),
+ 'img_bottom' => array( '1', 'dół', 'bottom' ),
+ 'sitename' => array( '1', 'PROJEKT', 'SITENAME' ),
+ 'ns' => array( '0', 'PN:', 'NS:' ),
+ 'articlepath' => array( '0', 'ÅšCIEÅ»KAARTYKUÅÓW', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'SERWER', 'SERVER' ),
+ 'servername' => array( '0', 'NAZWASERWERA', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ŚCIEŻKASKRYPTU', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ODMIANA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'PÅEĆ:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'AKTUALNYTYDZIEŃ', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'TYDZIEŃROKU', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'DZIEŃTYGODNIANR', 'LOCALDOW' ),
+ 'plural' => array( '0', 'MNOGA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PEÅNYURL', 'FULLURL:' ),
+ 'lcfirst' => array( '0', 'ZMAÅEJ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ZWIELKIEJ:', 'ZDUŻEJ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MAÅE:', 'LC:' ),
+ 'uc' => array( '0', 'WIELKIE:', 'DUŻE:', 'UC:' ),
+ 'displaytitle' => array( '1', 'WYÅšWIETLANYTYTUÅ', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LINKNOWEJSEKCJI__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'AKTUALNAWERSJA', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#JĘZYK:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'ADMINISTRATORÓW', 'NUMBEROFADMINS' ),
+ 'padleft' => array( '0', 'DOLEWEJ', 'PADLEFT' ),
+ 'padright' => array( '0', 'DOPRAWEJ', 'PADRIGHT' ),
+ 'special' => array( '0', 'specjalna', 'special' ),
+ 'defaultsort' => array( '1', 'DOMYÅšLNIESORTUJ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ŚCIEŻKAPLIKU', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__KATEGORIAUKRYTA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'STRONYWKATEGORII', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ROZMIARSTRONY', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKSUJ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NIEINDEKSUJ__', '__NOINDEX__' ),
+ 'protectionlevel' => array( '1', '__POZIOMZABEZPIECZEŃ__', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'ŚCIEŻKA', 'PATH' ),
+ 'url_query' => array( '0', 'ZAPYTANIE', 'QUERY' ),
);
$messages = array(
@@ -608,20 +646,22 @@ Można zgłosić ten fakt [[Special:ListUsers/sysop|administratorowi]], podając
'badarticleerror' => 'Dla tej strony ta operacja nie może być wykonana.',
'cannotdelete' => 'Strona lub plik „$1†nie mogą zostać usunięte.
Możliwe, że zostały już usunięte przez kogoś innego.',
+'cannotdelete-title' => 'Nie można usunąć 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.',
-'perfcachedts' => 'Poniższe dane są kopią z pamięci podręcznej. Ostatnia aktualizacja odbyła się $1.',
+'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.',
+'perfcachedts' => 'Poniższe dane są kopią z pamięci podręcznej. Ostatnia aktualizacja odbyła się $1. Maksymalnie {{PLURAL:$4|jeden wynik jest|$4 wyniki są|$4 wyników jest}} w pamięci podręcznej.',
'querypage-no-updates' => 'Uaktualnienia dla tej strony są obecnie wyłączone. Znajdujące się tutaj dane nie zostaną odświeżone.',
'wrong_wfQuery_params' => 'Nieprawidłowe parametry przekazane do wfQuery()<br />
Funkcja: $1<br />
Zapytanie: $2',
'viewsource' => 'Tekst źródłowy',
-'viewsourcefor' => 'dla $1',
+'viewsource-title' => 'Tekst źródłowy strony $1',
'actionthrottled' => 'Akcja wstrzymana',
'actionthrottledtext' => 'Mechanizm obrony przed spamem ogranicza liczbę wykonań tej czynności w jednostce czasu. Usiłowałeś przekroczyć to ograniczenie. Spróbuj jeszcze raz za kilka minut.',
'protectedpagetext' => 'Wyłączono możliwość edycji tej strony.',
'viewsourcetext' => 'Tekst źródłowy strony można podejrzeć i skopiować.',
+'viewyourtext' => "Tekst źródłowy '''zmodyfikowanej''' przez Ciebie strony możesz podejrzeć i skopiować",
'protectedinterface' => 'Ta strona zawiera tekst interfejsu oprogramowania, dlatego możliwość jej edycji została zablokowana.',
'editinginterface' => "'''Ostrzeżenie:''' Edytujesz stronę, która zawiera tekst interfejsu oprogramowania.
Zmiany na tej stronie zmienią wygląd interfejsu dla innych użytkowników.
@@ -729,6 +769,7 @@ Poniższe funkcje poczty nie działają.",
'emailconfirmlink' => 'Potwierdź swój adres eâ€mail',
'invalidemailaddress' => 'Adres eâ€mail jest niepoprawny i nie może być zaakceptowany.
Wpisz poprawny adres eâ€mail lub wyczyść pole.',
+'cannotchangeemail' => 'Na tej wiki nie ma możliwoÅ›ci zmiany adresu eâ€mail przypisanego do konta.',
'accountcreated' => 'Konto zostało utworzone',
'accountcreatedtext' => 'Konto dla $1 zostało utworzone.',
'createaccount-title' => 'Utworzenie konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
@@ -745,6 +786,7 @@ Odczekaj chwilę zanim ponowisz próbę.',
# E-mail sending
'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
+'user-mail-no-addy' => 'Próba wysÅ‚ania eâ€maila bez adresu odbiorcy',
# Change password dialog
'resetpass' => 'Zmień hasło',
@@ -766,30 +808,45 @@ Być może wÅ‚aÅ›nie zmieniÅ‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} swoje hasÅ‚o lub po
'resetpass-temp-password' => 'Tymczasowe hasło:',
# Special:PasswordReset
-'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'WypeÅ‚nij formularz, aby otrzymać eâ€mail z przypomnieniem danych Twojego konta.',
-'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-username' => 'Nazwa użytkownika:',
-'passwordreset-domain' => 'Domena',
-'passwordreset-email' => 'Adres eâ€mail',
-'passwordreset-emailtitle' => 'Dane konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'KtoÅ› (prawdopodobnie Ty, spod adresu IP $1) poprosiÅ‚ o przypomnienie szczegółów dotyczÄ…cych Twojego konta w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem eâ€mailowym powiÄ…zane {{PLURAL:$3|jest konto użytkownika|sÄ… nastÄ™pujÄ…ce konta użytkowników:}}
+'passwordreset' => 'Wyczyść hasło',
+'passwordreset-text' => 'WypeÅ‚nij formularz, aby otrzymać eâ€mail z przypomnieniem danych Twojego konta.',
+'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-username' => 'Nazwa użytkownika:',
+'passwordreset-domain' => 'Domena',
+'passwordreset-capture' => 'Czy pokazywać treść wiadomoÅ›ci eâ€mail?',
+'passwordreset-capture-help' => 'JeÅ›li zaznaczysz to pole, zobaczysz treść wiadomoÅ›ci eâ€mail z tymczasowym hasÅ‚em, w tej samej formie w jakiej jest wysyÅ‚ana do użytkownika.',
+'passwordreset-email' => 'Adres eâ€mail',
+'passwordreset-emailtitle' => 'Dane konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'KtoÅ› (prawdopodobnie Ty, spod adresu IP $1) poprosiÅ‚ o przypomnienie szczegółów dotyczÄ…cych Twojego konta w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem eâ€mailowym powiÄ…zane {{PLURAL:$3|jest konto użytkownika|sÄ… nastÄ™pujÄ…ce konta użytkowników:}}
$2
{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.
Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chce go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystał ze swojego starego hasła.',
-'passwordreset-emailtext-user' => 'Użytkownik $1 poprosiÅ‚ o przypomnienie szczegółów dotyczÄ…cych Twojego konta w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem eâ€mailowym powiÄ…zane {{PLURAL:$3|jest konto użytkownika|sÄ… nastÄ™pujÄ…ce konta użytkowników:}}
+'passwordreset-emailtext-user' => 'Użytkownik $1 poprosiÅ‚ o przypomnienie szczegółów dotyczÄ…cych Twojego konta w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem eâ€mailowym powiÄ…zane {{PLURAL:$3|jest konto użytkownika|sÄ… nastÄ™pujÄ…ce konta użytkowników:}}
$2
{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.
Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chce go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystał ze swojego starego hasła.',
-'passwordreset-emailelement' => 'Nazwa użytkownika – $1
+'passwordreset-emailelement' => 'Nazwa użytkownika – $1
Tymczasowe hasło – $2',
-'passwordreset-emailsent' => 'PrzypominajÄ…cy eâ€mail zostaÅ‚ wysÅ‚any.',
+'passwordreset-emailsent' => 'PrzypominajÄ…cy eâ€mail zostaÅ‚ wysÅ‚any.',
+'passwordreset-emailsent-capture' => 'Poniżej znajdujÄ…cy siÄ™ eâ€mail z przypomnieniem 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',
+
+# Special:ChangeEmail
+'changeemail' => 'Zmiana adresu eâ€mail',
+'changeemail-header' => 'Zmiana adresu eâ€mail',
+'changeemail-text' => 'Wypełnij formularz, jeśli chcesz zmienić swój adres poczty elektronicznej. Będziesz musiał wprowadzić hasło, aby potwierdzić tę zmianę.',
+'changeemail-no-info' => 'Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.',
+'changeemail-oldemail' => 'Obecny adres eâ€mail',
+'changeemail-newemail' => 'Nowy adres e-mail',
+'changeemail-none' => '(brak)',
+'changeemail-submit' => 'Zapisz nowy',
+'changeemail-cancel' => 'Anuluj',
# Edit page toolbar
'bold_sample' => 'Tekst tłustą czcionką',
@@ -861,9 +918,6 @@ Nie możesz użyć funkcji „WyÅ›lij eâ€mail do tego użytkownikaâ€, jeÅ›li b
Twój obecny adres IP to $3, a numer identyfikacyjny blokady to $5.
Prosimy o podanie obu tych numerów przy wyjaśnianiu blokady.",
'blockednoreason' => 'nie podano przyczyny',
-'blockedoriginalsource' => "Źródło '''$1''' zostało pokazane poniżej:",
-'blockededitsource' => "Tekst '''Twoich edycji''' na '''$1''' został pokazany poniżej:",
-'whitelistedittitle' => 'Przed edycją musisz się zalogować',
'whitelistedittext' => 'Musisz $1, by edytować strony.',
'confirmedittext' => 'Edytowanie jest możliwe dopiero po zweryfikowaniu adresu eâ€mail.
Podaj adres eâ€mail i potwierdź go w swoich [[Special:Preferences|ustawieniach użytkownika]].',
@@ -1120,8 +1174,6 @@ Inni administratorzy {{GRAMMAR:D.lp|{{SITENAME}}}} nadal będą mieć dostęp do
'revdelete-unsuppress' => 'Wyłącz utajnianie dla odtwarzanej historii zmian',
'revdelete-log' => 'Powód',
'revdelete-submit' => 'Zaakceptuj dla {{PLURAL:$1|wybranej|wybranych}} wersji',
-'revdelete-logentry' => 'zmienił widoczność wersji w [[$1]]',
-'logdelete-logentry' => 'zmienił widoczność zdarzenia dla [[$1]]',
'revdelete-success' => "'''Uaktualniono widoczność wersji.'''",
'revdelete-failure' => "'''Widoczność wersji nie może zostać uaktualniona – '''
$1",
@@ -1133,15 +1185,6 @@ $1",
'revdel-restore-visible' => 'widoczne wersje',
'pagehist' => 'Historia edycji strony',
'deletedhist' => 'Usunięta historia edycji',
-'revdelete-content' => 'zawartość',
-'revdelete-summary' => 'opis zmian',
-'revdelete-uname' => 'nazwę użytkownika',
-'revdelete-restricted' => 'ograniczono widoczność dla administratorów',
-'revdelete-unrestricted' => 'wycofano ograniczenie widoczności dla administratorów',
-'revdelete-hid' => 'ukryto $1',
-'revdelete-unhid' => 'nie ukrywaj $1',
-'revdelete-log-message' => '$1 – $2 {{PLURAL:$2|wersja|wersje|wersji}}',
-'logdelete-log-message' => '$1 – $2 {{PLURAL:$2|zdarzenie|zdarzenia|zdarzeń}}',
'revdelete-hide-current' => 'Wystąpił błąd przy ukrywaniu wersji datowanej na $2, $1. To jest najnowsza wersja strony, która nie może zostać ukryta.',
'revdelete-show-no-access' => 'Wystąpił błąd przy próbie wyświetlenia elementu datowanego na $2, $1. Widoczność tego elementu została ograniczona – nie masz prawa dostępu do niego.',
'revdelete-modify-no-access' => 'Wystąpił błąd przy próbie modyfikacji elementu datowanego na $2, $1. Widoczność tego elementu została ograniczona – nie masz prawa dostępu do niego.',
@@ -1297,12 +1340,14 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
'prefs-rc' => 'Ostatnie zmiany',
'prefs-watchlist' => 'Obserwowane',
'prefs-watchlist-days' => 'Liczba dni widocznych na liście obserwowanych',
-'prefs-watchlist-days-max' => 'Maksimum 7 dni',
+'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|dzień|dni}}',
'prefs-watchlist-edits' => 'Liczba edycji pokazywanych w rozszerzonej liście obserwowanych',
'prefs-watchlist-edits-max' => 'Maksymalnie 1000',
'prefs-watchlist-token' => 'Identyfikator listy obserwowanych',
'prefs-misc' => 'Ustawienia różne',
'prefs-resetpass' => 'Zmień hasło',
+'prefs-changeemail' => 'ZmieÅ„ adres eâ€mail',
+'prefs-setemail' => 'Ustaw adres eâ€mail',
'prefs-email' => 'Eâ€mail',
'prefs-rendering' => 'WyglÄ…d',
'saveprefs' => 'Zapisz',
@@ -1362,6 +1407,7 @@ Tej operacji nie można później cofnąć.',
'yourrealname' => 'ImiÄ™ i nazwisko',
'yourlanguage' => 'Język interfejsu',
'yourvariant' => 'Wariant języka treści',
+'prefs-help-variant' => 'Preferowany wariant ortografii, który ma zostać użyty przy wyświetlaniu treści tej wiki.',
'yournick' => 'Twój podpis',
'prefs-help-signature' => 'Wypowiedzi na stronach dyskusji powinny być podpisywane za pomocÄ… „<nowiki>~~~~</nowiki>â€, dziÄ™ki temu automatycznie wstawiany jest Twój podpis wraz z bieżącÄ… datÄ….',
'badsig' => 'Nieprawidłowy podpis, sprawdź znaczniki HTML.',
@@ -1402,7 +1448,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'userrights-lookup-user' => 'Zarządzaj grupami użytkownika',
'userrights-user-editname' => 'Wprowadź nazwę użytkownika',
'editusergroup' => 'Edytuj grupy użytkownika',
-'editinguser' => "Zmiana uprawnień użytkownika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Zmiana uprawnień użytkownika '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Edytuj grupy użytkownika',
'saveusergroups' => 'Zapisz',
'userrights-groupsmember' => 'Należy do:',
@@ -1496,13 +1542,13 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'right-autopatrol' => 'WÅ‚asne edycje automatycznie oznaczane jako „sprawdzoneâ€',
'right-patrolmarks' => 'PodglÄ…d znaczników patrolowania ostatnich zmian – oznaczania jako „sprawdzoneâ€',
'right-unwatchedpages' => 'PodglÄ…d listy stron nieobserwowanych',
-'right-trackback' => 'Wysyłanie trackback',
'right-mergehistory' => 'ÅÄ…czenie historii edycji stron',
'right-userrights' => 'Edycja uprawnień wszystkich użytkowników',
'right-userrights-interwiki' => 'Edycja uprawnień użytkowników innych witryn wiki',
'right-siteadmin' => 'Blokowanie i odblokowywanie bazy danych',
'right-override-export-depth' => 'Eksport stron wraz z linkowanymi do głębokości 5 linków',
'right-sendemail' => 'WysyÅ‚anie eâ€maili do innych użytkowników',
+'right-passwordreset' => 'Sprawdzanie treÅ›ci eâ€maila o resetowaniu hasÅ‚a',
# User rights log
'rightslog' => 'Uprawnienia',
@@ -1536,16 +1582,17 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'action-suppressionlog' => 'podglÄ…du rejestru ukrywania',
'action-block' => 'zablokowania temu użytkownikowi możliwości edycji',
'action-protect' => 'zmiany poziomu zabezpieczenia tej strony',
+'action-rollback' => 'szybkiego wycofania zmian wprowadzonych przez użytkownika, który jako ostatni edytował tę stronę',
'action-import' => 'importu tej strony z innej wiki',
'action-importupload' => 'importu tej strony poprzez przesłanie pliku',
'action-patrol' => 'oznaczenia cudzej edycji jako „sprawdzonejâ€',
'action-autopatrol' => 'oznaczenia wÅ‚asnej edycji jako „sprawdzonejâ€',
'action-unwatchedpages' => 'podglÄ…du listy nieobserwowanych stron',
-'action-trackback' => 'wysyłania trackbacka',
'action-mergehistory' => 'Å‚Ä…czenia historii edycji tej strony',
'action-userrights' => 'edytowania uprawnień wszystkich użytkowników',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
@@ -1577,6 +1624,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|obserwujący użytkownik|obserwujących użytkowników}}]',
'rc_categories' => 'Ogranicz do kategorii (oddzielaj za pomocÄ… „|â€)',
'rc_categories_any' => 'Wszystkie',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajty|bajtów}} po zmianie',
'newsectionsummary' => '/* $1 */ nowa sekcja',
'rc-enhanced-expand' => 'Pokaż szczegóły (wymagana JavaScript)',
'rc-enhanced-hide' => 'Ukryj szczegóły',
@@ -1631,6 +1679,7 @@ Przejdź na stronę [[Special:NewFiles|galerii nowych plików]], by zobaczyć pl
'minlength1' => 'Nazwa pliku musi składać się co najmniej z jednej litery.',
'illegalfilename' => 'Nazwa pliku „$1†zawiera znaki niedozwolone w tytułach stron.
Zmień nazwę pliku i prześlij go ponownie.',
+'filename-toolong' => 'Nazwy plików nie mogą być dłuższe niż 240 bajtów.',
'badfilename' => 'Nazwa pliku zostaÅ‚a zmieniona na „$1â€.',
'filetype-mime-mismatch' => 'Rozszerzenie pliku „.$1“ nie pasuje do wykrytego typu MIME $2.',
'filetype-badmime' => 'Przesyłanie plików z typem MIME „$1†jest niedozwolone.',
@@ -1742,6 +1791,41 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
'upload-unknown-size' => 'Nieznany rozmiar',
'upload-http-error' => 'Wystąpił błąd protokołu HTTP – $1',
+# File backend
+'backend-fail-stream' => 'Nie można odczytać pliku $1.',
+'backend-fail-backup' => 'Nie można utworzyć kopii zapasowej pliku $1 .',
+'backend-fail-notexists' => 'Plik $1 nie istnieje.',
+'backend-fail-hashes' => 'Nie można uzyskać sum kontrolnych do porównania.',
+'backend-fail-notsame' => 'Plik o podobnej nazwie już istnieje w $1.',
+'backend-fail-invalidpath' => '$1nie jest poprawną ścieżką zapisu.',
+'backend-fail-delete' => 'Nie można usunąć pliku $1.',
+'backend-fail-alreadyexists' => 'Plik „$1†już istnieje',
+'backend-fail-store' => 'Nie może zapisać pliku $1 w $2 .',
+'backend-fail-copy' => 'Nie może skopiować pliku $1 do $2.',
+'backend-fail-move' => 'Nie można przenieść pliku $1 do $2.',
+'backend-fail-opentemp' => 'Nie można otworzyć pliku tymczasowego.',
+'backend-fail-writetemp' => 'Nie można otworzyć pliku tymczasowego.',
+'backend-fail-closetemp' => 'Nie można zamknąć pliku tymczasowego.',
+'backend-fail-read' => 'Nie można odczytać pliku $1.',
+'backend-fail-create' => 'Nie można utworzyć pliku $1.',
+'backend-fail-readonly' => 'Interfejs magazynowania "$1" jest obecnie tylko do odczytu. Powód: "$2"',
+'backend-fail-synced' => 'Plik "$1" jest w niespójnym stanie w ramach wewnętrznych funkcji magazynowania',
+'backend-fail-connect' => 'Nie można nawiązać połączenia do wewnętrznych funkcji magazynowania "$1".',
+'backend-fail-internal' => 'Wystąpił nieznany błąd w wewnętrznych funkcjach magazynowania "$1".',
+'backend-fail-contenttype' => 'Nie można określić typ zawartości pliku do przechowywania w "$1".',
+'backend-fail-batchsize' => 'Wewnętrzne funkcje magazynowania otrzymały $1 {{PLURAL:$1|operację|operacje|operacji}} na pliku; limit wynosi $2 {{PLURAL:$2| operacja|operacje|operacji}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Nie można odblokować "$1", ponieważ nie jest on zablokowany.',
+'lockmanager-fail-closelock' => 'Nie można znieść blokady z pliku "$1".',
+'lockmanager-fail-deletelock' => 'Nie można usunąć blokady z pliku "$1".',
+'lockmanager-fail-acquirelock' => 'Nie można ustawić blokady dla pliku "$1".',
+'lockmanager-fail-openlock' => 'Nie można znieść blokady z pliku "$1".',
+'lockmanager-fail-releaselock' => 'Nie może zwolnić blokady dla " $1 ".',
+'lockmanager-fail-db-bucket' => 'Nie można powiązać wystarczającej ilości zablokowanych baz danych w segmencie $1 .',
+'lockmanager-fail-db-release' => 'Nie udało się zwolnić blokad w bazie danych $1.',
+'lockmanager-fail-svr-release' => 'Nie udało się zwolnić blokady na serwerze $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Wystąpił błąd podczas otwierania pliku ZIP, aby go sprawdzić.',
'zip-wrong-format' => 'Wybrany plik nie jest w formacie ZIP.',
@@ -1758,6 +1842,7 @@ Plik nie może zostać odpowiednio sprawdzony pod kątem bezpieczeństwa.',
'uploadstash-badtoken' => 'Operacja nie powiodła się. Możliwą przyczyną jest, że Twoje upoważnienie do edytowania wygasło. Spróbuj ponownie.',
'uploadstash-errclear' => 'Czyszczenie plików nie powiodło się.',
'uploadstash-refresh' => 'Odśwież listę plików',
+'invalid-chunk-offset' => 'Nieprawidłowe przesunięcie fragmentu',
# img_auth script messages
'img-auth-accessdenied' => 'Odmowa dostępu',
@@ -1864,23 +1949,24 @@ Poniżej znajdują się informacje ze [$2 strony opisu] tego pliku.',
'filerevert-badversion' => 'Brak poprzedniej lokalnej wersji tego pliku z podanÄ… datÄ….',
# File deletion
-'filedelete' => 'Usuwanie „$1â€',
-'filedelete-legend' => 'Usuń plik',
-'filedelete-intro' => "Chcesz usunąć plik '''[[Media:$1|$1]]''' razem z całą jego historią.",
-'filedelete-intro-old' => "Usuwasz wersjÄ™ pliku '''[[Media:$1|$1]]''' z datÄ… [$4 $3, $2].",
-'filedelete-comment' => 'Powód',
-'filedelete-submit' => 'Usuń plik',
-'filedelete-success' => "Usunięto plik '''$1'''.",
-'filedelete-success-old' => "Usunięto plik '''[[Media:$1|$1]]''' w wersji z $3, $2.",
-'filedelete-nofile' => "Plik '''$1''' nie istnieje.",
-'filedelete-nofile-old' => "Brak zarchiwizowanej wersji '''$1''' o podanych atrybutach.",
-'filedelete-otherreason' => 'Inny powód',
-'filedelete-reason-otherlist' => 'Inny powód',
-'filedelete-reason-dropdown' => '* Najczęstsze przyczyny usunięcia
+'filedelete' => 'Usuwanie „$1â€',
+'filedelete-legend' => 'Usuń plik',
+'filedelete-intro' => "Chcesz usunąć plik '''[[Media:$1|$1]]''' razem z całą jego historią.",
+'filedelete-intro-old' => "Usuwasz wersjÄ™ pliku '''[[Media:$1|$1]]''' z datÄ… [$4 $3, $2].",
+'filedelete-comment' => 'Powód',
+'filedelete-submit' => 'Usuń plik',
+'filedelete-success' => "Usunięto plik '''$1'''.",
+'filedelete-success-old' => "Usunięto plik '''[[Media:$1|$1]]''' w wersji z $3, $2.",
+'filedelete-nofile' => "Plik '''$1''' nie istnieje.",
+'filedelete-nofile-old' => "Brak zarchiwizowanej wersji '''$1''' o podanych atrybutach.",
+'filedelete-otherreason' => 'Inny powód',
+'filedelete-reason-otherlist' => 'Inny powód',
+'filedelete-reason-dropdown' => '* Najczęstsze przyczyny usunięcia
** Naruszenie praw autorskich
** Kopia już istniejącego pliku',
-'filedelete-edit-reasonlist' => 'Edycja listy powodów usunięcia pliku',
-'filedelete-maintenance' => 'Usuwanie i odtwarzanie plików zostało tymczasowo wyłączone z powodu konserwacji.',
+'filedelete-edit-reasonlist' => 'Edycja listy powodów usunięcia pliku',
+'filedelete-maintenance' => 'Usuwanie i odtwarzanie plików zostało tymczasowo wyłączone z powodu konserwacji.',
+'filedelete-maintenance-title' => 'Nie można usunąć pliku',
# MIME search
'mimesearch' => 'Wyszukiwanie MIME',
@@ -1979,6 +2065,8 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
'wantedpages' => 'Najpotrzebniejsze strony',
'wantedpages-badtitle' => 'Nieprawidłowy tytuł wśród wyników – $1',
'wantedfiles' => 'Potrzebne pliki',
+'wantedfiletext-cat' => 'Następujące pliki są używane, ale nie istnieją. Pliki z obcych repozytoriów mogą być wymienione pomimo istnienia. Takie fałszywe wyniki zostaną <del>przekreślone</del>. Ponadto strony, które osadzają pliki, które nie istnieją, są wymienione w [[:$1]].',
+'wantedfiletext-nocat' => 'Następujące pliki są używane, ale nie istnieją. Pliki z obcych repozytoriów mogą być wymienione pomimo istnienia. Takie fałszywe wyniki zostaną <del>przekreślone</del>.',
'wantedtemplates' => 'Potrzebne szablony',
'mostlinked' => 'Najczęściej linkowane strony',
'mostlinkedcategories' => 'Kategorie o największej liczbie stron',
@@ -1987,6 +2075,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
'mostimages' => 'Najczęściej linkowane pliki',
'mostrevisions' => 'Strony o największej liczbie wersji',
'prefixindex' => 'Wszystkie strony o prefiksie',
+'prefixindex-namespace' => 'Wszystkie strony z prefiksem ( $1 przestrzeń nazw)',
'shortpages' => 'Najkrótsze strony',
'longpages' => 'Najdłuższe strony',
'deadendpages' => 'Strony bez linków wewnętrznych',
@@ -2003,7 +2092,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
'listusers-editsonly' => 'Pokaż tylko użytkowników z edycjami',
'listusers-creationsort' => 'Sortuj według daty utworzenia',
'usereditcount' => '$1 {{PLURAL:$1|edycja|edycje|edycji}}',
-'usercreated' => 'Utworzono $1 o $2',
+'usercreated' => '{{GENDER:$3|Utworzył|Utworzyła|Utworzone}} $1 o $2',
'newpages' => 'Nowe strony',
'newpages-username' => 'Nazwa użytkownika',
'ancientpages' => 'Najstarsze strony',
@@ -2096,12 +2185,8 @@ Obsługiwane protokoły: <tt>$1</tt> (nie podawaj ich podczas wyszukiwania).',
'activeusers-noresult' => 'Nie odnaleziono żadnego użytkownika.',
# Special:Log/newusers
-'newuserlogpage' => 'Nowi użytkownicy',
-'newuserlogpagetext' => 'To jest rejestr ostatnio utworzonych kont użytkowników',
-'newuserlog-byemail' => 'hasÅ‚o zostaÅ‚o wysÅ‚ane eâ€mailem',
-'newuserlog-create-entry' => '– nowy użytkownik',
-'newuserlog-create2-entry' => 'utworzył konto $1',
-'newuserlog-autocreate-entry' => '– konto utworzone automatycznie',
+'newuserlogpage' => 'Nowi użytkownicy',
+'newuserlogpagetext' => 'To jest rejestr ostatnio utworzonych kont użytkowników',
# Special:ListGroupRights
'listgrouprights' => 'Uprawnienia grup użytkowników',
@@ -2130,7 +2215,7 @@ Sprawdź stronę z [[{{MediaWiki:Listgrouprights-helppage}}|dodatkowymi informac
'emailpagetext' => 'Możesz użyć poniższego formularza, aby wysÅ‚ać wiadomość eâ€mail do tego użytkownika.
Adres eâ€mailowy, który zostaÅ‚ przez Ciebie wprowadzony w [[Special:Preferences|Twoich preferencjach]], zostanie umieszczony w polu „Odâ€, dziÄ™ki czemu odbiorca bÄ™dzie mógÅ‚ Ci odpowiedzieć.',
'usermailererror' => 'Moduł obsługi poczty zwrócił błąd:',
-'defemailsubject' => 'Wiadomość z {{GRAMMAR:D.lp|{{SITENAME}}}}',
+'defemailsubject' => '{{SITENAME}} – eâ€mail od użytkownika „$1“',
'usermaildisabled' => 'Eâ€mail użytkownika jest wyÅ‚Ä…czony',
'usermaildisabledtext' => 'Nie możesz wysyÅ‚ać eâ€maili do innych użytkowników tej wiki',
'noemailtitle' => 'Brak adresu eâ€mail',
@@ -2184,7 +2269,7 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
'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}}.',
'iteminvalidname' => 'Problem z pozycją „$1†– niepoprawna nazwa...',
-'wlnote' => "Poniżej pokazano {{PLURAL:$1|ostatnią zmianę wykonaną|ostatnie '''$1''' zmiany wykonane|ostatnich '''$1''' zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniej godziny|ostatnich '''$2''' godzin}}.",
+'wlnote' => "Poniżej pokazano {{PLURAL:$1|ostatnią zmianę wykonaną|ostatnie '''$1''' zmiany wykonane|ostatnich '''$1''' zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniej godziny|ostatnich '''$2''' godzin}}, licząc od $4 dnia $3.",
'wlshowlast' => 'Pokaż ostatnie $1 godzin, $2 dni ($3)',
'watchlist-options' => 'Opcje obserwowanych',
@@ -2246,8 +2331,6 @@ Upewnij się, czy na pewno chcesz to zrobić, że rozumiesz konsekwencje i że r
'actionfailed' => 'Działanie nie powiodło się',
'deletedtext' => 'UsuniÄ™to „$1â€.
Zobacz na stronie $2 rejestr ostatnio wykonanych usunięć.',
-'deletedarticle' => 'usunÄ…Å‚ [[$1]]',
-'suppressedarticle' => 'utajnił [[$1]]',
'dellogpage' => 'Usunięte',
'dellogpagetext' => 'Poniżej znajduje się lista ostatnio wykonanych usunięć.',
'deletionlog' => 'rejestr usunięć',
@@ -2296,7 +2379,10 @@ Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages
'unprotectedarticle' => 'odbezpieczył „[[$1]]“',
'movedarticleprotection' => 'przeniósł ustawienia zabezpieczeń z [[$2]] do [[$1]]',
'protect-title' => 'Zmiana poziomu zabezpieczenia „$1â€',
+'protect-title-notallowed' => 'PodglÄ…d poziomu zabezpieczenia „$1â€',
'prot_1movedto2' => 'stronę [[$1]] przeniósł do [[$2]]',
+'protect-badnamespace-title' => 'Przestrzeń nazw, w której nie można zabezpieczać stron',
+'protect-badnamespace-text' => 'Stron w tej przestrzeni nazw nie można zabezpieczać.',
'protect-legend' => 'Potwierdź zabezpieczenie',
'protectcomment' => 'Powód',
'protectexpiry' => 'Czas wygaśnięcia',
@@ -2315,6 +2401,7 @@ Obecne ustawienia dla strony '''$1''' to:",
'protect-level-sysop' => 'Dostęp mają tylko administratorzy',
'protect-summary-cascade' => 'dziedziczenie',
'protect-expiring' => 'wygasa $1 (UTC)',
+'protect-expiring-local' => 'wygasa $1',
'protect-expiry-indefinite' => 'na zawsze',
'protect-cascade' => 'Dziedziczenie zabezpieczenia – zabezpiecz wszystkie strony zawarte na tej stronie.',
'protect-cantedit' => 'Nie możesz zmienić poziomu zabezpieczenia tej strony, ponieważ nie masz uprawnień do jej edycji.',
@@ -2375,7 +2462,6 @@ Możesz mieć zły link lub wersja mogła zostać odtworzona lub usunięta z arc
'undeletereset' => 'Wyczyść',
'undeleteinvert' => 'Odwróć zaznaczenie',
'undeletecomment' => 'Powód',
-'undeletedarticle' => 'odtworzył [[$1]]',
'undeletedrevisions' => 'odtworzono {{PLURAL:$1|1 wersjÄ™|$1 wersje|$1 wersji}}',
'undeletedrevisions-files' => 'odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}',
'undeletedfiles' => 'odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}',
@@ -2385,6 +2471,7 @@ Ktoś inny prawdopodobnie odtworzył już tę stronę.',
Zobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.",
'undelete-header' => 'Zobacz [[Special:Log/delete|rejestr usunięć]], aby sprawdzić ostatnio usunięte strony.',
+'undelete-search-title' => 'Przeszukiwanie usuniętych stron',
'undelete-search-box' => 'Szukaj usuniętych stron',
'undelete-search-prefix' => 'Strony o tytułach rozpoczynających się od',
'undelete-search-submit' => 'Szukaj',
@@ -2394,6 +2481,7 @@ Zobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatn
'undelete-cleanup-error' => 'WystÄ…piÅ‚ bÅ‚Ä…d przy usuwaniu nieużywanego archiwalnego pliku „$1â€.',
'undelete-missing-filearchive' => 'Nie udało się odtworzyć z archiwum pliku o ID $1, ponieważ brak go w bazie danych.
Być może plik został już odtworzony.',
+'undelete-error' => 'Błąd odtwarzania usuniętej strony',
'undelete-error-short' => 'Wystąpił błąd przy odtwarzaniu pliku: $1',
'undelete-error-long' => 'Napotkano błędy przy odtwarzaniu pliku:
@@ -2516,6 +2604,7 @@ Przejdź do [[Special:BlockList|listy zablokowanych adresów IP]], by przejrzeć
'blocklist-userblocks' => 'Ukryj blokady konta',
'blocklist-tempblocks' => 'Ukryj tymczasowe blokady',
'blocklist-addressblocks' => 'Ukryj blokady pojedynczych adresów IP',
+'blocklist-rangeblocks' => 'Ukryj blokady zakresów',
'blocklist-timestamp' => 'Sygnatura czasowa',
'blocklist-target' => 'Cel',
'blocklist-expiry' => 'Upływa',
@@ -2538,6 +2627,7 @@ Przejdź do [[Special:BlockList|listy zablokowanych adresów IP]], by przejrzeć
'unblocklink' => 'odblokuj',
'change-blocklink' => 'zmień blokadę',
'contribslink' => 'edycje',
+'emaillink' => 'wyÅ›lij eâ€mail',
'autoblocker' => 'Zablokowano CiÄ™ automatycznie, ponieważ używasz tego samego adresu IP, co użytkownik „[[User:$1|$1]]â€.
Przyczyna blokady $1 to: „$2â€',
'blocklogpage' => 'Historia blokad',
@@ -2662,9 +2752,6 @@ Wybierz innÄ… nazwÄ™.',
'movepage-page-moved' => 'Strona $1 została przeniesiona do $2.',
'movepage-page-unmoved' => 'Nazwa strony $1 nie może zostać zmieniona na $2.',
'movepage-max-pages' => 'Przeniesionych zostało $1 {{PLURAL:$1|strona|strony|stron}}. Większa liczba nie może być przeniesiona automatycznie.',
-'1movedto2' => '[[$1]] przeniesiono do [[$2]]',
-'1movedto2_redir' => '[[$1]] przeniesiono do [[$2]] nad przekierowaniem',
-'move-redirect-suppressed' => 'nie utworzono przekierowania pod starym tytułem',
'movelogpage' => 'Przeniesione',
'movelogpagetext' => 'Lista stron, które ostatnio zostały przeniesione.',
'movesubpage' => '{{PLURAL:$1|Podstrona|Podstrony}}',
@@ -2677,7 +2764,7 @@ Wybierz innÄ… nazwÄ™.',
Strona docelowa „[[:$1]]†istnieje.
Czy chcesz ją usunąć, by zrobić miejsce dla przenoszonej strony?',
'delete_and_move_confirm' => 'Tak, usuń stronę',
-'delete_and_move_reason' => 'Usunięto, by zrobić miejsce dla przenoszonej strony',
+'delete_and_move_reason' => 'UsuniÄ™to, by zrobić miejsce dla przenoszonej strony „[[$1]]â€',
'selfmove' => 'Nazwy stron źródłowej i docelowej są takie same.
Strony nie można przenieść na nią samą.',
'immobile-source-namespace' => 'Nie można przenieść stron w przestrzeni nazw „$1â€',
@@ -2708,9 +2795,11 @@ Wyeksportowane informacje można później zaimportować do innej wiki, działaj
Wyeksportowanie wielu stron wymaga wpisania poniżej tytułów stron po jednym tytule w wierszu oraz określenia, czy ma zostać wyeksportowana bieżąca czy wszystkie wersje strony z opisami edycji lub też tylko bieżąca wersja z opisem ostatniej edycji.
Możesz również użyć linku, np. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] dla strony „[[{{MediaWiki:Mainpage}}]]â€.',
+'exportall' => 'Eksportuj wszystkie strony',
'exportcuronly' => 'Tylko bieżąca wersja, bez historii',
'exportnohistory' => "----
'''Uwaga:''' Wyłączono możliwość eksportowania pełnej historii stron z użyciem tego narzędzia z powodu kłopotów z wydajnością.",
+'exportlistauthors' => 'Dołącz pełną listę autorów dla każdej strony',
'export-submit' => 'Eksportuj',
'export-addcattext' => 'Dodaj strony z kategorii',
'export-addcat' => 'Dodaj',
@@ -2743,6 +2832,8 @@ Odwiedź [//www.mediawiki.org/wiki/Localisation Tłumaczenie MediaWiki] oraz [//
'thumbnail_error' => 'BÅ‚Ä…d przy generowaniu miniatury $1',
'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',
+'thumbnail-dest-create' => 'Nie można zapisać miniatury do miejsca docelowego',
'thumbnail_invalid_params' => 'Nieprawidłowe parametry miniatury',
'thumbnail_dest_directory' => 'Nie można utworzyć katalogu docelowego',
'thumbnail_image-type' => 'Grafika tego typu nie jest obsługiwana',
@@ -2788,6 +2879,11 @@ Brak katalogu dla plików tymczasowych.',
'import-upload' => 'Prześlij dane w formacie XML',
'import-token-mismatch' => 'Utracono dane sesji. Proszę spróbować ponownie.',
'import-invalid-interwiki' => 'Nie można importować z podanej wiki.',
+'import-error-edit' => 'Strona „$1“ nie została zaimportowana ponieważ nie jesteś uprawniony do jej edytowania.',
+'import-error-create' => 'Strona „$1“ nie została zaimportowana ponieważ nie jesteś uprawniony do jej utworzenia.',
+'import-error-interwiki' => 'Strona „$1†nie została zaimportowana, ponieważ jej nazwa jest zarezerwowana do linków zewnętrznych (interwiki).',
+'import-error-special' => 'Strona „$1†nie została zaimportowana, ponieważ należy do specjalnej przestrzeni nazw, która nie zezwala na strony.',
+'import-error-invalid' => 'Strona „$1†nie została zaimportowana, ponieważ jej nazwa jest nieprawidłowa.',
# Import log
'importlogpage' => 'Rejestr importu',
@@ -2797,73 +2893,86 @@ Brak katalogu dla plików tymczasowych.',
'import-logentry-interwiki' => 'zaimportował $1 używając transwiki',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|wersja|wersje|wersji}} z $2',
+# JavaScriptTest
+'javascripttest' => 'Testowanie JavaScript',
+'javascripttest-disabled' => 'Ta funkcja jest wyłączona.',
+'javascripttest-title' => 'Uruchamianie testów $1',
+'javascripttest-pagetext-noframework' => 'Ta strona jest zarezerwowana dla wykonywania testów JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Nieznany framework testowania „$1â€.',
+'javascripttest-pagetext-frameworks' => 'Wybierz jeden z następujących frameworków testowania: $1',
+'javascripttest-pagetext-skins' => 'Wybierz skórkę, na której chcesz uruchomić testy:',
+'javascripttest-qunit-intro' => 'Zobacz [$1 dokumentację testów] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'Pakiet testów JavaScriptu MediaWiki QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Moja osobista strona',
-'tooltip-pt-anonuserpage' => 'Strona użytkownika dla adresu IP, spod którego edytujesz',
-'tooltip-pt-mytalk' => 'Moja strona dyskusji',
-'tooltip-pt-anontalk' => 'Dyskusja użytkownika dla adresu IP, spod którego edytujesz',
-'tooltip-pt-preferences' => 'Moje preferencje',
-'tooltip-pt-watchlist' => 'Lista stron obserwowanych przez Ciebie',
-'tooltip-pt-mycontris' => 'Lista moich edycji',
-'tooltip-pt-login' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.',
-'tooltip-pt-anonlogin' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe',
-'tooltip-pt-logout' => 'Wyloguj',
-'tooltip-ca-talk' => 'Dyskusja o zawartości tej strony.',
-'tooltip-ca-edit' => 'Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.',
-'tooltip-ca-addsection' => 'Dodaj nowy wÄ…tek.',
-'tooltip-ca-viewsource' => 'Ta strona jest zabezpieczona. Możesz zobaczyć tekst źródłowy.',
-'tooltip-ca-history' => 'Starsze wersje tej strony.',
-'tooltip-ca-protect' => 'Zabezpiecz tÄ™ stronÄ™.',
-'tooltip-ca-unprotect' => 'Zmień zabezpieczenie strony',
-'tooltip-ca-delete' => 'Usuń tę stronę',
-'tooltip-ca-undelete' => 'Przywróć wersję tej strony sprzed usunięcia',
-'tooltip-ca-move' => 'PrzenieÅ› tÄ™ stronÄ™.',
-'tooltip-ca-watch' => 'Dodaj tÄ™ stronÄ™ do listy obserwowanych',
-'tooltip-ca-unwatch' => 'Usuń tę stronę z listy obserwowanych',
-'tooltip-search' => 'Przeszukaj {{GRAMMAR:B.lp|{{SITENAME}}}}',
-'tooltip-search-go' => 'Przejdź do strony o dokładnie takim tytule, o ile istnieje',
-'tooltip-search-fulltext' => 'Szukaj wprowadzonego tekstu w treści stron',
-'tooltip-p-logo' => 'Strona główna',
-'tooltip-n-mainpage' => 'Zobacz stronę główną',
-'tooltip-n-mainpage-description' => 'Przejdź na stronę główną',
-'tooltip-n-portal' => 'O projekcie, co możesz zrobić, gdzie możesz znaleźć informacje',
-'tooltip-n-currentevents' => 'Informacje o aktualnych wydarzeniach',
-'tooltip-n-recentchanges' => 'Lista ostatnich zmian na {{GRAMMAR:MS.lp|{{SITENAME}}}}.',
-'tooltip-n-randompage' => 'Pokaż stronę wybraną losowo',
-'tooltip-n-help' => 'Tutaj możesz się wielu rzeczy dowiedzieć.',
-'tooltip-t-whatlinkshere' => 'Pokaż listę wszystkich stron linkujących do tej strony',
-'tooltip-t-recentchangeslinked' => 'Ostatnie zmiany w stronach, do których ta strona linkuje',
-'tooltip-feed-rss' => 'Kanał RSS dla tej strony',
-'tooltip-feed-atom' => 'Kanał Atom dla tej strony',
-'tooltip-t-contributions' => 'Pokaż listę edycji tego użytkownika',
-'tooltip-t-emailuser' => 'WyÅ›lij eâ€mail do tego użytkownika',
-'tooltip-t-upload' => 'Prześlij plik',
-'tooltip-t-specialpages' => 'Lista wszystkich specjalnych stron',
-'tooltip-t-print' => 'Wersja do wydruku',
-'tooltip-t-permalink' => 'Stały link do tej wersji strony',
-'tooltip-ca-nstab-main' => 'Zobacz stronę treści',
-'tooltip-ca-nstab-user' => 'Zobacz stronę osobistą użytkownika',
-'tooltip-ca-nstab-media' => 'Zobacz stronÄ™ pliku',
-'tooltip-ca-nstab-special' => 'To jest strona specjalna. Nie możesz jej edytować.',
-'tooltip-ca-nstab-project' => 'Zobacz stronÄ™ projektu',
-'tooltip-ca-nstab-image' => 'Zobacz stronÄ™ grafiki',
-'tooltip-ca-nstab-mediawiki' => 'Zobacz komunikat systemowy',
-'tooltip-ca-nstab-template' => 'Zobacz szablon',
-'tooltip-ca-nstab-help' => 'Zobacz stronÄ™ pomocy',
-'tooltip-ca-nstab-category' => 'Zobacz stronÄ™ kategorii',
-'tooltip-minoredit' => 'Oznacz zmianÄ™ jako drobnÄ…',
-'tooltip-save' => 'Zapisz zmiany',
-'tooltip-preview' => 'Obejrzyj efekt swojej edycji przed zapisaniem zmian!',
-'tooltip-diff' => 'Pokaż zmiany wykonane w tekście.',
-'tooltip-compareselectedversions' => 'Pokazuje różnice między dwiema wybranymi wersjami tej strony.',
-'tooltip-watch' => 'Dodaj tÄ™ stronÄ™ do listy obserwowanych',
-'tooltip-recreate' => 'Utwórz stronę pomimo jej wcześniejszego usunięcia.',
-'tooltip-upload' => 'Rozpoczęcie przesyłania',
-'tooltip-rollback' => '„cofnij†jednym kliknięciem wycofuje wszystkie zmiany tej strony wykonane przez ostatniego edytującego.',
-'tooltip-undo' => '„anuluj edycję†wycofuje tę edycję i otwiera okno edycji w trybie podglądu.
+'tooltip-pt-userpage' => 'Moja osobista strona',
+'tooltip-pt-anonuserpage' => 'Strona użytkownika dla adresu IP, spod którego edytujesz',
+'tooltip-pt-mytalk' => 'Moja strona dyskusji',
+'tooltip-pt-anontalk' => 'Dyskusja użytkownika dla adresu IP, spod którego edytujesz',
+'tooltip-pt-preferences' => 'Moje preferencje',
+'tooltip-pt-watchlist' => 'Lista stron obserwowanych przez Ciebie',
+'tooltip-pt-mycontris' => 'Lista moich edycji',
+'tooltip-pt-login' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.',
+'tooltip-pt-anonlogin' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe',
+'tooltip-pt-logout' => 'Wyloguj',
+'tooltip-ca-talk' => 'Dyskusja o zawartości tej strony.',
+'tooltip-ca-edit' => 'Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.',
+'tooltip-ca-addsection' => 'Dodaj nowy wÄ…tek.',
+'tooltip-ca-viewsource' => 'Ta strona jest zabezpieczona. Możesz zobaczyć tekst źródłowy.',
+'tooltip-ca-history' => 'Starsze wersje tej strony.',
+'tooltip-ca-protect' => 'Zabezpiecz tÄ™ stronÄ™.',
+'tooltip-ca-unprotect' => 'Zmień zabezpieczenie strony',
+'tooltip-ca-delete' => 'Usuń tę stronę',
+'tooltip-ca-undelete' => 'Przywróć wersję tej strony sprzed usunięcia',
+'tooltip-ca-move' => 'PrzenieÅ› tÄ™ stronÄ™.',
+'tooltip-ca-watch' => 'Dodaj tÄ™ stronÄ™ do listy obserwowanych',
+'tooltip-ca-unwatch' => 'Usuń tę stronę z listy obserwowanych',
+'tooltip-search' => 'Przeszukaj {{GRAMMAR:B.lp|{{SITENAME}}}}',
+'tooltip-search-go' => 'Przejdź do strony o dokładnie takim tytule, o ile istnieje',
+'tooltip-search-fulltext' => 'Szukaj wprowadzonego tekstu w treści stron',
+'tooltip-p-logo' => 'Strona główna',
+'tooltip-n-mainpage' => 'Zobacz stronę główną',
+'tooltip-n-mainpage-description' => 'Przejdź na stronę główną',
+'tooltip-n-portal' => 'O projekcie, co możesz zrobić, gdzie możesz znaleźć informacje',
+'tooltip-n-currentevents' => 'Informacje o aktualnych wydarzeniach',
+'tooltip-n-recentchanges' => 'Lista ostatnich zmian na {{GRAMMAR:MS.lp|{{SITENAME}}}}.',
+'tooltip-n-randompage' => 'Pokaż stronę wybraną losowo',
+'tooltip-n-help' => 'Tutaj możesz się wielu rzeczy dowiedzieć.',
+'tooltip-t-whatlinkshere' => 'Pokaż listę wszystkich stron linkujących do tej strony',
+'tooltip-t-recentchangeslinked' => 'Ostatnie zmiany w stronach, do których ta strona linkuje',
+'tooltip-feed-rss' => 'Kanał RSS dla tej strony',
+'tooltip-feed-atom' => 'Kanał Atom dla tej strony',
+'tooltip-t-contributions' => 'Pokaż listę edycji tego użytkownika',
+'tooltip-t-emailuser' => 'WyÅ›lij eâ€mail do tego użytkownika',
+'tooltip-t-upload' => 'Prześlij plik',
+'tooltip-t-specialpages' => 'Lista wszystkich specjalnych stron',
+'tooltip-t-print' => 'Wersja do wydruku',
+'tooltip-t-permalink' => 'Stały link do tej wersji strony',
+'tooltip-ca-nstab-main' => 'Zobacz stronę treści',
+'tooltip-ca-nstab-user' => 'Zobacz stronę osobistą użytkownika',
+'tooltip-ca-nstab-media' => 'Zobacz stronÄ™ pliku',
+'tooltip-ca-nstab-special' => 'To jest strona specjalna. Nie możesz jej edytować.',
+'tooltip-ca-nstab-project' => 'Zobacz stronÄ™ projektu',
+'tooltip-ca-nstab-image' => 'Zobacz stronÄ™ grafiki',
+'tooltip-ca-nstab-mediawiki' => 'Zobacz komunikat systemowy',
+'tooltip-ca-nstab-template' => 'Zobacz szablon',
+'tooltip-ca-nstab-help' => 'Zobacz stronÄ™ pomocy',
+'tooltip-ca-nstab-category' => 'Zobacz stronÄ™ kategorii',
+'tooltip-minoredit' => 'Oznacz zmianÄ™ jako drobnÄ…',
+'tooltip-save' => 'Zapisz zmiany',
+'tooltip-preview' => 'Obejrzyj efekt swojej edycji przed zapisaniem zmian!',
+'tooltip-diff' => 'Pokaż zmiany wykonane w tekście.',
+'tooltip-compareselectedversions' => 'Pokazuje różnice między dwiema wybranymi wersjami tej strony.',
+'tooltip-watch' => 'Dodaj tÄ™ stronÄ™ do listy obserwowanych',
+'tooltip-watchlistedit-normal-submit' => 'Usuń zaznaczone z listy obserwowanych',
+'tooltip-watchlistedit-raw-submit' => 'Uaktualnij listÄ™ obserwowanych',
+'tooltip-recreate' => 'Utwórz stronę pomimo jej wcześniejszego usunięcia.',
+'tooltip-upload' => 'Rozpoczęcie przesyłania',
+'tooltip-rollback' => '„cofnij†jednym kliknięciem wycofuje wszystkie zmiany tej strony wykonane przez ostatniego edytującego.',
+'tooltip-undo' => '„anuluj edycję†wycofuje tę edycję i otwiera okno edycji w trybie podglądu.
Pozwala na wpisanie powodu w opisie zmian.',
-'tooltip-preferences-save' => 'Zapisz preferencje',
-'tooltip-summary' => 'Wpisz krótki opis',
+'tooltip-preferences-save' => 'Zapisz preferencje',
+'tooltip-summary' => 'Wpisz krótki opis',
# Stylesheets
'common.css' => '/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */',
@@ -2954,9 +3063,6 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
# Patrol log
'patrol-log-page' => 'Dziennik patrolowania',
'patrol-log-header' => 'Poniżej znajduje się dziennik patrolowania stron.',
-'patrol-log-line' => 'oznaczył $1 hasła $2 jako sprawdzoną $3',
-'patrol-log-auto' => '(automatycznie)',
-'patrol-log-diff' => 'wersja $1',
'log-show-hide-patrol' => '$1 rejestr sprawdzania',
# Image deletion
@@ -2983,11 +3089,11 @@ Jeśli go otworzysz, możesz zarazić swój system.",
'file-info' => 'rozmiar pliku: $1, typ MIME: $2',
'file-info-size' => '$1 × $2 pikseli, rozmiar pliku: $3, typ MIME: $4',
'file-info-size-pages' => '$1 × $2 pikseli, rozmiar pliku: $3, typ MIME: $4, $5 {{PLURAL:$5|strona|strony|stron}}',
-'file-nohires' => '<small>Grafika w wyższej rozdzielczości jest niedostępna.</small>',
+'file-nohires' => 'Grafika w wyższej rozdzielczości nie jest dostępna.',
'svg-long-desc' => 'Plik SVG, nominalnie $1 × $2 pikseli, rozmiar pliku: $3',
'show-big-image' => 'Pełna rozdzielczość',
-'show-big-image-preview' => '<small>Rozmiar podglądu – $1.</small>',
-'show-big-image-other' => '<small>Inne rozmiary: $1.</small>',
+'show-big-image-preview' => 'Rozmiar podglądu – $1.',
+'show-big-image-other' => '{{PLURAL:$2|Inna rozdzielczość|Inne rozdzielczości}}: $1.',
'show-big-image-size' => '$1 x $2 pikseli',
'file-info-gif-looped' => 'zapętlony',
'file-info-gif-frames' => '$1 {{PLURAL:$1|klatka|klatki|klatek}}',
@@ -3008,9 +3114,14 @@ Jeśli go otworzysz, możesz zarazić swój system.",
'sp-newimages-showfrom' => 'pokaż nowe pliki począwszy od $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => '&nbsp;s',
-'minutes-abbrev' => '&nbsp;min',
-'hours-abbrev' => '&nbsp;h',
+'seconds-abbrev' => '$1&nbsp;s',
+'minutes-abbrev' => '$1&nbsp;min',
+'hours-abbrev' => '$1&nbsp;godz.',
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekundy|$1 sekund}}',
+'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}}',
+'ago' => '$1 temu',
# Bad image list
'bad_image_list' => 'Dane należy wprowadzić w formacie:
@@ -3520,13 +3631,6 @@ Kod zawarty w linku straci ważność $4.',
'scarytranscludefailed' => '[Pobranie szablonu dla $1 nie powiodło się]',
'scarytranscludetoolong' => '[zbyt długi adres URL]',
-# Trackbacks
-'trackbackbox' => 'Komunikaty TrackBack dla tej strony:<br />
-$1',
-'trackbackremove' => '([$1 Usuń])',
-'trackbacklink' => 'TrackBack',
-'trackbackdeleteok' => 'TrackBack został usunięty.',
-
# Delete conflict
'deletedwhileediting' => "'''Uwaga!''' Ta strona zostaÅ‚a usuniÄ™ta po tym, jak rozpoczÄ…Å‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} jej edycjÄ™!",
'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|dyskusja]]) usun{{GENDER:$1|Ä…Å‚|ęła|Ä…Å‚(â€Ä™Å‚a)}} tÄ™ stronÄ™ po tym, jak rozpoczÄ…Å‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} jego edycjÄ™, podajÄ…c jako powód usuniÄ™cia:
@@ -3655,6 +3759,9 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
'hebrew-calendar-m9-gen' => 'Siwan',
'hebrew-calendar-m11-gen' => 'Aw',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|dyskusja]])',
+
# Core parser functions
'unknown_extension_tag' => 'Nieznany znacznik rozszerzenia „$1â€',
'duplicate-defaultsort' => 'Uwaga: DomyÅ›lnym kluczem sortowania bÄ™dzie „$2†i zastÄ…pi on wczeÅ›niej wykorzystywany klucz „$1â€.',
@@ -3752,13 +3859,16 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'tags-hitcount' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
# Special:ComparePages
-'comparepages' => 'Porównanie stron',
-'compare-selector' => 'Porównanie wersji stron',
-'compare-page1' => 'Strona 1',
-'compare-page2' => 'Strona 2',
-'compare-rev1' => 'Wersja 1',
-'compare-rev2' => 'Wersja 2',
-'compare-submit' => 'Porównaj',
+'comparepages' => 'Porównanie stron',
+'compare-selector' => 'Porównanie wersji stron',
+'compare-page1' => 'Strona 1',
+'compare-page2' => 'Strona 2',
+'compare-rev1' => 'Wersja 1',
+'compare-rev2' => 'Wersja 2',
+'compare-submit' => 'Porównaj',
+'compare-invalid-title' => 'Tytuł jest nieprawidłowy.',
+'compare-title-not-exists' => 'Tytuł, który podałeś nie istnieje.',
+'compare-revision-not-exists' => 'Zmiana, którą wybrałeś nie istnieje.',
# Database error messages
'dberr-header' => 'Ta wiki nie działa poprawnie',
@@ -3785,4 +3895,90 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'sqlite-has-fts' => '$1 ze wsparciem pełnotekstowego wyszukiwania',
'sqlite-no-fts' => '$1 bez wsparcia pełnotekstowego wyszukiwania',
+# New logging system
+'logentry-delete-delete' => '$1 usunÄ…Å‚ stronÄ™ $3',
+'logentry-delete-restore' => '$1 odtworzył stronę $3',
+'logentry-delete-event' => '$1 zmienił widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w rejestrze $3, wykonano następujące operacje: $4',
+'logentry-delete-revision' => '$1 zmienił widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
+'logentry-delete-event-legacy' => '$1 zmienił widoczność zdarzeń w rejestrze $3',
+'logentry-delete-revision-legacy' => '$1 zmienił widoczność wersji strony $3',
+'logentry-suppress-delete' => '$1 ukrył stronę $3',
+'logentry-suppress-event' => '$1 potajemnie zmienił widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
+'logentry-suppress-revision' => '$1 potajemnie zmienił widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
+'logentry-suppress-event-legacy' => '$1 potajemnie zmienił widoczność zdarzenia w rejestrze $3',
+'logentry-suppress-revision-legacy' => '$1 potajemnie zmienił widoczność wersji strony $3',
+'revdelete-content-hid' => 'treść została ukryta',
+'revdelete-summary-hid' => 'opis zmian został ukryty',
+'revdelete-uname-hid' => 'nazwa użytkownika została ukryta',
+'revdelete-content-unhid' => 'wycofano ukrycie treści',
+'revdelete-summary-unhid' => 'wycofano ukrycie opisu zmian',
+'revdelete-uname-unhid' => 'wycofano ukrycie nazwy użytkownika',
+'revdelete-restricted' => 'ograniczono widoczność dla administratorów',
+'revdelete-unrestricted' => 'wycofano ograniczenie widoczności dla administratorów',
+'logentry-move-move' => '$1 przeniósł stronę $3 na $4',
+'logentry-move-move-noredirect' => '$1 przeniósł stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem',
+'logentry-move-move_redir' => '$1 przeniósł stronę $3 na $4, czyli w miejsce przekierowania',
+'logentry-move-move_redir-noredirect' => '$1 przeniósł stronę $3 na $4, czyli w miejsce przekierowania i bez pozostawienia przekierowania pod starym tytułem',
+'logentry-patrol-patrol' => '$1 oznaczył wersję $4 strony $3 jako sprawdzoną',
+'logentry-patrol-patrol-auto' => '$1 automatycznie oznaczył wersję $4 strony $3 jako sprawdzoną',
+'logentry-newusers-newusers' => '$1 utworzył konto użytkownika',
+'logentry-newusers-create' => '$1 utworzył konto użytkownika',
+'logentry-newusers-create2' => '$1 utworzył konto użytkownika $3',
+'logentry-newusers-autocreate' => 'Konto użytkownika $1 zostało utworzone automatycznie',
+'newuserlog-byemail' => 'hasÅ‚o zostaÅ‚o wysÅ‚ane eâ€mailem',
+
+# Feedback
+'feedback-bugornote' => 'Jeśli jesteś gotów szczegółowo opisać problem techniczny proszę [ $1 Zgłoś].
+W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony "[ $3 $2 ]", wraz z nazwą użytkownika i nazwą przeglądarki.',
+'feedback-subject' => 'Temat',
+'feedback-message' => 'Wiadomość:',
+'feedback-cancel' => 'Anuluj',
+'feedback-submit' => 'Prześlij opinię',
+'feedback-adding' => 'Dodawanie opinii do strony...',
+'feedback-error1' => 'Błąd – nierozpoznana odpowiedź API',
+'feedback-error2' => 'Błąd – edycja nieudana',
+'feedback-error3' => 'Błąd – brak odpowiedzi API',
+'feedback-thanks' => 'Dziękujemy! Twoja opinia została opublikowana na stronie "[ $2 $1 ]".',
+'feedback-close' => 'Gotowe',
+'feedback-bugcheck' => 'Świetnie! Tylko sprawdzić, czy nie jest już jednym z [$1 znanych błędów].',
+'feedback-bugnew' => 'Sprawdziłem. Zgłoś nowy błąd',
+
+# API errors
+'api-error-badaccess-groups' => 'Nie masz uprawnień aby przesyłać pliki do tej wiki.',
+'api-error-badtoken' => 'Błąd wewnętrzny – żeton wykorzystywany do identyfikacji użytkownika jest nieprawidłowy.',
+'api-error-copyuploaddisabled' => 'Przesyłanie poprzez podanie adresu URL zostało na tym serwerze wyłączone.',
+'api-error-duplicate' => '{{PLURAL:$1|Jest już [$2 inny plik]|Są już [$2 inne pliki]}} o tej samej zawartości',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Był już [$2 inny plik]|Były już [$2 inne pliki]}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Zdublowany plik, który został już usunięty|Zdublowane pliki, które zostały już usunięte}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Zdublowany plik|Zdublowane plik}}',
+'api-error-empty-file' => 'Przesłany przez Ciebie plik jest pusty.',
+'api-error-emptypage' => 'Tworzenie nowych, pustych stron jest niedozwolone.',
+'api-error-fetchfileerror' => 'Błąd wewnętrzny – wystąpił błąd w trakcie pobierania pliku.',
+'api-error-file-too-large' => 'Przesłany przez Ciebie plik jest zbyt duży.',
+'api-error-filename-tooshort' => 'Nazwa pliku jest zbyt krótka.',
+'api-error-filetype-banned' => 'Zabroniony format pliku.',
+'api-error-filetype-missing' => 'Brak rozszerzenia w nazwie pliku.',
+'api-error-hookaborted' => 'Zmiana, którą próbowałeś wykonać została przerwana przez hak rozszerzenia.',
+'api-error-http' => 'Błąd wewnętrzny – brak połączenia z serwerem.',
+'api-error-illegal-filename' => 'Niedopuszczalna nazwa pliku.',
+'api-error-internal-error' => 'Błąd wewnętrzny – wystąpił błąd w trakcie przetwarzania przesłanego pliku.',
+'api-error-invalid-file-key' => 'Błąd wewnętrzny – nie można odnaleźć pliku w wśród plików tymczasowych.',
+'api-error-missingparam' => 'Błąd wewnętrzny – brak jest niektórych wymaganych informacji do realizacji przesłania.',
+'api-error-missingresult' => 'Błąd wewnętrzny – nie można określić czy kopiowanie się udało.',
+'api-error-mustbeloggedin' => 'Musisz się zalogować aby przesyłać pliki.',
+'api-error-mustbeposted' => 'Wystąpił błąd w oprogramowaniu. Nie użyto właściwej metody HTTP.',
+'api-error-noimageinfo' => 'Plik przesłano, ale serwer nie zwrócił informacji na jego temat.',
+'api-error-nomodule' => 'Błąd wewnętrzny – nie określono modułu przesyłania plików.',
+'api-error-ok-but-empty' => 'Błąd wewnętrzny – brak odpowiedzi od serwera.',
+'api-error-overwrite' => 'Nadpisanie istniejÄ…cego pliku nie jest dopuszczalne.',
+'api-error-stashfailed' => 'Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.',
+'api-error-timeout' => 'Serwer nie odpowiedział w oczekiwanym czasie.',
+'api-error-unclassified' => 'Wystąpił nieznany błąd',
+'api-error-unknown-code' => 'BÅ‚Ä…d nieznany – „$1â€',
+'api-error-unknown-error' => 'Błąd wewnętrzny – wysŧapił nierozpoznany błąd w trakcie próby przesłania pliku.',
+'api-error-unknown-warning' => 'Nieznane ostrzeżenie – $1',
+'api-error-unknownerror' => 'Nieznany bÅ‚Ä…d: „$1â€',
+'api-error-uploaddisabled' => 'Na tej wiki przesyłanie zostało wyłączone.',
+'api-error-verification-error' => 'Plik może być uszkodzony lub nazwa pliku ma nieprawidłowe rozszerzenie.',
+
);
diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php
index 86cb6178..bf4335e5 100644
--- a/languages/messages/MessagesPms.php
+++ b/languages/messages/MessagesPms.php
@@ -400,20 +400,22 @@ Për piasì, fa rapòrt a n'[[Special:ListUsers/sysop|aministrator]], pijand nò
'badarticleerror' => "N'operassion parèj as peul pa fesse ansima a sta pàgina-sì.",
'cannotdelete' => "La pàgina o l'archivi \"\$1\" a peul pa esse scancelà.
Peul desse ch'a l'é già stàit ëscancelà da cheidun d'àutr.",
+'cannotdelete-title' => 'A peul pa scancelesse la pàgina «$1»',
'badtitle' => 'Tìtol nen giust',
'badtitletext' => "La pàgina che a l'ha ciamà a peul pa esse mostrà. A podrìa tratesse ëd na pàgina nen bon-a, veujda, ò pura a podrìa ëdcò esse n'eror ant n'anliura antra lenghe diferente ò tra diferente version ëd {{SITENAME}}.",
-'perfcached' => "Sòn a l'é stait memorisà an local e podrìa ëdcò nen esse agiornà:",
-'perfcachedts' => "Lòn che a-j ven dapress a sossì a l'é pijàit da 'nt na còpia local \"cache\" dla base dat. L'ùltim agiornament a l'é dël: \$1.",
+'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.",
+'perfcachedts' => "Ij dat sì-dapress a son ëstàit memorisà an local, e a son ëstàit agiornà l'ùltima vira ël $1. Al pi {{PLURAL:$4|n'arzultà a l'é disponìbil|$4 arzultà a son disponìbij}} ant la memòria local.",
'querypage-no-updates' => "J'agiornament për sta pàgina-sì për adess a travajo nen. Ij dat ambelessì a saran nen rinfrescà.",
'wrong_wfQuery_params' => 'Paràmetro nen giust për wfQuery()<br />
Funsion: $1<br />
Arcesta: $2',
'viewsource' => 'Vardé la sorgiss',
-'viewsourcefor' => 'ëd $1',
+'viewsource-title' => 'Vëdde la sorgiss ëd $1',
'actionthrottled' => 'Assion frenà',
'actionthrottledtext' => "Për evité che gent ò màchine an carìo dla rumenta, st'assion-sì as peul nen fesse tròp ëd soèns, e chiel/chila a l'ha arpetula tròpe vire. Ch'a sia gentil, ch'a preuva torna antra dontre minute.",
'protectedpagetext' => "Sta pàgina-sì a l'è stàita blocà për evité che a-j faso dle modìfiche.",
'viewsourcetext' => 'A peul vardé e copié la sorgiss dë sta pàgina:',
+'viewyourtext' => "A peule vëdde e copié la sorziss ëd '''soe modìfiche''' a costa pàgina-sì:",
'protectedinterface' => "Costa pàgina-sì a l'ha andrinta un chèich-còs che a fa part d'antërfacia dël programa che a deuvro tùit; donca a l'é proteta për evité che a-i rivo dle ròbe brute.",
'editinginterface' => "'''Dossman!''' A l'é dapress ch'a-i travaja ansima a na pàgina ch'as deuvra për generé ël test dl'antërfacia dël programa. Le modìfiche fàite ambelessì a-j bogio l'antërfacia a tuti j'utent. Se sò but a l'é col ëd fé na tradussion, për piasì ch'a considerà la possibilità dë dovré [//translatewiki.net/wiki/Main_Page?setlang=pms translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
'sqlhidden' => "(l'anterogassion SQL a l'é stërmà)",
@@ -514,6 +516,7 @@ Da qualsëssìa ëd coste funsion a sarà mandà gnun messagi fin che chiel (chi
'emailconfirmlink' => 'Che an conferma soa adrëssa ëd pòsta eletrònica',
'invalidemailaddress' => "Costa adrëssa ëd pòsta eletrònica-sì as peul nen pijesse përchè a l'ha na forma nen bon-a.
Për piasì che a buta n'adrëssa scrita giusta ò che a lassa ël camp veujd.",
+'cannotchangeemail' => "J'adrësse ëd pòsta eletrònica dij cont a peulo pa esse modificà ansima a costa wiki.",
'accountcreated' => 'Cont creà',
'accountcreatedtext' => "Ël cont Utent për $1 a l'é stàit creà.",
'createaccount-title' => 'Creassion ëd cont për {{SITENAME}}',
@@ -529,6 +532,7 @@ Për piasì speta prima ëd prové torna.",
# E-mail sending
'php-mail-error-unknown' => 'Eror pa conossù ant la funsion PHP mail()',
+'user-mail-no-addy' => 'Provà a spedì un mëssagi sensa adrëssa ëd pòsta eletrònica.',
# Change password dialog
'resetpass' => 'Cambia la ciav',
@@ -549,31 +553,46 @@ Miraco it l'has già cambià la ciav o it l'has ciamà na neuva ciav a temp.",
'resetpass-temp-password' => 'Ciav a temp:',
# Special:PasswordReset
-'passwordreset' => 'Cambi ëd ciav',
-'passwordreset-text' => "Ch'a completa 's formolari për arsèive un mëssagi ëd pòsta eletrònica con ij detaj ëd sò cont.",
-'passwordreset-legend' => 'Cambié la ciav',
-'passwordreset-disabled' => 'Ij cangiament ëd ciav a son stàit disabilità su sta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Ch'a anserissa un dij tòch ëd dat sì-sota}}",
-'passwordreset-username' => 'Stranòm:',
-'passwordreset-domain' => 'Domini:',
-'passwordreset-email' => 'Adrëssa ëd pòsta eletrònica:',
-'passwordreset-emailtitle' => 'Detaj dël cont ansima {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Quaidun (a l'é bel fé ch'a sia chiel, da l'adrëssa IP $1) a l'ha ciamà d'arcordé ij detaj ëd sò cont për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}}
+'passwordreset' => 'Cambi ëd ciav',
+'passwordreset-text' => "Ch'a completa 's formolari për arsèive un mëssagi ëd pòsta eletrònica con ij detaj ëd sò cont.",
+'passwordreset-legend' => 'Cambié la ciav',
+'passwordreset-disabled' => 'Ij cangiament ëd ciav a son stàit disabilità su sta wiki.',
+'passwordreset-pretext' => "{{PLURAL:$1||Ch'a anserissa un dij tòch ëd dat sì-sota}}",
+'passwordreset-username' => 'Stranòm:',
+'passwordreset-domain' => 'Domini:',
+'passwordreset-capture' => 'Vardé ël mëssagi arzultant?',
+'passwordreset-capture-help' => "S'a marca costa casela, ël mëssagi ëd pòsta eletrònica (con la ciav temporania) a-j sarà smonù e ant l'istess temp a sarà mandà a l'utent.",
+'passwordreset-email' => 'Adrëssa ëd pòsta eletrònica:',
+'passwordreset-emailtitle' => 'Detaj dël cont ansima {{SITENAME}}',
+'passwordreset-emailtext-ip' => "Quaidun (a l'é bel fé ch'a sia chiel, da l'adrëssa IP $1) a l'ha ciamà d'arcordé ij detaj ëd sò cont për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}}
associà a st'adrëssa ëd pòsta eletrònica:
$2
{{PLURAL:$3|Costa ciav|Coste ciav}} a temp a scadran da sì {{PLURAL:$5|un di|$5 di}}.
A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peule ignoré ës mëssagi e continué a dovré soa veja ciav.",
-'passwordreset-emailtext-user' => "L'utent $1 ansima a {{SITENAME}} a l'ha ciamà d'arcordé ij detaj ëd sò cont për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} associà a st'adrëssa ëd pòsta eletrònica:
+'passwordreset-emailtext-user' => "L'utent $1 ansima a {{SITENAME}} a l'ha ciamà d'arcordé ij detaj ëd sò cont për {{SITENAME}} ($4). {{PLURAL:$3|Ël cont utent sì-sota a l'é|Ij cont utent sì-sota a son}} associà a st'adrëssa ëd pòsta eletrònica:
$2
{{PLURAL:$3|Costa ciav|Coste ciav}} a temp a scadran da sì {{PLURAL:$5|un di|$5 di}}.
A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr a l'ha fàit costa arcesta, o s'a l'é arcordasse soa ciav original, e a veul pa pi cangela, a peul ignoré sto mëssagi e continué a dovré soa veja ciav.",
-'passwordreset-emailelement' => 'Stranòm: $1
+'passwordreset-emailelement' => 'Stranòm: $1
Ciav a temp: $2',
-'passwordreset-emailsent' => "Un mëssagi ëd pòsta eletrònica për giuté a arcordé a l'é stàit spedì.",
+'passwordreset-emailsent' => "Un mëssagi ëd pòsta eletrònica për giuté a arcordé a l'é stàit spedì.",
+'passwordreset-emailsent-capture' => "Un mëssagi ëd pro-memòria 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",
+
+# Special:ChangeEmail
+'changeemail' => "Cangé l'adrëssa ëd pòsta eletrònica",
+'changeemail-header' => "Cangé l'adrëssa ëd pòsta eletrònica dël cont",
+'changeemail-text' => "Ch'a completa 's formolari për cangé soa adrëssa eletrònica. A dev anserì soa ciav për confirmé costa modìfica.",
+'changeemail-no-info' => 'A dev esse intrà ant ël sistema për andé diretament a costa pàgina.',
+'changeemail-oldemail' => 'Adrëssa ëd pòsta eletrònica atual:',
+'changeemail-newemail' => 'Adrëssa ëd pòsta eletrònica neuva:',
+'changeemail-none' => '(gnun)',
+'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
+'changeemail-cancel' => 'Scancela',
# Edit page toolbar
'bold_sample' => 'Test an grassèt',
@@ -643,9 +662,6 @@ Ch'a varda mach ch'a peul nen dovré l'opsion ëd \"mandeje un messagi a l'utent
Soa adrëssa IP corenta a l'é \$3, e sò nùmer ëd blocagi a l'é \$5.
Për piasì, ch'a buta sempe tùit ij detaj an tute le comunicassion andova ch'as parla ëd sò blocagi.",
'blockednoreason' => "a l'han pa butà gnun-a rason",
-'blockedoriginalsource' => "La sorgiss ëd '''$1''' a së s-ciàira ambelessì sota:",
-'blockededitsource' => "Ël test ëd le '''soe modìfiche''' a '''$1''' a së s-ciàira ambelessì sota:",
-'whitelistedittitle' => 'Sòn as peul pa fesse nen rintrand ant ël sistema',
'whitelistedittext' => 'A venta $1 për podèj fé dle modìfiche.',
'confirmedittext' => 'A dev confermé soa adrëssa ëd pòsta eletrònica, anans che modifiché dle pàgine. Për piasì, che a convàlida soa adrëssa ën dovrand la pàgina [[Special:Preferences|mè gust]].',
'nosuchsectiontitle' => 'As peul pa trovesse la session',
@@ -725,9 +741,8 @@ Se a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa p
'copyrightwarning2' => "Për piasì, che a ten-a present che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da dj'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.<br />
Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel (ò daspërchila), ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion).
'''CHE A MANDA PA DËL MATERIAL COATÀ DA DRIT D'AUTOR SENSA AVÈJ AVÙ ËL PËRMESS SCRIT DË FELO!'''",
-'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh $1 kb, che a resta pì che ël
-lìmit màssim ëd $2 kb. Parèj as peul nen salvesse. A venta che a në fasa vàire
-pàgine diferente për rintré ant ij lìmit técnich.'''",
+'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobyte}} , che a resta pì che ël
+lìmit màssim ëd {{PLURAL:$2|un kilobyte|$2 kilobyte}}. Parèj as peul pa salvesse.",
'readonlywarning' => "'''Avis: La base dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.'''
A peul esse che a-j ven-a còmod copiesse via sò test e butesslo da na part për salvelo peuj.
@@ -895,8 +910,6 @@ J'àutri aministrator dzora a {{SITENAME}} a saran ancó sempe bon a s-ciairé Ã
'revdelete-unsuppress' => "Gava le limitassion da 'nt le version ciapà andaré",
'revdelete-log' => 'Rason:',
'revdelete-submit' => 'Bùtejlo a {{PLURAL:$1|la version|le version}} selessionà',
-'revdelete-logentry' => 'visibilità dla revision cangià për [[$1]]',
-'logdelete-logentry' => "a l'ha cangiaje visibilità a l'event [[$1]]",
'revdelete-success' => "'''Visibilità dla revision modificà com ch'as dev.'''",
'revdelete-failure' => "'''La visibilità dla version a peul pa esse modificà:'''
$1",
@@ -908,15 +921,6 @@ $1",
'revdel-restore-visible' => 'revision visìbij',
'pagehist' => 'Stòria dla pàgina',
'deletedhist' => 'Stòria scancelà',
-'revdelete-content' => 'contnù',
-'revdelete-summary' => 'resumé dla modìfica',
-'revdelete-uname' => 'stranòm',
-'revdelete-restricted' => "a l'ha aplicà le restrission a j'aministrator",
-'revdelete-unrestricted' => "restrission për j'aministrator gavà",
-'revdelete-hid' => 'stërma $1',
-'revdelete-unhid' => 'dëscoata $1',
-'revdelete-log-message' => '$1 për $2 {{PLURAL:$2|revision|revision}}',
-'logdelete-log-message' => '$1 për $2 {{PLURAL:$2|event|event}}',
'revdelete-hide-current' => "Eror an stërmand l'element datà $2, $1: costa-sì a l'é la version corenta.
A peul pa esse stërmà.",
'revdelete-show-no-access' => 'Eror an mostrand l\'element datà $2, $1: st\'element-sì a l\'é stàit marcà "riservà".
@@ -1071,12 +1075,14 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
'prefs-rc' => 'Ùltime modìfiche',
'prefs-watchlist' => 'Ròba che as ten sot euj',
'prefs-watchlist-days' => 'Vàire dì che a veul ës-ciairé an soa lista ëd lòn che as ten sot euj:',
-'prefs-watchlist-days-max' => 'Al pì 7 di',
+'prefs-watchlist-days-max' => 'Al pì $1 {{PLURAL:$1|di|di}}',
'prefs-watchlist-edits' => 'Vàire modìfiche che a veul ës-ciairé con le funsion avansà:',
'prefs-watchlist-edits-max' => 'Nùmer màssim: 1000',
'prefs-watchlist-token' => 'Geton ëd lòn che as ten sot euj:',
'prefs-misc' => 'Sòn e lòn',
'prefs-resetpass' => 'Cangé la ciav',
+'prefs-changeemail' => "Cangé l'adrëssa ëd pòsta eletrònica",
+'prefs-setemail' => "Amposté n'adrëssa ëd pòsta eletrònica",
'prefs-email' => 'Opsion ëd pòsta eletrònica',
'prefs-rendering' => 'Sembiansa',
'saveprefs' => 'Salvé ij sò gust',
@@ -1138,6 +1144,7 @@ Sòn a peul pa esse anulà.',
'yourrealname' => 'Nòm vèir:',
'yourlanguage' => 'Lenga:',
'yourvariant' => 'Variant ëd la lenga dël contnù:',
+'prefs-help-variant' => 'Varianta o ortografìa ëd sò gust për smon-e le pàgine ëd contnù ansima a sta wiki-sì.',
'yournick' => 'Sò stranòm (për firmé):',
'prefs-help-signature' => 'Ij coment an sle pàgine ëd discussion a dovrìo esse firmà con "<nowiki>~~~~</nowiki>" che a sarà convertì ant soa firma e orari.',
'badsig' => "Soa firma a l'é nen giusta, che a controla j'istrussion HTML.",
@@ -1178,7 +1185,7 @@ Costa anformassion a sarà pùblica.",
'userrights-lookup-user' => "Gestion dle partìe d'utent",
'userrights-user-editname' => 'Che a buta në stranòm:',
'editusergroup' => "Modifiché le partìe d'utent",
-'editinguser' => "Modìfica dij drit ëd l'utent '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modìfiché ij drit d'utent ëd l'utent '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Modifiché le partìe dl'utent",
'saveusergroups' => "Salvé le partìe d'utent",
'userrights-groupsmember' => "A l'é andrinta a:",
@@ -1273,13 +1280,13 @@ Costa anformassion a sarà pùblica.",
'right-autopatrol' => 'Avèj na pròpria modìfica automaticament marcà com verificà',
'right-patrolmarks' => "Vëdde le marche ëd verìfica ant j'ùltime modìfiche",
'right-unwatchedpages' => 'Vëdde na lista dle pàgine nen cudìe',
-'right-trackback' => "Gionté dj'anliure anverse",
'right-mergehistory' => 'Fonde la stòria dle pàgine',
'right-userrights' => "Modifiché tùit ij drit ëd n'utent",
'right-userrights-interwiki' => "Modifiché ij drit utent dj'utent ansima a d'àutre wiki",
'right-siteadmin' => 'Bloché e dësbloché la base ëd dàit',
'right-override-export-depth' => 'Esporté le pàgine ancludend le pàgine colegà fin-a a na profondeur ëd 5',
'right-sendemail' => "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
+'right-passwordreset' => 'Vëdde ij mëssagi ëd pòsta eletrònica ëd riampostassion dle ciav',
# User rights log
'rightslog' => "Argistr dij drit ëd j'utent",
@@ -1313,16 +1320,17 @@ Costa anformassion a sarà pùblica.",
'action-suppressionlog' => 'vardé sto registr privà-sì',
'action-block' => 'bloché cost utent-sì a modifiché',
'action-protect' => 'cambié ij livej ëd protession për sta pàgina-sì',
+'action-rollback' => "gavé an pressa le modìfiche ëd l'ùltim utent che a l'ha modificà na pàgina particolar",
'action-import' => "amporté costa pàgina da n'àutra wiki",
'action-importupload' => "amporté costa pàgina da n'archivi carià",
'action-patrol' => "marché la modìfica dj'àutri com verificà",
'action-autopatrol' => 'avèj soe modìfiche marcà com verificà',
'action-unwatchedpages' => 'vardé la lista dle pàgine che gnun a ten sot-euj',
-'action-trackback' => "spedì n'anliura anversa",
'action-mergehistory' => 'fonde la stòria dë sta pàgina-sì',
'action-userrights' => "modifiché tùit ij drit dj'utent",
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
@@ -1354,6 +1362,7 @@ Costa anformassion a sarà pùblica.",
'number_of_watching_users_pageview' => "[tnùa sot-euj da {{PLURAL:$1|n'utent|$1 utent}}]",
'rc_categories' => 'Limité a le categorìe (che a jë scriva separand-je antra \'d lor con un "|")',
'rc_categories_any' => 'Qualsëssìa',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} apress ij cambi',
'newsectionsummary' => '/* $1 */ session neuva',
'rc-enhanced-expand' => 'Mostré ij detaj (a-i é da manca ëd JavaScript)',
'rc-enhanced-hide' => 'Stërmé ij detaj',
@@ -1407,6 +1416,7 @@ Beiché la [[Special:NewFiles|galarìa dj'archivi neuv]] për na presentassion p
'ignorewarnings' => "Lassé perde j'avis",
'minlength1' => "Ij nòm ëd j'archivi a devo esse longh almanch un caràter.",
'illegalfilename' => 'Ël nòm d\'archivi "$1" a l\'ha andrinta dij caràter che as peulo pa dovresse ant ij tìtoj dle pàgine. Për piasì che a-j cangia \'d nòm e peui che a torna a carielo.',
+'filename-toolong' => "Ij nòm dj'archivi a peul pa esse pi longh che 240 byte.",
'badfilename' => 'Ël nòm dl\'archivi a l\'é stait cambià an "$1".',
'filetype-mime-mismatch' => 'L\'estension dl\'archivi ".$1" a rispeta pa la sòrt ëd MIME trovà për l\'archivi ($2).',
'filetype-badmime' => 'J\'archivi dla sòrt MIME "$1" as peulo pa carié.',
@@ -1517,6 +1527,41 @@ Se a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:Li
'upload-unknown-size' => 'Dimension pa conossùa',
'upload-http-error' => "A l'é staje n'eror HTTP: $1.",
+# File backend
+'backend-fail-stream' => "A peul pa sequensialisé l'archivi $1.",
+'backend-fail-backup' => "As peul pa fesse na còpia ëd l'archivi $1.",
+'backend-fail-notexists' => "L'archivi $1 a esist pa.",
+'backend-fail-hashes' => "As peul pa oten-se la s-ciapura dl'archivi për paragon.",
+'backend-fail-notsame' => "N'archivi nen idéntich a esist già a $1.",
+'backend-fail-invalidpath' => "$1 a l'é pa un përcors ëd memorisassion bon.",
+'backend-fail-delete' => "As peul pa scanselesse l'archivi $1.",
+'backend-fail-alreadyexists' => 'L\'archivi "$1" a esist già.',
+'backend-fail-store' => "As peul pa memorisesse l'archivi $1 a $2.",
+'backend-fail-copy' => "As peul pa copiesse l'archivi $1 su $2.",
+'backend-fail-move' => "As peul pa tramudesse l'archivi $1 su $2.",
+'backend-fail-opentemp' => "As peul pa duvertesse l'archivi temporani.",
+'backend-fail-writetemp' => "As peul pa scrivse sl'archivi temporani.",
+'backend-fail-closetemp' => "As peul pa saresse l'archivi temporani.",
+'backend-fail-read' => "As peul pa les-se l'archivi $1.",
+'backend-fail-create' => "As peul pa creesse l'archivi $1.",
+'backend-fail-readonly' => "Ël dispositiv ëd memòria «$1» a l'é al moment an sola letura. La rason dàita a l'era: «$2»",
+'backend-fail-synced' => "L'archivi «$1» a l'é ant në stat incoerent andrinta ai dispositiv ëd memòria intern",
+'backend-fail-connect' => 'Impossìbil coleghesse al dispositiv ëd memòria «$1».',
+'backend-fail-internal' => "N'eror pa conossù a l'é rivaje ant ël dispositiv ëd memòria «$1».",
+'backend-fail-contenttype' => "As peul pa determinesse la sòrt ëd contnù dl'archivi da memorisé a «$1».",
+'backend-fail-batchsize' => "Ël dispositiv ëd memòria a l'ha dàit un total ëd $1 {{PLURAL:$1|operassion|operassion}} d'archivi; ël lìmit a l'é $2 {{PLURAL:$1|operassion|operassion}}.",
+
+# Lock manager
+'lockmanager-notlocked' => "As peul pa dësblochesse «$1»; a l'é nen blocà.",
+'lockmanager-fail-closelock' => "As peul pa saresse l'archivi ëd saradura për «$1».",
+'lockmanager-fail-deletelock' => "As peul pa scancelesse l'archivi ëd saradura për «$1».",
+'lockmanager-fail-acquirelock' => 'As peul pa oten-se la saradura për «$1».',
+'lockmanager-fail-openlock' => "As peul pa durbisse l'archivi ëd saradura për «$1».",
+'lockmanager-fail-releaselock' => 'As peul pa gavé la saradura për «$1».',
+'lockmanager-fail-db-bucket' => 'As peul pa contatesse a basta ëd base ëd dàit ëd saradura ant ël sëstin $1.',
+'lockmanager-fail-db-release' => 'As peulo pa gavesse le saradure an sla base ëd dàit $1.',
+'lockmanager-fail-svr-release' => 'As peulo pa arlassesse le saradure an sël servent $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => "N'eror a l'é capità an duvertand l'archivi për ij contròj ZIP.",
'zip-wrong-format' => "L'archivi specificà a l'é pa n'archivi ZIP.",
@@ -1533,6 +1578,7 @@ A peul pa esse controlà da bin për la sicurëssa.",
'uploadstash-badtoken' => "L'esecussion dë st'assion a l'é pa andàita bin, miraco përchè toe credensiaj ëd modìfica a son scadùe. Preuva torna.",
'uploadstash-errclear' => "La scancelassion ëd j'archivi a l'é falìa.",
'uploadstash-refresh' => "Agiorné la lista dj'archivi",
+'invalid-chunk-offset' => 'Inissi dël segment pa bon',
# img_auth script messages
'img-auth-accessdenied' => 'Acess negà',
@@ -1639,23 +1685,24 @@ La descrission an soa [$2 pàgina ëd dëscrission ëd l'archivi] a l'é smonùa
'filerevert-badversion' => "A-i é pa gnun-a version local dl'archivi ch'a l'abia un marcatemp parèj.",
# File deletion
-'filedelete' => 'Dëscancelé $1',
-'filedelete-legend' => "Dëscancelé l'archivi",
-'filedelete-intro' => "A l'é an broa dë scancelé l'archivi '''[[Media:$1|$1]]''' ansema a tuta soa stòria.",
-'filedelete-intro-old' => "A l'é dapress ch'a scancela l'archivi '''[[Media:$1|$1]]''' dël [$4 $3, $2].",
-'filedelete-comment' => 'Rason:',
-'filedelete-submit' => 'Dëscancelé',
-'filedelete-success' => "A l'é dëscancelasse l'archivi '''$1'''.",
-'filedelete-success-old' => "La version ëd '''[[Media:$1|$1]]''' dël $3, $2 a l'é stàita scancelà.",
-'filedelete-nofile' => "A-i é pa gnun archivi ch'as ciama: $1",
-'filedelete-nofile-old' => "A-i é pa gnun-a version parej ëd l'archivi '''$1'''",
-'filedelete-otherreason' => 'Àutra rason o rason adissional:',
-'filedelete-reason-otherlist' => 'Àutra rason',
-'filedelete-reason-dropdown' => "*Për sòlit la ròba a së scancela për
+'filedelete' => 'Dëscancelé $1',
+'filedelete-legend' => "Dëscancelé l'archivi",
+'filedelete-intro' => "A l'é an broa dë scancelé l'archivi '''[[Media:$1|$1]]''' ansema a tuta soa stòria.",
+'filedelete-intro-old' => "A l'é dapress ch'a scancela l'archivi '''[[Media:$1|$1]]''' dël [$4 $3, $2].",
+'filedelete-comment' => 'Rason:',
+'filedelete-submit' => 'Dëscancelé',
+'filedelete-success' => "A l'é dëscancelasse l'archivi '''$1'''.",
+'filedelete-success-old' => "La version ëd '''[[Media:$1|$1]]''' dël $3, $2 a l'é stàita scancelà.",
+'filedelete-nofile' => "A-i é pa gnun archivi ch'as ciama: $1",
+'filedelete-nofile-old' => "A-i é pa gnun-a version parej ëd l'archivi '''$1'''",
+'filedelete-otherreason' => 'Àutra rason o rason adissional:',
+'filedelete-reason-otherlist' => 'Àutra rason',
+'filedelete-reason-dropdown' => "*Për sòlit la ròba a së scancela për
** violassion dij drit d'autor
** duplicassion (visadì ch'a-i era già)",
-'filedelete-edit-reasonlist' => 'Modifiché la rason ëd lë scancelament',
-'filedelete-maintenance' => "Lë scancelament e la restaurassion d'archivi a l'é al moment disabilità durant la manutension.",
+'filedelete-edit-reasonlist' => 'Modifiché la rason ëd lë scancelament',
+'filedelete-maintenance' => "Lë scancelament e la restaurassion d'archivi a l'é al moment disabilità durant la manutension.",
+'filedelete-maintenance-title' => "As peul pa scancelesse l'archivi",
# MIME search
'mimesearch' => 'Arserca për sòrt MIME',
@@ -1753,6 +1800,8 @@ Adess a l'é na ridiression a [[$2]].",
'wantedpages' => 'Artìcoj pì ciamà',
'wantedpages-badtitle' => "Tìtol nen vàlid ant l'ansema dj'arzultà: $1",
'wantedfiles' => 'Archivi pì ciamà',
+'wantedfiletext-cat' => "J'archivi ch'a ven-o a son dovrà ma a esisto pa. J'archivi dai sò depòsit estern a peulo esse listà sensa consideré l'esistensa. Chèich fàuss positiv a saran <del>sganfà</del>. An pi, le pàgine ch'a conten-o dj'archivi ch'a esisto pa a son listà an [[:$1]].",
+'wantedfiletext-nocat' => "J'archivi sì-dapress a son dovrà ma a esisto pa. J'archivi da depòsit estern a peulo esse listà sensa considerene l'esistensa. Tùit costi fàuss positiv a saran <del>ësganfà</del>.",
'wantedtemplates' => 'Stamp ciamà',
'mostlinked' => "Pàgine che a l'han pì d'anliure che a-i men-o la gent ansima",
'mostlinkedcategories' => "Categorìe che a l'han pì d'anliure che a-i men-o la gent ansima",
@@ -1761,6 +1810,7 @@ Adess a l'é na ridiression a [[$2]].",
'mostimages' => 'Figure pì dovrà',
'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)',
'shortpages' => 'Pàgine curte',
'longpages' => 'Pàgine longhe',
'deadendpages' => 'Pàgine che a men-o da gnun-a part',
@@ -1777,7 +1827,7 @@ Adess a l'é na ridiression a [[$2]].",
'listusers-editsonly' => "Mostré mach j'utent ch'a l'han fàit dle modìfiche",
'listusers-creationsort' => 'Ordiné për data ëd creassion',
'usereditcount' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
-'usercreated' => 'Creà ël $1 a $2',
+'usercreated' => '{{GENDER:$3|Creà}} ël $1 a $2',
'newpages' => 'Pàgine neuve',
'newpages-username' => 'Stranòm:',
'ancientpages' => 'Le pàgine pì veje',
@@ -1870,12 +1920,8 @@ Protocòj ch\'as peulo dovresse: <tt>$1</tt> (ch\'a gionta gnun ëd costi an soa
'activeusers-noresult' => 'Pa gnun utent trovà.',
# Special:Log/newusers
-'newuserlogpage' => "Registr dla creassion dj'utent",
-'newuserlogpagetext' => "Sossì a l'é un registr andova ch'as marco le creassion dj'utent.",
-'newuserlog-byemail' => 'ciav spedìa për pòsta eletrònica',
-'newuserlog-create-entry' => 'Neuv utent',
-'newuserlog-create2-entry' => 'Creà ël neuv cont $1',
-'newuserlog-autocreate-entry' => 'Cont creà automaticament',
+'newuserlogpage' => "Registr dla creassion dj'utent",
+'newuserlogpagetext' => "Sossì a l'é un registr andova ch'as marco le creassion dj'utent.",
# Special:ListGroupRights
'listgrouprights' => "Drit dël grup d'utent",
@@ -1905,7 +1951,7 @@ e avèj registrà n'adrëssa ëd pòsta eletrònica vàlida ant ij [[Special:Pre
'emailpagetext' => "A peule dovré ël formolari sì-sota për mandé un mëssagi ëd pòsta eletrònica a st'utent-sì.
L'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|Ij sò gust]] a sarà butà ant l'adrëssa «Da» ëd sò mëssagi, parèj chi ch'a l'arsèiv a podrà rësponde diretament a chiel.",
'usermailererror' => "L'oget che a goèrna la pòsta eletrònica a l'ha dàit eror:",
-'defemailsubject' => 'Mëssagi da {{SITENAME}}',
+'defemailsubject' => 'Mëssagi da l\'utent "$1"',
'usermaildisabled' => "Pòsta eletrònica dl'utent disabilità",
'usermaildisabledtext' => "A peul pa mandé ëd mëssagi ëd pòsta eletrònica a d'àutri utent ansima a costa wiki",
'noemailtitle' => 'Gnun-a adrëssa ëd pòsta eletrònica',
@@ -1960,7 +2006,7 @@ Le modìfiche che a-i vniran ant costa pàgina-sì e ant soa pàgina ëd discuss
'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}}.",
'iteminvalidname' => "Problema con l'element '$1', nòm nen vàlid...",
-'wlnote' => "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime '''$1''' modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime '''$2''' ore}}.",
+'wlnote' => "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime '''$1''' modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime '''$2''' ore}}, a parte da $3, $4.",
'wlshowlast' => "Smon-e j'ùltime $1 ore $2 dì $3",
'watchlist-options' => "Opsion ëd la lista dla ròba ch'as ten sot-euj",
@@ -2024,8 +2070,6 @@ Për piasì, che an conferma che sòn a l'é da bon sò but, che a as rend cont
'actionfailed' => 'Assion falìa',
'deletedtext' => "La pàgina «$1» a l'é stàita scancelà.
Che a varda $2 për na lista dle pàgine scancelà ant j'ùltim temp.",
-'deletedarticle' => 'Scancelà "$1"',
-'suppressedarticle' => 'a l\'ha scancelà "[[$1]]"',
'dellogpage' => 'Registr djë scancelament',
'dellogpagetext' => "Ambelessì-sota a-i é na lista dle pàgine scancelà ant j'ùltim temp.",
'deletionlog' => 'Registr djë scancelament',
@@ -2072,7 +2116,10 @@ Ch'a varda la [[Special:ProtectedPages|Lista dle pàgine protegiùe]] për la li
'unprotectedarticle' => "a l'ha gavà la protession da «[[$1]]»",
'movedarticleprotection' => "a l'ha cambià j'ampostassion ëd protession da «[[$2]]» a «[[$1]]»",
'protect-title' => 'I soma antramentr che i protegioma «$1»',
+'protect-title-notallowed' => 'Vëdde ël livel ëd protession ëd «$1»',
'prot_1movedto2' => '[[$1]] tramudà a [[$2]]',
+'protect-badnamespace-title' => 'Spassi nominal pa protegìbil',
+'protect-badnamespace-text' => 'Le pàgine an cost ëspassi nominal-sì a peulo pa esse protegiùe.',
'protect-legend' => 'Che an conferma la protession',
'protectcomment' => 'Rason:',
'protectexpiry' => 'Scadensa:',
@@ -2092,6 +2139,7 @@ Ambelessì a-i son j'ampostassion atuaj për la pàgina '''$1''':",
'protect-level-sysop' => "mach për j'aministrator",
'protect-summary-cascade' => 'a sàut',
'protect-expiring' => 'scadensa: $1 (UTC)',
+'protect-expiring-local' => 'a finiss ai $1',
'protect-expiry-indefinite' => 'për sempe',
'protect-cascade' => "Protege le pàgine ch'a fan part ëd costa (protession a sàut)",
'protect-cantedit' => "A peul pa cambieje livel ëd protession a sta pàgina-sì, për via ch'a l'ha nen ël përmess dë modifichela.",
@@ -2151,7 +2199,6 @@ l'avìa travajaje ansima anans che a la scancelèisso.
'undeletereset' => "Buté torna tut tanme 'l sòlit",
'undeleteinvert' => 'Anvertì la selession',
'undeletecomment' => 'Rason:',
-'undeletedarticle' => 'Pijaita andré "$1"',
'undeletedrevisions' => '{{PLURAL:$1|Na revision pijàita|$1 revision pijàite}} andré',
'undeletedrevisions-files' => "{{PLURAL:$1|Na|$1}} revision e {{PLURAL:$2|n'|$2&nbsp;}}archivi pijàit andré",
'undeletedfiles' => "{{PLURAL:$1|N'|$1&nbsp;}}archivi pijàit andaré",
@@ -2160,6 +2207,7 @@ l'avìa travajaje ansima anans che a la scancelèisso.
Che as varda ël [[Special:Log/delete|Registr djë scancelament]] për ës-ciairé j'ùltim scancelament e arcuperassion.",
'undelete-header' => "Ch'a varda [[Special:Log/delete|ël registr djë scancelament]] për ës-ciairé j'ùltim dëscancelament.",
+'undelete-search-title' => 'Sërché dle pàgine scancelà',
'undelete-search-box' => 'Arserché dle pàgine scancelà',
'undelete-search-prefix' => "Smon-e le pàgine ch'as anandio për:",
'undelete-search-submit' => 'Sërché',
@@ -2168,6 +2216,7 @@ Che as varda ël [[Special:Log/delete|Registr djë scancelament]] për ës-ciair
'undelete-bad-store-key' => "As peul pa pijesse andré la revision dl'archivi col marcatemp $1: L'archivi a-i era già pì nen anans d'esse scancelà.",
'undelete-cleanup-error' => "Eror ën scanceland l'archivi nen dovrà «$1».",
'undelete-missing-filearchive' => "As peul nen ricuperesse l'archivi con l'identità $1 përchè a-i é pa ant la base ëd dat. A peul esse ch'a l'abio già pijalo andré.",
+'undelete-error' => "Pàgina d'eror d'arcuperassion",
'undelete-error-short' => "Eror ën arcuperand l'archivi: $1",
'undelete-error-long' => "Eror antramentr ch'as arcuperava l'archivi:
@@ -2290,6 +2339,7 @@ Ch'a consulta la [[Special:BlockList|lista dj'IP blocà]] për rivëdde ij bloca
'blocklist-userblocks' => 'Stërmé ij blocagi dij cont',
'blocklist-tempblocks' => 'Stërmé ij blocagi a temp',
'blocklist-addressblocks' => "Stërmé ij blocagi d'adrësse IP ùniche",
+'blocklist-rangeblocks' => "Stërmé ij blocagi d'antërval",
'blocklist-timestamp' => 'Stampin data e ora',
'blocklist-target' => 'Bërsaj',
'blocklist-expiry' => 'Scadensa',
@@ -2312,6 +2362,7 @@ Ch'a consulta la [[Special:BlockList|lista dj'IP blocà]] për rivëdde ij bloca
'unblocklink' => 'dësbloché',
'change-blocklink' => 'modifiché ël blocagi',
'contribslink' => 'contribussion',
+'emaillink' => 'mandé un mëssagi eletrònich',
'autoblocker' => "A l'é scataje un blocagi përchè soa adrëssa IP a l'é staita dovrà ant j'ùltim temp da l'Utent «[[User:$1|$1]]». Ël motiv për bloché $1 a l'é stait: «'''$2'''»",
'blocklogpage' => 'Registr dij blocagi',
'blocklog-showlog' => "St'utent-sì a l'é già stàit blocà ant ël passà. Ël registr dij blocagi a l'é disponìbil sì-sota 'me arferiment:",
@@ -2435,9 +2486,6 @@ Che as sërna, për piasì, un nòm diferent për st'articol.",
'movepage-page-moved' => "La pàgina $1 a l'é stàita tramudà a $2.",
'movepage-page-unmoved' => 'La pàgina $1 a peul pa esse tramudà a $2.',
'movepage-max-pages' => "Ël massim ëd {{PLURAL:$1|na pàgina a l'é stàita |$1 pàgine a son stàite}} tramudà e a na saran pa pì tramudà automaticament.",
-'1movedto2' => '[[$1]] Tramudà a [[$2]]',
-'1movedto2_redir' => '[[$1]] tramudà a [[$2]] ën passand për na ridiression',
-'move-redirect-suppressed' => 'ridiression ëscancelà',
'movelogpage' => 'Registr dij San Martin',
'movelogpagetext' => 'Ambelessì sota a-i é na lista ëd pàgine che a son staite tramudà.',
'movesubpage' => '{{PLURAL:$1|Sotpàgina|Sotpàgine}}',
@@ -2450,7 +2498,7 @@ Che as sërna, për piasì, un nòm diferent për st'articol.",
L\'artìcol ëd destinassion "[[:$1]]" a-i é già. Veul-lo scancelelo për avej ëd pòst për tramudé l\'àutr?',
'delete_and_move_confirm' => 'É, scancela la pàgina',
-'delete_and_move_reason' => "Scancelà për liberé ël pòst për tramudene n'àutra",
+'delete_and_move_reason' => 'Scancelà për liberé ël pòst për tramudé "[[$1]]"',
'selfmove' => "Tìtol neuv e tìtol vej a resto midem antra lor; as peul pa tramudesse na pàgina butand-la andoa che a l'é già.",
'immobile-source-namespace' => 'As peul pa tramudé ëd pàgine ant ël namespace "$1"',
'immobile-target-namespace' => 'As peul pa tramudé ëd pàgine ant ël namespace "$1"',
@@ -2483,9 +2531,11 @@ e che as serna se a veul la version corenta ansema a cole veje, con le righe che
ò pura mach l'anformassion ant sël quand che a sia staje l'ùltima modìfica.
Se costa ùltima possibilità a fussa lòn che a-j serv, a podrìa ëdcò dovré n'anliura, pr'esempi [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] për la pàgina \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Esporté tute le pàgine',
'exportcuronly' => 'Ciapa sù mach la version corenta, pa tuta la stòria',
'exportnohistory' => "----
'''Nòta:''' la possibilità d'esporté la stòria completa dle pàgine a l'é staita gavà për dle question corelà a le prestassion dël sistema.",
+'exportlistauthors' => 'Anclude na lista completa dij contributor për minca pàgina',
'export-submit' => 'Esporté',
'export-addcattext' => "Gionta pàgine da 'nt la categorìa:",
'export-addcat' => 'Gionta',
@@ -2518,6 +2568,8 @@ Për piasì vìsita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisassi
'thumbnail_error' => 'Eror antramentr che as fasìa la figurin-a: $1',
'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",
+'thumbnail-dest-create' => 'Pa bon a salvé na miniadura sla destinassion',
'thumbnail_invalid_params' => 'Paràmetro dla figurin-a pa giust',
'thumbnail_dest_directory' => 'As peul pa fesse ël dossié ëd destinassion',
'thumbnail_image-type' => 'Sòrt ëd figura nen gestì',
@@ -2563,6 +2615,11 @@ Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
'import-token-mismatch' => 'Perdù ij dat ëd session.
Për piasì preuva torna.',
'import-invalid-interwiki' => 'As peul pa amportesse da la wiki spessificà.',
+'import-error-edit' => "La pàgina «$1» a l'é pa amportà përchè a peul pa modifichela.",
+'import-error-create' => "La pàgina «$1» a l'é pa amportà përchè a peul pa creela.",
+'import-error-interwiki' => 'La pàgina "$1" a l\'é pa amportà përchè sò nòm a l\'é arzervà për na liura esterna (antërwiki).',
+'import-error-special' => 'La pàgina "$1" a l\'é pa amportà përchè a ponta a në spassi nominal ch\'a përmët pa dle pàgine.',
+'import-error-invalid' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
# Import log
'importlogpage' => "Registr dj'amportassion",
@@ -2572,73 +2629,86 @@ Për piasì preuva torna.',
'import-logentry-interwiki' => "Amportà da n'àutra wiki $1",
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revision|revision}} da $2',
+# JavaScriptTest
+'javascripttest' => 'Preuva ëd JavaScript',
+'javascripttest-disabled' => "Sta funsion-sì a l'é pa abilità.",
+'javascripttest-title' => 'Fé dle preuve $1',
+'javascripttest-pagetext-noframework' => "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
+'javascripttest-pagetext-unknownframework' => 'Utiss ëd preuva pa conossù "$1".',
+'javascripttest-pagetext-frameworks' => "Për piasì, ch'a serna un-a dle struture ëd test sì-dapress: $1",
+'javascripttest-pagetext-skins' => "Ch'a serna na pel për fé le preuve:",
+'javascripttest-qunit-intro' => 'Varda [$1 la documentassion dle preuve] dzora a mediawiki.org.',
+'javascripttest-qunit-heading' => 'Sequensa ëd preuve QUnit ëd JavaScript su MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Toa pàgina utent',
-'tooltip-pt-anonuserpage' => 'Pàgina Utent për l',
-'tooltip-pt-mytalk' => 'Toa pàgina ëd discussion e ciaciarade.',
-'tooltip-pt-anontalk' => 'Pàgina ëd ciaciarade për l',
-'tooltip-pt-preferences' => 'Coma che i veuj mia {{SITENAME}}.',
-'tooltip-pt-watchlist' => 'Lista dle pàgine che chiel as ten sot euj.',
-'tooltip-pt-mycontris' => 'Lista ëd toe contribussion',
-'tooltip-pt-login' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l",
-'tooltip-pt-anonlogin' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l",
-'tooltip-pt-logout' => 'Seurte da',
-'tooltip-ca-talk' => 'Discussion ansima a sta pàgina ëd contnù.',
-'tooltip-ca-edit' => 'Modifiché sta pàgina-sì. Për piasì, che as fasa na preuva anans che salvé .',
-'tooltip-ca-addsection' => 'Ancamin-a na neuva session',
-'tooltip-ca-viewsource' => 'Sta pàgina-sì a l',
-'tooltip-ca-history' => 'Veje version dla pàgina.',
-'tooltip-ca-protect' => 'Për protege sta pàgina-sì.',
-'tooltip-ca-unprotect' => 'Cangé la protession ëd costa pàgina-sì',
-'tooltip-ca-delete' => 'Scancelé sta pàgina-sì',
-'tooltip-ca-undelete' => 'Pijé andré le modìfiche faite a sta pàgina-sì, anans che a fussa scancelà.',
-'tooltip-ca-move' => 'Tramudé sta pàgina, visadì cangeje tìtol.',
-'tooltip-ca-watch' => 'Gionté sta pàgina-sì a la lista dle ròbe che as ten-o sot euj.',
-'tooltip-ca-unwatch' => 'Gavé via sta pàgina da',
-'tooltip-search' => 'Sërca an {{SITENAME}}',
-'tooltip-search-go' => "Andé a na pàgina ch'as ciama parej, sempe ch'a-i në sia un-a",
-'tooltip-search-fulltext' => 'Sërché ës test-sì antra le pàgine dël sit',
-'tooltip-p-logo' => 'Pàgina prinsipal.',
-'tooltip-n-mainpage' => 'Visité la pàgina prinsipal.',
-'tooltip-n-mainpage-description' => 'Vìsita la pàgina prinsipal',
-'tooltip-n-portal' => 'Rësguard al proget, lòn che a peul fé, andoa trové còsa.',
-'tooltip-n-currentevents' => 'Informassion ansima a lòn che a-i riva.',
-'tooltip-n-recentchanges' => 'Lista dj',
-'tooltip-n-randompage' => 'Carié na pàgina basta che a sia.',
-'tooltip-n-help' => 'Ël pòst për capì.',
-'tooltip-t-whatlinkshere' => 'Lista ëd tute le pàgine dla wiki che a men-o ambelessì.',
-'tooltip-t-recentchangeslinked' => 'Ùltime modìfiche dle pàgine andoa as peul andesse da costa.',
-'tooltip-feed-rss' => 'RSS feed për sta pàgina-sì.',
-'tooltip-feed-atom' => 'Atom feed për sta pàgina-sì.',
-'tooltip-t-contributions' => 'Vardé la lista dle contribussion dë st',
-'tooltip-t-emailuser' => 'Mandeje un messagi ëd pòsta a st',
-'tooltip-t-upload' => 'Carié archivi ëd figure ò son.',
-'tooltip-t-specialpages' => 'Lista ëd tute le pàgine speciaj.',
-'tooltip-t-print' => 'Version bon-a da stampé dë sta pàgina',
-'tooltip-t-permalink' => 'Anliura fissa a sta version-i dla pàgina',
-'tooltip-ca-nstab-main' => 'Vardé la pàgina ëd contnù.',
-'tooltip-ca-nstab-user' => 'Vardé la pàgina Utent.',
-'tooltip-ca-nstab-media' => 'Vardé la pàgina dl',
-'tooltip-ca-nstab-special' => 'Costa a l',
-'tooltip-ca-nstab-project' => 'Vardé la pàgina proteta.',
-'tooltip-ca-nstab-image' => 'Vardé la pàgina dl',
-'tooltip-ca-nstab-mediawiki' => 'Vardé ël messagi ëd sistema.',
-'tooltip-ca-nstab-template' => 'Vardé lë stamp.',
-'tooltip-ca-nstab-help' => 'Vardé la pàgina d',
-'tooltip-ca-nstab-category' => 'Vardé la pàgina dla categorìa.',
-'tooltip-minoredit' => 'Marca sossì coma modìfica cita',
-'tooltip-save' => 'Salva le modìfiche',
-'tooltip-preview' => 'Preuva dle modìfiche (mej sempe fela, prima che fé che salvé!)',
-'tooltip-diff' => "Fame vëdde che modìfiche che i l'hai faje al test.",
-'tooltip-compareselectedversions' => 'Fame ël paragon dle diferense antra le version selessionà.',
-'tooltip-watch' => 'Gionta sta pàgina-sì a la lista dle ròbe che im ten-o sot euj',
-'tooltip-recreate' => 'Creé torna la pàgina contut che a la sia staita scancelà',
-'tooltip-upload' => 'Anandiesse a carié',
-'tooltip-rollback' => '"Rollback" a scansela con un clich le modìfiche fàite a costa pagina da l\'ùltim contribudor',
-'tooltip-undo' => '"Undo" a scansela costa modìfica e a deurb la fnestra ëd modìfica an manera ëd vardé prima.
+'tooltip-pt-userpage' => 'Toa pàgina utent',
+'tooltip-pt-anonuserpage' => 'Pàgina Utent për l',
+'tooltip-pt-mytalk' => 'Toa pàgina ëd discussion e ciaciarade.',
+'tooltip-pt-anontalk' => 'Pàgina ëd ciaciarade për l',
+'tooltip-pt-preferences' => 'Coma che i veuj mia {{SITENAME}}.',
+'tooltip-pt-watchlist' => 'Lista dle pàgine che chiel as ten sot euj.',
+'tooltip-pt-mycontris' => 'Lista ëd toe contribussion',
+'tooltip-pt-login' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l",
+'tooltip-pt-anonlogin' => "Un a l'é nen obligà a rintré ant al sistema, ma se a lo fa a l",
+'tooltip-pt-logout' => 'Seurte da',
+'tooltip-ca-talk' => 'Discussion ansima a sta pàgina ëd contnù.',
+'tooltip-ca-edit' => 'Modifiché sta pàgina-sì. Për piasì, che as fasa na preuva anans che salvé .',
+'tooltip-ca-addsection' => 'Ancamin-a na neuva session',
+'tooltip-ca-viewsource' => 'Sta pàgina-sì a l',
+'tooltip-ca-history' => 'Veje version dla pàgina.',
+'tooltip-ca-protect' => 'Për protege sta pàgina-sì.',
+'tooltip-ca-unprotect' => 'Cangé la protession ëd costa pàgina-sì',
+'tooltip-ca-delete' => 'Scancelé sta pàgina-sì',
+'tooltip-ca-undelete' => 'Pijé andré le modìfiche faite a sta pàgina-sì, anans che a fussa scancelà.',
+'tooltip-ca-move' => 'Tramudé sta pàgina, visadì cangeje tìtol.',
+'tooltip-ca-watch' => 'Gionté sta pàgina-sì a la lista dle ròbe che as ten-o sot euj.',
+'tooltip-ca-unwatch' => 'Gavé via sta pàgina da',
+'tooltip-search' => 'Sërca an {{SITENAME}}',
+'tooltip-search-go' => "Andé a na pàgina ch'as ciama parej, sempe ch'a-i në sia un-a",
+'tooltip-search-fulltext' => 'Sërché ës test-sì antra le pàgine dël sit',
+'tooltip-p-logo' => 'Pàgina prinsipal.',
+'tooltip-n-mainpage' => 'Visité la pàgina prinsipal.',
+'tooltip-n-mainpage-description' => 'Vìsita la pàgina prinsipal',
+'tooltip-n-portal' => 'Rësguard al proget, lòn che a peul fé, andoa trové còsa.',
+'tooltip-n-currentevents' => 'Informassion ansima a lòn che a-i riva.',
+'tooltip-n-recentchanges' => 'Lista dj',
+'tooltip-n-randompage' => 'Carié na pàgina basta che a sia.',
+'tooltip-n-help' => 'Ël pòst për capì.',
+'tooltip-t-whatlinkshere' => 'Lista ëd tute le pàgine dla wiki che a men-o ambelessì.',
+'tooltip-t-recentchangeslinked' => 'Ùltime modìfiche dle pàgine andoa as peul andesse da costa.',
+'tooltip-feed-rss' => 'RSS feed për sta pàgina-sì.',
+'tooltip-feed-atom' => 'Atom feed për sta pàgina-sì.',
+'tooltip-t-contributions' => 'Vardé la lista dle contribussion dë st',
+'tooltip-t-emailuser' => 'Mandeje un messagi ëd pòsta a st',
+'tooltip-t-upload' => 'Carié archivi ëd figure ò son.',
+'tooltip-t-specialpages' => 'Lista ëd tute le pàgine speciaj.',
+'tooltip-t-print' => 'Version bon-a da stampé dë sta pàgina',
+'tooltip-t-permalink' => 'Anliura fissa a sta version-i dla pàgina',
+'tooltip-ca-nstab-main' => 'Vardé la pàgina ëd contnù.',
+'tooltip-ca-nstab-user' => 'Vardé la pàgina Utent.',
+'tooltip-ca-nstab-media' => 'Vardé la pàgina dl',
+'tooltip-ca-nstab-special' => 'Costa a l',
+'tooltip-ca-nstab-project' => 'Vardé la pàgina proteta.',
+'tooltip-ca-nstab-image' => 'Vardé la pàgina dl',
+'tooltip-ca-nstab-mediawiki' => 'Vardé ël messagi ëd sistema.',
+'tooltip-ca-nstab-template' => 'Vardé lë stamp.',
+'tooltip-ca-nstab-help' => 'Vardé la pàgina d',
+'tooltip-ca-nstab-category' => 'Vardé la pàgina dla categorìa.',
+'tooltip-minoredit' => 'Marca sossì coma modìfica cita',
+'tooltip-save' => 'Salva le modìfiche',
+'tooltip-preview' => 'Preuva dle modìfiche (mej sempe fela, prima che fé che salvé!)',
+'tooltip-diff' => "Fame vëdde che modìfiche che i l'hai faje al test.",
+'tooltip-compareselectedversions' => 'Fame ël paragon dle diferense antra le version selessionà.',
+'tooltip-watch' => 'Gionta sta pàgina-sì a la lista dle ròbe che im ten-o sot euj',
+'tooltip-watchlistedit-normal-submit' => 'Gavé via ij tìtoj',
+'tooltip-watchlistedit-raw-submit' => 'Agiorné la Lista',
+'tooltip-recreate' => 'Creé torna la pàgina contut che a la sia staita scancelà',
+'tooltip-upload' => 'Anandiesse a carié',
+'tooltip-rollback' => '"Rollback" a scansela con un clich le modìfiche fàite a costa pagina da l\'ùltim contribudor',
+'tooltip-undo' => '"Undo" a scansela costa modìfica e a deurb la fnestra ëd modìfica an manera ëd vardé prima.
At lassa gionté na spiegassion ëd la modìfica.',
-'tooltip-preferences-save' => 'Salvé ij sò gust',
-'tooltip-summary' => 'Anserì un curt resumé',
+'tooltip-preferences-save' => 'Salvé ij sò gust',
+'tooltip-summary' => 'Anserì un curt resumé',
# Stylesheets
'common.css' => '/** Ël còdes CSS che as buta ambelessì a resta dovrà ant tute le "facie" */',
@@ -2699,9 +2769,6 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
# Patrol log
'patrol-log-page' => 'Registr dij contròj',
'patrol-log-header' => "Sto sì a l'é un registr ëd le revision verificà.",
-'patrol-log-line' => "a l'ha marcà la $1 ëd $2 coma controlà $3",
-'patrol-log-auto' => '(automàtich)',
-'patrol-log-diff' => 'modìfica $1',
'log-show-hide-patrol' => '$1 registr verificà',
# Image deletion
@@ -2728,11 +2795,11 @@ An fasend-lo travajé ansima a sò ordinator chiel a podrìa porteje ëd dann a
'file-info' => "amzura dl'archivi: $1, sòrt MIME: $2",
'file-info-size' => '$1 × $2 pixel, amzure: $3, sòrt MIME: $4',
'file-info-size-pages' => "$1 × $2 pontin, dimension ëd l'archivi: $3, sòrt MIME: $4, $5 {{PLURAL:$5|pàgina|pàgine}}",
-'file-nohires' => '<small>Gnun-a risolussion pì bela disponibila.</small>',
+'file-nohires' => 'Gnun-a risolussion pì bela disponìbil.',
'svg-long-desc' => "archivi an forma SVG, amzure nominaj $1 × $2 pixel, amzura dl'archivi: $3",
'show-big-image' => 'Version a amzura pijn-a',
-'show-big-image-preview' => '<small>Amzure dë sta preuva: $1.</small>',
-'show-big-image-other' => '<small>Àutre arzolussion: $1.</small>',
+'show-big-image-preview' => 'Amzure dë sta preuva: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Àutra arzolussion|Àutre arzolussion}}: $1.',
'show-big-image-size' => '$1 × $2 pontin',
'file-info-gif-looped' => 'ciclà',
'file-info-gif-frames' => '$1 {{PLURAL:$1|fnesta|fneste}}',
@@ -2752,6 +2819,13 @@ An fasend-lo travajé ansima a sò ordinator chiel a podrìa porteje ëd dann a
'bydate' => 'për data',
'sp-newimages-showfrom' => "Smon j'ùltim archivi multimojen a anandiesse da $2 dël $1",
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|un second|$1 second}}',
+'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute}}',
+'hours' => '{{PLURAL:$1|$1 ora|$1 ore}}',
+'days' => '{{PLURAL:$1|$1 di|$1 di}}',
+'ago' => '$1 fa',
+
# Bad image list
'bad_image_list' => "La forma a l'é costa-sì:
@@ -3260,13 +3334,6 @@ Cost còdes ëd conferma a scad ai \$4.",
'scarytranscludefailed' => "[Darmagi, ma lë stamp $1 a l'é pa podusse carié]",
'scarytranscludetoolong' => "[L'URL a l'é tròp longa]",
-# Trackbacks
-'trackbackbox' => 'Anformassion për feje ël traciament a sta vos-sì:<br />
-$1',
-'trackbackremove' => '([$1 Gava via])',
-'trackbacklink' => 'Traciament',
-'trackbackdeleteok' => "J'anformassion për fé traciament a son staite gavà via.",
-
# Delete conflict
'deletedwhileediting' => "'''Avertensa''': sta pàgina-sì a l'é staita scancelà quand che chiel (chila) a l'avìa già anandiasse a modifichela!",
'confirmrecreate' => "L'utent [[User:$1|$1]] ([[User talk:$1|talk]]) a l'ha scancelà st'articol-sì quand che chiel (chila) a l'avia già anandiasse a modifichelo, dand coma motiv ëd la scancelament:
@@ -3367,6 +3434,9 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
'iranian-calendar-m11' => "Mèis JalÄli ch'a fa óndes",
'iranian-calendar-m12' => "Meis JalÄli ch'a fa dódes",
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciaciarade]])',
+
# Core parser functions
'unknown_extension_tag' => 'Tacolèt d\'estension "$1" pa conossù',
'duplicate-defaultsort' => "'''Atension:''' La ciav d'ordinament ëd default \"\$2\" a ven al pòst ëd cola ëd prima \"\$1\"",
@@ -3465,13 +3535,16 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiament}}',
# Special:ComparePages
-'comparepages' => 'Confronté dle pàgine',
-'compare-selector' => 'Confronté le revision dle pàgine',
-'compare-page1' => 'Pàgina 1',
-'compare-page2' => 'Pàgina 2',
-'compare-rev1' => 'Revision 1',
-'compare-rev2' => 'Revision 2',
-'compare-submit' => 'Confronta',
+'comparepages' => 'Confronté dle pàgine',
+'compare-selector' => 'Confronté le revision dle pàgine',
+'compare-page1' => 'Pàgina 1',
+'compare-page2' => 'Pàgina 2',
+'compare-rev1' => 'Revision 1',
+'compare-rev2' => 'Revision 2',
+'compare-submit' => 'Confronta',
+'compare-invalid-title' => "Ël tìtol ch'a l'ha spessificà a va pa bin.",
+'compare-title-not-exists' => "Ël tìtol ch'a l'ha spessificà a esist pa",
+'compare-revision-not-exists' => "La revision che it l'has spessificà a esist pa.",
# Database error messages
'dberr-header' => "Sta wiki-sì a l'ha un problema",
@@ -3498,4 +3571,90 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
'sqlite-has-fts' => '$1 con arserca an test pien mantnùa',
'sqlite-no-fts' => '$1 sensa arserca an test pien mantnùa',
+# New logging system
+'logentry-delete-delete' => "$1 a l'ha scancelà la pàgina $3",
+'logentry-delete-restore' => "$1 a l'ha ripristinà la pàgina $3",
+'logentry-delete-event' => "$1 cangià la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
+'logentry-delete-revision' => "$1 a l'ha modificà la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
+'logentry-delete-event-legacy' => "$1 cangià la visibilità dj'event dël registr dzora $3",
+'logentry-delete-revision-legacy' => "$1 a l'ha modificà la visibilità dle revision dzora la pàgina $3",
+'logentry-suppress-delete' => "$1 a l'ha eliminà la pàgina $3",
+'logentry-suppress-event' => "$1 cangià segretament la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
+'logentry-suppress-revision' => "$1 a l'ha modificà segretament la visibilità ëd {{PLURAL:$5|na revision|$5 revision}} dzora la pàgina $3: $4",
+'logentry-suppress-event-legacy' => "$1 cangià segretament la visibilità dj'event dël registr dzora $3",
+'logentry-suppress-revision-legacy' => "$1 a l'ha modificà segretament la visibilità dle revision dzora la pàgina $3",
+'revdelete-content-hid' => 'contnù stërmà',
+'revdelete-summary-hid' => 'resumé dle modìfiche stërmà',
+'revdelete-uname-hid' => 'stranòm stërmà',
+'revdelete-content-unhid' => 'contnù dëscoatà',
+'revdelete-summary-unhid' => 'resumé dle modìfiche dëscoatà',
+'revdelete-uname-unhid' => 'stranòm dëscoatà',
+'revdelete-restricted' => "a l'ha aplicà le restrission a j'aministrator",
+'revdelete-unrestricted' => "restrission për j'aministrator gavà",
+'logentry-move-move' => "$1 a l'ha tramudà la pàgina $3 a $4",
+'logentry-move-move-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 sensa lassé na ridiression",
+'logentry-move-move_redir' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression",
+'logentry-move-move_redir-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression sensa lassé na ridiression",
+'logentry-patrol-patrol' => "$1 a l'ha marcà la revision $4 dla pàgina $3 'me controlà",
+'logentry-patrol-patrol-auto' => "$1 a l'ha marcà automaticament la revision $4 dla pàgina $3 'me controlà",
+'logentry-newusers-newusers' => '$1 creà un cont utent',
+'logentry-newusers-create' => '$1 creà un cont utent',
+'logentry-newusers-create2' => '$1 creà un cont utent $3',
+'logentry-newusers-autocreate' => "Ël cont $1 a l'é stàit creà an automàtich",
+'newuserlog-byemail' => 'ciav spedìa për pòsta eletrònica',
+
+# Feedback
+'feedback-bugornote' => 'S\'a ses pront a descrive un problema técnich an detaj, për piasì ch\'a [$1 signala un bigat].
+Dësnò, a peule dovré ël formlari semplificà sì-sota. Sò coment a sarà giontà a la pàgina "[$3 $2]", con sò stranòm e ël navigador che chiel a deuvra.',
+'feedback-subject' => 'Soget:',
+'feedback-message' => 'Mëssagi:',
+'feedback-cancel' => 'Scancela',
+'feedback-submit' => 'Spedì ij coment',
+'feedback-adding' => 'Gionta dij coment a la pàgina...',
+'feedback-error1' => 'Eror: Arzultà pa arconossù da API',
+'feedback-error2' => 'Eror: Modìfica falìa',
+'feedback-error3' => 'Eror: Pa gnun-e arspòste da API',
+'feedback-thanks' => 'Mersì! Sò coment a l\'é stàit publicà an sla pàgina "[$1 $2]".',
+'feedback-close' => 'Fàit',
+'feedback-bugcheck' => "Bin fàit! Ch'a contròla mach ch'a sia pa già un dij [$1 bigat conossù].",
+'feedback-bugnew' => "I l'heu controlà. Arpòrta n'eror neuv.",
+
+# API errors
+'api-error-badaccess-groups' => "Chiel a peul pa carié d'archivi su sta wiki.",
+'api-error-badtoken' => 'Eror antern: sìmbol pa bon.',
+'api-error-copyuploaddisabled' => "Ël càrigh a travers ëd n'anliura a l'é disabilità su cost sërvent.",
+'api-error-duplicate' => "A-i {{PLURAL:$1|é [$2 n'àutr archivi]|son [$2 d'àutr archivi]}} già an sël sit col ël midem contnù",
+'api-error-duplicate-archive' => "A-i {{PLURAL:$1|era [$2 n'àutr archivi]|ero [$2 àutri archivi]}} già an sël sit con ël midem contnù, ma {{PLURAL:$1|a l'é stàit|a son stàit}} ëscancelà.",
+'api-error-duplicate-archive-popup-title' => "Dupliché {{PLURAL:$1|l'archivi|j'archivi}} ch'a son già stàit ëscancelà",
+'api-error-duplicate-popup-title' => "Dupliché {{PLURAL:$1|l'archivi|j'archivi}}",
+'api-error-empty-file' => "L'archivi ch'a l'ha mandà a l'era veuid.",
+'api-error-emptypage' => "La creassion ëd pagine neuve veujde a l'é pa përmëttùa.",
+'api-error-fetchfileerror' => "Eror antern: quaicòs a l'é andàit mal an mente as arcuperava l'archivi",
+'api-error-file-too-large' => "L'archivi ch'a l'ha mandà a l'era tròp gròss.",
+'api-error-filename-tooshort' => "Ël nòm ëd l'archivi a l'é tròp curt.",
+'api-error-filetype-banned' => "Costa sòrt d'archivi a l'é proibìa.",
+'api-error-filetype-missing' => "L'archivi a l'é sensa estension.",
+'api-error-hookaborted' => "La modìfica ch'a l'ha provà a fé a l'é stàita blocà dal gancio ëd n'estension.",
+'api-error-http' => 'Eror antern: as peul pa coleghesse al sërvent.',
+'api-error-illegal-filename' => "Ël nòm dl'archivi a l'é nen consentì.",
+'api-error-internal-error' => "Eror antern: quaicòs a l'é andàit mal con ël tratament ëd tò cariagi an sla wiki.",
+'api-error-invalid-file-key' => 'Eror antern: archivi pa trovà ant la memòria a temp.',
+'api-error-missingparam' => "Eror antern: paràmetr mancant ant l'arcesta.",
+'api-error-missingresult' => "Eror antern: as peul pa determiné se la còpia a l'é andàita bin.",
+'api-error-mustbeloggedin' => "A dev esse intrà ant ël sistema për carié dj'archivi.",
+'api-error-mustbeposted' => "Eror antern: L'arcesta a l'ha da manca d'HTTP POST.",
+'api-error-noimageinfo' => "Ël càrigh a l'é andàit bin, ma ël sërvent a l'ha dane gnun-e anformassion an sl'archivi.",
+'api-error-nomodule' => 'Eror antern: Gnun mòdoj ëd cariagi ampostà.',
+'api-error-ok-but-empty' => 'Eror antern: Gnun-a arspòste dal sërvent.',
+'api-error-overwrite' => "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
+'api-error-stashfailed' => "Eror antern: ël sërvent a l'ha pa podù memorisé l'archivi a temp.",
+'api-error-timeout' => "Ël sërvent a l'ha pa arspondù ant ël temp spetà.",
+'api-error-unclassified' => "A l'é capitaje n'eror nen conossù.",
+'api-error-unknown-code' => 'Eror sconossù: "$1"',
+'api-error-unknown-error' => "Eror antern: quaicòs a l'é andàit mal quand a l'é provasse a carié tò archivi.",
+'api-error-unknown-warning' => 'Avis pa conossù: $1',
+'api-error-unknownerror' => 'Eror sconossù: "$1".',
+'api-error-uploaddisabled' => "Ël cariagi a l'é disabilità su sta wiki.",
+'api-error-verification-error' => "Cost archivi a peul esse danegià, o avèj l'estension sbalià.",
+
);
diff --git a/languages/messages/MessagesPnb.php b/languages/messages/MessagesPnb.php
index 6c0f6389..7f151662 100644
--- a/languages/messages/MessagesPnb.php
+++ b/languages/messages/MessagesPnb.php
@@ -8,6 +8,7 @@
* @file
*
* @author Arslan
+ * @author Kaganer
* @author Khalid Mahmood
* @author Rachitrali
* @author ZaDiak
@@ -371,23 +372,25 @@ $messages = array(
'badarticleerror' => 'اے Ú©Ù… اس صÙØ­Û’ تے نئیں ÛÙˆ سکدا۔',
'cannotdelete' => 'صÙØ­Û ÛŒØ§ Ùائل "$1" نوں مٹایا نا جاسکیا۔
اینوں Ù¾Ûلاں توں ای کسے Ù†Û’ مٹایا ÛÙˆÛ“ گا۔',
+'cannotdelete-title' => 'صÙÛ Ù…Ù¹Ø§ نئیں سکدے "$1"',
'badtitle' => 'پیڑا عنوان',
'badtitletext' => 'منگیا Ú¯Û“ صÙØ­Û Ø¯Ø§ ناں غلط اے، خالی اے یا غلط تریقے نال جوڑیا گیا اے۔<div/>
Ûوسکدا اے ایدے Ú† اک دو ھندسے ایسے Ûون جیڑے عنوان ÙˆÚ† استعمال Ù†Ûیں کیتے جاسکدے۔',
-'perfcached' => 'اے ڈیٹا پرانا بچایا Ûویا اے تے ایدے Ú† نویاں گلاں نئیں Ûون گیاں۔',
-'perfcachedts' => 'اے ڈیپا پرانا اے تے اینوں آخری آری $1 نوں نواں کیتا گیا سی۔',
+'perfcached' => 'تھلے دتا گیا ڈیٹا کاشیڈ اے تے پانویں نواں ناں Ûووے. Ø²ÛŒØ§Ø¯Û ØªÙˆÚº Ø²ÛŒØ§Ø¯Û Ú©Ø§Ø´Û’ Ú† {{PLURAL:$1|اک Ù†ØªÛŒØ¬Û Ûووے|$1 نتیجے Ûوون}} Ú¯Û’.',
+'perfcachedts' => 'تھلے دتا گیا ڈیٹا کاشیڈ اے تے $1 نوں نواں کیتا گیا۔ Ø²ÛŒØ§Ø¯Û ØªÙˆÚº Ø²ÛŒØ§Ø¯Û {{PLURAL:$4|اک Ù†ØªÛŒØ¬Û Ûووے|$4 نتیجے Ûوون}} نتیجے کاشے Ú† Ûیگے نیں .',
'querypage-no-updates' => 'اس صÙØ­Û’ نوں اپڈیٹ Ùلحال نئیں کیتا جا سکدا۔
ایدا مال ÛÙ„Û’ نواں نئیں کیتا جاۓ گا۔',
'wrong_wfQuery_params' => 'غلط پیرامیٹرز ÙˆÙکویریدے()<br />
Ùنکشن: $1<br />
کویری: $2',
'viewsource' => 'ویکھو',
-'viewsourcefor' => '$1 لئ',
+'viewsource-title' => '$1 لئی سورس ویکھو',
'actionthrottled' => 'اے کم کئی واری کیتا گیا اے',
'actionthrottledtext' => 'سپام روک کم لئی، توانوں ایس کم توں کئی واری اک تھوڑے ویلے چ روکیا گیا اے پر تساں اپنی حد توں اگے ودے۔
Ù…Ûربانی کرکے تھوڑے چر مگروں Ùیر کوشش کرنا۔',
'protectedpagetext' => 'اس صÙØ­Û’ دے اتے تبدیلی کرن نوں روکیا گیا اے۔',
'viewsourcetext' => 'تسی اس صÙØ­Û’ دی لکھائی نوں ویکھ تے نقل کر سکدے او:',
+'viewyourtext' => 'تسیں آپنی تبدیلیاں دا Ø°Ø±ÛŒØ¹Û Ø§ÛŒØ³ صÙÛ’ تے ویکھ تے کاپی کرسکدے او۔',
'protectedinterface' => 'اے صÙØ­Û’ ساÙٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا Ûویا اے۔',
'editinginterface' => "'''خبردار:''' تسیں اک ایسا صÙÛ Ø¨Ø¯Ù„ رۓ او جیÛڑا Ù…Ú©Ú¾ÛŒ صÙÛ’ دے سوÙٹویر نوں لکھت دیندا اے۔ ایس صÙÛ’ ج تبدیلی ورتنن والیاں دے Ù…Ú©Ú¾ÛŒ صÙÛ’ دے وکھالے نوں بدل دے گی۔ بولی وٹاندرے لئی، Ù…Ûربانی کرکے میڈیاوکی بولی ویونت [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ول ویکھو۔",
'sqlhidden' => '(SQL کھوج چھپائی Ûوئي اے)',
@@ -491,6 +494,7 @@ Note that some pages may continue to be displayed as if you were still logged in
'emailconfirmlink' => 'ای میل Ù¾ØªÛ Ù¾Ú©Ø§ کرو',
'invalidemailaddress' => 'Ø§ÛŒÛ Ø§ÛŒ-میل Ù¾ØªÛ Ù†Ø¦ÛŒÚº Ú†Ù„Û’ گا کیوں جے اے ناں منے جان والے Ùارمیٹ تے بنیا Ûویا اے۔
Ù…Ûربانی کرکے منے جان والے Ùارمیٹ پتے نوں دسو یا Ùیر اے تھاں خالی Ú†Ú¾Úˆ دیو۔',
+'cannotchangeemail' => 'ایس ÙˆÚ©ÛŒ تے Ú©Ú¾Ø§ØªÛ Ø§ÛŒ-میل پتے نئیں بدلے جاسکدے۔',
'accountcreated' => 'Ú©Ú¾Ø§ØªÛ Ú©Ú¾Ù„ گیا',
'accountcreatedtext' => 'ورتن Ú©Ú¾Ø§ØªÛ $1 لئی بنا دتا گیا اے۔',
'createaccount-title' => '{{SITENAME}} لئی کھاتے دا بننا۔',
@@ -505,6 +509,7 @@ Note that some pages may continue to be displayed as if you were still logged in
# E-mail sending
'php-mail-error-unknown' => 'PHP میل دے کم چ کوئی انجانی غلطی۔',
+'user-mail-no-addy' => 'ای-میل پتے بنا ای-میل کلن دی کوشش۔',
# Change password dialog
'resetpass' => 'کنجی بدلو',
@@ -526,28 +531,43 @@ Note that some pages may continue to be displayed as if you were still logged in
'resetpass-temp-password' => 'عارضی کنجی:',
# Special:PasswordReset
-'passwordreset' => 'کنجی واپس لیاؤ',
-'passwordreset-text' => 'اے Ùارم مکمل کرکے اپنے کھاتے دی معلومات اپنے ای-میل تے منگوالو۔',
-'passwordreset-legend' => 'کنجی واپس لیاؤ',
-'passwordreset-disabled' => 'اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔',
-'passwordreset-pretext' => '{{PLURAL:$1||تھلے دتے ÛÙˆÛ“ ڈیٹا Ú†ÙˆÚº اک ایتھے دیو}}',
-'passwordreset-username' => 'ورتن ناں:',
-'passwordreset-domain' => 'ڈومین',
-'passwordreset-email' => 'ای-میل پتÛ:',
-'passwordreset-emailtitle' => '{{SITENAME}} دے اتے کھاتے دی معلومات:',
-'passwordreset-emailtext-ip' => 'کسے Ù†Û’ (خورے تساں آئی Ù¾ÛŒ پتے $1) تواڈے کھاتے دا ویروا منگیا اے {{SITENAME}} ($4) لئی۔ تھلے دتا گیا ورتنوالا {{PLURAL:$3|کھاتÛ|کھاتے}} ایس ای-میل پتے نال جوڑ رکھدا اے:
+'passwordreset' => 'کنجی واپس لیاؤ',
+'passwordreset-text' => 'اے Ùارم مکمل کرکے اپنے کھاتے دی معلومات اپنے ای-میل تے منگوالو۔',
+'passwordreset-legend' => 'کنجی واپس لیاؤ',
+'passwordreset-disabled' => 'اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔',
+'passwordreset-pretext' => '{{PLURAL:$1||تھلے دتے ÛÙˆÛ“ ڈیٹا Ú†ÙˆÚº اک ایتھے دیو}}',
+'passwordreset-username' => 'ورتن ناں:',
+'passwordreset-domain' => 'ڈومین',
+'passwordreset-capture' => 'آن والی ای-میل ویکھو؟',
+'passwordreset-capture-help' => 'اگر تسیں اے ÚˆØ¨Û Ú†ÛŒÚ© کروگے ای-میل (عارضی کنجی نال) وکھائی جاۓ Ú¯ÛŒ توانوں تے پیجی ÙˆÛŒ جاۓ گی۔',
+'passwordreset-email' => 'ای-میل پتÛ:',
+'passwordreset-emailtitle' => '{{SITENAME}} دے اتے کھاتے دی معلومات:',
+'passwordreset-emailtext-ip' => 'کسے Ù†Û’ (خورے تساں آئی Ù¾ÛŒ پتے $1) تواڈے کھاتے دا ویروا منگیا اے {{SITENAME}} ($4) لئی۔ تھلے دتا گیا ورتنوالا {{PLURAL:$3|کھاتÛ|کھاتے}} ایس ای-میل پتے نال جوڑ رکھدا اے:
$2
{{PLURAL:$3|اے عارضی کنجی|اے عارضی کنجیاں}} {{PLURAL:$5|اک دن|$5 دناں}} Ú† Ù…Ú© جاوے گی۔ تسیں لاگان Ûوو تے اپنی اک نويں کنجی چنو. اگر کسے Ûور Ù†Û’ اے کنجی والی Ú†Ù¹Ú¾ÛŒ پیجی اے یا توانوں پرانی کنجی یاد آگئی اے تے تسیں پرانی کنجی نال ای Ú©Ù… چلانا چاندے او تے تسیں ایس سنیعے نوں پل جاؤ تے پرانی کنجی ای ورتو۔',
-'passwordreset-emailtext-user' => 'ورتنوالے $1 Ù†Û’ {{سائیٹناں}} تے تواڈے کھاتے بارے پچھیا اے {{SITENAME}} لئی ($4)Û” تھلے دتا گیا ورتن {{PLURAL:$3|کھاتÛ|کھاتے}} ایس ای-میل نال جڑدا اے۔
+'passwordreset-emailtext-user' => 'ورتنوالے $1 Ù†Û’ {{سائیٹناں}} تے تواڈے کھاتے بارے پچھیا اے {{SITENAME}} لئی ($4)Û” تھلے دتا گیا ورتن {{PLURAL:$3|کھاتÛ|کھاتے}} ایس ای-میل نال جڑدا اے۔
$2
{{PLURAL:$3|Ø§ÛŒÛ Ø¹Ø§Ø±Ø¶ÛŒ کنجی|اے عارضی کنجیاں}} Ù…Ú© جائیگا {{PLURAL:$5|اک دن|$5 دن}}Û” تسیں ÛÙ† لاکان Ûوو تے نویں کنجی چنو۔ اگر کسے Ûور Ù†Û’ اے Ú†Ù¹Ú¾ÛŒ پیجی یا توانوں اپنی Ù¾ÛÙ„ÛŒ کنجی یاد آگئی اے تے تسیں اونوں بدلنا نئیں چاندے تے تسیں ایس سنیعے نوں Ù¾Ú¾Ù„ جاؤ تے پرانی کنجی نال ای Ú©Ù… چلاؤ۔',
-'passwordreset-emailelement' => 'ورتن ناں: $1
+'passwordreset-emailelement' => 'ورتن ناں: $1
عارضی کنجی: $2',
-'passwordreset-emailsent' => 'یاد کران واسطے اک ای-میل پیج دتی گئی اے۔',
+'passwordreset-emailsent' => 'یاد کران واسطے اک ای-میل پیج دتی گئی اے۔',
+'passwordreset-emailsent-capture' => 'اک یاد کران والی ای-میل پیج دتی گئی اے، جیÛÚ‘ÛŒ تھلے دسی گئی اے۔',
+'passwordreset-emailerror-capture' => 'اک یادکراؤ ای-میل بنائی گئی اے، جیÛÚ‘ÛŒ Ú©Û ØªÚ¾Ù„Û’ دسی گئی اے، پر ورتن والے تک پیجنا نئیں Ûوسکیا:$1',
+
+# Special:ChangeEmail
+'changeemail' => 'ای-میل Ù¾ØªÛ Ø¨Ø¯Ù„Ùˆ',
+'changeemail-header' => 'کھاتے دا ای-میل Ù¾ØªÛ Ø¨Ø¯Ù„Ùˆ',
+'changeemail-text' => 'اس Ùارم نوں پورا کر Ú©Û’ ای-میل Ù¾ØªÛ Ø¨Ø¯Ù„ÙˆÛ” اس Ú©Ù… نوں پورا کرن واسطے توانوں اپنی کنجی Ù„Ú©Ú¾Ù†ÛŒ Ù¾Û“ گی۔',
+'changeemail-no-info' => 'تسی لاگ ان ÛÙˆÚ©Û’ ای اس صÙØ­Û’ نوں ویکھ سکدے او۔',
+'changeemail-oldemail' => 'ÛÙ„Û’ دا ای-میل پتÛ:',
+'changeemail-newemail' => 'نواں ای-میل پتÛ:',
+'changeemail-none' => '(کوئی نئیں)',
+'changeemail-submit' => 'ای-میل بدلو',
+'changeemail-cancel' => 'ختم',
# Edit page toolbar
'bold_sample' => 'موٹی لکھائی',
@@ -614,9 +634,6 @@ $2
تھواڈا ÛÙ† دا آئی Ù¾ÛŒ Ù¾ØªÛ $3 اے تے روکی آئی ÚˆÛŒ #$5Û”
کسے وی سوال جواب لئي اوپر دسیاں گلاں وی شامل کرو۔',
'blockednoreason' => 'کوئی ÙˆØ¬Û Ù†Ø¦ÛŒÚº دسی گئی',
-'blockedoriginalsource' => "'''$1''' دی آن دی تھاں اے وے:",
-'blockededitsource' => "لکھت وچ '''تواڈیاں تبدیلیاں''' تون '''$1''' تھلے نیں:",
-'whitelistedittitle' => 'تبدیلی کرن واسطے لاگ ان ضروری اے',
'whitelistedittext' => 'تھواڈے کول $1 Ûونا چآغیدا اے صÙÛ’ تبدیل کرن لئی۔',
'confirmedittext' => 'توانوں اپنا ای-میل Ù¾ØªÛ Ù¾Ú©Ø§ کرنا چائیدا اے تبدیلیاں کرن توں Ù¾ÛÙ„Û’Û”
Ù…Ûربانی کرکے اپنا ای-میل Ù¾ØªÛ Ø¨Ù†Ø§Ø¤ تے پکا کرو [[Special:Preferences|user preferences]]',
@@ -701,7 +718,7 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
اگر تسیں نئیں چاندے جے تواڈیاں لکھتاں بے رحمی نال تبدیل کیتیاں جان تے Ùیر اپنی لکھتاں ایتھے ناں Ù„Ú©Ú¾Ùˆ<br />
تسیں ساڈے نال اے ÙˆÛŒ ÙˆØ¹Ø¯Û Ú©Ø± رۓ او جے تساں اینوں آپ لکھیا اے، یایا کسے لوکاں آستے کاپی کرن والی تھاں توں کاپی کیتا اے یا اینج دے Ú©Ú¾Ù„Û’ سورس توں ( پوری Ú¯Ù„ لئی $1 ویکھو)
'''کاپی حق والےکم بنا اجازت دے ایتھے ناں پیش کرو'''",
-'longpageerror' => "'''غلطی : تھواڈی دتی گئی لکھت $1 کلوبائٹ لمی اے، جیÛÚ‘ÛŒ Ú©Û’ ود توں ود $2 کلوبائٹو توں ÙˆÛŒ ÙˆÚˆÛŒ اے۔'''
+'longpageerror' => "'''غلطی : تھواڈی دتی گئی لکھت {{PLURAL:$1|1 کلوبائٹ|$1 کلوبائٹ}} $1 لمی اے، جیÛÚ‘ÛŒ Ú©Û’ ود توں ود {{PLURAL:$2|1 کلوبائٹ|$2 کلوبائٹ}} توں ÙˆÛŒ ÙˆÚˆÛŒ اے۔'''
اینوں نئیں بچایا جاسکدا۔",
'readonlywarning' => "'''خبردار: ڈیٹابیس نوں تالا لگیا اے جے مرمت Ûورئی اے ایس تواڈیاں لکھتاں بچائیاں نئیں جاسکدیاں.'''
تسیں چاؤ Ú¯Û’ جے ÛÙ† کاپی کرلو لکھت اک لکھت Ùائل Ú† تے بچا لو Ùیر ورتن لئی۔
@@ -880,13 +897,6 @@ $1",
'revdel-restore-visible' => 'دسدیاں ریویناں',
'pagehist' => 'صÙØ­Û’ دی تریخ',
'deletedhist' => 'مٹائی گئی تریخ',
-'revdelete-content' => 'مواد',
-'revdelete-summary' => 'لکھائی دا خلاصÛ',
-'revdelete-uname' => 'ورتن آلے دا ناں',
-'revdelete-restricted' => 'مکھیاں تے روکاں لگیاں',
-'revdelete-unrestricted' => 'مکھیاں تے روکاں لتھیاں',
-'revdelete-hid' => '$1 لکایا گیا',
-'revdelete-unhid' => '$1 سامنے لیایا گیا',
'revdelete-hide-current' => 'آئیٹم نوں $2 تے $1 تریخاں چ لکان چ غلطی۔
Ø§ÛŒÛ Ù†Ø¦ÛŒÚº لکائی جاسکدی۔',
'revdelete-show-no-access' => '$2ØŒ $1 دی تریخاں دیاں آئٹماں دے دسن Ú† غلطی Ûوئی اے : Ø§ÛŒÛ Ø¢Ø¦Ù¹Ù… حد Ú† اے۔
@@ -1045,12 +1055,14 @@ $1",
'prefs-rc' => 'نویاں تبدیلیاں',
'prefs-watchlist' => 'نظر تھلے صÙØ­Û’',
'prefs-watchlist-days' => 'اکھ تھلے رکھی لسٹ چ دسے گۓ دن:',
-'prefs-watchlist-days-max' => 'Ø²ÛŒØ§Ø¯Û ØªÙˆÚº Ø²ÛŒØ§Ø¯Û 7 دن',
+'prefs-watchlist-days-max' => 'Ø²ÛŒØ§Ø¯Û ØªÙˆÚº Ø²ÛŒØ§Ø¯Û $1 {{PLURAL:$1|دن|دن}}',
'prefs-watchlist-edits' => 'ودائی Ûوئی اکھ تھلے رکھی لسٹ Ú† Ø²ÛŒØ§Ø¯Û ØªÙˆÚº Ø²ÛŒØ§Ø¯Û Ù†Ù…Ø¨Ø± دسو۔',
'prefs-watchlist-edits-max' => 'سب تون وڈا نمبر: 1000',
'prefs-watchlist-token' => 'واچلسٹ ٹوکن:',
'prefs-misc' => 'رلیا ملیا',
'prefs-resetpass' => 'کنجی بدلو',
+'prefs-changeemail' => 'ای-میل بدلو',
+'prefs-setemail' => 'ای-میل Ù¾ØªÛ Ø³ÛŒÙ¹ کرو',
'prefs-email' => 'ای-میل چنوتیاں',
'prefs-rendering' => 'وکھالÛ',
'saveprefs' => 'بچاؤ',
@@ -1110,6 +1122,7 @@ $1",
'yourrealname' => 'اصلی ناں:',
'yourlanguage' => 'بولی:',
'yourvariant' => 'ورتی بولی دی اک Ûور ونڈ:',
+'prefs-help-variant' => 'تسیں وکھرے یا اورتوگراÙÛŒ Ú†Ù†ÛŒ اے ایس ÙˆÚ©ÛŒ دیاں لکھتاں نوں دکھان لئی۔',
'yournick' => 'دسخط:',
'prefs-help-signature' => 'Ú¯Ù„ بات صÙÛ’ تے "<nowiki>~~~~</nowiki>" دے نال دسخط Ûونے چائیدے نیں جناں نوں دسخط تے ویلے Ú† دسیا جائیگا۔',
'badsig' => 'ناں منیا جان والا کچا دسخط۔
@@ -1154,6 +1167,7 @@ $1",
'userrights-lookup-user' => 'ورتن ٹولی بچاؤ',
'userrights-user-editname' => 'اک ورتن والا ناں لکھو:',
'editusergroup' => 'ورتن ٹولی چ تبدیلی',
+'editinguser' => "تواڈے ورتن حق بدل رۓ آں '''[[User:$1|$1]]''' $2۔",
'userrights-editusergroup' => 'ورتن ٹولی',
'saveusergroups' => 'ورتن ٹولی بچاؤ',
'userrights-groupsmember' => 'سنگی اے:',
@@ -1247,13 +1261,13 @@ $1",
'right-autopatrol' => 'اپنیاں تبدیلیاں تے اپنے آپ گشت دا نشان لگ جاوے۔',
'right-patrolmarks' => 'ÛÙ† Ûوئیاں تبدیلیاں تے گشت نشان ویکھو',
'right-unwatchedpages' => 'بنا اکھ تھلے رکھیاں صÙیاں دی لسٹ ویکھو',
-'right-trackback' => 'اک ٹریکبیک دسو',
'right-mergehistory' => 'صÙیاں دا رکارڈ رلاؤ',
'right-userrights' => 'تمام ورتن آلیاں دے حق رلکھو',
'right-userrights-interwiki' => 'ورتن والے دے تبدیلی دے حقاں نوں دوجے وکی تے ورتو۔',
'right-siteadmin' => 'ڈیٹابیس نوں کھولو تے بند کرو',
'right-override-export-depth' => '5 تک صÙÛ’ تے جڑے صÙÛ’ Ù„Û’ Ú©Û’ جاؤ',
'right-sendemail' => 'دوجے ورتن والیاں نوں ای-میل کرو',
+'right-passwordreset' => 'کنجی بدلی ای-میلاں نوں وکھاؤ',
# User rights log
'rightslog' => 'ورتن والے دے حقاں دی لاگ',
@@ -1287,16 +1301,17 @@ $1",
'action-suppressionlog' => 'ایس پرائیویٹ لاگ نوں ویکھو',
'action-block' => 'اس ورتن آلے نوں لکھن توں روکو',
'action-protect' => 'اس صÙØ­Û’ دے بچاؤ دا Ø¯Ø±Ø¬Û Ø¨Ø¯Ù„Ùˆ',
+'action-rollback' => 'جلدی نال آخری ورتن والے دیاں تبدیلیاں واپس کرو جینے اک خاص صÙÛ’ تے تبدیلیاں کیتیاں نیں۔',
'action-import' => 'کسے Ûور ÙˆÚ©ÛŒ توں اے صÙÛ Ù„Û’ Ú©Û’ آؤ',
'action-importupload' => 'چڑھائی Ûووئی Ùائل توں صÙÛ’ لیاؤ',
'action-patrol' => 'دوجے دیاں تبدیلیاں تے گشت دا نشاں لاؤ',
'action-autopatrol' => 'کیا تساں تبدیلی دے نشاں تے گشت دا نشان لایا',
'action-unwatchedpages' => 'بنا اکھ تھلے رکھیاں صÙیاں دی لسٹ ویکھو',
-'action-trackback' => 'اک ٹریکبیک دسو',
'action-mergehistory' => 'ایس صÙÛ’ دا رکارڈ رلاؤ',
'action-userrights' => 'ورتن ح‌ق چ تبدیلی کرو',
'action-userrights-interwiki' => 'ورتن حقاں نوں دوجے وکیاں تے تبدیل کرو۔',
'action-siteadmin' => 'ڈیٹابیس نوں کھولو یا بند کرو',
+'action-sendemail' => 'ای-میلاں پیجو',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|change|تبدیلیاں}}',
@@ -1328,6 +1343,7 @@ $1",
'number_of_watching_users_pageview' => '[ $1 ÙˆÛŒÚ©Û Ø±ÛŒØ§ اے{{PLURAL:$1|ورتن والا|والے}}]',
'rc_categories' => 'گٹھاں دی حد (وکھرے کرو "|")',
'rc_categories_any' => 'کوئی',
+'rc-change-size-new' => '$1 {{PLURAL:$1|بائٹ|بائٹاں}} تبدیلی مگروں',
'newsectionsummary' => '/* $1 */ نواں پاسÛ',
'rc-enhanced-expand' => 'لمبی Ú©Ûانی وکھاؤ (جاوا سکرپٹ چائیدا اے)',
'rc-enhanced-hide' => 'لمبی Ú©Ûانی لکاؤ',
@@ -1383,6 +1399,7 @@ $1",
'minlength1' => 'Ùائل ناں کعٹ توں کعٹ اک اکرے تے Ûونا چائیدا اے۔',
'illegalfilename' => 'Ùائل ناں "$1" ÙˆÚ† کیریکٹر نیں جیÛÚ‘Û’ صÙÛ’ دے سرناویں لئی نئیں ورتے جاسکدے۔
Ù…Ûربانی کرکے Ùائل دا Ûور ناں رکھو تے اینون Ùیر چڑھاؤ۔',
+'filename-toolong' => 'Ùائل ناں 240 بائٹ توں لمبا نئیں Ûونا چائیدا۔',
'badfilename' => 'Ùائل ناں "$1" رکھ دتا گیا اے۔',
'filetype-mime-mismatch' => 'Ùائل ایکسٹنشن ".$1" لبی Ûوئی مائم ٹائپ Ùائل ($2) نال میچ نئیں کر رئی۔',
'filetype-badmime' => 'مائم ٹائپ Ùائلز "$1" نوں خڑھان دی اجازت نئیں۔',
@@ -1483,6 +1500,41 @@ $1",
'upload-unknown-size' => 'انجان تاریخ',
'upload-http-error' => 'اک ایچ Ù¹ÛŒ Ù¹ÛŒ Ù¾ÛŒ غلطی Ûوئی:$1',
+# File backend
+'backend-fail-stream' => 'سٹریم Ú† نئیں آسکدی Ùائل $1.',
+'backend-fail-backup' => '$1 Ùائل نوں ٹیک نئیں دتی جاسکدی۔',
+'backend-fail-notexists' => '$1 Ùائل ÛÛ’ ای نئیں۔',
+'backend-fail-hashes' => 'مقابلے لئی Ùائل Ûیشز نئیں Ù„Û“ جاسکے۔',
+'backend-fail-notsame' => '$1 تے اک Ù¾ÛÙ„Û’ ای ناں رلدی Ùائل Ûیگی اے۔',
+'backend-fail-invalidpath' => '$1 اک ٹھیک Ø±Ø§Û Ù†Ø¦ÛŒÚº اے۔',
+'backend-fail-delete' => '$1 Ùائل مٹائی نئیں جاسکدی۔',
+'backend-fail-alreadyexists' => '$1 Ùائل Ù¾ÛÙ„Û’ ای Ûیگی اے۔',
+'backend-fail-store' => '$1 Ùائل $2 تے کاپی نئیں Ûوسکدی۔',
+'backend-fail-copy' => '"$1" توں "$2" تک Ùائل کاپی ناں Ûوسکدی۔',
+'backend-fail-move' => '$1 توں $2 تک Ùائل نئیں پیجی جاسکدی۔',
+'backend-fail-opentemp' => 'Ú©Ú†ÛŒ Ùائل ناں کھولی جاسکی۔',
+'backend-fail-writetemp' => 'Ú©Ú†ÛŒ Ùائل تے ناں بنائی جاسکی۔',
+'backend-fail-closetemp' => 'Ú©Ú†ÛŒ Ùائل ناں بند کیتی جاسکی۔',
+'backend-fail-read' => 'Ùائل "$1" نا Ù¾Ú‘Ú¾ÛŒ جاسکی۔',
+'backend-fail-create' => 'Ùائل "$1" نا بنائی جاسکی۔',
+'backend-fail-readonly' => 'سٹوریج بیکنڈ "$1" ایس ویلے صر٠پڑھیا جاسکدا اے۔ ÙˆØ¬Û Ø¯ØªÛŒ اے: "$2"',
+'backend-fail-synced' => 'Ùائل "$1" اندرلے سٹوریح بیکنڈ Ú† اک Ú©Ú†ÛŒ حالت Ú† اے۔',
+'backend-fail-connect' => 'سٹوریج بیکنڈ "$1" نال جوڑ ناں Ûوسکیا۔',
+'backend-fail-internal' => 'اک نان سمج ج ان والی غلطی سٹوریج بیکنڈ "$1" Ú† Ûوؤی۔',
+'backend-fail-contenttype' => '"$1" تے Ùائل نوں سٹور کرن لئی Ùائل دے اندر Ú©ÛŒ اے نئیں Ù¾ØªÛ Ù„Ú¯ سکیا۔',
+'backend-fail-batchsize' => 'سٹوریج بیکنڈ نوں $1 Ùائل دا بیچ {{PLURAL:$1|اوپریشن|اوپریشن}} دتا گیا؛ ایدی حد $2 {{PLURAL:$2|اوپریشن|اوپریشن}} جے۔',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" ناں کھولیا جاسکیا؛ اینوں تالا نئیں سی لگیا۔',
+'lockmanager-fail-closelock' => '"$1" لئی ØªØ§Ù„Û Ù„Ú¯ÛŒ Ùاغل نوں بند نئیں کیتا جاسکدا۔',
+'lockmanager-fail-deletelock' => '"$1" لئی ØªØ§Ù„Û Ù„Ú¯ÛŒ Ùائل نوں مٹایا نئیں جاسکدا۔',
+'lockmanager-fail-acquirelock' => '"$1" لئی ØªØ§Ù„Û Ù†Ø¦ÛŒÚº لیا جاسکیا۔',
+'lockmanager-fail-openlock' => '"$1" لئی ØªØ§Ù„Û Ù„Ú¯ÛŒ Ùاغل نئین کھولی جاسکی۔',
+'lockmanager-fail-releaselock' => '"$1" لئی ØªØ§Ù„Û Ù†Ø§Úº جاری Ûوسکیا۔',
+'lockmanager-fail-db-bucket' => ' چائیدی ڈیٹابیس ناں لب سکی بالثی لئی $1',
+'lockmanager-fail-db-release' => 'ڈیٹا بیس $1 دے تالے ناں مل سکے۔',
+'lockmanager-fail-svr-release' => 'سرور $1 لئی تالے ناں لبے جاسکے۔',
+
# ZipDirectoryReader
'zip-file-open-error' => 'اک غلطی لبی زپ چیک لئی Ùائل کھولدیاں',
'zip-wrong-format' => 'دسی گئی Ùائل زپ Ùائل نئین سی۔',
@@ -1500,6 +1552,7 @@ $1",
'uploadstash-badtoken' => 'اے Ú©Ù… نئیں Ûوسکیا، خورے تواڈے تبدیلی دے حق Ù…Ú© Ú¯Û“ نیں۔ Ùیر کوشش کرو۔',
'uploadstash-errclear' => 'Ùائلاں نئیں مکایاں جاسکیاں۔',
'uploadstash-refresh' => 'Ùائلاں دی لسٹ تازی کرو۔',
+'invalid-chunk-offset' => 'ناں چلن والا Ú†Ù†Ú© اÙسیٹ',
# img_auth script messages
'img-auth-accessdenied' => 'اپڑنن روک',
@@ -1608,23 +1661,24 @@ $1",
'filerevert-badversion' => 'ایس Ùائل دا Ù¾Ûلا کوئی ورین نئیں ویلے ناں۔',
# File deletion
-'filedelete' => '$1 مٹاؤ',
-'filedelete-legend' => 'Ùائل مٹاؤ',
-'filedelete-intro' => "تسی '''[[Media:$1|$1]]''' مٹا رۓ او۔",
-'filedelete-intro-old' => "تسیں '''[[Media:$1|$1]]''' دا ورین مٹا رۓ او [$4 $3, $2] توں۔",
-'filedelete-comment' => 'وجÛ:',
-'filedelete-submit' => 'مٹاؤ',
-'filedelete-success' => "'''$1''' مٹایا جا چکیا اے۔",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' دا ورین ، $3، $2 مٹادتا گیا اے۔",
-'filedelete-nofile' => "'''$1''' نئیں اے۔",
-'filedelete-nofile-old' => "'''$1''' دا کوئی آرکائیوڈ ورین نئیں خاص اٹریبیوٹس نال۔",
-'filedelete-otherreason' => ':دوجی وجÛ',
-'filedelete-reason-otherlist' => 'Ûور وجÛ',
-'filedelete-reason-dropdown' => '*مٹان دیاں عام وجÛاں
+'filedelete' => '$1 مٹاؤ',
+'filedelete-legend' => 'Ùائل مٹاؤ',
+'filedelete-intro' => "تسی '''[[Media:$1|$1]]''' مٹا رۓ او۔",
+'filedelete-intro-old' => "تسیں '''[[Media:$1|$1]]''' دا ورین مٹا رۓ او [$4 $3, $2] توں۔",
+'filedelete-comment' => 'وجÛ:',
+'filedelete-submit' => 'مٹاؤ',
+'filedelete-success' => "'''$1''' مٹایا جا چکیا اے۔",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' دا ورین ، $3، $2 مٹادتا گیا اے۔",
+'filedelete-nofile' => "'''$1''' نئیں اے۔",
+'filedelete-nofile-old' => "'''$1''' دا کوئی آرکائیوڈ ورین نئیں خاص اٹریبیوٹس نال۔",
+'filedelete-otherreason' => ':دوجی وجÛ',
+'filedelete-reason-otherlist' => 'Ûور وجÛ',
+'filedelete-reason-dropdown' => '*مٹان دیاں عام وجÛاں
** کاپی حق نوں چھیڑنا
**دوÛری Ùائل',
-'filedelete-edit-reasonlist' => 'مٹانے دی ÙˆØ¬Û Ù„Ú©Ú¾Ùˆ',
-'filedelete-maintenance' => 'Ùائلاں دا مٹانا تے واپس کرنا مرمرت باجوں کج چر لئی روک دتا گیا اے۔',
+'filedelete-edit-reasonlist' => 'مٹانے دی ÙˆØ¬Û Ù„Ú©Ú¾Ùˆ',
+'filedelete-maintenance' => 'Ùائلاں دا مٹانا تے واپس کرنا مرمرت باجوں کج چر لئی روک دتا گیا اے۔',
+'filedelete-maintenance-title' => 'Ùائل نئیں مٹا سکدے',
# MIME search
'mimesearch' => 'MIME کھوج',
@@ -1723,6 +1777,8 @@ $1",
'wantedpages' => 'چائیدے صÙØ­Û’',
'wantedpages-badtitle' => 'ناں منیا جان والا سرناواں رزلٹ سیٹ چ:$1',
'wantedfiles' => 'چائیدے صÙØ­Û’',
+'wantedfiletext-cat' => 'تھلے دتیاں Ùائلاں ورتیاں جاندیاں نیں پر ÛÛ’ نئیں۔ باروں لیاں گیا Ùائلاں نوں لکھیا جاسکدا اے پانویں Ø§ÙˆÛ Ûوون۔ کوئی ÙˆÛŒ اینج دے چعوٹھے پوزیٹوز <del>struck out</del> Û” ایدے توں Ø¹Ù„Ø§ÙˆÛ ØµÙÛ’ جنان ج Ùائلاں جڑیاں نیں جیÛڑیاں ÛÛ’ نیں اونان نوں [[:$1]] رکھیا گیا اے۔',
+'wantedfiletext-nocat' => 'تھلے دتیاں گیاں Ùائلاں ورتیاں جاندیاں نین پر Ø§ÙˆÛ ÛÛ’ نئیں۔ بارون لیاں گیاں Ùائلاں ÛÙˆÚº دے باوجود اوناں دی لسٹ بنائی جاسکدی اے۔ کوئی ÙˆÛŒ ایسی چعوٹی پازیٹوز نوں <del>struck out</del>Û”',
'wantedtemplates' => 'چائیدے سانچے',
'mostlinked' => 'سب توں بوتے جوڑاں والے صÙÛ’',
'mostlinkedcategories' => 'سب توں بوتیاں جڑیاں کیٹاگریاں',
@@ -1731,6 +1787,7 @@ $1",
'mostimages' => 'سب توں Ø²ÛŒØ§Ø¯Û ØªØ¹Ù„Ù‚ آلیاں Ùائلاں',
'mostrevisions' => 'سب توں بوتے تبدیلیاں آلے صÙÛ’',
'prefixindex' => 'Ø³Ø§Ø¨Ù‚Û Ø§Ù†ÚˆÛŒÚ©Ø³',
+'prefixindex-namespace' => 'سارے صÙÛ’ اگیتر ($1 ناں تھاں)',
'shortpages' => 'چھوٹے صÙÛ’',
'longpages' => 'لمبے صÙÛ’',
'deadendpages' => 'انے صÙÛ’',
@@ -1747,7 +1804,7 @@ $1",
'listusers-editsonly' => 'تبدیلیاں کرن والے ورتن والے ای دسو۔',
'listusers-creationsort' => 'بنان تریخ توں وکھریاں کرو۔',
'usereditcount' => '$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}',
-'usercreated' => '$1 نوں $1 وجے بنایا گیا۔',
+'usercreated' => '{{جنس:$3|بنائی گئی}} نوں $1 تے $2',
'newpages' => 'نویں صÙÛ’',
'newpages-username' => 'ورتن آلا ناں:',
'ancientpages' => 'سب توں پرانے صÙÛ’',
@@ -1841,12 +1898,8 @@ $1",
'activeusers-noresult' => 'کوئی ورتن والا نئیں لبیا۔',
# Special:Log/newusers
-'newuserlogpage' => 'ورتاوا بنان آلی لاگ',
-'newuserlogpagetext' => 'اے ورتن والا بنان دی لاگ اے۔',
-'newuserlog-byemail' => 'کنجی ای-میل Ø±Ø§Û Ù¾ÛŒØ¬ دتی گئی۔',
-'newuserlog-create-entry' => 'نوا ورتن آلا',
-'newuserlog-create2-entry' => '$1 نواں اکاؤنٹ بنایا گیا۔',
-'newuserlog-autocreate-entry' => 'Ú©Ú¾Ø§ØªÛ Ø§Ù¾Ù†Û’ آپ کھولیا گیا۔',
+'newuserlogpage' => 'ورتاوا بنان آلی لاگ',
+'newuserlogpagetext' => 'اے ورتن والا بنان دی لاگ اے۔',
# Special:ListGroupRights
'listgrouprights' => 'ورتن ٹرلی حق',
@@ -1876,6 +1929,7 @@ $1",
'emailpagetext' => 'تسیں تھلے دتا گیا Ùارم ورت سکدے Ø§ÙˆÛ Ø§ÛŒØ³ ورتن والے نوں ای-میل Ø³Ù†ÛŒØ¹Û Ú©Ù„Ù† لئی۔
ای-میل Ù¾ØªÛ ØªØ³Ø§Úº [[Special:Preferences|تواڈے ورتن تانکآں]] Ú† پایا اے ای-میل توں تواڈا Ù¾ØªÛ Ø¯Ø³Û’ گا جتھے Ú†Ù¹Ú¾ÛŒ Ú†Ù„ÛŒ تاں جے Ú†Ù¹Ú¾ÛŒ لین والا توانوں سدا جواب دے سکے۔',
'usermailererror' => 'میل واپسی غلطی:',
+'defemailsubject' => '{{SITENAME}}ای-میل ورتن والے "$1" توں',
'usermaildisabled' => 'ورتن ای-میل ناکارÛ',
'usermaildisabledtext' => 'ایس وکی تے تسیں دوجے ورتن والیاں نوں ای-میل نئیں پیج سکدے۔',
'noemailtitle' => 'کوئی ای-میل Ù¾ØªÛ Ù†Ø¦ÛŒÚºÛ”',
@@ -1929,7 +1983,7 @@ $1",
'watchmethod-list' => 'ویکھے Ú©Û’ صÙÛ’ نیڑے Ûون والیاں تبدیلیاں دی پڑتال',
'watchlistcontains' => 'تھواڈی اکھ تھلے رکھی لسٹ Ú† $1 {{PLURAL:$1|صÙÛ|صÙÛ’}} نیں۔',
'iteminvalidname' => "'$1' نال رپھڑ، ناں غلط",
-'wlnote' => "تھلے {{انیک:$1|آخری تبدیلی|آخری تبدیلیاں '''$1''' }} آخر تے {{انیک:$2|کینٹÛ|'''$2''' کینٹے}}.",
+'wlnote' => "تھلے {{PLURAL:\$1|آخری تبدیلی|آخری تبدیلیاں '''1\$''' }} آخر تے {{PLURAL:\$2|کینٹÛ|'''2\$''' کینٹے}} 3\$ØŒ 4\$.",
'wlshowlast' => 'آخری $1 گھنٹے $2 دن $3 وکھاؤ',
'watchlist-options' => 'نظر تھلے رکھن دیاں راÛواں',
@@ -1997,8 +2051,6 @@ $UNWATCHURL
'actionfailed' => 'Ú©Ù… ناں Ûویا',
'deletedtext' => '"$1" مٹایا جا چکیا اے۔<br />
نیڑے نیڑے مٹاۓ گۓ ریکارڈ نوں دیکن آسطے $2 ایتھے چلو۔',
-'deletedarticle' => '"[[$1]]" مٹا دتا گیا',
-'suppressedarticle' => '"[[$1]]" روک دتا۔',
'dellogpage' => 'مٹان آلی لاگ',
'dellogpagetext' => 'تھلے نویاں مٹائے Ú¯Û“ صÙحیاں دی لسٹ اے۔',
'deletionlog' => 'مٹان آلی لاگ',
@@ -2049,7 +2101,10 @@ $2 نے آخری ریوین تک واپس کیتا۔',
'unprotectedarticle' => '"[[$1]]" توں بچاؤ Ûٹا لیا گیا۔',
'movedarticleprotection' => 'بچاؤ سیٹنگ "[[$2]]" توں "[[$1]]" ول پلٹی۔',
'protect-title' => '"$1" لئی بچاؤ پدھر تبدیل۔',
+'protect-title-notallowed' => '"$1" دی بچاؤ پدھر ویکھو',
'prot_1movedto2' => '[[$1]] ول بدلی [[$2]]',
+'protect-badnamespace-title' => 'نان بچائی گئی ناں تھاں',
+'protect-badnamespace-text' => 'ایس ناں تھاں تے صÙÛ’ نئیں بچاۓ جاسکدے',
'protect-legend' => 'بچاؤ پکا کرو',
'protectcomment' => 'وجÛ:',
'protectexpiry' => 'انت Ûوندا اے:',
@@ -2072,6 +2127,7 @@ $2 نے آخری ریوین تک واپس کیتا۔',
'protect-level-sysop' => 'صر٠سائسوپس',
'protect-summary-cascade' => 'کسکیڈنگ',
'protect-expiring' => 'ختم Ûوندا اے $1 (UTC)',
+'protect-expiring-local' => 'انت $1',
'protect-expiry-indefinite' => 'بے انت',
'protect-cascade' => 'اس صÙØ­Û’ ÙˆÚ† شامل صÙحیاں نوں بچاؤ (کسکیڈنگ ح‌Ùاظت)Û”',
'protect-cantedit' => 'تسی اس صÙØ­Û’ دے Ø­Ùاظتی درجے نوں Ù†Ûیں بدل سکدے Ú©ÛŒÙˆÙ†Ú©Û ØªÙˆØ§Ù†ÙˆÚº اس Ú©Ù… دی اجازت Ù†Ûیں اے۔',
@@ -2132,7 +2188,6 @@ $2 نے آخری ریوین تک واپس کیتا۔',
'undeletereset' => 'Ù¾ÛÙ„ÛŒ حالت تے Ù„Û’ آؤ',
'undeleteinvert' => 'وچوں چناؤ',
'undeletecomment' => 'وجÛ',
-'undeletedarticle' => '"[[$1]]" بحال کر دتا گیا اے',
'undeletedrevisions' => '{{PLURAL:$1|1 ریوین|$1 ریویناں}} واپس',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ریوین|$1 ریویناں}} تے {{PLURAL:$2|1 Ùائل|$2 Ùائلاں}} واپس',
'undeletedfiles' => '{{PLURAL:$1|1 Ùائل|$1 Ùائلاں}} واپس',
@@ -2142,6 +2197,7 @@ $2 نے آخری ریوین تک واپس کیتا۔',
[[Special:Log/delete|مٹان لاگ]] نوں ویکھو نیڑے دے مٹان تے واپسی دے رکارڈ لئی۔.",
'undelete-header' => '[[خاص:لاگ/مٹاؤ|مٹان لاگ]] نوں ویکھو نیڑے دے مٹاۓ گۓ دے رکارڈ لئی۔.',
+'undelete-search-title' => 'مٹاۓ ÛÙˆÛ“ صÙØ­Û’ کھوجو',
'undelete-search-box' => 'مٹاۓ Ú¯Û“ صÙØ­Û’ کھوجو',
'undelete-search-prefix' => 'صÙÛ’ وکھاؤ جیÛÚ‘Û’ شروع Ûون:',
'undelete-search-submit' => 'کھوجو',
@@ -2151,6 +2207,7 @@ $2 نے آخری ریوین تک واپس کیتا۔',
'undelete-cleanup-error' => 'ناں ورتی گئی آرکائیو Ùائل "$1" دے مٹانے Ú† غلطی۔',
'undelete-missing-filearchive' => 'Ùائل آرکائیو آئی ÚˆÛŒ $1 نوں واپس کرن Ú† ناکامی کیوں جے اے ڈیٹابیس نئیں اے۔
خورے اے Ù¾ÛÙ„Û’ ای مٹ Ú†Ú©ÛŒ Ûووے۔',
+'undelete-error' => 'مٹاۓ صÙÛ’ واپس لیان Ú† غلطی',
'undelete-error-short' => 'Ùاغل واپس کرن Ú† غلطی: $1',
'undelete-error-long' => 'Ùائل واپس کرن لگیاں غلطیاں Ûوئیاں:
$1',
@@ -2270,6 +2327,7 @@ $1',
'blocklist-userblocks' => 'روکے کۓ کھاتے لکاؤ',
'blocklist-tempblocks' => 'تھوڑے چر لئی روکے گۓ لکاؤ',
'blocklist-addressblocks' => 'کلے آئی پی بلاکس لکاؤ',
+'blocklist-rangeblocks' => 'رینج روکے گۓ لکاؤ',
'blocklist-timestamp' => 'ویلے دی Ù…Ûر',
'blocklist-target' => 'تارگٹ',
'blocklist-expiry' => 'انت Ûوندا اے:',
@@ -2292,6 +2350,7 @@ $1',
'unblocklink' => 'روک ختم',
'change-blocklink' => 'روک نوں بدلو',
'contribslink' => 'حصے داری',
+'emaillink' => 'ای-میل پیجو',
'autoblocker' => 'اپنے آپ روکیا گیا کیوں جے تواڈا آئی Ù¾ÛŒ Ù¾ØªÛ "[[User:$1|$11]]" Ù†Û’ ورتی ا۔ $1 دی روک دی ÙˆØ¬Û :"$2"',
'blocklogpage' => 'لاگ روکو',
'blocklog-showlog' => 'ایس ورتن والے نوں Ù¾ÛÙ„Û’ روکیا گیا سی۔
@@ -2414,9 +2473,6 @@ $1',
'movepage-page-moved' => 'صÙÛ $1 نوں $2 ول لجایا گیا اے۔',
'movepage-page-unmoved' => 'صÙÛ $1 ØŒ $2 ول نئیں لجایا جاسکدا۔',
'movepage-max-pages' => '$1 دے Ø²ÛŒØ§Ø¯Û ØªÙˆÚº Ø²ÛŒØ§Ø¯Û {{PLURAL:$1|صÙÛ|صÙÛ’}} تھاں بدلاۓ Ú¯Û“ نیں تے کوئی Ûور اپنے آپ نئیں بدلیا جائیگا۔',
-'1movedto2' => '[[$1]] نوں لیجایا گیا [[$2]] تک',
-'1movedto2_redir' => '[[$1]] نوں [[$2]] ریڈائریکٹ کر دتا گیا اے',
-'move-redirect-suppressed' => 'ریڈائرکٹ روک لیا گیا۔',
'movelogpage' => 'ناں تبدیل کرن دا لاگ',
'movelogpagetext' => 'تھلے سارے صÙÛ’ دے پلٹن دی لسٹ دتی گئی اے۔',
'movesubpage' => '{{PLURAL:$1|نکا صÙÛ|نکےصÙÛ’}}',
@@ -2429,6 +2485,7 @@ $1',
پونچن والا صÙÛ "[[:$1]]" Ù¾ÛÙ„Û’ ای موجود.
کیا تسیں اینون مٹادینا چاندے او تھاں بدلن دی گل بنان لئی؟',
'delete_and_move_confirm' => 'Ø¢Ûو، صÙØ­Û Ù…Ù¹Ø§ دیو',
+'delete_and_move_reason' => 'مٹایا گیا ایتھوں "[[$1]]" ٹورن لئی۔',
'selfmove' => 'سورس تے منزل سرناویں اک ای نیں۔
اپنے آپ ول صÙÛ Ù†Ø¦ÛŒÚº لجایا جاسکدا۔',
'immobile-source-namespace' => '"$1" ناں تھاں ول صÙÛ’ نئیں موڈے جاسکدے۔',
@@ -2458,8 +2515,10 @@ $1',
صÙÛ’ بار لجان لئی، تھلے دتے Ú¯Û“ لکھت ڈبے Ú† سرناواں لکھو، اک سرناواں اک لائن Ú† اور چنوں کیا جے تسیں ÛÙ† دی ریوین چاندے پرانیاں دے ناۂ نال، رکارڈ صÙÛ Ù„ÛŒÙ† چ، یا ÛÙ† دی ریوین آخری تبدیلی دی جانکاری نال۔
دوجے کیس Ú† تسیں جوڑ ÙˆÛŒ ورت سکدے او، ادھارن لئی [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] صÙÛ "[[{{MediaWiki:Mainpage}}]]" لئی۔',
+'exportall' => 'سارے صÙÛ’ لجاؤ',
'exportcuronly' => 'صر٠ÛÙ† والیاں ریوین نال نئں۔ پورا ریکارڈ نیں۔',
'exportnohistory' => "'''نوٹ:''' صÙیاں دا پورا ریکارڈ ایس Ùارم نال لیجانا Ú©Ù… دیاں وجÛاں باجوں روک دتا گیا اے۔",
+'exportlistauthors' => 'Ûر صÙÛ’ تے Ú©Ù… کرن والیاں دی پوری لسٹ Ù„Ú©Ú¾Ùˆ',
'export-submit' => 'برامد کرو',
'export-addcattext' => 'اس ٹولی توں صÙØ­Û’ شامل کرو:',
'export-addcat' => 'شامل کرو',
@@ -2493,6 +2552,8 @@ $1',
'thumbnail_error' => '$1 دی Ù†Ú©ÛŒ مورت بناندیاں مسئلÛ',
'djvu_page_error' => 'DjVu صÙÛ Ø±ÛŒÙ†Ø¬ توں بار',
'djvu_no_xml' => 'DjVu Ùائل لئی XML ناں لیایا جاسکیا',
+'thumbnail-temp-create' => 'عارضی تھمبنیل Ùائل نئیں بن سکدی۔',
+'thumbnail-dest-create' => 'تھمبنیل نوں اپنی تھاں تے بچایا نئیں جاسکدا۔',
'thumbnail_invalid_params' => 'تھمبنیل دے پیرامیٹر ناں منن جوگے',
'thumbnail_dest_directory' => 'ڈیسٹینیشن ڈآئریکٹری بنان چ نکامی',
'thumbnail_image-type' => 'مورت ٹائپ بے سÛارا',
@@ -2540,6 +2601,11 @@ $1',
'import-token-mismatch' => 'سیشن ڈیٹا دا کعاٹا۔
Ù…Ûربانی کرکے Ùیر کوشش کرو۔',
'import-invalid-interwiki' => 'ایے خاص وکی توں نئیں لیا سکدا۔',
+'import-error-edit' => 'صÙÛ "$1" نئیں لیایا گیا کیوں جے تھوانوں اینوں ایڈٹ کرن دی اجازت نئیں۔',
+'import-error-create' => 'صÙÛ "$1" نئیں لیایا گیا کیوں جے تھانوں ایدی اجازت نئیں۔',
+'import-error-interwiki' => 'صÙÛ "$1" نئیں لیایا گیا کیوں جے ایدا ناں بچایا گیا اے بارلے جوڑاں لئی (interwiki)Û”',
+'import-error-special' => '"$1" صÙÛ Ù†Ø¦ÛŒÚº لیایا گیا کیوں جے Ø§ÛŒÛ Ø§Ú© خاص ناں تھان توں نال جڑدا اے جیءرا صÙیاں لئی نئیں۔',
+'import-error-invalid' => '"$1" صÙÛ Ù†Ø¦ÛŒÚº لیایا گیا ایدا ناں نئیں رکھیا جاسکدا۔',
# Import log
'importlogpage' => 'لاگ لے کے آؤ',
@@ -2549,75 +2615,88 @@ $1',
'import-logentry-interwiki' => 'ٹرانسوکیڈ $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ریوین|ریویناں }} $2 توں',
+# JavaScriptTest
+'javascripttest' => 'JavaScript ٹیسٹنگ',
+'javascripttest-disabled' => 'Ø§ÛŒÛ Ú©Ù… Ù†Ú©Ø§Ø±Û Ú©Ø±Ø¯ØªØ§ گیا اے۔',
+'javascripttest-title' => 'ٹیسٹ $1 چلدا اے۔',
+'javascripttest-pagetext-noframework' => 'Ø§ÛŒÛ ØµÙÛ JavaScript ٹیسٹاں لئی بچایا گیا اے۔',
+'javascripttest-pagetext-unknownframework' => '"$1" انجانا ٹیسٹنگ Ùریمورک۔',
+'javascripttest-pagetext-frameworks' => 'Ù…Ûربانی کرکے تھلے دتے Ú¯Û“ ٹیسٹ Ùریمورکاں Ú†ÙˆÚº اک چنو : $1',
+'javascripttest-pagetext-skins' => 'اپنی پسند دا کوئی Ù†Ù…ÙˆÙ†Û Ú†Ù†Ùˆ جیدے تے ٹیسٹ چلن:',
+'javascripttest-qunit-intro' => 'mediawiki.org تے [$1 ٹسٹنگ ڈوکومنٹیشن] ویکھو۔',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'میرا صÙØ­Û',
-'tooltip-pt-anonuserpage' => 'ورتن صÙÛ IP پتے لئی تسی تبدیل کر رۓ او۔۔۔',
-'tooltip-pt-mytalk' => 'میریاں گلاں',
-'tooltip-pt-anontalk' => 'ایس IP پتے دیاں تبدیلیاں تے گل بات',
-'tooltip-pt-preferences' => 'میریاں تانگاں',
-'tooltip-pt-watchlist' => 'او صÙØ­Û’ جنÛاں ÙˆÚ† تبدیلیاں تسی ویکھ رÛÛ’ او',
-'tooltip-pt-mycontris' => 'میرے کم',
-'tooltip-pt-login' => 'جی صدقے اندر آؤ، پر اے لازمی Ù†Ûیں۔',
-'tooltip-pt-anonlogin' => 'اے بÛتر اے Ú©Û Ù„Ø§Ú¯ ان ÛÙˆ جاؤ، لیکن Ùیر ÙˆÛŒ اے لازمی نئیں۔',
-'tooltip-pt-logout' => 'باÛر آؤ',
-'tooltip-ca-talk' => 'اس صÙØ­Û’ دے بار ÙˆÚ† Ú¯Ù„ بات',
-'tooltip-ca-edit' => 'تسیں اس صÙÛ’ تے Ù„Ú©Ú¾ سکدے او۔
+'tooltip-pt-userpage' => 'میرا صÙØ­Û',
+'tooltip-pt-anonuserpage' => 'ورتن صÙÛ IP پتے لئی تسی تبدیل کر رۓ او۔۔۔',
+'tooltip-pt-mytalk' => 'میریاں گلاں',
+'tooltip-pt-anontalk' => 'ایس IP پتے دیاں تبدیلیاں تے گل بات',
+'tooltip-pt-preferences' => 'میریاں تانگاں',
+'tooltip-pt-watchlist' => 'او صÙØ­Û’ جنÛاں ÙˆÚ† تبدیلیاں تسی ویکھ رÛÛ’ او',
+'tooltip-pt-mycontris' => 'میرے کم',
+'tooltip-pt-login' => 'جی صدقے اندر آؤ، پر اے لازمی Ù†Ûیں۔',
+'tooltip-pt-anonlogin' => 'اے بÛتر اے Ú©Û Ù„Ø§Ú¯ ان ÛÙˆ جاؤ، لیکن Ùیر ÙˆÛŒ اے لازمی نئیں۔',
+'tooltip-pt-logout' => 'باÛر آؤ',
+'tooltip-ca-talk' => 'اس صÙØ­Û’ دے بار ÙˆÚ† Ú¯Ù„ بات',
+'tooltip-ca-edit' => 'تسیں اس صÙÛ’ تے Ù„Ú©Ú¾ سکدے او۔
محÙوظ کرن توں Ù¾Ûلاں Ú©Ú†Û’ Ú©Ù… نوں ویکھ لو۔',
-'tooltip-ca-addsection' => 'اس Ú¯Ù„ بات ÙˆÚ† Ø­ØµÛ Ù„Û’ لو۔',
-'tooltip-ca-viewsource' => 'اے صÙØ­Û Ø¨Ú†Ø§ÛŒØ§ گیا اے۔
+'tooltip-ca-addsection' => 'اس Ú¯Ù„ بات ÙˆÚ† Ø­ØµÛ Ù„Û’ لو۔',
+'tooltip-ca-viewsource' => 'اے صÙØ­Û Ø¨Ú†Ø§ÛŒØ§ گیا اے۔
تسی اینو صر٠ویکھ سکدے او۔',
-'tooltip-ca-history' => 'اس صÙØ­Û’ دا Ù¾Ø±Ø§Ù†Û ÙˆØ±Ú˜Ù†Û”',
-'tooltip-ca-protect' => 'اس صÙÛ’ نوں بچاؤ',
-'tooltip-ca-unprotect' => 'ایس صÙÛ’ دا بچاؤ بدلو۔',
-'tooltip-ca-delete' => 'اس صÙÛ’ نوں مٹاؤ',
-'tooltip-ca-undelete' => 'ایس صÙÛ’ دیاں تبدیلیاں نوں واپس لیاؤ ایس توں Ù¾ÛÙ„Û’ Ú©Û’ اے مٹ جاۓ۔',
-'tooltip-ca-move' => 'اس صÙØ­Û’ نوں Ù„Û’ چلو',
-'tooltip-ca-watch' => 'اس صÙØ­Û ØªÛ’ نظر رکھو',
-'tooltip-ca-unwatch' => 'اس صÙØ­Û’ توں نظر Ûٹاؤ',
-'tooltip-search' => 'کھوج {{SITENAME}}',
-'tooltip-search-go' => 'اس ناں دے صÙØ­Û’ تے چلو، اگر اے ÛÛ’ گا اے',
-'tooltip-search-fulltext' => 'اس Ù„Ùظ نوں صÙحیاں Ú† لبو',
-'tooltip-p-logo' => 'Ù¾Ûلا صÙÛ',
-'tooltip-n-mainpage' => 'Ù¾ÛÙ„Û’ صÙØ­Û’ دی سیر',
-'tooltip-n-mainpage-description' => 'Ù¾ÛÙ„Û’ ورقے تے جاؤ',
-'tooltip-n-portal' => 'منصوبے دے بارے وچ، توسی کی کر سکدے او تے کنج کھوج سکدے او',
-'tooltip-n-currentevents' => 'Ù…ÙˆØ¬ÙˆØ¯Û Ø­Ø§Ù„Ø§Øª تے پچھلیاں معلومات دیکھو',
-'tooltip-n-recentchanges' => 'وکی تے نویاں تبدیلیاں۔',
-'tooltip-n-randompage' => 'بیترتیب صÙÛ’ کھولو۔',
-'tooltip-n-help' => 'مدد لینے آلی جگÛÛ”',
-'tooltip-t-whatlinkshere' => 'اس نال جڑے سارے ÙˆÚ©ÛŒ صÙØ­Û’Û”',
-'tooltip-t-recentchangeslinked' => 'اس صÙØ­Û’ توں جڑے صÙحیاں Ú† نویاں تبدیلیاں',
-'tooltip-feed-rss' => 'RSS feed for this page',
-'tooltip-feed-atom' => 'Atom feed for this page',
-'tooltip-t-contributions' => 'اس ورتن والے دے کم ویکھو',
-'tooltip-t-emailuser' => 'اس ورتن والے نو ای میل کرو',
-'tooltip-t-upload' => 'Ùائل چڑھاؤ',
-'tooltip-t-specialpages' => 'سارے خاص صÙØ­Û’',
-'tooltip-t-print' => 'اس صÙÛ’ دا چھپنے آلا ورژن ویکھو',
-'tooltip-t-permalink' => 'اس صÙØ­Û’ دے اس ورژن نال پرماننٹ لنک',
-'tooltip-ca-nstab-main' => 'مواد آلا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-user' => 'ورتن آلے دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-media' => 'میڈیا آلا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-special' => 'اے اک خاص صÙØ­Û Ø§Û’ØŒ تےی اے صÙØ­Û Ø¢Ù¾Û’ نئیں Ù„Ú©Ú¾ سکدے',
-'tooltip-ca-nstab-project' => 'منصوبے دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-image' => 'Ùائل دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-mediawiki' => 'پربندھ Ø³Ù†ÛŒØ¹Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-template' => 'Ø³Ø§Ù†Ú†Û ØªÚ©Ùˆ',
-'tooltip-ca-nstab-help' => 'مدد دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-ca-nstab-category' => 'کیٹاگری آلا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
-'tooltip-minoredit' => 'انیو نکے کم چ گنو',
-'tooltip-save' => 'اپنا کم بچالو',
-'tooltip-preview' => 'کچا Ú©Ù… ویکھو، اس بٹن نوں بچان توں Ù¾Ûلاں استعمال کرو!Û”',
-'tooltip-diff' => 'اس عبارت وچ کیتیاں تبدیلیاں وکھاؤ۔',
-'tooltip-compareselectedversions' => 'Ú†Ù†Û’ ÛÙˆÛ“ صÙحیاں ÙˆÚ† Ùرق ویکھو۔',
-'tooltip-watch' => 'اس صÙÛ’ تے نظر رکھو',
-'tooltip-recreate' => 'Ø§ÛŒÛ ØµÙÛ Ø¯ÙˆØ¨Ø§Ø±Û Ø¨Ù†Ø§Ø¤ پاویں اے مٹادتا گیا Ûووے۔',
-'tooltip-upload' => 'Ùائل چڑھانا شروع کرو',
-'tooltip-rollback' => '"رول بیک" اک Ú©Ù„Ú© Ú† صÙØ­Û’ نوں Ù¾Ú†Ú¾Ù„ÛŒ حالت Ú† Ù„Û’ Ú†Ù„Û’ گا',
-'tooltip-undo' => '"واپس" تے Ú©Ù„Ú© کرن نال توانوں صÙØ­Û Ú©Ú†Ø§ وکھایا جاۓ گا۔
+'tooltip-ca-history' => 'اس صÙØ­Û’ دا Ù¾Ø±Ø§Ù†Û ÙˆØ±Ú˜Ù†Û”',
+'tooltip-ca-protect' => 'اس صÙÛ’ نوں بچاؤ',
+'tooltip-ca-unprotect' => 'ایس صÙÛ’ دا بچاؤ بدلو۔',
+'tooltip-ca-delete' => 'اس صÙÛ’ نوں مٹاؤ',
+'tooltip-ca-undelete' => 'ایس صÙÛ’ دیاں تبدیلیاں نوں واپس لیاؤ ایس توں Ù¾ÛÙ„Û’ Ú©Û’ اے مٹ جاۓ۔',
+'tooltip-ca-move' => 'اس صÙØ­Û’ نوں Ù„Û’ چلو',
+'tooltip-ca-watch' => 'اس صÙØ­Û ØªÛ’ نظر رکھو',
+'tooltip-ca-unwatch' => 'اس صÙØ­Û’ توں نظر Ûٹاؤ',
+'tooltip-search' => 'کھوج {{SITENAME}}',
+'tooltip-search-go' => 'اس ناں دے صÙØ­Û’ تے چلو، اگر اے ÛÛ’ گا اے',
+'tooltip-search-fulltext' => 'اس Ù„Ùظ نوں صÙحیاں Ú† لبو',
+'tooltip-p-logo' => 'Ù¾Ûلا صÙÛ',
+'tooltip-n-mainpage' => 'Ù¾ÛÙ„Û’ صÙØ­Û’ دی سیر',
+'tooltip-n-mainpage-description' => 'Ù¾ÛÙ„Û’ ورقے تے جاؤ',
+'tooltip-n-portal' => 'منصوبے دے بارے وچ، توسی کی کر سکدے او تے کنج کھوج سکدے او',
+'tooltip-n-currentevents' => 'Ù…ÙˆØ¬ÙˆØ¯Û Ø­Ø§Ù„Ø§Øª تے پچھلیاں معلومات دیکھو',
+'tooltip-n-recentchanges' => 'وکی تے نویاں تبدیلیاں۔',
+'tooltip-n-randompage' => 'بیترتیب صÙÛ’ کھولو۔',
+'tooltip-n-help' => 'مدد لینے آلی جگÛÛ”',
+'tooltip-t-whatlinkshere' => 'اس نال جڑے سارے ÙˆÚ©ÛŒ صÙØ­Û’Û”',
+'tooltip-t-recentchangeslinked' => 'اس صÙØ­Û’ توں جڑے صÙحیاں Ú† نویاں تبدیلیاں',
+'tooltip-feed-rss' => 'RSS feed for this page',
+'tooltip-feed-atom' => 'Atom feed for this page',
+'tooltip-t-contributions' => 'اس ورتن والے دے کم ویکھو',
+'tooltip-t-emailuser' => 'اس ورتن والے نو ای میل کرو',
+'tooltip-t-upload' => 'Ùائل چڑھاؤ',
+'tooltip-t-specialpages' => 'سارے خاص صÙØ­Û’',
+'tooltip-t-print' => 'اس صÙÛ’ دا چھپنے آلا ورژن ویکھو',
+'tooltip-t-permalink' => 'اس صÙØ­Û’ دے اس ورژن نال پرماننٹ لنک',
+'tooltip-ca-nstab-main' => 'مواد آلا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-user' => 'ورتن آلے دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-media' => 'میڈیا آلا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-special' => 'اے اک خاص صÙØ­Û Ø§Û’ØŒ تےی اے صÙØ­Û Ø¢Ù¾Û’ نئیں Ù„Ú©Ú¾ سکدے',
+'tooltip-ca-nstab-project' => 'منصوبے دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-image' => 'Ùائل دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-mediawiki' => 'پربندھ Ø³Ù†ÛŒØ¹Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-template' => 'Ø³Ø§Ù†Ú†Û ØªÚ©Ùˆ',
+'tooltip-ca-nstab-help' => 'مدد دا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-ca-nstab-category' => 'کیٹاگری آلا صÙØ­Û ÙˆÛŒÚ©Ú¾Ùˆ',
+'tooltip-minoredit' => 'انیو نکے کم چ گنو',
+'tooltip-save' => 'اپنا کم بچالو',
+'tooltip-preview' => 'کچا Ú©Ù… ویکھو، اس بٹن نوں بچان توں Ù¾Ûلاں استعمال کرو!Û”',
+'tooltip-diff' => 'اس عبارت وچ کیتیاں تبدیلیاں وکھاؤ۔',
+'tooltip-compareselectedversions' => 'Ú†Ù†Û’ ÛÙˆÛ“ صÙحیاں ÙˆÚ† Ùرق ویکھو۔',
+'tooltip-watch' => 'اس صÙÛ’ تے نظر رکھو',
+'tooltip-watchlistedit-normal-submit' => 'ٹائیٹلز Ûٹاؤ',
+'tooltip-watchlistedit-raw-submit' => 'اکھ تھلے رکھی لسٹ نون نواں کرو',
+'tooltip-recreate' => 'Ø§ÛŒÛ ØµÙÛ Ø¯ÙˆØ¨Ø§Ø±Û Ø¨Ù†Ø§Ø¤ پاویں اے مٹادتا گیا Ûووے۔',
+'tooltip-upload' => 'Ùائل چڑھانا شروع کرو',
+'tooltip-rollback' => '"رول بیک" اک Ú©Ù„Ú© Ú† صÙØ­Û’ نوں Ù¾Ú†Ú¾Ù„ÛŒ حالت Ú† Ù„Û’ Ú†Ù„Û’ گا',
+'tooltip-undo' => '"واپس" تے Ú©Ù„Ú© کرن نال توانوں صÙØ­Û Ú©Ú†Ø§ وکھایا جاۓ گا۔
اس نال تسی واپس کرن دی ÙˆØ¬Û Ù„Ú©Ú¾ سکو Ú¯Û’Û”',
-'tooltip-preferences-save' => 'تانگاں بچاؤ',
-'tooltip-summary' => 'اک نکی سمری پاؤ',
+'tooltip-preferences-save' => 'تانگاں بچاؤ',
+'tooltip-summary' => 'اک نکی سمری پاؤ',
# Metadata
'notacceptable' => 'ÙˆÚ©ÛŒ سرور توانوں اوس Ùارمیٹ Ú† ڈیٹا نئیں دے سکدا جیدے Ú† Ø§ÙˆÛ Ù¾Ú‘Ú¾ سکے۔',
@@ -2670,9 +2749,6 @@ $1',
# Patrol log
'patrol-log-page' => 'گشت لاگ',
'patrol-log-header' => 'اے گست لائیآں Ûوئیآن ریوین دی لاگ اے۔',
-'patrol-log-line' => '$2 دی $1 تے نشان گشت Ûوئی $3',
-'patrol-log-auto' => '(اپنے آپ)',
-'patrol-log-diff' => 'ریوین $1',
'log-show-hide-patrol' => '$1 گشت لاگ',
# Image deletion
@@ -2690,23 +2766,25 @@ $1',
'nextdiff' => 'نویں لکھائی →',
# Media information
-'mediawarning' => "'''خبردار''' : اینج دی Ùائل Ú† غلط Ú©ÙˆÚˆ Ûوسکدا اے۔
+'mediawarning' => "'''خبردار''' : اینج دی Ùائل Ú† غلط Ú©ÙˆÚˆ Ûوسکدا اے۔
اینوں ورت کے تسیں اپنے کمپیوٹر نوں خراب کرسکدے او۔",
-'imagemaxsize' => "مورت ناپ حد:<br />''(دسن والیاں Ùائل صÙیاں لئی)''",
-'thumbsize' => 'تھمبنیل ناپ',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|صÙÛ|صÙÛ’}}',
-'file-info' => 'Ùائل ناپ: $1ØŒ MIME ٹائپ: $2',
-'file-info-size' => 'پکسل:$1 × $2, Ùائل سائز: $3, مائم ٹائپ: $4',
-'file-info-size-pages' => '$1 × $2 پکسل, Ùائل ناپ: $3, مائم ٹائپ: $4, $5 {{PLURAL:$5|صÙÛ|صÙÛ’}}',
-'file-nohires' => '<small>اس توں ÙˆÚˆÛŒ Ùوٹو موجود Ù†Ûیں۔</small>',
-'svg-long-desc' => 'ایس ÙˆÛŒ جی Ùائل، پکسل:$1 × $2ØŒ Ùائل سائز: $3',
-'show-big-image' => 'وڈی مورت',
-'show-big-image-size' => '$1 × $2 پکسلز',
-'file-info-gif-looped' => 'لوپڈ',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|Ùریم|Ùریمز}}',
-'file-info-png-looped' => 'لوپڈ',
-'file-info-png-repeat' => 'چلایا $1 {{PLURAL:$1|واری|واریاں}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|Ùریم}}',
+'imagemaxsize' => "مورت ناپ حد:<br />''(دسن والیاں Ùائل صÙیاں لئی)''",
+'thumbsize' => 'تھمبنیل ناپ',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|صÙÛ|صÙÛ’}}',
+'file-info' => 'Ùائل ناپ: $1ØŒ MIME ٹائپ: $2',
+'file-info-size' => 'پکسل:$1 × $2, Ùائل سائز: $3, مائم ٹائپ: $4',
+'file-info-size-pages' => '$1 × $2 پکسل, Ùائل ناپ: $3, مائم ٹائپ: $4, $5 {{PLURAL:$5|صÙÛ|صÙÛ’}}',
+'file-nohires' => 'اس توں ÙˆÚˆÛŒ Ùوٹو موجود Ù†Ûیں۔',
+'svg-long-desc' => 'ایس ÙˆÛŒ جی Ùائل، پکسل:$1 × $2ØŒ Ùائل سائز: $3',
+'show-big-image' => 'وڈی مورت',
+'show-big-image-preview' => 'ایس وکھالے دا ناپ: $1۔',
+'show-big-image-other' => 'دوجے {{PLURAL:$2|ریزولوشن|ریزولوشنز}}: $1.',
+'show-big-image-size' => '$1 × $2 پکسلز',
+'file-info-gif-looped' => 'لوپڈ',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|Ùریم|Ùریمز}}',
+'file-info-png-looped' => 'لوپڈ',
+'file-info-png-repeat' => 'چلایا $1 {{PLURAL:$1|واری|واریاں}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Ùریم}}',
# Special:NewFiles
'newimages' => 'نئی Ùائلاں دی نگری',
@@ -2720,6 +2798,13 @@ $1',
'bydate' => 'تریخ نال',
'sp-newimages-showfrom' => '$1ØŒ $2 توں نویاں Ùائلاں دسو',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '$1 {{PLURAL:$1|سکنٹ|سکنٹاں}}',
+'minutes' => ' {{PLURAL:$1|منٹ|منٹاں}}',
+'hours' => ' {{PLURAL:$1|کینٹا|کینٹے}}',
+'days' => ' {{PLURAL:$1|دن|دناں}}',
+'ago' => '$1 Ù¾ÛÙ„Û’',
+
# Bad image list
'bad_image_list' => 'Ùارمیٹ اینج اے:Û”
@@ -3212,13 +3297,6 @@ $5
'scarytranscludefailed' => '[ٹمپلیٹ $1 لئی لے کے آنا ناکام]',
'scarytranscludetoolong' => '[URL چوکھی لمبی اے]',
-# Trackbacks
-'trackbackbox' => 'ایس صÙÛ’ لئی Ù¾Ú†Ú¾Û’:<br />
-$1',
-'trackbackremove' => '([$1 مٹاؤ])',
-'trackbacklink' => 'پچھلا Ø±Ø§Û Ù„Ø¨Ù†Ø§',
-'trackbackdeleteok' => 'پچھلا Ø±Ø§Û Ù…Ù¹Ø§ دتا گیا',
-
# Delete conflict
'deletedwhileediting' => "'''خبردار''': تھواڈے Ù„Ú©Ú¾Ù† مکرون اے صÙÛ Ù…Ù¹Ø§ دتا گیا!",
'confirmrecreate' => "ورتن والا [[User:$1|$1]]([[User talk:$1|Ú¯Ù„ بات]]) Ø§ÛŒÛ ØµÙÛ Ù…Ù¹Ø§Ø¯ØªØ§ اے جدوں تساں ÙˆØ¬Û Ø¯Ø³ Ú©Û’ تبدیل کرن شروع کیتا:
@@ -3303,6 +3381,9 @@ $1',
'watchlisttools-edit' => 'اکھ تھلے رکھے ÛÙˆÛ“ صÙحیاں نوں ویکھو تے تبدیل کرو',
'watchlisttools-raw' => 'Ú©Ú†ÛŒ اکھ تھلے رکھی Ûوئی نو تبدیل کرو',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])',
+
# Core parser functions
'unknown_extension_tag' => 'انجان ایکسٹنشن ٹیگ "$1"',
'duplicate-defaultsort' => '\'\'\'خبردار:\'\'\' ÚˆÛŒÙالٹ چابی "$2" Ù¾ÛÙ„ÛŒ ÚˆÛŒÙالٹ چابی "$1" دے اتے Ù„Ú¯ گئی اے۔',
@@ -3357,6 +3438,10 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# Special:SpecialPages
'specialpages' => 'خاص صÙÛ’',
+'specialpages-note' => '----
+* نارمل خاص صÙÛ’.
+* <span class="mw-specialpagerestricted">روکے Ú¯Û“ خاص صÙÛ’.</span>
+* <span class="mw-specialpagecached">کاشے خاص صÙÛ’ (پرانے ÛÙˆÚ¯Û“ Ûون).</span>',
'specialpages-group-maintenance' => 'مرمت رپورٹ',
'specialpages-group-other' => 'Ûور خاص صÙÛ’',
'specialpages-group-login' => 'لاگان / Ú©Ú¾Ø§ØªÛ Ú©Ú¾ÙˆÙ„Ùˆ',
@@ -3398,13 +3483,16 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
'tags-hitcount' => '$1 {{PLURAL:$1|change|تبدیلیاں}}',
# Special:ComparePages
-'comparepages' => 'صÙÛ’ سامنے کرو',
-'compare-selector' => 'صÙیاں تے Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÛŒÚ©Ú¾ دیکھو',
-'compare-page1' => 'صÙÛ 1',
-'compare-page2' => 'صÙÛ 2',
-'compare-rev1' => 'Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÚ©Ú¾Ø§Ù„Û 1',
-'compare-rev2' => 'Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÚ©Ú¾Ø§Ù„Û 2',
-'compare-submit' => 'امنے سامنے کرو',
+'comparepages' => 'صÙÛ’ سامنے کرو',
+'compare-selector' => 'صÙیاں تے Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÛŒÚ©Ú¾ دیکھو',
+'compare-page1' => 'صÙÛ 1',
+'compare-page2' => 'صÙÛ 2',
+'compare-rev1' => 'Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÚ©Ú¾Ø§Ù„Û 1',
+'compare-rev2' => 'Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÚ©Ú¾Ø§Ù„Û 2',
+'compare-submit' => 'امنے سامنے کرو',
+'compare-invalid-title' => 'سرخی جیÛÚ‘ÛŒ تساں Ú†Ù†ÛŒ اے ایدی اجازت نئیں۔',
+'compare-title-not-exists' => 'ٹائیٹل جیÛڑا تساں چنیاں Ø§ÙˆÛ ÛÛ’ ای نئیں۔',
+'compare-revision-not-exists' => 'Ø¯ÙˆØ¨Ø§Ø±Û ÙˆÚ©Ú¾Ø§Ù„Û Ø¬ÛŒÛڑا تساں دسیا اے ÛÛ’ ای نئیں۔',
# Database error messages
'dberr-header' => 'ایس ÙˆÚ©ÛŒ Ú† کوئی Ù…Ø³Ù„Û Ø§Û’Û”',
@@ -3432,4 +3520,89 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
'sqlite-has-fts' => '$1 پوری لکھت کھوج مدد نال',
'sqlite-no-fts' => '$1 بنا کسے لکھت مدد دے',
+# New logging system
+'logentry-delete-delete' => '$1 {{جنس:$2|مٹایا}} صÙÛ $3',
+'logentry-delete-restore' => '$1 {{جنس:$2|بچایا}} صÙÛ $3',
+'logentry-delete-event' => '$1 پلٹے ÙˆÚ©Ú¾Ø§Ù„Û {{PLURAL:$5|اک لاگ ایونٹ|$5 لاگ ایونٹس}} تے $3: $4',
+'logentry-delete-revision' => '$1 پلٹی ÙˆÚ©Ú¾Ø§Ù„Û {{PLURAL:$5|اک ریوین|$5 ریویناں}} صÙÛ’ تے $3: $4',
+'logentry-delete-event-legacy' => '$1 {{جنس:$2|بدلی}} لاگ کماں دا ÙˆÚ©Ú¾Ø§Ù„Û $3 تے',
+'logentry-delete-revision-legacy' => '$1 {{جنس:$2|بدلی}} ریوین دا ÙˆÚ©Ú¾Ø§Ù„Û ØµÙÛ $3',
+'logentry-suppress-delete' => '$1 {{جنس:$2|دبایا}} صÙÛ $3',
+'logentry-suppress-event' => '$1 لکا Ú©Û’ بدلی {{PLURAL:$5|اک لاگ Ú©Ù…|$5 لاگ Ú©Ù…}} دا ÙˆÚ©Ú¾Ø§Ù„Û $3 تے: $4',
+'logentry-suppress-revision' => '$1 لکا Ú©Û’ بدلی {{PLURAL:$5|ریوین|$5 ریویناں}} دا ÙˆÚ©Ú¾Ø§Ù„Û $3 تے: $4',
+'logentry-suppress-event-legacy' => '$1 لکا Ú©Û’ بدلیا لاگ کماں دا ÙˆÚ©Ú¾Ø§Ù„Û $3',
+'logentry-suppress-revision-legacy' => '$1 لکا Ú©Û’ {{جنس:$2|بدلی}} ریویناں دا ÙˆÚ©Ú¾Ø§Ù„Û ØµÙÛ $3 تے۔',
+'revdelete-content-hid' => 'مواد لکیا',
+'revdelete-summary-hid' => 'لکھت سمری لکی',
+'revdelete-uname-hid' => 'ورتن والے دا ناں لکیا',
+'revdelete-content-unhid' => 'مواد ناں لکیا',
+'revdelete-summary-unhid' => 'لکھت سمری ناں لکی',
+'revdelete-uname-unhid' => 'ورتن والے دا ناں ںئیں لکیا',
+'revdelete-restricted' => 'مکھیاں تے روکاں لگیاں',
+'revdelete-unrestricted' => 'مکھیاں تے روکاں لتھیاں',
+'logentry-move-move' => '$1 {{جنس:$2|پلٹی}} صÙÛ $3 توں $4',
+'logentry-move-move-noredirect' => '$1 {{جنس:$2|پلٹی}} صÙÛ $3 توں $4 اک ڑیڈائرکٹ Ú†Ú¾ÚˆÛ’ بنا',
+'logentry-move-move_redir' => '$1 {{جنس:$2|پلٹی}} صÙÛ $3 توں $4 ریڈائرکٹ',
+'logentry-move-move_redir-noredirect' => '$1 {{جنس:$2|پلٹی}} صÙÛ $3 توں $4 اک ریڈائرکٹ دے بنا کسے ریڈائرکٹ دتیاں',
+'logentry-patrol-patrol' => '$1 {{جنس:$2|نشان Ù„Ú¯ÛŒ}} ریوین $4 صÙÛ $3 ویکھی گئی۔',
+'logentry-patrol-patrol-auto' => 'اپنے آپ $1 {{جنس:$2|نشان Ù„Ú¯ÛŒ}} $4 ریوین صÙÛ $3 دی ویکھی گئی',
+'logentry-newusers-newusers' => '$1 {{جنس:$2|بنایا گیا}} اک ورتن والا کھاتÛÛ”',
+'logentry-newusers-create' => '$1 {{جنس:$2|بنایا}} اک ورتن والا کھاتÛ',
+'logentry-newusers-create2' => '$1 {{جنس:$2|بنایا}} {{جنس:$4|اک ورتن کھاتÛ}} $3',
+'logentry-newusers-autocreate' => 'Ú©Ú¾Ø§ØªÛ $1 اپنے آپ ای {{جنس:$2|بنایا گیا}} بنایا گیا۔',
+'newuserlog-byemail' => 'کنجی ای-میل Ø±Ø§Û Ù¾ÛŒØ¬ دتی گئی۔',
+
+# Feedback
+'feedback-bugornote' => 'اگر تسیں اک تکنیکی مسلے نوں پوری طراں دسن لئی تیار او تے Ùیر Ù…Ûربانی کرکے [$1 بگ بارے دسو]Û” ںئیں تے تسیں تھلے دتا گیا Ùارم ورتو۔ تواڈی Ú¯Ù„ صÙÛ "[$3 $2]" تے جڑے گی، تواڈے ورتن والے ناں تے براؤزر جیÛڑا تسیں ورت رۓ او۔',
+'feedback-subject' => 'آرٹیکل',
+'feedback-message' => 'سنیعÛ:',
+'feedback-cancel' => 'واپس',
+'feedback-submit' => 'Ù…Ø´ÙˆØ±Û Ø¯ÛŒÙˆ',
+'feedback-adding' => 'Ù…Ø´ÙˆØ±Û ØµÙÛ’ تے دیو۔۔۔۔۔۔۔',
+'feedback-error1' => 'غلطی: اے پی آئی توں ناں پچھانے گۓ نتارے۔',
+'feedback-error2' => 'غلطی: تبدیلی نئیں چلی',
+'feedback-error3' => 'غلطی: اے پی آئی توں کوئی جواب نئیں۔',
+'feedback-thanks' => 'Ø´Ú©Ø±ÛŒÛ ! تواڈی صلاع صÙÛ "[$2 $1]" تے چاڑ دتی گئی اے۔',
+'feedback-close' => 'Ûوگیا۔',
+'feedback-bugcheck' => 'بعوت ودیا ! ØµØ±Ù Ø§ÛŒÛ ÙˆÛŒÚ©Ú¾Ùˆ جے کیا Ø§ÛŒÛ Ù¾ÛÙ„Û’ لبے ÛÙˆÛ“ [$1 known bugs] Ú†Ùˆ اک تے نئیں۔',
+'feedback-bugnew' => 'میں ویکھیا اے۔ نویں بگ دی رپورٹ کرو۔',
+
+# API errors
+'api-error-badaccess-groups' => 'تھوانوں ایس ÙˆÚ©ÛŒ تے Ùائلاں چڑھان دی اجازت نئیں۔',
+'api-error-badtoken' => 'اندر دی غلطی: برا ٹوکن',
+'api-error-copyuploaddisabled' => 'یو آر ایل نال Ùائل چڑھانا ایس سرور تے نکام',
+'api-error-duplicate' => 'ایتھے {{PLURAL:$1|ÛÛ’ [$2 اک Ûور Ùائل]|Ûین [$2 Ú©Ú† Ûور Ùائلاں]}} ایسے مواد نال ایس تھاں تے Ù¾ÛÙ„Û’ ای ÛÛ’Û”',
+'api-error-duplicate-archive' => 'ایتھے {{PLURAL:$1|سی [$2 اک Ûور Ùائل]|سن [$2 کج Ûور Ùائلاں]}} Ù¾ÛÙ„Û’ ای ایس تھاں تے اے اکو جے مواد نال پر {{PLURAL:$1|اے سی|Ø§ÙˆÛ Ø³Ù†}} مٹایا گیا۔',
+'api-error-duplicate-archive-popup-title' => 'دوجی {{PLURAL:$1|Ùائل|Ùائلاں}} جناں نوں Ù¾ÛÙ„Û’ ای مٹا دتا گیا اے۔',
+'api-error-duplicate-popup-title' => 'دوجی {{PLURAL:$1|Ùائل|Ùائلاں}}',
+'api-error-empty-file' => 'جیڑی Ùائل تسی دسی اے Ø§ÙˆÛ Ø­Ø§Ù„ÛŒ اے۔',
+'api-error-emptypage' => 'نواں بناریا آن، خالی صÙیاں دی اجازت نئیں۔',
+'api-error-fetchfileerror' => 'اندر دی غلطی: Ùائل لیندیاں کوئی غلطی Ûوئی۔',
+'api-error-file-too-large' => 'جیڑی Ùائل تسی دسی اے Ø§ÙˆÛ Ø¨ÙˆØª ÙˆÚˆÛŒ اے۔',
+'api-error-filename-tooshort' => 'اس Ùائل دا ناں بوت چھوٹا اے۔',
+'api-error-filetype-banned' => 'اس قسم دی Ùائل تے پابندی اے۔',
+'api-error-filetype-missing' => 'Ùائل Ú† ایکسٹنشن نئیں اے۔',
+'api-error-hookaborted' => 'جیڑی تبدیلی تسی کرنا چاÛÛŒ اے، اونوں اک ایکسٹنشن Ú©Ù†ÚˆÛ’ نیں بند کردتا اے۔',
+'api-error-http' => 'انٹرنیٹ ئلطی: سرور نال کوئی جوڑ نئیں۔',
+'api-error-illegal-filename' => 'اس Ùائل دے ناں تے پابندی اے۔',
+'api-error-internal-error' => 'اندر دی غلطی: تواڈے ÙˆÚ©ÛŒ تے چڑھاندیاں کوئی غلطی Ûوئی اے۔',
+'api-error-invalid-file-key' => 'اندر دی غلطی: Ùائل ناں لبی Ú©Ú†Û’ سٹور ج',
+'api-error-missingparam' => 'اندر دی غلطی: غیب پیرامیٹرز منگن تے۔',
+'api-error-missingresult' => 'اندر دی غلطی: سعاب نئیں لاسکدے جے کاپی چلے گی۔',
+'api-error-mustbeloggedin' => 'Ùائلاں اپلوڈ کرن واسطے توانوں لاگ ان کرنا ضروری اے۔',
+'api-error-mustbeposted' => 'اندر دی غلطی: ایچ ٹیٹیپی پوسٹ چائیدی اے۔',
+'api-error-noimageinfo' => 'Ùائل چڑھانا کامیاب، پر سرور Ù†Û’ Ùائل بارے سانوں کوئی دس نئیں پیجی۔',
+'api-error-nomodule' => 'انٹنیٹ غلطی: Ùائل چڑھان والا موڈیول سیٹ ںئیں',
+'api-error-ok-but-empty' => 'انٹرنیٹ غلطی: سرور ولوں کوئی جواب نئیں۔',
+'api-error-overwrite' => 'اک Ûونی Ùائل تے Ûور Ù„Ú©Ú¾Ù† دی اجازت نئیں۔',
+'api-error-stashfailed' => 'اندر دی غلطی: سرور کچیاں Ùائلاں نوں رکھن Ú† نکام۔',
+'api-error-timeout' => 'سرور نے توقع رکھے ویلے ج جواب نئیں دتا۔',
+'api-error-unclassified' => 'اک انجان غلطی Ûوگئی اے۔',
+'api-error-unknown-code' => 'اجان غلطی:"$1"',
+'api-error-unknown-error' => 'اندر دی غلطی: کوئی چیز غلط Ûوئی جدوں تسی Ùائل چڑھاندے سی۔',
+'api-error-unknown-warning' => 'انجان خبرداری: $1',
+'api-error-unknownerror' => 'انجان غلطی : "$1"۔',
+'api-error-uploaddisabled' => 'Ùائل جڑھانا ایس ÙˆÚ©ÛŒ تے بند اے۔',
+'api-error-verification-error' => 'اے Ùائل کرپٹ ÛÙˆ سکدی یا Ùیر ایدا Ùارمیٹ غلط اے۔',
+
);
diff --git a/languages/messages/MessagesPnt.php b/languages/messages/MessagesPnt.php
index 152cfef4..526ff4f4 100644
--- a/languages/messages/MessagesPnt.php
+++ b/languages/messages/MessagesPnt.php
@@ -328,7 +328,6 @@ $messages = array(
'badtitletext' => "Το ψαλαφεμένον ο τίτλος τη σελίδας εν άκυÏον, γιά εÏκαιÏον γιά τσακωμένον διαγλωσσικόν σÏνδεσμος.
ΤεÏέστεν αν έχ' έναν γιά πολλά γÏάμματα που 'κ ίνεται να κουλανεÏκουνταν απές σε τίτλον.",
'viewsource' => 'ΤεÏέστεν κωδικόν',
-'viewsourcefor' => 'για $1',
'protectedpagetext' => "ΑβοÏτη σελίδαν εν ασπαλιγμένον και 'κ αλλάζ'.",
'viewsourcetext' => "ΕποÏείτε να τεÏείτε και ν' αντιγÏάφετε το κείμενον Ï„' ατεινές τη σελίδας:",
'protectedinterface' => "ΑβοÏτη σελίδαν έχ' απές κείμενον για το interface τη software και για Ï„' ατό εν ασπαλιγμένον.",
@@ -486,7 +485,6 @@ $messages = array(
Το IP εσοÏν εν $3 και το ID τη ασπαλιγματίνεσουν εν #$5.
Ποδεδίζουμε σας να γÏάφτατο σο μένεμαν εσοÏν.",
'blockednoreason' => "'Κ εγÏάφτεν αιτίαν",
-'whitelistedittitle' => "Εμπάτε για να φτάτε τ' αλλαγάς",
'whitelistedittext' => "ΠÏέπ να $1 για ν' εποÏείτε ν' επεξεÏγάσκεστε τα σελίδας.",
'nosuchsectiontitle' => "ΑÎκον κομμάτ' 'κ εχ'",
'loginreqtitle' => 'ΕπÏέπ να εσέβειτε',
@@ -573,11 +571,6 @@ $messages = array(
'revdel-restore' => 'Ἀλλαγμαν οÏατότητας',
'pagehist' => 'ΙστοÏίαν σελίδας',
'deletedhist' => 'Σβηγμένον ιστοÏίαν',
-'revdelete-content' => 'πεÏιεχόμενον',
-'revdelete-summary' => 'σÏνοψην',
-'revdelete-uname' => "όνεμαν χÏήστ'",
-'revdelete-hid' => 'κÏυφόν $1',
-'revdelete-unhid' => 'όχι κÏυφόν $1',
# History merging
'mergehistory-from' => 'Σελίδα πηγή:',
@@ -956,8 +949,7 @@ $messages = array(
'listusers-submit' => 'Δείξον',
# Special:Log/newusers
-'newuserlogpage' => 'ΑÏχείον ποισιματίων λογαÏίων χÏήστε',
-'newuserlog-create-entry' => 'Îέον χÏήστες',
+'newuserlogpage' => 'ΑÏχείον ποισιματίων λογαÏίων χÏήστε',
# Special:ListGroupRights
'listgrouprights-group' => 'Ομάδαν',
@@ -1007,7 +999,6 @@ $messages = array(
'actioncomplete' => 'Η ενέÏγειαν ετελέθεν',
'deletedtext' => 'Το "$1" εσβήγανατο.
ΤεÏέστεν το $2 και δεαβάστεν για τα υστεÏνά τα σβησίματα.',
-'deletedarticle' => 'ενεσβÏεν η "[[$1]]"',
'dellogpage' => "Κατάλογον με Ï„' ατά ντ' ενεσβÏγαν",
'deletionlog' => 'αÏχείον ασπαλιγματίων',
'deletecomment' => 'Αιτία:',
@@ -1057,7 +1048,6 @@ $messages = array(
'undeletelink' => 'τέÏεμαν/επαναφοÏά',
'undeleteviewlink' => 'τέÏεμα',
'undeletecomment' => 'Σχόλιον:',
-'undeletedarticle' => 'επαναφοÏά τη "[[$1]]"',
'undelete-search-box' => "ΑÏάεμαν σελιδίων ντ'ενεσβÏαν",
'undelete-search-submit' => 'ΕÏÏον',
'undelete-show-file-submit' => 'Îαι',
@@ -1178,8 +1168,6 @@ $messages = array(
Ποισέστεν τα έναν.'''",
'movedto' => 'ετεÏοχλαεÏτεν σο',
'movetalk' => 'ΕτεÏοχλάεμαν τη σελίδας καλατσεματί',
-'1movedto2' => '[[$1]] ετεÏχλαεÏτεν σο [[$2]]',
-'1movedto2_redir' => '[[$1]] ετεÏχλαεÏτεν σο [[$2]] σε σÏνδεσμον απάν',
'movelogpage' => 'ΑÏχείον ετεÏοχλαεματί',
'movereason' => 'Λόγον:',
'revertmove' => 'κλώσιμον',
@@ -1279,9 +1267,6 @@ $messages = array(
# Spam protection
'spamprotectiontitle' => 'ΦίλτÏον Ï€Ïοστασίας ασό σπαμ',
-# Patrol log
-'patrol-log-auto' => '(αυτόματον)',
-
# Browsing diffs
'previousdiff' => '↠ΠÏοτεσνόν διαφοÏά',
'nextdiff' => 'Άλλον διαφοÏά →',
@@ -1289,7 +1274,7 @@ $messages = array(
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|σελίδα|σελίδας}}',
'file-info-size' => '$1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3, MIME Ï„Ïπον: $4',
-'file-nohires' => "<small>'Κ εχ κι άλλο ψηλόν ανάλυσην.</small>",
+'file-nohires' => "'Κ εχ κι άλλο ψηλόν ανάλυσην.",
'svg-long-desc' => "ΑÏχείον SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχεί: $3",
'show-big-image' => 'Τζιπ Ï„Ïανόν ανάλυση',
@@ -1388,9 +1373,6 @@ $messages = array(
'namespacesall' => 'οÏλαι',
'monthsall' => 'οÏλαι',
-# Trackbacks
-'trackbackremove' => '([$1 Σβήσον])',
-
# Delete conflict
'recreate' => 'Ποίσον αξάν',
diff --git a/languages/messages/MessagesPrg.php b/languages/messages/MessagesPrg.php
index c839e18f..b06471aa 100644
--- a/languages/messages/MessagesPrg.php
+++ b/languages/messages/MessagesPrg.php
@@ -347,14 +347,13 @@ Madli pawakÄ“is di [[Special:ListUsers/sysop|perwaldÄ«taju]], preidÄntei URL.',
MazÄ«ngi, kÄi pastÄi jÄu Äupausintan pra ainuntan kittan.',
'badtitle' => 'NitikrÅmiskas tÄ«tels',
'badtitletext' => 'PadÄts pÄusas tÄ«tels ni ast tikrÅmiskan. DruwÄ«minai ast pÄustan anga turri Ä“n sen zentlins, kawÄ«dan terpausnÄ ast drÄ“uditan.',
-'perfcached' => 'Å in dÄtan ast rÄnkas minÄ«snas kÅpija be mazzi bÅ«twei niaktuÄlin.',
-'perfcachedts' => 'Å in dÄtan ast rÄnkas minÄ«snas kÅpija. Panzdaums ernaunÄ«nsenis bÄ“i en $1.',
+'perfcached' => 'Å in dÄtan ast rÄnkas minÄ«snas kÅpija be mazzi bÅ«twei niaktuÄlin. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Å in dÄtan ast rÄnkas minÄ«snas kÅpija. Panzdaums ernaunÄ«nsenis bÄ“i en $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Å isse pÄusan etnaunÄ«nsna tÄ“ntiskai ast izklÄutan. SÄ“nti stwi dÄtan ni wÄ«rst pastÄwun etnaunÄ«ntan.',
'wrong_wfQuery_params' => 'NitikrÅmiskai parÄmeterei perlaÄ«stan wfQuery()<br />
FunkciÅni: $1<br />
Prasīsenis: $2',
'viewsource' => 'WÄ«dais appun',
-'viewsourcefor' => 'per $1',
'actionthrottled' => 'Dīlasenis stalīntan',
'protectedpagetext' => 'RedigÄ«snas mazÄ«ngisku per Å¡in pÄusan pastÄi izklÄutan.',
'viewsourcetext' => 'MazÄ«ngi widÄtun be kÅpitun Å¡isse pÄusan appun:',
@@ -547,9 +546,6 @@ Tū ni mazzi tērpautun "tenginnais e-mailin tērpautaju" mazīngiskwan, ik tikr
TwajÄ bigantÄ« IP adressi ast $3 be blÅkisenes ID nummeri ast #$5.
Madli ebimmais wissans Å¡ins malkans en wisÄ“imans prasÄ«senins ezze blÅkisenin.',
'blockednoreason' => 'ni padÄi di tikslin',
-'blockedoriginalsource' => "Appun stesse '''$1''' ast waidīntan zemmais:",
-'blockededitsource' => "Tekst stÄ“isan '''TwajÄi redigÄ«senei''' en '''$1''' ast waidÄ«ntan zemmais:",
-'whitelistedittitle' => 'EnÄ“isenis ast izkÄ«nintan, kÄi redigÄ«lai',
'whitelistedittext' => 'Tu turri $1, kÄi redigÄ«lai pÄusans.',
'confirmedittext' => 'RedigisnÄ ast mazÄ«ngi tÄ“r pa e-mailas padrÅ«ktinsnan.
PadÄis e-mail adressi be padrÅ«ktinais din en swajÄmans [[Special:Preferences|tÄ“rpautajas pirminiskwans]].',
@@ -738,22 +734,11 @@ Bandais [[Special:Search|laukÄ«tun]] sirzdau nÄunans pÄusans en wiki',
'revdelete-unsuppress' => 'Ä€upausinais arÄikinsenins per etwÄrtai wartÄ«ntans wersiÅnins',
'revdelete-log' => 'Brewīnsli:',
'revdelete-submit' => 'PertÄ“rpaus prei {{PLURAL:$1|etrÄ«nktan wersiÅnin|etrÄ«nktans wersiÅnins}}',
-'revdelete-logentry' => 'ast kitawÄ«dinuns(si) wersiÅnis widÄminiskwan en [[$1]]',
-'logdelete-logentry' => 'ast kitawÄ«dinuns(si) audÄsenes widÄminiskwan en [[$1]]',
'revdelete-success' => "'''WersiÅnin widÄminisku pastÄi izpalawÄ«ngi kitawÄ«dintan.'''",
'logdelete-success' => "'''Registeres widÄminisku izpalewÄ«ngi ensadÄ«ntan.'''",
'revdel-restore' => 'kitawÄ«dinais widÄminiskwan',
'pagehist' => 'PÄusas istÅrija',
'deletedhist' => 'AupausintÄ istÅrija',
-'revdelete-content' => 'Ä“nturs',
-'revdelete-summary' => 'kitawÄ«disnan ebpeisÄsenis',
-'revdelete-uname' => 'tÄ“rpautajas pabilisnÄ',
-'revdelete-restricted' => 'ensadinnais arÄikinsenins per perwaldÄ«tajans',
-'revdelete-unrestricted' => 'Äupausinais arÄikinsenins per perwaldÄ«tajans',
-'revdelete-hid' => 'kliptinais $1',
-'revdelete-unhid' => 'ni kliptinais $1',
-'revdelete-log-message' => '$1 - $2 {{PLURAL:$2|wersiÅni|wersiÅnis}}',
-'logdelete-log-message' => '$1 – $2 {{PLURAL:$2|prēipalis|prēipalai}}',
'revdelete-otherreason' => 'KitÄ/papilnimina brewÄ«nsli:',
'revdelete-reasonotherlist' => 'KitÄ brewÄ«nsli',
'revdelete-edit-reasonlist' => 'RedigÄ«s Äupausinsenes brewÄ«nslins',
@@ -887,7 +872,7 @@ PamÄ“nais, kÄi tenÄ“isan indicai mazzi ni bÅ«twei aktuÄlin.',
'prefs-rc' => 'Panzdaumas kitawīdinsnas',
'prefs-watchlist' => 'Nadirītan listi',
'prefs-watchlist-days' => 'GÄ«rbis stÄ“isan deÄ«nan widÄtan en listei stÄ“isan nadirÄ«tan :',
-'prefs-watchlist-days-max' => 'MaksimÄlai 7 dÄ“inas',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Gīrbis stēisan redigīsenin waidīntan en paplattintai listin stēisan nadirīntan:',
'prefs-watchlist-edits-max' => 'MaksimÄls gÄ«rbis: 1000',
'prefs-misc' => 'Šlaitawīdai ensadīnsenei',
@@ -972,7 +957,7 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
'userrights-lookup-user' => 'PerwÄldais tÄ“rpautajas gruppins',
'userrights-user-editname' => 'Enweddais tērpautajas pabilīsnan:',
'editusergroup' => 'Redigīs tērpautajas gruppins',
-'editinguser' => "Kitawīdisna stēisan tērpautajas '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) enwarīnsenin",
+'editinguser' => "Kitawīdinsna stēisan tērpautajas '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) enwarīnsenin",
'userrights-editusergroup' => 'Redigīs tērpautajas gruppins',
'saveusergroups' => 'EnpeisÄis tÄ“rpautajas gruppins',
'userrights-groupsmember' => 'perlÄnke prei:',
@@ -1057,7 +1042,6 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
'right-autopatrol' => 'SwajÄi redigÄ«senei autÅmatiskai ebzentlitan per izbandÄtans',
'right-patrolmarks' => 'WÄ«dais izbandÄsnas zentlitajans stÄ“isan panzdauman kitawÄ«dinsnan',
'right-unwatchedpages' => 'WÄ«dais listin stÄ“isan ninadirÄ«tan pÄusan',
-'right-trackback' => 'Tenginnais "trackback"',
'right-mergehistory' => 'Senlajjais istÅrijans stÄ“isan pÄusan',
'right-userrights' => 'Redigīs enwarīnsenins wisēisan tērpautajan',
'right-userrights-interwiki' => 'Redigīs enwarīnsenins stēisan tērpautajan en kitēimans wiki',
@@ -1101,7 +1085,6 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
'action-patrol' => 'ebzentlitun kitÄ“isan redigÄ«senin per izbandÄtan',
'action-autopatrol' => 'ebzentlitun swajjan redigÄ«senin per izbandÄtan',
'action-unwatchedpages' => 'widÄtun listin stÄ“isan ninadirÄ«tan pÄusan',
-'action-trackback' => 'tengīntun "traceback"',
'action-mergehistory' => 'Senlajjais Å¡isse pÄusas istÅrijan',
'action-userrights' => 'redigītun enwarīnsenins wisēisan tērpautajan',
'action-userrights-interwiki' => 'redigītun enwarīnsnans stēisan tērpautajan en kitēimans wiki',
@@ -1552,12 +1535,8 @@ EbÅ¡lÅ«zitai prÅtokulai: <tt>$1</tt>',
'activeusers-noresult' => 'Ni aupalÄ di tÄ“rpautajans',
# Special:Log/newusers
-'newuserlogpage' => 'NÄunai tÄ“rpautajai',
-'newuserlogpagetext' => 'Sta ast registerin stÄ“isan nÄunai teÄ«katan rekkenan stÄ“isan tÄ“rpautajan',
-'newuserlog-byemail' => 'kliptaswīrds tengīntan pra e-mail',
-'newuserlog-create-entry' => 'nÄunas tÄ“rpautajas rekkens',
-'newuserlog-create2-entry' => 'ast teīkuns(si) rekkenan $1',
-'newuserlog-autocreate-entry' => 'Rekkens teÄ«ktan autÅmatiskai',
+'newuserlogpage' => 'NÄunai tÄ“rpautajai',
+'newuserlogpagetext' => 'Sta ast registerin stÄ“isan nÄunai teÄ«katan rekkenan stÄ“isan tÄ“rpautajan',
# Special:ListGroupRights
'listgrouprights' => 'Tērpautajan gruppin enwarīnsenei',
@@ -1625,7 +1604,7 @@ EraÄ«na Å¡isse pÄusas Ä“nturas kitawÄ«dinsna anga diskusiÅnis pÄusas sÄ“itan
'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}}.',
'iteminvalidname' => 'PrÅblamans sen elamÄ“ntan "$1", nitikrÅmiska pabilisnÄ...',
-'wlnote' => "Zemmais pawaidinnÄ di {{PLURAL:$1|panzdauman kitawÄ«disnan|panzdaumans '''$1''' kitawidisnans}} en {{PLURAL:$2|panzdauman stundin|'''$2''' panzdaumans stundins}}.",
+'wlnote' => "Zemmais pawaidinnÄ di {{PLURAL:$1|panzdauman kitawÄ«dinsnan|panzdaumans '''$1''' kitawÄ«dinsnans}} en {{PLURAL:$2|panzdauman stundin|'''$2''' panzdaumans stundins}}.",
'wlshowlast' => 'Waidinnais panzdaumans $1 stūndins, $2 dēinans ($3)',
'watchlist-options' => 'Nadirītan listis mazīngiskwas',
@@ -1660,8 +1639,6 @@ Izbandais, anga perarwi kwaitÄ“i tu stan segÄ«tun, kÄi tÅ« izpresta rÄ«plins, a
'actionfailed' => 'DÄ«lasenis ni izpalla',
'deletedtext' => 'Ä€upausinÄ di "$1"
WÄ«dais en $2 listin stÄ“isan panzdauman Äupausinsenin.',
-'deletedarticle' => 'ast Äupausinuns(si) "[[$1]]"',
-'suppressedarticle' => 'ast enkliptinuns(si) "[[$1]]"',
'dellogpage' => 'RegÄ«sterin stÄ“isan Äupausinsenin',
'dellogpagetext' => 'Zemmais ast panzdauman Äupausinsenin listi.',
'deletionlog' => 'regÄ«sterin stÄ“isan Äupausinsenin',
@@ -1774,7 +1751,6 @@ Tu mazzi turÄ«tun wÄrgan autengÄ«nsnan anga wersiÅni pastÄi etwÄrtai wartÄ«n
'undeletereset' => 'Etkraūneis',
'undeleteinvert' => 'Etwartinnais pazentlisenin',
'undeletecomment' => 'KumentÄrs:',
-'undeletedarticle' => 'etwÄrtai wartinna "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 wersiÅni|$1 wersiÅnis}} etwÄrtai wartÄ«ntan',
'undeletedrevisions-files' => 'etteÄ«kÄ“ di {{PLURAL:$1|1 wersiÅnin|$1 wersiÅnins}} be {{PLURAL:$2|1 zÅ«rbrukin|$2 zÅ«rbrukins}}',
'undeletedfiles' => 'ast etteīkuns {{PLURAL:$1|1 zūrbrukin|$1 zūrbrukins}}',
@@ -2001,9 +1977,6 @@ Madli senlajjais tennans rÄnkiskai.'''",
'movepage-page-moved' => 'PÄusan $1 pastÄi praskajjintan en $2.',
'movepage-page-unmoved' => 'PÄusan $1 ni mazzi bÅ«twei praskajjintan en $2.',
'movepage-max-pages' => 'PastÄi praskajjintan $1 {{PLURAL:$1|pÄusan|pÄusai}}. TÅ«ls ni mazzi bÅ«twei praskajjintan autÅmatiskai.',
-'1movedto2' => 'ast praskajjinuns(si) [[$1]] en [[$2]]',
-'1movedto2_redir' => 'ast praskajjinuns(si) [[$1]] en [[$2]] kīrsa prawessenin',
-'move-redirect-suppressed' => 'Ni teīkē di prawessenin en wūrasmu tītelin',
'movelogpage' => 'Registerin stēisan praskajjintan',
'movelogpagetext' => 'Zemmais ast listi wisÄ“isan praskajjinsenin stÄ“isan pÄusan.',
'movesubpage' => '{{PLURAL:$1|PÅpausan|PÅpausai}}',
@@ -2223,9 +2196,6 @@ Sta ast druwÄ«minai dÄ«lintan pra autengÄ«nsenin prÄ“i izwinaÄ«nan pÄusan iz kÄ
# Patrol log
'patrol-log-page' => 'IzbandÄsnas registerin',
'patrol-log-header' => 'Sta ast izbandÄtan wersiÅnin regÄ«sterin.',
-'patrol-log-line' => 'ast pazentliwuns(si) $1 wersiÅnin stesse $2 pÄusan kÄigi "izbandÄtan" $3',
-'patrol-log-auto' => '(autÅmatiskai)',
-'patrol-log-diff' => 'wersiÅni $1',
'log-show-hide-patrol' => '$1 izbandÄsnas registerin',
# Image deletion
@@ -2251,7 +2221,7 @@ EnskatinÄntei din, tÅ« mazzi Ärditun twajjan sistÄ“man.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pÄusan|pÄusai}}',
'file-info' => 'zūrbrukes debban: $1, MIME tīps: $2',
'file-info-size' => '$1 × $2 pikselai, zūrbrukes debban: $3, MIME tīps: $4',
-'file-nohires' => '<small>MÅ«isesa rezÅluciÅni ni ast preiÄ“iminan.</small>',
+'file-nohires' => 'MÅ«isesa rezÅluciÅni ni ast preiÄ“iminan.',
'svg-long-desc' => 'SVG zÅ«rbrukis, nÅminalai $1 × $2 pikselai, debban: $3',
'show-big-image' => 'PilnÄ rezÅluciÅni',
'file-info-gif-looped' => 'kalpenintan',
@@ -2574,13 +2544,6 @@ Tu mazzi jÄu [[Special:UserLogin|enÄ“itwei]] be tuldÄ«tun si sen wiki.',
'scarytranscludefailed' => '[Å ablÅnis augausnÄ iz $1 ni izpalla]',
'scarytranscludetoolong' => '[per ilgÄ URL adressi]',
-# Trackbacks
-'trackbackbox' => 'Å isse pÄusas "traceback" pawakÄ«senei:<br />
-$1',
-'trackbackremove' => '([$1 Āupausinais])',
-'trackbacklink' => 'Entensīsenis',
-'trackbackdeleteok' => 'Trackback pastÄi Äupausintan.',
-
# Delete conflict
'deletedwhileediting' => "'''Ä’mpirsergÄ«senis''': Å in pÄusan pastÄi Äupausintan panzdau tÅ« pagaÅ«wa redigÄ«tun!",
'confirmrecreate' => 'TÄ“rpautajs [[User:$1|$1]] ([[User talk:$1|diskusiÅni]]) ast aupausÄ«nuns(si) Å¡in pÄusan, enkÄ“rdai tÅ« pagaÅ«wa redigÄ«tun din sen brewÄ«nslin:
@@ -2754,4 +2717,9 @@ EnpeisÄis zÅ«rbrukes pabilÄ«snan Å¡lÄit "{{ns:file}}:" prefiksan.',
'htmlform-int-toohigh' => 'Enwesta wÄ“rtibi ast aÅ«ktaisin nikÄi maksimum per $1',
'htmlform-selectorother-other' => 'KitÄ',
+# New logging system
+'revdelete-restricted' => 'ensadinnais arÄikinsenins per perwaldÄ«tajans',
+'revdelete-unrestricted' => 'Äupausinais arÄikinsenins per perwaldÄ«tajans',
+'newuserlog-byemail' => 'kliptaswīrds tengīntan pra e-mail',
+
);
diff --git a/languages/messages/MessagesPs.php b/languages/messages/MessagesPs.php
index 838942ef..e4409947 100644
--- a/languages/messages/MessagesPs.php
+++ b/languages/messages/MessagesPs.php
@@ -95,64 +95,64 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'notoc' => array( '0', '__بی‌نيولک__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__بی‌نندارتونه__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__نيوليکداره__', '__FORCETOC__' ),
- 'toc' => array( '0', '__نيوليک__', '__TOC__' ),
- 'noeditsection' => array( '0', '__بی‌برخÛ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'روانه_مياشت', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'دروانÛ_مياشت_نوم', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'دروانÛ_مياشت_لنډون', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'نن', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'نن۲', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'دننÛورÚÛ_نوم', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'سږکال', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'داوخت', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'دم_Ú«Ú“Û', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'سيمه_يزه_مياشت', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'دسيمه_يزÛ_مياشت_نوم', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'دسيمه_يزÛ_مياشت_لنډون', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'سيمه_يزه_ورÚ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'سيمه_يزه_ورÚÛ²', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'دسيمه_يزÛ_ورÚ_نوم', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'سيمه_يزکال', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'سيمه_يزوخت', 'LOCALTIME' ),
- 'localhour' => array( '1', 'سيمه_يزه_Ú«Ú“Û', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'دمخونوشمÛر', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'دليکنوشمÛر', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ددوتنوشمÛر', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'دکارونکوشمÛر', 'NUMBEROFUSERS' ),
- 'pagename' => array( '1', 'دمخ_نوم', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'دمخ_نښه', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'نوم_تشيال', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'د_نوم_تشيال_نښه', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'دخبرواترو_تشيال', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'دخبرواترو_تشيال_نښه', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'دسکالوتشيال', 'دليکنÛ_تشيال', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'دسکالوتشيال_Ù†ÚšÙ‡', 'دليکنÛ_تشيال_Ù†ÚšÙ‡', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'دمخ_بشپړنوم', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'دمخ_بشپړنوم_نښه', 'FULLPAGENAMEE' ),
- 'msg' => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
- 'img_thumbnail' => array( '1', 'بټنوک', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'ÚšÙŠ', 'right' ),
- 'img_left' => array( '1', 'Ú©ÙŠÚ¼', 'left' ),
- 'img_none' => array( '1', 'Ù‡ÛÚ…', 'none' ),
- 'img_center' => array( '1', 'Ù…ÛÙ†ÚØŒ_center', 'center', 'centre' ),
- 'sitename' => array( '1', 'دوÛبÚÙŠ_نوم', 'SITENAME' ),
- 'server' => array( '0', 'پالنګر', 'SERVER' ),
- 'servername' => array( '0', 'دپالنګر_نوم', 'SERVERNAME' ),
- 'grammar' => array( '0', 'ګرامر:', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'روانه_اوونÛ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'داوونÛورÚ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'سيمه_يزه_اوونÛ', 'LOCALWEEK' ),
- 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
- 'language' => array( '0', '#ژبه:', '#LANGUAGE:' ),
- 'special' => array( '0', 'Úانګړی', 'special' ),
- 'hiddencat' => array( '1', '__پټه_ÙˆÛشنيزه__', '__HIDDENCAT__' ),
- 'pagesize' => array( '1', 'مخکچه', 'PAGESIZE' ),
- 'index' => array( '1', '__ليکلړ__', '__INDEX__' ),
- 'noindex' => array( '1', '__بÛ_ليکلړ__', '__NOINDEX__' ),
- 'protectionlevel' => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
+ 'notoc' => array( '0', '__بی‌نيولک__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__بی‌نندارتونه__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__نيوليکداره__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__نيوليک__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__بی‌برخÛ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'روانه_مياشت', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'دروانÛ_مياشت_نوم', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'دروانÛ_مياشت_لنډون', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'نن', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'نن۲', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'دننÛورÚÛ_نوم', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'سږکال', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'داوخت', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'دم_Ú«Ú“Û', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'سيمه_يزه_مياشت', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'دسيمه_يزÛ_مياشت_نوم', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'دسيمه_يزÛ_مياشت_لنډون', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'سيمه_يزه_ورÚ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'سيمه_يزه_ورÚÛ²', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'دسيمه_يزÛ_ورÚ_نوم', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'سيمه_يزکال', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'سيمه_يزوخت', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'سيمه_يزه_Ú«Ú“Û', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'دمخونوشمÛر', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'دليکنوشمÛر', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ددوتنوشمÛر', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'دکارونکوشمÛر', 'NUMBEROFUSERS' ),
+ 'pagename' => array( '1', 'دمخ_نوم', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'دمخ_نښه', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'نوم_تشيال', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'د_نوم_تشيال_نښه', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'دخبرواترو_تشيال', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'دخبرواترو_تشيال_نښه', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'دسکالوتشيال', 'دليکنÛ_تشيال', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'دسکالوتشيال_Ù†ÚšÙ‡', 'دليکنÛ_تشيال_Ù†ÚšÙ‡', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'دمخ_بشپړنوم', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'دمخ_بشپړنوم_نښه', 'FULLPAGENAMEE' ),
+ 'msg' => array( '0', 'پیغام:', 'پ:', 'MSG:' ),
+ 'img_thumbnail' => array( '1', 'بټنوک', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'ÚšÙŠ', 'right' ),
+ 'img_left' => array( '1', 'Ú©ÙŠÚ¼', 'left' ),
+ 'img_none' => array( '1', 'Ù‡ÛÚ…', 'none' ),
+ 'img_center' => array( '1', 'Ù…ÛÙ†ÚØŒ_center', 'center', 'centre' ),
+ 'sitename' => array( '1', 'دوÛبÚÙŠ_نوم', 'SITENAME' ),
+ 'server' => array( '0', 'پالنګر', 'SERVER' ),
+ 'servername' => array( '0', 'دپالنګر_نوم', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'ګرامر:', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'روانه_اوونÛ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'داوونÛورÚ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'سيمه_يزه_اوونÛ', 'LOCALWEEK' ),
+ 'plural' => array( '0', 'جمع:', 'PLURAL:' ),
+ 'language' => array( '0', '#ژبه:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'Úانګړی', 'special' ),
+ 'hiddencat' => array( '1', '__پټه_ÙˆÛشنيزه__', '__HIDDENCAT__' ),
+ 'pagesize' => array( '1', 'مخکچه', 'PAGESIZE' ),
+ 'index' => array( '1', '__ليکلړ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__بÛ_ليکلړ__', '__NOINDEX__' ),
+ 'protectionlevel' => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
);
$rtl = true;
@@ -493,11 +493,12 @@ $1',
'badarticleerror' => 'دا کړنه Ù¾Ø¯Û Ù…Ø® نه شي ترسره Ú©Ûدلای.',
'cannotdelete' => 'د "$1" مخ يا Ø¯ÙˆØªÙ†Û Ú“Ù†Ú«Ûدنه ترسره نه شوه.
Ú©Ûدای شي Ú†Û ÙˆØ§Ø± Ø¯Ù…Ø®Û Ø¯Ø§ کوم بل چا Ú“Ù†Ú«Ù‡ Ú©Ú“Û ÙˆÙŠ.',
+'cannotdelete-title' => 'د "$1" مخ نشي Ú“Ù†Ú«Ûدای',
'badtitle' => 'ناسم سرليک',
'badtitletext' => 'Ø³ØªØ§Ø³Û Ø¯ غوښتل شوي مخ سرليک سم نه وو، يا مو د سرليک Úای تش وو او يا هم د ژبو خپلمنÚÙŠ ØªÚ“Ù†Û Ú…Ø®Ù‡ يا د ويکي ګانو خپلمنÚÙŠ سرليکونو څخه يو ناسم توری مو Ù¾Ú©Û Ú©Ø§Ø±ÙˆÙ„ÛŒ وي.
Ú©Ûدای شي Ú†Û Ø³ØªØ§Ø³Û Ù¾Ù‡ ورکړ شوي سرليک Ú©Û ÙŠÙˆ يا Ú…Ùˆ Ø¯Ø§Ø³Û ØªÙˆØ±ÙŠ وي Ú†Û Ø¯ سرليک په توګه بايد Ùˆ نه کارÛÚ–ÙŠ.',
'viewsource' => 'سرچينه کتل',
-'viewsourcefor' => 'د $1 لپاره',
+'viewsource-title' => 'د $1 سرچينه کتل',
'actionthrottled' => 'د Ø¯Û Ú©Ú“Ù†Û Ù…Ø®Ù†ÙŠÙˆÛŒ وشو',
'protectedpagetext' => 'دا مخ د بدلون او سمون د مخنيوي په تکل تړل شوی دی.',
'viewsourcetext' => 'ØªØ§Ø³Û Ø¯ Ø¯Û Ù…Ø® سرچينه کتلی او لمÛسلی Ø´ÛŒ:',
@@ -598,6 +599,7 @@ $1',
'emailconfirmlink' => 'د خپل د برÛښليک Ù¾ØªÛ Ù¾Ø®Ù„ÛŒ ÙˆÚ©Ú“ÛŒ',
'invalidemailaddress' => 'دا برÛښليک پته نه منل Ú©ÛÚ–ÙŠØŒ دا ÚÚ©Ù‡ Ú†Û Ø¯Ø§ پته يوه ناکره بڼه لري.
لطÙاً د ÙŠÙˆÛ Ú©Ø±Ù‡ Ø¨Ú¼Û Ù¾ØªÙ‡ ÙˆÙ„ÙŠÚ©Û Ø§Ùˆ يا هم دا Úای تش پرÛږدÛ.',
+'cannotchangeemail' => 'Ù¾Ø¯Û ÙˆÙŠÚ©ÙŠ Ú©Û Ø¯ ګڼون برÛښليک Ù¾ØªÛ Ù†Ø´ÙŠ بدلÛدلی.',
'accountcreated' => 'ګڼون مو جوړ شو.',
'accountcreatedtext' => 'د $1 لپاره يو ګڼون جوړ شو.',
'createaccount-title' => 'د {{SITENAME}} د ګڼون جوړÛدنه',
@@ -636,6 +638,14 @@ $1',
لنډمهاله پټنوم: $2',
'passwordreset-emailsent' => 'يو يادښتي برÛښليک ولÛÚ–Ù„ شو.',
+# Special:ChangeEmail
+'changeemail' => 'برÛښليک پته بدلول',
+'changeemail-oldemail' => 'Ø§ÙˆØ³Ù†Û Ø¨Ø±Ûښليک پته:',
+'changeemail-newemail' => 'Ù†ÙˆÛ Ø¨Ø±Ûښليک پته:',
+'changeemail-none' => '(Ù‡ÛÚ…)',
+'changeemail-submit' => 'برÛښليک بدلول',
+'changeemail-cancel' => 'ناګارل',
+
# Edit page toolbar
'bold_sample' => 'زغرد متن',
'bold_tip' => 'زغرد متن',
@@ -697,8 +707,6 @@ $1',
Ø³ØªØ§Ø³Û IP پته $3 ده او Ø³ØªØ§Ø³Û Ø¯ بنديز Ù¾Ûژند #$5 دی.
د بنديز اړونده د اړيکو نيولو په وخت Ú©Û Ù„Ø·Ùاً د پورتني مالوماتو يادونه ÙˆÚ©Ú“Û.',
'blockednoreason' => 'Ù‡ÛÚ… سبب نه دی ورکړ شوی',
-'blockedoriginalsource' => "د '''$1''' Ø³Ø±Ú†ÙŠÙ†Û Ù„Ø§Ù†Ø¯Û ÚšÙˆØ¯Ù„ شوي:",
-'whitelistedittitle' => 'Ú©Ù‡ د سمادولو تکل لری نو بايد غونډال ته ورننوÚÛ.',
'whitelistedittext' => 'Ø¯Ø¯Û Ù„Ù¾Ø§Ø±Ù‡ Ú†Û Ø³Ù…Ø§Ø¯ÙˆÙ„ ترسره Ú©Ú“ÛŒ تاسو بايد $1.',
'nosuchsectiontitle' => 'برخه و نه موندل شوه',
'nosuchsectiontext' => 'ØªØ§Ø³Û Ø¯ ÙŠÙˆÛ Ø¯Ø§Ø³Û Ø¨Ø±Ø®Û Ø¯ سمون Ù‡Ú…Ù‡ Ú©Ú“Û Ú†Û ØªØ± اوسه Ù¾ÙˆØ±Û Ù†Ø´ØªÙ‡.
@@ -853,11 +861,6 @@ $1',
'revdel-restore-visible' => 'ښکاره بڼÛ',
'pagehist' => 'د مخ Ù¾Ûښليک',
'deletedhist' => 'د ړنګولو Ù¾Ûښليک',
-'revdelete-content' => 'Ù…ÛÙ†Úپانګه',
-'revdelete-summary' => 'لنډيز سمول',
-'revdelete-uname' => 'کارن-نوم',
-'revdelete-hid' => '$1 پټول',
-'revdelete-unhid' => '$1 ښکاره کول',
'revdelete-reason-dropdown' => '*د ړنګولو ټولګړي سببونه
** د خپرÛدو د رښتو سرغړونه
** ناسم شخصي مالومات
@@ -976,10 +979,12 @@ $1',
'prefs-rc' => 'وروستي بدلونونه',
'prefs-watchlist' => 'کتنلړ',
'prefs-watchlist-days' => 'د ورÚÙˆ شمÛر Ú†Û Ù¾Ù‡ کتلي لړليک Ú©Û Ø¨Ù‡ ښکاري:',
-'prefs-watchlist-days-max' => 'اکثر بريد 7 ورÚÛ',
+'prefs-watchlist-days-max' => 'حد اکثر $1 {{PLURAL:$1|ورÚ|ورÚÛ}}',
'prefs-watchlist-edits-max' => 'د شمÛر اکثر بريد: 1000',
'prefs-misc' => 'بÛلابÛÙ„',
'prefs-resetpass' => 'پټنوم بدلول',
+'prefs-changeemail' => 'برÛښليک بدلول',
+'prefs-setemail' => 'يوه برÛښليک پته ورکړÛ',
'prefs-email' => 'د برÛښليک خوښنÛ',
'prefs-rendering' => 'ښکارÛدنه',
'saveprefs' => 'خوندي کول',
@@ -1151,6 +1156,7 @@ $1',
'action-block' => 'پر Ø¯Û Ú©Ø§Ø±Ù† د سمون د آسانتياوؤ بنديز لګول',
'action-protect' => 'د Ø¯Û Ù…Ø® د Ú˜ØºÙˆØ±Ù†Û Ú©Ú†Ù‡ بدلول',
'action-userrights' => 'د کارن Ù¼ÙˆÙ„Û Ø±ÚšØªÛ Ø³Ù…ÙˆÙ„',
+'action-sendemail' => 'برÛښليکونه Ù„ÛÚ–Ù„',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
@@ -1437,7 +1443,7 @@ $1',
'listusers-editsonly' => 'ÙŠÙˆØ§Ø²Û Ù‡ØºÙ‡ کارنان Ú†Û Ø³Ù…ÙˆÙ†ÙˆÙ†Ù‡ ÙŠÛ Ú©Ú“ÙŠ ښکاره کول',
'listusers-creationsort' => 'د جوړÛدو د Ù†ÛÙ¼Û Ù„Ù‡ Ù…Ø®Û Ø§ÙˆÚ‰Ù„',
'usereditcount' => '{{PLURAL:$1|سمون|سمونونه}}',
-'usercreated' => 'په $1 Ù†Ûټه په $2 بجو جوړ شو',
+'usercreated' => 'په $1 Ù†Ûټه په $2 بجو {{GENDER:$3|جوړ شو}}',
'newpages' => 'نوي مخونه',
'newpages-username' => 'کارن-نوم:',
'ancientpages' => 'تر ټولو زاړه مخونه',
@@ -1513,12 +1519,8 @@ $1',
'activeusers-noresult' => 'کارن و نه موندل شو.',
# Special:Log/newusers
-'newuserlogpage' => 'د کارن-نوم د جوړÛدو يادښت',
-'newuserlogpagetext' => 'دا د کارن-نوم د جوړÛدو يادښت دی',
-'newuserlog-byemail' => 'پټنوم مو برÛښليک ته درولÛÚ–Ù‡',
-'newuserlog-create-entry' => 'نوی کارن',
-'newuserlog-create2-entry' => 'نوی جوړ شوی ګڼون $1',
-'newuserlog-autocreate-entry' => 'ګڼون په اتوماتيک ډول جوړ شو',
+'newuserlogpage' => 'د کارن-نوم د جوړÛدو يادښت',
+'newuserlogpagetext' => 'دا د کارن-نوم د جوړÛدو يادښت دی',
# Special:ListGroupRights
'listgrouprights' => 'د کارن ډلو رښتÛ',
@@ -1539,7 +1541,7 @@ $1',
'mailnologin' => 'Ù‡ÛÚ… کومه Ù„ÛÚ–Ù„ Ø´ÙˆÛ Ù¾ØªÙ‡ نشته',
'emailuser' => 'کارن ته برÛښليک Ù„ÛÚ–Ù„',
'emailpage' => 'کارن ته برÛښليک Ù„ÛÚ–Ù„',
-'defemailsubject' => 'د {{SITENAME}} برÛښليک',
+'defemailsubject' => 'د "$1" کارن لخوا د {{SITENAME}} برÛښليک',
'usermaildisabled' => 'د کارن برÛښليک ناچارند دی',
'usermaildisabledtext' => 'په Ø¯Û ÙˆÙŠÚ©ÙŠ ØªØ§Ø³Û Ù†ÙˆØ±Ùˆ کارنانو ته برÛښليک نه Ø´ÛŒ ورلÛÚ–Ù„ÛŒ',
'noemailtitle' => 'Ù‡ÛÚ… کومه برÛښليک پته نشته.',
@@ -1649,8 +1651,6 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'actionfailed' => 'کړنه Ù†Ø§Ø¨Ø±ÙŠØ§Ù„Û Ø´ÙˆÙ‡',
'deletedtext' => '"$1" ړنګ شوی.
د نوو Ú“Ù†Ú« شوو سوانحو لپاره $2 وګورÛ.',
-'deletedarticle' => '"[[$1]]" ړنګ شو',
-'suppressedarticle' => 'Úپلی "[[$1]]"',
'dellogpage' => 'د ړنګولو يادښت',
'dellogpagetext' => 'دا Ù„Ø§Ù†Ø¯Û Ø¯ نوو Ú“Ù†Ú« شوو کړنو لړليک دی.',
'deletionlog' => 'د ړنګولو يادښت',
@@ -1689,6 +1689,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'protect-level-sysop' => 'يواÚÛ Ù¾Ø§Ø²ÙˆØ§Ù„Ø§Ù†',
'protect-summary-cascade' => 'Úوړاوبيز',
'protect-expiring' => 'په $1 (UTC) پای ته رسÛÚ–ÙŠ',
+'protect-expiring-local' => 'پای Ù†Ûټه $1',
'protect-expiry-indefinite' => 'لامحدوده',
'protect-cascade' => 'په Ù‡Ù…Ø¯Û Ù…Ø® Ú©Û Ø¯ ټولو Ú«Ú‰Ùˆ مخونو نه ژغورنه Ú©ÛÚ–ÙŠ (Úوړاوبيزه ژغورنه)',
'protect-cantedit' => 'ØªØ§Ø³Û Ù†Ù‡ Ø´ÛŒ کولای Ú†Û Ø¯ Ø¯Û Ù…Ø® د Ú˜ØºÙˆØ±Ù†Û Ù¾Ù‡ Ú©Ú†Ù‡ Ú©Û Ø¨Ø¯Ù„ÙˆÙ† راولی، دا ÚÚ©Ù‡ Ú†Û ØªØ§Ø³Û Ø¯ Ø¯Û Ù…Ø® د سمولو اجازه نه لری.',
@@ -1729,7 +1730,6 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'undeletereset' => 'بياايښودل',
'undeleteinvert' => 'Ù¼Ø§Ú©Ù†Û Ø³Ø±Ú†Ù¾Ù‡ کول',
'undeletecomment' => 'سبب:',
-'undeletedarticle' => '"[[$1]]" بÛرته پرÚای شو',
'undeletedfiles' => '{{PLURAL:$1|1 دوتنه بيازÛرمه شوه|$1 Ø¯ÙˆØªÙ†Û Ø¨ÙŠØ§Ø²Ûرمه شوÛ}}',
'undelete-search-box' => 'ړنګ شوي مخونه لټول',
'undelete-search-prefix' => 'هغه مخونه ښکاره Ú©Ú“Ù‡ Ú†Û Ù¾ÛÙ„ÛÚ–ÙŠ په:',
@@ -1843,6 +1843,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'unblocklink' => 'بنديز Ù„Ø±Û Ú©ÙˆÙ„',
'change-blocklink' => 'د بنديز بدلون',
'contribslink' => 'ونډÛ',
+'emaillink' => 'برÛښليک Ù„ÛÚ–Ù„',
'autoblocker' => 'په اتوماتيک ډول ستاسو مخنيوی شوی دا ÚÚ©Ù‡ Ú†Û Ø³ØªØ§Ø³Ùˆ IP پته وروستی ÚÙ„ د "[[User:$1|$1]]" له خوا کارÛدلÛ. او د $1 د مخنيوي سبب دا دی: "$2"',
'blocklogpage' => 'د مخنيوي يادښت',
'blocklogentry' => 'په [[$1]] بنديز Ù„Ú«Ûدلی Ú†Û Ø¯ بنديز د پای وخت ÙŠÛ $2 $3 دی',
@@ -1901,8 +1902,6 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
لطÙا٠د خبرواترو دا دواړه مخونه په لاسي توګه سره يو Úای Ú©Ú“ÛŒ.'''",
'movedto' => 'ته ولÛږدول شو',
'movetalk' => 'د خبرو اترو اړونده مخ ورسره Ù„Ûږدول',
-'1movedto2' => '[[$1]]ØŒ [[$2]] ته ولÛږدÛده',
-'1movedto2_redir' => '[[$1]] د [[$2]] مخ ته د مخ ګرÚÙˆÙ†Û Ù¾Ù‡ توګه ولÛږدÛده',
'movelogpage' => 'د Ù„Ûږدولو يادښت',
'movelogpagetext' => 'دا Ù„Ø§Ù†Ø¯Û Ø¯ Ù„Ûږدول شوو مخونو لړليک دی.',
'movesubpage' => '{{PLURAL:$1|Ú…Ûرمه مخ|Ú…Ûرمه مخونه}}',
@@ -2056,10 +2055,6 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
# Patrolling
'markaspatrolledtext' => 'دا مخ څارل شوی په نخښه کول',
-# Patrol log
-'patrol-log-auto' => '(خپلسر)',
-'patrol-log-diff' => 'بڼه $1',
-
# Image deletion
'filedeleteerror-short' => 'د Ø¯ÙˆØªÙ†Û Ø¯ ړنګولو ستونزه: $1',
@@ -2071,7 +2066,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'thumbsize' => 'د بټنوک کچه:',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|مخ|مخونه}}',
'file-info-size' => '$1 × $2 Ù¾Ûکسل, د Ø¯ÙˆØªÙ†Û Ú©Ú†Ù‡: $3, MIME بڼه: $4',
-'file-nohires' => '<small>تر Ø¯Û Ú©Ú†Û Ù„ÙˆÚ“Û Ø¨Ûلن Ù†ÚšÛ Ù†Ø´ØªÙ‡.</small>',
+'file-nohires' => 'تر Ø¯Û Ú©Ú†Û Ù„ÙˆÚ“Û Ø¨Ûلن Ù†ÚšÛ Ù†Ø´ØªÙ‡.',
'svg-long-desc' => 'SVG دوتنه، نومÛنلي $1 × $2 Ù¾Ûکسل، د Ø¯ÙˆØªÙ†Û Ú©Ú†Ù‡: $3',
'show-big-image' => 'بشپړ بÛلن Ù†ÚšÛ',
'file-info-gif-frames' => '$1 {{PLURAL:$1|چوکاټ|چوکاټونه}}',
@@ -2090,7 +2085,12 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'sp-newimages-showfrom' => 'هغه Ù†ÙˆÛ Ø¯ÙˆØªÙ†Û Ú†Û Ù¾Ù‡ $1 په $2 بجو پيلÛÚ–ÙŠ ښکاره کول',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'ساعتونه',
+'hours-abbrev' => '$1Ú«',
+'seconds' => '{{PLURAL:$1|$1 ثانيه|$1 ثانيÛ}}',
+'minutes' => '{{PLURAL:$1|$1 دقيقه|$1 دقيقÛ}}',
+'hours' => '{{PLURAL:$1|$1 ساعت|$1 ساعتونه}}',
+'days' => '{{PLURAL:$1|$1 ورÚ|$1 ورÚÛ}}',
+'ago' => '$1 دمخه',
# Bad image list
'bad_image_list' => 'بڼه ÙŠÛ Ù¾Ù‡ Ù„Ø§Ù†Ø¯Û ØªÙˆÚ«Ù‡ ده:
@@ -2315,9 +2315,6 @@ $5
# Scary transclusion
'scarytranscludetoolong' => '[URL مو Ú‰Ûر اوږد دی]',
-# Trackbacks
-'trackbackremove' => '([$1 ړنګول])',
-
# Delete conflict
'recreate' => 'بياجوړول',
@@ -2485,4 +2482,29 @@ $5
'htmlform-reset' => 'بدلونونه ناکړل',
'htmlform-selectorother-other' => 'بل',
+# New logging system
+'logentry-delete-delete' => '$1 د $3 مخ ړنګ کړ',
+'revdelete-content-hid' => 'Ù…ÛÙ†Úپانګه پټÛدلÛ',
+'revdelete-uname-hid' => 'کارن نوم پټ شوی',
+'revdelete-content-unhid' => 'Ù…ÛÙ†Úپانګه ښکاره شوی',
+'revdelete-uname-unhid' => 'ښکاره کارن-نوم',
+'logentry-move-move' => '$1 د $3 مخ $4 ته ولÛږداوه',
+'logentry-newusers-newusers' => '$1 يو کارن ګڼون جوړ کړ',
+'logentry-newusers-create' => '$1 يو کارن ګڼون جوړ کړ',
+'newuserlog-byemail' => 'پټنوم مو برÛښليک ته درولÛÚ–Ù‡',
+
+# Feedback
+'feedback-subject' => 'سکالو:',
+'feedback-message' => 'پيغام:',
+'feedback-cancel' => 'ناګارل',
+'feedback-close' => 'ترسره شو',
+
+# API errors
+'api-error-empty-file' => 'کومه دوتنه Ú†Û ØªØ§Ø³Û Ø¯Ù„ØªÙ‡ Ø³Ù¾Ø§Ø±Ù„Û Ù‡ØºÙ‡ تشه ده.',
+'api-error-file-too-large' => 'کومه دوتنه Ú†Û ØªØ§Ø³Û Ø¯Ù„ØªÙ‡ Ø³Ù¾Ø§Ø±Ù„Û Ú‰Ûره لويه ده.',
+'api-error-filename-tooshort' => 'د Ø¯ÙˆØªÙ†Û Ù†ÙˆÙ… Ú‰Ûر لنډ دی.',
+'api-error-filetype-banned' => 'په Ø¯Û Ú‰ÙˆÙ„ Ø¯ÙˆØªÙ†Û Ø¨Ù†Ø¯ÙŠØ² دی.',
+'api-error-illegal-filename' => 'د Ø¯ÙˆØªÙ†Û Ù†ÙˆÙ… نه دی پرÛÚšÙ„ شوی.',
+'api-error-unknown-code' => 'ناڅرګنده تÛروتنه: "$1"',
+
);
diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php
index c1db1842..b12cfc48 100644
--- a/languages/messages/MessagesPt.php
+++ b/languages/messages/MessagesPt.php
@@ -8,6 +8,7 @@
* @file
*
* @author Alchimista
+ * @author Andresilvazito
* @author Capmo
* @author Crazymadlover
* @author Daemorris
@@ -22,6 +23,7 @@
* @author Kaganer
* @author Leonardo.stabile
* @author Lijealso
+ * @author Luckas Blade
* @author Lugusto
* @author MCruz
* @author MF-Warburg
@@ -39,6 +41,7 @@
* @author Remember the dot
* @author RmSilva
* @author Rodrigo Calanca Nishino
+ * @author SandroHc
* @author Sir Lestaty de Lioncourt
* @author Sérgio Ribeiro
* @author Urhixidur
@@ -49,6 +52,8 @@
* @author 555
*/
+$fallback = 'pt-br';
+
$namespaceNames = array(
NS_MEDIA => 'Multimédia',
NS_SPECIAL => 'Especial',
@@ -98,6 +103,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Todas_as_mensagens', 'Todas_mensagens' ),
'Allpages' => array( 'Todas_as_páginas', 'Todos_os_artigos', 'Todas_páginas', 'Todos_artigos' ),
'Ancientpages' => array( 'Páginas_inactivas', 'Páginas_inativas', 'Artigos_inativos' ),
+ 'Badtitle' => array( 'Título_inválido' ),
'Blankpage' => array( 'Página_em_branco' ),
'Block' => array( 'Bloquear', 'Bloquear_IP', 'Bloquear_utilizador', 'Bloquear_usuário' ),
'Blockme' => array( 'Bloquear-me', 'Auto-bloqueio' ),
@@ -105,6 +111,7 @@ $specialPageAliases = array(
'BrokenRedirects' => array( 'Redireccionamentos_quebrados', 'Redirecionamentos_quebrados' ),
'Categories' => array( 'Categorias' ),
'ChangePassword' => array( 'Reiniciar_palavra-chave', 'Repor_senha', 'Zerar_senha' ),
+ 'ComparePages' => array( 'Comparar_páginas' ),
'Confirmemail' => array( 'Confirmar_correio_electrónico', 'Confirmar_e-mail', 'Confirmar_email' ),
'Contributions' => array( 'Contribuições' ),
'CreateAccount' => array( 'Criar_conta' ),
@@ -112,6 +119,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Contribuições_eliminadas', 'Edições_eliminadas' ),
'Disambiguations' => array( 'Desambiguações', 'Páginas_de_desambiguação', 'Desambiguar' ),
'DoubleRedirects' => array( 'Redireccionamentos_duplos', 'Redirecionamentos_duplos' ),
+ 'EditWatchlist' => array( 'Editar_lista_de_páginas_vigiadas' ),
'Emailuser' => array( 'Contactar_utilizador', 'Contactar_usuário', 'Contatar_usuário' ),
'Export' => array( 'Exportar' ),
'Fewestrevisions' => array( 'Páginas_com_menos_edições', 'Artigos_com_menos_edições', 'Artigos_menos_editados' ),
@@ -186,117 +194,117 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
- 'notoc' => array( '0', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
- 'toc' => array( '0', '__TDC__', '__SUMÃRIO__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'DIALOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÃRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÃGINAC', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'DOMINIOC', 'DOMÃNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'PAGINADEDISCUSSAO', 'PÃGINADEDISCUSSÃO', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'PAGINADEDISCUSSAOC', 'PÃGINADEDISCUSSÃOC', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÃGINAC', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÃGINAC', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÃGINABASEC', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÃGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÃGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÃGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'img_thumbnail' => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'direita', 'right' ),
- 'img_left' => array( '1', 'esquerda', 'left' ),
- 'img_none' => array( '1', 'nenhum', 'none' ),
- 'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_framed' => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'semmoldura', 'semborda', 'frameless' ),
- 'img_page' => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'borda', 'border' ),
- 'img_baseline' => array( '1', 'linhadebase', 'baseline' ),
- 'img_top' => array( '1', 'acima', 'top' ),
- 'img_middle' => array( '1', 'meio', 'middle' ),
- 'img_bottom' => array( '1', 'abaixo', 'bottom' ),
- 'img_link' => array( '1', 'ligação=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NOMEDOSITE', 'NOMEDOSÃTIO', 'NOMEDOSITIO', 'SITENAME' ),
- 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
- 'servername' => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
- 'gender' => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÃTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
- 'revisionuser' => array( '1', 'USUARIODAREVISAO', 'USUÃRIODAREVISÃO', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
- 'uc' => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
- 'displaytitle' => array( '1', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
- 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAGINASNOESPACONOMINAL', 'PÃGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÃGINASNODOMÃNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
- 'defaultsort' => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEXAR__', '__INDEX__' ),
- 'noindex' => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVELDEPROTECAO', 'NÃVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
+ 'notoc' => array( '0', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__TDC__', '__SUMÃRIO__', '__SUMARIO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'DIALOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÃRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÃGINAC', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'DOMINIOC', 'DOMÃNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'PAGINADEDISCUSSAO', 'PÃGINADEDISCUSSÃO', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'PAGINADEDISCUSSAOC', 'PÃGINADEDISCUSSÃOC', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÃGINAC', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÃGINAC', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÃGINABASEC', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÃGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÃGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÃGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'direita', 'right' ),
+ 'img_left' => array( '1', 'esquerda', 'left' ),
+ 'img_none' => array( '1', 'nenhum', 'none' ),
+ 'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'semmoldura', 'semborda', 'frameless' ),
+ 'img_page' => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'borda', 'border' ),
+ 'img_baseline' => array( '1', 'linhadebase', 'baseline' ),
+ 'img_top' => array( '1', 'acima', 'top' ),
+ 'img_middle' => array( '1', 'meio', 'middle' ),
+ 'img_bottom' => array( '1', 'abaixo', 'bottom' ),
+ 'img_link' => array( '1', 'ligação=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NOMEDOSITE', 'NOMEDOSÃTIO', 'NOMEDOSITIO', 'SITENAME' ),
+ 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
+ 'servername' => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
+ 'gender' => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÃTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
+ 'revisionuser' => array( '1', 'USUARIODAREVISAO', 'USUÃRIODAREVISÃO', 'REVISIONUSER' ),
+ 'fullurl' => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
+ 'uc' => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
+ 'displaytitle' => array( '1', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
+ 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAGINASNOESPACONOMINAL', 'PÃGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÃGINASNODOMÃNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
+ 'defaultsort' => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEXAR__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVELDEPROTECAO', 'NÃVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
);
$messages = array(
@@ -659,22 +667,24 @@ Anote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrado
'badarticleerror' => 'Esta operação não pode ser realizada nesta página.',
'cannotdelete' => 'Não foi possível eliminar a página ou ficheiro "$1".
Pode já ter sido eliminado por outro utilizador.',
+'cannotdelete-title' => 'Não é possível eliminar 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.',
-'perfcached' => "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar actualizados.",
-'perfcachedts' => "Os seguintes dados encontram-se armazenados na ''cache'' e foram actualizados pela última vez a $1.",
+'perfcached' => "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar actualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
+'perfcachedts' => "Os seguintes dados encontram-se armazenados na ''cache'' e foram actualizados pela última vez a $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'As actualizações estão presentemente desactivadas para esta página.
Por enquanto, os dados aqui presentes não poderão ser actualizados.',
'wrong_wfQuery_params' => 'Parâmetros incorrectos para wfQuery()<br />
Função: $1<br />
Consulta: $2',
'viewsource' => 'Ver conteúdo',
-'viewsourcefor' => 'para $1',
+'viewsource-title' => 'Mostrar código-fonte de $1',
'actionthrottled' => 'Operação limitada',
'actionthrottledtext' => 'Como medida anti-spam, está impedido de realizar esta operação demasiadas vezes num espaço de tempo curto e já excedeu esse limite. Tente de novo dentro de alguns minutos, por favor.',
'protectedpagetext' => 'Esta página foi protegida contra novas edições.',
'viewsourcetext' => 'Pode ver e copiar o conteúdo desta página:',
+'viewyourtext' => "Você pode ver e copiar o código-fonte das '''suas edições''' a esta 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 afectarã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 projecto destinado à tradução do MediaWiki.",
'sqlhidden' => '(Consulta SQL em segundo-plano)',
@@ -778,6 +788,7 @@ Não serão enviados correios de nenhuma das seguintes funcionalidades.',
'emailconfirmlink' => 'Confirme o seu endereço de correio electrónico',
'invalidemailaddress' => 'O endereço de correio electrónico não pode ser aceite porque parece ter um formato inválido.
Introduza um endereço formatado correctamente ou deixe o campo vazio.',
+'cannotchangeemail' => 'A conta de e-mail não pode ser alterado nesta wiki.',
'accountcreated' => 'Conta criada',
'accountcreatedtext' => 'A conta de utilizador para $1 foi criada.',
'createaccount-title' => 'Criação de conta na {{SITENAME}}',
@@ -794,6 +805,7 @@ Aguarde antes de tentar novamente, por favor.',
# E-mail sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
+'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de correio electrónico',
# Change password dialog
'resetpass' => 'Alterar palavra-chave',
@@ -815,28 +827,43 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
'resetpass-temp-password' => 'Palavra-chave temporária:',
# Special:PasswordReset
-'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
-'passwordreset-legend' => 'Reiniciar a palavra-chave',
-'passwordreset-disabled' => 'Reiniciar a palavra-chave foi impossibilitado nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
-'passwordreset-username' => 'Nome de utilizador:',
-'passwordreset-domain' => 'Domínio:',
-'passwordreset-email' => 'Correio electrónico:',
-'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguém, provavelmente você a partir do endereço IP $1, pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este correio electrónico:
+'passwordreset' => 'Repor palavra-chave',
+'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
+'passwordreset-legend' => 'Reiniciar a palavra-chave',
+'passwordreset-disabled' => 'Reiniciar a palavra-chave foi impossibilitado nesta wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-username' => 'Nome de utilizador:',
+'passwordreset-domain' => 'Domínio:',
+'passwordreset-capture' => 'Ver o email resultante?',
+'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o utilizador.',
+'passwordreset-email' => 'Correio electrónico:',
+'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Alguém, provavelmente você a partir do endereço IP $1, pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este correio electrónico:
$2
{{PLURAL:$3|Esta palavra-chave temporária irá|Estas palavras-chave temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma palavra-chave nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua palavra-chave original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-chave antiga.',
-'passwordreset-emailtext-user' => 'O utilizador $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este correio electrónico:
+'passwordreset-emailtext-user' => 'O utilizador $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este correio electrónico:
$2
{{PLURAL:$3|Esta palavra-chave temporária irá|Estas palavras-chave temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma palavra-chave nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua palavra-chave original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-chave antiga.',
-'passwordreset-emailelement' => 'Utilizador: $1
+'passwordreset-emailelement' => 'Utilizador: $1
Palavra-chave temporária: $2',
-'passwordreset-emailsent' => 'Foi enviado um correio electrónico de recuperação dos dados da conta.',
+'passwordreset-emailsent' => 'Foi enviado um correio electrónico de recuperação dos dados da conta.',
+'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 utilizador: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Alterar o endereço de correio electrónico',
+'changeemail-header' => 'Alterar o endereço de correio electrónico da conta',
+'changeemail-text' => 'Preencha este formulário para alterar o endereço de correio electrónico. Para confirmar esta alteração terá de introduzir a sua palavra-chave.',
+'changeemail-no-info' => 'Para aceder directamente a esta página tem de estar autenticado.',
+'changeemail-oldemail' => 'Correio electrónico actual:',
+'changeemail-newemail' => 'Correio electrónico novo:',
+'changeemail-none' => '(nenhum)',
+'changeemail-submit' => 'Alterar correio electrónico',
+'changeemail-cancel' => 'Cancelar',
# Edit page toolbar
'bold_sample' => 'Texto a negrito',
@@ -910,9 +937,6 @@ Note que para utilizar a funcionalidade "Contactar utilizador" precisa de ter um
O seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.
Inclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.',
'blockednoreason' => 'sem motivo especificado',
-'blockedoriginalsource' => "O código de '''$1''' é mostrado abaixo:",
-'blockededitsource' => "O texto das '''suas edições''' em '''$1''' é mostrado abaixo:",
-'whitelistedittitle' => 'É necessário autenticar-se para editar páginas',
'whitelistedittext' => 'Precisa de $1 para poder editar páginas.',
'confirmedittext' => 'Precisa de confirmar o seu endereço de correio electrónico antes de começar a editar páginas.
Introduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.',
@@ -1005,8 +1029,8 @@ Garante-nos também que isto é algo escrito por si, ou copiado do domínio púb
Se não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />
Garante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre (consulte $1 para mais detalhes).<br />
'''Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!'''",
-'longpageerror' => "'''Erro: O texto que submeteu ocupa $1 KB, um espaço superior ao máximo de $2 KB.
-A página não pode ser gravada.'''",
+'longpageerror' => "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''
+A página não pode ser gravada.",
'readonlywarning' => "'''Aviso: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar a sua edição neste momento.'''
Pode, no entanto, copiar o seu texto para um editor externo e guardá-lo para posterior submissão.
@@ -1178,8 +1202,6 @@ Outros administradores da {{SITENAME}} continuarão a poder aceder ao conteúdo
'revdelete-unsuppress' => 'Remover restrições das revisões restauradas',
'revdelete-log' => 'Motivo:',
'revdelete-submit' => 'Aplicar {{PLURAL:$1|à revisão seleccionada|às revisões seleccionadas}}',
-'revdelete-logentry' => 'alterou a visibilidade das revisões de "[[$1]]"',
-'logdelete-logentry' => 'alterou a visibilidade dos eventos de "[[$1]]"',
'revdelete-success' => "'''A visibilidade da revisão foi actualizada.'''",
'revdelete-failure' => "'''A visibilidade da revisão não foi actualizada:'''
$1",
@@ -1191,15 +1213,6 @@ $1",
'revdel-restore-visible' => 'revisões visíveis',
'pagehist' => 'Histórico da página',
'deletedhist' => 'Histórico de eliminações',
-'revdelete-content' => 'conteúdo',
-'revdelete-summary' => 'resumo da edição',
-'revdelete-uname' => 'nome de utilizador',
-'revdelete-restricted' => 'restrições a administradores aplicadas',
-'revdelete-unrestricted' => 'restrições a administradores removidas',
-'revdelete-hid' => 'ocultou $1',
-'revdelete-unhid' => 'desocultou $1',
-'revdelete-log-message' => '$1 para $2 {{PLURAL:$2|revisão|revisões}}',
-'logdelete-log-message' => '$1 para $2 {{PLURAL:$2|evento|eventos}}',
'revdelete-hide-current' => 'Erro ao ocultar o item datado de $2, $1: esta é a revisão actual.
Não pode ser ocultada.',
'revdelete-show-no-access' => 'Erro ao mostrar o item datado de $2, $1: este item foi marcado como "restrito".
@@ -1360,12 +1373,14 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
'prefs-rc' => 'Mudanças recentes',
'prefs-watchlist' => 'Páginas vigiadas',
'prefs-watchlist-days' => 'Dias a mostrar nas mudanças às páginas vigiadas:',
-'prefs-watchlist-days-max' => 'Máximo: 7 dias',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Número de edições a mostrar na listagem expandida:',
'prefs-watchlist-edits-max' => 'Máximo: 1000',
'prefs-watchlist-token' => 'Senha secreta da lista de {{lc:{{int:watchlist}}}}:',
'prefs-misc' => 'Diversos',
'prefs-resetpass' => 'Alterar palavra-chave',
+'prefs-changeemail' => 'Alterar correio electrónico',
+'prefs-setemail' => 'Definir um endereço de correio electrónico',
'prefs-email' => 'Opções do correio electrónico',
'prefs-rendering' => 'Aparência',
'saveprefs' => 'Gravar',
@@ -1426,6 +1441,7 @@ Esta operação não pode ser desfeita.',
'yourrealname' => 'Nome verdadeiro:',
'yourlanguage' => 'Língua:',
'yourvariant' => 'Variante da língua de conteúdo:',
+'prefs-help-variant' => 'A tua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.',
'yournick' => 'Assinatura:',
'prefs-help-signature' => 'Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles "<nowiki>~~~~</nowiki>" no fim dos comentários. Ao gravar, estes serão convertidos na sua assinatura mais a data e a hora da edição.',
'badsig' => 'Assinatura inválida; verifique o código HTML utilizado.',
@@ -1466,7 +1482,7 @@ Esta informação será pública.',
'userrights-lookup-user' => 'Gerir grupos do utilizador',
'userrights-user-editname' => 'Introduza um nome de utilizador:',
'editusergroup' => 'Editar grupos do utilizador',
-'editinguser' => "A modificar os privilégios do utilizador '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "A modificar os privilégios do utilizador '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Editar grupos do utilizador',
'saveusergroups' => 'Gravar grupos do utilizador',
'userrights-groupsmember' => 'Membro de:',
@@ -1560,13 +1576,13 @@ Esta informação será pública.',
'right-autopatrol' => 'Ter edições automaticamente marcadas como patrulhadas',
'right-patrolmarks' => 'Usar funcionalidades de patrulhagem das mudanças recentes',
'right-unwatchedpages' => 'Ver uma lista de páginas não vigiadas',
-'right-trackback' => "Submeter um ''trackback''",
'right-mergehistory' => 'Fundir o histórico de edições de páginas',
'right-userrights' => 'Editar todos os privilégios de utilizador',
'right-userrights-interwiki' => 'Editar privilégios de utilizadores noutras wikis',
'right-siteadmin' => 'Bloquear e desbloquear a base de dados',
'right-override-export-depth' => 'Exportar páginas incluindo páginas ligadas até uma profundidade de 5',
'right-sendemail' => 'Enviar correio electrónico a outros utilizadores',
+'right-passwordreset' => 'Ver emails de reposição de palavras-chave',
# User rights log
'rightslog' => 'Registo de privilégios de utilizador',
@@ -1600,16 +1616,17 @@ Esta informação será pública.',
'action-suppressionlog' => 'ver este registo privado',
'action-block' => 'impedir este utilizador de editar',
'action-protect' => 'alterar os níveis de protecção desta página',
+'action-rollback' => 'Reverter rapidamente as edições do último utilizador que editou uma dada página',
'action-import' => 'importar esta página a partir de outra wiki',
'action-importupload' => 'importar esta página a partir de um ficheiro xml',
'action-patrol' => 'marcar as edições de outros utilizadores como patrulhadas',
'action-autopatrol' => 'marcar como patrulhadas as suas próprias edições',
'action-unwatchedpages' => 'ver a lista de páginas não-vigiadas',
-'action-trackback' => "submeter um ''trackback''",
'action-mergehistory' => 'fundir o histórico de edições desta página',
'action-userrights' => 'editar os privilégios de utilizadores',
'action-userrights-interwiki' => 'editar privilégios de utilizadores de outras wikis',
'action-siteadmin' => 'bloquear ou desbloquear a base de dados',
+'action-sendemail' => 'enviar e-mails',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
@@ -1696,6 +1713,7 @@ Consulte a [[Special:NewFiles|galeria de novos ficheiros]] para visioná-los.',
'minlength1' => 'Os nomes de ficheiros devem de ter pelo menos uma letra.',
'illegalfilename' => 'O nome do ficheiro "$1" contém caracteres que não são permitidos no título das páginas.
Altere o nome do ficheiro e tente enviá-lo novamente, por favor.',
+'filename-toolong' => 'Os nomes de arquivo não podem ser superiores a 240 bytes.',
'badfilename' => 'O nome do ficheiro foi alterado para "$1".',
'filetype-mime-mismatch' => 'A extensão ".$1" não corresponde ao tipo MIME do ficheiro ($2).',
'filetype-badmime' => 'Não é permitido carregar ficheiros do tipo MIME "$1".',
@@ -1809,6 +1827,24 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
'upload-unknown-size' => 'Tamanho desconhecido',
'upload-http-error' => 'Ocorreu um erro HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Não foi possível transmitir o ficheiro $1.',
+'backend-fail-backup' => 'Não foi possível fazer backup do ficheiro $1.',
+'backend-fail-notexists' => 'O ficheiro $1 não existe.',
+'backend-fail-hashes' => 'Não foi possível obter os hashes do ficheiro para comparação.',
+'backend-fail-notsame' => 'Já existe um ficheiro não idêntico em $1 .',
+'backend-fail-invalidpath' => '$1 não é um caminho de armazenamento válido.',
+'backend-fail-delete' => 'Não foi possível excluir o ficheiro $1.',
+'backend-fail-alreadyexists' => 'O ficheiro $1 já existe.',
+'backend-fail-store' => 'Não foi possível armazenar o arquivo $1 em $2.',
+'backend-fail-copy' => 'Não foi possível copiar o ficheiro $1 para $2.',
+'backend-fail-move' => 'Não é possível mover o ficheiro $1 para $2.',
+'backend-fail-opentemp' => 'Não foi possível abrir o arquivo temporário.',
+'backend-fail-writetemp' => 'Não foi possível gravar para arquivo temporário.',
+'backend-fail-closetemp' => 'Não foi possível fechar o arquivo temporário.',
+'backend-fail-read' => 'Não foi possível ler o arquivo $1.',
+'backend-fail-create' => 'Não foi possível criar o arquivo $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Foi encontrado um erro ao abrir o ficheiro ZIP para verificação.',
'zip-wrong-format' => 'O ficheiro especificado não é um ficheiro ZIP.',
@@ -1931,23 +1967,24 @@ A descrição na [$2 página de descrição] é mostrada abaixo.',
'filerevert-badversion' => 'Não há uma versão local anterior deste ficheiro no período de tempo especificado.',
# File deletion
-'filedelete' => 'Eliminar $1',
-'filedelete-legend' => 'Eliminar ficheiro',
-'filedelete-intro' => "Está prestes a eliminar o ficheiro '''[[Media:$1|$1]]''' e todo o seu histórico.",
-'filedelete-intro-old' => "Está prestes a eliminar a versão de '''[[Media:$1|$1]]''' tal como se encontrava em [$4 $3, $2].",
-'filedelete-comment' => 'Motivo:',
-'filedelete-submit' => 'Eliminar',
-'filedelete-success' => "'''$1''' foi eliminado.",
-'filedelete-success-old' => "A versão de '''[[Media:$1|$1]]''' tal como $3, $2 foi eliminada.",
-'filedelete-nofile' => "'''$1''' não existe.",
-'filedelete-nofile-old' => "Não há nenhuma versão de '''$1''' em arquivo com os parâmetros especificados.",
-'filedelete-otherreason' => 'Outro/motivo adicional:',
-'filedelete-reason-otherlist' => 'Outro motivo',
-'filedelete-reason-dropdown' => '*Motivos comuns para eliminação
+'filedelete' => 'Eliminar $1',
+'filedelete-legend' => 'Eliminar ficheiro',
+'filedelete-intro' => "Está prestes a eliminar o ficheiro '''[[Media:$1|$1]]''' e todo o seu histórico.",
+'filedelete-intro-old' => "Está prestes a eliminar a versão de '''[[Media:$1|$1]]''' tal como se encontrava em [$4 $3, $2].",
+'filedelete-comment' => 'Motivo:',
+'filedelete-submit' => 'Eliminar',
+'filedelete-success' => "'''$1''' foi eliminado.",
+'filedelete-success-old' => "A versão de '''[[Media:$1|$1]]''' tal como $3, $2 foi eliminada.",
+'filedelete-nofile' => "'''$1''' não existe.",
+'filedelete-nofile-old' => "Não há nenhuma versão de '''$1''' em arquivo com os parâmetros especificados.",
+'filedelete-otherreason' => 'Outro/motivo adicional:',
+'filedelete-reason-otherlist' => 'Outro motivo',
+'filedelete-reason-dropdown' => '*Motivos comuns para eliminação
** Violação de direitos de autor
** Ficheiro duplicado',
-'filedelete-edit-reasonlist' => 'Editar motivos de eliminação',
-'filedelete-maintenance' => 'Eliminação e restauro de ficheiros foram temporariamente impossibilitadas durante a manutenção.',
+'filedelete-edit-reasonlist' => 'Editar motivos de eliminação',
+'filedelete-maintenance' => 'Eliminação e restauro de ficheiros foram temporariamente impossibilitadas durante a manutenção.',
+'filedelete-maintenance-title' => 'Não é possível excluir o ficheiro',
# MIME search
'mimesearch' => 'Pesquisa MIME',
@@ -2053,6 +2090,7 @@ Agora redirecciona para [[$2]].',
'mostimages' => 'Ficheiros com mais afluentes',
'mostrevisions' => 'Páginas com mais revisões',
'prefixindex' => 'Todas as páginas iniciadas por',
+'prefixindex-namespace' => 'Todas as páginas com prefixo (domínio $1)',
'shortpages' => 'Páginas curtas',
'longpages' => 'Páginas longas',
'deadendpages' => 'Páginas sem saída',
@@ -2069,7 +2107,7 @@ Agora redirecciona para [[$2]].',
'listusers-editsonly' => 'Mostrar apenas utilizadores com edições',
'listusers-creationsort' => 'Ordenar por data de criação',
'usereditcount' => '$1 {{PLURAL:$1|edição|edições}}',
-'usercreated' => 'Criado em $1 às $2',
+'usercreated' => '{{GENDER:$3|Criado|Criada}} em $1 às $2',
'newpages' => 'Páginas recentes',
'newpages-username' => 'Nome de utilizador:',
'ancientpages' => 'Páginas mais antigas',
@@ -2163,12 +2201,8 @@ Protocolos suportados: <tt>$1</tt> (não adicione nenhum destes na sua pesquisa)
'activeusers-noresult' => 'Nenhum utilizador encontrado.',
# Special:Log/newusers
-'newuserlogpage' => 'Registo de criação de utilizadores',
-'newuserlogpagetext' => 'Este é um registo de novas contas de utilizador',
-'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
-'newuserlog-create-entry' => 'Novo utilizador',
-'newuserlog-create2-entry' => 'criou nova conta $1',
-'newuserlog-autocreate-entry' => 'Conta criada automaticamente',
+'newuserlogpage' => 'Registo de criação de utilizadores',
+'newuserlogpagetext' => 'Este é um registo de novas contas de utilizador',
# Special:ListGroupRights
'listgrouprights' => 'Privilégios dos grupos de utilizadores',
@@ -2197,7 +2231,7 @@ Encontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações
'emailpagetext' => 'Pode usar o formulário abaixo para enviar uma mensagem por correio electrónico para este utilizador.
O endereço de correio que introduziu nas suas [[Special:Preferences|preferências]] irá aparecer no campo do remetente da mensagem "De:", para que o destinatário lhe possa responder directamente.',
'usermailererror' => 'O sistema de correio devolveu o erro:',
-'defemailsubject' => 'Correio da {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} e-mail do usuário "$1"',
'usermaildisabled' => 'Correio electrónico do utilizador foi desactivado',
'usermaildisabledtext' => 'Não pode enviar correio electrónico aos outros utilizadores desta wiki',
'noemailtitle' => 'Sem endereço de correio electrónico',
@@ -2252,7 +2286,7 @@ O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:R
'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}}.',
'iteminvalidname' => "Problema com item '$1', nome inválido...",
-'wlnote' => "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}}.",
+'wlnote' => "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} até $3, $4.",
'wlshowlast' => 'Ver últimas $1 horas $2 dias $3',
'watchlist-options' => 'Opções da lista de páginas vigiadas',
@@ -2318,8 +2352,6 @@ Confirme que é realmente esta a sua intenção, que compreende as consequência
'actionfailed' => 'Operação falhou',
'deletedtext' => '"$1" foi eliminada.
Consulte $2 para um registo de eliminações recentes.',
-'deletedarticle' => 'eliminou "[[$1]]"',
-'suppressedarticle' => 'suprimiu "[[$1]]"',
'dellogpage' => 'Registo de eliminações',
'dellogpagetext' => 'Abaixo uma lista das eliminações mais recentes.',
'deletionlog' => 'registo de eliminações',
@@ -2368,7 +2400,10 @@ Consulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as p
'unprotectedarticle' => 'desprotegeu "[[$1]]"',
'movedarticleprotection' => 'moveu as configurações de protecção de "[[$2]]" para "[[$1]]"',
'protect-title' => 'Alterar o nível de protecção de "$1"',
+'protect-title-notallowed' => 'Ver o nível de proteção de "$1"',
'prot_1movedto2' => 'moveu [[$1]] para [[$2]]',
+'protect-badnamespace-title' => 'Espaço nominal não passível de protecção',
+'protect-badnamespace-text' => 'Páginas neste espaço nominal não podem ser protegidas.',
'protect-legend' => 'Confirmar protecção',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Expiração:',
@@ -2390,6 +2425,7 @@ Pode alterar o nível de protecção desta página, mas isso não afectará a pr
'protect-level-sysop' => 'Apenas administradores',
'protect-summary-cascade' => 'em cascata',
'protect-expiring' => 'expira a $1 (UTC)',
+'protect-expiring-local' => 'expira a $1',
'protect-expiry-indefinite' => 'infinito',
'protect-cascade' => 'Proteja quaisquer páginas que estejam incluídas nesta (protecção em cascata)',
'protect-cantedit' => 'Não pode alterar o nível de protecção desta página, porque não tem permissão para editá-la.',
@@ -2447,7 +2483,6 @@ Pode ter usado um link incorrecto ou talvez a revisão tenha sido restaurada ou
'undeletereset' => 'Limpar',
'undeleteinvert' => 'Inverter selecção',
'undeletecomment' => 'Motivo:',
-'undeletedarticle' => 'restaurou "[[$1]]"',
'undeletedrevisions' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$2|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
'undeletedfiles' => '{{PLURAL:$1|ficheiro restaurado|$1 ficheiros restaurados}}',
@@ -2456,6 +2491,7 @@ Pode ter usado um link incorrecto ou talvez a revisão tenha sido restaurada ou
Consulte o [[Special:Log/delete|registo de eliminações]] para um registo das eliminações e restaurações mais recentes.",
'undelete-header' => 'Consulte o [[Special:Log/delete|registo de eliminações]] para ver as páginas eliminadas recentemente.',
+'undelete-search-title' => 'Pesquisar páginas eliminadas',
'undelete-search-box' => 'Pesquisar páginas eliminadas',
'undelete-search-prefix' => 'Mostrar páginas que começam por:',
'undelete-search-submit' => 'Pesquisar',
@@ -2464,6 +2500,7 @@ Consulte o [[Special:Log/delete|registo de eliminações]] para um registo das e
'undelete-bad-store-key' => 'Não foi possível restaurar a versão do ficheiro de $1: já não existia antes da eliminação.',
'undelete-cleanup-error' => 'Erro ao eliminar o ficheiro não utilizado "$1".',
'undelete-missing-filearchive' => 'Não é possível restaurar o ficheiro de ID $1, uma vez que ele não se encontra na base de dados. Isso pode significar que já tenha sido restaurado.',
+'undelete-error' => 'Erro ao restaurar a página',
'undelete-error-short' => 'Erro ao restaurar ficheiro: $1',
'undelete-error-long' => 'Foram encontrados erros ao tentar restaurar o ficheiro:
@@ -2584,6 +2621,7 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
'blocklist-userblocks' => 'Esconder bloqueios de contas',
'blocklist-tempblocks' => 'Esconder bloqueios temporários',
'blocklist-addressblocks' => 'Esconder bloqueios de IP único',
+'blocklist-rangeblocks' => 'Ocultar range blocks',
'blocklist-timestamp' => 'Data e hora',
'blocklist-target' => 'Destinatário',
'blocklist-expiry' => 'Duração',
@@ -2606,6 +2644,7 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
'unblocklink' => 'desbloquear',
'change-blocklink' => 'alterar bloqueio',
'contribslink' => 'contribs',
+'emaillink' => 'enviar correio electrónico',
'autoblocker' => 'Foi automaticamente bloqueado, pois o seu endereço IP foi recentemente usado por "[[User:$1|$1]]". O motivo apresentado para o bloqueio de $1 foi: "$2".',
'blocklogpage' => 'Registo de bloqueio',
'blocklog-showlog' => 'Este utilizador foi já bloqueado anteriormente.
@@ -2731,9 +2770,6 @@ Faça a fusão manual das páginas de discussão, por favor.'''",
'movepage-page-moved' => 'A página $1 foi movida para $2.',
'movepage-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
'movepage-max-pages' => 'O limite de $1 {{PLURAL:$1|página movida|páginas movidas}} foi atingido; não será possível mover mais páginas de forma automática.',
-'1movedto2' => 'moveu [[$1]] para [[$2]]',
-'1movedto2_redir' => 'moveu [[$1]] para [[$2]] com redirecionamento',
-'move-redirect-suppressed' => 'redireccionamento suprimido',
'movelogpage' => 'Registo de movimento',
'movelogpagetext' => 'Abaixo encontra-se uma lista de páginas movidas.',
'movesubpage' => '{{PLURAL:$1|Subpágina|Subpáginas}}',
@@ -2745,7 +2781,7 @@ Faça a fusão manual das páginas de discussão, por favor.'''",
'delete_and_move_text' => '==Eliminação necessária==
A página de destino ("[[:$1]]") já existe. Deseja eliminá-la de modo a poder mover?',
'delete_and_move_confirm' => 'Sim, eliminar a página',
-'delete_and_move_reason' => 'Eliminada para poder mover outra página para este título',
+'delete_and_move_reason' => 'Eliminada para poder mover "[[$1]]" para este título',
'selfmove' => 'O título de origem e de destinato são os mesmos;
não é possível mover uma página para ela mesma.',
'immobile-source-namespace' => 'Não é possível mover páginas no espaço nominal "$1"',
@@ -2775,9 +2811,11 @@ Escolha outro nome, por favor.',
Para exportar páginas, introduza os títulos na caixa de texto abaixo (um título por linha) e seleccione se deseja todas as versões, com as linhas de histórico de edições, ou apenas a edição actual e informações sobre a mais recente das edições.
Se desejar, pode utilizar um link (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).',
+'exportall' => 'Exportar todas as páginas',
'exportcuronly' => 'Incluir apenas a edição actual, não o histórico completo',
'exportnohistory' => "----
'''Nota:''' a exportação do histórico completo de páginas através deste formulário foi desactivada por afectar o desempenho do sistema.",
+'exportlistauthors' => 'Incluir uma lista completa de colaboradores para cada página',
'export-submit' => 'Exportar',
'export-addcattext' => 'Adicionar à lista páginas da categoria:',
'export-addcat' => 'Adicionar',
@@ -2810,6 +2848,7 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
'thumbnail_error' => 'Erro ao criar miniatura: $1',
'djvu_page_error' => 'página DjVu inacessível',
'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
+'thumbnail-dest-create' => 'Não é possível salvar miniatura',
'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
'thumbnail_dest_directory' => 'Não foi possível criar o directório de destino',
'thumbnail_image-type' => 'Tipo de imagem não suportado',
@@ -2857,6 +2896,11 @@ Não há um directório temporário.',
'import-upload' => 'Enviar dados em XML',
'import-token-mismatch' => 'Perda dos dados da sessão. Tente novamente, por favor.',
'import-invalid-interwiki' => 'Não é possível importar da wiki especificada.',
+'import-error-edit' => 'A página "$1" não foi importada porque você não tem permissão para editá-la.',
+'import-error-create' => 'A página "$1" não foi importada porque você não tem permissão para criá-la.',
+'import-error-interwiki' => 'A página "$1" não pode ser importada pois seu nome está reservado para um link externo (interwiki).',
+'import-error-special' => 'A página "$1" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.',
+'import-error-invalid' => 'A página "$1" não pode ser importada porque seu nome é inválido.',
# Import log
'importlogpage' => 'Registo de importações',
@@ -2866,74 +2910,86 @@ Não há um directório temporário.',
'import-logentry-interwiki' => 'transwikis $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|$1 edição|$1 edições}} de $2',
+# JavaScriptTest
+'javascripttest' => 'Teste de JavaScript',
+'javascripttest-disabled' => 'Esta função está desabilitada.',
+'javascripttest-title' => 'Executando os testes $1',
+'javascripttest-pagetext-noframework' => 'Esta página é reservada para a execução de testes de JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Estrutura de testes "$1" desconhecido.',
+'javascripttest-pagetext-frameworks' => 'Escolha, por favor, uma das seguintes estruturas de teste: $1',
+'javascripttest-pagetext-skins' => 'Escolher um tema para executar os testes com:',
+'javascripttest-qunit-intro' => 'Consulte a [ $1 documentação de testes] no mediawiki.org.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'A sua página de utilizador',
-'tooltip-pt-anonuserpage' => 'A página de utilizador para o endereço IP que está a usar',
-'tooltip-pt-mytalk' => 'A sua página de discussão',
-'tooltip-pt-anontalk' => 'Discussão sobre edições feitas a partir deste endereço IP',
-'tooltip-pt-preferences' => 'Configuração dos comportamentos que prefere da wiki',
-'tooltip-pt-watchlist' => 'Lista de mudanças nas páginas que está a vigiar',
-'tooltip-pt-mycontris' => 'Lista das suas contribuições',
-'tooltip-pt-login' => 'É encorajado a autenticar-se, apesar de não ser obrigatório.',
-'tooltip-pt-anonlogin' => 'É encorajado a autenticar-se, apesar de não ser obrigatório.',
-'tooltip-pt-logout' => 'Terminar esta sessão na wiki',
-'tooltip-ca-talk' => 'Discussão sobre o conteúdo da página',
-'tooltip-ca-edit' => 'Pode editar esta página.
+'tooltip-pt-userpage' => 'A sua página de utilizador',
+'tooltip-pt-anonuserpage' => 'A página de utilizador para o endereço IP que está a usar',
+'tooltip-pt-mytalk' => 'A sua página de discussão',
+'tooltip-pt-anontalk' => 'Discussão sobre edições feitas a partir deste endereço IP',
+'tooltip-pt-preferences' => 'Configuração dos comportamentos que prefere da wiki',
+'tooltip-pt-watchlist' => 'Lista de mudanças nas páginas que está a vigiar',
+'tooltip-pt-mycontris' => 'Lista das suas contribuições',
+'tooltip-pt-login' => 'É encorajado a autenticar-se, apesar de não ser obrigatório.',
+'tooltip-pt-anonlogin' => 'É encorajado a autenticar-se, apesar de não ser obrigatório.',
+'tooltip-pt-logout' => 'Terminar esta sessão na wiki',
+'tooltip-ca-talk' => 'Discussão sobre o conteúdo da página',
+'tooltip-ca-edit' => 'Pode editar esta página.
Utilize o botão "Antever resultado" antes de gravar, por favor.',
-'tooltip-ca-addsection' => 'Iniciar uma nova secção',
-'tooltip-ca-viewsource' => 'Esta página está protegida; só pode ver o conteúdo.',
-'tooltip-ca-history' => 'Edições anteriores desta página.',
-'tooltip-ca-protect' => 'Proteger esta página',
-'tooltip-ca-unprotect' => 'Alterar a protecção desta página',
-'tooltip-ca-delete' => 'Apagar esta página',
-'tooltip-ca-undelete' => 'Restaurar edições feitas a esta página antes da eliminação',
-'tooltip-ca-move' => 'Mover esta página',
-'tooltip-ca-watch' => 'Adicionar esta página à lista de páginas vigiadas',
-'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
-'tooltip-search' => 'Pesquisar nesta wiki',
-'tooltip-search-go' => 'Ir para uma página com este nome exacto, caso exista',
-'tooltip-search-fulltext' => 'Procurar páginas que contêm este texto',
-'tooltip-p-logo' => 'Visite a página principal',
-'tooltip-n-mainpage' => 'Visitar a página principal',
-'tooltip-n-mainpage-description' => 'Visitar a página principal',
-'tooltip-n-portal' => 'Sobre o projecto',
-'tooltip-n-currentevents' => 'Informação temática sobre acontecimentos actuais',
-'tooltip-n-recentchanges' => 'A lista de mudanças recentes nesta wiki.',
-'tooltip-n-randompage' => 'Carregar página aleatória',
-'tooltip-n-help' => 'Um local reservado para auxílio.',
-'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que contêm links para esta',
-'tooltip-t-recentchangeslinked' => 'Mudanças recentes nas páginas para as quais esta contém links',
-'tooltip-feed-rss' => "''Feed'' RSS desta página",
-'tooltip-feed-atom' => "''Feed'' Atom desta página",
-'tooltip-t-contributions' => 'Ver as contribuições deste utilizador',
-'tooltip-t-emailuser' => 'Enviar uma mensagem de correio a este utilizador',
-'tooltip-t-upload' => 'Upload de ficheiros',
-'tooltip-t-specialpages' => 'Lista de páginas especiais',
-'tooltip-t-print' => 'Versão para impressão desta página',
-'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
-'tooltip-ca-nstab-main' => 'Ver a página de conteúdo',
-'tooltip-ca-nstab-user' => 'Ver a página de utilizador',
-'tooltip-ca-nstab-media' => 'Ver a página de media',
-'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
-'tooltip-ca-nstab-project' => 'Ver a página de projecto',
-'tooltip-ca-nstab-image' => 'Ver a página de ficheiro',
-'tooltip-ca-nstab-mediawiki' => 'Ver a mensagem de sistema',
-'tooltip-ca-nstab-template' => 'Ver a predefinição',
-'tooltip-ca-nstab-help' => 'Ver a página de ajuda',
-'tooltip-ca-nstab-category' => 'Ver a página da categoria',
-'tooltip-minoredit' => 'Marcar como edição menor',
-'tooltip-save' => 'Gravar as alterações',
-'tooltip-preview' => 'Antever as suas alterações. Use antes de gravar, por favor!',
-'tooltip-diff' => 'Mostrar alterações que fez a este texto.',
-'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões seleccionadas desta página.',
-'tooltip-watch' => 'Adicionar esta página à lista de páginas vigiadas',
-'tooltip-recreate' => 'Recriar a página apesar de ter sido eliminada',
-'tooltip-upload' => 'Iniciar o carregamento',
-'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
-'tooltip-undo' => '"desfazer" reverte esta edição e apresenta a página de edição no modo de antevisão.
+'tooltip-ca-addsection' => 'Iniciar uma nova secção',
+'tooltip-ca-viewsource' => 'Esta página está protegida; só pode ver o conteúdo.',
+'tooltip-ca-history' => 'Edições anteriores desta página.',
+'tooltip-ca-protect' => 'Proteger esta página',
+'tooltip-ca-unprotect' => 'Alterar a protecção desta página',
+'tooltip-ca-delete' => 'Apagar esta página',
+'tooltip-ca-undelete' => 'Restaurar edições feitas a esta página antes da eliminação',
+'tooltip-ca-move' => 'Mover esta página',
+'tooltip-ca-watch' => 'Adicionar esta página à lista de páginas vigiadas',
+'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
+'tooltip-search' => 'Pesquisar nesta wiki',
+'tooltip-search-go' => 'Ir para uma página com este nome exacto, caso exista',
+'tooltip-search-fulltext' => 'Procurar páginas que contêm este texto',
+'tooltip-p-logo' => 'Visite a página principal',
+'tooltip-n-mainpage' => 'Visitar a página principal',
+'tooltip-n-mainpage-description' => 'Visitar a página principal',
+'tooltip-n-portal' => 'Sobre o projecto',
+'tooltip-n-currentevents' => 'Informação temática sobre acontecimentos actuais',
+'tooltip-n-recentchanges' => 'A lista de mudanças recentes nesta wiki.',
+'tooltip-n-randompage' => 'Carregar página aleatória',
+'tooltip-n-help' => 'Um local reservado para auxílio.',
+'tooltip-t-whatlinkshere' => 'Lista de todas as páginas que contêm links para esta',
+'tooltip-t-recentchangeslinked' => 'Mudanças recentes nas páginas para as quais esta contém links',
+'tooltip-feed-rss' => "''Feed'' RSS desta página",
+'tooltip-feed-atom' => "''Feed'' Atom desta página",
+'tooltip-t-contributions' => 'Ver as contribuições deste utilizador',
+'tooltip-t-emailuser' => 'Enviar uma mensagem de correio a este utilizador',
+'tooltip-t-upload' => 'Upload de ficheiros',
+'tooltip-t-specialpages' => 'Lista de páginas especiais',
+'tooltip-t-print' => 'Versão para impressão desta página',
+'tooltip-t-permalink' => 'Link permanente para esta versão desta página',
+'tooltip-ca-nstab-main' => 'Ver a página de conteúdo',
+'tooltip-ca-nstab-user' => 'Ver a página de utilizador',
+'tooltip-ca-nstab-media' => 'Ver a página de media',
+'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
+'tooltip-ca-nstab-project' => 'Ver a página de projecto',
+'tooltip-ca-nstab-image' => 'Ver a página de ficheiro',
+'tooltip-ca-nstab-mediawiki' => 'Ver a mensagem de sistema',
+'tooltip-ca-nstab-template' => 'Ver a predefinição',
+'tooltip-ca-nstab-help' => 'Ver a página de ajuda',
+'tooltip-ca-nstab-category' => 'Ver a página da categoria',
+'tooltip-minoredit' => 'Marcar como edição menor',
+'tooltip-save' => 'Gravar as alterações',
+'tooltip-preview' => 'Antever as suas alterações. Use antes de gravar, por favor!',
+'tooltip-diff' => 'Mostrar alterações que fez a este texto.',
+'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões seleccionadas desta página.',
+'tooltip-watch' => 'Adicionar esta página à lista de páginas vigiadas',
+'tooltip-watchlistedit-normal-submit' => 'Remover títulos',
+'tooltip-watchlistedit-raw-submit' => 'Actualizar a lista de vigiados',
+'tooltip-recreate' => 'Recriar a página apesar de ter sido eliminada',
+'tooltip-upload' => 'Iniciar o carregamento',
+'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
+'tooltip-undo' => '"desfazer" reverte esta edição e apresenta a página de edição no modo de antevisão.
Permite colocar uma justificação no resumo da edição.',
-'tooltip-preferences-save' => 'Gravar preferências',
-'tooltip-summary' => 'Introduza um resumo breve',
+'tooltip-preferences-save' => 'Gravar preferências',
+'tooltip-summary' => 'Introduza um resumo breve',
# Stylesheets
'common.css' => '/* Código CSS colocado aqui será aplicado a todos os temas */',
@@ -3023,9 +3079,6 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
# Patrol log
'patrol-log-page' => 'Registo de edições patrulhadas',
'patrol-log-header' => 'Este é um registo de edições patrulhadas.',
-'patrol-log-line' => 'marcou a $1 de $2 como uma edição patrulhada $3',
-'patrol-log-auto' => 'automaticamente',
-'patrol-log-diff' => 'edição $1',
'log-show-hide-patrol' => '$1 registo de edições patrulhadas',
# Image deletion
@@ -3052,11 +3105,11 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'file-info' => 'tamanho: $1, tipo MIME: $2',
'file-info-size' => '$1 × $2 pixels, tamanho: $3, tipo MIME: $4',
'file-info-size-pages' => '$1 × $2 pixels, tamanho do ficheiro: $3, tipo MIME: $4, $5 {{PLURAL:$5|página|páginas}}',
-'file-nohires' => '<small>Sem resolução maior disponível.</small>',
+'file-nohires' => 'Sem resolução maior disponível.',
'svg-long-desc' => 'ficheiro SVG, de $1 × $2 pixels, tamanho: $3',
'show-big-image' => 'Resolução completa',
-'show-big-image-preview' => '<small>Tamanho desta antevisão: $1.</small>',
-'show-big-image-other' => '<small>Outras resoluções: $1.</small>',
+'show-big-image-preview' => 'Tamanho desta antevisão: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'cíclico',
'file-info-gif-frames' => '$1 {{PLURAL:$1|quadro|quadros}}',
@@ -3076,6 +3129,13 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'bydate' => 'por data',
'sp-newimages-showfrom' => 'Mostrar novos ficheiros a partir das $2 de $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|um segundo|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
+'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'ago' => '$1 atrás',
+
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3580,13 +3640,6 @@ Este código de confirmação expira a $4.',
'scarytranscludefailed' => '[Não foi possível obter a predefinição a partir de $1]',
'scarytranscludetoolong' => '[URL longa demais]',
-# Trackbacks
-'trackbackbox' => "Links ''trackback'' para esta página:<br />
-$1",
-'trackbackremove' => '([$1 Eliminar])',
-'trackbacklink' => "''Trackback''",
-'trackbackdeleteok' => "O ''trackback'' foi eliminado com sucesso.",
-
# Delete conflict
'deletedwhileediting' => "'''Aviso''': Esta página foi eliminada após ter começado a editá-la!",
'confirmrecreate' => "Enquanto você editava esta página, o utilizador [[User:$1|$1]] ([[User talk:$1|Discussão]]) eliminou-a pelo seguinte motivo:
@@ -3669,6 +3722,9 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
'watchlisttools-edit' => 'Ver e editar a lista de páginas vigiadas',
'watchlisttools-raw' => 'Editar a lista de páginas vigiadas em forma de texto',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])',
+
# Core parser functions
'unknown_extension_tag' => '"$1" é uma tag de extensão desconhecida',
'duplicate-defaultsort' => 'Aviso: A chave de ordenação padrão "$2" sobrepõe-se à anterior chave de ordenação padrão "$1".',
@@ -3723,9 +3779,8 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
# Special:SpecialPages
'specialpages' => 'Páginas especiais',
'specialpages-note' => '----
-*Páginas normais especiais
-* <span class="mw-specialpagerestricted">Restricted special pages.</span>
-* <span class="mw-specialpagecached">Cached special pages (might be obsolete).</span>',
+* Páginas especiais normais.
+* <span class="mw-specialpagerestricted">Páginas especiais restritas.</span>',
'specialpages-group-maintenance' => 'Relatórios de manutenção',
'specialpages-group-other' => 'Outras páginas especiais',
'specialpages-group-login' => 'Entrar / registar-se',
@@ -3767,13 +3822,16 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
# Special:ComparePages
-'comparepages' => 'Comparar páginas',
-'compare-selector' => 'Comparar edições da página',
-'compare-page1' => 'Página 1',
-'compare-page2' => 'Página 2',
-'compare-rev1' => 'Edição 1',
-'compare-rev2' => 'Edição 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar páginas',
+'compare-selector' => 'Comparar edições da página',
+'compare-page1' => 'Página 1',
+'compare-page2' => 'Página 2',
+'compare-rev1' => 'Edição 1',
+'compare-rev2' => 'Edição 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'O título que especificou é inválido.',
+'compare-title-not-exists' => 'O título que especificou não existe.',
+'compare-revision-not-exists' => 'A revisão que especificou não existe.',
# Database error messages
'dberr-header' => 'Esta wiki tem um problema',
@@ -3800,4 +3858,84 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
'sqlite-no-fts' => '$1 sem suporte de pesquisa de texto completo',
+# New logging system
+'logentry-delete-delete' => '$1 apagou a página $3',
+'logentry-delete-restore' => '$1 restaurou a página $3',
+'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|$5 das entradas}} em $3: $4',
+'logentry-delete-revision' => '$1 alterou a visibilidade {{PLURAL:$5|de uma revisão|$5 das revisões}} em $3: $4',
+'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
+'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
+'logentry-suppress-delete' => '$1 suprimiu a página $3',
+'logentry-suppress-event' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma entrada|$5 das entradas}} em $3: $4',
+'logentry-suppress-revision' => '$1 secretamente alterou a visibilidade {{PLURAL:$5|de uma revisão|$5 das revisões}} em $3: $4',
+'logentry-suppress-event-legacy' => '$1 secretamente alterou a visibilidade das entradas em $3',
+'logentry-suppress-revision-legacy' => '$1 secretamente alterou a visibilidade das revisões em $3',
+'revdelete-content-hid' => 'conteúdo oculto',
+'revdelete-summary-hid' => 'editar sumário oculto',
+'revdelete-uname-hid' => 'utilizador oculto',
+'revdelete-content-unhid' => 'conteúdo não oculto',
+'revdelete-summary-unhid' => 'editar sumário não oculto',
+'revdelete-uname-unhid' => 'utilizador não oculto',
+'revdelete-restricted' => 'restrições a administradores aplicadas',
+'revdelete-unrestricted' => 'restrições a administradores removidas',
+'logentry-move-move' => '$1 moveu página $3 para $4',
+'logentry-move-move-noredirect' => '$1 moveu página $3 para $4 sem deixar um redireccionamento',
+'logentry-move-move_redir' => '$1 moveu a página $3 para $4 através de um redireccionamento',
+'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sem um redireccionamento',
+'logentry-patrol-patrol' => '$1 marcou a revisão $4 da página $3 como patrulhada',
+'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisão $4 da página $3 como patrulhada',
+'logentry-newusers-newusers' => '$1 criou uma conta de utilizador',
+'logentry-newusers-create' => '$1 criou uma conta de utilizador',
+'logentry-newusers-create2' => '$1 criou uma conta de utilizador $3',
+'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticalmente',
+'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
+
+# Feedback
+'feedback-subject' => 'Assunto:',
+'feedback-message' => 'Mensagem:',
+'feedback-cancel' => 'Cancelar',
+'feedback-submit' => 'Enviar Comentários',
+'feedback-adding' => 'A acrescentar os comentários à página...',
+'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
+'feedback-error2' => 'Erro: A edição falhou',
+'feedback-error3' => 'Erro: A API não responde',
+'feedback-close' => 'Feito',
+
+# API errors
+'api-error-badaccess-groups' => 'Não tem permissão para enviar ficheiros para esta wiki.',
+'api-error-badtoken' => 'Erro interno: Chave incorrecta.',
+'api-error-copyuploaddisabled' => 'O recebimento de ficheiros por URL não foi possibilitado neste servidor.',
+'api-error-duplicate' => 'Já {{PLURAL:$1|existe [$2 outro ficheiro]|existem [$2 outros ficheiros]}} na wiki com o mesmo conteúdo.',
+'api-error-duplicate-archive' => 'Já {{PLURAL:$1|existia no site [$2 outro ficheiro]|existiam no site [$2 alguns outros ficheiros]}} com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Ficheiro duplicado que já foi eliminado|Ficheiros duplicados que já foram eliminados}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}}',
+'api-error-empty-file' => 'O ficheiro que enviou está vazio.',
+'api-error-fetchfileerror' => 'Erro interno: Ocorreu um problema indeterminado ao aceder ao ficheiro.',
+'api-error-file-too-large' => 'O ficheiro que enviou era demasiado grande.',
+'api-error-filename-tooshort' => 'O nome do ficheiro é demasiado curto.',
+'api-error-filetype-banned' => 'Este tipo de ficheiro é proibido.',
+'api-error-filetype-missing' => 'Falta a extensão do ficheiro.',
+'api-error-hookaborted' => 'A modificação que tentou fazer foi abortada pelo hook de uma extensão.',
+'api-error-http' => 'Erro interno: Ocorreu um problema na ligação ao servidor.',
+'api-error-illegal-filename' => 'Este nome de ficheiro não é permitido.',
+'api-error-internal-error' => 'Erro interno: Ocorreu um erro indeterminado na wiki ao processar o ficheiro que enviou.',
+'api-error-invalid-file-key' => 'Erro interno: O ficheiro não foi encontrado no armazenamento temporário.',
+'api-error-missingparam' => 'Erro interno: Há parâmetros em falta no pedido.',
+'api-error-missingresult' => 'Erro interno: Não foi possível determinar se a cópia foi feita.',
+'api-error-mustbeloggedin' => 'Tem de estar autenticado para enviar ficheiros.',
+'api-error-mustbeposted' => 'Erro interno: O pedido necessita do HTTP POST.',
+'api-error-noimageinfo' => 'O envio correu bem, mas o servidor não forneceu nenhuma informação sobre o ficheiro.',
+'api-error-nomodule' => 'Erro interno: Não está definido nenhum módulo para recebimento de ficheiros.',
+'api-error-ok-but-empty' => 'Erro interno: o servidor não respondeu.',
+'api-error-overwrite' => 'Não é permitido sobrescrever um ficheiro existente.',
+'api-error-stashfailed' => 'Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.',
+'api-error-timeout' => 'O servidor não respondeu no prazo esperado.',
+'api-error-unclassified' => 'Ocorreu um erro desconhecido',
+'api-error-unknown-code' => 'Erro desconhecido: "$1"',
+'api-error-unknown-error' => 'Erro interno: Ocorreu um erro indeterminado ao tentar receber o ficheiro.',
+'api-error-unknown-warning' => 'Aviso desconhecido: $1',
+'api-error-unknownerror' => 'Erro desconhecido: "$1".',
+'api-error-uploaddisabled' => 'Esta wiki não está configurada para poder receber ficheiros.',
+'api-error-verification-error' => 'Este ficheiro pode estar corrompido, ou ter a extensão errada.',
+
);
diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php
index 05d8f699..795a742d 100644
--- a/languages/messages/MessagesPt_br.php
+++ b/languages/messages/MessagesPt_br.php
@@ -38,6 +38,7 @@
* @author McDutchie
* @author MetalBrasil
* @author Pedroca cerebral
+ * @author Ppena
* @author Rafael Vargas
* @author Raylton P. Sousa
* @author Rodrigo Calanca Nishino
@@ -187,118 +188,118 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
- 'notoc' => array( '0', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
- 'toc' => array( '0', '__TDC__', '__SUMARIO__', '__SUMÃRIO__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NAOEDITARSECAO__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'DIALOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÃRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÃGINAC', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'DOMINIOC', 'DOMÃNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'PAGINADEDISCUSSAO', 'PÃGINADEDISCUSSÃO', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'PAGINADEDISCUSSAOC', 'PÃGINADEDISCUSSÃOC', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÃGINAC', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÃGINAC', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÃGINABASEC', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÃGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÃGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÃGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'img_thumbnail' => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'direita', 'right' ),
- 'img_left' => array( '1', 'esquerda', 'left' ),
- 'img_none' => array( '1', 'nenhum', 'none' ),
- 'img_center' => array( '1', 'centro', 'center', 'centre' ),
- 'img_framed' => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'semmoldura', 'semborda', 'frameless' ),
- 'img_page' => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'borda', 'border' ),
- 'img_baseline' => array( '1', 'linhadebase', 'baseline' ),
- 'img_top' => array( '1', 'acima', 'top' ),
- 'img_middle' => array( '1', 'meio', 'middle' ),
- 'img_bottom' => array( '1', 'abaixo', 'bottom' ),
- 'img_link' => array( '1', 'ligação=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NOMEDOSITE', 'NOMEDOSÃTIO', 'NOMEDOSITIO', 'SITENAME' ),
- 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
- 'servername' => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
- 'gender' => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÃTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
- 'revisionday' => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
- 'revisionuser' => array( '1', 'USUARIODAREVISAO', 'USUÃRIODAREVISÃO', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
- 'uc' => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
- 'displaytitle' => array( '1', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
- 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PAGINASNOESPACONOMINAL', 'PÃGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÃGINASNODOMÃNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
- 'defaultsort' => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEXAR__', '__INDEX__' ),
- 'noindex' => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVELDEPROTECAO', 'NÃVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
- 'url_path' => array( '0', 'CAMINHO', 'PATH' ),
+ 'redirect' => array( '0', '#REDIRECIONAMENTO', '#REDIRECT' ),
+ 'notoc' => array( '0', '__SEMTDC__', '__SEMSUMÃRIO__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__SEMGALERIA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__TDC__', '__SUMARIO__', '__SUMÃRIO__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NAOEDITARSECAO__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'MESATUALABREV', 'MESATUALABREVIADO', 'ABREVIATURADOMESATUAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'DIAATUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DIAATUAL2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANOATUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'HORARIOATUAL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'HORAATUAL', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NOMEDOMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'MESLOCALABREV', 'MESLOCALABREVIADO', 'ABREVIATURADOMESLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'DIALOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'DIALOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'HORARIOLOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMERODEARTIGOS', 'NÚMERODEARTIGOS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÃRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NOMEDAPAGINAC', 'NOMEDAPÃGINAC', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'DOMINIOC', 'DOMÃNIOC', 'ESPACONOMINALC', 'ESPAÇONOMINALC', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'PAGINADEDISCUSSAO', 'PÃGINADEDISCUSSÃO', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'PAGINADEDISCUSSAOC', 'PÃGINADEDISCUSSÃOC', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'PAGINADECONTEUDO', 'PAGINADECONTEÚDO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'PAGINADECONTEUDOC', 'PAGINADECONTEÚDOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NOMECOMPLETODAPAGINAC', 'NOMECOMPLETODAPÃGINAC', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NOMEDASUBPAGINAC', 'NOMEDASUBPÃGINAC', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NOMEDAPAGINABASEC', 'NOMEDAPÃGINABASEC', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NOMEDAPAGINADEDISCUSSAOC', 'NOMEDAPÃGINADEDISCUSSÃOC', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NOMEDAPAGINADECONTEUDO', 'NOMEDAPÃGINADECONTEÚDO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NOMEDAPAGINADECONTEUDOC', 'NOMEDAPÃGINADECONTEÚDOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'img_thumbnail' => array( '1', 'miniaturadaimagem', 'miniatura', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniaturadaimagem=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'direita', 'right' ),
+ 'img_left' => array( '1', 'esquerda', 'left' ),
+ 'img_none' => array( '1', 'nenhum', 'none' ),
+ 'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'semmoldura', 'semborda', 'frameless' ),
+ 'img_page' => array( '1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'superiordireito', 'superiordireito=$1', 'superiordireito $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'borda', 'border' ),
+ 'img_baseline' => array( '1', 'linhadebase', 'baseline' ),
+ 'img_top' => array( '1', 'acima', 'top' ),
+ 'img_middle' => array( '1', 'meio', 'middle' ),
+ 'img_bottom' => array( '1', 'abaixo', 'bottom' ),
+ 'img_link' => array( '1', 'ligação=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NOMEDOSITE', 'NOMEDOSÃTIO', 'NOMEDOSITIO', 'SITENAME' ),
+ 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
+ 'servername' => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CAMINHODOSCRIPT', 'SCRIPTPATH' ),
+ 'gender' => array( '0', 'GENERO', 'GÊNERO', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__SEMCONVERTERTITULO__', '__SEMCONVERTERTÃTULO__', '__SEMCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__SEMCONVERTERCONTEUDO__', '__SEMCONVERTERCONTEÚDO__', '__SEMCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SEMANAATUAL', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'DIADASEMANAATUAL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'SEMANALOCAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'DIADASEMANALOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDDAREVISAO', 'IDDAREVISÃO', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DIADAREVISAO', 'DIADAREVISÃO', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DIADAREVISAO2', 'DIADAREVISÃO2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MESDAREVISAO', 'MÊSDAREVISÃO', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ANODAREVISAO', 'ANODAREVISÃO', 'REVISIONYEAR' ),
+ 'revisionuser' => array( '1', 'USUARIODAREVISAO', 'USUÃRIODAREVISÃO', 'REVISIONUSER' ),
+ 'fullurl' => array( '0', 'URLCOMPLETO:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLCOMPLETOC:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'PRIMEIRAMINUSCULA:', 'PRIMEIRAMINÚSCULA:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'PRIMEIRAMAIUSCULA:', 'PRIMEIRAMAIÚSCULA:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MINUSCULA', 'MINÚSCULA', 'MINUSCULAS', 'MINÚSCULAS', 'LC:' ),
+ 'uc' => array( '0', 'MAIUSCULA', 'MAIÚSCULA', 'MAIUSCULAS', 'MAIÚSCULAS', 'UC:' ),
+ 'displaytitle' => array( '1', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__SEMLINKDENOVASECAO__', '__SEMLINKDENOVASEÇÃO__', '__SEMLIGACAODENOVASECAO__', '__SEMLIGAÇÃODENOVASEÇÃO__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'REVISAOATUAL', 'REVISÃOATUAL', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'CODIFICAURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'CODIFICAANCORA:', 'CODIFICAÂNCORA:', 'ANCHORENCODE' ),
+ 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'IDIOMADOCONTEUDO', 'IDIOMADOCONTEÚDO', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PAGINASNOESPACONOMINAL', 'PÃGINASNOESPAÇONOMINAL', 'PAGINASNODOMINIO', 'PÃGINASNODOMÃNIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NUMERODEADMINISTRADORES', 'NÚMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
+ 'defaultsort' => array( '1', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CAMINHODOARQUIVO', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEXAR__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NAOINDEXAR__', '__NÃOINDEXAR__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NUMERONOGRUPO', 'NÚMERONOGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__REDIRECIONAMENTOESTATICO__', '__REDIRECIONAMENTOESTÃTICO__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVELDEPROTECAO', 'NÃVELDEPROTEÇÃO', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'CAMINHO', 'PATH' ),
);
$messages = array(
@@ -661,22 +662,24 @@ Por favor, reporte este fato a um administrador, fazendo notar a URL.',
'badarticleerror' => 'Esta ação não pode ser realizada nesta página.',
'cannotdelete' => 'Não foi possível eliminar a página ou arquivo $1.
É possível que ele já tenha sido eliminado por outra pessoa.',
+'cannotdelete-title' => 'Não é possível excluir 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.',
-'perfcached' => 'Os dados seguintes encontram-se na cache e podem não estar atualizados.',
-'perfcachedts' => 'Os seguintes dados encontram-se armazenados na cache e foram atualizados pela última vez às $1.',
+'perfcached' => "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
+'perfcachedts' => 'Os seguintes dados encontram-se armazenados na cache e foram atualizados pela última vez às $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Momentaneamente as atualizações para esta página estão desativadas. Por enquanto, os dados aqui presentes não poderão ser atualizados.',
'wrong_wfQuery_params' => 'Parâmetros incorretos para wfQuery()<br />
Função: $1<br />
Consulta: $2',
'viewsource' => 'Ver código-fonte',
-'viewsourcefor' => 'para $1',
+'viewsource-title' => 'Exibir código-fonte para $1',
'actionthrottled' => 'Ação controlada',
'actionthrottledtext' => 'Como medida "anti-spam", você se encontra impedido de realizar esta operação muitas vezes em um curto espaço de tempo; você já excedeu esse limite.
Tente novamente em alguns minutos.',
'protectedpagetext' => 'Esta página foi protegida contra novas edições.',
'viewsourcetext' => 'Você pode ver e copiar o código desta página:',
+'viewyourtext' => "Pode ver e copiar o código fonte '''das suas edições''' nesta página:",
'protectedinterface' => 'Esta página fornece texto de interface ao software e encontra-se trancada para prevenir abusos.',
'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. Para 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)',
@@ -774,6 +777,7 @@ Como resultado, visitantes que usam este endereço IP não podem criar mais nenh
'noemailprefs' => 'Especifique um endereço de e-mail para que os seguintes recursos funcionem.',
'emailconfirmlink' => 'Confirme o seu endereço de e-mail',
'invalidemailaddress' => "O endereço de ''e-mail'' não pode ser aceite devido a talvez possuir um formato inválido. Por favor, introduza um endereço bem formatado ou esvazie o campo.",
+'cannotchangeemail' => 'A conta de e-mail não pode ser alterado nesta wiki.',
'accountcreated' => 'Conta criada',
'accountcreatedtext' => 'A conta do usuário para $1 foi criada.',
'createaccount-title' => 'Criação de conta em {{SITENAME}}',
@@ -789,6 +793,7 @@ Por favor aguarde antes de tentar novamente.',
# E-mail sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
+'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de e-mail.',
# Change password dialog
'resetpass' => 'Alterar senha',
@@ -809,29 +814,44 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
'resetpass-temp-password' => 'Senha temporária:',
# Special:PasswordReset
-'passwordreset' => 'Repor Palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
-'passwordreset-legend' => 'Reiniciar a senha',
-'passwordreset-disabled' => 'Reiniciar a senha foi impossibilitado nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
-'passwordreset-username' => 'Nome de usuário:',
-'passwordreset-domain' => 'Domínio:',
-'passwordreset-email' => 'Endereço de e-mail:',
-'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, do endereço IP $1) solicitou um lembrete do seu detalhes de conta para {{SITENAME}} ($4). O seguinte usuário {{PLURAL:$3|conta|são contas}} associado com este endereço de e-mail:
+'passwordreset' => 'Repor Palavra-chave',
+'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
+'passwordreset-legend' => 'Reiniciar a senha',
+'passwordreset-disabled' => 'Reiniciar a senha foi impossibilitado nesta wiki.',
+'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-username' => 'Nome de usuário:',
+'passwordreset-domain' => 'Domínio:',
+'passwordreset-capture' => 'Ver o e-mail resultante?',
+'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o usuário.',
+'passwordreset-email' => 'Endereço de e-mail:',
+'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, do endereço IP $1) solicitou um lembrete do seu detalhes de conta para {{SITENAME}} ($4). O seguinte usuário {{PLURAL:$3|conta|são contas}} associado com este endereço de e-mail:
$2
{{PLURAL:$3|Esta senha temporária |Essas senhas temporárias}} vão expirar em {{PLURAL:$5|um dia|$5 dias}}.
Você deve efetuar login e escolher uma nova senha agora. Se você conseguir lembrar da senha, ignore este e-mail e continue usando sua senha anterior, do contrário, prossiga com as instruções clicando no link.',
-'passwordreset-emailtext-user' => 'O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
+'passwordreset-emailtext-user' => 'O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
$2
{{PLURAL:$3|Esta senha temporária irá|Estas senhas temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma senha nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua senha original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a senha antiga.',
-'passwordreset-emailelement' => 'Usuário: $1
+'passwordreset-emailelement' => 'Usuário: $1
Senha temporária: $2',
-'passwordreset-emailsent' => 'Foi enviado um e-mail de lembrete.',
+'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',
+
+# Special:ChangeEmail
+'changeemail' => 'Alterar o endereço de e-mail',
+'changeemail-header' => 'Alterar o endereço de e-mail da conta',
+'changeemail-text' => 'Preencha este formulário para alterar o endereço de e-mail. Para confirmar esta alteração terá de introduzir a sua senha.',
+'changeemail-no-info' => 'Para aceder diretamente a esta página você tem de estar autenticado.',
+'changeemail-oldemail' => 'Endereço de e-mail atual:',
+'changeemail-newemail' => 'Novo endereço de e-mail:',
+'changeemail-none' => '(nenhum)',
+'changeemail-submit' => 'Alterar e-mail',
+'changeemail-cancel' => 'Cancelar',
# Edit page toolbar
'bold_sample' => 'Texto em negrito',
@@ -902,9 +922,6 @@ Note que não poderá utilizar a funcionalidade "Contatar usuário" se não poss
Seu endereço de IP no momento é $3 e sua ID de bloqueio é #$5.
Por favor, inclua tais dados em qualquer tentativa de esclarecimentos que for realizar.',
'blockednoreason' => 'sem motivo especificado',
-'blockedoriginalsource' => "O código de '''$1''' é mostrado abaixo:",
-'blockededitsource' => "O texto das '''suas edições''' em '''$1''' é mostrado abaixo:",
-'whitelistedittitle' => 'É necessário autenticar-se para editar páginas',
'whitelistedittext' => 'Você precisa $1 para poder editar páginas.',
'confirmedittext' => 'Você precisa confirmar o seu endereço de e-mail antes de começar a editar páginas.
Por favor, introduza um e valide-o através das suas [[Special:Preferences|preferências de usuário]].',
@@ -990,7 +1007,8 @@ Você está, ao mesmo tempo, garantindo-nos que isto é algo escrito por você m
'copyrightwarning2' => "Por favor, note que todas as suas contribuições em {{SITENAME}} podem ser editadas, alteradas ou removidas por outros contribuidores. Se você não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />
Você está, ao mesmo tempo, a garantir-nos que isto é algo escrito por si, ou algo copiado de alguma fonte de textos em domínio público ou similarmente de teor livre (veja $1 para detalhes).
'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS DE AUTOR SEM A DEVIDA PERMISSÃO!'''",
-'longpageerror' => "'''ERRO: O texto de página que você submeteu tem mais de $1 quilobytes em tamanho, que é maior que o máximo de $2 quilobytes. A página não pode ser salva.'''",
+'longpageerror' => "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''
+A página não pode ser salva.",
'readonlywarning' => "'''Aviso: A base de dados foi bloqueada para manutenção, por isso você não poderá salvar a sua edição neste momento.'''
Pode, no entanto, copiar o seu texto num editor externo e guardá-lo para posterior envio.
@@ -1157,8 +1175,6 @@ Outros administradores no {{SITENAME}} continuarão podendo acessar ao conteúdo
'revdelete-unsuppress' => 'Remover restrições das edições restauradas',
'revdelete-log' => 'Motivo:',
'revdelete-submit' => 'Aplicar {{PLURAL:$1|à revisão selecionada|à revisões selecionadas}}',
-'revdelete-logentry' => 'alterou a visibilidade das revisões de "[[$1]]"',
-'logdelete-logentry' => 'alterou a visibilidade dos eventos de "[[$1]]"',
'revdelete-success' => "'''A visibilidade da revisão foi definida com sucesso.'''",
'revdelete-failure' => "'''A visibilidade da revisão não foi atualizada:'''
$1",
@@ -1170,15 +1186,6 @@ $1",
'revdel-restore-visible' => 'revisões visíveis',
'pagehist' => 'Histórico da página',
'deletedhist' => 'Histórico de eliminações',
-'revdelete-content' => 'conteúdo',
-'revdelete-summary' => 'sumário de edição',
-'revdelete-uname' => 'nome do usuário',
-'revdelete-restricted' => 'restrições a administradores aplicadas',
-'revdelete-unrestricted' => 'restrições a administradores removidas',
-'revdelete-hid' => 'ocultado $1',
-'revdelete-unhid' => 'desocultado $1',
-'revdelete-log-message' => '$1 para $2 {{PLURAL:$2|revisão|revisões}}',
-'logdelete-log-message' => '$1 para $2 {{PLURAL:$2|evento|eventos}}',
'revdelete-hide-current' => 'Erro ao ocultar o item datado de $2, $1: esta é a revisão atual.
Não pode ser ocultada.',
'revdelete-show-no-access' => 'Erro ao mostrar o item datado de $2, $1: este item foi marcado como "restrito".
@@ -1336,12 +1343,14 @@ Note que os índices do sistema de busca externo poderão conter referências de
'prefs-rc' => 'Mudanças recentes',
'prefs-watchlist' => 'Lista de páginas vigiadas',
'prefs-watchlist-days' => 'Dias a mostrar na lista de páginas vigiadas:',
-'prefs-watchlist-days-max' => 'No máximo 7 dias',
+'prefs-watchlist-days-max' => 'Máximo $1 {{PLURAL:$1|dia|dias}}',
'prefs-watchlist-edits' => 'Número de edições mostradas na lista de páginas vigiadas expandida:',
'prefs-watchlist-edits-max' => 'Número máximo: 1000',
'prefs-watchlist-token' => 'Senha para a lista de páginas vigiadas:',
'prefs-misc' => 'Diversos',
'prefs-resetpass' => 'Alterar senha',
+'prefs-changeemail' => 'Alterar e-mail',
+'prefs-setemail' => 'Definir um endereço de e-mail',
'prefs-email' => 'Opções de email',
'prefs-rendering' => 'Aparência',
'saveprefs' => 'Salvar',
@@ -1401,6 +1410,7 @@ Esta ação não pode ser desfeita.',
'yourrealname' => 'Nome verdadeiro:',
'yourlanguage' => 'Língua:',
'yourvariant' => 'Variante da língua de conteúdo:',
+'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.',
'yournick' => 'Assinatura:',
'prefs-help-signature' => 'Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles (<nowiki>~~~~</nowiki>) no fim dos comentários. Ao salvar, estes serão convertidos na sua assinatura mais a data e a hora da edição.',
'badsig' => 'Assinatura inválida; verifique o código HTML utilizado.',
@@ -1441,7 +1451,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'userrights-lookup-user' => 'Administrar grupos de usuários',
'userrights-user-editname' => 'Forneça um nome de usuário:',
'editusergroup' => 'Editar grupos de usuários',
-'editinguser' => "Modificando privilégios do usuário '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modificando privilégios do usuário '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Editar grupos do usuário',
'saveusergroups' => 'Salvar grupos do usuário',
'userrights-groupsmember' => 'Membro de:',
@@ -1535,13 +1545,13 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'right-autopatrol' => 'Ter edições automaticamente marcadas como patrulhadas',
'right-patrolmarks' => 'Usar funcionalidades de patrulhagem das mudanças recentes',
'right-unwatchedpages' => 'Ver uma lista de páginas não vigiadas',
-'right-trackback' => "Submeter um 'trackback'",
'right-mergehistory' => 'Fundir o histórico de páginas',
'right-userrights' => 'Editar todos os direitos de usuário',
'right-userrights-interwiki' => 'Editar direitos de usuário de usuários outros sites wiki',
'right-siteadmin' => 'Bloquear e desbloquear o banco de dados',
'right-override-export-depth' => 'Exportar páginas incluindo páginas ligadas até uma profundidade de 5',
'right-sendemail' => 'Enviar email a outros usuários',
+'right-passwordreset' => 'Ver todos os e-mails de reposição de senhas',
# User rights log
'rightslog' => 'Registro de privilégios de usuário',
@@ -1575,16 +1585,17 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'action-suppressionlog' => 'ver este registro privado',
'action-block' => 'impedir que este usuário edite',
'action-protect' => 'alterar os níveis de proteção desta página',
+'action-rollback' => 'Reverter rapidamente as edições do último usuário que editou uma página em particular',
'action-import' => 'importar esta página a partir de outra wiki',
'action-importupload' => 'importar esta página através do carregamento de um arquivo',
'action-patrol' => 'marcar as edições de outros usuários como patrulhadas',
'action-autopatrol' => 'ter suas edições marcadas como patrulhadas',
'action-unwatchedpages' => 'ver a lista de páginas não-vigiadas',
-'action-trackback' => "enviar um ''trackback''",
'action-mergehistory' => 'fundir o histórico de edições desta página',
'action-userrights' => 'editar todos os privilégios de usuário',
'action-userrights-interwiki' => 'editar privilégios de usuários de outras wikis',
'action-siteadmin' => 'bloquear ou desbloquear o banco de dados',
+'action-sendemail' => 'enviar e-mail',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
@@ -1616,6 +1627,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'number_of_watching_users_pageview' => '[{{PLURAL:$1|$1 usuário|$1 usuários}} a vigiar]',
'rc_categories' => 'Limite para categorias (separar com "|")',
'rc_categories_any' => 'Qualquer',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} após mudança',
'newsectionsummary' => '/* $1 */ nova seção',
'rc-enhanced-expand' => 'Mostrar detalhes (requer JavaScript)',
'rc-enhanced-hide' => 'Esconder detalhes',
@@ -1669,6 +1681,7 @@ A [[Special:NewFiles|galeria de arquivos novos]] oferece uma listagem mais visua
'ignorewarnings' => 'Ignorar todos os avisos',
'minlength1' => 'Os nomes de arquivos devem de ter pelo menos uma letra.',
'illegalfilename' => 'O arquivo "$1" possui caracteres que não são permitidos no título de uma página. Por favor, altere o nome do arquivo e tente carregar novamente.',
+'filename-toolong' => 'Os nomes dos arquivo não podem ser superiores a 240 bytes.',
'badfilename' => 'O nome do arquivo foi alterado para "$1".',
'filetype-mime-mismatch' => 'A extensão ".$1" não corresponde ao tipo MIME do arquivo ($2).',
'filetype-badmime' => 'Arquivos de tipo MIME "$1" não são permitidos de serem enviados.',
@@ -1773,6 +1786,14 @@ Por gentileza, entre em contato com um [[Special:ListUsers/sysop|administrador]]
'upload-unknown-size' => 'Tamanho desconhecido',
'upload-http-error' => 'Ocorreu um erro HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Não foi possível transmitir o arquivo $1.',
+'backend-fail-backup' => 'Não foi possível fazer backup do arquivo $1 .',
+'backend-fail-notexists' => 'O arquivo $1 não existe.',
+'backend-fail-hashes' => 'Não foi possível obter os hashes do arquivo para comparação.',
+'backend-fail-notsame' => 'Já existe um arquivo não idêntico em $1 .',
+'backend-fail-invalidpath' => '$1 não é um caminho válido de armazenamento.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Foi encontrado um erro ao abrir o arquivo ZIP para verificação.',
'zip-wrong-format' => 'O arquivo especificado não é um arquivo ZIP.',
@@ -1895,23 +1916,24 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
'filerevert-badversion' => 'Não há uma versão local anterior deste arquivo no período de tempo especificado.',
# File deletion
-'filedelete' => 'Eliminar $1',
-'filedelete-legend' => 'Eliminar arquivo',
-'filedelete-intro' => "Você está prestes a eliminar o arquivo '''[[Media:$1|$1]]''' junto com todo o seu histórico.",
-'filedelete-intro-old' => '<span class="plainlinks">Você se encontra prestes a eliminar a versão de \'\'\'[[Media:$1|$1]]\'\'\' tal como se encontrava em [$4 $3, $2].</span>',
-'filedelete-comment' => 'Motivo:',
-'filedelete-submit' => 'Eliminar',
-'filedelete-success' => "'''$1''' foi eliminado.",
-'filedelete-success-old' => "A versão de '''[[Media:$1|$1]]''' tal como $3, $2 foi eliminada.",
-'filedelete-nofile' => "'''$1''' não existe.",
-'filedelete-nofile-old' => "Não há nenhuma versão de '''$1''' em arquivo com os parâmetros especificados.",
-'filedelete-otherreason' => 'Outro/motivo adicional:',
-'filedelete-reason-otherlist' => 'Outro motivo',
-'filedelete-reason-dropdown' => '*Motivos comuns para eliminação
+'filedelete' => 'Eliminar $1',
+'filedelete-legend' => 'Eliminar arquivo',
+'filedelete-intro' => "Você está prestes a eliminar o arquivo '''[[Media:$1|$1]]''' junto com todo o seu histórico.",
+'filedelete-intro-old' => '<span class="plainlinks">Você se encontra prestes a eliminar a versão de \'\'\'[[Media:$1|$1]]\'\'\' tal como se encontrava em [$4 $3, $2].</span>',
+'filedelete-comment' => 'Motivo:',
+'filedelete-submit' => 'Eliminar',
+'filedelete-success' => "'''$1''' foi eliminado.",
+'filedelete-success-old' => "A versão de '''[[Media:$1|$1]]''' tal como $3, $2 foi eliminada.",
+'filedelete-nofile' => "'''$1''' não existe.",
+'filedelete-nofile-old' => "Não há nenhuma versão de '''$1''' em arquivo com os parâmetros especificados.",
+'filedelete-otherreason' => 'Outro/motivo adicional:',
+'filedelete-reason-otherlist' => 'Outro motivo',
+'filedelete-reason-dropdown' => '*Motivos comuns para eliminação
** Violação de direitos de autor
** Arquivo duplicado',
-'filedelete-edit-reasonlist' => 'Editar motivos de eliminação',
-'filedelete-maintenance' => 'Eliminação e restauro de arquivos estão temporariamente desativados durante manutenção.',
+'filedelete-edit-reasonlist' => 'Editar motivos de eliminação',
+'filedelete-maintenance' => 'Eliminação e restauro de arquivos estão temporariamente desativados durante manutenção.',
+'filedelete-maintenance-title' => 'Não é possível excluir o arquivo',
# MIME search
'mimesearch' => 'Pesquisa MIME',
@@ -2031,7 +2053,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
'listusers-editsonly' => 'Mostrar apenas usuários com edições',
'listusers-creationsort' => 'Ordenar por data de criação',
'usereditcount' => '$1 {{PLURAL:$1|edição|edições}}',
-'usercreated' => 'Registrado em $1 às $2',
+'usercreated' => '{{GENDER:$3|Criado|Criada}} em $1 às $2',
'newpages' => 'Páginas novas',
'newpages-username' => 'Nome de usuário:',
'ancientpages' => 'Páginas mais antigas',
@@ -2124,12 +2146,8 @@ Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquis
'activeusers-noresult' => 'Nenhum usuário encontrado.',
# Special:Log/newusers
-'newuserlogpage' => 'Registro de criação de usuários',
-'newuserlogpagetext' => 'Este é um registro de novas contas de usuário',
-'newuserlog-byemail' => 'senha enviada por correio-eletrônico',
-'newuserlog-create-entry' => 'Novo usuário',
-'newuserlog-create2-entry' => 'criou nova conta para $1',
-'newuserlog-autocreate-entry' => 'Conta criada automaticamente',
+'newuserlogpage' => 'Registro de criação de usuários',
+'newuserlogpagetext' => 'Este é um registro de novas contas de usuário',
# Special:ListGroupRights
'listgrouprights' => 'Privilégios de grupo de usuários',
@@ -2158,7 +2176,7 @@ Pode haver [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] s
'emailpagetext' => 'Você pode usar o formulário abaixo para enviar uma mensagem por correio eletrônico para este usuário.
O endereço eletrônico que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, então o destinatário poderá responder diretamente para você.',
'usermailererror' => 'Erro no email:',
-'defemailsubject' => 'E-mail: {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} e-mail do usuário "$1"',
'usermaildisabled' => 'O e-mail do usuário foi desativado',
'usermaildisabledtext' => 'Você não tem como enviar e-mails a outros usuários deste wiki.',
'noemailtitle' => 'Sem endereço de e-mail',
@@ -2212,7 +2230,7 @@ Modificações futuras em tal página e páginas de discussão a ela associadas
'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}}.',
'iteminvalidname' => "Problema com item '$1', nome inválido...",
-'wlnote' => "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}}.",
+'wlnote' => "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas '''$1''' alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas '''$2''' horas}} a partir de $3, $4.",
'wlshowlast' => 'Ver últimas $1 horas $2 dias $3',
'watchlist-options' => 'Opções da lista de páginas vigiadas',
@@ -2278,8 +2296,6 @@ Por favor, confirme que possui a intenção de fazer isto, que compreende as con
'actionfailed' => 'A ação falhou',
'deletedtext' => '"$1" foi eliminada.
Consulte $2 para um registro de eliminações recentes.',
-'deletedarticle' => 'apagou "[[$1]]"',
-'suppressedarticle' => 'suprimiu "[[$1]]"',
'dellogpage' => 'Registro de eliminação',
'dellogpagetext' => 'Abaixo uma lista das eliminações mais recentes.',
'deletionlog' => 'registro de eliminação',
@@ -2328,7 +2344,10 @@ Consulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as p
'unprotectedarticle' => 'removeu a proteção de "[[$1]]"',
'movedarticleprotection' => 'moveu as configurações de proteção de "[[$2]]" para "[[$1]]"',
'protect-title' => 'Protegendo "$1"',
+'protect-title-notallowed' => 'Ver o nível de proteção de "$1"',
'prot_1movedto2' => '[[$1]] foi movido para [[$2]]',
+'protect-badnamespace-title' => 'Espaço de nomes não-protegidos',
+'protect-badnamespace-text' => 'As páginas presentes nesse espaço de nomes não se pode proteger',
'protect-legend' => 'Confirmar proteção',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Expiração',
@@ -2348,6 +2367,7 @@ Esta é a configuração atual para a página '''$1''':",
'protect-level-sysop' => 'Apenas administradores',
'protect-summary-cascade' => 'p. progressiva',
'protect-expiring' => 'expira em $1 (UTC)',
+'protect-expiring-local' => 'expira $1',
'protect-expiry-indefinite' => 'indefinido',
'protect-cascade' => '"Proteção progressiva" - proteja quaisquer páginas que estejam incluídas nesta.',
'protect-cantedit' => 'Você não pode alterar o nível de proteção desta página uma vez que você não se encontra habilitado a editá-la.',
@@ -2405,7 +2425,6 @@ Em tais casos, deverá desselecionar ou reverter a ocultação da versão apagad
'undeletereset' => 'Limpar',
'undeleteinvert' => 'Inverter seleção',
'undeletecomment' => 'Motivo:',
-'undeletedarticle' => 'restaurou "[[$1]]"',
'undeletedrevisions' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$2|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}',
'undeletedfiles' => '{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}',
@@ -2414,6 +2433,7 @@ Em tais casos, deverá desselecionar ou reverter a ocultação da versão apagad
Consulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.",
'undelete-header' => 'Veja o [[Special:Log/delete|registro de deleções]] para as páginas recentemente eliminadas.',
+'undelete-search-title' => 'Pesquisar páginas eliminadas',
'undelete-search-box' => 'Pesquisar páginas eliminadas',
'undelete-search-prefix' => 'Exibir páginas que iniciem com:',
'undelete-search-submit' => 'Pesquisar',
@@ -2422,6 +2442,7 @@ Consulte o [[Special:Log/delete|registro de eliminações]] para um registro das
'undelete-bad-store-key' => 'Não foi possível restaurar a versão do arquivo de $1: já não existia antes da eliminação.',
'undelete-cleanup-error' => 'Erro ao eliminar o arquivo não utilizado "$1".',
'undelete-missing-filearchive' => 'Não é possível restaurar o arquivo de ID $1, uma vez que ele não se encontra na base de dados. Isso pode significar que já tenha sido restaurado.',
+'undelete-error' => 'Erro ao restaurar a página',
'undelete-error-short' => 'Erro ao restaurar arquivo: $1',
'undelete-error-long' => 'Foram encontrados erros ao tentar restaurar o arquivo:
@@ -2541,6 +2562,7 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
'blocklist-userblocks' => 'Esconder bloqueios de contas',
'blocklist-tempblocks' => 'Esconder bloqueios temporários',
'blocklist-addressblocks' => 'Esconder bloqueios de IP único',
+'blocklist-rangeblocks' => 'Ocultar blocos gama',
'blocklist-timestamp' => 'Data e hora',
'blocklist-target' => 'Destinatário',
'blocklist-expiry' => 'Expira',
@@ -2563,6 +2585,7 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
'unblocklink' => 'desbloquear',
'change-blocklink' => 'alterar bloqueio',
'contribslink' => 'contribs',
+'emaillink' => 'enviar um e-mail',
'autoblocker' => 'Você foi automaticamente bloqueado, pois partilha um endereço de IP com "[[User:$1|$1]]". O motivo apresentado foi: "$2".',
'blocklogpage' => 'Registro de bloqueio',
'blocklog-showlog' => 'Este usuário já foi bloqueado anteriormente.
@@ -2681,9 +2704,6 @@ Por favor, escolha outro nome.',
'movepage-page-moved' => 'A página $1 foi movida para $2',
'movepage-page-unmoved' => 'A página $1 não pôde ser movida para $2.',
'movepage-max-pages' => 'O limite de $1 {{PLURAL:$1|página movida|páginas movidas}} foi atingido; não será possível mover mais páginas de forma automática.',
-'1movedto2' => 'moveu [[$1]] para [[$2]]',
-'1movedto2_redir' => 'moveu [[$1]] para [[$2]] sobre redirecionamento',
-'move-redirect-suppressed' => 'redirecionamento suprimido',
'movelogpage' => 'Registro de movimento',
'movelogpagetext' => 'Abaixo encontra-se uma lista de páginas movidas.',
'movesubpage' => '{{PLURAL:$1|Subpágina|Subpáginas}}',
@@ -2695,7 +2715,7 @@ Por favor, escolha outro nome.',
'delete_and_move_text' => '==Eliminação necessária==
A página de destino ("[[:$1]]") já existe. Deseja eliminá-la de modo a poder mover?',
'delete_and_move_confirm' => 'Sim, eliminar a página',
-'delete_and_move_reason' => 'Eliminada para poder mover outra página para este título',
+'delete_and_move_reason' => 'Eliminada para mover "[[$1]]"',
'selfmove' => 'O título fonte e o título destinatário são os mesmos; não é possível mover uma página para ela mesma.',
'immobile-source-namespace' => 'Não é possível mover páginas no espaço nominal "$1"',
'immobile-target-namespace' => 'Não é possível mover páginas para o espaço nominal "$1"',
@@ -2727,6 +2747,7 @@ Se desejar, pode utilizar uma ligação (por exemplo, [[{{#Special:Export}}/{{Me
'exportcuronly' => 'Incluir apenas a revisão atual, não o histórico inteiro',
'exportnohistory' => "----
'''Nota:''' a exportação do histórico completo das páginas através deste formulário foi desativada devido a questões de performance.",
+'exportlistauthors' => 'Incluir uma lista completa dos colaboradores de cada página',
'export-submit' => 'Exportar',
'export-addcattext' => 'Adicionar à listagem páginas da categoria:',
'export-addcat' => 'Adicionar',
@@ -2803,6 +2824,8 @@ Salve o arquivo no seu computador e importe-o aqui.',
'import-upload' => 'Enviar dados em XML',
'import-token-mismatch' => 'Perda dos dados da sessão. Por favor tente novamente.',
'import-invalid-interwiki' => 'Não é possível importar da wiki especificada.',
+'import-error-edit' => 'A página "$1" não foi importada porque você não tem permissão para editá-la.',
+'import-error-create' => 'A página "$1" não foi importada porque você não tem permissão para criá-la.',
# Import log
'importlogpage' => 'Registro de importações',
@@ -2956,9 +2979,6 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
# Patrol log
'patrol-log-page' => 'Registro de edições patrulhadas',
'patrol-log-header' => 'Este é um registro de edições patrulhadas.',
-'patrol-log-line' => 'marcou a $1 de $2 como uma edição patrulhada $3',
-'patrol-log-auto' => 'automaticamente',
-'patrol-log-diff' => 'edição $1',
'log-show-hide-patrol' => '$1 registro de edições patrulhadas',
# Image deletion
@@ -2985,11 +3005,11 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'file-info' => 'tamanho: $1, tipo MIME: $2',
'file-info-size' => '$1 × $2 pixels, tamanho: $3, tipo MIME: $4',
'file-info-size-pages' => '$1 × $2 pixels, tamanho do arquivo: $3, tipo MIME: $4, $5 {{PLURAL:$5|página|páginas}}',
-'file-nohires' => '<small>Sem resolução maior disponível.</small>',
+'file-nohires' => 'Sem resolução maior disponível.',
'svg-long-desc' => 'arquivo SVG, de $1 × $2 pixels, tamanho: $3',
'show-big-image' => 'Resolução completa',
-'show-big-image-preview' => '<small>Tamanho desta previsualização: $1.</small>',
-'show-big-image-other' => '<small>Outras resoluções: $1.</small>',
+'show-big-image-preview' => 'Tamanho desta previsualização: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
'file-info-gif-looped' => 'cíclico',
'file-info-gif-frames' => '$1 {{PLURAL:$1|quadro|quadros}}',
@@ -3009,6 +3029,13 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'bydate' => 'por data',
'sp-newimages-showfrom' => 'Mostrar novos arquivos a partir das $2 de $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|um segundo|$1 segundos}}',
+'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
+'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
+'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'ago' => '$1 atrás',
+
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3508,13 +3535,6 @@ Este código de confirmação irá expirar em $4.',
'scarytranscludefailed' => '[Não foi possível obter a predefinição a partir de $1]',
'scarytranscludetoolong' => '[URL longa demais]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks para esta página:<br />
-$1',
-'trackbackremove' => '([$1 Eliminar])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'O trackback foi eliminado com sucesso.',
-
# Delete conflict
'deletedwhileediting' => "'''Aviso''': Esta página foi eliminada após você ter começado a editar!",
'confirmrecreate' => "O usuário [[User:$1|$1]] ([[User talk:$1|Discussão]]) eliminou esta página após você ter começado a editar, pelo seguinte motivo:
@@ -3596,6 +3616,9 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
'watchlisttools-edit' => 'Ver e editar a lista de páginas vigiadas',
'watchlisttools-raw' => 'Edição crua da lista de páginas vigiadas',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussão]])',
+
# Core parser functions
'unknown_extension_tag' => '"$1" é uma tag de extensão desconhecida',
'duplicate-defaultsort' => 'Aviso: A chave de ordenação padrão "$2" sobrepõe-se à anterior chave de ordenação padrão "$1".',
@@ -3651,8 +3674,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'specialpages' => 'Páginas especiais',
'specialpages-note' => '----
* Páginas especiais normais.
-* <span class="mw-specialpagerestricted">Páginas especiais restritas.</span>
-* <span class="mw-specialpagecached">Páginas especiais com cache (podem estar obsoletas).</span>',
+* <span class="mw-specialpagerestricted">Páginas especiais restritas.</span>',
'specialpages-group-maintenance' => 'Relatórios de manutenção',
'specialpages-group-other' => 'Outras páginas especiais',
'specialpages-group-login' => 'Entrar / registrar-se',
@@ -3694,13 +3716,16 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
# Special:ComparePages
-'comparepages' => 'Comparar páginas',
-'compare-selector' => 'Comparar edições da página',
-'compare-page1' => 'Página 1',
-'compare-page2' => 'Página 2',
-'compare-rev1' => 'Edição 1',
-'compare-rev2' => 'Edição 2',
-'compare-submit' => 'Comparar',
+'comparepages' => 'Comparar páginas',
+'compare-selector' => 'Comparar edições da página',
+'compare-page1' => 'Página 1',
+'compare-page2' => 'Página 2',
+'compare-rev1' => 'Edição 1',
+'compare-rev2' => 'Edição 2',
+'compare-submit' => 'Comparar',
+'compare-invalid-title' => 'O título que você especificou é inválido.',
+'compare-title-not-exists' => 'O título que você especificou não existe.',
+'compare-revision-not-exists' => 'A revisão que você especificou não existe.',
# Database error messages
'dberr-header' => 'Este wiki tem um problema',
@@ -3727,4 +3752,83 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
'sqlite-no-fts' => '$1 sem suporte de pesquisa de texto completo',
+# New logging system
+'logentry-delete-delete' => '$1 apagou a página $3',
+'logentry-delete-restore' => '$1 restaurou a página $3',
+'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|$5 das entradas}} em $3: $4',
+'logentry-delete-revision' => '$1 alterou a visibilidade {{PLURAL:$5|de uma revisão|$5 das revisões}} em $3: $4',
+'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
+'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
+'logentry-suppress-delete' => '$1 suprimiu a página $3',
+'logentry-suppress-event' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma entrada|$5 das entradas}} em $3: $4',
+'logentry-suppress-revision' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma revisão|$5 das revisões}} em $3: $4',
+'logentry-suppress-event-legacy' => '$1 alterou secretamente a visibilidade das entradas em $3',
+'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade das revisões em $3',
+'revdelete-content-hid' => 'conteúdo oculto',
+'revdelete-summary-hid' => 'editar sumário oculto',
+'revdelete-uname-hid' => 'nome de usuário oculto',
+'revdelete-content-unhid' => 'conteúdo não oculto',
+'revdelete-summary-unhid' => 'editar sumário não oculto',
+'revdelete-uname-unhid' => 'nome de usuário não oculto',
+'revdelete-restricted' => 'restrições a administradores aplicadas',
+'revdelete-unrestricted' => 'restrições a administradores removidas',
+'logentry-move-move' => '$1 moveu página $3 para $4',
+'logentry-move-move-noredirect' => '$1 moveu página $3 para $4 sem deixar um redirecionamento',
+'logentry-move-move_redir' => '$1 moveu a página $3 para $4 através de um redirecionamento',
+'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sem um redirecionamento',
+'logentry-patrol-patrol' => '$1 marcou a revisão $4 da página $3 como patrulhada',
+'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisão $4 da página $3 como patrulhada',
+'logentry-newusers-newusers' => '$1 criou uma conta de usuário',
+'logentry-newusers-create' => '$1 criou uma conta de usuário',
+'logentry-newusers-create2' => '$1 criou uma conta de usuário $3',
+'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticalmente',
+'newuserlog-byemail' => 'senha enviada por correio-eletrônico',
+
+# Feedback
+'feedback-subject' => 'Assunto:',
+'feedback-message' => 'Mensagem:',
+'feedback-cancel' => 'Cancelar',
+'feedback-submit' => 'Enviar Comentários',
+'feedback-adding' => 'Adicionando os comentários na página...',
+'feedback-error1' => 'Erro: O resultado da API não foi reconhecido',
+'feedback-error2' => 'Erro: A edição falhou',
+'feedback-error3' => 'Erro: A API não responde',
+
+# API errors
+'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para esta wiki.',
+'api-error-badtoken' => 'Erro interno: token inválido.',
+'api-error-copyuploaddisabled' => 'O upload por URL está desativado neste servidor.',
+'api-error-duplicate' => 'Já {{PLURAL:$1|há [$2 outro arquivo]|existem [$2 outros arquivos]}} com o mesmo conteúdo',
+'api-error-duplicate-archive' => 'Já {{PLURAL:$1|existiu [$2 outro arquivo]|existiram [$2 outros arquivos]}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.',
+'api-error-duplicate-archive-popup-title' => 'Duplicata de {{PLURAL:$1|arquivo|arquivos}} que já {{PLURAL:$1|foi apagado|foram apagados}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Arquivo|Arquivos}} em duplicata',
+'api-error-empty-file' => 'O arquivo que você enviou está vazio.',
+'api-error-fetchfileerror' => 'Erro interno: ocorreu um problema indeterminado ao acessar o arquivo.',
+'api-error-file-too-large' => 'O arquivo que você enviou é muito grande.',
+'api-error-filename-tooshort' => 'O nome do arquivo é curto demais.',
+'api-error-filetype-banned' => 'Este tipo do arquivo é proibido.',
+'api-error-filetype-missing' => 'Falta a extensão de arquivo.',
+'api-error-hookaborted' => 'A modificação que você tentou realizar foi abortada pelo hook de uma extensão.',
+'api-error-http' => 'Erro interno: não foi possível conectar ao servidor.',
+'api-error-illegal-filename' => 'O nome do arquivo não é permitido.',
+'api-error-internal-error' => 'Erro interno: ocorreu um erro indeterminado na wiki ao processar o arquivo que você enviou.',
+'api-error-invalid-file-key' => 'Erro interno: o arquivo não foi encontrado no armazenamento temporário.',
+'api-error-missingparam' => 'Erro interno: parâmetros em falta no pedido.',
+'api-error-missingresult' => 'Erro interno: não foi possível determinar se a cópia foi feita.',
+'api-error-mustbeloggedin' => 'Você precisa estar autenticado para enviar arquivos.',
+'api-error-mustbeposted' => 'Erro interno: a solicitação requer HTTP POST',
+'api-error-noimageinfo' => 'O upload foi concluído, mas o servidor não retornou informações sobre o arquivo.',
+'api-error-nomodule' => 'Erro interno: o módulo de upload não está configurado.',
+'api-error-ok-but-empty' => 'Erro interno: não há resposta do servidor.',
+'api-error-overwrite' => 'Não é permitido sobrescrever um arquivo já existente.',
+'api-error-stashfailed' => 'Erro interno: o servidor não conseguiu armazenar o arquivo temporário.',
+'api-error-timeout' => 'O servidor não respondeu dentro do tempo esperado.',
+'api-error-unclassified' => 'Ocorreu um erro desconhecido',
+'api-error-unknown-code' => 'Erro desconhecido: "$1"',
+'api-error-unknown-error' => 'Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.',
+'api-error-unknown-warning' => 'Aviso desconhecido: $1',
+'api-error-unknownerror' => 'Erro desconhecido: "$1".',
+'api-error-uploaddisabled' => 'Esta wiki está com uploads de arquivos desativados.',
+'api-error-verification-error' => 'Este arquivo pode estar corrompido ou ter a extensão errada.',
+
);
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index 9aa9bab2..39592dc4 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -34,6 +34,7 @@
* @author Erwin
* @author Erwin85
* @author EugeneZelenko
+ * @author Fitoschido
* @author Fryed-peach
* @author Garas
* @author GerardM
@@ -49,10 +50,12 @@
* @author Iwan Novirion
* @author Jon Harald Søby
* @author Karduelis
+ * @author Kghbln
* @author Kizito
* @author Klenje
* @author Klutzy
* @author Krinkle
+ * @author Ktkaushik
* @author Kwj2772
* @author Leinad
* @author Lejonel
@@ -64,6 +67,7 @@
* @author MaxSem
* @author McDutchie
* @author Meno25
+ * @author Metalhead64
* @author MichaelFrey
* @author Mihai
* @author Mormegil
@@ -78,6 +82,7 @@
* @author Onecountry
* @author OsamaK
* @author PhiLiP
+ * @author Piangpha
* @author Platonides
* @author Prima klasy4na
* @author Prometheus.pyrphoros
@@ -99,6 +104,7 @@
* @author Slomox
* @author Sp5uhe
* @author Srhat
+ * @author Subhashkataria21.90
* @author Tedjuh10
* @author Tgr
* @author The Evil IP address
@@ -112,6 +118,7 @@
* @author Waldir
* @author Whym
* @author Yekrats
+ * @author Ynwala
* @author Yuriy Apostol
* @author Yyy
* @author Žekřil71pl
@@ -522,6 +529,9 @@ For explanation of 'lock' see [http://en.wikipedia.org/wiki/Lock_%28computer_sci
Do '''not''' replace SITENAME with a translation of Wikipedia or some encycopedic additions. The message has to be neutral for all projects.",
'pagetitle-view-mainpage' => '{{optional}}',
+'backlinksubtitle' => '{{optional}}
+Appears in subtitle
+* $1 is a link to the page (HTML)',
'retrievedfrom' => 'Message which appears in the source of every page, but it is hidden. It is shown when printing. $1 is a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}.',
'youhavenewmessages' => 'The blue message appearing when someone edited your user talk page.
The format is: "{{int:youhavenewmessages| [[MediaWiki:Newmessageslink/{{SUBPAGENAME}}|{{int:newmessageslink}}]] |[[MediaWiki:Newmessagesdifflink/{{SUBPAGENAME}}|{{int:newmessagesdifflink}}]]}}"',
@@ -645,24 +655,29 @@ HTML markup cannot be used.
'fileappenderrorread' => '"Append" is a computer procedure, explained on [http://en.wikipedia.org/wiki/Append Wikipedia].
$1 is a filename, I think.',
+'cannotdelete-title' => 'Title of error page when the user cannot delete a page
+* $1 is the page name',
'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}}.',
+'perfcached' => 'Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen). Parameters:
+* $1 is the max result cut off ($wgQueryCacheLimit)',
'perfcachedts' => 'Used on pages that list page lists for which the displayed data is cached. Parameters:
* $1 is a time stamp (date and time combined)
* $2 is a date (optional)
-* $3 is a time (optional)',
+* $3 is a time (optional)
+* $4 is the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.',
'querypage-no-updates' => 'Text on some special pages, e.g. [[Special:FewestRevisions]].',
'viewsource' => 'The text displayed in place of the "edit" tab when the user has no permission to edit the page.
{{Identical|View source}}',
-'viewsourcefor' => 'Subtitle shown when trying to edit a protected page.
-
-{{Identical|For $1}}',
+'viewsource-title' => 'Page title shown when trying to edit a protected page.
+* $1 is the name of the page',
'actionthrottled' => 'This is the title of an error page. Read it in combination with {{msg-mw|actionthrottledtext}}.',
'protectedpagetext' => 'This message is displayed when trying to edit a page you can\'t edit because it has been protected.
* $1: the protection type, e.g. "protect" for fully protected pages',
'viewsourcetext' => 'The text shown when displaying the source of a page that the user has no permission to edit',
+'viewyourtext' => 'Same as {{msg-mw|viewsourcetext}} but when showing the text submitted by the user, this happens e.g. when the user was blocked while he is editing the page',
'protectedinterface' => 'Message shown if a user without the "editinterface" right tries to edit a page in the MediaWiki namespace.',
'editinginterface' => "A message shown when editing pages in the namespace MediaWiki:. In the [http://translatewiki.net/wiki/Main_Page?setlang=en URL], '''change \"setlang=en\" to your own language code.'''",
'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
@@ -757,6 +772,7 @@ Parameters:
'noemailprefs' => "Message appearing in the 'E-mail options' section of the 'User profile' page in [[Special:Preferences|Preferences]], when no user e-mail address has been entered.",
'emailconfirmlink' => 'Link to [[Special:ConfirmEmail]]. Appears in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}} after saving your e-mail address but before it has been authenticated.',
'invalidemailaddress' => 'Shown as a warning when written an invalid e-mail adress in [[Special:Preferences]] and {{fullurl:Special:UserLogin|type=signup}} page',
+'cannotchangeemail' => 'Error message shown when user goes to [[Special:ChangeEmail]] but email addresses cannot be changed on the site.',
'createaccount-title' => 'This is the subject of an e-mail sent to the e-mail address entered at [[Special:CreateAccount]] if the button "by e-mail" is clicked.',
'createaccount-text' => 'This text is sent as an e-mail to the e-mail address entered at [[Special:CreateAccount]] if the button "by e-mail" is clicked.
@@ -768,6 +784,9 @@ Parameters:
'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true.
{{Identical|Language}}',
+# E-mail sending
+'user-mail-no-addy' => 'This is the error message in case an e-mail could not be sent because there was no e-mail address to send it to.',
+
# Change password dialog
'resetpass' => 'The caption of [[Special:ChangePassword]]
@@ -790,31 +809,50 @@ Used on [[Special:ResetPass]]',
'resetpass-temp-password' => 'The label of the input box for the temporary password (received by e-mail) on the form displayed after logging in with a temporary password.',
# Special:PasswordReset
-'passwordreset' => 'Title of [[Special:PasswordReset]].
+'passwordreset' => 'Title of [[Special:PasswordReset]].
{{Identical|Reset password}}',
-'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
-'passwordreset-legend' => '{{Identical|Reset password}}',
-'passwordreset-pretext' => '$1 is the number of password reset routes. Apparently, this is never 1, but always two or more. Thus, the first plural option is empty in English.',
-'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-email' => '{{Identical|E-mail address}}',
-'passwordreset-emailtext-ip' => 'Be consistent with {{msg-mw|Passwordreset-emailtext-user|notext=y}}.
+'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
+'passwordreset-legend' => '{{Identical|Reset password}}',
+'passwordreset-pretext' => '$1 is the number of password reset routes. Apparently, this is never 1, but always two or more. Thus, the first plural option is empty in English.',
+'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 <tt>passwordreset</tt> permission',
+'passwordreset-capture-help' => 'Longer explanatory message for the capture checkbox label.',
+'passwordreset-email' => '{{Identical|E-mail address}}',
+'passwordreset-emailtext-ip' => 'Be consistent with {{msg-mw|Passwordreset-emailtext-user|notext=y}}.
Parameters:
* $1 - an IP address
* $2 - message {{msg-mw|passwordreset-emailelement|notext=1}} repeated $3 times
* $3 - the number of repetitions in $2
* $4 - base URL of the wiki',
-'passwordreset-emailtext-user' => 'Be consistent with {{msg-mw|Passwordreset-emailtext-ip|notext=y}}.
+'passwordreset-emailtext-user' => 'Be consistent with {{msg-mw|Passwordreset-emailtext-ip|notext=y}}.
Parameters:
* $1 - a user name
* $2 - message {{msg-mw|passwordreset-emailelement|notext=1}} repeated $3 times
* $3 - the number of repetitions in $2
* $4 - base URL of the wiki',
-'passwordreset-emailelement' => "This is a body of a reminder email to allow them into the system with a new password.
+'passwordreset-emailelement' => "This is a body of a reminder email to allow them into the system with a new password.
$1 will be the user's login name.
$2 will be the temporary password given by the system.",
+'passwordreset-emailerror-capture' => 'Error message displayed when sending an e-mail fails. Parameters:
+* $1 is the name of a user who was supposed to get the e-mail.',
+
+# Special:ChangeEmail
+'changeemail' => 'Title of [[Special:ChangeEmail|special page]].',
+'changeemail-header' => 'Header on [[Special:ChangeEmail]].',
+'changeemail-text' => 'Text of [[Special:ChangeEmail]].',
+'changeemail-no-info' => 'Error message for [[Special:ChangeEmail]].',
+'changeemail-oldemail' => 'Label for e-mail address field in [[Special:ChangeEmail]].',
+'changeemail-newemail' => 'Label for e-mail address field in [[Special:ChangeEmail]].',
+'changeemail-none' => "Probably appears in 'Current E-mail address' field when no address held, in [[Special:ChangeEmail]].
+
+{{Identical|None}}",
+'changeemail-submit' => 'Submit button on [[Special:ChangeEmail]]',
+'changeemail-cancel' => 'Cancel button on [[Special:ChangeEmail]]
+
+{{Identical|Cancel}}',
# 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.
@@ -1099,18 +1137,6 @@ Log comment text for oversight. {{RevisionDelete}}
'revdelete-submit' => '{{RevisionDelete}}
This is the submit button on [[Special:RevisionDelete]].
[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]',
-'revdelete-logentry' => '{{RevisionDelete}}
-This is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions. It is followed by the message {{msg|revdelete-log-message}} in brackets.
-
-The parameter $1 is the page name.
-
-The name of the user doing this task appears before this message.',
-'logdelete-logentry' => '{{RevisionDelete}}
-This is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events. It is followed by the message {{msg|logdelete-log-message}} in brackets.
-
-The parameter $1 is the log name in brackets.
-
-The name of the user who did this task appears before this message.',
'revdelete-success' => "{{RevisionDelete}}
Possible alternative text - 'Restrictions on the revision visibility were successfully changed.'",
@@ -1126,40 +1152,6 @@ Possible alternative message - 'Restrictions could not be set on the visibility
'revdel-restore' => '{{RevisionDelete}}',
'pagehist' => 'Links to page history at Special:RevisionDelete header together with links to the logs and Special:Undelete.',
'deletedhist' => 'Links to Special:Undelete at Special:RevisionDelete header together with links to the logs and page history.',
-'revdelete-content' => 'This message is used as parameter $1 in {{msg|revdelete-hid}} and {{msg|revdelete-unhid}} when hiding or unhiding the content of a revision or event.
-{{Identical|Content}}',
-'revdelete-summary' => 'This message is used as parameter $1 in {{msg|revdelete-hid}} and {{msg|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.',
-'revdelete-uname' => 'This message is used as parameter $1 in {{msg|revdelete-hid}} and {{msg|revdelete-unhid}} when hiding or unhiding the username for a revision or event.
-
-{{Identical|Username}}',
-'revdelete-restricted' => 'This message is used as parameter $4 when setting visibility restrictions for administrators in:
-* {{msg-mw|logentry-delete-event}}
-* {{msg-mw|logentry-delete-revision}}
-* {{msg-mw|logentry-suppress-event}}
-* {{msg-mw|logentry-suppress-event}}',
-'revdelete-unrestricted' => 'This message is used as parameter $4 when setting visibility restrictions for administrators in:
-* {{msg-mw|logentry-delete-event}}
-* {{msg-mw|logentry-delete-revision}}
-* {{msg-mw|logentry-suppress-event}}
-* {{msg-mw|logentry-suppress-event}}',
-'revdelete-hid' => 'This message is used as parameter $1 in {{msg|revdelete-log-message}} when hiding revisions, and {{msg|logdelete-log-message}} when hiding information in the log entry about hiding revisions.
-
-Parameter $1 is either {{msg|revdelete-content}} (when hiding the page content), {{msg|revdelete-summary}} (when hiding the edit summary), {{msg|revdelete-uname}} (when hiding the user name), or a combination of these three messages.',
-'revdelete-unhid' => 'This message is used as parameter $1 in {{msg|revdelete-log-message}} when unhiding revisions, and {{msg|logdelete-log-message}} when unhiding information in the log entry about unhiding revisions.
-
-Parameter $1 is either {{msg|revdelete-content}} (when unhiding the page content), {{msg|revdelete-summary}} (when unhiding the edit summary), {{msg|revdelete-uname}} (when unhiding the user name), or a combination of these three messages.',
-'revdelete-log-message' => 'This log message is used together with {{msg|revdelete-logentry}} in the deletion or suppression logs when changing visibility restrictions for page revisions.
-
-*Parameter $1 is either {{msg|revdelete-hid}} (when hiding data), {{msg|revdelete-unhid}} (when unhiding data), {{msg|revdelete-restricted}} (when applying restrictions for sysops), {{msg|revdelete-unrestricted}} (when removing restrictions for sysops), or a combination of those messages.
-*Parameter $2 is the number of revisions for which the restrictions are changed.
-
-Please note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.',
-'logdelete-log-message' => 'This log message appears in brackets after the message {{msg|logdelete-logentry}} in the deletion or suppression logs when changing the visibility of a log entry for events. For a brief description of the process of changing the visibility of events and their log entries see this [http://www.mediawiki.org/wiki/RevisionDelete mediawiki explanation].
-
-*Parameter $1 is either {{msg|revdelete-hid}} (when hiding data), {{msg|revdelete-unhid}} (when unhiding data), {{msg|revdelete-restricted}} (when applying restrictions for sysops), {{msg|revdelete-unrestricted}} (when removing restrictions for sysops), or a combination of those messages.
-*Parameter $2 is the number of events for which the restrictions are changed.
-
-Please note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.',
'revdelete-hide-current' => 'Parameters:
* $1 is a date
* $2 is a time',
@@ -1375,6 +1367,7 @@ This is a search result (and I guess search engine) dependent messages. I do not
'prefs-resetpass' => 'Button on user data tab in user preferences. When you click the button you go to the special page [[Special:ResetPass]].
{{Identical|Change password}}',
+'prefs-changeemail' => 'Link on [[Special:Preferences]] to [[Special:ChangeEmail]].',
'prefs-rendering' => 'Title of tab in [[Special:Preferences]].',
'saveprefs' => 'Button for saving changes in the preferences page.
@@ -1436,6 +1429,7 @@ Used in [[Special:Preferences]]. Parameters are:
'yourlanguage' => 'Used in [[Special:Preferences]], first tab.
{{Identical|Language}}',
'yourvariant' => 'Used in [[Special:Preferences]], first tab, when the wiki content language has variants only.',
+'prefs-help-variant' => 'Explanation of the LanguageConverter feature. It is shown next to a dropdown box where you can choose a variant to convert content to (e.g. Serbian Latin vs. Serbian Cyrillic, or Chinese Traditional vs. Chinese Simplified).',
'yournick' => 'Used in [[Special:Preferences]], first tab.
{{Identical|Signature}}',
@@ -1492,7 +1486,9 @@ Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
'editusergroup' => 'Button name, in page [[Special:Userrights]] (only available to administrators), in the section named {{MediaWiki:userrights-lookup-user}}.
{{Identical|Edit user groups}}',
-'editinguser' => "Appears on [[Special:UserRights]]. The '''last part''' of the message '''should remain completely untranslated''', but if your language has S-O-V word order, the verb can follow it.",
+'editinguser' => 'Appears on [[Special:UserRights]]. Parameters:
+* $1 is a username
+* $2 are user tool links. Example: "(Talk | contribs | block | send e-mail)".',
'userrights-editusergroup' => '{{Identical|Edit user groups}}. Parameter:
* $1 is a username - optional, can be used for GENDER',
'saveusergroups' => 'Button text when editing user groups',
@@ -1660,17 +1656,13 @@ The rate limits have no effect on the groups that have this right. Rate limits i
'right-autopatrol' => '{{doc-right|autopatrol}}',
'right-patrolmarks' => '{{doc-right|patrolmarks}}',
'right-unwatchedpages' => '{{doc-right|unwatchedpages}}',
-'right-trackback' => '{{doc-right|trackback}}
-
-"Submit" in this instance means that something called [[:wikipedia:trackback|trackback]] is being sent to the wiki, and the wiki accepts it. When the right is not given to the user, the wiki rejects, or ignores it. There is a nice description at [http://cruftbox.com/cruft/docs/trackback.html How TrackBack Works]. In MediaWiki it is one of those obscure features that probably nobody uses (it is a huge spam trap).
-
-An alternative wording for translators could be \'Get the wiki to accept a trackback\'.',
'right-mergehistory' => '{{doc-right|mergehistory}}',
'right-userrights' => '{{doc-right|userrights}}',
'right-userrights-interwiki' => '{{doc-right|userrights-interwiki}}',
'right-siteadmin' => '{{doc-right|siteadmin}}',
'right-override-export-depth' => '{{doc-right|override-export-depth}}',
'right-sendemail' => '{{doc-right|sendemail}}',
+'right-passwordreset' => '{{doc-right|passwordreset}}',
# User rights log
'rightslog' => 'In [[Special:Log]]',
@@ -1719,18 +1711,19 @@ API is an abbreviation for [http://en.wikipedia.org/wiki/API application program
'action-suppressionlog' => '{{Doc-action|suppressionlog}}',
'action-block' => '{{Doc-action|block}}',
'action-protect' => '{{Doc-action|protect}}',
+'action-rollback' => '{{Doc-action|rollback}}',
'action-import' => '{{Doc-action|import}}',
'action-importupload' => '{{Doc-action|importupload}}',
'action-patrol' => '{{Doc-action|patrol}}',
'action-autopatrol' => '{{Doc-action|autopatrol}}',
'action-unwatchedpages' => '{{Doc-action|unwatchedpages}}',
-'action-trackback' => '{{Doc-action|trackback}}',
'action-mergehistory' => '{{Doc-action|mergehistory}}',
'action-userrights' => '{{Doc-action|userrights}}
This action allows editing of all of the "user rights", not just the rights of the group "all users".',
'action-userrights-interwiki' => '{{Doc-action|userrights-interwiki}}',
'action-siteadmin' => '{{Doc-action|siteadmin}}',
+'action-sendemail' => '{{doc-action|sendemail}}',
# Recent changes
'nchanges' => 'Appears on the [[Special:RecentChanges]] special page in brackets after pages having more than one change on that date. $1 is the number of changes on that day.',
@@ -1789,24 +1782,24 @@ List elements are separated by {{msg-mw|pipe-separator}} each. Each list element
'unpatrolledletter' => '{{optional}}
Used in {{msg-mw|Recentchanges-label-legend}}, meaning "unpatrolled".',
-'sectionlink' => '{{optional}}',
'rc_categories' => "Probably to do with 'recent changes' special page, either in a particular skin, or for a particular user group.
I guess that this should appear before an input box where you can specify that recent changes should be shown for pages belonging to certain categories only. You name the categories in the input box, and separate them by a pipe character. If this is right, then you should be able to use 'restrict' instead of 'limit', or even 'show pages in the following categories only'.",
'rc-change-size' => '{{optional}}
Does not work under $wgMiserMode ([[mwr:48986|r48986]]).',
+'rc-change-size-new' => 'Tooltip when hovering a change list diff size. The tooltip shows the resulting new size in bytes.',
'newsectionsummary' => 'Default summary when adding a new section to a page.',
+'rc-old-title' => 'Text that shows the original title of a page, $1 is the original title text',
# Recent changes linked
-'recentchangeslinked' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-feed' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-toolbox' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-title' => 'Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like "/Main Page"). Related changes are all recent change to pages that are linked from \'\'this page\'\'. "$1" is the name of the page for which related changes are shown.',
-'recentchangeslinked-backlink' => '{{optional}}',
-'recentchangeslinked-summary' => 'Summary of [[Special:RecentChangesLinked]].',
-'recentchangeslinked-page' => '{{Identical|Page name}}',
-'recentchangeslinked-to' => 'Checkbox in [[Special:RecentChangesLinked]].',
+'recentchangeslinked' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
+'recentchangeslinked-feed' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
+'recentchangeslinked-toolbox' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
+'recentchangeslinked-title' => 'Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like "/Main Page"). Related changes are all recent change to pages that are linked from \'\'this page\'\'. "$1" is the name of the page for which related changes are shown.',
+'recentchangeslinked-summary' => 'Summary of [[Special:RecentChangesLinked]].',
+'recentchangeslinked-page' => '{{Identical|Page name}}',
+'recentchangeslinked-to' => 'Checkbox in [[Special:RecentChangesLinked]].',
# Upload
'upload' => 'Display name for link to [[Special:Upload]] for uploading files to the wiki.
@@ -1830,6 +1823,7 @@ Text displayed when uploading a file using [[Special:Upload]].",
{{Identical|Source}}',
'ignorewarnings' => 'In [[Special:Upload]]',
+'filename-toolong' => 'Error message when uploading a file with a filename longer than the hardcoded limit of 240 bytes. This limit will never change and is hardcoded in the message',
'filetype-mime-mismatch' => 'Upload error. Parameters:
* $1 is the extension of the uploaded file
* $2 is the MIME type of the uploaded file',
@@ -1894,9 +1888,71 @@ Extensions making use of it:
{{Identical|Internal error}}',
+# File backend
+'backend-fail-stream' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-backup' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-notexists' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-notsame' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-invalidpath' => 'Parameters:
+* $1 is a storage path.',
+'backend-fail-delete' => 'Parameters:
+* $1 is a file path.',
+'backend-fail-alreadyexists' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-store' => 'Parameters:
+* $1 is a filename
+* $2 is a storage path.',
+'backend-fail-copy' => 'Parameters:
+* $1 is a file path
+* $2 is a file path.',
+'backend-fail-move' => 'Parameters:
+* $1 is a file path
+* $2 is a file path.',
+'backend-fail-read' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-create' => 'Parameters:
+* $1 is a filename.',
+'backend-fail-contenttype' => '$1 is a storage (file) path',
+'backend-fail-batchsize' => 'Error message when the limit of 1000 operations in the file backend was reached.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Parameters:
+* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").',
+'lockmanager-fail-closelock' => 'Parameters:
+* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").
+
+A "[http://en.wikipedia.org/wiki/File_locking#Lock_files lock file]" signals by its presence that some resource is locked.',
+'lockmanager-fail-deletelock' => 'Parameters:
+* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").
+
+A "[http://en.wikipedia.org/wiki/File_locking#Lock_files lock file]" signals by its presence that some resource is locked.',
+'lockmanager-fail-acquirelock' => 'Parameters:
+* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").',
+'lockmanager-fail-openlock' => 'Parameters:
+* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").
+
+A "[http://en.wikipedia.org/wiki/File_locking#Lock_files lock file]" signals by its presence that some resource is locked.',
+'lockmanager-fail-releaselock' => 'Parameters:
+* $1 is a resource path (e.g. "mwstore://media-public/a/ab/file.jpg").',
+'lockmanager-fail-db-bucket' => 'Parameters:
+* $1 is a bucket name.',
+'lockmanager-fail-db-release' => 'Parameters:
+* $1 is a database name.',
+'lockmanager-fail-svr-release' => 'Parameters:
+* $1 is a server name.',
+
# ZipDirectoryReader
'zip-unsupported' => "Perhaps translations of 'software' can be used instead of 'features' and 'understood' or 'handled' instead of 'supported'.",
+# Special:UploadStash
+'invalid-chunk-offset' => 'Error that can happen if chunks get uploaded out of order.
+As a result of this error, clients can continue from an offset provided or restart the upload.
+Used on [[Special:UploadWizard]].',
+
# img_auth script messages
'img-auth-accessdenied' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied
{{Identical|Access denied}}',
@@ -2027,7 +2083,6 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
# File reversion
'filerevert' => '{{Identical|Revert}}',
-'filerevert-backlink' => '{{optional}}',
'filerevert-legend' => '{{Identical|Revert}}',
'filerevert-intro' => 'Message displayed when you try to revert a version of a file.
* $1 is the name of the media
@@ -2048,32 +2103,32 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
{{Identical|Revert}}',
# File deletion
-'filedelete-backlink' => '{{optional}}',
-'filedelete-legend' => '{{Identical|Delete}}',
-'filedelete-intro-old' => 'Message displayed when you try to delete a version of a file.
+'filedelete-legend' => '{{Identical|Delete}}',
+'filedelete-intro-old' => 'Message displayed when you try to delete a version of a file.
* $1 is the name of the media
* $2 is a date
* $3 is a hour
* $4 is a URL and must follow square bracket: [$4',
-'filedelete-comment' => '{{Identical|Reason}}',
-'filedelete-submit' => 'Delete button when deleting a file for admins
+'filedelete-comment' => '{{Identical|Reason}}',
+'filedelete-submit' => 'Delete button when deleting a file for admins
{{Identical|Delete}}',
-'filedelete-success-old' => 'Message displayed when you succeed in deleting a version of a file.
+'filedelete-success-old' => 'Message displayed when you succeed in deleting a version of a file.
* $1 is the name of the media
* $2 is a date
* $3 is a hour',
-'filedelete-otherreason' => 'Message used when deleting a file. This is the description field for "Other/additional reason" for deletion.
+'filedelete-otherreason' => 'Message used when deleting a file. This is the description field for "Other/additional reason" for deletion.
{{Identical|Other/additional reason}}',
-'filedelete-reason-otherlist' => 'Message used as default in the dropdown menu in the form for deleting a file. Keeping this message selected assumes that a reason for deletion is specified in the field below.
+'filedelete-reason-otherlist' => 'Message used as default in the dropdown menu in the form for deleting a file. Keeping this message selected assumes that a reason for deletion is specified in the field below.
{{Identical|Other reason}}',
-'filedelete-reason-dropdown' => 'Predefined reasons for deleting a file that can be selected in a drop down list. Entries prefixed with one asterisk ("*") are group headers and cannot be selected. Entries prefixed with two asterisks can be selected as reason for deletion.',
-'filedelete-edit-reasonlist' => 'Shown beneath the file deletion form on the right side. It is a link to [[MediaWiki:Filedelete-reason-dropdown]].
+'filedelete-reason-dropdown' => 'Predefined reasons for deleting a file that can be selected in a drop down list. Entries prefixed with one asterisk ("*") are group headers and cannot be selected. Entries prefixed with two asterisks can be selected as reason for deletion.',
+'filedelete-edit-reasonlist' => 'Shown beneath the file deletion form on the right side. It is a link to [[MediaWiki:Filedelete-reason-dropdown]].
{{Identical|Edit delete reasons}}',
-'filedelete-maintenance' => 'Content of the error page when $wgUploadMaintenance is set to true.',
+'filedelete-maintenance' => 'Content of the error page when $wgUploadMaintenance is set to true.',
+'filedelete-maintenance-title' => 'Title of the error page when $wgUploadMaintenance is set to true.',
# MIME search
'mimesearch' => 'Title of [[Special:MIMESearch]].',
@@ -2187,6 +2242,8 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
$1 is a page title",
'wantedfiles' => 'Name of special page displayed in [[Special:SpecialPages]] and title of [[Special:WantedFiles]].',
+'wantedfiletext-cat' => 'Message displayed at top of [[special:WantedFiles]]. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.',
+'wantedfiletext-nocat' => 'Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled. See {{msg-mw|wantedfiletext-cat}}.',
'wantedtemplates' => 'The page name of [[Special:WantedTemplates]].',
'mostlinked' => 'Name of special page displayed in [[Special:SpecialPages]]',
'mostlinkedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
@@ -2195,6 +2252,7 @@ $1 is a page title",
'mostimages' => 'Name of special page displayed in [[Special:SpecialPages]]',
'mostrevisions' => 'Name of special page displayed in [[Special:SpecialPages]]',
'prefixindex' => 'The page title of [[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',
'shortpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
'longpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
'deadendpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
@@ -2342,13 +2400,8 @@ You can apparently use 'URL' instead of 'hostname'.",
'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
# Special:Log/newusers
-'newuserlogpage' => 'Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in the recent changes.',
-'newuserlogpagetext' => 'Part of the "Newuserlog" extension. It is the description you can see on [[Special:Log/newusers]].',
-'newuserlog-create-entry' => 'Part of the "Newuserlog" extension. It is the summary in the [[Special:RecentChanges|recent changes]] and on [[Special:Log/newusers]].',
-'newuserlog-create2-entry' => 'Part of the "Newuserlog" extension. It is the summary in the [[Special:RecentChanges|recent changes]] and on [[Special:Log/newusers]] when creating an account for someone else ("$1" - a link). The name of the user doing this task appears before this message.
-
-* $2 - the user id of the user $1',
-'newuserlog-autocreate-entry' => 'This message is used in the [[:mw:Extension:Newuserlog|new user log]] to mark an account that was created by MediaWiki as part of a [[:mw:Extension:CentralAuth|CentralAuth]] global account.',
+'newuserlogpage' => 'Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in the recent changes.',
+'newuserlogpagetext' => 'Part of the "Newuserlog" extension. It is the description you can see on [[Special:Log/newusers]].',
# Special:ListGroupRights
'listgrouprights' => 'The name of the special page [[Special:ListGroupRights]].',
@@ -2394,6 +2447,7 @@ See also {{msg-mw|listgrouprights-addgroup-all}}.',
'emailpagetext' => 'This is the text that is displayed above the e-mail form on [[Special:EmailUser]].
Special:EmailUser appears when you click on the link "E-mail this user" in the sidebar, but only if there is an e-mail address in the recipient\'s user preferences. If there isn\'t then the message [[Mediawiki:Noemailtext]] will appear instead of Special:EmailUser.',
+'defemailsubject' => 'The default subject of EmailUser emails. The first parameter is the username of the user sending the email.',
'usermaildisabled' => 'Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).',
'noemailtitle' => 'The title of the message that appears instead of Special:EmailUser after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user.',
'noemailtext' => 'The text of the message that appears in [[Special:EmailUser]] after clicking the "E-mail this user" link in the sidebar, if no e-mail can be sent to the user because he has not specified or not confirmed an e-mail address.',
@@ -2460,6 +2514,12 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
{{Identical|Content page}}",
'watchlist-details' => 'Message on Special page: My watchlist. This is paired with the message [[Mediawiki:Nowatchlist]] which appears instead of Watchlist-details when $1 is 0.',
'wlheader-showupdated' => 'This message shows up near top of users watchlist page.',
+'wlnote' => 'Used on [[Special:Watchlist]] when the maximum number of days is specified.
+Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
+* $1 is the number of changes shown,
+* $2 is the number of hours for which the changes are shown,
+* $3 is a date alone,
+* $4 is a time alone.',
'wlshowlast' => "Appears on [[Special:Watchlist]]. Variable $1 gives a choice of different numbers of hours, $2 gives a choice of different numbers of days and $3 is '{{int:watchlistall2}}' ([[Mediawiki:watchlistall2/{{SUBPAGENAME}}]]). Clicking on your choice changes the list of changes you see (without changing the default in my preferences).",
'watchlist-options' => 'Legend of the fieldset of [[Special:Watchlist]]',
@@ -2491,7 +2551,6 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
'delete-confirm' => 'The title of the form to delete a page.
$1 = the name of the page',
-'delete-backlink' => '{{optional}}',
'delete-legend' => '{{Identical|Delete}}',
'historywarning' => 'Warning when about to delete a page that has history.
$1 is the <b>approximate</b> number of revisions that the page has, the message should not claim to give an exact count.',
@@ -2500,9 +2559,6 @@ $1 is the <b>approximate</b> number of revisions that the page has, the message
'deletedtext' => 'Parameters:
* $1 is a page that was deleted
* $2 is {{msg-mw|deletionlog}}',
-'deletedarticle' => "This is a ''logentry'' message. Parameters:
-* $1 is deleted page name.",
-'suppressedarticle' => 'Part of a [[mw:Manual:RevisionDelete|RevisionDelete]] log entry.',
'dellogpage' => 'The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
{{Identical|Deletion log}}',
@@ -2558,10 +2614,10 @@ In other cases the message {{msg-mw|revertpage}} is used.',
Example:
<code>00:51, 16 September 2010 Siebrand +(Talk • contribs • block) moved protection settings from "User:Siebrand/prot-move" to "User:Siebrand/prot-moved" ‎ (User:Siebrand/prot-move moved to User:Siebrand/prot-moved: prot_move test.)</code>',
'protect-title' => 'Title for the protection form. $1 is the title of the page to be (un)protected.',
+'protect-title-notallowed' => 'Same as {{msg-mw|protect-title}}, but when the user does not have the right to change protection levels.',
'prot_1movedto2' => 'Message description: [[mw:Manual:Interface/1movedto2]]',
-'protect-backlink' => '{{optional|Translate it only if you have to change it, i.e. for RTL wikis}}
-
-Shown as subtitle of the protection form. $1 is the title of the page to be (un)protected.',
+'protect-badnamespace-title' => 'Title of error page when trying to access action=protect on a non-protectable namespace (currently this only for the MediaWiki: namespace).',
+'protect-badnamespace-text' => 'Content of the error page that goes with {{msg-mw|protect-badnamespace-title}}.',
'protect-legend' => 'Legend of the fieldset around the input form of the protection form.',
'protectcomment' => '{{Identical|Reason}}',
'protectexpiry' => '{{Identical|Expires}}',
@@ -2577,6 +2633,7 @@ This message was something like "unlock move protection" in the past.',
* $3 is a time (optional)
{{Identical|Expires $1 (UTC)}}',
+'protect-expiring-local' => '$1 is a timestamp like "22:51, 23 July 2011 (UTC)" depending on the wiki content language.',
'protect-cascade' => 'See [[meta:Protect]] for more information.',
'protect-othertime' => 'Used on the page protection form as label for the following input field (text)
{{Identical|Other time}}',
@@ -2652,7 +2709,9 @@ This message was something like "unlock move protection" in the past.',
{{Identical|Reset}}',
'undeleteinvert' => '{{Identical|Invert selection}}',
'undeletecomment' => '{{Identical|Reason}}',
+'undelete-search-title' => 'Page title when showing the search form in Special:Undelete',
'undelete-search-submit' => '{{Identical|Search}}',
+'undelete-error' => 'Page title when a page could not be undeleted',
'undelete-show-file-confirm' => 'A confirmation message shown on Special:Undelete when the request does not contain a valid token (e.g. when a user clicks a link received in mail).
* <code>$1</code> is the name of the file being undeleted.
* <code>$2</code> is the date of the displayed revision.
@@ -2713,7 +2772,6 @@ Anon version: {{msg-mw|Sp-contributions-blocked-notice-anon}}',
'whatlinkshere' => 'The text of the link in the toolbox (on the left, below the search menu) going to [[Special:WhatLinksHere]].',
'whatlinkshere-title' => "Title of the special page [[Special:WhatLinksHere]]. This page appears when you click on the 'What links here' button in the toolbox. $1 is the name of the page concerned.",
'whatlinkshere-page' => '{{Identical|Page}}',
-'whatlinkshere-backlink' => '{{optional}}',
'linkshere' => "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking 'What links here' in the sidebar toolbox. It is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.",
'nolinkshere' => 'This appears on Whatlinkshere pages which are empty.
@@ -2792,6 +2850,7 @@ Example line:
'unblocked-range' => 'Shown when successfully lifting a rangeblock, so do not link to contributions.
* $1 - the range that was unblocked.',
'ipblocklist' => 'Title of [[Special:Ipblocklist]].',
+'blocklist-rangeblocks' => 'For an explanation of "range blocks", see http://www.mediawiki.org/wiki/Help:Range_blocks',
'blocklist-timestamp' => 'This is a column header for dates and times in the table on the page [[Special:BlockList]].
{{Identical|Timestamp}}',
'blocklist-target' => 'The table header for the column containing the block targets, that is user names or IP-addresses linked to their respective user pages, in the table on the page [[Special:BlockList]].',
@@ -2830,6 +2889,9 @@ Usage:
'blocklink' => "Display name for a link that, when selected, leads to a form where a user can be blocked. Used in page history and recent changes pages. Example: \"''UserName (Talk | contribs | '''block''')''\".",
'change-blocklink' => 'Used to name the link on Special:Log',
'contribslink' => 'Short for "contributions". Used as display name for a link to user contributions on history pages, [[Special:RecentChanges]], [[Special:Watchlist]], etc.',
+'emaillink' => 'Used as display name for a link to send an e-mail to a user in the user tool links. Example: "(Talk | contribs | block | send e-mail)".
+
+{{Identical|E-mail}}',
'blocklogpage' => "The page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").
{{Identical|Block log}}",
@@ -2916,8 +2978,6 @@ See also {{msg-mw|Movepagetext-noredirectfixer|notext=1}}',
'movetalk' => 'The text of the checkbox to watch the associated talk page to the page you are moving. This only appears when the talk page is not empty.',
'move-subpages' => 'The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.',
'move-talk-subpages' => 'The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.',
-'1movedto2' => "This is ''logentry'' message. $1 is the original page name, $2 is the destination page name.",
-'1movedto2_redir' => "This is ''logentry'' message. $1 is the original page name, $2 is the destination page name.",
'movelogpage' => 'Title of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.',
'movelogpagetext' => "Text on the special page 'Move log'.",
'movesubpage' => "This is a section header on [[Special:MovePage]], below is a list of subpages.
@@ -2930,6 +2990,8 @@ Parameters:
'revertmove' => '{{Identical|Revert}}',
'delete_and_move_text' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is to confirm that you really want to delete the page. See also {{msg|delete and move confirm}}.',
'delete_and_move_confirm' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is for a checkbox to confirm that you really want to delete the page. See also {{msg|delete and move text}}.',
+'delete_and_move_reason' => 'Shown as reason in content language in the deletion log. Parameter:
+* $1: The page name for which this page was deleted.',
'immobile-target-namespace-iw' => "This message appears when attempting to move a page, if a person has typed an interwiki link as a namespace prefix in the input box labelled 'To new title'. The special page 'Movepage' cannot be used to move a page to another wiki.
'Destination' can be used instead of 'target' in this message.",
@@ -2943,6 +3005,7 @@ Parameters:
# Export
'export' => 'Page title of [[Special:Export]], a page where a user can export pages from a wiki to a file.',
'exporttext' => 'Main text on [[Special:Export]]. Leave the line <tt><nowiki>[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]</nowiki></tt> exactly as it is!',
+'exportall' => 'A label of checkbox option in [[Special:Export]]',
'exportcuronly' => 'A label of checkbox option in [[Special:Export]]',
'export-submit' => 'Button name in [[Special:Export]].
@@ -3006,6 +3069,14 @@ Import failed: XML import parse failure at line 1, col 1 (byte 3; "- <mediawiki
'import-upload' => 'Used on [[Special:Import]].
Related messages: {{msg|right-importupload|pl=yes}} (the user right for this).',
+'import-error-edit' => 'Import error message displayed when importing user has no edit rights for a page. Parameters:
+* $1 is a page name.
+See also:
+* {{msg-mw|import-error-create}}',
+'import-error-create' => 'Import error message displayed when importing user has no create rights for a page. Parameters:
+* $1 is a page name.
+See also:
+* {{msg-mw|import-error-edit}}',
# Import log
'importlogpage' => '',
@@ -3013,78 +3084,90 @@ Related messages: {{msg|right-importupload|pl=yes}} (the user right for this).',
'import-logentry-upload' => 'This is the text of an entry in the Import log (and Recent Changes), after hour (and date, only in the Import log) and sysop name:
* $1 is the name of the imported file',
+# JavaScriptTest
+'javascripttest' => 'Title of [[Special:JavaScriptTest|the special page]]',
+'javascripttest-disabled' => '{{Identical|Function disabled}}.',
+'javascripttest-title' => 'Title of the special page when running a test suite. Parameters:
+* $1 is the name of the framework, for example QUnit.',
+'javascripttest-pagetext-unknownframework' => 'Error message when given framework id is not found. $1 is the id of the framework.',
+'javascripttest-pagetext-frameworks' => '$1 is the id of the framework.',
+'javascripttest-qunit-intro' => '$1 is the configured url to the documentation.',
+'javascripttest-qunit-heading' => '{{Optional}}',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tooltip shown when hovering the mouse over the link to your own User page in the upper-side personal toolbox.',
-'tooltip-pt-mytalk' => 'Tooltip shown when hovering over the "my talk" link in your personal toolbox (upper right side).',
-'tooltip-pt-preferences' => 'Tooltip shown when hovering over the "my preferences" ([[MediaWiki:Mypreferences]]) link in your personal toolbox (upper right side).
+'tooltip-pt-userpage' => 'Tooltip shown when hovering the mouse over the link to your own User page in the upper-side personal toolbox.',
+'tooltip-pt-mytalk' => 'Tooltip shown when hovering over the "my talk" link in your personal toolbox (upper right side).',
+'tooltip-pt-preferences' => 'Tooltip shown when hovering over the "my preferences" ([[MediaWiki:Mypreferences]]) link in your personal toolbox (upper right side).
{{Identical|My preferences}}',
-'tooltip-pt-watchlist' => 'Tooltip shown when hovering over the "my watchlist" link in your personal toolbox (upper right side).',
-'tooltip-pt-mycontris' => 'Tooltip shown when hovering over the "my contributions" link in your personal toolbox (upper right side).',
-'tooltip-pt-login' => "Tooltip shown when hovering over the link 'Log in / create account' in the upper right corner show on all pages while not logged in.",
-'tooltip-pt-logout' => 'Tooltip shown when hovering over the "Log out" link in your personal toolbox (upper right side).
+'tooltip-pt-watchlist' => 'Tooltip shown when hovering over the "my watchlist" link in your personal toolbox (upper right side).',
+'tooltip-pt-mycontris' => 'Tooltip shown when hovering over the "my contributions" link in your personal toolbox (upper right side).',
+'tooltip-pt-login' => "Tooltip shown when hovering over the link 'Log in / create account' in the upper right corner show on all pages while not logged in.",
+'tooltip-pt-logout' => 'Tooltip shown when hovering over the "Log out" link in your personal toolbox (upper right side).
{{Identical|Log out}}',
-'tooltip-ca-talk' => "Tooltip shown when hovering over the \"[[MediaWiki:Talk/{{SUBPAGENAME}}|{{int:talk}}]]\" tab.
+'tooltip-ca-talk' => "Tooltip shown when hovering over the \"[[MediaWiki:Talk/{{SUBPAGENAME}}|{{int:talk}}]]\" tab.
A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For a technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
{{Identical|Content page}}",
-'tooltip-ca-edit' => 'The tooltip when hovering over the "[[MediaWiki:Edit/{{SUBPAGENAME}}|{{int:edit}}]]" tab.',
-'tooltip-ca-addsection' => 'Tooltip shown when hovering over the "addsection" tab (shown on talk pages).',
-'tooltip-ca-viewsource' => 'Tooltip displayed when hovering over the {{msg|viewsource}} tab.',
-'tooltip-ca-protect' => '{{Identical|Protect this page}}',
-'tooltip-ca-unprotect' => '{{Identical|Unprotect this page}}',
-'tooltip-ca-delete' => 'Tooltip shown when hovering over the "[[MediaWiki:Delete/{{SUBPAGENAME}}|{{int:delete}}]]" tab.
+'tooltip-ca-edit' => 'The tooltip when hovering over the "[[MediaWiki:Edit/{{SUBPAGENAME}}|{{int:edit}}]]" tab.',
+'tooltip-ca-addsection' => 'Tooltip shown when hovering over the "addsection" tab (shown on talk pages).',
+'tooltip-ca-viewsource' => 'Tooltip displayed when hovering over the {{msg|viewsource}} tab.',
+'tooltip-ca-protect' => '{{Identical|Protect this page}}',
+'tooltip-ca-unprotect' => '{{Identical|Unprotect this page}}',
+'tooltip-ca-delete' => 'Tooltip shown when hovering over the "[[MediaWiki:Delete/{{SUBPAGENAME}}|{{int:delete}}]]" tab.
{{Identical|Delete this page}}',
-'tooltip-ca-move' => '{{Identical|Move this page}}',
-'tooltip-ca-watch' => '{{Identical|Add this page to your watchlist}}',
-'tooltip-ca-unwatch' => 'Tooltip shown when hovering over the {{msg|unwatch}} tab.',
-'tooltip-search' => 'The tooltip when hovering over the search menu.',
-'tooltip-search-go' => 'This is the text of the tooltip displayed when hovering the mouse over the “[[MediaWiki:Go|Go]]†button next to the search box.',
-'tooltip-search-fulltext' => 'This is the text of the tooltip displayed when hovering the mouse over the “[[MediaWiki:Search|Search]]†button under the search box.',
-'tooltip-p-logo' => 'Tool tip shown when hovering the mouse over the logo that links to [[Main Page]].
+'tooltip-ca-move' => '{{Identical|Move this page}}',
+'tooltip-ca-watch' => '{{Identical|Add this page to your watchlist}}',
+'tooltip-ca-unwatch' => 'Tooltip shown when hovering over the {{msg|unwatch}} tab.',
+'tooltip-search' => 'The tooltip when hovering over the search menu.',
+'tooltip-search-go' => 'This is the text of the tooltip displayed when hovering the mouse over the “[[MediaWiki:Go|Go]]†button next to the search box.',
+'tooltip-search-fulltext' => 'This is the text of the tooltip displayed when hovering the mouse over the “[[MediaWiki:Search|Search]]†button under the search box.',
+'tooltip-p-logo' => 'Tool tip shown when hovering the mouse over the logo that links to [[Main Page]].
{{Identical|Visit the main page}}',
-'tooltip-n-mainpage' => 'Tool tip shown when hovering the mouse over the link to [[{{MediaWiki:Mainpage}}]].
+'tooltip-n-mainpage' => 'Tool tip shown when hovering the mouse over the link to [[{{MediaWiki:Mainpage}}]].
{{Identical|Visit the main page}}',
-'tooltip-n-mainpage-description' => '{{Identical|Visit the main page}}',
-'tooltip-n-portal' => "Tooltip shown when hovering over the link to 'Community portal' shown in the side bar menu on all pages.",
-'tooltip-n-currentevents' => 'Tooltip shown when hovering over {{msg|currentevents}} in the sidebar.',
-'tooltip-n-recentchanges' => 'The tooltip when hovering over the "[[MediaWiki:Recentchanges/{{SUBPAGENAME}}|{{int:recentchanges}}]]" link in the sidebar going to the special page [[Special:RecentChanges]].',
-'tooltip-n-randompage' => "Tooltip shown when hovering over the link to 'Random page' shown in the side bar menu on all pages. Clicking the link will show a random page in from the wiki's main namespace.",
-'tooltip-n-help' => "Tooltip shown when hovering over the link 'help' shown in the side bar menu on all pages.",
-'tooltip-t-whatlinkshere' => 'Tooltip shown when hovering over the {{msg|whatlinkshere}} message in the toolbox.',
-'tooltip-t-contributions' => 'Tooltip shown when hovering over {{msg|contributions}} in the toolbox.',
-'tooltip-t-emailuser' => 'Tooltip shown when hovering over the {{msg|emailuser}} link in the toolbox (sidebar, below).',
-'tooltip-t-upload' => 'Tooltip shown when hovering over the link to upload files shown in the side bar menu on all pages.',
-'tooltip-t-specialpages' => 'The tooltip when hovering over the link "[[MediaWiki:Specialpages/{{SUBPAGENAME}}|{{int:specialpages}}]]" going to a list of all special pages available in the wiki.',
-'tooltip-ca-nstab-main' => "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
+'tooltip-n-mainpage-description' => '{{Identical|Visit the main page}}',
+'tooltip-n-portal' => "Tooltip shown when hovering over the link to 'Community portal' shown in the side bar menu on all pages.",
+'tooltip-n-currentevents' => 'Tooltip shown when hovering over {{msg|currentevents}} in the sidebar.',
+'tooltip-n-recentchanges' => 'The tooltip when hovering over the "[[MediaWiki:Recentchanges/{{SUBPAGENAME}}|{{int:recentchanges}}]]" link in the sidebar going to the special page [[Special:RecentChanges]].',
+'tooltip-n-randompage' => "Tooltip shown when hovering over the link to 'Random page' shown in the side bar menu on all pages. Clicking the link will show a random page in from the wiki's main namespace.",
+'tooltip-n-help' => "Tooltip shown when hovering over the link 'help' shown in the side bar menu on all pages.",
+'tooltip-t-whatlinkshere' => 'Tooltip shown when hovering over the {{msg|whatlinkshere}} message in the toolbox.',
+'tooltip-t-contributions' => 'Tooltip shown when hovering over {{msg|contributions}} in the toolbox.',
+'tooltip-t-emailuser' => 'Tooltip shown when hovering over the {{msg|emailuser}} link in the toolbox (sidebar, below).',
+'tooltip-t-upload' => 'Tooltip shown when hovering over the link to upload files shown in the side bar menu on all pages.',
+'tooltip-t-specialpages' => 'The tooltip when hovering over the link "[[MediaWiki:Specialpages/{{SUBPAGENAME}}|{{int:specialpages}}]]" going to a list of all special pages available in the wiki.',
+'tooltip-ca-nstab-main' => "A 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [//www.mediawiki.org/wiki/Manual:Using_custom_namespaces#Content_namespaces Mediawiki].
Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
{{Identical|Content page}}",
-'tooltip-ca-nstab-user' => 'Tooltip shown when hovering over {{msg|nstab-user}} (User namespace tab).
+'tooltip-ca-nstab-user' => 'Tooltip shown when hovering over {{msg|nstab-user}} (User namespace tab).
No GENDER-Support for performance reason.',
-'tooltip-ca-nstab-image' => 'Tooltip shown when hovering over {{msg|nstab-image}} (Image namespace tab).',
-'tooltip-ca-nstab-template' => 'Tooltip shown when hovering over the {{msg|nstab-template}} tab.',
-'tooltip-ca-nstab-help' => 'Tootip shown when hovering over the {{msg|nstab-help}} tab in the Help namespace.',
-'tooltip-ca-nstab-category' => 'Tooltip shown when hovering over the {{msg|nstab-category}} tab.',
-'tooltip-minoredit' => 'Tooltip shown when hovering over the "[[MediaWiki:Minoredit/{{SUBPAGENAME}}|{{int:minoredit}}]]" link below the edit form.',
-'tooltip-save' => "This is the text that appears when you hover the mouse over the 'Save page' button on the edit page",
-'tooltip-preview' => 'Tooltip shown when hovering over the "Show preview" button.
+'tooltip-ca-nstab-image' => 'Tooltip shown when hovering over {{msg|nstab-image}} (Image namespace tab).',
+'tooltip-ca-nstab-template' => 'Tooltip shown when hovering over the {{msg|nstab-template}} tab.',
+'tooltip-ca-nstab-help' => 'Tootip shown when hovering over the {{msg|nstab-help}} tab in the Help namespace.',
+'tooltip-ca-nstab-category' => 'Tooltip shown when hovering over the {{msg|nstab-category}} tab.',
+'tooltip-minoredit' => 'Tooltip shown when hovering over the "[[MediaWiki:Minoredit/{{SUBPAGENAME}}|{{int:minoredit}}]]" link below the edit form.',
+'tooltip-save' => "This is the text that appears when you hover the mouse over the 'Save page' button on the edit page",
+'tooltip-preview' => 'Tooltip shown when hovering over the "Show preview" button.
If the length of the translated message is over 60 characters (including spaces) then the end of the message will be cut off when using Firefox 2.0.0.7 browser, Linux operating system and the Monobook skin.',
-'tooltip-diff' => 'This is the text (tooltip) that appears when you hover the mouse over the "Show changes" button ({{msg|showdiff}}) on the edit page.',
-'tooltip-compareselectedversions' => 'Tooltip of {{msg|compareselectedversions}} (which is used as button in history pages).',
-'tooltip-watch' => '{{Identical|Add this page to your watchlist}}',
-'tooltip-rollback' => 'Tooltip of the rollback link on the history page and the diff view
+'tooltip-diff' => 'This is the text (tooltip) that appears when you hover the mouse over the "Show changes" button ({{msg|showdiff}}) on the edit page.',
+'tooltip-compareselectedversions' => 'Tooltip of {{msg|compareselectedversions}} (which is used as button in history pages).',
+'tooltip-watch' => '{{Identical|Add this page to your watchlist}}',
+'tooltip-watchlistedit-normal-submit' => 'Tooltip for {{msg|watchlistedit-normal-submit}} (used as button on [[Special:EditWatchlist]]).',
+'tooltip-watchlistedit-raw-submit' => 'Tooltip for {{msg|watchlistedit-raw-submit}} (used as button on [[Special:EditWatchlist/raw]]).',
+'tooltip-rollback' => 'Tooltip of the rollback link on the history page and the diff view
{{Identical|Rollback}}
{{Identical|Revert}}',
-'tooltip-undo' => 'Tooltip of the undo link on the history page and the diff view
+'tooltip-undo' => 'Tooltip of the undo link on the history page and the diff view
{{Identical|Undo}}{{Identical|Revert}}',
# Stylesheets
@@ -3209,14 +3292,6 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
# Patrol log
'patrol-log-page' => 'Name of log.',
'patrol-log-header' => 'Text that appears above the log entries on the [[Special:log|patrol log]].',
-'patrol-log-line' => 'Text of notes on entries in the [http://translatewiki.net/w/i.php?title=Special%3ALog&type=patrol&user=&page=&year=&month=-1 patrol log]. $1 is the link whose text is {{msg-mw|patrol-log-diff}}. $2 is the name of the page. $3 appears to be {{msg-mw|Patrol-log-auto}} (at least sometimes).
-
-The message appears after the name of the patroller.',
-'patrol-log-auto' => 'Automated edit summary when patrolling.
-
-{{Identical|Automatic}}',
-'patrol-log-diff' => 'The text of the diff link in [[MediaWiki:Patrol-log-line]] (inside $1 there)
-{{Identical|Revision}}',
'log-show-hide-patrol' => '* $1 is one of {{msg|show}} or {{msg|hide}}',
# Browsing diffs
@@ -3286,9 +3361,48 @@ For example of message in use see [[:File:Mouse10.gif]].',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '{{optional}}',
-'seconds-abbrev' => '{{optional}}',
-'minutes-abbrev' => '{{optional}}',
-'hours-abbrev' => 'Abbreviation for "hours"',
+'seconds-abbrev' => '{{optional}}
+Abbreviation for "seconds". $1 is the number of seconds.
+
+See also {{msg-mw|seconds}}',
+'minutes-abbrev' => '{{optional}}
+Abbreviation for "minutes". $1 is the number of minutes.
+
+See also {{msg-mw|minutes}}',
+'hours-abbrev' => '{{optional}}
+Abbreviation for "hours". $1 is the number of hours.
+
+See also {{msg-mw|hours}}',
+'days-abbrev' => '{{optional}}
+Abbreviation for "days". $1 is the number of days.
+
+See also {{msg-mw|days}}',
+'seconds' => 'Full word for "seconds". $1 is the number of seconds.
+
+See also {{msg-mw|Seconds-abbrev}}
+
+Part of variable $1 in {{msg-mw|Ago}}',
+'minutes' => 'Full word for "minutes". $1 is the number of minutes.
+
+See also {{msg-mw|Minutes-abbrev}}
+
+Part of variable $1 in {{msg-mw|Ago}}',
+'hours' => 'Full word for "hours". $1 is the number of hours.
+
+See also {{msg-mw|Hours-abbrev}}
+
+Part of variable $1 in {{msg-mw|Ago}}',
+'days' => 'Full word for "days". $1 is the number of days.
+
+See also {{msg-mw|Days-abbrev}}
+
+Part of variable $1 in {{msg-mw|Ago}}
+{{Identical|Day}}',
+'ago' => 'Phrase for indicating how long ago something happened. $1 is something like "3 days 10 hours", taken from these messages:
+*{{msg-mw|Seconds}}
+*{{msg-mw|Minutes}}
+*{{msg-mw|Hours}}
+*{{msg-mw|Days}}',
# Bad image list
'bad_image_list' => 'This is only message appears to guide administrators to add links with right format. This will not appear anywhere else in Mediawiki.',
@@ -3380,6 +3494,11 @@ Varient Option for wikis with variants conversion enabled.',
'variantname-ike-latn' => '{{optional}}',
'variantname-iu' => '{{optional}}',
+# Variants for Tachelhit language
+'variantname-shi-tfng' => '{{optional}}',
+'variantname-shi-latn' => '{{optional}}',
+'variantname-shi' => '{{optional}}',
+
# Metadata
'metadata' => 'The title of a section on an image description page, with information and data about the image. For example of message in use see [http://commons.wikimedia.org/wiki/File:Titan-crystal_bar.JPG Commons].
@@ -3985,31 +4104,6 @@ See also [[MediaWiki:Confirmemail_body_changed]].
'confirmemail_invalidated' => 'This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.',
'invalidateemail' => "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
-# Trackbacks
-'trackbackbox' => '* $1 is the content of [[MediaWiki:Trackbackexcerpt]] or [[MediaWiki:Trackback]], depending if the trackback has an excerpt
-
-{{doc-important|Do not remove the linebreak. $1 has to be the first character on a new line because it contains wiki markup}}
-
-For information on trackback see [//www.mediawiki.org/wiki/Manual:$wgUseTrackbacks mediawiki manual].',
-'trackback' => '{{optional}}
-
-Do \'\'not\'\' change the leading ; and the first : as it is wiki markup.
-
-* $1: title of the trackback
-* $2: URL of the trackback
-* <span style="color:grey;">$3: unused in this message, see [[MediaWiki:trackbackexcerpt]] instead</span>
-* $4: name of the trackback
-* $5: a link to delete the trackback. The content of [[MediaWiki:Trackbackremove]] is injected here.',
-'trackbackexcerpt' => "{{optional}}
-
-Do ''not'' change the leading ; and the first : as it is wiki markup.
-
-* $1: title of the trackback
-* $2: URL of the trackback
-* $3: an excerpt of the trackback
-* $4: name of the trackback
-* $5: a link to delete the trackback. The content of [[MediaWiki:Trackbackremove]] is injected here.",
-
'unit-pixel' => '{{optional}}',
# action=purge
@@ -4054,14 +4148,44 @@ Most languages use a space, but some Asian languages, such as Thai and Chinese,
'autosumm-new' => 'The auto summary when creating a new page. $1 are the first X number of characters of the new page.',
# Size units
-'size-bytes' => '{{optional}}
+'size-bytes' => '{{optional}}
Size (of a page, typically) in bytes.',
-'size-kilobytes' => '{{optional}}
+'size-kilobytes' => '{{optional}}
Size (of a page, typically) in kibibytes (1 kibibyte = 1024 bytes).',
-'size-megabytes' => '{{optional}}
+'size-megabytes' => '{{optional}}
Size (of a file, typically) in mebibytes (1 mebibyte = 1024×1024 bytes).',
-'size-gigabytes' => '{{optional}}
+'size-gigabytes' => '{{optional}}
Size (of a file, typically) in gibibytes (1 gibibyte = 1024×1024×1024 bytes).',
+'size-terabytes' => '{{optional}}
+Size (of a file, typically) in tebibytes (1 tebibytes = 1024×1024×1024×1024 bytes).',
+'size-petabytes' => '{{optional}}
+Size (of a file, typically) in pebibytes (1 pebibytes = 1024×1024×1024×1024×1024 bytes).',
+'size-exabytes' => '{{optional}}
+Size (of a file, typically) in exbibytes (1 exbibytes = 1024×1024×1024×1024×1024×1024 bytes).',
+'size-zetabytes' => '{{optional}}
+Size (of a file, typically) in zebibytes (1 zebibytes = 1024×1024×1024×1024×1024×1024×1024 bytes).',
+'size-yottabytes' => '{{optional}}
+Size (of a file, typically) in yobibytes (1 yobibytes = 1024×1024×1024×1024×1024×1024×1024×1024 bytes).',
+
+# Bitrate units
+'bitrate-bits' => '{{optional}}
+Bitrate (of a file, typically) in bits.',
+'bitrate-kilobits' => '{{optional}}
+Bitrate (of a file, typically) in kilobits (1 kilobit = 1000 bits).',
+'bitrate-megabits' => '{{optional}}
+Bitrate (of a file, typically) in megabits (1 megabits = 1000×1000 bits).',
+'bitrate-gigabits' => '{{optional}}
+Bitrate (of a file, typically) in gibibits (1 gigabits = 1000×1000×1000 bits).',
+'bitrate-terabits' => '{{optional}}
+Bitrate (of a file, typically) in terabits (1 terabits = 1000×1000×1000×1000 bits).',
+'bitrate-petabits' => '{{optional}}
+Bitrate (of a file, typically) in petabits (1 petabits = 1000×1000×1000×1000×1000 bits).',
+'bitrate-exabits' => '{{optional}}
+Bitrate (of a file, typically) in exabits (1 exabits = 1000×1000×1000×1000×1000×1000 bits).',
+'bitrate-zetabits' => '{{optional}}
+Bitrate (of a file, typically) in zetabits (1 zetabits = 1000×1000×1000×1000×1000×1000×1000 bits).',
+'bitrate-yottabits' => '{{optional}}
+Bitrate (of a file, typically) in yottabits (1 yottabits = 1000×1000×1000×1000×1000×1000×1000×1000 bits).',
# Live preview
'livepreview-loading' => '{{Identical|Loading}}',
@@ -4206,6 +4330,10 @@ Name of month in Hebrew calender.',
Name of month in Hebrew calender.',
# Signatures
+'signature' => "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp)
+* $1: the username that is currently login
+* $2: the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw
+Use your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.",
'timezone-utc' => '{{optional}}',
# Core parser functions
@@ -4359,4 +4487,148 @@ Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a
'sqlite-has-fts' => 'Shown on Special:Version, $1 is version',
'sqlite-no-fts' => 'Shown on Special:Version, $1 is version',
+# New logging system
+'logentry-delete-delete' => '{{Logentry}}',
+'logentry-delete-restore' => '{{Logentry}}',
+'logentry-delete-event' => '{{Logentry}}
+{{Logentryparam}}
+* $3 is the name of the log page inside parenthesis',
+'logentry-delete-revision' => '{{Logentry}}
+{{Logentryparam}}
+* $5 is the number of affected revisions of the page $3.',
+'logentry-delete-event-legacy' => '{{Logentry}}
+$3 is the name of the log page inside parenthesis',
+'logentry-delete-revision-legacy' => '{{Logentry}}',
+'logentry-suppress-delete' => "{{Logentry}}
+
+'Hid' is a possible alternative to 'suppressed' in this message.",
+'logentry-suppress-event' => '{{Logentry}}
+{{Logentryparam}}
+$3 is the name of the log page inside parenthesis',
+'logentry-suppress-revision' => '{{Logentry}}
+{{Logentryparam}}
+* $5 is the number of affected revisions of the page $3.',
+'logentry-suppress-event-legacy' => '{{Logentry}}
+$3 is the name of the log page inside parenthesis',
+'logentry-suppress-revision-legacy' => '{{Logentry}}',
+'revdelete-content-hid' => 'Used on
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-summary-hid' => 'Used on
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-uname-hid' => 'Used on
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-content-unhid' => 'Used on
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-summary-unhid' => 'Used on
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-uname-unhid' => 'Used on
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-restricted' => 'This message is used as parameter $4 when setting visibility restrictions for administrators in:
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'revdelete-unrestricted' => 'This message is used as parameter $4 when setting visibility restrictions for administrators in:
+* {{msg-mw|logentry-delete-event}}
+* {{msg-mw|logentry-delete-revision}}
+* {{msg-mw|logentry-suppress-event}}
+* {{msg-mw|logentry-suppress-event}}',
+'logentry-move-move' => '{{Logentry}}
+Parameter $4, the target page, is also not visible to parser functions.',
+'logentry-move-move-noredirect' => '{{Logentry}}
+Parameter $4, the target page, is also not visible to parser functions.',
+'logentry-move-move_redir' => '{{Logentry}}
+Parameter $4, the target page, is also not visible to parser functions.',
+'logentry-move-move_redir-noredirect' => '{{Logentry}}
+Parameter $4, the target page, is also not visible to parser functions.',
+'logentry-patrol-patrol' => '{{Logentry}}
+* $4 is a formatted revision number, maybe linked to the diff.',
+'logentry-patrol-patrol-auto' => '{{Logentry}}
+* $4 is a formatted revision number, maybe linked to the diff.
+"Automatically" refers to users with autopatrol right who mark revisions automatically patrolled when editing.',
+'logentry-newusers-create2' => '{{Logentry}}
+
+$4 is the gender of the target user.',
+
+# Feedback
+'feedback-bugornote' => 'When feedback dialog box is opened, this introductory message in small print explains the options to report a bug or add simple feedback. We expect that people in a hurry will not read this.',
+'feedback-subject' => 'Label for a text input
+{{Identical|Subject}}',
+'feedback-message' => 'Label for a textarea; signature referrs to a Wikitext signature.',
+'feedback-cancel' => 'Button label
+{{Identical|Cancel}}',
+'feedback-submit' => 'Button label
+{{Identical|Submit}}',
+'feedback-adding' => 'Progress notice',
+'feedback-error1' => 'Error message, appears when an unknown error occurs submitting feedback',
+'feedback-error2' => 'Error message, appears when we could not add feedback',
+'feedback-error3' => 'Error message, appears when we lose our connection to the wiki',
+'feedback-thanks' => 'Thanks message, appears if feedback was successful',
+'feedback-close' => 'Button label
+{{Identical|Done}}',
+'feedback-bugcheck' => 'Message that appears before the user submits a bug, reminding them to check for known bugs.',
+'feedback-bugnew' => 'Button label - asserts that the user has checked for existing bugs. When clicked will launch a bugzilla form to add a new bug in a new tab or window',
+
+# API errors
+'api-error-badaccess-groups' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-badtoken' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-copyuploaddisabled' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-duplicate' => 'API error message that can be used for client side localisation of API errors. Parameters:
+* $1 is a number of files
+* $2 is a link to a list of duplicate files.',
+'api-error-duplicate-archive' => 'API error message that can be used for client side localisation of API errors. Parameters:
+* $1 is a number of files
+* $2 is a link to a list of duplicate files.',
+'api-error-duplicate-archive-popup-title' => 'API error message that can be used for client side localisation of API errors. Parameters:
+* $1 is a number of files.',
+'api-error-duplicate-popup-title' => 'This message is a pop-up title shown in case one or more files exactly equal to the one just uploaded are already present. The word "duplicate" is an adjective.',
+'api-error-empty-file' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-emptypage' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-fetchfileerror' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-file-too-large' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-filename-tooshort' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-filetype-banned' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-filetype-missing' => 'The word "extension" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.',
+'api-error-hookaborted' => 'The word "extension" here refers to a [[:mw:Manual:Extensions|MediaWiki Extension]] which extends the functionality of the basic wiki by adding something to its capabilities. "… aborted by an extension" implies that an operation could not be performed successfully or was not allowed to continue to its intended end.',
+'api-error-http' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-illegal-filename' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-internal-error' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-invalid-file-key' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-missingparam' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-missingresult' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-mustbeloggedin' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-mustbeposted' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-noimageinfo' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-nomodule' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-ok-but-empty' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-overwrite' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-stashfailed' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-timeout' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-unclassified' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-unknown-code' => 'API error message that can be used for client side localisation of API errors. Parameters:
+* $1 may contain more error details.',
+'api-error-unknown-error' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-unknown-warning' => 'API error message that can be used for client side localisation of API errors. Parameters:
+* $1 is an unknown warning.',
+'api-error-uploaddisabled' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-verification-error' => 'The word "extension" refers to the part behind the last dot in a file name, that by convention gives a hint about the kind of data format which a files contents are in.',
+
);
diff --git a/languages/messages/MessagesQu.php b/languages/messages/MessagesQu.php
index 33345ea1..f765cc12 100644
--- a/languages/messages/MessagesQu.php
+++ b/languages/messages/MessagesQu.php
@@ -130,139 +130,139 @@ $specialPageAliases = array(
#!!# Translation <b>HORAACTUAL</b> is used more than once for <a href="#mw-sp-magic-currenttime">currenttime</a> and <a href="#mw-sp-magic-currenthour">currenthour</a>.
#!!# Translation <b>HORALOCAL</b> is used more than once for <a href="#mw-sp-magic-localtime">localtime</a> and <a href="#mw-sp-magic-localhour">localhour</a>.
$magicWords = array(
- 'redirect' => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
- 'notoc' => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÃA__', '__NOGALERIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
- 'toc' => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
- 'noeditsection' => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__UMANNAQ__', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'KUNANPUNCHAW', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'KUNANPUNCHAW2', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'KUNANPUNCHAWSUTI', 'NOMBREDÃAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'KUNANURA', 'HORA_ACTUAL', 'HORAACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'KAYPIPUNCHAW', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
- 'localday2' => array( '1', 'KAYPIPUNCHAW2', 'DIALOCAL2', 'DÃALOCAL2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'KAYPIPUNCHAWSUTI', 'NOMBREDIALOCAL', 'NOMBREDÃALOCAL', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'KAYPIWATA', 'AÑOLOCAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'KAYPIURA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'HAYKAPANQA', 'NÚMERODEPÃGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÃCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'PANQASUTI', 'NOMBREDEPAGINA', 'NOMBREDEPÃGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'PANQASUTIE', 'NOMBREDEPAGINAC', 'NOMBREDEPÃGINAC', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'SUTIKITI', 'ESPACIODENOMBRE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'SUTIKITIE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'RIMANAKUYKITI', 'RIMAYKITI', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'QILLQAKITI', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÃCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'QILLQAKITIE', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÃCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'HUNTAPANQASUTIE', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÃGINAC', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'URINPANQASUTI', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'URINPANQASUTIE', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÃGINAC', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'TIKSIPANQASUTI', 'NOMBREDEPAGINABASE', 'NOMBREDEPÃGINABASE', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'TIKSIPANQASUTIE', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÃGINABASEC', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'RIMANAKUYPANQASUTI', 'NOMBREDEPÃGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÃGINADISCUSIÓN', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'RIMANAKUYPANQASUTIE', 'NOMBREDEPÃGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÃGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'QILLQAPANQASUTI', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'QILLQAPANQASUTIE', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'WILLA:', 'MSJ:', 'MSG:' ),
- 'subst' => array( '0', 'WAKCHAY:', 'SUBST:' ),
- 'msgnw' => array( '0', 'WILLAMUSUQ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'rikchacha', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'rikchacha=$1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'paña', 'alliq', 'derecha', 'dcha', 'der', 'right' ),
- 'img_left' => array( '1', 'lluqi', 'ichuq', 'izquierda', 'izda', 'izq', 'left' ),
- 'img_none' => array( '1', 'manaima', 'mana', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
- 'img_center' => array( '1', 'chawpi', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
- 'img_framed' => array( '1', 'inchuyuq', 'inchu', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'inchunnaq', 'sinmarco', 'sin_embarcar', 'sinenmarcar', 'sin_enmarcar', 'frameless' ),
- 'img_page' => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'sayaq', 'sayaq=$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'saywa', 'borde', 'border' ),
- 'img_baseline' => array( '1', 'tiksisiqi', 'baseline' ),
- 'img_sub' => array( '1', 'uran', 'sub' ),
- 'img_super' => array( '1', 'hanan', 'super', 'sup' ),
- 'img_top' => array( '1', 'hawa', 'top' ),
- 'img_text_top' => array( '1', 'qillqahawa', 'text-top' ),
- 'img_middle' => array( '1', 'ukhupi', 'middle' ),
- 'img_bottom' => array( '1', 'sikipi', 'bottom' ),
- 'img_text_bottom' => array( '1', 'qillqasiki', 'text-bottom' ),
- 'img_link' => array( '1', 'tinki=$1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'wak=$1', 'alt=$1' ),
- 'int' => array( '0', 'WILLAY:', 'INT:' ),
- 'sitename' => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'SITENAME' ),
- 'ns' => array( '0', 'SKITI:', 'EN:', 'NS:' ),
- 'localurl' => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
- 'localurle' => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
- 'server' => array( '0', 'SIRWIQ', 'SERVIDOR', 'SERVER' ),
- 'servername' => array( '0', 'SIRWIQSUTI', 'NOMBRESERVIDOR', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'QILLQAÑAN', 'QILLQANAN', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'SIMIKAMACHIY:', 'GRAMATICA:', 'GRAMÃTICA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'QHARIWARMI:', 'QARIWARMI:', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__AMASUTITAHUKCHAYCHU__', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÃTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__AMASAMIQTAHUKCHAYCHU__', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'KUNANSIMANA', 'SEMANAACTUAL', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'KUNANSIMANAPUNCHAW', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÃADESEMANAACTUAL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'KAYLLASIMANA', 'SEMANALOCAL', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'KAYLLASIMANAPUNCHAW', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÃADESEMANALOCAL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'MUSUQCHASQAID', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
- 'revisionday' => array( '1', 'MUSUQCHASQAPUNCHAW', 'DIADEREVISION', 'DIAREVISION', 'DÃADEREVISIÓN', 'DÃAREVISIÓN', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'MUSUQCHASQAPUNCHAW2', 'DIADEREVISION2', 'DIAREVISION2', 'DÃADEREVISIÓN2', 'DÃAREVISIÓN2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MUSUQCHASQAKILLA', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'MUSUQCHASQAWATA', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'MUSUQCHASQAPACHAQILLPA', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'MUSUQCHASQARURAQ', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ACHKA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'HUNTAURL:', 'URLCOMPLETA:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'HUNTAURLE:', 'URLCOMPLETAC:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
- 'lc' => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
- 'uc' => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
- 'raw' => array( '0', 'CHAWA:', 'RAW:' ),
- 'displaytitle' => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
- 'currentversion' => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'WATANALLAWICHAY', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'KUNANPACHAQILLPA', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'KAYLLAPACHAQILLPA', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'PURIRIYSANANCHA', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#RIMAY:', '#IDIOMA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'SAMIQRIMAY', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NÚMEROADMINIISTRADORES', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
- 'padleft' => array( '0', 'PADLLUQI', 'PADICHUQ', 'PADLEFT' ),
- 'padright' => array( '0', 'PADPAÑA', 'PADALLIQ', 'PADRIGHT' ),
- 'special' => array( '0', 'sapaq', 'especial', 'special' ),
- 'defaultsort' => array( '1', 'ALLINCHAY:', 'SIQINCHAY:', 'ORDENAR:', 'ORDENPREDETERMINADO:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'WILLAÑIQIÑAN', 'WILLANIQINAN', 'RUTAARCHIVO', 'RUTARCHIVO', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
- 'tag' => array( '0', 'unanchacha', 'UNANCHACHA', 'etiqueta', 'ETIQUETA', 'tag' ),
- 'hiddencat' => array( '1', '__PAKASQAKATIGURIYA__', '__CATEGORÃAOCULTA__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'KATIGURIYAPIPANQAKUNA', 'PÃGINASENCATEGORÃA', 'PÃGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'PANQACHHIKAN', 'PANQACHIKAN', 'PANQACHIKA', 'TAMAÑOPÃGINA', 'TAMAÑODEPÃGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
- 'index' => array( '1', '__UNANCHAY__', '__INDEXAR__', '__INDEX__' ),
- 'noindex' => array( '1', '__AMAUNANCHAYCHU__', '__NOINDEXAR__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__TIYAQLLAPUSAPUNA__', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÃTICA__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
+ 'notoc' => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÃA__', '__NOGALERIA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__UMANNAQ__', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'KUNANPUNCHAW', 'DÃAACTUAL', 'DIAACTUAL', 'DÃA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'KUNANPUNCHAW2', 'DÃAACTUAL2', 'DIAACTUAL2', 'DÃA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'KUNANPUNCHAWSUTI', 'NOMBREDÃAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'KUNANURA', 'HORA_ACTUAL', 'HORAACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'KAYPIPUNCHAW', 'DÃALOCAL', 'DIALOCAL', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'KAYPIPUNCHAW2', 'DIALOCAL2', 'DÃALOCAL2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'KAYPIPUNCHAWSUTI', 'NOMBREDIALOCAL', 'NOMBREDÃALOCAL', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'KAYPIWATA', 'AÑOLOCAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'KAYPIURA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'HAYKAPANQA', 'NÚMERODEPÃGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÃCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'HAYKARURAQ', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'HAYKARURACHKAQ', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSACTIVOS', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'HAYKALLAMKAPUSQA', 'NÚMERODEEDICIONES', 'NUMERODEEDICIONES', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'HAYKAQHAWASQA', 'HAYKAQAWASQA', 'NÚMERODEVISTAS', 'NUMERODEVISTAS', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'PANQASUTI', 'NOMBREDEPAGINA', 'NOMBREDEPÃGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PANQASUTIE', 'NOMBREDEPAGINAC', 'NOMBREDEPÃGINAC', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'SUTIKITI', 'ESPACIODENOMBRE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'SUTIKITIE', 'ESPACIODENOMBREC', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'RIMANAKUYKITI', 'RIMAYKITI', 'ESPACIODEDISCUSION', 'ESPACIODEDISCUSIÓN', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'QILLQAKITI', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÃCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'QILLQAKITIE', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÃCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÃGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÃGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'HUNTAPANQASUTIE', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÃGINAC', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'URINPANQASUTI', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÃGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'URINPANQASUTIE', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÃGINAC', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'TIKSIPANQASUTI', 'NOMBREDEPAGINABASE', 'NOMBREDEPÃGINABASE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'TIKSIPANQASUTIE', 'NOMBREDEPAGINABASEC', 'NOMBREDEPÃGINABASEC', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'RIMANAKUYPANQASUTI', 'NOMBREDEPÃGINADEDISCUSIÓN', 'NOMBREDEPAGINADEDISCUSION', 'NOMBREDEPAGINADISCUSION', 'NOMBREDEPÃGINADISCUSIÓN', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'RIMANAKUYPANQASUTIE', 'NOMBREDEPÃGINADEDISCUSIÓNC', 'NOMBREDEPAGINADEDISCUSIONC', 'NOMBREDEPAGINADISCUSIONC', 'NOMBREDEPÃGINADISCUSIÓNC', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'QILLQAPANQASUTI', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'QILLQAPANQASUTIE', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'WILLA:', 'MSJ:', 'MSG:' ),
+ 'subst' => array( '0', 'WAKCHAY:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'WILLAMUSUQ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'rikchacha', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'rikchacha=$1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'paña', 'alliq', 'derecha', 'dcha', 'der', 'right' ),
+ 'img_left' => array( '1', 'lluqi', 'ichuq', 'izquierda', 'izda', 'izq', 'left' ),
+ 'img_none' => array( '1', 'manaima', 'mana', 'ninguna', 'nada', 'no', 'ninguno', 'none' ),
+ 'img_center' => array( '1', 'chawpi', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'inchuyuq', 'inchu', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'inchunnaq', 'sinmarco', 'sin_embarcar', 'sinenmarcar', 'sin_enmarcar', 'frameless' ),
+ 'img_page' => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'sayaq', 'sayaq=$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'saywa', 'borde', 'border' ),
+ 'img_baseline' => array( '1', 'tiksisiqi', 'baseline' ),
+ 'img_sub' => array( '1', 'uran', 'sub' ),
+ 'img_super' => array( '1', 'hanan', 'super', 'sup' ),
+ 'img_top' => array( '1', 'hawa', 'top' ),
+ 'img_text_top' => array( '1', 'qillqahawa', 'text-top' ),
+ 'img_middle' => array( '1', 'ukhupi', 'middle' ),
+ 'img_bottom' => array( '1', 'sikipi', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'qillqasiki', 'text-bottom' ),
+ 'img_link' => array( '1', 'tinki=$1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'wak=$1', 'alt=$1' ),
+ 'int' => array( '0', 'WILLAY:', 'INT:' ),
+ 'sitename' => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'SITENAME' ),
+ 'ns' => array( '0', 'SKITI:', 'EN:', 'NS:' ),
+ 'localurl' => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'SIRWIQ', 'SERVIDOR', 'SERVER' ),
+ 'servername' => array( '0', 'SIRWIQSUTI', 'NOMBRESERVIDOR', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'QILLQAÑAN', 'QILLQANAN', 'RUTASCRIPT', 'RUTADESCRIPT', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'SIMIKAMACHIY:', 'GRAMATICA:', 'GRAMÃTICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'QHARIWARMI:', 'QARIWARMI:', 'GÉNERO:', 'GENERO:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__AMASUTITAHUKCHAYCHU__', '__NOCONVERTIRTITULO__', '__NOCONVERTIRTÃTULO__', '__NOCT___', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__AMASAMIQTAHUKCHAYCHU__', '__NOCONVERTIRCONTENIDO__', '__NOCC___', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'KUNANSIMANA', 'SEMANAACTUAL', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'KUNANSIMANAPUNCHAW', 'DDSACTUAL', 'DIADESEMANAACTUAL', 'DÃADESEMANAACTUAL', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'KAYLLASIMANA', 'SEMANALOCAL', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'KAYLLASIMANAPUNCHAW', 'DDSLOCAL', 'DIADESEMANALOCAL', 'DÃADESEMANALOCAL', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'MUSUQCHASQAID', 'IDDEREVISION', 'IDREVISION', 'IDDEREVISIÓN', 'IDREVISIÓN', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'MUSUQCHASQAPUNCHAW', 'DIADEREVISION', 'DIAREVISION', 'DÃADEREVISIÓN', 'DÃAREVISIÓN', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'MUSUQCHASQAPUNCHAW2', 'DIADEREVISION2', 'DIAREVISION2', 'DÃADEREVISIÓN2', 'DÃAREVISIÓN2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MUSUQCHASQAKILLA', 'MESDEREVISION', 'MESDEREVISIÓN', 'MESREVISION', 'MESREVISIÓN', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'MUSUQCHASQAWATA', 'AÑODEREVISION', 'AÑODEREVISIÓN', 'AÑOREVISION', 'AÑOREVISIÓN', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'MUSUQCHASQAPACHAQILLPA', 'MARCADEHORADEREVISION', 'MARCADEHORADEREVISIÓN', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'MUSUQCHASQARURAQ', 'USUARIODEREVISION', 'USUARIODEREVISIÓN', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ACHKA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'HUNTAURL:', 'URLCOMPLETA:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'HUNTAURLE:', 'URLCOMPLETAC:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'UCHUYÑAWPAQ:', 'UCHUYNAWPAQ:', 'PRIMEROMINUS;', 'PRIMEROMINÚS:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
+ 'uc' => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
+ 'raw' => array( '0', 'CHAWA:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
+ 'currentversion' => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'WATANALLAWICHAY', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'KUNANPACHAQILLPA', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'KAYLLAPACHAQILLPA', 'MARCADEHORALOCAL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'PURIRIYSANANCHA', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#RIMAY:', '#IDIOMA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'SAMIQRIMAY', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NÚMEROADMINIISTRADORES', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'PADLLUQI', 'PADICHUQ', 'PADLEFT' ),
+ 'padright' => array( '0', 'PADPAÑA', 'PADALLIQ', 'PADRIGHT' ),
+ 'special' => array( '0', 'sapaq', 'especial', 'special' ),
+ 'defaultsort' => array( '1', 'ALLINCHAY:', 'SIQINCHAY:', 'ORDENAR:', 'ORDENPREDETERMINADO:', 'CLAVEDEORDENPREDETERMINADO:', 'ORDENDECATEGORIAPREDETERMINADO:', 'ORDENDECATEGORÃAPREDETERMINADO:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'WILLAÑIQIÑAN', 'WILLANIQINAN', 'RUTAARCHIVO', 'RUTARCHIVO', 'RUTAARCHIVO:', 'RUTARCHIVO:', 'RUTADEARCHIVO:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'unanchacha', 'UNANCHACHA', 'etiqueta', 'ETIQUETA', 'tag' ),
+ 'hiddencat' => array( '1', '__PAKASQAKATIGURIYA__', '__CATEGORÃAOCULTA__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'KATIGURIYAPIPANQAKUNA', 'PÃGINASENCATEGORÃA', 'PÃGINASENCAT', 'PAGSENCAT', 'PAGINASENCATEGORIA', 'PAGINASENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'PANQACHHIKAN', 'PANQACHIKAN', 'PANQACHIKA', 'TAMAÑOPÃGINA', 'TAMAÑODEPÃGINA', 'TAMAÑOPAGINA', 'TAMAÑODEPAGINA', 'PAGESIZE' ),
+ 'index' => array( '1', '__UNANCHAY__', '__INDEXAR__', '__INDEX__' ),
+ 'noindex' => array( '1', '__AMAUNANCHAYCHU__', '__NOINDEXAR__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'HUÑUPIYUPAY', 'HUNUPIYUPAY', 'NÚMEROENGRUPO', 'NUMEROENGRUPO', 'NUMENGRUPO', 'NÚMENGRUPO', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__TIYAQLLAPUSAPUNA__', '__REDIRECCIONESTATICA__', '__REDIRECCIÓNESTÃTICA__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'HAYKAAMACHAY', 'IMASINCHIAMACHAY', 'NIVELDEPROTECCIÓN', 'PROTECTIONLEVEL' ),
);
$messages = array(
@@ -621,20 +621,22 @@ Ama hina kaspa, huk [[Special:ListUsers/sysop|kamachiqman]] willariy, URL nisqa
'badarticleerror' => "Kay p'anqapiqa manam saqillanchu kay hina rurayta.",
'cannotdelete' => 'Manam atinichu "$1" sutiyuq p\'anqata icha willañiqita qulluyta.
P\'anqaqa pipapas qullusqanñachá.',
+'cannotdelete-title' => 'Manam atinichu "$1" sutiyuq p\'anqata qulluyta',
'badtitle' => "P'anqap sutinqa manam allinchu",
'badtitletext' => "Kay p'anqap sutinqa manam allinchu, mana allin interwiki t'inkichá icha ch'usaqchá, p'anqa sutipaq mana saqillasqa sananchayuqchá.",
-'perfcached' => "Kay willakunaqa ''cache'' nisqa pakasqa hallch'apim kachkan, chayrayku manañachá musuqchasqachu:",
-'perfcachedts' => 'Kay willakunaqa waqaychasqam. Qhipaq musuqchasqaqa $1 karqan.',
+'perfcached' => "Kay qatiq willakunaqa ''cache'' nisqa pakasqa hallch'apim kachkan, chayrayku manañachá musuqchasqachu. {{PLURAL:$1|Huklla|$1-lla}} taripasqam pakasqa hallch'api aypalla kachkan, manam aswanchu.",
+'perfcachedts' => "Kay willakunaqa hallch'asqam. Qhipaq musuqchasqaqa $1 karqan. {{PLURAL:$4|Huklla|$4-lla}} taripasqam pakasqa hallch'api aypalla kachkan, manam aswanchu.",
'querypage-no-updates' => "Kay p'anqata musuqchayqa manam atichkanchu. Kunanqa kaypi willakuna manam musuqchasqachu kanqa.",
'wrong_wfQuery_params' => 'Kaypa pantasqa kuskanachina tupunkuna: wfQuery()<br />
Ruray paqtachi: $1<br />
Tapuna: $2',
'viewsource' => 'Pukyu qillqata qhaway',
-'viewsourcefor' => '$1-paq',
+'viewsource-title' => "$1 sutiyuq p'anqap pukyu qillqanta qhaway",
'actionthrottled' => "Rurayniykiqa hark'asqam",
'actionthrottledtext' => "Spam nisqa millay rurayta hark'anapaq, manam saqillasunkichu kayta nisyu kutikunata rurayta ratulla mit'api. Nisyutam ruraykachanki. Ama hina kaspa, huk minutukunamanta musuqmanta ruraykachay.",
'protectedpagetext' => "Kay p'anqaqa llamk'apuymanta amachasqam.",
'viewsourcetext' => "Kay p'anqap pukyu qillqantam qhawayta iskaychaytapas atinki:",
+'viewyourtext' => "'''Qampa llamk'apusqayki'''p pukyu qillqantam qhawayta iskaychaytapas atinki:",
'protectedinterface' => "Kay p'anqapiqa wakichintinpa uyapuranpaq qillqam.
Wandalismu nisqamanta amachasqam kachkan.",
'editinginterface' => "'''Paqtataq:''' Uyapura p'anqatam llamk'apuchkanki. Hukchaptiykiqa, chay uyapurap rikch'ayninqa hukyanqa huk ruraqkunapaqpas. Uyapurata t'ikrayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruranaykimanta hamut'ariy.",
@@ -727,6 +729,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
'noemailprefs' => "E-chaski imamaytaykita willaway kay rurachinakunata llamk'achinapaq.",
'emailconfirmlink' => 'E-chaski imamaytaykita takyachiy',
'invalidemailaddress' => "E-chaski imamaytaykiqa manam allinchu, manachá allinta qillqasqa. Ama hina kaspa, musuq allin sananchayuq imamaytaykita qillqamuy icha k'itichata ch'usaqchay.",
+'cannotchangeemail' => 'Ruraqpa rakiqunanpi e-chaski imamaytakunaqa kay wikipi manam hukchanallachu.',
'accountcreated' => 'Rakiqunaqa kichasqañam',
'accountcreatedtext' => '$1 sutiyuq ruraqpa rakiqunanqa kichasqañam.',
'createaccount-title' => '{{SITENAME}}paq musuq rakiqunata kichariy',
@@ -741,6 +744,7 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
# E-mail sending
'php-mail-error-unknown' => 'Mana riqsisqa pantasqa PHP mail() rurananpi',
+'user-mail-no-addy' => 'Mana chaskiqniyuq e-chaskita kachayta munarqanki.',
# Change password dialog
'resetpass' => 'Ruraqpa yaykuna rimanta hukchay',
@@ -761,16 +765,18 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
'resetpass-temp-password' => "Mit'alla yaykuna rima:",
# Special:PasswordReset
-'passwordreset' => 'Yaykuna rimata kutichiy',
-'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, rakiqunaykipaq willakunayuq e-chaskita chaskinaykipaq.",
-'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-username' => 'Ruraqpa sutin:',
-'passwordreset-domain' => 'Duminyu:',
-'passwordreset-email' => 'E-chaski imamayta:',
-'passwordreset-emailtitle' => '{{SITENAME}}-paq rakiqunamanta willakuna',
-'passwordreset-emailtext-ip' => "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)
+'passwordreset' => 'Yaykuna rimata kutichiy',
+'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, rakiqunaykipaq willakunayuq e-chaskita chaskinaykipaq.",
+'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-username' => 'Ruraqpa sutin:',
+'passwordreset-domain' => 'Duminyu:',
+'passwordreset-capture' => 'Llalliwaq e-chaskita qhawayta munankichu?',
+'passwordreset-capture-help' => "Kay k'itichata ñit'iywan sananchaspaykiqa, mit'alla yaykuna rimayuq e-chaskita rikunki, hinaptiyki ruraqmanmi kachasqa kanqa.",
+'passwordreset-email' => 'E-chaski imamayta:',
+'passwordreset-emailtitle' => '{{SITENAME}}-paq rakiqunamanta willakuna',
+'passwordreset-emailtext-ip' => "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)
rakiqunaykipaq willakunayuq yuyachinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
kay e-chaski imamaytayuq kachkan:
@@ -780,7 +786,7 @@ Kay mit'alla yaykuna {{PLURAL:$3|rimaqa|rimakunaqa}} kunanmanta {{PLURAL:$5|huk
Yaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqaptinqa,
icha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,
kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
-'passwordreset-emailtext-user' => "{{SITENAME}}-pi kaq $1 sutiyuq ruraqqa {{SITENAME}}-paq ($4)
+'passwordreset-emailtext-user' => "{{SITENAME}}-pi kaq $1 sutiyuq ruraqqa {{SITENAME}}-paq ($4)
rakiqunaykipaq willakunayuq yuyachinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
kay e-chaski imamaytayuq kachkan:
@@ -790,9 +796,22 @@ Kay mit'alla yaykuna {{PLURAL:$3|rimaqa|rimakunaqa}} kunanmanta {{PLURAL:$5|huk
Yaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqaptinqa,
icha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,
kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
-'passwordreset-emailelement' => "Ruraqpa sutin: $1
+'passwordreset-emailelement' => "Ruraqpa sutin: $1
Mit'alla yaykuna rima: $2",
-'passwordreset-emailsent' => 'Yuyachina e-chaskiqa kachasqañam.',
+'passwordreset-emailsent' => 'Yuyachina e-chaskiqa kachasqañam.',
+'passwordreset-emailsent-capture' => 'Yuyachina 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',
+
+# Special:ChangeEmail
+'changeemail' => 'E-chaski imamaytata wakinchay',
+'changeemail-header' => 'Rakiqunap e-chaski imamaytanta wakinchay',
+'changeemail-text' => "Kay hunt'ana p'anqata hunt'ay e-chaski imamaytaykita hukchanaykipaq. Yaykuna rimaykita yaykuchinaykim tiyan kay hukchanata takyachinaykipaq.",
+'changeemail-no-info' => "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
+'changeemail-oldemail' => 'Kunan kachkaq e-chaski imamayta:',
+'changeemail-newemail' => 'Musuq e-chaski imamayta:',
+'changeemail-none' => '(mana ima)',
+'changeemail-submit' => 'E-chaskita wakinchay',
+'changeemail-cancel' => 'Ama niy',
# Edit page toolbar
'bold_sample' => 'Yanasapa qillqa',
@@ -855,9 +874,6 @@ Manam saqillasunkichu 'Kay ruraqman e-chaskita kachay' nisqata llamk'achiyta man
Kunan IP huchhaykiqa $3 nisqam, hark'ay huchhataq #$5 nisqam. Mañakuspaykiqa kay p'anqapi tukuy nisqakunata willay.",
'blockednoreason' => "hark'aqqa manam ninchu imarayku",
-'blockedoriginalsource' => "'''$1'''-pa pukyu qillqanqa kaymi:",
-'blockededitsource' => "'''$1'''-pi '''llamk'apusqaykikuna''' nisqapi qillqasqaqa kaymi:",
-'whitelistedittitle' => "Yaykuspallaykim llamk'apuyta atinki.",
'whitelistedittext' => "$1ta ruranaykim tiyan qillqakunata llamk'apunaykipaq.",
'confirmedittext' => "P'anqakunata llamk'apunaykipaqqa e-chaski imamaytaykita takyachinaykim tiyan. Ama hina kaspa, e-chaski imamaytata kicharispa takyachiy [[Special:Preferences|allinkachinaykikunapi]].",
'nosuchsectiontitle' => 'Manam tarinichu chay rakita',
@@ -929,7 +945,7 @@ Takyachichkankim: Kayqa ñuqap qillqasqaymi icha qispi pukyumanta iskaychamusqay
'copyrightwarning2' => "Lliw {{SITENAME}}paq llamk'apuykunaqa huk ruraqkunap llamk'apunallanmi, hukchanallanmi icha qullunallanmi. Llamk'asqaykikunata huk runakunap allinchayninta qispilla mast'ariyninta mana munaspaykiqa, ama kayman qillqamuychu.<br />
Takyachichkankim: Kayqa ñuqap qillqasqaymi, ñuqamanmi kapuwan icha qispi pukyumanta iskaychamusqaymi, nispa ($1 p'anqata qhaway).
<br />'''Mana saqillasqa kaspaykiqa, ama qillqarimuychu iskaychay hayñi ''(copyright)'' nisqayuq qillqakunata iskaychamuspa!'''",
-'longpageerror' => "'''PANTASQA: Kachasqayki qillqaqa $1 kB hatunmi, $2 kB-manta aswan hatunmi. Manam waqaychasqa kayta atinchu.'''",
+'longpageerror' => "'''Pantasqa: Kachasqayki qillqaqa {{PLURAL:$1|huk kB|$1 kB}} hatunmi, {{PLURAL:$2|huk kB|$2 kB}}-manta aswan hatunmi. Manam waqaychasqa kayta atinchu.'''",
'readonlywarning' => "'''PAQTATAQ: Willañiqintinqa hark'asqam mit'awa kakuchinapaq. Chayrayku kunanqa manam atichkankichu llamk'apusqaykikunata waqaychayta.
Qillqasqaykita iskaychaspa antañiqiqniykipi willañiqiman llut'amuspa chaypi waqaychariy. Kunanmanta huk pachallapi musuqmanta waqaychaykachay.'''
@@ -1094,8 +1110,6 @@ Kay wakin kayta qhawayta atinkim; astawanchá rikunkiman [{{fullurl:{{#Special:L
'revdelete-unsuppress' => "Qullusqamanta paqarisqa llamk'apusqakunapaq saywachanakunata raqpay",
'revdelete-log' => 'Kayrayku:',
'revdelete-submit' => "Akllasqa {{PLURAL:$1|llamk'apusqapaq|llamk'apusqakunapaq}} llamk'achiy",
-'revdelete-logentry' => "hukchasqa [[$1]]-paq llamk'apusqap rikunalla kaynin",
-'logdelete-logentry' => 'hukchasqa [[$1]]-paq tukusqap rikunalla kaynin',
'revdelete-success' => "'''Llamk'apusqap rikunalla kayninqa aypalla musuqchasqañam.'''",
'revdelete-failure' => "'''Manam atinichu musuqchasqakunap rikunalla kayninta musuqchayta:'''
$1",
@@ -1107,15 +1121,6 @@ $1",
'revdel-restore-visible' => 'rikuna musuqchasqakuna',
'pagehist' => "P'anqap wiñay kawsaynin",
'deletedhist' => 'Qullusqa wiñay kawsay',
-'revdelete-content' => 'samiq',
-'revdelete-summary' => "yuyarinata llamk'apuy",
-'revdelete-uname' => 'ruraqpa sutin',
-'revdelete-restricted' => "kamachiqkunaman llamk'achisqa saywachanakuna",
-'revdelete-unrestricted' => 'kamachiqkunamanta qichusqa saywachanakuna',
-'revdelete-hid' => 'pakasqa $1',
-'revdelete-unhid' => 'rikuchisqa $1',
-'revdelete-log-message' => '$1, $2 {{PLURAL:$2|musuqchasqa|musuqchasqakuna}}paq',
-'logdelete-log-message' => '$1, $2 {{PLURAL:$2|tukusqa|tukusqakuna}}paq',
'revdelete-hide-current' => "Pantasqa, imatapas pakaspa $2 pacha, $1 p'unchawmanta: kayqa kunan kachkaq musuqchasqam.
Manam pakanallachu.",
'revdelete-show-no-access' => 'Pantasqa, imatapas rikuchispa $2 pacha, $1 p\'unchawmanta: kayqa "manam tukuykunapaqchu" nispa sananchasqam.
@@ -1270,12 +1275,14 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
'prefs-rc' => 'Ñaqha hukchasqakuna',
'prefs-watchlist' => "Watiqasqa p'anqakuna",
'prefs-watchlist-days' => "Hayk'a p'unchawkunata watiqana sutisuyupi rikuchiy:",
-'prefs-watchlist-days-max' => "Ama qanchismanta aswan p'unchaw kachunchu",
+'prefs-watchlist-days-max' => "Ama {{PLURAL:$1|huk p'unchawmanta|$1 p'unchawmanta}} aswan p'unchaw kachunchu",
'prefs-watchlist-edits' => "Hayk'a hukchasqakunata hatunchasqa watiqana sutisuyupi rikuchiy:",
'prefs-watchlist-edits-max' => 'Ama waranqamanta aswan kachunchu',
'prefs-watchlist-token' => 'Watiqay sutisuyu sanancha:',
'prefs-misc' => 'Ñawra',
'prefs-resetpass' => 'Yaykuna rimata hukchay',
+'prefs-changeemail' => 'E-chaski imamaytata wakinchay',
+'prefs-setemail' => 'E-chaski imamaytata churay',
'prefs-email' => 'E-chaskipaq akllanakuna',
'prefs-rendering' => "Rikch'akuynin",
'saveprefs' => 'Allinkachinakunata waqaychay',
@@ -1334,6 +1341,7 @@ Chaytataq manam kutichiyta atinkichu.",
'yourrealname' => 'Chiqap sutiyki*',
'yourlanguage' => 'Rimay',
'yourvariant' => "Samiq rimaypa rikch'aynin:",
+'prefs-help-variant' => "Qampa astawan munasqayki allin qillqay kay wikipi samiqniyuq p'anqakunata rikuchinapaq.",
'yournick' => 'Chutu sutiyki (ruruchinapaq)',
'prefs-help-signature' => "Rimanakuy p'anqakunapi qillqamuspaykiqa, \"<nowiki>~~~~</nowiki>\" sananchakunawanmi silq'unkiman. Chay sananchakunaqa silq'uyniykiyuq, pachayuq, p'unchawniyuq qillqamanmi tukukunqa.",
'badsig' => "Chawa silq'usqaykiqa manam allinchu; HTML sananchakunata llanchiy.",
@@ -1373,7 +1381,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'userrights-lookup-user' => 'Ruraqkunap huñunkunata allinkachiy',
'userrights-user-editname' => 'Ruraqpa sutinta qillqamuy:',
'editusergroup' => 'Ruraqkunap huñunkunata hukchay',
-'editinguser' => "Kay ruraqpa hayñinkunata hukchaspa: '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Kay ruraqpa hayñinkunata hukchaspa: '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Ruraqkunap huñunkunata hukchay',
'saveusergroups' => 'Ruraq huñukunata waqaychay',
'userrights-groupsmember' => 'Kayman kapuq:',
@@ -1467,13 +1475,13 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'right-autopatrol' => "Llamk'apusqakunata kikinmanta qhawaykusqa kananman sananchay",
'right-patrolmarks' => 'Ñaqha hukchasqakunapi qhawaykusqa sananchasqakunata qhaway',
'right-unwatchedpages' => "Mana qhawaykusqa p'anqakunap sutisuyunta qhaway",
-'right-trackback' => "Ñawpaqman yupita qatiyta (''trackback'' nisqata) kachamuy",
'right-mergehistory' => "P'anqakunap wiñay kawsayninkunata huñuy",
'right-userrights' => "Tukuy ruraqkunap hayñinkunata llamk'apuy",
'right-userrights-interwiki' => "Wakin wiki tiyaykunapi ruraqkunap hayñinkunata llamk'apuy",
'right-siteadmin' => "Willañiqintinta hark'ay, paskaypas",
'right-override-export-depth' => "P'anqakunata hawaman quy, t'inkisqa p'anqakunatapas pichqa ñiqin t'inkipayasqakama",
'right-sendemail' => 'Huk ruraqkunaman e-chaskita kachay',
+'right-passwordreset' => 'Yaykuna rima kutichina e-chaskikunata qhaway',
# User rights log
'rightslog' => 'Ruraqpa hayñinkunap hukyasqankuna',
@@ -1507,16 +1515,17 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'action-suppressionlog' => "kay sapaqpa hallch'anta qhaway",
'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-patrol' => "huk ruraqpa llamk'apusqanta patrullasqa nispa sananchay",
'action-autopatrol' => "kikiykip llamk'apusqaykita patrullasqa nispa sananchakuy",
'action-unwatchedpages' => "mana watiqasqa p'anqa sutisuyuta qhaway",
-'action-trackback' => "ñawpaqman yupi qatiyta (''trackback'' nisqata) kachamuy",
'action-mergehistory' => "kay p'anqap wiñay kawsayninta huñuy",
'action-userrights' => "tukuy ruraqkunap hayñinkunata llamk'apuy",
'action-userrights-interwiki' => "hawa wikikunapi ruraqkunap hayñinkunata llamk'apuy",
'action-siteadmin' => "willañiqintinta hark'ay icha paskay",
+'action-sendemail' => 'e-chaskikunata kachay',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}}',
@@ -1548,6 +1557,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'number_of_watching_users_pageview' => '[$1 watiqachkaq {{PLURAL:$1|ruraq|ruraqkuna}}]',
'rc_categories' => 'Kay katiguriyakunaman saywachay ("|" nisqawan rakisqa)',
'rc_categories_any' => 'Imallapas',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña',
'newsectionsummary' => 'Musuq raki: /* $1 */',
'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
'rc-enhanced-hide' => 'Imaymanachakunata pakay',
@@ -1599,6 +1609,7 @@ Rikchata huk p'anqaman ch'aqtanaykipaqqa kay hunt'ana p'anqapi t'inkita llamk'ac
'ignorewarnings' => 'Ima paqtataq waqyaytapas qhawarpariy',
'minlength1' => 'Willañiqip sutinqa huk icha aswan sanampayuq kachun.',
'illegalfilename' => "«$1» nisqa williñiqip sutinqa p'anqa umallipaq mana allin sananchayuqmi. Ama hina kaspa, williñiqita sutincharaspa musuqmanta churkuykachay.",
+'filename-toolong' => 'Willañiqip sutinqa ama 240 bytemanta aswan suni kachunchu.',
'badfilename' => 'Rikchap sutinqa "$1"-man hukchasqam.',
'filetype-mime-mismatch' => 'Willañiqip chupanqa ".$1" manam taripasqa MIME rikch\'aqchu ($2).',
'filetype-badmime' => '"$1" MIME layayuq willañiqikunata churkuyqa manam saqillasqachu.',
@@ -1682,6 +1693,41 @@ $1',
'upload-unknown-size' => 'Mana riqsisqa chhikan',
'upload-http-error' => 'HTTP pantasqam tukusqa: $1',
+# File backend
+'backend-fail-stream' => 'Manam atinichu $1 sutiyuq willañiqita wantuyta.',
+'backend-fail-backup' => 'Manam atinichu $1 sutiyuq willañiqita iskaychaspa waqaychayta.',
+'backend-fail-notexists' => '$1 sutiyuq willañiqiqa manam kanchu.',
+'backend-fail-hashes' => "Manam atinichu willañiqikunap ch'iqisqankunata chaskiyta wakichanapaq.",
+'backend-fail-notsame' => '$1 nisqapiqa mana kaqlla willañiqim kachkanña.',
+'backend-fail-invalidpath' => '$1 nisqaqa manam allin pirwa ñanchu.',
+'backend-fail-delete' => 'Manam atinichu $1 sutiyuq willañiqita qulluyta.',
+'backend-fail-alreadyexists' => '$1 sutiyuq willañiqiqa kachkanñam.',
+'backend-fail-store' => 'Manam atinichu $1 sutiyuq willañiqita $2-pi pirwayta.',
+'backend-fail-copy' => 'Manam atinichu willañiqita $1-manta $2-man iskaychayta.',
+'backend-fail-move' => 'Manam atinichu willañiqita $1-manta $2-man astayta.',
+'backend-fail-opentemp' => "Manam atinichu mit'alla willañiqita kichariyta.",
+'backend-fail-writetemp' => "Manam atinichu mit'alla willañiqiman qillqayta.",
+'backend-fail-closetemp' => "Manam atinichu mit'alla willañiqita wichq'ayta.",
+'backend-fail-read' => 'Manam atinichu $1 sutiyuq willañiqita ñawiriyta.',
+'backend-fail-create' => 'Manam atinichu $1 sutiyuq willañiqita kamariyta.',
+'backend-fail-readonly' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqqa ñawirinallapaqmi kachkan, kayrayku: "$2"',
+'backend-fail-synced' => '"$1" sutiyuq willañiqiqa manam sinchichu kachkan ukhupi willañiqi hallch\'ana sirwiqkunapi',
+'backend-fail-connect' => 'Manam atinichu "$1" sutiyuq willañiqi hallch\'ana sirwiqwan t\'inkinakuyta.',
+'backend-fail-internal' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqpi mana riqsisqa pantasqam tukurqan.',
+'backend-fail-contenttype' => 'Manam atinichu "$1" nisqapi hallch\'ana willañiqip samiqninpa layanta yuqanchayta.',
+'backend-fail-batchsize' => "Willañiqi hallch'ana sirwiqmanqa $1 willañiqi {{PLURAL:$1|ruranayuq|ruranayuq}} tawqam qusqa; saywataq $2 {{PLURAL:$1|ruranam|ruranam}}.",
+
+# Lock manager
+'lockmanager-notlocked' => 'Manam atinichu "$1" nisqata paskayta; manam hark\'asqachu.',
+'lockmanager-fail-closelock' => 'Manam atinichu "$1" nisqapaq hark\'ana willañiqita wichq\'ayta.',
+'lockmanager-fail-deletelock' => 'Manam atinichu "$1" nisqapaq hark\'ana willañiqita qulluyta.',
+'lockmanager-fail-acquirelock' => 'Manam atinichu "$1" nisqapaq hark\'anata aypayta.',
+'lockmanager-fail-openlock' => 'Manam atinichu "$1" nisqapaq hark\'ana willañiqita kichayta.',
+'lockmanager-fail-releaselock' => 'Manam atinichu "$1" nisqapaq hark\'anata paskayta.',
+'lockmanager-fail-db-bucket' => 'Manam atinichu "$1" sutiyuq p\'uruñapi aypalla hark\'ana willañiqintinkunawan t\'inkinakuyta.',
+'lockmanager-fail-db-release' => 'Manam atinichu "$1" sutiyuq willañiqintinpi hark\'anakunata paskayta.',
+'lockmanager-fail-svr-release' => 'Manam atinichu "$1" sutiyuq sirwiqpi hark\'anakunata paskayta.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Willañiqita ZIP-kama llanchispa pantasqatam tarini.',
'zip-wrong-format' => 'Akllasqa willañiqiqa manam ZIP willañiqichu.',
@@ -1698,6 +1744,7 @@ Manam allin qasikanapaq llanchinachu.",
'uploadstash-badtoken' => "Kay rurayqa manam aypasqachu, tiyachkayniykipaq willasqaykikuna mawk'ayaptinchá. Musuqmanta ruraykachay.",
'uploadstash-errclear' => 'Willañiqi qulluyqa manam aypasqachu.',
'uploadstash-refresh' => 'Willañiqi sutisuyuta musuqchay',
+'invalid-chunk-offset' => 'Mana allin willañiqi raki churkuy',
# img_auth script messages
'img-auth-accessdenied' => 'Manam chayman saqisqachu',
@@ -1803,23 +1850,24 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'filerevert-badversion' => "Kay willañiqimanta qusqayki pachayuq tiyaylla llamk'apusqaqa manam kanchu.",
# File deletion
-'filedelete' => '$1-ta qulluy',
-'filedelete-legend' => 'Willañiqita qulluy',
-'filedelete-intro' => "'''[[Media:$1|$1]]''' sutiyuq willañiqitam qulluykachachkanki, tukuy wiñay kawsaynintapas.",
-'filedelete-intro-old' => "'''[[Media:$1|$1]]''' musuqchasqatam qulluchkanki [$4 $3, $2] nisqamanta.",
-'filedelete-comment' => 'Kayrayku:',
-'filedelete-submit' => 'Qulluy',
-'filedelete-success' => "'''$1''' qullusqañam.",
-'filedelete-success-old' => "$3, $2 pachamanta '''[[Media:$1|$1]]''' llamk'apusqaqa qullusqañam.",
-'filedelete-nofile' => "'''$1''' manam kanchu.",
-'filedelete-nofile-old' => "Qusqa kachkaykunayuq '''$1'''-manta waqaychasqa llamk'apusqaqa manam kanchu.",
-'filedelete-otherreason' => 'Hukrayku:',
-'filedelete-reason-otherlist' => 'Hukrayku',
-'filedelete-reason-dropdown' => "*Sapsirayku qullusqa
+'filedelete' => '$1-ta qulluy',
+'filedelete-legend' => 'Willañiqita qulluy',
+'filedelete-intro' => "'''[[Media:$1|$1]]''' sutiyuq willañiqitam qulluykachachkanki, tukuy wiñay kawsaynintapas.",
+'filedelete-intro-old' => "'''[[Media:$1|$1]]''' musuqchasqatam qulluchkanki [$4 $3, $2] nisqamanta.",
+'filedelete-comment' => 'Kayrayku:',
+'filedelete-submit' => 'Qulluy',
+'filedelete-success' => "'''$1''' qullusqañam.",
+'filedelete-success-old' => "$3, $2 pachamanta '''[[Media:$1|$1]]''' llamk'apusqaqa qullusqañam.",
+'filedelete-nofile' => "'''$1''' manam kanchu.",
+'filedelete-nofile-old' => "Qusqa kachkaykunayuq '''$1'''-manta waqaychasqa llamk'apusqaqa manam kanchu.",
+'filedelete-otherreason' => 'Hukrayku:',
+'filedelete-reason-otherlist' => 'Hukrayku',
+'filedelete-reason-dropdown' => "*Sapsirayku qullusqa
** K'irisqa ruraqpa hayñin
** Iskaychasqa willañiqi",
-'filedelete-edit-reasonlist' => "Qullusqapaq raykukunata llamk'apuy",
-'filedelete-maintenance' => "Willañiqi qulluypas paqarichiypas mit'alla hark'asqam, hatallichkaptinku.",
+'filedelete-edit-reasonlist' => "Qullusqapaq raykukunata llamk'apuy",
+'filedelete-maintenance' => "Willañiqi qulluypas paqarichiypas mit'alla hark'asqam, hatallichkaptinku.",
+'filedelete-maintenance-title' => 'Manam atinichu willañiqita qulluyta',
# MIME search
'mimesearch' => 'MIME maskay',
@@ -1913,6 +1961,8 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'wantedpages' => "Muchusqa p'anqakuna",
'wantedpages-badtitle' => "Mana allin p'anqa suti kay taripay tawqapi: $1",
'wantedfiles' => 'Munakusqa willañiqikuna',
+'wantedfiletext-cat' => "Kay qatiq willañiqikunaqa llamk'achisqa kaspapas manam kanchu. Hawa qullqapi kaq willañiqikunaqa kaspapas manachá rikuchisqa kanmanchu. Ima kay hina pantasqa kaqkunapas <del>tachasqam</del> kanqa. Ñataq, mana kaq willañiqita khakaq willañiqikunam [[:$1]] nisqapi rikuna kachkan.",
+'wantedfiletext-nocat' => "Kay qatiq willañiqikunaqa llamk'achisqa kaspapas manam kanchu. Hawa qullqapi kaq willañiqikunaqa kaspapas manachá rikuchisqa kanmanchu. Ima kay hina pantasqa kaqkunapas <del>tachasqam</del> kanqa.",
'wantedtemplates' => 'Munakusqa plantillakuna',
'mostlinked' => "Lliwmanta aswan t'inkimuqniyuq qillqakuna",
'mostlinkedcategories' => "Lliwmanta aswan t'inkimuqniyuq katiguriyakuna",
@@ -1921,6 +1971,7 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'mostimages' => "Lliwmanta astawan llamk'achisqa rikchakuna",
'mostrevisions' => 'Lliwmanta aswan hukchasqayuq qillqakuna',
'prefixindex' => "Tukuy p'anqakuna ñawpa k'askaqchayuq",
+'prefixindex-namespace' => "Tukuy qallarina k'askaqniyuq p'anqakuna ($1 suti k'itipi)",
'shortpages' => "Uchuylla p'anqakuna",
'longpages' => "Hatun p'anqakuna",
'deadendpages' => "Lluqsinannaq p'anqakuna",
@@ -1937,7 +1988,7 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'listusers-editsonly' => "Llamk'apusqayuq ruraqkunallata rikuchiy",
'listusers-creationsort' => 'Kamarisqap pachankama allichay',
'usereditcount' => "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
-'usercreated' => "Kamarisqa $1 p'unchawpi $2 pachapi",
+'usercreated' => "{{GENDER:$3|}}Kamarisqa $1 p'unchawpi $2 pachapi",
'newpages' => "Musuq p'anqakuna",
'newpages-username' => 'Ruraqpa sutin:',
'ancientpages' => "Ñawpaqta qallarisqa p'anqakuna",
@@ -2030,12 +2081,8 @@ Q\'imichisqa tantari qillqa: <tt>$1</tt> (maskaspaykiqa kaykunamanta ama mayqint
'activeusers-noresult' => 'Ruraqkunataqa manam tarinichu.',
# Special:Log/newusers
-'newuserlogpage' => "Rakiquna kamariy hallch'a",
-'newuserlogpagetext' => "Kayqa ruraqkunap rakiqunankunata kamariymanta hallch'am.",
-'newuserlog-byemail' => 'e-chaskiwan kachasqa yaykuna rima',
-'newuserlog-create-entry' => 'Musuq ruraq',
-'newuserlog-create2-entry' => 'kamarin $1-paq musuq rakiqunata',
-'newuserlog-autocreate-entry' => 'Kikinmanta kamarisqa rakiquna',
+'newuserlogpage' => "Rakiquna kamariy hallch'a",
+'newuserlogpagetext' => "Kayqa ruraqkunap rakiqunankunata kamariymanta hallch'am.",
# Special:ListGroupRights
'listgrouprights' => 'Ruraq huñup hayñinkuna',
@@ -2064,7 +2111,7 @@ Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgro
'emailpagetext' => "Kay hunt'ana p'anqatam llamk'achiyta atinki e-chaskita kachanaykipaq.
Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamaytaqa paqarinqa kachasqayki e-chaskipi chaskiqpa kutichisunaykita atinanpaq.",
'usermailererror' => 'Chaski llikaqa pantasqatam kutichimurqan:',
-'defemailsubject' => "{{SITENAME}} p'anqamanta chaski",
+'defemailsubject' => '{{SITENAME}} p\'anqamanta chaski "$1" sutiyuq ruraqmanta',
'usermaildisabled' => "Ruraqpa e-chaskinqa hark'asqam",
'usermaildisabledtext' => 'Manam atinkichu kay wikipi huk ruraqkunaman e-chaskita kachayta.',
'noemailtitle' => 'Manam kanchu e-chaski imamayta',
@@ -2117,7 +2164,7 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
'watchmethod-list' => "watiqasqayki p'anqakunata ñaqha hukchasqakunapaq llanchispa",
'watchlistcontains' => "Watiqana sutisuyuykipiqa $1 {{PLURAL:$1|p'anqam|p'anqakunam}} kachkan.",
'iteminvalidname' => "'$1' nisqa qillqaqa sasachakunmi, sutinqa manam allinchu...",
-'wlnote' => "Kay qatiqpiqa {{PLURAL:$1|qhipaq hukchasqam|'''$1''' qhipaq hukchasqakunam}} qhipaq {{PLURAL:$2|urapim|'''$2''' urakunapim}}.",
+'wlnote' => "Kay qatiqpiqa {{PLURAL:$1|qhipaq hukchasqam|'''$1''' qhipaq hukchasqakunam}} qhipaq {{PLURAL:$2|urapim|'''$2''' urakunapim}}, musuqchasqa $3, $4.",
'wlshowlast' => "$1 ura, $2 p'unchaw $3-mantapacha hukchasqakunata rikuchiy",
'watchlist-options' => 'Watiqana sutisuyupaq allinkachinakuna',
@@ -2181,8 +2228,6 @@ Ama hina kaspa, takyachiy munayniykita, qatiqninkunata riqsiyniykita, [[{{MediaW
'actionfailed' => 'Manam atinchu',
'deletedtext' => '"$1" qullusqañam.
$2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
-'deletedarticle' => 'qullusqa "[[$1]]"',
-'suppressedarticle' => 'ñit\'ipasqa "[[$1]]"',
'dellogpage' => 'Qullusqakuna',
'dellogpagetext' => 'Kay qatiqpiqa lliwmanta aswan ñaqha qullusqakunatam rikunki. Rikuchisqa pachankunaqa sirwiqpa pachanpim.',
'deletionlog' => 'qullusqakuna',
@@ -2226,7 +2271,10 @@ Ama hina kaspa, llika wamp'unaykipi \"Ñawpaqman\" (\"Back\") ñit'ispa ñawpaq
'unprotectedarticle' => 'paskan amachasqa "[[$1]]" nisqata',
'movedarticleprotection' => 'amachana kamachisqakuna "[[$2]]" nisqamanta "[[$1]]" nisqaman astasqa',
'protect-title' => '"$1" sutiyuq p\'anqap amachasqa kachkayninta hukchay',
+'protect-title-notallowed' => '"$1" sutiyuq p\'anqap amachasqa kachkayninta qhaway',
'prot_1movedto2' => '«[[$1]]» «[[$2]]»-man astasqa',
+'protect-badnamespace-title' => "Mana amachanalla suti k'iti",
+'protect-badnamespace-text' => "Kay suti k'iti kaq p'anqakunaqa manam amachanallachu.",
'protect-legend' => 'Amachayta takyachiy',
'protectcomment' => 'Kayrayku:',
'protectexpiry' => 'Amachaypa puchukaynin',
@@ -2246,6 +2294,7 @@ Kay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
'protect-level-sysop' => 'Kamachiqkunallapaq',
'protect-summary-cascade' => "''phaqcha'' nisqapi",
'protect-expiring' => 'puchukanqa $1 (UTC)',
+'protect-expiring-local' => '$1 pachapi puchukanqa',
'protect-expiry-indefinite' => 'mana sapaqchasqa',
'protect-cascade' => "Phaqchalla amachay - kay p'anqapi ch'aqtasqa p'anqakunatapaq amachay.",
'protect-cantedit' => "Manam atinkichu kay p'anqap amachasqa kachkayninta hukchayta, mana saqillasqa kaspaykim.",
@@ -2300,7 +2349,6 @@ Huklla llamk'apusqakunata paqarichinaykipaqqa, munasqayki llamk'apusqakunata akl
'undeletereset' => 'Mana imapas',
'undeleteinvert' => "Akllasqantinta t'ikrachiy",
'undeletecomment' => 'Kayrayku:',
-'undeletedarticle' => 'qullurqasqa "$1" paqarisqa',
'undeletedrevisions' => "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}",
'undeletedrevisions-files' => "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam",
'undeletedfiles' => '{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam',
@@ -2309,6 +2357,7 @@ Huklla llamk'apusqakunata paqarichinaykipaqqa, munasqayki llamk'apusqakunata akl
[[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.",
'undelete-header' => "[[Special:Log/delete|Qulluy hallch'apiqa]] qullusqa p'anqakunap sutinkunatam rikunki.",
+'undelete-search-title' => "Qullusqa p'anqakunata maskay",
'undelete-search-box' => "Qullusqa p'anqakunata maskay",
'undelete-search-prefix' => "Rikuchiy kaywan qallariq p'anqakunata:",
'undelete-search-submit' => 'Maskay',
@@ -2317,6 +2366,7 @@ Huklla llamk'apusqakunata paqarichinaykipaqqa, munasqayki llamk'apusqakunata akl
'undelete-bad-store-key' => "Manam atinichu $1 pachamanta willañiqi llamk'apusqata qulluyta: qullunayaptiy willañiqiqa manañam karqanchu.",
'undelete-cleanup-error' => 'Pantasqam tukurqan "$1" sutiyuq mana llamk\'achisqa hallch\'a willañiqita qulluypi.',
'undelete-missing-filearchive' => "Manam atinichu ID $1 nisqa willañiqi hallch'ata paqarichiyta, willañiqintinpi mana kaptinmi. Qullusqamanta paqarichisqañachá.",
+'undelete-error' => "Qullusqa p'anqa paqarichisqa kaptin pantasqam tukurqan",
'undelete-error-short' => 'Willañiqita paqarichiypi kay pantasqam tukurqan: $1',
'undelete-error-long' => 'Pantasqakunam tukurqan kay willañiqita qulluypi:
@@ -2436,6 +2486,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
'blocklist-userblocks' => "Rakiquna hark'asqakunata pakay",
'blocklist-tempblocks' => "Mit'alla hark'asqakunata pakay",
'blocklist-addressblocks' => "Sapaq IP-paq hark'asqakunata pakay",
+'blocklist-rangeblocks' => "Tawqa hark'ayta pakay",
'blocklist-timestamp' => "Pacha q'illpay",
'blocklist-target' => 'Taripana',
'blocklist-expiry' => "Hark'aypa puchukaynin",
@@ -2458,6 +2509,7 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
'unblocklink' => "hark'asqata qispichiy",
'change-blocklink' => "hark'ayta hukniraqchay",
'contribslink' => "llamk'apusqakuna",
+'emaillink' => 'e-chaskita kachay',
'autoblocker' => 'Kikinmanta hark\'asqam kanki, "[[User:$1|$1]]" sutiyuq ruraq IP huchhaykita ñaqha llamk\'arquptinmi. Hark\'aqqa "[[User:$1|$1]]"-ta hark\'aspa kaytam nirqan, kayrayku: "$2".',
'blocklogpage' => "Ruraq hark'asqakuna",
'blocklog-showlog' => "Kay ruraqqa ñawpaqta hark'asqam. Hark'ay hallch'ataqa kaypim rikunki willasunaykipaq:",
@@ -2572,9 +2624,6 @@ Hinaptinqa, kay rimachina p'anqap samiqninta makiykiwan astanaykim tiyanqa.",
'movepage-page-moved' => "$1 sutiyuq p'anqaqa $2 sutiman astasqañam.",
'movepage-page-unmoved' => "Manam atinichu $1 sutiyuq p'anqata $2 sutiman astayta.",
'movepage-max-pages' => "$1 {{PLURAL:$1|p'anqa|p'anqakuna}} astasqañam, kikinmanta manam aswan astasqa kanqachu.",
-'1movedto2' => '«[[$1]]» «[[$2]]»-man astasqa',
-'1movedto2_redir' => '[[$1]] [[$2]]-man astasqa pusana qillqata huknachaspa',
-'move-redirect-suppressed' => "pusapunaqa hark'asqam",
'movelogpage' => "Astay hallch'asqa",
'movelogpagetext' => "Kay qatiqpiqa astasqa p'anqakunam.",
'movesubpage' => "{{PLURAL:$1|Urin p'anqa|Urin p'anqakuna}}",
@@ -2587,7 +2636,7 @@ Hinaptinqa, kay rimachina p'anqap samiqninta makiykiwan astanaykim tiyanqa.",
Tukuna p\'anqaqa ("[[:$1]]") kachkañam. Astanapaq qulluyta munankichu?',
'delete_and_move_confirm' => "Arí, kay p'anqata qulluy",
-'delete_and_move_reason' => 'Astanapaq qullusqa',
+'delete_and_move_reason' => '"[[$1]]" nisqamanta astanapaq qullusqa',
'selfmove' => "Qallarinawan taripana sutikunaqa kaqllam kachkan. Manam atinchu p'anqata kikinman astay.",
'immobile-source-namespace' => "Manam atinichu «$1» suti k'itipi p'anqakunata astayta",
'immobile-target-namespace' => "Manam atinichu p'anqakunata «$1» suti k'itiman astayta",
@@ -2616,9 +2665,11 @@ Ama hina kaspa, huk sutita akllay.',
P'anqakunata hawaman qunaykipaqqa, sutinkunata kay qatiqppi qillqana k'itichaman qillqay, sapa siq'ipi huk suti, akllaspa kunan p'anqata wiñay kawsaynintapas munankichu ichataq kunan p'anqatallachu qhipaq hukchasqallamanta willayllawan.
Qhipaqta munaspaykiqa, t'inkitapas llamk'achiyta atinki, ahinataq [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]], \"[[{{MediaWiki:Mainpage}}]]\" p'anqapaq.",
+'exportall' => "Tukuy p'anqakunata hawaman quy",
'exportcuronly' => "Kunan llamk'apusqatam ch'aqtay, manataqmi wiñay kawsaynintinchu.",
'exportnohistory' => "----
'''Musyay:''' Wiñay kawsaynintinta kay hunt'ana p'anqawan hawan quymanqa ama nisqam, sirwiq mana atiptinmi.",
+'exportlistauthors' => "Llapa p'anqapaq llamk'apuqkunayuq hunt'a sutisuyuta ch'aqtay",
'export-submit' => 'Hawaman quy',
'export-addcattext' => "P'anqakunata yapay kay katiguriyamanta:",
'export-addcat' => 'Yapay',
@@ -2651,6 +2702,8 @@ Ama hina kaspa, [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n
'thumbnail_error' => 'Manam atinichu rikchachata kamayta: $1',
'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.",
+'thumbnail-dest-create' => "Manam atinichu rikch'achata taripanaman waqaychayta.",
'thumbnail_invalid_params' => 'Rikchachap kuskanachina tupunkunaqa manam allinchu',
'thumbnail_dest_directory' => 'Manam atinichu taripana willañiqi churanata kamayta',
'thumbnail_image-type' => "Rikch'a layaqa manam llamk'achikusqachu",
@@ -2694,6 +2747,11 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'import-upload' => 'XML willakunata churkuy',
'import-token-mismatch' => 'Tiyay ruraymanta willakunaqa chinkasqam. Ama hina kaspa, musuqmanta ruraykachay.',
'import-invalid-interwiki' => 'Manam atinichu nisqa wikimanta chaskiyta.',
+'import-error-edit' => '"$1" sutiyuq p\'anqaqa manam hawamanta chaskisqachu, llamk\'apuyta mana saqillasqa kaptiykim.',
+'import-error-create' => '"$1" sutiyuq p\'anqaqa manam hawamanta chaskisqachu, kamariyta mana saqillasqa kaptiykim.',
+'import-error-interwiki' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, sutin wikipura (interwiki) nisqapaq hallch\'asqa kaptinmi.',
+'import-error-special' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, mana p\'anqapaq kaq sapaq suti k\'itiman kapuspanmi.',
+'import-error-invalid' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, sutin mana allin kaptinmi.',
# Import log
'importlogpage' => "Hawamanta chaskiy hallch'a",
@@ -2703,72 +2761,85 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'import-logentry-interwiki' => 'huk wikimanta chaskisqa $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}} $2-manta',
+# JavaScriptTest
+'javascripttest' => 'JavaScript llanchiy',
+'javascripttest-disabled' => 'Kay ruranamanqa ama nisqam.',
+'javascripttest-title' => '$1 llanchiykunam richkan',
+'javascripttest-pagetext-noframework' => "Kay p'anqaqa JavaScript llanchina purichinallapaqmi kachun.",
+'javascripttest-pagetext-unknownframework' => 'Mana riqsisqa "$1" nisqa llanchina inchu ruray',
+'javascripttest-pagetext-frameworks' => 'Ama hina kaspa, kay qatiq llanchina inchu ruraykunamanta hukta akllay: $1',
+'javascripttest-pagetext-skins' => 'Qarata akllay llanchiykunata paywan purichinaykipaq:',
+'javascripttest-qunit-intro' => 'Qhaway [$1 llanchina yachachinapi], mediawiki.org nisqapi kaq.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit llanchina',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => "Qampa ruraqpa p'anqayki",
-'tooltip-pt-anonuserpage' => "IP huchhaykipaq ruraqpa p'anqan",
-'tooltip-pt-mytalk' => "Rimanakuy p'anqayki",
-'tooltip-pt-anontalk' => "Kay IP huchhamanta llamk'apusqakuna hawa rimanakuy",
-'tooltip-pt-preferences' => 'Allinkachinaykuna',
-'tooltip-pt-watchlist' => "Ruraqpa hukchasqakunakama watiqasqan p'anqakuna",
-'tooltip-pt-mycontris' => "Llamk'apusqaykikuna",
-'tooltip-pt-login' => 'Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas',
-'tooltip-pt-anonlogin' => 'Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas',
-'tooltip-pt-logout' => "Llamk'apuy tiyaymanta lluqsiy",
-'tooltip-ca-talk' => "Qillqasqap samiqninmanta rimanakuna p'anqa",
-'tooltip-ca-edit' => "Kay p'anqata llamk'apuytam atinki. Ama hina kaspa, manaraq waqaychaspa ñawpaqta qhawarillay.",
-'tooltip-ca-addsection' => 'Musuq rakita qallariy',
-'tooltip-ca-viewsource' => "Kay p'anqaqa amachasqam. Qallariy qillqataqa qhawallaytam atinki, mana hukchaspa.",
-'tooltip-ca-history' => "Kay p'anqapaq ñawpaq llamk'apusqakuna llamk'apuqkunapas",
-'tooltip-ca-protect' => "Kay p'anqata amachay",
-'tooltip-ca-unprotect' => "Kay p'anqap amachasqa kayninta wakinchay",
-'tooltip-ca-delete' => "Kay p'anqata qulluy",
-'tooltip-ca-undelete' => "Kay p'anqap qullusqa kasqankama llamk'apusqakunata paqarichiy",
-'tooltip-ca-move' => "Kay p'anqata astay musuq sutinta quspa",
-'tooltip-ca-watch' => "Kay p'anqata watiqay",
-'tooltip-ca-unwatch' => "Amaña watiqaychu kay p'anqata",
-'tooltip-search' => 'Kay wikipi maskay',
-'tooltip-search-go' => "Kay hinalla sutiyuq p'anqaman riy, kaptinqa",
-'tooltip-search-fulltext' => "Kay qillqasqayuq p'anqakunata maskay",
-'tooltip-p-logo' => "Qhapaq p'anqa",
-'tooltip-n-mainpage' => "Qhapaq p'anqata watukuy",
-'tooltip-n-mainpage-description' => "Qhapaq p'anqaman riy",
-'tooltip-n-portal' => 'Ruraykamaymanta, imatachus rurayta atinki, maypichus imatapas tariy',
-'tooltip-n-currentevents' => 'Kunan pacha tukusqakunamanta ukhunpuray willaykuna',
-'tooltip-n-recentchanges' => 'Kay wikipi ñaqha hukchasqakuna',
-'tooltip-n-randompage' => "Mayninpi kaq p'anqaman riy",
-'tooltip-n-help' => 'Yachaqanapaq tiyana',
-'tooltip-t-whatlinkshere' => "Kay p'anqaman tukuy t'inkimuqkuna",
-'tooltip-t-recentchangeslinked' => "Kay p'anqaman t'inkimuqkunapi ñaqha hukchasqakuna",
-'tooltip-feed-rss' => "Kay p'anqapaq RSS mikhuchiy",
-'tooltip-feed-atom' => "Kay p'anqapaq Atom mikhuchiy",
-'tooltip-t-contributions' => "Kay ruraqpa llamk'apusqankunata qhaway",
-'tooltip-t-emailuser' => 'Kay ruraqman chaskita kachay',
-'tooltip-t-upload' => 'Rikchakunata, multimidyata churkuy',
-'tooltip-t-specialpages' => "Tukuy sapaq p'anqakuna",
-'tooltip-t-print' => "Kay p'anqata ch'ipachinapaq",
-'tooltip-t-permalink' => "ch'ipachinapaq p'anqaman kakuq t'inki",
-'tooltip-ca-nstab-main' => 'Qillqata qhaway',
-'tooltip-ca-nstab-user' => "Ruraqpa p'anqanta qhaway",
-'tooltip-ca-nstab-media' => "Multimidyamanta p'anqata qhaway",
-'tooltip-ca-nstab-special' => "Kayqa sapaq p'anqam, manam hukchanallachu",
-'tooltip-ca-nstab-project' => "Ruraykamay p'anqata qhaway",
-'tooltip-ca-nstab-image' => "Rikchamanta p'anqata qhaway",
-'tooltip-ca-nstab-mediawiki' => 'Llikap willayninta qhaway',
-'tooltip-ca-nstab-template' => 'Plantillata qhaway',
-'tooltip-ca-nstab-help' => "Yanapana p'anqata qhaway",
-'tooltip-ca-nstab-category' => "Katiguriyamanta p'anqata qhaway",
-'tooltip-minoredit' => 'Kayta aslla hukchay nispa sananchay',
-'tooltip-save' => 'Hukchasqakunata waqaychay',
-'tooltip-preview' => 'Ñawpaqtaqa hukchasqaykikunata qhawarillay, manaraq waqaychaspa!',
-'tooltip-diff' => 'Qillqapi hukchasqaykikunata rikuchiy.',
-'tooltip-compareselectedversions' => "P'anqap iskay akllasqa hukchasqanpura hukchasqa kayta qhaway.",
-'tooltip-watch' => "Kay p'anqata watiqay",
-'tooltip-recreate' => "Kay p'anqata musuqmanta kamariy, qullusqa kaptinpas",
-'tooltip-upload' => 'Churkuyta qallariy',
-'tooltip-rollback' => "\"Kutichina\" nisqapi ñit'ispaykiqa huk ruraqpa tukuy qhipaq llamk'apusqankunatam huklla ñit'iyniykiwan kutichinki.",
-'tooltip-undo' => "\"Kutichiy\" nisqapi ñit'ispaykiqa kay llamk'apusqatam kutichinki, p'anqata ñawpaqta qhawaspa llamk'anapaq kichaspa. Pisichaypi imarayku niyta atinki.",
-'tooltip-preferences-save' => 'Akllasqakunata waqaychay',
-'tooltip-summary' => 'Pisichaychata yaykuchiy',
+'tooltip-pt-userpage' => "Qampa ruraqpa p'anqayki",
+'tooltip-pt-anonuserpage' => "IP huchhaykipaq ruraqpa p'anqan",
+'tooltip-pt-mytalk' => "Rimanakuy p'anqayki",
+'tooltip-pt-anontalk' => "Kay IP huchhamanta llamk'apusqakuna hawa rimanakuy",
+'tooltip-pt-preferences' => 'Allinkachinaykuna',
+'tooltip-pt-watchlist' => "Ruraqpa hukchasqakunakama watiqasqan p'anqakuna",
+'tooltip-pt-mycontris' => "Llamk'apusqaykikuna",
+'tooltip-pt-login' => 'Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas',
+'tooltip-pt-anonlogin' => 'Kallpachaykiku yaykunaykiqa allinmi nispa, mana manu kanayki kaptinpas',
+'tooltip-pt-logout' => "Llamk'apuy tiyaymanta lluqsiy",
+'tooltip-ca-talk' => "Qillqasqap samiqninmanta rimanakuna p'anqa",
+'tooltip-ca-edit' => "Kay p'anqata llamk'apuytam atinki. Ama hina kaspa, manaraq waqaychaspa ñawpaqta qhawarillay.",
+'tooltip-ca-addsection' => 'Musuq rakita qallariy',
+'tooltip-ca-viewsource' => "Kay p'anqaqa amachasqam. Qallariy qillqataqa qhawallaytam atinki, mana hukchaspa.",
+'tooltip-ca-history' => "Kay p'anqapaq ñawpaq llamk'apusqakuna llamk'apuqkunapas",
+'tooltip-ca-protect' => "Kay p'anqata amachay",
+'tooltip-ca-unprotect' => "Kay p'anqap amachasqa kayninta wakinchay",
+'tooltip-ca-delete' => "Kay p'anqata qulluy",
+'tooltip-ca-undelete' => "Kay p'anqap qullusqa kasqankama llamk'apusqakunata paqarichiy",
+'tooltip-ca-move' => "Kay p'anqata astay musuq sutinta quspa",
+'tooltip-ca-watch' => "Kay p'anqata watiqay",
+'tooltip-ca-unwatch' => "Amaña watiqaychu kay p'anqata",
+'tooltip-search' => 'Kay wikipi maskay',
+'tooltip-search-go' => "Kay hinalla sutiyuq p'anqaman riy, kaptinqa",
+'tooltip-search-fulltext' => "Kay qillqasqayuq p'anqakunata maskay",
+'tooltip-p-logo' => "Qhapaq p'anqa",
+'tooltip-n-mainpage' => "Qhapaq p'anqata watukuy",
+'tooltip-n-mainpage-description' => "Qhapaq p'anqaman riy",
+'tooltip-n-portal' => 'Ruraykamaymanta, imatachus rurayta atinki, maypichus imatapas tariy',
+'tooltip-n-currentevents' => 'Kunan pacha tukusqakunamanta ukhunpuray willaykuna',
+'tooltip-n-recentchanges' => 'Kay wikipi ñaqha hukchasqakuna',
+'tooltip-n-randompage' => "Mayninpi kaq p'anqaman riy",
+'tooltip-n-help' => 'Yachaqanapaq tiyana',
+'tooltip-t-whatlinkshere' => "Kay p'anqaman tukuy t'inkimuqkuna",
+'tooltip-t-recentchangeslinked' => "Kay p'anqaman t'inkimuqkunapi ñaqha hukchasqakuna",
+'tooltip-feed-rss' => "Kay p'anqapaq RSS mikhuchiy",
+'tooltip-feed-atom' => "Kay p'anqapaq Atom mikhuchiy",
+'tooltip-t-contributions' => "Kay ruraqpa llamk'apusqankunata qhaway",
+'tooltip-t-emailuser' => 'Kay ruraqman chaskita kachay',
+'tooltip-t-upload' => 'Rikchakunata, multimidyata churkuy',
+'tooltip-t-specialpages' => "Tukuy sapaq p'anqakuna",
+'tooltip-t-print' => "Kay p'anqata ch'ipachinapaq",
+'tooltip-t-permalink' => "ch'ipachinapaq p'anqaman kakuq t'inki",
+'tooltip-ca-nstab-main' => 'Qillqata qhaway',
+'tooltip-ca-nstab-user' => "Ruraqpa p'anqanta qhaway",
+'tooltip-ca-nstab-media' => "Multimidyamanta p'anqata qhaway",
+'tooltip-ca-nstab-special' => "Kayqa sapaq p'anqam, manam hukchanallachu",
+'tooltip-ca-nstab-project' => "Ruraykamay p'anqata qhaway",
+'tooltip-ca-nstab-image' => "Rikchamanta p'anqata qhaway",
+'tooltip-ca-nstab-mediawiki' => 'Llikap willayninta qhaway',
+'tooltip-ca-nstab-template' => 'Plantillata qhaway',
+'tooltip-ca-nstab-help' => "Yanapana p'anqata qhaway",
+'tooltip-ca-nstab-category' => "Katiguriyamanta p'anqata qhaway",
+'tooltip-minoredit' => 'Kayta aslla hukchay nispa sananchay',
+'tooltip-save' => 'Hukchasqakunata waqaychay',
+'tooltip-preview' => 'Ñawpaqtaqa hukchasqaykikunata qhawarillay, manaraq waqaychaspa!',
+'tooltip-diff' => 'Qillqapi hukchasqaykikunata rikuchiy.',
+'tooltip-compareselectedversions' => "P'anqap iskay akllasqa hukchasqanpura hukchasqa kayta qhaway.",
+'tooltip-watch' => "Kay p'anqata watiqay",
+'tooltip-watchlistedit-normal-submit' => "P'anqa sutikunata qichuy",
+'tooltip-watchlistedit-raw-submit' => 'Watiqana sutisuyuta musuqchay',
+'tooltip-recreate' => "Kay p'anqata musuqmanta kamariy, qullusqa kaptinpas",
+'tooltip-upload' => 'Churkuyta qallariy',
+'tooltip-rollback' => "\"Kutichina\" nisqapi ñit'ispaykiqa huk ruraqpa tukuy qhipaq llamk'apusqankunatam huklla ñit'iyniykiwan kutichinki.",
+'tooltip-undo' => "\"Kutichiy\" nisqapi ñit'ispaykiqa kay llamk'apusqatam kutichinki, p'anqata ñawpaqta qhawaspa llamk'anapaq kichaspa. Pisichaypi imarayku niyta atinki.",
+'tooltip-preferences-save' => 'Akllasqakunata waqaychay',
+'tooltip-summary' => 'Pisichaychata yaykuchiy',
# Stylesheets
'common.css' => "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
@@ -2844,9 +2915,6 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
# Patrol log
'patrol-log-page' => "Qhawakipay hallch'a",
'patrol-log-header' => "Kayqa patrullasqa musuqchasqakunamanta hallch'asqam.",
-'patrol-log-line' => '$1 sananchasqa $2-manta qhawakipasqa $3',
-'patrol-log-auto' => '(kikinmanta)',
-'patrol-log-diff' => 'musuqchasqa $1',
'log-show-hide-patrol' => "$1 patrullay hallch'a",
# Image deletion
@@ -2873,11 +2941,11 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
'file-info' => 'willañiqip chhikan kaynin: $1; MIME laya: $2',
'file-info-size' => '$1 × $2 iñu; willañiqip chhikan kaynin: $3; MIME laya: $4',
'file-info-size-pages' => "$1 × $2 iñu, willañiqip chhikan kaynin: $3; MIME laya: $4, $5 {{PLURAL:$5|p'anqa|p'anqa}}",
-'file-nohires' => '<small>Manam kanchu aswan huyakuyuq rikcha.</small>',
+'file-nohires' => 'Manam kanchu aswan huyakuyuq rikcha.',
'svg-long-desc' => 'SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
'show-big-image' => 'Qallariy huyaku',
-'show-big-image-preview' => '<small>Kay ñawpaq qhawariypa chhikan kaynin: $1.</small>',
-'show-big-image-other' => '<small>Huk huyakukuna: $1.</small>',
+'show-big-image-preview' => 'Kay ñawpaq qhawariypa chhikan kaynin: $1.',
+'show-big-image-other' => 'Huk {{PLURAL:$2|huyaku|huyakukuna}}: $1.',
'show-big-image-size' => '$1 × $2 iñu',
'file-info-gif-looped' => 'muyupayachisqa',
'file-info-gif-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
@@ -2897,6 +2965,13 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
'bydate' => "p'unchawkama",
'sp-newimages-showfrom' => 'Musuq rikchakunata rikuchiy, $2, $1-wan qallarispa',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|huk sikundu|$1 sikundu}}',
+'minutes' => '{{PLURAL:$1|huk minutu|$1 minutu}}',
+'hours' => '{{PLURAL:$1|huk ura|$1 ura}}',
+'days' => "{{PLURAL:$1|huk p'unchaw|$1 p'unchaw}}",
+'ago' => '$1 ñaqha',
+
# Bad image list
'bad_image_list' => "Chantaqa kay hinam:
@@ -3383,13 +3458,6 @@ Kay takyachina tuyruqa $4 pachapim puchukanqa.',
'scarytranscludefailed' => '[$1-paq plantillataqa manam chaskiyta atinchu]',
'scarytranscludetoolong' => '[URL tiyayqa nisyu hatunmi]',
-# Trackbacks
-'trackbackbox' => "Ñawpaqman qatipay (Trackback) nisqakuna kay p'anqapaq:<br />
-$1",
-'trackbackremove' => '([$1 Qulluy])',
-'trackbacklink' => 'Ñawpaqman qatipay (Trackback)',
-'trackbackdeleteok' => 'Ñawpaqman qatipay (Trackback) nisqaqa qullusqañam.',
-
# Delete conflict
'deletedwhileediting' => "'''Paqtataq''': Kay p'anqataqa qullurqankum qam llamk'apuyta qallarirqaptiyki.",
'confirmrecreate' => "Qam kay p'anqata llamk'apuyta qallarirqaptiyki, [[User:$1|$1]] sutiyuq ruraqmi ([[User talk:$1|rimanakuy]]) qullurqan, kayraykum nispa:
@@ -3467,6 +3535,9 @@ Sapsilla ñawpaq qhawariyta tukuykachay.',
'watchlisttools-edit' => "Watiqana sutisuyuta qhawaspa llamk'apuy",
'watchlisttools-raw' => "Chawa watiqana sutisuyuta llamk'apuy",
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|rimanakuy]])',
+
# Core parser functions
'unknown_extension_tag' => 'Mana riqsisqa "$1" mast\'arina k\'askana',
'duplicate-defaultsort' => 'Paqtataq: Kikinmanta allinchana llawi «$2» ñawpaq kikinmanta allinchana llawitam «$1» huknachan.',
@@ -3522,8 +3593,7 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
'specialpages' => "Sapaq p'anqakuna",
'specialpages-note' => '----
* Sapsipaq sapaq p\'anqakuna.
-* <span class="mw-specialpagerestricted">Sapaqkunallapaq sapaq p\'anqakuna.</span>
-* <span class="mw-specialpagecached">Pakasqa hallch\'alla sapaq p\'anqakuna.</span>',
+* <span class="mw-specialpagerestricted">Sapaqkunallapaq sapaq p\'anqakuna.</span>',
'specialpages-group-maintenance' => 'Hatalliy willaykuna',
'specialpages-group-other' => "Huk sapaq p'anqakuna",
'specialpages-group-login' => 'Yaykuy / rakiqunata kichariy',
@@ -3565,13 +3635,16 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
'tags-hitcount' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}}',
# Special:ComparePages
-'comparepages' => "P'anqakunata wakichay",
-'compare-selector' => 'Musuqchasqakunata wakichay',
-'compare-page1' => "P'anqa 1",
-'compare-page2' => "P'anqa 2",
-'compare-rev1' => 'Musuqchasqa 1',
-'compare-rev2' => 'Musuqchasqa 2',
-'compare-submit' => 'Wakichay',
+'comparepages' => "P'anqakunata wakichay",
+'compare-selector' => 'Musuqchasqakunata wakichay',
+'compare-page1' => "P'anqa 1",
+'compare-page2' => "P'anqa 2",
+'compare-rev1' => 'Musuqchasqa 1',
+'compare-rev2' => 'Musuqchasqa 2',
+'compare-submit' => 'Wakichay',
+'compare-invalid-title' => "Qusqayki p'anqap sutinqa manam allinchu.",
+'compare-title-not-exists' => "Qusqayki p'anqap sutinqa manam kanchu.",
+'compare-revision-not-exists' => "Qusqayki p'anqa musuqchasqaqa manam kanchu.",
# Database error messages
'dberr-header' => 'Kay wikiqa sasachakuyniyuqmi',
@@ -3598,4 +3671,90 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
'sqlite-has-fts' => "$1 hunt'a qillqa maskana yanapawan",
'sqlite-no-fts' => "$1 mana hunt'a qillqa maskana yanapawan",
+# New logging system
+'logentry-delete-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
+'logentry-delete-restore' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
+'logentry-delete-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-delete-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-suppress-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
+'logentry-suppress-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-suppress-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'revdelete-content-hid' => 'samiq pakasqa',
+'revdelete-summary-hid' => "llamk'apuypa pisichaynin pakasqa",
+'revdelete-uname-hid' => 'ruraqpa sutin pakasqa',
+'revdelete-content-unhid' => 'samiq rikuchisqa',
+'revdelete-summary-unhid' => "llamk'apuypa pisichaynin rikuchisqa",
+'revdelete-uname-unhid' => 'ruraqpa sutin rikuchisqa',
+'revdelete-restricted' => "kamachiqkunaman llamk'achisqa saywachanakuna",
+'revdelete-unrestricted' => 'kamachiqkunamanta qichusqa saywachanakuna',
+'logentry-move-move' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
+'logentry-move-move-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
+'logentry-move-move_redir' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
+'logentry-move-move_redir-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
+'logentry-patrol-patrol' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
+'logentry-patrol-patrol-auto' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
+'logentry-newusers-newusers' => '$1 sutiyuq ruraqqa rakiqunatam kamarin',
+'logentry-newusers-create' => '$1 sutiyuq ruraqqa rakiqunatam kamarin',
+'logentry-newusers-create2' => '$1 sutiyuq ruraqqa rakiqunatam kamarin $3',
+'logentry-newusers-autocreate' => '$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
+'newuserlog-byemail' => 'e-chaskiwan kachasqa yaykuna rima',
+
+# Feedback
+'feedback-bugornote' => "Allwiyapi sasachakuymanta imaymanachanta willayta munaspaykiqa, [\$1 pantasqamanta willay].
+Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyniykiqa \"[\$3 \$2]\" sutiyuq p'anqamanmi yapasqa kanqa, hinallataqmi ruraqpa sutiykipas qampa llamk'achisqayki llika wamp'unapas.",
+'feedback-subject' => 'Yuyancha:',
+'feedback-message' => 'Willay:',
+'feedback-cancel' => 'Ama niy',
+'feedback-submit' => 'Willapuyniykita kachay',
+'feedback-adding' => "Willapuyniykita kay p'anqaman yapay: ...",
+'feedback-error1' => 'Pantasqa: API nisqamanta taripasqaqa manam riqsirisqachu',
+'feedback-error2' => "Pantasqa: Manam llamk'apuyta atinchu",
+'feedback-error3' => 'Pantasqa: API nisqaqa manam kutipanchu',
+'feedback-thanks' => 'Añaychayki! Willapuyniykiqa "[$2 $1]" sutiyuq p\'anqaman yapasqañam.',
+'feedback-close' => 'Rurasqañam',
+'feedback-bugcheck' => 'Allillanmi! Llanchirillay [$1 riqsisqapura huk pantasqañachu] mana kanmanchu.',
+'feedback-bugnew' => 'Llanchisqañam. Musuq pantasqamanta willay',
+
+# API errors
+'api-error-badaccess-groups' => 'Kay wikipiqa willañiqikunata manam churkuyta atinkichu.',
+'api-error-badtoken' => 'Ukhupi pantasqa: Mana allinta sananchasqa.',
+'api-error-copyuploaddisabled' => 'URL nisqawanqa kay sirwiqpi manam churkuyta atinki.',
+'api-error-duplicate' => 'Kay tiyaypiqa huk {{PLURAL:$1|[$2 willañiqim]|[$2 willañiqikunam]}} kachkanñam kaqlla samiqniyuq kaq.',
+'api-error-duplicate-archive' => 'Kay tiyaypiqa huk {{PLURAL:$1|[$2 willañiqim]|[$2 willañiqikunam]}} karqanñam kaqlla samiqniyuq kaq, kunantaq qullusqañam.',
+'api-error-duplicate-archive-popup-title' => 'Qullusqaña iskaychasqa {{PLURAL:$1|willañiqi|willañiqikuna}}.',
+'api-error-duplicate-popup-title' => 'Iskaychasqa {{PLURAL:$1|willañiqi|willañiqikuna}}.',
+'api-error-empty-file' => "Kachasqayki willañiqiqa ch'usaqmi.",
+'api-error-emptypage' => "Musuq ch'usaq p'anqakunata kamariyqa manam saqillasqachu.",
+'api-error-fetchfileerror' => 'Ukhupi pantasqa: Willañiqita chaskiykachachkaptiyki ima mana allin kaqpas tukurqan.',
+'api-error-file-too-large' => 'Kachasqayki willañiqiqa nisyu hatunmi.',
+'api-error-filename-tooshort' => 'Kay willañiqi sutiqa nisyu pisillam.',
+'api-error-filetype-banned' => 'Kay willañiqi layaqa manam saqillasqachu.',
+'api-error-filetype-missing' => "Kay willañiqi sutiqa manam k'askaqniyuqchu.",
+'api-error-hookaborted' => "Wakinchaykachasqaykitaqa mast'ari ch'iwinam puchukachirqan.",
+'api-error-http' => "Ukhupi pantasqa: Manam sirwiqwan t'inkinakuyta atinichu.",
+'api-error-illegal-filename' => 'Kay willañiqi sutiqa manam saqillasqachu.',
+'api-error-internal-error' => 'Ukhupi pantasqa: Wikipi churkuchkaptiyki ima mana allin kaqpas tukurqan.',
+'api-error-invalid-file-key' => "Ukhupi pantasqa: Mit'alla hallch'api willañiqiqa manam tarisqachu.",
+'api-error-missingparam' => 'Ukhupi pantasqa: Mañakuypi manam kuskanachina tupukuna kanchu.',
+'api-error-missingresult' => 'Ukhupi pantasqa: Manam yuqanchasqachu iskaychay aypasqachu.',
+'api-error-mustbeloggedin' => 'Yaykunaykim tiyan willañiqikunata churkunaykipaq.',
+'api-error-mustbeposted' => 'Ukhupi pantasqa: Mañakuypaq HTTP POST kanam tiyan.',
+'api-error-noimageinfo' => 'Willañiqiqa churkusqañam, chaywanpas sirwiq manam willawanchu ima willañiqimantapas.',
+'api-error-nomodule' => 'Ukhupi pantasqa: Manam kanchu churasqa churkuna wakina tupu.',
+'api-error-ok-but-empty' => 'Ukhupi pantasqa: Sirwiqqa manam kutipanchu.',
+'api-error-overwrite' => 'Kachkaqña willañiqita huknachayqa manam saqillasqachu.',
+'api-error-stashfailed' => "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam hallch'ayta atinchu.",
+'api-error-timeout' => "Suyakusqa mit'apiqa sirwiq manam kutiparqanchu.",
+'api-error-unclassified' => 'Mana riqsisqa pantasqam tukurqan.',
+'api-error-unknown-code' => 'Mana riqsisqa pantasqa: "$1".',
+'api-error-unknown-error' => 'Ukhupi pantasqa: Churkuykachachkaptiyki ima mana allin kaqpas tukurqan.',
+'api-error-unknown-warning' => 'Mana riqsisqa yuyampay: "$1".',
+'api-error-unknownerror' => 'Mana riqsisqa pantasqa: "$1".',
+'api-error-uploaddisabled' => 'Kay wikipiqa manam churkuyta atinkichu.',
+'api-error-verification-error' => "Kay willañiqiqa waqllisqachá, icha pantasqa k'askaqniyuqchá.",
+
);
diff --git a/languages/messages/MessagesQug.php b/languages/messages/MessagesQug.php
index 678783a5..86be2053 100644
--- a/languages/messages/MessagesQug.php
+++ b/languages/messages/MessagesQug.php
@@ -12,7 +12,26 @@
* @author Sylvain2803
*/
-$fallback = 'qu';
+$fallback = 'qu, es';
+
+$namespaceNames = array(
+ NS_MEDIA => 'Midya',
+ NS_SPECIAL => 'Sapak',
+ NS_TALK => 'Rimanakuy',
+ NS_USER => 'Rurak',
+ NS_USER_TALK => 'Rurakpa_rimanakuy',
+ NS_PROJECT_TALK => '$1-pa_rimanakuy',
+ NS_FILE => 'Rikcha',
+ NS_FILE_TALK => 'Rikchapa_rimanakuy',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWikipa_rimanakuy',
+ NS_TEMPLATE => 'Plantilla',
+ NS_TEMPLATE_TALK => 'Plantillapa_rimanakuy',
+ NS_HELP => 'Yanapa',
+ NS_HELP_TALK => 'Yanapapak_rimanakuy',
+ NS_CATEGORY => 'Samiyachiy',
+ NS_CATEGORY_TALK => 'Samiyachiy_rimanakuy',
+);
$messages = array(
# User preference toggles
@@ -326,7 +345,6 @@ Shina kakpika, shuk rurakka ña pankata pichankacha.',
'badtitle' => 'Pankapa shutika mana allichu',
'badtitletext' => 'Kay pankapa shutika mana allichu, icha illakmi kan. Icha mana alli llikata charin.',
'viewsource' => 'Pukyu killkata rikuna',
-'viewsourcefor' => '$1-pak',
'actionthrottled' => 'Rurayta harkashka',
'actionthrottledtext' => 'Spam rurashpa nalli runakunaka ama yapata chaskikuna kachankapak, mana chayta kutin ñapash rurana ushapankichu. Ama shinachu kapay, ashata shuyashpa (wakin minutoskuna) kutin rurapay.',
'protectedpagetext' => 'Kay pankata ama shukchinkapak harkashkami kan.',
@@ -432,13 +450,9 @@ Kay (kaykunachu) kachashkakunaka cunkashkami kashka.",
# Revision deletion
'rev-delundel' => 'Rikuchiy/pakay',
-'revdelete-logentry' => 'Pita [[$1]] ñawpa killkaykunata rikunata ushanchu kutin kamachirka.',
'revdel-restore' => 'Rikuyukkunata shukchina',
'revdel-restore-deleted' => 'pichashka shukchiykuna',
'revdel-restore-visible' => 'Mana pakashka shukchiykuna',
-'revdelete-content' => 'Tiyakkuna',
-'revdelete-hid' => '$1-ta pakarka',
-'revdelete-log-message' => '$1, $2 {{PLURAL:$2|mushuk killkay|mushuk killkaykuna}}pak',
# Merge log
'revertmerge' => 'Shukllachiyta kutichina',
@@ -597,7 +611,7 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
'nmembers' => '$1 {{PLURAL:$1|panka|pankakuna}}',
'prefixindex' => 'Tukuy kallarikshutiyuk pankakunaka',
-'usercreated' => '$1 punchapi $2 pachapi kamashka',
+'usercreated' => '{{GENDER:$3|}}$1 punchapi $2 pachapi kamashka',
'newpages' => 'Mushuk pankakuna',
'move' => 'Apakuy',
'movethispage' => 'Kay pankaman shuk mushuk shutita karana',
@@ -629,8 +643,7 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
'linksearch-line' => '$1 pankaka $2-manta tinkishkami kan',
# Special:Log/newusers
-'newuserlogpage' => 'Rurakkununata kamaykunapa kamu',
-'newuserlog-create-entry' => 'Mushuk rurak',
+'newuserlogpage' => 'Rurakkununata kamaykunapa kamu',
# Special:ListGroupRights
'listgrouprights-members' => '(Kay tantanakuypa rurakkunapa shutikuna)',
@@ -659,7 +672,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
'actionfailed' => 'Mana ushanchu',
'deletedtext' => '"$1" ñami pichashkami kan.
$2 rikpika, ima pankakunaka pichashkami kan yachakupanki.',
-'deletedarticle' => '"[[$1]]" pankata picharka',
'dellogpage' => 'Pichaykunapa kamu',
'deletecomment' => 'Imashpa:',
'deleteotherreason' => 'Yapa imashpa:',
@@ -685,7 +697,6 @@ $2 rikpika, ima pankakunaka pichashkami kan yachakupanki.',
# Undelete
'undeletelink' => 'Rikuna/pakarina',
'undeleteviewlink' => 'rikuna',
-'undeletedarticle' => '«[[$1]]» kutin kamarka',
# Namespace form on various pages
'namespace' => 'Shutipak kiti',
@@ -743,22 +754,20 @@ $2 rikpika, ima pankakunaka pichashkami kan yachakupanki.',
'block-log-flags-nocreate' => 'Mushuk rurak shutipa kamayta wichkashkami',
# Move page
-'movearticle' => 'Kay pankama mushuk shutita karapana:',
-'newtitle' => 'Kay mushuk shutiman',
-'move-watch' => 'Kay ishkay pankakunata rikukuna',
-'movepagebtn' => 'Kay pankaman mushuk shutita karapana:',
-'pagemovedsub' => 'Shutita ñami shukchishka',
-'movepage-moved' => '\'\'\'"$1" pankaka "$2"shutiman apakushka\'\'\'',
-'articleexists' => 'Shuk pankaka ñami kay shutita charin, icha kay shutiyuk man alli kan.
+'movearticle' => 'Kay pankama mushuk shutita karapana:',
+'newtitle' => 'Kay mushuk shutiman',
+'move-watch' => 'Kay ishkay pankakunata rikukuna',
+'movepagebtn' => 'Kay pankaman mushuk shutita karapana:',
+'pagemovedsub' => 'Shutita ñami shukchishka',
+'movepage-moved' => '\'\'\'"$1" pankaka "$2"shutiman apakushka\'\'\'',
+'articleexists' => 'Shuk pankaka ñami kay shutita charin, icha kay shutiyuk man alli kan.
Shuk shutita akllapay.',
-'talkexists' => 'Kay pankapa shutita ñami shukchishkami kan, shinapash paypa rimanakuyta shuk rimanakuyka ñami tiyakpika mana apamushkami kan : makillawan kay ishkay rimanakuykunata tantachipay.',
-'movedto' => 'Kayman apakushka :',
-'movetalk' => 'Tinkishka rimanakuyta shinalla apakuna',
-'1movedto2' => '«[[$1]]» «[[$2]]»-man apakushka',
-'1movedto2_redir' => '[[$1]] [[$2]]-man shuk pushayta pichashpami apakushka',
-'movelogpage' => 'Shutikunata shukchiykunapa kamu',
-'movereason' => 'Imashpa:',
-'revertmove' => 'Kutichina',
+'talkexists' => 'Kay pankapa shutita ñami shukchishkami kan, shinapash paypa rimanakuyta shuk rimanakuyka ñami tiyakpika mana apamushkami kan : makillawan kay ishkay rimanakuykunata tantachipay.',
+'movedto' => 'Kayman apakushka :',
+'movetalk' => 'Tinkishka rimanakuyta shinalla apakuna',
+'movelogpage' => 'Shutikunata shukchiykunapa kamu',
+'movereason' => 'Imashpa:',
+'revertmove' => 'Kutichina',
# Export
'export' => 'Pankakunata apakuna',
@@ -827,17 +836,13 @@ Shuk shutita akllapay.',
'tooltip-undo' => '"Kutichina" nikpika, kay hapishka killkayta kutichipanki, shinalla killkana pankapa "ñawpak rikuchiy" rikupanki : chaymanta, imashpa kay killkayta kutichipankichu rimanata ushapanki',
'tooltip-summary' => 'Uchilla willayta killkana',
-# Patrol log
-'patrol-log-line' => '$1 $2 pankamanta alli kachirka $3',
-'patrol-log-diff' => '$1 mushuk killkata',
-
# Browsing diffs
'previousdiff' => 'Yallik ñawpakmi killkay',
'nextdiff' => 'Yalli mushukmi killkay',
# Media information
'file-info-size' => '$1 × $2 tawakukuna (pixelkuna); $3 llashakmi kan; MIME sami: $4',
-'file-nohires' => '<small>Kay rikchapa shuk yallik hatun rikuchiyka mana tiyanchu.</small>',
+'file-nohires' => 'Kay rikchapa shuk yallik hatun rikuchiyka mana tiyanchu.',
'svg-long-desc' => 'SVG archiwuka, $1 × $2 tawakukunayuk rimashka, $3 llashakmi.',
'show-big-image' => 'Yallik hatun rikuchipay',
diff --git a/languages/messages/MessagesRgn.php b/languages/messages/MessagesRgn.php
index d33979b3..affe4334 100644
--- a/languages/messages/MessagesRgn.php
+++ b/languages/messages/MessagesRgn.php
@@ -476,8 +476,7 @@ $1 {{PLURAL:$1|elemént|elemént}}',
'linksearch' => 'Ghènz int ê web',
# Special:Log/newusers
-'newuserlogpage' => "Regèstar d'j nov",
-'newuserlog-create-entry' => "L'è arivé un patàca nov",
+'newuserlogpage' => "Regèstar d'j nov",
# Special:ListGroupRights
'listgrouprights-members' => "(Lèsta d'j mèmbar)",
@@ -509,7 +508,6 @@ Par piasé, cunferma ch't'ê propri l'intenziòn d'fël, ch'at capèss al su con
'actioncomplete' => 'Lavor fät e finì',
'deletedtext' => 'La pàgina "$1" l\'è stëda scanzlèda.
Guèrda $2 par avdé la lèsta daglj ultum scanzeladür.',
-'deletedarticle' => 'l\'à scanzlé "[[$1]]"',
'dellogpage' => 'Regèstar dal scanzladùr',
'deletecomment' => 'Rasòn:',
'deleteotherreason' => 'Ètar mutiv:',
@@ -543,8 +541,7 @@ T'pù cambié ê livel d'pruteziòn d'sta pàgina, mo la pruteziòn ricursiva la
'restriction-level' => "Livel d'restriziòn:",
# Undelete
-'undeletelink' => 'Guèrda/Torna indrì',
-'undeletedarticle' => 'l\'à artruvè "[[$1]]"',
+'undeletelink' => 'Guèrda/Torna indrì',
# Namespace form on various pages
'namespace' => "Spàzi d'é nom:",
@@ -625,8 +622,6 @@ Par piaser, daij un ètar nom.",
Par piasé, met insem al du pàgin te, fasend copia e incola.",
'movedto' => 'Spusté vers:',
'movetalk' => "Sposta ènca la pàgina d'cunversaziòn",
-'1movedto2' => "[[$1]] l'è stê mòs a [[$2]]",
-'1movedto2_redir' => "[[$1]] l'è stè moss in [[$2]] par redireziòn",
'movelogpage' => "Regéstar d'j muvimént",
'movereason' => 'Rasòn:',
'revertmove' => 'Métla cum era prèma',
@@ -697,7 +692,7 @@ Par piasé, met insem al du pàgin te, fasend copia e incola.",
# Media information
'file-info-size' => "$1 × $2 pixel, amsùra d'e' file: $3, tipo MIME: $4",
-'file-nohires' => "<small>U n' è pusèbil d'avdé cun òna risoluziòn piò élta. </small>",
+'file-nohires' => "U n' è pusèbil d'avdé cun òna risoluziòn piò élta.",
'svg-long-desc' => "file d'taja SVG, dimensiòn numinèli $1 × $2 pixel, dimensiòn d'e' file: $3",
'show-big-image' => 'Versiòn ad amsura pina',
diff --git a/languages/messages/MessagesRif.php b/languages/messages/MessagesRif.php
index 9122044d..7e5069e7 100644
--- a/languages/messages/MessagesRif.php
+++ b/languages/messages/MessagesRif.php
@@ -158,7 +158,6 @@ $messages = array(
'badtitletext' => 'Isem n Tasna itexised war icni ca, ixwa, niɣ isem n ajar-tutlayt niɣ ajar-wiki war icni ca.
teqqad ad yilli days ca n usekkil war itwagg deg isem .',
'viewsource' => 'Ẓṛ aghbalu',
-'viewsourcefor' => 'i $1',
'viewsourcetext' => 'Tzemred a tẓerd u atsneɣled aɣbal n Tasna ya :',
# Login and logout pages
@@ -524,7 +523,6 @@ Ma nican txsd a tggd manaya? Ma tssnd min ttggd? Ma ttggd manaya amc teqqaá¹› [
'actioncomplete' => 'Tiggawt tsala',
'deletedtext' => '"$1" Twakkes.
Xemm $2 i tikkas timaynutin.',
-'deletedarticle' => 'twakkes "[[$1]]"',
'dellogpage' => 'AÉ£mis n uá¹£faá¸',
'deletecomment' => 'Ssebba:',
'deleteotherreason' => 'Ca n ssebba nniá¸n:',
@@ -640,7 +638,6 @@ ixdar isem nniá¸n.',
snaqlitent s ufus.'''",
'movedto' => 'smutti ghar',
'movetalk' => 'Snaqel Tasniwin n usiwl igg illan akid-s',
-'1movedto2' => '[[$1]] twaneql ɣa [[$2]]',
'movelogpage' => 'Snaql aɣmis',
'movereason' => 'Ssebba:',
'revertmove' => 'sedwel',
@@ -715,7 +712,7 @@ Bbeẓ x ufeskar n uzar-timeẓṛi zzat i gha txemmled min turid',
# Media information
'file-info-size' => '$1 × $2 pixel, tiddisize n ufaylu: $3, anawtype n MIME: $4',
-'file-nohires' => '<small>walu ca n resolution yemɣa x wa.</small>',
+'file-nohires' => 'walu ca n resolution yemɣa x wa.',
'svg-long-desc' => 'Afaylu n SVG, dis $1 × $2 pixel, Tiddi n ufaylu: $3',
'show-big-image' => 'Resolution ameqran',
diff --git a/languages/messages/MessagesRm.php b/languages/messages/MessagesRm.php
index c1feaace..bb6575ce 100644
--- a/languages/messages/MessagesRm.php
+++ b/languages/messages/MessagesRm.php
@@ -34,6 +34,13 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Categoria_discussiun',
);
+$magicWords = array(
+ 'redirect' => array( '0', '#RENVIAMENT', '#REDIRECT' ),
+ 'img_thumbnail' => array( '1', 'miniatura', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_upright' => array( '1', 'sidretg', 'sidretg=$1', 'sidretg_$1', 'upright', 'upright=$1', 'upright $1' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'suttastritgar colliaziuns:',
@@ -396,15 +403,14 @@ Eventualmain ha gia insatgi auter stizza quest element.',
'badtitle' => "Il num da titel endatà n'è betg valid",
'badtitletext' => 'Il titel da pagina era betg valid, vids u in titel inter-lingua u inter-wiki betg correct.
El po cuntegnair in u plirs segns che na pon betg vegnir utilisads en titels.',
-'perfcached' => 'Las suandantas datas vegnan ord il cache ed èn eventualmain betg cumplettamain actualas:',
-'perfcachedts' => 'Las suandantas datas derivan dal cache, ultima actualisaziun ils $2 las $3.',
+'perfcached' => 'Las suandantas datas vegnan ord il cache ed èn eventualmain betg cumplettamain actualas. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Las suandantas datas derivan dal cache, ultima actualisaziun ils $2 las $3. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Las actualisaziuns da questa pagina èn deactivadas.
Las datas qua vegnan da preschent betg actualisadas.',
'wrong_wfQuery_params' => 'Parameters fauss per wfQuery()<br />
Funcziun: $1<br />
Query: $2',
'viewsource' => 'Mussar il code da fontauna',
-'viewsourcefor' => 'per $1',
'actionthrottled' => 'Acziun limitada',
'actionthrottledtext' => 'Sco mesira cunter spam na pos ti betg exequir questa acziun memia bleras giadas en curt temp. Ti has surpassà questa limita.
Emprova danovamain en in per minutas.',
@@ -641,9 +647,6 @@ Ti na pos betg utilisar la funcziun "Trametter in e-mail a quest utilisader" sen
Ti\'adressa dad IP actuala è $3, ed la block ID è #$5.
Integrescha per plaschair tut las indicaziuns survart sche ti contacteschas insatgi.',
'blockednoreason' => 'inditgà nagina raschun',
-'blockedoriginalsource' => "Il code da funtauna da '''$1''' vegn mussà sutvart:",
-'blockededitsource' => "Il code da funtauna da '''tias modificaziuns''' vid la pagina '''$1''' vegn mussa sutvart:",
-'whitelistedittitle' => "T'annunzia per modifitgar",
'whitelistedittext' => 'Ti stos $1 per pudair modifitgar paginas.',
'confirmedittext' => 'Ti stos confermar tia adressa dad e-mail avant che modifitgar paginas. Inditgescha e conferma per plaschair tia adressa dad e-mail en tias [[Special:Preferences|preferenzas]].',
'nosuchsectiontitle' => 'Betg pussaivel da chattar la secziun',
@@ -734,7 +737,8 @@ Ti garanteschas che ti has scrit tez quai u copià dad ina funtauna ch'è 'publi
Sche ti na vuls betg che tes texts pon vegnir modifitgads, na als endatescha betg qua.<br />
Ti confermas era che ti has scrit sez quest text u al has copià d'ina funtaunda 'public domain' u semigliant libra (guarda $1 per detagls).
'''Betg trametta ovras protegidas dal dretg d'autur senza lubientscha!'''",
-'longpageerror' => "'''Errur: Il text che ti has tramess è $1 kilobytes gronds. Quei ei pli grond ch'il maximum da $2 kilobytes. Il text na po betg vegnir memorisà. '''",
+'longpageerror' => "'''Errur: Il text che ti has tramess è {{PLURAL:$1|in kilobyte|$1 kilobytes}} grond. Quei ei pli grond ch'il maximum da {{PLURAL:$2|in kilobyte|$2 kilobytes}}.'''
+Il text na po betg vegnir memorisà.",
'readonlywarning' => "'''Attenziun: La banca da datas è vegnida bloccada per motivs da mantegniment, uschia che ti na sas betg memorisar tias modificaziuns gest ussa.'''
Per betg perder las midadas ta recummandain nus da copiar il text en in editur da text sin tes computer ed al memorisar per pli tard.
@@ -889,10 +893,6 @@ Sco administratur pos ti vesair quest diff; detagls pon vegnir chattads en il [{
'revdel-restore-deleted' => 'versiuns stizzadas',
'revdel-restore-visible' => 'versiuns visiblas',
'pagehist' => 'Istorgia da las versiuns',
-'revdelete-content' => 'Cuntegn',
-'revdelete-summary' => 'resumaziun da la midada',
-'revdelete-uname' => "num d'utilisader",
-'revdelete-log-message' => '$1 per $2 versiun{{PLURAL:$2||s}}',
'revdelete-otherreason' => 'Auter/ulteriur motiv:',
'revdelete-reasonotherlist' => 'Auter motiv',
'revdelete-edit-reasonlist' => 'Modifitgar ils motivs per stizzar',
@@ -1029,7 +1029,7 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
'prefs-rc' => 'Ultimas midadas',
'prefs-watchlist' => "Glista d'observaziun",
'prefs-watchlist-days' => "Dumber dals dis che vegnan inditgads sin la glista d'observaziun:",
-'prefs-watchlist-days-max' => 'Maximalmain 7 dis',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Dumber da las midadas mussadas en la glista dad observaziun extendida:',
'prefs-watchlist-edits-max' => 'Dumber maximal: 1000',
'prefs-watchlist-token' => "Token da la glista d'observaziun",
@@ -1220,7 +1220,6 @@ Questa infurmaziun è publica.',
'right-patrol' => "Marcar modificaziuns d'auters sco controlladas",
'right-autopatrol' => 'Marcar sias atgnas modificaziuns automaticamain sco controlladas',
'right-unwatchedpages' => 'Vesair ina glista da las paginas betg contempladas',
-'right-trackback' => 'Trametter in trackback',
'right-mergehistory' => 'Unir la cronologia da questa pagina',
'right-userrights' => 'Modifitgar ils dretgs dals utilisaders',
'right-userrights-interwiki' => "Modifitgar ils dretgs d'utilisaders sin autras wikis",
@@ -1265,7 +1264,6 @@ Questa infurmaziun è publica.',
'action-patrol' => "marcar modificaziuns d'auters sco controlladas",
'action-autopatrol' => 'marcar tias modificaziuns sco controlladas',
'action-unwatchedpages' => 'vesair la glista da las paginas betg contempladas',
-'action-trackback' => 'trametter in trackback',
'action-mergehistory' => 'unir la cronologia da questa pagina',
'action-userrights' => 'modifitgar ils dretgs dals utilisaders',
'action-userrights-interwiki' => "modifitgar ils dretgs d'utilisaders sin autras wikis",
@@ -1645,7 +1643,7 @@ I renviescha uss a [[$2]].',
'protectedtitlestext' => 'Suandants titels èn bloccads per vegnir creads.',
'protectedtitlesempty' => 'Cun ils parameters inditgads èn naginas titels actualmain bloccads per vegnir creads.',
'listusers' => 'Glista dals utilisaders',
-'usercreated' => 'Creà ils $1 las $2 uras',
+'usercreated' => '{{GENDER:$3|Creà}} ils $1 las $2 uras',
'newpages' => 'Artitgels novs',
'newpages-username' => "Num d'utilisader:",
'ancientpages' => 'Artitgels il pli ditg betg modifitgads',
@@ -1720,12 +1718,8 @@ Protocols sustegnids: <tt>$1</tt>',
'activeusers-noresult' => 'Chattà nagins utilisaders.',
# Special:Log/newusers
-'newuserlogpage' => "Log d'utilisaders creads",
-'newuserlogpagetext' => "Quai è il log dals contos d'utilisader ch'èn vegnids creads.",
-'newuserlog-byemail' => 'tramess il pled-clav per e-mail',
-'newuserlog-create-entry' => "Nov conto d'utilisader",
-'newuserlog-create2-entry' => 'Creà in nov conto "$1"',
-'newuserlog-autocreate-entry' => 'Quest conto è vegnì creà automaticamain',
+'newuserlogpage' => "Log d'utilisaders creads",
+'newuserlogpagetext' => "Quai è il log dals contos d'utilisader ch'èn vegnids creads.",
# Special:ListGroupRights
'listgrouprights' => "Dretgs da las gruppas d'utilisaders",
@@ -1754,7 +1748,7 @@ Infurmaziuns supplementaras davart ils singuls dretgs chattas [[{{MediaWiki:List
'emailpagetext' => "Ti pos utilisar il formular sutvart per trametter in'e-mail a quest utilisader.
L'adressa dad e-mail che ti has endatà en [[Special:Preferences|tias preferenzas]] vegn inditgada sco speditur da l'e-mail, uschia ch'il retschavider po rispunder directamain a tai.",
'usermailererror' => 'La funcziun dad e-mail ha returnà ina errur:',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} e-mail da l\'utilisader "$1"',
'usermaildisabled' => 'Trametter e-mails è deactivà',
'usermaildisabledtext' => 'Ti na pos betg trametter e-mails ad auters utilisaders sin questa wiki',
'noemailtitle' => 'Nagina adressa dad e-mail',
@@ -1874,8 +1868,6 @@ Conferma per plaschair che ti ta es conscient da las consequenzas e che ti agesc
'actionfailed' => "L'acziun n'è betg reussida",
'deletedtext' => '"$1" è vegnì stizzà.
Sin $2 chattas ti ina glista dals davos artitgels stizzads.',
-'deletedarticle' => 'ha stizzà "[[$1]]"',
-'suppressedarticle' => 'supprimì "[[$1]]"',
'dellogpage' => 'log dal stizzar',
'dellogpagetext' => "Sutvart è ina glista dals elements stizzads l'ultim.",
'deletionlog' => 'log dal stizzar',
@@ -1978,7 +1970,6 @@ Per restituir be tschertgas part, activescha las chaschettas correspundentas per
'undeletereset' => 'Redefinir',
'undeleteinvert' => 'Invertar la selecziun',
'undeletecomment' => 'Motiv:',
-'undeletedarticle' => 'restituì "[[$1]]"',
'undeletedrevisions' => 'Restituì {{PLURAL:$1|1 versiun|$1 versiuns}}',
'undeletedrevisions-files' => 'Restituì {{PLURAL:$1|1 versiun|$1 versiuns}} e {{PLURAL:$2|1 datoteca|$2 datotecas}}',
'undeletedfiles' => 'Restituì {{PLURAL:$1|1 datoteca|$1 datotecas}}',
@@ -2218,9 +2209,6 @@ En quests cas as ti da spustar u colliar manualmain las paginas, sche giavischà
'movepage-page-moved' => 'La pagina $1 è vegnida spustada a $2.',
'movepage-page-unmoved' => 'Betg pussaivel da spustar la pagina $1 a $2.',
'movepage-max-pages' => 'Il dumber maximal da $1 {{PLURAL:$1|pagina|paginas}} è vegnì spustà. Tut las ulteriuras na pon betg vegnir spustadas automaticamain.',
-'1movedto2' => 'ha spustà [[$1]] a [[$2]]',
-'1movedto2_redir' => 'ha spustà [[$1]] a [[$2]] cun in renviament',
-'move-redirect-suppressed' => 'Impedì renviament',
'movelogpage' => 'Log dal spustar',
'movelogpagetext' => 'Sut è ina glista da tut las paginas spustadas.',
'movesubpage' => '{{PLURAL:$1|Sutpagina|Sutpaginas}}',
@@ -2483,9 +2471,6 @@ Probablamien è quai capità pervia dad in link ad ina pagina externa ch'è sin
# Patrol log
'patrol-log-page' => 'Log da controlla',
'patrol-log-header' => 'Quai è il log da las versiuns controlladas.',
-'patrol-log-line' => 'ha marcà $1 da $2 sco controllà $3',
-'patrol-log-auto' => '(automaticamain)',
-'patrol-log-diff' => 'versiun $1',
'log-show-hide-patrol' => '$1 il log da controllas',
# Image deletion
@@ -2504,23 +2489,25 @@ $1',
'nextdiff' => 'versiun pli nova →',
# Media information
-'mediawarning' => "'''Attenziun''': Quest tip da datotecas po cuntegnair code malvulent.
+'mediawarning' => "'''Attenziun''': Quest tip da datotecas po cuntegnair code malvulent.
Cun exequir questa datoteca po tes sistem vegnir donnegià.",
-'imagemaxsize' => "Grondezza maximala da maletgs:<br />''(per paginas da descripziun da datotecas)''",
-'thumbsize' => 'Grondezza dals maletgs da prevista:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|paginas}}',
-'file-info' => 'grondezza da datoteca: $1, tip da MIME: $2',
-'file-info-size' => '$1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4',
-'file-info-size-pages' => '$1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}',
-'file-nohires' => '<small>Nagina resuluziun pli auta disponibla.</small>',
-'svg-long-desc' => 'datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3',
-'show-big-image' => 'Resoluziun cumplaina',
-'show-big-image-size' => '$1 × $2 pixels',
-'file-info-gif-looped' => 'marscha infinit',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|maletg|maletgs}}',
-'file-info-png-looped' => 'marscha infinit',
-'file-info-png-repeat' => 'Reprodicì $1 {{PLURAL:$1|giada|giadas}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'imagemaxsize' => "Grondezza maximala da maletgs:<br />''(per paginas da descripziun da datotecas)''",
+'thumbsize' => 'Grondezza dals maletgs da prevista:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|paginas}}',
+'file-info' => 'grondezza da datoteca: $1, tip da MIME: $2',
+'file-info-size' => '$1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}',
+'file-nohires' => 'Nagina resuluziun pli auta disponibla.',
+'svg-long-desc' => 'datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3',
+'show-big-image' => 'Resoluziun cumplaina',
+'show-big-image-preview' => 'Grondezza da questa prevista: $1.',
+'show-big-image-other' => 'Autras resoluziuns: $1.',
+'show-big-image-size' => '$1 × $2 pixels',
+'file-info-gif-looped' => 'marscha infinit',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|maletg|maletgs}}',
+'file-info-png-looped' => 'marscha infinit',
+'file-info-png-repeat' => 'Reprodicì $1 {{PLURAL:$1|giada|giadas}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
# Special:NewFiles
'newimages' => 'Galleria dals novs maletgs',
@@ -3002,13 +2989,6 @@ Quai code da confermaziun vegn a scrudar ils $6 las $7.',
'scarytranscludefailed' => "[Betg reussì d'integrar in model per $1]",
'scarytranscludetoolong' => '[URL è memia lunga]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks per questa pagina:<br />
-$1',
-'trackbackremove' => '([Stizzar $1])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Il trackback è vegnì stizzà cun success.',
-
# Delete conflict
'deletedwhileediting' => "'''Attenziun:''' Questa pagina è vegnida stizzada suenter che ti has cumanzà a la modifitgar.",
'confirmrecreate' => "L'utilisader [[User:$1|$1]] ([[User talk:$1|talk]]) ha stizzà quest artitgel (motiv: ''$2'') suenter che ti as cumenzà a modifitgar l'artitgel.
@@ -3223,4 +3203,7 @@ Questa pagina ha actualmain difficultads tecnicas.',
'sqlite-has-fts' => '$1 cun sustegn per la retschertga da text integrala',
'sqlite-no-fts' => '$1 senza sustegn per la retschertga da text integrala',
+# New logging system
+'newuserlog-byemail' => 'tramess il pled-clav per e-mail',
+
);
diff --git a/languages/messages/MessagesRmy.php b/languages/messages/MessagesRmy.php
index 374797a5..6cdafbc8 100644
--- a/languages/messages/MessagesRmy.php
+++ b/languages/messages/MessagesRmy.php
@@ -219,27 +219,26 @@ Mishto si te jas kai {{SITENAME}} thai te paruves tiro lav sigo.',
'image_sample' => 'Misal.jpg',
# Edit pages
-'summary' => 'Xarno xalyaripen:',
-'minoredit' => 'Kadava si ek tikno editisarimos',
-'watchthis' => 'Dikh kadaya patrin',
-'savearticle' => 'Uxtav i patrin',
-'showpreview' => 'Dikh sar avelas i patrin',
-'showlivepreview' => 'Jivutno angledikhipen',
-'showdiff' => 'Dikh le paruvimata',
-'whitelistedittitle' => 'Trebul o autentifikaripen kashte editisares',
-'whitelistedittext' => 'Trebul te [[Special:UserLogin|autentifikisares]] kashte editisares artikolurya.',
-'accmailtitle' => 'O nakhavipnasko lav bićhaldo.',
-'accmailtext' => "O nakhavipnasko lav andar '$1' bićhaldo ko $2.",
-'newarticle' => '(Nevo)',
-'newarticletext' => 'Avilyan kai ek patrin so na si.
+'summary' => 'Xarno xalyaripen:',
+'minoredit' => 'Kadava si ek tikno editisarimos',
+'watchthis' => 'Dikh kadaya patrin',
+'savearticle' => 'Uxtav i patrin',
+'showpreview' => 'Dikh sar avelas i patrin',
+'showlivepreview' => 'Jivutno angledikhipen',
+'showdiff' => 'Dikh le paruvimata',
+'whitelistedittext' => 'Trebul te [[Special:UserLogin|autentifikisares]] kashte editisares artikolurya.',
+'accmailtitle' => 'O nakhavipnasko lav bićhaldo.',
+'accmailtext' => "O nakhavipnasko lav andar '$1' bićhaldo ko $2.",
+'newarticle' => '(Nevo)',
+'newarticletext' => 'Avilyan kai ek patrin so na si.
Te keres la, shai te shirdes (astares) te lekhaves ando telutno moxton (dikh [[{{MediaWiki:Helppage}}|zhutipnaski patrin]] te janes buteder).
Kana avilyan kathe doshatar, ja palpale.',
-'noarticletext' => "Andi '''{{SITENAME}}''' nai ji akana ek lekh kadale anavesa.
+'noarticletext' => "Andi '''{{SITENAME}}''' nai ji akana ek lekh kadale anavesa.
* Te shirdes (astares) te keres o lekh, ker klik '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} kathe]'''.",
-'editing' => 'Editisaripen $1',
-'yourtext' => 'Tiro teksto',
-'storedversion' => 'Akanutni versiya',
-'yourdiff' => 'Ververimata',
+'editing' => 'Editisaripen $1',
+'yourtext' => 'Tiro teksto',
+'storedversion' => 'Akanutni versiya',
+'yourdiff' => 'Ververimata',
# History pages
'previousrevision' => '↠Purano paruvipen',
@@ -404,7 +403,6 @@ Kana kamesa te khoses kadaya patrin andar tiri lista le patryange so arakhes len
'actioncomplete' => 'Agorisardi buti',
'deletedtext' => '"$1" sas khosli.
Dikh ando $2 ek patrinipen le palutne butyange khosle.',
-'deletedarticle' => '"[[$1]]" sas khosli.',
# Rollback
'rollback_short' => 'Palemavilipen',
@@ -448,7 +446,6 @@ Dikh ando $2 ek patrinipen le palutne butyange khosle.',
'movepagebtn' => 'Inger i patrin',
'pagemovedsub' => 'I patrin sas bićhaldi.',
'movedto' => 'ingerdi kai',
-'1movedto2' => '[[$1]] bichhaldo kai [[$2]]',
'delete_and_move' => 'Khos thai inger',
# Export
@@ -532,9 +529,6 @@ Dikh ando $2 ek patrinipen le palutne butyange khosle.',
'watchlistall2' => 'savore',
'namespacesall' => 'savore',
-# Trackbacks
-'trackbacklink' => 'Vurma',
-
# Delete conflict
'deletedwhileediting' => 'Dikh: Kadaya patrin sas khosli de kana shirdyas (astardyas) te editisares la!',
diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php
index fca02fe8..3089b573 100644
--- a/languages/messages/MessagesRo.php
+++ b/languages/messages/MessagesRo.php
@@ -31,132 +31,132 @@
$separatorTransformTable = array( ',' => ".", '.' => ',' );
$magicWords = array(
- 'redirect' => array( '0', '#REDIRECTEAZA', '#REDIRECT' ),
- 'notoc' => array( '0', '__FARACUPRINS__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__FARAGALERIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORTEAZACUPRINS__', '__FORCETOC__' ),
- 'toc' => array( '0', '__CUPRINS__', '__TOC__' ),
- 'noeditsection' => array( '0', '__FARAEDITSECTIUNE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__FARAANTET__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'NUMARLUNACURENTA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'LUNACURENTA1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NUMELUNACURENTA', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NUMELUNACURENTAGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'LUNACURENTAABREV', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'NUMARZIUACURENTA', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'NUMARZIUACURENTA2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NUMEZIUACURENTA', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ANULCURENT', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'TIMPULCURENT', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORACURENTA', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LUNALOCALA', 'LUNALOCALA2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LUNALOCALA1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'NUMELUNALOCALA', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'NUMELUNALOCALAGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LUNALOCALAABREV', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ZIUALOCALA', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ZIUALOCALA2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'NUMEZIUALOCALA', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ANULLOCAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'TIMPULLOCAL', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMARDEPAGINI', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMARDEARTICOLE', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMARDEFISIERE', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMARDEUTILIZATORI', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'NUMARDEUTILIZATORIACTIVI', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'NUMARDEMODIFICARI', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NUMARDEVIZUALIZARI', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'NUMEPAGINA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NUMEEPAGINA', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'SPATIUDENUME', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'SPATIUUDENUME', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'SPATIUDEDISCUTIE', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'SPATIUUDEDISCUTIE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'SPATIUSUBIECT', 'SPATIUARTICOL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'SPATIUUSUBIECT', 'SPATIUUARTICOL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'NUMEPAGINACOMPLET', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'NUMEEPAGINACOMPLET', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NUMESUBPAGINA', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NUMEESUBPAGINA', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NUMEDEBAZAPAGINA', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NUMEEDEBAZAPAGINA', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NUMEPAGINADEDISCUTIE', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NUMEEPAGINADEDISCUTIE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NUMEPAGINASUBIECT', 'NUMEPAGINAARTICOL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NUMEEPAGINASUBIECT', 'NUMEEPAGINAARTICOL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'msgnw' => array( '0', 'MSJNOU:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'dreapta', 'right' ),
- 'img_left' => array( '1', 'stanga', 'left' ),
- 'img_none' => array( '1', 'nu', 'none' ),
- 'img_center' => array( '1', 'centru', 'center', 'centre' ),
- 'img_framed' => array( '1', 'cadru', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'faracadru', 'frameless' ),
- 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'dreaptasus', 'dreaptasus=$1', 'dreaptasus $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'chenar', 'border' ),
- 'img_baseline' => array( '1', 'linia_de_bază', 'baseline' ),
- 'img_sub' => array( '1', 'indice', 'sub' ),
- 'img_super' => array( '1', 'exponent', 'super', 'sup' ),
- 'img_top' => array( '1', 'sus', 'top' ),
- 'img_text_top' => array( '1', 'text-sus', 'text-top' ),
- 'img_middle' => array( '1', 'mijloc', 'middle' ),
- 'img_bottom' => array( '1', 'jos', 'bottom' ),
- 'img_text_bottom' => array( '1', 'text-jos', 'text-bottom' ),
- 'img_link' => array( '1', 'legătură=$1', 'link=$1' ),
- 'sitename' => array( '1', 'NUMESITE', 'SITENAME' ),
- 'ns' => array( '0', 'SN:', 'NS:' ),
- 'localurl' => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URLLOCALE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'NUMESERVER', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CALESCRIPT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GEN:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__FARACONVERTIRETITLU__', '__FCT__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__FARACONVERTIRECONTINUT__', '__FCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'SAPTAMANACURENTA', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'SAPTAMANALOCALA', 'LOCALWEEK' ),
- 'revisionid' => array( '1', 'IDREVIZIE', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ZIREVIZIE', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ZIREVIZIE2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'LUNAREVIZIE', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ANREVIZIE', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'STAMPILATIMPREVIZIE', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'UTILIZATORREVIZIE', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'URLCOMPLET:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'URLCOMPLETE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'MINUSCULAPRIMA:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'MAJUSCULAPRIMA:', 'UCFIRST:' ),
- 'lc' => array( '0', 'MINUSCULA:', 'LC:' ),
- 'uc' => array( '0', 'MAJUSCULA:', 'UC:' ),
- 'raw' => array( '0', 'BRUT:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ARATATITLU', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__LEGATURASECTIUNENOUA__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__FARALEGATURASECTIUNENOUA__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'VERSIUNECURENTA', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'CODIFICAREURL:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'CODIFICAREANCORA', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'STAMPILATIMPCURENT', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'STAMPILATIMPLOCAL', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'SEMNDIRECTIE', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#LIMBA:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'LIMBACONTINUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'PANIGIINSPATIULDENUME:', 'PAGINIINSN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'NUMARADMINI', 'NUMBEROFADMINS' ),
- 'defaultsort' => array( '1', 'SORTAREIMPLICITA:', 'CHEIESORTAREIMPLICITA:', 'CATEGORIESORTAREIMPLICITA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'CALEAFISIERULUI:', 'FILEPATH:' ),
- 'tag' => array( '0', 'eticheta', 'tag' ),
- 'hiddencat' => array( '1', '__ASCUNDECAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'PAGINIINCATEGORIE', 'PAGINIINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'MARIMEPAGINA', 'PAGESIZE' ),
- 'noindex' => array( '1', '__FARAINDEX__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'NUMARINGRUP', 'NUMINGRUP', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__REDIRECTIONARESTATICA__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'NIVELPROTECTIE', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#REDIRECTEAZA', '#REDIRECT' ),
+ 'notoc' => array( '0', '__FARACUPRINS__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__FARAGALERIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORTEAZACUPRINS__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__CUPRINS__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__FARAEDITSECTIUNE__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__FARAANTET__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'NUMARLUNACURENTA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'LUNACURENTA1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NUMELUNACURENTA', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NUMELUNACURENTAGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'LUNACURENTAABREV', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'NUMARZIUACURENTA', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NUMARZIUACURENTA2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NUMEZIUACURENTA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ANULCURENT', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'TIMPULCURENT', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORACURENTA', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LUNALOCALA', 'LUNALOCALA2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LUNALOCALA1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'NUMELUNALOCALA', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'NUMELUNALOCALAGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LUNALOCALAABREV', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ZIUALOCALA', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ZIUALOCALA2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'NUMEZIUALOCALA', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ANULLOCAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'TIMPULLOCAL', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ORALOCALA', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMARDEPAGINI', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMARDEARTICOLE', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMARDEFISIERE', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMARDEUTILIZATORI', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NUMARDEUTILIZATORIACTIVI', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NUMARDEMODIFICARI', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NUMARDEVIZUALIZARI', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'NUMEPAGINA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NUMEEPAGINA', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'SPATIUDENUME', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'SPATIUUDENUME', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'SPATIUDEDISCUTIE', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'SPATIUUDEDISCUTIE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'SPATIUSUBIECT', 'SPATIUARTICOL', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'SPATIUUSUBIECT', 'SPATIUUARTICOL', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'NUMEPAGINACOMPLET', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'NUMEEPAGINACOMPLET', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NUMESUBPAGINA', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NUMEESUBPAGINA', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NUMEDEBAZAPAGINA', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NUMEEDEBAZAPAGINA', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NUMEPAGINADEDISCUTIE', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NUMEEPAGINADEDISCUTIE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NUMEPAGINASUBIECT', 'NUMEPAGINAARTICOL', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NUMEEPAGINASUBIECT', 'NUMEEPAGINAARTICOL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'MSJ:', 'MSG:' ),
+ 'msgnw' => array( '0', 'MSJNOU:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'dreapta', 'right' ),
+ 'img_left' => array( '1', 'stanga', 'left' ),
+ 'img_none' => array( '1', 'nu', 'none' ),
+ 'img_center' => array( '1', 'centru', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'cadru', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'faracadru', 'frameless' ),
+ 'img_page' => array( '1', 'pagina=$1', 'pagina $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'dreaptasus', 'dreaptasus=$1', 'dreaptasus $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'chenar', 'border' ),
+ 'img_baseline' => array( '1', 'linia_de_bază', 'baseline' ),
+ 'img_sub' => array( '1', 'indice', 'sub' ),
+ 'img_super' => array( '1', 'exponent', 'super', 'sup' ),
+ 'img_top' => array( '1', 'sus', 'top' ),
+ 'img_text_top' => array( '1', 'text-sus', 'text-top' ),
+ 'img_middle' => array( '1', 'mijloc', 'middle' ),
+ 'img_bottom' => array( '1', 'jos', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'text-jos', 'text-bottom' ),
+ 'img_link' => array( '1', 'legătură=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'NUMESITE', 'SITENAME' ),
+ 'ns' => array( '0', 'SN:', 'NS:' ),
+ 'localurl' => array( '0', 'URLLOCAL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URLLOCALE:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'NUMESERVER', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CALESCRIPT', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMATICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GEN:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__FARACONVERTIRETITLU__', '__FCT__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__FARACONVERTIRECONTINUT__', '__FCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'SAPTAMANACURENTA', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'SAPTAMANALOCALA', 'LOCALWEEK' ),
+ 'revisionid' => array( '1', 'IDREVIZIE', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ZIREVIZIE', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ZIREVIZIE2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'LUNAREVIZIE', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ANREVIZIE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'STAMPILATIMPREVIZIE', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'UTILIZATORREVIZIE', 'REVISIONUSER' ),
+ 'fullurl' => array( '0', 'URLCOMPLET:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'URLCOMPLETE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'MINUSCULAPRIMA:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'MAJUSCULAPRIMA:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'MINUSCULA:', 'LC:' ),
+ 'uc' => array( '0', 'MAJUSCULA:', 'UC:' ),
+ 'raw' => array( '0', 'BRUT:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ARATATITLU', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__LEGATURASECTIUNENOUA__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__FARALEGATURASECTIUNENOUA__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'VERSIUNECURENTA', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'CODIFICAREURL:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'CODIFICAREANCORA', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'STAMPILATIMPCURENT', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'STAMPILATIMPLOCAL', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'SEMNDIRECTIE', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#LIMBA:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'LIMBACONTINUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'PANIGIINSPATIULDENUME:', 'PAGINIINSN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'NUMARADMINI', 'NUMBEROFADMINS' ),
+ 'defaultsort' => array( '1', 'SORTAREIMPLICITA:', 'CHEIESORTAREIMPLICITA:', 'CATEGORIESORTAREIMPLICITA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'CALEAFISIERULUI:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'eticheta', 'tag' ),
+ 'hiddencat' => array( '1', '__ASCUNDECAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'PAGINIINCATEGORIE', 'PAGINIINCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'MARIMEPAGINA', 'PAGESIZE' ),
+ 'noindex' => array( '1', '__FARAINDEX__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NUMARINGRUP', 'NUMINGRUP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__REDIRECTIONARESTATICA__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVELPROTECTIE', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formatdata', 'dataformat', 'formatdate', 'dateformat' ),
);
$namespaceNames = array(
@@ -658,23 +658,25 @@ Te rog anunță acest aspect unui [[Special:ListUsers/sysop|administrator]], ind
'badarticleerror' => 'Această acțiune nu poate fi efectuată pe această pagină.',
'cannotdelete' => 'Pagina sau fișierul „$1†nu a putut fi șters.
S-ar putea ca acesta să fi fost deja șters de altcineva.',
+'cannotdelete-title' => 'Imposibil de È™ters pagina „$1â€',
'badtitle' => 'Titlu incorect',
'badtitletext' => 'Titlul căutat a fost invalid, gol sau o legătură invalidă inter-linguală sau inter-wiki.
Poate conține unul sau mai multe caractere ce nu poate fi folosit în titluri.',
-'perfcached' => 'Datele următoare au fost păstrate în cache și s-ar putea să nu fie la zi.',
-'perfcachedts' => "Informațiile de mai jos provin din ''cache''; ultima actualizare s-a efectuat la $1.",
+'perfcached' => 'Datele următoare au fost păstrate în cache și s-ar putea să nu fie actualizate. Un maxim de {{PLURAL:$1|un rezultat este disponibil|$1 rezultate sunt disponibile}} în cache.',
+'perfcachedts' => 'Informațiile de mai jos provin din cache, ultima actualizare efectuându-se la $1. Un maxim de {{PLURAL:$4|un rezultat este disponibil|$4 rezultate sunt disponibile}} în cache.',
'querypage-no-updates' => 'Actualizările acestei pagini sunt momentan dezactivate. Informațiile de aici nu sunt împrospătate.',
'wrong_wfQuery_params' => 'Număr incorect de parametri pentru wfQuery()<br />
Funcția: $1<br />
Interogarea: $2',
'viewsource' => 'Sursă pagină',
-'viewsourcefor' => 'pentru $1',
+'viewsource-title' => 'Vizualizare sursă pentru $1',
'actionthrottled' => 'Acțiune limitată',
'actionthrottledtext' => 'Ca o măsură anti-spam, aveți permisiuni limitate în a efectua această acțiune de prea multe ori într-o perioadă scurtă de timp, iar dv. tocmai ați depășit această limită.
Vă rugăm să încercați din nou în câteva minute.',
'protectedpagetext' => 'Această pagină este protejată împotriva modificărilor.',
'viewsourcetext' => 'Se poate vizualiza și copia conținutul acestei pagini:',
+'viewyourtext' => "Se poate vizualiza și copia conținutul '''modificărilor dumneavoastră''' efectuate asupra acestei pagini:",
'protectedinterface' => 'Această pagină asigură textul interfeței pentru software și este protejată pentru a preveni abuzurile.',
'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.
@@ -773,6 +775,7 @@ Prin urmare, vizitatorii care folosesc același IP nu mai pot crea alte conturi
'noemailprefs' => 'Nu a fost specificată o adresă email, următoarele nu vor funcționa.',
'emailconfirmlink' => 'Confirmați adresa dvs. de email',
'invalidemailaddress' => 'Adresa de email nu a putut fi acceptată pentru că pare a avea un format invalid. Vă rugăm să reintroduceți o adresă bine formatată sau să goliți acel câmp.',
+'cannotchangeemail' => 'Adresele de e-mail asociate conturilor nu pot fi schimbate pe acest wiki.',
'accountcreated' => 'Contul a fost creat.',
'accountcreatedtext' => 'Contul utilizatorului pentru $1 a fost creat.',
'createaccount-title' => 'Creare de cont la {{SITENAME}}',
@@ -789,6 +792,7 @@ Vă rugăm să așteptați până să mai încercați.',
# E-mail sending
'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
+'user-mail-no-addy' => 'S-a încercat trimiterea e-mailului fără o adresă de e-mail.',
# Change password dialog
'resetpass' => 'Modifică parola',
@@ -809,16 +813,18 @@ Este posibil să fi reușit deja schimbarea parolei sau să fi cerut o parolă t
'resetpass-temp-password' => 'Parolă temporară:',
# Special:PasswordReset
-'passwordreset' => 'Resetare parolă',
-'passwordreset-text' => 'Completați acest formular pentru a primi un e-mail cu datele contului dumneavoastră.',
-'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-username' => 'Nume de utilizator:',
-'passwordreset-domain' => 'Domeniu:',
-'passwordreset-email' => 'Adresă de e-mail:',
-'passwordreset-emailtitle' => 'Detalii despre cont pe {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Cineva (probabil dumneavoastră, de la adresa IP $1) a cerut reamintirea detaliilor
+'passwordreset' => 'Resetare parolă',
+'passwordreset-text' => 'Completați acest formular pentru a primi un e-mail cu datele contului dumneavoastră.',
+'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-username' => 'Nume de utilizator:',
+'passwordreset-domain' => 'Domeniu:',
+'passwordreset-capture' => 'Vizualizați e-mailul rezultat?',
+'passwordreset-capture-help' => 'Dacă bifați această căsuță, e-mailul (conținând parola temperară) vă va fi afișat, dar va fi trimis și utilizatorului.',
+'passwordreset-email' => 'Adresă de e-mail:',
+'passwordreset-emailtitle' => 'Detalii despre cont pe {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Cineva (probabil dumneavoastră, de la adresa IP $1) a cerut reamintirea detaliilor
contului dumneavoastră pe {{SITENAME}} ($4). {{PLURAL:$3|Următorul cont este asociat|Următoarele conturi sunt asociate}}
cu această adresă de e-mail:
@@ -828,15 +834,28 @@ $2
Ar trebui să vă autentificați și să schimbați parola acum. Dacă altcineva a făcut această cerere
sau dacă v-ați reamintit parola inițială și nu mai doriți să o schimbați,
puteți ignora acest mesaj, continuând să utilizați vechea parolă.',
-'passwordreset-emailtext-user' => 'Utilizatorul $1 de pe {{SITENAME}} a solicitat o reamintire a detaliilor contului dumneavoastră pentru {{SITENAME}} ($4). Următorul utilizator are {{PLURAL:$3|contul asociat|conturile asociate}} cu această adresă de e-mail:
+'passwordreset-emailtext-user' => 'Utilizatorul $1 de pe {{SITENAME}} a solicitat o reamintire a detaliilor contului dumneavoastră pentru {{SITENAME}} ($4). Următorul utilizator are {{PLURAL:$3|contul asociat|conturile asociate}} cu această adresă de e-mail:
$2
{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.
Ar trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă altcineva a făcut această solicitare, ori dacă v-ați reamintit parola originală și nu mai doriți modificarea ei, puteți ignora acest mesaj, continuând cu vechea parolă.',
-'passwordreset-emailelement' => 'Nume de utilizator: $1
+'passwordreset-emailelement' => 'Nume de utilizator: $1
Parolă temporară: $2',
-'passwordreset-emailsent' => 'A fost trimis un e-mail de reamintire.',
+'passwordreset-emailsent' => 'A fost trimis un e-mail de reamintire.',
+'passwordreset-emailsent-capture' => 'Un mesaj de reamintire a fost trimis, fiind afișat mai jos.',
+'passwordreset-emailerror-capture' => 'Un mesaj de reamintire a fost generat (fiind afișat mai jos), dar trimiterea sa către utilizator a eșuat: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Modificare adresă de e-mail',
+'changeemail-header' => 'Modificare adresă de e-mail asociată contului',
+'changeemail-text' => 'Completați acest formular pentru a vă modifica adresa de e-mail. Va trebui să introduceți și parola pentru a confirma această modificare.',
+'changeemail-no-info' => 'Trebuie să fiți autentificat pentru a accesa această pagină direct.',
+'changeemail-oldemail' => 'Adresa de e-mail actuală:',
+'changeemail-newemail' => 'Noua adresă de e-mail:',
+'changeemail-none' => '(niciuna)',
+'changeemail-submit' => 'Modifică adresa de e-mail',
+'changeemail-cancel' => 'Revocare',
# Edit page toolbar
'bold_sample' => 'Text aldin',
@@ -905,9 +924,6 @@ Nu veți putea folosi opțiunea de "trimite e-mail" decât dacă aveți înregis
Aveți adresa IP $3, iar identificatorul dumneavoastră de blocare este $5.
Vă rugăm să includeți detaliile de mai sus în orice interogări pe care le faceți.',
'blockednoreason' => 'nici un motiv oferit',
-'blockedoriginalsource' => "Sursa pentru '''$1''' apare mai jos:",
-'blockededitsource' => "Textul '''modificărilor dumneavoastră''' la '''$1''' este redat mai jos:",
-'whitelistedittitle' => 'Este necesară autentificarea pentru a putea modifica',
'whitelistedittext' => 'Trebuie să $1 pentru a edita articole.',
'confirmedittext' => 'Trebuie să vă confirmați adresa de e-mail înainte de a edita pagini. Vă rugăm să vă setați și să vă validați adresa de e-mail cu ajutorul [[Special:Preferences|preferințelor utilizatorului]].',
'nosuchsectiontitle' => 'Secțiunea nu poate fi găsită',
@@ -996,8 +1012,8 @@ De asemenea, ne asigurați că ceea ce ați scris a fost compoziție proprie sau
Dacă nu doriți ca ceea ce scrieți să fie modificat fără milă și redistribuit în voie, atunci nu trimiteți materialele respective aici.<br />
De asemenea, ne asigurați că ceea ce ați scris a fost compoziție proprie sau copie dintr-o resursă publică sau liberă (vedeți $1 pentru detalii).
'''Nu introduceți materiale aflate sub incidența drepturilor de autor fără a avea permisiune!'''",
-'longpageerror' => "'''EROARE: Textul pe care vrei să-l salvezi are $1 kilobytes,
-ceea ce înseamnă mai mult decât maximum de $2 kilobytes. Salvarea nu este posibilă.'''",
+'longpageerror' => "'''Eroare: Textul pe care l-ați trimis are o lungime de {{PLURAL:$1|un kilooctet|$1 kiloocteți|$1 de kiloocteți}}, ceea ce înseamnă mai mult decât maximul de {{PLURAL:$2|un kilooctet|$2 kiloocteți|$2 de kiloocteți}}.'''
+Salvarea nu este posibilă.",
'readonlywarning' => "'''Atenție: Baza de date a fost blocată pentru întreținere, deci nu veți putea salva modificările în acest moment.'''
Puteți copia textul într-un fișier text, păstrându-l pentru mai târziu.
@@ -1164,8 +1180,6 @@ funcție, revizia specificată nu există, sau ești pe cale să ascunzi revizia
'revdelete-unsuppress' => 'Anulează restricțiile la versiunile restaurate',
'revdelete-log' => 'Motivul ștergerii:',
'revdelete-submit' => 'Aplică {{PLURAL:$1|versiunii selectate|versiunilor selectate}}',
-'revdelete-logentry' => 'a modificat vizibilitatea unor elemente din istoricul paginii [[$1]]',
-'logdelete-logentry' => 'a fost modificată vizibilitatea evenimentului [[$1]]',
'revdelete-success' => "'''Vizibilitatea versiunilor a fost schimbată cu succes.'''",
'revdelete-failure' => "'''Nu s-a putut modifica vizibilitatea versiunii:'''
$1",
@@ -1177,15 +1191,6 @@ $1",
'revdel-restore-visible' => 'versiuni vizibile',
'pagehist' => 'Istoricul paginii',
'deletedhist' => 'Istoric șters',
-'revdelete-content' => 'textul versiunii',
-'revdelete-summary' => 'descrierea modificărilor',
-'revdelete-uname' => 'numele de utilizator',
-'revdelete-restricted' => 'restricții aplicate administratorilor',
-'revdelete-unrestricted' => 'restricții eliminate pentru administratori',
-'revdelete-hid' => 'a șters $1',
-'revdelete-unhid' => 'a recuperat $1',
-'revdelete-log-message' => '$1, pentru {{PLURAL:$2|o versiune|$2 versiuni}}',
-'logdelete-log-message' => '$1 pentru $2 {{PLURAL:$2|eveniment|evenimente}}',
'revdelete-hide-current' => 'Eroare la ștergerea elementului datat $2, $1: reprezintă versiunea curentă și nu poate fi ștearsă.',
'revdelete-show-no-access' => 'Eroare la afișarea elementului datat $2, $1: elementul a fost marcat ca "restricționat".
Nu ai acces la acest element.',
@@ -1343,12 +1348,14 @@ Folosirea linkurilor de navigare va reseta această coloană.',
'prefs-rc' => 'Schimbări recente',
'prefs-watchlist' => 'Listă de urmărire',
'prefs-watchlist-days' => 'Numărul de zile care apar în lista paginilor urmărite:',
-'prefs-watchlist-days-max' => 'Maxim 7 zile',
+'prefs-watchlist-days-max' => 'Maxim $1 {{PLURAL:$1|zi|zile}}',
'prefs-watchlist-edits' => 'Numărul de editări care apar în lista extinsă a paginilor urmărite:',
'prefs-watchlist-edits-max' => 'Număr maxim: 1000',
'prefs-watchlist-token' => 'Jeton pentru lista de pagini urmărite:',
'prefs-misc' => 'Parametri diverși',
'prefs-resetpass' => 'Modifică parola',
+'prefs-changeemail' => 'Modifică adresa de e-mail',
+'prefs-setemail' => 'Setează o adresă de e-mail',
'prefs-email' => 'Opțiuni e-mail',
'prefs-rendering' => 'Aspect',
'saveprefs' => 'Salvează preferințele',
@@ -1408,6 +1415,7 @@ Acțiunea nu este reversibilă.',
'yourrealname' => 'Nume real:',
'yourlanguage' => 'Interfață în limba:',
'yourvariant' => 'Varianta limbii conținutului:',
+'prefs-help-variant' => 'Varianta dumneavoastră preferată sau ortografia de afișare a conținutului paginilor pe acest wiki.',
'yournick' => 'Semnătură:',
'prefs-help-signature' => 'Comentariile de pe paginile de discuÈ›ii vor trebuie semnate cu „<nowiki>~~~~</nowiki>â€, tildele transformându-se în semnătura dumneavoastră urmată de ora la care aÈ›i introdus comentariul.',
'badsig' => 'Semnătură brută incorectă; verificați tagurile HTML.',
@@ -1449,7 +1457,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'userrights-lookup-user' => 'Administrare grupuri de utilizatori',
'userrights-user-editname' => 'Introdu un nume de utilizator:',
'editusergroup' => 'Modificare grup de utilizatori',
-'editinguser' => "modificare permisiuni de utilizator ale utilizatorului '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modificare permisiuni de utilizator pentru '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Modificare grup de utilizatori',
'saveusergroups' => 'Salvează grupul de utilizatori',
'userrights-groupsmember' => 'Membru al:',
@@ -1543,13 +1551,13 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'right-autopatrol' => 'Modificările proprii marcate ca patrulate',
'right-patrolmarks' => 'Vizualizează pagini recent patrulate',
'right-unwatchedpages' => 'Vizualizezaă listă de pagini neurmărite',
-'right-trackback' => 'Trimite un urmăritor',
'right-mergehistory' => 'Unește istoricele paginilor',
'right-userrights' => 'Modifică toate permisiunile de utilizator',
'right-userrights-interwiki' => 'Modifică permisiunile de utilizator pentru utilizatorii de pe alte wiki',
'right-siteadmin' => 'Blochează și deblochează baza de date',
'right-override-export-depth' => 'Exportă inclusiv paginile legate până la o adâncime de 5',
'right-sendemail' => 'Trimite e-mail altor utilizatori',
+'right-passwordreset' => 'Vizualizează e-mailurile de reinițializare a parolelor',
# User rights log
'rightslog' => 'Jurnal permisiuni de utilizator',
@@ -1583,16 +1591,17 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'action-suppressionlog' => 'vizualizați acest jurnal privat',
'action-block' => 'blocați permisiunea de modificare a acestui utilizator',
'action-protect' => 'modificați nivelurile de protecție pentru această pagină',
+'action-rollback' => 'faceți revocarea rapidă a modificărilor ultimului utilizator care a modificat o pagină particulară',
'action-import' => 'importați această pagină din alt wiki',
'action-importupload' => 'importați această pagină prin încărcarea unui fișier',
'action-patrol' => 'marcați modificările celorlalți ca patrulate',
'action-autopatrol' => 'marcați modificarea drept patrulată',
'action-unwatchedpages' => 'vizualizați lista de pagini neurmărite',
-'action-trackback' => 'aplicați un trackback',
'action-mergehistory' => 'uniți istoricul acestei pagini',
'action-userrights' => 'modificați toate permisiunile utilizatorilor',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modificare|modificări|de modificări}}',
@@ -1623,11 +1632,11 @@ $3',
'newpageletter' => 'N',
'boteditletter' => 'b',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|utilizator|utilizatori|de utilizatori}} care urmăresc]',
'rc_categories' => 'Limitează la categoriile (separate prin "|")',
'rc_categories_any' => 'Oricare',
'rc-change-size' => '$1',
+'rc-change-size-new' => '$1 {{PLURAL:$1|octet|octeți|de octeți}} după modificare',
'newsectionsummary' => '/* $1 */ secțiune nouă',
'rc-enhanced-expand' => 'Arată detalii (necesită JavaScript)',
'rc-enhanced-hide' => 'Ascunde detaliile',
@@ -1637,7 +1646,6 @@ $3',
'recentchangeslinked-feed' => 'Modificări corelate',
'recentchangeslinked-toolbox' => 'Modificări corelate',
'recentchangeslinked-title' => 'Modificări legate de „$1â€',
-'recentchangeslinked-backlink' => '↠$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'''.",
@@ -1681,6 +1689,7 @@ Vezi [[Special:NewFiles|galeria fișierelor noi]] pentru o mai bună vizualizare
'ignorewarnings' => 'Ignoră orice avertismente',
'minlength1' => 'Numele fișierelor trebuie să fie cel puțin o literă.',
'illegalfilename' => 'Numele fișierului "$1" conține caractere care nu sunt permise în titlurile paginilor. Vă rugăm redenumiți fișierul și încercați să îl încărcați din nou.',
+'filename-toolong' => 'Numele fișierelor nu trebuie să fie mai lungi de 240 de octeți.',
'badfilename' => 'Numele fiÈ™ierului a fost schimbat în „$1â€.',
'filetype-mime-mismatch' => 'Extensia „.$1†nu se potrivește cu tipul MIME al fișierului ($2).',
'filetype-badmime' => 'Nu este permisă încărcarea de fișiere de tipul MIME "$1".',
@@ -1774,6 +1783,36 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
'upload-unknown-size' => 'Mărime necunoscută',
'upload-http-error' => 'A avut loc o eroare HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Imposibil de citit fișierul $1.',
+'backend-fail-backup' => 'Imposibil de efectuat o copie de rezervă a fișierului $1.',
+'backend-fail-notexists' => 'Fișierul $1 nu există.',
+'backend-fail-hashes' => 'Imposibil de obținut valoarea de dispersie a fișierului pentru comparare.',
+'backend-fail-notsame' => 'Un fișier diferit există deja pentru $1.',
+'backend-fail-invalidpath' => '$1 nu este o cale validă de stocare.',
+'backend-fail-delete' => 'Imposibil de șters fișierul $1.',
+'backend-fail-alreadyexists' => 'Fișierul $1 există deja.',
+'backend-fail-store' => 'Imposibil de stocat fișierul $1 în $2.',
+'backend-fail-copy' => 'Imposibil de copiat fișierul $1 în $2.',
+'backend-fail-move' => 'Imposibil de mutat fișierul $1 în $2.',
+'backend-fail-opentemp' => 'Imposibil de deschis fișierul temporar.',
+'backend-fail-writetemp' => 'Imposibil de scris în fișierul temporar.',
+'backend-fail-closetemp' => 'Imposibil de închis fișierul temporar.',
+'backend-fail-read' => 'Imposibil de citit fișierul $1.',
+'backend-fail-create' => 'Imposibil de creat fișierul $1.',
+'backend-fail-contenttype' => 'Nu s-a putut determina tipul de conÈ›inut al fiÈ™ierului de stocat la „$1â€.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Imposibil de deblocat „$1â€; nu este blocată.',
+'lockmanager-fail-closelock' => 'Imposibil de închis fiÈ™ierul de blocare pentru „$1â€.',
+'lockmanager-fail-deletelock' => 'Imposibil de È™ters fiÈ™ierul de blocare pentru „$1â€.',
+'lockmanager-fail-acquirelock' => 'Imposibil de obÈ›inut blocarea pentru „$1â€.',
+'lockmanager-fail-openlock' => 'Imposibil de deschis fiÈ™ierul de blocare pentru „$1â€.',
+'lockmanager-fail-releaselock' => 'Imposibil de eliberat blocarea pentru „$1â€.',
+'lockmanager-fail-db-bucket' => 'Imposibil de contactat suficient baza de date cu blocări în găleata $1.',
+'lockmanager-fail-db-release' => 'Imposibil de eliberat blocările din baza de date $1.',
+'lockmanager-fail-svr-release' => 'Imposibil de eliberat blocările de pe serverul $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'A intervenit o eroare în momentul deschiderii fișierului ZIP pentru verificări.',
'zip-wrong-format' => 'Fișierul specificat nu era un fișier de tip ZIP.',
@@ -1790,6 +1829,7 @@ Nu poate fi verificat în mod corespunzător în vederea securității.',
'uploadstash-badtoken' => 'Execuția acestei acțiuni nu a reușit, probabil deoarece informațiile dumneavoastră de identificare au expirat. Încercați din nou.',
'uploadstash-errclear' => 'Golirea fișierelor nu a reușit.',
'uploadstash-refresh' => 'Reîmprospătează lista de fișiere',
+'invalid-chunk-offset' => 'Decalaj de segment nevalid',
# img_auth script messages
'img-auth-accessdenied' => 'Acces interzis',
@@ -1898,23 +1938,24 @@ Descrierea de mai jos poate fi consultată la [$2 pagina de descriere a fișieru
'filerevert-badversion' => 'Nu există o versiune mai veche a fișierului care să corespundă cu data introdusă.',
# File deletion
-'filedelete' => 'Șterge $1',
-'filedelete-legend' => 'Șterge fișierul',
-'filedelete-intro' => "Sunteți pe cale să ștergeți fișierul '''[[Media:$1|$1]]''' cu tot istoricul acestuia.",
-'filedelete-intro-old' => "Ştergi versiunea fișierului '''[[Media:$1|$1]]''' din [$4 $3, $2].",
-'filedelete-comment' => 'Motiv:',
-'filedelete-submit' => 'Șterge',
-'filedelete-success' => "'''$1''' a fost șters.",
-'filedelete-success-old' => "Versiunea fișierului '''[[Media:$1|$1]]''' din $2 $3 a fost ștearsă.",
-'filedelete-nofile' => "'''$1''' nu există.",
-'filedelete-nofile-old' => "Nu există nicio versiune arhivată a '''$1''' cu atributele specificate.",
-'filedelete-otherreason' => 'Motiv diferit/adițional:',
-'filedelete-reason-otherlist' => 'Alt motiv',
-'filedelete-reason-dropdown' => '*Motive uzuale
+'filedelete' => 'Șterge $1',
+'filedelete-legend' => 'Șterge fișierul',
+'filedelete-intro' => "Sunteți pe cale să ștergeți fișierul '''[[Media:$1|$1]]''' cu tot istoricul acestuia.",
+'filedelete-intro-old' => "Ştergi versiunea fișierului '''[[Media:$1|$1]]''' din [$4 $3, $2].",
+'filedelete-comment' => 'Motiv:',
+'filedelete-submit' => 'Șterge',
+'filedelete-success' => "'''$1''' a fost șters.",
+'filedelete-success-old' => "Versiunea fișierului '''[[Media:$1|$1]]''' din $2 $3 a fost ștearsă.",
+'filedelete-nofile' => "'''$1''' nu există.",
+'filedelete-nofile-old' => "Nu există nicio versiune arhivată a '''$1''' cu atributele specificate.",
+'filedelete-otherreason' => 'Motiv diferit/adițional:',
+'filedelete-reason-otherlist' => 'Alt motiv',
+'filedelete-reason-dropdown' => '*Motive uzuale
** Încălcare drepturi de autor
** Fișier duplicat',
-'filedelete-edit-reasonlist' => 'Modifică motivele ștergerii',
-'filedelete-maintenance' => 'Ştergerea sau restaurarea fișierelor este temporar dezactivată pe timpul lucrărilor de mentenanță.',
+'filedelete-edit-reasonlist' => 'Modifică motivele ștergerii',
+'filedelete-maintenance' => 'Ştergerea sau restaurarea fișierelor este temporar dezactivată pe timpul lucrărilor de mentenanță.',
+'filedelete-maintenance-title' => 'Fișierul nu a putut fi șters',
# MIME search
'mimesearch' => 'Căutare MIME',
@@ -2024,6 +2065,8 @@ Intrările <del>tăiate</del> au fost rezolvate.',
'wantedpages' => 'Pagini dorite',
'wantedpages-badtitle' => 'Titlu invalid în rezultatele : $1',
'wantedfiles' => 'Fișiere dorite',
+'wantedfiletext-cat' => 'Următoarele fișiere sunt utilizate, dar nu există. Fișierele provenind din depozite externe pot apărea listate, în ciuda faptului că ele nu există. Orice astfel de pozitive false vor fi <del>tăiate</del>. În plus, paginile care încorporează astfel de fișiere inexistente sunt listate la [[:$1]].',
+'wantedfiletext-nocat' => 'Următoarele fișiere sunt utilizate, dar nu există. Fișierele provenind din depozite externe pot apărea listate, în ciuda faptului că ele nu există. Orice astfel de pozitive false vor fi <del>tăiate</del>.',
'wantedtemplates' => 'Formate dorite',
'mostlinked' => 'Cele mai căutate articole',
'mostlinkedcategories' => 'Cele mai căutate categorii',
@@ -2032,6 +2075,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
'mostimages' => 'Cele mai căutate imagini',
'mostrevisions' => 'Articole cu cele mai multe revizuiri',
'prefixindex' => 'Toate paginile cu prefix',
+'prefixindex-namespace' => 'Toate paginile cu prefix (spațiul de nume $1)',
'shortpages' => 'Pagini scurte',
'longpages' => 'Pagini lungi',
'deadendpages' => 'Pagini fără legături',
@@ -2141,12 +2185,8 @@ Protocoale suportate: <tt>$1</tt> (nu adăugați niciunul dintre acestea în câ
'activeusers-noresult' => 'Niciun utilizator găsit.',
# Special:Log/newusers
-'newuserlogpage' => 'Jurnal utilizatori noi',
-'newuserlogpagetext' => 'Acesta este jurnalul creărilor conturilor de utilizator.',
-'newuserlog-byemail' => 'parola trimisă prin e-mail',
-'newuserlog-create-entry' => 'Utilizator nou',
-'newuserlog-create2-entry' => 'a fost creat contul nou $1',
-'newuserlog-autocreate-entry' => 'Cont creat automat',
+'newuserlogpage' => 'Jurnal utilizatori noi',
+'newuserlogpagetext' => 'Acesta este jurnalul creărilor conturilor de utilizator.',
# Special:ListGroupRights
'listgrouprights' => 'Permisiunile grupurilor de utilizatori',
@@ -2175,7 +2215,7 @@ Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații adiționale]] de
'emailpagetext' => 'Poți folosi formularul de mai jos pentru a trimite un e-mail acestui utilizator.
Adresa de e-mail introdusă de tine în [[Special:Preferences|preferințele de utilizator]] va apărea ca adresa expeditorului e-mail-ului, deci destinatarul va putea să îți răspundă direct.',
'usermailererror' => 'Obiectul de mail a dat eroare:',
-'defemailsubject' => 'E-mail {{SITENAME}}',
+'defemailsubject' => 'E-mail {{SITENAME}} de la utilizatorul „$1â€',
'usermaildisabled' => 'E-mail dezactivat',
'usermaildisabledtext' => 'Nu puteți trimite e-mail altor utilizatori ai acestui wiki.',
'noemailtitle' => 'Fără adresă de e-mail',
@@ -2229,7 +2269,7 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
'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}}.',
'iteminvalidname' => "E o problemă cu elementul '$1', numele este invalid...",
-'wlnote' => "Mai jos se află {{PLURAL:$1|ultima schimbare|ultimele $1 schimbări|ultimele $1 de schimbări}} din {{PLURAL:$2|ultima oră|ultimele '''$2''' ore|ultimele '''$2''' de ore}}.",
+'wlnote' => "Mai jos se află {{PLURAL:$1|ultima schimbare|ultimele $1 schimbări|ultimele $1 de schimbări}} din {{PLURAL:$2|ultima oră|ultimele '''$2''' ore|ultimele '''$2''' de ore}}, așa cum era situația la $3, $4.",
'wlshowlast' => 'Arată ultimele $1 ore $2 zile $3',
'watchlist-options' => 'Opțiuni listă de pagini urmărite',
@@ -2293,8 +2333,6 @@ Asistență și suport:
'actionfailed' => 'Acțiunea a eșuat',
'deletedtext' => 'Pagina „$1†a fost ștearsă.
Accesați $2 pentru o listă cu elementele recent șterse.',
-'deletedarticle' => 'a șters "[[$1]]"',
-'suppressedarticle' => 'eliminate "[[$1]]"',
'dellogpage' => 'Jurnal ștergeri',
'dellogpagetext' => 'Mai jos se află lista celor mai recente elemente șterse.',
'deletionlog' => 'jurnal pagini șterse',
@@ -2341,7 +2379,10 @@ Consultați [[Special:ProtectedPages|indexul paginilor protejate]] pentru o list
'unprotectedarticle' => 'a eliminat protecÈ›ia pentru „[[$1]]â€',
'movedarticleprotection' => 'setările de protecÈ›ie au fost mutate de la „[[$2]]†la „[[$1]]â€',
'protect-title' => 'Protejare „$1â€',
+'protect-title-notallowed' => 'Vizualizare nivel de protecÈ›ie pentru „$1â€',
'prot_1movedto2' => 'a mutat [[$1]] la [[$2]]',
+'protect-badnamespace-title' => 'Spațiu de nume neprotejabil',
+'protect-badnamespace-text' => 'Paginile din acest spațiu de nume nu pot fi protejate.',
'protect-legend' => 'Confirmă protejare',
'protectcomment' => 'Motiv:',
'protectexpiry' => 'Expiră:',
@@ -2363,6 +2404,7 @@ Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta pr
'protect-level-sysop' => 'Numai administratorii',
'protect-summary-cascade' => 'în cascadă',
'protect-expiring' => 'expiră $1 (UTC)',
+'protect-expiring-local' => 'expiră la $1',
'protect-expiry-indefinite' => 'indefinit',
'protect-cascade' => 'Protejare în cascadă - toate paginile incluse în această pagină vor fi protejate.',
'protect-cantedit' => 'Nu puteți schimba nivelul de protecție a acestei pagini, deoarece nu aveți permisiunea de a o modifica.',
@@ -2419,7 +2461,6 @@ S-ar putea ca această legătură să fie greșită, sau revizia a fost restaura
'undeletereset' => 'Resetează',
'undeleteinvert' => 'Exclude spațiul',
'undeletecomment' => 'Motiv:',
-'undeletedarticle' => '"[[$1]]" a fost recuperat',
'undeletedrevisions' => '{{PLURAL:$1|o revizie restaurată|$1 revizii restaurate|$1 de revizii restaurate}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revizie|revizii|de revizii}} și $2 {{PLURAL:$2|fișier|fișiere|de fișiere}} recuperate',
'undeletedfiles' => '$1 {{PLURAL:$1|revizie recuperată|revizii recuperate|de revizii recuperate}}',
@@ -2428,6 +2469,7 @@ S-ar putea ca această legătură să fie greșită, sau revizia a fost restaura
Consultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ștergerile și recuperările recente.",
'undelete-header' => 'Vezi [[Special:Log/delete|logul de ștergere]] pentru paginile șterse recent.',
+'undelete-search-title' => 'Căutare pagini șterse',
'undelete-search-box' => 'Caută pagini șterse',
'undelete-search-prefix' => 'Arată paginile care încep cu:',
'undelete-search-submit' => 'Caută',
@@ -2437,6 +2479,7 @@ Consultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ș
'undelete-cleanup-error' => 'Eroare la È™tergerea arhivei nefolosite „$1â€.',
'undelete-missing-filearchive' => 'Nu poate fi restaurată arhiva fișierul cu ID-ul $1 pentru că nu există în baza de date.
S-ar putea ca ea să fi fost deja restaurată.',
+'undelete-error' => 'Eroare la recuperarea paginii',
'undelete-error-short' => 'Eroare la restaurarea fișierului: $1',
'undelete-error-long' => 'S-au găsit erori la ștergerea fișierului:
@@ -2558,6 +2601,7 @@ Vezi [[Special:BlockList|lista de adrese IP și conturi blocate]] pentru a reviz
'blocklist-userblocks' => 'Ascunde conturile blocate',
'blocklist-tempblocks' => 'Ascunde blocările temporare',
'blocklist-addressblocks' => 'Ascunde adresele IP blocate',
+'blocklist-rangeblocks' => 'Ascunde blocările de gamă',
'blocklist-timestamp' => 'Data și ora',
'blocklist-target' => 'Utilizator/adresă IP',
'blocklist-expiry' => 'Expiră la',
@@ -2580,6 +2624,7 @@ Vezi [[Special:BlockList|lista de adrese IP și conturi blocate]] pentru a reviz
'unblocklink' => 'deblochează',
'change-blocklink' => 'modifică blocarea',
'contribslink' => 'contribuții',
+'emaillink' => 'trimite e-mail',
'autoblocker' => 'Autoblocat fiindcă folosiÈ›i aceeaÈ™i adresă IP ca È™i „[[User:$1|$1]]â€.
Motivul blocării utilizatorului $1 este: „$2â€',
'blocklogpage' => 'Jurnal blocări',
@@ -2713,9 +2758,6 @@ Te rugăm să le unifici manual.'''",
'movepage-page-moved' => 'Pagina $1 a fost mutată la $2.',
'movepage-page-unmoved' => 'Pagina $1 nu a putut fi mutată la $2.',
'movepage-max-pages' => 'Maxim $1 {{PLURAL:$1|pagină a fost mutată|pagini au fost mutate}}, nicio altă pagină nu va mai fi mutată automat.',
-'1movedto2' => 'a redenumit [[$1]] în [[$2]]',
-'1movedto2_redir' => 'a redenumit [[$1]] în [[$2]] înlocuind redirecționarea',
-'move-redirect-suppressed' => 'redirecționarea a fost suprimată',
'movelogpage' => 'Jurnal mutări',
'movelogpagetext' => 'Mai jos se află o listă cu paginile mutate.',
'movesubpage' => '{{PLURAL:$1|Subpagină|Subpagini}}',
@@ -2728,7 +2770,7 @@ Te rugăm să le unifici manual.'''",
Pagina destinație „[[:$1]]†există deja. Doriți să o ștergeți pentru a face loc redenumirii?',
'delete_and_move_confirm' => 'Da, șterge pagina.',
-'delete_and_move_reason' => 'Șters pentru a face loc redenumirii',
+'delete_and_move_reason' => 'Șters pentru a face loc redenumirii paginii „[[$1]]â€',
'selfmove' => 'Titlurile sursei și ale destinației sunt aceleași; nu puteți muta o pagină peste ea însăși.',
'immobile-source-namespace' => 'Nu se pot redenumi paginile din spaÈ›iul de nume „$1â€',
'immobile-target-namespace' => 'Nu se pot redenumi paginile în spaÈ›iul de nume „$1â€',
@@ -2758,8 +2800,10 @@ Acesta poate fi apoi importate în alt wiki care rulează software MediaWiki pri
Pentru a exporta, introduceți titlurile în căsuța de mai jos, unul pe linie, și alegeți dacă doriți să exportați doar această versiune sau și cele mai vechi, cu istoricul lor, sau versiunea curentă cu informații despre ultima modificare.
ÃŽn al doilea caz puteÈ›i folosi o legătură, de exemplu [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pentru pagina „[[{{MediaWiki:Mainpage}}]]â€.',
+'exportall' => 'Exportă toate paginile',
'exportcuronly' => 'Include numai versiunea curentă, nu și toată istoria',
'exportnohistory' => "---- '''Notă:''' exportarea versiunii complete a paginilor prin acest formular a fost scoasă din uz din motive de performanță.",
+'exportlistauthors' => 'Include o listă completă a contribuitorilor pentru fiecare pagină',
'export-submit' => 'Exportă',
'export-addcattext' => 'Adaugă pagini din categoria:',
'export-addcat' => 'Adaugă',
@@ -2792,6 +2836,8 @@ Vă rugăm să vizitați [//www.mediawiki.org/wiki/Localisation MediaWiki Locali
'thumbnail_error' => 'Eroare la generarea previzualizării: $1',
'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ă',
+'thumbnail-dest-create' => 'Imposibil de salvat miniatura la destinație',
'thumbnail_invalid_params' => 'Parametrii invalizi ai imaginii miniatură',
'thumbnail_dest_directory' => 'Nu poate fi creat directorul destinație',
'thumbnail_image-type' => 'Acest tip de imagine nu este suportat',
@@ -2837,6 +2883,11 @@ Un dosar temporar lipsește.',
'import-upload' => 'Încărcare date XML',
'import-token-mismatch' => 'S-au pierdut datele sesiunii. Vă rugăm să încercați din nou.',
'import-invalid-interwiki' => 'Nu se poate importa din wiki-ul specificat.',
+'import-error-edit' => 'Pagina „$1†nu este importată deoarece nu vă este permis s-o modificați.',
+'import-error-create' => 'Pagina „$1†nu este importată deoarece nu vă este permis s-o creați.',
+'import-error-interwiki' => 'Pagina „$1†nu poate fi importată deoarece numele acesteia este rezervat pentru legături externe (interwiki).',
+'import-error-special' => 'Pagina „$1†nu poate fi importată deoarece aparține unui spațiu de nume special care nu admite pagini.',
+'import-error-invalid' => 'Pagina „$1†nu poate fi importată deoarece numele acesteia este invalid.',
# Import log
'importlogpage' => 'Log import',
@@ -2846,73 +2897,86 @@ Un dosar temporar lipsește.',
'import-logentry-interwiki' => 'transwikificat $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versiune|versiuni|de versiuni}} de la $2',
+# JavaScriptTest
+'javascripttest' => 'Testare JavaScript',
+'javascripttest-disabled' => 'Această funcție este dezactivată.',
+'javascripttest-title' => 'Rulare teste pentru $1',
+'javascripttest-pagetext-noframework' => 'Această pagină este rezervată rulării testelor JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Cadru de testare „$1†necunoscut.',
+'javascripttest-pagetext-frameworks' => 'Alegeți unul din următoarele cadre de testare: $1',
+'javascripttest-pagetext-skins' => 'Alegeți un aspect pentru care să rulați teste:',
+'javascripttest-qunit-intro' => 'A se vedea [$1 documentația de testare] pe mediawiki.org.',
+'javascripttest-qunit-heading' => 'Suita de test MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Pagina dumneavoastră de utilizator',
-'tooltip-pt-anonuserpage' => 'Pagina de utilizator pentru adresa IP curentă',
-'tooltip-pt-mytalk' => 'Pagina dumneavoastră de discuții',
-'tooltip-pt-anontalk' => 'Discuții despre editări pentru adresa IP curentă',
-'tooltip-pt-preferences' => 'Preferințele dumneavoastră',
-'tooltip-pt-watchlist' => 'Lista paginilor pe care le monitorizați',
-'tooltip-pt-mycontris' => 'Listă de contribuții',
-'tooltip-pt-login' => 'Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.',
-'tooltip-pt-anonlogin' => 'Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.',
-'tooltip-pt-logout' => 'Închideți sesiunea de lucru',
-'tooltip-ca-talk' => 'Discuții despre această pagină',
-'tooltip-ca-edit' => 'Puteți modifica această pagină. Înainte de a o salva vă rugăm s-o previzualizați.',
-'tooltip-ca-addsection' => 'Adaugă o nouă secțiune.',
-'tooltip-ca-viewsource' => 'Această pagină este protejată. Puteți vizualiza doar codul sursă',
-'tooltip-ca-history' => 'Versiunile anterioare ale paginii și autorii lor.',
-'tooltip-ca-protect' => 'Protejați această pagină.',
-'tooltip-ca-unprotect' => 'Modificați nivelul de protejare al acestei pagini',
-'tooltip-ca-delete' => 'Ștergeți această pagină.',
-'tooltip-ca-undelete' => 'Restaurează modificările efectuate asupra acestui document înainte de a fi fost șters',
-'tooltip-ca-move' => 'Redenumiți această pagină.',
-'tooltip-ca-watch' => 'Adăugați la lista de pagini urmărite',
-'tooltip-ca-unwatch' => 'Eliminați această pagină din lista dumneavoastră de monitorizare',
-'tooltip-search' => 'Căutare în {{SITENAME}}',
-'tooltip-search-go' => 'Deschide pagina cu acest nume, dacă există',
-'tooltip-search-fulltext' => 'Caută în pagini pentru acest text',
-'tooltip-p-logo' => 'Pagina principală',
-'tooltip-n-mainpage' => 'Vedeți pagina principală',
-'tooltip-n-mainpage-description' => 'Vizitați pagina principală',
-'tooltip-n-portal' => 'Despre proiect, ce puteți face, unde găsiți soluții.',
-'tooltip-n-currentevents' => 'Informații despre evenimentele curente',
-'tooltip-n-recentchanges' => 'Lista ultimelor schimbări realizate în acest wiki.',
-'tooltip-n-randompage' => 'Afișează o pagină aleatoare',
-'tooltip-n-help' => 'Locul în care găsiți ajutor',
-'tooltip-t-whatlinkshere' => 'Lista tuturor paginilor wiki care conduc spre această pagină',
-'tooltip-t-recentchangeslinked' => 'Schimbări recente în legătură cu această pagină',
-'tooltip-feed-rss' => 'Alimentează fluxul RSS pentru această pagină',
-'tooltip-feed-atom' => 'Alimentează fluxul Atom pentru această pagină',
-'tooltip-t-contributions' => 'Vezi lista de contribuții ale acestui utilizator',
-'tooltip-t-emailuser' => 'Trimite un e-mail acestui utilizator',
-'tooltip-t-upload' => 'Încărcare de fișiere',
-'tooltip-t-specialpages' => 'Lista tuturor paginilor speciale',
-'tooltip-t-print' => 'Versiunea de tipărit a acestei pagini',
-'tooltip-t-permalink' => 'Legătura permanentă către această versiune a paginii',
-'tooltip-ca-nstab-main' => 'Vedeți conținutul paginii',
-'tooltip-ca-nstab-user' => 'Vezi pagina de utilizator',
-'tooltip-ca-nstab-media' => 'Vezi pagina media',
-'tooltip-ca-nstab-special' => 'Aceasta este o pagină specială, nu o puteți modifica direct.',
-'tooltip-ca-nstab-project' => 'Vezi pagina proiectului',
-'tooltip-ca-nstab-image' => 'Vezi pagina fiÅŸierului',
-'tooltip-ca-nstab-mediawiki' => 'Vedeți mesajul de sistem',
-'tooltip-ca-nstab-template' => 'Vezi formatul',
-'tooltip-ca-nstab-help' => 'Vezi pagina de ajutor',
-'tooltip-ca-nstab-category' => 'Vezi categoria',
-'tooltip-minoredit' => 'Marcați această modificare ca fiind minoră',
-'tooltip-save' => 'Salvați modificările dumneavoastră',
-'tooltip-preview' => 'Previzualizarea modificărilor dvs., folosiți-o vă rugăm înainte de a salva!',
-'tooltip-diff' => 'Arată-mi modificările efectuate asupra textului',
-'tooltip-compareselectedversions' => 'Vezi diferențele între cele două versiuni selectate de pe această pagină.',
-'tooltip-watch' => 'Adaugă această pagină la lista mea de pagini urmărite',
-'tooltip-recreate' => 'Recreează',
-'tooltip-upload' => 'Pornește încărcarea',
-'tooltip-rollback' => '„Revenire†anulează modificarea(ările) de pe această pagină a ultimului contribuitor printr-o singură apăsare',
-'tooltip-undo' => '"Anulează" șterge această modificare și deschide formularul de modificare în modulul de previzualizare.
+'tooltip-pt-userpage' => 'Pagina dumneavoastră de utilizator',
+'tooltip-pt-anonuserpage' => 'Pagina de utilizator pentru adresa IP curentă',
+'tooltip-pt-mytalk' => 'Pagina dumneavoastră de discuții',
+'tooltip-pt-anontalk' => 'Discuții despre editări pentru adresa IP curentă',
+'tooltip-pt-preferences' => 'Preferințele dumneavoastră',
+'tooltip-pt-watchlist' => 'Lista paginilor pe care le monitorizați',
+'tooltip-pt-mycontris' => 'Listă de contribuții',
+'tooltip-pt-login' => 'Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.',
+'tooltip-pt-anonlogin' => 'Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.',
+'tooltip-pt-logout' => 'Închideți sesiunea de lucru',
+'tooltip-ca-talk' => 'Discuții despre această pagină',
+'tooltip-ca-edit' => 'Puteți modifica această pagină. Înainte de a o salva vă rugăm s-o previzualizați.',
+'tooltip-ca-addsection' => 'Adaugă o nouă secțiune.',
+'tooltip-ca-viewsource' => 'Această pagină este protejată. Puteți vizualiza doar codul sursă',
+'tooltip-ca-history' => 'Versiunile anterioare ale paginii și autorii lor.',
+'tooltip-ca-protect' => 'Protejați această pagină.',
+'tooltip-ca-unprotect' => 'Modificați nivelul de protejare al acestei pagini',
+'tooltip-ca-delete' => 'Ștergeți această pagină.',
+'tooltip-ca-undelete' => 'Restaurează modificările efectuate asupra acestui document înainte de a fi fost șters',
+'tooltip-ca-move' => 'Redenumiți această pagină.',
+'tooltip-ca-watch' => 'Adăugați la lista de pagini urmărite',
+'tooltip-ca-unwatch' => 'Eliminați această pagină din lista dumneavoastră de monitorizare',
+'tooltip-search' => 'Căutare în {{SITENAME}}',
+'tooltip-search-go' => 'Deschide pagina cu acest nume, dacă există',
+'tooltip-search-fulltext' => 'Caută în pagini pentru acest text',
+'tooltip-p-logo' => 'Pagina principală',
+'tooltip-n-mainpage' => 'Vedeți pagina principală',
+'tooltip-n-mainpage-description' => 'Vizitați pagina principală',
+'tooltip-n-portal' => 'Despre proiect, ce puteți face, unde găsiți soluții.',
+'tooltip-n-currentevents' => 'Informații despre evenimentele curente',
+'tooltip-n-recentchanges' => 'Lista ultimelor schimbări realizate în acest wiki.',
+'tooltip-n-randompage' => 'Afișează o pagină aleatoare',
+'tooltip-n-help' => 'Locul în care găsiți ajutor',
+'tooltip-t-whatlinkshere' => 'Lista tuturor paginilor wiki care conduc spre această pagină',
+'tooltip-t-recentchangeslinked' => 'Schimbări recente în legătură cu această pagină',
+'tooltip-feed-rss' => 'Alimentează fluxul RSS pentru această pagină',
+'tooltip-feed-atom' => 'Alimentează fluxul Atom pentru această pagină',
+'tooltip-t-contributions' => 'Vezi lista de contribuții ale acestui utilizator',
+'tooltip-t-emailuser' => 'Trimite un e-mail acestui utilizator',
+'tooltip-t-upload' => 'Încărcare de fișiere',
+'tooltip-t-specialpages' => 'Lista tuturor paginilor speciale',
+'tooltip-t-print' => 'Versiunea de tipărit a acestei pagini',
+'tooltip-t-permalink' => 'Legătura permanentă către această versiune a paginii',
+'tooltip-ca-nstab-main' => 'Vedeți conținutul paginii',
+'tooltip-ca-nstab-user' => 'Vezi pagina de utilizator',
+'tooltip-ca-nstab-media' => 'Vezi pagina media',
+'tooltip-ca-nstab-special' => 'Aceasta este o pagină specială, nu o puteți modifica direct.',
+'tooltip-ca-nstab-project' => 'Vezi pagina proiectului',
+'tooltip-ca-nstab-image' => 'Vezi pagina fiÅŸierului',
+'tooltip-ca-nstab-mediawiki' => 'Vedeți mesajul de sistem',
+'tooltip-ca-nstab-template' => 'Vezi formatul',
+'tooltip-ca-nstab-help' => 'Vezi pagina de ajutor',
+'tooltip-ca-nstab-category' => 'Vezi categoria',
+'tooltip-minoredit' => 'Marcați această modificare ca fiind minoră',
+'tooltip-save' => 'Salvați modificările dumneavoastră',
+'tooltip-preview' => 'Previzualizarea modificărilor dvs., folosiți-o vă rugăm înainte de a salva!',
+'tooltip-diff' => 'Arată-mi modificările efectuate asupra textului',
+'tooltip-compareselectedversions' => 'Vezi diferențele între cele două versiuni selectate de pe această pagină.',
+'tooltip-watch' => 'Adaugă această pagină la lista mea de pagini urmărite',
+'tooltip-watchlistedit-normal-submit' => 'Șterge titluri',
+'tooltip-watchlistedit-raw-submit' => 'Actualizează lista paginilor urmărite',
+'tooltip-recreate' => 'Recreează',
+'tooltip-upload' => 'Pornește încărcarea',
+'tooltip-rollback' => '„Revenire†anulează modificarea(ările) de pe această pagină a ultimului contribuitor printr-o singură apăsare',
+'tooltip-undo' => '"Anulează" șterge această modificare și deschide formularul de modificare în modulul de previzualizare.
Permite adăugarea unui motiv în descrierea modificărilor',
-'tooltip-preferences-save' => 'Salvează preferințele',
-'tooltip-summary' => 'Descrieți pe scurt modificarea',
+'tooltip-preferences-save' => 'Salvează preferințele',
+'tooltip-summary' => 'Descrieți pe scurt modificarea',
# Stylesheets
'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
@@ -2988,9 +3052,6 @@ Permite adăugarea unui motiv în descrierea modificărilor',
# Patrol log
'patrol-log-page' => 'Jurnal verificări',
'patrol-log-header' => 'Aceasta este o listă a tuturor versiunilor marcate ca verificate.',
-'patrol-log-line' => 'a marcat $1 a paginii $2 ca verificată $3',
-'patrol-log-auto' => '(automat)',
-'patrol-log-diff' => 'versiunea $1',
'log-show-hide-patrol' => '$1 jurnalul versiunilor verificate',
# Image deletion
@@ -3018,11 +3079,11 @@ Executându-l, sistemul dvs. poate fi compromis.",
'file-info' => 'mărime fișier: $1, tip MIME: $2',
'file-info-size' => '$1 × $2 pixeli, mărime fișier: $3, tip MIME: $4',
'file-info-size-pages' => '$1 × $2 pixeli, mărime fișier: $3, tip MIME: $4, $5 {{PLURAL:$5|pagină|pagini}}',
-'file-nohires' => '<small>Rezoluții mai mari nu sunt disponibile.</small>',
+'file-nohires' => 'Rezoluții mai mari nu sunt disponibile.',
'svg-long-desc' => 'fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
'show-big-image' => 'Mărește rezoluția imaginii',
-'show-big-image-preview' => '<small>Mărimea acestei previzualizări: $1.</small>',
-'show-big-image-other' => '<small>Alte rezoluții: $1.</small>',
+'show-big-image-preview' => 'Mărimea acestei previzualizări: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Altă rezoluție|Alte rezoluții}}: $1.',
'show-big-image-size' => '$1 × $2 pixeli',
'file-info-gif-looped' => 'în buclă',
'file-info-gif-frames' => '$1 {{PLURAL:$1|imagine|imagini}}',
@@ -3043,8 +3104,11 @@ Executându-l, sistemul dvs. poate fi compromis.",
'sp-newimages-showfrom' => 'Arată imaginile noi începând cu $1, ora $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'o',
-'days-abbrev' => 'z',
+'seconds' => '{{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}',
+'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}}',
+'ago' => '$1 în urmă',
# Bad image list
'bad_image_list' => 'Formatul este următorul:
@@ -3540,13 +3604,6 @@ Acest cod de confirmare va expira la $4.',
'scarytranscludefailed' => '[Șiretlicul formatului a dat greș pentru $1]',
'scarytranscludetoolong' => '[URL-ul este prea lung]',
-# Trackbacks
-'trackbackbox' => 'Urmăritori la acest articol:<br />
-$1',
-'trackbackremove' => '([$1 Șterge])',
-'trackbacklink' => 'Urmăritor',
-'trackbackdeleteok' => 'Urmăritorul a fost șters cu succes.',
-
# Delete conflict
'deletedwhileediting' => "'''Atenție''': Această pagină a fost ștearsă după ce ați început s-o modificați!",
'confirmrecreate' => "Utilizatorul [[User:$1|$1]] ([[User talk:$1|discuție]]) a șters acest articol după ce ați început să contribuiți la el din motivul:
@@ -3627,6 +3684,9 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
'watchlisttools-edit' => 'Vezi și modifică lista paginilor urmărite',
'watchlisttools-raw' => 'Modifică lista brută a paginilor urmărite',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discuție]])',
+
# Core parser functions
'unknown_extension_tag' => 'Extensie etichetă necunoscută „$1â€',
'duplicate-defaultsort' => "'''AtenÈ›ie:''' Cheia de sortare implicită („$2â€) o înlocuieÈ™te pe precedenta („$1â€).",
@@ -3725,13 +3785,16 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'tags-hitcount' => '$1 {{PLURAL:$1|modificare|modificări}}',
# Special:ComparePages
-'comparepages' => 'Comparație între pagini',
-'compare-selector' => 'Comparație între versiuni',
-'compare-page1' => 'Pagina 1',
-'compare-page2' => 'Pagina 2',
-'compare-rev1' => 'Versiunea 1',
-'compare-rev2' => 'Versiunea 2',
-'compare-submit' => 'Comparație',
+'comparepages' => 'Comparație între pagini',
+'compare-selector' => 'Comparație între versiuni',
+'compare-page1' => 'Pagina 1',
+'compare-page2' => 'Pagina 2',
+'compare-rev1' => 'Versiunea 1',
+'compare-rev2' => 'Versiunea 2',
+'compare-submit' => 'Comparație',
+'compare-invalid-title' => 'Titlul specificat nu este corect.',
+'compare-title-not-exists' => 'Titlul specificat nu există.',
+'compare-revision-not-exists' => 'Versiunea specificată nu există.',
# Database error messages
'dberr-header' => 'Acest site are o problemă',
@@ -3758,4 +3821,90 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'sqlite-has-fts' => '$1 cu suport de căutare în tot textul',
'sqlite-no-fts' => '$1 fără suport de căutare în tot textul',
+# New logging system
+'logentry-delete-delete' => '$1 a șters pagina $3',
+'logentry-delete-restore' => '$1 a restaurat pagina $3',
+'logentry-delete-event' => '$1 a schimbat vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} în $3: $4',
+'logentry-delete-revision' => '$1 a schimbat vizibilitatea {{PLURAL:$5|unei modificări|a $5 modificări|a $5 de modificări}} din pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 a modificat vizibilitatea evenimentelor din jurnal în $3',
+'logentry-delete-revision-legacy' => '$1 a modificat vizibilitatea modificărilor de pe pagina $3',
+'logentry-suppress-delete' => '$1 a suprimat pagina $3',
+'logentry-suppress-event' => '$1 a modificat în mod secret vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} în $3: $4',
+'logentry-suppress-revision' => '$1 a modificat în mod secret vizibilitatea {{PLURAL:$5|unei modificări|a $5 modificări|a $5 de modificări}} din pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 a modificat în mod secret vizibilitatea evenimentelor din jurnal în $3',
+'logentry-suppress-revision-legacy' => '$1 a modificat în mod secret vizibilitatea modificărilor de pe pagina $3',
+'revdelete-content-hid' => 'conținut ascuns',
+'revdelete-summary-hid' => 'descrierea modificării ascunsă',
+'revdelete-uname-hid' => 'nume de utilizator ascuns',
+'revdelete-content-unhid' => 'conținut afișat',
+'revdelete-summary-unhid' => 'descrierea modificării, afișată',
+'revdelete-uname-unhid' => 'numele de utilizator afișat',
+'revdelete-restricted' => 'restricții aplicate administratorilor',
+'revdelete-unrestricted' => 'restricții eliminate pentru administratori',
+'logentry-move-move' => '$1 a redenumit pagina $3 în $4',
+'logentry-move-move-noredirect' => '$1 a redenumit pagina $3 în $4 fără a lăsa o redirecționare în loc',
+'logentry-move-move_redir' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea',
+'logentry-move-move_redir-noredirect' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea și fără a lăsa o redirecționare în loc',
+'logentry-patrol-patrol' => '$1 a marcat versiunea $4 a paginii $3 ca patrulată',
+'logentry-patrol-patrol-auto' => '$1 a marcat automat versiunea $4 a paginii $3 ca patrulată',
+'logentry-newusers-newusers' => '$1 a creat un cont de utilizator',
+'logentry-newusers-create' => '$1 a creat un cont de utilizator',
+'logentry-newusers-create2' => '$1 a creat un cont de utilizator $3',
+'logentry-newusers-autocreate' => 'Contul $1 a fost creat în mod automat',
+'newuserlog-byemail' => 'parola trimisă prin e-mail',
+
+# Feedback
+'feedback-bugornote' => 'Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [ $1 raportați un bug].
+ÃŽn caz contrar, puteÈ›i utiliza formularul de mai jos. Comentariul dumneavoastră va fi adăugat pe pagina „[ $3 $2 ]â€, împreună cu numele de utilizator È™i numele navigatorului pe care îl folosiÈ›i.',
+'feedback-subject' => 'Subiect:',
+'feedback-message' => 'Mesaj:',
+'feedback-cancel' => 'Revocare',
+'feedback-submit' => 'Trimite părerea',
+'feedback-adding' => 'Se adaugă părerea pe pagină...',
+'feedback-error1' => 'Eroare: Rezultat necunoscut de la API',
+'feedback-error2' => 'Eroare: editarea nu a reușit',
+'feedback-error3' => 'Eroare: Niciun răspuns de la API',
+'feedback-thanks' => 'MulÈ›umim! Comentariile dumneavoastră au fost publicate pe pagina „[ $2 $1 ]â€.',
+'feedback-close' => 'Gata',
+'feedback-bugcheck' => 'Minunat! Trebuie doar să verificați dacă nu cumva problema a fost [$1 deja înregistrată].',
+'feedback-bugnew' => 'Am verificat. O raportez drept o problemă nouă',
+
+# API errors
+'api-error-badaccess-groups' => 'Nu aveți dreptul să încărcați fișiere pe acest wiki.',
+'api-error-badtoken' => 'Eroare internă: jeton greșit.',
+'api-error-copyuploaddisabled' => 'Încărcarea prin URL este dezactivată pe acest server.',
+'api-error-duplicate' => 'Există {{PLURAL:$1|un [$2 alt fișier]|[$2 alte fișiere]}} deja încărcate cu același conținut.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|A existat [$2 un alt fișier]|Au existat [$2 alte fișiere]}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Fișierul|Fișierele}} {{PLURAL:$1|duplicat|duplicate}} care {{PLURAL:$1|a|au}} fost deja {{PLURAL:$1|șters|șterse}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Fișier|Fișiere}} {{PLURAL:$1|duplicat|duplicate}}',
+'api-error-empty-file' => 'Fișierul încărcat de dumneavoastră este gol.',
+'api-error-emptypage' => 'Crearea paginilor noi, goale nu este permisă.',
+'api-error-fetchfileerror' => 'Eroare internă: ceva nu a funcționat corect la prelucrarea fișierului.',
+'api-error-file-too-large' => 'Fișierul pe care l-ați trimis este prea mare.',
+'api-error-filename-tooshort' => 'Numele fișierului este prea scurt.',
+'api-error-filetype-banned' => 'Acest tip de fișiere este interzis.',
+'api-error-filetype-missing' => 'Fișierului îi lipsește extensia.',
+'api-error-hookaborted' => 'Modificarea pe care ați încercat să o faceți a fost oprită de sesizarea unei extensii.',
+'api-error-http' => 'Eroare internă: nu s-a reușit conectarea la server.',
+'api-error-illegal-filename' => 'Numele acordat fișierului nu este permis.',
+'api-error-internal-error' => 'Eroare internă: ceva nu a funcționat în timpul procesării încărcării.',
+'api-error-invalid-file-key' => 'Eroare internă: fișierul nu a fost găsit în depozitul temporar.',
+'api-error-missingparam' => 'Eroare internă: lipsesc parametrii cererii.',
+'api-error-missingresult' => 'Eroare internă: nu s-a putut determina dacă copierea a reușit.',
+'api-error-mustbeloggedin' => 'Trebuie să fiți autentificat pentru a încărca fișiere.',
+'api-error-mustbeposted' => 'Eroare internă: cererea necesită metoda HTTP POST.',
+'api-error-noimageinfo' => 'Încărcarea a reușit, dar serverul nu a dat nicio informație despre fișier.',
+'api-error-nomodule' => 'Eroare internă: niciun modul de încărcare setat.',
+'api-error-ok-but-empty' => 'Eroare internă: niciun răspuns de la server.',
+'api-error-overwrite' => 'Nu este permisă suprascrierea unui fișier existent.',
+'api-error-stashfailed' => 'Eroare internă: serverul nu a putut stoca fișierul temporar.',
+'api-error-timeout' => 'Serverul nu a răspuns în timp util.',
+'api-error-unclassified' => 'A apărut o eroare necunoscută.',
+'api-error-unknown-code' => 'Eroare necunoscută: „$1â€',
+'api-error-unknown-error' => 'Eroare internă: ceva nu a funcționat atunci când ați încercat să încărcați fișierul.',
+'api-error-unknown-warning' => 'Avertisment necunoscut: $1',
+'api-error-unknownerror' => 'Eroare necunoscută: „$1â€.',
+'api-error-uploaddisabled' => 'Încărcarea este dezactivată pe acest wiki.',
+'api-error-verification-error' => 'Acest fișier ar putea fi corupt sau poate avea extensia greșită.',
+
);
diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php
index 9b88bded..7b50c11c 100644
--- a/languages/messages/MessagesRoa_tara.php
+++ b/languages/messages/MessagesRoa_tara.php
@@ -292,6 +292,7 @@ Vide [[Special:Version|Versione d'a pàgene]].",
'ok' => 'OK',
'pagetitle' => '$1 - {{SITENAME}}',
'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '↠$1',
'retrievedfrom' => 'Pigghjete da "$1"',
'youhavenewmessages' => 'Tu tine $1 ($2).',
'newmessageslink' => 'messàgge nuève',
@@ -391,23 +392,25 @@ Pe piacere manne 'na comunicazzione a 'n'[[Special:ListUsers/sysop|amministrator
'badarticleerror' => "Quest'azione non ge pò essere fatte sus 'a sta pàgene.",
'cannotdelete' => '\'A pàgene o \'u file "$1" non ge pò essere scangellate.
Pò essere ca ggià ha state scangellete da quacche otre.',
+'cannotdelete-title' => 'Non ge puè scangellà \'a 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.",
-'perfcached' => "'U date segeunde stè jndr'à cache e non ge pò essere aggiornete.",
-'perfcachedts' => "'U date segeunde stè jndr'à cache e l'urteme aggiornamente ha state $1.",
+'perfcached' => "'U date seguende stè jndr'à cache e non ge pò essere aggiornate. 'Nu massime de {{PLURAL:$1|'nu resultate ste|$1 resultate stonne}} disponibbile jndr'à cache.",
+'perfcachedts' => "'U date seguende stè jndr'à cache e, l'urteme aggiornamende ha state $1. 'Nu massime de {{PLURAL:$4|'nu resultate ste|$4 resultate stonne}} disponibbile jndr'à cache.",
'querypage-no-updates' => "L'aggiornaminde pe sta pàgene sonde, pe mò, disabbilitete.
Le date ca stonne aqquà jndre non ge sonde aggiornete.",
'wrong_wfQuery_params' => "Parametre incorrette sus 'a wfQuery()<br />
Function: $1<br />
Query: $2",
'viewsource' => "Vide 'u sorgende",
-'viewsourcefor' => 'pe $1',
+'viewsource-title' => "Vide 'a sorgende pe $1",
'actionthrottled' => 'Azione inderrotte',
'actionthrottledtext' => "Cumme 'na mesure andi-spam, tu è state limitete da fà st'azione troppe vote jndr'à 'nu timbe piccinne e tu è subranete stu limite.
Pe piacere prueve cchiù tarde.",
'protectedpagetext' => 'Sta pàgene ha state prutette pe no fa fà cangiaminde a uecchje.',
'viewsourcetext' => "Tu puè vedè e cupià 'a sorgente de sta pàgene:",
+'viewyourtext' => "Tu puè vedè e copià 'a sorgende de '''le cangiaminde tune''' a sta pàgene:",
'protectedinterface' => "Sta pàgene te dè l'inderfacce de teste pìu software e jè blocchete pe prevenì l'abbuse.",
'editinginterface' => "'''Fà attenziò:''' Tu ste cange 'na pàgene ca jè ausete 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.
@@ -519,6 +522,7 @@ Nisciuna mail t'avène mannete pe tutte le seguende dettaglie.",
'emailconfirmlink' => "Conferme l'indirizze e-mail tue",
'invalidemailaddress' => "L'indirizze e-mail non ge pò essere accettete cumme l'è scritte purcè tène 'nu formete invalide.
Pe piacere mitte l'indirizze a cumme criste cumanne, ce nò no 'u scè mettènne proprie.",
+'cannotchangeemail' => "Le indirizze e-mail d'u cunde utende non ge ponne essere cangiate sus a sta uicchi.",
'accountcreated' => 'cunde utende ccrejete',
'accountcreatedtext' => "'U cunde utende pe $1 ha state ccrejete.",
'createaccount-title' => "Ccreazzione de 'u cunde utende pe {{SITENAME}}",
@@ -535,6 +539,7 @@ Pe piacere vide c'aspitte 'nu picche de timbe apprime de pruvà 'n'otra vote.",
# E-mail sending
'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
+'user-mail-no-addy' => "E' pruvate a mannà 'na mail senze 'u 'ndirizze mail",
# Change password dialog
'resetpass' => "Cange 'a password",
@@ -556,31 +561,46 @@ Pò essere ca tu è già cangete 'a password toje o è richieste una temboranea
'resetpass-temp-password' => 'Password temboranea:',
# Special:PasswordReset
-'passwordreset' => "Azzere 'a passuord",
-'passwordreset-text' => "Comblete stu module pe avè 'na mail pe arrecurdarte le dettaglie d'u cunde tune.",
-'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-username' => 'Nome utende:',
-'passwordreset-domain' => 'Dominie:',
-'passwordreset-email' => 'Indirizze e-mail:',
-'passwordreset-emailtitle' => "Dettaglie d'u cunde utende sus a {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:
+'passwordreset' => "Azzere 'a passuord",
+'passwordreset-text' => "Comblete stu module pe avè 'na mail pe arrecurdarte le dettaglie d'u cunde tune.",
+'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-username' => 'Nome utende:',
+'passwordreset-domain' => 'Dominie:',
+'passwordreset-capture' => "Vide 'a mail resultande?",
+'passwordreset-capture-help' => "Ce tu signe sta sckatele, 'a mail (cu 'a passuord temboranèe) t'avène fatte vedè cumme adda essere mannate a l'utende.",
+'passwordreset-email' => 'Indirizze e-mail:',
+'passwordreset-emailtitle' => "Dettaglie d'u cunde utende sus a {{SITENAME}}",
+'passwordreset-emailtext-ip' => "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:
$2
{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.
Tu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
-'passwordreset-emailtext-user' => "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}
+'passwordreset-emailtext-user' => "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}
($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:
$2
{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.
Tu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
-'passwordreset-emailelement' => 'Nome utende: $1<br />
+'passwordreset-emailelement' => 'Nome utende: $1<br />
Passuord temboranèe: $2',
-'passwordreset-emailsent' => "'N'e-mail pe arrecurdarte ha state mannate.",
+'passwordreset-emailsent' => "'N'e-mail pe arrecurdarte ha state mannate.",
+'passwordreset-emailsent-capture' => "'Na e-mail de promemorie ha state mannate, ca jè fatte vedè aqquà sotte.",
+'passwordreset-emailerror-capture' => "'Na e-mail de promemorie ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a l'utende ha fallite: $1",
+
+# Special:ChangeEmail
+'changeemail' => "Cange 'u 'ndirizze e-mail",
+'changeemail-header' => "Cange 'u 'ndirizze e-mail d'u cunde",
+'changeemail-text' => "Comblete stu module pe cangià 'u 'ndirizze mail tune. Tu è abbesogne de sckaffà 'a passuord toje pe confermà 'u cangiamende.",
+'changeemail-no-info' => 'Tu a essere collegate pe accedere a sta pàgene direttamende.',
+'changeemail-oldemail' => 'Indirizze e-mail de mò:',
+'changeemail-newemail' => 'Indirizze e-mail nuève:',
+'changeemail-none' => '(ninde)',
+'changeemail-submit' => 'Cange e-mail',
+'changeemail-cancel' => 'Annulle',
# Edit page toolbar
'bold_sample' => 'Teste grascette',
@@ -653,9 +673,6 @@ Vide Bbuene ca tu non ge puè ausà 'a funziona \"manne n'e-mail a stu utende\"
L'indirizze IP corrende jè \$3, e 'u codece d'u blocche jè #\$5.
Pe piacere mitte tutte le dettaglie ca ponne essere utile pe le richieste tue.",
'blockednoreason' => 'nisciune mutive',
-'blockedoriginalsource' => "'A sorgende de '''$1''' jè mostreta aqquà sotte:",
-'blockededitsource' => "'U teste de le '''cangiaminde tue''' sus a '''$1''' ìu stè vide aqquà sotte:",
-'whitelistedittitle' => "Pe fa le cangiaminde t'a collegà",
'whitelistedittext' => 'Tu ha $1 pàggene da cangià.',
'confirmedittext' => "Tu a confermà l'indirizze e-mail tue apprime de cangià le pàggene.
Pe piacere mitte e validesce l'indirizze e-mail tue ausanne le [[Special:Preferences|preferenze de l'utende]].",
@@ -747,7 +764,7 @@ Tu na promettere pure ca le cose ca scrive tu, sonde 'mbormaziune libbere o copi
Ce tu non ge vuè ca quidde ca scrive avène cangete da tre, allore non scè scrivenne proprie aqquà.<br />
Tu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o lè cupiate da risorse de pubbliche dominie o sembre robba libbere (vide $1 pe cchiù dettaglie).
'''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
-'longpageerror' => "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe $1 kilobyte, invece 'u limite massime jè de $2 kilobyte.'''
+'longpageerror' => "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe $1 kilobyte, invece 'u limite massime jè de {{PLURAL:$2|$2}} kilobyte.'''
Non ge puè reggistrà sta pàggene.",
'readonlywarning' => "'''FA ATTENZIO': 'U database ha state bloccate pe manutenziona, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''
Tu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tue e pò cchiù tarde le reggistre sus 'a Uicchi.
@@ -917,8 +934,6 @@ Otre amministrature sus a {{SITENAME}}ponne angore trasè jndr'à 'u condenute s
'revdelete-unsuppress' => 'Live le restriziune sus a le revisiune repristinate',
'revdelete-log' => 'Mutive:',
'revdelete-submit' => "Applichesce a {{PLURAL:$1|'a revisione|le revisiune}} selezionate",
-'revdelete-logentry' => "ha state cangete 'a visibbilità d'a revisione de [[$1]]",
-'logdelete-logentry' => "ha state cangete 'a visibbilità de l'evende de [[$1]]",
'revdelete-success' => "'''Visibbilità de le revisiune aggiornate correttamende.'''",
'revdelete-failure' => "''' 'A visibbilità de le revisiune non ge pò essere aggiornate:'''
$1",
@@ -931,15 +946,6 @@ $1",
'revdel-restore-visible' => 'Revisiune visibbele',
'pagehist' => "Storie d'a vôsce",
'deletedhist' => "Storie d'u scangellamende",
-'revdelete-content' => 'condenute',
-'revdelete-summary' => "cange 'u riepileghe",
-'revdelete-uname' => "nome de l'utende",
-'revdelete-restricted' => 'appliche le restriziune a le SysOps',
-'revdelete-unrestricted' => 'live le restriziune a le SysOps',
-'revdelete-hid' => 'scunne $1',
-'revdelete-unhid' => 'fa vedè $1',
-'revdelete-log-message' => '$1 pe $2 {{PLURAL:$2|revisione|revisione}}',
-'logdelete-log-message' => '$1 pe $2 {{PLURAL:$2|fatte|fatte}}',
'revdelete-hide-current' => "Errore scunnènne le artichele datate $2, $1: queste ète 'a versiona corrende.
Non ge pò essere scunnute.",
'revdelete-show-no-access' => 'Errore facenne vedè le artichele datate $2, $1: quiste artichele ha state signate "ristrette".
@@ -1099,12 +1105,14 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
'prefs-rc' => 'Cangiaminde recende',
'prefs-watchlist' => 'Pàggene condrollete',
'prefs-watchlist-days' => "Giurne da fà vedè jndr'à liste de le pàggene condrollete:",
-'prefs-watchlist-days-max' => 'Massime 7 sciurne',
+'prefs-watchlist-days-max' => 'Massime $1 {{PLURAL:$1|sciurne|sciurne}}',
'prefs-watchlist-edits' => "Numere massime de cangiaminde ca se ponne fa vedè jndr'à liste de le pàggene condrollete spannute:",
'prefs-watchlist-edits-max' => 'Numere massime: 1000',
'prefs-watchlist-token' => 'Token de le pàggene condrollate:',
'prefs-misc' => 'Misc',
'prefs-resetpass' => "Cange a 'password",
+'prefs-changeemail' => 'Cange e-mail',
+'prefs-setemail' => "Mitte 'n'indirizze e-mail",
'prefs-email' => "Opziune de l'e-mail",
'prefs-rendering' => 'Aspette',
'saveprefs' => 'Reggistre',
@@ -1166,6 +1174,7 @@ Quiste non ge pò essere annullate.",
'yourrealname' => 'Nome vere:',
'yourlanguage' => 'Lènga:',
'yourvariant' => "Variande d'u condenute d'a lènghe:",
+'prefs-help-variant' => 'Tu preferisce variande o ortografije da fà vedè le vôsce de sta uicchi.',
'yournick' => 'Firma toje:',
'prefs-help-signature' => "Le commende sus a le pàggene de le 'ngazzaminde avessere a essere sgnate cu \"<nowiki>~~~~</nowiki>\" ca pò avène convertite cu 'a firma toje e l'orarie.",
'badsig' => "'A firme grezze jè sbagliete.
@@ -1207,7 +1216,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'userrights-lookup-user' => "Gestisce le gruppe de l'utinde",
'userrights-user-editname' => "Mitte 'nu nome utende:",
'editusergroup' => 'Cange le gruppe utinde',
-'editinguser' => "Stè cange le deritte de l'utende de l'utende '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}} [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Stè cange le deritte de l'utende de l'utende '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Cange le gruppe d'utinde",
'saveusergroups' => "Reggistre le gruppe d'utinde",
'userrights-groupsmember' => 'Membre de:',
@@ -1302,13 +1311,13 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'right-autopatrol' => 'Certe cangiaminde tue onne state marcate automaticamende cumme condrollate',
'right-patrolmarks' => 'Vide le cangiaminde recende marcate cumme a condrollate',
'right-unwatchedpages' => "Vide 'na liste de pàggene non condrollete",
-'right-trackback' => "Conferme 'nu trackback",
'right-mergehistory' => "Scuagghie 'a storie de le pàggene",
'right-userrights' => 'Cange tutte le deritte utende',
'right-userrights-interwiki' => "Cange le deritte utende de le utinde sus a l'otre Uicchi",
'right-siteadmin' => "Blocche e sblocche 'u database",
'right-override-export-depth' => "L'esportazione de pàggene inglude pàggene collegate 'mbonde a 'na profonnetà de 5",
'right-sendemail' => "Manne 'a mail a otre utinde",
+'right-passwordreset' => "Vide l'e-mail de azzeramende d'a passuord",
# User rights log
'rightslog' => "Archivie de le diritte de l'utende",
@@ -1342,16 +1351,17 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'action-suppressionlog' => "vide st'archivije privete",
'action-block' => "blocche st'utende pe le cangiaminde",
'action-protect' => "cange 'u levèlle de protezzione pe sta pàgene",
+'action-rollback' => "Annulle velocemende le cangiaminde de l'urteme utende ca ha cangiate 'na pàgena particolare",
'action-import' => "'mborte sta pàgene da n'otra Uicchi",
'action-importupload' => "'mborte sta pàgene da 'nu carecamende de 'nu file",
'action-patrol' => "signe l'otre cangiaminde cumme condrollate",
'action-autopatrol' => 'signà le cangiaminde tue cumme condrollate',
'action-unwatchedpages' => "vide 'a liste de le pàggene ca non ge sonde condrollete",
-'action-trackback' => "conferme 'nu trackback",
'action-mergehistory' => "squagghie 'a sotrie de sta pàgene",
'action-userrights' => "cange tutte le deritte de l'utende",
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cangiaminde|cangiaminde}}',
@@ -1381,11 +1391,11 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'newpageletter' => 'N',
'boteditletter' => 'b',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|utende|utinde}} ca condrollene]',
'rc_categories' => 'Limite de le categorije (separate cu "|")',
'rc_categories_any' => 'Tutte',
'rc-change-size' => '$1',
+'rc-change-size-new' => "$1 {{PLURAL:$1|byte|byte}} apprisse 'u cangiamende",
'newsectionsummary' => '/* $1 */ seziona nove',
'rc-enhanced-expand' => 'Fà vedè le dettaglie (ha ausà JavaScript)',
'rc-enhanced-hide' => 'Scunne le dettaglie',
@@ -1395,7 +1405,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-backlink' => '↠$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'''.",
@@ -1441,6 +1450,7 @@ Vide 'a [[Special:NewFiles|gallerie de le file nuève]] pe vedè l'otre andeprim
'minlength1' => "'U nome d'u file addà tenè almene 'na lettere.",
'illegalfilename' => "'U nome d'u file \"\$1\" tène carattere ca non ge sonde conzendite jndr'à le titele de le pàggene.
Pe piacere vide ce renomene 'u file e pruève a carecarle 'n'otra vote.",
+'filename-toolong' => 'Le nome de le file non ge ponne essere cchiù luènghe de 240 byte.',
'badfilename' => '\'U nome d\'u file ha state cangete jndr\'à "$1".',
'filetype-mime-mismatch' => 'L\'estenzione d\'u file ".$1" non ge se iacchie cu \'u tipe MIME idendificate d\'u file ($2).',
'filetype-badmime' => 'Le file d\'u tipe MIME "$1" non ge se ponne carecà.',
@@ -1554,6 +1564,35 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
'upload-unknown-size' => 'Dimenziona scanusciute',
'upload-http-error' => "S'a verificate 'n'errore HTTP: $1",
+# File backend
+'backend-fail-stream' => "Non ge pozze trasmettere 'u file $1.",
+'backend-fail-backup' => "Non ge pozze cupià 'u file $1.",
+'backend-fail-notexists' => "'U file $1 non g'esiste.",
+'backend-fail-hashes' => "Non ge pozze pigghià le hash d'u file pu combronde.",
+'backend-fail-notsame' => "'Nu file non-indendiche esiste già cumme $1.",
+'backend-fail-invalidpath' => "$1 non g'è 'nu percorse de memorizzazzione valide.",
+'backend-fail-delete' => 'Non ge pozze scangellà \'u file "$1".',
+'backend-fail-alreadyexists' => "'U file $1 già esiste.",
+'backend-fail-store' => "Non ge pozze reggistrà 'u file $1 sus a $2.",
+'backend-fail-copy' => "Non ge pozze cupià 'u file $1 jndr'à $2.",
+'backend-fail-move' => "Non ge pozze spustà 'u file $1 jndr'à $2.",
+'backend-fail-opentemp' => 'Non ge pozze aprè file temboranèe.',
+'backend-fail-writetemp' => 'Non ge pozze scrivere sus a file temboranèe.',
+'backend-fail-closetemp' => 'Non ge pozze achiudere file temboranèe.',
+'backend-fail-read' => "Non ge pozze leggere 'u file $1.",
+'backend-fail-create' => "Non ge pozze ccrejà 'u file $1.",
+
+# Lock manager
+'lockmanager-notlocked' => 'Non ge pozze sbloccà "$1"; jidde non g\'è bloccate.',
+'lockmanager-fail-closelock' => 'Non ge pozze achiudere \'u blocche d\'u file pe "$1".',
+'lockmanager-fail-deletelock' => 'Non ge pozze scangellà \'u blocche d\'u file pe "$1".',
+'lockmanager-fail-acquirelock' => 'Non ge pozze pigghià blocche pe "$1".',
+'lockmanager-fail-openlock' => 'Non ge pozze aprè \'u blocche d\'u file pe "$1".',
+'lockmanager-fail-releaselock' => 'Non ge pozze relassà blocche pe "$1".',
+'lockmanager-fail-db-bucket' => "Non ge pozze condattà 'u database purcé stonne troppe blocche jndr'à $1.",
+'lockmanager-fail-db-release' => "Non ge pozze relassà le blocche sus a 'u database $1.",
+'lockmanager-fail-svr-release' => "Non ge pozze relassà le blocche sus a 'u server $1.",
+
# ZipDirectoryReader
'zip-file-open-error' => "'N'errore ha state acchiate quanne ste apreve 'u file pe le verifeche sus a 'u ZIP.",
'zip-wrong-format' => "'U file specificate non g'ere 'nu file ZIP.",
@@ -1570,6 +1609,7 @@ Non g'è possibbele verificà pa securezze.",
'uploadstash-badtoken' => "L'esecuzione de sta azione non g'ha riuscite, pò essere purcé le credenziale pe le cangiaminde onne scadute. Pruève arrete.",
'uploadstash-errclear' => "'A pulizie de le file non g'ha riuscite.",
'uploadstash-refresh' => "Aggiorne l'elenghe de le file",
+'invalid-chunk-offset' => "distanze d'u chunk invalide",
# img_auth script messages
'img-auth-accessdenied' => 'Accesse negate',
@@ -1671,7 +1711,6 @@ Pe piacere vide 'a [$2 pàgene de descrizione d'u file] pe maggiore 'mbormaziune
# File reversion
'filerevert' => "'Nvirte $1",
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => "'Nvirte 'u file",
'filerevert-intro' => "Tu ste converte 'u file '''[[Media:$1|$1]]''' jndr'à [$4 versione cumme $3, $2].",
'filerevert-comment' => 'Mutive:',
@@ -1681,24 +1720,24 @@ Pe piacere vide 'a [$2 pàgene de descrizione d'u file] pe maggiore 'mbormaziune
'filerevert-badversion' => "Non ge stè 'na versiona locale precedende de stu file cu l'orarie richieste.",
# File deletion
-'filedelete' => 'Scangille $1',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => "Scangille 'u file",
-'filedelete-intro' => "Tu ste scangille stu file '''[[Media:$1|$1]]''' cu tutte 'a storia soje apprisse.",
-'filedelete-intro-old' => "Tu stè scangille 'a versiona de '''[[Media:$1|$1]]''' cumme de [$4 $3, $2].",
-'filedelete-comment' => 'Mutive:',
-'filedelete-submit' => 'Scangille',
-'filedelete-success' => "'''$1''' ha state scangellete.",
-'filedelete-success-old' => "'A versione de '''[[Media:$1|$1]]''' de le $3 d'u $2 ha state scangellete.",
-'filedelete-nofile' => "'''$1''' non g'esiste.",
-'filedelete-nofile-old' => "Non ge stè 'na versiona archiviate de '''$1''' cu le specifiche attrebbute.",
-'filedelete-otherreason' => 'Otre/addizionale mutive:',
-'filedelete-reason-otherlist' => 'Otre mutive',
-'filedelete-reason-dropdown' => "*Mutive comune pe le scangellaminde
+'filedelete' => 'Scangille $1',
+'filedelete-legend' => "Scangille 'u file",
+'filedelete-intro' => "Tu ste scangille stu file '''[[Media:$1|$1]]''' cu tutte 'a storia soje apprisse.",
+'filedelete-intro-old' => "Tu stè scangille 'a versiona de '''[[Media:$1|$1]]''' cumme de [$4 $3, $2].",
+'filedelete-comment' => 'Mutive:',
+'filedelete-submit' => 'Scangille',
+'filedelete-success' => "'''$1''' ha state scangellete.",
+'filedelete-success-old' => "'A versione de '''[[Media:$1|$1]]''' de le $3 d'u $2 ha state scangellete.",
+'filedelete-nofile' => "'''$1''' non g'esiste.",
+'filedelete-nofile-old' => "Non ge stè 'na versiona archiviate de '''$1''' cu le specifiche attrebbute.",
+'filedelete-otherreason' => 'Otre/addizionale mutive:',
+'filedelete-reason-otherlist' => 'Otre mutive',
+'filedelete-reason-dropdown' => "*Mutive comune pe le scangellaminde
** Violazione d'u Copyright
** File duplichete",
-'filedelete-edit-reasonlist' => "Cange le mutive d'a scangellazione",
-'filedelete-maintenance' => "Scangellaminde e repristinaminde de le file jè temboraneamende disabbilitate duranne 'a manutenzione.",
+'filedelete-edit-reasonlist' => "Cange le mutive d'a scangellazione",
+'filedelete-maintenance' => "Scangellaminde e repristinaminde de le file jè temboraneamende disabbilitate duranne 'a manutenzione.",
+'filedelete-maintenance-title' => "Non ge se pò scangellà 'u file",
# MIME search
'mimesearch' => "Ricerca jndr'à 'u MIME",
@@ -1806,6 +1845,7 @@ Mò s'avène redirette a [[$2]].",
'mostimages' => 'Fail cchiù appundete',
'mostrevisions' => 'Pàggene cchiù cangete',
'prefixindex' => "Tutte le pàggene cu 'u prefisse",
+'prefixindex-namespace' => "Tutte le pàggene cu 'u prefisse ($1 namespace)",
'shortpages' => 'Pàggene corte',
'longpages' => 'Pàggene longhe',
'deadendpages' => 'Pàggene senza collegamende',
@@ -1917,12 +1957,8 @@ Protocolle supportate: <tt>$1</tt> (no sce aggiungenne nisciune de chiste jndr\'
'activeusers-noresult' => 'Nisciune utende acchiate.',
# Special:Log/newusers
-'newuserlogpage' => 'Archivije de ccreazione de le utinde',
-'newuserlogpagetext' => "Quiste ète l'archivije de le creazziune de l'utinde.",
-'newuserlog-byemail' => 'password mannete pe e-mail',
-'newuserlog-create-entry' => 'Utende nuève',
-'newuserlog-create2-entry' => 'cunde utende ccrejete pe $1',
-'newuserlog-autocreate-entry' => 'Cunde utende ccrejete automaticamende',
+'newuserlogpage' => 'Archivije de ccreazione de le utinde',
+'newuserlogpagetext' => "Quiste ète l'archivije de le creazziune de l'utinde.",
# Special:ListGroupRights
'listgrouprights' => 'Deritte de le gruppe utinde',
@@ -1953,7 +1989,7 @@ Ponne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus
'emailpagetext' => "Tu puè ausà 'a schermate aqquà sotte pe mannà 'n'email a stu utende.
L'indirizze e-mail ca tu è 'nzerite jndr'à le [[Special:Preferences|preferenze tue]] iesse jndr'à 'u cambe \"Da\" de l'e-mail, accussìa ce riceve 'a mail sape a ce addà responnere.",
'usermailererror' => "L'oggette ''Mail'' ha returnete 'n'errore:",
-'defemailsubject' => 'e-mail de {{SITENAME}}',
+'defemailsubject' => 'e-mail de {{SITENAME}} da l\'utende "$1"',
'usermaildisabled' => "L'e-mail de l'utende è disabbilitate",
'usermaildisabledtext' => 'Tu non ge puè mannà e-mail a otre utinde sus a sta uicchi',
'noemailtitle' => 'Nisciune indirizze e-mail',
@@ -2008,7 +2044,7 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
'watchmethod-list' => 'stoche a condrolle le pàggene condrollete pe le urteme cangiaminde',
'watchlistcontains' => "'A liste de le pàggene condrollete toje condene $1 {{PLURAL:$1|pàgene|pàggene}}.",
'iteminvalidname' => "Probbleme cu 'a vosce '$1', nome invalide...",
-'wlnote' => "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme '''$1''' cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme '''$2''' ore}}.",
+'wlnote' => "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme '''$1''' cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme '''$2''' ore}}, jndr'à $3, $4.",
'wlshowlast' => "Vide l'urteme $1 ore $2 sciurne $3",
'watchlist-options' => "Opzione d'a liste de le pàggene condrollete",
@@ -2066,7 +2102,6 @@ Segnalaziune e otre assistenze:
'exbeforeblank' => "'u condenute apprime d'a pulizie ere: '$1'",
'exblank' => "'a vosce ere vacande",
'delete-confirm' => 'Scangille "$1"',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Scangille',
'historywarning' => "'''Vide Bbuene:''' 'a pàgene ca ste scangille tène 'na storie de cangiaminde cu cchiù o mene $1 {{PLURAL:$1|revisione|revisiune}}:",
'confirmdeletetext' => "Vide Bbuene, vide ca ste scangille 'na pàgene ca tène pure nu sbuenne de cangiaminde.
@@ -2075,8 +2110,6 @@ Conferme quidde ca ste face, ce si sicure ca è capite quidde ca ste cumbine e c
'actionfailed' => 'Aziona fallite',
'deletedtext' => '"$1" onne state scangillete.
Vide $2 pe \'na reggistrazione de le scangellaziune recende.',
-'deletedarticle' => 'scangillete "[[$1]]"',
-'suppressedarticle' => 'soppresse "[[$1]]"',
'dellogpage' => 'Archivie de le scangellaminde',
'dellogpagetext' => "Sotte ste 'na liste de le cchiù recende scangellaziune.",
'deletionlog' => 'Archivije de le scangellaminde',
@@ -2127,8 +2160,10 @@ Vide 'a [[Special:ProtectedPages|liste de le pàggene prutette]] pa liste de le
'unprotectedarticle' => 'sprutette da "[[$1]]"',
'movedarticleprotection' => '\'mbostaziune de protezzione spustate da "[[$2]]" a "[[$1]]"',
'protect-title' => 'Cange levèlle de protezione pe "$1"',
+'protect-title-notallowed' => 'Vide \'u levèlle de protezione pe "$1"',
'prot_1movedto2' => "[[$1]] spustete jndr'à [[$2]]",
-'protect-backlink' => '↠$1',
+'protect-badnamespace-title' => 'Namespace none proteggibbele',
+'protect-badnamespace-text' => "Le pàggene jndr'à stu namespace non ge ponne essere prutette.",
'protect-legend' => "Conferme 'a protezione",
'protectcomment' => 'Mutive:',
'protectexpiry' => 'More:',
@@ -2150,6 +2185,7 @@ Tu puè cangià 'u levèlle de protezione de sta pàgene ma stu cangiamende non
'protect-level-sysop' => 'Sulamende pe le Sysops',
'protect-summary-cascade' => 'a caschete',
'protect-expiring' => "more 'u $1 (UTC)",
+'protect-expiring-local' => "scade 'u $1",
'protect-expiry-indefinite' => 'indefinite',
'protect-cascade' => "Le pàggene prutette 'ngludene sta pàgene (protezione a caschete)",
'protect-cantedit' => 'Tu non ge puè cangià le levèlle de protezzione de sta pàgene, purcè tu non ge tine le diritte pe cangiarle.',
@@ -2210,7 +2246,6 @@ Tu puè avè 'nu collegamende sbagliate o 'a revisione pò essere ca ha state re
'undeletereset' => 'Azzere',
'undeleteinvert' => 'Selezione a smerse',
'undeletecomment' => 'Mutive:',
-'undeletedarticle' => 'ripristinete "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 file}} ripristinete',
@@ -2220,6 +2255,7 @@ quaccheotre pò essere ca ha repristinate 'a pàgene apprime.",
Ligge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
'undelete-header' => "Vide [[Special:Log/delete|l'archivije de le scangellaminde]] pe l'urteme pàggene scangellete.",
+'undelete-search-title' => 'Cirche le pàggene scangellate',
'undelete-search-box' => 'Cirche le pàggene scangellete',
'undelete-search-prefix' => 'Fà vedè le pàggene ca accumenzene cu:',
'undelete-search-submit' => 'Cirche',
@@ -2230,6 +2266,7 @@ Non ge pozze repristinà 'a revisione d'u file cu orarie $1: 'u file ha state pe
'undelete-cleanup-error' => 'Errore scangellanne \'n\'archivije de file non ausate "$1".',
'undelete-missing-filearchive' => "Non ge pozze repristinà 'u file archiviate cu ID $1 purcè non ge stè jndr'à 'u database.
Pò essere ca già ha state scangellate.",
+'undelete-error' => 'Errore pàgene none scangellate',
'undelete-error-short' => 'Errore file non recuperate: $1',
'undelete-error-long' => "Errore ca s'onne acchiate quanne amme pruvate a reprisitinà 'u file:
@@ -2276,7 +2313,6 @@ L'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
'whatlinkshere' => 'Appondene aqquà',
'whatlinkshere-title' => 'Pàggene ca appondene a "$1"',
'whatlinkshere-page' => 'Pàgene:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Le pàggene ca avènene appondene a '''[[:$1]]''':",
'nolinkshere' => "Nisciuna pàgene apponde a '''[[:$1]]'''.",
'nolinkshere-ns' => "Nisciuna pàgene apponde a '''[[:$1]]''' jndr'à 'u namespace scacchiete.",
@@ -2351,6 +2387,7 @@ Vide [[Special:BlockList|'a liste de le IP bloccate]] pe revedè le blocche.",
'blocklist-userblocks' => "Scunne le blocche sus a le cunde de l'utinde",
'blocklist-tempblocks' => 'Scunne le blocche temboranèe',
'blocklist-addressblocks' => 'Scunne le blocche de le IP singole',
+'blocklist-rangeblocks' => 'Scunne le indervalle de blocche',
'blocklist-timestamp' => 'Orarie de stambe',
'blocklist-target' => 'Destinazione',
'blocklist-expiry' => 'Scade',
@@ -2373,6 +2410,7 @@ Vide [[Special:BlockList|'a liste de le IP bloccate]] pe revedè le blocche.",
'unblocklink' => 'sblocche',
'change-blocklink' => "cange 'u blocche",
'contribslink' => 'condrebbute',
+'emaillink' => "manne 'n'e-mail",
'autoblocker' => 'Autobloccate purcè l\'indirizze IP tue ha state recendemente ausate da "[[User:$1|$1]]".
\'U mutive date pu blocche de $1 ète: "$2"',
'blocklogpage' => 'Archivije de le Bloccaminde',
@@ -2504,9 +2542,6 @@ Videta tu 'a màne a 'ngollà 'a pàgena vecchie cu quedda nova.'''",
'movepage-page-moved' => "'A pàgene $1 ha state spustete sus a $2.",
'movepage-page-unmoved' => "'A pàgene $1 non ge pò essere spustate sus a $2.",
'movepage-max-pages' => "'U massime de $1 {{PLURAL:$1|pàgene|pàggene}} ha state spustate e non ge se ne ponne spustà cchiù otre in automatiche.",
-'1movedto2' => "[[$1]] spustete jndr'à [[$2]]",
-'1movedto2_redir' => "spustete [[$1]] jndr'à [[$2]] sus a 'nu ridirezionamende",
-'move-redirect-suppressed' => 'redirezionamende soppresse',
'movelogpage' => 'Archivije de le spustaminde',
'movelogpagetext' => "Sotte stè 'na liste de le pàggene spustete.",
'movesubpage' => '{{PLURAL:$1|Sottepàgene|Sottepàggene}}',
@@ -2519,7 +2554,7 @@ Videta tu 'a màne a 'ngollà 'a pàgena vecchie cu quedda nova.'''",
\'A pàgene de destinazione "[[:$1]]" esiste già.
Tu à vuè ccu scangille o vuè ccù iacchie \'nu mode pe spustarle?',
'delete_and_move_confirm' => "Sine, scangille 'a pàggene",
-'delete_and_move_reason' => "'U scangellamende avène fatte pe spustà",
+'delete_and_move_reason' => '\'U scangellamende avène fatte pe spustà da "[[$1]]"',
'selfmove' => "Le titele sorgende e destinazione sonde le stesse;
non ge se pò movere 'na pàgene sus a sè stesse.",
'immobile-source-namespace' => 'Non ge pozze spustà le pàggene da \'u namespace "$1"',
@@ -2550,9 +2585,11 @@ Quiste po essere 'mbortate jndr'à 'n'otra uicchi ausanne [[Special:Import|'mbor
Pe esportà pàggene, mitte le titele jndr'à scatele de sotte, 'nu titele pe linèe e scacchie ce tu vuè 'a revisiona corrende o tutte le revisiune, ce le linèe d'a storie d'a pàgene, e 'a revisione corrende cu le 'mbormaziune sus a l'urteme cangiamende.
Cumme urteme case, tu puè pure ausà 'nu collegamende, pe esembie [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pa pàgene \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Esporte tutte le pàggene',
'exportcuronly' => "'Nglude sulamende 'a revisiona corrende, non totte 'a storie",
'exportnohistory' => "----
'''Vide Bbuène:''' L'esportazione da storia comblete de le pàggene, ausanne sta maschere, ha state disabbilitate pe mutive de prestaziune.",
+'exportlistauthors' => "'Nglude 'n'elenghe comblete de condrebbutore pe ogne pàgene",
'export-submit' => 'Esporte',
'export-addcattext' => "Aggiunge le pàggene da 'a categorije:",
'export-addcat' => 'Aggiunge',
@@ -2585,6 +2622,8 @@ Pe piacere vè vide [//www.mediawiki.org/wiki/Localisation Localizzazione de Med
'thumbnail_error' => "Errore ccrejanne l'andeprime picenne: $1",
'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",
+'thumbnail-dest-create' => "Non ge se pò reggistrà 'a miniature jndr'à destinazione",
'thumbnail_invalid_params' => 'Parametre pe le miniature invalide',
'thumbnail_dest_directory' => "Non ge pozze ccrejà 'a cartella de destinazione",
'thumbnail_image-type' => 'Tipe de immaggine non supportate',
@@ -2632,6 +2671,8 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
'import-upload' => 'Careche le date in XML',
'import-token-mismatch' => "S'à perse 'a sessione de le date. Pruève 'n'otra vote.",
'import-invalid-interwiki' => "Non ge pozze 'mbortà da 'a Uicchi specificate.",
+'import-error-edit' => 'Pàgene "$1" non g\' \'mbortate purcé tu non ge tìne le permesse pe cangiarle.',
+'import-error-create' => 'Pàgene "$1" non g\' \'mbortate purcé tu non ge tìne le permesse pe ccrejarle.',
# Import log
'importlogpage' => "Archivie de le 'mbortaziune",
@@ -2641,75 +2682,82 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
'import-logentry-interwiki' => 'transuicchied $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revisione|revisiune}} da $2',
+# JavaScriptTest
+'javascripttest' => 'Test de JavaScript',
+'javascripttest-disabled' => 'Sta funzione jè disabbilitate.',
+'javascripttest-title' => 'Stoche a esegue $1 test',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => "'A pàgene utende meje",
-'tooltip-pt-anonuserpage' => "'A pàgene utende pe l'IP ca tu ste cange cumme",
-'tooltip-pt-mytalk' => "'Ngazzaminde mie",
-'tooltip-pt-anontalk' => "'Ngazzamende sus a le cangiaminde da stu indirizze IP",
-'tooltip-pt-preferences' => 'Me piece accussì',
-'tooltip-pt-watchlist' => "'A liste de le pàggene ca ste condrolle pe le camgiaminde",
-'tooltip-pt-mycontris' => 'Liste de le condrebbute mie',
-'tooltip-pt-login' => "Tu si 'ncoraggiete a cullegarte, jidde non g'è 'n'obblighe.",
-'tooltip-pt-anonlogin' => "Tu si 'ncoraggiete a cullegarte; però non g'è 'n'obblighe.",
-'tooltip-pt-logout' => 'Isse',
-'tooltip-ca-talk' => "'Ngazzaminde sus 'a pàgene de le condenute",
-'tooltip-ca-edit' => "Tu puè cangià sta pàgene.
+'tooltip-pt-userpage' => "'A pàgene utende meje",
+'tooltip-pt-anonuserpage' => "'A pàgene utende pe l'IP ca tu ste cange cumme",
+'tooltip-pt-mytalk' => "'Ngazzaminde mie",
+'tooltip-pt-anontalk' => "'Ngazzamende sus a le cangiaminde da stu indirizze IP",
+'tooltip-pt-preferences' => 'Me piece accussì',
+'tooltip-pt-watchlist' => "'A liste de le pàggene ca ste condrolle pe le camgiaminde",
+'tooltip-pt-mycontris' => 'Liste de le condrebbute mie',
+'tooltip-pt-login' => "Tu si 'ncoraggiete a cullegarte, jidde non g'è 'n'obblighe.",
+'tooltip-pt-anonlogin' => "Tu si 'ncoraggiete a cullegarte; però non g'è 'n'obblighe.",
+'tooltip-pt-logout' => 'Isse',
+'tooltip-ca-talk' => "'Ngazzaminde sus 'a pàgene de le condenute",
+'tooltip-ca-edit' => "Tu puè cangià sta pàgene.
Pe piacere ause 'u buttone de l'andeprime apprime de salvà.",
-'tooltip-ca-addsection' => "Fà accumenzà 'na seziona nove",
-'tooltip-ca-viewsource' => "Sta pàgene jè prutette.
+'tooltip-ca-addsection' => "Fà accumenzà 'na seziona nove",
+'tooltip-ca-viewsource' => "Sta pàgene jè prutette.
Puè vedè sulamende 'u sorgende.",
-'tooltip-ca-history' => 'Versiune passete de sta pàgene',
-'tooltip-ca-protect' => 'Prutegge sta pàgene',
-'tooltip-ca-unprotect' => "Cange 'a protezione de sta pàgene",
-'tooltip-ca-delete' => 'Scangille sta pàgene',
-'tooltip-ca-undelete' => 'Repristine le cangiaminde fatte a sta pàgene apprime ca evenève scangellate',
-'tooltip-ca-move' => 'Spuèste sta pàgene',
-'tooltip-ca-watch' => "Aggiunge sta pàgene jndr'à le pàggene condrollete",
-'tooltip-ca-unwatch' => 'No condrollà cchiù sta pàgene',
-'tooltip-search' => 'Cirche {{SITENAME}}',
-'tooltip-search-go' => "Veje 'a pàgene cu 'u nome esatte ce quiste esiste",
-'tooltip-search-fulltext' => 'Cirche le pàggene cu stu teste',
-'tooltip-p-logo' => 'Pàgene Prengepàle',
-'tooltip-n-mainpage' => "Vè vide 'a pàgene prengepàle",
-'tooltip-n-mainpage-description' => "Visite 'a pàgena prengepàle",
-'tooltip-n-portal' => "Parkanne d'u proggette, ce puà fà, addò puè acchjà le cose.",
-'tooltip-n-currentevents' => "Iacchje le 'mbormaziune sus a 'u sfonde de 'u fatte corrende",
-'tooltip-n-recentchanges' => "'A liste de le cangiaminde recende jndr'à uicchi.",
-'tooltip-n-randompage' => "Careche 'na pàgene a uecchje",
-'tooltip-n-help' => "'Nu poste da scuprì",
-'tooltip-t-whatlinkshere' => 'Liste de tutte le pàggene de Uicchi ca appondene aqquà',
-'tooltip-t-recentchangeslinked' => "Cangiaminde recende jndr'à le pàggene appundete da sta pàgene",
-'tooltip-feed-rss' => 'RSS feed pe sta pàgene',
-'tooltip-feed-atom' => 'Atom feed pe sta pàgene',
-'tooltip-t-contributions' => "Vide 'a liste de le condrebbute de quiste utende",
-'tooltip-t-emailuser' => "Manne n'e-mail a stu utende",
-'tooltip-t-upload' => 'Careche le file',
-'tooltip-t-specialpages' => 'Liste de tutte le pàggene speciale',
-'tooltip-t-print' => 'Versiona stambabele de sta pàgene',
-'tooltip-t-permalink' => "Collegamende permanende a sta versione d'a pàgene",
-'tooltip-ca-nstab-main' => "Vide 'a pàgene cu le condenute",
-'tooltip-ca-nstab-user' => "Vide 'a pàgene de l'utende",
-'tooltip-ca-nstab-media' => "Vide 'a pàgene de le media",
-'tooltip-ca-nstab-special' => "Queste jè 'na pàgena speciale, ca tu non ge puè cangià",
-'tooltip-ca-nstab-project' => "Vide 'a pàgene d'u proggette",
-'tooltip-ca-nstab-image' => "Vide 'a pàgene d'u fail",
-'tooltip-ca-nstab-mediawiki' => "Vide le messàgge d'u sisteme",
-'tooltip-ca-nstab-template' => "Fà vedè 'u template",
-'tooltip-ca-nstab-help' => "Vide 'a pàgene d'ajute",
-'tooltip-ca-nstab-category' => 'Vide a pàgene de le categorije',
-'tooltip-minoredit' => "Signe cumme a 'nu cangiaminde stuèdeche",
-'tooltip-save' => 'Reggistre le cangiaminde ca è fatte',
-'tooltip-preview' => "Fà l'andeprime de le cangiaminde ca ste face. Pe piacere falle prima cu reggistre 'a vôsce!",
-'tooltip-diff' => "Fà vedè ce cangiaminde e fatte a 'u teste.",
-'tooltip-compareselectedversions' => "Vide le differenze 'mbrà le doje versiune selezionete de sta pàgene.",
-'tooltip-watch' => "Mitte sta pàgene jndr'à liste de le pàggene condrollete",
-'tooltip-recreate' => "Reccreje 'a pàgene ca avère state scangellate",
-'tooltip-upload' => "Accumenze 'u carecamende",
-'tooltip-rollback' => '"Ripristine" annulle le cangiaminde a sta pàgene de l\'urteme condrebbutore cu \'nu cazzamende',
-'tooltip-undo' => "\"Annulle\" annulle stu cangiamende e iapre 'u form de le cangiaminde facenne vedè l'andeprime.
+'tooltip-ca-history' => 'Versiune passete de sta pàgene',
+'tooltip-ca-protect' => 'Prutegge sta pàgene',
+'tooltip-ca-unprotect' => "Cange 'a protezione de sta pàgene",
+'tooltip-ca-delete' => 'Scangille sta pàgene',
+'tooltip-ca-undelete' => 'Repristine le cangiaminde fatte a sta pàgene apprime ca evenève scangellate',
+'tooltip-ca-move' => 'Spuèste sta pàgene',
+'tooltip-ca-watch' => "Aggiunge sta pàgene jndr'à le pàggene condrollete",
+'tooltip-ca-unwatch' => 'No condrollà cchiù sta pàgene',
+'tooltip-search' => 'Cirche {{SITENAME}}',
+'tooltip-search-go' => "Veje 'a pàgene cu 'u nome esatte ce quiste esiste",
+'tooltip-search-fulltext' => 'Cirche le pàggene cu stu teste',
+'tooltip-p-logo' => 'Pàgene Prengepàle',
+'tooltip-n-mainpage' => "Vè vide 'a pàgene prengepàle",
+'tooltip-n-mainpage-description' => "Visite 'a pàgena prengepàle",
+'tooltip-n-portal' => "Parkanne d'u proggette, ce puà fà, addò puè acchjà le cose.",
+'tooltip-n-currentevents' => "Iacchje le 'mbormaziune sus a 'u sfonde de 'u fatte corrende",
+'tooltip-n-recentchanges' => "'A liste de le cangiaminde recende jndr'à uicchi.",
+'tooltip-n-randompage' => "Careche 'na pàgene a uecchje",
+'tooltip-n-help' => "'Nu poste da scuprì",
+'tooltip-t-whatlinkshere' => 'Liste de tutte le pàggene de Uicchi ca appondene aqquà',
+'tooltip-t-recentchangeslinked' => "Cangiaminde recende jndr'à le pàggene appundete da sta pàgene",
+'tooltip-feed-rss' => 'RSS feed pe sta pàgene',
+'tooltip-feed-atom' => 'Atom feed pe sta pàgene',
+'tooltip-t-contributions' => "Vide 'a liste de le condrebbute de quiste utende",
+'tooltip-t-emailuser' => "Manne n'e-mail a stu utende",
+'tooltip-t-upload' => 'Careche le file',
+'tooltip-t-specialpages' => 'Liste de tutte le pàggene speciale',
+'tooltip-t-print' => 'Versiona stambabele de sta pàgene',
+'tooltip-t-permalink' => "Collegamende permanende a sta versione d'a pàgene",
+'tooltip-ca-nstab-main' => "Vide 'a pàgene cu le condenute",
+'tooltip-ca-nstab-user' => "Vide 'a pàgene de l'utende",
+'tooltip-ca-nstab-media' => "Vide 'a pàgene de le media",
+'tooltip-ca-nstab-special' => "Queste jè 'na pàgena speciale, ca tu non ge puè cangià",
+'tooltip-ca-nstab-project' => "Vide 'a pàgene d'u proggette",
+'tooltip-ca-nstab-image' => "Vide 'a pàgene d'u fail",
+'tooltip-ca-nstab-mediawiki' => "Vide le messàgge d'u sisteme",
+'tooltip-ca-nstab-template' => "Fà vedè 'u template",
+'tooltip-ca-nstab-help' => "Vide 'a pàgene d'ajute",
+'tooltip-ca-nstab-category' => 'Vide a pàgene de le categorije',
+'tooltip-minoredit' => "Signe cumme a 'nu cangiaminde stuèdeche",
+'tooltip-save' => 'Reggistre le cangiaminde ca è fatte',
+'tooltip-preview' => "Fà l'andeprime de le cangiaminde ca ste face. Pe piacere falle prima cu reggistre 'a vôsce!",
+'tooltip-diff' => "Fà vedè ce cangiaminde e fatte a 'u teste.",
+'tooltip-compareselectedversions' => "Vide le differenze 'mbrà le doje versiune selezionete de sta pàgene.",
+'tooltip-watch' => "Mitte sta pàgene jndr'à liste de le pàggene condrollete",
+'tooltip-watchlistedit-normal-submit' => 'Live le titele',
+'tooltip-watchlistedit-raw-submit' => "Aggiorne l'elenghe de le pàggene condrollate",
+'tooltip-recreate' => "Reccreje 'a pàgene ca avère state scangellate",
+'tooltip-upload' => "Accumenze 'u carecamende",
+'tooltip-rollback' => '"Ripristine" annulle le cangiaminde a sta pàgene de l\'urteme condrebbutore cu \'nu cazzamende',
+'tooltip-undo' => "\"Annulle\" annulle stu cangiamende e iapre 'u form de le cangiaminde facenne vedè l'andeprime.
Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
-'tooltip-preferences-save' => 'Reggistre le preferenze',
-'tooltip-summary' => "Mitte 'nu riepileghe piccinne",
+'tooltip-preferences-save' => 'Reggistre le preferenze',
+'tooltip-summary' => "Mitte 'nu riepileghe piccinne",
# Stylesheets
'common.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
@@ -2807,9 +2855,6 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
# Patrol log
'patrol-log-page' => 'Archivije de le condrolle',
'patrol-log-header' => "Quiste è l'archivije de le revisiune condrollate.",
-'patrol-log-line' => 'signate $1 de $2 condrollate $3',
-'patrol-log-auto' => '(automatiche)',
-'patrol-log-diff' => 'revisione $1',
'log-show-hide-patrol' => '$1 archivije de le condrolle',
# Image deletion
@@ -2837,11 +2882,11 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
'file-info' => "dimenzione d'u fail: $1, tipe de MIME: $2",
'file-info-size' => "$1 × $2 pixel, dimenzione d'u fail: $3, tipe de MIME: $4",
'file-info-size-pages' => "$1 × $2 pixel, dimenzione d'u file: $3, tipe de MIME: $4, $5 {{PLURAL:$5|pàgene|pàggene}}",
-'file-nohires' => "<small>Manghe 'a risoluzione ierta.</small>",
+'file-nohires' => "Manghe 'a risoluzione ierta.",
'svg-long-desc' => "Fail SVG, nominalmende sonde $1 × $2 pixel, dimenzione d'u fail: $3",
'show-big-image' => 'Risoluzione chiena chiena',
-'show-big-image-preview' => '<small>Dimenziune de sta andeprime: $1.</small>',
-'show-big-image-other' => '<small>Otre resoluziune: $1.</small>',
+'show-big-image-preview' => 'Dimenziune de sta andeprime: $1.',
+'show-big-image-other' => 'Otre {{PLURAL:$2|resoluzione|resoluziune}}: $1.',
'show-big-image-size' => '$1 x $2 pixel',
'file-info-gif-looped' => 'infinite',
'file-info-gif-frames' => '$1 {{PLURAL:$1|frame|frame}}',
@@ -2862,7 +2907,16 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
'sp-newimages-showfrom' => 'Fa vedè le file nuève partenne da $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2 × $3',
+'video-dims' => '$1, $2 × $3',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
+'days-abbrev' => '$1g',
+'seconds' => '{{PLURAL:$1|seconde|seconde}}',
+'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
+'hours' => '{{PLURAL: $1|$1ore|$1 ore}}',
+'days' => '{{PLURAL: $1|$1 sciurne|$1 sciurne}}',
+'ago' => '$1 fà',
# Bad image list
'bad_image_list' => "'U formete jè 'u seguende:
@@ -2921,6 +2975,11 @@ Variants for Chinese language
'variantname-ike-latn' => 'ike-Latn',
'variantname-iu' => 'iu',
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-Tfng',
+'variantname-shi-latn' => 'shi-Latn',
+'variantname-shi' => 'shi',
+
# Metadata
'metadata' => 'Metadata',
'metadata-help' => "Quiste fail condene 'mbormaziune addizionele, probabilmende aggiunde da 'a machena digitele o 'nu scanner ausete pe ccrejà o digitalizà.
@@ -3454,15 +3513,6 @@ Stu codece de conferme scade 'u \$4.",
'scarytranscludefailed' => "[L'analisi d'u template ha fallite pe $1]",
'scarytranscludetoolong' => '[URL jè troppe longhe]',
-# Trackbacks
-'trackbackbox' => 'Trackback pe sta pàgene:<br />
-$1',
-'trackback' => '; $4 $5: [$2 $1]',
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 Scangille])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => "'U trackback ha state scangellete cu successe.",
-
# Delete conflict
'deletedwhileediting' => "'''Fà attenziò''': Sta pàgene ha state scangellete apprime ca tu acumenzasse a fà 'u cangiamende!",
'confirmrecreate' => "L'utende [[User:$1|$1]] ([[User talk:$1|'Ngazzaminde]]) ha scangellate sta pàgene apprisse ca tu è accumenzate a cangiarle, cu stu mutive:
@@ -3622,6 +3672,7 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
'hebrew-calendar-m12-gen' => 'Elul',
# Signatures
+'signature' => "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|'ngazzaminde]])",
'timezone-utc' => 'UTC',
# Core parser functions
@@ -3724,13 +3775,16 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'tags-hitcount' => '$1 {{PLURAL:$1|cangiamende|cangiaminde}}',
# Special:ComparePages
-'comparepages' => 'Combronde le pàggene',
-'compare-selector' => "Combronde le revisiune d'à pàgene",
-'compare-page1' => 'Pàgene 1',
-'compare-page2' => 'Pàgene 2',
-'compare-rev1' => 'Revisione 1',
-'compare-rev2' => 'Revisione 2',
-'compare-submit' => 'Combronde',
+'comparepages' => 'Combronde le pàggene',
+'compare-selector' => "Combronde le revisiune d'à pàgene",
+'compare-page1' => 'Pàgene 1',
+'compare-page2' => 'Pàgene 2',
+'compare-rev1' => 'Revisione 1',
+'compare-rev2' => 'Revisione 2',
+'compare-submit' => 'Combronde',
+'compare-invalid-title' => "'U titele ca è specificate jè invalide.",
+'compare-title-not-exists' => "'U titele ca è specificate non g'esiste.",
+'compare-revision-not-exists' => "'A revisione ca è specificate non g'esiste.",
# Database error messages
'dberr-header' => "Sta Uicchi tène 'nu probbleme",
@@ -3757,4 +3811,78 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'sqlite-has-fts' => "$1 cu 'u supporte d'a ricerche full-text",
'sqlite-no-fts' => "$1 senze 'u supporte d'a ricerche full-text",
+# New logging system
+'logentry-delete-delete' => '$1 pàgena scangellate $3',
+'logentry-delete-restore' => '$1 pàgena repristinate $3',
+'logentry-delete-event' => "$1 cangiate 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
+'logentry-delete-revision' => "$1 cangiate 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
+'logentry-delete-event-legacy' => "$1 cangiate 'a vesibbilità d'u archivije de le fatte sus 'a $3",
+'logentry-delete-revision-legacy' => "$1 cangiate 'a vesibbilità de le revisiune sus 'a pàgene $3",
+'logentry-suppress-delete' => '$1 pàgena soppresse $3',
+'logentry-suppress-event' => "$1 a scunnute cangiate 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
+'logentry-suppress-revision' => "$1 a scunnute cangiate 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
+'logentry-suppress-event-legacy' => "$1 a scunnute cangiate 'a vesibbilità d'u archivije de le fatte sus 'a $3",
+'logentry-suppress-revision-legacy' => "$1 a scunnute cangiate 'a vesibbilità de le revisiune sus 'a pàgene $3",
+'revdelete-content-hid' => 'condenute scunnute',
+'revdelete-summary-hid' => "riepileghe d'u cangiamende scunnute",
+'revdelete-uname-hid' => "nome de l'utende scunnute",
+'revdelete-content-unhid' => 'condenute fatte vedè',
+'revdelete-summary-unhid' => "riepileghe d'u cangiamende fatte vedè",
+'revdelete-uname-unhid' => "nome de l'utende fatte vedè",
+'revdelete-restricted' => 'appliche le restriziune a le SysOps',
+'revdelete-unrestricted' => 'live le restriziune a le SysOps',
+'logentry-move-move' => '$1 pàgena spustate $3 a $4',
+'logentry-move-move-noredirect' => "$1 pàgena spustate $3 a $4 senze lassà 'nu redirezionamende",
+'logentry-move-move_redir' => "$1 pàgena spustate $3 a $4 cu 'u redirezionamende",
+'logentry-move-move_redir-noredirect' => "$1 pàgena spustate $3 a $4 sus a 'nu redirezionamende senze lassà 'nu redirezionamende",
+'logentry-patrol-patrol' => '$1 revisione marcate $4 de pàgene condrollate $3',
+'logentry-patrol-patrol-auto' => '$1 automaticamende revisione marcate $4 de pàgene condrollate $3',
+'logentry-newusers-newusers' => "$1 ccrejate 'nu cunde utende",
+'logentry-newusers-create' => "$1 ccrejate 'nu cunde utende",
+'logentry-newusers-create2' => "$1 ccrejate 'nu cunde utende $3",
+'logentry-newusers-autocreate' => "'U cunde utende $1 ha state ccrejate automaticamende",
+'newuserlog-byemail' => 'password mannete pe e-mail',
+
+# Feedback
+'feedback-bugornote' => "Ce tu si pronde a descrivere 'nu probbleme tecniche cu le dettaglie pe piacere [\$1 manne 'nu bug].
+Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène aggiunde a 'a pàgene [\$3 \$2]\", seguenne 'u nome utende tune e ce browser tu ste ause.",
+'feedback-subject' => 'Oggette:',
+'feedback-message' => 'Messàgge:',
+'feedback-cancel' => 'Annulle',
+'feedback-submit' => "Conferme 'u feedback",
+'feedback-adding' => "Aggiunge feedback a 'a pàgene...",
+'feedback-error1' => "Errore: resultate inaspettate da l'API",
+'feedback-error2' => 'Errore: Cangiamende fallite',
+'feedback-error3' => "Errore: Nisciuna resposte da l'API",
+'feedback-thanks' => 'Grazie! \'A segnalaziona toje ha state mannate a \'a pàgene "[$2 $1]".',
+'feedback-close' => 'Fatte',
+'feedback-bugcheck' => "Granne! Appene verificate ca non g'è une de le [$1 bug canusciute].",
+'feedback-bugnew' => "Agghie verificate. Manne 'nu bug nuève",
+
+# API errors
+'api-error-badtoken' => 'Errore inderne: Gettone errate.',
+'api-error-duplicate-popup-title' => 'Dupleche {{PLURAL:$1|file|file}}',
+'api-error-empty-file' => "'U file ca tu è confermate ere vacande.",
+'api-error-file-too-large' => "'U file ca tu è confermate jè troppe granne.",
+'api-error-filename-tooshort' => "'U nome d'u file jè troppe curte.",
+'api-error-filetype-banned' => 'Stu tipe de file jè vietate.',
+'api-error-filetype-missing' => "'U file jè senze 'n'estenzione.",
+'api-error-http' => "Errore inderne: Non ge se riesce a collegà a 'u server",
+'api-error-illegal-filename' => "'U nome d'u file non g'è permesse.",
+'api-error-missingparam' => 'Errore inderne: Parametre mangande sus a richieste.',
+'api-error-missingresult' => "Errore inderne: Non ge se pò determinà ce 'a copie ha state fatte.",
+'api-error-mustbeloggedin' => 'Tu a essere collegate pe carecà le file.',
+'api-error-mustbeposted' => "Errore inderne: 'A richieste vole HTTP POST.",
+'api-error-nomodule' => "Errore inderne: Nisciune module de carecamende 'mbostate.",
+'api-error-ok-but-empty' => "Errore inderne: Nisciune resposte da 'u server.",
+'api-error-overwrite' => "'A sovrascritture de 'nu file ca esiste non ge se pò fà.",
+'api-error-stashfailed' => "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
+'api-error-timeout' => "'U server non g'ave resposte jndr'à 'u tiembe ca 'u spettave.",
+'api-error-unclassified' => "'N'errore scanusciute s'a verificate",
+'api-error-unknown-code' => 'Errore scanusciute: "$1"',
+'api-error-unknown-error' => "Errore inderne: Quacche cose ha sciute storte quanne ste pruvave a carecà 'u file tune.",
+'api-error-unknown-warning' => 'Avvertimende scanusciute: $1',
+'api-error-uploaddisabled' => 'Le carecaminde sonde disabbilitate sus a sta Uicchi.',
+'api-error-verification-error' => "Stu file pò essere scuasciate, o ave 'n'estenzione sbagliate.",
+
);
diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php
index e971e415..53a7c77b 100644
--- a/languages/messages/MessagesRu.php
+++ b/languages/messages/MessagesRu.php
@@ -42,6 +42,7 @@
* @author KPu3uC B Poccuu
* @author Kaganer
* @author Kalan
+ * @author KorneySan
* @author Kv75
* @author Lockal
* @author MaxSem
@@ -61,7 +62,7 @@
* @author გიáƒáƒ áƒ’იმელáƒ
*/
-/*
+/**
* Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñделанные в Ñтом файле будут потерÑны при обновлении MediaWiki.
*
* ЕÑли необходимо внеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² перевод отдельных Ñтрок интерфейÑа,
@@ -97,12 +98,15 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'УчаÑтница' => NS_USER,
- 'ОбÑуждение учаÑтницы' => NS_USER_TALK,
'Изображение' => NS_FILE,
'ОбÑуждение_изображениÑ' => NS_FILE_TALK,
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'УчаÑтник', 'female' => 'УчаÑтница' ),
+ NS_USER_TALK => array( 'male' => 'ОбÑуждение_учаÑтника', 'female' => 'ОбÑуждение_учаÑтницы' ),
+);
+
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'xg j, Y',
@@ -132,154 +136,154 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#перенаправление', '#перенапр', '#REDIRECT' ),
- 'notoc' => array( '0', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'МЕСТÐЫЙ_МЕСЯЦ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
- 'subst' => array( '0', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
- 'safesubst' => array( '0', 'ЗÐЩПОДСТ:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'без', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1px' ),
- 'img_center' => array( '1', 'центр', 'center', 'centre' ),
- 'img_framed' => array( '1', 'обрамить', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'безрамки', 'frameless' ),
- 'img_page' => array( '1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'граница', 'border' ),
- 'img_baseline' => array( '1', 'оÑнование', 'baseline' ),
- 'img_sub' => array( '1', 'под', 'sub' ),
- 'img_super' => array( '1', 'над', 'super', 'sup' ),
- 'img_top' => array( '1', 'Ñверху', 'top' ),
- 'img_text_top' => array( '1', 'текÑÑ‚-Ñверху', 'text-top' ),
- 'img_middle' => array( '1', 'поÑередине', 'middle' ),
- 'img_bottom' => array( '1', 'Ñнизу', 'bottom' ),
- 'img_text_bottom' => array( '1', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
- 'img_link' => array( '1', 'ÑÑылка=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
- 'int' => array( '0', 'Ð’ÐУТР:', 'INT:' ),
- 'sitename' => array( '1', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'ПИ:', 'NS:' ),
- 'nse' => array( '0', 'ПИК:', 'NSE:' ),
- 'localurl' => array( '0', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'ПУТЬ_К_СТÐТЬЕ', 'ARTICLEPATH' ),
- 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
- 'grammar' => array( '0', 'ПÐДЕЖ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ИД_ВЕРСИИ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
- 'uc' => array( '0', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
- 'raw' => array( '0', 'ÐЕОБРÐБ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Ð', 'R' ),
- 'newsectionlink' => array( '1', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
- 'padright' => array( '0', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
- 'special' => array( '0', 'ÑлужебнаÑ', 'special' ),
- 'defaultsort' => array( '1', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
- 'hiddencat' => array( '1', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
- 'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
- 'noindex' => array( '1', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'форматдаты', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'ПУТЬ', 'PATH' ),
- 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
- 'url_query' => array( '0', 'ЗÐПРОС', 'QUERY' ),
+ 'redirect' => array( '0', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'МЕСТÐЫЙ_МЕСЯЦ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'ЗÐЩПОДСТ:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'без', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'центр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'обрамить', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'безрамки', 'frameless' ),
+ 'img_page' => array( '1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'граница', 'border' ),
+ 'img_baseline' => array( '1', 'оÑнование', 'baseline' ),
+ 'img_sub' => array( '1', 'под', 'sub' ),
+ 'img_super' => array( '1', 'над', 'super', 'sup' ),
+ 'img_top' => array( '1', 'Ñверху', 'top' ),
+ 'img_text_top' => array( '1', 'текÑÑ‚-Ñверху', 'text-top' ),
+ 'img_middle' => array( '1', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'Ñнизу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
+ 'img_link' => array( '1', 'ÑÑылка=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
+ 'int' => array( '0', 'Ð’ÐУТР:', 'INT:' ),
+ 'sitename' => array( '1', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'ПИ:', 'NS:' ),
+ 'nse' => array( '0', 'ПИК:', 'NSE:' ),
+ 'localurl' => array( '0', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ПУТЬ_К_СТÐТЬЕ', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'ПУТЬ_К_СТИЛЮ', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'ПÐДЕЖ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
+ 'uc' => array( '0', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
+ 'raw' => array( '0', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Ð', 'R' ),
+ 'newsectionlink' => array( '1', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
+ 'padright' => array( '0', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
+ 'special' => array( '0', 'ÑлужебнаÑ', 'special' ),
+ 'defaultsort' => array( '1', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
+ 'hiddencat' => array( '1', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
+ 'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
+ 'noindex' => array( '1', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'форматдаты', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ПУТЬ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
+ 'url_query' => array( '0', 'ЗÐПРОС', 'QUERY' ),
);
$imageFiles = array(
@@ -648,21 +652,23 @@ $1',
'badarticleerror' => 'Это дейÑтвие не может быть выполнено на данной Ñтранице.',
'cannotdelete' => 'Ðевозможно удалить Ñтраницу или файл «$1».
Возможно, Ñтраница уже оказалаÑÑŒ удалена.',
+'cannotdelete-title' => 'ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтраницу «$1»',
'badtitle' => 'ÐедопуÑтимое название',
'badtitletext' => 'Запрашиваемое название Ñтраницы неправильно, пуÑто, либо неправильно указано межъÑзыковое или интервики название. Возможно, в названии иÑпользуютÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы.',
-'perfcached' => 'Следующие данные взÑÑ‚Ñ‹ из кеша и могут не учитывать поÑледних изменений.',
-'perfcachedts' => 'Следующие данные взÑÑ‚Ñ‹ из кеша, поÑледний раз он обновлÑлÑÑ Ð² $1.',
+'perfcached' => 'Следующие данные взÑÑ‚Ñ‹ из кÑша и могут не учитывать поÑледних изменений. Ð’ кÑше хранитÑÑ Ð½Ðµ более $1 {{PLURAL:$1|запиÑи|запиÑей|запиÑей}}.',
+'perfcachedts' => 'Следующие данные взÑÑ‚Ñ‹ из кÑша, поÑледний раз он обновлÑлÑÑ Ð² $1. Ð’ кÑше хранитÑÑ Ð½Ðµ более $4 {{PLURAL:$4|запиÑи|запиÑей|запиÑей}}.',
'querypage-no-updates' => 'Обновление Ñтой Ñтраницы ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾.
ПредÑтавленные здеÑÑŒ данные не будут обновлÑÑ‚ÑŒÑÑ.',
'wrong_wfQuery_params' => 'ÐедопуÑтимые параметры Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ wfQuery()<br />
ФункциÑ: $1<br />
ЗапроÑ: $2',
'viewsource' => 'ПроÑмотр',
-'viewsourcefor' => 'Страница «$1»',
+'viewsource-title' => 'ПроÑмотр иÑходного текÑта Ñтраницы $1',
'actionthrottled' => 'Ограничение по ÑкороÑти',
'actionthrottledtext' => 'Ð’ качеÑтве меры борьбы Ñо Ñпамом, уÑтановлено ограничение на многократное применение данного дейÑÑ‚Ð²Ð¸Ñ Ð² течение короткого промежутка времени. ПожалуйÑта, повторите попытку через неÑколько минут.',
'protectedpagetext' => 'Эта Ñтраница закрыта Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.',
'viewsourcetext' => 'Ð’Ñ‹ можете проÑмотреть и Ñкопировать иÑходный текÑÑ‚ Ñтой Ñтраницы:',
+'viewyourtext' => "Ð’Ñ‹ можете проÑмотреть и Ñкопировать иÑходный текÑÑ‚ '''ваших правок''' на Ñтой Ñтранице:",
'protectedinterface' => 'Эта Ñтраница Ñодержит интерфейÑное Ñообщение программного обеÑпечениÑ. Во избежание вандализма её изменение запрещено.',
'editinginterface' => "'''Внимание:''' Ð’Ñ‹ редактируете Ñтраницу, Ñодержащую текÑÑ‚ интерфейÑа программного обеÑпечениÑ.
Её изменение повлиÑет на внешний вид интерфейÑа Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… пользователей.
@@ -766,6 +772,7 @@ $2',
'emailconfirmlink' => 'Подтвердить ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
'invalidemailaddress' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты не может быть принÑÑ‚, так как он не ÑоответÑтвует формату.
ПожалуйÑта, введите корректный Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ оÑтавьте поле пуÑтым.',
+'cannotchangeemail' => 'ÐдреÑа Ñлектронной почты Ñтой учётной запиÑи не могут быть изменены в Ñтой вики.',
'accountcreated' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñоздана',
'accountcreatedtext' => 'Создана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ учаÑтника $1.',
'createaccount-title' => '{{SITENAME}}: Ñоздание учётной запиÑи',
@@ -783,6 +790,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в PHP-функции mail()',
+'user-mail-no-addy' => 'ПопыталÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ñлектронное пиÑьмо без адреÑа Ñлектронной почты',
# Change password dialog
'resetpass' => 'Изменение паролÑ',
@@ -803,16 +811,18 @@ $2',
'resetpass-temp-password' => 'Временный пароль:',
# Special:PasswordReset
-'passwordreset' => 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ',
-'passwordreset-text' => 'Заполните Ñту форму, чтобы получить в пиÑьме напоминание о параметрах Вашей учётной запиÑи.',
-'passwordreset-legend' => 'СброÑить пароль',
-'passwordreset-disabled' => 'СброÑÑ‹ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹ на Ñтой вики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из чаÑтей данных, показанных ниже}}',
-'passwordreset-username' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
-'passwordreset-domain' => 'Домен:',
-'passwordreset-email' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты:',
-'passwordreset-emailtitle' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± учётной запиÑи {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Кто-то (возможно, вы, Ñ IP-адреÑа $1) запроÑил напоминание о вашей
+'passwordreset' => 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ',
+'passwordreset-text' => 'Заполните Ñту форму, чтобы получить в пиÑьме напоминание о параметрах Вашей учётной запиÑи.',
+'passwordreset-legend' => 'СброÑить пароль',
+'passwordreset-disabled' => 'СброÑÑ‹ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹ на Ñтой вики.',
+'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из чаÑтей данных, показанных ниже}}',
+'passwordreset-username' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'ПроÑмотреть получившееÑÑ Ð¿Ð¸Ñьмо?',
+'passwordreset-capture-help' => 'ЕÑли вы уÑтановите данную отметку, то вам будет показано пиÑьмо Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼ паролем, отправлÑемое учаÑтнику.',
+'passwordreset-email' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты:',
+'passwordreset-emailtitle' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± учётной запиÑи {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Кто-то (возможно, вы, Ñ IP-адреÑа $1) запроÑил напоминание о вашей
учётной запиÑи в проекте {{SITENAME}} ($4).
{{PLURAL:$3|Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ ÑвÑзана|Следующие учётные запиÑи ÑвÑзаны}} Ñ Ñтим адреÑом Ñлектронной почты:
@@ -823,7 +833,7 @@ $2
ЕÑли вы не делали Ñтого запроÑа или вÑпомнили Ñвой иÑходный пароль
и не желаете его менÑÑ‚ÑŒ, то можете проигнорировать Ñто Ñообщение
и продолжить иÑпользовать Ñвой Ñтарый пароль.',
-'passwordreset-emailtext-user' => 'УчаÑтник $1 из проекта {{SITENAME}} запроÑил напоминание о вашей
+'passwordreset-emailtext-user' => 'УчаÑтник $1 из проекта {{SITENAME}} запроÑил напоминание о вашей
учётной запиÑи в проекте {{SITENAME}} ($4).
{{PLURAL:$3|Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ ÑвÑзана|Следующие учётные запиÑи ÑвÑзаны}} Ñ Ñтим адреÑом Ñлектронной почты:
@@ -834,9 +844,22 @@ $2
ЕÑли вы не делали Ñтого запроÑа или вÑпомнили Ñвой иÑходный пароль
и не желаете его менÑÑ‚ÑŒ, то можете проигнорировать Ñто Ñообщение
и продолжить иÑпользовать Ñвой Ñтарый пароль.',
-'passwordreset-emailelement' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника: $1
+'passwordreset-emailelement' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника: $1
Временный пароль: $2',
-'passwordreset-emailsent' => 'По Ñлектронной почте было отправлено напоминание.',
+'passwordreset-emailsent' => 'По Ñлектронной почте было отправлено напоминание.',
+'passwordreset-emailsent-capture' => 'Ðиже приведено отправленное пиÑьмо-напоминание.',
+'passwordreset-emailerror-capture' => 'Ðиже приведено Ñозданное пиÑьмо-напоминание, его отправка не удалаÑÑŒ по причине: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Изменить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
+'changeemail-header' => 'Изменение адреÑа Ñлектронной почты',
+'changeemail-text' => 'Заполните Ñту форму, чтобы изменить Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты. Вам нужно будет ввеÑти пароль, чтобы подтвердить изменение.',
+'changeemail-no-info' => 'Чтобы обращатьÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно к Ñтой Ñтранице, вам Ñледует предÑтавитьÑÑ ÑиÑтеме.',
+'changeemail-oldemail' => 'Текущий Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:',
+'changeemail-newemail' => 'Ðовый Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:',
+'changeemail-none' => '(нет)',
+'changeemail-submit' => 'Измененить адреÑ',
+'changeemail-cancel' => 'Отмена',
# Edit page toolbar
'bold_sample' => 'Полужирное начертание',
@@ -905,9 +928,6 @@ $2
Ваш IP-Ð°Ð´Ñ€ÐµÑ â€” $3, идентификатор блокировки — #$5.
ПожалуйÑта, указывайте Ñти ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² любых Ñвоих обращениÑÑ….',
'blockednoreason' => 'причина не указана',
-'blockedoriginalsource' => 'Ðиже показан текÑÑ‚ Ñтраницы «$1».',
-'blockededitsource' => "Ðиже показан текÑÑ‚ '''ваших изменений''' Ñтраницы «$1».",
-'whitelistedittitle' => 'Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ',
'whitelistedittext' => 'Ð’Ñ‹ должны $1 Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтраниц.',
'confirmedittext' => 'Ð’Ñ‹ должны подтвердить Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты перед правкой Ñтраниц.
ПожалуйÑта, введите и подтвердите Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в Ñвоих [[Special:Preferences|перÑональных наÑтройках]].',
@@ -996,7 +1016,7 @@ $2
ЕÑли вы не хотите, чтобы кто-либо изменÑл ваши текÑÑ‚Ñ‹, не помещайте их Ñюда.<br />
Ð’Ñ‹ также подтверждаете, что ÑвлÑетеÑÑŒ автором вноÑимых дополнений, или Ñкопировали их из иÑточника, допуÑкающего Ñвободное раÑпроÑтранение и изменение Ñвоего Ñодержимого (Ñм. $1).
'''ÐЕ РÐЗМЕЩÐЙТЕ БЕЗ РÐЗРЕШЕÐИЯ ОХРÐÐЯЕМЫЕ ÐВТОРСКИМ ПРÐВОМ ÐœÐТЕРИÐЛЫ!'''",
-'longpageerror' => "'''ОШИБКÐ: запиÑываемый вами текÑÑ‚ имеет размер $1 килобайт, что больше, чем уÑтановленный предел $2 килобайт. Страница не может быть Ñохранена.'''",
+'longpageerror' => "'''ОШИБКÐ: запиÑываемый вами текÑÑ‚ имеет размер {{PLURAL:$1|$1 килобайт|$1 килобайта|$1 килобайт}}, что больше, чем уÑтановленный предел в {{PLURAL:$2|$2 килобайт|$2 килобайта|$2 килобайт}}. Страница не может быть Ñохранена.'''",
'readonlywarning' => "'''Предупреждение. База данных заблокирована в ÑвÑзи Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°Ð¼Ð¸ обÑлуживаниÑ, поÑтому вы не можете запиÑать ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ñмо ÑейчаÑ.'''
Возможно, вам Ñледует Ñохранить текÑÑ‚ в файл, чтобы воÑпользоватьÑÑ Ñтим текÑтом позже.
@@ -1164,8 +1184,6 @@ $3 {{GENDER:$3|указал|указала}} Ñледующую причину:
'revdelete-unsuppress' => 'СнÑÑ‚ÑŒ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ Ð²Ð¾ÑÑтановленных верÑий',
'revdelete-log' => 'Причина:',
'revdelete-submit' => 'Применить к {{PLURAL:$1|выбранной верÑии|выбранным верÑиÑм}}',
-'revdelete-logentry' => 'изменил видимоÑÑ‚ÑŒ верÑии Ñтраницы [[$1]]',
-'logdelete-logentry' => 'Изменена видимоÑÑ‚ÑŒ ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð´Ð»Ñ [[$1]]',
'revdelete-success' => "'''ВидимоÑÑ‚ÑŒ верÑии уÑпешно изменена.'''",
'revdelete-failure' => "'''ВидимоÑÑ‚ÑŒ верÑии не может быть изменена:'''
$1",
@@ -1177,15 +1195,6 @@ $1",
'revdel-restore-visible' => 'видимые верÑии',
'pagehist' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñтраницы',
'deletedhist' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ð¹',
-'revdelete-content' => 'Ñодержимое',
-'revdelete-summary' => 'опиÑание изменений',
-'revdelete-uname' => 'Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника',
-'revdelete-restricted' => 'Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑŽÑ‚ÑÑ Ðº админиÑтраторам',
-'revdelete-unrestricted' => 'Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑнÑÑ‚Ñ‹ Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов',
-'revdelete-hid' => 'Ñкрыто $1',
-'revdelete-unhid' => 'раÑкрыто $1',
-'revdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|верÑии|верÑий|верÑий}}',
-'logdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|ÑобытиÑ|Ñобытий|Ñобытий}}',
'revdelete-hide-current' => 'Ошибка ÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи от $2, $1: Ñто Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ.
Она не может быть Ñкрыта.',
'revdelete-show-no-access' => 'Ошибка раÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи от $2, $1: Ñта запиÑÑŒ отмечена как «ограниченнаÑ».
@@ -1340,12 +1349,14 @@ $1",
'prefs-rc' => 'Свежие правки',
'prefs-watchlist' => 'СпиÑок наблюдениÑ',
'prefs-watchlist-days' => 'КоличеÑтво дней:',
-'prefs-watchlist-days-max' => 'Ðе более 7 дней',
+'prefs-watchlist-days-max' => 'Ðе более $1 {{PLURAL:$1|днÑ|дней}}',
'prefs-watchlist-edits' => 'МакÑимальное количеÑтво правок, отображаемых в раÑширенном ÑпиÑке наблюдениÑ:',
'prefs-watchlist-edits-max' => 'Ðаибольшее значение: 1000',
'prefs-watchlist-token' => 'Токен ÑпиÑка наблюдениÑ:',
'prefs-misc' => 'Другие наÑтройки',
'prefs-resetpass' => 'Изменить пароль',
+'prefs-changeemail' => 'Изменить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
+'prefs-setemail' => 'УÑтановка адреÑа Ñл. почты',
'prefs-email' => 'Параметры Ñлектронной почты',
'prefs-rendering' => 'Внешний вид',
'saveprefs' => 'Сохранить',
@@ -1405,6 +1416,7 @@ $1",
'yourrealname' => 'Ваше наÑтоÑщее имÑ:',
'yourlanguage' => 'Язык интерфейÑа:',
'yourvariant' => 'Вариант Ñзыка ÑодержаниÑ:',
+'prefs-help-variant' => 'Предпочитаемый Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñодержимого Ñтраниц вики вариант Ñзыка или орфографиÑ.',
'yournick' => 'ÐÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ:',
'prefs-help-signature' => 'Комментарии на Ñтраницах обÑуждений должны быть подпиÑаны поÑредÑтвом Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñимволов «<nowiki>~~~~</nowiki>», которые будут преобразованы в вашу подпиÑÑŒ и времÑ.',
'badsig' => 'ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ. Проверьте корректноÑÑ‚ÑŒ HTML-тегов.',
@@ -1446,7 +1458,7 @@ $1",
'userrights-lookup-user' => 'Управление группами учаÑтников',
'userrights-user-editname' => 'Введите Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
'editusergroup' => 'Изменить членÑтво в группах',
-'editinguser' => "Изменение прав учаÑтника '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Изменение прав {{GENDER:$1|учаÑтника|учаÑтницы}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Изменение членÑтва в группах',
'saveusergroups' => 'Сохранить группы учаÑтника',
'userrights-groupsmember' => 'Член групп:',
@@ -1540,13 +1552,13 @@ $1",
'right-autopatrol' => 'правки автоматичеÑки отмечаютÑÑ ÐºÐ°Ðº патрулированные',
'right-patrolmarks' => 'проÑмотр отметок о патрулировании в Ñвежих правках',
'right-unwatchedpages' => 'проÑмотр ÑпиÑка ненаблюдаемых Ñтраниц',
-'right-trackback' => 'отправка Trackback',
'right-mergehistory' => 'объединение иÑторий Ñтраниц',
'right-userrights' => 'изменение прав вÑех учаÑтников',
'right-userrights-interwiki' => 'изменение прав учаÑтников на других вики-Ñайтах',
'right-siteadmin' => 'блокировка и разблокировка базы данных',
'right-override-export-depth' => 'ÑкÑпортирование Ñтраниц, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑвÑзанные Ñтраницы Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð¾Ð¹ до 5',
'right-sendemail' => 'отправлÑÑ‚ÑŒ Ñлектронную почту другим учаÑтникам',
+'right-passwordreset' => 'проÑмотр Ñлектронных пиÑем Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÐµÐ¼ паролÑ',
# User rights log
'rightslog' => 'Журнал прав учаÑтника',
@@ -1580,16 +1592,17 @@ $1",
'action-suppressionlog' => 'проÑмотр Ñтого чаÑтного журнала',
'action-block' => 'блокировка учаÑтника',
'action-protect' => 'изменение ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñтой Ñтраницы',
+'action-rollback' => 'быÑтрый откат изменений поÑледнего пользователÑ, который редактировал Ñтраницу',
'action-import' => 'импорт Ñтой Ñтраницы из другой вики',
'action-importupload' => 'импорт Ñтой Ñтраницы из загруженного файла',
'action-patrol' => 'отметка чужих правок как отпатрулированных',
'action-autopatrol' => 'отметка Ñвоих правок как отпатрулированных',
'action-unwatchedpages' => 'проÑмотр ÑпиÑка Ñтраниц, за которыми не ÑледÑÑ‚',
-'action-trackback' => 'отправка trackback',
'action-mergehistory' => 'приÑоединение иÑтории изменений Ñтой Ñтраницы',
'action-userrights' => 'изменение вÑех прав учаÑтника',
'action-userrights-interwiki' => 'изменение прав учаÑтников в других вики',
'action-siteadmin' => 'блокировка и разблокировка базы данных',
+'action-sendemail' => 'отправка Ñлектронных пиÑем',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}}',
@@ -1622,6 +1635,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|наблюдающий учаÑтник|наблюдающих учаÑтника|наблюдающих учаÑтников}}]',
'rc_categories' => 'Только из категорий (разделитель «|»)',
'rc_categories_any' => 'Любой',
+'rc-change-size-new' => 'Размер поÑле изменениÑ: {{PLURAL:$1|байт|байта|байт}}',
'newsectionsummary' => '/* $1 */ Ð½Ð¾Ð²Ð°Ñ Ñ‚ÐµÐ¼Ð°',
'rc-enhanced-expand' => 'Показать подробноÑти (иÑпользуетÑÑ JavaScript)',
'rc-enhanced-hide' => 'Скрыть подробноÑти',
@@ -1676,6 +1690,7 @@ $1",
'ignorewarnings' => 'Игнорировать предупреждениÑ',
'minlength1' => 'Ðазвание файла должно Ñодержать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну букву.',
'illegalfilename' => 'Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° «$1» Ñодержит Ñимволы, которые не разрешаетÑÑ Ð¸Ñпользовать в заголовках. ПожалуйÑта, переименуйте файл и попытайтеÑÑŒ загрузить его Ñнова.',
+'filename-toolong' => 'Имена файлов не должны превышать 240 байт.',
'badfilename' => 'Ðазвание файла было изменено на $1.',
'filetype-mime-mismatch' => 'РаÑширение файла «.$1» не ÑоответÑтвует его MIME-типу ($2).',
'filetype-badmime' => 'Файлы, имеющие MIME-тип «$1», не могут быть загружены.',
@@ -1780,6 +1795,41 @@ $1',
'upload-unknown-size' => 'ÐеизвеÑтный размер',
'upload-http-error' => 'Произошла ошибка HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Ðе удалоÑÑŒ транÑлировать файл $1.',
+'backend-fail-backup' => 'Ðевозможно Ñделать резервную копию файла $1.',
+'backend-fail-notexists' => 'Файл $1 не ÑущеÑтвует.',
+'backend-fail-hashes' => 'Ðе удалоÑÑŒ получить Ñ…Ñши файлов Ð´Ð»Ñ ÑравнениÑ.',
+'backend-fail-notsame' => 'Уже еÑÑ‚ÑŒ неидентичный файл $1.',
+'backend-fail-invalidpath' => '$1 не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым путём хранениÑ.',
+'backend-fail-delete' => 'Ðе удалоÑÑŒ удалить файл $1.',
+'backend-fail-alreadyexists' => 'Файл $1 уже ÑущеÑтвует.',
+'backend-fail-store' => 'Ðе удалоÑÑŒ Ñохранить файл $1 на $2 .',
+'backend-fail-copy' => 'Ðе удалоÑÑŒ Ñкопировать файл $1 в $2 .',
+'backend-fail-move' => 'Ðе удалоÑÑŒ перемеÑтить файл $1 в $2.',
+'backend-fail-opentemp' => 'Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ временный файл.',
+'backend-fail-writetemp' => 'Ðе удалоÑÑŒ запиÑать во временный файл.',
+'backend-fail-closetemp' => 'Ðе удаётÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ‚ÑŒ временный файл.',
+'backend-fail-read' => 'Ðе удалоÑÑŒ прочитать файл $1.',
+'backend-fail-create' => 'Ðе удалоÑÑŒ Ñоздать файл $1.',
+'backend-fail-readonly' => 'Хранилище «$1» ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² режиме «только чтение». Причина: «$2»',
+'backend-fail-synced' => 'Файл «$1» находитÑÑ Ð² неÑоглаÑованном ÑоÑтоÑнии во внутреннем хранилище',
+'backend-fail-connect' => 'Ðе удалоÑÑŒ подключитьÑÑ Ðº хранилищу «$1».',
+'backend-fail-internal' => 'Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в хранилище «$1».',
+'backend-fail-contenttype' => 'Ðе удалоÑÑŒ определить тип Ñодержимого файла, чтобы Ñохранить его в «$1».',
+'backend-fail-batchsize' => 'Хранилище болучило блок из $1 {{PLURAL:$1|файловой операции|файловых операций|файловых операций}}, ограничение ÑоÑтавлÑет $2 {{PLURAL:$1|операцию|операции|файловых операций}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ðе удалоÑÑŒ разблокировать "$1"; он не заблокирован.',
+'lockmanager-fail-closelock' => 'Ðе удалоÑÑŒ закрыть файл блокировки Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-deletelock' => 'Ðе удалоÑÑŒ удалить файл блокировки Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-acquirelock' => 'Ðе удалоÑÑŒ добитьÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ «$1».',
+'lockmanager-fail-openlock' => 'Ðе удалоÑÑŒ открыть файл блокировки Ð´Ð»Ñ Â«$1».',
+'lockmanager-fail-releaselock' => 'Ðе удалоÑÑŒ разблокировать "$1".',
+'lockmanager-fail-db-bucket' => 'Ðе удалоÑÑŒ ÑвÑзатьÑÑ Ñ Ð´Ð¾Ñтаточным количеÑтвом баз блокировок в Ñегменте $1.',
+'lockmanager-fail-db-release' => 'Ðе удалоÑÑŒ ÑнÑÑ‚ÑŒ блокировку базы данных $1 .',
+'lockmanager-fail-svr-release' => 'Ðе удалоÑÑŒ ÑнÑÑ‚ÑŒ блокировки на Ñервере $1 .',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Произошла ошибка при открытии файла Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ архива.',
'zip-wrong-format' => 'Указанный файл не ÑвлÑетÑÑ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ ZIP.',
@@ -1796,6 +1846,7 @@ $1',
'uploadstash-badtoken' => 'Ðе удалоÑÑŒ выполнить указанные дейÑтвиÑ. Возможно, иÑтёк Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ жетона безопаÑноÑти. Попробуйте ещё раз.',
'uploadstash-errclear' => 'ОчиÑтка файлов не удалаÑÑŒ.',
'uploadstash-refresh' => 'Обновить ÑпиÑок файлов',
+'invalid-chunk-offset' => 'ÐедопуÑтимое Ñмещение фрагмента',
# img_auth script messages
'img-auth-accessdenied' => 'ДоÑтуп запрещён',
@@ -1902,23 +1953,24 @@ $1',
'filerevert-badversion' => 'Ðе ÑущеÑтвует предыдущей локальной верÑии Ñтого файла Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ отметкой времени.',
# File deletion
-'filedelete' => '$1 — удаление',
-'filedelete-legend' => 'Удалить файл',
-'filedelete-intro' => "Ð’Ñ‹ ÑобираетеÑÑŒ удалить файл '''[[Media:$1|$1]]''' Ñо вÑей его иÑторией.",
-'filedelete-intro-old' => '<span class="plainlinks">Ð’Ñ‹ удалÑете верÑию \'\'\'[[Media:$1|$1]]\'\'\' от [$4 $3, $2].</span>',
-'filedelete-comment' => 'Причина:',
-'filedelete-submit' => 'Удалить',
-'filedelete-success' => "'''$1''' был удалён.",
-'filedelete-success-old' => "ВерÑÐ¸Ñ '''[[Media:$1|$1]]''' от $3 $2 была удалена.",
-'filedelete-nofile' => "'''$1''' не ÑущеÑтвует.",
-'filedelete-nofile-old' => "Ðе ÑущеÑтвует архивной верÑии '''$1''' Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ атрибутами.",
-'filedelete-otherreason' => 'Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°:',
-'filedelete-reason-otherlist' => 'Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°',
-'filedelete-reason-dropdown' => '* РаÑпроÑтранённые причины удалениÑ
+'filedelete' => '$1 — удаление',
+'filedelete-legend' => 'Удалить файл',
+'filedelete-intro' => "Ð’Ñ‹ ÑобираетеÑÑŒ удалить файл '''[[Media:$1|$1]]''' Ñо вÑей его иÑторией.",
+'filedelete-intro-old' => '<span class="plainlinks">Ð’Ñ‹ удалÑете верÑию \'\'\'[[Media:$1|$1]]\'\'\' от [$4 $3, $2].</span>',
+'filedelete-comment' => 'Причина:',
+'filedelete-submit' => 'Удалить',
+'filedelete-success' => "'''$1''' был удалён.",
+'filedelete-success-old' => "ВерÑÐ¸Ñ '''[[Media:$1|$1]]''' от $3 $2 была удалена.",
+'filedelete-nofile' => "'''$1''' не ÑущеÑтвует.",
+'filedelete-nofile-old' => "Ðе ÑущеÑтвует архивной верÑии '''$1''' Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ атрибутами.",
+'filedelete-otherreason' => 'Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°:',
+'filedelete-reason-otherlist' => 'Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°',
+'filedelete-reason-dropdown' => '* РаÑпроÑтранённые причины удалениÑ
** нарушение авторÑких прав
** файл-дубликат',
-'filedelete-edit-reasonlist' => 'Править ÑпиÑок причин',
-'filedelete-maintenance' => 'Удаление и воÑÑтановление файлов временно отключены на Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑких работ.',
+'filedelete-edit-reasonlist' => 'Править ÑпиÑок причин',
+'filedelete-maintenance' => 'Удаление и воÑÑтановление файлов временно отключены на Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑких работ.',
+'filedelete-maintenance-title' => 'Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ файл',
# MIME search
'mimesearch' => 'ПоиÑк по MIME',
@@ -2016,6 +2068,8 @@ $1',
'wantedpages' => 'Требуемые Ñтраницы',
'wantedpages-badtitle' => 'Ошибочный заголовок в результатах запроÑа: $1',
'wantedfiles' => 'Требуемые файлы',
+'wantedfiletext-cat' => 'Следующие файлы пытаютÑÑ Ð¸Ñпользовать, Ñ…Ð¾Ñ‚Ñ Ð¸Ñ… не ÑущеÑтвует. Ð’ Ñтот ÑпиÑок могут ошибочно попаÑÑ‚ÑŒ файлы, находÑщиеÑÑ Ð²Ð¾ внешних хранилищах. Подобные ложные ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отмечены <del>зачёркиванием</del>. Кроме того, Ñтраницы, Ñодержащие неÑущеÑтвующие файлы, перечиÑлены в [[:$1]].',
+'wantedfiletext-nocat' => 'Следующие файлы пытаютÑÑ Ð¸Ñпользовать, Ñ…Ð¾Ñ‚Ñ Ð¸Ñ… не ÑущеÑтвует. Ð’ Ñтот ÑпиÑок могут ошибочно попаÑÑ‚ÑŒ файлы, находÑщиеÑÑ Ð²Ð¾ внешних хранилищах. Подобные ложные ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отмечены <del>зачёркиванием</del>.',
'wantedtemplates' => 'Требуемые шаблоны',
'mostlinked' => 'Страницы, на которые больше вÑего ÑÑылок',
'mostlinkedcategories' => 'Категории, на которые больше вÑего ÑÑылок',
@@ -2024,6 +2078,7 @@ $1',
'mostimages' => 'Самые иÑпользуемые файлы',
'mostrevisions' => 'Ðаиболее чаÑто редактировавшиеÑÑ Ñтраницы',
'prefixindex' => 'Указатель по началу названий Ñтраниц',
+'prefixindex-namespace' => 'Указатель по началу Ñтраниц (проÑтранÑтво имён «{{ns:$1}}»)',
'shortpages' => 'Короткие Ñтраницы',
'longpages' => 'Длинные Ñтраницы',
'deadendpages' => 'Тупиковые Ñтраницы',
@@ -2040,7 +2095,7 @@ $1',
'listusers-editsonly' => 'Показать только тех учаÑтников, кто Ñделал Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну правку',
'listusers-creationsort' => 'УпорÑдочить по дате ÑозданиÑ',
'usereditcount' => '$1 {{PLURAL:$1|правка|правки|правок}}',
-'usercreated' => '{{GENDER:$3|ЗарегиÑтрировалÑÑ|ЗарегиÑтрировалаÑÑŒ}} $1 в $2',
+'usercreated' => '{{GENDER:$3|зарегиÑтрировалÑÑ|зарегиÑтрировалаÑÑŒ}} $1 в $2',
'newpages' => 'Ðовые Ñтраницы',
'newpages-username' => 'УчаÑтник:',
'ancientpages' => 'Статьи по дате поÑледнего редактированиÑ',
@@ -2134,12 +2189,8 @@ $1',
'activeusers-noresult' => 'Ðе найдено учаÑтников.',
# Special:Log/newusers
-'newuserlogpage' => 'Журнал региÑтрации учаÑтников',
-'newuserlogpagetext' => 'СпиÑок недавно зарегиÑтрировавшихÑÑ ÑƒÑ‡Ð°Ñтников',
-'newuserlog-byemail' => 'пароль отправлен по Ñл. почте',
-'newuserlog-create-entry' => 'новый учаÑтник',
-'newuserlog-create2-entry' => 'Ñоздал новую учётную запиÑÑŒ $1',
-'newuserlog-autocreate-entry' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñоздана автоматичеÑки',
+'newuserlogpage' => 'Журнал региÑтрации учаÑтников',
+'newuserlogpagetext' => 'СпиÑок недавно зарегиÑтрировавшихÑÑ ÑƒÑ‡Ð°Ñтников',
# Special:ListGroupRights
'listgrouprights' => 'Права групп учаÑтников',
@@ -2170,7 +2221,7 @@ $1',
'emailpagetext' => 'С помощью данной формы можно отправить Ñообщение на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ñтого учаÑтника.
Ð’ качеÑтве обратного адреÑа будет указан тот адреÑ, который вы указали в [[Special:Preferences|Ñвоих наÑтройках]], таким образом получатель будет иметь возможноÑÑ‚ÑŒ ответить непоÑредÑтвенно вам.',
'usermailererror' => 'При отправке ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñлектронной почты произошла ошибка:',
-'defemailsubject' => 'ПиÑьмо из {{grammar:genitive|{{SITENAME}}}}',
+'defemailsubject' => '{{SITENAME}} — ПиÑьмо от $1',
'usermaildisabled' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° учаÑтника отключена',
'usermaildisabledtext' => 'Ð’Ñ‹ не можете отправлÑÑ‚ÑŒ Ñлектронные пиÑьма другим учаÑтникам Ñтой вики',
'noemailtitle' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты отÑутÑтвует',
@@ -2224,7 +2275,7 @@ $1',
'watchmethod-list' => 'проÑмотр наблюдаемых Ñтраниц Ð´Ð»Ñ Ð¿Ð¾Ñледних изменений',
'watchlistcontains' => 'Ваш ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ñодержит $1 {{PLURAL:$1|Ñтраница|Ñтраницы|Ñтраниц}}.',
'iteminvalidname' => 'Проблема Ñ Ñлементом «$1», недопуÑтимое название…',
-'wlnote' => 'Ðиже {{PLURAL:$1|Ñледует поÑледнее $1 изменение|Ñледуют поÑледние $1 изменениÑ|Ñледуют поÑледние $1 изменений}} за {{PLURAL:$2|поÑледний|поÑледние|поÑледние}} <strong>$2</strong> {{plural:$2|чаÑ|чаÑа|чаÑов}}.',
+'wlnote' => "Ðиже {{PLURAL:$1|показано поÑледнее $1 изменение|показаны поÑледние $1 изменениÑ|показаны поÑледние $1 изменений}} за {{PLURAL:$2|поÑледний|поÑледние|поÑледние}} '''$2''' {{plural:$2|чаÑ|чаÑа|чаÑов}}, на момент времени $3 $4.",
'wlshowlast' => 'Показать за поÑледние $1 чаÑов $2 дней $3',
'watchlist-options' => 'ÐаÑтройки ÑпиÑка наблюдениÑ',
@@ -2288,8 +2339,6 @@ $UNWATCHURL
'actionfailed' => 'ДейÑтвие не выполнено',
'deletedtext' => '«$1» была удалена.
См. $2 Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка поÑледних удалений.',
-'deletedarticle' => 'удалил «[[$1]]»',
-'suppressedarticle' => 'Ñкрыл «[[$1]]»',
'dellogpage' => 'Журнал удалений',
'dellogpagetext' => 'Ðиже приведён журнал поÑледних удалений.',
'deletionlog' => 'журнал удалений',
@@ -2338,7 +2387,10 @@ $UNWATCHURL
'unprotectedarticle' => 'ÑнÑта защита Ñ Â«[[$1]]»',
'movedarticleprotection' => 'Ð¿ÐµÑ€ÐµÐ½Ñ‘Ñ Ð½Ð°Ñтройки защиты Ñ Â«[[$2]]» на «[[$1]]»',
'protect-title' => 'УÑтановка ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ð´Ð»Ñ Â«$1»',
+'protect-title-notallowed' => 'ПроÑмотр ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ «$1»',
'prot_1movedto2' => '[[$1]] переименована в [[$2]]',
+'protect-badnamespace-title' => 'Ðезащищаемое проÑтранÑтво имён',
+'protect-badnamespace-text' => 'Страницы в Ñтом проÑтранÑтве имён не могут быть защищены.',
'protect-legend' => 'Подтвердите уÑтановку защиты Ñтраницы',
'protectcomment' => 'Причина:',
'protectexpiry' => 'ИÑтекает:',
@@ -2358,6 +2410,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Только админиÑтраторы',
'protect-summary-cascade' => 'каÑкаднаÑ',
'protect-expiring' => 'иÑтекает $1 (UTC)',
+'protect-expiring-local' => 'иÑтекает $1',
'protect-expiry-indefinite' => 'беÑÑрочно',
'protect-cascade' => 'Защищать Ñтраницы, включённые в Ñту Ñтраницу (каÑÐºÐ°Ð´Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð°)',
'protect-cantedit' => 'Ð’Ñ‹ не можете изменить уровень защиты Ñтой Ñтраницы, потому что у Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ ÐµÑ‘ редактированиÑ.',
@@ -2415,7 +2468,6 @@ $UNWATCHURL
'undeletereset' => 'ОчиÑтить',
'undeleteinvert' => 'Обратить выделение',
'undeletecomment' => 'Причина:',
-'undeletedarticle' => 'воÑÑтановил «[[$1]]»',
'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}} воÑÑтановлено',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|верÑиÑ|верÑии|верÑий}} и $2 {{PLURAL:$2|файл|файла|файлов}} воÑÑтановлено',
'undeletedfiles' => '$1 {{PLURAL:$1|файл воÑÑтановлен|файла воÑÑтановлено|файлов воÑÑтановлено}}',
@@ -2424,6 +2476,7 @@ $UNWATCHURL
Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка поÑледних удалений и воÑÑтановлений Ñм. [[Special:Log/delete|журнал удалений]].",
'undelete-header' => 'СпиÑок недавно удалённых Ñтраниц можно поÑмотреть в [[Special:Log/delete|журнале удалений]].',
+'undelete-search-title' => 'ПоиÑк удалённых Ñтраниц',
'undelete-search-box' => 'ПоиÑк удалённых Ñтраниц',
'undelete-search-prefix' => 'Показать Ñтраницы, начинающиеÑÑ Ñ:',
'undelete-search-submit' => 'Ðайти',
@@ -2432,6 +2485,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'Ðевозможно воÑÑтановить верÑию файла Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ¾Ð¹ времени $1: файл отÑутÑтвовал до удалениÑ.',
'undelete-cleanup-error' => 'Ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¸Ñпользуемого архивного файла «$1».',
'undelete-missing-filearchive' => 'Ðевозможно воÑÑтановить файл Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð½Ñ‹Ð¼ идентификатором $1, так как он отÑутÑтвует в базе данных. Возможно, файл уже был воÑÑтановлен.',
+'undelete-error' => 'Ошибка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтраницы',
'undelete-error-short' => 'Ошибка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°: $1',
'undelete-error-long' => 'Во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° возникли ошибки:
@@ -2552,6 +2606,7 @@ $1',
'blocklist-userblocks' => 'Скрыть блокировки учётных запиÑей',
'blocklist-tempblocks' => 'Скрыть временные блокировки',
'blocklist-addressblocks' => 'Скрыть блокировки отдельных IP',
+'blocklist-rangeblocks' => 'Скрыть блокировки диапазонов',
'blocklist-timestamp' => 'Дата/времÑ',
'blocklist-target' => 'Цель',
'blocklist-expiry' => 'ИÑтекает',
@@ -2574,6 +2629,7 @@ $1',
'unblocklink' => 'разблокировать',
'change-blocklink' => 'изменить блокировку',
'contribslink' => 'вклад',
+'emaillink' => 'отправить пиÑьмо',
'autoblocker' => 'Ðвтоблокировка из-за ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ IP-адреÑа Ñ Ð°Ð´Ñ€ÐµÑом, который недавно иÑпользовал [[User:$1|$1]].
Причина блокировки $1 — «$2».',
'blocklogpage' => 'Журнал блокировок',
@@ -2700,9 +2756,6 @@ $1',
'movepage-page-moved' => 'Страница $1 была переименована в $2.',
'movepage-page-unmoved' => 'Страница $1 не может быть переименована в $2.',
'movepage-max-pages' => '$1 {{PLURAL:$1|Ñтраница была переименована|Ñтраницы было переименовано|Ñтраниц было переименовано}} — Ñто макÑимум, больше Ñтраниц Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ автоматичеÑки.',
-'1movedto2' => 'переименовал [[$1]] в [[$2]]',
-'1movedto2_redir' => 'переименовал [[$1]] в [[$2]] поверх перенаправлениÑ',
-'move-redirect-suppressed' => 'перенаправление подавлено',
'movelogpage' => 'Журнал переименований',
'movelogpagetext' => 'Ðиже предÑтавлен ÑпиÑок переименованных Ñтраниц.',
'movesubpage' => '{{PLURAL:$1|ПодÑтраница|ПодÑтраницы}}',
@@ -2715,7 +2768,7 @@ $1',
Страница Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «[[:$1]]» уже ÑущеÑтвует.
Хотите удалить её, чтобы Ñделать возможным переименование?',
'delete_and_move_confirm' => 'Да, удалить Ñту Ñтраницу',
-'delete_and_move_reason' => 'Удалено Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти переименованиÑ',
+'delete_and_move_reason' => 'Удалено Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Â«[[$1]]»',
'selfmove' => 'Ðевозможно переименовать Ñтраницу: иÑходное и новое Ð¸Ð¼Ñ Ñтраницы Ñовпадают.',
'immobile-source-namespace' => 'Ðевозможно переименовывать Ñтраницы в проÑтранÑтве имён «$1»',
'immobile-target-namespace' => 'Ðевозможно перемеÑтить Ñтраницу в проÑтранÑтво имён «$1»',
@@ -2744,9 +2797,11 @@ $1',
Чтобы ÑкÑпортировать Ñтатьи, введите их Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² поле редактированиÑ, одно название на Ñтроку, и выберите хотите ли вы ÑкÑпортировать вÑÑŽ иÑторию изменений Ñтатей или только поÑледние верÑии Ñтатей.
Ð’Ñ‹ также можете иÑпользовать Ñпециальный Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ÑкÑпорта только поÑледней верÑии. Ðапример Ð´Ð»Ñ Ñтраницы [[{{MediaWiki:Mainpage}}]] Ñто будет Ð°Ð´Ñ€ÐµÑ [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'ЭкÑпортировать вÑе Ñтраницы',
'exportcuronly' => 'Включать только текущую верÑию, без полной предыÑтории',
'exportnohistory' => "----
'''Замечание:''' ÑкÑпорт полной иÑтории изменений Ñтраниц отключён из-за проблем Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью.",
+'exportlistauthors' => 'Включить полный перечень внёÑших вклад Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтраницы',
'export-submit' => 'ЭкÑпортировать',
'export-addcattext' => 'Добавить Ñтраницы из категории:',
'export-addcat' => 'Добавить',
@@ -2779,6 +2834,8 @@ $1',
'thumbnail_error' => 'Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ñ‹: $1',
'djvu_page_error' => 'Ðомер Ñтраницы DjVu вне доÑÑгаемоÑти',
'djvu_no_xml' => 'Ðевозможно получить XML Ð´Ð»Ñ DjVu',
+'thumbnail-temp-create' => 'Ðе удаётÑÑ Ñоздать временный файл ÑÑкиза',
+'thumbnail-dest-create' => 'Ðе удаётÑÑ Ñохранить ÑÑкиз по меÑту назначениÑ',
'thumbnail_invalid_params' => 'Ошибочный параметр миниатюры',
'thumbnail_dest_directory' => 'Ðевозможно Ñоздать целевую директорию',
'thumbnail_image-type' => 'Данный тип Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ поддерживаетÑÑ',
@@ -2822,6 +2879,11 @@ $1',
'import-upload' => 'Загрузить XML-данные',
'import-token-mismatch' => 'ПотерÑны данные ÑеанÑа. ПожалуйÑта, попробуйте ещё раз.',
'import-invalid-interwiki' => 'Ðевозможно импортировать из указанной вики.',
+'import-error-edit' => 'Страница «$1» не была импортирована, так как вам не разрешено её редактировать.',
+'import-error-create' => 'Страница «$1» не была импортирована, так как вам не разрешено её Ñоздавать.',
+'import-error-interwiki' => 'Страница «$1» не была импортирована, так как её название зарезервировано Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ÑÑылок (интервики).',
+'import-error-special' => 'Страница «$1» не была импортирована, так как она отноÑитÑÑ Ðº оÑобому проÑтранÑтву имён, не позволÑющему Ñоздавать Ñтраницы.',
+'import-error-invalid' => 'Страница «$1» не была импортирована из-за недопуÑтимого названиÑ.',
# Import log
'importlogpage' => 'Журнал импорта',
@@ -2831,72 +2893,85 @@ $1',
'import-logentry-interwiki' => '«$1» — межвики импорт',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|верÑиÑ|верÑии|верÑий}} из $2',
+# JavaScriptTest
+'javascripttest' => 'Проверка JavaScript',
+'javascripttest-disabled' => 'Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°.',
+'javascripttest-title' => 'ПроводитÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° $1',
+'javascripttest-pagetext-noframework' => 'Эта Ñтраница зарезервирована Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка JavaScript-теÑтов.',
+'javascripttest-pagetext-unknownframework' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ñреда теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Â«$1».',
+'javascripttest-pagetext-frameworks' => 'ПожалуйÑта, выберите одну из Ñледующих Ñред теÑтированиÑ: $1',
+'javascripttest-pagetext-skins' => 'Выберите тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка теÑтов:',
+'javascripttest-qunit-intro' => 'См. [$1 документацию по теÑтированию] на mediawiki.org.',
+'javascripttest-qunit-heading' => 'Ðабор теÑтов MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ваша Ñтраница учаÑтника',
-'tooltip-pt-anonuserpage' => 'Страница учаÑтника Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ IP',
-'tooltip-pt-mytalk' => 'Ваша Ñтраница обÑуждений',
-'tooltip-pt-anontalk' => 'Страница обÑуждений Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ IP',
-'tooltip-pt-preferences' => 'Ваши наÑтройки',
-'tooltip-pt-watchlist' => 'СпиÑок Ñтраниц, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² которых вы отÑлеживаете',
-'tooltip-pt-mycontris' => 'СпиÑок ваших правок',
-'tooltip-pt-login' => 'ЗдеÑÑŒ можно зарегиÑтрироватьÑÑ Ð² ÑиÑтеме, но Ñто необÑзательно.',
-'tooltip-pt-anonlogin' => 'ЗдеÑÑŒ можно зарегиÑтрироватьÑÑ Ð² ÑиÑтеме, но Ñто необÑзательно.',
-'tooltip-pt-logout' => 'Завершить ÑÐµÐ°Ð½Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹',
-'tooltip-ca-talk' => 'ОбÑуждение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñтраницы',
-'tooltip-ca-edit' => 'Эту Ñтраницу можно изменÑÑ‚ÑŒ. ИÑпользуйте, пожалуйÑта, предварительный проÑмотр перед Ñохранением',
-'tooltip-ca-addsection' => 'Создать новый раздел',
-'tooltip-ca-viewsource' => 'Эта Ñтраница защищена от изменений, но вы можете поÑмотреть и Ñкопировать её иÑходный текÑÑ‚',
-'tooltip-ca-history' => 'Журнал изменений Ñтраницы',
-'tooltip-ca-protect' => 'Защитить Ñтраницу от изменений',
-'tooltip-ca-unprotect' => 'Изменить защиту Ñтой Ñтраницы',
-'tooltip-ca-delete' => 'Удалить Ñту Ñтраницу',
-'tooltip-ca-undelete' => 'ВоÑÑтановить иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñтраницы, Ñделанные до того, как она была удалена',
-'tooltip-ca-move' => 'Переименовать Ñтраницу',
-'tooltip-ca-watch' => 'Добавить Ñту Ñтраницу в ваш ÑпиÑок наблюдениÑ',
-'tooltip-ca-unwatch' => 'Удалить Ñту Ñтраницу из вашего ÑпиÑка наблюдениÑ',
-'tooltip-search' => 'ИÑкать Ñто Ñлово',
-'tooltip-search-go' => 'Перейти к Ñтранице, имеющей в точноÑти такое название',
-'tooltip-search-fulltext' => 'Ðайти Ñтраницы, Ñодержащие указанный текÑÑ‚',
-'tooltip-p-logo' => 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница',
-'tooltip-n-mainpage' => 'Перейти на заглавную Ñтраницу',
-'tooltip-n-mainpage-description' => 'Перейти на заглавную Ñтраницу',
-'tooltip-n-portal' => 'О проекте, о том, что вы можете Ñделать, где что находитÑÑ',
-'tooltip-n-currentevents' => 'СпиÑок текущих Ñобытий',
-'tooltip-n-recentchanges' => 'СпиÑок поÑледних изменений',
-'tooltip-n-randompage' => 'ПоÑмотреть Ñлучайную Ñтраницу',
-'tooltip-n-help' => 'Справочник по проекту «{{SITENAME}}»',
-'tooltip-t-whatlinkshere' => 'СпиÑок вÑех Ñтраниц, которые ÑÑылаютÑÑ Ð½Ð° Ñту Ñтраницу',
-'tooltip-t-recentchangeslinked' => 'ПоÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтраницах, на которые ÑÑылаетÑÑ Ñта Ñтраница',
-'tooltip-feed-rss' => 'ТранÑлÑÑ†Ð¸Ñ Ð² RSS Ð´Ð»Ñ Ñтой Ñтраницы',
-'tooltip-feed-atom' => 'ТранÑлÑÑ†Ð¸Ñ Ð² Atom Ð´Ð»Ñ Ñтой Ñтраницы',
-'tooltip-t-contributions' => 'СпиÑок Ñтраниц, которые изменÑл Ñтот учаÑтник',
-'tooltip-t-emailuser' => 'Отправить пиÑьмо Ñтому учаÑтнику',
-'tooltip-t-upload' => 'Загрузить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ мультимедиа-файлы',
-'tooltip-t-specialpages' => 'СпиÑок Ñлужебных Ñтраниц',
-'tooltip-t-print' => 'ВерÑÐ¸Ñ Ñтой Ñтраницы Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸',
-'tooltip-t-permalink' => 'ПоÑтоÑÐ½Ð½Ð°Ñ ÑÑылка на Ñту верÑию Ñтраницы',
-'tooltip-ca-nstab-main' => 'Содержание Ñтатьи',
-'tooltip-ca-nstab-user' => 'ПерÑÐ¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ñтраница учаÑтника',
-'tooltip-ca-nstab-media' => 'Медиа-файл',
-'tooltip-ca-nstab-special' => 'Это ÑÐ»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ñтраница, она недоÑтупна Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ',
-'tooltip-ca-nstab-project' => 'Страница проекта',
-'tooltip-ca-nstab-image' => 'Страница файла',
-'tooltip-ca-nstab-mediawiki' => 'Страница ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ MediaWiki',
-'tooltip-ca-nstab-template' => 'Страница шаблона',
-'tooltip-ca-nstab-help' => 'Страница Ñправки',
-'tooltip-ca-nstab-category' => 'Страница категории',
-'tooltip-minoredit' => 'Отметить Ñто изменение как незначительное',
-'tooltip-save' => 'Сохранить ваши изменениÑ',
-'tooltip-preview' => 'Предварительный проÑмотр Ñтраницы, пожалуйÑта, иÑпользуйте перед Ñохранением!',
-'tooltip-diff' => 'Показать изменениÑ, Ñделанные по отношению к иÑходному текÑту.',
-'tooltip-compareselectedversions' => 'ПоÑмотреть разницу между Ð´Ð²ÑƒÐ¼Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼Ð¸ верÑиÑми Ñтой Ñтраницы.',
-'tooltip-watch' => 'Добавить Ñту Ñтраницу в Ñвой ÑпиÑок наблюдениÑ',
-'tooltip-recreate' => 'ВоÑÑтановить Ñтраницу неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что она была удалена',
-'tooltip-upload' => 'Ðачать загрузку',
-'tooltip-rollback' => 'Одним нажатием убрать изменениÑ, Ñделанные поÑледним редактором',
-'tooltip-undo' => 'Убрать внеÑённую правку и показать предпроÑмотр, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью указать причину отмены',
-'tooltip-preferences-save' => 'Сохранить наÑтройки',
-'tooltip-summary' => 'Введите краткое опиÑание',
+'tooltip-pt-userpage' => 'Ваша Ñтраница учаÑтника',
+'tooltip-pt-anonuserpage' => 'Страница учаÑтника Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ IP',
+'tooltip-pt-mytalk' => 'Ваша Ñтраница обÑуждений',
+'tooltip-pt-anontalk' => 'Страница обÑуждений Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ IP',
+'tooltip-pt-preferences' => 'Ваши наÑтройки',
+'tooltip-pt-watchlist' => 'СпиÑок Ñтраниц, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² которых вы отÑлеживаете',
+'tooltip-pt-mycontris' => 'СпиÑок ваших правок',
+'tooltip-pt-login' => 'ЗдеÑÑŒ можно зарегиÑтрироватьÑÑ Ð² ÑиÑтеме, но Ñто необÑзательно.',
+'tooltip-pt-anonlogin' => 'ЗдеÑÑŒ можно зарегиÑтрироватьÑÑ Ð² ÑиÑтеме, но Ñто необÑзательно.',
+'tooltip-pt-logout' => 'Завершить ÑÐµÐ°Ð½Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹',
+'tooltip-ca-talk' => 'ОбÑуждение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñтраницы',
+'tooltip-ca-edit' => 'Эту Ñтраницу можно изменÑÑ‚ÑŒ. ИÑпользуйте, пожалуйÑта, предварительный проÑмотр перед Ñохранением',
+'tooltip-ca-addsection' => 'Создать новый раздел',
+'tooltip-ca-viewsource' => 'Эта Ñтраница защищена от изменений, но вы можете поÑмотреть и Ñкопировать её иÑходный текÑÑ‚',
+'tooltip-ca-history' => 'Журнал изменений Ñтраницы',
+'tooltip-ca-protect' => 'Защитить Ñтраницу от изменений',
+'tooltip-ca-unprotect' => 'Изменить защиту Ñтой Ñтраницы',
+'tooltip-ca-delete' => 'Удалить Ñту Ñтраницу',
+'tooltip-ca-undelete' => 'ВоÑÑтановить иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñтраницы, Ñделанные до того, как она была удалена',
+'tooltip-ca-move' => 'Переименовать Ñтраницу',
+'tooltip-ca-watch' => 'Добавить Ñту Ñтраницу в ваш ÑпиÑок наблюдениÑ',
+'tooltip-ca-unwatch' => 'Удалить Ñту Ñтраницу из вашего ÑпиÑка наблюдениÑ',
+'tooltip-search' => 'ИÑкать Ñто Ñлово',
+'tooltip-search-go' => 'Перейти к Ñтранице, имеющей в точноÑти такое название',
+'tooltip-search-fulltext' => 'Ðайти Ñтраницы, Ñодержащие указанный текÑÑ‚',
+'tooltip-p-logo' => 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница',
+'tooltip-n-mainpage' => 'Перейти на заглавную Ñтраницу',
+'tooltip-n-mainpage-description' => 'Перейти на заглавную Ñтраницу',
+'tooltip-n-portal' => 'О проекте, о том, что вы можете Ñделать, где что находитÑÑ',
+'tooltip-n-currentevents' => 'СпиÑок текущих Ñобытий',
+'tooltip-n-recentchanges' => 'СпиÑок поÑледних изменений',
+'tooltip-n-randompage' => 'ПоÑмотреть Ñлучайную Ñтраницу',
+'tooltip-n-help' => 'Справочник по проекту «{{SITENAME}}»',
+'tooltip-t-whatlinkshere' => 'СпиÑок вÑех Ñтраниц, которые ÑÑылаютÑÑ Ð½Ð° Ñту Ñтраницу',
+'tooltip-t-recentchangeslinked' => 'ПоÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтраницах, на которые ÑÑылаетÑÑ Ñта Ñтраница',
+'tooltip-feed-rss' => 'ТранÑлÑÑ†Ð¸Ñ Ð² RSS Ð´Ð»Ñ Ñтой Ñтраницы',
+'tooltip-feed-atom' => 'ТранÑлÑÑ†Ð¸Ñ Ð² Atom Ð´Ð»Ñ Ñтой Ñтраницы',
+'tooltip-t-contributions' => 'СпиÑок Ñтраниц, которые изменÑл Ñтот учаÑтник',
+'tooltip-t-emailuser' => 'Отправить пиÑьмо Ñтому учаÑтнику',
+'tooltip-t-upload' => 'Загрузить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ мультимедиа-файлы',
+'tooltip-t-specialpages' => 'СпиÑок Ñлужебных Ñтраниц',
+'tooltip-t-print' => 'ВерÑÐ¸Ñ Ñтой Ñтраницы Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸',
+'tooltip-t-permalink' => 'ПоÑтоÑÐ½Ð½Ð°Ñ ÑÑылка на Ñту верÑию Ñтраницы',
+'tooltip-ca-nstab-main' => 'Содержание Ñтатьи',
+'tooltip-ca-nstab-user' => 'ПерÑÐ¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ñтраница учаÑтника',
+'tooltip-ca-nstab-media' => 'Медиа-файл',
+'tooltip-ca-nstab-special' => 'Это ÑÐ»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ñтраница, она недоÑтупна Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ',
+'tooltip-ca-nstab-project' => 'Страница проекта',
+'tooltip-ca-nstab-image' => 'Страница файла',
+'tooltip-ca-nstab-mediawiki' => 'Страница ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ MediaWiki',
+'tooltip-ca-nstab-template' => 'Страница шаблона',
+'tooltip-ca-nstab-help' => 'Страница Ñправки',
+'tooltip-ca-nstab-category' => 'Страница категории',
+'tooltip-minoredit' => 'Отметить Ñто изменение как незначительное',
+'tooltip-save' => 'Сохранить ваши изменениÑ',
+'tooltip-preview' => 'Предварительный проÑмотр Ñтраницы, пожалуйÑта, иÑпользуйте перед Ñохранением!',
+'tooltip-diff' => 'Показать изменениÑ, Ñделанные по отношению к иÑходному текÑту.',
+'tooltip-compareselectedversions' => 'ПоÑмотреть разницу между Ð´Ð²ÑƒÐ¼Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼Ð¸ верÑиÑми Ñтой Ñтраницы.',
+'tooltip-watch' => 'Добавить Ñту Ñтраницу в Ñвой ÑпиÑок наблюдениÑ',
+'tooltip-watchlistedit-normal-submit' => 'Удалить указанные названиÑ',
+'tooltip-watchlistedit-raw-submit' => 'Обновить ÑпиÑок наблюдениÑ',
+'tooltip-recreate' => 'ВоÑÑтановить Ñтраницу неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что она была удалена',
+'tooltip-upload' => 'Ðачать загрузку',
+'tooltip-rollback' => 'Одним нажатием убрать изменениÑ, Ñделанные поÑледним редактором',
+'tooltip-undo' => 'Убрать внеÑённую правку и показать предпроÑмотр, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью указать причину отмены',
+'tooltip-preferences-save' => 'Сохранить наÑтройки',
+'tooltip-summary' => 'Введите краткое опиÑание',
# Stylesheets
'common.css' => '/** Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем темам Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ */',
@@ -2987,9 +3062,6 @@ The wiki server can't provide data in a format your client can read.",
# Patrol log
'patrol-log-page' => 'Журнал патрулированиÑ',
'patrol-log-header' => 'Это журнал патрулированных верÑий.',
-'patrol-log-line' => 'проверил $1 из $2 $3',
-'patrol-log-auto' => '(автоматичеÑки)',
-'patrol-log-diff' => 'верÑию $1',
'log-show-hide-patrol' => '$1 журнал патрулированиÑ',
# Image deletion
@@ -3017,11 +3089,11 @@ $1',
'file-info' => 'размер файла: $1, MIME-тип: $2',
'file-info-size' => '$1 × $2 {{PLURAL:$2|пикÑель|пикÑелÑ|пикÑелей}}, размер файла: $3, MIME-тип: $4',
'file-info-size-pages' => '$1 × $2 пикÑелей, размер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|Ñтраница|Ñтраницы|Ñтраниц}}',
-'file-nohires' => '<small>Ðет верÑии Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ разрешением.</small>',
+'file-nohires' => 'Ðет верÑии Ñ Ð±Ð¾Ìльшим разрешением.',
'svg-long-desc' => 'Файл .SVG, номинально $1 × $2 {{PLURAL:$2|пикÑель|пикÑелÑ|пикÑелей}}, размер файла: $3',
'show-big-image' => 'Изображение в более выÑоком разрешении',
-'show-big-image-preview' => '<small>Размер при предпроÑмотре: $1.</small>',
-'show-big-image-other' => '<small>Другие разрешениÑ: $1.</small>',
+'show-big-image-preview' => 'Размер при предпроÑмотре: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Другое разрешение|Другие разрешениÑ}}: $1.',
'show-big-image-size' => '$1 × $2 пикÑелей',
'file-info-gif-looped' => 'закольцованный',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фрейм|фрейма|фреймов}}',
@@ -3043,9 +3115,15 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => 'Ñ',
-'minutes-abbrev' => 'м',
-'hours-abbrev' => 'ч',
+'seconds-abbrev' => '$1 Ñ',
+'minutes-abbrev' => '$1 м',
+'hours-abbrev' => '$1 ч',
+'days-abbrev' => '$1 д',
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунды|$1 Ñекунд}}',
+'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа|$1 чаÑов}}',
+'days' => '{{PLURAL:$1|$1 день|$1 днÑ|$1 дней}}',
+'ago' => '$1 назад',
# Bad image list
'bad_image_list' => 'Формат должен быть Ñледующим:
@@ -3552,13 +3630,6 @@ $5
'scarytranscludefailed' => '[Ошибка Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº шаблону $1]',
'scarytranscludetoolong' => '[Слишком длинный URL]',
-# Trackbacks
-'trackbackbox' => 'Trackback Ð´Ð»Ñ Ñтой Ñтатьи:<br />
-$1',
-'trackbackremove' => '([$1 удалить])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback был удалён.',
-
# Delete conflict
'deletedwhileediting' => "'''Внимание'''. Эта Ñтраница была удалена поÑле того, как вы начали её править!",
'confirmrecreate' => "{{GENDER:$1|УчаÑтник&nbsp;|УчаÑтница&nbsp;|}}[[User:$1|$1]] ([[User talk:$1|обÑ]]) {{GENDER:$1|удалил|удалила}} Ñту Ñтраницу поÑле того, как вы начали её редактировать, по Ñледующей причине:
@@ -3614,6 +3685,13 @@ $1',
'size-megabytes' => '$1 МБ',
'size-gigabytes' => '$1 ГБ',
+# Bitrate units
+'bitrate-bits' => '$1 б/Ñ',
+'bitrate-kilobits' => '$1 Кб/Ñ',
+'bitrate-megabits' => '$1 Мб/Ñ',
+'bitrate-gigabits' => '$1 Гб/Ñ',
+'bitrate-terabits' => '$1 Тб/Ñ',
+
# Live preview
'livepreview-loading' => 'Загрузка…',
'livepreview-ready' => 'Загрузка… Готово!',
@@ -3693,6 +3771,9 @@ $1',
'hebrew-calendar-m11-gen' => 'Ðва',
'hebrew-calendar-m12-gen' => 'Элула',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обÑуждение]])',
+
# Core parser functions
'unknown_extension_tag' => 'ÐеизвеÑтный тег раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Â«$1»',
'duplicate-defaultsort' => 'Внимание. Ключ Ñортировки по умолчанию «$2» переопределÑет прежний ключ Ñортировки по умолчанию «$1».',
@@ -3791,13 +3872,16 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'tags-hitcount' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}}',
# Special:ComparePages
-'comparepages' => 'Сравнение Ñтраниц',
-'compare-selector' => 'Сравнение верÑий Ñтраниц',
-'compare-page1' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница',
-'compare-page2' => 'Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ñтраница',
-'compare-rev1' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ',
-'compare-rev2' => 'Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ð²ÐµÑ€ÑиÑ',
-'compare-submit' => 'Сравнить',
+'comparepages' => 'Сравнение Ñтраниц',
+'compare-selector' => 'Сравнение верÑий Ñтраниц',
+'compare-page1' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница',
+'compare-page2' => 'Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ñтраница',
+'compare-rev1' => 'ÐŸÐµÑ€Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ',
+'compare-rev2' => 'Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ð²ÐµÑ€ÑиÑ',
+'compare-submit' => 'Сравнить',
+'compare-invalid-title' => 'Указанное вами название недопуÑтимо.',
+'compare-title-not-exists' => 'Ðе ÑущеÑтвует указанного вами названиÑ.',
+'compare-revision-not-exists' => 'Указанной вами верÑии не ÑущеÑтвует.',
# Database error messages
'dberr-header' => 'Эта вики иÑпытывает затруднениÑ',
@@ -3824,4 +3908,90 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ полнотекÑтового поиÑка',
'sqlite-no-fts' => '$1 без поддержки полнотекÑтового поиÑка',
+# New logging system
+'logentry-delete-delete' => '$1 удалил Ñтраницу $3',
+'logentry-delete-restore' => '$1 воÑÑтановил Ñтраницу $3',
+'logentry-delete-event' => '$1 изменил видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 запиÑи журнала|$5 запиÑей журнала|$5 запиÑей журнала}} на $3: $4',
+'logentry-delete-revision' => '$1 изменил видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 верÑии|$5 верÑий|$5 верÑий}} на Ñтранице $3: $4',
+'logentry-delete-event-legacy' => '$1 изменил видимоÑÑ‚ÑŒ запиÑей журнала $3',
+'logentry-delete-revision-legacy' => '$1 изменил видимоÑÑ‚ÑŒ верÑий на Ñтранице $3',
+'logentry-suppress-delete' => '$1 подавил Ñтраницу $3',
+'logentry-suppress-event' => '$1 Ñкрытно изменил видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 запиÑи журнала|$5 запиÑей журнала|$5 запиÑей журнала}} на $3: $4',
+'logentry-suppress-revision' => '$1 Ñкрытно изменил видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 верÑии|$5 верÑий|$5 верÑий}} на Ñтранице $3: $4',
+'logentry-suppress-event-legacy' => '$1 Ñкрытно изменил видимоÑÑ‚ÑŒ запиÑей журнала $3',
+'logentry-suppress-revision-legacy' => '$1 Ñкрытно изменил видимоÑÑ‚ÑŒ верÑий на Ñтранице $3',
+'revdelete-content-hid' => 'Ñодержание Ñкрыто',
+'revdelete-summary-hid' => 'опиÑание правки Ñкрыто',
+'revdelete-uname-hid' => 'Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника Ñкрыто',
+'revdelete-content-unhid' => 'Ñодержание раÑкрыто',
+'revdelete-summary-unhid' => 'опиÑание правки открыто',
+'revdelete-uname-unhid' => 'Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника раÑкрыто',
+'revdelete-restricted' => 'Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑŽÑ‚ÑÑ Ðº админиÑтраторам',
+'revdelete-unrestricted' => 'Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑнÑÑ‚Ñ‹ Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов',
+'logentry-move-move' => '$1 переименовал Ñтраницу $3 в $4',
+'logentry-move-move-noredirect' => '$1 переименовал Ñтраницу $3 в $4 без оÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ',
+'logentry-move-move_redir' => '$1 переименовал Ñтраницу $3 в $4 поверх перенаправлениÑ',
+'logentry-move-move_redir-noredirect' => '$1 переименовал Ñтраницу $3 в $4 поверх Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ без оÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ',
+'logentry-patrol-patrol' => '$1 отпатрулировал верÑию $4 Ñтраницы $3',
+'logentry-patrol-patrol-auto' => '$1 автоматичеÑки отпатрулировал верÑию $4 Ñтраницы $3',
+'logentry-newusers-newusers' => '$1 Ñоздал учётную запиÑÑŒ учаÑтника',
+'logentry-newusers-create' => '$1 Ñоздал учётную запиÑÑŒ',
+'logentry-newusers-create2' => '$1 Ñоздал учётную запиÑÑŒ учаÑтника $3',
+'logentry-newusers-autocreate' => 'ÐвтоматичеÑки Ñоздана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ $1',
+'newuserlog-byemail' => 'пароль отправлен по Ñл. почте',
+
+# Feedback
+'feedback-bugornote' => 'ЕÑли вы готовы подробно опиÑать техничеÑкую проблему, пожалуйÑта, [$1 Ñообщите об ошибке].
+Ð’ противном Ñлучае вы можете иÑпользовать данную проÑтую форму. Ваш комментарий будет добавлен на Ñтраницу «[$3 $2]» вмеÑте Ñ Ð²Ð°ÑˆÐ¸Ð¼ именем учаÑтника и иÑпользуемым браузером.',
+'feedback-subject' => 'Тема:',
+'feedback-message' => 'Сообщение:',
+'feedback-cancel' => 'Отмена',
+'feedback-submit' => 'Отправить отзыв',
+'feedback-adding' => 'Добавление отзыва на Ñтраницу…',
+'feedback-error1' => 'Ошибка. ÐеизвеÑтный результат из API',
+'feedback-error2' => 'Ошибка. Сбой редактированиÑ',
+'feedback-error3' => 'Ошибка. Ðет ответа от API',
+'feedback-thanks' => 'СпаÑибо! Ваш отзыв размещён на Ñтранице «[$2 $1]».',
+'feedback-close' => 'Готово',
+'feedback-bugcheck' => 'ПрекраÑно! Только проверьте, что в ÑпиÑке [$1 извеÑтных ошибок] её нет подобной запиÑи.',
+'feedback-bugnew' => 'Я проверил. Сообщить о новой ошибке',
+
+# API errors
+'api-error-badaccess-groups' => 'Вам не разрешено загружать файлы в Ñту вики.',
+'api-error-badtoken' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: некорректный токен.',
+'api-error-copyuploaddisabled' => 'Загрузка по URL-адреÑу отключена на Ñтом Ñервере.',
+'api-error-duplicate' => 'Уже {{PLURAL:$1|ÑущеÑтвует [$2 другой файл]|ÑущеÑтвуют [$2 другие файлы]}} Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же Ñодержимым',
+'api-error-duplicate-archive' => 'Раньше на Ñайте {{PLURAL:$1|уже был [$2 файл]|были [$2 файлы]}} Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ таким же Ñодержанием, но {{PLURAL:$1|он был удалён|они были удалены}}.',
+'api-error-duplicate-archive-popup-title' => 'Дубликаты {{PLURAL:$1|файла|файлов}}, которые уже были удалены.',
+'api-error-duplicate-popup-title' => 'Дубликат {{PLURAL:$1|файла|файлов}}',
+'api-error-empty-file' => 'Отправленный вами файл пуÑÑ‚.',
+'api-error-emptypage' => 'Ðе допуÑкаетÑÑ Ñоздание новых пуÑÑ‚Ñ‹Ñ… Ñтраниц.',
+'api-error-fetchfileerror' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: что-то пошло не так при получении файла.',
+'api-error-file-too-large' => 'Отправленный вами файл Ñлишком велик.',
+'api-error-filename-tooshort' => 'Слишком короткое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°.',
+'api-error-filetype-banned' => 'Этот тип файлов запрещён.',
+'api-error-filetype-missing' => 'У Ñтого файла отÑутÑтвует раÑширение.',
+'api-error-hookaborted' => 'Изменение, которые вы пыталиÑÑŒ Ñделать, прервано обработчиком раÑширениÑ.',
+'api-error-http' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: не удаётÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу.',
+'api-error-illegal-filename' => 'ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°.',
+'api-error-internal-error' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: что-то пошло не так при обработке вашей загрузки в вики.',
+'api-error-invalid-file-key' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: файл во временном хранилище не найден.',
+'api-error-missingparam' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: отÑутÑтвуют параметры по запроÑу.',
+'api-error-missingresult' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: не удалоÑÑŒ определить, уÑпешно ли завершилоÑÑŒ копирование.',
+'api-error-mustbeloggedin' => 'Ð’Ñ‹ должны предÑтавитьÑÑ ÑиÑтеме Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ файлов.',
+'api-error-mustbeposted' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ инÑтрукцию HTTP POST.',
+'api-error-noimageinfo' => 'Загрузка завершилаÑÑŒ уÑпешно, но Ñервер не выдал никакой информации о файле.',
+'api-error-nomodule' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: не наÑтроен модуль загрузки.',
+'api-error-ok-but-empty' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: нет ответа от Ñервера.',
+'api-error-overwrite' => 'Ðе допуÑкаетÑÑ Ð·Ð°Ð¼ÐµÐ½Ð° ÑущеÑтвующего файла.',
+'api-error-stashfailed' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: Ñервер не Ñмог Ñохранить временный файл.',
+'api-error-timeout' => 'Сервер не отвечает в течение ожидаемого времени.',
+'api-error-unclassified' => 'Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°',
+'api-error-unknown-code' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: «$1»',
+'api-error-unknown-error' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: что-то пошло не так при попытке загрузить файл.',
+'api-error-unknown-warning' => 'ÐеизвеÑтное предупреждение: $1',
+'api-error-unknownerror' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: «$1».',
+'api-error-uploaddisabled' => 'Ð’ Ñтой вики отключена возможноÑÑ‚ÑŒ загрузки файлов.',
+'api-error-verification-error' => 'Возможно, Ñтот файл повреждён или имеет неправильное раÑширение.',
+
);
diff --git a/languages/messages/MessagesRue.php b/languages/messages/MessagesRue.php
index 2e382021..d5562b16 100644
--- a/languages/messages/MessagesRue.php
+++ b/languages/messages/MessagesRue.php
@@ -15,7 +15,7 @@
* @author Tkalyn
*/
-$fallback = 'uk';
+$fallback = 'uk, ru';
$namespaceNames = array(
NS_MEDIA => 'Медіа',
@@ -399,21 +399,23 @@ $1',
'badarticleerror' => 'Тота Ð´Ñ—Ñ Ð½Ðµ може быти выконана на тій Ñторінцї.',
'cannotdelete' => 'Ðе Ñ” можне вымазати Ñторінку або файл "$1".
Може уж быв(а) змазаный(а) дакым іншым.',
+'cannotdelete-title' => 'Ðе годен змазати Ñторінку "$1"',
'badtitle' => 'ÐеприпуÑтна назва',
'badtitletext' => 'Пожадована назва Ñторінкы неправилна, порожнÑ, або неправилно одказована Ñк міджі-Ñзычного ці міджі-вікі назва.
Може ÑÑ Ñ…Ð¾Ñнують Ñімболы, котры не можуть быти хоÑнованы в назвах.',
-'perfcached' => 'ÐаÑлїдуючі дата Ñуть взÑÑ‚Ñ‹ з кешу Ñ– не муÑÑÑ‚ÑŒ быти актуалны.',
-'perfcachedts' => 'ÐаÑлїдуючі дата Ñуть взÑÑ‚Ñ‹ з кешу, котра была поÑлїднїй раз актуалізована $1.',
+'perfcached' => 'Слїдуючі дата Ñуть взÑÑ‚Ñ‹ з кешу Ñ– не муÑÑÑ‚ÑŒ быти актуалны. Кеш може обÑÑговати не веце Ñк {{PLURAL:$1|єден резултат|$1 резултаты|$1 резултатів}}.',
+'perfcachedts' => 'Слїдуючі дата Ñуть взÑÑ‚Ñ‹ з кешу, Ñка была оÑтатнїй раз актуалізована $1. Кеш може обÑÑговати не веце Ñк {{PLURAL:$4|єден резултат|$4 резултаты|$4 резултатів}}.',
'querypage-no-updates' => 'Зміны той Ñторінкы заборонены. Дата нынї не можуть быти обновлены.',
'wrong_wfQuery_params' => 'Ðеправилны параметры функцій wfQuery()<br />
ФункціÑ: $1<br />
ЗапроÑ: $2',
'viewsource' => 'Видїти код',
-'viewsourcefor' => 'Сторінка «$1»',
+'viewsource-title' => 'Відїти жрідло Ñторінкы $1',
'actionthrottled' => 'ÐÐºÑ†Ñ–Ñ Ð±Ñ‹Ð»Ð° придушена',
'actionthrottledtext' => 'ВзглÑдом ку протиÑпамовым опатрїнÑм не можете жадану акцію провеÑти барз чаÑто в короткім чаÑÑ—. Спробуйте то знову о пару мінут.',
'protectedpagetext' => 'Тота Ñторінка была замкнута, также ÑÑ Ð½Ðµ даÑÑ‚ÑŒ едітовати',
'viewsourcetext' => 'Можете видїти Ñ– копіровати код той Ñторінкы:',
+'viewyourtext' => "Можете Ñобі поÑмотрити Ñ– Ñкопіровати жрідловый текÑÑ‚ '''вашых змін''' той Ñторінкы:",
'protectedinterface' => 'Тота Ñторінка Ñ” чаÑтинов інтрефейÑу проґрамового Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡Ñ–Ð½Ñ Ñ– єй можуть едітовати лем адмініÑтраторы проєкту.',
'editinginterface' => "'''Увага:''' Едітуєте Ñторінку,котра Ñ” чаÑтинов текÑтового інтерфейÑу. Зміны той Ñторінкы выкличуть зміну інтерфейÑу про іншых хоÑнователїв. Про переклад ÑƒÐ²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ñ…Ð¾Ñнуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°Ñ” локалізаціёв MediaWiki.",
'sqlhidden' => '(SQL Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñкрытый)',
@@ -511,6 +513,7 @@ $2',
'emailconfirmlink' => 'Підтвердьте Ñвою адреÑу ел. пошты',
'invalidemailaddress' => 'Уведена адреÑа ел. пошты не може быти приÑта, бо она не має правилный формат.
ПроÑиме ВаÑ, уведьте коректну адеÑу або зохабте поле порожнє.',
+'cannotchangeemail' => 'Ð’ тій вікі не годен мінити імейловы адреÑÑ‹.',
'accountcreated' => 'Конто вытворене',
'accountcreatedtext' => 'Конто хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1 было вытворене.',
'createaccount-title' => 'Ð’Ñ‹Ñ‚Ð²Ð¾Ñ€Ð¸Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð° про {{SITENAME}}',
@@ -526,6 +529,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'Ðезнама хыба у PHP mail() функції',
+'user-mail-no-addy' => 'Проба одоÑлати електронічну пошту без імейловой адреÑÑ‹.',
# Change password dialog
'resetpass' => 'Змінити геÑло',
@@ -545,16 +549,18 @@ $2',
'resetpass-temp-password' => 'ДочаÑне геÑло:',
# Special:PasswordReset
-'passwordreset' => 'РеÑет геÑла',
-'passwordreset-text' => 'Выповньте тот формуларь, жебы обтримати припомÑÐ½ÑƒÑ‚Ñ Ð´ÐµÑ‚Ð°Ð¹Ð»Ñ–Ð² вашого конта',
-'passwordreset-legend' => 'Знову наÑтавити геÑло',
-'passwordreset-disabled' => 'ЗновунаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð³ÐµÑла Ñ” на тій вікі заказане',
-'passwordreset-pretext' => '{{PLURAL:$1||Задайте єден з дат ниже}}',
-'passwordreset-username' => 'Мено хоÑнователÑ:',
-'passwordreset-domain' => 'Домена:',
-'passwordreset-email' => 'ÐдреÑа електронічной пошты:',
-'passwordreset-emailtitle' => 'Детайлы конта на {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Дахто (аÑÑ– вы, з IP адреÑÑ‹ $1) пожадав о припомÑÐ½ÑƒÑ‚Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ð¹ ку вашому
+'passwordreset' => 'РеÑет геÑла',
+'passwordreset-text' => 'Выповньте тот формуларь, жебы обтримати припомÑÐ½ÑƒÑ‚Ñ Ð´ÐµÑ‚Ð°Ð¹Ð»Ñ–Ð² вашого конта',
+'passwordreset-legend' => 'Знову наÑтавити геÑло',
+'passwordreset-disabled' => 'ЗновунаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð³ÐµÑла Ñ” на тій вікі заказане',
+'passwordreset-pretext' => '{{PLURAL:$1||Задайте єден з дат ниже}}',
+'passwordreset-username' => 'Мено хоÑнователÑ:',
+'passwordreset-domain' => 'Домена:',
+'passwordreset-capture' => 'ПоÑмотрити выÑлїдный імейл?',
+'passwordreset-capture-help' => 'Кідь означіте тото поличко, буде імейл (з дочаÑным геÑлом) оркем поÑÐ»Ð°Ð½Ñ Ñ…Ð¾Ñнователёви указаный Ñ– вам.',
+'passwordreset-email' => 'ÐдреÑа електронічной пошты:',
+'passwordreset-emailtitle' => 'Детайлы конта на {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Дахто (аÑÑ– вы, з IP адреÑÑ‹ $1) пожадав о припомÑÐ½ÑƒÑ‚Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ð¹ ку вашому
конту на {{grammar:6sg|{{SITENAME}}}} ($4). Ку тій адреÑÑ— {{PLURAL:$3|Ñ” ÑпрÑгнуте наÑтупне конто|Ñуть ÑпрÑгнуты наÑтупны конта}}:
$2
@@ -563,7 +569,7 @@ $2
Ðынї бы Ñьте ÑÑ Ð¼Ð°Ð²(а) приголоÑити Ñ– зволити нове геÑло. Як тоту пожадавку
поÑлав дахто другый або Ñьте Ñобі на Ñвоє Ñтаре геÑло ÑпомÑнув(а), Ñ– не хочете го
змінити, можете тото Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ñ–Ò‘Ð½Ð¾Ñ€Ð¾Ð²Ð°Ñ‚Ð¸ Ñ– надале хоÑновати Ñтаре геÑло.',
-'passwordreset-emailtext-user' => '{{gender:$1|ХоÑнователь|ХоÑнователька|ХоÑнователь}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попроÑив|попроÑила|попроÑив}} о припомÑÐ½ÑƒÑ‚Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ð¹ ку вашому
+'passwordreset-emailtext-user' => '{{gender:$1|ХоÑнователь|ХоÑнователька|ХоÑнователь}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попроÑив|попроÑила|попроÑив}} о припомÑÐ½ÑƒÑ‚Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ð¹ ку вашому
конту на {{grammar:6sg|{{SITENAME}}}} ($4). Ку тій адреÑÑ— {{PLURAL:$3|Ñ” ÑпрÑжене наÑтупне конто|Ñуть ÑпрÑжены наÑтупну конта}}:
$2
@@ -572,9 +578,22 @@ $2
Ðынї бы Ñьте ÑÑ Ð¼Ð°Ð²(а) приголоÑити у зволити Ñобі нове геÑло. Кідь тоту пожадавку
поÑлав дахто другый або Ñьте Ñобі на Ñвоє Ñтаре геÑло ÑпомÑнув(а),Ñ– не хочете го
змінити, можете тото Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ñ–Ò‘Ð½Ð¾Ñ€Ð¾Ð²Ð°Ñ‚Ð¸ Ñ– надале хоÑновати Ñтаре геÑло.',
-'passwordreset-emailelement' => 'Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ: $1
+'passwordreset-emailelement' => 'Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ: $1
ДочаÑне геÑло: $2',
-'passwordreset-emailsent' => 'Імейл з геÑлом быв поÑланый.',
+'passwordreset-emailsent' => 'Імейл з геÑлом быв поÑланый.',
+'passwordreset-emailsent-capture' => 'Быв выґенерованый припоминаючій імейл, котрый є указаный ниже.',
+'passwordreset-emailerror-capture' => 'Быв выґенерованый припоминаючій імейл, котрый Ñ” указаный ниже, але одоÑлати хоÑнователёви ÑÑ Ð³Ð¾ не подарило: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Зміна імейловой адреÑÑ‹',
+'changeemail-header' => 'Зміна імейловой адреÑу ку конту',
+'changeemail-text' => 'Выповнїнём того Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð°Ñ€Ñ Ñобі зміните імейлову адреÑу. Про Ð¿Ð¾Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ Ð·Ð¼Ñ–Ð½Ñ‹ будете муÑити знову задати Ñвоє геÑло.',
+'changeemail-no-info' => 'Ку тій Ñторінцї мають прÑмый приÑтуп лем приголошены хоÑнователї.',
+'changeemail-oldemail' => 'Ð¢ÐµÐ¿ÐµÑ€Ñ—ÑˆÐ½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ð¾Ð²Ð° адреÑа:',
+'changeemail-newemail' => 'Ðова імейлова адреÑа:',
+'changeemail-none' => '(жадне)',
+'changeemail-submit' => 'Змінити імейл',
+'changeemail-cancel' => 'Сторно',
# Edit page toolbar
'bold_sample' => 'Тучный текÑÑ‚',
@@ -640,9 +659,6 @@ $2
Ваша IP адреÑа Ñ” $3, Ñ– ID Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ” #$5.
ПроÑиме ВаÑ, пиште тоты детайлы во вшыткых запытах на адмініÑтратора.",
'blockednoreason' => 'причіна не была задана',
-'blockedoriginalsource' => "Здройовый текÑÑ‚ Ñторінкы '''$1''' Ñ” вказаный ниже:",
-'blockededitsource' => "ТекÑÑ‚ '''вашых едітовань''' Ñторінкы «$1» наÑлїдує:",
-'whitelistedittitle' => 'Про ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ” выжадоване приголошінÑ',
'whitelistedittext' => 'Про ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ ÑÑ Ð¼ÑƒÑите $1.',
'confirmedittext' => 'МуÑите підтвердити вашу адреÑу ел. пошты передтым Ñк будете едітовати Ñторінкы.
Ðа Ñторінцї [[Special:Preferences|наÑтавлїнÑ]] задайте Ñ– зохабте Ñобі підтвердити Ñвою адреÑу ел. пошты.',
@@ -723,7 +739,7 @@ $2
'''ÐЕ ПУБЛІКУЙТЕ ТУ БЕЗ ПОВОЛЇÐЯ ÐœÐТЕРІÐЛЫ, ШТО СЯ ОХРÐÐЮЮТЬ ÐВТОРЬСКЫМ ПРÐВОМ!''",
'copyrightwarning2' => "ПроÑиме ВаÑ, уважте, што вшыткы Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ñ Ñ– зміны до {{grammar:2sg|{{SITENAME}}}} можуть быти другыма хоÑнователÑми управлены, змінены ці одÑтранены. Покы Ñобі не желате, жебы ваш текÑÑ‚ быв немилоÑердно управлÑный, пак го до {{grammar:2sg|{{SITENAME}}}} не укладайте.<br />
Уложінём приÑпевку ÑÑ Ð·Ð°Ð²Ñзуєте, же Ñ” вашым дїлом або Ñ” Ñкопірованый із жрідел, котры не Ñуть хоронены авторьÑкым правом (тзв. <em>public domain</em>), детайлы найдете на $1. '''Ðе копіруйте дїла хоронены авторьÑкым правом без дозволїнÑ!'''",
-'longpageerror' => "'''ХЫБÐ: Пробуєте уложыти текÑÑ‚ о великоÑти $1 КіБ, причім доволене макÑімум Ñ” $2 КіБ. Ваша ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ Ð½Ðµ може быти уложена.'''",
+'longpageerror' => "'''ХЫБÐ: Пробуєте уложыти текÑÑ‚ о великоÑти {{PLURAL:$1|$1 КіБ}}, причім доволене макÑімум Ñ” {{PLURAL:$2|$2 КіБ}}. Ваша ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ Ð½Ðµ може быти уложена.'''",
'readonlywarning' => "'''УВÐГÐ: Датабаза была замкнута про утримованÑ, также не будете мочі уложыти Ñвої зміны. Можете ÑÑ– го окопіровати до файлу Ñ– уложыти го пізнїше.'''
ÐдмініÑтратор Ñервера, котрый датабазу замкнув, зохабив тото поÑÑнїнÑ: $1",
@@ -888,8 +904,6 @@ $3 зазначів тоту причіну: ''$2''",
'revdelete-unsuppress' => 'ОдÑтранити Ð¾Ð±Ð¼ÐµÐ´Ð¶Ñ–Ð½Ñ Ð½Ð° вернутій верзії',
'revdelete-log' => 'Причіна:',
'revdelete-submit' => 'Ðпліковати на {{PLURAL:$1|зазначену ревізію|зазначены ревізії}}',
-'revdelete-logentry' => 'змінив видимоÑÑ‚ÑŒ ревізії про [[$1]]',
-'logdelete-logentry' => 'змінена видимоÑÑ‚ÑŒ подїї [[$1]]',
'revdelete-success' => "'''ВидимоÑÑ‚ÑŒ ревізії уÑпішно змінена.'''",
'revdelete-failure' => "'''Ðе подарило ÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ видимоÑÑ‚ÑŒ ревізії:'''
$1",
@@ -901,15 +915,6 @@ $1",
'revdel-restore-visible' => 'видительны ревізії',
'pagehist' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñторінкы',
'deletedhist' => 'Вымазана Ñ–ÑторіÑ',
-'revdelete-content' => 'обÑÑг',
-'revdelete-summary' => 'коментарь едітованÑ',
-'revdelete-uname' => 'мено хоÑнователÑ',
-'revdelete-restricted' => 'приданы Ð¾Ð±Ð¼ÐµÐ´Ð¶Ñ–Ð½Ñ Ð¿Ñ€Ð¾ адмініÑтраторів',
-'revdelete-unrestricted' => 'знÑÑ‚Ñ‹ Ð¾Ð±Ð¼ÐµÐ´Ð¶Ñ–Ð½Ñ Ð¿Ñ€Ð¾ адмініÑтраторів',
-'revdelete-hid' => 'Ñховав $1',
-'revdelete-unhid' => 'одкрыв $1',
-'revdelete-log-message' => '$1 $2 ревіз{{PLURAL:$2|Ñ—|Ñ|Ñ—}}',
-'logdelete-log-message' => '$1 про $2 {{PLURAL:$2|події|подїй}}',
'revdelete-hide-current' => 'Хыба ÑÑ…Ð¾Ð²Ð°Ð²Ð°Ð½Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐºÑ‹ з $1 $2: їднать ÑÑ Ð¾ ÑучаÑну ревізію.
Тота ÑÑ Ð½Ðµ даÑÑ‚ÑŒ Ñховати.',
'revdelete-show-no-access' => 'Хыба Ð·Ð¾Ð±Ñ€Ð°Ð¶Ñ–Ð½Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐºÑ‹ з $1 $2: оно Ñ” позначене Ñк «з обмедженым приÑтупом».
@@ -1065,12 +1070,14 @@ $1",
'prefs-rc' => 'ПоÑлїднї зміны',
'prefs-watchlist' => 'Слїдованы Ñторінкы',
'prefs-watchlist-days' => 'ЧіÑло днїв зображеных в Ñлїдованых Ñторінках:',
-'prefs-watchlist-days-max' => 'МакÑімално 7 днїв',
+'prefs-watchlist-days-max' => 'МакÑімално $1 {{PLURAL:$1|день|днї|днїв}}',
'prefs-watchlist-edits' => 'ЧіÑло едітовань зображеных во вылїпшенім ÑпиÑку Ñлїдованых Ñторінок:',
'prefs-watchlist-edits-max' => 'МакÑімалне чіÑло: 1000',
'prefs-watchlist-token' => 'Ключ до ÑпиÑку Ñлїдованых Ñторінок:',
'prefs-misc' => 'Іншы наÑтавлїнÑ',
'prefs-resetpass' => 'Змінити геÑло',
+'prefs-changeemail' => 'Змінити імейл',
+'prefs-setemail' => 'ÐаÑтавити імейлову адреÑу',
'prefs-email' => 'Параметры електронічной пошты',
'prefs-rendering' => 'ВзглÑд',
'saveprefs' => 'Уложыти',
@@ -1130,6 +1137,7 @@ $1",
'yourrealname' => 'Скуточне мено:',
'yourlanguage' => 'Язык:',
'yourvariant' => 'Варіант Ñзыка обÑÑгу:',
+'prefs-help-variant' => 'Вами преферованый варіант або правопиÑ, Ñк ÑÑ Ð¼Ð°ÑŽÑ‚ÑŒ на тій вікі зображати обÑÑговы Ñторінкы.',
'yournick' => 'ПідпиÑ:',
'prefs-help-signature' => 'Коментарї на діÑкузіÑÑ… бы ÑÑ Ð¼Ð°Ð»Ð¸ підпиÑовати помочов „<nowiki>~~~~</nowiki>“, што ÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚ÑŒ на ваш Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñ– актуалный чаÑ.',
'badsig' => 'Ðеправилний підпиÑ.
@@ -1170,7 +1178,7 @@ $1",
'userrights-lookup-user' => 'Управовати хоÑновательÑкы ґрупы',
'userrights-user-editname' => 'Задайте мено хоÑнователÑ:',
'editusergroup' => 'Едітовати хоÑновательÑкы ґрупы',
-'editinguser' => "Зміна прав хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Зміна прав хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Змінити ґрупы хоÑнователÑ',
'saveusergroups' => 'Уложыти хоÑновательÑкы ґрупы',
'userrights-groupsmember' => 'Член ґруп:',
@@ -1264,13 +1272,13 @@ $1",
'right-autopatrol' => 'Ðвтоматічне Ð¾Ð·Ð½Ð°Ñ‡Ð¾Ð²Ð°Ð½Ñ ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½ÑŒ Ñк перевіреных',
'right-patrolmarks' => 'Ð—Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ñ Ð¿Ð°Ñ‚Ñ€Ð¾Ð»Ñ‘Ð²Ð°Ð½Ñ‹Ñ… Ñторінок в ПоÑлїднїх змінах',
'right-unwatchedpages' => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶Ñ–Ð½Ñ ÑпиÑку неÑлїдованых Ñторінок',
-'right-trackback' => 'ЗаÑÑ‹Ð»Ð°Ð½Ñ Trackback',
'right-mergehistory' => 'Ð—Ð»ÑƒÑ‡Ð¾Ð²Ð°Ð½Ñ Ñ–Ñторії Ñторінок',
'right-userrights' => 'Зміна вшыткых прав оÑтатнім хоÑнователÑм',
'right-userrights-interwiki' => 'Зміна прав хоÑнователÑм на іншых вікі',
'right-siteadmin' => 'Замыкана Ñ– Ð¾Ð´Ð¾Ð¼Ñ‹ÐºÐ°Ð½Ñ Ð´Ð°Ñ‚Ð°Ð±Ð°Ð·Ñ‹',
'right-override-export-depth' => 'ЕкÑпорт Ñторінок включаючі звÑзаны Ñторінкы з глубков до 5',
'right-sendemail' => 'ПоÑÑ‹Ð»Ð°Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ñ‹ іншым хоÑнователÑм',
+'right-passwordreset' => 'ÐŸÐµÑ€ÐµÐ·ÐµÑ€Ð°Ð½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ñ–Ð² про зміну геÑла',
# User rights log
'rightslog' => 'Лоґ хоÑновательÑкых прав',
@@ -1304,16 +1312,17 @@ $1",
'action-suppressionlog' => 'переглÑд того пріватного лоґу',
'action-block' => 'Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð³Ð¾ хоÑнователÑ',
'action-protect' => 'змінити рівень охраны той Ñторінкы',
+'action-rollback' => 'швыдко вернути управы поÑлїднёго хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐµÐ´Ñ–Ñ‚ÑƒÑŽÑ‡Ð¾Ð³Ð¾ дану Ñторінку',
'action-import' => 'імпорт той Ñторінкы з іншой вікі',
'action-importupload' => 'імпорт той Ñторінкы з файлу',
'action-patrol' => 'позначіти чуджі ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñк перевірены',
'action-autopatrol' => 'означіти влаÑтных едітовань Ñк патролованы',
'action-unwatchedpages' => 'Ð·Ð¾Ð±Ñ€Ð°Ð¶Ñ–Ð½Ñ ÑпиÑку неÑлїдованых Ñторінок',
-'action-trackback' => 'поÑлати Trackback',
'action-mergehistory' => 'Злучіти Ñ–Ñторію той Ñторінкы',
'action-userrights' => 'Зміна прав вшыткым хоÑнователÑм',
'action-userrights-interwiki' => 'зміна прав хоÑнователїв на іншых вікі',
'action-siteadmin' => 'замыкати або одомыкати датабазу',
+'action-sendemail' => 'поÑылати імейлы',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
@@ -1345,6 +1354,7 @@ $1",
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|Ñлїдуючій хоÑнователь|Ñлїдуючі хоÑнователї|Ñлїдуючіх хоÑнователїв}}]',
'rc_categories' => 'Лем з катеґорій (роздїлёвач «|»)',
'rc_categories_any' => 'Будь-Ñкый',
+'rc-change-size-new' => '$1 {{PLURAL:$1|байтt|байты|байтів}} по змінї',
'newsectionsummary' => '/* $1 */ нова ÑекціÑ',
'rc-enhanced-expand' => 'Вказати детайлы (потрібный JavaScript)',
'rc-enhanced-hide' => 'Сховати детайлы',
@@ -1396,6 +1406,7 @@ $1",
'ignorewarnings' => 'Іґноровати вшыткы варованÑ',
'minlength1' => 'Ðазва файлу муÑить мати холем єдну літеру.',
'illegalfilename' => 'Ðазва файлу "$1" обÑÑгує буквы, котры не Ñуть поволены в назвах Ñторінок. ПроÑиме, переменуйте файл Ñ– Ñпробуйте го награти зÑÑÑŒ.',
+'filename-toolong' => 'Ðазвы файлів не можуть быти довшы, Ñк 240 байтів.',
'badfilename' => 'Ðазва файлу была змінена на „$1“.',
'filetype-mime-mismatch' => 'РоÑÑˆÑ‹Ñ€Ñ—Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ ".$1" не одповідать ёго MIME тіпу ($2).',
'filetype-badmime' => 'Ðе Ñ” поволене начітати файлы MIME тіп „$1“.',
@@ -1604,23 +1615,24 @@ $1',
'filerevert-badversion' => 'Ðе Ñ” доÑтупна Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð²ÐµÑ€Ð·Ñ–Ñ Ñ‚Ð¾Ð³Ð¾ файлу з одоповідаючов чаÑовов значков.',
# File deletion
-'filedelete' => 'Ð—Ð¼Ð°Ð·Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ $1',
-'filedelete-legend' => 'Змазати файл',
-'filedelete-intro' => "Рихтуєте ÑÑ Ð·Ð¼Ð°Ð·Ð°Ñ‚Ð¸ файл '''[[Media:$1|$1]]''' Ñ– з цілов Ñ–Ñторіёв.",
-'filedelete-intro-old' => "Рихтуєте ÑÑ Ð·Ð¼Ð°Ð·Ð°Ñ‚Ð¸ верзію файлу '''[[Media:$1|$1]]''' з [$4 $3 $2].",
-'filedelete-comment' => 'Причіна:',
-'filedelete-submit' => 'Вымазати',
-'filedelete-success' => "Файл '''$1''' быв змазаный.",
-'filedelete-success-old' => "Ð’ÐµÑ€Ð·Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ '''[[Media:$1|$1]]''' з $3 $2 была змазана.",
-'filedelete-nofile' => "Файл '''$1''' не екзіÑтує.",
-'filedelete-nofile-old' => "Ðе екзіÑтує архівна Ð²ÐµÑ€Ð·Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ '''$1'''із зазначеныма атрібутами.",
-'filedelete-otherreason' => 'Інша/додаткова причіна:',
-'filedelete-reason-otherlist' => 'Інша причіна',
-'filedelete-reason-dropdown' => '*Звычайны причіны змазанÑ
+'filedelete' => 'Ð—Ð¼Ð°Ð·Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ $1',
+'filedelete-legend' => 'Змазати файл',
+'filedelete-intro' => "Рихтуєте ÑÑ Ð·Ð¼Ð°Ð·Ð°Ñ‚Ð¸ файл '''[[Media:$1|$1]]''' Ñ– з цілов Ñ–Ñторіёв.",
+'filedelete-intro-old' => "Рихтуєте ÑÑ Ð·Ð¼Ð°Ð·Ð°Ñ‚Ð¸ верзію файлу '''[[Media:$1|$1]]''' з [$4 $3 $2].",
+'filedelete-comment' => 'Причіна:',
+'filedelete-submit' => 'Вымазати',
+'filedelete-success' => "Файл '''$1''' быв змазаный.",
+'filedelete-success-old' => "Ð’ÐµÑ€Ð·Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ '''[[Media:$1|$1]]''' з $3 $2 была змазана.",
+'filedelete-nofile' => "Файл '''$1''' не екзіÑтує.",
+'filedelete-nofile-old' => "Ðе екзіÑтує архівна Ð²ÐµÑ€Ð·Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ '''$1'''із зазначеныма атрібутами.",
+'filedelete-otherreason' => 'Інша/додаткова причіна:',
+'filedelete-reason-otherlist' => 'Інша причіна',
+'filedelete-reason-dropdown' => '*Звычайны причіны змазанÑ
** ÐŸÐ¾Ñ€ÑƒÑˆÑ–Ð½Ñ Ð°Ð²Ñ‚Ð¾Ñ€ÑŒÑкых прав
** Дуплікатный файл',
-'filedelete-edit-reasonlist' => 'Едітовати причіны вымазанÑ',
-'filedelete-maintenance' => 'ÐœÐ°Ð·Ð°Ð½Ñ Ñ– Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ‘Ð²Ð°Ð½Ñ Ñ” про роботу ÑƒÑ‚Ñ€Ð¸Ð¼Ð¾Ð²Ð°Ð½Ñ Ð´Ð¾Ñ‡Ð°Ñно выпнуте.',
+'filedelete-edit-reasonlist' => 'Едітовати причіны вымазанÑ',
+'filedelete-maintenance' => 'ÐœÐ°Ð·Ð°Ð½Ñ Ñ– Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ‘Ð²Ð°Ð½Ñ Ñ” про роботу ÑƒÑ‚Ñ€Ð¸Ð¼Ð¾Ð²Ð°Ð½Ñ Ð´Ð¾Ñ‡Ð°Ñно выпнуте.',
+'filedelete-maintenance-title' => 'Ðе годен змазати файл',
# MIME search
'mimesearch' => 'ГлÑÐ´Ð°Ð½Ñ Ð¿Ð¾ MIME',
@@ -1740,7 +1752,7 @@ $1',
'listusers-editsonly' => 'Вказати лем хоÑнователїв з едітованÑми',
'listusers-creationsort' => 'Сортовати Ð¿Ð¾Ð´Ð»Ñ Ð´Ð°Ñ‚ÑƒÐ¼Ñƒ ÑтворїнÑ',
'usereditcount' => '$1 {{PLURAL:$1|едітованÑ|едітованÑ|едітовань}}',
-'usercreated' => 'Створеный $1 о $2',
+'usercreated' => '{{GENDER:$3|РеґіÑтрованый|РеґіÑтрована|РеґіÑтрованый(а)}} $1 в $2',
'newpages' => 'Ðовы Ñторінкы',
'newpages-username' => 'Мено хоÑнователÑ:',
'ancientpages' => 'Сторінкы, Ñкы ÑÑ Ð½Ð°Ð¹Ð´Ð¾Ð²ÑˆÐµ не едітовали',
@@ -1833,12 +1845,8 @@ $1',
'activeusers-noresult' => 'Ðенайдженый жаден хоÑнователь.',
# Special:Log/newusers
-'newuserlogpage' => 'Лоґ вытварÑнь хоÑнователїв',
-'newuserlogpagetext' => 'Тото Ñ” ÑпиÑок ново реґіÑтрованых хоÑнователїв.',
-'newuserlog-byemail' => 'гело поÑлане електронічнов поштов',
-'newuserlog-create-entry' => 'Ðовый хоÑнователь',
-'newuserlog-create2-entry' => 'вытворив нове конто $1',
-'newuserlog-autocreate-entry' => 'Конто вытворене автоматічно',
+'newuserlogpage' => 'Лоґ вытварÑнь хоÑнователїв',
+'newuserlogpagetext' => 'Тото Ñ” ÑпиÑок ново реґіÑтрованых хоÑнователїв.',
# Special:ListGroupRights
'listgrouprights' => 'Права ґруп хоÑнователїв',
@@ -1868,7 +1876,7 @@ $1',
'emailpagetext' => 'Помочов ниже зображеного Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð°Ñ€Ñ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ тому хоÑнователёви поÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ ÐµÐ». поштов.
ÐдреÑа ел. пошты, котру мате зазначену в [[Special:Preferences|наÑтавлїнÑ]],ÑÑ Ð¾Ð±Ñвить Ñк адреÑа одоÑÑ‹Ð»Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ÑˆÑ‚Ñ‹, жебы вам адреÑат міг одповіÑти прÑмо.',
'usermailererror' => 'Хыба поштового проґраму:',
-'defemailsubject' => '{{SITENAME}}: лиÑÑ‚',
+'defemailsubject' => '{{SITENAME}}: лиÑÑ‚ од "$1"',
'usermaildisabled' => 'ПоÑÑ‹Ð»Ð°Ð½Ñ ÐµÐ». пошты Ñ” выпнуте',
'usermaildisabledtext' => 'Ðе маєте право одоÑылати ел. пошту іншым хоÑнователÑм той вікі',
'noemailtitle' => 'Без адреÑÑ‹ ел. пошты',
@@ -1922,7 +1930,7 @@ $1',
'watchmethod-list' => 'глÑдають ÑÑ Ð½Ð°Ð¹Ð½Ð¾Ð²ÑˆÑ‹ ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñлїдованых Ñторінок',
'watchlistcontains' => 'Ðа Ñвоїм ÑпиÑку Ñлїдованых Ñторінок маєте $1 {{PLURAL:$1|положку|положкы|положок}}.',
'iteminvalidname' => 'Проблем з положков „$1“, неплатна назва…',
-'wlnote' => 'Ðиже Ñ” {{PLURAL:$1|оÑÑ‚Ð°Ñ‚Ð½Ñ Ð·Ð¼Ñ–Ð½Ð°|оÑтатнї $1 зміны|оÑтатнїх $1 змін}} за {{PLURAL:$2|оÑтатнїй|оÑтатнї|оÑтатнїх}} <b>$2</b> {{PLURAL:$2|годину|годины|годин}}.',
+'wlnote' => 'Ðиже Ñ” {{PLURAL:$1|оÑÑ‚Ð°Ñ‚Ð½Ñ Ð·Ð¼Ñ–Ð½Ð°|оÑтатнї $1 зміны|оÑтатнїх $1 змін}} за {{PLURAL:$2|оÑтатнїй|оÑтатнї|оÑтатнїх}} <b>$2</b> {{PLURAL:$2|годину|годины|годин}} до do $4, $3.',
'wlshowlast' => 'Вказати зміны за поÑлїднїх $1 годин $2 днїв $3',
'watchlist-options' => 'ÐаÑтавлїна ÑпиÑку Ñлїдованых',
@@ -1986,8 +1994,6 @@ $UNWATCHURL
'actionfailed' => 'ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ ÑÑ Ð½Ðµ подарила',
'deletedtext' => '"$1" было змазане.
Смоть $2 про ÑпиÑок поÑлїднїх змазань.',
-'deletedarticle' => 'змазаный "[[$1]]"',
-'suppressedarticle' => 'затаїв „[[$1]]“',
'dellogpage' => 'Лоґ вымазанÑ',
'dellogpagetext' => 'Ту Ñ” ÑпиÑок поÑлїднїх змазаных Ñторінок.',
'deletionlog' => 'Лоґ вымазанÑ',
@@ -2032,7 +2038,10 @@ $UNWATCHURL
'unprotectedarticle' => 'знÑта охрана з "[[$1]]"',
'movedarticleprotection' => 'наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð·Ð°Ð¼ÐºÑ–Ð² переÑунуто з „[[$2]]“ на „[[$1]]“',
'protect-title' => 'Зміна уровнї охраны Ñторінкы „$1“',
+'protect-title-notallowed' => 'Указати уровни охраны Ñторінкы „$1“',
'prot_1movedto2' => '«[[$1]]» переменована на «[[$2]]»',
+'protect-badnamespace-title' => 'Ðезамыкательный проÑтор назв',
+'protect-badnamespace-text' => 'Сторінкы в тім проÑторї назв не годен замыкати.',
'protect-legend' => 'Підтвердити замкнутÑ',
'protectcomment' => 'Причіна:',
'protectexpiry' => 'Кінчіть:',
@@ -2052,6 +2061,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Лем адмініÑтраторы',
'protect-summary-cascade' => 'каÑкадовый',
'protect-expiring' => 'кінчіть $1 (UTC)',
+'protect-expiring-local' => 'кінчіть ÑÑ $1',
'protect-expiry-indefinite' => 'до одволанÑ',
'protect-cascade' => 'Хранити Ñторінкы вложены до той Ñторінкы (каÑкадова охрана)',
'protect-cantedit' => 'Ð’Ñ‹ не можете змінити рівень охороны той Ñторінкы, тому што вы не маєте прав про єй едітованÑ.',
@@ -2107,7 +2117,6 @@ $UNWATCHURL
'undeletereset' => 'РеÑетовати',
'undeleteinvert' => 'Інвертовати Ñелекцію',
'undeletecomment' => 'Причіна:',
-'undeletedarticle' => 'обновив "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|Обновлена $1 верзіÑ|Обновлены $1 верзії|Обновленых $1 верзій}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Обновлена єдна верзіÑ|Обновлены $1 верзії|Обновленых $1 верзій}} Ñ– $2 {{PLURAL:$2|файл|файлы|файлів}}.',
'undeletedfiles' => '{{PLURAL:$1|обновленый $1 файл|обновлены $1 файлы|обновленых $1 файлів}}',
@@ -2245,6 +2254,7 @@ $1',
'blocklist-userblocks' => 'Сховати заблокованы конта',
'blocklist-tempblocks' => 'Сховати дочаÑны заблокованÑ',
'blocklist-addressblocks' => 'Сховати Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ”Ð´Ð½Ð¾Ð¹ IP адреÑÑ‹',
+'blocklist-rangeblocks' => 'Скрыти Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ€Ð¾ÑÑÑгів',
'blocklist-timestamp' => 'ЧаÑова значка',
'blocklist-target' => 'Ціль',
'blocklist-expiry' => 'Кінчіть',
@@ -2267,6 +2277,7 @@ $1',
'unblocklink' => 'одблоковати',
'change-blocklink' => 'змінити блок',
'contribslink' => 'приÑпевкы',
+'emaillink' => 'поÑлати імейл',
'autoblocker' => 'Сьте были автоматічно блокованы, протоже здїлÑте IP-адреÑу з хоÑнователём „[[User:$1|$1]]“. Причіна Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð³Ð¾ хоÑнователÑ: „$2“',
'blocklogpage' => 'Ð—Ð°Ð¿Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½ÑŒ',
'blocklog-showlog' => '{{GENDER:$1|Тот хоÑнователь быв уж блокованый.|Тота хоÑнователька уж была блокована.|Тот хоÑнователь уж быв блокованый.}}
@@ -2386,9 +2397,6 @@ $1',
'movepage-page-moved' => 'Сторінка $1 была переменована на $2.',
'movepage-page-unmoved' => 'Сторінка $1 не може быти переменована на $2.',
'movepage-max-pages' => '{{PLURAL:$1|Была переменована макÑімално поволена єдна Ñторінка|Были переменованы макÑімално поволены $1 Ñторінкы|Было переменоване макÑімално поволеных $1 Ñторінок}}, веце Ñ—Ñ… уж автоматічно переменованых не буде.',
-'1movedto2' => 'переменовав «[[$1]]» на «[[$2]]»',
-'1movedto2_redir' => 'переменовав «[[$1]]» на «[[$2]]» поверьх напрÑмлїнÑ',
-'move-redirect-suppressed' => 'напрÑÐ¼Ð»Ñ—Ð½Ñ Ð½Ðµ Ñтворене',
'movelogpage' => 'Лоґ переменовань',
'movelogpagetext' => 'Тото Ñ” ÑпиÑок вшыткых переменованый Ñторінок.',
'movesubpage' => '{{PLURAL:$1|ПідÑторінка|ПідÑторінкы}}',
@@ -2401,7 +2409,7 @@ $1',
Цілёва Ñторінка „[[:$1]]“ уж екзіÑтує. Желате Ñобі єй змазати про ÑƒÐ²Ð¾Ð»Ð½Ñ—Ð½Ñ Ð¼Ñ–ÑÑ†Ñ Ð¿Ñ€Ð¾ переÑун?',
'delete_and_move_confirm' => 'Гей, змазати Ñторінку',
-'delete_and_move_reason' => 'Змазане про ÑƒÐ¼Ð¾Ð¶Ð½Ñ—Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ',
+'delete_and_move_reason' => 'Змазане про ÑƒÐ¼Ð¾Ð¶Ð½Ñ—Ð½Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ð· „[[$1]]“',
'selfmove' => 'Початочна Ñ– нова назва Ñуть ровнакы;
не може переменовати Ñторінку на Ñаму Ñебе.',
'immobile-source-namespace' => 'Сторінкы в проÑторї назв „$1“ ÑÑ Ð½Ðµ дають переменовати',
@@ -2507,6 +2515,8 @@ $1',
'import-upload' => 'Ðаграти XML дата',
'import-token-mismatch' => 'Стратили ÑÑ Ð´Ð°Ñ‚Ð° релації. Спробуйте то знову.',
'import-invalid-interwiki' => 'Із зазначеной вікі ÑÑ Ð½Ðµ даÑÑ‚ÑŒ імпортовати.',
+'import-error-edit' => 'Сторінка „$1“ ÑÑ Ð½Ðµ наімпортовала, бо не мате право єй едітовати.',
+'import-error-create' => 'Сторінка „$1“ ÑÑ Ð½Ðµ наімпортовала, бо не мате право єй Ñтворити.',
# Import log
'importlogpage' => 'Книга імпортів',
@@ -2634,9 +2644,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Книга перевіреных едітовань',
'patrol-log-header' => 'Тото є книга перевіреных верзій.',
-'patrol-log-line' => 'перевірив $1 Ñторінкы $2 $3',
-'patrol-log-auto' => '(автоматічно)',
-'patrol-log-diff' => 'ревізію $1',
'log-show-hide-patrol' => '$1 книгу запиÑів патролованÑ',
# Image deletion
@@ -2664,11 +2671,11 @@ $1',
'file-info' => 'розмір файлу: $1, MIME-тіп: $2',
'file-info-size' => '$1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4',
'file-info-size-pages' => '$1 × $2 пікÑелів, великоÑÑ‚ÑŒ файлу: $3, MIME тіп: $4, $5 {{PLURAL:$5|Ñторінка|Ñторінкы|Ñторінок}}',
-'file-nohires' => '<small>Ðе Ñ” Ð²ÐµÑ€Ð·Ñ–Ñ Ð· векшым розлишінём.</small>',
+'file-nohires' => 'Ðе Ñ” Ð²ÐµÑ€Ð·Ñ–Ñ Ð· векшым розлишінём.',
'svg-long-desc' => 'SVG-файл, номінално $1 × $2 пікÑелів, розмір файлу: $3',
'show-big-image' => 'Повне розлишінÑ',
-'show-big-image-preview' => '<small>Розмір того наглÑду: $1.</small>',
-'show-big-image-other' => '<small>Іншы розлишінÑ: $1.</small>',
+'show-big-image-preview' => 'Розмір того наглÑду: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Інше|іншы}} розлишінÑ: $1.',
'show-big-image-size' => '$1 × $2 пікÑелів',
'file-info-gif-looped' => 'в Ñлючцї',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Ñнимок|Ñнимкы|Ñнимків}}',
@@ -2688,6 +2695,13 @@ $1',
'bydate' => 'Ð¿Ð¾Ð´Ð»Ñ Ð´Ð°Ñ‚ÑƒÐ¼Ñƒ',
'sp-newimages-showfrom' => 'Вказати новы файлы почінаючі од $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунды|$1 Ñекунд}}',
+'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
+'hours' => '{{PLURAL:$1|$1 година|$1 годины|$1 годин}}',
+'days' => '{{PLURAL:$1|$1 день|$1 днї|$1 днїв}}',
+'ago' => '$1 тому',
+
# Bad image list
'bad_image_list' => 'Формат має быти наÑтупным:
@@ -3181,13 +3195,6 @@ $5
'scarytranscludefailed' => '[Ðе подарило ÑÑ Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ñ‚Ð¸ шаблону про $1]',
'scarytranscludetoolong' => '[URL дуже довгый]',
-# Trackbacks
-'trackbackbox' => 'Trackback ку тій Ñторінцї:<br />
-$1',
-'trackbackremove' => '([$1 Змазати])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback быв уÑпішно змазаный.',
-
# Delete conflict
'deletedwhileediting' => "'''Увага:''' Ð¿Ð¾Ñ‡Ð°Ñ Ð²Ð°ÑˆÐ¾Ð¹ едітації была тота Ñторінка змазана!",
'confirmrecreate' => 'ХоÑнователь [[User:$1|$1]] ([[User talk:$1|діÑкузіÑ]]) тоту Ñторінку змазав потім, Ñк Ñьте зачали едітовати з причінов:
@@ -3268,6 +3275,9 @@ $1',
'watchlisttools-edit' => 'ÐаглÑд Ñ– ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ ÑпиÑку',
'watchlisttools-raw' => 'Едітовати Ñк текÑÑ‚',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|діÑкузіÑ]])',
+
# Core parser functions
'unknown_extension_tag' => 'Ðезнама значка роÑшырїнÑ: „$1“',
'duplicate-defaultsort' => 'Увага: Імпліцітный ключ ÑÐ¾Ñ€Ñ‚Ð¾Ð²Ð°Ð½Ñ (DEFAULTSORTKEY) „$2“ перепиÑує Ñкоре наÑтавлену годноту „$1“.',
@@ -3365,13 +3375,16 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
# Special:ComparePages
-'comparepages' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñторінок',
-'compare-selector' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñ€ÐµÐ²Ñ–Ð·Ñ–Ð¹ Ñторінок',
-'compare-page1' => 'Сторінка 1',
-'compare-page2' => 'Сторінка 2',
-'compare-rev1' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ 1',
-'compare-rev2' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ 2',
-'compare-submit' => 'Порівнати',
+'comparepages' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñторінок',
+'compare-selector' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñ€ÐµÐ²Ñ–Ð·Ñ–Ð¹ Ñторінок',
+'compare-page1' => 'Сторінка 1',
+'compare-page2' => 'Сторінка 2',
+'compare-rev1' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ 1',
+'compare-rev2' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ 2',
+'compare-submit' => 'Порівнати',
+'compare-invalid-title' => 'Вами задана назва є неправилна.',
+'compare-title-not-exists' => 'Зазначена назва не екзіÑтує.',
+'compare-revision-not-exists' => 'Зазначена Ñ€ÐµÐ²Ñ–Ð·Ñ–Ñ Ð½Ðµ екзіÑтує.',
# Database error messages
'dberr-header' => 'Тота вікі має даÑкы проблемы',
@@ -3398,4 +3411,63 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'sqlite-has-fts' => '$1 з підпоров повнотекÑтового глÑданÑ',
'sqlite-no-fts' => '$1 без підпоры повнотекÑтового глÑданÑ',
+# New logging system
+'logentry-delete-delete' => '$1 змазав Ñторінку $3',
+'logentry-delete-restore' => '$1 обновив Ñторінку $3',
+'revdelete-uname-unhid' => 'Ñ–Ð¼Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ð´ÐºÑ€Ñ‹Ñ‚Ðµ',
+'revdelete-restricted' => 'приданы Ð¾Ð±Ð¼ÐµÐ´Ð¶Ñ–Ð½Ñ Ð¿Ñ€Ð¾ адмініÑтраторів',
+'revdelete-unrestricted' => 'знÑÑ‚Ñ‹ Ð¾Ð±Ð¼ÐµÐ´Ð¶Ñ–Ð½Ñ Ð¿Ñ€Ð¾ адмініÑтраторів',
+'logentry-move-move' => '$1 переÑунув Ñторінку $3 на $4',
+'logentry-move-move-noredirect' => '$1 переменовав Ñторінку $3 на $4 без ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ Ð½Ð°Ð¿Ñ€ÑмлїнÑ',
+'logentry-move-move_redir' => '$1 переменовав Ñторінку $3 на $4 з вычерÑнём напрÑмлїнём',
+'logentry-move-move_redir-noredirect' => '$1 переменовав Ñторінку $3 на $4 міÑце напрÑÐ¼Ð»Ñ—Ð½Ñ Ð±ÐµÐ· ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ Ð½Ð°Ð¿Ñ€ÑмлїнÑ',
+'newuserlog-byemail' => 'гело поÑлане електронічнов поштов',
+
+# Feedback
+'feedback-subject' => 'Предмет:',
+'feedback-message' => 'ПовідомлїнÑ:',
+'feedback-cancel' => 'Сторно',
+'feedback-submit' => 'ОдоÑлати одозву',
+'feedback-adding' => 'Коментарь ÑÑ Ð¿Ñ€Ð¸Ð´Ð°Ð²Ð°Ñ‚ÑŒ на Ñторінку…',
+'feedback-error1' => 'Хыба: Ðерозознаый резултат з API',
+'feedback-error2' => 'Хыба: Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ ÑÑ Ð½Ðµ подарило',
+'feedback-error3' => 'Хыба: API не вернуло жадну одповідь',
+'feedback-close' => 'Готово',
+
+# API errors
+'api-error-badaccess-groups' => 'Ðе мате доволено награвати файлы на тоту вікі.',
+'api-error-badtoken' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: планый знак.',
+'api-error-copyuploaddisabled' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð²Ð°Ð½Ñ Ð· URL Ñ” на тім Ñервері заказане.',
+'api-error-duplicate' => 'Ðа тій вікі уж {{PLURAL:$1|екзіÑтує [$2 другый файл]|екзіÑтують [$2 іншы файлы]}} з такым Ñамым обÑÑгом.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|быв [$2 другый файл]|были [$2 даÑкы другы файлы]}} з такым Ñамым обÑÑгом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|дупліцітный файл, Ñкый быв|дупліцітны файл, Ñк были}} змазаны',
+'api-error-duplicate-popup-title' => 'Дупліцітны {{PLURAL:$1|файл|файлы}}',
+'api-error-empty-file' => 'Ðачітаный файл Ñ” порожнїй.',
+'api-error-fetchfileerror' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: дішло ку хыбі Ð¿Ð¾Ñ‡Ð°Ñ Ð¾Ð±Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ.',
+'api-error-file-too-large' => 'Ðачітаный файл Ñ” барз великый.',
+'api-error-filename-tooshort' => 'Ðазва файлу Ñ” барз курта.',
+'api-error-filetype-banned' => 'Тот тіп файлу є заказаный.',
+'api-error-filetype-missing' => 'Тот файл не мать роÑшырїнÑ.',
+'api-error-hookaborted' => 'Пожадована вами зміна была одмітнута дакотрым роÑшырінём.',
+'api-error-http' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: не подарило ÑÑ Ð¿Ñ€Ð¸Ð¿Ð¾Ñ—Ñ‚Ð¸ ку Ñерверу.',
+'api-error-illegal-filename' => 'Тота назва файлу не є поволена.',
+'api-error-internal-error' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: дішло ку хыбі Ð¿Ð¾Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð°Ñ†Ð¾Ð²Ð°Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ начітаного файлу.',
+'api-error-invalid-file-key' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: файл ÑÑ Ð½Ðµ нашов в дочаÑнім уÑховіщі.',
+'api-error-missingparam' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: хыбують параметры пожадавкы.',
+'api-error-missingresult' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: не годен Ñтановити, ці ÐºÐ¾Ð¿Ñ–Ñ€Ð¾Ð²Ð°Ð½Ñ Ð±Ñ‹Ð»Ð¾ уÑпішне.',
+'api-error-mustbeloggedin' => 'Про Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² муÑите быти приголошеный.',
+'api-error-mustbeposted' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: пожадавка муÑить быти через HTTP POST.',
+'api-error-noimageinfo' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ð±Ñ‹Ð»Ð¾ уÑпішне, але Ñервер не додав о файлї жадны інформації.',
+'api-error-nomodule' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: не Ñ” наÑтавленый модул начітаванÑ.',
+'api-error-ok-but-empty' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: Ñервер не одповідать.',
+'api-error-overwrite' => 'Ðе Ñ” доволене перепиÑати екзіÑтуючій файл.',
+'api-error-stashfailed' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: Ñерверу ÑÑ Ð½Ðµ подарило уложыти дочаÑный файл.',
+'api-error-timeout' => 'Сервер не одповідав в очекаванім чаÑÑ—.',
+'api-error-unclassified' => 'Дішло ку незнамій хыбі.',
+'api-error-unknown-code' => 'Ðезнама хыба: „$1“',
+'api-error-unknown-error' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°: дішло ку хыбі при Ñпробі о Ð½Ð°Ñ‡Ñ–Ñ‚Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ.',
+'api-error-unknown-warning' => 'Ðезнаме варованÑ: $1',
+'api-error-uploaddisabled' => 'ÐÐ°Ñ‡Ñ–Ñ‚Ð°Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ñ” на тій вікі выпнуте.',
+'api-error-verification-error' => 'Файл Ñ” може пошкодженый, або мать плане роÑшырїнÑ.',
+
);
diff --git a/languages/messages/MessagesRup.php b/languages/messages/MessagesRup.php
index 1d49ad6a..71f24f8d 100644
--- a/languages/messages/MessagesRup.php
+++ b/languages/messages/MessagesRup.php
@@ -109,14 +109,13 @@ Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {
'gotaccountlink' => 'Ligats-vã',
# Edit pages
-'summary' => 'Rezime:',
-'minoredit' => 'Aistã easte alãxire njicã',
-'watchthis' => 'Mutrits-u frãndzã aistã',
-'savearticle' => 'Avigljats-u frãndzã',
-'showpreview' => 'Spuni u-privideare',
-'showdiff' => 'Spuni le-alãxirle',
-'whitelistedittitle' => 'Lipseashce s-vã ligats ta s-alãxits',
-'loginreqlink' => 'Ligats-vã',
+'summary' => 'Rezime:',
+'minoredit' => 'Aistã easte alãxire njicã',
+'watchthis' => 'Mutrits-u frãndzã aistã',
+'savearticle' => 'Avigljats-u frãndzã',
+'showpreview' => 'Spuni u-privideare',
+'showdiff' => 'Spuni le-alãxirle',
+'loginreqlink' => 'Ligats-vã',
# Search results
'powersearch' => 'Caftã',
@@ -198,7 +197,6 @@ Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {
'move-watch' => 'Mutrits-u frãndzã aistã',
'movepagebtn' => 'Tradzets-u frãndzã',
'movedto' => 'tradzitã tu',
-'1movedto2' => '[[$1]] s-trãdzi tu [[$2]]',
'movereason' => 'Itia:',
# Namespace 8 related
diff --git a/languages/messages/MessagesRuq.php b/languages/messages/MessagesRuq.php
index d3d5283e..ce2d0cef 100644
--- a/languages/messages/MessagesRuq.php
+++ b/languages/messages/MessagesRuq.php
@@ -10,4 +10,4 @@
*
*/
-$fallback = 'ruq-latn';
+$fallback = 'ruq-latn, ro';
diff --git a/languages/messages/MessagesRuq_cyrl.php b/languages/messages/MessagesRuq_cyrl.php
index 30653f5a..a4d188c0 100644
--- a/languages/messages/MessagesRuq_cyrl.php
+++ b/languages/messages/MessagesRuq_cyrl.php
@@ -134,8 +134,7 @@ $messages = array(
'nstab-category' => 'категориа',
# General errors
-'viewsource' => 'баганаере',
-'viewsourcefor' => 'пентру $1',
+'viewsource' => 'баганаере',
# Login and logout pages
'yourname' => 'Ðом дутилизатору:',
@@ -262,9 +261,6 @@ $3',
'watching' => 'О клајаере...',
'unwatching' => 'О деклајаере...',
-# Delete
-'deletedarticle' => 'делајрај "[[$1]]"',
-
# Rollback
'rollbacklink' => 'ревенире',
@@ -333,7 +329,7 @@ $3',
'tooltip-diff' => 'Ратај це модификајри аи фајцут текÑтулуи.',
# Media information
-'file-nohires' => '<small>Це-н-еÑÑ‚ нреÑолуцион маи мари.</small>',
+'file-nohires' => 'Це-н-еÑÑ‚ нреÑолуцион маи мари.',
'show-big-image' => 'Мареште реÑолуцион',
# Bad image list
diff --git a/languages/messages/MessagesRuq_latn.php b/languages/messages/MessagesRuq_latn.php
index 82f83d55..b17a0cf8 100644
--- a/languages/messages/MessagesRuq_latn.php
+++ b/languages/messages/MessagesRuq_latn.php
@@ -134,8 +134,7 @@ $messages = array(
'nstab-category' => 'kategoria',
# General errors
-'viewsource' => 'Baganaere',
-'viewsourcefor' => 'pentru $1',
+'viewsource' => 'Baganaere',
# Login and logout pages
'yourname' => "Nom d'utilizatoru:",
@@ -262,9 +261,6 @@ $3',
'watching' => 'O klăaere...',
'unwatching' => 'O deklăaere...',
-# Delete
-'deletedarticle' => 'delÇŽraj "[[$1]]"',
-
# Rollback
'rollbacklink' => 'revenire',
@@ -333,7 +329,7 @@ $3',
'tooltip-diff' => 'Rată ce modifikări ai făcut tekstului.',
# Media information
-'file-nohires' => "<small>Ce-n-est n'resolucion mai mari.</small>",
+'file-nohires' => "Ce-n-est n'resolucion mai mari.",
'show-big-image' => 'MareÅŸte resolucion',
# Bad image list
diff --git a/languages/messages/MessagesSa.php b/languages/messages/MessagesSa.php
index ceafac0a..c213e060 100644
--- a/languages/messages/MessagesSa.php
+++ b/languages/messages/MessagesSa.php
@@ -43,7 +43,7 @@ $linkPrefixExtension = false;
$namespaceNames = array(
NS_MEDIA => 'माधà¥à¤¯à¤®à¤®à¥',
- NS_SPECIAL => 'विशेष',
+ NS_SPECIAL => 'विशेषमà¥',
NS_TALK => 'समà¥à¤­à¤¾à¤·à¤£à¤®à¥',
NS_USER => 'योजकः',
NS_USER_TALK => 'योजकसमà¥à¤­à¤¾à¤·à¤£à¤®à¥',
@@ -62,6 +62,7 @@ $namespaceNames = array(
$namespaceAliases = array(
'माधà¥à¤¯à¤®' => NS_MEDIA,
+ 'विशेष' => NS_SPECIAL,
'संभाषणं' => NS_TALK,
'योजकसंभाषणं' => NS_USER_TALK,
'$1संभाषणं' => NS_PROJECT_TALK,
@@ -168,109 +169,111 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#पà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤¨', '#REDIRECT' ),
- 'notoc' => array( '0', '__नैवअनà¥à¤•à¥à¤°à¤®à¤£à¥€__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__नैवसंकà¥à¤°à¤®à¤£à¤•à¤¾__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¥€à¤¸à¤šà¤¤à¥‡__', '__FORCETOC__' ),
- 'toc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¥€__', '__TOC__' ),
- 'noeditsection' => array( '0', '__नैवसमà¥à¤ªà¤¾à¤¦à¤¨à¤µà¤¿à¤­à¤¾à¤—__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__नैवमà¥à¤–à¥à¤¯à¤¶à¤¿à¤°à¥à¤·à¤•__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'अदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥‡', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'अदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥‡à¥¨', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'अदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥‡à¤¨à¤¾à¤®', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'अदà¥à¤¯à¤µà¤°à¥à¤·', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'सदà¥à¤¯à¤¸à¤®à¤¯', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'सदà¥à¤¯à¤˜à¤£à¥à¤Ÿà¤¾', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥‡', 'LOCALDAY' ),
- 'localday2' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥‡à¥¨', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥‡à¤¨à¤¾à¤®', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤µà¤°à¥à¤·à¥‡', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤®à¤¯à¥‡', 'LOCALTIME' ),
- 'localhour' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤˜à¤£à¥à¤Ÿà¤¾', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'पृषà¥à¤ à¤¾à¤¨à¤¾à¤®à¥â€Œà¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'लेखसà¥à¤¯â€Œà¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'संचिकानामà¥â€Œâ€Œà¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'योजकसà¥à¤¯à¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'दृषà¥à¤Ÿà¤¿à¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'पृषà¥à¤ à¤¨à¤¾à¤®', 'PAGENAME' ),
- 'namespace' => array( '1', 'नामविशà¥à¤µ', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'वà¥à¤¯à¤¾à¤¸à¤ªà¤¿à¤ ', 'TALKSPACE' ),
- 'subjectspace' => array( '1', 'विषयविशà¥à¤µ', 'लेखविशà¥à¤µ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'fullpagename' => array( '1', 'पूरà¥à¤£à¤ªà¥ƒà¤·à¥à¤ à¤¨à¤¾à¤®', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'उपपृषà¥à¤ à¤¨à¤¾à¤®', 'SUBPAGENAME' ),
- 'basepagename' => array( '1', 'आधारपृषà¥à¤ à¤¨à¤¾à¤®', 'BASEPAGENAME' ),
- 'talkpagename' => array( '1', 'संवादपृषà¥à¤ à¤¨à¤¾à¤®', 'TALKPAGENAME' ),
- 'subjectpagename' => array( '1', 'विषयपृषà¥à¤ à¤¨à¤¾à¤®', 'लेखपृषà¥à¤ à¤¨à¤¾à¤®', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'msg' => array( '0', 'सनà¥à¤¦à¥‡à¤¶:', 'MSG:' ),
- 'msgnw' => array( '0', 'नूतनसनà¥à¤¦à¥‡à¤¶:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'लघà¥à¤¤à¥à¤¤à¤®', 'सङà¥à¤•à¥à¤šà¤¿à¤¤à¤šà¤¿à¤¤à¥à¤°', 'अङà¥à¤—à¥à¤·à¥à¤ ', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'सङà¥à¤•à¥à¤šà¤¿à¤¤à¤šà¤¿à¤¤à¥à¤°=$1', 'अङà¥à¤—à¥à¤·à¥à¤ =$1', 'लघà¥à¤¤à¥à¤¤à¤®à¤šà¤¿à¤¤à¥à¤°=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'दकà¥à¤·à¤¿à¤£à¤¤', 'right' ),
- 'img_left' => array( '1', 'वामतः', 'left' ),
- 'img_none' => array( '1', 'नैव', 'none' ),
- 'img_width' => array( '1', '$1पिट', '$1px' ),
- 'img_center' => array( '1', 'मधà¥à¤¯', 'center', 'centre' ),
- 'img_framed' => array( '1', 'आबनà¥à¤§', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'निराबनà¥à¤§', 'frameless' ),
- 'img_page' => array( '1', 'पृषà¥à¤ =$1', 'पृषà¥à¤  $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'उनà¥à¤¨à¤¤', 'उनà¥à¤¨à¤¤=$1', 'उनà¥à¤¨à¤¤ $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'सीमा', 'border' ),
- 'img_baseline' => array( '1', 'आधाररेखा', 'baseline' ),
- 'img_sub' => array( '1', 'विषये', 'sub' ),
- 'img_super' => array( '1', 'अति', 'तीवà¥à¤°', 'super', 'sup' ),
- 'img_top' => array( '1', 'अगà¥à¤°', 'top' ),
- 'img_text_top' => array( '1', 'पाठà¥à¤¯-अगà¥à¤°', 'text-top' ),
- 'img_middle' => array( '1', 'मधà¥à¤¯à¥‡', 'middle' ),
- 'img_bottom' => array( '1', 'अधस', 'bottom' ),
- 'img_text_bottom' => array( '1', 'पाठà¥à¤¯-अधस', 'text-bottom' ),
- 'img_link' => array( '1', 'समà¥à¤¬à¤¦à¥à¤§à¤‚=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'विकलà¥à¤ª=$1', 'alt=$1' ),
- 'sitename' => array( '1', 'सà¥à¤¥à¤²à¤¨à¤¾à¤®', 'SITENAME' ),
- 'grammar' => array( '0', 'वà¥à¤¯à¤¾à¤•à¤°à¤£:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__नैवशिरà¥à¤·à¤•à¤ªà¤°à¤¿à¤µà¤°à¥à¤¤__', '__नैशिप__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__नैवलेखपरिवरà¥à¤¤__', '__नैलेप__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'अदà¥à¤¯à¤¸à¤ªà¥à¤¤à¤¾à¤¹', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤ªà¥à¤¤à¤¾à¤¹', 'LOCALWEEK' ),
- 'revisionid' => array( '1', 'आवृतà¥à¤¤à¥€à¤•à¥à¤°à¤®à¤¾à¤‚क', 'REVISIONID' ),
- 'revisionday' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤µà¤¸à¥‡', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤µà¤¸à¥‡à¥¨', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'आवृतà¥à¤¤à¥€à¤®à¤¾à¤¸à¥‡', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'आवृतà¥à¤¤à¥€à¤µà¤°à¥à¤·à¥‡', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'आवृतà¥à¤¤à¥€à¤¸à¤®à¤¯à¤®à¥à¤¦à¥à¤°à¤¾', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'अनेकवचन:', 'PLURAL:' ),
- 'displaytitle' => array( '1', 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¶à¥€à¤°à¥à¤·à¤•', 'उपाधिदरà¥à¤¶à¤¨', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__नूतनविभागसमà¥à¤¬à¤¦à¥à¤§à¤‚__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'अदà¥à¤¯à¤†à¤µà¥ƒà¤¤à¥à¤¤à¥€', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'सदà¥à¤¯à¤¸à¤®à¤¯à¤®à¥à¤¦à¥à¤°à¤¾', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤®à¤¯à¤®à¥à¤¦à¥à¤°à¤¾', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'दिशाचिहà¥à¤¨', 'दिशे', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#भाषा:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'विषयभाषा', 'आधेयभाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'नामविशà¥à¤µà¤¾à¤¤à¤ªà¥ƒà¤·à¥à¤ ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'पà¥à¤°à¤šà¤¾à¤²à¤•à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'रचनासंखà¥à¤¯à¤¾', 'FORMATNUM' ),
- 'special' => array( '0', 'विशेष', 'special' ),
- 'filepath' => array( '0', 'संचिकापथ', 'FILEPATH:' ),
- 'tag' => array( '0', 'वीजक', 'tag' ),
- 'hiddencat' => array( '1', '__लà¥à¤ªà¥à¤¤à¤µà¤°à¥à¤—__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'वरà¥à¤—ेपृषà¥à¤ ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'पृषà¥à¤ à¤¾à¤•à¤¾à¤°', 'PAGESIZE' ),
- 'index' => array( '1', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__INDEX__' ),
- 'noindex' => array( '1', '__नैवअनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'गणानामसंखà¥à¤¯à¤¾', 'गणसंखà¥à¤¯à¤¾', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__अनितà¥à¤¯à¤ªà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤¨__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'रकà¥à¤·à¤¾à¤¸à¥à¤¤à¤°', 'PROTECTIONLEVEL' ),
+ 'redirect' => array( '0', '#पà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤¨', '#REDIRECT' ),
+ 'notoc' => array( '0', '__नैवअनà¥à¤•à¥à¤°à¤®à¤£à¥€__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__नैवसंकà¥à¤°à¤®à¤£à¤•à¤¾__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¥€à¤¸à¤šà¤¤à¥‡__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¥€__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__नैवसमà¥à¤ªà¤¾à¤¦à¤¨à¤µà¤¿à¤­à¤¾à¤—__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__नैवमà¥à¤–à¥à¤¯à¤¶à¤¿à¤°à¥à¤·à¤•__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'अदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥‡', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'अदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥‡à¥¨', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'अदà¥à¤¯à¤¦à¤¿à¤µà¤¸à¥‡à¤¨à¤¾à¤®', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'अदà¥à¤¯à¤µà¤°à¥à¤·', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'सदà¥à¤¯à¤¸à¤®à¤¯', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'सदà¥à¤¯à¤˜à¤£à¥à¤Ÿà¤¾', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤®à¤¾à¤¸à¥‡à¤¸à¤‚कà¥à¤·à¥€à¤ªà¥à¤¤', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥‡', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥‡à¥¨', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¦à¤¿à¤µà¤¸à¥‡à¤¨à¤¾à¤®', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤µà¤°à¥à¤·à¥‡', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤®à¤¯à¥‡', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤˜à¤£à¥à¤Ÿà¤¾', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'पृषà¥à¤ à¤¾à¤¨à¤¾à¤®à¥â€Œà¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'लेखसà¥à¤¯â€Œà¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'संचिकानामà¥â€Œâ€Œà¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'योजकसà¥à¤¯à¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'दृषà¥à¤Ÿà¤¿à¤¸à¤™à¥à¤–à¥à¤¯à¤¾', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'पृषà¥à¤ à¤¨à¤¾à¤®', 'PAGENAME' ),
+ 'namespace' => array( '1', 'नामविशà¥à¤µ', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'वà¥à¤¯à¤¾à¤¸à¤ªà¤¿à¤ ', 'TALKSPACE' ),
+ 'subjectspace' => array( '1', 'विषयविशà¥à¤µ', 'लेखविशà¥à¤µ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'fullpagename' => array( '1', 'पूरà¥à¤£à¤ªà¥ƒà¤·à¥à¤ à¤¨à¤¾à¤®', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'उपपृषà¥à¤ à¤¨à¤¾à¤®', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'आधारपृषà¥à¤ à¤¨à¤¾à¤®', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'संवादपृषà¥à¤ à¤¨à¤¾à¤®', 'TALKPAGENAME' ),
+ 'subjectpagename' => array( '1', 'विषयपृषà¥à¤ à¤¨à¤¾à¤®', 'लेखपृषà¥à¤ à¤¨à¤¾à¤®', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'msg' => array( '0', 'सनà¥à¤¦à¥‡à¤¶:', 'MSG:' ),
+ 'msgnw' => array( '0', 'नूतनसनà¥à¤¦à¥‡à¤¶:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'लघà¥à¤¤à¥à¤¤à¤®', 'सङà¥à¤•à¥à¤šà¤¿à¤¤à¤šà¤¿à¤¤à¥à¤°', 'अङà¥à¤—à¥à¤·à¥à¤ ', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'सङà¥à¤•à¥à¤šà¤¿à¤¤à¤šà¤¿à¤¤à¥à¤°=$1', 'अङà¥à¤—à¥à¤·à¥à¤ =$1', 'लघà¥à¤¤à¥à¤¤à¤®à¤šà¤¿à¤¤à¥à¤°=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'दकà¥à¤·à¤¿à¤£à¤¤', 'right' ),
+ 'img_left' => array( '1', 'वामतः', 'left' ),
+ 'img_none' => array( '1', 'नैव', 'none' ),
+ 'img_width' => array( '1', '$1पिट', '$1px' ),
+ 'img_center' => array( '1', 'मधà¥à¤¯', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'आबनà¥à¤§', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'निराबनà¥à¤§', 'frameless' ),
+ 'img_page' => array( '1', 'पृषà¥à¤ =$1', 'पृषà¥à¤  $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'उनà¥à¤¨à¤¤', 'उनà¥à¤¨à¤¤=$1', 'उनà¥à¤¨à¤¤ $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'सीमा', 'border' ),
+ 'img_baseline' => array( '1', 'आधाररेखा', 'baseline' ),
+ 'img_sub' => array( '1', 'विषये', 'sub' ),
+ 'img_super' => array( '1', 'अति', 'तीवà¥à¤°', 'super', 'sup' ),
+ 'img_top' => array( '1', 'अगà¥à¤°', 'top' ),
+ 'img_text_top' => array( '1', 'पाठà¥à¤¯-अगà¥à¤°', 'text-top' ),
+ 'img_middle' => array( '1', 'मधà¥à¤¯à¥‡', 'middle' ),
+ 'img_bottom' => array( '1', 'अधस', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'पाठà¥à¤¯-अधस', 'text-bottom' ),
+ 'img_link' => array( '1', 'समà¥à¤¬à¤¦à¥à¤§à¤‚=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'विकलà¥à¤ª=$1', 'alt=$1' ),
+ 'sitename' => array( '1', 'सà¥à¤¥à¤²à¤¨à¤¾à¤®', 'SITENAME' ),
+ 'grammar' => array( '0', 'वà¥à¤¯à¤¾à¤•à¤°à¤£:', 'GRAMMAR:' ),
+ 'notitleconvert' => array( '0', '__नैवशिरà¥à¤·à¤•à¤ªà¤°à¤¿à¤µà¤°à¥à¤¤__', '__नैशिप__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__नैवलेखपरिवरà¥à¤¤__', '__नैलेप__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'अदà¥à¤¯à¤¸à¤ªà¥à¤¤à¤¾à¤¹', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤ªà¥à¤¤à¤¾à¤¹', 'LOCALWEEK' ),
+ 'revisionid' => array( '1', 'आवृतà¥à¤¤à¥€à¤•à¥à¤°à¤®à¤¾à¤‚क', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤µà¤¸à¥‡', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'आवृतà¥à¤¤à¥€à¤¦à¤¿à¤µà¤¸à¥‡à¥¨', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'आवृतà¥à¤¤à¥€à¤®à¤¾à¤¸à¥‡', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'आवृतà¥à¤¤à¥€à¤µà¤°à¥à¤·à¥‡', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'आवृतà¥à¤¤à¥€à¤¸à¤®à¤¯à¤®à¥à¤¦à¥à¤°à¤¾', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'अनेकवचन:', 'PLURAL:' ),
+ 'displaytitle' => array( '1', 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤¶à¥€à¤°à¥à¤·à¤•', 'उपाधिदरà¥à¤¶à¤¨', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__नूतनविभागसमà¥à¤¬à¤¦à¥à¤§à¤‚__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'अदà¥à¤¯à¤†à¤µà¥ƒà¤¤à¥à¤¤à¥€', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'सदà¥à¤¯à¤¸à¤®à¤¯à¤®à¥à¤¦à¥à¤°à¤¾', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¤¸à¤®à¤¯à¤®à¥à¤¦à¥à¤°à¤¾', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'दिशाचिहà¥à¤¨', 'दिशे', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#भाषा:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'विषयभाषा', 'आधेयभाषा', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'नामविशà¥à¤µà¤¾à¤¤à¤ªà¥ƒà¤·à¥à¤ ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'पà¥à¤°à¤šà¤¾à¤²à¤•à¤¸à¤‚खà¥à¤¯à¤¾', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'रचनासंखà¥à¤¯à¤¾', 'FORMATNUM' ),
+ 'special' => array( '0', 'विशेष', 'special' ),
+ 'filepath' => array( '0', 'संचिकापथ', 'FILEPATH:' ),
+ 'tag' => array( '0', 'वीजक', 'tag' ),
+ 'hiddencat' => array( '1', '__लà¥à¤ªà¥à¤¤à¤µà¤°à¥à¤—__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'वरà¥à¤—ेपृषà¥à¤ ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'पृषà¥à¤ à¤¾à¤•à¤¾à¤°', 'PAGESIZE' ),
+ 'index' => array( '1', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__INDEX__' ),
+ 'noindex' => array( '1', '__नैवअनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'गणानामसंखà¥à¤¯à¤¾', 'गणसंखà¥à¤¯à¤¾', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__अनितà¥à¤¯à¤ªà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤¨__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'रकà¥à¤·à¤¾à¤¸à¥à¤¤à¤°', 'PROTECTIONLEVEL' ),
);
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'समà¥à¤ªà¤°à¥à¤•à¤¤à¤¨à¥à¤¤à¥‹à¤ƒ अधोरेखाङà¥à¤•à¤¨à¤®à¥:',
@@ -533,7 +536,6 @@ $1',
'versionrequiredtext' => 'à¤à¤¤à¤¤à¥à¤ªà¥ƒà¤·à¥à¤ à¤‚ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥à¤‚ मीडियाविकि इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ $1तमा आवृतà¥à¤¤à¤¿à¤ƒ आवशà¥à¤¯à¤•à¥€à¥¤ पशà¥à¤¯à¤¤à¥ [[Special:Version|आवृतà¥à¤¤à¤¿-सूचिका]]',
'ok' => 'असà¥à¤¤à¥',
-'pagetitle' => '',
'retrievedfrom' => '"$1" इतà¥à¤¯à¤¸à¥à¤®à¤¾à¤¦à¥ उदà¥à¤§à¥ƒà¤¤à¤®à¥',
'youhavenewmessages' => 'भवदरà¥à¤¥à¤®à¥ $1 सनà¥à¤¤à¤¿à¥¤ ($2).',
'newmessageslink' => 'नूतनाः सनà¥à¤¦à¥‡à¤¶à¤¾à¤ƒ',
@@ -627,22 +629,24 @@ $1',
'badarticleerror' => 'असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ à¤à¤·à¤¾ कà¥à¤°à¤¿à¤¯à¤¾ करà¥à¤¤à¥à¤‚ न शकà¥à¤¯à¤¾à¥¤',
'cannotdelete' => '$1 इति पृषà¥à¤ à¤‚ संचिका वा अपाकरà¥à¤¤à¥à¤‚ नाशकà¥à¤¨à¥‹à¤¤à¥à¥¤
इदं खलॠकेनचिदनà¥à¤¯à¥‡à¤¨ पूरà¥à¤µà¥‡ à¤à¤µ अपाकृतं सà¥à¤¯à¤¾à¤¤à¥à¥¤',
+'cannotdelete-title' => ' "$1" पृषà¥à¤ à¤‚ निरà¥à¤®à¤¾à¤°à¥à¤œà¤¯à¤¿à¤¤à¥à¤®à¥ अशकà¥à¤¯à¤®à¥',
'badtitle' => 'दà¥à¤·à¥à¤Ÿà¤‚ शिरोनाम',
'badtitletext' => 'पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤‚ पृषà¥à¤ à¤¶à¥€à¤°à¥à¤·à¤•à¤®à¥ अमानà¥à¤¯à¤‚ रिकà¥à¤¤à¤®à¥ अशà¥à¤¦à¥à¤§à¤¤à¤¯à¤¾ समà¥à¤¬à¤¦à¥à¤§à¤®à¥ आनà¥à¤¤à¤°à¥à¤­à¤¾à¤·à¤¿à¤•à¤®à¥, आनà¥à¤¤à¤°à¥à¤µà¤¿à¤•à¥€à¤¯à¤‚ वा शीरà¥à¤·à¤•à¤®à¤¸à¥à¤¤à¤¿ । असà¥à¤®à¤¿à¤¨à¥ à¤à¤•à¤‚ à¤à¤•à¤¾à¤§à¤¿à¤•à¤¾à¤¨à¤¿ वा à¤à¤¤à¤¾à¤¦à¥ƒà¤¶à¤¾à¤¨à¤¿ अकà¥à¤·à¤°à¤¾à¤£à¤¿ विदà¥à¤¯à¤¨à¥à¤¤à¥‡ येषां पà¥à¤°à¤¯à¥‹à¤—ं शीरà¥à¤·à¤•à¥‡à¤·à¥ करà¥à¤¤à¥à¤®à¥ अशकà¥à¤¯à¤®à¥à¥¤',
-'perfcached' => 'अनà¥à¤ªà¤¦à¥‹à¤•à¥à¤¤à¤‚ समंकं कैशॠइतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤®à¤¾à¤¦à¥ असà¥à¤¤à¤¿, अतः अदà¥à¤¯à¤¤à¤¨à¤‚ न सà¥à¤¯à¤¾à¤¤à¥à¥¤',
-'perfcachedts' => 'अनà¥à¤ªà¤¦à¥‹à¤•à¥à¤¤à¤‚ समंकं कैशॠइतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤®à¤¿à¤¨à¥ विदà¥à¤¯à¤¤à¥‡, तथा च $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥à¤¸à¤®à¤¯à¥‡ अनà¥à¤¤à¤¿à¤®à¤‚ वारं परिवरà¥à¤¤à¤¿à¤¤à¤®à¥à¥¤',
+'perfcached' => 'अनà¥à¤ªà¤¦à¥‹à¤•à¥à¤¤à¤‚ समंकं कैशॠइतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤®à¤¾à¤¦à¥ असà¥à¤¤à¤¿, अतः अदà¥à¤¯à¤¤à¤¨à¤‚ न सà¥à¤¯à¤¾à¤¤à¥à¥¤ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'अनà¥à¤ªà¤¦à¥‹à¤•à¥à¤¤à¤‚ समंकं कैशॠइतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤®à¤¿à¤¨à¥ विदà¥à¤¯à¤¤à¥‡, तथा च $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥à¤¸à¤®à¤¯à¥‡ अनà¥à¤¤à¤¿à¤®à¤‚ वारं परिवरà¥à¤¤à¤¿à¤¤à¤®à¥à¥¤ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'असà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ परिशोधनं विफलीकृतमसà¥à¤¤à¤¿ ।
सदà¥à¤¯à¤ƒ अतà¥à¤°à¤¤à¥à¤¯à¤ƒ विषयः न नवीकà¥à¤°à¤¿à¤¯à¤¤à¥‡ ।',
'wrong_wfQuery_params' => 'wfQuery() इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ अशà¥à¤¦à¥à¤§à¤ƒ मानदणà¥à¤¡à¤ƒ दतà¥à¤¤à¤ƒ असà¥à¤¤à¤¿<br />
कारà¥à¤¯à¤®à¥: $1<br />
पृचà¥à¤›à¤¾: $2',
'viewsource' => 'सà¥à¤°à¥‹à¤¤à¤ƒ दृशà¥à¤¯à¤¤à¤¾à¤®à¥',
-'viewsourcefor' => '$1 कृते',
+'viewsource-title' => '$1 इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ सà¥à¤°à¥‹à¤¤à¤ƒ दृशà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
'actionthrottled' => 'कारà¥à¤¯à¤®à¥ अवरà¥à¤¦à¥à¤§à¤®à¥ असà¥à¤¤à¤¿',
'actionthrottledtext' => "'सà¥à¤ªà¥à¤¯à¤¾à¤®à¥'इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ अवरोधाय अलà¥à¤ªà¥‡ काले अतà¥à¤¯à¤§à¤¿à¤•à¤µà¤¾à¤°à¤®à¥ असà¥à¤¯ कारà¥à¤¯à¤•à¤°à¤£à¤®à¥ अवरà¥à¤¦à¥à¤§à¤®à¥ असà¥à¤¤à¤¿ ।
कृपया किञà¥à¤šà¤¿à¤¤à¥à¤•à¤¾à¤²à¤¾à¤¨à¤¨à¥à¤¤à¤°à¤‚ पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¤à¥à¤¨à¤ƒ कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥ ।",
'protectedpagetext' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¥à¤¯ अवरोधाय इदं पृषà¥à¤ à¤‚ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿ ।',
'viewsourcetext' => 'भवानॠà¤à¤¤à¤¸à¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ सà¥à¤°à¥‹à¤¤à¤ƒ दà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ तसà¥à¤¯ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿à¤‚ करà¥à¤¤à¥à¤®à¥ अरà¥à¤¹à¤¤à¤¿à¥¤',
+'viewyourtext' => "भवानॠअसà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ सà¥à¤°à¥‹à¤¤à¤¸à¤¿ '''भवतः समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¿''' दà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿à¤‚ करà¥à¤¤à¥à¤‚ च अरà¥à¤¹à¤¤à¤¿ ।",
'protectedinterface' => 'इदं पृषà¥à¤ à¤‚ तंतà¥à¤°à¤¾à¤‚शाय अनà¥à¤¤à¤°à¤¾à¤«à¤²à¤•à¤‚ ददाति, तथा च दà¥à¤°à¥à¤ªà¤¯à¥‹à¤—ातॠवारणाय सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿ ।',
'editinginterface' => "'''अवधीयतामà¥''' तनà¥à¤¤à¥à¤°à¤¾à¤‚शसà¥à¤¯ विनà¥à¤¯à¤¾à¤¸à¤‚ यतॠपृषà¥à¤ à¤‚ रचयति तदॠभवानॠअधà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¯à¤¤à¤¿ । अतà¥à¤° कृतानि परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ अनà¥à¤¯à¥‡à¤·à¤¾à¤®à¥ उपयोकà¥à¤¤à¥„णां पृषà¥à¤ à¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸à¤®à¤ªà¤¿ परिवरà¥à¤¤à¤¯à¤¨à¥à¤¤à¤¿ । अनà¥à¤µà¤¾à¤¦à¤¾à¤°à¥à¤¥à¤®à¥ [//translatewiki.net/wiki/Main_Page?setlang=sa translatewiki.net] सà¥à¤¥à¤¾à¤¨à¥€à¤¯à¤¤à¤¾à¤¨à¤¯à¤¨à¤ªà¤°à¤¿à¤¯à¥‹à¤œà¤¨à¤¾à¤¯à¤¾à¤ƒ उपयोगः कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥ ।",
'sqlhidden' => '(निगूढा à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤²à¥- पृचà¥à¤›à¤¾)',
@@ -745,6 +749,7 @@ $2',
'emailconfirmlink' => 'सà¥à¤µà¤•à¥€à¤¯à¤‚ विदà¥à¤¯à¥à¤¤à¥à¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤¸à¤‚केतं पà¥à¤°à¤®à¤¾à¤£à¥€à¤•à¤°à¥‹à¤¤à¥à¥¤',
'invalidemailaddress' => 'पà¥à¤°à¤¤à¥€à¤¯à¤¤à¥‡ यदॠविदà¥à¤¯à¥à¤¤à¥à¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤¸à¤‚केतः अमानà¥à¤¯à¥‡ पà¥à¤°à¤¾à¤°à¥‚पे विदà¥à¤¯à¤¤à¥‡à¥¤ अतà¤à¤µ à¤à¤¤à¤¤à¥ सà¥à¤µà¥€à¤•à¤°à¥‹à¤¤à¥à¤‚ न शकà¥à¤¯à¤¤à¥‡à¥¤
कृपया à¤à¤•à¤‚ पà¥à¤°à¤¾à¤°à¥‚पसमà¥à¤®à¤¤à¤‚ संकेतं ददातà¥, अथवा ततॠकà¥à¤·à¥‡à¤¤à¥à¤°à¤‚ रिकà¥à¤¤à¤®à¥‡à¤µ करोतà¥à¥¤',
+'cannotchangeemail' => 'असà¥à¤®à¤¿à¤¨à¥ विकिमधà¥à¤¯à¥‡ सदसà¥à¤¯-ईपतà¥à¤°-सङà¥à¤•à¥‡à¤¤à¤ƒ परिवरà¥à¤¤à¤¯à¤¿à¤¤à¥à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।',
'accountcreated' => 'सदसà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¾',
'accountcreatedtext' => '$1 इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ सदसà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¾ असà¥à¤¤à¤¿à¥¤',
'createaccount-title' => '{{SITENAME}} इतà¥à¤¯à¥‡à¤¤à¤¦à¤°à¥à¤¥à¤‚ लेखासृजनमà¥',
@@ -767,6 +772,7 @@ You may ignore this message, if this account was created in error.',
# E-mail sending
'php-mail-error-unknown' => 'पीà¤à¤šà¥à¤ªà¥€ इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ mail() फलने अजà¥à¤žà¤¾à¤¤à¤¾ काऽपि तà¥à¤°à¥à¤Ÿà¤¿à¤°à¥à¤œà¤¾à¤¤à¤¾à¥¤',
+'user-mail-no-addy' => 'ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤‚ विना ईपतà¥à¤°à¤ªà¥à¤°à¥‡à¤·à¤£à¤¸à¥à¤¯ पà¥à¤°à¤¯à¤¾à¤¸à¤ƒ कृतः ।',
# Change password dialog
'resetpass' => 'कूटशबà¥à¤¦à¤ƒ परिवरà¥à¤¤à¥à¤¯à¤¤à¤¾à¤®à¥',
@@ -796,6 +802,8 @@ You may ignore this message, if this account was created in error.',
'passwordreset-pretext' => '{{PLURAL:$1| |समंकेषॠà¤à¤•à¤®à¥ अधसà¥à¤¯à¤¾à¤¤à¥ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¥€à¤•à¤°à¥‹à¤¤à¥à¥¤}}',
'passwordreset-username' => 'योजकनामनà¥:',
'passwordreset-domain' => 'कà¥à¤·à¥‡à¤¤à¥à¤°à¤®à¥:',
+'passwordreset-capture' => 'फलितरूपमॠईपतà¥à¤°à¤‚ किं दृशà¥à¤¯à¤¤à¥‡ ?',
+'passwordreset-capture-help' => 'असà¥à¤¯à¤¾à¤‚ मञà¥à¤œà¥‚षायां यदि भवता अङà¥à¤•à¥à¤¯à¤¤à¥‡ तरà¥à¤¹à¤¿ ईपतà¥à¤°à¤®à¥ (असà¥à¤¥à¤¾à¤¯à¤¿à¤•à¥‚टशबà¥à¤¦à¥‡à¤¨ सह) दरà¥à¤¶à¥à¤¯à¤¤à¥‡ पà¥à¤°à¥‡à¤·à¥à¤¯à¤¤à¥‡ च ।',
'passwordreset-email' => 'परमाणà¥à¤ªà¤¤à¥à¤°à¤¸à¤™à¥à¤—ेत:',
'passwordreset-emailtitle' => '{{SITENAME}} इतà¥à¤¯à¤¤à¥à¤° लेखा-विवरणमà¥',
'passwordreset-emailtext-ip' => 'कशà¥à¤šà¤¿à¤¤à¥ (भवानॠअपि सà¥à¤¯à¤¾à¤¤à¥, $1 इति à¤. पि. सङà¥à¤•à¥‡à¤¤à¤¾à¤¤à¥) {{SITENAME}} ($4) इतà¥à¤¯à¤¸à¥à¤¯ पà¥à¤°à¤µà¥‡à¤¶à¤¸à¤®à¥à¤¬à¤¦à¥à¤§à¤‚ विवरणं पà¥à¤°à¤¾à¤°à¥à¤¥à¤¿à¤¤à¤µà¤¾à¤¨à¥ । अधः सूचितसà¥à¤¯ उपयोकà¥à¤¤à¥à¤ƒ {{PLURAL:$3 | पà¥à¤°à¤µà¥‡à¤¶à¤µà¤¿à¤µà¤°à¤£à¤‚ | पà¥à¤°à¤µà¥‡à¤¶à¤µà¤¿à¤µà¤°à¤£à¤¾à¤¨à¤¿}}
@@ -806,6 +814,10 @@ $2
अलà¥à¤ªà¤•à¤¾à¤²à¤¿à¤•à¤ƒ कूटशबà¥à¤¦à¤ƒ : $2',
'passwordreset-emailsent' => 'à¤à¤•à¤ƒ सà¥à¤®à¤¾à¤°à¤•à¤ƒ विदà¥à¤¯à¥à¤¤à¥à¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤ƒ पà¥à¤°à¥‡à¤·à¤¿à¤¤à¥‹à¤½à¤¸à¥à¤¤à¤¿à¥¤',
+# Special:ChangeEmail
+'changeemail' => 'विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¾à¤¦à¥‡à¤¶à¤‚ परिवरà¥à¤¤à¤¯à¤¤à¥',
+'changeemail-cancel' => 'निवरà¥à¤¤à¤¯à¤¤à¥‡',
+
# Edit page toolbar
'bold_sample' => 'सà¥à¤¥à¥‚लाकà¥à¤·à¤°à¥ˆà¤ƒ यà¥à¤•à¥à¤¤à¤ƒ भागः',
'bold_tip' => 'सà¥à¤¥à¥‚लाकà¥à¤·à¤°à¥ˆà¤ƒ यà¥à¤•à¥à¤¤à¤ƒ भागः',
@@ -860,9 +872,6 @@ $2
भवतः वरà¥à¤¤à¤®à¤¾à¤¨à¤ƒ आइपीसङà¥à¤•à¥‡à¤¤à¤ƒ $3 इति असà¥à¤¤à¤¿à¥¤ अपि च अवरोधनसà¥à¤¯ परिचयचिहà¥à¤¨à¤®à¥ (आइडी) #$5 इतà¥à¤¯à¤¸à¥à¤¤à¤¿à¥¤
कृपया भवानॠसà¥à¤µà¤•à¥€à¤¯à¥‡à¤·à¥ सरà¥à¤µà¥‡à¤·à¥à¤µà¤ªà¤¿ पà¥à¤°à¤¶à¥à¤¨à¥‡à¤·à¥ सरà¥à¤µà¤®à¥‡à¤¤à¤¤à¥ वरà¥à¤£à¤¨à¤‚ ददातà¥à¥¤',
'blockednoreason' => 'न किमपि कारणमॠदतà¥à¤¤à¤®à¥à¥¤',
-'blockedoriginalsource' => "'''$1''' इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ सà¥à¤°à¥‹à¤¤à¤ƒ अधसà¥à¤¤à¤¾à¤¤à¥ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤à¤®à¥:",
-'blockededitsource' => " '''$1''' इतà¥à¤¯à¤¤à¥à¤° '''भवतः समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¾à¤‚''' पाठः अधसà¥à¤¤à¤¾à¤¤à¥ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤à¤®à¥:",
-'whitelistedittitle' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤°à¥à¤¥à¤‚ सतà¥à¤°à¤¾à¤°à¤®à¥à¤­à¤ƒ (पà¥à¤°à¤µà¥‡à¤¶à¤ƒ) आवशà¥à¤¯à¤•à¤ƒ',
'whitelistedittext' => 'पृषà¥à¤ à¤¾à¤£à¤¾à¤‚ समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤°à¥à¤¥à¤‚ $1 इति कारà¥à¤¯à¤®à¥ आवशà¥à¤¯à¤•à¤®à¥à¥¤',
'confirmedittext' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¤à¥ पूरà¥à¤µà¤‚ भवता सà¥à¤µà¤•à¥€à¤¯à¤‚ विदà¥à¤¯à¥à¤¤à¥à¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤¸à¤‚केतः परिपà¥à¤·à¥à¤Ÿà¥€à¤•à¤°à¤£à¥€à¤¯à¤ƒà¥¤
कृपया सà¥à¤µà¤•à¥€à¤¯à¤ƒ विदà¥à¤¯à¥à¤¤à¥à¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤¸à¤‚केतः [[Special:Preferences|पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-वरीयांसि]] इतà¥à¤¯à¥‡à¤¤à¤¦à¥à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¦à¤¦à¤¾à¤¤à¥ तथा च पà¥à¤°à¤®à¤¾à¤£à¥€à¤•à¤°à¥‹à¤¤à¥à¥¤',
@@ -1030,15 +1039,10 @@ $2
'revdelete-unsuppress' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¨à¥€à¤¤à¤¾à¤½à¤½à¤µà¥ƒà¤¤à¥à¤¤à¤¿à¤­à¥à¤¯à¤ƒ वरà¥à¤œà¤¨à¤¾à¤ƒ अपाकरोतà¥à¥¤',
'revdelete-log' => 'कारणमॠ:',
'revdelete-submit' => '{{PLURAL:$1|चितायां आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚|चितासॠआवृतà¥à¤¤à¤¿à¤·à¥}} अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤œà¤¯à¤¤à¥à¥¤',
-'revdelete-logentry' => '"[[$1]]" इतà¥à¤¯à¤¸à¥à¤¯ आवृतà¥à¤¤à¤¿-दृशà¥à¤¯à¤¤à¤¾ परिवरà¥à¤¤à¤¿à¤¤à¤¾à¤½à¤¸à¥à¤¤à¤¿à¥¤',
'revdel-restore' => 'दृषà¥à¤Ÿà¤¿à¤µà¤¿à¤·à¤¯à¤ƒ परिवरà¥à¤¤à¥à¤¯à¤¤à¤¾à¤®à¥',
'revdel-restore-deleted' => 'अपासà¥à¤¤à¤¾à¤¨à¤¿ संसà¥à¤•à¤°à¤£à¤¾à¤¨à¤¿',
'revdel-restore-visible' => 'दृषà¥à¤Ÿà¤¿à¤—ोचराणि संसà¥à¤•à¤°à¤£à¤¾à¤¨à¤¿',
'pagehist' => 'पृषà¥à¤ à¤¸à¥à¤¯ इतिहासः',
-'revdelete-content' => 'विषयः',
-'revdelete-summary' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤¾à¤‚कà¥à¤·à¥‡à¤ªà¤¿à¤•',
-'revdelete-uname' => 'उपयोकà¥à¤¤à¥ƒ-नाम',
-'revdelete-hid' => 'आवृत $1',
'revdelete-reason-dropdown' => '*परितà¥à¤¯à¤¾à¤—ाय समानकारणाः
** पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿à¤…धिकारअतिकà¥à¤°à¤®
** अयोगà¥à¤¯à¤µà¥ˆà¤¯à¤•à¥à¤¤à¤¿à¤•à¤µà¤¿à¤œà¥à¤žà¤ªà¥à¤¤à¤¿',
@@ -1135,7 +1139,7 @@ $2
'prefs-rc' => 'सदà¥à¤¯à¥‹à¤œà¤¾à¤¤à¤¾à¤¨à¤¿ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿',
'prefs-watchlist' => 'दृषà¥à¤Ÿà¤¿ सूची',
'prefs-watchlist-days' => 'दृषà¥à¤Ÿà¤¿ सूची दरà¥à¤¶à¤¨à¤¾à¤°à¥à¤¥à¥‡ दिवसानि',
-'prefs-watchlist-days-max' => 'अधिकतम ७ दिवसानि',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'अधिकतम संखà¥à¤¯à¤¾: १०००',
'prefs-misc' => 'विविधः',
'prefs-resetpass' => 'कूटशबà¥à¤¦à¤ƒ परिवरà¥à¤¤à¥à¤¯à¤¤à¤¾à¤®à¥',
@@ -1375,8 +1379,7 @@ $2
'listusers-submit' => 'दरà¥à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥',
# Special:Log/newusers
-'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-सृजन-सूचिका',
-'newuserlog-create-entry' => 'नूतन-पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-लेखा',
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-सृजन-सूचिका',
# Special:ListGroupRights
'listgrouprights-group' => 'वरà¥à¤—',
@@ -1423,7 +1426,6 @@ $2
'actionfailed' => 'करà¥à¤®à¤¨à¥ रिषà¥à¤Ÿ',
'deletedtext' => '"$1" इतà¥à¤¯à¥‡à¤¤à¤¦à¥ अपाकृतमसà¥à¤¤à¤¿à¥¤
सदà¥à¤¯à¤ƒà¤•à¥ƒà¤¤à¤¾à¤¨à¤¾à¤‚ अपाकरणानामॠअभिलेखः $2 इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥ पशà¥à¤¯à¤¤à¥à¥¤',
-'deletedarticle' => '"[[$1]]" अपाकृतमसà¥à¤¤à¤¿à¥¤',
'dellogpage' => 'अपाकरणानां सूचिका',
'deletecomment' => 'कारणमॠ:',
'deleteotherreason' => 'अपरं/अतिरिकà¥à¤¤à¤‚ कारणमॠ:',
@@ -1469,7 +1471,6 @@ $2
'undeletelink' => 'दृशà¥à¤¯à¤¤à¤¾à¤®à¥/पà¥à¤°à¤¤à¥à¤¯à¤¾à¤¨à¥€à¤¯à¤¤à¤¾à¤®à¥',
'undeleteviewlink' => 'दृशà¥à¤¯à¤¤à¤¾à¤®à¥',
'undeletecomment' => 'कारणमॠ:',
-'undeletedarticle' => '"[[$1]]" इतà¥à¤¯à¥‡à¤¤à¤¦à¥ पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿à¥¤',
'undelete-search-submit' => 'अनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
'undelete-show-file-submit' => 'आमà¥',
@@ -1545,8 +1546,6 @@ $2
'talkexists' => "'''पृषà¥à¤ à¤‚ साफलà¥à¤¯à¥‡à¤¨ चालितमसà¥à¤¤à¤¿, परं चरà¥à¤šà¤¾à¤ªà¥ƒà¤·à¥à¤ à¤‚ चालयितà¥à¤‚ न शकà¥à¤¯à¤®à¥, यतो नवेऽपि पृषà¥à¤ à¥‡ चरà¥à¤šà¤¾à¤ªà¥ƒà¤·à¥à¤ à¤‚ विदà¥à¤¯à¤¤à¥‡à¥¤ कृपया तं सà¥à¤µà¤¯à¤®à¥‡à¤µ चालयतà¥à¥¤'''",
'movedto' => 'इदं पà¥à¤°à¤¤à¤¿ चालितमà¥à¥¤',
'movetalk' => 'सहगामिनं चरà¥à¤šà¤¾à¤ªà¥ƒà¤·à¥à¤ à¤‚ चालयतà¥à¥¤',
-'1movedto2' => '[[$1]] इतà¥à¤¯à¥‡à¤¤à¤¦à¥ [[$2]] इतà¥à¤¯à¥‡à¤¤à¤¦à¥ पà¥à¤°à¤¤à¤¿ चालितमà¥',
-'1movedto2_redir' => '[[$1]] इति लेखसà¥à¤¯ नाम परिवरà¥à¤¤à¤¿à¤¤à¤‚ कृतà¥à¤µà¤¾ [[$2]] इति कृतमॠ(अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¤®à¥)',
'movelogpage' => 'लॉगॠइतà¥à¤¯à¥‡à¤¤à¤¦à¥ चालà¥à¤¯à¤¤à¤¾à¤®à¥',
'movereason' => 'कारणमॠ:',
'revertmove' => 'पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤µà¤°à¥à¤¤à¥à¤¯à¤¤à¤¾à¤®à¥',
@@ -1651,16 +1650,13 @@ $2
'skinname-myskin' => 'मे चरà¥à¤®à¤¨à¥',
'skinname-chick' => 'Chick',
-# Patrol log
-'patrol-log-diff' => 'संसà¥à¤•à¤°à¤£ $1',
-
# Browsing diffs
'previousdiff' => '↠पà¥à¤°à¤¾à¤¤à¤¨à¤¤à¤°à¤‚ समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¥',
'nextdiff' => 'नवतरं समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¥ →',
# Media information
'file-info-size' => '$1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः: $3, MIME-पà¥à¤°à¤•à¤¾à¤°à¤ƒ: $4',
-'file-nohires' => '<small>उचà¥à¤šà¤¤à¤°à¤‚ विभेदनं नोपलबà¥à¤§à¤®à¥</small>',
+'file-nohires' => 'उचà¥à¤šà¤¤à¤°à¤‚ विभेदनं नोपलबà¥à¤§à¤®à¥',
'svg-long-desc' => 'SVG संचिका, साधारणतया $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः : $3',
'show-big-image' => 'पूरà¥à¤£à¤‚ विभेदनमà¥',
@@ -1836,4 +1832,10 @@ $2
'htmlform-float-invalid' => 'भवता निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤‚ मौलà¥à¤¯à¤‚ संखà¥à¤¯à¤¾ न ।',
'htmlform-selectorother-other' => 'अनà¥à¤¯',
+# Feedback
+'feedback-subject' => 'विषय:',
+'feedback-message' => 'संदेश:',
+'feedback-cancel' => 'निवरà¥à¤¤à¤¯à¤¤à¥‡',
+'feedback-close' => 'समापित',
+
);
diff --git a/languages/messages/MessagesSah.php b/languages/messages/MessagesSah.php
index e4e5f5c9..538e64c3 100644
--- a/languages/messages/MessagesSah.php
+++ b/languages/messages/MessagesSah.php
@@ -38,6 +38,9 @@ $namespaceAliases = array(
'Ойуу_ырытыыта' => NS_FILE_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'Ыйынньыктары аннынан тардыы:',
@@ -393,20 +396,22 @@ $1',
'badarticleerror' => 'Бу дьайыы бу ÑирÑÐ¹Ð³Ñ ÐºÑ‹Ð°Ð¹Ð°Ð½ оҥоһуллубат.',
'cannotdelete' => '«$1» ÑирÑй ÑбÑÑ‚ÑÑ€ Ð±Ð¸Ð»Ñ Ñотуллар кыаҕа Ñуох.
Ким ÑÑ€Ñ Ð¸Ð½Ð½Ð¸ÐºÐ¸ Ñотторбут буолуон Ñөп.',
+'cannotdelete-title' => '«$1» ÑирÑйи Ñотор Ñатаммат',
'badtitle' => 'Табыллыбат аат',
'badtitletext' => 'Ыйытыллыбыт ÑирÑй аата Ñыыһа, иччитÑÑ…, ÑбÑÑ‚ÑÑ€ Ñыыһа ыйынньыктаах тыллар ыккардыларынааҕы дуу, биикилÑÑ€ ыккардыларынааҕы дуу аат.',
-'perfcached' => 'Бу билии кÑÑÑÑ‚Ñн ылыллыбыт онон бүтÑһик уларыйыылары аахÑымыан Ñөп.',
-'perfcachedts' => 'Бу билии кÑÑÑÑ‚Ñн ылыллыбыт, бүтÑһигин $1 уларыйбыт.',
+'perfcached' => 'Бу кÑÑÑÑ‚Ñн ылыллыбыт онон бүтÑһик уларыйыылары аахÑымыан Ñөп. КÑÑÑÐºÑ {{PLURAL:$1|Ñоҕотох Ñуруктан|$1 Ñуруктан}} ордук хараллыбат.',
+'perfcachedts' => 'Бу билии кÑÑÑÑ‚Ñн ылыллыбыт, бүтÑһигин $1 уларыйбыт. КÑÑÑÐºÑ {{PLURAL:$4|Ñоҕотох Ñуруктан|$4 Ñуруктан}} ордук хараллыбат.',
'querypage-no-updates' => 'Бу ÑирÑй уларыйыыта бобуллан турар. Ð‘Ð¸Ð»Ð¸Ð¸Ñ‚Ñ Ð±Ð¸Ð»Ð¸Ð³Ð¸Ð½ кыайан уларыйбат.',
'wrong_wfQuery_params' => 'wfQuery() Ñыыһа киллÑриилÑÑÑ…<br />
ПуунÑуйата: $1<br />
Ыйытыга: $2',
'viewsource' => 'Көрүү',
-'viewsourcefor' => '$1 ÑирÑй',
+'viewsource-title' => 'Бу ÑирÑй $1 иÑходнигын көрүү',
'actionthrottled' => 'ТүргÑнин хааччахтааһын',
'actionthrottledtext' => 'Бу дьайыыны ÐºÑ‹Ð»Ð³Ð°Ñ ÐºÑм иһигÑÑ€ ÑлбÑхтик оҥорор бобуллар. Бу быраабыла Ñпаамы утары охÑуһарга көмөлөһөр. Ðҕыйах мүнүүтÑннÑн Ó©ÑÑÓ© боруобалаар.',
'protectedpagetext' => 'Бу ÑирÑй уларытыллыбат.',
'viewsourcetext' => 'Эн бу ÑирÑй төрдүн көрүөххүн уонна төгүллүөххүн Ñөп:',
+'viewyourtext' => "'''БÑйÑÒ¥ көннөрүүлÑриҥ''' иÑходнигын бу ÑирÑÐ¹Ð³Ñ ÐºÓ©Ñ€Ò¯Ó©Ñ…Ñ…Ò¯Ð½ уонна хатылаан ылыаххын Ñөп:",
'protectedinterface' => 'Бу ÑирÑй бырагыраамма холбуурун хааччыйар, онон моһуогурууттан халытан хатанан турар',
'editinginterface' => "'''Болҕой:''' Быраҕыраамма Ñ‚Ð°Ñ ÐºÓ©Ñтүүтүн (интерфейÑын) хааччыйар тиÑкиһи уларытаары гынан ÑÑ€Ñҕин. Бу ÑирÑйи уларыттаххына атын кыттааччылар көрөллөрүгÑÑ€ бырагыраамма көÑÑ‚Ò¯Ò¯Ñ‚Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ñ‹Ð°. ТылбааÑÑ‚Ñ‹Ñ‹Ñ€ буоллаххына Медиавики бырайыактарын Ñахалыы тылбааһын [//translatewiki.net/wiki/Main_Page?setlang=sah translatewiki.net] туһан.",
'sqlhidden' => '(SQL ыйытык киÑÑ‚Ñммит)',
@@ -510,6 +515,7 @@ $2',
'emailconfirmlink' => 'Эл. аадырыÑкын бигÑргÑÑ‚ÑргÑ',
'invalidemailaddress' => 'КиллÑрбит аадырыһыҥ Ñл. почта аадырыһыгар майгыннаабат.
Сөпкө Ñуруй ÑбÑÑ‚ÑÑ€ кураанах хааллар.',
+'cannotchangeemail' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð±Ñƒ аакка баайыллыбыт Ñлектроннай почта аадырыһа уларытыллар кыаҕа Ñуох Ñбит.',
'accountcreated' => 'Саҥа аат иҥÑрилиннÑ',
'accountcreatedtext' => 'Кыттааччы $1 диÑн ааттанна.',
'createaccount-title' => '{{SITENAME}} бырайыакка Ñаҥа аат оҥоруу',
@@ -525,6 +531,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'mail() PHP-функциÑтыгар туох ÑÑ€Ñ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ñ…Ñыбыт',
+'user-mail-no-addy' => 'Сурук аадырыһа Ñуох ыыттылла Ñатаабыт',
# Change password dialog
'resetpass' => 'Киирии тылы уларытыы',
@@ -546,16 +553,18 @@ $2',
'resetpass-temp-password' => 'БыÑтах кÑÐ¼Ò¥Ñ Ñ‚ÑƒÑ‚Ñ‚ÑƒÐ»Ð»Ð°Ñ€ киирии тыл:',
# Special:PasswordReset
-'passwordreset' => 'Киирии тылы Ñаҥаттан',
-'passwordreset-text' => 'Бу форманы толорон аккааунуҥ туһунан Ñурук тутуоххун Ñөп.',
-'passwordreset-legend' => 'Киирии тылы Ñаҥаттан',
-'passwordreset-disabled' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ тылы Ñаҥардыы бобуллубут.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ðллара көÑÑ‚Ó©Ñ€ дааннайдартан биирин талан Ñуруй}}',
-'passwordreset-username' => 'Кыттааччы:',
-'passwordreset-domain' => 'Домен:',
-'passwordreset-email' => 'Электроннай почтата:',
-'passwordreset-emailtitle' => '{{SITENAME}} бырайыакка аатын туһунан',
-'passwordreset-emailtext-ip' => 'Ким ÑÑ€Ñ (баҕар Ñн буолуо, бу IP-ттан $1) {{SITENAME}} ($4) бырайыакка бÑлиÑÑ‚Ñнииҥ туһунан ÑибидиÑнньÑни көрдөөбүт.
+'passwordreset' => 'Киирии тылы Ñаҥаттан',
+'passwordreset-text' => 'Бу форманы толорон аккааунуҥ туһунан Ñурук тутуоххун Ñөп.',
+'passwordreset-legend' => 'Киирии тылы Ñаҥаттан',
+'passwordreset-disabled' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ тылы Ñаҥардыы бобуллубут.',
+'passwordreset-pretext' => '{{PLURAL:$1||Ðллара көÑÑ‚Ó©Ñ€ дааннайдартан биирин талан Ñуруй}}',
+'passwordreset-username' => 'Кыттааччы:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Суруллубут Ñуругу көрөҕүн дуо?',
+'passwordreset-capture-help' => 'Бу бÑлиÑни туруордаххына кыттааччыга ыытыллар Ñурук (быÑтах кÑÐ¼Ò¥Ñ Ñ‚ÑƒÒ»Ð°Ð½Ñ‹Ð»Ð»Ð°Ñ€ киирии тыллаах) көÑÑ‚Ò¯Ó©.',
+'passwordreset-email' => 'Электроннай почтата:',
+'passwordreset-emailtitle' => '{{SITENAME}} бырайыакка аатын туһунан',
+'passwordreset-emailtext-ip' => 'Ким ÑÑ€Ñ (баҕар Ñн буолуо, бу IP-ттан $1) {{SITENAME}} ($4) бырайыакка бÑлиÑÑ‚Ñнииҥ туһунан ÑибидиÑнньÑни көрдөөбүт.
Бу Ñлектрон аадырыһы кытта бу {{PLURAL:$3|аат ÑитимнÑÑÑ…|ааттар ÑитимнÑÑÑ…Ñ‚ÑÑ€}}
$2
@@ -565,7 +574,7 @@ $2
Ó¨Ñкө бу ыйытыгы ыыппатах буоллаххына, ÑбÑÑ‚ÑÑ€ урукку киирии тылгын өйдөөн кÑлбит буоллаххына
бу биллÑриини аахайыа Ñуоххун Ñөп.
Оччоҕо урукку киирии тылыҥ оннунан хаалыа.',
-'passwordreset-emailtext-user' => '$1 диÑн кыттааччы {{SITENAME}} ($4) бырайыакка бÑлиÑÑ‚Ñнииҥ туһунан ÑибидиÑнньÑни көрдөөбүт.
+'passwordreset-emailtext-user' => '$1 диÑн кыттааччы {{SITENAME}} ($4) бырайыакка бÑлиÑÑ‚Ñнииҥ туһунан ÑибидиÑнньÑни көрдөөбүт.
Бу Ñлектрон аадырыһы кытта бу {{PLURAL:$3|аат ÑитимнÑÑÑ…|ааттар ÑитимнÑÑÑ…Ñ‚ÑÑ€}}
$2
@@ -575,9 +584,22 @@ $2
Ó¨Ñкө бу ыйытыгы ыыппатах буоллаххына, ÑбÑÑ‚ÑÑ€ урукку киирии тылгын өйдөөн кÑлбит буоллаххына
бу биллÑриини аахайыа Ñуоххун Ñөп.
Оччоҕо урукку киирии тылыҥ оннунан хаалыа.',
-'passwordreset-emailelement' => 'Кыттааччы: $1
+'passwordreset-emailelement' => 'Кыттааччы: $1
БыÑтах киирии тыл: $2',
-'passwordreset-emailsent' => 'Санатыы ыытылынна.',
+'passwordreset-emailsent' => 'Санатыы ыытылынна.',
+'passwordreset-emailsent-capture' => 'Манна ыытыллыбыт Ñанатар Ñурук көрдөрүлүннÑ.',
+'passwordreset-emailerror-capture' => 'Манна Ñанатар Ñурук көрдөрүлүннÑ, бу Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ‚Ñн Ñатаан барбата: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ðаадырыһын уларыт',
+'changeemail-header' => 'Ðадырыһын уларытыы',
+'changeemail-text' => 'Бу форманы толорон аадырыÑкын уларыт. Уларытыыны бигÑргÑÑ‚ÑÑ€Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ тылгын киллÑриÑÑ…Ñ‚ÑÑххин.',
+'changeemail-no-info' => 'Бу ÑирÑÐ¹Ð³Ñ Ñ‡Ð¾Ð¿Ñ‡Ñƒ тиийÑргÑ, Ñ‚Ð¸Ò»Ð¸Ð»Ð¸ÐºÐºÑ Ð±ÑлиÑÑ‚Ñммит ааккын ÑтиÑхтиÑххин.',
+'changeemail-oldemail' => 'Билиҥҥи аадырыÑ:',
+'changeemail-newemail' => 'Саҥа аадырыÑ:',
+'changeemail-none' => '(Ñуох)',
+'changeemail-submit' => 'Ðадырыһы уларыт',
+'changeemail-cancel' => 'Тохтот',
# Edit page toolbar
'bold_sample' => 'Модьу бичик',
@@ -646,9 +668,6 @@ $2
IP-аадырыһыҥ $3, бобуу нүөмÑÑ€Ñ â€” #$5.
Ону Ñуруккар киллÑÑ€ÑÑÑ€.",
'blockednoreason' => 'биир да Ð±Ð¸Ñ€Ð¸Ñ‡Ð¸Ð¸Ð½Ñ Ñөп түбÑÑпÑÑ‚',
-'blockedoriginalsource' => "Манна бу ÑирÑй '''$1''' көрдөрүлүннÑ:",
-'blockededitsource' => "Манна '''$1''' ÑирÑÐ¹Ð³Ñ '''Ñн уларытыыларыҥ''' көрдөрүлүннулÑÑ€:",
-'whitelistedittitle' => 'Уларытарга киириÑххин наада',
'whitelistedittext' => 'Улатыаххын баҕарар буоллаххына маны $1 гын.',
'confirmedittext' => 'Уларытарга Ñл. почтаҥ аадырыһын бигÑргÑтиÑÑ…Ñ‚ÑÑххин. БаÑтаан [[Special:Preferences|манна]] киирÑн бÑйÑн ааккын уонна Ñл. почтаҕын Ñуруй. Онтон Ñл. аадырыÑкын бигÑргÑÑ‚.',
'nosuchsectiontitle' => 'Бу Ñалаа көÑтүбÑÑ‚Ñ',
@@ -732,9 +751,7 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
'''КИМ ЭРЭ БÐС БИЛЭР ÐœÐТЫРЫЙÐÐЛЫРКИÐИТТЭРКӨҤҮЛЭ СУОХ ÐœÐÐÐРУГУМÐ!'''",
'copyrightwarning2' => "Болҕой, Ñн Ñуруйбут матырыйаалгын ким баҕарар уларытар уонна Ñуох гынар бырааптаах. Суруйбуккун уларыталларын ÑөбүлÑÑбÑÑ‚ буоллаххына манна Ñуруйума.<br />
Эбиитин манна Ñуруйдаххына, уларытыы ааптара мин буолабын, ÑбÑÑ‚ÑÑ€ көҥүл туһанары уонна уларытары көҥүллүүр ÑиртÑн ыллым диÑн бигÑргÑÑ‚Ñҕин (маны көр $1).<br /> '''КИМ ЭРЭ БÐС БИЛИИТИРМÐÐÐРКИÐИТТЭРКӨҤҮЛЭ СУОХ УГУМÐ!'''",
-'longpageerror' => "'''ERROR: The text you have submitted is $1 kilobytes
-long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''
-'''ÐЛҔÐС: Суруйар кÑрчиккит $1 килобайт ыйааһыннаах, онтуккут көҥүллÑммит $2 килобайты куоһарар. Маннык хаалар кыаҕа Ñуох'''",
+'longpageerror' => "'''ÐлҕаÑ: Суруйар кÑрчиккит {{PLURAL:$1|биир килобаайт|$1 килобаайт}} ыйааһыннаах, онтуккут көҥүллÑммит {{PLURAL:$2|биир килобаайты|$2 килобайты}} килобаайты куоһарар. Онон ÑирÑй бигÑргÑтиллÑÑ€ кыаҕа Ñуох.'''",
'readonlywarning' => "'''СЭРЭТИИ: СиÑрбÑÑ€Ð³Ñ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑкай Ò¯Ð»Ñ Ð±Ð°Ñ€Ð° турар, онон киллÑрбит уларытыыларыҥ тута хаалар кыахтара Ñуох.
Билигин уларытыыгын бÑйÑÒ¥ дииÑкÑÒ•ÑÑ€ хаалларан баран, кÑлин манна уган биÑриÑххин Ñөп.'''
@@ -905,8 +922,6 @@ long, which is longer than the maximum of $2 kilobytes. It cannot be saved.'''
'revdelete-unsuppress' => 'Төннөрүллүбүт торумнартан хааччахтааһыны ылан кÑбиһÑргÑ',
'revdelete-log' => 'ТөрүөтÑ:',
'revdelete-submit' => 'Маны талбыт {{PLURAL:$1|барылбар|барылларбар}} тутун',
-'revdelete-logentry' => '[[$1]] ÑирÑй торумун көÑÑ‚Ò¯Ò¯Ñ‚Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð´Ð°',
-'logdelete-logentry' => '[[$1]] дьайыы көÑÑ‚Ò¯Ò¯Ñ‚Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð´Ð°',
'revdelete-success' => "'''Барыл көÑÑ‚Ò¯Ò¯Ñ‚Ñ Ñөпкө уларыйда.'''",
'revdelete-failure' => "'''Барыл хайдах көÑÑ‚Ó©Ñ€Ó© кыайан уларытыллыбат:'''
$1",
@@ -918,15 +933,6 @@ $1",
'revdel-restore-visible' => 'көÑÑ‚Ó©Ñ€ барыллар',
'pagehist' => 'ИÑториÑтын ÑирÑйÑ',
'deletedhist' => 'Сотуллубут иÑториÑ',
-'revdelete-content' => 'иһинÑÑҕитÑ',
-'revdelete-summary' => 'уларытыылар туһунан',
-'revdelete-uname' => 'аата',
-'revdelete-restricted' => 'хааччахтааһын админиÑтраатардарга Ñыһыаннаах',
-'revdelete-unrestricted' => 'хааччахтааһын админÑтраатардартан уһулунна',
-'revdelete-hid' => 'киÑÑ‚Ñммит $1',
-'revdelete-unhid' => 'аһыллыбыт $1',
-'revdelete-log-message' => '$2 аналлаах $1 {{PLURAL:$2|торум|торумнар}}',
-'logdelete-log-message' => '$2 аналлаах (Ñыһыаннаах) $1 {{PLURAL:$2|түбÑлтÑ|түбÑлтÑлÑÑ€}}',
'revdelete-hide-current' => 'Баччаҕа оҥоһуллубут $2, $1 Ñурук киÑÑ‚ÑÑһинигÑÑ€ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта: бу билиҥҥи барыл.
Онон киÑÑ‚ÑнÑÑ€ кыаҕа Ñуох.',
'revdelete-show-no-access' => 'Баччаҕа оҥоһуллубут Ñуругу $2, $1 көÑÑ‚Ó©Ñ€ гынарга Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта: бу Ñурук "хааччахтаах" курдук бÑлиÑÑ‚Ñммит.
@@ -1081,12 +1087,14 @@ $1",
'prefs-rc' => 'КÑлиҥҥи уларытыылар',
'prefs-watchlist' => 'КÑÑ‚ÑÑһин',
'prefs-watchlist-days' => 'Ð¥Ð°Ñ Ñ…Ð¾Ð½ÑƒÐºÑ‚Ð°Ð°Ò•Ñ‹ уларыйыылар кÑÑ‚ÑÑһин иÑпииһÑгÑÑ€ көÑтөллөрө:',
-'prefs-watchlist-days-max' => 'Уһаабыта 7 күн',
+'prefs-watchlist-days-max' => 'Уһаабыта {{PLURAL:$1|биир күн|$1 күн}}',
'prefs-watchlist-edits' => 'Ð¥Ð°Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ñ‚Ñ‹Ñ‹Ð½Ñ‹ тупÑарыллыбыт кÑÑ‚ÑÑÒ»Ð¸Ò¥Ò¥Ñ ÐºÓ©Ñ€Ð´Ó©Ñ€Ó©Ñ€Ó©:',
'prefs-watchlist-edits-max' => 'Улааппыта: 1000',
'prefs-watchlist-token' => 'КÑÑ‚Ñбил тиһигин бÑлиÑÑ‚Ñ (токен):',
'prefs-misc' => 'Ðтын туруоруулар',
'prefs-resetpass' => 'Кирии тылы уларытыы',
+'prefs-changeemail' => 'Ðадырыһы уларытыы',
+'prefs-setemail' => 'Ðадырыһы киллÑрии',
'prefs-email' => 'Email туруоруулара',
'prefs-rendering' => 'Ð¢Ð°Ñ ÐºÓ©Ñ€Ò¯Ò¥Ñ',
'saveprefs' => 'БигÑргÑÑ‚',
@@ -1147,6 +1155,7 @@ $1",
'yourrealname' => 'Докумуонунан аатыҥ:',
'yourlanguage' => 'Омугуҥ тыла:',
'yourvariant' => 'ИһинÑÑҕитин тылын барыла:',
+'prefs-help-variant' => 'Биики ÑирÑйдÑрин иһинÑÑҕитин ханнык тылынан ÑбÑÑ‚ÑÑ€ таба Ñуруйуу барылынан көрүөххүн баҕараҕыный.',
'yournick' => 'Илии баттааһын:',
'prefs-help-signature' => 'Ырытыы ÑирÑйдÑригÑÑ€ Ñн Ñуруктарыҥ маннык бÑлиÑлÑри «<nowiki>~~~~</nowiki>» туруоруу көмөтүнÑн илии баттаныахтаахтар, ити бÑлиÑлÑÑ€ аптамаатынан Ñн аатыҥ уонна Ñуруйбут кÑмиҥ курдук буолан көÑÑ‚Ò¯Ó©Ñ…Ñ‚ÑÑ€Ñ.',
'badsig' => 'Сыыһа илии баттааһын; HTML тиÑгтÑрин көр.',
@@ -1186,7 +1195,7 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'userrights-lookup-user' => 'Кыттаачылар бөлөхтөрүн Ñалайыы',
'userrights-user-editname' => 'Кыттааччы аата:',
'editusergroup' => 'Кыттааччылар бөлөхтөрүн уларытарга',
-'editinguser' => "'''[[User:$1|$1]]''' кыттааччы быраабын уларытыы ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "[[User:$1|$1]]''' кыттааччы $2 быраабын уларытыы",
'userrights-editusergroup' => 'Кыттааччы бөлөхтөрүн уларытарга',
'saveusergroups' => 'Кыттааччы бөлөхтөрүн бигÑргÑÑ‚',
'userrights-groupsmember' => 'Бу бөлөхтөргө киирÑÑ€:',
@@ -1280,13 +1289,13 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'right-autopatrol' => 'Уларытыылар ботуруулламмыт курдук аптамаатынан бÑлиÑÑ‚ÑнÑллÑÑ€',
'right-patrolmarks' => 'КÑнники уларытыыларга бÑÑ€ÑбиÑркÑлÑммиттÑрин туһунан бÑлиÑлÑри көрүү',
'right-unwatchedpages' => 'КÑÑ‚ÑммÑÑ‚ ÑирÑйдÑÑ€ тиһиктÑрин көрүү',
-'right-trackback' => 'Trackback Ñ‹Ñ‹Ñ‚Ñ‹Ñ‹',
'right-mergehistory' => 'СирÑйдÑÑ€ иÑториÑларын холбооһун',
'right-userrights' => 'Кытааччылар бырааптарын барытын уларытыы',
'right-userrights-interwiki' => 'Ðтын биики-Ñаайтарга кыттааччылар бырааптарын уларытыы',
'right-siteadmin' => 'Ð‘Ð¸Ð»Ñ Ð¾Ð»Ð¾Ò•Ð¾Ñ€ (database) киирÑри бобуу уонна көҥүллÑÑһин',
'right-override-export-depth' => 'ÑирÑйдÑри таһаарааһын (ÑкÑпортааһын), ÑитимнÑÑÑ… ÑирÑйдÑри 5-Ñ Ñ‚Ð°Ò»Ñ‹Ð¼Ò¥Ð° дылы холбоон туран',
'right-sendemail' => 'Ðтын кыттааччыларга Ñл. почтаны ыытарга',
+'right-passwordreset' => 'Киирии тылы почта нөҥүө уларытыыны көрүү',
# User rights log
'rightslog' => 'Кыттаачы бырааптарын Ñурунаала',
@@ -1320,16 +1329,17 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'action-suppressionlog' => 'бу Ñ‚ÑƒÑ Ñурунаалы көрүү',
'action-block' => 'кыттааччы уларытыыны оҥорорун бобуу',
'action-protect' => 'бу ÑирÑй харыÑхалын таһымын уларытыы',
+'action-rollback' => 'бы ÑирÑйи көннөрбүт бүтÑһик киһи уларытыыларын түргÑнник Ñуох гыныы',
'action-import' => 'бу ÑирÑйи атын биикиттÑн киллÑрии',
'action-importupload' => 'бу ÑирÑйи ÑÑ€Ð´Ñ Ñуруллубут билÑÑ‚Ñ‚Ñн киллÑрии',
'action-patrol' => 'атыттар көннөрүүлÑрин ботуруулламмыт курдук бÑлиÑÑ‚ÑÑ',
'action-autopatrol' => 'бÑÐ¹Ñ ÐºÓ©Ð½Ð½Ó©Ñ€Ò¯Ò¯Ñ‚Ò¯Ð½ ботуруулламмыт курдук бÑлиÑÑ‚ÑÑһин',
'action-unwatchedpages' => 'ким да кÑÑ‚ÑÑбÑÑ‚ ÑирÑйдÑрин тиһиктÑрин көрүү',
-'action-trackback' => 'trackback Ñ‹Ñ‹Ñ‚Ñ‹Ñ‹',
'action-mergehistory' => 'бу ÑирÑй иÑториÑтын холбооһун',
'action-userrights' => 'кыттар бары бырааптарын уларытыы',
'action-userrights-interwiki' => 'атын Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÑ‹Ñ‚Ñ‚Ñ‹Ñ‹ бырааптарын уларытыы',
'action-siteadmin' => 'Ð±Ð¸Ð»Ñ Ð¾Ð»Ð¾Ò•ÑƒÐ½ хааччахтааһын уонна хааччахтааһынын уÑтуу',
+'action-sendemail' => 'Ñурук Ñ‹Ñ‹Ñ‚Ñ‹Ñ‹',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
@@ -1361,6 +1371,7 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'number_of_watching_users_pageview' => '[$1 кÑтиир {{PLURAL:$1|кыттааччы|кыттааччылар}}]',
'rc_categories' => 'Бу ÑÑ€Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñлартан (араар бÑÐ»Ð¸Ñ "|")',
'rc_categories_any' => 'Ханнык баҕарар',
+'rc-change-size-new' => 'Уларытыы кÑÑмÑйÑ: $1 баайт',
'newsectionsummary' => '/* $1 */ Ñаҥа ÑиÑкÑийÑ',
'rc-enhanced-expand' => 'Сиһилии көрдөр (JavaScript туһаныллар)',
'rc-enhanced-hide' => 'Сиһилиитин көрдөрүмÑ',
@@ -1413,6 +1424,7 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'ignorewarnings' => 'СÑÑ€Ñтиини иÑтимÑ',
'minlength1' => 'Ð‘Ð¸Ð»Ñ Ð°Ð°Ñ‚Ð° биир Ñуругунан буолуохтаах.',
'illegalfilename' => '«$1» Ð±Ð¸Ð»Ñ Ð°Ð°Ñ‚Ð° аакка туттуллубат бÑлиÑлÑрдÑÑÑ…. Уларыт уонна Ó©ÑÑÓ© киллÑÑ€Ñн көр.',
+'filename-toolong' => 'Ð‘Ð¸Ð»Ñ Ð°Ð°Ñ‚Ð° 240 баайты аһарыа Ñуохтаах.',
'badfilename' => 'Ð‘Ð¸Ð»Ñ Ð°Ð°Ñ‚Ð° маннык буолла: "$1".',
'filetype-mime-mismatch' => '«.$1» Ð±Ð¸Ð»Ñ ÐºÑтирÑÑÒ»Ð¸Ð½Ñ MIME-көрүҥÑÑ€ ($2) Ñөп түбÑÑпÑÑ‚.',
'filetype-badmime' => 'MIME-типтÑÑÑ… "$1" билÑлÑÑ€ кыайан манна Ñуруллубаттар.',
@@ -1520,6 +1532,36 @@ $1',
'upload-unknown-size' => 'БиллибÑÑ‚ кÑÑмÑй',
'upload-http-error' => 'HTTP алҕаһа таҕыÑта: $1',
+# File backend
+'backend-fail-backup' => 'Бу Ð±Ð¸Ð»Ñ $1 резервнÑй куопуйатын оҥорор табыллыбата.',
+'backend-fail-notexists' => 'Маннык $1 Ð±Ð¸Ð»Ñ Ñуох Ñбит.',
+'backend-fail-hashes' => 'ТÑÒ¥Ð½Ð¸Ð¸Ñ€Ð³Ñ Ð±Ð¸Ð»ÑлÑÑ€ Ñ…ÑÑштÑрин ылар Ñатамматаю',
+'backend-fail-notsame' => 'Майгыннаабат гынан баран маннык ааттаах $1 Ð±Ð¸Ð»Ñ Ð±Ð°Ð°Ñ€ Ñбит',
+'backend-fail-invalidpath' => '$1 - бу Ñуолунан Ñатаан угуллубат.',
+'backend-fail-delete' => '$1 билÑни Ñотор табыллыбата.',
+'backend-fail-alreadyexists' => '$1 Ð±Ð¸Ð»Ñ Ñ…Ð°Ð¹Ñ‹Ñ‹-Ò¯Ð¹Ñ Ð±Ð°Ð°Ñ€ Ñбит.',
+'backend-fail-store' => '$1 билÑни манна $2 угар табыллыбата.',
+'backend-fail-copy' => '$1 билÑни манна $2 хатылыыр табыллыбата.',
+'backend-fail-move' => '$1 билÑни манна $2 көһөрөр табыллыбата.',
+'backend-fail-opentemp' => 'БыÑтах кÑмнÑÑÑ… билÑни арыйар табыллыбата.',
+'backend-fail-writetemp' => 'БыÑтах кÑмнÑÑÑ… билÑÒ•Ñ Ñуруйар табыллыбата.',
+'backend-fail-closetemp' => 'БыÑтах кÑмнÑÑÑ… билÑни Ñабар табыллыбата.',
+'backend-fail-read' => '$1 билÑни ааҕар табыллыбата.',
+'backend-fail-create' => '$1 билÑни оҥорор табыллыбата.',
+'backend-fail-readonly' => '«$1» ÑиÑрбÑÑ€ «ааҕыы Ñрѻ ÑÑ€ÑÑÐ¸Ð¸Ð¼Ò¥Ñ ÐºÐ¸Ð¸Ñ€Ð±Ð¸Ñ‚. ТөрүөтÑ: «$2»',
+'backend-fail-synced' => '«$1» Ð±Ð¸Ð»Ñ ÑөпÑөһүллүбÑÑ‚ÑÑ… туруктаах',
+
+# Lock manager
+'lockmanager-notlocked' => 'Маны "$1" хааччаҕын уÑтар табыллыбата; кини хааччахтамматах.',
+'lockmanager-fail-closelock' => '"$1" хааччахтыыр билÑни Ñабар табыллыбата.',
+'lockmanager-fail-deletelock' => '"$1" хааччахтыыр билÑтин Ñотор табыллыбата.',
+'lockmanager-fail-acquirelock' => '"$1" хааччахтыыр Ñатаммата.',
+'lockmanager-fail-openlock' => '"$1" хааччахтыыр билÑтин арыйар табыллыбата.',
+'lockmanager-fail-releaselock' => '"$1" хааччаҕын уÑтар Ñатаммата.',
+'lockmanager-fail-db-bucket' => '$1 Ñегмеҥҥа хааччах баазаларын кытта Ñитими ÑитиһÑÑ€ табыллыбата.',
+'lockmanager-fail-db-release' => '$1 билии олоҕун хааччахтааһынын уÑтар табыллыбата.',
+'lockmanager-fail-svr-release' => '$1 ÑиÑрбÑÑ€ хааччахтааһынын уÑтар табыллыбата.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Ðрхыыбы тургутуу кÑмигÑÑ€ билÑни арыйарга Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта.',
'zip-wrong-format' => 'Бу Ð±Ð¸Ð»Ñ ZIP Ð±Ð¸Ð»Ñ Ð±ÑƒÐ¾Ð»Ð±Ð°Ñ‚Ð°Ñ… Ñбит.',
@@ -1641,23 +1683,24 @@ $1',
'filerevert-badversion' => 'Бу Ð±Ð¸Ð»Ñ Ñтиллибит күҥҥÑ-ыйга/кÑÐ¼Ò¥Ñ Ð¾Ò¥Ð¾Ò»ÑƒÐ»Ð»ÑƒÐ±ÑƒÑ‚ урукку торума Ñуох.',
# File deletion
-'filedelete' => 'Сот: $1',
-'filedelete-legend' => 'БилÑни Ñот',
-'filedelete-intro' => "Бу билÑни '''[[Media:$1|$1]]''' туох баар Ñуруллубут иÑториÑтын кытта Ñотон ÑÑ€Ñҕин.",
-'filedelete-intro-old' => "Манна баар [$4 $3, $2] '''[[Media:$1|$1]]''' торумнара Ñотулуннулар.",
-'filedelete-comment' => 'ТөрүөтÑ:',
-'filedelete-submit' => 'Сотуу',
-'filedelete-success' => "'''$1''' Ñотулунна.",
-'filedelete-success-old' => "$3-ҕа баар '''[[Media:$1|$1]]''' торуму (верÑиÑны) $2 Ñоппут.",
-'filedelete-nofile' => "'''$1''' Ñуох.",
-'filedelete-nofile-old' => "Этиллибит параметрдаах '''$1''' архыыптаммыт торума Ñуох.",
-'filedelete-otherreason' => 'Ðтын/Ñбии Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚:',
-'filedelete-reason-otherlist' => 'Ðтын Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚',
-'filedelete-reason-dropdown' => '*Common Ñотор Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ‚ÑÑ€Ñ
+'filedelete' => 'Сот: $1',
+'filedelete-legend' => 'БилÑни Ñот',
+'filedelete-intro' => "Бу билÑни '''[[Media:$1|$1]]''' туох баар Ñуруллубут иÑториÑтын кытта Ñотон ÑÑ€Ñҕин.",
+'filedelete-intro-old' => "Манна баар [$4 $3, $2] '''[[Media:$1|$1]]''' торумнара Ñотулуннулар.",
+'filedelete-comment' => 'ТөрүөтÑ:',
+'filedelete-submit' => 'Сотуу',
+'filedelete-success' => "'''$1''' Ñотулунна.",
+'filedelete-success-old' => "$3-ҕа баар '''[[Media:$1|$1]]''' торуму (верÑиÑны) $2 Ñоппут.",
+'filedelete-nofile' => "'''$1''' Ñуох.",
+'filedelete-nofile-old' => "Этиллибит параметрдаах '''$1''' архыыптаммыт торума Ñуох.",
+'filedelete-otherreason' => 'Ðтын/Ñбии Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚:',
+'filedelete-reason-otherlist' => 'Ðтын Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚',
+'filedelete-reason-dropdown' => '*Common Ñотор Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ‚ÑÑ€Ñ
** Ð‘Ð°Ñ Ð±Ð¸Ð»Ð¸Ð¸ быраабын кÑһии
** Ð¥Ð¾Ñ Ñуруллубут билÑ',
-'filedelete-edit-reasonlist' => 'Сотуу төрүөтүн уларыт',
-'filedelete-maintenance' => 'Көрүү-иÑтии үлÑтин кÑмигÑÑ€ билÑлÑри Ñотуу уонна төннөрүү быÑтах кÑÐ¼Ò¥Ñ Ñ‚Ð¾Ñ…Ñ‚Ð¾Ñ‚ÑƒÐ»ÑƒÐ½Ð½Ð°.',
+'filedelete-edit-reasonlist' => 'Сотуу төрүөтүн уларыт',
+'filedelete-maintenance' => 'Көрүү-иÑтии үлÑтин кÑмигÑÑ€ билÑлÑри Ñотуу уонна төннөрүү быÑтах кÑÐ¼Ò¥Ñ Ñ‚Ð¾Ñ…Ñ‚Ð¾Ñ‚ÑƒÐ»ÑƒÐ½Ð½Ð°.',
+'filedelete-maintenance-title' => 'БилÑни Ñотор табыллыбата',
# MIME search
'mimesearch' => 'MIME көрдөөһүн',
@@ -1753,6 +1796,8 @@ $1',
'wantedpages' => 'КөрдөнүллÑÑ€ ÑирÑйдÑÑ€',
'wantedpages-badtitle' => 'Көрдөбүл түмүгÑÑ€ Ñыыһалаах аат баар: $1',
'wantedfiles' => 'Көрдөммүт билÑлÑÑ€',
+'wantedfiletext-cat' => 'Манна көÑÑ‚Ó©Ñ€ билÑлÑри Ñуохтарын үрдүнÑн тутта Ñатыыллар. Бу Ñ‚Ð¸Ò»Ð¸Ð»Ð¸ÐºÐºÑ Ñ‚Ð°Ñка Ñытар билÑлÑÑ€ Ð°Ð»Ò•Ð°Ñ ÐºÐ¸Ð¸Ñ€Ð¸ÑÑ…Ñ‚Ñрин Ñөп. Оннук алҕаÑтык киирбиттÑÑ€ <del>Ñотуунан</del> бÑлиÑÑ‚ÑниÑÑ…Ñ‚ÑÑ€Ñ. Маны таһынан Ñуох билÑлÑÑ€Ð³Ñ ÑигÑнÑÑ€ ÑирÑйдÑÑ€ манна көÑтөллөр: [[:$1]].',
+'wantedfiletext-nocat' => 'Манна көÑÑ‚Ó©Ñ€ билÑлÑри Ñуохтарын үрдүнÑн тутта Ñатыыллар. Бу Ñ‚Ð¸Ò»Ð¸Ð»Ð¸ÐºÐºÑ Ñ‚Ð°Ñка Ñытар билÑлÑÑ€ Ð°Ð»Ò•Ð°Ñ ÐºÐ¸Ð¸Ñ€Ð¸ÑÑ…Ñ‚Ñрин Ñөп. Оннук алҕаÑтык киирбиттÑÑ€ <del>Ñотуунан</del> бÑлиÑÑ‚ÑниÑÑ…Ñ‚ÑÑ€Ñ.',
'wantedtemplates' => 'Көрдөнөр халыыптар',
'mostlinked' => 'Саамай ÑлбÑÑ… ÑирÑй ÑигÑнÑÑ€ ÑирÑйдÑÑ€Ñ',
'mostlinkedcategories' => 'Саамай ÑлбÑÑ… ÑирÑй ÑигÑнÑÑ€ категориÑлара',
@@ -1761,6 +1806,7 @@ $1',
'mostimages' => 'Саамай ÑлбÑхтик ÑигÑниллÑÑ€ билÑлÑÑ€',
'mostrevisions' => 'Саамай ÑлбÑхтик уларытыллыбыт Ñ‹Ñтатыйалар',
'prefixindex' => 'Мантан Ñаҕаланар (префикÑтаах) ÑирÑйдÑÑ€ барыта',
+'prefixindex-namespace' => 'СирÑй Ñаҕаланыытынан наардаан көрдөрүү ($1 аат далыгар)',
'shortpages' => 'ÐšÑ‹Ð»Ð³Ð°Ñ Ñ‹Ñтатыйалар',
'longpages' => 'Уһун Ñ‹Ñтатыйалар',
'deadendpages' => 'Dead-end (БүтÑй) ÑирÑйдÑÑ€',
@@ -1777,7 +1823,7 @@ $1',
'listusers-editsonly' => 'Саатар биир көннөрүүнү оҥорбут кыттааччылары көрдөр',
'listusers-creationsort' => 'Ðйыллыбыт күнүнÑн наардаа',
'usereditcount' => '$1 {{PLURAL:$1|көннөрүү|көннөрүү}}',
-'usercreated' => '$1, $2 айыллыбыт',
+'usercreated' => 'Баччаҕа {{GENDER:$3|бÑлиÑÑ‚Ñммит}} $1, $2',
'newpages' => 'Саҥа Ñ‹Ñтатыйалар',
'newpages-username' => 'Кыттааччы:',
'ancientpages' => 'БүтÑһик уларытыы киирбитинÑн наардаммыт Ñ‹Ñтатыйалар',
@@ -1870,12 +1916,8 @@ $1',
'activeusers-noresult' => 'Кыттааччылар көÑтүбÑтилÑÑ€.',
# Special:Log/newusers
-'newuserlogpage' => 'Кыттааччылары бÑлиÑтиир Ñурунаал',
-'newuserlogpagetext' => 'Соторутааҕыта бÑлиÑÑ‚Ñммит кыттааччылар.',
-'newuserlog-byemail' => 'киирии тыл Ñл. почтаннан ыытылынна',
-'newuserlog-create-entry' => 'Саҥа кыттааччы',
-'newuserlog-create2-entry' => '$1 диÑн Ñаҥа киһи бÑлиÑÑ‚ÑннÑ',
-'newuserlog-autocreate-entry' => 'Кыттааччы аата аптамаатынан оҥоһуллубут',
+'newuserlogpage' => 'Кыттааччылары бÑлиÑтиир Ñурунаал',
+'newuserlogpagetext' => 'Соторутааҕыта бÑлиÑÑ‚Ñммит кыттааччылар.',
# Special:ListGroupRights
'listgrouprights' => 'Кыттааччылар бөлөхтөрүн бырааптара',
@@ -1905,7 +1947,7 @@ $1',
"КимтÑн" графааҕа Ñн [[Special:Preferences|туруорууларгар]] баар аадырыһыҥ киириÑÒ•Ñ,
онон туппут киһи хардарар кыахтаныа.',
'usermailererror' => 'Сурук кыайан барбата:',
-'defemailsubject' => '{{SITENAME}} Ñл. почтата',
+'defemailsubject' => '{{SITENAME}} — бу киһиттÑн $1 Ñурук кÑлбит',
'usermaildisabled' => 'Кыттааччы Ñл почтата арахÑа Ñылдьар',
'usermaildisabledtext' => 'Эн атын кыттааччыларга Ñл. почтанан Ñурук ыытар кыаҕыҥ Ñуох Ñбит',
'noemailtitle' => 'E-mail Ñуох',
@@ -1959,7 +2001,7 @@ $1',
'watchmethod-list' => 'кÑÑ‚ÑÑһин бүтÑһик уларыйыылара',
'watchlistcontains' => '$1 ÑирÑйи кÑÑ‚ÑÑн көрөҕүн.',
'iteminvalidname' => "'$1' моһуогурда, аата Ñатаммата...",
-'wlnote' => "Манна кÑлиҥҥи {{PLURAL:$2|чааÑ|'''$2''' чааÑ}} иһигÑÑ€ оҥоһуллубут бүтÑһик $1 уларытыы көрдөрүлүннÑ.",
+'wlnote' => "Манна кÑлиҥҥи {{PLURAL:$2|чааÑ|'''$2''' чааÑ}} иһигÑÑ€ оҥоһуллубут бүтÑһик $1 уларытыы көрдөрүлүннÑ, бу кÑÐ¼Ò¥Ñ Ñ‚ÑƒÑ€ÑƒÐ³ÑƒÐ½Ð°Ð½ $3 $4.",
'wlshowlast' => 'бүтÑһик $1 чааÑка $2 ÐºÒ¯Ò¥Ò¥Ñ $3 көрдөр',
'watchlist-options' => 'КÑÑ‚ÑÑн көрүү туруоруутун уларытыы',
@@ -2022,8 +2064,6 @@ $UNWATCHURL
'actionfailed' => 'Дьайыы оҥоһуллубата',
'deletedtext' => '«$1» Ñотуллубут.
БүтÑһик Ñотуулар иÑпииһÑктÑрин манна: $2 көр.',
-'deletedarticle' => '"[[$1]]" Ñотуллубут',
-'suppressedarticle' => '"[[$1]]" киÑÑ‚ÑÑбит',
'dellogpage' => 'Сотуу иÑпииһÑгÑ',
'dellogpagetext' => 'Манна кÑнники Ñотуулар иÑпииһÑктÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.',
'deletionlog' => 'Ñотуу иÑпииһÑгÑ',
@@ -2067,7 +2107,10 @@ $UNWATCHURL
'unprotectedarticle' => '[[$1]]" көмүÑкÑÐ»Ñ Ñуох оҥоһулунна',
'movedarticleprotection' => 'көмүÑкÑл туруоруутун мантан "[[$2]]" манна "[[$1]]" көһөрдө',
'protect-title' => '"$1": Уларытыы таһымын туруоруу',
+'protect-title-notallowed' => 'ХарыÑхал "$1" таһымын көрүү',
'prot_1movedto2' => '[[$1]] аата манныкка уларытылынна: [[$2]]',
+'protect-badnamespace-title' => 'КөмүÑкÑммÑÑ‚ аат дала',
+'protect-badnamespace-text' => 'Бу аат далын ÑирÑйдÑÑ€Ñ ÐºÓ©Ð¼Ò¯ÑкÑниллÑÑ€ кыахтара Ñуохю',
'protect-legend' => 'Уларытыы таһымын бигÑргÑÑ‚',
'protectcomment' => 'ТөрүөтÑ:',
'protectexpiry' => 'БүтүөхтÑÑÑ…:',
@@ -2088,6 +2131,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Дьаһабыллар ÑÑ€Ñ',
'protect-summary-cascade' => 'каÑкадтаах',
'protect-expiring' => 'болдьоҕо $1 (UTC)',
+'protect-expiring-local' => 'болдьоҕо баччаҕа бүтÑÑ€: $1',
'protect-expiry-indefinite' => 'болдьоҕо Ñуох кÑмҥÑ',
'protect-cascade' => 'Бу ÑирÑÐ¹Ð³Ñ ÐºÐ¸Ð¸Ñ€ÑÑ€ ÑирÑйдÑри уларытыыттан көмүÑкÑÑ (cascading protection)',
'protect-cantedit' => 'Бу ÑирÑй хатааһынын таһымын уларыппаккын: уларытар кыах бÑриллибÑÑ‚ÑÑ….',
@@ -2148,7 +2192,6 @@ $UNWATCHURL
'undeletereset' => 'Саҥаттан',
'undeleteinvert' => 'Хараардыллыбыты инверÑиÑлаа',
'undeletecomment' => 'ТөрүөтÑ:',
-'undeletedarticle' => '"[[$1]]" төннөрүлүннÑ',
'undeletedrevisions' => '{{PLURAL:$1|1 уларытыы|$1 уларытыы}} төннөрүлүннÑ',
'undeletedrevisions-files' => '{{PLURAL:$1|1 уларытыы|$1 уларытыы}} уонна {{PLURAL:$2|1 билÑ|$2 билÑ}} төннөрүлүннÑ',
'undeletedfiles' => '{{PLURAL:$1|1 билÑ|$1 билÑ}} төннөрүлүннÑ',
@@ -2157,6 +2200,7 @@ $UNWATCHURL
КÑнники Ñотуулар уонна төннөрүүлÑÑ€ иÑпииһÑктÑрин [[Special:Log/delete|манна]] көрүөххүн Ñөп.",
'undelete-header' => 'Соторутааҥы [[Special:Log/delete|Ñотуу иÑпииһÑгин]] көрүөххүн Ñөп.',
+'undelete-search-title' => 'Сотуллубут ÑирÑйдÑри көрдөөһүн',
'undelete-search-box' => 'Сотуллубут ÑирÑйдÑри көрдөөһүн',
'undelete-search-prefix' => 'Мантан Ñаҕаланар ÑирÑйдÑри көрдөө:',
'undelete-search-submit' => 'Көрдөө',
@@ -2165,6 +2209,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'СирÑй $1 кÑмнÑÑҕи торумун төннөрөр кыах Ñуох: Ñотуу Ð¸Ð½Ð½Ð¸Ð½Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº Ð±Ð¸Ð»Ñ Ñуох ÑÑ‚Ñ.',
'undelete-cleanup-error' => 'Туһаныллыбат, архыыпка Ñытар "$1" Ð±Ð¸Ð»Ñ ÐºÑ‹Ð°Ð¹Ð°Ð½ Ñотуллубата.',
'undelete-missing-filearchive' => 'Ðрхыыпка Ñытыахтаах $1 нүөмÑрдÑÑÑ… билÑни Ñуох буолан төннөрөр Ñатаммата. Ðомнуо төннөрүллүбүт буолуон Ñөп.',
+'undelete-error' => 'СирÑйии Ñөргүтүү табыллыбата',
'undelete-error-short' => 'БилÑни төннөрүү моһуогурда: $1',
'undelete-error-long' => 'БилÑни төннөрүү кÑмигÑÑ€ моһуок таҕыÑта:
@@ -2287,6 +2332,7 @@ $1',
'blocklist-userblocks' => 'Хааччахтаммыт кыттааччылары көрдөрүмÑ',
'blocklist-tempblocks' => 'БыÑтаах кÑÐ¼Ò¥Ñ Ñ…Ð°Ð°Ñ‡Ñ‡Ð°Ñ…Ñ‚Ð°Ñ€Ñ‹ көрдөрүмÑ',
'blocklist-addressblocks' => 'БиирдиилÑÑн IP-лары хааччахтааһыны көрдөрүмÑ',
+'blocklist-rangeblocks' => 'Диапазоннар хаачахтарын киÑÑ‚ÑÑ',
'blocklist-timestamp' => 'КүнÑ-дьыла',
'blocklist-target' => 'Сыал-Ñорук',
'blocklist-expiry' => 'Болдьоҕо',
@@ -2309,6 +2355,7 @@ $1',
'unblocklink' => 'бобууну/хааччахтааһыны Ñуох гын',
'change-blocklink' => 'хааччахтааһыны уларытыы',
'contribslink' => 'вклад',
+'emaillink' => 'Ñуругу Ñ‹Ñ‹Ñ‚',
'autoblocker' => 'Эн IP-Ò¥ "[[User:$1|$1]]" кыттааччыны кытта биир буолан, Ñн ÑÐ¼Ð¸Ñ Ñ…Ð°Ð°Ñ‡Ñ‡Ð°Ñ…Ñ‚Ð°Ð½Ñ‹Ñ‹Ð³Ð° түбÑÑтиҥ. Кини хааччахтаммыт Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ: "$2"',
'blocklogpage' => 'Хааччахтааһын/бобуу Ñурунаала',
'blocklog-showlog' => 'Бу кыттааччы бÑлиÑÑ€ хааччахтаммыт. Хааччах Ñурунаала аллара көÑÑ‚Ó©Ñ€:',
@@ -2432,9 +2479,6 @@ $1',
'movepage-page-moved' => '$1 ÑирÑй аата $2 буолбут.',
'movepage-page-unmoved' => '$1 ÑирÑй $2 ааттанар кыаҕа Ñуох.',
'movepage-max-pages' => '$1 {{PLURAL:$1|ÑирÑй аата уларыйда|ÑирÑйдÑÑ€ ааттара уларыйда}} — мантан ÑлбÑÑ… ÑирÑйи аптамаатынан уларытар кыах Ñуох.',
-'1movedto2' => '[[$1]] аата манныкка уларытылынна: [[$2]]',
-'1movedto2_redir' => 'Утаарыы үрдүнÑн [[$1]] ÑирÑй аата манныкка уларытылынна: [[$2]]',
-'move-redirect-suppressed' => 'утаарыы бобуллубут',
'movelogpage' => 'Ðат уларыйыытын иÑпииһÑгÑ',
'movelogpagetext' => 'Манна ааттара уларытыллыбыт ÑирÑйдÑÑ€ иÑпииһÑктÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.',
'movesubpage' => '{{PLURAL:$1|Ðлын ÑирÑй|Ðлын ÑирÑйдÑÑ€}}',
@@ -2447,7 +2491,7 @@ $1',
Маннык ааттаах ÑирÑй [[:$1|«$1»]] бÑлиÑÑ€ баар. Эн ону Ñуох гынан баран аатын уларытаары гынаҕын дуо?',
'delete_and_move_confirm' => 'Сөп, бу ÑирÑйи Ñуох гын',
-'delete_and_move_reason' => 'Ðатын уларытаары Ñотулунна',
+'delete_and_move_reason' => 'Ðатын уларытаары Ñотулунна "[[$1]]"',
'selfmove' => 'Ðатын уларытар Ñатаммат. Ð­Ñ€Ð³Ñ ÑƒÐ¾Ð½Ð½Ð° Ñаҥа аата биирдÑÑ€.',
'immobile-source-namespace' => '"$1" аат далыгар баар ÑирÑйдÑÑ€ ааттарын уларытар кыах Ñуох.',
'immobile-target-namespace' => '"$1" аат далыгар ÑирÑйи көһөрөр кыах Ñуох',
@@ -2480,9 +2524,11 @@ $1',
ЭкÑпорт анал аадырыһын туһанан ÑирÑй бүтÑһик торумун ÐºÓ©Ò»Ó©Ñ€Ò¯Ó©Ñ…Ñ…Ñ ÑÐ¼Ð¸Ñ Ñөп.
Холобур, [[{{MediaWiki:Mainpage}}]] ÑирÑйи маннык: [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'СирÑйдÑри барыларын таÑка таһаарыы (export)',
'exportcuronly' => 'БүтÑһик торуму ÑÑ€Ñ ÐºÐ¸Ð»Ð»ÑÑ€, уларытыы толору иÑториÑта наадата Ñуох',
'exportnohistory' => "----
'''БиллÑрии:''' СирÑй толору иÑториÑтын таһаарыы (ÑкÑпорт) кыах тиийбÑтинÑн араарыллыбыт.",
+'exportlistauthors' => 'Ð¥Ð°Ñ ÑирÑй аайы уларыппыт дьоннор тиһиликтÑрин холбоо',
'export-submit' => 'ТаÑка таһаарыы (ÑкÑпорт)',
'export-addcattext' => 'Бу категриÑттан ÑирÑйдÑри Ñп:',
'export-addcat' => 'ЭбÑн биÑÑ€',
@@ -2515,6 +2561,8 @@ $1',
'thumbnail_error' => 'Кыра ойууну оҥоруу Ñатаммата: $1',
'djvu_page_error' => 'DjVu ÑирÑй тиһик таһыгар Ñбит',
'djvu_no_xml' => 'DjVu билÑтигÑÑ€ аналлаах XML кыайан ылыллыбата',
+'thumbnail-temp-create' => 'ЭÑкииз быÑтах билÑтин оҥорор табыллыбата',
+'thumbnail-dest-create' => 'ЭÑкииһи ыйбыт ÑиргÑÑ€ угар табыллыбата',
'thumbnail_invalid_params' => 'Кыра ойуу кÑÑмÑÐ¹Ñ Ñыыһалаах',
'thumbnail_dest_directory' => 'Ðаадалаах каталогы оҥорор табыллыбата',
'thumbnail_image-type' => 'Маннык ойуу ÐºÓ©Ñ€Ò¯Ò¥Ñ Ð¼Ð°Ð½Ð½Ð° туттуллубат',
@@ -2559,6 +2607,11 @@ $1',
'import-upload' => 'XML-дааннайдары киллÑÑ€',
'import-token-mismatch' => 'ÐрахÑан хаалбыт. Ó¨ÑÑÓ© киирÑн көр.',
'import-invalid-interwiki' => 'Бу биикиттÑн импорт оҥорор Ñатаммат(а).',
+'import-error-edit' => '«$1» ÑирÑй киллÑриллибÑÑ‚Ñ, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ ÐºÐ¸Ð½Ð¸Ð½Ð¸ көннөрөрүҥ көҥүллÑммÑÑ‚ Ñбит.',
+'import-error-create' => '«$1» ÑирÑй киллÑриллибÑÑ‚Ñ, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ ÐºÐ¸Ð½Ð¸Ð½Ð¸ айарыҥ Ñатаммат Ñбит.',
+'import-error-interwiki' => '"$1" ÑирÑй импортаммата, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð±Ñƒ аат Ñ‚Ð°Ñ ÑигÑлÑÑ€Ð³Ñ (интервикаҕа) аналлаах Ñбит.',
+'import-error-special' => '"$1" ÑирÑй импортаммата, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ ÐºÐ¸Ð½Ð¸ баар аат далыгар Ñаҥа ÑирÑйдÑри оҥорор көҥүллÑммÑÑ‚ Ñбит.',
+'import-error-invalid' => '"$1" ÑирÑй импортаммата, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº аат туттуллара бобуллубут.',
# Import log
'importlogpage' => 'Импорт Ñурунаала',
@@ -2568,73 +2621,86 @@ $1',
'import-logentry-interwiki' => 'биикилÑÑ€ ыккардыларынааҕы $1',
'import-logentry-interwiki-detail' => 'барыта $2 барылтан $1 барыл',
+# JavaScriptTest
+'javascripttest' => 'JavaScript тургутуу',
+'javascripttest-disabled' => 'Бу дьайыы араарыллыбыт.',
+'javascripttest-title' => '$1 тургутуу бара турар',
+'javascripttest-pagetext-noframework' => 'Бу ÑирÑй JavaScript тургутууларга анаммыт.',
+'javascripttest-pagetext-unknownframework' => '"$1" тургутуу биллибÑÑ‚ ÑйгÑÑ‚Ñ.',
+'javascripttest-pagetext-frameworks' => 'Бука диÑн, бу тургуутуу ÑйгÑлÑриттÑн биирин тал: $1',
+'javascripttest-pagetext-skins' => 'Тургутууну ыытарга Ñ‚Ð°Ñ ÐºÓ©Ñ€Ò¯Ò¥Ò¯Ð½ баÑтаан тал:',
+'javascripttest-qunit-intro' => '[$1 тургутуу документациÑтын] манна mediawiki.org көр.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Кыттааччы быһыытынан Ñ‚ÑƒÑ ÑирÑйиҥ',
-'tooltip-pt-anonuserpage' => 'Билигин киирбит IP-м ÑирÑйÑ',
-'tooltip-pt-mytalk' => 'КÑпÑÑÑ‚ÑÑ€-ырытар Ñириҥ',
-'tooltip-pt-anontalk' => 'Бу IP ырытыыта',
-'tooltip-pt-preferences' => 'БÑйÑм туруорууларым',
-'tooltip-pt-watchlist' => 'КÑÑ‚ÑÑн көрөр ÑирÑйдÑрим тиһигÑ',
-'tooltip-pt-mycontris' => 'Суруйбут/уларыппыт ÑирÑйдÑриҥ тиһиктÑÑ€Ñ',
-'tooltip-pt-login' => 'Манна бÑйÑҕин билиһиннÑриÑххин Ñөп (булгуччута Ñуох).',
-'tooltip-pt-anonlogin' => 'БÑйÑҕин билиһиннÑриÑххин Ñөп (булгуччута Ñуох).',
-'tooltip-pt-logout' => 'ТахÑÑ‹Ñ‹',
-'tooltip-ca-talk' => 'ЫÑтатыйаны ырытыы',
-'tooltip-ca-edit' => 'Бу ÑирÑйи уларытыахха Ñөп. Бука диÑн баÑтаан хайдах буоларын көрөн баран уларыт.',
-'tooltip-ca-addsection' => 'Саҥа Ñалааны Ñаҕалааһын',
-'tooltip-ca-viewsource' => 'Бу ÑирÑй улартыллыбат. Ол гынан баран тутулун көрүөххүн уонна уÑтан ылыаххын Ñөп.',
-'tooltip-ca-history' => 'Бу ÑирÑй урукку торумнара.',
-'tooltip-ca-protect' => 'Бу ÑирÑйи уларытары боборго',
-'tooltip-ca-unprotect' => 'Бу ÑирÑй көмүÑкÑлин уларыт',
-'tooltip-ca-delete' => 'Бу ÑирÑйи Ñуох гын',
-'tooltip-ca-undelete' => 'СирÑй Ñотулла Ð¸Ð»Ð¸Ð³Ð¸Ð½Ñ Ð¾Ò¥Ð¾Ò»ÑƒÐ»Ð»ÑƒÐ±ÑƒÑ‚ уларытыыларын төннөрөргө',
-'tooltip-ca-move' => 'Ðатын уларытарга',
-'tooltip-ca-watch' => 'КÑÑ‚ÑÑн көрүү иÑпииһÑгÑÑ€ киллÑÑ€',
-'tooltip-ca-unwatch' => 'Бу ÑирÑйи кÑÑ‚ÑÑн көрүү иÑпииһÑгиттÑн Ñот',
-'tooltip-search' => 'Тылы көрдөө',
-'tooltip-search-go' => 'Маннык толору ааттаах ÑирÑйи (ÑирÑйгÑ) көрдүүргÑ',
-'tooltip-search-fulltext' => 'СирÑйдÑÑ€Ð³Ñ Ð±Ñƒ тиÑкиһи көрдөө',
-'tooltip-p-logo' => 'Сүрүн ÑирÑй',
-'tooltip-n-mainpage' => 'Сүрүн ÑирÑÐ¹Ð³Ñ Ð±Ð°Ñ€Ñ‹Ñ‹',
-'tooltip-n-mainpage-description' => 'Сүрүн ÑирÑйгÑ',
-'tooltip-n-portal' => 'Бу бырайыак туһунан, манна тугу гыныаххытын Ñөбүй уонна туох ханна баара',
-'tooltip-n-currentevents' => 'Ðайдите вводную информацию на текущих ÑобытиÑÑ…',
-'tooltip-n-recentchanges' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð±ÑƒÐ¾Ð»Ð±ÑƒÑ‚ бүтÑһик уларытыылар.',
-'tooltip-n-randompage' => 'Ханнык баҕарар ÑирÑйи көрдөр',
-'tooltip-n-help' => '«{{SITENAME}}» Ñправочнига.',
-'tooltip-t-whatlinkshere' => 'Бу ÑирÑÐ¹Ð³Ñ ÑигÑнÑÑ€ ÑирÑйдÑÑ€ иÑпииһÑктÑÑ€Ñ',
-'tooltip-t-recentchangeslinked' => 'Бу ÑирÑй ÑигÑнÑÑ€ ÑирÑйдÑригÑÑ€ кÑнники уларыйыылар',
-'tooltip-feed-rss' => 'RSS бу ÑирÑйгÑ',
-'tooltip-feed-atom' => 'Atom бу ÑирÑйгÑ',
-'tooltip-t-contributions' => 'Бу кыттааччы уларыппыт ÑирÑйдÑрин иÑпииһÑгÑ',
-'tooltip-t-emailuser' => 'Бу киһиÑÑ…Ñ Ñурук ыытарга',
-'tooltip-t-upload' => 'БилÑлÑри Ñуруттарыы',
-'tooltip-t-specialpages' => 'Ðнал ÑирÑйдÑÑ€ иÑпииһÑктÑÑ€Ñ',
-'tooltip-t-print' => 'СирÑй бÑчÑÑÐºÐºÑ Ñ‹Ñ‹Ñ‚Ñ‹Ð»Ð»Ð°Ñ€ торума',
-'tooltip-t-permalink' => 'СирÑй куруук баар ÑиригÑÑ€ ыйынньык',
-'tooltip-ca-nstab-main' => 'ЫÑтатыйа Ð¸Ñ Ñ…Ð¾Ò»Ð¾Ð¾Ð½Ð¾',
-'tooltip-ca-nstab-user' => 'Кыттааччы бÑйÑтин ÑирÑ',
-'tooltip-ca-nstab-media' => 'МиÑÐ´ÑŒÐ¸Ð¹Ñ Ð±Ð¸Ð»ÑÑ‚Ñ',
-'tooltip-ca-nstab-special' => 'Бу туÑпа аналлаах ÑирÑй, уларытыллыбат',
-'tooltip-ca-nstab-project' => 'Бырайыак туһунан',
-'tooltip-ca-nstab-image' => 'Ойуу туһунан көрүү',
-'tooltip-ca-nstab-mediawiki' => 'Тиһик (ÑиÑтема) биллÑриитин көрүү',
-'tooltip-ca-nstab-template' => 'Халыып туһунан',
-'tooltip-ca-nstab-help' => 'Көмө ÑирÑйи көрүү',
-'tooltip-ca-nstab-category' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½',
-'tooltip-minoredit' => 'Уларытыыны Ñуолтата кыра курдук бÑлиÑÑ‚ÑÑ',
-'tooltip-save' => 'Уларытыыны бигÑргÑтии',
-'tooltip-preview' => 'Уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ ÐºÓ©Ñ€Ò¯Ò¯; бука диÑн маны туһан!',
-'tooltip-diff' => 'Уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ð±Ð°Ð°Ñ€ тиÑкиһи кытта Ñ‚ÑҥнÑÑһин.',
-'tooltip-compareselectedversions' => 'Икки талыллыбыт торумнар ыккардыларынааҕы уратыны көрдөр.',
-'tooltip-watch' => 'Бу ÑирÑйи кÑÑ‚ÑÑһин иÑпииһÑгÑÑ€ киллÑÑ€',
-'tooltip-recreate' => 'СирÑйи Ñуох гыныллыбытын үрдүнÑн Ñөргүтүү',
-'tooltip-upload' => 'Суруйууну Ñаҕалаа',
-'tooltip-rollback' => 'Биир баттааһынынан бүтÑһик көннөрүүлÑри оҥорбут киһи уларытыыларын Ñуох оҥорорго.',
-'tooltip-undo' => 'БүтÑһик көннөрүүнү Ñуох оҥор уонна уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ñ…Ð°Ð¹Ð´Ð°Ñ… көÑÑ‚Ò¯Ó©Ñ…Ñ‚ÑÑҕин көрдөрөр түннүгү таһаар.
+'tooltip-pt-userpage' => 'Кыттааччы быһыытынан Ñ‚ÑƒÑ ÑирÑйиҥ',
+'tooltip-pt-anonuserpage' => 'Билигин киирбит IP-м ÑирÑйÑ',
+'tooltip-pt-mytalk' => 'КÑпÑÑÑ‚ÑÑ€-ырытар Ñириҥ',
+'tooltip-pt-anontalk' => 'Бу IP ырытыыта',
+'tooltip-pt-preferences' => 'БÑйÑм туруорууларым',
+'tooltip-pt-watchlist' => 'КÑÑ‚ÑÑн көрөр ÑирÑйдÑрим тиһигÑ',
+'tooltip-pt-mycontris' => 'Суруйбут/уларыппыт ÑирÑйдÑриҥ тиһиктÑÑ€Ñ',
+'tooltip-pt-login' => 'Манна бÑйÑҕин билиһиннÑриÑххин Ñөп (булгуччута Ñуох).',
+'tooltip-pt-anonlogin' => 'БÑйÑҕин билиһиннÑриÑххин Ñөп (булгуччута Ñуох).',
+'tooltip-pt-logout' => 'ТахÑÑ‹Ñ‹',
+'tooltip-ca-talk' => 'ЫÑтатыйаны ырытыы',
+'tooltip-ca-edit' => 'Бу ÑирÑйи уларытыахха Ñөп. Бука диÑн баÑтаан хайдах буоларын көрөн баран уларыт.',
+'tooltip-ca-addsection' => 'Саҥа Ñалааны Ñаҕалааһын',
+'tooltip-ca-viewsource' => 'Бу ÑирÑй улартыллыбат. Ол гынан баран тутулун көрүөххүн уонна уÑтан ылыаххын Ñөп.',
+'tooltip-ca-history' => 'Бу ÑирÑй урукку торумнара.',
+'tooltip-ca-protect' => 'Бу ÑирÑйи уларытары боборго',
+'tooltip-ca-unprotect' => 'Бу ÑирÑй көмүÑкÑлин уларыт',
+'tooltip-ca-delete' => 'Бу ÑирÑйи Ñуох гын',
+'tooltip-ca-undelete' => 'СирÑй Ñотулла Ð¸Ð»Ð¸Ð³Ð¸Ð½Ñ Ð¾Ò¥Ð¾Ò»ÑƒÐ»Ð»ÑƒÐ±ÑƒÑ‚ уларытыыларын төннөрөргө',
+'tooltip-ca-move' => 'Ðатын уларытарга',
+'tooltip-ca-watch' => 'КÑÑ‚ÑÑн көрүү иÑпииһÑгÑÑ€ киллÑÑ€',
+'tooltip-ca-unwatch' => 'Бу ÑирÑйи кÑÑ‚ÑÑн көрүү иÑпииһÑгиттÑн Ñот',
+'tooltip-search' => 'Тылы көрдөө',
+'tooltip-search-go' => 'Маннык толору ааттаах ÑирÑйи (ÑирÑйгÑ) көрдүүргÑ',
+'tooltip-search-fulltext' => 'СирÑйдÑÑ€Ð³Ñ Ð±Ñƒ тиÑкиһи көрдөө',
+'tooltip-p-logo' => 'Сүрүн ÑирÑй',
+'tooltip-n-mainpage' => 'Сүрүн ÑирÑÐ¹Ð³Ñ Ð±Ð°Ñ€Ñ‹Ñ‹',
+'tooltip-n-mainpage-description' => 'Сүрүн ÑирÑйгÑ',
+'tooltip-n-portal' => 'Бу бырайыак туһунан, манна тугу гыныаххытын Ñөбүй уонна туох ханна баара',
+'tooltip-n-currentevents' => 'Ðайдите вводную информацию на текущих ÑобытиÑÑ…',
+'tooltip-n-recentchanges' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð±ÑƒÐ¾Ð»Ð±ÑƒÑ‚ бүтÑһик уларытыылар.',
+'tooltip-n-randompage' => 'Ханнык баҕарар ÑирÑйи көрдөр',
+'tooltip-n-help' => '«{{SITENAME}}» Ñправочнига.',
+'tooltip-t-whatlinkshere' => 'Бу ÑирÑÐ¹Ð³Ñ ÑигÑнÑÑ€ ÑирÑйдÑÑ€ иÑпииһÑктÑÑ€Ñ',
+'tooltip-t-recentchangeslinked' => 'Бу ÑирÑй ÑигÑнÑÑ€ ÑирÑйдÑригÑÑ€ кÑнники уларыйыылар',
+'tooltip-feed-rss' => 'RSS бу ÑирÑйгÑ',
+'tooltip-feed-atom' => 'Atom бу ÑирÑйгÑ',
+'tooltip-t-contributions' => 'Бу кыттааччы уларыппыт ÑирÑйдÑрин иÑпииһÑгÑ',
+'tooltip-t-emailuser' => 'Бу киһиÑÑ…Ñ Ñурук ыытарга',
+'tooltip-t-upload' => 'БилÑлÑри Ñуруттарыы',
+'tooltip-t-specialpages' => 'Ðнал ÑирÑйдÑÑ€ иÑпииһÑктÑÑ€Ñ',
+'tooltip-t-print' => 'СирÑй бÑчÑÑÐºÐºÑ Ñ‹Ñ‹Ñ‚Ñ‹Ð»Ð»Ð°Ñ€ торума',
+'tooltip-t-permalink' => 'СирÑй куруук баар ÑиригÑÑ€ ыйынньык',
+'tooltip-ca-nstab-main' => 'ЫÑтатыйа Ð¸Ñ Ñ…Ð¾Ò»Ð¾Ð¾Ð½Ð¾',
+'tooltip-ca-nstab-user' => 'Кыттааччы бÑйÑтин ÑирÑ',
+'tooltip-ca-nstab-media' => 'МиÑÐ´ÑŒÐ¸Ð¹Ñ Ð±Ð¸Ð»ÑÑ‚Ñ',
+'tooltip-ca-nstab-special' => 'Бу туÑпа аналлаах ÑирÑй, уларытыллыбат',
+'tooltip-ca-nstab-project' => 'Бырайыак туһунан',
+'tooltip-ca-nstab-image' => 'Ойуу туһунан көрүү',
+'tooltip-ca-nstab-mediawiki' => 'Тиһик (ÑиÑтема) биллÑриитин көрүү',
+'tooltip-ca-nstab-template' => 'Халыып туһунан',
+'tooltip-ca-nstab-help' => 'Көмө ÑирÑйи көрүү',
+'tooltip-ca-nstab-category' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½',
+'tooltip-minoredit' => 'Уларытыыны Ñуолтата кыра курдук бÑлиÑÑ‚ÑÑ',
+'tooltip-save' => 'Уларытыыны бигÑргÑтии',
+'tooltip-preview' => 'Уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ ÐºÓ©Ñ€Ò¯Ò¯; бука диÑн маны туһан!',
+'tooltip-diff' => 'Уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ð±Ð°Ð°Ñ€ тиÑкиһи кытта Ñ‚ÑҥнÑÑһин.',
+'tooltip-compareselectedversions' => 'Икки талыллыбыт торумнар ыккардыларынааҕы уратыны көрдөр.',
+'tooltip-watch' => 'Бу ÑирÑйи кÑÑ‚ÑÑһин иÑпииһÑгÑÑ€ киллÑÑ€',
+'tooltip-watchlistedit-normal-submit' => 'Пууннары Ñот',
+'tooltip-watchlistedit-raw-submit' => 'КÑÑ‚Ñбил тиһилигин Ñаҥардан биÑÑ€',
+'tooltip-recreate' => 'СирÑйи Ñуох гыныллыбытын үрдүнÑн Ñөргүтүү',
+'tooltip-upload' => 'Суруйууну Ñаҕалаа',
+'tooltip-rollback' => 'Биир баттааһынынан бүтÑһик көннөрүүлÑри оҥорбут киһи уларытыыларын Ñуох оҥорорго.',
+'tooltip-undo' => 'БүтÑһик көннөрүүнү Ñуох оҥор уонна уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ñ…Ð°Ð¹Ð´Ð°Ñ… көÑÑ‚Ò¯Ó©Ñ…Ñ‚ÑÑҕин көрдөрөр түннүгү таһаар.
Уларытыы төрүөтүн быһаарар кыаҕы биÑÑ€.',
-'tooltip-preferences-save' => 'Туруоруулары бигÑргÑÑ‚',
-'tooltip-summary' => 'КылгаÑтык бу туһунан Ñуруй',
+'tooltip-preferences-save' => 'Туруоруулары бигÑргÑÑ‚',
+'tooltip-summary' => 'КылгаÑтык бу туһунан Ñуруй',
# Stylesheets
'common.css' => '/** Манна оҥоһуллубут CSS атын Ñкиннарга ÑÐ¼Ð¸Ñ Ð¾Ð»Ð¾Ñ…Ñ‚Ð¾Ð½ÑƒÐ¾ */',
@@ -2703,9 +2769,6 @@ $1',
# Patrol log
'patrol-log-page' => 'БÑÑ€ÑбиÑÑ€ÐºÑ Ñурунаала',
'patrol-log-header' => 'Ботуруулламмыт торумнар Ñурунааллара.',
-'patrol-log-line' => '$2-Ñ‚Ñн $1 бÑлиÑÑ‚Ñммит, патрулламмыт $3',
-'patrol-log-auto' => '(аптамаатынан)',
-'patrol-log-diff' => '$1 барыл',
'log-show-hide-patrol' => '$1 ботурууллааһын Ñурунаала',
# Image deletion
@@ -2732,11 +2795,11 @@ $1',
'file-info' => 'Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $1, MIME тиибÑ: $2',
'file-info-size' => '$1 × $2 пиикÑÑл, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3, MIME тиибÑ: $4',
'file-info-size-pages' => '$1 × $2 пикÑель, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3, MIME-көрүҥ: $4, $5 ÑирÑйдÑÑÑ…',
-'file-nohires' => '<small>Бу ойуу маннааҕар улахан торума Ñуох.</small>',
+'file-nohires' => 'Бу ойуу маннааҕар улахан торума Ñуох.',
'svg-long-desc' => 'SVG билÑ, номинальнай кÑÑмÑÐ¹Ñ $1 × $2 пиикÑÑл, Ð±Ð¸Ð»Ñ ÐºÑÑмÑйÑ: $3',
'show-big-image' => 'Ойуу бÑйÑтин толору кÑÑмÑйÑ',
-'show-big-image-preview' => '<small>БигÑргÑтиÑÑ… Ð¸Ð½Ð½Ð¸Ð½Ñ ÐºÓ©Ñ€Ò¯Ò¯ улахана: $1.</small>',
-'show-big-image-other' => '<small>Ðтын түмүктÑÑ€: $1.</small>',
+'show-big-image-preview' => 'БигÑргÑтиÑÑ… Ð¸Ð½Ð½Ð¸Ð½Ñ ÐºÓ©Ñ€Ò¯Ò¯ улахана: $1.',
+'show-big-image-other' => 'Ðтын {{PLURAL:$2|түмүк|түмүктÑÑ€}}: $1.',
'show-big-image-size' => '$1 × $2 пиикÑÑл',
'file-info-gif-looped' => 'хатаммыт (бобуллубут)',
'file-info-gif-frames' => '$1 {{PLURAL:$1|фреймнаах|фреймнардаах}}',
@@ -2757,9 +2820,14 @@ $1',
'sp-newimages-showfrom' => 'Баччаттан киирбит Ñаҥа ойуулары көрдөр: $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 'Ñ.',
-'minutes-abbrev' => 'м.',
-'hours-abbrev' => 'ч.',
+'seconds-abbrev' => '$1Ñ.',
+'minutes-abbrev' => '$1м.',
+'hours-abbrev' => '$1ч.',
+'seconds' => '{{PLURAL:$1|$1 ÑөкүүндÑ|$1 ÑөкүүндÑ}}',
+'minutes' => '{{PLURAL:$1|$1 мүнүүтÑ|$1 мүнүүтÑ}}',
+'hours' => '{{PLURAL:$1|$1 чааÑ|$1 чааÑ}}',
+'days' => '{{PLURAL:$1|$1 күн|$1 күн}}',
+'ago' => '$1 ынараа өттүгÑÑ€',
# Bad image list
'bad_image_list' => 'Формаата маннык буолуохтаах:
@@ -3255,13 +3323,6 @@ $5
'scarytranscludefailed' => '[$1 халыыбы туһанар табыллыбата]',
'scarytranscludetoolong' => '[URL наһаа уһун]',
-# Trackbacks
-'trackbackbox' => 'Бу Ñ‹Ñтатыйа Trackback`а:<br />
-$1',
-'trackbackremove' => '([$1 Ñотуу])',
-'trackbacklink' => 'Урукку Ñуола',
-'trackbackdeleteok' => 'trackback Ñотулунна.',
-
# Delete conflict
'deletedwhileediting' => "'''Болҕой''': СирÑйи көннөрө олордоххуна ким ÑÑ€Ñ Ñотон кÑбиÑÑ‚Ñ!",
'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|ырытыыта]]) бу ÑирÑйи Ñн уларыта олордоххуна Ñотон кÑбиÑÑ‚Ñ, Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ:
@@ -3344,6 +3405,9 @@ $1',
'watchlisttools-edit' => 'КÑÑ‚Ñбил иÑпииһÑгин көрүү/уларытыы',
'watchlisttools-raw' => '"СиикÑй" иÑпииһÑги уларытыы',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ырытыы]])',
+
# Core parser functions
'unknown_extension_tag' => 'БиллибÑÑ‚ тиÑг "$1"',
'duplicate-defaultsort' => 'Болҕой: Ðаардааһын «$2» ÐºÒ¯Ð»Ò¯Ò¯Ò»Ñ ÑƒÑ€ÑƒÐºÐºÑƒ «$1» күлүүһү Ñабар (Ключ Ñортировки переопределÑет прежний ключ).',
@@ -3442,13 +3506,16 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
'tags-hitcount' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
# Special:ComparePages
-'comparepages' => 'СирÑйдÑри Ñ‚ÑҥнииргÑ',
-'compare-selector' => 'СирÑйдÑÑ€ барылларын Ñ‚ÑҥнииргÑ',
-'compare-page1' => 'БаÑтакы ÑирÑй',
-'compare-page2' => 'Ð˜ÐºÐºÐ¸Ñ ÑирÑй',
-'compare-rev1' => 'БаÑтакы барыл',
-'compare-rev2' => 'Ð˜ÐºÐºÐ¸Ñ Ð±Ð°Ñ€Ñ‹Ð»',
-'compare-submit' => 'ТÑҥнииргÑ',
+'comparepages' => 'СирÑйдÑри Ñ‚ÑҥнииргÑ',
+'compare-selector' => 'СирÑйдÑÑ€ барылларын Ñ‚ÑҥнииргÑ',
+'compare-page1' => 'БаÑтакы ÑирÑй',
+'compare-page2' => 'Ð˜ÐºÐºÐ¸Ñ ÑирÑй',
+'compare-rev1' => 'БаÑтакы барыл',
+'compare-rev2' => 'Ð˜ÐºÐºÐ¸Ñ Ð±Ð°Ñ€Ñ‹Ð»',
+'compare-submit' => 'ТÑҥнииргÑ',
+'compare-invalid-title' => 'Суруллубут аат туттуллара Ñатаммат.',
+'compare-title-not-exists' => 'Ыйбыт аатыҥ Ñуох Ñбит.',
+'compare-revision-not-exists' => 'Ыйбыт барылыҥ Ñуох Ñбит.',
# Database error messages
'dberr-header' => 'Бу биики туга ÑÑ€Ñ Ñатаммата',
@@ -3475,4 +3542,89 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
'sqlite-has-fts' => '$1 толору тиÑкиÑÑ‚ÑÑÑ… көрдөөһүнү өйүүр',
'sqlite-no-fts' => '$1 толору тиÑкиÑÑ‚ÑÑÑ… көрдөөһүнү өйөөбөт',
+# New logging system
+'logentry-delete-delete' => '$3 ÑирÑйи $1 Ñоппут',
+'logentry-delete-restore' => '$3 ÑирÑйи $1 төннөрбүт',
+'logentry-delete-event' => 'Сурунаал {{PLURAL:$5|Ñуругун|$5 Ñуруктарын}} көÑтүүтүн манна $3: $4 $1 уларыппыт',
+'logentry-delete-revision' => 'Сурунаал {{PLURAL:$5|Ñуругун|$5 Ñуруктарын}} көÑтүүтүн бу ÑирÑÐ¹Ð³Ñ $3: $4 $1 уларыппыт',
+'logentry-delete-event-legacy' => '$3 Ñурунаал Ñуруктарын көÑтүүтүн $1 уларыппыт',
+'logentry-delete-revision-legacy' => '$3 ÑирÑй барылларын көÑтүүтүн $1 уларыппыт',
+'logentry-suppress-delete' => '$3 ÑирÑйи $1 баттаабыт',
+'logentry-suppress-event' => '$1 {{PLURAL:$5|$5 Ñуругу}} манныкка $3: $4 киÑÑ‚ÑÑн уларыппыт',
+'logentry-suppress-event-legacy' => '$1 диÑн кыттааччы $3 Ñурунаал көÑтөрүн уларыппыт (бÑйÑтин киÑÑ‚ÑÑбит)',
+'logentry-suppress-revision-legacy' => '$1 диÑн кыттааччы $3 ÑирÑй барылларын көÑтөрүн уларыппыт (бÑйÑтин киÑÑ‚ÑÑбит)',
+'revdelete-content-hid' => 'иһинÑÑÒ•Ð¸Ñ‚Ñ ÐºÐ¸ÑÑ‚Ñммит',
+'revdelete-summary-hid' => 'көннөрүү туһунан Ñурук киÑÑ‚Ñммит',
+'revdelete-uname-hid' => 'кыттааччы аата киÑÑ‚Ñммит',
+'revdelete-content-unhid' => 'иһинÑÑÒ•Ð¸Ñ‚Ñ Ð°Ñ€Ñ‹Ð»Ñ‹Ð½Ð½Ð°',
+'revdelete-summary-unhid' => 'көннөрүү туһунан Ñурук арыллыбыт',
+'revdelete-uname-unhid' => 'кыттааччы аата көÑÑ‚Ó©Ñ€ буолбут',
+'revdelete-restricted' => 'хааччахтааһын админиÑтраатардарга Ñыһыаннаах',
+'revdelete-unrestricted' => 'хааччахтааһын админÑтраатардартан уһулунна',
+'logentry-move-move' => '$1 $3 ÑирÑй аатын маннык $4 уларыппыт',
+'logentry-move-move-noredirect' => '$1 $3 ÑирÑй аатын маннык $4 уларыппыт, утаарыы-ÑирÑй оҥорботох',
+'logentry-move-move_redir' => '$3 ÑирÑйи $1 диÑн кыттааччы манныкка $4 уларыппыт (утаарыы үрдүнÑн)',
+'logentry-move-move_redir-noredirect' => '$1 $3 ÑирÑй аатын утаарыы үрдүнÑн маннык $4 уларыппыт, утаарыы-ÑирÑй оҥорботох',
+'logentry-patrol-patrol' => '$1 $3 ÑирÑй $4 барылын ботуруулламмыт курдук бÑлиÑÑ‚ÑÑбит',
+'logentry-patrol-patrol-auto' => '$1 $3 ÑирÑй $4 барылын аптамаатынан ботуруулламмыт курдук бÑлиÑÑ‚ÑÑбит',
+'logentry-newusers-newusers' => '$1 кыттааччыны бÑлиÑÑ‚ÑÑбит',
+'logentry-newusers-create' => '$1 кыттааччыны бÑлиÑÑ‚ÑÑбит',
+'logentry-newusers-create2' => '$3 кыттааччыны $1 бÑлиÑÑ‚ÑÑбит',
+'logentry-newusers-autocreate' => 'Маннык аат $1 аптамаатынан бÑлиÑÑ‚ÑнилиннÑ',
+'newuserlog-byemail' => 'киирии тыл Ñл. почтаннан ыытылынна',
+
+# Feedback
+'feedback-bugornote' => 'Туох кыһалҕаны көрÑүбүккүн Ñиһилии Ñуруйар кыахтаах буоллаххына, бука диÑн [$1 Ð°Ð»Ò•Ð°Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ биллÑÑ€].
+Ол Ñатаммат буоллаҕына бу Ñудургу форманы толор. Эн Ñтииҥ ааккын уонна туһанар браузерыҥ аатын кытта манна «[$3 $2]» бÑчÑÑÑ‚Ñ‚ÑниÑ.',
+'feedback-subject' => 'ТиÑмÑ:',
+'feedback-message' => 'Сурук:',
+'feedback-cancel' => 'Салҕаама',
+'feedback-submit' => 'Санаа ÑтиитÑ',
+'feedback-adding' => 'СирÑй туһунан Ñанаа Ñтии...',
+'feedback-error1' => 'ÐлҕаÑ: API биллибÑÑ‚ түмүгÑ',
+'feedback-error2' => 'ÐлҕаÑ: Көннөрүү Ñатаммата',
+'feedback-error3' => 'ÐлҕаÑ: API хоруйдаабата',
+'feedback-thanks' => 'Махтал! Эн Ñанааҥ бу ÑирÑÐ¹Ð³Ñ "[$2 $1]" Ñурулунна.',
+'feedback-close' => 'Сатанна',
+'feedback-bugcheck' => 'БÑрт! Ол гынан баран [$1 биллÑÑ€ алҕаÑтарын] тиһилигÑÑ€ майгынныыр Ñурук Ñуоҕун тургут.',
+'feedback-bugnew' => 'Мин тургуттум. Ðтын Ð°Ð»Ò•Ð°Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½',
+
+# API errors
+'api-error-badaccess-groups' => 'Эн бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð±Ð¸Ð»Ñ ÐºÐ¸Ð»Ð»ÑÑ€Ñриҥ хааччахтаммыт.',
+'api-error-badtoken' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: ОмÑолоох токен.',
+'api-error-copyuploaddisabled' => 'URL көмөтүнÑн киллÑрии бу ÑиÑрбÑÑ€Ð³Ñ Ð°Ñ€Ð°Ð°Ñ€Ñ‹Ð»Ð»Ñ‹Ð±Ñ‹Ñ‚.',
+'api-error-duplicate' => 'Маннык иһинÑÑҕилÑÑÑ… {{PLURAL:$1|[$2 атын билÑ] баар Ñбит}}',
+'api-error-duplicate-archive' => 'Урут Ñитим-ÑÐ¸Ñ€Ð³Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº иһинÑÑҕилÑÑÑ… {{PLURAL:$1|[$2 билÑ] баар |[$2 билÑлÑÑ€] бааллар}} ÑÑ‚Ñ, ол гынан баран {{PLURAL:$1|Ñотуллубута|Ñотуллубуттара}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|БилÑ|БилÑлÑÑ€}} Ñотуллубут дубликааттара',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|БилÑ|БилÑлÑÑ€}} дубликааттара.',
+'api-error-empty-file' => 'Ыыппыт билÑÒ¥ кураанах.',
+'api-error-emptypage' => 'Саҥа кураанах ÑирÑйи оҥорор табыллыбат.',
+'api-error-fetchfileerror' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: билÑни ыларга туох ÑÑ€Ñ Ñатаммата.',
+'api-error-file-too-large' => 'Ыыппыт билÑÒ¥ наһаа улахан Ñбит.',
+'api-error-filename-tooshort' => 'БилÑÒ¥ аата наһаа кылгаÑ.',
+'api-error-filetype-banned' => 'Маннык көрүҥнÑÑÑ… билÑлÑÑ€ бобуулаахтар.',
+'api-error-filetype-missing' => 'Бу Ð±Ð¸Ð»Ñ Ñ‚ÑÐ½Ð¸Ñ‚Ð¸Ð¸Ñ‚Ñ (раÑширение) Ñуох Ñбит.',
+'api-error-hookaborted' => 'Эн киллÑрбит уларытыыгын кÑÒ¥Ñтии таҥаÑтааччыта оннугар төннөрбүт.',
+'api-error-http' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: СиÑрбÑÑ€Ð³Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð½Ð¾Ñ€ табыллыбата.',
+'api-error-illegal-filename' => 'Ð‘Ð¸Ð»Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº ааттанара Ñатаммат.',
+'api-error-internal-error' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÑƒÐ³Ð°Ð°Ñ€Ñ‹ гыммыккар туох ÑÑ€Ñ Ñатаммата.',
+'api-error-invalid-file-key' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: БыÑтах уурар ÑÐ¸Ñ€Ð³Ñ Ð±Ð¸Ð»Ñ ÐºÓ©ÑтүбÑÑ‚Ñ.',
+'api-error-missingparam' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: Көрдөбүл туруоруулара Ñуохтар Ñбит.',
+'api-error-missingresult' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: Хатылааһын Ñатаммыта-Ñатамматаҕа биллибÑÑ‚Ñ.',
+'api-error-mustbeloggedin' => 'БилÑни киллÑÑ€ÑÑ€Ð³Ñ Ð±Ð°Ñтаан ааккын ÑтиÑÑ…Ñ‚ÑÑххин.',
+'api-error-mustbeposted' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: HTTP POST алҕаÑтаах.',
+'api-error-noimageinfo' => 'Хачайдааһын Ñөпкө түмүктÑÐ½Ð½Ñ ÑÑ€ÑÑри, ÑиÑрбÑÑ€ Ð±Ð¸Ð»Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ тугу да биллÑрбÑÑ‚Ñ.',
+'api-error-nomodule' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: хачайдыыр муодул туруоруута Ñуох.',
+'api-error-ok-but-empty' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: ÑиÑрбÑртÑн хоруй кÑлбÑÑ‚Ñ.',
+'api-error-overwrite' => 'Баар билÑни уларытар Ñатаммат.',
+'api-error-stashfailed' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: ÑиÑрбÑÑ€ быÑтах кÑÐ¼Ò¥Ñ Ð¾Ò¥Ð¾Ò»ÑƒÐ»Ð»ÑƒÐ±ÑƒÑ‚ билÑни кыайан бигÑргÑппÑÑ‚ÑÑ….',
+'api-error-timeout' => 'СиÑрбÑÑ€ кÑÑ‚ÑÒ»ÑÑ€ кÑÐ¼Ò¥Ñ Ñ…Ð¾Ñ€ÑƒÐ¹Ð´Ð°Ð°Ð±Ð°Ñ‚Ð°.',
+'api-error-unclassified' => 'БиллибÑÑ‚ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта',
+'api-error-unknown-code' => 'БиллибÑÑ‚ алҕаÑ: «$1»',
+'api-error-unknown-error' => 'Ð˜Ñ Ð°Ð»Ò•Ð°Ñ: билÑни киллÑрии кÑмигÑÑ€ туох ÑÑ€Ñ Ñатаммата.',
+'api-error-unknown-warning' => 'БиллибÑÑ‚ ÑÑÑ€Ñтии: $1',
+'api-error-unknownerror' => 'БиллибÑÑ‚ алҕаÑ: $1',
+'api-error-uploaddisabled' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ñ…Ð°Ñ‡Ð°Ð¹Ð´Ñ‹Ñ‹Ñ€ араарыллыбыт Ñбит.',
+'api-error-verification-error' => 'Бу Ð±Ð¸Ð»Ñ Ð°Ð»Ð´ÑŒÐ°Ð¼Ð¼Ñ‹Ñ‚ ÑбÑÑ‚ÑÑ€ табыгаһа Ñуох кÑÒ¥ÑтиилÑÑÑ….',
+
);
diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php
index 0a98af96..1687ab13 100644
--- a/languages/messages/MessagesSc.php
+++ b/languages/messages/MessagesSc.php
@@ -381,7 +381,6 @@ Podet èsser stadu burradu dae calicunu àteru.',
'badtitle' => 'Tìtulu malu',
'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',
-'viewsourcefor' => 'pro $1',
'actionthrottled' => 'Atzione rimandada',
'sqlhidden' => '(Consulta SQL cuada)',
'namespaceprotected' => "Non tenes su permissu de acontzare is pàginas in su nùmene-lugu '''$1'''.",
@@ -519,7 +518,6 @@ Nota ca sa funtzione 'Ispedi un'e-mail a custu usuàriu' no est ativa ki no est
S'indiritzu IP atuale est $3, su nùmeru ID de su bloccu est #$5.
Pro praxere spetzìfica totu is particulares in antis in carche siat pregunta de acrarimentu.",
'blockednoreason' => 'perunu motivu indicadu',
-'whitelistedittitle' => "Esigit s'identificatzione pro acontzare is pàginas",
'loginreqtitle' => 'Identificatzione rekesta',
'loginreqlink' => 'identifica·ti',
'loginreqpagetext' => 'Depes èsser $1 pro bìer àteras pàginas.',
@@ -607,13 +605,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
'revdel-restore-visible' => 'revisiones visìbiles',
'pagehist' => 'Istòria de sa pàgina',
'deletedhist' => 'Istòria fuliada',
-'revdelete-content' => 'cuntènnidu',
-'revdelete-summary' => "ogetu de s'acontzu",
-'revdelete-uname' => 'nùmene usuàriu',
-'revdelete-hid' => 'cua $1',
-'revdelete-unhid' => 'ammustra $1',
-'revdelete-log-message' => '$1 pro $2 {{PLURAL:$2|revisione|revisiones}}',
-'logdelete-log-message' => '$1 pro $2 {{PLURAL:$2|eventu|eventos}}',
'revdelete-reasonotherlist' => 'Àteru motivu',
# History merging
@@ -834,15 +825,14 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
'rc-enhanced-hide' => 'Cua particulares',
# Recent changes linked
-'recentchangeslinked' => 'Mudàntzias ligadas',
-'recentchangeslinked-feed' => 'Mudàntzias ligadas',
-'recentchangeslinked-toolbox' => 'Mudàntzias ligadas',
-'recentchangeslinked-title' => 'Mudàntzias ligadas a "$1"',
-'recentchangeslinked-backlink' => '↠$1',
-'recentchangeslinked-summary' => "Custa est una lista de is mudàntzias fatas dae pagu a is pàginas ligadas a cussa spetzificada.
+'recentchangeslinked' => 'Mudàntzias ligadas',
+'recentchangeslinked-feed' => 'Mudàntzias ligadas',
+'recentchangeslinked-toolbox' => 'Mudàntzias ligadas',
+'recentchangeslinked-title' => 'Mudàntzias ligadas a "$1"',
+'recentchangeslinked-summary' => "Custa est una lista de is mudàntzias fatas dae pagu a is pàginas ligadas a cussa spetzificada.
Is pàginas de sa [[Special:Watchlist|watchlist tua]] sunt in '''grassu'''.",
-'recentchangeslinked-page' => 'Nùmene pàgina:',
-'recentchangeslinked-to' => 'Ammustra feti mudàntzias a pàginas ligadas a cussa spetzificada',
+'recentchangeslinked-page' => 'Nùmene pàgina:',
+'recentchangeslinked-to' => 'Ammustra feti mudàntzias a pàginas ligadas a cussa spetzificada',
# Upload
'upload' => 'Càrriga file',
@@ -919,12 +909,10 @@ Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus b
'shared-repo-from' => 'dae $1',
# File reversion
-'filerevert-backlink' => '↠$1',
-'filerevert-comment' => 'Motivu:',
+'filerevert-comment' => 'Motivu:',
# File deletion
'filedelete' => 'Cantzella $1',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'Cantzella su file',
'filedelete-submit' => 'Cantzella',
'filedelete-success' => "Su file '''$1''' est istadu fuliau.",
@@ -1032,9 +1020,7 @@ Dia podent essere immàgines impreadas dae àteros giassos cun unu ligàmine dir
'activeusers-hidesysops' => 'Cua amministradores',
# Special:Log/newusers
-'newuserlogpage' => 'Usuàrios nous',
-'newuserlog-byemail' => 'password imbiada via e-mail',
-'newuserlog-create-entry' => 'Account usuàriu nou',
+'newuserlogpage' => 'Usuàrios nous',
# Special:ListGroupRights
'listgrouprights-group' => 'Grupu',
@@ -1096,7 +1082,6 @@ Is mudàntzias de custa pàgina e de sa pàgina de cuntierras sua ant a bennere
'excontentauthor' => "su cuntènnidu fiat: '$1' (e s'ùnicu contribudori fiat '[[Special:Contributions/$2|$2]]')",
'exblank' => 'sa pàgina fiat bùida',
'delete-confirm' => 'Fùlia "$1"',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Fuliare',
'confirmdeletetext' => "Ses acanta de burrare una pàgina cun totu su stòria sua.
Pro praxere, cunfirma ca est intentzione tua fàgher custu, ca connosches is cosseguèntzias de s'atzione tua, a ca custa est cunforma a is [[{{MediaWiki:Policy-url}}|lìnias polìticas]].",
@@ -1104,7 +1089,6 @@ Pro praxere, cunfirma ca est intentzione tua fàgher custu, ca connosches is cos
'actionfailed' => 'Atzione faddida',
'deletedtext' => 'Sa pàgina "$1" est istada fuliada.
Càstia su log $2 pro unu registru de is ùrtimas fuliaduras.',
-'deletedarticle' => 'at fuliadu "[[$1]]"',
'dellogpage' => 'Burraduras',
'dellogpagetext' => 'A sighire una lista de is prus reghentes burraduras.',
'reverted' => 'Torrada a sa versione in antis',
@@ -1124,7 +1108,6 @@ s'ùrtimu contribuidore est s'ùnicu autore de custa pàgina.",
'protectlogpage' => 'Amparaduras',
'protectedarticle' => 'at amparau "[[$1]]"',
'modifiedarticleprotection' => 'at cambiau su livellu de amparadura pro "[[$1]]"',
-'protect-backlink' => '↠$1',
'protectcomment' => 'Motivu:',
'protectexpiry' => 'Iscadèntzia:',
'protect_expiry_invalid' => "S'iscadèntzia est imbàlida.",
@@ -1172,7 +1155,6 @@ Chi est istada creada una pàgina cun su matessi tìtulu, is revisiones recupera
'undeleteviewlink' => 'abbista',
'undeleteinvert' => 'Fùrria sa seletzione',
'undeletecomment' => 'Motivu:',
-'undeletedarticle' => 'at restauradu "$1"',
'undeletedrevisions' => '{{PLURAL:$1|1 revisione restaurada|$1 revisiones restauradas}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisione|$1 revisiones}} e {{PLURAL:$2|1 file|$2 files}} restaurados',
'undeletedfiles' => '{{PLURAL:$1|1 file restauradu|$1 files restaurados}}',
@@ -1207,7 +1189,6 @@ Chi est istada creada una pàgina cun su matessi tìtulu, is revisiones recupera
'whatlinkshere' => 'Pàginas chi ligant a custa',
'whatlinkshere-title' => 'Pàginas chi ligant a "$1"',
'whatlinkshere-page' => 'Pàgina:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Sas pàginas chi sighint ligant a '''[[:$1]]''':",
'nolinkshere' => "Peruna pàgina ligat a '''[[:$1]]'''.",
'nolinkshere-ns' => "Peruna pàgina ligat a '''[[:$1]]''' in su nùmene-logu seberadu.",
@@ -1314,8 +1295,6 @@ Pro praxere sèbera un'àteru nùmene.",
'talkexists' => "'''Su movimentu de sa pàgina est andadu bene, ma no est stadu possìbile mòver sa pàgina de cuntierras pro ite nde esistit giai un'àtera cun su matessi tìtulu. Pro praxere giunghe tue su cuntestu de sa pàgina betza.'''",
'movedto' => 'mòvida a',
'movetalk' => 'Move sa pàgina de cuntierra galu',
-'1movedto2' => 'at mòvidu [[$1]] a [[$2]]',
-'1movedto2_redir' => 'at mòvidu [[$1]] a [[$2]] subra redirect',
'movelogpage' => 'Moviduras',
'movereason' => 'Motivu:',
'revertmove' => 'fùrria',
@@ -1418,7 +1397,7 @@ Podes agiùnger unu motivu in s\'ogetu de s\'acontzu.',
# Media information
'file-info-size' => '$1 × $2 pixels, mannesa de su file: $3, tipu de MIME: $4',
-'file-nohires' => '<small>Non si tenent risolutziones prus artas.</small>',
+'file-nohires' => 'Non si tenent risolutziones prus artas.',
'svg-long-desc' => 'file in formadu SVG, mannesa nominale $1 × $2 pixel, mannesa de su file: $3',
'show-big-image' => 'Versione a risolutzione arta',
@@ -1429,9 +1408,9 @@ Podes agiùnger unu motivu in s\'ogetu de s\'acontzu.',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 's',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'h',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
# Bad image list
'bad_image_list' => 'Su formau est su chi sighit:
@@ -1580,4 +1559,7 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
# HTML forms
'htmlform-selectorother-other' => 'Àteru',
+# New logging system
+'newuserlog-byemail' => 'password imbiada via e-mail',
+
);
diff --git a/languages/messages/MessagesScn.php b/languages/messages/MessagesScn.php
index d2634ea9..a1b6640f 100644
--- a/languages/messages/MessagesScn.php
+++ b/languages/messages/MessagesScn.php
@@ -487,16 +487,17 @@ V\'arringrazziamu si signaliati zoccu succidìu a nu [[Special:ListUsers/sysop|a
'formerror' => 'Erruri: mpussìbbili mannari lu mòdulu',
'badarticleerror' => 'Opirazzioni nun cunzintita pi sta pàggina.',
'cannotdelete' => 'Mpussìbbili cancillari la pàggina o lu file "$1" addumannatu. Putissi siri già cancillatu di quarcun\'àutru.',
+'cannotdelete-title' => 'Mpussibbili eliminari la pàggina "$1"',
'badtitle' => 'Tìtulu nun currettu',
'badtitletext' => "Lu tìtulu dâ pàggina addumannata è vacanti, erratu o cu caràttiri nun ammessi oppuru diriva di n'erruri ntê culligamenti tra siti wiki diversi o virsioni n lingui diversi dû stissu situ.",
-'perfcached' => "'''Nota:''' li dati ca sèquinu sunnu stratti di na copia ''cache'' dû database, nun aggiurnati n tempu riali.",
-'perfcachedts' => 'Li dati ccà sutta foru attruvati e sunnu aggiurnati ô $1.',
+'perfcached' => "'''Nota:''' li dati ca sèquinu sunnu stratti di na copia ''cache'' dû database, nun aggiurnati n tempu riali. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => 'Li dati ccà sutta foru attruvati e sunnu aggiurnati ô $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "L'aggiurnamenti dâ pàggina sunnu timpuraniamenti suspisi. Li dati 'n chidda cuntinuti nun vèninu aggiurnati.",
'wrong_wfQuery_params' => 'Paràmitri errati pi wfQuery()<br />
Funzioni: $1<br />
Query: $2',
'viewsource' => 'Talìa la fonti',
-'viewsourcefor' => 'di $1',
+'viewsource-title' => 'Visualizza la surgenti di $1',
'actionthrottled' => 'Azzioni ritardata',
'actionthrottledtext' => "Comu misura di sicurezza contru lu spam, l'esecuzioni di alcuni azzionu è limitata a nu nùmmuru massimu di voti ni nu determinatu piriudu du tempu, limiti ca ni stu casu fu supiratu. Si prega di ripruvari tra qualchi minutu.",
'protectedpagetext' => 'Sta pàggina fu bluccata pi privèniri li canciamenti.',
@@ -683,9 +684,6 @@ Nun poi usari la carattirìstica 'manna n'email a st'utenti' siddu nun è spicif
Lu tò nnirizzu IP attuali è $3, e l'ID dû bloccu è $5.
Pi favuri nclùdilu nta tutti li dumanni chi fai.",
'blockednoreason' => 'nudda motivazioni ndicata',
-'blockedoriginalsource' => "Di sèquitu veni ammustratu lu còdici surgenti dâ pàggina '''$1''':",
-'blockededitsource' => "Di sèquitu vèninu ammustrati li '''canciamenti appurtati''' â pàggina '''$1''':",
-'whitelistedittitle' => 'Ci voli èssiri riggistrati pi putiri canciari la pàggina.',
'whitelistedittext' => "Hai a $1 pi canciari l'artìculi.",
'confirmedittext' => "P'èssiri abbilitati a lu canciamentu dî pàggini è nicissariu cunfirmari lu propiu ndirizzu e-mail. Pi mpustari e cunfirmari lu ndirizzu sirvìrisi dî [[Special:Preferences|prifirenzi]].",
'nosuchsectiontitle' => 'Lu paràgrafu nun fu truvatu',
@@ -888,8 +886,6 @@ L'àutri amministratura dû situ ponnu accèdiri comu è gghiè a li cuntinuti a
'revdelete-unsuppress' => 'Elìmina le limitazzioni su li rivisioni ripristinati',
'revdelete-log' => 'Mutivu:',
'revdelete-submit' => 'Àpplica â rivisioni silizziunata',
-'revdelete-logentry' => 'hà canciatu la visibbilitati pi na rivisioni di [[$1]]',
-'logdelete-logentry' => "hà canciatu la visibbilitati de l'eventu [[$1]]",
'revdelete-success' => "'''Visibbilitati dâ rivisioni mpustata currittamenti.'''",
'revdelete-failure' => "'''A visibilità dâ rivisioni nu pò essiri impustata:'''
$1",
@@ -899,15 +895,6 @@ $1",
'revdel-restore' => 'Cancia la visibbilità',
'pagehist' => 'Storia dâ pàggina',
'deletedhist' => 'Storia cancillata',
-'revdelete-content' => 'cuntinutu',
-'revdelete-summary' => 'riassuntu dô canciamentu',
-'revdelete-uname' => 'nnomu utenti',
-'revdelete-restricted' => 'ristrizzioni ai suli amministratura attivate',
-'revdelete-unrestricted' => 'ristrizzioni pi suli amministraturi rimossi',
-'revdelete-hid' => 'ammuccia $1',
-'revdelete-unhid' => 'renni visibbili $1',
-'revdelete-log-message' => '$1 pi $2 {{PLURAL:$2|rivisione|rivisioni}}',
-'logdelete-log-message' => '$1 pi $2 {{PLURAL:$2|eventu|eventi}}',
'revdelete-hide-current' => "Impussibili ammucciari l'oggettu cu la data $1 $2 in quantu è la rivisoni currenti.",
'revdelete-show-no-access' => 'Impussibili ammustrari l\'oggettu cu data $1 $2 in quantu fu identificatu comu "riservatu" e nun si disponi di lu rilativu accessu.',
'revdelete-modify-no-access' => 'Impussibili canciari l\'oggettu cu data $1 $2 in quantu fu identificatu comu "riservatu" e nun si disponi di lu rilativu accessu.',
@@ -1049,7 +1036,7 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'prefs-rc' => 'Ùrtimi canciamenti',
'prefs-watchlist' => 'Ossirvati spiciali',
'prefs-watchlist-days' => "Nùmmiru di jorna ammustrati nta l'ossirvati spiciali:",
-'prefs-watchlist-days-max' => 'Non cchiossai di 7 jorna',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Nùmmaru di canciamenti a ammustrari cu li funzioni avanzati:',
'prefs-watchlist-edits-max' => '(nùmmaru màssimu: 1000)',
'prefs-watchlist-token' => 'Token lista taliata mia',
@@ -1233,7 +1220,6 @@ L'operazioni nun pò èssiri annullata.",
'right-autopatrol' => 'Marca autumaticamenti li sò canci comu virificati',
'right-patrolmarks' => "Usa la funzioni di virifica di l'ùrtimi canci",
'right-unwatchedpages' => 'Visualizza na lista di pàggini nun taliati',
-'right-trackback' => 'Manna nu trackback',
'right-mergehistory' => 'Funni la crunuluggìa dî pàggini',
'right-userrights' => "Cancia tutti li diritta di l'utilizzaturi",
'right-userrights-interwiki' => "Cancia li diritti di l'utilizzatura di àutri wiki",
@@ -1276,7 +1262,6 @@ L'operazioni nun pò èssiri annullata.",
'action-patrol' => "marcari li canci li l'àutri utilizzatura comu virificati",
'action-autopatrol' => 'marcari li tò canci comu virificati',
'action-unwatchedpages' => 'visiunari la lista dî pàggini nun taliati',
-'action-trackback' => 'mannari na trackback',
'action-mergehistory' => 'jùnciri la crunuluggìa di sta pàggina',
'action-userrights' => "canciari tutti li diritti di l'utilizzaturi",
'action-userrights-interwiki' => "cancia li diritti di l'utenti supra a àutri wiki",
@@ -1725,12 +1710,8 @@ Protucolli suppurtati: <tt>$1</tt>',
'activeusers-noresult' => 'Nussun utenti truvatu.',
# Special:Log/newusers
-'newuserlogpage' => 'Novi utenti',
-'newuserlogpagetext' => 'Di sècutu vènunu elincati li criazzioni di cunti novi (account).',
-'newuserlog-byemail' => 'password mannata via mail',
-'newuserlog-create-entry' => "s'arriggistrau ora",
-'newuserlog-create2-entry' => 'arriggistrau lu novu nomu utenti $1',
-'newuserlog-autocreate-entry' => 'account criatu automaticamenti',
+'newuserlogpage' => 'Novi utenti',
+'newuserlogpagetext' => 'Di sècutu vènunu elincati li criazzioni di cunti novi (account).',
# Special:ListGroupRights
'listgrouprights' => 'Diritti dô gruppu utenti',
@@ -1853,8 +1834,6 @@ Pi dari lu tò feedback e arricèviri ultiriuri assistenza:
'actionfailed' => 'Azioni fallita',
'deletedtext' => '"$1" ha statu cancillatu.
Talìa $2 pi na lista di cancillazzioni ricenti.',
-'deletedarticle' => 'Hà cancillatu "[[$1]]"',
-'suppressedarticle' => 'suppressu "[[$1]]"',
'dellogpage' => 'Cancillazzioni',
'dellogpagetext' => 'Di sèquitu sunnu alincati li pàggini cancillati di ricenti.',
'deletionlog' => 'Log dî cancillazzioni',
@@ -1968,7 +1947,6 @@ Li mpostazzioni correnti pâ pàggina sugnu '''$1''':",
'undeletereset' => 'Rimposta',
'undeleteinvert' => 'Scancia la silizzioni',
'undeletecomment' => 'Cummentu:',
-'undeletedarticle' => 'hà ricupiratu "[[$1]]"',
'undeletedrevisions' => '$1 rivisioni ricupirat{{PLURAL:$1|a|i}}',
'undeletedrevisions-files' => '{{PLURAL:$1|na rivisioni|$1 rivisioni}} e {{PLURAL:$2|nu file ricupiratu|$2 file ricupirati}}',
'undeletedfiles' => '{{PLURAL:$1|un file ricupiratu|$1 file ricupirati}}',
@@ -2184,9 +2162,6 @@ Nta sti casi, tu hai a spustari o agghiùnciri manuarmenti la pàggina di discus
'movepage-page-moved' => 'La pàggina $1 fu spustata a $2.',
'movepage-page-unmoved' => 'La pàggina $1 nun pò èssiri spustata a $2.',
'movepage-max-pages' => 'Vinni spustatu lu nùmmuru màssimu di $1 {{PLURAL:$1|pàggina|pàggini}} e non si ponnu cchiù spustari àutri pàggini autumàticamenti.',
-'1movedto2' => '[[$1]] spustatu a [[$2]]',
-'1movedto2_redir' => '[[$1]] spustatu a [[$2]] supra rinnirizzamentu',
-'move-redirect-suppressed' => 'riinnirizzamentu scancillatu',
'movelogpage' => 'Spustamenti',
'movelogpagetext' => "Chistu è l'alencu dî pàggini spustati.",
'movesubpage' => '{{PLURAL:$1|Suttapàggina|Suttapàggini}}',
@@ -2422,9 +2397,6 @@ Visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
# Patrol log
'patrol-log-page' => 'Canciamenti virificati',
'patrol-log-header' => 'Ccassutta sunnu elencati li virìfichi dî canci.',
-'patrol-log-line' => 'hà signatu la $1 di $2 comu virificata $3',
-'patrol-log-auto' => '(virìfica automàtica)',
-'patrol-log-diff' => 'virsioni $1',
'log-show-hide-patrol' => '$1 log di li canciamenti virificati',
# Image deletion
@@ -2449,7 +2421,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pàggina|pàggini}}',
'file-info' => 'Diminzioni: $1, tipu MIME: $2',
'file-info-size' => '$1 × $2 pixel, diminzioni: $3, tipu MIME: $4',
-'file-nohires' => '<small>Nun sunnu dispunìbbili virsioni a risuluzzioni cchiù elivata.</small>',
+'file-nohires' => 'Nun sunnu dispunìbbili virsioni a risuluzzioni cchiù elivata.',
'svg-long-desc' => 'file SVG, dimensioni nominali $1 × $2 pixel, dimensioni dô file: $3',
'show-big-image' => 'Virsioni a àuta risuluzzioni',
'file-info-gif-looped' => 'luppatu',
@@ -2804,13 +2776,6 @@ Stu còdici di cunferma scadi automaticamenti a li $4.',
'scarytranscludefailed' => '[Erruri: Mpussìbbili uttèniri lu template $1]',
'scarytranscludetoolong' => '[URL troppu longu]',
-# Trackbacks
-'trackbackbox' => 'Trackback pi sta pàggina:<br />
-$1',
-'trackbackremove' => '([$1 Elìmina])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Nfurmazzioni di trackback eliminati currettamenti.',
-
# Delete conflict
'deletedwhileediting' => "'''Accura''': Sta pàggina vinni scancillata doppu c'hai accuminzatu a scanciàrila!",
'confirmrecreate' => "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) scancillau sta pàggina doppu ca hai accuminciatu a scanciàrila, pi stu mutivu: ''$2'' Pi favuri, cunferma ca addisìi pi daveru criari n'àutra vota sta pàggina.",
@@ -2990,4 +2955,9 @@ Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
'htmlform-reset' => 'Annulla canciamenti',
'htmlform-selectorother-other' => 'Autri',
+# New logging system
+'revdelete-restricted' => 'ristrizzioni ai suli amministratura attivate',
+'revdelete-unrestricted' => 'ristrizzioni pi suli amministraturi rimossi',
+'newuserlog-byemail' => 'password mannata via mail',
+
);
diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php
index 9077b9ba..863e117f 100644
--- a/languages/messages/MessagesSco.php
+++ b/languages/messages/MessagesSco.php
@@ -345,14 +345,13 @@ Please lat an [[Special:ListUsers/sysop|administrator]] ken aboot this, makin no
'cannotdelete' => "Cuidna delete the page or eimage specifee'd. (It micht hae aareadies been delete bi some ither bodie.)",
'badtitle' => 'Bad teitle',
'badtitletext' => 'The requestit page teitle wis invalid, tuim, or a wranglie airtit inter-leid or inter-wiki teitle. It mibbe haes ane or mair chairacters that canna be uised in teitles.',
-'perfcached' => 'The follaeing data is cached an michtna be richt up tae date:',
-'perfcachedts' => 'The followin data is cached, an wis hindermaist chynged $1.',
+'perfcached' => 'The follaeing data is cached an michtna be richt up tae date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'The followin data is cached, an wis hindermaist chynged $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Updates for this page ar disablit at the meenit. Data here wilnae be refreshit at the meenit.',
'wrong_wfQuery_params' => 'Wrang parameters tae wfQuery()<br />
Exerce: $1<br />
Aks: $2',
'viewsource' => 'View soorce',
-'viewsourcefor' => 'for $1',
'actionthrottled' => 'Action devalit',
'actionthrottledtext' => 'As an anti-spam meisur, ye ar limitit frae daein this action ower mony times in a ower short tid, an ye hae exceedit this limit. Please try again in a wee.',
'protectedpagetext' => "Sairy, this page haes been '''lockit''' tae hinder vandalism.",
@@ -528,9 +527,6 @@ registerit in yer [[Special:Preferences|uiser preferences]] an ye hinna been blo
Yer block ID is $5. Please include this ID in ony argies ye mak.',
'blockednoreason' => 'nae grunds put',
-'blockedoriginalsource' => "The soorce o '''$1''' is shawn ablo:",
-'blockededitsource' => "The text o '''your edits''' tae '''$1''' is shawn ablo:",
-'whitelistedittitle' => 'Login needit tae edit',
'whitelistedittext' => 'Ye hae tae $1 tae edit pages.',
'confirmedittext' => 'Ye maun confirm yer e-mail address afore editin pages. Please set an validate yer e-mail address throu yer [[Special:Preferences|uiser settins]].',
'nosuchsectiontitle' => 'There isnae a section wi that teetle',
@@ -681,15 +677,10 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
'revdelete-nooldid-title' => 'Nae target revision',
'revdelete-radio-set' => 'Yea',
'revdelete-radio-unset' => 'Nae',
-'revdelete-logentry' => 'changed revision visibility of "[[$1]]"',
'revdel-restore' => 'change visibility',
'revdel-restore-deleted' => 'deletit revisions',
'revdel-restore-visible' => 'visible revisions',
'pagehist' => 'Page history',
-'revdelete-content' => 'content',
-'revdelete-uname' => 'uisername',
-'revdelete-hid' => 'hod $1',
-'revdelete-log-message' => '$1 for $2 {{PLURAL:$2|revision|revisions}}',
# History merging
'mergehistory-from' => 'Soorce page:',
@@ -1071,8 +1062,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-blocked' => '(blockit)',
# Special:Log/newusers
-'newuserlogpage' => 'Uiser creation log',
-'newuserlog-create-entry' => 'New uiser accoont',
+'newuserlogpage' => 'Uiser creation log',
# Special:ListGroupRights
'listgrouprights-members' => '(leet o members)',
@@ -1131,7 +1121,6 @@ an that ye'r daein this in accord wi [[{{MediaWiki:Policy-url}}]].",
'actioncomplete' => 'Action duin',
'actionfailed' => 'Action failed',
'deletedtext' => '"$1" haes been delete. See $2 for a record o recent deletions.',
-'deletedarticle' => 'deletit "[[$1]]"',
'dellogpage' => 'Deletion log',
'dellogpagetext' => 'Ablo is a leet o the maist recent deletions.',
'deletionlog' => 'deletion log',
@@ -1306,8 +1295,6 @@ please be siccar ye unnerstaun the consequences o this afore proceedin.",
'talkexists' => 'The page itsel wis flittit fine, but the collogue page cuidna be flittit sith ane aareadies exists at the new teitle. Please merge thaim manually.',
'movedto' => 'flittit ti',
'movetalk' => 'Flit "collogue" page an aa, gin it\'s applicable.',
-'1movedto2' => '[[$1]] flittit til [[$2]]',
-'1movedto2_redir' => '[[$1]] flittit til [[$2]] ower reguidal',
'movelogpage' => 'Flit log',
'movelogpagetext' => "A leet o pages that's flitted is ablo.",
'movereason' => 'Raeson:',
@@ -1427,10 +1414,6 @@ You ken view its source',
'markedaspatrolledtext' => 'The selectit reveision haes been merkit as patrolled.',
'rcpatroldisabledtext' => 'The Recent Changes Patrol feature is disabled the nou.',
-# Patrol log
-'patrol-log-line' => 'marked $1 of $2 patrolled $3',
-'patrol-log-diff' => 'revision $1',
-
# Image deletion
'deletedrevision' => 'Deletit auld revision $1.',
@@ -1442,7 +1425,7 @@ You ken view its source',
'mediawarning' => "'''Warnin''': This file micht haud mislushious code; bi executin it yer seestem micht be compromised.",
'imagemaxsize' => 'Limit eimages on eimage description pages tae:',
'file-info-size' => '$1 × $2 pixels, file size: $3, MIME type: $4',
-'file-nohires' => '<small>Na higher resolution available.</small>',
+'file-nohires' => 'Na higher resolution available.',
'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
'show-big-image' => 'Full resolution',
diff --git a/languages/messages/MessagesSd.php b/languages/messages/MessagesSd.php
index 07b1039b..960887d3 100644
--- a/languages/messages/MessagesSd.php
+++ b/languages/messages/MessagesSd.php
@@ -104,55 +104,55 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#چوريو', '#REDIRECT' ),
- 'localmonth' => array( '1', 'مقاميمهينو', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'مقاميمهينونالو', 'LOCALMONTHNAME' ),
- 'localday' => array( '1', 'مقاميÚينهن', 'LOCALDAY' ),
- 'localday2' => array( '1', 'مقاميÚينهن2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'مقاميÚينهننالو', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'مقاميسال', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'مقاميوقت', 'LOCALTIME' ),
- 'localhour' => array( '1', 'مقاميڪلاڪ', 'LOCALHOUR' ),
- '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' ),
- 'talkspace' => array( '1', 'بحثپولار', 'TALKSPACE' ),
- 'subjectspace' => array( '1', 'مضمونپولار', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'fullpagename' => array( '1', 'صحÙيجوپورونالو', 'FULLPAGENAME' ),
- 'msg' => array( '0', 'نياپو:', 'MSG:' ),
- 'img_right' => array( '1', 'ساڄو', 'right' ),
- 'img_left' => array( '1', 'کاٻو', 'left' ),
- 'img_none' => array( '1', 'ڪجهنه', 'none' ),
- 'img_width' => array( '1', '$1 عڪسلون', '$1px' ),
- 'img_center' => array( '1', 'مرڪز', 'center', 'centre' ),
- 'img_top' => array( '1', 'سÙرÙ', 'top' ),
- 'img_middle' => array( '1', 'ÙˆÚ†', 'middle' ),
- 'img_bottom' => array( '1', 'تَرÙ', 'bottom' ),
- 'sitename' => array( '1', 'سرزميننالو', 'SITENAME' ),
- 'ns' => array( '0', 'نپ', 'NS:' ),
- 'localurl' => array( '0', 'مقامييوآريل', 'LOCALURL:' ),
- 'grammar' => array( '0', 'وياڪرڻ', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'هلندڙهÙتو', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'اڄوڪوÚينهن', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'مقاميهÙتو', 'LOCALWEEK' ),
- 'plural' => array( '0', 'جمع', 'PLURAL:' ),
- 'fullurl' => array( '0', 'مڪمليوآريل', 'FULLURL:' ),
- 'currenttimestamp' => array( '1', 'هلندڙوقتمهر', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'مقاميوقتمهر', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'طرÙنشان', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#ٻولي:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'موادٻولي', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'نپ۾صÙحا', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'منتظمينجوتعداد', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'خاص', 'special' ),
- 'filepath' => array( '0', 'ÙائيلÚس', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__ لڪل زمرو __', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'زمريجاصÙحا', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'صÙحيجيماپ', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#چوريو', '#REDIRECT' ),
+ 'localmonth' => array( '1', 'مقاميمهينو', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'مقاميمهينونالو', 'LOCALMONTHNAME' ),
+ 'localday' => array( '1', 'مقاميÚينهن', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'مقاميÚينهن2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'مقاميÚينهننالو', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'مقاميسال', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'مقاميوقت', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'مقاميڪلاڪ', 'LOCALHOUR' ),
+ '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' ),
+ 'talkspace' => array( '1', 'بحثپولار', 'TALKSPACE' ),
+ 'subjectspace' => array( '1', 'مضمونپولار', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'fullpagename' => array( '1', 'صحÙيجوپورونالو', 'FULLPAGENAME' ),
+ 'msg' => array( '0', 'نياپو:', 'MSG:' ),
+ 'img_right' => array( '1', 'ساڄو', 'right' ),
+ 'img_left' => array( '1', 'کاٻو', 'left' ),
+ 'img_none' => array( '1', 'ڪجهنه', 'none' ),
+ 'img_width' => array( '1', '$1 عڪسلون', '$1px' ),
+ 'img_center' => array( '1', 'مرڪز', 'center', 'centre' ),
+ 'img_top' => array( '1', 'سÙرÙ', 'top' ),
+ 'img_middle' => array( '1', 'ÙˆÚ†', 'middle' ),
+ 'img_bottom' => array( '1', 'تَرÙ', 'bottom' ),
+ 'sitename' => array( '1', 'سرزميننالو', 'SITENAME' ),
+ 'ns' => array( '0', 'نپ', 'NS:' ),
+ 'localurl' => array( '0', 'مقامييوآريل', 'LOCALURL:' ),
+ 'grammar' => array( '0', 'وياڪرڻ', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'هلندڙهÙتو', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'اڄوڪوÚينهن', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'مقاميهÙتو', 'LOCALWEEK' ),
+ 'plural' => array( '0', 'جمع', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'مڪمليوآريل', 'FULLURL:' ),
+ 'currenttimestamp' => array( '1', 'هلندڙوقتمهر', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'مقاميوقتمهر', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'طرÙنشان', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#ٻولي:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'موادٻولي', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'نپ۾صÙحا', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'منتظمينجوتعداد', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'خاص', 'special' ),
+ 'filepath' => array( '0', 'ÙائيلÚس', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__ لڪل زمرو __', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'زمريجاصÙحا', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'صÙحيجيماپ', 'PAGESIZE' ),
);
$messages = array(
@@ -381,7 +381,6 @@ $messages = array(
'unexpected' => 'غير متوقع قدر: "$1"="$2".',
'badtitle' => 'غيردرست عنوان',
'viewsource' => 'ÚªÙˆÚŠ Úسو',
-'viewsourcefor' => 'براء٠$1',
'protectedpagetext' => 'هيء٠صÙحو ترميمن کان تحÙظيل آهي.',
'viewsourcetext' => 'توهان هن صÙحي جو ÚªÙˆÚŠ Úسي Û½ نقل ڪري سگھو ٿا:',
'namespaceprotected' => "توهان Ú©ÙŠ نانء٠پولار '''$1''' جا صÙحا سنوارڻ جا اختيار ناهن.",
@@ -727,7 +726,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
'actioncomplete' => 'ÚªÙ… Ù¾Ùورو',
'deletedtext' => '"$1" ڊهي چڪو آهي.
تازو ڊاٺل صÙحن جي Ùهرست لاء٠$2 Úسندا.',
-'deletedarticle' => '"[[$1]]" ڊهي چڪو',
'dellogpage' => 'ڊاٺ لاگ',
'deletecomment' => 'سبب:',
'deleteotherreason' => 'اڃا ڪو ٻيو سبب:',
@@ -830,7 +828,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
'''موادي صÙحو پاڻ ته ڪاميابيءَ سان Ú†Ùري ويو، پر لاڳاپيل مباحثي صÙحو Ú†Ùري نه سگھيو ڇاڪاڻ ته نئين عنوان تي اڳي ئي Ù‡Úª مباحثي صÙحو موجود آهي. براء٠مهرباني انهن ٻنهي هٿ سان ضمائيندا.",
'movedto' => 'چوريو ويو برسر',
'movetalk' => 'لاڳاپيل مباحثي صÙحو چوريو',
-'1movedto2' => '[[$1]] کي چوري [[$2]] تي رکيو ويو',
'movelogpage' => 'چورڻ لاگ',
'movereason' => 'سبب:',
'revertmove' => 'ورايو',
@@ -903,7 +900,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
# Media information
'file-info-size' => '$1 × $2 عڪسلون، Ùائيل سائيز: $3ØŒ MIME ٽائيپ: $4',
-'file-nohires' => '<small>اڃا سنهو تحلل ميسر ناهي.</small>',
+'file-nohires' => 'اڃا سنهو تحلل ميسر ناهي.',
'svg-long-desc' => 'ايس وي جي Ùائيل، اٽڪل $1 × $2 عڪسلون، Ùائيل سائيز: $3',
'show-big-image' => 'سنهو ترين تحلل',
diff --git a/languages/messages/MessagesSdc.php b/languages/messages/MessagesSdc.php
index 26ee061f..ca5935f3 100644
--- a/languages/messages/MessagesSdc.php
+++ b/languages/messages/MessagesSdc.php
@@ -413,14 +413,13 @@ Si priga di cuntattà un'[[Special:ListUsers/sysop|amministhradore]], ippizzific
'cannotdelete' => 'Impussìbiri canzillà la pàgina o lu file dumandaddu. (Pudia assé isthaddu già canzilladdu.)',
'badtitle' => 'Tìturu no currettu',
'badtitletext' => "Lu tìturu di la pàgina dumandadda è bioddu, ibbagliaddu o cun caràtteri no ammessi oppuru deriba da un errori i' li cullegamenti tra siti wiki dibessi o versioni in linghi dibessi di lu matessi situ.",
-'perfcached' => "Li dati chi seghini so cabaddi da una còpia i' la mimória cache di la bancadati, no aggiornaddi in tempu riari.",
-'perfcachedts' => "Li dati chi seghini so cabaddi da una còpia i' la mimória cache di la bancadati. Ulthimu aggiornamentu: $1.",
+'perfcached' => "Li dati chi seghini so cabaddi da una còpia i' la mimória cache di la bancadati, no aggiornaddi in tempu riari. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "Li dati chi seghini so cabaddi da una còpia i' la mimória cache di la bancadati. Ulthimu aggiornamentu: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => "L'aggiornamenti di la pàgina so timpuraniamenti suippesi. Li dati in edda cuntinuddi no sarani aggiornaddi.",
'wrong_wfQuery_params' => "Errori i' li parametri inviaddi a la funzioni wfQuery()<br />
funzioni: $1<br />
Interrogazioni: $2",
'viewsource' => 'Vèdi còdizi',
-'viewsourcefor' => 'pa $1',
'actionthrottled' => 'Azioni limitadda',
'actionthrottledtext' => "Cumenti rimédiu anti-spam, v'è un lìmiti a l'azioni ch'è pussìbiri eseguì i'nu tempu isthabiriddu, e abà suparaddu. Pògu tèmpu e pói riprubà.",
'protectedpagetext' => 'Chistha pàgina è isthadda prutiggidda pa impidinni la mudìfigga.',
@@ -587,9 +586,6 @@ Attinzioni chi la funzioni '''Ischribì a l'utenti''' nò è attiba si nò è is
Si vói ciaramiddanne, pa piazeri prizzisa sempri lu nùmaru di lu broccu (ID #$5).",
'blockednoreason' => 'nisciuna mutibazioni indicadda',
-'blockedoriginalsource' => "Inogghi è musthraddu lu codizi di la pagina '''$1''':",
-'blockededitsource' => "Inogghi so musthraddi li '''mudìfigghi arriggaddi''' a la pagina '''$1''':",
-'whitelistedittitle' => 'È nezzessariu intrà pa mudifiggà li pagini',
'whitelistedittext' => 'Pa mudìfiggà li pàgini è nezzessàriu $1.',
'confirmedittext' => "Pa assé abiritaddi a la mudìfigga di li pàgini è nezzessàriu cunfèimma lu proprio indirizzu di postha erettrònica. Pa impusthà e cunfèimmà l'indirizzu usà li [[Special:Preferences|prifirenzi]].",
'nosuchsectiontitle' => 'La sezzioni nò esisthi',
@@ -740,16 +736,9 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
'revdelete-unsuppress' => "Elimina li limitazioni i' li ribisioni turraddi che primma",
'revdelete-log' => 'Cummentu pa lu rigisthru:',
'revdelete-submit' => 'Apprica a la ribisioni isciubaradda',
-'revdelete-logentry' => 'à mudìfiggaddu la visibiriddai pa una ribisioni di [[$1]]',
-'logdelete-logentry' => "à mudìfiggaddu la visibiriddai di l'eventu [[$1]]",
'revdelete-success' => "'''Visibiriddai di la ribisioni impusthadda.'''",
'logdelete-success' => "'''Visibiriddai di l'eventu impusthadda.'''",
'revdel-restore' => 'Ciamba la visibiriddai',
-'revdelete-content' => 'cuntinuddu',
-'revdelete-hid' => 'cua $1',
-'revdelete-unhid' => 'rindi visìbiri $1',
-'revdelete-log-message' => '$1 pa $2 {{PLURAL:$2|ribisioni|ribisioni}}',
-'logdelete-log-message' => '$1 pa $2 {{PLURAL:$2|avvinimentu|avvinimenti}}',
# History merging
'mergehistory' => 'Unioni cronologi',
@@ -1263,8 +1252,7 @@ Also see [[Special:WantedCategories|wanted categories]].",
'listusers-noresult' => 'Nisciun utenti curripundi a li critéri impusthaddi.',
# Special:Log/newusers
-'newuserlogpage' => 'Nobi utenti',
-'newuserlog-create-entry' => "s'è rigisthraddu/a abà",
+'newuserlogpage' => 'Nobi utenti',
# Special:ListGroupRights
'listgrouprights-members' => '(erencu di li membri)',
@@ -1371,8 +1359,6 @@ Pa dì cosa ni pensi e dumandà assisthènzia:
Pa piazzeri, cunfèimma chi vói canzillà avveru, ch'ài cumpresu li cunsiguènzi di l'azioni tóia e ch'edda è cunfòimmi a li [[{{MediaWiki:Policy-url}}|lìni ghia]].",
'actioncomplete' => 'Azioni cumpritadda',
'deletedtext' => 'La pàgina "$1" è isthadda canzilladda. Cunsultha lu $2 pa un\'erencu di li pàgini canzilladdi da poggu tempu.',
-'deletedarticle' => 'ha canzilladdu "[[$1]]"',
-'suppressedarticle' => 'eliminaddu "[[$1]]"',
'dellogpage' => 'Canzilladduri',
'dellogpagetext' => 'Inogghi so erencaddi li pàgini canzilladdi da poggu tempu.',
'deletionlog' => 'Rigisthru di li canzilladduri',
@@ -1455,7 +1441,6 @@ L'impusthazioni currenti pa la pàgina so '''$1''':",
'undeletelink' => 'visuarizza/rimpustha',
'undeletereset' => 'Rimpustha',
'undeletecomment' => 'Cummentu:',
-'undeletedarticle' => 'à ricuparaddu "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|Una ribisioni ricuparadda|$1 ribisioni ricuparaddi}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una ribisioni|$1 ribisioni}} e {{PLURAL:$2|un file ricuparaddu|$2 file ricuparaddi}}',
'undeletedfiles' => '{{PLURAL:$1|Un file ricuparaddu|$1 file ricuparaddi}}',
@@ -1627,8 +1612,6 @@ In chisthi casi, si lu vói avveru, débi ippusthà o aggiugnì a manu le infuim
'talkexists' => "'''La pàgina è isthadda ippusthadda currettamenti, ma nò è isthaddu pussìbiri ippusthà la pàgina di dischussioni parchí ni isisthi già un'althra cu' lu nobu tìturu. Aggiugnì a manu li cuntiniddi di li dui pàgini.'''",
'movedto' => 'ippusthadda a',
'movetalk' => 'Ippustha puru la pàgina di dischussioni.',
-'1movedto2' => 'ha ippusthaddu [[$1]] a [[$2]]',
-'1movedto2_redir' => '[[$1]] ippusthadda a [[$2]] attrabessu rinviu',
'movelogpage' => 'Ippusthamenti',
'movelogpagetext' => "Chisthu è l'erencu di li pàgini ippusthaddi.",
'movereason' => 'Mutibu',
@@ -1811,8 +1794,6 @@ Tutti l'operazioni d'impurthazioni trans-wiki so rigisthraddi i' lu [[Special:Lo
# Patrol log
'patrol-log-page' => 'Mudìfigghi verifiggaddi',
-'patrol-log-line' => 'à signaraddu la $1 a la pàgina $2 cumenti verifiggadda $3',
-'patrol-log-auto' => '(verìfica automàtigga)',
# Image deletion
'deletedrevision' => 'Prizzidenti ribisioni canzilladda: $1',
@@ -1836,7 +1817,7 @@ $1",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pàgina|pàgini}}',
'file-info' => 'Misuri: $1, tipu MIME: $2',
'file-info-size' => '$1 × $2 punti, misuri: $3, tipu MIME: $4',
-'file-nohires' => '<small>Nò so dipunìbiri versioni a risoruzioni maggiori.</small>',
+'file-nohires' => 'Nò so dipunìbiri versioni a risoruzioni maggiori.',
'svg-long-desc' => 'file in fuimmaddu SVG, misuri nominari $1 × $2 punti, misuri di lu file: $3',
'show-big-image' => 'Versioni a altha risoruzioni',
@@ -1980,13 +1961,6 @@ Chistu còdizi di cunfèimma ischadrà automatiggamenti a li \$4.",
'scarytranscludefailed' => '[Errori: Impussìbiri uttinì lu mudellu $1]',
'scarytranscludetoolong' => "[L'URL è troppu longu]",
-# Trackbacks
-'trackbackbox' => 'Infuimmazioni di tracciamentu pa chistha pàgina:<br />
-$1',
-'trackbackremove' => '([$1 Elimina])',
-'trackbacklink' => 'Tracciamentu',
-'trackbackdeleteok' => 'Infuimmazioni di tracciamentu eliminaddi.',
-
# Delete conflict
'deletedwhileediting' => "Attinzioni: Chistha pàgina è isthadda canzilladda daboi ch'ài ischuminzaddu a mudìfiggarla!",
'confirmrecreate' => "L'utenti [[User:$1|$1]] ([[User talk:$1|dischussioni]]) à canzilladdu chistha pàgina daboi ch'ài ischuminzaddu a mudìfiggarla, pa lu sighenti mutibu: ''$2''
diff --git a/languages/messages/MessagesSe.php b/languages/messages/MessagesSe.php
index 31685089..9880be26 100644
--- a/languages/messages/MessagesSe.php
+++ b/languages/messages/MessagesSe.php
@@ -261,11 +261,10 @@ $messages = array(
'cannotdelete' => 'Siiddu dahje fiilla sihkkon ii lihkosmuvvan. Muhtun eará lea sáhttán sihkkut dan.',
'badtitle' => 'Feaila bájilÄállagis',
'badtitletext' => 'Siiddu bájilÄállagis lei feaila, dahje dat lei guoros dahje boastut ráhkaduvvon wikiid- dahje gielaidgaskasaÅ¡ liÅ‹ka.',
-'perfcached' => 'Dieđut leat gaskabottosašmuittus eaige sihkkarit vástit dálá hámi.',
-'perfcachedts' => 'Čuovvovaš data lea buktojuvvon gaskabottosašmuittus ja dat lea maŋimusta beaiváduvvon $1.',
+'perfcached' => 'Dieđut leat gaskabottosašmuittus eaige sihkkarit vástit dálá hámi. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Čuovvovaš data lea buktojuvvon gaskabottosašmuittus ja dat lea maŋimusta beaiváduvvon $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Dán siiddu dieđut eai beaiváduvvo.',
'viewsource' => 'GeahÄa gáldu',
-'viewsourcefor' => 'siidui $1',
'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)',
@@ -377,9 +376,6 @@ Du geavaheaddjidovddaldat lea dál anus.
'summary-preview' => 'ÄŒoahkkáigeasu ovdalgihtiigeahÄÄan:',
'subject-preview' => 'BajilÄállaga ovdalgihtiigeahÄÄan:',
'blockedtitle' => 'Geavaheaddji lea cakkastallojuvvon',
-'blockedoriginalsource' => 'Siiddu â€$1†prográmmagálvu:',
-'blockededitsource' => 'Du rievdadusat siidui â€$1â€:',
-'whitelistedittitle' => 'Don fertet Äálligoahtit sisa ovdalgo sáhtát rievdadit siiddu',
'whitelistedittext' => 'Don fertet $1, ovdalgo sáhtát rievdadit siidduid.',
'confirmedittext' => 'It sáhte rievdadit siiddu ovdalgo leat sihkarastan iežat e-poastaÄujuhusa. Sáhtat sihkarastit [[Special:Preferences|ásahussiidduin]].',
'nosuchsectiontitle' => 'Diekkár oassi ii gávdno',
@@ -460,8 +456,6 @@ Eará bajasdoallit sáhtet lohkat Äihkojuvvon sisdoalu ja máhcahit dan.",
'revdelete-unsuppress' => 'Sihko máhcahuvvon veršuvnnaid rádjehusaid',
'revdelete-log' => 'Sivva',
'revdelete-submit' => 'Daga',
-'revdelete-logentry' => 'rievdadii siiddu [[$1]] veršuvnna oidnonásahusaid',
-'logdelete-logentry' => 'rievdadii siiddu [[$1]] oaidninásahusaid',
'pagehist' => 'Siiddu rievdanhistorjá',
'deletedhist' => 'Šluhtejuvvon veršuvnnaid historjá',
@@ -896,7 +890,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'actioncomplete' => 'Doaibma lea dahkkon',
'deletedtext' => '"$1" lea sihkojuvvon.
Siiddus $2 lea listu maŋimus sihkomiin.',
-'deletedarticle' => 'sihkoi siiddu [[$1]]',
'dellogpage' => 'Sihkkunlogga',
'dellogpagetext' => 'Vuolábealde lea logga maŋimus sihkkumiin.',
'deletionlog' => 'sihkkunlogga',
@@ -956,7 +949,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
'undeletebtn' => 'Máhcat',
'undeletereset' => 'Gurre',
'undeletecomment' => 'Kommeanta:',
-'undeletedarticle' => 'máhcahii siiddu [[$1]]',
'undeletedrevisions' => '$1 veršuvnna máhcahuvvui',
'undeletedrevisions-files' => '$1 veršuvnna ja $2 fiilla máhcahuvvui',
'undeletedfiles' => '$1 fii(l)la máhcahuvvui',
@@ -1050,7 +1042,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
'pagemovedsub' => 'Sirdin lihkosmuvai',
'movedto' => 'Sirdojuvvun oÄ‘Ä‘a bájilÄállagin',
'movetalk' => 'Sirdde maid ságastallansiiddu.',
-'1movedto2' => 'sirddii siiddu â€[[$1]]†oÄ‘Ä‘a namain â€[[$2]]â€',
'movelogpage' => 'Sirdinlogga',
'movelogpagetext' => 'Dát lea logga sirdojuvvon siidduin.',
'movereason' => 'Sivva',
@@ -1145,9 +1136,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
'markedaspatrolled' => 'Dárkistuvvon',
'markedaspatrolledtext' => 'Válljejuvvon veršuvdna lea dárkistuvvon.',
-# Patrol log
-'patrol-log-auto' => '(automáhtalaš)',
-
# Browsing diffs
'previousdiff' => '↠Ovddit rievdadus',
'nextdiff' => 'Čuovvovaš rievdadus →',
@@ -1232,9 +1220,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
# Scary transclusion
'scarytranscludetoolong' => '[ÄŒujuhus lea menddo guhkki]',
-# Trackbacks
-'trackbackremove' => '([$1 sihko])',
-
# Delete conflict
'recreate' => 'Ãlggat oÄ‘Ä‘asit',
diff --git a/languages/messages/MessagesSei.php b/languages/messages/MessagesSei.php
index 014f66e4..9db61317 100644
--- a/languages/messages/MessagesSei.php
+++ b/languages/messages/MessagesSei.php
@@ -298,14 +298,13 @@ Sysop zo locköx zo xuniim jan rae': $1",
'badtitle' => 'Ahisharliit',
'badtitletext' => 'Zo páhina coccebj ahisharliit zo.
Jan pos-coccebj plusöxde 1 jöx 1 characterám jan nepos-coccebj usadas titlenám iti.',
-'perfcached' => 'Jan data coccebj cache ö necoccebj updatenom.',
-'perfcachedts' => "Jan data coccebj cache ö coccebjöx updatenom $1 'de.",
+'perfcached' => 'Jan data coccebj cache ö necoccebj updatenom. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => "Jan data coccebj cache ö coccebjöx updatenom $1 'de. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Updatenámde jan páhina coccebj disablenöx cmaa. Jan data necanj cmaa.',
'wrong_wfQuery_params' => 'Parameterám incorrectámde wfQuery()<br />
Funccion: $1<br />
Query: $2',
'viewsource' => 'Cohuatlöx sourcenam',
-'viewsourcefor' => '$1 mii',
'protectedpagetext' => 'Jan páhina coccebj lockom neticpatlöx pos-poop.',
'viewsourcetext' => 'Mecohuatlöx ö copynom sourcenam zode jan páhina:',
'protectedinterface' => "Jan páhina coccebj textuade interface software zo 'de ö coccebj lockom neticpatlöx abusenam.",
@@ -455,9 +454,6 @@ Me contactam $1 jöx pac [[{{MediaWiki:Grouppage-sysop}}|sysop]] discussom iti b
Me nenusor e-iitom päzxo hab' adressade e-iitom validom coccebj [[Special:Preferences|mequáatlaác]] ö'me neblockomde e-iitom.
Me IDde block coccebj $5. Includam 1 jöx 2 pac querinám iti.",
-'blockedoriginalsource' => "Sourcenam zode '''$1''' coccebj cohuatlöx:",
-'blockededitsource' => "Textua zode '''meticpatlöxde''' '''$1''' coccebj cohuatlöx:",
-'whitelistedittitle' => 'Caápo Neces ticpatlöx',
'whitelistedittext' => 'Mecoccebj $1 ticpatlöx páhinám.',
'confirmedittext' => "Me confirmöx menadressade de e-iitom ticpatlöx 'depre. Set' ö validatenan menadressade IP [[Special:Preferences|hequáatlaác]] mii.",
'nosuchsectiontitle' => "Ne'dáár partam",
@@ -572,8 +568,6 @@ Informacion: (curt) = quiíxde vercion currentua,
'revdelete-hide-comment' => 'Camaát commentuade ticpatlöx',
'revdelete-hide-user' => 'Camaát IDde caitom/IDde IP',
'revdelete-log' => 'Ra:',
-'revdelete-logentry' => 'quiixöx revicion visibilitiitde [[$1]]',
-'logdelete-logentry' => 'quiixöx eventua visibilitiitde [[$1]]',
# Diffs
'history-title' => 'Históriade revicionde "$1"',
@@ -978,7 +972,6 @@ iitom e-iitomde diijömde caitóm.',
'movepagebtn' => 'Yacom páhina',
'movedto' => 'yacomöxde',
'movetalk' => 'Yacom czaxö páhina yodina ipríi',
-'1movedto2' => '[[$1]] yacomöxde [[$2]]',
'movereason' => 'Ra:',
'delete_and_move' => 'Delatom ö yacom',
diff --git a/languages/messages/MessagesSg.php b/languages/messages/MessagesSg.php
index 4070b037..9f72572e 100644
--- a/languages/messages/MessagesSg.php
+++ b/languages/messages/MessagesSg.php
@@ -7,8 +7,8 @@
* @ingroup Language
* @file
*
+ * @author Ice201 (on sg.wikipedia.org)
* @author Mdkidiri
- * @author sg.wikipedia.org sysops
*/
$fallback = 'fr';
@@ -249,7 +249,7 @@ $messages = array(
'yournick' => 'Nyîmbâ:',
# User rights
-'editinguser' => "Mo fa na mbi nyîmbâ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Mo fa na mbi nyîmbâ '''[[User:$1|$1]]''' $2",
# Recent changes
'recentchanges' => 'Ndângbâ sänzëmä',
diff --git a/languages/messages/MessagesSgs.php b/languages/messages/MessagesSgs.php
index 2828b638..dbb93f4b 100644
--- a/languages/messages/MessagesSgs.php
+++ b/languages/messages/MessagesSgs.php
@@ -357,13 +357,12 @@ PraÅ¡uom aple Å¡Ä—tÄ paskelbtÄ— [[Special:ListUsers/sysop|adminÄ—stratoriÅ]],
'cannotdelete' => 'Nepavīka ėštrintė nuruodīta poslapė a faila. (Mažo kažkas padarė pėrmesnis šėta)',
'badtitle' => 'Bluogs pavadÄ—nÄ—ms',
'badtitletext' => 'NuruodÄ«ts poslapÄ— pavadÄ—nÄ—ms bova neleistÄ—ns, toÅ¡ÄÄ—s a neteisÄ—ngÄ sojongts terpkalbinis a terppruojektÄ—nis pavadÄ—nÄ—ms. AnamÄ— gal bÅ«tÄ— vÄ—ins a daugiau sÄ—mbuoliu, neleistÄ—nÅ« pavadÄ—nÄ—mÅ«s',
-'perfcachedts' => 'Ruodoma ėšsauguota doumenū kopėjė, katra bova atnaujėnta $1.',
+'perfcachedts' => 'Ruodoma ėšsauguota doumenū kopėjė, katra bova atnaujėnta $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'AtnaujÄ—nÄ—mÄ tam poslapiÅ nÅ«nÄ Ä—Å¡jongtÄ— Ä«r. DoumenÄ«s nÅ«nÄ ÄÄ— nebus atnaujÄ—ntÄ—.',
'wrong_wfQuery_params' => 'NetaisingÄ— parametrÄ i funkcÄ—jÄ— wfQuery()<br />
FunkcÄ—jÄ—: $1<br />
Ožklausėms: $2',
'viewsource' => 'VeizÄ—tÄ— kuoda',
-'viewsourcefor' => 'poslapiÅ $1',
'protectedpagetext' => 'Šėts poslapis īr ožrakints, saugont anū nū redagavėma.',
'viewsourcetext' => 'Tomsta galÄ—t veizietÄ— Ä—r kopÄ—joutÄ— poslapÄ— kuoda:',
'protectedinterface' => 'Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.',
@@ -518,9 +517,6 @@ Tamsta negalÄ—t nauduotÄ—s fonkcÄ—jÄ— „RaÅ¡Ä«tÄ— gruomata tam nauduotuojÅ“,
Tamstas IP adresos Ä«r $3, bluokavÄ—ma ID Ä«r $5.
Prašuom nuruodītė šėtūs doumenis visūmet, kumet kreipiatės diel bluokavėma.",
'blockednoreason' => 'prīžastis nier nuruodīta',
-'blockedoriginalsource' => "Žemiau īr ruodoms '''$1''' torėnīs:",
-'blockededitsource' => "''Tamstas keitimu'' teksts poslapiui '''$1''' īr ruodoms žemiau:",
-'whitelistedittitle' => 'Nuorėnt redagoutė rēk prisėjongtė',
'whitelistedittext' => 'Tamsta torėt $1, kū keistomėt poslapius.',
'nosuchsectiontitle' => 'Nier tuokė skīrė',
'loginreqlink' => 'prisÄ—jongtÄ—',
@@ -662,7 +658,6 @@ Pamiegīkėt [[Special:Search|ėiškoutė pruojektė]] sosėjosiu naujū poslapi
'revdelete-text' => "'''Ä–Å¡trintuos versÄ—jÄ—s Ä—r ivÄ«kÄ“ vistÄ—ik da bus ruodomÄ— poslapÄ— istuorÄ—juo Ä—r specÄ“liÅ«ju veiksmÅ« istuorÄ—juo, no anÅ« torÄ—nÄ— dalÄ«s nabus vÄ—iÅ¡Ä pasÄ—ikiamos.'''
KÄ—tÄ— admÄ—nÄ—stratuorÄ“ Å¡Ä—tom pruojekte vÄ—sdar galÄ—s pasÄ—iktÄ— pasliepta torÄ—ni Ä—r galÄ—s ana atkortÄ— viel par Å¡Ä—ta pate sasaja, nabent Ä«r nostatÄ«tÄ— papÄ—lduomÄ— aprÄ—buojÄ—mÄ.",
'revdelete-unsuppress' => 'Å alÄ—ntÄ— apribuojÄ—mos atkortuos versÄ—jÄ—s',
-'logdelete-logentry' => 'pakeists [[$1]] atsÄ—tÄ—kima veiziemoms',
'revdel-restore' => 'KeistÄ— veizÄ—muma',
'revdel-restore-deleted' => 'Ä–Å¡trintas versÄ—jÄ—s',
'revdel-restore-visible' => 'VeizÄ—mas versÄ—jÄ—s',
@@ -762,7 +757,7 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
'prefs-rc' => 'VielÄ«bÄ—Ì…jÄ— pakeitÄ—mÄ',
'prefs-watchlist' => 'Keravuojamu sÄraÅ¡os',
'prefs-watchlist-days' => 'KÄ—ik dÄ—inÅ« ruodÄ«tÄ— keravuojamu sÄraÅ¡Ä—:',
-'prefs-watchlist-days-max' => '(daugiausē 7 dėinas)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'KÄ—ik pakeitÄ—mu ruodÄ«tÄ— Ä—Å¡pliestiniam keravuojamu sÄraÅ¡Ä—:',
'prefs-watchlist-edits-max' => '(dÄ—dliausias skaitlius: 1000)',
'prefs-misc' => 'IvairÄ— nustatÄ«mÄ',
@@ -1207,9 +1202,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Nerast anėjuokiū nauduotuoju.',
# Special:Log/newusers
-'newuserlogpage' => 'Nauduotuojė kūrėma regėstros',
-'newuserlog-byemail' => 'slaptažuodis Ä—Å¡siÅsts par el. paÅ¡ta',
-'newuserlog-create-entry' => 'Naus nauduotuos',
+'newuserlogpage' => 'Nauduotuojė kūrėma regėstros',
# Special:ListGroupRights
'listgrouprights' => 'Nauduotuoju gropiu teisÄ—s',
@@ -1290,8 +1283,6 @@ PraÅ¡uom patvÄ—rtÄ—ntÄ—, kÅ« Tamsta tÄ—krÄ nuorÄ—t Å¡Ä—tu padarÄ«tÄ—, žėnuot
'actionfailed' => 'Veiksmos atšaukts īr',
'deletedtext' => '„$1“ ėštrints.
Paskotiniu pašalinėmu istuorėjė - $2.',
-'deletedarticle' => 'ėštrīnė „[[$1]]“',
-'suppressedarticle' => 'apžabuots „[[$1]]“',
'dellogpage' => 'Pašalinėmu istuorėjė',
'dellogpagetext' => 'Žemiau Ä«r pateikiams paskotiniu Ä—Å¡trÄ«nimu sÄraÅ¡os.',
'deletionlog' => 'pašalinėmu istuorėjė',
@@ -1406,7 +1397,6 @@ lėgė trīnima. Ėštrintū poslapiu tekstos īr galėmas tėk admėnėstratuor
'undeletereset' => 'Ä–Å¡ naujÄ—',
'undeleteinvert' => 'ŽīmietÄ— prÄ«Å¡Ä—ngÄ',
'undeletecomment' => 'Kuomentars:',
-'undeletedarticle' => 'atkorta „[[$1]]“',
'undeletedrevisions' => 'atkorta $1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}}',
'undeletedrevisions-files' => 'atkorta $1 {{PLURAL:$1|versÄ—jÄ—|versÄ—jÄ—s|versÄ—ju}} Ä—r $2 {{PLURAL:$2|fails|failÄ|failu}}',
'undeletedfiles' => 'atkorta $1 {{PLURAL:$1|fails|failÄ|failu}}',
@@ -1581,8 +1571,6 @@ pavadÄ—nÄ—ma straipsnis jau tor aptarÄ—mu poslapi.
Prašuom sojongtė šėtuos poslapios.'''",
'movedto' => 'parvadints i',
'movetalk' => 'ParkeltÄ— sosÄ—ta aptarÄ—ma poslapi.',
-'1movedto2' => 'Straipsnis [[$1]] parvadints i [[$2]]',
-'1movedto2_redir' => '[[$1]] parvadints i [[$2]] (onkstiau bova nukrÄ“pamÄsis)',
'movelogpage' => 'ParvardinÄ—mu istuorÄ—jÄ—',
'movelogpagetext' => 'SÄraÅ¡os parvadintu poslapiu.',
'movereason' => 'Prīžastis:',
@@ -1708,9 +1696,6 @@ Paskėrties straipsnis „[[:$1]]“ jau īr. A nuorėt ana ėštrintė, kū gal
# Patrol log
'patrol-log-page' => 'PatikrinÄ—ma istuorÄ—jÄ—',
-'patrol-log-line' => 'PoslapÄ— „$2“ $1 pažīmieta kÄp patÄ—krinta $3',
-'patrol-log-auto' => '(autuomatÄ—Å¡kÄ)',
-'patrol-log-diff' => 'versÄ—jÄ— $1',
'log-show-hide-patrol' => '$1 patvirtėnėmu saraša',
# Image deletion
@@ -1728,7 +1713,7 @@ Paskėrties straipsnis „[[:$1]]“ jau īr. A nuorėt ana ėštrintė, kū gal
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|poslapis|poslapē|poslapiu}}',
'file-info' => 'faila dÄ—doms: $1, MIME tips: $2',
'file-info-size' => '$1 × $2 taškū, faila dėdoms: $3, MIME tips: $4',
-'file-nohires' => '<small>Geresnis ėšraiškėms negalėms.</small>',
+'file-nohires' => 'Geresnis ėšraiškėms negalėms.',
'svg-long-desc' => 'SVG fails, fuormalē $1 × $2 puškiu, faila dėdoms: $3',
'show-big-image' => 'Pėlns ėšraiškėms',
@@ -1836,9 +1821,6 @@ $5
PatvirtÄ—nÄ—ma kods bengs galiuotÄ— $4.',
'invalidateemail' => 'El. pašta patvirtėnėma atšaukėms',
-# Trackbacks
-'trackbackremove' => '([$1 TrintÄ—])',
-
# Delete conflict
'deletedwhileediting' => 'DiemesÄ—: Å Ä—ts poslapis Ä—Å¡trints po Å¡Ä—ta, kumet pradiejot redagoutÄ—!',
'recreate' => 'AtkortÄ—',
@@ -1951,4 +1933,7 @@ Tamsta tēpuogi galėt [[Special:EditWatchlist/raw|redagoutė grīnaji keravuoja
'tag-filter' => '[[Special:Tags|Žīmiejėmu]] filtros:',
'tags-edit' => 'taisītė',
+# New logging system
+'newuserlog-byemail' => 'slaptažuodis Ä—Å¡siÅsts par el. paÅ¡ta',
+
);
diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php
index b6ecb722..8e721a22 100644
--- a/languages/messages/MessagesSh.php
+++ b/languages/messages/MessagesSh.php
@@ -115,94 +115,94 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PREUSMJERI', '#PREUSMERI', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAÄŒNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAÄŒNIMJESEC1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAÄŒNIMJESECIME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'TRENUTNIMJESECROD', 'TRENUTNIMESECROD', 'TRENUTAÄŒNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'TRENUTNIMJESECSKR', 'TRENUTNIMESECSKR', 'TRENUTAÄŒNIMJESECSKR', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'TRENUTNIDAN', 'TRENUTAÄŒNIDAN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'TRENUTNIDAN2', 'TRENUTAÄŒNIDAN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'TRENUTNIDANIME', 'TRENUTAÄŒNIDANIME', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TRENUTNAGODINA', 'TRENUTAÄŒNAGODINA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'TRENUTNOVRIJEME', 'TRENUTNOVREME', 'TRENUTAÄŒNOVRIJEME', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'TRENUTNISAT', 'TRENUTAÄŒNISAT', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALNIMJESEC', 'LOKALNIMESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALNIMJESEC1', 'LOKALNIMESEC1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKALNIMJESECIME', 'LOKALNIMESECIME', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKALNIMJESECROD', 'LOKALNIMESECROD', 'LOKALNIMJESECGEN', 'LOKALNIMESECGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'LOKALNIMJESECSKR', 'LOKALNIMESECSKR', 'LOKALNIMJESECKRAT', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALNOVRIJEME', 'LOKALNOVREME', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'BROJSTRANICA', 'BROJSTRANA', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREÄIVANJA', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
- 'fullpagename' => array( '1', 'PUNOIMESTRANE', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'PUNOIMESTRANEE', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
- 'msg' => array( '0', 'POR:', 'MSG:' ),
- 'subst' => array( '0', 'ZAMJENI:', 'ZAMENI:', 'ZAMJENA:', 'SUBST:' ),
- 'msgnw' => array( '0', 'NVPOR:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'minijatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'desno', 'right' ),
- 'img_left' => array( '1', 'lijevo', 'levo', 'left' ),
- 'img_none' => array( '1', 'n', 'bez', 'ništa', 'none' ),
- 'img_center' => array( '1', 'centar', 'središte', 'c', 'center', 'centre' ),
- 'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'bez_okvira', 'bezokvira', 'frameless' ),
- 'img_page' => array( '1', 'stranica=$1', 'stranica_$1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'granica', 'obrub', 'border' ),
- 'img_baseline' => array( '1', 'osnovnacrta', 'pocetna_linija', 'baseline' ),
- 'img_top' => array( '1', 'vrh', 'top' ),
- 'img_text_top' => array( '1', 'vrh_teksta', 'tekst_vrh', 'text-top' ),
- 'img_middle' => array( '1', 'sredina', 'middle' ),
- 'img_bottom' => array( '1', 'dno', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekst-dno', 'text-bottom' ),
- 'localurl' => array( '0', 'LOKALNIURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALNIURLE:', 'LOCALURLE:' ),
- 'notitleconvert' => array( '0', '__BEZTC__', '__BEZKN__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__BEZCC__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'TRENUTNASEDMICA', 'TRENUTAÄŒNITJEDAN', 'TRENUTNANEDELJA', 'TRENUTNITJEDAN', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'TRENUTNIDANSEDMICE', 'TRENUTAÄŒNIDANTJEDNA', 'TRENUTNIDANNEDELJE', 'TRENUTNIDANTJEDNA', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALNASEDMICA', 'LOKALNITJEDAN', 'LOKALNANEDELJA', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'LOKALNIDANSEDMICE', 'LOKALNIDANTJEDNA', 'LOKALNIDANNEDELJE', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'IDIZMJENE', 'IDIZMENE', 'REVISIONID' ),
- 'revisionday' => array( '1', 'IZMJENEDANA', 'IZMENEDANA', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'IZMJENEDANA2', 'IZMENEDANA2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'MJESECIZMJENE', 'MESECIZMENE', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'MJESECIZMJENE1', 'MESECIZMENE1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'GODINAIZMJENE', 'GODINAIZMENE', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'OZNAKAVREMENAIZMJENE', 'OZNAKAVREMENAIZMENE', 'REVISIONTIMESTAMP' ),
- 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'PUNIURL:', 'PUNURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'PUNIURLE:', 'PUNURLE:', 'FULLURLE:' ),
- 'currenttimestamp' => array( '1', 'TRENUTNAOZNAKAVREMENA', 'TRENUTAÄŒNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKALNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
- 'special' => array( '0', 'posebno', 'special' ),
- 'hiddencat' => array( '1', '__SAKRIVENAKATEGORIJA__', 'SKRIVENAKAT', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
- 'pagesize' => array( '1', 'VELICINASTRANICE', 'VELIÄŒINASTRANICE', 'VELIÄŒINASTRANE', 'VELICINASTRANE', 'PAGESIZE' ),
- 'formatdate' => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#PREUSMJERI', '#PREUSMERI', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALERIJE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAÄŒNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAÄŒNIMJESEC1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAÄŒNIMJESECIME', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'TRENUTNIMJESECROD', 'TRENUTNIMESECROD', 'TRENUTAÄŒNIMJESECROD', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'TRENUTNIMJESECSKR', 'TRENUTNIMESECSKR', 'TRENUTAÄŒNIMJESECSKR', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'TRENUTNIDAN', 'TRENUTAÄŒNIDAN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'TRENUTNIDAN2', 'TRENUTAÄŒNIDAN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'TRENUTNIDANIME', 'TRENUTAÄŒNIDANIME', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TRENUTNAGODINA', 'TRENUTAÄŒNAGODINA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'TRENUTNOVRIJEME', 'TRENUTNOVREME', 'TRENUTAÄŒNOVRIJEME', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'TRENUTNISAT', 'TRENUTAÄŒNISAT', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALNIMJESEC', 'LOKALNIMESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALNIMJESEC1', 'LOKALNIMESEC1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKALNIMJESECIME', 'LOKALNIMESECIME', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKALNIMJESECROD', 'LOKALNIMESECROD', 'LOKALNIMJESECGEN', 'LOKALNIMESECGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKALNIMJESECSKR', 'LOKALNIMESECSKR', 'LOKALNIMJESECKRAT', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALNIDAN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALNIDAN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKALNIDANIME', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALNAGODINA', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALNOVRIJEME', 'LOKALNOVREME', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALNISAT', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'BROJSTRANICA', 'BROJSTRANA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'BROJKORISNIKA', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHKORISNIKA', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'BROJIZMJENA', 'BROJIZMENA', 'BROJUREÄIVANJA', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'BROJPREGLEDA', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'STRANICA', 'IMESTRANICE', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'STRANICE', 'IMESTRANICEE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'PROSTORZARAZGOVOR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'PROSTORIZARAZGOVOR', 'TALKSPACEE' ),
+ 'fullpagename' => array( '1', 'PUNOIMESTRANE', 'PUNOIMESTRANICE', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'PUNOIMESTRANEE', 'PUNOIMESTRANICEE', 'FULLPAGENAMEE' ),
+ 'msg' => array( '0', 'POR:', 'MSG:' ),
+ 'subst' => array( '0', 'ZAMJENI:', 'ZAMENI:', 'ZAMJENA:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'NVPOR:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'minijatura', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'minijatura=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'desno', 'right' ),
+ 'img_left' => array( '1', 'lijevo', 'levo', 'left' ),
+ 'img_none' => array( '1', 'n', 'bez', 'ništa', 'none' ),
+ 'img_center' => array( '1', 'centar', 'središte', 'c', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bez_okvira', 'bezokvira', 'frameless' ),
+ 'img_page' => array( '1', 'stranica=$1', 'stranica_$1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'na_gore', 'na_gore=$1', 'na_gore_$1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'granica', 'obrub', 'border' ),
+ 'img_baseline' => array( '1', 'osnovnacrta', 'pocetna_linija', 'baseline' ),
+ 'img_top' => array( '1', 'vrh', 'top' ),
+ 'img_text_top' => array( '1', 'vrh_teksta', 'tekst_vrh', 'text-top' ),
+ 'img_middle' => array( '1', 'sredina', 'middle' ),
+ 'img_bottom' => array( '1', 'dno', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tekst-dno', 'text-bottom' ),
+ 'localurl' => array( '0', 'LOKALNIURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALNIURLE:', 'LOCALURLE:' ),
+ 'notitleconvert' => array( '0', '__BEZTC__', '__BEZKN__', '__BPN__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__BEZCC__', '__BPS__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'TRENUTNASEDMICA', 'TRENUTAÄŒNITJEDAN', 'TRENUTNANEDELJA', 'TRENUTNITJEDAN', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'TRENUTNIDANSEDMICE', 'TRENUTAÄŒNIDANTJEDNA', 'TRENUTNIDANNEDELJE', 'TRENUTNIDANTJEDNA', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALNASEDMICA', 'LOKALNITJEDAN', 'LOKALNANEDELJA', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'LOKALNIDANSEDMICE', 'LOKALNIDANTJEDNA', 'LOKALNIDANNEDELJE', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDIZMJENE', 'IDIZMENE', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'IZMJENEDANA', 'IZMENEDANA', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'IZMJENEDANA2', 'IZMENEDANA2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MJESECIZMJENE', 'MESECIZMENE', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'MJESECIZMJENE1', 'MESECIZMENE1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'GODINAIZMJENE', 'GODINAIZMENE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'OZNAKAVREMENAIZMJENE', 'OZNAKAVREMENAIZMENE', 'REVISIONTIMESTAMP' ),
+ 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PUNIURL:', 'PUNURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'PUNIURLE:', 'PUNURLE:', 'FULLURLE:' ),
+ 'currenttimestamp' => array( '1', 'TRENUTNAOZNAKAVREMENA', 'TRENUTAÄŒNAOZNAKAVREMENA', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKALNAOZNAKAVREMENA', 'LOCALTIMESTAMP' ),
+ 'special' => array( '0', 'posebno', 'special' ),
+ 'hiddencat' => array( '1', '__SAKRIVENAKATEGORIJA__', 'SKRIVENAKAT', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
+ 'pagesize' => array( '1', 'VELICINASTRANICE', 'VELIÄŒINASTRANICE', 'VELIÄŒINASTRANE', 'VELICINASTRANE', 'PAGESIZE' ),
+ 'formatdate' => array( '0', 'formatdatuma', 'formatdate', 'dateformat' ),
);
$linkTrail = '/^([a-zÄćđžš]+)(.*)$/sDu';
@@ -564,22 +564,24 @@ Molimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] sa navođ
'badarticleerror' => 'Ova akcija ne može biti izvršena na ovoj stranici.',
'cannotdelete' => 'Ne može se obrisati stranica ili datoteka "$1".
Moguće je da ju je neko drugi već obrisao.',
+'cannotdelete-title' => 'Brisanje stranice "$1" nije moguće',
'badtitle' => 'Loš naslov',
'badtitletext' => 'Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s meÄ‘u-jeziÄkim ili inter-wiki naslovom.
Može sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.',
-'perfcached' => 'Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani.',
-'perfcachedts' => 'Slijedeći podaci se nalaze u memoriji i zadnji put su ažurirani $1.',
+'perfcached' => 'Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.',
+'perfcachedts' => 'Sledeći podaci su keširani, a poslednji put su ažurirani $2 u $3. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata|$4 rezultata}}.',
'querypage-no-updates' => 'Ažuriranje ove stranice je iskljuÄeno.
Podaci koji se ovdje nalaze neće biti biti ažurirani.',
'wrong_wfQuery_params' => 'NetaÄni parametri za wfQuery()<br />
Funkcija: $1<br />
Pretraga: $2',
'viewsource' => 'Pogledaj kod',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Prikaz izvora stranice $1',
'actionthrottled' => 'Akcija je usporena',
'actionthrottledtext' => 'Kao anti-spam mjera, ograniÄene su vam izmjene u odreÄ‘enom vremenu, i trenutaÄno ste dostigli to ograniÄenje. PokuÅ¡ajte ponovo poslije nekoliko minuta.',
'protectedpagetext' => 'Ova stranica je zakljuÄana da bi se sprijeÄilo ureÄ‘ivanje.',
'viewsourcetext' => 'Možete vidjeti i kopirati izvorni tekst ove stranice:',
+'viewyourtext' => "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
'protectedinterface' => 'Ova stranica sadrži tekst interfejsa za softver, pa je zakljuÄana kako bi se sprijeÄile zloupotrebe.',
'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja se koristi za tekst interfejsa za softver.
Promjene na ovoj stranici dovode i do promjena interfejsa za druge korisnike.
@@ -686,6 +688,7 @@ Nijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.',
'emailconfirmlink' => 'Potvrdite Vašu e-mail adresu',
'invalidemailaddress' => 'Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.
Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
+'cannotchangeemail' => 'Na ovom wikiju ne možete promeniti e-mail adresu raÄuna.',
'accountcreated' => 'KorisniÄki raÄun je napravljen',
'accountcreatedtext' => 'KorisniÄki raÄun za $1 je napravljen.',
'createaccount-title' => 'Pravljenje korisniÄkog raÄuna za {{SITENAME}}',
@@ -702,6 +705,7 @@ Molimo Vas da saÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
# E-mail sending
'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
+'user-mail-no-addy' => 'Pokušaj slanja e-maila bez e-mail adrese.',
# Change password dialog
'resetpass' => 'Promijeni korisniÄku Å¡ifru',
@@ -722,16 +726,18 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privre
'resetpass-temp-password' => 'Privremena lozinka:',
# Special:PasswordReset
-'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vaÅ¡im detaljima raÄuna.',
-'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-username' => 'KorisniÄko ime:',
-'passwordreset-domain' => 'Domena:',
-'passwordreset-email' => 'E-mail adresa:',
-'passwordreset-emailtitle' => 'Detalji raÄuna na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Netko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik VaÅ¡ih detalja raÄuna
+'passwordreset' => 'Ponovno postavi lozinku',
+'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vaÅ¡im detaljima raÄuna.',
+'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-username' => 'KorisniÄko ime:',
+'passwordreset-domain' => 'Domena:',
+'passwordreset-capture' => 'Pogledati krajnji e-mail?',
+'passwordreset-capture-help' => 'Ako oznaÄite ovu kućicu, e-mail s privremenom lozinkom će biti prikazana i poslata korisniku.',
+'passwordreset-email' => 'E-mail adresa:',
+'passwordreset-emailtitle' => 'Detalji raÄuna na {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Netko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik VaÅ¡ih detalja raÄuna
za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|raÄun korisnika je|raÄuni korisnika su}}
povezani s ovom e-mail adresom:
@@ -741,7 +747,7 @@ $2
Trebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj
zahtjev, ili ako ste se sjetili VaÅ¡e poÄetne lozinke, a ne želite je promijeniti,
možete zanemariti ovu poruku i nastaviti koristiti staru lozinku.',
-'passwordreset-emailtext-user' => 'Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima VaÅ¡eg raÄuna za {{SITENAME}}
+'passwordreset-emailtext-user' => 'Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima VaÅ¡eg raÄuna za {{SITENAME}}
($4). Sljedeći {{PLURAL:$3|korisniÄki raÄun je|korisniÄki raÄuni su}} povezani s ovom e-mail adresom:
$2
@@ -750,9 +756,22 @@ $2
Trebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj
zahtjev, ili ako ste se sjetili Vaše originalne lozinke, a ne želite je više promijeniti,
možete zanemariti ovu poruku i nastaviti koristiti staru lozinku.',
-'passwordreset-emailelement' => 'KorisniÄko ime: $1
+'passwordreset-emailelement' => 'KorisniÄko ime: $1
Privremena Å¡ifra: $2',
-'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
+'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
+'passwordreset-emailsent-capture' => 'Poslan je podsjetnik preko e-maila (prikazan dolje).',
+'passwordreset-emailerror-capture' => 'E-mail s podsjetnikom, prikazan dolje, je poslan, ali slanje korisniku nije uspjelo: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Promijeni e-mail adresu',
+'changeemail-header' => 'Promijeni e-mail adresu korisniÄkog raÄuna',
+'changeemail-text' => 'Ispunite ovaj formular da biste promijenili svoju e-mail adresu. Morat ćete upisati svoju lozinku da potvrdite ovu promjenu.',
+'changeemail-no-info' => 'Morate biti prijavljeni da biste izravno pristupili ovoj stranici.',
+'changeemail-oldemail' => 'Trenutna e-mail adresa:',
+'changeemail-newemail' => 'Nova e-mail adresa:',
+'changeemail-none' => '(ništa)',
+'changeemail-submit' => 'Promijeni e-mail',
+'changeemail-cancel' => 'Odustani',
# Edit page toolbar
'bold_sample' => 'Podebljan tekst',
@@ -823,9 +842,6 @@ Zapamtite da ne možete koristiti opciju "pošalji e-mail ovom korisniku" sve do
Vaša trenutna IP adresa je $3, a ID blokade je $5.
Molimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.',
'blockednoreason' => 'razlog nije naveden',
-'blockedoriginalsource' => "Izvor '''$1''' je prikazan ispod:",
-'blockededitsource' => "Sadržaj '''vaših izmjena''' na '''$1''' je prikazan ispod:",
-'whitelistedittitle' => 'Za uređivanje je obavezna prijava',
'whitelistedittext' => 'Da bi ste uređivali stranice, morate se $1.',
'confirmedittext' => 'Morate potvrditi VaÅ¡u e-mail adresu prije nego poÄnete mijenjati stranice.
Molimo da postavite i verifikujete VaÅ¡u e-mail adresu putem VaÅ¡ih [[Special:Preferences|korisniÄkih opcija]].',
@@ -915,8 +931,8 @@ Također obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj do
'copyrightwarning2' => "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />
TakoÄ‘er nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sliÄnog slobodnog izvora informacija (pogledajte $1 za viÅ¡e detalja).
'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
-'longpageerror' => "'''Greška: Tekst, koji ste poslali, je dug $1 kilobajta, što je veće od maksimuma, koji iznosi $2 kilobajta.
-Stranica ne može biti spremljena.'''",
+'longpageerror' => "'''GreÅ¡ka: tekst koji ste uneli je veliÄine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, Å¡to je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''
+Stranica ne može biti saÄuvana.",
'readonlywarning' => "'''PAŽNJA: Baza je zakljuÄana zbog održavanja, tako da nećete moći da snimite svoje izmjene za sada.
Možda želite da kopirate i nalijepite tekst u tekst editor i saÄuvate ga za kasnije.'''
@@ -1085,8 +1101,6 @@ Drugi administratori projekta {{SITENAME}} će i dalje moći pristupiti sakriven
'revdelete-unsuppress' => 'Ukloni ograniÄenja na vraćenim revizijama',
'revdelete-log' => 'Razlog:',
'revdelete-submit' => 'Primijeni na odabrane {{PLURAL:$1|izmjena|izmjene}}',
-'revdelete-logentry' => 'promijenjena vidljivost revizije [[$1]]',
-'logdelete-logentry' => 'promijenjena vidljivost događaja [[$1]]',
'revdelete-success' => "'''Vidljivost revizije uspješno postavljena.'''",
'revdelete-failure' => "'''Zapisnik vidljivosti nije mogao biti postavljen:'''
$1",
@@ -1098,15 +1112,6 @@ $1",
'revdel-restore-visible' => 'vidljive izmjene',
'pagehist' => 'Historija stranice',
'deletedhist' => 'Izbrisana historija',
-'revdelete-content' => 'sadržaj',
-'revdelete-summary' => 'sažetak izmjene',
-'revdelete-uname' => 'korisniÄko ime',
-'revdelete-restricted' => 'primijenjena ograniÄenja za administratore',
-'revdelete-unrestricted' => 'uklonjena ograniÄenja za administratore',
-'revdelete-hid' => 'sakrij $1',
-'revdelete-unhid' => 'otkrij $1',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|izmjenu|izmjene|izmjena}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|događaj|događaja}}',
'revdelete-hide-current' => 'Greška pri sakrivanju stavke od $2, $1: ovo je trenutna revizija.
Ne može biti sakrivena.',
'revdelete-show-no-access' => 'GreÅ¡ka pri prikazivanju stavke od $2, $1: ova stavka je oznaÄena kao "zaÅ¡tićena".
@@ -1265,12 +1270,14 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
'prefs-rc' => 'Podešavanje nedavnih izmjena',
'prefs-watchlist' => 'Praćene stranice',
'prefs-watchlist-days' => 'Broj dana za prikaz u spisku praćenja:',
-'prefs-watchlist-days-max' => 'Najviše 7 dana',
+'prefs-watchlist-days-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
'prefs-watchlist-edits' => 'Najveći broj izmjena za prikaz u proširenom spisku praćenja:',
'prefs-watchlist-edits-max' => 'Maksimalni broj: 1000',
'prefs-watchlist-token' => 'Token spiska za praćenje:',
'prefs-misc' => 'Ostala podešavanja',
'prefs-resetpass' => 'Promijeni lozinku',
+'prefs-changeemail' => 'Promijeni E-mail',
+'prefs-setemail' => 'Postavite E-mail adresu',
'prefs-email' => 'E-mail opcije',
'prefs-rendering' => 'Izgled',
'saveprefs' => 'Snimi postavke',
@@ -1330,6 +1337,7 @@ Ovo se ne može vratiti unazad.',
'yourrealname' => 'Vaše pravo ime:',
'yourlanguage' => 'Jezik:',
'yourvariant' => 'Varijanta jezika:',
+'prefs-help-variant' => 'Željena varijanta ili pravopis za prikaz stranica sa sadržajem ovog vikija.',
'yournick' => 'Nadimak (za potpise):',
'prefs-help-signature' => 'Komentari na stranicama za razgovor trebaju biti potpisani sa "<nowiki>~~~~</nowiki>" koje će biti pretvoreno u vaš potpis i vrijeme.',
'badsig' => 'Loš sirovi potpis.
@@ -1372,7 +1380,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'userrights-lookup-user' => 'Menadžment korisniÄkih prava',
'userrights-user-editname' => 'Unesi korisniÄko ime:',
'editusergroup' => 'Uredi korisniÄke grupe',
-'editinguser' => "Mijenjate korisniÄka prava korisnika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Mijenjate korisniÄka prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Uredi korisniÄke grupe',
'saveusergroups' => 'Snimi korisniÄke grupe',
'userrights-groupsmember' => 'ÄŒlan:',
@@ -1466,13 +1474,13 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'right-autopatrol' => 'Vlastite izmjene se automatski oznaÄavaju kao patrolirane',
'right-patrolmarks' => 'Pregled oznaka patroliranja u spisku nedavnih izmjena',
'right-unwatchedpages' => 'Gledanje spiska nepraćenih stranica',
-'right-trackback' => "Slanje ''trackbacka''",
'right-mergehistory' => 'Spajanje historije stranica',
'right-userrights' => 'UreÄ‘ivanje svih korisniÄkih prava',
'right-userrights-interwiki' => 'UreÄ‘ivanje korisniÄkih prava korisnika na drugim wikijima',
'right-siteadmin' => 'ZakljuÄavanje i otkljuÄavanje baze podataka',
'right-override-export-depth' => 'Izvoz stranica ukljuÄujući povezane stranice do dubine od 5 linkova',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
+'right-passwordreset' => 'Pregled e-maila za obnavljanje lozinke',
# User rights log
'rightslog' => 'Registar korisniÄkih prava',
@@ -1506,16 +1514,17 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'action-suppressionlog' => 'gledanje ove privatne evidencije',
'action-block' => 'blokiranje uređivanja ovog korisnika',
'action-protect' => 'promijeniti nivo zaštite ove stranice',
+'action-rollback' => 'brzo vraćanje izmjena posljednjeg korisnika koji je mijenjao određenu stranicu',
'action-import' => 'uvoženje ove stranice s drugog wikija',
'action-importupload' => 'uvoženje ove stranice postavljanjem datoteke',
'action-patrol' => 'oznaÄavanje tuÄ‘ih izmjena patroliranim',
'action-autopatrol' => 'oznaÄavanje vlastitih izmjena kao patroliranih',
'action-unwatchedpages' => 'pregled spiska nenadgledanih strana',
-'action-trackback' => 'slanje "trackbacka"',
'action-mergehistory' => 'spajanje historije ove stranice',
'action-userrights' => 'ureÄ‘ivanje svih korisniÄkih prava',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
@@ -1547,6 +1556,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]',
'rc_categories' => 'OgraniÄi na kategorije (razdvojene sa "|")',
'rc_categories_any' => 'Sve',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene',
'newsectionsummary' => '/* $1 */ nova sekcija',
'rc-enhanced-expand' => 'Pokaži detalje (neophodan JavaScript)',
'rc-enhanced-hide' => 'Sakrij detalje',
@@ -1601,6 +1611,7 @@ Vidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.',
'minlength1' => 'Ime datoteke mora imati barem jedno slovo.',
'illegalfilename' => 'Ime datoteke "$1" sadrži simbol koji nije dozvoljen u imenu datoteke.
Molimo Vas da promijenite ime datoteke i pokušate da je ponovo postavite.',
+'filename-toolong' => 'Nazivi datoteka mogu imati najviše 240 bajtova.',
'badfilename' => 'Ime datoteke je promijenjeno u "$1".',
'filetype-mime-mismatch' => 'Proširenje datoteke ".$1" ne odgovara MIME tipu ($2).',
'filetype-badmime' => 'Datoteke MIME vrste "$1" nije dopušteno postavljati.',
@@ -1699,6 +1710,41 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
'upload-unknown-size' => 'Nepoznata veliÄina',
'upload-http-error' => 'Desila se HTTP greška: $1',
+# File backend
+'backend-fail-stream' => 'Ne mogu da emitujem datoteku $1.',
+'backend-fail-backup' => 'Ne mogu da napravim rezervu datoteke $1.',
+'backend-fail-notexists' => 'Datoteka $1 ne postoji.',
+'backend-fail-hashes' => 'Ne mogu da dobijem disperzije datoteke za upoređivanje.',
+'backend-fail-notsame' => 'Već postoji neistovetna datoteka – $1.',
+'backend-fail-invalidpath' => '$1 nije ispravna putanja za skladištenje.',
+'backend-fail-delete' => 'Ne može se izbrisati datoteka "$1".',
+'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
+'backend-fail-store' => 'Ne mogu da smestim datoteku $1 u $2.',
+'backend-fail-copy' => 'Ne može se kopirati "$1" na "$2".',
+'backend-fail-move' => 'Ne mogu da premestim datoteku $1 u $2.',
+'backend-fail-opentemp' => 'Nije moguće napraviti privremenu datoteku.',
+'backend-fail-writetemp' => 'Ne mogu da pišem u privremenoj datoteci.',
+'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
+'backend-fail-read' => 'Ne mogu da proÄitam datoteku $1.',
+'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
+'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
+'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
+'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
+'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi „$1“.',
+'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smestim u „$1“.',
+'backend-fail-batchsize' => 'SkladiÅ¡na osnova je dobila blokadu od $1 {{PLURAL:$1|operacije|operacije|operacija}}; ograniÄenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ne mogu da otkljuÄam „$1“ jer nije zakljuÄan.',
+'lockmanager-fail-closelock' => 'Ne mogu da zatvorim katanac za „$1“.',
+'lockmanager-fail-deletelock' => 'Ne mogu da obrišem katanac za „$1“.',
+'lockmanager-fail-acquirelock' => 'Ne mogu da dobijem katanac za „$1“.',
+'lockmanager-fail-openlock' => 'Ne mogu da otvorim katanac za „$1“.',
+'lockmanager-fail-releaselock' => 'Ne mogu da oslobodim katanac za „$1“.',
+'lockmanager-fail-db-bucket' => 'Ne mogu da kontaktiram s dovoljno katanaca u kanti $1.',
+'lockmanager-fail-db-release' => 'Ne mogu da oslobodim katance u bazi $1.',
+'lockmanager-fail-svr-release' => 'Ne mogu da oslobodim katance na serveru $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Desila se greška pri otvaranju datoteke za provjere ZIP-a.',
'zip-wrong-format' => 'Navedena datoteka nije ZIP datoteka.',
@@ -1715,6 +1761,7 @@ Ne može se dobro provjeriti u vezi sigurnosti.',
'uploadstash-badtoken' => 'IzvrÅ¡avanje ove akcije je bilo neuspjeÅ¡no, možda zato Å¡to su vaÅ¡a ureÄ‘ivaÄka odobrenja istekla. PokuÅ¡ajte ponovo.',
'uploadstash-errclear' => 'Brisanje neobjavljenih datoteka nije uspjelo.',
'uploadstash-refresh' => 'Osvježi spisak datoteka',
+'invalid-chunk-offset' => 'Nevaljana toÄka nastavka snimanja',
# img_auth script messages
'img-auth-accessdenied' => 'Pristup onemogućen',
@@ -1823,23 +1870,24 @@ Opis sa njene [$2 stranice opisa datoteke] je prikazan ispod.',
'filerevert-badversion' => 'Ne postoji ranija lokalna verzija ove datoteke sa navedenim vremenskim podacima.',
# File deletion
-'filedelete' => 'Obriši $1',
-'filedelete-legend' => 'Obriši datoteku',
-'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
-'filedelete-intro-old' => "Brišete verziju datoteke '''[[Media:$1|$1]]''' od [$4 $3, $2].",
-'filedelete-comment' => 'Razlog:',
-'filedelete-submit' => 'Obriši',
-'filedelete-success' => "'''$1''' je obrisano.",
-'filedelete-success-old' => "Verzija datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
-'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Ne postoji arhivirana verzija '''$1''' sa navedenim atributima.",
-'filedelete-otherreason' => 'Ostali/dodatni razlog/zi:',
-'filedelete-reason-otherlist' => 'Ostali razlog/zi',
-'filedelete-reason-dropdown' => '*UobiÄajeni razlozi brisanja
+'filedelete' => 'Obriši $1',
+'filedelete-legend' => 'Obriši datoteku',
+'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno sa svom njenom historijom.",
+'filedelete-intro-old' => "Brišete verziju datoteke '''[[Media:$1|$1]]''' od [$4 $3, $2].",
+'filedelete-comment' => 'Razlog:',
+'filedelete-submit' => 'Obriši',
+'filedelete-success' => "'''$1''' je obrisano.",
+'filedelete-success-old' => "Verzija datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
+'filedelete-nofile' => "'''$1''' ne postoji.",
+'filedelete-nofile-old' => "Ne postoji arhivirana verzija '''$1''' sa navedenim atributima.",
+'filedelete-otherreason' => 'Ostali/dodatni razlog/zi:',
+'filedelete-reason-otherlist' => 'Ostali razlog/zi',
+'filedelete-reason-dropdown' => '*UobiÄajeni razlozi brisanja
** Kršenje autorskih prava
** Datoteka dvojnik',
-'filedelete-edit-reasonlist' => 'Uredi razloge brisanja',
-'filedelete-maintenance' => 'Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.',
+'filedelete-edit-reasonlist' => 'Uredi razloge brisanja',
+'filedelete-maintenance' => 'Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.',
+'filedelete-maintenance-title' => 'Ne mogu obrisati datoteku',
# MIME search
'mimesearch' => 'MIME pretraga',
@@ -1938,6 +1986,8 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
'wantedpages' => 'Tražene stranice',
'wantedpages-badtitle' => 'Nevaljan naslov u setu rezultata: $1',
'wantedfiles' => 'Tražene datoteke',
+'wantedfiletext-cat' => 'Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbaÄene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].',
+'wantedfiletext-nocat' => 'Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbaÄene</del> sa spiska.',
'wantedtemplates' => 'Potrebni Å¡abloni',
'mostlinked' => 'Stranice sa najviše linkova',
'mostlinkedcategories' => 'Kategorije sa najviše linkova',
@@ -1946,6 +1996,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
'mostimages' => 'Datoteke sa najviše linkova',
'mostrevisions' => 'Stranice sa najviše izmjena',
'prefixindex' => 'Sve stranice sa prefiksom',
+'prefixindex-namespace' => 'Sve stranice s predmetkom (imenski prostor $1)',
'shortpages' => 'Kratke stranice',
'longpages' => 'DugaÄke stranice',
'deadendpages' => 'Stranice bez internih linkova',
@@ -1962,7 +2013,7 @@ Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju tekst
'listusers-editsonly' => 'Pokaži samo korisnike koji su uređivali',
'listusers-creationsort' => 'Sortiraj po datumu pravljenja',
'usereditcount' => '$1 {{PLURAL:$1|izmjena|izmjene}}',
-'usercreated' => 'Napravljeno dana $1 u $2',
+'usercreated' => '{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2',
'newpages' => 'Nove stranice',
'newpages-username' => 'KorisniÄko ime:',
'ancientpages' => 'Najstarije stranice',
@@ -2057,12 +2108,8 @@ Podržani protokoli: <tt>$1</tt> (ne stavljajte u pretragu)',
'activeusers-noresult' => 'Nije pronađen korisnik.',
# Special:Log/newusers
-'newuserlogpage' => 'Registar novih korisnika',
-'newuserlogpagetext' => 'Ovo je evidencija registracije novih korisnika.',
-'newuserlog-byemail' => 'lozinka je poslana putem e-maila',
-'newuserlog-create-entry' => 'Novi korisniÄki raÄun',
-'newuserlog-create2-entry' => 'napravljen novi raÄun za $1',
-'newuserlog-autocreate-entry' => 'RaÄun napravljen automatski',
+'newuserlogpage' => 'Registar novih korisnika',
+'newuserlogpagetext' => 'Ovo je evidencija registracije novih korisnika.',
# Special:ListGroupRights
'listgrouprights' => 'Prava korisniÄkih grupa',
@@ -2091,7 +2138,7 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
E-mail adresa koju ste unijeli u [[Special:Preferences|VaÅ¡im korisniÄkim postavkama]] će biti prikazana kao adresa poÅ¡iljaoca, tako da će primaoc poruke moći da Vam odgovori.',
'usermailererror' => 'Objekat maila je vratio grešku:',
-'defemailsubject' => '{{SITENAME}} e-pošta',
+'defemailsubject' => '{{SITENAME}} e-mail od korisnika "$1"',
'usermaildisabled' => 'KorisniÄki e-mail onemogućen',
'usermaildisabledtext' => 'Ne možete poslati e-mail drugim korisnicima na ovoj wiki',
'noemailtitle' => 'Nema adrese e-pošte',
@@ -2145,7 +2192,7 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
'watchlistcontains' => 'VaÅ¡ spisak praćenih Älanaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
'iteminvalidname' => "Problem sa '$1', neispravno ime...",
-'wlnote' => "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} naÄinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}.",
+'wlnote' => "Ispod {{PLURAL:$1|je posljednja izmjena|su posljednje '''$1''' izmjene|je posljednjih '''$1''' izmjena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zakljuÄno sa $3, $4.",
'wlshowlast' => 'Prikaži posljednjih $1 sati $2 dana $3',
'watchlist-options' => 'Opcije liste praćenja',
@@ -2211,8 +2258,6 @@ Molimo da potvrdite da ćete to uÄiniti, da razumijete posljedice te da to Äin
'actionfailed' => 'Akcija nije uspjela',
'deletedtext' => '"$1" je obrisan/a.
V. $2 za registar nedavnih brisanja.',
-'deletedarticle' => 'obrisan "[[$1]]"',
-'suppressedarticle' => 'promijeni vidljivost od "[[$1]]"',
'dellogpage' => 'Registar brisanja',
'dellogpagetext' => 'Ispod je spisak najskorijih brisanja.',
'deletionlog' => 'registar brisanja',
@@ -2260,7 +2305,10 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled tr
'unprotectedarticle' => 'uklonjena zaštita za "[[$1]]"',
'movedarticleprotection' => 'podešavanja zaštite premještena sa "[[$2]]" na "[[$1]]"',
'protect-title' => 'Promjena nivoa zaštite za "$1"',
+'protect-title-notallowed' => 'Pregled nivoa zaštite za „$1“',
'prot_1movedto2' => '[[$1]] premješten na [[$2]]',
+'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
+'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
'protect-legend' => 'Potvrdite zaštitu',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'IstiÄe:',
@@ -2282,6 +2330,7 @@ Možete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenos
'protect-level-sysop' => 'Samo administratori',
'protect-summary-cascade' => 'prenosna (kaskadna) zaštita',
'protect-expiring' => 'istiÄe $1 (UTC)',
+'protect-expiring-local' => 'istiÄe $1',
'protect-expiry-indefinite' => 'neograniÄeno',
'protect-cascade' => 'ZaÅ¡titi sve stranice koje su ukljuÄene u ovu (kaskadna zaÅ¡tita)',
'protect-cantedit' => 'Ne možete mijenjati nivo zaštite ove stranice, jer nemate prava da je uređujete..',
@@ -2342,7 +2391,6 @@ Možda ste unijeli pogrešan link, ili je revizija vraćena ili uklonjena iz arh
'undeletereset' => 'OÄisti',
'undeleteinvert' => 'Sve osim odabranog',
'undeletecomment' => 'Razlog:',
-'undeletedarticle' => 'vraćen "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno',
'undeletedfiles' => '{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
@@ -2352,6 +2400,7 @@ neko drugi je već vratio ovu stranicu.',
Provjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
'undelete-header' => 'Pogledajte [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.',
+'undelete-search-title' => 'Pretraga obrisanih stranica',
'undelete-search-box' => 'Pretraga obrisanih stranica',
'undelete-search-prefix' => 'Prikaži stranice koje poÄinju sa:',
'undelete-search-submit' => 'Traži',
@@ -2361,6 +2410,7 @@ Provjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih bris
'undelete-cleanup-error' => 'Greška pri brisanju nekorištene arhivske datoteke "$1".',
'undelete-missing-filearchive' => 'Ne može se vratiti arhivska datoteka sa ID oznakom $1 jer nije u bazi podataka.
Možda je već ranije vraćena.',
+'undelete-error' => 'Došlo je do greške pri vraćanju obrisane stranice',
'undelete-error-short' => 'Greška pri vraćanju datoteke: $1',
'undelete-error-long' => 'Desile su se pogreške pri vraćanju datoteke:
@@ -2482,6 +2532,7 @@ Unesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su
'blocklist-userblocks' => 'Sakrij blokade raÄuna',
'blocklist-tempblocks' => 'Sakrij privremene blokade',
'blocklist-addressblocks' => 'Sakrij pojedinaÄne IP blokade',
+'blocklist-rangeblocks' => 'Sakrij pojasna blokiranja',
'blocklist-timestamp' => 'Vremenska oznaka',
'blocklist-target' => 'Cilj',
'blocklist-expiry' => 'IstiÄe',
@@ -2504,6 +2555,7 @@ Unesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su
'unblocklink' => 'deblokiraj',
'change-blocklink' => 'promijeni blokadu',
'contribslink' => 'doprinosi',
+'emaillink' => 'pošalji e-mail',
'autoblocker' => 'Automatski ste blokirani jer dijelite IP adresu sa "[[User:$1|$1]]".
Razlog za blokiranje je korisnika $1 je: \'\'$2\'\'',
'blocklogpage' => 'Registar blokiranja',
@@ -2634,9 +2686,6 @@ Molimo Vas da izaberete drugo ime.',
'movepage-page-moved' => 'Stranica $1 je premještena na $2.',
'movepage-page-unmoved' => 'Stranica $1 ne može biti premještena na $2.',
'movepage-max-pages' => 'Maksimum od $1 {{PLURAL:$1|stranice|stranice|stranica}} je premješteno i više nije moguće premjestiti automatski.',
-'1movedto2' => '[[$1]] premješteno na [[$2]]',
-'1movedto2_redir' => 'premještena [[$1]] na [[$2]] putem preusmjerenja',
-'move-redirect-suppressed' => 'preusmjeravanje onemogućeno',
'movelogpage' => 'Registar premještanja',
'movelogpagetext' => 'Ispod je spisak stranica koje su premještene.',
'movesubpage' => '{{PLURAL:$1|Podstranica|Podstranice}}',
@@ -2649,7 +2698,7 @@ Molimo Vas da izaberete drugo ime.',
Odredišna stranica "[[:$1]]" već postoji.
Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
'delete_and_move_confirm' => 'Da, obriši stranicu',
-'delete_and_move_reason' => 'Obrisano da bi se napravio prostor za premještanje',
+'delete_and_move_reason' => 'Obrisano da se oslobodi mjesto za premještanje iz „[[$1]]“',
'selfmove' => 'Izvorni i ciljani naziv su isti; strana ne može da se premjesti preko same sebe.',
'immobile-source-namespace' => 'Ne mogu premjestiti stranice u imenski prostor "$1"',
'immobile-target-namespace' => 'Ne mogu se premjestiti stranice u imenski prostor "$1"',
@@ -2679,9 +2728,11 @@ Ovo se može uvesti u drugi wiki koristeći MediaWiki preko [[Special:Import|str
Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i oznaÄite želite li trenutnu verziju zajedno sa svim ranijim, ili samo trenutnu verziju sa informacijom o zadnjoj promjeni.
U drugom sluÄaju možete koristiti i vezu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Izvezi sve stranice',
'exportcuronly' => 'UkljuÄite samo trenutnu reviziju, ne cijelu historiju',
'exportnohistory' => "----
'''Pažnja:''' Izvoz cjelokupne historije stranica preko ovog obrasca je onemogućeno iz tehniÄkih razloga.",
+'exportlistauthors' => 'UkljuÄi cjelokupni popis doprinosilaca za svaku stranicu',
'export-submit' => 'Izvezi',
'export-addcattext' => 'Dodaj stranice iz kategorije:',
'export-addcat' => 'Dodaj',
@@ -2714,6 +2765,8 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
'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',
+'thumbnail-dest-create' => 'Spremanje smanjene slike ("thumbnail") na ponuđeno odredište nije moguće.',
'thumbnail_invalid_params' => 'Pogrešne postavke smanjenog prikaza',
'thumbnail_dest_directory' => 'Ne može se napraviti odredišni folder',
'thumbnail_image-type' => 'Tip slike nije podržan',
@@ -2762,6 +2815,11 @@ Nedostaje privremeni folder.',
'import-token-mismatch' => 'Izgubljeni podaci sesije.
Molimo pokušajte ponovno.',
'import-invalid-interwiki' => 'Ne može se uvesti iz navedenog wikija.',
+'import-error-edit' => 'Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je uređujete.',
+'import-error-create' => 'Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je napravite.',
+'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (interwiki).',
+'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
+'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
# Import log
'importlogpage' => 'Registar uvoza',
@@ -2771,75 +2829,88 @@ Molimo pokušajte ponovno.',
'import-logentry-interwiki' => 'uveženo ("transwikied") $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizija|revizije|revizija}} sa $2',
+# JavaScriptTest
+'javascripttest' => 'Javaskript test',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-title' => 'Izvršavanje testova za $1',
+'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
+'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
+'javascripttest-pagetext-frameworks' => 'Izaberite jedan od sledećih radnih okvira: $1',
+'javascripttest-pagetext-skins' => 'Izaberite s kojim skinom (interfejsom) želite da pokrenete probu:',
+'javascripttest-qunit-intro' => 'Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'Medijavikijin paket za testiranje – QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'VaÅ¡a korisniÄka stranica',
-'tooltip-pt-anonuserpage' => 'KorisniÄka stranica za ip koju Vi ureÄ‘ujete kao',
-'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
-'tooltip-pt-anontalk' => 'Razgovor o doprinosu sa ove IP adrese',
-'tooltip-pt-preferences' => 'Vaše postavke',
-'tooltip-pt-watchlist' => 'Spisak stranica koje pratite radi izmjena',
-'tooltip-pt-mycontris' => 'Spisak vaših doprinosa',
-'tooltip-pt-login' => 'Predlažem da se prijavite; međutim, to nije obavezno',
-'tooltip-pt-anonlogin' => 'Predlažemo da se prijavite, ali nije obavezno.',
-'tooltip-pt-logout' => 'Odjava sa projekta {{SITENAME}}',
-'tooltip-ca-talk' => 'Razgovor o sadržaju stranice',
-'tooltip-ca-edit' => 'Možete da uređujete ovu stranicu.
+'tooltip-pt-userpage' => 'VaÅ¡a korisniÄka stranica',
+'tooltip-pt-anonuserpage' => 'KorisniÄka stranica za ip koju Vi ureÄ‘ujete kao',
+'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
+'tooltip-pt-anontalk' => 'Razgovor o doprinosu sa ove IP adrese',
+'tooltip-pt-preferences' => 'Vaše postavke',
+'tooltip-pt-watchlist' => 'Spisak stranica koje pratite radi izmjena',
+'tooltip-pt-mycontris' => 'Spisak vaših doprinosa',
+'tooltip-pt-login' => 'Predlažem da se prijavite; međutim, to nije obavezno',
+'tooltip-pt-anonlogin' => 'Predlažemo da se prijavite, ali nije obavezno.',
+'tooltip-pt-logout' => 'Odjava sa projekta {{SITENAME}}',
+'tooltip-ca-talk' => 'Razgovor o sadržaju stranice',
+'tooltip-ca-edit' => 'Možete da uređujete ovu stranicu.
Molimo da prije snimanja koristite dugme za pretpregled',
-'tooltip-ca-addsection' => 'ZapoÄnite novu sekciju.',
-'tooltip-ca-viewsource' => 'Ova stranica je zaštićena.
+'tooltip-ca-addsection' => 'ZapoÄnite novu sekciju.',
+'tooltip-ca-viewsource' => 'Ova stranica je zaštićena.
Možete vidjeti njen izvor',
-'tooltip-ca-history' => 'Prethodne verzije ove stranice',
-'tooltip-ca-protect' => 'Zaštiti ovu stranicu',
-'tooltip-ca-unprotect' => 'Promijeni zaštitu za ovu stranicu',
-'tooltip-ca-delete' => 'Izbriši ovu stranicu',
-'tooltip-ca-undelete' => 'Vratite izmjene koje su naÄinjene prije brisanja stranice',
-'tooltip-ca-move' => 'Premjesti ovu stranicu',
-'tooltip-ca-watch' => 'Dodajte ovu stranicu na Vaš spisak praćenja',
-'tooltip-ca-unwatch' => 'Izbrišite ovu stranicu sa spiska praćenja',
-'tooltip-search' => 'Pretraži ovaj wiki',
-'tooltip-search-go' => 'Idi na stranicu s upravo ovakvim imenom ako postoji',
-'tooltip-search-fulltext' => 'Pretraga stranica sa ovim tekstom',
-'tooltip-p-logo' => 'Posjetite glavnu stranicu',
-'tooltip-n-mainpage' => 'Posjetite glavnu stranu',
-'tooltip-n-mainpage-description' => 'Posjetite glavnu stranicu',
-'tooltip-n-portal' => 'O projektu, Å¡to možete uÄiniti, gdje možete naći stvari',
-'tooltip-n-currentevents' => 'Pronađi dodatne informacije o trenutnim događajima',
-'tooltip-n-recentchanges' => 'Spisak nedavnih izmjena na wikiju.',
-'tooltip-n-randompage' => 'Otvorite sluÄajnu stranicu',
-'tooltip-n-help' => 'Mjesto gdje možete neÅ¡to da nauÄite',
-'tooltip-t-whatlinkshere' => 'Spisak svih stranica povezanih sa ovim',
-'tooltip-t-recentchangeslinked' => 'Nedavne izmjene ovdje povezanih stranica',
-'tooltip-feed-rss' => 'RSS feed za ovu stranicu',
-'tooltip-feed-atom' => 'Atom feed za ovu stranicu',
-'tooltip-t-contributions' => 'Pogledajte listu doprinosa ovog korisnika',
-'tooltip-t-emailuser' => 'Pošaljite e-mail ovom korisniku',
-'tooltip-t-upload' => 'Postavi datoteke',
-'tooltip-t-specialpages' => 'Popis svih posebnih stranica',
-'tooltip-t-print' => 'Verzija ove stranice za Å¡tampanje',
-'tooltip-t-permalink' => 'Stalni link ove verzije stranice',
-'tooltip-ca-nstab-main' => 'Pogledajte sadržaj stranice',
-'tooltip-ca-nstab-user' => 'Pogledajte korisniÄku stranicu',
-'tooltip-ca-nstab-media' => 'Pogledajte medijski fajl',
-'tooltip-ca-nstab-special' => 'Ovo je posebna stranica, te je ne možete uređivati',
-'tooltip-ca-nstab-project' => 'Pogledajte stranicu projekta',
-'tooltip-ca-nstab-image' => 'Vidi stranicu datoteke/fajla',
-'tooltip-ca-nstab-mediawiki' => 'Pogledajte sistemsku poruku',
-'tooltip-ca-nstab-template' => 'Pogledajte Å¡ablon',
-'tooltip-ca-nstab-help' => 'Pogledajte stranicu za pomoć',
-'tooltip-ca-nstab-category' => 'Pogledajte stranicu kategorije',
-'tooltip-minoredit' => 'OznaÄite ovo kao manju izmjenu',
-'tooltip-save' => 'Snimite vaše izmjene',
-'tooltip-preview' => 'Prethodni pregled stranice, molimo koristiti prije snimanja!',
-'tooltip-diff' => 'Prikaz izmjena koje ste napravili u tekstu',
-'tooltip-compareselectedversions' => 'Pogledajte pazlike između dvije selektovane verzije ove stranice.',
-'tooltip-watch' => 'Dodajte ovu stranicu na Vaš spisak praćenja',
-'tooltip-recreate' => 'Ponovno pravljenje stranice iako je već brisana',
-'tooltip-upload' => 'ZapoÄni postavljanje',
-'tooltip-rollback' => '"Povrat" briÅ¡e izmjenu/e posljednjeg ureÄ‘ivaÄa ove stranice jednim klikom',
-'tooltip-undo' => 'Vraća ovu izmjenu i otvara formu uređivanja u modu pretpregleda.
+'tooltip-ca-history' => 'Prethodne verzije ove stranice',
+'tooltip-ca-protect' => 'Zaštiti ovu stranicu',
+'tooltip-ca-unprotect' => 'Promijeni zaštitu za ovu stranicu',
+'tooltip-ca-delete' => 'Izbriši ovu stranicu',
+'tooltip-ca-undelete' => 'Vratite izmjene koje su naÄinjene prije brisanja stranice',
+'tooltip-ca-move' => 'Premjesti ovu stranicu',
+'tooltip-ca-watch' => 'Dodajte ovu stranicu na Vaš spisak praćenja',
+'tooltip-ca-unwatch' => 'Izbrišite ovu stranicu sa spiska praćenja',
+'tooltip-search' => 'Pretraži ovaj wiki',
+'tooltip-search-go' => 'Idi na stranicu s upravo ovakvim imenom ako postoji',
+'tooltip-search-fulltext' => 'Pretraga stranica sa ovim tekstom',
+'tooltip-p-logo' => 'Posjetite glavnu stranicu',
+'tooltip-n-mainpage' => 'Posjetite glavnu stranu',
+'tooltip-n-mainpage-description' => 'Posjetite glavnu stranicu',
+'tooltip-n-portal' => 'O projektu, Å¡to možete uÄiniti, gdje možete naći stvari',
+'tooltip-n-currentevents' => 'Pronađi dodatne informacije o trenutnim događajima',
+'tooltip-n-recentchanges' => 'Spisak nedavnih izmjena na wikiju.',
+'tooltip-n-randompage' => 'Otvorite sluÄajnu stranicu',
+'tooltip-n-help' => 'Mjesto gdje možete neÅ¡to da nauÄite',
+'tooltip-t-whatlinkshere' => 'Spisak svih stranica povezanih sa ovim',
+'tooltip-t-recentchangeslinked' => 'Nedavne izmjene ovdje povezanih stranica',
+'tooltip-feed-rss' => 'RSS feed za ovu stranicu',
+'tooltip-feed-atom' => 'Atom feed za ovu stranicu',
+'tooltip-t-contributions' => 'Pogledajte listu doprinosa ovog korisnika',
+'tooltip-t-emailuser' => 'Pošaljite e-mail ovom korisniku',
+'tooltip-t-upload' => 'Postavi datoteke',
+'tooltip-t-specialpages' => 'Popis svih posebnih stranica',
+'tooltip-t-print' => 'Verzija ove stranice za Å¡tampanje',
+'tooltip-t-permalink' => 'Stalni link ove verzije stranice',
+'tooltip-ca-nstab-main' => 'Pogledajte sadržaj stranice',
+'tooltip-ca-nstab-user' => 'Pogledajte korisniÄku stranicu',
+'tooltip-ca-nstab-media' => 'Pogledajte medijski fajl',
+'tooltip-ca-nstab-special' => 'Ovo je posebna stranica, te je ne možete uređivati',
+'tooltip-ca-nstab-project' => 'Pogledajte stranicu projekta',
+'tooltip-ca-nstab-image' => 'Vidi stranicu datoteke/fajla',
+'tooltip-ca-nstab-mediawiki' => 'Pogledajte sistemsku poruku',
+'tooltip-ca-nstab-template' => 'Pogledajte Å¡ablon',
+'tooltip-ca-nstab-help' => 'Pogledajte stranicu za pomoć',
+'tooltip-ca-nstab-category' => 'Pogledajte stranicu kategorije',
+'tooltip-minoredit' => 'OznaÄite ovo kao manju izmjenu',
+'tooltip-save' => 'Snimite vaše izmjene',
+'tooltip-preview' => 'Prethodni pregled stranice, molimo koristiti prije snimanja!',
+'tooltip-diff' => 'Prikaz izmjena koje ste napravili u tekstu',
+'tooltip-compareselectedversions' => 'Pogledajte pazlike između dvije selektovane verzije ove stranice.',
+'tooltip-watch' => 'Dodajte ovu stranicu na Vaš spisak praćenja',
+'tooltip-watchlistedit-normal-submit' => 'Ukloni naslove',
+'tooltip-watchlistedit-raw-submit' => 'Ažuriraj spisak praćenja',
+'tooltip-recreate' => 'Ponovno pravljenje stranice iako je već brisana',
+'tooltip-upload' => 'ZapoÄni postavljanje',
+'tooltip-rollback' => '"Povrat" briÅ¡e izmjenu/e posljednjeg ureÄ‘ivaÄa ove stranice jednim klikom',
+'tooltip-undo' => 'Vraća ovu izmjenu i otvara formu uređivanja u modu pretpregleda.
Dozvoljava unošenje razloga za to u sažetku.',
-'tooltip-preferences-save' => 'Snimi postavke',
-'tooltip-summary' => 'Unesite kratki sažetak',
+'tooltip-preferences-save' => 'Snimi postavke',
+'tooltip-summary' => 'Unesite kratki sažetak',
# Metadata
'notacceptable' => 'Viki server ne može da pruži podatke u onom formatu koji VaÅ¡ klijent može da proÄita.',
@@ -2892,9 +2963,6 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
# Patrol log
'patrol-log-page' => 'Evidencija patroliranja',
'patrol-log-header' => 'Ovdje se nalazi evidencija patroliranih revizija.',
-'patrol-log-line' => 'oznaÄeno $1 od $2 patrolirano $3',
-'patrol-log-auto' => '(automatsko)',
-'patrol-log-diff' => 'revizija $1',
'log-show-hide-patrol' => '$1 zapis patroliranja',
# Image deletion
@@ -2921,11 +2989,11 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
'file-info' => 'veliÄina datoteke: $1, MIME tip: $2',
'file-info-size' => '$1 × $2 piksela, veliÄina datoteke/fajla: $3, MIME tip: $4',
'file-info-size-pages' => '$1 × $2 piksela, veliÄina datoteke: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}',
-'file-nohires' => '<small>Veća rezolucija nije dostupna.</small>',
+'file-nohires' => 'Veća rezolucija nije dostupna.',
'svg-long-desc' => 'SVG fajl, nominalno $1 × $2 piksela, veliÄina fajla: $3',
'show-big-image' => 'Puna rezolucija',
-'show-big-image-preview' => '<small>VeliÄina ovog prikaza: $1.</small>',
-'show-big-image-other' => '<small>Ostale rezolucije: $1.</small>',
+'show-big-image-preview' => 'VeliÄina ovog prikaza: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.',
'show-big-image-size' => '$1 × $2 piksela',
'file-info-gif-looped' => 'stalno iznova',
'file-info-gif-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄice|sliÄica}}',
@@ -2945,6 +3013,13 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
'bydate' => 'po datumu',
'sp-newimages-showfrom' => 'Prikaz novih datoteka poÄev od $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekunde|$1 sekundi}}',
+'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}}',
+'ago' => 'prije $1',
+
# Bad image list
'bad_image_list' => "Koristi se sljedeći format:
@@ -3447,13 +3522,6 @@ Ovaj kod za potvrdu će isteći u $4.',
'scarytranscludefailed' => '[Neuspješno preusmjerenje šablona na $1]',
'scarytranscludetoolong' => '[URL je predugaÄak]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks za ovu stranicu:<br />
-$1',
-'trackbackremove' => '([$1 Brisanje])',
-'trackbacklink' => 'Vraćanje',
-'trackbackdeleteok' => 'Trackback je uspješno obrisan.',
-
# Delete conflict
'deletedwhileediting' => "'''Upozorenje''': Ova stranica je obrisana prije nego Å¡to ste poÄeli ureÄ‘ivati!",
'confirmrecreate' => "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovaj Älanak poÅ¡to ste poÄeli ureÄ‘ivanje sa razlogom:
@@ -3535,6 +3603,9 @@ TakoÄ‘er možete [[Special:EditWatchlist|koristiti standardni ureÄ‘ivaÄ]].',
'watchlisttools-edit' => 'Vidi i uredi listu praćenja',
'watchlisttools-raw' => 'Uredi grubu listu praćenja',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])',
+
# Core parser functions
'unknown_extension_tag' => 'Nepoznata oznaka ekstenzije "$1"',
'duplicate-defaultsort' => '\'\'\'Upozorenje\'\'\': Postavljeni kljuÄ sortiranja "$2" zamjenjuje raniji kljuÄ "$1".',
@@ -3633,13 +3704,16 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
# Special:ComparePages
-'comparepages' => 'Usporedi stranice',
-'compare-selector' => 'Usporedi revizije stranica',
-'compare-page1' => 'Stranica 1',
-'compare-page2' => 'Stranica 2',
-'compare-rev1' => 'Ispravljanje 1',
-'compare-rev2' => 'Ispravljanje 2',
-'compare-submit' => 'Usporedi',
+'comparepages' => 'Usporedi stranice',
+'compare-selector' => 'Usporedi revizije stranica',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Ispravljanje 1',
+'compare-rev2' => 'Ispravljanje 2',
+'compare-submit' => 'Usporedi',
+'compare-invalid-title' => 'Naslov koji ste unijeli je nevaljan.',
+'compare-title-not-exists' => 'Navedeni naslov ne postoji.',
+'compare-revision-not-exists' => 'Navedena revizija ne postoji.',
# Database error messages
'dberr-header' => 'Ovaj wiki ima problem',
@@ -3666,4 +3740,90 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
+# New logging system
+'logentry-delete-delete' => '$1 obrisa stranicu $3',
+'logentry-delete-restore' => '$1 povrati stranicu $3',
+'logentry-delete-event' => '$1 promijeni vidljivost {{PLURAL:$5|događaja u historiji|$5 događaja u historiji|$5 događaja u historiji}} na $3: $4',
+'logentry-delete-revision' => '$1 promijeni vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
+'logentry-delete-event-legacy' => '$1 promijeni vidljivost događajâ u historiji na $3',
+'logentry-delete-revision-legacy' => '$1 promijeni vidljivost izmjenâ na stranici $3',
+'logentry-suppress-delete' => '$1 potisnu stranicu $3',
+'logentry-suppress-event' => '$1 potajno promijeni vidljivost {{PLURAL:$5|događaja u historiji|$5 događaja u historiji|$5 događaja u historiji}} na $3: $4',
+'logentry-suppress-revision' => '$1 potajno promijeni vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
+'logentry-suppress-event-legacy' => '$1 potajno promijeni vidljivost događajâ u registru na $3',
+'logentry-suppress-revision-legacy' => '$1 potajno promijeni vidljivost izmjenâ na stranici $3',
+'revdelete-content-hid' => 'sadržaj je sakriven',
+'revdelete-summary-hid' => 'sažetak izmjene je sakriven',
+'revdelete-uname-hid' => 'korisniÄko ime sakriveno',
+'revdelete-content-unhid' => 'sadržaj je otkriven',
+'revdelete-summary-unhid' => 'sažetak izmjene je otkriven',
+'revdelete-uname-unhid' => 'korisniÄko ime je otkriveno',
+'revdelete-restricted' => 'primijenjena ograniÄenja za administratore',
+'revdelete-unrestricted' => 'uklonjena ograniÄenja za administratore',
+'logentry-move-move' => '$1 premjesti stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 premjesti stranicu $3 na $4 bez ostavljanja preusmjerenja',
+'logentry-move-move_redir' => '$1 je premjestio stranicu $3 na $4 preko preusmjerenja',
+'logentry-move-move_redir-noredirect' => '$1 premjesti stranicu $3 na $4 preko preusmjerenja bez ostavljanja preusmjerenja',
+'logentry-patrol-patrol' => '$1 oznaÄi izmjenu $4 pregledane stranice $3',
+'logentry-patrol-patrol-auto' => '$1 samostalno oznaÄi izmjenu $4 pregledane stranice $3',
+'logentry-newusers-newusers' => '$1 otvori korisniÄki raÄun',
+'logentry-newusers-create' => '$1 otvori korisniÄki raÄun',
+'logentry-newusers-create2' => '$1 otvori korisniÄki raÄun $3',
+'logentry-newusers-autocreate' => 'RaÄun $1 je samostalno otvoren',
+'newuserlog-byemail' => 'lozinka je poslana putem e-maila',
+
+# Feedback
+'feedback-bugornote' => 'Ako ste spremni da detaljno opiÅ¡ete tehniÄki problem, onda [$1 prijavite greÅ¡ku].
+U suprotnom, poslužite se jednostavnim obrascem ispod. VaÅ¡ komentar će stajati na stranici „[$3 $2]“, zajedno s korisniÄkim imenom i pregledaÄem koji koristite.',
+'feedback-subject' => 'Tema:',
+'feedback-message' => 'Poruka:',
+'feedback-cancel' => 'Odustani',
+'feedback-submit' => 'Pošalji povratnu informaciju',
+'feedback-adding' => 'Dodajem povratne informacije na stranicu...',
+'feedback-error1' => 'Greška: neprepoznat rezultat od API-ja',
+'feedback-error2' => 'Greška: Uređivanje nije uspjelo',
+'feedback-error3' => 'Greška: nema odgovora od API-ja',
+'feedback-thanks' => 'Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.',
+'feedback-close' => 'Gotovo',
+'feedback-bugcheck' => 'Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom "bugu"].',
+'feedback-bugnew' => 'Provereno. Prijavi novu grešku',
+
+# API errors
+'api-error-badaccess-groups' => 'Nemate ovlasti da postavljate datoteke na ovoj wiki.',
+'api-error-badtoken' => 'Unutrašnja greška: token nije ispravan.',
+'api-error-copyuploaddisabled' => 'Postavljanja putem URL-a su onemogućena na ovom serveru.',
+'api-error-duplicate' => 'Već postoji {{PLURAL:$1|[$2 druga datoteka]|[$2 druge datoteke]}} na ovoj stranici sa istim sadržajem',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su već obrisane',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Dvojna datoteka|Dvojne datoteke}}',
+'api-error-empty-file' => 'Datoteka koju ste poslali je bila prazna.',
+'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
+'api-error-fetchfileerror' => 'Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.',
+'api-error-file-too-large' => 'Datoteka koju ste poslali je bila prevelika.',
+'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
+'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
+'api-error-hookaborted' => 'Izmjena koji ste pokuÅ¡ali naÄiniti je otkazana preko "kuke" proÅ¡irenja mediawiki softvera.',
+'api-error-http' => 'Unutrašnja greška: ne može se spojiti na server.',
+'api-error-illegal-filename' => 'Ime datoteke nije dopušteno.',
+'api-error-internal-error' => 'Unutrašnja greška: pojavio se neki problem sa obradom vašeg postavljanja na wiki.',
+'api-error-invalid-file-key' => 'Unutrašnja greška: datoteka nije pronađena u privremenom skladištu.',
+'api-error-missingparam' => 'Unutrašnja greška: nedostaju parametri u zahtjevu.',
+'api-error-missingresult' => 'Unutrašnja greška: ne može se otkriti da li je kopiranje uspjelo.',
+'api-error-mustbeloggedin' => 'Morate biti prijavljeni da biste postavljali datoteke.',
+'api-error-mustbeposted' => 'Unutrašnja greška: ne koristi se ispravan HTTP metod.',
+'api-error-noimageinfo' => 'Postavljanje je uspjelo, ali server nam nije dao nikakvu informaciju o datoteci.',
+'api-error-nomodule' => 'Unutrašnja greška: nije postavljen modul za postavljanje.',
+'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
+'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
+'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-timeout' => 'Server nije odgovorio unutar oÄekivanog vremena.',
+'api-error-unclassified' => 'Desila se nepoznata greška',
+'api-error-unknown-code' => 'Nepoznata greška: "$1"',
+'api-error-unknown-error' => 'Unutrašnja greška: desila se neka greška pri pokušaju postavljanja vaše datoteke.',
+'api-error-unknown-warning' => 'Nepoznato upozorenje: $1',
+'api-error-unknownerror' => 'Nepoznata greška: "$1"',
+'api-error-uploaddisabled' => 'Postavljanje je onemogućeno na ovoj wiki.',
+'api-error-verification-error' => 'Ova datoteka je možda oštećenja ili ima pogrešan nastavak.',
+
);
diff --git a/languages/messages/MessagesShi.php b/languages/messages/MessagesShi.php
index 2dae35a1..74a159e5 100644
--- a/languages/messages/MessagesShi.php
+++ b/languages/messages/MessagesShi.php
@@ -363,7 +363,6 @@ Akks ad iskrt kra yaá¸n',
'badtitle' => 'Azwl ur ifulkin',
'badtitletext' => 'Azwl n tasna lli trit ur igadda, ixwa, niɣd iga aswl n gr tutlayt niḠngr tuwwurins ur izdimzyan. Ẓr urgis tgit kra nu uskkil niɣd mnnaw lli gis ur llanin',
'viewsource' => 'Mel iɣbula',
-'viewsourcefor' => 'l $1',
# Virus scanner
'virus-unknownscanner' => 'antivirus oritwsan',
@@ -467,9 +466,6 @@ IÉ£ tklikkit tiklit yaá¸n f tjrrayt « {{int:savearticle}} », aẓṛig rad it
'summary-preview' => 'Tiẓṛi n tagá¸wit:',
'blockedtitle' => 'lmostkhdim ad itbloka',
'blockednoreason' => 'ta yan sabab oritfki',
-'blockedoriginalsource' => "Tangalt taɣbalut '''$1''' ar ttuymmal ɣ uzddar.",
-'blockededitsource' => "Aṭṛiṣ n iẓṛign nk llid tiwid i '''$1''' rad tnin taft ɣiḠɣ uzddar",
-'whitelistedittitle' => 'Illa zwar fllak ad tilit ɣ ifalan bac ad tsbadlt ma trit.',
'whitelistedittext' => 'Illa fllak ad tilit ɣ $1 bac adak ittuyskar ad tsbadlt mayllan ɣid',
'confirmedittext' => 'Illa fllak ad talst i tansa nk tbratin urta tsbadalt tisniwin.
Kcm zwar tft tansan nk tbratin ɣ [[Special:Preferences|Timssusmin n umqdac]].',
@@ -557,15 +553,6 @@ ikhssak ola kiyi ador tnqilt ɣtamani yadni.
'revdel-restore-visible' => 'Imsurritn lli baynnin',
'pagehist' => 'Amzruy n tasna',
'deletedhist' => 'Amzruy lli ittuykkasn',
-'revdelete-content' => 'Mayllan',
-'revdelete-summary' => 'Awal uflla n imbddln',
-'revdelete-uname' => 'Assaɣ nu-msxdan',
-'revdelete-restricted' => 'iskr aqn i indbaln',
-'revdelete-unrestricted' => 'Aqn iḥiyd i indbaln',
-'revdelete-hid' => 'ador tsbaynt $1',
-'revdelete-unhid' => 'sbaynd $1',
-'revdelete-log-message' => '$1 i $2 lqm{{PLURAL:$2||s}}',
-'logdelete-log-message' => '$1 f $2 amussu{{PLURAL:$2||s}}',
# History merging
'mergehistory' => 'Smun imzruyn n tisniwin.',
@@ -692,7 +679,7 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
'prefs-rc' => 'Imbddeln imggura',
'prefs-watchlist' => 'lista n tabiaa',
'prefs-watchlist-days' => 'osfan liratzrt gh lista n umdfur',
-'prefs-watchlist-days-max' => 'lmaximum 7 osfan',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-token' => 'tasarut n list n omdfor',
'prefs-misc' => 'motafarriqat',
'prefs-resetpass' => 'bdl awal ihdan',
@@ -788,7 +775,6 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
'newpageletter' => 'A',
'boteditletter' => 'q',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 iżŗi {{PLURAL:$1|amsqdac|imsqdacn}}]',
'rc_categories_any' => 'wanna',
'rc-change-size' => '$1',
@@ -801,7 +787,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-backlink' => '↠$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',
@@ -906,8 +891,7 @@ Mel imbddeln z tisniwin li ittuyzdayni bla tasna li trit.',
'linksearch-line' => '$1 tmmuttid z $2',
# Special:Log/newusers
-'newuserlogpage' => 'AÉ£mis n willi mmurzmn imiá¸an amsqdac',
-'newuserlog-create-entry' => 'Amá¸an amaynu n umsqdac',
+'newuserlogpage' => 'AÉ£mis n willi mmurzmn imiá¸an amsqdac',
# Special:ListGroupRights
'listgrouprights-members' => 'Umuɣ n midn',
@@ -940,7 +924,6 @@ illa fllak ad ni tẓrt is trit ast tkkist d is tssnt marad igguṛu iɣt tkkist
'actionfailed' => 'Tawwuri i xsrn',
'deletedtext' => '"$1" ttuykkas.
Ẓṛ $2 inɣmas imggura n ma ittuykkasn',
-'deletedarticle' => 'Kkiss "[[$1]]"',
'dellogpage' => 'Qqiyd akkas ad',
'deletecomment' => '! Maɣ:',
'deleteotherreason' => 'Wayyaá¸/ maf ittuykkas yaá¸n',
@@ -975,7 +958,6 @@ Ha riglaj n ɣila lli f tlla tasna '''$1''' :",
# Undelete
'undeletelink' => 'mel/rard',
'undeleteviewlink' => 'Ẓṛ',
-'undeletedarticle' => 'Isurrid "[[$1]]"',
# Namespace form on various pages
'namespace' => 'Taɣult',
@@ -1012,7 +994,6 @@ Ha riglaj n ɣila lli f tlla tasna '''$1''' :",
'whatlinkshere' => 'May izdayn ɣid',
'whatlinkshere-title' => 'Tisniwin li izdayn d "$1"',
'whatlinkshere-page' => 'Tasna:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Tasnawinad ar slkamnt i '''[[:$1]]''':",
'nolinkshere' => "Ur llant tasniwin li izdin d '''[[:$1]]'''.",
'nolinkshere-ns' => "Ur tlla kra n tasna izdin d '''[[:$1]]''' ɣ tɣult l-ittuystayn.",
@@ -1047,36 +1028,33 @@ Ha riglaj n ɣila lli f tlla tasna '''$1''' :",
'block-log-flags-nocreate' => 'Ammurzm n umiá¸an urak ittuyskar',
# Move page
-'movepagetext' => "Swwur s tifrkkitad bac ad sbadlt uzwl tasna yad , s usmmattay n umzru ns s uzwl amaynu . AssaÉ£ Aqbur rad ig É£il yan usmmattay n tasna s uzwl (titre) amynu . Tâá¸art ad s tgt immattayn n É£il f was fwas utumatik s dar uswl amaynu. IÉ£ tstit bac ad tskrt . han ad ur ttut ad tẓrt kullu [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Illa fllak ad ur ttut masd izdayn rad tmattayn s sin igmmaá¸n ur igan yan.
+'movepagetext' => "Swwur s tifrkkitad bac ad sbadlt uzwl tasna yad , s usmmattay n umzru ns s uzwl amaynu . AssaÉ£ Aqbur rad ig É£il yan usmmattay n tasna s uzwl (titre) amynu . Tâá¸art ad s tgt immattayn n É£il f was fwas utumatik s dar uswl amaynu. IÉ£ tstit bac ad tskrt . han ad ur ttut ad tẓrt kullu [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Illa fllak ad ur ttut masd izdayn rad tmattayn s sin igmmaá¸n ur igan yan.
Smmem masd tasna ur rad tmmatti iÉ£ tlla kra n yat yaá¸n lli ilan asw zund nttat . Abla É£ dars amzruy É£ ur illa umay, nÉ£d yan usmmattay ifssusn.
''' Han !'''
Maya Iẓá¸ar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fllak ad urtskr mara yigriẓ midn d kiyyin lli iswurn É£ tasna yad. issin mara tskr urta titskrt..",
-'movepagetalktext' => "Tasna n umsgdal (imdiwiln) lli izdin d ɣta iɣ tlla, rad as ibadl w-assaɣ utumatik '''abla iɣ :'''
+'movepagetalktext' => "Tasna n umsgdal (imdiwiln) lli izdin d ɣta iɣ tlla, rad as ibadl w-assaɣ utumatik '''abla iɣ :'''
* tsmmuttim tasna s yan ugmmaḠwassaɣ, niɣd
* tasna n umsgdal( imdiwiln) tlla s wassaɣ ad amaynu, niɣd
* iɣ tkrjm tasatmt ad n uzddar
Γ Tiklayad illa flla tun ad tsbadlm assaɣ niɣt tsmun mayad s ufus ɣ yat, iɣ tram",
-'movearticle' => 'Smmatti tasna niɣ as tsbudlt assaɣ',
-'newtitle' => 'dar w-assaɣ amaynu:',
-'move-watch' => 'Tfr tisniwin timaynutin d timẓlay',
-'movepagebtn' => 'Smmatti tasna niɣ as tsbudlt assaɣ',
-'pagemovedsub' => 'tmmutti bla tamukrist',
-'movepage-moved' => '\'\'\'"$1" tmmutti s "$2"\'\'\'',
-'articleexists' => 'Tlla yad tasna illan assaÉ£ zund É£wa niÉ£d assaÉ£ llid tiwid urt iga. Sti assaÉ£ yaá¸n tarmt.',
-'talkexists' => 'Tasna tmmutti mzyan, mac tasna n umsgdal (imdiwiln) ur tmmutti acku tlla f wassaɣ ad amaynu.Illa fllak aggisnt tskrt yat s ufus nk.',
-'movedto' => 'Tmmuti s',
-'movetalk' => 'Sbadl assaɣ tasna n imdiwiln lli izdin d ɣi.',
-'1movedto2' => 'Ad tmmatti z [[$1]] s [[$2]]',
-'1movedto2_redir' => 'ad tmmatti [[$1]] s [[$2]] trẓ asurriti ns',
-'move-redirect-suppressed' => 'asuritti n ittuykkasn',
-'movelogpage' => 'IÉ£misn n ismmattrayn',
-'movelogpagetext' => 'Γid umuɣ n tisniwin lli sbadlnin assaɣ d tilli mmuttini.',
-'movesubpage' => 'Ddu-tasna {{PLURAL:$1||s}}',
-'movereason' => 'Maɣ:',
-'revertmove' => 'Rard',
+'movearticle' => 'Smmatti tasna niɣ as tsbudlt assaɣ',
+'newtitle' => 'dar w-assaɣ amaynu:',
+'move-watch' => 'Tfr tisniwin timaynutin d timẓlay',
+'movepagebtn' => 'Smmatti tasna niɣ as tsbudlt assaɣ',
+'pagemovedsub' => 'tmmutti bla tamukrist',
+'movepage-moved' => '\'\'\'"$1" tmmutti s "$2"\'\'\'',
+'articleexists' => 'Tlla yad tasna illan assaÉ£ zund É£wa niÉ£d assaÉ£ llid tiwid urt iga. Sti assaÉ£ yaá¸n tarmt.',
+'talkexists' => 'Tasna tmmutti mzyan, mac tasna n umsgdal (imdiwiln) ur tmmutti acku tlla f wassaɣ ad amaynu.Illa fllak aggisnt tskrt yat s ufus nk.',
+'movedto' => 'Tmmuti s',
+'movetalk' => 'Sbadl assaɣ tasna n imdiwiln lli izdin d ɣi.',
+'movelogpage' => 'IÉ£misn n ismmattrayn',
+'movelogpagetext' => 'Γid umuɣ n tisniwin lli sbadlnin assaɣ d tilli mmuttini.',
+'movesubpage' => 'Ddu-tasna {{PLURAL:$1||s}}',
+'movereason' => 'Maɣ:',
+'revertmove' => 'Rard',
# Export
'export' => 'assufɣ n tasniwin',
@@ -1154,17 +1132,13 @@ Maya Iẓá¸ar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fl
'tooltip-undo' => '"Sglb" ḥiyd ambdl ad t mmurẓmt tasatmt n umbdl ɣ umuḠtiẓri tamzwarut.',
'tooltip-summary' => 'Skcm yat tayafut imẓẓin',
-# Patrol log
-'patrol-log-line' => 'ircm $1 d $2 zu nɣra daɣ $3',
-'patrol-log-diff' => 'Amzṛi daɣ $1',
-
# Browsing diffs
'previousdiff' => 'Imbddln imzwura',
'nextdiff' => 'Ambdl d ittfrn →',
# Media information
'file-info-size' => '$1 × $2 piksil, asdaw tugut: $3, MIME anaw: $4',
-'file-nohires' => '↓<small>Ur tlli tabudut tamqrant.</small>',
+'file-nohires' => '↓Ur tlli tabudut tamqrant.',
'svg-long-desc' => 'Asdaw SVG, Tabadut n $1 × $2 ifrdan, Tiddi : $3',
'show-big-image' => 'balak',
@@ -1173,6 +1147,11 @@ Maya Iẓá¸ar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fl
ghir lhwayj n lista (stour libdounin s *) karaytyo7asab',
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'ⵜⴰⵛâµâµƒâµ‰âµœ',
+'variantname-shi-latn' => 'Tašlḥiyt',
+'variantname-shi' => 'disable',
+
# Metadata
'metadata' => 'isfka n mita',
'metadata-help' => 'Asdaw ad llan gis inÉ£misn yaá¸nin lli tfl lkamira tuá¹­unit niÉ£d aá¹£fḠn uxddam lliÉ£ ay sgadda asdaw ad',
@@ -1253,10 +1232,6 @@ WiyyaḠraggis ḥbun s ɣiklli sttin kkan gantn.
'monthsall' => 'kullu',
'limitall' => 'Kullu',
-# Trackbacks
-'trackbackremove' => '([$1 mhi])',
-'trackbacklink' => 'Trackback',
-
# Delete conflict
'recreate' => 'awd skr',
@@ -1346,4 +1321,8 @@ WiyyaḠraggis ḥbun s ɣiklli sttin kkan gantn.
'htmlform-reset' => 'sglbd tghyirat',
'htmlform-selectorother-other' => 'wayya',
+# New logging system
+'revdelete-restricted' => 'iskr aqn i indbaln',
+'revdelete-unrestricted' => 'Aqn iḥiyd i indbaln',
+
);
diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php
index a9ba07e3..ba503d07 100644
--- a/languages/messages/MessagesSi.php
+++ b/languages/messages/MessagesSi.php
@@ -60,6 +60,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'සියළු_පණිවුඩ' ),
'Allpages' => array( 'සියළු_පිටු' ),
'Ancientpages' => array( 'පුරà·à¶­à¶±_පිටු' ),
+ 'Badtitle' => array( 'නුසුසුදු_මà·à¶­à·˜à¶šà·à·€' ),
'Blankpage' => array( 'හිස්_පිටුව' ),
'Block' => array( 'à·€à·à¶»à¶«à¶º_කරන්න', 'IP_à·€à·à¶»à¶«à¶º_කරන්න', 'පරිà·à·“ලක_à·€à·à¶»à¶«à¶º_කරන්න' ),
'Blockme' => array( 'මà·_à·€à·à¶»à¶«à¶º_කරන්න' ),
@@ -148,46 +149,46 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#යළියොමුව', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'වත්මන්මà·à·ƒà¶º', 'වත්මන්මà·à·ƒà¶º2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'වත්මන්මà·à·ƒà¶º1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'වත්මන්මà·à·ƒà¶±à·à¶¸à¶º', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'වත්මන්මà·à·ƒà¶±à·à¶¸à¶ºà¶´à·œà¶¯à·”', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'වත්මන්මà·à·ƒà¶ºà¶šà·™à¶§à·’', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'වත්මන්දිනය', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'වත්මන්දිනය2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'වත්මන්දිනනà·à¶¸à¶º', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'වත්මන්වසර', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'වත්මන්වේලà·à·€', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'වත්මන්පà·à¶º', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'දේà·à·“යමà·à·ƒà¶º', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'දේà·à·“යමà·à·ƒà¶±à·à¶¸à¶º', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'දේà·à·“යමà·à·ƒà¶±à·à¶¸à¶ºà¶´à·œà¶¯à·”', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'දේà·à·“යමà·à·ƒà¶ºà¶šà·™à¶§à·’', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'දේà·à·“යදිනය', 'LOCALDAY' ),
- 'localday2' => array( '1', 'දේà·à·“යදිනය2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'දේà·à·“යදිනනà·à¶¸à¶º', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'දේà·à·“යවසර', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'දේà·à·“යවේලà·à·€', 'LOCALTIME' ),
- 'localhour' => array( '1', 'දේà·à·“යපà·à¶º', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'පිටුසංඛ්â€à¶ºà·à·€', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ලිපිසංඛ්â€à¶ºà·à·€', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ගොනුසංඛ්â€à¶ºà·à·€', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'පරිà·à·“ලකයන්සංඛ්â€à¶ºà·à·€', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'සංස්කරණසංඛ්â€à¶ºà·à·€', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'පිටුනà·à¶¸à¶º', 'PAGENAME' ),
- 'namespace' => array( '1', 'නà·à¶¸à¶…වකà·à·à¶º', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Š', 'NAMESPACEE' ),
- 'msg' => array( '0', 'පණිවුඩ:', 'MSG:' ),
- 'img_right' => array( '1', 'දකුණ', 'right' ),
- 'img_left' => array( '1', 'වම', 'left' ),
- 'img_none' => array( '1', 'නොමà·à¶­', 'none' ),
- 'img_width' => array( '1', '$1පික්', '$1px' ),
- 'img_center' => array( '1', 'මධ්â€à¶ºà¶º', 'center', 'centre' ),
- 'img_border' => array( '1', 'දà·à¶»à¶º', 'border' ),
- 'img_sub' => array( '1', 'උප', 'sub' ),
- 'img_middle' => array( '1', 'මà·à¶¯', 'middle' ),
- 'special' => array( '0', 'විà·à·šà·‚', 'special' ),
+ 'redirect' => array( '0', '#යළියොමුව', '#REDIRECT' ),
+ 'currentmonth' => array( '1', 'වත්මන්මà·à·ƒà¶º', 'වත්මන්මà·à·ƒà¶º2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'වත්මන්මà·à·ƒà¶º1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'වත්මන්මà·à·ƒà¶±à·à¶¸à¶º', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'වත්මන්මà·à·ƒà¶±à·à¶¸à¶ºà¶´à·œà¶¯à·”', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'වත්මන්මà·à·ƒà¶ºà¶šà·™à¶§à·’', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'වත්මන්දිනය', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'වත්මන්දිනය2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'වත්මන්දිනනà·à¶¸à¶º', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'වත්මන්වසර', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'වත්මන්වේලà·à·€', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'වත්මන්පà·à¶º', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'දේà·à·“යමà·à·ƒà¶º', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'දේà·à·“යමà·à·ƒà¶±à·à¶¸à¶º', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'දේà·à·“යමà·à·ƒà¶±à·à¶¸à¶ºà¶´à·œà¶¯à·”', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'දේà·à·“යමà·à·ƒà¶ºà¶šà·™à¶§à·’', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'දේà·à·“යදිනය', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'දේà·à·“යදිනය2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'දේà·à·“යදිනනà·à¶¸à¶º', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'දේà·à·“යවසර', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'දේà·à·“යවේලà·à·€', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'දේà·à·“යපà·à¶º', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'පිටුසංඛ්â€à¶ºà·à·€', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ලිපිසංඛ්â€à¶ºà·à·€', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ගොනුසංඛ්â€à¶ºà·à·€', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'පරිà·à·“ලකයන්සංඛ්â€à¶ºà·à·€', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'සංස්කරණසංඛ්â€à¶ºà·à·€', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'පිටුනà·à¶¸à¶º', 'PAGENAME' ),
+ 'namespace' => array( '1', 'නà·à¶¸à¶…වකà·à·à¶º', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Š', 'NAMESPACEE' ),
+ 'msg' => array( '0', 'පණිවුඩ:', 'MSG:' ),
+ 'img_right' => array( '1', 'දකුණ', 'right' ),
+ 'img_left' => array( '1', 'වම', 'left' ),
+ 'img_none' => array( '1', 'නොමà·à¶­', 'none' ),
+ 'img_width' => array( '1', '$1පික්', '$1px' ),
+ 'img_center' => array( '1', 'මධ්â€à¶ºà¶º', 'center', 'centre' ),
+ 'img_border' => array( '1', 'දà·à¶»à¶º', 'border' ),
+ 'img_sub' => array( '1', 'උප', 'sub' ),
+ 'img_middle' => array( '1', 'මà·à¶¯', 'middle' ),
+ 'special' => array( '0', 'විà·à·šà·‚', 'special' ),
);
$messages = array(
@@ -555,23 +556,25 @@ URL සඳහන් කරමින්, මෙම කරුණ [[Special:ListUs
'badarticleerror' => 'මෙම පිටුව විෂයයෙහි මෙම කà·à¶»à·Šà¶ºà¶º ඉටු නල නොහà·à¶šà·’ විය.',
'cannotdelete' => '"$1" පිටුව හ෠ගොනුව හ෠මක෠දà·à¶¸à·’ය නොහà·à¶šà·’ විය.
අනෙකෙකු විසින් දà·à¶±à¶§à¶¸à¶­à·Š â€à¶¸à¶šà· දà·à¶¸à·“ම සිදු කර ඇතිව෠විය à·„à·à¶š.',
+'cannotdelete-title' => '"$1" පිටුව මà·à¶šà·’ය නොහà·à¶š',
'badtitle' => 'නුසුදුසු à·à·“ර්ෂයක්',
'badtitletext' => 'අයà·à¶¯ ඇති පිටු à·à·“ර්ෂය අනීතික, හිස් à·„à· à·€à·à¶»à¶¯à·’ ලෙස සබà·à¶³à·’ අන්තර්-භà·à·‚à·/අන්තර්-විකී à·à·“ර්ෂයකි.
à·à·“ර්ෂයන්හි භà·à·€à·’ත෠කල නොහà·à¶šà·’ අක්ෂර එකක් හ෠කිහිපයක් හ෠එහි අඩංගු වී ඇතිව෠විය à·„à·à¶š.',
-'perfcached' => 'පහත දà·à¶šà·Šà·€à·™à¶± දත්ත පූර්වà·à¶´à·šà¶šà·Šâ€à·‚ිතව සංචිත කෙරී ඇති (කෑෂ් කෙරී ඇති) බà·à·€à·’න් ඒව෠යවත්කà·à¶½à·“න නොවීමට ඉඩ ඇත.',
-'perfcachedts' => 'පහත දත්ත පූර්වà·à¶´à·šà¶šà·Šâ€à·‚à·“à·€ සංචිත කෙරී ඇති (කෑෂ් කෙරී ඇති) අතර, අවසන් වරට යà·à·€à¶­à·Šà¶šà·à¶½à·“න කර ඇත්තේ $1 දීය.',
+'perfcached' => 'පහත දà·à¶šà·Šà·€à·™à¶± දත්ත පූර්වà·à¶´à·šà¶šà·Šâ€à·‚ිතව සංචිත කෙරී ඇති (කෑෂ් කෙරී ඇති) බà·à·€à·’න් ඒව෠යවත්කà·à¶½à·“න නොවීමට ඉඩ ඇත. {{PLURAL:$1|එක් ප්â€à¶»à¶­à·’ඵලයකට|ප්â€à¶»à¶­à·’ඵල $1 කට}} උපරිමයකට යටත්ව පූර්වà·à¶´à·šà¶šà·Šâ€à·‚ිතව සංචිත කෙරී ඇත.',
+'perfcachedts' => 'පහත දත්ත පූර්වà·à¶´à·šà¶šà·Šâ€à·‚à·“à·€ සංචිත කෙරී ඇති (කෑෂ් කෙරී ඇති) අතර, අවසන් වරට යà·à·€à¶­à·Šà¶šà·à¶½à·“න කර ඇත්තේ $1 දීය. {{PLURAL:$4|එක් ප්â€à¶»à¶­à·’ඵලයක|ප්â€à¶»à¶­à·’ඵල $4 ක}} උපරිමයකට යටත්ව පූර්වà·à¶´à·šà¶šà·Šâ€à·‚à·“à·€ සංචිත කෙරී ඇත.',
'querypage-no-updates' => 'මෙම පිටුව සඳහ෠යà·à·€à¶­à·Šà¶šà·à¶½ කිරීම් දà·à¶±à¶§ අක්â€à¶»à·“ය කොට ඇත.
දà·à¶±à¶§ මෙහිදී දත්ත පුනස්ථà·à¶´à¶±à¶º සිදු නොවේ.',
'wrong_wfQuery_params' => ' wfQuery() සඳහ෠සà·à·€à¶¯à·Šâ€à¶º පරà·à¶¸à·’තිකයන්<br />
à·à·Šâ€à¶»à·’තය: $1<br />
විමසුම: $2',
'viewsource' => 'මූලà·à·à·Šâ€à¶»à¶º නරඹන්න',
-'viewsourcefor' => '$1 සඳහà·',
+'viewsource-title' => '$1 සඳහ෠මුලà·à·à·Šâ€à¶»à¶º නරඹන්න',
'actionthrottled' => 'ක්â€à¶»à·’යà·à·€ අවකරණය කරන ලදි',
'actionthrottledtext' => 'අයà·à¶ à·’ත තà·à¶´à·‘ල à·€à·à¶½à¶šà·“මේ ක්â€à¶»à·’යà·à¶¸à·à¶»à·Šà¶œà¶ºà¶šà·Š ලෙස, ඔබ විසින්, කෙටි කà·à¶½ සීමà·à·€à¶šà·Š තුල, පමණට à·€à·à¶©à·’ à·€à·à¶» ගණනක් මෙම ක්â€à¶»à·’යà·à·€ සිදු කිරීම, සීම෠කර ඇති අතර, ඔබ මෙම සීමà·à·€ ඉක්මව෠ඇත.
විනà·à¶©à·’ කිහිපයකින් පසුව නà·à·€à¶­ උත්සà·à·„ කරන්න.',
'protectedpagetext' => 'සංස්කරණයන් වලක්වනු වස් මෙම පිටුව අවුර෠ඇත.',
'viewsourcetext' => 'මෙම පිටුවෙහි මූලà·à·à·Šâ€à¶»à¶º නà·à¶»à¶¹à·“මට හ෠පිටපත් කිරීමට ඔබ හට à·„à·à¶šà·’ය:',
+'viewyourtext' => "'''ඔබගේ සංස්කරණ''' නà·à¶»à¶¹à·“ම සහ මූලà·à·à·Šâ€à¶»à¶º පිටපත් කිරීම ඔබට කල à·„à·à¶š:",
'protectedinterface' => 'මෙම පිටුව විසින්, මෘදුකà·à¶‚ගය සඳහ෠අතුරුමුව පෙළ සපයන අතර එබà·à·€à·’න් අපයෙදුම à·€à·à¶½à·à¶šà·Šà·€à·“ම සඳහ෠එය අවුර෠ඇත.',
'editinginterface' => "'''අවවà·à¶¯à¶ºà¶ºà·’:''' මෘදුකà·à¶‚ගයට අතුරුමුව පෙළ à·ƒà·à¶´à¶ºà·“මට භà·à·€à·’ත෠වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.
මෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිà·à·“ලකයන්ගේ පරිà·à·“ලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.
@@ -678,6 +681,7 @@ $2',
'emailconfirmlink' => 'ඔබගේ විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය තහවුරු කරන්න',
'invalidemailaddress' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනයෙහි ආකෘතිය අනීතික බවක් †පිළිබිඹු කරන බà·à·€à·’න් එය පිළිගත නොහà·à¶š.
මනà·-ආකෘතියකින් සුසà·à¶¯à·’ ලිපිනයක් ඇතුළත් කිරීමට හ෠එම ක්ෂේත්â€à¶»à¶º සිස් කිරීමâ€à¶§ හ෠කà·à¶»à·”ණික වන්න.',
+'cannotchangeemail' => 'මෙම විකියේ ගිණුම් විද්â€à¶ºà·”ත් ලිපිනය වෙනස් කල නොහà·à¶šà·’ය.',
'accountcreated' => 'ගිණුම තනන ලදි',
'accountcreatedtext' => ' $1 සඳහ෠පරිà·à·“ලක ගිණුම තනන ලදි.',
'createaccount-title' => '{{SITENAME}} සඳහ෠ගිණුම තà·à¶±à·“ම',
@@ -694,6 +698,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'php mail() à·à·Šâ€à¶»à·’තයේ හඳුනà·à¶±à·œà¶œà¶­à·Š ගà·à¶§à·…ුවකි',
+'user-mail-no-addy' => 'විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනයක් නොමà·à¶­à·’à·€ විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š පණිවුඩයක් යà·à·€à·“මට උත්සහ දර෠ඇත.',
# Change password dialog
'resetpass' => 'මුරපදය වෙනස් කරන්න',
@@ -715,25 +720,40 @@ $2',
'resetpass-temp-password' => 'තà·à·€à¶šà·à¶½à·’ක මුර-පදය:',
# Special:PasswordReset
-'passwordreset' => 'මුරපදය වෙනස් කරන්න',
-'passwordreset-text' => 'ඔබගේ ගිණුම් තොරතුරුවල විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·ŠÂ à¶¸à¶­à¶šà·Šà¶šà·’රීමක් ලබà·Â à¶œà·à¶±à·“ම සදහà·Â à¶¸à·™à¶¸Â à¶†à¶šà·˜à¶­à·’පත්â€à¶»à¶ºÂ à·ƒà¶¸à·Šà¶´à·–ර්ණ කරන්න.',
-'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
-'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶»à¶¸à·Šà¶·Â à¶šà·’රීම් අක්â€à¶»à·“ය කොට ඇත.',
-'passwordreset-pretext' => '{{PLURAL:$1||පහත දà·à¶šà·Šà·€à·™à¶± දත්ත කණ්ඩ වලින් එකක් ඇතුල් කරන්න}}',
-'passwordreset-username' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
-'passwordreset-domain' => 'වසම:',
-'passwordreset-email' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය:',
-'passwordreset-emailtitle' => '{{SITENAME}}යෙහි ගිණුම් තොරතුරු',
-'passwordreset-emailtext-ip' => 'කවුරුන්හ෠(බොහà·à·€à·’ට ඔබ, $1 අන්තර්ජà·à¶½ ලිපිනය භà·à·€à·’තයෙන්) {{SITENAME}} ($4) සඳහ෠ඔබගේ ගිණුම් විස්තර සිහිකà·à¶³à·€à·“මක් ඉල්ල෠ඇත. පහත පරිà·à·“ලක {{PLURAL:$3|ගිණුම|ගිණුම්}}
+'passwordreset' => 'මුරපදය වෙනස් කරන්න',
+'passwordreset-text' => 'ඔබගේ ගිණුම් තොරතුරුවල විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·ŠÂ à¶¸à¶­à¶šà·Šà¶šà·’රීමක් ලබà·Â à¶œà·à¶±à·“ම සදහà·Â à¶¸à·™à¶¸Â à¶†à¶šà·˜à¶­à·’පත්â€à¶»à¶ºÂ à·ƒà¶¸à·Šà¶´à·–ර්ණ කරන්න.',
+'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
+'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶»à¶¸à·Šà¶·Â à¶šà·’රීම් අක්â€à¶»à·“ය කොට ඇත.',
+'passwordreset-pretext' => '{{PLURAL:$1||පහත දà·à¶šà·Šà·€à·™à¶± දත්ත කණ්ඩ වලින් එකක් ඇතුල් කරන්න}}',
+'passwordreset-username' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
+'passwordreset-domain' => 'වසම:',
+'passwordreset-capture' => 'ප්â€à¶»à¶­à·’පලදà·à¶ºà¶š විද්â€à¶ºà·”ත් තà·à¶´à·‘ල නරඹනවà·à¶¯?',
+'passwordreset-capture-help' => 'ඔබ මෙම කොටුව සලකුණු කලොත්, විද්â€à¶ºà·”ත් තà·à¶´à·‘ලක් (තà·à·€à¶šà·à¶½à·’ක මුරපදය සමඟ) ඔබට සහ යවන පුද්ගලයට දිස්වනු ඇත.',
+'passwordreset-email' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය:',
+'passwordreset-emailtitle' => '{{SITENAME}}යෙහි ගිණුම් තොරතුරු',
+'passwordreset-emailtext-ip' => 'කවුරුන්හ෠(බොහà·à·€à·’ට ඔබ, $1 අන්තර්ජà·à¶½ ලිපිනය භà·à·€à·’තයෙන්) {{SITENAME}} ($4) සඳහ෠ඔබගේ ගිණුම් විස්තර සිහිකà·à¶³à·€à·“මක් ඉල්ල෠ඇත. පහත පරිà·à·“ලක {{PLURAL:$3|ගිණුම|ගිණුම්}}
මෙම විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය හ෠සමගින් ආà·à·Šâ€à¶»à¶º වෙයි.
$2
{{PLURAL:$3|මෙම තà·à·€à¶šà·à¶½à·’ක මුරපදය|මෙම තà·à·€à¶šà·à¶½à·’ක මුරපද}} {{PLURAL:$5|එක් දිනයක්|දින $5 ක්}} ගෙවුනු විට ඉකුත් වනු ඇත.
ඔබ දà·à¶±à·Š ප්â€à¶»à·€à·’ෂ්ට වී නව මුරපදයක් තà·à¶»à·à¶œà¶­ යුතුයි. වෙන යම් අයෙක් මෙම ඉල්ලීම කර ඇත්නම් à·„à·, ඔබගේ මුල් මුරපදය ඔබගේ මතකයට පà·à¶¸à·’ණ ඇති නම් à·„à·, එය වෙනස් කිරීමට ඔබ හට තවදුරටත් අවà·à·Šâ€à¶º නොවේ නම්, ඔබ විසින් මෙම පණිවුඩය නොසලක෠හà·à¶» පà·à¶»à¶«à·’ මුරපදය තවදුරටත් පà·à·€à·’ච්චි කළ à·„à·à¶š.',
-'passwordreset-emailelement' => 'පරිà·à·“ලක නà·à¶¸à¶º: $1
+'passwordreset-emailelement' => 'පරිà·à·“ලක නà·à¶¸à¶º: $1
තà·à·€à¶šà·à¶½à·’ක මුරපදය: $2',
-'passwordreset-emailsent' => 'විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·ŠÂ à¶¸à¶­à¶šà·Šà¶šà·’රීමක් යවන ලදී.',
+'passwordreset-emailsent' => 'විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·ŠÂ à¶¸à¶­à¶šà·Šà¶šà·’රීමක් යවන ලදී.',
+'passwordreset-emailsent-capture' => 'මතක් කිරීමේ විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š පණිවුඩය යවන ලදී, එය පහත දà·à¶šà·Šà·€à·š.',
+'passwordreset-emailerror-capture' => 'සිහිකà·à¶³à·€à·”ම් ඊ-තà·à¶´à·‘ල ජනිත කරනු ලà·à¶¶à·– අතර, එය පහත දà·à¶šà·Šà·€à·š, නමුත් එය පරිà·à·“ලකයà·à¶§ යà·à·€à·“ම අසà·à¶»à·Šà¶®à¶š වුනි: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය වෙනස් කරන්න',
+'changeemail-header' => 'ගිණුම් විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය වෙනස් කරන්න',
+'changeemail-text' => 'ඔබගේ විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය වෙනස් කිරීම සඳහ෠මෙම à·†à·à¶»à¶¸à¶º සම්පූර්ණ කරන්න . මෙම වෙනස් කිරීම තහවුරු කිරීම සඳහ෠ඔබගේ මුරපදය යෙදීමට ඔබට සිදු වේ.',
+'changeemail-no-info' => 'මෙම පිටුව සෘජු ලෙස සම්ප්â€à¶»à·€à·šà·à¶º කෙරුමට පළමුව ඔබ ප්â€à¶»à·€à·’ෂ්ටව සිටිය යුතුය.',
+'changeemail-oldemail' => 'වත්මන් විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය:',
+'changeemail-newemail' => 'නව විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය:',
+'changeemail-none' => '(කිසිවක් නොමà·à¶­)',
+'changeemail-submit' => 'විද්â€à¶ºà·”ත් තà·à¶´à·‘ල වෙනස් කරන්න',
+'changeemail-cancel' => 'අවලංගු කරන්න',
# Edit page toolbar
'bold_sample' => 'තදකුරු පෙළ',
@@ -805,9 +825,6 @@ $2
ඔබගේ වත්මන් අන්තර්ජà·à¶½ ලිපිනය $3 වන අතර, à·€à·à¶»à¶« අනන්â€à¶ºà¶­à·à·€à¶º #$5 වේ.
ඔබ විසින් සිදු කරන ඕනෑම විමසුමකදී ඉහත සියළු විස්තර අඩංගු කරන්න.",
'blockednoreason' => 'කිසිදු හේතුවක් දක්ව෠නොමà·à¶­',
-'blockedoriginalsource' => " '''$1''' à·„à·’ මූලà·à·à·Šâ€à¶»à¶º පහත දà·à¶šà·Šà·€à·š:",
-'blockededitsource' => " '''$1''' විෂයයයෙහි සිදු කල '''ඔබගේ සංස්කරණ'' යන්හී පෙළ පහත දà·à¶šà·Šà·€à·š:",
-'whitelistedittitle' => 'සංස්කරණය කිරීමට ප්â€à¶»à·€à·’ෂ්ටවී සිටිය යුතුය',
'whitelistedittext' => 'සංස්කරණය කිරීමට පෙරà·à¶­à·”à·€ ඔබ $1 විය යුතුය.',
'confirmedittext' => 'පිටු සංස්කරණයට පෙර ඔබ†විසින් ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය තහවුරු කල යුතු වේ.
ඔබගේ [[Special:Preferences|පරිà·à·“ලක අභිරුචීන්]] තුලින් ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය සකස෠ඉක්බිතිව තහවුරු කරන්න.',
@@ -897,8 +914,8 @@ $2
'copyrightwarning2' => "{{SITENAME}} වෙත දà·à¶ºà¶š වෙමින් ඔබ විසින් යොමු කෙරෙන කෘති, එවà·à¶±à·’ම දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶šà·Š සපයන වෙනයම් ඕනෑම අයෙකුන් විසින්, සංස්කරණය කිරීම, වෙනස් කිරීම, හ෠ඉවත් කිරීම සිදුවිය à·„à·à¶šà·Šà¶šà¶šà·Š බව කරුණà·à·€à·™à¶±à·Š සලකන්න.ඔබගේ ලියà·à·€à·’ලි, හිත්පිත් නà·à¶­à·’ව෠සේ පෙනෙන ඉත෠රළු අයුරින් සංස්කරණයට ලක් කිරීම නොකල යුතු යà·à¶ºà·’ ඔබ හඟින්නේ නම්, ඔබගේ කෘති මෙහි පල කිරීමෙන් වලකින්න.<br />
එසේ ම මෙය ඔබ විසින් ම ලියූ බවට හ෠පොදු විෂයපථයකින්, ඊâ€à¶§ à·ƒâ€à¶¸à·à¶± නිදහස් මූලà·à·à·Šâ€à¶»à¶ºà¶šà·’න් උපුට෠ගත් බවâ€à¶§ හ෠අපහâ€â€à¶§ සහතික විය යුතු ය. (තොරතුරු සඳහ෠$1 බලන්න).
''' හිමිකම් ඇවුරුණු දේ අනවසරයෙන් ප්â€à¶»à¶šà·à· කිරිමෙන් වලකින්න!'''",
-'longpageerror' => "'''දà·à·‚ය: ඔබ විසින් ඉදිරිපත් කර ඇති පෙළ, කිලà·à¶¶à¶ºà·’ට් $1 ක් දිගු වන අතර, උපරිමය වන කිලà·à¶¶à¶ºà·’ට් $2 ට වඩ෠දිගය.
-එය සුරà·à¶šà·’ය නොහà·à¶š.'''",
+'longpageerror' => "'''දà·à·‚ය: ඔබ සපය෠ඇති පෙළ {{PLURAL:$1|එක් කිල෠බයිටයක්|කිල෠බයිට් $1 ක්}} දිගු වන අතර, අනුමත උපරිමය වන {{PLURAL:$2|එක් කිල෠බයිටය |කිල෠බයිට $2 }} ඉක්මවයි.'''
+එය සුරà·à¶šà·’ය නොහà·à¶š.",
'readonlywarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’: නඩත්තු කටයුතු සඳහ෠දත්ත-සංචිතය අවහිරකර ඇති බà·à·€à·’න් ඔබගේ සංස්කරණයන් දà·à¶±à·Šà¶¸à¶¸ සුරà·à¶šà·“මට ඔබ හට නොහà·à¶š.
ඔබ තුටු නම්, කපà·-පසුව-ඇලවීමක් (cut-n-paste) මගින් පෙළ වෙනත් පෙළ ගොනුවකට නංව෠පසුව සුරà·à¶šà·“මට à·„à·à¶š.'''
@@ -1067,8 +1084,6 @@ $3 විසින් සපය෠ඇති හේතුව ''$2'' වේ",
'revdelete-unsuppress' => 'ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන ලද සංà·à·à¶°à¶±à¶ºà¶±à·Š විෂයයෙහි පà·à¶±à·€à·”නු පරිසීම෠ඉවත්කරන්න',
'revdelete-log' => 'හේතුව:',
'revdelete-submit' => 'තà·à¶»à·à¶œà¶­à·Š {{PLURAL:$1|සංà·à·à¶°à¶±à¶º|සංà·à·à¶°à¶±à¶ºà¶±à·Š}}ට යොදන්න',
-'revdelete-logentry' => ' [[$1]] à·„à·’ සංà·à·à¶°à¶± සංජà·à¶±à¶±à¶º වෙනස්කරන ලදි',
-'logdelete-logentry' => '[[$1]] à·„à·’ සිදුවීම් සංජà·à¶±à¶±à¶º වෙනස්කරන ලදි',
'revdelete-success' => "'''සංà·à·à¶°à¶± සංජà·à¶±à¶±à¶º à·ƒà·à¶»à·Šà¶®à¶šà·€ යà·à·€à¶­à·Šà¶šà·à¶½à·“න කරන ලදි.'''",
'revdelete-failure' => "'''සංà·à·à¶°à¶± දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º යà·à·€à¶­à·Šà¶šà·à¶½à·“න කළ නොහà·à¶šà·’ විය:'''
$1",
@@ -1080,15 +1095,6 @@ $1",
'revdel-restore-visible' => 'දෘà·à·Šâ€à¶º සංà·à·à¶°à¶±',
'pagehist' => 'පිටු ඉතිහà·à·ƒà¶º',
'deletedhist' => 'මකà·à¶¯à·à¶¸à·– ඉතිහà·à·ƒà¶º',
-'revdelete-content' => 'අන්තර්ගතය',
-'revdelete-summary' => 'සංස්කරණ à·ƒà·à¶»à·à¶‚à·à¶º',
-'revdelete-uname' => 'පරිà·à·“ලක-නà·à¶¸à¶º',
-'revdelete-restricted' => 'පරිපà·à¶½à¶šà¶ºà¶±à·Š විෂයයෙහි ව්â€à¶ºà·€à·„à·à¶»à·’ත පරිසීමà·à·€à¶±à·Š',
-'revdelete-unrestricted' => 'පරිපà·à¶½à¶šà¶ºà¶±à·Šà¶œà·š පරිසීමà·à·€à¶±à·Š ඉවත් කරන ලදි',
-'revdelete-hid' => '$1 සඟවන ලදි',
-'revdelete-unhid' => '$1 අනà·à·€à¶»à¶«à¶º කරන ලදි',
-'revdelete-log-message' => '{{PLURAL:$2|එක් සංà·à·à¶°à¶±à¶ºà¶šà·Š|සංà·à·à¶°à¶± $2 ක්}} විෂයයෙහි $1',
-'logdelete-log-message' => '{{PLURAL:$2|එක් සිදුවීමක්|සිදුවීම් $2 ක්}} විෂයයෙහි $1',
'revdelete-hide-current' => '$1දින, $2 වේලà·à·€à·™à·„à·’, අයිතමය à·ƒà·à¶Ÿà·€à·“මෙහිදී දà·à·‚යක් ඇති වී ඇත: මෙය මෑත සංà·à·à¶°à¶±à¶º වෙයි.
එය à·ƒà·à¶Ÿà·€à·’ය නොහà·à¶š.',
'revdelete-show-no-access' => '$1 දින, $2 වේලà·à·€à·™à·„à·’, අයිතමය ප්â€à¶»à¶¯à¶»à·Šà·à¶±à¶º කිරීමෙහිදී දà·à·‚යක් ඇතිවී ඇත: මෙම අයිතමය "පරිසීමිත" ලෙසින් සලකුණු කර ඇත.
@@ -1248,13 +1254,14 @@ $1",
'prefs-rc' => 'â€à¶±à·€ වෙනස්වීම්',
'prefs-watchlist' => 'මුර-ලà·à¶ºà·’ස්තුව',
'prefs-watchlist-days' => 'මුර-ලà·à¶ºà·’ස්තුවෙහි පෙන්විය යුතු දිනයන්:',
-'prefs-watchlist-days-max' => 'Maximum 7 days
-උපරිමය දින 7 කි',
+'prefs-watchlist-days-max' => 'උපරිමය $1 {{PLURAL:$1|දින|දින}}කි',
'prefs-watchlist-edits' => 'ආවර්ධිත මුර-ලà·à¶ºà·’ස්තුවෙහි පෙන්විය යුතු උපරිම වෙනස්වීම් සංඛ්â€à¶ºà·à·€:',
'prefs-watchlist-edits-max' => 'උපරිම සංඛ්â€à¶ºà·à·€: 1000',
'prefs-watchlist-token' => 'මුරලà·à¶ºà·’ස්තු ටà·à¶šà¶±à¶º:',
'prefs-misc' => 'විවිධ',
'prefs-resetpass' => 'මුර-පදය වෙනස් කරන්න',
+'prefs-changeemail' => 'විද්â€à¶ºà·”ත් තà·à¶´à·‘ල වෙනස් කරන්න',
+'prefs-setemail' => 'විද්â€à¶ºà·”ත් ලිපිනයන් සකසන්න',
'prefs-email' => 'විද්â€à¶ºà·”ත්-ලිපි තà·à¶»à·à¶œà·à¶±à·“ම්',
'prefs-rendering' => 'පෙනුම',
'saveprefs' => 'සුරà·à¶šà·”ම',
@@ -1357,7 +1364,7 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'userrights-lookup-user' => 'පරිà·à·“ලක කණ්ඩà·à¶ºà¶¸à·Š කළමනà·à¶šà¶»à¶«à¶º කරන්න',
'userrights-user-editname' => 'පරිà·à·“ලක-නà·à¶¸à¶ºà¶šà·Š ආදà·à¶ºà¶±à¶º කරන්න:',
'editusergroup' => 'පරිà·à·“ලක කණ්ඩà·à¶ºà¶¸à·Š සංස්කරණය කරන්න',
-'editinguser' => "'''[[User:$1|$1]]''' ගේ භà·à·€à·’තà·à¶šà¶»à·” අයිතීන් වෙනස් කිරීම ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "'''[[User:$1|$1]]''' $2 පරිà·à·“ලකයà·à¶œà·š පරිà·à·“ලක හිමිකම්",
'userrights-editusergroup' => 'පරිà·à·“ලක කණ්ඩà·à¶ºà¶¸à·Š සංස්කරණය කරන්න',
'saveusergroups' => 'පරිà·à·“ලක කණ්ඩà·à¶ºà¶¸à·Š සුරකින්න',
'userrights-groupsmember' => 'ඉදිරි කà·à¶«à·Šà¶©à¶ºà¶±à·Šà·„à·’ à·ƒà·à¶¸à·à¶¢à·’කයෙකි:',
@@ -1452,13 +1459,13 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'right-autopatrol' => 'අයෙකුගේ ස්වීය සංස්කරණයන්, ස්වයංක්â€à¶»à·“ය ලෙස, පරික්â€à·‚à·à¶šà¶» බà·à¶½à·– ලෙස සලකුණු කරන්න',
'right-patrolmarks' => 'මෑත වෙනස්වීම් පරික්ෂà·à¶šà¶»à¶¶à·à¶½à·“ම් ලකුණුකිරීම් නරඹන්න',
'right-unwatchedpages' => 'මුර-නොකෙරෙන පිටු ලà·à¶ºà·’ස්තුවක් නරඹන්න',
-'right-trackback' => 'පසුහà·à¶¹à·“මක් ඉදිරිපත් කරන්න',
'right-mergehistory' => 'පිටුවල ඉතිහà·à·ƒà¶ºà¶±à·Š ඒකà·à¶¶à¶¯à·Šà¶° කරන්න',
'right-userrights' => 'පරිà·à·“ලක හිමිකම් සියල්ල සංස්කරණය කරන්න',
'right-userrights-interwiki' => 'අනෙකුත් විකියන්හි පරිà·à·“ලකයන්ගේ හිමිකම් සංස්කරණය කරන්න',
'right-siteadmin' => 'දත්ත-ගබඩà·à·€ අවුරන්න හ෠ඇවුරුම ඉවත් කරන්න',
'right-override-export-depth' => '5වන මට්ටම දක්ව෠සබà·à¶³à·’ පිටු ද සහිතව පිටු නිර්යà·à¶­ කරන්න',
'right-sendemail' => 'අනෙක් පරිà·à·“ලකයන්ට ඊ-ලිපි යවන්න',
+'right-passwordreset' => 'මුරපද යලි à·ƒà·à¶šà·ƒà·“ම් විද්â€à¶ºà·”ත් තà·à¶´à·‘ලයන් නරඹන්න',
# User rights log
'rightslog' => 'පරිà·à·“ලක හිමිකම් සටහන',
@@ -1497,11 +1504,11 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'action-patrol' => 'අනෙකුන්ගේ සංස්කරණ, පරික්â€à·‚à·à¶šà¶» බà·à¶½à·– ලෙස සලකුණු කරගන්න',
'action-autopatrol' => 'ඔබගේ සංස්කරණය, පරික්â€à·‚à·à¶šà¶» බà·à¶½à·– ලෙස සලකුණු කරවà·à¶œà¶±à·Šà¶±',
'action-unwatchedpages' => 'මුර-නොකෙරෙන පිටු ලà·à¶ºà·’ස්තුව නරඹන්න',
-'action-trackback' => 'පසුහà·à¶¹à·“මක් ඉදිරිපත් කරන්න',
'action-mergehistory' => 'මෙම පිටුවේ ඉතිහà·à·ƒà¶º ඒකà·à¶¶à¶¯à·Šà¶° කරන්න',
'action-userrights' => 'සියළු පරිà·à·“ලක හිමිකම් සංස්කරණය කරන්න',
'action-userrights-interwiki' => 'අනෙකුත් විකියන්ගේ පරිà·à·“ලකයන්ගේ පරිà·à·“ලක හිමිකම් සංස්කරණය කරන්න',
'action-siteadmin' => 'දත්ත-සංචිතය අවහිරකරන්න හ෠අවහිරය ඉවත් කරන්න',
+'action-sendemail' => 'ඊ-තà·à¶´à·à¶½à·Š පණිවුඩ යවන්න',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|වෙනස්වීම|වෙනස්වීම්}}',
@@ -1543,7 +1550,6 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'recentchangeslinked-feed' => 'සහසම්බන්ධිත වෙනස්වීම්',
'recentchangeslinked-toolbox' => 'සහසම්බන්ධිත වෙනස්වීම්',
'recentchangeslinked-title' => '"$1" ආà·à·Šâ€à¶»à·’ත වෙනස්කිරීම්',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'සලක෠බà·à¶½à·– කà·à¶½à·ƒà·“මà·à·€à·™à·„ිදී, සබà·à¶³à·’ පිටු වල කිසිදු වෙනසක් සිදුවී නොමà·à¶­.',
'recentchangeslinked-summary' => "විà·à·šà·‚à·“ ලෙස නිරූපිත පිටුවකට (හ෠විà·à·šà·‚à·’ ලෙස නිරූපිත ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶š à·ƒà·à¶¸à·à¶¢à·“කයන්ට) සබà·à¶³à·’ පිටුවල මෑතදී සිදුවූ වෙනස්වීම් දà·à¶šà·Šà·€à·™à¶± ලà·à¶ºà·’ස්තුවක් මෙහි දà·à¶šà·Šà·€à·š.
[[Special:Watchlist|ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙහි]] පිටු '''තදකුරු''' වලින් දක්ව෠ඇත.",
@@ -1589,6 +1595,7 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'minlength1' => 'ගොනු නà·à¶¸à¶ºà¶±à·Š අවමයෙන් එක් අකුරකින් හ෠සමන්විත විය යුතුය.',
'illegalfilename' => 'à·à·“ර්ෂයන්හි භà·à·€à·’ත කිරීමට ඉඩ නොදෙන යම් අක්ෂරයන් "$1" ගොනු නà·à¶¸à¶ºà·™à·„à·’ අඩංගුය.
කරුණà·à¶šà¶» ගොනුව යළිනම් කොට එය නà·à·€à¶­ උඩුගත කිරීමට උත්සà·à·„ කරන්න.',
+'filename-toolong' => 'ගොනු නà·à¶¸à¶ºà¶±à·Š බයිට 240 වඩ෠විà·à·à¶½ විය නොහà·à¶š.',
'badfilename' => 'ගොනු නම "$1" බවට වෙනස් කර ඇත.',
'filetype-mime-mismatch' => '".$1" යන ගොනු දිගුව ($2) ගොනුවෙහි අනà·à·€à¶»à·’ත MIME වර්ගය හ෠නොගà·à¶½à¶´à·š.',
'filetype-badmime' => '"$1" MIME වර්ගයෙහි ගොනු උඩුගත කිරීමට ඉඩ දෙනු නොලà·à¶¶à·š.',
@@ -1702,6 +1709,34 @@ $1',
'upload-unknown-size' => 'ප්â€à¶»à¶¸à·à¶«à¶º නොදනී',
'upload-http-error' => 'HTTP දà·à·‚යක් හට ගà·à¶±à·’ණි: $1',
+# File backend
+'backend-fail-stream' => '$1 ගොනුව ප්â€à¶»à·€à·à·„ කල නොහà·à¶š.',
+'backend-fail-backup' => '$1 ගොනුව උපස්ථ කල නොහà·à¶š.',
+'backend-fail-notexists' => '$1 ගොනුව නොපවතියි.',
+'backend-fail-hashes' => 'à·ƒà·à·ƒà¶³à·“ම සඳහ෠ගොනු පූරකයන් ලබ෠ගත නොහà·à¶š.',
+'backend-fail-notsame' => '$1 à·„à·“ හඳුන෠නොගත් ගොනුවක් දà·à¶±à¶§à¶¸à¶­à·Š පවතියි.',
+'backend-fail-invalidpath' => '$1 යනු වලංගු ගබඩà·à¶šà¶»à¶« මඟක් නොවේ.',
+'backend-fail-delete' => '$1 ගොනුව මකà·à¶¯à·à¶¸à·’ය නොහà·à¶š.',
+'backend-fail-alreadyexists' => '$1 ගොනුව දà·à¶±à¶§à¶¸à¶­à·Š පවතියි.',
+'backend-fail-store' => '$1 ගොනුව $2 හීදි ගබඩ෠කල නොහà·à¶š .',
+'backend-fail-copy' => '$1 ගොනුව $2 වෙත පිටපත් කල නොහà·à¶š .',
+'backend-fail-move' => '$1 ගොනුව $2 වෙත ගෙනයà·à¶¸ කල නොහà·à¶š .',
+'backend-fail-opentemp' => 'තà·à·€à¶šà·à¶½à·’ක ගොනුව විවෘත කල නොහà·à¶š.',
+'backend-fail-writetemp' => 'තà·à·€à¶šà·à¶½à·’ක ගොනුව වෙත ලිවිය නොහà·à¶š.',
+'backend-fail-closetemp' => 'තà·à·€à¶šà·à¶½à·’ක ගොනුව à·€à·à·ƒà·“ම කල නොහà·à¶š.',
+'backend-fail-read' => '$1 ගොනුව කියවිය නොහà·à¶š.',
+'backend-fail-create' => '$1 ගොනුව තà·à¶±à·’ය නොහà·à¶š.',
+
+# Lock manager
+'lockmanager-notlocked' => '"$1" à·„à·“ අගුළු ඇරිය නොහà·à¶š; එය අගුළු දමà·à¶¯ නොමà·à¶­.',
+'lockmanager-fail-closelock' => '"$1" සඳහ෠වූ අගුලු ගතකර ඇති ගොනුව à·€à·à·ƒà·’ය නොහà·à¶š.',
+'lockmanager-fail-deletelock' => '"$1" සඳහ෠වූ අගුලු ගතකර ඇති ගොනුව මà·à¶šà·’ය නොහà·à¶š.',
+'lockmanager-fail-acquirelock' => '"$1" සඳහ෠වූ අගුලු දà·à¶¸à·“ම ලබ෠ගත නොහà·à¶š.',
+'lockmanager-fail-openlock' => '"$1" සඳහ෠වූ අගුලු ගතකර ඇති ගොනුව විවෘත කල නොහà·à¶š.',
+'lockmanager-fail-releaselock' => '"$1" සඳහ෠වූ අගුලු දà·à¶¸à·“ම නිදහස් කල නොහà·à¶š.',
+'lockmanager-fail-db-release' => '$1 දත්ත ගබඩà·à·€à·™à·„à·’ අගුලු අත්හල නොහà·à¶š.',
+'lockmanager-fail-svr-release' => '$1 සර්වරයෙහි අගුලු අත්හල නොහà·à¶š.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'ZIP පිරික්සුම් සඳහ෠ගොනුව විවෘත කරද්දී දà·à·‚යක් ඇති විය.',
'zip-wrong-format' => 'සඳහන් ගොනුව ZIP ගොනුවෙහි නොතිබිණි.',
@@ -1718,6 +1753,7 @@ $1',
'uploadstash-badtoken' => 'එම ක්â€à¶»à·’යà·à·€ කිරීම à·ƒà·à¶»à·Šà¶®à¶š නොවිනි, ඇතà·à¶¸à·Šà·€à·’ට ඔබේ සංස්කරණ අක්තපත්â€à¶» කල්ඉකුත්වී තිබිය à·„à·à¶š. නà·à·€à¶­ උත්සà·à·„ කරන්න.',
'uploadstash-errclear' => 'ගොනු පවිත්â€à¶» කිරීම අසà·à¶»à·Šà¶®à¶š විය.',
'uploadstash-refresh' => 'ගොනු ලà·à¶ºà·’ස්තුව යළි-පුබුදුවන්න',
+'invalid-chunk-offset' => 'වලංගු නොවන ලොකු කොටසක මුද්â€à¶»à·’ත ඡà·à¶ºà·à¶»à·–පයක්',
# img_auth script messages
'img-auth-accessdenied' => 'ප්â€à¶»à·€à·šà·à¶º තහනම් කර ඇත',
@@ -1817,7 +1853,6 @@ When filtered by user, only files where that user uploaded the most recent versi
# File reversion
'filerevert' => '$1 ප්â€à¶»à¶­à·’වර්තනය කරන්න',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'ගොනුව ප්â€à¶»à¶­à·’වර්තනය කරන්න',
'filerevert-intro' => "ඔබ විසින් '''[[Media:$1|$1]]''' ප්â€à¶»à¶­à·’වර්තනය කරමින් පවතින්නේ [ $2 දින, $3 වේලà·à·€à·š පà·à·€à·à¶­à·’ $4 අනුවà·à¶¯à¶ºà¶§à¶ºà·’ ].",
'filerevert-comment' => 'හේතුව:',
@@ -1827,24 +1862,24 @@ When filtered by user, only files where that user uploaded the most recent versi
'filerevert-badversion' => 'සපය෠ඇති වේලà·à¶¸à·”ද්â€à¶»à·à·€ හ෠සමග මෙම ගොනුව à·ƒà·à¶½à¶šà·– කල, පූර්ව ස්ථà·à¶±à·“ය අනුවà·à¶¯ නොමà·à¶­à·’ බව පෙනේ.',
# File deletion
-'filedelete' => '$1 මකන්න',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'ගොනුව මකන්න',
-'filedelete-intro' => "ඔබ විසින් '''[[Media:$1|$1]]'''ගොනුව, එහි සමස්ත ඉතිහà·à·ƒà¶º සමගින් මක෠දà·à¶¸à·“මට ආසන්නයේ පවතියි.",
-'filedelete-intro-old' => "ඔබ විසින් මක෠දමමින් පවතින්නේ [$4 $3, $2] වන විට '''[[Media:$1|$1]]''' à·„à·’ අනුවà·à¶¯à¶ºà¶ºà·’.",
-'filedelete-comment' => 'හේතුව:',
-'filedelete-submit' => 'මක෠දමන්න',
-'filedelete-success' => "'''$1''' මක෠දමන ලදි.",
-'filedelete-success-old' => "$3, $2 වන විට '''[[Media:$1|$1]]''' à·„à·’ අනුවà·à¶¯à¶º මක෠දම෠ඇත.",
-'filedelete-nofile' => "'''$1''' නොපවතියි.",
-'filedelete-nofile-old' => "There is no archived version of '''$1''' with the නියමකරඇති attributes.",
-'filedelete-otherreason' => 'අනෙකුත්/අමතර හේතුව:',
-'filedelete-reason-otherlist' => 'අනෙකුත් හේතුව',
-'filedelete-reason-dropdown' => '*à·ƒà·à¶¸à·à¶±à·Šâ€à¶º මකà·à¶¯à·à¶¸à·“ම් හේතූන්
+'filedelete' => '$1 මකන්න',
+'filedelete-legend' => 'ගොනුව මකන්න',
+'filedelete-intro' => "ඔබ විසින් '''[[Media:$1|$1]]'''ගොනුව, එහි සමස්ත ඉතිහà·à·ƒà¶º සමගින් මක෠දà·à¶¸à·“මට ආසන්නයේ පවතියි.",
+'filedelete-intro-old' => "ඔබ විසින් මක෠දමමින් පවතින්නේ [$4 $3, $2] වන විට '''[[Media:$1|$1]]''' à·„à·’ අනුවà·à¶¯à¶ºà¶ºà·’.",
+'filedelete-comment' => 'හේතුව:',
+'filedelete-submit' => 'මක෠දමන්න',
+'filedelete-success' => "'''$1''' මක෠දමන ලදි.",
+'filedelete-success-old' => "$3, $2 වන විට '''[[Media:$1|$1]]''' à·„à·’ අනුවà·à¶¯à¶º මක෠දම෠ඇත.",
+'filedelete-nofile' => "'''$1''' නොපවතියි.",
+'filedelete-nofile-old' => "There is no archived version of '''$1''' with the නියමකරඇති attributes.",
+'filedelete-otherreason' => 'අනෙකුත්/අමතර හේතුව:',
+'filedelete-reason-otherlist' => 'අනෙකුත් හේතුව',
+'filedelete-reason-dropdown' => '*à·ƒà·à¶¸à·à¶±à·Šâ€à¶º මකà·à¶¯à·à¶¸à·“ම් හේතූන්
** හිමිකම් උල්ලංà¶à¶±à¶º
** අනුපිටපත් කල ගොනුව',
-'filedelete-edit-reasonlist' => 'මක෠දà·à¶¸à·“මට හේතූන් සංස්කරණය කරන්න',
-'filedelete-maintenance' => 'නඩත්තුව අතරතුර ගොනු මà·à¶šà·“ම හ෠ප්â€à¶»à¶­à·’සංස්කරණය තà·à·€à¶šà·à¶½à·’කව අක්â€à¶»à·“ය වේ.',
+'filedelete-edit-reasonlist' => 'මක෠දà·à¶¸à·“මට හේතූන් සංස්කරණය කරන්න',
+'filedelete-maintenance' => 'නඩත්තුව අතරතුර ගොනු මà·à¶šà·“ම හ෠ප්â€à¶»à¶­à·’සංස්කරණය තà·à·€à¶šà·à¶½à·’කව අක්â€à¶»à·“ය වේ.',
+'filedelete-maintenance-title' => 'ගොනුව මà·à¶šà·’ය නොහà·à¶š',
# MIME search
'mimesearch' => 'MIME ගවේෂණය',
@@ -1950,6 +1985,7 @@ When filtered by user, only files where that user uploaded the most recent versi
'mostimages' => 'ගොනු වලට බෙහෙවින්ම සබà·à¶³à·’',
'mostrevisions' => 'වඩà·à¶­à·Šà¶¸ සංà·à·à¶°à¶± සහිත පිටු',
'prefixindex' => 'උපසර්ගය සහිත සියළු පිටු',
+'prefixindex-namespace' => 'උපසර්ගය සමඟ ඇති සියලුම පිටු ($1 නà·à¶¸à¶…වකà·à·à¶º)',
'shortpages' => 'කෙටි පිටු',
'longpages' => 'දිගු පිටු',
'deadendpages' => 'අපගත-සීම෠පිටු',
@@ -1966,7 +2002,7 @@ When filtered by user, only files where that user uploaded the most recent versi
'listusers-editsonly' => 'සංස්කරණයන් සිදුකර ඇති පරිà·à·“ලකයන් පමණක් පෙන්වන්න',
'listusers-creationsort' => 'තà·à¶±à·– දින අනුව සුබෙදන්න',
'usereditcount' => ' {{PLURAL:$1|සංස්කරණ එකකි|සංස්කරණ $1 කි}}',
-'usercreated' => '$1 දින $2 වේලà·à·€à·šà¶¯à·“ තනන ලදි',
+'usercreated' => '$1 දින $2 වේලà·à·€à·šà¶¯à·“ {{GENDER:$3|තනන ලදි}}',
'newpages' => 'අළුත් පිටු',
'newpages-username' => 'පරිà·à·“ලක-නà·à¶¸à¶º:',
'ancientpages' => 'පුරà·à¶«à¶­à¶¸ පිටු',
@@ -2061,12 +2097,8 @@ When filtered by user, only files where that user uploaded the most recent versi
'activeusers-noresult' => 'කිසිදු පරිà·à·“ලකයෙකු හමුනොවිණි.',
# Special:Log/newusers
-'newuserlogpage' => 'පරිà·à·“ලකයන් තà·à¶±à·“මේ සටහන',
-'newuserlogpagetext' => 'මෙය පරිà·à·’ලකයන් තà·à¶±à·“ම පිළිබඳ සටහනකි.',
-'newuserlog-byemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලෙන් මුර-පදය යවන ලදි',
-'newuserlog-create-entry' => 'නව පරිà·à·“ලක ගිණුම',
-'newuserlog-create2-entry' => '$1 නව ගිණුම තනන ලදි',
-'newuserlog-autocreate-entry' => 'ගිණුම ස්වයංක්â€à¶»à·“යව තනන ලදි',
+'newuserlogpage' => 'පරිà·à·“ලකයන් තà·à¶±à·“මේ සටහන',
+'newuserlogpagetext' => 'මෙය පරිà·à·’ලකයන් තà·à¶±à·“ම පිළිබඳ සටහනකි.',
# Special:ListGroupRights
'listgrouprights' => 'පරිà·à·“ලක කà·à¶«à·Šà¶© හිමිකම්',
@@ -2095,7 +2127,7 @@ When filtered by user, only files where that user uploaded the most recent versi
'emailpagetext' => 'මෙම පරිà·à·“ලකය෠හට විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල් පණිවුඩයක් යà·à·€à·“ම සඳහ෠මෙම ආකෘති පත්â€à¶»à¶º භà·à·€à·’ත෠කිරීමට ඔබ හට à·„à·à¶š.
ලබන්න෠විසින් සෘජු ලෙස ඔබ හට පිළිතුරු එවනු à·„à·à¶šà·’ වන පරිදි, ඔබ විසින් [[Special:Preferences|ඔබගේ පරිà·à·“ලක අභිරුචියන්]] à·„à·’ ඇතුළත් කල විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය, විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලෙහි "වෙතින්" ලිපිනයෙහි පෙන්නුම් කරනු ඇත.',
'usermailererror' => 'Mail object විසින් පහත දà·à·‚ය එවනලදී:',
-'defemailsubject' => '{{SITENAME}} විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල',
+'defemailsubject' => '{{SITENAME}} පරිà·à·“ලක "$1" වෙතින් විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල',
'usermaildisabled' => 'ඔබගේ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල අක්â€à¶»à·“ය කොට ඇත',
'usermaildisabledtext' => 'මෙම විකියෙහි අනෙකුත් පරිà·à·“ලකයන් හට විද්â€à¶ºà·”ත්-ගà·à¶´à·à¶½à·Š යà·à·€à·“මට ඔබ හට නොහà·à¶š',
'noemailtitle' => 'විද්â€à¶ºà·”ත්-ලිපිනයක් නොමà·à¶­',
@@ -2149,7 +2181,7 @@ When filtered by user, only files where that user uploaded the most recent versi
'watchmethod-list' => 'මෑත සංස්කරණයන් සඳහ෠මුර-කෙරෙන පිටු පරික්â€à·‚෠කරමින්',
'watchlistcontains' => 'ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.',
'iteminvalidname' => "'$1' අයිතමය පිළිබඳ ගà·à¶§à·…ුවක් ඇත, අනීතික නමකි...",
-'wlnote' => "පහත දà·à¶šà·Šà·€à·™à¶±à·Šà¶±à·š, අවසන් {{PLURAL:$2|පà·à¶º|පà·à¶º '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම් '''$1''' යි}}.",
+'wlnote' => "පහත දà·à¶šà·Šà·€à·™à¶±à·Šà¶±à·š $3, $4 මෙන්, අවසන් {{PLURAL:$2|පà·à¶º|පà·à¶º '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම් '''$1''' යි}}.",
'wlshowlast' => 'පසුගිය පà·à¶º $1 දින $2 $3 පෙන්වන්න',
'watchlist-options' => 'තà·à¶»à·à¶œà¶­à·„à·à¶šà·’ මුර ලà·à¶ºà·’ස්තු à·ƒà·à¶šà·ƒà·”ම්',
@@ -2207,7 +2239,6 @@ Feedback and further assistance:
'exbeforeblank' => "හිස්කිරීමට පෙරà·à¶­à·”à·€ පà·à·€à·à¶­à·’ අන්තර්ගතය වූයේ: '$1'",
'exblank' => 'පිටුව හිස්ව පà·à·€à¶­à·’ණි',
'delete-confirm' => '"$1" මක෠දමන්න',
-'delete-backlink' => '↠$1',
'delete-legend' => 'මකන්න',
'historywarning' => '"\'අවවà·à¶¯à¶ºà¶ºà·’"\': ඔබ විසින් මක෠දà·à¶¸à·“මට සූදà·à¶±à¶¸à·Š වන පිටුවට $1 {{PLURAL:$1|සංà·à·à¶°à¶±à¶º|සංà·à·à¶°à¶±}}: සමඟ ඉතිහà·à·ƒà¶ºà¶šà·Š ඇත:',
'confirmdeletetext' => 'එහි සමස්ත ඉතිහà·à·ƒà¶º හ෠සමගින් පිටුවක් මක෠දà·à¶¸à·“මට ඔබ à·ƒà·à¶»à·ƒà·™à¶ºà·’.
@@ -2216,8 +2247,6 @@ Feedback and further assistance:
'actionfailed' => 'කà·à¶»à·Šà¶ºà¶º අසà·à¶»à·Šà¶®à¶š විය',
'deletedtext' => '"$1" මක෠දම෠ඇත.
මෑත මකà·à¶¯à·à¶¸à·“ම් පිළිබඳ à·€à·à¶»à·Šà¶­à·à·€à¶šà·Š සඳහ෠$2 බලන්න.',
-'deletedarticle' => '"[[$1]]" මක෠දමන ලදි',
-'suppressedarticle' => '"[[$1]]" යටපත් කෙරිණි',
'dellogpage' => 'මකà·à¶¯à·à¶¸à·”ම් ලොග් සටහන',
'dellogpagetext' => 'පහත දà·à¶šà·Šà·€à·™à¶±à·Šà¶±à·š ඉත෠මෑතදී සිදු කර ඇති මකà·à¶¯à·à¶¸à·“ම් ලà·à¶ºà·’ස්තුවකි.',
'deletionlog' => 'මකà·-දà·à¶¸à·”ම් ලà¶à·”-සටහන',
@@ -2268,8 +2297,10 @@ $2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙන
'unprotectedarticle' => '"[[$1]]" වෙතින් ආරක්ෂණය ඉවත් කෙරිණි',
'movedarticleprotection' => '"[[$2]]" සිට "[[$1]]" දක්ව෠ආරක්ෂණ පරිස්ථිතීන් ගෙනයන ලදි',
'protect-title' => ' "$1" සඳහ෠ආරක්â€à·‚ණ මට්ටම වෙනස් කරන්න',
+'protect-title-notallowed' => ' "$1" සඳහ෠ආරක්â€à·‚ණ මට්ටම නරඹන්න',
'prot_1movedto2' => '[[$2]] දක්ව෠[[$1]] ගෙනයන ලදි',
-'protect-backlink' => '↠$1',
+'protect-badnamespace-title' => 'ආරක්ෂිතකළ-නොහà·à¶šà·’ නà·à¶¸à¶…වකà·à·à¶º',
+'protect-badnamespace-text' => 'මෙම නà·à¶¸à¶…වකà·à·à¶ºà·™à·„à·’ තිබෙන පිටු ආරක්ෂණය කල නොහà·à¶š.',
'protect-legend' => 'ආරක්â€à·‚ණය තහවුරු කරන්න',
'protectcomment' => 'හේතුව:',
'protectexpiry' => 'ඉකුත් වීම:',
@@ -2291,6 +2322,7 @@ $2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙන
'protect-level-sysop' => 'පරිපà·à¶½à¶šà·€à¶»à·”න්ට පමණයි',
'protect-summary-cascade' => 'තීරු දර්à·à¶±à¶º (cascading)',
'protect-expiring' => 'ඉකුත් වේ $1 (යූටීසි)',
+'protect-expiring-local' => 'කල් ඉකුත්වීම $1',
'protect-expiry-indefinite' => 'අනිà·à·Šà¶ à·’ත',
'protect-cascade' => 'මෙම පිටුවෙහි ඇතුළත් කර ඇති පිටු ආරක්ෂණය කරන්න (තීරු දර්à·à¶± ආරක්ෂණය)',
'protect-cantedit' => 'ඔබ හට එය සංස්කරණය කිරීමට අවසර නොමà·à¶­à·’ බà·à·€à·’න්, ඔබ හට මෙම පිටුවෙහි ආරක්ෂණ මට්ටම වෙනස් කල නොහà·à¶š.',
@@ -2351,7 +2383,6 @@ $2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙන
'undeletereset' => 'ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶»à¶¸à·Šà¶· කරන්න',
'undeleteinvert' => 'තà·à¶»à·à¶œà·à¶±à·”ම කණපිට පෙරලන්න',
'undeletecomment' => 'හේතුව:',
-'undeletedarticle' => '"[[$1]]" ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන ලදි',
'undeletedrevisions' => '{{PLURAL:$1|සංà·à·à¶°à¶±à¶ºà¶šà·Š|සංà·à·à¶°à¶± $1 ක්}} ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන ලදි',
'undeletedrevisions-files' => '{{PLURAL:$1|එක් සංà·à·à¶°à¶±à¶ºà¶šà·Š| සංà·à·à¶°à¶± $1 ක්}} සහ {{PLURAL:$2|එක් ගොනුවක්|ගොනු $2 ක්}} ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කෙරිණි',
'undeletedfiles' => '{{PLURAL:$1|එක් ගොනුවක්|ගොනු $1 ක්}} ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කෙරිණි',
@@ -2361,6 +2392,7 @@ $2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙන
මෑතදී සිදුවූ මකà·à¶¯à·à¶¸à·“ම් හ෠ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶ºà¶±à·Š à·„à·’ à·€à·à¶»à·Šà¶­à·à·€à¶šà·Š උදෙස෠[[Special:Log/delete|මකà·à¶¯à·à¶¸à·“ම් ලà¶à·”-සටහන]] පරිà·à·“ලනය කරන්න.",
'undelete-header' => 'මෑතදී මකà·à¶¯à·à¶¸à·”ණු පිටු සඳහ෠[[Special:Log/delete|මකà·à¶¯à·à¶¸à·”ම් ලà¶à·”-සටහන]] බලන්න.',
+'undelete-search-title' => 'මකà·à¶¯à·à¶¸à·– පිටු ගවේෂණය කරන්න',
'undelete-search-box' => 'මක෠දà·à¶¸à·– පිටු ගවේෂණය කරන්න',
'undelete-search-prefix' => 'මෙයින් ඇරඹෙන පිටු පෙන්වන්න:',
'undelete-search-submit' => 'ගවේෂණය',
@@ -2370,6 +2402,7 @@ $2 ගේ අවසන් අනුවà·à¶¯à¶º වෙතට යළි වෙන
'undelete-cleanup-error' => 'භà·à·€à·’ත෠නොකල සංරක්ෂිත ගොනුව "$1" මකà·à¶¯à·à¶¸à·“මෙහිදී දà·à·‚ ඇතිවිය.',
'undelete-missing-filearchive' => '$1 ගොනු සංරක්ෂණ අනන්â€à¶ºà·à¶‚කය දත්ත-ගබඩà·à·€à·™à·„à·’ නොමà·à¶­à·’ නිස෠ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කල නොහà·à¶šà·’ විය.
එහි මකà·à¶¯à·à¶¸à·”ම දà·à¶±à¶§à¶¸à¶­à·Š අවලංගු කර ඇතුව෠විය à·„à·à¶š.',
+'undelete-error' => 'පිටුව මකà·à¶±à·œà¶¯à·à¶¸à·“මේ දà·à·‚ය',
'undelete-error-short' => 'මෙම ගොනුව මකà·à¶¯à·à¶¸à·“ම අවලංගු කිරීමේදී දà·à·‚යක් ඇති විය: $1',
'undelete-error-long' => 'මෙම ගොනුව මකà·à¶¯à·à¶¸à·“ම අවලංගු කිරීමේදී දà·à·‚ හමු විය:
@@ -2415,7 +2448,6 @@ $1',
'whatlinkshere' => 'සබà·à¶³à·’ පිටු',
'whatlinkshere-title' => '"$1" වෙත සබà·â€à¶³à·™à¶± පිටු',
'whatlinkshere-page' => 'පිටුව:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "ඉදිරියෙහි දà·à¶šà·Šà·€à·™à¶± පිටු, '''[[:$1]]''' වෙත සබà·à¶³à·™à¶ºà·’:",
'nolinkshere' => "'''[[:$1]]''' වෙත කිසිදු පිටුවක් සබà·à¶³à·“ නොමà·à¶­.",
'nolinkshere-ns' => "තà·à¶»à·à¶œà·™à¶± ඇති නà·à¶¸-අවකà·à·à¶º තුලදී, කිසිදු පිටුවක්, '''[[:$1]]''' වෙත නොබà·à¶³à·™à¶ºà·’.",
@@ -2489,6 +2521,7 @@ $1',
'blocklist-userblocks' => 'ගිණුම් à·€à·à¶»à¶« සඟවන්න',
'blocklist-tempblocks' => 'තà·à·€à¶šà·à¶½à·’ක à·€à·à¶»à¶« සඟවන්න',
'blocklist-addressblocks' => 'ඒක IP ලිපින à·€à·à¶»à¶« සඟවන්න',
+'blocklist-rangeblocks' => 'à·ƒà·à¶Ÿà·€à·”ණු පරà·à·ƒ à·€à·à¶»à¶«à¶ºà¶±à·Š',
'blocklist-timestamp' => 'කà·à¶½à¶¸à·”ද්â€à¶»à·à·€',
'blocklist-target' => 'ඉලක්කය',
'blocklist-expiry' => 'ඉකුත් වන්නේ',
@@ -2511,6 +2544,7 @@ $1',
'unblocklink' => 'à·€à·à¶»à¶«à¶ºà·™à¶±à·Š ඉවත්වන්න',
'change-blocklink' => 'à·€à·à¶»à¶šà¶º වෙනස් කරන්න',
'contribslink' => 'දà·à¶ºà¶šà¶­à·Šà·€',
+'emaillink' => 'ඊ-තà·à¶´à·‘ලක් යවන්න',
'autoblocker' => 'ඔබගේ අන්තර්ජà·à¶½ ලිපිනය "[[User:$1|$1]]" විසින් මෑතකදී භà·à·€à·’ත෠කර ඇති බà·à·€à·’න් ඔබ ස්වයංක්â€à¶»à·“ය-à·€à·à¶»à¶«à¶ºà¶šà¶§ ලක් කර ඇත.
$1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'blocklogpage' => 'à·€à·à¶»à¶« සටහන',
@@ -2643,9 +2677,6 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'movepage-page-moved' => ' $1 පිටුව $2 වෙත ගෙනයන ලදි.',
'movepage-page-unmoved' => ' $1 පිටුව $2 වෙත ගෙනයෑම සිදුකල නොහà·à¶šà·’ විය.',
'movepage-max-pages' => '{{PLURAL:$1|එක් පිටුවක|පිටු $1 ක}} උපරිමයකට යටත්ව ගෙනයෑම සිදුකර ඇති අතර ස්වයංක්â€à¶»à·“ය ලෙස ගෙනයෑම තවදුරටත් සිදු නොවනු ඇත.',
-'1movedto2' => '[[$1]] යන්න [[$2]] වෙත ගෙන යන ලදි',
-'1movedto2_redir' => 'ආපසු හරව෠යà·à·€à·“මක් ඔස්සේ [[$2]] වෙත [[$1]] ගෙන යන ලදි',
-'move-redirect-suppressed' => 'යළි-යොමුකිරීම් යටපත් කෙරිණි',
'movelogpage' => 'ගෙනයෑම් සටහන',
'movelogpagetext' => 'පහත දà·à¶šà·Šà·€à·™à¶±à·Šà¶±à·š ගෙනගිය පිටු ලà·à¶ºà·’ස්තුවකි.',
'movesubpage' => '{{PLURAL:$1|උපපිටුව|උපපිටු}}',
@@ -2658,7 +2689,7 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
අන්ත පිටුව "[[:$1]]" දà·à¶±à¶§à¶¸à¶­à·Š පවතියි.
එය මකà·à¶¯à¶¸à· ගෙනයà·à¶¸ සඳහ෠පෙත එළි කිරීමට ඔබ හට ඇවà·à·ƒà·’ද?',
'delete_and_move_confirm' => 'ඔව්, පිටුව මක෠දමන්න',
-'delete_and_move_reason' => 'ගෙන යෑම සඳහ෠ඉඩ සලසනු වස් මකà·à¶¯à¶¸à¶± ලදි',
+'delete_and_move_reason' => '"[[$1]]" ගෙනයෑම සඳහ෠ඉඩ ලබà·à¶œà·à¶±à·“ම සඳහ෠මකà·à¶¯à¶¸à¶± ලදී',
'selfmove' => 'මූල හ෠අන්ත à·à·“ර්ෂ දෙකම එකමය;
පිටුවක් එය වෙතම ගෙන ය෠නොහà·à¶š.',
'immobile-source-namespace' => '"$1" නà·à¶¸à¶…වකà·à·à¶ºà·™à·„à·’ පිටු ගෙනයà·à¶¸ සිදුකල නොහà·à¶š',
@@ -2689,9 +2720,11 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
පිටු නිර්යà·à¶­ කිරීම සඳහà·, පහත පෙළ කොටුවේ, එක් පේළියකට එක් à·à·“ර්ෂයක් වන පරිදී à·à·“ර්ෂයන් ඇතුළු කොට, ඔබට ඇවà·à·ƒà·’ වන්නේ, පිටු ඉතිහà·à·ƒ පේළි හ෠සමගින් සියළු පà·à¶»à·à¶«à·’ අනුවà·à¶¯à¶ºà¶±à·Š මෙන්ම වත්මන් අනුවà·à¶¯à¶ºà¶¯ නà·à¶­à·„ොත් අවසන් සංස්කරණය පිළිබඳ තොරතුරු සමග වත්මන් අනුවà·à¶¯à¶ºà¶¯ යන වග තà·à¶»à·à¶œà¶­ යුතුය.
අපරà·à¶šà·Šà¶­ අවස්ථà·à·€à·™à·„ිදී ඔබහට සබà·à¶³à·’යක්ද භà·à·€à·’ත෠කල à·„à·à¶š, නිද. "[[{{MediaWiki:Mainpage}}]]" පිටුව සඳහ෠[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'සියළු පිටු නිර්යà·à¶­ කරන්න',
'exportcuronly' => 'සම්පූර්ණ ඉතිහà·à·ƒà¶º නොව වත්මන් සංà·à·à¶°à¶±à¶º පමණක් අඩංගු කරන්න',
'exportnohistory' => "----
'''සටහන:''' කà·à¶»à·Šà¶ºà·ƒà·à¶°à¶± හේතූන් නිසà·à·€à·™à¶±à·Š මෙම ආකෘති පත්â€à¶»à¶º භà·à·€à·’තයෙන් පිටුවල සම්පූර්ණ ඉතිහà·à·ƒà¶º නිර්යà·à¶­ කිරීම අක්â€à¶»à·“ය කොට ඇත.",
+'exportlistauthors' => 'එක් එක් පිටුවක් සඳහ෠සම්පූර්ණ දà·à¶ºà¶šà¶ºà¶±à·Šà¶œà·š ලà·à¶ºà·’ස්තුවක් අඩංගු කරන්න',
'export-submit' => 'නිර්යà·à¶­',
'export-addcattext' => 'ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà·™à¶±à·Š පිටු එනතු කරන්න:',
'export-addcat' => 'එක් කරන්න',
@@ -2724,6 +2757,8 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'thumbnail_error' => 'සිඟිති-රූපයක් තà·à¶±à·“මෙහිදී ඇතිවූ දà·à·‚ය: $1',
'djvu_page_error' => 'සීමà·à·€ ඉක්මව෠ගිය DjVu පිටුව',
'djvu_no_xml' => 'XML à·„à· DjVu හ෠ගොනුව අත්කරගà·à¶±à·”මට නොහà·à¶šà·’ විය',
+'thumbnail-temp-create' => 'තà·à·€à¶šà·à¶½à·’ක සංක්ෂිප්ත ගොනුව තà·à¶±à·“මට නොහà·à¶šà·’ වුණි',
+'thumbnail-dest-create' => 'ගමනà·à¶±à·Šà¶­à¶º වෙත සිඟිතිරුව සුරà·à¶šà·“මට අපොහොසත් වුණි',
'thumbnail_invalid_params' => 'සිඟිති-රූපයේ පරà·à¶¸à·’තික අනීතිකයි',
'thumbnail_dest_directory' => 'අන්ත ඩිරෙක්ටරිය තà·à¶±à·“ම කල නොහà·à¶š',
'thumbnail_image-type' => 'රූප වර්ගය සඳහ෠අනුග්â€à¶»à·„ය සපයනු නොලà·à¶¶à·š',
@@ -2772,6 +2807,8 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'import-token-mismatch' => 'à·ƒà·à·ƒà·’ දත්ත à·„à·à¶±à·’යකි.
කරුණà·à¶šà¶» නà·à·€à¶­ උත්සà·à·„ කරන්න.',
'import-invalid-interwiki' => 'සඳහන් කර ඇති විකියෙන් ආයà·à¶­ කිරීම සිදු කල නොහà·à¶š.',
+'import-error-edit' => '"$1" පිටුව ආයà·à¶­ නොකරන ලදී මන්ද ඔබට එය සංස්කරණය කිරීමට ඉඩ නොදේ.',
+'import-error-create' => '"$1" පිටුව ආයà·à¶­ නොකරන ලදී මන්ද ඔබට එය තà·à¶±à·“මට ඉඩ නොදේ.',
# Import log
'importlogpage' => 'ලà¶à·”-සටහන් ආයà·à¶­ කරන්න',
@@ -2781,75 +2818,82 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'import-logentry-interwiki' => '$1 අන්තර්විකීකරණය කරන ලදි',
'import-logentry-interwiki-detail' => '$2 වෙතින් {{PLURAL:$1|එක් සංà·à·à¶°à¶±à¶ºà¶šà·Š|සංà·à·à¶°à¶± $1 ක්}}',
+# JavaScriptTest
+'javascripttest' => 'ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් පරික්ෂà·à¶šà¶»à¶¸à·’න්',
+'javascripttest-title' => '$1 පරික්ෂණ සිදුකරමින්',
+'javascripttest-pagetext-noframework' => 'මෙම පිටුව ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් පරික්ෂණ සිදුකිරීම සඳහ෠වෙන්කර ඇත.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'ඔබගේ පරිà·à·“ලක පිටුව',
-'tooltip-pt-anonuserpage' => 'සංස්කරණයට ඔබ භà·à·€à·’ත෠කරමින් පවතින අන්තර්ජà·à¶½ ලිපිනය සඳහ෠පරිà·à·“ලක පිටුව',
-'tooltip-pt-mytalk' => 'ඔබගේ සංවà·à¶¯ පිටුව',
-'tooltip-pt-anontalk' => 'මෙම අන්තර්ජà·à¶½ ලිපිනයෙන් කර ඇති සංස්කරණයන් පිළිබඳ à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
-'tooltip-pt-preferences' => 'මගේ අභිරුචි',
-'tooltip-pt-watchlist' => 'වෙනස්වීම් සිදුවී තිබේදà·à¶ºà·’ යන්න පිලිබඳව ඔබගේ විමසුමට ලක්ව ඇති පිටු ලà·à¶ºà·’ස්තුව',
-'tooltip-pt-mycontris' => 'ඔබගේ දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š ලà·à¶ºà·’ස්තුවâ€',
-'tooltip-pt-login' => 'ප්â€à¶»à·€à·’සීම වඩ෠යà·à¶œà·Šâ€à¶ºà·€à·š. නමුත් එය අනිවà·à¶»à·Šà¶º නà·à¶­.',
-'tooltip-pt-anonlogin' => 'එය අවà·à·Šâ€à¶ºâ€à¶ºà·™à¶±à·Š කල යුත්තක් â€à¶±à·œà·€à·”නද, ප්â€à¶»à·€à·’ෂ්ට වීම සඳහ෠ඔබ ධෛර්යමත් කරනු ලà·à¶¶à·š.',
-'tooltip-pt-logout' => 'නික්මීම',
-'tooltip-ca-talk' => 'අන්තර්ගත පිටුව පිළිබඳ à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
-'tooltip-ca-edit' => 'ඔබâ€à¶§ මෙම පිටුව සංස්කරණය කල à·„à·à¶š.
+'tooltip-pt-userpage' => 'ඔබගේ පරිà·à·“ලක පිටුව',
+'tooltip-pt-anonuserpage' => 'සංස්කරණයට ඔබ භà·à·€à·’ත෠කරමින් පවතින අන්තර්ජà·à¶½ ලිපිනය සඳහ෠පරිà·à·“ලක පිටුව',
+'tooltip-pt-mytalk' => 'ඔබගේ සංවà·à¶¯ පිටුව',
+'tooltip-pt-anontalk' => 'මෙම අන්තර්ජà·à¶½ ලිපිනයෙන් කර ඇති සංස්කරණයන් පිළිබඳ à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
+'tooltip-pt-preferences' => 'මගේ අභිරුචි',
+'tooltip-pt-watchlist' => 'වෙනස්වීම් සිදුවී තිබේදà·à¶ºà·’ යන්න පිලිබඳව ඔබගේ විමසුමට ලක්ව ඇති පිටු ලà·à¶ºà·’ස්තුව',
+'tooltip-pt-mycontris' => 'ඔබගේ දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š ලà·à¶ºà·’ස්තුවâ€',
+'tooltip-pt-login' => 'ප්â€à¶»à·€à·’සීම වඩ෠යà·à¶œà·Šâ€à¶ºà·€à·š. නමුත් එය අනිවà·à¶»à·Šà¶º නà·à¶­.',
+'tooltip-pt-anonlogin' => 'එය අවà·à·Šâ€à¶ºâ€à¶ºà·™à¶±à·Š කල යුත්තක් â€à¶±à·œà·€à·”නද, ප්â€à¶»à·€à·’ෂ්ට වීම සඳහ෠ඔබ ධෛර්යමත් කරනු ලà·à¶¶à·š.',
+'tooltip-pt-logout' => 'නික්මීම',
+'tooltip-ca-talk' => 'අන්තර්ගත පිටුව පිළිබඳ à·ƒà·à¶šà¶ à·Šà¶¡à·à·€',
+'tooltip-ca-edit' => 'ඔබâ€à¶§ මෙම පිටුව සංස්කරණය කල à·„à·à¶š.
සුරà·à¶šà·“මට පෙර කරුණà·à¶šà¶» පෙරදසුන බොත්තම භà·à·€à·’ත෠කරන්න.',
-'tooltip-ca-addsection' => 'නව ඡේදයක් අරඹන්න',
-'tooltip-ca-viewsource' => 'මෙම පිටුව ආරක්â€à·‚ණය කොට ඇත.
+'tooltip-ca-addsection' => 'නව ඡේදයක් අරඹන්න',
+'tooltip-ca-viewsource' => 'මෙම පිටුව ආරක්â€à·‚ණය කොට ඇත.
ඔබට එහි මූලà·à·à·Šâ€à¶»à¶º නà·à¶»à¶¹à·’ය à·„à·à¶š.',
-'tooltip-ca-history' => 'මෙම පිටුවේ පෙර අනුවà·à¶¯à¶ºà¶±à·Š.',
-'tooltip-ca-protect' => 'මෙම පිටුව ආරක්â€à·‚ණය කරන්න',
-'tooltip-ca-unprotect' => 'මෙම පිටුවෙහි ආරක්ෂණ තත්වය වෙනස් කරන්න',
-'tooltip-ca-delete' => 'මේ පිටුව මකන්න',
-'tooltip-ca-undelete' => 'මෙම පිටුව මක෠දà·à¶¸à·“මට පෙර එයට සිදුකල සංස්කරණයන් නà·à·€à¶­ ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන්න',
-'tooltip-ca-move' => 'මෙම පිටුව ගෙන යන්න',
-'tooltip-ca-watch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
-'tooltip-ca-unwatch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙන් ඉවත් කරන්න',
-'tooltip-search' => '{{SITENAME}} ගවේෂණය කරන්න',
-'tooltip-search-go' => 'මෙම නà·à¶¸à¶º එලෙසම ඇති පිටුවක් ඇත්නම් එය වෙත යන්න',
-'tooltip-search-fulltext' => 'මෙම පà·à¶¨à¶º සඳහ෠පිටු ගවේෂණය කරන්න',
-'tooltip-p-logo' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
-'tooltip-n-mainpage' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
-'tooltip-n-mainpage-description' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
-'tooltip-n-portal' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිළිබඳ, ඔබට කල à·„à·à¶šà·Šà¶šà·š කුමක්ද, තොරතුරු සොයà·à¶œà¶­ à·„à·à¶šà·Šà¶šà·š කොතà·à¶±à¶¯',
-'tooltip-n-currentevents' => 'කà·à¶½à·“න සිදුවීම් පිළිබඳ පසුබිම් තොරතුරු සොය෠දà·à¶±à¶œà¶±à·Šà¶±',
-'tooltip-n-recentchanges' => 'විකියෙහි මෑත වෙනස්කිරීම් ලà·à¶ºà·’ස්තුවක්',
-'tooltip-n-randompage' => 'අහඹු පිටුවක් ලà·à¶©à·Šà¶šà¶»à¶±à·Šà¶±',
-'tooltip-n-help' => 'සොය෠දà·à¶±à¶œà¶­ à·„à·à¶šà·’ තà·à¶±',
-'tooltip-t-whatlinkshere' => 'මෙය හ෠සබà·â€à¶³à·™à¶± සියළු විකි පිටු ලà·à¶ºà·’ස්තුව',
-'tooltip-t-recentchangeslinked' => 'මෙම පිටුව හ෠සබà·à¶³à·’ පිටුවල â€à¶±à·€ වෙනස්වීම්',
-'tooltip-feed-rss' => 'මෙම පිටුව සඳහ෠RSS පà·à·‚කය',
-'tooltip-feed-atom' => 'මෙම පිටුව සඳහ෠අටà·à¶¸à·Š පà·à·‚කය',
-'tooltip-t-contributions' => 'මෙම පරිà·à·“ලකයà·à¶œà·š දà·à¶ºà¶šà¶­à·Šà·€ ලà·à¶ºà·’ස්තුව නරඹන්න',
-'tooltip-t-emailuser' => 'මෙම පරිà·à·“ලකයà·à¶§ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යවන්න',
-'tooltip-t-upload' => 'ගොනු උඩුගත කරන්න',
-'tooltip-t-specialpages' => 'සියලු විà·à·šà·‚ පිටු ලà·à¶ºà·’ස්තුව',
-'tooltip-t-print' => 'මෙම පිටුවෙහි මුද්â€à¶»à¶«à¶º කල à·„à·à¶šà·’ අනුවà·à¶¯à¶º',
-'tooltip-t-permalink' => 'පිටුවෙහි මෙම අනුවà·à¶¯à¶ºà¶§, ස්ථà·à·€à¶» බà·à¶³à·’ය',
-'tooltip-ca-nstab-main' => 'අන්තර්ගත පිටුව නරඹන්න',
-'tooltip-ca-nstab-user' => 'පරිà·à·“ලක පිටුව නරඹන්න',
-'tooltip-ca-nstab-media' => 'මà·à¶°à·Šâ€à¶º පිටුව නරඹන්න',
-'tooltip-ca-nstab-special' => 'මෙය විà·à·šà·‚ පිටුවකි, එයම සංස්කරණය කිරීමට ඔබට නොහà·à¶š',
-'tooltip-ca-nstab-project' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිටුව නරඹන්න',
-'tooltip-ca-nstab-image' => 'ගොනු පිටුව නරඹන්න',
-'tooltip-ca-nstab-mediawiki' => 'පද්ධති පණිවුඩය නරඹන්න',
-'tooltip-ca-nstab-template' => 'à·ƒà·à¶šà·’ල්ල නරඹන්න',
-'tooltip-ca-nstab-help' => 'උදවු පිටුව නරඹන්න',
-'tooltip-ca-nstab-category' => 'ප්â€à¶»à·€à¶»à·Šà¶œ පිටුව නරඹන්න',
-'tooltip-minoredit' => 'මෙය සුළු සංස්කරණයක් ලෙස සටහන් කරන්න',
-'tooltip-save' => 'වෙනස්කිරීම් සුරකින්න',
-'tooltip-preview' => 'ඔබ†කල වෙනස්කිරීම් පෙර-දසුන් කර, ඉන් අනතුරුව සුරà·à¶šà·“මට කà·à¶»à·”ණික වන්න!',
-'tooltip-diff' => 'පෙළෙහි ඔබ සිදුකල වෙනස්වීම් මොනවà·à¶¯à·à¶ºà·’ දක්වන්න.',
-'tooltip-compareselectedversions' => 'මෙම පිටුවෙහි, තà·à¶»à·à¶œà·™à¶± ඇති අනුවà·à¶¯ දෙක අතර වෙනස්කම් බලන්න.',
-'tooltip-watch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
-'tooltip-recreate' => 'පිටුව මකà·à¶¯à¶¸à· ඇති වුවද, එය යළි-නිර්මà·à¶«à¶º කරන්න',
-'tooltip-upload' => 'උඩුගත කිරීම අරඹන්න',
-'tooltip-rollback' => '"ප්â€à¶»à¶­à·’වර්තනය" එක් වරක් ක්ලික් කිරීමෙහි ප්â€à¶»à¶­à·’ඵලය වනුයේ, සංස්කරණය(න්) ප්â€à¶»à¶­à·’වර්තනය වී, අවසන් දà·à¶ºà¶šà¶ºà· විසින් à·ƒà·à¶¯à·– මෙම පිටුව වෙත පිටුව ගෙන ඒමයි.',
-'tooltip-undo' => '"අහà·à·ƒà·’" මගින් සිදුකෙරෙනුයේ මෙම සංස්කරණය ප්â€à¶»à¶­à·’වර්තනය කොට, සංස්කරණ-ආකෘතිය, පෙරදසුන් මà·à¶¯à·’ලියෙහි විවෘත කිරීමයි.
+'tooltip-ca-history' => 'මෙම පිටුවේ පෙර අනුවà·à¶¯à¶ºà¶±à·Š.',
+'tooltip-ca-protect' => 'මෙම පිටුව ආරක්â€à·‚ණය කරන්න',
+'tooltip-ca-unprotect' => 'මෙම පිටුවෙහි ආරක්ෂණ තත්වය වෙනස් කරන්න',
+'tooltip-ca-delete' => 'මේ පිටුව මකන්න',
+'tooltip-ca-undelete' => 'මෙම පිටුව මක෠දà·à¶¸à·“මට පෙර එයට සිදුකල සංස්කරණයන් නà·à·€à¶­ ප්â€à¶»à¶­à·’ෂ්ඨà·à¶´à¶±à¶º කරන්න',
+'tooltip-ca-move' => 'මෙම පිටුව ගෙන යන්න',
+'tooltip-ca-watch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
+'tooltip-ca-unwatch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙන් ඉවත් කරන්න',
+'tooltip-search' => '{{SITENAME}} ගවේෂණය කරන්න',
+'tooltip-search-go' => 'මෙම නà·à¶¸à¶º එලෙසම ඇති පිටුවක් ඇත්නම් එය වෙත යන්න',
+'tooltip-search-fulltext' => 'මෙම පà·à¶¨à¶º සඳහ෠පිටු ගවේෂණය කරන්න',
+'tooltip-p-logo' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
+'tooltip-n-mainpage' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
+'tooltip-n-mainpage-description' => 'මුල් පිටුවâ€à¶§ පිවිසෙන්න',
+'tooltip-n-portal' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිළිබඳ, ඔබට කල à·„à·à¶šà·Šà¶šà·š කුමක්ද, තොරතුරු සොයà·à¶œà¶­ à·„à·à¶šà·Šà¶šà·š කොතà·à¶±à¶¯',
+'tooltip-n-currentevents' => 'කà·à¶½à·“න සිදුවීම් පිළිබඳ පසුබිම් තොරතුරු සොය෠දà·à¶±à¶œà¶±à·Šà¶±',
+'tooltip-n-recentchanges' => 'විකියෙහි මෑත වෙනස්කිරීම් ලà·à¶ºà·’ස්තුවක්',
+'tooltip-n-randompage' => 'අහඹු පිටුවක් ලà·à¶©à·Šà¶šà¶»à¶±à·Šà¶±',
+'tooltip-n-help' => 'සොය෠දà·à¶±à¶œà¶­ à·„à·à¶šà·’ තà·à¶±',
+'tooltip-t-whatlinkshere' => 'මෙය හ෠සබà·â€à¶³à·™à¶± සියළු විකි පිටු ලà·à¶ºà·’ස්තුව',
+'tooltip-t-recentchangeslinked' => 'මෙම පිටුව හ෠සබà·à¶³à·’ පිටුවල â€à¶±à·€ වෙනස්වීම්',
+'tooltip-feed-rss' => 'මෙම පිටුව සඳහ෠RSS පà·à·‚කය',
+'tooltip-feed-atom' => 'මෙම පිටුව සඳහ෠අටà·à¶¸à·Š පà·à·‚කය',
+'tooltip-t-contributions' => 'මෙම පරිà·à·“ලකයà·à¶œà·š දà·à¶ºà¶šà¶­à·Šà·€ ලà·à¶ºà·’ස්තුව නරඹන්න',
+'tooltip-t-emailuser' => 'මෙම පරිà·à·“ලකයà·à¶§ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලක් යවන්න',
+'tooltip-t-upload' => 'ගොනු උඩුගත කරන්න',
+'tooltip-t-specialpages' => 'සියලු විà·à·šà·‚ පිටු ලà·à¶ºà·’ස්තුව',
+'tooltip-t-print' => 'මෙම පිටුවෙහි මුද්â€à¶»à¶«à¶º කල à·„à·à¶šà·’ අනුවà·à¶¯à¶º',
+'tooltip-t-permalink' => 'පිටුවෙහි මෙම අනුවà·à¶¯à¶ºà¶§, ස්ථà·à·€à¶» බà·à¶³à·’ය',
+'tooltip-ca-nstab-main' => 'අන්තර්ගත පිටුව නරඹන්න',
+'tooltip-ca-nstab-user' => 'පරිà·à·“ලක පිටුව නරඹන්න',
+'tooltip-ca-nstab-media' => 'මà·à¶°à·Šâ€à¶º පිටුව නරඹන්න',
+'tooltip-ca-nstab-special' => 'මෙය විà·à·šà·‚ පිටුවකි, එයම සංස්කරණය කිරීමට ඔබට නොහà·à¶š',
+'tooltip-ca-nstab-project' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිටුව නරඹන්න',
+'tooltip-ca-nstab-image' => 'ගොනු පිටුව නරඹන්න',
+'tooltip-ca-nstab-mediawiki' => 'පද්ධති පණිවුඩය නරඹන්න',
+'tooltip-ca-nstab-template' => 'à·ƒà·à¶šà·’ල්ල නරඹන්න',
+'tooltip-ca-nstab-help' => 'උදවු පිටුව නරඹන්න',
+'tooltip-ca-nstab-category' => 'ප්â€à¶»à·€à¶»à·Šà¶œ පිටුව නරඹන්න',
+'tooltip-minoredit' => 'මෙය සුළු සංස්කරණයක් ලෙස සටහන් කරන්න',
+'tooltip-save' => 'වෙනස්කිරීම් සුරකින්න',
+'tooltip-preview' => 'ඔබ†කල වෙනස්කිරීම් පෙර-දසුන් කර, ඉන් අනතුරුව සුරà·à¶šà·“මට කà·à¶»à·”ණික වන්න!',
+'tooltip-diff' => 'පෙළෙහි ඔබ සිදුකල වෙනස්වීම් මොනවà·à¶¯à·à¶ºà·’ දක්වන්න.',
+'tooltip-compareselectedversions' => 'මෙම පිටුවෙහි, තà·à¶»à·à¶œà·™à¶± ඇති අනුවà·à¶¯ දෙක අතර වෙනස්කම් බලන්න.',
+'tooltip-watch' => 'මෙම පිටුව ඔබගේ මුර-ලà·à¶ºà·’ස්තුවට එක් කරන්න',
+'tooltip-watchlistedit-normal-submit' => 'à·à·“ර්ෂයන් ඉවත් කරන්න',
+'tooltip-watchlistedit-raw-submit' => 'මුර-ලà·à¶ºà·’ස්තුව යà·à·€à¶­à·Šà¶šà·à¶½à·“න කරන්න',
+'tooltip-recreate' => 'පිටුව මකà·à¶¯à¶¸à· ඇති වුවද, එය යළි-නිර්මà·à¶«à¶º කරන්න',
+'tooltip-upload' => 'උඩුගත කිරීම අරඹන්න',
+'tooltip-rollback' => '"ප්â€à¶»à¶­à·’වර්තනය" එක් වරක් ක්ලික් කිරීමෙහි ප්â€à¶»à¶­à·’ඵලය වනුයේ, සංස්කරණය(න්) ප්â€à¶»à¶­à·’වර්තනය වී, අවසන් දà·à¶ºà¶šà¶ºà· විසින් à·ƒà·à¶¯à·– මෙම පිටුව වෙත පිටුව ගෙන ඒමයි.',
+'tooltip-undo' => '"අහà·à·ƒà·’" මගින් සිදුකෙරෙනුයේ මෙම සංස්කරණය ප්â€à¶»à¶­à·’වර්තනය කොට, සංස්කරණ-ආකෘතිය, පෙරදසුන් මà·à¶¯à·’ලියෙහි විවෘත කිරීමයි.
à·ƒà·à¶»à·à¶‚à·à¶ºà·™à·„à·’, මේ පිළිබඳව හේතුවක් පල කිරීමට, ඔබට ඉඩ à·ƒà·à¶½à·ƒà·š.',
-'tooltip-preferences-save' => 'අභිරුචීන් සුරකින්න',
-'tooltip-summary' => 'කෙටි à·ƒà·à¶»à·à¶‚à·à¶ºà¶šà·Š ඇතුළත් කරන්න',
+'tooltip-preferences-save' => 'අභිරුචීන් සුරකින්න',
+'tooltip-summary' => 'කෙටි à·ƒà·à¶»à·à¶‚à·à¶ºà¶šà·Š ඇතුළත් කරන්න',
# Stylesheets
'common.css' => '/* මෙහි CSS බහà·à¶½à·“ම සියළු ඡවියයන් භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
@@ -2926,9 +2970,6 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
# Patrol log
'patrol-log-page' => 'පරික්ෂà·à¶šà·’රීම් සටහන',
'patrol-log-header' => 'මෙය පරික්â€à·‚à·à¶šà¶» බà·à¶½à·– සංà·à·à¶°à¶±à¶ºà¶±à·Šà¶œà·š ලà¶à·”-සටහනකි.',
-'patrol-log-line' => '$2 à·„à·’ $1 පරික්ෂ෠කර බà·à¶½à·– බව $3 à·„à·’ ලකුණු කෙරිණි',
-'patrol-log-auto' => '(ස්වයංක්â€à¶»à·“ය)',
-'patrol-log-diff' => 'r$1',
'log-show-hide-patrol' => 'පරික්â€à·‚à·à¶šà·’රීම් ලà¶à·”-සටහන් $1',
# Image deletion
@@ -2947,23 +2988,25 @@ $1',
'nextdiff' => 'නවීන සංස්කරණය →',
# Media information
-'mediawarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’''': අනිෂ්ට කේතයන් මෙම ගොනුවෙහි අඩංගු විය à·„à·à¶š.
+'mediawarning' => "'''අවවà·à¶¯à¶ºà¶ºà·’''': අනිෂ්ට කේතයන් මෙම ගොනුවෙහි අඩංගු විය à·„à·à¶š.
එය ක්â€à¶»à·’යà·à¶­à·Šà¶¸à¶š කිරීමෙන්, ඔබගේ පද්ධතියට à·„à·à¶±à·’විය à·„à·à¶š.",
-'imagemaxsize' => "රූප ප්â€à¶»à¶¸à·à¶« සීමà·à·€:<br />''(ගොනු විස්තර පිටු සඳහà·)''",
-'thumbsize' => 'සිඟිති-රූපයේ විà·à·à¶½à¶­à·Šà·€à¶º:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|පිටුව|පිටු}}',
-'file-info' => 'ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $1, MIME වර්ගය: $2',
-'file-info-size' => '$1 × $2 පික්සල, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3, MIME à·à·›à¶½à·’ය: $4',
-'file-info-size-pages' => '$1 × $2 පික්සල, ගොනු තරම: $3, MIME වර්ගය: $4, $5 {{PLURAL:$5|පිටුව|පිටු}}',
-'file-nohires' => '<small>මෙයට ඉහල විසර්ජනයක්(resolution) දක්ව෠එළඹිය නොහà·à¶š.</small>',
-'svg-long-desc' => 'SVG ගොනුව, නà·à¶¸à¶¸à·à¶­à·Šâ€à¶»à·’කව $1 × $2 පික්සල්, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3',
-'show-big-image' => 'පූර්ණ විභේදනය',
-'show-big-image-size' => '$1 × $2 පික්සල',
-'file-info-gif-looped' => 'වලිත',
-'file-info-gif-frames' => '$1 {{PLURAL:$1රà·à¶¸à·”à·€|රà·à¶¸à·”}}',
-'file-info-png-looped' => 'ලුපගත වී ඇත',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|එක් වරක්| $1 වරක්}} ප්â€à¶»à¶­à·’à·€à·à¶¯à¶±à¶º කෙරිණි',
-'file-info-png-frames' => '$1 {{PLURAL:$1|රà·à¶¸à·”à·€|රà·à¶¸à·”}}',
+'imagemaxsize' => "රූප ප්â€à¶»à¶¸à·à¶« සීමà·à·€:<br />''(ගොනු විස්තර පිටු සඳහà·)''",
+'thumbsize' => 'සිඟිති-රූපයේ විà·à·à¶½à¶­à·Šà·€à¶º:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|පිටුව|පිටු}}',
+'file-info' => 'ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $1, MIME වර්ගය: $2',
+'file-info-size' => '$1 × $2 පික්සල, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3, MIME à·à·›à¶½à·’ය: $4',
+'file-info-size-pages' => '$1 × $2 පික්සල, ගොනු තරම: $3, MIME වර්ගය: $4, $5 {{PLURAL:$5|පිටුව|පිටු}}',
+'file-nohires' => 'මෙයට ඉහල විසර්ජනයක් (resolution) දක්ව෠එළඹිය නොහà·à¶š.',
+'svg-long-desc' => 'SVG ගොනුව, නà·à¶¸à¶¸à·à¶­à·Šâ€à¶»à·’කව $1 × $2 පික්සල්, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3',
+'show-big-image' => 'පූර්ණ විභේදනය',
+'show-big-image-preview' => 'මෙම පෙරදසුනෙහි තරම: $1.',
+'show-big-image-other' => 'අනෙකුත් {{PLURAL:$2|විභේදනය|විභේදනයන්}}: $1.',
+'show-big-image-size' => '$1 × $2 පික්සල',
+'file-info-gif-looped' => 'වලිත',
+'file-info-gif-frames' => '$1 {{PLURAL:$1රà·à¶¸à·”à·€|රà·à¶¸à·”}}',
+'file-info-png-looped' => 'ලුපගත වී ඇත',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|එක් වරක්| $1 වරක්}} ප්â€à¶»à¶­à·’à·€à·à¶¯à¶±à¶º කෙරිණි',
+'file-info-png-frames' => '$1 {{PLURAL:$1|රà·à¶¸à·”à·€|රà·à¶¸à·”}}',
# Special:NewFiles
'newimages' => 'නව ගොනු ගà·à¶½à¶»à·’ය',
@@ -2979,9 +3022,14 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 'තත්',
-'minutes-abbrev' => 'විනà·',
-'hours-abbrev' => 'පà·à¶º',
+'seconds-abbrev' => '$1තත්',
+'minutes-abbrev' => '$1විනà·',
+'hours-abbrev' => '$1පà·à¶º',
+'seconds' => '{{PLURAL:$1|$1 තත්පරය|$1 තත්පර}}',
+'minutes' => '{{PLURAL:$1|$1 මිනිත්තුව|$1 මිනිත්තු}}',
+'hours' => '{{PLURAL:$1|$1 පà·à¶º|$1 පà·à¶º}}',
+'days' => '{{PLURAL:$1|$1 දවස|$1 දවස්}}',
+'ago' => '$1 පෙර',
# Bad image list
'bad_image_list' => 'ආකෘතිය පහත පරිදි වේ:
@@ -3544,13 +3592,6 @@ This confirmation code will expire at $4.',
'scarytranscludefailed' => '[$1 සඳහ෠සà·à¶šà·’ලි අත්කරගà·à¶±à·”ම අසà·à¶»à·Šà¶®à¶š විය]',
'scarytranscludetoolong' => '[URL දිගු à·€à·à¶©à·’ය]',
-# Trackbacks
-'trackbackbox' => 'මෙම පිටුව සඳහ෠පසුහà·à¶¹à·“ම්:<br />
-$1',
-'trackbackremove' => '([$1 මකà·à¶¯à¶¸à¶±à·Šà¶±])',
-'trackbacklink' => 'පසුහà·à¶¹à·“ම',
-'trackbackdeleteok' => 'පසුහà·à¶¹à·“ම à·ƒà·à¶»à·Šà¶®à¶š ලෙස මකà·à¶¯à¶¸à¶± ලදි.',
-
# Delete conflict
'deletedwhileediting' => "'''අවවà·à¶¯à¶ºà¶ºà·’''': ඔබ විසින් මෙම පිටුව සංස්කරණය ඇරà·à¶¹à·’ පසුව එය මක෠දමන ලදි!",
'confirmrecreate' => "ඔබ විසින් මේ පිටුව සංස්කරණය කිරීම ඇරඹූ පසු, පරිà·à·“ලක [[User:$1|$1]] ([[User talk:$1|à·ƒà·à¶šà¶ à·Šà¶¡à·à·€]]) විසින් එය මකà·à¶¯à¶¸à· පහත හේතුව සපයන ලදි:
@@ -3697,6 +3738,7 @@ $1',
'hebrew-calendar-m12-gen' => 'එලුල්',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|à·ƒà·à¶šà¶ à·Šà¶¡à·à·€]])',
'timezone-utc' => 'යූටීසී',
# Core parser functions
@@ -3797,13 +3839,16 @@ MediaWiki බෙදà·à·„à·à¶» ඇත්තේ එය ප්â€à¶»à¶ºà·à¶¢à¶±à
'tags-hitcount' => '{{PLURAL:$1|වෙනස්කම|වෙනස්කම් $1 }}',
# Special:ComparePages
-'comparepages' => 'පිටු සසඳන්න',
-'compare-selector' => 'පිටුවේ සංà·à·à¶°à¶± සසඳන්න',
-'compare-page1' => 'පිටුව 1',
-'compare-page2' => 'පිටුව 2',
-'compare-rev1' => '1වන සංà·à·à¶°à¶±à¶º',
-'compare-rev2' => '2වන සංà·à·à¶°à¶±à¶º',
-'compare-submit' => 'සසඳන්න',
+'comparepages' => 'පිටු සසඳන්න',
+'compare-selector' => 'පිටුවේ සංà·à·à¶°à¶± සසඳන්න',
+'compare-page1' => 'පිටුව 1',
+'compare-page2' => 'පිටුව 2',
+'compare-rev1' => '1වන සංà·à·à¶°à¶±à¶º',
+'compare-rev2' => '2වන සංà·à·à¶°à¶±à¶º',
+'compare-submit' => 'සසඳන්න',
+'compare-invalid-title' => 'ඔබ සඳහන් කළ මà·à¶­à·˜à¶šà·à·€ වලංගු නොවේ.',
+'compare-title-not-exists' => 'ඔබ විසින් විà·à·šà·‚ණය කෙරූ මà·à¶­à·˜à¶šà·à·€ නොපවතියි.',
+'compare-revision-not-exists' => 'ඔබ විසින් විà·à·šà·‚ණය කෙරූ සංà·à·à¶°à¶±à¶º නොපවතියි.',
# Database error messages
'dberr-header' => 'මෙම විකියෙහි ගà·à¶§à·…ුවක් පවතියි',
@@ -3830,4 +3875,81 @@ MediaWiki බෙදà·à·„à·à¶» ඇත්තේ එය ප්â€à¶»à¶ºà·à¶¢à¶±à
'sqlite-has-fts' => '$1 සම්පූර්ණ-පෙළ සෙවුම් සහය සමග',
'sqlite-no-fts' => '$1 සම්පූර්ණ-පෙළ සෙවුම් සහය රහිතව',
+# New logging system
+'logentry-delete-delete' => '$1 මක෠දමන ලදී පිටු $3',
+'logentry-delete-restore' => '$1 නà·à·€à¶­ පිහිටුවන ලදී පිටු $3',
+'logentry-delete-event-legacy' => '$1 විසින් $3 à·„à·“ ලà¶à·” සිදුවීම් වල දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º වෙනස් කරන ලදී',
+'logentry-delete-revision-legacy' => '$1 විසින් $3 පිටුවෙහි සංà·à·à¶°à¶±à·€à¶½ දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º වෙනස් කරන ලදී',
+'logentry-suppress-delete' => '$1 $3 පිටුව මර්ධනය කරන ලදී',
+'logentry-suppress-event-legacy' => '$1 විසින් $3 à·„à·“ ලà¶à·” සිදුවීම් වල දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º රහසිගතව වෙනස් කරන ලදී',
+'logentry-suppress-revision-legacy' => '$1 විසින් $3 පිටුවෙහි සංà·à·à¶°à¶±à·€à¶½ දෘà·à·Šâ€à¶ºà¶­à·à·€à¶º රහසිගතව වෙනස් කරන ලදී',
+'revdelete-content-hid' => 'අන්තර්ගතය සඟව෠ඇත',
+'revdelete-summary-hid' => 'සංස්කරණ à·ƒà·à¶»à·à¶‚à·à¶º සඟව෠ඇත',
+'revdelete-uname-hid' => 'පරිà·à·“ලක-නà·à¶¸à¶º සඟව෠ඇත',
+'revdelete-content-unhid' => 'අන්තර්ගතය සඟව෠නොමà·à¶­',
+'revdelete-summary-unhid' => 'සංස්කරණ à·ƒà·à¶»à·à¶‚à·à¶º සඟව෠නොමà·à¶­',
+'revdelete-uname-unhid' => 'පරිà·à·“ලක-නà·à¶¸à¶º සඟව෠නොමà·à¶­',
+'revdelete-restricted' => 'පරිපà·à¶½à¶šà¶ºà¶±à·Š විෂයයෙහි ව්â€à¶ºà·€à·„à·à¶»à·’ත පරිසීමà·à·€à¶±à·Š',
+'revdelete-unrestricted' => 'පරිපà·à¶½à¶šà¶ºà¶±à·Šà¶œà·š පරිසීමà·à·€à¶±à·Š ඉවත් කරන ලදි',
+'logentry-move-move' => '$1 $3 සිට $4 දක්ව෠පිටු ගෙන යන ලදී',
+'logentry-move-move-noredirect' => '$1 විසින් යලියොමුවක් නොදමà·à¶¸ $3 පිටුව $4 වෙත ගෙනයන ලදී',
+'logentry-move-move_redir' => '$1 විසින් යලියොමුවක් දම෠$3 පිටුව $4 වෙත ගෙනයන ලදී',
+'logentry-move-move_redir-noredirect' => '$1 විසින් යලියොමුවක් නොදමà·à¶¸ යලියොමුවක් හරහ෠$3 පිටුව $4 වෙත ගෙනයන ලදී',
+'logentry-newusers-newusers' => '$1 පරිà·à·“ලක ගිණුමක් තනන ලදී',
+'logentry-newusers-create' => '$1 පරිà·à·“ලක ගිණුමක් තනන ලදී',
+'logentry-newusers-create2' => '$1 විසින් $3 පරිà·à·“ලක ගිණුම තනන ලදී',
+'logentry-newusers-autocreate' => '$1 ගිණුම ස්වංක්â€à¶»à·“යව නිර්මිතය',
+'newuserlog-byemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලෙන් මුර-පදය යවන ලදි',
+
+# Feedback
+'feedback-subject' => 'විෂයය:',
+'feedback-message' => 'පණිවුඩය:',
+'feedback-cancel' => 'අවලංගු කරන්න',
+'feedback-submit' => 'ප්â€à¶»à¶­à·’චà·à¶»à¶º යවන්න',
+'feedback-adding' => 'ප්â€à¶»à¶­à·’චà·à¶»à¶º පිටුවට එක් කරමින් ...',
+'feedback-error1' => 'දà·à·‚ය: API ගෙන් හදුනà·à¶±à·œà¶œà¶­à·Š ප්â€à¶»à¶­à·’පල',
+'feedback-error2' => 'දà·à·‚ය: සංස්කරණය අසà·à¶»à·Šà¶®à¶šà¶ºà·’',
+'feedback-error3' => 'දà·à·‚ය: API ගෙන් ප්â€à¶»à¶­à·’චà·à¶»à¶ºà¶šà·Š නොමà·à¶­',
+'feedback-thanks' => 'ස්තුතියි! ඔබේ ප්â€à¶»à¶­à·’චà·à¶»à¶º "[$2 $1]" පිටුවට එක් කරන ලදී.',
+'feedback-close' => 'හරි',
+'feedback-bugcheck' => 'කදිමයි! දà·à¶±à·Š එය දà·à¶±à¶§à¶¸à¶­à·Š [$1 හඳුනà·à¶œà¶­à·Š දà·à·‚]වල තිබේ දà·à¶ºà·’ පිරික්සන්න.',
+'feedback-bugnew' => 'මම පරික්ෂ෠කළà·. නව දà·à·‚ය à·€à·à¶»à·Šà¶­à· කරන්න',
+
+# API errors
+'api-error-badaccess-groups' => 'මෙම විකියට ගොනු උඩුගතකිරීම සඳහ෠ඔබට අවසර නà·à¶­.',
+'api-error-badtoken' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: නොසුදුසු ටà·à¶šà¶±à¶º.',
+'api-error-copyuploaddisabled' => 'URL මඟින් උඩුගතකිරීම මෙම සර්වරයේදී අක්â€à¶»à·“ය කොට තිබේ.',
+'api-error-duplicate' => 'එකම අන්තර්ගතය සමඟ මෙවà·à¶±à·’ම {{PLURAL:$1|[වෙනත් ගොනු $2 ක්]|[වෙනත් ගොනු $2 ක්]}} අඩවිය තුල දà·à¶±à¶§à¶¸à¶­à·Š පවතියි.',
+'api-error-duplicate-archive' => 'එකම අන්තර්ගතය සමඟ මෙවà·à¶±à·’ම {{PLURAL:$1|[වෙනත් ගොනු $2 ක්]|[වෙනත් ගොනු $2 ක්]}} අඩවිය තුල දà·à¶±à¶§à¶¸à¶­à·Š තිබුනà·, නමුත් {{PLURAL:$1|ඒක|ඒවà·}} මක෠දම෠ඇත.',
+'api-error-duplicate-archive-popup-title' => 'දà·à¶±à¶§à¶¸à¶­à·Š මක෠දම෠ඇති එක වගේ {{PLURAL:$1|ගොනුවක්|ගොනු}}',
+'api-error-duplicate-popup-title' => 'අනුපිටපත් {{PLURAL:$1|ගොනු|ගොනුව}}',
+'api-error-empty-file' => 'ඔබ ඉදිරිපත්කල ගොනුව හිස් එකකි.',
+'api-error-fetchfileerror' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: ගොනුව පà·à¶¸à·’ණවීම අතරතුරදී කුමක්ද෠වà·à¶»à¶¯à·”ණà·.',
+'api-error-file-too-large' => 'ඔබ විසින් යොමන ලද ගොනුව පමණට වඩ෠විà·à·˜à¶½à¶º.',
+'api-error-filename-tooshort' => 'ගොනු නà·à¶¸à¶º කෙටි à·€à·à¶©à·’යි.',
+'api-error-filetype-banned' => 'මෙම වර්ගයේ ගොනු තහනම් කර ඇත.',
+'api-error-filetype-missing' => 'මෙම ගොනුවට විස්තීරණය මග හරි ඇත.',
+'api-error-hookaborted' => 'ඔබ සිදු කරන්නට ගිය වෙනස්කම විස්තීර්ණ කොක්කක් මඟින් රà·à¶°à¶±à¶º කරන ලදී.',
+'api-error-http' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: සර්වරය වෙත සම්බන්ධ විය නොහà·à¶š.',
+'api-error-illegal-filename' => 'ගොනුනà·à¶¸à¶ºà¶§ ඉඩ දෙනු නොලà·à¶¶à·š.',
+'api-error-internal-error' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: ඔබේ උඩුගත කිරීම විකියේදී ක්â€à¶»à·’යà·à¶±à¶±à¶º කිරීමේදී කුමක්ද෠වà·à¶»à¶¯à·”ණà·.',
+'api-error-invalid-file-key' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: තà·à·€à¶šà·à¶½à·’ක භà·à·€à·’තයේ ගොනුව හමුනොවුණි.',
+'api-error-missingparam' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: අයදුමෙහි මගහà·à¶»à·”ණු පරà·à¶¸à·’තීන්.',
+'api-error-missingresult' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: පිටපත් කිරීම à·ƒà·à¶»à·Šà¶®à¶šà¶¯à·à¶ºà·’ නිර්ණය කල නොහà·à¶š.',
+'api-error-mustbeloggedin' => 'ගොනු උඩුගත කිරීම සඳහ෠ඔබ ප්â€à¶»à·€à·’ෂ්ට වී තිබිය යුතුයි.',
+'api-error-mustbeposted' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: අයදුම සඳහ෠HTTP POST අවà·à·Šâ€à¶ºà¶ºà·’.',
+'api-error-noimageinfo' => 'à·ƒà·à¶»à·Šà¶®à¶šà·€ උඩුගත කරන ලදී, නමුත් ගොනුව පිලිබඳ කිසිම තොරතුරක් සර්වරය අප වෙත ලබ෠දී නොමà·à¶­.',
+'api-error-nomodule' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: උඩුගත කෙරුම් මොඩියුලයන් සකස෠නොමà·à¶­.',
+'api-error-ok-but-empty' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: සර්වරයෙන් ප්â€à¶»à¶­à·’චà·à¶»à¶ºà¶šà·Š නොමà·à¶­.',
+'api-error-overwrite' => 'දà·à¶±à¶§à¶¸à¶­à·Š තිබෙන ගොනුවක් යටපත් කෙරුමට ඉඩදෙනු නොලà·à¶¶à·š.',
+'api-error-stashfailed' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: තà·à·€à¶šà·à¶½à·’ක ගොනුව සුරක්ෂිත කිරීමට සර්වරයට නොහà·à¶šà·’ වුනි.',
+'api-error-timeout' => 'බලà·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” වූ කà·à¶½à¶º තුල සර්වරය ප්â€à¶»à¶­à·’චà·à¶» නොදක්වන ලදී.',
+'api-error-unclassified' => 'හඳුන෠නොගත් දà·à·‚යක් ඇතිවිය.',
+'api-error-unknown-code' => 'නොදත් දà·à·‚ය: "$1"',
+'api-error-unknown-error' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය: ඔබ මෙම ගොනුව උඩුගත කිරීමට තà·à¶­à·Š කිරීමේදී කුමක්ද෠වà·à¶»à¶¯à·”ණà·.',
+'api-error-unknown-warning' => 'නොදත් අවවà·à¶¯à¶º: $1',
+'api-error-unknownerror' => 'අඥà·à¶­ දà·à·‚ය: "$1".',
+'api-error-uploaddisabled' => 'මෙම විකියෙහි උඩුගතකිරීම අක්â€à¶»à·’ය කොට ඇත.',
+'api-error-verification-error' => 'මෙම ගොනුව සමහරවිට දූෂිත වී ඇත, හ෠එයට à·€à·à¶»à¶¯à·’ විස්තිර්ණයක් ඇත.',
+
);
diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php
index b93d4f6b..5a59df8e 100644
--- a/languages/messages/MessagesSk.php
+++ b/languages/messages/MessagesSk.php
@@ -177,69 +177,69 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#presmeruj', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BEZGALÉRIE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__VYNÚTIŤOBSAH__', '__FORCETOC__' ),
- 'toc' => array( '0', '__OBSAH__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NEUPRAVOVAŤSEKCIE__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'AKTUÃLNYMESIAC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'NÃZOVAKTUÃLNEHOMESIACA', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'NÃZOVAKTUÃLNEHOMESIACAGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'NÃZOVAKTUÃLNEHOMESIACASKRATKA', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'AKTUÃLNYDEŇ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'AKTUÃLNYDEŇ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NÃZOVAKTUÃLNEHODŇA', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AKTUÃLNYROK', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AKTUÃLNYÄŒAS', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'AKTUÃLNAHODINA', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'POÄŒETSTRÃNOK', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'POÄŒETÄŒLÃNKOV', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'POČETSÚBOROV', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'POÄŒETPOUŽÃVATEĽOV', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'POČETÚPRAV', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NÃZOVSTRÃNKY', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'NÃZOVSTRÃNKYE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'MENNÃPRIESTOR', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'MENNÃPRIESTORE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'DISKUSNÃPRIESTOR', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'DISKUSNÃPRIESTORE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'PRIESTORÄŒLÃNKOV', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'PRIESTORÄŒLÃNKOVE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'PLNÃNÃZOVSTRÃNKY', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'PLNÃNÃZOVSTRÃNKYE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'NÃZOVPODSTRÃNKY', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'NÃZOVPODSTRÃNKYE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'NÃZOVZÃKLADNEJSTRÃNKY', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'NÃZOVZÃKLADNEJSTRÃNKYE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'NÃZOVDISKUSNEJSTRÃNKY', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'NÃZOVDISKUSNEJSTRÃNKYE', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'NÃZOVÄŒLÃNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'NÃZOVÄŒLÃNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'SPRÃVA:', 'MSG:' ),
- 'subst' => array( '0', 'NAHR:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'náhľad', 'náhľadobrázka', 'thumbnail', 'thumb' ),
- 'img_right' => array( '1', 'vpravo', 'right' ),
- 'img_left' => array( '1', 'vľavo', 'left' ),
- 'img_none' => array( '1', 'žiadny', 'none' ),
- 'img_width' => array( '1', '$1bod', '$1px' ),
- 'img_center' => array( '1', 'stred', 'center', 'centre' ),
- 'img_framed' => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
- 'img_border' => array( '1', 'okraj', 'border' ),
- 'sitename' => array( '1', 'NÃZOVLOKALITY', 'SITENAME' ),
- 'ns' => array( '0', 'MP:', 'NS:' ),
- 'servername' => array( '0', 'NÃZOVSERVERA', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'CESTAKUSKRIPTU', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'AKTUÃLNYTÃŽDEŇ', 'CURRENTWEEK' ),
- 'currentversion' => array( '1', 'AKTUÃLNAVERZIA', 'CURRENTVERSION' ),
- 'language' => array( '0', '#JAZYK:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'numberofadmins' => array( '1', 'POÄŒETSPRÃVCOV', 'NUMBEROFADMINS' ),
- 'filepath' => array( '0', 'CESTAKSÚBORU:', 'FILEPATH:' ),
- 'hiddencat' => array( '1', '__SKRYTÃKATEGÓRIA__', '__SKRYTÃKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'STRÃNOKVKATEGÓRII', 'STRÃNOKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'VEĽKOSŤSTRÃNKY', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#presmeruj', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZOBSAHU__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALÉRIE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__VYNÚTIŤOBSAH__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__OBSAH__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NEUPRAVOVAŤSEKCIE__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'AKTUÃLNYMESIAC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'NÃZOVAKTUÃLNEHOMESIACA', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'NÃZOVAKTUÃLNEHOMESIACAGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'NÃZOVAKTUÃLNEHOMESIACASKRATKA', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'AKTUÃLNYDEŇ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'AKTUÃLNYDEŇ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NÃZOVAKTUÃLNEHODŇA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AKTUÃLNYROK', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AKTUÃLNYÄŒAS', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'AKTUÃLNAHODINA', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'POÄŒETSTRÃNOK', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'POÄŒETÄŒLÃNKOV', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'POČETSÚBOROV', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'POÄŒETPOUŽÃVATEĽOV', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'POČETÚPRAV', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NÃZOVSTRÃNKY', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'NÃZOVSTRÃNKYE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'MENNÃPRIESTOR', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'MENNÃPRIESTORE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUSNÃPRIESTOR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUSNÃPRIESTORE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'PRIESTORÄŒLÃNKOV', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'PRIESTORÄŒLÃNKOVE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'PLNÃNÃZOVSTRÃNKY', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'PLNÃNÃZOVSTRÃNKYE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'NÃZOVPODSTRÃNKY', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'NÃZOVPODSTRÃNKYE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'NÃZOVZÃKLADNEJSTRÃNKY', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'NÃZOVZÃKLADNEJSTRÃNKYE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'NÃZOVDISKUSNEJSTRÃNKY', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'NÃZOVDISKUSNEJSTRÃNKYE', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'NÃZOVÄŒLÃNKU', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'NÃZOVÄŒLÃNKUE', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'SPRÃVA:', 'MSG:' ),
+ 'subst' => array( '0', 'NAHR:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'náhľad', 'náhľadobrázka', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'vpravo', 'right' ),
+ 'img_left' => array( '1', 'vľavo', 'left' ),
+ 'img_none' => array( '1', 'žiadny', 'none' ),
+ 'img_width' => array( '1', '$1bod', '$1px' ),
+ 'img_center' => array( '1', 'stred', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'rám', 'framed', 'enframed', 'frame' ),
+ 'img_border' => array( '1', 'okraj', 'border' ),
+ 'sitename' => array( '1', 'NÃZOVLOKALITY', 'SITENAME' ),
+ 'ns' => array( '0', 'MP:', 'NS:' ),
+ 'servername' => array( '0', 'NÃZOVSERVERA', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'CESTAKUSKRIPTU', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'AKTUÃLNYTÃŽDEŇ', 'CURRENTWEEK' ),
+ 'currentversion' => array( '1', 'AKTUÃLNAVERZIA', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#JAZYK:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'numberofadmins' => array( '1', 'POÄŒETSPRÃVCOV', 'NUMBEROFADMINS' ),
+ 'filepath' => array( '0', 'CESTAKSÚBORU:', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__SKRYTÃKATEGÓRIA__', '__SKRYTÃKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'STRÃNOKVKATEGÓRII', 'STRÃNOKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'VEĽKOSŤSTRÃNKY', 'PAGESIZE' ),
);
$namespaceNames = array(
@@ -637,20 +637,22 @@ Oznámte to prosím [[Special:ListUsers/sysop|správcovi]] a uveÄte URL.',
'badarticleerror' => 'Na tejto stránke túto ÄinnosÅ¥ nemožno vykonaÅ¥.',
'cannotdelete' => 'Nebolo možné zmazať stránku alebo súbor „$1“.
Možno ju už zmazal nieto iný.',
+'cannotdelete-title' => 'Nemôžete zmazať stránku "$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.',
-'perfcachedts' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a naposledy boli aktualizované $1.',
+'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}}.',
+'perfcachedts' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a naposledy boli aktualizované $1. Vo vyrovnávacej pamäti {{PLURAL:$4|je dostupný|sú dostupné|je dostupných}} najviac {{PLURAL:$4|jeden výsledok|$4 výsledky|$4 výsledkov}}.',
'querypage-no-updates' => 'Aktualizácie tejto stránky sú momentálne vypnuté. Tieto dáta sa v súÄasnosti nebudú obnovovaÅ¥.',
'wrong_wfQuery_params' => 'Nesprávny parameter pre wfQuery()<br />
Funkcia: $1<br />
Požiadavka: $2',
'viewsource' => 'Zobraziť zdroj',
-'viewsourcefor' => '$1',
+'viewsource-title' => 'Zobrazenie zdroja stránky $1',
'actionthrottled' => 'Činnosť bola spomalená',
'actionthrottledtext' => 'Ako opatrenie proti spamu je poÄet vykonaní tejto Äinnosti za urÄitý Äas obmedzený. Tento limit ste prekroÄili. Prosím, skúste to znova o niekoľko minút.',
'protectedpagetext' => 'Táto stránka bola zamknutá aby sa zamedzilo úpravám.',
'viewsourcetext' => 'Môžete si zobraziť a kopírovať zdroj tejto stránky:',
+'viewyourtext' => "Môžete si prehliadnuť a skopírovať zdrojový kód '''vašich zmien''' tejto stránky:",
'protectedinterface' => 'Táto stránka poskytuje text používateľského rozhrania a je zamknutá, aby sa predišlo jej zneužitiu.',
'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ých používateľov. Zmeny prosím vykonávajte prostredníctvom [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projektu pre lokalizáciu MediaWiki.",
'sqlhidden' => '(SQL príkaz je skrytý)',
@@ -751,6 +753,7 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
'noemailprefs' => 'Tieto nástroje budú prístupné po vyplnení emailovej adresy vo vašich nastaveniach.',
'emailconfirmlink' => 'PotvrÄte vaÅ¡u e-mailovú adresu',
'invalidemailaddress' => 'Emailovú adresu nemožno akceptovaÅ¥, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte prísluÅ¡né políÄko prázdne.',
+'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy užívateľského konta.',
'accountcreated' => 'ÚÄet vytvorený',
'accountcreatedtext' => 'Používateľský úÄet $1 bol vytvorený.',
'createaccount-title' => 'Vytvorenie úÄtu na {{GRAMMAR:lokál|{{SITENAME}}}}',
@@ -767,6 +770,7 @@ Prosím, poÄkajte predtým, než to skúsite znova.',
# E-mail sending
'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
+'user-mail-no-addy' => 'Pokus o odoslanie e-mailu bez e-mailovej adresy.',
# Change password dialog
'resetpass' => 'Zmeniť heslo',
@@ -787,16 +791,18 @@ Je možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si
'resetpass-temp-password' => 'DoÄasné heslo:',
# Special:PasswordReset
-'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Po vyplnení tohto formulára dostanete emailom podrobnosti o vaÅ¡om úÄte.',
-'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-username' => 'Používateľské meno:',
-'passwordreset-domain' => 'Doména:',
-'passwordreset-email' => 'Emailová adresa:',
-'passwordreset-emailtitle' => 'Podrobnosti o úÄte na {{GRAMMAR:lokál|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Niekto (pravdepodobne vy z IP adresy $1) požiadal pripomenutie podrobností o vašom
+'passwordreset' => 'Reset hesla',
+'passwordreset-text' => 'Po vyplnení tohto formulára dostanete emailom podrobnosti o vaÅ¡om úÄte.',
+'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-username' => 'Používateľské meno:',
+'passwordreset-domain' => 'Doména:',
+'passwordreset-capture' => 'Zobraziť výsledný e-mail?',
+'passwordreset-capture-help' => 'Ak oznaÄíte toto políÄko, bude e-mail (s doÄasným heslom) okrem zaslania užívateľovi zobrazený aj vám.',
+'passwordreset-email' => 'Emailová adresa:',
+'passwordreset-emailtitle' => 'Podrobnosti o úÄte na {{GRAMMAR:lokál|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Niekto (pravdepodobne vy z IP adresy $1) požiadal pripomenutie podrobností o vašom
úÄtu na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský úÄet je spojený|Nasledujúce používateľské úÄty sú spojené}}
s touto emailovou adresou:
@@ -806,7 +812,7 @@ $2
Mali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo
ak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu
ignorovaÅ¥ a Äalej používaÅ¥ vaÅ¡e staré heslo.',
-'passwordreset-emailtext-user' => 'Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal pripomenutie podrobností o vašom
+'passwordreset-emailtext-user' => 'Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal pripomenutie podrobností o vašom
úÄtu na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský úÄet je spojený|Nasledujúce používateľské úÄty sú spojené}}
s touto emailovou adresou:
@@ -816,9 +822,22 @@ $2
Mali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo
ak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu
ignorovaÅ¥ a Äalej používaÅ¥ vaÅ¡e staré heslo.',
-'passwordreset-emailelement' => 'Používateľské meno: $1
+'passwordreset-emailelement' => 'Používateľské meno: $1
DoÄasné heslo:$2',
-'passwordreset-emailsent' => 'Email s heslom bol odoslaný.',
+'passwordreset-emailsent' => 'Email s heslom bol odoslaný.',
+'passwordreset-emailsent-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie.',
+'passwordreset-emailerror-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať užívateľovi: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Zmena e-mailovej adresy',
+'changeemail-header' => 'Zmena e-mailovej adresy pre úÄet',
+'changeemail-text' => 'Vyplňte tento formulár na zmenu e-mailovej adresy. Zmenu budete musieť potvrdiť zadaním svojho hesla.',
+'changeemail-no-info' => 'Na prístup k tejto stránke musíte byť prihlásený.',
+'changeemail-oldemail' => 'SúÄasná e-mailová adresa:',
+'changeemail-newemail' => 'Nová e-mailová adresa:',
+'changeemail-none' => '(žiadna)',
+'changeemail-submit' => 'Zmeniť e-mail',
+'changeemail-cancel' => 'Zrušiť',
# Edit page toolbar
'bold_sample' => 'TuÄný text',
@@ -890,9 +909,6 @@ Pozn.: Nemôžete použiť funkciu „{{int:emailuser}}“, ak ste si vo svojich
Vaša aktuálna IP adresa je $3. ID vášho blokovania je $5.
Prosím, uveÄte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
'blockednoreason' => 'nebol uvedený dôvod',
-'blockedoriginalsource' => "Zdroj '''$1''' je zobrazený nižšie:",
-'blockededitsource' => "Text '''vašich úprav''' stránky '''$1''' je zobrazený nižšie:",
-'whitelistedittitle' => 'Aby ste mohli upravovať stránky, musíte sa prihlásiť',
'whitelistedittext' => 'Aby ste mohli upravovať stránky, musíte sa $1',
'confirmedittext' => 'Pred úpravami stránok musíte potvrdiť vašu emailovú adresu. Prosím, nastavte a overte svoju emailovú adresu v [[Special:Preferences|používateľských nastaveniach]].',
'nosuchsectiontitle' => 'Sekcia nebola nájdená',
@@ -979,7 +995,7 @@ z voľného diela (public domain) alebo podobného zdroja neobmedzeného autorsk
Týmto sa právne zaväzujete, že ste tento text buÄ napísali sám, alebo že je skopírovaný
z voľného diela (public domain) alebo podobného zdroja neobmedzeného autorskými právami (podrobnosti: $1).
'''NEUMIESTŇUJTE SEM BEZ POVOLENIA DIELA CHRÃNENÉ AUTORSKÃM PRÃVOM!'''",
-'longpageerror' => "'''CHYBA: Text, ktorý ste poslali má $1 kilobajtov, Äo je viac ako maximum $2 kilobajtov. Nie je možné ho uložiÅ¥.'''",
+'longpageerror' => "'''Chyba: Text, ktorý ste poslali má {{PLURAL:$1|jeden kilobajt|$1 kilobajty|$1 kilobajtov}}, Äo je viac ako maximum {{PLURAL:$2|jeden kilobajt|$2 kilobajty|$2 kilobajtov}}.'''",
'readonlywarning' => "'''UPOZORNENIE: Databáza bola poÄas upravovania stránky zamknutá z dôvodu údržby,
takže stránku momentálne nemôžete uložiť. Môžete skopírovať a vložiť
text do textového súboru a uložiť si ho na neskôr.'''
@@ -1146,8 +1162,6 @@ Iní správcovia {{GRAMMAR:genitív|{{SITENAME}}}} budú stále môcť pristupov
'revdelete-unsuppress' => 'Odstrániť obmedzenia obnovených revízií',
'revdelete-log' => 'Dôvod:',
'revdelete-submit' => 'Použiť na {{PLURAL:$1|zvolenú revíziu|zvolené revízie}}',
-'revdelete-logentry' => 'viditeľnosť revízie bola zmenená pre [[$1]]',
-'logdelete-logentry' => 'viditeľnosť udalosti [[$1]] bola zmenená',
'revdelete-success' => "'''Viditeľnosť revízie bola úspešne aktualizovaná.'''",
'revdelete-failure' => "'''Viditeľnosť revízie nebolo možné aktualizovať:'''
$1",
@@ -1159,15 +1173,6 @@ $1",
'revdel-restore-visible' => 'viditeľné revízie',
'pagehist' => 'História stránky',
'deletedhist' => 'Zmazaná história',
-'revdelete-content' => 'obsah',
-'revdelete-summary' => 'zhrnutie úprav',
-'revdelete-uname' => 'používateľské meno',
-'revdelete-restricted' => 'obmedzenia správcov použité',
-'revdelete-unrestricted' => 'obmedzenia správcov odstránené',
-'revdelete-hid' => 'skryl $1',
-'revdelete-unhid' => 'odkryl $1',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|revíziu|revízie|revízií}}',
-'logdelete-log-message' => '$1 $2 {{PLURAL:$2|udalosť|udalosti|udalostí}}',
'revdelete-hide-current' => 'Chyba pri skrývaní položky s dátumom $2, $1: toto je aktuálna revízia.
Nemožno ju skryť.',
'revdelete-show-no-access' => 'Chyba pri zobrazovaní položky s dátumom $2, $1: toto je položka s obmedzeným prístupom.
@@ -1321,12 +1326,14 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
'prefs-rc' => 'Posledné úpravy',
'prefs-watchlist' => 'Sledované stránky',
'prefs-watchlist-days' => 'Koľko dní zobrazovať v sledovaných stránkach:',
-'prefs-watchlist-days-max' => 'Maximálne 7 dní',
+'prefs-watchlist-days-max' => 'Najviac $1 {{PLURAL:$1|deň|dni|dní}}',
'prefs-watchlist-edits' => 'PoÄet úprav, ktorý sa zobrazí v rozšírenom zozname sledovaných:',
'prefs-watchlist-edits-max' => 'Maximum: 1000',
'prefs-watchlist-token' => 'Token zoznamu sledovaných?',
'prefs-misc' => 'Rôzne',
'prefs-resetpass' => 'Zmeniť heslo',
+'prefs-changeemail' => 'Zmeniť email',
+'prefs-setemail' => 'Nastaviť emailovú adresu',
'prefs-email' => 'Možnosti emailu',
'prefs-rendering' => 'Vzhľad',
'saveprefs' => 'Uložiť nastavenia',
@@ -1385,6 +1392,7 @@ Túto operáciu nemožno vrátiť.',
'yourrealname' => 'SkutoÄné meno *:',
'yourlanguage' => 'Jazyk:',
'yourvariant' => 'Variant jazyka obsahu:',
+'prefs-help-variant' => 'Váš preferovaný variant alebo pravopis, ako sa majú na tejto wiki zobrazovať obsahové stránky.',
'yournick' => 'Podpis:',
'prefs-help-signature' => 'Komentáre na diskusných stránkach by ste mali podpisovaÅ¥ pomocou „<nowiki>~~~~</nowiki>“, Äo sa prevedie na váš podpis a Äasovú známku.',
'badsig' => 'Neplatný podpis v pôvodnom tvare; skontrolujte HTML znaÄky.',
@@ -1424,7 +1432,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'userrights-lookup-user' => 'Spravovať skupiny používateľov',
'userrights-user-editname' => 'Zadajte meno používateľa:',
'editusergroup' => 'Upraviť skupinu používateľa',
-'editinguser' => "Zmena oprávnení používateľa '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Zmena práv používateľa '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Upraviť skupiny používateľa',
'saveusergroups' => 'Uložiť skupiny používateľa',
'userrights-groupsmember' => 'ÄŒlen skupiny:',
@@ -1518,13 +1526,13 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'right-autopatrol' => 'NechaÅ¥ úpravy automaticky oznaÄiÅ¥ ako strážené',
'right-patrolmarks' => 'Používať možnosti stráženia posledných úprav',
'right-unwatchedpages' => 'Zobraziť zoznam nesledovaných stránok',
-'right-trackback' => 'Poslať trackback',
'right-mergehistory' => 'ZluÄovaÅ¥ histórie stránok',
'right-userrights' => 'Upravovať oprávnenia ostatných používateľov',
'right-userrights-interwiki' => 'Upravovať oprávnenia používateľov na iných wiki stránkach',
'right-siteadmin' => 'Zamykať a odomykať databázu',
'right-override-export-depth' => 'Exportovať stránky vrátane okdazovaných stránok do hĺbky 5 odkazov',
'right-sendemail' => 'Posielať e-mail ostatným používateľom',
+'right-passwordreset' => 'Prezeranie e-mailov pre znovunastavovanie hesla',
# User rights log
'rightslog' => 'Záznam používateľských práv',
@@ -1558,16 +1566,17 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'action-suppressionlog' => 'zobraziť tento súkromný záznam',
'action-block' => 'zablokovať úpravy tohto používateľa',
'action-protect' => 'zmeniť úrovne ochrany tejto stránky',
+'action-rollback' => 'rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku',
'action-import' => 'importovať túto stránku z inej wiki',
'action-importupload' => 'importovať túto stránku z nahraného súboru',
'action-patrol' => 'oznaÄiÅ¥ úpravy iných ako strážené',
'action-autopatrol' => 'oznaÄiÅ¥ vlastné úpravy ako strážené',
'action-unwatchedpages' => 'zobraziť zoznam nesledovaných stránok',
-'action-trackback' => 'poslať trackback',
'action-mergehistory' => 'zlúÄiÅ¥ históriu tejto stránky',
'action-userrights' => 'upravovať práva všetkých používateľov',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
@@ -1599,6 +1608,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|sledujúci používateľ|sledujúci používatelia|sledujúcich používateľov}}]',
'rc_categories' => 'Obmedziť na kategórie (oddeľte znakom „|“)',
'rc_categories_any' => 'akékoľvek',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajty|bajtov}} po zmene',
'newsectionsummary' => '/* $1 */ nová sekcia',
'rc-enhanced-expand' => 'Zobraziť podrobnosti (vyžaduje JavaScript)',
'rc-enhanced-hide' => 'Skryť podrobnosti',
@@ -1653,6 +1663,7 @@ Vizuálny prehľad nájdete v [[Special:NewFiles|galérii novo nahraných súbor
'ignorewarnings' => 'Ignorovať všetky varovania',
'minlength1' => 'Názvy súborov musia mať aspoň jedno písmeno.',
'illegalfilename' => 'Názov súboru „$1“ obsahuje znaky, ktoré nie sú povolené v názvoch stránok. Prosím premenujte súbor a skúste ho nahrať znovu.',
+'filename-toolong' => 'Názvy súborov môžu nesmú byť dlhšie než 240 bajtov.',
'badfilename' => 'Názov obrázka bol zmenený na „$1“.',
'filetype-mime-mismatch' => 'Prípona súboru „.$1“ nezodpovedá zistenému typu MIME súboru ($2).',
'filetype-badmime' => 'Nie je povolené nahrávať súbory s MIME typom „$1“.',
@@ -1759,6 +1770,41 @@ Ak problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]
'upload-unknown-size' => 'Neznáma veľkosť',
'upload-http-error' => 'Vyskytla sa chyba HTTP: $1',
+# File backend
+'backend-fail-stream' => '$1 je názov súboru.',
+'backend-fail-backup' => 'Nebolo možné zálohovať súbor $1.',
+'backend-fail-notexists' => 'Súbor $1 neexistuje.',
+'backend-fail-hashes' => 'Nepodarilo sa získať haš súborov na porovnanie.',
+'backend-fail-notsame' => 'Nerovnaký súbor už existuje v $1 .',
+'backend-fail-invalidpath' => '„$1“ nie je platná cesta úložiska.',
+'backend-fail-delete' => 'Nebolo možné vymazať súbor „$1“.',
+'backend-fail-alreadyexists' => 'Súbor „$1“ už existuje.',
+'backend-fail-store' => 'Nebolo možné uložiť súbor „$1“ na „$2“.',
+'backend-fail-copy' => 'Nebolo možné skopírovať súbor „$1“ na „$2“.',
+'backend-fail-move' => 'Nebolo možné presunúť súbor „$1“ na „$2“.',
+'backend-fail-opentemp' => 'Nebolo možné otvoriÅ¥ doÄasný súbor.',
+'backend-fail-writetemp' => 'Nebolo možné zapísaÅ¥ do doÄasného súboru.',
+'backend-fail-closetemp' => 'Nebolo možné zatvoriÅ¥ doÄasný súbor.',
+'backend-fail-read' => 'Nebolo možné preÄítaÅ¥ súbor „$1“.',
+'backend-fail-create' => 'Nebolo možné vytvoriť súbor „$1“.',
+'backend-fail-readonly' => 'Úložisko „$1“ je momentálne v režime len na Äítanie. Udaný dôvod: „$2“',
+'backend-fail-synced' => 'Súbor „$1“ je v nekonzistentnom stave v rámci vnútorného úložiska',
+'backend-fail-connect' => 'Nepodarilo sa pripojiť k úložisku „$1“.',
+'backend-fail-internal' => 'Vyskytla sa neznáma chyba v úložisku „$1“.',
+'backend-fail-contenttype' => 'Nebolo možné urÄiÅ¥ typ obsahu súboru, ktorý sa má uložiÅ¥ na „$1“.',
+'backend-fail-batchsize' => 'Do úložiska bola zaslaná dávka s $1 {{PLURAL:$1|operáciou|operáciami}}; limit je $2 {{PLURAL:$2|operácia|operácie|operácií}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Nepodarilo sa odomknúť zámok „$1“; nie je zamknutý.',
+'lockmanager-fail-closelock' => 'Nepodarilo sa zatvoriť súbor zámku pre „$1“.',
+'lockmanager-fail-deletelock' => 'Nepodarilo sa zmazať súbor zámku pre „$1“.',
+'lockmanager-fail-acquirelock' => 'Nepodarilo sa získať zámok pre „$1“.',
+'lockmanager-fail-openlock' => 'Nepodarilo sa otvoriť súbor zámku pre „$1“.',
+'lockmanager-fail-releaselock' => 'Nepodarilo sa uvoľniť zámok „$1“.',
+'lockmanager-fail-db-bucket' => 'Nepodarilo sa kontaktovať dostatok databáz zámkov v buckete $1.',
+'lockmanager-fail-db-release' => 'Nepodarilo sa uvoľniť zámky na databáze $1.',
+'lockmanager-fail-svr-release' => 'Nepodarilo sa uvoľniť zámky na serveri $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Vyskytla sa chyba pri kontrole otvárania súboru ZIP.',
'zip-wrong-format' => 'Uvedený súbor nebol súbor ZIP.',
@@ -1775,6 +1821,7 @@ Nie je možné správne skontrolovaÅ¥ jeho bezpeÄnosÅ¥.',
'uploadstash-badtoken' => 'Vykonanie operácie sa nepodarilo, možno preto, že platnosť vašich prihlasovacích údajov vypršala. Skúste to znova.',
'uploadstash-errclear' => 'Vymazanie súborov bolo neúspešné.',
'uploadstash-refresh' => 'Obnoviť zoznam súborov',
+'invalid-chunk-offset' => 'Neplatný posun bloku',
# img_auth script messages
'img-auth-accessdenied' => 'Prístup zamietnutý',
@@ -1877,23 +1924,24 @@ Môžete si pozrieť [[Special:WhatLinksHere/$2|úplný zoznam]].',
'filerevert-badversion' => 'Neexistuje predchádzajúca lokálna verzia tohto súboru s požadovanopu Äasovou známkou.',
# File deletion
-'filedelete' => 'Zmazať $1',
-'filedelete-legend' => 'Zmazať súbor',
-'filedelete-intro' => "Chystáte sa zmazať súbor '''[[Media:$1|$1]]''' spolu s celou jeho históriou.",
-'filedelete-intro-old' => "Mažete verziu súboru '''[[Media:$1|$1]]''' z [$4 $3, $2].",
-'filedelete-comment' => 'Dôvod:',
-'filedelete-submit' => 'Zmazať',
-'filedelete-success' => "'''$1''' bol zmazaný.",
-'filedelete-success-old' => "Verzia súboru '''[[Media:$1|$1]]''' z $3, $2 bola zmazaná.",
-'filedelete-nofile' => "'''$1''' neexistuje.",
-'filedelete-nofile-old' => "Neexistuje archivovaná verzia '''$1''' s uvedenými atribútmi.",
-'filedelete-otherreason' => 'Iný/Äalší dôvod:',
-'filedelete-reason-otherlist' => 'Iný dôvod',
-'filedelete-reason-dropdown' => '* Bežné dôvody mazania
+'filedelete' => 'Zmazať $1',
+'filedelete-legend' => 'Zmazať súbor',
+'filedelete-intro' => "Chystáte sa zmazať súbor '''[[Media:$1|$1]]''' spolu s celou jeho históriou.",
+'filedelete-intro-old' => "Mažete verziu súboru '''[[Media:$1|$1]]''' z [$4 $3, $2].",
+'filedelete-comment' => 'Dôvod:',
+'filedelete-submit' => 'Zmazať',
+'filedelete-success' => "'''$1''' bol zmazaný.",
+'filedelete-success-old' => "Verzia súboru '''[[Media:$1|$1]]''' z $3, $2 bola zmazaná.",
+'filedelete-nofile' => "'''$1''' neexistuje.",
+'filedelete-nofile-old' => "Neexistuje archivovaná verzia '''$1''' s uvedenými atribútmi.",
+'filedelete-otherreason' => 'Iný/Äalší dôvod:',
+'filedelete-reason-otherlist' => 'Iný dôvod',
+'filedelete-reason-dropdown' => '* Bežné dôvody mazania
** Porušenie autorských práv
** Duplicitný súbor',
-'filedelete-edit-reasonlist' => 'Upraviť dôvody zmazania',
-'filedelete-maintenance' => 'Mazanie a obnovovanie súborov je poÄas údržby doÄasne vypnuté.',
+'filedelete-edit-reasonlist' => 'Upraviť dôvody zmazania',
+'filedelete-maintenance' => 'Mazanie a obnovovanie súborov je poÄas údržby doÄasne vypnuté.',
+'filedelete-maintenance-title' => 'Nie je možné vymazať súbor',
# MIME search
'mimesearch' => 'MIME vyhľadávanie',
@@ -1990,6 +2038,8 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
'wantedpages' => 'Žiadané stránky',
'wantedpages-badtitle' => 'Neplatný názov vo výsledkoch: $1',
'wantedfiles' => 'Žiadané súbory',
+'wantedfiletext-cat' => 'Nasledovné súbory sa používajú, ale nie sú k dispozícii. Súbory z cudzích repozitárov môžu byÅ¥ uvedené aj napriek tomu, že existujú. Takéto faloÅ¡né poplachy budú <del>preÄiarknuté</del>. Okrem toho stránky, ktoré obsahujú vložené súbory, ktoré nie sú k dispozícii sú uvedené na [[:$1]].',
+'wantedfiletext-nocat' => 'Nasledovné súbory sa používajú, ale nie sú k dispozícii. Súbory z cudzích repozitárov môžu byÅ¥ uvedené aj napriek tomu, že existujú. Takéto faloÅ¡né poplachy budú <del>preÄiarknuté</del>.',
'wantedtemplates' => 'Žiadané šablóny',
'mostlinked' => 'NajÄastejÅ¡ie odkazované stránky',
'mostlinkedcategories' => 'NajÄastejÅ¡ie odkazované kategórie',
@@ -1998,6 +2048,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
'mostimages' => 'NajÄastejÅ¡ie odkazované súbory',
'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)',
'shortpages' => 'Krátke stránky',
'longpages' => 'Dlhé stránky',
'deadendpages' => 'Slepé stránky',
@@ -2014,7 +2065,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
'listusers-editsonly' => 'Vynechať používateľov bez úprav',
'listusers-creationsort' => 'Zoradiť podľa dátumu vytvorenia',
'usereditcount' => '$1 {{PLURAL:$1|úprava|úpravy|úprav}}',
-'usercreated' => 'Vytvorené $1 $2',
+'usercreated' => '{{GENDER:$3|Registrovaný|Registrovaná|Registrovaný(á)}} $1 $2',
'newpages' => 'Nové stránky',
'newpages-username' => 'Meno používateľa:',
'ancientpages' => 'Najdávnejšie upravované stránky',
@@ -2108,12 +2159,8 @@ Podporované protokoly: <tt>$1</tt> (nepridávajte ich do hľadania).',
'activeusers-noresult' => 'Neboli nájdení žiadni používatelia.',
# Special:Log/newusers
-'newuserlogpage' => 'Záznam vytvorených používateľov',
-'newuserlogpagetext' => 'Toto je záznam naposledy vytvorených používateľských úÄtov.',
-'newuserlog-byemail' => 'heslo poslané emailom',
-'newuserlog-create-entry' => 'Nový používateľ',
-'newuserlog-create2-entry' => 'vytvoril nový úÄet $1',
-'newuserlog-autocreate-entry' => 'ÚÄet vytvorený automaticky',
+'newuserlogpage' => 'Záznam vytvorených používateľov',
+'newuserlogpagetext' => 'Toto je záznam naposledy vytvorených používateľských úÄtov.',
# Special:ListGroupRights
'listgrouprights' => 'Práva skupiny používateľov',
@@ -2143,7 +2190,7 @@ Môžete si preÄítaÅ¥ [[{{MediaWiki:Listgrouprights-helppage}}|ÄalÅ¡ie inform
môžete mu pomocou nasledovného formulára poslať email.
Emailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa emailu, aby vám mohol príjemca priamo odpovedať.',
'usermailererror' => 'Emailový program vrátil chybu:',
-'defemailsubject' => 'email {{GRAMMAR:genitív|{{SITENAME}}}}',
+'defemailsubject' => 'email {{GRAMMAR:genitív|{{SITENAME}}}} od používateľa „$1“',
'usermaildisabled' => 'Používateľ má vypnuté používanie emailu',
'usermaildisabledtext' => 'Nemôžete posielať emaily ostatným používateľom na tejto wiki',
'noemailtitle' => 'Chýba e-mailová adresa',
@@ -2198,7 +2245,7 @@ Ak budete chcieť neskôr stránku odstrániť zo sledovaných stránok, kliknit
'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}}.',
'iteminvalidname' => 'Problém s položkou „$1“, neplatné meno...',
-'wlnote' => "Nižšie {{PLURAL:$1|je posledná jedna zmena|sú posledné '''$1''' zmeny|je posledných '''$1''' zmien}} za {{PLURAL:$2|poslednú hodinu|posledné '''$2''' hodiny|posledných '''$2''' hodín}}.",
+'wlnote' => "Nižšie {{PLURAL:$1|je posledná jedna zmena|sú posledné '''$1''' zmeny|je posledných '''$1''' zmien}} za {{PLURAL:$2|poslednú hodinu|posledné '''$2''' hodiny|posledných '''$2''' hodín}} do $4, $3.",
'wlshowlast' => 'Zobraziť posledných $1 hodín $2 dní $3',
'watchlist-options' => 'Nastavenia zoznamu sledovaných',
@@ -2258,8 +2305,6 @@ Návrhy a ÄalÅ¡ia pomoc:
'actionfailed' => 'Operácia sa nepodarila',
'deletedtext' => '"$1" bol zmazaný.
Na $2 nájdete zoznam posledných zmazaní.',
-'deletedarticle' => '„[[$1]]“ zmazaná',
-'suppressedarticle' => 'potlaÄil „[[$1]]“',
'dellogpage' => 'Záznam zmazaní',
'dellogpagetext' => 'Tu je zoznam posledných zmazaní.',
'deletionlog' => 'záznam zmazaní',
@@ -2304,7 +2349,10 @@ Môžete si pozrieť aj [[Special:ProtectedPages|zoznam momentálne platných oc
'unprotectedarticle' => 'odstránil ochranu stránky „[[$1]]“',
'movedarticleprotection' => 'nastavenia zamknutia stránky presunuté z „[[$2]]†na „[[$1]]â€',
'protect-title' => 'Zamykám „$1“',
+'protect-title-notallowed' => 'Zobraziť úroveň ochrany " $1 "',
'prot_1movedto2' => '[[$1]] premiestnená na [[$2]]',
+'protect-badnamespace-title' => 'Nezamykateľný menný priestor',
+'protect-badnamespace-text' => 'Stránky v tomto mennom priestore nie je možné zamykať.',
'protect-legend' => 'PotvrÄte zamknutie',
'protectcomment' => 'Dôvod:',
'protectexpiry' => 'Zamknuté do:',
@@ -2325,6 +2373,7 @@ Tu sú aktuálne nastavenia stránky '''$1''':",
'protect-level-sysop' => 'Len pre správcov',
'protect-summary-cascade' => 'kaskáda',
'protect-expiring' => 'vyprší o $1 (UTC)',
+'protect-expiring-local' => 'vyprší $1',
'protect-expiry-indefinite' => 'na neurÄito',
'protect-cascade' => 'Kaskádové zamknutie - chrániť všetky stránky použité na tejto stránke.',
'protect-cantedit' => 'Nemôžete zmeniť úrovne ochrany tejto stránky, pretože nemáte oprávnenie ju upravovať.',
@@ -2382,7 +2431,6 @@ Ak bola od zmazania vytvorená nová stránka s rovnakým názvom, obnovené rev
'undeletereset' => 'Reset',
'undeleteinvert' => 'Invertovať výber',
'undeletecomment' => 'Dôvod:',
-'undeletedarticle' => 'obnovený „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|jedna verzia bola obnovená|$1 verzie boli obnovené|$1 verzií bolo obnovených}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Jedna revízia|$1 revízie|$1 revízií}} a {{PLURAL:$2|jeden súbor bol obnovený|$2 súbory boli obnovené|$2 súborov bolo obnovených}}',
'undeletedfiles' => '{{PLURAL:$1|Jeden súbor bol obnovený|$1 súbory boli obnovené|$1 súborov bolo obnovených}}',
@@ -2391,6 +2439,7 @@ Ak bola od zmazania vytvorená nová stránka s rovnakým názvom, obnovené rev
Zoznam posledných mazaní a obnovení nájdete v [[Special:Log/delete|Zázname mazaní]].",
'undelete-header' => 'Pozri nedávno zmazané stránky v [[Special:Log/delete|zázname mazaní]].',
+'undelete-search-title' => 'Hľadať zmazané stránky',
'undelete-search-box' => 'Hľadať zmazané stránky',
'undelete-search-prefix' => 'Zobraziť stránky od:',
'undelete-search-submit' => 'Hľadať',
@@ -2399,6 +2448,7 @@ Zoznam posledných mazaní a obnovení nájdete v [[Special:Log/delete|Zázname
'undelete-bad-store-key' => 'Nebolo možné obnoviÅ¥ revíziu súboru s Äasovou známkou $1: súbor chýbal predtým, než bol zmazaný',
'undelete-cleanup-error' => 'Chyba pri mazaní nepoužitého archívneho súboru „$1“.',
'undelete-missing-filearchive' => 'Nebolo možné obnoviť archív s ID $1, pretože sa nenachádza v databáze. Je možné, že už bol obnovený.',
+'undelete-error' => 'Chyba pri obnovovaní stránky',
'undelete-error-short' => 'Chyba pri obnovovaní súboru: $1',
'undelete-error-long' => 'Vyskytli sa chyby pri obnovovaní súboru:
@@ -2520,6 +2570,7 @@ z/od momentálne zablokovanej IP adresy/používateľa.',
'blocklist-userblocks' => 'SkryÅ¥ blokovania úÄtov',
'blocklist-tempblocks' => 'SkryÅ¥ doÄasné blokovania',
'blocklist-addressblocks' => 'Skryť blokovania jednotlivých IP',
+'blocklist-rangeblocks' => 'Skryť blokovania rozsahov',
'blocklist-timestamp' => 'Časová známka',
'blocklist-target' => 'Cieľ',
'blocklist-expiry' => 'Vyprší',
@@ -2542,6 +2593,7 @@ z/od momentálne zablokovanej IP adresy/používateľa.',
'unblocklink' => 'odblokuj',
'change-blocklink' => 'zmeniť blokovanie',
'contribslink' => 'príspevky',
+'emaillink' => 'poslať email',
'autoblocker' => 'Boli ste automaticky zablokovaný, pretože vašu IP adresu nedávno použil „[[User:$1|$1]]“.
Uvedený dôvod zablokovania používateľa $2 bol: „$2“',
'blocklogpage' => 'Záznam_blokovaní',
@@ -2677,9 +2729,6 @@ Prosím, zlúÄte ich ruÄne.'''",
'movepage-page-moved' => 'Stránka $1 bola presunutá na $2.',
'movepage-page-unmoved' => 'Stránku $1 nebolo možné presunúť na $2.',
'movepage-max-pages' => 'Maximum $1 {{PLURAL:$1|stránka bola presunutá|stránok bolo presunutých}} a viac nebude presunutých automaticky.',
-'1movedto2' => '[[$1]] premiestnená na [[$2]]',
-'1movedto2_redir' => '[[$1]] premiestnená na [[$2]] výmenou presmerovania',
-'move-redirect-suppressed' => 'presmerovanie bolo potlaÄené',
'movelogpage' => 'Záznam presunov',
'movelogpagetext' => 'Tu je zoznam posledných presunutí.',
'movesubpage' => '{{PLURAL:$1|Podstránka|Podstránky}}',
@@ -2692,7 +2741,7 @@ Prosím, zlúÄte ich ruÄne.'''",
Cieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť tak priestor pre presun?',
'delete_and_move_confirm' => 'Ãno, zmaž stránku',
-'delete_and_move_reason' => 'Vymazať, aby sa umožnil presun',
+'delete_and_move_reason' => 'Vymazané, aby sa umožnil presun z „[[$1]]“',
'selfmove' => 'Zdrojový a cieľový názov sú rovnaké; nemožno presunúť stránku na seba samú.',
'immobile-source-namespace' => 'Nemôžete presúvaÅ¥ stránky v mennom priestore „$1â€',
'immobile-target-namespace' => 'Nemôžete presúvaÅ¥ stránky do menného priestoru „$1â€',
@@ -2721,9 +2770,11 @@ wiki používajúceho MediaWiki softvér pomocou stránky Special:Import.
Pre export stránok zadajte názvy do tohto poľa, jeden názov na riadok, a zvoľte, Äi chcete iba súÄasnú verziu s informáciou o poslednej úprave alebo aj vÅ¡etky starÅ¡ie verzie s históriou úprav.
V druhom prípade môžete tiež použiť odkaz, napr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pre stránku [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Exportovať všetky stránky',
'exportcuronly' => 'Zahrň iba aktuálnu verziu, nie kompletnú históriu',
'exportnohistory' => "----
'''Poznámka:''' Exportovanie plnej histórie stránok pomocou tohto formulára bolo vypnuté z dôvodov výkonnosti.",
+'exportlistauthors' => 'Vypisovať úplný zoznam prispievateľov pre každú stránku',
'export-submit' => 'Export',
'export-addcattext' => 'Pridať stránky z kategórie:',
'export-addcat' => 'Pridať',
@@ -2756,6 +2807,8 @@ Prosím, navštívte [//www.mediawiki.org/wiki/Localisation MediaWiki Localisati
'thumbnail_error' => 'Chyba pri vytváraní náhľadu: $1',
'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',
+'thumbnail-dest-create' => 'Nie je možné uložiť náhľad do cieľa',
'thumbnail_invalid_params' => 'Neplatné parametre náhľadu',
'thumbnail_dest_directory' => 'Nebolo možné vytvoriť cieľový adresár',
'thumbnail_image-type' => 'Nepodporovaný typ obrázka',
@@ -2800,6 +2853,11 @@ Uložte ho na svoj disk a nahrajte sem.',
'import-upload' => 'Nahrať XML údaje',
'import-token-mismatch' => 'Strata údajov relácie. Prosím, skúste to znova.',
'import-invalid-interwiki' => 'Nie je možné importovať zo zadanej wiki.',
+'import-error-edit' => 'Stránka „$1“ nebola importovaná, pretože nemáte oprávnenie na jej úpravu.',
+'import-error-create' => 'Stránka „$1“ nebola importovaná, pretože nemáte oprávnenie na jej vytvorenie.',
+'import-error-interwiki' => 'Stránka „$1“ nie je importovaná, pretože jej názov je vyhradený pre externé odkazy (interwiki).',
+'import-error-special' => 'Stránka „$1“ nie je importovaná, pretože patrí do špeciálneho menného priestoru, ktorý nepovoľuje stránky.',
+'import-error-invalid' => 'Stránka „$1“ nie je importovaná, pretože jej názov je neplatný.',
# Import log
'importlogpage' => 'Záznam importov',
@@ -2809,73 +2867,86 @@ Uložte ho na svoj disk a nahrajte sem.',
'import-logentry-interwiki' => 'Transwiki import $1 úspešný',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revízia|revízie|revízií}} z $2',
+# JavaScriptTest
+'javascripttest' => 'Testovanie JavaScriptu',
+'javascripttest-disabled' => 'Táto funkcia je vypnutá.',
+'javascripttest-title' => 'Beží $1 testov',
+'javascripttest-pagetext-noframework' => 'Táto stránka je vyhradená pre testy JavaScriptu.',
+'javascripttest-pagetext-unknownframework' => 'Neznáma testovacia platfoma „$1“.',
+'javascripttest-pagetext-frameworks' => 'Prosím vyberte jednu z nasledovných testovacích platforiem: $1',
+'javascripttest-pagetext-skins' => 'Vyberte tému vzhľadu, na ktorej chcete spustiť testy:',
+'javascripttest-qunit-intro' => 'Pozri [$1 dokumentácia testovania] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'Testovacia sada QUnit JavaScriptu MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Vaša používateľská stránka',
-'tooltip-pt-anonuserpage' => 'Používateľská stránka pre ip adresu, ktorú upravujete ako',
-'tooltip-pt-mytalk' => 'Vaša diskusná stránka',
-'tooltip-pt-anontalk' => 'Diskusia o úpravách z tejto ip adresy',
-'tooltip-pt-preferences' => 'Moje nastavenia',
-'tooltip-pt-watchlist' => 'Zoznam stránok, na ktorých sledujete zmeny.',
-'tooltip-pt-mycontris' => 'Zoznam vašich príspevkov',
-'tooltip-pt-login' => 'OdporúÄame vám prihlásiÅ¥ sa, nie je to vÅ¡ak povinné.',
-'tooltip-pt-anonlogin' => 'OdporúÄame vám prihlásiÅ¥ sa, nie je to vÅ¡ak povinné.',
-'tooltip-pt-logout' => 'Odhlásiť',
-'tooltip-ca-talk' => 'Diskusia o obsahu stránky',
-'tooltip-ca-edit' => 'Môžete upravovaÅ¥ túto stránku. Prosíme, pred uložením použite tlaÄidlo ZobraziÅ¥ náhľad.',
-'tooltip-ca-addsection' => 'ZaÄaÅ¥ novú sekciu',
-'tooltip-ca-viewsource' => 'Táto stránka je zamknutá. Môžete však vidieť jej zdrojový text.',
-'tooltip-ca-history' => 'Minulé verzie tejto stránky.',
-'tooltip-ca-protect' => 'Zamknúť túto stránku',
-'tooltip-ca-unprotect' => 'Zmeniť stav ochrany tejto stránky',
-'tooltip-ca-delete' => 'Vymazať túto stránku',
-'tooltip-ca-undelete' => 'Obnoviť úpravy tejto stránky až po dobu, kedy bola vymazaná',
-'tooltip-ca-move' => 'Presunúť túto stránku',
-'tooltip-ca-watch' => 'Pridať túto stránku do zoznamu sledovaných stránok',
-'tooltip-ca-unwatch' => 'Odstrániť túto stránku zo sledovaných stránok',
-'tooltip-search' => 'Vyhľadávanie na {{GRAMMAR:datív|{{SITENAME}}}}',
-'tooltip-search-go' => 'Prejsť na stránku s presne takýmto názvom, ak existuje',
-'tooltip-search-fulltext' => 'Hľadať tento text na stránkach',
-'tooltip-p-logo' => 'Hlavná stránka',
-'tooltip-n-mainpage' => 'Navštíviť Hlavnú stránku',
-'tooltip-n-mainpage-description' => 'Navštíviť hlavnú stránku',
-'tooltip-n-portal' => 'O projekte, ako môžete prispieÅ¥, kde Äo nájsÅ¥',
-'tooltip-n-currentevents' => 'Aktuálne udalosti a ich pozadie',
-'tooltip-n-recentchanges' => 'Zoznam posledných úprav vo wiki.',
-'tooltip-n-randompage' => 'Zobrazenie náhodnej stránky',
-'tooltip-n-help' => 'Pozrieť si pomoc.',
-'tooltip-t-whatlinkshere' => 'Zoznam všetkých wiki stránok, ktoré sem odkazujú',
-'tooltip-t-recentchangeslinked' => 'Posledné úpravy v stránkach, ktoré odkazujú na túto stránku',
-'tooltip-feed-rss' => 'RSS feed pre túto stránku',
-'tooltip-feed-atom' => 'Atom feed pre túto stránku',
-'tooltip-t-contributions' => 'Pozrieť si zoznam príspevkov od tohto používateľa',
-'tooltip-t-emailuser' => 'Poslať e-mail tomuto používateľovi',
-'tooltip-t-upload' => 'Nahranie obrázkových alebo multimediálnych súborov',
-'tooltip-t-specialpages' => 'Zoznam všetkých špeciálnych stránok',
-'tooltip-t-print' => 'Verzia tejto stránky pre tlaÄ',
-'tooltip-t-permalink' => 'Trvalý odkaz na túto verziu stránky',
-'tooltip-ca-nstab-main' => 'Pozrieť si obsah stránky',
-'tooltip-ca-nstab-user' => 'Pozrieť si stránku používateľa',
-'tooltip-ca-nstab-media' => 'Pozrieť si stránku médií',
-'tooltip-ca-nstab-special' => 'Toto je špeciálna stránka, nemôžete ju upravovať.',
-'tooltip-ca-nstab-project' => 'Pozrieť si stránku projektu',
-'tooltip-ca-nstab-image' => 'Zobraziť popisnú stránku súboru',
-'tooltip-ca-nstab-mediawiki' => 'Pozrieť si systémovú stránku',
-'tooltip-ca-nstab-template' => 'Pozrieť si šablónu',
-'tooltip-ca-nstab-help' => 'Pozrieť si stránku Pomocníka',
-'tooltip-ca-nstab-category' => 'Pozrieť si stránku s kategóriami',
-'tooltip-minoredit' => 'OznaÄiÅ¥ túto úpravu ako drobnú',
-'tooltip-save' => 'Uložiť vaše úpravy',
-'tooltip-preview' => 'Náhľad úprav, prosím použite pred uložením!',
-'tooltip-diff' => 'Zobraziť, aké zmeny ste urobili v texte.',
-'tooltip-compareselectedversions' => 'Zobraziť rozdiely medzi dvomi zvolenými verziami tejto stránky.',
-'tooltip-watch' => 'Pridať túto stránku k sledovaným.',
-'tooltip-recreate' => 'Znovu vytvoriť stránku napriek tomu, že bola zmazaná',
-'tooltip-upload' => 'ZaÄaÅ¥ nahrávanie',
-'tooltip-rollback' => '„Rollback†vracia úpravy posledného prispievateľa tejto stránky jedným kliknutím.',
-'tooltip-undo' => '„Vrátiť†vráti túto úpravu a otvorí formulár úprav v režime náhľadu.
+'tooltip-pt-userpage' => 'Vaša používateľská stránka',
+'tooltip-pt-anonuserpage' => 'Používateľská stránka pre ip adresu, ktorú upravujete ako',
+'tooltip-pt-mytalk' => 'Vaša diskusná stránka',
+'tooltip-pt-anontalk' => 'Diskusia o úpravách z tejto ip adresy',
+'tooltip-pt-preferences' => 'Moje nastavenia',
+'tooltip-pt-watchlist' => 'Zoznam stránok, na ktorých sledujete zmeny.',
+'tooltip-pt-mycontris' => 'Zoznam vašich príspevkov',
+'tooltip-pt-login' => 'OdporúÄame vám prihlásiÅ¥ sa, nie je to vÅ¡ak povinné.',
+'tooltip-pt-anonlogin' => 'OdporúÄame vám prihlásiÅ¥ sa, nie je to vÅ¡ak povinné.',
+'tooltip-pt-logout' => 'Odhlásiť',
+'tooltip-ca-talk' => 'Diskusia o obsahu stránky',
+'tooltip-ca-edit' => 'Môžete upravovaÅ¥ túto stránku. Prosíme, pred uložením použite tlaÄidlo ZobraziÅ¥ náhľad.',
+'tooltip-ca-addsection' => 'ZaÄaÅ¥ novú sekciu',
+'tooltip-ca-viewsource' => 'Táto stránka je zamknutá. Môžete však vidieť jej zdrojový text.',
+'tooltip-ca-history' => 'Minulé verzie tejto stránky.',
+'tooltip-ca-protect' => 'Zamknúť túto stránku',
+'tooltip-ca-unprotect' => 'Zmeniť stav ochrany tejto stránky',
+'tooltip-ca-delete' => 'Vymazať túto stránku',
+'tooltip-ca-undelete' => 'Obnoviť úpravy tejto stránky až po dobu, kedy bola vymazaná',
+'tooltip-ca-move' => 'Presunúť túto stránku',
+'tooltip-ca-watch' => 'Pridať túto stránku do zoznamu sledovaných stránok',
+'tooltip-ca-unwatch' => 'Odstrániť túto stránku zo sledovaných stránok',
+'tooltip-search' => 'Vyhľadávanie na {{GRAMMAR:datív|{{SITENAME}}}}',
+'tooltip-search-go' => 'Prejsť na stránku s presne takýmto názvom, ak existuje',
+'tooltip-search-fulltext' => 'Hľadať tento text na stránkach',
+'tooltip-p-logo' => 'Hlavná stránka',
+'tooltip-n-mainpage' => 'Navštíviť Hlavnú stránku',
+'tooltip-n-mainpage-description' => 'Navštíviť hlavnú stránku',
+'tooltip-n-portal' => 'O projekte, ako môžete prispieÅ¥, kde Äo nájsÅ¥',
+'tooltip-n-currentevents' => 'Aktuálne udalosti a ich pozadie',
+'tooltip-n-recentchanges' => 'Zoznam posledných úprav vo wiki.',
+'tooltip-n-randompage' => 'Zobrazenie náhodnej stránky',
+'tooltip-n-help' => 'Pozrieť si pomoc.',
+'tooltip-t-whatlinkshere' => 'Zoznam všetkých wiki stránok, ktoré sem odkazujú',
+'tooltip-t-recentchangeslinked' => 'Posledné úpravy v stránkach, ktoré odkazujú na túto stránku',
+'tooltip-feed-rss' => 'RSS feed pre túto stránku',
+'tooltip-feed-atom' => 'Atom feed pre túto stránku',
+'tooltip-t-contributions' => 'Pozrieť si zoznam príspevkov od tohto používateľa',
+'tooltip-t-emailuser' => 'Poslať e-mail tomuto používateľovi',
+'tooltip-t-upload' => 'Nahranie obrázkových alebo multimediálnych súborov',
+'tooltip-t-specialpages' => 'Zoznam všetkých špeciálnych stránok',
+'tooltip-t-print' => 'Verzia tejto stránky pre tlaÄ',
+'tooltip-t-permalink' => 'Trvalý odkaz na túto verziu stránky',
+'tooltip-ca-nstab-main' => 'Pozrieť si obsah stránky',
+'tooltip-ca-nstab-user' => 'Pozrieť si stránku používateľa',
+'tooltip-ca-nstab-media' => 'Pozrieť si stránku médií',
+'tooltip-ca-nstab-special' => 'Toto je špeciálna stránka, nemôžete ju upravovať.',
+'tooltip-ca-nstab-project' => 'Pozrieť si stránku projektu',
+'tooltip-ca-nstab-image' => 'Zobraziť popisnú stránku súboru',
+'tooltip-ca-nstab-mediawiki' => 'Pozrieť si systémovú stránku',
+'tooltip-ca-nstab-template' => 'Pozrieť si šablónu',
+'tooltip-ca-nstab-help' => 'Pozrieť si stránku Pomocníka',
+'tooltip-ca-nstab-category' => 'Pozrieť si stránku s kategóriami',
+'tooltip-minoredit' => 'OznaÄiÅ¥ túto úpravu ako drobnú',
+'tooltip-save' => 'Uložiť vaše úpravy',
+'tooltip-preview' => 'Náhľad úprav, prosím použite pred uložením!',
+'tooltip-diff' => 'Zobraziť, aké zmeny ste urobili v texte.',
+'tooltip-compareselectedversions' => 'Zobraziť rozdiely medzi dvomi zvolenými verziami tejto stránky.',
+'tooltip-watch' => 'Pridať túto stránku k sledovaným.',
+'tooltip-watchlistedit-normal-submit' => 'Odstrániť položky',
+'tooltip-watchlistedit-raw-submit' => 'Aktualizovať zoznam sledovaných stránok',
+'tooltip-recreate' => 'Znovu vytvoriť stránku napriek tomu, že bola zmazaná',
+'tooltip-upload' => 'ZaÄaÅ¥ nahrávanie',
+'tooltip-rollback' => '„Rollback†vracia úpravy posledného prispievateľa tejto stránky jedným kliknutím.',
+'tooltip-undo' => '„Vrátiť†vráti túto úpravu a otvorí formulár úprav v režime náhľadu.
Umožnuje do zhrnutia pridanie dôvodu.',
-'tooltip-preferences-save' => 'Uložiť nastavenia',
-'tooltip-summary' => 'Zadajte krátke zhrnutie',
+'tooltip-preferences-save' => 'Uložiť nastavenia',
+'tooltip-summary' => 'Zadajte krátke zhrnutie',
# Stylesheets
'common.css' => '/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */',
@@ -2964,9 +3035,6 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
# Patrol log
'patrol-log-page' => 'Záznam strážení',
'patrol-log-header' => 'Toto je záznam strážených revízií.',
-'patrol-log-line' => '$1 z $2 oznaÄených ako sledované $3',
-'patrol-log-auto' => '(automaticky)',
-'patrol-log-diff' => 'revízia $1',
'log-show-hide-patrol' => 'záznam stráženia $1',
# Image deletion
@@ -2993,11 +3061,11 @@ Jeho spustením môžete kompromitovať svoj systém.",
'file-info' => 'veľkosť súboru: $1, MIME typ: $2',
'file-info-size' => '$1 × $2 pixelov, veľkosť súboru: $3, MIME typ: $4',
'file-info-size-pages' => '$1 × $2 pixlov, veľkosť súboru: $3, typ MIME: $4, $5 {{PLURAL:$5|stránka|stránky|stránok}}',
-'file-nohires' => '<small>Nie je dostupné vyššie rozlíšenie.</small>',
+'file-nohires' => 'Nie je dostupné vyššie rozlíšenie.',
'svg-long-desc' => 'SVG súbor, $1 × $2 pixelov, veľkosť súboru: $3',
'show-big-image' => 'Obrázok vo vyššom rozlíšení',
-'show-big-image-preview' => '<small>Veľkosť tohto náhľadu: $1.</small>',
-'show-big-image-other' => '<small>Iné rozlíšenia: $1.</small>',
+'show-big-image-preview' => 'Veľkosť tohto náhľadu: $1.',
+'show-big-image-other' => 'Iné {{PLURAL:$2|rozlíšenie|rozlíšenia}}: $1 .',
'show-big-image-size' => '$1 × $2 pixlov',
'file-info-gif-looped' => 'v cykle',
'file-info-gif-frames' => '$1 {{PLURAL:$1|rámec|rámce|rámcov}}',
@@ -3017,6 +3085,13 @@ Jeho spustením môžete kompromitovať svoj systém.",
'bydate' => 'podľa dátumu',
'sp-newimages-showfrom' => 'ZobraziÅ¥ nové súbory poÄínajúc $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekundy|$1 sekúnd}}',
+'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í}}',
+'ago' => 'pred: $1',
+
# Bad image list
'bad_image_list' => 'Formát je nasledovný:
@@ -3519,13 +3594,6 @@ Platnosť tohto potvrdzovacieho kódu vyprší $4.',
'scarytranscludefailed' => '[Nepodarilo sa priniesť šablónu pre $1]',
'scarytranscludetoolong' => '[URL je príliš dlhé]',
-# Trackbacks
-'trackbackbox' => 'Trackback pre túto stránku:<br />
-$1',
-'trackbackremove' => '([$1 Zmazať])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback úspešne zmazaný.',
-
# Delete conflict
'deletedwhileediting' => "'''Upozornenie''': Táto stránka bola zmazaná potom ako ste zaÄali s jej úpravami!",
'confirmrecreate' => "Používateľ [[User:$1|$1]] ([[User talk:$1|diskusia]]) zmazal túto stránku potom, ako ste ju zaÄali upravovaÅ¥, s odôvodnením:
@@ -3610,6 +3678,9 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
# Iranian month names
'iranian-calendar-m1' => 'Farvardín',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusia]])',
+
# Core parser functions
'unknown_extension_tag' => 'Neznáma znaÄka rozšírenia „$1“',
'duplicate-defaultsort' => 'Upozornenie: Å tandardný kláves na zoraÄovanie „$2“ nahrádza starý kláves „$1“.',
@@ -3708,13 +3779,16 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'tags-hitcount' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
# Special:ComparePages
-'comparepages' => 'Porovnať stránky',
-'compare-selector' => 'Porovnať revízie stránky',
-'compare-page1' => 'Stránka 1',
-'compare-page2' => 'Stránka 2',
-'compare-rev1' => 'Revízia 1',
-'compare-rev2' => 'Revízia 2',
-'compare-submit' => 'Porovnať',
+'comparepages' => 'Porovnať stránky',
+'compare-selector' => 'Porovnať revízie stránky',
+'compare-page1' => 'Stránka 1',
+'compare-page2' => 'Stránka 2',
+'compare-rev1' => 'Revízia 1',
+'compare-rev2' => 'Revízia 2',
+'compare-submit' => 'Porovnať',
+'compare-invalid-title' => 'Názov, ktorý ste zadali nie je platný.',
+'compare-title-not-exists' => 'Názov, ktorý ste zadali neexistuje.',
+'compare-revision-not-exists' => 'Revízia, ktorú ste zadali, neexistuje.',
# Database error messages
'dberr-header' => 'Táto wiki má problém',
@@ -3741,4 +3815,90 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'sqlite-has-fts' => '$1 s podporou vyhľadávania v plnom texte',
'sqlite-no-fts' => '$1 bez podpory vyhľadávania v plnom texte',
+# New logging system
+'logentry-delete-delete' => '$1 zmazal(a) stránku $3',
+'logentry-delete-restore' => '$1 obnovil(a) stránku $3',
+'logentry-delete-event' => '$1 zmenil viditeľnosť {{PLURAL:$5|protokolovacieho záznamu|$5 protokolovacích záznamov}} k stránke $3: $4',
+'logentry-delete-revision' => '$1 zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
+'logentry-delete-event-legacy' => '$1 zmenil viditeľnosť protokolovacích záznamov k stránke $3',
+'logentry-delete-revision-legacy' => '$1 zmenil viditeľnosť revízií na stránke $3',
+'logentry-suppress-delete' => '$1 utajil stránku $3',
+'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|protokolovacieho záznamu|$5 protokolovacích záznamov}} k stránke $3: $4',
+'logentry-suppress-revision' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
+'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť protokolovacích záznamov k stránke $3',
+'logentry-suppress-revision-legacy' => '$1 utajene zmenil viditeľnosť revízií na stránke $3',
+'revdelete-content-hid' => 'obsah skrytý',
+'revdelete-summary-hid' => 'zhrnutie editácie skryté',
+'revdelete-uname-hid' => 'používateľské meno skryté',
+'revdelete-content-unhid' => 'obsah odkrytý',
+'revdelete-summary-unhid' => 'zhrnutie editácie odkryté',
+'revdelete-uname-unhid' => 'používateľské meno odkryté',
+'revdelete-restricted' => 'obmedzenia správcov použité',
+'revdelete-unrestricted' => 'obmedzenia správcov odstránené',
+'logentry-move-move' => '$1 premiestnil stránku $3 na $4',
+'logentry-move-move-noredirect' => '$1 premiestnil stránku $3 na $4, ale neponechal presmerovanie',
+'logentry-move-move_redir' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania',
+'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania, ale neponechal presmerovanie',
+'logentry-patrol-patrol' => '$1 oznaÄil revíziu $4 stránky $3 ako overenú',
+'logentry-patrol-patrol-auto' => '$1 automaticky oznaÄil revíziu $4 stránky $3 ako overenú',
+'logentry-newusers-newusers' => '$1 založil používateľský úÄet',
+'logentry-newusers-create' => '$1 založil používateľský úÄet',
+'logentry-newusers-create2' => '$1 založil používateľský úÄet $3',
+'logentry-newusers-autocreate' => 'Automaticky bol založený úÄet $1',
+'newuserlog-byemail' => 'heslo poslané emailom',
+
+# Feedback
+'feedback-bugornote' => 'Ak ste pripravený podrobne popísať technický problém, prosím pošlite [$1 hlásenie o chybe].
+V opaÄnom prípade môžete použiÅ¥ zjednoduÅ¡ený formulár nižšie. Váš komentár sa pridá na stránku „[$3 $2]“ spolu s vaÅ¡im používateľským meno a prehliadaÄom, ktorý používate.',
+'feedback-subject' => 'Predmet:',
+'feedback-message' => 'Správa:',
+'feedback-cancel' => 'Zrušiť',
+'feedback-submit' => 'Odoslať komentár',
+'feedback-adding' => 'Pridáva sa komentár na stránku...',
+'feedback-error1' => 'Chyba: Nerozpoznaný výsledok z API',
+'feedback-error2' => 'Chyba: Úprava sa nepodarila',
+'feedback-error3' => 'Chyba: Žiadna odpoveÄ z API',
+'feedback-thanks' => 'Ďakujeme. Váš komentár bol odoslaný na stránku „[$2 $1]“.',
+'feedback-close' => 'Hotovo',
+'feedback-bugcheck' => 'Skvelé! Teraz len skontrolujte, Äi to nie je jedna z už [$1 známych chýb].',
+'feedback-bugnew' => 'Skontroloval som. Poslať nové hlásenie o chybe.',
+
+# API errors
+'api-error-badaccess-groups' => 'Nemáte oprávnenie nahrávať súbory na tejto wiki.',
+'api-error-badtoken' => 'Vnútorná chyba: Zlý token.',
+'api-error-copyuploaddisabled' => 'Nahrávanie z URL je na tomto serveri zakázané.',
+'api-error-duplicate' => '{{PLURAL:$1|[$2 Äalší súbor]|[$2 ÄalÅ¡ie súbory]}} s rovnakým obsahom už na tejto wiki existujú',
+'api-error-duplicate-archive' => '{{PLURAL:$1|[$2 Äalší súbor]|[$2 ÄalÅ¡ie súbory]}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplicitný súbor, ktorý už bol zmazaný|Duplicitné súbory, ktoré už boli zmazané}}',
+'api-error-duplicate-popup-title' => 'Duplikovať {{PLURAL:$1|súbor|súbory}}',
+'api-error-empty-file' => 'Súbor, ktorý ste poslali bol prázdny.',
+'api-error-emptypage' => 'Vytváranie nových, prázdnych stránok nie je dovolené.',
+'api-error-fetchfileerror' => 'Vnútorná chyba: NieÄo pokazilo poÄas sÅ¥ahovania súboru.',
+'api-error-file-too-large' => 'Súbor, ktorý ste poslali bol príliš veľký.',
+'api-error-filename-tooshort' => 'Názov súboru je príliš krátky.',
+'api-error-filetype-banned' => 'Tento typ súboru je zakázaný.',
+'api-error-filetype-missing' => 'Súboru chýba prípona.',
+'api-error-hookaborted' => 'Zmena, ktorú ste sa pokúsili vykonať bola zrušená prípojným bodom rozšírenia.',
+'api-error-http' => 'Vnútorná chyba: Nepodarilo sa pripojiť k serveru.',
+'api-error-illegal-filename' => 'Názov súboru nie je povolený.',
+'api-error-internal-error' => 'Vnútorná chyba: NieÄo pokazilo pri spracovaní súboru, ktorý ste nahrávali na wiki.',
+'api-error-invalid-file-key' => 'Vnútorná chyba: Súbor sa nenaÅ¡iel v doÄasnom úložisku.',
+'api-error-missingparam' => 'Vnútorná chyba: Chýbajú parametre požiadavky.',
+'api-error-missingresult' => 'Vnútorná chyba: Nepodarilo sa urÄiÅ¥, Äi kopírovanie prebehlo úspeÅ¡ne.',
+'api-error-mustbeloggedin' => 'Aby ste mohli nahrávať súbory, musíte sa prihlásiť',
+'api-error-mustbeposted' => 'Vnútorná chyba: Požiadavka vyžaduje HTTP POST.',
+'api-error-noimageinfo' => 'Nahranie sa podarilo, ale server nám nedal žiadne informácie o súbore.',
+'api-error-nomodule' => 'Vnútorná chyba: Nebol nastavený žiaden nahrávací modul.',
+'api-error-ok-but-empty' => 'Vnútorná chyba: Žiadna odpoveÄ zo servera.',
+'api-error-overwrite' => 'Prepísanie existujúceho súboru nie je povolené.',
+'api-error-stashfailed' => 'Vnútorná chyba: Serveru sa nepodarilo uložiÅ¥ doÄasný súbor.',
+'api-error-timeout' => 'Server neodpovedal v oÄakávanom Äase.',
+'api-error-unclassified' => 'Vyskytla sa neznáma chyba.',
+'api-error-unknown-code' => 'Neznáma chyba: „$1“',
+'api-error-unknown-error' => 'Vnútorná chyba: NieÄo pokazilo pri pokuse nahraÅ¥ váš súbor.',
+'api-error-unknown-warning' => 'Neznáme upozornenie: $1',
+'api-error-unknownerror' => 'Neznáma chyba: „$1“',
+'api-error-uploaddisabled' => 'Nahrávanie je na tejto wiki zakázané.',
+'api-error-verification-error' => 'Tento súbor môže byť poškodený, alebo má zlú príponu.',
+
);
diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php
index f17e3702..7536eca7 100644
--- a/languages/messages/MessagesSl.php
+++ b/languages/messages/MessagesSl.php
@@ -112,44 +112,44 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#PREUSMERITEV', '#REDIRECT' ),
- 'notoc' => array( '0', '__BREZKAZALAVSEBINE__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__BREZGALERIJE__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__VSILIKAZALOVSEBINE__', '__FORCETOC__' ),
- 'toc' => array( '0', '__POGLAVJE__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BREZUREJANJARAZDELKOV__', '__NOEDITSECTION__' ),
- 'img_thumbnail' => array( '1', 'sliÄica', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'sliÄica=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'desno', 'right' ),
- 'img_left' => array( '1', 'levo', 'left' ),
- 'img_none' => array( '1', 'brez', 'none' ),
- 'img_width' => array( '1', '$1_pik', '$1px' ),
- 'img_center' => array( '1', 'sredina', 'sredinsko', 'center', 'centre' ),
- 'img_framed' => array( '1', 'okvir', 'okvirjeno', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'brezokvirja', 'frameless' ),
- 'img_page' => array( '1', 'stran=$1', 'm_stran $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'zgorajdesno', 'zgorajdesno=$1', 'zgorajdesno $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'obroba', 'border' ),
- 'img_sub' => array( '1', 'pod', 'podpisano', 'sub' ),
- 'img_super' => array( '1', 'nad', 'nadpisano', 'super', 'sup' ),
- 'img_top' => array( '1', 'vrh', 'top' ),
- 'img_text_top' => array( '1', 'vrh-besedila', 'text-top' ),
- 'img_bottom' => array( '1', 'dno', 'bottom' ),
- 'img_text_bottom' => array( '1', 'dno-besedila', 'text-bottom' ),
- 'sitename' => array( '1', 'IMESTRANI', 'SITENAME' ),
- 'server' => array( '0', 'STREZNIK', 'SERVER' ),
- 'grammar' => array( '0', 'SKLON:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'SPOL:', 'GENDER:' ),
- 'plural' => array( '0', 'MNOZINA:', 'PLURAL:' ),
- 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
- 'tag' => array( '0', 'oznaka', 'tag' ),
- 'hiddencat' => array( '1', '__SKRITAKATEGORIJA__', '__HIDDENCAT__' ),
- 'index' => array( '1', '__KAZALO__', '__INDEX__' ),
- 'noindex' => array( '1', '__BREZKAZALA__', '__NOINDEX__' ),
- 'staticredirect' => array( '1', '__STATICNAPREUSMERITEV__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'STOPNJAZASCITE', 'PROTECTIONLEVEL' ),
- 'url_path' => array( '0', 'POT', 'PATH' ),
- 'url_query' => array( '0', 'POIZVEDBA', 'QUERY' ),
+ 'redirect' => array( '0', '#PREUSMERITEV', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BREZKAZALAVSEBINE__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BREZGALERIJE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__VSILIKAZALOVSEBINE__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__POGLAVJE__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BREZUREJANJARAZDELKOV__', '__NOEDITSECTION__' ),
+ 'img_thumbnail' => array( '1', 'sliÄica', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'sliÄica=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'desno', 'right' ),
+ 'img_left' => array( '1', 'levo', 'left' ),
+ 'img_none' => array( '1', 'brez', 'none' ),
+ 'img_width' => array( '1', '$1_pik', '$1px' ),
+ 'img_center' => array( '1', 'sredina', 'sredinsko', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'okvir', 'okvirjeno', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'brezokvirja', 'frameless' ),
+ 'img_page' => array( '1', 'stran=$1', 'm_stran $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'zgorajdesno', 'zgorajdesno=$1', 'zgorajdesno $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'obroba', 'border' ),
+ 'img_sub' => array( '1', 'pod', 'podpisano', 'sub' ),
+ 'img_super' => array( '1', 'nad', 'nadpisano', 'super', 'sup' ),
+ 'img_top' => array( '1', 'vrh', 'top' ),
+ 'img_text_top' => array( '1', 'vrh-besedila', 'text-top' ),
+ 'img_bottom' => array( '1', 'dno', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'dno-besedila', 'text-bottom' ),
+ 'sitename' => array( '1', 'IMESTRANI', 'SITENAME' ),
+ 'server' => array( '0', 'STREZNIK', 'SERVER' ),
+ 'grammar' => array( '0', 'SKLON:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SPOL:', 'GENDER:' ),
+ 'plural' => array( '0', 'MNOZINA:', 'PLURAL:' ),
+ 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+ 'tag' => array( '0', 'oznaka', 'tag' ),
+ 'hiddencat' => array( '1', '__SKRITAKATEGORIJA__', '__HIDDENCAT__' ),
+ 'index' => array( '1', '__KAZALO__', '__INDEX__' ),
+ 'noindex' => array( '1', '__BREZKAZALA__', '__NOINDEX__' ),
+ 'staticredirect' => array( '1', '__STATICNAPREUSMERITEV__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'STOPNJAZASCITE', 'PROTECTIONLEVEL' ),
+ 'url_path' => array( '0', 'POT', 'PATH' ),
+ 'url_query' => array( '0', 'POIZVEDBA', 'QUERY' ),
);
$linkTrail = '/^([a-zÄćđžš]+)(.*)$/sDu';
@@ -540,22 +540,24 @@ Prosimo, da o tem obvestite [[Special:ListUsers/sysop|administratorja]] (ne poza
'badarticleerror' => 'Na tej strani dejanja ne morem izvesti. Morda je bila stran med predložitvijo vaše zahteve že izbrisana.',
'cannotdelete' => 'Strani ali datoteke »$1« ni mogoÄe izbrisati.
Morda jo je izbrisal že kdo drug.',
+'cannotdelete-title' => 'Ne morem izbrisati 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.',
-'perfcached' => 'Navedeni podatki so shranjeni v predpomnilniku in morda niso popolnoma posodobljeni.',
-'perfcachedts' => 'Prikazani podatki so shranjeni v predpomnilniku in so bili nazadnje osveženi $1.',
+'perfcached' => 'Navedeni podatki so shranjeni v predpomnilniku in morda niso popolnoma posodobljeni. V predpomnilniku {{PLURAL:$1|je|sta|so|je}} na voljo najveÄ $1 {{PLURAL:$1|rezultat|rezultata|rezultate|rezultatov}}.',
+'perfcachedts' => 'Prikazani podatki so shranjeni v predpomnilniku in so bili nazadnje osveženi $1. V predpomnilniku {{PLURAL:$4|je|sta|so|je}} na voljo najveÄ $4 {{PLURAL:$4|rezultat|rezultata|rezultate|rezultatov}}.',
'querypage-no-updates' => 'Posodobitve za to stran so trenutno onemogoÄene. TukajÅ¡nji podatki se v kratkem ne bodo osvežili.',
'wrong_wfQuery_params' => 'Nepravilni parametri za wfQuery()<br />
Funkcija: $1<br />
Poizvedba: $2',
'viewsource' => 'Izvorno besedilo',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Ogled vira $1',
'actionthrottled' => 'Dejanje zaustavljeno',
'actionthrottledtext' => 'Kot ukrep proti smetju, je Å¡tevilo izvajanj tega dejanja v Äasovnem obdobju omejeno, in vi ste ta limit presegli.
Prosimo, poskusite znova Äez nekaj minut.',
'protectedpagetext' => 'Ta stran je bila zaklenjena za prepreÄitev urejanja.',
'viewsourcetext' => 'Lahko si ogledate in kopirate vsebino te strani:',
+'viewyourtext' => "Lahko si ogledate in kopirate vsebino '''vaših urejanj''' te strani:",
'protectedinterface' => 'Prikazana stran vsebuje besedilo vmesnika programja in je zaradi prepreÄevanja zlorabe zaÅ¡Äitena.',
'editinginterface' => "'''Opozorilo:''' Urejate stran, ki vsebuje besedilo ali drug element uporabniškega vmesnika programja.
Spremembe te strani bodo vplivale na podobo uporabniškega vmesnika.
@@ -666,6 +668,7 @@ možnosti se e-pošte ne bo pošiljalo.',
'emailconfirmlink' => 'Potrdite svoj e-poštni naslov',
'invalidemailaddress' => 'E-poštni naslov zaradi neveljavne oblike ni sprejemljiv.
Prosimo, vpišite pravilno oblikovanega ali polje izpraznite.',
+'cannotchangeemail' => 'E-poÅ¡tnih naslovov raÄuna na tem wikiju ni mogoÄe spremeniti.',
'accountcreated' => 'RaÄun je ustvarjen',
'accountcreatedtext' => 'UporabniÅ¡ki raÄun za »$1« je ustvarjen.',
'createaccount-title' => 'Ustvarjanje raÄuna za {{GRAMMAR:tožilnik|{{SITENAME}}}}',
@@ -681,6 +684,7 @@ Prosimo poÄakajte, preden poskusite znova.',
# E-mail sending
'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
+'user-mail-no-addy' => 'Poskušal poslati e-pošto brez e-poštnega naslova',
# Change password dialog
'resetpass' => 'Spremeni geslo',
@@ -702,16 +706,18 @@ Morda ste že uspeÅ¡no spremenili geslo ali pa ste zahtevali novo zaÄasno geslo
'resetpass-temp-password' => 'ZaÄasno geslo:',
# Special:PasswordReset
-'passwordreset' => 'Ponastavitev gesla',
-'passwordreset-text' => 'Izpolnite obrazec, da prejmete e-poÅ¡tni opomnik s podrobnostmi vaÅ¡ega raÄuna.',
-'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-username' => 'Uporabniško ime:',
-'passwordreset-domain' => 'Domena:',
-'passwordreset-email' => 'E-poštni naslov:',
-'passwordreset-emailtitle' => 'Podrobnosti raÄuna na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nekdo (verjetno vi, z IP-naslova $1) je zahteval opomnik vaših
+'passwordreset' => 'Ponastavitev gesla',
+'passwordreset-text' => 'Izpolnite obrazec, da prejmete e-poÅ¡tni opomnik s podrobnostmi vaÅ¡ega raÄuna.',
+'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-username' => 'Uporabniško ime:',
+'passwordreset-domain' => 'Domena:',
+'passwordreset-capture' => 'Ogled nastale e-pošte?',
+'passwordreset-capture-help' => 'ÄŒe potrdite to polje, vam bodo e-poÅ¡te (z zaÄasnim geslom) pokazane in poslane uporabniku.',
+'passwordreset-email' => 'E-poštni naslov:',
+'passwordreset-emailtitle' => 'Podrobnosti raÄuna na {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Nekdo (verjetno vi, z IP-naslova $1) je zahteval opomnik vaših
podatkov o raÄunu na {{SITENAME}} ($4). S tem e-poÅ¡tnim naslovom
{{PLURAL:$3|je povezan naslednji uporabniÅ¡ki raÄun|sta povezana naslednja uporabniÅ¡ka raÄuna|so povezani naslednji uporabniÅ¡ki raÄuni}}:
@@ -722,7 +728,7 @@ Prijavite se in izberite novo geslo sedaj. ÄŒe je zahtevo podal
nekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga veÄ
ne želite spremeniti, lahko to sporoÄilo prezrete in nadaljujete z uporabo
svojega starega gesla.',
-'passwordreset-emailtext-user' => 'Uporabnik $1 na {{SITENAME}} je zahteval opomnik vaÅ¡ih podatkov o raÄunu na {{SITENAME}}
+'passwordreset-emailtext-user' => 'Uporabnik $1 na {{SITENAME}} je zahteval opomnik vaÅ¡ih podatkov o raÄunu na {{SITENAME}}
($4). S tem e-poÅ¡tnim naslovom {{PLURAL:$3|je povezan naslednji uporabniÅ¡ki raÄun|sta povezana naslednja uporabniÅ¡ka raÄuna|so povezani naslednji uporabniÅ¡ki raÄuni}}:
$2
@@ -732,9 +738,22 @@ Prijavite se in izberite novo geslo sedaj. ÄŒe je zahtevo podal
nekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga veÄ
ne želite spremeniti, lahko to sporoÄilo prezrete in nadaljujete z uporabo
svojega starega gesla.',
-'passwordreset-emailelement' => 'Uporabniško ime: $1
+'passwordreset-emailelement' => 'Uporabniško ime: $1
ZaÄasno geslo: $2',
-'passwordreset-emailsent' => 'Opomnilna e-pošta je bila poslana.',
+'passwordreset-emailsent' => 'Opomnilna e-pošta je bila poslana.',
+'passwordreset-emailsent-capture' => 'E-poštni opomnik je bil poslan in je prikazan spodaj.',
+'passwordreset-emailerror-capture' => 'E-poštni opomnik je bil poslan in je prikazan spodaj, vendar pa pošiljanje uporabniku ni uspelo: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Sprememba e-poštnega naslova',
+'changeemail-header' => 'Sprememba e-poÅ¡tnega naslova raÄuna',
+'changeemail-text' => 'Izpolnite obrazec za spremembo vašega e-poštnega naslova. Za potrditev spremembe boste morali vnesti svoje geslo.',
+'changeemail-no-info' => 'Za neposredni dostop do strani morate biti prijavljeni.',
+'changeemail-oldemail' => 'Trenutni e-poštni naslov:',
+'changeemail-newemail' => 'Novi e-poštni naslov:',
+'changeemail-none' => '(noben)',
+'changeemail-submit' => 'Spremeni e-pošto',
+'changeemail-cancel' => 'PrekliÄi',
# Edit page toolbar
'bold_sample' => 'Krepko besedilo',
@@ -803,9 +822,6 @@ Pomnite, da ne morete uporabljati funkcije »{{:MediaWiki:Emailuser}}«, dokler
VaÅ¡ trenutni IP-naslov je $3, ID blokiranja pa #$5. Prosimo, vkljuÄite ta ID v vsako zastavljeno vpraÅ¡anje.",
'blockednoreason' => 'razlog ni podan',
-'blockedoriginalsource' => "Izvorno besedilo strani '''$1''' je na razpolago spodaj:",
-'blockededitsource' => "Besedilo '''vaših urejanj''' v '''$1''' je prikazano spodaj:",
-'whitelistedittitle' => 'Za urejanje se morate prijaviti',
'whitelistedittext' => 'Za urejanje strani se morate $1.',
'confirmedittext' => 'Pred urejanjem strani morate potrditi svoj e-poštni naslov.
Prosimo, da ga z uporabo [[Special:Preferences|uporabniških nastavitev]] vpišete in potrdite.',
@@ -890,7 +906,7 @@ Poleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa
Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />
Poleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira (za podrobnosti glej $1).
'''Ne dodajajte avtorsko zaÅ¡Äitenega dela brez dovoljenja!'''",
-'longpageerror' => "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov|kilobajtov}}, s Äimer presega najveÄjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov|kilobajtov}}.'''
+'longpageerror' => "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov}}, s Äimer presega najveÄjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov}}.'''
Zato ga ni mogoÄe shraniti.",
'readonlywarning' => "'''Opozorilo: Zbirka podatkov je zaradi vzdrževanja zaÄasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti. Prosimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.'''
@@ -1056,8 +1072,6 @@ Do skrite vsebine bodo Å¡e vedno lahko dostopali drugi administratorji {{GRAMMAR
'revdelete-unsuppress' => 'Odpraviti omejitve na obnovljenih redakcijah.',
'revdelete-log' => 'Razlog:',
'revdelete-submit' => 'Uporabi za {{PLURAL:$1|izbrano redakcijo|izbrani redakciji|izbrane redakcije}}',
-'revdelete-logentry' => 'sprememba vidnosti redakcij strani [[$1]]',
-'logdelete-logentry' => 'je spremenil vidnost dogodka [[$1]]',
'revdelete-success' => "'''Vidnost redakcije je bila uspešno nastavljena.'''",
'revdelete-failure' => "'''Vidnost redakcije ni bilo mogoÄe nastaviti:'''
$1",
@@ -1069,15 +1083,6 @@ $1",
'revdel-restore-visible' => 'vidne redakcije',
'pagehist' => 'Zgodovina strani',
'deletedhist' => 'Zgodovina brisanja',
-'revdelete-content' => 'vsebino',
-'revdelete-summary' => 'povzetek urejanja',
-'revdelete-uname' => 'uporabniško ime',
-'revdelete-restricted' => 'uveljavljene omejitve administratorjev',
-'revdelete-unrestricted' => 'odstranjene omejitve administratorjev',
-'revdelete-hid' => 'skril $1',
-'revdelete-unhid' => 'prikazal $1',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|redakcijo|redakciji|redakcije|redakcij}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|dogodek|dogodka|dogodke|dogodkov}}',
'revdelete-hide-current' => 'Napaka pri skrivanju predmeta z dne $1, $2: gre za trenutno redakcijo.
Te ni mogoÄe skriti.',
'revdelete-show-no-access' => 'Napaka pri prikazovanju predmeta z dne $1, $2: predmet je bil oznaÄen kot »omejen«.
@@ -1237,12 +1242,14 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
'prefs-rc' => 'Zadnje spremembe',
'prefs-watchlist' => 'Spisek nadzorov',
'prefs-watchlist-days' => 'Å tevilo dni za prikaz na spisku nadzorov:',
-'prefs-watchlist-days-max' => 'NajveÄ 7 dni',
+'prefs-watchlist-days-max' => 'NajveÄ $1 {{PLURAL:$1|dan|dneva|dni}}',
'prefs-watchlist-edits' => 'Število urejanj za prikaz na razširjenem spisku nadzorov:',
'prefs-watchlist-edits-max' => 'NajveÄje Å¡tevilo: 1000',
'prefs-watchlist-token' => 'KljuÄ spiska nadzorov:',
'prefs-misc' => 'Druge nastavitve',
'prefs-resetpass' => 'Spremeni geslo',
+'prefs-changeemail' => 'Spremeni e-pošto',
+'prefs-setemail' => 'Nastavi e-poštni naslov',
'prefs-email' => 'Možnosti e-pošte',
'prefs-rendering' => 'Videz',
'saveprefs' => 'Shrani',
@@ -1303,6 +1310,7 @@ Tega ni mogoÄe razveljaviti.',
'yourrealname' => 'Pravo ime:',
'yourlanguage' => 'Jezik:',
'yourvariant' => 'Jezikovna razliÄica vsebine:',
+'prefs-help-variant' => 'VaÅ¡a prednostna razliÄica ali pravopis, v katerem naj bo prikazana vsebina strani tega wikija.',
'yournick' => 'Nov podpis:',
'prefs-help-signature' => 'Komentarje na pogovornih straneh je treba podpisati s »<nowiki>~~~~</nowiki>«, kar bo pretvorjeno v vaÅ¡ podpis s Äasovnim žigom.',
'badsig' => 'Neveljaven surovi podpis; preverite oznake HTML.',
@@ -1344,7 +1352,7 @@ Podatek bo javno prikazan.',
'userrights-lookup-user' => 'Upravljanje z uporabniškimi skupinami',
'userrights-user-editname' => 'Vpišite uporabniško ime:',
'editusergroup' => 'Uredi uporabniške skupine',
-'editinguser' => "Urejanje pravic uporabnika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Urejanje pravic uporabnika '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Urejanje uporabniških skupin',
'saveusergroups' => 'Shrani spremembe',
'userrights-groupsmember' => 'ÄŒlan skupine:',
@@ -1438,13 +1446,13 @@ Podatek bo javno prikazan.',
'right-autopatrol' => 'OznaÄevanje urejanj drugih za samodejno nadzarovana',
'right-patrolmarks' => 'Ogled oznak nadzorov v zadnjih spremembah',
'right-unwatchedpages' => 'Preglejte seznam ne spremljanih strani',
-'right-trackback' => 'Pošlje sledilnik',
'right-mergehistory' => 'Spoji zgodovino strani',
'right-userrights' => 'Urejanje vseh uporabniških pravic',
'right-userrights-interwiki' => 'Urejanje uporabniških pravic uporabnikov na drugih wikijih',
'right-siteadmin' => 'Zaklepanje in odklepanje baze podatkov',
'right-override-export-depth' => 'Izvoz strani, vkljuÄno s povezaimi straneh do globine 5',
'right-sendemail' => 'Pošiljanje e-pošte drugim uporabnikom',
+'right-passwordreset' => 'Ogled e-pošt ponastavitve gesel',
# User rights log
'rightslog' => 'Dnevnik uporabniških pravic',
@@ -1478,16 +1486,17 @@ Podatek bo javno prikazan.',
'action-suppressionlog' => 'vpogled tega zasebnega dnevnika',
'action-block' => 'blokiranje urejanja s tega uporabniÅ¡kega raÄuna',
'action-protect' => 'spremembo stopnje zaÅ¡Äite te strani',
+'action-rollback' => 'hitro vraÄanje urejanj zadnjega uporabnika, ki je urejal doloÄeno stran',
'action-import' => 'uvoz te strani iz drugega wikija',
'action-importupload' => 'uvoz strani iz naložene datoteke',
'action-patrol' => 'oznaÄevanje sprememb drugih kot nadzorovane',
'action-autopatrol' => 'oznaÄevanje svojih urejanj kot nadzorovane',
'action-unwatchedpages' => 'ogled seznama nenadzorovanih strani',
-'action-trackback' => 'pošlje sledilnik',
'action-mergehistory' => 'združitev zgodovine te strani',
'action-userrights' => 'upravljanje vseh uporabnikovih pravic',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
@@ -1519,6 +1528,7 @@ Podatek bo javno prikazan.',
'number_of_watching_users_pageview' => '[temo {{PLURAL:$1|spremlja|spremljata|spremljajo|spremlja|spremlja}} $1 {{PLURAL:$1|uporabnik|uporabnika|uporabniki|uporabnikov|uporabnikov}}]',
'rc_categories' => 'Omejitev na kategorije (loÄite jih z »|«)',
'rc_categories_any' => 'Katero koli',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajta|bajti|bajtov}} po spremembi',
'newsectionsummary' => '/* $1 */ nov razdelek',
'rc-enhanced-expand' => 'Pokaži podrobnosti (potrebuje JavaScript)',
'rc-enhanced-hide' => 'Skrij podrobnosti',
@@ -1572,6 +1582,7 @@ Za grafiÄni pogled obiÅ¡Äite [[Special:NewFiles|galerijo novih datotek]].',
'ignorewarnings' => 'Prezri vsa opozorila',
'minlength1' => 'Imena datotek morajo biti dolga vsaj eno Ärko.',
'illegalfilename' => 'Ime datoteke »$1« vsebuje v naslovih strani prepovedane znake. Prosimo, poskusite datoteko naložiti pod drugim imenom.',
+'filename-toolong' => 'Imena datotek ne smejo biti daljša od 240 bajtov.',
'badfilename' => 'Ime datoteke se je samodejno popravilo v »$1«.',
'filetype-mime-mismatch' => 'DatoteÄna konÄnica ».$1« se ne ujema z zaznano MIME-vrsto datoteke ($2).',
'filetype-badmime' => 'Datoteke MIME-vrste »$1« ni dovoljeno nalagati.',
@@ -1686,6 +1697,41 @@ Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
'upload-unknown-size' => 'Neznana velikost',
'upload-http-error' => 'Prišlo je do napake HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Ne morem pretakati datoteke $1.',
+'backend-fail-backup' => 'Ne morem varnostno kopirati datoteke $1.',
+'backend-fail-notexists' => 'Datoteka $1 ne obstaja.',
+'backend-fail-hashes' => 'Ne morem pridobiti zgoÅ¡Äene vrednosti za primerjavo.',
+'backend-fail-notsame' => 'RazliÄna datoteka že obstaja na $1.',
+'backend-fail-invalidpath' => '$1 ni veljavna skladiÅ¡Äna pot.',
+'backend-fail-delete' => 'Ne morem izbrisati datoteke $1.',
+'backend-fail-alreadyexists' => 'Datoteka $1 že obstaja.',
+'backend-fail-store' => 'Ne morem shraniti datoteke $1 na $2.',
+'backend-fail-copy' => 'Ne morem kopirati datoteke $1 na $2.',
+'backend-fail-move' => 'Ne morem prestaviti datoteke $1 na $2.',
+'backend-fail-opentemp' => 'Ne morem odpreti zaÄasne datoteke.',
+'backend-fail-writetemp' => 'Ne morem pisati v zaÄasno datoteko.',
+'backend-fail-closetemp' => 'Ne morem zapreti zaÄasne datoteke.',
+'backend-fail-read' => 'Ne morem brati datoteke $1.',
+'backend-fail-create' => 'Ne morem ustvariti datoteke $1.',
+'backend-fail-readonly' => 'SkladiÅ¡Äno zaledje »$1« je trenutno oznaÄeno samo za branje. Podan razlog je: »$2«',
+'backend-fail-synced' => 'Datoteka »$1« je v neskladnem stanju z notranjimi skladiÅ¡Änimi zaledji',
+'backend-fail-connect' => 'Ne morem se povezati s skladiÅ¡Änim zaledjem »$1«.',
+'backend-fail-internal' => 'V skladiÅ¡Änem zaledju »$1« je priÅ¡lo do neznane napake.',
+'backend-fail-contenttype' => 'Ne morem doloÄiti vrsto vsebine datoteke za shranjevanje pri »$1«.',
+'backend-fail-batchsize' => 'SkladiÅ¡Änemu zaledju je dana vrsta $1 {{PLURAL:$1|datoteÄne operacije|datoteÄnih operacij}}; omejitev {{PLURAL:$2|je $2 operacija|sta $2 operaciji|so $2 operacije|je $2 operacij}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ne morem odkleniti »$1«, saj ni zaklenjeno.',
+'lockmanager-fail-closelock' => 'Ne morem zapreti zaklenitvene datoteke »$1«.',
+'lockmanager-fail-deletelock' => 'Ne morem izbrisati zaklenitvene datoteke »$1«.',
+'lockmanager-fail-acquirelock' => 'Ne morem pridobiti zaklenitvene datoteke »$1«.',
+'lockmanager-fail-openlock' => 'Ne morem odpreti zaklenitvene datoteke »$1«.',
+'lockmanager-fail-releaselock' => 'Ne morem sprostiti zaklepa »$1«.',
+'lockmanager-fail-db-bucket' => 'Ne morem kontaktirati zadostnega Å¡tevila zaklenitvenih zbirk podatkov v vedru $1.',
+'lockmanager-fail-db-release' => 'Ne morem sprostiti zaklepov zbirke podatkov $1.',
+'lockmanager-fail-svr-release' => 'Ne morem sprostiti zaklepov strežnika $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Med odpiranjem datoteke za preverjanja ZIP je prišlo do napake.',
'zip-wrong-format' => 'Navedena datoteka ni bila datoteka ZIP.',
@@ -1702,6 +1748,7 @@ Ni mogoÄe ustrezno preveriti njene varnosti.',
'uploadstash-badtoken' => 'Izvedba dejanja ni bila uspešna, morda zaradi izteklih poverilnic za urejanje. Poskusite znova.',
'uploadstash-errclear' => 'ÄŒiÅ¡Äenje datotek ni bilo uspeÅ¡no.',
'uploadstash-refresh' => 'Osveži seznam datotek',
+'invalid-chunk-offset' => 'Neveljaven odmik delÄka',
# img_auth script messages
'img-auth-accessdenied' => 'Dostop zavrnjen',
@@ -1811,23 +1858,24 @@ Povzetek na njeni [$2 opisni strani datoteke] je prikazan spodaj.',
'filerevert-badversion' => 'Ne najdem preteklih lokalnih verzij datoteke s podanim Äasovnim žigom.',
# File deletion
-'filedelete' => 'Izbriši $1',
-'filedelete-legend' => 'Brisanje datoteke',
-'filedelete-intro' => "Brišete datoteko '''[[Media:$1|$1]]''' skupaj z njeno celotno zgodovino.",
-'filedelete-intro-old' => "BriÅ¡ete razliÄico datoteke '''[[Media:$1|$1]]''' z dne [$4 $3, $2].",
-'filedelete-comment' => 'Razlog:',
-'filedelete-submit' => 'Izbriši',
-'filedelete-success' => "Datoteka '''$1''' je bila izbrisana.",
-'filedelete-success-old' => "RazliÄica datoteke '''[[Media:$1|$1]]''', z dne $3, $2 je bila izbrisana.",
-'filedelete-nofile' => "Datoteka '''$1''' ne obstaja na tej strani.",
-'filedelete-nofile-old' => "Arhivirana razliÄica datoteke '''$1''' z doloÄenimi vrednostmi ne obstaja.",
-'filedelete-otherreason' => 'Drug/dodaten razlog:',
-'filedelete-reason-otherlist' => 'Drug razlog',
-'filedelete-reason-dropdown' => '* Pogosti razlogi brisanja
+'filedelete' => 'Izbriši $1',
+'filedelete-legend' => 'Brisanje datoteke',
+'filedelete-intro' => "Brišete datoteko '''[[Media:$1|$1]]''' skupaj z njeno celotno zgodovino.",
+'filedelete-intro-old' => "BriÅ¡ete razliÄico datoteke '''[[Media:$1|$1]]''' z dne [$4 $3, $2].",
+'filedelete-comment' => 'Razlog:',
+'filedelete-submit' => 'Izbriši',
+'filedelete-success' => "Datoteka '''$1''' je bila izbrisana.",
+'filedelete-success-old' => "RazliÄica datoteke '''[[Media:$1|$1]]''', z dne $3, $2 je bila izbrisana.",
+'filedelete-nofile' => "Datoteka '''$1''' ne obstaja na tej strani.",
+'filedelete-nofile-old' => "Arhivirana razliÄica datoteke '''$1''' z doloÄenimi vrednostmi ne obstaja.",
+'filedelete-otherreason' => 'Drug/dodaten razlog:',
+'filedelete-reason-otherlist' => 'Drug razlog',
+'filedelete-reason-dropdown' => '* Pogosti razlogi brisanja
** kršitev avtorskih pravic
** podvojena datoteka',
-'filedelete-edit-reasonlist' => 'Uredi razloge za brisanje',
-'filedelete-maintenance' => 'Brisanje in obnovitev datotek je zaÄasno onemogoÄeno zaradi vzdrževanja.',
+'filedelete-edit-reasonlist' => 'Uredi razloge za brisanje',
+'filedelete-maintenance' => 'Brisanje in obnovitev datotek je zaÄasno onemogoÄeno zaradi vzdrževanja.',
+'filedelete-maintenance-title' => 'Ne morem izbrisati datoteke',
# MIME search
'mimesearch' => 'Iskanje po vrsti MIME',
@@ -1927,6 +1975,8 @@ Sedaj je preusmeritev na [[$2]].',
'wantedpages' => 'Želene strani',
'wantedpages-badtitle' => 'Neveljaven naslov v konÄnem nizu: $1',
'wantedfiles' => 'Želene datoteke',
+'wantedfiletext-cat' => 'Naslednje datoteke so uporabljene, vendar ne obstajajo. Navedene so morda tudi datoteke iz zunanjih hramb, Äeprav obstajajo. Vsi takÅ¡ni lažni pozitivi bodo <del>preÄrtani</del>. Poleg tega so strani, ki vkljuÄujejo neobstojeÄe datoteke, navedene na [[:$1]].',
+'wantedfiletext-nocat' => 'Naslednje datoteke so uporabljene, vendar ne obstajajo. Navedene so morda tudi datoteke iz zunanjih hramb, Äeprav obstajajo. Vsi takÅ¡ni lažni pozitivi bodo <del>preÄrtani</del>.',
'wantedtemplates' => 'Želene predloge',
'mostlinked' => 'Strani, na katere se najveÄ povezuje',
'mostlinkedcategories' => 'Kategorije z najveÄ elementi',
@@ -1935,6 +1985,7 @@ Sedaj je preusmeritev na [[$2]].',
'mostimages' => 'Najbolj uporabljane datoteke',
'mostrevisions' => 'NajveÄkrat urejane strani',
'prefixindex' => 'Vse strani s predpono',
+'prefixindex-namespace' => 'Vse strani s predpono (imenski prostor $1)',
'shortpages' => 'Kratke strani',
'longpages' => 'Dolge strani',
'deadendpages' => 'ÄŒlanki brez delujoÄih povezav',
@@ -2044,12 +2095,8 @@ Podprti protokoli: <tt>$1</tt> (teh ne dodajte v svoje iskanje).',
'activeusers-noresult' => 'Noben uporabnik ni bil najden.',
# Special:Log/newusers
-'newuserlogpage' => 'Dnevnik registracij uporabnikov',
-'newuserlogpagetext' => 'Prikazan je dnevnik nedavnih registracij novih uporabnikov.',
-'newuserlog-byemail' => 'geslo je bilo poslano po e-pošti',
-'newuserlog-create-entry' => 'Nov uporabnik',
-'newuserlog-create2-entry' => 'je ustvaril(-a) raÄun »$1«',
-'newuserlog-autocreate-entry' => 'RaÄun ustvarjen samodejno',
+'newuserlogpage' => 'Dnevnik registracij uporabnikov',
+'newuserlogpagetext' => 'Prikazan je dnevnik nedavnih registracij novih uporabnikov.',
# Special:ListGroupRights
'listgrouprights' => 'Pravice uporabniških skupin',
@@ -2078,7 +2125,7 @@ Na voljo so morda [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]]
'emailpagetext' => 'S spodnjim obrazcem lahko uporabniku poÅ¡ljete e-poÅ¡tno sporoÄilo.
E-poÅ¡tni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniÅ¡kih nastavitvah]], bo v e-sporoÄilu naveden kot naslov »Od:«, tako da bo prejemnik lahko odgovoril neposredno vam.',
'usermailererror' => 'Predmet e-pošte je vrnil napako:',
-'defemailsubject' => 'Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}}',
+'defemailsubject' => 'Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}} od uporabnika »$1«',
'usermaildisabled' => 'UporabniÅ¡ka e-poÅ¡ta je onemogoÄena',
'usermaildisabledtext' => 'Na tem wikiju ne morete poslati e-pošte drugim uporabnikom',
'noemailtitle' => 'Ni e-poštnega naslova',
@@ -2132,7 +2179,7 @@ Morebitne spremembe te strani in pripadajoÄe pogovorne strani bodo navedene tuk
'watchmethod-list' => 'med spremljanimi stranmi iÅ¡Äem nedavna urejanja',
'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
'iteminvalidname' => 'Težava z izbiro »$1«, neveljavno ime ...',
-'wlnote' => "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} '''$1''' {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji '''$2''' uri|zadnjih '''$2''' urah}}.",
+'wlnote' => "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} '''$1''' {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji '''$2''' uri|zadnjih '''$2''' urah}}, od $3, $4.",
'wlshowlast' => 'Prikaži zadnjih $1 ur; $2 dni; $3;',
'watchlist-options' => 'Možnosti spiska nadzorov',
@@ -2198,8 +2245,6 @@ Prosimo, '''potrdite''', da to resniÄno želite, da razumete posledice dejanja
'actionfailed' => 'Dejanje spodletelo',
'deletedtext' => 'Stran »$1« je izbrisana.
Za zapise nedavnih brisanj glej $2.',
-'deletedarticle' => 'je izbrisal(-a) »[[$1]]«',
-'suppressedarticle' => 'skril »[[$1]]«',
'dellogpage' => 'Dnevnik brisanja',
'dellogpagetext' => 'Spodaj je prikazan seznam nedavnih brisanj.',
'deletionlog' => 'dnevnik brisanja',
@@ -2247,7 +2292,10 @@ Oglejte si [[Special:ProtectedPages|seznam zaÅ¡Äitenih strani]] za seznam trenu
'unprotectedarticle' => 'odstranil(-a) zaÅ¡Äito »[[$1]]«',
'movedarticleprotection' => 'nastavitve zaÅ¡Äite so prestavljene iz »[[$2]]« na »[[$1]]«',
'protect-title' => 'ZaÅ¡Äita strani »$1«',
+'protect-title-notallowed' => 'Ogled stopnje zaÅ¡Äite »$1«',
'prot_1movedto2' => 'je prestavil(-a) [[$1]] na [[$2]]',
+'protect-badnamespace-title' => 'NezaÅ¡Äitljiv imenski prostor',
+'protect-badnamespace-text' => 'Strani v tem imenskem prostoru ni mogoÄe zaÅ¡Äititi.',
'protect-legend' => 'Potrdite zaÅ¡Äito',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'PoteÄe:',
@@ -2269,6 +2317,7 @@ Stopnjo zaÅ¡Äite te strani lahko spremenite, vendar to ne bo vplivalo na kaskad
'protect-level-sysop' => 'Samo administratorji',
'protect-summary-cascade' => 'kaskadno',
'protect-expiring' => 'poteÄe $1 (UTC)',
+'protect-expiring-local' => 'poteÄe $1',
'protect-expiry-indefinite' => 'nedoloÄeno',
'protect-cascade' => 'ZaÅ¡Äiti strani, ki so vkljuÄene v to stran (kaskadna zaÅ¡Äita)',
'protect-cantedit' => 'Ne morete spreminjati stopnje zaÅ¡Äite te strani, ker nimate dovoljenja za njeno urejanje.',
@@ -2329,7 +2378,6 @@ Morda imate napaÄno povezavo ali pa je bila redakcija obnovljena ali odstranjen
'undeletereset' => 'Ponastavi',
'undeleteinvert' => 'Obrni izbor',
'undeletecomment' => 'Razlog:',
-'undeletedarticle' => 'je obnovil(-a) »$1«',
'undeletedrevisions' => '{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}',
'undeletedfiles' => '{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}',
@@ -2339,6 +2387,7 @@ morda je stran obnovil že kdo drug.',
Nedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].",
'undelete-header' => 'Glej [[Special:Log/delete|dnevnik brisanja]] za nedavno izbrisane strani.',
+'undelete-search-title' => 'Iskanje izbrisanih strani',
'undelete-search-box' => 'IÅ¡Äi izbrisane strani',
'undelete-search-prefix' => 'Prikaži strani, ki se zaÄnejo na:',
'undelete-search-submit' => 'Iskanje',
@@ -2348,6 +2397,7 @@ Nedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]
'undelete-cleanup-error' => 'Napaka pri brisanju neuporabljene arhivske datoteke »$1«.',
'undelete-missing-filearchive' => 'Ne morem obnoviti datoteke arhiva ID $1, ker ga ni v zbirki podatkov.
Morda je bil že obnovljen.',
+'undelete-error' => 'Napaka pri obnovi strani',
'undelete-error-short' => 'Napaka pri obnavljanju datoteke: $1',
'undelete-error-long' => 'Pri obnavljanju datoteke je prišlo do napak:
@@ -2469,6 +2519,7 @@ Oglejte si [[Special:BlockList|seznam blokiranih IP-naslovov]] za pregled blokad
'blocklist-userblocks' => 'Skrij blokade raÄunov',
'blocklist-tempblocks' => 'Skrij zaÄasne blokade',
'blocklist-addressblocks' => 'Skrij blokade enega IP-naslova',
+'blocklist-rangeblocks' => 'Skrij bloke obsegov',
'blocklist-timestamp' => 'Časovni žig',
'blocklist-target' => 'Cilj',
'blocklist-expiry' => 'PoteÄe',
@@ -2491,6 +2542,7 @@ Oglejte si [[Special:BlockList|seznam blokiranih IP-naslovov]] za pregled blokad
'unblocklink' => 'deblokiraj',
'change-blocklink' => 'spremeni blokado',
'contribslink' => 'prispevki',
+'emaillink' => 'pošljite e-pošto',
'autoblocker' => 'Urejanje vam je bilo samodejno onemogoÄeno, saj je vaÅ¡ IP-naslov pred kratkim uporabljal »[[User:$1|$1]]«.
Razlog za blokado uporabnika $1 je: »$2«',
'blocklogpage' => 'Dnevnik blokiranja',
@@ -2618,9 +2670,6 @@ Prosimo, združite ju roÄno.'''",
'movepage-page-moved' => 'Stran $1 je bila prestavljena na $2.',
'movepage-page-unmoved' => 'Strani $1 ni bilo mogoÄe prestaviti na $2.',
'movepage-max-pages' => '{{PLURAL:$1|Premaknjena je bila najveÄ $1 stran|Premaknjeni sta bili najveÄ $1 strani|Premaknjene so bile najveÄ $1 strani|Premaknjenih je bilo najveÄ $1 strani}} in nobena veÄ ne bo samodejno premaknjena.',
-'1movedto2' => 'je prestavil(-a) [[$1]] na [[$2]]',
-'1movedto2_redir' => 'je prestavil(-a) [[$1]] na [[$2]] Äez preusmeritev',
-'move-redirect-suppressed' => 'preusmeritev zatrta',
'movelogpage' => 'Dnevnik prestavljanja strani',
'movelogpagetext' => 'Prikazujem seznam prestavljenih strani.',
'movesubpage' => '{{PLURAL:$1|Podstran|Podstrani}}',
@@ -2633,7 +2682,7 @@ Prosimo, združite ju roÄno.'''",
Ciljna stran »[[:$1]]« že obstaja. Ali jo želite, da bi pripravili prostor za prestavitev, izbrisati?',
'delete_and_move_confirm' => 'Da, izbriši stran',
-'delete_and_move_reason' => 'Izbrisano z namenom pripraviti prostor za prestavitev',
+'delete_and_move_reason' => 'Izbrisano z namenom pripraviti prostor za »[[$1]]«',
'selfmove' => 'Izvirni in ciljni naslov sta enaka;
strani ni mogoÄe prestaviti samo vaÅ¡e.',
'immobile-source-namespace' => 'Ne morem premikati strani v imenskem prostoru »$1«',
@@ -2665,9 +2714,11 @@ To je mogoÄe uvoziti v drug wiki z uporabo MediaWiki preko [[Special:Import|str
ÄŒe gre za slednje, lahko uporabite tudi povezavo, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za
stran »[[{{MediaWiki:Mainpage}}]]«.',
+'exportall' => 'Izvoz vseh strani',
'exportcuronly' => 'VkljuÄi le trenutno redakcijo, ne pa celotne zgodovine.',
'exportnohistory' => "----
'''Opomba:''' Izvoz celotne zgodovine strani preko tega obrazca je zaradi preobremenjenosti strežnikov onemogoÄen.",
+'exportlistauthors' => 'VkljuÄi poln seznam sodelavcev za vsako stran',
'export-submit' => 'Izvozi',
'export-addcattext' => 'Dodaj strani iz kategorije:',
'export-addcat' => 'Dodaj',
@@ -2700,6 +2751,8 @@ Za lokalizacijo in prevajanje obiÅ¡Äite [//www.mediawiki.org/wiki/Localisation
'thumbnail_error' => 'Napaka pri izdelavi sliÄice: $1',
'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',
+'thumbnail-dest-create' => 'Ne morem shraniti sliÄice na ciljno mesto',
'thumbnail_invalid_params' => 'Neveljavni parametri za sliÄico',
'thumbnail_dest_directory' => 'Ne morem ustvariti ciljnega direktorija',
'thumbnail_image-type' => 'Vrsta slike ni podprta',
@@ -2748,6 +2801,11 @@ Manjka zaÄasna mapa.',
'import-token-mismatch' => 'Izguba podatkov o seji.
Prosimo, poskusite znova.',
'import-invalid-interwiki' => 'Uvoz iz navedenega wikija ni možen.',
+'import-error-edit' => 'Stran »$1« ni uvožena, ker vam ni dovoljeno, da jo urejate.',
+'import-error-create' => 'Stran »$1« ni uvožena, ker vam ni dovoljeno, da jo ustvarite.',
+'import-error-interwiki' => 'Strani »$1« nismo uvozili, ker je njeno ime rezervirano za zunanje povezovanje (interwiki).',
+'import-error-special' => 'Strani »$1« nismo uvozili, ker spada k posebnemu imenskemu prostoru, ki ne dovoljuje strani.',
+'import-error-invalid' => 'Strani »$1« nismo uvozili, ker njeno ime ni veljavno.',
# Import log
'importlogpage' => 'Dnevnik uvozov',
@@ -2757,73 +2815,86 @@ Prosimo, poskusite znova.',
'import-logentry-interwiki' => 'prenesel $1 med wikiji',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} uporabnika $2',
+# JavaScriptTest
+'javascripttest' => 'Preizkušanje JavaScripta',
+'javascripttest-disabled' => 'Funkcija je onemogoÄena.',
+'javascripttest-title' => 'Poganjanje $1 preizkusov',
+'javascripttest-pagetext-noframework' => 'Stran je rezervirana za poganjanje preizkusov JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Neznano ogrodje za preizkušanje »$1«.',
+'javascripttest-pagetext-frameworks' => 'Prosimo, izberite enega od naslednjih ogrodjev za preizkušanje: $1',
+'javascripttest-pagetext-skins' => 'Izberite kožo, v kateri želite pognati preizkuse:',
+'javascripttest-qunit-intro' => 'Oglejte si [$1 dokumentacijo o preizkušanju] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'Preizkuševalni paket MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Vaša uporabniška stran',
-'tooltip-pt-anonuserpage' => 'Uporabniška stran IP-naslova, ki ga uporabljate',
-'tooltip-pt-mytalk' => 'Vaša pogovorna stran',
-'tooltip-pt-anontalk' => 'Pogovor o urejanjih s tega IP-naslova',
-'tooltip-pt-preferences' => 'Vaše nastavitve',
-'tooltip-pt-watchlist' => 'Seznam strani, katerih spremembe spremljate',
-'tooltip-pt-mycontris' => 'Seznam vaših prispevkov',
-'tooltip-pt-login' => 'Prijava ni obvezna, vendar je zaželena',
-'tooltip-pt-anonlogin' => 'Prijava ni obvezna, vendar je zaželena',
-'tooltip-pt-logout' => 'Odjavite se',
-'tooltip-ca-talk' => 'Pogovor o strani',
-'tooltip-ca-edit' => 'Stran lahko uredite. Preden jo shranite, uporabite gumb za predogled.',
-'tooltip-ca-addsection' => 'ZaÄnite novo razpravo',
-'tooltip-ca-viewsource' => 'Stran je zaÅ¡Äitena, ogledate si lahko njeno izvorno kodo',
-'tooltip-ca-history' => 'Prejšnje redakcije strani',
-'tooltip-ca-protect' => 'ZaÅ¡Äitite stran',
-'tooltip-ca-unprotect' => 'Spremenite zaÅ¡Äito strani',
-'tooltip-ca-delete' => 'Brišite stran',
-'tooltip-ca-undelete' => 'Obnovite pred izbrisom napravljena urejanja strani.',
-'tooltip-ca-move' => 'Preimenujte stran',
-'tooltip-ca-watch' => 'Dodajte stran na seznam nadzorov',
-'tooltip-ca-unwatch' => 'Odstranite stran s seznama nadzorov',
-'tooltip-search' => 'PreiÅ¡Äite wiki',
-'tooltip-search-go' => 'Pojdi na strani z natanko takim imenom, Äe obstaja',
-'tooltip-search-fulltext' => 'Najde vneseno besedilo po straneh',
-'tooltip-p-logo' => 'Glavna stran',
-'tooltip-n-mainpage' => 'ObiÅ¡Äite Glavno stran',
-'tooltip-n-mainpage-description' => 'ObiÅ¡Äite glavno stran',
-'tooltip-n-portal' => 'O projektu, kaj lahko storite, kje lahko kaj najdete',
-'tooltip-n-currentevents' => 'Spoznajte ozadje trenutnih dogodkov',
-'tooltip-n-recentchanges' => 'Seznam zadnjih sprememb {{GRAMMAR:rodilnik|{{SITENAME}}}}',
-'tooltip-n-randompage' => 'Naložite nakljuÄno stran',
-'tooltip-n-help' => 'Kraj za pomoÄ',
-'tooltip-t-whatlinkshere' => 'Seznam vseh s trenutno povezanih strani',
-'tooltip-t-recentchangeslinked' => 'Zadnje spremembe na s trenutno povezanih straneh',
-'tooltip-feed-rss' => 'Dovod strani RSS',
-'tooltip-feed-atom' => 'Dovod strani Atom',
-'tooltip-t-contributions' => 'Preglejte seznam uporabnikovih prispevkov',
-'tooltip-t-emailuser' => 'Pošljite uporabniku e-pismo',
-'tooltip-t-upload' => 'Naložite slike ali predstavnostne datoteke',
-'tooltip-t-specialpages' => 'Preglejte seznam vseh posebnih strani',
-'tooltip-t-print' => 'Natisljiva razliÄica strani',
-'tooltip-t-permalink' => 'Stalna povezava na to razliÄico strani',
-'tooltip-ca-nstab-main' => 'Prikaže Älanek',
-'tooltip-ca-nstab-user' => 'Prikaže uporabniško stran',
-'tooltip-ca-nstab-media' => 'Prikaže stran s predstavnostno vsebino',
-'tooltip-ca-nstab-special' => 'Te posebne strani ne morete urejati',
-'tooltip-ca-nstab-project' => 'Prikaže stran projekta',
-'tooltip-ca-nstab-image' => 'Prikaže stran s sliko ali drugo datoteko',
-'tooltip-ca-nstab-mediawiki' => 'Prikaže sistemsko sporoÄilo',
-'tooltip-ca-nstab-template' => 'Prikaže stran predloge',
-'tooltip-ca-nstab-help' => 'Prikaže stran s pomoÄjo',
-'tooltip-ca-nstab-category' => 'Prikaže stran kategorije',
-'tooltip-minoredit' => 'OznaÄite kot manjÅ¡e urejanje',
-'tooltip-save' => 'Shranite vnesene spremembe (ste si jih predogledali?)',
-'tooltip-preview' => 'Pred shranjevanjem si, prosimo, predoglejte stran!',
-'tooltip-diff' => 'Preglejte spremembe, ki ste jih vnesli.',
-'tooltip-compareselectedversions' => 'Preglejte razlike med izbranima redakcijama.',
-'tooltip-watch' => 'Dodajte stran na svoj spisek nadzorov.',
-'tooltip-recreate' => 'Ponovno ustvari stran, Äeprav je bila izbrisana',
-'tooltip-upload' => 'PriÄnite z nalaganjem',
-'tooltip-rollback' => 'Funkcija »Vrni« z enim klikom povrne vsa urejanja zadnjega urejevalca te strani',
-'tooltip-undo' => '"Razveljavi" vrne to urejanje in odpre predogled v oknu za urejanje.
+'tooltip-pt-userpage' => 'Vaša uporabniška stran',
+'tooltip-pt-anonuserpage' => 'Uporabniška stran IP-naslova, ki ga uporabljate',
+'tooltip-pt-mytalk' => 'Vaša pogovorna stran',
+'tooltip-pt-anontalk' => 'Pogovor o urejanjih s tega IP-naslova',
+'tooltip-pt-preferences' => 'Vaše nastavitve',
+'tooltip-pt-watchlist' => 'Seznam strani, katerih spremembe spremljate',
+'tooltip-pt-mycontris' => 'Seznam vaših prispevkov',
+'tooltip-pt-login' => 'Prijava ni obvezna, vendar je zaželena',
+'tooltip-pt-anonlogin' => 'Prijava ni obvezna, vendar je zaželena',
+'tooltip-pt-logout' => 'Odjavite se',
+'tooltip-ca-talk' => 'Pogovor o strani',
+'tooltip-ca-edit' => 'Stran lahko uredite. Preden jo shranite, uporabite gumb za predogled.',
+'tooltip-ca-addsection' => 'ZaÄnite novo razpravo',
+'tooltip-ca-viewsource' => 'Stran je zaÅ¡Äitena, ogledate si lahko njeno izvorno kodo',
+'tooltip-ca-history' => 'Prejšnje redakcije strani',
+'tooltip-ca-protect' => 'ZaÅ¡Äitite stran',
+'tooltip-ca-unprotect' => 'Spremenite zaÅ¡Äito strani',
+'tooltip-ca-delete' => 'Brišite stran',
+'tooltip-ca-undelete' => 'Obnovite pred izbrisom napravljena urejanja strani.',
+'tooltip-ca-move' => 'Preimenujte stran',
+'tooltip-ca-watch' => 'Dodajte stran na seznam nadzorov',
+'tooltip-ca-unwatch' => 'Odstranite stran s seznama nadzorov',
+'tooltip-search' => 'PreiÅ¡Äite wiki',
+'tooltip-search-go' => 'Pojdi na strani z natanko takim imenom, Äe obstaja',
+'tooltip-search-fulltext' => 'Najde vneseno besedilo po straneh',
+'tooltip-p-logo' => 'Glavna stran',
+'tooltip-n-mainpage' => 'ObiÅ¡Äite Glavno stran',
+'tooltip-n-mainpage-description' => 'ObiÅ¡Äite glavno stran',
+'tooltip-n-portal' => 'O projektu, kaj lahko storite, kje lahko kaj najdete',
+'tooltip-n-currentevents' => 'Spoznajte ozadje trenutnih dogodkov',
+'tooltip-n-recentchanges' => 'Seznam zadnjih sprememb {{GRAMMAR:rodilnik|{{SITENAME}}}}',
+'tooltip-n-randompage' => 'Naložite nakljuÄno stran',
+'tooltip-n-help' => 'Kraj za pomoÄ',
+'tooltip-t-whatlinkshere' => 'Seznam vseh s trenutno povezanih strani',
+'tooltip-t-recentchangeslinked' => 'Zadnje spremembe na s trenutno povezanih straneh',
+'tooltip-feed-rss' => 'Dovod strani RSS',
+'tooltip-feed-atom' => 'Dovod strani Atom',
+'tooltip-t-contributions' => 'Preglejte seznam uporabnikovih prispevkov',
+'tooltip-t-emailuser' => 'Pošljite uporabniku e-pismo',
+'tooltip-t-upload' => 'Naložite slike ali predstavnostne datoteke',
+'tooltip-t-specialpages' => 'Preglejte seznam vseh posebnih strani',
+'tooltip-t-print' => 'Natisljiva razliÄica strani',
+'tooltip-t-permalink' => 'Stalna povezava na to razliÄico strani',
+'tooltip-ca-nstab-main' => 'Prikaže Älanek',
+'tooltip-ca-nstab-user' => 'Prikaže uporabniško stran',
+'tooltip-ca-nstab-media' => 'Prikaže stran s predstavnostno vsebino',
+'tooltip-ca-nstab-special' => 'Te posebne strani ne morete urejati',
+'tooltip-ca-nstab-project' => 'Prikaže stran projekta',
+'tooltip-ca-nstab-image' => 'Prikaže stran s sliko ali drugo datoteko',
+'tooltip-ca-nstab-mediawiki' => 'Prikaže sistemsko sporoÄilo',
+'tooltip-ca-nstab-template' => 'Prikaže stran predloge',
+'tooltip-ca-nstab-help' => 'Prikaže stran s pomoÄjo',
+'tooltip-ca-nstab-category' => 'Prikaže stran kategorije',
+'tooltip-minoredit' => 'OznaÄite kot manjÅ¡e urejanje',
+'tooltip-save' => 'Shranite vnesene spremembe (ste si jih predogledali?)',
+'tooltip-preview' => 'Pred shranjevanjem si, prosimo, predoglejte stran!',
+'tooltip-diff' => 'Preglejte spremembe, ki ste jih vnesli.',
+'tooltip-compareselectedversions' => 'Preglejte razlike med izbranima redakcijama.',
+'tooltip-watch' => 'Dodajte stran na svoj spisek nadzorov.',
+'tooltip-watchlistedit-normal-submit' => 'Odstrani naslove',
+'tooltip-watchlistedit-raw-submit' => 'Posodobi spisek nadzorov',
+'tooltip-recreate' => 'Ponovno ustvari stran, Äeprav je bila izbrisana',
+'tooltip-upload' => 'PriÄnite z nalaganjem',
+'tooltip-rollback' => 'Funkcija »Vrni« z enim klikom povrne vsa urejanja zadnjega urejevalca te strani',
+'tooltip-undo' => '"Razveljavi" vrne to urejanje in odpre predogled v oknu za urejanje.
OmogoÄa vnos pojasnila v povzetku urejanja.',
-'tooltip-preferences-save' => 'Shrani nastavitve',
-'tooltip-summary' => 'Vnesite kratek povzetek',
+'tooltip-preferences-save' => 'Shrani nastavitve',
+'tooltip-summary' => 'Vnesite kratek povzetek',
# Metadata
'notacceptable' => 'V obliki, ki jo lahko bere vaš odjemalec, wikistrežnik podatkov ne more ponuditi.',
@@ -2875,9 +2946,6 @@ OmogoÄa vnos pojasnila v povzetku urejanja.',
# Patrol log
'patrol-log-page' => 'Dnevnik patrulje',
'patrol-log-header' => 'To je dnevnik nadzorovanih redakcij.',
-'patrol-log-line' => 'je oznaÄil $1 strani $2 kot preverjeno urejanje $3',
-'patrol-log-auto' => '(samodejno)',
-'patrol-log-diff' => 'redakcija $1',
'log-show-hide-patrol' => '$1 dnevnik nadzora',
# Image deletion
@@ -2905,11 +2973,11 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
'file-info' => 'Velikost datoteke: $1, MIME-vrsta: <code>$2</code>',
'file-info-size' => '$1 × $2 toÄk, velikost datoteke: $3, vrsta MIME: $4',
'file-info-size-pages' => '$1 × $2 toÄk, velikost datoteke: $3, vrsta MIME: $4, $5 {{PLURAL:$5|stran|strani}}',
-'file-nohires' => '<small>Slika viÅ¡je loÄljivosti ni na voljo.</small>',
+'file-nohires' => 'Slika viÅ¡je loÄljivosti ni na voljo.',
'svg-long-desc' => 'datoteka SVG, v izvirniku $1 × $2 slikovnih toÄk, velikost datoteke: $3',
'show-big-image' => 'Slika v viÅ¡ji loÄljivosti',
-'show-big-image-preview' => '<small>Velikost predogleda: $1.</small>',
-'show-big-image-other' => '<small>Druge loÄljivosti: $1.</small>',
+'show-big-image-preview' => 'Velikost predogleda: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga resolucija|Drugi resoluciji|Druge resolucije}}: $1.',
'show-big-image-size' => '$1 × $2 toÄk',
'file-info-gif-looped' => 'ponavljajoÄe',
'file-info-gif-frames' => '$1 {{PLURAL:$1|sliÄica|sliÄici|sliÄice|sliÄic}}',
@@ -2930,7 +2998,16 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
'sp-newimages-showfrom' => 'Prikaži datoteke, naložene od $2, $1 naprej',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2&nbsp;×&nbsp;$3',
+'video-dims' => '$1, $2&nbsp;×&nbsp;$3',
+'seconds-abbrev' => '$1 s',
+'minutes-abbrev' => '$1 m',
+'hours-abbrev' => '$1 h',
+'days-abbrev' => '$1 d',
+'seconds' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
+'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
+'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'ago' => 'pred $1',
# Bad image list
'bad_image_list' => 'Oblika je naslednja:
@@ -3433,13 +3510,6 @@ Potrditvena koda poteÄe $4.',
'scarytranscludefailed' => '[Pridobivanje predloge za $1 ni uspelo]',
'scarytranscludetoolong' => '[Spletni naslov je predolg]',
-# Trackbacks
-'trackbackbox' => 'Sledilniki Älanka:<br />
-$1',
-'trackbackremove' => '([$1 Izbris])',
-'trackbacklink' => 'Sledilnik',
-'trackbackdeleteok' => 'Sledilnik je uspešno izbrisan.',
-
# Delete conflict
'deletedwhileediting' => "'''Opozorilo''': Med vašim urejanjem je bila stran izbrisana!",
'confirmrecreate' => "Medtem ko ste stran urejali, jo je uporabnik [[User:$1|$1]] ([[User talk:$1|pogovor]]) izbrisal z razlogom:
@@ -3523,6 +3593,9 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
'watchlisttools-edit' => 'Poglej in uredi spisek nadzorov',
'watchlisttools-raw' => 'Uredi gol spisek nadzorov',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pogovor]])',
+
# Core parser functions
'unknown_extension_tag' => 'Neznana razširitvena etiketa »$1«',
'duplicate-defaultsort' => "'''Opozorilo:''' Privzeti kljuÄ razvrÅ¡Äanja »$2« prepiÅ¡e prejÅ¡nji privzeti kljuÄ razvrÅ¡Äanja »$1«.",
@@ -3623,13 +3696,16 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
'tags-hitcount' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
# Special:ComparePages
-'comparepages' => 'Primerjaj strani',
-'compare-selector' => 'Primerjaj redakcije strani',
-'compare-page1' => 'Stran 1',
-'compare-page2' => 'Stran 2',
-'compare-rev1' => 'Redakcija 1',
-'compare-rev2' => 'Redakcija 2',
-'compare-submit' => 'Primerjaj',
+'comparepages' => 'Primerjaj strani',
+'compare-selector' => 'Primerjaj redakcije strani',
+'compare-page1' => 'Stran 1',
+'compare-page2' => 'Stran 2',
+'compare-rev1' => 'Redakcija 1',
+'compare-rev2' => 'Redakcija 2',
+'compare-submit' => 'Primerjaj',
+'compare-invalid-title' => 'Navedeni naslov ni veljaven.',
+'compare-title-not-exists' => 'Navedeni naslov ne obstaja.',
+'compare-revision-not-exists' => 'Navedena redakcija ne obstaja.',
# Database error messages
'dberr-header' => 'Ta wiki ima težavo',
@@ -3657,4 +3733,90 @@ Ta stran se sooÄa s tehniÄnimi težavami.',
'sqlite-has-fts' => '$1 s podporo iskanju polnih besedil',
'sqlite-no-fts' => '$1 brez podpore iskanju polnih besedil',
+# New logging system
+'logentry-delete-delete' => '$1 je izbrisal(-a) stran $3',
+'logentry-delete-restore' => '$1 je obnovil(-a) stran $3',
+'logentry-delete-event' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-delete-revision' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-delete-event-legacy' => '$1 je spremenil(-a) vidljivost dnevniških dogodkov na $3',
+'logentry-delete-revision-legacy' => '$1 je spremenil(-a) vidljivost redakcij na strani $3',
+'logentry-suppress-delete' => '$1 je zatrl(-a) stran $3',
+'logentry-suppress-event' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-suppress-revision' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-suppress-event-legacy' => '$1 je skrivaj spremenil(-a) vidljivost dnevniških dogodkov na $3',
+'logentry-suppress-revision-legacy' => '$1 je skrivaj spremenil(-a) vidljivost redakcij na strani $3',
+'revdelete-content-hid' => 'vsebina je skrita',
+'revdelete-summary-hid' => 'povzetek urejanja je skrit',
+'revdelete-uname-hid' => 'uporabniško ime je skrito',
+'revdelete-content-unhid' => 'vsebina je ponovno prikazana',
+'revdelete-summary-unhid' => 'povzetek urejanja je ponovno prikazan',
+'revdelete-uname-unhid' => 'uporabniško ime je ponovno prikazano',
+'revdelete-restricted' => 'uveljavljene omejitve administratorjev',
+'revdelete-unrestricted' => 'odstranjene omejitve administratorjev',
+'logentry-move-move' => '$1 je premaknil(-a) stran $3 na $4',
+'logentry-move-move-noredirect' => '$1 je premaknil(-a) stran $3 na $4 brez preusmeritve',
+'logentry-move-move_redir' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve',
+'logentry-move-move_redir-noredirect' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve in brez preusmeritve',
+'logentry-patrol-patrol' => '$1 je oznaÄil(-a) redakcijo $4 strani $3 kot nadzorovano',
+'logentry-patrol-patrol-auto' => '$1 je samodejno oznaÄil(-a) redakcijo $4 strani $3 kot nadzorovano',
+'logentry-newusers-newusers' => '$1 je ustvaril(-a) uporabniÅ¡ki raÄun',
+'logentry-newusers-create' => '$1 je ustvaril(-a) uporabniÅ¡ki raÄun',
+'logentry-newusers-create2' => '$1 je ustvaril(-a) uporabniÅ¡ki raÄun $3',
+'logentry-newusers-autocreate' => 'RaÄun $1 je bil samodejno ustvarjen',
+'newuserlog-byemail' => 'geslo je bilo poslano po e-pošti',
+
+# Feedback
+'feedback-bugornote' => 'ÄŒe ste pripravljeni podrobno opisati tehniÄno težavo, vložite [$1 poroÄilo o hroÅ¡Äu].
+V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bomo dodali na stran »[$3 $2]«, skupaj z vašim uporabniškim imenom in podatkom o brskalniku, ki ga uporabljate.',
+'feedback-subject' => 'Zadeva:',
+'feedback-message' => 'SporoÄilo:',
+'feedback-cancel' => 'PrekliÄi',
+'feedback-submit' => 'Pošlji povratno informacijo',
+'feedback-adding' => 'Dodajanje povratne informacije na stran ...',
+'feedback-error1' => 'Napaka: Neznan rezultat iz API',
+'feedback-error2' => 'Napaka: Urejanje je spodletelo',
+'feedback-error3' => 'Napaka: Ni odgovora od API',
+'feedback-thanks' => 'Havala! Vaše povratne informacije smo objavili na strani »[$2 $1]«.',
+'feedback-close' => 'KonÄano',
+'feedback-bugcheck' => 'Izvrstno! Samo preverite, da ne gre za enega od [$1 že znanih hroÅ¡Äev].',
+'feedback-bugnew' => 'Sem preveril. Prijavi nov hroÅ¡Ä',
+
+# API errors
+'api-error-badaccess-groups' => 'Nalaganje datotek na ta wiki vam ni dovoljeno.',
+'api-error-badtoken' => 'Notranja napaka: slab žeton.',
+'api-error-copyuploaddisabled' => 'Nalaganje preko URL je na tem strežniku onemogoÄeno.',
+'api-error-duplicate' => 'Na strani že {{PLURAL:$1|obstaja [$2 druga datoteka]|obstajata [$2 drugi datoteki]|obstajajo [$2 druge datoteke]|obstaja [$2 drugih datotek]}} z enako vsebino',
+'api-error-duplicate-archive' => 'Na strani {{PLURAL:$1|je že bila [$2 druga datoteka]|sta že bili [$2 drugi datoteki]|so že bile [$2 nekatere druge datoteke]}} z enako vsebino, vendar {{PLURAL:$1|je bila izbrisana|sta bili izbrisani|so bile izbrisane}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Podvojena datoteka, ki je že bila izbrisana|Podvojeni datoteki, ki sta že bili izbrisani|Podvojene datoteke, ki so že bile izbrisane}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Podvojena datoteka|Podvojeni datoteki|Podvojene datoteke}}',
+'api-error-empty-file' => 'Poslana datoteka je prazna.',
+'api-error-emptypage' => 'Ustvarjanje novih, praznih strani ni dovoljeno.',
+'api-error-fetchfileerror' => 'Notranja napaka: pri pridobivanju datoteke je nekaj Å¡lo narobe.',
+'api-error-file-too-large' => 'Poslana datoteka je prevelika.',
+'api-error-filename-tooshort' => 'Ime datoteke je prekratko.',
+'api-error-filetype-banned' => 'Ta vrsta datoteke je prepovedana.',
+'api-error-filetype-missing' => 'Datoteki manjka konÄnica.',
+'api-error-hookaborted' => 'Spremembo, ki ste jo poskušali narediti, je prekinila razširitev.',
+'api-error-http' => 'Notranja napaka: ni mogoÄe vzpostaviti povezave s strežnikom.',
+'api-error-illegal-filename' => 'Ime datoteke ni dovoljeno.',
+'api-error-internal-error' => 'Notranja napaka: pri obdelovanju vaše datoteke, naložene na wiki, je nekaj šlo narobe.',
+'api-error-invalid-file-key' => 'Notranja napaka: datoteke ni bilo mogoÄe najti v zaÄasni hrambi.',
+'api-error-missingparam' => 'Notranja napaka: manjkajoÄi parametri ob zahtevi.',
+'api-error-missingresult' => 'Notranja napaka: ni bilo mogoÄe doloÄiti, Äe je kopiranje uspelo.',
+'api-error-mustbeloggedin' => 'Za nalaganje datotek morate biti prijavljeni.',
+'api-error-mustbeposted' => 'V tem programju je hroÅ¡Ä; ne uporablja pravilne metode HTTP.',
+'api-error-noimageinfo' => 'Nalaganje je uspelo, vendar nam strežnik ni dal nobenih informacij o datoteki.',
+'api-error-nomodule' => 'Notranja napaka: modul nalaganja ni izbran.',
+'api-error-ok-but-empty' => 'Notranja napaka: strežnik se ne odziva.',
+'api-error-overwrite' => 'Prepisovanje obstojeÄe datoteke ni dovoljeno.',
+'api-error-stashfailed' => 'Notranja napaka: strežnik ni uspel shraniti zaÄasne datoteke.',
+'api-error-timeout' => 'Strežnik se ni odzval v priÄakovanem Äasu.',
+'api-error-unclassified' => 'Prišlo je do neznane napake',
+'api-error-unknown-code' => 'Neznana napaka: »$1«',
+'api-error-unknown-error' => 'Notranja napaka: pri poskusu nalaganja vaše datoteke je nekaj šlo narobe.',
+'api-error-unknown-warning' => 'Neznano opozorilo: $1',
+'api-error-unknownerror' => 'Neznana napaka: »$1«.',
+'api-error-uploaddisabled' => 'Nalaganje je onemogoÄeno na tem wikiju.',
+'api-error-verification-error' => 'Ta datoteka je morda poÅ¡kodovana ali ima napaÄno konÄnico.',
+
);
diff --git a/languages/messages/MessagesSli.php b/languages/messages/MessagesSli.php
index 73ef6f3a..37079bc1 100644
--- a/languages/messages/MessagesSli.php
+++ b/languages/messages/MessagesSli.php
@@ -10,6 +10,7 @@
* @author Als-Holder
* @author Jens Liebenau
* @author Jonny84
+ * @author Kaganer
* @author Piotron
* @author Przemub
* @author Purodha
@@ -332,14 +333,13 @@ Falls dies nicht zutrifft, hast du eventuell einen Fehler in der Software gefun
Meeglicherweise wurde se bereits vu jemand anders entfernt.',
'badtitle' => 'Ungültiger Tittel',
'badtitletext' => 'Dar Tittel dar oagefurderta Seite ies ungieltig, laar oder a ungieltiger Sproachlink voo eenem andern Wiki.',
-'perfcached' => 'De folgenden Daten stomma oaus damm Cache und sein meegliecherweise nee aktuell:',
-'perfcachedts' => 'Diese Daten stomma oaus damm Cache, letztes Update: $1',
+'perfcached' => 'De folgenden Daten stomma oaus damm Cache und sein meegliecherweise nee aktuell. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Diese Daten stomma oaus damm Cache, letztes Update: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "'''De Aktualisierungsfunktion fier diese Seite ies zurzeit deaktiviert. De Daten waan bis uff Weiteres nee erneuert.'''",
'wrong_wfQuery_params' => 'Foalsche Parameter fier wfQuery()<br />
Funksjonn: $1<br />
Abfroage: $2',
'viewsource' => 'Quelltext oasahn',
-'viewsourcefor' => 'fier $1',
'actionthrottled' => 'Aksjonszoahl limmetiert',
'actionthrottledtext' => 'Du host diese Aksjonn zu uffte innerholb annes korza Zeitraums ausgeführt. Bitte woarte a poar Minuta und probiere is doann erneut.',
'protectedpagetext' => 'Diese Seite ies fier doas Bearbta gesperrt.',
@@ -524,9 +524,6 @@ Du koast de „E-Mail oa diesa Nutzer“-Funksjonn ne nutza, sulange keene gilti
Denne aktuelle IP-Atresse ies $3, und de Sperr-ID ies $5.
Bitte fiege olle Informationen jeder Oafroage hinzu, de du stallt.",
'blockednoreason' => 'keene Begründung oagegahn',
-'blockedoriginalsource' => "Dar Quelltext vu '''$1''' werd hier oagezeigt:",
-'blockededitsource' => "Dar Quelltext '''denner Änderunga''' oa '''$1''':",
-'whitelistedittitle' => "Zum Bearbta ies 's erforderlich, oagemeldet zu sei",
'whitelistedittext' => 'Du muoßt diech $1, im Seita bearbta zu kinna.',
'confirmedittext' => 'Du mußt denne E-Mail-Atresse erscht bestätiga, bevor du Beoarbeetunga durchfiehrn koast. Bitte ergänze und bestätige Denne E-Mail ei dann [[Special:Preferences|Eenstallunga]].',
'nosuchsectiontitle' => 'Obschnitt ne vurhanda',
@@ -710,8 +707,6 @@ Andere Administratoren uff {{SITENAME}} hoan Zugriff uff dann versteckta Inhalt
'revdelete-unsuppress' => 'Einschränkungen fier wiederhergestallte Versionn uffhebn',
'revdelete-log' => 'Begriendung:',
'revdelete-submit' => 'Uff ausgewählte {{PLURAL:$1|Version|Versiona}} oawenda',
-'revdelete-logentry' => 'hoot de Versionsansicht fier „[[$1]]“ geändert',
-'logdelete-logentry' => 'hoot de Sichtbarkeit fier „[[$1]]“ geändert',
'revdelete-success' => "'''De Versionsoasicht wurde aktualisiert.'''",
'revdelete-failure' => "'''De Versionssichtbarkeit konnte ne aktualisiert waan:'''
$1",
@@ -722,14 +717,6 @@ $1",
'revdel-restore-deleted' => 'gelöschte Versionen',
'revdel-restore-visible' => 'sichtbare Versionen',
'deletedhist' => 'Geläschte Versiona',
-'revdelete-content' => 'Seytainhoalt',
-'revdelete-summary' => 'Zusommafoassungskommentar',
-'revdelete-uname' => 'Benutzernoame',
-'revdelete-restricted' => 'Einschränkungen gelten au fier Administratorn',
-'revdelete-unrestricted' => 'Einschränkungen fier Administratorn uffgehobn',
-'revdelete-unhid' => 'machte $1 wieder effentlich',
-'revdelete-log-message' => '$1 fier $2 {{PLURAL:$2|Version|Versiona}}',
-'logdelete-log-message' => '$1 fier $2 {{PLURAL:$2|Logbucheintrag|Logbucheinträge}}',
'revdelete-modify-missing' => "Fahler beim Bearbta vu ID $1: 'S fahlt ei der Datenbank!",
'revdelete-no-change' => "'''Warnung:''' Dar Eentrag vum $1, $2 Seeger besitzt bereits de gewüischta Sichtbarkeitseenstallunga.",
'revdelete-otherreason' => 'Andere/zusätzliche Begriendung:',
@@ -973,7 +960,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'right-autopatrol' => 'Eegene Beoarbeetunga automatisch ols kontrolliert markieren',
'right-patrolmarks' => 'Kontrollmarkierungen enn letzta Änderunga sahn',
'right-unwatchedpages' => 'Liste dar unbeobachteten Seyta oasahn',
-'right-trackback' => 'Trackback iebermitteln',
'right-mergehistory' => 'Versionsgeschichten vu Seyta vereinen',
'right-userrights' => 'Nutzerrechte bearbta',
'right-userrights-interwiki' => 'Nutzerrechte ei andern Wikis bearbta',
@@ -1014,7 +1000,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'action-patrol' => 'de Beoarbeetunga andere Nutzer zu kontrollieren',
'action-autopatrol' => 'eegene Beoarbeetunga ols kontrolliert zu markieren',
'action-unwatchedpages' => 'de Liste dar unbeobachteten Seyta einzusahn',
-'action-trackback' => "an'n Trackback zu iebertraga",
'action-mergehistory' => 'de Versionengeschichta vu Seyta zu vereinen',
'action-userrights' => 'Nutzerrechte zu ändern',
'action-userrights-interwiki' => 'de Rechte vu Nutzern ei andern Wikis zu ändern',
@@ -1309,7 +1294,7 @@ Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Zie
'listusers-editsonly' => 'Zeige ock Nutzer miet Beiträga',
'listusers-creationsort' => 'Noach Erstelldatum sortiera',
'usereditcount' => '$1 {{PLURAL:$1|Beoarbeetung|Beoarbeetunga}}',
-'usercreated' => 'Erstallt oam $1 im $2 Seeger',
+'usercreated' => '{{GENDER:$3|Erstallt}} oam $1 im $2 Seeger',
'newpages' => 'Neue Seyta',
'newpages-username' => 'Benutzernoame:',
'ancientpages' => 'Seit längerem unbeoarbeetete Seyta',
@@ -1385,12 +1370,8 @@ Siehe au de Liste der [[Special:WantedCategories|gewinschta Kategorien]].',
'activeusers-noresult' => 'Kenne Benutzer gefunda.',
# Special:Log/newusers
-'newuserlogpage' => 'Neuoameldungs-Logbuch',
-'newuserlogpagetext' => 'Dies ies a Logbuch fier neu erstellte Nutzerkonten.',
-'newuserlog-byemail' => 'doas Passwurt wourde per E-Mail versandt',
-'newuserlog-create-entry' => 'Nutzer wourde neu registriert',
-'newuserlog-create2-entry' => 'erstallte neues Nutzerkonto „$1“',
-'newuserlog-autocreate-entry' => 'Nutzerkonto wurde automatisch erstallt',
+'newuserlogpage' => 'Neuoameldungs-Logbuch',
+'newuserlogpagetext' => 'Dies ies a Logbuch fier neu erstellte Nutzerkonten.',
# Special:ListGroupRights
'listgrouprights' => 'Nutzergruppen-Rechte',
@@ -1505,8 +1486,6 @@ Rickmeldungen und wettere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
'actioncomplete' => 'Aksjonn beendet',
'actionfailed' => 'Aksjonn fahlgeschlaga',
'deletedtext' => '„$1“ wurde geläscht. Eim $2 findest du eene Liste dar letzta Läschunga.',
-'deletedarticle' => 'hoot „[[$1]]“ geläscht',
-'suppressedarticle' => 'veränderte de Sechtbarkeet vu „[[$1]]“',
'dellogpage' => 'Läsch-Logbuch',
'dellogpagetext' => 'Dies ies doas Logbuch dar geläschta Seyta und Dateien.',
'deletionlog' => 'Läsch-Logbuch',
@@ -1612,7 +1591,6 @@ Der aktuelle Text der geläschta Seite ies ock Administratoren zugänglich.',
'undeleteviewlink' => 'oasahn',
'undeleteinvert' => 'Auswoahl umkehra',
'undeletecomment' => 'Begrindung:',
-'undeletedarticle' => 'hoot „[[$1]]“ wiederhergestellt',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestallt',
'cannotundelete' => 'Wiederherstellung fehlgeschlaga; jemand anderes hoot de Seite bereits wiederhergestellt.',
'undelete-header' => 'Siehe eim [[Special:Log/delete|Läsch-Logbuch]] noach kierzlich geläschta Seyta.',
@@ -1819,9 +1797,6 @@ Bitte den '''neua''' Tittel under '''Ziel''' eintraga, darunder de Umbenennung b
'movepage-page-moved' => 'De Seite „$1“ wurde noach „$2“ verschoba.',
'movepage-page-unmoved' => 'De Seite „$1“ konnte nee noach „$2“ verschoba waan.',
'movepage-max-pages' => 'De Maximalanzoahl vu $1 {{PLURAL:$1|Seite|Seita}} wurde verschuba, Olle wettera Seita kinna ne automatisch verschuba waan.',
-'1movedto2' => 'hoot „[[$1]]“ noach „[[$2]]“ verschoba',
-'1movedto2_redir' => 'hoot „[[$1]]“ noach „[[$2]]“ verschoba on dabei eene Weiterleitung ieberschrieba',
-'move-redirect-suppressed' => 'Weiterleitung underdrickt',
'movelogpage' => 'Verschiebungs-Logbuch',
'movelogpagetext' => 'Dies ies anne Liste oller verschobena Seyta.',
'movesubpage' => '{{PLURAL:$1|Underseite|Underseita}}',
@@ -2019,7 +1994,6 @@ Olle Transwiki-Import-Aksjonna waan eim [[Special:Log/import|Import-Logbuch]] pr
# Patrol log
'patrol-log-page' => 'Kontroll-Logbichl',
'patrol-log-header' => 'Dies ies doas Kontroll-Logbuch.',
-'patrol-log-line' => 'hoot $1 vu „$2“ ols kontrolliert markiert $3',
'log-show-hide-patrol' => 'Kontroll-Logbichl $1',
# Image deletion
@@ -2045,7 +2019,7 @@ Durch doas Herunderloada und Effna dar Datei koan dei Computer beschädigt waan.
'widthheightpage' => '$1 × $2, {{PLURAL:$3|1 Seite|$3 Seita}}',
'file-info' => 'Dateigreeße: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 Pixel, Dateigreeße: $3, MIME-Typ: $4',
-'file-nohires' => '<small>Kenne hiehere Uffleesung vurhanda.</small>',
+'file-nohires' => 'Kenne hiehere Uffleesung vurhanda.',
'svg-long-desc' => 'SVG-Datei, Basisgreeße: $1 × $2 Pixel, Dateigreeße: $3',
'show-big-image' => 'Version ei hieherer Uffleesung',
@@ -2257,12 +2231,6 @@ Dieser Bestätigungscode ies giltig bis $6, $7 Seeger.',
'scarytranscludefailed' => '[Vorloageneinbindung fier $1 ies gescheitert]',
'scarytranscludetoolong' => '[URL ies zu lang]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks fier diese Seite:<br />
-$1',
-'trackbackremove' => '([$1 läscha])',
-'trackbackdeleteok' => 'Trackback wurde erfolgreich geläscht.',
-
# Delete conflict
'deletedwhileediting' => 'Ochtiche: Diese Seite wurde geläscht, nachdem du oagefanga host se zu bearbta!
Eim [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Läsch-Logbuch] fendest du den Grund fier de Läschung. Wenn du de Seite speicherst, werd se neu oagelegt.',
@@ -2404,4 +2372,9 @@ De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
'htmlform-reset' => 'Änderunga rickgängig macha',
'htmlform-selectorother-other' => 'Ondere',
+# New logging system
+'revdelete-restricted' => 'Einschränkungen gelten au fier Administratorn',
+'revdelete-unrestricted' => 'Einschränkungen fier Administratorn uffgehobn',
+'newuserlog-byemail' => 'doas Passwurt wourde per E-Mail versandt',
+
);
diff --git a/languages/messages/MessagesSma.php b/languages/messages/MessagesSma.php
index fd2dfcfb..d59a94d1 100644
--- a/languages/messages/MessagesSma.php
+++ b/languages/messages/MessagesSma.php
@@ -198,7 +198,6 @@ $messages = array(
'badtitle' => 'Gååre nomme',
'badtitletext' => 'Dïhte bielietiitele lea nov sån ijje luhpede, bielie lea gåaroes, jallh lea bielie gåarhmede lïenghke gåajkoe.',
'viewsource' => 'Vuesehte tjaalege',
-'viewsourcefor' => 'ihke $1',
'viewsourcetext' => 'Dov dorje vuesehte jih kåpieerae gaaltjie dejstie dïhte bielie:',
# Login and logout pages
@@ -570,7 +569,6 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge sÃ
'actioncomplete' => 'Deahpadimmie voerkes',
'deletedtext' => '"$1" lea sihkojuvvon.
Vuajna $2 ihke galtege bïjre männgan sihkojuvvonh.',
-'deletedarticle' => 'sihkoj "[[$1]]"',
'dellogpage' => 'Sihkkun logge',
'deletecomment' => 'Gaavhtan ihke sihkkuma',
'deleteotherreason' => 'Jeatjebh/ehkstre gaavhtan:',
@@ -677,7 +675,6 @@ nome dov åtna veeljeme lea ijje jiiltige.
Gïemhpes veeljeme jeatjebh nomme.',
'movedto' => 'jåhta gåajkoe',
'movetalk' => 'Jåhta aaj dïerkestidhbielie, bïjre dïhte gååvnese.',
-'1movedto2' => '[[$1]] jåhta gåajkoe [[$2]]',
'movelogpage' => 'JÃ¥hta logge',
'movereason' => 'Gaavhtan:',
'revertmove' => 'jåhta bååstede',
@@ -758,9 +755,6 @@ Gïemhpes veeljeme jeatjebh nomme.',
'siteuser' => '{{SITENAME}} nuhtjien $1',
'siteusers' => '{{SITENAME}} nuhtjien(h) $1',
-# Patrol log
-'patrol-log-auto' => '(jïjtsistie)',
-
# Browsing diffs
'previousdiff' => '↠Övtebe joekehts',
'nextdiff' => 'Minngebe joekehts →',
@@ -768,7 +762,7 @@ Gïemhpes veeljeme jeatjebh nomme.',
# Media information
'file-info' => 'baalka stoerre: $1, MIME-vuekie: $2',
'file-info-size' => '$1 × $2 pixel, baalka stoerre: $3, MIME-vuekie: $4',
-'file-nohires' => '<small>Ijje jïlle bäjjeselöösninge jaksoes.</small>',
+'file-nohires' => 'Ijje jïlle bäjjeselöösninge jaksoes.',
'svg-long-desc' => 'SVG baalka, maadth-stoerre $1 × $2 pixel, baalka stoerre: $3',
'show-big-image' => 'Dïeves stoerre',
diff --git a/languages/messages/MessagesSn.php b/languages/messages/MessagesSn.php
index 9b7a4256..80c7cbea 100644
--- a/languages/messages/MessagesSn.php
+++ b/languages/messages/MessagesSn.php
@@ -171,7 +171,6 @@ Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
'move-page-legend' => 'Chichinura peji',
'movepagebtn' => 'Chichinura peji',
'movedto' => 'rachichinurwa ku',
-'1movedto2' => '[[$1]] rachichinurwa ku [[$2]]',
'movereason' => 'Chikonzero',
# Namespace 8 related
@@ -183,9 +182,6 @@ Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
'tooltip-ca-move' => 'Chichinura kupeji iri',
'tooltip-p-logo' => 'Peji Rekutanga',
-# Trackbacks
-'trackbackremove' => '([$1 Delete])',
-
# Table pager
'table_pager_limit_submit' => 'Enda',
diff --git a/languages/messages/MessagesSo.php b/languages/messages/MessagesSo.php
index a5811a76..ded12b64 100644
--- a/languages/messages/MessagesSo.php
+++ b/languages/messages/MessagesSo.php
@@ -342,11 +342,11 @@ Fadlan u sheek [[Special:ListUsers/sysop|maamulaha]], kana digtooneesii URL-ka.'
'badarticleerror' => 'Shaqadaan ma lagu sameyn karo boggaan.',
'cannotdelete' => 'Boggaan ama file\'ka "$1" mala tirtiri karo.
waxaa laga yaabaa in oo qof kale tirtiray .',
+'cannotdelete-title' => 'Ma tirtiri karo bogga "$1"',
'badtitle' => 'Qoraal xun',
'badtitletext' => 'Bogga aad rabtay ciwaankiisa sax ma eheen, waa ebar, ama waa erayo qalad oo la xiriiro isdhaafka-luqadaha ama isdhaafka-ciwaanka wiki.
Waxaa ku jiri kara xuruufo aanan loo isticmaalikarin cinwaan ahaan.',
'viewsource' => 'Itusi xogta',
-'viewsourcefor' => ' ku socoto $1',
'actionthrottled' => 'Shaqada waala ceejiyay',
'actionthrottledtext' => 'Hadii aan ahay ka hortaga spamka, laguuma ogolo shaqadaan badan oo waqti sidaan u yar ku qabatay,waadna ku xad gudubtay halihii laguu oglolaa.
fadlan waxyar kadib ku soo noqo.',
@@ -455,6 +455,9 @@ Fadlan waxyar sug intii aadan soo gelin.',
'login-abort-generic' => 'Ma u soo gali karin gudaha - waa la noqay',
'loginlanguagelabel' => 'Luqada: $1',
+# E-mail sending
+'user-mail-no-addy' => "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
+
# Change password dialog
'resetpass' => 'Bedel ereysirka',
'resetpass_announce' => 'waxaa ku soo geshay eraysir ku meelgaar ah oo e-mail laguugu soo diray.
@@ -473,26 +476,35 @@ Hadda gudaha ku gal',
'resetpass-temp-password' => 'Ereysir ku meel gaar ah:',
# Special:PasswordReset
-'passwordreset' => 'Bedel ereysirka',
-'passwordreset-legend' => 'Bedel ereysirka',
-'passwordreset-username' => 'Magaca gudagalka',
-'passwordreset-email' => 'Ciwaanka e-mailka',
-'passwordreset-emailtext-ip' => "(Qof laga yaabo in ee tahay adi, oo ka socdo ciwaanka IP'ka $1) ayaa codsaday xasuus faah faahin akoonkaada {{SITENAME}}
+'passwordreset' => 'Bedel ereysirka',
+'passwordreset-legend' => 'Bedel ereysirka',
+'passwordreset-username' => 'Magaca gudagalka',
+'passwordreset-email' => 'Ciwaanka e-mailka',
+'passwordreset-emailtext-ip' => "(Qof laga yaabo in ee tahay adi, oo ka socdo ciwaanka IP'ka $1) ayaa codsaday xasuus faah faahin akoonkaada {{SITENAME}}
($4). Isticmaaladaan soo socota {{PLURAL:$3|akoonkooda waxee|akoonkooda waxee}} la xiriiraan ciwaankaan e-mailka ah:
$2
{{PLURAL:$3|eraysirkaan kumeel gaarka ah|Eraysiryadaan kumeel gaarka ah}} waxay dhacaayaan {{PLURAL:$5|hal maalin|$5 maalmood}}.
Waa in aad gudaha gashaa oo e-mail cusub doorataa hadda. Hadii ee qof kale codsigaan sameysay, ama hadii aad soo xasuusatay eraysirkaagii hore, oo aadna u baahneen in aad badashid, iska ilaaw fariintaan siina isticmaal eraysirkaagii duqi ahaa.",
-'passwordreset-emailtext-user' => 'Isticmaale $1 ee {{SITENAME}} wuxuu codsaday xasuus faah faahin akoonkaada {{SITENAME}}
+'passwordreset-emailtext-user' => 'Isticmaale $1 ee {{SITENAME}} wuxuu codsaday xasuus faah faahin akoonkaada {{SITENAME}}
($4). Isticmaaladaan soo socota {{PLURAL:$3|akoonkooda waxee|akoonkooda waxee}} la xiriiraan ciwaankaan e-mailka ah:
$2
{{PLURAL:$3|eraysirkaan kumeel gaarka ah|Eraysiryadaan kumeel gaarka ah}} waxay dhacaayaan {{PLURAL:$5|hal maalin|$5 maalmood}}.
Waa in aad gudaha gashaa oo e-mail cusub doorataa hadda. Hadii ee qof kale codsigaan sameysay, ama hadii aad soo xasuusatay eraysirkaagii hore, oo aadna u baahneen in aad badashid, iska ilaaw fariintaan siina isticmaal eraysirkaagii duqi ahaa.',
-'passwordreset-emailelement' => 'Magaca gudagalka: $1
+'passwordreset-emailelement' => 'Magaca gudagalka: $1
Ereysirka kumeelgaarka ah: $2',
+'passwordreset-emailerror-capture' => 'E-mail xasuus ah ayaa la sameeyay, oo ka arki kartid hoosta,laakiin wuxuu ku guul dareestay in isticmaalaha loo diro: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Bedel ciwaanka E-mailka',
+'changeemail-header' => 'Bedel ciwaanka e-mailka akoonka',
+'changeemail-oldemail' => 'Ciwaanka e-mailka hadda jiro:',
+'changeemail-newemail' => 'Ciwaan e-mail oo cusub:',
+'changeemail-none' => '(waxna)',
+'changeemail-submit' => 'Bedel e-mailka',
# Edit page toolbar
'bold_sample' => 'Far butac ah',
@@ -548,9 +560,6 @@ Ma isticmaali kartid 'e-mailka isticmaalahaan' soo diray hadii aad heesato maa h
Ciwaankaada IP'ka waa $3, ID'ga la mamnuucay neh waa #$5.
fadlan ku soo dar faahfaahinta ku qoran kor su'aalo kasto oo sameyso.",
'blockednoreason' => 'wax sabab ah kama bixin',
-'blockedoriginalsource' => "Xogta '''$1''' hoos aad ka arki kartaa:",
-'blockededitsource' => "Qoraalkii '''aad waxkaga bedashay''' '''$1''' waxaad ku arkikartaa hoos:",
-'whitelistedittitle' => 'Waxaa loo baahanyahay gudagal si aad wax uga bedeshid',
'whitelistedittext' => 'Waa in aad $1 si aad wax uga bedeshid boggaga.',
'confirmedittext' => 'Waa in aad xaqiijisaa e-mailkaada inta aadan bogaga wax ka bedelin.
fadlan ku dar kuna xaqiiji e-mailkaada meesha [[Special:Preferences|dooqyada gudagalahaaga]].',
@@ -678,9 +687,6 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'revdel-restore-deleted' => 'kuwii la tirtiray badalyadooda',
'revdel-restore-visible' => 'bedelyadka la arki karo',
'pagehist' => 'Taariikhda bogga',
-'revdelete-content' => 'oo kooban',
-'revdelete-uname' => 'Magaca isticmaalaha',
-'revdelete-hid' => 'qari $1',
'revdelete-reasonotherlist' => 'sabababaha kale',
# History merging
@@ -1027,8 +1033,7 @@ Tafaasiishiisa waxee ku qorantahay [$2 bogga tafaasiisha faylka] oo ka arki kart
'listusers-blocked' => '(waa la mamnuucay)',
# Special:Log/newusers
-'newuserlogpage' => 'Gudagalaha Isticmaale sameeyay',
-'newuserlog-create-entry' => 'Isticmaale cusub',
+'newuserlogpage' => 'Gudagalaha Isticmaale sameeyay',
# Special:ListGroupRights
'listgrouprights-members' => '(Inta ka mid ah liiskooda)',
@@ -1087,7 +1092,6 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
'historywarning' => "'''Digniin:''' Bogga aad tirtiri rabtid wuxuu leeyahay taariikh lagu qiyaaso $1 {{PLURAL:$1|bedelyo ah|bedelaadyo ah}}:",
'actioncomplete' => "Amarka waa la'dhamaystiray",
'actionfailed' => 'Shaqada waad ku guul dareesatay',
-'deletedarticle' => 'la tirtiray "[[$1]]"',
'dellogpage' => 'Tirtiraha guda galaheeda',
# Rollback
@@ -1133,7 +1137,6 @@ Wuxuu ku badalay bedelkii ka danbeeyay oo sameeyay $2.',
'undeletelink' => 'fiiri/mar kale sameey',
'undeleteviewlink' => 'itusi',
'undeletereset' => 'Dib u habeey',
-'undeletedarticle' => 'La\' sooceliyey "[[$1]]"',
'undeletedrevisions' => '$1 {{PLURAL:$1|revision|revisions}} restored',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revision|revisions}} and $2 {{PLURAL:$2|file|files}} restored',
'undeletedfiles' => '$1 {{PLURAL:$1|file|files}} restored',
@@ -1204,13 +1207,11 @@ Wuxuu ku badalay bedelkii ka danbeeyay oo sameeyay $2.',
'proxyblocksuccess' => 'waa la sameeyay.',
# Move page
-'movenologin' => 'Gudaha kuma jirtid',
-'movedto' => 'loo wareejiyey',
-'movetalk' => "Wareejiyey bogga wadahadalka la'xiriira",
-'1movedto2' => '[[$1]] waxaa loo wareejiyey [[$2]]',
-'1movedto2_redir' => '[[$1]] waxaa loo wareejiyey [[$2]] si loo sii toosiyo',
-'movelogpage' => 'Wareejinta guda galaheeda',
-'revertmove' => 'celi',
+'movenologin' => 'Gudaha kuma jirtid',
+'movedto' => 'loo wareejiyey',
+'movetalk' => "Wareejiyey bogga wadahadalka la'xiriira",
+'movelogpage' => 'Wareejinta guda galaheeda',
+'revertmove' => 'celi',
# Export
'export' => 'Dhoofi boggag',
@@ -1298,17 +1299,13 @@ Waxaa fiiri kartaa cadaadkiisa',
'lastmodifiedatby' => 'Bogaan waxaa ugu dambeyntii wax laga bedelay $2, $1 kana bedelay $3.',
'othercontribs' => 'Waxay ku saleysantahay shaqada $1.',
-# Patrol log
-'patrol-log-line' => 'waxa la calaamadeeyay $1 ee $2 waxaa la waardiyeeyay $3',
-'patrol-log-diff' => 'bedelaadka $1',
-
# Browsing diffs
'previousdiff' => '↠bedelkii ka duqsanaa',
'nextdiff' => 'Bedelkii ugu cusbaa →',
# Media information
'file-info-size' => '$1 × $2 pixels, weyninka faylka : $3, nuuca MIME: $4',
-'file-nohires' => '<small>Malahan wax kale oo tafaasiil ah</small>',
+'file-nohires' => 'Faah faahin dheeraad ah malahan.',
# Special:NewFiles
'imagelisttext' => "Hoos waxaa yaala liiska '''$1''' {{PLURAL:$1|file|faylalka}} oo u kala soocan $2.",
@@ -1391,4 +1388,17 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
'htmlform-reset' => 'Ka noqo wax bedelka',
'htmlform-selectorother-other' => 'kuwa kale',
+# API errors
+'api-error-copyuploaddisabled' => 'Soo gelinta dhinaca URL-ka waa laga damiyay kombiyuutarkaan',
+'api-error-filename-tooshort' => 'Magaca faylka aad oo u gaabanyahay',
+'api-error-filetype-banned' => 'Faylka nuucaan waa laga mamnuucay',
+'api-error-http' => 'Qalad gudaha ah: Ma ku xiro karo kombiyutarka',
+'api-error-illegal-filename' => 'Magaca faylkaan lama ogola.',
+'api-error-mustbeloggedin' => 'Waa in aad gudaha u soo gashaa hadii aad rabtid in aad fayl soo geliso.',
+'api-error-ok-but-empty' => 'Qalad gudaha ah : kombiyutarka maka soo jawaabin',
+'api-error-unclassified' => 'Qalad la aqoon aa dhacay',
+'api-error-unknown-code' => 'Qalad la aqoon: "$1"',
+'api-error-unknown-warning' => 'Digniin la aqoon: $1',
+'api-error-uploaddisabled' => 'Soo gelinta waa laga xiray wikigaan.',
+
);
diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php
index be6f0616..56e8820e 100644
--- a/languages/messages/MessagesSq.php
+++ b/languages/messages/MessagesSq.php
@@ -118,66 +118,66 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#RIDREJTO', '#REDIRECT' ),
- 'currentmonth' => array( '1', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
- 'currentday' => array( '1', 'DITASOT', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DITASOT2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'EMRIIDITËSOT', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'SIVJET', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'KOHATANI', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ORATANI', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'EMRIIMUAJITLOKAL', 'LOCALMONTHNAME' ),
- 'localday' => array( '1', 'DITALOKALE', 'LOCALDAY' ),
- 'localday2' => array( '1', 'DITALOKALE2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'EMRIIDITËSLOKALE', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'VITILOKAL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'KOHALOKALE', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ORALOKALE', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'NUMRIFAQEVE', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'NUMRIIARTIKUJVE', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NUMRIISKEDAVE', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NUMRIPËRDORUESVE', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'NUMRIREDAKTIMEVE', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'NUMRIISHIKIMEVE', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'EMRIFAQES', 'PAGENAME' ),
- 'fullpagename' => array( '1', 'EMRIIPLOTËIFAQES', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'EMRIIPLOTËIFAQESE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'EMRIINËNFAQES', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'EMRIINËNFAQESE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'EMRIIFAQESBAZË', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'EMRIIFAQESBAZËE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'EMRIIFAQESSËDISKUTIMIT', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'EMRIIFAQESSËDISKUTIMITE', 'TALKPAGENAMEE' ),
- 'subst' => array( '0', 'ZËVN', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'parapamje', 'pamje', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'parapamje=$1', 'pamje=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'djathtas', 'right' ),
- 'img_left' => array( '1', 'majtas', 'left' ),
- 'img_none' => array( '1', 's\'ka', 'none' ),
- 'img_center' => array( '1', 'qëndër', 'qëndrore', 'center', 'centre' ),
- 'img_framed' => array( '1', 'i kornizuar', 'pa kornizë', 'kornizë', 'framed', 'enframed', 'frame' ),
- 'img_page' => array( '1', 'faqja=$1', 'faqja $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'lartdjathtas', 'lartdjathtas=$1', 'lartdjathtas $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'kufi', 'border' ),
- 'img_baseline' => array( '1', 'linjabazë', 'baseline' ),
- 'img_sub' => array( '1', 'nën', 'sub' ),
- 'img_text_top' => array( '1', 'tekst-top', 'text-top' ),
- 'img_middle' => array( '1', 'mes', 'middle' ),
- 'img_bottom' => array( '1', 'fund', 'bottom' ),
- 'img_text_bottom' => array( '1', 'tekst-fund', 'text-bottom' ),
- 'img_link' => array( '1', 'lidhje=$1', 'link=$1' ),
- 'sitename' => array( '1', 'EMRIIFAQES', 'SITENAME' ),
- 'localurl' => array( '0', 'URLLOKALE', 'LOCALURL:' ),
- 'server' => array( '0', 'SERVERI', 'SERVER' ),
- 'servername' => array( '0', 'EMRIISERVERIT', 'SERVERNAME' ),
- 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
- 'currentweek' => array( '1', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
- 'plural' => array( '0', 'SHUMËS:', 'PLURAL:' ),
- 'language' => array( '0', '#GJUHA:', '#LANGUAGE:' ),
- 'special' => array( '0', 'speciale', 'special' ),
+ 'redirect' => array( '0', '#RIDREJTO', '#REDIRECT' ),
+ 'currentmonth' => array( '1', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'DITASOT', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DITASOT2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'EMRIIDITËSOT', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'SIVJET', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'KOHATANI', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ORATANI', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MUAJILOKAL', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'EMRIIMUAJITLOKAL', 'LOCALMONTHNAME' ),
+ 'localday' => array( '1', 'DITALOKALE', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'DITALOKALE2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'EMRIIDITËSLOKALE', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'VITILOKAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'KOHALOKALE', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ORALOKALE', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'NUMRIFAQEVE', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NUMRIIARTIKUJVE', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NUMRIISKEDAVE', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NUMRIPËRDORUESVE', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'NUMRIREDAKTIMEVE', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NUMRIISHIKIMEVE', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'EMRIFAQES', 'PAGENAME' ),
+ 'fullpagename' => array( '1', 'EMRIIPLOTËIFAQES', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'EMRIIPLOTËIFAQESE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'EMRIINËNFAQES', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'EMRIINËNFAQESE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'EMRIIFAQESBAZË', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'EMRIIFAQESBAZËE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'EMRIIFAQESSËDISKUTIMIT', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'EMRIIFAQESSËDISKUTIMITE', 'TALKPAGENAMEE' ),
+ 'subst' => array( '0', 'ZËVN', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'parapamje', 'pamje', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'parapamje=$1', 'pamje=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'djathtas', 'right' ),
+ 'img_left' => array( '1', 'majtas', 'left' ),
+ 'img_none' => array( '1', 's\'ka', 'none' ),
+ 'img_center' => array( '1', 'qëndër', 'qëndrore', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'i_kornizuar', 'pa_kornizë', 'kornizë', 'framed', 'enframed', 'frame' ),
+ 'img_page' => array( '1', 'faqja=$1', 'faqja $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'lartdjathtas', 'lartdjathtas=$1', 'lartdjathtas $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'kufi', 'border' ),
+ 'img_baseline' => array( '1', 'linjabazë', 'baseline' ),
+ 'img_sub' => array( '1', 'nën', 'sub' ),
+ 'img_text_top' => array( '1', 'tekst-top', 'text-top' ),
+ 'img_middle' => array( '1', 'mes', 'middle' ),
+ 'img_bottom' => array( '1', 'fund', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'tekst-fund', 'text-bottom' ),
+ 'img_link' => array( '1', 'lidhje=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'EMRIIFAQES', 'SITENAME' ),
+ 'localurl' => array( '0', 'URLLOKALE', 'LOCALURL:' ),
+ 'server' => array( '0', 'SERVERI', 'SERVER' ),
+ 'servername' => array( '0', 'EMRIISERVERIT', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+ 'currentweek' => array( '1', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
+ 'plural' => array( '0', 'SHUMËS:', 'PLURAL:' ),
+ 'language' => array( '0', '#GJUHA:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'speciale', 'special' ),
);
$datePreferences = array(
@@ -552,23 +552,25 @@ Nëse nuk është kjo arsyeja, ateherë ju mund të keni gjetur një gabim në p
'badarticleerror' => 'Ky veprim nuk mund të bëhet në këtë faqe.',
'cannotdelete' => 'Faqja ose skeda $1 nuk mund të fshihej.
Mund të jetë fshirë nga dikush tjetër.',
+'cannotdelete-title' => 'Faqja "$1" nuk mund të fshihet',
'badtitle' => 'Titull i pasaktë',
'badtitletext' => 'Titulli i faqes që kërkuat nuk ishte i saktë, ishte bosh, ose ishte një titull ndër-gjuhësor/inter-wiki me lidhje të pasaktë.
Mund të përmbajë një ose më shumë germa, të cilat nuk mund të përdoren në tituj.',
-'perfcached' => 'Informacioni i mëposhtëm është kopje e ruajtur dhe mund të mos jetë i freskët:',
-'perfcachedts' => 'Informacioni i mëposhtëm është një kopje e rifreskuar më $1.',
+'perfcached' => 'Informacioni i mëposhtëm është kopje e ruajtur dhe mund të mos jetë i përditësuar. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Informacioni i mëposhtëm është një kopje e rifreskuar më $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "Përditësimet për këtë faqe për momentin janë të ç'aktivizuara.
Këtu informacioni nuk do të jetë i përditësuar.",
'wrong_wfQuery_params' => 'Parametrat gabim tek wfQuery()<br />
Funksioni: $1<br />
Query: $2',
'viewsource' => 'Shiko tekstin',
-'viewsourcefor' => 'e $1',
+'viewsource-title' => 'Shiko tekstin për $1',
'actionthrottled' => 'Veprim u ndalua',
'actionthrottledtext' => 'Si masë sigurie anti-spam, është e ndaluar kryerja e shpeshtë e një veprimi brenda një hapësire kohore shumë të shkurtër. Ju kryet shumë herë të njëjtin veprim brenda një kohe shumë të shkurtër.
Ju lutemi, provojeni përsëri pas disa minutash.',
'protectedpagetext' => 'Kjo faqe është e mbrojtur dhe nuk mund të redaktohet.',
'viewsourcetext' => 'Ju mund të shikoni dhe kopjoni tekstin e kësaj faqeje:',
+'viewyourtext' => "Ju mund të shikoni dhe të kopjoni tekstin e '''ndryshimeve tuaja''' tek kjo faqe:",
'protectedinterface' => 'Kjo faqe përmban tekstin e dritares së programit, për këtë arsye mbrohet për të shmangur abuzimet.',
'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ë.
@@ -666,6 +668,7 @@ Ju lutemi ndiqni këshillat në eMailin e pranuar.',
'noemailprefs' => 'Detyrohet një adresë email-i për të përdorur këtë mjet.',
'emailconfirmlink' => 'Vërtetoni adresën tuaj',
'invalidemailaddress' => 'Posta elektronike nuk mund të pranohet kështu si është pasi ka format jo valid. Ju lutemi, vendoni një postë mirë të formatuar, ose zbrazeni fushën.',
+'cannotchangeemail' => 'Adresat e-mail të llogarive nuk mund të ndryshohen në këtë wiki.',
'accountcreated' => 'Llogarija e Përdoruesit u krijua',
'accountcreatedtext' => 'Llogarija e Përdoruesit për $1 u krijua',
'createaccount-title' => 'Hapja e llogarive për {{SITENAME}}',
@@ -679,6 +682,7 @@ Duhet të hyni brenda dhe të ndërroni fjalëkalimin tani nëse ky person jeni
# E-mail sending
'php-mail-error-unknown' => 'Gabim i panjohur në funksionin e postës PHP ()',
+'user-mail-no-addy' => 'Provuat të dërgoni një korrespondencë pa adresë elektronike',
# Change password dialog
'resetpass' => 'Ndrysho fjalëkalimin',
@@ -698,16 +702,18 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
'resetpass-temp-password' => 'Fjalëkalimi i përkohshëm:',
# 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-email' => 'Posta elektronike',
-'passwordreset-emailtitle' => 'Detajet e llogarisë në {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për
+'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?',
+'passwordreset-capture-help' => "Nëse shënoni këtë kuti, e-mail-i (dhe fjalekalimi i përkohshëm) që do t'i dërgohen përdoruesit, do të të tregohen edhe ty.",
+'passwordreset-email' => 'Posta elektronike',
+'passwordreset-emailtitle' => 'Detajet e llogarisë në {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për
detajet e llogarisë suaj {{SITENAME}} ($4).Përdoruesi në vijim {{PLURAL:$3|llogari është|llogaritë janë}} të lidhur me këtë postë elektronike:
$2
@@ -715,15 +721,28 @@ $2
{{PLURAL:$3|Ky fjalëkalim i përkohshëm|Këto fjalëkalime të përkohshme}} do të përfundojë për {{PLURAL:$5|një ditë|$5 ditë}}.
Ju duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.',
-'passwordreset-emailtext-user' => 'Përdoruesi $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL: $3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike:
+'passwordreset-emailtext-user' => 'Përdoruesi $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL: $3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike:
$2
{{PLURAL: $3 | Ky fjalëkalim i përkohshëm | Këto fjalëkalime të përkohshme}} do të përfundojë në {{PLURAL: $5 | një ditë | $5 ditë}}.
Ju duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.',
-'passwordreset-emailelement' => 'Nofka: $1
+'passwordreset-emailelement' => 'Nofka: $1
Fjalëkalimi i përkohshëm: $2',
-'passwordreset-emailsent' => 'Një korrespondencë kujtese është dërguar',
+'passwordreset-emailsent' => 'Një korrespondencë kujtese është dërguar',
+'passwordreset-emailsent-capture' => 'U dërgua një e-mail kujtesë, i cili tregohet më poshtë.',
+'passwordreset-emailerror-capture' => 'U dërgua një e-mail kujtesë, i cili tregohet më poshtë, por dërgesa për tek përdoruesi qe e pamundur: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ndrysho postën elektronike',
+'changeemail-header' => 'Ndrysho llogarinë e adresës së postës elektronike',
+'changeemail-text' => 'Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Ju duhet të shkruani fjalëkalimin tuaj për të konfirmuar këtë ndryshim.',
+'changeemail-no-info' => 'Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.',
+'changeemail-oldemail' => 'Posta elektronike e aktuale:',
+'changeemail-newemail' => 'Posta elektronike e re:',
+'changeemail-none' => '(asgjë)',
+'changeemail-submit' => 'Ndrysho postën elektronike',
+'changeemail-cancel' => 'Anulo',
# Edit page toolbar
'bold_sample' => 'Stil i theksuar i tekstit',
@@ -795,9 +814,6 @@ Vini re : që nuk mund ta përdorni mundësinë "dërgo porosi elektronike" për
IP adresa juaj e tanishme është $3 dhe ID e bllokimit është #$5.
Ju lutemi përfshini këto detaje në të gjitha kërkesat që i bëni.',
'blockednoreason' => 'nuk është dhënë ësnje arsye',
-'blockedoriginalsource' => "Më poshtë tregohet burimi i '''$1''':",
-'blockededitsource' => "Më poshtë tregohet teksti i '''redaktimeve tuaja''' të '''$1''':",
-'whitelistedittitle' => 'Duhet të hyni brënda për të redaktuar',
'whitelistedittext' => 'Ju duhet të $1 për të redaktuar faqet.',
'confirmedittext' => 'Ju duhet së pari ta vërtetoni e-mail adresen para se të redaktoni. Ju lutem plotësoni dhe vërtetoni e-mailin tuaj te [[Special:Preferences|parapëlqimet]] e juaja.',
'nosuchsectiontitle' => 'Paragrafi nuk mund të gjendet',
@@ -1052,8 +1068,6 @@ Ju mund ta shikoni këtë ndryshim; detajet mund të gjenden te [{{fullurl:{{#Sp
'revdelete-unsuppress' => 'Hiq kufizimet nga versionet e restauruara',
'revdelete-log' => 'Arsyeja:',
'revdelete-submit' => 'Aplikoni tek {{PLURAL:$1|revision|versionet}} e zgjedhura',
-'revdelete-logentry' => 'Pamja e versionit u ndryshua për [[$1]]',
-'logdelete-logentry' => 'u ndryshua dukshmëria e ngjarjes së [[$1]]',
'revdelete-success' => "'''Dukshmëria e versioneve u vendos me sukses.'''",
'revdelete-failure' => "' ' 'Dukshmëria e rivizionit nuk mund të përditëohet\"
\$1",
@@ -1065,15 +1079,6 @@ $1",
'revdel-restore-visible' => 'rivizionet e dukshme',
'pagehist' => 'Historiku i faqes',
'deletedhist' => 'Historiku i grisjeve',
-'revdelete-content' => 'përmbajtja',
-'revdelete-summary' => 'përmbledhja redaktimit',
-'revdelete-uname' => 'përdoruesi',
-'revdelete-restricted' => 'u vendosën kufizime për administruesit',
-'revdelete-unrestricted' => 'u hoqën kufizimet për administruesit',
-'revdelete-hid' => 'u fsheh $1',
-'revdelete-unhid' => 'u tregua $1',
-'revdelete-log-message' => '$1 për $2 {{PLURAL:$2|version|versione}}',
-'logdelete-log-message' => '$1 për $2 {{PLURAL:$2|ngjarje|ngjarje}}',
'revdelete-hide-current' => 'Gabim në fshehje të pikës me datë $2, $1: ky është rivizioni i tanishëm.
Nuk mund të fshihet',
'revdelete-show-no-access' => 'Gabim gjatë shfaqjes së artikullit të datës $2, $1: ky artikull ka qenë i shënuar si "i kufizuar".
@@ -1231,12 +1236,14 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'prefs-rc' => 'Ndryshime së fundmi',
'prefs-watchlist' => 'Lista mbikqyrëse',
'prefs-watchlist-days' => 'Numri i ditëve të treguara tek lista mbikqyrëse:',
-'prefs-watchlist-days-max' => 'Maksimum 7 ditë',
+'prefs-watchlist-days-max' => 'Maksimumi $1 ditë',
'prefs-watchlist-edits' => 'Numri i redaktimeve të treguara tek lista mbikqyrëse e zgjeruar:',
'prefs-watchlist-edits-max' => 'Numri maksimal: 1000',
'prefs-watchlist-token' => 'Lista mbikqyrëse shenjë:',
'prefs-misc' => 'Të ndryshme',
'prefs-resetpass' => 'Ndrysho fjalëkalimin',
+'prefs-changeemail' => 'Ndrysho postën elektronike',
+'prefs-setemail' => 'Vendos adresën e postës elektronike',
'prefs-email' => 'Opsionet E-mail',
'prefs-rendering' => 'Dukja',
'saveprefs' => 'Ruaj parapëlqimet',
@@ -1296,6 +1303,7 @@ Kjo nuk mundet me u zhbâ.',
'yourrealname' => 'Emri juaj i vërtetë*',
'yourlanguage' => 'Ndërfaqja gjuhësore',
'yourvariant' => 'Varianti i gjuhës së përmbajtjes:',
+'prefs-help-variant' => 'Varianti ose ortografia juaj e preferuar për të shfaqur përmbajtjen e faqeve në këtë wiki.',
'yournick' => 'Nënshkrimi',
'prefs-help-signature' => 'Komentet në faqet e diskutimit duhet të nënshkruhen me "<nowiki>~~~~</nowiki>" të cilat do të konvertohen me emrin tuaj të përdoruesit dhe kohën.',
'badsig' => 'Sintaksa e signaturës është e pavlefshme, kontrolloni HTML-in.',
@@ -1336,7 +1344,7 @@ Kjo informatë është publike.',
'userrights-lookup-user' => 'Ndrysho grupet e përdoruesit',
'userrights-user-editname' => 'Fusni emrin e përdoruesit:',
'editusergroup' => 'Redakto grupet e përdoruesve',
-'editinguser' => "Duke ndryshuar privilegjet e përdoruesit '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Duke ndryshuar privilegjet e përdoruesit '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Anëtarësimi tek grupet',
'saveusergroups' => 'Ruaj Grupin e Përdoruesve',
'userrights-groupsmember' => 'Anëtar i:',
@@ -1430,13 +1438,13 @@ Kjo informatë është publike.',
'right-autopatrol' => 'A e vet redaktimet e shënuar automatikisht patrulluar',
'right-patrolmarks' => 'Shiko ndryshimet e fundit shënon patrullë',
'right-unwatchedpages' => 'Shiko listën e faqeve të pa vëzhguara',
-'right-trackback' => 'Dërgoni një ndjekëse',
'right-mergehistory' => 'Bashko historinë e faqeve',
'right-userrights' => 'Redakto të gjitha të drejtat e përdoruesit',
'right-userrights-interwiki' => 'Ndrysho të drejtat e përdoruesve në wiki të tjera',
'right-siteadmin' => 'Mbyll ose hap bazën e të dhënave',
'right-override-export-depth' => 'Eksoprto faqet duke përfshirë e lidhura deri në një thellësi prej 5',
'right-sendemail' => 'Dërgo e-mail tek përdoruesit e tjerë',
+'right-passwordreset' => 'Shiko e-mail-et e rivendosjes së fjalëkalimit',
# User rights log
'rightslog' => 'Regjistri i privilegjeve të përdoruesit',
@@ -1470,16 +1478,17 @@ Kjo informatë është publike.',
'action-suppressionlog' => 'shiko këtë regjistër privat',
'action-block' => 'blloko përdoruesin',
'action-protect' => 'ndrysho nivelin e mbrojtjes për këtë faqe',
+'action-rollback' => 'ritkthen shpejt redaktimet e përdoruesit të fundit që redaktoi një faqe të veçantë',
'action-import' => 'importo këtë faqe nga një wiki tjetër',
'action-importupload' => 'importo këtë faqe nga një ngarkim i një skedari',
'action-patrol' => 'shëno redaktimin e tjerëve si të patrulluar',
'action-autopatrol' => 'shëno redaktimet tua si të patrulluara',
'action-unwatchedpages' => 'shiko listën e faqeve të pa vrojtuara',
-'action-trackback' => 'dërgo një ndjekës',
'action-mergehistory' => 'bashko historikun e kësaj faqeje',
'action-userrights' => 'ndrysho të gjitha të drejtat e përdoruesit',
'action-userrights-interwiki' => 'ndrysho të drejtat e përdoruesve në wiki-t tjera',
'action-siteadmin' => 'mbyll ose hap bazën e të dhënave',
+'action-sendemail' => 'dërgo e-maile',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ndryshim|ndryshime}}',
@@ -1565,6 +1574,7 @@ Të gjithë orët janë me orën e shërbyesit.',
'ignorewarnings' => 'Shpërfill çdo paralajmërim',
'minlength1' => 'Emri i dosjes duhet të jetë së paku një fjalë',
'illegalfilename' => 'Skeda "$1" përmban gërma që nuk lejohen tek titujt e faqeve. Ju lutem ndërrojani emrin dhe provoni ta ngarkoni përsëri.',
+'filename-toolong' => 'Emrat e skedave nuk mund të jenë më të gjata se 240 bajt.',
'badfilename' => 'Emri i skedës është ndërruar në "$1".',
'filetype-mime-mismatch' => 'Prapashtesa .$1 e skedarit ($2) nuk përshtatet me tipin MIME.',
'filetype-badmime' => 'Skedat e llojit MIME "$1" nuk lejohen për ngarkim.',
@@ -1661,6 +1671,35 @@ Nëse problemi vazhdon atëherë kontaktoni një [[Special:ListUsers/sysop|admin
'upload-unknown-size' => 'Madhësia e panjohur',
'upload-http-error' => 'Ndodhi një gabim HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Nuk mund të kalojë skedën $1.',
+'backend-fail-backup' => 'Nuk mund të rezervojë skedën $1.',
+'backend-fail-notexists' => 'Skeda $1 nuk ekziston.',
+'backend-fail-hashes' => 'Nuk mund të marrë rrëmujat e skedave për krahasim.',
+'backend-fail-notsame' => 'Një skedë joidentike ekziston tashmë tek $1.',
+'backend-fail-invalidpath' => '$1 nuk është një rrugë e vlefshme ruajtjeje.',
+'backend-fail-delete' => 'Nuk mund të grisë skedën $1.',
+'backend-fail-alreadyexists' => 'Skeda $1 ekziston tashmë.',
+'backend-fail-store' => 'Nuk mund të ruajë skedën $1 tek $2.',
+'backend-fail-copy' => 'Nuk mund të kopjojë skedën $1 tek $2.',
+'backend-fail-move' => 'Nuk mund të zhvendosë skedën $1 tek $2.',
+'backend-fail-opentemp' => 'Nuk mund të hapë skedën e përkohshme.',
+'backend-fail-writetemp' => 'Nuk mund të shkruajë te skeda e përkohshme.',
+'backend-fail-closetemp' => 'Nuk mund të mbyllë skedën e përkohshme.',
+'backend-fail-read' => 'Nuk mund të lexojë skedën $1.',
+'backend-fail-create' => 'Nuk mund të krijojë skedën $1.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Nuk mund të zhbllokojë "$1"; nuk është e bllokuar.',
+'lockmanager-fail-closelock' => 'Nuk mund të mbyllë kyçjen e skedës për "$1".',
+'lockmanager-fail-deletelock' => 'Nuk mund të grisë kyçjen e skedës për "$1".',
+'lockmanager-fail-acquirelock' => 'Nuk mund të sigurojë kyçjen për "$1".',
+'lockmanager-fail-openlock' => 'Nuk mund të hapë kyçjen e skedës për "$1".',
+'lockmanager-fail-releaselock' => 'Nuk mund të lëshojë kyçjen për "$1".',
+'lockmanager-fail-db-bucket' => 'Nuk mund të kontaktojë mjaftueshëm baza të dhënash kyçjes në kovën $1.',
+'lockmanager-fail-db-release' => 'Nuk mund të lëshojë kyçjet në bazën e të dhënave $1.',
+'lockmanager-fail-svr-release' => 'Nuk mund të lëshojë kyçjet në serverin $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Një gabim është hasur gjatë hapjes së dokumentit për ZIP kontrollimin.',
'zip-wrong-format' => 'Dokumenti i specifikuar nuk ishte ZIP dokument.',
@@ -1677,6 +1716,7 @@ Ajo nuk mund të kontrollohet siç duhet për sigurinë.',
'uploadstash-badtoken' => 'Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet redaktuese tuaja kanë skaduar. Provoni përsëri.',
'uploadstash-errclear' => 'Spastrimi i skedave ishte i pasuksesshëm.',
'uploadstash-refresh' => 'Rifreskoni listën e skedave',
+'invalid-chunk-offset' => 'Kompensim cope i pavlefshëm',
# img_auth script messages
'img-auth-accessdenied' => 'Refuzohet hyrja',
@@ -1787,23 +1827,24 @@ Përshkrimi në [$2 faqen përshkruese të skedës] është treguar më poshtë.
'filerevert-badversion' => 'Nuk ka version vendor tjetër të kësaj skede në kohën e dhënë.',
# File deletion
-'filedelete' => 'Grise $1',
-'filedelete-legend' => 'Grise skedën',
-'filedelete-intro' => "Jeni duke grisur '''[[Media:$1|$1]]''' së baashku me të gjithë historikun e saj.",
-'filedelete-intro-old' => "Po grisni versionin e '''[[Media:$1|$1]]''' të [$4 $3, $2].",
-'filedelete-comment' => 'Arsyeja:',
-'filedelete-submit' => 'Grise',
-'filedelete-success' => "'''$1''' është grisur.",
-'filedelete-success-old' => "Versioni i '''[[Media:$1|$1]]''' që nga $3, $2 është grisur.",
-'filedelete-nofile' => "'''$1''' nuk ekziston.",
-'filedelete-nofile-old' => "Nuk ka version të arkivuar të '''$1''' me të dhënat e kërkuara.",
-'filedelete-otherreason' => 'Arsye tjetër / shtesë:',
-'filedelete-reason-otherlist' => 'Arsye tjetër',
-'filedelete-reason-dropdown' => '*Arsye të shpeshpërdorura për grisje:
+'filedelete' => 'Grise $1',
+'filedelete-legend' => 'Grise skedën',
+'filedelete-intro' => "Jeni duke grisur '''[[Media:$1|$1]]''' së baashku me të gjithë historikun e saj.",
+'filedelete-intro-old' => "Po grisni versionin e '''[[Media:$1|$1]]''' të [$4 $3, $2].",
+'filedelete-comment' => 'Arsyeja:',
+'filedelete-submit' => 'Grise',
+'filedelete-success' => "'''$1''' është grisur.",
+'filedelete-success-old' => "Versioni i '''[[Media:$1|$1]]''' që nga $3, $2 është grisur.",
+'filedelete-nofile' => "'''$1''' nuk ekziston.",
+'filedelete-nofile-old' => "Nuk ka version të arkivuar të '''$1''' me të dhënat e kërkuara.",
+'filedelete-otherreason' => 'Arsye tjetër / shtesë:',
+'filedelete-reason-otherlist' => 'Arsye tjetër',
+'filedelete-reason-dropdown' => '*Arsye të shpeshpërdorura për grisje:
** Kundër të drejtave të autorit
** Skedë kopje',
-'filedelete-edit-reasonlist' => 'Arsye grisjeje për redaktimet',
-'filedelete-maintenance' => 'Grisja dhe restaurimi i skedave është çaktivizuar përkohësisht gjatë mirëmbajtjes.',
+'filedelete-edit-reasonlist' => 'Arsye grisjeje për redaktimet',
+'filedelete-maintenance' => 'Grisja dhe restaurimi i skedave është çaktivizuar përkohësisht gjatë mirëmbajtjes.',
+'filedelete-maintenance-title' => 'Nuk mund të grisë skedën',
# MIME search
'mimesearch' => 'Kërkime MIME',
@@ -1909,6 +1950,7 @@ Secili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë
'mostimages' => 'Figura më të lidhura',
'mostrevisions' => 'Artikuj më të redaktuar',
'prefixindex' => 'Të gjitha faqet me parashtesa',
+'prefixindex-namespace' => 'Të gjitha faqet me parashtesë (hapësira $1)',
'shortpages' => 'Artikuj të shkurtër',
'longpages' => 'Artikuj të gjatë',
'deadendpages' => 'Artikuj pa rrugëdalje',
@@ -1925,7 +1967,7 @@ Secili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë
'listusers-editsonly' => 'Trego vetëm përdoruesit me redaktime',
'listusers-creationsort' => 'Radhiti sipas datës së krijimit',
'usereditcount' => '$1 {{PLURAL:$1|redaktim|redaktime}}',
-'usercreated' => 'Krijuar më $1 në $2',
+'usercreated' => '{{GENDER:$3|Krijuar}} më $1 në $2',
'newpages' => 'Artikuj të rinj',
'newpages-username' => 'Përdoruesi:',
'ancientpages' => 'Artikuj më të vjetër',
@@ -2019,12 +2061,8 @@ Protokolle të mbështetura: <tt>$1<tt> (mos shtoni ndonjërin nga këta në kë
'activeusers-noresult' => 'Asnjë përdorues nuk u gjet.',
# Special:Log/newusers
-'newuserlogpage' => 'Regjistri i llogarive',
-'newuserlogpagetext' => 'Ky është një regjistër i llogarive të fundit që janë hapur',
-'newuserlog-byemail' => 'fjalëkalimi u dërgua në postën elektronike',
-'newuserlog-create-entry' => 'Përdorues i ri',
-'newuserlog-create2-entry' => 'krijoi llofari të re $1',
-'newuserlog-autocreate-entry' => 'Llogaria u hap automatikisht',
+'newuserlogpage' => 'Regjistri i llogarive',
+'newuserlogpagetext' => 'Ky është një regjistër i llogarive të fundit që janë hapur',
# Special:ListGroupRights
'listgrouprights' => 'Grupime përdoruesish me privilegje',
@@ -2052,7 +2090,7 @@ Protokolle të mbështetura: <tt>$1<tt> (mos shtoni ndonjërin nga këta në kë
'emailpagetext' => 'Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.
Adresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si "Nga" adresa e email-it, pra marrësi do të ketë mundësinë t\'ju përgjigjet direkt.',
'usermailererror' => 'Objekti postal ktheu gabimin:',
-'defemailsubject' => '{{SITENAME}} email',
+'defemailsubject' => '{{SITENAME}} posta elektronike nga përdoruesi "$1"',
'usermaildisabled' => 'Email-i i përdoruesit çaktivizua',
'usermaildisabledtext' => 'Ju nuk mund të dërgoni e-mail tek përdoruesit e tjerë në këtë wiki',
'noemailtitle' => "S'ka adresë email-i",
@@ -2107,7 +2145,7 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
'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}}.',
'iteminvalidname' => "Problem me artikullin '$1', titull jo i saktë...",
-'wlnote' => "Më poshtë {{PLURAL:$1|është $1 ndryshim i|janë $1 ndryshimet e}} {{PLURAL:$2|orës së fundit|'''$2''' orëve të fundit}}.",
+'wlnote' => "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLUARAL:$2:orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
'wlshowlast' => 'Trego $1 orët $2 ditët $3',
'watchlist-options' => 'Mundësitë e listës mbikqyrëse',
@@ -2194,8 +2232,6 @@ Për të na dhënë përshtypjet tuaja ose për ndihmë të mëtejshme:
'actioncomplete' => 'Veprimi u krye',
'actionfailed' => 'Veprimi dështoi',
'deletedtext' => '"$1" është grisur nga regjistri. Shikoni $2 për një pasqyrë të grisjeve së fundmi.',
-'deletedarticle' => 'grisi "[[$1]]"',
-'suppressedarticle' => '"[[$1]]" i shtypur',
'dellogpage' => 'Regjistri i grisjeve',
'dellogpagetext' => 'Më poshtë është një listë e grisjeve më të fundit.',
'deletionlog' => 'regjistrin e grisjeve',
@@ -2242,7 +2278,10 @@ Shih listën e [[Special:ProtectedPages|faqeve të mbrojtura]] nga lista e mbroj
'unprotectedarticle' => 'Largo mbrojtjen nga " [[$1]] "',
'movedarticleprotection' => 'u bartën të dhënat e mbrojtjes nga "[[$2]]" në "[[$1]]"',
'protect-title' => 'Ndryshoni nivelin e mbrojtjes së "$1"',
+'protect-title-notallowed' => 'Shiko nivelin e mbrojtjes së "$1"',
'prot_1movedto2' => '[[$1]] u zhvendos tek [[$2]]',
+'protect-badnamespace-title' => 'Hapësirë e pambrojtshme',
+'protect-badnamespace-text' => 'Faqet në këtë hapësirë nuk mund të mbrohen.',
'protect-legend' => 'Konfirmoni',
'protectcomment' => 'Arsyeja:',
'protectexpiry' => 'Afati',
@@ -2261,6 +2300,7 @@ Mund të ndryshoni nivelin e mbrojtjes të kësaj faqeje por kjo nuk do të ndry
'protect-level-sysop' => 'Lejo vetëm administruesit',
'protect-summary-cascade' => 'të varura',
'protect-expiring' => 'skadon me $1 (UTC)',
+'protect-expiring-local' => 'Skadon $1',
'protect-expiry-indefinite' => 'i pacaktuar',
'protect-cascade' => 'Mbrojtje e ndërlidhur - mbro çdo faqe që përfshihet në këtë faqe.',
'protect-cantedit' => 'Nuk mund ta ndryshoni nivelin e mbrojtjes të kësaj faqeje sepse nuk keni leje për këtë.',
@@ -2319,7 +2359,6 @@ Ju mund të keni një lidhje të keqe, ose versioni mund të jetë restauruar os
'undeletereset' => 'Boshatis',
'undeleteinvert' => 'Selektim anasjelltas',
'undeletecomment' => 'Arsyeja:',
-'undeletedarticle' => 'u restaurua "$1"',
'undeletedrevisions' => '$1 {{PLURAL:$1|version u restaurua|versione u restauruan}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|version|versione}} dhe $2 {{PLURAL:$2|skedë|skeda}} janë restauruar',
'undeletedfiles' => '$1 {{PLURAL:$1|skedë u restaurua|skeda u restauruan}}',
@@ -2328,6 +2367,7 @@ Ju mund të keni një lidhje të keqe, ose versioni mund të jetë restauruar os
Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për grisjet dhe restaurimet së fundmi.",
'undelete-header' => 'Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për faqet e grisura së fundmi.',
+'undelete-search-title' => 'Kërko faqet e grisura',
'undelete-search-box' => 'Kërko faqet e grisura',
'undelete-search-prefix' => 'Trego faqet duke filluar nga:',
'undelete-search-submit' => 'Kërko',
@@ -2337,6 +2377,7 @@ Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për grisjet dhe restaurime
'undelete-cleanup-error' => 'Gabim në grisjen e skedës "$1" të pa përdorur të arkivit .',
'undelete-missing-filearchive' => 'Nuk mund të restaurohet arkivi ID i skedës $1 sepse nuk është në bazën të dhënave.
Mund të jetë restauruar një herë.',
+'undelete-error' => 'Gabim gjatë restaurimit të faqes',
'undelete-error-short' => 'Gabim në rikthimin e skedës: $1',
'undelete-error-long' => 'U hasën gabime gjatë restaurimit të skedës:
@@ -2459,6 +2500,7 @@ një përdoruesi ose IP adreseje të bllokuar.",
'blocklist-userblocks' => 'Fsheh bllokimin e llogarisë',
'blocklist-tempblocks' => 'Fsheh bllokimin e përkohshëm',
'blocklist-addressblocks' => 'Fsheh bllokimin e IP vetanake',
+'blocklist-rangeblocks' => 'Fsheh varg bllokimet',
'blocklist-timestamp' => 'Kohë-caktimi',
'blocklist-target' => 'Objektivi',
'blocklist-expiry' => 'Skadon',
@@ -2481,6 +2523,7 @@ një përdoruesi ose IP adreseje të bllokuar.",
'unblocklink' => 'çblloko',
'change-blocklink' => 'ndryshoje bllokun',
'contribslink' => 'kontribute',
+'emaillink' => 'dërgo e-mail',
'autoblocker' => 'Bllokuar automatikisht sepse adresa juaj IP është përdorur së fundmi nga "[[User:$1|$1]]".
Arsyeja e dhënë për bllokimin e $1 është: "$2"',
'blocklogpage' => 'Regjistri i bllokimeve',
@@ -2606,9 +2649,6 @@ Në ato raste, duhet ta zhvendosni ose përpuqni faqen vetë n.q.s. dëshironi."
'movepage-page-moved' => 'Faqja $1 është zhvendosur tek $2.',
'movepage-page-unmoved' => "Faqja $1 s'mund të zhvendosej tek $2.",
'movepage-max-pages' => 'Maksimumi prej $1 {{PLURAL:$1|faqeje|faqesh}} është zhvendosur dhe nuk do të zhvendoset më automatikisht.',
-'1movedto2' => '[[$1]] u zhvendos tek [[$2]]',
-'1movedto2_redir' => '[[$1]] u zhvendos tek [[$2]] dhe u krijua një faqe përcjellimi',
-'move-redirect-suppressed' => 'përcjellimi i prishur',
'movelogpage' => 'Regjistri i zhvendosjeve',
'movelogpagetext' => 'Më poshtë është një listë e faqeve të zhvendosura',
'movesubpage' => '$1 nën-faqe',
@@ -2621,7 +2661,7 @@ Në ato raste, duhet ta zhvendosni ose përpuqni faqen vetë n.q.s. dëshironi."
Faqja "[[:$1]]" ekziston, dëshironi ta grisni për të mundësuar zhvendosjen?',
'delete_and_move_confirm' => 'Po, grise faqen',
-'delete_and_move_reason' => 'U gris për të liruar vendin për përcjellim',
+'delete_and_move_reason' => 'U gris për të liruar vendin për përcjellim të "[[$1]]"',
'selfmove' => 'Nuk munda ta zhvendos faqen sepse titulli i ri është i njëjtë me të vjetrin.',
'immobile-source-namespace' => 'Nuk mund të lëvizet faqja tek "$1"',
'immobile-target-namespace' => 'Nuk mund të lëvizen faqet tek "$1"',
@@ -2650,6 +2690,7 @@ Ju lutemi zgjidhni në emët tjetër.',
Për të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijoni lidhje të tipit [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] si [[{{MediaWiki:Mainpage}}]].',
'exportcuronly' => 'Përfshi vetëm versionin e fundit, jo të gjithë historinë',
'exportnohistory' => "'''Shënim:''' Eksportimi i historisë së faqes për shkaqe të rendimentit nuk është e mundshme.",
+'exportlistauthors' => 'Përfshij një listë të plotë të kontribuesve për secilën faqe',
'export-submit' => 'Eksporto',
'export-addcattext' => 'Shto faqe nga kategoria:',
'export-addcat' => 'Shto',
@@ -2682,6 +2723,8 @@ Ju lutemi vizitoni [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation
'thumbnail_error' => 'Gabim gjatë krijimit të figurës përmbledhëse: $1',
'djvu_page_error' => 'Faqja DjVu jashtë renditjes',
'djvu_no_xml' => 'Nuk mund të gjendet XML për skedën DjVu',
+'thumbnail-temp-create' => 'Nuk mund të krijohej parapamja e përkohshme e skedës',
+'thumbnail-dest-create' => 'Nuk mund të ruhej parapamja tek destinacioni',
'thumbnail_invalid_params' => 'Parametrat thumbnail të pavlefshme',
'thumbnail_dest_directory' => 'Në pamundësi për të krijuar dosjen e destinacionit',
'thumbnail_image-type' => 'Lloji i fotografisë nuk mbështetet',
@@ -2729,6 +2772,8 @@ Një dosje e përkohëshme mungon.',
'import-token-mismatch' => 'Humbje e të dhënave të sesionit.
Ju lutemi provoni përsëri.',
'import-invalid-interwiki' => 'Nuk mund të importohet nga wiki i specifikuar.',
+'import-error-edit' => 'Faqja "$1" nuk është importuar sepse ju nuk lejoheni ta redaktoni atë.',
+'import-error-create' => 'Faqja "$1" nuk është importuar sepse ju nuk lejoheni ta krijoni atë.',
# Import log
'importlogpage' => 'Regjistri i importeve',
@@ -2863,9 +2908,6 @@ Ju lutemi provoni përsëri.',
# Patrol log
'patrol-log-page' => 'Regjistri i patrollimeve',
'patrol-log-header' => 'Këto janë të dhëna të revizioneve të patrulluara.',
-'patrol-log-line' => 'shënoi $1 të $2 të patrulluar $3',
-'patrol-log-auto' => '(automatikisht)',
-'patrol-log-diff' => 'versioni $1',
'log-show-hide-patrol' => '$1 regjistri i patrollimeve',
# Image deletion
@@ -2884,23 +2926,25 @@ $1',
'nextdiff' => 'Ndryshimi më pas →',
# Media information
-'mediawarning' => "''Kujdes''': Kjo skedë mund të ketë përmbajtje të dëmshme.
+'mediawarning' => "''Kujdes''': Kjo skedë mund të ketë përmbajtje të dëmshme.
Duke e përdorur sistemi juaj mund të rrezikohet.",
-'imagemaxsize' => "Kufizoni madhësinë e fotos:<br />''(për faqet e përshkrimit të skedave)''",
-'thumbsize' => 'Madhësia fotove përmbledhëse:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|faqe|faqe}}',
-'file-info' => 'madhësia skedës: $1, lloji MIME: $2',
-'file-info-size' => '$1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4',
-'file-info-size-pages' => '$1 × $2 pixel, madhësia e dokumentit: $3 , MIME tipi: $4 , $5 {{PLURAL:$5| faqe | faqet}}',
-'file-nohires' => '<small>Nuk ka rezolucion më të madh.</small>',
-'svg-long-desc' => 'skedë SVG, fillimisht $1 × $2 pixel, madhësia e skedës: $3',
-'show-big-image' => 'Rezolucion i plotë',
-'show-big-image-size' => '$1 × $2 pixel',
-'file-info-gif-looped' => 'kthyer',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|kornizë|korniza}}',
-'file-info-png-looped' => 'kthyer',
-'file-info-png-repeat' => 'luajtur $1 herë',
-'file-info-png-frames' => '$1 {{PLURAL:$1|kornizë|korniza}}',
+'imagemaxsize' => "Kufizoni madhësinë e fotos:<br />''(për faqet e përshkrimit të skedave)''",
+'thumbsize' => 'Madhësia fotove përmbledhëse:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|faqe|faqe}}',
+'file-info' => 'madhësia skedës: $1, lloji MIME: $2',
+'file-info-size' => '$1 × $2 pixela, madhësia e skedës: $3, tipi MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixel, madhësia e dokumentit: $3 , MIME tipi: $4 , $5 {{PLURAL:$5| faqe | faqet}}',
+'file-nohires' => 'Nuk ka rezolucion më të madh.',
+'svg-long-desc' => 'skedë SVG, fillimisht $1 × $2 pixel, madhësia e skedës: $3',
+'show-big-image' => 'Rezolucion i plotë',
+'show-big-image-preview' => 'Madhësia e këtij shikimi: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Rezolucion tjetër|Rezolucione të tjera}}: $1.',
+'show-big-image-size' => '$1 × $2 pixel',
+'file-info-gif-looped' => 'kthyer',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|kornizë|korniza}}',
+'file-info-png-looped' => 'kthyer',
+'file-info-png-repeat' => 'luajtur $1 herë',
+'file-info-png-frames' => '$1 {{PLURAL:$1|kornizë|korniza}}',
# Special:NewFiles
'newimages' => 'Galeria e figurave të reja',
@@ -2914,6 +2958,13 @@ Duke e përdorur sistemi juaj mund të rrezikohet.",
'bydate' => 'datës',
'sp-newimages-showfrom' => 'Trego skedat e reja duke filluar nga $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekondë|$1 sekonda}}',
+'minutes' => '{{PLURAL:$1|$1 minutë|$1 minuta}}',
+'hours' => '{{PLURAL:$1|$1 orë|$1 orë}}',
+'days' => '{{PLURAL:$1|$1 ditë|$1 ditë}}',
+'ago' => '$1 më parë',
+
# Bad image list
'bad_image_list' => 'Formati është si vijon:
@@ -3410,13 +3461,6 @@ Ky kod i konfirmimit skadon me $4.',
'scarytranscludefailed' => '[Gjetja e stampes deshtoi per $1]',
'scarytranscludetoolong' => '[Adresa URL eshte teper e gjate]',
-# Trackbacks
-'trackbackbox' => 'Lidhje ndjekëse për këtë faqe:<br />
-$1',
-'trackbackremove' => '([$1 hiqe])',
-'trackbacklink' => 'Lidhje ndjekëse',
-'trackbackdeleteok' => 'Lidhja ndjekëse u hoq.',
-
# Delete conflict
'deletedwhileediting' => 'Kujdes! Kjo faqe është grisur pasi keni filluar redaktimin!',
'confirmrecreate' => "Përdoruesi [[User:$1|$1]] ([[User talk:$1|diskutime]]) grisi këtë artikull mbasi ju filluat ta redaktoni për arsyen:
@@ -3496,6 +3540,9 @@ Ju gjithashtu mund [[Special:EditWatchlist|të përdorni redaktuesin standart]].
'watchlisttools-edit' => 'Shih dhe redakto listën mbikqyrëse.',
'watchlisttools-raw' => 'Redaktoje drejtpërdrejt listën',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskutimet]])',
+
# Core parser functions
'unknown_extension_tag' => 'Etiketë shtesë e panjohur "$1"',
'duplicate-defaultsort' => '\'\'\'Kujdes:\'\'\' Renditja kryesore e çelësit "$2" refuzon renditjen e mëparshme kryesore të çelësit "$1".',
@@ -3593,13 +3640,16 @@ Figurat tregohen me madhësi të plotë, skedat e tjera hapen me programet përk
'tags-hitcount' => '$1 {{PLURAL:$1|ndryshim|ndryshime}}',
# Special:ComparePages
-'comparepages' => 'Krahasoni faqet',
-'compare-selector' => 'Krahasoni versionet e faqeve',
-'compare-page1' => 'Faqe 1',
-'compare-page2' => 'Faqe 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Krahasimi',
+'comparepages' => 'Krahasoni faqet',
+'compare-selector' => 'Krahasoni versionet e faqeve',
+'compare-page1' => 'Faqe 1',
+'compare-page2' => 'Faqe 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Krahasimi',
+'compare-invalid-title' => 'Titulli që keni specifikuar është i pavlefshëm',
+'compare-title-not-exists' => 'Titulli që keni specifikuar nuk ekziston.',
+'compare-revision-not-exists' => 'Rishikimi që ju specifikuat nuk ekziston',
# Database error messages
'dberr-header' => 'Kjo wiki ka një problem',
@@ -3627,4 +3677,88 @@ Kjo faqe është duke përjetuar vështirësi teknike.',
'sqlite-has-fts' => '$1 me mbështetje të kërkimit me teskt të plotë',
'sqlite-no-fts' => '$1 pa mbështetje të kërkimit me teskt të plotë',
+# New logging system
+'logentry-delete-delete' => '$1 grisi faqen $3',
+'logentry-delete-restore' => '$1 riktheu faqen $3',
+'logentry-delete-event' => '$1 ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4',
+'logentry-delete-revision' => '$1 ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4',
+'logentry-delete-event-legacy' => '$1 ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3',
+'logentry-delete-revision-legacy' => '$1 ndryshoi dukshmërinë e versioneve në $3',
+'logentry-suppress-delete' => '$1 shtypi faqen $3',
+'logentry-suppress-event' => '$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4',
+'logentry-suppress-revision' => '$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4',
+'logentry-suppress-event-legacy' => '$1 në mënyrë sekrete ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3',
+'logentry-suppress-revision-legacy' => '$1 në mënyrë sekrete ndryshoi dukshmërinë e versioneve në faqen $3',
+'revdelete-content-hid' => 'përmbajtja u fsheh',
+'revdelete-summary-hid' => 'redaktimi i përmbledhjes i fshehur',
+'revdelete-uname-hid' => 'emri i përdoruesit i fshehur',
+'revdelete-content-unhid' => 'përmbajtje jo e fshehur',
+'revdelete-summary-unhid' => 'redaktimi i përmbledhjes jo i fshehur',
+'revdelete-uname-unhid' => 'emri i përdoruesit jo i fshehur',
+'revdelete-restricted' => 'u vendosën kufizime për administruesit',
+'revdelete-unrestricted' => 'u hoqën kufizimet për administruesit',
+'logentry-move-move' => '$1 zhvendosi faqen $3 te $4',
+'logentry-move-move-noredirect' => '$1 zhvendosi faqen $3 te $4 pa lënë një përcjellim',
+'logentry-move-move_redir' => '$1 zhvendosi faqen $3 te $4 nëpërmjet përcjellimit',
+'logentry-move-move_redir-noredirect' => '$1 zhvendosi faqen $3 te $4 nëpërmjet një përcjellimi pa lënë një përcjellim',
+'logentry-patrol-patrol' => '$1 shënoi versionin $4 të faqes $3 të patrolluar',
+'logentry-patrol-patrol-auto' => '$1 automatikisht shënoi versionin $4 të faqes $3 të patrolluar',
+'logentry-newusers-newusers' => '$1 krijoi një llogari',
+'logentry-newusers-create' => '$1 krijoi një llogari',
+'logentry-newusers-create2' => '$1 krijoi një llogari $3',
+'logentry-newusers-autocreate' => 'Llogaria $1 u krijua automatikisht',
+'newuserlog-byemail' => 'fjalëkalimi u dërgua në postën elektronike',
+
+# Feedback
+'feedback-bugornote' => 'Nëse jeni gati për të përshkruar një problem teknik me detaje ju lutemi [$1 raportoni një problem].
+Përndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të shtohet te faqja "[$3 $2]"", së bashku me emrin tuaj të përdoruesit dhe shfletuesin të cilin jeni duke përdorur.',
+'feedback-subject' => 'Subjekti:',
+'feedback-message' => 'Mesazhi:',
+'feedback-cancel' => 'Anulo',
+'feedback-submit' => 'Paraqit përshtypjet',
+'feedback-adding' => 'Duke shtuar përshtypjen te faqja...',
+'feedback-error1' => 'Gabim: Rezultat i panjohur nga API',
+'feedback-error2' => 'Gabim: Redaktimi dështoi',
+'feedback-error3' => 'Gabim: Nuk ka përgjigje nga API',
+'feedback-thanks' => 'Faleminderit! Përshtypja juaj është postuar në faqen "[$2 $1]".',
+'feedback-close' => 'Përfunduar',
+'feedback-bugcheck' => 'Shumë mirë! Thjesht kontrolloni që nuk është një nga [$1 problemet e njohura].',
+'feedback-bugnew' => 'E kontrollova. Raporto një problem të ri',
+
+# API errors
+'api-error-badaccess-groups' => 'Ju nuk lejoheni të ngarkoni skeda në këtë wiki.',
+'api-error-badtoken' => 'Gabim i brendshëm: Shenjë e keqe.',
+'api-error-copyuploaddisabled' => 'Ngarkimi nga URL-ja është çaktivizuar në këtë server.',
+'api-error-duplicate' => '{{PLURAL:$1|Ekziston [$2 një skedë tjetër]|Ekzistojnë [$2 disa skeda të tjera]}} me të njëjtën përmbajtje.',
+'api-error-duplicate-archive' => '{{Ekzistonte [$2 një skedë tjetër]|Ekzistonin [$2 disa skeda të tjera]}} me të njëjtën përmbajtje, por {{PLURAL:$1|u gris|u grisën}}.',
+'api-error-duplicate-archive-popup-title' => 'Dublo {{PLURAL:$1|skedë|skeda}} që janë grisur tashmë',
+'api-error-duplicate-popup-title' => 'Dublo {{PLURAL:$1|skedë|skeda}}',
+'api-error-empty-file' => 'Skeda që paraqitët ishte bosh.',
+'api-error-fetchfileerror' => 'Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.',
+'api-error-file-too-large' => 'Skeda që paraqitët ishte shumë e madhe.',
+'api-error-filename-tooshort' => 'Emri i skedës është shumë i shkurtër.',
+'api-error-filetype-banned' => 'Ky lloj i skedës është përjashtuar.',
+'api-error-filetype-missing' => 'Skedës i mungon një shtesë.',
+'api-error-hookaborted' => 'Modifikimi që provuat të bëni u ndërpre nga një goditje shtese.',
+'api-error-http' => 'Gabim i brendshëm: Nuk mund të lidhet me serverin.',
+'api-error-illegal-filename' => 'Emri i skedës nuk lejohet.',
+'api-error-internal-error' => 'Gabim i brendshëm: Diçka shkoi keq me procesimin e ngarkimit tuaj në wiki.',
+'api-error-invalid-file-key' => 'Gabim i brendshëm: Skeda nuk u gjet në ruajtjen e përkohshme.',
+'api-error-missingparam' => 'Gabim i brendshëm: Mungesë e parametrave në kërkesë.',
+'api-error-missingresult' => 'Gabim i brendshëm: Nuk mund të përcaktohet nëse kopjimi doli me sukses.',
+'api-error-mustbeloggedin' => 'Ju duhet të identifikoheni për të ngarkuar skeda.',
+'api-error-mustbeposted' => 'Gabim i brendshëm: Kërkesa kërkon HTTP POST.',
+'api-error-noimageinfo' => 'Ngarkimi u krye me sukses, por serveri nuk na dha ndonjë informacion për këtë skedë.',
+'api-error-nomodule' => 'Gabim i brendshëm: Nuk ka modul ngarkimi të vendosur.',
+'api-error-ok-but-empty' => 'Gabim i brendshëm: Nuk ka përgjigje nga serveri.',
+'api-error-overwrite' => 'Mbishkrimi i një skede ekzistuese nuk lejohet.',
+'api-error-stashfailed' => 'Gabim i brendshëm: Serveri nuk arriti të ruajë skedën e përkohshme.',
+'api-error-timeout' => 'Serveri nuk u përgjigj gjatës kohës që pritej.',
+'api-error-unclassified' => 'Një gabim i panjohur ndodhi.',
+'api-error-unknown-code' => 'Gabim i panjohur: "$1"',
+'api-error-unknown-error' => 'Gabim i brendshëm: Diçka shkoi gabim kur provuat të ngarkoni skedën tuaj.',
+'api-error-unknown-warning' => 'Paralajmërim i panjohur: $1',
+'api-error-uploaddisabled' => 'Ngarkimi është i çaktivizuar në këte wiki.',
+'api-error-verification-error' => 'Skeda mund të jetë e korruptuar ose ka shtesë të gabuar.',
+
);
diff --git a/languages/messages/MessagesSr.php b/languages/messages/MessagesSr.php
index 4fd8913b..fa0af783 100644
--- a/languages/messages/MessagesSr.php
+++ b/languages/messages/MessagesSr.php
@@ -15,21 +15,3 @@
$fallback = 'sr-ec';
$linkTrail = '/^([abvgdÄ‘ežzijklljmnnjoprstćufhcÄdžšабвгдђежзијклљмнњопрÑтћуфхцчџш]+)(.*)$/usD';
-
-$messages = array(
-# Vector skin
-'vector-view-viewsource' => 'Погледај код',
-
-# Special:LinkSearch
-'linksearch' => 'Претрага интернет веза',
-'linksearch-text' => 'Ðокери као што Ñу "*.wikipedia.org" могу да Ñе кориÑте.
-Подржани протоколи: <tt>$1</tt>',
-'linksearch-line' => '$1 повезана Ñа $2',
-'linksearch-error' => 'Ðокери могу да Ñе појављују Ñамо на почетку домена.',
-
-# Special:Log/newusers
-'newuserlogpage' => 'иÑторија креирања кориÑника',
-'newuserlogpagetext' => 'Ово је иÑторија Ñкорашњих креирања кориÑника.',
-'newuserlog-create2-entry' => 'направио налог за $1',
-
-);
diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php
index 908c5ea6..00adf241 100644
--- a/languages/messages/MessagesSr_ec.php
+++ b/languages/messages/MessagesSr_ec.php
@@ -35,10 +35,10 @@ $namespaceNames = array(
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 => 'Помоћ',
@@ -68,6 +68,10 @@ $namespaceAliases = array(
'Слика' => NS_FILE,
'Разговор_о_Ñлици' => NS_FILE_TALK,
+ "Датотека" => NS_FILE,
+ "Разговор_о_датотеци" => NS_FILE_TALK,
+ "Медијавики" => NS_MEDIAWIKI,
+ "Разговор_о_Медијавикију" => NS_MEDIAWIKI_TALK,
'МедијаВики' => NS_MEDIAWIKI,
'Разговор_о_МедијаВикију' => NS_MEDIAWIKI_TALK,
);
@@ -98,6 +102,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'СвеПоруке', 'Све_поруке' ),
'Allpages' => array( 'Све_Ñтранице' ),
'Ancientpages' => array( 'ÐајÑтаријиЧланци' ),
+ 'Badtitle' => array( 'Лош_наÑлов' ),
'Block' => array( 'Блокирај', 'БлокирајИП', 'БлокирајКориÑника' ),
'Blockme' => array( 'БлокирајМе', 'Блокирај_ме' ),
'BrokenRedirects' => array( 'Покварена_преуÑмерења', 'ÐеиÑправна_преуÑмерења' ),
@@ -249,150 +254,150 @@ $dateFormats = array(
/* NOT USED IN STABLE VERSION */
$magicWords = array(
- 'redirect' => array( '0', '#ПреуÑмери', '#преуÑмери', '#ПРЕУСМЕРИ', '#ПреуÑмјери', '#преуÑмјери', '#ПРЕУСМЈЕРИ', '#redirect', '#REDIRECT' ),
- 'notoc' => array( '0', '__БЕЗСÐДРЖÐЈÐ__', '__БЕЗ_СÐДРЖÐЈÐ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__БЕЗГÐЛЕРИЈЕ__', '__БЕЗ_ГÐЛЕРИЈЕ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ФОРСИРÐÐИСÐДРЖÐЈ__', '__ФОРСИРÐÐИ_СÐДРЖÐЈ__', '__ПРИМОРÐÐИСÐДРЖÐЈ__', '__ПРИМОРÐÐИ_СÐДРЖÐЈ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__СÐДРЖÐЈ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__БЕЗИЗМЕÐÐ__', '__БЕЗ_ИЗМЕÐÐ__', '__БЕЗИЗМЈЕÐÐ__', '__БЕЗ_ИЗМЈЕÐÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗЗÐГЛÐВЉÐ__', '__БЕЗ_ЗÐГЛÐВЉÐ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ТРЕÐУТÐИМЕСЕЦ', 'ТРЕÐУТÐИ_МЕСЕЦ', 'ТЕКУЋИМЕСЕЦ', 'ТЕКУЋИ_МЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ТРЕÐУТÐИМЕСЕЦ1', 'ТРЕÐУТÐИ_МЕСЕЦ1', 'ТЕКУЋИМЕСЕЦ1', 'ТЕКУЋИ_МЕСЕЦ1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ТРЕÐУТÐИМЕСЕЦИМЕ', 'ИМЕТЕКУЋЕГМЕСЕЦÐ', 'ИМЕ_ТЕКУЋЕГ_МЕСЕЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ТРЕÐУТÐИМЕСЕЦГЕÐ', 'ТЕКУЋИМЕСЕЦГЕÐ', 'ТЕКУЋИ_МЕСЕЦ_ГЕÐ', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ТРЕÐУТÐИМЕСЕЦСКР', 'ТЕКУЋИМЕСЕЦСКР', 'ТЕКУЋИ_МЕСЕЦ_СКР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ТРЕÐУТÐИДÐÐ', 'ТЕКУЋИДÐÐ', 'ТЕКУЋИ_ДÐÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ТЕКУЋИДÐÐ2', 'ТЕКУЋИ_ДÐÐ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ТРЕÐУТÐИДÐÐИМЕ', 'ИМЕТЕКУЋЕГДÐÐÐ', 'ИМЕ_ТЕКУЋЕГ_ДÐÐÐ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ТРЕÐУТÐÐГОДИÐÐ', 'ТЕКУЋÐГОДИÐÐ', 'ТЕКУЋÐ_ГОДИÐÐ', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ТРЕÐУТÐОВРЕМЕ', 'ТЕКУЋЕВРЕМЕ', 'ТЕКУЋЕ_ВРЕМЕ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ТЕКУЋИСÐТ', 'ТЕКУЋИ_СÐТ', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ЛОКÐЛÐИМЕСЕЦ', 'ЛОКÐЛÐИ_МЕСЕЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'ЛОКÐЛÐИМЕСЕЦ2', 'ЛОКÐЛÐИ_МЕСЕЦ2', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ИМЕЛОКÐЛÐОГМЕСЕЦÐ', 'ИМЕ_ЛОКÐЛÐОГ_МЕСЕЦÐ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ЛОКÐЛÐИМЕСЕЦГЕÐ', 'ЛОКÐЛÐИ_МЕСЕЦ_ГЕÐ', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ЛОКÐЛÐИМЕСЕЦСКР', 'ЛОКÐЛÐИ_МЕСЕЦ_СКР', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ЛОКÐЛÐИДÐÐ', 'ЛОКÐЛÐИ_ДÐÐ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ЛОКÐЛÐИДÐÐ2', 'ЛОКÐЛÐИ_ДÐÐ2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ИМЕЛОКÐЛÐОГДÐÐÐ', 'ИМЕ_ЛОКÐЛÐОГ_ДÐÐÐ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ЛОКÐЛÐÐГОДИÐÐ', 'ЛОКÐЛÐÐ_ГОДИÐÐ', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ЛОКÐЛÐОВРЕМЕ', 'ЛОКÐЛÐО_ВРЕМЕ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ЛОКÐЛÐИСÐТ', 'ЛОКÐЛÐИ_СÐТ', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'БРОЈСТРÐÐИЦÐ', 'БРОЈ_СТРÐÐИЦÐ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'БРОЈЧЛÐÐÐКÐ', 'БРОЈ_ЧЛÐÐÐКÐ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'БРОЈДÐТОТЕКÐ', 'БРОЈ_ДÐТОТЕКÐ', 'БРОЈФÐЈЛОВÐ', 'БРОЈ_ФÐЈЛОВÐ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'БРОЈКОРИСÐИКÐ', 'БРОЈ_КОРИСÐИКÐ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'БРОЈÐКТИВÐИХКОРИСÐИКÐ', 'БРОЈ_ÐКТИВÐИХ_КОРИСÐИКÐ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'БРОЈИЗМЕÐÐ', 'БРОЈ_ИЗМЕÐÐ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'БРОЈПРЕГЛЕДÐ', 'БРОЈ_ПРЕГЛЕДÐ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ИМЕСТРÐÐИЦЕ', 'ИМЕ_СТРÐÐИЦЕ', 'СТРÐÐИЦÐ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ИМЕÐÐСТРÐÐИЦÐ', 'ИМЕÐÐ_СТРÐÐИЦÐ', 'СТРÐÐИЦЕ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ИМЕÐСКИПРОСТОР', 'ИМЕÐСКИ_ПРОСТОР', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ИМЕÐСКИПРОСТОРИ', 'ИМЕÐСКИ_ПРОСТОРИ', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'РÐЗГОВОР', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'РÐЗГОВОРИ', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ИМЕÐСКИПРОСТОРЧЛÐÐКÐ', 'ИМЕÐСКИ_ПРОСТОР_ЧЛÐÐКÐ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ИМЕÐСКИПРОСТОРЧЛÐÐÐКÐ', 'ИМЕÐСКИ_ПРОСТОР_ЧЛÐÐÐКÐ', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ПУÐОИМЕСТРÐÐИЦЕ', 'ПУÐОИМЕСТРÐÐЕ', 'ПУÐО_ИМЕ_СТРÐÐИЦЕ', 'ПУÐО_ИМЕ_СТРÐÐЕ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ПУÐÐИМЕÐÐСТРÐÐИЦÐ', 'ПУÐÐИМЕÐÐСТРÐÐÐ', 'ПУÐÐ_ИМЕÐÐ_СТРÐÐИЦÐ', 'ПУÐÐ_ИМЕÐÐ_СТРÐÐÐ', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ИМЕПОДСТРÐÐИЦЕ', 'ИМЕПОДСТРÐÐЕ', 'ИМЕ_ПОДСТРÐÐИЦЕ', 'ИМЕ_ПОДСТРÐÐЕ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ИМЕÐÐПОДСТРÐÐИЦÐ', 'ИМЕÐÐПОДСТРÐÐÐ', 'ИМЕÐÐ_ПОДСТРÐÐИЦÐ', 'ИМЕÐÐ_ПОДСТРÐÐÐ', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ИМЕОСÐОВЕ', 'ИМЕ_ОСÐОВЕ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ИМЕÐÐОСÐОВÐ', 'ИМЕÐÐ_ОСÐОВÐ', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ИМЕРÐЗГОВОРÐ', 'ИМЕ_РÐЗГОВОРÐ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ИМЕÐÐРÐЗГОВОРÐ', 'ИМЕÐÐ_РÐЗГОВОРÐ', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ИМЕЧЛÐÐКÐ', 'ИМЕ_ЧЛÐÐКÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ИМЕÐÐЧЛÐÐÐКÐ', 'ИМЕÐÐ_ЧЛÐÐÐКÐ', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'ПОР:', 'MSG:' ),
- 'subst' => array( '0', 'ЗÐМЕÐИ:', 'ЗÐМЕÐÐ:', 'SUBST:' ),
- 'safesubst' => array( '0', 'БЕЗБЕДÐÐЗÐМЕÐÐ', 'БЕЗБЕДÐÐ_ЗÐМЕÐÐ', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'ÐВПОР:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'мини', 'умањено', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'мини=$1', 'умањено=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'деÑно', 'д', 'right' ),
- 'img_left' => array( '1', 'лево', 'л', 'left' ),
- 'img_none' => array( '1', 'без', 'н', 'none' ),
- 'img_width' => array( '1', '$1пиÑкел', '$1п', '$1px' ),
- 'img_center' => array( '1', 'центар', 'ц', 'center', 'centre' ),
- 'img_framed' => array( '1', 'оквир', 'рам', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'безоквира', 'без_оквира', 'безрама', 'без_рама', 'frameless' ),
- 'img_page' => array( '1', 'Ñтраница=$1', 'Ñтрана=$1', 'Ñтраница_$1', 'Ñтрана_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'уÑправно', 'уÑправно=$1', 'уÑправно_$1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'ивица', 'border' ),
- 'img_baseline' => array( '1', 'оÑнова', 'baseline' ),
- 'img_sub' => array( '1', 'под', 'sub' ),
- 'img_super' => array( '1', 'Ñупер', 'super', 'sup' ),
- 'img_top' => array( '1', 'врх', 'top' ),
- 'img_text_top' => array( '1', 'врхтекÑта', 'врх_текÑта', 'text-top' ),
- 'img_middle' => array( '1', 'Ñредина', 'middle' ),
- 'img_bottom' => array( '1', 'дно', 'bottom' ),
- 'img_text_bottom' => array( '1', 'ÑрединатекÑта', 'Ñредина_текÑта', 'text-bottom' ),
- 'img_link' => array( '1', 'веза=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'алт=$1', 'alt=$1' ),
- 'int' => array( '0', 'ИÐТ:', 'INT:' ),
- 'sitename' => array( '1', 'ИМЕСÐЈТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'ИП:', 'NS:' ),
- 'localurl' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐ:', 'ЛОКÐЛÐÐ_ÐДРЕСÐ:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛОКÐЛÐЕÐДРЕСЕ:', 'ЛОКÐЛÐЕ_ÐДРЕСЕ:', 'LOCALURLE:' ),
- 'articlepath' => array( '0', 'ПУТÐЊÐЧЛÐÐКÐ', 'ПУТÐЊÐ_ЧЛÐÐКÐ', 'ARTICLEPATH' ),
- 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'ИМЕСЕРВЕРÐ', 'ИМЕ_СЕРВЕРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'СКРИПТÐ', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'ПУТÐЊÐСТИЛÐ', 'ПУТÐЊÐ_СТИЛÐ', 'STYLEPATH' ),
- 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'РОД:', 'ЛИЦЕ:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__БЕЗКÐ__', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__БЕЗЦЦ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ТРЕÐУТÐÐÐЕДЕЉÐ', 'ТРЕÐУТÐÐ_ÐЕДЕЉÐ', 'ТЕКУЋÐÐЕДЕЉÐ', 'ТЕКУЋÐ_ÐЕДЕЉÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ТРЕÐУТÐИДОВ', 'ТЕКУЋИДУÐ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ЛОКÐЛÐÐÐЕДЕЉÐ', 'ЛОКÐЛÐÐ_ÐЕДЕЉÐ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ЛОКÐЛÐИДУÐ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ИДРЕВИЗИЈЕ', 'ИД_РЕВИЗИЈЕ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДÐÐИЗМЕÐЕ', 'ДÐÐ_ИЗМЕÐЕ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДÐÐИЗМЕÐЕ2', 'ДÐÐ_ИЗМЕÐЕ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МЕСЕЦИЗМЕÐЕ', 'МЕСЕЦ_ИЗМЕÐЕ', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'МЕСЕЦИЗМЕÐЕ1', 'МЕСЕЦ_ИЗМЕÐЕ1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'ГОДИÐÐИЗМЕÐЕ', 'ГОДИÐÐ_ИЗМЕÐЕ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'ВРЕМЕИЗМЕÐЕ', 'ВРЕМЕ_ИЗМЕÐЕ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'КОРИСÐИКИЗМЕÐЕ', 'КОРИСÐИК_ИЗМЕÐЕ', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПУÐУРЛ:', 'ЦЕЛÐÐДРЕСÐ', 'ЦЕЛÐ_ÐДРЕСÐ', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ПУÐУРЛЕ:', 'ЦЕЛЕÐДРЕСЕ', 'ЦЕЛЕ_ÐДРЕСЕ', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ЛЦПРВИ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'УЦПРВИ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'ЛЦ:', 'LC:' ),
- 'uc' => array( '0', 'УЦ:', 'UC:' ),
- 'raw' => array( '0', 'ЧИСТ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ÐÐЗИВПРИКÐЗÐ', 'ÐÐЗИВ_ПРИКÐЗÐ', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Р', 'R' ),
- 'newsectionlink' => array( '1', '__ÐОВÐВЕЗÐОДЕЉКÐ__', '__ÐОВÐ_ВЕЗÐ_ОДЕЉКÐ__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__БЕЗÐОВЕВЕЗЕОДЕЉКÐ__', '__БЕЗ_ÐОВЕ_ВЕЗЕ_ОДЕЉКÐ__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ТЕКУЋЕИЗДÐЊЕ', 'ТЕКУЋЕ_ИЗДÐЊЕ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'КОДИРÐЊЕÐДРЕСЕ', 'КОДИРÐЊЕ_ÐДРЕСЕ', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'КОДИРÐЊЕВЕЗЕ', 'КОДИРÐЊЕ_ВЕЗЕ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'ТЕКУЋИОТИСÐКВРЕМЕÐÐ', 'ТЕКУЋИ_ОТИСÐК_ВРЕМЕÐÐ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'ОТИСÐКВРЕМЕÐÐ', 'ОТИСÐК_ВРЕМЕÐÐ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'СМЕРОЗÐÐКЕ', 'СМЕР _ОЗÐÐКЕ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'contentlanguage' => array( '1', 'ЈЕЗИКСÐДРЖÐЈÐ', 'ЈЕЗИК_СÐДРЖÐЈÐ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'СТРÐÐИЦÐУИМЕÐСКОМПРОСТОРУ', 'СТРÐÐÐУИМЕÐСКОМПРОСТОРУ', 'СТРÐÐИЦÐ_У_ИМЕÐСКОМ_ПРОСТОРУ', 'СТРÐÐÐ_У_ИМЕÐСКОМ_ПРОСТОРУ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'БРОЈÐДМИÐÐ', 'БРОЈ_ÐДМИÐÐ', 'NUMBEROFADMINS' ),
- 'padleft' => array( '0', 'ПОРÐÐ’ÐÐЈЛЕВО', 'ПОРÐÐ’ÐÐЈ_ЛЕВО', 'PADLEFT' ),
- 'padright' => array( '0', 'ПОРÐÐ’ÐÐЈДЕСÐО', 'ПОРÐÐ’ÐÐЈ_ДЕСÐО', 'PADRIGHT' ),
- 'special' => array( '0', 'поÑебно', 'special' ),
- 'filepath' => array( '0', 'ПУТÐЊÐДÐТОТЕКЕ', 'ПУТÐЊÐ_ДÐТОТЕКЕ', 'FILEPATH:' ),
- 'tag' => array( '0', 'ознака', 'tag' ),
- 'hiddencat' => array( '1', '__СÐКРИВЕÐÐКÐТ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'СТРÐÐИЦÐУКÐТЕГОРИЈИ', 'СТРÐÐÐУКÐТЕГОРИЈИ', 'СТРÐÐИЦÐ_У_КÐТЕГОРИЈИ', 'СТРÐÐÐ_У_КÐТЕГОРИЈИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'ВЕЛИЧИÐÐСТРÐÐИЦЕ', 'ВЕЛИЧИÐÐСТРÐÐЕ', 'ВЕЛИЧИÐÐ_СТРÐÐИЦЕ', 'ВЕЛИЧИÐÐ_СТРÐÐЕ', 'PAGESIZE' ),
- 'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
- 'noindex' => array( '1', '__БЕЗИÐДЕКСÐ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'БРОЈУГРУПИ', 'БРОЈ_У_ГРУПИ', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__СТÐТИЧКОПРЕУСМЕРЕЊЕ__', 'СТÐТИЧКО_ПРЕУСМЕРЕЊЕ', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'ÐИВОЗÐШТИТЕ', 'ÐИВО_ЗÐШТИТЕ', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'форматдатума', 'формат_датума', 'formatdate', 'dateformat' ),
- 'url_path' => array( '0', 'ПУТÐЊÐ', 'PATH' ),
- 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
- 'url_query' => array( '0', 'РЕДОСЛЕД', 'QUERY' ),
+ 'redirect' => array( '0', '#ПреуÑмери', '#преуÑмери', '#ПРЕУСМЕРИ', '#ПреуÑмјери', '#преуÑмјери', '#ПРЕУСМЈЕРИ', '#redirect', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БЕЗСÐДРЖÐЈÐ__', '__БЕЗ_СÐДРЖÐЈÐ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__БЕЗГÐЛЕРИЈЕ__', '__БЕЗ_ГÐЛЕРИЈЕ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ФОРСИРÐÐИСÐДРЖÐЈ__', '__ФОРСИРÐÐИ_СÐДРЖÐЈ__', '__ПРИМОРÐÐИСÐДРЖÐЈ__', '__ПРИМОРÐÐИ_СÐДРЖÐЈ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__СÐДРЖÐЈ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БЕЗИЗМЕÐÐ__', '__БЕЗ_ИЗМЕÐÐ__', '__БЕЗИЗМЈЕÐÐ__', '__БЕЗ_ИЗМЈЕÐÐ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__БЕЗЗÐГЛÐВЉÐ__', '__БЕЗ_ЗÐГЛÐВЉÐ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ТРЕÐУТÐИМЕСЕЦ', 'ТРЕÐУТÐИ_МЕСЕЦ', 'ТЕКУЋИМЕСЕЦ', 'ТЕКУЋИ_МЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ТРЕÐУТÐИМЕСЕЦ1', 'ТРЕÐУТÐИ_МЕСЕЦ1', 'ТЕКУЋИМЕСЕЦ1', 'ТЕКУЋИ_МЕСЕЦ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ТРЕÐУТÐИМЕСЕЦИМЕ', 'ИМЕТЕКУЋЕГМЕСЕЦÐ', 'ИМЕ_ТЕКУЋЕГ_МЕСЕЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ТРЕÐУТÐИМЕСЕЦГЕÐ', 'ТЕКУЋИМЕСЕЦГЕÐ', 'ТЕКУЋИ_МЕСЕЦ_ГЕÐ', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ТРЕÐУТÐИМЕСЕЦСКР', 'ТЕКУЋИМЕСЕЦСКР', 'ТЕКУЋИ_МЕСЕЦ_СКР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ТРЕÐУТÐИДÐÐ', 'ТЕКУЋИДÐÐ', 'ТЕКУЋИ_ДÐÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ТЕКУЋИДÐÐ2', 'ТЕКУЋИ_ДÐÐ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ТРЕÐУТÐИДÐÐИМЕ', 'ИМЕТЕКУЋЕГДÐÐÐ', 'ИМЕ_ТЕКУЋЕГ_ДÐÐÐ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ТРЕÐУТÐÐГОДИÐÐ', 'ТЕКУЋÐГОДИÐÐ', 'ТЕКУЋÐ_ГОДИÐÐ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ТРЕÐУТÐОВРЕМЕ', 'ТЕКУЋЕВРЕМЕ', 'ТЕКУЋЕ_ВРЕМЕ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ТЕКУЋИСÐТ', 'ТЕКУЋИ_СÐТ', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ЛОКÐЛÐИМЕСЕЦ', 'ЛОКÐЛÐИ_МЕСЕЦ', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'ЛОКÐЛÐИМЕСЕЦ2', 'ЛОКÐЛÐИ_МЕСЕЦ2', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ИМЕЛОКÐЛÐОГМЕСЕЦÐ', 'ИМЕ_ЛОКÐЛÐОГ_МЕСЕЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ЛОКÐЛÐИМЕСЕЦГЕÐ', 'ЛОКÐЛÐИ_МЕСЕЦ_ГЕÐ', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ЛОКÐЛÐИМЕСЕЦСКР', 'ЛОКÐЛÐИ_МЕСЕЦ_СКР', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ЛОКÐЛÐИДÐÐ', 'ЛОКÐЛÐИ_ДÐÐ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ЛОКÐЛÐИДÐÐ2', 'ЛОКÐЛÐИ_ДÐÐ2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ИМЕЛОКÐЛÐОГДÐÐÐ', 'ИМЕ_ЛОКÐЛÐОГ_ДÐÐÐ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ЛОКÐЛÐÐГОДИÐÐ', 'ЛОКÐЛÐÐ_ГОДИÐÐ', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ЛОКÐЛÐОВРЕМЕ', 'ЛОКÐЛÐО_ВРЕМЕ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ЛОКÐЛÐИСÐТ', 'ЛОКÐЛÐИ_СÐТ', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'БРОЈСТРÐÐИЦÐ', 'БРОЈ_СТРÐÐИЦÐ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'БРОЈЧЛÐÐÐКÐ', 'БРОЈ_ЧЛÐÐÐКÐ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'БРОЈДÐТОТЕКÐ', 'БРОЈ_ДÐТОТЕКÐ', 'БРОЈФÐЈЛОВÐ', 'БРОЈ_ФÐЈЛОВÐ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'БРОЈКОРИСÐИКÐ', 'БРОЈ_КОРИСÐИКÐ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'БРОЈÐКТИВÐИХКОРИСÐИКÐ', 'БРОЈ_ÐКТИВÐИХ_КОРИСÐИКÐ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'БРОЈИЗМЕÐÐ', 'БРОЈ_ИЗМЕÐÐ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'БРОЈПРЕГЛЕДÐ', 'БРОЈ_ПРЕГЛЕДÐ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ИМЕСТРÐÐИЦЕ', 'ИМЕ_СТРÐÐИЦЕ', 'СТРÐÐИЦÐ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ИМЕÐÐСТРÐÐИЦÐ', 'ИМЕÐÐ_СТРÐÐИЦÐ', 'СТРÐÐИЦЕ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ИМЕÐСКИПРОСТОР', 'ИМЕÐСКИ_ПРОСТОР', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ИМЕÐСКИПРОСТОРИ', 'ИМЕÐСКИ_ПРОСТОРИ', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'РÐЗГОВОР', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'РÐЗГОВОРИ', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ИМЕÐСКИПРОСТОРЧЛÐÐКÐ', 'ИМЕÐСКИ_ПРОСТОР_ЧЛÐÐКÐ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ИМЕÐСКИПРОСТОРЧЛÐÐÐКÐ', 'ИМЕÐСКИ_ПРОСТОР_ЧЛÐÐÐКÐ', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ПУÐОИМЕСТРÐÐИЦЕ', 'ПУÐОИМЕСТРÐÐЕ', 'ПУÐО_ИМЕ_СТРÐÐИЦЕ', 'ПУÐО_ИМЕ_СТРÐÐЕ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ПУÐÐИМЕÐÐСТРÐÐИЦÐ', 'ПУÐÐИМЕÐÐСТРÐÐÐ', 'ПУÐÐ_ИМЕÐÐ_СТРÐÐИЦÐ', 'ПУÐÐ_ИМЕÐÐ_СТРÐÐÐ', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ИМЕПОДСТРÐÐИЦЕ', 'ИМЕПОДСТРÐÐЕ', 'ИМЕ_ПОДСТРÐÐИЦЕ', 'ИМЕ_ПОДСТРÐÐЕ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ИМЕÐÐПОДСТРÐÐИЦÐ', 'ИМЕÐÐПОДСТРÐÐÐ', 'ИМЕÐÐ_ПОДСТРÐÐИЦÐ', 'ИМЕÐÐ_ПОДСТРÐÐÐ', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ИМЕОСÐОВЕ', 'ИМЕ_ОСÐОВЕ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ИМЕÐÐОСÐОВÐ', 'ИМЕÐÐ_ОСÐОВÐ', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ИМЕРÐЗГОВОРÐ', 'ИМЕ_РÐЗГОВОРÐ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ИМЕÐÐРÐЗГОВОРÐ', 'ИМЕÐÐ_РÐЗГОВОРÐ', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ИМЕЧЛÐÐКÐ', 'ИМЕ_ЧЛÐÐКÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ИМЕÐÐЧЛÐÐÐКÐ', 'ИМЕÐÐ_ЧЛÐÐÐКÐ', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'ПОР:', 'MSG:' ),
+ 'subst' => array( '0', 'ЗÐМЕÐИ:', 'ЗÐМЕÐÐ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'БЕЗБЕДÐÐЗÐМЕÐÐ', 'БЕЗБЕДÐÐ_ЗÐМЕÐÐ', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'ÐВПОР:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'мини', 'умањено', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'мини=$1', 'умањено=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'деÑно', 'д', 'right' ),
+ 'img_left' => array( '1', 'лево', 'л', 'left' ),
+ 'img_none' => array( '1', 'без', 'н', 'none' ),
+ 'img_width' => array( '1', '$1пиÑкел', '$1п', '$1px' ),
+ 'img_center' => array( '1', 'центар', 'ц', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'оквир', 'рам', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'безоквира', 'без_оквира', 'безрама', 'без_рама', 'frameless' ),
+ 'img_page' => array( '1', 'Ñтраница=$1', 'Ñтрана=$1', 'Ñтраница_$1', 'Ñтрана_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'уÑправно', 'уÑправно=$1', 'уÑправно_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'ивица', 'border' ),
+ 'img_baseline' => array( '1', 'оÑнова', 'baseline' ),
+ 'img_sub' => array( '1', 'под', 'sub' ),
+ 'img_super' => array( '1', 'Ñупер', 'super', 'sup' ),
+ 'img_top' => array( '1', 'врх', 'top' ),
+ 'img_text_top' => array( '1', 'врхтекÑта', 'врх_текÑта', 'text-top' ),
+ 'img_middle' => array( '1', 'Ñредина', 'middle' ),
+ 'img_bottom' => array( '1', 'дно', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'ÑрединатекÑта', 'Ñредина_текÑта', 'text-bottom' ),
+ 'img_link' => array( '1', 'веза=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'алт=$1', 'alt=$1' ),
+ 'int' => array( '0', 'ИÐТ:', 'INT:' ),
+ 'sitename' => array( '1', 'ИМЕСÐЈТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'ИП:', 'NS:' ),
+ 'localurl' => array( '0', 'ЛОКÐЛÐÐÐДРЕСÐ:', 'ЛОКÐЛÐÐ_ÐДРЕСÐ:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛОКÐЛÐЕÐДРЕСЕ:', 'ЛОКÐЛÐЕ_ÐДРЕСЕ:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'ПУТÐЊÐЧЛÐÐКÐ', 'ПУТÐЊÐ_ЧЛÐÐКÐ', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'ИМЕСЕРВЕРÐ', 'ИМЕ_СЕРВЕРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'СКРИПТÐ', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'ПУТÐЊÐСТИЛÐ', 'ПУТÐЊÐ_СТИЛÐ', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'РОД:', 'ЛИЦЕ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__БЕЗКÐ__', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__БЕЗЦЦ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ТРЕÐУТÐÐÐЕДЕЉÐ', 'ТРЕÐУТÐÐ_ÐЕДЕЉÐ', 'ТЕКУЋÐÐЕДЕЉÐ', 'ТЕКУЋÐ_ÐЕДЕЉÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ТРЕÐУТÐИДОВ', 'ТЕКУЋИДУÐ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ЛОКÐЛÐÐÐЕДЕЉÐ', 'ЛОКÐЛÐÐ_ÐЕДЕЉÐ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ЛОКÐЛÐИДУÐ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ИДРЕВИЗИЈЕ', 'ИД_РЕВИЗИЈЕ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДÐÐИЗМЕÐЕ', 'ДÐÐ_ИЗМЕÐЕ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДÐÐИЗМЕÐЕ2', 'ДÐÐ_ИЗМЕÐЕ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЕЦИЗМЕÐЕ', 'МЕСЕЦ_ИЗМЕÐЕ', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'МЕСЕЦИЗМЕÐЕ1', 'МЕСЕЦ_ИЗМЕÐЕ1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'ГОДИÐÐИЗМЕÐЕ', 'ГОДИÐÐ_ИЗМЕÐЕ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'ВРЕМЕИЗМЕÐЕ', 'ВРЕМЕ_ИЗМЕÐЕ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'КОРИСÐИКИЗМЕÐЕ', 'КОРИСÐИК_ИЗМЕÐЕ', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПУÐУРЛ:', 'ЦЕЛÐÐДРЕСÐ', 'ЦЕЛÐ_ÐДРЕСÐ', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПУÐУРЛЕ:', 'ЦЕЛЕÐДРЕСЕ', 'ЦЕЛЕ_ÐДРЕСЕ', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ЛЦПРВИ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'УЦПРВИ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ЛЦ:', 'LC:' ),
+ 'uc' => array( '0', 'УЦ:', 'UC:' ),
+ 'raw' => array( '0', 'ЧИСТ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ÐÐЗИВПРИКÐЗÐ', 'ÐÐЗИВ_ПРИКÐЗÐ', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Р', 'R' ),
+ 'newsectionlink' => array( '1', '__ÐОВÐВЕЗÐОДЕЉКÐ__', '__ÐОВÐ_ВЕЗÐ_ОДЕЉКÐ__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__БЕЗÐОВЕВЕЗЕОДЕЉКÐ__', '__БЕЗ_ÐОВЕ_ВЕЗЕ_ОДЕЉКÐ__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ТЕКУЋЕИЗДÐЊЕ', 'ТЕКУЋЕ_ИЗДÐЊЕ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'КОДИРÐЊЕÐДРЕСЕ', 'КОДИРÐЊЕ_ÐДРЕСЕ', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'КОДИРÐЊЕВЕЗЕ', 'КОДИРÐЊЕ_ВЕЗЕ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'ТЕКУЋИОТИСÐКВРЕМЕÐÐ', 'ТЕКУЋИ_ОТИСÐК_ВРЕМЕÐÐ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'ОТИСÐКВРЕМЕÐÐ', 'ОТИСÐК_ВРЕМЕÐÐ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'СМЕРОЗÐÐКЕ', 'СМЕР _ОЗÐÐКЕ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'contentlanguage' => array( '1', 'ЈЕЗИКСÐДРЖÐЈÐ', 'ЈЕЗИК_СÐДРЖÐЈÐ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'СТРÐÐИЦÐУИМЕÐСКОМПРОСТОРУ', 'СТРÐÐÐУИМЕÐСКОМПРОСТОРУ', 'СТРÐÐИЦÐ_У_ИМЕÐСКОМ_ПРОСТОРУ', 'СТРÐÐÐ_У_ИМЕÐСКОМ_ПРОСТОРУ', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'БРОЈÐДМИÐÐ', 'БРОЈ_ÐДМИÐÐ', 'NUMBEROFADMINS' ),
+ 'padleft' => array( '0', 'ПОРÐÐ’ÐÐЈЛЕВО', 'ПОРÐÐ’ÐÐЈ_ЛЕВО', 'PADLEFT' ),
+ 'padright' => array( '0', 'ПОРÐÐ’ÐÐЈДЕСÐО', 'ПОРÐÐ’ÐÐЈ_ДЕСÐО', 'PADRIGHT' ),
+ 'special' => array( '0', 'поÑебно', 'special' ),
+ 'filepath' => array( '0', 'ПУТÐЊÐДÐТОТЕКЕ', 'ПУТÐЊÐ_ДÐТОТЕКЕ', 'FILEPATH:' ),
+ 'tag' => array( '0', 'ознака', 'tag' ),
+ 'hiddencat' => array( '1', '__СÐКРИВЕÐÐКÐТ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'СТРÐÐИЦÐУКÐТЕГОРИЈИ', 'СТРÐÐÐУКÐТЕГОРИЈИ', 'СТРÐÐИЦÐ_У_КÐТЕГОРИЈИ', 'СТРÐÐÐ_У_КÐТЕГОРИЈИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'ВЕЛИЧИÐÐСТРÐÐИЦЕ', 'ВЕЛИЧИÐÐСТРÐÐЕ', 'ВЕЛИЧИÐÐ_СТРÐÐИЦЕ', 'ВЕЛИЧИÐÐ_СТРÐÐЕ', 'PAGESIZE' ),
+ 'index' => array( '1', '__ИÐДЕКС__', '__INDEX__' ),
+ 'noindex' => array( '1', '__БЕЗИÐДЕКСÐ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'БРОЈУГРУПИ', 'БРОЈ_У_ГРУПИ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__СТÐТИЧКОПРЕУСМЕРЕЊЕ__', 'СТÐТИЧКО_ПРЕУСМЕРЕЊЕ', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ÐИВОЗÐШТИТЕ', 'ÐИВО_ЗÐШТИТЕ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'форматдатума', 'формат_датума', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'ПУТÐЊÐ', 'PATH' ),
+ 'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
+ 'url_query' => array( '0', 'РЕДОСЛЕД', 'QUERY' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -664,6 +669,7 @@ $1',
'ok' => 'У реду',
'pagetitle' => '$1 – {{SITENAME}}',
'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '↠$1',
'retrievedfrom' => 'Преузето из „$1“',
'youhavenewmessages' => 'Имате $1 ($2).',
'newmessageslink' => 'нових порука',
@@ -763,22 +769,24 @@ $1',
'badarticleerror' => 'Ова радња Ñе не може извршити на овој Ñтраници.',
'cannotdelete' => 'Ðе могу да обришем Ñтраницу или датотеку „$1“.
Вероватно ју је неко други обриÑао.',
+'cannotdelete-title' => 'Ðе могу да обришем Ñтраницу „$1“',
'badtitle' => 'ÐеиÑправан наÑлов',
'badtitletext' => 'ÐаÑлов Ñтранице је неиÑправан, празан или је међујезички или међувики наÑлов погрешно повезан.
Можда Ñадржи знакове који Ñе не могу кориÑтити у наÑловима.',
-'perfcached' => 'Следећи подаци Ñу привремено мемориÑани и могу бити заÑтарели.',
-'perfcachedts' => 'Следећи подаци Ñу привремено мемориÑани и поÑледњи пут Ñу ажурирани $2 у $3.',
+'perfcached' => 'Следећи подаци Ñу кеширани и могу бити заÑтарели. Кеш Ñадржи највише {{PLURAL:$1|један резултат|$1 резултата|$1 резултата}}.',
+'perfcachedts' => 'Следећи подаци Ñу кеширани, а поÑледњи пут Ñу ажурирани $2 у $3. Кеш Ñадржи највише {{PLURAL:$4|један резултат|$4 резултата|$4 резултата}}.',
'querypage-no-updates' => 'Ðжурирање ове Ñтранице је тренутно онемогућено.
Подаци који Ñе овде налазе могу бити заÑтарели.',
'wrong_wfQuery_params' => 'ÐеиÑправни параметри за wfQuery()<br />
Функција: $1<br />
Упит: $2',
'viewsource' => 'Изворник',
-'viewsourcefor' => 'за $1',
+'viewsource-title' => 'Приказ извора Ñтранице $1',
'actionthrottled' => 'Радња је уÑпорена',
'actionthrottledtext' => 'У циљу борбе против непожељних порука, ограничене Ñу вам измене у одређеном времену, а управо Ñте прешли то ограничење. Покушајте поново за неколико минута.',
'protectedpagetext' => 'Ова Ñтраница је закључана за уређивања.',
'viewsourcetext' => 'Можете да погледате и умножите изворни текÑÑ‚ ове Ñтранице:',
+'viewyourtext' => "Можете да погледате и умножите извор '''ваших измена''' на овој Ñтраници:",
'protectedinterface' => 'Ова Ñтраница је заштићена јер Ñадржи текÑÑ‚ кориÑничког Ñучеља програма.',
'editinginterface' => "'''Упозорење:''' уређујете Ñтраницу која Ñе кориÑти за приказивање текÑта кориÑничког окружења.
Измене на овој Ñтраници ће утицати на Ñве кориÑнике.
@@ -884,6 +892,7 @@ $2',
'emailconfirmlink' => 'Потврдите Ñвоју е-адреÑу',
'invalidemailaddress' => 'Е-адреÑа не може бити прихваћена јер је неиÑправног облика.
УнеÑите иÑправну адреÑу или оÑтавите празно поље.',
+'cannotchangeemail' => 'Ðа овом викију не можете променити е-адреÑу налога.',
'accountcreated' => 'Ðалог је отворен',
'accountcreatedtext' => 'Ðалог {{GENDER:$1|кориÑника|кориÑнице|кориÑника}} $1 је отворен.',
'createaccount-title' => 'Отварање кориÑничког налога за {{SITENAME}}',
@@ -900,6 +909,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'Ðепозната грешка у функцији PHP mail().',
+'user-mail-no-addy' => 'Покушали Ñте да пошаљете поруку без е-адреÑе.',
# Change password dialog
'resetpass' => 'Промена лозинке',
@@ -922,32 +932,47 @@ $2',
'resetpass-temp-password' => 'Привремена лозинка:',
# Special:PasswordReset
-'passwordreset' => 'Обнављање лозинке',
-'passwordreset-text' => 'Попуните овај образац да биÑте примили е-поруку Ñа Ñвојим подацима за пријаву.',
-'passwordreset-legend' => 'Поништи лозинку',
-'passwordreset-disabled' => 'Обнављање лозинке је онемогућено на овом викију.',
-'passwordreset-pretext' => '{{PLURAL:$1||УнеÑите један од делова података иÑпод}}',
-'passwordreset-username' => 'КориÑничко име:',
-'passwordreset-domain' => 'Домен:',
-'passwordreset-email' => 'Е-адреÑа:',
-'passwordreset-emailtitle' => 'Детаљи налога на викију {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ðеко, вероватно ви, Ñа ИП адреÑе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).
+'passwordreset' => 'Обнављање лозинке',
+'passwordreset-text' => 'Попуните овај образац да биÑте примили е-поруку Ñа Ñвојим подацима за пријаву.',
+'passwordreset-legend' => 'Поништи лозинку',
+'passwordreset-disabled' => 'Обнављање лозинке је онемогућено на овом викију.',
+'passwordreset-pretext' => '{{PLURAL:$1||УнеÑите један од делова података иÑпод}}',
+'passwordreset-username' => 'КориÑничко име:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Погледати крајњу поруку?',
+'passwordreset-capture-help' => 'Ðко означите ову кућицу, е-порука Ñ Ð¿Ñ€Ð¸Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¾Ð¼ лозинком ће бити приказана и поÑлата кориÑнику.',
+'passwordreset-email' => 'Е-адреÑа:',
+'passwordreset-emailtitle' => 'Детаљи налога на викију {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Ðеко, вероватно ви, Ñа ИП адреÑе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).
Следећи {{PLURAL:$3|кориÑнички налог је повезан|кориÑнички налози Ñу повезани}} Ñ Ð¾Ð²Ð¾Ð¼ е-адреÑом:
$2
{{PLURAL:$3|Привремена лозинка иÑтиче|Привремене лозинке иÑтичу}} за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.
Пријавите Ñе и изаберите нову лозинку. Ðко је неко други захтевао ову радњу или Ñте Ñе Ñетили лозинке и не желите да је мењате, занемарите ову поруку.',
-'passwordreset-emailtext-user' => '{{GENDER:$1|КориÑник|КориÑница|КориÑник}} $1 је затражио подÑетник о подацима за пријаву на викију {{SITENAME}} ($4).
+'passwordreset-emailtext-user' => '{{GENDER:$1|КориÑник|КориÑница|КориÑник}} $1 је затражио подÑетник о подацима за пријаву на викију {{SITENAME}} ($4).
Следећи {{PLURAL:$3|кориÑнички налог је повезан|кориÑнички налози Ñу повезани}} Ñ Ð¾Ð²Ð¾Ð¼ е-адреÑом:
$2
{{PLURAL:$3|Привремена лозинка иÑтиче|Привремене лозинке иÑтичу}} за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.
Пријавите Ñе и изаберите нову лозинку. Ðко је неко други захтевао ову радњу или Ñте Ñе Ñетили лозинке и не желите да је мењате, занемарите ову поруку.',
-'passwordreset-emailelement' => 'КориÑничко име: $1
+'passwordreset-emailelement' => 'КориÑничко име: $1
Привремена лозинка: $2',
-'passwordreset-emailsent' => 'ПодÑетник о лозинци је поÑлат на вашу адреÑу.',
+'passwordreset-emailsent' => 'ПодÑетник о лозинци је поÑлат на вашу адреÑу.',
+'passwordreset-emailsent-capture' => 'ПоÑлат је подÑетник преко е-поште (приказан доле).',
+'passwordreset-emailerror-capture' => 'Ðаправљен је подÑетник за Ñлање преко е-поште (приказан доле), али га не могу поÑлати кориÑнику: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Промена е-адреÑе',
+'changeemail-header' => 'Промените е-адреÑу налога',
+'changeemail-text' => 'Попуните овај образац да биÑте променили Ñвоју е-адреÑу. Мораћете да унеÑете лозинку да потврдите измену.',
+'changeemail-no-info' => 'Морате бити пријављени да биÑте приÑтупили овој Ñтраници.',
+'changeemail-oldemail' => 'Тренутна е-адреÑа:',
+'changeemail-newemail' => 'Ðова е-адреÑа:',
+'changeemail-none' => '(ништа)',
+'changeemail-submit' => 'Промени',
+'changeemail-cancel' => 'Откажи',
# Edit page toolbar
'bold_sample' => 'Подебљан текÑÑ‚',
@@ -1019,9 +1044,6 @@ $2
Ваша блокирана ИП адреÑа је $3, а ИБ $5.
Ðаведите Ñве податке изнад при Ñтварању било каквих упита.",
'blockednoreason' => 'разлог није наведен',
-'blockedoriginalsource' => "Извор Ñтранице '''$1''' је приказан иÑпод:",
-'blockededitsource' => "ТекÑÑ‚ '''ваших измена''' на Ñтраници '''$1''' је приказан иÑпод:",
-'whitelistedittitle' => 'За уређивање је потребна пријава',
'whitelistedittext' => 'За уређивање Ñтранице је потребно да будете $1.',
'confirmedittext' => 'Морате да потврдите Ñвоју е-адреÑу пре уређивања Ñтраница.
ПоÑтавите и потврдите адреÑу преко [[Special:Preferences|подешавања]].',
@@ -1112,8 +1134,8 @@ $2
Ðко не желите да Ñе ваши текÑтови Ñлободно мењају и раÑподељују, не шаљите их овде.<br />
ИÑто тако обећавате да Ñте ви аутор текÑта, или да Ñте га умножили Ñ Ð¸Ð·Ð²Ð¾Ñ€Ð° који је у јавном влаÑништву (више на $1).
'''Ðе шаљите радове заштићене ауторÑким правима без дозволе!'''",
-'longpageerror' => "'''Грешка: текÑÑ‚ који Ñте унели је величине $1 килобајта, што је веће од дозвољених $2 килобајта.
-Страница не може бити Ñачувана.'''",
+'longpageerror' => "'''Грешка: текÑÑ‚ који Ñте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''
+Страница не може бити Ñачувана.",
'readonlywarning' => "'''Упозорење: база података је закључана ради одржавања, тако да нећете моћи да Ñачувате измене.
Ðајбоље би било да умножите текÑÑ‚ у уређивач текÑта и Ñачувате га за каÑније.'''
@@ -1283,8 +1305,6 @@ $2
'revdelete-unsuppress' => 'Уклони ограничења на враћеним изменама',
'revdelete-log' => 'Разлог:',
'revdelete-submit' => 'Примени на {{PLURAL:$1|изабрану измену|изабране измене}}',
-'revdelete-logentry' => 'је променио видљивоÑÑ‚ измене „[[$1]]â€',
-'logdelete-logentry' => 'је променио видљивоÑÑ‚ догађаја [[$1]]',
'revdelete-success' => "'''ВидљивоÑÑ‚ измене је ажурирана.'''",
'revdelete-failure' => "'''Ðе могу да ажурирам видљивоÑÑ‚ измене:'''
$1",
@@ -1296,15 +1316,6 @@ $1",
'revdel-restore-visible' => 'видљиве измене',
'pagehist' => 'ИÑторија Ñтранице',
'deletedhist' => 'ОбриÑана иÑторија',
-'revdelete-content' => 'Ñадржај',
-'revdelete-summary' => 'Ð¾Ð¿Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ðµ',
-'revdelete-uname' => 'кориÑничко име',
-'revdelete-restricted' => 'примењена ограничења за админиÑтраторе',
-'revdelete-unrestricted' => 'уклоњена ограничења за админиÑтраторе',
-'revdelete-hid' => 'Ñакривено: $1',
-'revdelete-unhid' => 'откривено: $1',
-'revdelete-log-message' => '$1 за $2 {{PLURAL:$2|измену|измене|измена}}',
-'logdelete-log-message' => '$1 за $2 {{PLURAL:$2|догађај|догађаја|догађаја}}',
'revdelete-hide-current' => 'Грешка при Ñакривању Ñтавке од $1, $2: ово је тренутна измена.
Ðе може бити Ñакривена.',
'revdelete-show-no-access' => 'Грешка при приказивању Ñтавке од $1, $2: означена је као „ограничена“.
@@ -1464,12 +1475,14 @@ $1",
'prefs-rc' => 'Скорашње измене',
'prefs-watchlist' => 'СпиÑак надгледања',
'prefs-watchlist-days' => 'Број дана у ÑпиÑку надгледања:',
-'prefs-watchlist-days-max' => 'Ðајвише Ñедам дана',
+'prefs-watchlist-days-max' => 'Ðајвише $1 {{PLURAL:$1|дан|дана|дана}}',
'prefs-watchlist-edits' => 'Ðајвећи број измена у проширеном ÑпиÑку надгледања:',
'prefs-watchlist-edits-max' => 'Ðајвећа вредноÑÑ‚ је хиљаду',
'prefs-watchlist-token' => 'Жетон ÑпиÑка надгледања:',
'prefs-misc' => 'Друга подешавања',
'prefs-resetpass' => 'Промени лозинку',
+'prefs-changeemail' => 'Промени е-адреÑу',
+'prefs-setemail' => 'ПоÑтави е-адреÑу',
'prefs-email' => 'ПоÑтавке е-поште',
'prefs-rendering' => 'Изглед',
'saveprefs' => 'Сачувај',
@@ -1531,6 +1544,7 @@ $1",
'yourrealname' => 'Право име:',
'yourlanguage' => 'Језик:',
'yourvariant' => 'Варијанта језика:',
+'prefs-help-variant' => 'Жељена варијанта или Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð·Ð° приказ Ñтраница Ñа Ñадржајем овог викија.',
'yournick' => 'Ðови потпиÑ:',
'prefs-help-signature' => "Коментаре на Ñтраницама за разговор потпишите Ñа ''<nowiki>~~~~</nowiki>''. Ови знакови ће бити претворени у ваш Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ð¸ тренутно време.",
'badsig' => 'ÐŸÐ¾Ñ‚Ð¿Ð¸Ñ Ñ˜Ðµ неиÑправан.
@@ -1573,7 +1587,7 @@ $1",
'userrights-lookup-user' => 'Управљање кориÑничким групама',
'userrights-user-editname' => 'УнеÑите кориÑничко име:',
'editusergroup' => 'Промени кориÑничке групе',
-'editinguser' => "Мењате кориÑничка права кориÑника '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Мењате кориÑничка права {{GENDER:$1|кориÑника|кориÑнице|кориÑника}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Промена кориÑничких група',
'saveusergroups' => 'Сачувај кориÑничке групе',
'userrights-groupsmember' => 'Члан:',
@@ -1668,13 +1682,13 @@ $1",
'right-autopatrol' => 'Ñамоозначавање измена као прегледане',
'right-patrolmarks' => 'прегледање ознака за патролирање унутар Ñкорашњих измена',
'right-unwatchedpages' => 'прегледање ÑпиÑка ненадгледаних Ñтраница',
-'right-trackback' => 'Ñлање извештаја',
'right-mergehistory' => 'Ñпајање иÑторија Ñтраница',
'right-userrights' => 'уређивање Ñвих кориÑничких права',
'right-userrights-interwiki' => 'уређивање кориÑничких права на другим викијима',
'right-siteadmin' => 'закључавање и откључавање базе података',
'right-override-export-depth' => 'извоз Ñтраница укључујући и повазене Ñтранице до дубине од пет веза',
'right-sendemail' => 'Ñлање е-порука другим кориÑницима',
+'right-passwordreset' => 'прегледање порука за обнављање лозинке',
# User rights log
'rightslog' => 'Дневник кориÑничких права',
@@ -1708,16 +1722,17 @@ $1",
'action-suppressionlog' => 'прегледање ове приватне иÑторије',
'action-block' => 'блокирање даљих измена овог кориÑника',
'action-protect' => 'мењање Ñтепена заштите ове Ñтранице',
+'action-rollback' => 'брзо враћање измена поÑледњег кориÑника који је мењао одређену Ñтраницу',
'action-import' => 'увоз ове Ñтранице Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³ викија',
'action-importupload' => 'увоз ове Ñтранице Ñлањем датотеке',
'action-patrol' => 'означавање туђих измена прегледаним',
'action-autopatrol' => 'Ñамоозначавање измена прегледаним',
'action-unwatchedpages' => 'прегледање ÑпиÑка ненадгледаних Ñтраница',
-'action-trackback' => 'Ñлање извештаја',
'action-mergehistory' => 'Ñпајање иÑторије ове Ñтранице',
'action-userrights' => 'уређивање Ñвих кориÑничких права',
'action-userrights-interwiki' => 'уређивање кориÑничких права на другим викијима',
'action-siteadmin' => 'закључавање или откључавање базе података',
+'action-sendemail' => 'Ñлање е-порука',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|измена|измене|измена}}',
@@ -1747,11 +1762,11 @@ $1",
'newpageletter' => 'Ð',
'boteditletter' => 'б',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|кориÑник надгледа|кориÑника надгледају|кориÑника надгледају}}]',
'rc_categories' => 'Ограничи на категорије (раздвоји Ñ ÑƒÑправном цртом)',
'rc_categories_any' => 'Све',
'rc-change-size' => '$1',
+'rc-change-size-new' => '$1 {{PLURAL:$1|бајт|бајта|бајтова}} поÑле измене',
'newsectionsummary' => '/* $1 */ нови одељак',
'rc-enhanced-expand' => 'Прикажи детаље (јаваÑкрипт)',
'rc-enhanced-hide' => 'Сакриј детаље',
@@ -1761,7 +1776,6 @@ $1",
'recentchangeslinked-feed' => 'Сродне измене',
'recentchangeslinked-toolbox' => 'Сродне измене',
'recentchangeslinked-title' => 'Сродне измене Ñа „$1“',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'Ðема измена на повезаним Ñтраницама у заданом периоду.',
'recentchangeslinked-summary' => "Ова поÑебна Ñтраница приказује ÑпиÑак поÑледњих измена на Ñтраницама које Ñу повезане (или чланови одређене категорије).
Странице Ñ [[Special:Watchlist|вашег ÑпиÑка надгледања]] Ñу '''подебљане'''.",
@@ -1807,6 +1821,7 @@ $1",
'minlength1' => 'Ðазив датотеке мора имати барем један знак.',
'illegalfilename' => 'Датотека „$1“ Ñадржи знакове који ниÑу дозвољени у називима Ñтраница.
Промените назив датотеке и поново је пошаљите.',
+'filename-toolong' => 'Ðазиви датотека могу имати највише 240 бајтова.',
'badfilename' => 'Ðазив датотеке је промењен у „$1“.',
'filetype-mime-mismatch' => 'ЕкÑтензија „.$1“ не одговара препознатој врÑти MIME датотеке ($2).',
'filetype-badmime' => 'Датотеке MIME врÑте „$1“ није дозвољено Ñлати.',
@@ -1923,6 +1938,41 @@ $1',
'upload-unknown-size' => 'Ðепозната величина',
'upload-http-error' => 'Дошло је до HTTP грешке: $1',
+# File backend
+'backend-fail-stream' => 'Ðе могу да емитујем датотеку $1.',
+'backend-fail-backup' => 'Ðе могу да направим резерву датотеке $1.',
+'backend-fail-notexists' => 'Датотека $1 не поÑтоји.',
+'backend-fail-hashes' => 'Ðе могу да добијем диÑперзије датотеке за упоређивање.',
+'backend-fail-notsame' => 'Већ поÑтоји неиÑтоветна датотека – $1.',
+'backend-fail-invalidpath' => '$1 није иÑправна путања за Ñкладиштење.',
+'backend-fail-delete' => 'Ðе могу да обришем датотеку $1.',
+'backend-fail-alreadyexists' => 'Датотека $1 већ поÑтоји.',
+'backend-fail-store' => 'Ðе могу да ÑмеÑтим датотеку $1 у $2.',
+'backend-fail-copy' => 'Ðе могу да умножим датотеку $1 у $2.',
+'backend-fail-move' => 'Ðе могу да премеÑтим датотеку $1 у $2.',
+'backend-fail-opentemp' => 'Ðе могу да отворим привремену датотеку.',
+'backend-fail-writetemp' => 'Ðе могу да пишем у привременој датотеци.',
+'backend-fail-closetemp' => 'Ðе могу да затворим привремену датотеку.',
+'backend-fail-read' => 'Ðе могу да прочитам датотеку $1.',
+'backend-fail-create' => 'Ðе могу да направим датотеку $1.',
+'backend-fail-readonly' => 'Складишна оÑнова „$1“ тренутно не може да Ñе запиÑује. Ðаведени разлог глаÑи: „$2“',
+'backend-fail-synced' => 'Датотека „$1“ је недоÑледна између унутрашњих Ñкладишних оÑнова',
+'backend-fail-connect' => 'Ðе могу да Ñе повежем Ñа Ñкладишном оÑновом „$1“.',
+'backend-fail-internal' => 'Дошло је до непознате грешке у Ñкладишној оÑнови „$1“.',
+'backend-fail-contenttype' => 'Ðе могу да утврдим какав Ñадржај има датотека коју треба да ÑмеÑтим у „$1“.',
+'backend-fail-batchsize' => 'Складишна оÑнова је добила блокаду од $1 {{PLURAL:$1|операције|операције|операција}}; ограничење је $2 {{PLURAL:$2|операција|операције|операција}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ðе могу да откључам „$1“ јер није закључан.',
+'lockmanager-fail-closelock' => 'Ðе могу да затворим катанац за „$1“.',
+'lockmanager-fail-deletelock' => 'Ðе могу да обришем катанац за „$1“.',
+'lockmanager-fail-acquirelock' => 'Ðе могу да добијем катанац за „$1“.',
+'lockmanager-fail-openlock' => 'Ðе могу да отворим катанац за „$1“.',
+'lockmanager-fail-releaselock' => 'Ðе могу да оÑлободим катанац за „$1“.',
+'lockmanager-fail-db-bucket' => 'Ðе могу да контактирам Ñ Ð´Ð¾Ð²Ð¾Ñ™Ð½Ð¾ катанаца у канти $1.',
+'lockmanager-fail-db-release' => 'Ðе могу да оÑлободим катанце у бази $1.',
+'lockmanager-fail-svr-release' => 'Ðе могу да оÑлободим катанце на Ñерверу $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Дошло је до грешке при отварању датотеке за проверу ZIP архиве.',
'zip-wrong-format' => 'Ðаведена датотека није формата ZIP.',
@@ -1939,6 +1989,7 @@ $1',
'uploadstash-badtoken' => 'Извршавање дате радње није уÑпело. Разлог томе може бити иÑтек времена за уређивање. Покушајте поново.',
'uploadstash-errclear' => 'Чишћење датотека није уÑпело.',
'uploadstash-refresh' => 'ОÑвежи ÑпиÑак датотека',
+'invalid-chunk-offset' => 'ÐеиÑправна полазна тачка',
# img_auth script messages
'img-auth-accessdenied' => 'ПриÑтуп је одбијен',
@@ -2040,7 +2091,6 @@ $1',
# File reversion
'filerevert' => 'Врати $1',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'Врати датотеку',
'filerevert-intro' => "Враћате датотеку '''[[Media:$1|$1]]''' на [$4 издање од $2; $3].",
'filerevert-comment' => 'Разлог:',
@@ -2050,24 +2100,24 @@ $1',
'filerevert-badversion' => 'Ðе поÑтоји раније локално издање датотеке Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ð¼ временÑким подацима.',
# File deletion
-'filedelete' => 'Обриши $1',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'Обриши датотеку',
-'filedelete-intro' => "Бришете датотеку '''[[Media:$1|$1]]''' заједно Ñ ÑšÐµÐ½Ð¾Ð¼ иÑторијом.",
-'filedelete-intro-old' => "Бришете верзију датотеке '''[[Media:$1|$1]]''' од [$4 $2; $3].",
-'filedelete-comment' => 'Разлог:',
-'filedelete-submit' => 'Обриши',
-'filedelete-success' => "Датотека '''$1''' је обриÑана.",
-'filedelete-success-old' => "Издање '''[[Media:$1|$1]]''' од $2, $3 је обриÑано.",
-'filedelete-nofile' => "Датотека '''$1''' не поÑтоји.",
-'filedelete-nofile-old' => "Ðе поÑтоји архивирано издање датотеке '''$1''' Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ð¼ оÑобинама.",
-'filedelete-otherreason' => 'Други/додатни разлог:',
-'filedelete-reason-otherlist' => 'Други разлог',
-'filedelete-reason-dropdown' => '*Ðајчешћи разлози бриÑања
+'filedelete' => 'Обриши $1',
+'filedelete-legend' => 'Обриши датотеку',
+'filedelete-intro' => "Бришете датотеку '''[[Media:$1|$1]]''' заједно Ñ ÑšÐµÐ½Ð¾Ð¼ иÑторијом.",
+'filedelete-intro-old' => "Бришете верзију датотеке '''[[Media:$1|$1]]''' од [$4 $2; $3].",
+'filedelete-comment' => 'Разлог:',
+'filedelete-submit' => 'Обриши',
+'filedelete-success' => "Датотека '''$1''' је обриÑана.",
+'filedelete-success-old' => "Издање '''[[Media:$1|$1]]''' од $2, $3 је обриÑано.",
+'filedelete-nofile' => "Датотека '''$1''' не поÑтоји.",
+'filedelete-nofile-old' => "Ðе поÑтоји архивирано издање датотеке '''$1''' Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ð¼ оÑобинама.",
+'filedelete-otherreason' => 'Други/додатни разлог:',
+'filedelete-reason-otherlist' => 'Други разлог',
+'filedelete-reason-dropdown' => '*Ðајчешћи разлози бриÑања
** Кршење ауторÑких права
** Дупликати датотека',
-'filedelete-edit-reasonlist' => 'Уреди разлоге бриÑања',
-'filedelete-maintenance' => 'БриÑање и враћање датотека је привремено онемогућено током одржавања.',
+'filedelete-edit-reasonlist' => 'Уреди разлоге бриÑања',
+'filedelete-maintenance' => 'БриÑање и враћање датотека је привремено онемогућено током одржавања.',
+'filedelete-maintenance-title' => 'Ðе могу да обришем датотеку',
# MIME search
'mimesearch' => 'MIME претрага',
@@ -2167,6 +2217,8 @@ $1',
'wantedpages' => 'Тражене Ñтранице',
'wantedpages-badtitle' => 'ÐеиÑправан наÑлов у низу резултата: $1',
'wantedfiles' => 'Тражене датотеке',
+'wantedfiletext-cat' => 'Следеће датотеке Ñе кориÑте, али не поÑтоје. Датотеке из других ризница могу бити наведене иако не поÑтоје. Такве датотеке ће бити <del>поништене</del> Ñа ÑпиÑка. Поред тога, Ñтранице које Ñадрже непоÑтојеће датотеке Ñе налазе [[:$1|овде]].',
+'wantedfiletext-nocat' => 'Следеће датотеке Ñе кориÑте, али не поÑтоје. Датотеке из других ризница могу бити наведене иако не поÑтоје. Такве датотеке ће бити <del>поништене</del> Ñа ÑпиÑка.',
'wantedtemplates' => 'Тражени шаблони',
'mostlinked' => 'Странице Ñ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ веза',
'mostlinkedcategories' => 'Чланци Ñ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ категорија',
@@ -2175,6 +2227,7 @@ $1',
'mostimages' => 'Датотеке Ñ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ веза',
'mostrevisions' => 'Странице Ñ Ð½Ð°Ñ˜Ð²Ð¸ÑˆÐµ измена',
'prefixindex' => 'Све Ñтранице Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом',
+'prefixindex-namespace' => 'Све Ñтранице Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚ÐºÐ¾Ð¼ (именÑки проÑтор $1)',
'shortpages' => 'Кратке Ñтранице',
'longpages' => 'Дугачке Ñтранице',
'deadendpages' => 'Странице без унутрашњих веза',
@@ -2286,12 +2339,8 @@ $1',
'activeusers-noresult' => 'КориÑник није пронађен.',
# Special:Log/newusers
-'newuserlogpage' => 'Дневник нових кориÑника',
-'newuserlogpagetext' => 'Ово је иÑторија нових кориÑника.',
-'newuserlog-byemail' => 'лозинка је поÑлата е-поштом',
-'newuserlog-create-entry' => 'Ðови кориÑник',
-'newuserlog-create2-entry' => '{{GENDER:|је отворио|је отворила|је отворио}} налог за $1',
-'newuserlog-autocreate-entry' => 'Ðалог је аутоматÑки направљен',
+'newuserlogpage' => 'Дневник нових кориÑника',
+'newuserlogpagetext' => 'Ово је иÑторија нових кориÑника.',
# Special:ListGroupRights
'listgrouprights' => 'Права кориÑничких група',
@@ -2322,7 +2371,7 @@ $1',
'emailpagetext' => 'КориÑтите овај образац да пошаљете е-поруку овом кориÑнику.
Е-адреÑа коју Ñте унели у [[Special:Preferences|подешавањима]] ће бити приказана као адреÑа пошиљаоца, тако да ће прималац поруке моћи да вам одговори.',
'usermailererror' => 'Дошло је до грешке при Ñлању поруке:',
-'defemailsubject' => '{{SITENAME}} е-пошта',
+'defemailsubject' => '{{SITENAME}} е-адреÑа {{GENDER:$1|кориÑника|кориÑнице|кориÑника}} $1',
'usermaildisabled' => 'КориÑничка е-пошта је онемогућена',
'usermaildisabledtext' => 'Ðе можете да шаљете е-поруке другим кориÑницима на овом викију',
'noemailtitle' => 'Ðема е-адреÑе',
@@ -2379,7 +2428,7 @@ $1',
'watchmethod-list' => 'проверава Ñе да ли има Ñкорашњих измена у надгледаним Ñтраницама',
'watchlistcontains' => 'Ваш ÑпиÑак надгледања Ñадржи $1 {{PLURAL:$1|Ñтраницу|Ñтранице|Ñтраница}}.',
'iteminvalidname' => 'Проблем Ñа Ñтавком „$1“. ÐеиÑправан назив.',
-'wlnote' => "ИÑпод {{PLURAL:$1|је поÑледња измена|Ñу поÑледње '''$1''' измене|је поÑледњих '''$1''' измена}} начињених {{PLURAL:$2|претходни Ñат|у поÑледња '''$2''' Ñата|у поÑледњих '''$2''' Ñати}}.",
+'wlnote' => "ИÑпод {{PLURAL:$1|је поÑледња измена|Ñу поÑледње '''$1''' измене|је поÑледњих '''$1''' измена}} у {{PLURAL:$2|претходном Ñату|претходна '''$2''' Ñата|претходних '''$2''' Ñати}}, закључно Ñа $3, $4.",
'wlshowlast' => 'Прикажи поÑледњих $1 Ñати, $2 дана, $3',
'watchlist-options' => 'ПоÑтавке ÑпиÑка надгледања',
@@ -2437,7 +2486,6 @@ $UNWATCHURL
'exbeforeblank' => 'Ñадржај пре бриÑања је био: „$1“',
'exblank' => 'Ñтраница је била празна',
'delete-confirm' => 'БриÑање Ñтранице „$1“',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Обриши',
'historywarning' => "'''Упозорење:''' Ñтраница коју желите да обришете има иÑторију Ñ Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð¶Ð½Ð¾ $1 {{PLURAL:$1|изменом|измене|измена}}:",
'confirmdeletetext' => 'Управо ћете обриÑати Ñтраницу, укључујући и њену иÑторију.
@@ -2446,8 +2494,6 @@ $UNWATCHURL
'actionfailed' => 'Радња није уÑпела',
'deletedtext' => "Страница „$1“ је обриÑана.
Погледајте ''$2'' за више детаља.",
-'deletedarticle' => 'је обриÑао „[[$1]]“',
-'suppressedarticle' => '{{GENDER:|је Ñакрио|је Ñакрила|је Ñакрио}} „[[$1]]“',
'dellogpage' => 'Дневник бриÑања',
'dellogpagetext' => 'ИÑпод је ÑпиÑак поÑледњих бриÑања.',
'deletionlog' => 'иÑторија бриÑања',
@@ -2496,8 +2542,10 @@ $UNWATCHURL
'unprotectedarticle' => '{{GENDER:|је уклонио|је уклонила|је уклонио}} заштиту Ñа Ñтранице „[[$1]]“',
'movedarticleprotection' => '{{GENDER:|је премеÑтио|је премеÑтила|је премеÑтио}} поÑтавке заштите Ñа „[[$2]]“ на „[[$1]]“',
'protect-title' => 'Степен заштите за „$1“',
+'protect-title-notallowed' => 'Преглед Ñтепена заштите за „$1“',
'prot_1movedto2' => '{{GENDER:|је премеÑтио|је премеÑтила|је премеÑтио}} [[$1]] у [[$2]]',
-'protect-backlink' => '↠$1',
+'protect-badnamespace-title' => 'Ðезаштитљив именÑки проÑтор',
+'protect-badnamespace-text' => 'Странице у овом именÑком проÑтору Ñе не могу заштитити.',
'protect-legend' => 'Потврдите заштиту',
'protectcomment' => 'Разлог:',
'protectexpiry' => 'ИÑтиче:',
@@ -2519,6 +2567,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Само админиÑтратори',
'protect-summary-cascade' => 'преноÑива заштита',
'protect-expiring' => 'иÑтиче $1 (UTC)',
+'protect-expiring-local' => 'иÑтиче $1',
'protect-expiry-indefinite' => 'никада',
'protect-cascade' => 'Заштити Ñве Ñтранице које Ñу укључене у ову (преноÑива заштита)',
'protect-cantedit' => 'Ðе можете мењати Ñтепене заштите ове Ñтранице јер немате овлашћења за уређивање.',
@@ -2579,7 +2628,6 @@ $UNWATCHURL
'undeletereset' => 'Поништи',
'undeleteinvert' => 'Обрни избор',
'undeletecomment' => 'Разлог:',
-'undeletedarticle' => '{{GENDER:|је вратио|је вратила|је вратио}} „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|Измена је враћена|$1 измене Ñу враћене|$1 измена је враћено}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека|датотеке|датотека}} је враћено',
'undeletedfiles' => '{{PLURAL:$1|Датотека је враћена|$1 датотеке Ñу враћене|$1 датотека је враћено}}',
@@ -2588,6 +2636,7 @@ $UNWATCHURL
Погледајте [[Special:Log/delete|иÑторију бриÑања]] за запиÑе о Ñкорашњим бриÑањима и враћањима.",
'undelete-header' => 'Погледајте [[Special:Log/delete|иÑторијат бриÑања]] за недавно обриÑане Ñтранице.',
+'undelete-search-title' => 'Претрага обриÑаних Ñтраница',
'undelete-search-box' => 'Претражи обриÑане Ñтранице',
'undelete-search-prefix' => 'Прикажи Ñтранице које почињу Ñа:',
'undelete-search-submit' => 'Претражи',
@@ -2597,6 +2646,7 @@ $UNWATCHURL
'undelete-cleanup-error' => 'Грешка при бриÑању некоришћене архиве „$1“.',
'undelete-missing-filearchive' => 'Ðе могу да вратим архиву Ñ Ð˜Ð‘ $1 јер Ñе она не налази у бази података.
Можда је већ била враћена.',
+'undelete-error' => 'Дошло је до грешке при враћању обриÑане Ñтранице',
'undelete-error-short' => 'Грешка при враћању датотеке: $1',
'undelete-error-long' => 'Дошло је до грешке при враћању датотеке:
@@ -2643,7 +2693,6 @@ $1',
'whatlinkshere' => 'Шта је повезано овде',
'whatlinkshere-title' => 'Странице које Ñу повезане Ñа „$1“',
'whatlinkshere-page' => 'Страница:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Следеће Ñтранице имају везу до '''[[:$1]]''':",
'nolinkshere' => "Ðиједна Ñтраница није повезана Ñа: '''[[:$1]]'''.",
'nolinkshere-ns' => "Ðиједна Ñтраница не води до '''[[:$1]]''' у изабраном именÑком проÑтору.",
@@ -2718,6 +2767,7 @@ $1',
'blocklist-userblocks' => 'Сакриј блокирања налога',
'blocklist-tempblocks' => 'Сакриј привремена блокирања',
'blocklist-addressblocks' => 'Сакриј појединачна блокирања ИП адреÑе',
+'blocklist-rangeblocks' => 'Сакриј блокирања опÑега',
'blocklist-timestamp' => 'Време и датум',
'blocklist-target' => 'КориÑник',
'blocklist-expiry' => 'ИÑтиче',
@@ -2740,6 +2790,7 @@ $1',
'unblocklink' => 'деблокирај',
'change-blocklink' => 'промени блокирање',
'contribslink' => 'доприноÑи',
+'emaillink' => 'пошаљи е-поруку',
'autoblocker' => 'Самоблокирани Ñте јер делите ИП адреÑу Ñ {{GENDER:$1|кориÑником|кориÑницом|кориÑником}} [[User:$1|$1]].
Разлог блокирања: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'Дневник блокирања',
@@ -2870,9 +2921,6 @@ $1',
'movepage-page-moved' => 'Страница $1 је премештена у $2.',
'movepage-page-unmoved' => 'Страница $1 не може да Ñе премеÑти на $2.',
'movepage-max-pages' => 'Ðајвише $1 {{PLURAL:$1|Ñтраница је премештена|Ñтранице Ñу премештене|Ñтраница је премештено}}, и више не може да буде аутоматÑки премештено.',
-'1movedto2' => 'је променио име чланку [[$1]] у [[$2]]',
-'1movedto2_redir' => 'је променио име чланку [[$1]] у [[$2]] путем преуÑмерења',
-'move-redirect-suppressed' => 'преуÑмерење није направљено',
'movelogpage' => 'Дневник премештања',
'movelogpagetext' => 'ИÑпод Ñе налази ÑпиÑак премештања Ñтраница.',
'movesubpage' => '{{PLURAL:$1|ПодÑтраница|ПодÑтранице|ПодÑтраница}}',
@@ -2886,7 +2934,7 @@ $1',
Одредишна Ñтраница „[[:$1]]“ већ поÑтоји.
Желите ли да је обришете да биÑте оÑлободили меÑто за преуÑмерење?',
'delete_and_move_confirm' => 'Да, обриши Ñтраницу',
-'delete_and_move_reason' => 'ОбриÑано како би Ñе направило меÑто за премештање',
+'delete_and_move_reason' => 'ОбриÑано да Ñе оÑлободи меÑто за премештање из „[[$1]]“',
'selfmove' => 'Изворни и одредишни наÑлови Ñу иÑтоветни;
не могу да премеÑтим Ñтраницу преко Ñаме Ñебе.',
'immobile-source-namespace' => 'Ðе могу да премеÑтим Ñтранице у именÑком проÑтору „$1“',
@@ -2917,9 +2965,11 @@ $1',
Да биÑте извезли Ñтранице, унеÑите називе у оквиру иÑпод, Ñ Ñ˜ÐµÐ´Ð½Ð¸Ð¼ наÑловом по реду, и изаберите да ли желите текућу измену и Ñве оÑтале, или Ñамо текућу измену Ñ Ð¿Ð¾Ð´Ð°Ñ†Ð¸Ð¼Ð° о поÑледњој измени.
У другом Ñлучају, можете кориÑтити и везу, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за Ñтраницу [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Извези Ñве Ñтранице',
'exportcuronly' => 'Укључи Ñамо текућу измену, не целу иÑторију',
'exportnohistory' => "----
'''Ðапомена:''' извоз пуне иÑторије Ñтраница преко овог обраÑца је онемогућено из техничких разлога.",
+'exportlistauthors' => 'Укључи целокупан ÑпиÑак доприноÑилаца за Ñваку Ñтраницу',
'export-submit' => 'Извези',
'export-addcattext' => 'Додај Ñтранице из категорије:',
'export-addcat' => 'Додај',
@@ -2952,6 +3002,8 @@ $1',
'thumbnail_error' => 'Грешка при Ñтварању минијатуре: $1',
'djvu_page_error' => 'DjVu Ñтраница је недоÑтупна',
'djvu_no_xml' => 'Ðе могу да преузмем XML за датотеку DjVu.',
+'thumbnail-temp-create' => 'Ðе могу да направим привремену датотеку минијатуре',
+'thumbnail-dest-create' => 'Ðе могу да Ñачувам минијатуру у одредишту',
'thumbnail_invalid_params' => 'ÐеиÑправни параметри за минијатуру',
'thumbnail_dest_directory' => 'Ðе могу да направим одредишну фаÑциклу',
'thumbnail_image-type' => 'Ð’Ñ€Ñта Ñлике није подржана',
@@ -3000,6 +3052,11 @@ $1',
'import-token-mismatch' => 'Губитак података о ÑеÑији.
Покушајте поново.',
'import-invalid-interwiki' => 'Ðе могу да увозим Ñ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð³ викија.',
+'import-error-edit' => 'Страница „$1“ није увезена јер вам није дозвољено да је уређујете.',
+'import-error-create' => 'Страница „$1“ није увезена јер вам није дозвољено да је направите.',
+'import-error-interwiki' => 'Ðе могу да увезем Ñтраницу „$1“ јер је њен назив резервиÑан за Ñпољно повезивање (међувики).',
+'import-error-special' => 'Ðе могу да увезем Ñтраницу „$1“ јер она припада поÑебном именÑком проÑтору које не прихвата Ñтранице.',
+'import-error-invalid' => 'Ðе могу да увезем Ñтраницу „$1“ јер је њен назив неиÑправан.',
# Import log
'importlogpage' => 'Дневник увоза',
@@ -3009,72 +3066,85 @@ $1',
'import-logentry-interwiki' => 'премештено Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³ викија: $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|измена|измене|измена}} од $2',
+# JavaScriptTest
+'javascripttest' => 'ЈаваÑкрипт теÑÑ‚',
+'javascripttest-disabled' => 'Ова функција је онемогућена.',
+'javascripttest-title' => 'Извршавање теÑтова за $1',
+'javascripttest-pagetext-noframework' => 'Ова Ñтраница је резервиÑана за извршавање јаваÑкрипт теÑтова.',
+'javascripttest-pagetext-unknownframework' => 'Ðепознати радни оквир „$1“.',
+'javascripttest-pagetext-frameworks' => 'Изаберите један од Ñледећих радних оквира: $1',
+'javascripttest-pagetext-skins' => 'Изаберите Ñ ÐºÐ¾Ñ˜Ð¾Ð¼ темом желите да покренете пробу:',
+'javascripttest-qunit-intro' => 'Погледајте [$1 документацију за теÑтирање] на mediawiki.org.',
+'javascripttest-qunit-heading' => 'Медијавикијин пакет за теÑтирање – QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ваша кориÑничка Ñтраница',
-'tooltip-pt-anonuserpage' => 'КориÑничка Ñтраница за ИП адреÑу Ñ ÐºÐ¾Ñ˜Ðµ уређујете',
-'tooltip-pt-mytalk' => 'Ваша Ñтраница за разговор',
-'tooltip-pt-anontalk' => 'Разговор о изменама Ñ Ð¾Ð²Ðµ ИП адреÑе',
-'tooltip-pt-preferences' => 'Ваша подешавања',
-'tooltip-pt-watchlist' => 'СпиÑак Ñтраница које надгледате',
-'tooltip-pt-mycontris' => 'СпиÑак ваших доприноÑа',
-'tooltip-pt-login' => 'Препоручујемо вам да Ñе пријавите, иако то није обавезно.',
-'tooltip-pt-anonlogin' => 'Препоручујемо вам да Ñе пријавите, иако то није обавезно.',
-'tooltip-pt-logout' => 'Одјавите Ñе',
-'tooltip-ca-talk' => 'Разговор о Ñтраници Ñа Ñадржајем',
-'tooltip-ca-edit' => 'Можете да уређујете ову Ñтраницу. КориÑтите претпреглед пре Ñнимања',
-'tooltip-ca-addsection' => 'Започните нови одељак',
-'tooltip-ca-viewsource' => 'Ова Ñтраница је закључана. Можете да видите изворни код.',
-'tooltip-ca-history' => 'Претходне верзије ове Ñтранице',
-'tooltip-ca-protect' => 'Заштитите ову Ñтраницу',
-'tooltip-ca-unprotect' => 'Промени заштиту ове Ñтранице',
-'tooltip-ca-delete' => 'Обришите ову Ñтраницу',
-'tooltip-ca-undelete' => 'Врати измене направљене на овој Ñтраници пре него што буде обриÑана',
-'tooltip-ca-move' => 'ПремеÑти ову Ñтраницу',
-'tooltip-ca-watch' => 'Додај ову Ñтраницу на ÑпиÑак надгледања',
-'tooltip-ca-unwatch' => 'Уклони ову Ñтраницу Ñа ÑпиÑка надгледања',
-'tooltip-search' => 'Претрага',
-'tooltip-search-go' => 'Идите на Ñтраницу Ñ Ð¾Ð²Ð¸Ð¼ именом, ако поÑтоји',
-'tooltip-search-fulltext' => 'Претражите Ñтранице Ñ Ð¾Ð²Ð¸Ð¼ текÑтом',
-'tooltip-p-logo' => 'ПоÑетите наÑловну Ñтрану',
-'tooltip-n-mainpage' => 'ПоÑетите наÑловну Ñтрану',
-'tooltip-n-mainpage-description' => 'ПоÑетите наÑловну Ñтрану',
-'tooltip-n-portal' => 'О пројекту, шта можете да радите и где да пронађете Ñтвари',
-'tooltip-n-currentevents' => 'Сазнајте више о текућим догађајима',
-'tooltip-n-recentchanges' => 'СпиÑак Ñкорашњих измена на викију',
-'tooltip-n-randompage' => 'Отворите Ñлучајну Ñтраницу',
-'tooltip-n-help' => 'МеÑто где можете да Ñе информишете',
-'tooltip-t-whatlinkshere' => 'СпиÑак Ñвих Ñтраница које воде овде',
-'tooltip-t-recentchangeslinked' => 'Скорашње измене на Ñтраницама које Ñу повезана Ñ Ð¾Ð²Ð¾Ð¼ Ñтраницом',
-'tooltip-feed-rss' => 'RSS довод ове Ñтранице',
-'tooltip-feed-atom' => 'Ðтом довод ове Ñтранице',
-'tooltip-t-contributions' => 'Погледајте ÑпиÑак доприноÑа овог кориÑника',
-'tooltip-t-emailuser' => 'Пошаљите е-поруку овом кориÑнику',
-'tooltip-t-upload' => 'Пошаљите датотеке',
-'tooltip-t-specialpages' => 'СпиÑак Ñвих поÑебних Ñтраница',
-'tooltip-t-print' => 'Издање за штампање ове Ñтранице',
-'tooltip-t-permalink' => 'Стална веза ка овој измени Ñтранице',
-'tooltip-ca-nstab-main' => 'Погледајте Ñтраницу Ñа Ñадржајем',
-'tooltip-ca-nstab-user' => 'Погледајте кориÑничку Ñтраницу',
-'tooltip-ca-nstab-media' => 'Погледајте мултимедијалну датотеку',
-'tooltip-ca-nstab-special' => 'Ово је поÑебна Ñтраница. Ðе можете је мењати.',
-'tooltip-ca-nstab-project' => 'Погледајте Ñтраницу пројекта',
-'tooltip-ca-nstab-image' => 'Прикажи Ñтрану датотеке',
-'tooltip-ca-nstab-mediawiki' => 'Погледајте ÑиÑтемÑку поруку',
-'tooltip-ca-nstab-template' => 'Погледајте шаблон',
-'tooltip-ca-nstab-help' => 'Погледајте Ñтраницу за помоћ',
-'tooltip-ca-nstab-category' => 'Погледајте Ñтраницу категорија',
-'tooltip-minoredit' => 'Означите измену као мању',
-'tooltip-save' => 'Сачувајте измене које Ñте направили',
-'tooltip-preview' => 'Прегледајте Ñвоје измене. Пожељно је да кориÑтите ово дугме пре чувања',
-'tooltip-diff' => 'Погледајте Ñве измене које Ñте направили на текÑту',
-'tooltip-compareselectedversions' => 'Погледаjте разлике између две изабране измене ове Ñтранице.',
-'tooltip-watch' => 'Додајте ову Ñтраницу на ÑпиÑак надгледања',
-'tooltip-recreate' => 'Поново направите Ñтраницу иако је обриÑана',
-'tooltip-upload' => 'Започните отпремање',
-'tooltip-rollback' => '„Врати“ поништава поÑледњу измену ове Ñтранице Ñ Ñ˜ÐµÐ´Ð½Ð¸Ð¼ кликом',
-'tooltip-undo' => 'Враћа ову измену и отвара образац за уређивање.',
-'tooltip-preferences-save' => 'Сачувај поÑтавке',
-'tooltip-summary' => 'УнеÑите кратак опиÑ',
+'tooltip-pt-userpage' => 'Ваша кориÑничка Ñтраница',
+'tooltip-pt-anonuserpage' => 'КориÑничка Ñтраница за ИП адреÑу Ñ ÐºÐ¾Ñ˜Ðµ уређујете',
+'tooltip-pt-mytalk' => 'Ваша Ñтраница за разговор',
+'tooltip-pt-anontalk' => 'Разговор о изменама Ñ Ð¾Ð²Ðµ ИП адреÑе',
+'tooltip-pt-preferences' => 'Ваша подешавања',
+'tooltip-pt-watchlist' => 'СпиÑак Ñтраница које надгледате',
+'tooltip-pt-mycontris' => 'СпиÑак ваших доприноÑа',
+'tooltip-pt-login' => 'Препоручујемо вам да Ñе пријавите, иако то није обавезно.',
+'tooltip-pt-anonlogin' => 'Препоручујемо вам да Ñе пријавите, иако то није обавезно.',
+'tooltip-pt-logout' => 'Одјавите Ñе',
+'tooltip-ca-talk' => 'Разговор о Ñтраници Ñа Ñадржајем',
+'tooltip-ca-edit' => 'Можете да уређујете ову Ñтраницу. КориÑтите претпреглед пре Ñнимања',
+'tooltip-ca-addsection' => 'Започните нови одељак',
+'tooltip-ca-viewsource' => 'Ова Ñтраница је закључана. Можете да видите изворни код.',
+'tooltip-ca-history' => 'Претходне верзије ове Ñтранице',
+'tooltip-ca-protect' => 'Заштитите ову Ñтраницу',
+'tooltip-ca-unprotect' => 'Промени заштиту ове Ñтранице',
+'tooltip-ca-delete' => 'Обришите ову Ñтраницу',
+'tooltip-ca-undelete' => 'Врати измене направљене на овој Ñтраници пре него што буде обриÑана',
+'tooltip-ca-move' => 'ПремеÑти ову Ñтраницу',
+'tooltip-ca-watch' => 'Додај ову Ñтраницу на ÑпиÑак надгледања',
+'tooltip-ca-unwatch' => 'Уклони ову Ñтраницу Ñа ÑпиÑка надгледања',
+'tooltip-search' => 'Претрага',
+'tooltip-search-go' => 'Идите на Ñтраницу Ñ Ð¾Ð²Ð¸Ð¼ именом, ако поÑтоји',
+'tooltip-search-fulltext' => 'Претражите Ñтранице Ñ Ð¾Ð²Ð¸Ð¼ текÑтом',
+'tooltip-p-logo' => 'ПоÑетите наÑловну Ñтрану',
+'tooltip-n-mainpage' => 'ПоÑетите наÑловну Ñтрану',
+'tooltip-n-mainpage-description' => 'ПоÑетите наÑловну Ñтрану',
+'tooltip-n-portal' => 'О пројекту, шта можете да радите и где да пронађете Ñтвари',
+'tooltip-n-currentevents' => 'Сазнајте више о текућим догађајима',
+'tooltip-n-recentchanges' => 'СпиÑак Ñкорашњих измена на викију',
+'tooltip-n-randompage' => 'Отворите Ñлучајну Ñтраницу',
+'tooltip-n-help' => 'МеÑто где можете да Ñе информишете',
+'tooltip-t-whatlinkshere' => 'СпиÑак Ñвих Ñтраница које воде овде',
+'tooltip-t-recentchangeslinked' => 'Скорашње измене на Ñтраницама које Ñу повезана Ñ Ð¾Ð²Ð¾Ð¼ Ñтраницом',
+'tooltip-feed-rss' => 'RSS довод ове Ñтранице',
+'tooltip-feed-atom' => 'Ðтом довод ове Ñтранице',
+'tooltip-t-contributions' => 'Погледајте ÑпиÑак доприноÑа овог кориÑника',
+'tooltip-t-emailuser' => 'Пошаљите е-поруку овом кориÑнику',
+'tooltip-t-upload' => 'Пошаљите датотеке',
+'tooltip-t-specialpages' => 'СпиÑак Ñвих поÑебних Ñтраница',
+'tooltip-t-print' => 'Издање за штампање ове Ñтранице',
+'tooltip-t-permalink' => 'Стална веза ка овој измени Ñтранице',
+'tooltip-ca-nstab-main' => 'Погледајте Ñтраницу Ñа Ñадржајем',
+'tooltip-ca-nstab-user' => 'Погледајте кориÑничку Ñтраницу',
+'tooltip-ca-nstab-media' => 'Погледајте мултимедијалну датотеку',
+'tooltip-ca-nstab-special' => 'Ово је поÑебна Ñтраница. Ðе можете је мењати.',
+'tooltip-ca-nstab-project' => 'Погледајте Ñтраницу пројекта',
+'tooltip-ca-nstab-image' => 'Прикажи Ñтрану датотеке',
+'tooltip-ca-nstab-mediawiki' => 'Погледајте ÑиÑтемÑку поруку',
+'tooltip-ca-nstab-template' => 'Погледајте шаблон',
+'tooltip-ca-nstab-help' => 'Погледајте Ñтраницу за помоћ',
+'tooltip-ca-nstab-category' => 'Погледајте Ñтраницу категорија',
+'tooltip-minoredit' => 'Означите измену као мању',
+'tooltip-save' => 'Сачувајте измене које Ñте направили',
+'tooltip-preview' => 'Прегледајте Ñвоје измене. Пожељно је да кориÑтите ово дугме пре чувања',
+'tooltip-diff' => 'Погледајте Ñве измене које Ñте направили на текÑту',
+'tooltip-compareselectedversions' => 'Погледаjте разлике између две изабране измене ове Ñтранице.',
+'tooltip-watch' => 'Додајте ову Ñтраницу на ÑпиÑак надгледања',
+'tooltip-watchlistedit-normal-submit' => 'Уклони наÑлове',
+'tooltip-watchlistedit-raw-submit' => 'Ðжурирај ÑпиÑак',
+'tooltip-recreate' => 'Поново направите Ñтраницу иако је обриÑана',
+'tooltip-upload' => 'Започните отпремање',
+'tooltip-rollback' => '„Врати“ поништава поÑледњу измену ове Ñтранице Ñ Ñ˜ÐµÐ´Ð½Ð¸Ð¼ кликом',
+'tooltip-undo' => 'Враћа ову измену и отвара образац за уређивање.',
+'tooltip-preferences-save' => 'Сачувај поÑтавке',
+'tooltip-summary' => 'УнеÑите кратак опиÑ',
# Stylesheets
'common.css' => '/** CSS поÑтављен овде ће Ñе одразити на Ñве теме */',
@@ -3173,9 +3243,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Дневник патролирања',
'patrol-log-header' => 'Ово је иÑторија прегледаних измена.',
-'patrol-log-line' => 'обележена верзија $1 Ñтране $2 као патролирана ($3)',
-'patrol-log-auto' => '(аутоматÑки)',
-'patrol-log-diff' => 'измена $1',
'log-show-hide-patrol' => '$1 дневник патролирања',
# Image deletion
@@ -3203,11 +3270,11 @@ $1',
'file-info' => 'величина: $1, MIME врÑта: $2',
'file-info-size' => '$1 × $2 пикÑела, величина: $3, MIME врÑта: $4',
'file-info-size-pages' => '$1 × $2 пикÑела, величина: $3, MIME врÑта: $4, $5 {{PLURAL:$5|Ñтраница|Ñтранице|Ñтраница}}',
-'file-nohires' => '<small>Ðије доÑтупна већа величина.</small>',
+'file-nohires' => 'Већа резолуција није доÑтупна.',
'svg-long-desc' => 'SVG датотека, номинално $1 × $2 пикÑела, величина: $3',
'show-big-image' => 'Пуна величина',
-'show-big-image-preview' => '<small>Величина овог приказа: $1.</small>',
-'show-big-image-other' => '<small>ОÑтале величине: $1.</small>',
+'show-big-image-preview' => 'Величина овог приказа: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Друга резолуција|Друге резолуције}}: $1.',
'show-big-image-size' => '$1 × $2 пикÑела',
'file-info-gif-looped' => 'петља',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадар|кадра|кадрова}}',
@@ -3228,7 +3295,16 @@ $1',
'sp-newimages-showfrom' => 'прикажи нове датотеке почевши од $1, $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2×$3',
+'video-dims' => '$1, $2×$3',
+'seconds-abbrev' => '$1 Ñ',
+'minutes-abbrev' => '$1 м',
+'hours-abbrev' => '$1 ч',
+'days-abbrev' => '$1 д',
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунде|$1 Ñекунди}}',
+'minutes' => '{{PLURAL:$1|$1 минут|$1 минута|$1 минута}}',
+'hours' => '{{PLURAL:$1|$1 Ñат|$1 Ñата|$1 Ñати}}',
+'days' => '{{PLURAL:$1|$1 дан|$1 дана|$1 дана}}',
+'ago' => 'пре $1',
# Bad image list
'bad_image_list' => 'Формат је Ñледећи:
@@ -3287,6 +3363,11 @@ Variants for Chinese language
'variantname-ike-latn' => 'ike-Latn',
'variantname-iu' => 'iu',
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-Tfng',
+'variantname-shi-latn' => 'shi-Latn',
+'variantname-shi' => 'shi',
+
# Metadata
'metadata' => 'Метаподаци',
'metadata-help' => 'Ова датотека Ñадржи додатне податке који вероватно долазе од дигигалних фотоапарата или Ñкенера.
@@ -3816,15 +3897,6 @@ $5
'scarytranscludefailed' => '[Добављање шаблона за $1 није уÑпело]',
'scarytranscludetoolong' => '[URL адреÑа је предугачка]',
-# Trackbacks
-'trackbackbox' => 'Повратне тачке за ову Ñтраницу:<br />
-$1',
-'trackback' => '; $4 $5: [$2 $1]',
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 бриÑање])',
-'trackbacklink' => 'Повратне тачке',
-'trackbackdeleteok' => 'Повратна тачка је уÑпешно обриÑана.',
-
# Delete conflict
'deletedwhileediting' => "'''Упозорење''': ова Ñтраница је обриÑана након што Ñте почели Ñ ÑƒÑ€ÐµÑ’Ð¸Ð²Ð°ÑšÐµÐ¼!",
'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обриÑао|је обриÑала|обриÑа}} ову Ñтраницу након што Ñте почели да је уређујете, Ñа Ñледећим разлогом:
@@ -3985,6 +4057,7 @@ $1',
'hebrew-calendar-m12-gen' => 'Елул',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])',
'timezone-utc' => 'UTC',
# Core parser functions
@@ -4087,13 +4160,16 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|измена|измене|измена}}',
# Special:ComparePages
-'comparepages' => 'Упоређивање Ñтраница',
-'compare-selector' => 'Упоређивање измена Ñтранице',
-'compare-page1' => 'Страница 1',
-'compare-page2' => 'Страница 2',
-'compare-rev1' => 'Измена 1',
-'compare-rev2' => 'Измена 2',
-'compare-submit' => 'Упореди',
+'comparepages' => 'Упоређивање Ñтраница',
+'compare-selector' => 'Упоређивање измена Ñтранице',
+'compare-page1' => 'Страница 1',
+'compare-page2' => 'Страница 2',
+'compare-rev1' => 'Измена 1',
+'compare-rev2' => 'Измена 2',
+'compare-submit' => 'Упореди',
+'compare-invalid-title' => 'Ðаведени наÑлов је неиÑправан.',
+'compare-title-not-exists' => 'Ðаведени наÑлов не поÑтоји.',
+'compare-revision-not-exists' => 'Ðаведена измена не поÑтоји.',
# Database error messages
'dberr-header' => 'Овај вики не ради како треба',
@@ -4120,4 +4196,90 @@ $1',
'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ñ€ÑˆÐºÐ¾Ð¼ претраге целог текÑта',
'sqlite-no-fts' => '$1 без подршке претраге целог текÑта',
+# New logging system
+'logentry-delete-delete' => '$1 {{GENDER:|је обриÑао|је обриÑала|је обриÑао}} $3',
+'logentry-delete-restore' => '$1 {{GENDER:|је вратио|је вратила|је вратио}} Ñтраницу $3',
+'logentry-delete-event' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивоÑÑ‚ {{PLURAL:$5|догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивоÑÑ‚ {{PLURAL:$5|измене|$5 измене|$5 измена}} на Ñтраници $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивоÑÑ‚ догађајâ у дневнику на $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:|је променио|је променила|је променио}} видљивоÑÑ‚ изменâ на Ñтраници $3',
+'logentry-suppress-delete' => '$1 {{GENDER:|је потиÑнуо|је потиÑнула|је потиÑнуо}} Ñтраницу $3',
+'logentry-suppress-event' => '$1 је потајно {{GENDER:|променио|променила|променио}} видљивоÑÑ‚ {{PLURAL:$5|догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4',
+'logentry-suppress-revision' => '$1 је потајно {{GENDER:|променио|променила|променио}} видљивоÑÑ‚ {{PLURAL:$5|измене|$5 измене|$5 измена}} на Ñтраници $3: $4',
+'logentry-suppress-event-legacy' => '$1 је потајно {{GENDER:|променио|променила|променио}} видљивоÑÑ‚ догађајâ у дневнику на $3',
+'logentry-suppress-revision-legacy' => '$1 је потајно {{GENDER:|променио|променила|променио}} видљивоÑÑ‚ изменâ на Ñтраници $3',
+'revdelete-content-hid' => 'Ñадржај је Ñакривен',
+'revdelete-summary-hid' => 'Ð¾Ð¿Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ðµ је Ñакривен',
+'revdelete-uname-hid' => 'кориÑничко име је Ñакривено',
+'revdelete-content-unhid' => 'Ñадржај је откривен',
+'revdelete-summary-unhid' => 'Ð¾Ð¿Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ðµ је откривен',
+'revdelete-uname-unhid' => 'кориÑничко име је откривено',
+'revdelete-restricted' => 'примењена ограничења за админиÑтраторе',
+'revdelete-unrestricted' => 'уклоњена ограничења за админиÑтраторе',
+'logentry-move-move' => '$1 {{GENDER:|је премеÑтио|је премеÑтила|је премеÑтио}} Ñтраницу $3 на $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:|је премеÑтио|је премеÑтила|је премеÑтио}} Ñтраницу $3 на $4 без оÑтављања преуÑмерења',
+'logentry-move-move_redir' => '$1 {{GENDER:|је премеÑтио|је премеÑтила|је премеÑтио}} Ñтраницу $3 на $4 преко преуÑмерења',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:|је премеÑтио|је премеÑтила|је премеÑтио}} Ñтраницу $3 на $4 преко преуÑмерења без оÑтављања преуÑмерења',
+'logentry-patrol-patrol' => '$1 {{GENDER:|је означио|је означила|је означио}} измену $4 Ñтранице $3 као патролирану',
+'logentry-patrol-patrol-auto' => '$1 је ÑамоÑтално {{GENDER:|означио|означила|означио}} измену $4 Ñтранице $3 као прегледану',
+'logentry-newusers-newusers' => '$1 {{GENDER:|је отворио|је отворила|је отворио}} кориÑнички налог',
+'logentry-newusers-create' => '$1 {{GENDER:|је отворио|је отворила|је отворио}} кориÑнички налог',
+'logentry-newusers-create2' => '$1 {{GENDER:|је отворио|је отворила|је отворио}} кориÑнички налог $3',
+'logentry-newusers-autocreate' => 'Ðалог $1 је ÑамоÑтално отворен',
+'newuserlog-byemail' => 'лозинка је поÑлата е-поштом',
+
+# Feedback
+'feedback-bugornote' => 'Ðко Ñте Ñпремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].
+У Ñупротном, поÑлужите Ñе једноÑтавним обраÑцем иÑпод. Ваш коментар ће Ñтајати на Ñтраници „[$3 $2]“, заједно Ñ ÐºÐ¾Ñ€Ð¸Ñничким именом и прегледачем који кориÑтите.',
+'feedback-subject' => 'ÐаÑлов:',
+'feedback-message' => 'Порука:',
+'feedback-cancel' => 'Откажи',
+'feedback-submit' => 'Пошаљи повратну информацију',
+'feedback-adding' => 'Додајем повратну информацију на Ñтраницу…',
+'feedback-error1' => 'Грешка: непрепознат резултат од ÐПИ-ја',
+'feedback-error2' => 'Грешка: уређивање није уÑпело',
+'feedback-error3' => 'Грешка: нема одговора од ÐПИ-ја',
+'feedback-thanks' => 'Хвала! Ваша повратна информација је поÑтављена на Ñтраницу „[$2 $1]“.',
+'feedback-close' => 'Урађено',
+'feedback-bugcheck' => 'Одлично! Проверите да ли је грешка [$1 позната од пре].',
+'feedback-bugnew' => 'Проверено. Пријави нову грешку',
+
+# API errors
+'api-error-badaccess-groups' => 'Ðије вам дозвољено да отпремате датотеке на овај вики.',
+'api-error-badtoken' => 'Унутрашња грешка: неиÑправан жетон.',
+'api-error-copyuploaddisabled' => 'Отпремање путем адреÑе је онемогућено на овом Ñерверу.',
+'api-error-duplicate' => 'Већ {{PLURAL:$1|поÑтоји [$2 друга датотека]|поÑтоје [$2 друге датотеке]}} Ñ Ð¸Ñтим Ñадржајем.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|ПоÑтојала је [$2 друга датотека]|ПоÑтојале Ñу [$2 друге датотеке]}} Ñ Ð¸Ñтим Ñадржајем, али {{PLURAL:$1|је обриÑана|Ñу обриÑане}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Дуплирана датотека која је већ обриÑана|Дуплиране датотеке које Ñу већ обриÑане}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Дуплирана датотека|Дуплиране датотеке}}',
+'api-error-empty-file' => 'ПоÑлата датотека је празна.',
+'api-error-emptypage' => 'Стварање нових празних Ñтраница није дозвољено.',
+'api-error-fetchfileerror' => 'Унутрашња грешка: дошло је до грешке при добављању датотеке.',
+'api-error-file-too-large' => 'ПоÑлата датотека је превелика.',
+'api-error-filename-tooshort' => 'Ðазив датотеке је прекратак.',
+'api-error-filetype-banned' => 'Ова врÑта датотеке је забрањена.',
+'api-error-filetype-missing' => 'Датотеци недоÑтаје наÑтавак.',
+'api-error-hookaborted' => 'Измена је одбачена од куке за проширења.',
+'api-error-http' => 'Унутрашња грешка: не могу да Ñе повежем Ñа Ñервером.',
+'api-error-illegal-filename' => 'Ðазив датотеке је забрањен.',
+'api-error-internal-error' => 'Унутрашња грешка: дошло је до грешке при обрађивању датотеке на викију.',
+'api-error-invalid-file-key' => 'Унутрашња грешка: не могу да пронађем датотеку у привременом Ñкладишту.',
+'api-error-missingparam' => 'Унутрашња грешка: недоÑтају параметри у захтеву.',
+'api-error-missingresult' => 'Унутрашња грешка: не могу да утврдим да ли је умножавање уÑпело.',
+'api-error-mustbeloggedin' => 'Морате бити пријављени да биÑте отпремали датотеке.',
+'api-error-mustbeposted' => 'Унутрашња грешка: не кориÑти Ñе иÑправан HTTP метод.',
+'api-error-noimageinfo' => 'Отпремање је уÑпело, али Ñервер није дао никакав податак о датотеци.',
+'api-error-nomodule' => 'Унутрашња грешка: није поÑтављен модул за отпремање.',
+'api-error-ok-but-empty' => 'Унутрашња грешка: Ñервер не одговара.',
+'api-error-overwrite' => 'Замењивање поÑтојеће датотеке је забрањено.',
+'api-error-stashfailed' => 'Унутрашња грешка: Ñервер не може да Ñачува привремену датотеку.',
+'api-error-timeout' => 'Сервер није одговорио у очекивано време.',
+'api-error-unclassified' => 'Дошло је до непознате грешке',
+'api-error-unknown-code' => 'Ðепозната грешка: „$1“',
+'api-error-unknown-error' => 'Унутрашња грешка: дошло је до грешке при отпремању датотеке.',
+'api-error-unknown-warning' => 'Ðепознато упозорење: $1',
+'api-error-unknownerror' => 'Ðепозната грешка: „$1“.',
+'api-error-uploaddisabled' => 'Отпремање је онемогућено на овом викију.',
+'api-error-verification-error' => 'Датотека је оштећена или има неиÑправан наÑтавак.',
+
);
diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php
index 5a9860e3..b08ff755 100644
--- a/languages/messages/MessagesSr_el.php
+++ b/languages/messages/MessagesSr_el.php
@@ -60,7 +60,6 @@ $namespaceAliases = array(
'Разговор_о_категорији' => NS_CATEGORY_TALK,
);
-
$extraUserToggles = array(
'nolangconversion',
);
@@ -159,55 +158,146 @@ $dateFormats = array(
/* NOT USED IN STABLE VERSION */
$magicWords = array(
- 'redirect' => array( '0', '#Preusmeri', '#preusmeri', '#PREUSMERI', '#REDIRECT' ),
- 'notoc' => array( '0', '__BEZSADRŽAJA__', '__NOTOC__' ),
- 'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'TRENUTNIMESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'TRENUTNIMESECIME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'TRENUTNIMESECGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'TRENUTNIMESECSKR', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'TRENUTNIDAN', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'TRENUTNIDANIME', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'TRENUTNAGODINA', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'TRENUTNOVREME', 'CURRENTTIME' ),
- 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'BROJFAJLOVA', 'NUMBEROFFILES' ),
- 'pagename' => array( '1', 'STRANICA', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'STRANICE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'IMENSKIPROSTOR', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'IMENSKIPROSTORI', 'NAMESPACEE' ),
- 'fullpagename' => array( '1', 'PUNOIMESTRANE', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'PUNOIMESTRANEE', 'FULLPAGENAMEE' ),
- 'msg' => array( '0', 'POR:', 'MSG:' ),
- 'subst' => array( '0', 'ZAMENI:', 'SUBST:' ),
- 'msgnw' => array( '0', 'NVPOR:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'desno', 'd', 'right' ),
- 'img_left' => array( '1', 'levo', 'l', 'left' ),
- 'img_none' => array( '1', 'n', 'bez', 'none' ),
- 'img_width' => array( '1', '$1piskel', '$1p', '$1px' ),
- 'img_center' => array( '1', 'centar', 'c', 'center', 'centre' ),
- 'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
- 'sitename' => array( '1', 'IMESAJTA', 'SITENAME' ),
- 'ns' => array( '0', 'IP:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALNAADRESA:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALNEADRESE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'IMESERVERA', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTA', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
- 'notitleconvert' => array( '0', '__БЕЗКÐ__', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'TRENUTNANEDELJA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'TRENUTNIDOV', 'CURRENTDOW' ),
- 'revisionid' => array( '1', 'IDREVIZIJE', 'REVISIONID' ),
- 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'PUNURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'PUNURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'LCPRVI:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'UCPRVI:', 'UCFIRST:' ),
+ 'redirect' => array( '0', '#Preusmeri', '#preusmeri', '#PREUSMERI', '#Preusmjeri', '#preusmjeri', '#PREUSMJERI', '#redirect', '#REDIRECT' ),
+ 'notoc' => array( '0', '__BEZSADRŽAJA__', '__BEZ_SADRŽAJA__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__BEZGALERIJE__', '__BEZ_GALERIJE__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__FORSIRANI_SADRŽAJ__', '__PRIMORANISADRŽAJ__', '__PRIMORANI_SADRŽAJ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BEZIZMENA__', '__BEZ_IZMENA__', '__BEZIZMJENA__', '__BEZ_IZMJENA__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BEZZAGLAVLJA__', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'TRENUTNIMESEC', 'TRENUTNI_MESEC', 'TEKUĆIMESEC', 'TEKUĆI_MESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'TRENUTNIMESEC1', 'TRENUTNI_MESEC1', 'TEKUĆIMESEC1', 'TEKUĆI_MESEC1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'TRENUTNIMESECIME', 'IMETEKUĆEGMESECA', 'IME_TEKUĆEG_MESECA', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'TRENUTNIMESECGEN', 'TEKUĆIMESECGEN', 'TEKUĆI_MESEC_GEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'TRENUTNIMESECSKR', 'TEKUĆIMESECSKR', 'TEKUĆI_MESEC_SKR', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'TRENUTNIDAN', 'TEKUĆIDAN', 'TEKUĆI_DAN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'TEKUĆIDAN2', 'TEKUĆI_DAN_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'TRENUTNIDANIME', 'IMETEKUĆEGDANA', 'IME_TEKUĆEG_DANA', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'TRENUTNAGODINA', 'TEKUĆAGODINA', 'TEKUĆA_GODINA', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'TRENUTNOVREME', 'TEKUĆEVREME', 'TEKUĆE_VREME', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'TEKUĆISAT', 'TEKUĆI_SAT', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALNIMESEC', 'LOKALNI_MESEC', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALNIMESEC2', 'LOKALNI_MESEC2', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'IMELOKALNOGMESECA', 'IME_LOKALNOG_MESECA', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'LOKALNIMESECGEN', 'LOKALNI_MESEC_GEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'LOKALNIMESECSKR', 'LOKALNI_MESEC_SKR', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALNIDAN', 'LOKALNI_DAN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALNIDAN2', 'LOKALNI_DAN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'IMELOKALNOGDANA', 'IME_LOKALNOG_DANA', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALNAGODINA', 'LOKALNA_GODINA', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALNOVREME', 'LOKALNO_VREME', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALNISAT', 'LOKALNI_SAT', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'BROJSTRANICA', 'BROJ_STRANICA', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'BROJÄŒLANAKA', 'BROJ_ÄŒLANAKA', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'BROJDATOTEKA', 'BROJ_DATOTEKA', 'BROJFAJLOVA', 'BROJ_FAJLOVA', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'BROJKORISNIKA', 'BROJ_KORISNIKA', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'BROJAKTIVNIHKORISNIKA', 'BROJ_AKTIVNIH_KORISNIKA', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'BROJIZMENA', 'BROJ_IZMENA', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'BROJPREGLEDA', 'BROJ_PREGLEDA', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'IMESTRANICE', 'IME_STRANICE', 'STRANICA', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'IMENASTRANICA', 'IMENA_STRANICA', 'STRANICE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'IMENSKIPROSTOR', 'IMENSKI_PROSTOR', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'IMENSKIPROSTORI', 'IMENSKI_PROSTORI', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'RAZGOVOR', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'RAZGOVORI', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'IMENSKIPROSTORÄŒLANKA', 'IMENSKI_PROSTOR_ÄŒLANKA', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'IMENSKIPROSTORÄŒLANAKA', 'IMENSKI_PROSTOR_ÄŒLANAKA', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'PUNOIMESTRANICE', 'PUNOIMESTRANE', 'PUNO_IME_STRANICE', 'PUNO_IME_STRANE', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'PUNAIMENASTRANICA', 'PUNAIMENASTRANA', 'PUNA_IMENA_STRANICA', 'PUNA_IMENA_STRANA', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'IMEPODSTRANICE', 'IMEPODSTRANE', 'IME_PODSTRANICE', 'IME_PODSTRANE', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'IMENAPODSTRANICA', 'IMENAPODSTRANA', 'IMENA_PODSTRANICA', 'IMENA_PODSTRANA', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'IMEOSNOVE', 'IME_OSNOVE', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'IMENAOSNOVA', 'IMENA_OSNOVA', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'IMERAZGOVORA', 'IME_RAZGOVORA', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'IMENARAZGOVORA', 'IMENA_RAZGOVORA', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'IMEÄŒLANKA', 'IME_ÄŒLANKA', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'IMENAÄŒLANAKA', 'IMENA_ÄŒLANAKA', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'POR:', 'MSG:' ),
+ 'subst' => array( '0', 'ZAMENI:', 'ZAMENA:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'BEZBEDNAZAMENA', 'BEZBEDNA_ZAMENA', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'NVPOR:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'mini', 'umanjeno', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'mini=$1', 'umanjeno=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'desno', 'd', 'right' ),
+ 'img_left' => array( '1', 'levo', 'l', 'left' ),
+ 'img_none' => array( '1', 'bez', 'n', 'none' ),
+ 'img_width' => array( '1', '$1piskel', '$1p', '$1px' ),
+ 'img_center' => array( '1', 'centar', 'c', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'okvir', 'ram', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'bezokvira', 'bez_okvira', 'bezrama', 'bez_rama', 'frameless' ),
+ 'img_page' => array( '1', 'stranica=$1', 'strana=$1', 'stranica_$1', 'strana_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'uspravno', 'uspravno=$1', 'uspravno_$1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'ivica', 'border' ),
+ 'img_baseline' => array( '1', 'osnova', 'baseline' ),
+ 'img_sub' => array( '1', 'pod', 'sub' ),
+ 'img_top' => array( '1', 'vrh', 'top' ),
+ 'img_text_top' => array( '1', 'vrhteksta', 'vrh_teksta', 'text-top' ),
+ 'img_middle' => array( '1', 'sredina', 'middle' ),
+ 'img_bottom' => array( '1', 'dno', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'sredinateksta', 'sredina_teksta', 'text-bottom' ),
+ 'img_link' => array( '1', 'veza=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'IMESAJTA', 'SITENAME' ),
+ 'ns' => array( '0', 'IP:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALNAADRESA:', 'LOKALNA_ADRESA:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALNEADRESE:', 'LOKALNE_ADRESE:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'PUTANJAÄŒLANKA', 'PUTANJA_ÄŒLANKA', 'ARTICLEPATH' ),
+ 'servername' => array( '0', 'IMESERVERA', 'IME_SERVERA', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTA', 'SKRIPT', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'PUTANJASTILA', 'PUTANJA_STILA', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ROD:', 'LICE:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__BEZKN__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__BEZCC__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'TRENUTNANEDELJA', 'TRENUTNA_NEDELJA', 'TEKUĆANEDELJA', 'TEKUĆA_NEDELJA', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'TRENUTNIDOV', 'TEKUĆIDUN', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALNANEDELJA', 'LOKALNA_NEDELJA', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'LOKALNIDUN', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'IDREVIZIJE', 'ID_REVIZIJE', 'IB_IZMENE', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'DANIZMENE', 'DAN_IZMENE', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'DANIZMENE2', 'DAN_IZMENE2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'MESECIZMENE', 'MESEC_IZMENE', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'MESECIZMENE1', 'MESEC_IZMENE1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'GODINAIZMENE', 'GODINA_IZMENE', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'VREMEIZMENE', 'VREME_IZMENE', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'KORISNIKIZMENE', 'KORISNIK_IZMENE', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'MNOŽINA:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'PUNURL:', 'CELAADRESA', 'CELA_ADRESA', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'PUNURLE:', 'CELEADRESE', 'CELE_ADRESE', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'LCPRVI:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'UCPRVI:', 'UCFIRST:' ),
+ 'raw' => array( '0', 'ÄŒIST:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'NAZIVPRIKAZA', 'NAZIV_PRIKAZA', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__NOVAVEZAODELJKA__', '__NOVA_VEZA_ODELJKA__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__BEZNOVEVEZEODELJKA__', '__BEZ_NOVE_VEZE_ODELJKA__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'TEKUĆEIZDANJE', 'TEKUĆE_IZDANJE', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'KODIRANJEADRESE', 'KODIRANJE_ADRESE', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'KODIRANJEVEZE', 'KODIRANJE_VEZE', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'TEKUĆIOTISAKVREMENA', 'TEKUĆI_OTISAK_VREMENA', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'OTISAKVREMENA', 'OTISAK_VREMENA', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'SMEROZNAKE', 'SMER _OZNAKE', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#JEZIK:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'JEZIKSADRŽAJA', 'JEZIK_SADRŽAJA', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'STRANICAUIMENSKOMPROSTORU', 'STRANAUIMENSKOMPROSTORU', 'STRANICA_U_IMENSKOM_PROSTORU', 'STRANA_U_IMENSKOM_PROSTORU', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'BROJADMINA', 'BROJ_ADMINA', 'NUMBEROFADMINS' ),
+ 'padleft' => array( '0', 'PORAVNAJULEVO', 'PORAVNAJ_ULEVO', 'PADLEFT' ),
+ 'padright' => array( '0', 'PORAVNAJUDESNO', 'PORAVNAJ_UDESNO', 'PADRIGHT' ),
+ 'special' => array( '0', 'posebno', 'special' ),
+ 'filepath' => array( '0', 'PUTANJADATOTEKE', 'PUTANJA_DATOTEKE', 'FILEPATH:' ),
+ 'tag' => array( '0', 'oznaka', 'tag' ),
+ 'hiddencat' => array( '1', '__SAKRIVENAKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'STRANICAUKATEGORIJI', 'STRANAUKATEGORIJI', 'STRANICA_U_KATEGORIJI', 'STRANA_U_KATEGORIJI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'VELIÄŒINASTRANICE', 'VELIÄŒINASTRANE', 'VELIÄŒINA_STRANICE', 'VELIÄŒINA_STRANE', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKS__', '__INDEX__' ),
+ 'noindex' => array( '1', '__BEZINDEKSA__', '__BEZ_INDEKSA__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'BROJUGRUPI', 'BROJ_U_GRUPI', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STATIÄŒKOPREUSMERENJE__', 'STATIÄŒKO_PREUSMERENJE', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'NIVOZAÅ TITE', 'NIVO_ZAÅ TITE', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formatdatuma', 'format_datuma', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'PUTANJA', 'PATH' ),
+ 'url_wiki' => array( '0', 'VIKI', 'WIKI' ),
+ 'url_query' => array( '0', 'REDOSLED', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', 'bez_greške', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', 'bez_zamene', 'noreplace' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -480,6 +570,7 @@ Pogledajte stranicu za [[Special:Version|izdanje]].',
'ok' => 'U redu',
'pagetitle' => '$1 – {{SITENAME}}',
'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '↠$1',
'retrievedfrom' => 'Preuzeto iz „$1“',
'youhavenewmessages' => 'Imate $1 ($2).',
'newmessageslink' => 'novih poruka',
@@ -579,22 +670,24 @@ Prijavite je [[Special:ListUsers/sysop|administratoru]] uz odgovarajuću vezu.',
'badarticleerror' => 'Ova radnja se ne može izvršiti na ovoj stranici.',
'cannotdelete' => 'Ne mogu da obrišem stranicu ili datoteku „$1“.
Verovatno ju je neko drugi obrisao.',
+'cannotdelete-title' => 'Ne mogu da obrišem stranicu „$1“',
'badtitle' => 'Neispravan naslov',
'badtitletext' => 'Naslov stranice je neispravan, prazan ili je meÄ‘ujeziÄki ili meÄ‘uviki naslov pogreÅ¡no povezan.
Možda sadrži znakove koji se ne mogu koristiti u naslovima.',
-'perfcached' => 'Sledeći podaci su keširani i ne moraju biti u potpunosti ažurirani.',
-'perfcachedts' => 'Sledeći podaci su keširani i poslednji put su ažurirani: $1',
+'perfcached' => 'Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.',
+'perfcachedts' => 'Sledeći podaci su keširani, a poslednji put su ažurirani $2 u $3. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata|$4 rezultata}}.',
'querypage-no-updates' => 'Ažuriranje ove stranice je trenutno onemogućeno.
Podaci koji se ovde nalaze mogu biti zastareli.',
'wrong_wfQuery_params' => 'Neispravni parametri za wfQuery()<br />
Funkcija: $1<br />
Upit: $2',
'viewsource' => 'Izvornik',
-'viewsourcefor' => 'za $1',
+'viewsource-title' => 'Prikaz izvora stranice $1',
'actionthrottled' => 'Radnja je usporena',
'actionthrottledtext' => 'U cilju borbe protiv nepoželjnih poruka, ograniÄene su vam izmene u odreÄ‘enom vremenu, a upravo ste preÅ¡li to ograniÄenje. PokuÅ¡ajte ponovo za nekoliko minuta.',
'protectedpagetext' => 'Ova stranica je zakljuÄana za ureÄ‘ivanja.',
'viewsourcetext' => 'Možete da pogledate i umnožite izvorni tekst ove stranice:',
+'viewyourtext' => "Možete da pogledate i umnožite izvor '''vaših izmena''' na ovoj stranici:",
'protectedinterface' => 'Ova stranica je zaÅ¡tićena jer sadrži tekst korisniÄkog suÄelja programa.',
'editinginterface' => "'''Upozorenje:''' ureÄ‘ujete stranicu koja se koristi za prikazivanje teksta korisniÄkog okruženja.
Izmene na ovoj stranici će uticati na sve korisnike.
@@ -700,6 +793,7 @@ Poruke neće biti poslate ni za jednu od sledećih mogućnosti.',
'emailconfirmlink' => 'Potvrdite svoju e-adresu',
'invalidemailaddress' => 'E-adresa ne može biti prihvaćena jer je neispravnog oblika.
Unesite ispravnu adresu ili ostavite prazno polje.',
+'cannotchangeemail' => 'Na ovom vikiju ne možete promeniti e-adresu naloga.',
'accountcreated' => 'Nalog je otvoren',
'accountcreatedtext' => 'Nalog {{GENDER:$1|korisnika|korisnice|korisnika}} $1 je otvoren.',
'createaccount-title' => 'Otvaranje korisniÄkog naloga za {{SITENAME}}',
@@ -716,6 +810,7 @@ SaÄekajte nekoliko minuta i pokuÅ¡ajte ponovo.',
# E-mail sending
'php-mail-error-unknown' => 'Nepoznata greška u funkciji PHP mail().',
+'user-mail-no-addy' => 'Pokušali ste da pošaljete poruku bez e-adrese.',
# Change password dialog
'resetpass' => 'Promena lozinke',
@@ -738,32 +833,47 @@ Možda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.',
'resetpass-temp-password' => 'Privremena lozinka:',
# Special:PasswordReset
-'passwordreset' => 'Obnavljanje lozinke',
-'passwordreset-text' => 'Popunite ovaj obrazac da biste primili e-poruku sa svojim podacima za prijavu.',
-'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-email' => 'E-adresa:',
-'passwordreset-emailtitle' => 'Detalji naloga na vikiju {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Neko, verovatno vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).
+'passwordreset' => 'Obnavljanje lozinke',
+'passwordreset-text' => 'Popunite ovaj obrazac da biste primili e-poruku sa svojim podacima za prijavu.',
+'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?',
+'passwordreset-capture-help' => 'Ako oznaÄite ovu kućicu, e-poruka s privremenom lozinkom će biti prikazana i poslata korisniku.',
+'passwordreset-email' => 'E-adresa:',
+'passwordreset-emailtitle' => 'Detalji naloga na vikiju {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Neko, verovatno vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).
Sledeći {{PLURAL:$3|korisniÄki nalog je povezan|korisniÄki nalozi su povezani}} s ovom e-adresom:
$2
{{PLURAL:$3|Privremena lozinka istiÄe|Privremene lozinke istiÄu}} za {{PLURAL:$5|jedan dan|$5 dana|$5 dana}}.
Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.',
-'passwordreset-emailtext-user' => '{{GENDER:$1|Korisnik|Korisnica|Korisnik}} $1 je zatražio podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).
+'passwordreset-emailtext-user' => '{{GENDER:$1|Korisnik|Korisnica|Korisnik}} $1 je zatražio podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).
Sledeći {{PLURAL:$3|korisniÄki nalog je povezan|korisniÄki nalozi su povezani}} s ovom e-adresom:
$2
{{PLURAL:$3|Privremena lozinka istiÄe|Privremene lozinke istiÄu}} za {{PLURAL:$5|jedan dan|$5 dana|$5 dana}}.
Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.',
-'passwordreset-emailelement' => 'KorisniÄko ime: $1
+'passwordreset-emailelement' => 'KorisniÄko ime: $1
Privremena lozinka: $2',
-'passwordreset-emailsent' => 'Podsetnik o lozinci je poslat na vašu adresu.',
+'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',
+
+# Special:ChangeEmail
+'changeemail' => 'Promena e-adrese',
+'changeemail-header' => 'Promenite e-adresu naloga',
+'changeemail-text' => 'Popunite ovaj obrazac da biste promenili svoju e-adresu. Moraćete da unesete lozinku da potvrdite izmenu.',
+'changeemail-no-info' => 'Morate biti prijavljeni da biste pristupili ovoj stranici.',
+'changeemail-oldemail' => 'Trenutna e-adresa:',
+'changeemail-newemail' => 'Nova e-adresa:',
+'changeemail-none' => '(ništa)',
+'changeemail-submit' => 'Promeni',
+'changeemail-cancel' => 'Otkaži',
# Edit page toolbar
'bold_sample' => 'Podebljan tekst',
@@ -835,9 +945,6 @@ Ne možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste u
Vaša blokirana IP adresa je $3, a IB $5.
Navedite sve podatke iznad pri stvaranju bilo kakvih upita.",
'blockednoreason' => 'razlog nije naveden',
-'blockedoriginalsource' => "Izvor '''$1''' je prikazan ispod:",
-'blockededitsource' => "Tekst '''vaših izmena''' za '''$1''' je prikazan ispod:",
-'whitelistedittitle' => 'Obavezno je prijavljivanje za uređivanje',
'whitelistedittext' => 'Za uređivanje stranice je potrebno da budete $1.',
'confirmedittext' => 'Morate da potvrdite svoju e-adresu pre uređivanja stranica.
Postavite i potvrdite adresu preko [[Special:Preferences|podešavanja]].',
@@ -928,8 +1035,8 @@ Isto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora ko
Ako ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />
Isto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).
'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
-'longpageerror' => "'''GreÅ¡ka: tekst koji ste uneli je veliÄine $1 kilobajta, Å¡to je veće od dozvoljenih $2 kilobajta.
-Stranica ne može biti saÄuvana.'''",
+'longpageerror' => "'''GreÅ¡ka: tekst koji ste uneli je veliÄine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, Å¡to je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''
+Stranica ne može biti saÄuvana.",
'readonlywarning' => "'''Upozorenje: baza podataka je zakljuÄana radi održavanja, tako da nećete moći da saÄuvate izmene.
Najbolje bi bilo da umnožite tekst u ureÄ‘ivaÄ teksta i saÄuvate ga za kasnije.'''
@@ -1099,8 +1206,6 @@ Drugi administratori na ovom vikiju će i dalje imati pristup sakrivenom sadrža
'revdelete-unsuppress' => 'Ukloni ograniÄenja na vraćenim izmenama',
'revdelete-log' => 'Razlog:',
'revdelete-submit' => 'Primeni na {{PLURAL:$1|izabranu izmenu|izabrane izmene}}',
-'revdelete-logentry' => 'je promenio prikaz izmena za „[[$1]]â€',
-'logdelete-logentry' => 'promenjena vidnost događaja za stranu [[$1]]',
'revdelete-success' => "'''Vidljivost izmene je ažurirana.'''",
'revdelete-failure' => "'''Ne mogu da ažuriram vidljivost izmene:'''
$1",
@@ -1112,15 +1217,6 @@ $1",
'revdel-restore-visible' => 'vidljive izmene',
'pagehist' => 'Istorija stranice',
'deletedhist' => 'Obrisana istorija',
-'revdelete-content' => 'sadržaj',
-'revdelete-summary' => 'opis izmene',
-'revdelete-uname' => 'korisniÄko ime',
-'revdelete-restricted' => 'primenjena ograniÄenja za administratore',
-'revdelete-unrestricted' => 'uklonjena ograniÄenja za administratore',
-'revdelete-hid' => 'sakriveno: $1',
-'revdelete-unhid' => 'otkriveno: $1',
-'revdelete-log-message' => '$1 za $2 {{PLURAL:$2|reviziju|revizije|revizija}}',
-'logdelete-log-message' => '$1 za $2 {{PLURAL:$2|događaj|događaja}}',
'revdelete-hide-current' => 'Greška pri sakrivanju stavke od $1, $2: ovo je trenutna izmena.
Ne može biti sakrivena.',
'revdelete-show-no-access' => 'GreÅ¡ka pri prikazivanju stavke od $1, $2: oznaÄena je kao „ograniÄena“.
@@ -1280,12 +1376,14 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
'prefs-rc' => 'Skorašnje izmene',
'prefs-watchlist' => 'Spisak nadgledanja',
'prefs-watchlist-days' => 'Broj dana u spisku nadgledanja:',
-'prefs-watchlist-days-max' => 'Maksimum 7 dana',
+'prefs-watchlist-days-max' => 'Najviše $1 {{PLURAL:$1|dan|dana|dana}}',
'prefs-watchlist-edits' => 'Najveći broj izmena u proširenom spisku nadgledanja:',
'prefs-watchlist-edits-max' => 'Najveća vrednost je hiljadu',
'prefs-watchlist-token' => 'Žeton spiska nadgledanja:',
'prefs-misc' => 'Druga podešavanja',
'prefs-resetpass' => 'Promeni lozinku',
+'prefs-changeemail' => 'Promeni e-adresu',
+'prefs-setemail' => 'Postavi e-adresu',
'prefs-email' => 'Postavke e-pošte',
'prefs-rendering' => 'Izgled',
'saveprefs' => 'SaÄuvaj',
@@ -1347,6 +1445,7 @@ Ova radnja se ne može vratiti.',
'yourrealname' => 'Pravo ime:',
'yourlanguage' => 'Jezik:',
'yourvariant' => 'Varijanta jezika:',
+'prefs-help-variant' => 'Željena varijanta ili pravopis za prikaz stranica sa sadržajem ovog vikija.',
'yournick' => 'Novi potpis:',
'prefs-help-signature' => "Komentare na stranicama za razgovor potpišite sa ''<nowiki>~~~~</nowiki>''. Ovi znakovi će biti pretvoreni u vaš potpis i trenutno vreme.",
'badsig' => 'Potpis je neispravan.
@@ -1389,7 +1488,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'userrights-lookup-user' => 'Upravljanje korisniÄkim grupama',
'userrights-user-editname' => 'Unesite korisniÄko ime:',
'editusergroup' => 'Promeni korisniÄke grupe',
-'editinguser' => "Menjate korisniÄka prava korisnika '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Menjate korisniÄka prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Promena korisniÄkih grupa',
'saveusergroups' => 'SaÄuvaj korisniÄke grupe',
'userrights-groupsmember' => 'ÄŒlan:',
@@ -1484,13 +1583,13 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'right-autopatrol' => 'samooznaÄavanje izmena kao pregledane',
'right-patrolmarks' => 'pregledanje oznaka za patroliranje unutar skorašnjih izmena',
'right-unwatchedpages' => 'pregledanje spiska nenadgledanih stranica',
-'right-trackback' => 'pošalji izveštaj',
'right-mergehistory' => 'spajanje istorija stranica',
'right-userrights' => 'ureÄ‘ivanje svih korisniÄkih prava',
'right-userrights-interwiki' => 'ureÄ‘ivanje korisniÄkih prava na drugim vikijima',
'right-siteadmin' => 'zakljuÄavanje i otkljuÄavanje baze podataka',
'right-override-export-depth' => 'izvoz stranica ukljuÄujući i povazene stranice do dubine od pet veza',
'right-sendemail' => 'slanje e-poruka drugim korisnicima',
+'right-passwordreset' => 'pregledanje poruka za obnavljanje lozinke',
# User rights log
'rightslog' => 'Dnevnik korisniÄkih prava',
@@ -1524,16 +1623,17 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'action-suppressionlog' => 'pregledanje ove privatne istorije',
'action-block' => 'blokiranje daljih izmena ovog korisnika',
'action-protect' => 'menjanje stepena zaštite ove stranice',
+'action-rollback' => 'brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu',
'action-import' => 'uvoz ove stranice s drugog vikija',
'action-importupload' => 'uvoz ove stranice slanjem datoteke',
'action-patrol' => 'oznaÄavanje tuÄ‘ih izmena pregledanim',
'action-autopatrol' => 'samooznaÄavanje izmena pregledanim',
'action-unwatchedpages' => 'pregledanje spiska nenadgledanih stranica',
-'action-trackback' => 'pošalji izveštaj',
'action-mergehistory' => 'spajanje istorije ove stranice',
'action-userrights' => 'ureÄ‘ivanje svih korisniÄkih prava',
'action-userrights-interwiki' => 'ureÄ‘ivanje korisniÄkih prava na drugim vikijima',
'action-siteadmin' => 'zakljuÄavanje ili otkljuÄavanje baze podataka',
+'action-sendemail' => 'slanje e-poruka',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|izmena|izmene|izmena}}',
@@ -1567,6 +1667,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'rc_categories' => 'OgraniÄi na kategorije (razdvoji s uspravnom crtom)',
'rc_categories_any' => 'Sve',
'rc-change-size' => '$1',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene',
'newsectionsummary' => '/* $1 */ novi odeljak',
'rc-enhanced-expand' => 'Prikaži detalje (javaskript)',
'rc-enhanced-hide' => 'Sakrij detalje',
@@ -1621,6 +1722,7 @@ Pogledajte [[Special:NewFiles|galeriju novih datoteka]] za lepši pregled.',
'minlength1' => 'Naziv datoteke mora imati barem jedan znak.',
'illegalfilename' => 'Datoteka „$1“ sadrži znakove koji nisu dozvoljeni u nazivima stranica.
Promenite naziv datoteke i ponovo je pošaljite.',
+'filename-toolong' => 'Nazivi datoteka mogu imati najviše 240 bajtova.',
'badfilename' => 'Naziv datoteke je promenjen u „$1“.',
'filetype-mime-mismatch' => 'Ekstenzija „.$1“ ne odgovara prepoznatoj vrsti MIME datoteke ($2).',
'filetype-badmime' => 'Datoteke MIME vrste „$1“ nije dozvoljeno slati.',
@@ -1737,6 +1839,41 @@ Ako se problem ne reši, kontaktirajte [[Special:ListUsers/sysop|administratora]
'upload-unknown-size' => 'Nepoznata veliÄina',
'upload-http-error' => 'Došlo je do HTTP greške: $1',
+# File backend
+'backend-fail-stream' => 'Ne mogu da emitujem datoteku $1.',
+'backend-fail-backup' => 'Ne mogu da napravim rezervu datoteke $1.',
+'backend-fail-notexists' => 'Datoteka $1 ne postoji.',
+'backend-fail-hashes' => 'Ne mogu da dobijem disperzije datoteke za upoređivanje.',
+'backend-fail-notsame' => 'Već postoji neistovetna datoteka – $1.',
+'backend-fail-invalidpath' => '$1 nije ispravna putanja za skladištenje.',
+'backend-fail-delete' => 'Ne mogu da obrišem datoteku $1.',
+'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
+'backend-fail-store' => 'Ne mogu da smestim datoteku $1 u $2.',
+'backend-fail-copy' => 'Ne mogu da umnožim datoteku $1 u $2.',
+'backend-fail-move' => 'Ne mogu da premestim datoteku $1 u $2.',
+'backend-fail-opentemp' => 'Ne mogu da otvorim privremenu datoteku.',
+'backend-fail-writetemp' => 'Ne mogu da pišem u privremenoj datoteci.',
+'backend-fail-closetemp' => 'Ne mogu da zatvorim privremenu datoteku.',
+'backend-fail-read' => 'Ne mogu da proÄitam datoteku $1.',
+'backend-fail-create' => 'Ne mogu da napravim datoteku $1.',
+'backend-fail-readonly' => 'Skladišna osnova „$1“ trenutno ne može da se zapisuje. Navedeni razlog glasi: „$2“',
+'backend-fail-synced' => 'Datoteka „$1“ je nedosledna između unutrašnjih skladišnih osnova',
+'backend-fail-connect' => 'Ne mogu da se povežem sa skladišnom osnovom „$1“.',
+'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi „$1“.',
+'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smestim u „$1“.',
+'backend-fail-batchsize' => 'SkladiÅ¡na osnova je dobila blokadu od $1 {{PLURAL:$1|operacije|operacije|operacija}}; ograniÄenje je $2 {{PLURAL:$2|operacija|operacije|operacija}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ne mogu da otkljuÄam „$1“ jer nije zakljuÄan.',
+'lockmanager-fail-closelock' => 'Ne mogu da zatvorim katanac za „$1“.',
+'lockmanager-fail-deletelock' => 'Ne mogu da obrišem katanac za „$1“.',
+'lockmanager-fail-acquirelock' => 'Ne mogu da dobijem katanac za „$1“.',
+'lockmanager-fail-openlock' => 'Ne mogu da otvorim katanac za „$1“.',
+'lockmanager-fail-releaselock' => 'Ne mogu da oslobodim katanac za „$1“.',
+'lockmanager-fail-db-bucket' => 'Ne mogu da kontaktiram s dovoljno katanaca u kanti $1.',
+'lockmanager-fail-db-release' => 'Ne mogu da oslobodim katance u bazi $1.',
+'lockmanager-fail-svr-release' => 'Ne mogu da oslobodim katance na serveru $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Došlo je do greške pri otvaranju datoteke za proveru ZIP arhive.',
'zip-wrong-format' => 'Navedena datoteka nije formata ZIP.',
@@ -1753,6 +1890,7 @@ Bezbednosna provera ne može da se izvrši kako treba.',
'uploadstash-badtoken' => 'Izvršavanje date radnje nije uspelo. Razlog tome može biti istek vremena za uređivanje. Pokušajte ponovo.',
'uploadstash-errclear' => 'Čišćenje datoteka nije uspelo.',
'uploadstash-refresh' => 'Osveži spisak datoteka',
+'invalid-chunk-offset' => 'Neispravna polazna taÄka',
# img_auth script messages
'img-auth-accessdenied' => 'Pristup je odbijen',
@@ -1863,23 +2001,24 @@ Opis na [$2 stranici datoteke] je prikazan ispod.',
'filerevert-badversion' => 'Ne postoji ranije lokalno izdanje datoteke s navedenim vremenskim podacima.',
# File deletion
-'filedelete' => 'Obriši $1',
-'filedelete-legend' => 'Obriši datoteku',
-'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno s njenom istorijom.",
-'filedelete-intro-old' => "Brišete izdanje datoteke '''[[Media:$1|$1]]''' od [$4 $2; $3].",
-'filedelete-comment' => 'Razlog:',
-'filedelete-submit' => 'Obriši',
-'filedelete-success' => "Datoteka '''$1''' je obrisana.",
-'filedelete-success-old' => "Izdanje '''[[Media:$1|$1]]''' od $2, $3 je obrisano.",
-'filedelete-nofile' => "Datoteka '''$1''' ne postoji.",
-'filedelete-nofile-old' => "Ne postoji arhivirano izdanje datoteke '''$1''' s navedenim osobinama.",
-'filedelete-otherreason' => 'Drugi/dodatni razlog:',
-'filedelete-reason-otherlist' => 'Drugi razlog',
-'filedelete-reason-dropdown' => '*NajÄešći razlozi brisanja
+'filedelete' => 'Obriši $1',
+'filedelete-legend' => 'Obriši datoteku',
+'filedelete-intro' => "Brišete datoteku '''[[Media:$1|$1]]''' zajedno s njenom istorijom.",
+'filedelete-intro-old' => "Brišete izdanje datoteke '''[[Media:$1|$1]]''' od [$4 $2; $3].",
+'filedelete-comment' => 'Razlog:',
+'filedelete-submit' => 'Obriši',
+'filedelete-success' => "Datoteka '''$1''' je obrisana.",
+'filedelete-success-old' => "Izdanje '''[[Media:$1|$1]]''' od $2, $3 je obrisano.",
+'filedelete-nofile' => "Datoteka '''$1''' ne postoji.",
+'filedelete-nofile-old' => "Ne postoji arhivirano izdanje datoteke '''$1''' s navedenim osobinama.",
+'filedelete-otherreason' => 'Drugi/dodatni razlog:',
+'filedelete-reason-otherlist' => 'Drugi razlog',
+'filedelete-reason-dropdown' => '*NajÄešći razlozi brisanja
** Kršenje autorskih prava
** Duplikati datoteka',
-'filedelete-edit-reasonlist' => 'Uredi razloge brisanja',
-'filedelete-maintenance' => 'Brisanje i vraćanje datoteka je privremeno onemogućeno tokom održavanja.',
+'filedelete-edit-reasonlist' => 'Uredi razloge brisanja',
+'filedelete-maintenance' => 'Brisanje i vraćanje datoteka je privremeno onemogućeno tokom održavanja.',
+'filedelete-maintenance-title' => 'Ne mogu da obrišem datoteku',
# MIME search
'mimesearch' => 'MIME pretraga',
@@ -1979,6 +2118,8 @@ Sada je preusmerenje na [[$2]].',
'wantedpages' => 'Tražene stranice',
'wantedpages-badtitle' => 'Neispravan naslov u nizu rezultata: $1',
'wantedfiles' => 'Tražene datoteke',
+'wantedfiletext-cat' => 'Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].',
+'wantedfiletext-nocat' => 'Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska.',
'wantedtemplates' => 'Traženi šabloni',
'mostlinked' => 'Stranice s najviše veza',
'mostlinkedcategories' => 'Članci s najviše kategorija',
@@ -1987,6 +2128,7 @@ Sada je preusmerenje na [[$2]].',
'mostimages' => 'Datoteke s najviše veza',
'mostrevisions' => 'Stranice s najviše izmena',
'prefixindex' => 'Sve stranice s prefiksom',
+'prefixindex-namespace' => 'Sve stranice s predmetkom (imenski prostor $1)',
'shortpages' => 'Kratke stranice',
'longpages' => 'DugaÄke stranice',
'deadendpages' => 'Stranice bez unutrašnjih veza',
@@ -2098,12 +2240,8 @@ Podržani protokoli: <tt>$1</tt> (ne stavljajte u pretragu)',
'activeusers-noresult' => 'Korisnik nije pronađen.',
# Special:Log/newusers
-'newuserlogpage' => 'Dnevnik novih korisnika',
-'newuserlogpagetext' => 'Ovo je istorija novih korisnika.',
-'newuserlog-byemail' => 'lozinka je poslata e-poštom',
-'newuserlog-create-entry' => 'Novi korisnik',
-'newuserlog-create2-entry' => 'napravio novi nalog za $1',
-'newuserlog-autocreate-entry' => 'nalog automatski napravljen',
+'newuserlogpage' => 'Dnevnik novih korisnika',
+'newuserlogpagetext' => 'Ovo je istorija novih korisnika.',
# Special:ListGroupRights
'listgrouprights' => 'Prava korisniÄkih grupa',
@@ -2134,7 +2272,7 @@ Pogledajte [[{{MediaWiki:Listgrouprights-helppage}}|viÅ¡e detalja]] o pojedinaÄ
'emailpagetext' => 'Koristite ovaj obrazac da pošaljete e-poruku ovom korisniku.
E-adresa koju ste uneli u [[Special:Preferences|podešavanjima]] će biti prikazana kao adresa pošiljaoca, tako da će primalac poruke moći da vam odgovori.',
'usermailererror' => 'Došlo je do greške pri slanju poruke:',
-'defemailsubject' => '{{SITENAME}} e-pošta',
+'defemailsubject' => '{{SITENAME}} e-adresa {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
'usermaildisabled' => 'KorisniÄka e-poÅ¡ta je onemogućena',
'usermaildisabledtext' => 'Ne možete da šaljete e-poruke drugim korisnicima na ovom vikiju',
'noemailtitle' => 'Nema e-adrese',
@@ -2191,7 +2329,7 @@ Ukoliko budete želeli da uklonite stranicu sa spiska nadgledanja, kliknite opet
'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}}.',
'iteminvalidname' => 'Problem sa stavkom „$1“. Neispravan naziv.',
-'wlnote' => "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje '''$1''' izmene|je poslednjih '''$1''' izmena}} naÄinjenih {{PLURAL:$2|prethodni sat|u poslednja '''$2''' sata|u poslednjih '''$2''' sati}}.",
+'wlnote' => "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje '''$1''' izmene|je poslednjih '''$1''' izmena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zakljuÄno sa $3, $4.",
'wlshowlast' => 'Prikaži poslednjih $1 sati, $2 dana, $3',
'watchlist-options' => 'Postavke spiska nadgledanja',
@@ -2257,8 +2395,6 @@ Potvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{Med
'actionfailed' => 'Radnja nije uspela',
'deletedtext' => "Stranica „$1“ je obrisana.
Pogledajte ''$2'' za više detalja.",
-'deletedarticle' => 'je obrisao „[[$1]]“',
-'suppressedarticle' => 'saktiveno: "[[$1]]"',
'dellogpage' => 'Dnevnik brisanja',
'dellogpagetext' => 'Ispod je spisak poslednjih brisanja.',
'deletionlog' => 'istorija brisanja',
@@ -2307,7 +2443,10 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više deta
'unprotectedarticle' => '{{GENDER:|je uklonio|je uklonila|je uklonio}} zaštitu sa stranice „[[$1]]“',
'movedarticleprotection' => '{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“',
'protect-title' => 'Stepen zaštite za „$1“',
+'protect-title-notallowed' => 'Pregled stepena zaštite za „$1“',
'prot_1movedto2' => '{{GENDER:|je premestio|je premestila|je premestio}} [[$1]] u [[$2]]',
+'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
+'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
'protect-legend' => 'Potvrdite zaštitu',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'IstiÄe:',
@@ -2329,6 +2468,7 @@ Možete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu
'protect-level-sysop' => 'Samo administratori',
'protect-summary-cascade' => 'prenosiva zaštita',
'protect-expiring' => 'istiÄe $1 (UTC)',
+'protect-expiring-local' => 'istiÄe $1',
'protect-expiry-indefinite' => 'nikada',
'protect-cascade' => 'ZaÅ¡titi sve stranice koje su ukljuÄene u ovu (prenosiva zaÅ¡tita)',
'protect-cantedit' => 'Ne možete menjati stepene zaštite ove stranice jer nemate ovlašćenja za uređivanje.',
@@ -2389,7 +2529,6 @@ Možda ste uneli pogrešnu vezu, ili je izmena vraćena ili uklonjena iz arhive.
'undeletereset' => 'Poništi',
'undeleteinvert' => 'Obrni izbor',
'undeletecomment' => 'Razlog:',
-'undeletedarticle' => 'je vratio „[[$1]]“',
'undeletedrevisions' => '{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka|datoteke|datoteka}} je vraćeno',
'undeletedfiles' => '{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}',
@@ -2398,6 +2537,7 @@ Možda ste uneli pogrešnu vezu, ili je izmena vraćena ili uklonjena iz arhive.
Pogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
'undelete-header' => 'Pogledajte [[Special:Log/delete|istorijat brisanja]] za nedavno obrisane stranice.',
+'undelete-search-title' => 'Pretraga obrisanih stranica',
'undelete-search-box' => 'Pretraži obrisane stranice',
'undelete-search-prefix' => 'Prikaži stranice koje poÄinju sa:',
'undelete-search-submit' => 'Pretraži',
@@ -2407,6 +2547,7 @@ Pogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim bris
'undelete-cleanup-error' => 'Greška pri brisanju nekorišćene arhive „$1“.',
'undelete-missing-filearchive' => 'Ne mogu da vratim arhivu s IB $1 jer se ona ne nalazi u bazi podataka.
Možda je već bila vraćena.',
+'undelete-error' => 'Došlo je do greške pri vraćanju obrisane stranice',
'undelete-error-short' => 'Greška pri vraćanju datoteke: $1',
'undelete-error-long' => 'Došlo je do greške pri vraćanju datoteke:
@@ -2527,6 +2668,7 @@ Pogledajte [[Special:BlockList|spisak blokiranih IP adresa]] za pregled blokiran
'blocklist-userblocks' => 'Sakrij blokiranja naloga',
'blocklist-tempblocks' => 'Sakrij privremena blokiranja',
'blocklist-addressblocks' => 'Sakrij pojedinaÄna blokiranja IP adrese',
+'blocklist-rangeblocks' => 'Sakrij blokiranja opsega',
'blocklist-timestamp' => 'Vreme i datum',
'blocklist-target' => 'Korisnik',
'blocklist-expiry' => 'IstiÄe',
@@ -2549,6 +2691,7 @@ Pogledajte [[Special:BlockList|spisak blokiranih IP adresa]] za pregled blokiran
'unblocklink' => 'deblokiraj',
'change-blocklink' => 'promeni blokiranje',
'contribslink' => 'doprinosi',
+'emaillink' => 'pošalji e-poruku',
'autoblocker' => 'Samoblokirani ste jer delite IP adresu s {{GENDER:$1|korisnikom|korisnicom|korisnikom}} [[User:$1|$1]].
Razlog blokiranja: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'Dnevnik blokiranja',
@@ -2679,9 +2822,6 @@ RuÄno ih spojite.'''",
'movepage-page-moved' => 'Stranica $1 je premeštena u $2.',
'movepage-page-unmoved' => 'Stranica $1 ne može da se premesti na $2.',
'movepage-max-pages' => 'Najviše $1 {{PLURAL:$1|stranica je premeštena|stranice su premeštene|stranica je premešteno}}, i više ne može da bude automatski premešteno.',
-'1movedto2' => 'je promenio ime Älanku [[$1]] u [[$2]]',
-'1movedto2_redir' => 'je promenio ime Älanku [[$1]] u [[$2]] putem preusmerenja',
-'move-redirect-suppressed' => 'preusmerenje nije napravljeno',
'movelogpage' => 'Dnevnik premeštanja',
'movelogpagetext' => 'Ispod se nalazi spisak premeštanja stranica.',
'movesubpage' => '{{PLURAL:$1|Podstranica|Podstranice|Podstranica}}',
@@ -2695,7 +2835,7 @@ RuÄno ih spojite.'''",
Odredišna stranica „[[:$1]]“ već postoji.
Želite li da je obrišete da biste oslobodili mesto za preusmerenje?',
'delete_and_move_confirm' => 'Da, obriši stranicu',
-'delete_and_move_reason' => 'Obrisano kako bi se napravilo mesto za premeštanje',
+'delete_and_move_reason' => 'Obrisano da se oslobodi mesto za premeštanje iz „[[$1]]“',
'selfmove' => 'Izvorni i odredišni naslovi su istovetni;
ne mogu da premestim stranicu preko same sebe.',
'immobile-source-namespace' => 'Ne mogu da premestim stranice u imenskom prostoru „$1“',
@@ -2726,9 +2866,11 @@ Ovo onda može biti uvezeno u drugi viki koji koristi Medijaviki softver preko [
Da biste izvezli stranice, unesite nazive u okviru ispod, s jednim naslovom po redu, i izaberite da li želite tekuću izmenu i sve ostale, ili samo tekuću izmenu s podacima o poslednjoj izmeni.
U drugom sluÄaju, možete koristiti i vezu, na primer [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Izvezi sve stranice',
'exportcuronly' => 'UkljuÄi samo tekuću izmenu, ne celu istoriju',
'exportnohistory' => "----
'''Napomena:''' izvoz pune istorije stranica preko ovog obrasca je onemogućeno iz tehniÄkih razloga.",
+'exportlistauthors' => 'UkljuÄi celokupan spisak doprinosilaca za svaku stranicu',
'export-submit' => 'Izvezi',
'export-addcattext' => 'Dodaj stranice iz kategorije:',
'export-addcat' => 'Dodaj',
@@ -2761,6 +2903,8 @@ Posetite [//www.mediawiki.org/wiki/Localisation Medijaviki lokalizaciju] i [//tr
'thumbnail_error' => 'Greška pri stvaranju minijature: $1',
'djvu_page_error' => 'DjVu stranica je nedostupna',
'djvu_no_xml' => 'Ne mogu da preuzmem XML za datoteku DjVu.',
+'thumbnail-temp-create' => 'Ne mogu da napravim privremenu datoteku minijature',
+'thumbnail-dest-create' => 'Ne mogu da saÄuvam minijaturu u odrediÅ¡tu',
'thumbnail_invalid_params' => 'Neispravni parametri za minijaturu',
'thumbnail_dest_directory' => 'Ne mogu da napravim odredišnu fasciklu',
'thumbnail_image-type' => 'Vrsta slike nije podržana',
@@ -2809,6 +2953,11 @@ Nedostaje privremena fascikla.',
'import-token-mismatch' => 'Gubitak podataka o sesiji.
Pokušajte ponovo.',
'import-invalid-interwiki' => 'Ne mogu da uvozim s navedenog vikija.',
+'import-error-edit' => 'Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je uređujete.',
+'import-error-create' => 'Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je napravite.',
+'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (međuviki).',
+'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
+'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
# Import log
'importlogpage' => 'Dnevnik uvoza',
@@ -2818,72 +2967,85 @@ Pokušajte ponovo.',
'import-logentry-interwiki' => 'premešteno s drugog vikija: $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} od $2',
+# JavaScriptTest
+'javascripttest' => 'Javaskript test',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-title' => 'Izvršavanje testova za $1',
+'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
+'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
+'javascripttest-pagetext-frameworks' => 'Izaberite jedan od sledećih radnih okvira: $1',
+'javascripttest-pagetext-skins' => 'Izaberite s kojom temom želite da pokrenete probu:',
+'javascripttest-qunit-intro' => 'Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.',
+'javascripttest-qunit-heading' => 'Medijavikijin paket za testiranje – QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'VaÅ¡a korisniÄka stranica',
-'tooltip-pt-anonuserpage' => 'KorisniÄka stranica za IP adresu s koje ureÄ‘ujete',
-'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
-'tooltip-pt-anontalk' => 'Razgovor o izmenama s ove IP adrese',
-'tooltip-pt-preferences' => 'Vaša podešavanja',
-'tooltip-pt-watchlist' => 'Spisak stranica koje nadgledate',
-'tooltip-pt-mycontris' => 'Spisak vaših doprinosa',
-'tooltip-pt-login' => 'PreporuÄujemo vam da se prijavite, iako to nije obavezno.',
-'tooltip-pt-anonlogin' => 'PreporuÄujemo vam da se prijavite, iako to nije obavezno.',
-'tooltip-pt-logout' => 'Odjavite se',
-'tooltip-ca-talk' => 'Razgovor o stranici sa sadržajem',
-'tooltip-ca-edit' => 'Možete da uređujete ovu stranicu. Koristite pretpregled pre snimanja',
-'tooltip-ca-addsection' => 'ZapoÄnite novi odeljak',
-'tooltip-ca-viewsource' => 'Ova stranica je zakljuÄana. Možete da vidite izvorni kod.',
-'tooltip-ca-history' => 'Prethodna izdanja ove stranice',
-'tooltip-ca-protect' => 'Zaštitite ovu stranicu',
-'tooltip-ca-unprotect' => 'Promeni zaštitu ove stranice',
-'tooltip-ca-delete' => 'Obrišite ovu stranicu',
-'tooltip-ca-undelete' => 'Vrati izmene napravljene na ovoj stranici pre nego Å¡to bude obrisana',
-'tooltip-ca-move' => 'Premesti ovu stranicu',
-'tooltip-ca-watch' => 'Dodaj ovu stranicu na spisak nadgledanja',
-'tooltip-ca-unwatch' => 'Ukloni ovu stranicu sa spiska nadgledanja',
-'tooltip-search' => 'Pretraga',
-'tooltip-search-go' => 'Idite na stranicu s ovim imenom, ako postoji',
-'tooltip-search-fulltext' => 'Pretražite stranice s ovim tekstom',
-'tooltip-p-logo' => 'Posetite naslovnu stranu',
-'tooltip-n-mainpage' => 'Posetite naslovnu stranu',
-'tooltip-n-mainpage-description' => 'Posetite naslovnu stranu',
-'tooltip-n-portal' => 'O projektu, šta možete da radite i gde da pronađete stvari',
-'tooltip-n-currentevents' => 'Saznajte više o tekućim događajima',
-'tooltip-n-recentchanges' => 'Spisak skorašnjih izmena na vikiju',
-'tooltip-n-randompage' => 'Otvorite sluÄajnu stranicu',
-'tooltip-n-help' => 'Mesto gde možete da se informišete',
-'tooltip-t-whatlinkshere' => 'Spisak svih stranica koje vode ovde',
-'tooltip-t-recentchangeslinked' => 'Skorašnje izmene na stranicama koje su povezana s ovom stranicom',
-'tooltip-feed-rss' => 'RSS dovod ove stranice',
-'tooltip-feed-atom' => 'Atom dovod ove stranice',
-'tooltip-t-contributions' => 'Pogledajte spisak doprinosa ovog korisnika',
-'tooltip-t-emailuser' => 'Pošaljite e-poruku ovom korisniku',
-'tooltip-t-upload' => 'Pošaljite datoteke',
-'tooltip-t-specialpages' => 'Spisak svih posebnih stranica',
-'tooltip-t-print' => 'Izdanje za Å¡tampanje ove stranice',
-'tooltip-t-permalink' => 'Stalna veza ka ovoj izmeni stranice',
-'tooltip-ca-nstab-main' => 'Pogledajte stranicu sa sadržajem',
-'tooltip-ca-nstab-user' => 'Pogledajte korisniÄku stranicu',
-'tooltip-ca-nstab-media' => 'Pogledajte multimedijalnu datoteku',
-'tooltip-ca-nstab-special' => 'Ovo je posebna stranica. Ne možete je menjati.',
-'tooltip-ca-nstab-project' => 'Pogledajte stranicu projekta',
-'tooltip-ca-nstab-image' => 'Prikaži stranu datoteke',
-'tooltip-ca-nstab-mediawiki' => 'Pogledajte sistemsku poruku',
-'tooltip-ca-nstab-template' => 'Pogledajte Å¡ablon',
-'tooltip-ca-nstab-help' => 'Pogledajte stranicu za pomoć',
-'tooltip-ca-nstab-category' => 'Pogledajte stranicu kategorija',
-'tooltip-minoredit' => 'OznaÄite izmenu kao manju',
-'tooltip-save' => 'SaÄuvajte izmene koje ste napravili',
-'tooltip-preview' => 'Pregledajte svoje izmene. Poželjno je da koristite ovo dugme pre Äuvanja',
-'tooltip-diff' => 'Pogledajte sve izmene koje ste napravili na tekstu',
-'tooltip-compareselectedversions' => 'Pogledajte razlike između dve izabrane izmene ove stranice.',
-'tooltip-watch' => 'Dodajte ovu stranicu na spisak nadgledanja',
-'tooltip-recreate' => 'Ponovo napravite stranicu iako je obrisana',
-'tooltip-upload' => 'ZapoÄnite otpremanje',
-'tooltip-rollback' => '„Vrati“ poništava poslednju izmenu ove stranice s jednim klikom',
-'tooltip-undo' => 'Vraća ovu izmenu i otvara obrazac za uređivanje.',
-'tooltip-preferences-save' => 'SaÄuvaj postavke',
-'tooltip-summary' => 'Unesite kratak opis',
+'tooltip-pt-userpage' => 'VaÅ¡a korisniÄka stranica',
+'tooltip-pt-anonuserpage' => 'KorisniÄka stranica za IP adresu s koje ureÄ‘ujete',
+'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
+'tooltip-pt-anontalk' => 'Razgovor o izmenama s ove IP adrese',
+'tooltip-pt-preferences' => 'Vaša podešavanja',
+'tooltip-pt-watchlist' => 'Spisak stranica koje nadgledate',
+'tooltip-pt-mycontris' => 'Spisak vaših doprinosa',
+'tooltip-pt-login' => 'PreporuÄujemo vam da se prijavite, iako to nije obavezno.',
+'tooltip-pt-anonlogin' => 'PreporuÄujemo vam da se prijavite, iako to nije obavezno.',
+'tooltip-pt-logout' => 'Odjavite se',
+'tooltip-ca-talk' => 'Razgovor o stranici sa sadržajem',
+'tooltip-ca-edit' => 'Možete da uređujete ovu stranicu. Koristite pretpregled pre snimanja',
+'tooltip-ca-addsection' => 'ZapoÄnite novi odeljak',
+'tooltip-ca-viewsource' => 'Ova stranica je zakljuÄana. Možete da vidite izvorni kod.',
+'tooltip-ca-history' => 'Prethodna izdanja ove stranice',
+'tooltip-ca-protect' => 'Zaštitite ovu stranicu',
+'tooltip-ca-unprotect' => 'Promeni zaštitu ove stranice',
+'tooltip-ca-delete' => 'Obrišite ovu stranicu',
+'tooltip-ca-undelete' => 'Vrati izmene napravljene na ovoj stranici pre nego Å¡to bude obrisana',
+'tooltip-ca-move' => 'Premesti ovu stranicu',
+'tooltip-ca-watch' => 'Dodaj ovu stranicu na spisak nadgledanja',
+'tooltip-ca-unwatch' => 'Ukloni ovu stranicu sa spiska nadgledanja',
+'tooltip-search' => 'Pretraga',
+'tooltip-search-go' => 'Idite na stranicu s ovim imenom, ako postoji',
+'tooltip-search-fulltext' => 'Pretražite stranice s ovim tekstom',
+'tooltip-p-logo' => 'Posetite naslovnu stranu',
+'tooltip-n-mainpage' => 'Posetite naslovnu stranu',
+'tooltip-n-mainpage-description' => 'Posetite naslovnu stranu',
+'tooltip-n-portal' => 'O projektu, šta možete da radite i gde da pronađete stvari',
+'tooltip-n-currentevents' => 'Saznajte više o tekućim događajima',
+'tooltip-n-recentchanges' => 'Spisak skorašnjih izmena na vikiju',
+'tooltip-n-randompage' => 'Otvorite sluÄajnu stranicu',
+'tooltip-n-help' => 'Mesto gde možete da se informišete',
+'tooltip-t-whatlinkshere' => 'Spisak svih stranica koje vode ovde',
+'tooltip-t-recentchangeslinked' => 'Skorašnje izmene na stranicama koje su povezana s ovom stranicom',
+'tooltip-feed-rss' => 'RSS dovod ove stranice',
+'tooltip-feed-atom' => 'Atom dovod ove stranice',
+'tooltip-t-contributions' => 'Pogledajte spisak doprinosa ovog korisnika',
+'tooltip-t-emailuser' => 'Pošaljite e-poruku ovom korisniku',
+'tooltip-t-upload' => 'Pošaljite datoteke',
+'tooltip-t-specialpages' => 'Spisak svih posebnih stranica',
+'tooltip-t-print' => 'Izdanje za Å¡tampanje ove stranice',
+'tooltip-t-permalink' => 'Stalna veza ka ovoj izmeni stranice',
+'tooltip-ca-nstab-main' => 'Pogledajte stranicu sa sadržajem',
+'tooltip-ca-nstab-user' => 'Pogledajte korisniÄku stranicu',
+'tooltip-ca-nstab-media' => 'Pogledajte multimedijalnu datoteku',
+'tooltip-ca-nstab-special' => 'Ovo je posebna stranica. Ne možete je menjati.',
+'tooltip-ca-nstab-project' => 'Pogledajte stranicu projekta',
+'tooltip-ca-nstab-image' => 'Prikaži stranu datoteke',
+'tooltip-ca-nstab-mediawiki' => 'Pogledajte sistemsku poruku',
+'tooltip-ca-nstab-template' => 'Pogledajte Å¡ablon',
+'tooltip-ca-nstab-help' => 'Pogledajte stranicu za pomoć',
+'tooltip-ca-nstab-category' => 'Pogledajte stranicu kategorija',
+'tooltip-minoredit' => 'OznaÄite izmenu kao manju',
+'tooltip-save' => 'SaÄuvajte izmene koje ste napravili',
+'tooltip-preview' => 'Pregledajte svoje izmene. Poželjno je da koristite ovo dugme pre Äuvanja',
+'tooltip-diff' => 'Pogledajte sve izmene koje ste napravili na tekstu',
+'tooltip-compareselectedversions' => 'Pogledajte razlike između dve izabrane izmene ove stranice.',
+'tooltip-watch' => 'Dodajte ovu stranicu na spisak nadgledanja',
+'tooltip-watchlistedit-normal-submit' => 'Ukloni naslove',
+'tooltip-watchlistedit-raw-submit' => 'Ažuriraj spisak',
+'tooltip-recreate' => 'Ponovo napravite stranicu iako je obrisana',
+'tooltip-upload' => 'ZapoÄnite otpremanje',
+'tooltip-rollback' => '„Vrati“ poništava poslednju izmenu ove stranice s jednim klikom',
+'tooltip-undo' => 'Vraća ovu izmenu i otvara obrazac za uređivanje.',
+'tooltip-preferences-save' => 'SaÄuvaj postavke',
+'tooltip-summary' => 'Unesite kratak opis',
# Stylesheets
'common.css' => '/** CSS postavljen ovde će se odraziti na sve teme */',
@@ -2982,9 +3144,6 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
# Patrol log
'patrol-log-page' => 'Dnevnik patroliranja',
'patrol-log-header' => 'Ovo je istorija pregledanih izmena.',
-'patrol-log-line' => 'obeležena verzija $1 strane $2 kao patrolirana ($3)',
-'patrol-log-auto' => '(automatski)',
-'patrol-log-diff' => 'revizija $1',
'log-show-hide-patrol' => '$1 dnevnik patroliranja',
# Image deletion
@@ -3012,11 +3171,11 @@ Ako ga pokrenete, vaÅ¡ raÄunar može biti ugrožen.",
'file-info' => 'veliÄina: $1, MIME vrsta: $2',
'file-info-size' => '$1 × $2 piksela, veliÄina: $3, MIME vrsta: $4',
'file-info-size-pages' => '$1 × $2 piksela, veliÄina: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}',
-'file-nohires' => '<small>Nije dostupna veća rezolucija</small>',
+'file-nohires' => 'Veća rezolucija nije dostupna.',
'svg-long-desc' => 'SVG datoteka, nominalno $1 × $2 piksela, veliÄina: $3',
'show-big-image' => 'Puna veliÄina',
-'show-big-image-preview' => '<small>VeliÄina ovog prikaza: $1.</small>.</small>',
-'show-big-image-other' => '<small>Ostale veliÄine: $1.</small>',
+'show-big-image-preview' => 'VeliÄina ovog prikaza: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.',
'show-big-image-size' => '$1 × $2 piksela',
'file-info-gif-looped' => 'petlja',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kadar|kadra|kadrova}}',
@@ -3037,7 +3196,16 @@ Ako ga pokrenete, vaÅ¡ raÄunar može biti ugrožen.",
'sp-newimages-showfrom' => 'prikaži nove datoteke poÄevÅ¡i od $1, $2',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'video-dims' => '$1, $2×$3',
+'video-dims' => '$1, $2×$3',
+'seconds-abbrev' => '$1 s',
+'minutes-abbrev' => '$1 m',
+'hours-abbrev' => '$1 Ä',
+'days-abbrev' => '$1 d',
+'seconds' => '{{PLURAL:$1|$1 sekunda|$1 sekunde|$1 sekundi}}',
+'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}}',
+'ago' => 'pre $1',
# Bad image list
'bad_image_list' => 'Format je sledeći:
@@ -3096,6 +3264,11 @@ Variants for Chinese language
'variantname-ike-latn' => 'ike-Latn',
'variantname-iu' => 'iu',
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-Tfng',
+'variantname-shi-latn' => 'shi-Latn',
+'variantname-shi' => 'shi',
+
# Metadata
'metadata' => 'Metapodaci',
'metadata-help' => 'Ova datoteka sadrži dodatne podatke koji verovatno dolaze od digigalnih fotoaparata ili skenera.
@@ -3625,13 +3798,6 @@ Ovaj potvrdni kod istiÄe $6 u $7.',
'scarytranscludefailed' => '[Dobavljanje Å¡ablona za $1 nije uspelo]',
'scarytranscludetoolong' => '[URL adresa je predugaÄka]',
-# Trackbacks
-'trackbackbox' => 'Vraćanja za ovaj Älanak:<br />
-$1',
-'trackbackremove' => '([$1 Brisanje])',
-'trackbacklink' => 'Vraćanje',
-'trackbackdeleteok' => 'Vraćanje je uspešno obrisano.',
-
# Delete conflict
'deletedwhileediting' => "'''Upozorenje''': ova stranica je obrisana nakon Å¡to ste poÄeli s ureÄ‘ivanjem!",
'confirmrecreate' => "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|obrisa}} ovu stranicu nakon Å¡to ste poÄeli da je ureÄ‘ujete, sa sledećim razlogom:
@@ -3792,6 +3958,7 @@ Možete da [[Special:EditWatchlist|koristite i obiÄan ureÄ‘ivaÄ]].',
'hebrew-calendar-m12-gen' => 'Elul',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])',
'timezone-utc' => 'UTC',
# Core parser functions
@@ -3894,13 +4061,16 @@ Slike su prikazane u punoj veliÄini, a druge vrste datoteka se pokreću pomoću
'tags-hitcount' => '$1 {{PLURAL:$1|izmena|izmene|izmena}}',
# Special:ComparePages
-'comparepages' => 'Upoređivanje stranica',
-'compare-selector' => 'Upoređivanje izmena stranice',
-'compare-page1' => 'Stranica 1',
-'compare-page2' => 'Stranica 2',
-'compare-rev1' => 'Izmena 1',
-'compare-rev2' => 'Izmena 2',
-'compare-submit' => 'Uporedi',
+'comparepages' => 'Upoređivanje stranica',
+'compare-selector' => 'Upoređivanje izmena stranice',
+'compare-page1' => 'Stranica 1',
+'compare-page2' => 'Stranica 2',
+'compare-rev1' => 'Izmena 1',
+'compare-rev2' => 'Izmena 2',
+'compare-submit' => 'Uporedi',
+'compare-invalid-title' => 'Navedeni naslov je neispravan.',
+'compare-title-not-exists' => 'Navedeni naslov ne postoji.',
+'compare-revision-not-exists' => 'Navedena izmena ne postoji.',
# Database error messages
'dberr-header' => 'Ovaj viki ne radi kako treba',
@@ -3927,4 +4097,90 @@ Slike su prikazane u punoj veliÄini, a druge vrste datoteka se pokreću pomoću
'sqlite-has-fts' => '$1 s podrškom pretrage celog teksta',
'sqlite-no-fts' => '$1 bez podrške pretrage celog teksta',
+# New logging system
+'logentry-delete-delete' => '$1 je obrisao stranicu $3',
+'logentry-delete-restore' => '$1 je vratio stranicu $3',
+'logentry-delete-event' => '$1 je promenio vidljivost {{PLURAL:$5|događaja u istoriji|$5 događaja u istoriji|$5 događaja u istoriji}} na $3: $4',
+'logentry-delete-revision' => '$1 je promenio vidljivost {{PLURAL:$5|izmene|$5 izmene|$5 izmena}} na stranici $3: $4',
+'logentry-delete-event-legacy' => '$1 je promenio vidljivost događajâ u istoriji na $3',
+'logentry-delete-revision-legacy' => '$1 je promenio vidljivost izmenâ na stranici $3',
+'logentry-suppress-delete' => '$1 je potisnuo stranicu $3',
+'logentry-suppress-event' => '$1 je potajno promenio vidljivost {{PLURAL:$5|događaja u istoriji|$5 događaja u istoriji|$5 događaja u istoriji}} na $3: $4',
+'logentry-suppress-revision' => '$1 je potajno promenio vidljivost {{PLURAL:$5|izmene|$5 izmene|$5 izmena}} na stranici $3: $4',
+'logentry-suppress-event-legacy' => '$1 je potajno promenio vidljivost događajâ u istoriji na $3',
+'logentry-suppress-revision-legacy' => '$1 je potajno promenio vidljivost izmenâ na stranici $3',
+'revdelete-content-hid' => 'sadržaj je sakriven',
+'revdelete-summary-hid' => 'opis izmene je sakriven',
+'revdelete-uname-hid' => 'korisniÄko ime je sakriveno',
+'revdelete-content-unhid' => 'sadržaj je otkriven',
+'revdelete-summary-unhid' => 'opis izmene je otkriven',
+'revdelete-uname-unhid' => 'korisniÄko ime je otkriveno',
+'revdelete-restricted' => 'primenjena ograniÄenja za administratore',
+'revdelete-unrestricted' => 'uklonjena ograniÄenja za administratore',
+'logentry-move-move' => '$1 je premestio stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 je premestio stranicu $3 na $4 bez ostavljanja preusmerenja',
+'logentry-move-move_redir' => '$1 je premestio stranicu $3 na $4 preko preusmerenja',
+'logentry-move-move_redir-noredirect' => '$1 je premestio stranicu $3 na $4 preko preusmerenja bez ostavljanja preusmerenja',
+'logentry-patrol-patrol' => '$1 je oznaÄio izmenu $4 stranice $3 kao pregledanu',
+'logentry-patrol-patrol-auto' => '$1 je samostalno oznaÄio izmenu $4 stranice $3 kao pregledanu',
+'logentry-newusers-newusers' => '$1 je otvorio korisniÄki nalog',
+'logentry-newusers-create' => '$1 je otvorio korisniÄki nalog',
+'logentry-newusers-create2' => '$1 je otvorio korisniÄki nalog $3',
+'logentry-newusers-autocreate' => 'Nalog $1 je samostalno otvoren',
+'newuserlog-byemail' => 'lozinka je poslata e-poštom',
+
+# Feedback
+'feedback-bugornote' => 'Ako ste spremni da detaljno opiÅ¡ete tehniÄki problem, onda [$1 prijavite greÅ¡ku].
+U suprotnom, poslužite se jednostavnim obrascem ispod. VaÅ¡ komentar će stajati na stranici „[$3 $2]“, zajedno s korisniÄkim imenom i pregledaÄem koji koristite.',
+'feedback-subject' => 'Naslov:',
+'feedback-message' => 'Poruka:',
+'feedback-cancel' => 'Otkaži',
+'feedback-submit' => 'Pošalji povratnu informaciju',
+'feedback-adding' => 'Dodajem povratnu informaciju na stranicu…',
+'feedback-error1' => 'Greška: neprepoznat rezultat od API-ja',
+'feedback-error2' => 'Greška: uređivanje nije uspelo',
+'feedback-error3' => 'Greška: nema odgovora od API-ja',
+'feedback-thanks' => 'Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.',
+'feedback-close' => 'Urađeno',
+'feedback-bugcheck' => 'OdliÄno! Proverite da li je greÅ¡ka [$1 poznata od pre].',
+'feedback-bugnew' => 'Provereno. Prijavi novu grešku',
+
+# API errors
+'api-error-badaccess-groups' => 'Nije vam dozvoljeno da otpremate datoteke na ovaj viki.',
+'api-error-badtoken' => 'Unutrašnja greška: neispravan žeton.',
+'api-error-copyuploaddisabled' => 'Otpremanje putem adrese je onemogućeno na ovom serveru.',
+'api-error-duplicate' => 'Već {{PLURAL:$1|postoji [$2 druga datoteka]|postoje [$2 druge datoteke]}} s istim sadržajem.',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 druge datoteke]}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.',
+'api-error-duplicate-archive-popup-title' => '{{PLURAL:$1|Duplirana datoteka koja je već obrisana|Duplirane datoteke koje su već obrisane}}',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Duplirana datoteka|Duplirane datoteke}}',
+'api-error-empty-file' => 'Poslata datoteka je prazna.',
+'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
+'api-error-fetchfileerror' => 'Unutrašnja greška: došlo je do greške pri dobavljanju datoteke.',
+'api-error-file-too-large' => 'Poslata datoteka je prevelika.',
+'api-error-filename-tooshort' => 'Naziv datoteke je prekratak.',
+'api-error-filetype-banned' => 'Ova vrsta datoteke je zabranjena.',
+'api-error-filetype-missing' => 'Datoteci nedostaje nastavak.',
+'api-error-hookaborted' => 'Izmena je odbaÄena od kuke za proÅ¡irenja.',
+'api-error-http' => 'Unutrašnja greška: ne mogu da se povežem sa serverom.',
+'api-error-illegal-filename' => 'Naziv datoteke je zabranjen.',
+'api-error-internal-error' => 'Unutrašnja greška: došlo je do greške pri obrađivanju datoteke na vikiju.',
+'api-error-invalid-file-key' => 'Unutrašnja greška: ne mogu da pronađem datoteku u privremenom skladištu.',
+'api-error-missingparam' => 'Unutrašnja greška: nedostaju parametri u zahtevu.',
+'api-error-missingresult' => 'Unutrašnja greška: ne mogu da utvrdim da li je umnožavanje uspelo.',
+'api-error-mustbeloggedin' => 'Morate biti prijavljeni da biste otpremali datoteke.',
+'api-error-mustbeposted' => 'Unutrašnja greška: ne koristi se ispravan HTTP metod.',
+'api-error-noimageinfo' => 'Otpremanje je uspelo, ali server nije dao nikakav podatak o datoteci.',
+'api-error-nomodule' => 'Unutrašnja greška: nije postavljen modul za otpremanje.',
+'api-error-ok-but-empty' => 'Unutrašnja greška: server ne odgovara.',
+'api-error-overwrite' => 'Zamenjivanje postojeće datoteke je zabranjeno.',
+'api-error-stashfailed' => 'UnutraÅ¡nja greÅ¡ka: server ne može da saÄuva privremenu datoteku.',
+'api-error-timeout' => 'Server nije odgovorio u oÄekivano vreme.',
+'api-error-unclassified' => 'Došlo je do nepoznate greške',
+'api-error-unknown-code' => 'Nepoznata greška: „$1“',
+'api-error-unknown-error' => 'Unutrašnja greška: došlo je do greške pri otpremanju datoteke.',
+'api-error-unknown-warning' => 'Nepoznato upozorenje: $1',
+'api-error-unknownerror' => 'Nepoznata greška: „$1“.',
+'api-error-uploaddisabled' => 'Otpremanje je onemogućeno na ovom vikiju.',
+'api-error-verification-error' => 'Datoteka je oštećena ili ima neispravan nastavak.',
+
);
diff --git a/languages/messages/MessagesSrn.php b/languages/messages/MessagesSrn.php
index 977d55e0..556d87a8 100644
--- a/languages/messages/MessagesSrn.php
+++ b/languages/messages/MessagesSrn.php
@@ -112,44 +112,44 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#STIR', '#DOORVERWIJZING', '#REDIRECT' ),
- 'notoc' => array( '0', '__NOINOT__', '__GEENINHOUD__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__NOPIKTURAMA__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__INOTDWENGI__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INOT__', '__INHOUD__', '__TOC__' ),
- 'noeditsection' => array( '0', '__NOKENKISKAKI__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'CURRENTMOTNH', 'DISIMUN', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'DISIMUNNEN', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'DISIMUNNENGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'DISIMUNSH', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'DISIDEY', 'HUIDIGEDAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'DISIDEY2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'DISIDEYNEN', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'DISIYARI', 'HUIDIGJAAR', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'DISITEN', 'HUIDIGETIJD', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'DISIYURU', 'HUIDIGUUR', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'PRESIMUN', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonthname' => array( '1', 'PRESIMUNNEN', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'PRESIMUNNENGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'PRESIMUNSH', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'PRESIDEY', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'PRESIDEY2', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'PRESIDEYNEN', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'PRESIYARI', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'PRESITEN', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
- 'localhour' => array( '1', 'PRESIYURU', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'PAPIRANUMRO', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'PAPIRALEGIMNUMRO', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'GEFRENUMRO', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'MASYINNUMRO', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'KENKINUMRO', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'PAPIRANEN', 'PAGINANAAM', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'PAPIRANENE', 'PAGINANAAME', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NENPREKI', 'NAAMRUIMTE', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NENPREKIE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'TAKIPREKI', 'OVERLEGRUIMTE', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'TAKIPREKIE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
- 'special' => array( '0', 'spesyal', 'speciaal', 'special' ),
+ 'redirect' => array( '0', '#STIR', '#DOORVERWIJZING', '#REDIRECT' ),
+ 'notoc' => array( '0', '__NOINOT__', '__GEENINHOUD__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__NOPIKTURAMA__', '__GEEN_GALERIJ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__INOTDWENGI__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INOT__', '__INHOUD__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__NOKENKISKAKI__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'CURRENTMOTNH', 'DISIMUN', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'DISIMUNNEN', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'DISIMUNNENGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'DISIMUNSH', 'HUIDIGEMAANDAFK', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'DISIDEY', 'HUIDIGEDAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'DISIDEY2', 'HUIDIGEDAG2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'DISIDEYNEN', 'HUIDIGEDAGNAAM', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'DISIYARI', 'HUIDIGJAAR', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'DISITEN', 'HUIDIGETIJD', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'DISIYURU', 'HUIDIGUUR', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'PRESIMUN', 'PLAATSELIJKEMAAND', 'LOKALEMAAND', 'LOKALEMAAND2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonthname' => array( '1', 'PRESIMUNNEN', 'PLAATSELIJKEMAANDNAAM', 'LOKALEMAANDNAAM', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'PRESIMUNNENGEN', 'PLAATSELIJKEMAANDNAAMGEN', 'LOKALEMAANDNAAMGEN', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'PRESIMUNSH', 'PLAATSELIJKEMAANDAFK', 'LOKALEMAANDAFK', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'PRESIDEY', 'PLAATSELIJKEDAG', 'LOKALEDAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'PRESIDEY2', 'PLAATSELIJKEDAG2', 'LOKALEDAG2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'PRESIDEYNEN', 'PLAATSELIJKEDAGNAAM', 'LOKALEDAGNAAM', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'PRESIYARI', 'PLAATSELIJKJAAR', 'LOKAALJAAR', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'PRESITEN', 'PLAATSELIJKETIJD', 'LOKALETIJD', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'PRESIYURU', 'PLAATSELIJKUUR', 'LOKAALUUR', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'PAPIRANUMRO', 'AANTALPAGINAS', 'AANTALPAGINA\'S', 'AANTALPAGINA’S', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'PAPIRALEGIMNUMRO', 'AANTALARTIKELEN', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'GEFRENUMRO', 'AANTALBESTANDEN', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'MASYINNUMRO', 'AANTALGEBRUIKERS', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'KENKINUMRO', 'AANTALBEWERKINGEN', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'PAPIRANEN', 'PAGINANAAM', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'PAPIRANENE', 'PAGINANAAME', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NENPREKI', 'NAAMRUIMTE', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NENPREKIE', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'TAKIPREKI', 'OVERLEGRUIMTE', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'TAKIPREKIE', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
+ 'special' => array( '0', 'spesyal', 'speciaal', 'special' ),
);
$messages = array(
@@ -433,7 +433,6 @@ Wan réy fu spesrutu papira de fu feni na [[Special:SpecialPages|{{int:specialpa
'badtitletext' => 'A nen fu a papira san ben aksi no bun, leygi, noso abi wan miti go na inter-tongo noso inter-wiki nen san no bun.
A kan taki a abi wan noso moro karakter san no bun fu kebroiki gi nen.',
'viewsource' => 'Luku a source',
-'viewsourcefor' => 'fu $1',
'protectedpagetext' => 'A papira disi sroto gi kenki.',
'viewsourcetext' => 'Yu kan luku nanga kopi a source fu a papira disi:',
'ns-specialprotected' => 'Spesrutu papira no kan kenki.',
@@ -557,7 +556,6 @@ $1 tapu pasi gi yu. Disi na fu sanede ''$2''.
Yu kan skrifi $1 noso wan tra [[{{MediaWiki:Grouppage-sysop}}|beheerder]] fu taki abra a tapu pasi disi.
Yu n'o man kebroiki 'e-mail a kebroikiman disi', efu yu no abi wan bun email-nen ini yu [[Special:Preferences|seti]] én pasi tapu fu yu kebroiki en.
Yu IP now na $3 en a tapu pasi ID na #$5. Gi wan, noso ala tu, ini yu brifi te yu o skrifi fu aksi san psa.",
-'whitelistedittitle' => 'Yu mu kon fu a kenki',
'whitelistedittext' => 'Yu mu $1 fu a kenki fu peprewoysi.',
'loginreqtitle' => 'Yu mu kon',
'loginreqlink' => 'kon',
@@ -986,7 +984,6 @@ Iksi yu wan papira no langar wana si, go na a papira nanga du opo \"No si\" ini
'confirmdeletetext' => 'Yu wanaefru ben trowen wan papira, nanga si stori. Gi klari a dyaso-ondro ini a box taki disi we fuli yu miki ben, taki yu den folo luku nanga taki a trowe gu ben nanga a [[{{MediaWiki:Policy-url}}|polisi]].',
'actioncomplete' => 'Aksi e du',
'deletedtext' => '"$1" ben e trowe. Si a $2 fu wan sibuku fu bakaseywan trowe.',
-'deletedarticle' => 'puru "[[$1]]"',
'dellogpage' => 'Log buku fu puru',
'deletecomment' => 'Yesikrari:',
'deleteotherreason' => 'Trawan/okwan yesikrari:',
@@ -1094,7 +1091,6 @@ Gi wan trawan papiranen.',
'talkexists' => "'''A papira ben dribi, ma a taki papira kan no dribi sey sins da ala wan papira nanga a nyun nen ben. Presi den takipeprewoysi yuse.'''",
'movedto' => 'ben dribi na',
'movetalk' => 'Taki papira nangadribi',
-'1movedto2' => '[[$1]] froisi go na [[$2]]',
'movelogpage' => 'Log buku fu froisi',
'movereason' => 'Yesikrari:',
'revertmove' => 'drai baka',
@@ -1174,7 +1170,7 @@ Yu ka luku a source.',
# Media information
'widthheightpage' => '$1 × $2, $3 peprewoysi',
'file-info-size' => '$1 × $2 pixel, file marki: $3, MIME-type: $4',
-'file-nohires' => '<small>Moro srapu no de.</small>',
+'file-nohires' => 'Moro srapu no de.',
'svg-long-desc' => 'SVG file, marki $1 × $2 pixel, bigi: $3',
'show-big-image' => 'Moro srapu',
diff --git a/languages/messages/MessagesSt.php b/languages/messages/MessagesSt.php
index 9c7e960e..9a68da4a 100644
--- a/languages/messages/MessagesSt.php
+++ b/languages/messages/MessagesSt.php
@@ -8,6 +8,7 @@
* @file
*
* @author Cbrown1023
+ * @author Zyxoas (on st.wikipedia.org)
*/
$messages = array(
diff --git a/languages/messages/MessagesStq.php b/languages/messages/MessagesStq.php
index 8d6e86e6..007374cd 100644
--- a/languages/messages/MessagesStq.php
+++ b/languages/messages/MessagesStq.php
@@ -38,6 +38,11 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Kategorie_Diskussion',
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'Benutser', 'female' => 'Benutserske' ),
+ NS_USER_TALK => array( 'male' => 'Benutser_Diskussion', 'female' => 'Benutserske_Diskussion' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Ferwiese unnerstriekje:',
@@ -395,14 +400,13 @@ Mäld dit n [[Special:ListUsers/sysop|Administrator]] unner Naamenge fon ju URL.
Fielicht is ju al fon uurswál läsked wuuden.',
'badtitle' => 'Uungultige Tittel.',
'badtitletext' => 'Die anfräigede Tittel waas uungultich, loos, of n uungultigen Sproaklink fon n uur Wiki.',
-'perfcached' => 'Do foulgjende Doaten stamme uut dän Cache un sunt muugelkerwiese nit aktuäl:',
-'perfcachedts' => 'Disse Doaten stamme uut dän Cache, lääste Update: $1',
+'perfcached' => 'Do foulgjende Doaten stamme uut dän Cache un sunt muugelkerwiese nit aktuäl. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Disse Doaten stamme uut dän Cache, lääste Update: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "'''Ju Aktualisierengsfunktion foar disse Siede is apstuuns deaktivierd. Do Doaten wäide toueerst nit fernäierd.'''",
'wrong_wfQuery_params' => 'Falske Parameter foar wfQuery()<br />
Funktion: $1<br />
Oufroage: $2',
'viewsource' => 'Wältext betrachtje',
-'viewsourcefor' => 'foar $1',
'actionthrottled' => 'Aktionsantaal limitierd',
'actionthrottledtext' => 'Ju Uutfierenge fon disse Aktion tou oafte in ne kuute Tiedoustand is limitierd. Du hääst dit Limit juust ieuwen beloanged. Fersäik et in eenige Minuten fon näien.',
'protectedpagetext' => 'Disse Siede is foar dät Beoarbaidjen speerd.',
@@ -607,9 +611,6 @@ Du koast ju „E-Mail an dissen Benutser“-Funktion nit nutsje, soloange neen g
Dien aktuelle IP-Adresse is $3, und ju Speer-ID is $5.
Föich alle Informatione fon älke Anfroage bietou, ju du stoalst.',
'blockednoreason' => 'neen Begründenge ounroat',
-'blockedoriginalsource' => "Die Wältext fon '''$1''' wäd hier anwiesd:",
-'blockededitsource' => "Die Wältext '''fon dien Annerengen''' an '''$1''':",
-'whitelistedittitle' => 'Toun Beoarbaidjen is dät nöödich, anmälded tou weesen',
'whitelistedittext' => 'Du moast die $1, uum Artikkele beoarbaidje tou konnen.',
'confirmedittext' => 'Du moast dien E-Mail-Adresse eerste anärkanne, eer du beoarbaidje koast. Fäl dien E-Mail uut un ärkanne ju an in do [[Special:Preferences|Ienstaalengen]].',
'nosuchsectiontitle' => 'Kon ju Oudeelenge nit fiende',
@@ -847,8 +848,6 @@ Uur Administratore ap {{SITENAME}} hääbe Tougriep ap dän ferstatte Inhoold un
'revdelete-unsuppress' => 'Ienskränkengen foar wier häärstoalde Versione aphieuwje',
'revdelete-log' => 'Gruund:',
'revdelete-submit' => 'Ap uutwäälde {{PLURAL:$1|Version|Versione}} anweende',
-'revdelete-logentry' => 'Versionsansicht annerd foar [[$1]]',
-'logdelete-logentry' => 'annerde ju Sichtboarkaid foar [[$1]]',
'revdelete-success' => "'''Ju Versionsansicht wuud aktualisierd.'''",
'revdelete-failure' => "Ju Versionssichtboarkaid kon nit aktualisierd wäide:'''
$1",
@@ -860,15 +859,6 @@ $1",
'revdel-restore-visible' => 'sichtboare Revisione',
'pagehist' => 'Siedegeskichte',
'deletedhist' => 'Läskede Versione',
-'revdelete-content' => 'Siedeninhoold',
-'revdelete-summary' => 'Touhoopefoatengskommentoar',
-'revdelete-uname' => 'Benutsernoome',
-'revdelete-restricted' => 'Einskränkengen jäilde uk foar Administratore',
-'revdelete-unrestricted' => 'Ienskränkengen foar Administratore wächhoald',
-'revdelete-hid' => 'ferstatte $1',
-'revdelete-unhid' => 'moakede $1 wier eepentelk',
-'revdelete-log-message' => '$1 foar $2 {{PLURAL:$2|Version|Versione}}',
-'logdelete-log-message' => '$1 foar $2 {{PLURAL:$2|Logboukiendraach|Logboukiendraage}}',
'revdelete-hide-current' => 'Failer bie dät Fersteeten fon dän Iendraach fon $1, $2 Uure: Dit is ju aktuelle Version.
Ju kon nit ferstat wäide.',
'revdelete-show-no-access' => 'Failer bie dät Anwiesen fon dän Iendraach fon $1, $2 Uure: Dissen Iendraach wuud as "betüümt" markierd.
@@ -1020,7 +1010,7 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'prefs-rc' => 'Bekoandreekenge fon "Lääste Annerengen"',
'prefs-watchlist' => 'Beooboachtengslieste',
'prefs-watchlist-days' => 'Antaal fon Deege, do ju Beooboachtengslieste standoardmäitich uumfoatje skäl:',
-'prefs-watchlist-days-max' => 'Maximoal 7 Deege',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Maximoale Antaal fon Iendraage in ju fergratterde Beooboachtengslieste:',
'prefs-watchlist-edits-max' => 'Maximoale Antaal: 1000',
'prefs-watchlist-token' => 'Beooboachtengslieste-Token:',
@@ -1217,13 +1207,13 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
'right-autopatrol' => 'Markier oaine Beoarbaidengen automatisk as kontrollierd',
'right-patrolmarks' => 'Ankiekjen fon do Kontrolmarkierengen in do lääste Annerengen',
'right-unwatchedpages' => 'Bekiekje ju Lieste fon nit beooboachtede Sieden',
-'right-trackback' => 'Trackback fermiddelje',
'right-mergehistory' => 'Versionsgeskichten fon Sieden touhoopeföigje',
'right-userrights' => 'Benutsergjuchte beoarbaidje',
'right-userrights-interwiki' => 'Benutsergjuchte in uur Wikis beoarbaidje',
'right-siteadmin' => 'Doatenboank speere un äntspeere',
'right-override-export-depth' => 'Exportier Sieden touhoope mäd ferlinkede Sieden bit tou ne Djüpte fon 5',
'right-sendemail' => 'E-Mails an uur Benutsere seende',
+'right-passwordreset' => 'Paaswoud fon n Benutser touräächsätte ([[Special:PasswordReset|Spezioalsiede]])',
# User rights log
'rightslog' => 'Gjuchte-Logbouk',
@@ -1261,7 +1251,6 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
'action-patrol' => 'do Beoarbaidengen fon uur Benutsere tou kontrollierjen',
'action-autopatrol' => 'oaine Beoarbaidengen as kontrollierd tou markierjen',
'action-unwatchedpages' => 'ju Lieste fon uunbeoboachtede Sieden tou bekiekjen',
-'action-trackback' => 'n Trackback tou uurdreegen',
'action-mergehistory' => 'do Versionegeskichten fon Sieden fereenigje',
'action-userrights' => 'Benutsergjuchte tou annerjen',
'action-userrights-interwiki' => 'do Gjuchte fon Benutsere in uur Wikis annerje',
@@ -1796,12 +1785,8 @@ Sjuch uk ju Lieste fon do [[Special:WantedCategories|wonskede Kategorien]].',
'activeusers-noresult' => 'Neen Benutsere fuunen.',
# Special:Log/newusers
-'newuserlogpage' => 'Näianmäldengs-Logbouk',
-'newuserlogpagetext' => 'Dit is dät Logbouk fon näi anmäldede Benutsere.',
-'newuserlog-byemail' => 'dät Paaswoud wuud uur E-Mail fersoand',
-'newuserlog-create-entry' => 'Benutser wuude näi registrierd',
-'newuserlog-create2-entry' => 'moakede näi Benutserkonto „$1“',
-'newuserlog-autocreate-entry' => 'Benutserkonto wuud automatisk moaked',
+'newuserlogpage' => 'Näianmäldengs-Logbouk',
+'newuserlogpagetext' => 'Dit is dät Logbouk fon näi anmäldede Benutsere.',
# Special:ListGroupRights
'listgrouprights' => 'Benutsergruppen-Gjuchte',
@@ -1940,8 +1925,6 @@ Touräächmäldengen un wiedere Hälpe: {{canonicalurl:{{MediaWiki:Helppage}}}}'
'actionfailed' => 'Aktion misglukked',
'deletedtext' => '"$1" wuude läsked.
In $2 fiende Jie ne Lieste fon do lääste Läskengen.',
-'deletedarticle' => '"[[$1]]" wuude läsked',
-'suppressedarticle' => 'feranderde ju Sichtboarhaid fon „[[$1]]“',
'dellogpage' => 'Läsk-Logbouk',
'dellogpagetext' => 'Hier is ne Lieste fon do lääste Läskengen.',
'deletionlog' => 'Läsk-Logbouk',
@@ -2060,7 +2043,6 @@ Die aktuelle Text fon ju läskede Siede is bloot Administratore tougongelk.',
'undeletereset' => 'Oubreeke',
'undeleteinvert' => 'Uutwoal uumekiere',
'undeletecomment' => 'Gruund:',
-'undeletedarticle' => 'häd "[[$1]]" wier häärstoald',
'undeletedrevisions' => '{{PLURAL:$1|1 Version wuude|$1 Versione wuuden}} wier häärstoald',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Doatäi|$2 Doatäie}} wuuden wier häärstoald',
'undeletedfiles' => '{{PLURAL:$1|1 Doatäie wuude|$1 Doatäie wuuden}} wier häärstoald',
@@ -2334,9 +2316,6 @@ Fersäik jädden n uur Noome.',
'movepage-page-moved' => 'Ju Siede „$1“ wuude ätter „$2“ ferskäuwen.',
'movepage-page-unmoved' => 'Ju Siede „$1“ kuude nit ätter „$2“ ferskäuwen wäide.',
'movepage-max-pages' => 'Ju Maximoalantaal fon $1 {{PLURAL:$1|Siede|Sieden}} wuude ferskäuwen. Aal wiedere Sieden konnen nit automatisk ferskäuwen wäide.',
-'1movedto2' => 'häd "[[$1]]" ätter "[[$2]]" ferskäuwen',
-'1movedto2_redir' => 'häd „[[$1]]“ ätter „[[$2]]“ ferskäuwen un deerbie ne Fääreleedenge uurskrieuwen',
-'move-redirect-suppressed' => 'Fäärelaitenge unnerdrukt',
'movelogpage' => 'Ferskuuwengs-Logbouk',
'movelogpagetext' => 'Dit is ne Lieste fon aal ferskäuwene Sieden.',
'movesubpage' => '{{PLURAL:$1|Unnersiede|Unnersieden}}',
@@ -2577,9 +2556,6 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
# Patrol log
'patrol-log-page' => 'Kontrol-Logbouk',
'patrol-log-header' => 'Dit is dät Kontroll-Logbouk.',
-'patrol-log-line' => 'häd $1 fon $2 as kontrollierd markierd $3',
-'patrol-log-auto' => '(automatisk)',
-'patrol-log-diff' => 'Version $1',
'log-show-hide-patrol' => 'Kontroll-Logbouk $1',
# Image deletion
@@ -2604,11 +2580,11 @@ $1',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|1 Siede|$3 Sieden}}',
'file-info' => 'Doatäigrööte: $1, MIME-Typ: $2',
'file-info-size' => '$1 × $2 Pixel, Doatäigrööte: $3, MIME-Typ: $4',
-'file-nohires' => '<small>Neen haagere Aplöösenge foarhounden.</small>',
+'file-nohires' => 'Neen haagere Aplöösenge foarhounden.',
'svg-long-desc' => 'SVG-Doatäi, Basisgrööte: $1 × $2 Pixel, Doatäigrööte: $3',
'show-big-image' => 'Bielde in hooge Aplöösenge',
-'show-big-image-preview' => '<small>Grööte fon dissen Foarbekiek: $1.</small>',
-'show-big-image-other' => '<small>uur Aplöösengen: $1.</small>',
+'show-big-image-preview' => 'Grööte fon dissen Foarbekiek: $1.',
+'show-big-image-other' => 'uur Aplöösengen: $1.',
'show-big-image-size' => '$1 × $2 Pixele',
'file-info-gif-looped' => 'Eendloos-Strik',
'file-info-gif-frames' => '$1 {{PLURAL:$1|Bielde|Bielden}}',
@@ -2629,7 +2605,7 @@ $1',
'sp-newimages-showfrom' => 'Wies näie Doatäie, ounfangend mäd $1, $2 Uure',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'U',
+'hours-abbrev' => '$1U',
# Bad image list
'bad_image_list' => 'Dät Formoat is as foulget:
@@ -2997,13 +2973,6 @@ Disse Bestäätigengskode is gultich bit $4',
'scarytranscludefailed' => '[Foarloagenienbiendenge foar $1 is misglukked]',
'scarytranscludetoolong' => '[URL is tou loang]',
-# Trackbacks
-'trackbackbox' => 'Trackbacks foar disse Siede:<br />
-$1',
-'trackbackremove' => '([$1 läskje])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback wuude mäd Ärfoulch läsked.',
-
# Delete conflict
'deletedwhileediting' => 'Oachtenge: Disse Siede wuude al läsked, ätter dät du anfangd hiedest, hier tou beoarbaidjen!
Kiekje in dät [{{fullurl:Special:Log|type=delete&page=}}{{FULLPAGENAMEE}} Läsk-Logbouk] ätter,
@@ -3209,4 +3178,9 @@ Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''
'sqlite-has-fts' => 'Version $1 mäd Unnerstutsenge foar ju Fultäkstsäike',
'sqlite-no-fts' => 'Version $1 sunner Unnerstutsenge foaar ju Fultäkstsäike',
+# New logging system
+'revdelete-restricted' => 'Einskränkengen jäilde uk foar Administratore',
+'revdelete-unrestricted' => 'Ienskränkengen foar Administratore wächhoald',
+'newuserlog-byemail' => 'dät Paaswoud wuud uur E-Mail fersoand',
+
);
diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php
index 78a63823..150b60c9 100644
--- a/languages/messages/MessagesSu.php
+++ b/languages/messages/MessagesSu.php
@@ -485,18 +485,20 @@ Mangga laporkeun ha ieu ka salasaurang [[Special:ListUsers/sysop|Kuncén]], bari
'badarticleerror' => 'Peta ieu teu bisa dipigawé na kaca ieu.',
'cannotdelete' => 'Kaca atawa berkas "$1" teu bisa dihapus.
Sigana geus dihapus ku nu séjén.',
+'cannotdelete-title' => 'Hanteu bisa ngahapus kaca "$1"',
'badtitle' => 'Judul goréng',
'badtitletext' => 'Judul kaca nu dipénta teu bener, kosong, atawa judul antarbasa atawa antarwikina salah tutumbu.',
-'perfcached' => 'Data di handap ieu sindangan sahingga--meureun--teu mutahir:',
-'perfcachedts' => 'Data di handap ieu mah sindangan, panungtungan diropéa téh $1.',
+'perfcached' => 'Data di handap ieu sindangan sahingga--meureun--teu mutahir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Data di handap ieu mah sindangan, panungtungan diropéa téh $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Pangrobahan ahir ti kaca ieu keur dipaéhkeun. Data anu aya di dieu ayeuna moal dimuat deui.',
'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamenta: $2',
'viewsource' => 'Témbongkeun sumber',
-'viewsourcefor' => 'pikeun $1',
+'viewsource-title' => 'Témbongkeun sumber pikeun $1',
'actionthrottled' => 'Peta diwates',
'actionthrottledtext' => 'Salaku tetengger anti-spam, anjeun teu diwenangkeun loba kitu peta dina jangka waktu anu sakitu heureutna. Mangga lajengkeun deui sanggeus sababaraha menit ka payun.',
'protectedpagetext' => 'Ieu kaca dikonci ngarah teu bisa dirobah.',
'viewsourcetext' => 'Anjeun bisa némbongkeun sarta nyalin sumber ieu kaca:',
+'viewyourtext' => "Anjeun bisa némbongkeun sarta nyalin sumber '''éditan anjeun''' ka ieu kaca:",
'protectedinterface' => 'Kaca ieu eusina teks antarmuka pikeun dipaké ku pakakas beyé sarta geus dikunci pikeun ngahindar ti kasalahan.',
'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.
@@ -590,6 +592,7 @@ anjeun teu bisa nyieun deui samentara waktu.',
'emailconfirmlink' => 'Konfirmasi alamat surélék anjeun',
'invalidemailaddress' => 'Alamat surélék teu bisa ditarima sabab formatna salah.
Mangga lebetkeun alamat nu formatna bener atawa kosongkeun baé.',
+'cannotchangeemail' => 'Alamat surat-é akun hanteu bisa dirobah di ieu wiki.',
'accountcreated' => 'Rekening geus dijieun.',
'accountcreatedtext' => 'Rekening pamaké pikeun $1 geus dijieun.',
'createaccount-title' => 'Nyieun rekening keur {{SITENAME}}',
@@ -605,6 +608,7 @@ Tungguan heula sakeudeung, laju cobaan deui.',
# E-mail sending
'php-mail-error-unknown' => 'Kasalahan nu teu kanyahoan dina fungsi PHP surélék().',
+'user-mail-no-addy' => 'Nyobaan ngirim surélék tanpa alamat.',
# Change password dialog
'resetpass' => 'Ganti kecap sandi rekening',
@@ -632,6 +636,7 @@ Bisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.
'passwordreset-pretext' => '{{PLURAL:$1||Asupkeun salah sahiji data di handap ieu}}',
'passwordreset-username' => 'Sandiasma:',
'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Témbongkeun surat-é hasilna?',
'passwordreset-email' => 'Alamat surélék:',
'passwordreset-emailtitle' => 'Wincikan akun di {{SITENAME}}',
'passwordreset-emailtext-ip' => 'Aya (bisa jadi Anjeun, ti alamat IP $1) ménta dibéjaan ngeunaan akun di {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} di handap patali jeung alamat ieu surélék:
@@ -653,6 +658,17 @@ ngarobah deui, Anjeun bisa teu maliré ieu talatah sarta terus ngagunakeun sandi
Sandi saheulaanan: $2',
'passwordreset-emailsent' => 'Surélék pangéling geus dikirim.',
+# Special:ChangeEmail
+'changeemail' => 'Ganti alamat surélék',
+'changeemail-header' => 'Ganti alamat surélék akun',
+'changeemail-text' => 'Lengkepan ieu formulir pikeun ngaganti alamat surélék. Anjeun bakal kudu ngasupkeun sandi pikeun ngonfirmasi ieu parobahan.',
+'changeemail-no-info' => 'Anjeun kudu asup log pikeun bisa muka ieu kaca sacara langsung.',
+'changeemail-oldemail' => 'Alamat surélék ayeuna:',
+'changeemail-newemail' => 'Alamat surélék anyar:',
+'changeemail-none' => '(euweuh)',
+'changeemail-submit' => 'Ganti surélék',
+'changeemail-cancel' => 'Bolay',
+
# Edit page toolbar
'bold_sample' => 'Téks kandel',
'bold_tip' => 'Téks kandel',
@@ -721,9 +737,6 @@ Catet yén anjeun moal bisa migunakeun fitur "surélékan ieu pamaké" mun alama
Alamat IP Anjeun ayeuna nyaéta $3, sarta ID peungpeukan anjeun #$5.
Mangga sebatkeun éta ID dina pamundut-pamundut anjeun.',
'blockednoreason' => 'taya alesan',
-'blockedoriginalsource' => "Sumber '''$1''' dipidangkeun di handap ieu:",
-'blockededitsource' => "Tulisan '''éditan anjeun''' dina '''$1''' dipidangkeun di handap ieu:",
-'whitelistedittitle' => 'Perlu asup log sangkan bisa ngédit',
'whitelistedittext' => 'Anjeun kudu asup $1 sangkan bisa ngédit.',
'confirmedittext' => 'Saméméh ngédit, kompirmasikeun heula alamat surélék anjeun.
Mangga setél, lajeng sahkeun alamat surélék anjeun dina [[Special:Preferences|préferénsi pamaké]].',
@@ -950,8 +963,6 @@ Kuncén séjén bakalan bisa ngakses eusi nu nyumput sarta bisa ngabolaykeun hap
'revdelete-unsuppress' => 'Hapus watesan kana révisi anu geus dipulangkeun',
'revdelete-log' => 'Alesan:',
'revdelete-submit' => 'Larapkeun kana {{PLURAL:$1|révisi|révisi}} nu dipilih',
-'revdelete-logentry' => 'robah tampilan révisi pikeun [[$1]]',
-'logdelete-logentry' => 'Robah pangatur nyumputkeun tina [[$1]]',
'revdelete-success' => 'Pangaturan nyumpukeun révisi junun dilarapkeun.',
'revdelete-failure' => "'''Visibilitas révisi teu bisa diapdét:'''
$1",
@@ -963,15 +974,6 @@ $1",
'revdel-restore-visible' => 'révisi nu katémbong',
'pagehist' => 'Sajarah kaca',
'deletedhist' => 'Sajarah nu dihapus',
-'revdelete-content' => 'eusi',
-'revdelete-summary' => 'ringkesan ngédit',
-'revdelete-uname' => 'Landihan:',
-'revdelete-restricted' => 'akses geus dibatesan ukur keur kuncén',
-'revdelete-unrestricted' => 'Watesan akses kuncén dihapuskeun',
-'revdelete-hid' => 'sumputkeun $1',
-'revdelete-unhid' => 'tembongkeun $1',
-'revdelete-log-message' => '$1 Keur $2 {{PLURAL:$2|révisi}}',
-'logdelete-log-message' => '$1 keur $2 {{PLURAL:$2|kajadian|kajadian}}',
'revdelete-hide-current' => 'Éror nyumputkeun anu titimangsana $2, $1: ieu téh révisi kiwari.
Teu bisa disumputkeun.',
'revdelete-show-no-access' => 'Éror némbongkeun anu titimangsana $2, $1: geus ditandaan "diwates".
@@ -1122,11 +1124,13 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
'prefs-rc' => 'Panémbong robahan anyar jeung tukung',
'prefs-watchlist' => 'Awaskeuneun',
'prefs-watchlist-days' => 'Jumlah poé anu ditémbongkeun dina daptar awaskeuneun:',
-'prefs-watchlist-days-max' => 'Panglilana 7 poé',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Jumlah parobahan maksimum nu ditémbongkeun dina daptar panjang awaskeuneun:',
'prefs-watchlist-edits-max' => 'Panglobana: 1000',
'prefs-misc' => 'Pangaturan rupa-rupa',
'prefs-resetpass' => 'Ganti sandi',
+'prefs-changeemail' => 'Ganti alamat surélék',
+'prefs-setemail' => 'Asupkeun alamat surélék',
'prefs-email' => 'Pilihan surélék',
'prefs-rendering' => 'Pidangan',
'saveprefs' => 'Simpen préferénsi',
@@ -1220,7 +1224,7 @@ Mun geus anggeus teu bisa dibolaykeun.',
'userrights-lookup-user' => 'Atur gorombolan pamaké',
'userrights-user-editname' => 'Asupkeun landihan:',
'editusergroup' => 'Édit Golongan Pamaké',
-'editinguser' => "Ngarobah hak pamaké '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ngarobah hak kontributor '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Édit gorombolan pamaké',
'saveusergroups' => 'Simpen Grup Pamaké',
'userrights-groupsmember' => 'Anggota ti:',
@@ -1355,6 +1359,7 @@ Mun geus anggeus teu bisa dibolaykeun.',
'action-userrights' => 'Édit hak sakabéh pamaké',
'action-userrights-interwiki' => 'ngarobah hak pamaké di wiki lianna',
'action-siteadmin' => 'ngonci atawa muka konci databés',
+'action-sendemail' => 'ngirim surélék',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|parobahan|parobahan}}',
@@ -1386,6 +1391,7 @@ Mun geus anggeus teu bisa dibolaykeun.',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|ngawaskeun|ngawaskeun}}]',
'rc_categories' => 'Watesan nepi ka kategori (dipisah ku "|")',
'rc_categories_any' => 'Naon bae',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bit|bit}} sanggeus robah',
'newsectionsummary' => '/* $1 */ bagean anyar',
'rc-enhanced-expand' => 'Témbongkeun rincian (butuh JavaScript)',
'rc-enhanced-hide' => 'Sumputkeun rincian',
@@ -1441,6 +1447,7 @@ Catet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anje
'ignorewarnings' => 'Tong diwaro panginget naon baé',
'minlength1' => 'Ngaran koropak sahanteuna kudu diwangun ku hiji aksara.',
'illegalfilename' => 'Ngaran koropak "$1" ngandung aksara nu teu diwenangkeun pikeun judul kaca. Mangga gentos ngaranna tur cobi muatkeun deui.',
+'filename-toolong' => 'Ngaran berkas teu meunang leuwih ti 240 bit.',
'badfilename' => 'Ngaran gambar geus dirobah jadi "$1".',
'filetype-mime-mismatch' => 'Éksténsi berkas ".$1" teu luyu jeung tipeu MIME anu kadetéksi ti berkas ($2).',
'filetype-badmime' => 'Koropak tipeu MIME "$1" teu meunang dimuatkeun.',
@@ -1500,6 +1507,31 @@ Pariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.',
'upload-misc-error' => 'Kasalahan muat anu teu kanyahoan',
'upload-unknown-size' => 'Ukuran teu kanyahoan',
+# File backend
+'backend-fail-notexists' => 'Berkas $1 euweuh.',
+'backend-fail-notsame' => 'Berkas anu teu-identik geus aya di $1.',
+'backend-fail-invalidpath' => '$1 perenahna henteu absah.',
+'backend-fail-delete' => 'Teu bisa ngahapus berkas $1.',
+'backend-fail-alreadyexists' => 'Berkas $1 geus aya.',
+'backend-fail-store' => 'Hanteu bisa nyimpen berkas $1 di $2.',
+'backend-fail-copy' => 'Teu bisa nyalin berkas $1 ka $2.',
+'backend-fail-move' => 'Hanteu bisa mindahkeun berkas $1 ka $2.',
+'backend-fail-opentemp' => 'Teu bisa muka berkas sementara.',
+'backend-fail-writetemp' => 'Teu bisa nulis kana berkas sementara.',
+'backend-fail-closetemp' => 'Teu bisa nutup berkas sementara.',
+'backend-fail-read' => 'Teu bisa maca berkas $1.',
+'backend-fail-create' => 'Teu bisa nyieun berkas $1.',
+'backend-fail-contenttype' => 'Teu bisa nangtukeun tipeu eusi berkas anu badé disimpen di "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Teu bisa muka konci "$1" kusabab teu dikonci.',
+'lockmanager-fail-closelock' => 'Teu bisa nutup berkas konci pikeun "$1".',
+'lockmanager-fail-deletelock' => 'Teu bisa ngahapus berkas konci pikeun "$1".',
+'lockmanager-fail-openlock' => 'Teu bisa muka berkas konci pikeun "$1".',
+'lockmanager-fail-releaselock' => 'Teu bisa ngaleupaskeun konci pikeun "$1".',
+'lockmanager-fail-db-release' => 'Teu bisa ngaleupaskeun konci dina databés $1.',
+'lockmanager-fail-svr-release' => 'Teu bisa ngaleupaskeun konci dina server $1.',
+
# ZipDirectoryReader
'zip-wrong-format' => 'Berkas anu dipilih lain berkas ZIP.',
@@ -1703,7 +1735,7 @@ Sahiji kaca dianggap minangka kaca disambiguasi lamun kaca kasebut ngagunakeun c
'listusers-editsonly' => 'Témbongkeun ukur kontributor anu ngédit',
'listusers-creationsort' => 'Éntépkeun dumasar titimangsa dijieun',
'usereditcount' => '$1 {{PLURAL:$1|édit|édit}}',
-'usercreated' => 'Dijieun ping $1 jam $2',
+'usercreated' => '{{GENDER:$3|Dijieun}} ping $1 tabuh $2',
'newpages' => 'Kaca anyar',
'newpages-username' => 'Landihan:',
'ancientpages' => 'Kaca pangheubeulna',
@@ -1794,12 +1826,8 @@ Baca ogé [[Special:WantedCategories|kategori nu dipikabutuh]].',
'activeusers-noresult' => 'Teu kapendak.',
# Special:Log/newusers
-'newuserlogpage' => 'Log akun anyar',
-'newuserlogpagetext' => 'Di handap ieu béréndélan log pamaké anyar.',
-'newuserlog-byemail' => 'Sandi geus dikirim maké surélék.',
-'newuserlog-create-entry' => 'Akun kontributor anyar',
-'newuserlog-create2-entry' => 'rekening anyar pikeun $1 geus dijieun',
-'newuserlog-autocreate-entry' => 'rekening pamaké dijieun sacara otomatis',
+'newuserlogpage' => 'Log akun anyar',
+'newuserlogpagetext' => 'Di handap ieu béréndélan log pamaké anyar.',
# Special:ListGroupRights
'listgrouprights' => 'Hak-hak grup pamaké',
@@ -1928,7 +1956,6 @@ Asupan jeung bantuan salajengna:
'actioncomplete' => 'Tarékah geus hasil',
'actionfailed' => 'Tarékah gagal',
'deletedtext' => '"$1" geus dihapus. Tempo $2 pikeun rékaman hapusan anyaran ieu.',
-'deletedarticle' => 'ngahapus "[[$1]]"',
'dellogpage' => 'Log_hapusan',
'dellogpagetext' => 'Di handap ieu daptar hapusan nu ahir-ahir, sakabéh wanci dumasar wanci server.',
'deletionlog' => 'log hapusan',
@@ -2033,7 +2060,6 @@ Téks aktual révisi nu geus dihapus ieu ngan bisa dibuka ku kuncén.',
'undeletelink' => 'tempo/pulangkeun',
'undeleteviewlink' => 'tempo',
'undeletecomment' => 'Alesan:',
-'undeletedarticle' => 'disimpen "$1"',
'undeletedrevisions' => '$1 {{PLURAL:$1|révisi|révisi}} disimpen deui',
'undeletedrevisions-files' => '{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 koropak|$2 koropak}} geus dipulangkeun',
'undeletedfiles' => '$1 {{PLURAL:$1|koropak}} dibalikeun',
@@ -2253,8 +2279,6 @@ Dina kajadian kitu, mun hayang (jeung perlu) anjeun kudu mindahkeun atawa ngagab
'movepage-page-moved' => 'Kaca $1 geus dipindahkeun ka $2.',
'movepage-page-unmoved' => 'Kaca $1 teu bisa dipindahkeun ka $2.',
'movepage-max-pages' => 'Sajumlah maksimum $1 {{PLURAL:$1|kaca|kaca}} geus dipindahkeun tur moal aya deui nu bakal dipindahkeun sacara otomatis.',
-'1movedto2' => 'mindahkeun [[$1]] ka [[$2]]',
-'1movedto2_redir' => '[[$1]] dipindahkeun ka [[$2]]',
'movelogpage' => 'Log mindahkeun',
'movelogpagetext' => 'Di handap ieu béréndélan kaca nu dipindahkeun.',
'movesubpage' => '{{PLURAL:$1|Subkaca|Subkaca}}',
@@ -2476,9 +2500,6 @@ Sigana mah ieu téh alatan tumbu ka loka luar.',
# Patrol log
'patrol-log-page' => 'Log patroli',
'patrol-log-header' => 'Ieu minangka log pikeun révisi nu geus diroris.',
-'patrol-log-line' => 'nandaan $1 ti $2 geus karoris $3',
-'patrol-log-auto' => '(otomatis)',
-'patrol-log-diff' => 'révisi: $1',
'log-show-hide-patrol' => '$1 log rorisan',
# Image deletion
@@ -2496,15 +2517,17 @@ $1',
'nextdiff' => 'Éditan salajengna →',
# Media information
-'imagemaxsize' => 'Watesan gambar na kaca dadaran gambar nepi ka:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}',
-'file-info' => 'ukuran koropak: $1, tipeu MIME: $2',
-'file-info-size' => '$1 × $2 piksel, ukuran koropak: $3, tipeu MIME: $4',
-'file-info-size-pages' => '$1 × $2 pixel, ukuran berkas: $3, tipeu MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}',
-'file-nohires' => '<small>Euweuh résolusi nu leuwih luhur.</small>',
-'svg-long-desc' => 'Koropak SVG, nominalna $1 × $2 piksel, ukuranana $3',
-'show-big-image' => 'Résolusi pinuh',
-'show-big-image-size' => '$1 × $2 pixel',
+'imagemaxsize' => 'Watesan gambar na kaca dadaran gambar nepi ka:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}',
+'file-info' => 'ukuran koropak: $1, tipeu MIME: $2',
+'file-info-size' => '$1 × $2 piksel, ukuran koropak: $3, tipeu MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixel, ukuran berkas: $3, tipeu MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}',
+'file-nohires' => 'Euweuh résolusi nu leuwih luhur.',
+'svg-long-desc' => 'Koropak SVG, nominalna $1 × $2 piksel, ukuranana $3',
+'show-big-image' => 'Résolusi pinuh',
+'show-big-image-preview' => 'Ukuran ieu pramidang: $1.',
+'show-big-image-other' => 'Résolusi lianna: $1.',
+'show-big-image-size' => '$1 × $2 pixel',
# Special:NewFiles
'newimages' => 'Galeri gambar anyar',
@@ -2819,13 +2842,6 @@ Sandi konfirmasi ieu bakal kadaluwarsa dina $4.',
'scarytranscludefailed' => '[Gagal nyokot citakan $1]',
'scarytranscludetoolong' => '[URLna panjang teuing]',
-# Trackbacks
-'trackbackbox' => 'Lacak balik keur artikel ieu:<br />
-$1',
-'trackbackremove' => '([$1 Hapus])',
-'trackbacklink' => 'Ngalacak balik',
-'trackbackdeleteok' => 'Ngalacak balik, hasil dihapus!.',
-
# Delete conflict
'deletedwhileediting' => "'''Awas''': ieu kaca geus dihapus nalika anjeun mitembeyan ngédit!",
'confirmrecreate' => "Pamaké [[User:$1|$1]] ([[User talk:$1|ngobrol]]) geus ngahapus artikel ieu nalika anjeun ngédit kalawan alesan:
@@ -2990,4 +3006,17 @@ Coba ku sawangan normal.',
'htmlform-reset' => 'Bolaykeun parobahan',
'htmlform-selectorother-other' => 'Lianna',
+# New logging system
+'revdelete-restricted' => 'akses geus dibatesan ukur keur kuncén',
+'revdelete-unrestricted' => 'Watesan akses kuncén dihapuskeun',
+'newuserlog-byemail' => 'Sandi geus dikirim maké surélék.',
+
+# API errors
+'api-error-file-too-large' => 'Berkas nu dikirim gedé teuing.',
+'api-error-filename-tooshort' => 'Ngaran berkas pondok teuing.',
+'api-error-filetype-banned' => 'Jenis berkas ieu dipahing.',
+'api-error-filetype-missing' => 'Ngaran berkas euweuh éxténsian.',
+'api-error-illegal-filename' => 'Ngaran berkas kitu dipahing.',
+'api-error-mustbeloggedin' => 'Anjeun kudu asup log pikeun ngunggahkeun berkas.',
+
);
diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php
index fd23668d..5bf71500 100644
--- a/languages/messages/MessagesSv.php
+++ b/languages/messages/MessagesSv.php
@@ -14,6 +14,7 @@
* @author EPO
* @author Fluff
* @author GameOn
+ * @author Greggegorius
* @author Grillo
* @author Habj
* @author Habjchen
@@ -168,127 +169,127 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
- 'notoc' => array( '0', '__INGENINNEHÅLLSFÖRTECKNING__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__INGETGALLERI__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ALLTIDINNEHÅLLSFÖRTECKNING__', '__FORCETOC__' ),
- 'toc' => array( '0', '__INNEHÅLLSFÖRTECKNING__', '__TOC__' ),
- 'noeditsection' => array( '0', '__INTEREDIGERASEKTION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__INGENRUBRIK__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'NUVARANDEMÃ…NAD', 'NUMÃ…NAD', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'NUVARANDEMÃ…NAD1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'NUVARANDEMÃ…NADSNAMN', 'NUMÃ…NADSNAMN', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'NUVARANDEMÃ…NADKORT', 'NUMÃ…NADKORT', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'NUVARANDEDAG', 'NUDAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'NUVARANDEDAG2', 'NUDAG2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'NUVARANDEDAGSNAMN', 'NUDAGSNAMN', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'NUVARANDEÃ…R', 'NUÃ…R', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'NUVARANDETID', 'NUTID', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'NUVARANDETIMME', 'NUTIMME', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'LOKALMÃ…NAD', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'LOKALMÃ…NAD1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'LOKALMÃ…NADSNAMN', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'LOKALMÃ…NADKORT', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALDAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'LOKALDAGSNAMN', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'LOKALTÃ…R', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'LOKALTID', 'LOCALTIME' ),
- 'localhour' => array( '1', 'LOKALTIMME', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'ANTALSIDOR', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ANTALARTIKLAR', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ANTALFILER', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ANTALANVÄNDARE', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'ANTALAKTIVAANVÄNDARE', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'ANTALREDIGERINGAR', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'ANTALVISNINGAR', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'SIDNAMN', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SIDNAMNE', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'NAMNRYMD', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'NAMNRYMDE', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'DISKUSSIONSRYMD', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'DISKUSSIONSRYMDE', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ARTIKELRYMD', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ARTIKELRYMDE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'HELASIDNAMNET', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'HELASIDNAMNETE', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'UNDERSIDNAMN', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'UNDERSIDNAMNE', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'GRUNDSIDNAMN', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'GRUNDSIDNAMNE', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'DISKUSSIONSSIDNAMN', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'DISKUSSIONSSIDNAMNE', 'TALKPAGENAMEE' ),
- 'msg' => array( '0', 'MED:', 'MSG:' ),
- 'subst' => array( '0', 'BYT:', 'SUBST:' ),
- 'msgnw' => array( '0', 'MEDNW:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'höger', 'right' ),
- 'img_left' => array( '1', 'vänster', 'left' ),
- 'img_none' => array( '1', 'ingen', 'none' ),
- 'img_center' => array( '1', 'centrerad', 'center', 'centre' ),
- 'img_framed' => array( '1', 'inramad', 'ram', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'ramlös', 'frameless' ),
- 'img_page' => array( '1', 'sida=$1', 'sida $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'stående', 'stående=$1', 'stående $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'kantlinje', 'border' ),
- 'img_baseline' => array( '1', 'baslinje', 'baseline' ),
- 'img_sub' => array( '1', 'ned', 'sub' ),
- 'img_super' => array( '1', 'upp', 'super', 'sup' ),
- 'img_top' => array( '1', 'topp', 'top' ),
- 'img_text_top' => array( '1', 'text-topp', 'text-top' ),
- 'img_middle' => array( '1', 'mitten', 'middle' ),
- 'img_bottom' => array( '1', 'botten', 'bottom' ),
- 'img_text_bottom' => array( '1', 'text-botten', 'text-bottom' ),
- 'img_link' => array( '1', 'länk=$1', 'link=$1' ),
- 'sitename' => array( '1', 'SAJTNAMN', 'SITENAMN', 'SITENAME' ),
- 'ns' => array( '0', 'NR:', 'NS:' ),
- 'localurl' => array( '0', 'LOKALURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
- 'servername' => array( '0', 'SERVERNAMN', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'SKRIPTSÖKVÄG', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'KÖN:', 'GENDER:' ),
- 'currentweek' => array( '1', 'NUVARANDEVECKA', 'NUVECKA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'NUVARANDEVECKODAG', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALVECKA', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'LOKALVECKODAG', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'REVISIONSID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'REVISIONSDAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'REVISIONSDAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'REVISIONSMÃ…NAD', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'REVISIONSÃ…R', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'REVISIONSTIDSSTÄMPEL', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'REVISIONSANVÄNDARE', 'REVISIONUSER' ),
- 'fullurl' => array( '0', 'FULLTURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'FULLTURLE:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'LBFÖRST:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'UCFIRST', 'SBFÖRST:', 'UCFIRST:' ),
- 'lc' => array( '0', 'LB:', 'LC:' ),
- 'uc' => array( '0', 'SB:', 'UC:' ),
- 'raw' => array( '0', 'RÃ…:', 'RAW:' ),
- 'displaytitle' => array( '1', 'VISATITEL', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__NYTTAVSNITTLÄNK__', '__NEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'NUVARANDEVERSION', 'NUVERSION', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'NUTIDSTÄMPEL', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'LOKALTIDSTÄMPEL', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#SPRÃ…K:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'INNEHÃ…LLSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'SIDORINAMNRYMD:', 'SIDORINR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'ANTALADMINS', 'ANTALADMINISTRATÖRER', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'FORMATERANUM', 'FORMATERATAL', 'FORMATNUM' ),
- 'defaultsort' => array( '1', 'STANDARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'FILSÖKVÄG:', 'FILEPATH:' ),
- 'tag' => array( '0', 'tagg', 'tag' ),
- 'hiddencat' => array( '1', '__DOLDKAT__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'SIDORIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'SIDSTORLEK', 'PAGESIZE' ),
- 'index' => array( '1', '__INDEXERA__', '__INDEX__' ),
- 'noindex' => array( '1', '__INTEINDEXERA_', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'ANTALIGRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__STATISKOMDIRIGERING__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'SKYDDSNIVÃ…', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formateradatum', 'datumformat', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#OMDIRIGERING', '#REDIRECT' ),
+ 'notoc' => array( '0', '__INGENINNEHÅLLSFÖRTECKNING__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__INGETGALLERI__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ALLTIDINNEHÅLLSFÖRTECKNING__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__INNEHÅLLSFÖRTECKNING__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__INTEREDIGERASEKTION__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__INGENRUBRIK__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'NUVARANDEMÃ…NAD', 'NUMÃ…NAD', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'NUVARANDEMÃ…NAD1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'NUVARANDEMÃ…NADSNAMN', 'NUMÃ…NADSNAMN', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', 'NUVARANDEMÃ…NADKORT', 'NUMÃ…NADKORT', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'NUVARANDEDAG', 'NUDAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NUVARANDEDAG2', 'NUDAG2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'NUVARANDEDAGSNAMN', 'NUDAGSNAMN', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'NUVARANDEÃ…R', 'NUÃ…R', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'NUVARANDETID', 'NUTID', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'NUVARANDETIMME', 'NUTIMME', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'LOKALMÃ…NAD', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'LOKALMÃ…NAD1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'LOKALMÃ…NADSNAMN', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'LOKALMÃ…NADKORT', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'LOKALDAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALDAG2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'LOKALDAGSNAMN', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'LOKALTÃ…R', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'LOKALTID', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'LOKALTIMME', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'ANTALSIDOR', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ANTALARTIKLAR', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ANTALFILER', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ANTALANVÄNDARE', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'ANTALAKTIVAANVÄNDARE', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'ANTALREDIGERINGAR', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'ANTALVISNINGAR', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'SIDNAMN', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SIDNAMNE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'NAMNRYMD', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'NAMNRYMDE', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'DISKUSSIONSRYMD', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'DISKUSSIONSRYMDE', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ARTIKELRYMD', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ARTIKELRYMDE', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'HELASIDNAMNET', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'HELASIDNAMNETE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'UNDERSIDNAMN', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'UNDERSIDNAMNE', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'GRUNDSIDNAMN', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'GRUNDSIDNAMNE', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'DISKUSSIONSSIDNAMN', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'DISKUSSIONSSIDNAMNE', 'TALKPAGENAMEE' ),
+ 'msg' => array( '0', 'MED:', 'MSG:' ),
+ 'subst' => array( '0', 'BYT:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'MEDNW:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'miniatyr', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatyr=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'höger', 'right' ),
+ 'img_left' => array( '1', 'vänster', 'left' ),
+ 'img_none' => array( '1', 'ingen', 'none' ),
+ 'img_center' => array( '1', 'centrerad', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'inramad', 'ram', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'ramlös', 'frameless' ),
+ 'img_page' => array( '1', 'sida=$1', 'sida $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'stående', 'stående=$1', 'stående $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'kantlinje', 'border' ),
+ 'img_baseline' => array( '1', 'baslinje', 'baseline' ),
+ 'img_sub' => array( '1', 'ned', 'sub' ),
+ 'img_super' => array( '1', 'upp', 'super', 'sup' ),
+ 'img_top' => array( '1', 'topp', 'top' ),
+ 'img_text_top' => array( '1', 'text-topp', 'text-top' ),
+ 'img_middle' => array( '1', 'mitten', 'middle' ),
+ 'img_bottom' => array( '1', 'botten', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'text-botten', 'text-bottom' ),
+ 'img_link' => array( '1', 'länk=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'SAJTNAMN', 'SITENAMN', 'SITENAME' ),
+ 'ns' => array( '0', 'NR:', 'NS:' ),
+ 'localurl' => array( '0', 'LOKALURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'LOKALURLE:', 'LOCALURLE:' ),
+ 'servername' => array( '0', 'SERVERNAMN', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'SKRIPTSÖKVÄG', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'KÖN:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'NUVARANDEVECKA', 'NUVECKA', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'NUVARANDEVECKODAG', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'LOKALVECKA', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'LOKALVECKODAG', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'REVISIONSID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'REVISIONSDAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'REVISIONSDAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'REVISIONSMÃ…NAD', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'REVISIONSÃ…R', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'REVISIONSTIDSSTÄMPEL', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'REVISIONSANVÄNDARE', 'REVISIONUSER' ),
+ 'fullurl' => array( '0', 'FULLTURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'FULLTURLE:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'LBFÖRST:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'UCFIRST', 'SBFÖRST:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'LB:', 'LC:' ),
+ 'uc' => array( '0', 'SB:', 'UC:' ),
+ 'raw' => array( '0', 'RÃ…:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'VISATITEL', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__NYTTAVSNITTLÄNK__', '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'NUVARANDEVERSION', 'NUVERSION', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'NUTIDSTÄMPEL', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'LOKALTIDSTÄMPEL', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#SPRÃ…K:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'INNEHÃ…LLSSPRÃ…K', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'SIDORINAMNRYMD:', 'SIDORINR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'ANTALADMINS', 'ANTALADMINISTRATÖRER', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'FORMATERANUM', 'FORMATERATAL', 'FORMATNUM' ),
+ 'defaultsort' => array( '1', 'STANDARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'FILSÖKVÄG:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'tagg', 'tag' ),
+ 'hiddencat' => array( '1', '__DOLDKAT__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'SIDORIKATEGORI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'SIDSTORLEK', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEXERA__', '__INDEX__' ),
+ 'noindex' => array( '1', '__INTEINDEXERA_', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'ANTALIGRUPP', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STATISKOMDIRIGERING__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'SKYDDSNIVÃ…', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formateradatum', 'datumformat', 'formatdate', 'dateformat' ),
);
$linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
@@ -671,19 +672,21 @@ Rapportera gärna problemet till någon [[Special:ListUsers/sysop|administratör
'badarticleerror' => 'Den åtgärden kan inte utföras på den här sidan.',
'cannotdelete' => 'Sidan eller filen "$1" kunde inte raderas.
Den kanske redan har raderats av någon annan.',
+'cannotdelete-title' => 'Sidan "$1" kan inte raderas',
'badtitle' => 'Felaktig titel',
'badtitletext' => 'Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.
Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
-'perfcached' => 'Följande data är cachad och är möjligtvis inte helt uppdaterad.',
-'perfcachedts' => 'Sidan är hämtad ur ett cacheminne och uppdaterades senast $1.',
+'perfcached' => 'Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} restultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.',
+'perfcachedts' => 'Sidan är hämtad ur ett cacheminne och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} restultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.',
'querypage-no-updates' => 'Uppdatering av den här sidan är inte aktiverad. Datan kommer i nuläget inte att uppdateras.',
'wrong_wfQuery_params' => 'Felaktiga parametrar för wfQuery()<br /> Funktion: $1<br /> Förfrågan: $2',
'viewsource' => 'Visa wikitext',
-'viewsourcefor' => 'för $1',
+'viewsource-title' => 'Visa källkod för $1',
'actionthrottled' => 'Åtgärden stoppades',
'actionthrottledtext' => 'Som skydd mot spam, finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.',
'protectedpagetext' => 'Den här sidan har skrivskyddats för att förhindra redigering.',
'viewsourcetext' => 'Du kan se och kopiera denna sidas källtext:',
+'viewyourtext' => "Du kan se och kopiera källan för '''dina redigeringar''' på denna sida:",
'protectedinterface' => 'Denna sida innehåller text för mjukvarans gränssnitt, och är skrivskyddad för att förebygga missbruk.',
'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.
För översättningar, använd gärna [//translatewiki.net/wiki/Main_Page?setlang=sv translatewiki.net], översättningsprojektet för MediaWiki.",
@@ -783,6 +786,7 @@ Som ett resultat kan besökare som använder den här IP-adressen inte skapa nå
'emailconfirmlink' => 'Bekräfta din e-postadress',
'invalidemailaddress' => 'E-postadressen kan inte godtas då formatet verkar vara felaktigt.
Skriv in en adress med korrekt format eller töm fältet.',
+'cannotchangeemail' => 'E-post-adresser som är bundna till användarkonton kan inte ändras på denna wiki.',
'accountcreated' => 'Användarkontot har skapats',
'accountcreatedtext' => 'Användarkontot $1 har skapats.',
'createaccount-title' => 'Konto skapat på {{SITENAME}}',
@@ -798,6 +802,7 @@ Vänta innan du försöker igen.',
# E-mail sending
'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
+'user-mail-no-addy' => 'Försökte skicka e-post utan en e-postadress',
# Change password dialog
'resetpass' => 'Ändra lösenord',
@@ -818,30 +823,45 @@ Du kanske redan har lyckats ändra ditt lösenord eller begärt ett nytt tillfä
'resetpass-temp-password' => 'Tillfälligt lösenord:',
# Special:PasswordReset
-'passwordreset' => 'Lösenordsåterställning',
-'passwordreset-text' => 'Fyll i detta formulär för att få en påminnelse om dina kontouppgifter via e-post.',
-'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-username' => 'Användarnamn:',
-'passwordreset-domain' => 'Domän:',
-'passwordreset-email' => 'E-postadress:',
-'passwordreset-emailtitle' => 'Kontouppgifter på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Någon (förmodligen du, från IP-adressen $1) begärde en påminnelse av dina kontodetaljer för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:
+'passwordreset' => 'Lösenordsåterställning',
+'passwordreset-text' => 'Fyll i detta formulär för att få en påminnelse om dina kontouppgifter via e-post.',
+'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-username' => 'Användarnamn:',
+'passwordreset-domain' => 'Domän:',
+'passwordreset-capture' => 'Visa resulterande e-post?',
+'passwordreset-capture-help' => 'Om du markerar den här rutan kommer e-postmeddelandet (med det tillfälliga lösenordet) visas för dig och skickas till användaren.',
+'passwordreset-email' => 'E-postadress:',
+'passwordreset-emailtitle' => 'Kontouppgifter på {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Någon (förmodligen du, från IP-adressen $1) begärde en påminnelse av dina kontodetaljer för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:
$2
{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.
Du bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och du önskar inte att ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.',
-'passwordreset-emailtext-user' => 'Användaren $1 på {{SITENAME}} begärde en påminnelse om dina kontodetaljer för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:
+'passwordreset-emailtext-user' => 'Användaren $1 på {{SITENAME}} begärde en påminnelse om dina kontodetaljer för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:
$2
{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.
Du bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och du önskar inte att ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.',
-'passwordreset-emailelement' => 'Användarnamn: $1
+'passwordreset-emailelement' => 'Användarnamn: $1
Tillfälligt lösenord: $2',
-'passwordreset-emailsent' => 'En påminnelse via e-post har skickats.',
+'passwordreset-emailsent' => 'En påminnelse via e-post har skickats.',
+'passwordreset-emailsent-capture' => 'En påminnelse via e-post har skickats, som visas nedan.',
+'passwordreset-emailerror-capture' => 'En påminnelse via e-post har skapats, som visas nedan, men det gick inte att skicka den till användaren: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ändra e-postadress',
+'changeemail-header' => 'Ändra kontots e-postadress',
+'changeemail-text' => 'Fyll i detta formulär för att ändra din e-postadress. Du måste ange ditt lösenord för att bekräfta ändringen.',
+'changeemail-no-info' => 'Du måste vara inloggad för att komma åt den här sidan direkt.',
+'changeemail-oldemail' => 'Nuvarande e-postadress:',
+'changeemail-newemail' => 'Ny e-postadress:',
+'changeemail-none' => '(ingen)',
+'changeemail-submit' => 'Ändra e-post',
+'changeemail-cancel' => 'Avbryt',
# Edit page toolbar
'bold_sample' => 'Fet text',
@@ -913,9 +933,6 @@ Observera att du inte kan använda dig av funktionen "skicka e-post till använd
Din nuvarande IP-adress är $3, och blockerings-ID är #$5.
Vänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.',
'blockednoreason' => 'ingen motivering angavs',
-'blockedoriginalsource' => "Källkoden för '''$1''' visas nedan:",
-'blockededitsource' => "Texten för '''dina ändringar''' av '''$1''' visas nedanför:",
-'whitelistedittitle' => 'Du måste logga in för att redigera',
'whitelistedittext' => 'Du måste $1 för att kunna redigera sidor.',
'confirmedittext' => 'Du måste bekräfta din e-postadress innan du kan redigera sidor. Var vänlig ställ in och validera din e-postadress genom dina [[Special:Preferences|användarinställningar]].',
'nosuchsectiontitle' => 'Kan inte hitta avsnitt',
@@ -998,7 +1015,8 @@ Du lovar oss också att du skrev texten själv, eller kopierade från kulturellt
'copyrightwarning2' => "Observera att alla bidrag till {{SITENAME}} kan komma att redigeras, ändras, eller tas bort av andra deltagare. Om du inte vill se din text förändrad efter andras gottfinnade skall du inte skriva in någon text här.<br />
Du lovar oss också att du skrev texten själv, eller kopierade från kulturellt allmängods som inte skyddas av upphovsrätt, eller liknande källor - se $1 för detaljer.
'''LÄGG INTE UT UPPHOVSRÄTTSSKYDDAT MATERIAL HÄR UTAN TILLÅTELSE!'''",
-'longpageerror' => "'''FEL: Texten som du försöker spara är $1 kilobyte, vilket är mer än det maximalt tillåtna $2 kilobyte. Den kan inte sparas.'''",
+'longpageerror' => "'''FEL: Texten som du försöker spara är {{PLURAL:$1|en kilobyte|$1 kilobyte}}, vilket är mer än det maximalt tillåtna {{PLURAL:$2|en kilobyte|$2 kilobyte}}.'''
+Den kan inte sparas.",
'readonlywarning' => "'''VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.
Det kan vara klokt att kopiera över texten till din egen dator, tills databasen är upplåst igen.'''
@@ -1168,8 +1186,6 @@ Andra administratörer på {{SITENAME}} kommer fortfarande att kunna läsa det d
'revdelete-unsuppress' => 'Ta bort begränsningar på återställda versioner',
'revdelete-log' => 'Anledning:',
'revdelete-submit' => 'Tillämpa på {{PLURAL:$1|vald version|valda versioner}}',
-'revdelete-logentry' => 'ändrade synlighet för versioner av [[$1]]',
-'logdelete-logentry' => 'ändrade synlighet för åtgärder i [[$1]]',
'revdelete-success' => "'''Sidversionssynlighet har uppdaterats.'''",
'revdelete-failure' => "'''Sidversionssynlighet kunde inte uppdateras:'''
$1",
@@ -1181,15 +1197,6 @@ $1",
'revdel-restore-visible' => 'synliga versioner',
'pagehist' => 'Sidhistorik',
'deletedhist' => 'Raderad historik',
-'revdelete-content' => 'innehåll',
-'revdelete-summary' => 'sammanfattning',
-'revdelete-uname' => 'användarnamn',
-'revdelete-restricted' => 'satte begränsningar för administratörer',
-'revdelete-unrestricted' => 'tog bort begränsningar för administratörer',
-'revdelete-hid' => 'dolde $1',
-'revdelete-unhid' => 'synliggjorde $1',
-'revdelete-log-message' => '$1 för $2 {{PLURAL:$2|sidversion|sidversioner}}',
-'logdelete-log-message' => '$1 för $2 {{PLURAL:$2|åtgärd|åtgärder}}',
'revdelete-hide-current' => 'Fel vid döljande av objektet daterat $2, $1: detta är nuvarande version.
Den kan inte döljas.',
'revdelete-show-no-access' => 'Fel vid visning av objektet daterat $2, $1: detta objekt har markerats "begränsat".
@@ -1347,12 +1354,14 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
'prefs-rc' => 'Senaste ändringar',
'prefs-watchlist' => 'Bevakningslista',
'prefs-watchlist-days' => 'Antal dygn som skall visas i bevakningslistan:',
-'prefs-watchlist-days-max' => 'Maximalt 7 dygn',
+'prefs-watchlist-days-max' => 'Maximalt $1 {{PLURAL:$1|dag|dygn}}',
'prefs-watchlist-edits' => 'Maximalt antal redigeringar som visas i utökad bevakningslista:',
'prefs-watchlist-edits-max' => 'Maximalt antal: 1 000',
'prefs-watchlist-token' => 'Bevakningslistsnyckel:',
'prefs-misc' => 'Diverse',
'prefs-resetpass' => 'Ändra lösenord',
+'prefs-changeemail' => 'Ändra e-post',
+'prefs-setemail' => 'Ange en e-postadress',
'prefs-email' => 'Alternativ för e-post',
'prefs-rendering' => 'Utseende',
'saveprefs' => 'Spara',
@@ -1412,6 +1421,7 @@ Detta kan inte återställas.',
'yourrealname' => 'Riktigt namn:',
'yourlanguage' => 'Språk:',
'yourvariant' => 'Språkval för innehåll:',
+'prefs-help-variant' => 'Ditt önskade variant eller ortografi för att visa innehållssidor på denna wiki i.',
'yournick' => 'Signatur:',
'prefs-help-signature' => 'Kommentarer på diskussionssidor ska signeras med "<nowiki>~~~~</nowiki>", vilket konverteras till din signatur och tidpunkt.',
'badsig' => 'Det är något fel med råsignaturen, kontrollera HTML-koden.',
@@ -1452,7 +1462,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'userrights-lookup-user' => 'Hantera användargrupper',
'userrights-user-editname' => 'Skriv in ett användarnamn:',
'editusergroup' => 'Ändra användargrupper',
-'editinguser' => "Ändrar rättigheter för användaren '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ändrar rättigheter för användaren '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Ändra användargrupper',
'saveusergroups' => 'Spara användargrupper',
'userrights-groupsmember' => 'Medlem i:',
@@ -1546,13 +1556,13 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'right-autopatrol' => 'Får automatiskt sina ändringar markerade som patrullerade',
'right-patrolmarks' => 'Se markeringar av opatrullerade ändringar i senaste ändringarna',
'right-unwatchedpages' => 'Se listan över obevakade sidor',
-'right-trackback' => 'Lägga till trackback',
'right-mergehistory' => 'Sammanfoga sidhistoriker',
'right-userrights' => 'Ändra alla användarrättigheter',
'right-userrights-interwiki' => 'Ändra rättigheter för användare på andra wikier',
'right-siteadmin' => 'Låsa och låsa upp databasen',
'right-override-export-depth' => 'Exportera sidor inklusive länkade sidor till ett djup på 5',
'right-sendemail' => 'Skicka e-post till andra användare',
+'right-passwordreset' => 'Visa e-postmeddelanden med lösenordsåterställning',
# User rights log
'rightslog' => 'Användarrättighetslogg',
@@ -1586,16 +1596,17 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'action-suppressionlog' => 'se denna privata logg',
'action-block' => 'blockera denna användare från redigering',
'action-protect' => 'ändra skyddsnivå för denna sida',
+'action-rollback' => 'snabbt rulla tillbaka ändringarna gjorda av den användare som senast redigerade en viss sida',
'action-import' => 'importera denna sida från en annan wiki',
'action-importupload' => 'importera denna sida från en uppladdad fil',
'action-patrol' => 'märka annans redigering som patrullerad',
'action-autopatrol' => 'få din redigering märkt som patrullerad',
'action-unwatchedpages' => 'se listan över obevakade sidor',
-'action-trackback' => 'lägga in en trackback',
'action-mergehistory' => 'slå ihop historiken för denna sida',
'action-userrights' => 'ändra alla användarrättigheter',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ändring|ändringar}}',
@@ -1627,6 +1638,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'number_of_watching_users_pageview' => '[$1 bevakande {{PLURAL:$1|användare|användare}}]',
'rc_categories' => 'Begränsa till följande kategorier (separera med "|")',
'rc_categories_any' => 'Vilken som helst',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter ändring',
'newsectionsummary' => '/* $1 */ nytt avsnitt',
'rc-enhanced-expand' => 'Visa detaljer (kräver JavaScript)',
'rc-enhanced-hide' => 'Göm detaljer',
@@ -1680,6 +1692,7 @@ Se [[Special:NewFiles|galleriet över nya filer]] för en mer visuell översikt.
'ignorewarnings' => 'Ignorera eventuella varningar',
'minlength1' => 'Filens namn måste innehålla minst ett tecken.',
'illegalfilename' => 'Filnamnet "$1" innehåller tecken som inte är tillåtna i sidtitlar. Byt namn på filen och försök ladda upp igen.',
+'filename-toolong' => 'Filnamn får inte vara längre än 240 bytes.',
'badfilename' => 'Filens namn har blivit ändrat till "$1".',
'filetype-mime-mismatch' => 'Filtillägget ".$1" matchar inte med den identifierade MIME-typen för filen ($2).',
'filetype-badmime' => 'Uppladdning av filer med MIME-typen "$1" är inte tillåten.',
@@ -1787,6 +1800,41 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
'upload-unknown-size' => 'Okänd storlek',
'upload-http-error' => 'Ett HTTP-fel uppstod: $1',
+# File backend
+'backend-fail-stream' => 'Kunde inte strömma filen $1.',
+'backend-fail-backup' => 'Kunde inte säkerhetskopiera filen $1.',
+'backend-fail-notexists' => 'Filen $1 finns inte.',
+'backend-fail-hashes' => 'Kunde inte att hämta filhash för jämförelse.',
+'backend-fail-notsame' => 'En icke-identisk fil redan finns på $1.',
+'backend-fail-invalidpath' => '$1 är inte en giltig sökväg för att spara.',
+'backend-fail-delete' => 'Kunde inte radera filen $1.',
+'backend-fail-alreadyexists' => 'Filen $1 finns redan.',
+'backend-fail-store' => 'Kunde inte spara filen $1 vid $2.',
+'backend-fail-copy' => 'Det gick inte att kopiera filen $1 till $2.',
+'backend-fail-move' => 'Kunde inte flytta filen $1 till $2.',
+'backend-fail-opentemp' => 'Kunde inte öppna temporär fil.',
+'backend-fail-writetemp' => 'Kunde inte skriva till temporär fil.',
+'backend-fail-closetemp' => 'Kunde inte stänga temporär fil.',
+'backend-fail-read' => 'Kunde inte läsa filen $1.',
+'backend-fail-create' => 'Kunde inte skapa filen $1.',
+'backend-fail-readonly' => 'Lagrings-backend "$1" är för närvarande skrivskyddad. Den angivna anledningen är: "$2"',
+'backend-fail-synced' => 'Filen "$1" är i ett inkonsekvent tillstånd inom de interna lagrings-backends',
+'backend-fail-connect' => 'Kunde inte ansluta till lagrings-backend "$1".',
+'backend-fail-internal' => 'Ett okänt fel uppstod i lagrings-backend "$1".',
+'backend-fail-contenttype' => 'Kunde inte bestämma innehållstypen för filen att spara på "$1".',
+'backend-fail-batchsize' => 'Lagrings-backend gavs en batch på $1 fil{{PLURAL:$1|operation|operationer}}; gränsen är $2 {{PLURAL:$2|operation|operationer}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kunde inte låsa upp "$1"; den är inte låst.',
+'lockmanager-fail-closelock' => 'Kunde inte att stänga låsfilen för "$1".',
+'lockmanager-fail-deletelock' => 'Kunde inte att radera låsfilen för "$1".',
+'lockmanager-fail-acquirelock' => 'Kunde inte skaffa låset för "$1".',
+'lockmanager-fail-openlock' => 'Kunde inte att öppna låsfilen för "$1".',
+'lockmanager-fail-releaselock' => 'Kunde inte att frigöra låset för "$1".',
+'lockmanager-fail-db-bucket' => 'Kunde inte kontakta tillräckligt många låsdatabaser i hinken $1.',
+'lockmanager-fail-db-release' => 'Kunde inte frigöra låsen på databasen $1 .',
+'lockmanager-fail-svr-release' => 'Kunde inte frigöra låsen på servern $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Ett fel inträffade när filen öppnades för en ZIP-kontroll.',
'zip-wrong-format' => 'Den angivna filen var inte en ZIP-fil.',
@@ -1803,6 +1851,7 @@ Den kan inte säkerhetskontrolleras ordentligt.',
'uploadstash-badtoken' => 'Utförandet av den åtgärden misslyckades, kanske för att din redigeringsrättigheter löpt ut. Försök igen.',
'uploadstash-errclear' => 'Rensning av filerna misslyckades.',
'uploadstash-refresh' => 'Uppdatera listan över filer',
+'invalid-chunk-offset' => 'Ogiltig segmentsförskjutning',
# img_auth script messages
'img-auth-accessdenied' => 'Ã…tkomst nekad',
@@ -1908,23 +1957,24 @@ Beskrivningen på dess [$2 filbeskrivningssida] visas nedan.',
'filerevert-badversion' => 'Det finns ingen tidigare version av filen från den angivna tidpunkten.',
# File deletion
-'filedelete' => 'Radera $1',
-'filedelete-legend' => 'Radera fil',
-'filedelete-intro' => "Du håller på att radera filen '''[[Media:$1|$1]]''' tillsammans med hela dess historik.",
-'filedelete-intro-old' => "Du håller på att radera versionen av '''[[Media:$1|$1]]''' från [$4 $2 kl. $3].",
-'filedelete-comment' => 'Anledning:',
-'filedelete-submit' => 'Radera',
-'filedelete-success' => "'''$1''' har raderats.",
-'filedelete-success-old' => "Versionen av '''[[Media:$1|$1]]''' från $2 kl. $3 har raderats.",
-'filedelete-nofile' => "Filen '''$1''' finns inte.",
-'filedelete-nofile-old' => "Den versionen av '''$1''' kan inte raderas eftersom den inte finns.",
-'filedelete-otherreason' => 'Annan/ytterligare anledning:',
-'filedelete-reason-otherlist' => 'Annan anledning',
-'filedelete-reason-dropdown' => '*Vanliga anledningar till radering
+'filedelete' => 'Radera $1',
+'filedelete-legend' => 'Radera fil',
+'filedelete-intro' => "Du håller på att radera filen '''[[Media:$1|$1]]''' tillsammans med hela dess historik.",
+'filedelete-intro-old' => "Du håller på att radera versionen av '''[[Media:$1|$1]]''' från [$4 $2 kl. $3].",
+'filedelete-comment' => 'Anledning:',
+'filedelete-submit' => 'Radera',
+'filedelete-success' => "'''$1''' har raderats.",
+'filedelete-success-old' => "Versionen av '''[[Media:$1|$1]]''' från $2 kl. $3 har raderats.",
+'filedelete-nofile' => "Filen '''$1''' finns inte.",
+'filedelete-nofile-old' => "Den versionen av '''$1''' kan inte raderas eftersom den inte finns.",
+'filedelete-otherreason' => 'Annan/ytterligare anledning:',
+'filedelete-reason-otherlist' => 'Annan anledning',
+'filedelete-reason-dropdown' => '*Vanliga anledningar till radering
** Upphovsrättsbrott
** Dubblettfil',
-'filedelete-edit-reasonlist' => 'Redigera anledningar för radering',
-'filedelete-maintenance' => 'Radering och återställning av filer tillfälligt avaktiverat under underhåll.',
+'filedelete-edit-reasonlist' => 'Redigera anledningar för radering',
+'filedelete-maintenance' => 'Radering och återställning av filer tillfälligt avaktiverat under underhåll.',
+'filedelete-maintenance-title' => 'Kan inte radera filen',
# MIME search
'mimesearch' => 'MIME-sökning',
@@ -2021,6 +2071,8 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
'wantedpages' => 'Önskade sidor',
'wantedpages-badtitle' => 'Ogiltig titel bland resultaten: $1',
'wantedfiles' => 'Önskade filer',
+'wantedfiletext-cat' => 'Följande filer används men finns inte. Filer från utländska databaser kan vara listade trots att de inte finns. Sådana falska realiteter kommer att <del>tas bort</del>. Sidor som bäddar in filer som inte finns listas upp på [[:$1]].',
+'wantedfiletext-nocat' => 'Följande filer används men finns inte. Filer från utländska databaser kan vara listade trots att de inte finns. Sådana falska realiteter kommer att <del>tas bort</del>.',
'wantedtemplates' => 'Önskade mallar',
'mostlinked' => 'Sidor med flest länkar till sig',
'mostlinkedcategories' => 'Kategorier med flest länkar till sig',
@@ -2029,6 +2081,7 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
'mostimages' => 'Filer med flest länkar till sig',
'mostrevisions' => 'Sidor med flest ändringar',
'prefixindex' => 'Alla sidor med prefix',
+'prefixindex-namespace' => 'Alla sidor med prefix ($1 namnrymder)',
'shortpages' => 'Korta sidor',
'longpages' => 'LÃ¥nga sidor',
'deadendpages' => 'Sidor utan länkar',
@@ -2045,7 +2098,7 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
'listusers-editsonly' => 'Visa endast användare som redigerat',
'listusers-creationsort' => 'Sortera efter datum skapat',
'usereditcount' => '$1 {{PLURAL:$1|redigering|redigeringar}}',
-'usercreated' => 'Skapat $1 $2',
+'usercreated' => '{{GENDER:$3|Skapat}} $1 $2',
'newpages' => 'Nya sidor',
'newpages-username' => 'Användare:',
'ancientpages' => 'Äldsta sidorna',
@@ -2138,12 +2191,8 @@ Protokoll som stöds: <tt>$1</tt> (lägg inte till något av dessa i din söknin
'activeusers-noresult' => 'Inga användare funna.',
# Special:Log/newusers
-'newuserlogpage' => 'Logg över nya användare',
-'newuserlogpagetext' => 'Detta är en logg över skapade användarkonton.',
-'newuserlog-byemail' => 'lösenord skickat med e-post',
-'newuserlog-create-entry' => 'Ny användare',
-'newuserlog-create2-entry' => 'skapade nytt användarkonto $1',
-'newuserlog-autocreate-entry' => 'Konto skapades automatiskt',
+'newuserlogpage' => 'Logg över nya användare',
+'newuserlogpagetext' => 'Detta är en logg över skapade användarkonton.',
# Special:ListGroupRights
'listgrouprights' => 'Behörigheter för användargrupper',
@@ -2172,7 +2221,7 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
'emailpagetext' => 'Du kan använda det här formuläret för att skicka e-post till den här användaren.
Den e-postadress du har angivit i [[Special:Preferences|dina användarinställningar]] kommer att visas som "Från"-adress i meddelandet, så att mottagaren har möjlighet att svara direkt till dig.',
'usermailererror' => 'Fel i hanteringen av mail:',
-'defemailsubject' => '{{SITENAME}} e-post',
+'defemailsubject' => '{{SITENAME}} e-post från användare "$1"',
'usermaildisabled' => 'Användar-epost avaktiverat',
'usermaildisabledtext' => 'Du kan inte skicka e-post till andra användare på den här wikin',
'noemailtitle' => 'Ingen e-postadress',
@@ -2226,7 +2275,7 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
'watchmethod-list' => 'letar efter nyligen gjorda ändringar bland bevakade sidor',
'watchlistcontains' => 'Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.',
'iteminvalidname' => "Problem med sidan '$1', ogiltigt namn...",
-'wlnote' => "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste '''$1''' ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste '''$2''' timmarna}}.",
+'wlnote' => "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste '''$1''' ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste '''$2''' timmarna}} från den $3, kl. $4.",
'wlshowlast' => 'Visa senaste $1 timmarna $2 dygnen $3',
'watchlist-options' => 'Alternativ för bevakningslistan',
@@ -2291,8 +2340,6 @@ Bekräfta att du förstår vad du håller på med och vilka konsekvenser detta l
'actionfailed' => 'Handlingen misslyckades',
'deletedtext' => '"$1" har tagits bort.
Se $2 för noteringar om de senaste raderingarna.',
-'deletedarticle' => 'raderade "[[$1]]"',
-'suppressedarticle' => 'undanhöll "[[$1]]"',
'dellogpage' => 'Raderingslogg',
'dellogpagetext' => 'Nedan listas de senaste raderingarna.',
'deletionlog' => 'raderingsloggen',
@@ -2336,7 +2383,10 @@ Se [[Special:ProtectedPages|listan över skyddade sidor]] för listan över akti
'unprotectedarticle' => 'tog bort skydd från "[[$1]]"',
'movedarticleprotection' => 'flyttade skyddsinställningar från "[[$2]]" till "[[$1]]"',
'protect-title' => 'Skyddsinställningar för "$1"',
+'protect-title-notallowed' => 'Visa skyddsnivån för "$1"',
'prot_1movedto2' => 'flyttade [[$1]] till [[$2]]',
+'protect-badnamespace-title' => 'Namnrymd som inte kan skrivskyddas',
+'protect-badnamespace-text' => 'Sidor i den här namnrymden kan inte skrivskyddas.',
'protect-legend' => 'Bekräfta skrivskydd av sida',
'protectcomment' => 'Anledning:',
'protectexpiry' => 'Varaktighet:',
@@ -2358,6 +2408,7 @@ Du kan ändra skyddet av den här sidan, men det påverkar inte det kaskaderande
'protect-level-sysop' => 'Enbart administratörer',
'protect-summary-cascade' => 'kaskaderande',
'protect-expiring' => 'upphör den $1 (UTC)',
+'protect-expiring-local' => 'löper ut $1',
'protect-expiry-indefinite' => 'på obestämd tid',
'protect-cascade' => 'Skydda sidor som är inkluderade i den här sidan (kaskaderande skydd)',
'protect-cantedit' => 'Du kan inte ändra skyddsnivån för den här sidan, eftersom du inte har behörighet att redigera den.',
@@ -2415,7 +2466,6 @@ I sådana fall måste du se till att den senaste raderade versionen inte är ikr
'undeletereset' => 'Rensa',
'undeleteinvert' => 'Invertera urval',
'undeletecomment' => 'Anledning:',
-'undeletedarticle' => 'återställde "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|en version återställd|$1 versioner återställda}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda',
'undeletedfiles' => '{{PLURAL:$1|en fil återställd|$1 filer återställda}}',
@@ -2424,6 +2474,7 @@ I sådana fall måste du se till att den senaste raderade versionen inte är ikr
Se [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.",
'undelete-header' => 'Se [[Special:Log/delete|raderingsloggen]] för nyligen raderade sidor.',
+'undelete-search-title' => 'Sök efter raderade sidor',
'undelete-search-box' => 'Sök efter raderade sidor',
'undelete-search-prefix' => 'Sidor som börjar med:',
'undelete-search-submit' => 'Sök',
@@ -2432,6 +2483,7 @@ Se [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste
'undelete-bad-store-key' => 'Filversionen med tidsstämpeln $1 kan inte återställas: filen saknades före radering.',
'undelete-cleanup-error' => 'Fel vid radering av den oanvända arkivfilen "$1".',
'undelete-missing-filearchive' => 'Filen med arkiv-ID $1 kunde inte återställas eftersom den inte finns i databasen. Filen kanske redan har återställts.',
+'undelete-error' => 'Kunde inte återställa sidan',
'undelete-error-short' => 'Fel vid filåterställning: $1',
'undelete-error-long' => 'Fel inträffade när vid återställning av filen:
@@ -2553,6 +2605,7 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
'blocklist-userblocks' => 'Göm kontoblockeringar',
'blocklist-tempblocks' => 'Dölj tillfälliga blockeringar',
'blocklist-addressblocks' => 'Göm enskilda IP-blockeringar',
+'blocklist-rangeblocks' => 'Göm intervallblokeringar',
'blocklist-timestamp' => 'Tidsstämpel',
'blocklist-target' => 'MÃ¥l',
'blocklist-expiry' => 'Upphör',
@@ -2575,6 +2628,7 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
'unblocklink' => 'ta bort blockering',
'change-blocklink' => 'ändra blockering',
'contribslink' => 'bidrag',
+'emaillink' => 'skicka e-post',
'autoblocker' => 'Automatisk blockerad eftersom din IP-adress nyligen använts av "[[User:$1|$1]]".
Motiveringen som angavs för blockeringen av $1 var: "$2".',
'blocklogpage' => 'Blockeringslogg',
@@ -2699,9 +2753,6 @@ Försök att sammanfoga dem manuellt.'''",
'movepage-page-moved' => 'Sidan $1 har flyttats till $2.',
'movepage-page-unmoved' => 'Sidan $1 kunde inte flyttas till $2.',
'movepage-max-pages' => 'Gränsen på $1 {{PLURAL:$1|flyttad sida|flyttade sidor}} har uppnåtts och inga fler sidor kommer att flyttas automatiskt.',
-'1movedto2' => 'flyttade [[$1]] till [[$2]]',
-'1movedto2_redir' => 'flyttade [[$1]] till [[$2]], som var en omdirigeringssida',
-'move-redirect-suppressed' => 'utan omdirigering',
'movelogpage' => 'Flyttlogg',
'movelogpagetext' => 'Listan nedan visar sidor som flyttats.',
'movesubpage' => '{{PLURAL:$1|Undersida|Undersidor}}',
@@ -2713,7 +2764,7 @@ Försök att sammanfoga dem manuellt.'''",
'delete_and_move_text' => '==Radering krävs==
Den titel du vill flytta sidan till, "[[:$1]]", finns redan. Vill du radera den för att möjliggöra flytt av denna sida dit?',
'delete_and_move_confirm' => 'Ja, radera sidan',
-'delete_and_move_reason' => 'Raderad för att flytta hit en annan sida.',
+'delete_and_move_reason' => 'Raderad för att göra plats till flyttning av "[[$1]]"',
'selfmove' => 'Ursprungstitel och destinationstitel är identiska. Sidan kan inte flyttas till sig själv.',
'immobile-source-namespace' => 'Kan inte flytta sidor i namnrymden "$1"',
'immobile-target-namespace' => 'Kan inte flytta sidor till namnrymden "$1"',
@@ -2744,9 +2795,11 @@ Exportera sidor genom att skriva in sidtitlarna i rutan här nedan.
Skriv en titel per rad och välj om du du vill exportera alla versioner av texten med sidhistorik, eller om du enbart vill exportera den nuvarande versionen med information om den senaste redigeringen.
I det senare fallet kan du även använda en länk, exempel [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] för sidan "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Exportera alla sidor',
'exportcuronly' => 'Inkludera endast den nuvarande versionen, inte hela historiken',
'exportnohistory' => "----
'''OBS:''' export av fullständig sidhistorik med hjälp av detta formulär har stängts av på grund av prestandaskäl.",
+'exportlistauthors' => 'Innehålla en fullständig lista över bidragsgivare för varje sida',
'export-submit' => 'Exportera',
'export-addcattext' => 'Lägg till sidor från kategori:',
'export-addcat' => 'Lägg till',
@@ -2779,6 +2832,8 @@ Besök [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] eller [//t
'thumbnail_error' => 'Fel vid skapande av miniatyrbild: $1',
'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',
+'thumbnail-dest-create' => 'Kunde inte spara miniatyr till destinationen',
'thumbnail_invalid_params' => 'Ogiltiga parametrar för miniatyrbilden',
'thumbnail_dest_directory' => 'Kan inte skapa målkatalogen',
'thumbnail_image-type' => 'Bildtypen stöds inte',
@@ -2823,6 +2878,11 @@ Spara den på din dator och ladda upp den här.',
'import-upload' => 'Ladda upp XML-data',
'import-token-mismatch' => 'Sessionsdata har förlorats. Var god pröva igen.',
'import-invalid-interwiki' => 'Kan inte importera från den angivna wikin.',
+'import-error-edit' => 'Sidan "$1" importeras inte eftersom du inte har tillåtelse att redigera den.',
+'import-error-create' => 'Sidan "$1" importerades inte eftersom du inte har tillåtelse att skapa den.',
+'import-error-interwiki' => 'Sidan "$1" är inte importerad eftersom dess namn är reserverat för externa länkar (interwiki).',
+'import-error-special' => 'Sidan "$1" är inte importerad eftersom den tillhör en särskild namnrymd som inte tillåter sidor.',
+'import-error-invalid' => 'Sidan "$1" är inte importerad eftersom dess namn är ogiltigt.',
# Import log
'importlogpage' => 'Importlogg',
@@ -2832,74 +2892,87 @@ Spara den på din dator och ladda upp den här.',
'import-logentry-interwiki' => 'överförde $1 mellan wikier',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|version|versioner}} från $2',
+# JavaScriptTest
+'javascripttest' => 'JavaScript-testning',
+'javascripttest-disabled' => 'Denna funktion är avaktiverad.',
+'javascripttest-title' => 'Kör $1 tester',
+'javascripttest-pagetext-noframework' => 'Denna sida är reserverat för att köra JavaScript-tester.',
+'javascripttest-pagetext-unknownframework' => 'Okänd testmiljö "$1".',
+'javascripttest-pagetext-frameworks' => 'Välj en av följande testmiljöer: $1',
+'javascripttest-pagetext-skins' => 'Välj ett utseende att köra tester med:',
+'javascripttest-qunit-intro' => 'Se [$1 testningsdokumentationen] på mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit testsvit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Din användarsida',
-'tooltip-pt-anonuserpage' => 'Användarsida för ip-numret du redigerar från',
-'tooltip-pt-mytalk' => 'Din diskussionssida',
-'tooltip-pt-anontalk' => 'Diskussion om redigeringar från det här ip-numret',
-'tooltip-pt-preferences' => 'Dina inställningar',
-'tooltip-pt-watchlist' => 'Listan över sidor du bevakar för ändringar',
-'tooltip-pt-mycontris' => 'Lista över dina bidrag',
-'tooltip-pt-login' => 'Du får gärna logga in, men det är inte nödvändigt',
-'tooltip-pt-anonlogin' => 'Du får gärna logga in, men det är inte nödvändigt',
-'tooltip-pt-logout' => 'Logga ut',
-'tooltip-ca-talk' => 'Diskussion om innehållssidan',
-'tooltip-ca-edit' => 'Du kan redigera den här sidan.
+'tooltip-pt-userpage' => 'Din användarsida',
+'tooltip-pt-anonuserpage' => 'Användarsida för ip-numret du redigerar från',
+'tooltip-pt-mytalk' => 'Din diskussionssida',
+'tooltip-pt-anontalk' => 'Diskussion om redigeringar från det här ip-numret',
+'tooltip-pt-preferences' => 'Dina inställningar',
+'tooltip-pt-watchlist' => 'Listan över sidor du bevakar för ändringar',
+'tooltip-pt-mycontris' => 'Lista över dina bidrag',
+'tooltip-pt-login' => 'Du får gärna logga in, men det är inte nödvändigt',
+'tooltip-pt-anonlogin' => 'Du får gärna logga in, men det är inte nödvändigt',
+'tooltip-pt-logout' => 'Logga ut',
+'tooltip-ca-talk' => 'Diskussion om innehållssidan',
+'tooltip-ca-edit' => 'Du kan redigera den här sidan.
Vänligen använd förhandsgranskningsknappen innan du sparar.',
-'tooltip-ca-addsection' => 'Starta ett nytt avsnitt',
-'tooltip-ca-viewsource' => 'Den här sidan är skrivskyddad. Du kan se källtexten.',
-'tooltip-ca-history' => 'Tidigare versioner av sidan',
-'tooltip-ca-protect' => 'Skydda den här sidan',
-'tooltip-ca-unprotect' => 'Ändra skyddet för den här sidan',
-'tooltip-ca-delete' => 'Radera denna sida',
-'tooltip-ca-undelete' => 'Återställ alla redigeringar som gjorts innan sidan raderades',
-'tooltip-ca-move' => 'Flytta den här sidan',
-'tooltip-ca-watch' => 'Lägg till sidan på din bevakningslista',
-'tooltip-ca-unwatch' => 'Ta bort denna sida från din bevakningslista',
-'tooltip-search' => 'Sök på {{SITENAME}}',
-'tooltip-search-go' => 'GÃ¥ till sidan med detta namn om den finns',
-'tooltip-search-fulltext' => 'Sök efter sidor som innehåller denna text',
-'tooltip-p-logo' => 'Besök huvudsidan',
-'tooltip-n-mainpage' => 'Besök huvudsidan',
-'tooltip-n-mainpage-description' => 'Besök huvudsidan',
-'tooltip-n-portal' => 'Om projektet, vad du kan göra, var man kan hitta saker',
-'tooltip-n-currentevents' => 'Hitta bakgrundsinformation om aktuella händelser',
-'tooltip-n-recentchanges' => 'Lista över senaste ändringar i wikin',
-'tooltip-n-randompage' => 'Gå till en slumpmässigt vald sida',
-'tooltip-n-help' => 'Hjälp och information',
-'tooltip-t-whatlinkshere' => 'Lista över alla wikisidor som länkar hit',
-'tooltip-t-recentchangeslinked' => 'Visa senaste ändringarna av sidor som den här sidan länkar till',
-'tooltip-feed-rss' => 'RSS-matning för den här sidan',
-'tooltip-feed-atom' => 'Atom-matning för den här sidan',
-'tooltip-t-contributions' => 'Visa lista över bidrag från den här användaren',
-'tooltip-t-emailuser' => 'Skicka e-post till den här användaren',
-'tooltip-t-upload' => 'Ladda upp filer',
-'tooltip-t-specialpages' => 'Lista över alla specialsidor',
-'tooltip-t-print' => 'Utskriftvänlig version av den här sidan',
-'tooltip-t-permalink' => 'Permanent länk till den här versionen av sidan',
-'tooltip-ca-nstab-main' => 'Visa innehållssidan',
-'tooltip-ca-nstab-user' => 'Visa användarsidan',
-'tooltip-ca-nstab-media' => 'Visa mediesidan',
-'tooltip-ca-nstab-special' => 'Detta är en specialsida; du kan inte redigera själva sidan',
-'tooltip-ca-nstab-project' => 'Visa projektsidan',
-'tooltip-ca-nstab-image' => 'Visa filsidan',
-'tooltip-ca-nstab-mediawiki' => 'Visa systemmeddelandet',
-'tooltip-ca-nstab-template' => 'Visa mallen',
-'tooltip-ca-nstab-help' => 'Visa hjälpsidan',
-'tooltip-ca-nstab-category' => 'Visa kategorisidan',
-'tooltip-minoredit' => 'Markera som mindre ändring',
-'tooltip-save' => 'Spara dina ändringar',
-'tooltip-preview' => 'Förhandsgranska dina ändringar, vänligen använd detta innan du sparar!',
-'tooltip-diff' => 'Visa vilka förändringar du har gjort av texten.',
-'tooltip-compareselectedversions' => 'Visa skillnaden mellan de två markerade versionerna av den här sidan.',
-'tooltip-watch' => 'Lägg till den här sidan i din bevakningslista',
-'tooltip-recreate' => 'Ã…terskapa sidan fast den har tagits bort',
-'tooltip-upload' => 'Starta uppladdning',
-'tooltip-rollback' => '"Tillbakarullning" tar med en knapptryckning bort ändringar som gjorts av den som senast redigerade sidan',
-'tooltip-undo' => '"Gör ogjord" återställer denna redigering och öppnar redigeringsrutan med förhandsgranskning.
+'tooltip-ca-addsection' => 'Starta ett nytt avsnitt',
+'tooltip-ca-viewsource' => 'Den här sidan är skrivskyddad. Du kan se källtexten.',
+'tooltip-ca-history' => 'Tidigare versioner av sidan',
+'tooltip-ca-protect' => 'Skydda den här sidan',
+'tooltip-ca-unprotect' => 'Ändra skyddet för den här sidan',
+'tooltip-ca-delete' => 'Radera denna sida',
+'tooltip-ca-undelete' => 'Återställ alla redigeringar som gjorts innan sidan raderades',
+'tooltip-ca-move' => 'Flytta den här sidan',
+'tooltip-ca-watch' => 'Lägg till sidan på din bevakningslista',
+'tooltip-ca-unwatch' => 'Ta bort denna sida från din bevakningslista',
+'tooltip-search' => 'Sök på {{SITENAME}}',
+'tooltip-search-go' => 'GÃ¥ till sidan med detta namn om den finns',
+'tooltip-search-fulltext' => 'Sök efter sidor som innehåller denna text',
+'tooltip-p-logo' => 'Besök huvudsidan',
+'tooltip-n-mainpage' => 'Besök huvudsidan',
+'tooltip-n-mainpage-description' => 'Besök huvudsidan',
+'tooltip-n-portal' => 'Om projektet, vad du kan göra, var man kan hitta saker',
+'tooltip-n-currentevents' => 'Hitta bakgrundsinformation om aktuella händelser',
+'tooltip-n-recentchanges' => 'Lista över senaste ändringar i wikin',
+'tooltip-n-randompage' => 'Gå till en slumpmässigt vald sida',
+'tooltip-n-help' => 'Hjälp och information',
+'tooltip-t-whatlinkshere' => 'Lista över alla wikisidor som länkar hit',
+'tooltip-t-recentchangeslinked' => 'Visa senaste ändringarna av sidor som den här sidan länkar till',
+'tooltip-feed-rss' => 'RSS-matning för den här sidan',
+'tooltip-feed-atom' => 'Atom-matning för den här sidan',
+'tooltip-t-contributions' => 'Visa lista över bidrag från den här användaren',
+'tooltip-t-emailuser' => 'Skicka e-post till den här användaren',
+'tooltip-t-upload' => 'Ladda upp filer',
+'tooltip-t-specialpages' => 'Lista över alla specialsidor',
+'tooltip-t-print' => 'Utskriftvänlig version av den här sidan',
+'tooltip-t-permalink' => 'Permanent länk till den här versionen av sidan',
+'tooltip-ca-nstab-main' => 'Visa innehållssidan',
+'tooltip-ca-nstab-user' => 'Visa användarsidan',
+'tooltip-ca-nstab-media' => 'Visa mediesidan',
+'tooltip-ca-nstab-special' => 'Detta är en specialsida; du kan inte redigera själva sidan',
+'tooltip-ca-nstab-project' => 'Visa projektsidan',
+'tooltip-ca-nstab-image' => 'Visa filsidan',
+'tooltip-ca-nstab-mediawiki' => 'Visa systemmeddelandet',
+'tooltip-ca-nstab-template' => 'Visa mallen',
+'tooltip-ca-nstab-help' => 'Visa hjälpsidan',
+'tooltip-ca-nstab-category' => 'Visa kategorisidan',
+'tooltip-minoredit' => 'Markera som mindre ändring',
+'tooltip-save' => 'Spara dina ändringar',
+'tooltip-preview' => 'Förhandsgranska dina ändringar, vänligen använd detta innan du sparar!',
+'tooltip-diff' => 'Visa vilka förändringar du har gjort av texten.',
+'tooltip-compareselectedversions' => 'Visa skillnaden mellan de två markerade versionerna av den här sidan.',
+'tooltip-watch' => 'Lägg till den här sidan i din bevakningslista',
+'tooltip-watchlistedit-normal-submit' => 'Ta bort titlar',
+'tooltip-watchlistedit-raw-submit' => 'Uppdatera bevakningslista',
+'tooltip-recreate' => 'Ã…terskapa sidan fast den har tagits bort',
+'tooltip-upload' => 'Starta uppladdning',
+'tooltip-rollback' => '"Tillbakarullning" tar med en knapptryckning bort ändringar som gjorts av den som senast redigerade sidan',
+'tooltip-undo' => '"Gör ogjord" återställer denna redigering och öppnar redigeringsrutan med förhandsgranskning.
Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
-'tooltip-preferences-save' => 'Spara inställningar',
-'tooltip-summary' => 'Skriv en kort sammanfattning',
+'tooltip-preferences-save' => 'Spara inställningar',
+'tooltip-summary' => 'Skriv en kort sammanfattning',
# Stylesheets
'common.css' => '/* CSS som skrivs här påverkar alla skal */',
@@ -2988,9 +3061,6 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
# Patrol log
'patrol-log-page' => 'Patrulleringslogg',
'patrol-log-header' => 'Detta är en logg över patrullerade sidversioner.',
-'patrol-log-line' => 'markerade $1 av $2 som patrullerad $3',
-'patrol-log-auto' => '(automatiskt)',
-'patrol-log-diff' => 'version $1',
'log-show-hide-patrol' => '$1 patrulleringslogg',
# Image deletion
@@ -3017,11 +3087,11 @@ Om du kör den kan din dator skadas.",
'file-info' => 'filstorlek: $1, MIME-typ: $2',
'file-info-size' => '$1 × $2 pixlar, filstorlek: $3, MIME-typ: $4',
'file-info-size-pages' => '$1 × $2 pixlar, filstorlek: $3, MIME-typ: $4, $5 {{PLURAL:$5|sida|sidor}}',
-'file-nohires' => '<small>Det finns ingen version med högre upplösning.</small>',
+'file-nohires' => 'Det finns ingen version med högre upplösning.',
'svg-long-desc' => 'SVG-fil, grundstorlek: $1 × $2 pixlar, filstorlek: $3',
'show-big-image' => 'Högupplöst version',
-'show-big-image-preview' => '<small>Storlek på förhandsvisningen: $1.</small>',
-'show-big-image-other' => '<small>Andra upplösningar: $1.</small>',
+'show-big-image-preview' => 'Storlek på förhandsvisningen: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Annan upplösning|Andra upplösningar}}: $1.',
'show-big-image-size' => '$1 × $2 pixlar',
'file-info-gif-looped' => 'upprepad',
'file-info-gif-frames' => '$1 {{PLURAL:$1|ram|ramar}}',
@@ -3042,7 +3112,12 @@ Om du kör den kan din dator skadas.",
'sp-newimages-showfrom' => 'Visa nya filer från och med kl. $2 den $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 't',
+'hours-abbrev' => '$1t',
+'seconds' => '{{PLURAL:$1|$1 sekund|$1 sekunder}}',
+'minutes' => '{{PLURAL:$1|$1 minut|$1 minuter}}',
+'hours' => '{{PLURAL:$1|$1 timme|$1 timmar}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'ago' => '$1 sedan',
# Bad image list
'bad_image_list' => 'Listan fungerar enligt följande:
@@ -3537,13 +3612,6 @@ Denna bekräftelsekod kommer att sluta fungera efter $4.',
'scarytranscludefailed' => '[Hämtning av mall för $1 misslyckades]',
'scarytranscludetoolong' => '[För lång URL]',
-# Trackbacks
-'trackbackbox' => 'Till denna sida finns följande trackback:<br />
-$1',
-'trackbackremove' => '([$1 Ta bort])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback har tagits bort.',
-
# Delete conflict
'deletedwhileediting' => "'''Varning''': Denna sida raderades efter att du började redigera!",
'confirmrecreate' => "Användaren [[User:$1|$1]] ([[User talk:$1|diskussion]]) raderade den här sidan efter att du började redigera den med motiveringen:
@@ -3632,6 +3700,9 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
'watchlisttools-edit' => 'Visa och redigera bevakningslistan',
'watchlisttools-raw' => 'Redigera bevakningslistan i råformat',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskussion]])',
+
# Core parser functions
'unknown_extension_tag' => 'Okänd tagg "$1"',
'duplicate-defaultsort' => 'Varning: Standardsorteringsnyckeln "$2" tar över från den tidigare standardsorteringsnyckeln "$1".',
@@ -3730,13 +3801,16 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'tags-hitcount' => '$1 {{PLURAL:$1|ändring|ändringar}}',
# Special:ComparePages
-'comparepages' => 'Jämför sidor',
-'compare-selector' => 'Jämför sidversioner',
-'compare-page1' => 'Sida 1',
-'compare-page2' => 'Sida 2',
-'compare-rev1' => 'Version 1',
-'compare-rev2' => 'Version 2',
-'compare-submit' => 'Jämför',
+'comparepages' => 'Jämför sidor',
+'compare-selector' => 'Jämför sidversioner',
+'compare-page1' => 'Sida 1',
+'compare-page2' => 'Sida 2',
+'compare-rev1' => 'Version 1',
+'compare-rev2' => 'Version 2',
+'compare-submit' => 'Jämför',
+'compare-invalid-title' => 'Titeln du angav är ogiltig.',
+'compare-title-not-exists' => 'Titeln du angav finns inte.',
+'compare-revision-not-exists' => 'Versionen du angav finns inte.',
# Database error messages
'dberr-header' => 'Den här wikin har ett problem',
@@ -3763,4 +3837,90 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'sqlite-has-fts' => '$1 med stöd för fulltextsökning',
'sqlite-no-fts' => '$1 utan stöd för fulltextsökning',
+# New logging system
+'logentry-delete-delete' => '$1 raderade sidan $3',
+'logentry-delete-restore' => '$1 återställde sidan $3',
+'logentry-delete-event' => '$1 ändrade synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-delete-revision' => '$1 ändrade synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-delete-event-legacy' => '$1 ändrade synligheten för logghändelser på $3',
+'logentry-delete-revision-legacy' => '$1 ändrade synligheten för versioner på sidan $3',
+'logentry-suppress-delete' => '$1 gömde sidan $3',
+'logentry-suppress-event' => '$1 ändrade i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 ändrade synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-suppress-event-legacy' => '$1 ändrade synligheten i hemlighet för logghändelser på $3',
+'logentry-suppress-revision-legacy' => '$1 ändrade synligheten i hemlighet för versioner på sidan $3',
+'revdelete-content-hid' => 'innehåll dolt',
+'revdelete-summary-hid' => 'redigeringssammanfattning dold',
+'revdelete-uname-hid' => 'användarnamn dolt',
+'revdelete-content-unhid' => 'innehåll synligt',
+'revdelete-summary-unhid' => 'redigeringssammanfattning synlig',
+'revdelete-uname-unhid' => 'användarnamn synligt',
+'revdelete-restricted' => 'satte begränsningar för administratörer',
+'revdelete-unrestricted' => 'tog bort begränsningar för administratörer',
+'logentry-move-move' => '$1 flyttade sidan $3 till $4',
+'logentry-move-move-noredirect' => '$1 flyttade sidan $3 till $4 utan att lämna en omdirigering',
+'logentry-move-move_redir' => '$1 flyttade sidan $3 till $4 över en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 flyttade sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
+'logentry-patrol-patrol' => '$1 markerade versionen $4 av sidan $3 som patrullerad',
+'logentry-patrol-patrol-auto' => '$1 markerade automatiskt versionen $4 av sidan $3 som patrullerad',
+'logentry-newusers-newusers' => '$1 skapade ett användarkonto',
+'logentry-newusers-create' => '$1 skapade ett användarkonto',
+'logentry-newusers-create2' => '$1 skapade ett användarkonto $3',
+'logentry-newusers-autocreate' => 'Kontot $1 skapades automatiskt',
+'newuserlog-byemail' => 'lösenord skickat med e-post',
+
+# Feedback
+'feedback-bugornote' => 'Om du är redo att beskriva ett tekniskt problem detaljerat, var god [$1 rapporterar en bugg].
+Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att läggas till på sidan "[$3 $2]", tillsammans med ditt användarnamn och vilken webbläsare du använder.',
+'feedback-subject' => 'Ämne:',
+'feedback-message' => 'Meddelande:',
+'feedback-cancel' => 'Avbryt',
+'feedback-submit' => 'Skicka in feedback',
+'feedback-adding' => 'Ge feedback till sida...',
+'feedback-error1' => 'Fel: Okänt resultat från API',
+'feedback-error2' => 'Fel: Redigeringen misslyckades',
+'feedback-error3' => 'Fel: Inget svar från API',
+'feedback-thanks' => 'Tack! Din feedback har skickats till sidan "[$2 $1]".',
+'feedback-close' => 'Färdig',
+'feedback-bugcheck' => 'Jättebra! Bara kontrollera att det inte är en av de [$1 kända buggarna].',
+'feedback-bugnew' => 'Jag kontrollerade. Rapportera ett nytt fel',
+
+# API errors
+'api-error-badaccess-groups' => 'Du får inte ladda upp filer till denna wiki.',
+'api-error-badtoken' => 'Internt fel: felaktig token.',
+'api-error-copyuploaddisabled' => 'Uppladdning via URL är inaktiverad på den här servern.',
+'api-error-duplicate' => 'Det finns redan {{PLURAL:$1|[$2 en annan fil]|[$2 andra filer]}} på webbplatsen med samma innehåll.',
+'api-error-duplicate-archive' => 'Det fanns redan {{PLURAL:$1|[$2 en annan fil]|[$2 några andra filer]}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.',
+'api-error-duplicate-archive-popup-title' => 'Dubblett av {{PLURAL:$1|fil|filer}} som redan har tagits bort',
+'api-error-duplicate-popup-title' => 'Dubblett{{PLURAL:$1|fil|filer}}',
+'api-error-empty-file' => 'Filen du skickade var tom.',
+'api-error-emptypage' => 'Det är inte tillåtet att skapa nya, tomma sidor.',
+'api-error-fetchfileerror' => 'Internt fel: något gick fel vid hämtningen av filen.',
+'api-error-file-too-large' => 'Filen du skickade var för stor.',
+'api-error-filename-tooshort' => 'Filnamnet är för kort.',
+'api-error-filetype-banned' => 'Denna typ av fil är förbjuden.',
+'api-error-filetype-missing' => 'Filen saknar en filändelse.',
+'api-error-hookaborted' => 'Ändringen du försökte göra avbröts av en extension hook.',
+'api-error-http' => 'Internt fel: Det gick inte att ansluta till servern.',
+'api-error-illegal-filename' => 'Filnamnet är inte tillåtet.',
+'api-error-internal-error' => 'Internt fel: något gick fel med bearbetningen av din uppladdning på wikin.',
+'api-error-invalid-file-key' => 'Internt fel: filen hittades inte i tillfällig lagring.',
+'api-error-missingparam' => 'Internt fel: det saknas parametrar i begäran.',
+'api-error-missingresult' => 'Internt fel: kunde inte avgöra om kopieringen lyckades.',
+'api-error-mustbeloggedin' => 'Du måste vara inloggad för att kunna ladda upp filer.',
+'api-error-mustbeposted' => 'Det finns en bugg i detta program, det använder inte rätt HTTP-metod.',
+'api-error-noimageinfo' => 'Uppladdningen lyckades, men servern gav oss inte någon information om filen.',
+'api-error-nomodule' => 'Internt fel: ingen uppladdningsmodul uppsatt.',
+'api-error-ok-but-empty' => 'Internt fel: Inget svar från servern.',
+'api-error-overwrite' => 'Det är inte tillåtet att skriva över en befintlig fil.',
+'api-error-stashfailed' => 'Internt fel: servern kunde inte lagra temporär fil.',
+'api-error-timeout' => 'Servern svarade inte inom förväntad tid.',
+'api-error-unclassified' => 'Ett okänt fel uppstod',
+'api-error-unknown-code' => 'Okänt fel: "$1"',
+'api-error-unknown-error' => 'Internt fel: något gick fel när vi försökte ladda upp din fil.',
+'api-error-unknown-warning' => 'Okänd varning: $1',
+'api-error-unknownerror' => 'Okänt fel: "$1".',
+'api-error-uploaddisabled' => 'Uppladdning är inaktiverad på denna wiki.',
+'api-error-verification-error' => 'Denna fil kan vara skadad eller har fel filändelse.',
+
);
diff --git a/languages/messages/MessagesSw.php b/languages/messages/MessagesSw.php
index d39894a7..c8fc0bf5 100644
--- a/languages/messages/MessagesSw.php
+++ b/languages/messages/MessagesSw.php
@@ -482,22 +482,24 @@ Tafadhali ripoti hili kwa [[Special:ListUsers/sysop|mkabidhi]], na uache jina la
'badarticleerror' => 'Ukurasa huu hauwezi kutendewa kitendo hiki.',
'cannotdelete' => 'Haikuweza kufuta kurasa au faili linaloitwa "$1".
Huenda likawa tayari lishafutwa na mtu mwingine.',
+'cannotdelete-title' => 'Wezi futa ukurasa "$1"',
'badtitle' => 'Jina halifai',
'badtitletext' => 'Jina la ukurasa ulilotaka ni batilifu, tupu, au limeungwa vibaya na jina la lugha nyingine au Wiki nyingine. Labda linazo herufi moja au zaidi ambazo hazitumiki katika majina.',
-'perfcached' => 'Data zifuatazo zinatoka kwenye kache na huenda si ya kisasa.',
-'perfcachedts' => 'Data zifuatazo zimetoka kwenye kache iliobadilishwa mara ya mwisho saa $3, tarehe $2.',
+'perfcached' => 'Data zifuatazo zimekachewa na huenda zisiwe za kisasa. Mwisho wa {{PLURAL:$1|jibu moja linapatikana|majibu $1 yanapatikana}} katika kache.',
+'perfcachedts' => 'Data zifuatazo zimetoka kwenye kache iliobadilishwa mara ya mwisho saa $3, tarehe $2. Mwisho wa {{PLURAL:$1|jibu moja linapatikana|majibu $1 yanapatikana}} katika kache.',
'querypage-no-updates' => 'Mabadiliko kwa ajili ya ukurasa huu yamesimamishwa.
Data za hapa haziwezi kunawirishwa kwa sasa.',
'wrong_wfQuery_params' => 'Parameta za ulizio zilizoingizwa wfQuery() na zisizo sahihi ni<br />
Kitenda: $1<br />
Ulizio: $2',
'viewsource' => 'Onyesha kodi za ukurasa',
-'viewsourcefor' => 'kwa $1',
+'viewsource-title' => 'Tazama chanzo cha $1',
'actionthrottled' => 'Tendo limesimamishwa',
'actionthrottledtext' => 'Ikiwa kama hatua ya kupambana na uharibifu, umefika kikomo katika kutenda jambo hili kwa mara nyingi mno tena kwa kipindi cha muda mfupi kama huu, na umevuka kiwango hiki.
Tafadhali jaribu tena baada ya muda mfupi.',
'protectedpagetext' => 'Ukurasa huu umefungwa ili kuepuka uhariri.',
'viewsourcetext' => 'Unaweza kutazama na kuiga chanzo cha ukurasa huu:',
+'viewyourtext' => "Unaweza kutazama na kunakili chanzo cha ''maharirio yako'' katika ukurasa huu:",
'protectedinterface' => 'Ukurasa huu unatoa maelezo ya msingi ya bidhaa pepe, na pia umefungwa ili kuzuiya uharibifu.',
'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.
@@ -603,6 +605,7 @@ Hakuna hata barua pepe moja itakayotumwa kwa lolote katika vipengele hivi vifua
'emailconfirmlink' => 'Yakinisha anwani yako ya barua pepe',
'invalidemailaddress' => 'Anwani ya barua pepe haiwezi kukubalika ikiwa inaonekana kuwa na muundo batili.
Tafadhali ingiza anwani ya miundo-mizuri au acha tupu kipengele hicho.',
+'cannotchangeemail' => 'Anwani za barua pepe haziwezi kubadilishwa katika akaunti za wiki hii.',
'accountcreated' => 'Akaunti imeundwa',
'accountcreatedtext' => 'Akaunti imeundwa kwa ajili ya mtumiaji $1.',
'createaccount-title' => 'Kuanzisha akaunti kwa ajili ya {{SITENAME}}',
@@ -619,6 +622,7 @@ Tafadhali subiri kwanza kabla ya kujaribu tena.',
# E-mail sending
'php-mail-error-unknown' => 'Hitilafu isiyojulikana katika ufanyajikazi wa barua za PHP ().',
+'user-mail-no-addy' => 'Umejaribu kutuma barua pepe bila anwani ya barua pepe.',
# Change password dialog
'resetpass' => 'Kubadilisha neno la siri',
@@ -639,30 +643,45 @@ Inawezekana ikawa tayari umefaulu kubadilisha neno lako la siri au neno la siri
'resetpass-temp-password' => 'Neno la siri la muda:',
# 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-email' => 'Anwani ya barua pepe:',
-'passwordreset-emailtitle' => 'Maelezo ya akaunti kwenye {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Kuna mtu (huenda ikawa ni wewe, kutoka anwani ya IP $1) aliyeomba kukumbushwa kuhusu maelezo ya akaunti yako katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:
+'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?',
+'passwordreset-capture-help' => 'Iwapo utatia alama kisanduku hiki, barua-pepe (pamoja na nenosiri la muda) litaoneshwa kwako na vilevile litatumwa kwa mtumiaji.',
+'passwordreset-email' => 'Anwani ya barua pepe:',
+'passwordreset-emailtitle' => 'Maelezo ya akaunti kwenye {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Kuna mtu (huenda ikawa ni wewe, kutoka anwani ya IP $1) aliyeomba kukumbushwa kuhusu maelezo ya akaunti yako katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:
$2
{{PLURAL:$3|Neno la siri hili litakwisha|Maneno ya siri haya yatakwisha}} baada ya siku {{PLURAL:$5|$5}}.
Tafadhali ingia sasa na uchague neno jipya la siri. Kama mtu mwingine ameomba hili, au ikiwa umekumbuka neno lako la siri na hutaki kulibadilisha tena, basi usijali ujumbe huu, na uendelee kutumia neno la siri lako la zamani.',
-'passwordreset-emailtext-user' => 'Mtumiaji $1 kwenye {{SITENAME}} ameomba akumbushwe maelezo ya akaunti yako katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:
+'passwordreset-emailtext-user' => 'Mtumiaji $1 kwenye {{SITENAME}} ameomba akumbushwe maelezo ya akaunti yako katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:
$2
{{PLURAL:$3|Neno la siri hili litakwisha|Maneno ya siri haya yatakwisha}} baada ya siku {{PLURAL:$5|$5}}.
Tafadhali ingia sasa na uchague neno jipya la siri. Kama mtu mwingine ameomba hili, au ikiwa umekumbuka neno lako la siri na hutaki kulibadilisha tena, basi usijali ujumbe huu, na uendelee kutumia neno la siri lako la zamani.',
-'passwordreset-emailelement' => 'Jina la mtumiaji: $1
+'passwordreset-emailelement' => 'Jina la mtumiaji: $1
Neno la siri la muda: $2',
-'passwordreset-emailsent' => 'Barua pepe ya ukumbusho imetumwa.',
+'passwordreset-emailsent' => 'Barua pepe ya ukumbusho imetumwa.',
+'passwordreset-emailsent-capture' => 'Barua pepe ya ukukumbusho imetumwa, ambayo inaonekana hapo chini.',
+'passwordreset-emailerror-capture' => 'Barua pepe ya ukukumbusho imetengenezwa, ambayo inaonekana hapo chini, lakini kuituma kwa mtumiaji imeshindikana: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Badilisha anwani ya barua pepe',
+'changeemail-header' => 'Badilisha anwani ya barua pepe ya akaunti yako',
+'changeemail-text' => 'Jaza fomu hii ili kubadilisha anwani yako ya barua pepe. Itabidi uingize neno lako la siri ili kukamilisha badiliko hili.',
+'changeemail-no-info' => 'Lazima uwe umeingia ili kuweza kutumia kurasa hii moja kwa moja.',
+'changeemail-oldemail' => 'Anwani ya barua pepe ya sasa:',
+'changeemail-newemail' => 'Anwani mpya ya barua pepe:',
+'changeemail-none' => '(hakuna)',
+'changeemail-submit' => 'Badilisha anwani ya barua pepe',
+'changeemail-cancel' => 'Batilisha',
# Edit page toolbar
'bold_sample' => 'Maandishi ya kooze',
@@ -731,9 +750,6 @@ Elewa kwamba huwezi kutumia kipengele cha "umtumie barua pepe mtuaji huyu" bila
Anwani yako ya sasa ya IP ni $3, na namba ya kuzuiliwa ni #$5.
Tafadhali jumlisha maelezo yote ya juu kwenye kila ulizo utakalolifanya.',
'blockednoreason' => 'sababu haikutajwa',
-'blockedoriginalsource' => "Kodi ya '''$1''' imeonyeshwa hapo chini:",
-'blockededitsource' => "Maandishi ya '''maharirio yako''' kwa '''$1''' yameonyeshwa chini:",
-'whitelistedittitle' => 'Kuingia kunahitajika ili uweze kuhariri',
'whitelistedittext' => 'Inabidi $1 ili uweze kuhariri kurasa.',
'confirmedittext' => 'Lazima uthibitishe anwani ya barua pepe yako kabla ya kuhariri kurasa.
Tafadhali thibitisha anwani ya barua pepe yako kupitia [[Special:Preferences|mapendekezo yako ya mtumiaji]].',
@@ -820,7 +836,7 @@ Unakuwa unaahidi kwamba maandishi unayoyaingia ni yako tu, au uliyapata kutoka b
Ikiwa hutaki maandishi yako yasihaririwe na yeyote, basi usiyaweke hapa.<br />
Pia una tuahidi kwamba umeandika haya wewe mwenyewe, au umenakili kutoka katika tovuti ya umma au chanzo cha wazi sawa na hiki (tazama $1 kwa maelezo).
'''Usiandike makala yenye hakimiliki bila ya ruhusa halali!'''",
-'longpageerror' => "'''Hitilafu: Maandishi uliyoyaweka yana urefu wa kilobati $1, ambayo ni marefu kuliko kiwango cha kawaida cha kilobaiti $2.'''
+'longpageerror' => "'''Hitilafu: Maandishi uliyoyaweka yana kilobaiti $1, ambayo ni urefu kuliko kiwango cha kawaida cha kilobaiti $2.'''
Hayawezi kuhifadhiwa.",
'readonlywarning' => "'''Onyo: Hifadhidata imefungwa kwa ajili ya matengenezo, kwa hiyo hautakuwa na uwezo wa kuhifadhi maharirio yako kwa sasa.'''
Unaweza kukata-na-kabandika maandishi yako kwenye faili na kulihifadhi kwa ajili ya baadaye.
@@ -961,8 +977,6 @@ Wakabidhi wengine wa {{SITENAME}} bado wataweza kuliona lile lililofichwa pamoja
'revdelete-unsuppress' => 'Uzuio wa kuona mapitio uondolewe, mapitio yanaporudishwa',
'revdelete-log' => 'Sababu:',
'revdelete-submit' => '{{PLURAL:$1|Pitio lililochaguliwa lifanyiwe|Mapitio yaliyochaguliwa yafanyiwe}} kazi.',
-'revdelete-logentry' => 'alibadilisha uwezo wa kuona maelezo ya mapitio ya ukurasa wa [[$1]]',
-'logdelete-logentry' => 'alibadilisha uwezo wa kuona matukio ya ukurasa wa [[$1]]',
'revdelete-success' => "'''Kubadilisha uwezo wa kuona pitio ulifaulu.'''",
'revdelete-failure' => "'''Kubadilisha uwezo wa kuona pitio hakufaulu:'''
$1",
@@ -974,15 +988,6 @@ $1",
'revdel-restore-visible' => 'mapitio yanayoonekana',
'pagehist' => 'Historia ya ukurasa',
'deletedhist' => 'Historia iliyofutwa',
-'revdelete-content' => 'maandiko',
-'revdelete-summary' => 'muhtasari wa kuhariri',
-'revdelete-uname' => 'jina la mtumiaji',
-'revdelete-restricted' => 'aliwazuia pia wakabidhi wasiyaone maelezo',
-'revdelete-unrestricted' => 'aliwarudishia wakabidhi uwezo wa kuona maelezo',
-'revdelete-hid' => 'alificha $1',
-'revdelete-unhid' => 'aliacha kuficha $1',
-'revdelete-log-message' => '$1 kwenye {{PLURAL:$2|pitio|mapitio}} $2',
-'logdelete-log-message' => '$1 kwenye {{PLURAL:$2|tukio|matukio}} $2',
'revdelete-hide-current' => 'Hitilafu ya kuficha pitio lililotengenezwa saa $2, tarehe $1: hilo ndilo pitio la sasa hivi.
Haliwezi kufichwa.',
'revdelete-reason-dropdown' => '*Sababu za kufuta zinazotokea mara kwa mara
@@ -1123,12 +1128,14 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
'prefs-rc' => 'Mabadiliko ya karibuni',
'prefs-watchlist' => 'Maangalizi',
'prefs-watchlist-days' => 'Ionyeshwe siku ngapi kwenye orodha ya maangalizi?',
-'prefs-watchlist-days-max' => 'Isizidi siku 7',
+'prefs-watchlist-days-max' => 'Isizidi {{PLURAL:$1|siku}} $1',
'prefs-watchlist-edits' => 'Upeo ya idadi ya mabadiliko yatakayoonyeshwa kwenye orodha ya maangalizi iliyotanuka:',
'prefs-watchlist-edits-max' => 'Idadi isiyopitishwa: 1000',
'prefs-watchlist-token' => 'Ufunguo wa orodha ya maangalizi:',
'prefs-misc' => 'Mengineyo',
'prefs-resetpass' => 'Kubadilisha neno la siri',
+'prefs-changeemail' => 'Badilisha anwani ya barua pepe',
+'prefs-setemail' => 'Weka anwani ya barua pepe',
'prefs-email' => 'Hitiari za barua pepe',
'prefs-rendering' => 'Umbo',
'saveprefs' => 'Hifadhi',
@@ -1316,6 +1323,7 @@ Taarifa hii itakuwa wazi.',
'right-userrights-interwiki' => 'Kuhariri wezo za watumiaji kwenye wiki zingine',
'right-siteadmin' => 'Kufunga na kufungua hifadhidata',
'right-sendemail' => 'Kutuma barua-pepe kwa watumiaji wengine',
+'right-passwordreset' => 'Kuona barua pepe zinazoweka neno la siri upya',
# User rights log
'rightslog' => 'Kumbukumbu za vyeo vya watumiaji',
@@ -1437,6 +1445,7 @@ Tazama [[Special:NewFiles|mkusanyiko wa mafaili mapya]] kuona picha zenyewe.',
'minlength1' => 'Majina ya mafaili yanatakiwa kuwa na herufi moja au zaidi.',
'illegalfilename' => 'Jina la faili la "$1" lina herufi zisizoruhusiwa katika majina ya kurasa.
Tafadhali uweke jina jipya kwenye faili, halafu jaribu kulipakia upya.',
+'filename-toolong' => 'Majina ya mafaili yasizidi baiti 240.',
'badfilename' => 'Jina la faili limebadilishwa kuwa "$1".',
'filetype-mime-mismatch' => 'Tawi (extension) ".$1" la faili halingani na aina yake ya MIME ($2).',
'filetype-badmime' => 'Mafaili ya aina ya MIME ya "$1" hayaruhusiwi kupakiwa.',
@@ -1538,6 +1547,9 @@ Tatizo likiendelea, uwasiliane na [[Special:ListUsers/sysop|mkabidhi]].',
'upload-unknown-size' => 'Ukubwa haujulikani',
'upload-http-error' => 'Imetokea hitilafu ya HTTP: $1',
+# File backend
+'backend-fail-alreadyexists' => 'Faili $1 linapatikana tayari.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Ilitokea hitilafu wakati wa kufungua faili kwa ajili ya ukaguzi wa ZIP.',
'zip-wrong-format' => 'Faili lililotajwa si faili la ZIP.',
@@ -1642,23 +1654,24 @@ Maelezo yaliyopo katika [$2 ukurasa wa maelezo ya faili] linaonyeshwa hapa.',
'filerevert-badversion' => 'Katika wiki hii hakuna mtindo wa awali wa faili hili lenye stempu ya saa iliyotajwa.',
# File deletion
-'filedelete' => 'Futa $1',
-'filedelete-legend' => 'Futa faili',
-'filedelete-intro' => "Unataka kufuta faili la '''[[Media:$1|$1]]''' pamoja na historia yake yote.",
-'filedelete-intro-old' => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
-'filedelete-comment' => 'Sababu:',
-'filedelete-submit' => 'Futa',
-'filedelete-success' => "'''$1''' limefutwa.",
-'filedelete-success-old' => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
-'filedelete-nofile' => "Hakuna faili la '''$1'''.",
-'filedelete-nofile-old' => "There is no archived version of '''$1''' with the specified attributes.",
-'filedelete-otherreason' => 'Sababu nyingine:',
-'filedelete-reason-otherlist' => 'Sababu nyingine',
-'filedelete-reason-dropdown' => '*Sababu zinazotolewa mara kwa mara
+'filedelete' => 'Futa $1',
+'filedelete-legend' => 'Futa faili',
+'filedelete-intro' => "Unataka kufuta faili la '''[[Media:$1|$1]]''' pamoja na historia yake yote.",
+'filedelete-intro-old' => "You are deleting the version of '''[[Media:$1|$1]]''' as of [$4 $3, $2].",
+'filedelete-comment' => 'Sababu:',
+'filedelete-submit' => 'Futa',
+'filedelete-success' => "'''$1''' limefutwa.",
+'filedelete-success-old' => "The version of '''[[Media:$1|$1]]''' as of $3, $2 has been deleted.",
+'filedelete-nofile' => "Hakuna faili la '''$1'''.",
+'filedelete-nofile-old' => "There is no archived version of '''$1''' with the specified attributes.",
+'filedelete-otherreason' => 'Sababu nyingine:',
+'filedelete-reason-otherlist' => 'Sababu nyingine',
+'filedelete-reason-dropdown' => '*Sababu zinazotolewa mara kwa mara
** Kosa la hakimiliki
** Faili la nakili',
-'filedelete-edit-reasonlist' => 'Kuhariri orodha ya sababu za kufuta',
-'filedelete-maintenance' => 'Tovuti inarekebishwa. Kwa muda huo kufuta na kurudisha mafaili haiwezikani.',
+'filedelete-edit-reasonlist' => 'Kuhariri orodha ya sababu za kufuta',
+'filedelete-maintenance' => 'Tovuti inarekebishwa. Kwa muda huo kufuta na kurudisha mafaili haiwezikani.',
+'filedelete-maintenance-title' => 'Faili hilifutiki',
# MIME search
'mimesearch' => 'Utafutaji wa MIME',
@@ -1862,12 +1875,8 @@ Itifaki zinazoungwa mkono: <tt>$1</tt>',
'activeusers-noresult' => 'Watumiaji hawakupatikana.',
# Special:Log/newusers
-'newuserlogpage' => 'Kumbukumbu za kuanzisha akaunti za watumiaji',
-'newuserlogpagetext' => 'Hii ni kumbukumbu ya akaunti mpya zilizosajiliwa.',
-'newuserlog-byemail' => 'neno la siri limetumwa kwa barua pepe',
-'newuserlog-create-entry' => 'Akaunti ya mtumiaji mgeni',
-'newuserlog-create2-entry' => 'amesajili akaunti mpya $1',
-'newuserlog-autocreate-entry' => 'Akaunti imejifungua yenyewe',
+'newuserlogpage' => 'Kumbukumbu za kuanzisha akaunti za watumiaji',
+'newuserlogpagetext' => 'Hii ni kumbukumbu ya akaunti mpya zilizosajiliwa.',
# Special:ListGroupRights
'listgrouprights' => 'Wezo za kundi za watumiaji',
@@ -1896,7 +1905,7 @@ Labda patakuwa na [[{{MediaWiki:Listgrouprights-helppage}}|maelezo mengine]] kuh
'emailpagetext' => 'Utumie fomu iliopo chini ili kutuma barua pepe kwa mtumiaji huyu.
Anwani yako ya barua pepe ulioitaja katika [[Special:Preferences|mapendekezo yako]] itaandikwa kwenye sanduku la anwani "Kutoka kwa" katika barua pepe, ili mtu atakayeipokea aweze kukujibu moja kwa moja.',
'usermailererror' => 'Chombo cha ujumbe kimerejesha hitilafu:',
-'defemailsubject' => 'Barua pepe ya {{SITENAME}}',
+'defemailsubject' => 'Barua pepe ya {{SITENAME}} iliyotumwa na mtumiaji "$1"',
'usermaildisabled' => 'Uwezo wa kutuma barua pepe kwa mtumiaji umesitishwa',
'usermaildisabledtext' => 'Huwezi kutuma barua pepe kwa watumiaji wengine wa wiki hii',
'noemailtitle' => 'Anwani ya barua pepe hakuna',
@@ -2012,8 +2021,6 @@ Tafadhali hakikisha kwamba unalenga kufanya hivyo, na kwamba unaelewa matokeo ya
'actioncomplete' => 'Kitendo kimekwisha',
'actionfailed' => 'Tendo halikufaulu',
'deletedtext' => '"$1" imefutwa. Ona $2 kwa historia ya kurasa zilizofutwa hivi karibuni.',
-'deletedarticle' => 'alifuta "[[$1]]"',
-'suppressedarticle' => 'alificha "[[$1]]"',
'dellogpage' => 'Kumbukumbu ya ufutaji',
'dellogpagetext' => 'Kurasa na mafaili zilizofutwa hivi karibuni zinaorodheshwa chini.',
'deletionlog' => 'kumbukumbu za kufuta',
@@ -2054,7 +2061,10 @@ ukurasa huu una mhariri mmoja tu.',
'unprotectedarticle' => 'alitoa ulindaji wa "[[$1]]"',
'movedarticleprotection' => 'alihamisha ulindaji wa "[[$2]]" hadi "[[$1]]"',
'protect-title' => 'Kubadilisha kiwango cha ulindaji wa "$1"',
+'protect-title-notallowed' => 'Tazama kiwango cha ulindaji wa "$1"',
'prot_1movedto2' => 'alihamisha [[$1]] hadi [[$2]]',
+'protect-badnamespace-title' => 'Eneo la wiki lisiloweza kulindwa',
+'protect-badnamespace-text' => 'Kurasa zilizopo katika eneo hili la wiki haziwezi kulindwa',
'protect-legend' => 'Hakikisha ukingo',
'protectcomment' => 'Sababu:',
'protectexpiry' => 'Itakwisha:',
@@ -2073,6 +2083,7 @@ Hivi ni vipimo kwa ukurasa '''$1''':",
'protect-level-sysop' => 'Wakabidhi tu',
'protect-summary-cascade' => 'ulindaji kwa kurasa chini yake',
'protect-expiring' => 'itakwisha $1 (UTC)',
+'protect-expiring-local' => 'inaishia saa $1',
'protect-expiry-indefinite' => 'bila mwisho',
'protect-cascade' => 'Linda kurasa zinazozingatiwa chini ya ukurasa huu',
'protect-cantedit' => 'Huwezi kubadilisha kiwango cha ulindaji wa ukurasa huu, kwa sababu huruhusiwi kuuhariri.',
@@ -2117,7 +2128,6 @@ Hivi ni vipimo kwa ukurasa '''$1''':",
'undeletereset' => 'Seti upya',
'undeleteinvert' => 'Geuza uteuzi',
'undeletecomment' => 'Sababu:',
-'undeletedarticle' => 'alirudisha "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|pitio 1 lilirudishwa|mapitio $1 yalirudishwa}}',
'undeletedfiles' => '{{PLURAL:$1|faili 1 lilirudishwa|mafaili $1 yalirudishwa}}',
'cannotundelete' => 'Kurudisha ukurasa imeshindikana;
@@ -2314,8 +2324,6 @@ Chagua jina lengine.',
'move-talk-subpages' => 'Hamisha kurasa ndogo za ukurasa wa majadiliano (hadi $1)',
'movepage-page-moved' => 'Ukurasa wa $1 umehamishwa hadi $2.',
'movepage-page-unmoved' => 'Ukurasa wa $1 hakuweza kuhamishwa hadi $2.',
-'1movedto2' => '[[$1]] umesogezwa hapa [[$2]]',
-'1movedto2_redir' => 'alihamisha [[$1]] kwenda [[$2]] kwa kutengeneza elekezo',
'movelogpage' => 'Kumbukumbu ya uhamiaji',
'movelogpagetext' => 'Hapo chini panaorodheshwa kurasa zote zilizohamishwa.',
'movesubpage' => '{{PLURAL:$1|Ukurasa mdogo|Kurasa ndogo}}',
@@ -2352,9 +2360,11 @@ Nakala hizi zinaweza kuletwa katika wiki nyingine ya MediaWiki kwa kupitia [[Spe
Kupeleka kurasa, andika majina yao katika sanduku chini, jina moja kwa kila mstari. Chagua kupeleka ama haririo ya kisasa pamoja na mapitio yote ya awali na maelezo ya historia, ama haririo ya kisasa pamoja na maelezo ya haririo la mwisho tu.
Ukipeleka haririo ya kisasa tu, unaweza kutumia kiungo kinachokwenda ukurasa wa chanzo, kwa mfano [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] kwa ajili ya ukurasa wa "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Peleka kurasa zote',
'exportcuronly' => 'Peleka haririo la kisasa tu, bila mapitio ya awali',
'exportnohistory' => "----
'''Ilani:''' Kupeleka mapitio yote ya kurasa kwa kutumia fomu hii kumesimamishwa ili utendaji wa tovuti isiathiriwe.",
+'exportlistauthors' => 'Weka orodha nzima wa wachangiaji kwa kila ukurasa',
'export-submit' => 'Peleka',
'export-addcattext' => 'Ongeza kurasa kutoka jamii:',
'export-addcat' => 'Ongeza',
@@ -2508,11 +2518,6 @@ Tafadhali jaribu tena.',
'pageinfo-watchers' => 'Idadi ya wanaofuatilia',
'pageinfo-edits' => 'Idadi ya haririo',
-# Patrol log
-'patrol-log-line' => 'imewekewa alama $1 ya $2 kufanyiwa doria $3',
-'patrol-log-auto' => '(kwa kujiendesha)',
-'patrol-log-diff' => 'pitio la $1',
-
# Image deletion
'deletedrevision' => 'Pitio la awali lililofutwa $1',
'filedeleteerror-short' => 'Hitilafu wakati wa kufuta faili: $1',
@@ -2533,11 +2538,11 @@ Ukilitekeleza faili, mashine yako huenda ikawa matatani.',
'file-info' => 'ukubwa wa faili: $1, aina ya MIME: $2',
'file-info-size' => 'piseli $1 × $2, saizi ya faili: $3, aina ya MIME: $4',
'file-info-size-pages' => 'Piseli $1 × $2, ukubwa wa faili: $3, aina ya MIME: $4, {{PLURAL:$5|ukurasa|kurasa}} $5',
-'file-nohires' => '<small>Hakuna saizi kubwa zaidi.</small>',
+'file-nohires' => 'Hakuna saizi kubwa zaidi.',
'svg-long-desc' => 'faili la SVG, husemwa kuwa piseli $1 × $2, saizi ya faili: $3',
'show-big-image' => 'Ukubwa wa awali',
-'show-big-image-preview' => '<small>Ukubwa wa hakikisho: $1.</small>',
-'show-big-image-other' => '<small>Ukubwa zingine: $1.</small>',
+'show-big-image-preview' => 'Ukubwa wa hakikisho: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Ukubwa mwingine|Ukubwa zingine}}: $1.',
'show-big-image-size' => 'piseli $1 × $2',
'file-info-png-repeat' => 'inachezwa {{PLURAL:$1|mara}} $1',
@@ -2553,6 +2558,13 @@ Ukilitekeleza faili, mashine yako huenda ikawa matatani.',
'bydate' => 'kwa tarehe',
'sp-newimages-showfrom' => 'Onyesha mafaili mapya kuanzia saa $2, tarehe $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => 'sekunde {{PLURAL:$1|$1}}',
+'minutes' => 'dakika {{PLURAL:$1|$1}}',
+'hours' => '{{PLURAL:$1|saa $1|masaa $1}}',
+'days' => 'siku {{PLURAL:$1|$1}}',
+'ago' => '$1 zilizopita',
+
# Bad image list
'bad_image_list' => 'Fomati ni hii:
@@ -2828,9 +2840,6 @@ Ishara hizi za uthibitisho zitaishia mnamo $4.',
'scarytranscludefailed' => '[Kuleta kigezo imeshindikana kwa ajili ya $1]',
'scarytranscludetoolong' => '[URL ni ndefu mno]',
-# Trackbacks
-'trackbackremove' => '([$1 Futa])',
-
# Delete conflict
'deletedwhileediting' => "'''Ilani''': Ukurasa huu ulifutwa ulipokwisha kuanza huuhariri!",
'confirmrecreate' => "Mtumiaji [[User:$1|$1]] ([[User talk:$1|majadiliano]]) aliufuta ukurasa huu wakati umeshaanza kuuhariri, akaandika sababu hii ya kufuta:
@@ -2912,6 +2921,9 @@ Pia unaweza [[Special:EditWatchlist|kutumia kihariri cha kawaida]].',
'watchlisttools-edit' => 'Tazama na hariri maangalizi',
'watchlisttools-raw' => 'Hariri maangalizi ghafi',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|majadiliano]])',
+
# Core parser functions
'duplicate-defaultsort' => '!\'\'\'Ilani:\'\'\' Neno msingi la kupanga "$2" linafunika neno msingi la kupanga la awali "$1".',
@@ -2953,7 +2965,7 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
# Special:SpecialPages
'specialpages' => 'Kurasa maalum',
'specialpages-note' => '----
-* Kurasa maalum ya kawaida.
+* Kurasa maalum za kawaida.
* <span class="mw-specialpagerestricted">Kurasa maalum zisizoonekana na wote.</span>
* <span class="mw-specialpagecached">Kurasa maalum zinazotoka "cache" (might be obsolete).</span>',
'specialpages-group-maintenance' => 'Ripoti za kurekebisha na kutunza kurasa',
@@ -2991,13 +3003,16 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
'tags-hitcount' => '{{PLURAL:$1|badiliko|mabadiliko}} $1',
# Special:ComparePages
-'comparepages' => 'Linganisha kurasa',
-'compare-selector' => 'Kulinganisha mapitio',
-'compare-page1' => 'Ukurasa wa kwanza',
-'compare-page2' => 'Ukurasa wa pili',
-'compare-rev1' => 'Pitio la kwanza',
-'compare-rev2' => 'Pitio la pili',
-'compare-submit' => 'Linganisha',
+'comparepages' => 'Linganisha kurasa',
+'compare-selector' => 'Kulinganisha mapitio',
+'compare-page1' => 'Ukurasa wa kwanza',
+'compare-page2' => 'Ukurasa wa pili',
+'compare-rev1' => 'Pitio la kwanza',
+'compare-rev2' => 'Pitio la pili',
+'compare-submit' => 'Linganisha',
+'compare-invalid-title' => 'Jina la ukurasa uliloliandika ni batili.',
+'compare-title-not-exists' => 'Jina la ukurasa ulilotaja halipatikani.',
+'compare-revision-not-exists' => 'Pitio ulilotaja halipatikani.',
# Database error messages
'dberr-header' => 'Wiki imekuta tatizo',
@@ -3021,4 +3036,43 @@ Tovuti hii inapata matatatizo wakati huu.',
'htmlform-reset' => 'Tengua mabadiliko',
'htmlform-selectorother-other' => 'Nyingine',
+# New logging system
+'logentry-delete-delete' => '$1 alifuta ukurasa wa $3',
+'logentry-delete-restore' => '$1 alirudisha ukurasa wa $3',
+'logentry-delete-event' => '$1 alibadilisha hali ya kuonekana wazi ya {{PLURAL:$5|kumbukumbu $5}} katika $3: $4',
+'logentry-delete-revision' => '$1 alibadilisha hali ya kuonekana wazi ya {{PLURAL:$5|pitio 1|mapitio $5}} kwenye ukurasa wa $3: $4',
+'logentry-delete-event-legacy' => '$1 alibadilisha hali ya kuonekana wazi ya kumbukumbu za $3',
+'logentry-delete-revision-legacy' => '$1 alibadilisha hali ya kuonekana wazi ya mapitio ya ukurasa $3',
+'logentry-suppress-delete' => '$1 alificha ukurasa wa $3',
+'logentry-suppress-event' => '$1 alibadilisha kwa siri hali ya kuonekana wazi {{PLURAL:$5|kumbukumbu $5}} katika $3: $4',
+'logentry-suppress-revision' => '$1 alibadilisha kwa siri hali ya kuonekana wazi {{PLURAL:$5|kumbukumbu $5 ya|kumbukumbu $5 za}} ukurasa wa $3: $4',
+'logentry-suppress-event-legacy' => '$1 alibadilisha kwa siri hali ya kuonekana wazi ya kumbukumbu za $3',
+'logentry-suppress-revision-legacy' => '$1 alibadilisha kwa siri hali ya kuonekana wazi mapitio ya ukurasa $3',
+'revdelete-restricted' => 'aliwazuia pia wakabidhi wasiyaone maelezo',
+'revdelete-unrestricted' => 'aliwarudishia wakabidhi uwezo wa kuona maelezo',
+'logentry-move-move' => '$1 alihamisha ukurasa wa $3 hadi $4',
+'logentry-newusers-newusers' => '$1 alianzisha akaunti ya mtumiaji',
+'logentry-newusers-create' => '$1 alianzisha akaunti ya mtumiaji',
+'logentry-newusers-create2' => '$1 alianzisha akaunti ya mtumiaji $3',
+'logentry-newusers-autocreate' => 'Akaunti ya mtumiaji $1 ilianzishwa na mashine',
+'newuserlog-byemail' => 'neno la siri limetumwa kwa barua pepe',
+
+# Feedback
+'feedback-subject' => 'Mada:',
+'feedback-message' => 'Ujumbe:',
+'feedback-cancel' => 'Batilisha',
+'feedback-submit' => 'Tuma maoni yako',
+'feedback-adding' => 'Maoni yako yanaongezwa katika ukurasa...',
+'feedback-error1' => 'Hitilafu: Matokeo ya API hayafahamiki',
+'feedback-error2' => 'Hitilafu: Hiririo halikufaulu',
+'feedback-error3' => 'Hitilafu: API ya wiki haiitiki',
+'feedback-thanks' => 'Ahsante! Maoni yako yamewekwa kwenye ukurasa wa "[$2 $1]".',
+'feedback-close' => 'Tayari',
+
+# API errors
+'api-error-unclassified' => 'Ilitokea hitilafu isiyojulikana.',
+'api-error-unknown-code' => 'Hitilafu isiyojulikana: "$1".',
+'api-error-unknown-warning' => 'Ilani isiyojulikana: "$1".',
+'api-error-unknownerror' => 'Hitilafu isiyojulikana: "$1".',
+
);
diff --git a/languages/messages/MessagesSzl.php b/languages/messages/MessagesSzl.php
index 093a4b22..e59f7c47 100644
--- a/languages/messages/MessagesSzl.php
+++ b/languages/messages/MessagesSzl.php
@@ -376,14 +376,13 @@ Eli tak ńy je, możno śe trefił feler we softwaru MediaWiki. Kej ja, pedz uo
'cannotdelete' => 'Ńy idźe wyćepać podanyj zajty abo grafiki $1.',
'badtitle' => 'Felerno tytůua',
'badtitletext' => 'Podano felerny titel zajty. Prawdopodańy sům w ńim znoki, kerych ńy wolno užywać we titlach abo je pusty.',
-'perfcached' => 'To co sam je naÅ¡kryflane, to ino kopja s pamjyńći podrynÄnyj a može Å„y być aktualne.',
-'perfcachedts' => 'To co sam je naÅ¡kryflane, to ino kopja s pamjyńći podrynÄnyj a bůuo uaktualńůne $1.',
+'perfcached' => 'To co sam je naÅ¡kryflane, to ino kopja s pamjyńći podrynÄnyj a može Å„y być aktualne. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'To co sam je naÅ¡kryflane, to ino kopja s pamjyńći podrynÄnyj a bůuo uaktualńůne $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Uaktualńyńo lo tyj zajty sům terozki zawarte. Dane, kere sam sům, ńy zostouy uodśwjyžůne.',
'wrong_wfQuery_params' => 'Felerne parametry překozane do wfQuery()<br />
Funkcyjo: $1<br />
Zapytańy: $2',
'viewsource' => 'Zdrzůdłowy tekst',
-'viewsourcefor' => 'lo $1',
'actionthrottled' => 'Akcyjo wstřimano',
'actionthrottledtext' => 'MechaÅ„izm uobrůny pÅ™ed spamym uograÅ„iÄo liÄba wykonaÅ„ tyj Äynnośći we jednostce Äasu. PrůbowoužeÅ› go uocygaÅ„ić. ProÅ¡a, sprůbuj na nowo za pora minut.',
'protectedpagetext' => 'Ta zajta je zawarto před sprowjańym.',
@@ -482,6 +481,7 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
'noemailprefs' => 'Muśiš podać adres e-brifa, coby te funkcyje dźouauy.',
'emailconfirmlink' => 'Potwjerdź swůj adres e-brifa',
'invalidemailaddress' => 'E-brif Å„y bydźe zaakceptůwany skiž tygo co jego format Å„y speuÅ„o formalnych wymagaÅ„. ProÅ¡a naÅ¡kryflać poprowny adres e-brifa abo wyÄyśćić pole.',
+'cannotchangeemail' => 'Ńy możno pomjyńyc ausdruku e-mail.',
'accountcreated' => 'Utwůřůno kůnto',
'accountcreatedtext' => 'Kůnto lo $1 zostouo utwůřůne.',
'createaccount-title' => 'Stwořyńy kůnta na {{GRAMMAR:MS.lp|{{SITENAME}}}}',
@@ -494,6 +494,7 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
# E-mail sending
'php-mail-error-unknown' => 'Ńyznany feler we funkcyji mail()',
+'user-mail-no-addy' => 'Próba wysÅ‚ania eâ€maila bez adresu odbiorcy',
# Change password dialog
'resetpass' => 'Zmjyń hasło',
@@ -513,16 +514,18 @@ Możliwe co właśńy zmjyńiłżeś swoje hasło abo poprosiłżeś uo nowe tym
'resetpass-temp-password' => 'Tymczasowe hasło:',
# 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-email' => 'E-brif:',
-'passwordreset-emailtitle' => 'Kůnto na {{GRAMMAR:MS.lp|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Ftůś (cheba Ty, s IP $1)
+'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?',
+'passwordreset-capture-help' => 'Eli zaznaczysz to pole, łoboczysz wjadomość e-mail z hasłem.',
+'passwordreset-email' => 'E-brif:',
+'passwordreset-emailtitle' => 'Kůnto na {{GRAMMAR:MS.lp|{{SITENAME}}}}',
+'passwordreset-emailtext-ip' => 'Ftůś (cheba Ty, s IP $1)
pado, aże chce informacyji lo konta do {{GRAMMAR:MS.lp{{SITENAME}}}} ($4).
Z tem ausdrukiem sum powjonzyne konta:
$2
@@ -532,9 +535,22 @@ $2
Jak chćołżeś gynał to zrobjyć, to zalůgůj śe terozki a podej swoje hasło.
Jak ktůś inkszy chćoł nowe hasło abo jak Ci śe przipůmńouo stare a ńy chcesz nowygo, to zignoruj to a używej starygo hasła.',
-'passwordreset-emailelement' => 'Nazwa sprowjorza: $1
+'passwordreset-emailelement' => 'Nazwa sprowjorza: $1
Tymczasowe hasło: $2',
-'passwordreset-emailsent' => 'E-brif posłany.',
+'passwordreset-emailsent' => 'E-brif posłany.',
+'passwordreset-emailsent-capture' => 'E-brif posłony, kerego widać niżej.',
+'passwordreset-emailerror-capture' => 'Ńy udało sie wysłać wjadomości lo sprowjorza: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Pomjyno ausdruka e-mail',
+'changeemail-header' => 'Pomjyno ausduku e-mail',
+'changeemail-text' => 'Wypełnij formularz, podej nowy ausdruk a hasło.',
+'changeemail-no-info' => 'Muśysz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.',
+'changeemail-oldemail' => 'Åobecny ausdruk:',
+'changeemail-newemail' => 'Nowy adresu e-brif',
+'changeemail-none' => 'podstawowo',
+'changeemail-submit' => 'Zapisz nowy',
+'changeemail-cancel' => 'Uodćepej',
# Edit page toolbar
'bold_sample' => 'Ruby tekst',
@@ -597,9 +613,6 @@ Pozůr: Kejžeś we [[Special:Preferences|preferencyjach]] ńy naštalowou prowi
Twůj adres IP je terozki $3. Idyntyfikator Twojij blokady to $5. Zanotuj śe go a podej admińistratorowi.',
'blockednoreason' => 'Å„y podano skuli Äego',
-'blockedoriginalsource' => "Zdřůduo '''$1''' zostouo pokozane půnižyj:",
-'blockededitsource' => "Tekst '''Twojich sprowjyń''' na '''$1''' zostou pokozany půnižyj:",
-'whitelistedittitle' => 'ZaÄym zaÄÅ„yÅ¡ sprowjać, muÅ›iÅ¡ być zalůgowany.',
'whitelistedittext' => 'Muśiš $1 coby můc sprowjać artikle.',
'confirmedittext' => 'Muśiš podać a potwjerdźić swůj e-brif, coby můc sam sprowjać.
Možeš to zrobić we [[Special:Preferences|swojich štalowańach]].',
@@ -789,8 +802,6 @@ Inkśi admińistratorzi {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
'revdelete-unsuppress' => 'Usůń uograÅ„iÄyÅ„o lo wćepanej nazod historyje pomjyÅ„aÅ„',
'revdelete-log' => 'ÄŒymu:',
'revdelete-submit' => 'Zaakceptuj do wybrany{{PLURAL:$1|j wersyji|ch wersyji}}',
-'revdelete-logentry' => 'půmjyńůno widoÄność wersyji w [[$1]]',
-'logdelete-logentry' => 'půmjyńůno widoÄność zdoÅ™yńůw w [[$1]]',
'revdelete-success' => 'Půmyślńy zmjyńůno widoczność wersyji.',
'revdelete-failure' => 'Feler przi zmjyńůńu widoczności wersyji.
$1',
@@ -802,15 +813,6 @@ $1',
'revdel-restore-visible' => 'widoczne wersyje',
'pagehist' => 'Historyjo sprowjyń zajty',
'deletedhist' => 'Wyćepano historyjo sprowjyń',
-'revdelete-content' => 'zawartość',
-'revdelete-summary' => 'uopis pomjyńań',
-'revdelete-uname' => 'mjano užytkowńika',
-'revdelete-restricted' => 'naÅ¡taluj uograniÄyÅ„o do administratorůw',
-'revdelete-unrestricted' => 'wycofej uograniÄyÅ„o do administratorůw',
-'revdelete-hid' => 'schrůń $1',
-'revdelete-unhid' => 'ńy schrůńaj $1',
-'revdelete-log-message' => '$1 - $2 {{PLURAL:$2|wersyjo|wersyji|wersjůw}}',
-'logdelete-log-message' => '$1 - $2 {{PLURAL:$2|zdařyńe|zdařyńa|zdařyń}}',
'revdelete-hide-current' => 'Feler przi wyćepywańu wersyji $2, $1.',
'revdelete-show-no-access' => 'Feler przy ukozoniu wersyji $2, $1. Ńy mosz uprawńyń lo njygo.',
'revdelete-modify-no-access' => 'Feler przy zmjyńe widoczności wersyji $2, $1. Ńy mosz uprawńeń lo njygo.',
@@ -958,7 +960,7 @@ $1',
'prefs-rc' => 'Ńydowno pomjyńane',
'prefs-watchlist' => 'Pozůrlista',
'prefs-watchlist-days' => 'LiÄba dÅ„i widoÄnych na liśće artikli, na kere dowoÅ¡ pozůr:',
-'prefs-watchlist-days-max' => 'Maksimum 7 dńi',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'LiÄba půmjyÅ„aÅ„ pokazywanych we rozÅ¡yřůnyj liśće artiklůw, na kere dowoÅ¡ pozůr:',
'prefs-watchlist-edits-max' => 'Maksymalno liczba: 1000',
'prefs-watchlist-token' => 'ID půzorlisty:',
@@ -1117,7 +1119,6 @@ $1',
'right-autopatrol' => 'NaÅ¡taluj na autůmatyÄne uoznaÄaÅ„y sprowjyÅ„ kej pÅ™ezdÅ™ane',
'right-patrolmarks' => 'Podglůnd znaÄnikůw patrolowaÅ„o pomjeÅ„anych na uostatku – uoznaÄaÅ„o kej „sprawdzůneâ€',
'right-unwatchedpages' => 'Pokož lista zajtůw na kere žodyn ńy dowo pozoru',
-'right-trackback' => 'Přeślij trackback',
'right-mergehistory' => 'PouůnÄ historyjo sprowjyÅ„ do zajtůw',
'right-userrights' => 'Sprowjej wšyjske uprawńyńo užytkowńikůw',
'right-userrights-interwiki' => 'Sprowjej uprawńyńo užytkowńikůw na zajtach inkšych Wiki',
@@ -1158,7 +1159,6 @@ $1',
'action-patrol' => 'oznaÄyÅ„o sprowjyÅ„o kej „sprowdzůneâ€',
'action-autopatrol' => 'uoznaÄyÅ„o wuasnygo sprowjyÅ„o kej „sprawdzonygoâ€',
'action-unwatchedpages' => 'podglůndu listy zajtůw na kere ńikt ńy dowo pozoru',
-'action-trackback' => 'wysyuańo trackbacka',
'action-mergehistory' => 'skuplowańo historyje sprowjyń tyj zajty',
'action-userrights' => 'sprowjańo uprowńyń wšyjstkich sprowjořy',
'action-userrights-interwiki' => 'sprowjańo uprowńyń sprowjořy na inkšych witrynach wiki',
@@ -1482,7 +1482,7 @@ Zajta uznawano je za ujydnoznaÄÅ„ajůnco kej zawiyro Å¡ablůn uokreÅ›lůny we [
'listusers' => 'Lista užytkowńikůw',
'listusers-editsonly' => 'Pokoż yno użytkowńikůw kere majům sprowjyńa',
'usereditcount' => '$1 {{PLURAL:$1|sprowjyńe|sprowjyńa|sprowjyń}}',
-'usercreated' => 'Utworzono $1 uo $2',
+'usercreated' => '{{GENDER:$3:Utworzono}} $1 uo $2',
'newpages' => 'Nowe zajty',
'newpages-username' => 'Mjano užytkowńika:',
'ancientpages' => 'Nojstarše artikle',
@@ -1561,12 +1561,8 @@ Uobsůgiwane protokoły: <tt>$1</tt>',
'listusers-noresult' => 'Ńy znejdźůno žodnygo užytkowńika.',
# Special:Log/newusers
-'newuserlogpage' => 'Nowe użytkowniki',
-'newuserlogpagetext' => 'To je rejer uostatńo utworzůnych kůnt użytkowńikůw',
-'newuserlog-byemail' => 'hasło uostało wysłane e-brifym',
-'newuserlog-create-entry' => '– nowy użytkowńik',
-'newuserlog-create2-entry' => '– utworzůł kůnto $1',
-'newuserlog-autocreate-entry' => '– kůnto utworzůne automatyczńy',
+'newuserlogpage' => 'Nowe użytkowniki',
+'newuserlogpagetext' => 'To je rejer uostatńo utworzůnych kůnt użytkowńikůw',
# Special:ListGroupRights
'listgrouprights' => 'Uprawńyńo grup užytkowńikůw',
@@ -1685,8 +1681,6 @@ Pomoc:
'actioncomplete' => 'Fertig',
'actionfailed' => 'Ńy udało sie.',
'deletedtext' => 'Wyćepano "$1". Rejer uostatnio zrobiůnych wyćepań možeš uobejžyć tukej: $2.',
-'deletedarticle' => 'wyciepnjynto "[[$1]]"',
-'suppressedarticle' => 'utajńjyu [[$1]]',
'dellogpage' => 'Wyćepane',
'dellogpagetext' => 'To je lista uostatńo wykůnanych wyćepań.',
'deletionlog' => 'rejer wyćepań',
@@ -1811,7 +1805,6 @@ Možeš mjeć felerny link abo wersyjo můgua zostać wćepano nazod, abo wyćep
'undeletereset' => 'WyÄyść',
'undeleteinvert' => 'Zaznocz na uopy',
'undeletecomment' => 'Powůd wćepańo nazod:',
-'undeletedarticle' => 'wćepou nazod [[$1]]',
'undeletedrevisions' => 'Wćepano nazod {{PLURAL:$1|1 wersyja|$1 wersyje|$1 wersyji}}',
'undeletedrevisions-files' => 'Wćepano nazod $1 {{PLURAL:$1|wersyja|wersyje|wersyji}} i $2 {{PLURAL:$2|plik|pliki|plikůw}}',
'undeletedfiles' => 'wćepou nazod $1 {{PLURAL:$1|plik|pliki|plikůw}}',
@@ -2043,8 +2036,6 @@ Wybjer inkše mjano.',
'movepage-page-moved' => 'Zajta $1 uostoła przekludzůno ku $2.',
'movepage-page-unmoved' => 'Mjana zajty $1 ńy idźe půmjyńić na $2.',
'movepage-max-pages' => 'Przekludzůnych uostało $1 {{PLURAL:$1|zajta|zajty|zajtůw}}. Wjynkszyj liczby ńy idźe przekludźić automatyczńy.',
-'1movedto2' => '[[$1]] přećepano do [[$2]]',
-'1movedto2_redir' => 'zajta [[$1]] přećepnůu do [[$2]] nad překerowańem',
'movelogpage' => 'Přećepńynte',
'movelogpagetext' => 'Uoto lista zajtůw, kere uostatńo zostouy přećepane.',
'movereason' => 'ÄŒymu:',
@@ -2249,8 +2240,6 @@ Nojprawdopodobńij zostoło to spowodowane bez link do zewnyntrznyj zajty intern
# Patrol log
'patrol-log-page' => 'Dźynńik patrolowańo',
'patrol-log-header' => 'Půniżej je dźeńńik patrolowańo zajtůw.',
-'patrol-log-line' => 'oznaÄůu wersyja $1 artikla $2 kej sprawdzůno $3',
-'patrol-log-auto' => '(autůmatyÄÅ„y)',
'log-show-hide-patrol' => '$1 rejer sprawdzańo',
# Image deletion
@@ -2275,7 +2264,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|zajta|zajty|zajtůw}}',
'file-info' => 'rozmjor plika: $1, typ MIME: $2',
'file-info-size' => '$1 × $2 pikselůw, wjelgość plika: $3, zorta MIME: $4',
-'file-nohires' => '<small>Uobrozek we wjynkÅ¡ej rozdźelÄośći Å„y je dostympny.</small>',
+'file-nohires' => 'Wjynksze wymjyry ńy sům dostympne',
'svg-long-desc' => 'Plik SVG, nůminalńe $1 × $2 pixelůw, rozmior plika: $3',
'show-big-image' => 'Pełne wymjyry',
@@ -2631,13 +2620,6 @@ Kod zawarty w linku straći wažność $4.',
'scarytranscludefailed' => '[Ńy powjoduo śe pobrańy szablůna lů $1]',
'scarytranscludetoolong' => '[za dugo adresa URL]',
-# Trackbacks
-'trackbackbox' => 'Kůmůńikaty TrackBack do tygo artikla:<br />
-$1',
-'trackbackremove' => '([$1 Wyćep])',
-'trackbacklink' => 'TrackBack',
-'trackbackdeleteok' => 'TrackBack zostou wyćepany.',
-
# Delete conflict
'deletedwhileediting' => "'''Pozůr''': Ta zajta zostoła wyćepano po tym, jak żeś rozpoczůł jei sprowjańy!",
'confirmrecreate' => "UžytkowÅ„ik [[User:$1|$1]] ([[User talk:$1|godka]]) wyćepnůu tyn artikel po tym jak žeÅ› rozpoÄůu(eua) jygo sprowjaÅ„e, podajůnc kej powůd wyćepaÅ„o:
@@ -2785,4 +2767,9 @@ NaÅ¡kryflej sam mjano plika bez prefiksu „{{ns:file}}:â€.',
# Special:Tags
'tag-filter' => 'Filter [[Special:Tags|tagůw]]',
+# New logging system
+'revdelete-restricted' => 'naÅ¡taluj uograniÄyÅ„o do administratorůw',
+'revdelete-unrestricted' => 'wycofej uograniÄyÅ„o do administratorůw',
+'newuserlog-byemail' => 'hasło uostało wysłane e-brifym',
+
);
diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php
index edafec4f..8be2b0a4 100644
--- a/languages/messages/MessagesTa.php
+++ b/languages/messages/MessagesTa.php
@@ -57,23 +57,25 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#வழிமாறà¯à®±à¯', '#REDIRECT' ),
- 'img_right' => array( '1', 'வலதà¯', 'right' ),
- 'img_left' => array( '1', 'இடதà¯', 'left' ),
- 'img_none' => array( '1', 'ஒனà¯à®±à¯à®®à®¿à®²à¯à®²à¯ˆ', 'none' ),
- 'img_center' => array( '1', 'மையமà¯', 'center', 'centre' ),
- 'img_top' => array( '1', 'மேலà¯', 'top' ),
- 'img_middle' => array( '1', 'மதà¯à®¤à®¿à®¯à®¿à®²à¯', 'middle' ),
- 'img_bottom' => array( '1', 'கீழà¯', 'bottom' ),
- 'plural' => array( '0', 'பனà¯à®®à¯ˆ', 'PLURAL:' ),
- 'special' => array( '0', 'சிறபà¯à®ªà¯', 'special' ),
- 'pagesize' => array( '1', 'பகà¯à®•_அளவà¯', 'PAGESIZE' ),
- 'url_path' => array( '0', 'வழி', 'PATH' ),
- 'url_wiki' => array( '0', 'விகà¯à®•à®¿', 'WIKI' ),
+ 'redirect' => array( '0', '#வழிமாறà¯à®±à¯', '#REDIRECT' ),
+ 'img_right' => array( '1', 'வலதà¯', 'right' ),
+ 'img_left' => array( '1', 'இடதà¯', 'left' ),
+ 'img_none' => array( '1', 'ஒனà¯à®±à¯à®®à®¿à®²à¯à®²à¯ˆ', 'none' ),
+ 'img_center' => array( '1', 'மையமà¯', 'center', 'centre' ),
+ 'img_top' => array( '1', 'மேலà¯', 'top' ),
+ 'img_middle' => array( '1', 'மதà¯à®¤à®¿à®¯à®¿à®²à¯', 'middle' ),
+ 'img_bottom' => array( '1', 'கீழà¯', 'bottom' ),
+ 'plural' => array( '0', 'பனà¯à®®à¯ˆ', 'PLURAL:' ),
+ 'special' => array( '0', 'சிறபà¯à®ªà¯', 'special' ),
+ 'pagesize' => array( '1', 'பகà¯à®•_அளவà¯', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'வழி', 'PATH' ),
+ 'url_wiki' => array( '0', 'விகà¯à®•à®¿', 'WIKI' ),
);
$linkTrail = "/^([\xE0\xAE\x80-\xE0\xAF\xBF]+)(.*)$/sDu";
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'இணைபà¯à®ªà¯à®•à®³à¯à®•à¯à®•à¯ அடிகà¯à®•à¯‹à®Ÿà®¿à®Ÿà¯',
@@ -431,20 +433,22 @@ MySQL returned error "$3: $4".',
'formerror' => 'தவறà¯: படிவதà¯à®¤à¯ˆ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ',
'badarticleerror' => 'இசà¯à®šà¯†à®¯à®±à¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®²à¯ செயறà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'cannotdelete' => '"$1" பகà¯à®•à®¤à¯à®¤à¯ˆà®¯à¯‹ கோபà¯à®ªà¯ˆà®¯à¯‹ நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. (வேற௠யாராலோ à®à®±à¯à®•à¯†à®©à®µà¯‡ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯.)',
+'cannotdelete-title' => 'பகà¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯ " $1 "',
'badtitle' => 'பழà¯à®¤à¯à®³à¯à®³ தலைபà¯à®ªà¯',
'badtitletext' => 'கோரபà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ தலைபà¯à®ªà¯ செலà¯à®²à®¾à®¤à¯, வெறà¯à®®à¯ˆ, அலà¯à®²à®¤à¯ பிழையாக இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ மொழிகளிடை அலà¯à®²à®¤à¯ விகà¯à®•à®¿à®¯à®¿à®Ÿà¯ˆà®¤à¯ தலைபà¯à®ªà®¾à®•à¯à®®à¯.',
-'perfcached' => 'பினà¯à®µà®°à¯à®®à¯ தரவà¯à®•à®³à¯ இடைமாறà¯à®±à¯ˆà®•à¯ கொணà¯à®Ÿà¯à®³à¯à®³à®© தரவà¯à®•à®³à¯ நிகழà¯à®¨à®¿à®²à¯ˆà®¯à®¿à®²à®¿à®²à¯à®²à®¾à®®à®²à¯ இரà¯à®•à¯à®•à®²à®¾à®®à¯.',
-'perfcachedts' => 'பினà¯à®µà®°à¯à®®à¯ தரவà¯à®•à®³à¯ இடைமாறà¯à®±à¯ˆà®•à¯ கொணà¯à®Ÿà¯à®³à¯à®³à®©, தரவà¯à®•à®³à¯ கடைசியாக $1 இல௠இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®©.',
+'perfcached' => 'பினà¯à®µà®°à¯à®®à¯ தரவà¯à®•à®³à¯ இடைகà¯à®•à®¿à®Ÿà®™à¯à®•à®¿à®²à¯ உளà¯à®³à®©, தரவà¯à®•à®³à¯ பà¯à®¤à¯à®ªà¯à®ªà®¿à®¤à¯à®¤à®¨à®¿à®²à¯ˆà®¯à®¿à®²à¯ இலà¯à®²à®¾à®®à®²à¯ இரà¯à®•à¯à®•à®²à®¾à®®à¯. அதிக அளவாக {{PLURAL:$1|ஒர௠மà¯à®Ÿà®¿à®µà¯|$1 à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯}} இடைகà¯à®•à®¿à®Ÿà®™à¯à®•à®¿à®²à¯ இரà¯à®•à¯à®•à®²à®¾à®®à¯.',
+'perfcachedts' => 'பினà¯à®µà®°à¯à®®à¯ தரவà¯à®•à®³à¯ இடைமாறà¯à®±à¯ˆà®•à¯ கொணà¯à®Ÿà¯à®³à¯à®³à®©, தரவà¯à®•à®³à¯ கடைசியாக $1 இல௠பà¯à®¤à¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©.அதிகபடà¯à®šà®®à®¾à®• {{PLURAL:$4|ஒர௠மà¯à®Ÿà®¿à®µà¯|$4 à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯}} இடைமாறà¯à®±à®¿à®²à¯ இரà¯à®•à¯à®•à®²à®¾à®®à¯.',
'querypage-no-updates' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯à®•à®³à¯ செயலிழகà¯à®•à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©. இஙà¯à®•à¯‡ உளà¯à®³à®¤à¯ தரவà¯à®•à®³à¯ தறà¯à®šà®®à®¯à®®à¯ இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®®à®¾à®Ÿà¯à®Ÿà®¾à®¤à¯.',
'wrong_wfQuery_params' => 'பிழையான அளபà¯à®°à¯à®•à¯à®•à®³à¯ wfQuery()<br />
செயலà¯: $1<br />
வினவலà¯: $2',
'viewsource' => 'மூலதà¯à®¤à¯ˆà®ªà¯ பாரà¯',
-'viewsourcefor' => '$1 பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®©',
+'viewsource-title' => 'மூலம௠காணà¯$1',
'actionthrottled' => 'செயறà¯à®ªà®¾à®Ÿà¯ கடà¯à®Ÿà¯à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'actionthrottledtext' => 'எரிதக௠காபà¯à®ªà¯ நடவடிகà¯à®•à¯ˆà®¯à®¾à®•à®ªà¯ பயனொரà¯à®µà®°à¯ கà¯à®±à®¿à®¤à¯à®¤ சிற௠கால இடைவெளியில௠இசà¯à®šà¯†à®¯à®±à¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ அதிகளவில௠செயà¯à®µà®¤à¯ தடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. நீர௠அவà¯à®µà¯†à®²à¯à®²à¯ˆà®¯à¯ˆà®¤à¯ தாணà¯à®Ÿà®¿à®µà®¿à®Ÿà¯à®Ÿà¯€à®°à¯. à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ சில நிமிடஙà¯à®•à®³à®¿à®²à¯ à®®à¯à®¯à®²à®µà¯à®®à¯.',
'protectedpagetext' => 'இபà¯à®ªà®•à¯à®•à®®à¯ தொகà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆ தவிரà¯à®ªà¯à®ªà®¤à®±à¯à®•à®¾à®• பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'viewsourcetext' => 'நீஙà¯à®•à®³à¯ இதன௠மூலதà¯à®¤à¯ˆ பாரà¯à®•à¯à®•à®µà¯à®®à¯ அதனை நகலெடà¯à®•à¯à®•à®µà¯à®®à¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯:',
+'viewyourtext' => "நீஙà¯à®•à®³à¯ இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© ''' உஙà¯à®•à®³à¯ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯à®•à¯à®•à®¾à®© ''' மூலதà¯à®¤à¯ˆà®•à¯ காணவà¯à®®à¯ நகலெடà¯à®•à¯à®•à®µà¯à®®à¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.",
'protectedinterface' => 'இபà¯à®ªà®•à¯à®•à®®à¯ இமà¯à®®à¯†à®©à¯ பொரà¯à®³à¯à®•à¯à®•à®¾à®© பயனர௠இடைமà¯à®• உரைகளை வழஙà¯à®•à¯à®•à®¿à®±à®¤à¯, விசம தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ தவிரà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯à®•à®¾à®• இபà¯à®ªà®•à¯à®•à®®à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'editinginterface' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ:''' நீஙà¯à®•à®³à¯ இமà¯à®®à¯†à®©à¯ பொரà¯à®³à¯à®•à¯à®•à®¾à®© பயனர௠இடைமà¯à®• உரைகளை வழஙà¯à®•à¯à®®à¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆ தொகà¯à®•à¯à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯. இதில௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯ மாறà¯à®±à®™à¯à®•à®³à¯ à®à®©à¯ˆà®¯ பயனரà¯à®•à®³à®¤à¯ பயனர௠இடைமà¯à®•à®™à¯à®•à®³à®¿à®²à¯à®®à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®®à¯. மொழிபெயரà¯à®ªà¯à®ªà¯à®•à®³à¯à®•à¯à®•à¯, à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ மிடியாவிகà¯à®•à®¿ மொழிபெயரà¯à®ªà¯à®ªà¯à®¤à¯ திடà¯à®Ÿà®®à®¾à®© [//translatewiki.net/wiki/Main_Page?setlang=ta பீடà¯à®Ÿà®¾à®µà®¿à®•à¯à®•à®¿] திடà¯à®Ÿà®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯.",
'sqlhidden' => '(SQL கோரிகà¯à®•à¯ˆ மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯)',
@@ -537,6 +541,7 @@ MySQL returned error "$3: $4".',
'noemailprefs' => 'பினà¯à®µà®°à¯à®µà®©à®µà®±à¯à®±à¯ˆ இயஙà¯à®•à¯à®¨à®¿à®²à¯ˆà®•à¯à®•à¯ கொணà¯à®Ÿà¯à®µà®° மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯Šà®©à¯à®±à®•à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®µà¯à®®à¯.',
'emailconfirmlink' => 'உஙà¯à®•à®³à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯',
'invalidemailaddress' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ பிழையான கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ˆà®•à¯ கொணà¯à®Ÿà¯à®³à¯à®³à®ªà¯à®ªà®Ÿà®¿à®¯à®¾à®²à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ à®à®±à¯à®±à¯à®•à¯à®•à¯Šà®³à¯à®³ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. தயவà¯à®šà¯†à®¯à¯à®¤à¯ சரியான கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯à®Ÿà®©à¯ கூடிய மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ இடவà¯à®®à¯ அலà¯à®²à®¤à¯ அவà¯à®µà®¿à®Ÿà®¤à¯à®¤à¯ˆ வெறà¯à®±à®¾à®• விடவà¯à®®à¯.',
+'cannotchangeemail' => 'கணகà¯à®•à®¿à®©à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®•à®³à¯ˆ இநà¯à®¤ விகà¯à®•à®¿à®‡à®²à¯ மாறà¯à®± à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'accountcreated' => 'கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
'accountcreatedtext' => '$1 எனà¯à®± பெயரில௠பயனர௠கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
'createaccount-title' => '{{SITENAME}} தளதà¯à®¤à¯à®•à¯à®•à®¾à®© கணகà¯à®•à¯ தொடகà¯à®•à®®à¯',
@@ -553,6 +558,7 @@ MySQL returned error "$3: $4".',
# E-mail sending
'php-mail-error-unknown' => "PHP 's mail() செயலà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à¯ அறியபà¯à®ªà®Ÿà®¾à®¤ பிழை.",
+'user-mail-no-addy' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ இலà¯à®²à®¾à®®à®²à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ª à®®à¯à®¯à®±à¯à®šà®¿à®¤à¯à®¤à®¤à¯.',
# Change password dialog
'resetpass' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à®¿à®¯à®®à¯ˆ',
@@ -572,32 +578,47 @@ MySQL returned error "$3: $4".',
'resetpass-temp-password' => 'தறà¯à®•à®¾à®²à®¿à®• கடவà¯à®šà¯à®šà¯Šà®²à¯:',
# Special:PasswordReset
-'passwordreset' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ',
-'passwordreset-text' => ' உஙà¯à®•à®³à¯ கணகà¯à®•à¯ விவரஙà¯à®•à®³à¯ˆ மினà¯à®©à®žà¯à®šà®²à¯ நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ மூலமாக பெற இநà¯à®¤ படிவதà¯à®¤à¯ˆ பூரà¯à®¤à¯à®¤à®¿ செயà¯à®¯à®µà¯à®®à¯.',
-'passwordreset-legend' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ',
-'passwordreset-disabled' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயலிழகà¯à®• செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
-'passwordreset-pretext' => '{{PLURAL:$1|| தரவ௠பகà¯à®¤à®¿ ஒனà¯à®±à¯ˆ கீழே உளà¯à®³à®¿à®Ÿà¯}}',
-'passwordreset-username' => 'பயனர௠பெயரà¯:',
-'passwordreset-domain' => 'இணைய தள à®®à¯à®•à®µà®°à®¿:',
-'passwordreset-email' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿:',
-'passwordreset-emailtitle' => '{{SITENAME}} ல௠கணகà¯à®•à¯ விவரஙà¯à®•à®³à¯',
-'passwordreset-emailtext-ip' => 'யாராவத௠(அநேகமாக நீஙà¯à®•à®³à¯, IP à®®à¯à®•à®µà®°à®¿ $1 ல௠இரà¯à®¨à¯à®¤à¯ ), நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ கோரிய உஙà¯à®•à®³à¯ கணகà¯à®•à¯
+'passwordreset' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ',
+'passwordreset-text' => ' உஙà¯à®•à®³à¯ கணகà¯à®•à¯ விவரஙà¯à®•à®³à¯ˆ மினà¯à®©à®žà¯à®šà®²à¯ நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ மூலமாக பெற இநà¯à®¤ படிவதà¯à®¤à¯ˆ பூரà¯à®¤à¯à®¤à®¿ செயà¯à®¯à®µà¯à®®à¯.',
+'passwordreset-legend' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ',
+'passwordreset-disabled' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயலிழகà¯à®• செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'passwordreset-pretext' => '{{PLURAL:$1|| தரவ௠பகà¯à®¤à®¿ ஒனà¯à®±à¯ˆ கீழே உளà¯à®³à®¿à®Ÿà¯}}',
+'passwordreset-username' => 'பயனர௠பெயரà¯:',
+'passwordreset-domain' => 'இணைய தள à®®à¯à®•à®µà®°à®¿:',
+'passwordreset-capture' => 'விளைவ௠மினà¯à®©à®žà¯à®šà®²à¯ˆ காணà¯',
+'passwordreset-capture-help' => 'நீஙà¯à®•à®³à¯ இநà¯à®¤ பெடà¯à®Ÿà®¿à®¯à¯ˆ தெரிவ௠செயà¯à®¤à®¾à®²à¯ ,இநà¯à®¤ மினà¯à®©à®žà¯à®šà®²à¯ (தறà¯à®•à®¾à®²à®¿à®• கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯à®Ÿà®©à¯) உஙà¯à®•à®³à¯à®•à¯à®•à¯ தெரியà¯à®®à¯ . அதேபோல இத௠பயனரà¯à®•à¯à®•à¯à®®à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®®à¯.',
+'passwordreset-email' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿:',
+'passwordreset-emailtitle' => '{{SITENAME}} ல௠கணகà¯à®•à¯ விவரஙà¯à®•à®³à¯',
+'passwordreset-emailtext-ip' => 'யாராவத௠(அநேகமாக நீஙà¯à®•à®³à¯, IP à®®à¯à®•à®µà®°à®¿ $1 ல௠இரà¯à®¨à¯à®¤à¯ ), நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ கோரிய உஙà¯à®•à®³à¯ கணகà¯à®•à¯
விவரஙà¯à®•à®³à¯ நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ {{SITENAME}} ( $4 ).பினà¯à®µà®°à¯à®®à¯ பயனர௠{{PLURAL:$3|account is|accounts are}}
இநà¯à®¤ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯à®Ÿà®©à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
$2
{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உளà¯à®³ நாடà¯à®•à®³à¯ {{PLURAL:$5|one day|$5 days}}.
நீஙà¯à®•à®³à¯ பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ இபà¯à®ªà¯‹à®¤à¯‡ தேரà¯à®µà¯ செயà¯à®¤à¯ வேணà¯à®Ÿà¯à®®à¯, அலà¯à®²à®¤à¯ வேற௠யாராவத௠இநà¯à®¤ கோரிகà¯à®•à¯ˆà®¯à¯ˆ அனà¯à®ªà¯à®ªà®¿à®¯à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯‹
அலà¯à®²à®¤à¯ உஙà¯à®•à®³à¯ மூல கடவà¯à®šà¯à®šà¯Šà®²à¯ நினைவில௠இரà¯à®¨à¯à®¤à®¾à®²à¯‹ இதை மாறà¯à®± வேணà¯à®Ÿà®¿à®¯ அவசியம௠இலà¯à®²à¯ˆ,நீஙà¯à®•à®³à¯ இநà¯à®¤ தகவலை பà¯à®±à®•à¯à®•à®£à®¿à®¤à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯à®‰à®™à¯à®•à®³à¯ பழைய கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆà®¯à¯‡ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®•à¯à®•à¯Šà®³à¯à®³à®²à®¾à®®à¯.',
-'passwordreset-emailtext-user' => 'பயனர௠$1 {{SITENAME}} லிரà¯à®¨à¯à®¤à¯ நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ ஒனà¯à®±à¯ˆ கீழà¯à®µà®°à¯à®®à¯ உஙà¯à®•à®³à¯ கணகà¯à®•à¯ விவரஙà¯à®•à®³à¯ˆ {{SITENAME}}
+'passwordreset-emailtext-user' => 'பயனர௠$1 {{SITENAME}} லிரà¯à®¨à¯à®¤à¯ நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ ஒனà¯à®±à¯ˆ கீழà¯à®µà®°à¯à®®à¯ உஙà¯à®•à®³à¯ கணகà¯à®•à¯ விவரஙà¯à®•à®³à¯ˆ {{SITENAME}}
($4) கà¯à®•à¯ கோரியà¯à®³à¯à®³à®¾à®°à¯.பினà¯à®µà®°à¯à®®à¯ பயனர௠{{PLURAL:$3|account is|accounts are}}
இநà¯à®¤ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯à®Ÿà®©à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
$2
{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உளà¯à®³ நாடà¯à®•à®³à¯ {{PLURAL:$5|one day|$5 days}}.
நீஙà¯à®•à®³à¯ பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ இபà¯à®ªà¯‹à®¤à¯‡ தேரà¯à®µà¯ செயà¯à®¯ வேணà¯à®Ÿà¯à®®à¯, அலà¯à®²à®¤à¯ வேற௠யாராவத௠இநà¯à®¤ கோரிகà¯à®•à¯ˆà®¯à¯ˆ அனà¯à®ªà¯à®ªà®¿à®¯à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯‹
அலà¯à®²à®¤à¯ உஙà¯à®•à®³à¯ மூல கடவà¯à®šà¯à®šà¯Šà®²à¯ நினைவில௠இரà¯à®¨à¯à®¤à®¾à®²à¯‹ இதை மாறà¯à®± வேணà¯à®Ÿà®¿à®¯ அவசியம௠இலà¯à®²à¯ˆ,நீஙà¯à®•à®³à¯ இநà¯à®¤ தகவலை பà¯à®±à®•à¯à®•à®£à®¿à®¤à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯à®‰à®™à¯à®•à®³à¯ பழைய கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆà®¯à¯‡ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®•à¯à®•à¯Šà®³à¯à®³à®²à®¾à®®à¯.',
-'passwordreset-emailelement' => 'பயனர௠பெயரà¯: $1
+'passwordreset-emailelement' => 'பயனர௠பெயரà¯: $1
தறà¯à®•à®¾à®²à®¿à®•à®•à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯: $2',
-'passwordreset-emailsent' => 'நினைவூடà¯à®Ÿà¯à®®à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'passwordreset-emailsent' => 'நினைவூடà¯à®Ÿà¯à®®à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'passwordreset-emailsent-capture' => 'கீழே காணà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ போல௠நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'passwordreset-emailerror-capture' => 'நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ மினà¯à®©à®žà¯à®šà®²à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯,அத௠கீழே காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, ஆனால௠பயனீடà¯à®Ÿà®¾à®³à®°à¯à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà¯à®µà®¤à¯ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯:$1',
+
+# Special:ChangeEmail
+'changeemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ மாறà¯à®±à¯',
+'changeemail-header' => 'கணகà¯à®•à®¿à®©à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ மாறà¯à®±à¯',
+'changeemail-text' => 'இநà¯à®¤ படிவதà¯à®¤à¯ˆ உஙà¯à®•à®³à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ மாறà¯à®± பூரà¯à®¤à¯à®¤à®¿ செயà¯à®¯à®µà¯à®®à¯. நீஙà¯à®•à®³à¯ இநà¯à®¤ மாறà¯à®±à®¤à¯à®¤à¯ˆ உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¯ உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿ வேணà¯à®Ÿà®¿à®µà®°à¯à®®à¯.',
+'changeemail-no-info' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நேரடியாக அணà¯à®•à¯à®µà®¤à®±à¯à®•à¯ நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯‡à®£à¯à®Ÿà¯à®®à¯.',
+'changeemail-oldemail' => 'தறà¯à®ªà¯Šà®´à¯à®¤à¯à®³à¯à®³ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿:',
+'changeemail-newemail' => 'பà¯à®¤à®¿à®¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿:',
+'changeemail-none' => '(எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ)',
+'changeemail-submit' => 'மினà¯à®©à®žà¯à®šà®²à¯ˆ மாறà¯à®±à¯',
+'changeemail-cancel' => 'விடà¯à®Ÿà¯à®µà®¿à®Ÿà¯',
# Edit page toolbar
'bold_sample' => 'தடிதà¯à®¤ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯',
@@ -662,9 +683,6 @@ $1 பயனரையோ அலà¯à®²à®¤à¯ வேற௠[[{{MediaWiki:Grouppage
உஙà¯à®•à®³à®¤à¯ தறà¯à®ªà¯‹à®¤à¯ˆà®¯ à®.பி. à®®à¯à®•à®µà®°à®¿ $3 மறà¯à®±à¯à®®à¯ தடை எண௠#$5 எனà¯à®ªà®µà®±à¯à®±à¯ˆ கேளà¯à®µà®¿à®•à®³à¯ கேடà¯à®•à¯à®®à¯ போத௠கடà¯à®Ÿà®¾à®¯à®®à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®µà¯à®®à¯.',
'blockednoreason' => 'காரணம௠தரபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
-'blockedoriginalsource' => "'''$1''' பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ மூலம௠கீழே தரபà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:",
-'blockededitsource' => "'''$1''' பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© '''உஙà¯à®•à®³à¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯''' கீழே கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©:",
-'whitelistedittitle' => 'தொகà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà¯‡à®£à¯à®Ÿà¯à®®à¯.',
'whitelistedittext' => 'நீஙà¯à®•à®³à¯ பகà¯à®•à®™à¯à®•à®³à®¤à¯ தொகà¯à®•à¯à®• $1 செயà¯à®¯à®µà¯‡à®£à¯à®Ÿà¯à®®à¯.',
'confirmedittext' => 'நீஙà¯à®•à®³à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொகà¯à®•à¯à®• à®®à¯à®©à¯à®©à®°à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤ வேணà¯à®Ÿà¯à®®à¯. உஙà¯à®•à®³à¯ [[Special:Preferences|விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯]] பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ செலà¯à®²à¯à®ªà®Ÿà®¿à®¯à®¾à®© மினà¯à®©à®žà¯à®šà®²à¯ˆà®•à¯ கொடà¯à®¤à¯à®¤à¯ அதனை உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®™à¯à®•à®³à¯.',
'nosuchsectiontitle' => 'அபà¯à®ªà®Ÿà®¿à®¯à¯Šà®°à¯ பகà¯à®¤à®¿ கிடையாதà¯',
@@ -738,7 +756,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
'''பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®¯à¯à®³à¯à®³ ஆகà¯à®•à®™à¯à®•à®³à¯ˆ அனà¯à®®à®¤à®¿à®¯à®¿à®©à¯à®±à®¿ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®• வேணà¯à®Ÿà®¾à®®à¯!'''",
'copyrightwarning2' => "{{SITENAME}} தளதà¯à®¤à¯à®•à¯à®•à®¾à®© உமத௠பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ அனைதà¯à®¤à¯à®®à¯ வேற௠பயனரà¯à®•à®³à®¾à®²à¯ தொகà¯à®•à¯à®•à®ªà¯ படவோ, மாறà¯à®±à®™à¯à®•à®³à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà¯‹ அலà¯à®²à®¤à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà®µà¯‹ கூடà¯à®®à¯. உமத௠பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à®³à¯ கடà¯à®®à¯ˆà®¯à®¾à®•à®¤à¯ தொகà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆ நீர௠விரà¯à®®à¯à®ªà®¾à®µà®¿à®Ÿà®¿à®²à¯ இஙà¯à®•à¯‡ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¾à®¤à¯€à®°à¯.<br />
நீர௠இதை எழà¯à®¤à®¿à®¯à®¤à®¾à®•à®µà¯‹, அலà¯à®²à®¤à¯ வேற௠பொதà¯à®•à¯ களம௠அலà¯à®²à®¤à¯ அத௠போனà¯à®± விடà¯à®¤à®²à¯ˆà®¯à®³à®¿à®•à¯à®•à¯à®®à¯ மூலஙà¯à®•à®³à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பிரதி பணà¯à®£à®¿à®¯à®¿à®°à¯à®ªà¯à®ªà®¤à®¾à®•à®µà¯‹ உறà¯à®¤à®¿ கூறà¯à®•à®¿à®±à¯€à®°à¯.(மேலதிக தகவலà¯à®•à®³à¯à®•à¯à®•à¯ $1).'''பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®¯à¯à®³à¯à®³ ஆகà¯à®•à®™à¯à®•à®³à¯ˆ அனà¯à®®à®¤à®¿à®¯à®¿à®©à¯à®±à®¿ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®¾à®¤à¯€à®°à¯!'''",
-'longpageerror' => "'''தவறà¯: நீஙà¯à®•à®³à¯ இடà¯à®Ÿ உரை $1 கிலோபைடà¯à®Ÿà¯à®•à®³à¯ நீளமானதà¯, $2 கிலோபைடà¯à®Ÿà®¿à®²à¯à®®à¯ கூடிய அளவà¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ இஙà¯à®•à¯‡ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¿à®²à¯à®²à¯ˆ. உஙà¯à®•à®³à¯ உரையை சேமிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.'''",
+'longpageerror' => "'''தவறà¯: நீஙà¯à®•à®³à¯ இடà¯à®Ÿ உரை {{PLURAL:$1|ஒர௠கிலோபைடà¯|$1கிலோபைடà¯à®Ÿà¯à®•à®³à¯}} நீளமானதà¯,{{PLURAL:$2|ஒர௠கிலோபைடà¯|$2கிலோபைடà¯à®Ÿà¯à®•à®³à¯}} கூடிய அளவà¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ இஙà¯à®•à¯‡ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¿à®²à¯à®²à¯ˆ. உஙà¯à®•à®³à¯ உரையை சேமிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.'''",
'readonlywarning' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: பராமரிபà¯à®ªà¯à®•à¯à®•à®¾à®•à®¤à¯ தரவà¯à®µà®´à®™à¯à®•à®©à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, எனவே உஙà¯à®•à®³à¯ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இபà¯à®ªà¯Šà®´à¯à®¤à¯ சேமிகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. உஙà¯à®•à®³à¯ உரையை இனà¯à®©à¯Šà®°à¯ உரைக௠கோபà¯à®ªà®¿à®²à¯ வெடà¯à®Ÿà®¿ ஒடà¯à®Ÿà®¿ சேமிதà¯à®¤à¯à®µà¯ˆà®¤à¯à®¤à¯à®ªà¯ பினà¯à®ªà¯ உபயோகிகà¯à®•à®²à®¾à®®à¯.'''
இநà¯à®¤ தரவà¯à®µà®´à®™à¯à®•à®©à¯ˆ பூடà¯à®Ÿà®¿à®¯ நிரà¯à®µà®¾à®•à®¿ அதà¯à®•à¯à®±à®¿à®¤à¯à®¤à¯ அளிதà¯à®¤ விளகà¯à®•à®®à¯ பினà¯à®µà®°à¯à®®à®¾à®±à¯: $1",
@@ -914,8 +932,6 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
'revdelete-unsuppress' => 'மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ மீதான கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ˆ நீகà¯à®•à¯',
'revdelete-log' => 'காரணமà¯:',
'revdelete-submit' => 'தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ {{PLURAL:$1|திரà¯à®¤à¯à®¤à®®à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} மீத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯.',
-'revdelete-logentry' => '[[$1]] பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© திரà¯à®¤à¯à®¤ பாரà¯à®µà¯ˆà®¯à®¿à®¯à®²à¯à®®à¯ˆ மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'logdelete-logentry' => '[[$1]] பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© நிகழà¯à®µà¯ பாரà¯à®µà¯ˆà®¯à®¿à®¯à®²à¯à®®à¯ˆ மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'revdelete-success' => "'''திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ˆ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà¯à®®à¯ வசதியை வெறà¯à®±à®¿à®•à®°à®®à®¾à®• நிகழà¯à®¨à®¿à®²à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.'''",
'revdelete-failure' => "''' பரிசீலனை பாரà¯à®•à¯à®•à¯‚டிய நிலையை பà¯à®¤à¯à®ªà¯à®ªà®¿à®•à¯à®• இயலவிலà¯à®²à¯ˆ:'' '
$1",
@@ -927,15 +943,6 @@ $1",
'revdel-restore-visible' => 'வெளிபà¯à®ªà®Ÿà¯ˆà®¯à®¾à®•à®¤à¯à®¤à¯†à®°à®¿à®¯à¯à®®à¯ மாறà¯à®±à®™à¯à®•à®³à¯',
'pagehist' => 'பகà¯à®• வரலாறà¯',
'deletedhist' => 'நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ வரலாறà¯',
-'revdelete-content' => 'உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯à®¤à¯ˆ',
-'revdelete-summary' => 'தொகà¯à®ªà¯à®ªà¯ சà¯à®°à¯à®•à¯à®•à®¤à¯à®¤à¯ˆ',
-'revdelete-uname' => 'பயனர௠பெயரை',
-'revdelete-restricted' => 'நிரà¯à®µà®¾à®•à®¿à®•à®³à¯à®•à¯à®•à¯ கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ விதிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'revdelete-unrestricted' => 'நிரà¯à®µà®¾à®•à®¿à®•à®³à®¿à®©à¯ கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'revdelete-hid' => '$1 மறைகà¯à®•',
-'revdelete-unhid' => '$1 காடà¯à®Ÿà¯à®•',
-'revdelete-log-message' => '$2 {{PLURAL:$2|திரà¯à®¤à¯à®¤à®¤à¯à®¤à®¿à®±à¯à®•à¯|திரà¯à®¤à¯à®¤à®™à¯à®•à®³à®¿à®±à¯à®•à¯}} $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|நிகழà¯à®µà®¿à®±à¯à®•à¯|நிகழà¯à®µà¯à®•à®³à®¿à®±à¯à®•à¯}} $1',
'revdelete-hide-current' => '$2, $1: தேதியிடபà¯à®ªà®Ÿà¯à®Ÿ உரà¯à®ªà¯à®ªà®Ÿà®¿à®¯à¯ˆ மறைபà¯à®ªà®¤à®¿à®²à¯ பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.இத௠நடபà¯à®ªà¯ பரிசீலனை.
இதை மறைகà¯à®• இயலாதà¯.',
'revdelete-show-no-access' => '$2, $1: தேதியிடபà¯à®ªà®Ÿà¯à®Ÿ உரà¯à®ªà¯à®ªà®Ÿà®¿à®¯à¯ˆ காணà¯à®ªà®¿à®ªà¯à®ªà®¤à®¿à®²à¯ பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.இநà¯à®¤ உரà¯à®ªà¯à®ªà®Ÿà®¿ தடைசெயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®• கà¯à®±à®¿à®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®³à¯à®³à®¤à¯.
@@ -1087,12 +1094,14 @@ $1",
'prefs-rc' => 'அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯',
'prefs-watchlist' => 'கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯',
'prefs-watchlist-days' => 'கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ காடà¯à®Ÿà®µà¯‡à®£à¯à®Ÿà®¿à®¯ நாடà¯à®•à®³à¯:',
-'prefs-watchlist-days-max' => '(அதிகபடà¯à®šà®®à¯ 7 நாடà¯à®•à®³à¯)',
+'prefs-watchlist-days-max' => 'மிக அதிகமாக $1 {{PLURAL:$1|நாளà¯|நாடà¯à®•à®³à¯}}',
'prefs-watchlist-edits' => 'விரிவாகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ காடà¯à®Ÿà®µà¯‡à®£à¯à®Ÿà®¿à®¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ:',
'prefs-watchlist-edits-max' => '(அதிகபடà¯à®š எணà¯: 1000)',
'prefs-watchlist-token' => 'கவனிபà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®©à¯ அடையாளமà¯:',
'prefs-misc' => 'பலதரபà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ',
'prefs-resetpass' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à¯à®•',
+'prefs-changeemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ மாறà¯à®±à¯',
+'prefs-setemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ அமை',
'prefs-email' => 'மினà¯à®©à®žà¯à®šà®²à¯ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
'prefs-rendering' => 'தோறà¯à®±à®®à¯',
'saveprefs' => 'சேமி',
@@ -1149,6 +1158,7 @@ $1",
'yourrealname' => 'உணà¯à®®à¯ˆà®ªà¯ பெயரà¯:',
'yourlanguage' => 'மொழி:',
'yourvariant' => 'உளà¯à®³à®Ÿà®•à¯à®• மொழி மாறிலி:',
+'prefs-help-variant' => ' மாறிலி அலà¯à®²à®¤à¯ orthography ஠இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®©à¯ உளà¯à®³à®Ÿà®•à¯à®• பகà¯à®•à®™à¯à®•à®³à¯ˆ காணà¯à®ªà®¿à®•à¯à®• நீஙà¯à®•à®³à¯ தெரிவ௠செயà¯à®¤à¯à®³à¯à®³à¯€à®°à¯à®•à®³à¯.',
'yournick' => 'கையொபà¯à®ªà®®à¯:',
'badsig' => 'செலà¯à®²à¯à®ªà®Ÿà®¿à®¯à®±à¯à®± கையொபà¯à®ªà®®à¯ எசà¯.டி.எமà¯.எலà¯. நிரலைச௠சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯.',
'badsiglength' => 'தஙà¯à®•à®³à®¤à¯ கையெழà¯à®¤à¯à®¤à¯ மிக நீளமானதà¯.
@@ -1187,7 +1197,7 @@ $1",
'userrights-lookup-user' => 'பயனரà¯à®•à¯ கà¯à®´à¯à®•à¯à®•à®³à¯ˆà®ªà¯ பராமரி',
'userrights-user-editname' => 'பயனர௠பெயரொனà¯à®±à¯ˆ இடà¯à®•:',
'editusergroup' => 'பயனர௠கà¯à®´à¯à®•à¯à®•à®³à¯ˆ தொகà¯',
-'editinguser' => "'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) பயனரà¯à®•à¯à®•à®¾à®© அனà¯à®®à®¤à®¿à®•à®³à¯ˆ மாறà¯à®±à®²à¯",
+'editinguser' => "'''[[User:$1|$1]]''' $2 பயனரà¯à®•à¯à®•à®¾à®© அனà¯à®®à®¤à®¿à®•à®³à¯ˆ மாறà¯à®±à®²à¯",
'userrights-editusergroup' => 'பயனர௠கà¯à®´à¯à®•à¯à®•à®³à¯ˆ தொகà¯',
'saveusergroups' => 'பயனர௠கà¯à®´à¯à®•à¯à®•à®³à¯ˆ சேமி',
'userrights-groupsmember' => 'à®…à®™à¯à®•à®¤à¯à®¤à¯à®µà®®à¯:',
@@ -1287,6 +1297,7 @@ $1",
'right-siteadmin' => 'தரவà¯à®¤à¯à®¤à®³à®¤à¯à®¤à¯ˆ பூடà¯à®Ÿà®²à¯ திறதà¯à®¤à®²à¯',
'right-override-export-depth' => 'பகà¯à®•à®™à¯à®•à®³à¯ˆ à®à®±à¯à®±à¯à®®à®¤à®¿ செய௠அதà¯à®¤à¯à®Ÿà®©à¯ இணைதà¯à®¤ பகà¯à®•à®™à¯à®•à®³à¯ ஆழம௠5 வரை சேரà¯à®¤à¯à®¤à¯ à®à®±à¯à®±à¯à®®à®¤à®¿ செயà¯',
'right-sendemail' => 'மறà¯à®± பயனரà¯à®•à®³à¯à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà¯',
+'right-passwordreset' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆ மினà¯à®©à®žà¯à®šà®²à¯à®•à®³à¯ˆ காணà¯.',
# User rights log
'rightslog' => 'பயனர௠உரிமைகள௠பதிகை',
@@ -1320,6 +1331,7 @@ $1",
'action-suppressionlog' => 'இதà¯à®¤à®©à®¿à®ªà¯ பதிகையைக௠காணவà¯à®®à¯',
'action-block' => 'இபà¯à®ªà®¯à®©à®°à¯ˆ மேலà¯à®®à¯ தொகà¯à®•à¯à®• அனà¯à®®à®¤à®¿à®•à¯à®• வேணà¯à®Ÿà®¾à®®à¯',
'action-protect' => 'இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© பாதà¯à®•à®¾à®ªà¯à®ªà¯ நிலைகளை மாறà¯à®±à®µà¯à®®à¯',
+'action-rollback' => 'ஒர௠கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ பகà¯à®•à®¤à¯à®¤à¯ˆ திரà¯à®¤à¯à®¤à®¿à®¯ பயனரின௠திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ˆ பழைய நிலைமைகà¯à®•à¯ மாறà¯à®±à®µà¯à®®à¯.',
'action-import' => 'மறà¯à®±à¯Šà®°à¯ விகà¯à®•à®¿à®¯à®¿à®²à¯ இரà¯à®¨à¯à®¤à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®µà¯à®®à¯',
'action-importupload' => 'கோபà¯à®ªà¯ பதிவேறà¯à®±à®¤à¯à®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ இறகà¯à®•à®µà¯à®®à¯',
'action-patrol' => 'மறà¯à®±à®µà®°à¯à®•à®³à®¿à®©à¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ ரோநà¯à®¤à®¿à®Ÿà¯à®Ÿà®¤à®¾à®• கà¯à®±à®¿à®•à¯à®•à®µà¯à®®à¯',
@@ -1329,6 +1341,7 @@ $1",
'action-userrights' => 'எலà¯à®²à®¾à®ªà¯ பயனர௠உரிமைகளையà¯à®®à¯ தொகà¯à®•à¯à®•à®µà¯à®®à¯',
'action-userrights-interwiki' => 'à®à®©à¯ˆà®¯ விகà¯à®•à®¿ தளஙà¯à®•à®³à®¿à®©à¯ பயனர௠உரிமைகளை தொகà¯',
'action-siteadmin' => 'தரவà¯à®¤à®³à®¤à¯à®¤à¯ˆ பூடà¯à®Ÿà¯ அலà¯à®²à®¤à¯ பூடà¯à®Ÿà®¾à®¤à¯‡',
+'action-sendemail' => 'மினà¯à®©à®žà¯à®šà®²à¯à®•à®³à¯ அனà¯à®ªà¯à®ªà¯',
# Recent changes
'nchanges' => '{{PLURAL:$1|ஒர௠மாறà¯à®±à®®à¯|$1 மாறà¯à®±à®™à¯à®•à®³à¯}}',
@@ -1409,6 +1422,7 @@ $1",
'ignorewarnings' => 'எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆà®•à®³à¯ˆ பà¯à®±à®•à¯à®•à®£à®¿',
'minlength1' => 'கோபà¯à®ªà®¿à®©à¯ பெயர௠ஆகக௠கà¯à®±à¯ˆà®¨à¯à®¤à®¤à¯ ஒர௠எழà¯à®¤à¯à®¤à¯ˆà®¯à®¾à®µà®¤à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.',
'illegalfilename' => 'கோபà¯à®ªà®¿à®©à¯ பெயரில௠தலைபà¯à®ªà¯à®•à¯à®•à®³à®¿à®²à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®¤ எழà¯à®¤à¯à®¤à¯à®°à¯ "$1" காணபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯. கோபà¯à®ªà®¿à®±à¯à®•à¯ வேற௠பெயரொனà¯à®±à¯ˆ இடà¯à®Ÿà¯ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®²à¯à®•.',
+'filename-toolong' => 'கோபà¯à®ªà¯ பெயரà¯à®•à®³à¯ 240 பைடà¯à®•à®³à¯à®•à¯à®•à¯ மேல௠இரà¯à®•à¯à®•à®•à¯‚டாதà¯.',
'badfilename' => 'படிமப௠பெயர௠"$1" ஆக மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'filetype-mime-mismatch' => 'கோபà¯à®ªà¯ விரிவாகà¯à®•à®®à¯ ". $1 "நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ MIME வகை கோபà¯à®ªà¯à®Ÿà®©à¯ ஒபà¯à®ªà®µà®¿à®²à¯à®²à¯ˆ ( $2 ).',
'filetype-badmime' => '"$1" வகைப௠பலநோகà¯à®•à¯ இணைய அஞà¯à®šà®²à¯ நீடà¯à®šà®¿à®•à¯ கோபà¯à®ªà¯à®•à®³à¯ பதிவேறà¯à®± அனà¯à®®à®¤à®¿à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¿à®²à¯à®²à¯ˆ.',
@@ -1499,6 +1513,35 @@ $1',
'upload-unknown-size' => 'தெரியாத அளவà¯',
'upload-http-error' => 'ஒர௠HTTP பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:$1',
+# File backend
+'backend-fail-stream' => ' $1 கோபà¯à®ªà¯ˆ stream செயà¯à®¯ இயலவிலà¯à®²à¯ˆ .',
+'backend-fail-backup' => ' $1 கோபà¯à®ªà¯ˆ பினà¯à®šà¯‡à®®à®¿à®ªà¯à®ªà¯ (backup) செயà¯à®¯ இயலவிலà¯à®²à¯ˆ .',
+'backend-fail-notexists' => ' "$1" எனà¯à®©à¯à®®à¯ கோபà¯à®ªà¯ எதà¯à®µà¯à®®à¯ இலà¯à®²à¯ˆ',
+'backend-fail-hashes' => 'கோபà¯à®ªà®¿à®±à¯à®•à®¾à®© hashes ஠ஒபà¯à®ªà®¿à®Ÿà¯à®µà®¤à®±à¯à®•à®¾à®• பெற இயலவிலà¯à®²à¯ˆ.',
+'backend-fail-notsame' => 'ஒரே மாதிரியாக இலà¯à®²à®¾à®¤ கோபà¯à®ªà¯ $1 à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯.',
+'backend-fail-invalidpath' => '$1 இத௠செலà¯à®²à®¾à®¤ சேமிபà¯à®ªà¯ பாதை.',
+'backend-fail-delete' => '"$1" கோபà¯à®ªà¯ˆ நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'backend-fail-alreadyexists' => 'கோபà¯à®ªà¯ $1 à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯.',
+'backend-fail-store' => 'கோபà¯à®ªà¯ $1 à® $2 ல௠சேமிகà¯à®• இயலவிலà¯à®²à¯ˆ.',
+'backend-fail-copy' => '"$1" இலிரà¯à®¨à¯à®¤à¯ "$2" கà¯à®•à¯ கோபà¯à®ªà¯ˆ நகல௠எடà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'backend-fail-move' => '"$1" இலிரà¯à®¨à¯à®¤à¯ "$2" கà¯à®•à¯ கோபà¯à®ªà¯ˆ நகரà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'backend-fail-opentemp' => 'தறà¯à®•à®¾à®²à®¿à®• கோபà¯à®ªà¯ˆ திறகà¯à®• இயலவிலà¯à®²à¯ˆ.',
+'backend-fail-writetemp' => 'தறà¯à®•à®¾à®²à®¿à®• கோபà¯à®ªà®¿à®²à¯ எழà¯à®¤ இயலவிலà¯à®²à¯ˆ.',
+'backend-fail-closetemp' => 'தறà¯à®•à®¾à®²à®¿à®• கோபà¯à®ªà¯ˆ மூட à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'backend-fail-read' => '$1 கோபà¯à®ªà¯ˆ படிகà¯à®• இயலவிலà¯à®²à¯ˆ .',
+'backend-fail-create' => '$1 கோபà¯à®ªà¯ˆ உரà¯à®µà®¾à®•à¯à®• இயலவிலà¯à®²à¯ˆ .',
+
+# Lock manager
+'lockmanager-notlocked' => '" $1 " ஠பூடà¯à®Ÿà®¿à®¯à®¤à¯ˆ திறகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ;இத௠பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+'lockmanager-fail-closelock' => '"$1" கà¯à®•à¯ பூடà¯à®Ÿà®¿à®¯ கோபà¯à®ªà¯ˆ மூட இயலவிலà¯à®²à¯ˆ.',
+'lockmanager-fail-deletelock' => '" $1 " கà¯à®•à®¾à®© பூடà¯à®Ÿà¯ கோபà¯à®ªà¯ˆ நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ .',
+'lockmanager-fail-acquirelock' => ' " $1 " கà¯à®•à®¾à®© பூடà¯à®Ÿà¯ பெற à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'lockmanager-fail-openlock' => '" $1 " கà¯à®•à®¾à®© பூடà¯à®Ÿà¯ கோபà¯à®ªà¯ˆ திறகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'lockmanager-fail-releaselock' => ' " $1 " கà¯à®•à®¾à®© பூடà¯à®Ÿà¯ˆ வெளியிட à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'lockmanager-fail-db-bucket' => 'தொகà¯à®ªà¯à®ªà¯ (bucket) $1 ல௠போதà¯à®®à®¾à®© பூடà¯à®Ÿà¯ தரவà¯à®¤à®³à®™à¯à®•à®³à¯ˆ தொடரà¯à®ªà¯ கொளà¯à®³ இயலவிலà¯à®²à¯ˆ',
+'lockmanager-fail-db-release' => 'தரவà¯à®¤à®³à®®à¯ $1஠பூடà¯à®Ÿà®¿à®¯à®¤à¯ˆ வெளியிட à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ',
+'lockmanager-fail-svr-release' => 'சேவகன௠$1ல௠பூடà¯à®Ÿà®¿à®¯à®¤à¯ˆ வெளியிட à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ',
+
# ZipDirectoryReader
'zip-file-open-error' => 'இநà¯à®¤ கோபà¯à®ªà¯ˆ zip சரிபாரà¯à®•à¯à®• திறகà¯à®•à¯à®®à¯ போத௠பிழை எதிரà¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'zip-wrong-format' => 'கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ கோபà¯à®ªà¯ zip கோபà¯à®ªà¯ இலà¯à®²à¯ˆ.',
@@ -1515,6 +1558,7 @@ $1',
'uploadstash-badtoken' => 'அநà¯à®¤ செயலà¯à®•à¯à®•à®¾à®© நடவடிகà¯à®•à¯ˆ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯, à®’à®°à¯à®µà¯‡à®³à¯ˆ à®à®©à¯†à®©à¯à®±à®¾à®²à¯ உஙà¯à®•à®³à¯ திரà¯à®¤à¯à®¤ அறிமà¯à®•à®šà®¾à®©à¯à®±à¯à®•à®³à¯ காலாவதியாகிவிடà¯à®Ÿà®¤à¯. மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿ செயà¯.',
'uploadstash-errclear' => 'கோபà¯à®ªà¯à®•à®³à¯ˆ சரிசெயà¯à®¤à®²à¯ (Clearing) தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à¯ விடà¯à®Ÿà®¤à¯.',
'uploadstash-refresh' => 'கோபà¯à®ªà¯à®•à®³à¯ உளà¯à®³ படà¯à®Ÿà®¿à®¯à®²à¯ˆ பà¯à®¤à¯à®ªà¯à®ªà®¿',
+'invalid-chunk-offset' => 'செலà¯à®²à®¾à®¤ chunk offset',
# img_auth script messages
'img-auth-accessdenied' => 'அனà¯à®®à®¤à®¿ மறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
@@ -1620,23 +1664,24 @@ $1',
'filerevert-badversion' => 'கà¯à®±à®¿à®¤à¯à®¤ நேர à®®à¯à®¤à¯à®¤à®¿à®°à¯ˆà®¯à¯à®Ÿà®©à¯ கூடிய à®®à¯à®¨à¯à®¤à¯ˆà®¯ உளà¯à®³à®• திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
# File deletion
-'filedelete' => '$1 கோபà¯à®ªà¯ˆ நீகà¯à®•à¯',
-'filedelete-legend' => 'கோபà¯à®ªà¯ˆ நீகà¯à®•à¯',
-'filedelete-intro' => "தாஙà¯à®•à®³à¯, '''[[Media:$1|$1]]''' - இநà¯à®¤ கோபà¯à®ªà®¿à®©à¯ˆ அதன௠வரலாறà¯à®±à¯à®Ÿà®©à¯ நீகà¯à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯",
-'filedelete-intro-old' => "'''[[Media:$1|$1]]''' எனà¯à®±à®ªà¯ பெயரà¯à®³à¯à®³ ஊடகதà¯à®¤à®¿à®©à¯ [$4 $3, $2] இல௠உளà¯à®³à®ªà¯ படியான பதிபà¯à®ªà¯ˆ நீகà¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯.",
-'filedelete-comment' => 'காரணமà¯:',
-'filedelete-submit' => 'நீகà¯à®•à®µà¯à®®à¯',
-'filedelete-success' => "'''$1''' நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' கோபà¯à®ªà®¿à®©à¯ $3, $2 இல௠உளà¯à®³à®ªà®Ÿà®¿à®¯à®¾à®© பதிபà¯à®ªà¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.",
-'filedelete-nofile' => "'''$1''' காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.",
-'filedelete-nofile-old' => "கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பணà¯à®ªà¯à®•à®³à¯à®Ÿà®©à¯ '''$1''' பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© பரண௠திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.",
-'filedelete-otherreason' => 'வேற௠மேலதிக காரணமà¯:',
-'filedelete-reason-otherlist' => 'வேற௠காரணமà¯',
-'filedelete-reason-dropdown' => '*பொதà¯à®µà®¾à®© நீகà¯à®•à®²à¯ காரணஙà¯à®•à®³à¯
+'filedelete' => '$1 கோபà¯à®ªà¯ˆ நீகà¯à®•à¯',
+'filedelete-legend' => 'கோபà¯à®ªà¯ˆ நீகà¯à®•à¯',
+'filedelete-intro' => "தாஙà¯à®•à®³à¯, '''[[Media:$1|$1]]''' - இநà¯à®¤ கோபà¯à®ªà®¿à®©à¯ˆ அதன௠வரலாறà¯à®±à¯à®Ÿà®©à¯ நீகà¯à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯",
+'filedelete-intro-old' => "'''[[Media:$1|$1]]''' எனà¯à®±à®ªà¯ பெயரà¯à®³à¯à®³ ஊடகதà¯à®¤à®¿à®©à¯ [$4 $3, $2] இல௠உளà¯à®³à®ªà¯ படியான பதிபà¯à®ªà¯ˆ நீகà¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯.",
+'filedelete-comment' => 'காரணமà¯:',
+'filedelete-submit' => 'நீகà¯à®•à®µà¯à®®à¯',
+'filedelete-success' => "'''$1''' நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' கோபà¯à®ªà®¿à®©à¯ $3, $2 இல௠உளà¯à®³à®ªà®Ÿà®¿à®¯à®¾à®© பதிபà¯à®ªà¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.",
+'filedelete-nofile' => "'''$1''' காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.",
+'filedelete-nofile-old' => "கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பணà¯à®ªà¯à®•à®³à¯à®Ÿà®©à¯ '''$1''' பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© பரண௠திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.",
+'filedelete-otherreason' => 'வேற௠மேலதிக காரணமà¯:',
+'filedelete-reason-otherlist' => 'வேற௠காரணமà¯',
+'filedelete-reason-dropdown' => '*பொதà¯à®µà®¾à®© நீகà¯à®•à®²à¯ காரணஙà¯à®•à®³à¯
** காபà¯à®ªà¯à®°à®¿à®®à¯ˆ மீறபà¯à®ªà®Ÿà¯à®Ÿà®®à¯ˆ
** இனà¯à®©à¯Šà®°à¯ படிமம௠உளà¯à®³à®¤à¯',
-'filedelete-edit-reasonlist' => 'நீகà¯à®•à®²à¯ காரணஙà¯à®•à®³à¯ˆà®¤à¯ தொகà¯',
-'filedelete-maintenance' => 'கோபà¯à®ªà¯à®•à®³à¯ நீகà¯à®•à®®à¯ மறà¯à®±à¯à®®à¯ மீடà¯à®ªà¯ ஆகியவை பராமரிபà¯à®ªà®¿à®©à¯ பொழà¯à®¤à¯ தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'filedelete-edit-reasonlist' => 'நீகà¯à®•à®²à¯ காரணஙà¯à®•à®³à¯ˆà®¤à¯ தொகà¯',
+'filedelete-maintenance' => 'கோபà¯à®ªà¯à®•à®³à¯ நீகà¯à®•à®®à¯ மறà¯à®±à¯à®®à¯ மீடà¯à®ªà¯ ஆகியவை பராமரிபà¯à®ªà®¿à®©à¯ பொழà¯à®¤à¯ தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'filedelete-maintenance-title' => 'கோபà¯à®ªà¯ˆ நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
# MIME search
'mimesearch' => 'பலநோகà¯à®•à¯ இணைய அஞà¯à®šà®²à¯ நீடà¯à®šà®¿à®¤à¯ தேடலà¯',
@@ -1733,6 +1778,7 @@ $1',
'mostimages' => 'படிமஙà¯à®•à®³à¯à®•à¯à®•à¯ அதிகமாக இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ',
'mostrevisions' => 'அதிக திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿ கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯',
'prefixindex' => 'à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯à®šà¯ சà¯à®Ÿà¯à®Ÿà®¿à®¯à¯à®Ÿà®©à¯ உளà¯à®³ அனைதà¯à®¤à¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯à®®à¯',
+'prefixindex-namespace' => 'à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯ ( $1 பயனரà¯à®µà¯†à®³à®¿)கொணà¯à®Ÿ அனைதà¯à®¤à¯ பகà¯à®•à®™à¯à®•à®³à¯à®®à¯',
'shortpages' => 'கà¯à®±à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯',
'longpages' => 'நீளமான பகà¯à®•à®™à¯à®•à®³à¯',
'deadendpages' => 'தொடராப௠பகà¯à®•à®™à¯à®•à®³à¯',
@@ -1749,7 +1795,7 @@ $1',
'listusers-editsonly' => 'தொகà¯à®¤à¯à®¤ பயனரà¯à®•à®³à¯ˆ மடà¯à®Ÿà¯à®®à¯ காடà¯à®Ÿà¯',
'listusers-creationsort' => 'உரà¯à®µà®¾à®•à¯à®•à®¿à®¯ தேதி அடிபà¯à®ªà®Ÿà¯ˆà®¯à®¿à®²à¯ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯',
'usereditcount' => '$1 {{PLURAL:$1|தொகà¯|தொகà¯à®¤à¯à®¤à®²à¯à®•à®³à¯}}',
-'usercreated' => '$1 தேதி $2 மணியில௠உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'usercreated' => '{{GENDER:$3|Created}} $1 தேதி $2 மணியில௠உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'newpages' => 'பà¯à®¤à®¿à®¯ பகà¯à®•à®™à¯à®•à®³à¯',
'newpages-username' => 'பயனர௠பெயரà¯:',
'ancientpages' => 'மிகபà¯à®ªà®´à¯ˆà®¯ கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯',
@@ -1838,12 +1884,8 @@ $1',
'activeusers-noresult' => 'எநà¯à®¤à®µà¯Šà®°à¯ பயனரà¯à®•à®³à¯à®®à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
# Special:Log/newusers
-'newuserlogpage' => 'பயனர௠உரà¯à®µà®¾à®•à¯à®•à®®à¯ பறà¯à®±à®¿à®¯ கà¯à®±à®¿à®ªà¯à®ªà¯',
-'newuserlogpagetext' => 'இத௠பயனர௠படைபà¯à®ªà¯à®•à®³à®¿à®©à¯ பதிவ௠ஆகà¯à®®à¯.',
-'newuserlog-byemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ மூலம௠கடவà¯à®šà¯à®šà¯Šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯',
-'newuserlog-create-entry' => 'பà¯à®¤à®¿à®¯ பயனர௠கணகà¯à®•à¯',
-'newuserlog-create2-entry' => '$1-எனà¯à®± பà¯à®¤à®¿à®¯ கணகà¯à®•à¯à®¤à¯ தொடஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯',
-'newuserlog-autocreate-entry' => 'கணகà¯à®•à¯ தானாக உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯',
+'newuserlogpage' => 'பயனர௠உரà¯à®µà®¾à®•à¯à®•à®®à¯ பறà¯à®±à®¿à®¯ கà¯à®±à®¿à®ªà¯à®ªà¯',
+'newuserlogpagetext' => 'இத௠பயனர௠படைபà¯à®ªà¯à®•à®³à®¿à®©à¯ பதிவ௠ஆகà¯à®®à¯.',
# Special:ListGroupRights
'listgrouprights' => 'பயனர௠கà¯à®´à¯ உரிமைகளà¯',
@@ -1870,7 +1912,7 @@ $1',
[[Special:Preferences|என௠விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à®¿à®²à¯]] நீஙà¯à®•à®³à¯ கொடà¯à®¤à¯à®¤à¯à®³à¯à®³ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ மினà¯à®©à®žà¯à®šà®²à®¿à®©à¯ "From" à®®à¯à®•à®µà®°à®¿à®¯à®¾à®•à®•à¯ காடà¯à®šà®¿ தரà¯à®®à¯, இதனால௠பெறà¯à®¨à®°à¯ உஙà¯à®•à®³à¯à®•à¯à®•à¯ நேரடியாக பதில௠எழà¯à®¤ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.',
'usermailererror' => 'மினà¯à®©à®žà¯à®šà®²à¯ விளைவாகà¯à®•à®¿à®¯ தவறà¯:',
-'defemailsubject' => '{{SITENAME}} மினà¯à®©à®žà¯à®šà®²à¯',
+'defemailsubject' => '{{SITENAME}} மினà¯à®©à®žà¯à®šà®²à¯ பயனர௠" $1 "-இடமிரà¯à®¨à¯à®¤à¯.',
'usermaildisabled' => 'பயனரின௠மினà¯à®©à®žà¯à®šà®²à¯ செயலிழகà¯à®•à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
'usermaildisabledtext' => 'நீஙà¯à®•à®³à¯ மறà¯à®± பயனரà¯à®•à®³à¯à®•à¯à®•à¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ª à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'noemailtitle' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ இலà¯à®²à¯ˆ',
@@ -1982,7 +2024,6 @@ $NEWPAGE
'actioncomplete' => 'செயறà¯à®ªà®¾à®Ÿà¯ நிறைவà¯à®±à¯à®±à®¤à¯',
'actionfailed' => 'செயல௠வெறà¯à®±à®¿à®¯à®Ÿà¯ˆà®¯à®µà®¿à®²à¯à®²à¯ˆ',
'deletedtext' => '"$1" நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ விடà¯à®Ÿà®¤à¯. அணà¯à®®à¯ˆà®¯ நீகà¯à®•à¯à®¤à®²à¯à®•à®³à®¿à®©à¯ பதிவà¯à®•à¯à®•à¯ $2 à®à®ªà¯ பாரà¯à®•à¯à®•.',
-'deletedarticle' => '"[[$1]]" நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'dellogpage' => 'நீகà¯à®•à®²à¯ பதிவà¯',
'dellogpagetext' => 'கீழே காணபà¯à®ªà®Ÿà¯à®µà®¤à¯ மிக அணà¯à®®à¯ˆà®¯ நீகà¯à®•à®²à¯à®•à®³à®¿à®©à¯ அடà¯à®Ÿà®µà®£à¯ˆà®¯à®¾à®•à¯à®®à¯.',
'deletionlog' => 'நீகà¯à®•à®²à¯ பதிவà¯',
@@ -2027,7 +2068,10 @@ $NEWPAGE
'unprotectedarticle' => '"[[$1]]" பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ காபà¯à®ªà¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'movedarticleprotection' => 'காபà¯à®ªà¯ அமைபà¯à®ªà¯à®•à®³à¯ "[[$2]]" இல௠இரà¯à®¨à¯à®¤à¯ "[[$1]]" கà¯à®•à¯ மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'protect-title' => '"$1" பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© காபà¯à®ªà¯ அமைபà¯à®ªà¯',
+'protect-title-notallowed' => ' " $1 " ன௠பாதà¯à®•à®¾à®ªà¯à®ªà¯ அளவ௠காணà¯',
'prot_1movedto2' => '[[$1]], [[$2]] எனà¯à®±à®¤à¯ தலைபà¯à®ªà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
+'protect-badnamespace-title' => 'பாதà¯à®•à®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤ பெயரிடைவெளி',
+'protect-badnamespace-text' => 'இநà¯à®¤ பெயரிடைவெளியில௠உளà¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ பாதà¯à®•à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®¤à¯.',
'protect-legend' => 'காபà¯à®ªà¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯',
'protectcomment' => 'காரணமà¯:',
'protectexpiry' => 'à®®à¯à®Ÿà®¿à®µà¯à®±à¯à®•à®¿à®±à®¤à¯:',
@@ -2047,6 +2091,7 @@ $NEWPAGE
'protect-level-sysop' => 'நிரà¯à®µà®¾à®•à®¿à®•à®³à¯ மடà¯à®Ÿà¯à®®à¯',
'protect-summary-cascade' => 'படிநிலை',
'protect-expiring' => '$1 (UTC) மணிகà¯à®•à¯ காலாவதியாகிறதà¯',
+'protect-expiring-local' => 'காலாவதியாகà¯à®®à¯$1',
'protect-expiry-indefinite' => 'காலவரையறையறà¯à®±',
'protect-cascade' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®²à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ˆà®•à¯ காபà¯à®ªà¯à®šà¯ செய௠(படிநிலைக௠காபà¯à®ªà¯)',
'protect-cantedit' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ காபà¯à®ªà¯ நிலையை நீஙà¯à®•à®³à¯ மாறà¯à®± à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. உஙà¯à®•à®³à¯à®•à¯à®•à¯ காபà¯à®ªà¯ நிலையை தொகà¯à®ªà¯à®ªà®¤à®±à¯à®•à®¾à®© அனà¯à®®à®¤à®¿ கிடையாதà¯.',
@@ -2105,7 +2150,6 @@ $NEWPAGE
'undeletereset' => 'மீடà¯à®Ÿà®®à¯ˆà®•à¯à®•',
'undeleteinvert' => 'தேரà¯à®µà¯ செயà¯à®¤à®¤à¯ˆ ரதà¯à®¤à¯ செயà¯',
'undeletecomment' => 'காரணமà¯:',
-'undeletedarticle' => '"$1" மீடà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'undeletedrevisions' => '{{PLURAL:$1|1 திரà¯à®¤à¯à®¤à®®à¯ மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 திரà¯à®¤à¯à®¤à®®à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} மறà¯à®±à¯à®®à¯ {{PLURAL:$2|1 கோபà¯à®ªà¯|$2 கோபà¯à®ªà¯à®•à®³à¯}} மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©.',
'undeletedfiles' => '{{PLURAL:$1|ஒர௠கோபà¯à®ªà¯ மீடà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯|$1 கோபà¯à®ªà¯à®•à®³à¯ மீடà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©}}',
@@ -2114,6 +2158,7 @@ $NEWPAGE
அணà¯à®®à¯ˆà®¯ நீகà¯à®•à®²à¯à®•à®³à¯à®•à¯à®•à¯à®®à¯ மீடà¯à®ªà¯à®•à¯à®³à¯à®•à¯à®•à¯à®®à¯ [[Special:Log/delete|நீகà¯à®•à®²à¯ பதிவைபà¯]] பாரà¯à®•à¯à®•à®µà¯à®®à¯.",
'undelete-header' => 'அணà¯à®®à¯ˆà®¯à®¿à®²à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ˆà®•à¯ காண [[Special:Log/delete|நீகà¯à®•à®²à¯ பதிவைபà¯]] பாரà¯à®•à¯à®•.',
+'undelete-search-title' => 'நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தேடà¯',
'undelete-search-box' => 'நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தேடà¯',
'undelete-search-prefix' => 'பினà¯à®µà®°à¯à®®à¯ எழà¯à®¤à¯à®¤à¯à®Ÿà®©à¯ தொடஙà¯à®•à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯:',
'undelete-search-submit' => 'தேடà¯à®•',
@@ -2122,6 +2167,7 @@ $NEWPAGE
'undelete-bad-store-key' => '$1 எனà¯à®± நேர à®®à¯à®¤à¯à®¤à®¿à®°à¯ˆà®¯à¯à®Ÿà®©à¯ கூடிய கோபà¯à®ªà¯ திரà¯à®¤à¯à®¤à®¤à¯ˆ மீடà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯: நீகà¯à®•à®²à¯à®•à¯à®•à¯ à®®à¯à®©à¯à®©à®¤à®¾à®• கோபà¯à®ªà¯ˆà®•à¯ காணவிலà¯à®²à¯ˆ.',
'undelete-cleanup-error' => 'பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤ "$1" எனà¯à®±à®ªà¯ பரண௠கோபà¯à®ªà¯ˆ நீகà¯à®•à¯à®µà®¤à®¿à®²à¯ தவறà¯.',
'undelete-missing-filearchive' => 'தரவà¯à®¤à¯à®¤à®³à®¤à¯à®¤à®¿à®²à¯ காணபà¯à®ªà®Ÿà®¾à®¤ படியினால௠பரணிடல௠அடையாள எண௠$1஠உடைய கோபà¯à®ªà¯ˆ மீடà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. à®à®±à¯à®•à®©à®µà¯‡ மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯.',
+'undelete-error' => 'பிழை undeleting பகà¯à®•à®®à¯',
'undelete-error-short' => 'கோபà¯à®ªà¯ˆ மீடà¯à®ªà®¤à®¿à®²à¯ தவறà¯: $1',
'undelete-error-long' => 'கோபà¯à®ªà¯ˆ மீடà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®•à¯à®®à¯ போத௠தவற௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:
@@ -2240,6 +2286,7 @@ $1',
'blocklist-userblocks' => 'கணகà¯à®•à¯ தடà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ மறை',
'blocklist-tempblocks' => 'தறà¯à®•à®¾à®²à®¿à®• தடà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ மறை',
'blocklist-addressblocks' => 'ஒரே IP தடà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ மறை',
+'blocklist-rangeblocks' => 'வரமà¯à®ªà¯ தடà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ மறை',
'blocklist-timestamp' => 'நேரமà¯à®¤à¯à®¤à®¿à®°à¯ˆ',
'blocklist-target' => 'இலகà¯à®•à¯',
'blocklist-expiry' => 'காலாவதியாகிறதà¯',
@@ -2262,6 +2309,7 @@ $1',
'unblocklink' => 'தடை நீகà¯à®•à¯',
'change-blocklink' => 'கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ பகà¯à®¤à®¿à®¯à¯ˆ மாறà¯à®±à¯',
'contribslink' => 'பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à®³à¯',
+'emaillink' => 'மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà¯',
'autoblocker' => 'நீஙà¯à®•à®³à¯ "[[User:$1|$1]]" உடன௠ஒரே à®.பி. à®®à¯à®•à®µà®°à®¿à®¯à¯ˆà®ªà¯ பகிரà¯à®¨à¯à®¤à¯à®•à¯Šà®³à¯à®µà®¤à®¾à®²à¯ தானியஙà¯à®•à®¿à®¤à¯ தடை விதிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. $1இன௠தடà¯à®ªà¯à®ªà¯à®•à¯à®•à®¾à®• கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®•à¯ காரணமà¯: "$2".',
'blocklogpage' => 'தடைப௠பதிகை',
'blocklog-showlog' => 'இநà¯à®¤ பயனர௠மà¯à®©à¯à®ªà¯‡ தடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¾à®°à¯.
@@ -2376,8 +2424,6 @@ $1',
'movepage-page-moved' => 'பகà¯à®•à®®à¯ $1, $2 இறà¯à®•à¯ நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'movepage-page-unmoved' => 'பகà¯à®•à®®à¯ $1 à® $2கà¯à®•à¯ நகரà¯à®¤à¯à®¤ இயலாதà¯.',
'movepage-max-pages' => 'அதிகபடà¯à®šà®®à®¾à®• $1 {{PLURAL:$1| பகà¯à®•à®®à¯ |பகà¯à®•à®™à¯à®•à®³à¯}} நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯, இதறà¯à®•à¯à®•à¯ மேலà¯à®®à¯ தானாக நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤à¯.',
-'1movedto2' => '[[$1]], [[$2]] எனà¯à®±à®¤à¯ தலைபà¯à®ªà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
-'1movedto2_redir' => '[[$1]],[[$2]] பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯ வழிமாறà¯à®±à®¿à®•à¯à®•à¯ மேலாக நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
'movelogpage' => 'நகரà¯à®¤à¯à®¤à®²à¯ பதிகை',
'movelogpagetext' => 'நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®ªà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯ கீழே தரபà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'movesubpage' => '{{PLURAL:$1|தà¯à®£à¯ˆà®ªà¯à®ªà®•à¯à®•à®®à¯|தà¯à®£à¯ˆà®ªà¯à®ªà®•à¯à®•à®™à¯à®•à®³à¯}}',
@@ -2390,7 +2436,7 @@ $1',
நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®µà¯‡à®£à¯à®Ÿà®¿à®¯à®ªà¯ பகà¯à®•à®®à¯ "[[:$1]]" à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯. நகரà¯à®¤à¯à®¤à®²à¯à®•à¯à®•à¯ வழி à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤ அபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®• வேணà¯à®Ÿà¯à®®à®¾?',
'delete_and_move_confirm' => 'ஆமà¯, இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à¯à®•',
-'delete_and_move_reason' => 'நகரà¯à®¤à¯à®¤à¯à®µà®¤à®±à¯à®•à¯ இடமளிபà¯à®ªà®¤à®±à¯à®•à®¾à®• நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'delete_and_move_reason' => "''[[$1]]'' லிரà¯à®¨à¯à®¤à¯ நகரà¯à®¤à¯à®¤à¯à®µà®¤à®±à¯à®•à¯ இடமளிபà¯à®ªà®¤à®±à¯à®•à®¾à®• நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯",
'selfmove' => 'நகரà¯à®¤à®²à®¿à®©à¯ தொடகà¯à®•à®ªà¯ பகà¯à®•à®¤à¯à®¤à®²à¯ˆà®ªà¯à®ªà¯à®®à¯ à®®à¯à®Ÿà®¿à®µà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à®²à¯ˆà®ªà¯à®ªà¯à®®à¯ ஒனà¯à®±à®¾à®•à¯à®®à¯; ஒர௠தலைபà¯à®ªà¯ˆ அதன௠மீதே நகரà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'immobile-source-namespace' => '"$1" பெயரà¯à®µà¯†à®³à®¿à®¯à®¿à®©à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ நகரà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'immobile-target-namespace' => '"$1" பெயரà¯à®µà¯‡à®³à®¿à®•à¯à®•à¯à®³à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ நகரà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
@@ -2424,6 +2470,7 @@ $1',
'exportcuronly' => 'நடபà¯à®ªà¯à®¤à¯ திரà¯à®¤à¯à®¤à®¤à¯à®¤à¯ˆ மடà¯à®Ÿà¯à®®à¯ சேரà¯à®•à¯à®•à®µà¯à®®à¯',
'exportnohistory' => "----
'''கà¯à®±à®¿à®ªà¯à®ªà¯:'''செயல௠திறைனைக௠கரà¯à®¤à¯à®¤à®¿à®±à¯ கொணà¯à®Ÿà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ à®®à¯à®´à¯à®®à¯ˆà®¯à®¾à®© வரலாறà¯à®±à¯ˆ இபà¯à®ªà®Ÿà®¿à®®à®®à¯‚டாக à®à®±à¯à®±à¯à®®à®¤à®¿ செயà¯à®µà®¤à¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.",
+'exportlistauthors' => 'ஒவà¯à®µà¯Šà®°à¯ பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à¯à®®à¯ பயனரà¯à®•à®³à®¿à®©à¯ à®®à¯à®´à¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®©à¯ˆ சேரà¯',
'export-submit' => 'à®à®±à¯à®±à¯à®®à®¤à®¿ செயà¯',
'export-addcattext' => 'பகà¯à®ªà¯à®ªà®¿à®²à¯à®³à¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ˆà®šà¯ சேரà¯:',
'export-addcat' => 'சேரà¯',
@@ -2456,6 +2503,8 @@ $1',
'thumbnail_error' => 'சிற௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¿à®²à¯ தவறà¯: $1',
'djvu_page_error' => 'DjVu பகà¯à®•à®®à¯ வரமà¯à®ªà®¿à®±à¯à®•à¯ வெளியே உளà¯à®³à®¤à¯',
'djvu_no_xml' => 'DjVu கோபà¯à®ªà®¿à®±à¯à®•à¯à®•à®¾à®• XML ஠எடà¯à®•à¯à®• இயலவிலà¯à®²à¯ˆ',
+'thumbnail-temp-create' => 'சிற௠உரà¯à®µ தறà¯à®•à®¾à®²à®¿à®• கோபà¯à®ªà¯ˆ உரà¯à®µà®¾à®•à¯à®• இயலவிலà¯à®²à¯ˆ',
+'thumbnail-dest-create' => 'சிறà¯à®‰à®°à¯à®µà®¤à®¤à¯ˆ இலகà¯à®•à®¿à®²à¯ சேமிகà¯à®• இயலவிலà¯à®²à¯ˆ',
'thumbnail_invalid_params' => 'செலà¯à®²à®¾à®¤ சிற௠உரà¯à®µ அளவà¯à®°à¯à®•à¯à®•à®³à¯',
'thumbnail_dest_directory' => 'இலகà¯à®•à¯ அடைவை உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
'thumbnail_image-type' => 'பட வகை ஆதரிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
@@ -2500,6 +2549,8 @@ $1',
'import-upload' => 'XML தரவை பதிவேறà¯à®±à¯',
'import-token-mismatch' => 'உஙà¯à®•à®³à¯ அமரà¯à®µà®¿à®©à¯ தரவà¯à®•à®³à¯ அழிநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®©. à®…à®°à¯à®³à¯à®•à¯‚à®°à¯à®¨à¯à®¤à¯ மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®²à¯à®•.',
'import-invalid-interwiki' => 'கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ விகà¯à®•à®¿à®¯à®¿à®²à¯ இரà¯à®¨à¯à®¤à¯ இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯ .',
+'import-error-edit' => 'பகà¯à®•à®®à¯ "$1" ஆனத௠இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ ,à®à®©à¯†à®©à®¿à®²à¯ அதை நீஙà¯à®•à®³à¯ திரà¯à®¤à¯à®¤ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+'import-error-create' => 'பகà¯à®•à®®à¯ "$1" ஆனத௠இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ ,à®à®©à¯†à®©à®¿à®²à¯ அதை நீஙà¯à®•à®³à¯ உரà¯à®µà®¾à®•à¯à®• அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
# Import log
'importlogpage' => 'இறகà¯à®•à¯à®®à®¤à®¿ பதிகை',
@@ -2510,71 +2561,73 @@ $1',
'import-logentry-interwiki-detail' => '$2 இலிரà¯à®¨à¯à®¤à¯ {{PLURAL:$1|ஒர௠திரà¯à®¤à¯à®¤à®®à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}}',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'உஙà¯à®•à®³à¯ பயனர௠பகà¯à®•à®®à¯',
-'tooltip-pt-anonuserpage' => 'நீஙà¯à®•à®³à¯ தொகà¯à®¤à¯à®¤à¯à®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯ à®.பி. à®®à¯à®•à®µà®°à®¿à®•à¯à®•à®¾à®© பயனர௠பகà¯à®•à®®à¯',
-'tooltip-pt-mytalk' => 'உஙà¯à®•à®³à¯ பேசà¯à®šà¯à®ªà¯ பகà¯à®•à®®à¯',
-'tooltip-pt-anontalk' => 'இநà¯à®¤ à®.பி. à®®à¯à®•à®µà®°à®¿à®¯à®¿à®²à®¿à®°à¯à®¨à¯à®¤à®¾à®© தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆà®ªà¯ பறà¯à®±à®¿à®¯ உரையாடலà¯',
-'tooltip-pt-preferences' => 'உஙà¯à®•à®³à¯ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
-'tooltip-pt-watchlist' => 'மாறà¯à®±à®™à¯à®•à®³à¯à®•à¯à®•à®¾à®• நீஙà¯à®•à®³à¯ கவனிகà¯à®•à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
-'tooltip-pt-mycontris' => 'உஙà¯à®•à®³à¯ பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
-'tooltip-pt-login' => 'நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯ ஊகà¯à®•à¯à®µà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯, ஆனால௠இத௠கடà¯à®Ÿà®¾à®¯à®®à®©à¯à®±à¯.',
-'tooltip-pt-anonlogin' => 'நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®šà¯ செயà¯à®¯ ஊகà¯à®•à¯à®µà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ எனினà¯à®®à¯ இத௠கடà¯à®Ÿà®¾à®¯à®®à®²à¯à®².',
-'tooltip-pt-logout' => 'விடà¯à®ªà®¤à®¿à®•à¯ˆ',
-'tooltip-ca-talk' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®®à¯ தொடரà¯à®ªà®¾à®© உரையாடல௠பகà¯à®•à®®à¯',
-'tooltip-ca-edit' => 'நீஙà¯à®•à®³à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®¤à¯ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. "à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ காடà¯à®Ÿà¯" பொதà¯à®¤à®¾à®©à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ பினà¯à®©à®°à¯ உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ சேமிகà¯à®•à®µà¯à®®à¯.',
-'tooltip-ca-addsection' => 'பà¯à®¤à®¿à®¯ பகà¯à®¤à®¿à®¯à¯ˆà®¤à¯ தொடஙà¯à®•à¯',
-'tooltip-ca-viewsource' => 'இபà¯à®ªà®•à¯à®•à®®à¯ காகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. நீஙà¯à®•à®³à¯ இதன௠மூலதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®²à®¾à®®à¯.',
-'tooltip-ca-history' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ பழைய பதிபà¯à®ªà¯à®•à®³à¯.',
-'tooltip-ca-protect' => 'இபà¯à®ªà®•à¯à®•à¯à®¤à¯à®¤à¯ˆ காபà¯à®ªà¯à®šà¯ செயà¯',
-'tooltip-ca-unprotect' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ காபà¯à®ªà¯ˆ மாறà¯à®±à¯',
-'tooltip-ca-delete' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à¯',
-'tooltip-ca-undelete' => 'இபà¯à®ªà®•à¯à®•à®®à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®±à¯à®•à¯ à®®à¯à®©à¯à®©à®°à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ மீடà¯à®Ÿà¯†à®Ÿà¯',
-'tooltip-ca-move' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நகரà¯à®¤à¯à®¤à¯à®•',
-'tooltip-ca-watch' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ உன௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯',
-'tooltip-ca-unwatch' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ என௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®°à¯à®¨à¯à®¤à¯ நீகà¯à®•à¯',
-'tooltip-search' => '{{SITENAME}}-இல௠தேடà¯à®•',
-'tooltip-search-go' => 'இபà¯à®ªà¯†à®¯à®°à¯ˆà®•à¯ கொணà¯à®Ÿà®ªà¯ பகà¯à®•à®®à¯ இரà¯à®ªà¯à®ªà®¿à®©à¯ அதறà¯à®•à¯ நேரடியாகச௠செலà¯à®•',
-'tooltip-search-fulltext' => 'இசà¯à®šà¯Šà®±à¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தேடà¯à®•',
-'tooltip-p-logo' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®®à¯',
-'tooltip-n-mainpage' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செலà¯à®²à®µà¯à®®à¯',
-'tooltip-n-mainpage-description' => 'à®®à¯à®¤à®±à¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செலà¯à®•',
-'tooltip-n-portal' => 'திடà¯à®Ÿà®®à¯ பறà¯à®±à®¿ தெரிநà¯à®¤à¯à®•à¯ கொளà¯à®³, நீஙà¯à®•à®³à¯ எனà¯à®© செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯, தேவையானவறà¯à®±à¯ˆ எஙà¯à®•à¯ தேட எனà¯à®ªà®©à®µà®±à¯à®±à¯ˆ அறிய',
-'tooltip-n-currentevents' => 'நடபà¯à®ªà¯ நிகழà¯à®µà¯à®•à®³à¯ பறà¯à®±à®¿à®¯ மேலதிக தகவலà¯à®•à®³à¯ˆà®•à¯ காண',
-'tooltip-n-recentchanges' => 'இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
-'tooltip-n-randompage' => 'à®à®¤à®¾à®µà®¤à¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆà®•à¯ காடà¯à®Ÿà¯',
-'tooltip-n-help' => 'உதவிகளைப௠பெற',
-'tooltip-t-whatlinkshere' => 'இஙà¯à®•à¯‡ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ எலà¯à®²à®¾ விகà¯à®•à®¿à®ªà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
-'tooltip-t-recentchangeslinked' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®Ÿà®©à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à®¿à®²à¯ மாறà¯à®±à®™à¯à®•à®³à¯',
-'tooltip-feed-rss' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© ஆரà¯.எஸà¯.எஸà¯. ஓடை கிடையாதà¯',
-'tooltip-feed-atom' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© அடொம௠ஓடை கிடையாதà¯',
-'tooltip-t-contributions' => 'இபà¯à®ªà®¯à®©à®°à®¿à®©à¯ பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆà®ªà¯ பாரà¯',
-'tooltip-t-emailuser' => 'இப௠பயனரà¯à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ செயà¯',
-'tooltip-t-upload' => 'கோபà¯à®ªà¯à®•à®³à¯ˆà®ªà¯ பதிவேறà¯à®±à¯à®•',
-'tooltip-t-specialpages' => 'அனைதà¯à®¤à¯à®šà¯ சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
-'tooltip-t-print' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ அசà¯à®šà¯à®•à¯à®•à¯à®•à®¨à¯à®¤à®ªà¯ பதிபà¯à®ªà¯',
-'tooltip-t-permalink' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ இநà¯à®¤à®ªà¯ பதிபà¯à®ªà¯à®•à¯à®•à®¾à®© நிலையான இணைபà¯à®ªà¯',
-'tooltip-ca-nstab-main' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-user' => 'பயனர௠பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-media' => 'ஊடகக௠கோபà¯à®ªà¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-special' => 'இத௠ஒர௠சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯, இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீஙà¯à®•à®³à¯ நேரடியாகத௠தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
-'tooltip-ca-nstab-project' => 'திடà¯à®Ÿà®ªà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-image' => 'கோபà¯à®ªà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-mediawiki' => 'à®®à¯à®±à¯ˆà®®à¯ˆà®šà®¾à®°à¯ தகவலà¯à®•à®³à¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-template' => 'வாரà¯à®ªà¯à®ªà¯à®°à¯à®µà¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-help' => 'உதவிப௠பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
-'tooltip-ca-nstab-category' => 'பகà¯à®ªà¯à®ªà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆ பாரà¯à®•à¯à®•',
-'tooltip-minoredit' => 'இமà¯à®®à®¾à®±à¯à®±à®¤à¯à®¤à¯ˆ சிறிய தொகà¯à®ªà¯à®ªà®¾à®• கரà¯à®¤à¯',
-'tooltip-save' => 'உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆà®šà¯ சேமிகà¯à®•à®µà¯à®®à¯.',
-'tooltip-preview' => 'நீஙà¯à®•à®³à¯ செயà¯à®¤ மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯! தயவà¯à®šà¯†à®¯à¯à®¤à¯, மாறà¯à®±à®™à¯à®•à®³à¯ˆ சேமிகà¯à®•à¯à®®à¯ à®®à¯à®©à¯à®©à®°à¯ இதனைப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯!',
-'tooltip-diff' => 'உரையில௠நீஙà¯à®•à®³à¯ செயà¯à®¤ மாறà¯à®±à®™à¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯.',
-'tooltip-compareselectedversions' => 'இப௠பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ இரணà¯à®Ÿà¯ பதிபà¯à®ªà¯à®•à¯à®•à®³à¯à®•à¯à®•à¯ இடையிலான வேறà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯.',
-'tooltip-watch' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ உஙà¯à®•à®³à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯à®•à¯à®•à®µà¯à®®à¯',
-'tooltip-recreate' => 'à®à®±à¯à®•à®©à®µà¯‡ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯à®®à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à¯',
-'tooltip-upload' => 'பதிவேறà¯à®±à®¤à¯à®¤à¯ˆ தொடஙà¯à®•à¯',
-'tooltip-rollback' => '"à®®à¯à®©à¯à®ªà®¿à®°à¯à®¨à¯à®¤ நிலைகà¯à®•à¯à®•à¯ கொணà¯à®Ÿà¯à®µà®°à¯à®¤à®²à¯" எனà¯à®ªà®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ அனைதà¯à®¤à¯ˆà®¯à¯à®®à¯ பழையபடி இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®²à¯ கடைசி பயனர௠தொகà¯à®¤à¯à®¤ நிலைகà¯à®•à¯ ஒரே ஒர௠சொடà¯à®•à¯à®•à®¿à®²à¯ கொணà¯à®Ÿà¯à®µà®°à¯à®®à¯.',
-'tooltip-undo' => '"பினà¯à®µà®¾à®™à¯à®•à¯" எனà¯à®ªà®¤à¯ à®®à¯à®©à¯à®ªà¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯à®•à®¿à®±à®¤à¯. மேலà¯à®®à¯ தாஙà¯à®•à®³à¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà®¿à®©à¯ˆ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®± நிலைகà¯à®•à¯ கொணà¯à®Ÿà¯à®µà®¨à¯à®¤à¯ காடà¯à®Ÿà¯à®®à¯. அத௠தஙà¯à®•à®³à¯à®•à¯à®•à¯à®šà¯ சிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯à®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ அதறà¯à®•à®¾à®© காரணதà¯à®¤à¯ˆà®•à¯ கூற அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯.',
-'tooltip-preferences-save' => 'விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ சேமி',
-'tooltip-summary' => 'கà¯à®±à¯à®•à®¿à®¯ சà¯à®°à¯à®•à¯à®•à®¤à¯à®¤à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯.',
+'tooltip-pt-userpage' => 'உஙà¯à®•à®³à¯ பயனர௠பகà¯à®•à®®à¯',
+'tooltip-pt-anonuserpage' => 'நீஙà¯à®•à®³à¯ தொகà¯à®¤à¯à®¤à¯à®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯ à®.பி. à®®à¯à®•à®µà®°à®¿à®•à¯à®•à®¾à®© பயனர௠பகà¯à®•à®®à¯',
+'tooltip-pt-mytalk' => 'உஙà¯à®•à®³à¯ பேசà¯à®šà¯à®ªà¯ பகà¯à®•à®®à¯',
+'tooltip-pt-anontalk' => 'இநà¯à®¤ à®.பி. à®®à¯à®•à®µà®°à®¿à®¯à®¿à®²à®¿à®°à¯à®¨à¯à®¤à®¾à®© தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆà®ªà¯ பறà¯à®±à®¿à®¯ உரையாடலà¯',
+'tooltip-pt-preferences' => 'உஙà¯à®•à®³à¯ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
+'tooltip-pt-watchlist' => 'மாறà¯à®±à®™à¯à®•à®³à¯à®•à¯à®•à®¾à®• நீஙà¯à®•à®³à¯ கவனிகà¯à®•à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
+'tooltip-pt-mycontris' => 'உஙà¯à®•à®³à¯ பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
+'tooltip-pt-login' => 'நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯ ஊகà¯à®•à¯à®µà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯, ஆனால௠இத௠கடà¯à®Ÿà®¾à®¯à®®à®©à¯à®±à¯.',
+'tooltip-pt-anonlogin' => 'நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®šà¯ செயà¯à®¯ ஊகà¯à®•à¯à®µà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯ எனினà¯à®®à¯ இத௠கடà¯à®Ÿà®¾à®¯à®®à®²à¯à®².',
+'tooltip-pt-logout' => 'விடà¯à®ªà®¤à®¿à®•à¯ˆ',
+'tooltip-ca-talk' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®®à¯ தொடரà¯à®ªà®¾à®© உரையாடல௠பகà¯à®•à®®à¯',
+'tooltip-ca-edit' => 'நீஙà¯à®•à®³à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®¤à¯ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. "à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ காடà¯à®Ÿà¯" பொதà¯à®¤à®¾à®©à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ பினà¯à®©à®°à¯ உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ சேமிகà¯à®•à®µà¯à®®à¯.',
+'tooltip-ca-addsection' => 'பà¯à®¤à®¿à®¯ பகà¯à®¤à®¿à®¯à¯ˆà®¤à¯ தொடஙà¯à®•à¯',
+'tooltip-ca-viewsource' => 'இபà¯à®ªà®•à¯à®•à®®à¯ காகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. நீஙà¯à®•à®³à¯ இதன௠மூலதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®²à®¾à®®à¯.',
+'tooltip-ca-history' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ பழைய பதிபà¯à®ªà¯à®•à®³à¯.',
+'tooltip-ca-protect' => 'இபà¯à®ªà®•à¯à®•à¯à®¤à¯à®¤à¯ˆ காபà¯à®ªà¯à®šà¯ செயà¯',
+'tooltip-ca-unprotect' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ காபà¯à®ªà¯ˆ மாறà¯à®±à¯',
+'tooltip-ca-delete' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à¯',
+'tooltip-ca-undelete' => 'இபà¯à®ªà®•à¯à®•à®®à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®±à¯à®•à¯ à®®à¯à®©à¯à®©à®°à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ மீடà¯à®Ÿà¯†à®Ÿà¯',
+'tooltip-ca-move' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நகரà¯à®¤à¯à®¤à¯à®•',
+'tooltip-ca-watch' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ உன௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯',
+'tooltip-ca-unwatch' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ என௠கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®°à¯à®¨à¯à®¤à¯ நீகà¯à®•à¯',
+'tooltip-search' => '{{SITENAME}}-இல௠தேடà¯à®•',
+'tooltip-search-go' => 'இபà¯à®ªà¯†à®¯à®°à¯ˆà®•à¯ கொணà¯à®Ÿà®ªà¯ பகà¯à®•à®®à¯ இரà¯à®ªà¯à®ªà®¿à®©à¯ அதறà¯à®•à¯ நேரடியாகச௠செலà¯à®•',
+'tooltip-search-fulltext' => 'இசà¯à®šà¯Šà®±à¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தேடà¯à®•',
+'tooltip-p-logo' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®®à¯',
+'tooltip-n-mainpage' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செலà¯à®²à®µà¯à®®à¯',
+'tooltip-n-mainpage-description' => 'à®®à¯à®¤à®±à¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®šà¯ செலà¯à®•',
+'tooltip-n-portal' => 'திடà¯à®Ÿà®®à¯ பறà¯à®±à®¿ தெரிநà¯à®¤à¯à®•à¯ கொளà¯à®³, நீஙà¯à®•à®³à¯ எனà¯à®© செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯, தேவையானவறà¯à®±à¯ˆ எஙà¯à®•à¯ தேட எனà¯à®ªà®©à®µà®±à¯à®±à¯ˆ அறிய',
+'tooltip-n-currentevents' => 'நடபà¯à®ªà¯ நிகழà¯à®µà¯à®•à®³à¯ பறà¯à®±à®¿à®¯ மேலதிக தகவலà¯à®•à®³à¯ˆà®•à¯ காண',
+'tooltip-n-recentchanges' => 'இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
+'tooltip-n-randompage' => 'à®à®¤à®¾à®µà®¤à¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆà®•à¯ காடà¯à®Ÿà¯',
+'tooltip-n-help' => 'உதவிகளைப௠பெற',
+'tooltip-t-whatlinkshere' => 'இஙà¯à®•à¯‡ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ எலà¯à®²à®¾ விகà¯à®•à®¿à®ªà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
+'tooltip-t-recentchangeslinked' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®Ÿà®©à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à®¿à®²à¯ மாறà¯à®±à®™à¯à®•à®³à¯',
+'tooltip-feed-rss' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© ஆரà¯.எஸà¯.எஸà¯. ஓடை கிடையாதà¯',
+'tooltip-feed-atom' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© அடொம௠ஓடை கிடையாதà¯',
+'tooltip-t-contributions' => 'இபà¯à®ªà®¯à®©à®°à®¿à®©à¯ பஙà¯à®•à®³à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆà®ªà¯ பாரà¯',
+'tooltip-t-emailuser' => 'இப௠பயனரà¯à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ செயà¯',
+'tooltip-t-upload' => 'கோபà¯à®ªà¯à®•à®³à¯ˆà®ªà¯ பதிவேறà¯à®±à¯à®•',
+'tooltip-t-specialpages' => 'அனைதà¯à®¤à¯à®šà¯ சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
+'tooltip-t-print' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ அசà¯à®šà¯à®•à¯à®•à¯à®•à®¨à¯à®¤à®ªà¯ பதிபà¯à®ªà¯',
+'tooltip-t-permalink' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ இநà¯à®¤à®ªà¯ பதிபà¯à®ªà¯à®•à¯à®•à®¾à®© நிலையான இணைபà¯à®ªà¯',
+'tooltip-ca-nstab-main' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-user' => 'பயனர௠பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-media' => 'ஊடகக௠கோபà¯à®ªà¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-special' => 'இத௠ஒர௠சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯, இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீஙà¯à®•à®³à¯ நேரடியாகத௠தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
+'tooltip-ca-nstab-project' => 'திடà¯à®Ÿà®ªà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-image' => 'கோபà¯à®ªà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-mediawiki' => 'à®®à¯à®±à¯ˆà®®à¯ˆà®šà®¾à®°à¯ தகவலà¯à®•à®³à¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-template' => 'வாரà¯à®ªà¯à®ªà¯à®°à¯à®µà¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-help' => 'உதவிப௠பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯',
+'tooltip-ca-nstab-category' => 'பகà¯à®ªà¯à®ªà¯à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆ பாரà¯à®•à¯à®•',
+'tooltip-minoredit' => 'இமà¯à®®à®¾à®±à¯à®±à®¤à¯à®¤à¯ˆ சிறிய தொகà¯à®ªà¯à®ªà®¾à®• கரà¯à®¤à¯',
+'tooltip-save' => 'உஙà¯à®•à®³à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆà®šà¯ சேமிகà¯à®•à®µà¯à®®à¯.',
+'tooltip-preview' => 'நீஙà¯à®•à®³à¯ செயà¯à®¤ மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯! தயவà¯à®šà¯†à®¯à¯à®¤à¯, மாறà¯à®±à®™à¯à®•à®³à¯ˆ சேமிகà¯à®•à¯à®®à¯ à®®à¯à®©à¯à®©à®°à¯ இதனைப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯!',
+'tooltip-diff' => 'உரையில௠நீஙà¯à®•à®³à¯ செயà¯à®¤ மாறà¯à®±à®™à¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯.',
+'tooltip-compareselectedversions' => 'இப௠பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ இரணà¯à®Ÿà¯ பதிபà¯à®ªà¯à®•à¯à®•à®³à¯à®•à¯à®•à¯ இடையிலான வேறà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯.',
+'tooltip-watch' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ உஙà¯à®•à®³à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ சேரà¯à®•à¯à®•à®µà¯à®®à¯',
+'tooltip-watchlistedit-normal-submit' => 'தலைபà¯à®ªà¯à®•à®³à¯ˆ நீகà¯à®•à¯',
+'tooltip-watchlistedit-raw-submit' => 'கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆ இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯',
+'tooltip-recreate' => 'à®à®±à¯à®•à®©à®µà¯‡ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯à®®à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à¯',
+'tooltip-upload' => 'பதிவேறà¯à®±à®¤à¯à®¤à¯ˆ தொடஙà¯à®•à¯',
+'tooltip-rollback' => '"à®®à¯à®©à¯à®ªà®¿à®°à¯à®¨à¯à®¤ நிலைகà¯à®•à¯à®•à¯ கொணà¯à®Ÿà¯à®µà®°à¯à®¤à®²à¯" எனà¯à®ªà®¤à¯ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ அனைதà¯à®¤à¯ˆà®¯à¯à®®à¯ பழையபடி இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®²à¯ கடைசி பயனர௠தொகà¯à®¤à¯à®¤ நிலைகà¯à®•à¯ ஒரே ஒர௠சொடà¯à®•à¯à®•à®¿à®²à¯ கொணà¯à®Ÿà¯à®µà®°à¯à®®à¯.',
+'tooltip-undo' => '"பினà¯à®µà®¾à®™à¯à®•à¯" எனà¯à®ªà®¤à¯ à®®à¯à®©à¯à®ªà¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯à®•à®¿à®±à®¤à¯. மேலà¯à®®à¯ தாஙà¯à®•à®³à¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà®¿à®©à¯ˆ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®± நிலைகà¯à®•à¯ கொணà¯à®Ÿà¯à®µà®¨à¯à®¤à¯ காடà¯à®Ÿà¯à®®à¯. அத௠தஙà¯à®•à®³à¯à®•à¯à®•à¯à®šà¯ சிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯à®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ அதறà¯à®•à®¾à®© காரணதà¯à®¤à¯ˆà®•à¯ கூற அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯.',
+'tooltip-preferences-save' => 'விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ சேமி',
+'tooltip-summary' => 'கà¯à®±à¯à®•à®¿à®¯ சà¯à®°à¯à®•à¯à®•à®¤à¯à®¤à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯.',
# Metadata
'notacceptable' => 'உஙà¯à®•à®³à®¤à¯ சேவையாளர௠வாசிகà¯à®• கூடிய விததà¯à®¤à®¿à®²à¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¾à®² தரவà¯à®•à®³à¯ˆ வழஙà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
@@ -2631,9 +2684,6 @@ $1',
# Patrol log
'patrol-log-page' => 'ரோநà¯à®¤à¯à®ªà¯ பதிகை',
'patrol-log-header' => 'இத௠ரோநà¯à®¤à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ பரிசீலனைகளà¯à®•à¯à®•à®¾à®© கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯.',
-'patrol-log-line' => '$1 பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ $2 திரà¯à®¤à¯à®¤à®¤à¯à®¤à¯ˆ ரோநà¯à®¤à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®•à®•à¯ கà¯à®±à®¿à®¤à¯à®¤à®¾à®°à¯ $3',
-'patrol-log-auto' => '(தனà¯à®©à®¿à®šà¯à®šà¯ˆà®¯à®¾à®•)',
-'patrol-log-diff' => 'திரà¯à®¤à¯à®¤à®®à¯ $1',
'log-show-hide-patrol' => '$1 ரோநà¯à®¤à¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯',
# Image deletion
@@ -2652,22 +2702,24 @@ $1',
'nextdiff' => 'அடà¯à®¤à¯à®¤ தொகà¯à®ªà¯à®ªà¯ →',
# Media information
-'mediawarning' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ''': இநà¯à®¤à®•à¯ கோபà¯à®ªà¯ வகை கேடà¯à®µà®¿à®³à¯ˆà®µà®¿à®•à¯à®•à®•à¯ கூடிய நிரலைக௠கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯.
+'mediawarning' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ''': இநà¯à®¤à®•à¯ கோபà¯à®ªà¯ வகை கேடà¯à®µà®¿à®³à¯ˆà®µà®¿à®•à¯à®•à®•à¯ கூடிய நிரலைக௠கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯.
இதனை செயறà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®µà®¤à®©à¯ மூலம௠உஙà¯à®•à®³à¯ கணனியின௠பாதà¯à®•à®¾à®ªà¯à®ªà¯ கேளà¯à®µà®¿à®•à¯à®±à®¿à®¯à®¾à®•à®²à®¾à®®à¯.",
-'imagemaxsize' => "படிமஙà¯à®•à®³à®¿à®©à¯ உசà¯à®š அளவà¯:<br />''(கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ விவர பகà¯à®•à®™à¯à®•à®³à¯à®•à¯à®•à¯)''",
-'thumbsize' => 'சிற௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®¤à¯à®¤à®¿à®©à¯ பரிமாணமà¯:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|பகà¯à®•à®®à¯|பகà¯à®•à®™à¯à®•à®³à¯}}',
-'file-info' => 'கோபà¯à®ªà®¿à®©à¯ அளவà¯: $1, MIME வகை: $2',
-'file-info-size' => '$1 × $2 படவணà¯à®•à¯à®•à®³à¯, கோபà¯à®ªà®¿à®©à¯ அளவà¯: $3, MIME வகை: $4',
-'file-nohires' => '<small>இதைவிட அளவில௠பெரிய படிமம௠இலà¯à®²à¯ˆ.</small>',
-'svg-long-desc' => 'SVG கோபà¯à®ªà¯, பெயரளவில௠$1 × $2 பிகà¯à®šà®²à¯à®•à®³à¯, கோபà¯à®ªà¯ அளவà¯: $3',
-'show-big-image' => 'à®®à¯à®´à¯ அளவிலான படிமமà¯',
-'show-big-image-size' => '$1 × $2 படபà¯à®ªà¯à®³à¯à®³à®¿à®•à®³à¯',
-'file-info-gif-looped' => 'வளயமிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.(looped)',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|சடà¯à®Ÿà®•à®®à¯|சடà¯à®Ÿà®•à®™à¯à®•à®³à¯}}',
-'file-info-png-looped' => 'வளயமிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.(looped)',
-'file-info-png-repeat' => 'ஓடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ $1 {{PLURAL:$1|à®®à¯à®±à¯ˆ|à®®à¯à®±à¯ˆà®•à®³à¯}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|சடà¯à®Ÿà®•à®®à¯|சடà¯à®Ÿà®•à®™à¯à®•à®³à¯}}',
+'imagemaxsize' => "படிமஙà¯à®•à®³à®¿à®©à¯ உசà¯à®š அளவà¯:<br />''(கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ விவர பகà¯à®•à®™à¯à®•à®³à¯à®•à¯à®•à¯)''",
+'thumbsize' => 'சிற௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®¤à¯à®¤à®¿à®©à¯ பரிமாணமà¯:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|பகà¯à®•à®®à¯|பகà¯à®•à®™à¯à®•à®³à¯}}',
+'file-info' => 'கோபà¯à®ªà®¿à®©à¯ அளவà¯: $1, MIME வகை: $2',
+'file-info-size' => '$1 × $2 படவணà¯à®•à¯à®•à®³à¯, கோபà¯à®ªà®¿à®©à¯ அளவà¯: $3, MIME வகை: $4',
+'file-nohires' => 'இதைவிட அளவில௠பெரிய படிமம௠இலà¯à®²à¯ˆ.',
+'svg-long-desc' => 'SVG கோபà¯à®ªà¯, பெயரளவில௠$1 × $2 பிகà¯à®šà®²à¯à®•à®³à¯, கோபà¯à®ªà¯ அளவà¯: $3',
+'show-big-image' => 'à®®à¯à®´à¯ அளவிலான படிமமà¯',
+'show-big-image-preview' => 'இநà¯à®¤ à®®à¯à®©à¯à®©à¯‹à®Ÿà¯à®Ÿà®¤à¯à®¤à®¿à®©à¯ அளவà¯: $1 .',
+'show-big-image-other' => 'மறà¯à®± {{PLURAL:$2|பிரிதிறனà¯|பிரிதிறனà¯à®•à®³à¯}}: $1 .',
+'show-big-image-size' => '$1 × $2 படபà¯à®ªà¯à®³à¯à®³à®¿à®•à®³à¯',
+'file-info-gif-looped' => 'வளயமிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.(looped)',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|சடà¯à®Ÿà®•à®®à¯|சடà¯à®Ÿà®•à®™à¯à®•à®³à¯}}',
+'file-info-png-looped' => 'வளயமிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.(looped)',
+'file-info-png-repeat' => 'ஓடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ $1 {{PLURAL:$1|à®®à¯à®±à¯ˆ|à®®à¯à®±à¯ˆà®•à®³à¯}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|சடà¯à®Ÿà®•à®®à¯|சடà¯à®Ÿà®•à®™à¯à®•à®³à¯}}',
# Special:NewFiles
'newimages' => 'பà¯à®¤à®¿à®¯ படிமஙà¯à®•à®³à¯ பகà¯à®•à®®à¯',
@@ -2681,6 +2733,13 @@ $1',
'bydate' => 'நாள௠வழி',
'sp-newimages-showfrom' => '$1, $2கà¯à®•à¯à®ªà¯ பினà¯à®©à®°à®¾à®© பà¯à®¤à®¿à®¯à®•à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1வினாடி| $1 வினாடிகளà¯}}',
+'minutes' => '{{PLURAL:$1|$1நிமிடமà¯| $1 நிமிடஙà¯à®•à®³à¯}}',
+'hours' => '{{PLURAL:$1|$1மணி| $1 மணிகளà¯}}',
+'days' => '{{PLURAL:$1|$1நாளà¯|$1 நாடà¯à®•à®³à¯}}',
+'ago' => '$1 à®®à¯à®©à¯à®ªà¯',
+
# Bad image list
'bad_image_list' => 'à®®à¯à®±à¯ˆ பினà¯à®µà®°à¯à®®à®¾à®±à¯:
@@ -3164,9 +3223,6 @@ $5
'scarytranscludefailed' => '[$1 பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à®¾à®© வாபà¯à®ªà¯à®°à¯à®ªà¯†à®±à¯ à®®à¯à®¯à®±à¯à®šà®¿à®¤à¯ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯]',
'scarytranscludetoolong' => '[இணைய à®®à¯à®•à®µà®°à®¿ மிகவà¯à®®à¯ நீளமானதà¯]',
-# Trackbacks
-'trackbackremove' => '([$1 நீகà¯à®•à¯])',
-
# Delete conflict
'deletedwhileediting' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ''': நீஙà¯à®•à®³à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ தொகà¯à®•à¯à®• தொடஙà¯à®•à®¿à®¯à®ªà¯ பின௠அத௠நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯!",
'confirmrecreate' => "நீஙà¯à®•à®³à¯ தொகà¯à®•à¯à®• தொடஙà¯à®•à®¿à®¯à®ªà¯ பினà¯à®© பயனர௠[[User:$1|$1]] ([[User talk:$1|பேசà¯à®šà¯]]) இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à®¿à®¯à¯à®³à¯à®³à®¾à®°à¯ தரபà¯à®ªà®Ÿà¯à®Ÿà®•à¯ காரணமà¯:
@@ -3246,6 +3302,9 @@ $5
'watchlisttools-edit' => 'எனà¯à®•à®µà®©à®¿à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆ பாரà¯à®¤à¯à®¤à¯ தொகà¯',
'watchlisttools-raw' => 'விகà¯à®•à®¿ நிரலறà¯à®±à®•à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆà®¤à¯ தொகà¯',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|பேசà¯à®šà¯]])',
+
# Core parser functions
'unknown_extension_tag' => 'அறியபà¯à®ªà®Ÿà®¾à®¤ நீடà¯à®šà®¿ வகை "$1"',
'duplicate-defaultsort' => "''' எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ:''' இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯ விசை ''\$2 \" à®®à¯à®©à¯à®©à®¾à®²à¯ இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯ விசை\" \$1 \" ஠மீறà¯à®•à®¿à®±à®¤à¯.",
@@ -3298,8 +3357,8 @@ $5
# Special:SpecialPages
'specialpages' => 'சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯',
'specialpages-note' => '----
-* சாதாரண சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯.
-* <strong class="mw-specialpagerestricted">கடà¯à®Ÿà¯à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯.</strong>',
+ * சராசரி சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯.
+ * <span class="mw-specialpagerestricted">வரையறà¯à®¤à¯à®¤ சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯.</span>',
'specialpages-group-maintenance' => 'பராமரிபà¯à®ªà¯ அறிகà¯à®•à¯ˆà®•à®³à¯',
'specialpages-group-other' => 'à®à®©à¯ˆà®¯ சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯',
'specialpages-group-login' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ / கணகà¯à®•à¯ தொடகà¯à®•à®®à¯',
@@ -3341,13 +3400,16 @@ $5
'tags-hitcount' => '$1 {{PLURAL:$1|மாறà¯à®±à®®à¯|மாறà¯à®±à®™à¯à®•à®³à¯}}',
# Special:ComparePages
-'comparepages' => 'பகà¯à®•à®™à¯à®•à®³à¯ˆ ஒபà¯à®ªà®¿à®Ÿà¯',
-'compare-selector' => 'பகà¯à®• பரிசீலனைகளை ஒபà¯à®ªà®¿à®Ÿà¯',
-'compare-page1' => 'பகà¯à®•à®®à¯ 1',
-'compare-page2' => 'பகà¯à®•à®®à¯ 2',
-'compare-rev1' => 'திரà¯à®¤à¯à®¤à®®à¯ 1',
-'compare-rev2' => 'திரà¯à®¤à¯à®¤à®®à¯ 2',
-'compare-submit' => 'ஒபà¯à®ªà®¿à®Ÿà¯',
+'comparepages' => 'பகà¯à®•à®™à¯à®•à®³à¯ˆ ஒபà¯à®ªà®¿à®Ÿà¯',
+'compare-selector' => 'பகà¯à®• பரிசீலனைகளை ஒபà¯à®ªà®¿à®Ÿà¯',
+'compare-page1' => 'பகà¯à®•à®®à¯ 1',
+'compare-page2' => 'பகà¯à®•à®®à¯ 2',
+'compare-rev1' => 'திரà¯à®¤à¯à®¤à®®à¯ 1',
+'compare-rev2' => 'திரà¯à®¤à¯à®¤à®®à¯ 2',
+'compare-submit' => 'ஒபà¯à®ªà®¿à®Ÿà¯',
+'compare-invalid-title' => 'நீஙà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ தலைபà¯à®ªà¯ செலà¯à®²à®¾à®¤à®¤à¯.',
+'compare-title-not-exists' => 'நீஙà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ தலைபà¯à®ªà¯ இலà¯à®²à¯ˆ.',
+'compare-revision-not-exists' => 'நீஙà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ பரிசீலனை இலà¯à®²à¯ˆ.',
# Database error messages
'dberr-header' => 'இநà¯à®¤ விகà¯à®•à®¿à®•à¯à®•à¯à®’ர௠கோளாற௠உளà¯à®³à®¤à¯',
@@ -3375,4 +3437,90 @@ $5
'sqlite-has-fts' => '$1à®®à¯à®´à¯-உரை தேடல௠ஆதரவà¯à®Ÿà®©à¯',
'sqlite-no-fts' => '$1à®®à¯à®´à¯-உரை தேடல௠ஆதரவ௠இலà¯à®²à®¾à®®à®²à¯',
+# New logging system
+'logentry-delete-delete' => '$1 நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®®à¯$3',
+'logentry-delete-restore' => '$1 மீடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®®à¯$3',
+'logentry-delete-event' => '$1 மாறà¯à®±à®¿à®¯ காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆ {{PLURAL:$5| ஒர௠நிகழà¯à®µà¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯| $5 நிகழà¯à®µà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯}} இதில௠$3 :$4',
+'logentry-delete-revision' => '$1 மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿ காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆà®•à¯à®•à¯ {{PLURAL:$5| à®’à®°à¯à®ªà®°à®¿à®šà¯€à®²à®©à¯ˆ| $5 பரிசீலனைகளà¯à®•à¯à®•à¯à®®à¯}} இநà¯à®¤ பகà¯à®•à®®à¯ $3 :$4',
+'logentry-delete-event-legacy' => '$1 மாறà¯à®±à®¿à®¯à®¤à¯ பகà¯à®•à®®à¯ $3 லà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯ நிகழà¯à®µà¯à®•à®³à¯à®•à¯à®•à®¾à®© காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆ .',
+'logentry-delete-revision-legacy' => '$1 மாறà¯à®±à®¿à®¯à®¤à¯ பகà¯à®•à®®à¯ $3 ல௠பரிசீலனைகளà¯à®•à¯à®•à®¾à®© காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆ',
+'logentry-suppress-delete' => '$1 நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®®à¯$3',
+'logentry-suppress-event' => '$1 இரகசியமாக மாறà¯à®±à®¿à®¯ காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆà®¯à®¿à®©à¯ {{PLURAL:$5| ஒர௠நிகழà¯à®µà¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯| $5 நிகழà¯à®µà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯}} $3 :$4 லà¯.',
+'logentry-suppress-revision' => '$1 இரகசியமாக மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿ காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆà®•à¯à®•à¯ {{PLURAL:$5| à®’à®°à¯à®ªà®°à®¿à®šà¯€à®²à®©à¯ˆ| $5 பரிசீலனைகளà¯}} இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ $3 :$4',
+'logentry-suppress-event-legacy' => '$1 இரகசியமாக மாறà¯à®±à®¿à®¯à®¤à¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯ நிகழà¯à®µà¯à®•à®³à¯à®•à¯à®•à®¾à®© காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆ $3 லà¯.',
+'logentry-suppress-revision-legacy' => '$1 இரகசியமாக மாறà¯à®±à®¿à®¯à®¤à¯ பகà¯à®•à®®à¯ $3 ல௠பரிசீலனைகளà¯à®•à¯à®•à®¾à®© காடà¯à®šà®¿à®¤à¯à®¤à®©à¯à®®à¯ˆ',
+'revdelete-content-hid' => 'உளà¯à®³à®Ÿà®•à¯à®•à®®à¯ மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
+'revdelete-summary-hid' => 'திரà¯à®¤à¯à®¤à¯à®¤à®²à¯ சà¯à®°à¯à®•à¯à®•à®®à¯ மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'revdelete-uname-hid' => 'பயனர௠பெயர௠மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
+'revdelete-content-unhid' => 'உளà¯à®³à®Ÿà®•à¯à®•à®®à¯ மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
+'revdelete-summary-unhid' => 'திரà¯à®¤à¯à®¤à¯à®¤à®²à¯ சà¯à®°à¯à®•à¯à®•à®®à¯ மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'revdelete-uname-unhid' => 'பயனர௠பெயர௠மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'revdelete-restricted' => 'நிரà¯à®µà®¾à®•à®¿à®•à®³à¯à®•à¯à®•à¯ கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ விதிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'revdelete-unrestricted' => 'நிரà¯à®µà®¾à®•à®¿à®•à®³à®¿à®©à¯ கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'logentry-move-move' => '$1 பயனரால௠$3, $4 எனà¯à®± தலைபà¯à®ªà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
+'logentry-move-move-noredirect' => '$1, $3 பகà¯à®•à®¤à¯à®¤à¯ˆ $4 எனà¯à®± தலைபà¯à®ªà¯à®•à¯à®•à¯ வழிமாறà¯à®±à¯ இனà¯à®±à®¿ நகரà¯à®¤à¯à®¤à®¿à®¯à¯à®³à¯à®³à®¾à®°à¯',
+'logentry-move-move_redir' => '$1 பகà¯à®•à®®à¯ $3 à® $4 கà¯à®•à¯ à®®à¯à®©à¯à®©à®¿à®°à¯à®¨à¯à®¤ வழிமாறà¯à®±à®¿à®©à¯ மேலாக நகரà¯à®¤à¯à®¤à®¿à®¯à¯à®³à¯à®³à®¾à®°à¯',
+'logentry-move-move_redir-noredirect' => '$1 பகà¯à®•à®®à¯ $3 à® $4 கà¯à®•à¯ à®®à¯à®©à¯à®©à®¿à®°à¯à®¨à¯à®¤ வழிமாறà¯à®±à®¿à®©à¯ மேலாக, இனà¯à®©à¯Šà®°à¯ வழிமாறà¯à®±à®¿à®©à¯à®±à®¿ நகரà¯à®¤à¯à®¤à®¿à®¯à¯à®³à¯à®³à®¾à®°à¯',
+'logentry-patrol-patrol' => ' பகà¯à®•à®®à¯ $3 ன௠பரிசீலனை $4 ஆனத௠ரோநà¯à®¤à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ என $1 கà¯à®±à®¿à®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. .',
+'logentry-patrol-patrol-auto' => 'தானாக பகà¯à®•à®®à¯ $3 ன௠பரிசீலனை $4 ஆனத௠ரோநà¯à®¤à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ என $1 கà¯à®±à®¿à®¯à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. .',
+'logentry-newusers-newusers' => 'பயனர௠கணகà¯à®•à¯ $1 உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'logentry-newusers-create' => '$1 ஒர௠பà¯à®¤à®¿à®¯ பயனர௠கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®¿à®¯à¯à®³à¯à®³à®¾à®°à¯.',
+'logentry-newusers-create2' => '$3 பயனர௠கணகà¯à®•à®¿à®©à¯ˆ $1 உரà¯à®µà®¾à®•à¯à®•à®¿à®©à®¾à®°à¯',
+'logentry-newusers-autocreate' => 'கணகà¯à®•à¯ $1 தானாக உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'newuserlog-byemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ மூலம௠கடவà¯à®šà¯à®šà¯Šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯',
+
+# Feedback
+'feedback-bugornote' => 'நீஙà¯à®•à®³à¯ ஒர௠தொழிலà¯à®¨à¯à®Ÿà¯à®ªà®•à¯ கோளாற௠கà¯à®±à®¿à®¤à¯à®¤à¯ விரிவாக விளகà¯à®• தாயாராக இரà¯à®¨à¯à®¤à®¾à®²à¯ தயவà¯à®šà¯†à®¯à¯à®¤à¯ [ $1 ஒர௠bug பறà¯à®±à®¿ கூறà¯].
+இலà¯à®²à¯ˆà®¯à¯†à®©à®¿à®²à¯, நீஙà¯à®•à®³à¯ கீழேயà¯à®³à¯à®³ எளிதான படிவதà¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¾à®®à¯.உஙà¯à®•à®³à¯ கரà¯à®¤à¯à®¤à¯à®°à¯ˆ "[$3 $2]" பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ உஙà¯à®•à®³à¯ பயனர௠பெயர௠மறà¯à®±à¯à®®à¯ உஙà¯à®•à®³à¯ உலாவியின௠பெயரà¯à®Ÿà®©à¯ சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯.',
+'feedback-subject' => 'பொரà¯à®³à¯:',
+'feedback-message' => 'தகவலà¯:',
+'feedback-cancel' => 'விடà¯à®Ÿà¯à®µà®¿à®Ÿà¯',
+'feedback-submit' => 'கரà¯à®¤à¯à®¤à¯ˆà®šà¯ சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•à®µà¯à®®à¯',
+'feedback-adding' => 'பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ கரà¯à®¤à¯à®¤à¯ˆà®šà¯ சேரà¯à®•à¯à®•à®¿à®±à®¤à¯...',
+'feedback-error1' => 'பிழை: API லிரà¯à®¨à¯à®¤à¯ à®…à®™à¯à®•à¯€à®•à®°à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®¤ à®®à¯à®Ÿà®¿à®µà¯.',
+'feedback-error2' => 'பிழை: திரà¯à®¤à¯à®¤à®²à¯ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯',
+'feedback-error3' => 'பிழை: API லிரà¯à®¨à¯à®¤à¯ பதிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯ எதà¯à®µà¯à®®à¯ இலà¯à®²à¯ˆ.',
+'feedback-thanks' => 'நனà¯à®±à®¿! உஙà¯à®•à®³à¯ கரà¯à®¤à¯à®¤à¯à®•à®³à¯ "[$2 $1]" பகà¯à®•à®¤à¯à®¤à®¿à®²à¯à®ªà®¤à®¿à®µà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ .',
+'feedback-close' => 'à®®à¯à®Ÿà®¿à®¨à¯à®¤à®¤à¯',
+'feedback-bugcheck' => 'சிறபà¯à®ªà¯! அத௠à®à®±à¯à®•à®©à®µà¯‡ [ $1 தெரிநà¯à®¤ bugs ] எனà¯à®ªà®¤à¯ˆ மடà¯à®Ÿà¯à®®à¯ சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯,',
+'feedback-bugnew' => 'நான௠சரிபாரà¯à®¤à¯à®¤à®¾à®¯à®¿à®±à¯à®±à¯. பà¯à®¤à®¿à®¯ bug பறà¯à®±à®¿ கூறà¯.',
+
+# API errors
+'api-error-badaccess-groups' => 'இநà¯à®¤ விகà¯à®•à®¿à®•à¯à®•à¯à®•à¯ கோபà¯à®ªà¯à®•à®³à¯ˆà®ªà¯ பதிவேறà¯à®±à¯à®µà®¤à®±à¯à®•à¯ நீஙà¯à®•à®³à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+'api-error-badtoken' => 'உளà¯à®³à®•à®ªà¯ பிழை: தவறான அடையாளமà¯.',
+'api-error-copyuploaddisabled' => 'உரலி மூலம௠பதிவேறà¯à®±à¯à®µà®¤à¯ இநà¯à®¤ வழஙà¯à®•à®¿à®¯à®¿à®²à¯ செயலிழகà¯à®•à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'api-error-duplicate' => 'There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.',
+'api-error-duplicate-archive' => 'à®à®±à¯à®•à®©à®µà¯‡ இதà¯à®¤à®³à®¤à¯à®¤à®¿à®²à¯ இதே உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯à®¤à¯ˆà®•à¯ கொணà¯à®Ÿ {{PLURAL:$1|கோபà¯à®ªà¯ [$2 இரà¯à®¨à¯à®¤à®¤à¯]|[$2 கோபà¯à®ªà¯à®•à®³à¯ இரà¯à®¨à¯à®¤à®©]}}, ஆனால௠{{PLURAL:$1|அத௠நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯|அவை நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®©.}}',
+'api-error-duplicate-archive-popup-title' => 'Duplicate {{PLURAL:$1|file|files}} that have already been deleted',
+'api-error-duplicate-popup-title' => 'போலி {{PLURAL:$1|கோபà¯à®ªà¯|கோபà¯à®ªà¯à®•à®³à¯}}',
+'api-error-empty-file' => 'நீஙà¯à®•à®³à¯ அளிதà¯à®¤ கோபà¯à®ªà¯ காலியாக உளà¯à®³à®¤à¯.',
+'api-error-emptypage' => 'பà¯à®¤à®¿à®¯, காலி பகà¯à®•à®™à¯à®•à®³à¯ உரà¯à®µà®¾à®•à¯à®•à®²à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+'api-error-fetchfileerror' => 'உளà¯à®³à®•à®ªà¯ பிழை: கோபà¯à®ªà¯ˆà®ªà¯ பெறà¯à®•à¯ˆà®¯à®¿à®²à¯ à®à®¤à¯‹ தவற௠நேரà¯à®¨à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯.',
+'api-error-file-too-large' => 'நீஙà¯à®•à®³à¯ அளிதà¯à®¤ கோபà¯à®ªà¯ மிகவà¯à®®à¯ பெரியதாக உளà¯à®³à®¤à¯.',
+'api-error-filename-tooshort' => 'கோபà¯à®ªà¯à®ªà¯ பெயர௠மிகவà¯à®®à¯ சிறியதாக உளà¯à®³à®¤à¯.',
+'api-error-filetype-banned' => 'இகà¯à®•à¯‹à®ªà¯à®ªà¯ வகை தடைசெயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'api-error-filetype-missing' => 'கோபà¯à®ªà®¿à®²à¯ ஒர௠விரிவ௠விடà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯.',
+'api-error-hookaborted' => 'நீஙà¯à®•à®³à¯ செயà¯à®¯ à®®à¯à®¯à®©à¯à®± மாறà¯à®±à®®à¯ ஒர௠விரிவாகà¯à®•à®¤à¯à®¤à®¾à®²à¯ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'api-error-http' => 'உளà¯à®³à®•à®ªà¯ பிழை: வழஙà¯à®•à®¿à®¯à¯à®Ÿà®©à¯ இணைகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ',
+'api-error-illegal-filename' => 'இகà¯à®•à¯‹à®ªà¯à®ªà¯à®ªà¯ பெயர௠அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®®à®¾à®Ÿà¯à®Ÿà®¾à®¤à¯.',
+'api-error-internal-error' => 'உளà¯à®³à®•à®ªà¯ பிழை: உஙà¯à®•à®³à¯ பதிவேறà¯à®±à®¤à¯à®¤à¯ˆ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®®à¯à®ªà¯‹à®¤à¯ à®à®¤à¯‹ தவற௠நேரà¯à®¨à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯.',
+'api-error-invalid-file-key' => 'உளà¯à®³à®•à®ªà¯ பிழை: தறà¯à®•à®¾à®²à®¿à®•à®šà¯ சேமிபà¯à®ªà®¿à®²à¯ கோபà¯à®ªà¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+'api-error-missingparam' => 'உளà¯à®³à®•à®ªà¯ பிழை: கோரிகà¯à®•à¯ˆà®¯à®¿à®²à¯ அளபà¯à®°à¯à®•à¯à®•à®³à¯ விடà¯à®ªà®Ÿà¯à®•à®¿à®©à¯à®±à®©.',
+'api-error-missingresult' => 'உளà¯à®³à®•à®ªà¯ பிழை: நகல௠வெறà¯à®±à®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à®¾ எனà¯à®±à¯ தீரà¯à®®à®¾à®£à®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
+'api-error-mustbeloggedin' => 'கோபà¯à®ªà¯à®•à®³à¯ˆà®ªà¯ பதிவேறà¯à®± நீஙà¯à®•à®³à¯ கணà¯à®Ÿà®¿à®ªà¯à®ªà®¾à®•à®ªà¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¤à®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.',
+'api-error-mustbeposted' => 'உளà¯à®³à®•à®ªà¯ பிழை: கோரிகà¯à®•à¯ˆà®•à¯à®•à¯ HTTP POST தேவை.',
+'api-error-noimageinfo' => 'பதிவேறà¯à®±à®®à¯ வெறà¯à®±à®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯, ஆனால௠வழஙà¯à®•à®¿ கோபà¯à®ªà¯ˆà®ªà¯ பறà¯à®±à®¿à®¯ எநà¯à®¤ ஒர௠தகவலையà¯à®®à¯ எஙà¯à®•à®³à¯à®•à¯à®•à¯à®¤à¯ தரவிலà¯à®²à¯ˆ.',
+'api-error-nomodule' => 'உளà¯à®³à®•à®ªà¯ பிழை: பதிவேறà¯à®±à®ªà¯ பகà¯à®¤à®¿ அமைகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+'api-error-ok-but-empty' => 'உளà¯à®³à®•à®ªà¯ பிழை: வழஙà¯à®•à®¿à®¯à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பதில௠வரவிலà¯à®²à¯ˆ',
+'api-error-overwrite' => 'à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³ கோபà¯à®ªà®¿à®©à¯ மேலெழà¯à®¤à¯à®µà®¤à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®®à®¾à®Ÿà¯à®Ÿà®¾à®¤à¯.',
+'api-error-stashfailed' => 'உளà¯à®³à®•à®ªà¯ பிழை: வழஙà¯à®•à®¿ தறà¯à®•à®¾à®²à®¿à®•à®•à¯ கோபà¯à®ªà¯ˆà®¤à¯ தேகà¯à®•à®¤à¯ தவறிவிடà¯à®Ÿà®¤à¯.',
+'api-error-timeout' => 'எதிரà¯à®ªà®¾à®°à¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ நேரதà¯à®¤à®¿à®²à¯ வழஙà¯à®•à®¿ பதிலளிகà¯à®•à®µà®¿à®²à¯à®²à¯ˆ.',
+'api-error-unclassified' => 'அறியாப௠பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'api-error-unknown-code' => 'அறியாப௠பிழை: "$1"',
+'api-error-unknown-error' => 'உளà¯à®³à®•à®ªà¯ பிழை: உஙà¯à®•à®³à¯ கோபà¯à®ªà¯ˆà®ªà¯ பதிவேறà¯à®± à®®à¯à®¯à®²à¯à®•à¯ˆà®¯à®¿à®²à¯ à®à®¤à¯‹ தவற௠நேரà¯à®¨à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯.',
+'api-error-unknown-warning' => 'அறியபà¯à®ªà®Ÿà®¾ எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: $1',
+'api-error-unknownerror' => 'அறியபà¯à®ªà®Ÿà®¾à®¤ பிழை: " $1 ".',
+'api-error-uploaddisabled' => 'இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ பதிவேறà¯à®±à®²à¯ செயலிழகà¯à®•à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'api-error-verification-error' => 'இகà¯à®•à¯‹à®ªà¯à®ªà¯ பிழையà¯à®Ÿà®©à¯‹ தவறான விரிவà¯à®Ÿà®©à¯‹ இரà¯à®•à¯à®•à®²à®¾à®®à¯.',
+
);
diff --git a/languages/messages/MessagesTcy.php b/languages/messages/MessagesTcy.php
index 2a74ca46..cdbd5a8d 100644
--- a/languages/messages/MessagesTcy.php
+++ b/languages/messages/MessagesTcy.php
@@ -340,15 +340,19 @@ $messages = array(
'formerror' => 'ದೋಷ: ಅರà³à²œà²¿à²¨à³ ಕಡಪà³à²¡à²¿à²¯à³†à²°à³ ಆಯಿಜಿ',
'badarticleerror' => 'ಈ ಪà³à²Ÿà²¡à³ ಈರೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¾à²¨ ಕಾರà³à²¯ ಸಾದà³à²¯ ಇಜà³à²œà²¿',
'cannotdelete' => 'ಪà³à²Ÿ ಅಥವಾ ಹೊತà³à²¤à²—ೆ "$1" ನೠಮಾಜಾವರ ಆಪà³à²œà³à²œà²¿.(ಬೇತೆ ಎರೋ ಮಾಜಾದಿಪà³à²ªà³†à²°à³)',
+'cannotdelete-title' => '"$1" ಮಾಜಾವರೆ ಆಪà³à²œà³à²œà²¿',
'badtitle' => 'ಸರಿ ಇಜà³à²œà²¾à²‚ದಿನ ಪà³à²¦à²°à³',
'badtitletext' => 'ಈರೠಕೋರಿನ ಪà³à²Ÿà²¦ ಶೀರà³à²·à²¿à²•à³† ಸಿಂಧೠಅತà³à²¤à³ ಅಥವಾ ಖಾಲಿ ಅಥವಾ ಸರಿಯಾತà³â€˜à²¨ ಕೊಂಡಿಯತà³à²¤à²¾à²‚ದಿನ ಅಂತರ ಭಾಷೆ/ಅಂತರ ವಿಕಿ ಸಂಪರà³à²•.
à²à²Ÿà³ ಒಂಜಿ ಅಥವಾ ಹೆಚà³à²šà²¿ ಶೀರà³à²·à²¿à²•à³†à²¡à³ ಬಳಕೆ ಮಲà³à²ªà²° ನಿಷಿದà³à²¦à³à²œà²µà²¾à²¯à²¿à²¨ ಅಕà³à²·à²°à²³à³ ಇಪà³à²ªà³.',
+'perfcached' => 'ಈ ಮಾಹಿತಿಲೠಕಂಪà³à²¯à³à²Ÿà²°à³â€˜à²¦ ತಾತà³à²•à²¾à²²à²¿à²• ನೆನೆಪà³à²¡à³â€˜à²¦à³ ಬತà³à²¤à³â€˜à²¦à³â€˜à²¨ ಬೊಕà³à²• ಸರಿಯಾನ ಸà³à²¥à²¿à²¤à²¿ ಆದಿಪà³à²ªà²¾à²‚ದೠA maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ಈ ತಿರà³à²¤ ಮಾಹಿತಿ ಕಂಪà³à²¯à³‚ಟರà³â€˜à²¦ ತಾತà³à²•à²¾à²²à²¿à²• ನೆನಪà³à²¡à³ ಉಂಡà³. ದೆತà³à²¤ ಕಡೆತ ಬದಲಾವಣೆ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'ಈ ಪà³à²Ÿà³Šà²¤à³à²¤ ಆಧà³à²¨à²¿à²• ಮಲà³à²ªà³à²¨ ಕà³à²°à²¿à²¯à³†à²¨à³ ಸದà³à²¯à²—ೠಉಂತಾದà³à²‚ಡà³. ಮà³à²²à³à²ª ಉಪà³à²ªà³à²¨ ಮಾಹಿತಿನೠನವೀಕರಣ ಮಲà³à²ªà²°à²¾à²ªà³à²œà²¿',
'viewsource' => 'ಮೂಲ ಬರಹೊನೠತೂಲೆ',
-'viewsourcefor' => '$1 ಪà³à²Ÿà³Šà²—à³',
+'viewsource-title' => ' $1 ಮೂಲ ಬರಹ ತೂಲೆ',
'actionthrottled' => 'ಕಾರà³à²¯à²¨à³ ದೆಂಗಾದà³à²‚ಡà³',
'protectedpagetext' => 'ಈ ಪà³à²Ÿà²¨à³ ಸಂಪಾದನೆ ಮಲà³à²ªà²‚ದಿಲೆಕà³à²• ಸಂರಕà³à²·à²£à³† ಮಲà³à²¤à³â€˜à²‚ಡà³',
'viewsourcetext' => 'ಈರೠಈ ಪà³à²Ÿà²¦ ಮೂಲನೠತೂವೊಲಿ ಬೊಕà³à²• ನಕಲೠಮಲà³à²ªà³Šà²²à²¿',
+'viewyourtext' => 'ಈರೠಈ ಪà³à²Ÿà²¦ ಮೂಲನೠತೂವೊಲಿ ಬೊಕà³à²• ನಕಲೠಮಲà³à²ªà³Šà²²à²¿',
'protectedinterface' => 'ಈ ಪà³à²Ÿ ತಂತà³à²°à²¾à²‚ಶ ಉಪಯೋಗ ಮಲà³à²ªà³à²¨ ಪಠà³à²¯à²¨à³ ಒದಗಿಸಾಪà³à²‚ಡà³. ದà³à²°à³à²ªà²¯à³‹à²— ಅವಂದಿಲೆಕà³à²• ಇದೆನೠಸಂರಕà³à²·à²£à³† ಮಲà³à²¤à³â€˜à²‚ಡà³.',
'ns-specialprotected' => 'ವಿಶೇಷ ಪà³à²Ÿâ€˜à²•à³â€˜à²²à³†à²¨à³ ಸಂಪಾದನೆ ಮಲà³à²ªà²°à³† ಆಪà³à²œà²¿',
@@ -431,6 +435,10 @@ $messages = array(
'passwordreset-username' => 'ಸದಸà³à²¯à³†à²°à³à²¨ ಪà³à²¦à²°à³:',
'passwordreset-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸೊ',
+# Special:ChangeEmail
+'changeemail-submit' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾವಣೆ ಮಲà³à²ªà³à²²à³†',
+'changeemail-cancel' => 'ವಜಾ ಮಲà³à²ªà³à²²à³†',
+
# Edit page toolbar
'bold_sample' => 'ದಪà³à²ª ಅಕà³à²·à²°',
'bold_tip' => 'ದಪà³à²ª ಅಕà³à²·à²°à³Šà²²à³',
@@ -595,6 +603,7 @@ $messages = array(
'prefs-datetime' => 'ದಿನ ಬೊಕà³à²• ಸಮಯ',
'prefs-rc' => 'ಇಂಚಿಪದ ಬದಲಾವಣೆಲà³',
'prefs-resetpass' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à³Šà²¨à³ ಬದಲಾವಣೆ ಮಲà³à²ªà³à²²à³†',
+'prefs-changeemail' => 'ಇ-ಅಂಚೆ ವಿಳಾಸೊನೠಬದಲಾವಣೆ ಮಲà³à²ªà³à²²à³†',
'saveprefs' => 'ಒರಿಪಾಲೆ',
'rows' => 'ಸಾಲà³â€˜à²²à³',
'searchresultshead' => '
@@ -649,6 +658,7 @@ $messages = array(
'action-upload' => 'ಈ ಫೈಲà³â€˜à²¨à³ ಅಪà³â€˜à²²à³‹à²¡à³ ಮಲà³à²ªà³à²²à³†',
'action-delete' => 'ಈ ಪà³à²Ÿà³Šà²¨à³ ಮಾಜಾಲೆ',
'action-deleterevision' => 'ಈ ಆವೃತà³à²¤à²¿à²¨à³ ಮಾಜಾಲೆ',
+'action-sendemail' => 'ಇ-ಅಂಚೆ ಕಡಪà³à²¡à³à²²à³†',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲà³}}',
@@ -770,8 +780,7 @@ $messages = array(
'allpagessubmit' => 'ಪೋ',
# Special:Log/newusers
-'newuserlogpage' => 'ಸದಸà³à²¯ ರಚನೆ ಲಾಗà³',
-'newuserlog-create-entry' => 'ಪೊಸ ಸದಸà³à²¯à³†à²°à³à²¨ ಎಕೌಂಟà³',
+'newuserlogpage' => 'ಸದಸà³à²¯ ರಚನೆ ಲಾಗà³',
# Special:ListGroupRights
'listgrouprights-members' => '(ಸದಸà³à²¯à³†à²°à³à²¨ ಪಟà³à²Ÿà²¿)',
@@ -793,7 +802,6 @@ $messages = array(
# Delete
'actioncomplete' => 'ಕಾರà³à²¯ ಸಂಪೂರà³à²£',
-'deletedarticle' => '"[[$1]]" ನೆನà³à²¨à³ ದೆತà³à²¤à³ ದಾ೦ಡà³',
'dellogpage' => 'ಡಿಲೀಟೠಮಲà³à²¤à²¿à²¨ ಫೈಲà³â€™à²²à³†à²¦ ದಾಖಲೆ',
# Rollback
@@ -807,7 +815,6 @@ $messages = array(
# Undelete
'undeletelink' => 'ದà³à²‚ಬà³à²¦ ಆವೃತà³à²¤à²¿à²—ೠಪೋಲೆ',
'undeleteviewlink' => 'ತೂಲೆ',
-'undeletedarticle' => '"[[$1]]" ನೠಪಿರಕನತà³â€™à²¨à³à²¡à³',
# Namespace form on various pages
'namespace' => 'ನೇಮà³-ಸà³à²ªà³‡à²¸à³:',
@@ -939,7 +946,7 @@ $messages = array(
# Media information
'file-info-size' => '$1 × $2 ಪಿಕà³à²¸à³†à²²à³, ಫೈಲà³â€™à²¦ ಗಾತà³à²°: $3, MIME ಪà³à²°à²•à²¾à²°: $4',
-'file-nohires' => '<small>ಇಂದೆರà³à²¦à³ ಜಾಸà³à²¤à²¿ ವಿವರವಾಯಿನ ನೋಟ ಇಜà³à²œà²¿.</small>',
+'file-nohires' => 'ಇಂದೆರà³à²¦à³ ಜಾಸà³à²¤à²¿ ವಿವರವಾಯಿನ ನೋಟ ಇಜà³à²œà²¿.',
'svg-long-desc' => 'ಎಸà³.ವಿ.ಜಿ ಫೈಲà³, ಸà³à²®à²¾à²°à²¾à²¦à³ $1 × $2 ಪಿಕà³à²¸à³†à²²à³, ಫೈಲà³â€™à²¦ ಗಾತà³à²°: $3',
'show-big-image' => 'ಪೂರà³à²¤à²¿ ರೆಸೊಲà³à²¯à³‚ಶನà³',
diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php
index 835f5b8e..1d258270 100644
--- a/languages/messages/MessagesTe.php
+++ b/languages/messages/MessagesTe.php
@@ -128,17 +128,19 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#దారిమారà±à°ªà±', '#REDIRECT' ),
- 'notoc' => array( '0', '__విషయసూచికవదà±à°¦à±__', '__NOTOC__' ),
- 'toc' => array( '0', '__విషయసూచిక__', '__TOC__' ),
- 'pagename' => array( '1', 'పేజీపేరà±', 'PAGENAME' ),
- 'img_right' => array( '1', 'à°•à±à°¡à°¿', 'right' ),
- 'img_left' => array( '1', 'à°Žà°¡à°®', 'left' ),
- 'special' => array( '0', 'à°ªà±à°°à°¤à±à°¯à±‡à°•', 'special' ),
+ 'redirect' => array( '0', '#దారిమారà±à°ªà±', '#REDIRECT' ),
+ 'notoc' => array( '0', '__విషయసూచికవదà±à°¦à±__', '__NOTOC__' ),
+ 'toc' => array( '0', '__విషయసూచిక__', '__TOC__' ),
+ 'pagename' => array( '1', 'పేజీపేరà±', 'PAGENAME' ),
+ 'img_right' => array( '1', 'à°•à±à°¡à°¿', 'right' ),
+ 'img_left' => array( '1', 'à°Žà°¡à°®', 'left' ),
+ 'special' => array( '0', 'à°ªà±à°°à°¤à±à°¯à±‡à°•', 'special' ),
);
$linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
+$digitGroupingPattern = "##,##,###";
+
$messages = array(
# User preference toggles
'tog-underline' => 'లంకె à°•à±à°°à±€à°—ీత:',
@@ -496,18 +498,19 @@ $1',
'badarticleerror' => 'à°ˆ పేజీపై à°ˆ పని చేయడం à°•à±à°¦à°°à°¦à±.',
'cannotdelete' => '"$1" అనే పేజీ లేదా ఫైలà±à°¨à°¿ తొలగించలేకపోయాం.
దానà±à°¨à°¿ ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఎవరైనా తొలగించి ఉండవచà±à°šà±.',
+'cannotdelete-title' => '"$1" à°ªà±à°Ÿà°¨à± తొలగించలేరà±',
'badtitle' => 'తపà±à°ªà± శీరà±à°·à°¿à°•',
'badtitletext' => 'మీరౠకోరిన à°ªà±à°Ÿ యొకà±à°• పేరౠచెలà±à°²à°¨à°¿à°¦à°¿, ఖాళీగా ఉంది, లేదా తపà±à°ªà±à°—à°¾ ఇచà±à°šà°¿à°¨ అంతరà±à°µà°¿à°•à±€ లేదా అంతర-భాషా శీరà±à°·à°¿à°• అయివà±à°‚డాలి.
శీరà±à°·à°¿à°•à°²à°²à±‹ ఉపయోగించకూడని à°…à°•à±à°·à°°à°¾à°²à± దానిలో ఉండివà±à°‚డొచà±à°šà±.',
-'perfcached' => 'కింది డేటా à°®à±à°‚దే సేకరించి పెటà±à°Ÿà±à°•à±à°¨à±à°¨à°¦à°¿. కాబటà±à°Ÿà°¿ తాజా డేటాతో పోలిసà±à°¤à±‡ తేడాలà±à°‚డవచà±à°šà±.',
-'perfcachedts' => 'కింది సమాచారం à°®à±à°‚దే సేకరించి పెటà±à°Ÿà±à°•à±à°¨à±à°¨à°¦à°¿. దీనà±à°¨à°¿ $1à°¨ చివరిసారిగా తాజాకరించారà±.',
+'perfcached' => 'కింది డేటా à°®à±à°‚దే సేకరించి పెటà±à°Ÿà±à°•à±à°¨à±à°¨à°¦à°¿. కాబటà±à°Ÿà°¿ తాజా డేటాతో పోలిసà±à°¤à±‡ తేడాలà±à°‚డవచà±à°šà±. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'కింది సమాచారం à°®à±à°‚దే సేకరించి పెటà±à°Ÿà±à°•à±à°¨à±à°¨à°¦à°¿. దీనà±à°¨à°¿ $1à°¨ చివరిసారిగా తాజాకరించారà±. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'à°ªà±à°°à°¸à±à°¤à±à°¤à°‚ à°ˆ à°ªà±à°Ÿà°•à°¿ తాజాకరణలని అచేతనం చేసారà±.
ఇకà±à°•à°¡à±à°¨à±à°¨ భోగటà±à°Ÿà°¾ కూడా తాజాకరించబడదà±.',
'wrong_wfQuery_params' => 'wfQuery()à°•à°¿ తపà±à°ªà±à°¡à± పారామీటరà±à°²à± వచà±à°šà°¾à°¯à°¿<br />
à°«à°‚à°•à±à°·à°¨à±: $1<br />
à°•à±à°µà±€à°°à±€: $2',
'viewsource' => 'మూలానà±à°¨à°¿ చూపించà±',
-'viewsourcefor' => '$1 కొరకà±',
+'viewsource-title' => '$1 యొకà±à°• సోరà±à°¸à± చూడండి',
'actionthrottled' => 'కారà±à°¯à°¾à°¨à±à°¨à°¿ ఆపేసారà±',
'actionthrottledtext' => 'à°¸à±à°ªà°¾à°®à±à°¨à± తగà±à°—ించటానికి తీసà±à°•à±à°¨à±à°¨ నిరà±à°£à°¯à°¾à°² వలà±à°², మీరౠఈ కారà±à°¯à°¾à°¨à±à°¨à°¿ అతి తకà±à°•à±à°µ సమయంలో బోలెడనà±à°¨à°¿ సారà±à°²à± చేయకà±à°‚à°¡à°¾ à°…à°¡à±à°¡à±à°•à±à°‚à°Ÿà±à°¨à±à°¨à°¾à°®à±. కొనà±à°¨à°¿ నిమిషాలౠఆగి మరలా à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà°‚à°¡à°¿.',
'protectedpagetext' => 'à°ˆ పేజీపై దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à± చెయà±à°¯à°¨à°¿à°µà±à°µà°•à±à°‚à°¡à°¾ లాకౠచేసాం.',
@@ -674,6 +677,16 @@ $2
తాతà±à°•à°¾à°²à°¿à°• సంకేతపదం: $2',
'passwordreset-emailsent' => 'à°œà±à°žà°¾à°ªà°•à°‚ ఈమెయిలౠపంపించాం.',
+# Special:ChangeEmail
+'changeemail' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ మారà±à°ªà±',
+'changeemail-header' => 'ఖాతా à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ మారà±à°šà°‚à°¡à°¿',
+'changeemail-no-info' => 'à°ˆ పేజీని నేరà±à°—à°¾ చూడటానికి మీరౠలోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°‚డాలి.',
+'changeemail-oldemail' => 'à°ªà±à°°à°¸à±à°¤à±à°¤ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
+'changeemail-newemail' => 'కొతà±à°¤ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
+'changeemail-none' => '(à°à°®à±€à°²à±‡à°¦à±)',
+'changeemail-submit' => 'à°ˆ-మెయిలౠమారà±à°šà±',
+'changeemail-cancel' => 'à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿',
+
# Edit page toolbar
'bold_sample' => 'బొదà±à°¦à± à°…à°•à±à°·à°°à°¾à°²à±',
'bold_tip' => 'బొదà±à°¦à± à°…à°•à±à°·à°°à°¾à°²à±',
@@ -741,9 +754,6 @@ $2
మీ à°ªà±à°°à°¸à±à°¤à±à°¤ à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾ $3, మరియౠనిరోధపౠà°à°¡à±€: $5.
మీ సంపà±à°°à°¦à°¿à°‚à°ªà±à°²à°¨à±à°¨à°¿à°Ÿà°¿à°²à±‹à°¨à± à°…à°¨à±à°¨à°¿ పై వివరాలనౠఉదహరించండి.',
'blockednoreason' => 'కారణమేమీ ఇవà±à°µà°²à±‡à°¦à±',
-'blockedoriginalsource' => "'''$1''' యొకà±à°• మూలానà±à°¨à°¿ à°•à°¿à°‚à°¦ ఇచà±à°šà°¾à°‚:",
-'blockededitsource' => "'''$1''' లో '''మీ దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²''' పూరà±à°¤à°¿ పాఠానà±à°¨à°¿ à°•à°¿à°‚à°¦ ఇచà±à°šà°¾à°‚:",
-'whitelistedittitle' => 'మారà±à°ªà±à°²à± చెయà±à°¯à°¡à°¾à°¨à°¿à°•à°¿ à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°‚డాలి',
'whitelistedittext' => 'à°ªà±à°Ÿà°²à°²à±‹ మారà±à°ªà±à°²à± చెయà±à°¯à°¡à°¾à°¨à°¿à°•à°¿ మీరౠ$1 ఉండాలి.',
'confirmedittext' => 'పేజీలà±à°²à±‹ మారà±à°ªà±à°²à± చేసేమà±à°‚దౠమీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ ధృవీకరించాలి. [[Special:Preferences|మీ à°…à°­à°¿à°°à±à°šà±à°²]]లో మీ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ రాసి, ధృవీకరించండి.',
'nosuchsectiontitle' => 'విభాగానà±à°¨à°¿ కనగొనలేకపోయాం',
@@ -982,8 +992,6 @@ $3 చెపà±à°ªà°¿à°¨ కారణం: ''$2''",
'revdelete-unsuppress' => 'à°ªà±à°¨à°¸à±à°¥à°¾à°ªà°¿à°¤ కూరà±à°ªà±à°²à°ªà±ˆ నిబంధనలనౠతీసివెయà±à°¯à°¿',
'revdelete-log' => 'కారణం:',
'revdelete-submit' => 'à°Žà°‚à°šà±à°•à±à°¨à±à°¨ {{PLURAL:$1|కూరà±à°ªà±à°•à±|కూరà±à°ªà±à°²à°•à±}} ఆపాదించà±',
-'revdelete-logentry' => '[[$1]] కూరà±à°ªà± కనబడే విధానానà±à°¨à°¿ మారà±à°šà°¾à°‚',
-'logdelete-logentry' => '[[$1]] ఘటన కనబడే విధానానà±à°¨à°¿ మారà±à°šà°¾à°‚',
'revdelete-success' => "'''కూరà±à°ªà± కనబడే విధానానà±à°¨à°¿ జయపà±à°°à°¦à°‚à°—à°¾ తాజాకరించాం.'''",
'revdelete-failure' => "'''కూరà±à°ªà± కనబడే పదà±à°§à°¤à°¿à°¨à°¿ తాజాపరచలేకపోయాం:'''
$1",
@@ -995,15 +1003,6 @@ $1",
'revdel-restore-visible' => 'కనిపిసà±à°¤à±à°¨à±à°¨ కూరà±à°ªà±à°²à±',
'pagehist' => 'పేజీ à°šà°°à°¿à°¤à±à°°',
'deletedhist' => 'తొలగించిన à°šà°°à°¿à°¤à±à°°',
-'revdelete-content' => 'సమాచారానà±à°¨à°¿',
-'revdelete-summary' => 'మారà±à°ªà± సంగà±à°°à°¹à°‚',
-'revdelete-uname' => 'వాడà±à°•à°°à°¿à°ªà±‡à°°à±',
-'revdelete-restricted' => 'నిరà±à°µà°¾à°¹à°•à±à°²à°•à± ఆంకà±à°·à°²à± విధించానà±',
-'revdelete-unrestricted' => 'నిరà±à°µà°¾à°¹à°•à±à°²à°•à±à°¨à±à°¨ ఆంకà±à°·à°²à°¨à± à°Žà°¤à±à°¤à±‡à°¶à°¾à°¨à±',
-'revdelete-hid' => '$1 చూపించవదà±à°¦à±',
-'revdelete-unhid' => '$1 చూపించà±',
-'revdelete-log-message' => '$2 {{PLURAL:$2|కూరà±à°ªà±|కూరà±à°ªà±à°²}}పై $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|ఘటన|ఘటనల}}కౠ$1',
'revdelete-hide-current' => '$2, $1 నాటి అంశానà±à°¨à°¿ దాచడంలో లోపం దొరà±à°²à°¿à°‚ది: ఇది à°ªà±à°°à°¸à±à°¤à±à°¤ కూరà±à°ªà±.
దీనà±à°¨à°¿ దాచలేమà±.',
'revdelete-show-no-access' => '$2, $1 నాటి అంశానà±à°¨à°¿ చూపడంలో లోపం దొరà±à°²à°¿à°‚ది: ఇది "నిరోధించబడింది" అని à°—à±à°°à±à°¤à°¿à°‚చబడింది.
@@ -1158,12 +1157,14 @@ $1",
'prefs-rc' => 'ఇటీవలి మారà±à°ªà±à°²à±, మొలకలà±',
'prefs-watchlist' => 'వీకà±à°·à°£ జాబితా',
'prefs-watchlist-days' => 'వీకà±à°·à°£ జాబితాలో చూపించవలసిన రోజà±à°²à±:',
-'prefs-watchlist-days-max' => '7 రోజà±à°²à± à°—à°°à°¿à°·à±à° à°‚',
+'prefs-watchlist-days-max' => '$1 {{PLURAL:$1|రోజà±|రోజà±à°²à±}} à°—à°°à°¿à°·à±à° à°‚',
'prefs-watchlist-edits' => 'విసà±à°¤à±ƒà°¤ వీకà±à°·à°£ జాబితాలో చూపించవలసిన దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à±:',
'prefs-watchlist-edits-max' => 'à°—à°°à°¿à°·à±à°  సంఖà±à°¯: 1000',
'prefs-watchlist-token' => 'వీకà±à°·à°£à°¾à°œà°¾à°¬à°¿à°¤à°¾ టోకెనà±:',
'prefs-misc' => 'ఇతరాలà±',
'prefs-resetpass' => 'సంకేతపదానà±à°¨à°¿ మారà±à°šà±à°•à±‹à°‚à°¡à°¿',
+'prefs-changeemail' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ మారà±à°ªà±',
+'prefs-setemail' => 'à°’à°• à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à°¿ అమరà±à°šà°‚à°¡à°¿',
'prefs-email' => 'à°ˆ-మెయిలౠఎంపికలà±',
'prefs-rendering' => 'రూపà±à°°à±‡à°–à°²à±',
'saveprefs' => 'à°­à°¦à±à°°à°ªà°°à°šà±',
@@ -1354,7 +1355,6 @@ $1",
'right-autopatrol' => 'తానే చేసిన మారà±à°ªà±à°²à°¨à± నిఘాలో ఉనà±à°¨à°Ÿà±à°²à±à°—à°¾ ఆటోమాటిగా à°—à±à°°à±à°¤à°¿à°‚à°šà±',
'right-patrolmarks' => 'ఇటీవలి మారà±à°ªà±à°² నిఘా à°—à±à°°à±à°¤à°¿à°‚à°ªà±à°²à°¨à± చూడà±',
'right-unwatchedpages' => 'వీకà±à°·à°£à°²à±‹ లేని పేజీల జాబితానౠచూడà±',
-'right-trackback' => 'à°Ÿà±à°°à°¾à°•à±â€Œà°¬à±à°¯à°¾à°•à±â€Œà°¨à± సమరà±à°ªà°¿à°‚à°šà±',
'right-mergehistory' => 'పేజీల యొకà±à°• à°šà°°à°¿à°¤à±à°°à°²à°¨à°¿ విలీనం చేయగలగడం',
'right-userrights' => 'వాడà±à°•à°°à±à°²à°‚దరి హకà±à°•à±à°²à°¨à± మారà±à°šà±',
'right-userrights-interwiki' => 'ఇతర వికీలà±à°²à±‹à°¨à°¿ వాడà±à°•à°°à±à°² హకà±à°•à±à°²à°¨à± మారà±à°šà±',
@@ -1398,11 +1398,11 @@ $1",
'action-patrol' => 'ఇతరà±à°² మారà±à°ªà±à°²à°¨à± పరà±à°¯à°µà±‡à°•à±à°·à°¿à°‚చినవిగా à°—à±à°°à±à°¤à°¿à°‚చే',
'action-autopatrol' => 'మీ మారà±à°ªà±à°²à°¨à± పరà±à°¯à°µà±‡à°•à±à°·à°¿à°‚చినవిగా à°—à±à°°à±à°¤à°¿à°‚చే',
'action-unwatchedpages' => 'వీకà±à°·à°£à°²à±‹ లేని పేజీల జాబితాని చూసే',
-'action-trackback' => 'à°Ÿà±à°°à°¾à°•à±à°¬à±à°¯à°¾à°•à±à°¨à°¿ దాఖలà±à°šà±‡à°¸à±‡',
'action-mergehistory' => 'à°ˆ పేజీ యొకà±à°• à°šà°°à°¿à°¤à±à°°à°¨à°¿ విలీనం చేసే',
'action-userrights' => 'అందరౠవాడà±à°•à°°à±à°² హకà±à°•à±à°²à°¨à± మారà±à°šà±‡',
'action-userrights-interwiki' => 'ఇతర వికీలలో వాడà±à°•à°°à±à°² యొకà±à°• హకà±à°•à±à°²à°¨à± మారà±à°šà±‡',
'action-siteadmin' => 'డాటాబేసà±à°•à°¿ తాళం వేసే లేదా తీసే',
+'action-sendemail' => 'à°ˆ-మెయిలà±à°¸à± పంపించà±',
# Recent changes
'nchanges' => '{{PLURAL:$1|à°’à°• మారà±à°ªà±|$1 మారà±à°ªà±à°²à±}}',
@@ -1575,6 +1575,12 @@ $1',
'upload-unknown-size' => 'సైజౠతెలియదà±',
'upload-http-error' => 'ఒక HTTP పొరపాటౠజరిగింది: $1',
+# File backend
+'backend-fail-notexists' => '$1 ఫైలౠఅసలౠలేనేలేదà±.',
+'backend-fail-delete' => '$1 ఫైలà±à°¨à± తొలగించలేకà±à°¨à±à°¨à°¾à°‚.',
+'backend-fail-alreadyexists' => '$1 అనే దసà±à°¤à±à°°à°‚ ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఉంది.',
+'backend-fail-opentemp' => 'తాతà±à°•à°¾à°²à°¿à°• దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ తెరవలేకపోతà±à°¨à±à°¨à°¾à°‚.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'à°ˆ ఫైలà±à°¨à± ZIP పరీకà±à°· కోసం తెరవబోతే, à°à°¦à±‹ తెలియని లోపం à°Žà°¦à±à°°à±ˆà°‚ది.',
'zip-wrong-format' => 'ఇచà±à°šà°¿à°¨à°¦à°¿ ZIP ఫైలౠకాదà±.',
@@ -1695,23 +1701,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'filerevert-badversion' => 'మీరిచà±à°šà°¿à°¨ టైమà±à°¸à±à°Ÿà°¾à°‚à°ªà±à°¤à±‹ à°ˆ ఫైలà±à°•à± à°¸à±à°¥à°¾à°¨à°¿à°• కూరà±à°ªà±‡à°®à±€ లేదà±.',
# File deletion
-'filedelete' => '$1ని తొలగించà±',
-'filedelete-legend' => 'ఫైలà±à°¨à°¿ తొలగించà±',
-'filedelete-intro' => "మీరౠ'''[[Media:$1|$1]]''' ఫైలà±à°¨à°¿ దాని à°šà°°à°¿à°¤à±à°°à°¤à±‹ సహా తొలగించబోతà±à°¨à±à°¨à°¾à°°à±.",
-'filedelete-intro-old' => "మీరౠ'''[[Media:$1|$1]]''' యొకà±à°• [$4 $3, $2] నాటి కూరà±à°ªà±à°¨à± తొలగిసà±à°¤à±à°¨à±à°¨à°¾à°°à±.",
-'filedelete-comment' => 'కారణం:',
-'filedelete-submit' => 'తొలగించà±',
-'filedelete-success' => "'''$1'''ని తొలగించాం.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]''' యొకà±à°• $3, $2 నాటి కూరà±à°ªà±à°¨à± తొలగించాం.</span>",
-'filedelete-nofile' => "'''$1''' ఇకà±à°•à°¡ లేదà±.",
-'filedelete-nofile-old' => "'''$1''' యొకà±à°• పాత కూరà±à°ªà±à°²à±à°²à±‹ మీరిచà±à°šà°¿à°¨ పరామితà±à°²à± కలిగిన కూరà±à°ªà±‡à°®à±€ లేదà±.",
-'filedelete-otherreason' => 'ఇతర/అదనపౠకారణం:',
-'filedelete-reason-otherlist' => 'ఇతర కారణం',
-'filedelete-reason-dropdown' => '* మామూలౠతొలగింపౠకారణాలà±
+'filedelete' => '$1ని తొలగించà±',
+'filedelete-legend' => 'ఫైలà±à°¨à°¿ తొలగించà±',
+'filedelete-intro' => "మీరౠ'''[[Media:$1|$1]]''' ఫైలà±à°¨à°¿ దాని à°šà°°à°¿à°¤à±à°°à°¤à±‹ సహా తొలగించబోతà±à°¨à±à°¨à°¾à°°à±.",
+'filedelete-intro-old' => "మీరౠ'''[[Media:$1|$1]]''' యొకà±à°• [$4 $3, $2] నాటి కూరà±à°ªà±à°¨à± తొలగిసà±à°¤à±à°¨à±à°¨à°¾à°°à±.",
+'filedelete-comment' => 'కారణం:',
+'filedelete-submit' => 'తొలగించà±',
+'filedelete-success' => "'''$1'''ని తొలగించాం.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]''' యొకà±à°• $3, $2 నాటి కూరà±à°ªà±à°¨à± తొలగించాం.</span>",
+'filedelete-nofile' => "'''$1''' ఇకà±à°•à°¡ లేదà±.",
+'filedelete-nofile-old' => "'''$1''' యొకà±à°• పాత కూరà±à°ªà±à°²à±à°²à±‹ మీరిచà±à°šà°¿à°¨ పరామితà±à°²à± కలిగిన కూరà±à°ªà±‡à°®à±€ లేదà±.",
+'filedelete-otherreason' => 'ఇతర/అదనపౠకారణం:',
+'filedelete-reason-otherlist' => 'ఇతర కారణం',
+'filedelete-reason-dropdown' => '* మామూలౠతొలగింపౠకారణాలà±
** కాపీహకà±à°•à±à°² ఉలà±à°²à°‚ఘన
** వేరొక దసà±à°¤à±à°°à°¾à°¨à°¿à°•à°¿ నకలà±',
-'filedelete-edit-reasonlist' => 'తొలగింపౠకారణాలని మారà±à°šà°‚à°¡à°¿',
-'filedelete-maintenance' => 'సంరకà±à°·à°£ నిమితà±à°¤à°‚ ఫైళà±à°³ తొలగింపౠమరియౠపà±à°¨à°¸à±à°¥à°¾à°ªà°¨à°²à°¨à± తాతà±à°•à°¾à°²à°¿à°•à°‚à°—à°¾ అచేయతనం చేసారà±.',
+'filedelete-edit-reasonlist' => 'తొలగింపౠకారణాలని మారà±à°šà°‚à°¡à°¿',
+'filedelete-maintenance' => 'సంరకà±à°·à°£ నిమితà±à°¤à°‚ ఫైళà±à°³ తొలగింపౠమరియౠపà±à°¨à°¸à±à°¥à°¾à°ªà°¨à°²à°¨à± తాతà±à°•à°¾à°²à°¿à°•à°‚à°—à°¾ అచేయతనం చేసారà±.',
+'filedelete-maintenance-title' => 'దసà±à°¤à±à°°à°¾à°¨à±à°¨à°¿ తొలగించలేకపోయాం',
# MIME search
'mimesearch' => 'బొమà±à°®à°² మెటాడేటా(MIME)నౠవెతకండి',
@@ -1815,6 +1822,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'mostimages' => 'అధిక లింకà±à°²à± à°—à°² బొమà±à°®à°²à±',
'mostrevisions' => 'అధిక సంచికలౠగల à°µà±à°¯à°¾à°¸à°¾à°²à±',
'prefixindex' => 'ఉపసరà±à°—తో à°…à°¨à±à°¨à°¿ పేజీలà±',
+'prefixindex-namespace' => 'ఉపసరà±à°—తో ఉనà±à°¨ పేజీలౠ($1 పేరà±à°¬à°°à°¿)',
'shortpages' => 'à°šà°¿à°¨à±à°¨ పేజీలà±',
'longpages' => 'పొడవౠపేజీలà±',
'deadendpages' => 'అగాధ (డెడà±à°Žà°‚à°¡à±) పేజీలà±',
@@ -1831,7 +1839,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'listusers-editsonly' => 'మారà±à°ªà±à°²à± చేసిన వాడà±à°•à°°à±à°²à°¨à± మాతà±à°°à°®à±‡ చూపించà±',
'listusers-creationsort' => 'చేరిన తేదీ à°•à±à°°à°®à°‚లో చూపించà±',
'usereditcount' => '$1 {{PLURAL:$1|మారà±à°ªà±|మారà±à°ªà±à°²à±}}',
-'usercreated' => '$1à°¨ $2à°•à°¿ చేరారà±',
+'usercreated' => '$1 à°¨ $2à°•à°¿ {{GENDER:$3|చేరారà±}}',
'newpages' => 'కొతà±à°¤ పేజీలà±',
'newpages-username' => 'వాడà±à°•à°°à°¿ పేరà±:',
'ancientpages' => 'పాత పేజీలà±',
@@ -1922,12 +1930,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'activeusers-noresult' => 'వాడà±à°•à°°à±à°²à±†à°µà°°à±‚ లేరà±.',
# Special:Log/newusers
-'newuserlogpage' => 'కొతà±à°¤ వాడà±à°•à°°à±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
-'newuserlogpagetext' => 'ఇది వాడà±à°•à°°à°¿ నమోదà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
-'newuserlog-byemail' => 'à°ˆ-మెయిలà±à°²à±‹ సంకేతపదం పంపించాం',
-'newuserlog-create-entry' => 'కొతà±à°¤ వాడà±à°•à°°à°¿ ఖాతా',
-'newuserlog-create2-entry' => '$1 అనే కొతà±à°¤ ఖాతాని సృషà±à°Ÿà°¿à°‚చారà±',
-'newuserlog-autocreate-entry' => 'ఖాతాని ఆటోమెటిగà±à°—à°¾ సృషà±à°Ÿà°¿à°‚చాం',
+'newuserlogpage' => 'కొతà±à°¤ వాడà±à°•à°°à±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
+'newuserlogpagetext' => 'ఇది వాడà±à°•à°°à°¿ నమోదà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
# Special:ListGroupRights
'listgrouprights' => 'వాడà±à°•à°°à°¿ à°—à±à°‚à°ªà±à°² హకà±à°•à±à°²à±',
@@ -1955,7 +1959,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'emailpage' => 'వాడà±à°•à°°à°¿à°•à°¿ à°ˆ-మెయిలà±à°¨à°¿ పంపించà±',
'emailpagetext' => 'వాడà±à°•à°°à°¿à°•à°¿ ఈమెయిలౠసందేశమౠపంపించà±à°Ÿà°•à± à°•à±à°°à°¿à°‚ది ఫారంనౠఉపయోగించవచà±à°šà±. [[Special:Preferences|మీ వాడà±à°•à°°à°¿ à°…à°­à°¿à°°à±à°šà±à°²]]లో మీరిచà±à°šà°¿à°¨ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ "à°¨à±à°‚à°¡à°¿" à°† సందేశం వచà±à°šà°¿à°¨à°Ÿà±à°²à±à°—à°¾ ఉంటà±à°‚ది, à°•à°¨à±à°• వేగà±à°¨à°¿ à°…à°‚à°¦à±à°•à±à°¨à±‡à°µà°¾à°°à± నేరà±à°—à°¾ మీకౠజవాబివà±à°µà°—à°²à±à°—à±à°¤à°¾à°°à±.',
'usermailererror' => 'మెయిలౠఆబà±à°œà±†à°•à±à°Ÿà± à°ˆ లోపానà±à°¨à°¿ చూపింది:',
-'defemailsubject' => '{{SITENAME}} à°ˆ-మెయిలà±',
+'defemailsubject' => 'వాడà±à°•à°°à°¿ "$1" à°¨à±à°‚à°¡à°¿ {{SITENAME}} à°ˆ-మెయిలà±',
'usermaildisabled' => 'వాడà±à°•à°°à°¿ à°ˆ-మెయిళà±à°³à± అచేతనం చేసారà±',
'usermaildisabledtext' => 'à°ˆ వికీలో మీరౠఇతర వాడà±à°•à°°à±à°²à°•à°¿ à°ˆ-మెయిళà±à°³à°¨à°¿ పంపించలేరà±',
'noemailtitle' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾ లేదà±',
@@ -2067,8 +2071,6 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'actioncomplete' => 'పని పూరà±à°¤à°¯à°¿à°‚ది',
'actionfailed' => 'à°šà°°à±à°¯ విఫలమైంది',
'deletedtext' => '"$1" à°¤à±à°¡à°¿à°šà°¿à°µà±‡à°¯à°¬à°¡à°¿à°‚ది. ఇటీవలి à°¤à±à°¡à°¿à°šà°¿à°µà±‡à°¤à°²à°•à± సంబంధించిన నివేదిక కొరకౠ$2 చూడండి.',
-'deletedarticle' => '"[[$1]]"ని తొలగించారà±',
-'suppressedarticle' => '"[[$1]]" నౠఅణచి ఉంచాం',
'dellogpage' => 'తొలగింపà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
'dellogpagetext' => 'ఇది ఇటీవలి à°¤à±à°¡à°¿à°šà°¿à°µà±‡à°¤à°² జాబితా.',
'deletionlog' => 'తొలగింపà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
@@ -2115,6 +2117,7 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'movedarticleprotection' => 'సంరకà±à°·à°£à°¾ అమరికని "[[$2]]" à°¨à±à°‚à°¡à°¿ "[[$1]]"à°•à°¿ మారà±à°šà°¾à°°à±',
'protect-title' => '"$1" కౠసంరకà±à°·à°£ à°¸à±à°¥à°¾à°¯à°¿à°¨à°¿ సెటౠచేసà±à°¤à±à°¨à±à°¨à°¾à°‚',
'prot_1movedto2' => '$1, $2కౠతరలించబడింది',
+'protect-badnamespace-text' => 'à°ˆ పేరà±à°¬à°°à°¿à°²à±‹ ఉనà±à°¨ పేజీలనౠసంరకà±à°·à°¿à°‚చలేరà±.',
'protect-legend' => 'సంరకà±à°·à°£à°¨à± నిరà±à°§à°¾à°°à°¿à°‚à°šà±',
'protectcomment' => 'కారణం:',
'protectexpiry' => 'à°—à°¡à±à°µà±:',
@@ -2190,7 +2193,6 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'undeletereset' => 'à°®à±à°¨à±à°ªà°Ÿà°¿ వలె',
'undeleteinvert' => 'ఎంపికని తిరగవెయà±à°¯à°¿',
'undeletecomment' => 'కారణం:',
-'undeletedarticle' => '"[[$1]]" à°ªà±à°¨à°ƒà°¸à±à°¥à°¾à°ªà°¨ జరిగింది',
'undeletedrevisions' => '{{PLURAL:$1|à°’à°• సంచిక|$1 సంచికల}} à°ªà±à°¨à°ƒà°¸à±à°¥à°¾à°ªà°¨ జరిగింది',
'undeletedrevisions-files' => '{{PLURAL:$1|à°’à°• కూరà±à°ªà±|$1 కూరà±à°ªà±à°²à±}} మరియౠ{{PLURAL:$2|à°’à°• ఫైలà±|$2 ఫైళà±à°³}}నౠపà±à°¨à°¸à±à°¥à°¾à°ªà°¿à°‚చాం',
'undeletedfiles' => '{{PLURAL:$1|à°’à°• ఫైలà±à°¨à±|$1 ఫైళà±à°²à°¨à±}} à°ªà±à°¨à°ƒà°¸à±à°¥à°¾à°ªà°¿à°‚చాం',
@@ -2199,6 +2201,7 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
ఇటీవల జరిగిన తొలగింపà±à°²à±, à°ªà±à°¨à°¸à±à°¥à°¾à°ªà°¨à°² కొరకౠ[[Special:Log/delete|తొలగింపౠచిటà±à°Ÿà°¾]]ని చూడండి.",
'undelete-header' => 'ఇటీవల తొలగించిన పేజీల కొరకౠ[[Special:Log/delete|తొలగింపౠచిటà±à°Ÿà°¾]]ని చూడండి.',
+'undelete-search-title' => 'తొలగించిన పేజీల à°…à°¨à±à°µà±‡à°·à°£',
'undelete-search-box' => 'తొలగించిన పేజీలనౠవెతà±à°•à±',
'undelete-search-prefix' => 'దీనితో మొదలయà±à°¯à±‡ పేజీలౠచూపించà±:',
'undelete-search-submit' => 'వెతà±à°•à±',
@@ -2345,6 +2348,7 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'unblocklink' => 'నిరోధానà±à°¨à°¿ à°Žà°¤à±à°¤à°¿à°µà±‡à°¯à°¿',
'change-blocklink' => 'నిరోధానà±à°¨à°¿ మారà±à°šà°‚à°¡à°¿',
'contribslink' => 'రచనలà±',
+'emaillink' => 'à°ˆ-మెయిలà±à°¨à± పంపించà±',
'autoblocker' => 'మీ à°.పీ. à°…à°¡à±à°°à°¸à±à°¨à± "[[User:$1|$1]]" ఇటీవల వాడà±à°Ÿ చేత, అది ఆటోమాటికà±â€Œà°—à°¾ నిరోధించబడినది. $1నౠనిరోధించడానికి కారణం: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'నిరోధాల à°šà°¿à°Ÿà±à°Ÿà°¾',
'blocklog-showlog' => 'à°ˆ వాడà±à°•à°°à°¿à°¨à°¿ గతంలో నిరోధించారà±.
@@ -2464,9 +2468,6 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'movepage-page-moved' => '$1 అనే పేజీని $2 కి తరలించాం.',
'movepage-page-unmoved' => '$1 అనే పేజీని $2 à°•à°¿ తరలించలేకపోయామà±.',
'movepage-max-pages' => '$1 యొకà±à°• à°—à°°à°¿à°·à±à°  పరిమితి {{PLURAL:$1|పేజీ|పేజీలà±}} వరకౠతరలించడమైనది. ఇక ఆటోమాటిగà±à°—à°¾ తరలించమà±.',
-'1movedto2' => '[[$1]]ని [[$2]]à°•à°¿ తరలించారà±',
-'1movedto2_redir' => '[[$1]] నౠదారిమారà±à°ªà± à°¦à±à°µà°¾à°°à°¾ [[$2]] కౠతరలించాం',
-'move-redirect-suppressed' => 'దారిమారà±à°ªà± లేకà±à°‚à°¡à°¾',
'movelogpage' => 'తరలింపà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
'movelogpagetext' => 'à°•à°¿à°‚à°¦ తరలించిన పేజీల జాబితా ఉనà±à°¨à°¦à°¿.',
'movesubpage' => '{{PLURAL:$1|ఉపపేజీ|ఉపపేజీలà±}}',
@@ -2479,7 +2480,7 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
ఉదà±à°¦à±‡à°¶à°¿à°‚à°šà°¿à°¨ à°µà±à°¯à°¾à°¸à°‚ "[[:$1]]" ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఉనికిలో ఉంది. à°ªà±à°°à°¸à±à°¤à±à°¤ తరలింపà±à°•à± వీలà±à°—à°¾ దానà±à°¨à°¿ తొలగించేయమంటారా?',
'delete_and_move_confirm' => 'à°…à°µà±à°¨à±, పేజీని తొలగించà±',
-'delete_and_move_reason' => 'తరలింపà±à°•à± వీలà±à°—à°¾ తొలగించబడింది',
+'delete_and_move_reason' => '"[[$1]]"నౠతరలించడానికి వీలà±à°—à°¾ తొలగించారà±',
'selfmove' => 'మూలం, à°—à°®à±à°¯à°‚ పేరà±à°²à± ఒకటే; పేజీని దాని పైకే తరలించడం à°•à±à°¦à°°à°¦à±.',
'immobile-source-namespace' => '"$1" పేరà±à°¬à°°à°¿à°²à±‹à°¨à°¿ పేజీలనౠతరలించలేరà±',
'immobile-target-namespace' => '"$1" పేరà±à°¬à°°à°¿à°²à±‹à°¨à°¿à°•à°¿ పేజీలనౠతరలించలేరà±',
@@ -2597,6 +2598,9 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'import-logentry-interwiki' => 'ఇతర వికీల à°¨à±à°‚à°¡à°¿ $1',
'import-logentry-interwiki-detail' => '$2 à°¨à±à°‚à°¡à°¿ {{PLURAL:$1|à°’à°• కూరà±à°ªà±|$1 కూరà±à°ªà±à°²à±}}',
+# JavaScriptTest
+'javascripttest' => 'జావాసà±à°•à±à°°à°¿à°ªà±à°Ÿà± పరీకà±à°·',
+
# Tooltip help for the actions
'tooltip-pt-userpage' => 'మీ వాడà±à°•à°°à°¿ పేజీ',
'tooltip-pt-anonuserpage' => 'మీ à°à°ªà±€ à°šà°¿à°°à±à°¨à°¾à°®à°¾à°•à°¿ సంబంధించిన వాడà±à°•à°°à°¿ పేజీ',
@@ -2726,9 +2730,6 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
# Patrol log
'patrol-log-page' => 'నిఘా à°šà°¿à°Ÿà±à°Ÿà°¾',
'patrol-log-header' => 'ఇది పరà±à°¯à°µà±‡à°•à±à°·à°¿à°‚à°šà°¿à°¨ కూరà±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
-'patrol-log-line' => 'మొతà±à°¤à°‚ $1లోని $2లనౠ$3à°—à°¾ పెటà±à°°à±‹à°²à± చేసినటà±à°²à±à°—à°¾ à°—à±à°°à±à°¤à°¿à°‚చామà±',
-'patrol-log-auto' => '(దావంత అదే)',
-'patrol-log-diff' => 'కూరà±à°ªà± $1',
'log-show-hide-patrol' => '$1 పరà±à°¯à°µà±‡à°•à±à°·à°£ à°šà°¿à°Ÿà±à°Ÿà°¾',
# Image deletion
@@ -2755,11 +2756,11 @@ $1',
'file-info' => 'ఫైలౠపరిమాణం: $1, MIME రకం: $2',
'file-info-size' => '$1 × $2 పికà±à°¸à±†à°³à±à°³à±, ఫైలౠపరిమాణం: $3, MIME à°°à°•à°‚: $4',
'file-info-size-pages' => '$1 × $2 పికà±à°¸à±†à°³à±à°³à±, దసà±à°¤à±à°°à°ªà± పరిమాణం: $3, MIME à°°à°•à°‚: $4, $5 {{PLURAL:$5|పేజీ|పేజీలà±}}',
-'file-nohires' => '<small>మరింత à°¸à±à°ªà°·à±à°Ÿà°®à±ˆà°¨ బొమà±à°® లేదà±.</small>',
+'file-nohires' => 'మరింత à°¸à±à°ªà°·à±à°Ÿà°®à±ˆà°¨ బొమà±à°® లేదà±.',
'svg-long-desc' => 'SVG ఫైలà±, నామమాతà±à°°à°‚à°—à°¾ $1 × $2 పికà±à°¸à±†à°³à±à°³à±, ఫైలౠపరిమాణం: $3',
'show-big-image' => 'అసలౠపరిమాణం',
-'show-big-image-preview' => '<small>à°ˆ à°®à±à°¨à±à°œà±‚పౠపరిమాణం: $1.</small>',
-'show-big-image-other' => '<small>ఇతర వైశాలà±à°¯à°¾à°²à±: $1.</small>',
+'show-big-image-preview' => 'à°ˆ à°®à±à°¨à±à°œà±‚పౠపరిమాణం: $1.',
+'show-big-image-other' => 'ఇతర వైశాలà±à°¯à°¾à°²à±: $1.',
'show-big-image-size' => '$1 × $2 పికà±à°¸à±†à°³à±à°³à±',
'file-info-gif-looped' => 'లూపà±à°²à±‹ పడింది',
'file-info-gif-frames' => '$1 {{PLURAL:$1|à°«à±à°°à±‡à°®à±|à°«à±à°°à±‡à°®à±à°²à±}}',
@@ -2779,6 +2780,15 @@ $1',
'bydate' => 'తేదీ వారీగ',
'sp-newimages-showfrom' => '$2, $1 à°¨à±à°‚à°¡à°¿ మొదలà±à°ªà±†à°Ÿà±à°Ÿà°¿ కొతà±à°¤ ఫైళà±à°³à°¨à± చూపించà±',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1à°•à±à°·',
+'days-abbrev' => '$1రో',
+'seconds' => '{{PLURAL:$1|$1 à°•à±à°·à°£à°‚|$1 à°•à±à°·à°£à°¾à°²}}',
+'minutes' => '{{PLURAL:$1|ఒక నిమిషం|$1 నిమిషాల}}',
+'hours' => '{{PLURAL:$1|à°’à°• à°—à°‚à°Ÿ|$1 à°—à°‚à°Ÿà°²}}',
+'days' => '{{PLURAL:$1|à°’à°• రోజà±|$1 రోజà±à°²}}',
+'ago' => '$1 à°•à±à°°à°¿à°¤à°‚',
+
# Bad image list
'bad_image_list' => 'à°•à°¿à°‚à°¦ తెలిపిన తీరà±à°²à±‹ కలపాలి:
@@ -3231,13 +3241,6 @@ $5
'scarytranscludefailed' => '[$1 కొరకౠమూసనౠతీసà±à°•à±à°°à°¾à°µà°Ÿà°‚ విఫలమైంది]',
'scarytranscludetoolong' => '[URL మరీ పొడà±à°—à±à°—à°¾ ఉంది]',
-# Trackbacks
-'trackbackbox' => 'à°ˆ పేజీకి à°Ÿà±à°°à°¾à°•à±&zwnj;బాకà±à°²à±:<br />
-$1',
-'trackbackremove' => '([$1 తొలగించà±])',
-'trackbacklink' => 'à°Ÿà±à°°à°¾à°•à±&zwnj;బాకà±',
-'trackbackdeleteok' => 'à°Ÿà±à°°à°¾à°•à±â€Œà°¬à°¾à°•à±&zwnj;ని విజయవంతంగా తొలగించాం.',
-
# Delete conflict
'deletedwhileediting' => "'''హెచà±à°šà°°à°¿à°•''': మీరౠమారà±à°ªà±à°²à± చేయటం మొదలà±à°ªà±†à°Ÿà±à°Ÿà°¾à°• à°ˆ పేజీ తొలగించబడింది!",
'confirmrecreate' => "మీరౠపేజీ రాయటం మొదలà±à°ªà±†à°Ÿà±à°Ÿà°¿à°¨ తరà±à°µà°¾à°¤ [[User:$1|$1]] ([[User talk:$1|à°šà°°à±à°š]]) దానిని తీసివేసారà±. దానికి à°ˆ కారణం ఇచà±à°šà°¾à°°à±: ''$2''
@@ -3316,6 +3319,9 @@ $1',
'watchlisttools-edit' => 'వీకà±à°·à°£ జాబితానౠచూపించà±, మారà±à°šà±',
'watchlisttools-raw' => 'à°®à±à°¡à°¿ వీకà±à°·à°£ జాబితాలో మారà±à°ªà±à°²à± చెయà±à°¯à°¿',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|à°šà°°à±à°š]])',
+
# Core parser functions
'unknown_extension_tag' => '"$1" అనే à°Ÿà±à°¯à°¾à°—à± à°ˆ పొడిగింతకౠతెలియదà±',
'duplicate-defaultsort' => 'హెచà±à°šà°°à°¿à°•: డిఫాలà±à°Ÿà± పేరà±à°šà± à°•à±€ "$2", à°—à°¤ డిఫాలà±à°Ÿà± పేరà±à°šà± à°•à±€ "$1" ని అతికà±à°°à°®à°¿à°¸à±à°¤à±à°‚ది.',
@@ -3415,13 +3421,15 @@ $1',
'tags-hitcount' => '$1 {{PLURAL:$1|మారà±à°ªà±|మారà±à°ªà±à°²à±}}',
# Special:ComparePages
-'comparepages' => 'à°ªà±à°Ÿà°² పోలిక',
-'compare-selector' => 'à°ªà±à°Ÿ కూరà±à°ªà±à°² పోలిక',
-'compare-page1' => 'à°ªà±à°Ÿ 1',
-'compare-page2' => 'à°ªà±à°Ÿ 2',
-'compare-rev1' => 'కూరà±à°ªà± 1',
-'compare-rev2' => 'కూరà±à°ªà± 2',
-'compare-submit' => 'పోలà±à°šà°¿à°šà±‚à°¡à±',
+'comparepages' => 'à°ªà±à°Ÿà°² పోలిక',
+'compare-selector' => 'à°ªà±à°Ÿ కూరà±à°ªà±à°² పోలిక',
+'compare-page1' => 'à°ªà±à°Ÿ 1',
+'compare-page2' => 'à°ªà±à°Ÿ 2',
+'compare-rev1' => 'కూరà±à°ªà± 1',
+'compare-rev2' => 'కూరà±à°ªà± 2',
+'compare-submit' => 'పోలà±à°šà°¿à°šà±‚à°¡à±',
+'compare-invalid-title' => 'మీరౠఇచà±à°šà°¿à°¨ శీరà±à°·à°¿à°• చెలà±à°²à°¨à°¿à°¦à°¿.',
+'compare-title-not-exists' => 'మీరౠపేరà±à°•à±Šà°¨à±à°¨ శీరà±à°·à°¿à°• లేనే లేదà±.',
# Database error messages
'dberr-header' => 'à°ˆ వికీ సమసà±à°¯à°¾à°¤à±à°®à°•à°‚à°—à°¾ ఉంది',
@@ -3448,4 +3456,44 @@ $1',
'sqlite-has-fts' => '$1 పూరà±à°¤à°¿-పాఠà±à°¯ à°…à°¨à±à°µà±‡à°·à°£ తోడà±à°ªà°¾à°Ÿà±à°¤à±‹',
'sqlite-no-fts' => '$1 పూరà±à°¤à°¿-పాఠà±à°¯ à°…à°¨à±à°µà±‡à°·à°£ తోడà±à°ªà°¾à°Ÿà± లేకà±à°‚à°¡à°¾',
+# New logging system
+'logentry-delete-delete' => '$1 $3 à°ªà±à°Ÿà°¨à± తొలగించారà±',
+'revdelete-content-hid' => 'కంటెంటౠదాచబడింది',
+'revdelete-summary-hid' => 'మారà±à°ªà±à°² సారాంశానà±à°¨à°¿ దాచారà±',
+'revdelete-uname-hid' => 'వాడà±à°•à°°à°¿ పేరà±à°¨à°¿ దాచారà±',
+'revdelete-restricted' => 'నిరà±à°µà°¾à°¹à°•à±à°²à°•à± ఆంకà±à°·à°²à± విధించానà±',
+'revdelete-unrestricted' => 'నిరà±à°µà°¾à°¹à°•à±à°²à°•à±à°¨à±à°¨ ఆంకà±à°·à°²à°¨à± à°Žà°¤à±à°¤à±‡à°¶à°¾à°¨à±',
+'logentry-newusers-newusers' => '$1 వాడà±à°•à°°à°¿ ఖాతానౠసృషà±à°Ÿà°¿à°‚చారà±',
+'logentry-newusers-create' => '$1 à°’à°• వాడà±à°•à°°à°¿ ఖాతానౠసృషà±à°Ÿà°¿à°‚చారà±',
+'logentry-newusers-create2' => '$1 వాడà±à°•à°°à°¿ ఖాతా $3నౠసృషà±à°Ÿà°¿à°‚చారà±',
+'logentry-newusers-autocreate' => '$1 ఖాతానౠఆటోమెటిగà±à°—à°¾ సృషà±à°Ÿà°¿à°‚చారà±',
+'newuserlog-byemail' => 'à°ˆ-మెయిలà±à°²à±‹ సంకేతపదం పంపించాం',
+
+# Feedback
+'feedback-subject' => 'విషయం:',
+'feedback-message' => 'సందేశం:',
+'feedback-cancel' => 'à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿',
+'feedback-submit' => 'à°ªà±à°°à°¤à°¿à°¸à±à°ªà°‚దననౠదాఖలà±à°šà±‡à°¯à°¿',
+'feedback-error2' => 'దోషమà±: సవరణ విఫలమైంది',
+'feedback-thanks' => 'కృతజà±à°žà°¤à°²à±! మీ à°ªà±à°°à°¤à°¿à°¸à±à°ªà°‚దననౠ“[$2 $1]†పేజీలో చేరà±à°šà°¾à°‚.',
+'feedback-close' => 'పూరà±à°¤à°¯à±à°¯à°¿à°‚ది',
+'feedback-bugcheck' => 'à°…à°¦à±à°­à±à°¤à°‚! ఇది ఇపà±à°ªà°Ÿà°¿à°•à±‡ [$1 తెలిసిన బగà±à°—à±à°²]లో లేదని సరిచూసà±à°•à±‹à°‚à°¡à°¿.',
+'feedback-bugnew' => 'చూసానà±. కొతà±à°¤ బగà±à°—à±à°¨à± నివేదించà±',
+
+# API errors
+'api-error-empty-file' => 'మీరౠదాఖలà±à°šà±‡à°¸à°¿à°¨ ఫైలౠఖాళీది.',
+'api-error-filename-tooshort' => 'దసà±à°¤à±à°°à°ªà± పేరౠమరీ à°šà°¿à°¨à±à°¨à°—à°¾ ఉంది.',
+'api-error-filetype-banned' => 'à°ˆ రకపౠదసà±à°¤à±à°°à°¾à°²à°¨à°¿ నిషేధించారà±.',
+'api-error-http' => 'అంతరà±à°—à°¤ దోషమà±: సేవకానికి à°…à°¨à±à°¸à°‚ధానమవలేకపోతà±à°¨à±à°¨à°¦à°¿.',
+'api-error-illegal-filename' => 'à°† పైలౠపేరౠఅనà±à°®à°¤à°¿à°‚చబడదà±.',
+'api-error-invalid-file-key' => 'అంతరà±à°—à°¤ దోషమà±: తాతà±à°•à°¾à°²à°¿à°• నిలà±à°µà°²à±‹ ఫైలౠకనపడలేదà±.',
+'api-error-mustbeloggedin' => 'దసà±à°¤à±à°°à°¾à°²à°¨à± à°Žà°•à±à°•à°¿à°‚చడానికి మీరౠపà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°‚డాలి.',
+'api-error-nomodule' => 'అంతరà±à°—à°¤ దోషమà±: à°Žà°•à±à°•à°¿à°‚పౠపరà±à°µà°¿à°•à°®à± అమరà±à°šà°¬à°¡à°²à±‡à°¦à±.',
+'api-error-ok-but-empty' => 'అంతరà±à°—à°¤ దోషమà±: సేవకమౠనà±à°‚à°¡à°¿ à°Žà°Ÿà±à°µà°‚à°Ÿà°¿ à°¸à±à°ªà°‚దనా లేదà±.',
+'api-error-unclassified' => 'ఒక తెలియని దోషమౠసంభవించినది',
+'api-error-unknown-code' => 'తెలియని దోషమà±: $1',
+'api-error-unknown-warning' => 'తెలియని హెచà±à°šà°°à°¿à°•: $1',
+'api-error-uploaddisabled' => 'à°ˆ వికీలో à°Žà°•à±à°•à°¿à°‚à°ªà±à°²à°¨à°¿ అచేతనం చేసారà±.',
+'api-error-verification-error' => 'à°ˆ ఫైలౠపాడైవà±à°‚డవచà±à°šà±, లేదా తపà±à°ªà±à°¡à± పొడిగింతనౠకలిగివà±à°‚డవచà±à°šà±.',
+
);
diff --git a/languages/messages/MessagesTet.php b/languages/messages/MessagesTet.php
index f746b222..5d525f8a 100644
--- a/languages/messages/MessagesTet.php
+++ b/languages/messages/MessagesTet.php
@@ -289,7 +289,6 @@ Lista ida pájina espesiál nian [[Special:SpecialPages|iha ne'e]].",
'missingarticle-rev' => '(version#: $1)',
'missingarticle-diff' => '(Dif.: $1, $2)',
'viewsource' => 'Lee testu',
-'viewsourcefor' => 'ba $1',
'viewsourcetext' => 'Ó bele lee no kopia testu pájina nian:',
'namespaceprotected' => "Ó la iha priviléjiu ba edita pájina sira iha espasu '''$1'''.",
'ns-specialprotected' => 'La ema ida bele edita pájina espesiál sira.',
@@ -389,8 +388,6 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'revdelete-hide-user' => "Subar naran edita-na'in/IP",
'revdelete-radio-set' => 'Sin',
'revdelete-radio-unset' => 'Lae',
-'revdelete-uname' => "naran uza-na'in",
-'revdelete-hid' => 'subar $1',
'revdelete-edit-reasonlist' => 'Edita lista motivu nian',
# Diffs
@@ -620,10 +617,8 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'activeusers-hidesysops' => 'Subar administradór sira',
# Special:Log/newusers
-'newuserlogpage' => "Lista kria uza-na'in",
-'newuserlogpagetext' => "Ne'e lista kria uza-na'in.",
-'newuserlog-create-entry' => "Uza-na'in foun",
-'newuserlog-create2-entry' => 'registrar tiha konta foun $1',
+'newuserlogpage' => "Lista kria uza-na'in",
+'newuserlogpagetext' => "Ne'e lista kria uza-na'in.",
# Special:ListGroupRights
'listgrouprights-group' => 'Grupu',
@@ -632,7 +627,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
# E-mail user
'emailuser' => "Haruka korreiu eletróniku ba uza-na'in ne'e",
-'defemailsubject' => '{{SITENAME}} korreiu eletróniku',
+'defemailsubject' => '{{SITENAME}} - korreiu eletróniku husi uza-na\'in "$1"',
'noemailtitle' => "Lá'os diresaun korreiu eletróniku",
'emailusername' => "Naran uza-na'in:",
'emailsend' => 'Haruka',
@@ -665,7 +660,6 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'delete-legend' => 'Halakon',
'actioncomplete' => 'operasaun remata',
'deletedtext' => 'Ita foin halakon pájina "$1". Haree $2 ba "operasaun halakon" seluk.',
-'deletedarticle' => 'halakon "[[$1]]"',
'dellogpage' => 'Lista halakon',
'deletionlog' => 'lista halakon',
'deletecomment' => 'Motivu:',
@@ -702,7 +696,6 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'undeletelink' => 'lee/restaurar',
'undeleteviewlink' => 'haree',
'undeletecomment' => 'Razaun:',
-'undeletedarticle' => 'restaurar "[[$1]]"',
'undeletedrevisions' => 'restaurar {{PLURAL:$1|versaun|versaun}} $1',
'undelete-search-submit' => 'Buka',
'undelete-show-file-submit' => 'Sin',
@@ -767,7 +760,6 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
'movepagebtn' => 'Book pájina',
'movedto' => 'book tiha ba',
'movetalk' => 'Book pájina diskusaun mós',
-'1movedto2' => 'book tiha [[$1]] ba [[$2]]',
'movelogpage' => 'Lista book',
'movereason' => 'Motivu:',
'delete_and_move' => 'Halakon ho book',
diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php
index b8bf6d35..a16f6bf5 100644
--- a/languages/messages/MessagesTg_cyrl.php
+++ b/languages/messages/MessagesTg_cyrl.php
@@ -417,14 +417,13 @@ $1',
'cannotdelete' => 'Саҳифа Ñ‘ парвандаи мушаххаÑшударо ҳазф карда нашуд. (Мумкин аÑÑ‚ қаблан каÑе дигаре онро ҳазф карда бошад.)',
'badtitle' => 'Унвони номуноÑиб',
'badtitletext' => 'Унвони Ñаҳифаи дархоÑтшуда номӯътабар, холӣ, Ñ‘ пайванди байнизабони Ñ‘ байнивикии нодуруÑÑ‚ буд. Он метавонад Ñк Ñ‘ Ñкчанд аломатҳоеро дар бар гирад, ки дар унвонҳо иÑтифода шуда наметавонанд.',
-'perfcached' => 'Додаҳои зерин аз ҳофизаи муваққатӣ фарохонӣ шудаанд ва мумкин аÑÑ‚, комилан ба рӯз нашудаанд.',
-'perfcachedts' => 'Додаҳои зерин аз ҳофизаи муваққатӣ фарохонӣ шудаанд ва мумкин аÑÑ‚, охирин ба рӯзраÑонӣ $1 аÑÑ‚.',
+'perfcached' => 'Додаҳои зерин аз ҳофизаи муваққатӣ фарохонӣ шудаанд ва мумкин аÑÑ‚, комилан ба рӯз нашудаанд. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Додаҳои зерин аз ҳофизаи муваққатӣ фарохонӣ шудаанд ва мумкин аÑÑ‚, охирин ба рӯзраÑонӣ $1 аÑÑ‚. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Имкони ба рӯзраÑонии ин Ñаҳифа феълан ғайрифаъол шудааÑÑ‚.',
'wrong_wfQuery_params' => 'Параметрҳои нодуруÑÑ‚ ба wfQuery()<br />
Ðмал: $1<br />
ПурÑуҷӯ: $2',
'viewsource' => 'Ðамоиши матни вики',
-'viewsourcefor' => 'барои $1',
'actionthrottled' => 'Ҷилави амали шумо гирифта шуд',
'actionthrottledtext' => 'Ба манзури ҷилавгирӣ аз Ñпам, шумо иҷоза надоред, ки чунин амалеро беш аз чанд бор дар Ñк муддати замони кӯтоҳ анҷом бидиҳед. Лутфан Ð¿Ð°Ñ Ð°Ð· чанд дақиқа дубора талош кунед.',
'protectedpagetext' => 'Ин Ñаҳифа барои ҷилавгирӣ аз вироиш қуфл шудааÑÑ‚.',
@@ -607,9 +606,6 @@ $1',
Шумораи қатъи даÑтраÑии шумо $5 аÑÑ‚. Лутфан ин шумораро дар ҳар дархоÑте, ки дар ин матраҳ мекунед, қайд кунед.",
'blockednoreason' => 'далеле Ð¼ÑƒÑˆÐ°Ñ…Ñ…Ð°Ñ Ð½Ð°ÑˆÑƒÐ´Ð°Ð°ÑÑ‚',
-'blockedoriginalsource' => "Матни манбаи '''$1''' дар зер намоиш дода шудааÑÑ‚:",
-'blockededitsource' => "Матни '''вироишҳои шумо''' дар '''$1''' дар зер нишон дода шудааÑÑ‚:",
-'whitelistedittitle' => 'Барои вироиш вуруд боÑд кард',
'whitelistedittext' => 'Барои вироиши мақола боÑд ба ÑиÑтем $1 шавед.',
'confirmedittext' => 'Шумо боÑд нишонаи почтаи Ñлектрониатонро пеш аз вироиш кардани Ñаҳифаҳо, таÑдиқ кунед. Лутфан ин корро тариқи [[Special:Preferences|тарҷиҳоти корбар]] Ñурат диҳед.',
'nosuchsectiontitle' => 'Чунин бахше вуҷуд надорад',
@@ -762,22 +758,11 @@ $1',
'revdelete-unsuppress' => 'Хотимаи маҳдудиÑтҳо дар мавриди нуÑхаҳои интихобшуда',
'revdelete-log' => 'Сабаб:',
'revdelete-submit' => 'Ðмали кардан бар нуÑхаи интихобшуда',
-'revdelete-logentry' => 'тағйири намоии нуÑха дар [[$1]]',
-'logdelete-logentry' => 'тағйири намоии маврид дар [[$1]]',
'revdelete-success' => "'''Тағйири намоёнии нуÑха бо муваффақиÑÑ‚ анҷом шуд.'''",
'logdelete-success' => "'''Тағйири намоёнии маврид бо муваффақиÑÑ‚ анҷом шуд.'''",
'revdel-restore' => 'Тағйири падидорӣ',
'pagehist' => 'Таърихи Ñаҳифа',
'deletedhist' => 'Таърихи ҳазфшуда',
-'revdelete-content' => 'мӯҳтаво',
-'revdelete-summary' => 'вироиши хулоÑа',
-'revdelete-uname' => 'номи корбар',
-'revdelete-restricted' => 'маҳдудиÑтҳо ба мудирон амалӣ шуданд',
-'revdelete-unrestricted' => 'маҳдудиÑтҳо аз мудирон бардошта шуданд',
-'revdelete-hid' => '$1-ро пинҳон кард',
-'revdelete-unhid' => '$1-ро аз ҳолати пинҳон дар овард',
-'revdelete-log-message' => '$1 барои $2 {{PLURAL:$2|нуÑха|нуÑха}}',
-'logdelete-log-message' => '$1 барои $2 {{PLURAL:$2|воқеа|воқеаҳо}}',
'revdelete-edit-reasonlist' => 'Вироиш ҳазф далелҳо',
# Suppression log
@@ -1024,7 +1009,6 @@ $1',
'right-autopatrol' => 'Ðломат задани вироишҳо бо таври худкор ба унвони гаштхӯрда',
'right-patrolmarks' => 'Мушоҳидаи тағйироти охирини аломатгашта',
'right-unwatchedpages' => 'Мушоҳидаи Ñаҳифаҳое, ки пайгири намешаванд',
-'right-trackback' => 'Сабти Ñк бозтоб',
'right-mergehistory' => 'Идғоми таърихи Ñаҳифаҳо',
'right-userrights' => 'Вироиши ҳамаи ихтиёроти корбарон',
'right-userrights-interwiki' => 'Вироиши ихтиёроти корбарии корбарони дигар викиҳо',
@@ -1403,12 +1387,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Ҳеҷ корбаре ёфт нашуд.',
# Special:Log/newusers
-'newuserlogpage' => 'Гузориши Ñҷоди корбар',
-'newuserlogpagetext' => 'Ин гузориш аз номҳои корбарии тозаÑохташуда аÑÑ‚.',
-'newuserlog-byemail' => 'калимаи убур ба почтаи Ñлектронӣ фириÑтода шуд',
-'newuserlog-create-entry' => 'Корбари нав',
-'newuserlog-create2-entry' => 'ҳиÑоби ҷадиди $1 Ñҷод шуд',
-'newuserlog-autocreate-entry' => 'ҲиÑоб бо таври худкор Ñҷод шудааÑÑ‚',
+'newuserlogpage' => 'Гузориши Ñҷоди корбар',
+'newuserlogpagetext' => 'Ин гузориш аз номҳои корбарии тозаÑохташуда аÑÑ‚.',
# Special:ListGroupRights
'listgrouprights' => 'Ихтиёроти гурӯҳҳои корбарӣ',
@@ -1521,8 +1501,6 @@ $NEWPAGE
'actioncomplete' => 'Ðмал иҷро шуд',
'deletedtext' => '"$1" ҳазф шудааÑÑ‚.
Ðигаред ба $2 барои гузориши ҳазфи охирин.',
-'deletedarticle' => 'ҳазфшуда "[[$1]]"',
-'suppressedarticle' => '"[[$1]]"-ро мавқуф кард',
'dellogpage' => 'Гузоришҳои ҳазф',
'dellogpagetext' => 'ФеҳриÑти зер феҳриÑти аз охирин ҳазфҳоÑÑ‚. Ҳамаи вақтҳои нишон додашуда, вақти Ҷаҳонӣ (вақти Гринвич) аÑÑ‚.',
'deletionlog' => 'гузоришҳои ҳазф',
@@ -1623,7 +1601,6 @@ $NEWPAGE
'undeleteviewlink' => 'намоиш',
'undeletereset' => 'Ðз нав',
'undeletecomment' => 'Тавзеҳ:',
-'undeletedarticle' => 'Ñҳё "[[$1]]" {{PLURAL:$1|шуд|шуданд}}',
'undeletedrevisions' => '$1 нуÑха бақарор {{PLURAL:$1|шуд|шуданд}}',
'undeletedrevisions-files' => '$1 нуÑха ва $2 парванда барқарор {{PLURAL:$1|шуд|шуданд}}',
'undeletedfiles' => '$1 парванда барқарор {{PLURAL:$1|шуд|шуданд}}',
@@ -1834,9 +1811,6 @@ $1',
'movepage-page-moved' => 'Саҳифаи $1 ба $2 интиқол ёфт.',
'movepage-page-unmoved' => 'Саҳифаи $1 наметавонад ба $2 интиқол дода шавад.',
'movepage-max-pages' => 'Ҳади акÑар $1 {{PLURAL:$1|Ñаҳифа|Ñаҳифаҳо}} интиқол дода шуд ва Ñаҳифаҳои дигарро наметавон ба таври худкор мунтақил кард.',
-'1movedto2' => '[[$1]] ба [[$2]] кӯчонида шудааÑÑ‚',
-'1movedto2_redir' => '[[$1]] ба [[$2]], ки қабалан тағйири маÑит буд, кӯчонида шуд',
-'move-redirect-suppressed' => 'тағйири маÑир фурӯнишонда шуд',
'movelogpage' => 'Кӯчонидани гузориш',
'movelogpagetext' => 'Дар зер феҳриÑти Ñаҳифаҳои кӯчонидашуд омада аÑÑ‚.',
'movesubpage' => '{{PLURAL:$1|ЗерÑаҳифа|ЗерÑаҳифаҳо}}',
@@ -2034,8 +2008,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Гузоришҳои нигаҳбонӣ',
-'patrol-log-line' => '$1 аз $2-ро ба Ñурати поÑбонишуда аломат зад $3',
-'patrol-log-auto' => '(худкор)',
# Image deletion
'deletedrevision' => 'ÐуÑхаи ҳазфшудаи кӯҳнаи $1',
@@ -2060,7 +2032,7 @@ $1',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|Ñаҳифа|Ñаҳифаҳо}}',
'file-info' => 'андозаи парванда: $1, навъи MIME: $2',
'file-info-size' => '$1 × $2 пикÑел, ҳаҷми парванда: $3, навъи MIME: $4',
-'file-nohires' => '<small>ÐуÑхаи ҳаҷман ва Ñифатан баландтар даÑÑ‚Ñ€Ð°Ñ Ð½ÐµÑÑ‚.</small>',
+'file-nohires' => 'ÐуÑхаи ҳаҷман ва Ñифатан баландтар даÑÑ‚Ñ€Ð°Ñ Ð½ÐµÑÑ‚.',
'svg-long-desc' => 'SVG парванда, иÑмӣ $1 × $2 пикÑел, андозаи парванда: $3',
'show-big-image' => 'ÐкÑи пурра',
@@ -2413,13 +2385,6 @@ $5
'scarytranscludefailed' => '[Фарохонии шаблон барои $1 муÑÑÑар нашуд]',
'scarytranscludetoolong' => '[URL-Ðишонаи интернетии мавриди назар беш аз андоза дароз буд; бубахшед]',
-# Trackbacks
-'trackbackbox' => 'Бозтоби ин Ñаҳифа дар вебнавиштҳо:<br />
-$1',
-'trackbackremove' => '([$1 Ҳазф])',
-'trackbacklink' => 'Бозтоб',
-'trackbackdeleteok' => 'Бозтоби Ñаҳифа бо муваффақиÑÑ‚ ҳазф шуд.',
-
# Delete conflict
'deletedwhileediting' => "'''Огоҳӣ''': Ин Ñаҳифа баъди ба вироиш шурӯъ кардани шумо ҳазф шуда буд!",
'confirmrecreate' => "Корбар [[User:$1|$1]] ([[User talk:$1|баҳÑ]]) ин мақоларо Ð¿Ð°Ñ Ð°Ð· он ки огоз ба вироиши он намудаед бо далели зерин ҳазф кардааÑÑ‚:
@@ -2578,4 +2543,9 @@ $1',
'htmlform-reset' => 'Ботили тағйирот',
'htmlform-selectorother-other' => 'Дигар',
+# New logging system
+'revdelete-restricted' => 'маҳдудиÑтҳо ба мудирон амалӣ шуданд',
+'revdelete-unrestricted' => 'маҳдудиÑтҳо аз мудирон бардошта шуданд',
+'newuserlog-byemail' => 'калимаи убур ба почтаи Ñлектронӣ фириÑтода шуд',
+
);
diff --git a/languages/messages/MessagesTg_latn.php b/languages/messages/MessagesTg_latn.php
index 37e974b8..89cd2767 100644
--- a/languages/messages/MessagesTg_latn.php
+++ b/languages/messages/MessagesTg_latn.php
@@ -353,14 +353,13 @@ Lutfan inro ba [[Special:ListUsers/sysop|mudir]] bo iÅŸora kardani niÅŸonai URL
'badarticleerror' => 'Nametavon in amalro bar in sahifa ançom dod.',
'badtitle' => 'Unvoni nomunosib',
'badtitletext' => "Unvoni sahifai darxostşuda nomū'tabar, xolī, jo pajvandi bajnizaboni jo bajnivikiji nodurust bud. On metavonad jak jo jakcand alomathoero dar bar girad, ki dar unvonho istifoda şuda nametavonand.",
-'perfcached' => 'Dodahoi zerin az hofizai muvaqqatī faroxonī şudaand va mumkin ast, komilan ba rūz naşudaand.',
-'perfcachedts' => 'Dodahoi zerin az hofizai muvaqqatī faroxonī şudaand va mumkin ast, oxirin ba rūzrasonī $1 ast.',
+'perfcached' => 'Dodahoi zerin az hofizai muvaqqatī faroxonī şudaand va mumkin ast, komilan ba rūz naşudaand. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Dodahoi zerin az hofizai muvaqqatī faroxonī şudaand va mumkin ast, oxirin ba rūzrasonī $1 ast. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => "Imkoni ba rūzrasoniji in sahifa fe'lan ƣajrifa'ol şudaast.",
'wrong_wfQuery_params' => 'Parametrhoi nodurust ba wfQuery()<br />
Amal: $1<br />
Pursuçū: $2',
'viewsource' => 'NamoiÅŸi matni viki',
-'viewsourcefor' => 'baroi $1',
'actionthrottled' => 'Çilavi amali şumo girifta şud',
'actionthrottledtext' => 'Ba manzuri çilavgirī az spam, şumo içoza nadored, ki cunin amalero beş az cand bor dar jak muddati zamoni kūtoh ançom bidihed. Lutfan pas az cand daqiqa dubora taloş kuned.',
'protectedpagetext' => 'In sahifa baroi çilavgirī az viroiş qufl şudaast.',
@@ -515,9 +514,6 @@ Tavaççūh kuned, ki az qobilijati 'firistodai poctai elektronī ba in korbar'
NiÅŸonai kununiji IP Åžumo $3 ast, va ÅŸinosai qat'i dastrasiji Åžumo #$5 ast.
Lutfan in jo onro va jo hardui onro dar darxosthoi xud zikr kuned.",
'blockednoreason' => 'dalele muÅŸaxxas naÅŸudaast',
-'blockedoriginalsource' => "Matni manbai '''$1''' dar zer namoiÅŸ doda ÅŸudaast:",
-'blockededitsource' => "Matni '''viroiÅŸhoi ÅŸumo''' dar '''$1''' dar zer niÅŸon doda ÅŸudaast:",
-'whitelistedittitle' => 'Baroi viroiÅŸ vurud bojad kard',
'whitelistedittext' => 'Baroi viroiÅŸi maqola bojad ba sistem $1 ÅŸaved.',
'confirmedittext' => 'Şumo bojad nişonai poctai elektroniatonro peş az viroiş kardani sahifaho, tasdiq kuned. Lutfan in korro tariqi [[Special:Preferences|tarçihoti korbar]] surat dihed.',
'nosuchsectiontitle' => 'Cunin baxşe vuçud nadorad',
@@ -654,21 +650,10 @@ Sahifahoi çadidī aloqamandro metavoned [[Special:Search|dar viki]] çustuçū
'revdelete-suppress' => 'Az dastrasiji mudiron ba dodaho niz monandi sajri korbaron çilavgirī ba amal ojad',
'revdelete-unsuppress' => 'Xotimai mahdudijatho dar mavridi nusxahoi intixobÅŸuda',
'revdelete-log' => 'Sabab:',
-'revdelete-logentry' => 'taƣjiri namoiji nusxa dar [[$1]]',
-'logdelete-logentry' => 'taƣjiri namoiji mavrid dar [[$1]]',
'logdelete-success' => "'''Taƣjiri namojoniji mavrid bo muvaffaqijat ançom şud.'''",
'revdel-restore' => 'Taƣjiri padidorī',
'pagehist' => "Ta'rixi sahifa",
'deletedhist' => "Ta'rixi hazfÅŸuda",
-'revdelete-content' => 'mūhtavo',
-'revdelete-summary' => 'viroiÅŸi xulosa',
-'revdelete-uname' => 'nomi korbar',
-'revdelete-restricted' => 'mahdudijatho ba mudiron amalī şudand',
-'revdelete-unrestricted' => 'mahdudijatho az mudiron bardoÅŸta ÅŸudand',
-'revdelete-hid' => '$1-ro pinhon kard',
-'revdelete-unhid' => '$1-ro az holati pinhon dar ovard',
-'revdelete-log-message' => '$1 baroi $2 {{PLURAL:$2|nusxa|nusxa}}',
-'logdelete-log-message' => '$1 baroi $2 {{PLURAL:$2|voqea|voqeaho}}',
'revdelete-edit-reasonlist' => 'ViroiÅŸ hazf dalelho',
# Suppression log
@@ -907,7 +892,6 @@ On bojad kamtar az $1 {{PLURAL:$1|alomat|alomatho}} boÅŸad.',
'right-autopatrol' => 'Alomat zadani viroişho bo tavri xudkor ba unvoni gaştxūrda',
'right-patrolmarks' => 'Muşohidai taƣjiroti oxirini alomatgaşta',
'right-unwatchedpages' => 'MuÅŸohidai sahifahoe, ki pajgiri nameÅŸavand',
-'right-trackback' => 'Sabti jak boztob',
'right-mergehistory' => "Idƣomi ta'rixi sahifaho",
'right-userrights' => 'ViroiÅŸi hamai ixtijoroti korbaron',
'right-userrights-interwiki' => 'ViroiÅŸi ixtijoroti korbariji korbaroni digar vikiho',
@@ -1254,12 +1238,8 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
'listusers-noresult' => 'Heç korbare joft naşud.',
# Special:Log/newusers
-'newuserlogpage' => 'Guzorişi eçodi korbar',
-'newuserlogpagetext' => 'In guzoriÅŸ az nomhoi korbariji tozasoxtaÅŸuda ast.',
-'newuserlog-byemail' => 'kalimai ubur ba poctai elektronī firistoda şud',
-'newuserlog-create-entry' => 'Korbari nav',
-'newuserlog-create2-entry' => 'hisobi çadidi $1 eçod şud',
-'newuserlog-autocreate-entry' => 'Hisob bo tavri xudkor eçod şudaast',
+'newuserlogpage' => 'Guzorişi eçodi korbar',
+'newuserlogpagetext' => 'In guzoriÅŸ az nomhoi korbariji tozasoxtaÅŸuda ast.',
# Special:ListGroupRights
'listgrouprights' => 'Ixtijoroti gurūhhoi korbarī',
@@ -1345,8 +1325,6 @@ Agar ÅŸumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
'actioncomplete' => 'Amal içro şud',
'deletedtext' => '"$1" hazf ÅŸudaast.
Nigared ba $2 baroi guzoriÅŸi hazfi oxirin.',
-'deletedarticle' => 'hazfÅŸuda "[[$1]]"',
-'suppressedarticle' => '"[[$1]]"-ro mavquf kard',
'dellogpage' => 'GuzoriÅŸhoi hazf',
'dellogpagetext' => 'Fehristi zer fehristi az oxirin hazfhost. Hamai vaqthoi nişon dodaşuda, vaqti Çahonī (vaqti Grinvic) ast.',
'deletionlog' => 'guzoriÅŸhoi hazf',
@@ -1438,7 +1416,6 @@ Dar in holatho, ÅŸumo bojad cand nusxai oxirin sahifaro niz ehjo kuned.',
'undeleteviewlink' => 'namoiÅŸ',
'undeletereset' => 'Az nav',
'undeletecomment' => 'Tavzeh:',
-'undeletedarticle' => 'ehjo "[[$1]]" {{PLURAL:$1|ÅŸud|ÅŸudand}}',
'undeletedrevisions' => '$1 nusxa baqaror {{PLURAL:$1|ÅŸud|ÅŸudand}}',
'undeletedrevisions-files' => '$1 nusxa va $2 parvanda barqaror {{PLURAL:$1|ÅŸud|ÅŸudand}}',
'undeletedfiles' => '$1 parvanda barqaror {{PLURAL:$1|ÅŸud|ÅŸudand}}',
@@ -1644,9 +1621,6 @@ Lutfan nomi digarero intixob namoed.",
'movepage-page-moved' => 'Sahifai $1 ba $2 intiqol joft.',
'movepage-page-unmoved' => 'Sahifai $1 nametavonad ba $2 intiqol doda ÅŸavad.',
'movepage-max-pages' => 'Hadi aksar $1 {{PLURAL:$1|sahifa|sahifaho}} intiqol doda ÅŸud va sahifahoi digarro nametavon ba tavri xudkor muntaqil kard.',
-'1movedto2' => '[[$1]] ba [[$2]] kūconida şudaast',
-'1movedto2_redir' => '[[$1]] ba [[$2]], ki qabalan taƣjiri masit bud, kūconida şud',
-'move-redirect-suppressed' => 'taƣjiri masir furūnişonda şud',
'movelogpage' => 'KÅ«conidani guzoriÅŸ',
'movelogpagetext' => 'Dar zer fehristi sahifahoi kūconidaşud omada ast.',
'movesubpage' => '{{PLURAL:$1|Zersahifa|Zersahifaho}}',
@@ -1844,8 +1818,6 @@ Ehtimolan in az sababi dar bar giriftani pajvandi beruna ba somonai xoriçiji ba
# Patrol log
'patrol-log-page' => 'Guzorişhoi nigahbonī',
-'patrol-log-line' => '$1 az $2-ro ba surati posboniÅŸuda alomat zad $3',
-'patrol-log-auto' => '(xudkor)',
# Image deletion
'deletedrevision' => 'Nusxai hazfşudai kūhnai $1',
@@ -1869,7 +1841,7 @@ Bo içroi on, sistemai şumo şojad oseb bubinad.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|sahifa|sahifaho}}',
'file-info' => "andozai parvanda: $1, nav'i MIME: $2",
'file-info-size' => "$1 × $2 piksel, haçmi parvanda: $3, nav'i MIME: $4",
-'file-nohires' => '<small>Nusxai haçman va sifatan balandtar dastras nest.</small>',
+'file-nohires' => 'Nusxai haçman va sifatan balandtar dastras nest.',
'svg-long-desc' => 'SVG parvanda, ismī $1 × $2 piksel, andozai parvanda: $3',
'show-big-image' => 'Aksi purra',
@@ -2221,13 +2193,6 @@ In kodi ta\'jid dar $4 ba pojon xohad rasid.',
'scarytranscludedisabled' => "[Ƣunçoişi bajnivikijona fa'ol nest]",
'scarytranscludefailed' => '[Faroxoniji ÅŸablon baroi $1 mujassar naÅŸud]',
-# Trackbacks
-'trackbackbox' => 'Boztobi in sahifa dar vebnaviÅŸtho:<br />
-$1',
-'trackbackremove' => '([$1 Hazf])',
-'trackbacklink' => 'Boztob',
-'trackbackdeleteok' => 'Boztobi sahifa bo muvaffaqijat hazf ÅŸud.',
-
# Delete conflict
'deletedwhileediting' => "'''Ogohī''': In sahifa ba'di ba viroiş şurū' kardani şumo hazf şuda bud!",
'confirmrecreate' => "Korbar [[User:$1|$1]] ([[User talk:$1|bahs]]) in maqolaro pas az on ki ogoz ba viroiÅŸi on namudaed bo daleli zerin hazf kardaast:
@@ -2381,4 +2346,9 @@ NiÅŸonai pajvandro biduni peÅŸvand "{{ns:file}}:" vorid kuned.',
'htmlform-reset' => 'Botili taƣjirot',
'htmlform-selectorother-other' => 'Digar',
+# New logging system
+'revdelete-restricted' => 'mahdudijatho ba mudiron amalī şudand',
+'revdelete-unrestricted' => 'mahdudijatho az mudiron bardoÅŸta ÅŸudand',
+'newuserlog-byemail' => 'kalimai ubur ba poctai elektronī firistoda şud',
+
);
diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php
index 8fb259c6..d6004af6 100644
--- a/languages/messages/MessagesTh.php
+++ b/languages/messages/MessagesTh.php
@@ -139,12 +139,12 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#เปลี่ยนทาง', '#REDIRECT' ),
- 'notoc' => array( '0', '__ไม่มีสารบัà¸__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__ไม่มีà¹à¸à¸¥à¹€à¸¥à¸­à¸£à¸µà¹ˆ__', '__NOGALLERY__' ),
- 'noeditsection' => array( '0', '__ไม่มีà¹à¸à¹‰à¹€à¸‰à¸žà¸²à¸°à¸ªà¹ˆà¸§à¸™__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'เดือนปัจจุบัน', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ชื่อเดือนปัจจุบัน', 'CURRENTMONTHNAME' ),
+ 'redirect' => array( '0', '#เปลี่ยนทาง', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ไม่มีสารบัà¸__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ไม่มีà¹à¸à¸¥à¹€à¸¥à¸­à¸£à¸µà¹ˆ__', '__NOGALLERY__' ),
+ 'noeditsection' => array( '0', '__ไม่มีà¹à¸à¹‰à¹€à¸‰à¸žà¸²à¸°à¸ªà¹ˆà¸§à¸™__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'เดือนปัจจุบัน', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ชื่อเดือนปัจจุบัน', 'CURRENTMONTHNAME' ),
);
$datePreferences = array(
@@ -539,20 +539,22 @@ $1',
'badarticleerror' => 'à¸à¸²à¸£à¸à¸£à¸°à¸—ำนี้ไม่สามารถดำเนินà¸à¸²à¸£à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¹„ด้',
'cannotdelete' => 'ไม่สามารถลบหน้าหรือไฟล์ "$1"
อาจมีผู้อื่นลบไปà¹à¸¥à¹‰à¸§',
+'cannotdelete-title' => "ไม่สามารถลบหน้า ''$1''",
'badtitle' => 'ชื่อหน้าไม่เหมาะสม',
'badtitletext' => 'ชื่อหน้าที่ร้องขอไม่ถูà¸à¸•à¹‰à¸­à¸‡ เป็นชื่อว่าง หรือชื่อที่ผิดพลาดเนื่องจาà¸à¸¥à¸´à¸‡à¸à¹Œà¸‚้ามมาจาà¸à¸ à¸²à¸©à¸²à¸­à¸·à¹ˆà¸™ ชื่อที่ใช้อาจจะมีตัวอัà¸à¸©à¸£à¸—ี่ไม่สามารถถูà¸à¹ƒà¸Šà¹‰à¹€à¸›à¹‡à¸™à¸Šà¸·à¹ˆà¸­à¹„ด้',
-'perfcached' => 'ข้อมูลต่อไปนี้อาจเป็นข้อมูลเà¸à¹ˆà¸² ที่เà¸à¹‡à¸šà¹„ว้ในà¹à¸„ชของระบบ',
-'perfcachedts' => 'ข้อมูลด้านล่างมาจาà¸à¹à¸„ช ซึ่งปรับปรุงครั้งล่าสุดเมื่อ $1',
+'perfcached' => 'ข้อมูลต่อไปนี้อาจเป็นข้อมูลเà¸à¹ˆà¸² ที่เà¸à¹‡à¸šà¹„ว้ในà¹à¸„ชของระบบ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ข้อมูลต่อไปนี้ถูà¸à¹€à¸à¹‡à¸šà¹„ว้ในหน่วยความจำà¹à¸„ช, à¹à¸¥à¸°à¹„ด้รับà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸„รั้งสุดท้าย $1. ค่าสูงสุดของ {{PLURAL:$4|หนึ่งผลลัพธ์คือ|$4 ผลลัพธ์คือ}} จะสามารถเà¸à¹‡à¸šà¹„ว้ในหน่วยความจำà¹à¸„ชได้',
'querypage-no-updates' => 'ขณะนี้à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸–ูà¸à¸£à¸°à¸‡à¸±à¸š ข้อมูลในที่นี่จะไม่รีเฟรชเป็นข้อมูลปัจจุบัน',
'wrong_wfQuery_params' => 'พารามิเตอร์ที่ส่งไป wfQuery() ไม่ถูà¸à¸•à¹‰à¸­à¸‡<br />
ฟังà¸à¹Œà¸Šà¸±à¹ˆà¸™: $1<br />
คำค้น: $2',
'viewsource' => 'ดูโค้ด',
-'viewsourcefor' => 'สำหรับ $1',
+'viewsource-title' => 'ดูโค้ดสำหรับ $1',
'actionthrottled' => 'à¸à¸²à¸£à¸à¸£à¸°à¸—ำนี้ถูà¸à¸£à¸°à¸‡à¸±à¸šà¸Šà¸±à¹ˆà¸§à¸„ราว',
'actionthrottledtext' => 'เพื่อเป็นมาตรà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸ªà¹à¸›à¸¡ คุณจึงถูà¸à¸ˆà¸³à¸à¸±à¸”มิให้à¸à¸£à¸°à¸—ำสิ่งนี้ไม่ให้ติดต่อà¸à¸±à¸™à¸«à¸¥à¸²à¸¢à¸„รั้งเà¸à¸´à¸™à¹„ปในช่วงระยะเวลาสั้น ๆ ซึ่งขณะนี้คุณได้à¸à¸£à¸°à¸—ำเà¸à¸´à¸™à¸‚ีดจำà¸à¸±à¸”à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่à¹à¸¥à¹‰à¸§à¸¥à¸­à¸‡à¸­à¸µà¸à¸„รั้ง',
'protectedpagetext' => 'หน้านี้ถูà¸à¸¥à¹‡à¸­à¸à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'viewsourcetext' => 'คุณสามารถดูà¹à¸¥à¸°à¸„ัดลอà¸à¹‚ค้ดหน้านี้ได้:',
+'viewyourtext' => "คุณสามารถเปิดดูà¹à¸¥à¸°à¸„ัดลอà¸à¸•à¹‰à¸™à¸‰à¸šà¸±à¸šà¸‚อง '''à¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณ''' ของหน้านี้ได้",
'protectedinterface' => 'หน้านี้เป็นข้อความที่ใช้à¹à¸ªà¸”งบนหน้าตาหรือส่วนติดต่อผู้ใช้ของซอฟต์à¹à¸§à¸£à¹Œ ถูà¸à¸¥à¹‡à¸­à¸à¸«à¹‰à¸²à¸¡à¹à¸à¹‰à¹„ขเพื่อป้องà¸à¸±à¸™à¸à¸²à¸£à¸à¹ˆà¸­à¸à¸§à¸™',
'editinginterface' => "'''คำเตือน:''' คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸à¹‰à¹„ขข้อความที่ใช้à¹à¸ªà¸”งบนหน้าตาหรือส่วนติดต่อผู้ใช้ของซอฟต์à¹à¸§à¸£à¹Œ à¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้านี้จะมีผลต่อà¸à¸²à¸£à¹à¸ªà¸”งข้อความบนส่วนติดต่อผู้ใช้ของทุà¸à¸„น ถ้าคุณต้องà¸à¸²à¸£à¹à¸›à¸¥à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰ ให้ลองใช้บริà¸à¸²à¸£à¸‚อง [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] ซึ่งเป็นโครงà¸à¸²à¸£à¸ªà¸³à¸«à¸£à¸±à¸šà¹à¸›à¸¥à¸‹à¸­à¸Ÿà¸•à¹Œà¹à¸§à¸£à¹Œà¸¡à¸µà¹€à¸”ียวิà¸à¸´",
'sqlhidden' => '(คำสั่ง SQL ซ่อนอยู่)',
@@ -647,6 +649,7 @@ $1',
'emailconfirmlink' => 'ยืนยันอีเมลของคุณ',
'invalidemailaddress' => 'รูปà¹à¸šà¸šà¸­à¸µà¹€à¸¡à¸¥à¸—ี่คุณใส่ไม่ถูà¸à¸•à¹‰à¸­à¸‡ à¸à¸£à¸¸à¸“าใส่อีเมลให้ถูà¸à¸•à¹‰à¸­à¸‡à¸•à¸²à¸¡à¸£à¸¹à¸›à¹à¸šà¸š
หรือไม่ต้องใส่ข้อความอะไรลงไปเลยในช่องนี้',
+'cannotchangeemail' => 'ที่อยู่อีเมลที่ใช้งานà¸à¸±à¸šà¸šà¸±à¸à¸Šà¸µà¹„ม่สามารถเปลี่ยนได้ในสารานุà¸à¸£à¸¡à¸™à¸µà¹‰',
'accountcreated' => 'ชื่อบัà¸à¸Šà¸µà¹„ด้ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้น',
'accountcreatedtext' => 'ชื่อบัà¸à¸Šà¸µà¸ªà¸³à¸«à¸£à¸±à¸š $1 ได้ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§',
'createaccount-title' => 'สร้างบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸ªà¸³à¸«à¸£à¸±à¸š {{SITENAME}}',
@@ -662,6 +665,7 @@ $1',
# E-mail sending
'php-mail-error-unknown' => 'ข้อผิดพลาดที่ไม่รู้จัà¸à¹ƒà¸™à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™ mail() ของ PHP',
+'user-mail-no-addy' => 'พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล',
# Change password dialog
'resetpass' => 'เปลี่ยนรหัสผ่าน',
@@ -692,6 +696,16 @@ $1',
รหัสผ่านชั่วคราว: $2',
'passwordreset-emailsent' => 'อีเมล์à¹à¸ˆà¹‰à¸‡à¹€à¸•à¸·à¸­à¸™à¹„ด้ถูà¸à¸ªà¹ˆà¸‡à¹„ปà¹à¸¥à¹‰à¸§',
+# Special:ChangeEmail
+'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
+'changeemail-header' => 'เปลี่ยนที่อยู่อีเมลของบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
+'changeemail-no-info' => 'คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงหน้าเอà¸à¸ªà¸²à¸£à¸™à¸µà¹‰à¹„ด้โดยตรง',
+'changeemail-oldemail' => 'ที่อยู่อีเมลปัจจุบัน:',
+'changeemail-newemail' => 'ที่อยู่อีเมลใหม่:',
+'changeemail-none' => '(ไม่มี)',
+'changeemail-submit' => 'เปลี่ยนอีเมล',
+'changeemail-cancel' => 'ยà¸à¹€à¸¥à¸´à¸',
+
# Edit page toolbar
'bold_sample' => 'ทำตัวหนา',
'bold_tip' => 'ทำตัวหนา',
@@ -755,9 +769,6 @@ $1 เป็นผู้ดำเนินà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹ƒà¸™à¸„รà¸
หมายเลขไอพีปัจจุบันของคุณคือ $3 หมายเลขà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸„ือ #$5
à¸à¸£à¸¸à¸“าระบุรายละเอียดทั้งหมดข้างต้นในà¸à¸²à¸£à¸£à¹‰à¸­à¸‡à¸‚อใดๆ ที่คุณà¸à¸£à¸°à¸—ำ',
'blockednoreason' => 'ไม่ได้ให้เหตุผลไว้',
-'blockedoriginalsource' => "โค้ดของ '''$1''' à¹à¸ªà¸”งผลด้านล่าง:",
-'blockededitsource' => "'''ข้อความที่คุณได้à¹à¸à¹‰à¹„ข''' ใน '''$1''' à¹à¸ªà¸”งผลด้านล่าง:",
-'whitelistedittitle' => 'ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ขถ้าไม่ล็อà¸à¸­à¸´à¸™',
'whitelistedittext' => 'คุณต้อง $1 เพื่อทำà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'confirmedittext' => 'ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ขถ้าไม่ได้ทำà¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥ à¸à¸£à¸¸à¸“ายืนยันอีเมลผ่านทาง [[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าผู้ใช้]]',
'nosuchsectiontitle' => 'ไม่พบหัวข้อย่อย',
@@ -1002,8 +1013,6 @@ $1 เป็นผู้ดำเนินà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹ƒà¸™à¸„รà¸
'revdelete-unsuppress' => 'ลบà¸à¸²à¸£à¸„วบคุมออà¸à¸ªà¸³à¸«à¸£à¸±à¸šà¸£à¸¸à¹ˆà¸™à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸—ี่ถูà¸à¹€à¸£à¸µà¸¢à¸à¸à¸¥à¸±à¸š',
'revdelete-log' => 'เหตุผล:',
'revdelete-submit' => 'ใช้à¸à¸±à¸š{{PLURAL:$1|รุ่น|รุ่น}}ที่เลือà¸',
-'revdelete-logentry' => 'เปลี่ยนà¹à¸›à¸¥à¸‡à¸ªà¸–านะà¸à¸²à¸£à¸‹à¹ˆà¸­à¸™à¸£à¸¸à¹ˆà¸™à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸‚อง [[$1]]',
-'logdelete-logentry' => 'à¸à¸²à¸£à¹€à¸‚้าดูเหตุà¸à¸²à¸£à¸“์ที่ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸‚อง [[$1]]',
'revdelete-success' => "'''à¸à¸²à¸£à¹à¸ªà¸”งผลของรุ่นปรับปรุงถูà¸à¸à¸³à¸«à¸™à¸”ค่าเรียบร้อย'''",
'revdelete-failure' => "'''à¸à¸²à¸£à¹à¸ªà¸”งผลของรุ่นปรับปรุงไม่สามารถà¸à¸³à¸«à¸™à¸”ค่าได้:'''
$1",
@@ -1015,15 +1024,6 @@ $1",
'revdel-restore-visible' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่มองเห็นได้',
'pagehist' => 'ประวัติหน้า',
'deletedhist' => 'ลบประวัติ',
-'revdelete-content' => 'เนื้อหา',
-'revdelete-summary' => 'คำอธิบายโดยย่อ',
-'revdelete-uname' => 'ชื่อผู้ใช้ :',
-'revdelete-restricted' => 'จำà¸à¸±à¸”ให้เฉพาะผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸‚ั้นพื้นà¸à¸²à¸™',
-'revdelete-unrestricted' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”ให้เฉพาะผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸‚ั้นพื้นà¸à¸²à¸™',
-'revdelete-hid' => 'ซ่อน $1',
-'revdelete-unhid' => 'à¹à¸ªà¸”ง $1',
-'revdelete-log-message' => '$1 สำหรับ $2 {{PLURAL:$2|รุ่น|รุ่น}}',
-'logdelete-log-message' => '$1 สำหรับ $2 {{PLURAL:$2|เหตุà¸à¸²à¸£à¸“์|เหตุà¸à¸²à¸£à¸“์}}',
'revdelete-hide-current' => 'เà¸à¸´à¸”ความผิดพลาดในà¸à¸²à¸£à¸‹à¹ˆà¸­à¸™à¸‰à¸šà¸±à¸šà¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¹ƒà¸™à¸§à¸±à¸™à¸—ี่ $2 เวลา $1: นี่คือฉบับปรังปรุงปัจจุบัน
ไม่สามารถซ่อนได้',
'revdelete-show-no-access' => 'เà¸à¸´à¸”ความผิดพลาดในà¸à¸²à¸£à¸”ูฉบับปรับปรุงในวันที่ $2 เวลา $1: ฉบับปรับปรุงนี้ถูà¸à¸à¸³à¸«à¸™à¸”ให้ "จำà¸à¸±à¸”à¸à¸²à¸£à¸”ู"
@@ -1179,12 +1179,14 @@ $1",
'prefs-rc' => 'ปรับปรุงล่าสุด',
'prefs-watchlist' => 'รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'prefs-watchlist-days' => 'จำนวนวันที่à¹à¸ªà¸”งในรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู:',
-'prefs-watchlist-days-max' => '(มาà¸à¸ªà¸¸à¸” 7 วัน)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'จำนวนà¸à¸²à¸£à¹à¸à¹‰à¹„ขที่à¹à¸ªà¸”งในรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูที่มีà¸à¸²à¸£à¸„ลี่ออà¸:',
'prefs-watchlist-edits-max' => 'จำนวนสูงสุด: 1000',
'prefs-watchlist-token' => 'สัà¸à¸¥à¸±à¸à¸©à¸“์รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู:',
'prefs-misc' => 'เบ็ดเตล็ด',
'prefs-resetpass' => 'เปลี่ยนรหัสผ่าน',
+'prefs-changeemail' => 'เปลี่ยนที่อยู่อีเมล',
+'prefs-setemail' => 'ตั้งที่อยู่อีเมล',
'prefs-email' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าอีเมล',
'prefs-rendering' => 'รูปลัà¸à¸©à¸“์',
'saveprefs' => 'บันทึà¸',
@@ -1377,13 +1379,13 @@ $1",
'right-autopatrol' => 'ตั้งให้à¸à¸²à¸£à¹à¸à¹‰à¹„ขของตนเองว่าตรวจสอบà¹à¸¥à¹‰à¸§à¹‚ดยอัตโนมัติ',
'right-patrolmarks' => 'ดูà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ของà¸à¸²à¸£à¸—ำเครื่องหมายตรวจสอบ',
'right-unwatchedpages' => 'ดูรายชื่อของหน้าที่ไม่ถูà¸à¹€à¸à¹‰à¸²à¸”ูโดยผู้ใช้ใด ๆ',
-'right-trackback' => 'ส่งà¸à¸²à¸£à¸•à¸´à¸”ตามà¸à¸¥à¸±à¸š',
'right-mergehistory' => 'รวมประวัติà¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้า',
'right-userrights' => 'à¹à¸à¹‰à¹„ขสิทธิผู้ใช้ทั้งหมด',
'right-userrights-interwiki' => 'à¹à¸à¹‰à¹„ขสิทธิของผู้ใช้อื่นบนวิà¸à¸´à¸­à¸·à¹ˆà¸™',
'right-siteadmin' => 'ล็อà¸à¹à¸¥à¸°à¸›à¸¥à¸”ล็อà¸à¸à¸²à¸™à¸‚้อมูล',
'right-override-export-depth' => 'ส่งออà¸à¸«à¸™à¹‰à¸² รวมหน้าที่เชื่อมโยงà¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸ªà¸¹à¸‡à¸ªà¸¸à¸” 5 ลำดับชั้น',
'right-sendemail' => 'ส่งอีเมลหาผู้ใช้อื่น',
+'right-passwordreset' => 'เปลี่ยนรหัสผ่านของผู้ใช้ ([[Special:PasswordReset|หน้าพิเศษ]])',
# User rights log
'rightslog' => 'ปูมสิทธิผู้ใช้',
@@ -1421,11 +1423,11 @@ $1",
'action-patrol' => 'ทำเครื่องหมายà¸à¸²à¸£à¹à¸à¹‰à¹„ขของผู้ใช้อื่นว่าตรวจà¹à¸¥à¹‰à¸§',
'action-autopatrol' => 'ทำเครื่องหมายà¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณว่าตรวจà¹à¸¥à¹‰à¸§',
'action-unwatchedpages' => 'ดูรายà¸à¸²à¸£à¸‚องหน้าที่ไม่มีผู้เà¸à¹‰à¸²à¸”ู',
-'action-trackback' => 'ส่งà¸à¸²à¸£à¸•à¸´à¸”ตามà¸à¸¥à¸±à¸š',
'action-mergehistory' => 'รวมประวัติหน้านี้',
'action-userrights' => 'à¹à¸à¹‰à¹„ขสิทธิผู้ใช้ทั้งหมด',
'action-userrights-interwiki' => 'à¹à¸à¹‰à¹„ขสิทธิผู้ใช้สำหรับวิà¸à¸´à¸™à¸µà¹‰',
'action-siteadmin' => 'ล็อà¸à¸«à¸£à¸·à¸­à¸›à¸¥à¸”ล็อà¸à¸à¸²à¸™à¸‚้อมูล',
+'action-sendemail' => 'ส่งอีเมล์',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|à¸à¸²à¸£à¹à¸à¹‰à¹„ข|à¸à¸²à¸£à¹à¸à¹‰à¹„ข}}',
@@ -1509,6 +1511,7 @@ $1",
'ignorewarnings' => 'ไม่à¹à¸ªà¸”งคำเตือน',
'minlength1' => 'ชื่อไฟล์ต้องมีตัวอัà¸à¸©à¸£à¸­à¸¢à¹ˆà¸²à¸‡à¸™à¹‰à¸­à¸¢à¸«à¸™à¸¶à¹ˆà¸‡à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£',
'illegalfilename' => 'ชื่อไฟล์ "$1" มีตัวอัà¸à¸©à¸£à¸—ี่ไม่สามารถนำมาใช้ได้ à¸à¸£à¸¸à¸“าเปลี่ยนชื่อไฟล์à¹à¸¥à¸°à¸­à¸±à¸›à¹‚หลดอีà¸à¸„รั้งหนึ่ง',
+'filename-toolong' => 'ชื่อไฟล์ไม่อาจยาวà¸à¸§à¹ˆà¸² 240 ไบต์',
'badfilename' => 'ชื่อไฟล์ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹€à¸›à¹‡à¸™ "$1"',
'filetype-mime-mismatch' => 'นามสà¸à¸¸à¸¥à¹„ฟล์ ".$1" ไม่ตรงà¸à¸±à¸šà¸Šà¸™à¸´à¸” MIME ของà¹à¸Ÿà¹‰à¸¡à¸—ี่ตรวจพบ ($2)',
'filetype-badmime' => 'ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¸­à¸±à¸›à¹‚หลดไฟล์ที่เป็นไมม์ชนิด "$1"',
@@ -1598,6 +1601,16 @@ $1',
'upload-unknown-size' => 'ไม่ทราบขนาด',
'upload-http-error' => 'เà¸à¸´à¸”ข้อผิดพลาด HTTP: $1',
+# File backend
+'backend-fail-backup' => 'ไม่สามารถสำรองข้อมูลไฟล์ $1.',
+'backend-fail-notexists' => 'ไม่พบไฟล์ $1 ที่ต้องà¸à¸²à¸£',
+'backend-fail-delete' => 'ไม่สามารถลบไฟล์ $1 ได้',
+'backend-fail-alreadyexists' => 'ไฟล์ $1 มีอยู่à¹à¸¥à¹‰à¸§',
+'backend-fail-copy' => 'ไม่สามารถคัดลอà¸à¹„ฟล์ $1 ไปยัง $2 ได้',
+'backend-fail-move' => 'ไม่สามารถย้ายไฟล์ $1 ไปยัง $2 ได้',
+'backend-fail-read' => 'ไม่สามารถอ่านไฟล์ $1 ได้',
+'backend-fail-create' => 'ไม่สามารถสร้างไฟล์ $1 ได้.',
+
# ZipDirectoryReader
'zip-unsupported' => 'ไฟล์ดังà¸à¸¥à¹ˆà¸²à¸§à¹€à¸›à¹‡à¸™à¹„ฟล์ ZIP ซึ่งใช้คุณสมบัติ ZIP ที่ไม่ได้รับà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¹‚ดย MediaWiki.
ไฟล์ดังà¸à¸¥à¹ˆà¸²à¸§à¸™à¸µà¹‰à¹„ม่สามารถตรวจสอบเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸²à¸£à¸£à¸±à¸à¸©à¸²à¸„วามปลอดภัยได้อย่างเหมาะสม.',
@@ -1715,23 +1728,24 @@ $1',
'filerevert-badversion' => 'ไม่มีรุ่นà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸‚องไฟล์นี้ในเวลาที่à¸à¸³à¸«à¸™à¸”ไว้',
# File deletion
-'filedelete' => 'ลบ $1',
-'filedelete-legend' => 'ลบไฟล์',
-'filedelete-intro' => "คุณà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸¥à¸šà¹„ฟล์ '''[[Media:$1|$1]]''' ไปพร้อมà¸à¸±à¸šà¸›à¸£à¸°à¸§à¸±à¸•à¸´à¸‚องไฟล์นี้",
-'filedelete-intro-old' => "คุณà¸à¸³à¸¥à¸±à¸‡à¸¥à¸š '''[[Media:$1|$1]]''' รุ่น [$4 $3, $2]",
-'filedelete-comment' => 'เหตุผล:',
-'filedelete-submit' => 'ลบ',
-'filedelete-success' => "ลบไฟล์ '''$1''' เรียบร้อยà¹à¸¥à¹‰à¸§",
-'filedelete-success-old' => "ไฟล์ '''[[Media:$1|$1]]''' รุ่นเมื่อ $3, $2 ถูà¸à¸¥à¸šà¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢à¹à¸¥à¹‰à¸§",
-'filedelete-nofile' => "ไม่มีไฟล์ '''$1'''",
-'filedelete-nofile-old' => "ไม่มี '''$1''' ตามคุณลัà¸à¸©à¸“ะที่à¸à¸³à¸«à¸™à¸” อยู่ในà¸à¸£à¸¸",
-'filedelete-otherreason' => 'เหตุผลอื่นเพิ่มเติม:',
-'filedelete-reason-otherlist' => 'เหตุผลอื่น',
-'filedelete-reason-dropdown' => '* เหตุผลทั่วไปของà¸à¸²à¸£à¸¥à¸š
+'filedelete' => 'ลบ $1',
+'filedelete-legend' => 'ลบไฟล์',
+'filedelete-intro' => "คุณà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸¥à¸šà¹„ฟล์ '''[[Media:$1|$1]]''' ไปพร้อมà¸à¸±à¸šà¸›à¸£à¸°à¸§à¸±à¸•à¸´à¸‚องไฟล์นี้",
+'filedelete-intro-old' => "คุณà¸à¸³à¸¥à¸±à¸‡à¸¥à¸š '''[[Media:$1|$1]]''' รุ่น [$4 $3, $2]",
+'filedelete-comment' => 'เหตุผล:',
+'filedelete-submit' => 'ลบ',
+'filedelete-success' => "ลบไฟล์ '''$1''' เรียบร้อยà¹à¸¥à¹‰à¸§",
+'filedelete-success-old' => "ไฟล์ '''[[Media:$1|$1]]''' รุ่นเมื่อ $3, $2 ถูà¸à¸¥à¸šà¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢à¹à¸¥à¹‰à¸§",
+'filedelete-nofile' => "ไม่มีไฟล์ '''$1'''",
+'filedelete-nofile-old' => "ไม่มี '''$1''' ตามคุณลัà¸à¸©à¸“ะที่à¸à¸³à¸«à¸™à¸” อยู่ในà¸à¸£à¸¸",
+'filedelete-otherreason' => 'เหตุผลอื่นเพิ่มเติม:',
+'filedelete-reason-otherlist' => 'เหตุผลอื่น',
+'filedelete-reason-dropdown' => '* เหตุผลทั่วไปของà¸à¸²à¸£à¸¥à¸š
** ละเมิดลิขสิทธิ์
** ไฟล์ซ้ำ',
-'filedelete-edit-reasonlist' => 'à¹à¸à¹‰à¹„ขรายชื่อเหตุผลในà¸à¸²à¸£à¸¥à¸š',
-'filedelete-maintenance' => 'ปิดà¸à¸²à¸£à¸¥à¸šà¹à¸¥à¸°à¹€à¸£à¸µà¸¢à¸à¸„ืนไฟล์ไว้ชั่วคราว ในระหว่างà¸à¸²à¸£à¸‹à¹ˆà¸­à¸¡à¸šà¸³à¸£à¸¸à¸‡',
+'filedelete-edit-reasonlist' => 'à¹à¸à¹‰à¹„ขรายชื่อเหตุผลในà¸à¸²à¸£à¸¥à¸š',
+'filedelete-maintenance' => 'ปิดà¸à¸²à¸£à¸¥à¸šà¹à¸¥à¸°à¹€à¸£à¸µà¸¢à¸à¸„ืนไฟล์ไว้ชั่วคราว ในระหว่างà¸à¸²à¸£à¸‹à¹ˆà¸­à¸¡à¸šà¸³à¸£à¸¸à¸‡',
+'filedelete-maintenance-title' => 'ไม่สามารถลบไฟล์',
# MIME search
'mimesearch' => 'ค้นหาตามชนิดไมม์',
@@ -1852,7 +1866,7 @@ $1',
'listusers-editsonly' => 'à¹à¸ªà¸”งเฉพาะผู้ใช้ที่ร่วมà¹à¸à¹‰à¹„ข',
'listusers-creationsort' => 'เรียงลำดับตามวันสร้าง',
'usereditcount' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ข $1 {{PLURAL:$1|ครั้ง|ครั้ง}}',
-'usercreated' => 'ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸¡à¸·à¹ˆà¸­ $1 เวลา $2',
+'usercreated' => '{{GENDER:$3|Created}} เมื่อ $1 เวลา $2',
'newpages' => 'หน้าใหม่',
'newpages-username' => 'ชื่อผู้ใช้:',
'ancientpages' => 'หน้าที่ไม่ได้à¹à¸à¹‰à¹„ขนานสุด',
@@ -1944,12 +1958,8 @@ $1',
'activeusers-noresult' => 'ไม่พบชื่อผู้ใช้',
# Special:Log/newusers
-'newuserlogpage' => 'ปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹ƒà¸«à¸¡à¹ˆ',
-'newuserlogpagetext' => 'นี่คือปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
-'newuserlog-byemail' => 'รหัสผ่านถูà¸à¸ªà¹ˆà¸‡à¸—างอีเมล',
-'newuserlog-create-entry' => 'ผู้ใช้ใหม่',
-'newuserlog-create2-entry' => 'ได้สร้างบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹ƒà¸«à¸¡à¹ˆà¸Šà¸·à¹ˆà¸­ $1',
-'newuserlog-autocreate-entry' => 'ชื่อบัà¸à¸Šà¸µà¸–ูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸­à¸±à¸•à¹‚นมัติ',
+'newuserlogpage' => 'ปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹ƒà¸«à¸¡à¹ˆ',
+'newuserlogpagetext' => 'นี่คือปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
# Special:ListGroupRights
'listgrouprights' => 'สิทธิของà¸à¸¥à¸¸à¹ˆà¸¡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
@@ -1977,7 +1987,7 @@ $1',
'emailpagetext' => 'คุณสามารถใช้à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸”้านล่างส่งอีเมลหาผู้ใช้คนนี้
ชื่ออีเมลผู้ส่งจะใช้ชื่ออีเมลที่ได้ระบุไว้à¹à¸¥à¹‰à¸§à¹ƒà¸™[[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนตัวของคุณ]] ซึ่งผู้รับสามารถตอบà¸à¸¥à¸±à¸šà¹„ด้',
'usermailererror' => 'à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥à¸œà¸´à¸”พลาด:',
-'defemailsubject' => '{{SITENAME}} อีเมล',
+'defemailsubject' => '{{SITENAME}} อีเมล์จาà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ "$1"',
'usermaildisabled' => 'à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸µà¹€à¸¡à¸¥à¸«à¸²à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹„ม่สามารถใช้งานได้',
'usermaildisabledtext' => 'คุณไม่สามารถส่งอีเมลไปหาผู้ใช้อื่นบนวิà¸à¸´à¸™à¸µà¹‰',
'noemailtitle' => 'ไม่ได้ตั้งอีเมล',
@@ -2093,8 +2103,6 @@ $UNWATCHURL
'actionfailed' => 'ปà¸à¸´à¸šà¸±à¸•à¸´à¸à¸²à¸£à¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§',
'deletedtext' => '"$1" ถูà¸à¸¥à¸š
ดู $2 สำหรับบันทึà¸à¸à¸²à¸£à¸¥à¸šà¸¥à¹ˆà¸²à¸ªà¸¸à¸”',
-'deletedarticle' => '"[[$1]]" ถูà¸à¸¥à¸š',
-'suppressedarticle' => '"[[$1]]" ระงับà¹à¸¥à¹‰à¸§',
'dellogpage' => 'ปูมà¸à¸²à¸£à¸¥à¸š',
'dellogpagetext' => 'ด้านล่างเป็นรายà¸à¸²à¸£à¸‚องà¸à¸²à¸£à¸¥à¸šà¸¥à¹ˆà¸²à¸ªà¸¸à¸”',
'deletionlog' => 'บันทึà¸à¸à¸²à¸£à¸¥à¸š',
@@ -2137,7 +2145,10 @@ $UNWATCHURL
'unprotectedarticle' => 'ลบà¸à¸²à¸£à¸›à¸à¸›à¹‰à¸­à¸‡à¸‚้อมูลออà¸à¸ˆà¸²à¸ "[[$1]]" à¹à¸¥à¹‰à¸§',
'movedarticleprotection' => 'ย้ายà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸ˆà¸²à¸ "[[$2]]" ไปยัง "[[$1]]"',
'protect-title' => 'à¸à¸³à¸¥à¸±à¸‡à¸¥à¹‡à¸­à¸à¸«à¸™à¹‰à¸² "$1"',
+'protect-title-notallowed' => 'ดูระดับà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸‚อง "$1"',
'prot_1movedto2' => '[[$1]] ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹€à¸›à¹‡à¸™ [[$2]]',
+'protect-badnamespace-title' => 'เนมสเปซป้องà¸à¸±à¸™à¹„ม่ได้',
+'protect-badnamespace-text' => 'หน้าในเนมสเปซนี้ไม่สามารถป้องà¸à¸±à¸™à¹„ด้',
'protect-legend' => 'ยืนยันà¸à¸²à¸£à¸¥à¹‡à¸­à¸',
'protectcomment' => 'เหตุผล:',
'protectexpiry' => 'หมดอายุ:',
@@ -2156,6 +2167,7 @@ $UNWATCHURL
'protect-level-sysop' => 'ผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¹à¸à¹‰à¹„ขเท่านั้น',
'protect-summary-cascade' => 'สืบทอด',
'protect-expiring' => 'หมดอายุ $1 (UTC)',
+'protect-expiring-local' => 'หมดอายุ $1',
'protect-expiry-indefinite' => 'ตลอดà¸à¸²à¸¥',
'protect-cascade' => 'ล็อà¸à¸«à¸™à¹‰à¸²à¸—ี่เป็นส่วนหนึ่งของหน้านี้ (ล็อà¸à¹à¸šà¸šà¸ªà¸·à¸šà¸—อด)',
'protect-cantedit' => 'คุณไม่สามารถเปลี่ยนระดับà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸‚องหน้านี้ เนื่องจาà¸à¸„ุณไม่ได้รับสิทธิในà¸à¸²à¸£à¹à¸à¹‰à¹„ขสิ่งนั้น',
@@ -2211,7 +2223,6 @@ $UNWATCHURL
'undeletereset' => 'ล้างค่า',
'undeleteinvert' => 'à¸à¸¥à¸±à¸šà¸„่าที่เลือà¸',
'undeletecomment' => 'เหตุผล:',
-'undeletedarticle' => 'เรียà¸à¸„ืน "[[$1]]"',
'undeletedrevisions' => '$1 รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ขถูà¸à¹€à¸£à¸µà¸¢à¸à¸„ืน',
'undeletedrevisions-files' => '$1 รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ข à¹à¸¥à¸° $2 ไฟล์ถูà¸à¹€à¸£à¸µà¸¢à¸à¸„ืน',
'undeletedfiles' => '$1 ไฟล์ถูà¸à¹€à¸£à¸µà¸¢à¸à¸„ืน',
@@ -2220,6 +2231,7 @@ $UNWATCHURL
ดูเพิ่มเติม [[Special:Log/delete|บันทึà¸à¸à¸²à¸£à¸¥à¸š]] สำหรับรายชื่อà¸à¸²à¸£à¸¥à¸šà¹à¸¥à¸°à¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸„ืนที่ผ่านมา",
'undelete-header' => 'ดู [[Special:Log/delete|บันทึà¸à¸à¸²à¸£à¸¥à¸š]] สำหรับหน้าที่ถูà¸à¸¥à¸šà¸¥à¹ˆà¸²à¸ªà¸¸à¸”',
+'undelete-search-title' => 'ค้นหาหน้าที่ถูà¸à¸¥à¸š',
'undelete-search-box' => 'ค้นหาหน้าที่ถูà¸à¸¥à¸š',
'undelete-search-prefix' => 'ค้นหาหน้าที่เริ่มต้นด้วย:',
'undelete-search-submit' => 'สืบค้น',
@@ -2228,6 +2240,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'ไม่สามารถà¸à¸¹à¹‰à¸„ืนไฟล์ $1: ไม่มีไฟล์à¸à¹ˆà¸­à¸™à¸—ี่จะถูà¸à¸¥à¸š',
'undelete-cleanup-error' => 'เà¸à¸´à¸”ปัà¸à¸«à¸²à¸à¸²à¸£à¸¥à¸šà¹„ฟล์เà¸à¹ˆà¸² "$1"',
'undelete-missing-filearchive' => 'ไม่สามารถà¸à¸¹à¹‰à¸„ืนไฟล์เà¸à¹ˆà¸²à¸£à¸¸à¹ˆà¸™ $1 เพราะว่าไม่มีไฟล์อยู่ในà¸à¸²à¸™à¸‚้อมูล ไฟล์อาจจะถูà¸à¸à¸¹à¹‰à¸„ืนไปà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²',
+'undelete-error' => 'เà¸à¸´à¸”ข้อผิดพลาด ไม่สามารถลบหน้าเวปได้',
'undelete-error-short' => 'เà¸à¸´à¸”ปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¸à¸¹à¹‰à¸„ืนไฟล์: $1',
'undelete-error-long' => 'เà¸à¸´à¸”ความผิดพลาดระหว่างà¸à¸²à¸£à¸¥à¸šà¹„ฟล์:
@@ -2369,6 +2382,7 @@ $1',
'unblocklink' => 'เลิà¸à¸šà¸¥à¹‡à¸­à¸',
'change-blocklink' => 'เปลี่ยนà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸',
'contribslink' => 'เรื่องที่เขียน',
+'emaillink' => 'ส่งอีเมล์',
'autoblocker' => 'ถูà¸à¸šà¸¥à¹‡à¸­à¸à¸­à¸±à¸•à¹‚นมัติเนื่องจาà¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพีของคุณตรงà¸à¸±à¸š "[[User:$1|$1]]" ถูà¸à¸šà¸¥à¹‡à¸­à¸à¸à¸¥à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¹€à¸™à¸·à¹ˆà¸­à¸‡à¸ˆà¸²à¸à¸ªà¸²à¹€à¸«à¸•à¸¸: "$2"',
'blocklogpage' => 'ปูมà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸',
'blocklog-showlog' => 'ผู้ใช้นี้ถูà¸à¸ªà¸à¸±à¸”à¸à¸±à¹‰à¸™à¸¡à¸²à¸à¹ˆà¸­à¸™
@@ -2481,9 +2495,6 @@ $1',
'movepage-page-moved' => 'หน้า $1 ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹€à¸›à¹‡à¸™ $2',
'movepage-page-unmoved' => 'หน้า $1 ไม่สามารถเปลี่ยนชื่อเป็น $2 ได้',
'movepage-max-pages' => 'หน้าทั้งหมด $1 {{PLURAL:$1|หน้า|หน้า}} ถูà¸à¸¢à¹‰à¸²à¸¢à¹„ป ซึ่งนับได้ว่าเป็นจำนวนที่มาà¸à¸—ี่สุดเท่าที่จะทได้ à¹à¸¥à¸°à¸«à¸¢à¸¸à¸”à¸à¸²à¸£à¸¢à¹‰à¸²à¸¢à¸«à¸™à¹‰à¸²à¸­à¸¢à¹ˆà¸²à¸‡à¸­à¸±à¸•à¹‚นมัติà¹à¸¥à¹‰à¸§',
-'1movedto2' => '[[$1]] ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹€à¸›à¹‡à¸™ [[$2]]',
-'1movedto2_redir' => '[[$1]] ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹€à¸›à¹‡à¸™ [[$2]] ทับหน้าเปลี่ยนทาง',
-'move-redirect-suppressed' => 'หน้าเปลี่ยนทางไม่ถูà¸à¸ªà¸£à¹‰à¸²à¸‡',
'movelogpage' => 'บันทึà¸à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­',
'movelogpagetext' => 'ด้านล่างà¹à¸ªà¸”งรายà¸à¸²à¸£ à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­',
'movesubpage' => '{{PLURAL:$1|หน้าย่อย|หน้าย่อย}}',
@@ -2525,6 +2536,7 @@ $1',
à¸à¸²à¸£à¸ˆà¸°à¸ªà¹ˆà¸‡à¸­à¸­à¸à¸«à¸™à¹‰à¸²à¸™à¸±à¹‰à¸™à¸ªà¸²à¸¡à¸²à¸£à¸–ทำได้โดยใส่ชื่อหัวเรื่องของหน้าที่ต้องà¸à¸²à¸£ ลงในà¸à¸¥à¹ˆà¸­à¸‡à¸‚้อความด้านล่าง หนึ่งชื่อต่อหนึ่งบรรทัด จาà¸à¸™à¸±à¹‰à¸™à¹€à¸¥à¸·à¸­à¸à¸§à¹ˆà¸²à¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¸—ั้งรุ่นปัจจุบันà¹à¸¥à¸°à¸£à¸¸à¹ˆà¸™à¹€à¸à¹ˆà¸²à¹† ทั้งหมดพร้อมà¸à¸±à¸šà¸›à¸£à¸°à¸§à¸±à¸•à¸´à¸‚องหน้านั้น หรือต้องà¸à¸²à¸£à¹€à¸žà¸µà¸¢à¸‡à¹à¸•à¹ˆà¹€à¸™à¸·à¹‰à¸­à¸«à¸²à¸£à¸¸à¹ˆà¸™à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¸žà¸£à¹‰à¸­à¸¡à¸à¸±à¸šà¸£à¸²à¸¢à¸¥à¸°à¹€à¸­à¸µà¸¢à¸”ของรุ่นนั้นเท่านั้น
ในà¸à¸£à¸“ีที่ต้องà¸à¸²à¸£à¹€à¸‰à¸žà¸²à¸°à¸£à¸¸à¹ˆà¸™à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™ คุณสามารถใช้ในรูปà¹à¸šà¸šà¸‚องลิงà¸à¹Œ เช่น [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] สำหรับหน้า "[[{{MediaWiki:Mainpage}}]]"',
+'exportall' => 'ส่งออà¸à¸‚้อมูลทุà¸à¸«à¸™à¹‰à¸²',
'exportcuronly' => 'เอาเฉพาะรุ่นปัจจุบันเท่านั้น ไม่เอาประวัติทั้งหมด',
'exportnohistory' => "----
'''หมายเหตุ:''' à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸­à¸à¸›à¸£à¸°à¸§à¸±à¸•à¸´à¸«à¸™à¹‰à¸²à¸—ั้งหมดผ่านช่องทางนี้ได้ถูà¸à¸›à¸´à¸”ไว้ เนื่องจาà¸à¸›à¸±à¸à¸«à¸²à¸—างเทคนิคในด้านประสิทธิภาพ",
@@ -2604,6 +2616,7 @@ $1',
'import-upload' => 'อัปโหลดข้อมูล XML',
'import-token-mismatch' => 'ข้อมูลเซชชันสูà¸à¸«à¸²à¸¢ ให้ลองใหม่อีà¸à¸„รั้ง',
'import-invalid-interwiki' => 'ไม่สามารถนำข้อมูลเข้าจาà¸à¸§à¸´à¸à¸´à¸—ี่à¸à¸³à¸«à¸™à¸”ได้',
+'import-error-create' => 'หน้า "$1" ยังไม่ได้ถูà¸à¸™à¸³à¹€à¸‚้า เนื่องจาà¸à¸„ุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¸ªà¸²à¸¡à¸²à¸£à¸–สร้างได้',
# Import log
'importlogpage' => 'บันทึà¸à¸à¸²à¸£à¸™à¸³à¹€à¸‚้า',
@@ -2613,72 +2626,77 @@ $1',
'import-logentry-interwiki' => 'นำเข้าข้ามวิà¸à¸´ $1 à¹à¸¥à¹‰à¸§',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ข|รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ข}}จาภ$2',
+# JavaScriptTest
+'javascripttest' => 'à¸à¸²à¸£à¸—ดสอบจาวาสคริปต์',
+'javascripttest-disabled' => 'ฟังà¸à¹Œà¸Šà¸±à¹ˆà¸™à¸à¸²à¸£à¸—ำงานนี้ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸­à¸¢à¸¹à¹ˆ',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
-'tooltip-pt-anonuserpage' => 'หน้าผู้ใช้ของหมายเลขไอพีที่à¹à¸à¹‰à¹„ข',
-'tooltip-pt-mytalk' => 'หน้าอภิปรายของคุณ',
-'tooltip-pt-anontalk' => 'พูดคุยเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸²à¸£à¹à¸à¹‰à¹„ขจาà¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี',
-'tooltip-pt-preferences' => 'ตั้งค่าà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ªà¹ˆà¸§à¸™à¸•à¸±à¸§',
-'tooltip-pt-watchlist' => 'รายà¸à¸²à¸£à¸—ี่เà¸à¹‰à¸²à¸”ูà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
-'tooltip-pt-mycontris' => 'รายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸—ี่คุณเขียน',
-'tooltip-pt-login' => 'ไม่จำเป็นต้องล็อà¸à¸­à¸´à¸™à¹ƒà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ข à¹à¸•à¹ˆà¹à¸™à¸°à¸™à¸³à¸­à¸¢à¹ˆà¸²à¸‡à¸¢à¸´à¹ˆà¸‡à¹ƒà¸«à¹‰à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
-'tooltip-pt-anonlogin' => 'ไม่จำเป็นต้องล็อà¸à¸­à¸´à¸™à¹ƒà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ข à¹à¸•à¹ˆà¹à¸™à¸°à¸™à¸³à¸­à¸¢à¹ˆà¸²à¸‡à¸¢à¸´à¹ˆà¸‡à¹ƒà¸«à¹‰à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
-'tooltip-pt-logout' => 'ล็อà¸à¹€à¸­à¸²à¸•à¹Œ',
-'tooltip-ca-talk' => 'พูดคุยเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¹€à¸™à¸·à¹‰à¸­à¸«à¸²',
-'tooltip-ca-edit' => 'หน้านี้à¹à¸à¹‰à¹„ขได้ à¸à¹ˆà¸­à¸™à¸—ำà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¹ƒà¸«à¹‰à¸à¸£à¸¸à¸“าà¸à¸”ปุ่มดูตัวอย่างà¸à¹ˆà¸­à¸™ à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¹„ด้ตามที่ต้องà¸à¸²à¸£',
-'tooltip-ca-addsection' => 'เริ่มหัวข้อย่อยใหม่',
-'tooltip-ca-viewsource' => 'หน้านี้ถูà¸à¸¥à¹‡à¸­à¸ à¹à¸•à¹ˆà¸¢à¸±à¸‡à¸”ูโค้ดได้',
-'tooltip-ca-history' => 'รุ่นที่à¹à¸¥à¹‰à¸§à¸‚องหน้านี้',
-'tooltip-ca-protect' => 'ล็อà¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
-'tooltip-ca-unprotect' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
-'tooltip-ca-delete' => 'ลบหน้านี้',
-'tooltip-ca-undelete' => 'เรียà¸à¸„ืนà¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้านี้à¸à¸¥à¸±à¸šà¸¡à¸²à¹€à¸›à¹‡à¸™à¸£à¸¸à¹ˆà¸™à¸à¹ˆà¸­à¸™à¸—ี่ถูà¸à¸¥à¸š',
-'tooltip-ca-move' => 'เปลี่ยนชื่อหน้านี้',
-'tooltip-ca-watch' => 'เพิ่มหน้านี้เข้ารายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
-'tooltip-ca-unwatch' => 'นำหน้านี้ออà¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
-'tooltip-search' => 'ค้นหา {{SITENAME}}',
-'tooltip-search-go' => 'ตรงไปยังหน้าที่ตรงà¸à¸±à¸šà¸Šà¸·à¹ˆà¸­à¸™à¸µà¹‰ (ถ้ามี)',
-'tooltip-search-fulltext' => 'ค้นหาหน้าที่มีข้อความนี้',
-'tooltip-p-logo' => 'หน้าหลัà¸',
-'tooltip-n-mainpage' => 'à¹à¸§à¸°à¸«à¸™à¹‰à¸²à¸«à¸¥à¸±à¸',
-'tooltip-n-mainpage-description' => 'เข้าสู่หน้าหลัà¸',
-'tooltip-n-portal' => 'เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¹‚ครงà¸à¸²à¸£ สิ่งที่คุณทำได้ วิธีà¸à¸²à¸£à¸„้นหา',
-'tooltip-n-currentevents' => 'ค้นหาเหตุà¸à¸²à¸£à¸“์ปัจจุบัน',
-'tooltip-n-recentchanges' => 'รายà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ในวิà¸à¸´à¸™à¸µà¹‰',
-'tooltip-n-randompage' => 'สุ่มหน้าขึ้นมา',
-'tooltip-n-help' => 'อธิบายà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
-'tooltip-t-whatlinkshere' => 'รายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸§à¸´à¸à¸´à¸—ี่ลิงà¸à¹Œà¸¡à¸²à¸—ี่นี่',
-'tooltip-t-recentchangeslinked' => 'รายà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ในหน้าที่ลิงà¸à¹Œà¸ˆà¸²à¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
-'tooltip-feed-rss' => 'ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้',
-'tooltip-feed-atom' => 'ฟีดชนิดอะตอม (Atom) ของหน้านี้',
-'tooltip-t-contributions' => 'ดูหน้าที่ผู้ใช้คนนี้เขียน',
-'tooltip-t-emailuser' => 'ส่งอีเมลถึงผู้ใช้นี้',
-'tooltip-t-upload' => 'อัปโหลดภาพหรือไฟล์',
-'tooltip-t-specialpages' => 'à¹à¸ªà¸”งรายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸žà¸´à¹€à¸¨à¸©',
-'tooltip-t-print' => 'หน้าที่à¹à¸ªà¸”งผลพร้อมสำหรับพิมพ์ออà¸à¸¡à¸²',
-'tooltip-t-permalink' => 'ลิงà¸à¹Œà¸–าวรมาที่เฉพาะรุ่นนี้ในหน้านี้',
-'tooltip-ca-nstab-main' => 'ดูหน้าเนื้อหา',
-'tooltip-ca-nstab-user' => 'ดูหน้าผู้ใช้',
-'tooltip-ca-nstab-media' => 'ดูหน้าสื่อ ภาพ เพลง',
-'tooltip-ca-nstab-special' => 'ไม่สามารถà¹à¸à¹‰à¹„ขหน้านี้ได้ หน้านี้เป็นหน้าพิเศษ',
-'tooltip-ca-nstab-project' => 'ดูหน้าโครงà¸à¸²à¸£',
-'tooltip-ca-nstab-image' => 'ดูหน้าภาพ',
-'tooltip-ca-nstab-mediawiki' => 'ดูข้อความระบบ',
-'tooltip-ca-nstab-template' => 'ดูหน้าà¹à¸¡à¹ˆà¹à¸šà¸š',
-'tooltip-ca-nstab-help' => 'ดูหน้าคำอธิบาย',
-'tooltip-ca-nstab-category' => 'ดูหน้าหมวดหมู่',
-'tooltip-minoredit' => 'à¸à¸³à¸«à¸™à¸”เป็นà¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢',
-'tooltip-save' => 'บันทึà¸à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
-'tooltip-preview' => 'à¹à¸ªà¸”งตัวอย่างà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ี่เà¸à¸´à¸”ขึ้น à¸à¸£à¸¸à¸“าใช้คำสั่งนี้à¸à¹ˆà¸­à¸™à¸—ำà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸!',
-'tooltip-diff' => 'à¹à¸ªà¸”งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸à¸²à¸£à¸•à¹ˆà¸­à¸‚้อความ',
-'tooltip-compareselectedversions' => 'à¹à¸ªà¸”งความà¹à¸•à¸à¸•à¹ˆà¸²à¸‡à¸‚องรุ่นสองรุ่นที่เลือà¸',
-'tooltip-watch' => 'เพิ่มหน้านี้เข้ารายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
-'tooltip-recreate' => 'สร้างหน้านี้อีà¸à¸„รั้งà¹à¸¡à¹‰à¸§à¹ˆà¸²à¸ˆà¸°à¸–ูà¸à¸¥à¸š',
-'tooltip-upload' => 'เริ่มอัปโหลด',
-'tooltip-rollback' => '"ย้อนà¸à¸¥à¸±à¸šà¸‰à¸¸à¸à¹€à¸‰à¸´à¸™" ใช้ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขในหน้านี้ไปยังรุ่นโดยผู้ใช้คนà¸à¹ˆà¸­à¸™à¹ƒà¸™à¸„ลิà¸à¹€à¸”ียว',
-'tooltip-undo' => '"ย้อน" ใช้ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขครั้งนี้à¹à¸¥à¸°à¹€à¸›à¸´à¸”à¹à¸šà¸šà¹à¸à¹‰à¹„ข สามารถเพิ่มคำอธิบายในตอนท้าย',
-'tooltip-preferences-save' => 'บันทึà¸à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า',
-'tooltip-summary' => 'ใส่คำอธิบายอย่างย่อสั้น ๆ',
+'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
+'tooltip-pt-anonuserpage' => 'หน้าผู้ใช้ของหมายเลขไอพีที่à¹à¸à¹‰à¹„ข',
+'tooltip-pt-mytalk' => 'หน้าอภิปรายของคุณ',
+'tooltip-pt-anontalk' => 'พูดคุยเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸à¸²à¸£à¹à¸à¹‰à¹„ขจาà¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚ไอพี',
+'tooltip-pt-preferences' => 'ตั้งค่าà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ªà¹ˆà¸§à¸™à¸•à¸±à¸§',
+'tooltip-pt-watchlist' => 'รายà¸à¸²à¸£à¸—ี่เà¸à¹‰à¸²à¸”ูà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'tooltip-pt-mycontris' => 'รายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸—ี่คุณเขียน',
+'tooltip-pt-login' => 'ไม่จำเป็นต้องล็อà¸à¸­à¸´à¸™à¹ƒà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ข à¹à¸•à¹ˆà¹à¸™à¸°à¸™à¸³à¸­à¸¢à¹ˆà¸²à¸‡à¸¢à¸´à¹ˆà¸‡à¹ƒà¸«à¹‰à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
+'tooltip-pt-anonlogin' => 'ไม่จำเป็นต้องล็อà¸à¸­à¸´à¸™à¹ƒà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ข à¹à¸•à¹ˆà¹à¸™à¸°à¸™à¸³à¸­à¸¢à¹ˆà¸²à¸‡à¸¢à¸´à¹ˆà¸‡à¹ƒà¸«à¹‰à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
+'tooltip-pt-logout' => 'ล็อà¸à¹€à¸­à¸²à¸•à¹Œ',
+'tooltip-ca-talk' => 'พูดคุยเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¹€à¸™à¸·à¹‰à¸­à¸«à¸²',
+'tooltip-ca-edit' => 'หน้านี้à¹à¸à¹‰à¹„ขได้ à¸à¹ˆà¸­à¸™à¸—ำà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¹ƒà¸«à¹‰à¸à¸£à¸¸à¸“าà¸à¸”ปุ่มดูตัวอย่างà¸à¹ˆà¸­à¸™ à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¹„ด้ตามที่ต้องà¸à¸²à¸£',
+'tooltip-ca-addsection' => 'เริ่มหัวข้อย่อยใหม่',
+'tooltip-ca-viewsource' => 'หน้านี้ถูà¸à¸¥à¹‡à¸­à¸ à¹à¸•à¹ˆà¸¢à¸±à¸‡à¸”ูโค้ดได้',
+'tooltip-ca-history' => 'รุ่นที่à¹à¸¥à¹‰à¸§à¸‚องหน้านี้',
+'tooltip-ca-protect' => 'ล็อà¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
+'tooltip-ca-unprotect' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
+'tooltip-ca-delete' => 'ลบหน้านี้',
+'tooltip-ca-undelete' => 'เรียà¸à¸„ืนà¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้านี้à¸à¸¥à¸±à¸šà¸¡à¸²à¹€à¸›à¹‡à¸™à¸£à¸¸à¹ˆà¸™à¸à¹ˆà¸­à¸™à¸—ี่ถูà¸à¸¥à¸š',
+'tooltip-ca-move' => 'เปลี่ยนชื่อหน้านี้',
+'tooltip-ca-watch' => 'เพิ่มหน้านี้เข้ารายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
+'tooltip-ca-unwatch' => 'นำหน้านี้ออà¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
+'tooltip-search' => 'ค้นหา {{SITENAME}}',
+'tooltip-search-go' => 'ตรงไปยังหน้าที่ตรงà¸à¸±à¸šà¸Šà¸·à¹ˆà¸­à¸™à¸µà¹‰ (ถ้ามี)',
+'tooltip-search-fulltext' => 'ค้นหาหน้าที่มีข้อความนี้',
+'tooltip-p-logo' => 'หน้าหลัà¸',
+'tooltip-n-mainpage' => 'à¹à¸§à¸°à¸«à¸™à¹‰à¸²à¸«à¸¥à¸±à¸',
+'tooltip-n-mainpage-description' => 'เข้าสู่หน้าหลัà¸',
+'tooltip-n-portal' => 'เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¹‚ครงà¸à¸²à¸£ สิ่งที่คุณทำได้ วิธีà¸à¸²à¸£à¸„้นหา',
+'tooltip-n-currentevents' => 'ค้นหาเหตุà¸à¸²à¸£à¸“์ปัจจุบัน',
+'tooltip-n-recentchanges' => 'รายà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ในวิà¸à¸´à¸™à¸µà¹‰',
+'tooltip-n-randompage' => 'สุ่มหน้าขึ้นมา',
+'tooltip-n-help' => 'อธิบายà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
+'tooltip-t-whatlinkshere' => 'รายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸§à¸´à¸à¸´à¸—ี่ลิงà¸à¹Œà¸¡à¸²à¸—ี่นี่',
+'tooltip-t-recentchangeslinked' => 'รายà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ในหน้าที่ลิงà¸à¹Œà¸ˆà¸²à¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
+'tooltip-feed-rss' => 'ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้',
+'tooltip-feed-atom' => 'ฟีดชนิดอะตอม (Atom) ของหน้านี้',
+'tooltip-t-contributions' => 'ดูหน้าที่ผู้ใช้คนนี้เขียน',
+'tooltip-t-emailuser' => 'ส่งอีเมลถึงผู้ใช้นี้',
+'tooltip-t-upload' => 'อัปโหลดภาพหรือไฟล์',
+'tooltip-t-specialpages' => 'à¹à¸ªà¸”งรายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸žà¸´à¹€à¸¨à¸©',
+'tooltip-t-print' => 'หน้าที่à¹à¸ªà¸”งผลพร้อมสำหรับพิมพ์ออà¸à¸¡à¸²',
+'tooltip-t-permalink' => 'ลิงà¸à¹Œà¸–าวรมาที่เฉพาะรุ่นนี้ในหน้านี้',
+'tooltip-ca-nstab-main' => 'ดูหน้าเนื้อหา',
+'tooltip-ca-nstab-user' => 'ดูหน้าผู้ใช้',
+'tooltip-ca-nstab-media' => 'ดูหน้าสื่อ ภาพ เพลง',
+'tooltip-ca-nstab-special' => 'ไม่สามารถà¹à¸à¹‰à¹„ขหน้านี้ได้ หน้านี้เป็นหน้าพิเศษ',
+'tooltip-ca-nstab-project' => 'ดูหน้าโครงà¸à¸²à¸£',
+'tooltip-ca-nstab-image' => 'ดูหน้าภาพ',
+'tooltip-ca-nstab-mediawiki' => 'ดูข้อความระบบ',
+'tooltip-ca-nstab-template' => 'ดูหน้าà¹à¸¡à¹ˆà¹à¸šà¸š',
+'tooltip-ca-nstab-help' => 'ดูหน้าคำอธิบาย',
+'tooltip-ca-nstab-category' => 'ดูหน้าหมวดหมู่',
+'tooltip-minoredit' => 'à¸à¸³à¸«à¸™à¸”เป็นà¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢',
+'tooltip-save' => 'บันทึà¸à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'tooltip-preview' => 'à¹à¸ªà¸”งตัวอย่างà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ี่เà¸à¸´à¸”ขึ้น à¸à¸£à¸¸à¸“าใช้คำสั่งนี้à¸à¹ˆà¸­à¸™à¸—ำà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸!',
+'tooltip-diff' => 'à¹à¸ªà¸”งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸à¸²à¸£à¸•à¹ˆà¸­à¸‚้อความ',
+'tooltip-compareselectedversions' => 'à¹à¸ªà¸”งความà¹à¸•à¸à¸•à¹ˆà¸²à¸‡à¸‚องรุ่นสองรุ่นที่เลือà¸',
+'tooltip-watch' => 'เพิ่มหน้านี้เข้ารายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
+'tooltip-watchlistedit-raw-submit' => 'อัพเดทรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
+'tooltip-recreate' => 'สร้างหน้านี้อีà¸à¸„รั้งà¹à¸¡à¹‰à¸§à¹ˆà¸²à¸ˆà¸°à¸–ูà¸à¸¥à¸š',
+'tooltip-upload' => 'เริ่มอัปโหลด',
+'tooltip-rollback' => '"ย้อนà¸à¸¥à¸±à¸šà¸‰à¸¸à¸à¹€à¸‰à¸´à¸™" ใช้ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขในหน้านี้ไปยังรุ่นโดยผู้ใช้คนà¸à¹ˆà¸­à¸™à¹ƒà¸™à¸„ลิà¸à¹€à¸”ียว',
+'tooltip-undo' => '"ย้อน" ใช้ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขครั้งนี้à¹à¸¥à¸°à¹€à¸›à¸´à¸”à¹à¸šà¸šà¹à¸à¹‰à¹„ข สามารถเพิ่มคำอธิบายในตอนท้าย',
+'tooltip-preferences-save' => 'บันทึà¸à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า',
+'tooltip-summary' => 'ใส่คำอธิบายอย่างย่อสั้น ๆ',
# Stylesheets
'common.css' => '/** CSS ที่อยู่ในหน้านี้จะมีผลต่อทุà¸à¸ªà¸à¸´à¸™à¹ƒà¸™à¹€à¸§à¹‡à¸šà¹„ซต์ */',
@@ -2747,9 +2765,6 @@ $1',
# Patrol log
'patrol-log-page' => 'บันทึà¸à¸à¸²à¸£à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸š',
'patrol-log-header' => 'หน้านี้คือบันทึà¸à¸£à¸¸à¹ˆà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่à¸à¸³à¸«à¸™à¸”ว่าตรวจสอบà¹à¸¥à¹‰à¸§',
-'patrol-log-line' => 'ทำเครื่องหมาย $1 ของ $2 ว่าถูà¸à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸š $3 à¹à¸¥à¹‰à¸§',
-'patrol-log-auto' => '(อัตโนมัติ)',
-'patrol-log-diff' => 'รุ่น $1',
'log-show-hide-patrol' => '$1 บันทึà¸à¸à¸²à¸£à¸•à¸£à¸§à¸ˆà¸•à¸£à¸²',
# Image deletion
@@ -2776,9 +2791,10 @@ $1',
'file-info' => 'ขนาดไฟล์: $1, ชนิดไมม์: $2',
'file-info-size' => '$1 × $2 พิà¸à¹€à¸‹à¸¥, ขนาดไฟล์: $3, ชนิดไมม์: $4',
'file-info-size-pages' => '$1 × $2 พิà¸à¹€à¸‹à¸¥, ขนาดไฟล์: $3, ประเภท MIME: $4, $5 {{PLURAL:$5|หน้า|หน้า}}',
-'file-nohires' => '<small>ไม่มีภาพความละเอียดสูงà¸à¸§à¹ˆà¸²à¸™à¸µà¹‰</small>',
+'file-nohires' => 'ไม่มีภาพความละเอียดสูงà¸à¸§à¹ˆà¸²à¸™à¸µà¹‰',
'svg-long-desc' => 'ไฟล์ SVG, $1 × $2 พิà¸à¹€à¸‹à¸¥ พอเป็นพิธี, ขนาดไฟล์: $3',
'show-big-image' => 'ความละเอียดสูงสุด',
+'show-big-image-other' => 'อื่นๆ {{PLURAL:$2|resolution|resolutions}}: $1.',
'show-big-image-size' => '$1 × $2 พิà¸à¹€à¸‹à¸¥',
'file-info-gif-looped' => 'วนซ้ำ',
'file-info-gif-frames' => '$1 {{PLURAL:$1|เฟรม|เฟรม}}',
@@ -2798,6 +2814,9 @@ $1',
'bydate' => 'วันที่',
'sp-newimages-showfrom' => 'à¹à¸ªà¸”งภาพใหม่เริ่มต้นจาภ$2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'ago' => '$1 มาà¹à¸¥à¹‰à¸§',
+
# Bad image list
'bad_image_list' => 'รูปà¹à¸šà¸šà¹à¸ªà¸”งต่อไปนี้:
@@ -3180,13 +3199,6 @@ $5
'scarytranscludefailed' => '[ไม่สามารถดึงà¹à¸¡à¹ˆà¹à¸šà¸šà¸¡à¸²à¹„ด้สำหรับ $1]',
'scarytranscludetoolong' => '[ที่อยู่เว็บไซต์ยาวเà¸à¸´à¸™à¹„ป]',
-# Trackbacks
-'trackbackbox' => 'ตามรอยหน้านี้:<br />
-$1',
-'trackbackremove' => '([$1 ลบ])',
-'trackbacklink' => 'ตามรอย',
-'trackbackdeleteok' => 'รอยที่เà¸à¹‡à¸šà¹„ว้ถูà¸à¸¥à¸š',
-
# Delete conflict
'deletedwhileediting' => "'''คำเตือน''': หน้านี้ถูà¸à¸¥à¸šà¹„ปà¹à¸¥à¹‰à¸§à¹ƒà¸™à¸‚ณะที่คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸à¹‰à¹„ข!",
'confirmrecreate' => "ผู้ใช้ [[User:$1|$1]] ([[User talk:$1|พูดคุย]]) ได้ลบหน้านี้ในช่วงที่คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸à¹‰à¹„ข ด้วยเหตุผลว่า:
@@ -3272,6 +3284,9 @@ $1',
'watchlisttools-edit' => 'ดูà¹à¸¥à¸°à¹à¸à¹‰à¹„ขรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
'watchlisttools-raw' => 'à¹à¸à¹‰à¹„ขรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูทั้งหมด',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|พูดคุย]])',
+
# Core parser functions
'unknown_extension_tag' => 'ไม่รู้จัภtag ส่วนขยาย (extension tag) "$1"',
'duplicate-defaultsort' => 'คำเตือน: หลัà¸à¹€à¸£à¸µà¸¢à¸‡à¸¥à¸³à¸”ับปริยาย "$2" ได้ลบล้างหลัà¸à¹€à¸£à¸µà¸¢à¸‡à¸¥à¸³à¸”ับปริยาย "$1" ที่มีอยู่à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²',
@@ -3404,4 +3419,24 @@ $1',
'sqlite-has-fts' => 'รุ่น $1 พร้อมà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸à¸²à¸£à¸„้นหาข้อความà¹à¸šà¸šà¹€à¸•à¹‡à¸¡',
'sqlite-no-fts' => 'รุ่น $1 โดยไม่มีà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸à¸²à¸£à¸„้นหาข้อความà¹à¸šà¸šà¹€à¸•à¹‡à¸¡',
+# New logging system
+'logentry-delete-delete' => '$1 ลบหน้า $3',
+'logentry-delete-restore' => '$1 à¸à¸¹à¹‰à¸„ืนหน้า $3',
+'revdelete-restricted' => 'จำà¸à¸±à¸”ให้เฉพาะผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸‚ั้นพื้นà¸à¸²à¸™',
+'revdelete-unrestricted' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”ให้เฉพาะผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸‚ั้นพื้นà¸à¸²à¸™',
+'logentry-move-move' => '$1 ย้ายหน้า $3 ไปยัง $4',
+'logentry-move-move-noredirect' => '$1 ย้ายหน้า $3 ไปยัง $4 โดยไม่ทิ้งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—าง',
+'logentry-newusers-newusers' => '$1 สร้าง บัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
+'logentry-newusers-create' => '$1 สร้าง บัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
+'logentry-newusers-create2' => '$1 สร้างบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ $3',
+'logentry-newusers-autocreate' => 'บัà¸à¸Šà¸µ $1 ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นอัตโนมัติ',
+'newuserlog-byemail' => 'รหัสผ่านถูà¸à¸ªà¹ˆà¸‡à¸—างอีเมล',
+
+# Feedback
+'feedback-message' => 'ข้อความ:',
+'feedback-cancel' => 'ยà¸à¹€à¸¥à¸´à¸',
+'feedback-submit' => 'ส่งคำติชม',
+'feedback-adding' => 'เพิ่มคำติชมเข้าไปที่หน้า...',
+'feedback-close' => 'เสร็จสิ้น',
+
);
diff --git a/languages/messages/MessagesTi.php b/languages/messages/MessagesTi.php
index 2eb4d355..1ea48c30 100644
--- a/languages/messages/MessagesTi.php
+++ b/languages/messages/MessagesTi.php
@@ -76,9 +76,6 @@ $messages = array(
'nstab-project' => 'ናይ á…ሑá á•áˆ®áŒ€áŠ­á‰µ',
'nstab-image' => 'áˆáˆµáˆŠ',
-# General errors
-'viewsourcefor' => 'ን$1',
-
# Login and logout pages
'yourname' => 'ናይ ኣባሠሽáˆ:',
'loginlanguagelabel' => 'ቋንቋ: $1',
diff --git a/languages/messages/MessagesTk.php b/languages/messages/MessagesTk.php
index 21ddf17e..f6730a08 100644
--- a/languages/messages/MessagesTk.php
+++ b/languages/messages/MessagesTk.php
@@ -391,14 +391,13 @@ Muny bir [[Special:ListUsers/sysop|administratora]] URL-ni belläp alyp ýetirme
Başga biri tarapyndan eýýäm öçürilen bolmagy mümkin.',
'badtitle' => 'GelÅŸiksiz at',
'badtitletext' => 'Isleýän sahypaňyzyň ady ýa nädogry ýa-da boÅŸ. Ãa-da bolmasa dilara ýa-da wikiara çykgyt nädogry berlipdir. Içinde atlarda ulanylmagy gadagan simwollardan biri ýa-da birnäçesi bar bolmagy ahmal.',
-'perfcached' => 'Aşakdaky maglumatlar keşirlenen bolup, könelişen bolmaklary mümkin!',
-'perfcachedts' => 'Aşakdaky maglumat keşirlenen bolup, iň soňky täzelenen wagty: $1',
+'perfcached' => 'Aşakdaky maglumatlar keşirlenen bolup, könelişen bolmaklary mümkin! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Aşakdaky maglumat keşirlenen bolup, iň soňky täzelenen wagty: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Häzirlikçe bu sahypanyň täzelenmegi togtadyldy. Bu ýerdäki maglumatlar häzirlikçe täzelenmeýär.',
'wrong_wfQuery_params' => 'wfQuery() funksiýasyna nädogry parametrler<br />
Funksiýa: $1<br />
Talap: $2',
'viewsource' => 'Çeşmäni gör',
-'viewsourcefor' => '$1 üçin',
'actionthrottled' => 'Hereket çäklendirildi',
'actionthrottledtext' => 'Anti-spam çäresi hökmünde, bu işi az salymyň içinde köp gezek amala aşyrmagyňyz çäklendirildi, we siz bu çäklendirmeden öte geçdiňiz.
Ãene birnäçe minutdan gaýtadan synanyÅŸyp görmegiňizi haýyÅŸ edýäris.',
@@ -532,6 +531,10 @@ Parolyňyzy eýýäm şowlulyk bilen üýtgeden ýa-da täze wagtlaýyn parol ta
# Special:PasswordReset
'passwordreset-username' => 'Ulanyjy ady:',
+# Special:ChangeEmail
+'changeemail-none' => '(hiç biri)',
+'changeemail-cancel' => 'Goýbolsun et',
+
# Edit page toolbar
'bold_sample' => 'Goýy tekst',
'bold_tip' => 'Goýy tekst',
@@ -598,9 +601,6 @@ Bellik: [[Special:Preferences|Ulanyjy ileri tutmalaryňyza]] dogry bir e-poçta
Häzirki IP adresiňiz $3, blokirleme belgiňiz bolsa #$5.
Ãokaryda görkezilen ähli jikme-jiklikleri ähli ýüztutmalaryňyza girizmegiňizi haýyÅŸ edýäris.',
'blockednoreason' => 'sebäp görkezilmedik',
-'blockedoriginalsource' => "'''$1''' sahypasynyň çeşmesi aşakda görkezilýär:",
-'blockededitsource' => "'''$1''' sahypasyndaky '''özgerdişleriňize''' degişli tekst aşakdadyr:",
-'whitelistedittitle' => 'Redaktirlemek üçin sessiýa açmaly',
'whitelistedittext' => 'Sahypa redaktirlemek üçin $1.',
'confirmedittext' => 'Sahypa redaktirlemäp başlamankaňyz e-poçta adresiňizi tassyklamalysyňyz.
[[Special:Preferences|Ulanyjy ileri tutmalaryňyza]] e-poçta adresiňizi ýazyp tassyklamagyňyzy haýyş edýäris.',
@@ -856,8 +856,6 @@ Administrator hökmünde bu aratapawudy görüp bilersiňiz; [{{fullurl:{{#Speci
'revdelete-unsuppress' => 'Dikeldilen wersiýalardaky çäklendirmeleri aýyr',
'revdelete-log' => 'Sebäp:',
'revdelete-submit' => 'Saýlanylan {{PLURAL:$1|wersiýada|wersiýalarda}} peýdalan',
-'revdelete-logentry' => '[[$1]] üçin wersiýa görünme derejesini üýtgetdi',
-'logdelete-logentry' => '[[$1]] üçin waka görünme derejesini üýtgetdi',
'revdelete-success' => "'''Wersiýa görünme derejesi şowly täzelendi.'''",
'revdelete-failure' => "'''Wersiýa görünme derejesini täzeläp bolmaýar:'''
$1",
@@ -869,15 +867,6 @@ $1",
'revdel-restore-visible' => 'görünýän wersiýalar',
'pagehist' => 'Sahypanyň geçmişi',
'deletedhist' => 'Öçürilen geçmiş',
-'revdelete-content' => 'mazmun',
-'revdelete-summary' => 'özgerdiş mazmuny',
-'revdelete-uname' => 'ulanyjy ady',
-'revdelete-restricted' => 'administratorlara goýlan çäklendirmeler',
-'revdelete-unrestricted' => 'administratorlardan aýyrylan çäklendirmeler',
-'revdelete-hid' => 'gizle $1',
-'revdelete-unhid' => 'görkez $1',
-'revdelete-log-message' => '$2 {{PLURAL:$2|wersiýa|wersiýa}} üçin $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|waka|waka}} üçin $1',
'revdelete-hide-current' => '$2, $1 seneli ýazgyda gizleme säwligi: bu häzirki wersiýa.
Ony gizläp bolmaýar.',
'revdelete-show-no-access' => '$2, $1 seneli ýazgyda görkezme säwligi: bu ýazgy "çäklendirilen" diýlip bellenipdir.
@@ -1036,7 +1025,7 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
'prefs-rc' => 'Soňky üýtgeşmeler',
'prefs-watchlist' => 'Gözegçilik sanawy',
'prefs-watchlist-days' => 'Gözegçilik sanawynda görkeziljek gün sany:',
-'prefs-watchlist-days-max' => 'Iň köp 7 gün',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Giňeldilen gözegçilik sanawynda görkeziljek üýtgeşmeleriň maksimum sany:',
'prefs-watchlist-edits-max' => 'Maksimum san: 1000',
'prefs-watchlist-token' => 'Gözegçilik sanawynyň alamaty:',
@@ -1228,7 +1217,6 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'right-autopatrol' => 'Öz özgerdişleriňi patrullyk edilen diýip awtomatik usulda belle',
'right-patrolmarks' => 'Soňky üýtgeşmeleriň patrullyk belliklerini gör',
'right-unwatchedpages' => 'Gözegçilik edilmeýän sahypalaryň sanawyny gör',
-'right-trackback' => 'Trackback iber',
'right-mergehistory' => 'Sahypalaryň geçmişlerini birleşdir',
'right-userrights' => 'Ähli ulanyjy hukuklaryny redaktirle',
'right-userrights-interwiki' => 'Başga wikilerdäki ulanyjylaryň ulanyjy hukuklaryny redaktirle',
@@ -1272,7 +1260,6 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'action-patrol' => 'başga ulanyjylaryň özgerdişini patrullyk edilen diýip bellemäge',
'action-autopatrol' => 'öz özgerdişiňizi patrullyk edilen diýip bellemäge',
'action-unwatchedpages' => 'gözegçilik edilmeýän sahypalaryň sanawyny görmäge',
-'action-trackback' => 'trackback ibermäge',
'action-mergehistory' => 'bu sahypanyň geçmişini birleşdirmäge',
'action-userrights' => 'ähli ulanyjy hukuklaryny redaktirlemäge',
'action-userrights-interwiki' => 'başga wikilerde ulanyjylaryň ulanyjy hukuklaryny redaktirlemäge',
@@ -1788,12 +1775,8 @@ Goldanylýan protokollar: <tt>$1</tt>',
'activeusers-noresult' => 'Ulanyjy tapylmady.',
# Special:Log/newusers
-'newuserlogpage' => 'Täze ulanyjy gündeligi',
-'newuserlogpagetext' => 'Ulanyjy döretme gündeligi.',
-'newuserlog-byemail' => 'parol e-poçta bilen iberildi',
-'newuserlog-create-entry' => 'Täze ulanyjy',
-'newuserlog-create2-entry' => 'täze $1 hasabyny döretdi',
-'newuserlog-autocreate-entry' => 'Hasap awtomatik döredildi',
+'newuserlogpage' => 'Täze ulanyjy gündeligi',
+'newuserlogpagetext' => 'Ulanyjy döretme gündeligi.',
# Special:ListGroupRights
'listgrouprights' => 'Ulanyjy topary hukuklary',
@@ -1934,8 +1917,6 @@ Bu amalyň getirip biljek netijelerine gözüňiz ýetýän bolsa we amalyň [[{
'actionfailed' => 'IÅŸ baÅŸa barmady',
'deletedtext' => '"$1" öçürildi.
Ãaňy-ýakynda öçürilenleri görmek üçin: $2.',
-'deletedarticle' => 'öçürdi: "[[$1]]"',
-'suppressedarticle' => '"[[$1]]" bökdeldi',
'dellogpage' => 'Öçürme gündeligi',
'dellogpagetext' => 'Aşakdaky sanaw iň soňky öçürmeleriň sanawydyr.',
'deletionlog' => 'öçürme gündeligi',
@@ -2069,7 +2050,6 @@ Ulanan çykgydyňyz nädogry bolmagy ýa-da onuň arhiwden dikeldilen ýa-da aý
'undeletereset' => 'Başky ýagdaýa getir',
'undeleteinvert' => 'Saýlanmadyklar',
'undeletecomment' => 'Sebäp:',
-'undeletedarticle' => 'dikeltdi: "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 wersiýa|$1 wersiýa}} dikeldildi',
'undeletedrevisions-files' => '{{PLURAL:$1|1 wersiýa|$1 wersiýa}} we {{PLURAL:$2|1 faýl|$2 faýl}} dikeldildi',
'undeletedfiles' => '{{PLURAL:$1|1 faýl|$1 faýl}} dikeldildi',
@@ -2318,9 +2298,6 @@ Başga bir ady synap görmegiňizi haýyş edýäris.',
'movepage-page-moved' => '$1 sahypasynyň ady $2 adyna üýtgedildi.',
'movepage-page-unmoved' => '$1 sahypasynyň adyny $2 adyna üýtgedip bolmaýar.',
'movepage-max-pages' => 'Maksimum $1 sany {{PLURAL:$1|sahypanyň|sahypanyň}} ady üýtgedildi, mundan artygynyň adyny awtomatik usulda üýtgedip bolmaýar.',
-'1movedto2' => '[[$1]] sahypasynyň täze ady: [[$2]]',
-'1movedto2_redir' => '[[$1]] ady [[$2]] sahypasyna gönükdirildi',
-'move-redirect-suppressed' => 'gönükdirme bökdeldi',
'movelogpage' => 'At üýtgetme gündeligi',
'movelogpagetext' => 'Aşakdaky sanaw ady üýtgedilen sahypalary görkezýär.',
'movesubpage' => '{{PLURAL:$1|Kiçi sahypa|Kiçi sahypa}}',
@@ -2557,9 +2534,6 @@ Mazmun üçin bir sebäp goşmaga rugsat berýär',
# Patrol log
'patrol-log-page' => 'Patrullyk gündeligi',
'patrol-log-header' => 'Bu patrullyk edilen wersiýalaryň gündeligidir.',
-'patrol-log-line' => '$2 sahypasynyň $1 patrullyk edilen diýip belledi $3',
-'patrol-log-auto' => '(awtomatik)',
-'patrol-log-diff' => '$1 wersiýasyny',
'log-show-hide-patrol' => 'Patrullyk gündeligini $1',
# Image deletion
@@ -2585,7 +2559,7 @@ Ony işletseňiz iş ulgamyňyza howp astyna salmagyňyz mümkin.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|sahypa|sahypa}}',
'file-info' => 'faýl ölçegi: $1, MIME tipi: $2',
'file-info-size' => '$1 × $2 piksel, faýlyň ölçegi: $3, MIME tipli: $4',
-'file-nohires' => '<small>Wersiýanyň mundan uly ölçegi ýok.</small>',
+'file-nohires' => 'Wersiýanyň mundan uly ölçegi ýok.',
'svg-long-desc' => 'SVG faýly, nominal $1 × $2 piksel, faýl ölçegi: $3',
'show-big-image' => 'Suratyň doly ölçegi',
'file-info-gif-looped' => 'halkaly',
@@ -2959,13 +2933,6 @@ Bu tassyklama kody $4 senesine çenli güýjüni saklaýar.',
'scarytranscludefailed' => '[$1 üçin şablon äkelmeklik başa barmady]',
'scarytranscludetoolong' => '[URL örän uzyn]',
-# Trackbacks
-'trackbackbox' => 'Bu sahypa üçin trackbackler:<br />
-$1',
-'trackbackremove' => '([$1 Öçür])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback şowly öçürildi.',
-
# Delete conflict
'deletedwhileediting' => "'''Duýduryş''': Bu sahypa siz redaktirläp başlanyňyzdan soňra öçürildi!",
'confirmrecreate' => "Bu sahypany [[User:$1|$1]] ([[User talk:$1|çekişme]]) ulanyjysy siz sahypany redaktirläp otyrkaňyz öçürdi, sebäbi:
@@ -3172,4 +3139,9 @@ Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
'sqlite-has-fts' => '$1 (doly tekstli gözleg goldawly)',
'sqlite-no-fts' => '$1 (doly tekstli gözleg goldawsyz)',
+# New logging system
+'revdelete-restricted' => 'administratorlara goýlan çäklendirmeler',
+'revdelete-unrestricted' => 'administratorlardan aýyrylan çäklendirmeler',
+'newuserlog-byemail' => 'parol e-poçta bilen iberildi',
+
);
diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php
index 83897c90..00c9a219 100644
--- a/languages/messages/MessagesTl.php
+++ b/languages/messages/MessagesTl.php
@@ -491,18 +491,19 @@ Pakiulat ito sa isang [[Special:ListUsers/sysop|tagapangasiwa]], na ibinibigay a
'badarticleerror' => 'Hindi maisasagawa ang gawaing ito sa pahinang ito.',
'cannotdelete' => 'Hindi mabura ang pahina o talaksang "$1".
Maaaring ibinura na ito ng iba.',
+'cannotdelete-title' => 'Hindi maibura ang pahinang "$1"',
'badtitle' => 'Hindi kanais-nais na pamagat',
'badtitletext' => 'Ang hiniling na pamagat ng pahina ay hindi katanggap-tanggap, wala, o isang may-maling kawing na pamagat na pangugnayang-wika (interwika) o pangugnayang wiki (interwiki).
Maaaring naglalaman ito ng isa o higit pang mga panitik (karakter) na hindi maaaring gamitin para sa mga pamagat.',
-'perfcached' => 'Ang sumusunod na datos ay nakaligpit at maaaring wala na sa panahon.',
-'perfcachedts' => 'Ang sumusunod na datos ay nakaligpit, at dating isinapanahon noong $1.',
+'perfcached' => 'Ang sumusunod na datos ay nakaligpit at maaaring wala na sa panahon. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ang sumusunod na datos ay nakaligpit, at dating isinapanahon noong $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Kasulukuyang hindi gumagana ang mga pagbabago para sa pahinang ito.
Ang mga dato dito ay hindi pa masasariwa sa kasalukuyan.',
'wrong_wfQuery_params' => 'Maling mga parametro sa wfQuery()<br />
Tungkulin: $1<br />
Tanong: $2',
'viewsource' => 'Tingnan ang pinagmulan',
-'viewsourcefor' => 'para sa $1',
+'viewsource-title' => 'Tingnan ang pinagmulan para sa $1',
'actionthrottled' => 'Hinadlangan ang gawain',
'actionthrottledtext' => "Bilang paraang panglaban sa ''spam'', pinigalan kang magawa ang galaw na ito nang maraming ulit sa loob ng maikling panahon, at lumabis ka na sa limitasyong ito.
Pakisubok na lang ulit pagkaraan ng kaunting mga minuto.",
@@ -617,6 +618,7 @@ Walang e-liham na ipapadala para sa anumang sumusunod na tampok na kasangkapang-
'emailconfirmlink' => 'Pakikompirma ang iyong direksiyong e-liham.',
'invalidemailaddress' => 'Hindi matatanggap ang direksiyong e-liham na ito dahil tila mayroon itong maling anyo.
Pakipasok ang isang may mahusay na anyong adres o paki-iwang walang laman na lang ang lagayan.',
+'cannotchangeemail' => 'Hindi maaaring baguhin ang mga direksiyong e-liham sa wiking ito.',
'accountcreated' => 'Nilikha na ang kuwenta',
'accountcreatedtext' => 'Nilikha na ang kuwentang tagagamit para kay $1.',
'createaccount-title' => 'Paglikha ng kuwenta para sa {{SITENAME}}',
@@ -679,6 +681,14 @@ Dapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa n
Pansamantalang hudyat: $2',
'passwordreset-emailsent' => 'Naipadala na ang isang e-liham na pampaalala.',
+# Special:ChangeEmail
+'changeemail' => 'Baguhin ang direksiyong e-liham',
+'changeemail-header' => 'Baguhin ang direksiyong e-liham ng kuwenta',
+'changeemail-oldemail' => 'Kasalukuyang direksiyong e-liham:',
+'changeemail-newemail' => 'Bagong direksiyong e-liham:',
+'changeemail-none' => '(wala)',
+'changeemail-cancel' => 'Kanselahin',
+
# Edit page toolbar
'bold_sample' => 'Makapal na panitik',
'bold_tip' => 'Makapal na panitik',
@@ -748,9 +758,6 @@ Pakitandaang hindi mo maaaring gamitin ang kasangkapang-katangiang "padalhan ng
Ang pangkasalukuyang adres mo ng IP ay $3, at ang ID ng pagharang ay #$5.
Pakisama ang lahat ng mga detalyeng nasa itaas sa anumang pagtatanong na gagawin mo.',
'blockednoreason' => 'walang binigay na dahilan',
-'blockedoriginalsource' => "Ang pinagmulan ng '''$1''' ay pinapakita sa ibaba:",
-'blockededitsource' => "Ang teksto ng '''mga pagbabago mo''' sa '''$1''' ay ipinapakita sa ibaba:",
-'whitelistedittitle' => 'Paglagda kailangan para makapagbago',
'whitelistedittext' => 'Kailangan mong $1 para makapagbago ng mga pahina.',
'confirmedittext' => 'Kailangang kumpirmahin mo muna ang adres ng iyong e-liham bago makapagbago ng mga pahina.
Pakihanda at patotohanan ang adres ng e-liham sa pamamagitan ng iyong [[Special:Preferences|kagustuhan ng tagagamit]].',
@@ -1011,8 +1018,6 @@ Makikita pa rin ng iba pang mga tagapangasiwang nasa {{SITENAME}} ang mga tinago
'revdelete-unsuppress' => 'Tanggalin ang mga pagbabawal sa naibalik na mga pagbabago',
'revdelete-log' => 'Dahilan:',
'revdelete-submit' => 'Pairalin para sa napiling {{PLURAL:$1|pagbabago|mga pagbabago}}',
-'revdelete-logentry' => 'binago ang antas ng pagpapakita ng pagbabago kay [[$1]]',
-'logdelete-logentry' => 'binago ang antas ng pagpapakita ng kaganapan kay [[$1]]',
'revdelete-success' => "'''Matagumpay na naisapanahon''' ang kaantasan ng pagpapakita ng pagbabago.",
'revdelete-failure' => "'''Hindi maisapanahon ang pagbabago sa kaantasan ng pagpapakita.'''
$1",
@@ -1024,15 +1029,6 @@ $1",
'revdel-restore-visible' => 'makikitang mga binago',
'pagehist' => 'Kasaysayan ng pahina',
'deletedhist' => 'Naburang kasaysayan',
-'revdelete-content' => 'nilalaman',
-'revdelete-summary' => 'buod ng pagbabago',
-'revdelete-uname' => 'pangalang pantagagamit',
-'revdelete-restricted' => 'nilapat na mga paghihigpit sa mga tagapangasiwa',
-'revdelete-unrestricted' => 'tinanggal ang mga pagbabawal para sa mga tagapangasiwa',
-'revdelete-hid' => 'itinago $1',
-'revdelete-unhid' => 'pinalitaw $1',
-'revdelete-log-message' => '$1 para sa $2 {{PLURAL:$2|pagbabago|mga pagbabago}}',
-'logdelete-log-message' => '$1 para sa $2 {{PLURAL:$2|kaganapan|mga kaganapan}}',
'revdelete-hide-current' => 'May kamalian sa pagtatago ng bagay na may petsang $2, $1: ito ang kasalukuyang pagbabago.
Hindi ito maikukubli.',
'revdelete-show-no-access' => 'May kamalian sa pagpapakita ng bagay na may petsang $2, $1: tinatakan ang bagay na ito bilang "ipinagbabawal".
@@ -1188,7 +1184,7 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'prefs-rc' => 'Kamakailan lamang na mga pagbabago',
'prefs-watchlist' => 'Talaan ng mga binabantayan',
'prefs-watchlist-days' => 'Mga araw na ipapakita sa talaan ng mga binabantayan:',
-'prefs-watchlist-days-max' => 'Pinakamarami ang 7 mga araw',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Pinakamaraming bilang ng mga pagbabagong ipapakita sa pinalawak na talaan ng mga binabantayan:',
'prefs-watchlist-edits-max' => 'Pinakamataas na bilang: 1000',
'prefs-watchlist-token' => 'Balap ng talaan ng mga binabantayan:',
@@ -1386,13 +1382,13 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
'right-autopatrol' => 'Kusang tatakan bilang napatrolya ang sariling mga pagbabago',
'right-patrolmarks' => 'Tingnan ang mga kamakailang pagbabagong natatakan bilang napatrolya',
'right-unwatchedpages' => 'Tingnan ang isang talaan ng mga pahinang hindi binabantayan',
-'right-trackback' => "Magpasa ng isang balikan-ang-bakas (''trackback'')",
'right-mergehistory' => 'Pagsanibin ang kasaysayan ng mga pahina',
'right-userrights' => 'Baguhin ang lahat ng karapatan ng tagagamit',
'right-userrights-interwiki' => 'Baguhin ang karapatan ng mga tagagamit na nasa ibang mga wiki',
'right-siteadmin' => 'Ikandado at alisin ang pagkakakandado ng kalipunan ng dato',
'right-override-export-depth' => 'Iluwas ang mga pahina na kabilang ang mga pahinang nakakawing magpahanggang sa isang lalim na 5',
'right-sendemail' => 'Magpadala ng e-liham sa ibang mga tagagamit',
+'right-passwordreset' => 'Muling itinakdang hudyat para sa isang tagagamit ([[Special:PasswordReset|natatanging pahina]])',
# User rights log
'rightslog' => 'Tala ng mga karapatan ng tagagamit',
@@ -1430,7 +1426,6 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
'action-patrol' => 'tatakan bilang napatrolya na ang mga pagbabagong ginawa ng iba',
'action-autopatrol' => 'tatakan ang pagbabago mo bilang napatrolya na',
'action-unwatchedpages' => 'tingnan ang talaan ng mga pahinang hindi nababantayan',
-'action-trackback' => "magpasa ng isang balikan-ang-bakas (''trackback'')",
'action-mergehistory' => 'pagsanibin ang kasaysayan nitong pahina',
'action-userrights' => 'baguhin ang lahat ng karapatan ng tagagamit',
'action-userrights-interwiki' => 'baguhin ang mga karapatan ng tagagamit na nasa ibang mga wiki',
@@ -1724,7 +1719,6 @@ Ang paglalarawang nasa ibabaw ng [$2 pahina ng paglalarawan ng talaksan] nito do
# File reversion
'filerevert' => 'Ibalik sa dati ang $1',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'Ibalik ang talaksan',
'filerevert-intro' => '<span class="plainlinks">Ibinabalik mo sa dati ang \'\'\'[[Media:$1|$1]]\'\'\' patungo sa [$4 bersyon noong $3, $2].</span>',
'filerevert-comment' => 'Dahilan:',
@@ -1735,7 +1729,6 @@ Ang paglalarawang nasa ibabaw ng [$2 pahina ng paglalarawan ng talaksan] nito do
# File deletion
'filedelete' => 'Burahin ang $1',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'Burahin ang talaksan',
'filedelete-intro' => "Buburahin mo na ang talaksang '''[[Media:$1|$1]]''' na kasama ang lahat ng kasaysayan nito.",
'filedelete-intro-old' => '<span class="plainlinks">Binubura mo ang bersyon ng \'\'\'[[Media:$1|$1]]\'\'\' mula noong [$4 $3, $2].</span>',
@@ -1964,12 +1957,8 @@ Sinusuportahang mga protokolo: <tt>$1</tt>',
'activeusers-noresult' => 'Walang natagpuang mga tagagamit.',
# Special:Log/newusers
-'newuserlogpage' => 'Talaan ng paglikha ng tagagamit',
-'newuserlogpagetext' => 'Isa itong talaan ng mga paglikha ng tagagamit.',
-'newuserlog-byemail' => 'Ipinadala ang hudyat sa pamamagitan ng e-liham',
-'newuserlog-create-entry' => 'Bagong tagagamit',
-'newuserlog-create2-entry' => 'nalikha ang bagong akawnt na $1',
-'newuserlog-autocreate-entry' => 'Awtomatikong nalikha ang akawnt',
+'newuserlogpage' => 'Talaan ng paglikha ng tagagamit',
+'newuserlogpagetext' => 'Isa itong talaan ng mga paglikha ng tagagamit.',
# Special:ListGroupRights
'listgrouprights' => 'Mga uri ng tagagamit',
@@ -2107,8 +2096,6 @@ Pakitiyak lamang na ito ang nais mong gawin, na nauunawaan mo ang mga kahihinatn
'actioncomplete' => 'Naisakatuparan na ang gawain',
'actionfailed' => 'Hindi nagtagumpay ang galaw',
'deletedtext' => 'Nabura na ang "$1". Tingnan ang $2 para sa talaan ng kamakailan lamang na mga pagbubura.',
-'deletedarticle' => 'binura ang "[[$1]]"',
-'suppressedarticle' => 'pinigil/sinupil ang "[[$1]]"',
'dellogpage' => 'Talaan ng pagbubura',
'dellogpagetext' => 'Nasa ibaba ang isang talaan ng pinakakamailan lamang na mga pagbubura.',
'deletionlog' => 'tala ng pagbubura',
@@ -2158,7 +2145,6 @@ Tingnan ang [[Special:ProtectedPages|talaan ng nakasanggalang na mga pahina]] pa
'movedarticleprotection' => 'inilipat ang pagtatakdang pampanananggalang mula sa "[[$2]]" patungong "[[$1]]"',
'protect-title' => 'Palitan ang antas ng panananggalang para sa "$1"',
'prot_1movedto2' => 'Inilipat ang [[$1]] patungo sa [[$2]]',
-'protect-backlink' => '↠$1',
'protect-legend' => 'Pagtibayin/tiyakin ang panananggalang',
'protectcomment' => 'Dahilan:',
'protectexpiry' => 'Magtatapos sa:',
@@ -2237,7 +2223,6 @@ Sa ganitong mga pagkakataon, dapat mong tanggalin ang tsek o huwag itago ang pin
'undeletereset' => 'I-reset',
'undeleteinvert' => 'Baligtarin ang pagpili/pilian',
'undeletecomment' => 'Dahilan:',
-'undeletedarticle' => 'ibinalik "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 pagbabago|$1 mga pagbabagong}} naibalik na',
'undeletedrevisions-files' => '{{PLURAL:$1|1 pagbabago|$1 mga pagbabago}} at {{PLURAL:$2|1 talaksang|$2 mga talaksang}} naibalik na',
'undeletedfiles' => '{{PLURAL:$1|1 talaksang|$1 mga talaksang}} naibalik na',
@@ -2520,9 +2505,6 @@ Pumili muli ng ibang pangalan.',
'movepage-page-moved' => 'Nailipat na ang pahinang $1 sa $2.',
'movepage-page-unmoved' => 'Hindi na mailipat ang pahinang $1 sa $2.',
'movepage-max-pages' => 'Ang pinakamataas na $1 {{PLURAL:$1|pahina|mga pahina}} ay nailipat at wala nang maililipat ng awtomatiko.',
-'1movedto2' => 'Ang [[$1]] ay inilipat sa [[$2]]',
-'1movedto2_redir' => 'Ang [[$1]] ay inilipat sa [[$2]] sa ibabaw ng pangkarga',
-'move-redirect-suppressed' => 'Sinupil ang pagturo papunta sa ibang pahina',
'movelogpage' => 'Tala ng paglipat',
'movelogpagetext' => 'Sumusunod ang mga tala ng mga pahinang nailipat.',
'movesubpage' => '{{PLURAL:$1|Kabahaging pahina|Kabahaging mga pahina}}',
@@ -2791,9 +2773,6 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
# Patrol log
'patrol-log-page' => 'Tala ng Pagpapatrolya',
'patrol-log-header' => 'Tala ito ng mga pagbabagong napatrolya na.',
-'patrol-log-line' => 'tinatakang $1 ng $2 napatrolya $3',
-'patrol-log-auto' => '(awtomatiko)',
-'patrol-log-diff' => 'rebisyong $1',
'log-show-hide-patrol' => '$1 tala ng pagpatrolya',
# Image deletion
@@ -2820,11 +2799,11 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
'file-info' => 'sukat ng talaksan: $1, tipo ng MIME: $2',
'file-info-size' => '$1 × $2 piksel, sukat ng talaksan: $3, tipo ng MIME: $4',
'file-info-size-pages' => '$1 × $2 mga piksel, sukat ng talaksan: $3, uri ng MIME: $4, $5 {{PLURAL:$5|pahina|mga pahina}}',
-'file-nohires' => '<small>Walang makuhang mas mataas na resolusyon (kalinawan).</small>',
+'file-nohires' => 'Walang makuhang mas mataas na resolusyon (kalinawan).',
'svg-long-desc' => 'Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3',
'show-big-image' => 'Buong resolusyon (kalinawan)',
-'show-big-image-preview' => '<small>Sukat ng paunang-tingin na ito: $1.</small>',
-'show-big-image-other' => '<small>Iba pang mga resolusyon: $1.</small>',
+'show-big-image-preview' => 'Sukat ng paunang-tingin na ito: $1.',
+'show-big-image-other' => 'Iba pang mga resolusyon: $1.',
'show-big-image-size' => '$1 x $2 mga piksel',
'file-info-gif-looped' => 'nasilo na',
'file-info-gif-frames' => '$1 {{PLURAL:$1|banhay|mga banhay}}',
@@ -2845,7 +2824,7 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
'sp-newimages-showfrom' => 'Ipakita ang mga bagong talaksang nagsisimula mula $2, $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'hours-abbrev' => 'o',
+'hours-abbrev' => '$1o',
# Bad image list
'bad_image_list' => 'Ang anyo ay ang mga sumusunod:
@@ -3344,13 +3323,6 @@ Mawawalan ng bisa ang kodigong ito ng pagpapatunay pagsapit ng $4.',
'scarytranscludefailed' => '[Bigo ang pagkuha ng suleras na $1; paumanhin]',
'scarytranscludetoolong' => '[Masyadong mahaba ang URL; paumanhin]',
-# Trackbacks
-'trackbackbox' => "Mga ''trackback'' para sa pahinang ito:<br />
-$1",
-'trackbackremove' => '([$1 Nabura])',
-'trackbacklink' => 'Balikan ang bakas<!--trackback-->',
-'trackbackdeleteok' => "Tagumpay na nabura ang ''trackback''.",
-
# Delete conflict
'deletedwhileediting' => 'Babala: Binura ang pahinang ito pagkaraan mong simulan ang pagbago!',
'confirmrecreate' => "Binura ni [[User:$1|$1]] ([[User talk:$1|usapan]]) ang pahinang ito pagkaraan mong magumpisang magbago na may dahilang:
@@ -3601,4 +3573,55 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
'sqlite-has-fts' => '$1 na may suportang paghahanap ng buong teksto',
'sqlite-no-fts' => '$1 na walang suporta ng paghahanap ng buong teksto',
+# New logging system
+'revdelete-restricted' => 'nilapat na mga paghihigpit sa mga tagapangasiwa',
+'revdelete-unrestricted' => 'tinanggal ang mga pagbabawal para sa mga tagapangasiwa',
+'newuserlog-byemail' => 'Ipinadala ang hudyat sa pamamagitan ng e-liham',
+
+# Feedback
+'feedback-subject' => 'Paksa:',
+'feedback-message' => 'Mensahe:',
+'feedback-cancel' => 'Huwag ituloy',
+'feedback-submit' => 'Ipasa ang Pakaing-tugon',
+'feedback-adding' => 'Idinaragdag ang pakaing-tugon sa pahina...',
+'feedback-error1' => 'Kamalian: Hindi nakikilalang kinalabasan mula sa API',
+'feedback-error2' => 'Kamalian: Nabigo ang pagpatnugot',
+'feedback-error3' => 'Kamalian: Walang tugon mula sa API',
+
+# API errors
+'api-error-badaccess-groups' => 'Hindi ka pinapayagang makapagkarga ng mga talaksan papunta sa wiking ito.',
+'api-error-badtoken' => 'Panloob na kamalian: masamang kahalip.',
+'api-error-copyuploaddisabled' => 'Ang pagkakarga ng URL ay hindi pinagagana sa tagapaghaing ito.',
+'api-error-duplicate' => 'May {{PLURAL:$1|[$2 ibang talaksan]g|[$2 ibang ilang mga talaksan]g}} nasa wiki na na may katulad na nilalaman',
+'api-error-duplicate-archive' => 'Nagkaroon {{PLURAL:$1|dati ng [$2 iba pang talaksan]|dati ng mga [$2 ilang iba pang mga talaksan]}} na umiiral na sa sityo na may katulad na nilalaman, ngunit {{PLURAL:$1|ito ay|ito ay mga}} nabura na.',
+'api-error-duplicate-archive-popup-title' => 'Nabura nang kakambal na {{PLURAL:$1|talaksan|mga talaksan}}',
+'api-error-duplicate-popup-title' => 'Kagayang {{PLURAL:$1|talaksan|mga talaksan}}',
+'api-error-empty-file' => 'Walang laman ang ipinasa mong talaksan.',
+'api-error-fetchfileerror' => 'Panloob na kamalian: may naganap na pagkakamali habang kinukuha ang talaksan.',
+'api-error-file-too-large' => 'Napakalaki ng talaksang ipinasa mo.',
+'api-error-filename-tooshort' => 'Napakaiksi ng pangalan ng talaksan.',
+'api-error-filetype-banned' => 'Ipinagbabawal ang ganitong uri ng talaksan.',
+'api-error-filetype-missing' => 'Kulang ng karugtong ang talaksan.',
+'api-error-hookaborted' => 'Ang pagbabagong sinubok mong gawin ay hindi itinuloy ng isang kawil ng dugtong.',
+'api-error-http' => 'Panloob na kamalian: hindi makaugnay sa tagahain.',
+'api-error-illegal-filename' => 'Hindi pinapayagan ang pangalan ng talaksan.',
+'api-error-internal-error' => 'Panloob na kamalian: may naganap na kamalian habang pinoproseso ang pagkakarga mo sa wiki.',
+'api-error-invalid-file-key' => 'Panloob na kamalian: hindi matagpuan ang talaksan sa loob ng pansamantalang taguan.',
+'api-error-missingparam' => 'Panloob na kamalian: nawawala ang mga parametro ng kahilingan.',
+'api-error-missingresult' => 'Panloob na kamalian: hindi matukoy kung nagtagumpay ang kopya.',
+'api-error-mustbeloggedin' => 'Dapat na nakalagda ka upang makapagkarga ng mga talaksan.',
+'api-error-mustbeposted' => 'Panloob na kamalian: ang kahilingan ay nangangailangan ng HTTP POST.',
+'api-error-noimageinfo' => 'Nagtagumpay ang pagkakarga, subalit hindi nakapagbigay ng anumang kabatiran ang tagapaghain hinggil sa talaksan.',
+'api-error-nomodule' => 'Panloob na kamalian: walang pangkat ng modyul na pangkarga.',
+'api-error-ok-but-empty' => 'Panloob na kamalian: walang tugon mula sa tagapaghain.',
+'api-error-overwrite' => 'Hindi pinapayagan ang pagsusulat sa ibabaw ng isang umiiral na talaksan.',
+'api-error-stashfailed' => 'Panloob na kamalian: nabigo ang tagapaghain na magtabi ng pansamantalang talaksan.',
+'api-error-timeout' => 'Hindi tumugon ang tagapaghain sa loob ng inaasahang panahon.',
+'api-error-unclassified' => 'Naganap ang isang hindi nalalamang kamalian',
+'api-error-unknown-code' => 'Hindi malamang kamalian: "$1"',
+'api-error-unknown-error' => 'Panloob na kamalian: may nangyaring kamalian habang sinusubok mong ikarga ang talaksan mo.',
+'api-error-unknown-warning' => 'Hindi nalalamang babala: $1',
+'api-error-uploaddisabled' => 'Hindi pinapagana ang pagkakargang paitaas sa wiking ito.',
+'api-error-verification-error' => 'Maaaring sira ang talaksang ito, o may maling karugtong.',
+
);
diff --git a/languages/messages/MessagesTn.php b/languages/messages/MessagesTn.php
index e1c0e632..ff23e814 100644
--- a/languages/messages/MessagesTn.php
+++ b/languages/messages/MessagesTn.php
@@ -103,13 +103,12 @@ O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago
'createaccount' => 'Ipulela tsebe',
# Edit pages
-'summary' => 'Tshoboko:',
-'minoredit' => 'Se ke paakanyo e potlana',
-'watchthis' => 'Lebelela tsebe e',
-'savearticle' => 'Boloka tsebe',
-'showpreview' => 'Supa gore go tlaa lebega jang',
-'showdiff' => 'Supa diphetogo',
-'whitelistedittitle' => 'Ikwadiso e a tlhokafala fa o batla go baakanya sengwe',
+'summary' => 'Tshoboko:',
+'minoredit' => 'Se ke paakanyo e potlana',
+'watchthis' => 'Lebelela tsebe e',
+'savearticle' => 'Boloka tsebe',
+'showpreview' => 'Supa gore go tlaa lebega jang',
+'showdiff' => 'Supa diphetogo',
# History pages
'currentrev' => 'Dipaakanyo tsa sešeng',
@@ -164,7 +163,6 @@ O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago
'movenologin' => 'Ga o a ikwadisa',
'movepagebtn' => 'Sutisa tsebe',
'movedto' => 'sutela kwa',
-'1movedto2' => '[[$1]] o sutisediwa kwa go [[$2]]',
'movereason' => 'Lebaka:',
# Namespace 8 related
diff --git a/languages/messages/MessagesTo.php b/languages/messages/MessagesTo.php
index 801bf163..a2f99b8b 100644
--- a/languages/messages/MessagesTo.php
+++ b/languages/messages/MessagesTo.php
@@ -245,13 +245,12 @@ Ko e pule, naʻe lokaʻi ia, ʻoku pehē: $1',
'cannotdelete' => 'NaÊ»e Ê»ikai lava tÄmateÊ»i Ê»a e peesi pe faile naÊ»e tala. Mahalo pÄ“ kuo tÄmateÊ»i Ê»uluaki ia Ê»e he Ê»etita kehe.',
'badtitle' => 'Hingoa ʻikai sai',
'badtitletext' => "NaÊ»e taÊ»eÊ»aonga Ê»a e hingoa Ê»o e peesi naÊ»a ke fili, pe naÊ»e Ê»i ai ha fehokotaki mÄhehei fakalea kehe pe fehokotaki mÄhehei faka''wiki'' kehe. Mahalo pe Ê»oku Ê»i loto ha ʻū mataÊ»itohi Ê»oku Ê»ikai lava ngÄueÊ»aki Ê»i ha hingoa.",
-'perfcached' => 'ʻOku fafaʻo ʻa e meʻaʻilo ʻi lalo, pea mahalo pē ʻoku ʻikai fakafoʻoua.',
-'perfcachedts' => 'ʻOku fafaʻo ʻa e meʻaʻilo ʻi lalo, naʻe fakaonopooni fakamuimui ia $1.',
+'perfcached' => 'ʻOku fafaʻo ʻa e meʻaʻilo ʻi lalo, pea mahalo pē ʻoku ʻikai fakafoʻoua. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ʻOku fafaʻo ʻa e meʻaʻilo ʻi lalo, naʻe fakaonopooni fakamuimui ia $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'wrong_wfQuery_params' => "Ngaahi mahuʻinga ʻikai totonu ki he ''wfQuery()''<br />
Lakanga: $1<br />
Eke: $2",
'viewsource' => 'Vakai ki he tupunga',
-'viewsourcefor' => 'ki he $1',
'protectedinterface' => 'Ko e peesi ʻeni ʻoku fakaai ia ʻa e potutohi maʻa e founga fakakomipiuta, ʻoku maluʻi ia ʻo taʻofi leakovi.',
'editinginterface' => "'''Fakatokanga''' Ê»Oku ke fatu Ê»i he peesi Ê»oku ne ngÄueÊ»aki ki he potutohi Ê»o e founga fakakomipiuta. Ko ia Ê»ene Ê»asi mai maÊ»a e kau Ê»etita kotoa Ê»e hÅ«kitonu ai Ê»a e ngaahi liliu Ê»o e pÄ“sí.",
'sqlhidden' => '(ʻOku toi ʻa e fehuʻi SQL)',
@@ -349,9 +348,6 @@ Kapau naʻe kole ia ʻe he tokotaha kehe, pea ʻosi hoʻo manatuʻi ʻo e leatap
'missingsummary' => "'''Fakamanatu''': Naʻe ʻikai te ke fakaai ha fakanounou. Kapau te ke toe lomi Haofaki, ʻe haofakiʻi hoʻo fatu taʻefakanounou.",
'missingcommenttext' => 'KÄtaki tuku pÄ“ Ê»i lalo Ê»a e fakamatala',
'blockedtitle' => 'ʻOku taʻofia ʻa e ʻetitá',
-'blockedoriginalsource' => "ʻOku ʻasi ʻi lalo ʻa e tupunga ʻo e '''$1''':",
-'blockededitsource' => "ʻOku ʻasi ʻi lalo ʻa e tohi ʻo '''hoʻo ngaahi fatu''' ki he '''$1''':",
-'whitelistedittitle' => 'ʻOku pau ke kau ki ai ke fatuʻi',
'whitelistedittext' => 'ʻOku pau te ke $1 kapau te ke fiefatu ʻa e ngaahi kupu.',
'confirmedittext' => 'Ê»Oku pau te ke fakamoÊ»oniÊ»i ho tuÊ»asila tohila Ê»i muÊ»a hoÊ»o fatu kupu. KÄtaki Ê»e fakamoÊ»oniÊ»i ia ngÄueÊ»aki hoÊ»o [[Special:Preferences|faÊ»iteliha]] fakaÊ»etita.',
'loginreqtitle' => 'ʻOku pau te ke kau ki ai',
@@ -738,10 +734,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'ʻAsi mai',
# Special:Log/newusers
-'newuserlogpage' => 'Tohinoa ʻo e fakatupu kau ʻetita',
-'newuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e fakatupu kau ʻetita.',
-'newuserlog-create-entry' => 'ʻEtita foʻou',
-'newuserlog-create2-entry' => 'Naʻe fakatupu ʻa e tohi-kau-ki-ai maʻa $1',
+'newuserlogpage' => 'Tohinoa ʻo e fakatupu kau ʻetita',
+'newuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e fakatupu kau ʻetita.',
# E-mail user
'mailnologin' => 'ʻOku ʻikai ha tuʻasila ke tohila ki ai',
@@ -805,7 +799,6 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
'actioncomplete' => 'Ê»Osi ngÄue',
'deletedtext' => 'Kuo tÄmateÊ»i "$1"
Vakai ki he $2 maÊ»a e fakamatala Ê»o e ngaahi toki tÄmateÊ»i.',
-'deletedarticle' => 'ʻosi tamateʻi "[[$1]]"',
'dellogpage' => 'Tohinoa Ê»o e tÄmateÊ»i',
'dellogpagetext' => 'Ê»Oku Ê»asi Ê»i lalo ha hokohoko Ê»o e ngaahi tÄmateÊ»i fakamuimui taha.',
'deletionlog' => 'tohinoa Ê»o e tÄmateÊ»i',
@@ -847,7 +840,6 @@ Ko e fatu fakamuimui naʻe fatu ʻe [[User:$3|$3]] ([[User talk:$3|Alea]]).',
'undeletelink' => 'fakafoki',
'undeletereset' => 'Fakafoki',
'undeletecomment' => 'Fakamatala:',
-'undeletedarticle' => 'kuo fakafoki "[[$1]]"',
'undeletedrevisions' => 'Kuo fakafoki ʻa e paaki ʻe $1',
'undeletedfiles' => 'Kuo fakafoki ʻa e faile ʻe $1',
'cannotundelete' => 'NaÊ»e movete Ê»a e taÊ»etÄmateÊ»i; mahalo pÄ“ kuo taÊ»etÄmateÊ»i Ê»uluaki ia Ê»e he Ê»etita kehe.',
@@ -955,8 +947,6 @@ Vakai ki he [[Special:Log/delete|hokohoko tÄmateÊ»i]] ki he lekooti Ê»o e ngaah
'talkexists' => "'''Kuo ola Ê»a e Ê»unu Ê»o e peesi ia, kÄ naÊ»e Ê»ikai Ê»unu he peesi alea koeÊ»uhi Ê»oku toe tuÊ»u ha peesi pehÄ“ mo e hingoa foÊ»ou. KÄtaki fakataha kinaua faiÊ»aki Ê»a e nima.'''",
'movedto' => 'kuo ʻunu ki he',
'movetalk' => 'ʻUnu he peesi alea fekauʻaki',
-'1movedto2' => 'Kuo ʻunu ʻa e [[$1]] ki he [[$2]]',
-'1movedto2_redir' => 'Kuo ʻunu ʻa e [[$1]] ki he [[$2]] ʻi he leʻei',
'movelogpage' => 'Tohinoa ʻo e ʻunu',
'movelogpagetext' => 'Ko e hokohoko ʻo e ngaahi peesi kuo ʻunu',
'movereason' => 'ʻUhinga',
@@ -1045,7 +1035,7 @@ Pea hoko ai pÄ“ hoÊ»o lava tÄnaki ha Ê»uhinga Ê»i he fakanounou',
# Media information
'imagemaxsize' => 'Fakangatangata ngaahi faitÄ Ê»i he ʻū peesi fakamahino ki he:',
'file-info' => 'Ko e faile hono lahi: $1, faʻahinga MIME: $2',
-'file-nohires' => '<small>Ê»Oku Ê»ikai Ê»i ai ha faitÄ auiiki.</small>',
+'file-nohires' => 'Ê»Oku Ê»ikai Ê»i ai ha faitÄ auiiki.',
'show-big-image' => 'Ê»Asi Ê»a e faitÄ auiiki',
# Special:NewFiles
diff --git a/languages/messages/MessagesTpi.php b/languages/messages/MessagesTpi.php
index 628829dc..6faad448 100644
--- a/languages/messages/MessagesTpi.php
+++ b/languages/messages/MessagesTpi.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Caffelice (on tpi.wikipedia.org)
* @author Iketsi
* @author Wantok
* @author Wytukaze
@@ -257,10 +258,9 @@ $messages = array(
'nstab-category' => 'Grup',
# General errors
-'error' => 'Birua',
-'badtitle' => 'Nem bilong pes i no stret',
-'viewsource' => 'Lukim as tok',
-'viewsourcefor' => 'bilong $1',
+'error' => 'Birua',
+'badtitle' => 'Nem bilong pes i no stret',
+'viewsource' => 'Lukim as tok',
# Login and logout pages
'yourname' => 'Yusanem:',
@@ -330,11 +330,6 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
'revdelete-radio-set' => 'Yes',
'revdelete-radio-unset' => 'Nogat',
'pagehist' => 'Ol senis bilong pes',
-'revdelete-uname' => 'yusanem',
-'revdelete-hid' => 'i bin haitim $1',
-'revdelete-unhid' => 'i bin soim $1',
-'revdelete-log-message' => '$1 long $2 senis',
-'logdelete-log-message' => '$1 long $2 senis',
# History merging
'mergehistory-from' => 'As pes:',
@@ -383,7 +378,7 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
'datedefault' => 'Nogat laik',
'prefs-rc' => 'Nupela senis',
'prefs-watchlist' => 'Lukautbuk',
-'prefs-watchlist-days-max' => 'No moa long 7 de',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits-max' => 'No moa long: 1000',
'prefs-resetpass' => 'Senis paswot',
'saveprefs' => 'Holim long tingting',
@@ -581,8 +576,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Soim',
# Special:Log/newusers
-'newuserlogpage' => 'Ripot long ol nupela yusa',
-'newuserlog-create-entry' => 'Lista bilong ol nupela yusa',
+'newuserlogpage' => 'Ripot long ol nupela yusa',
# Special:ListGroupRights
'listgrouprights-group' => 'Grup',
@@ -637,7 +631,6 @@ Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis
'deletepage' => 'Rausim dispela pes',
'delete-confirm' => 'Rausim $1',
'delete-legend' => 'Rausim',
-'deletedarticle' => 'i rausim "[[$1]]"',
'dellogpage' => 'Ripot long rausim ol pes',
'deletecomment' => 'As bilong en:',
'deletereasonotherlist' => 'Arapela as bilong en',
@@ -716,8 +709,6 @@ Yu mas painim narapela nem.',
'talkexists' => "'''Pes bilong buk i surik pinis, tasol pes bilong toktok i no inap surik, bilong wanem wanpela pes bilong toktok istap pinis wantaim dispela nam. Yu mas pasim wantaim tupela pes bilong toktok yu yet.'''",
'movedto' => 'i surik i go long',
'movetalk' => 'Surikim pes bilong toktok wantaim',
-'1movedto2' => '[[$1]] i surik i go long [[$2]] pinis',
-'1movedto2_redir' => 'surikim [[$1]] long [[$2]] bilong nupela rot',
'movelogpage' => 'Buk bilong ol surik',
'movelogpagetext' => 'Hia yumi lukim ol pes i surik pinis.',
'movereason' => 'As bilong en:',
@@ -798,9 +789,6 @@ Yu inap lukim as tok bilong em',
# Scary transclusion
'scarytranscludetoolong' => '[URL i longpela tumas]',
-# Trackbacks
-'trackbackremove' => '([$1 Rausim])',
-
# action=purge
'confirm_purge_button' => 'OK',
diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php
index 26b735d5..342d6677 100644
--- a/languages/messages/MessagesTr.php
+++ b/languages/messages/MessagesTr.php
@@ -10,11 +10,13 @@
* @author 82-145
* @author Bekiroflaz
* @author Bombola
+ * @author Cekli829
* @author Dbl2010
* @author Don Alessandro
* @author Emperyan
* @author Erkan Yilmaz
* @author Fryed-peach
+ * @author Goktr001
* @author Hanberke
* @author Incelemeelemani
* @author Joseph
@@ -75,6 +77,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Tümİletiler', 'TümMesajlar' ),
'Allpages' => array( 'TümSayfalar' ),
'Ancientpages' => array( 'EskiSayfalar' ),
+ 'Badtitle' => array( 'KötüBaşlık', 'BozukBaşlık' ),
'Blankpage' => array( 'BoÅŸSayfa' ),
'Block' => array( 'Engelle', 'IPEngelle' ),
'Blockme' => array( 'BeniEngelle' ),
@@ -120,8 +123,8 @@ $specialPageAliases = array(
'Mostrevisions' => array( 'EnÇokRevizyon' ),
'Movepage' => array( 'SayfaTaşı' ),
'Mycontributions' => array( 'Katkılarım' ),
- 'Mypage' => array( 'BenimSayfam' ),
- 'Mytalk' => array( 'MesajSayfam' ),
+ 'Mypage' => array( 'Sayfam', 'BenimSayfam', 'KullanıcıSayfam' ),
+ 'Mytalk' => array( 'MesajSayfam', 'Ä°letiSayfam' ),
'Myuploads' => array( 'Yüklemelerim' ),
'Newimages' => array( 'YeniDosyalar', 'YeniResimler' ),
'Newpages' => array( 'YeniSayfalar' ),
@@ -169,140 +172,142 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
- 'notoc' => array( '0', '__İÇİNDEKİLERYOK__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__GALERÄ°YOK__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__İÇİNDEKİLERZORUNLU__', '__FORCETOC__' ),
- 'toc' => array( '0', '__İÇİNDEKİLER__', '__TOC__' ),
- 'noeditsection' => array( '0', '__DEĞİŞTİRYOK__', '__DÜZENLEMEYOK__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BAÅžLIKYOK__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'GÃœNCELAY', 'GÃœNCELAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'MEVCUTAY1', 'GÃœNCELAY1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'MEVCUTAYADI', 'GÃœNCELAYADI', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', 'MEVCUTAYKISALTMASI', 'GÃœNCELAYKISALTMASI', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'MEVCUTGÃœN', 'GÃœNCELGÃœN', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'MEVCUTGÃœN2', 'GÃœNCELGÃœN2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'MEVCUTGÃœNADI', 'GÃœNCELGÃœNADI', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'MEVCUTYIL', 'GÃœNCELYIL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'MEVCUTZAMAN', 'GÃœNCELZAMAN', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'MEVCUTSAAT', 'GÃœNCELSAAT', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'YERELAY', 'YERELAY2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'YERELAY1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'YERELAYADI', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'YERELAYDIÄ°YELÄ°K', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'YERELAYKISALTMASI', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'YERELGÃœN', 'LOCALDAY' ),
- 'localday2' => array( '1', 'YERELGÃœN2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'YERELGÃœNADI', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'YERELYIL', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'YERELZAMAN', 'LOCALTIME' ),
- 'localhour' => array( '1', 'YERELSAAT', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'SAYFASAYISI', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'MADDESAYISI', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'DOSYASAYISI', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'KULLANICISAYISI', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'AKTÄ°FKULLANICISAYISI', 'ETKÄ°NKULLANICISAYISI', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'DEĞİŞİKLİKSAYISI', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'GÖRÜNTÜLEMESAYISI', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'SAYFAADI', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'Ä°SÄ°MALANI', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'Ä°SÄ°MALANIU', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'TARTIÅžMAALANI', 'TARTIÅžMABOÅžLUÄžU', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'TARTIÅžMAALANIU', 'TARTIÅžMABOÅžLUÄžUU', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'KONUALANI', 'MADDEALANI', 'KONUBOÅžLUÄžU', 'MADDEBOÅžLUÄžU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'KONUALANIU', 'MADDEALANIU', 'KONUBOÅžLUÄžUU', 'MADDEBOÅžLUÄžUU', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'TAMSAYFAADI', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'TAMSAYFAADIU', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ALTSAYFAADI', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ALTSAYFAADIU', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ÃœSTSAYFAADI', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ÃœSTSAYFAADIU', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'TARTIÅžMASAYFASIADI', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'TARTIÅžMASAYFASIADIU', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'KONUSAYFASIADI', 'MADDESAYFASIADI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'KONUSAYFASIADIU', 'MADDESAYFASIADIU', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'MSJ:', 'MSG:' ),
- 'subst' => array( '0', 'KOPYALA:', 'AKTAR:', 'SUBST:' ),
- 'safesubst' => array( '0', 'GÃœVENLÄ°AKTAR:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'MSJNW:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'küçükresim', 'küçük', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'küçükresim=$1', 'küçük=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'saÄŸ', 'right' ),
- 'img_left' => array( '1', 'sol', 'left' ),
- 'img_none' => array( '1', 'yok', 'none' ),
- 'img_width' => array( '1', '$1pik', '$1piksel', '$1px' ),
- 'img_center' => array( '1', 'orta', 'center', 'centre' ),
- 'img_framed' => array( '1', 'çerçeveli', 'çerçeve', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'çerçevesiz', 'frameless' ),
- 'img_page' => array( '1', 'sayfa=$1', 'sayfa $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'dikey', 'dikey=$1', 'dikey $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'sınır', 'border' ),
- 'img_baseline' => array( '1', 'tabançizgisi', 'altçizgi', 'baseline' ),
- 'img_sub' => array( '1', 'alt', 'sub' ),
- 'img_super' => array( '1', 'üst', 'üs', 'super', 'sup' ),
- 'img_top' => array( '1', 'tavan', 'tepe', 'top' ),
- 'img_text_top' => array( '1', 'metin-tavan', 'metin-tepe', 'text-top' ),
- 'img_middle' => array( '1', 'merkez', 'middle' ),
- 'img_bottom' => array( '1', 'taban', 'bottom' ),
- 'img_text_bottom' => array( '1', 'metin-taban', 'text-bottom' ),
- 'img_link' => array( '1', 'bağlantı=$1', 'link=$1' ),
- 'int' => array( '0', 'Ä°NT:', 'INT:' ),
- 'sitename' => array( '1', 'SÄ°TEADI', 'SITENAME' ),
- 'ns' => array( '0', 'AA:', 'AB:', 'NS:' ),
- 'nse' => array( '0', 'AAU:', 'ABU:', 'NSE:' ),
- 'localurl' => array( '0', 'YERELURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'YERELURLU:', 'LOCALURLE:' ),
- 'server' => array( '0', 'SUNUCU', 'SERVER' ),
- 'servername' => array( '0', 'SUNUCUADI', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'BETÄ°KYOLU', 'SCRIPTPATH' ),
- 'stylepath' => array( '0', 'BİÇEMYOLU', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMER:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'CÄ°NSÄ°YET:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__BAŞLIKDÖNÜŞÜMÜYOK__', '__BDY__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__İÇERİKDÖNÜŞÜMÜYOK__', '__İDY__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'MEVCUTHAFTA', 'GÃœNCELHAFTA', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'MEVCUTHAFTANINGÜNÜ', 'GÜNCELHAFTANINGÜNÜ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'YERELHAFTA', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'YERELHAFTANINGÜNÜ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'SÃœRÃœMNO', 'REVISIONID' ),
- 'revisionday' => array( '1', 'SÜRÜMGÜNÜ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'SÜRÜMGÜNÜ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'SÃœRÃœMAYI', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'SÃœRÃœMYILI', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'SÃœRÃœMZAMANBÄ°LGÄ°SÄ°', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'SÃœRÃœMKULLANICI', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ÇOĞUL:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TAMURL:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'TAMURLU:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'KHÄ°LK:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'BHÄ°LK:', 'UCFIRST:' ),
- 'lc' => array( '0', 'KH:', 'LC:' ),
- 'uc' => array( '0', 'BH:', 'UC:' ),
- 'raw' => array( '0', 'HAM:', 'RAW:' ),
- 'displaytitle' => array( '1', 'BAŞLIKGÖSTER', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISI__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISIYOK__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'MEVCUTSÃœRÃœM', 'GÃœNCELSÃœRÃœM', 'CURRENTVERSION' ),
- 'currenttimestamp' => array( '1', 'MEVCUTZAMANBÄ°LGÄ°SÄ°', 'GÃœNCELZAMANBÄ°LGÄ°SÄ°', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'YERELZAMANBÄ°LGÄ°SÄ°', 'LOCALTIMESTAMP' ),
- 'language' => array( '0', '#DÄ°L:', '#LÄ°SAN:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'İÇERİKDİLİ', 'İÇERİKLİSANI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'Ä°SÄ°MALANINDAKÄ°SAYFALAR', 'Ä°ADAKÄ°SAYFALAR', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'HÄ°ZMETLÄ°SAYISI', 'NUMBEROFADMINS' ),
- 'special' => array( '0', 'özel', 'special' ),
- 'defaultsort' => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORÄ°SIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
- 'tag' => array( '0', 'etiket', 'tag' ),
- 'hiddencat' => array( '1', '__GÄ°ZLÄ°KAT__', '__GÄ°ZLÄ°KATEGORÄ°__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'KATEGORÄ°DEKÄ°SAYFALAR', 'KATTAKÄ°SAYFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'SAYFABOYUTU', 'PAGESIZE' ),
- 'index' => array( '1', '__ENDEKS__', '__DÄ°ZÄ°N__', '__INDEX__' ),
- 'noindex' => array( '1', '__ENDEKSYOK__', '__DÄ°ZÄ°NYOK__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'GRUPTAKÄ°SAYI', 'GRUBUNSAYISI', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__STATİKYÖNLENDİRME__', '__SABİTYÖNLENDİRME__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'KORUMASEVÄ°YESÄ°', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#YÖNLENDİRME', '#YÖNLENDİR', '#REDIRECT' ),
+ 'notoc' => array( '0', '__İÇİNDEKİLERYOK__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__GALERÄ°YOK__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__İÇİNDEKİLERZORUNLU__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__İÇİNDEKİLER__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__DEĞİŞTİRYOK__', '__DÜZENLEMEYOK__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__BAÅžLIKYOK__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'GÃœNCELAY', 'GÃœNCELAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'MEVCUTAY1', 'GÃœNCELAY1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'MEVCUTAYADI', 'GÃœNCELAYADI', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'MEVCUTAYADIÄ°YELÄ°K', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'MEVCUTAYKISALTMASI', 'GÃœNCELAYKISALTMASI', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'MEVCUTGÃœN', 'GÃœNCELGÃœN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'MEVCUTGÃœN2', 'GÃœNCELGÃœN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'MEVCUTGÃœNADI', 'GÃœNCELGÃœNADI', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'MEVCUTYIL', 'GÃœNCELYIL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'MEVCUTZAMAN', 'GÃœNCELZAMAN', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'MEVCUTSAAT', 'GÃœNCELSAAT', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'YERELAY', 'YERELAY2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'YERELAY1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'YERELAYADI', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'YERELAYADIÄ°YELÄ°K', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'YERELAYKISALTMASI', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'YERELGÃœN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'YERELGÃœN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'YERELGÃœNADI', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'YERELYIL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'YERELZAMAN', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'YERELSAAT', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'SAYFASAYISI', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'MADDESAYISI', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'DOSYASAYISI', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'KULLANICISAYISI', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AKTÄ°FKULLANICISAYISI', 'ETKÄ°NKULLANICISAYISI', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'DEĞİŞİKLİKSAYISI', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'GÖRÜNTÜLEMESAYISI', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'SAYFAADI', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ADALANI', 'Ä°SÄ°MALANI', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ADALANIU', 'Ä°SÄ°MALANIU', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'TARTIÅžMAALANI', 'TARTIÅžMABOÅžLUÄžU', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'TARTIÅžMAALANIU', 'TARTIÅžMABOÅžLUÄžUU', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'KONUALANI', 'MADDEALANI', 'KONUBOÅžLUÄžU', 'MADDEBOÅžLUÄžU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'KONUALANIU', 'MADDEALANIU', 'KONUBOÅžLUÄžUU', 'MADDEBOÅžLUÄžUU', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'TAMSAYFAADI', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'TAMSAYFAADIU', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ALTSAYFAADI', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ALTSAYFAADIU', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ÃœSTSAYFAADI', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ÃœSTSAYFAADIU', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'TARTIÅžMASAYFASIADI', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'TARTIÅžMASAYFASIADIU', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'KONUSAYFASIADI', 'MADDESAYFASIADI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'KONUSAYFASIADIU', 'MADDESAYFASIADIU', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'MSJ:', 'Ä°LT:', 'MSG:' ),
+ 'subst' => array( '0', 'KOPYALA:', 'AKTAR:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'GÃœVENLÄ°AKTAR:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'MSJNW:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'küçükresim', 'küçük', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'küçükresim=$1', 'küçük=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'saÄŸ', 'right' ),
+ 'img_left' => array( '1', 'sol', 'left' ),
+ 'img_none' => array( '1', 'yok', 'none' ),
+ 'img_width' => array( '1', '$1pik', '$1piksel', '$1px' ),
+ 'img_center' => array( '1', 'orta', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'çerçeveli', 'çerçeve', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'çerçevesiz', 'frameless' ),
+ 'img_page' => array( '1', 'sayfa=$1', 'sayfa $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'dikey', 'dikey=$1', 'dikey $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'sınır', 'border' ),
+ 'img_baseline' => array( '1', 'tabançizgisi', 'altçizgi', 'baseline' ),
+ 'img_sub' => array( '1', 'alt', 'sub' ),
+ 'img_super' => array( '1', 'üst', 'üs', 'super', 'sup' ),
+ 'img_top' => array( '1', 'tavan', 'tepe', 'top' ),
+ 'img_text_top' => array( '1', 'metin-tavan', 'metin-tepe', 'text-top' ),
+ 'img_middle' => array( '1', 'merkez', 'middle' ),
+ 'img_bottom' => array( '1', 'taban', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'metin-taban', 'text-bottom' ),
+ 'img_link' => array( '1', 'bağlantı=$1', 'link=$1' ),
+ 'int' => array( '0', 'Ä°NT:', 'INT:' ),
+ 'sitename' => array( '1', 'SÄ°TEADI', 'SITENAME' ),
+ 'ns' => array( '0', 'AA:', 'AB:', 'NS:' ),
+ 'nse' => array( '0', 'AAU:', 'ABU:', 'NSE:' ),
+ 'localurl' => array( '0', 'YERELURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'YERELURLU:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'SUNUCU', 'SERVER' ),
+ 'servername' => array( '0', 'SUNUCUADI', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'BETÄ°KYOLU', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'BİÇEMYOLU', 'STYLEPATH' ),
+ 'grammar' => array( '0', 'GRAMER:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'CÄ°NSÄ°YET:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__BAŞLIKDÖNÜŞÜMÜYOK__', '__BDY__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__İÇERİKDÖNÜŞÜMÜYOK__', '__İDY__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'MEVCUTHAFTA', 'GÃœNCELHAFTA', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'MEVCUTHAFTANINGÜNÜ', 'GÜNCELHAFTANINGÜNÜ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'YERELHAFTA', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'YERELHAFTANINGÜNÜ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'SÃœRÃœMNU', 'SÃœRÃœMNO', 'REVÄ°ZYONNU', 'REVÄ°ZYONNO', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'SÜRÜMGÜNÜ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'SÜRÜMGÜNÜ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'SÃœRÃœMAYI', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'SÃœRÃœMYILI', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'SÃœRÃœMZAMANBÄ°LGÄ°SÄ°', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'SÃœRÃœMKULLANICI', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ÇOĞUL:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'TAMURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'TAMURLU:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'KHÄ°LK:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'BHÄ°LK:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'KH:', 'LC:' ),
+ 'uc' => array( '0', 'BH:', 'UC:' ),
+ 'raw' => array( '0', 'HAM:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'BAŞLIKGÖSTER', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISI__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISIYOK__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'MEVCUTSÃœRÃœM', 'GÃœNCELSÃœRÃœM', 'CURRENTVERSION' ),
+ 'currenttimestamp' => array( '1', 'MEVCUTZAMANBÄ°LGÄ°SÄ°', 'GÃœNCELZAMANBÄ°LGÄ°SÄ°', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'YERELZAMANBÄ°LGÄ°SÄ°', 'LOCALTIMESTAMP' ),
+ 'language' => array( '0', '#DÄ°L:', '#LÄ°SAN:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'İÇERİKDİLİ', 'İÇERİKLİSANI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'Ä°SÄ°MALANINDAKÄ°SAYFALAR', 'Ä°ADAKÄ°SAYFALAR', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'HÄ°ZMETLÄ°SAYISI', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'özel', 'special' ),
+ 'defaultsort' => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORÄ°SIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'etiket', 'tag' ),
+ 'hiddencat' => array( '1', '__GÄ°ZLÄ°KAT__', '__GÄ°ZLÄ°KATEGORÄ°__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'KATEGORÄ°DEKÄ°SAYFALAR', 'KATTAKÄ°SAYFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'SAYFABOYUTU', 'PAGESIZE' ),
+ 'index' => array( '1', '__DÄ°ZÄ°N__', '__ENDEKS__', '__INDEX__' ),
+ 'noindex' => array( '1', '__DÄ°ZÄ°NYOK__', '__ENDEKSYOK__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'GRUPTAKÄ°SAYI', 'GRUBUNSAYISI', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__STATİKYÖNLENDİRME__', '__SABİTYÖNLENDİRME__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'KORUMASEVÄ°YESÄ°', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
+ 'url_wiki' => array( '0', 'VÄ°KÄ°', 'WIKI' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -667,21 +672,23 @@ Lütfen URL\'yi not ederek bunu bir [[Special:ListUsers/sysop|hizmetliye]] ileti
'badarticleerror' => 'Yapmak istediğiniz işlem geçersizdir.',
'cannotdelete' => '"$1" sayfa ya da dosyası silinemedi.
Başka bir kullanıcı tarafından silinmiş olabilir.',
+'cannotdelete-title' => '"$1" sayfasını silemezsiniz',
'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' => 'Veriler daha önceden hazırlanmış olabilir. Bu sebeple güncel olmayabilir!',
-'perfcachedts' => 'Aşağıda saklanmış bilgiler bulunmaktadır, son güncelleme tarihi: $1.',
+'perfcached' => 'Veriler daha önceden hazırlanmış olabilir. Bu sebeple güncel olmayabilir! A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Aşağıda saklanmış bilgiler bulunmaktadır, son güncelleme tarihi: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Şu an için güncellemeler devre dışı bırakıldı. Buradaki veri hemen yenilenmeyecektir.',
'wrong_wfQuery_params' => 'wfQuery() ye yanlış parametre<br />
Fonksiyon: $1<br />
Sorgu: $2',
'viewsource' => 'Kaynağı gör',
-'viewsourcefor' => '$1 için',
+'viewsource-title' => '$1 sayfasının kaynağını görüntüle',
'actionthrottled' => 'Eylem kısılmışdır',
'actionthrottledtext' => 'Anti-spam önlemleri nedeniyle, bir eylemi kısa bir zaman aralığında çok defa yapmanız kısıtlandı, ve siz sınırı aşmış bulunmaktasınız.
Lütfen birkaç dakika sonra yeniden deneyin.',
'protectedpagetext' => 'Bu sayfa değişiklik yapılmaması için koruma altına alınmıştır.',
'viewsourcetext' => 'Bu sayfanın kaynağını görebilir ve kopyalayabilirsiniz:',
+'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 kilitlenmiştir.',
'editinginterface' => "'''UYARI:''' 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)',
@@ -780,6 +787,7 @@ Aşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.',
'emailconfirmlink' => 'E-posta adresinizi doğrulayın',
'invalidemailaddress' => 'Geçersiz bir formatta yazıldığından dolayı bu e-posta adresi kabul edilemez.
Lütfen geçerli bir formatta e-posta adresi yazın veya bu bölümü boş bırakın.',
+'cannotchangeemail' => 'Hesabın e-posta adresi bu wiki üzerinden değiştirilemez.',
'accountcreated' => 'Hesap açıldı',
'accountcreatedtext' => '$1 için bir kullanıcı hesabı açıldı.',
'createaccount-title' => '{{SITENAME}} için yeni kullanıcı hesabı oluşturulması',
@@ -797,6 +805,7 @@ Lütfen tekrar denemeden önce bekleyin.',
# E-mail sending
'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
+'user-mail-no-addy' => 'Bir e-posta adresi olmadan e-posta göndermeye çalıştı.',
# Change password dialog
'resetpass' => 'Parolayı değiştir',
@@ -819,31 +828,46 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
'resetpass-temp-password' => 'Geçici parola:',
# Special:PasswordReset
-'passwordreset' => 'Parola sıfırlama',
-'passwordreset-text' => 'Hesap bilgilerinizin e-posta ile hatırlatılması için bu formu doldurunuz.',
-'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-username' => 'Kullanıcı adı:',
-'passwordreset-domain' => 'Domain:',
-'passwordreset-email' => 'E-posta adresi:',
-'passwordreset-emailtitle' => '{{SITENAME}} hesap detayları',
-'passwordreset-emailtext-ip' => 'Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin
+'passwordreset' => 'Parola sıfırlama',
+'passwordreset-text' => 'Hesap bilgilerinizin e-posta ile hatırlatılması için bu formu doldurunuz.',
+'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-username' => 'Kullanıcı adı:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Sonuç e-postasını görüntüle?',
+'passwordreset-capture-help' => 'Bu kutuyu işaretlerseniz, e-posta (geçici şifre ile) size ve yanı sıra kullanıcıya gönderiliyor.',
+'passwordreset-email' => 'E-posta adresi:',
+'passwordreset-emailtitle' => '{{SITENAME}} hesap detayları',
+'passwordreset-emailtext-ip' => 'Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin
hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:
$2
{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5 gün}} geçerlidir.
Bu geçici parola ile giriş yapın ve yeni bir şifre seçin. Şifre değişimini siz istemediyseniz veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.',
-'passwordreset-emailtext-user' => '$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:
+'passwordreset-emailtext-user' => '$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:
$2
{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5 gün}} geçerlidir.
Bu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.',
-'passwordreset-emailelement' => 'Kullanıcı adı: $1
+'passwordreset-emailelement' => 'Kullanıcı adı: $1
Geçici şifre: $2',
-'passwordreset-emailsent' => 'Hatırlatma e-postası gönderildi.',
+'passwordreset-emailsent' => 'Hatırlatma e-postası gönderildi.',
+'passwordreset-emailsent-capture' => 'Aşağıda gözüktüğü gibi bir hatırlatma e-postası gönderilmiştir.',
+'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.',
+
+# Special:ChangeEmail
+'changeemail' => 'E-posta adresini deÄŸiÅŸtir',
+'changeemail-header' => 'Hesabın e-posta adresini değiştirin',
+'changeemail-text' => 'E-posta adresinizi değiştirmek için bu formu doldurun. Değişikliği onaylamak için parolanızı girmeniz gerekecektir.',
+'changeemail-no-info' => 'Bu sayfaya doğrudan ulaşabilmek için oturum açmış olmalısınız.',
+'changeemail-oldemail' => 'Mevcut E-posta adresi:',
+'changeemail-newemail' => 'Yeni E-posta adresi:',
+'changeemail-none' => '(yok)',
+'changeemail-submit' => "E-posta'yı değiştir",
+'changeemail-cancel' => 'Ä°ptal',
# Edit page toolbar
'bold_sample' => 'Kalın yazı',
@@ -913,9 +937,6 @@ Not, [[Special:Preferences|kullanıcı tercihlerinize]] geçerli bir e-posta adr
Şu anki IP numaranız $3 ve engellenme ID\'niz #$5.
Lütfen yapacağınız herhangi bir sorguda yukarıdaki bütün detayları bulundurun.',
'blockednoreason' => 'sebep verilmedi',
-'blockedoriginalsource' => "'''$1''' sayfasının kaynak metni aşağıdadır:",
-'blockededitsource' => "'''$1''' sayfasında '''yaptığınız değişikliğe''' ait metin aşağıdadır:",
-'whitelistedittitle' => 'Değişiklik yapmak için oturum açmalısınız',
'whitelistedittext' => 'Değişiklik yapabilmek için $1.',
'confirmedittext' => 'Sayfa değiştirmeden önce e-posta adresinizi onaylamalısınız. Lütfen [[Special:Preferences|tercihler]] kısmından e-postanızı ekleyin ve onaylayın.',
'nosuchsectiontitle' => 'Bölüm bulunamadı',
@@ -1160,8 +1181,6 @@ Bir hizmetli olarak bu değişikliği görebilirsiniz; [{{fullurl:{{#Special:Log
'revdelete-unsuppress' => 'Geri döndürülmüş revizyonlardaki kısıtlamaları kaldır',
'revdelete-log' => 'Neden:',
'revdelete-submit' => 'Seçilen {{PLURAL:$1|sürüme|sürümlere}} uygula',
-'revdelete-logentry' => '[[$1]] için revizyon görünürlüğü değişti',
-'logdelete-logentry' => '[[$1]] için olay görünürlüğü değişti',
'revdelete-success' => "'''Revizyon görünürlüğü başarıyla güncellendi.'''",
'revdelete-failure' => "'''Revizyon görünürlüğü güncellenemiyor:'''
$1",
@@ -1173,15 +1192,6 @@ $1",
'revdel-restore-visible' => 'görünür revizyonlar',
'pagehist' => 'Sayfa geçmişi',
'deletedhist' => 'Silinmiş geçmiş',
-'revdelete-content' => 'içerik',
-'revdelete-summary' => 'değişiklik özeti',
-'revdelete-uname' => 'kullanıcı adı',
-'revdelete-restricted' => 'hizmetliler için uygulanmış kısıtlamalar',
-'revdelete-unrestricted' => 'hizmetliler için kaldırılmış kısıtlamalar',
-'revdelete-hid' => 'gizle $1',
-'revdelete-unhid' => 'göster $1',
-'revdelete-log-message' => '$2 {{PLURAL:$2|revizyon|revizyon}} için $1',
-'logdelete-log-message' => '$2 {{PLURAL:$2|olay|olay}} için $1',
'revdelete-hide-current' => '$2 $1 tarihli öğe gizlenirken hata: bu güncel revizyon.
Gizlenemez.',
'revdelete-show-no-access' => '$2 $1 tarihli öğe gösterilirken hata: bu öğe "kısıtlı" olarak işaretlenmiş.
@@ -1339,12 +1349,14 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
'prefs-rc' => 'Son deÄŸiÅŸiklikler',
'prefs-watchlist' => 'Ä°zleme listesi',
'prefs-watchlist-days' => 'İzleme listesinde görüntülenecek gün sayısı:',
-'prefs-watchlist-days-max' => 'En fazla 7 gün',
+'prefs-watchlist-days-max' => 'en fazla $1 {{PLURAL:$1|gün|gün}}',
'prefs-watchlist-edits' => 'Genişletilmiş izleme listesinde gösterilecek değişiklik sayısı:',
'prefs-watchlist-edits-max' => 'En fazla sayı: 1000',
'prefs-watchlist-token' => 'İzleme listesi nişanı:',
'prefs-misc' => 'DiÄŸer ayarlar',
'prefs-resetpass' => 'Parolayı değiştir',
+'prefs-changeemail' => "E-posta'yı değiştir",
+'prefs-setemail' => 'E-posta adresini ayarlayın',
'prefs-email' => 'E-posta seçenekleri',
'prefs-rendering' => 'Görünüm',
'saveprefs' => 'Kaydet',
@@ -1403,6 +1415,7 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
'yourrealname' => 'Gerçek adınız:',
'yourlanguage' => 'Dil:',
'yourvariant' => 'Sizce:',
+'prefs-help-variant' => 'Bu vikinin içeriğini görüntülemek için tercih ettiğiniz varyant veya ortografi.',
'yournick' => 'İmzalarda gözükmesini istediğiniz isim',
'prefs-help-signature' => 'Tartışma sayfalarındaki yorumlar "<nowiki>~~~~</nowiki>" ile imzalanmalıdır, bu imzanıza ve zaman damgasına dönüştürülür.',
'badsig' => 'Geçersiz ham imza; HTML etiketlerini kontrol edin.',
@@ -1443,7 +1456,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'userrights-lookup-user' => 'Kullanıcı gruplarını düzenle',
'userrights-user-editname' => 'Kullanıcı adı giriniz:',
'editusergroup' => 'Kullanıcı grupları düzenle',
-'editinguser' => "'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) kullanıcısının yetkilerini değiştirmektesiniz",
+'editinguser' => "'''[[User:$1|$1]]''' $2 kullanıcısının yetkilerini değiştirmektesiniz",
'userrights-editusergroup' => 'Kullanıcı grupları düzenle',
'saveusergroups' => 'Kullanıcı grupları kaydet',
'userrights-groupsmember' => 'İçinde olduğu gruplar:',
@@ -1537,13 +1550,13 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'right-autopatrol' => 'Kişinin kendi değişikliklerinin otomatikman denetlendi olarak işaretlenmiş olması',
'right-patrolmarks' => 'Son değişiklikler gözleme işaretlerini gör',
'right-unwatchedpages' => 'İzlenmeyen sayfaların bir listesini gör',
-'right-trackback' => 'Bir geri izleme gönder',
'right-mergehistory' => 'Sayfalarının tarihlerini birleştir',
'right-userrights' => 'Tüm kullanıcı haklarını değiştirmek',
'right-userrights-interwiki' => 'Diğer vikilerdeki kullanıcıların kullanıcı haklarını değiştir',
'right-siteadmin' => 'Veritabanını kilitle ve kilidi aç',
'right-override-export-depth' => "Sayfaları, derinlik 5'e kadar bağlantılı sayfalarla beraber, dışa aktar",
'right-sendemail' => 'Diğer kullanıcılara e-posta gönder',
+'right-passwordreset' => 'Bir kullanıcının parolasını sıfırlar ([[Special:PasswordReset|özel sayfa]])',
# User rights log
'rightslog' => 'Kullanıcı hakları kayıtları',
@@ -1582,11 +1595,11 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'action-patrol' => 'diğerlerinin değişikliğini gözlenmiş olarak işaretlemeye',
'action-autopatrol' => 'değişikliğinizi gözlenmiş olarak işaretlemeye',
'action-unwatchedpages' => 'izlenmeyen sayfalar listesini görmeye',
-'action-trackback' => 'bir geri izleme göndermeye',
'action-mergehistory' => 'bu sayfanın geçmişini birleştirmeye',
'action-userrights' => 'tüm kullanıcıların haklarını değiştirmeye',
'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',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklik}}',
@@ -1670,6 +1683,7 @@ Bir sayfaya dosya koymak için bağlantınızda aşağıdaki formlardan birini k
'ignorewarnings' => 'Uyarıyı önemseme',
'minlength1' => 'Dosya adı en az bir harften oluşmalıdır.',
'illegalfilename' => '"$1" dosya adı bazı kullanılmayan karekterler içermektedir. Lütfen, yeni bir dosya adıyla tekrar deneyin.',
+'filename-toolong' => 'Dosya isimleri 240 bayttan uzun olamaz',
'badfilename' => 'Görüntü dosyasının ismi "$1" olarak değiştirildi.',
'filetype-mime-mismatch' => '".$1" dosya uzantısının, ($2) dosyasının MIME türüyle uyuşmadığı tespit edildi.',
'filetype-badmime' => '"$1" MIME tipindeki dosyaların yüklenmesine izin verilmez.',
@@ -1777,6 +1791,13 @@ Eğer sorun tekrarlanırsa, bir [[Special:ListUsers/sysop|hizmetli]] ile temasa
'upload-unknown-size' => 'Bilinmeyen boyut',
'upload-http-error' => 'Bir HTTP hatası oluştu: $1',
+# File backend
+'backend-fail-delete' => '"$1" dosyası silinemedi.',
+'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
+'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
+'backend-fail-read' => '$1 dosyası okunamadı.',
+'backend-fail-create' => '$1 dosyası oluşturulamadı.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Dosya ZIP denetimleri için açılırken bir hata ile karşılaşıldı.',
'zip-wrong-format' => 'Belirtilen dosya ZIP dosyası değil.',
@@ -2035,7 +2056,7 @@ Her satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca
'listusers-editsonly' => 'Sadece değişiklik yapan kullanıcıları göster',
'listusers-creationsort' => 'Oluşturma tarihine göre sırala',
'usereditcount' => '$1 {{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklik}}',
-'usercreated' => "$1 tarihinde $2'de oluÅŸturuldu",
+'usercreated' => "$1 tarihinde $2'de {{GENDER:$3|oluÅŸturuldu}}.",
'newpages' => 'Yeni sayfalar',
'newpages-username' => 'Kullanıcı adı:',
'ancientpages' => 'En son deÄŸiÅŸiklik tarihi en eski olan maddeler',
@@ -2127,12 +2148,8 @@ Desteklenen iletişim kuralları: <tt>$1</tt>',
'activeusers-noresult' => 'Kullanıcı bulunamadı.',
# Special:Log/newusers
-'newuserlogpage' => 'Yeni kullanıcı kayıtları',
-'newuserlogpagetext' => 'En son kaydolan kullanıcı kayıtları.',
-'newuserlog-byemail' => 'e-posta yoluyla şifre gönderilmiştir',
-'newuserlog-create-entry' => 'Yeni kullanıcı',
-'newuserlog-create2-entry' => '$1 yeni hesabını oluşturdu',
-'newuserlog-autocreate-entry' => 'Otomatik hesap oluÅŸturuldu',
+'newuserlogpage' => 'Yeni kullanıcı kayıtları',
+'newuserlogpagetext' => 'En son kaydolan kullanıcı kayıtları.',
# Special:ListGroupRights
'listgrouprights' => 'Kullanıcı grubu hakları',
@@ -2161,7 +2178,7 @@ Bireysel haklarla ilgili [[{{MediaWiki:Listgrouprights-helppage}}|daha fazla bil
'emailpagetext' => 'Bu kullanıcıya e-posta mesajı göndermek için aşağıdaki formu kullanabilirsiniz.
[[Special:Preferences|Kullanıcı tercihlerinizde]] girdiğiniz e-posta adresiniz, e-postanın "From (Kimden)" adresinde görünecektir, bu yüzden alıcı size direk cevap verebilecektir.',
'usermailererror' => 'E-posta hizmeti hata verdi:',
-'defemailsubject' => '{{SITENAME}} e-posta',
+'defemailsubject' => '"$1" kullanıcısından {{SITENAME}} e-postası',
'usermaildisabled' => 'Kullanıcı e-postası devre dışı',
'usermaildisabledtext' => 'Bu vikide diğer kullanıcılara e-posta gönderemezsiniz',
'noemailtitle' => 'e-posta adresi yok',
@@ -2281,8 +2298,6 @@ Bu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[
'actionfailed' => 'İşlem başarısız oldu',
'deletedtext' => '"$1" silindi.
Yakın zamanda silinenleri görmek için: $2.',
-'deletedarticle' => '"[[$1]]" silindi',
-'suppressedarticle' => '"[[$1]]" bastırıldı',
'dellogpage' => 'Silme kayıtları',
'dellogpagetext' => 'Aşağıdaki liste son silme kayıtlarıdır.',
'deletionlog' => 'silme kayıtları',
@@ -2354,6 +2369,7 @@ Bu sayfanın koruma seviyesini değiştirebilirsiniz; ancak bu kademeli korumaya
'protect-level-sysop' => 'sadece hizmetliler',
'protect-summary-cascade' => 'kademeli',
'protect-expiring' => 'bitiÅŸ tarihi $1 (UTC)',
+'protect-expiring-local' => '$1 tarihinde bitiyor',
'protect-expiry-indefinite' => 'süresiz',
'protect-cascade' => 'Bu sayfada kullanılan tüm sayfaları korumaya al (kademeli koruma)',
'protect-cantedit' => 'Bu sayfanın koruma düzeyini değiştiremezsiniz; çünkü bunu yapmaya yetkiniz yok.',
@@ -2411,7 +2427,6 @@ Revizyon onarılmış veya arşivden silinmiş olabilir ya da sahip olduğunuz b
'undeletereset' => 'Vazgeç',
'undeleteinvert' => 'Seçimi ters çevir',
'undeletecomment' => 'Neden:',
-'undeletedarticle' => '"$1" geri getirildi.',
'undeletedrevisions' => 'Toplam {{PLURAL:$1|1 kayıt|$1 kayıt}} geri getirildi.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} ve {{PLURAL:$2|1 dosya|$2 dosya}} eski konumuna getirildi',
'undeletedfiles' => '{{PLURAL:$1|1 dosya|$1 dosya}} geri getirildi.',
@@ -2420,6 +2435,7 @@ Revizyon onarılmış veya arşivden silinmiş olabilir ya da sahip olduğunuz b
Önceki silme ve geri getirme işlemleri için [[Special:Log/delete|silme kayıtları]]na bakınız.",
'undelete-header' => 'Daha önce silinmiş sayfaları görmek için bakınız: [[Special:Log/delete|silme kayıtları]].',
+'undelete-search-title' => 'Silinen sayfaları ara',
'undelete-search-box' => 'Silinmiş sayfaları ara',
'undelete-search-prefix' => 'Şununla başlayan sayfaları göster:',
'undelete-search-submit' => 'Ara',
@@ -2567,6 +2583,7 @@ Son engelleme günlüğü girdisi kaynak amacıyla aşağıda verilmiştir:',
'unblocklink' => 'engeli kaldır',
'change-blocklink' => 'engeli deÄŸiÅŸtir',
'contribslink' => 'katkılar',
+'emaillink' => 'e-posta gönder',
'autoblocker' => 'Otomatik olarak engellendiniz çünkü yakın zamanda IP adresiniz "[[User:$1|$1]]" kullanıcısı tarafından kullanılmıştır. $1 isimli kullanıcının engellenmesi için verilen sebep: "\'\'\'$2\'\'\'"',
'blocklogpage' => 'Engel kaydı',
'blocklog-showlog' => 'Bu kullanıcı daha önceden engellenmiş.
@@ -2687,9 +2704,6 @@ Lütfen başka bir isim deneyiniz.',
'movepage-page-moved' => '$1 sayfası $2 sayfasına taşındı.',
'movepage-page-unmoved' => '$1 sayfası $2 başlığına taşınamıyor.',
'movepage-max-pages' => 'En fazla $1 {{PLURAL:$1|sayfa|sayfa}} taşındı ve daha fazlası otomatik olarak taşınamaz.',
-'1movedto2' => '[[$1]] sayfasının yeni adı: [[$2]]',
-'1movedto2_redir' => '[[$1]] başlığı [[$2]] sayfasına yönlendirildi',
-'move-redirect-suppressed' => 'yönlendirme bastırılmış',
'movelogpage' => 'Taşıma kaydı',
'movelogpagetext' => 'Aşağıda bulunan liste adı değiştirilmiş sayfaları gösterir.',
'movesubpage' => '{{PLURAL:$1|Subpage|Alt sayfalar}}',
@@ -2702,7 +2716,7 @@ Lütfen başka bir isim deneyiniz.',
"[[:$1]]" isimli bir sayfa zaten mevcut. O sayfayı silerek, isim değişikliğini gerçekleştirmeye devam etmek istiyor musunuz?',
'delete_and_move_confirm' => 'Evet, sayfayı sil',
-'delete_and_move_reason' => 'İsim değişikliğinin gerçekleşmesi için silindi.',
+'delete_and_move_reason' => '[[$1]] sayfasının isim değişikliğinin gerçekleşmesi için silindi.',
'selfmove' => 'Olmasını istediğiniz isim ile mevcut isim aynı. Değişiklik mümkün değil.',
'immobile-source-namespace' => '"$1" ad alanında sayfalar taşınamıyor',
'immobile-target-namespace' => 'Sayfalar "$1" ad alanına taşınamıyor',
@@ -2732,6 +2746,7 @@ Bu, MedyaViki kullanan başka bir vikide [[Special:Import|içe aktarım sayfası
Sayfaları dışa aktarmak için, başlıkları aşağıdaki metin kutusuna girin, her satıra bir tane, ve eski sürümlerle beraber şimdiki sürümü, sayfa geçmişi satırlarını, ya da son değişiklik bilgisiyle beraber güncel sürümü isteyip istemediğinizi belirtin.
Sonuncu durumda, bir link de kullanabilirsiniz, ör: "[[{{MediaWiki:Mainpage}}]]" sayfası için [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Tüm sayfaları dışa aktar',
'exportcuronly' => 'Geçmiş sürümleri almadan sadece son sürümü al',
'exportnohistory' => "----
'''Not:''' Sayfaların tüm geçmişini bu formla dışa aktarmak, performans nedenlerinden ötürü devre dışı bırakılmıştır.",
@@ -2823,72 +2838,78 @@ Geçici dosya kayıp.',
'import-logentry-interwiki' => '$1 transvikileÅŸmiÅŸ',
'import-logentry-interwiki-detail' => '$2 sayfasından $1 {{PLURAL:$1|revizyon|revizyon}}',
+# JavaScriptTest
+'javascripttest' => 'JavaScript denemesi',
+'javascripttest-disabled' => 'Bu işlev devre dışı bırakıldı.',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Kullanıcı sayfanız',
-'tooltip-pt-anonuserpage' => 'The user page for the ip you',
-'tooltip-pt-mytalk' => 'Mesaj sayfanız',
-'tooltip-pt-anontalk' => 'Bu IP adresinden yapılmış değişiklikleri tartış',
-'tooltip-pt-preferences' => 'Tercihleriniz (ayarlarınız)',
-'tooltip-pt-watchlist' => 'Değişiklikler için izlemeye aldığınız sayfaların listesi',
-'tooltip-pt-mycontris' => 'Katkılarınızın listesi',
-'tooltip-pt-login' => 'Mecbur değilsiniz fakat oturum açmanız tavsiye olunur',
-'tooltip-pt-anonlogin' => 'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.',
-'tooltip-pt-logout' => 'Sistemden çık',
-'tooltip-ca-talk' => 'İçerik ile ilgili tartışma',
-'tooltip-ca-edit' => 'Bu sayfayı değiştirebilirsiniz. Lütfen kaydetmeden önce önizleme düğmesini kullanın.',
-'tooltip-ca-addsection' => 'Yeni bir altbaşlık aç',
-'tooltip-ca-viewsource' => 'Bu sayfa koruma altında. Sadece kaynağını görebilirsiniz.',
-'tooltip-ca-history' => 'Bu sayfanın geçmiş sürümleri',
-'tooltip-ca-protect' => 'Bu sayfayı koru',
-'tooltip-ca-unprotect' => 'Bu sayfanın korumasını değiştir',
-'tooltip-ca-delete' => 'Bu sayfayı sil',
-'tooltip-ca-undelete' => 'Sayfayı silinmeden önceki haline geri getirin',
-'tooltip-ca-move' => 'Bu sayfayı taşı',
-'tooltip-ca-watch' => 'Bu sayfayı izleme listenize ekleyin',
-'tooltip-ca-unwatch' => 'Bu sayfayı izleme listenizden çıkarın',
-'tooltip-search' => '{{SITENAME}} içinde ara',
-'tooltip-search-go' => 'EÄŸer varsa, tam bu addaki bir sayfaya git',
-'tooltip-search-fulltext' => 'Sayfalarda bu metni ara',
-'tooltip-p-logo' => 'Ana sayfa',
-'tooltip-n-mainpage' => 'Ana sayfaya git',
-'tooltip-n-mainpage-description' => 'Ana sayfaya git',
-'tooltip-n-portal' => 'Proje hakkında, neler yapabilirsiniz, ne nerdedir',
-'tooltip-n-currentevents' => 'Güncel olaylarla ilgili son bilgiler',
-'tooltip-n-recentchanges' => 'Vikide yapılmış son değişikliklerin listesi',
-'tooltip-n-randompage' => 'Rastgele bir maddeye gidin',
-'tooltip-n-help' => 'Yardım almak için',
-'tooltip-t-whatlinkshere' => 'Bu sayfaya bağlantı vermiş tüm viki sayfalarının listesi',
-'tooltip-t-recentchangeslinked' => 'Bu sayfadan bağlantı verilen sayfalardaki son değişiklikler',
-'tooltip-feed-rss' => 'Bu sayfa için RSS beslemesi',
-'tooltip-feed-atom' => 'Bu sayfa için atom beslemesi',
-'tooltip-t-contributions' => 'Kullanıcının katkılarının listesini gör',
-'tooltip-t-emailuser' => 'Bu kullanıcıya e-posta gönder',
-'tooltip-t-upload' => 'Dosya yükle',
-'tooltip-t-specialpages' => 'Tüm özel sayfaların listesi',
-'tooltip-t-print' => 'Bu sayfanın basılmaya uygun sürümü',
-'tooltip-t-permalink' => 'Sayfanın bu sürümüne kalıcı bağlantı',
-'tooltip-ca-nstab-main' => 'İçerik sayfasını göster',
-'tooltip-ca-nstab-user' => 'Kullanıcı sayfasını göster',
-'tooltip-ca-nstab-media' => 'Medya sayfasını göster',
-'tooltip-ca-nstab-special' => 'Bu özel sayfa olduğu için üzerinde değişiklik yapamazsınız.',
-'tooltip-ca-nstab-project' => 'Proje sayfasını göster',
-'tooltip-ca-nstab-image' => 'Dosya sayfasını göster',
-'tooltip-ca-nstab-mediawiki' => 'Sistem mesajını göster',
-'tooltip-ca-nstab-template' => 'Şablonu göster',
-'tooltip-ca-nstab-help' => 'Yardım sayfasını görmek için tıklayın',
-'tooltip-ca-nstab-category' => 'Kategori sayfasını göster',
-'tooltip-minoredit' => 'Küçük değişiklik olarak işaretle',
-'tooltip-save' => 'DeÄŸiÅŸiklikleri kaydet',
-'tooltip-preview' => 'Değişikliklerinizi gözden geçirin, lütfen kaydetmeden önce bunu kullanın!',
-'tooltip-diff' => 'Metin üzerinde yaptığınız değişiklikleri gösterir',
-'tooltip-compareselectedversions' => 'Bu sayfanın seçilmiş iki sürümü arasındaki farkları gör.',
-'tooltip-watch' => 'Sayfayı izleme listenize ekleyin',
-'tooltip-recreate' => 'Silinmiş olmasına rağmen sayfayı geri getir',
-'tooltip-upload' => 'Yüklemeyi başlat',
-'tooltip-rollback' => '"Geridöndür" tek tıklamayla bu sayfaya son katkı yapanın değişikliklerini geri alır',
-'tooltip-undo' => '"Geri al" bu değişikliği geri alır ve değişiklik formunu önizleme modunda açar.Özete bir sebep eklemeye olanak tanır.',
-'tooltip-preferences-save' => 'Tercihleri kaydet',
-'tooltip-summary' => 'Kısa bir özet girin',
+'tooltip-pt-userpage' => 'Kullanıcı sayfanız',
+'tooltip-pt-anonuserpage' => 'The user page for the ip you',
+'tooltip-pt-mytalk' => 'Mesaj sayfanız',
+'tooltip-pt-anontalk' => 'Bu IP adresinden yapılmış değişiklikleri tartış',
+'tooltip-pt-preferences' => 'Tercihleriniz (ayarlarınız)',
+'tooltip-pt-watchlist' => 'Değişiklikler için izlemeye aldığınız sayfaların listesi',
+'tooltip-pt-mycontris' => 'Katkılarınızın listesi',
+'tooltip-pt-login' => 'Mecbur değilsiniz fakat oturum açmanız tavsiye olunur',
+'tooltip-pt-anonlogin' => 'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.',
+'tooltip-pt-logout' => 'Sistemden çık',
+'tooltip-ca-talk' => 'İçerik ile ilgili tartışma',
+'tooltip-ca-edit' => 'Bu sayfayı değiştirebilirsiniz. Lütfen kaydetmeden önce önizleme düğmesini kullanın.',
+'tooltip-ca-addsection' => 'Yeni bir altbaşlık aç',
+'tooltip-ca-viewsource' => 'Bu sayfa koruma altında. Sadece kaynağını görebilirsiniz.',
+'tooltip-ca-history' => 'Bu sayfanın geçmiş sürümleri',
+'tooltip-ca-protect' => 'Bu sayfayı koru',
+'tooltip-ca-unprotect' => 'Bu sayfanın korumasını değiştir',
+'tooltip-ca-delete' => 'Bu sayfayı sil',
+'tooltip-ca-undelete' => 'Sayfayı silinmeden önceki haline geri getirin',
+'tooltip-ca-move' => 'Bu sayfayı taşı',
+'tooltip-ca-watch' => 'Bu sayfayı izleme listenize ekleyin',
+'tooltip-ca-unwatch' => 'Bu sayfayı izleme listenizden çıkarın',
+'tooltip-search' => '{{SITENAME}} içinde ara',
+'tooltip-search-go' => 'EÄŸer varsa, tam bu addaki bir sayfaya git',
+'tooltip-search-fulltext' => 'Sayfalarda bu metni ara',
+'tooltip-p-logo' => 'Ana sayfa',
+'tooltip-n-mainpage' => 'Ana sayfaya git',
+'tooltip-n-mainpage-description' => 'Ana sayfaya git',
+'tooltip-n-portal' => 'Proje hakkında, neler yapabilirsiniz, ne nerdedir',
+'tooltip-n-currentevents' => 'Güncel olaylarla ilgili son bilgiler',
+'tooltip-n-recentchanges' => 'Vikide yapılmış son değişikliklerin listesi',
+'tooltip-n-randompage' => 'Rastgele bir maddeye gidin',
+'tooltip-n-help' => 'Yardım almak için',
+'tooltip-t-whatlinkshere' => 'Bu sayfaya bağlantı vermiş tüm viki sayfalarının listesi',
+'tooltip-t-recentchangeslinked' => 'Bu sayfadan bağlantı verilen sayfalardaki son değişiklikler',
+'tooltip-feed-rss' => 'Bu sayfa için RSS beslemesi',
+'tooltip-feed-atom' => 'Bu sayfa için atom beslemesi',
+'tooltip-t-contributions' => 'Kullanıcının katkılarının listesini gör',
+'tooltip-t-emailuser' => 'Bu kullanıcıya e-posta gönder',
+'tooltip-t-upload' => 'Dosya yükle',
+'tooltip-t-specialpages' => 'Tüm özel sayfaların listesi',
+'tooltip-t-print' => 'Bu sayfanın basılmaya uygun sürümü',
+'tooltip-t-permalink' => 'Sayfanın bu sürümüne kalıcı bağlantı',
+'tooltip-ca-nstab-main' => 'İçerik sayfasını göster',
+'tooltip-ca-nstab-user' => 'Kullanıcı sayfasını göster',
+'tooltip-ca-nstab-media' => 'Medya sayfasını göster',
+'tooltip-ca-nstab-special' => 'Bu özel sayfa olduğu için üzerinde değişiklik yapamazsınız.',
+'tooltip-ca-nstab-project' => 'Proje sayfasını göster',
+'tooltip-ca-nstab-image' => 'Dosya sayfasını göster',
+'tooltip-ca-nstab-mediawiki' => 'Sistem mesajını göster',
+'tooltip-ca-nstab-template' => 'Şablonu göster',
+'tooltip-ca-nstab-help' => 'Yardım sayfasını görmek için tıklayın',
+'tooltip-ca-nstab-category' => 'Kategori sayfasını göster',
+'tooltip-minoredit' => 'Küçük değişiklik olarak işaretle',
+'tooltip-save' => 'DeÄŸiÅŸiklikleri kaydet',
+'tooltip-preview' => 'Değişikliklerinizi gözden geçirin, lütfen kaydetmeden önce bunu kullanın!',
+'tooltip-diff' => 'Metin üzerinde yaptığınız değişiklikleri gösterir',
+'tooltip-compareselectedversions' => 'Bu sayfanın seçilmiş iki sürümü arasındaki farkları gör.',
+'tooltip-watch' => 'Sayfayı izleme listenize ekleyin',
+'tooltip-watchlistedit-normal-submit' => 'Başlıkları kaldır',
+'tooltip-watchlistedit-raw-submit' => 'İzleme listesini güncelle',
+'tooltip-recreate' => 'Silinmiş olmasına rağmen sayfayı geri getir',
+'tooltip-upload' => 'Yüklemeyi başlat',
+'tooltip-rollback' => '"Geridöndür" tek tıklamayla bu sayfaya son katkı yapanın değişikliklerini geri alır',
+'tooltip-undo' => '"Geri al" bu değişikliği geri alır ve değişiklik formunu önizleme modunda açar.Özete bir sebep eklemeye olanak tanır.',
+'tooltip-preferences-save' => 'Tercihleri kaydet',
+'tooltip-summary' => 'Kısa bir özet girin',
# Stylesheets
'common.css' => '/* Buraya konulacak CSS kodu tüm temalarda etkin olur */',
@@ -2953,9 +2974,6 @@ Geçici dosya kayıp.',
# Patrol log
'patrol-log-page' => 'Kontrol kaydı',
'patrol-log-header' => 'Bu gözlenmiş revizyonların günlüğüdür.',
-'patrol-log-line' => '$3 kontrol edilmiş olarak $2 $1 sürümü işaretlendi',
-'patrol-log-auto' => '(otomatik)',
-'patrol-log-diff' => 'revizyon $1',
'log-show-hide-patrol' => 'Gözetim günlüğünü $1',
# Image deletion
@@ -2982,11 +3000,11 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
'file-info' => 'dosya boyutu: $1, MIME tipi: $2',
'file-info-size' => '$1 × $2 piksel, dosya boyutu: $3, MIME tipi: $4',
'file-info-size-pages' => '$1 × $2 piksel, dosya boyutu: $3, MIME tipi: $4, $5 {{PLURAL:$5|sayfa|sayfa}}',
-'file-nohires' => '<small>Daha yüksek çözünürlük yok.</small>',
+'file-nohires' => 'Daha yüksek çözünürlük yok.',
'svg-long-desc' => 'SVG dosyası, sözde $1 × $2 piksel, dosya boyutu: $3',
'show-big-image' => 'Tam çözünürlük',
-'show-big-image-preview' => '<small>Ön izleme boyutu: $1.</small>',
-'show-big-image-other' => '<small>Diğer çözünürlükleri: $1.</small>',
+'show-big-image-preview' => 'Ön izleme boyutu: $1.',
+'show-big-image-other' => 'Diğer {{PLURAL:$2|çözünürlük|çözünürlükleri}}: $1.',
'show-big-image-size' => '$1 × $2 piksel',
'file-info-gif-looped' => 'döngüye girdi',
'file-info-gif-frames' => '$1 {{PLURAL:$1|kare|kare}}',
@@ -3008,9 +3026,14 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 'sn',
-'minutes-abbrev' => 'dk.',
-'hours-abbrev' => 's',
+'seconds-abbrev' => '$1sn',
+'minutes-abbrev' => '$1dk.',
+'hours-abbrev' => '$1s',
+'seconds' => '{{PLURAL:$1|$1 saniye|$1 saniye}}',
+'minutes' => '{{PLURAL:$1|$1 dakika|$1 dakika}}',
+'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
+'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
+'ago' => '$1 önce',
# Bad image list
'bad_image_list' => 'Biçim aşağıdaki gibidir:
@@ -3497,13 +3520,6 @@ Bu onay kodu $4 tarihine kadar geçerlidir.',
'scarytranscludefailed' => '[$1 için şablon alımı başarısız oldu]',
'scarytranscludetoolong' => '[URL çok uzun]',
-# Trackbacks
-'trackbackbox' => 'Bu sayfa için geri izlemeler:<br />
-$1',
-'trackbackremove' => '([$1 Sil])',
-'trackbacklink' => 'Geri izleme',
-'trackbackdeleteok' => 'Geri izleme başarıyla silindi.',
-
# Delete conflict
'deletedwhileediting' => "'''Uyarı''': Bu sayfa siz değişiklik yapmaya başladıktan sonra silinmiş!",
'confirmrecreate' => "Bu sayfayı [[User:$1|$1]] ([[User talk:$1|mesaj]]) kullanıcısı siz sayfada değişiklik yaparken silmiştir, nedeni:
@@ -3595,6 +3611,9 @@ Ayrıca [[Special:EditWatchlist|standart düzenleme sayfasını]] da kullanabili
'hijri-calendar-m9' => 'Ramazan',
'hijri-calendar-m10' => 'Åževval',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tartışma]])',
+
# Core parser functions
'unknown_extension_tag' => 'Bilinmeyen eklenti etiketi "$1"',
'duplicate-defaultsort' => '\'\'\'Uyarı:\'\'\' Varsayılan "$2" sınıflandırma anahtarı, önceki "$1" sınıflandırma anahtarını geçersiz kılıyor.',
@@ -3648,9 +3667,10 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
# Special:SpecialPages
'specialpages' => 'Özel sayfalar',
-'specialpages-note' => '* Normal özel sayfalar.
+'specialpages-note' => '----
+* Normal özel sayfalar.
* <span class="mw-specialpagerestricted">Kısıtlı özel sayfalar.</span>
-* <span class="mw-specialpagecached">Yalnızca önbelleğe alınan özel sayfalar.</span>',
+* <span class="mw-specialpagecached">Önbelleğe alınan özel sayfalar (eskimiş olabilir)</span>',
'specialpages-group-maintenance' => 'Bakım raporları',
'specialpages-group-other' => 'Diğer özel sayfalar',
'specialpages-group-login' => 'Oturum aç / hesap edin',
@@ -3692,13 +3712,14 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
'tags-hitcount' => '$1 {{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklik}}',
# Special:ComparePages
-'comparepages' => 'Sayfaları karşılaştır',
-'compare-selector' => 'Sayfa sürümlerini karşılaştır',
-'compare-page1' => 'Sayfa 1',
-'compare-page2' => 'Sayfa 2',
-'compare-rev1' => 'Sürüm 1',
-'compare-rev2' => 'Sürüm 2',
-'compare-submit' => 'Karşılaştır',
+'comparepages' => 'Sayfaları karşılaştır',
+'compare-selector' => 'Sayfa sürümlerini karşılaştır',
+'compare-page1' => 'Sayfa 1',
+'compare-page2' => 'Sayfa 2',
+'compare-rev1' => 'Sürüm 1',
+'compare-rev2' => 'Sürüm 2',
+'compare-submit' => 'Karşılaştır',
+'compare-invalid-title' => 'Belirttiğiniz başlık geçersiz.',
# Database error messages
'dberr-header' => 'Bu vikinin bir sorunu var',
@@ -3725,4 +3746,52 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
'sqlite-has-fts' => '$1 tam-metin arama desteÄŸi ile',
'sqlite-no-fts' => '$1 tam-metin arama desteği olmaksızın',
+# New logging system
+'revdelete-content-hid' => 'Gizli içerik',
+'revdelete-uname-hid' => 'kullanıcı adı gizli',
+'revdelete-content-unhid' => 'içerik gösterildi',
+'revdelete-summary-unhid' => 'değişiklik özeti gösterildi',
+'revdelete-uname-unhid' => 'kullanıcı adı gösterildi',
+'revdelete-restricted' => 'hizmetliler için uygulanmış kısıtlamalar',
+'revdelete-unrestricted' => 'hizmetliler için kaldırılmış kısıtlamalar',
+'newuserlog-byemail' => 'e-posta yoluyla şifre gönderilmiştir',
+
+# Feedback
+'feedback-subject' => 'Konu:',
+'feedback-message' => 'Mesaj:',
+'feedback-cancel' => 'Ä°ptal',
+'feedback-submit' => 'Geribildirimi Gönder',
+'feedback-adding' => 'Sayfaya geribildirim ekleniyor...',
+'feedback-error2' => 'Hata: Düzenleme başarısız oldu',
+'feedback-error3' => "Hata: API'den yanıt yok",
+'feedback-thanks' => 'Teşekkürler! Görüşleriniz "[$2 $1]" sayfasında paylaşılmıştır.',
+'feedback-close' => 'Tamamlandı',
+'feedback-bugcheck' => 'Harika! Sadece [bilinen $1 hatalarından] olmadığını kontrol et.',
+'feedback-bugnew' => 'Kontrol ettim. Yeni hata bildir',
+
+# API errors
+'api-error-badaccess-groups' => 'Bu wiki için dosya yüklemenize izin verilmiyor.',
+'api-error-badtoken' => 'İç hata: Bozuk simge.',
+'api-error-duplicate-popup-title' => 'Çift {{PLURAL:$1|dosya|dosya}}',
+'api-error-empty-file' => 'Gönderdiğiniz dosya boş.',
+'api-error-emptypage' => 'Yeni, boÅŸ bir sayfa oluÅŸturmaya izin verilmez.',
+'api-error-file-too-large' => 'Gönderdiğiniz dosya çok büyük.',
+'api-error-filename-tooshort' => 'Dosya adı çok kısa.',
+'api-error-filetype-banned' => 'Bu dosya biçimi yasaklanmıştır.',
+'api-error-filetype-missing' => 'Dosya uzantısı eksik.',
+'api-error-http' => 'İç hata: sunucu ile bağlantı kurulamıyor.',
+'api-error-illegal-filename' => 'Bu dosya adına izin verilmiyor.',
+'api-error-invalid-file-key' => 'İç hata: geçici depolama dosyası bulunamadı.',
+'api-error-mustbeloggedin' => 'Dosya yükleyebilmek için oturum açmanız gereklidir.',
+'api-error-mustbeposted' => 'İç hata: İstek HTTP POST gerektiriyor.',
+'api-error-nomodule' => 'İç hata: Yükleme modülü ayarı yapılmadı.',
+'api-error-ok-but-empty' => 'İç hata: Sunucu yanıt vermiyor.',
+'api-error-stashfailed' => 'İç hata: Sunucu, geçici dosyaları kaybetti.',
+'api-error-unclassified' => 'Bilinmeyen bir hata oluÅŸtu.',
+'api-error-unknown-code' => 'Bilinmeyen hata: "$1"',
+'api-error-unknown-error' => 'İç hata: Dosya yüklemeye çalışırken bir şeyler ters gitti.',
+'api-error-unknown-warning' => 'Bilinmeyen uyarı: $1',
+'api-error-unknownerror' => 'Bilinmeyen hata: "$1".',
+'api-error-uploaddisabled' => 'Yükleme bu vikide devre dışı bırakılmıştır.',
+
);
diff --git a/languages/messages/MessagesTs.php b/languages/messages/MessagesTs.php
index a75dd265..c1bca703 100644
--- a/languages/messages/MessagesTs.php
+++ b/languages/messages/MessagesTs.php
@@ -268,9 +268,6 @@ U hi tshembisa nakambe leswaku hi wena mutsari wa leswi nyikeriwaka laha, kumbe
# Special:LinkSearch
'linksearch-ok' => 'Lava',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Mutirhisi muntswa',
-
# E-mail user
'emailuser' => 'rhumela mutirhisi loyi E-mail',
diff --git a/languages/messages/MessagesTt.php b/languages/messages/MessagesTt.php
index e6b0883e..6242ca59 100644
--- a/languages/messages/MessagesTt.php
+++ b/languages/messages/MessagesTt.php
@@ -10,7 +10,7 @@
* @author Timming
*/
-$fallback = 'tt-cyrl';
+$fallback = 'tt-cyrl, ru';
$messages = array(
# Delete
diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php
index 93a50694..53d6a5c2 100644
--- a/languages/messages/MessagesTt_cyrl.php
+++ b/languages/messages/MessagesTt_cyrl.php
@@ -108,6 +108,9 @@ $namespaceAliases = array(
'Törkem_bäxäse' => NS_CATEGORY_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$specialPageAliases = array(
'Activeusers' => array( 'Ðктив_кулланучылар' ),
'Allmessages' => array( 'Барлык_хатлар' ),
@@ -169,38 +172,38 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ЮÐӘЛТҮ', '#перенаправление', '#перенапр', '#REDIRECT' ),
- 'notoc' => array( '0', '__БÐШЛЫКЮК__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
- 'forcetoc' => array( '0', '__ETTIQ__', '__ОБЯЗ_ОГЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ЭЧТЕЛЕК__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__БҮЛЕКҮЗГӘРТҮЮК__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ', 'ÐГЫМДÐГЫ_ÐЙ2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ_ИСЕМЕ_GEN', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentday' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ÐГЫМДÐГЫ_ЕЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ÐГЫМДÐГЫ_Ð’ÐКЫТ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
- 'numberofarticles' => array( '1', 'МӘКÐЛӘ_СÐÐЫ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
- 'pagename' => array( '1', 'БИТ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
- 'namespace' => array( '1', 'ИСЕМÐӘР_МӘЙДÐÐЫ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
- 'msg' => array( '0', 'ХӘБӘР', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
- 'subst' => array( '0', 'TÖPÇEK:', 'ПОДСТ:', 'ПОДСТÐÐОВКÐ:', 'SUBST:' ),
- 'img_right' => array( '1', 'уңда', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'Ñулда', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'юк', 'без', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1px' ),
- 'img_center' => array( '1', 'үзәк', 'центр', 'center', 'centre' ),
- 'int' => array( '0', 'ЭЧКЕ:', 'Ð’ÐУТР:', 'INT:' ),
- 'sitename' => array( '1', 'СӘХИФӘ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'İA:', 'ПИ:', 'NS:' ),
- 'localurl' => array( '0', 'URINLIURL:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URINLIURLE:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
- 'language' => array( '0', '#ТЕЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'special' => array( '0', 'махÑуÑ', 'ÑлужебнаÑ', 'special' ),
- 'tag' => array( '0', 'тамга', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
- 'noindex' => array( '1', '__ИÐДЕКССЫЗ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
+ 'redirect' => array( '0', '#ЮÐӘЛТҮ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БÐШЛЫКЮК__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'forcetoc' => array( '0', '__ETTIQ__', '__ОБЯЗ_ОГЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ЭЧТЕЛЕК__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БҮЛЕКҮЗГӘРТҮЮК__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ', 'ÐГЫМДÐГЫ_ÐЙ2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐГЫМДÐГЫ_ÐЙ_ИСЕМЕ_GEN', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentday' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐГЫМДÐГЫ_КӨÐ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ÐГЫМДÐГЫ_ЕЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ÐГЫМДÐГЫ_Ð’ÐКЫТ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'numberofarticles' => array( '1', 'МӘКÐЛӘ_СÐÐЫ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'pagename' => array( '1', 'БИТ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'namespace' => array( '1', 'ИСЕМÐӘР_МӘЙДÐÐЫ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'msg' => array( '0', 'ХӘБӘР', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'TÖPÇEK:', 'ПОДСТ:', 'ПОДСТÐÐОВКÐ:', 'SUBST:' ),
+ 'img_right' => array( '1', 'уңда', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'Ñулда', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'юк', 'без', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'үзәк', 'центр', 'center', 'centre' ),
+ 'int' => array( '0', 'ЭЧКЕ:', 'Ð’ÐУТР:', 'INT:' ),
+ 'sitename' => array( '1', 'СӘХИФӘ_ИСЕМЕ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'İA:', 'ПИ:', 'NS:' ),
+ 'localurl' => array( '0', 'URINLIURL:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URINLIURLE:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
+ 'language' => array( '0', '#ТЕЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'махÑуÑ', 'ÑлужебнаÑ', 'special' ),
+ 'tag' => array( '0', 'тамга', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
+ 'noindex' => array( '1', '__ИÐДЕКССЫЗ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
);
$linkTrail = '/^([a-zабвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑÓ˜Ó™Ó¨Ó©Ò®Ò¯Ò–Ò—Ò¢Ò£ÒºÒ»]+)(.*)$/sDu';
@@ -569,16 +572,17 @@ $1',
'formerror' => 'Хата: форма мәгълүматларын тапшырып булмый',
'badarticleerror' => 'Бу биттә мондый гамәл башкарып булмый.',
'cannotdelete' => '«$1» иÑемле битне Ñки файлны бетереп булмый. Ðны бүтән кулланучы бетергән булырга мөмкин.',
+'cannotdelete-title' => '«$1» битен бетереп булмый',
'badtitle' => 'ЯракÑыз иÑем',
'badtitletext' => 'Битнең Ñоралган иÑеме Ð´Ó©Ñ€ÐµÑ Ñ‚Ò¯Ð³ÐµÐ», буш ÑиÑÓ™ телъара Ñки интервики иÑеме Ð´Ó©Ñ€ÐµÑ ÐºÒ¯Ñ€Ñәтелмәгән. ИÑемдә тыелган Ñимволлар кулланылган булырга мөмкин.',
-'perfcached' => 'Бу мәгълүматлар кÑштан алынган, аларда Ñоңгы үзгәртүләр булмаÑка мөмкин.',
-'perfcachedts' => 'Бу мәгълүматлар кÑштан алынган, ул Ñоңгы тапкыр $1 Ñңартылды.',
+'perfcached' => 'Бу мәгълүматлар кÑштан алынган, аларда Ñоңгы үзгәртүләр булмаÑка мөмкин. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Бу мәгълүматлар кÑштан алынган, ул Ñоңгы тапкыр $1 Ñңартылды. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Хәзер бу битне Ñңартып булмый. Монда күрÑәтелгән мәгълүматлар кабул ителмәÑчәк.',
'wrong_wfQuery_params' => 'wfQuery() Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ó©Ñ‡ÐµÐ½ Ñрамаган параметрлар<br />
ФункциÑ: $1<br />
Сорау: $2',
'viewsource' => 'Карау',
-'viewsourcefor' => '«$1» бите',
+'viewsource-title' => '$1 битенең Ñхма текÑтын карау',
'actionthrottled' => 'Тизлек киметелгән',
'actionthrottledtext' => 'Спамга каршы көрәш өчен аз вакыт Ñчендә бу гамәлне еш куллану тыелган. Зинһар, Ñоңарак кабатлагыз.',
'protectedpagetext' => 'Бу бит үзгәртү өчен Ñбык.',
@@ -672,6 +676,7 @@ $2',
'noemailprefs' => 'Электрон почта адреÑыгыз күрÑәтелмәгән, шуңа викиның Ñлектрон почта белән Ñшләү гамәлләре Ñүндерелгән.',
'emailconfirmlink' => 'Электрон почта адреÑыгызны дәлилләгез.',
'invalidemailaddress' => 'Электрон почта адреÑÑ‹ кабул ителә алмый, чөнки ул Ð´Ó©Ñ€ÐµÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÐºÐ° туры килми. Зинһар, Ð´Ó©Ñ€ÐµÑ Ð°Ð´Ñ€ÐµÑ ÐºÐµÑ€Ñ‚ÐµÐ³ÐµÐ· Ñки юлны буш калдырыгыз.',
+'cannotchangeemail' => 'Бу хиÑап ÑзмаÑының Ñлектрон почта адреÑÑ‹ бу викида үзгәртелә алмый',
'accountcreated' => 'ХиÑап ÑзмаÑÑ‹ төзелде',
'accountcreatedtext' => '$1 иÑемле кулланучы өчен хиÑап ÑзмаÑÑ‹ төзелде.',
'createaccount-title' => '{{SITENAME}}: теркәлү',
@@ -687,6 +692,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHP mail() функциÑÑендә билгеÑез хата',
+'user-mail-no-addy' => 'Электрон почта адреÑыннан башка Ñлектрон хат җибәрмәкче булды',
# Change password dialog
'resetpass' => 'СерÑүзне үзгәртү',
@@ -717,6 +723,12 @@ $2',
'passwordreset-emailelement' => 'Кулланучы иÑеме: $1
Вакытлыча ÑерÑүз: $2',
+# Special:ChangeEmail
+'changeemail-newemail' => 'Яңа Ñлектрон почта адреÑÑ‹:',
+'changeemail-none' => '(юк)',
+'changeemail-submit' => 'E-mail адреÑын үзгәртү',
+'changeemail-cancel' => 'Баш тарту',
+
# Edit page toolbar
'bold_sample' => 'Калын Ñзылыш',
'bold_tip' => 'Калын Ñзылыш',
@@ -782,9 +794,6 @@ $2',
Сезнең IP адреÑÑ‹ — $3, Ñ‚Ñ‹ÑŽ идентификаторы — #$5.
Хатларда бу мәгълүматны күрÑәтергә онытмагыз.",
'blockednoreason' => 'Ñәбәп күрÑәтелмәгән',
-'blockedoriginalsource' => "ÐÑта '''$1''' битенең текÑÑ‚Ñ‹ күрÑәтелгән.",
-'blockededitsource' => "ÐÑта '''$1''' битенең '''Ñез үзгәрткән''' текÑÑ‚Ñ‹ күрÑәтелгән.",
-'whitelistedittitle' => 'Үзгәртү өчен үз иÑемегез белән керергә кирәк',
'whitelistedittext' => 'Сез битләрне үзгәртү өчен $1 тиеш.',
'confirmedittext' => 'Битләрне үзгәртү алдыннан Ñез Ñлектрон почта адреÑыгызны дәлилләргә тиеш.
Сез моны [[Special:Preferences|көйләүләр битендә]] башкара алаÑыз.',
@@ -1027,12 +1036,6 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'revdel-restore-visible' => 'күрÑәтелгән юрамалар',
'pagehist' => 'битнең тарихы',
'deletedhist' => 'Бетерүләр тарихы',
-'revdelete-content' => 'Ñчтәлек',
-'revdelete-summary' => 'үзгәртүләр таÑвирламаÑÑ‹',
-'revdelete-uname' => 'кулланучы иÑеме',
-'revdelete-restricted' => 'чикләүләр идарәчеләргә дә кулланыла',
-'revdelete-hid' => ' $1 Ñшерелгән',
-'revdelete-unhid' => '$1 ачылган',
'revdelete-otherreason' => 'Башка/Ó©Ñтәмә Ñәбәп:',
'revdelete-reasonotherlist' => 'Башка Ñәбәп',
'revdelete-edit-reasonlist' => 'Сәбәпләр иÑемлеген үзгәртү',
@@ -1143,7 +1146,7 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'prefs-rc' => 'Соңгы үзгәртүләр',
'prefs-watchlist' => 'Күзәтү иÑемлеге',
'prefs-watchlist-days' => 'Күзәтү иÑемлегендә күрÑәтелгән көн Ñаны:',
-'prefs-watchlist-days-max' => '7 көннән артык түгел',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Киңәйтелгән күзәтү иÑемлегендә үзгәртүләрнең иң югары иÑәбе:',
'prefs-watchlist-edits-max' => 'МакÑимум Ñан: 1000',
'prefs-watchlist-token' => 'Күзәтү иÑемлеге токены:',
@@ -1344,7 +1347,6 @@ $3 күрÑәткән Ñәбәп: ''$2''",
'recentchangeslinked-feed' => 'Бәйләнешле үзгәртүләр',
'recentchangeslinked-toolbox' => 'Бәйләнешле үзгәртүләр',
'recentchangeslinked-title' => '"$1" битенә бәйләнешле үзгәртүләр',
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => 'КүрÑәтелгән вакытта Ñылташкан битләрнең үзгәртелмәләре юк иде.',
'recentchangeslinked-summary' => "Бу күрÑәтелгән бит белән Ñылталган (йә күрÑәтелгән төркемгә керткән) битләрнең үзгәртелмәләре иÑемлеге.
[[Special:Watchlist|Күзәтү иÑемлегегезгә]] керә торган битләр '''калын'''.",
@@ -1654,10 +1656,8 @@ PICT # төрле
'activeusers-noresult' => 'Кулланучылар табылмады.',
# Special:Log/newusers
-'newuserlogpage' => 'Кулланучыларны теркәү көндәлеге',
-'newuserlogpagetext' => 'Яңа теркәлгән кулланучылар иÑемлеге',
-'newuserlog-byemail' => 'ÑерÑүз Ñлектрон почта аша җибәрелде',
-'newuserlog-create-entry' => 'Яңа кулланучы',
+'newuserlogpage' => 'Кулланучыларны теркәү көндәлеге',
+'newuserlogpagetext' => 'Яңа теркәлгән кулланучылар иÑемлеге',
# Special:ListGroupRights
'listgrouprights' => 'Кулланучы төркемнәренең хокуклары',
@@ -1754,8 +1754,6 @@ $UNWATCHURL
'actionfailed' => 'Эш башкарылмаган',
'deletedtext' => '«$1» бетерелгән инде.<br />
Соңгы бетерелгән битләрне күрер өчен, $2 карагыз.',
-'deletedarticle' => '«[[$1]]» бетерелде',
-'suppressedarticle' => '«[[$1]]» күрÑәтелмәде',
'dellogpage' => 'Бетерү көндәлеге',
'deletionlog' => 'бетерү көндәлеге',
'deletecomment' => 'Сәбәп:',
@@ -1781,7 +1779,6 @@ $UNWATCHURL
'movedarticleprotection' => 'Ñклау көйләнмәләрен «[[$2]]» битеннән «[[$1]]» битенә күчерде',
'protect-title' => '«$1» өчен Ñклау дәрәҗәÑен билгеләү',
'prot_1movedto2' => '«[[$1]]» бите «[[$2]]» битенә күчерелде',
-'protect-backlink' => '↠$1',
'protect-legend' => 'Битне Ñклау турында раÑлагыз',
'protectcomment' => 'Сәбәп:',
'protectexpiry' => 'Бетә:',
@@ -1840,7 +1837,6 @@ $UNWATCHURL
'undeletereset' => 'Ташлату',
'undeleteinvert' => 'КиреÑен Ñайлау',
'undeletecomment' => 'Сәбәп:',
-'undeletedarticle' => '«[[$1]]» торгызылды',
'undeletedrevisions' => '{{PLURAL:$1|1 үзгәртү|$1 үзгәртү}} торгызылды',
'undelete-search-submit' => 'Эзләү',
'undelete-error-long' => 'Файлны торгызу вакытында хаталар чыкты:
@@ -1974,9 +1970,6 @@ $1',
'talkexists' => "'''Битнең үзе күчерелде, әмма Ð±Ó™Ñ…Ó™Ñ Ð±Ð¸Ñ‚Ðµ күчерелми калды, чөнки шундый иÑемле бит бар инде. Зинһар, аларны үзегез кушыгыз.'''",
'movedto' => 'күчерелгән:',
'movetalk' => 'Бәйләнешле Ð±Ó™Ñ…Ó™Ñ Ð±Ð¸Ñ‚ÐµÐ½ күчерү',
-'1movedto2' => '«[[$1]]» бите «[[$2]]» битенә күчерелде',
-'1movedto2_redir' => '«[[$1]]» бите «[[$2]]» битенә юнәлтү Ó©Ñтеннән күчте',
-'move-redirect-suppressed' => 'юнәлтү тыелды',
'movelogpage' => 'Күчерү көндәлеге',
'movereason' => 'Сәбәп:',
'revertmove' => 'кире кайту',
@@ -2127,9 +2120,6 @@ $1',
# Patrol log
'patrol-log-page' => 'Тикшерү көндәлеге',
'patrol-log-header' => 'Бу тикшерелгән битләрнең көндәлеге.',
-'patrol-log-line' => '$2 $3 битеннән $1ны тикшерде',
-'patrol-log-auto' => '(автоматик рәвештә)',
-'patrol-log-diff' => '$1 юрама',
'log-show-hide-patrol' => '$1 тикшерү көндәлеге',
# Image deletion
@@ -2151,7 +2141,7 @@ $1',
'widthheightpage' => '$1 × $2, $3{{PLURAL:$1|бит|битләр}}',
'file-info' => 'файл зурлыгы: $1, MIME-тип: $2',
'file-info-size' => '$1 × $2 нокта, файлның зурлыгы: $3, MIME тибы: $4',
-'file-nohires' => '<small>Югары ачыклык белән юрама юк.</small>',
+'file-nohires' => 'Югары ачыклык белән юрама юк.',
'svg-long-desc' => 'SVG файлы, шартлы $1 × $2 нокта, файлның зурлыгы: $3',
'show-big-image' => 'Тулы ачыклык',
@@ -2453,4 +2443,8 @@ $1',
'htmlform-reset' => 'Үзгәртүләрне кире кайтару',
'htmlform-selectorother-other' => 'Башка',
+# New logging system
+'revdelete-restricted' => 'чикләүләр идарәчеләргә дә кулланыла',
+'newuserlog-byemail' => 'ÑерÑүз Ñлектрон почта аша җибәрелде',
+
);
diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php
index 7c98eeee..0ccab2df 100644
--- a/languages/messages/MessagesTt_latn.php
+++ b/languages/messages/MessagesTt_latn.php
@@ -61,30 +61,30 @@ $dateFormats = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#YÜNÄLTÜ', '#REDIRECT' ),
- 'notoc' => array( '0', '__ETYUQ__', '__NOTOC__' ),
- 'forcetoc' => array( '0', '__ETTIQ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ET__', '__TOC__' ),
- 'noeditsection' => array( '0', '__BÜLEMTÖZÄTÜYUQ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'AÄžIMDAÄžI_AY', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonthname' => array( '1', 'AÄžIMDAÄžI_AY_Ä°SEME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'AÄžIMDAÄžI_AY_Ä°SEME_GEN', 'CURRENTMONTHNAMEGEN' ),
- 'currentday' => array( '1', 'AĞIMDAĞI_KÖN', 'CURRENTDAY' ),
- 'currentdayname' => array( '1', 'AĞIMDAĞI_KÖN_İSEME', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'AÄžIMDAÄžI_YIL', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'AÄžIMDAÄžI_WAQIT', 'CURRENTTIME' ),
- 'numberofarticles' => array( '1', 'MÄQÄLÄ_SANI', 'NUMBEROFARTICLES' ),
- 'pagename' => array( '1', 'BÄ°TÄ°SEME', 'PAGENAME' ),
- 'namespace' => array( '1', 'Ä°SEMARA', 'NAMESPACE' ),
- 'subst' => array( '0', 'TÖPÇEK:', 'SUBST:' ),
- 'img_right' => array( '1', 'uñda', 'right' ),
- 'img_left' => array( '1', 'sulda', 'left' ),
- 'img_none' => array( '1', 'yuq', 'none' ),
- 'int' => array( '0', 'EÇKE:', 'INT:' ),
- 'sitename' => array( '1', 'SÄXİFÄİSEME', 'SITENAME' ),
- 'ns' => array( '0', 'Ä°A:', 'NS:' ),
- 'localurl' => array( '0', 'URINLIURL:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'URINLIURLE:', 'LOCALURLE:' ),
+ 'redirect' => array( '0', '#YÜNÄLTÜ', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ETYUQ__', '__NOTOC__' ),
+ 'forcetoc' => array( '0', '__ETTIQ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ET__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__BÜLEMTÖZÄTÜYUQ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'AÄžIMDAÄžI_AY', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthname' => array( '1', 'AÄžIMDAÄžI_AY_Ä°SEME', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'AÄžIMDAÄžI_AY_Ä°SEME_GEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentday' => array( '1', 'AĞIMDAĞI_KÖN', 'CURRENTDAY' ),
+ 'currentdayname' => array( '1', 'AĞIMDAĞI_KÖN_İSEME', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'AÄžIMDAÄžI_YIL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'AÄžIMDAÄžI_WAQIT', 'CURRENTTIME' ),
+ 'numberofarticles' => array( '1', 'MÄQÄLÄ_SANI', 'NUMBEROFARTICLES' ),
+ 'pagename' => array( '1', 'BÄ°TÄ°SEME', 'PAGENAME' ),
+ 'namespace' => array( '1', 'Ä°SEMARA', 'NAMESPACE' ),
+ 'subst' => array( '0', 'TÖPÇEK:', 'SUBST:' ),
+ 'img_right' => array( '1', 'uñda', 'right' ),
+ 'img_left' => array( '1', 'sulda', 'left' ),
+ 'img_none' => array( '1', 'yuq', 'none' ),
+ 'int' => array( '0', 'EÇKE:', 'INT:' ),
+ 'sitename' => array( '1', 'SÄXİFÄİSEME', 'SITENAME' ),
+ 'ns' => array( '0', 'Ä°A:', 'NS:' ),
+ 'localurl' => array( '0', 'URINLIURL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'URINLIURLE:', 'LOCALURLE:' ),
);
$fallback8bitEncoding = "windows-1254";
@@ -450,14 +450,13 @@ Zinhar öçen, URLnı kürsätep, bu turıda [[Special:ListUsers/sysop|idaräçe
'cannotdelete' => '«$1» isemle bitne yäki faylnı beterep bulmıy. Anı bütän qullanuçı betergän bulırğa mömkin.',
'badtitle' => 'Yaraqsız isem',
'badtitletext' => 'Bitneñ soralğan iseme döres tügel, buş yäisä telara yäki interwiki iseme döres kürsätelmägän. İsemdä tıyılğan simvollar qullanılğan bulırğa mömkin.',
-'perfcached' => 'Bu mäğlümatlar keştan alınğan, alarda soñğı üzgärtülär bulmasqa mömkin.',
-'perfcachedts' => 'Bu mäğlümatlar keştan alınğan, ul soñğı tapqır $1 yañartıldı.',
+'perfcached' => 'Bu mäğlümatlar keştan alınğan, alarda soñğı üzgärtülär bulmasqa mömkin. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Bu mäğlümatlar keştan alınğan, ul soñğı tapqır $1 yañartıldı. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Xäzer bu bitne yañartıp bulmıy. Monda kürsätelgän mäğlümatlar qabul itelmäyäçäk.',
'wrong_wfQuery_params' => 'wfQuery() funksiä öçen yaramağan parametrlar<br />
Funksiä: $1<br />
Soraw: $2',
'viewsource' => 'Qaraw',
-'viewsourcefor' => '«$1» bite',
'actionthrottled' => 'Tizlek kimetelgän',
'actionthrottledtext' => 'Spamğa qarşı köräş öçen az waqıt eçendä bu ğämälne yış qullanu tıyılğan. Zinhar, soñaraq qabatlağız.',
'protectedpagetext' => 'Bu bit üzgärtü öçen yabıq.',
@@ -643,9 +642,6 @@ Sez $1 yäki baÅŸqa [[{{MediaWiki:Grouppage-sysop}}|idaräçegä]] tıyu buyınÃ
Sezneñ IP adresı — $3, tıyu identifikatorı — #$5.
Xatlarda bu mäğlümatnı kürsätergä onıtmağız.",
'blockednoreason' => 'säbäp kürsätelmägän',
-'blockedoriginalsource' => "Asta '''$1''' biteneñ tekstı kürsätelgän.",
-'blockededitsource' => "Asta '''$1''' biteneñ '''sez üzgärtkän''' tekstı kürsätelgän.",
-'whitelistedittitle' => 'Üzgärtü öçen üz isemegez belän kerergä kiräk',
'whitelistedittext' => 'Sez bitlärne üzgärtü öçen $1 tieş.',
'confirmedittext' => 'Bitlärne üzgärtü aldınnan sez elektron poçta adresığıznı dälillärgä tieş.
Sez monı [[Special:Preferences|köyläwlär bitendä]] başqara alasız.',
@@ -871,12 +867,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
'revdel-restore-visible' => 'kürsätelgän yuramalar',
'pagehist' => 'bitneñ tarixı',
'deletedhist' => 'Beterülär tarixı',
-'revdelete-content' => 'eçtälek',
-'revdelete-summary' => 'üzgärtülär taswirlaması',
-'revdelete-uname' => 'qullanuçı iseme',
-'revdelete-restricted' => 'çikläwlär idaräçelärgä dä qullanıla',
-'revdelete-hid' => ' $1 yäşerelgän',
-'revdelete-unhid' => '$1 açılğan',
'revdelete-reasonotherlist' => 'Başqa säbäp',
'revdelete-edit-reasonlist' => 'Säbäplär isemlegen üzgärtü',
'revdelete-offender' => 'Älege yuramalı bitneñ avtorı:',
@@ -983,7 +973,7 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'prefs-rc' => 'Soñğı üzgärtülär',
'prefs-watchlist' => 'Küzätü isemlege',
'prefs-watchlist-days' => 'Küzätü isemlegendä kürsätelgän kön sanı:',
-'prefs-watchlist-days-max' => '7 könnän artıq tügel',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Kiñäytelgän küzätü isemlegendä üzgärtülärneñ iñ yuğarı isäbe:',
'prefs-watchlist-edits-max' => 'Maksimum san: 1000',
'prefs-watchlist-token' => 'Küzätü isemlege toqenı:',
@@ -1181,7 +1171,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-backlink' => '↠$1',
'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'''.",
@@ -1485,10 +1474,8 @@ Asta [[Special:UnusedCategories|qullanılmağan törkemnär]] kärsätelgän.
'activeusers-noresult' => 'Qullanuçılar tabılmadı.',
# Special:Log/newusers
-'newuserlogpage' => 'Qullanuçılarnı terkäw köndälege',
-'newuserlogpagetext' => 'Yaña terkälgän qullanuçılar isemlege',
-'newuserlog-byemail' => 'sersüz elektron poçta aşa cibärelde',
-'newuserlog-create-entry' => 'Yaña qullanuçı',
+'newuserlogpage' => 'Qullanuçılarnı terkäw köndälege',
+'newuserlogpagetext' => 'Yaña terkälgän qullanuçılar isemlege',
# Special:ListGroupRights
'listgrouprights' => 'Qullanuçı törkemnäreneñ xoquqları',
@@ -1579,7 +1566,6 @@ Zinhar, monı çınnan da eşlärgä telägänegezne, monıñ näticälären añ
'actioncomplete' => 'Ğämäl başqarğan',
'deletedtext' => '«$1» beterelgän inde.<br />
Soñğı beterelgän bitlärne kürer öçen, $2 qarağız.',
-'deletedarticle' => '«[[$1]]» beterelde',
'dellogpage' => 'Beterü köndälege',
'deletionlog' => 'beterü köndälege',
'reverted' => 'Aldağı yuramanı qaytart',
@@ -1606,7 +1592,6 @@ Soñğı beterelgän bitlärne kürer öçen, $2 qarağız.',
'movedarticleprotection' => 'yaqlaw köylänmälären «[[$2]]» bitennän «[[$1]]» bitenä küçerde',
'protect-title' => '«$1» öçen yaqlaw däräcäsen bilgeläw',
'prot_1movedto2' => '«[[$1]]» bite «[[$2]]» bitenä küçerelde',
-'protect-backlink' => '↠$1',
'protect-legend' => 'Bitne yaqlaw turında raslağız',
'protectcomment' => 'Säbäp:',
'protectexpiry' => 'Betä:',
@@ -1659,7 +1644,6 @@ Beterelüdän soñ şundıy uq isemle bit tözelgän bulsa, torğızılğan üzg
'undeletereset' => 'TaÅŸlatu',
'undeleteinvert' => 'Kiresen saylaw',
'undeletecomment' => 'Säbäp:',
-'undeletedarticle' => '«[[$1]]» torğızıldı',
'undelete-search-submit' => 'Ezläw',
'undelete-error-long' => 'Faylnı torğızu waqıtında xatalar çıqtı:
@@ -1798,9 +1782,6 @@ Zinhar başqa isem saylağız.',
'talkexists' => "'''Bitneñ üze küçerelde, ämma bäxäs bite küçerelmi qaldı, çönki şundıy isemle bit bar inde. Zinhar, alarnı üzegez quşığız.'''",
'movedto' => 'küçerelgän:',
'movetalk' => 'Bäyläneşle bäxäs biten küçerü',
-'1movedto2' => '«[[$1]]» bite «[[$2]]» bitenä küçerelde',
-'1movedto2_redir' => '[[$1]] bite [[$2]] bitenä yünältü östennän küçte',
-'move-redirect-suppressed' => 'yünältü tıyıldı',
'movelogpage' => 'Küçerü köndälege',
'movereason' => 'Säbäp:',
'revertmove' => 'kire qaytu',
@@ -1944,9 +1925,6 @@ Zinhar başqa isem saylağız.',
# Patrol log
'patrol-log-page' => 'Tikşerü köndälege',
'patrol-log-header' => 'Bu tikşerelgän bitlärneñ köndälege.',
-'patrol-log-line' => '$2 $3 bitennän $1nı tikşerde',
-'patrol-log-auto' => '(avtomatik räweştä)',
-'patrol-log-diff' => '$1 yurama',
'log-show-hide-patrol' => '$1 tikşerü köndälege',
# Image deletion
@@ -1968,7 +1946,7 @@ $1',
'widthheightpage' => '$1 × $2, $3{{PLURAL:$1|bit|bitlär}}',
'file-info' => 'fayl zurlığı: $1, MIME-tip: $2',
'file-info-size' => '$1 × $2 noqta, faylnıñ zurlığı: $3, MIME tibı: $4',
-'file-nohires' => '<small>Yuğarı açıqlıq belän yurama yuq.</small>',
+'file-nohires' => 'Yuğarı açıqlıq belän yurama yuq.',
'svg-long-desc' => 'SVG faylı, şartlı $1 × $2 noqta, faylnıñ zurlığı: $3',
'show-big-image' => 'Tulı açıqlıq',
@@ -2220,4 +2198,8 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
'htmlform-reset' => 'Üzgärtülärne kire qaytaru',
'htmlform-selectorother-other' => 'BaÅŸqa',
+# New logging system
+'revdelete-restricted' => 'çikläwlär idaräçelärgä dä qullanıla',
+'newuserlog-byemail' => 'sersüz elektron poçta aşa cibärelde',
+
);
diff --git a/languages/messages/MessagesTy.php b/languages/messages/MessagesTy.php
index d200ac8c..9854cb81 100644
--- a/languages/messages/MessagesTy.php
+++ b/languages/messages/MessagesTy.php
@@ -8,6 +8,8 @@
* @file
*
* @author Sab
+ * @author Sainte-Rose (on ty.wikipedia.org)
+ * @author Tahitoa (on ty.wikipedia.org)
*/
$fallback = 'fr';
@@ -145,9 +147,6 @@ $messages = array(
# Special:Categories
'categories' => 'Te mau huru o te ’api',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Ta’ata fa’a’ohipa ’ÄpÄ«',
-
# Watchlist
'watch' => 'Ha’apa’o',
@@ -161,9 +160,6 @@ $messages = array(
# What links here
'whatlinkshere' => 'Te mau ’api i tū’atihia mai',
-# Move page
-'1movedto2' => '’Ua tÄhitihia te ’api [[$1]] e ana i te ’api ’ÄpÄ« [[$2]]',
-
# Tooltip help for the actions
'tooltip-search' => 'RoromÄ’imi {{SITENAME}}',
diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php
index 99422898..16f84289 100644
--- a/languages/messages/MessagesTyv.php
+++ b/languages/messages/MessagesTyv.php
@@ -661,9 +661,7 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
'activeusers-hidesysops' => 'Эргелекчыларны чажырары',
# Special:Log/newusers
-'newuserlogpage' => 'Чаа ажыглакчы кырында журнал',
-'newuserlog-create-entry' => 'Чаа бүрүткел бижик',
-'newuserlog-create2-entry' => '$1 деп чаа бүрүткел бижикти бүдүрген',
+'newuserlogpage' => 'Чаа ажыглакчы кырында журнал',
# Special:ListGroupRights
'listgrouprights-members' => '(кежигүннүң даңзызы)',
@@ -701,7 +699,6 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
'delete-confirm' => '"$1" деп арынны ырадыры',
'delete-legend' => 'Ырадыры',
'actioncomplete' => 'Ðжыл дооÑту',
-'deletedarticle' => '"[[$1]]" деп арынны ап каан',
'deletecomment' => 'Чылдагаан:',
'deleteotherreason' => 'Ó¨Ñке/немелде чылдагаан:',
'deletereasonotherlist' => 'Ó¨Ñке чылдагаан',
@@ -729,7 +726,6 @@ The password for this new account can be changed on the ''[[Special:ChangePasswo
'undeletelink' => 'көөрү/диргиÑири',
'undeleteviewlink' => 'көөрү',
'undeletecomment' => 'Чылдагаан:',
-'undeletedarticle' => '"[[$1]]" диргиÑкен',
'undelete-search-submit' => 'ДилÑÑÑ€',
# Namespace form on various pages
diff --git a/languages/messages/MessagesUdm.php b/languages/messages/MessagesUdm.php
index 95f6cbbd..b9793553 100644
--- a/languages/messages/MessagesUdm.php
+++ b/languages/messages/MessagesUdm.php
@@ -35,6 +35,9 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑ_ÑÑрыÑÑŒ_вераÑькон',
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$linkTrail = '/^([a-zа-ÑÑ‘Óӟӥӧӵ“»]+)(.*)$/sDu';
$fallback8bitEncoding = 'windows-1251';
$separatorTransformTable = array( ',' => ' ', '.' => ',' );
diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php
index c0485c72..79d169c6 100644
--- a/languages/messages/MessagesUg_arab.php
+++ b/languages/messages/MessagesUg_arab.php
@@ -401,8 +401,8 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
'badtitle' => 'خاتا ماۋزۇ',
'badtitletext' => 'ئىلتىماس قىلىنغان بەتنىڭ ماۋزۇسى ئىناۋەتسىز، مەۋجۇد ئەمەس، تىل ھالقىغان ياكى wiki ئۇلانمىسىدىن ھالقىغان ماۋزۇ خاتالىقى.
ئۇ بىر ياكى بىر قانچە ماۋزۇغا ئىشلەتكىلى بولمايدىغان ھەرپنى ئۆز ئىچىگە ئالغان.',
-'perfcached' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، شۇڭلاشقا ÙŠÛÚ­Ù‰ بولماسلىقى مۇمكىن.',
-'perfcachedts' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، ئاخىرقى ÙŠÛڭىلانغان ۋاقتى $1.',
+'perfcached' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، شۇڭلاشقا ÙŠÛÚ­Ù‰ بولماسلىقى مۇمكىن. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'تۆۋەندىكىسى غەملەك سانلىق مەلۇماتى، ئاخىرقى ÙŠÛڭىلانغان ۋاقتى $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'نۆۋەتتە مەزكۇر بەتنى ÙŠÛڭىلاش چەكلەندى.
بۇ جايدىكى سانلىق مەلۇماتنى دەرھال ÙŠÛڭىلىغىلى بولمايدۇ.',
@@ -412,7 +412,6 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
سۈرۈشتۈرۈش: $2',
'viewsource' => 'مەنبەنى كۆرسەت',
-'viewsourcefor' => '$1 نىڭ مەنبە كودى',
'actionthrottled' => 'مەشغۇلات چەكلەندى',
'actionthrottledtext' => 'ئەخلەتكە قارشى تۇرۇش ئۆلچىمىگە ئاساسەن، سىز بۇ بىر بۆلۈك قىسقا ۋاقىتتا بۇ مەشغۇلاتنى ئÛلىپ بÛرىشىڭىزنى چەكلىدى، ئەمما سىز بۇ چەكتىن ئÛشىپ كەتتىڭىز.
@@ -557,6 +556,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => 'PHP نىڭmail() Ùونكسىيەسىدىكى يوچۇن خاتالىق',
+'user-mail-no-addy' => 'ئÛلخەت ئادرÛسسىز خەت يوللاشنى سىنىدى.',
# Change password dialog
'resetpass' => 'ئىم ئۆزگەرت',
@@ -604,6 +604,17 @@ $2
ۋاقىتلىق ئىم: $2',
'passwordreset-emailsent' => 'ئەسكەرتىش ئÛلخەت ئەۋەتىلدى.',
+# Special:ChangeEmail
+'changeemail' => 'ئÛلخەت ئادرÛس ئۆزگەرت',
+'changeemail-header' => 'Ú¾Ûساباتنىڭ ئÛلخەت ئادرÛسىنى ئۆزگەرت',
+'changeemail-text' => 'بۇ جەدۋەل تاماملانسا ئÛلخەت ئادرÛسىڭىزنى ئۆزگەرتىدۇ. سىز ئىم كىرگۈزۈپ بۇ ئۆزگەرتىشنى جەزملەيسىز.',
+'changeemail-no-info' => 'تىزىمغا كىرسىڭىز ئاندىن بۇ بەتنى بىۋاستە زىيارەت قىلالايسىز.',
+'changeemail-oldemail' => 'نۆۋەتتىكى ئÛلخەت ئادرÛسى:',
+'changeemail-newemail' => 'ÙŠÛÚ­Ù‰ ئÛلخەت ئادرÛسى:',
+'changeemail-none' => '(يوق)',
+'changeemail-submit' => 'ئÛلخەت ئۆزگەرت',
+'changeemail-cancel' => 'ۋاز كەچ',
+
# Edit page toolbar
'bold_sample' => 'توم خەت',
'bold_tip' => 'توم خەت',
@@ -670,9 +681,6 @@ $2
سىزنىڭ نۆۋەتتىكى IP ئادرÛسىڭىز $3ØŒ چەكلەنگەن كىملىك #$5.
سوئالىڭىزدا يۇقىرىقى بارلىق ماتÛرىياللارنى ئىزاھلاڭ.",
'blockednoreason' => 'سەۋەبى يوق',
-'blockedoriginalsource' => "تۆۋەندىكىسى '''$1''' نىڭ ئەسلى كودى:",
-'blockededitsource' => "سىزنىڭ '''$1''' غا ئÛلىپ بارغان '''تەھرىرىڭىز'''نىڭ تÛكستى تۆۋەندىكىچە:",
-'whitelistedittitle' => 'تىزىمغا كىرگەندىن ÙƒÛيىن تەھرىرلىگىلى بولىدۇ',
'whitelistedittext' => 'سىزدە $1 بولغاندا ئاندىن بەتنى تەھرىرلىيەلەيسىز.',
'confirmedittext' => 'سىز بۇ بەتنى تەھرىرلەشتىن ئىلگىرى ئÛلخەت ئادرÛسىڭىزنى جەزملەڭ.
[[Special:Preferences|ئىشلەتكۈچى مايىللىق]] ئارقىلىق تەڭشەپ ئÛلخەت ئادرÛسىڭىزنى دەلىللەڭ.',
@@ -932,8 +940,6 @@ $3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
'revdelete-unsuppress' => 'ئەسلىگە كەلتۈرۈلگەن تۈزىتىلگەن نەشرىدىن چەكلىمىنى چىقىرىۋەت',
'revdelete-log' => 'سەۋەب:',
'revdelete-submit' => 'تاللانغان {{PLURAL:$1|تۈزىتىش|تۈرىتىش}}نى قوللان',
-'revdelete-logentry' => '[[$1]] نىڭ تۈزىتىش نەشرىنىڭ كۆرۈنۈشچانلىقى ئۆزگەرتىلدى',
-'logdelete-logentry' => '[[$1]] نىڭ ھادىسە كۆرۈنۈشچانلىقى ئۆزگەرتىلدى',
'revdelete-success' => "'''تۈزىتىلگەن نەشرىنىڭ كۆرۈنۈشچانلىقى مۇۋەپپەقىيەتلىك تەڭشەلدى.'''",
'revdelete-failure' => "'''تۈزىتىشنىڭ كۆرۈنۈشچانلىقىنى ÙŠÛڭىلىيالمىدى:'''
$1",
@@ -945,15 +951,6 @@ $1",
'revdel-restore-visible' => 'كۆرۈنىدىغان تۈزىتىلگەن نەشرى',
'pagehist' => 'بەتنىڭ تارىخى',
'deletedhist' => 'ئۆچۈرۈلگەن تارىخ',
-'revdelete-content' => 'مەزمۇن',
-'revdelete-summary' => 'ئۈزۈندە تەھرىرلە',
-'revdelete-uname' => 'ئىشلەتكۈچى ئاتى',
-'revdelete-restricted' => 'باشقۇرغۇچى چەكلىمىسىنى قوللان',
-'revdelete-unrestricted' => 'باشقۇرغۇچىنىڭ چەكلىمىسى چىقىرىۋÛتىلدى',
-'revdelete-hid' => '$1 يوشۇر',
-'revdelete-unhid' => '$1 يوشۇرما',
-'revdelete-log-message' => '$1 نىڭ {{PLURAL:$2|Ù‚Ûتىملىق|Ù‚Ûتىملىق}} تۈزىتىلگەن نەشرى',
-'logdelete-log-message' => '$1 نىڭ $2 {{PLURAL:$2|ھادىسىسى|ھادىسىسى}}',
'revdelete-hide-current' => '$2 $1 ۋاقىتتىكى تۈرلەر خاتالىقىنى يوشۇرۇۋاتىدۇ: بۇ نۆۋەتتىكى تۈزىتىلگەن نەشرى.
ئۇنى يوشۇرغىلى بولمايدۇ.',
'revdelete-show-no-access' => '$2 $1 تۈر خاتالىقىنى كۆرسىتىۋاتىدۇ: بۇ تۈر "چەكلەنگەن" بەلگىسى قويۇلغان، ئۇنى زىيارەت قىلىش ھوقۇقىڭىز يوق.',
@@ -1110,12 +1107,14 @@ $1",
'prefs-rc' => 'ئاخىرقى ئۆزگەرتىشلەر',
'prefs-watchlist' => 'كۆزەت تىزىملىكى',
'prefs-watchlist-days' => 'كۆزەت تىزىملىكىدە كۆرۈنىدىغان كۈن سانى:',
-'prefs-watchlist-days-max' => 'ئەڭ كۆپ بولغاندا 7 كۈن',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'كۈچەيتىلگەن كۆزەت تىزىملىكىدە ئەڭ كۆپ ئۆزگەرتىش سانى:',
'prefs-watchlist-edits-max' => 'ئەڭ كۆپ سانى: 1000',
'prefs-watchlist-token' => 'كۆزەت تىزىملىك نىشانى:',
'prefs-misc' => 'ئارىلاشما تۈر',
'prefs-resetpass' => 'ئىم ئۆزگەرت',
+'prefs-changeemail' => 'ئÛلخەت ئۆزگەرت',
+'prefs-setemail' => 'ئÛلخەت ئادرÛس تەڭشەك',
'prefs-email' => 'ئÛلخەت تاللانما',
'prefs-rendering' => 'كۆرۈنۈش',
'saveprefs' => 'ساقلا',
@@ -1220,7 +1219,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'userrights-lookup-user' => 'ئىشلەتكۈچى گۇرۇپپىسى باشقۇرۇش',
'userrights-user-editname' => 'ئىشلەتكۈچى ئاتى كىرگۈزۈڭ:',
'editusergroup' => 'ئىشلەتكۈچى گۇرۇپپىسى تەھرىر',
-'editinguser' => "'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) ئىشلەتكۈچىنىڭ ھوقۇقىنى ئۆزگەرتىۋاتىدۇ",
+'editinguser' => "ئىشلەتكۈچى '''[[User:$1|$1]]''' $2 نىڭ ھوقۇقىنى ئۆزگەرتىۋاتىدۇ",
'userrights-editusergroup' => 'ئىشلەتكۈچى گۇرۇپپىسى تەھرىر',
'saveusergroups' => 'ئىشلەتكۈچى گۇرۇپپىسى ساقلا',
'userrights-groupsmember' => 'ئەزاسى:',
@@ -1314,7 +1313,6 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'right-autopatrol' => 'ئۆزەم تەھرىرلىگەنگە ئاپتوماتىك چارلاش بەلگىسى قوي',
'right-patrolmarks' => 'ÙŠÛقىنقى نازارەت بەلگىسىنىڭ ئۆزگۈرۈشىنى كۆرسەت',
'right-unwatchedpages' => 'كۆزىتىلمىگەن بەت تىزىملىكىنى كۆرسەت',
-'right-trackback' => 'trackback تاپشۇر',
'right-mergehistory' => 'بەت تارىخىنى بىرلەشتۈر',
'right-userrights' => 'ھەممە ئىشلەتكۈچىنىڭ ھوقۇقىنى تەھرىرلە',
'right-userrights-interwiki' => 'باشقا wiki دىكى ئىشلەتكۈچى ھوقۇقىنى تەھرىرلە',
@@ -1359,7 +1357,6 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'action-patrol' => 'باشقا تەھرىرگە چارلاش بەلگىسى قوي',
'action-autopatrol' => 'ئۆزەمنىڭ تەھرىرىگە چارلاش بەلگىسى قوي',
'action-unwatchedpages' => 'كۆزىتىلمىگەن بەت تىزىملىكىنى كۆرسەت',
-'action-trackback' => 'trackback تاپشۇر',
'action-mergehistory' => 'بۇ بەتنىڭ تارىخىنى بىرلەشتۈر',
'action-userrights' => 'ھەممە ئىشلەتكۈچىنىڭ ھوقۇقىنى تەھرىرلە',
'action-userrights-interwiki' => 'باشقا wiki دىكى ئىشلەتكۈچى ھوقۇقىنى تەھرىرلە',
@@ -1904,12 +1901,8 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'activeusers-noresult' => 'ئىشلەتكۈچى تÛپىلمىدى.',
# Special:Log/newusers
-'newuserlogpage' => 'ئىشلەتكۈچى قۇرغان خاتىرە',
-'newuserlogpagetext' => '(چەكلەنگەن)',
-'newuserlog-byemail' => 'ئىم ئىلخەتتە يوللاندى',
-'newuserlog-create-entry' => 'ÙŠÛÚ­Ù‰ ئىشلەتكۈچى Ú¾Ûساباتى',
-'newuserlog-create2-entry' => '$1 ÙŠÛÚ­Ù‰ Ú¾Ûسابات قۇرۇلدى',
-'newuserlog-autocreate-entry' => 'ئۆزلۈكىدىن قۇرۇلغان Ú¾Ûسابات',
+'newuserlogpage' => 'ئىشلەتكۈچى قۇرغان خاتىرە',
+'newuserlogpagetext' => '(چەكلەنگەن)',
# Special:ListGroupRights
'listgrouprights' => 'ئىشلەتكۈچى گۇرۇپپا ھوقۇقى',
@@ -1938,7 +1931,7 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'emailpagetext' => 'سىز تۆۋەندىكى جەدۋەلنى ئىشلىتىپ، بۇ ئىشلەتكۈچىگە ئÛلخەت يوللىيالايسىز.
[[Special:Preferences|ئىشلەتكۈچى مايىللىقىڭىز]]دىكى ئÛلخەت ئادرÛسى "يوللىغۇچى" ستونىدا كۆرۈنىدۇ، مۇشۇنداق بولغاندا Ø´Û‡ ئىشلەتكۈچى سىزگە بىۋاسىتە جاۋاب قايتۇرالايدۇ.',
'usermailererror' => 'Mail ئوبيÛكتى خاتالىق قايتۇردى:',
-'defemailsubject' => '{{SITENAME}} ئÛلخەت',
+'defemailsubject' => '{{SITENAME}}بÛكەتتىكى "$1" ئىشلەتكۈچىنىڭ ئÛلخەت',
'usermaildisabled' => 'ئىشلەتكۈچى ئÛلخەت چەكلەنگەن',
'usermaildisabledtext' => 'سىز بۇ wiki دىكى باشقا ئىشلەتكۈچىگە ئÛلخەت يوللىيالمايسىز.',
'noemailtitle' => 'ئÛلخەت ئادرÛس يوق',
@@ -2056,8 +2049,6 @@ $UNWATCHURL نى زىيارەت قىلىڭ
'actionfailed' => 'مەشغۇلات مەغلۇپ بولدى',
'deletedtext' => '"$1" ئۆچۈرۈلدى.
ÙŠÛقىندا ئۆچۈرۈلگەن خاتىرىنى $2 دىن كۆرۈڭ.',
-'deletedarticle' => '"[[$1]]"ئۆچۈرۈلگەن',
-'suppressedarticle' => 'بىكار قىلىندى "[[$1]]"',
'dellogpage' => 'ئۆچۈرۈش خاتىرىسى',
'dellogpagetext' => 'تۆۋەندىكىسى ÙŠÛقىندا ئۆچۈرۈلگەن خاتىرە تىزىملىكى.',
'deletionlog' => 'ئۆچۈرۈش خاتىرىسى',
@@ -2129,6 +2120,7 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىلØ
'protect-level-sysop' => 'باشقۇرغۇچىلا',
'protect-summary-cascade' => 'زەنجىرسىمان قۇلۇپ',
'protect-expiring' => ' $1 (UTC) توختىتىلغان',
+'protect-expiring-local' => '$1 ۋاقتى توشىدۇ',
'protect-expiry-indefinite' => 'قەرەلسىز',
'protect-cascade' => 'بۇ بەت ئۆز ئىچىگە ئالغان بەتنى قوغدا (زەنجىرسىمان قۇلۇپتا قوغدالغان).',
'protect-cantedit' => 'سىز بۇ بەتنىڭ قوغداش دەرىجىسىنى ئۆزگەرتەلمەيسىز، چۈنكى ئۇنى تەھرىرلەش ھوقۇقىڭىز يوق.',
@@ -2189,7 +2181,6 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىلØ
'undeletereset' => 'ئەسلىگە قايتۇر',
'undeleteinvert' => 'ئەكسىچە تاللا',
'undeletecomment' => 'سەۋەب:',
-'undeletedarticle' => '"[[$1]]" ئەسلىگە كەلتۈرۈلدى',
'undeletedrevisions' => '{{PLURAL:$1|1 تۈزىتىش|$1 تۈزىتىش}} ئەسلىگە كەلتۈرۈلدى',
'undeletedrevisions-files' => '{{PLURAL:$1|1 تۈزىتىش|$1 تۈزىتىش}} ۋە {{PLURAL:$2|1 ھۆججەت|$2 ھۆججەت}} ئەسلىگە كەلتۈرۈلدى',
'undeletedfiles' => '{{PLURAL:$1|1 ھۆججەت|$1 ھۆججەت}} ئەسلىگە كەلتۈرۈلدى',
@@ -2329,6 +2320,7 @@ $1',
'blocklist-userblocks' => 'Ú¾Ûسابات چەكلەشنى يوشۇر',
'blocklist-tempblocks' => 'ۋاقىتلىق چەكلەشنى يوشۇر',
'blocklist-addressblocks' => 'يەككە IP چەكلەشنى يوشۇر',
+'blocklist-rangeblocks' => 'دائىرە چەكلىمىسىنى يوشۇر',
'blocklist-timestamp' => 'ۋاقىت تامغاسى',
'blocklist-target' => 'نىشان',
'blocklist-expiry' => 'ۋاقتى ئۆتتى',
@@ -2351,6 +2343,7 @@ $1',
'unblocklink' => 'چەكلەشنى توختات',
'change-blocklink' => 'ئۆزگەرتىش چەكلەنگەن',
'contribslink' => 'تۆھپىكارلار',
+'emaillink' => 'ئÛلخەت يوللا',
'autoblocker' => 'سىز "[[User:$1|$1]]" بىلەن بىر IP ئادرÛسنى ئورتاق ئىشلەتكەچكە ئۆزلۈكىدىن چەكلىدى.
$1 نىڭ چەكلەنگەنلىك سەۋەبى: "$2"',
'blocklogpage' => 'چەكلەنگەن خاتىرە',
@@ -2486,9 +2479,6 @@ $1',
'movepage-page-moved' => '$1 بەت $2 گە يۆتكەلدى.',
'movepage-page-unmoved' => '$1 بەتنى $2 گە يۆتكىيەلمىدى.',
'movepage-max-pages' => ' $1 {{PLURAL:$1|بەت|بەت}} يۆتكەش سانى ئەڭ يۇقىرى چەككە يەتتى، بىرلا ۋاقىتتا تÛخىمۇ ÙƒÛ†Ù¾ بەتنى ئۆزلۈكىدىن يۆتكىيەلمەيدۇ.',
-'1movedto2' => '[[$1]] دىن [[$2]] غا يۆتكەلدى',
-'1movedto2_redir' => 'قايتا نىشان بەلگىلەپ [[$1]] دىن [[$2]] غا يۆتكەلدى',
-'move-redirect-suppressed' => 'قايتا نىشانلاش تىزگىنلەندى',
'movelogpage' => 'خاتىرىنى يۆتكە',
'movelogpagetext' => 'تۆۋەندىكىسى يۆتكەلگەن ھەممە بەتلەرنىڭ تىزىملىكى.',
'movesubpage' => '{{PLURAL:$1|تارماق بەت|تارماق بەت}}',
@@ -2613,6 +2603,8 @@ $1',
'import-token-mismatch' => 'جەريان سانلىق مەلۇماتى يوقالدى.
قايتا سىناڭ.',
'import-invalid-interwiki' => 'بەلگىلەنگەن wiki دىن ئەكىرەلمىدى.',
+'import-error-edit' => '"$1" نى ئەكىرمىدى چۈنكى سىز ئۇنى تەھرىرلەشكە يول قويمىغان.',
+'import-error-create' => '"$1" نى ئەكىرمىدى چۈنكى سىز ئۇنى قۇرۇشقا يول قويمىغان.',
# Import log
'importlogpage' => 'ئەكىرىش خاتىرىسى',
@@ -2743,9 +2735,6 @@ $1',
# Patrol log
'patrol-log-page' => 'چارلاش خاتىرىسى',
'patrol-log-header' => 'بۇ چارلانغان تۈزىتىلگەن نەشرى.',
-'patrol-log-line' => '$2 نىڭ نەشرى $1 غا چارلاش بەلگىسى قويۇلغان $3',
-'patrol-log-auto' => '(ئاپتوماتىك)',
-'patrol-log-diff' => 'تۈزىتىش $1',
'log-show-hide-patrol' => '$1 چارلاش خاتىرىسى',
# Image deletion
@@ -2764,22 +2753,24 @@ $1',
'nextdiff' => 'ÙŠÛÚ­Ù‰ نەشرى →',
# Media information
-'mediawarning' => "'''ئاگاھلاندۇرۇش''': بۇ ھۆججەتتە زەھەرخەندە كود بولۇشى مۇمكىن، ئۇنى ئىجرا قىلسىڭىز سىستÛمىڭىزغا خەۋپ ئÛلىپ ÙƒÛلىشى مۇمكىن.",
-'imagemaxsize' => "سۈرەت Ú†ÙˆÚ­Ù„Û‡Ù‚ چەكلىمىسى: <br />''(ھۆججەت چۈشەندۈرۈش بÛتى ئۈچۈن)''",
-'thumbsize' => 'كىچىك سۈرەت چوڭلۇقى:',
-'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|بەت|بەت}}',
-'file-info' => 'ھۆججەت چوڭلۇقى: $1, MIME تىپى: $2',
-'file-info-size' => '$1 × $2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3ØŒ MIME تىپى: $4',
-'file-info-size-pages' => '$1 × $2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3, MIME تىپى: $4, $5 {{PLURAL:$5|بەت|بەت}}',
-'file-nohires' => '<small>يۇقىرىراق پەرق ئÛتىش نىسبىتى يوق.</small>',
-'svg-long-desc' => 'SVG ھۆججىتى، ئاتاقتىكى چوڭلۇقى $1 × $2 نۇقتا، ھۆججەت چوڭلۇقى: $3',
-'show-big-image' => 'تولۇق ئÛنىقلىق دەرىجىسى',
-'show-big-image-size' => '$1 × $2 پىكسÛÙ„',
-'file-info-gif-looped' => 'دەۋرىيلەنگەن',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|كاندۇك|كاندۇك}}',
-'file-info-png-looped' => 'دەۋرىيلەنگەن',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|Ù‚Ûتىم|Ù‚Ûتىم}} قويۇلدى',
-'file-info-png-frames' => '$1 {{PLURAL:$1|كاندۇك|كاندۇك}}',
+'mediawarning' => "'''ئاگاھلاندۇرۇش''': بۇ ھۆججەتتە زەھەرخەندە كود بولۇشى مۇمكىن، ئۇنى ئىجرا قىلسىڭىز سىستÛمىڭىزغا خەۋپ ئÛلىپ ÙƒÛلىشى مۇمكىن.",
+'imagemaxsize' => "سۈرەت Ú†ÙˆÚ­Ù„Û‡Ù‚ چەكلىمىسى: <br />''(ھۆججەت چۈشەندۈرۈش بÛتى ئۈچۈن)''",
+'thumbsize' => 'كىچىك سۈرەت چوڭلۇقى:',
+'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|بەت|بەت}}',
+'file-info' => 'ھۆججەت چوڭلۇقى: $1, MIME تىپى: $2',
+'file-info-size' => '$1 × $2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3ØŒ MIME تىپى: $4',
+'file-info-size-pages' => '$1 × $2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3, MIME تىپى: $4, $5 {{PLURAL:$5|بەت|بەت}}',
+'file-nohires' => 'يۇقىرىراق پەرق ئÛتىش نىسبىتى يوق.',
+'svg-long-desc' => 'SVG ھۆججىتى، ئاتاقتىكى چوڭلۇقى $1 × $2 نۇقتا، ھۆججەت چوڭلۇقى: $3',
+'show-big-image' => 'تولۇق ئÛنىقلىق دەرىجىسى',
+'show-big-image-preview' => 'بۇ ئالدىن كۆزىتىشنىڭ چوڭلۇقى: $1.',
+'show-big-image-other' => 'باشقا چوڭلۇقى: $1.',
+'show-big-image-size' => '$1 × $2 پىكسÛÙ„',
+'file-info-gif-looped' => 'دەۋرىيلەنگەن',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|كاندۇك|كاندۇك}}',
+'file-info-png-looped' => 'دەۋرىيلەنگەن',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|Ù‚Ûتىم|Ù‚Ûتىم}} قويۇلدى',
+'file-info-png-frames' => '$1 {{PLURAL:$1|كاندۇك|كاندۇك}}',
# Special:NewFiles
'newimages' => 'ÙŠÛÚ­Ù‰ ھۆججەت كارىدورى',
@@ -3291,13 +3282,6 @@ $5
'scarytranscludefailed' => '[$1 نىڭ Ù‚Ûلىپىنى ئÛلىش مەغلۇپ بولدى]',
'scarytranscludetoolong' => '[URL بەك ئۇزۇن]',
-# Trackbacks
-'trackbackbox' => 'بۇ بەتنىڭ نەقىلى: <br />
-$1',
-'trackbackremove' => '([$1 ئۆچۈر])',
-'trackbacklink' => 'نەقىل',
-'trackbackdeleteok' => 'بۇ نەقىل مۇۋەپپەقىيەتلىك ئۆچۈرۈلدى.',
-
# Delete conflict
'deletedwhileediting' => "'''ئاگاھلاندۇرۇش''': بۇ بەت تەھرىرلەشكە باشلىغاندىن ÙƒÛيىن ئۆچۈرۈلگەن!",
'confirmrecreate' => "سىز بۇ بەتنى تەھرىرلىگەندىن ÙƒÛيىن ئىشلەتكۈچى [[User:$1|$1]] ([[User talk:$1|مۇنازىرە]]) تۆۋەندىكى سەۋەب تۈپەيلىدىن بۇ بەت ئۆچۈرۈلدى:
@@ -3477,13 +3461,16 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئÛلان Ù
'tags-hitcount' => '$1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
# Special:ComparePages
-'comparepages' => 'بەت سÛلىشتۇر',
-'compare-selector' => 'بەتنىڭ تۈزىتىلگەن نەشرىنى سÛلىشتۇر',
-'compare-page1' => '1- بەت',
-'compare-page2' => '2- بەت',
-'compare-rev1' => 'تۈزىتىلگەن نەشرى 1',
-'compare-rev2' => 'تۈزىتىلگەن نەشرى 2',
-'compare-submit' => 'سÛلىشتۇر',
+'comparepages' => 'بەت سÛلىشتۇر',
+'compare-selector' => 'بەتنىڭ تۈزىتىلگەن نەشرىنى سÛلىشتۇر',
+'compare-page1' => '1- بەت',
+'compare-page2' => '2- بەت',
+'compare-rev1' => 'تۈزىتىلگەن نەشرى 1',
+'compare-rev2' => 'تۈزىتىلگەن نەشرى 2',
+'compare-submit' => 'سÛلىشتۇر',
+'compare-invalid-title' => 'سىز بەلگىلىگەن تÛما ئىناۋەتسىز.',
+'compare-title-not-exists' => 'سىز بەلگىلىگەن تÛما مەۋجۇت ئەمەس.',
+'compare-revision-not-exists' => 'سىز بەلگىلىگەن تۈزىتىلگەن نەشرى مەۋجۇت ئەمەس.',
# Database error messages
'dberr-header' => 'بۇ wiki مەسىلىگە يولۇقتى',
@@ -3511,4 +3498,13 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئÛلان Ù
'sqlite-has-fts' => '$1 پۈتۈن تÛكست ئىزدەشنى قوللايدۇ',
'sqlite-no-fts' => '$1 پۈتۈن تÛكست ئىزدەشنى قوللىمايدۇ',
+# New logging system
+'revdelete-restricted' => 'باشقۇرغۇچى چەكلىمىسىنى قوللان',
+'revdelete-unrestricted' => 'باشقۇرغۇچىنىڭ چەكلىمىسى چىقىرىۋÛتىلدى',
+'logentry-move-move' => '$1 نى $3 بەتتىن $4 غا يۆتكىدى',
+'logentry-move-move-noredirect' => 'قايتا نىشانلاشنى قالدۇرمايلا $1 نى $3 بەتتىن $4 غا يۆتكىدى',
+'logentry-move-move_redir' => 'قايتا نىشانلاپ $1 نى $3 بەتتىن $4 غا يۆتكىدى',
+'logentry-move-move_redir-noredirect' => 'قايتا نىشانلاش ئارقىلىق $1 نى $3 بەتتىن $4 غا يۆتكىدى قايتا نىشانلاشنى قالدۇرمىدى',
+'newuserlog-byemail' => 'ئىم ئىلخەتتە يوللاندى',
+
);
diff --git a/languages/messages/MessagesUg_latn.php b/languages/messages/MessagesUg_latn.php
index a0927427..2be90f15 100644
--- a/languages/messages/MessagesUg_latn.php
+++ b/languages/messages/MessagesUg_latn.php
@@ -12,8 +12,6 @@
* @author לערי ריינה×רט
*/
-$rtl = true;
-
$messages = array(
# Dates
'sunday' => 'Yekshenbe',
@@ -216,9 +214,6 @@ $messages = array(
# Special:NewFiles
'ilsubmit' => 'Izdash',
-# Trackbacks
-'trackbackremove' => '([$1 Yukhutush])',
-
# action=purge
'confirm_purge_button' => 'Maqul',
diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php
index 1889c56e..eecf70ac 100644
--- a/languages/messages/MessagesUk.php
+++ b/languages/messages/MessagesUk.php
@@ -30,13 +30,15 @@
* @author NickK
* @author Prima klasy4na
* @author Riwnodennyk
+ * @author Sodmy
* @author Urhixidur
* @author VolodymyrF
* @author Yuriy Apostol
+ * @author Дар'Ñ ÐšÐ¾Ð·Ð»Ð¾Ð²Ð°
* @author ТеÑÑ‚
*/
-/*
+/**
* УВÐГÐ! ÐЕ РЕДÐГУЙТЕ ЦЕЙ ФÐЙЛ!
*
* Якщо необхідно змінити переклад окремих чаÑтин інтерфейÑу,
@@ -79,6 +81,9 @@ $namespaceAliases = array(
'ОбговореннÑ_шаблона' => NS_TEMPLATE_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'xg j, Y',
@@ -102,148 +107,148 @@ $bookstoreList = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ПЕРЕÐÐПРÐВЛЕÐÐЯ', '#ПЕРЕÐÐПР', '#перенапр', '#перенаправление', '#REDIRECT' ),
- 'notoc' => array( '0', '__БЕЗ_ЗМІСТУ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__БЕЗ_ГÐЛЕРЕЇ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ОБОВ_ЗМІСТ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__ЗМІСТ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__БЕЗ_РЕДÐГУВ_РОЗДІЛУ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗ_ЗÐГОЛОВКУ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
- 'currentmonth' => array( '1', 'ПОТОЧÐИЙ_МІСЯЦЬ', 'ПОТОЧÐИЙ_МІСЯЦЬ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ПОТОЧÐИЙ_МІСЯЦЬ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ_РОД', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ_ÐБР', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ПОТОЧÐИЙ_ДЕÐЬ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ПОТОЧÐИЙ_ДЕÐЬ_2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_ДÐЯ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ПОТОЧÐИЙ_РІК', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ПОТОЧÐИЙ_ЧÐС', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ПОТОЧÐÐ_ГОДИÐÐ', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
- 'localmonth' => array( '1', 'ЛОКÐЛЬÐИЙ_МІСЯЦЬ', 'ЛОКÐЛЬÐИЙ_МІСЯЦЬ_2', 'МЕСТÐЫЙ_МЕСЯЦ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'ЛОКÐЛЬÐИЙ_МІСЯЦЬ_1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_МІСЯЦЯ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_МІСЯЦЯ_РОД', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
- 'localmonthabbrev' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_МІСЯЦЯ_ÐБР', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'ЛОКÐЛЬÐИЙ_ДЕÐЬ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
- 'localday2' => array( '1', 'ЛОКÐЛЬÐИЙ_ДЕÐЬ_2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_ДÐЯ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'ЛОКÐЛЬÐИЙ_РІК', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'ЛОКÐЛЬÐИЙ_ЧÐС', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
- 'localhour' => array( '1', 'ЛОКÐЛЬÐÐ_ГОДИÐÐ', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
- 'numberofpages' => array( '1', 'КІЛЬКІСТЬ_СТОРІÐОК', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'КІЛЬКІСТЬ_СТÐТЕЙ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'КІЛЬКІСТЬ_ФÐЙЛІВ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'КІЛЬКІСТЬ_КОРИСТУВÐЧІВ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'КІЛЬКІСТЬ_ÐКТИВÐИХ_КОРИСТУВÐЧІВ', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'КІЛЬКІСТЬ_РЕДÐГУВÐÐЬ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'КІЛЬКІСТЬ_ПЕРЕГЛЯДІВ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ПРОСТІР_ÐÐЗВ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ПРОСТІР_ÐÐЗВ_2', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
- 'talkspace' => array( '1', 'ПРОСТІР_ОБГОВОРЕÐÐЯ', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ПРОСТІР_ОБГОВОРЕÐÐЯ_2', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
- 'subjectspace' => array( '1', 'ПРОСТІР_СТÐТЕЙ', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectspacee' => array( '1', 'ПРОСТІР_СТÐТЕЙ_2', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
- 'fullpagename' => array( '1', 'ПОВÐÐ_ÐÐЗВÐ_СТОРІÐКИ', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ПОВÐÐ_ÐÐЗВÐ_СТОРІÐКИ_2', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ÐÐЗВÐ_ПІДСТОРІÐКИ', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ÐÐЗВÐ_ПІДСТОРІÐКИ_2', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
- 'basepagename' => array( '1', 'ОСÐОВÐ_ÐÐЗВИ_ПІДСТОРІÐКИ', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
- 'basepagenamee' => array( '1', 'ОСÐОВÐ_ÐÐЗВИ_ПІДСТОРІÐКИ_2', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ_ОБГОВОРЕÐÐЯ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ_ОБГОВОРЕÐÐЯ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'ÐÐЗВÐ_СТÐТТІ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐТТІ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
- 'msg' => array( '0', 'ПОВІД:', 'ПОВІДОМЛЕÐÐЯ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
- 'subst' => array( '0', 'ПІДСТ:', 'ПІДСТÐÐОВКÐ:', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
- 'safesubst' => array( '0', 'БЕЗПЕЧÐÐ_ПІДСТÐÐОВКÐ:', 'ЗÐЩПОДСТ:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'ПОВІД_БЕЗ_ВІКІ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'міні', 'мініатюра', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'міні=$1', 'мініатюра=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'праворуч', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'ліворуч', 'Ñлева', 'left' ),
- 'img_none' => array( '1', 'без', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1px' ),
- 'img_center' => array( '1', 'центр', 'center', 'centre' ),
- 'img_framed' => array( '1', 'обрамити', 'рамка', 'обрамить', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'безрамки', 'frameless' ),
- 'img_page' => array( '1', 'Ñторінка=$1', 'Ñторінка $1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'зверхуправоруч', 'зверхуправоруч=$1', 'зверхуправоруч $1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_border' => array( '1', 'межа', 'граница', 'border' ),
- 'img_baseline' => array( '1', 'оÑнова', 'оÑнование', 'baseline' ),
- 'img_sub' => array( '1', 'під', 'под', 'sub' ),
- 'img_super' => array( '1', 'над', 'super', 'sup' ),
- 'img_top' => array( '1', 'зверху', 'Ñверху', 'top' ),
- 'img_text_top' => array( '1', 'текÑÑ‚-зверху', 'текÑÑ‚-Ñверху', 'text-top' ),
- 'img_middle' => array( '1', 'поÑередині', 'поÑередине', 'middle' ),
- 'img_bottom' => array( '1', 'знизу', 'Ñнизу', 'bottom' ),
- 'img_text_bottom' => array( '1', 'текÑÑ‚-знизу', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
- 'img_link' => array( '1', 'поÑиланнÑ=$1', 'ÑÑылка=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
- 'int' => array( '0', 'Ð’ÐУТР:', 'INT:' ),
- 'sitename' => array( '1', 'ÐÐЗВÐ_СÐЙТУ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'ПÐ:', 'ПИ:', 'NS:' ),
- 'nse' => array( '0', 'ПÐ_2:', 'ПИК:', 'NSE:' ),
- 'localurl' => array( '0', 'ЛОКÐЛЬÐÐ_ÐДРЕСÐ:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛОКÐЛЬÐÐ_ÐДРЕСÐ_2:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
- 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
- 'servername' => array( '0', 'ÐÐЗВÐ_СЕРВЕРÐ', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ШЛЯХ_ДО_СКРИПТУ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ВІДМІÐОК:', 'ПÐДЕЖ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'СТÐТЬ:', 'ПОЛ:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__БЕЗ_ПЕРЕТВОРЕÐÐЯ_ЗÐГОЛОВКУ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__БЕЗ_ПЕРЕТВОРЕÐÐЯ_ТЕКСТУ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'ПОТОЧÐИЙ_ТИЖДЕÐЬ', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ПОТОЧÐИЙ_ДЕÐЬ_ТИЖÐЯ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'ЛОКÐЛЬÐИЙ_ТИЖДЕÐЬ', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
- 'localdow' => array( '1', 'ЛОКÐЛЬÐИЙ_ДЕÐЬ_ТИЖÐЯ', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'ІД_ВЕРСІЇ', 'ИД_ВЕРСИИ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЕÐЬ_ВЕРСІЇ', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЕÐЬ_ВЕРСІЇ_2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МІСЯЦЬ_ВЕРСІЇ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'МІТКÐ_ЧÐСУ_ВЕРСІЇ', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'ВЕРСІЯ_КОРИСТУВÐЧÐ', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
- 'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'ÐР_ПЕРШÐ:', 'ПЕРШÐ_БУКВÐ_ÐœÐЛÐ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ВР_ПЕРШÐ:', 'ПЕРШÐ_БУКВÐ_ВЕЛИКÐ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'ÐР:', 'ÐИЖÐІЙ_РЕГІСТР:', 'ÐœÐЛИМИ_БУКВÐМИ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
- 'uc' => array( '0', 'ВР:', 'ВЕРХÐІЙ_РЕГІСТР:', 'ВЕЛИКИМИ_БУКВÐМИ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
- 'raw' => array( '0', 'ÐЕОБРОБ:', 'ÐЕОБРÐБ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ПОКÐЗÐТИ_ЗÐГОЛОВОК', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
- 'rawsuffix' => array( '1', 'Ð', 'R' ),
- 'newsectionlink' => array( '1', '__ПОСИЛÐÐÐЯ_ÐÐ_ÐОВИЙ_РОЗДІЛ__', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__БЕЗ_ПОСИЛÐÐÐЯ_ÐÐ_ÐОВИЙ_РОЗДІЛ__', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'ПОТОЧÐÐ_ВЕРСІЯ', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'ЗÐКОДОВÐÐÐ_ÐДРЕСÐ:', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
- 'anchorencode' => array( '0', 'КОДУВÐТИ_МІТКУ', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
- 'currenttimestamp' => array( '1', 'МІТКÐ_ПОТОЧÐОГО_ЧÐСУ', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
- 'localtimestamp' => array( '1', 'МІТКÐ_ЛОКÐЛЬÐОГО_ЧÐСУ', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
- 'directionmark' => array( '1', 'ÐÐПРЯМОК_ПИСЬМÐ', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
- 'language' => array( '0', '#МОВÐ:', '#ЯЗЫК:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'МОВÐ_ВМІСТУ', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'СТОРІÐОК_У_ПРОСТОРІ_ÐÐЗВ:', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'КІЛЬКІСТЬ_ÐДМІÐІСТРÐТОРІВ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'ФОРМÐТУВÐТИ_ЧИСЛО', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
- 'padleft' => array( '0', 'ЗÐПОВÐИТИ_ЛІВОРУЧ', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
- 'padright' => array( '0', 'ЗÐПОВÐИТИ_ПРÐВОРУЧ', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
- 'special' => array( '0', 'Ñпеціальна', 'ÑлужебнаÑ', 'special' ),
- 'defaultsort' => array( '1', 'СТÐÐДÐРТÐЕ_СОРТУВÐÐÐЯ:', 'СОРТУВÐÐÐЯ:', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ШЛЯХ_ДО_ФÐЙЛУ:', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
- 'tag' => array( '0', 'тег', 'мітка', 'метка', 'Ñ‚Ñг', 'tag' ),
- 'hiddencat' => array( '1', '__ПРИХОВ_КÐТ__', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'СТОР_Ð’_КÐТ', 'СТОР_У_КÐТ', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'РОЗМІР', 'РОЗМІР_СТОРІÐКИ', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
- 'index' => array( '1', '__ІÐДЕКС__', '__ИÐДЕКС__', '__INDEX__' ),
- 'noindex' => array( '1', '__БЕЗ_ІÐДЕКСУ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
- 'numberingroup' => array( '1', 'КІЛЬКІСТЬ_У_ГРУПІ', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__СТÐТИЧÐЕ_ПЕРЕÐÐПРÐВЛЕÐÐЯ__', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
- 'protectionlevel' => array( '1', 'РІВЕÐЬ_ЗÐХИСТУ', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'форматдати', 'форматдаты', 'formatdate', 'dateformat' ),
+ 'redirect' => array( '0', '#ПЕРЕÐÐПРÐВЛЕÐÐЯ', '#ПЕРЕÐÐПР', '#перенапр', '#перенаправление', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БЕЗ_ЗМІСТУ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__БЕЗ_ГÐЛЕРЕЇ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ОБОВ_ЗМІСТ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ЗМІСТ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БЕЗ_РЕДÐГУВ_РОЗДІЛУ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__БЕЗ_ЗÐГОЛОВКУ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
+ 'currentmonth' => array( '1', 'ПОТОЧÐИЙ_МІСЯЦЬ', 'ПОТОЧÐИЙ_МІСЯЦЬ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ПОТОЧÐИЙ_МІСЯЦЬ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ_РОД', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ_ÐБР', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ПОТОЧÐИЙ_ДЕÐЬ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ПОТОЧÐИЙ_ДЕÐЬ_2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_ДÐЯ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ПОТОЧÐИЙ_РІК', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ПОТОЧÐИЙ_ЧÐС', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ПОТОЧÐÐ_ГОДИÐÐ', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'ЛОКÐЛЬÐИЙ_МІСЯЦЬ', 'ЛОКÐЛЬÐИЙ_МІСЯЦЬ_2', 'МЕСТÐЫЙ_МЕСЯЦ', 'МЕСТÐЫЙ_МЕСЯЦ_2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'ЛОКÐЛЬÐИЙ_МІСЯЦЬ_1', 'МЕСТÐЫЙ_МЕСЯЦ_1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_МІСЯЦЯ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_МІСЯЦЯ_РОД', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_РОД', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_МІСЯЦЯ_ÐБР', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_МЕСЯЦÐ_ÐБР', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'ЛОКÐЛЬÐИЙ_ДЕÐЬ', 'МЕСТÐЫЙ_ДЕÐЬ', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'ЛОКÐЛЬÐИЙ_ДЕÐЬ_2', 'МЕСТÐЫЙ_ДЕÐЬ_2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'ÐÐЗВÐ_ЛОКÐЛЬÐОГО_ДÐЯ', 'ÐÐЗВÐÐИЕ_МЕСТÐОГО_ДÐЯ', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'ЛОКÐЛЬÐИЙ_РІК', 'МЕСТÐЫЙ_ГОД', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'ЛОКÐЛЬÐИЙ_ЧÐС', 'МЕСТÐОЕ_ВРЕМЯ', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'ЛОКÐЛЬÐÐ_ГОДИÐÐ', 'МЕСТÐЫЙ_ЧÐС', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'КІЛЬКІСТЬ_СТОРІÐОК', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'КІЛЬКІСТЬ_СТÐТЕЙ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'КІЛЬКІСТЬ_ФÐЙЛІВ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'КІЛЬКІСТЬ_КОРИСТУВÐЧІВ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'КІЛЬКІСТЬ_ÐКТИВÐИХ_КОРИСТУВÐЧІВ', 'КОЛИЧЕСТВО_ÐКТИВÐЫХ_УЧÐСТÐИКОВ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'КІЛЬКІСТЬ_РЕДÐГУВÐÐЬ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'КІЛЬКІСТЬ_ПЕРЕГЛЯДІВ', 'КОЛИЧЕСТВО_ПРОСМОТРОВ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ПРОСТІР_ÐÐЗВ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ПРОСТІР_ÐÐЗВ_2', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
+ 'talkspace' => array( '1', 'ПРОСТІР_ОБГОВОРЕÐÐЯ', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ПРОСТІР_ОБГОВОРЕÐÐЯ_2', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
+ 'subjectspace' => array( '1', 'ПРОСТІР_СТÐТЕЙ', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( '1', 'ПРОСТІР_СТÐТЕЙ_2', 'ПРОСТРÐÐСТВО_СТÐТЕЙ_2', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( '1', 'ПОВÐÐ_ÐÐЗВÐ_СТОРІÐКИ', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ПОВÐÐ_ÐÐЗВÐ_СТОРІÐКИ_2', 'ПОЛÐОЕ_ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ÐÐЗВÐ_ПІДСТОРІÐКИ', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ÐÐЗВÐ_ПІДСТОРІÐКИ_2', 'ÐÐЗВÐÐИЕ_ПОДСТРÐÐИЦЫ_2', 'SUBPAGENAMEE' ),
+ 'basepagename' => array( '1', 'ОСÐОВÐ_ÐÐЗВИ_ПІДСТОРІÐКИ', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ', 'BASEPAGENAME' ),
+ 'basepagenamee' => array( '1', 'ОСÐОВÐ_ÐÐЗВИ_ПІДСТОРІÐКИ_2', 'ОСÐОВÐ_ÐÐЗВÐÐИЯ_СТРÐÐИЦЫ_2', 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ_ОБГОВОРЕÐÐЯ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ÐÐЗВÐ_СТОРІÐКИ_ОБГОВОРЕÐÐЯ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_ОБСУЖДЕÐИЯ_2', 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'ÐÐЗВÐ_СТÐТТІ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'ÐÐЗВÐ_СТÐТТІ_2', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_СТÐТЬИ_2', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( '0', 'ПОВІД:', 'ПОВІДОМЛЕÐÐЯ:', 'СООБЩЕÐИЕ:', 'СООБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'ПІДСТ:', 'ПІДСТÐÐОВКÐ:', 'ПОДСТÐÐОВКÐ:', 'ПОДСТ:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'БЕЗПЕЧÐÐ_ПІДСТÐÐОВКÐ:', 'ЗÐЩПОДСТ:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'ПОВІД_БЕЗ_ВІКІ:', 'СООБЩ_БЕЗ_ВИКИ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'міні', 'мініатюра', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'міні=$1', 'мініатюра=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'праворуч', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'ліворуч', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'без', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1px' ),
+ 'img_center' => array( '1', 'центр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'обрамити', 'рамка', 'обрамить', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'безрамки', 'frameless' ),
+ 'img_page' => array( '1', 'Ñторінка=$1', 'Ñторінка $1', 'Ñтраница=$1', 'Ñтраница $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'зверхуправоруч', 'зверхуправоруч=$1', 'зверхуправоруч $1', 'ÑверхуÑправа', 'ÑверхуÑправа=$1', 'ÑверхуÑправа $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_border' => array( '1', 'межа', 'граница', 'border' ),
+ 'img_baseline' => array( '1', 'оÑнова', 'оÑнование', 'baseline' ),
+ 'img_sub' => array( '1', 'під', 'под', 'sub' ),
+ 'img_super' => array( '1', 'над', 'super', 'sup' ),
+ 'img_top' => array( '1', 'зверху', 'Ñверху', 'top' ),
+ 'img_text_top' => array( '1', 'текÑÑ‚-зверху', 'текÑÑ‚-Ñверху', 'text-top' ),
+ 'img_middle' => array( '1', 'поÑередині', 'поÑередине', 'middle' ),
+ 'img_bottom' => array( '1', 'знизу', 'Ñнизу', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'текÑÑ‚-знизу', 'текÑÑ‚-Ñнизу', 'text-bottom' ),
+ 'img_link' => array( '1', 'поÑиланнÑ=$1', 'ÑÑылка=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'альт=$1', 'alt=$1' ),
+ 'int' => array( '0', 'Ð’ÐУТР:', 'INT:' ),
+ 'sitename' => array( '1', 'ÐÐЗВÐ_СÐЙТУ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'ПÐ:', 'ПИ:', 'NS:' ),
+ 'nse' => array( '0', 'ПÐ_2:', 'ПИК:', 'NSE:' ),
+ 'localurl' => array( '0', 'ЛОКÐЛЬÐÐ_ÐДРЕСÐ:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛОКÐЛЬÐÐ_ÐДРЕСÐ_2:', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
+ 'servername' => array( '0', 'ÐÐЗВÐ_СЕРВЕРÐ', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ШЛЯХ_ДО_СКРИПТУ', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ВІДМІÐОК:', 'ПÐДЕЖ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'СТÐТЬ:', 'ПОЛ:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__БЕЗ_ПЕРЕТВОРЕÐÐЯ_ЗÐГОЛОВКУ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ЗÐГОЛОВКÐ__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__БЕЗ_ПЕРЕТВОРЕÐÐЯ_ТЕКСТУ__', '__БЕЗ_ПРЕОБРÐЗОВÐÐИЯ_ТЕКСТÐ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'ПОТОЧÐИЙ_ТИЖДЕÐЬ', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ПОТОЧÐИЙ_ДЕÐЬ_ТИЖÐЯ', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
+ 'localweek' => array( '1', 'ЛОКÐЛЬÐИЙ_ТИЖДЕÐЬ', 'МЕСТÐÐЯ_ÐЕДЕЛЯ', 'LOCALWEEK' ),
+ 'localdow' => array( '1', 'ЛОКÐЛЬÐИЙ_ДЕÐЬ_ТИЖÐЯ', 'МЕСТÐЫЙ_ДЕÐЬ_ÐЕДЕЛИ', 'LOCALDOW' ),
+ 'revisionid' => array( '1', 'ІД_ВЕРСІЇ', 'ИД_ВЕРСИИ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕÐЬ_ВЕРСІЇ', 'ДЕÐЬ_ВЕРСИИ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕÐЬ_ВЕРСІЇ_2', 'ДЕÐЬ_ВЕРСИИ_2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МІСЯЦЬ_ВЕРСІЇ', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'МІТКÐ_ЧÐСУ_ВЕРСІЇ', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'ВЕРСІЯ_КОРИСТУВÐЧÐ', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
+ 'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'ÐР_ПЕРШÐ:', 'ПЕРШÐ_БУКВÐ_ÐœÐЛÐ:', 'ПЕРВÐЯ_БУКВÐ_ÐœÐЛЕÐЬКÐЯ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ВР_ПЕРШÐ:', 'ПЕРШÐ_БУКВÐ_ВЕЛИКÐ:', 'ПЕРВÐЯ_БУКВÐ_БОЛЬШÐЯ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'ÐР:', 'ÐИЖÐІЙ_РЕГІСТР:', 'ÐœÐЛИМИ_БУКВÐМИ:', 'ÐœÐЛЕÐЬКИМИ_БУКВÐМИ:', 'LC:' ),
+ 'uc' => array( '0', 'ВР:', 'ВЕРХÐІЙ_РЕГІСТР:', 'ВЕЛИКИМИ_БУКВÐМИ:', 'БОЛЬШИМИ_БУКВÐМИ:', 'UC:' ),
+ 'raw' => array( '0', 'ÐЕОБРОБ:', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ПОКÐЗÐТИ_ЗÐГОЛОВОК', 'ПОКÐЗÐТЬ_ЗÐГОЛОВОК', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'Ð', 'R' ),
+ 'newsectionlink' => array( '1', '__ПОСИЛÐÐÐЯ_ÐÐ_ÐОВИЙ_РОЗДІЛ__', '__ССЫЛКÐ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__БЕЗ_ПОСИЛÐÐÐЯ_ÐÐ_ÐОВИЙ_РОЗДІЛ__', '__БЕЗ_ССЫЛКИ_ÐÐ_ÐОВЫЙ_РÐЗДЕЛ__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'ПОТОЧÐÐ_ВЕРСІЯ', 'ТЕКУЩÐЯ_ВЕРСИЯ', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'ЗÐКОДОВÐÐÐ_ÐДРЕСÐ:', 'ЗÐКОДИРОВÐÐÐЫЙ_ÐДРЕС:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'КОДУВÐТИ_МІТКУ', 'КОДИРОВÐТЬ_МЕТКУ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'МІТКÐ_ПОТОЧÐОГО_ЧÐСУ', 'ОТМЕТКÐ_ТЕКУЩЕГО_ВРЕМЕÐИ', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'МІТКÐ_ЛОКÐЛЬÐОГО_ЧÐСУ', 'ОТМЕТКÐ_МЕСТÐОГО_ВРЕМЕÐИ', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'ÐÐПРЯМОК_ПИСЬМÐ', 'ÐÐПРÐВЛЕÐИЕ_ПИСЬМÐ', 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( '0', '#МОВÐ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'МОВÐ_ВМІСТУ', 'ЯЗЫК_СОДЕРЖÐÐИЯ', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'СТОРІÐОК_У_ПРОСТОРІ_ÐÐЗВ:', 'СТРÐÐИЦ_Ð’_ПРОСТРÐÐСТВЕ_ИМÐÐ:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'КІЛЬКІСТЬ_ÐДМІÐІСТРÐТОРІВ', 'КОЛИЧЕСТВО_ÐДМИÐИСТРÐТОРОВ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'ФОРМÐТУВÐТИ_ЧИСЛО', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'ЗÐПОВÐИТИ_ЛІВОРУЧ', 'ЗÐПОЛÐИТЬ_СЛЕВÐ', 'PADLEFT' ),
+ 'padright' => array( '0', 'ЗÐПОВÐИТИ_ПРÐВОРУЧ', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð', 'PADRIGHT' ),
+ 'special' => array( '0', 'Ñпеціальна', 'ÑлужебнаÑ', 'special' ),
+ 'defaultsort' => array( '1', 'СТÐÐДÐРТÐЕ_СОРТУВÐÐÐЯ:', 'СОРТУВÐÐÐЯ:', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ', 'КЛЮЧ_СОРТИРОВКИ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ШЛЯХ_ДО_ФÐЙЛУ:', 'ПУТЬ_К_ФÐЙЛУ:', 'FILEPATH:' ),
+ 'tag' => array( '0', 'тег', 'мітка', 'метка', 'Ñ‚Ñг', 'tag' ),
+ 'hiddencat' => array( '1', '__ПРИХОВ_КÐТ__', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'СТОР_Ð’_КÐТ', 'СТОР_У_КÐТ', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'РОЗМІР', 'РОЗМІР_СТОРІÐКИ', 'РÐЗМЕР_СТРÐÐИЦЫ', 'PAGESIZE' ),
+ 'index' => array( '1', '__ІÐДЕКС__', '__ИÐДЕКС__', '__INDEX__' ),
+ 'noindex' => array( '1', '__БЕЗ_ІÐДЕКСУ__', '__БЕЗ_ИÐДЕКСÐ__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'КІЛЬКІСТЬ_У_ГРУПІ', 'ЧИСЛО_В_ГРУППЕ', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__СТÐТИЧÐЕ_ПЕРЕÐÐПРÐВЛЕÐÐЯ__', '__СТÐТИЧЕСКОЕ_ПЕРЕÐÐПРÐВЛЕÐИЕ__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'РІВЕÐЬ_ЗÐХИСТУ', 'УРОВЕÐЬ_ЗÐЩИТЫ', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'форматдати', 'форматдаты', 'formatdate', 'dateformat' ),
);
$linkTrail = '/^([a-zабвгґдеєжзиіїйклмнопрÑтуфхцчшщьєюÑёъы“»]+)(.*)$/sDu';
@@ -614,21 +619,23 @@ $1',
'badarticleerror' => 'Ð¦Ñ Ð´Ñ–Ñ Ð½Ðµ може бути виконана на цій Ñторінці.',
'cannotdelete' => 'Ðеможливо вилучити Ñторінку або файл "$1".
Можливо, Ñ—Ñ— (його) вже вилучив хтоÑÑŒ інший.',
+'cannotdelete-title' => 'Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñторінку «$1»',
'badtitle' => 'ÐеприпуÑтима назва',
'badtitletext' => 'Запитана назва Ñторінки неправильна, порожнÑ, або неправильно зазначена міжмовна чи міжвікі назва.
Можливо, в назві викориÑтовуютьÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимі Ñимволи.',
-'perfcached' => 'ÐаÑтупні дані взÑÑ‚Ñ– з кешу Ñ– можуть бути заÑтарілими:',
-'perfcachedts' => 'ÐаÑтупні дані взÑÑ‚Ñ– з кешу, воÑтаннє він оновлювавÑÑ Ð¾ $1.',
+'perfcached' => 'ÐаÑтупні дані взÑÑ‚Ñ– з кешу Ñ– можуть бути заÑтарілими. Ð’ кеші зберігаєтьÑÑ Ð½Ðµ більше {{PLURAL:$1| запиÑу| запиÑів}}.',
+'perfcachedts' => 'ÐаÑтупні дані взÑÑ‚Ñ– з кешу, воÑтаннє він оновлювавÑÑ Ð¾ $1. Ð’ кеші зберігаєтьÑÑ Ð½Ðµ більше {{PLURAL:$4|запиÑу|запиÑів}}.',
'querypage-no-updates' => 'Зміни цієї Ñторінки зараз заборонені. Дані тут не можуть бути оновлені зараз.',
'wrong_wfQuery_params' => 'ÐеприпуÑтима параметри функцій wfQuery()<br />
ФункціÑ: $1<br />
Запит: $2',
'viewsource' => 'ПереглÑд',
-'viewsourcefor' => 'Сторінка «$1»',
+'viewsource-title' => 'ПереглÑд вихідного коду Ñторінки $1',
'actionthrottled' => 'ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° швидкіÑÑ‚ÑŽ',
'actionthrottledtext' => 'Як захід боротьби зі Ñпамом, уÑтановлено Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° багаторазове заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— дії протÑгом короткого проміжку чаÑу. Будь лаÑка, повторіть Ñпробу через кілька хвилин.',
'protectedpagetext' => 'Ð¦Ñ Ñторінка закрита Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ.',
'viewsourcetext' => 'Ви можете переглÑнути та Ñкопіювати початковий текÑÑ‚ цієї Ñторінки:',
+'viewyourtext' => "Ви можете переглÑнути або Ñкопіювати вихідний текÑÑ‚ '''ваших редагувань''' на цю Ñторінку:",
'protectedinterface' => 'Ð¦Ñ Ñторінка Ñ” чаÑтиною інтерфейÑу програмного Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ– Ñ—Ñ— можуть редагувати лише адмініÑтратори проекту.',
'editinginterface' => "'''Увага:''' Ви редагуєте Ñторінку, що Ñ” чаÑтиною текÑтового інтерфейÑу. Зміни цієї Ñторінки викличуть зміну інтерфейÑу Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… кориÑтувачів. Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ð´Ñƒ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проект, що займаєтьÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ”ÑŽ MediaWiki.",
'sqlhidden' => '(SQL запит приховано)',
@@ -734,6 +741,7 @@ $1',
'emailconfirmlink' => 'Підтвердити адреÑу вашої електронної пошти',
'invalidemailaddress' => 'Уведена адреÑа не може бути прийнÑта, бо вона не відповідає формату Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти.
Будь лаÑка, введіть коректну адреÑу або залиште поле порожнім.',
+'cannotchangeemail' => 'У цій вікі не можна мінÑти Ñвою адреÑу ел. пошти.',
'accountcreated' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ñтворено.',
'accountcreatedtext' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ $1 Ñтворено.',
'createaccount-title' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу Ð´Ð»Ñ {{SITENAME}}',
@@ -749,6 +757,7 @@ $1',
# E-mail sending
'php-mail-error-unknown' => 'Ðевідома помилка в PHP-mail() функції',
+'user-mail-no-addy' => 'Спроба надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти без зазначеної адреÑи електронної пошти.',
# Change password dialog
'resetpass' => 'Змінити пароль',
@@ -769,30 +778,45 @@ $1',
'resetpass-temp-password' => 'ТимчаÑовий пароль:',
# Special:PasswordReset
-'passwordreset' => 'Скинути пароль',
-'passwordreset-text' => 'Заповніть форму, щоб отримати по ел. пошті Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ дані Вашого облікового запиÑу.',
-'passwordreset-legend' => 'ПеревÑтановити пароль',
-'passwordreset-disabled' => 'У цій вікі вимкнена можливіÑÑ‚ÑŒ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введіть одну з чаÑтин даних}}',
-'passwordreset-username' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
-'passwordreset-domain' => 'Домен:',
-'passwordreset-email' => 'ÐдреÑа електронної пошти:',
-'passwordreset-emailtitle' => 'Деталі облікового запиÑу на {{SITENAME}}',
-'passwordreset-emailtext-ip' => "ХтоÑÑŒ (імовірно Ви, з IP-адреÑи $1) попроÑив нагадати деталі Вашого облікового запиÑу Ð´Ð»Ñ {{SITENAME}} ($4). З Вашою електронною Ñкринькою пов'Ñзан{{PLURAL:$3|ий такий запиÑ|Ñ– такі запиÑи}}:
+'passwordreset' => 'Скинути пароль',
+'passwordreset-text' => 'Заповніть форму, щоб отримати по ел. пошті Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ дані Вашого облікового запиÑу.',
+'passwordreset-legend' => 'ПеревÑтановити пароль',
+'passwordreset-disabled' => 'У цій вікі вимкнена можливіÑÑ‚ÑŒ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
+'passwordreset-pretext' => '{{PLURAL:$1||Введіть одну з чаÑтин даних}}',
+'passwordreset-username' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'ПродивитиÑÑŒ результуючий електронний лиÑÑ‚?',
+'passwordreset-capture-help' => 'Якщо Ви вÑтановите відмітку, Вам буде показаний електронний лиÑÑ‚ (із тимчаÑовим паролем), Ñкий буде відправлений кориÑтувачеві.',
+'passwordreset-email' => 'ÐдреÑа електронної пошти:',
+'passwordreset-emailtitle' => 'Деталі облікового запиÑу на {{SITENAME}}',
+'passwordreset-emailtext-ip' => "ХтоÑÑŒ (імовірно Ви, з IP-адреÑи $1) попроÑив нагадати деталі Вашого облікового запиÑу Ð´Ð»Ñ {{SITENAME}} ($4). З Вашою електронною Ñкринькою пов'Ñзан{{PLURAL:$3|ий такий запиÑ|Ñ– такі запиÑи}}:
$2
{{PLURAL:$3|Цей тимчаÑовий пароль|Ці тимчаÑові паролі}} Ñтануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.
Ви маєте ввійти в ÑиÑтему Ñ– вибрати новий пароль. Якщо ж цей запит зробив хтоÑÑŒ інший, або Ви пам'Ñтаєте Ñвій Ñтарий пароль Ñ– не бажаєте його змінювати, можете проÑто проігнорувати це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° продовжувати викориÑтовувати Ñтарий пароль.",
-'passwordreset-emailtext-user' => "КориÑтувач $1 з {{SITENAME}} попроÑив нагадати деталі Вашого облікового запиÑу Ð´Ð»Ñ {{SITENAME}} ($4). З Вашою електронною Ñкринькою пов'Ñзан{{PLURAL:$3|ий такий запиÑ|Ñ– такі запиÑи}}:
+'passwordreset-emailtext-user' => "КориÑтувач $1 з {{SITENAME}} попроÑив нагадати деталі Вашого облікового запиÑу Ð´Ð»Ñ {{SITENAME}} ($4). З Вашою електронною Ñкринькою пов'Ñзан{{PLURAL:$3|ий такий запиÑ|Ñ– такі запиÑи}}:
$2
{{PLURAL:$3|Цей тимчаÑовий пароль|Ці тимчаÑові паролі}} Ñтануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.
Ви маєте ввійти в ÑиÑтему Ñ– вибрати новий пароль. Якщо ж цей запит зробив хтоÑÑŒ інший, або Ви пам'Ñтаєте Ñвій Ñтарий пароль Ñ– не бажаєте його змінювати, можете проÑто проігнорувати це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° продовжувати викориÑтовувати Ñтарий пароль.",
-'passwordreset-emailelement' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: $1
+'passwordreset-emailelement' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: $1
ТимчаÑовий пароль: $2",
-'passwordreset-emailsent' => 'Ðагадувальний електронний лиÑÑ‚ відправлений.',
+'passwordreset-emailsent' => 'Ðагадувальний електронний лиÑÑ‚ відправлений.',
+'passwordreset-emailsent-capture' => 'Електронний лиÑÑ‚-Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ² надіÑланий, Ñк показано нижче.',
+'passwordreset-emailerror-capture' => 'Електронний лиÑÑ‚-Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ð² бути надіÑланий, Ñк показано нижче, але його вдправка не вдалаÑÑŒ через причину: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Змінити адреÑу електронної пошти',
+'changeemail-header' => 'Зміна адреÑи електронної пошти',
+'changeemail-text' => 'Заповніть цю форму, щоб змінити адреÑу електронної пошти. Вам потрібно буде ввеÑти пароль, щоб підтвердити ці зміни.',
+'changeemail-no-info' => 'Ви повинні увійти в ÑиÑтему, щоб отримати безпоÑередній доÑтуп до цієї Ñторінки.',
+'changeemail-oldemail' => 'Поточна адреÑа електронної пошти:',
+'changeemail-newemail' => 'Ðова адреÑа електронної пошти:',
+'changeemail-none' => '(немає)',
+'changeemail-submit' => 'Змінити адреÑу електронної пошти',
+'changeemail-cancel' => 'СкаÑувати',
# Edit page toolbar
'bold_sample' => 'Жирний текÑÑ‚',
@@ -862,9 +886,6 @@ $2
Ваша поточна IP-адреÑа — $3, ідентифікатор Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ â€” #$5. Будь лаÑка, зазначайте його у Ñвоїх запитах.",
'blockednoreason' => 'не вказано причини',
-'blockedoriginalsource' => 'ЗміÑÑ‚ Ñторінки «$1» наведено нижче:',
-'blockededitsource' => "ТекÑÑ‚ '''ваших редагувань''' Ñторінки «$1» наведено нижче:",
-'whitelistedittitle' => 'Ð”Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾ ввійти в ÑиÑтему',
'whitelistedittext' => 'Ви повинні $1 щоб редагувати Ñторінки.',
'confirmedittext' => 'Ви повинні підтвердити вашу адреÑу електронної пошти перед редагуваннÑм Ñторінок.
Будь-лаÑка зазначте Ñ– підтвердіть вашу електронну адреÑу на [[Special:Preferences|Ñторінці налаштувань]].',
@@ -953,7 +974,8 @@ $2
Якщо ви не бажаєте, щоб напиÑане вами безжаліÑно редагувалоÑÑŒ — не пишіть тут.<br />
Ви також зобов'ÑзуєтеÑÑŒ, що напиÑане вами тут належить вам або взÑте з джерела, що Ñ” ÑуÑпільним надбаннÑм, або подібного вільного джерела (див. $1).<br />
'''ÐЕ ПУБЛІКУЙТЕ ТУТ БЕЗ ДОЗВОЛУ ÐœÐТЕРІÐЛИ, ЩО Є ОБ'ЄКТОМ ÐВТОРСЬКОГО ПРÐÐ’Ð!'''",
-'longpageerror' => "'''ПОМИЛКÐ: текÑÑ‚, що ви хочете зберегти має $1 кілобайт, що більше ніж вÑтановлену межу $2 кілобайт. Сторінку неможливо зберегти.'''",
+'longpageerror' => "'''Помилка: ТекÑÑ‚, що ви надіÑлали займає $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}}, що більше за вÑтановлену межу у $2 {{PLURAL:$2|кілобайт|кілобайти|кілобайтів}}.'''
+Його неможливо зберегти.",
'readonlywarning' => "'''ПОПЕРЕДЖЕÐÐЯ: База даних заблокована в зв'Ñзку з процедурами обÑлуговуваннÑ,
тому, на даний момент, ви не можете запиÑати ваші зміни.
Можливо, вам варто зберегти текÑÑ‚ в локальний файл (на Ñвоєму диÑку) й зберегти його пізніше.'''
@@ -1125,8 +1147,6 @@ $3 зазначив таку причину: ''$2''",
'revdelete-unsuppress' => 'ЗнÑти Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð· відновлених верÑій',
'revdelete-log' => 'Причина:',
'revdelete-submit' => 'ЗаÑтоÑувати до {{PLURAL:$1|обраної верÑÑ–Ñ—|обраних верÑій}}',
-'revdelete-logentry' => 'змінив видиміÑÑ‚ÑŒ верÑÑ–Ñ— Ñторінки Ð´Ð»Ñ [[$1]]',
-'logdelete-logentry' => 'змінена видиміÑÑ‚ÑŒ події Ð´Ð»Ñ [[$1]]',
'revdelete-success' => "'''ВидиміÑÑ‚ÑŒ верÑÑ–Ñ— уÑпішно змінена.'''",
'revdelete-failure' => "'''ВидиміÑÑ‚ÑŒ верÑÑ–Ñ— неможливо змінити:'''
$1",
@@ -1138,15 +1158,6 @@ $1",
'revdel-restore-visible' => 'видимі верÑÑ–Ñ—',
'pagehist' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñторінки',
'deletedhist' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½ÑŒ',
-'revdelete-content' => 'вміÑÑ‚',
-'revdelete-summary' => 'коментар до редагуваннÑ',
-'revdelete-uname' => "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача",
-'revdelete-restricted' => 'заÑтоÑовані Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів',
-'revdelete-unrestricted' => 'знÑÑ‚Ñ– Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів',
-'revdelete-hid' => 'приховано $1',
-'revdelete-unhid' => 'розкрито $1',
-'revdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|редагуваннÑ|редагувань|редагувань}}',
-'logdelete-log-message' => '$1 Ð´Ð»Ñ $2 {{PLURAL:$2|події|подій}}',
'revdelete-hide-current' => 'Помилка Ð¿Ñ€Ð¸Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу від $2, $1: це поточна верÑÑ–Ñ.
Її не можна приховати.',
'revdelete-show-no-access' => 'Помилка показу запиÑу від $2, $1: він позначений Ñк «з обмеженим доÑтупом».
@@ -1301,12 +1312,14 @@ $1",
'prefs-rc' => 'Сторінка оÑтанніх редагувань',
'prefs-watchlist' => 'СпиÑок ÑпоÑтереженнÑ',
'prefs-watchlist-days' => 'КількіÑÑ‚ÑŒ днів, що відображаютьÑÑ Ñƒ ÑпиÑку ÑпоÑтережень:',
-'prefs-watchlist-days-max' => 'Ðе більше 7 днів',
+'prefs-watchlist-days-max' => 'МакÑимум $1 {{PLURAL:$1|день|дні|днів}}',
'prefs-watchlist-edits' => 'КількіÑÑ‚ÑŒ редагувань Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ розширеному ÑпиÑку ÑпоÑтереженнÑ:',
'prefs-watchlist-edits-max' => 'МакÑимально: 1000',
'prefs-watchlist-token' => 'Позначка ÑпиÑку ÑпоÑтереженнÑ:',
'prefs-misc' => 'Інші налаштуваннÑ',
'prefs-resetpass' => 'Змінити пароль',
+'prefs-changeemail' => 'Змінити адреÑу електронної пошти',
+'prefs-setemail' => 'Ð’Ñтановити адреÑу електронної пошти',
'prefs-email' => 'Параметри електронної пошти',
'prefs-rendering' => 'Зовнішній виглÑд',
'saveprefs' => 'Зберегти',
@@ -1368,6 +1381,7 @@ $1",
'yourrealname' => "Справжнє ім'Ñ:",
'yourlanguage' => 'Мова інтерфейÑу:',
'yourvariant' => 'Варіант мови вміÑту:',
+'prefs-help-variant' => 'Бажана мова Ñторінок та інтерфейÑу цього вікіпроекту.',
'yournick' => 'ПідпиÑ:',
'prefs-help-signature' => 'Репліки на Ñторінках Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñлід підпиÑувати Ñимволами "<nowiki>~~~~</nowiki>", Ñкі будуть перетворені у ваш Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñ– чаÑ.',
'badsig' => 'Ðеправильний підпиÑ.
@@ -1409,7 +1423,7 @@ $1",
'userrights-lookup-user' => 'Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð°Ð¼Ð¸ кориÑтувача',
'userrights-user-editname' => "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
'editusergroup' => 'Редагувати групи кориÑтувача',
-'editinguser' => "Зміна прав кориÑтувача '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Зміна прав кориÑтувача '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Змінити групи кориÑтувача',
'saveusergroups' => 'Зберегти групи кориÑтувача',
'userrights-groupsmember' => 'Член груп:',
@@ -1504,13 +1518,13 @@ $1",
'right-autopatrol' => 'Ðвтоматичне Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½ÑŒ патрульованими',
'right-patrolmarks' => 'ПереглÑд патрульованих Ñторінок у нових редагуваннÑÑ…',
'right-unwatchedpages' => 'ПереглÑд ÑпиÑку Ñторінок, за Ñкими ніхто не ÑпоÑтерігає',
-'right-trackback' => 'ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Trackback',
'right-mergehistory' => "Об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ñторій редагувань Ñторінок",
'right-userrights' => 'Зміна вÑÑ–Ñ… прав кориÑтувачів',
'right-userrights-interwiki' => 'Зміна прав кориÑтувачів у інших вікі',
'right-siteadmin' => 'Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних',
'right-override-export-depth' => "екÑпорт Ñторінок, включаючи пов'Ñзані Ñторінки з глибиною до 5",
'right-sendemail' => 'відправлÑти пошту іншим кориÑтувачам',
+'right-passwordreset' => 'ПереглÑд повідомлень електронної пошти Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ паролю',
# User rights log
'rightslog' => 'Журнал прав кориÑтувача',
@@ -1544,16 +1558,17 @@ $1",
'action-suppressionlog' => 'переглÑд цього приватного журналу',
'action-block' => 'Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ кориÑтувача',
'action-protect' => 'зміну Ñ€Ñ–Ð²Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту цієї Ñторінки',
+'action-rollback' => 'швидко відкотити Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñтаннього кориÑтувача, що змінював певну Ñторінку',
'action-import' => 'імпорт цієї Ñторінки з іншої вікі',
'action-importupload' => 'імпорт цієї Ñторінки з файлу',
'action-patrol' => 'Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡ÑƒÐ¶Ð¸Ñ… редагувань патрульованими',
'action-autopatrol' => 'Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°Ñних редагувань патрульованими',
'action-unwatchedpages' => 'переглÑд ÑпиÑку Ñторінок, за Ñкими ніхто не ÑпоÑтерігає',
-'action-trackback' => 'надÑÐ¸Ð»Ð°Ð½Ð½Ñ trackback',
'action-mergehistory' => 'Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ñторії змін цієї Ñторінки',
'action-userrights' => 'зміну вÑÑ–Ñ… прав кориÑтувача',
'action-userrights-interwiki' => 'зміну прав кориÑтувачів у інших вікі',
'action-siteadmin' => 'Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð· даних',
+'action-sendemail' => 'відправка електронної пошти',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
@@ -1583,11 +1598,11 @@ $1",
'newpageletter' => 'Ð',
'boteditletter' => 'б',
'unpatrolledletter' => '!',
-'sectionlink' => '→',
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|кориÑтувач ÑпоÑтерігає|кориÑтувачі ÑпоÑтерігають|кориÑтувачів ÑпоÑтерігають}}]',
'rc_categories' => 'Тільки з категорій (разділювач «|»)',
'rc_categories_any' => 'Будь-Ñкий',
'rc-change-size' => '$1',
+'rc-change-size-new' => 'Розмір піÑÐ»Ñ Ð·Ð¼Ñ–Ð½Ð¸: {{PLURAL:$1|байт|байти|байтів}}',
'newsectionsummary' => '/* $1 */ нова тема',
'rc-enhanced-expand' => 'Показати деталі (потрібен JavaScript)',
'rc-enhanced-hide' => 'Сховати деталі',
@@ -1597,7 +1612,6 @@ $1",
'recentchangeslinked-feed' => "Пов'Ñзані редгуваннÑ",
'recentchangeslinked-toolbox' => "Пов'Ñзані редагуваннÑ",
'recentchangeslinked-title' => "Пов'Ñзані Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Â«$1»",
-'recentchangeslinked-backlink' => '↠$1',
'recentchangeslinked-noresult' => "Ðа пов'Ñзаних Ñторінках не було змін протÑгом зазначеного періоду.",
'recentchangeslinked-summary' => "Це ÑпиÑок нещодавніх змін на Ñторінках, на Ñкі поÑилаєтьÑÑ Ð·Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° Ñторінка (або на Ñторінках, що міÑÑ‚ÑÑ‚ÑŒÑÑ Ð² цій категорії).
Сторінки з [[Special:Watchlist|вашого ÑпиÑку ÑпоÑтереженнÑ]] виділені '''жирним шрифтом'''.",
@@ -1651,6 +1665,7 @@ $1",
'ignorewarnings' => 'Ігнорувати вÑÑ– попередженнÑ',
'minlength1' => 'Ðазва файлу повинна міÑтити щонайменше одну літеру.',
'illegalfilename' => 'Ім\'Ñ Ñ„Ð°Ð¹Ð»Ñƒ "$1" міÑтить букви, що недозволені в заголовках Ñторінок. Будь лаÑка перейменуйте файл Ñ– Ñпробуйте завантажити його знову.',
+'filename-toolong' => 'Ðазви файлів не можуть бути довші, ніж 240 байтів.',
'badfilename' => 'Ðазву файлу було змінено на $1.',
'filetype-mime-mismatch' => 'Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ ".$1" файлу не відповідає виÑвленому MIME типу файлу ($2).',
'filetype-badmime' => 'Файли, що мають MIME-тип «$1», не можуть бути завантажені.',
@@ -1754,6 +1769,41 @@ $1',
'upload-unknown-size' => 'Ðевідомий розмір',
'upload-http-error' => 'ВідбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Ðе вдалоÑÑ Ñ‚Ñ€Ð°Ð½Ñлювати файл $1.',
+'backend-fail-backup' => 'Ðе вдалоÑÑ Ñтворити резервну копію файлу $1.',
+'backend-fail-notexists' => 'Файл $1 не Ñ–Ñнує.',
+'backend-fail-hashes' => 'Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ хеші файлів Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑннÑ.',
+'backend-fail-notsame' => 'Ðеідентичний файл $1 вже Ñ–Ñнує.',
+'backend-fail-invalidpath' => 'ШлÑÑ… Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ $1 Ñ” недійÑним.',
+'backend-fail-delete' => 'Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ файл $1.',
+'backend-fail-alreadyexists' => 'Файл $1 вже Ñ–Ñнує.',
+'backend-fail-store' => 'Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ файл $1 у $2.',
+'backend-fail-copy' => 'Ðе вдалоÑÑ Ñкопіювати файл $1 в $2.',
+'backend-fail-move' => 'Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñтити файл $1 в $2.',
+'backend-fail-opentemp' => 'Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл.',
+'backend-fail-writetemp' => 'Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до тимчаÑового файлу.',
+'backend-fail-closetemp' => 'Ðе вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл.',
+'backend-fail-read' => 'Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл $1.',
+'backend-fail-create' => 'Ðе вдалоÑÑ Ñтворити файл $1.',
+'backend-fail-readonly' => 'Сервер "$1" на даний Ñ‡Ð°Ñ Ð² режимі лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ. Причина: "$2"',
+'backend-fail-synced' => 'Файл "$1" знаходитьÑÑ Ð² неузгодженому Ñтані',
+'backend-fail-connect' => 'Ðе вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ файлового Ñховища "$1".',
+'backend-fail-internal' => 'СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка у файловому Ñховищі "$1".',
+'backend-fail-contenttype' => 'Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип вміÑту файла, щоб зберегти його в "$1".',
+'backend-fail-batchsize' => 'Серверна чаÑтина отримала блок із $1 {{PLURAL:$1|файлової операції|файлових операцій}}; Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñкладає $2 {{PLURAL:$2|файлову операцію|файлових операцій}}.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ "$1"; він не заблокований.',
+'lockmanager-fail-closelock' => 'Ðе вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ "$1".',
+'lockmanager-fail-deletelock' => 'Ðе вдалоÑÑŒ вилучити файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ "$1".',
+'lockmanager-fail-acquirelock' => 'Ðе вдалоÑÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ "$1".',
+'lockmanager-fail-openlock' => 'Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ "$1".',
+'lockmanager-fail-releaselock' => 'Ðе вдалоÑÑŒ розблокувати "$1".',
+'lockmanager-fail-db-bucket' => "Ðе вдаєтьÑÑ Ð·Ð²'ÑзатиÑÑ Ð· доÑтатньою кількіÑÑ‚ÑŽ баз блокувань в Ñегменті $1.",
+'lockmanager-fail-db-release' => 'Ðе вдалоÑÑŒ знÑти Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних $1.',
+'lockmanager-fail-svr-release' => 'Ðе вдалоÑÑŒ знÑти Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ñервері $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'При відкритті ZIP-архіву Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ перевірки виникла помилка.',
'zip-wrong-format' => 'Вказаний файл не є ZIP-файлом',
@@ -1770,6 +1820,7 @@ $1',
'uploadstash-badtoken' => 'Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ вказані дії. Можливо, вичерпаний термін дії ÑеÑÑ–Ñ— редагуваннÑ. Спробуйте ще раз.',
'uploadstash-errclear' => 'ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² не вдалоÑÑ.',
'uploadstash-refresh' => 'Оновити ÑпиÑок файлів',
+'invalid-chunk-offset' => 'ÐеприпуÑтимий зÑув фрагмента',
# img_auth script messages
'img-auth-accessdenied' => 'Відмовлено в доÑтупі',
@@ -1871,7 +1922,6 @@ $1',
# File reversion
'filerevert' => 'ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ Ñтарої верÑÑ–Ñ— $1',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'Повернути верÑÑ–ÑŽ файлу',
'filerevert-intro' => "Ви повертаєте '''[[Media:$1|$1]]''' до [$4 верÑÑ–Ñ— від $3, $2].",
'filerevert-comment' => 'Причина:',
@@ -1881,24 +1931,24 @@ $1',
'filerevert-badversion' => 'Ðемає локальної верÑÑ–Ñ— цього файлу з вказаною поміткою дати Ñ– чаÑу.',
# File deletion
-'filedelete' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ $1',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'Вилучити файл',
-'filedelete-intro' => "Ви збираєтеÑÑŒ вилучити '''[[Media:$1|$1]]''' Ñ– вÑÑŽ його Ñ–Ñторію.",
-'filedelete-intro-old' => "Ви вилучаєте верÑÑ–ÑŽ '''[[Media:$1|$1]]''' від [$4 $3, $2].",
-'filedelete-comment' => 'Причина',
-'filedelete-submit' => 'Вилучити',
-'filedelete-success' => "'''$1''' було вилучено.",
-'filedelete-success-old' => "ВерÑÑ–Ñ '''[[Media:$1|$1]]''' від $3, $2 була вилучена.",
-'filedelete-nofile' => "Файл '''$1''' не Ñ–Ñнує.",
-'filedelete-nofile-old' => "Ðе Ñ–Ñнує архівної верÑÑ–Ñ— '''$1''' із зазначеними атрибутами.",
-'filedelete-otherreason' => 'Інша/додаткова причина:',
-'filedelete-reason-otherlist' => 'Інша причина',
-'filedelete-reason-dropdown' => '* Поширені причини вилученнÑ
+'filedelete' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ $1',
+'filedelete-legend' => 'Вилучити файл',
+'filedelete-intro' => "Ви збираєтеÑÑŒ вилучити '''[[Media:$1|$1]]''' Ñ– вÑÑŽ його Ñ–Ñторію.",
+'filedelete-intro-old' => "Ви вилучаєте верÑÑ–ÑŽ '''[[Media:$1|$1]]''' від [$4 $3, $2].",
+'filedelete-comment' => 'Причина',
+'filedelete-submit' => 'Вилучити',
+'filedelete-success' => "'''$1''' було вилучено.",
+'filedelete-success-old' => "ВерÑÑ–Ñ '''[[Media:$1|$1]]''' від $3, $2 була вилучена.",
+'filedelete-nofile' => "Файл '''$1''' не Ñ–Ñнує.",
+'filedelete-nofile-old' => "Ðе Ñ–Ñнує архівної верÑÑ–Ñ— '''$1''' із зазначеними атрибутами.",
+'filedelete-otherreason' => 'Інша/додаткова причина:',
+'filedelete-reason-otherlist' => 'Інша причина',
+'filedelete-reason-dropdown' => '* Поширені причини вилученнÑ
** Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ñьких прав
** файл-дублікат',
-'filedelete-edit-reasonlist' => 'Редагувати причини вилучень',
-'filedelete-maintenance' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² відімкнене на Ñ‡Ð°Ñ Ñ‚ÐµÑ…Ð½Ñ–Ñ‡Ð½Ð¸Ñ… робіт.',
+'filedelete-edit-reasonlist' => 'Редагувати причини вилучень',
+'filedelete-maintenance' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² відімкнене на Ñ‡Ð°Ñ Ñ‚ÐµÑ…Ð½Ñ–Ñ‡Ð½Ð¸Ñ… робіт.',
+'filedelete-maintenance-title' => 'Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл',
# MIME search
'mimesearch' => 'Пошук по MIME',
@@ -1993,6 +2043,8 @@ $1',
'wantedpages' => 'Ðеобхідні Ñтатті',
'wantedpages-badtitle' => 'Ðеправильний заголовок у результатах запиту: $1',
'wantedfiles' => 'Ðеобхідні файли',
+'wantedfiletext-cat' => 'ÐаÑтупні файли викориÑтовують, але вони не Ñ–Ñнують. У цей ÑпиÑок можуть помилково потрапити файли, що знаходÑÑ‚ÑŒÑÑ Ð½Ð° зовнішніх Ñховищах. Такі хибні моменти помічаютьÑÑ <del>перекреÑлюваннÑм</del>. Крім того, Ñторінки, що викориÑтовують неіÑнуюч файли, перелічені в [[:$1]].',
+'wantedfiletext-nocat' => 'ÐаÑтупні файли викориÑтовують, але вони не Ñ–Ñнують. У цей ÑпиÑок можуть помилково потрапити файли, що знаходÑÑ‚ÑŒÑÑ Ð½Ð° зовнішніх Ñховищах. Такі хибні моменти помічаютьÑÑ <del>перекреÑлюваннÑм</del>.',
'wantedtemplates' => 'Ðеобхідні шаблони',
'mostlinked' => 'Сторінки, на Ñкі найбільше поÑилань',
'mostlinkedcategories' => 'Категорії, на Ñкі найбільше поÑилань',
@@ -2001,6 +2053,7 @@ $1',
'mostimages' => 'Ðайуживаніші зображеннÑ',
'mostrevisions' => 'Статті з найбільшою кількіÑÑ‚ÑŽ редакцій',
'prefixindex' => 'Покажчик за початком назв Ñторінок',
+'prefixindex-namespace' => 'УÑÑ– Ñторінки з префікÑом (проÑÑ‚Ñ–Ñ€ назв $1)',
'shortpages' => 'Короткі Ñтатті',
'longpages' => 'Довгі Ñтатті',
'deadendpages' => 'Сторінки без поÑилань',
@@ -2017,7 +2070,7 @@ $1',
'listusers-editsonly' => 'Показати лише кориÑтувачів, Ñкі зробили принаймні одне редагуваннÑ',
'listusers-creationsort' => 'Сортувати за датою ÑтвореннÑ',
'usereditcount' => '$1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}}',
-'usercreated' => 'Створений $1 о $2',
+'usercreated' => '{{GENDER:$3|Створено}} $1 о $2',
'newpages' => 'Ðові Ñторінки',
'newpages-username' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
'ancientpages' => 'Сторінки, Ñкі найдовше не редагувалиÑÑ',
@@ -2111,12 +2164,8 @@ $1',
'activeusers-noresult' => 'Ðе знайдено кориÑтувачів.',
# Special:Log/newusers
-'newuserlogpage' => 'Журнал нових кориÑтувачів',
-'newuserlogpagetext' => 'СпиÑок нещодавно зареєÑтрованих кориÑтувачів.',
-'newuserlog-byemail' => 'пароль надіÑланий електронною поштою',
-'newuserlog-create-entry' => 'Ðовий кориÑтувач',
-'newuserlog-create2-entry' => 'Ñтворив новий обліковий Ð·Ð°Ð¿Ð¸Ñ $1',
-'newuserlog-autocreate-entry' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ñтворений автоматично',
+'newuserlogpage' => 'Журнал нових кориÑтувачів',
+'newuserlogpagetext' => 'СпиÑок нещодавно зареєÑтрованих кориÑтувачів.',
# Special:ListGroupRights
'listgrouprights' => 'Права груп кориÑтувачів',
@@ -2147,7 +2196,7 @@ $1',
'emailpagetext' => 'Заповнивши наведену нижче форму, можна надіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð¼Ñƒ кориÑтувачу.
Електронна адреÑа, Ñку ви зазначили у [[Special:Preferences|Ñвоїх налаштуваннÑÑ…]], буде зазначена в полі «Від кого» лиÑта, тому одержувач матиме можливіÑÑ‚ÑŒ відповіÑти безпоÑередньо вам.',
'usermailererror' => 'При відправці Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°:',
-'defemailsubject' => '{{SITENAME}}: лиÑÑ‚',
+'defemailsubject' => '{{SITENAME}} - електронний лиÑÑ‚ від кориÑтувача " $1 "',
'usermaildisabled' => 'Електронне лиÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ кориÑтувачами вимкнене',
'usermaildisabledtext' => 'Ви не можете надÑилати електронні лиÑти іншим кориÑтувачам цієї вікі',
'noemailtitle' => 'ВідÑÑƒÑ‚Ð½Ñ Ð°Ð´Ñ€ÐµÑа електронної пошти',
@@ -2202,7 +2251,7 @@ $1',
'watchmethod-list' => 'переглÑд Ñтатей за Ñкими ведетьÑÑ ÑпоÑтереженнÑ',
'watchlistcontains' => 'Ваш ÑпиÑок ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ñтить $1 {{PLURAL:$1|Ñторінку|Ñторінки|Ñторінок}}.',
'iteminvalidname' => 'Проблема з елементом «$1», недопуÑтима назва…',
-'wlnote' => 'Ðижче наведені оÑтанні $1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}} за {{PLURAL:$2|оÑтанню|оÑтанні|оÑтанні}} <strong>$2</strong> {{PLURAL:$2|годину|години|годин}}.',
+'wlnote' => 'Ðижче наведено {{PLURAL:$1|оÑтаннє $1 редагуваннÑ|оÑтанні $1 редагуваннÑ|оÑтанні $1 редагувань}} за {{PLURAL:$2|оÑтанню|оÑтанні|оÑтанні}} <strong>$2</strong> {{PLURAL:$2|годину|години|годин}}, на Ñ‡Ð°Ñ $3 $4.',
'wlshowlast' => 'Показати зміни за оÑтанні $1 годин $2 днів $3',
'watchlist-options' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку ÑпоÑтереженнÑ',
@@ -2259,7 +2308,6 @@ $UNWATCHURL
'exbeforeblank' => 'зміÑÑ‚ до очиÑтки: «$1»',
'exblank' => 'ÑÑ‚Ð°Ñ‚Ñ‚Ñ Ð±ÑƒÐ»Ð° порожньою',
'delete-confirm' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Â«$1»',
-'delete-backlink' => '↠$1',
'delete-legend' => 'ВилученнÑ',
'historywarning' => "'''ПопередженнÑ:''' Сторінка, Ñку ви збираєтеÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸, має Ñ–Ñторію редагувань з приблизно $1 {{PLURAL:$1|верÑÑ–Ñ—|верÑій}}:",
'confirmdeletetext' => 'Ви збираєтеÑÑŒ вилучити Ñторінку Ñ– вÑÑ– Ñ—Ñ— журнали редагувань з бази даних.
@@ -2268,8 +2316,6 @@ $UNWATCHURL
'actionfailed' => 'Виконати дію не вдалоÑÑ',
'deletedtext' => '"$1" було вилучено.
Див. $2 Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду ÑпиÑку оÑтанніх вилучень.',
-'deletedarticle' => 'вилучив «[[$1]]»',
-'suppressedarticle' => 'прихована «[[$1]]»',
'dellogpage' => 'Журнал вилучень',
'dellogpagetext' => 'Ðижче наведений ÑпиÑок оÑтанніх вилучень.',
'deletionlog' => 'журнал вилучень',
@@ -2317,8 +2363,10 @@ $UNWATCHURL
'unprotectedarticle' => 'знÑто захиÑÑ‚ зі Ñторінки "[[$1]]"',
'movedarticleprotection' => 'Ð¿ÐµÑ€ÐµÐ½Ñ–Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту з «[[$2]]» на «[[$1]]»',
'protect-title' => 'Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту Ð´Ð»Ñ Â«$1»',
+'protect-title-notallowed' => 'ПереглÑд рівню захиÑту "$1"',
'prot_1movedto2' => '«[[$1]]» перейменована на «[[$2]]»',
-'protect-backlink' => '↠$1',
+'protect-badnamespace-title' => 'БеззахиÑний проÑÑ‚Ñ–Ñ€ імен',
+'protect-badnamespace-text' => 'Сторінки у проÑторі імен не можуть бути захищені.',
'protect-legend' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту',
'protectcomment' => 'Причина:',
'protectexpiry' => 'ЗакінчуєтьÑÑ:',
@@ -2339,6 +2387,7 @@ $UNWATCHURL
'protect-level-sysop' => 'Тільки адмініÑтратори',
'protect-summary-cascade' => 'каÑкадний',
'protect-expiring' => 'закінчуєтьÑÑ $1 (UTC)',
+'protect-expiring-local' => 'закінчуєтьÑÑ $1',
'protect-expiry-indefinite' => 'безÑтроково',
'protect-cascade' => 'ЗахиÑтити Ñторінки, що включені до цієї Ñторінки (каÑкадний захиÑÑ‚)',
'protect-cantedit' => 'Ви не можете змінювати рівень захиÑту цієї Ñторінки, тому що ви не маєте прав Ð´Ð»Ñ Ñ—Ñ— редагуваннÑ.',
@@ -2394,7 +2443,6 @@ $UNWATCHURL
'undeletereset' => 'ОчиÑтити',
'undeleteinvert' => 'Інвертувати виділеннÑ',
'undeletecomment' => 'Причина:',
-'undeletedarticle' => 'відновив «[[$1]]»',
'undeletedrevisions' => '$1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}} відновлено',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|верÑÑ–Ñ|верÑÑ–Ñ—|верÑій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено',
'undeletedfiles' => '$1 {{PLURAL:$1|файл|файли|файлів}} відновлено',
@@ -2403,6 +2451,7 @@ $UNWATCHURL
Див. [[Special:Log/delete|ÑпиÑок вилучень]], щоб дізнатиÑÑ Ð¿Ñ€Ð¾ оÑтанні Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð° відновленнÑ.",
'undelete-header' => 'СпиÑок нещодавно вилучених Ñторінок можна переглÑнути в [[Special:Log/delete|журналі вилучень]].',
+'undelete-search-title' => 'Пошук видалених Ñторінок',
'undelete-search-box' => 'Пошук вилучених Ñторінок',
'undelete-search-prefix' => 'Показати Ñторінки, що починаютьÑÑ Ð·:',
'undelete-search-submit' => 'Знайти',
@@ -2411,6 +2460,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'Ðеможливо відновити верÑÑ–ÑŽ файлу з позначкою чаÑу $1: файл був відÑутнім до вилученнÑ.',
'undelete-cleanup-error' => 'Помилка Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð½Ð¾Ð³Ð¾ файлу, що не викориÑтовуєтьÑÑ, «$1».',
'undelete-missing-filearchive' => 'Ðеможливо відновити файл з архівним ідентифікатором $1, так Ñк він відÑутній у базі даних. Можливо, файл уже був відновлений.',
+'undelete-error' => 'Помилка Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñторінки',
'undelete-error-short' => 'Помилка Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ: $1',
'undelete-error-long' => 'Під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ виникли помилки:
@@ -2457,7 +2507,6 @@ $1',
'whatlinkshere' => 'ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñюди',
'whatlinkshere-title' => 'Сторінки, що поÑилаютьÑÑ Ð½Ð° «$1»',
'whatlinkshere-page' => 'Сторінка:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "ÐаÑтупні Ñторінки поÑилаютьÑÑ Ð½Ð° '''[[:$1]]''':",
'nolinkshere' => "Ðа Ñтаттю '''[[:$1]]''' не вказує жодна ÑтаттÑ.",
'nolinkshere-ns' => "У вибраному проÑторі назв нема Ñторінок, що поÑилаютьÑÑ Ð½Ð° '''[[:$1]]'''.",
@@ -2532,6 +2581,7 @@ $1',
'blocklist-userblocks' => 'Сховати Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів',
'blocklist-tempblocks' => 'Сховати тимчаÑові блокуваннÑ',
'blocklist-addressblocks' => 'Приховати Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¾ÐºÑ€ÐµÐ¼Ð¸Ñ… IP-адреÑ',
+'blocklist-rangeblocks' => 'Приховати Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ–Ð²',
'blocklist-timestamp' => 'ЧаÑова позначка',
'blocklist-target' => 'Мета',
'blocklist-expiry' => 'ЗакінчуєтьÑÑ',
@@ -2554,6 +2604,7 @@ $1',
'unblocklink' => 'розблокувати',
'change-blocklink' => 'змінити блокуваннÑ',
'contribslink' => 'внеÑок',
+'emaillink' => 'ÐадіÑлати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою',
'autoblocker' => 'ДоÑтуп заблоковано автоматично, тому що ви викориÑтовуєте ту Ñаму адреÑу, що й "[[User:$1|$1]]". Причина Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ $1: "$2".',
'blocklogpage' => 'Журнал блокувань',
'blocklog-showlog' => 'Цього кориÑтувача вже заблоковано. Далі наведено журнал блокувань:',
@@ -2677,9 +2728,6 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'movepage-page-moved' => 'Сторінка $1 перейменована на $2.',
'movepage-page-unmoved' => 'Сторінка $1 не може бути перейменована на $2.',
'movepage-max-pages' => '$1 {{PLURAL:$1|Ñторінка була перейменована|Ñторінки були перейменовані|Ñторінок були перейменовані}} — це макÑимум, більше Ñторінок не можна перейменувати автоматично.',
-'1movedto2' => 'перейменував «[[$1]]» на «[[$2]]»',
-'1movedto2_redir' => 'перейменував «[[$1]]» на «[[$2]]» поверх перенаправленнÑ',
-'move-redirect-suppressed' => 'Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ñ– Ñтарої назви не Ñтворене',
'movelogpage' => 'Журнал перейменувань',
'movelogpagetext' => 'Далі подано ÑпиÑок перейменованих Ñторінок.',
'movesubpage' => '{{PLURAL:$1|ПідÑторінка|ПідÑторінки}}',
@@ -2692,7 +2740,7 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
Сторінка з назвою [[:$1|«$1»]] вже Ñ–Ñнує.
Бажаєте вилучити Ñ—Ñ— Ð´Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– перейменуваннÑ?',
'delete_and_move_confirm' => 'Так, вилучити цю Ñторінку',
-'delete_and_move_reason' => 'Вилучена Ð´Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– перейменуваннÑ',
+'delete_and_move_reason' => 'Вилучена Ð´Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінки «[[$1]]»',
'selfmove' => 'Ðеможливо перейменувати Ñторінку: поточна й нова назви Ñторінки Ñпівпадають.',
'immobile-source-namespace' => 'Ðе можна перейменовувати Ñторінки з проÑтору назв «$1»',
'immobile-target-namespace' => 'Ðе можна перейменовувати Ñторінки до проÑтору назв «$1»',
@@ -2721,9 +2769,11 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
Щоб екÑпортувати Ñторінки, введіть Ñ—Ñ… назви в поле редагуваннÑ, одну назву на Ñ€Ñдок Ñ– оберіть, бажаєте ви екÑпортувати вÑÑŽ Ñ–Ñторію змін Ñторінок чи тільки оÑтанні верÑÑ–Ñ— Ñтатей.
Ви також можете викориÑтовувати Ñпеціальну адреÑу Ð´Ð»Ñ ÐµÐºÑпорту тільки оÑтанньої верÑÑ–Ñ—. Ðаприклад, Ð´Ð»Ñ Ñторінки «[[{{MediaWiki:Mainpage}}]]» Ñ†Ñ Ð°Ð´Ñ€ÐµÑа така: [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'ЕкÑпортувати вÑÑ– Ñторінки',
'exportcuronly' => 'Включати тільки поточну верÑÑ–ÑŽ, без повної Ñ–Ñторії',
'exportnohistory' => "----
'''ЗауваженнÑ:''' екÑпорт вÑієї Ñ–Ñторії змін Ñторінок вимкнутий через проблеми з реÑурÑами.",
+'exportlistauthors' => 'Включити повний перелік вкладників Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— Ñторінки',
'export-submit' => 'ЕкÑпорт',
'export-addcattext' => 'Додати Ñторінки з категорії:',
'export-addcat' => 'Додати',
@@ -2756,6 +2806,8 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'thumbnail_error' => 'Помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð°Ñ‚ÑŽÑ€Ð¸: $1',
'djvu_page_error' => 'Ðомер Ñторінки DjVu недоÑÑжний',
'djvu_no_xml' => 'Ðеможливо отримати XML Ð´Ð»Ñ DjVu',
+'thumbnail-temp-create' => 'Ðе вдалоÑÑ Ñтворити тимчаÑовий файл мініатюри',
+'thumbnail-dest-create' => 'Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ мініатюру до міÑÑ†Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ',
'thumbnail_invalid_params' => 'Помилковий параметр мініатюри',
'thumbnail_dest_directory' => 'Ðеможливо Ñтворити цільову директорію',
'thumbnail_image-type' => 'Тип Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ',
@@ -2799,6 +2851,11 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'import-upload' => 'Завантажити XML-дані',
'import-token-mismatch' => 'Утрачені дані ÑеанÑу. Будь лаÑка, Ñпробуйте ще раз.',
'import-invalid-interwiki' => 'Ðеможливо імпортувати із зазначеної вікі.',
+'import-error-edit' => 'Сторінку "$1" не імпортовано, оÑкільки вам не дозволено Ñ—Ñ— редагувати.',
+'import-error-create' => 'Сторінку "$1" не імпортовано, оÑкільки вам не дозволено Ñ—Ñ— Ñтворювати.',
+'import-error-interwiki' => 'Сторінку "$1" не імпортовано, оÑкільки Ñ—Ñ— назва зарезервована Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… поÑилань (interwiki).',
+'import-error-special' => 'Сторінку "$1" не імпортовано, оÑкільки вона належить до оÑобливого проÑтору імен, що не дозволÑÑ” ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñторінок.',
+'import-error-invalid' => 'Сторінку "$1" не імпортовано, оÑкільки його ім\'Ñ Ð½ÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑтиме.',
# Import log
'importlogpage' => 'Журнал імпорту',
@@ -2808,72 +2865,85 @@ IP-адреÑи, що блокуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ тут не в
'import-logentry-interwiki' => '«$1» — міжвікі імпорт',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|верÑÑ–Ñ|верÑÑ–Ñ—|верÑій}} з $2',
+# JavaScriptTest
+'javascripttest' => 'ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ JavaScript',
+'javascripttest-disabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°.',
+'javascripttest-title' => 'Працює $1 випробувань',
+'javascripttest-pagetext-noframework' => 'Ð¦Ñ Ñторінка призначений Ð´Ð»Ñ Ñ‚ÐµÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Ðевідоме Ñередовище теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ " $1 ".',
+'javascripttest-pagetext-frameworks' => 'Будь лаÑка, оберіть одне з наÑтупних Ñередовищ теÑтуваннÑ: $1',
+'javascripttest-pagetext-skins' => 'Виберіть Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ñторінки запуÑку теÑту:',
+'javascripttest-qunit-intro' => 'ПереглÑнути [ $1 теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ—] на mediawiki.org.',
+'javascripttest-qunit-heading' => 'Ðабір теÑтів MediaWiki JavaScript QUnit',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ваша Ñторінка кориÑтувача',
-'tooltip-pt-anonuserpage' => 'Сторінка кориÑтувача Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— IP-адреÑи',
-'tooltip-pt-mytalk' => 'Ваша Ñторінка обговореннÑ',
-'tooltip-pt-anontalk' => 'ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½ÑŒ з цієї IP-адреÑи',
-'tooltip-pt-preferences' => 'Ваші налаштуваннÑ',
-'tooltip-pt-watchlist' => 'СпиÑок Ñторінок, за Ñкими Ñ ÑпоÑтерігаю',
-'tooltip-pt-mycontris' => 'Ваш внеÑок',
-'tooltip-pt-login' => "Тут можна зареєÑтруватиÑÑ Ð² ÑиÑтемі, але це не обов'Ñзково.",
-'tooltip-pt-anonlogin' => "Тут можна зареєÑтруватиÑÑ Ð² ÑиÑтемі, але це не обов'Ñзково.",
-'tooltip-pt-logout' => 'Вихід із ÑиÑтеми',
-'tooltip-ca-talk' => 'ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту Ñторінки',
-'tooltip-ca-edit' => 'Ви можете редагувати цю Ñторінку. Будь лаÑка, викориÑтовуйте кнопку попереднього переглÑду перед збереженнÑм',
-'tooltip-ca-addsection' => 'Створити новий розділ',
-'tooltip-ca-viewsource' => 'Ð¦Ñ Ñторінка захищена від змін. Ви можете переглÑнути Ñ– Ñкопіювати Ñ—Ñ— вихідний текÑÑ‚.',
-'tooltip-ca-history' => 'Журнал змін Ñторінки',
-'tooltip-ca-protect' => 'ЗахиÑтити Ñторінку від змін',
-'tooltip-ca-unprotect' => 'ЗнÑти захиÑÑ‚ з цієї Ñторінки',
-'tooltip-ca-delete' => 'Вилучити цю Ñторінку',
-'tooltip-ca-undelete' => 'Відновити зміни Ñторінки, зроблені до Ñ—Ñ— вилученнÑ',
-'tooltip-ca-move' => 'Перейменувати цю Ñторінку',
-'tooltip-ca-watch' => 'Додати цю Ñторінку до вашого ÑпиÑку ÑпоÑтереженнÑ',
-'tooltip-ca-unwatch' => 'Вилучити цю Ñторінку з вашого ÑпиÑку ÑпоÑтереженнÑ',
-'tooltip-search' => 'Шукати у {{GRAMMAR:locative|{{SITENAME}}}}',
-'tooltip-search-go' => 'Перейти до Ñторінки, що має точно таку назву (Ñкщо вона Ñ–Ñнує)',
-'tooltip-search-fulltext' => 'Знайти Ñторінки, що міÑÑ‚ÑÑ‚ÑŒ зазначений текÑÑ‚',
-'tooltip-p-logo' => 'Головна Ñторінка',
-'tooltip-n-mainpage' => 'Перейти на Головну Ñторінку',
-'tooltip-n-mainpage-description' => 'Перейти на головну Ñторінку',
-'tooltip-n-portal' => 'Про проект, про те, що ви можете зробити, Ñ– що де знаходитьÑÑ',
-'tooltip-n-currentevents' => 'СпиÑок поточних подій',
-'tooltip-n-recentchanges' => 'Перелік оÑтанніх змін',
-'tooltip-n-randompage' => 'ПереглÑнути випадкову Ñторінку',
-'tooltip-n-help' => 'Довідка з проекту',
-'tooltip-t-whatlinkshere' => 'Перелік уÑÑ–Ñ… Ñторінок, Ñкі поÑилаютьÑÑ Ð½Ð° цю Ñторінку',
-'tooltip-t-recentchangeslinked' => 'ОÑтанні зміни на Ñторінках, на Ñкі поÑилаєтьÑÑ Ñ†Ñ Ñторінка',
-'tooltip-feed-rss' => 'ТранÑлÑÑ†Ñ–Ñ Ð² RSS Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки',
-'tooltip-feed-atom' => 'ТранÑлÑÑ†Ñ–Ñ Ð² Atom Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки',
-'tooltip-t-contributions' => 'ПереглÑд внеÑку цього кориÑтувача',
-'tooltip-t-emailuser' => 'ÐадіÑлати лиÑта цьому кориÑтувачеві',
-'tooltip-t-upload' => 'Завантажити файли',
-'tooltip-t-specialpages' => 'Перелік Ñпеціальних Ñторінок',
-'tooltip-t-print' => 'ВерÑÑ–Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ',
-'tooltip-t-permalink' => 'ПоÑтійне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° цю верÑÑ–ÑŽ Ñторінки',
-'tooltip-ca-nstab-main' => 'ВміÑÑ‚ Ñтатті',
-'tooltip-ca-nstab-user' => 'ПереглÑд Ñторінки кориÑтувача',
-'tooltip-ca-nstab-media' => 'Медіа-файл',
-'tooltip-ca-nstab-special' => 'Це Ñпеціальна Ñторінка, вона недоÑтупна Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ',
-'tooltip-ca-nstab-project' => 'Сторінка проекту',
-'tooltip-ca-nstab-image' => 'Сторінка зображеннÑ',
-'tooltip-ca-nstab-mediawiki' => 'Сторінка Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ MediaWiki',
-'tooltip-ca-nstab-template' => 'Сторінка шаблону',
-'tooltip-ca-nstab-help' => 'Сторінка довідки',
-'tooltip-ca-nstab-category' => 'Сторінка категорії',
-'tooltip-minoredit' => 'Позначити це Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñк незначне',
-'tooltip-save' => 'Зберегти ваші зміни',
-'tooltip-preview' => 'Попередній переглÑд Ñторінки, будь лаÑка, викориÑтовуйте перед збереженнÑм!',
-'tooltip-diff' => 'Показати зміни, що зроблені відноÑно початкового текÑту.',
-'tooltip-compareselectedversions' => 'ПереглÑнути різницю між двома вказаними верÑÑ–Ñми цієї Ñторінки.',
-'tooltip-watch' => 'Додати поточну Ñторінку до ÑпиÑку ÑпоÑтереженнÑ',
-'tooltip-recreate' => 'Відновити Ñторінку недивлÑчиÑÑŒ на те, що Ñ—Ñ— вилучено',
-'tooltip-upload' => 'Почати завантаженнÑ',
-'tooltip-rollback' => 'Одним кліком прибрати зміни, зроблені оÑтаннім редактором',
-'tooltip-undo' => 'Прибрати внеÑені зміни Ñ– показати попередній переглÑд. ДозволÑÑ” зазначити причину ÑкаÑуваннÑ.',
-'tooltip-preferences-save' => 'Зберегти налаштуваннÑ',
-'tooltip-summary' => 'Введіть короткий опиÑ',
+'tooltip-pt-userpage' => 'Ваша Ñторінка кориÑтувача',
+'tooltip-pt-anonuserpage' => 'Сторінка кориÑтувача Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— IP-адреÑи',
+'tooltip-pt-mytalk' => 'Ваша Ñторінка обговореннÑ',
+'tooltip-pt-anontalk' => 'ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½ÑŒ з цієї IP-адреÑи',
+'tooltip-pt-preferences' => 'Ваші налаштуваннÑ',
+'tooltip-pt-watchlist' => 'СпиÑок Ñторінок, за Ñкими Ñ ÑпоÑтерігаю',
+'tooltip-pt-mycontris' => 'Ваш внеÑок',
+'tooltip-pt-login' => "Тут можна зареєÑтруватиÑÑ Ð² ÑиÑтемі, але це не обов'Ñзково.",
+'tooltip-pt-anonlogin' => "Тут можна зареєÑтруватиÑÑ Ð² ÑиÑтемі, але це не обов'Ñзково.",
+'tooltip-pt-logout' => 'Вихід із ÑиÑтеми',
+'tooltip-ca-talk' => 'ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту Ñторінки',
+'tooltip-ca-edit' => 'Ви можете редагувати цю Ñторінку. Будь лаÑка, викориÑтовуйте кнопку попереднього переглÑду перед збереженнÑм',
+'tooltip-ca-addsection' => 'Створити новий розділ',
+'tooltip-ca-viewsource' => 'Ð¦Ñ Ñторінка захищена від змін. Ви можете переглÑнути Ñ– Ñкопіювати Ñ—Ñ— вихідний текÑÑ‚.',
+'tooltip-ca-history' => 'Журнал змін Ñторінки',
+'tooltip-ca-protect' => 'ЗахиÑтити Ñторінку від змін',
+'tooltip-ca-unprotect' => 'ЗнÑти захиÑÑ‚ з цієї Ñторінки',
+'tooltip-ca-delete' => 'Вилучити цю Ñторінку',
+'tooltip-ca-undelete' => 'Відновити зміни Ñторінки, зроблені до Ñ—Ñ— вилученнÑ',
+'tooltip-ca-move' => 'Перейменувати цю Ñторінку',
+'tooltip-ca-watch' => 'Додати цю Ñторінку до вашого ÑпиÑку ÑпоÑтереженнÑ',
+'tooltip-ca-unwatch' => 'Вилучити цю Ñторінку з вашого ÑпиÑку ÑпоÑтереженнÑ',
+'tooltip-search' => 'Шукати у {{GRAMMAR:locative|{{SITENAME}}}}',
+'tooltip-search-go' => 'Перейти до Ñторінки, що має точно таку назву (Ñкщо вона Ñ–Ñнує)',
+'tooltip-search-fulltext' => 'Знайти Ñторінки, що міÑÑ‚ÑÑ‚ÑŒ зазначений текÑÑ‚',
+'tooltip-p-logo' => 'Головна Ñторінка',
+'tooltip-n-mainpage' => 'Перейти на Головну Ñторінку',
+'tooltip-n-mainpage-description' => 'Перейти на головну Ñторінку',
+'tooltip-n-portal' => 'Про проект, про те, що ви можете зробити, Ñ– що де знаходитьÑÑ',
+'tooltip-n-currentevents' => 'СпиÑок поточних подій',
+'tooltip-n-recentchanges' => 'Перелік оÑтанніх змін',
+'tooltip-n-randompage' => 'ПереглÑнути випадкову Ñторінку',
+'tooltip-n-help' => 'Довідка з проекту',
+'tooltip-t-whatlinkshere' => 'Перелік уÑÑ–Ñ… Ñторінок, Ñкі поÑилаютьÑÑ Ð½Ð° цю Ñторінку',
+'tooltip-t-recentchangeslinked' => 'ОÑтанні зміни на Ñторінках, на Ñкі поÑилаєтьÑÑ Ñ†Ñ Ñторінка',
+'tooltip-feed-rss' => 'ТранÑлÑÑ†Ñ–Ñ Ð² RSS Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки',
+'tooltip-feed-atom' => 'ТранÑлÑÑ†Ñ–Ñ Ð² Atom Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки',
+'tooltip-t-contributions' => 'ПереглÑд внеÑку цього кориÑтувача',
+'tooltip-t-emailuser' => 'ÐадіÑлати лиÑта цьому кориÑтувачеві',
+'tooltip-t-upload' => 'Завантажити файли',
+'tooltip-t-specialpages' => 'Перелік Ñпеціальних Ñторінок',
+'tooltip-t-print' => 'ВерÑÑ–Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ',
+'tooltip-t-permalink' => 'ПоÑтійне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° цю верÑÑ–ÑŽ Ñторінки',
+'tooltip-ca-nstab-main' => 'ВміÑÑ‚ Ñтатті',
+'tooltip-ca-nstab-user' => 'ПереглÑд Ñторінки кориÑтувача',
+'tooltip-ca-nstab-media' => 'Медіа-файл',
+'tooltip-ca-nstab-special' => 'Це Ñпеціальна Ñторінка, вона недоÑтупна Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ',
+'tooltip-ca-nstab-project' => 'Сторінка проекту',
+'tooltip-ca-nstab-image' => 'Сторінка зображеннÑ',
+'tooltip-ca-nstab-mediawiki' => 'Сторінка Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ MediaWiki',
+'tooltip-ca-nstab-template' => 'Сторінка шаблону',
+'tooltip-ca-nstab-help' => 'Сторінка довідки',
+'tooltip-ca-nstab-category' => 'Сторінка категорії',
+'tooltip-minoredit' => 'Позначити це Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñк незначне',
+'tooltip-save' => 'Зберегти ваші зміни',
+'tooltip-preview' => 'Попередній переглÑд Ñторінки, будь лаÑка, викориÑтовуйте перед збереженнÑм!',
+'tooltip-diff' => 'Показати зміни, що зроблені відноÑно початкового текÑту.',
+'tooltip-compareselectedversions' => 'ПереглÑнути різницю між двома вказаними верÑÑ–Ñми цієї Ñторінки.',
+'tooltip-watch' => 'Додати поточну Ñторінку до ÑпиÑку ÑпоÑтереженнÑ',
+'tooltip-watchlistedit-normal-submit' => 'Вилучити заголовки',
+'tooltip-watchlistedit-raw-submit' => 'Оновити ÑпиÑок ÑпоÑтереженнÑ',
+'tooltip-recreate' => 'Відновити Ñторінку недивлÑчиÑÑŒ на те, що Ñ—Ñ— вилучено',
+'tooltip-upload' => 'Почати завантаженнÑ',
+'tooltip-rollback' => 'Одним кліком прибрати зміни, зроблені оÑтаннім редактором',
+'tooltip-undo' => 'Прибрати внеÑені зміни Ñ– показати попередній переглÑд. ДозволÑÑ” зазначити причину ÑкаÑуваннÑ.',
+'tooltip-preferences-save' => 'Зберегти налаштуваннÑ',
+'tooltip-summary' => 'Введіть короткий опиÑ',
# Stylesheets
'common.css' => '/** Розміщений тут CSS буде заÑтоÑовуватиÑÑ Ð´Ð¾ вÑÑ–Ñ… тем Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
@@ -2985,9 +3055,6 @@ The wiki server can't provide data in a format your client can read.",
# Patrol log
'patrol-log-page' => 'Журнал патрулюваннÑ',
'patrol-log-header' => 'Це журнал перевірених змін.',
-'patrol-log-line' => 'перевірив $1 Ñторінки $2 $3',
-'patrol-log-auto' => '(автоматично)',
-'patrol-log-diff' => 'верÑÑ–ÑŽ $1',
'log-show-hide-patrol' => '$1 журнал патрулюваннÑ',
# Image deletion
@@ -3014,11 +3081,11 @@ $1',
'file-info' => 'розмір файлу: $1, MIME-тип: $2',
'file-info-size' => '$1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4',
'file-info-size-pages' => '$1 × $2 пікÑелів, розмір файлу: $3, MIME-тип: $4, $5 {{PLURAL:$5|Ñторінка|Ñторінки|Ñторінок}}',
-'file-nohires' => '<small>Ðема верÑÑ–Ñ— з більшою роздільніÑÑ‚ÑŽ.</small>',
+'file-nohires' => 'Ðема верÑÑ–Ñ— з більшою роздільніÑÑ‚ÑŽ.',
'svg-long-desc' => 'SVG-файл, номінально $1 × $2 пікÑелів, розмір файлу: $3',
'show-big-image' => 'Повна роздільніÑÑ‚ÑŒ',
-'show-big-image-preview' => '<small>Розмір при попередньому переглÑді: $1.</small>',
-'show-big-image-other' => '<small>Інші роздільноÑÑ‚Ñ–: $1.</small>',
+'show-big-image-preview' => 'Розмір при попередньому переглÑді: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Інша роздільна здатніÑÑ‚ÑŒ|Інші роздільні здатноÑÑ‚Ñ–Ñ–}}: $1.',
'show-big-image-size' => '$1 × $2 пікÑелів',
'file-info-gif-looped' => 'кільцеве',
'file-info-gif-frames' => '$1 {{PLURAL:$1|кадр|кадри|кадрів}}',
@@ -3040,10 +3107,15 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 'Ñ',
-'minutes-abbrev' => 'хв',
-'hours-abbrev' => 'г',
-'days-abbrev' => 'д',
+'seconds-abbrev' => '$1Ñ',
+'minutes-abbrev' => '$1хв',
+'hours-abbrev' => '$1год',
+'days-abbrev' => '$1діб',
+'seconds' => '{{PLURAL:$1|$1 Ñекунда|$1 Ñекунди|$1 Ñекунд}}',
+'minutes' => '{{PLURAL:$1|$1 хвилина|$1 хвилини|$1 хвилин}}',
+'hours' => '{{PLURAL:$1|$1 година|$1 години|$1 годин}}',
+'days' => '{{PLURAL:$1|$1 день|$1 дні|$1 днів}}',
+'ago' => '$1 тому',
# Bad image list
'bad_image_list' => 'Формат має бути наÑтупним:
@@ -3632,15 +3704,6 @@ $5
'scarytranscludefailed' => '[Помилка Ð·Ð²ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ шаблону $1]',
'scarytranscludetoolong' => '[URL дуже довгий]',
-# Trackbacks
-'trackbackbox' => 'Trackback Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñтатті:<br />
-$1',
-'trackback' => '; $4 $5: [$2 $1]',
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 вилучити])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Trackback вилучено.',
-
# Delete conflict
'deletedwhileediting' => "'''Увага:''' Ñ†Ñ Ñторінка була вилучена піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк ви розпочали редагуваннÑ!",
'confirmrecreate' => "КориÑтувач [[User:$1|$1]] ([[User talk:$1|обговореннÑ]]) вилучив цю Ñторінку піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк ви почали Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– зазначив причиною:
@@ -3797,6 +3860,7 @@ $1',
'hebrew-calendar-m12-gen' => 'Елула',
# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обговореннÑ]])',
'timezone-utc' => 'UTC',
# Core parser functions
@@ -3856,8 +3920,8 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'specialpages' => 'Спеціальні Ñторінки',
'specialpages-note' => '----
* Звичайні Ñлужбові Ñторінки
-* <span class="mw-specialpagerestricted">Restricted special pages.</span>
-* <span class="mw-specialpagecached">Cached special pages (might be obsolete).</span>',
+* <span class="mw-specialpagerestricted">Сторінки з обмеженим доÑтупом.</span>
+* <span class="mw-specialpagecached">Кешовані Ñторінки (можуть бути заÑтарілими).</span>',
'specialpages-group-maintenance' => 'Технічні звіти',
'specialpages-group-other' => 'Інші',
'specialpages-group-login' => 'Вхід до ÑиÑтеми / реєÑтраціÑ',
@@ -3899,13 +3963,16 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
# Special:ComparePages
-'comparepages' => 'ПорівнÑÐ½Ð½Ñ Ñторінок',
-'compare-selector' => 'ПорівнÑÐ½Ð½Ñ Ð²ÐµÑ€Ñій Ñторінок',
-'compare-page1' => 'Сторінка 1',
-'compare-page2' => 'Сторінка 2',
-'compare-rev1' => 'ВерÑÑ–Ñ 1',
-'compare-rev2' => 'ВерÑÑ–Ñ 2',
-'compare-submit' => 'ПорівнÑти',
+'comparepages' => 'ПорівнÑÐ½Ð½Ñ Ñторінок',
+'compare-selector' => 'ПорівнÑÐ½Ð½Ñ Ð²ÐµÑ€Ñій Ñторінок',
+'compare-page1' => 'Сторінка 1',
+'compare-page2' => 'Сторінка 2',
+'compare-rev1' => 'ВерÑÑ–Ñ 1',
+'compare-rev2' => 'ВерÑÑ–Ñ 2',
+'compare-submit' => 'ПорівнÑти',
+'compare-invalid-title' => 'Зазначена назва неприпуÑтима.',
+'compare-title-not-exists' => 'Зазначена назва не Ñ–Ñнує.',
+'compare-revision-not-exists' => 'Зазначеної верÑÑ–Ñ— не Ñ–Ñнує.',
# Database error messages
'dberr-header' => 'Ð¦Ñ Ð²Ñ–ÐºÑ– має проблеми',
@@ -3932,4 +3999,90 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'sqlite-has-fts' => '$1 з підтримкою повнотекÑтового пошуку',
'sqlite-no-fts' => '$1 без підтримки повнотекÑтового пошуку',
+# New logging system
+'logentry-delete-delete' => '$1 вилучив Ñторінку $3',
+'logentry-delete-restore' => '$1 відновив Ñторінку $3',
+'logentry-delete-event' => '$1 змінив видиміÑÑ‚ÑŒ {{PLURAL:$5 запиÑу журнала|$5 запиÑів журналу}} на $3: $4',
+'logentry-delete-revision' => '$1 змінив видиміÑÑ‚ÑŒ {{PLURAL:$5 верÑÑ–Ñ—|$5 верÑій}} на Ñторінці $3: $4',
+'logentry-delete-event-legacy' => '$1 змінив видиміÑÑ‚ÑŒ запиÑів журналу подій $3',
+'logentry-delete-revision-legacy' => '$1 змінив видиміÑÑ‚ÑŒ верÑійна Ñторінці $3',
+'logentry-suppress-delete' => '$1 подавив Ñторінку $3',
+'logentry-suppress-event' => '$1 приховано змінив видиміÑÑ‚ÑŒ Ð´Ð»Ñ {{PLURAL:$5|запиÑу|$5 запиÑів}} журналу на $3: $4',
+'logentry-suppress-revision' => '$1 приховано змінив видиміÑÑ‚ÑŒ Ð´Ð»Ñ {{PLURAL:$5 верÑÑ–Ñ—|$5 верÑій}} на Ñторінці $3: $4',
+'logentry-suppress-event-legacy' => '$1 приховано змінив видиміÑÑ‚ÑŒ запиÑів журналу $3',
+'logentry-suppress-revision-legacy' => '$1 приховано змінив видиміÑÑ‚ÑŒ верÑій на Ñторінці $3',
+'revdelete-content-hid' => 'вміÑÑ‚ приховано',
+'revdelete-summary-hid' => 'Ð¾Ð¿Ð¸Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¾',
+'revdelete-uname-hid' => "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача приховано",
+'revdelete-content-unhid' => 'зміÑÑ‚ приховано',
+'revdelete-summary-unhid' => 'Ð¾Ð¿Ð¸Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¾',
+'revdelete-uname-unhid' => "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача відкрито",
+'revdelete-restricted' => 'заÑтоÑовані Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів',
+'revdelete-unrestricted' => 'знÑÑ‚Ñ– Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів',
+'logentry-move-move' => '$1 перейменував Ñторінку з $3 на $4',
+'logentry-move-move-noredirect' => '$1 перейменував Ñторінку з $3 на $4 без ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ',
+'logentry-move-move_redir' => '$1 перейменував Ñторінку з $3 на $4 поверх перенаправленнÑ',
+'logentry-move-move_redir-noredirect' => '$1 перейменував Ñторінку з $3 на $4 поверх Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ· Ð·Ð°Ð»Ð¸ÑˆÐµÐ½Ð½Ñ Ñамого перенаправленнÑ',
+'logentry-patrol-patrol' => '$1 відпатрулював верÑÑ–ÑŽ $4 Ñторінки $3',
+'logentry-patrol-patrol-auto' => '$1 автоматично відпатрулював верÑÑ–ÑŽ $4 Ñторінки $3',
+'logentry-newusers-newusers' => '$1 Ñтворив обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача',
+'logentry-newusers-create' => '$1 Ñтворив обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача',
+'logentry-newusers-create2' => '$1 Ñтворив обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача $3',
+'logentry-newusers-autocreate' => 'Ðвтоматично Ñтворений обліковий Ð·Ð°Ð¿Ð¸Ñ $1',
+'newuserlog-byemail' => 'пароль надіÑланий електронною поштою',
+
+# Feedback
+'feedback-bugornote' => 'Якщо ви готові опиÑати технічні проблеми в деталÑÑ…, будь лаÑка [ $1 повідомте про помилку].
+Ðбо можете викориÑтати форму нижче. Ваш коментар буде додано Ñторінку "[ $3 $2 ]", разом з іменем кориÑтувача та інформацією про браузер. Ñкий ви викориÑтовуєте.',
+'feedback-subject' => 'Тема:',
+'feedback-message' => 'ПовідомленнÑ:',
+'feedback-cancel' => 'СкаÑувати',
+'feedback-submit' => 'ÐадіÑлати відгук',
+'feedback-adding' => 'Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð³ÑƒÐºÑƒ на Ñторінку ...',
+'feedback-error1' => 'Помилка: Ðевідомий результаті API',
+'feedback-error2' => 'Помилка: Збій редагувань',
+'feedback-error3' => 'Помилка: Ðемає відповіді від API',
+'feedback-thanks' => 'ДÑкуємо! Ваші відгук розміщено на Ñторінці "[$2 $1]".',
+'feedback-close' => 'Виконано',
+'feedback-bugcheck' => 'Чудово! ПроÑто перевірте, що це не одна з вже [$1 відомих помилок].',
+'feedback-bugnew' => 'Я перевірив. Повідомити про нову помилку',
+
+# API errors
+'api-error-badaccess-groups' => 'Вам не дозволено завантажувати файли до цього вікіпроекту.',
+'api-error-badtoken' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: поганий знак.',
+'api-error-copyuploaddisabled' => 'Ðа цьому Ñервері вимкнене Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° URL-адреÑою.',
+'api-error-duplicate' => 'Вже {{PLURAL:$1|Ñ–Ñнує [$2 інший файл]|Ñ–Ñнують [$2 інші файли]}} з таким Ñамим вміÑтом.',
+'api-error-duplicate-archive' => 'Раніше на Ñайті вже {{PLURAL:$1|був [$2 файл]|були [$2 файли]}} з ідентичним вміÑтом, але {{PLURAL:$1|був|були}} вилучені.',
+'api-error-duplicate-archive-popup-title' => 'Дублікати {{PLURAL:$1|файла|файлів}}, Ñкі вже були вилучені',
+'api-error-duplicate-popup-title' => 'Дублікат {{PLURAL:$1| файлу|файлів}}',
+'api-error-empty-file' => 'Файл, Ñкий ви надіÑлали, порожній.',
+'api-error-emptypage' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ñ— порожньої Ñторінки неприпуÑтиме.',
+'api-error-fetchfileerror' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: щоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ.',
+'api-error-file-too-large' => 'Файл, Ñкий ви надіÑлали, завеликий.',
+'api-error-filename-tooshort' => 'Ðазва файлу занадто коротка.',
+'api-error-filetype-banned' => 'Цей тип файлів заборонений.',
+'api-error-filetype-missing' => 'У цього файла відÑутнє розширеннÑ.',
+'api-error-hookaborted' => 'Зміни, Ñкі ви намагалиÑÑ Ð·Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ перервав обробник розширеннÑ.',
+'api-error-http' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ðе вдаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ Ñервера.',
+'api-error-illegal-filename' => "ÐеприпуÑтиме ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ.",
+'api-error-internal-error' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ вашого Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° вікі.',
+'api-error-invalid-file-key' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Файл не знайдено в тимчаÑовому Ñховищі.',
+'api-error-missingparam' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: ВідÑутні параметри за запитом.',
+'api-error-missingresult' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, чи пройшло ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð´Ð°Ð»Ð¾.',
+'api-error-mustbeloggedin' => 'Ви повинні увійти в ÑиÑтему Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð².',
+'api-error-mustbeposted' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Запит вимагає HTTP POST.',
+'api-error-noimageinfo' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾, але Ñервер не надав ніÑкої інформації про файл.',
+'api-error-nomodule' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: ВідÑутній модуль завантажень.',
+'api-error-ok-but-empty' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ñервер не відповідає.',
+'api-error-overwrite' => 'Заміну Ñ–Ñнуючого файлу не дозволено.',
+'api-error-stashfailed' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ñервер не зміг зберегти тимчаÑовий файл.',
+'api-error-timeout' => 'Сервер не відповідає протÑгом очікуваного чаÑу.',
+'api-error-unclassified' => 'СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка.',
+'api-error-unknown-code' => 'Ðевідома помилка: «$1»',
+'api-error-unknown-error' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: щоÑÑŒ пішло не так, при Ñпробі завантажити файл.',
+'api-error-unknown-warning' => 'Ðевідоме попередженнÑ: $1',
+'api-error-unknownerror' => 'Ðевідома помилка: "$1".',
+'api-error-uploaddisabled' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¾ у цій вікі.',
+'api-error-verification-error' => 'Цей файл можливо пошкоджено, або він має неправильне розширеннÑ.',
+
);
diff --git a/languages/messages/MessagesUr.php b/languages/messages/MessagesUr.php
index 64356d45..aca03137 100644
--- a/languages/messages/MessagesUr.php
+++ b/languages/messages/MessagesUr.php
@@ -390,12 +390,11 @@ Warning: Page may not contain recent updates.',
'badtitle' => 'خراب عنوان',
'badtitletext' => 'درخواست Ø´Ø¯Û ØµÙØ­Û Ú©Ø§ عنوان ناقص، خالی، یا کوئی غلط ربط Ø´Ø¯Û Ø¨ÛŒÙ† لسانی یا بین ویکی عنوان ÛÛ’.
شاید اÙس میں ایک یا Ø²ÛŒØ§Ø¯Û Ø§ÛŒØ³Û’ حرو٠موجود ÛÙˆÚº جو عنوانات میں استعمال Ù†Ûیں Ûوسکتے.',
-'perfcached' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û ÛÛ’ اور اÙس Ú©Û’ Ù¾Ùرانے Ûونے کا امکان ÛÛ’.',
-'perfcachedts' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û ÛÛ’ اور آخری بار اÙس Ú©ÛŒ بتاریخیت $1 Ú©Ùˆ Ûوئی.',
+'perfcached' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û ÛÛ’ اور اÙس Ú©Û’ Ù¾Ùرانے Ûونے کا امکان ÛÛ’. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'ذیلی ڈیٹا ابطن Ø´Ø¯Û ÛÛ’ اور آخری بار اÙس Ú©ÛŒ بتاریخیت $1 Ú©Ùˆ Ûوئی. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'اÙس صÙØ­Û Ú©ÛŒÙ„Ø¦Û’ بتاریخات ÙÛŒ الحال ناقابل بنائی گئی Ûیں.
ÛŒÛاں کا ڈیٹا ابھی ØªØ§Ø²Û Ù†Ûیں کیا جائے گا.',
'viewsource' => 'مسودÛ',
-'viewsourcefor' => 'براۓ $1',
'actionthrottledtext' => 'بطور٠ایک ضدسپم تدبیر، آپ Ú©Ùˆ مختصر وقت میں کئی بار ÛŒÛ Ø¹Ù…Ù„ بجا لانے سے محدود کیا گیا، اور آپ ÛŒÛ Ø­Ø¯ پار کرچکے Ûیں.
براÛ٠کرم، Ú©Ú†Ú¾ منٹ بعد کوشش کیجئے.',
'protectedpagetext' => 'اس صÙØ­Û Ú©Ùˆ تدوین سے محÙوظ رکھنے کیلیے مقÙÙ„ کر دیا گیا ÛÛ’Û”',
@@ -584,9 +583,6 @@ $1 نے پابندی لگائی تھی.
آپکا Ù…ÙˆØ¬ÙˆØ¯Û Ø¢Ø¦ÛŒ Ù¾ÛŒ Ù¾ØªÛ $3 ÛÛ’ØŒ اور پابندی Ú©ÛŒ شناخت #$5 ÛÛ’.
براÛÙ Ù…Ûربانی کسی بھی قسم Ú©Û’ استÙسار میں درج بالا تمام تÙاصیل شامل کریں.",
'blockednoreason' => 'کوئی ÙˆØ¬Û Ù†Ûیں دی گئی',
-'blockedoriginalsource' => "'''$1''' کا مآخذ ذیل میں دکھایا گیا ÛÛ’:",
-'blockededitsource' => "'''$1''' Ú©Ùˆ Ú©ÛŒ گئی '''آپ Ú©ÛŒ ترامیم''' کا متن نیچے دکھایا گیا ÛÛ’:",
-'whitelistedittitle' => 'ترمیم کیلئے Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ Ûونا لازم ÛÛ’',
'whitelistedittext' => 'ترمیم کیلئے $1 ضروری ÛÛ’.',
'confirmedittext' => 'صÙحات میں ترمیم کرنے سے Ù¾ÛÙ„Û’ آپ اپنے برقی Ù¾ØªÛ Ú©ÛŒ تصدیق کریں.
برائے Ù…Ûربانی! اپنی [[Special:Preferences|ترجیحات]] Ú©Û’ ذریعے اپنا برقی Ù¾ØªÛ Ú©Ø§ تعیّن اور تصدیق کیجئے.',
@@ -725,10 +721,6 @@ $1",
'revdel-restore-visible' => 'نظر آنے والی نظرثانیاں',
'pagehist' => 'تاریخچۂ صÙØ­Û',
'deletedhist' => 'Ø­Ø°Ù Ø´Ø¯Û ØªØ§Ø±ÛŒØ®Ú†Û',
-'revdelete-content' => 'مشمولÛ',
-'revdelete-summary' => 'خلاصۂ تدوین',
-'revdelete-uname' => 'اسم٠صارÙ',
-'revdelete-hid' => '$1 Ú†Ú¾ÙÙ¾ گیا',
'revdelete-otherreason' => 'دوسری/اضاÙÛŒ وجÛ:',
'revdelete-reasonotherlist' => 'کوئی اَور وجÛ',
'revdelete-edit-reasonlist' => 'تحذیÙÛŒ وجوÛات Ú©ÛŒ تدوین',
@@ -837,7 +829,7 @@ $1",
'prefs-rc' => 'Ø­Ø§Ù„ÛŒÛ ØªØ¨Ø¯ÛŒÙ„ÛŒØ§Úº',
'prefs-watchlist' => 'زیرÙنظر ÙÛرست',
'prefs-watchlist-days' => 'زیرÙنظر ÙÛرست میں نظر آنے والے ایام:',
-'prefs-watchlist-days-max' => '(Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û 7 دÙÙ†)',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'عریض زیرÙنظرÙÛرست میں نظر آنے والی تبدیلیوں Ú©ÛŒ Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û ØªØ¹Ø¯Ø§Ø¯:',
'prefs-watchlist-edits-max' => '(Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û ØªØ¹Ø¯Ø§Ø¯: 1000)',
'prefs-misc' => 'دیگر',
@@ -1083,7 +1075,7 @@ HTML tags جانچئے.',
'longpages' => 'طویل ترین صÙحات',
'deadendpages' => 'Ù…Ø±Ø¯Û ØµÙحات',
'listusers' => 'ÙÛرست ارکان',
-'usercreated' => 'تخلیق Ø´Ø¯Û Ø¨ØªØ§Ø±ÛŒØ® $1 بوقت $2',
+'usercreated' => '{{GENDER:$3|تخلیق شدÛ}} بتاریخ $1 بوقت $2',
'newpages' => 'جدید صÙحات',
'ancientpages' => 'قدیم ترین صÙحات',
'move' => 'منتقـل',
@@ -1123,9 +1115,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'linksearch-line' => '$1 مربوط ÛÛ’ $2 سے',
# Special:Log/newusers
-'newuserlogpage' => 'نوشتۂ آمد صارÙ',
-'newuserlogpagetext' => 'ÛŒÛ Ù†Û“ صارÙÙˆÚº Ú©ÛŒ آمد کا Ù†ÙˆØ´ØªÛ ÛÛ’',
-'newuserlog-create-entry' => 'صار٠جدید',
+'newuserlogpage' => 'نوشتۂ آمد صارÙ',
+'newuserlogpagetext' => 'ÛŒÛ Ù†Û“ صارÙÙˆÚº Ú©ÛŒ آمد کا Ù†ÙˆØ´ØªÛ ÛÛ’',
# Special:ListGroupRights
'listgrouprights-members' => '(اراکین Ú©ÛŒ ÙÛرست)',
@@ -1169,7 +1160,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'actionfailed' => 'عمل ناکام',
'deletedtext' => '"$1" Ú©Ùˆ حذ٠کر دیا گیا ÛÛ’ Û”
Ø­Ø§Ù„ÛŒÛ Ø­Ø°Ù Ø´Ø¯Ú¯ÛŒ Ú©Û’ تاریخ Ù†Ø§Ù…Û Ú©ÛŒÙ„ÛŒÛ“ $2 دیکھیۓ',
-'deletedarticle' => 'Ø­Ø°Ù Ø´Ø¯Û "[[$1]]"',
'dellogpage' => 'نوشتۂ حذ٠شدگی',
'dellogpagetext' => 'Ø­Ø§Ù„ÛŒÛ Ø­Ø°Ù Ø´Ø¯Ú¯ÛŒ Ú©ÛŒ ÙÛرست درج ذیل ÛÛ’Û”',
'deletionlog' => 'نوشتۂ حذ٠شدگی',
@@ -1201,7 +1191,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'undeletelink' => 'دیکھو/بحال کرو',
'undeleteviewlink' => 'دکھاؤ',
'undeletecomment' => 'وجÛ:',
-'undeletedarticle' => 'بحال "[[$1]]"',
# Namespace form on various pages
'namespace' => 'جاۓ نام:',
@@ -1272,8 +1261,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'pagemovedsub' => 'انتقال کامیاب',
'movepage-moved' => '\'\'\'"$1" منتقل کردیا گیا بطر٠"$2"\'\'\'',
'articleexists' => 'اس عنوان سے کوئی صÙØ­Û Ù¾ÛÙ„Û’ ÛÛŒ موجود ÛÛ’ØŒ یا آپکا منتخب Ú©Ø±Ø¯Û Ù†Ø§Ù… مستعمل Ù†Ûیں۔ براۓ Ù…Ûربانی دوسرا نام منتخب کیجیۓ۔',
-'1movedto2' => '[[$1]] بجانب [[$2]] منتقل',
-'1movedto2_redir' => '[[$1]] کو براستۂ رجوع مکرر [[$2]] پرمنتقل کردیا',
'movelogpage' => 'نوشتۂ منتقلی',
'movereason' => 'وجÛ:',
'revertmove' => 'رجوع',
@@ -1360,9 +1347,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'anonymous' => '{{SITENAME}} گمنام صارÙ',
'others' => 'دیگر',
-# Patrol log
-'patrol-log-diff' => '$1 نظرثانی',
-
# Image deletion
'deletedrevision' => 'Ø­Ø°Ù Ø´Ø¯Û Ù¾Ø±Ø§Ù†ÛŒ ترمیم $1Û”',
diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php
index 832d9aaf..9ab72020 100644
--- a/languages/messages/MessagesUz.php
+++ b/languages/messages/MessagesUz.php
@@ -220,7 +220,6 @@ $messages = array(
'error' => 'Xato',
'badtitle' => 'Notoʻgʻri sarlavha',
'viewsource' => "Ko'rib chiqish",
-'viewsourcefor' => '$1 uchun',
'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
@@ -484,9 +483,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
[[Special:UnusedCategories|Unused categories]] are not shown here.
Also see [[Special:WantedCategories|wanted categories]].',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Yangi foydalanuvchi',
-
# E-mail user
'emailuser' => 'Bu foydalanuvchiga e-maktub joʻnat',
@@ -501,14 +497,13 @@ Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmasl
'watch' => 'kuzatish',
'watchthispage' => 'Sahifani kuzatish',
'unwatch' => 'kuzatmaslik',
-'wlnote' => "Pastda oxirgi '''$2''' soatda sodir bo'lgan $1 o'zgartirishlar ko'rsatilgan.",
+'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
'wlshowlast' => "Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko'rsatish. $3 tahrirlarni ko'rsatish",
# Delete
'actioncomplete' => 'Bajarildi',
'deletedtext' => '"$1" yoʻqotildi.
Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
-'deletedarticle' => '"[[$1]]" yoʻqotildi',
'dellogpage' => 'Yoʻqotish qaydlari',
'deletecomment' => 'Sabab:',
'deleteotherreason' => 'Boshqa/qoʻshimcha sabab:',
@@ -567,7 +562,6 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
'movepagebtn' => 'Sahifani koʻchir',
'pagemovedsub' => 'Koʻchirildi',
'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
-'1movedto2' => "[[$1]] [[$2]]ga ko'chirildi",
'movelogpage' => 'Koʻchirish qaydlari',
'movereason' => 'Sabab:',
'revertmove' => 'qaytar',
@@ -643,7 +637,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
'imagemaxsize' => "Tasvir ta'rifi sahifasidagi tasvirning kattaligi:",
'thumbsize' => 'Tasvirning kichiklashtirilgan versiyasining kattaligi:',
'file-info-size' => '$1 × $2 piksel, fayl hajmi: $3, MIME tipi: $4',
-'file-nohires' => '<small>Bundan kattaroq tasvir yoʻq.</small>',
+'file-nohires' => 'Bundan kattaroq tasvir yoʻq.',
'svg-long-desc' => 'SVG fayl, asl oʻlchamlari $1 × $2 piksel, fayl hajmi: $3',
'show-big-image' => 'Asl hajmdagi tasvir',
diff --git a/languages/messages/MessagesVe.php b/languages/messages/MessagesVe.php
index 21715a5d..4732fb68 100644
--- a/languages/messages/MessagesVe.php
+++ b/languages/messages/MessagesVe.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Johannes Rohr (on ve.wikipedia.org)
* @author Node ue
*/
diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php
index b3e4d377..034d502b 100644
--- a/languages/messages/MessagesVec.php
+++ b/languages/messages/MessagesVec.php
@@ -21,7 +21,7 @@
*/
$magicWords = array(
- 'redirect' => array( '0', '#VARDA', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
+ 'redirect' => array( '0', '#VARDA', '#RINVIA', '#RINVIO', '#RIMANDO', '#REDIRECT' ),
);
$fallback = 'it';
@@ -58,6 +58,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Messagi' ),
'Allpages' => array( 'TuteLePagine' ),
'Ancientpages' => array( 'PagineMancoNove' ),
+ 'Badtitle' => array( 'TitoloSbalià' ),
'Blankpage' => array( 'PaginaVoda' ),
'Block' => array( 'Bloca' ),
'Blockme' => array( 'BlocaProxy' ),
@@ -499,15 +500,14 @@ Se prega de dìrghelo a un [[Special:ListUsers/sysop|aministradore]] indicando l
Podaria esare sta zà scansełà da qualcun altro.',
'badtitle' => 'Titoło mia justo',
'badtitletext' => "El titoło de ła pajina richiesta xè vodo, erà o con carateri no amesi opure el deriva da n'erore ne i cołegamenti tra siti wiki diversi o version en łengue diverse de ło steso sito.",
-'perfcached' => 'Sti dati qua no i vien mia azornà in tenpo reale, ma solo na olta ogni tanto.',
-'perfcachedts' => "Sti dati qua i xe stà azornà l'ultima olta el $1.",
+'perfcached' => 'Sti dati qua no i vien mia azornà in tenpo reale, ma solo na olta ogni tanto. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => "Sti dati qua i xe stà azornà l'ultima olta el $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => "L'azornamento periodico de sta pagina el xe sospeso.
I dati che ghè qua drento no i xe azornà.",
'wrong_wfQuery_params' => 'Erore ne i parametri invià a ła funsion wfQuery()<br />
Funsion: $1<br />
Query: $2',
'viewsource' => 'Varda el testo',
-'viewsourcefor' => 'de $1',
'actionthrottled' => 'Asion ritardà',
'actionthrottledtext' => "Come misura de sicuresa contro e o spam, l'esecusion de alcune asion e a xè limità a on numaro masimo de volte en on determinà periodo de tenpo, limite che en questo caso xè sta superà. Se prega de riprovare tra qualche minuto.",
'protectedpagetext' => 'Sta pagina la xe stà proteta de modo che nissuni possa canbiarla.',
@@ -701,9 +701,6 @@ Nota che la funzion 'Scrivi a l'utente' no la xe ativa a meno che no te gavi reg
Se prega de specificar el to indirizo IP atuale ($3) e el nùmaro del bloco (ID #$5) in qualsiasi richiesta de ciarimenti.",
'blockednoreason' => 'nissuna motivazion indicà',
-'blockedoriginalsource' => "El còdese sorgente de '''$1''' el vien mostrà de seguito:",
-'blockededitsource' => "El testo de le '''to modifiche''' a '''$1''' el xe mostrà qua soto:",
-'whitelistedittitle' => 'Bisogna èssar registrà par poder canbiar le pagine',
'whitelistedittext' => 'Te ghè da $1 par canbiar le pagine.',
'confirmedittext' => "Te ghè da confermar l'indirizo e-mail prima de editar le pàxene. Par piaxer inposta e conferma el to indirizo e--mail tramite le to [[Special:Preferences|preferenze]].",
'nosuchsectiontitle' => 'Sezion mia catà',
@@ -942,8 +939,6 @@ I altri aministradori de {{SITENAME}} i podarà vardar istesso i contenuti scont
'revdelete-unsuppress' => 'Elimina le limitazion su le revision ripristinà',
'revdelete-log' => 'Motivassion:',
'revdelete-submit' => 'Àplica a {{PLURAL:$1|la|le}} revision selezionà',
-'revdelete-logentry' => 'gà modificà la visibilità par una revision de [[$1]]',
-'logdelete-logentry' => "gà modificà la visibilità de l'evento [[$1]]",
'revdelete-success' => "'''Visibilità de la revision ajornà coretamente.'''",
'revdelete-failure' => "'''No se riesse a ajornar la visibilità de la version:'''
$1",
@@ -955,15 +950,6 @@ $1",
'revdel-restore-visible' => 'revision visibili',
'pagehist' => 'Cronologia de la pagina',
'deletedhist' => 'Cronologia scancelà',
-'revdelete-content' => 'contenuto',
-'revdelete-summary' => 'modifica ogeto',
-'revdelete-uname' => 'nome utente',
-'revdelete-restricted' => 'aplicà restrizioni ai aministradori',
-'revdelete-unrestricted' => 'gà cavà le limitazion par i aministradori',
-'revdelete-hid' => 'scondar $1',
-'revdelete-unhid' => 'mostrar $1',
-'revdelete-log-message' => '$1 par $2 {{PLURAL:$2|revision|revisioni}}',
-'logdelete-log-message' => '$1 par $2 {{PLURAL:$2|evento|eventi}}',
'revdelete-hide-current' => 'No se pol scondar la version datà $1 a le $2, parché la xe la version corente.',
'revdelete-show-no-access' => 'No se pol réndar visibile la version datà $1 a le $2: la xe stà marcà come "ad acesso ristreto".
No ti gà acesso su de ela.',
@@ -1115,7 +1101,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'prefs-rc' => 'Ultime modifeghe',
'prefs-watchlist' => 'Tegnùi de òcio',
'prefs-watchlist-days' => 'Nùmaro de giòrni da far védar nei osservati speciali:',
-'prefs-watchlist-days-max' => 'Massimo 7 zorni',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Nùmaro de modifiche da far védar con le funzion avanzade:',
'prefs-watchlist-edits-max' => '(nùmaro massimo: 1000)',
'prefs-watchlist-token' => "Segnal par le pagine tegnùe d'ocio:",
@@ -1308,7 +1294,6 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
'right-autopatrol' => 'Segna automaticamente le modifiche come verificà',
'right-patrolmarks' => 'Dòpara le funsionalità de patugliamento dei ultimi canbiamenti',
'right-unwatchedpages' => "Mostra na lista de pagine mìa tegnue d'ocio",
-'right-trackback' => 'Spedissi un trackback',
'right-mergehistory' => 'Fondi insieme la cronologia de le pagine',
'right-userrights' => "Modifica tuti quanti i diriti de l'utente",
'right-userrights-interwiki' => 'Modifica i diriti de utenti de altri siti wiki',
@@ -1352,7 +1337,6 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
'action-patrol' => 'segnar le modìfeghe dei altri utenti come verificàe',
'action-autopatrol' => 'segnar le to modìfeghe come verificàe',
'action-unwatchedpages' => "vardar la lista de pàxene mia tegnùe d'ocio",
-'action-trackback' => 'mandar na trackback',
'action-mergehistory' => 'unir la cronologia de sta pàxena',
'action-userrights' => 'canbiar tuti i diriti dei utenti',
'action-userrights-interwiki' => 'canbiar i diriti dei utenti su altre wiki',
@@ -1766,7 +1750,7 @@ Le righe <del>sbarà</del> le xe xà stà sistemà.',
'listusers-editsonly' => 'Fà védar sol che i utenti che gà fato dei contributi',
'listusers-creationsort' => 'Ã’rdena par data de creassion',
'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
-'usercreated' => 'Creà el $1 a le $2',
+'usercreated' => '{{GENDER:$3|Creà|Creà}} el $1 a le $2',
'newpages' => 'Pagine nove',
'newpages-username' => 'Nome utente:',
'ancientpages' => 'Pagine pì vece',
@@ -1857,12 +1841,8 @@ Protocòli suportè: <tt>$1</tt>',
'activeusers-noresult' => 'Nissun utente catà.',
# Special:Log/newusers
-'newuserlogpage' => 'Novi utenti',
-'newuserlogpagetext' => 'Sto qua el xè el registro dei novi utenti registrai.',
-'newuserlog-byemail' => 'password spedìa par e-mail',
-'newuserlog-create-entry' => 'se ga pena rejistrà',
-'newuserlog-create2-entry' => 'ga registrà el nome utente $1',
-'newuserlog-autocreate-entry' => 'Account creà automaticamente',
+'newuserlogpage' => 'Novi utenti',
+'newuserlogpagetext' => 'Sto qua el xè el registro dei novi utenti registrai.',
# Special:ListGroupRights
'listgrouprights' => 'Diriti dei grupi utenti',
@@ -1999,8 +1979,6 @@ Par riscontri e ulteriore assistensa:
'actionfailed' => 'Azion mia riussìa',
'deletedtext' => "''$1'' xe stà scanselà.
Varda $2 par n'elenco de le ultime pagine scanselà.",
-'deletedarticle' => 'gà scanselà "[[$1]]"',
-'suppressedarticle' => 'sconto "[[$1]]"',
'dellogpage' => 'Registro de scancelassion',
'dellogpagetext' => 'Qui de seguito ghe xe un ełenco de łe pàxene scancełae de reçente.',
'deletionlog' => 'Registro de scancełasión',
@@ -2119,7 +2097,6 @@ Se dopo ła scancełazion xè stà creà na nova pàxena col stesso titoło, łe
'undeletereset' => 'Reinposta',
'undeleteinvert' => 'Inverti selession',
'undeletecomment' => 'Motivassion:',
-'undeletedarticle' => 'ga recuperà "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|Una revision recuperà|$1 revision recuperà}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una revision|$1 revision}} e $2 file recuperà',
'undeletedfiles' => '{{PLURAL:$1|Un file recuperà|$1 file recuperà}}',
@@ -2369,9 +2346,6 @@ Par piaser, métighe un titolo difarente.",
'movepage-page-moved' => 'La pagina $1 la xe stà spostà a $2.',
'movepage-page-unmoved' => "No s'à mìa podesto spostar $1 a $2.",
'movepage-max-pages' => "Xe stà ragiunto el nùmaro massimo consentìo de $1 {{PLURAL:$1|pagina|pagine}} spostà e nissun'altra la vegnarà spostà in automatico.",
-'1movedto2' => 'ga spostà [[$1]] a [[$2]]',
-'1movedto2_redir' => 'ga spostà [[$1]] a [[$2]] tramite on rimando',
-'move-redirect-suppressed' => 'nissun rimando',
'movelogpage' => 'Spostamenti',
'movelogpagetext' => 'Lista de pàxene spostàe.',
'movesubpage' => '{{PLURAL:$1|Sotopagina|Sotopagine}}',
@@ -2605,9 +2579,6 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
# Patrol log
'patrol-log-page' => 'Modifiche verificàe',
'patrol-log-header' => 'Qua de sèvito xe elencàe le verifiche de le modifiche.',
-'patrol-log-line' => 'gà segnà la $1 a la pagina $2 come verificà $3',
-'patrol-log-auto' => '(verifica automatica)',
-'patrol-log-diff' => 'revision $1',
'log-show-hide-patrol' => '$1 el registro dei canbiamenti verificài',
# Image deletion
@@ -2633,7 +2604,7 @@ La so esecuzion la podarìa danegiar el to computer.",
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|pagine}}',
'file-info' => 'Dimensioni: $1, tipo MIME: $2',
'file-info-size' => '$1 × $2 pixel, dimension del file: $3, tipo MIME: $4',
-'file-nohires' => '<small>No ghe xe version a risolussion pì granda.</small>',
+'file-nohires' => 'No ghe xe version a risolussion pì granda.',
'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
'show-big-image' => 'Version ad alta risołusion',
'file-info-gif-looped' => 'ripetù',
@@ -3009,13 +2980,6 @@ El codexe de conferma el scadrà en automatego a łe $4.',
'scarytranscludefailed' => '[Inpossibile otegner el modèl $1]',
'scarytranscludetoolong' => '[La URL la xe massa longa]',
-# Trackbacks
-'trackbackbox' => 'Informazion de traciamento par sta voxe:<br />
-$1',
-'trackbackremove' => '([$1 Scancela])',
-'trackbacklink' => 'Trackback',
-'trackbackdeleteok' => 'Informasion de trackback eliminà coretamente.',
-
# Delete conflict
'deletedwhileediting' => "'''Ocio''': Sta pàxena la xè stà scancełà dopo che te ghè scominzià a modificarla!",
'confirmrecreate' => "L'utente [[User:$1|$1]] ([[User talk:$1|discussion]]) el ga scancełà sta voxe dopo che te ghè scuminsià a modificarla, con ła seguente motivazion:
@@ -3218,4 +3182,9 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'sqlite-has-fts' => '$1 con la possibilità de riserca completa nel testo',
'sqlite-no-fts' => '$1 sensa la possibilità de riserca completa nel testo',
+# New logging system
+'revdelete-restricted' => 'aplicà restrizioni ai aministradori',
+'revdelete-unrestricted' => 'gà cavà le limitazion par i aministradori',
+'newuserlog-byemail' => 'password spedìa par e-mail',
+
);
diff --git a/languages/messages/MessagesVep.php b/languages/messages/MessagesVep.php
index c323f57b..30ff44cf 100644
--- a/languages/messages/MessagesVep.php
+++ b/languages/messages/MessagesVep.php
@@ -70,20 +70,20 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'img_right' => array( '1', 'oiged', 'paremal', 'right' ),
- 'img_left' => array( '1', 'hura', 'vasakul', 'left' ),
- 'img_none' => array( '1', 'eile', 'tühi', 'none' ),
- 'img_width' => array( '1', '$1piks', '$1px' ),
- 'img_border' => array( '1', 'röun', 'ääris', 'border' ),
- 'img_top' => array( '1', 'üläh', 'top' ),
- 'img_middle' => array( '1', 'kesk', 'middle' ),
- 'img_bottom' => array( '1', 'ala', 'bottom' ),
- 'sitename' => array( '1', 'SAITANNIMI', 'KOHANIMI', 'SITENAME' ),
- 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'SUGU:', 'GENDER:' ),
- 'plural' => array( '0', 'ÄILUGU:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ),
- 'index' => array( '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ),
+ 'img_right' => array( '1', 'oiged', 'paremal', 'right' ),
+ 'img_left' => array( '1', 'hura', 'vasakul', 'left' ),
+ 'img_none' => array( '1', 'eile', 'tühi', 'none' ),
+ 'img_width' => array( '1', '$1piks', '$1px' ),
+ 'img_border' => array( '1', 'röun', 'ääris', 'border' ),
+ 'img_top' => array( '1', 'üläh', 'top' ),
+ 'img_middle' => array( '1', 'kesk', 'middle' ),
+ 'img_bottom' => array( '1', 'ala', 'bottom' ),
+ 'sitename' => array( '1', 'SAITANNIMI', 'KOHANIMI', 'SITENAME' ),
+ 'grammar' => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SUGU:', 'GENDER:' ),
+ 'plural' => array( '0', 'ÄILUGU:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'TÄUZ\'URL:', 'KOGUURL:', 'FULLURL:' ),
+ 'index' => array( '1', '__INDEKS__', 'INDEKSIGA', '__INDEX__' ),
);
$messages = array(
@@ -436,18 +436,19 @@ Ližakat URL.',
'badarticleerror' => 'Necidä ei sa tehta necil lehtpolel.',
'cannotdelete' => 'Ei voi Äuta poiÅ¡ necidä lehtpol\'t vai "$1"-failad.
Sen om jo Äutnu ken-se toine.',
+'cannotdelete-title' => "Ei voi heitta «$1»-lehtpol't",
'badtitle' => 'Hond nimi',
'badtitletext' => 'Ectud lehtpolen nimi om vär, vai mugošt nimed ei ole, vai kelidenkeskeline (interwiki) nimi om kirjutadud värin.
Siš voib olda simvoloid, kudambid ei sa panda nimihe.',
-'perfcached' => 'Nene andmused oma kešespäi i voidas olda vanhtunuzin.',
-'perfcachedts' => "Nened andmused oma kešespäi, ned oma uzištadud jäl'gmäižel kerdal siloi: $1.",
+'perfcached' => "Nene andmused oma kešespäi i voidas olda vanhtunuzin. Kešas ei ole enambad mi {{PLURAL:$1|rezul'tat|$1 rezul'tatad}}.",
+'perfcachedts' => "Nened andmused oma kešespäi, ned oma uzištadud jäl'gmäižel kerdal siloi: $1. Kešas ei ole enambad mi {{PLURAL:$1|rezul'tat|$1 rezul'tatad}}.",
'querypage-no-updates' => "Necen lehtpolen udištand ei ole nügüd' kävutamas.
Anttud naku andmused ei udištugoi.",
'wrong_wfQuery_params' => 'Värad parametrad necen funkcijan täht: wfQuery()<br />
Funkcii: $1<br />
Ecind: $2',
'viewsource' => 'Kc. purde',
-'viewsourcefor' => '$1-lehtpolele',
+'viewsource-title' => 'Ozutada $1-lehtpolen lähtmižtekst',
'actionthrottled' => 'Tegendan piguz om kaidetud',
'protectedpagetext' => "Nece lehtpol' om luklostadud, miše kaita se redaktiruindaspäi.",
'viewsourcetext' => 'Sab lugeda da kopiruida necen lehtpolen augotižtekst:',
@@ -572,11 +573,17 @@ Voib olda, tö olet jo toižetanuded peitsanan vai pakinuded uden peitsanan.',
'passwordreset' => 'Peitsanan alustuz',
'passwordreset-username' => 'Kävutajan nimi:',
'passwordreset-domain' => 'Domen',
+'passwordreset-capture' => 'Ozutada-k loptud kirjeine?',
'passwordreset-email' => 'E-poÄtan adres:',
'passwordreset-emailelement' => 'Kävutajannimi: $1
Aigaline peitsana: $2',
'passwordreset-emailsent' => 'MuÅ¡tatai kirjeine oigetihe e-poÄtadme',
+# Special:ChangeEmail
+'changeemail-newemail' => "Uz' e-poÄtan adres",
+'changeemail-submit' => 'Toižetada e-poÄtan adres',
+'changeemail-cancel' => 'Heitta',
+
# Edit page toolbar
'bold_sample' => 'Lihavoitud tekst',
'bold_tip' => 'Lihavoitud tekst',
@@ -643,9 +650,6 @@ Otkat sil'mnägubale, miše teile ei sa oigeta kirješt [[{{MediaWiki:Grouppage-
Teiden IP-adres om $3, teiden blokiruindan ID om #$5.
Olgat hüväd, kirjutagat nened andmused kaikiš kirjeižiš administratorile.",
'blockednoreason' => 'Ei ole kirjutadud ni-mittušt süd.',
-'blockedoriginalsource' => "'''$1'''-lehtpolen tekst:",
-'blockededitsource' => "'''Teiden $1-lehtpolen toižetusiden''' tekst:",
-'whitelistedittitle' => 'Kirjutagatoiš sistemha, miše redaktiruida',
'whitelistedittext' => 'Teile pidab $1, miše redaktiruida lehtpolid.',
'confirmedittext' => 'Tarbiž vahviÅ¡toitta e-poÄtan adres, miÅ¡e redaktiruida lehtpolid.
Olgat hüväd, kirjutagat da vahviÅ¡toitkat teiden e-poÄtan adres [[Special:Preferences|järgendusiden lehtpolel]].',
@@ -704,7 +708,7 @@ Ku tö et tahtkoi, miÅ¡e teiden tekstad levitaižiba da redaktiruižiba miÄÄed
Tö vahvištoitat mugažo, miše olet toižetusiden avtoran vai olet kopiruinuded tekstad joudjas purtkespäi.
'''ALGAT SIJAKOI LASKMATA AVTORANOIKTUSEL KAITUD MATERIALOID!'''",
-'longpageerror' => "'''PETUZ: Teiden tekstan suruz om $1 kb, a lasktud maksimum om $2 kb.'''
+'longpageerror' => "'''Petuz: Teiden tekstan suruz om $1 kb, a lasktud maksimum om $2 kb.'''
Ei voi kirjutada muštho.",
'protectedpagewarning' => "'''VARUTUZ: nece lehtpol' om luklostadud, sidä voidas redaktiruida vaiše administratorad.'''
Alemba om anttud jäl'gmäine aiglehtesen kirjutez:",
@@ -838,8 +842,6 @@ Administratorad voiškatas lugeda peittud südäimištod da endištada sidä nec
'revdelete-unsuppress' => 'Heitta kaidendused endištadud versijoilpäi',
'revdelete-log' => 'Sü:',
'revdelete-submit' => 'Lattä valitud {{PLURAL:$1|versijaha|versioihe}}',
-'revdelete-logentry' => "Om vajehtanu sen, kut nägub lehtpol' [[$1]]",
-'logdelete-logentry' => 'Om toižetanu sen, kut nägub tego [[$1]]',
'revdelete-success' => "'''Versijan nägulad om toižetadud tugedusita.'''",
'revdelete-failure' => "'''Ei voi toižetada versijan läguladud:'''
$1",
@@ -851,15 +853,6 @@ $1",
'revdel-restore-visible' => 'versijad, kudambad voib nähta',
'pagehist' => 'Lehtpolen istorii',
'deletedhist' => 'ÄŒudandoiden istorii',
-'revdelete-content' => 'südäiolend',
-'revdelete-summary' => 'kaik toižetused',
-'revdelete-uname' => 'kävutajan nimi',
-'revdelete-restricted' => 'kaidendused administratoriden täht',
-'revdelete-unrestricted' => 'kaidendused heittud administratoriden täht',
-'revdelete-hid' => 'peittud $1',
-'revdelete-unhid' => 'avaitud $1',
-'revdelete-log-message' => '$1 $2 {{PLURAL:$2|versijan|versijoiden}} täht',
-'logdelete-log-message' => '$1 $2 {{PLURAL:$2|tegendan|tegendoiden}} täht',
'revdelete-hide-current' => '$2, $1-kirjutesen peitmižen petuz: nece versii om nügüdläine.
Sidä ei sa peitta.',
'revdelete-show-no-access' => '$2, $1-kirjutesen ozutamižen petuz: nece kirjutez om znamoitud "kaidetud".
@@ -1003,12 +996,14 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
'prefs-rc' => 'Tantoižed toižetused',
'prefs-watchlist' => 'Kaclendnimikirjutez',
'prefs-watchlist-days' => 'Maksimaline päividen lugu kaclendnimikirjuteses:',
-'prefs-watchlist-days-max' => 'Ei enamba 7 päiväd',
+'prefs-watchlist-days-max' => '(maksimum $1 {{PLURAL:$1|päiv|päiväd}})',
'prefs-watchlist-edits' => 'Maksimaline toižetusiden lugu levitoittud kaclendnimikirjuteses:',
'prefs-watchlist-edits-max' => 'Maksimaline lugu: 1000',
'prefs-watchlist-token' => 'Kaclendan nimikirjutesen token:',
'prefs-misc' => 'Toine',
'prefs-resetpass' => 'Toižetada peitsana',
+'prefs-changeemail' => 'Toižetada e-poÄtan adres',
+'prefs-setemail' => 'Märita e-poÄtan adres',
'prefs-email' => 'E-poÄtan opcijad',
'prefs-rendering' => 'Nägu',
'saveprefs' => 'Kirjutada',
@@ -1191,12 +1186,12 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'right-autopatrol' => 'Znamoita iÄeze toižetusid avtomatižikÅ¡ kut patruliruidud',
'right-patrolmarks' => 'Nähta patruliruindvirgad veresiš redakcijoiš',
'right-unwatchedpages' => 'Lugeda kacelmatomiden lehtpoliden nimikirjutest',
-'right-trackback' => 'Oigeta trackback',
'right-mergehistory' => 'Ãœhtenzoitta lehtpoliden istorijad',
'right-userrights' => 'Redaktiruida kaikiden kävutajiden oiktused',
'right-userrights-interwiki' => 'Toižetada toižiden wiki-saitoiden kävutajiden oiktused',
'right-siteadmin' => 'Luklostada da avaita andmusiden baz',
'right-sendemail' => 'Oigeta e-poÄtad toižile kävutajile',
+'right-passwordreset' => 'Kacta e-kirjeižid peitsanan toižetandanke',
# User rights log
'rightslog' => 'Kävutajan oiktusiden aigkirj',
@@ -1233,11 +1228,11 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'action-patrol' => 'znamoita toižiden kävutajiden toižetused kut patruliruidud',
'action-autopatrol' => 'znamoita iÄeze toižetused kut patruliruidud',
'action-unwatchedpages' => 'lugeda kacelmatomiden lehtpoliden nimikirjutez',
-'action-trackback' => 'oigeta trackback',
'action-mergehistory' => 'sidoda necen lehtpolen toižetusen istorii mihe-se',
'action-userrights' => 'redaktiruida kaik kävutajan oiktused',
'action-userrights-interwiki' => 'redaktiruida kävutajiden oiktused toižiš wikiš',
'action-siteadmin' => 'andmusiden bazan blokiruind i blokiruindan heitand',
+'action-sendemail' => 'oigeta e-kirjeižed',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|toižetuz|toižetust}}',
@@ -1279,7 +1274,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-backlink' => '↠$1',
'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.",
@@ -1369,10 +1363,18 @@ Ku problem jäb jäl'ghepäi-ki, säkat pagin [[Special:ListUsers/sysop|sistemad
'upload-unknown-size' => 'Tundmatoi suruz',
'upload-http-error' => 'HTTP-petuz: $1',
+# File backend
+'backend-fail-backup' => 'Ei voi tehta $1-failan rezervkopijad.',
+'backend-fail-notexists' => 'Ei ole mugošt failad: "$1".',
+'backend-fail-copy' => 'Ei voi kopiruida "$1"-failad "$2"-tahoze.',
+'backend-fail-move' => 'Ei voi sirta "$1"-failad "$2"-tahoze.',
+'backend-fail-read' => 'Ei voi lugeda "$1"-failad.',
+
# Special:UploadStash
-'uploadstash' => 'Peittud jügedoitand',
-'uploadstash-clear' => 'Čuta poiš kaik peittud failad',
-'uploadstash-refresh' => 'Udestada failoiden nimikirjutez',
+'uploadstash' => 'Peittud jügedoitand',
+'uploadstash-clear' => 'Čuta poiš kaik peittud failad',
+'uploadstash-refresh' => 'Udestada failoiden nimikirjutez',
+'invalid-chunk-offset' => 'Laskmatoi fragmentan sirdand',
# img_auth script messages
'img-auth-accessdenied' => "Pästand tänna om kel'tud",
@@ -1459,22 +1461,22 @@ Informacijad sen [$2 andmusiden lehtpolelpäi] om anttud alemba.',
'filerevert-success' => "'''[[Media:$1|$1]]''' om endištadud [$4 versijannoks datal $3, $2].",
# File deletion
-'filedelete' => 'ÄŒuta $1',
-'filedelete-backlink' => '↠$1',
-'filedelete-legend' => 'Čuta poiš fail',
-'filedelete-intro' => "Tö takait Äuta fail '''[[Media:$1|$1]]''' kaiken sen istorijanke.",
-'filedelete-comment' => 'Sü:',
-'filedelete-submit' => 'Čuta poiš',
-'filedelete-success' => "'''$1'''-fail om Äutud poiÅ¡.",
-'filedelete-success-old' => "'''[[Media:$1|$1]]'''-failan versii, kudamb datiruiÅ¡e datal $3, $2, om Äutud.",
-'filedelete-nofile' => "'''$1'''-failad ei ole wikiš.",
-'filedelete-nofile-old' => "Ei ole '''$1'''-failan arhivversijad ningomiden atributoidenke.",
-'filedelete-otherreason' => 'Toine sü/ližasü:',
-'filedelete-reason-otherlist' => 'Toine sü',
-'filedelete-reason-dropdown' => '*Čudandan päsüd
+'filedelete' => 'ÄŒuta $1',
+'filedelete-legend' => 'Čuta poiš fail',
+'filedelete-intro' => "Tö takait Äuta fail '''[[Media:$1|$1]]''' kaiken sen istorijanke.",
+'filedelete-comment' => 'Sü:',
+'filedelete-submit' => 'Čuta poiš',
+'filedelete-success' => "'''$1'''-fail om Äutud poiÅ¡.",
+'filedelete-success-old' => "'''[[Media:$1|$1]]'''-failan versii, kudamb datiruiÅ¡e datal $3, $2, om Äutud.",
+'filedelete-nofile' => "'''$1'''-failad ei ole wikiš.",
+'filedelete-nofile-old' => "Ei ole '''$1'''-failan arhivversijad ningomiden atributoidenke.",
+'filedelete-otherreason' => 'Toine sü/ližasü:',
+'filedelete-reason-otherlist' => 'Toine sü',
+'filedelete-reason-dropdown' => '*Čudandan päsüd
** avtoranoiktusen murenduz
** failan dublikat',
-'filedelete-edit-reasonlist' => 'Redaktiruida Äudandan süd',
+'filedelete-edit-reasonlist' => 'Redaktiruida Äudandan süd',
+'filedelete-maintenance-title' => 'Ei voi heitta failad poiš',
# MIME search
'mimesearch' => 'MIME-ecind',
@@ -1583,7 +1585,7 @@ Informacijad sen [$2 andmusiden lehtpolelpäi] om anttud alemba.',
'listusers-editsonly' => 'Ozutada vaiše kävutajid, kudambil om redakcijoid',
'listusers-creationsort' => 'Järgeta sündumiždatan mödhe',
'usereditcount' => '$1 {{PLURAL:$1|redakcii|redakcijad}}',
-'usercreated' => 'Om sätud $1 aigal $2',
+'usercreated' => '{{GENDER:$3|registriruihe}} $1 aigal $2',
'newpages' => 'Uded lehtpoled',
'newpages-username' => 'Kävutai:',
'ancientpages' => 'Kaikiš vanhembad lehtpoled',
@@ -1668,12 +1670,8 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
'activeusers-noresult' => 'Kävutajad ei olgoi löutud.',
# Special:Log/newusers
-'newuserlogpage' => 'Kävutajiden registracijan aigkirj',
-'newuserlogpagetext' => 'Tantoi registriruidud kävutajiden nimikirjutez.',
-'newuserlog-byemail' => 'peisana om oigetud e-poÄtadme',
-'newuserlog-create-entry' => "Uz' kävutai",
-'newuserlog-create2-entry' => 'om sänu uden $1-kävutajan registracii',
-'newuserlog-autocreate-entry' => 'Registracii om sätud avtomatižešti',
+'newuserlogpage' => 'Kävutajiden registracijan aigkirj',
+'newuserlogpagetext' => 'Tantoi registriruidud kävutajiden nimikirjutez.',
# Special:ListGroupRights
'listgrouprights' => 'Kävutajiden gruppiden oiktused',
@@ -1694,7 +1692,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
'emailuser' => 'Oigeta e-kirjeine necile kävutajale',
'emailpage' => 'Kirjeine kävutajale',
'usermailererror' => 'PoÄtan adresat pörduti tedotusen petuses:',
-'defemailsubject' => 'E-poÄt {{SITENAME}}-saitalpäi',
+'defemailsubject' => '$1-kävutajan poÄt {{SITENAME}}-saitalpäi',
'usermaildisabled' => 'Kävutajan e-poÄt ei ole kävutamižes',
'noemailtitle' => 'Ei ole e-poÄtan adresad',
'noemailtext' => 'Nece kävutai ei ole andnu ni-üht oiktad e-poÄtan adresad.',
@@ -1795,7 +1793,6 @@ Pid\'oitelend da joksii abu:
'exbeforeblank' => "südäiolend edel puhtastamišt oli: '$1'",
'exblank' => "lehtpol' oli pall'az",
'delete-confirm' => '"$1"-lehtpolen Äudand',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Čuta poiš',
'historywarning' => 'Homaikat: lehtpolel, kudamb tö takait Äuta, om istorii {{PLURAL:$1|ühtes redakcijaspäi|$1 redakcijoiÅ¡päi}}:',
'confirmdeletetext' => "Tö takait Äuta poiÅ¡ lehtpol' kaiken sen istorijanke.
@@ -1804,8 +1801,6 @@ Olgat hüväd, vahviÅ¡toitkat, miÅ¡e tö todeks himoiÄet Äuta se, el'gendat iÄ
'actionfailed' => 'Tegend lopihe onetomašti',
'deletedtext' => '"$1" om Äutud poiÅ¡.
Kc. $2, miÅ¡e lugeda tantoižiden Äudandoiden nimikirjutez.',
-'deletedarticle' => '"[[$1]]"-lehtpol\' om Äutud poiÅ¡',
-'suppressedarticle' => '"[[$1]]"-lehtpol\' om peittud',
'dellogpage' => 'ÄŒudandoiden aigkirj',
'dellogpagetext' => 'Naku om tantoižiden Äudandoiden nimikirjutez.',
'deletionlog' => 'Äudandoiden aigkirj',
@@ -1853,7 +1848,6 @@ Kc. [[Special:ProtectedPages|kaitud nügüd' lehtpoliden nimikirjutez]].",
'movedarticleprotection' => 'KaiÄendan järgendused oma sirtud "[[$2]]"-lehtpolespäi "[[$1]]"-lehtpol\'he.',
'protect-title' => '"$1"-lehtpolen kaiÄendpindan toižetuz',
'prot_1movedto2' => '[[$1]] om nimitadud [[$2]]-nimel',
-'protect-backlink' => '↠$1',
'protect-legend' => 'VahviÅ¡toitkat kaiÄendan augotiž',
'protectcomment' => 'Sü:',
'protectexpiry' => 'lopstrok:',
@@ -1875,6 +1869,7 @@ Sab toižetada necen lehtpolen kaiÄendpind, no se ei voi toižetada kaskadkaiÄ
'protect-level-sysop' => 'Vaiše administratorad',
'protect-summary-cascade' => 'Kaskadine',
'protect-expiring' => 'strok lähteb datal $1 (UTC)',
+'protect-expiring-local' => 'vanhtub $1',
'protect-expiry-indefinite' => 'strokuta',
'protect-cascade' => "Kaita neche lehtpol'he mülütadud lehtesed (kaskadkaiÄend)",
'protect-cantedit' => 'Teile ei sa toižetada necen lehtpolen kaiÄendpindad, sikÅ¡ miÅ¡e teil ei ole laskendad toižetada sidä.',
@@ -1921,7 +1916,6 @@ Sab toižetada necen lehtpolen kaiÄendpind, no se ei voi toižetada kaskadkaiÄ
'undeletereset' => 'Puhtastada',
'undeleteinvert' => 'Käta erigoittud sanad vastkarin',
'undeletecomment' => 'Kommentarii:',
-'undeletedarticle' => 'om endištanu "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 toižetuz|$1 toižetust}} om endištadud',
'undeletedrevisions-files' => '{{PLURAL:$1|1 toižetuz|$1 toižetust}} da {{PLURAL:$2|1 fail|$2 failad}} oma endištadud',
'undeletedfiles' => '{{PLURAL:$1|1 fail om|$1 failad oma}} endištadud',
@@ -1976,7 +1970,6 @@ Alemba om anttud jälgmäine kirjutuz blokiruindaiglehtesespäi:",
'whatlinkshere' => 'Kosketused - nakhu',
'whatlinkshere-title' => 'Lehtpoled, kudambad kosketadas "$1"-lehtpolen',
'whatlinkshere-page' => 'Lehtpol’:',
-'whatlinkshere-backlink' => '↠$1',
'linkshere' => "Nened lehtpoled kosketadas '''[[:$1]]''':",
'nolinkshere' => "'''[[:$1]]'''-lehtpol't ei kosketa ni üks' lehtpol'.",
'nolinkshere-ns' => "'''[[:$1]]'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
@@ -2062,6 +2055,7 @@ Kc. [[Special:BlockList|blokiruidud IP-adresoiden nimikirjuteshe]].',
'unblocklink' => 'heitta blokiruind',
'change-blocklink' => 'toižetada blokiruind',
'contribslink' => 'tond',
+'emaillink' => 'oigeta e-kirjeine',
'autoblocker' => 'Blokiruidud avtomatižešti, sikš miše teiden IP-adres om tantoi kävutanu "[[User:$1|$1]]".
Adresan blokiruindan sü - "$2".',
'blocklogpage' => 'Blokiruindoiden aigkirj',
@@ -2155,9 +2149,6 @@ Nenil statjoil tegese sirta vai ühtenzoitta lehtpoled iÄeksaz.",
'movepage-page-moved' => "Lehtpol' $1 udesnimetadud, uz' nimi om $2.",
'movepage-page-unmoved' => "Ei sa udesnimitada $1-lehtpol't i antta sile $2-nimed.",
'movepage-max-pages' => "$1 {{PLURAL:$1|lehtpol'|lehtpol't}} om udesnimetadud, enamb-žo avtomatižikš udesnimitada ei sa.",
-'1movedto2' => "om nimitanu udes [[$1]]; uz' nimi om [[$2]]",
-'1movedto2_redir' => '[[$1]] om nimitadud udel nimel "[[$2]]" udesoigendamižen päle.',
-'move-redirect-suppressed' => 'läbikosketuz om azotadud',
'movelogpage' => 'Udesnimitandoiden aigkirj',
'movelogpagetext' => 'Naku om kaikiden lehtesiden udesnimitandoiden nimikirjutez.',
'movesubpage' => "{{PLURAL:$1|Alalehtpol'|Alalehtpol't}}",
@@ -2166,7 +2157,7 @@ Nenil statjoil tegese sirta vai ühtenzoitta lehtpoled iÄeksaz.",
'revertmove' => 'heitta pätand',
'delete_and_move' => 'Čuta poiš da udesnimitada',
'delete_and_move_confirm' => "Ka, Äuta lehtpol' poiÅ¡",
-'delete_and_move_reason' => 'Čutud poiš udesnimitamižen voimusen täht.',
+'delete_and_move_reason' => 'Čutud poiš "[[$1]]"n udesnimitamižen voimusen täht.',
'immobile-source-namespace' => 'Ei voi udesnimitada lehtpolid "$1"-nimiavaruses',
'immobile-target-namespace' => 'Ei voi udesnimitada lehtpolid "$1"-nimiavarushe',
'immobile-target-namespace-iw' => 'Interviki-kosketust ei sa kävutada udesnimitamižen täht.',
@@ -2257,6 +2248,10 @@ Ei ole pordaigašt failhodrad.',
'import-logentry-interwiki' => 'toi toižes wikišpäi lehtpolen $1',
'import-logentry-interwiki-detail' => "$1 {{PLURAL:$1|üks' versii|versijad}} $2-wikišpäi",
+# JavaScriptTest
+'javascripttest' => 'JavaScriptan kodvmine',
+'javascripttest-disabled' => 'Nece funkcii ei ole kävutamas.',
+
# Tooltip help for the actions
'tooltip-pt-userpage' => "Teiden kävutajan lehtpol'",
'tooltip-pt-anonuserpage' => "Kähutajan lehtpol' minun IP-n täht",
@@ -2380,9 +2375,6 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
# Patrol log
'patrol-log-page' => 'Patruliruindan aigkirj',
'patrol-log-header' => 'Nece om patruliruidud versijoiden aiglehtez.',
-'patrol-log-line' => 'kodvi $1 $2-špäi $3',
-'patrol-log-auto' => '(avtomatižikš)',
-'patrol-log-diff' => 'versii $1',
'log-show-hide-patrol' => '$1 patruliruindan aigkirj',
# Image deletion
@@ -2399,20 +2391,21 @@ $1',
'nextdiff' => 'Udemb redakcii →',
# Media information
-'imagemaxsize' => "Kuvan suruden limit:<br />''(failan ümbrikirjutamižen lehtpolen täht)''",
-'thumbsize' => 'PiÄukuvan suruz:',
-'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|lehtpol'|lehtpol't}}",
-'file-info' => 'failan suruz: $1, MIME-tip: $2',
-'file-info-size' => '$1 × $2 pikselad, failan suruz: $3, MIME-tip: $4',
-'file-nohires' => '<small>Ei ole versijad paremban tarkoiktusenke.</small>',
-'svg-long-desc' => 'SVG-fail, nominaližikš $1 × $2 pikselid, failan suruz: $3',
-'show-big-image' => 'Korgedtarkoiktuseline kuvan versii',
-'show-big-image-size' => '$1 × $2 pikselid',
-'file-info-gif-looped' => 'toštase',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|freim|freimad}}',
-'file-info-png-looped' => 'toštase',
-'file-info-png-repeat' => 'vätud $1 {{PLURAL:$1|kerdan|kerdad}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|freim|freimad}}',
+'imagemaxsize' => "Kuvan suruden limit:<br />''(failan ümbrikirjutamižen lehtpolen täht)''",
+'thumbsize' => 'PiÄukuvan suruz:',
+'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|lehtpol'|lehtpol't}}",
+'file-info' => 'failan suruz: $1, MIME-tip: $2',
+'file-info-size' => '$1 × $2 pikselad, failan suruz: $3, MIME-tip: $4',
+'file-nohires' => 'Ei ole versijad paremban tarkoiktusenke.',
+'svg-long-desc' => 'SVG-fail, nominaližikš $1 × $2 pikselid, failan suruz: $3',
+'show-big-image' => 'Korgedtarkoiktuseline kuvan versii',
+'show-big-image-preview' => 'Ezikacundan suruz: $1.',
+'show-big-image-size' => '$1 × $2 pikselid',
+'file-info-gif-looped' => 'toštase',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|freim|freimad}}',
+'file-info-png-looped' => 'toštase',
+'file-info-png-repeat' => 'vätud $1 {{PLURAL:$1|kerdan|kerdad}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|freim|freimad}}',
# Special:NewFiles
'newimages' => 'Uziden failoiden galerei',
@@ -2428,9 +2421,9 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-'seconds-abbrev' => 's',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'Ä',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1Ä',
# Bad image list
'bad_image_list' => "Formatale pidab olda mugoman:
@@ -2816,15 +2809,6 @@ Necen vahvištoitandkodan kävutamižen lopstrok om $4.',
'scarytranscludefailed' => '[Sidomine $1-Å¡ablonha om keskustadud petusen tagut]',
'scarytranscludetoolong' => "[URL om pit'kähk]",
-# Trackbacks
-'trackbackbox' => 'Trackback:ad necen lehtpolen täht:<br />
-$1',
-'trackback' => '; $4 $5: [$2 $1]',
-'trackbackexcerpt' => '; $4 $5: [$2 $1]: <nowiki>$3</nowiki>',
-'trackbackremove' => '([$1 Čuta poiš])',
-'trackbacklink' => 'Trekbek',
-'trackbackdeleteok' => 'Trekbek om Äutud poiÅ¡.',
-
# Delete conflict
'deletedwhileediting' => "'''Homaikat''': Nece lehtpol' Äutihe poiÅ¡ jälges sidä, konz tö olit toižetaÅ¡kanuded necidä lehtpol't!",
'recreate' => 'Säta udes',
@@ -2956,8 +2940,7 @@ Kävutagat normaline ezikacund.',
'specialpages' => 'Specialižed lehtpoled',
'specialpages-note' => '----
* Järgeližed specialižed lehtpoled.
-* <span class="mw-specialpagerestricted">Kaitud specialižed lehtpoled.</span>
-* <span class="mw-specialpagecached">Keširuidud specialižed lehtpoled.</span>',
+* <span class="mw-specialpagerestricted">Kaitud specialižed lehtpoled.</span>',
'specialpages-group-maintenance' => 'Tehnižen holitandan satusenladindad',
'specialpages-group-other' => 'Toižed specialižed lehtpoled',
'specialpages-group-login' => 'Kirjutadas sistemha / Sada registracii',
@@ -3032,4 +3015,27 @@ Kävutagat normaline ezikacund.',
'sqlite-has-fts' => " $1 täuz'tekstaižen ecindan tügedamiženke",
'sqlite-no-fts' => " $1 täuz'tekstaižen ecindan tügedamižeta",
+# New logging system
+'revdelete-restricted' => 'kaidendused administratoriden täht',
+'revdelete-unrestricted' => 'kaidendused heittud administratoriden täht',
+'newuserlog-byemail' => 'peisana om oigetud e-poÄtadme',
+
+# Feedback
+'feedback-subject' => 'Tem:',
+'feedback-message' => 'Tedotuz:',
+'feedback-cancel' => 'Heitta pätand',
+'feedback-error2' => 'Petuz. Ei voi redaktiruida',
+'feedback-error3' => 'Petuz. API ei anda vastust',
+'feedback-close' => 'Vaumiž',
+
+# API errors
+'api-error-empty-file' => "Teil oigetud fail om pall'az.",
+'api-error-filename-tooshort' => 'Lühudahk failannimi.',
+'api-error-filetype-banned' => "Nece failtip om kel'tud.",
+'api-error-illegal-filename' => "Kel'tud failannimi.",
+'api-error-unclassified' => 'Tundmatoi petuz.',
+'api-error-unknown-code' => 'Tundmatoi petuz: "$1"',
+'api-error-unknown-warning' => 'Tadmatoi varutuz: $1',
+'api-error-unknownerror' => 'Tundmatoi petuz: "$1"',
+
);
diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php
index b5031c31..fe7a400a 100644
--- a/languages/messages/MessagesVi.php
+++ b/languages/messages/MessagesVi.php
@@ -153,100 +153,100 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#đổi', '#REDIRECT' ),
- 'notoc' => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
- 'toc' => array( '0', '__MỤCLỤC__', '__TOC__' ),
- 'noeditsection' => array( '0', '__KHÔNGSỬAMỤC__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'THÃNGNÀY', 'THÃNGNÀY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'THÃNGNÀY1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'TÊNTHÃNGNÀY', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'TÊNDÀITHÃNGNÀY', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'TÊNNGẮNTHÃNGNÀY', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'NGÀYNÀY', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'NGÀYNÀY2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'TÊNNGÀYNÀY', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'NĂMNÀY', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'GIỜNÀY', 'CURRENTTIME' ),
- 'localmonth' => array( '1', 'THÃNGÄỊAPHƯƠNG', 'LOCALMONTH', 'LOCALMONTH2' ),
- 'localmonth1' => array( '1', 'THÃNGÄỊAPHƯƠNG1', 'LOCALMONTH1' ),
- 'localmonthname' => array( '1', 'TÊNTHÃNGÄỊAPHƯƠNG', 'LOCALMONTHNAME' ),
- 'localmonthabbrev' => array( '1', 'THÃNGÄỊAPHƯƠNGTẮT', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'NGÀYÄỊAPHƯƠNG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'NGÀYÄỊAPHƯƠNG2', 'LOCALDAY2' ),
- 'localdayname' => array( '1', 'TÊNNGÀYÄỊAPHƯƠNG', 'LOCALDAYNAME' ),
- 'localyear' => array( '1', 'NÄ‚MÄỊAPHƯƠNG', 'LOCALYEAR' ),
- 'localtime' => array( '1', 'GIỜÄỊAPHƯƠNG', 'LOCALTIME' ),
- 'numberofpages' => array( '1', 'Sá»TRANG', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'Sá»BÀI', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'Sá»TẬPTIN', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'Sá»THÀNHVIÊN', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'Sá»THÀNHVIÊNTÃCHCá»°C', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'Sá»SỬAÄá»”I', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'Sá»LẦNXEM', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'TÊNTRANG', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
- 'talkspace' => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
- 'subjectspace' => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'fullpagename' => array( '1', 'TÊNTRANGÄỦ', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', 'TÊNTRANGPHỤ', 'SUBPAGENAME' ),
- 'basepagename' => array( '1', 'TÊNTRANGGá»C', 'BASEPAGENAME' ),
- 'talkpagename' => array( '1', 'TÊNTRANGTHẢOLUẬN', 'TALKPAGENAME' ),
- 'subjectpagename' => array( '1', 'TÊNTRANGNỘIDUNG', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'msg' => array( '0', 'NHẮN:', 'MSG:' ),
- 'subst' => array( '0', 'THẾ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'NHẮNMỚI:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'nhá»', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'nhá»=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'phải', 'right' ),
- 'img_left' => array( '1', 'trái', 'left' ),
- 'img_none' => array( '1', 'không', 'none' ),
- 'img_center' => array( '1', 'giữa', 'center', 'centre' ),
- 'img_framed' => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
- 'img_page' => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
- 'img_link' => array( '1', 'liên_kết=$1', 'link=$1' ),
- 'int' => array( '0', 'NỘI:', 'INT:' ),
- 'sitename' => array( '1', 'TÊNMẠNG', 'SITENAME' ),
- 'ns' => array( '0', 'KGT:', 'NS:' ),
- 'localurl' => array( '0', 'URLÄỊAPHƯƠNG:', 'LOCALURL:' ),
- 'articlepath' => array( '0', 'Lá»IBÀI', 'ARTICLEPATH' ),
- 'server' => array( '0', 'MÃYCHỦ', 'SERVER' ),
- 'servername' => array( '0', 'TÊNMÃYCHỦ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ÄƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'NGá»®PHÃP:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'GIá»NG:', 'GENDER:' ),
- 'notitleconvert' => array( '0', '__KHÔNGCHUYỂNTÊN__', '__NOTITLECONVERT__', '__NOTC__' ),
- 'nocontentconvert' => array( '0', '__KHÔNGCHUYỂNNỘIDUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'TUẦNNÀY', 'CURRENTWEEK' ),
- 'localweek' => array( '1', 'TUẦNÄỊAPHƯƠNG', 'LOCALWEEK' ),
- 'revisionid' => array( '1', 'Sá»BẢN', 'REVISIONID' ),
- 'revisionday' => array( '1', 'NGÀYBẢN', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'NGÀYBẢN2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'THÃNGBẢN', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'THÃNGBẢN1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
- 'plural' => array( '0', 'Sá»NHIỀU:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'URLÄỦ:', 'FULLURL:' ),
- 'newsectionlink' => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
- 'currentversion' => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
- 'urlencode' => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
- 'language' => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
- 'contentlanguage' => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
- 'numberofadmins' => array( '1', 'Sá»QUẢNLÃ', 'NUMBEROFADMINS' ),
- 'formatnum' => array( '0', 'PHÂNCHIASá»', 'FORMATNUM' ),
- 'defaultsort' => array( '1', 'XẾPMẶCÄỊNH:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'ÄƯỜNGDẪNTẬPTIN', 'FILEPATH:' ),
- 'tag' => array( '0', 'thẻ', 'tag' ),
- 'hiddencat' => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
- 'pagesize' => array( '1', 'Cá» TRANG', 'PAGESIZE' ),
- 'numberingroup' => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
- 'staticredirect' => array( '1', '__Äá»”IHƯỚNGNHẤTÄỊNH__', '__STATICREDIRECT__' ),
+ 'redirect' => array( '0', '#đổi', '#REDIRECT' ),
+ 'notoc' => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__MỤCLỤC__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__KHÔNGSỬAMỤC__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'THÃNGNÀY', 'THÃNGNÀY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'THÃNGNÀY1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'TÊNTHÃNGNÀY', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'TÊNDÀITHÃNGNÀY', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'TÊNNGẮNTHÃNGNÀY', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'NGÀYNÀY', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'NGÀYNÀY2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'TÊNNGÀYNÀY', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'NĂMNÀY', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'GIỜNÀY', 'CURRENTTIME' ),
+ 'localmonth' => array( '1', 'THÃNGÄỊAPHƯƠNG', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'THÃNGÄỊAPHƯƠNG1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'TÊNTHÃNGÄỊAPHƯƠNG', 'LOCALMONTHNAME' ),
+ 'localmonthabbrev' => array( '1', 'THÃNGÄỊAPHƯƠNGTẮT', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'NGÀYÄỊAPHƯƠNG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'NGÀYÄỊAPHƯƠNG2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'TÊNNGÀYÄỊAPHƯƠNG', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'NÄ‚MÄỊAPHƯƠNG', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'GIỜÄỊAPHƯƠNG', 'LOCALTIME' ),
+ 'numberofpages' => array( '1', 'Sá»TRANG', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'Sá»BÀI', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'Sá»TẬPTIN', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'Sá»THÀNHVIÊN', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'Sá»THÀNHVIÊNTÃCHCá»°C', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'Sá»SỬAÄá»”I', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'Sá»LẦNXEM', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'TÊNTRANG', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
+ 'talkspace' => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
+ 'subjectspace' => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'fullpagename' => array( '1', 'TÊNTRANGÄỦ', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', 'TÊNTRANGPHỤ', 'SUBPAGENAME' ),
+ 'basepagename' => array( '1', 'TÊNTRANGGá»C', 'BASEPAGENAME' ),
+ 'talkpagename' => array( '1', 'TÊNTRANGTHẢOLUẬN', 'TALKPAGENAME' ),
+ 'subjectpagename' => array( '1', 'TÊNTRANGNỘIDUNG', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'msg' => array( '0', 'NHẮN:', 'MSG:' ),
+ 'subst' => array( '0', 'THẾ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'NHẮNMỚI:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'nhá»', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'nhá»=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'phải', 'right' ),
+ 'img_left' => array( '1', 'trái', 'left' ),
+ 'img_none' => array( '1', 'không', 'none' ),
+ 'img_center' => array( '1', 'giữa', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
+ 'img_page' => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_link' => array( '1', 'liên_kết=$1', 'link=$1' ),
+ 'int' => array( '0', 'NỘI:', 'INT:' ),
+ 'sitename' => array( '1', 'TÊNMẠNG', 'SITENAME' ),
+ 'ns' => array( '0', 'KGT:', 'NS:' ),
+ 'localurl' => array( '0', 'URLÄỊAPHƯƠNG:', 'LOCALURL:' ),
+ 'articlepath' => array( '0', 'Lá»IBÀI', 'ARTICLEPATH' ),
+ 'server' => array( '0', 'MÃYCHỦ', 'SERVER' ),
+ 'servername' => array( '0', 'TÊNMÃYCHỦ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ÄƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'NGá»®PHÃP:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'GIá»NG:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__KHÔNGCHUYỂNTÊN__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__KHÔNGCHUYỂNNỘIDUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'currentweek' => array( '1', 'TUẦNNÀY', 'CURRENTWEEK' ),
+ 'localweek' => array( '1', 'TUẦNÄỊAPHƯƠNG', 'LOCALWEEK' ),
+ 'revisionid' => array( '1', 'Sá»BẢN', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'NGÀYBẢN', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'NGÀYBẢN2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'THÃNGBẢN', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'THÃNGBẢN1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
+ 'plural' => array( '0', 'Sá»NHIỀU:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'URLÄỦ:', 'FULLURL:' ),
+ 'newsectionlink' => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
+ 'language' => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', 'Sá»QUẢNLÃ', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'PHÂNCHIASá»', 'FORMATNUM' ),
+ 'defaultsort' => array( '1', 'XẾPMẶCÄỊNH:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', 'ÄƯỜNGDẪNTẬPTIN', 'FILEPATH:' ),
+ 'tag' => array( '0', 'thẻ', 'tag' ),
+ 'hiddencat' => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'Cá» TRANG', 'PAGESIZE' ),
+ 'numberingroup' => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__Äá»”IHƯỚNGNHẤTÄỊNH__', '__STATICREDIRECT__' ),
);
$datePreferences = array(
@@ -648,20 +648,22 @@ Xin hãy báo nó cho một [[Special:ListUsers/sysop|bảo quản viên]], tron
'formerror' => 'Lỗi: không gửi mẫu đi được.',
'badarticleerror' => 'Không thể thực hiện được tác vụ như thế tại trang này.',
'cannotdelete' => 'Không thể xóa trang hay tập tin “$1â€. Có thể nó đã bị ai đó xóa rồi.',
+'cannotdelete-title' => 'Không thể xóa 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.',
-'perfcachedts' => 'Dữ liệu dưới đây được đưa vào vùng nhớ đệm và được cập nhật lần cuối lúc $1.',
+'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.',
+'perfcachedts' => 'Dữ liệu dưới đây được đưa vào vùng nhớ đệm và được cập nhật lần cuối lúc $1. Tối đa có sẵn {{PLURAL:$4|một kết quả|$4 kết quả}} trong vùng nhớ đệm.',
'querypage-no-updates' => 'Việc cập nhật trang này hiện đã bị tắt. Dữ liệu ở đây có thể bị lá»—i thá»i.',
'wrong_wfQuery_params' => 'Tham số sai trong wfQuery()<br />
Hàm: $1<br />
Truy vấn: $2',
'viewsource' => 'Xem mã nguồn',
-'viewsourcefor' => 'đối với $1',
+'viewsource-title' => 'Xem mã nguồn của $1',
'actionthrottled' => 'Thao tác bị giới hạn',
'actionthrottledtext' => 'Äể nhằm tránh spam, bạn không thể thá»±c hiện thao tác này quá nhiá»u lần trong má»™t thá»i gian ngắn. Xin hãy chá» vài phút trÆ°á»›c khi thá»±c hiện lại.',
'protectedpagetext' => 'Trang này đã bị khóa không cho sửa đổi.',
'viewsourcetext' => 'Bạn vẫn có thể xem và chép xuống mã nguồn của trang này:',
+'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 báo trong giao diện phần má»m, và bị khóa để tránh phá hoại.',
'editinginterface' => "'''LÆ°u ý:''' Bạn Ä‘ang sá»­a chữa má»™t trang dùng để cung cấp thông báo 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 website này. Äể dịch thuật, hãy xem xét sá»­ dụng [//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)',
@@ -751,6 +753,7 @@ Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ
'emailconfirmlink' => 'Xác nhận địa chỉ thư điện tử',
'invalidemailaddress' => 'Äịa chỉ thÆ° Ä‘iện tá»­ không được chấp nhận vì định dạng thÆ° có vẻ sai.
Hãy nhập một địa chỉ có định dạng đúng hoặc bỠtrống ô đó.',
+'cannotchangeemail' => 'Không có thể thay đổi địa chỉ thư điện tử của các tài khoản trên wiki này.',
'accountcreated' => 'Mở tài khoản thành công',
'accountcreatedtext' => 'Tài khoản thành viên cho $1 đã được mở.',
'createaccount-title' => 'Tài khoản mới tại {{SITENAME}}',
@@ -766,6 +769,7 @@ Xin hãy đợi chốc lát rồi thử lại.',
# E-mail sending
'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
+'user-mail-no-addy' => 'Không có địa chỉ để gửi thư điện tử đến',
# Change password dialog
'resetpass' => 'Äổi mật khẩu',
@@ -786,16 +790,18 @@ Có thể bạn đã thay đổi thành công mật khẩu của mình hoặc đ
'resetpass-temp-password' => 'Mật khẩu tạm:',
# Special:PasswordReset
-'passwordreset' => 'Tái tạo mật khẩu',
-'passwordreset-text' => 'Hãy Ä‘iá»n mẫu Ä‘Æ¡n này để nhận thÆ° Ä‘iện tá»­ nhắc nhở vá» thông tin tài khoản của bạn.',
-'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-username' => 'Tên ngÆ°á»i dùng:',
-'passwordreset-domain' => 'Tên miá»n:',
-'passwordreset-email' => 'Äịa chỉ thÆ° Ä‘iện tá»­:',
-'passwordreset-emailtitle' => 'Thông tin tài khoản tại {{SITENAM}}',
-'passwordreset-emailtext-ip' => 'Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu má»™t lá»i
+'passwordreset' => 'Tái tạo mật khẩu',
+'passwordreset-text' => 'Hãy Ä‘iá»n mẫu Ä‘Æ¡n này để nhận thÆ° Ä‘iện tá»­ nhắc nhở vá» thông tin tài khoản của bạn.',
+'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-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',
+'passwordreset-capture-help' => 'Nếu bạn kiểm há»™p này, bạn sẽ xem thÆ° Ä‘iện tá»­ có mật khẩu tạm lúc khi nó được gá»­i cho ngÆ°á»i dùng.',
+'passwordreset-email' => 'Äịa chỉ thÆ° Ä‘iện tá»­:',
+'passwordreset-emailtitle' => 'Thông tin tài khoản tại {{SITENAM}}',
+'passwordreset-emailtext-ip' => 'Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu má»™t lá»i
nhắc nhở các thông tin tài khoản của bạn tại {{SITENAME}} ($4).
{{PLURAL:$3|Tài khoản|Các tài khoản}} ở dưới có đặt địa chỉ thư điện tử này:
@@ -806,7 +812,7 @@ ngay bây giỠđể chá»n mật khẩu má»›i. Nếu bạn không phải là n
đặt lại mật khẩu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn
muốn thay đổi nó, xin vui lòng kệ thông điệp này và tiếp tục sử dụng
mật khẩu cũ.',
-'passwordreset-emailtext-user' => 'Thành viên $1 tại {{SITENAME}} đã yêu cầu má»™t lá»i nhắc nhở
+'passwordreset-emailtext-user' => 'Thành viên $1 tại {{SITENAME}} đã yêu cầu má»™t lá»i nhắc nhở
các thông tin tài khoản của bạn tại {{SITENAME}} ($4). {{PLURAL:$3|Tài
khoản|Các
tài khoản}} ở dưới có đặt địa chỉ thư điện tử này:
@@ -818,9 +824,22 @@ ngay bây giỠđể chá»n mật khẩu má»›i. Nếu bạn không phải là n
đặt lại mật khẩu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn
muốn thay đổi nó, xin vui lòng kệ thông điệp này và tiếp tục sử dụng
mật khẩu cũ.',
-'passwordreset-emailelement' => 'Tên ngÆ°á»i dùng: $1
+'passwordreset-emailelement' => 'Tên ngÆ°á»i dùng: $1
Mật khẩu tạm: $2',
-'passwordreset-emailsent' => 'Äã gá»­i thÆ° Ä‘iện tá»­ nhắc nhở.',
+'passwordreset-emailsent' => 'Äã gá»­i thÆ° Ä‘iện tá»­ nhắc nhở.',
+'passwordreset-emailsent-capture' => 'Thư điện tử nhắc nhở ở dưới đã được gửi:',
+'passwordreset-emailerror-capture' => 'Không thể gá»­i thÆ° Ä‘iện tá»­ nhắc nhở ở dÆ°á»›i cho ngÆ°á»i dùng: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Äổi địa chỉ thÆ° Ä‘iện tá»­',
+'changeemail-header' => 'Äổi địa chỉ thÆ° Ä‘iện tá»­ của tài khoản',
+'changeemail-text' => 'Äiá»n biểu mẫu này để đổi địa chỉ thÆ° Ä‘iện tá»­. Bạn sẽ cần phải nhập mật khẩu để xác nhận thay đổi này.',
+'changeemail-no-info' => 'Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.',
+'changeemail-oldemail' => 'Äịa chỉ thÆ° Ä‘iện tá»­ hiện tại:',
+'changeemail-newemail' => 'Äịa chỉ thÆ° Ä‘iện tá»­ má»›i:',
+'changeemail-none' => '(không có)',
+'changeemail-submit' => 'Äổi địa chỉ',
+'changeemail-cancel' => 'Hủy bá»',
# Edit page toolbar
'bold_sample' => 'Chữ đậm',
@@ -891,9 +910,6 @@ Chú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho n
Äịa chỉ IP hiện tại của bạn là $3, mã số cấm là $5.
Xin hãy ghi kèm tất cả các chi tiết trên vào thư yêu cầu của bạn.",
'blockednoreason' => 'không đưa ra lý do',
-'blockedoriginalsource' => "Mã nguồn của '''$1''':",
-'blockededitsource' => "Các '''sửa đổi của bạn''' ở '''$1''':",
-'whitelistedittitle' => 'Cần đăng nhập để sửa trang',
'whitelistedittext' => 'Bạn phải $1 để sửa trang.',
'confirmedittext' => 'Bạn cần phải xác nhận địa chỉ thÆ° Ä‘iện tá»­ trÆ°á»›c khi được sá»­a đổi trang. Xin hãy đặt và xác nhận địa chỉ thÆ° Ä‘iện tá»­ của bạn dùng trang [[Special:Preferences|tùy chá»n]].',
'nosuchsectiontitle' => 'Không tìm thấy đỠmục',
@@ -974,7 +990,8 @@ Bạn phải đảm bảo vá»›i chúng tôi rằng chính bạn là ngÆ°á»i viá
'copyrightwarning2' => "Xin chú ý rằng tất cả các đóng góp của bạn tại {{SITENAME}} có thể được sửa đổi, thay thế, hoặc xóa bỠbởi các thành viên khác. Nếu bạn không muốn trang của bạn bị sửa đổi không thương tiếc, đừng đăng trang ở đây.<br />
Bạn phải đảm bảo vá»›i chúng tôi rằng chính bạn là ngÆ°á»i viết nên, hoặc chép nó từ má»™t nguồn thuá»™c phạm vi công cá»™ng hoặc tá»± do tÆ°Æ¡ng Ä‘Æ°Æ¡ng (xem $1 để biết thêm chi tiết).
'''ÄỪNG ÄÄ‚NG TÃC PHẨM CÓ BẢN QUYỀN MÀ CHƯA XIN PHÉP!'''",
-'longpageerror' => "'''LỖI: Văn bạn mà bạn muốn lưu dài $1 kilobyte, dài hơn độ dài tối đa cho phép $2 kilobyte. Không thể lưu trang.'''",
+'longpageerror' => "'''Lỗi: Văn bạn mà bạn muốn lưu dài $1 kilôbyte, dài hơn độ dài tối đa cho phép $2 kilôbyte.'''
+Không thể lưu trang.",
'readonlywarning' => "'''CẢNH BÃO: CÆ¡ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lÆ°u các sá»­a đổi của mình. Bạn nên cắt-dán Ä‘oạn bạn vừa sá»­a vào má»™t tập tin và lÆ°u nó lại để sá»­a đổi sau này.'''
Bảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
@@ -1142,8 +1159,6 @@ Các quản lý khác ở {{SITENAME}} vẫn có thể truy nhập vào nội du
'revdelete-unsuppress' => 'BỠcác hạn chế trên các phiên bản được phục hồi',
'revdelete-log' => 'Lý do:',
'revdelete-submit' => 'Ãp dụng vào {{PLURAL:$1|phiên bản|các phiên bản}} được chá»n',
-'revdelete-logentry' => 'đã thay đổi khả năng nhìn thấy phiên bản của [[$1]]',
-'logdelete-logentry' => 'đã thay đổi khả năng nhìn thấy sự kiện của [[$1]]',
'revdelete-success' => "'''Äã cập nhật thành công Ä‘á»™ khả kiến của phiên bản.'''",
'revdelete-failure' => "'''Không thể cập nhật khả năng hiển thị của phiên bản:'''
$1",
@@ -1155,15 +1170,6 @@ $1",
'revdel-restore-visible' => 'các phiên bản được hiện',
'pagehist' => 'Lịch sử trang',
'deletedhist' => 'Lịch sử đã xóa',
-'revdelete-content' => 'ná»™i dung',
-'revdelete-summary' => 'tóm lược sửa đổi',
-'revdelete-uname' => 'tên ngÆ°á»i dùng',
-'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
-'revdelete-unrestricted' => 'đã gỡ bỠhạn chế cho bảo quản viên',
-'revdelete-hid' => 'đã ẩn $1',
-'revdelete-unhid' => 'đã hiện $1',
-'revdelete-log-message' => '$2 {{PLURAL:$2|phiên bản|phiên bản}} được $1',
-'logdelete-log-message' => '$1 của $2 {{PLURAL:$2|sự kiện|sự kiện}}',
'revdelete-hide-current' => 'Xảy ra lỗi khi ẩn mục ghi lúc $2, $1: đây là phiên bản hiện tại.
Nó không ẩn đi được.',
'revdelete-show-no-access' => 'Có lá»—i khi hiện mục ghi lúc $2, $1: mục này đã được đánh dấu “hạn chếâ€.
@@ -1318,12 +1324,14 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
'prefs-rc' => 'Thay đổi gần đây',
'prefs-watchlist' => 'Theo dõi',
'prefs-watchlist-days' => 'Số ngày hiển thị trong danh sách theo dõi:',
-'prefs-watchlist-days-max' => 'Tối đa 7 ngày',
+'prefs-watchlist-days-max' => 'Tối đa $1 ngày',
'prefs-watchlist-edits' => 'Số lần sửa đổi tối đa trong danh sách theo dõi mở rộng:',
'prefs-watchlist-edits-max' => 'Con số tối đa: 1.000',
'prefs-watchlist-token' => 'Số thẻ Danh sách theo dõi:',
'prefs-misc' => 'Linh tinh',
'prefs-resetpass' => 'Thay đổi mật khẩu',
+'prefs-changeemail' => 'Äổi địa chỉ thÆ° Ä‘iện tá»­',
+'prefs-setemail' => 'Äặt địa chỉ thÆ° Ä‘iện tá»­',
'prefs-email' => 'Tùy chá»n thÆ° Ä‘iện tá»­',
'prefs-rendering' => 'BỠngoài',
'saveprefs' => 'LÆ°u tùy chá»n',
@@ -1383,6 +1391,7 @@ Không có thể lùi lại tác động này.',
'yourrealname' => 'Tên thật:',
'yourlanguage' => 'Ngôn ngữ:',
'yourvariant' => 'Dạng chữ của nội dung:',
+'prefs-help-variant' => 'Phép chính tả hoặc bộ chữ để hiển thị nội dung của các trang tại wiki này.',
'yournick' => 'Chữ ký:',
'prefs-help-signature' => 'Các ý kiến tại trang thảo luận nên được ký tên bằng cách gõ "<nowiki>~~~~</nowiki>", nó sẽ được đổi thành chữ ký của bạn cùng vá»›i thá»i Ä‘iểm thảo luận.',
'badsig' => 'Chữ ký không hợp lệ; hãy kiểm tra thẻ HTML.',
@@ -1424,7 +1433,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'userrights-lookup-user' => 'Quản lý nhóm thành viên',
'userrights-user-editname' => 'Nhập tên thành viên:',
'editusergroup' => 'Sửa nhóm thành viên',
-'editinguser' => "Thay đổi quyá»n hạn của thành viên '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Thay đổi quyá»n hạn của thành viên '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Sửa nhóm thành viên',
'saveusergroups' => 'Lưu nhóm thành viên',
'userrights-groupsmember' => 'Thuộc nhóm:',
@@ -1518,13 +1527,13 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'right-autopatrol' => 'Tự động đánh dấu tuần tra khi sửa đổi',
'right-patrolmarks' => 'Dùng tính năng tuần tra thay đổi gần đây',
'right-unwatchedpages' => 'Xem danh sách các trang chưa theo dõi',
-'right-trackback' => 'Äăng trackback',
'right-mergehistory' => 'Trộn lịch sử trang',
'right-userrights' => 'Sá»­a tất cả quyá»n thành viên',
'right-userrights-interwiki' => 'Sá»­a quyá»n thành viên của các thành viên ở các wiki khác',
'right-siteadmin' => 'Khóa và mở khóa cơ sở dữ liệu',
'right-override-export-depth' => 'Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5',
'right-sendemail' => 'Gửi thư điện tử cho thành viên khác',
+'right-passwordreset' => 'Xem các thư điện tử đặt lại mật khẩu',
# User rights log
'rightslog' => 'Nhật trình cấp quyá»n thành viên',
@@ -1558,16 +1567,17 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'action-suppressionlog' => 'xem nhật trình ẩn giấu này',
'action-block' => 'cấm không cho ngÆ°á»i dùng này sá»­a đổi',
'action-protect' => 'thay đổi mức khóa của trang này',
+'action-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 đó',
'action-import' => 'nhập trang này từ wiki khác',
'action-importupload' => 'nhập trang này bằng cách tải lên tập tin',
'action-patrol' => 'đánh dấu đã tuần tra vào sá»­a đổi của ngÆ°á»i khác',
'action-autopatrol' => 'tự động đánh dấu đã tuần tra vào sửa đổi của bạn',
'action-unwatchedpages' => 'xem danh sách các trang chưa được theo dõi',
-'action-trackback' => 'gá»­i TrackBack',
'action-mergehistory' => 'hợp nhất lịch sử của trang này',
'action-userrights' => 'sá»­a đổi má»i quyá»n ngÆ°á»i dùng',
'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ử',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
@@ -1599,6 +1609,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|ngÆ°á»i|ngÆ°á»i}} Ä‘ang xem]',
'rc_categories' => 'Hạn chế theo thể loại (phân cách bằng “|â€)',
'rc_categories_any' => 'Bất kỳ',
+'rc-change-size-new' => '$1 byte sau thay đổi',
'newsectionsummary' => 'Äá» mục má»›i: /* $1 */',
'rc-enhanced-expand' => 'Xem chi tiết (cần JavaScript)',
'rc-enhanced-hide' => 'Giấu chi tiết',
@@ -1653,6 +1664,7 @@ Xem [[Special:NewFiles|trang trưng bày các tập tin mới]] để xem trực
'ignorewarnings' => 'BỠqua cảnh báo',
'minlength1' => 'Tên tập tin phải có ít nhất một ký tự.',
'illegalfilename' => 'Tên tập tin “$1†có chứa ký tự không được phép dùng cho tựa trang. Xin hãy đổi tên và tải lên lại.',
+'filename-toolong' => 'Tên tập tin không có thể dài quá 240 byte.',
'badfilename' => 'Tên tập tin đã được đổi thành “$1â€.',
'filetype-mime-mismatch' => 'Phần mở rá»™ng của tập tin (“.$1â€) không phù hợp kiểu MIME được nhận ra ($2).',
'filetype-badmime' => 'Không thể tải lên các tập tin có kiểu MIME “$1â€.',
@@ -1759,6 +1771,41 @@ Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers
'upload-unknown-size' => 'Không rõ kích thước',
'upload-http-error' => 'Xảy ra lỗi HTTP: $1',
+# File backend
+'backend-fail-stream' => 'Không thể gửi luồng tập tin $1.',
+'backend-fail-backup' => 'Không thể sao lưu tập tin $1.',
+'backend-fail-notexists' => 'Tập tin $1 không tồn tại.',
+'backend-fail-hashes' => 'Không thể tính các mã băm tập tin để so sánh.',
+'backend-fail-notsame' => 'Một tập tin khác biệt đã tồn tại ở $1.',
+'backend-fail-invalidpath' => '$1 không phải Ä‘Æ°á»ng dẫn lÆ°u giữ hợp lệ.',
+'backend-fail-delete' => 'Không thể xóa tập tin $1.',
+'backend-fail-alreadyexists' => 'Tập tin $1 đã tồn tại.',
+'backend-fail-store' => 'Không thể lưu tập tin $1 tại $2.',
+'backend-fail-copy' => 'Không thể chép tập tin $1 đến $2.',
+'backend-fail-move' => 'Không thể di chuyển tập tin $1 đến $2.',
+'backend-fail-opentemp' => 'Không thể mở tập tin tạm thá»i.',
+'backend-fail-writetemp' => 'Không thể ghi vào tập tin tạm thá»i.',
+'backend-fail-closetemp' => 'Không thể đóng tập tin tạm thá»i.',
+'backend-fail-read' => 'Không thể Ä‘á»c tập tin $1.',
+'backend-fail-create' => 'Không thể tạo tập tin $1.',
+'backend-fail-readonly' => 'Phía sau lÆ°u trữ “$1†bây giá» là chỉ-Ä‘á»c. Lý do Ä‘Æ°a ra là: “$2â€',
+'backend-fail-synced' => 'Tập tin “$1†đang có trạng thái không nhất quán đối với các phía sau lưu trữ nội bộ',
+'backend-fail-connect' => 'Không thể kết nối đến phía sau lÆ°u trữ “$1â€.',
+'backend-fail-internal' => 'Lá»—i không rõ xuất hiện trong phía sau lÆ°u trữ “$1â€.',
+'backend-fail-contenttype' => 'Không thể xác định kiểu ná»™i dung của tập tin để lÆ°u giữ tại “$1â€.',
+'backend-fail-batchsize' => 'Phía sau lưu trữ đã nhận một loạt $1 thao tác tập tin; mức hạn là $2 thao tác.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Không thể mở khóa “$1â€; nó chÆ°a khóa.',
+'lockmanager-fail-closelock' => 'Không thể đóng tập tin khóa cho “$1â€.',
+'lockmanager-fail-deletelock' => 'Không thể xóa tập tin khóa cho “$1â€.',
+'lockmanager-fail-acquirelock' => 'Không thể lấy khóa cho “$1â€.',
+'lockmanager-fail-openlock' => 'Không thể mở tập tin khóa cho “$1â€.',
+'lockmanager-fail-releaselock' => 'Không thể thả khóa cho “$1â€.',
+'lockmanager-fail-db-bucket' => 'Không thể liên lạc với đủ cơ sở dữ liệu khóa trong nhóm $1.',
+'lockmanager-fail-db-release' => 'Không thể thả các chìa khóa trên cơ sở dữ liệu $1.',
+'lockmanager-fail-svr-release' => 'Không thể thả các chìa khóa trên máy chủ $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Lỗi khi mở tập tin để kiểm tra tập tin ZIP.',
'zip-wrong-format' => 'Tập tin này không phải là tập tin ZIP.',
@@ -1775,6 +1822,7 @@ Không thể kiểm tra nó vỠbảo mật.',
'uploadstash-badtoken' => 'Tác vụ bị thất bại, có lẽ vì thông tin đăng nhập của bạn đã hết hạn. Hãy thử lại.',
'uploadstash-errclear' => 'Việc dá»n sạch các tập tin bị thất bại.',
'uploadstash-refresh' => 'Làm mới danh sách tập tin',
+'invalid-chunk-offset' => 'Khúc lệch (chunk offset) không hợp lệ',
# img_auth script messages
'img-auth-accessdenied' => 'Không cho phép truy cập',
@@ -1881,23 +1929,24 @@ Lá»i miêu tả tại [$2 trang mô tả tập tin] tại đấy được hiể
'filerevert-badversion' => 'Không tồn tại phiên bản trÆ°á»›c đó của tập tin tại thá»i Ä‘iểm trên.',
# File deletion
-'filedelete' => 'Xóa $1',
-'filedelete-legend' => 'Xóa tập tin',
-'filedelete-intro' => "Bạn sắp xóa tập tin '''[[Media:$1|$1]]''' cùng với tất cả lịch sử của nó.",
-'filedelete-intro-old' => "Bạn đang xóa phiên bản của '''[[Media:$1|$1]]''' vào lúc [$4 $3, $2].",
-'filedelete-comment' => 'Lý do:',
-'filedelete-submit' => 'Xóa',
-'filedelete-success' => "'''$1''' đã bị xóa.",
-'filedelete-success-old' => "Phiên bản của '''[[Media:$1|$1]]''' vào lúc $3, $2 đã bị xóa.",
-'filedelete-nofile' => "'''$1''' không tồn tại.",
-'filedelete-nofile-old' => "Không có phiên bản lưu trữ của '''$1''' với các thuộc tính này.",
-'filedelete-otherreason' => 'Lý do bổ sung:',
-'filedelete-reason-otherlist' => 'Lý do khác',
-'filedelete-reason-dropdown' => '*Những lý do xóa thÆ°á»ng gặp
+'filedelete' => 'Xóa $1',
+'filedelete-legend' => 'Xóa tập tin',
+'filedelete-intro' => "Bạn sắp xóa tập tin '''[[Media:$1|$1]]''' cùng với tất cả lịch sử của nó.",
+'filedelete-intro-old' => "Bạn đang xóa phiên bản của '''[[Media:$1|$1]]''' vào lúc [$4 $3, $2].",
+'filedelete-comment' => 'Lý do:',
+'filedelete-submit' => 'Xóa',
+'filedelete-success' => "'''$1''' đã bị xóa.",
+'filedelete-success-old' => "Phiên bản của '''[[Media:$1|$1]]''' vào lúc $3, $2 đã bị xóa.",
+'filedelete-nofile' => "'''$1''' không tồn tại.",
+'filedelete-nofile-old' => "Không có phiên bản lưu trữ của '''$1''' với các thuộc tính này.",
+'filedelete-otherreason' => 'Lý do bổ sung:',
+'filedelete-reason-otherlist' => 'Lý do khác',
+'filedelete-reason-dropdown' => '*Những lý do xóa thÆ°á»ng gặp
** Vi phạm bản quyá»n
** Tập tin trùng lắp',
-'filedelete-edit-reasonlist' => 'Sửa lý do xóa',
-'filedelete-maintenance' => 'Tác vụ xóa và phục hồi tập tin đã bị tắt tạm thá»i trong khi bảo trì.',
+'filedelete-edit-reasonlist' => 'Sửa lý do xóa',
+'filedelete-maintenance' => 'Tác vụ xóa và phục hồi tập tin đã bị tắt tạm thá»i trong khi bảo trì.',
+'filedelete-maintenance-title' => 'Không thể xóa tập tin',
# MIME search
'mimesearch' => 'Tìm kiếm theo định dạng',
@@ -1994,6 +2043,8 @@ Các mục <del>bị gạch bá»</del> là các trang đã được sá»­a.',
'wantedpages' => 'Trang cần viết',
'wantedpages-badtitle' => 'Tiêu đỠkhông hợp lệ trong tập kết quả: $1',
'wantedfiles' => 'Tập tin cần thiết',
+'wantedfiletext-cat' => 'Các tập tin sau được nhúng nhÆ°ng không tồn tại. Các tập tin từ kho dùng chung có thể được liệt kê trong khi tồn tại; các trÆ°á»ng hợp này được <del>gạch bá»</del>. Ngoài ra, các trang nhúng tập tin không tồn tại được liệt kê tại [[:$1]].',
+'wantedfiletext-nocat' => 'Các tập tin sau được nhúng nhÆ°ng không tồn tại. Các tập tin từ kho dùng chung có thể được liệt kê trong khi tồn tại; các trÆ°á»ng hợp này được <del>gạch bá»</del>.',
'wantedtemplates' => 'Bản mẫu cần viết nhất',
'mostlinked' => 'Trang được liên kết đến nhiá»u nhất',
'mostlinkedcategories' => 'Thể loại có nhiá»u trang nhất',
@@ -2002,6 +2053,7 @@ Các mục <del>bị gạch bá»</del> là các trang đã được sá»­a.',
'mostimages' => 'Tập tin được liên kết đến nhiá»u nhất',
'mostrevisions' => 'Các 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)',
'shortpages' => 'Trang ngắn nhất',
'longpages' => 'Trang dài nhất',
'deadendpages' => 'Trang Ä‘Æ°á»ng cùng',
@@ -2018,7 +2070,7 @@ Các mục <del>bị gạch bá»</del> là các trang đã được sá»­a.',
'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',
'usereditcount' => '$1 {{PLURAL:$1|sửa đổi|sửa đổi}}',
-'usercreated' => 'Tạo tài khoản $1 lúc $2',
+'usercreated' => '{{GENDER:$3}}mở $1 lúc $2',
'newpages' => 'Các trang mới nhất',
'newpages-username' => 'Tên ngÆ°á»i dùng:',
'ancientpages' => 'Các trang cũ nhất',
@@ -2109,12 +2161,8 @@ Xem thêm [[Special:WantedCategories|thể loại cần thiết]].',
'activeusers-noresult' => 'Không thấy thành viên.',
# Special:Log/newusers
-'newuserlogpage' => 'Nhật trình mở tài khoản',
-'newuserlogpagetext' => 'Äây là danh sách những tài khoản thành viên mở lên gần đây.',
-'newuserlog-byemail' => 'gửi mật khẩu qua thư điện tử',
-'newuserlog-create-entry' => 'đã mở tài khoản mới',
-'newuserlog-create2-entry' => 'đã tạo tài khoản mới với tên $1',
-'newuserlog-autocreate-entry' => 'Tài khoản được tạo tự động',
+'newuserlogpage' => 'Nhật trình mở tài khoản',
+'newuserlogpagetext' => 'Äây là danh sách những tài khoản thành viên mở lên gần đây.',
# Special:ListGroupRights
'listgrouprights' => 'Nhóm thành viên',
@@ -2143,7 +2191,7 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] vỠtừng nhó
'emailpagetext' => 'Mẫu dÆ°á»›i đây sẽ gá»­i má»™t bức thÆ° Ä‘iện tá»­ tá»›i ngÆ°á»i dùng này.
Äịa chỉ thÆ° Ä‘iện tá»­ mà bạn đã cung cấp trong [[Special:Preferences|tùy chá»n cá nhân của mình]] sẽ xuất hiện trong phần địa chỉ “NgÆ°á»i gá»­i†của bức thÆ°, do đó ngÆ°á»i nhận sẽ có thể trả lá»i trá»±c tiếp cho bạn.',
'usermailererror' => 'Lá»—i gá»­i thÆ°:',
-'defemailsubject' => 'thư gửi từ {{SITENAME}}',
+'defemailsubject' => 'ThÆ° của ngÆ°á»i dùng "$1" tại {{SITENAME}}',
'usermaildisabled' => 'Chức năng gá»­i thÆ° cho ngÆ°á»i dùng đã bị tắt.',
'usermaildisabledtext' => 'Bạn không thể gá»­i thÆ° Ä‘iện tá»­ cho những ngÆ°á»i dùng khác trên wiki này.',
'noemailtitle' => 'Không có địa chỉ nhận thư',
@@ -2197,7 +2245,7 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
'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}}.',
'iteminvalidname' => 'Tên trang “$1†không hợp lệ…',
-'wlnote' => "Dưới đây là {{PLURAL:$1|sửa đổi cuối cùng|'''$1''' sửa đổi mới nhất}} trong '''$2''' giỠqua.",
+'wlnote' => "DÆ°á»›i đây là {{PLURAL:$1|thay đổi '''duy nhất'''|'''$1''' thay đổi gần nhất}} trong {{PLURAL:$2|giá»|'''$2''' giá»}} qua, tính tá»›i $3 lúc $4.",
'wlshowlast' => 'Hiển thị $1 giỠ$2 ngày gần đây $3',
'watchlist-options' => 'Tùy chá»n vá» danh sách theo dõi',
@@ -2262,8 +2310,6 @@ Xin xác nhận việc bạn định làm, và hiểu rõ những hệ lụy cá»
'actioncomplete' => 'Äã thá»±c hiện xong',
'actionfailed' => 'Tác động bị thất bại',
'deletedtext' => 'Äã xóa “$1â€. Xem danh sách các xóa bá» gần nhất tại $2.',
-'deletedarticle' => 'đã xóa “[[$1]]â€',
-'suppressedarticle' => 'đã giấu "[[$1]]"',
'dellogpage' => 'Nhật trình xóa',
'dellogpagetext' => 'Dưới đây là danh sách các trang bị xóa gần đây nhất.',
'deletionlog' => 'nhật trình xóa',
@@ -2310,7 +2356,10 @@ quay vỠphiên bản cuối của $2.',
'unprotectedarticle' => 'đã mở khóa cho “[[$1]]â€',
'movedarticleprotection' => 'đã di chuyển thiết lập khóa trang từ “[[$2]]†đến “[[$1]]â€',
'protect-title' => 'Thiết lập mức khóa cho “$1â€',
+'protect-title-notallowed' => 'Xem mức khóa cho “$1â€',
'prot_1movedto2' => '[[$1]] đổi thành [[$2]]',
+'protect-badnamespace-title' => 'Không gian tên không thể khóa',
+'protect-badnamespace-text' => 'Không thể khóa các trang tại không gian tên này.',
'protect-legend' => 'Xác nhận khóa',
'protectcomment' => 'Lý do:',
'protectexpiry' => 'Thá»i hạn:',
@@ -2331,6 +2380,7 @@ hiện tại của trang '''$1''':",
'protect-level-sysop' => 'Cấm má»i thành viên (trừ bảo quản viên)',
'protect-summary-cascade' => 'khóa theo tầng',
'protect-expiring' => 'hết hạn $1 (UTC)',
+'protect-expiring-local' => 'hết hạn $1',
'protect-expiry-indefinite' => 'vô thá»i hạn',
'protect-cascade' => 'Tự động khóa các trang được nhúng vào trang này (khóa theo tầng)',
'protect-cantedit' => 'Bạn không thể thay đổi mức khóa cho trang này do không có đủ quyá»n hạn.',
@@ -2390,7 +2440,6 @@ Chỉ có bảo quản viên mới xem được văn bản đầy đủ của nh
'undeletereset' => 'Tẩy trống',
'undeleteinvert' => 'Äảo sá»± lá»±a chá»n',
'undeletecomment' => 'Lý do:',
-'undeletedarticle' => 'đã phục hồi “$1â€',
'undeletedrevisions' => '$1 {{PLURAL:$1|bản|bản}} được phục hồi',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|bản|bản}} và $2 {{PLURAL:$2|tập tin|tập tin}} đã được phục hồi',
'undeletedfiles' => '$1 {{PLURAL:$1|tập tin|tập tin}} đã được phục hồi',
@@ -2400,6 +2449,7 @@ má»™t ngÆ°á»i nào khác đã phục hồi trang này rồi.',
Xem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
'undelete-header' => 'Xem các trang bị xóa gần đây tại [[Special:Log/delete|nhật trình xóa]].',
+'undelete-search-title' => 'Tìm kiếm trang đã bị xóa',
'undelete-search-box' => 'Tìm kiếm trang đã bị xóa',
'undelete-search-prefix' => 'Hiển thị trang có tiá»n tố:',
'undelete-search-submit' => 'Tìm kiếm',
@@ -2408,6 +2458,7 @@ Xem nhật trình xóa và phục hồi các trang gần đây tại [[Special:L
'undelete-bad-store-key' => 'Không thể phục hồi phiên bản tập tin tại thá»i Ä‘iểm $1: tập tin không tồn tại trÆ°á»›c khi xóa.',
'undelete-cleanup-error' => 'Có lỗi khi xóa các tập tin lưu trữ “$1†không được sử dụng.',
'undelete-missing-filearchive' => 'Không thể phục hồi bộ tập tin có định danh $1 vì nó không nằm ở cơ sở dữ liệu. Có thể nó được phục hồi rồi.',
+'undelete-error' => 'Lỗi khi phục hồi trang',
'undelete-error-short' => 'Có lỗi khi phục hồi tập tin: $1',
'undelete-error-long' => 'Xuất hiện lỗi khi phục hồi tập tin:
@@ -2531,6 +2582,7 @@ $1',
'blocklist-userblocks' => 'Ẩn tác vụ cấm tài khoản',
'blocklist-tempblocks' => 'Ẩn tác vụ cấm có thá»i hạn',
'blocklist-addressblocks' => 'Ẩn tác vụ cấm địa chỉ IP dứt khoát',
+'blocklist-rangeblocks' => 'Ẩn tác vụ cấm hàng loạt',
'blocklist-timestamp' => 'Thá»i gian',
'blocklist-target' => 'NgÆ°á»i dùng',
'blocklist-expiry' => 'Thá»i hạn',
@@ -2553,6 +2605,7 @@ $1',
'unblocklink' => 'bỠcấm',
'change-blocklink' => 'đổi mức cấm',
'contribslink' => 'đóng góp',
+'emaillink' => 'gửi thư điện tử',
'autoblocker' => 'Bạn bị tá»± Ä‘á»™ng cấm vì địa chỉ IP của bạn vừa rồi đã được “[[User:$1|$1]]†sá»­ dụng. Lý do Ä‘Æ°a ra cho việc cấm $1 là: â€$2â€',
'blocklogpage' => 'Nhật trình cấm',
'blocklog-showlog' => 'Thành viên này trước đây đã bị cấm. Nhật trình cấm được ghi ra ở đây để tiện theo dõi:',
@@ -2672,9 +2725,6 @@ Xin hãy chá»n tên khác.',
'movepage-page-moved' => 'Trang $1 đã được di chuyển đến $2.',
'movepage-page-unmoved' => 'Trang $1 không thể di chuyển đến $2.',
'movepage-max-pages' => 'Äã có tối Ä‘a $1 {{PLURAL:$1|trang|trang}} đã di chuyển và không tá»± Ä‘á»™ng di chuyển thêm được nữa.',
-'1movedto2' => '[[$1]] đổi thành [[$2]]',
-'1movedto2_redir' => '[[$1]] đổi thành [[$2]] qua đổi hướng',
-'move-redirect-suppressed' => 'đã tắt đổi hướng',
'movelogpage' => 'Nhật trình di chuyển',
'movelogpagetext' => 'Dưới đây là danh sách các trang đã được di chuyển.',
'movesubpage' => '{{PLURAL:$1|Trang con|Các trang con}}',
@@ -2687,7 +2737,7 @@ Xin hãy chá»n tên khác.',
Trang vá»›i tên “[[:$1]]†đã tồn tại. Bạn có muốn xóa nó để dá»n chá»— di chuyển tá»›i tên này không?',
'delete_and_move_confirm' => 'Xóa trang để đổi tên',
-'delete_and_move_reason' => 'Xóa để có chỗ đổi tên',
+'delete_and_move_reason' => 'Xóa để có chá»— đổi tên “[[$1]]â€',
'selfmove' => 'Tên mới giống tên cũ; không đổi tên một trang thành chính nó.',
'immobile-source-namespace' => 'Không thể di chuyển các trang trong không gian tên “$1â€',
'immobile-target-namespace' => 'Không thể di chuyển trang vào không gian tên “$1â€',
@@ -2717,9 +2767,11 @@ Những tập tin này cũng có thể được nhập vào wiki khác có sử
Äể xuất các trang, nhập vào tên trang trong há»™p soạn thảo ở dÆ°á»›i, má»—i dòng má»™t tên, và lá»±a chá»n bạn muốn phiên bản hiện tại cÅ©ng nhÆ° tất cả phiên bản cÅ©, vá»›i các dòng lịch sá»­ trang, hay chỉ là phiên bản hiện tại vá»›i thông tin vá» lần sá»­a đổi cuối.
Trong trÆ°á»ng hợp sau bạn cÅ©ng có thể dùng má»™t liên kết, ví dụ [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] để biểu thị trang “[[{{MediaWiki:Mainpage}}]]â€.',
+'exportall' => 'Xuất tất cả các trang',
'exportcuronly' => 'Chỉ xuất phiên bản hiện hành, không xuất tất cả lịch sử trang',
'exportnohistory' => "----
'''Chú ý:''' Chức năng xuất lịch sử trang đầy đủ bằng mẫu này bị tắt do vấn đỠhiệu suất.",
+'exportlistauthors' => 'Bao gồm danh sách ngÆ°á»i đóng góp đầy đủ cho má»—i trang',
'export-submit' => 'Xuất',
'export-addcattext' => 'Thêm trang từ thể loại:',
'export-addcat' => 'Thêm',
@@ -2752,6 +2804,8 @@ Má»i vào [//www.mediawiki.org/wiki/Localisation Äịa phÆ°Æ¡ng hóa MediaWiki
'thumbnail_error' => 'Hình thu nhỠcó lỗi: $1',
'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',
+'thumbnail-dest-create' => 'Không thể lÆ°u hình nhá» vào Ä‘Æ°á»ng dẫn đích',
'thumbnail_invalid_params' => 'Tham số hình thu nhỠkhông hợp lệ',
'thumbnail_dest_directory' => 'Không thể tạo thư mục đích',
'thumbnail_image-type' => 'Không hỗ trợ kiểu hình này',
@@ -2796,6 +2850,11 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'import-upload' => 'Tải lên dữ liệu XML',
'import-token-mismatch' => 'Mất dữ liệu phiên làm việc. Xin hãy thử lại lần nữa.',
'import-invalid-interwiki' => 'Không thể nhập trang từ wiki được chỉ định.',
+'import-error-edit' => 'Trang “$1†không được nhập tại vì bạn không được phép sửa đổi nó.',
+'import-error-create' => 'Trang “$1†không được nhập tại vì bạn không được phép tạo ra nó.',
+'import-error-interwiki' => 'Trang “$1†không được nhập vì tên của nó được dành riêng cho liên kết ngoài (liên wiki).',
+'import-error-special' => 'Trang “$1†không được nhập vì nó thuộc vỠkhông gian tên đặc biệt không cho phép các trang không mặc định.',
+'import-error-invalid' => 'Trang “$1†không được nhập vì tên của nó không hợp lệ.',
# Import log
'importlogpage' => 'Nhật trình nhập trang',
@@ -2805,72 +2864,85 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'import-logentry-interwiki' => 'đã nhập vào $1 từ wiki khác',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|phiên bản|phiên bản}} từ $2',
+# JavaScriptTest
+'javascripttest' => 'Kiểm thử JavaScript',
+'javascripttest-disabled' => 'Chức năng này đã bị tắt.',
+'javascripttest-title' => 'Äang chạy $1 ca kiểm thá»­',
+'javascripttest-pagetext-noframework' => 'Trang này dành cho việc chạy các ca kiểm thử JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Ná»n tảng kiểm thá»­ không rõ “$1â€.',
+'javascripttest-pagetext-frameworks' => 'Hãy chá»n má»™t trong những ná»n tảng kiểm thá»­ sau: $1',
+'javascripttest-pagetext-skins' => 'Hãy chá»n má»™t bá» ngoài để sá»­ dụng vá»›i các ca kiểm thá»­:',
+'javascripttest-qunit-intro' => 'Xem [$1 tài liệu kiểm thử] tại mediawiki.org.',
+'javascripttest-qunit-heading' => 'Tập kiểm thử QUnit JavaScript MediaWiki',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Trang cá nhân của tôi',
-'tooltip-pt-anonuserpage' => 'Trang của IP bạn đang dùng',
-'tooltip-pt-mytalk' => 'Thảo luận với tôi',
-'tooltip-pt-anontalk' => 'Thảo luận với địa chỉ IP này',
-'tooltip-pt-preferences' => 'Tùy chá»n cá nhân của tôi',
-'tooltip-pt-watchlist' => 'Thay đổi của các trang tôi theo dõi',
-'tooltip-pt-mycontris' => 'Danh sách các đóng góp của tôi',
-'tooltip-pt-login' => 'Äăng nhập sẽ có lợi hÆ¡n, tuy nhiên không bắt buá»™c.',
-'tooltip-pt-anonlogin' => 'Không đăng nhập vẫn tham gia được, tuy nhiên đăng nhập sẽ lợi hơn.',
-'tooltip-pt-logout' => 'Äăng xuất',
-'tooltip-ca-talk' => 'Thảo luận vỠtrang này',
-'tooltip-ca-edit' => 'Bạn có thể sửa được trang này. Xin xem thử trước khi lưu.',
-'tooltip-ca-addsection' => 'Bắt đầu một đỠmục mới',
-'tooltip-ca-viewsource' => 'Trang này được khóa. Bạn có thể xem mã nguồn.',
-'tooltip-ca-history' => 'Những phiên bản cũ của trang này.',
-'tooltip-ca-protect' => 'Khóa trang này lại',
-'tooltip-ca-unprotect' => 'Thay đổi mức khóa của trang này',
-'tooltip-ca-delete' => 'Xóa trang này',
-'tooltip-ca-undelete' => 'Phục hồi những sửa đổi trên trang này như trước khi nó bị xóa',
-'tooltip-ca-move' => 'Di chuyển trang này',
-'tooltip-ca-watch' => 'Thêm trang này vào danh sách theo dõi',
-'tooltip-ca-unwatch' => 'Bá» trang này khá»i danh sách theo dõi',
-'tooltip-search' => 'Tìm kiếm {{SITENAME}}',
-'tooltip-search-go' => 'Xem trang khớp với tên này nếu có',
-'tooltip-search-fulltext' => 'Tìm trang có nội dung này',
-'tooltip-p-logo' => 'Trang Chính',
-'tooltip-n-mainpage' => 'Äi đến Trang Chính',
-'tooltip-n-mainpage-description' => 'Xem trang chính',
-'tooltip-n-portal' => 'Giới thiệu dự án, cách sử dụng và tìm kiếm thông tin ở đây',
-'tooltip-n-currentevents' => 'Các trang có liên quan đến tin tức',
-'tooltip-n-recentchanges' => 'Danh sách các thay đổi gần đây',
-'tooltip-n-randompage' => 'Xem trang ngẫu nhiên',
-'tooltip-n-help' => 'Nơi tìm hiểu thêm cách dùng.',
-'tooltip-t-whatlinkshere' => 'Các trang liên kết đến đây',
-'tooltip-t-recentchangeslinked' => 'Thay đổi gần đây của các trang liên kết đến đây',
-'tooltip-feed-rss' => 'Nguồn tin RSS của trang này',
-'tooltip-feed-atom' => 'Nguồn tin Atom của trang này',
-'tooltip-t-contributions' => 'Xem đóng góp của ngÆ°á»i này',
-'tooltip-t-emailuser' => 'Gá»­i thÆ° cho ngÆ°á»i này',
-'tooltip-t-upload' => 'Tải hình ảnh hoặc tập tin lên',
-'tooltip-t-specialpages' => 'Danh sách các trang đặc biệt',
-'tooltip-t-print' => 'Bản để in ra của trang',
-'tooltip-t-permalink' => 'Liên kết thÆ°á»ng trá»±c đến phiên bản này của trang',
-'tooltip-ca-nstab-main' => 'Xem trang nội dung này',
-'tooltip-ca-nstab-user' => 'Xem trang vá» ngÆ°á»i này',
-'tooltip-ca-nstab-media' => 'Xem trang phương tiện',
-'tooltip-ca-nstab-special' => 'Äây là má»™t trang đặc biệt, bạn không thể sá»­a đổi nó.',
-'tooltip-ca-nstab-project' => 'Xem trang dự án',
-'tooltip-ca-nstab-image' => 'Xem trang miêu tả tập tin',
-'tooltip-ca-nstab-mediawiki' => 'Xem thông báo hệ thống',
-'tooltip-ca-nstab-template' => 'Xem bản mẫu',
-'tooltip-ca-nstab-help' => 'Xem trang trợ giúp',
-'tooltip-ca-nstab-category' => 'Xem trang thể loại',
-'tooltip-minoredit' => 'Äánh dấu đây là sá»­a đổi nhá»',
-'tooltip-save' => 'Lưu lại những thay đổi của bạn',
-'tooltip-preview' => 'Xem thử những thay đổi, hãy dùng nó trước khi lưu!',
-'tooltip-diff' => 'Xem thay đổi bạn đã thực hiện.',
-'tooltip-compareselectedversions' => 'Xem khác biệt giữa hai phiên bản đã chá»n của trang này.',
-'tooltip-watch' => 'Thêm trang này vào danh sách theo dõi',
-'tooltip-recreate' => 'Tạo lại trang dù cho nó vừa bị xóa',
-'tooltip-upload' => 'Bắt đầu tải lên',
-'tooltip-rollback' => '"Lùi tất cả" sẽ lùi má»i sá»­a đổi của ngÆ°á»i sá»­a đổi cuối cùng chỉ bằng má»™t cú nhấp chuá»™t.',
-'tooltip-undo' => '"Lùi lại" sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem thử. Cho phép thêm lý do vào tóm lược.',
-'tooltip-preferences-save' => 'LÆ°u tùy chá»n',
-'tooltip-summary' => 'Hãy nhập câu tóm lược',
+'tooltip-pt-userpage' => 'Trang cá nhân của tôi',
+'tooltip-pt-anonuserpage' => 'Trang của IP bạn đang dùng',
+'tooltip-pt-mytalk' => 'Thảo luận với tôi',
+'tooltip-pt-anontalk' => 'Thảo luận với địa chỉ IP này',
+'tooltip-pt-preferences' => 'Tùy chá»n cá nhân của tôi',
+'tooltip-pt-watchlist' => 'Thay đổi của các trang tôi theo dõi',
+'tooltip-pt-mycontris' => 'Danh sách các đóng góp của tôi',
+'tooltip-pt-login' => 'Äăng nhập sẽ có lợi hÆ¡n, tuy nhiên không bắt buá»™c.',
+'tooltip-pt-anonlogin' => 'Không đăng nhập vẫn tham gia được, tuy nhiên đăng nhập sẽ lợi hơn.',
+'tooltip-pt-logout' => 'Äăng xuất',
+'tooltip-ca-talk' => 'Thảo luận vỠtrang này',
+'tooltip-ca-edit' => 'Bạn có thể sửa được trang này. Xin xem thử trước khi lưu.',
+'tooltip-ca-addsection' => 'Bắt đầu một đỠmục mới',
+'tooltip-ca-viewsource' => 'Trang này được khóa. Bạn có thể xem mã nguồn.',
+'tooltip-ca-history' => 'Những phiên bản cũ của trang này.',
+'tooltip-ca-protect' => 'Khóa trang này lại',
+'tooltip-ca-unprotect' => 'Thay đổi mức khóa của trang này',
+'tooltip-ca-delete' => 'Xóa trang này',
+'tooltip-ca-undelete' => 'Phục hồi những sửa đổi trên trang này như trước khi nó bị xóa',
+'tooltip-ca-move' => 'Di chuyển trang này',
+'tooltip-ca-watch' => 'Thêm trang này vào danh sách theo dõi',
+'tooltip-ca-unwatch' => 'Bá» trang này khá»i danh sách theo dõi',
+'tooltip-search' => 'Tìm kiếm {{SITENAME}}',
+'tooltip-search-go' => 'Xem trang khớp với tên này nếu có',
+'tooltip-search-fulltext' => 'Tìm trang có nội dung này',
+'tooltip-p-logo' => 'Trang Chính',
+'tooltip-n-mainpage' => 'Äi đến Trang Chính',
+'tooltip-n-mainpage-description' => 'Xem trang chính',
+'tooltip-n-portal' => 'Giới thiệu dự án, cách sử dụng và tìm kiếm thông tin ở đây',
+'tooltip-n-currentevents' => 'Các trang có liên quan đến tin tức',
+'tooltip-n-recentchanges' => 'Danh sách các thay đổi gần đây',
+'tooltip-n-randompage' => 'Xem trang ngẫu nhiên',
+'tooltip-n-help' => 'Nơi tìm hiểu thêm cách dùng.',
+'tooltip-t-whatlinkshere' => 'Các trang liên kết đến đây',
+'tooltip-t-recentchangeslinked' => 'Thay đổi gần đây của các trang liên kết đến đây',
+'tooltip-feed-rss' => 'Nguồn tin RSS của trang này',
+'tooltip-feed-atom' => 'Nguồn tin Atom của trang này',
+'tooltip-t-contributions' => 'Xem đóng góp của ngÆ°á»i này',
+'tooltip-t-emailuser' => 'Gá»­i thÆ° cho ngÆ°á»i này',
+'tooltip-t-upload' => 'Tải hình ảnh hoặc tập tin lên',
+'tooltip-t-specialpages' => 'Danh sách các trang đặc biệt',
+'tooltip-t-print' => 'Bản để in ra của trang',
+'tooltip-t-permalink' => 'Liên kết thÆ°á»ng trá»±c đến phiên bản này của trang',
+'tooltip-ca-nstab-main' => 'Xem trang nội dung này',
+'tooltip-ca-nstab-user' => 'Xem trang vá» ngÆ°á»i này',
+'tooltip-ca-nstab-media' => 'Xem trang phương tiện',
+'tooltip-ca-nstab-special' => 'Äây là má»™t trang đặc biệt, bạn không thể sá»­a đổi nó.',
+'tooltip-ca-nstab-project' => 'Xem trang dự án',
+'tooltip-ca-nstab-image' => 'Xem trang miêu tả tập tin',
+'tooltip-ca-nstab-mediawiki' => 'Xem thông báo hệ thống',
+'tooltip-ca-nstab-template' => 'Xem bản mẫu',
+'tooltip-ca-nstab-help' => 'Xem trang trợ giúp',
+'tooltip-ca-nstab-category' => 'Xem trang thể loại',
+'tooltip-minoredit' => 'Äánh dấu đây là sá»­a đổi nhá»',
+'tooltip-save' => 'Lưu lại những thay đổi của bạn',
+'tooltip-preview' => 'Xem thử những thay đổi, hãy dùng nó trước khi lưu!',
+'tooltip-diff' => 'Xem thay đổi bạn đã thực hiện.',
+'tooltip-compareselectedversions' => 'Xem khác biệt giữa hai phiên bản đã chá»n của trang này.',
+'tooltip-watch' => 'Thêm trang này vào danh sách theo dõi',
+'tooltip-watchlistedit-normal-submit' => 'Bá» trang đã chá»n',
+'tooltip-watchlistedit-raw-submit' => 'Cập nhật danh sách theo dõi',
+'tooltip-recreate' => 'Tạo lại trang dù cho nó vừa bị xóa',
+'tooltip-upload' => 'Bắt đầu tải lên',
+'tooltip-rollback' => '"Lùi tất cả" sẽ lùi má»i sá»­a đổi của ngÆ°á»i sá»­a đổi cuối cùng chỉ bằng má»™t cú nhấp chuá»™t.',
+'tooltip-undo' => '"Lùi lại" sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem thử. Cho phép thêm lý do vào tóm lược.',
+'tooltip-preferences-save' => 'LÆ°u tùy chá»n',
+'tooltip-summary' => 'Hãy nhập câu tóm lược',
# Stylesheets
'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho má»i hình dạng */',
@@ -2967,9 +3039,6 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
# Patrol log
'patrol-log-page' => 'Nhật ký tuần tra',
'patrol-log-header' => 'Äây là nhật trình tuần tra phiên bản.',
-'patrol-log-line' => 'đánh dấu tuần tra vào $1 của $2 $3',
-'patrol-log-auto' => '(tá»± Ä‘á»™ng)',
-'patrol-log-diff' => 'bản $1',
'log-show-hide-patrol' => '$1 nhật trình tuần tra',
# Image deletion
@@ -2996,11 +3065,11 @@ Nếu thá»±c thi nó máy tính của bạn có thể bị tiếm quyá»n.",
'file-info' => 'kích thước tập tin: $1, kiểu MIME: $2',
'file-info-size' => '$1 × $2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4',
'file-info-size-pages' => '$1 × $2 điểm ảnh, kích thước tập tin: $3, kiểu MIME: $4, $5 trang',
-'file-nohires' => '<small>Không có độ phân giải cao hơn.</small>',
+'file-nohires' => 'Không có độ phân giải cao hơn.',
'svg-long-desc' => 'tập tin SVG, $1 × $2 điểm ảnh trên danh nghĩa, kích thước: $3',
'show-big-image' => 'Äá»™ phân giải tối Ä‘a',
-'show-big-image-preview' => '<small>Kích thước của ảnh xem thử: $1.</small>',
-'show-big-image-other' => '<small>Äá»™ phân giải khác: $1.</small>',
+'show-big-image-preview' => 'Kích thước của ảnh xem thử: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Äá»™ phân giải|Các Ä‘á»™ phân giải}} khác: $1.',
'show-big-image-size' => '$1 × $2 điểm ảnh',
'file-info-gif-looped' => 'có lặp',
'file-info-gif-frames' => '$1 {{PLURAL:$1|khung ảnh|khung ảnh}}',
@@ -3021,9 +3090,15 @@ Nếu thá»±c thi nó máy tính của bạn có thể bị tiếm quyá»n.",
'sp-newimages-showfrom' => 'Trưng bày những tập tin mới, bắt đầu từ lúc $2, ngày $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds-abbrev' => 's',
-'minutes-abbrev' => 'm',
-'hours-abbrev' => 'h',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
+'days-abbrev' => '$1d',
+'seconds' => '$1 giây',
+'minutes' => '$1 phút',
+'hours' => '$1 giá»',
+'days' => '$1 ngày',
+'ago' => 'cách đây $1',
# Bad image list
'bad_image_list' => 'Äịnh dạng nhÆ° sau:
@@ -3069,6 +3144,10 @@ Variants for Chinese language
'variantname-ike-cans' => 'Âm tiết Thổ dân Canada',
'variantname-ike-latn' => 'Latinh',
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'Tifinagh',
+'variantname-shi-latn' => 'Latinh',
+
# Metadata
'metadata' => 'Äặc tính hình',
'metadata-help' => 'Tập tin này có chứa thông tin vỠnó, do máy ảnh hay máy quét thêm vào. Nếu tập tin bị sửa đổi sau khi được tạo ra lần đầu, có thể thông tin này không được cập nhật.',
@@ -3567,13 +3646,6 @@ Mã xác nhận này sẽ hết hạn vào $4.',
'scarytranscludefailed' => '[Truy xuất bản mẫu cho $1 thất bại]',
'scarytranscludetoolong' => '[Äịa chỉ URL quá dài]',
-# Trackbacks
-'trackbackbox' => 'Các TrackBack vỠtrang này:<br />
-$1',
-'trackbackremove' => '([$1 Xóa])',
-'trackbacklink' => 'TrackBack',
-'trackbackdeleteok' => 'Äã xóa trackback.',
-
# Delete conflict
'deletedwhileediting' => "'''Cảnh báo''': Trang này đã bị xóa sau khi bắt đầu sửa đổi!",
'confirmrecreate' => "Thành viên [[User:$1|$1]] ([[User talk:$1|thảo luận]]) đã xóa trang này sau khi bạn bắt đầu sửa đổi trang với lý do:
@@ -3701,6 +3773,9 @@ Bạn cÅ©ng có thể [[Special:EditWatchlist|dùng trang sá»­a đổi bình thÆ
'hebrew-calendar-m11' => 'Av',
'hebrew-calendar-m12' => 'Elul',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|thảo luận]])',
+
# Core parser functions
'unknown_extension_tag' => 'Không hiểu thẻ mở rá»™ng “$1â€',
'duplicate-defaultsort' => 'Cảnh báo: Từ khóa xếp mặc định “$2†ghi đè từ khóa trÆ°á»›c, “$1â€.',
@@ -3804,13 +3879,16 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'tags-hitcount' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
# Special:ComparePages
-'comparepages' => 'So sánh trang',
-'compare-selector' => 'So sánh phiên bản trang',
-'compare-page1' => 'Trang 1',
-'compare-page2' => 'Trang 2',
-'compare-rev1' => 'Phiên bản 1',
-'compare-rev2' => 'Phiên bản 2',
-'compare-submit' => 'So sánh',
+'comparepages' => 'So sánh trang',
+'compare-selector' => 'So sánh phiên bản trang',
+'compare-page1' => 'Trang 1',
+'compare-page2' => 'Trang 2',
+'compare-rev1' => 'Phiên bản 1',
+'compare-rev2' => 'Phiên bản 2',
+'compare-submit' => 'So sánh',
+'compare-invalid-title' => 'Tựa trang chỉ định không hợp lệ.',
+'compare-title-not-exists' => 'Tựa trang chỉ định không tồn tại.',
+'compare-revision-not-exists' => 'Phiên bản chỉ định không tồn tại.',
# Database error messages
'dberr-header' => 'Wiki này đang gặp trục trặc',
@@ -3837,4 +3915,90 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'sqlite-has-fts' => '$1 với sự hỗ trợ tìm kiếm toàn văn',
'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
+# New logging system
+'logentry-delete-delete' => '$1 đã xóa trang “$3â€',
+'logentry-delete-restore' => '$1 đã phục hồi trang “$3â€',
+'logentry-delete-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} vỠ$3: $4',
+'logentry-delete-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
+'logentry-delete-event-legacy' => '$1 đã thay đổi mức hiển thị của các mục nhật trình vỠ$3',
+'logentry-delete-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3',
+'logentry-suppress-delete' => '$1 đã ẩn trang $3',
+'logentry-suppress-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} vỠ$3 một cách kín đáo: $4',
+'logentry-suppress-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
+'logentry-suppress-event-legacy' => '$1 đã thay đổi mức hiển thị các mục nhật trình vỠ$3 một cách kín đáo',
+'logentry-suppress-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
+'revdelete-content-hid' => 'đã ẩn nội dung',
+'revdelete-summary-hid' => 'đã ẩn tóm lược sửa đổi',
+'revdelete-uname-hid' => 'đã ẩn tên ngÆ°á»i dùng',
+'revdelete-content-unhid' => 'đã hiện nội dung',
+'revdelete-summary-unhid' => 'đã hiện tóm lược sửa đổi',
+'revdelete-uname-unhid' => 'đã hiện tên ngÆ°á»i dùng',
+'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
+'revdelete-unrestricted' => 'đã gỡ bỠhạn chế cho bảo quản viên',
+'logentry-move-move' => '$1 đã đổi trang $3 thành $4',
+'logentry-move-move-noredirect' => '$1 đã đổi trang $3 thành $4 mà không để lại một trang đổi hướng',
+'logentry-move-move_redir' => '$1 đã đổi trang $3 thành $4 qua trang đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 đã đổi trang $3 thành $4 qua trang đổi hướng mà không để lại một trang đổi hướng',
+'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-newusers-newusers' => '$1 đã mở má»™t tài khoản ngÆ°á»i dùng',
+'logentry-newusers-create' => '$1 đã mở má»™t tài khoản ngÆ°á»i dùng',
+'logentry-newusers-create2' => '$1 đã mở tài khoản ngÆ°á»i dùng $3',
+'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
+'newuserlog-byemail' => 'gửi mật khẩu qua thư điện tử',
+
+# Feedback
+'feedback-bugornote' => 'Nếu bạn đã sẵn sàng để miêu tả các chi tiết của một vấn đỠkỹ thuật, xin vui lòng [$1 báo cáo lỗi].
+Nếu không thì bạn có thể Ä‘iá»n biểu mẫu Ä‘Æ¡n giản ở dÆ°á»›i. Lá»i ghi của bạn sẽ được đăng lên trang “[$3 $2]â€, cùng vá»›i tên ngÆ°á»i dùng và trình duyệt của bạn.',
+'feedback-subject' => 'Tiêu Ä‘á»:',
+'feedback-message' => 'Thông điệp:',
+'feedback-cancel' => 'Hủy bá»',
+'feedback-submit' => 'Gửi phản hồi',
+'feedback-adding' => 'Äang thêm thông tin phản hồi vào trang…',
+'feedback-error1' => 'Hủy bá»',
+'feedback-error2' => 'Lỗi: Sửa đổi thất bại',
+'feedback-error3' => 'Lỗi: API không có phản ứng',
+'feedback-thanks' => 'Cám Æ¡n! Phản hồi của bạn đã được đăng lên trang “[$2 $1]â€.',
+'feedback-close' => 'Xong',
+'feedback-bugcheck' => 'Tuyệt! Chỉ cần kiểm tra nó chưa được [$1 báo cáo trước đây].',
+'feedback-bugnew' => 'Tôi đã kiểm tra – báo cáo lỗi mới',
+
+# API errors
+'api-error-badaccess-groups' => 'Bạn không được phép tải tập tin lên wiki này.',
+'api-error-badtoken' => 'Lá»—i ná»™i bá»™: Dấu hiệu bị há»ng.',
+'api-error-copyuploaddisabled' => 'Chức năng tải lên từ URL đã bị tắt trên máy chủ này.',
+'api-error-duplicate' => 'Wiki này đã có [$2 {{PLURAL:$1|tập tin|$1 tập tin}} cùng nội dung] có tên khác',
+'api-error-duplicate-archive' => '{{PLURAL:$1|Một|Các}} [$2 tập tin khác] cùng nội dung đã tồn tại trên website, nhưng {{PLURAL:$1|nó|chúng}} đã bị xóa.',
+'api-error-duplicate-archive-popup-title' => 'Mang lại {{PLURAL:$1|tập tin|các tập tin}} đã bị xóa',
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Tập tin|Các tập tin}} cùng nội dung',
+'api-error-empty-file' => 'Bạn đã gửi tập tin rỗng.',
+'api-error-emptypage' => 'Không cho phép tạo mới các trang rỗng.',
+'api-error-fetchfileerror' => 'Lỗi nội bộ: Việc tải tập tin bị thất bại.',
+'api-error-file-too-large' => 'Bạn đã gửi tập tin lớn quá hạn.',
+'api-error-filename-tooshort' => 'Tên tập tin ngắn quá.',
+'api-error-filetype-banned' => 'Kiểu tập tin này đã bị cấm.',
+'api-error-filetype-missing' => 'Tên tập tin bị thiếu phần mở rộng.',
+'api-error-hookaborted' => 'Sá»­a đổi của bạn bị hook phần mở rá»™ng hủy bá».',
+'api-error-http' => 'Lỗi nội bộ: Không thể kết nối với dịch vụ.',
+'api-error-illegal-filename' => 'Không được đặt tên tập tin này.',
+'api-error-internal-error' => 'Lỗi nội bộ: Việc xử lý tập tin tải lên của bạn trên wiki bị thất bại.',
+'api-error-invalid-file-key' => 'Lỗi nội bộ: Không tìm thấy tập tin trong kho tạm.',
+'api-error-missingparam' => 'Lỗi nội bộ: Yêu cầu thiếu tham số.',
+'api-error-missingresult' => 'Lỗi nội bộ: Không rõ việc sao chép có thành công.',
+'api-error-mustbeloggedin' => 'Bạn phải đăng nhập để tải lên tập tin.',
+'api-error-mustbeposted' => 'Phần má»m này có lá»—i: nó không sá»­ dụng phÆ°Æ¡ng pháp HTTP chính xác.',
+'api-error-noimageinfo' => 'Äã tải lên tập tin thành công, nhÆ°ng máy chủ không cung cấp thông tin vá» tập tin.',
+'api-error-nomodule' => 'Lỗi nội bộ: Mô đun tải lên không được định rõ.',
+'api-error-ok-but-empty' => 'Lỗi nội bộ: Máy chủ không phản hồi.',
+'api-error-overwrite' => 'Không được ghi đè một tập tin đã tồn tại.',
+'api-error-stashfailed' => 'Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.',
+'api-error-timeout' => 'Máy chủ không đáp ứng trong thá»i gian dá»± kiến.',
+'api-error-unclassified' => 'Gặp lá»—i không ngá»',
+'api-error-unknown-code' => 'Lá»—i không rõ: “$1â€',
+'api-error-unknown-error' => 'Lỗi nội bộ: Việc tải lên tập tin của bạn bị thất bại vì lý do không rõ.',
+'api-error-unknown-warning' => 'Cảnh báo không rõ: $1',
+'api-error-unknownerror' => 'Lá»—i không rõ: “$1â€.',
+'api-error-uploaddisabled' => 'Chức năng tải lên đã bị tắt trên wiki này.',
+'api-error-verification-error' => 'Tập tin này có thể bị há»ng hoặc có phần mở rá»™ng sai.',
+
);
diff --git a/languages/messages/MessagesVls.php b/languages/messages/MessagesVls.php
index 3298ca43..f0646c1e 100644
--- a/languages/messages/MessagesVls.php
+++ b/languages/messages/MessagesVls.php
@@ -191,8 +191,7 @@ $messages = array(
'newpages-username' => 'Gebrukersnoame:',
# Special:Log/newusers
-'newuserlogpage' => 'Logboek nieuwe gebrukers',
-'newuserlog-create-entry' => 'Nieuwe gebruker',
+'newuserlogpage' => 'Logboek nieuwe gebrukers',
# Watchlist
'mywatchlist' => 'Myn volglyste',
@@ -207,7 +206,6 @@ $messages = array(
'undeletepage' => 'Weggedoane bloadn erstelln of bekykn',
'undeletehistorynoadmin' => "'t Artikel is weggedoan. De reden davôorn ku je zien in de soamnvattienge ieronder, tôpe me uutleg over wie dat 't blad bewerkt èt vôorn dat weggedoan es gewist. Den tekst van die weggedoane versies kan allêene door sysops gelezen wordn.",
'undeletebtn' => 'Erstelln',
-'undeletedarticle' => '"[[$1]]" ersteld',
'undeletedfiles' => '{{PLURAL:$1|1 bestand|$1 bestandn}} ersteld',
# Contributions
diff --git a/languages/messages/MessagesVmf.php b/languages/messages/MessagesVmf.php
index 325e0556..5b07429d 100644
--- a/languages/messages/MessagesVmf.php
+++ b/languages/messages/MessagesVmf.php
@@ -510,7 +510,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'prefs-rc' => 'Ledschde Ändrungn',
'prefs-watchlist' => 'Beoobachdungs-lischdn',
'prefs-watchlist-days' => 'Wiifiil dääch dsrig in dr beoobachdungs-lischdn:',
-'prefs-watchlist-days-max' => 'Hechschdns 7 dääch',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Wiifiil âjdrääch hechschdens:',
'prefs-watchlist-edits-max' => 'Hegschd-dsôôl: 1000',
'prefs-watchlist-token' => "Token fir d'beoobachdungs-lisdn",
@@ -653,8 +653,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
'linksearch' => 'Linggs nach ausârhalb',
# Special:Log/newusers
-'newuserlogpage' => 'Brodoghol iwâr dii naja bearbajdâr-ôômeldunga',
-'newuserlog-create-entry' => 'Eds hasd a benudsâr-ghondoo',
+'newuserlogpage' => 'Brodoghol iwâr dii naja bearbajdâr-ôômeldunga',
# Special:ListGroupRights
'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
@@ -688,7 +687,6 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'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',
'deletedtext' => '„$1“ is gleschd wôrn. Im $2 findsd â lisdn mid dâ ledsdn leschunga.',
-'deletedarticle' => 'had „[[$1]]“ gleschd',
'dellogpage' => 'Logbuch fo di leschunga',
'deletecomment' => 'Grund:',
'deleteotherreason' => 'Noch a Grund dâfiir:',
@@ -730,8 +728,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'restriction-level' => 'Ausmôôs fom schbärn:',
# Undelete
-'undeletelink' => 'ôôgugn/dsrighooln',
-'undeletedarticle' => 'had „[[$1]]“ widârhäärgschdeld',
+'undeletelink' => 'ôôgugn/dsrighooln',
# Namespace form on various pages
'namespace' => 'Nôômâraum:',
@@ -810,8 +807,6 @@ Schrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un '
'talkexists' => 'Dii sajdn is fârschoom wôrn, awa baj iira disghusjoonssajdn is ned gangâ, wals dii scho mim naja nôôma gibd. Jeds musd des fo hand dsamwôrschdln.',
'movedto' => 'fârschoom nach',
'movetalk' => "Dii disghusjoons-sajdn aa mid fârschiim, wen's gäd",
-'1movedto2' => 'had „[[$1]]“ nach „[[$2]]“ umdaafd',
-'1movedto2_redir' => 'had „[[$1]]“ nach „[[$2]]“ fârschoom un dâbaj â wajdârlajdung ibârschriim',
'movelogpage' => 'Umdaaf-Logbuch',
'movereason' => 'Grund:',
'revertmove' => 'dsrigdaafn af an aldn nôômâ',
@@ -915,7 +910,7 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
# Media information
'file-info-size' => '$1 × $2 pigsl, dadajgrääsn: $3, MIME-tib: $4',
-'file-nohires' => "<small>A he´äre aafleesung gibd's ghaane.</small>",
+'file-nohires' => "A he´äre aafleesung gibd's ghaane.",
'svg-long-desc' => 'SVG-dadaj, ufleesung: $1 × $2 pigsl, dadajgreesn: $3',
'show-big-image' => 'Bild in hegsdâr aufleesung',
diff --git a/languages/messages/MessagesVo.php b/languages/messages/MessagesVo.php
index 36c5f193..0536c71f 100644
--- a/languages/messages/MessagesVo.php
+++ b/languages/messages/MessagesVo.php
@@ -445,14 +445,13 @@ Atos kösömiko jenon sekü difa- u jenotemayüm dädik (o.b. lü pad pemoüköl
Ba ya pemoükon fa geban votik.',
'badtitle' => 'Tiäd badik',
'badtitletext' => 'Padatiäd peflagöl äbinon nelonöfik, vägik, u ba yüm bevüpükik u bevüvükik dädik. Mögos, das ninädon malati(s), kel(s) no dalon(s) pagebön ad jafön tiädis.',
-'perfcached' => 'Nüns sököl ekömons se el caché e ba no binons anuik.',
-'perfcachedts' => 'Nüns sököl kömons se mem nelaidüpik e päbevobons lätiküno ün: $1.',
+'perfcached' => 'Nüns sököl ekömons se el caché e ba no binons anuik. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Nüns sököl kömons se mem nelaidüpik e päbevobons lätiküno ün: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Atimükam pada at penemögükon. Nünods isik no poflifedükons suno.',
'wrong_wfQuery_params' => 'Paramets neverätik lü wfQuery()<br />
Dun: $1<br />
Beg: $2',
'viewsource' => 'Logön fonäti',
-'viewsourcefor' => 'tefü $1',
'actionthrottled' => 'Dun pemiedükon',
'actionthrottledtext' => 'Ad tadunön reklamami itjäfidik (el „spam“), dunot at no padälon tu suvo dü brefüp. Ya erivol miedi gretikün. Steifülolös nogna pos minuts anik.',
'protectedpagetext' => 'Pad at pejelon ad neletön redakami.',
@@ -575,6 +574,10 @@ Ba ya evotükol benosekiko letavödi olik, u ya ebegol benosekiko letavödi nela
'passwordreset-username' => 'Gebananem:',
'passwordreset-email' => 'Ladet leäktronik:',
+# Special:ChangeEmail
+'changeemail-none' => '(nonik)',
+'changeemail-cancel' => 'Stöpädön',
+
# Edit page toolbar
'bold_sample' => 'Vödem bigik',
'bold_tip' => 'Vödem bigik',
@@ -637,9 +640,6 @@ Küpälolös, das no dalol gebön yümi: „penön gebane at“ if no labol lade
Ladet-IP olik binon $3, e nüm blokama at binon #$5. Mäniotolös nünis löpik valik in peneds valik ola.",
'blockednoreason' => 'kod nonik pegivon',
-'blockedoriginalsource' => "Fonät pada: '''$1''' pajonon dono:",
-'blockededitsource' => "Vödem '''redakamas olik''' pada: '''$1''' pajonon dono:",
-'whitelistedittitle' => 'Mutol nunädön oli ad redakön',
'whitelistedittext' => 'Mutol $1 ad redakön padis.',
'confirmedittext' => 'Mutol fümedön ladeti leäktronik ola büä okanol redakön padis. Pladölos e lonöfükölos ladeti olik in [[Special:Preferences|buükams olik]].',
'nosuchsectiontitle' => 'Diläd no petuvöl',
@@ -837,23 +837,12 @@ Ninäd peklänedöl at binon ye nog lügolovik guvanes votik vüka: {{SITENAME}}
'revdelete-unsuppress' => 'Moükön miedükamis fomamas pegegetöl',
'revdelete-log' => 'Kod:',
'revdelete-submit' => 'Gebön me {{PLURAL:$1|fomam pevälöl|fomams pevälöls}}',
-'revdelete-logentry' => 'logov fomamas pada: [[$1]] pevotükon',
-'logdelete-logentry' => 'logov jenota: [[$1]] pevotükon',
'revdelete-success' => "'''Logov padafomama pelonon benosekiko.'''",
'logdelete-success' => 'Logov jenotaliseda pelonon benosekiko.',
'revdel-restore' => 'Votükön logovi',
'revdel-restore-deleted' => 'revids pemoüköl',
'pagehist' => 'Padajenotem',
'deletedhist' => 'Jenotem pemoüköl',
-'revdelete-content' => 'ninäd',
-'revdelete-summary' => 'plän redakama',
-'revdelete-uname' => 'gebananem',
-'revdelete-restricted' => 'miedükams pelonöfükons pro guvans',
-'revdelete-unrestricted' => 'miedükams pro guvans pemoükons',
-'revdelete-hid' => '$1 peklänedon',
-'revdelete-unhid' => '$1 pesäklänedon',
-'revdelete-log-message' => '$1 tefü {{PLURAL:$2|fomam|fomams}} $2',
-'logdelete-log-message' => '$1 tefü {{PLURAL:$2|jenot|jenots}} $2',
'revdelete-otherreason' => 'Kod votik/zuik:',
'revdelete-reasonotherlist' => 'Kod votik',
'revdelete-edit-reasonlist' => 'Redakön kodis moükama',
@@ -989,7 +978,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
'prefs-rc' => 'Votükams nulik',
'prefs-watchlist' => 'Galädalised',
'prefs-watchlist-days' => 'Num delas ad pajonön in galädalised:',
-'prefs-watchlist-days-max' => 'Maxum: dels 7',
+'prefs-watchlist-days-max' => 'Maxum: {{PLURAL:$1|del|dels}} $1',
'prefs-watchlist-edits' => 'Num redakamas ad pajonön in galädalised pestäänüköl:',
'prefs-watchlist-edits-max' => 'Maxumanum: 1000',
'prefs-misc' => 'Votikos',
@@ -1151,7 +1140,6 @@ Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sä
'right-autopatrol' => 'Zepön itjäfidiko redakamis okik',
'right-patrolmarks' => 'Logön zepamals in lised votükamas nulik',
'right-unwatchedpages' => 'Logön lisedi padas nepagalädöl',
-'right-trackback' => 'Sedön gevegi',
'right-mergehistory' => 'Kobükön padajenotemis',
'right-userrights' => 'Redakön gebanagitätis valik',
'right-userrights-interwiki' => 'Redakön gebanagitätis gebanas vükas votik',
@@ -1194,7 +1182,6 @@ Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sä
'action-patrol' => 'Zepön redakami votikanas',
'action-autopatrol' => 'zepön redakami olik',
'action-unwatchedpages' => 'Logön lisedi padas no pagalädölas',
-'action-trackback' => 'sedön gevegi',
'action-mergehistory' => 'balön jenotemi pada at',
'action-userrights' => 'redakön gebanagitätis valik',
'action-userrights-interwiki' => 'redakön gebanagitätis gebanas vükas votik',
@@ -1626,12 +1613,8 @@ Protoks pestütöl: <tt>$1</tt>',
'activeusers-noresult' => 'Geban nonik petuvon.',
# Special:Log/newusers
-'newuserlogpage' => 'Lised gebanijafamas',
-'newuserlogpagetext' => 'Is palisedons jafams gebanas nulik.',
-'newuserlog-byemail' => 'letavöd pesedon me pot leäktronik',
-'newuserlog-create-entry' => 'Geban nulik',
-'newuserlog-create2-entry' => 'ejafon kali nulik: $1',
-'newuserlog-autocreate-entry' => 'Kal itjäfidiko pejaföl',
+'newuserlogpage' => 'Lised gebanijafamas',
+'newuserlogpagetext' => 'Is palisedons jafams gebanas nulik.',
# Special:ListGroupRights
'listgrouprights' => 'Gitäts gebanagrupa',
@@ -1653,7 +1636,7 @@ Ba dabinons [[{{MediaWiki:Listgrouprights-helppage}}|nüns pluik]] tefü gebanag
'emailpage' => 'Penön gebane',
'emailpagetext' => 'Kanol gebön fometi dono ad sedön penedi leäktronik gebane at. Ladet leäktronik in [[Special:Preferences|gebanabüukams olik]] opubon as fonät (el "De:") peneda, dat getan okanon gepenön ole.',
'usermailererror' => 'Potayeg egesedon pöli:',
-'defemailsubject' => 'Ladet leäktronik ela {{SITENAME}}',
+'defemailsubject' => 'Ladet leäktronik ela {{SITENAME}} de geban: "$1"',
'noemailtitle' => 'Ladet no dabinon',
'noemailtext' => 'Geban at no egivon ladeti leäktronik lonöföl.',
'nowikiemailtitle' => 'Pot leäktronik no pedälon.',
@@ -1758,8 +1741,6 @@ Küpets e yuf pluik:
'actioncomplete' => 'Peledunon',
'deletedtext' => 'Pad: "$1" pemoükon;
$2 jonon moükamis nulik.',
-'deletedarticle' => 'Pad: "[[$1]]" pemoükon',
-'suppressedarticle' => 'logov pada: „[[$1]]“ pevotükon',
'dellogpage' => 'Jenotalised moükamas',
'dellogpagetext' => 'Dono binon lised moükamas nulikün.',
'deletionlog' => 'jenotalised moükamas',
@@ -1880,7 +1861,6 @@ Ba labol yümi dädik, u ba fomam pegepübon u pemoükon se registar.',
'undeletereset' => 'Vagükolöd vali',
'undeleteinvert' => 'Väli güükön',
'undeletecomment' => 'Kod:',
-'undeletedarticle' => 'Moükam pada: "[[$1]]" pesädunon',
'undeletedrevisions' => 'Moükam {{PLURAL:$1|revida 1 pesädunon|revidas $1 pesädunons}}',
'undeletedrevisions-files' => 'Moükam {{PLURAL:$1|revida 1|revidas $1}} e {{PLURAL:$2|ragiva 1|ragivas $2}} pesädunons',
'undeletedfiles' => 'Moükam {{PLURAL:$1|ragiva 1|ragivas $1}} pesädunon',
@@ -2109,9 +2089,6 @@ Välolös nemi votik.',
'movepage-page-moved' => 'Pad: $1 petopätükon lü $2.',
'movepage-page-unmoved' => 'No eplöpos ad topätükön padi: $1 ad pad: $2.',
'movepage-max-pages' => 'Maxumanüm {{PLURAL:$1|pada bal|pads $1}} petopätükon; pads pluik nonik potopätükons itjäfidiko.',
-'1movedto2' => '[[$1]] petopätükon lü [[$2]]',
-'1movedto2_redir' => '[[$1]] petopätükon lü [[$2]] vegü lüodüköm',
-'move-redirect-suppressed' => 'lüodüköm no pejafon',
'movelogpage' => 'Jenotalised topätükamas',
'movelogpagetext' => 'Is palisedons pads petopätüköl.',
'movesubpage' => '{{PLURAL:$1|Donapad|Donapads}}',
@@ -2340,9 +2317,6 @@ Pad luveratiko ninädon yümi lü bevüresodatopäd plödik in blägalised.',
# Patrol log
'patrol-log-page' => 'Jenotalised zepamas',
'patrol-log-header' => 'Is lisedons revids pezepöl.',
-'patrol-log-line' => 'Fomam: $1 pada: $2 pezepon $3',
-'patrol-log-auto' => '(itjäfidik)',
-'patrol-log-diff' => 'fomami: $1',
'log-show-hide-patrol' => 'Jenotalised Zepamas: $1',
# Image deletion
@@ -2368,7 +2342,7 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
'widthheightpage' => '$1 × $2, {{PLURAL:$3|pad|pads}} $3',
'file-info' => 'ragivagretot: $1, MIME-pated: $2',
'file-info-size' => '$1 × $2 pixel, ragivagret: $3, pated MIME: $4',
-'file-nohires' => '<small>Gretot gudikum no pagebidon.</small>',
+'file-nohires' => 'Gretot gudikum no pagebidon.',
'svg-long-desc' => 'ragiv in fomät: SVG, magodaziöbs $1 × $2, gretot: $3',
'show-big-image' => 'Gretot gudikün',
@@ -2384,6 +2358,12 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
'bydate' => 'ma dät',
'sp-newimages-showfrom' => 'Jonolöd ragivis nulik, primölo tü düp $2, $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|sekun 1|sekuns $1}}',
+'minutes' => '{{PLURAL:$1|minut 1|minuts $1}}',
+'hours' => '{{PLURAL:$1|düp 1|düps $1}}',
+'days' => '{{PLURAL:$1|del 1|dels $1}}',
+
# Bad image list
'bad_image_list' => 'Fomät pabevobon ön mod soik:
@@ -2688,13 +2668,6 @@ Fümedakot at operon lonöfi okik ün $4.',
'scarytranscludefailed' => '[Tuv samafomota no eplopön kodü $1]',
'scarytranscludetoolong' => '[el URL binon tu lunik]',
-# Trackbacks
-'trackbackbox' => 'Gevegs padi at teföls:<br />
-$1',
-'trackbackremove' => '([$1 Moükön])',
-'trackbacklink' => 'Geveg',
-'trackbackdeleteok' => 'Geveg pemoükon benosekiko.',
-
# Delete conflict
'deletedwhileediting' => "'''Nuned''': Pad at pemoükon posä äprimol ad redakön oni!",
'confirmrecreate' => "Geban: [[User:$1|$1]] ([[User talk:$1|talk]]) ämoükon padi at posä äprimol ad redakön oni sekü kod sököl:
@@ -2803,7 +2776,7 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
'specialpages' => 'Pads patik',
'specialpages-note' => '----
* Pads patik nomik.
-* <strong class="mw-specialpagerestricted">Pads patik pemiedüköl.</strong>',
+* <span class="mw-specialpagerestricted">Pads patik pemiedüköl.</span>',
'specialpages-group-maintenance' => 'Nunods tefü kiped',
'specialpages-group-other' => 'Pads patik votik',
'specialpages-group-login' => 'Nunädön oki / jafön kali',
@@ -2847,4 +2820,9 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
'htmlform-reset' => 'Sädunön votükamis',
'htmlform-selectorother-other' => 'Votik',
+# New logging system
+'revdelete-restricted' => 'miedükams pelonöfükons pro guvans',
+'revdelete-unrestricted' => 'miedükams pro guvans pemoükons',
+'newuserlog-byemail' => 'letavöd pesedon me pot leäktronik',
+
);
diff --git a/languages/messages/MessagesVot.php b/languages/messages/MessagesVot.php
index d209c0f0..176c3f1d 100644
--- a/languages/messages/MessagesVot.php
+++ b/languages/messages/MessagesVot.php
@@ -376,8 +376,7 @@ Tšüľľed, kummad õmad teÄÄellä [[Special:Watchlist|kattsõspiizgalla]] on
'linksearch' => 'Ulkopoolizõd linkid',
# Special:Log/newusers
-'newuserlogpage' => 'Uuvvõd tšäüttijäd',
-'newuserlog-create-entry' => 'Uusi tšäüttijä',
+'newuserlogpage' => 'Uuvvõd tšäüttijäd',
# Special:ListGroupRights
'listgrouprights-members' => '(selttsilainspiiska)',
@@ -409,7 +408,6 @@ Tšültši leeb tširjutõttu '''pimmiässi''' [[Special:RecentChanges|spiizgall
'actioncomplete' => 'Töö tehtü lõppuu',
'deletedtext' => '"$1" on pühittü.
Tšüľľellä $2 on spiiska viimeiziss pühtšimühsiiss.',
-'deletedarticle' => 'roottšiz tšüľľee [[$1]]',
'dellogpage' => 'Pühitüd tšüľľed',
'deletecomment' => 'Süü',
'deleteotherreason' => 'Muu vai lisä süü',
@@ -441,8 +439,7 @@ Tšüľľellä $2 on spiiska viimeiziss pühtšimühsiiss.',
'restriction-level' => 'Varjauz',
# Undelete
-'undeletelink' => 'näüt/vääntee',
-'undeletedarticle' => '"[[$1]]" vääneltü',
+'undeletelink' => 'näüt/vääntee',
# Namespace form on various pages
'namespace' => 'Nimiruumi:',
@@ -519,8 +516,6 @@ Neill kõhtoill piättä liikuttaa vai ühissää tšüľľee tšäzi.",
'talkexists' => "'''Tšüľľee liikka tuli valmessi, a juttitšültšiä eb õli liikutõttu, ku uuvvõ zagolofkaa all on jo juttutšültši. Juttutšültšije sisälto piättä ühinessä tšäzi.'''",
'movedto' => 'liikutõttu',
'movetalk' => 'Liikut toož juttutšültši',
-'1movedto2' => 'Tšültši [[$1]] on liikutõttu uuvvõllõ nimõllõ [[$2]]',
-'1movedto2_redir' => 'liikuti tšüľľee [[$1]] mešaituhsõõ [[$2]] päälle',
'movelogpage' => 'Liikkalogi',
'movereason' => 'Süü',
'revertmove' => 'kummut',
@@ -594,7 +589,7 @@ Toož, võittõ tširjutta väänteüssee süü.',
# Media information
'file-info-size' => '$1 × $2 px, $3, MIME-sortta: $4',
-'file-nohires' => '<small>Suurõpaa kuva ebõõ.</small>',
+'file-nohires' => 'Suurõpaa kuva ebõõ.',
'svg-long-desc' => 'SVG-faili $1 × $2 px, failii suuruz: $3',
'show-big-image' => 'Kõrka-rezoľuuttsiin verzija',
diff --git a/languages/messages/MessagesVro.php b/languages/messages/MessagesVro.php
index bd9c38af..d5e12d5d 100644
--- a/languages/messages/MessagesVro.php
+++ b/languages/messages/MessagesVro.php
@@ -37,7 +37,7 @@ $namespaceNames = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#saadaq', '#suuna', '#REDIRECT' ),
+ 'redirect' => array( '0', '#saadaq', '#suuna', '#REDIRECT' ),
);
$messages = array(
@@ -396,14 +396,13 @@ Või-ollaq kiäki tõõnõ jo kistut\' taa ärq.',
'badtitle' => 'Viganõ päälkiri',
'badtitletext' => "Küsüt artiklipäälkiri oll' kas viganõ, tühi vai sis
võlssi näüdät kiili- vai wikidevaihõlinõ päälkiri.",
-'perfcached' => 'Järgmäne teedüs om puhvõrdõt ja pruugi ei ollaq kõgõ värskimb:',
-'perfcachedts' => 'Järgmäne teedüs om puhvõrdõt ja om viimäte muudõt $1.',
+'perfcached' => 'Järgmäne teedüs om puhvõrdõt ja pruugi ei ollaq kõgõ värskimb. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Järgmäne teedüs om puhvõrdõt ja om viimäte muudõt $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Taad lehe teedüst parhilla värskis ei tetäq.',
'wrong_wfQuery_params' => 'Võlss suurusõq tallitusõlõ wfQuery()<br />
Tallitus: $1<br />
Perräküsümine: $2',
'viewsource' => 'Kaeq lätteteksti',
-'viewsourcefor' => 'lehele $1',
'actionthrottled' => 'Tallitusõ kibõhus piirõt',
'actionthrottledtext' => "Taa tallitusõ mitmit kõrdo tegemine om prahipandjidõ peräst ärq keelet. Olõt taad lühkü ao seen pall'o hulga tennüq. Prooviq veidükese ao peräst vahtsõst.",
'protectedpagetext' => 'Taa lehekülg om kirotuskaidsõt.',
@@ -584,9 +583,6 @@ Rehkendäq tuud, et sa saa-i tõisilõ pruukjilõ e-kirjo saataq, ku sa olõ-i u
Suq puutri võrgoaadrõs om parhilla $3 ja kinniqpidämise tunnusnummõr om #$5. Olõq hää, kirodaq taa nummõr egä perräküsümise mano, miä sa tiit.",
'blockednoreason' => 'põhjust olõ-i näüdät',
-'blockedoriginalsource' => "Lehe '''$1''' lättekuud:",
-'blockededitsource' => "Su tett toimõndus lehe '''$1''' pääl:",
-'whitelistedittitle' => 'Toimõndamisõs piät nimega sisse minemä',
'whitelistedittext' => 'Lehekülgi toimõndamisõs $1.',
'confirmedittext' => 'Sa saa-i inne lehekülgi toimõndaq, ku olõt kinnütänüq ärq uma e-postiaadrõsi. Tuud saat tetäq uma [[Special:Preferences|säädmislehe]] pääl.',
'nosuchsectiontitle' => 'Olõ-i säänest lõiku',
@@ -736,16 +732,12 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
'revdelete-unsuppress' => 'Võtaq tagasitettüisi kujjõ päält piirdmisõq maaha',
'revdelete-log' => 'Põhjus:',
'revdelete-submit' => 'Võtaq käüki valitulõ kujolõ',
-'revdelete-logentry' => 'muudõt lehe [[$1]] kujo nättävüst',
-'logdelete-logentry' => 'muudõt lehe [[$1]] muutmiisi nättävüst',
'revdelete-success' => "'''Kujo nättävüs paika säet.'''",
'logdelete-success' => "'''Muutmiisi nättävüs paika säet.'''",
'revdel-restore' => 'Muudaq nägemist',
'revdel-restore-deleted' => 'ärqkistutõduq muutusõq',
'revdel-restore-visible' => 'nätäq muutusõq',
'pagehist' => 'Leheküle aolugu',
-'revdelete-content' => 'sisu',
-'revdelete-uname' => 'pruukjanimi',
# History merging
'mergehistory' => 'Panõq lehti aoluuq kokko',
@@ -1291,8 +1283,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-noresult' => 'Olõ-s pruukjit.',
# Special:Log/newusers
-'newuserlogpage' => 'Vahtsõq pruukjaq',
-'newuserlog-create-entry' => 'Vahtsõnõ pruukja',
+'newuserlogpage' => 'Vahtsõq pruukjaq',
# Special:ListGroupRights
'listgrouprights' => 'Pruukjarühmi õigusõq',
@@ -1392,7 +1383,6 @@ Kinnüdäq, et sa tahat tuud tõtõstõ tetäq, et sa saat arvo, miä tuust tull
'actioncomplete' => 'Tallitus valmis',
'deletedtext' => '"$1" om ärq kistutõt.
Perämäidsi kistutuisi nimekirjä näet siist: $2.',
-'deletedarticle' => '"[[$1]]" kistutõt',
'dellogpage' => 'Kistutõduq leheküleq',
'dellogpagetext' => 'Naaq ommaq perämädseq kistutamisõq.
Kelläaoq ummaq serveriao perrä.',
@@ -1479,7 +1469,6 @@ viil olõman, naid saa tagasi tetäq niikavva ku naid olõ-i viil arhiivist ärq
'undeleteviewlink' => 'näütäq',
'undeletereset' => 'Tiiq tühäs',
'undeletecomment' => 'Kommõntaar:',
-'undeletedarticle' => '"$1" tagasi tett',
'undeletedrevisions' => '$1 {{PLURAL:$1|kujo|kujjo}} tagasi tett',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|kujo|kujjo}} ja $2 {{PLURAL:$2|teedüstü|teedüstüt}} tagasi tett',
'undeletedfiles' => '$1 {{PLURAL:$1|teedüstü|teedüstüt}} tagasi tett',
@@ -1659,8 +1648,6 @@ Kui om nii, sis panõq vana arotuskülg eräle vai panõq taa kokko vahtsõ arot
'talkexists' => 'Artikli om tõistõ paika pant, a arotuslehekülge saa-s pandaq, selle et vahtsõ nime all om jo arotuskülg. Panõq arotusküleq esiq kokko.',
'movedto' => 'Pant päälkirä ala:',
'movetalk' => 'Panõq ka "arotus", ku saa.',
-'1movedto2' => "pand' lehe [[$1]] vahtsõ nime [[$2]] ala",
-'1movedto2_redir' => "pand' lehe [[$1]] ümbresaatmislehe [[$2]] pääle",
'movelogpage' => 'Tõistõ paika pandmiisi nimekiri',
'movelogpagetext' => 'Taa om lehti tõistõ paika pandmiisi nimekiri.',
'movereason' => 'Põhjus:',
@@ -1851,8 +1838,6 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
# Patrol log
'patrol-log-page' => 'Muutmiisi ülekaemiisi nimekiri',
-'patrol-log-line' => 'märke lehe $2 muutmisõ $1 ülekaetus $3',
-'patrol-log-auto' => '(automaatnõ)',
# Image deletion
'deletedrevision' => 'Kistutõdi ärq vana kujo $1.',
@@ -1868,7 +1853,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
'thumbsize' => 'Väikupildi suurus:',
'file-info' => '$1, MIME-tüüp: $2',
'file-info-size' => '$1 × $2 pikslit, $3, MIME-tüüp: $4',
-'file-nohires' => '<small>Taast terävämpä pilti olõ-i saiaq.</small>',
+'file-nohires' => 'Taast terävämpä pilti olõ-i saiaq.',
'svg-long-desc' => 'SVG-teedüstü, põhisuurus $1 × $2 pikslit, teedüstü suurus $3',
'show-big-image' => 'Täüsterräv kujo',
@@ -2182,13 +2167,6 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
'scarytranscludefailed' => '[Saa-s näüdüst kätte: $1]',
'scarytranscludetoolong' => "[Võrgoaadrõs om pall'o pikk]",
-# Trackbacks
-'trackbackbox' => "Artikli pääle pantuisi linke näütämine (''trackbackiq''):<br />
-$1",
-'trackbackremove' => '([$1 kistutus])',
-'trackbacklink' => "Artikli pääle pantuisi linke näütämine (''trackback'')",
-'trackbackdeleteok' => "Artikli pääle pantuisi linke näütämine (''trackback'') kistutõdi ärq.",
-
# Delete conflict
'deletedwhileediting' => "<center>'''Hoiatus''': taa leht om ärq kistutõt päält tuud, ku sa taad toimõndama naksit!</center>",
'confirmrecreate' => "Pruukja '''[[User:$1|$1]]''' ([[User talk:$1|arotus]]) kistut' taa lehe ärq päält tuud, ku sa naksit taad toimõndama. Põhjus oll':
diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php
index 73c85a82..c91dacb8 100644
--- a/languages/messages/MessagesWa.php
+++ b/languages/messages/MessagesWa.php
@@ -339,13 +339,12 @@ MySQL a rtourné l' aroke «$3: $4».",
'cannotdelete' => "Dji n' sai disfacer l' pådje ou l' imådje dimandêye (ça s' pôreut k' ene ôte sakî l' a ddja disfacé).",
'badtitle' => 'MÃ¥va tite',
'badtitletext' => "Li tite del pådje dimandêye n' esteut nén valide, il estet vude, oudonbén c' esteut on cron loyén eterlingaedje ou eterwiki. Ça s' pout k' il åye onk ou sacwants caracteres ki n' polèt nén esse eployîs dins les tites.",
-'perfcached' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, et ça s' pout ki ça n' soeye nén ttafwaitmint a djoû.",
-'perfcachedts' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, ey elle ont stî metowes a djoû pol dierin côp li $1.",
+'perfcached' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, et ça s' pout ki ça n' soeye nén ttafwaitmint a djoû. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, ey elle ont stî metowes a djoû pol dierin côp li $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'wrong_wfQuery_params' => 'Parametes incoreks po wfQuery()<br />
Fonccion: $1<br />
Cweraedje: $2',
'viewsource' => 'Vey côde sourdant',
-'viewsourcefor' => 'po $1',
'viewsourcetext' => 'Loukîz li contnou di l’ årtike, et s’ li rcopyî si vos vloz, por vos bouter dsu foû des fyis :',
'protectedinterface' => "Cisse pådje ci dene on tecse d' eterface pol programe, eyet elle a stî protedjeye po s' waeranti siconte des abus.",
'editinginterface' => "'''Asteme:''' Vos candjîz ene pådje k' est eployeye po dner on tecse d' eterface pol programe. Les candjmints a cisse pådje ci vont-st aveur èn efet so l' eterface d' uzeu des ôtes uzeus.",
@@ -464,9 +463,6 @@ Li råjhon dnêye est:<br />''$2''<p>Vos ploz contacter $1 oudonbén onk des
Notez ki vos n' poloz nén eployî l' fonccion «emiler a l' uzeu» a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]].
Voste adresse IP est $3. S' i vs plait racsegnoz ciste adresse IP la dins les dmandes ki vos frîz.",
-'blockedoriginalsource' => "Li sourdant di '''$1''' est håyné chal pa dzo:",
-'blockededitsource' => "Li tecse des '''candjmints da vosse''' di '''$1''' est håyné chal pa dzo:",
-'whitelistedittitle' => "S' elodjî po candjî",
'whitelistedittext' => 'I vs fåt $1 po pleur candjî les årtikes.',
'confirmedittext' => "I vs fåt acertiner vost emile po pleur candjî les årtikes. Dinez èn emile eyet l' acertiner dins vos [[Special:Preferences|preferinces d' uzeu]].",
'loginreqtitle' => 'I vs fåt esse elodjî',
@@ -591,8 +587,6 @@ Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l'
'revdelete-hide-restricted' => 'Apliker ces restrictions ossu åzès manaedjeus',
'revdelete-log' => 'RÃ¥jhon:',
'revdelete-submit' => 'Apliker al modêye tchoezeye',
-'revdelete-logentry' => 'li veyåvisté des modêyes a stî candjeye po [[$1]]',
-'revdelete-hid' => 'muchyî $1',
# History merging
'mergehistory-reason' => 'RÃ¥jhon:',
@@ -694,7 +688,7 @@ Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l'
'userrights-lookup-user' => "Manaedjî les groupes d' èn uzeu",
'userrights-user-editname' => "Tapez on no d' uzeu:",
'editusergroup' => "Candjî les groupes di l' uzeu",
-'editinguser' => "Candjant '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Candjant '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => "Candjî groupes d' uzeus",
'saveusergroups' => "Schaper des groupes d' uzeus",
'userrights-groupsmember' => 'Mimbes di:',
@@ -962,10 +956,8 @@ Vos ploz limiter l' håynaedje tot tchoezixhant ene sôre di djournå, on no d'
Also see [[Special:WantedCategories|wanted categories]].',
# Special:Log/newusers
-'newuserlogpage' => 'Djournå des noveas uzeus',
-'newuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.",
-'newuserlog-create-entry' => 'Novea uzeu',
-'newuserlog-create2-entry' => 'conte ahivé po $1',
+'newuserlogpage' => 'Djournå des noveas uzeus',
+'newuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.",
# E-mail user
'mailnologin' => "Nole adresse d' evoyeu",
@@ -1068,7 +1060,6 @@ tot [[{{MediaWiki:Policy-url}}|shuvant les rîles]].",
'actioncomplete' => 'Fwait',
'deletedtext' => 'Li pådje «$1» a stî disfacêye. Loukîz li $2 po ene
djivêye des dierins disfaçaedjes.',
-'deletedarticle' => 'pådje «[[$1]]» disfacêye',
'dellogpage' => 'Djournå des disfaçaedjes',
'dellogpagetext' => "Chal pa dzo c' est l' djivêye des dierins disfaçaedjes.",
'deletionlog' => 'djournå des disfaçaedjes',
@@ -1124,7 +1115,6 @@ ni pout esse veyou ki des manaedjeus.",
'undeletebtn' => 'Rapexhî!',
'undeletereset' => 'Netyî',
'undeletecomment' => 'RÃ¥jhon:',
-'undeletedarticle' => "a rapexhî l' pådje «[[$1]]»",
'undeletedrevisions' => '{{PLURAL:$1|1 modêye|$1 modêyes}} di rapexheyes',
'undeletedrevisions-files' => '{{PLURAL:$1|1 modêye|$1 modêyes}} et {{PLURAL:$2|1 fitchî|$2 fitchîs}} di rapexhîs',
'undeletedfiles' => '{{PLURAL:$1|1 fitchî|$1 fitchîs}} di rapexhîs',
@@ -1246,8 +1236,6 @@ Tchoezixhoz è èn ôte s' i vs plait.",
'talkexists' => "'''Li pådje leye minme a stî displaeceye comifåt, mins nén li pådje di copene, ca i gn aveut ddja ene pådje di copene k' egzistéve al novele plaece. I vs fårè copyî l' tecse del pådje di copene al mwin.'''",
'movedto' => 'displaecî viè',
'movetalk' => 'Displaecî li pådje di copene avou, si ça astchait.',
-'1movedto2' => '[[$1]] displaecî viè [[$2]]',
-'1movedto2_redir' => '[[$1]] displaecî viè [[$2]] pa dsu on redjiblaedje',
'movelogpage' => 'Djournå des displaçaedjes',
'movelogpagetext' => "Chal pa dzo c' est ene djivêye des pådjes k' on stî displaceyes.",
'movereason' => 'RÃ¥jhon:',
@@ -1621,4 +1609,45 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
'specialpages-group-highuse' => 'Eployaedje timpesse des pådjes',
'specialpages-group-redirects' => 'Ridjiblaedjes di pådjes sipeciåles',
+# Feedback
+'feedback-subject' => 'Sudjet',
+'feedback-message' => 'Messaedje',
+'feedback-cancel' => 'Rinoncî',
+'feedback-submit' => "Evoyî l' vosse",
+'feedback-adding' => 'Vosse messaedje a stî håyné sol pådje...',
+'feedback-error2' => "Aroke : Li candjaedje n' a nén stî",
+
+# API errors
+'api-error-badaccess-groups' => "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
+'api-error-copyuploaddisabled' => "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
+'api-error-duplicate' => "N a ddja {{PLURAL:$1|[$2 èn ôte fitchî]|[$2 des ôtes fitchîs]}} avou l' minme contnou so nosse waibe",
+'api-error-duplicate-archive' => "N aveut ddja {{PLURAL:$1|[$2 èn ôte fitchî]|[$2 des ôtes fitchîs]}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
+'api-error-duplicate-archive-popup-title' => "Ricopyî {{PLURAL:$1|l' fitchî|les fitchîs}} k' {{PLURAL:$1|a stî rsaetchî|k' ont stî rsaetchîs}}",
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|fitchî|fitchîs}} a dobe',
+'api-error-empty-file' => 'Vosse fitchî est vude.',
+'api-error-fetchfileerror' => 'Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî',
+'api-error-file-too-large' => 'Vosse fitchî est trop pezant',
+'api-error-filename-tooshort' => 'Li no do fitchî est trop court',
+'api-error-filetype-banned' => "On n' pout nén eberweter des sfwaits fitchîs",
+'api-error-filetype-missing' => 'I manke li cawete do fitchî',
+'api-error-http' => 'Aroke divintrinne : nou raloyaedje å sierveu',
+'api-error-illegal-filename' => "On n' pout nén prinde ci no la pol fitchî",
+'api-error-internal-error' => "Aroke divintrinne : gn a ene sacwè k' a må stî tins d' l' eredjistrumint d' vost eberwetêye",
+'api-error-invalid-file-key' => "Aroke divintrinne : Li fitchî n' a nén stî rtrové dins l' eredjistrumint provizwere",
+'api-error-missingparam' => 'Aroke divintrinne : i manke des dnêyes dins vosse dimande',
+'api-error-missingresult' => "Aroke divintrinne : on n' såreut dire si l' fitchî a bén passé",
+'api-error-mustbeloggedin' => 'Vos dvoz esse elodjî (eye) po-z aberweter des fitchîs',
+'api-error-mustbeposted' => "Aroke divintrinne : li programe n' eploye nén li boune hårdêye HTTP",
+'api-error-noimageinfo' => "L' eberwetaedje a bén stî, mins l' sierveu n' a pont dné d' racsegnes sol fitchî",
+'api-error-nomodule' => "Aroke divintrinne : pont d' voye d' eberwetaedje tchoezeye",
+'api-error-ok-but-empty' => "Aroke divintrinne : li sierveu n' respond nén",
+'api-error-overwrite' => "Vos n' ploz nén spotchî on fitchî k' egzistêye dedja",
+'api-error-stashfailed' => 'Aroke divintrinne : li sierveu a pierdou les dnêyes provizweres',
+'api-error-timeout' => "Li sierveu n' a nén respondou dins les tins",
+'api-error-unclassified' => 'Aroke nén cnoxhowe',
+'api-error-unknown-code' => 'Aroke nén cnoxhowe : « $1 »',
+'api-error-unknown-error' => "Aroke divintrinne : gn a ene sacwè ki n' a nén stî tins d' l' eberwetaedje",
+'api-error-uploaddisabled' => "L' eberwetaedje ni va nén so ç' wiki cial",
+'api-error-verification-error' => "Ci fitchî la est cron, oudon-bén si cawete n' est nén boune",
+
);
diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php
index 1f7c2d79..e788d907 100644
--- a/languages/messages/MessagesWar.php
+++ b/languages/messages/MessagesWar.php
@@ -14,24 +14,46 @@
* @author לערי ריינה×רט
*/
+$namespaceNames = array(
+ NS_MEDIA => 'Medya',
+ NS_SPECIAL => 'Pinaurog',
+ NS_TALK => 'Hiruhimangraw',
+ NS_USER => 'Gumaramit',
+ NS_USER_TALK => 'Hiruhimangaw_hiton_gumaramit',
+ NS_PROJECT_TALK => 'Hiruhimangraw_hiton_$1',
+ NS_FILE => 'Fayl',
+ NS_FILE_TALK => 'Hiruhimangraw_hiton_fayl',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Hiruhimangraw_hiton_MediaWiki',
+ NS_TEMPLATE => 'Batakan',
+ NS_TEMPLATE_TALK => 'Hiruhimangraw_hiton_batakan',
+ NS_HELP => 'Bulig',
+ NS_HELP_TALK => 'Hiruhimangaw_hiton_bulig',
+ NS_CATEGORY => 'Kaarangay',
+ NS_CATEGORY_TALK => 'Hiruhimangraw_hiton_kaarangay',
+);
+
$specialPageAliases = array(
'Allpages' => array( 'NgatananngaPakli' ),
- 'Categories' => array( 'Mga Kategorya' ),
- 'Contributions' => array( 'Mga Ãmot' ),
+ 'Categories' => array( 'Mga_kaarangay' ),
+ 'Contributions' => array( 'Mga_ámot' ),
+ 'Disambiguations' => array( 'Mga_pansayod' ),
'Longpages' => array( 'HaglabangamgaPakli' ),
'Mostlinked' => array( 'Gidamo-iHinSumpay' ),
'Movepage' => array( 'BalhinaAnPakli' ),
'Mypage' => array( 'AkonPakli' ),
'Mytalk' => array( 'AkonHiruhimangraw' ),
'Newpages' => array( 'Bag-ongamgaPakli' ),
- 'Randompage' => array( 'Bisan Ano', 'BisanAnongaPakli' ),
+ 'Randompage' => array( 'Bisan_Ano', 'BisanAnongaPakli' ),
'Search' => array( 'Bilnga' ),
'Shortpages' => array( 'HaglipotngamgaPakli' ),
'Specialpages' => array( 'MgaIspisyalngaPakli' ),
- 'Statistics' => array( 'Mga Estadistika' ),
+ 'Statistics' => array( 'Mga_Estadistika' ),
'Upload' => array( 'Pagkarga' ),
'Version' => array( 'Bersyon' ),
- 'Watchlist' => array( 'Angay Timan-an' ),
+ 'Watchlist' => array( 'Angay_Timan-an' ),
+ 'Whatlinkshere' => array( 'AnoAnNasumpayDinhi' ),
+ 'Withoutinterwiki' => array( 'Warayinterwiki' ),
);
$messages = array(
@@ -380,12 +402,11 @@ Bangin na ini ginpara hin iba.',
'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.',
-'perfcached' => 'An nasunod nga data gin-cache ngan bangin diri amo an yana.',
-'perfcachedts' => 'An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1.',
+'perfcached' => 'An nasunod nga data gin-cache ngan bangin diri amo an yana. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'An mga kabag-ohan para hini nga pakli ha yana diri mahihimo.
An data dini diri mahihimo nga bag-o.',
'viewsource' => 'Kitaa an ginkuhaan',
-'viewsourcefor' => 'para han $1',
'viewsourcetext' => 'Puydi ka kinmita ngan kinmopya han gintikangan han pakli:',
'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
'ns-specialprotected' => 'Diri maliliwat an mga ispisyal nga pakli.',
@@ -468,6 +489,9 @@ Alayon pagutro pagbutang.',
Temporaryo nga tigaman han pagsakob: $2',
'passwordreset-emailsent' => 'Ginpadara hin usa ka pahinumdom nga e-mail.',
+# Special:ChangeEmail
+'changeemail-cancel' => 'Pasagdi',
+
# Edit page toolbar
'bold_sample' => 'dakmola an agi',
'bold_tip' => 'Dakmola an agi',
@@ -505,9 +529,6 @@ Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bi
'subject-preview' => 'Pahiuna nga pagawas hit himangrawon:',
'blockedtitle' => 'Ginpugngan ini nga gumaramit',
'blockednoreason' => 'waray katadungan nga ginhatag',
-'blockedoriginalsource' => "An tinikangan han '''$1''' amo in ginpapakita ha ubos:",
-'blockededitsource' => "An mga sinurat han imo '''mga pagliwat''' ha '''$1''' in ginpapakita ha ubos:",
-'whitelistedittitle' => 'Kinahanglan mag-log-in para makaliwat',
'whitelistedittext' => 'Kinahanglan mo mag-$1 para makaliwat han mga pakli.',
'nosuchsectiontitle' => 'Waray kaagi-i an bahin',
'loginreqtitle' => 'Nagkikinahanglan hin pan-sakob',
@@ -605,12 +626,6 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
'revdel-restore' => 'igliwat an nakikit-an',
'revdel-restore-deleted' => 'napara nga mga pagbag-o',
'revdel-restore-visible' => 'Mga nakikit-an nga pagbabag-o',
-'revdelete-content' => 'sulod',
-'revdelete-uname' => 'agnay hiton gumaramit',
-'revdelete-hid' => 'igtago an $1',
-'revdelete-unhid' => 'iggawas an $1',
-'revdelete-log-message' => '$1 para ha $2 {{PLURAL:$2|pagliwat|mga pagliwat}}',
-'logdelete-log-message' => '$1 para ha $2 {{PLURAL:$2|panhitabo|mga panhitabo}}',
'revdelete-otherreason' => 'Lain/dugang nga katadungan:',
'revdelete-reasonotherlist' => 'Lain nga katadongan',
'revdelete-edit-reasonlist' => 'Igliwat an mga katadungan han pagpara',
@@ -968,7 +983,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'shortpages' => 'Haglipot nga mga pakli',
'longpages' => 'Haglaba nga mga pakli',
'listusers' => 'Lista han mga gumaramit',
-'usercreated' => 'Ginhimo han $1 ha $2',
+'usercreated' => '{{GENDER:$3|Ginhimo}} han $1 ha $2',
'newpages' => 'Bag-o nga mga pakli',
'newpages-username' => 'Agnay hiton gumaramit:',
'ancientpages' => 'Mga gidaani nga pakli',
@@ -1032,12 +1047,8 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'activeusers-noresult' => 'Waray gumaramit nga nahiagian.',
# Special:Log/newusers
-'newuserlogpage' => 'Talaan han paghimo hin gumaramit',
-'newuserlogpagetext' => 'Ini an talaan han mga nagkahihimo nga mga gumaramit.',
-'newuserlog-byemail' => 'Ginpadangat an tigaman-pagsulod pinaagi han e-mail',
-'newuserlog-create-entry' => 'Bag-o nga gumaramit nga akawnt',
-'newuserlog-create2-entry' => 'Nahimo an bag-o nga akawnt $1',
-'newuserlog-autocreate-entry' => 'Awtomatiko nga nahimo an akawnt',
+'newuserlogpage' => 'Talaan han paghimo hin gumaramit',
+'newuserlogpagetext' => 'Ini an talaan han mga nagkahihimo nga mga gumaramit.',
# Special:ListGroupRights
'listgrouprights-group' => 'Hugpo',
@@ -1086,7 +1097,6 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'actionfailed' => 'Napakyas an ginbuhat',
'deletedtext' => 'Ginpara an "$1".
Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
-'deletedarticle' => 'napara "[[$1]]"',
'dellogpage' => 'Talaan han mga ginpara',
'deletecomment' => 'Katadungan:',
'deletereasonotherlist' => 'Lain nga katadungan',
@@ -1216,6 +1226,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
# Export
'export' => 'Mga pakli hit pagexport',
+'exportall' => 'Ig-export an ngatanan nga mga pakli',
'export-addcattext' => 'Igdugang an mga pakli tikang ha kaarangay:',
'export-addcat' => 'Dugngi',
'export-addnstext' => "Igdugang an mga pakli tikang ha ngaran-lat'ang:",
@@ -1237,64 +1248,65 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
'import-comment' => 'Komento:',
# Tooltip help for the actions
-'tooltip-pt-userpage' => 'An imo pakli hin gumaramit',
-'tooltip-pt-mytalk' => 'An imo pakli hin hiruhimangraw',
-'tooltip-pt-preferences' => 'An imo mga karuyag',
-'tooltip-pt-watchlist' => 'An talaan hin mga pakli nga imo ginsisinubay para hin mga kabag-ohan',
-'tooltip-pt-mycontris' => 'Talaan han imo mga ámot',
-'tooltip-pt-login' => 'Gin-aaghat ka nga mag log-in, pero diri ini ginpipirit.',
-'tooltip-pt-logout' => 'gawas',
-'tooltip-ca-talk' => 'Hiruhimangraw mahiunong han sulod nga pakli',
-'tooltip-ca-edit' => 'Puydi ka makaliwat hini nga pakli. Alayon la paggamit han pahiuna nga paggawas nga piridlitan san-o an pagtipig',
-'tooltip-ca-addsection' => 'Pagtikang hin bag-o nga bahin',
-'tooltip-ca-viewsource' => 'Ini nga pakli in pinaliporan.
+'tooltip-pt-userpage' => 'An imo pakli hin gumaramit',
+'tooltip-pt-mytalk' => 'An imo pakli hin hiruhimangraw',
+'tooltip-pt-preferences' => 'An imo mga karuyag',
+'tooltip-pt-watchlist' => 'An talaan hin mga pakli nga imo ginsisinubay para hin mga kabag-ohan',
+'tooltip-pt-mycontris' => 'Talaan han imo mga ámot',
+'tooltip-pt-login' => 'Gin-aaghat ka nga mag log-in, pero diri ini ginpipirit.',
+'tooltip-pt-logout' => 'gawas',
+'tooltip-ca-talk' => 'Hiruhimangraw mahiunong han sulod nga pakli',
+'tooltip-ca-edit' => 'Puydi ka makaliwat hini nga pakli. Alayon la paggamit han pahiuna nga paggawas nga piridlitan san-o an pagtipig',
+'tooltip-ca-addsection' => 'Pagtikang hin bag-o nga bahin',
+'tooltip-ca-viewsource' => 'Ini nga pakli in pinaliporan.
Makikit-an nimo an ginkuhaaan',
-'tooltip-ca-history' => 'Mga kahadto nga mga pagliwat hini nga pakli',
-'tooltip-ca-protect' => 'Panalipda ini nga pakli',
-'tooltip-ca-delete' => 'Para-a ini nga pakli',
-'tooltip-ca-move' => 'Balhina ini nga pakli',
-'tooltip-ca-watch' => 'Dugnga ini nga pakli ngadto han imo talaan hin ginbibinantayan',
-'tooltip-ca-unwatch' => 'Igtanggal ini nga pakli tikang han imo tala hin binabantayan',
-'tooltip-search' => 'Bilnga ha {{SITENAME}}',
-'tooltip-search-go' => 'Kadto hin pakli nga mayda hin gud nga exakto ngaran kon aadà',
-'tooltip-search-fulltext' => 'Bilnga ha mga pakli para hini nga texto',
-'tooltip-p-logo' => 'Bisitaha an syahan nga pakli',
-'tooltip-n-mainpage' => 'Bisitaha an syahan nga pakli',
-'tooltip-n-mainpage-description' => 'Bisitaha an syahan nga pakli',
-'tooltip-n-portal' => 'Mahiunong han proyekto, ano an imo mahihimo, diin makabiling hin mga butang',
-'tooltip-n-currentevents' => 'Pamiling hin panginsayod ha mga kinabag-ohan nga mga panhitabo',
-'tooltip-n-recentchanges' => 'An talaan hin mga urhe nga mga kabag-ohan han wiki',
-'tooltip-n-randompage' => 'Pagkaraga hin bisan ano nga pakli',
-'tooltip-n-help' => 'An lugar hin pagbiling',
-'tooltip-t-whatlinkshere' => 'Talaan han ngatanan nga wiki nga mga pakli nga nasumpay dinhe',
-'tooltip-t-recentchangeslinked' => 'Mga bag-o nga kabag-ohan ha mga pakli nga nahasumpay tikang hini nga pakli',
-'tooltip-feed-rss' => 'RSS nga pangarga para hini nga pakli',
-'tooltip-feed-atom' => 'Atom nga pangarga para hini nga pakli',
-'tooltip-t-contributions' => 'Kitaa an talaan hin mga amot hini nga nágámit',
-'tooltip-t-emailuser' => 'Padad-i hin e-mail ini nga nágámit',
-'tooltip-t-upload' => 'Pagkarga hin mga fayl',
-'tooltip-t-specialpages' => 'Talaan hin mga pinaurog nga pakli',
-'tooltip-t-print' => 'Maipapatik nga bersyon hini nga pakli',
-'tooltip-t-permalink' => 'Sumpay nga unob ha hini nga pagliwat han pakli',
-'tooltip-ca-nstab-main' => 'Kitaa an sulod nga pakli',
-'tooltip-ca-nstab-user' => 'Kitaa an pakli han gumaramit',
-'tooltip-ca-nstab-media' => 'Kitaa an pakli hin media',
-'tooltip-ca-nstab-special' => 'Pinaurog nga pakli ini, diri ka ngahaw makakapagliwat han pakli',
-'tooltip-ca-nstab-project' => 'Kitaa an pakli han proyekto',
-'tooltip-ca-nstab-image' => 'Kitaa an pakli han fayl',
-'tooltip-ca-nstab-mediawiki' => 'Kitaa an mensahe han sistema',
-'tooltip-ca-nstab-template' => 'Kitaa an plantilya',
-'tooltip-ca-nstab-help' => 'Kitaa an pakli hin bulig',
-'tooltip-ca-nstab-category' => 'Kitaa an pakli hin kaarangay',
-'tooltip-minoredit' => 'Tigamni ini nga gamay nga pagliwat',
-'tooltip-save' => 'Ig-seyb an imo mga pagbabag-o',
-'tooltip-preview' => 'Pahiuna-a nga paggawas an imo mga pagliwat, alayon paggamit hini san-o mo igtipig!',
-'tooltip-diff' => 'Igpakita an mga pagbabag-o nga imo ginbuhat ha teksto',
-'tooltip-compareselectedversions' => 'Kitaa an mga kaibhan ha butnga han duha nga pinili nga mga pagliwat hini nga pakli',
-'tooltip-watch' => 'Dugnga ini nga pakli ngadto han imo talaan hin ginbibinantayan',
-'tooltip-rollback' => 'An "libot-pabalik" in nabalik han (mga) pagliwat hini nga pakli ngadto han kataposan nga nag-amot hin usa ka pidlit',
-'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-summary' => 'Pagbutang hin dalikyat nga sumat',
+'tooltip-ca-history' => 'Mga kahadto nga mga pagliwat hini nga pakli',
+'tooltip-ca-protect' => 'Panalipda ini nga pakli',
+'tooltip-ca-delete' => 'Para-a ini nga pakli',
+'tooltip-ca-move' => 'Balhina ini nga pakli',
+'tooltip-ca-watch' => 'Dugnga ini nga pakli ngadto han imo talaan hin ginbibinantayan',
+'tooltip-ca-unwatch' => 'Igtanggal ini nga pakli tikang han imo tala hin binabantayan',
+'tooltip-search' => 'Bilnga ha {{SITENAME}}',
+'tooltip-search-go' => 'Kadto hin pakli nga mayda hin gud nga exakto ngaran kon aadà',
+'tooltip-search-fulltext' => 'Bilnga ha mga pakli para hini nga texto',
+'tooltip-p-logo' => 'Bisitaha an syahan nga pakli',
+'tooltip-n-mainpage' => 'Bisitaha an syahan nga pakli',
+'tooltip-n-mainpage-description' => 'Bisitaha an syahan nga pakli',
+'tooltip-n-portal' => 'Mahiunong han proyekto, ano an imo mahihimo, diin makabiling hin mga butang',
+'tooltip-n-currentevents' => 'Pamiling hin panginsayod ha mga kinabag-ohan nga mga panhitabo',
+'tooltip-n-recentchanges' => 'An talaan hin mga urhe nga mga kabag-ohan han wiki',
+'tooltip-n-randompage' => 'Pagkaraga hin bisan ano nga pakli',
+'tooltip-n-help' => 'An lugar hin pagbiling',
+'tooltip-t-whatlinkshere' => 'Talaan han ngatanan nga wiki nga mga pakli nga nasumpay dinhe',
+'tooltip-t-recentchangeslinked' => 'Mga bag-o nga kabag-ohan ha mga pakli nga nahasumpay tikang hini nga pakli',
+'tooltip-feed-rss' => 'RSS nga pangarga para hini nga pakli',
+'tooltip-feed-atom' => 'Atom nga pangarga para hini nga pakli',
+'tooltip-t-contributions' => 'Kitaa an talaan hin mga amot hini nga nágámit',
+'tooltip-t-emailuser' => 'Padad-i hin e-mail ini nga nágámit',
+'tooltip-t-upload' => 'Pagkarga hin mga fayl',
+'tooltip-t-specialpages' => 'Talaan hin mga pinaurog nga pakli',
+'tooltip-t-print' => 'Maipapatik nga bersyon hini nga pakli',
+'tooltip-t-permalink' => 'Sumpay nga unob ha hini nga pagliwat han pakli',
+'tooltip-ca-nstab-main' => 'Kitaa an sulod nga pakli',
+'tooltip-ca-nstab-user' => 'Kitaa an pakli han gumaramit',
+'tooltip-ca-nstab-media' => 'Kitaa an pakli hin media',
+'tooltip-ca-nstab-special' => 'Pinaurog nga pakli ini, diri ka ngahaw makakapagliwat han pakli',
+'tooltip-ca-nstab-project' => 'Kitaa an pakli han proyekto',
+'tooltip-ca-nstab-image' => 'Kitaa an pakli han fayl',
+'tooltip-ca-nstab-mediawiki' => 'Kitaa an mensahe han sistema',
+'tooltip-ca-nstab-template' => 'Kitaa an plantilya',
+'tooltip-ca-nstab-help' => 'Kitaa an pakli hin bulig',
+'tooltip-ca-nstab-category' => 'Kitaa an pakli hin kaarangay',
+'tooltip-minoredit' => 'Tigamni ini nga gamay nga pagliwat',
+'tooltip-save' => 'Ig-seyb an imo mga pagbabag-o',
+'tooltip-preview' => 'Pahiuna-a nga paggawas an imo mga pagliwat, alayon paggamit hini san-o mo igtipig!',
+'tooltip-diff' => 'Igpakita an mga pagbabag-o nga imo ginbuhat ha teksto',
+'tooltip-compareselectedversions' => 'Kitaa an mga kaibhan ha butnga han duha nga pinili nga mga pagliwat hini nga pakli',
+'tooltip-watch' => 'Dugnga ini nga pakli ngadto han imo talaan hin ginbibinantayan',
+'tooltip-watchlistedit-normal-submit' => 'Igtanggal an mga titulo',
+'tooltip-rollback' => 'An "libot-pabalik" in nabalik han (mga) pagliwat hini nga pakli ngadto han kataposan nga nag-amot hin usa ka pidlit',
+'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-summary' => 'Pagbutang hin dalikyat nga sumat',
# Attribution
'othercontribs' => 'Ginbasihan ha binuhat ni $1.',
@@ -1311,6 +1323,7 @@ Makikit-an nimo an ginkuhaaan',
# Media information
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pakli|mga pakli}}',
'file-info-size' => '$1 × $2 nga pixel, kadako han fayl: $3, MIME nga tipo: $4',
+'file-nohires' => 'Waray mas hiruhitaas nga resolusyon.',
'svg-long-desc' => 'SVG nga fayl, ginbabanabanahan nga $1 × $2 nga mga pixel, kadako han fayl: $3',
'show-big-image' => 'Bug-os nga resolusyon',
@@ -1319,6 +1332,9 @@ Makikit-an nimo an ginkuhaaan',
'noimages' => 'Waray makikit-an.',
'ilsubmit' => 'Bilnga',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'ago' => '$1 an nakalabay',
+
# Bad image list
'bad_image_list' => 'An kabutangan in masunod:
@@ -1505,4 +1521,10 @@ An iba in daan nakatago.
'htmlform-reset' => 'Igbalik an mga pinamalyuan',
'htmlform-selectorother-other' => 'iba',
+# New logging system
+'newuserlog-byemail' => 'Ginpadangat an tigaman-pagsulod pinaagi han e-mail',
+
+# Feedback
+'feedback-close' => 'Human na.',
+
);
diff --git a/languages/messages/MessagesWo.php b/languages/messages/MessagesWo.php
index b664b237..913f7a6e 100644
--- a/languages/messages/MessagesWo.php
+++ b/languages/messages/MessagesWo.php
@@ -423,14 +423,13 @@ Di la sakku nga yegge ko ab [[Special:ListUsers/sysop|yorkat]] , jox ko màkkaan
'cannotdelete' => 'Farug xët walla dencukaay bi antuwul. (xayna keneen def na ko ba noppi.)',
'badtitle' => 'Koj bu baaxul',
'badtitletext' => 'Kojug xët wi nga laaj baaxul, amul dara walla day di kojjug diggantelàkk walla diggantesémb yu seen lonkoo baaxul. Xayna it dafa am benn walla ay araf yu ñu manuta jëfandikoo cib koj.',
-'perfcached' => 'Lii ab duppitu ndencitu sumb mi la, kon xéj-na beesul.',
-'perfcachedts' => 'Njoxe yii di toftal ab duppitu nëbbitu dàttub njoxe bi la, te yeesalam gu mujj mi ngi am ci: $1',
+'perfcached' => 'Lii ab duppitu ndencitu sumb mi la, kon xéj-na beesul. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Njoxe yii di toftal ab duppitu nëbbitu dàttub njoxe bi la, te yeesalam gu mujj mi ngi am ci: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'Yeesal yu xët wii dañ leen a doxadil fi mu ne nii. Xibaar yi ne fii ci suuf beesuñu.',
'wrong_wfQuery_params' => 'Njuumte ci xibaar yi ci wfQuery()<br />
Solo : $1<br />
Laaj : $2',
'viewsource' => 'Xool gongikuwaayam',
-'viewsourcefor' => 'ngir $1',
'actionthrottled' => 'Jëf jees digal',
'actionthrottledtext' => 'Ngir xeex spam yi, jëf ji nga namm a def dañ kaa digal ci yoon yoo ko man ci benn diir bu gatt. Te mel na ne romb nga boobu dig. Jéemaatal fii aki simili.',
'protectedpagetext' => 'Wii xët dañ koo aar ngir bañ ag coppiteem.',
@@ -609,9 +608,6 @@ Su fekkee joxe nga ab màkkaanu m-bataaxal ci say [[Special:Preferences|tànneef
Sa màkkaanu IP mooy $3 xammeekaayu téye gi mooy #$5. Di la sakku nga joxe leen fuñu la leen laajee.',
'blockednoreason' => 'Joxewul benn ngirte',
-'blockedoriginalsource' => "Yoonu gongikuwaay wu wii xët '''$1''' moo ne nii ci suuf:",
-'blockededitsource' => "Ëmbitu '''say coppite''' yi nga def fii '''$1''' mooy lii ci suuf:",
-'whitelistedittitle' => 'Laaj na nga dugg ngir man a soppi xët wi',
'whitelistedittext' => 'Faaw nga doon $1 ngir am sañ-sañu soppi ëmbit li.',
'confirmedittext' => 'Ngir man a soppi dara faaw nga dëggal sa m-bataaxal. Ngir kocc-koccal walla dëggal sa màkkaan demal ci say [[Special:Preferences|tànneef]].',
'nosuchsectiontitle' => 'Xaaj bi amul',
@@ -806,8 +802,6 @@ Yeneen yorkat yu {{SITENAME}} di nañ man a gis ëmbit yu laqu yi te loppanti le
'revdelete-unsuppress' => 'Far digal yi ci sumb yees delloowaat',
'revdelete-log' => 'Ngirte :',
'revdelete-submit' => 'Def ko ci sumb bi falu',
-'revdelete-logentry' => 'Gisub sumb bi soppiku na ngir [[$1]]',
-'logdelete-logentry' => 'Gisub xew-xew bii [[$1]] dañ kaa soppi',
'revdelete-success' => "'''Coppiteg gisub sumb bi, baax na.'''",
'revdelete-failure' => "'''Gisub sumb bi manoo koo soppi'''
$1",
@@ -817,15 +811,6 @@ $1",
'revdel-restore' => 'Soppi gis bi',
'pagehist' => 'Jaar-jaaru xët wi',
'deletedhist' => 'Jaar-jaaru far gi',
-'revdelete-content' => 'ëmbiit',
-'revdelete-summary' => 'soppi tënk gi',
-'revdelete-uname' => 'turu jëfandikukat',
-'revdelete-restricted' => 'doxalub digal ngir yorkat yi',
-'revdelete-unrestricted' => 'digal ngir yorkat yi deñ na',
-'revdelete-hid' => 'nëbb $1',
-'revdelete-unhid' => 'wone $1',
-'revdelete-log-message' => '$1 ngir $2 {{PLURAL:$2|sumb|sumb}}',
-'logdelete-log-message' => '$1 ngir $2 {{PLURAL:$2|xew-xew|xew-xew}}',
'revdelete-hide-current' => 'Njuumte ci nëbbug cër bi taarixam doon $2, $1: mooy sumb bi teew.
Maneesu koo nëbb.',
'revdelete-show-no-access' => "Njuumte ci woneg cër bi taarixam doon $2, $1: dees koo jàppe niki lees ''digal''.
@@ -971,7 +956,7 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'prefs-rc' => 'Coppite yu mujj',
'prefs-watchlist' => 'Limu toppte',
'prefs-watchlist-days' => 'Limu bes yi nga koy ba ci sa limu toppte :',
-'prefs-watchlist-days-max' => 'Du weesu 7 fan',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => 'Limu coppite yi ngay wone ci limu toppte gees yaatal gi:',
'prefs-misc' => 'Yeneeni tànneef',
'prefs-resetpass' => 'Soppi baatujàll',
@@ -1228,7 +1213,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-backlink' => '↠$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 :',
@@ -1347,7 +1331,6 @@ Faramfacce gi ci [$2 xëtu faramfaccewaayu xët wi] lañuy wone ci suuf .',
# File reversion
'filerevert' => 'Loppanti $1',
-'filerevert-backlink' => '↠$1',
'filerevert-legend' => 'Delloowaat dencukaay bi',
'filerevert-intro' => "Yaa ngi waaj a delloowaat dencukaay bii di '''[[Media:$1|$1]]''' ci [$4 sumb bu $2 ci $3].",
'filerevert-comment' => 'Saraa:',
@@ -1358,7 +1341,6 @@ Faramfacce gi ci [$2 xëtu faramfaccewaayu xët wi] lañuy wone ci suuf .',
# File deletion
'filedelete' => 'Far $1',
-'filedelete-backlink' => '↠$1',
'filedelete-legend' => 'Far bii dencukaay',
'filedelete-intro' => "Yaa ngi waaj a far dencukaay bii di '''[[Media:$1|$1]]''' ak jaar-jaaram bépp.",
'filedelete-intro-old' => "Yaa ngi waaj a far sumb bu '''[[Media:$1|$1]]''' bu [$4 $2 ci $3].",
@@ -1572,12 +1554,8 @@ Xoolal itam [[Special:WantedCategories|wàll yi ñuy laaj]].',
'activeusers-noresult' => 'Benn jëfandikukat giseesu ko',
# Special:Log/newusers
-'newuserlogpage' => 'Jëfandikukat yu yees yi',
-'newuserlogpagetext' => 'Xët wii daf lay won limu sáq yi fi mujjee sosu.',
-'newuserlog-byemail' => 'baatujáll bi yónne nañu ko cib bataaxal',
-'newuserlog-create-entry' => 'Jëfandikukat bu bees',
-'newuserlog-create2-entry' => 'moo sos mii sáq mu bees $1',
-'newuserlog-autocreate-entry' => 'Sáq mi sos na boppam',
+'newuserlogpage' => 'Jëfandikukat yu yees yi',
+'newuserlogpagetext' => 'Xët wii daf lay won limu sáq yi fi mujjee sosu.',
# Special:ListGroupRights
'listgrouprights' => 'Sañ-sañi mbooloom jëfandikukat mi',
@@ -1668,15 +1646,12 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
'exbeforeblank' => 'ëmbitam laataa far gi : $1',
'exblank' => 'xët wi amul dara',
'delete-confirm' => 'Far « $1 »',
-'delete-backlink' => '↠$1',
'delete-legend' => 'Far',
'historywarning' => 'Moytul! xët wi ngay waaja far am na jaar-jaar :',
'confirmdeletetext' => 'Yaa ngi waaja far ba faaw, ci dáttub njoxe bi, aw xët walla ab nataal ak jaar-jaaram. Dila ñaan nga dëggal ne loolu nga namma def dëgg-dëgg, te xam nga limuy jur, te itam dëppoo na ak átte yi ñu tëral ci [[{{MediaWiki:Policy-url}}]].',
'actioncomplete' => 'Jëf jees def',
'deletedtext' => '« $1 » far nañu ko.
Xolal $2 ngir gis limu farte bi mujj.',
-'deletedarticle' => 'moo far « [[$1]] »',
-'suppressedarticle' => 'moo far « [[$1]] »',
'dellogpage' => 'Jaar-jaaru farte bi',
'dellogpagetext' => 'Li toftal ab limu farte yi mujj la.',
'deletionlog' => 'jaar-jaaru farte bi',
@@ -1723,7 +1698,6 @@ nemmeekul [[Special:ProtectedPages|limu xët yi ñu aar]] ngir gis ab lim ci xë
'movedarticleprotection' => 'moo jële kaaraange gi ci « [[$2]] » jëmale ko « [[$1]] »',
'protect-title' => 'Soppi tolluwaayu kaaraange gu « [[$1]] »',
'prot_1movedto2' => '[[$1]] leegi mooy [[$2]]',
-'protect-backlink' => '↠$1',
'protect-legend' => 'Dëggalal aar gi',
'protectcomment' => 'Ngirte :',
'protectexpiry' => 'Jeexintal :',
@@ -1775,7 +1749,6 @@ Nii-nii kocc-koccalu xët wii ñooy '''$1''':",
'undeletereset' => 'Neenal',
'undeleteinvert' => 'Jallarbi fal gi',
'undeletecomment' => 'Tënk :',
-'undeletedarticle' => 'moo delloowaat « [[$1]] »',
'undeletedrevisions' => '$1 {{PLURAL:$1|delloowaat nañ ab sumb|delloowaat nañ $1 sumb}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|sumb|sumb}} ak $2 {{PLURAL:$2|ŋara|ŋara}} loppanti nañu leen',
'undeletedfiles' => '{{PLURAL:$1|1 dencukaay|$1 dencukaay}} lañu delloowaat',
@@ -1997,9 +1970,6 @@ Ci yii anam, faww nga tuddewaat walla yokk wii xëtu waxtaanuwaay ak sa loxo, su
'movepage-page-moved' => 'Xët wii di $1 lees tuddewaat $2',
'movepage-page-unmoved' => 'Xët wii di $1 maneesu koo tuddewaat $2',
'movepage-max-pages' => 'Lim bi gën-a-bari bu $1 {{PLURAL:$1|xët|xët}} lees tuddewaat te maneesul a tuddewaat yeneen cig boppu.',
-'1movedto2' => '[[$1]] la tuddewaat [[$2]]',
-'1movedto2_redir' => 'moo jubluwaatal [[$1]] mu jëm [[$2]]',
-'move-redirect-suppressed' => 'Jubluwaat gees far',
'movelogpage' => 'Jaar-jaaru tuddewaat yi',
'movelogpagetext' => 'Lii mooy limu xët yees mujje tuddewaat.',
'movesubpage' => '{{PLURAL:$1|ron-xët|ron-xët}}',
@@ -2146,7 +2116,7 @@ Dafay tax nga man a bind ngirte li ci boyotu tënk bi.',
# Media information
'file-info' => 'Réyaayu file bi : $1, type MIME : $2',
'file-info-size' => '$1 × $2 pixels, réyaayu file bi : $3, type MIME : $4',
-'file-nohires' => '<small>Amul kem bu ëpp bii bu jàppandi.</small>',
+'file-nohires' => 'Amul kem bu ëpp bii bu jàppandi.',
'svg-long-desc' => 'Dencukaay SVG, kem bu jaadu $1 × $2 pixel, dayoo dencukaay bi: $3',
'show-big-image' => 'Ngandalal nataal gii',
@@ -2199,9 +2169,6 @@ Lëkkalekaay yiy toftal, ci wenn rëdd wi, dees leen di jàppee nikiy sette, maa
'confirmemail' => 'Dëggalal sa m-bataaxal',
'confirmemail_noemail' => 'Jooxewoo ab m-bataaxal bu baax ci say [[Special:Preferences|tànneef]].',
-# Trackbacks
-'trackbackremove' => '([$1 Dindi])',
-
# Delete conflict
'confirmrecreate' => "Jëfëndikookat bii [[User:$1|$1]] ([[User talk:$1|Waxtaan]]) moo dindi xët wii, nga xam ne tambaliwoon nga koo defar, ngir ngirte lii :
: ''$2''
@@ -2241,4 +2208,9 @@ Man nga tamit [[Special:EditWatchlist/raw|soppi ko]].',
# Special:SpecialPages
'specialpages' => 'Xëti jagleel',
+# New logging system
+'revdelete-restricted' => 'doxalub digal ngir yorkat yi',
+'revdelete-unrestricted' => 'digal ngir yorkat yi deñ na',
+'newuserlog-byemail' => 'baatujáll bi yónne nañu ko cib bataaxal',
+
);
diff --git a/languages/messages/MessagesWuu.php b/languages/messages/MessagesWuu.php
index 0bf796d1..8ec27436 100644
--- a/languages/messages/MessagesWuu.php
+++ b/languages/messages/MessagesWuu.php
@@ -355,14 +355,13 @@ $1',
渠作兴已ç»æ‹¨åˆ«äººå®¶åˆ é™¤è„±å“‰ã€‚',
'badtitle' => '该åªæ ‡é¢˜å¼—æ¥ä¸‰',
'badtitletext' => '所请求页é¢ä¸ªæ ‡é¢˜æ˜¯æ— æ•ˆä¸ªã€å¼—存在,跨语言或跨wiki链接个标题错误。渠作兴包å«ä¸€åªæˆ–多åªå¼—好用拉标题里å‘字符。',
-'perfcached' => '下底是缓存数æ®ï¼Œç®‡å’¾ä½œå…´å¼—是顶新个:',
-'perfcachedts' => '下头是缓存数æ®ï¼ŒåŽ‹æœ«ä¸€è¶Ÿæ›´æ–°è¾°å…‰æ˜¯$1。',
+'perfcached' => '下底是缓存数æ®ï¼Œç®‡å’¾ä½œå…´å¼—是顶新个. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => '下头是缓存数æ®ï¼ŒåŽ‹æœ«ä¸€è¶Ÿæ›´æ–°è¾°å…‰æ˜¯$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => '当å‰ç¦æ­¢å¯¹æ­¤é¡µé¢è¿›è¡Œæ›´æ–°ã€‚箇æ­ä¸ªæ•°æ®å¼—好立å³åˆ·æ–°ã€‚',
'wrong_wfQuery_params' => '错误个å‚数拨传递到 wfQuery()<br />
函数:$1<br />
查询:$2',
'viewsource' => 'æºç ',
-'viewsourcefor' => '$1个æºç ',
'actionthrottled' => '动作已压制',
'actionthrottledtext' => '基于å垃圾链接个考é‡ï¼Œé™åˆ¶åžƒæ‹‰çŸ­æ—¶é—´å†…多趟é‡å¤ç®‡åªæ“作。请过脱几分钟å†è¯•è¯•çœ‹ã€‚',
'protectedpagetext' => '箇åªé¡µé¢å·²ç»é”定,以防编辑。',
@@ -542,9 +541,6 @@ $2',
侬个IP地å€æ˜¯$3,而该查å°ID是 #$5。 请垃拉侬个查询里å‘注明以上所有资料。",
'blockednoreason' => '弗曾拨原因',
-'blockedoriginalsource' => "下头是'''$1'''个æºç ï¼š",
-'blockededitsource' => "侬对'''$1'''进行'''编辑'''个文字如下:",
-'whitelistedittitle' => '登录仔å†å¥½ç¼–辑',
'whitelistedittext' => '侬必须$1æ‰èƒ½ç¼–辑。',
'confirmedittext' => '垃拉编辑此页之å‰ä¾¬å¿…须确认侬个邮箱地å€ã€‚请通过[[Special:Preferences|个人设置]]设置并验è¯ä¾¬ä¸ªé‚®ç®±åœ°å€ã€‚',
'nosuchsectiontitle' => '寻弗ç€ç®‡åªæ®µè½',
@@ -780,8 +776,6 @@ $3å°ç¦ä¸ªåŽŸå› æ˜¯''$2''",
'revdelete-unsuppress' => '垃拉已æ¢å¤ä¸ªä¿®è®¢é‡Œå‘移除é™åˆ¶',
'revdelete-log' => 'ç†ç”±ï¼š',
'revdelete-submit' => '应用于拣中个{{PLURAL:$1|修订}}',
-'revdelete-logentry' => '[[$1]]个修订å¯è§æ€§å·²æ›´æ”¹',
-'logdelete-logentry' => '[[$1]]个事件å¯è§æ€§å·²æ›´æ”¹',
'revdelete-success' => "'''修订个å¯è§æ€§å·²ç»æˆåŠŸæ›´æ–°ã€‚'''",
'revdelete-failure' => "'''修订个å¯è§æ€§æ— æ³•æ›´æ–°ï¼š'''
$1",
@@ -793,15 +787,6 @@ $1",
'revdel-restore-visible' => 'å¯è§ä¸ªä¿®è®¢ç‰ˆæœ¬',
'pagehist' => '页é¢åŽ†å²',
'deletedhist' => '已删除之历å²',
-'revdelete-content' => '内容',
-'revdelete-summary' => '编辑摘è¦',
-'revdelete-uname' => '用户å',
-'revdelete-restricted' => '已将é™åˆ¶åº”用到管ç†å‘˜',
-'revdelete-unrestricted' => '已移除对管ç†å‘˜ä¸ªé™åˆ¶',
-'revdelete-hid' => '囥脱 $1',
-'revdelete-unhid' => '显示 $1',
-'revdelete-log-message' => '$1个$2次修订',
-'logdelete-log-message' => '$1个$2项事件',
'revdelete-hide-current' => 'éšè—于$1 $2之项目错误:箇个是当å‰ä¸ªä¿®è®¢ï¼Œå¼—å¯ä»¥éšè—。',
'revdelete-show-no-access' => '显示于$1 $2之项目错误:箇åªé¡¹ç›®å·²ç»æ ‡ç¤ºä¸º"å·²é™åˆ¶",侬对渠并无通行æƒã€‚',
'revdelete-modify-no-access' => '更改于$1 $2之项目错误:箇个项目已ç»æ ‡ç¤ºä¸º"å·²é™åˆ¶",侬对渠并无通行æƒã€‚',
@@ -947,7 +932,7 @@ $1",
'prefs-rc' => '近段辰光个改动',
'prefs-watchlist' => '监控列表',
'prefs-watchlist-days' => '勒拉监控列表里å‘显示个日数:',
-'prefs-watchlist-days-max' => '顶长7日天',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => '勒拉扩展个监控列表里å‘显示个编辑趟数:',
'prefs-watchlist-edits-max' => '顶多:1000',
'prefs-watchlist-token' => '监控列表记认:',
@@ -1212,8 +1197,7 @@ $1",
'listusers-submit' => '显示',
# Special:Log/newusers
-'newuserlogpage' => '用户创建日志',
-'newuserlog-create-entry' => '新开户',
+'newuserlogpage' => '用户创建日志',
# Special:ListGroupRights
'listgrouprights-members' => '(æˆå‘˜åˆ—表)',
@@ -1261,7 +1245,6 @@ $1",
请确定侬è¦è¿›è¡Œæ­¤é¡¹æ“作,并且了解其åŽæžœï¼ŒåŒæ—¶ä¾¬ä¸ªè¡Œä¸ºç¬¦åˆ[[{{MediaWiki:Policy-url}}|the policy]]。',
'actioncomplete' => 'æ“作完æˆå“‰',
'deletedtext' => '"$1"å·²ç»åˆ é™¤ã€‚最近删除记录请å‚è§$2。',
-'deletedarticle' => '"[[$1]]" å·²ç»åˆ è„±å“‰',
'dellogpage' => '删除记录',
'deletionlog' => '删除记录',
'deletecomment' => 'ç†ç”±:',
@@ -1304,11 +1287,10 @@ $1",
'restriction-move' => 'æ…è¡',
# Undelete
-'undeletepage' => '查看æ­ä»”æ¢å¤åˆ è„±ä¸ªé¡µé¢',
-'viewdeletedpage' => '望望删脱个页é¢',
-'undeletelink' => '查看ï¼æ¢å¤',
-'undeletecomment' => 'ç†ç”±ï¼š',
-'undeletedarticle' => 'å·²æ¢å¤ä¸ª"[[$1]]"',
+'undeletepage' => '查看æ­ä»”æ¢å¤åˆ è„±ä¸ªé¡µé¢',
+'viewdeletedpage' => '望望删脱个页é¢',
+'undeletelink' => '查看ï¼æ¢å¤',
+'undeletecomment' => 'ç†ç”±ï¼š',
# Namespace form on various pages
'namespace' => 'å字空间:',
@@ -1401,8 +1383,6 @@ $1",
但是由于新标题下已ç»æœ‰å¯¹è¯é¡µå­˜åœ¨ï¼Œæ‰€ä»¥å¯¹è¯é¡µæ— æ³•ç§»åŠ¨ã€‚请手工åˆå¹¶ä¸¤åªé¡µé¢ã€‚',
'movedto' => '移动到',
'movetalk' => '移动相关讨论页',
-'1movedto2' => '[[$1]]æ…到[[$2]]',
-'1movedto2_redir' => '[[$1]]通过é‡å®šå‘æ…到[[$2]]',
'movelogpage' => 'æ…è¡è®°å½•',
'movelogpagetext' => '下底是拨拉æ…è¡ä¸ªé¡µé¢åˆ—表。',
'movereason' => 'ç†ç”±:',
@@ -1487,9 +1467,6 @@ $1",
# Attribution
'anonymous' => '{{SITENAME}}浪个匿å用户',
-# Patrol log
-'patrol-log-auto' => '(自动)',
-
# Image deletion
'deletedrevision' => '拨删脱个旧修订 $1',
@@ -1499,7 +1476,7 @@ $1",
# Media information
'file-info-size' => '$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4',
-'file-nohires' => '<small>无更高分辨率å¯æ供。</small>',
+'file-nohires' => '无更高分辨率å¯æ供。',
'svg-long-desc' => 'SVG文件,å义大å°ï¼š$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3',
'show-big-image' => '完整分辨率',
@@ -1626,4 +1603,8 @@ Variants for Chinese language
# Special:SpecialPages
'specialpages' => '特殊页é¢',
+# New logging system
+'revdelete-restricted' => '已将é™åˆ¶åº”用到管ç†å‘˜',
+'revdelete-unrestricted' => '已移除对管ç†å‘˜ä¸ªé™åˆ¶',
+
);
diff --git a/languages/messages/MessagesXal.php b/languages/messages/MessagesXal.php
index d6e1655b..eb2113a5 100644
--- a/languages/messages/MessagesXal.php
+++ b/languages/messages/MessagesXal.php
@@ -52,6 +52,9 @@ $namespaceAliases = array(
'Янзин_туÑкар_ухалвр' => NS_CATEGORY_TALK,
);
+// Remove Russian aliases
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'Заалһиг Ñ‚Ð°Ñ‚Ð°Ñ Ñ‚Ð°Ñ‚Ñ…:',
@@ -385,7 +388,6 @@ $1',
'badtitle' => 'Буру нернь',
'badtitletext' => 'СурÑн нерн буру, хооÑн, аль му бичÑн келн хоорнд нертә. Тиим чигн биз, нерн зөв уга үзгтә.',
'viewsource' => 'Ишиг хәләх',
-'viewsourcefor' => '$1 халх',
'actionthrottled' => 'Хурдна заг',
'sqlhidden' => '(SQL Ñурвр бултулÑн)',
'ns-specialprotected' => 'Шишлң халх чиклÑн бәәх болшго.',
@@ -628,7 +630,7 @@ $1',
'prefs-rc' => 'Шидрә Ñольлһн',
'prefs-watchlist' => 'Шинҗллһнә Ñеткүл',
'prefs-watchlist-days' => 'Шинҗллһнә Ñедкүлд үзүлÑн ик гиÑн өдрин то:',
-'prefs-watchlist-days-max' => 'Ик гиÑн 7 хонг',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-misc' => 'Талдан',
'prefs-resetpass' => 'Ðууц угиг Ñольҗ',
'prefs-email' => "E-mail'ын көгүд",
@@ -860,8 +862,7 @@ $1',
'linksearch' => 'Һаза заалһуд',
# Special:Log/newusers
-'newuserlogpage' => 'Бичгдлһнә Ñеткүл',
-'newuserlog-create-entry' => 'Шин демнч',
+'newuserlogpage' => 'Бичгдлһнә Ñеткүл',
# Special:ListGroupRights
'listgrouprights-members' => '(мөчүдин Ñеткүл)',
@@ -925,7 +926,6 @@ e-mail\'ар $PAGEEDITOR_EMAIL
'actioncomplete' => 'Үүлд кев',
'deletedtext' => '«$1» һарһҗ болв.
$2 шидрә һарһлһна төлә хәләтн.',
-'deletedarticle' => '«[[$1]]» халхиг һарһв',
'dellogpage' => 'Һарһллһна Ñеткүл',
'deletecomment' => 'Учр:',
'deleteotherreason' => 'Талдан аль дәкәд учр:',
@@ -963,9 +963,8 @@ $2 шидрә һарһлһна төлә хәләтн.',
'restriction-move' => 'Көндлһн',
# Undelete
-'undeletelink' => 'гүүһәд хәләх/боÑÑ…Ò— тохрах',
-'undeleteinvert' => 'Зөрү Ñуңһлт',
-'undeletedarticle' => '«[[$1]]» хәрү кехв',
+'undeletelink' => 'гүүһәд хәләх/боÑÑ…Ò— тохрах',
+'undeleteinvert' => 'Зөрү Ñуңһлт',
# Namespace form on various pages
'namespace' => 'Ðернә у:',
@@ -1051,8 +1050,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
'talkexists' => "'''Халхин йовудта көндллһн. Болв, ухалвр халх көндәх болшго. Юнгад гихлә, Ñн нерәдлһтә халх бәәнә. Буйн болтха, териг һарар неҗәлтн.'''",
'movedto' => 'көндÑн:',
'movetalk' => 'Өөр ухалвр халхиг көндәх.',
-'1movedto2' => '«[[$1]]» Ñ…Ð°Ð»Ñ…Ð°Ñ Â«[[$2]]» халхд көндв',
-'1movedto2_redir' => '«[[$1]]» Ñ…Ð°Ð»Ñ…Ð°Ñ Â«[[$2]]» халхд көндв (авч одлһта уга).',
'movelogpage' => 'Ðернә Ñольлһна Ñеткүл',
'movereason' => 'Учр:',
'revertmove' => 'хәрүлһн',
@@ -1136,7 +1133,7 @@ $2 шидрә һарһлһна төлә хәләтн.',
# Media information
'file-info' => 'боомгин кемҗә: $1, MIME төрл: $2',
'file-info-size' => '$1 × $2 цегтә, боомгин кемҗән: $3, MIME Ñнз: $4',
-'file-nohires' => '<small>Икәр чинртә Ñнз уга.</small>',
+'file-nohires' => 'Икәр чинртә Ñнз уга.',
'svg-long-desc' => 'SVG боомг, $1 × $2 мет цегтә, боомгин кемҗән: $3',
'show-big-image' => 'Күцц чинр',
'file-info-gif-looped' => 'билцгÑн',
diff --git a/languages/messages/MessagesXh.php b/languages/messages/MessagesXh.php
index e3f4e078..4fd23a89 100644
--- a/languages/messages/MessagesXh.php
+++ b/languages/messages/MessagesXh.php
@@ -157,7 +157,6 @@ I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENA
'move-page-legend' => 'Dlulisa eliphepha',
'movepagebtn' => 'DLulisa eliphepha',
'movedto' => 'Lidluliselwe',
-'1movedto2' => '[[$1]] lidluliselwe [[$2]]',
'movereason' => 'Isizathu',
# Special:NewFiles
diff --git a/languages/messages/MessagesXmf.php b/languages/messages/MessagesXmf.php
index 41dcbfa3..f6db9f37 100644
--- a/languages/messages/MessagesXmf.php
+++ b/languages/messages/MessagesXmf.php
@@ -247,7 +247,6 @@ $messages = array(
'badtitletext' => 'მáƒáƒ—ხილ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ჯáƒáƒ®áƒ ჩილáƒáƒ—ირ რდუ, ვáƒáƒ áƒ ჩáƒáƒšáƒ˜áƒ”რ, ვáƒáƒ áƒ ხáƒáƒšáƒ გáƒáƒ®áƒáƒšáƒ£áƒ“ეს ჩილáƒáƒ—ირრგინáƒáƒ áƒªáƒ®áƒ£áƒáƒ¤áƒ˜áƒš ინტერ–ნინრვáƒáƒ áƒ ინტერ–წიკი ჯáƒáƒ®áƒ.
თენრშილებე იკáƒáƒ—უáƒáƒœáƒ“áƒáƒ¡ áƒáƒ áƒ— ვáƒáƒ áƒ უმáƒáƒ¡ თიშნერ ნიშáƒáƒœáƒ¡ ნáƒáƒ›áƒ£áƒ¨ გუმáƒáƒ áƒ˜áƒœáƒáƒ¤áƒ ჯáƒáƒ®áƒáƒ¡ ვრშილებე.',
'viewsource' => 'ქáƒáƒ«áƒ˜áƒ áƒ˜ წყუ',
-'viewsourcefor' => '$1-იშ',
'viewsourcetext' => 'თქვრშეილებუნრქáƒáƒ«áƒ˜áƒ áƒáƒ— თე ხáƒáƒ¡áƒ·áƒšáƒáƒ¨ დáƒáƒ­áƒ§áƒáƒ¤áƒ£áƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜ დრქუდáƒáƒ áƒ¡áƒ®áƒ£áƒáƒ— თიშ მáƒáƒœáƒ’ი:',
# Login and logout pages
@@ -384,13 +383,9 @@ $messages = array(
# Revision deletion
'rev-delundel' => 'ძირáƒáƒ¤áƒ/ტყáƒáƒ‘ინáƒáƒ¤áƒ',
-'revdelete-logentry' => '"[[$1]]"-შ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ”ფიშ ძირáƒáƒ¤áƒáƒ‘áƒáƒ¥ დითირჷ',
'revdel-restore' => 'áƒáƒ áƒ¬áƒ§áƒ”ნჯáƒáƒ‘áƒáƒ¨ თირუáƒ',
'revdel-restore-deleted' => 'ლáƒáƒ¡áƒ˜áƒ áƒ˜ რევიზიეფი',
'revdel-restore-visible' => 'ძირáƒáƒ¤áƒáƒ“ი რევიზიეფი',
-'revdelete-content' => 'დინáƒáƒ áƒ”',
-'revdelete-hid' => 'დიფულუ $1',
-'revdelete-log-message' => '$1 $2- შრ{{PLURAL:$2|რევიზიáƒ|რევიზიეფი}}',
# Merge log
'revertmerge' => 'ეკáƒáƒ áƒ¢áƒ§áƒ£áƒáƒšáƒáƒ¨ მáƒáƒšáƒáƒ¡áƒ£áƒ',
@@ -574,7 +569,7 @@ $messages = array(
'prefixindex' => 'áƒáƒ áƒ«áƒ ხáƒáƒ¡áƒ˜áƒšáƒ პრეფიქსით',
'shortpages' => 'ჭიჭე ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'longpages' => 'გინძე ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
-'usercreated' => 'დირსხუ $1 $2-ს',
+'usercreated' => '{{GENDER:$3|დირსხუ}} $2-ის $1-ს',
'newpages' => 'áƒáƒ®áƒáƒš ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'ancientpages' => 'ჯვეშ ხáƒáƒ¡áƒ˜áƒšáƒ”ფ',
'move' => 'გინáƒáƒ¦áƒáƒšáƒ',
@@ -611,8 +606,7 @@ $messages = array(
'linksearch-line' => '$1 მერცხიილი რე $2-შე',
# Special:Log/newusers
-'newuserlogpage' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ რეგისტრáƒáƒªáƒ˜áƒáƒ¨ ჟურნáƒáƒš',
-'newuserlog-create-entry' => 'áƒáƒ®áƒáƒš მáƒáƒ®áƒ•áƒáƒ áƒ”ბუ',
+'newuserlogpage' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ რეგისტრáƒáƒªáƒ˜áƒáƒ¨ ჟურნáƒáƒš',
# Special:ListGroupRights
'listgrouprights-members' => '(მáƒáƒ™áƒáƒ—ურეფიშ ერკებული)',
@@ -646,7 +640,6 @@ $messages = array(
'actionfailed' => 'მáƒáƒ¥áƒ›áƒ”დáƒáƒšáƒáƒ¥ დემáƒáƒ áƒªáƒ®áƒ·',
'deletedtext' => '"$1\\" ლáƒáƒ¡áƒ˜áƒ áƒ¥ იყ’უ.
áƒáƒ¡áƒ”რდე ლáƒáƒ¡áƒ˜áƒ  ხáƒáƒ¡áƒ˜áƒšáƒ”ფიშ ერკებულ ქáƒáƒ«áƒ˜áƒ áƒ˜áƒ— $2–ს.',
-'deletedarticle' => '"[[$1]]" ლáƒáƒ¡áƒ˜áƒ  რე',
'dellogpage' => 'ლáƒáƒ¡áƒ˜áƒ áƒ”ფიშ ერკებულ',
'deletecomment' => 'სáƒáƒ›áƒáƒœáƒ¯áƒ”ლ:',
'deleteotherreason' => 'შხვáƒ/გეძინელ სáƒáƒ›áƒáƒœáƒ¯áƒ”ლ:',
@@ -685,7 +678,6 @@ $messages = array(
'undeletebtn' => 'áƒáƒ®áƒáƒšáƒ¨áƒ ეკáƒáƒœáƒ¬áƒ§áƒ£áƒáƒšáƒ',
'undeletelink' => 'ძირáƒáƒ¤áƒ/ეკáƒáƒœáƒ¬áƒ§áƒ£áƒáƒšáƒ',
'undeleteviewlink' => 'ძირáƒáƒ¤áƒ',
-'undeletedarticle' => 'ეკáƒáƒœáƒ¬áƒ§áƒ˜áƒšáƒ¥ იყ’უ "[[$1]]"',
'undelete-search-submit' => 'გáƒáƒ áƒ£áƒ',
# Namespace form on various pages
@@ -778,8 +770,6 @@ $messages = array(
ქáƒáƒ áƒ—ხინთ, áƒáƒ™áƒáƒ áƒ¢áƒ§áƒ£áƒáƒ— თინეფ მáƒáƒœáƒ£áƒáƒšáƒ£áƒ áƒ.'''",
'movedto' => 'გინáƒáƒ¦áƒáƒšáƒ£áƒš რე',
'movetalk' => 'áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბულ სხუნუáƒáƒ¨ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ გინáƒáƒ¦áƒáƒšáƒ',
-'1movedto2' => '[[$1]] გინáƒáƒ¦áƒáƒšáƒ˜áƒ  რე [[$2]]–შáƒ',
-'1movedto2_redir' => '[[$1]] გინáƒáƒ¦áƒáƒšáƒ˜áƒ  რე [[$2]]-შრგინáƒáƒ¬áƒ£áƒ áƒáƒ¤áƒáƒ—',
'movelogpage' => 'áƒáƒ áƒ”გისტრáƒáƒªáƒ˜áƒ” ჟურნáƒáƒšáƒ˜áƒ¨ გინáƒáƒ¦áƒáƒšáƒ',
'movereason' => 'სáƒáƒ›áƒáƒœáƒ¯áƒ”ლი:',
'revertmove' => 'გáƒáƒ£áƒ¥áƒ•áƒáƒ¤áƒ',
@@ -857,17 +847,13 @@ $messages = array(
'tooltip-undo' => '"გáƒáƒ£áƒ¥áƒ•áƒáƒ¤áƒ" მიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თირáƒáƒ¤áƒ”ფს გáƒáƒ£áƒ¥áƒ•áƒ”ნს დრგუთმáƒáƒœáƒ¬áƒ§áƒ£áƒœáƒ¡ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¨ ფáƒáƒ áƒ›áƒáƒ¡ გიწáƒáƒ—áƒáƒšáƒáƒ áƒáƒ¤áƒáƒ¨ რეჟიმს. თენრშესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡ ირძენს რეზიუმეს სáƒáƒ›áƒáƒœáƒ¯áƒ”ლქ იყ’უáƒáƒ¡ დáƒáƒ™áƒáƒœáƒ™áƒ áƒ”ტებულქინ.',
'tooltip-summary' => 'კუნტრრეზიუმეშ მიშáƒáƒ¸áƒáƒœáƒáƒ¤áƒ',
-# Patrol log
-'patrol-log-line' => 'მერჩქინელი $1 $2-შე პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒáƒ¤áƒ˜áƒšáƒ˜ $3',
-'patrol-log-diff' => 'რევიზირ$1',
-
# Browsing diffs
'previousdiff' => '↠წáƒáƒ®áƒáƒšáƒ”ნი თირáƒáƒ¤áƒ”ფ',
'nextdiff' => 'უáƒáƒ®áƒáƒšáƒáƒ¨ თირáƒáƒ¤áƒ →',
# Media information
'file-info-size' => '$1 × $2 პიქსელ, ფáƒáƒ˜áƒšáƒ˜áƒ¨ ზáƒáƒ›áƒ: $3, MIME ტიპ: $4',
-'file-nohires' => '<small> უმáƒáƒ¡ მáƒáƒ¦áƒáƒš გიშáƒáƒ’áƒáƒ áƒáƒœáƒ¯áƒáƒšáƒ ვრრე შელებუáƒáƒœ.</small>',
+'file-nohires' => ' უმáƒáƒ¡ მáƒáƒ¦áƒáƒš გიშáƒáƒ’áƒáƒ áƒáƒœáƒ¯áƒáƒšáƒ ვრრე შელებუáƒáƒœ.',
'svg-long-desc' => 'SVG ფáƒáƒ˜áƒš, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒ $1 × $2 პიქსელ, ფáƒáƒ˜áƒšáƒ˜áƒ¨ ზიმáƒ: $3',
'show-big-image' => 'რსული გიშáƒáƒ’áƒáƒ áƒáƒœáƒ¯áƒáƒšáƒ',
@@ -914,9 +900,6 @@ $messages = array(
'namespacesall' => 'áƒáƒ áƒ«áƒ',
'monthsall' => 'áƒáƒ áƒ«áƒ',
-# Trackbacks
-'trackbacklink' => 'Trackback',
-
# Watchlist editing tools
'watchlisttools-view' => 'მერცხილ თირáƒáƒ¤áƒ”ფიშ ძირáƒáƒ¤áƒ',
'watchlisttools-edit' => 'áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბელ ხáƒáƒ¡áƒ˜áƒšáƒ”ფიშ ძირáƒáƒ¤áƒ დრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php
index 9b01d650..2c74ef56 100644
--- a/languages/messages/MessagesYi.php
+++ b/languages/messages/MessagesYi.php
@@ -102,7 +102,7 @@ $specialPageAliases = array(
'Newpages' => array( 'נייע_בלעטער' ),
'Popularpages' => array( 'פ×פולערע_בלעטער' ),
'Preferences' => array( 'פרעפערענצן' ),
- 'Prefixindex' => array( 'בלעטער_וו×ס_הייבן_×ין_מיט' ),
+ 'Prefixindex' => array( 'בלעטער_וו×ס_הייבן_×ן_מיט' ),
'Protectedpages' => array( 'געשיצטע_בלעטער' ),
'Protectedtitles' => array( 'געשיצטע_קעפלעך' ),
'Randompage' => array( 'צופעליג', 'צופעליגער_בל×ט' ),
@@ -137,38 +137,42 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ווייטערפירן', '#הפניה', '#REDIRECT' ),
- 'notoc' => array( '0', '__קיין_××™× ×”×לט_ט×בעלע__', '__לל×_תוכן_×¢× ×™×™× ×™×__', '__לל×_תוכן__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__קיין_×’×לעריע__', '__לל×_גלריה__', '__NOGALLERY__' ),
- 'toc' => array( '0', '__××™× ×”×לט__', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
- 'noeditsection' => array( '0', '__נישט_רעד×קטירן__', '__לל×_עריכה__', '__NOEDITSECTION__' ),
- 'numberofarticles' => array( '1', 'צ×ל_×רטיקלען', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
- 'pagename' => array( '1', 'בל×טנ×מען', '×©× ×”×“×£', 'PAGENAME' ),
- 'namespace' => array( '1', '× ×מענטייל', 'מרחב הש×', 'NAMESPACE' ),
- 'fullpagename' => array( '1', 'פולבל×טנ×מען', '×©× ×”×“×£ המל×', 'FULLPAGENAME' ),
- 'subpagename' => array( '1', '×ונטערבל×טנ×מען', '×©× ×“×£ המשנה', 'SUBPAGENAME' ),
- 'talkpagename' => array( '1', 'רעדנבל×טנ×מען', '×©× ×“×£ השיחה', 'TALKPAGENAME' ),
- 'subst' => array( '0', 'ס:', 'SUBST:' ),
- 'img_thumbnail' => array( '1', 'קליין', 'ממוזער', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'קליין=$1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'רעכטס', 'ימין', 'right' ),
- 'img_left' => array( '1', 'לינקס', 'שמ×ל', 'left' ),
- 'img_none' => array( '1', '×ן', 'לל×', 'none' ),
- 'img_center' => array( '1', 'צענטער', 'מרכז', 'center', 'centre' ),
- 'img_sub' => array( '1', '×ונטער', 'תחתי', 'sub' ),
- 'img_top' => array( '1', '×ויבן', 'למעלה', 'top' ),
- 'img_bottom' => array( '1', '×ונטן', 'למטה', 'bottom' ),
- 'img_link' => array( '1', 'לינק=$1', 'קישור=$1', 'link=$1' ),
- 'img_alt' => array( '1', 'טעקסט=$1', 'טקסט=$1', 'alt=$1' ),
- 'grammar' => array( '0', 'גר×מ×טיק:', 'דקדוק:', 'GRAMMAR:' ),
- 'plural' => array( '0', 'מערצ×ל:', 'רבי×:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'פֿולער_× ×מען:', 'כתובת מל××”:', 'FULLURL:' ),
- 'raw' => array( '0', 'רוי:', '×œ×œ× ×¢×™×‘×•×“:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ווייזן_קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
- 'language' => array( '0', '#שפר×ך:', '#שפה:', '#LANGUAGE:' ),
- 'defaultsort' => array( '1', 'גרונטס×רטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'hiddencat' => array( '1', '__ב××”×לטענע_ק×טעג×ריע__', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
- 'pagesize' => array( '1', 'בל×טגרייס', 'גודל דף', 'PAGESIZE' ),
+ 'redirect' => array( '0', '#ווייטערפירן', '#הפניה', '#REDIRECT' ),
+ 'notoc' => array( '0', '__קיין_××™× ×”×לט_ט×בעלע__', '__לל×_תוכן_×¢× ×™×™× ×™×__', '__לל×_תוכן__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__קיין_×’×לעריע__', '__לל×_גלריה__', '__NOGALLERY__' ),
+ 'toc' => array( '0', '__××™× ×”×לט__', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__נישט_רעד×קטירן__', '__לל×_עריכה__', '__NOEDITSECTION__' ),
+ 'noheader' => array( '0', '__קיינקעפל__', '__לל×_כותרת__', '__NOHEADER__' ),
+ 'currentday' => array( '1', 'לויפיקער_ט××’', '×™×•× × ×•×›×—×™', 'CURRENTDAY' ),
+ 'numberofpages' => array( '1', 'צ×ל_בלעטער', 'מספר ×“×¤×™× ×›×•×œ×œ', 'מספר דפי×', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'צ×ל_×רטיקלען', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
+ 'pagename' => array( '1', 'בל×טנ×מען', '×©× ×”×“×£', 'PAGENAME' ),
+ 'namespace' => array( '1', '× ×מענטייל', 'מרחב הש×', 'NAMESPACE' ),
+ 'fullpagename' => array( '1', 'פולבל×טנ×מען', '×©× ×”×“×£ המל×', 'FULLPAGENAME' ),
+ 'subpagename' => array( '1', '×ונטערבל×טנ×מען', '×©× ×“×£ המשנה', 'SUBPAGENAME' ),
+ 'talkpagename' => array( '1', 'רעדנבל×טנ×מען', '×©× ×“×£ השיחה', 'TALKPAGENAME' ),
+ 'subst' => array( '0', 'ס:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'קליין', 'ממוזער', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'קליין=$1', 'ממוזער=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'רעכטס', 'ימין', 'right' ),
+ 'img_left' => array( '1', 'לינקס', 'שמ×ל', 'left' ),
+ 'img_none' => array( '1', '×ן', 'לל×', 'none' ),
+ 'img_center' => array( '1', 'צענטער', 'מרכז', 'center', 'centre' ),
+ 'img_sub' => array( '1', '×ונטער', 'תחתי', 'sub' ),
+ 'img_top' => array( '1', '×ויבן', 'למעלה', 'top' ),
+ 'img_bottom' => array( '1', '×ונטן', 'למטה', 'bottom' ),
+ 'img_link' => array( '1', 'לינק=$1', 'קישור=$1', 'link=$1' ),
+ 'img_alt' => array( '1', 'טעקסט=$1', 'טקסט=$1', 'alt=$1' ),
+ 'grammar' => array( '0', 'גר×מ×טיק:', 'דקדוק:', 'GRAMMAR:' ),
+ 'plural' => array( '0', 'מערצ×ל:', 'רבי×:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'פֿולער_× ×מען:', 'כתובת מל××”:', 'FULLURL:' ),
+ 'raw' => array( '0', 'רוי:', '×œ×œ× ×¢×™×‘×•×“:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ווייזן_קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
+ 'language' => array( '0', '#שפר×ך:', '#שפה:', '#LANGUAGE:' ),
+ 'defaultsort' => array( '1', 'גרונטס×רטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'hiddencat' => array( '1', '__ב××”×לטענע_ק×טעג×ריע__', '__ב××”×לטענע_ק×ט__', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
+ 'pagesize' => array( '1', 'בל×טגרייס', 'גודל דף', 'PAGESIZE' ),
+ 'url_wiki' => array( '0', 'וויקי', 'ויקי', 'WIKI' ),
);
$messages = array(
@@ -436,6 +440,7 @@ $1',
פֿ×ר מער ×ינפֿ×רמ×ציע זעט [[Special:Version|ווערסיע בל×ט]].',
'ok' => '×™×Ö¸',
+'backlinksubtitle' => '→ $1',
'retrievedfrom' => 'גענומען פֿון "$1"',
'youhavenewmessages' => '×יר ×”×ט $1 ($2).',
'newmessageslink' => 'נייע מעלדונגען',
@@ -534,21 +539,23 @@ $1',
'badarticleerror' => 'מען קען נישט ט×ן די ×קציע וו×ס ×יר ווילט ×ויף ×“×¢× ×‘×œ×ט.',
'cannotdelete' => 'נישט געווען מעגלעך ×ויסמעקן ×“×¢× ×‘×œ×ט ×דער די טעקע "$1".
קען זיין ××– ד×ס ××™×– שוין געוו×רן ×ויסגעמעקט דורך ×ן ×נדערן.',
+'cannotdelete-title' => 'מען קען נישט ×ויסמעקן בל×ט "$1"',
'badtitle' => 'שלעכט קעפל',
'badtitletext' => "ד×ס קעפל פון ×“×¢× ×’×¢×–×•×›×˜×Ÿ בל×ט ××™×– געווען ×ומגעזעצליך, ליידיג, ×ן ×ינטערשפר×ך ×דער ×ינטערוויקי לינק וו×ס פ×סט נישט, ×דער ×נטה×ט ×›×ר×קטערס וו×ס מ'קען נישט ניצן ×ין × ×§×¢×¤×œ.",
-'perfcached' => "די פ×לגנדע ד×טן זענען גענומען ×¤×•× ×¢× '×–×ַפ×ַס' ×ון מעגלעך נישט ×קטועל.",
-'perfcachedts' => 'די פ×לגנדע ד×טן זענען ×¤×•× ×¢× ×–×ַפ×ַס, וו×ס ××™×– לעצט געוו×רן דערהײַנטיגט $1.',
+'perfcached' => "די פ×לגנדע ד×טן זענען גענומען ×¤×•× ×¢× '×–×ַפ×ַס' ×ון מעגלעך נישט ×קטועל. מ××§×¡×™×ž×•× {{PLURAL:$1|×יין רעזולט×ט ××™×–|$1 רעזולט×טן זענען}} פ×ר×ן ×ין ×–×פ×ס.",
+'perfcachedts' => 'די פ×לגנדע ד×טן זענען ×¤×•× ×¢× ×–×ַפ×ַס, וו×ס ××™×– לעצט געוו×רן דערהײַנטיגט $1. מ××§×¡×™×ž×•× {{PLURAL:$4|×יין רעזולט×ט ××™×–|$4 רעזולט×טן זענען}} פ×ר×ן ×ין ×–×פ×ס',
'querypage-no-updates' => 'דערהיינטיגן ×“×¢× ×‘×œ×ט ××™×– ×יצט ×ומערמעגלעכט.
ד×טן ×“× ×•×•×¢×˜ נישט דערווייל ווערן ב×נייט.',
'wrong_wfQuery_params' => 'די פ×רעמעטערס ×ריינגפיטערט צו wfQuery() זענען נישט ריכטיג:<br />
פֿונקיציע: $1<br />
פֿ×רל×× ×’: $2',
'viewsource' => 'ווײַזן מקור',
-'viewsourcefor' => 'פֿ×ַר $1',
+'viewsource-title' => 'ב×קוקן מקור פֿון $1',
'actionthrottled' => 'די ×ַקציע ××™×– ב×ַגרענעצט',
'actionthrottledtext' => '×לס מ×ָסמיטל קעגן ספ×Ö·×, זענט ×יר ב×ַגרענעצט פֿון דורכפֿירן די פעולה צופֿיל מ×ל ×ין × ×§×•×¨×¦×¢×¨ צײַט. ביטע פרובירט × ××›×ַמ×ָל ×ין × ×¤×ר מינוט.',
'protectedpagetext' => 'דער בל×ט ××™×– פ×רשפ×רט צו ×פה×לטן ענדערונגן.',
'viewsourcetext' => '×יר קענט זען ×ון ק×פירן ×“×¢× ×ž×§×•×¨ פון ×“×¢× ×‘×œ×ַט:',
+'viewyourtext' => "×יר קענט ב×קוקן ×“×¢× ×ž×§×•×¨ פון '''×ייערע רעד×קטירונגען''' צו ×“×¢× ×‘×œ×ט:",
'protectedinterface' => 'דער בל×ַט שטעלט צו ×ינטערפֿייס טעקסט פֿ×ַרן װײכװ×ַרג, ×ון ××™×– פֿ×ַרשפּ×ַרט כּדי צו פֿ×ַרמײַדן ×°×ַנד×ַליז×.',
'editinginterface' => "'''וו×רענונג:''' ×יר ב×Ö·×ַרבעט × ×‘×œ×ט וו×ס ××™×– געניצט צוצושטעלן ×ינטערפֿייס טעקסט פ×ר דער ווייכוו×רג. ענדערונגען ×ין ×“×¢× ×‘×œ×ַט וועלן טוישן די ×ויסזען פון דער ×¡×™×¡×˜×¢× ×ž×•×“×¢×•×ª פ×ר ×לע ×נדערע ב×ניצערס.
פֿ×ַר ×יבערזעצן, ב×ַטר×ַכטס ב×ַניצן [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], דער מעדיעוויקי ל×ק×ַליז×ציע פר×יעקט.",
@@ -654,6 +661,7 @@ $2',
'emailconfirmlink' => 'ב×ַשטעטיקט ×ײַער ×¢-פ×סט ×ַדרעס',
'invalidemailaddress' => 'דער ×¢-פ×סט ×דרעס קען נישט ×קצעפטירט ווערן ווייל ער שיינט צו ×”×בן ×ן ×ומגילטיגן פֿ×רמ×ט.
ביטע ×ריינלייגן × ×’×•×˜-פ×רמ×טירטן ×דרעס ×דער ליידיגט ×ויס ד×ס פֿעלד.',
+'cannotchangeemail' => "מ'קען נישט ענדערן ק×נטע ע־פ×סט ×דרעסן ×ין דער וויקי.",
'accountcreated' => 'די ק×ָנטע ××™×– ב×ַש×ַפֿן',
'accountcreatedtext' => 'די ב×ניצער ק×נטע פ×ר $1 ××™×– ב×ַש×ַפֿן געוו×רן.',
'createaccount-title' => 'ק×נטע ב×ש×פֿן ×ין {{SITENAME}}',
@@ -669,6 +677,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => '×ומב×ַק×ַנט טעות ×ין()mail פֿונקציע פֿון PHP.',
+'user-mail-no-addy' => 'געפרוווט צו שיקן ×¢-פּ×ָסט ×ָן ×ַן ×¢-פּ×ָסט ×ַדרעס.',
# Change password dialog
'resetpass' => 'ענדערן ק×נטע פ×סוו×רט',
@@ -696,6 +705,8 @@ $2',
'passwordreset-pretext' => '{{PLURAL:$1| | קל×ַפט ×ַרײַן ××™×™× ×¢ פֿון די ד×ַטן ×ונטן}}',
'passwordreset-username' => 'ב×ַניצער × ×ָמען:',
'passwordreset-domain' => 'ד×מען:',
+'passwordreset-capture' => 'זען ×“×¢× ×’×¢×©×™×§×˜×Ÿ ע־בריוו?',
+'passwordreset-capture-help' => '×Ö·×– ×יר צייכנט ד×ס קעסטל, וועט מען ווײַזן ×“×¢× ×¢Ö¾×‘×¨×™×•×• (מיטן פר×וויז×רישן פ×ַסוו×רט) צו ×ײַך ווי ×ויך ווערן געשיקט ×¦×•× ×‘×ַניצער.',
'passwordreset-email' => 'בליצפּ×ָסט ×ַדרעס:',
'passwordreset-emailtitle' => 'ק×נטע ×¤×¨×˜×™× ×ין {{SITENAME}}',
'passwordreset-emailtext-ip' => 'עמעצער (×ž×¡×ª×ž× ×יר, פון IP ×דרעס $1) ×”×ט געבעטן × ×“×¢×¨×ž×נונג פון ×ייערע
@@ -721,6 +732,17 @@ $2
פר×וויז×רישער פּ×ַר×ָל: $2',
'passwordreset-emailsent' => "מ'×”×ט געשיקט × ×“×¢×¨×ž×ָנונג ×¢-פּ×ָסט.",
+# Special:ChangeEmail
+'changeemail' => 'ענדערן ×¢-פּ×ָסט ×ַדרעס',
+'changeemail-header' => 'ענדערן ק×נטע ×¢-פּ×ָסט ×ַדרעס',
+'changeemail-text' => 'דערג×ַנצט די פֿ×Ö¸×¨×¢× ×¦×• ענדערן ×ייער ×¢-פּ×ָסט ×ַדרעס. ×יר וועט ד×ַרפֿן ×ַרײַנגעבן ×ײַער פּ×ַר×ָל צו ב×ַשטעטיקן די ענדערונג.',
+'changeemail-no-info' => '×יר ד×ַרפֿט זיין ×ַרײַנל×גירט צוצוקומען גלײַך צו ×“×¢× ×“×ָזיגן בל×ַט.',
+'changeemail-oldemail' => 'קר×ַנטער ×¢-פּ×ָסט ×ַדרעס:',
+'changeemail-newemail' => 'נײַער בליצפּ×ָסט ×ַדרעס:',
+'changeemail-none' => '(קיין)',
+'changeemail-submit' => 'ענדערן ע־פ×סט ×דרעס',
+'changeemail-cancel' => '×ַנולירן',
+
# Edit page toolbar
'bold_sample' => 'דיקער טעקסט',
'bold_tip' => 'דיקער טעקסט',
@@ -788,9 +810,6 @@ $2
×ייער יעצטיגער IP ×דרעס ××™×– $3, ×ון דער בל×ָקירונג־נומער ××™×– #$5.
ביטע צײכנט עס ×ָן בשעת ×יר װענדט זיך צו די סיס×ָפּן.',
'blockednoreason' => 'קיין ×˜×¢× × ×™×©×˜ געגעבן',
-'blockedoriginalsource' => "די טעקסט פון מקור פון '''$1''' ווערט געוויזן ×ונטן:",
-'blockededitsource' => "די טעקסט פון '''×ייערע ענדערונגן''' צו '''$1''' ווערט געוויזן ×ונטן:",
-'whitelistedittitle' => '×ַרײַנל×גירן פֿ×ַרל×ַנגט צו ענדערן',
'whitelistedittext' => '×יר ברויכט צו $1 צו ענדערן בלעטער.',
'confirmedittext' => '×ויף ×ייך ליגט ×§×•×“× ×“×™ פֿליכט צו ב×שטעטיגן ×ייער ע־פ×סט ×דרעס ×יידער ×יר רעד×ַקטירט בלעטער.
ביטע שטעלט ×ון ב×שטעטיגט ×ייער ע־פ×סט ×דרעס דורך ×ייערע [[Special:Preferences|ב×ַניצער פרעפֿערענצן]] .',
@@ -877,7 +896,8 @@ $2
×זוי ×ויך, ×–×גט ×יר צו ××– ×יר ×”×ט ד×ס געשריבן ×ליין, ×דער ד×ס ×יבערק×פירט פון × ×ž×§×•×¨ מיט פולן רשות ד×ס מפקיר זיין (זעט $1 פ×ר מער פרטי×).
'''זיכט נישט ב×ניצן מיט שט××£ וו×ס ××™×– ב×שיצט מיט ק×פירעכטן!'''",
-'longpageerror' => "'''פעילער: די טעקסט וו×ס ×יר ×”×ט ×ריינגעשטעלט ××™×– $1 קיל×בייטס ל×× ×’, וו×ס ××™×– לענגער פון די מ××§×¡×™×ž×•× ×¤×•×Ÿ $2 קיל×בייטס. עס קען נישט ווערן ×פגעהיטן.'''",
+'longpageerror' => "'''פעלער: דער טעקסט וו×ס ×יר ×”×ט ×רײַנגעשטעלט ××™×– ל×× ×’ {{PLURAL:$1|×יין קיל×בייט|$1 קיל×בייטן}}, וו×ס ××™×– לענגער פון ×“×¢× ×ž××§×¡×™×ž×•× ×¤×•×Ÿ {{PLURAL:$2|×יין קיל×בייט|$2 קיל×בייטן}}.
+ער קען נישט ווערן ×פגעהיטן.'''",
'readonlywarning' => "'''וו×רענונג: די ד×טעב××–×¢ ××™×– געוו×רן פ×רשל×סן פ×ר סייט ×ויפה×לטונג,
×ž×ž×™×œ× ×•×•×¢×˜ ×יר נישט קענען ×פהיטן ×ייערע ענדערונגען ×צינד. ×יר קענט ק×פירן ×ון ×רײַנלייגן ×“×¢× ×˜×¢×§×¡×˜ ×ריין צו × ×˜×¢×§×¡×˜ טעקע ×ון ד×ס ד×רטן ×פהיטן פ×ר שפעטער.'''
@@ -1042,8 +1062,6 @@ $2
'revdelete-unsuppress' => 'טוה ×פ ב×גרענעצונגן ×ין גענדערטע רעוויזיעס',
'revdelete-log' => '×ורז×ַך:',
'revdelete-submit' => 'צושטעלן צו {{PLURAL:$1|סעלעקטירטער רעוויזיע| סעלעקטירטע רעוויזיעס}}',
-'revdelete-logentry' => 'געענדרט רעוויזיע זעב×רקייט פון [[$1]]',
-'logdelete-logentry' => 'געענדרט פ×סירונג זעב×רקייט פון [[$1]]',
'revdelete-success' => "'''רעוויזיע זעב×ַרקייט דערפֿ×לגרייך דערהײַנטיקט.'''",
'revdelete-failure' => "'''נישט מעגלעך צו דערהײַנטיקן רעוויזיע זעב×ַרקייט:'''
$1",
@@ -1055,15 +1073,6 @@ $1",
'revdel-restore-visible' => 'זעב×ַרע ווערסיעס',
'pagehist' => 'בל×ט היסט×ריע',
'deletedhist' => '×ויסגעמעקטע ווערסיעס',
-'revdelete-content' => '××™× ×”×לט',
-'revdelete-summary' => 'רעד×קטירונג קיצור',
-'revdelete-uname' => 'ב×ניצער × ×מען',
-'revdelete-restricted' => 'פ×רמערט ב×גרעניצונגען פ×ר סיס×פן',
-'revdelete-unrestricted' => '×וועקגענומען ב×גרעניצונגען פ×ר סיס×פן',
-'revdelete-hid' => 'ב××”×לטן $1',
-'revdelete-unhid' => 'מבטל געווען ב××”×לטן $1',
-'revdelete-log-message' => '$1 פֿ×ר {{PLURAL:$2|×יין רעוויזיע|$2 רעוויזיעס}}',
-'logdelete-log-message' => '$1 פֿ×ר {{PLURAL:$2|×יין פ×סירונג|$2 פ×סירונגען}}',
'revdelete-hide-current' => 'פֿעלער ×‘×²Ö·× ×‘×Ö·×”×ַלטן ×“×¢× ×יינהייט פֿון $2, $1: ד×ָס ××™×– די לויפֿיגע ווערסיע.
מען קען ×–×™ נישט פֿ×ַרב×ָרגן.',
'revdelete-show-no-access' => 'פֿעלער ×‘×²Ö·× ×•×•×™×™Ö·×–×Ÿ ×“×¢× ×יינהייט פֿון $2 , $1 : דער ×יינהייט ××™×– ×ָנגעצייכנט געוו×רן "ב×ַשרענקט".
@@ -1219,12 +1228,14 @@ $1",
'prefs-rc' => 'לעצטע ענדערונגען',
'prefs-watchlist' => '×ויפפ×סונג ליסטע',
'prefs-watchlist-days' => 'טעג צו ווייזן ×ין דער ×ויפפ×סונג ליסטע:',
-'prefs-watchlist-days-max' => 'העכסטן 7 טעג',
+'prefs-watchlist-days-max' => 'העכסטן $1 {{PLURAL:$1|ט××’|טעג}}',
'prefs-watchlist-edits' => 'מ×Ö·×§×¡×™×ž×•× × ×•×ž×¢×¨ פון נײַע ענדערונגען צו ווייַזן ×ין פֿ×ַרברייטערטער ×ויפֿפ×ַסונג ליסטע:',
'prefs-watchlist-edits-max' => 'מ×Ö·×§×¡×™×ž×•× × ×•×ž×¢×¨: 1000',
'prefs-watchlist-token' => '×ויפֿפ×ַסונג ליסטע סימן:',
'prefs-misc' => 'פֿ×ַרשידנס',
'prefs-resetpass' => 'טוישן פ×ַסוו×רט',
+'prefs-changeemail' => 'ענדערן ע־פ×סט ×דרעס',
+'prefs-setemail' => 'שטעלן ×ַן ×¢-פּ×ָסט ×ַדרעס',
'prefs-email' => 'ע־פ×סט ×פציעס',
'prefs-rendering' => '×ויסזען',
'saveprefs' => '×ויפֿהיטן',
@@ -1281,6 +1292,7 @@ $1",
'yourrealname' => 'עכטער × ×מען *:',
'yourlanguage' => 'שפּר×ַך:',
'yourvariant' => '××™× ×”×ַלט שפּר×ַך וו×ַרי×ַנט:',
+'prefs-help-variant' => '×ײַער פרעפֿערירטער וו×ַרי×ַנט ×דער ×רט×גר×ַפֿיע צו צייגן די ××™× ×”×ַלט בלעטער פֿון דער וויקי.',
'yournick' => 'חתימה:',
'prefs-help-signature' => 'ב×ַמערקונגען ×ויף רעדן בלעטער ×–×ָלן זיין ×ונטערגעשריבן מיט "<nowiki> ~ ~ ~ ~ </nowiki>" וו×ָס וועט ווערן פֿ×ַרוו×ַנדלט ×ין ×ײַער חתימה מיט × ×¦×²Ö·×˜×©×˜×¢×ž×¤×œ.',
'badsig' => 'נישט גילטיקער רויער ×ונטערשריפט. ביטע ק×נטר×לירט די HTML ט×ַגן.',
@@ -1320,7 +1332,7 @@ $1",
'userrights-lookup-user' => 'פֿ×ַרוו×ַלטן ב×ניצער גרופעס',
'userrights-user-editname' => 'לייגט ×ריין × ×‘×נוצער-× ×מען:',
'editusergroup' => 'רעד×ַגירן ב×ַניצער גרופּעס',
-'editinguser' => "ענדערן ב×ַניצער רעכטן פון ב×ַניצער '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "ענדערן ב×ַניצער רעכטן פון ב×ַניצער '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'רעד×ַקטירן ב×ַניצער גרופעס',
'saveusergroups' => '×ָפהיטן ב×ַניצער גרופעס',
'userrights-groupsmember' => 'מיטגליד פון:',
@@ -1408,12 +1420,12 @@ $1",
'right-autopatrol' => '××™×™×’×¢× ×¢ ב×Ö·×ַרבעטונגען ×ויט×מ×ַטיש מ×ַרקירט ווי ק×נטר×לירט',
'right-patrolmarks' => 'ב×ַקוקן לעצטע ענדערונגען פּ×ַטר×ָל מ×ַרקירונגען',
'right-unwatchedpages' => 'ב×ַקוקן די ליסטע פֿון נישט ×ויפֿגעפ×ַסטע בלעטער',
-'right-trackback' => '×ַרײַנגעבן × ×˜×¨×¢×§×‘×¢×§',
'right-mergehistory' => 'צונויפֿגיסן די היסט×ריע פֿון בלעטער',
'right-userrights' => 'רעד×ַקטירן ×לע ב×ַניצער רעכטן',
'right-userrights-interwiki' => 'רעד×ַקטירן ב×ַניצער רעכטן פֿון ב×ַניצער ×ויף ×נדערע וויקיס',
'right-siteadmin' => 'פ×רשליס ×ון שליס-×ויף די ד×טעב××–×¢',
'right-sendemail' => 'שיקן ×¢-פ×סט צו ×נדערע ב×ניצער',
+'right-passwordreset' => 'ב×ַקוקן פ×ַסוו×רט צוריקשטעלן ע־בריוו',
# User rights log
'rightslog' => 'ב×ַניצער רעכטן ל××’',
@@ -1450,11 +1462,11 @@ $1",
'action-patrol' => "×נצייכענען ×נדערס' רעד×קטירונגן ×לס × ×כגעקוקט",
'action-autopatrol' => '×נצוצייכענען ×ייערע רעד×קטירונגן ×לס ×יבערגעקוקטע',
'action-unwatchedpages' => 'זען די ליסטע פון נישט ×ויפֿגעפ×ַסטע בלעטער',
-'action-trackback' => '×ַרײַנגעבן × ×˜×¨×¢×§×‘×¢×§',
'action-mergehistory' => 'צונויפֿגיסן די היסט×ריע פֿון ×“×¢× ×‘×œ×ַט',
'action-userrights' => 'רעד×ַקטירן ×לע ב×ַניצער רעכטן',
'action-userrights-interwiki' => 'רעד×ַקטירן רעכטן פון ב×ַניצער ×ויף ×ַנדערע וויקיס',
'action-siteadmin' => 'שליסן ×דער ×ויפשליסן די ד×טנב××–×¢',
+'action-sendemail' => 'שיקן ע־פ×סט',
# Recent changes
'nchanges' => '{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}',
@@ -1536,6 +1548,7 @@ $1",
'minlength1' => '× ×˜×¢×§×¢ × ×מען מוז ×”×בן ×›×טש ×יין ×ות.',
'illegalfilename' => 'דער טעקע־נ×ָמען "$1" ×ַנטה×ַלט ×›×ַר×ַקטערס וו×ָס זענען נישט ערלויבט ×ין בל×ַט טיטלען.
ביטע גיט דער טעקע × × ×²Ö·×¢× × ×מען ×ון פּרובירט ×רויפֿל×ָדן × ××›×ַמ×ָל.',
+'filename-toolong' => 'טעקע נעמען קען נישט זײַן לענגער ווי 240 בייטן.',
'badfilename' => 'טעקע × ×מען ××™×– געטוישט צו "$1".',
'filetype-missing' => 'די טעקע ×”×ט נישט קיין פ×רברייטערונג (למשל ".jpg").',
'empty-file' => 'די טעקע וו×ָס ×יר ×”×ט ×ײַנגעגעבן ××™×– ליידיג.',
@@ -1601,6 +1614,20 @@ $1",
'upload-unknown-size' => '×ומוויסנדע גרייס',
'upload-http-error' => '× HTTP גרײַז ×”×ט פ×ַסירט: $1',
+# File backend
+'backend-fail-alreadyexists' => 'די טעקע $1 עקזיסטירט שוין.',
+'backend-fail-store' => "מ'קען נישט שפייכלערן טעקע $1 בײַ $2.",
+'backend-fail-copy' => '×”×ט נישט געקענט ק×פירן "$1" צו "$2".',
+'backend-fail-move' => '×”×ט נישט געקענט ב×וועגן "$1" צו "$2".',
+'backend-fail-opentemp' => 'קען נישט עפֿענען צייַטווייַליקע טעקע.',
+'backend-fail-writetemp' => 'קען נישט שרײַבן צו צייַטווייַליקער טעקע.',
+'backend-fail-closetemp' => 'קען נישט שליסן צייַטווייַליקע טעקע.',
+'backend-fail-read' => 'קען נישט ליינען טעקע "$1".',
+'backend-fail-create' => 'קען נישט ש×פֿן טעקע "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'מ\'קען נישט ×ויפֿשליסן "$1"; ער ××™×– נישט פֿ×רשל×סן.',
+
# Special:UploadStash
'uploadstash' => '×ַרויפֿל×ָד רעזערוו',
'uploadstash-refresh' => 'דערפֿרישן די רשימה פון טעקעס',
@@ -1693,21 +1720,22 @@ $1",
'filerevert-success' => "'''[[Media:$1|$1]]''' צוריקגשטעלט צו דער [$4 ווערסיע פֿון $3, $2].",
# File deletion
-'filedelete' => 'מעק ×ויס $1',
-'filedelete-legend' => 'מעק ×ויס טעקע',
-'filedelete-intro' => "×יר ×”×ַלט בײַ ×ויסמעקן די טעקע '''[[Media:$1|$1]]''' צוז×ַמען מיט ×’×ָר ×יר היסט×ריע.",
-'filedelete-intro-old' => "×יר מעקט ×ויס די ווערסיע פֿון '''[[Media:$1|$1]]''' פֿון [$4 $3, $2].",
-'filedelete-comment' => '×ורז×ַך:',
-'filedelete-submit' => '×ויסמעקן',
-'filedelete-success' => "'''$1''' ××™×– געווען ×ויסגעמעקט.",
-'filedelete-success-old' => "די ווערסיע פֿון '''[[Media:$1|$1]]''' פֿון $3, $2 ××™×– געוו×רן ×ויסגעמעקט.",
-'filedelete-nofile' => "'''$1''' עקזיסטירט נישט.",
-'filedelete-otherreason' => '×נדער/× ×ך × ×¡×™×‘×”:',
-'filedelete-reason-otherlist' => '×ַנדער ×ורז×ַך',
-'filedelete-reason-dropdown' => '*×ַלגעמיינע ×ויסמעקן סיבות
+'filedelete' => 'מעק ×ויס $1',
+'filedelete-legend' => 'מעק ×ויס טעקע',
+'filedelete-intro' => "×יר ×”×ַלט בײַ ×ויסמעקן די טעקע '''[[Media:$1|$1]]''' צוז×ַמען מיט ×’×ָר ×יר היסט×ריע.",
+'filedelete-intro-old' => "×יר מעקט ×ויס די ווערסיע פֿון '''[[Media:$1|$1]]''' פֿון [$4 $3, $2].",
+'filedelete-comment' => '×ורז×ַך:',
+'filedelete-submit' => '×ויסמעקן',
+'filedelete-success' => "'''$1''' ××™×– געווען ×ויסגעמעקט.",
+'filedelete-success-old' => "די ווערסיע פֿון '''[[Media:$1|$1]]''' פֿון $3, $2 ××™×– געוו×רן ×ויסגעמעקט.",
+'filedelete-nofile' => "'''$1''' עקזיסטירט נישט.",
+'filedelete-otherreason' => '×נדער/× ×ך × ×¡×™×‘×”:',
+'filedelete-reason-otherlist' => '×ַנדער ×ורז×ַך',
+'filedelete-reason-dropdown' => '*×ַלגעמיינע ×ויסמעקן סיבות
** ק×פירעכט פֿ×ַרלעצונג
** דופליק×ַט',
-'filedelete-edit-reasonlist' => 'רעד×ַקטירן ×ויסמעקן סיבות',
+'filedelete-edit-reasonlist' => 'רעד×ַקטירן ×ויסמעקן סיבות',
+'filedelete-maintenance-title' => 'מען קען נישט ×ויסמעקן די טעקע',
# MIME search
'mimesearch' => 'זוך MIME',
@@ -1825,7 +1853,7 @@ $1",
'listusers-editsonly' => 'ווייזן × ×ר ב×ניצערס מיט רעד×קטירונגען',
'listusers-creationsort' => 'ס×רטירן לויט דער ש×ַפן ד×ַטע',
'usereditcount' => '{{PLURAL:$1|רעד×ַקטירונג|$1 רעד×ַקטירונגען}}',
-'usercreated' => 'געש×ַפֿן ××•× $2, $1',
+'usercreated' => '{{GENDER:$3|געש×ַפֿן}} ××•× $2, $1',
'newpages' => 'נייע בלעטער',
'newpages-username' => 'ב×ַניצער × ×ָמען:',
'ancientpages' => 'עלטסטע בלעטער',
@@ -1914,12 +1942,8 @@ $1",
'activeusers-noresult' => 'קיין ב×ניצער נישט געטר×פֿן.',
# Special:Log/newusers
-'newuserlogpage' => '× ×™×™×¢ ב×ַניצערס ל×ָג-בוך',
-'newuserlogpagetext' => 'ד×ס ××™×– × ×œ××’ פון ב×ַניצערס ×ײַנשרײַבונגען.',
-'newuserlog-byemail' => 'פ×ַסוו×רט געשיקט דורך ×¢-פ×סט',
-'newuserlog-create-entry' => 'נײַער ב×ניצער',
-'newuserlog-create2-entry' => 'געש×פֿן נײַע ק×נטע $1',
-'newuserlog-autocreate-entry' => 'ק×נטע ב×ַש×ַפֿן ×ויט×מ×ַטיש',
+'newuserlogpage' => '× ×™×™×¢ ב×ַניצערס ל×ָג-בוך',
+'newuserlogpagetext' => 'ד×ס ××™×– × ×œ××’ פון ב×ַניצערס ×ײַנשרײַבונגען.',
# Special:ListGroupRights
'listgrouprights' => 'ב×ַניצער גרופע רעכטן',
@@ -1948,7 +1972,7 @@ $1",
'emailpagetext' => '×יר קענט ניצן ×“×¢× ×¤Ö¿××¨×¢× ×ונטן צו שיקן ×ן בליצבריוו צו ×“×¢× ×“×זיגן ב×ַניצער.
דער ×¢-פ×סט ×דרעס וו×ס ×יר ×”×ט ×ריינגעלייגט ×ין [[Special:Preferences| ×ייערע ב×ניצער פרעפערנעצן]] וועט זיך ווייזן ×›×ילו ד×ס ××™×– געקומען פון ד×רטן, בכדי צו דערמעגלעכן × ×ª×©×•×‘×”.',
'usermailererror' => 'בליצבריוו ×”×ט צוריקגעשיקט × ×˜×¢×•×ª:',
-'defemailsubject' => '×¢-פ×סט {{SITENAME}}',
+'defemailsubject' => '×¢-פ×סט פון ב×ַניצער "$1" {{SITENAME}}',
'usermaildisabled' => 'ב×ַניצער ע־פ×סט ×ומ×ַקטיוויזירט',
'usermaildisabledtext' => '×יר קענט נישט שיקן ע־פ×סט צו ×נדערע ב×ַניצערס ×ויף דער ד×ָזיקער וויקי',
'noemailtitle' => '× ×™×©×˜× ×§×™×™×Ÿ ××™-מעיל ×דרעס',
@@ -2004,7 +2028,7 @@ $1",
'watchmethod-list' => 'ק×נטר×לירן בלעטער ×ין ×ַכטגעבן־ליסטע פֿ×ַר נײַע רעד×ַקטירונגען',
'watchlistcontains' => '×ייער ×ויפֿפ×סונג ליסטע ×נטה×לט {{PLURAL:$1|×יין בל×ט|$1 בלעטער}}.',
'iteminvalidname' => "פּר×Ö¸×‘×œ×¢× ×ž×™×˜ '$1', ×ומגילטיקער × ×ָמען ...",
-'wlnote' => "×ונטן {{PLURAL:$1|××™×– די לעצטע ענדערונג|זענען די לעצטע '''$1''' ענדערונגען}} ×ין {{PLURAL:$2|דער לעצטער שעה|די לעצטע '''$2''' שעה'ן}}.",
+'wlnote' => "×ונטן {{PLURAL:$1|××™×– די לעצטע ענדערונג|זענען די לעצטע '''$1''' ענדערונגען}} ×ין {{PLURAL:$2|דער לעצטער שעה|די לעצטע '''$2''' שעה'ן}} ביז $3, $4.",
'wlshowlast' => "(ווײַזן די לעצטע $1 שעה'ן | $2 טעג | $3)",
'watchlist-options' => '×ויפֿפ×ַסן ליסטע ברירות',
@@ -2058,7 +2082,6 @@ $UNWATCHURL
'exbeforeblank' => '××™× ×”×ַלט בעפֿ×ַרן ×ויסליידיגן ××™×– געווען: "$1"',
'exblank' => 'בל×ט ××™×– געווען ליידיג',
'delete-confirm' => '×ויסמעקן $1',
-'delete-backlink' => '→ $1',
'delete-legend' => '×ויסמעקן',
'historywarning' => '×כטונג – ×יר גייט ×ויסמעקן × ×‘×œ×ט וו×ָס ×”×ט × ×”×™×¡×˜×ריע מיט $1 {{PLURAL:$1|ווערסיע|ווערסיעס}}:',
'confirmdeletetext' => '×יר גייט ×יצט ×ויסמעקן × ×‘×œ×ט צוז×ַמען מיט זײַן ×’×נצע היסט×ריע.
@@ -2068,8 +2091,6 @@ $UNWATCHURL
'actionfailed' => '×קציע דורכגעפ×לן',
'deletedtext' => '"$1" ×ויסגעמעקט.
זעט $2 פֿ×ַר × ×¨×©×™×ž×” פֿון לעצטיגע ×ויסמעקונגען.',
-'deletedarticle' => '×ויסגעמעקט "[[$1]]"',
-'suppressedarticle' => 'ב×Ö·×”×ַלטן "[[$1]]"',
'dellogpage' => '×ויסמעקונג ל××’',
'dellogpagetext' => 'ווייטער ××™×– × ×œ×™×¡×˜×¢ פון די מערסט לעצטיגע ×ויסמעקונגען.',
'deletionlog' => '×ויסמעקונג ל××’',
@@ -2114,6 +2135,8 @@ $UNWATCHURL
'movedarticleprotection' => 'ב×וועגט די שיץ ב×שטימונגען פֿון "[[$2]]" ×ויף "[[$1]]"',
'protect-title' => 'ענדערן שיץ × ×™×•×•× ×¤Ö¿×ַר "$1"',
'prot_1movedto2' => '[[$1]] ×ריבערגעפירט צו [[$2]]',
+'protect-badnamespace-title' => '×ומשיצב×רער × ×מענטייל',
+'protect-badnamespace-text' => 'בלעטער ×ין ×“×¢× × ×מענטייל קען מען נישט שיצן.',
'protect-legend' => 'ב×ַשטעטיגן שיץ',
'protectcomment' => '×ורז×ַך:',
'protectexpiry' => 'גייט ×ויס:',
@@ -2134,6 +2157,7 @@ $UNWATCHURL
'protect-level-sysop' => '× ×ר סיס×פן',
'protect-summary-cascade' => 'ק×סק×דירן',
'protect-expiring' => 'גייט ×ויס $1 (UTC)',
+'protect-expiring-local' => 'ל×זט ×ויס $1',
'protect-expiry-indefinite' => '×ומב×ַשטימט',
'protect-cascade' => 'שיץ בלעטער ×יינגעשל×סן ×ין ×“×¢× ×‘×œ×ט (ק×סק×ד שיץ)',
'protect-cantedit' => '×יר קען נישט ענדערן די שוץ ניוו×ען פֿון ×“×¢× ×‘×œ×ט, ווײַל ×יר ×”×ט נישט קיין רשות צו רעד×קטירן ××™×.',
@@ -2192,7 +2216,6 @@ $UNWATCHURL
'undeletereset' => 'צוריקשטעלן',
'undeleteinvert' => '×יבערקערן ×“×¢× ×ויסקלויב',
'undeletecomment' => '×ורז×ַך:',
-'undeletedarticle' => 'צוריק געשטעלט "[[$1]]"',
'undeletedrevisions' => '{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} צוריקגעשטעלט',
'undeletedrevisions-files' => '{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} ×ון {{PLURAL:$2|1 טעקע|$2 טעקעס}} צוריקגעשטעלט',
'undeletedfiles' => '{{PLURAL:$1|1 טעקע|$1 טעקעס}} צוריקגעשטעלט',
@@ -2201,6 +2224,7 @@ $UNWATCHURL
זעט ×“×¢× [[Special:Log/delete| ×ויסמעקן ל××’]] פֿ×ר × ×œ×™×¡×˜×¢ פון די לעצטע ×ויסגעמעקטע ×ון צוריקגעשטעלטע בלעטער.",
'undelete-header' => 'זעט [[Special:Log/delete|×“×¢× ×ויסמעקונג זשורנ×ַל]] פֿ×ַר בלעטער וו×ָס זענען לעצטנס געוו×רן ×ויסגעמעקט recently deleted pages.',
+'undelete-search-title' => 'זוכן ×ויסגעמעקטע בלעטער',
'undelete-search-box' => 'זוכן ×ויסגעמעקטע בלעטער',
'undelete-search-prefix' => 'ווײַז בלעטער וו×ס הייבן ×ן מיט:',
'undelete-search-submit' => 'זוכן',
@@ -2350,6 +2374,7 @@ $1',
'unblocklink' => 'ב×ַפֿרײַען',
'change-blocklink' => 'ענדערן בל×ק',
'contribslink' => 'ב×ַניצערס בײַשטײַערונגען',
+'emaillink' => 'שיקן ע־פ×סט',
'autoblocker' => 'דו ביסט געבל×קט ×ט×מ×טיק ווייל דו טיילסט זיך די IP ×דרעס מיט [[User:$1|$1]]. דער סיבה וו×ס ××™×– ×נגעבען געוו×רן [[User:$1|$1]] ××™×–: "$2".',
'blocklogpage' => 'בל×קירן ל××’',
'blocklog-showlog' => '{{GENDER:$1|דער ב×ַניצער|די ב×ַניצערין}} ××™×– שוין געוו×רן פֿ×ַרשפ×ַרט ×ַמ×ָל.
@@ -2460,9 +2485,6 @@ $1',
'movepage-page-exists' => "דער בל×ַט $1 עקזיסטירט שוין ×ון מ'קען ××™× × ×™×©×˜ ×ויט×ָמ×ַטיש ×יבערשרײַבן.",
'movepage-page-moved' => 'דער בל×ַט $1 ××™×– געוורן ב×ַוועגט צו $2.',
'movepage-page-unmoved' => 'מען קען נישט ב×וועגן בל×ט $1 צו $2.',
-'1movedto2' => '[[$1]] ×ריבערגעפירט צו [[$2]]',
-'1movedto2_redir' => '[[$1]] ××™×– ×ַריבער צו [[$2]] ×ַנטשט×ָט × ×•×•×²Ö·×˜×¢×¨×¤Ö¿×™×¨×•× ×’',
-'move-redirect-suppressed' => 'ווײַטערפֿירונג פֿ×ַרשטיקט',
'movelogpage' => 'ב×וועגן ל××’',
'movelogpagetext' => 'פֿ×לגנד ××™×– × ×œ×™×¡×˜×¢ פֿון בלעטער ב×וועגט.',
'movesubpage' => '{{PLURAL:$1|×ונטערבל×ַט|×ונטערבלעטער}}',
@@ -2475,7 +2497,7 @@ $1',
דער ציל בל×ַט "[[:$1]]" עקזיסטירט שוין.
צי ווילט ×יר ××™× ×ויסמעקן כדי צו ערמעגליכן די ב×וועגונג?',
'delete_and_move_confirm' => '×™×, מעק ×ויס ×“×¢× ×‘×œ×ט',
-'delete_and_move_reason' => '×ויסמעקן כדי צו קענען ב×וועגן',
+'delete_and_move_reason' => '×ויסגעמעקט כדי צו קענען ב×וועגן פֿון "[[$1]]"',
'selfmove' => 'מקור ×ון ציל קעפלעך זענען גלײַך; מען קען נישט ב×וועגן × ×‘×œ×ט צו זיך זעלבסט.',
'immobile-source-namespace' => 'נישט מעגלעך צו ב×וועגן בלעטער ×ין × ×מענטייל "$1"',
'immobile-target-namespace' => 'מען קען נישט ב×ַוועגן בלעטער ×¦×•× × ×מענטייל "$1"',
@@ -2711,9 +2733,6 @@ $1',
# Patrol log
'patrol-log-page' => 'פ×טר×לירן ל××’-בוך',
'patrol-log-header' => 'ד×ס ××™×– × ×œ××’-בוך פון פ×ַטר×ליטע רעוויזיעס.',
-'patrol-log-line' => 'געצייכנט $1 פון בל×ט $2 ווי פ×ַטר×לירט $3',
-'patrol-log-auto' => '(×ויט×מ×ַטיש)',
-'patrol-log-diff' => 'רעוויזיע $1',
'log-show-hide-patrol' => '$1 פ×ַטר×לירן ל××’-בוך',
# Image deletion
@@ -2735,7 +2754,7 @@ $1',
'widthheightpage' => '$1 × $2, {{PLURAL:$3|×יין בל×ט|$3 בלעטער}}',
'file-info' => 'טעקע גרייס: $1, MIME טיפ: $2',
'file-info-size' => '$1 × $2 פיקסעל, טעקע גרייס: $3, טיפ MIME: $4',
-'file-nohires' => '<small>× ×™×©×˜× ×ž×™×˜ × ×”×¢×›×¢×¨×¢ רעז×לוציע.</small>',
+'file-nohires' => '× ×™×©×˜× ×ž×™×˜ × ×”×¢×›×¢×¨×¢ רעז×לוציע.',
'svg-long-desc' => 'טעקע SVG, × ×מינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3',
'show-big-image' => 'בילד מיט דער גרעסטער רעז×לוציע',
'show-big-image-size' => '$1 × $2 פיקצעלן',
@@ -3072,9 +3091,6 @@ $5
'scarytranscludedisabled' => '[×ינטערוויקי ×ריבערשליסן ××™×– ×ַנולירט]',
'scarytranscludetoolong' => '[URL צו ל×× ×’]',
-# Trackbacks
-'trackbackremove' => '([$1 ×ויסמעקן])',
-
# Delete conflict
'deletedwhileediting' => 'וו×רענונג: דער בל×ט ××™×– געוו×רן ×ויסגעמעקט × ××›×“×¢× ×•×•×ס ×יר ×”×ט ×נגעהויבן רעד×קטירן!',
'confirmrecreate' => "ב×נוצער [[User:$1|$1]] ([[User talk:$1|רעדן]]) ×”×ט ×ויסגעמעקט ×“×¢× ×‘×œ×ט × ××›×“×¢× ×•×•×ס ×יר ×”×ט ×נגעהויבן ד×ס צו ענדערן, ×לס ×נגעבליכער סיבה:
@@ -3271,4 +3287,54 @@ $5
'sqlite-has-fts' => '$1 מיט פולן-טעקסט זוכן שטיץ',
'sqlite-no-fts' => '$1 ×ָן פֿולן-טעקסט זוכן שטיץ',
+# New logging system
+'revdelete-restricted' => 'פ×רמערט ב×גרעניצונגען פ×ר סיס×פן',
+'revdelete-unrestricted' => '×וועקגענומען ב×גרעניצונגען פ×ר סיס×פן',
+'newuserlog-byemail' => 'פ×ַסוו×רט געשיקט דורך ×¢-פ×סט',
+
+# Feedback
+'feedback-subject' => 'טעמע:',
+'feedback-message' => 'מעלדונג:',
+'feedback-cancel' => '×ַנולירן',
+'feedback-submit' => '×רײַנגעבן פֿידבעק',
+'feedback-adding' => 'צולייגן פֿידבעק צו בל×ַט...',
+'feedback-error1' => 'טעות: ×ומב×ַק×ַנטער רעזולט×ַט פון API',
+'feedback-error2' => 'טעות: רעד×ַקטירן דורכפֿ×ַל',
+'feedback-error3' => 'טעות: קיין ענטפ\\ער פון API',
+
+# API errors
+'api-error-badaccess-groups' => '×יר ×”×ט נישט קיין רעכטן ×ַרויפֿל×ָדן טעקעס ×ויף דער וויקי.',
+'api-error-badtoken' => '×ינערלעכער גרײַז: סימן טויג נישט.',
+'api-error-copyuploaddisabled' => '×ַרויפֿל×ָדן דורך URL ××™×– ×ומ×ַקטיווירט ×ויף ×“×¢× ×¡×¢×¨×•×•×™×¨×¢×¨.',
+'api-error-duplicate' => 'שוין ד×Ö¸ ×ין דער וויקי {{PLURAL:$1|[$2 Ö¸×ַן ×ַנדער טעקע]|[$2 ×ַנדערע טעקעס]}} מיטן זעלבן תוכן.',
+'api-error-duplicate-archive' => "ס'××™×– שוין געווען {{PLURAL:$1| [ $2 ×ַן ×ַנדער טעקע] | געווען [ $2 עטלעכע ×ַנדערע טעקעס]}} ×ויף ×“×¢× ×¤Ö¼×œ×Ö·×¥ מיט ×“×¢× ×–×¢×œ×‘×™×§×Ÿ תוכן, ×ָבער {{PLURAL:$1| עס ××™×– | ×–×™×™ זענען}} געוו×רן ×ויסגעמעקט.",
+'api-error-duplicate-archive-popup-title' => 'פֿ×ַרט×פלטע {{PLURAL:$1| טעקע | טעקעס}} וו×ָס זענען שוין געוו×רן ×ויסגעמעקט',
+'api-error-duplicate-popup-title' => 'פֿ×ַרט×פלטע {{PLURAL:$1| טעקע | טעקעס}}',
+'api-error-empty-file' => 'די טעקע וו×ָס ×יר ×”×ט ×ײַנגעגעבן ××™×– ליידיג.',
+'api-error-fetchfileerror' => '×ינערלעכער גרײַז: עפעס ××™×– ק×ַליע געוו×רן ×‘×²Ö·× ×‘×¨×¢× ×’×¢×Ÿ די טעקע.',
+'api-error-file-too-large' => 'די טעקע וו×ָס ×יר ×”×ט ×ײַנגעגעבן ××™×– צו גרויס.',
+'api-error-filename-tooshort' => 'דער טעקע־נ×ָמען ××™×– צו קורץ.',
+'api-error-filetype-banned' => 'דער טיפ טעקע ××™×– ×’×¢×ַסרט.',
+'api-error-filetype-missing' => 'די טעקע פֿעלט ×ַן ענדונג.',
+'api-error-http' => '×ינערלעכער גרײַז: נישט געקענט פֿ×ַרבינדן ×¦×•× ×¡×¢×¨×•×•×™×¨×¢×¨.',
+'api-error-illegal-filename' => 'דער טעקע־נ×ָמען ××™×– נישט ערלויבט.',
+'api-error-internal-error' => '×ינערלעכער גרײַז: עפעס ××™×– ק×ַליע געוו×רן ×‘×²Ö·× ×¤×¨×צעסירן ×ײַער ×ַרופֿל×ָד ×ויף דער וויקי.',
+'api-error-invalid-file-key' => '×ינערלעכער גרײַז: נישט געטר×פֿן טעקע ×ין צײַטווײַליקן שפייכלער',
+'api-error-missingparam' => '×ינערלעכער גרײַז: פֿעלן פ×ר×מעטערס ×ין פֿ×ַרל×Ö·× ×’',
+'api-error-missingresult' => '×ינערלעכער גרײַז: נישט געקענט פֿעסטשטעלן צי ק×פירן ××™×– געווען דערפֿ×לגרייך.',
+'api-error-mustbeloggedin' => '×יר ד×רפֿט זײַן ×ַרײַנל×גירט ×ַרויפֿצול×ָדן טעקעס.',
+'api-error-mustbeposted' => '×ינערלעכער גרײַז: פֿ×ַרל×Ö·× ×’ פֿ×דערט HTTP POST.',
+'api-error-noimageinfo' => 'דער ×ַרויפֿל×ָד ××™×– געווען דערפֿ×לגרײַך, ×ָבער דער סערווירער ×”×ט נישט געגעבן ×ונדז קיין ×ינפֿ×ָרמ×ַציע וועגן דער טעקע.',
+'api-error-nomodule' => '×ינערלעכער גרײַז: קיין ×רויפֿל×ָדן מ×ָדול נישט געשטעלט.',
+'api-error-ok-but-empty' => '×ינערלעכער גרײַז: קיין ענטפֿער פֿון סערווירער.',
+'api-error-overwrite' => 'מען ט×ָר נישט ×יבערשרײַבן ×ַן עקזיסטירנדע טעקע.',
+'api-error-stashfailed' => '×ינערלעכער גרײַז: סערווירער ×”×ט נישט געקענט ×ײַנשפייכלערן צייַטווייַליקע טעקע.',
+'api-error-timeout' => 'דער סערווירער ×”×ט ניט געענטפֿערט ×ינערה×ַלב דער דערוו×ַרטעטער צייַט.',
+'api-error-unclassified' => '×ַן ×ומב×ַק×ַנט טעות ××™×– פֿ×רגעקומען.',
+'api-error-unknown-code' => '×ומב×ַק×ַנט טעות: " $1 "',
+'api-error-unknown-error' => '×ינערלעכער גרײַז: עפעס ××™×– ק×ַליע געוו×רן ×‘×²Ö·× ×ַרויפֿל×ָדן ×ײַער טעקע.',
+'api-error-unknown-warning' => '×ומב×ַק×ַנטע וו×רענונג: $1',
+'api-error-uploaddisabled' => '×רויפֿל×ָדן ××™×– ×ומ×ַקטיווירט ×ויף דער וויקי',
+'api-error-verification-error' => 'די טעקע ××™×– מעגלעך פֿ×רד×רבן, ×דער ×”×ט × ×¤Ö¿×ַלשע ענדונג.',
+
);
diff --git a/languages/messages/MessagesYo.php b/languages/messages/MessagesYo.php
index a76b387e..5260ef77 100644
--- a/languages/messages/MessagesYo.php
+++ b/languages/messages/MessagesYo.php
@@ -410,23 +410,25 @@ Tí kì bá á¹£e bẹÌẹ̀, ó lè jáº¹Ì pé ẹ ti rí àsìṣe nínú atò
'badarticleerror' => 'Ìgbéṣẹ̀ yìí kò ṣe é ṣe lórí ojúewé yìí.',
'cannotdelete' => 'Ojúewé tàbí fáìlì "$1" kò á¹£e é parẹÌ.
Oníṣe mìíràn le ti paárẹÌ.',
+'cannotdelete-title' => 'Kò le pa ojúewè "$1" rẹÌ',
'badtitle' => 'Àká»Ìlé búrurú',
'badtitletext' => 'Àká»lé ojúewé tí ẹ bèrè fún kò ní ìbáramu, jáº¹Ì Ã²fo, tàbí áṣìṣe wà nínú ìjápá»Ì€ àká»lé láàrin èdè tàbí láàrin wiki.
Ó á¹£e é á¹£e kó jẹÌpé ó ní ìkan tàbí á»Ì€pá»Ì€ àmi-lẹÌtà tí kò á¹£e é lò nínú àká»lé.',
-'perfcached' => 'ÃŒwònyí jáº¹Ì dátà láti inú cache nítoríẹ̀ ó le má»Ì jáº¹Ì€áº¹Ì tuntun.',
-'perfcachedts' => 'ÃŒwònyí jáº¹Ì Ã¬pèsè láti inú cache, á»já»Ì tí a á¹£e àtúná¹£e rẹ̀ gbẹ̀yìn ni $1.',
+'perfcached' => 'ÃŒwònyí jáº¹Ì dátà láti inú cache nítoríẹ̀ ó le má»Ì jáº¹Ì€áº¹Ì tuntun. Ó pá»Ì€jùlá» {{PLURAL:$1|èsì kan|èsì $1}} wà nínú cache.',
+'perfcachedts' => 'ÃŒwònyí jáº¹Ì dátà láti inú cache, á»já»Ì tí a á¹£e àtúná¹£e rẹ̀ gbẹ̀yìn ni $1. Ó pá»Ì€jùlá» {{PLURAL:$4|èsì kan|èsì $4}} wà nínú cache.',
'querypage-no-updates' => 'Àtúná¹£e sí ojúewé yìí kò á¹£e é á¹£e lá»Ìwá»Ìlá»Ìwá»Ì.
Àwá»n ìpèsè tuntun kò ní hàn báyìí ná.',
'wrong_wfQuery_params' => 'Àwá»n pàrámítà àìtá»Ì sí wfQuery()<br />
Ìlò: $1<br />
ÃŒtá»rá»: $2',
'viewsource' => 'Wo àmìá»Ì€rá»Ì€',
-'viewsourcefor' => 'fún $1',
+'viewsource-title' => 'Ẹ wo ìsun fún $1',
'actionthrottled' => 'Ìgbése bíntín',
'actionthrottledtext' => 'Láti dènà spam, ìgbése yìí kò ní á¹£e é á¹£e lá»Ìnà iye púpá»Ì€ láàrin àsìkò bíntín, ẹ̀yin sì ti ká»já iye náà.
Ẹjá»Ì€wá»Ì ẹ gbíyànjú síi ní ìsẹÌjú díẹ̀.',
'protectedpagetext' => 'Ojúewé yìí tijáº¹Ì títìpa. Ẹ kò le se àtúná¹£e.',
'viewsourcetext' => 'Ẹ lè wo ati ẹ lè se àwòká» á»Ì€rá»Ì€Ã mì ojúewé yi:',
+'viewyourtext' => "Ẹ le wò bẹÌẹ̀sìni ẹ le á¹£e àwòká» orísun '''àwá»n àtúná¹£e yín''' sí ojúewé yìí:",
'protectedinterface' => 'Ojúewé yìí n pèsè ìfojúkojú ìká»Ì€wé fún software, a ti dínà si láti má»Ì gba ìlòkulò ní ààyè.',
'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.
@@ -535,6 +537,7 @@ E-mail kankan kò ní jáº¹Ì fífiráná¹£áº¹Ì fún ìkankan nínú àwá»n ìnÃ
'emailconfirmlink' => 'ÃŒmúdájú àdírẹÌẹ̀sì e-mail yín',
'invalidemailaddress' => 'ÀdírẹÌsì e-mail náà kò á¹£e é gbà torípé ó dà bi pé irú rẹ̀ kò tá»Ì.
Ẹ já»Ì€wá»Ì ẹ pèsè àdírẹÌsì tó tá»Ì tàbí kí ẹ fi ààyè náà sí òfo.',
+'cannotchangeemail' => 'Àwá»n àdírẹÌsì e-mail àpamá»Ì kò á¹£e é yípadà lórí wiki yìí.',
'accountcreated' => 'Ẹ ti fi orúkỠsílẹ̀',
'accountcreatedtext' => "A ti á¹£'èdá àkópamá»Ì oniá¹£e fún $1.",
'createaccount-title' => 'ÌforúkỠsílẹ̀ fún {{SITENAME}}',
@@ -551,6 +554,7 @@ E-mail kankan kò ní jáº¹Ì fífiráná¹£áº¹Ì fún ìkankan nínú àwá»n ìnÃ
# E-mail sending
'php-mail-error-unknown' => 'Àsìṣe àìmá»Ì€ nínú ìgbéṣe mail() ti PHP',
+'user-mail-no-addy' => 'Ó fáº¹Ì fi e-mail ráná¹£áº¹Ì láìsí àdírẹÌsì e-mail.',
# Change password dialog
'resetpass' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì',
@@ -571,30 +575,45 @@ Láti parí ìmúwá»lẹÌ, ẹ gbá»Ìdá»Ì€ ṣètò á»Ì€rá»Ì€Ã¬pamá»Ì tu
'resetpass-temp-password' => 'Ọ̀rá»Ì€Ã¬pamá»Ì fún ìgbà díẹ̀',
# Special:PasswordReset
-'passwordreset' => 'ÃŒtúntò á»Ì€rá»Ì€Ã¬pamá»Ì',
-'passwordreset-text' => 'Ẹ parí fá»Ìá»Ì€mù yìí láti gba e-mail aránlétí nípa àwá»n ẹ̀kúnrẹÌ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-username' => 'OrúkỠoníṣe:',
-'passwordreset-domain' => 'Àbùgbé:',
-'passwordreset-email' => 'Àdírẹ̀sì e-mail:',
-'passwordreset-emailtitle' => 'Àwá»n ẹ̀kúnrẹÌráº¹Ì Ã pamá»Ì lórí {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ẹnìkan (bóyá ẹ̀yin ni, láti àdírẹ̀sì IP $1) tá»rỠìránlétí àwá»n ẹ̀kúnrẹÌráº¹Ì Ã kópamá»Ì yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamá»Ì|Àwá»n àkópamá»Ì}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pá»Ì€ má»Ì àdírẹ̀sì e-mail yìí:
+'passwordreset' => 'ÃŒtúntò á»Ì€rá»Ì€Ã¬pamá»Ì',
+'passwordreset-text' => 'Ẹ parí fá»Ìá»Ì€mù yìí láti gba e-mail aránlétí nípa àwá»n ẹ̀kúnrẹÌ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-username' => 'OrúkỠoníṣe:',
+'passwordreset-domain' => 'Àbùgbé:',
+'passwordreset-capture' => 'Wo e-mail tí yíò jáde?',
+'passwordreset-capture-help' => 'Tí ẹ bá fagi sínú àpótí yìí, e-mail náà (pẹ̀lú á»Ì€rá»Ì€Ã¬pamá»Ì onígbàdíẹ̀) yíò hàn si yín bákannáà yíò jáº¹Ì fífiráná¹£áº¹Ì sí oníṣe náà.',
+'passwordreset-email' => 'Àdírẹ̀sì e-mail:',
+'passwordreset-emailtitle' => 'Àwá»n ẹ̀kúnrẹÌráº¹Ì Ã pamá»Ì lórí {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Ẹnìkan (bóyá ẹ̀yin ni, láti àdírẹ̀sì IP $1) tá»rỠìránlétí àwá»n ẹ̀kúnrẹÌráº¹Ì Ã kópamá»Ì yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamá»Ì|Àwá»n àkópamá»Ì}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pá»Ì€ má»Ì àdírẹ̀sì e-mail yìí:
$2
{{PLURAL:$3|Ọ̀rá»Ì€Ã¬pamá»Ì onígbàdíẹ̀ yìí|Àwá»n á»Ì€rá»Ì€Ã¬pamá»Ì onígbàdíẹ̀ wá»Ì€nyí}} yíò dópin lẹÌyìn {{PLURAL:$5|á»já»Ì kan|á»já»Ì $5}}.
Ẹ gbá»Ìdá»Ì€ lá» yan á»Ì€rá»Ì€Ã¬pamá»Ì tuntun báyìí. Tóbá jáº¹Ì pé ẹ̀lòmíràn ló á¹£e ìtá»rá» yìí, tàbí tá»Ìbá jáº¹Ì pé ẹ ti rántí á»Ì€rá»Ì€Ã¬pamá»Ì àtètèká»Ìá¹£e yín, tí ẹ ká»Ì€ sí fáº¹Ì yíipadà má»Ì, ẹ lé ṣàìkàsí ìráná¹£áº¹Ì yìí, kí ẹ sì tẹ̀síwájú ní lo á»Ì€rá»Ì€Ã¬pamá»Ì àtijá»Ì yín.',
-'passwordreset-emailtext-user' => 'Oníṣe $1 lórí {{SITENAME}} tá»rỠìránlétí àwá»n ẹ̀kúnrẹÌráº¹Ì Ã kópamá»Ì yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamá»Ì|Àwá»n àkópamá»Ì}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pá»Ì€ má»Ì àdírẹ̀sì e-mail yìí:
+'passwordreset-emailtext-user' => 'Oníṣe $1 lórí {{SITENAME}} tá»rỠìránlétí àwá»n ẹ̀kúnrẹÌráº¹Ì Ã kópamá»Ì yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamá»Ì|Àwá»n àkópamá»Ì}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pá»Ì€ má»Ì àdírẹ̀sì e-mail yìí:
$2
{{PLURAL:$3|Ọ̀rá»Ì€Ã¬pamá»Ì onígbàdíẹ̀ yìí|Àwá»n á»Ì€rá»Ì€Ã¬pamá»Ì onígbàdíẹ̀ wá»Ì€nyí}} yíò dópin lẹÌyìn {{PLURAL:$5|á»já»Ì kan|á»já»Ì $5}}.
Ẹ gbá»Ìdá»Ì€ lá» yan á»Ì€rá»Ì€Ã¬pamá»Ì tuntun báyìí. Tóbá jáº¹Ì pé ẹ̀lòmíràn ló á¹£e ìtá»rá» yìí, tàbí tá»Ìbá jáº¹Ì pé ẹ ti rántí á»Ì€rá»Ì€Ã¬pamá»Ì àtètèká»Ìá¹£e yín, tí ẹ ká»Ì€ sí fáº¹Ì yíipadà má»Ì, ẹ lé ṣàìkàsí ìráná¹£áº¹Ì yìí, kí ẹ sì tẹ̀síwájú ní lo á»Ì€rá»Ì€Ã¬pamá»Ì àtijá»Ì yín.',
-'passwordreset-emailelement' => 'OrúkỠoníṣe: $1
+'passwordreset-emailelement' => 'OrúkỠoníṣe: $1
Ọ̀rá»Ì€Ã¬pamá»Ì ìgbàdíẹ̀: $2',
-'passwordreset-emailsent' => 'E-mail olùrántí ti jáº¹Ì fífiránṣẹÌ.',
+'passwordreset-emailsent' => 'E-mail olùrántí ti jáº¹Ì fífiránṣẹÌ.',
+'passwordreset-emailsent-capture' => 'E-mail ìránlétí kan ti jáº¹Ì fífiránṣẹÌ. Ã’hun nìyí nísàlẹ̀.',
+'passwordreset-emailerror-capture' => 'E-mail ìránlétì jáº¹Ì dídá, òhun lóhàn nísàlẹ̀ yìí, sùgbá»Ìn ìfiráná¹£áº¹Ì rẹ̀ sí oníṣe náà kùnà: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Ìyípadà àdírẹ̀sì E-mail',
+'changeemail-header' => 'ÃŒyípadà àdírẹ̀sì e-mail àkópamá»Ì',
+'changeemail-text' => 'Ẹ parí fá»Ìá»Ì€mù yìí láti ṣèyípadà àdírẹ̀sì e-mail yín. Ẹ gbá»Ìdá»Ì€ tẹ á»Ì€rá»Ì€Ã¬pamá»Ì yín láti ṣèmúdájú ìyípadà yìí.',
+'changeemail-no-info' => 'Ẹ gbódá»Ì€ wá»lé láti bósí ojúewé yìí tààrà.',
+'changeemail-oldemail' => 'Àdírẹ̀sì E-mail ìsinsìnyí:',
+'changeemail-newemail' => 'Àdírẹ̀sì E-mail tuntun:',
+'changeemail-none' => '(kósí)',
+'changeemail-submit' => 'Ìyípadà E-mail',
+'changeemail-cancel' => 'Fagilé',
# Edit page toolbar
'bold_sample' => 'ÃŒká» kedere',
@@ -665,9 +684,6 @@ $1 ni ó ṣe ìdínà.
ÀdírẹÌsì IP yín lá»Ìwá»Ìlá»Ìwá»Ì ni $3, báº¹Ì áº¹Ì€ sì ni ID fún ìdínà yín ni #$5.
Ẹ já»Ì€wá»Ì ẹ fi gbogbo ẹ̀kúnrẹÌráº¹Ì Ã²kè yìí pá»Ì€má»Ì ìbérè tí ẹ bá á¹£e.",
'blockednoreason' => 'kó sí àlàyé kankan',
-'blockedoriginalsource' => "Orísun fún '''$1''' hàn ni sàlẹ̀:",
-'blockededitsource' => "ÃŒká»Ì€wé fún '''àwá»n atúná¹£e yín''' sí '''$1''' hàn nísàlẹ̀ yìí:",
-'whitelistedittitle' => "ÃŒwá»lé á¹£e dandan láti á¹£'àtúná¹£e",
'whitelistedittext' => "Ẹ gbá»Ìdá»Ì€ $1 láti á¹£'àtúná¹£e àwá»n ojúewé.",
'confirmedittext' => "Ẹ gbá»Ìdá»Ì€ á¹£e ìmúdájú àdírẹÌẹ̀sì e-mail yín kí ẹ tó le è má» á¹£'àtúná¹£e àwá»n ojúewé.
Ẹjá»Ì€wá»Ì ẹ ṣètò báº¹Ì sìni ki ẹ fá»wá»Ìsí àdírẹÌẹ̀sì e-mail nínú [[Special:Preferences|àwá»n ìfẹÌràn á»níṣe]] yín.",
@@ -760,7 +776,7 @@ Bákannà ẹ tún ṣèlérí fún wa wípé ẹ̀yin lẹká»Ì fúnra arayín
Tí ẹ kò bá fáº¹Ì kí ìká»á»Ìlẹ̀ yín ó jáº¹Ì títúná¹£e bí kò á¹£e wùyín, ẹ má»Ì mù wá síbí.<br />
Bákannà ẹ tún ṣèlérí fún wa wípé ẹ̀yin lẹká»Ì fúnra arayín, tàbí ẹ wòóká» láti àbùgbé ìgboro tàbí irú ìtìlẹÌyín á»Ì€fáº¹Ì bíi bẹÌẹ̀ (ẹ wo $1 fún ẹkunrẹrẹ).
'''Ẹ má»Ì mú iá¹£áº¹Ì tó ní ẹ̀tá»Ìàwòká» sílẹ̀ láì gbàṣẹ!'''",
-'longpageerror' => "'''Àsìṣe: ÃŒká»Ì€wé tí ẹ fisílẹ̀ gùn tó $1 Kilobytes, èyí gùn ju $2 kilobytes lá» tó jáº¹Ì Ã jà.'''
+'longpageerror' => "'''Àsìṣe: ÃŒká»Ì€wé tí ẹ fisílẹ̀ gùn tó {{PLURAL:$1|kilobyte kan|$1 kilobytes}}, èyí gùn ju {{PLURAL:$2|kilobyte kan|$2 kilobytes}} lá» tó jáº¹Ì Ã jà.'''
Kò á¹£e é múpamá»Ì.",
'readonlywarning' => "'''ÃŒkìlá»Ì€: Ibùdó dátà ti jáº¹Ì títìpàdé fún ìtá»Ìjú, nípa bẹÌẹ̀ ẹ kò ní le fi àwá»n àtúná¹£e yín pamá»Ì lásìkò yìí.'''
Tí ẹ bá fáº¹Ì áº¹ le fi ìká»Ì€rá»Ì€ náà pamá»Ì sínú fáìlì ìká»Ì€rá»Ì€ (pẹ̀lú ìgékúrò-àti-ìlẹ̀má»Ì) fún ìgbà míràn.
@@ -937,13 +953,6 @@ $1",
'revdel-restore-visible' => 'àwá»n àtúnyẹ̀wò aá¹£eéfojúrí',
'pagehist' => 'Ìtàn ojúewé',
'deletedhist' => 'ÃŒtàn ìparẹÌ',
-'revdelete-content' => 'àkóónú',
-'revdelete-summary' => 'àkótán àtúnṣe',
-'revdelete-uname' => 'orúkỠoníṣe',
-'revdelete-hid' => 'ìbòmá»Ìlẹ̀ $1',
-'revdelete-unhid' => 'ìfihàn $1',
-'revdelete-log-message' => '$1 fún $2 {{PLURAL:$2|àtúnyẹ̀wò|àwá»n àtúnyẹ̀wò}}',
-'logdelete-log-message' => '$1 fún $2 {{PLURAL:$2|ìṣẹ̀lẹ̀|àwá»n ìṣẹ̀lẹ̀}}',
'revdelete-hide-current' => 'Àsìṣe ìbòmá»Ìlẹ̀ ohun á»já»Ìá»dún $2, $1: Àtúnyẹ̀wò ìgbàyí nìyí.
Kò á¹£e é bòmá»Ìlẹ̀.',
'revdelete-show-no-access' => 'Àsìṣe ìfihàn ohun á»já»Ìá»dún $2, $1: Ohun yìí ti jáº¹Ì síṣàmí sí bíi "ìpàlàsí".
@@ -1102,12 +1111,14 @@ Ní báyìí ná ẹ le ṣàwárí lá»Ìdá»Ì€ Google.
'prefs-rc' => 'Àwá»n àtúná¹£e tuntun',
'prefs-watchlist' => 'Ìmójútó',
'prefs-watchlist-days' => 'Ọjá»Ì láti fihàn nínú ìmójútó:',
-'prefs-watchlist-days-max' => 'Ọjá»Ì 7 púpá»Ì€jùlá»',
+'prefs-watchlist-days-max' => '{{PLURAL:$1|Ọjá»Ì|Ọjá»Ì}} $1 púpá»Ì€jùlá»',
'prefs-watchlist-edits' => 'Iye àwá»n àtúná¹£e láti fìhàn nínú ìmójútó kíkúnrẹÌrẹÌ:',
'prefs-watchlist-edits-max' => 'Iye púpá»Ì€jùlá»: 1000',
'prefs-watchlist-token' => 'ÃŒtá»Ìwò àmójútó:',
'prefs-misc' => 'Oríṣiríṣi',
'prefs-resetpass' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì',
+'prefs-changeemail' => 'Ìyípadà E-mail',
+'prefs-setemail' => 'ÃŒsètò àdírẹÌẹ̀sì e-mail',
'prefs-email' => 'Àwá»n àṣàyàn e-mail',
'prefs-rendering' => 'Wíwò',
'saveprefs' => 'ÃŒmúpamá»Ì',
@@ -1204,7 +1215,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'userrights-lookup-user' => 'Àkóso àwá»n àdìpò oníṣe',
'userrights-user-editname' => 'Ẹ tẹ orúkỠoníṣe kan:',
'editusergroup' => 'Àtúná¹£e àwá»n ẹgbáº¹Ì oníṣe',
-'editinguser' => "Ṣíṣàyípadà àwá»n ẹ̀tá»Ì oníṣe fún oníṣe '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Ṣíṣàyípadà àwá»n ẹ̀tá»Ì oníṣe fún oníṣe '''[[User:$1|$1]]''' $2",
'userrights-editusergroup' => 'Àtúná¹£e àwá»n ẹgbáº¹Ì oníṣe',
'saveusergroups' => 'ÃŒmúpamá»Ì àwá»n ẹgbáº¹Ì oníṣe',
'userrights-groupsmember' => 'Ọ̀kan nínú:',
@@ -1304,6 +1315,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'right-siteadmin' => 'Ìtìpa àti ìṣí ibùdó dátà',
'right-override-export-depth' => 'ÃŒkójáde àwá»n ojúewé lámùúpá»Ì€ má»Ì àwá»n ojúewé jíjápá»Ì€ títí dé ìbú 5',
'right-sendemail' => 'Fi e-mail ráná¹£áº¹Ì sí àwá»n oníṣe míràn',
+'right-passwordreset' => 'ÃŒwo àwá»n e-mail fún ìtúntò á»Ì€rá»Ì€Ã¬pamá»Ì',
# User rights log
'rightslog' => 'Àwá»n ẹ̀tá»Ì oníṣe',
@@ -1337,6 +1349,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'action-suppressionlog' => 'wo àká»á»Ìlẹ̀ àdáni yìí',
'action-block' => 'dínà oníṣe yìí láti ṣàtúnṣe',
'action-protect' => 'yí irú àbò padà fún ojúewé yìí',
+'action-rollback' => 'kíákíá yí àwá»n àtúná¹£e oníṣe tó ṣàtúná¹£e ojúewé kan pàtó gbẹ̀yìn sẹÌyìn',
'action-import' => 'kó ojúewé yìí wolé wá láti á»Ì€dá»Ì€ wíkì mìíràn',
'action-importupload' => 'ìkówá»lé ojúewé yìí láti inú ìrùsókè fáìlì kan',
'action-patrol' => "á¹£'àmì sí àtúná¹£e àwá»n ẹlá»Ì€míràn bíi onísíṣá»Ì",
@@ -1346,6 +1359,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'action-userrights' => 'àtúná¹£e gbogbo àwá»n ẹ̀tá»Ì oníṣe',
'action-userrights-interwiki' => 'àtúná¹£e àwá»n ẹ̀tá»Ì oníṣe àwá»n oníṣe lórí àwá»n wiki míràn',
'action-siteadmin' => 'tìpa tàbí ṣí ibùdó dátà',
+'action-sendemail' => 'fi e-mail ránṣẹÌ',
# Recent changes
'nchanges' => '{{PLURAL:$1|àtúná¹£e|àwá»n àtúná¹£e}} $1',
@@ -1431,6 +1445,7 @@ Láti fí fáìlì pá»Ì€má»Ì sínú ojúewé kan, ẹ lo àjápá»Ì€ bíi ìk
'minlength1' => 'Ó kéréjù àwá»n orúká» fáìlì gbá»dá»Ì€ jáº¹Ì lẹÌtà kan.',
'illegalfilename' => 'Orúká» fáìlì "$1" ní àwá»n àmììká»Ì€rá»Ì€ tí kò jáº¹Ì gbígbà láàyè nínú àká»lé ojúewé.
Ẹ já»Ì€wá»Ì ẹ tún fáìlì sá»lórúká» kì ẹ sì gbìyànjú láti tún rùúsókè.',
+'filename-toolong' => 'Àwá»n orúká» fáìlì kò gbá»dá»Ì€ gùnju 240 bytes lá».',
'badfilename' => 'OrúkỠfáìlì ti yípadà sí "$1".',
'filetype-mime-mismatch' => 'ÃŒfàgùn fáìlì ".$1" kò ní ìbámu má»Ì irú MIME fáìlì náà ($2).',
'filetype-badmime' => 'Àwá»n fáìlì MIME irú "$1" kò jáº¹Ì gbígbà láyè láti rù wá»Ìn sókè.',
@@ -1533,6 +1548,34 @@ Tí ìṣòro náà ò bá jáwá»Ì, ẹ bẹ [[Special:ListUsers/sysop|olùmó
'upload-unknown-size' => 'Iye ìtóbi kòsí',
'upload-http-error' => 'Àṣìṣe HTTP ti ṣẹlẹ̀: $1',
+# File backend
+'backend-fail-stream' => 'Kò le ṣe ìgbéhànjáde fáìlì "$1".',
+'backend-fail-backup' => 'Kò le á¹£e àwòká»pamá»Ì fáìlì "$1".',
+'backend-fail-notexists' => 'Fáìlì $1 kò sí.',
+'backend-fail-hashes' => 'Kò le gba àwá»n àmí hash fáìlì fún ìfiwéra.',
+'backend-fail-notsame' => 'Fáìlì aláìjá»ra kan pilẹ̀ ti wà ní $1.',
+'backend-fail-invalidpath' => '$1 kìí á¹£e ojúá»Ì€nà ibi-ìkópamá»Ì oníìbámu.',
+'backend-fail-delete' => 'ÃŒparáº¹Ì fáìlì $1 kò á¹£e é á¹£e.',
+'backend-fail-alreadyexists' => 'Fáìlì $1 pilẹ̀ ti wà.',
+'backend-fail-store' => 'Kò le á¹£e ìkópamá»Ì fáìlì $1 sí $2.',
+'backend-fail-copy' => 'ÀwòkỠfaili $1 sí $2 kò ṣe é ṣe.',
+'backend-fail-move' => 'Ìyípòdà faili $1 sí $2 kò ṣe é ṣe.',
+'backend-fail-opentemp' => 'Kò le sí fáìlì onígbàdíẹ̀.',
+'backend-fail-writetemp' => 'Kò le kỠsínú fáìlì onígbàdíẹ̀.',
+'backend-fail-closetemp' => 'Kò le de fáìlì onígbàdíẹ̀.',
+'backend-fail-read' => 'Kò le ka fáìlì "$1".',
+'backend-fail-create' => 'Kò le dá fáìlì "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Kò le sí àgádágodo "$1" sílẹ̀; kò jáº¹Ì dídè.',
+'lockmanager-fail-closelock' => 'Kò le pa àgádágodo fáìlì de fún "$1".',
+'lockmanager-fail-deletelock' => 'Kò le pa àgádágodo fáìlì ráº¹Ì fún "$1".',
+'lockmanager-fail-acquirelock' => 'Kò le gba àgádágodo fáìlì lò fún "$1".',
+'lockmanager-fail-openlock' => 'Kò le sí àgádágodo fáìlì sílẹ̀ fún "$1".',
+'lockmanager-fail-releaselock' => 'Kò le fi àgádágodo fáìlì sílẹ̀ fún "$1".',
+'lockmanager-fail-db-release' => 'Kò le fi àwá»n àgádágodo sílẹ̀ lórí ìbùdó dátà $1.',
+'lockmanager-fail-svr-release' => 'Kò le fi àwá»n àgádágodo sílẹ̀ lórí ẹ̀rá»-ìwá»Ì€fà $1.',
+
# ZipDirectoryReader
'zip-file-open-error' => 'Àsìṣe kan ṣẹlẹ̀ lásìkò ìsísílẹ̀ fáìlì náà fún ìyẹ̀wò ZIP.',
'zip-wrong-format' => 'Fáìlì tí a tá»Ìkasí kì í á¹£e fáìlì ZIP.',
@@ -1656,21 +1699,22 @@ Tó bá jáº¹Ì jíjá»Ì€ gẹÌgẹÌbí oníṣe, àwá»n fáìlì tí oníṣe
'filerevert-badversion' => 'Kò sí àtúnyẹ̀wò abẹÌlé tẹÌlẹ̀ fún fáìlì yìí pẹ̀lú àmì àsìkò tí ẹ pèsè.',
# File deletion
-'filedelete' => 'ÃŒparáº¹Ì $1',
-'filedelete-legend' => 'ÃŒparáº¹Ì fáìlì',
-'filedelete-intro' => "Ẹ ti fáº¹Ì pa fáìlì '''[[Media:$1|$1]]''' àti gbogbo ìtàn rẹ̀ rẹÌ.",
-'filedelete-intro-old' => "Ẹ̀ únpa àtúnyẹ̀wò '''[[Media:$1|$1]]''' ráº¹Ì bó á¹£e wà ní [$4 $3, $2].",
-'filedelete-comment' => 'Ìdíẹ̀:',
-'filedelete-submit' => 'PaarẹÌ',
-'filedelete-success' => "'''$1''' ti jáº¹Ì píparẹÌ.",
-'filedelete-success-old' => "Àtúnyẹ̀wò '''[[Media:$1|$1]]''' bó á¹£e wà ní $3, $2 ti jáº¹Ì píparẹÌ.",
-'filedelete-nofile' => "'''$1''' kò sí.",
-'filedelete-otherreason' => 'Ìdíẹ̀ míràn/àfikún:',
-'filedelete-reason-otherlist' => 'Ìdí mìíràn',
-'filedelete-reason-dropdown' => '*Àwá»n ìdí fún ìparẹÌ
+'filedelete' => 'ÃŒparáº¹Ì $1',
+'filedelete-legend' => 'ÃŒparáº¹Ì fáìlì',
+'filedelete-intro' => "Ẹ ti fáº¹Ì pa fáìlì '''[[Media:$1|$1]]''' àti gbogbo ìtàn rẹ̀ rẹÌ.",
+'filedelete-intro-old' => "Ẹ̀ únpa àtúnyẹ̀wò '''[[Media:$1|$1]]''' ráº¹Ì bó á¹£e wà ní [$4 $3, $2].",
+'filedelete-comment' => 'Ìdíẹ̀:',
+'filedelete-submit' => 'PaarẹÌ',
+'filedelete-success' => "'''$1''' ti jáº¹Ì píparẹÌ.",
+'filedelete-success-old' => "Àtúnyẹ̀wò '''[[Media:$1|$1]]''' bó á¹£e wà ní $3, $2 ti jáº¹Ì píparẹÌ.",
+'filedelete-nofile' => "'''$1''' kò sí.",
+'filedelete-otherreason' => 'Ìdíẹ̀ míràn/àfikún:',
+'filedelete-reason-otherlist' => 'Ìdí mìíràn',
+'filedelete-reason-dropdown' => '*Àwá»n ìdí fún ìparẹÌ
**ÃŒtakùnà ẹ̀tá»Ìàwòká»
**Fáìlì ẹ̀mejì',
-'filedelete-edit-reasonlist' => 'Àtúná¹£e àwá»n ìdí ìparẹÌ',
+'filedelete-edit-reasonlist' => 'Àtúná¹£e àwá»n ìdí ìparẹÌ',
+'filedelete-maintenance-title' => 'Fáìlì náà kò á¹£eé parẹÌ',
# MIME search
'mimesearch' => 'àwáàrí pẹÌlú MIME',
@@ -1775,6 +1819,7 @@ Ojúewé kan jáº¹Ì á¹£Ã­á¹£e bíi ojúewé ìṣeojúùtú tí ó bá lo àdàk
'mostimages' => 'Àwá»n fáìlì tó ní ìjápá»Ì€má»Ì jùlá»',
'mostrevisions' => 'Àwá»n ojúewé pẹ̀lu àwá»n àtúnyẹ̀wò tópá»Ì€jùlá»',
'prefixindex' => 'Gbogbo ojúewé tó ní ìtá»Ìka ìpele',
+'prefixindex-namespace' => 'Gbogbo ojúewé pẹ̀lú àlẹ̀má»Ìwájú (orúká»Ã yè $1)',
'shortpages' => 'Àwá»n ojúewé kúkúrú',
'longpages' => 'Ojúewé gúngùn',
'deadendpages' => 'Àwá»n ojúewé aláìníjàápá»Ì',
@@ -1789,7 +1834,7 @@ Ojúewé kan jáº¹Ì á¹£Ã­á¹£e bíi ojúewé ìṣeojúùtú tí ó bá lo àdàk
'listusers-editsonly' => 'ÃŒfihàn àwá»n oníṣe tí wá»Ìn ní àtúná¹£e níkan',
'listusers-creationsort' => 'ÃŒtò gẹÌgẹÌbí á»já»Ì ìdá',
'usereditcount' => '{{PLURAL:$1|Àtúná¹£e|Àwá»n àtúná¹£e}} $1',
-'usercreated' => 'Ó jáº¹Ì dídá ní á»já»Ì $1 ní ago $2',
+'usercreated' => '{{GENDER:$3|Dídá}} ní á»já»Ì $1 ní ago $2',
'newpages' => 'Àwá»n ojúewé tuntun',
'newpages-username' => 'OrúkỠoníṣe:',
'ancientpages' => 'Àwá»n ojúewé tópẹÌjùlá»',
@@ -1879,11 +1924,8 @@ Bákannáà ẹ wo [[Special:WantedCategories|àwá»n ẹ̀ka wíwá]].',
'activeusers-noresult' => 'Kò rí oníṣe kankan.',
# Special:Log/newusers
-'newuserlogpage' => 'Àká»sílẹ̀ ìdá oníṣe',
-'newuserlogpagetext' => 'Àká»á»Ìlẹ̀ àwá»n ìdá oníṣe nì yí.',
-'newuserlog-byemail' => 'á»Ì€rá»Ì€Ã¬pamá»Ì jáº¹Ì fífiráná¹£áº¹Ì pẹ̀lú e-mail',
-'newuserlog-create-entry' => 'Àpamá»Ì oníṣe tuntun',
-'newuserlog-create2-entry' => 'dídá àpamá»Ì tuntun $1',
+'newuserlogpage' => 'Àká»sílẹ̀ ìdá oníṣe',
+'newuserlogpagetext' => 'Àká»á»Ìlẹ̀ àwá»n ìdá oníṣe nì yí.',
# Special:ListGroupRights
'listgrouprights' => 'Àwá»n ẹ̀tá»Ì ẹgbáº¹Ì oníṣe',
@@ -1912,7 +1954,7 @@ Bákannáà ẹ wo [[Special:WantedCategories|àwá»n ẹ̀ka wíwá]].',
'emailpagetext' => 'Ẹ le lo fá»Ìá»Ì€mù ìsàlẹ̀ yìí láti fi e-mail ráná¹£áº¹Ì sí oníṣe yìí.
ÀdírẹÌẹ̀sì e-mail tí ẹ tìbá» sínú [[Special:Preferences|àwá»n ìfẹÌràn oníṣe yín]] yíò hàn bíi "Láti" àdírẹÌẹ̀sì e-mail náà, kí agbaìráná¹£áº¹Ì Ã³ le baà fi ìdáhùn ráná¹£áº¹Ì tààrà sí yín.',
'usermailererror' => 'Ẹ̀rỠìráná¹£áº¹Ì mú àsìṣe padà:',
-'defemailsubject' => 'e-mail {{SITENAME}}',
+'defemailsubject' => 'E-mail {{SITENAME}} látá»wá»Ì oníṣe "$1"',
'usermaildisabled' => 'ÀdálẹÌkun e-mail oníṣe',
'usermaildisabledtext' => 'Ẹ kò le fi e-mail ráná¹£áº¹Ì sí àwá»n oníṣe míràn lórí wiki yìí',
'noemailtitle' => 'Kò sí àdírẹ̀sì e-mail',
@@ -1966,7 +2008,7 @@ A óò á¹£'àkójỠàwá»n àtúná¹£e á»já»Ìwajú sí ojúewé yìí àti o
'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ú.',
'iteminvalidname' => "Ìṣòro wà pẹ̀lú '$1', orúkỠàìtá»Ì...",
-'wlnote' => "Lábáº¹Ì {{PLURAL:$1|ni àtúná¹£e tó gbẹ̀yìn wà|ni àwá»n àtúná¹£e '''$1''' tí wá»n gbẹ̀yìn wà}} láàrin {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹÌyìn.",
+'wlnote' => "Lábáº¹Ì {{PLURAL:$1|ni àtúná¹£e tó gbẹ̀yìn|ni àwá»n àtúná¹£e '''$1''' tí wá»n gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹÌyìn, títí dí á»já»Ì $3, $4.",
'wlshowlast' => 'ÃŒfihàn wákàtí $1 sẹÌyìn á»já»Ì $2 sẹÌyìn $3',
'watchlist-options' => 'Àṣàyàn ìmójútá»Ì',
@@ -2034,7 +2076,6 @@ Fún ìrànwá»Ì àti ìbérè:
'actionfailed' => 'Ìkùnà ìgbéṣe',
'deletedtext' => 'A ti pa "$1" rẹÌ.
Ẹ wo $2 fún àká»á»Ìlẹ̀ àwá»n ìparáº¹Ì Ã Ã¬pẹÌ.',
-'deletedarticle' => 'A ti pa "[[$1]]" rẹÌ',
'dellogpage' => 'Àká»sílẹ̀ ìparẹÌ',
'dellogpagetext' => 'Nísàlẹ̀ ni àkójỠàwá»n ìparáº¹Ì tuntun àìpẹÌ.',
'deletionlog' => 'àká»sílẹ̀ ìparẹÌ',
@@ -2080,7 +2121,10 @@ jáº¹Ì yíyípadà sí àtúnyẹ̀wò tógbẹ̀yìn látá»wá»Ì $2.',
'unprotectedarticle' => 'yỠàbò kúrò lórí "[[$1]]"',
'movedarticleprotection' => 'ti yípò àwá»n ìtòólẹ̀ àbò padà láti "[[$2]]" sí "[[$1]]"',
'protect-title' => 'Ìyípadà ìpele àbò fún "$1"',
+'protect-title-notallowed' => 'Ìwo ìpele àbò fún "$1"',
'prot_1movedto2' => '[[$1]] ti yípò sí [[$2]]',
+'protect-badnamespace-title' => 'Orúká»Ã yè aláìleèní àbò',
+'protect-badnamespace-text' => 'Àwá»n ojúewé nínú orúká»Ã yè yìí kò á¹£e é dá àbò bò.',
'protect-legend' => 'Ìmúdájú ìdábòbò',
'protectcomment' => 'Ìdíẹ̀:',
'protectexpiry' => 'Ìparí:',
@@ -2102,6 +2146,7 @@ Bí a ṣe to ojúewé '''$1''' nì yí:",
'protect-level-sysop' => 'Alámùójútó nìkan',
'protect-summary-cascade' => 'títẹ̀léra',
'protect-expiring' => 'parí ní $1 (UTC)',
+'protect-expiring-local' => 'yíò parí ní $1',
'protect-expiry-indefinite' => 'kòdájú',
'protect-cascade' => 'Àbò títẹ̀léra wá»n - ó ún dá àbò bo àwá»n ojúewé yìówù tí wá»Ìn bá jáº¹Ì mímúpá»Ì€ má»Ì ojúewé yìí.',
'protect-cantedit' => "Ẹ kò le è á¹£e àyípadà ibi àbò ojúewé yìí, nítorípé a kò yá»Ì€nda yín láti á¹£'àtúná¹£e rẹ̀.",
@@ -2152,7 +2197,6 @@ Bí a ṣe to ojúewé '''$1''' nì yí:",
'undeletereset' => 'Ìtúnṣètò',
'undeleteinvert' => 'Pàṣípààrá»Ì€ àsàyàn',
'undeletecomment' => 'Ìdíẹ̀:',
-'undeletedarticle' => 'a ti dá "[[$1]]" padà',
'undeletedrevisions' => '{{PLURAL:$1|Àtúnyẹ̀wò 1|Àwá»n àtúnyẹ̀wò $1}} ti jáº¹Ì dídápadà',
'undeletedrevisions-files' => '{{PLURAL:$1|Àtúnyẹ̀wò 1|Àwá»n àtúnyẹ̀wò $1}} àti {{PLURAL:$2|fáìlì 1|àwá»n fáìlì $2}} ti jáº¹Ì dídápadà',
'undeletedfiles' => '{{PLURAL:$1|Fáílì 1|Àwá»n fáìlì $1}} ti jáº¹Ì dídápadà',
@@ -2162,9 +2206,11 @@ Bí a ṣe to ojúewé '''$1''' nì yí:",
Ẹ wo [[Special:Log/delete|àká»á»Ìlẹ̀ ìparẹÌ]] fún àká»pamá»Ì àwá»n ìparáº¹Ì Ã ti ìdápadà àìpẹÌ.",
'undelete-header' => 'Ẹ wo [[Special:Log/delete|àká»á»Ìlẹ̀ ìparẹÌ]] fún àwá»n ojúewé píparáº¹Ì láìpẹÌ',
+'undelete-search-title' => 'Wá àwá»n ojúewé onípíparẹÌ',
'undelete-search-box' => 'Wá àwá»n ojúewé onípíparẹÌ',
'undelete-search-prefix' => 'Ìfihàn ojúewé tó bẹ̀rẹ̀ pẹ̀lú:',
'undelete-search-submit' => 'Ṣàwárí',
+'undelete-error' => 'Àsìṣe ìdápadà ìparáº¹Ì ojúewé',
'undelete-error-short' => 'Àsìṣe láti ìmúkúrò ìparáº¹Ì fáílì: $1',
'undelete-error-long' => 'Àwá»n àsìṣe ṣẹlẹ̀ nígbà ìdápadà fáìlì náà:
@@ -2273,6 +2319,7 @@ $1',
'blocklist-userblocks' => 'ÃŒbòmá»Ìlẹ̀ àwá»n ìdínà àpamá»Ì',
'blocklist-tempblocks' => 'ÃŒbòmá»Ìlẹ̀ àwá»n ìdínà onígbàdíẹ̀',
'blocklist-addressblocks' => 'ÃŒbòmá»Ìlẹ̀ àwá»n ìdínà IP ẹyá»kan',
+'blocklist-rangeblocks' => 'ÃŒbòmá»Ìlẹ̀ àwá»n ìdínà àdìmá»Ì',
'blocklist-timestamp' => 'Àmì àsìkò',
'blocklist-target' => 'Afojúsùn',
'blocklist-expiry' => 'Ìparí',
@@ -2293,6 +2340,7 @@ $1',
'unblocklink' => 'jáwá»Ì ìdínà',
'change-blocklink' => 'yí ìdínà padà',
'contribslink' => 'àfikún',
+'emaillink' => 'fi e-mail ránṣẹÌ',
'autoblocker' => 'Ẹ ti jáº¹Ì dídílá»Ìnà nítá»rípé àdírẹÌẹ̀sì IP yín ti jáº¹Ì lílò láìpáº¹Ì látá»wá»Ì "[[User:$1|$1]]".
Ìdíẹ̀ fún ìdínà $1 ni: "$2"',
'blocklogpage' => 'Àkosílẹ̀ ìdínà',
@@ -2385,9 +2433,6 @@ Tí ó bá jáº¹Ì báhun, ẹ gbúdá»Ì€ á¹£e ìyípò rẹ̀ fúnra yín.",
'move-talk-subpages' => 'ÃŒyípòdà àwá»n ojúewé abáº¹Ì ojúewé á»Ì€rá»Ì€ (títí dé $1)',
'movepage-page-moved' => 'Ojúewé $1 ti jáº¹Ì yíyípò sí $2.',
'movepage-page-unmoved' => 'Ojúewé $1 kò ṣe é yípò sí $2.',
-'1movedto2' => '[[$1]] ti yípò sí [[$2]]',
-'1movedto2_redir' => 'yípò [[$1]] sí [[$2]] lórí àtúnjúwe',
-'move-redirect-suppressed' => 'àtúnjúwe tijáº¹Ì dídílá»Ìnà',
'movelogpage' => 'Àká»síláº¹Ì Ã¬yípò',
'movelogpagetext' => 'Nísàlẹ̀ ni àtòjá» gbogbo àwá»n ìyípòdà ojúewé.',
'movesubpage' => '{{PLURAL:$1|Ojúewé abẹÌ|Àwá»n ojúewé abẹÌ}}',
@@ -2400,6 +2445,7 @@ Tí ó bá jáº¹Ì báhun, ẹ gbúdá»Ì€ á¹£e ìyípò rẹ̀ fúnra yín.",
Ojúewé àdésí "[[:$1]]" wà tẹÌlẹ̀tẹÌlẹ̀.
Ṣé ẹ fáº¹Ì paáráº¹Ì láti sínà fún ìyípò?',
'delete_and_move_confirm' => 'BẹÌẹ̀ni, pa ojúewé náà rẹÌ',
+'delete_and_move_reason' => 'Jáº¹Ì píparáº¹Ì láti baà fi ayè lẹ̀ fún ìyípòdà láti "[[$1]]"',
'selfmove' => 'Àwá»n àká»lé orísun àti ibiàyè jáº¹Ì á»Ì€kannáà;
kò le yípò ojúewé padà sí ara rẹ̀.',
'immobile-source-namespace' => 'ÃŒyípò àwá»n ojúewé nínú orúká»Ã yè ""$1" kò á¹£e é á¹£e.',
@@ -2444,6 +2490,8 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
'thumbnail_error' => 'Asìṣẹ ìdá àwòrán kékeré: $1',
'djvu_page_error' => 'Ojúewé DjVu ká»já àdìmá»Ì',
'djvu_no_xml' => 'Kò le mú XML wá fún fáìlì DjVu',
+'thumbnail-temp-create' => 'Kò le dá fáìlì àwòrán kékeré ìgbàdíẹ̀',
+'thumbnail-dest-create' => 'Kò le mú àwòrán kékeré pamá»Ì sí ibiàyè rẹ̀',
'thumbnail_dest_directory' => 'Kò le dá àpò ibiàyè',
'thumbnail_image-type' => 'Kò sí àtìlẹÌyìn fún irú àwòrán yìí',
'thumbnail_image-missing' => 'Fáìlì dà bíi pé kòsí: $1',
@@ -2472,6 +2520,8 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
'xml-error-string' => '$1 lórí ìlà $2, orí ìnàró $3 (byte $4): $5',
'import-upload' => 'ÃŒrùsókè àwá»n dátà XML',
'import-invalid-interwiki' => 'Kò le á¹£e ìkówá»lé látá»Ì€dá»Ì€ wiki tí ẹ tá»Ìkasí.',
+'import-error-edit' => 'Ojúewé "$1" kò jáº¹Ì kíkówá»lé nítorípé ẹ kò jáº¹Ì gbígbà láyè láti ṣàtúná¹£e rẹ̀.',
+'import-error-create' => 'Ojúewé "$1" kò jáº¹Ì kíkówá»lé nítorípé ẹ kò jáº¹Ì gbígbà láyè láti ṣèdá rẹ̀.',
# Import log
'importlogpage' => 'ÃŒgbéwá»lé àká»á»Ìlẹ̀',
@@ -2575,10 +2625,6 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
'markedaspatrolled' => 'Jáº¹Ì síṣààmí sí bíi sísá»Ì',
'markedaspatrollederror' => 'Kò le jáº¹Ì síṣààmí sí bíi sísá»Ì',
-# Patrol log
-'patrol-log-auto' => '(fúnraara)',
-'patrol-log-diff' => 'àtúnyẹ̀wò $1',
-
# Image deletion
'filedeleteerror-short' => 'Àsìṣe ìparáº¹Ì fáílì: $1',
'filedelete-missing' => 'Fáìlì "$1" náà kò á¹£e é paráº¹Ì nítorípé kò sí.',
@@ -2592,7 +2638,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|ojúewé|àwá»n ojúewé}}',
'file-info' => 'ìtóbi faili: $1, irú MIME: $2',
'file-info-size' => '$1 × $2 pixel, ìtóbi faili: $3, irú MIME: $4',
-'file-nohires' => '<small>Kò sí ìgbéhàn gíga jù báun lá».</small>',
+'file-nohires' => 'Kò sí ìgbéhàn gíga jù báun lá».',
'svg-long-desc' => 'faili SVG, pẹ̀lú $1 × $2 pixels, ìtòbi faili: $3',
'show-big-image' => 'Pẹ̀lú ìgbéhàn gíga',
'show-big-image-size' => '$1 × $2 pixels',
@@ -2610,6 +2656,13 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
'bydate' => 'bíi á»já»Ìá»dún',
'sp-newimages-showfrom' => 'ÃŒfihàn àwá»n fáìlì tuntun nípa bíbẹ̀rẹ̀ láti ago $2, á»já»Ì $1',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1| ìṣẹÌjúàáyá $1}}',
+'minutes' => '{{PLURAL:$1|ìṣẹÌjú $1}}',
+'hours' => '{{PLURAL:$1|wákàtí $1}}',
+'days' => '{{PLURAL:$1|á»já»Ì $1}}',
+'ago' => '$1 sẹÌyìn',
+
# 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ò.
@@ -2745,9 +2798,6 @@ TóbájẹÌpé fáìlì á»Ì€hún ti jáº¹Ì títúná¹£e sí bóṣewà ní bẹ
# Scary transclusion
'scarytranscludetoolong' => '[URL ti gùn jù]',
-# Trackbacks
-'trackbackremove' => '([ÃŒparáº¹Ì $1])',
-
# Delete conflict
'recreate' => 'Ìtúndá',
@@ -2858,13 +2908,16 @@ TóbájẹÌpé fáìlì á»Ì€hún ti jáº¹Ì títúná¹£e sí bóṣewà ní bẹ
'tags-hitcount' => '{{PLURAL:$1|Àtúná¹£e|Àwá»n àtúná¹£e}} $1',
# Special:ComparePages
-'comparepages' => 'ÃŒfiwéra àwá»n ojúewé',
-'compare-selector' => 'ÃŒfiwéra àwá»n àtúnyẹ̀wò ojúewé',
-'compare-page1' => 'Ojúewé 1',
-'compare-page2' => 'Ojúewé 2',
-'compare-rev1' => 'Àtúnyẹ̀wò 1',
-'compare-rev2' => 'Àtúnyẹ̀wò 2',
-'compare-submit' => 'Ṣàfiwé',
+'comparepages' => 'ÃŒfiwéra àwá»n ojúewé',
+'compare-selector' => 'ÃŒfiwéra àwá»n àtúnyẹ̀wò ojúewé',
+'compare-page1' => 'Ojúewé 1',
+'compare-page2' => 'Ojúewé 2',
+'compare-rev1' => 'Àtúnyẹ̀wò 1',
+'compare-rev2' => 'Àtúnyẹ̀wò 2',
+'compare-submit' => 'Ṣàfiwé',
+'compare-invalid-title' => 'Àká»lè tí ẹ nàkasí kò tá»Ì.',
+'compare-title-not-exists' => 'Àká»lé tí ẹ tá»Ìkasí kò sí.',
+'compare-revision-not-exists' => 'Àtúnyẹ̀wò tí ẹ tá»Ìkasí kò sí.',
# Database error messages
'dberr-header' => 'Wiki yìí ní ìsòro',
@@ -2878,4 +2931,33 @@ TóbájẹÌpé fáìlì á»Ì€hún ti jáº¹Ì títúná¹£e sí bóṣewà ní bẹ
'htmlform-reset' => 'ÃŒdápadà àwá»n àtúná¹£e',
'htmlform-selectorother-other' => 'Òmíràn',
+# New logging system
+'logentry-delete-delete' => '$1 pa ojúewé $3 rẹÌ',
+'logentry-delete-restore' => '$1 dá ojúewé $3 padà',
+'logentry-suppress-delete' => '$1 fi ojúewé $3 sílẹ̀',
+'revdelete-content-hid' => 'ìbòmá»Ìlẹ̀ àkóónú',
+'revdelete-summary-hid' => 'ìbòmá»Ìlẹ̀ àkótán àtúná¹£e',
+'revdelete-uname-hid' => 'ìbòmá»Ìlẹ̀ orúká» oníṣe',
+'revdelete-content-unhid' => 'àìbòmá»Ìlẹ̀ àkóónú',
+'revdelete-summary-unhid' => 'àìbòmá»Ìlẹ̀ àkótán àtúná¹£e',
+'logentry-move-move' => '$1 ṣeyípòdà ojúewé $3 sí $4',
+'logentry-move-move-noredirect' => '$1 ṣeyípòdà ojúewé $3 sí $4 láìfi àtúnjúwe sílẹ̀',
+'logentry-move-move_redir' => '$1 ṣeyípòdà ojúewé $3 sí $4 lórí àtúnjúwe',
+'logentry-move-move_redir-noredirect' => '$1 ṣeyípòdà ojúewé $3 sí $4 lórí àtúnjúwe láìfi àtúnjúwe sílẹ̀',
+'logentry-patrol-patrol-auto' => '$1 fúnraẹni ṣàmì àtúnyẹ̀wò $4 ti ojúewé $3 bíi síṣá»Ì',
+'logentry-newusers-newusers' => "$1 á¹£'èdá àpamá»Ì oníṣe",
+'logentry-newusers-create' => "$1 á¹£'èdá àpamá»Ì oníṣe",
+'logentry-newusers-create2' => "$1 á¹£'èdá àpamá»Ì oníṣe $3",
+'logentry-newusers-autocreate' => 'Àkópamá»Ì $1 jáº¹Ì dídá fúnrarẹ̀',
+'newuserlog-byemail' => 'á»Ì€rá»Ì€Ã¬pamá»Ì jáº¹Ì fífiráná¹£áº¹Ì pẹ̀lú e-mail',
+
+# Feedback
+'feedback-subject' => 'Oríá»Ì€rá»Ì€:',
+'feedback-message' => 'ÃŒránṣẹÌ:',
+'feedback-cancel' => 'Fagilé',
+'feedback-error1' => 'Àsìṣe: Èsì aláìdámá»Ì látá»Ì€dá»Ì€ API',
+'feedback-error2' => 'Àsìṣe: Àtúnṣe kùnà',
+'feedback-error3' => 'Àsìṣe: Kò sí ìdáhùn látá»Ì€dá»Ì€ API',
+'feedback-close' => 'Ṣetán',
+
);
diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php
index 376a93ef..0db2e72a 100644
--- a/languages/messages/MessagesYue.php
+++ b/languages/messages/MessagesYue.php
@@ -22,11 +22,11 @@ $namespaceNames = array(
NS_TALK => '傾åˆ',
NS_USER => '用戶',
NS_USER_TALK => '用戶傾åˆ',
- NS_PROJECT_TALK => '$1_傾åˆ',
+ NS_PROJECT_TALK => '$1傾åˆ',
NS_FILE => '文件',
NS_FILE_TALK => '文件傾åˆ',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_傾åˆ',
+ NS_MEDIAWIKI_TALK => 'MediaWiki傾åˆ',
NS_TEMPLATE => '模',
NS_TEMPLATE_TALK => '模傾åˆ',
NS_HELP => '幫手',
@@ -47,9 +47,7 @@ $namespaceAliases = array(
"用户 对è¯" => NS_USER_TALK,
"用戶 討論" => NS_USER_TALK,
"用户 讨论" => NS_USER_TALK,
- # This has never worked so it's unlikely to annoy anyone if I disable it -- TS
- # "{$wgMetaNamespace} 討論" => NS_PROJECT_TALK,
- # "{$wgMetaNamespace} 讨论" => NS_PROJECT_TALK,
+ '$1_傾åˆ' => NS_PROJECT_TALK,
"檔" => NS_FILE,
"檔案" => NS_FILE,
"æ¡£" => NS_FILE,
@@ -68,6 +66,7 @@ $namespaceAliases = array(
"图 讨论" => NS_FILE_TALK,
"åœ–åƒ è¨Žè«–" => NS_FILE_TALK,
"å›¾åƒ è®¨è®º" => NS_FILE_TALK,
+ 'MediaWiki_傾åˆ' => NS_FILE_TALK,
"模 討論" => NS_TEMPLATE_TALK,
"模 讨论" => NS_TEMPLATE_TALK,
"幫助" => NS_HELP,
@@ -588,14 +587,13 @@ $1',
å¯èƒ½å·²ç¶“ç•€å¦ä¸€ä½åˆªå’—。',
'badtitle' => '錯嘅標題',
'badtitletext' => 'è¦æ±‚嘅標題唔啱ã€ç©ºç™½ï¼Œè·¨èªžè¨€æˆ–者跨維基連çµæ¨™é¡ŒéŒ¯èª¤ã€‚亦å¯èƒ½ä¿‚標題包括咗一個或多éŽä¸€å€‹å­—元。',
-'perfcached' => '以下嘅資料係嚟自快å–,å¯èƒ½å””係最新嘅。',
-'perfcachedts' => '以下嘅資料係嚟自快å–,上一次嘅更新喺$1。',
+'perfcached' => '以下嘅資料係嚟自快å–,å¯èƒ½å””係最新嘅。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => '以下嘅資料係嚟自快å–,上一次嘅更新喺$1。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => '響呢一é å˜…æ›´æ–°ç¾æ™‚åœç”¨ã€‚啲資料將唔會å³æ™‚更新。',
'wrong_wfQuery_params' => 'wfQuery() 嘅åƒæ•¸éŒ¯èª¤<br />
函數: $1<br />
查詢: $2',
'viewsource' => 'ç‡å“原始碼',
-'viewsourcefor' => '$1嘅原始碼',
'actionthrottled' => '動作已壓制',
'actionthrottledtext' => '基於å垃圾嘢嘅考é‡ï¼Œä½ è€Œå®¶éŸ¿å‘¢æ®µçŸ­æ™‚間之內é™åˆ¶å’—去åšå‘¢ä¸€å€‹å‹•ä½œï¼Œè€Œä½ å·²ç¶“超éŽå’—個上é™ã€‚請響幾分é˜ä¹‹å¾Œå†è©¦éŽã€‚',
'protectedpagetext' => '呢一é å·²ç¶“ä¿è­·å’—唔畀改。',
@@ -790,9 +788,6 @@ $1',
ä½ ç¾æ™‚用緊嘅 IP 地å€ä¿‚ $3,個å°éŽ– ID ä¿‚ #$5。 請喺你嘅查詢都註明呢個å°éŽ–上é¢å˜…資料。",
'blockednoreason' => '無原因畀低',
-'blockedoriginalsource' => "有關'''$1'''嘅原始碼響下é¢åˆ—示:",
-'blockededitsource' => "有關'''ä½ '''å°'''$1'''嘅'''編輯'''文字響下é¢åˆ—示:",
-'whitelistedittitle' => '需è¦ç™»å…¥ä¹‹å¾Œå…ˆè‡³å¯ä»¥ç·¨è¼¯',
'whitelistedittext' => '你需è¦$1去編輯呢é ã€‚',
'confirmedittext' => '你個電郵地å€è¦ç¢ºå®šå’—å…ˆå¯ä»¥ç·¨è¼¯ã€‚唔該先去[[Special:Preferences|喜好設定]]填咗電郵地å€ï¼Œä¸¦åšåŸ‹ç¢ºèªæ‰‹çºŒã€‚',
'nosuchsectiontitle' => 'æµå””到呢個å°ç¯€',
@@ -1041,8 +1036,6 @@ $1',
'revdelete-unsuppress' => '響已經æ¢å¾©å’—嘅修訂度移除é™åˆ¶',
'revdelete-log' => '原因:',
'revdelete-submit' => '應用到已經é¸å–嘅{{PLURAL:$1|修訂}}',
-'revdelete-logentry' => '已經更改《[[$1]]》嘅修訂å¯è¦‹æ€§',
-'logdelete-logentry' => '已經更改《[[$1]]》嘅事件å¯è¦‹æ€§',
'revdelete-success' => "'''已經æˆåŠŸè¨­å®šä¿®è¨‚嘅å¯è¦‹æ€§ã€‚'''",
'revdelete-failure' => "'''修訂å¯è¦‹æ€§æ›´æ–°å””到:'''
$1",
@@ -1054,15 +1047,6 @@ $1",
'revdel-restore-visible' => 'ç‡åˆ°å˜…修訂',
'pagehist' => 'é é¢æ­·å²',
'deletedhist' => '刪除咗嘅歷å²',
-'revdelete-content' => '內容',
-'revdelete-summary' => '編輯摘è¦',
-'revdelete-uname' => '用戶å',
-'revdelete-restricted' => '已經應用é™åˆ¶åˆ°æ“作員',
-'revdelete-unrestricted' => '已經拎走å°æ–¼æ“作員嘅é™åˆ¶',
-'revdelete-hid' => 'éš±è— $1',
-'revdelete-unhid' => 'å””éš±è— $1',
-'revdelete-log-message' => '$1嘅$2次修訂',
-'logdelete-log-message' => '$1嘅$2個事件',
'revdelete-hide-current' => 'éš±è—緊響$1 $2嘅項目錯誤:呢個係ç¾æ™‚嘅修訂,唔å¯ä»¥éš±è—。',
'revdelete-show-no-access' => '顯示緊響$1 $2嘅項目錯誤:呢個項目標示咗åš"é™åˆ¶å’—",你å°ä½¢ç„¡é€šè¡Œæ¬Šã€‚',
'revdelete-modify-no-access' => '改緊響$1 $2嘅項目錯誤:呢個項目標示咗åš"é™åˆ¶å’—",你å°ä½¢ç„¡é€šè¡Œæ¬Šã€‚',
@@ -1212,7 +1196,7 @@ $1",
'prefs-rc' => '最近更改',
'prefs-watchlist' => '監視清單',
'prefs-watchlist-days' => '監視清單嘅顯示日數:',
-'prefs-watchlist-days-max' => '最多 7 日',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'prefs-watchlist-edits' => '喺加強版監視清單度嘅最多顯示更改數:',
'prefs-watchlist-edits-max' => '最大數é‡ï¼š1000',
'prefs-watchlist-token' => '監視清單幣:',
@@ -1410,7 +1394,6 @@ $1",
'right-autopatrol' => '將自己嘅編輯自動標示åšå·²å·¡æŸ¥å˜…',
'right-patrolmarks' => '去ç‡æœ€è¿‘巡查標記更改',
'right-unwatchedpages' => '去ç‡æœªç›£è¦–嘅版',
-'right-trackback' => 'éžäº¤ä¸€å€‹trackback',
'right-mergehistory' => 'åˆä½µç‰ˆæ­·å²',
'right-userrights' => '編輯全部用戶嘅權é™',
'right-userrights-interwiki' => '編輯響其它wiki嘅用戶權é™',
@@ -1454,7 +1437,6 @@ $1",
'action-patrol' => '標示其它嘅編輯åšå·²å·¡æŸ¥å˜…',
'action-autopatrol' => '將你嘅編輯標示åšå·²å·¡æŸ¥å˜…',
'action-unwatchedpages' => 'ç‡æœªç•€äººç›£è¦–嘅版',
-'action-trackback' => 'éžäº¤ä¸€å€‹trackback',
'action-mergehistory' => 'åˆä½µå‘¢ç‰ˆå˜…æ­·å²',
'action-userrights' => '編輯全部嘅權é™',
'action-userrights-interwiki' => '編輯響其它wiki用戶嘅權é™',
@@ -1974,12 +1956,8 @@ Template:æžæ¸…楚',
'activeusers-noresult' => 'æµå””到用戶。',
# Special:Log/newusers
-'newuserlogpage' => '使用者開戶記錄',
-'newuserlogpagetext' => '呢個係一個使用者開戶嘅日誌',
-'newuserlog-byemail' => '密碼已由電郵寄出',
-'newuserlog-create-entry' => '新用戶戶å£',
-'newuserlog-create2-entry' => '已經開咗$1嘅新戶å£',
-'newuserlog-autocreate-entry' => '自動建立咗戶å£',
+'newuserlogpage' => '使用者開戶記錄',
+'newuserlogpagetext' => '呢個係一個使用者開戶嘅日誌',
# Special:ListGroupRights
'listgrouprights' => '用戶組權é™',
@@ -2113,8 +2091,6 @@ wiki: $PAGEEDITOR_WIKI
'actioncomplete' => 'æ“作完æˆ',
'actionfailed' => 'æ“作失敗',
'deletedtext' => '"$1"已經刪除。最近嘅刪除記錄請ç‡$2。',
-'deletedarticle' => '已經刪除"[[$1]]"',
-'suppressedarticle' => '已經廢止"[[$1]]"',
'dellogpage' => '刪除日誌',
'dellogpagetext' => '以下係最近嘅刪除清單。',
'deletionlog' => '刪除日誌',
@@ -2234,7 +2210,6 @@ wiki: $PAGEEDITOR_WIKI
'undeletereset' => 'é‡è¨­',
'undeleteinvert' => 'åé¸',
'undeletecomment' => '原因:',
-'undeletedarticle' => '已經救返"[[$1]]"',
'undeletedrevisions' => '$1個修訂已經救返',
'undeletedrevisions-files' => '$1個修訂åŒ$2個檔案已經救返',
'undeletedfiles' => '$1個檔案已經救返',
@@ -2484,9 +2459,6 @@ $1',
'movepage-page-moved' => '版$1已經æ¬åˆ°åŽ»$2。',
'movepage-page-unmoved' => '版$1å””å¯ä»¥æ¬åˆ°åŽ»$2。',
'movepage-max-pages' => '最多有$1版已經æ¬å’—åŒæ™‚å””å¯ä»¥è‡ªå‹•å™‰å†æ¬æ›´å¤šã€‚',
-'1movedto2' => '[[$1]]æ¬åˆ°åŽ»[[$2]]',
-'1movedto2_redir' => '[[$1]]通éŽè·³è½‰æ¬åˆ°åŽ»[[$2]]',
-'move-redirect-suppressed' => '跳轉已壓制',
'movelogpage' => '移動日誌',
'movelogpagetext' => '以下係全部æ¬éŽå˜…é é¢æ¸…單。',
'movesubpage' => '{{PLURAL:$1|ç´°é |ç´°é }}',
@@ -2758,9 +2730,6 @@ $1',
# Patrol log
'patrol-log-page' => '巡查日誌',
'patrol-log-header' => '呢個係已經巡查éŽå˜…日誌。',
-'patrol-log-line' => '已經標示咗$1/$2版åšå·²ç¶“巡查嘅$3',
-'patrol-log-auto' => '(自動)',
-'patrol-log-diff' => '修訂 $1',
'log-show-hide-patrol' => '$1巡查紀錄',
# Image deletion
@@ -2786,7 +2755,7 @@ $1',
'widthheightpage' => '$1 × $2, $3版',
'file-info' => '檔案大細:$1 ,MIME類型:$2',
'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大細:$3 ,MIME類型:$4',
-'file-nohires' => '<small>冇更高解åƒåº¦å˜…圖åƒã€‚</small>',
+'file-nohires' => '冇更高解åƒåº¦å˜…圖åƒã€‚',
'svg-long-desc' => 'SVG檔案,表é¢å¤§ç´°ï¼š $1 × $2 åƒç´ ï¼Œæª”案大細:$3',
'show-big-image' => '完整解åƒåº¦',
'file-info-gif-looped' => '循環',
@@ -3198,13 +3167,6 @@ $5
'scarytranscludefailed' => '[$1嘅頡å–模動作失敗]',
'scarytranscludetoolong' => '[URL 太長]',
-# Trackbacks
-'trackbackbox' => '呢一版嘅éŽåŽ»è¿½è¹¤ï¼š<br />
-$1',
-'trackbackremove' => '([$1 刪除])',
-'trackbacklink' => 'éŽåŽ»è¿½è¹¤',
-'trackbackdeleteok' => 'éŽåŽ»è¿½è¹¤å·²ç¶“æˆåŠŸå™‰æ¨£åˆªé™¤ã€‚',
-
# Delete conflict
'deletedwhileediting' => '警告:你寫緊文嗰陣,有用戶洗咗呢版ï¼',
'confirmrecreate' => "你寫緊文嗰陣,阿用戶 [[User:$1|$1]] ([[User talk:$1|talk]]) 洗咗呢一é ã€‚以下係佢個ç†ç”±ï¼š
@@ -3410,4 +3372,9 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅è²
'sqlite-has-fts' => '$1 有全文æœå°‹æ”¯æ´',
'sqlite-no-fts' => '$1 冇全文æœå°‹æ”¯æ´',
+# New logging system
+'revdelete-restricted' => '已經應用é™åˆ¶åˆ°æ“作員',
+'revdelete-unrestricted' => '已經拎走å°æ–¼æ“作員嘅é™åˆ¶',
+'newuserlog-byemail' => '密碼已由電郵寄出',
+
);
diff --git a/languages/messages/MessagesZa.php b/languages/messages/MessagesZa.php
index 5c54437b..3dc35f05 100644
--- a/languages/messages/MessagesZa.php
+++ b/languages/messages/MessagesZa.php
@@ -178,14 +178,13 @@ $messages = array(
'nologinlink' => 'Laeb bouxdeiz',
# Edit pages
-'summary' => 'Saegmangj:',
-'minoredit' => 'Di-nej gaij noix',
-'watchthis' => 'Gamyawj yieb neix',
-'savearticle' => 'Zonzdiuz mae-nej',
-'showpreview' => 'Okqhaej piu-ngoengx',
-'showdiff' => 'Okqhaej gaeqgaei',
-'whitelistedittitle' => 'Laezdiuz haeuj aiq naej san-zonz',
-'newarticle' => '(Moq)',
+'summary' => 'Saegmangj:',
+'minoredit' => 'Di-nej gaij noix',
+'watchthis' => 'Gamyawj yieb neix',
+'savearticle' => 'Zonzdiuz mae-nej',
+'showpreview' => 'Okqhaej piu-ngoengx',
+'showdiff' => 'Okqhaej gaeqgaei',
+'newarticle' => '(Moq)',
# Diffs
'editundo' => 'siu',
@@ -307,7 +306,6 @@ $messages = array(
'move-watch' => 'Demq mae-nej',
'movepagebtn' => 'Caen doengh mae',
'movedto' => 'Caen bei',
-'1movedto2' => '[[$1]] caen bei [[$2]]',
'movereason' => 'Haujgaemj',
'revertmove' => 'siu',
diff --git a/languages/messages/MessagesZea.php b/languages/messages/MessagesZea.php
index 4c73d61e..a2d3dbc6 100644
--- a/languages/messages/MessagesZea.php
+++ b/languages/messages/MessagesZea.php
@@ -391,14 +391,13 @@ Maek hiervon maldienge bie 'n [[Special:ListUsers/sysop|beheêrder]] von {{SITEN
'cannotdelete' => "Kan de bladzie of 't bestand nie wisse. Misschien is 't a deu iemand aors gewist.",
'badtitle' => 'Verkeerde titel',
'badtitletext' => "De bladzie die-a je angevrogen ei was ongeldig, leeg, of fout gelinkt vanuut 'n aore wiki. Mischien stae d'r eên of meer teêkens in die-an nie in titels gebruukt kunne ore.",
-'perfcached' => "De hehevens komm'n uut een cache en zien meuhlijk nie actueel.",
-'perfcachedts' => "De hehevens komm'n uut een cache en zien voe 't lèst biehewerkt op $1.",
+'perfcached' => "De hehevens komm'n uut een cache en zien meuhlijk nie actueel. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+'perfcachedts' => "De hehevens komm'n uut een cache en zien voe 't lèst biehewerkt op $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
'querypage-no-updates' => 'Deêze pagina kan nie biehewerkt worn. Deêze hehevens worn nie ververst.',
'wrong_wfQuery_params' => 'Foute parameters voe wfQuery()<br />
Functie: $1<br />
Zoekopdracht: $2',
'viewsource' => 'brontekst bekieken',
-'viewsourcefor' => 'vò $1',
'actionthrottled' => 'Handelienge tehenehouwen',
'actionthrottledtext' => "As maetrehel tehen spam is 't antal keern per tiedseêneid da je deêze handelienge kan verrichen beperkt.
De limiet is overschreeën.
@@ -564,9 +563,6 @@ Je kan hin gebruuk maeken van de functie 'e-mail deêze gebruker', tenzie a je e
Je blokkaodenummer is #$5.
Vermeld dat a je erhens over deêze blokkaode wil reaheern.",
'blockednoreason' => 'hin reeën opeheven',
-'blockedoriginalsource' => "De brontekst van '''$1''' staet ieronder:",
-'blockededitsource' => "D'n tekst van '''joen biedragen''' an '''$1''' staet ieronder:",
-'whitelistedittitle' => 'Voe bewerken is anmelden verplicht',
'whitelistedittext' => "Je mò $1 om pagina's te bewerken.",
'confirmedittext' => "Je mò jen e-mailadres bevestihen voe da je kan bewerken.
Voer jen e-mailadres in en bevestig 't via [[Special:Preferences|je vòkeuren]].",
@@ -756,8 +752,6 @@ Aore opzichters van {{SITENAME}} kunn'n de verborhen inoud benadern en de verwie
'revdelete-unsuppress' => 'Beperkiengen op terugezette wiezigiengen verwiederen',
'revdelete-log' => 'Opmerkieng in logboek:',
'revdelete-submit' => 'Toepassen op de hesillecteerde bewerkieng',
-'revdelete-logentry' => 'zichbaereid van bewerkiengen is ewiezigd voe [[$1]]',
-'logdelete-logentry' => 'wiezigen zichbaereid van hebeurtenis [[$1]]',
'revdelete-success' => "'''Zichbaereid van de wiezigieng succesvol inesteld.'''",
'logdelete-success' => "'''Zichbaereid van de hebeurtenisse succesvol inesteld.'''",
'revdel-restore' => 'Zichbaereid wiezigen',
@@ -765,15 +759,6 @@ Aore opzichters van {{SITENAME}} kunn'n de verborhen inoud benadern en de verwie
'revdel-restore-visible' => 'zichtbaere versies',
'pagehist' => 'Paginaheschiedenisse',
'deletedhist' => 'Verwiederde heschiedenisse',
-'revdelete-content' => 'inoud',
-'revdelete-summary' => 'saemenvattieng bewerken',
-'revdelete-uname' => 'gebrukersnaem',
-'revdelete-restricted' => 'ei beperkiengen an beheêrders opeleid',
-'revdelete-unrestricted' => 'ei beperkiengen voe beheêrders opeheven',
-'revdelete-hid' => 'ei $1 verborhen',
-'revdelete-unhid' => 'ei $1 zichbaer emikt',
-'revdelete-log-message' => '$1 voe $2 {{PLURAL:$2|versie|versies}}',
-'logdelete-log-message' => '$1 voe $2 {{PLURAL:$2|logboekrehel|logboekrehels}}',
# Suppression log
'suppressionlog' => 'Verberhiengslogboek',
@@ -1093,6 +1078,7 @@ De [$2 pagina mè de bestandsbeschrievienge] wòdt hieronder weergegeev'n.",
'prefixindex' => "Alle pagina's op vòvoegsel",
'longpages' => 'Langste bladzies',
'listusers' => 'Gebrukerslieste',
+'usercreated' => '{{GENDER:$3|Geregistreerd}} op $1 om $2',
'newpages' => "Nieuwe pagina's",
'newpages-username' => 'Gebrukersnaem:',
'ancientpages' => 'Bladzies die-an lang nie bin angepast',
@@ -1137,8 +1123,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'linksearch-line' => "$1 ei 'n verwiezienge in $2",
# Special:Log/newusers
-'newuserlogpage' => 'Logboek nuwe gebrukers',
-'newuserlog-create-entry' => 'Nieuwe gebruker',
+'newuserlogpage' => 'Logboek nuwe gebrukers',
# Special:ListGroupRights
'listgrouprights-members' => '(ledenlieste)',
@@ -1169,7 +1154,6 @@ A je de bladzie laeter weêr van je volglieste afaele wil, klik dan op \"nie meÃ
# Delete
'actioncomplete' => 'Actie uutgevoerd',
'actionfailed' => 'De handelienge is mislukt.',
-'deletedarticle' => 'wiste "[[$1]]"',
'dellogpage' => 'Wislogboek',
# Rollback
@@ -1263,8 +1247,6 @@ Ziet de [[Special:BlockList|Lieste van ip-blokkeriengen]] vò blokkaodes die op
'articleexists' => "D'r bestaet al 'n bladzie mee dieën naem, of de naem
die-a je gekozen is is ongeldeg.
Kiest 'n aore naem.",
-'1movedto2' => '[[$1]] is verschove nae [[$2]]',
-'1movedto2_redir' => '[[$1]] is verschove nae [[$2]] over de deurverwiezienge',
'movelogpage' => 'Hernoemingslogboek',
'revertmove' => 'terugdraejen',
@@ -1343,6 +1325,7 @@ Kiest 'n aore naem.",
# Media information
'file-info-size' => '$1 × $2 pixels, bestandsgroôtte: $3, MIME-type: $4',
+'file-nohires' => "Hin 'oôgere resolutie beschikbaer",
'svg-long-desc' => 'SVG-bestand, nominaal $1 × $2 pixels, bestandshroôtte: $3',
'show-big-image' => 'Volledige resolutie',
@@ -1420,4 +1403,8 @@ Aorre veld'n worr'n verborr'n.
# Special:Tags
'tag-filter' => '[[Special:Tags|Labelfilter]]:',
+# New logging system
+'revdelete-restricted' => 'ei beperkiengen an beheêrders opeleid',
+'revdelete-unrestricted' => 'ei beperkiengen voe beheêrders opeheven',
+
);
diff --git a/languages/messages/MessagesZh.php b/languages/messages/MessagesZh.php
index 49d30a7b..3572e301 100644
--- a/languages/messages/MessagesZh.php
+++ b/languages/messages/MessagesZh.php
@@ -184,9 +184,6 @@ $messages = array(
# Miscellaneous special pages
'newpages' => '最新页é¢',
-# Move page
-'move-redirect-suppressed' => 'å·²ç¦æ­¢é‡æ–°å®šå‘',
-
/*
Short names for language variants used for language conversion links.
To disable showing a particular link, set it to 'disable', e.g.
diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php
index 7268530e..94cf24eb 100644
--- a/languages/messages/MessagesZh_hans.php
+++ b/languages/messages/MessagesZh_hans.php
@@ -11,13 +11,16 @@
* @author Anakmalaysia
* @author Bencmq
* @author Biŋhai
+ * @author Breawycker
* @author Chenxiaoqino
* @author Chenzw
* @author Chinalace
+ * @author Dingyuang
* @author Fantasticfears
* @author Franklsf95
* @author Gaoxuewei
* @author Gzdavidwong
+ * @author Happy
* @author Hercule
* @author Horacewai2
* @author Hydra
@@ -31,6 +34,7 @@
* @author Liangent
* @author Mark85296341
* @author MarkAHershberger
+ * @author Mys 721tx
* @author O
* @author Onecountry
* @author PhiLiP
@@ -41,6 +45,7 @@
* @author Wilsonmess
* @author Wmr89502270
* @author Wong128hk
+ * @author Wrightbus
* @author Xiaomingyan
* @author Yfdyh000
* @author 阿pp
@@ -125,7 +130,7 @@ $specialPageAliases = array(
'FileDuplicateSearch' => array( 'æœç´¢é‡å¤æ–‡ä»¶' ),
'Filepath' => array( '文件路径' ),
'Import' => array( '导入页é¢' ),
- 'Invalidateemail' => array( 'ä¸å¯è¯†åˆ«çš„电邮地å€' ),
+ 'Invalidateemail' => array( '无效电邮地å€' ),
'BlockList' => array( 'å°ç¦åˆ—表' ),
'LinkSearch' => array( 'æœç´¢ç½‘页链接' ),
'Listadmins' => array( '管ç†å‘˜åˆ—表' ),
@@ -198,27 +203,27 @@ $specialPageAliases = array(
);
$magicWords = array(
- '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', '本月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', '本月1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', '本月å称', 'CURRENTMONTHNAME' ),
- 'currentmonthabbrev' => array( '1', '本月简称', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', '今天', 'CURRENTDAY' ),
- 'currentday2' => array( '1', '今天2', 'CURRENTDAY2' ),
- 'currentyear' => array( '1', '今年', 'CURRENTYEAR' ),
- 'numberofpages' => array( '1', '页数', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'æ¡ç›®æ•°', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', '文件数', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', '用户数', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', '活跃用户数', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', '编辑数', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', '访问数', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', '页å', 'PAGENAME' ),
+ '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', '本月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', '本月1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', '本月å称', 'CURRENTMONTHNAME' ),
+ 'currentmonthabbrev' => array( '1', '本月简称', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', '今天', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', '今天2', 'CURRENTDAY2' ),
+ 'currentyear' => array( '1', '今年', 'CURRENTYEAR' ),
+ 'numberofpages' => array( '1', '页数', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'æ¡ç›®æ•°', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', '文件数', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', '用户数', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', '活跃用户数', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', '编辑数', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', '访问数', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', '页å', 'PAGENAME' ),
);
$linkTrail = '/^()(.*)$/sD';
@@ -602,20 +607,22 @@ $1',
'badarticleerror' => '无法在此页进行该æ“作。',
'cannotdelete' => '无法删除页é¢æˆ–å›¾åƒ "$1"。
它å¯èƒ½å·²è¢«å…¶ä»–人删除了。',
+'cannotdelete-title' => '无法删除“$1â€',
'badtitle' => '错误的标题',
'badtitletext' => '所请求页é¢çš„标题是无效的ã€ä¸å­˜åœ¨ï¼Œè·¨è¯­è¨€æˆ–è·¨wiki链接的标题错误。它å¯èƒ½åŒ…å«ä¸€ä¸ªæˆ–更多的ä¸èƒ½ç”¨äºŽæ ‡é¢˜çš„字符。',
-'perfcached' => '下列是缓存数æ®ï¼Œå› æ­¤å¯èƒ½ä¸æ˜¯æœ€æ–°çš„:',
-'perfcachedts' => '下列是缓存数æ®ï¼Œå…¶æœ€åŽæ›´æ–°æ—¶é—´æ˜¯$1。',
+'perfcached' => '下列数æ®å·²ç¼“存,但å¯èƒ½å·²è¿‡æ—¶ã€‚最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中å¯ç”¨ã€‚',
+'perfcachedts' => '下列数æ®å·²ç¼“存,它们最åŽæ›´æ–°åœ¨$1。最高{{PLURAL:$4|一个结果|$4个结果}}在缓存中å¯ç”¨ã€‚ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => '当å‰ç¦æ­¢å¯¹æ­¤é¡µé¢è¿›è¡Œæ›´æ–°ã€‚此处的数æ®å°†ä¸èƒ½è¢«ç«‹å³åˆ·æ–°ã€‚',
'wrong_wfQuery_params' => '错误的å‚数被传递到 wfQuery()<br />
函数:$1<br />
查询:$2',
'viewsource' => '查看æºä»£ç ',
-'viewsourcefor' => '$1çš„æºä»£ç ',
+'viewsource-title' => '查看$1çš„æºä»£ç ',
'actionthrottled' => 'æ“作被é™åˆ¶',
'actionthrottledtext' => '基于å垃圾链接的考é‡ï¼Œæ‚¨è¢«é™åˆ¶åœ¨çŸ­æ—¶é—´å†…多次é‡å¤è¯¥æ“作,但您已超过此上é™ã€‚请在数分钟åŽå†å°è¯•ã€‚',
'protectedpagetext' => '该页é¢å·²è¢«ä¿æŠ¤ä»¥é˜²æ­¢ç¼–辑。',
'viewsourcetext' => '您å¯ä»¥æŸ¥çœ‹å¹¶å¤åˆ¶æ­¤é¡µé¢çš„æºä»£ç ï¼š',
+'viewyourtext' => "您å¯ä»¥æŸ¥çœ‹å¹¶å¤åˆ¶'''您对此页é¢ä½œå‡ºç¼–辑åŽ'''çš„æºä»£ç ï¼š",
'protectedinterface' => '该页æ供了软件的界é¢æ–‡æœ¬ï¼Œå®ƒå·²è¢«ä¿æŠ¤ä»¥é˜²æ­¢éšæ„的修改。',
'editinginterface' => "'''警告:''' 您正在编辑的页é¢æ˜¯ç”¨äºŽæ供软件的界é¢æ–‡æœ¬ã€‚改å˜æ­¤é¡µå°†å½±å“其他用户的界é¢å¤–观。如è¦ç¿»è¯‘,请考虑使用[//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],一个用æ¥ä¸ºMediaWiki软件本地化的计划。",
'sqlhidden' => '(SQL查询已éšè—)',
@@ -704,6 +711,7 @@ $2',
'noemailprefs' => '指定一个电å­é‚®ç®±åœ°å€ä»¥ä½¿ç”¨æ­¤åŠŸèƒ½ã€‚',
'emailconfirmlink' => '确认您的邮箱地å€',
'invalidemailaddress' => '邮箱地å€æ ¼å¼ä¸æ­£ç¡®ï¼Œè¯·è¾“入正确的邮箱地å€æˆ–清空该输入框。',
+'cannotchangeemail' => '本wikiä¸å…许对账户的电å­é‚®ä»¶åœ°å€è¿›è¡Œæ›´æ”¹ã€‚',
'accountcreated' => '已建立账户',
'accountcreatedtext' => '$1的账户已ç»è¢«åˆ›å»ºã€‚',
'createaccount-title' => '在{{SITENAME}}中创建新账户',
@@ -719,6 +727,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
+'user-mail-no-addy' => 'å°è¯•å‘é€é‚®ä»¶è€Œä¸é™„带电å­é‚®ä»¶åœ°å€ã€‚',
# Change password dialog
'resetpass' => '更改密ç ',
@@ -738,28 +747,44 @@ $2',
'resetpass-temp-password' => '临时密ç ï¼š',
# Special:PasswordReset
-'passwordreset' => 'é‡ç½®å¯†ç ',
-'passwordreset-text' => '完æˆæ­¤è¡¨æ ¼ä»¥æŽ¥æ”¶ä¸€ä¸ªç”µé‚®ä»¥æ示你的å¸æˆ·è¯¦æƒ…。',
-'passwordreset-legend' => 'é‡ç½®å¯†ç ',
-'passwordreset-disabled' => 'æ­¤wikiå·²ç»ç¦ç”¨å¯†ç é‡ç½®ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下é¢çš„æ•°æ®å—之一}}',
-'passwordreset-username' => '用户å:',
-'passwordreset-domain' => '域:',
-'passwordreset-email' => '电å­é‚®ä»¶åœ°å€ï¼š',
-'passwordreset-emailtitle' => '在 {{SITENAME}} çš„å¸æˆ·è¯¦ç»†ä¿¡æ¯',
-'passwordreset-emailtext-ip' => '有人通过IPåœ°å€ $1 (也许是你)è¦æ±‚èŽ·å– {{SITENAME}} ($4)上相关账户的密ç æ示。{{PLURAL:$3|以下账户|此账户}}与该email地å€å…³è”:
+'passwordreset' => 'é‡ç½®å¯†ç ',
+'passwordreset-text' => '完æˆæ­¤è¡¨æ ¼ä»¥æŽ¥æ”¶ä¸€ä¸ªç”µé‚®ä»¥æ示你的å¸æˆ·è¯¦æƒ…。',
+'passwordreset-legend' => 'é‡ç½®å¯†ç ',
+'passwordreset-disabled' => 'æ­¤wikiå·²ç»ç¦ç”¨å¯†ç é‡ç½®ã€‚',
+'passwordreset-pretext' => '{{PLURAL:$1||输入下é¢çš„æ•°æ®å—之一}}',
+'passwordreset-username' => '用户å:',
+'passwordreset-domain' => '域:',
+'passwordreset-capture' => '查看生æˆçš„电å­é‚®ä»¶å—?',
+'passwordreset-capture-help' => '如果您选中此框,电å­é‚®ä»¶ï¼ˆåŒ…括临时密ç ï¼‰å°†æ˜¾ç¤ºï¼Œå¹¶å‘é€ç»™ç”¨æˆ·ã€‚',
+'passwordreset-email' => '电å­é‚®ä»¶åœ°å€ï¼š',
+'passwordreset-emailtitle' => '在 {{SITENAME}} çš„å¸æˆ·è¯¦ç»†ä¿¡æ¯',
+'passwordreset-emailtext-ip' => '有人通过IPåœ°å€ $1 (也许是你)è¦æ±‚èŽ·å– {{SITENAME}} ($4)上相关账户的密ç æ示。{{PLURAL:$3|以下账户|此账户}}与该email地å€å…³è”:
$2
{{PLURAL:$3|这个|这些}}临时密ç ä¼šåœ¨{{PLURAL:$5|一天|$5 天}}内过期。请现在登入并设置新的密ç ã€‚如果请求是其他人æ出的,或者您记起你的旧密ç å¹¶ä¸å†éœ€è¦æ›´æ”¹ï¼Œæ‚¨å¯ä»¥æ— è§†æœ¬æ¡æ¶ˆæ¯å¹¶ç»§ç»­ä½¿ç”¨æ—§æœ‰å¯†ç ã€‚',
-'passwordreset-emailtext-user' => '用户 $1 è¦æ±‚èŽ·å– {{SITENAME}} ($4)上你的账户的密ç æ示。{{PLURAL:$3|以下账户|此账户}}与该email地å€å…³è”:
+'passwordreset-emailtext-user' => '用户 $1 è¦æ±‚èŽ·å– {{SITENAME}} ($4)上你的账户的密ç æ示。{{PLURAL:$3|以下账户|此账户}}与该email地å€å…³è”:
$2
{{PLURAL:$3|这个|这些}}临时密ç ä¼šåœ¨{{PLURAL:$5|一天|$5 天}}内过期。请现在登入并设置新的密ç ã€‚如果请求是其他人æ出的,或者您记起你的旧密ç å¹¶ä¸å†éœ€è¦æ›´æ”¹ï¼Œæ‚¨å¯ä»¥æ— è§†æœ¬æ¡æ¶ˆæ¯å¹¶ç»§ç»­ä½¿ç”¨æ—§æœ‰å¯†ç ã€‚',
-'passwordreset-emailelement' => '用户å:$1
+'passwordreset-emailelement' => '用户å:$1
临时密ç ï¼š$2',
-'passwordreset-emailsent' => 'å·²å‘é€æ醒电å­é‚®ä»¶ã€‚',
+'passwordreset-emailsent' => 'å·²å‘é€æ醒电å­é‚®ä»¶ã€‚',
+'passwordreset-emailsent-capture' => 'æ醒电å­é‚®ä»¶å·²å‘é€ï¼Œå¹¶åœ¨ä¸‹é¢æ˜¾ç¤ºã€‚',
+'passwordreset-emailerror-capture' => '生æˆçš„æ醒电å­é‚®ä»¶å¦‚下所示,但å‘é€å¤±è´¥ï¼š$1',
+
+# Special:ChangeEmail
+'changeemail' => '更改电å­é‚®ä»¶åœ°å€',
+'changeemail-header' => '更改å¸æˆ·çš„电å­é‚®ä»¶åœ°å€',
+'changeemail-text' => '完æˆæ­¤çª—体å¯ä»¥æ›´æ”¹æ‚¨çš„电å­é‚®ä»¶åœ°å€ã€‚您将需è¦è¾“入您的密ç ä»¥ç¡®è®¤æ­¤æ›´æ”¹ã€‚',
+'changeemail-no-info' => '
+您必须登录以直接访问本页。',
+'changeemail-oldemail' => '当å‰çš„电å­é‚®ä»¶åœ°å€ï¼š',
+'changeemail-newemail' => '新的电å­é‚®ä»¶åœ°å€ï¼š',
+'changeemail-none' => '(无)',
+'changeemail-submit' => '更改电å­é‚®ç®±',
+'changeemail-cancel' => 'å–消',
# Edit page toolbar
'bold_sample' => '粗体文字',
@@ -817,9 +842,6 @@ $2
您å¯ä»¥è”ç³»$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管ç†å‘˜]]讨论此次å°ç¦ã€‚若您已在[[Special:Preferences|å¸å·è®¾ç½®]]中é…置了一个有效的电å­é‚®ä»¶åœ°å€ï¼Œä¸”未被å°ç¦ç”µå­é‚®ä»¶åŠŸèƒ½ï¼Œåˆ™æ‚¨å¯é€šè¿‡â€œå‘é€ç”µå­é‚®ä»¶ç»™è¿™ä½ç”¨æˆ·â€åŠŸèƒ½æ¥è”络相关管ç†å‘˜ã€‚您当å‰çš„IP地å€æ˜¯$3,此次å°ç¦çš„ID为#$5。请在您的查询中注明上述所有信æ¯ã€‚",
'blockednoreason' => '无给出原因',
-'blockedoriginalsource' => "以下是'''$1'''çš„æºç ï¼š",
-'blockededitsource' => "你对'''$1'''进行'''编辑'''的文字如下:",
-'whitelistedittitle' => '登录åŽæ‰å¯ç¼–辑',
'whitelistedittext' => '您必须先$1æ‰å¯ç¼–辑页é¢ã€‚',
'confirmedittext' => '你必须确认你的电å­é‚®ä»¶åœ°å€æ‰èƒ½ç¼–辑本页。请通过[[Special:Preferences|用户资料设置]]设置并确认你的电å­é‚®ä»¶åœ°å€ã€‚',
'nosuchsectiontitle' => '没有这个段è½',
@@ -895,7 +917,8 @@ $2
如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£å¸ƒï¼Œè¯·ä¸è¦æ交。<br />
您åŒæ—¶ä¹Ÿè¦å‘我们ä¿è¯æ‚¨æ‰€æ交的内容是您自己所作,或得自一个ä¸å—版æƒä¿æŠ¤æˆ–相似自由的æ¥æºï¼ˆå‚阅$1的细节)。
'''ä¸è¦åœ¨æœªèŽ·æŽˆæƒçš„情况下å‘表ï¼'''",
-'longpageerror' => "'''错误:您所æ交的文本长度有$1KB,这大于$2KB的最大值。'''该文本ä¸èƒ½è¢«ä¿å­˜ã€‚",
+'longpageerror' => "'''错误:您所æ交的文本长度有{{PLURAL:$1|1|$1}}KB,这大于{{PLURAL:$2|1|$2}}KB的最大值。'''
+因此,该文本无法ä¿å­˜ã€‚",
'readonlywarning' => "'''警告:数æ®åº“被é”定以进行维护,所以您目å‰å°†æ— æ³•ä¿å­˜æ‚¨çš„修改。'''您或许希望将本段文字先å¤åˆ¶å¹¶ä¿å­˜åˆ°æ–‡æœ¬æ–‡ä»¶ï¼Œå¹¶åœ¨ç¨åŽè¿›è¡Œä¿®æ”¹ã€‚
é”定数æ®åº“的管ç†å‘˜æœ‰å¦‚下解释:$1",
@@ -1043,8 +1066,6 @@ $3çš„ç†ç”±æ˜¯''$2''",
'revdelete-unsuppress' => '在已æ¢å¤çš„修订中移除é™åˆ¶',
'revdelete-log' => '原因:',
'revdelete-submit' => '应用于选中的{{PLURAL:$1|修订}}',
-'revdelete-logentry' => '“[[$1]]â€çš„修订å¯è§æ€§å·²æ›´æ”¹',
-'logdelete-logentry' => '“[[$1]]â€çš„事件å¯è§æ€§å·²æ›´æ”¹',
'revdelete-success' => "'''修订的å¯è§æ€§å·²ç»æˆåŠŸæ›´æ–°ã€‚'''",
'revdelete-failure' => "'''修订的å¯è§æ€§æ— æ³•æ›´æ–°ï¼š'''
$1",
@@ -1056,15 +1077,6 @@ $1",
'revdel-restore-visible' => 'å¯è§çš„版本',
'pagehist' => '页é¢åŽ†å²',
'deletedhist' => '已删除历å²',
-'revdelete-content' => '内容',
-'revdelete-summary' => '编辑摘è¦',
-'revdelete-uname' => '用户å',
-'revdelete-restricted' => '已将é™åˆ¶åº”用到管ç†å‘˜',
-'revdelete-unrestricted' => '已移除对管ç†å‘˜çš„é™åˆ¶',
-'revdelete-hid' => 'éšè— $1',
-'revdelete-unhid' => 'ä¸éšè— $1',
-'revdelete-log-message' => '$1的$2次修订',
-'logdelete-log-message' => '$1的$2项事件',
'revdelete-hide-current' => '正在éšè—于$1 $2之项目错误:这个是现时的修订,ä¸å¯ä»¥éšè—。',
'revdelete-show-no-access' => '正在显示于$1 $2之项目错误:这个项目已ç»æ ‡ç¤ºä¸º"å·²é™åˆ¶",您对它并无通行æƒã€‚',
'revdelete-modify-no-access' => '正在更改于$1 $2之项目错误:这个项目已ç»æ ‡ç¤ºä¸º"å·²é™åˆ¶",您对它并无通行æƒã€‚',
@@ -1214,12 +1226,14 @@ $1",
'prefs-rc' => '最近更改',
'prefs-watchlist' => '监视列表',
'prefs-watchlist-days' => '监视列表中显示的天数:',
-'prefs-watchlist-days-max' => '最多7天',
+'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
'prefs-watchlist-edits' => '扩展监视列表中显示的最大更改数:',
'prefs-watchlist-edits-max' => '最大数é‡ï¼š1000',
'prefs-watchlist-token' => '监视列表æƒæ ‡ï¼š',
'prefs-misc' => '其他',
'prefs-resetpass' => '更改密ç ',
+'prefs-changeemail' => '更改电å­é‚®ä»¶åœ°å€',
+'prefs-setemail' => '设置电å­é‚®ä»¶åœ°å€',
'prefs-email' => '电å­é‚®ä»¶é€‰é¡¹',
'prefs-rendering' => '显示',
'saveprefs' => 'ä¿å­˜',
@@ -1276,6 +1290,7 @@ $1",
'yourrealname' => '真实姓å:',
'yourlanguage' => '语言:',
'yourvariant' => '内容语言å˜ç§ï¼š',
+'prefs-help-variant' => '您希望用于显示本站内容的语ç§æˆ–拼写语系。',
'yournick' => 'æ–°ç­¾å:',
'prefs-help-signature' => '在讨论页上的å‘言应该使用“<nowiki>~~~~</nowiki>â€ç­¾å,它会被自动转æ¢æˆä½ çš„ç­¾å并附带时间戳。',
'badsig' => '错误的原始签å。请检查HTML标签。',
@@ -1316,7 +1331,7 @@ $1",
'userrights-lookup-user' => '管ç†ç”¨æˆ·ç»„',
'userrights-user-editname' => '输入用户å:',
'editusergroup' => '编辑用户组',
-'editinguser' => "正在更改用户'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) 的用户æƒé™",
+'editinguser' => "更改用户'''[[User:$1|$1]]'''的用户æƒé™$2",
'userrights-editusergroup' => '编辑用户组',
'saveusergroups' => 'ä¿å­˜ç”¨æˆ·ç»„',
'userrights-groupsmember' => '用户组:',
@@ -1410,13 +1425,13 @@ $1",
'right-autopatrol' => '将自己的编辑自动标示为已巡查的',
'right-patrolmarks' => '查看最近巡查标记更改',
'right-unwatchedpages' => '查看未监视页é¢åˆ—表',
-'right-trackback' => 'æ交trackback',
'right-mergehistory' => 'åˆå¹¶é¡µé¢åŽ†å²',
'right-userrights' => '编辑所有用户的æƒé™',
'right-userrights-interwiki' => '编辑在其它wiki上的用户æƒé™',
'right-siteadmin' => 'é”定和解除é”定数æ®åº“',
'right-override-export-depth' => '导出å«æœ‰äº”层深度链接页é¢ä¹‹é¡µé¢',
'right-sendemail' => 'å‘电å­é‚®ä»¶ç»™å…¶ä»–用户',
+'right-passwordreset' => '查看é‡ç½®å¯†ç é‚®ä»¶',
# User rights log
'rightslog' => '用户æƒé™æ—¥å¿—',
@@ -1450,16 +1465,17 @@ $1",
'action-suppressionlog' => '查看这个ç§æœ‰æ—¥å¿—',
'action-block' => 'å°é”è¿™ä½ç”¨æˆ·çš„编辑',
'action-protect' => '更改这个页é¢çš„ä¿æŠ¤ç­‰çº§',
+'action-rollback' => '快速回退最åŽå¯¹ç‰¹å®šé¡µé¢ä½œå‡ºçš„编辑的用户的所有编辑',
'action-import' => 'ç”±å¦ä¸€ä¸ªwiki导入这个页é¢',
'action-importupload' => '由一个文件上传中导入这个页é¢',
'action-patrol' => '标示其它的编辑为已巡查的',
'action-autopatrol' => '将您的编辑标示为已巡查的',
'action-unwatchedpages' => '查看未监视页é¢åˆ—表',
-'action-trackback' => 'æ交trackback',
'action-mergehistory' => 'åˆå¹¶è¿™ä¸ªé¡µé¢çš„历å²',
'action-userrights' => '编辑所有的æƒé™',
'action-userrights-interwiki' => '编辑在其它wiki上用户的æƒé™',
'action-siteadmin' => 'é”定和解除é”定数æ®åº“',
+'action-sendemail' => 'å‘é€ç”µé‚®',
# Recent changes
'nchanges' => '$1次更改',
@@ -1491,6 +1507,7 @@ $1",
'number_of_watching_users_pageview' => '[$1个关注用户]',
'rc_categories' => '分类界é™ï¼ˆä»¥â€œ|â€åˆ†å‰²ï¼‰',
'rc_categories_any' => 'ä»»æ„',
+'rc-change-size-new' => '更改åŽ$1字节',
'newsectionsummary' => '/* $1 */ 新段è½',
'rc-enhanced-expand' => '显示细节(需JavaScript支æŒï¼‰',
'rc-enhanced-hide' => 'éšè—细节',
@@ -1544,6 +1561,7 @@ $1",
'ignorewarnings' => '忽略所有警告',
'minlength1' => '文件å至少è¦æœ‰ä¸€ä¸ªå­—符。',
'illegalfilename' => '文件å“$1â€åŒ…å«åœ¨é¡µé¢æ ‡é¢˜ä¸­ä¸å…许使用的字符。请é‡å‘½å该文件,然åŽé‡æ–°ä¸Šä¼ ã€‚',
+'filename-toolong' => '文件åä¸èƒ½è¶…过240字节。',
'badfilename' => '文件å已被改为“$1â€ã€‚',
'filetype-mime-mismatch' => '文件扩展å“.$1â€ä¸Žæ£€æµ‹åˆ°çš„文件MIME类型($2)ä¸åŒ¹é…。',
'filetype-badmime' => '“$1â€ç±»åž‹çš„文件已被ç¦æ­¢ä¸Šä¼ ã€‚',
@@ -1631,6 +1649,41 @@ $1',
'upload-unknown-size' => '未知大å°',
'upload-http-error' => 'å‘生HTTP错误:$1',
+# File backend
+'backend-fail-stream' => '无法æµä¼ é€æ–‡ä»¶$1。',
+'backend-fail-backup' => '无法备份文件$1。',
+'backend-fail-notexists' => 'æ¡ç›®$1ä¸å­˜åœ¨ã€‚',
+'backend-fail-hashes' => '比较无法获å–文件hashes',
+'backend-fail-notsame' => '$1已存在ä¸åŒçš„文件。',
+'backend-fail-invalidpath' => '$1ä¸æ˜¯æœ‰æ•ˆçš„存储路径。',
+'backend-fail-delete' => '无法删除文件“$1â€ã€‚',
+'backend-fail-alreadyexists' => '“$1â€é¡µé¢å·²å­˜åœ¨',
+'backend-fail-store' => '无法在$2存储文件$1。',
+'backend-fail-copy' => '无法å¤åˆ¶æ–‡ä»¶$1到$2。',
+'backend-fail-move' => '无法移动文件$1到$2。',
+'backend-fail-opentemp' => '无法打开临时文件。',
+'backend-fail-writetemp' => '无法写临时文件。',
+'backend-fail-closetemp' => '无法创建临时文件。',
+'backend-fail-read' => '找ä¸åˆ°æ–‡ä»¶â€œ$1â€ã€‚',
+'backend-fail-create' => '找ä¸åˆ°æ–‡ä»¶â€œ$1â€ã€‚',
+'backend-fail-readonly' => '“$1â€å­˜å‚¨åŽç«¯ç›®å‰åœ¨åªè¯»æ¨¡å¼ï¼Œå› ä¸ºï¼šâ€œ$2â€',
+'backend-fail-synced' => '文件“$1â€åœ¨å†…部åŽç«¯æ˜¯ä¸ä¸€è‡´çš„区域。',
+'backend-fail-connect' => '无法连接到文件åŽç«¯â€œ$1â€ã€‚',
+'backend-fail-internal' => '文件åŽç«¯â€œ$1â€å‘生了一个未知错误。',
+'backend-fail-contenttype' => '无法判断文件的内容类型æ¥å‚¨å­˜äºŽâ€œ$1â€ã€‚',
+'backend-fail-batchsize' => '鉴于一批åŽç«¯ $1 文件 {{PLURAL:$1| operation|operations}} ï¼›é™åˆ¶æ˜¯ $2 {{PLURAL:$2| operation|operations}}。',
+
+# Lock manager
+'lockmanager-notlocked' => '无法解锓$1â€ï¼›å®ƒæ²¡æœ‰è¢«é”定。',
+'lockmanager-fail-closelock' => '无法关闭“$1â€çš„é”文件。',
+'lockmanager-fail-deletelock' => '无法删除“$1â€çš„é”文件。',
+'lockmanager-fail-acquirelock' => '无法为“$1â€èŽ·å–é”。',
+'lockmanager-fail-openlock' => '无法打开“$1â€çš„é”文件。',
+'lockmanager-fail-releaselock' => '无法为“$1â€é‡Šæ”¾é”。',
+'lockmanager-fail-db-bucket' => 'ä¸èƒ½åœ¨$1池中è”系到足够é”æ•°æ®åº“。',
+'lockmanager-fail-db-release' => 'ä¸èƒ½åœ¨æ•°æ®åº“$1上释放é”。',
+'lockmanager-fail-svr-release' => 'ä¸èƒ½åœ¨æœåŠ¡å™¨$1上释放é”。',
+
# ZipDirectoryReader
'zip-file-open-error' => '打开文件的 ZIP 检查时é‡åˆ°ä¸€ä¸ªé”™è¯¯ã€‚',
'zip-wrong-format' => '指定的文件ä¸æ˜¯ä¸€ä¸ª ZIP 文件。',
@@ -1647,6 +1700,7 @@ $1',
'uploadstash-badtoken' => '进行这个动作ä¸æˆåŠŸï¼Œæˆ–者你的编辑信æ¯å·²ç»è¿‡æœŸã€‚请å†è¯•ã€‚',
'uploadstash-errclear' => '清除文件ä¸æˆåŠŸã€‚',
'uploadstash-refresh' => '更新文件清å•',
+'invalid-chunk-offset' => '无效区å—å移é‡',
# img_auth script messages
'img-auth-accessdenied' => 'æ‹’ç»è®¿é—®',
@@ -1747,24 +1801,25 @@ $1',
'filerevert-badversion' => '文件并无所请求时间戳下的早期本地版本。',
# File deletion
-'filedelete' => '删除$1',
-'filedelete-legend' => '删除文件',
-'filedelete-intro' => "您现正删除文件'''[[Media:$1|$1]]'''。",
-'filedelete-intro-old' => "你现正删除'''[[Media:$1|$1]]'''于[$4 $2 $3]的版本。",
-'filedelete-comment' => '原因:',
-'filedelete-submit' => '删除',
-'filedelete-success' => "'''$1'''å·²ç»åˆ é™¤ã€‚",
-'filedelete-success-old' => "'''[[Media:$1|$1]]'''于 $2 $3 的版本已ç»åˆ é™¤ã€‚",
-'filedelete-nofile' => "'''$1'''ä¸å­˜åœ¨ã€‚",
-'filedelete-nofile-old' => "在已指定属性的情况下,这里没有'''$1'''çš„ä¿å­˜ç‰ˆæœ¬ã€‚",
-'filedelete-otherreason' => '其他/附加原因:',
-'filedelete-reason-otherlist' => '其他原因',
-'filedelete-reason-dropdown' => '
+'filedelete' => '删除$1',
+'filedelete-legend' => '删除文件',
+'filedelete-intro' => "您现正删除文件'''[[Media:$1|$1]]'''。",
+'filedelete-intro-old' => "你现正删除'''[[Media:$1|$1]]'''于[$4 $2 $3]的版本。",
+'filedelete-comment' => '原因:',
+'filedelete-submit' => '删除',
+'filedelete-success' => "'''$1'''å·²ç»åˆ é™¤ã€‚",
+'filedelete-success-old' => "'''[[Media:$1|$1]]'''于 $2 $3 的版本已ç»åˆ é™¤ã€‚",
+'filedelete-nofile' => "'''$1'''ä¸å­˜åœ¨ã€‚",
+'filedelete-nofile-old' => "在已指定属性的情况下,这里没有'''$1'''çš„ä¿å­˜ç‰ˆæœ¬ã€‚",
+'filedelete-otherreason' => '其他/附加原因:',
+'filedelete-reason-otherlist' => '其他原因',
+'filedelete-reason-dropdown' => '
*常用删除ç†ç”±
** 侵犯版æƒ
** é‡å¤æ–‡ä»¶',
-'filedelete-edit-reasonlist' => '编辑删除埋由',
-'filedelete-maintenance' => '当在维护时已ç»æš‚æ—¶åœç”¨æ–‡ä»¶åˆ é™¤å’Œæ¢å¤ã€‚',
+'filedelete-edit-reasonlist' => '编辑删除埋由',
+'filedelete-maintenance' => '当在维护时已ç»æš‚æ—¶åœç”¨æ–‡ä»¶åˆ é™¤å’Œæ¢å¤ã€‚',
+'filedelete-maintenance-title' => '无法删除文件',
# MIME search
'mimesearch' => 'MIME æœç´¢',
@@ -1857,6 +1912,8 @@ $1',
'wantedpages' => '待撰页é¢',
'wantedpages-badtitle' => '在结果组上的无效标题:$1',
'wantedfiles' => '需è¦çš„文件',
+'wantedfiletext-cat' => '以下文件被使用,但ä¸å­˜åœ¨ã€‚外部存储库的文件尽管现有,但å¯èƒ½ä¼šåœ¨æ­¤åˆ—出,任何此类的误报将被<del>剔除</del>。此外,嵌入了ä¸å­˜åœ¨çš„文件的网页将在[[:$1]]列出。',
+'wantedfiletext-nocat' => '以下文件被使用,但ä¸å­˜åœ¨ã€‚外部存储库的文件尽管现有,但å¯èƒ½ä¼šåœ¨æ­¤åˆ—出,任何此类的误报将被<del>剔除</del>。',
'wantedtemplates' => '需è¦çš„模æ¿',
'mostlinked' => '最多链接页é¢',
'mostlinkedcategories' => '最多链接分类',
@@ -1865,6 +1922,7 @@ $1',
'mostimages' => '最多链接文件',
'mostrevisions' => '最多版本页é¢',
'prefixindex' => '所有有å‰ç¼€çš„页é¢',
+'prefixindex-namespace' => '所有有å‰ç¼€çš„页é¢ï¼ˆ$1å字空间)',
'shortpages' => '短页é¢',
'longpages' => '长页é¢',
'deadendpages' => '断链页é¢',
@@ -1881,7 +1939,7 @@ $1',
'listusers-editsonly' => 'åªæ˜¾ç¤ºæœ‰ç¼–辑的用户',
'listusers-creationsort' => '按建立日期排åº',
'usereditcount' => '$1次编辑',
-'usercreated' => '$1 $2创建',
+'usercreated' => '$1 $2{{GENDER:$3|创建}}',
'newpages' => '新页é¢',
'newpages-username' => '用户å:',
'ancientpages' => '最早页é¢',
@@ -1974,12 +2032,8 @@ $1',
'activeusers-noresult' => '找ä¸åˆ°ç”¨æˆ·ã€‚',
# Special:Log/newusers
-'newuserlogpage' => '用户创建日志',
-'newuserlogpagetext' => '本日志是显示新注册用户的日志',
-'newuserlog-byemail' => '密ç å·²ç”¨ç”µå­é‚®ä»¶å‘é€',
-'newuserlog-create-entry' => '新用户账户',
-'newuserlog-create2-entry' => '已创建$1的新账户',
-'newuserlog-autocreate-entry' => '已自动创建å¸æˆ·',
+'newuserlogpage' => '用户创建日志',
+'newuserlogpagetext' => '本日志是显示新注册用户的日志',
# Special:ListGroupRights
'listgrouprights' => '用户组æƒé™',
@@ -2008,7 +2062,7 @@ $1',
'emailpagetext' => '您å¯ä»¥ç”¨ä¸‹é¢çš„表格去寄一å°ç”µé‚®ç»™è¿™ä½ç”¨æˆ·ã€‚
您在[[Special:Preferences|您å‚数设置]]中所输入的电å­é‚®ç®±åœ°å€å°†å‡ºçŽ°åœ¨é‚®ä»¶"å‘件人"一æ ä¸­ï¼Œè¿™æ ·è¯¥ç”¨æˆ·å°±å¯ä»¥å›žå¤æ‚¨ã€‚',
'usermailererror' => 'Mail 对象返回错误:',
-'defemailsubject' => '{{SITENAME}}电å­é‚®ä»¶',
+'defemailsubject' => "{{SITENAME}} æ¥è‡ªç”¨æˆ·''$1''的电å­é‚®ä»¶",
'usermaildisabled' => '用户电邮已åœç”¨',
'usermaildisabledtext' => '您ä¸å¯ä»¥å‘é€ç”µé‚®åˆ°è¿™ä¸ªwiki上的其他用户',
'noemailtitle' => '无电å­é‚®ä»¶åœ°å€',
@@ -2061,7 +2115,7 @@ $1',
'watchmethod-list' => '查看监视页中的最新修改',
'watchlistcontains' => '您的监视列表包å«$1个页é¢ã€‚',
'iteminvalidname' => "页é¢'$1'错误,无效命å...",
-'wlnote' => "以下是最近'''$2'''å°æ—¶å†…的最åŽ'''$1'''次修改:",
+'wlnote' => "截至$3 $4,以下是最近'''$2'''å°æ—¶å†…的最åŽ'''$1'''次修改。",
'wlshowlast' => '显示最近$1å°æ—¶ã€$2天或$3的更改',
'watchlist-options' => '监视列表选项',
@@ -2122,8 +2176,6 @@ $UNWATCHURL
'actioncomplete' => 'æ“作完æˆ',
'actionfailed' => 'æ“作失败',
'deletedtext' => '"$1"å·²ç»è¢«åˆ é™¤ã€‚最近删除的记录请å‚è§$2。',
-'deletedarticle' => '已删除“[[$1]]â€',
-'suppressedarticle' => 'å·²éšè—“[[$1]]â€',
'dellogpage' => '删除日志',
'dellogpagetext' => '以下是最近的删除的列表。',
'deletionlog' => '删除记录',
@@ -2167,7 +2219,10 @@ $UNWATCHURL
'unprotectedarticle' => '删除“[[$1]]â€çš„ä¿æŠ¤',
'movedarticleprotection' => '移动ä¿æŠ¤è®¾ç½®è‡ªâ€œ[[$2]]â€è‡³â€œ[[$1]]â€',
'protect-title' => '更改“$1â€çš„ä¿æŠ¤ç­‰çº§',
+'protect-title-notallowed' => '查看“$1â€çš„ä¿æŠ¤ç­‰çº§',
'prot_1movedto2' => '[[$1]]移动至[[$2]]',
+'protect-badnamespace-title' => 'ä¸å¯è¢«ä¿æŠ¤çš„å字空间',
+'protect-badnamespace-text' => '这个å字空间内的页é¢æ— æ³•è¢«ä¿æŠ¤ã€‚',
'protect-legend' => '确认ä¿æŠ¤',
'protectcomment' => '原因:',
'protectexpiry' => '到期:',
@@ -2185,6 +2240,7 @@ $UNWATCHURL
'protect-level-sysop' => '仅管ç†å‘˜',
'protect-summary-cascade' => 'è”é”',
'protect-expiring' => '终止于$1(UTC)',
+'protect-expiring-local' => '$1到期',
'protect-expiry-indefinite' => 'æ— é™æœŸ',
'protect-cascade' => 'ä¿æŠ¤æœ¬é¡µä¸­åŒ…å«çš„页é¢ï¼ˆè¿žé”ä¿æŠ¤ï¼‰',
'protect-cantedit' => '您无法更改这个页é¢çš„ä¿æŠ¤ç­‰çº§ï¼Œå› ä¸ºæ‚¨æ²¡æœ‰æƒé™åŽ»ç¼–辑它。',
@@ -2239,7 +2295,6 @@ $UNWATCHURL
'undeletereset' => 'é‡è®¾',
'undeleteinvert' => 'åå‘选择',
'undeletecomment' => '原因:',
-'undeletedarticle' => 'å·²æ¢å¤â€œ[[$1]]â€',
'undeletedrevisions' => '$1个版本已æ¢å¤',
'undeletedrevisions-files' => '$1个版本和$2个文件已æ¢å¤',
'undeletedfiles' => '$1个文件已ç»è¢«æ¢å¤',
@@ -2248,6 +2303,7 @@ $UNWATCHURL
å‚考[[Special:Log/delete|删除日志]]查看删除åŠæ¢å¤è®°å½•ã€‚",
'undelete-header' => '如è¦æŸ¥è¯¢æœ€è¿‘的记录请å‚阅[[Special:Log/delete|删除日志]]。',
+'undelete-search-title' => 'æœç´¢å·²åˆ é™¤é¡µé¢',
'undelete-search-box' => 'æœç´¢å·²åˆ é™¤é¡µé¢',
'undelete-search-prefix' => '显示页é¢è‡ªï¼š',
'undelete-search-submit' => 'æœç´¢',
@@ -2256,6 +2312,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'ä¸èƒ½åˆ é™¤å¸¦æœ‰æ—¶é—´æˆ³çš„文件修订$1:文件在删除å‰é—失。',
'undelete-cleanup-error' => '删除无用的存档文件“$1â€æ—¶å‘生错误。',
'undelete-missing-filearchive' => '由于文件存档 ID $1 ä¸åœ¨æ•°æ®åº“中,ä¸èƒ½åœ¨æ–‡ä»¶å­˜æ¡£ä¸­æ¢å¤ã€‚它å¯èƒ½å·²ç»è¢«æ¢å¤äº†ã€‚',
+'undelete-error' => 'æ¢å¤å·²åˆ é™¤é¡µé¢æ—¶å‡ºé”™',
'undelete-error-short' => 'æ¢å¤è¢«åˆ æ–‡ä»¶æ—¶å‘生错误:$1',
'undelete-error-long' => 'æ¢å¤è¢«åˆ é™¤çš„文件时出错:
@@ -2377,6 +2434,7 @@ $1',
'blocklist-userblocks' => 'éšè—å¸æˆ·å°ç¦',
'blocklist-tempblocks' => 'éšè—临时å°ç¦',
'blocklist-addressblocks' => 'éšè—å•ä¸ªIPå°ç¦',
+'blocklist-rangeblocks' => 'éšè—IP段å°ç¦',
'blocklist-timestamp' => '时间戳',
'blocklist-target' => '目标',
'blocklist-expiry' => '过期',
@@ -2399,6 +2457,7 @@ $1',
'unblocklink' => '解除å°ç¦',
'change-blocklink' => '更改å°ç¦',
'contribslink' => '贡献',
+'emaillink' => 'å‘é€ç”µé‚®',
'autoblocker' => '由于您与“[[User:$1|$1]]â€å…±äº«ä¸€ä¸ªIP地å€è€Œè¢«è‡ªåŠ¨å°ç¦ã€‚
$1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'blocklogpage' => 'å°ç¦æ—¥å¿—',
@@ -2520,9 +2579,6 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'movepage-page-moved' => '页é¢$1å·²ç»ç§»åŠ¨åˆ°$2。',
'movepage-page-unmoved' => '页é¢$1无法移动到$2。',
'movepage-max-pages' => '所移动$1个页é¢çš„æ•°é‡å·²è¾¾æœ€å¤§é™é¢ï¼Œæ— æ³•åŒæ—¶è‡ªåŠ¨ç§»åŠ¨æ›´å¤šé¡µé¢ã€‚',
-'1movedto2' => '移动[[$1]]至[[$2]]',
-'1movedto2_redir' => '移动[[$1]]覆盖é‡å®šå‘页[[$2]]',
-'move-redirect-suppressed' => '已阻止é‡å®šå‘',
'movelogpage' => '移动日志',
'movelogpagetext' => '以下是所有移动的页é¢åˆ—表:',
'movesubpage' => '{{PLURAL:$1|å­é¡µé¢|å­é¡µé¢}}',
@@ -2535,7 +2591,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
目标页é¢â€œ[[:$1]]â€å·²å­˜åœ¨ã€‚是å¦ç¡®è®¤åˆ é™¤è¯¥é¡µé¢ä»¥ä¾¿è¿›è¡Œç§»åŠ¨ï¼Ÿ',
'delete_and_move_confirm' => '是,删除该页é¢',
-'delete_and_move_reason' => '删除以便移动',
+'delete_and_move_reason' => '删除以便移动[[$1]]',
'selfmove' => '原始标题和目标标题相åŒï¼Œæ— æ³•å¯¹é¡µé¢è¿›è¡Œè‡ªæˆ‘移动。',
'immobile-source-namespace' => '无法移动å字空间为“$1â€çš„页é¢',
'immobile-target-namespace' => '无法将页é¢ç§»åŠ¨åˆ°â€œ$1â€å字空间',
@@ -2566,9 +2622,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
或是åªé€‰æ‹©å¯¼å‡ºå¸¦æœ‰æœ€åŽä¸€æ¬¡ç¼–辑信æ¯çš„当å‰ä¿®è®¢ç‰ˆæœ¬ã€‚
此外你还å¯ä»¥åˆ©ç”¨é“¾æŽ¥å¯¼å‡ºæ–‡ä»¶ï¼Œä¾‹å¦‚ä½ å¯ä»¥ä½¿ç”¨[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]导出“[[{{MediaWiki:Mainpage}}]]â€é¡µé¢ã€‚',
+'exportall' => '导出所有页é¢',
'exportcuronly' => '仅包å«å½“å‰çš„修订,而ä¸æ˜¯å…¨éƒ¨çš„历å²ã€‚',
'exportnohistory' => "----
'''注æ„:'''由于性能原因,从此表å•å¯¼å‡ºé¡µé¢çš„全部历å²å·²è¢«ç¦ç”¨ã€‚",
+'exportlistauthors' => '为æ¯ä¸ªé¡µé¢åŒ…å«è´¡çŒ®è€…的完整列表',
'export-submit' => '导出',
'export-addcattext' => '由分类中添加页é¢ï¼š',
'export-addcat' => '添加',
@@ -2601,6 +2659,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'thumbnail_error' => '创建缩略图错误:$1',
'djvu_page_error' => 'DjVu页é¢è¶…出范围',
'djvu_no_xml' => '无法在DjVu文件中获å–XML',
+'thumbnail-temp-create' => '无法创建临时缩略图文件',
+'thumbnail-dest-create' => '无法将缩略图ä¿å­˜åˆ°ç›®æ ‡åœ°ç‚¹',
'thumbnail_invalid_params' => 'ä¸æ­£ç¡®çš„缩略图å‚æ•°',
'thumbnail_dest_directory' => '无法建立目标目录',
'thumbnail_image-type' => '图åƒç±»åž‹ä¸æ”¯æŒ',
@@ -2643,6 +2703,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'import-upload' => '上传XMLæ•°æ®',
'import-token-mismatch' => '会è¯æ•°æ®é—失。请é‡è¯•ã€‚',
'import-invalid-interwiki' => 'ä¸èƒ½ä»ŽæŒ‡å®šçš„wiki导入。',
+'import-error-edit' => '"$1"页é¢ä¸å¯¼å…¥ï¼Œå› ä¸ºæ‚¨ä¸å‡†å¯¹å…¶è¿›è¡Œç¼–辑。',
+'import-error-create' => '"$1"页é¢ä¸å¯¼å…¥ï¼Œå› ä¸ºæ‚¨ä¸å‡†åˆ›å»ºå®ƒã€‚',
+'import-error-interwiki' => '页é¢â€œ$1â€æœªèƒ½å¯¼å…¥ï¼Œå› ä¸ºå®ƒçš„å称需è¦ä½¿ç”¨å¤–部跨维基链接。',
+'import-error-special' => '页é¢â€œ$1â€æœªå¯¼å…¥ï¼Œå› ä¸ºå®ƒéœ€è¦ä½¿ç”¨ä¸€ä¸ªä¸èƒ½åˆ›å»ºé¡µé¢çš„特殊å字空间。',
+'import-error-invalid' => '页é¢â€œ$1â€æœªèƒ½å¯¼å…¥ï¼Œå› ä¸ºå®ƒçš„å字无效。',
# Import log
'importlogpage' => '导入日志',
@@ -2652,72 +2717,85 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'import-logentry-interwiki' => 'è·¨ wiki $1',
'import-logentry-interwiki-detail' => 'æ¥è‡ª$2çš„$1个修订',
+# JavaScriptTest
+'javascripttest' => 'JavaScript测试',
+'javascripttest-disabled' => '此功能已ç¦ç”¨ã€‚',
+'javascripttest-title' => 'è¿è¡Œ$1测试',
+'javascripttest-pagetext-noframework' => '此页é¢è¢«ä¿ç•™ç”¨äºŽè¿è¡ŒJavaScript测试。',
+'javascripttest-pagetext-unknownframework' => '未知的框架“$1â€ã€‚',
+'javascripttest-pagetext-frameworks' => '请选择以下的框架之一:$1',
+'javascripttest-pagetext-skins' => '选择外观æ¥è¿è¡Œæµ‹è¯•ï¼š',
+'javascripttest-qunit-intro' => '请æµè§ˆmediawiki.orgå‚阅[$1 测试文档]。',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit 测试套件',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => '你的用户页é¢',
-'tooltip-pt-anonuserpage' => '您编辑本站所用IP的对应用户页',
-'tooltip-pt-mytalk' => '你的讨论页é¢',
-'tooltip-pt-anontalk' => '对于æ¥è‡ªæ­¤IP地å€çš„编辑的对è¯',
-'tooltip-pt-preferences' => '你的系统设置',
-'tooltip-pt-watchlist' => '你正监视更改的页é¢åˆ—表',
-'tooltip-pt-mycontris' => '你的贡献列表',
-'tooltip-pt-login' => '我们希望您å¯ä»¥ç™»å…¥ï¼Œä½†ä¸å¼ºæ±‚',
-'tooltip-pt-anonlogin' => '我们鼓励您登录,但这并ä¸æ˜¯å¿…须的',
-'tooltip-pt-logout' => '退出登录',
-'tooltip-ca-talk' => '关于内容页é¢çš„讨论',
-'tooltip-ca-edit' => 'ä½ å¯ä»¥ç¼–辑本页。请在ä¿å­˜å‰é¢„览一下。',
-'tooltip-ca-addsection' => '开始新段è½',
-'tooltip-ca-viewsource' => '本页é¢å·²è¢«ä¿æŠ¤ã€‚ä½ å¯ä»¥æŸ¥çœ‹å…¶æºä»£ç ã€‚',
-'tooltip-ca-history' => '本页é¢çš„æ—©å‰ä¿®è®¢ç‰ˆæœ¬',
-'tooltip-ca-protect' => 'ä¿æŠ¤æ­¤é¡µ',
-'tooltip-ca-unprotect' => '更改此页é¢çš„ä¿æŠ¤',
-'tooltip-ca-delete' => '删除本页',
-'tooltip-ca-undelete' => '将这个页é¢æ¢å¤åˆ°è¢«åˆ é™¤ä»¥å‰çš„状æ€',
-'tooltip-ca-move' => '移动此页',
-'tooltip-ca-watch' => '将本页é¢åŠ å…¥ä½ çš„监视列表',
-'tooltip-ca-unwatch' => '将此页é¢ä»Žç›‘视列表中移去',
-'tooltip-search' => '在{{SITENAME}}中æœç´¢',
-'tooltip-search-go' => '如果相åŒçš„标题存在的è¯ä¾¿ç›´æŽ¥å‰å¾€è¯¥é¡µé¢',
-'tooltip-search-fulltext' => 'æœç´¢å«è¿™äº›æ–‡å­—的页é¢',
-'tooltip-p-logo' => '访问首页',
-'tooltip-n-mainpage' => '访问首页',
-'tooltip-n-mainpage-description' => '访问首页',
-'tooltip-n-portal' => '关于本项目,你å¯ä»¥åšä»€ä¹ˆï¼Œåœ¨å“ªé‡Œæ‰¾åˆ°ä½ éœ€è¦çš„事物',
-'tooltip-n-currentevents' => '查看当å‰äº‹ä»¶çš„背景信æ¯',
-'tooltip-n-recentchanges' => '本wiki的最近更改列表',
-'tooltip-n-randompage' => 'éšæœºè¿›å…¥ä¸€ä¸ªé¡µé¢',
-'tooltip-n-help' => '寻求帮助的地方',
-'tooltip-t-whatlinkshere' => '所有链入本页的wiki页é¢åˆ—表',
-'tooltip-t-recentchangeslinked' => '本页链入的页é¢çš„最近更改',
-'tooltip-feed-rss' => '此页的 RSS 订阅',
-'tooltip-feed-atom' => '本页的Atom',
-'tooltip-t-contributions' => '查看该用户的贡献列表',
-'tooltip-t-emailuser' => '给该用户å‘é€ç”µå­é‚®ä»¶',
-'tooltip-t-upload' => '上传文件',
-'tooltip-t-specialpages' => '所有特殊页é¢åˆ—表',
-'tooltip-t-print' => '本页é¢çš„å¯æ‰“å°ç‰ˆæœ¬',
-'tooltip-t-permalink' => '本页é¢è¯¥ä¿®è®¢ç‰ˆæœ¬çš„永久链接',
-'tooltip-ca-nstab-main' => '查看内容页é¢',
-'tooltip-ca-nstab-user' => '查看用户页é¢',
-'tooltip-ca-nstab-media' => '查看媒体页é¢',
-'tooltip-ca-nstab-special' => '本页为特殊页é¢ï¼Œä½ ä¸èƒ½ç¼–辑本页',
-'tooltip-ca-nstab-project' => '查看计划页é¢',
-'tooltip-ca-nstab-image' => '查看文件页é¢',
-'tooltip-ca-nstab-mediawiki' => '查看系统界é¢æ¶ˆæ¯',
-'tooltip-ca-nstab-template' => '查看模æ¿',
-'tooltip-ca-nstab-help' => '查看帮助页é¢',
-'tooltip-ca-nstab-category' => '查看分类页é¢',
-'tooltip-minoredit' => '将此标记为å°æ›´æ”¹',
-'tooltip-save' => 'ä¿å­˜æ‚¨çš„更改',
-'tooltip-preview' => '预览您的更改,请在ä¿å­˜å‰ä½¿ç”¨æ­¤åŠŸèƒ½ï¼',
-'tooltip-diff' => '显示您对该文字所åšçš„更改',
-'tooltip-compareselectedversions' => '查看此页é¢ä¸¤ä¸ªé€‰å®šçš„修订版本间的差异。',
-'tooltip-watch' => '将该页é¢åŠ åˆ°æ‚¨çš„监视列表',
-'tooltip-recreate' => 'é‡å»ºè¯¥é¡µé¢ï¼Œæ— è®ºæ˜¯å¦è¢«åˆ é™¤ã€‚',
-'tooltip-upload' => '开始上传',
-'tooltip-rollback' => 'å•å‡»â€œå›žé€€â€æ¢å¤ä¸Šä¸€ä½è´¡çŒ®è€…对本页的编辑',
-'tooltip-undo' => '“撤销â€å¯ä»¥æ¢å¤è¯¥ç¼–辑并在预览模å¼ä¸‹æ‰“开编辑表å•ã€‚它å…许在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
-'tooltip-preferences-save' => 'ä¿å­˜è®¾å®š',
-'tooltip-summary' => '输入一个简短的摘è¦',
+'tooltip-pt-userpage' => '你的用户页é¢',
+'tooltip-pt-anonuserpage' => '您编辑本站所用IP的对应用户页',
+'tooltip-pt-mytalk' => '你的讨论页é¢',
+'tooltip-pt-anontalk' => '对于æ¥è‡ªæ­¤IP地å€çš„编辑的对è¯',
+'tooltip-pt-preferences' => '你的系统设置',
+'tooltip-pt-watchlist' => '你正监视更改的页é¢åˆ—表',
+'tooltip-pt-mycontris' => '你的贡献列表',
+'tooltip-pt-login' => '我们希望您å¯ä»¥ç™»å…¥ï¼Œä½†ä¸å¼ºæ±‚',
+'tooltip-pt-anonlogin' => '我们鼓励您登录,但这并ä¸æ˜¯å¿…须的',
+'tooltip-pt-logout' => '退出登录',
+'tooltip-ca-talk' => '关于内容页é¢çš„讨论',
+'tooltip-ca-edit' => 'ä½ å¯ä»¥ç¼–辑本页。请在ä¿å­˜å‰é¢„览一下。',
+'tooltip-ca-addsection' => '开始新段è½',
+'tooltip-ca-viewsource' => '本页é¢å·²è¢«ä¿æŠ¤ã€‚ä½ å¯ä»¥æŸ¥çœ‹å…¶æºä»£ç ã€‚',
+'tooltip-ca-history' => '本页é¢çš„æ—©å‰ä¿®è®¢ç‰ˆæœ¬',
+'tooltip-ca-protect' => 'ä¿æŠ¤æ­¤é¡µ',
+'tooltip-ca-unprotect' => '更改此页é¢çš„ä¿æŠ¤',
+'tooltip-ca-delete' => '删除本页',
+'tooltip-ca-undelete' => '将这个页é¢æ¢å¤åˆ°è¢«åˆ é™¤ä»¥å‰çš„状æ€',
+'tooltip-ca-move' => '移动此页',
+'tooltip-ca-watch' => '将本页é¢åŠ å…¥ä½ çš„监视列表',
+'tooltip-ca-unwatch' => '将此页é¢ä»Žç›‘视列表中移去',
+'tooltip-search' => '在{{SITENAME}}中æœç´¢',
+'tooltip-search-go' => '如果相åŒçš„标题存在的è¯ä¾¿ç›´æŽ¥å‰å¾€è¯¥é¡µé¢',
+'tooltip-search-fulltext' => 'æœç´¢å«è¿™äº›æ–‡å­—的页é¢',
+'tooltip-p-logo' => '访问首页',
+'tooltip-n-mainpage' => '访问首页',
+'tooltip-n-mainpage-description' => '访问首页',
+'tooltip-n-portal' => '关于本项目,你å¯ä»¥åšä»€ä¹ˆï¼Œåœ¨å“ªé‡Œæ‰¾åˆ°ä½ éœ€è¦çš„事物',
+'tooltip-n-currentevents' => '查看当å‰äº‹ä»¶çš„背景信æ¯',
+'tooltip-n-recentchanges' => '本wiki的最近更改列表',
+'tooltip-n-randompage' => 'éšæœºè¿›å…¥ä¸€ä¸ªé¡µé¢',
+'tooltip-n-help' => '寻求帮助的地方',
+'tooltip-t-whatlinkshere' => '所有链入本页的wiki页é¢åˆ—表',
+'tooltip-t-recentchangeslinked' => '本页链入的页é¢çš„最近更改',
+'tooltip-feed-rss' => '此页的 RSS 订阅',
+'tooltip-feed-atom' => '本页的Atom',
+'tooltip-t-contributions' => '查看该用户的贡献列表',
+'tooltip-t-emailuser' => '给该用户å‘é€ç”µå­é‚®ä»¶',
+'tooltip-t-upload' => '上传文件',
+'tooltip-t-specialpages' => '所有特殊页é¢åˆ—表',
+'tooltip-t-print' => '本页é¢çš„å¯æ‰“å°ç‰ˆæœ¬',
+'tooltip-t-permalink' => '本页é¢è¯¥ä¿®è®¢ç‰ˆæœ¬çš„永久链接',
+'tooltip-ca-nstab-main' => '查看内容页é¢',
+'tooltip-ca-nstab-user' => '查看用户页é¢',
+'tooltip-ca-nstab-media' => '查看媒体页é¢',
+'tooltip-ca-nstab-special' => '本页为特殊页é¢ï¼Œä½ ä¸èƒ½ç¼–辑本页',
+'tooltip-ca-nstab-project' => '查看计划页é¢',
+'tooltip-ca-nstab-image' => '查看文件页é¢',
+'tooltip-ca-nstab-mediawiki' => '查看系统界é¢æ¶ˆæ¯',
+'tooltip-ca-nstab-template' => '查看模æ¿',
+'tooltip-ca-nstab-help' => '查看帮助页é¢',
+'tooltip-ca-nstab-category' => '查看分类页é¢',
+'tooltip-minoredit' => '将此标记为å°æ›´æ”¹',
+'tooltip-save' => 'ä¿å­˜æ‚¨çš„更改',
+'tooltip-preview' => '预览您的更改,请在ä¿å­˜å‰ä½¿ç”¨æ­¤åŠŸèƒ½ï¼',
+'tooltip-diff' => '显示您对该文字所åšçš„更改',
+'tooltip-compareselectedversions' => '查看此页é¢ä¸¤ä¸ªé€‰å®šçš„修订版本间的差异。',
+'tooltip-watch' => '将该页é¢åŠ åˆ°æ‚¨çš„监视列表',
+'tooltip-watchlistedit-normal-submit' => '删除标题',
+'tooltip-watchlistedit-raw-submit' => '更新监视列表',
+'tooltip-recreate' => 'é‡å»ºè¯¥é¡µé¢ï¼Œæ— è®ºæ˜¯å¦è¢«åˆ é™¤ã€‚',
+'tooltip-upload' => '开始上传',
+'tooltip-rollback' => 'å•å‡»â€œå›žé€€â€æ¢å¤ä¸Šä¸€ä½è´¡çŒ®è€…对本页的编辑',
+'tooltip-undo' => '“撤销â€å¯ä»¥æ¢å¤è¯¥ç¼–辑并在预览模å¼ä¸‹æ‰“开编辑表å•ã€‚它å…许在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
+'tooltip-preferences-save' => 'ä¿å­˜è®¾å®š',
+'tooltip-summary' => '输入一个简短的摘è¦',
# Stylesheets
'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
@@ -2803,9 +2881,6 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
# Patrol log
'patrol-log-page' => '巡查日志',
'patrol-log-header' => '这是已巡查的修订版本的日志。',
-'patrol-log-line' => '标记$2的$1已巡查$3',
-'patrol-log-auto' => '(自动)',
-'patrol-log-diff' => '版本$1',
'log-show-hide-patrol' => '$1巡查纪录',
# Image deletion
@@ -2832,11 +2907,11 @@ $1',
'file-info' => '文件大å°ï¼š$1,MIME类型:$2',
'file-info-size' => '$1 × $2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4',
'file-info-size-pages' => '$1×$2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3,MIME类型:$4,$5个页é¢',
-'file-nohires' => '<small>没有更高的分辨率。</small>',
+'file-nohires' => '没有更高的分辨率。',
'svg-long-desc' => 'SVG文件,图åƒå¤§å°ï¼š$1 × $2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3',
'show-big-image' => '完整分辨率',
-'show-big-image-preview' => '<small>此预览的大å°ï¼š$1.</small>',
-'show-big-image-other' => '<small>其他解决方案:$1。</small>',
+'show-big-image-preview' => '此预览的大å°ï¼š$1.',
+'show-big-image-other' => '其他{{PLURAL:$2||}}分辨率:$1。',
'show-big-image-size' => '$1×$2åƒç´ ',
'file-info-gif-looped' => '循环',
'file-info-gif-frames' => '$1帧',
@@ -2856,6 +2931,13 @@ $1',
'bydate' => '按日期',
'sp-newimages-showfrom' => '从$1 $2开始显示新文件',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '$1秒',
+'minutes' => '$1分钟',
+'hours' => '$1å°æ—¶',
+'days' => '$1天',
+'ago' => '$1å‰',
+
# Bad image list
'bad_image_list' => '请按照下列格å¼ç¼–写:
@@ -3370,13 +3452,6 @@ $5
'scarytranscludefailed' => '[æå–$1失败]',
'scarytranscludetoolong' => '[URL过长]',
-# Trackbacks
-'trackbackbox' => '此页é¢çš„引用:<br />
-$1',
-'trackbackremove' => '([$1删除])',
-'trackbacklink' => '引用',
-'trackbackdeleteok' => '该引用已被æˆåŠŸåˆ é™¤ã€‚',
-
# Delete conflict
'deletedwhileediting' => "'''警告''':此页在您开始编辑之åŽå·²ç»è¢«åˆ é™¤ï¼",
'confirmrecreate' => "在您开始编辑这个页é¢åŽï¼Œç”¨æˆ·[[User:$1|$1]] ([[User talk:$1|讨论]])以下列原因删除了这个页é¢ï¼š
@@ -3462,6 +3537,9 @@ $1',
'watchlisttools-edit' => '查看并编辑监视列表',
'watchlisttools-raw' => '编辑原始监视列表',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|留言]])',
+
# Core parser functions
'unknown_extension_tag' => 'ä¸æ˜Žçš„扩展标签“$1â€',
'duplicate-defaultsort' => "'''警告:'''默认排åºå…³é”®å­—“$2â€è¦†ç›–了之å‰çš„默认排åºå…³é”®å­—“$1â€ã€‚",
@@ -3559,13 +3637,16 @@ MediaWiki是基于使用目的而加以å‘布,然而ä¸è´Ÿä»»ä½•æ‹…ä¿è´£ä»»ï¼
'tags-hitcount' => '$1次更改',
# Special:ComparePages
-'comparepages' => '对比页é¢',
-'compare-selector' => '对比页é¢ç‰ˆæœ¬',
-'compare-page1' => '页é¢1',
-'compare-page2' => '页é¢2',
-'compare-rev1' => '版本1',
-'compare-rev2' => '版本2',
-'compare-submit' => '对比',
+'comparepages' => '对比页é¢',
+'compare-selector' => '对比页é¢ç‰ˆæœ¬',
+'compare-page1' => '页é¢1',
+'compare-page2' => '页é¢2',
+'compare-rev1' => '版本1',
+'compare-rev2' => '版本2',
+'compare-submit' => '对比',
+'compare-invalid-title' => '您指定的标题无效。',
+'compare-title-not-exists' => '您指定的标题ä¸å­˜åœ¨ã€‚',
+'compare-revision-not-exists' => '你指定的版本ä¸å­˜åœ¨ã€‚',
# Database error messages
'dberr-header' => '本wiki出现了问题',
@@ -3593,4 +3674,89 @@ MediaWiki是基于使用目的而加以å‘布,然而ä¸è´Ÿä»»ä½•æ‹…ä¿è´£ä»»ï¼
'sqlite-has-fts' => '带全文æœç´¢çš„版本$1',
'sqlite-no-fts' => 'ä¸å¸¦å…¨æ–‡æœç´¢çš„版本$1',
+# New logging system
+'logentry-delete-delete' => '$1删除页é¢$3',
+'logentry-delete-restore' => '$1æ¢å¤é¡µé¢$3',
+'logentry-delete-event' => '$1已更改$3中$5项日志的å¯è§æ€§ï¼š$4',
+'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5个历å²ç‰ˆæœ¬|$5个历å²ç‰ˆæœ¬}}çš„å¯è§æ€§ï¼š$4',
+'logentry-delete-event-legacy' => '$1已更改$3中日志的å¯è§æ€§',
+'logentry-delete-revision-legacy' => '$1已更改$3中历å²ç‰ˆæœ¬çš„å¯è§æ€§',
+'logentry-suppress-delete' => '$1å·²éšè—页é¢$3',
+'logentry-suppress-event' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中{{PLURAL:$5|$5项日志|$5项日志}}çš„å¯è§æ€§ï¼š$4',
+'logentry-suppress-revision' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中{{PLURAL:$5|$5个历å²ç‰ˆæœ¬|$5个历å²ç‰ˆæœ¬}}çš„å¯è§æ€§ï¼š$4',
+'logentry-suppress-event-legacy' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中日志的å¯è§æ€§',
+'logentry-suppress-revision-legacy' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中历å²ç‰ˆæœ¬çš„å¯è§æ€§',
+'revdelete-content-hid' => 'éšè—内容',
+'revdelete-summary-hid' => 'éšè—编辑摘è¦',
+'revdelete-uname-hid' => 'éšè—用户å',
+'revdelete-content-unhid' => 'æ¢å¤å†…容',
+'revdelete-summary-unhid' => 'æ¢å¤ç¼–辑摘è¦',
+'revdelete-uname-unhid' => 'æ¢å¤ç”¨æˆ·å',
+'revdelete-restricted' => '已将é™åˆ¶åº”用到管ç†å‘˜',
+'revdelete-unrestricted' => '已移除对管ç†å‘˜çš„é™åˆ¶',
+'logentry-move-move' => '$1移动$3页é¢è‡³$4',
+'logentry-move-move-noredirect' => '$1移动$3页é¢è‡³$4,ä¸ç•™é‡å®šå‘',
+'logentry-move-move_redir' => '$1移动页é¢$3至$4覆盖é‡å®šå‘',
+'logentry-move-move_redir-noredirect' => '$1通过é‡å®šå‘移动$3页é¢è‡³$4,ä¸ç•™é‡å®šå‘',
+'logentry-patrol-patrol' => '$1标记页é¢$3的版本$4为已巡查',
+'logentry-patrol-patrol-auto' => '$1自动标记页é¢$3的版本$4为已巡查',
+'logentry-newusers-newusers' => '$1创建用户账户',
+'logentry-newusers-create' => '$1创建用户账户',
+'logentry-newusers-create2' => '$1创建用户账户$3',
+'logentry-newusers-autocreate' => '账户$1被自动创建',
+'newuserlog-byemail' => '密ç å·²ç”¨ç”µå­é‚®ä»¶å‘é€',
+
+# Feedback
+'feedback-bugornote' => '如果你准备好详细æ述一个技术问题,请[$1 报告bug]。或者你å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„简å•è¡¨æ ¼ã€‚你的评论将被添加至页é¢â€œ[$3 $2]â€ï¼Œé™„有你的用户å和使用的æµè§ˆå™¨ã€‚',
+'feedback-subject' => '主题:',
+'feedback-message' => 'ä¿¡æ¯ï¼š',
+'feedback-cancel' => 'å–消',
+'feedback-submit' => 'æ交å馈',
+'feedback-adding' => '正在添加å馈至页é¢...',
+'feedback-error1' => '错误:从API返回无法识别的结果',
+'feedback-error2' => '错误:编辑失败',
+'feedback-error3' => '错误:API没有å“应',
+'feedback-thanks' => '谢谢ï¼ä½ çš„å馈已å‘布至页é¢â€œ[$2 $1]â€ã€‚',
+'feedback-close' => '完æˆ',
+'feedback-bugcheck' => '请检查本bug是å¦ä¸º[$1 已知bug]。',
+'feedback-bugnew' => '我检查了。报告新bug',
+
+# API errors
+'api-error-badaccess-groups' => '你没有æƒé™å°†æ–‡ä»¶ä¸Šä¼ åˆ°æ­¤ç»´åŸºã€‚',
+'api-error-badtoken' => '内部错误:会è¯æ— æ•ˆã€‚',
+'api-error-copyuploaddisabled' => '通过URL上传的功能已被此æœåŠ¡å™¨ç¦ç”¨ã€‚',
+'api-error-duplicate' => '在网站上已ç»å…·æœ‰ç›¸åŒå†…容的{{PLURAL:$1|[$2 å¦ä¸€ä¸ªæ–‡ä»¶]|[$2 å¦ä¸€äº›æ–‡ä»¶]}}。',
+'api-error-duplicate-archive' => '在网站上曾ç»å…·æœ‰ç›¸åŒå†…容的{{PLURAL:$1|[$2 å¦ä¸€ä¸ªæ–‡ä»¶]|[$2 å¦ä¸€äº›æ–‡ä»¶]}},但已被删除。',
+'api-error-duplicate-archive-popup-title' => '已被删的除é‡å¤{{PLURAL:$1|文件|文件}}',
+'api-error-duplicate-popup-title' => 'é‡å¤çš„ {{PLURAL:$1|文件|文件}}',
+'api-error-empty-file' => '您æ交的文件是空的。',
+'api-error-emptypage' => 'ä¸èƒ½åˆ›å»ºæ²¡æœ‰å†…容的新页é¢ã€‚',
+'api-error-fetchfileerror' => '内部错误:获å–文件时å‘生错误。',
+'api-error-file-too-large' => '您æ交的文件太大了。',
+'api-error-filename-tooshort' => '文件å太短了。',
+'api-error-filetype-banned' => '此类文件被ç¦æ­¢ã€‚',
+'api-error-filetype-missing' => '该文件没有扩展å。',
+'api-error-hookaborted' => '你试图进行的修改被一个扩展钩å­ç»ˆæ­¢ã€‚',
+'api-error-http' => '内部错误:无法连接到æœåŠ¡å™¨ã€‚',
+'api-error-illegal-filename' => '文件åéžæ³•ã€‚',
+'api-error-internal-error' => '内部错误:此维基项目在处ç†ä½ çš„上传数æ®æ—¶å‡ºçŽ°äº†é”™è¯¯ã€‚',
+'api-error-invalid-file-key' => '内部错误:找ä¸åˆ°ä¸´æ—¶æ–‡ä»¶ã€‚',
+'api-error-missingparam' => '内部错误:请求中缺少å‚数。',
+'api-error-missingresult' => '内部错误:无法确定是å¦å¤åˆ¶æˆåŠŸã€‚',
+'api-error-mustbeloggedin' => '您必须登录åŽå†ä¸Šä¼ æ–‡ä»¶ã€‚',
+'api-error-mustbeposted' => '该软件存在故障,它没有使用正确的HTTP方法。',
+'api-error-noimageinfo' => '上传æˆåŠŸï¼Œä½†æœåŠ¡å™¨æ²¡æœ‰ç»™æˆ‘们任何该文件的信æ¯ã€‚',
+'api-error-nomodule' => '内部错误:缺少上传模å—集。',
+'api-error-ok-but-empty' => '内部错误:æœåŠ¡å™¨æ²¡æœ‰å“应。',
+'api-error-overwrite' => 'ä¸å…许覆盖现有文件。',
+'api-error-stashfailed' => '内部错误:æœåŠ¡å™¨ä¿å­˜ä¸´æ—¶æ–‡ä»¶å¤±è´¥ã€‚',
+'api-error-timeout' => 'æœåŠ¡å™¨æ²¡æœ‰åœ¨é¢„期内å“应。',
+'api-error-unclassified' => 'å‘生未知错误',
+'api-error-unknown-code' => '未知错误:$1',
+'api-error-unknown-error' => '内部错误:å°è¯•ä¸Šä¼ æ–‡ä»¶æ—¶å‡ºé”™ã€‚',
+'api-error-unknown-warning' => '未知的警告:$1',
+'api-error-unknownerror' => '未知错误:$1。',
+'api-error-uploaddisabled' => '这个维基ä¸æŽ¥å—上传。',
+'api-error-verification-error' => '此文件å¯èƒ½å·²æŸå,或有错误的扩展å。',
+
);
diff --git a/languages/messages/MessagesZh_hant.php b/languages/messages/MessagesZh_hant.php
index a2632369..c20aba01 100644
--- a/languages/messages/MessagesZh_hant.php
+++ b/languages/messages/MessagesZh_hant.php
@@ -11,12 +11,14 @@
* @author Anakmalaysia
* @author Andrew971218
* @author Bencmq
+ * @author Breawycker
* @author FireJackey
* @author Frankou
* @author Gaoxuewei
* @author Hakka
* @author Horacewai2
* @author Hydra
+ * @author Hzy980512
* @author Jidanni
* @author Jimmy xu wrk
* @author Kaganer
@@ -563,20 +565,22 @@ $1',
'badarticleerror' => '無法在此é é€²è¡Œè©²æ“作。',
'cannotdelete' => '無法刪除é é¢æˆ–圖片"$1"。
它å¯èƒ½å·²ç¶“被其他人刪除了。',
+'cannotdelete-title' => '無法刪除“$1â€',
'badtitle' => '錯誤的標題',
'badtitletext' => '所請求é é¢çš„標題是無效的ã€ä¸å­˜åœ¨ï¼Œè·¨èªžè¨€æˆ–è·¨wiki連çµçš„標題錯誤。它å¯èƒ½åŒ…å«ä¸€å€‹æˆ–更多的ä¸èƒ½ç”¨æ–¼æ¨™é¡Œçš„字符。',
-'perfcached' => '下列是快å–資料,因此å¯èƒ½ä¸æ˜¯æœ€æ–°çš„:',
-'perfcachedts' => '下列是快å–資料,其最後更新時間是$1。',
+'perfcached' => '下列是快å–資料,因此å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。最多{{PLURAL:$1|åªæœ‰1個çµæžœ|$1個çµæžœ}}å¯ç”¨ã€‚',
+'perfcachedts' => '下列是快å–資料,其最後更新時間是$1。åªæœ‰{{PLURAL:$4|一個çµæžœ|$4個çµæžœ}}會被顯示。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
'querypage-no-updates' => 'ç›®å‰ç¦æ­¢å°æ­¤é é¢é€²è¡Œæ›´æ–°ã€‚此處的資料將ä¸èƒ½è¢«ç«‹å³é‡æ–°æ•´ç†ã€‚',
'wrong_wfQuery_params' => '錯誤的åƒæ•¸è¢«å‚³éžåˆ° wfQuery()<br />
函數:$1<br />
查詢:$2',
'viewsource' => '查看原始碼',
-'viewsourcefor' => '$1的原始碼',
+'viewsource-title' => '查看$1çš„æºä»£ç¢¼',
'actionthrottled' => '動作已壓制',
'actionthrottledtext' => '基於å垃圾的考é‡ï¼Œæ‚¨ç¾åœ¨æ–¼é€™æ®µçŸ­æ™‚間之中é™åˆ¶åŽ»ä½œé€™ä¸€å€‹å‹•ä½œï¼Œè€Œæ‚¨å·²ç¶“超éŽé€™å€‹ä¸Šé™ã€‚請在數分é˜å¾Œå†å˜—試。',
'protectedpagetext' => '該é é¢å·²è¢«ä¿è­·ä»¥é˜²æ­¢ç·¨è¼¯ã€‚',
'viewsourcetext' => '{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥æª¢è¦–並複製本é é¢çš„原始碼。',
+'viewyourtext' => "您å¯ä»¥æŸ¥çœ‹ä¸¦è¤‡è£½'''您å°æ­¤é é¢ä½œå‡ºç·¨è¼¯å¾Œ'''çš„æºä»£ç¢¼ï¼š",
'protectedinterface' => '該é æ供了軟體的介é¢æ–‡å­—,它已被ä¿è­·ä»¥é˜²æ­¢éš¨æ„的修改。',
'editinginterface' => "'''警告:''' 您正在編輯的é é¢æ˜¯ç”¨æ–¼æ供軟體的介é¢æ–‡å­—。改變此é å°‡å½±éŸ¿å…¶ä»–用戶的介é¢å¤–觀。如è¦ç¿»è­¯ï¼Œè«‹è€ƒæ…®ä½¿ç”¨[//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟件本地化的計劃。",
'sqlhidden' => '(隱è—SQL查詢)',
@@ -670,6 +674,7 @@ $2',
'noemailprefs' => '在您的åƒæ•¸è¨­ç½®ä¸­æŒ‡å®šä¸€å€‹é›»å­éƒµä»¶åœ°å€ä»¥ä½¿ç”¨æ­¤åŠŸèƒ½ã€‚',
'emailconfirmlink' => '確èªæ‚¨çš„郵箱地å€',
'invalidemailaddress' => '郵箱地å€æ ¼å¼ä¸æ­£ç¢ºï¼Œè«‹è¼¸å…¥æ­£ç¢ºçš„郵箱ä½å€æˆ–清空該輸入框。',
+'cannotchangeemail' => '本wikiä¸å…許å°è³¬æˆ¶çš„電郵地å€é€²è¡Œæ›´æ”¹ã€‚',
'accountcreated' => '已建立賬戶',
'accountcreatedtext' => '$1的賬戶已經被建立。',
'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
@@ -685,6 +690,7 @@ $2',
# E-mail sending
'php-mail-error-unknown' => '在 PHP çš„ mail() åƒæ•¸ä¸­çš„未知錯誤',
+'user-mail-no-addy' => '嘗試ä¸å¸¶é›»éƒµåœ°å€ç™¼é€é›»éƒµã€‚',
# Change password dialog
'resetpass' => '更改密碼',
@@ -706,16 +712,18 @@ $2',
'resetpass-temp-password' => '臨時密碼:',
# Special:PasswordReset
-'passwordreset' => 'é‡æ–°è¨­å®šå¯†ç¢¼',
-'passwordreset-text' => '完æˆæ­¤è¡¨æ ¼ä»¥æŽ¥æ”¶ä¸€å€‹é›»éƒµä»¥æ示你的帳戶詳情。',
-'passwordreset-legend' => 'é‡è¨­å¯†ç¢¼',
-'passwordreset-disabled' => '此維基上已ç¦æ­¢äº†é‡è¨­å¯†ç¢¼ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一個}}',
-'passwordreset-username' => '使用者å稱:',
-'passwordreset-domain' => '域å:',
-'passwordreset-email' => '電郵地å€ï¼š',
-'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細信æ¯',
-'passwordreset-emailtext-ip' => '有人(å¯èƒ½æ˜¯ä½ ï¼Œä¾†è‡ª$1這個IP)è¦æ±‚發出一個在{{SITENAME}}($4)的帳戶信
+'passwordreset' => 'é‡æ–°è¨­å®šå¯†ç¢¼',
+'passwordreset-text' => '完æˆæ­¤è¡¨æ ¼ä»¥æŽ¥æ”¶ä¸€å€‹é›»éƒµä»¥æ示你的帳戶詳情。',
+'passwordreset-legend' => 'é‡è¨­å¯†ç¢¼',
+'passwordreset-disabled' => '此維基上已ç¦æ­¢äº†é‡è¨­å¯†ç¢¼ã€‚',
+'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一個}}',
+'passwordreset-username' => '使用者å稱:',
+'passwordreset-domain' => '域å:',
+'passwordreset-capture' => '查看生æˆçš„é›»å­éƒµä»¶å—Žï¼Ÿ',
+'passwordreset-capture-help' => '如果您é¸ä¸­æ­¤æ¡†ï¼Œé›»å­éƒµä»¶ï¼ˆåŒ…括臨時密碼)將顯示,並發é€çµ¦ç”¨æˆ¶ã€‚',
+'passwordreset-email' => '電郵地å€ï¼š',
+'passwordreset-emailtitle' => '在{{SITENAME}}上的詳細信æ¯',
+'passwordreset-emailtext-ip' => '有人(å¯èƒ½æ˜¯ä½ ï¼Œä¾†è‡ª$1這個IP)è¦æ±‚發出一個在{{SITENAME}}($4)的帳戶信
æ¯æ示。該用戶{{PLURAL:$3|是|是}}與以下電郵地å€æœ‰é—œï¼š
$2
@@ -723,7 +731,7 @@ $2
{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。
你應該ç¾åœ¨ç™»å…¥ä¸¦é¸æ“‡ä¸€å€‹æ–°çš„密碼。如果ä¸æ˜¯ä½ ä½œå‡ºé€™å€‹è«‹æ±‚,åˆæˆ–你已經記
起你原來的密碼,你å¯ä»¥å¿½ç•¥æœ¬ä¿¡æ¯ä¸¦ä½¿ç”¨ä½ åŽŸä¾†çš„密碼。',
-'passwordreset-emailtext-user' => '用戶$1è¦æ±‚發出一個在{{SITENAME}}($4)的帳戶信æ¯æ示。該用戶{{PLURAL:$3|是|是}}與以下
+'passwordreset-emailtext-user' => '用戶$1è¦æ±‚發出一個在{{SITENAME}}($4)的帳戶信æ¯æ示。該用戶{{PLURAL:$3|是|是}}與以下
電郵地å€æœ‰é—œï¼š
$2
@@ -731,9 +739,22 @@ $2
{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。
你應該ç¾åœ¨ç™»å…¥ä¸¦é¸æ“‡ä¸€å€‹æ–°çš„密碼。如果ä¸æ˜¯ä½ ä½œå‡ºé€™å€‹è«‹æ±‚,åˆæˆ–你已經記
起你原來的密碼,你å¯ä»¥å¿½ç•¥æœ¬ä¿¡æ¯ä¸¦ä½¿ç”¨ä½ åŽŸä¾†çš„密碼。',
-'passwordreset-emailelement' => '用戶å:$1
+'passwordreset-emailelement' => '用戶å:$1
臨時密碼:$2',
-'passwordreset-emailsent' => '已發é€æ示電郵。',
+'passwordreset-emailsent' => '已發é€æ示電郵。',
+'passwordreset-emailsent-capture' => 'æ醒電å­éƒµä»¶å·²ç™¼é€ï¼Œä¸¦åœ¨ä¸‹é¢é¡¯ç¤ºã€‚',
+'passwordreset-emailerror-capture' => '生æˆçš„æ醒電å­éƒµä»¶å¦‚下所示,但發é€å¤±æ•—:$1',
+
+# Special:ChangeEmail
+'changeemail' => '更改電郵地å€',
+'changeemail-header' => '更改帳號電郵地å€',
+'changeemail-text' => '填寫表格以修改您的電郵地å€ã€‚您需è¦è¼¸å…¥æ‚¨çš„密碼以確èªæ­¤æ›´æ”¹ã€‚',
+'changeemail-no-info' => '您必須登錄方å¯ç›´æŽ¥è¨ªå•æ­¤é é¢ã€‚',
+'changeemail-oldemail' => '當å‰é›»éƒµåœ°å€ï¼š',
+'changeemail-newemail' => '新電郵地å€ï¼š',
+'changeemail-none' => '(無)',
+'changeemail-submit' => '更改電郵',
+'changeemail-cancel' => 'å–消',
# Edit page toolbar
'bold_sample' => '粗體文字',
@@ -798,9 +819,6 @@ $2
您ç¾æ™‚正在使用的 IP 地å€æ˜¯ $3,查å°ID是 #$5。 請在{{GENDER:|ä½ |妳|ä½ }}的查詢中註明以上所有的資料。",
'blockednoreason' => '無給出原因',
-'blockedoriginalsource' => "以下是'''$1'''çš„æºç¢¼ï¼š",
-'blockededitsource' => "{{GENDER:|ä½ |妳|ä½ }}å°'''$1'''進行'''編輯'''的文字如下:",
-'whitelistedittitle' => '登入後æ‰å¯ç·¨è¼¯',
'whitelistedittext' => '您必須先$1æ‰å¯ç·¨è¼¯é é¢ã€‚',
'confirmedittext' => '在編輯此é ä¹‹å‰æ‚¨å¿…須確èªæ‚¨çš„郵箱ä½å€ã€‚è«‹é€éŽ[[Special:Preferences|å好設定]]設定並驗證您的郵箱地å€ã€‚',
'nosuchsectiontitle' => '找ä¸åˆ°æ®µè½',
@@ -883,7 +901,8 @@ $2
如果您ä¸å¸Œæœ›æ‚¨çš„文字被任æ„修改和å†æ•£ä½ˆï¼Œè«‹ä¸è¦æ交。<br />
您åŒæ™‚也è¦å‘我們ä¿è­‰æ‚¨æ‰€æ交的內容是您自己所作,或得自一個ä¸å—版權ä¿è­·æˆ–相似自由的來æºï¼ˆåƒé–±$1的細節)。
'''ä¸è¦åœ¨æœªç²æŽˆæ¬Šçš„情æ³ä¸‹ç™¼è¡¨ï¼'''",
-'longpageerror' => "'''錯誤: 您所æ交的文字長度有$1KB,這大於$2KB的最大值。'''該文本ä¸èƒ½è¢«å„²å­˜ã€‚",
+'longpageerror' => "'''錯誤:您所æ交的文本長度有{{PLURAL:$1|1|$1}}KB,這大於{{PLURAL:$2|1|$2}}KB的最大值。 '''
+因此,該文本無法ä¿å­˜ã€‚",
'readonlywarning' => "'''警告: 資料庫被鎖定以進行維護,所以您目å‰å°‡ç„¡æ³•ä¿å­˜æ‚¨çš„修改。'''您或許希望先將本段文字複製並ä¿å­˜åˆ°æ–‡å­—檔案,然後等一會兒å†ä¿®æ”¹ã€‚
鎖定資料庫的管ç†å“¡æœ‰å¦‚下解釋:$1",
@@ -1037,8 +1056,6 @@ $2
'revdelete-unsuppress' => '在已æ¢å¾©çš„修訂中移除é™åˆ¶',
'revdelete-log' => 'ç†ç”±ï¼š',
'revdelete-submit' => '應用於é¸å–çš„{{PLURAL:$1|修訂}}',
-'revdelete-logentry' => '已更改「[[$1]]ã€ä¹‹ä¿®è¨‚å¯è¦‹åº¦',
-'logdelete-logentry' => '「[[$1]]ã€çš„事件å¯è¦‹æ€§å·²æ›´æ”¹',
'revdelete-success' => "'''修訂的å¯è¦‹æ€§å·²ç¶“æˆåŠŸæ›´æ–°ã€‚'''",
'revdelete-failure' => "'''修訂的å¯è¦‹æ€§ç„¡æ³•æ›´æ–°ï¼š'''
$1",
@@ -1050,15 +1067,6 @@ $1",
'revdel-restore-visible' => 'å¯è¦‹çš„修訂版本',
'pagehist' => 'é é¢æ­·å²',
'deletedhist' => '已刪除之歷å²',
-'revdelete-content' => '內容',
-'revdelete-summary' => '編輯摘è¦',
-'revdelete-uname' => '用戶å',
-'revdelete-restricted' => '已應用é™åˆ¶è‡³æ“作員',
-'revdelete-unrestricted' => '已移除å°æ–¼æ“作員的é™åˆ¶',
-'revdelete-hid' => 'éš±è— $1',
-'revdelete-unhid' => 'ä¸éš±è— $1',
-'revdelete-log-message' => '$1的$2次修訂',
-'logdelete-log-message' => '$1的$2項事件',
'revdelete-hide-current' => '正在隱è—æ–¼$1 $2之項目錯誤:這個是ç¾æ™‚的修訂,ä¸å¯ä»¥éš±è—。',
'revdelete-show-no-access' => '正在顯示於$1 $2之項目錯誤:這個項目已經標示為"å·²é™åˆ¶",您å°å®ƒä¸¦ç„¡é€šè¡Œæ¬Šã€‚',
'revdelete-modify-no-access' => '正在更改於$1 $2之項目錯誤:這個項目已經標示為"å·²é™åˆ¶",您å°å®ƒä¸¦ç„¡é€šè¡Œæ¬Šã€‚',
@@ -1208,12 +1216,14 @@ $1",
'prefs-rc' => '最近更改',
'prefs-watchlist' => '監視列表',
'prefs-watchlist-days' => '監視列表中顯示記錄的天數:',
-'prefs-watchlist-days-max' => '最多 7 天',
+'prefs-watchlist-days-max' => '最多$1{{PLURAL:$1|天}}',
'prefs-watchlist-edits' => '在增強的監視列表中顯示的最多更改次數:',
'prefs-watchlist-edits-max' => '最大數é‡ï¼š1000',
'prefs-watchlist-token' => '監視列表密鑰:',
'prefs-misc' => '雜項',
'prefs-resetpass' => '更改密碼',
+'prefs-changeemail' => '更改電郵',
+'prefs-setemail' => '設置電郵地å€',
'prefs-email' => '電郵é¸é …',
'prefs-rendering' => '外觀',
'saveprefs' => '儲存',
@@ -1272,6 +1282,7 @@ $1",
'yourrealname' => '真實姓å:',
'yourlanguage' => '介é¢èªžè¨€ï¼š',
'yourvariant' => '內容語言變體:',
+'prefs-help-variant' => '您希望用於顯示本站內容的語種或拼寫語系。',
'yournick' => 'æ–°ç°½å:',
'prefs-help-signature' => '在討論é é¢ä¸Šçš„評論應該è¦ç”¨ã€Œ<nowiki>~~~~</nowiki>ã€ç°½å,這樣便會轉æ›æˆ{{GENDER:|ä½ |妳|ä½ }}çš„ç°½å以åŠä¸€å€‹æ™‚間截記。',
'badsig' => '錯誤的原始簽å。請檢查HTML標籤。',
@@ -1312,7 +1323,7 @@ $1",
'userrights-lookup-user' => '管ç†ç”¨æˆ¶ç¾¤çµ„',
'userrights-user-editname' => '輸入用戶å:',
'editusergroup' => '編輯用戶群組',
-'editinguser' => "正在更改用戶'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) 的用戶權é™",
+'editinguser' => "更改用戶'''[[User:$1|$1]]''' çš„ç”¨æˆ¶æ¬Šé™ $2",
'userrights-editusergroup' => '編輯用戶群組',
'saveusergroups' => 'ä¿å­˜ç”¨æˆ¶ç¾¤çµ„',
'userrights-groupsmember' => '屬於:',
@@ -1406,13 +1417,13 @@ $1",
'right-autopatrol' => '將自己的編輯自動標示為已巡查的',
'right-patrolmarks' => '檢視最近巡查標記更改',
'right-unwatchedpages' => '檢視未監視之é é¢',
-'right-trackback' => 'éžäº¤ä¸€å€‹trackback',
'right-mergehistory' => 'åˆä½µé é¢æ­·å²',
'right-userrights' => '編輯所有用戶的權é™',
'right-userrights-interwiki' => '編輯在其它wiki上的用戶權é™',
'right-siteadmin' => '鎖定和解除鎖定資料庫',
'right-override-export-depth' => '匯出å«æœ‰äº”層深度連çµé é¢ä¹‹é é¢',
'right-sendemail' => '發電å­éƒµä»¶çµ¦å…¶ä»–用戶',
+'right-passwordreset' => '查看é‡ç½®å¯†ç¢¼éƒµä»¶',
# User rights log
'rightslog' => '用戶權é™æ—¥èªŒ',
@@ -1446,16 +1457,17 @@ $1",
'action-suppressionlog' => '檢視這個ç§æœ‰æ—¥èªŒ',
'action-block' => 'å°éŽ–這ä½ç”¨æˆ¶çš„編輯',
'action-protect' => '更改這個é é¢çš„ä¿è­·ç­‰ç´š',
+'action-rollback' => '快速回退最後å°ç‰¹å®šé é¢ä½œå‡ºçš„編輯的用戶的所有編輯',
'action-import' => 'ç”±å¦ä¸€å€‹wiki匯入這個é é¢',
'action-importupload' => '由一個檔案上載中匯入這個é é¢',
'action-patrol' => '標示其它的編輯為已巡查的',
'action-autopatrol' => '將您的編輯標示為已巡查的',
'action-unwatchedpages' => '檢視未被人監視的é é¢',
-'action-trackback' => 'éžäº¤ä¸€å€‹trackback',
'action-mergehistory' => 'åˆä½µé€™å€‹é é¢çš„æ­·å²',
'action-userrights' => '編輯所有的權é™',
'action-userrights-interwiki' => '編輯在其它wiki上用戶的權é™',
'action-siteadmin' => '鎖定和解除鎖定資料庫',
+'action-sendemail' => '發é€é›»éƒµ',
# Recent changes
'nchanges' => '$1次更改',
@@ -1487,6 +1499,7 @@ $1",
'number_of_watching_users_pageview' => '[$1個關注用戶]',
'rc_categories' => '分類界é™ï¼ˆä»¥"|"分割)',
'rc_categories_any' => 'ä»»æ„',
+'rc-change-size-new' => '更改後$1字節',
'newsectionsummary' => '/* $1 */ 新段è½',
'rc-enhanced-expand' => '顯示細節 ï¼ˆéœ€è¦ JavaScript)',
'rc-enhanced-hide' => 'éš±è—細節',
@@ -1541,6 +1554,7 @@ $1",
'ignorewarnings' => '忽略所有警告',
'minlength1' => '檔案å字必須至少有一個字æ¯ã€‚',
'illegalfilename' => '檔案å“$1â€åŒ…å«æœ‰é é¢æ¨™é¡Œæ‰€ç¦æ­¢çš„字符。請改å後é‡æ–°ä¸Šå‚³ã€‚',
+'filename-toolong' => '文件åä¸èƒ½è¶…éŽ240字節。',
'badfilename' => '檔案å已被改為「$1ã€ã€‚',
'filetype-mime-mismatch' => '檔案擴展å ".$1" ä¸é…所åµæ¸¬æª”案的MIMEé¡žåž‹ ($2)。',
'filetype-badmime' => 'MIME類別"$1"ä¸æ˜¯å®¹è¨±çš„檔案格å¼ã€‚',
@@ -1626,6 +1640,41 @@ $1',
'upload-unknown-size' => '未知的大å°',
'upload-http-error' => '已發生一個HTTP錯誤:$1',
+# File backend
+'backend-fail-stream' => '無法æµå‚³é€æ–‡ä»¶$1。',
+'backend-fail-backup' => '無法備份文件$1。',
+'backend-fail-notexists' => 'æ¢ç›®$1ä¸å­˜åœ¨ã€‚',
+'backend-fail-hashes' => '比較無法ç²å–文件hashes',
+'backend-fail-notsame' => '$1已存在ä¸åŒçš„文件。',
+'backend-fail-invalidpath' => '$1ä¸æ˜¯æœ‰æ•ˆçš„存儲路徑。',
+'backend-fail-delete' => '無法刪除「$1ã€æª”案。',
+'backend-fail-alreadyexists' => '“$1â€é é¢å·²å­˜åœ¨',
+'backend-fail-store' => '無法在$2存儲文件$1。',
+'backend-fail-copy' => '無法複製文件$1到$2。',
+'backend-fail-move' => '無法移動文件$1到$2。',
+'backend-fail-opentemp' => '無法打開臨時文件。',
+'backend-fail-writetemp' => '無法寫臨時文件。',
+'backend-fail-closetemp' => '無法創建臨時文件。',
+'backend-fail-read' => '找ä¸åˆ°æ–‡ä»¶â€œ$1â€ã€‚',
+'backend-fail-create' => '找ä¸åˆ°ã€Œ$1ã€æª”案。',
+'backend-fail-readonly' => '「$1ã€å„²å­˜å¾Œç«¯ç›®å‰æ˜¯å”¯è®€æ¨¡å¼ï¼Œå› ç‚ºï¼šã€Œ$2ã€',
+'backend-fail-synced' => '文件"$1"在內部後端是ä¸ä¸€è‡´çš„å€åŸŸã€‚',
+'backend-fail-connect' => '無法連çµè‡³æª”案後方“$1â€ã€‚',
+'backend-fail-internal' => '檔案後方“$1â€ç™¼ç”Ÿäº†ä¸€å€‹æœªçŸ¥éŒ¯èª¤ã€‚',
+'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於“$1â€ã€‚',
+'backend-fail-batchsize' => '鑒於一批後端 $1 檔 {{PLURAL:$1| operation|operations}} ï¼›é™åˆ¶æ˜¯ $2 {{PLURAL:$2| operation|operations}}。',
+
+# Lock manager
+'lockmanager-notlocked' => '無法解鎖「$1ã€ï¼›å®ƒæ²’有被鎖定。',
+'lockmanager-fail-closelock' => '無法關閉「$1ã€çš„鎖文件。',
+'lockmanager-fail-deletelock' => '無法刪除「$1ã€çš„鎖文件。',
+'lockmanager-fail-acquirelock' => '無法為「$1ã€ç²å–鎖。',
+'lockmanager-fail-openlock' => '無法打開「$1ã€çš„鎖文件。',
+'lockmanager-fail-releaselock' => '無法為「$1ã€é‡‹æ”¾éŽ–。',
+'lockmanager-fail-db-bucket' => 'ä¸èƒ½åœ¨$1池中è¯ç¹«åˆ°è¶³å¤ éŽ–數據庫。',
+'lockmanager-fail-db-release' => 'ä¸èƒ½åœ¨æ•¸æ“šåº«$1上釋放鎖。',
+'lockmanager-fail-svr-release' => 'ä¸èƒ½åœ¨æœå‹™å™¨$1上釋放鎖。',
+
# ZipDirectoryReader
'zip-file-open-error' => '打開檔案的 ZIP 檢查時é‡åˆ°ä¸€å€‹éŒ¯èª¤ã€‚',
'zip-wrong-format' => '指定的檔案ä¸æ˜¯ZIP檔案。',
@@ -1642,6 +1691,7 @@ $1',
'uploadstash-badtoken' => '進行這個動作ä¸æˆåŠŸï¼Œæˆ–者{{GENDER:|ä½ |妳|ä½ }}的編輯資訊已經éŽæœŸã€‚è«‹å†è©¦ã€‚',
'uploadstash-errclear' => '清除檔案ä¸æˆåŠŸã€‚',
'uploadstash-refresh' => '更新檔案清單',
+'invalid-chunk-offset' => '無效å€å¡Šå移é‡',
# img_auth script messages
'img-auth-accessdenied' => '拒絕存å–',
@@ -1745,24 +1795,25 @@ $1',
'filerevert-badversion' => '這個檔案所æ供的時間截記並無先å‰çš„本地版本。',
# File deletion
-'filedelete' => '刪除$1',
-'filedelete-legend' => '刪除檔案',
-'filedelete-intro' => "您ç¾æ­£åˆªé™¤æª”案'''[[Media:$1|$1]]'''。",
-'filedelete-intro-old' => "{{GENDER:|ä½ |妳|ä½ }}ç¾æ­£åˆªé™¤'''[[Media:$1|$1]]'''æ–¼[$4 $2 $3]的版本。",
-'filedelete-comment' => 'ç†ç”±ï¼š',
-'filedelete-submit' => '刪除',
-'filedelete-success' => "'''$1'''已經刪除。",
-'filedelete-success-old' => "'''[[Media:$1|$1]]'''於 $2 $3 的版本已經刪除。",
-'filedelete-nofile' => "'''$1'''ä¸å­˜åœ¨ã€‚",
-'filedelete-nofile-old' => "在已指定屬性的情æ³ä¸‹ï¼Œé€™è£¡æ²’有'''$1'''çš„ä¿å­˜ç‰ˆæœ¬ã€‚",
-'filedelete-otherreason' => '其它ï¼é™„加的ç†ç”±:',
-'filedelete-reason-otherlist' => '其它ç†ç”±',
-'filedelete-reason-dropdown' => '
+'filedelete' => '刪除$1',
+'filedelete-legend' => '刪除檔案',
+'filedelete-intro' => "您ç¾æ­£åˆªé™¤æª”案'''[[Media:$1|$1]]'''。",
+'filedelete-intro-old' => "{{GENDER:|ä½ |妳|ä½ }}ç¾æ­£åˆªé™¤'''[[Media:$1|$1]]'''æ–¼[$4 $2 $3]的版本。",
+'filedelete-comment' => 'ç†ç”±ï¼š',
+'filedelete-submit' => '刪除',
+'filedelete-success' => "'''$1'''已經刪除。",
+'filedelete-success-old' => "'''[[Media:$1|$1]]'''於 $2 $3 的版本已經刪除。",
+'filedelete-nofile' => "'''$1'''ä¸å­˜åœ¨ã€‚",
+'filedelete-nofile-old' => "在已指定屬性的情æ³ä¸‹ï¼Œé€™è£¡æ²’有'''$1'''çš„ä¿å­˜ç‰ˆæœ¬ã€‚",
+'filedelete-otherreason' => '其它ï¼é™„加的ç†ç”±:',
+'filedelete-reason-otherlist' => '其它ç†ç”±',
+'filedelete-reason-dropdown' => '
*常用刪除ç†ç”±
** 侵犯版權
** é‡è¦†æª”案',
-'filedelete-edit-reasonlist' => '編輯刪除埋由',
-'filedelete-maintenance' => '當在維護時已經暫時åœç”¨æª”案刪除和æ¢å¾©ã€‚',
+'filedelete-edit-reasonlist' => '編輯刪除埋由',
+'filedelete-maintenance' => '當在維護時已經暫時åœç”¨æª”案刪除和æ¢å¾©ã€‚',
+'filedelete-maintenance-title' => '無法刪除文件',
# MIME search
'mimesearch' => 'MIME æœå°‹',
@@ -1862,6 +1913,8 @@ Template:消除歧義',
'wantedpages' => 'å¾…æ’°é é¢',
'wantedpages-badtitle' => '在çµæžœçµ„上的無效標題: $1',
'wantedfiles' => '需è¦çš„檔案',
+'wantedfiletext-cat' => '以下檔案被使用,但ä¸å­˜åœ¨ã€‚外部儲存庫的文件儘管ç¾æœ‰ï¼Œä½†å¯èƒ½æœƒåœ¨æ­¤åˆ—出,任何此類的誤報將被<del>剔除</del>。此外,內嵌了ä¸å­˜åœ¨çš„檔案的網é å°‡åœ¨[[:$1]]列出。',
+'wantedfiletext-nocat' => '以下檔案被使用,但ä¸å­˜åœ¨ã€‚外部儲存庫的文件儘管ç¾æœ‰ï¼Œä½†å¯èƒ½æœƒåœ¨æ­¤åˆ—出,任何此類的誤報將被<del>剔除</del>。',
'wantedtemplates' => '需è¦çš„模æ¿',
'mostlinked' => '最多連çµé é¢',
'mostlinkedcategories' => '最多連çµåˆ†é¡ž',
@@ -1870,6 +1923,7 @@ Template:消除歧義',
'mostimages' => '最多連çµæª”案',
'mostrevisions' => '最多修訂é é¢',
'prefixindex' => '所有有å‰ç¶´çš„é é¢',
+'prefixindex-namespace' => '帶有å‰ç¶´çš„é é¢ï¼ˆå±¬æ–¼$1å字空間)',
'shortpages' => '短é é¢',
'longpages' => 'é•·é é¢',
'deadendpages' => '斷連é é¢',
@@ -1886,7 +1940,7 @@ Template:消除歧義',
'listusers-editsonly' => 'åªé¡¯ç¤ºæœ‰ç·¨è¼¯çš„用戶',
'listusers-creationsort' => '按建立日期排åº',
'usereditcount' => '$1 次編輯',
-'usercreated' => '於$1 $2建立',
+'usercreated' => '$1 $2{{GENDER:$3|創建}}',
'newpages' => '最新é é¢',
'newpages-username' => '用戶å:',
'ancientpages' => '最舊é é¢',
@@ -1978,12 +2032,8 @@ Template:消除歧義',
'activeusers-noresult' => '找ä¸åˆ°ç”¨æˆ¶ã€‚',
# Special:Log/newusers
-'newuserlogpage' => '新進用戶å冊',
-'newuserlogpagetext' => '這是一個最近被創建用戶的新日誌',
-'newuserlog-byemail' => '密碼已由電å­éƒµä»¶å¯„出',
-'newuserlog-create-entry' => '新進使用者帳戶',
-'newuserlog-create2-entry' => '已創建$1的新賬戶',
-'newuserlog-autocreate-entry' => '自動建立的帳號',
+'newuserlogpage' => '新進用戶å冊',
+'newuserlogpagetext' => '這是一個最近被創建用戶的新日誌',
# Special:ListGroupRights
'listgrouprights' => '用戶群組權é™',
@@ -2014,7 +2064,7 @@ Template:消除歧義',
'emailpagetext' => '您å¯ä»¥ç”¨ä¸‹é¢çš„表格去寄一å°é›»éƒµçµ¦é€™ä½ç”¨æˆ¶ã€‚
您在[[Special:Preferences|您åƒæ•¸è¨­ç½®]]中所輸入的e-mail地å€å°‡å‡ºç¾åœ¨éƒµä»¶ã€Œç™¼ä»¶äººã€ä¸€æ¬„中,這樣該用戶就å¯ä»¥å›žè¦†æ‚¨ã€‚',
'usermailererror' => '目標郵件地å€è¿”回錯誤:',
-'defemailsubject' => '{{SITENAME}}é›»å­éƒµä»¶',
+'defemailsubject' => '{{SITENAME}}用戶 $1 發é€é›»å­éƒµä»¶',
'usermaildisabled' => '用戶電郵已åœç”¨',
'usermaildisabledtext' => '您ä¸å¯ä»¥ç™¼é€é›»éƒµåˆ°é€™å€‹wiki上的其他用戶',
'noemailtitle' => 'ç„¡e-mail地å€',
@@ -2068,7 +2118,7 @@ Template:消除歧義',
'watchmethod-list' => '檢查最近編輯的被監視é é¢',
'watchlistcontains' => '您的監視列表包å«$1個é é¢ã€‚',
'iteminvalidname' => "é é¢ '$1' 錯誤,無效命å...",
-'wlnote' => '以下是最近<b>$2</b>å°æ™‚內的最後$1次修改。',
+'wlnote' => "截至$3 $4,以下是最近'''$2'''å°æ™‚內的最後'''$1'''次修改。",
'wlshowlast' => '顯示最近$1å°æ™‚ï¼›$2天;$3的修改。',
'watchlist-options' => '監視列表é¸é …',
@@ -2134,8 +2184,6 @@ $UNWATCHURL
'actioncomplete' => 'æ“作完æˆ',
'actionfailed' => 'æ“作失敗',
'deletedtext' => '「$1ã€å·²ç¶“被刪除。最近刪除的記錄請åƒè¦‹$2。',
-'deletedarticle' => '已刪除「[[$1]]ã€',
-'suppressedarticle' => '已廢止「[[$1]]ã€',
'dellogpage' => '刪除紀錄',
'dellogpagetext' => '以下是最近的刪除的列表。',
'deletionlog' => '刪除紀錄',
@@ -2181,7 +2229,10 @@ $UNWATCHURL
'unprotectedarticle' => '已解除"[[$1]]"ä¿è­·',
'movedarticleprotection' => '已將「[[$2]]ã€çš„ä¿è­·è¨­å®šç§»å‹•è‡³ã€Œ[[$1]]ã€',
'protect-title' => '更改「$1ã€çš„ä¿è­·ç­‰ç´š',
+'protect-title-notallowed' => '查看“$1â€çš„ä¿è­·ç­‰ç´š',
'prot_1movedto2' => '[[$1]]移動到[[$2]]',
+'protect-badnamespace-title' => 'ä¸å¯è¢«ä¿è­·çš„å字空間',
+'protect-badnamespace-text' => '這個å字空間內的é é¢ç„¡æ³•è¢«ä¿è­·ã€‚',
'protect-legend' => '確èªä¿è­·',
'protectcomment' => 'ç†ç”±ï¼š',
'protectexpiry' => '到期:',
@@ -2202,6 +2253,7 @@ $UNWATCHURL
'protect-level-sysop' => '僅æ“作員',
'protect-summary-cascade' => '連鎖',
'protect-expiring' => '終止於 $1 (UTC)',
+'protect-expiring-local' => '$1到期',
'protect-expiry-indefinite' => '永久',
'protect-cascade' => 'ä¿è­·æœ¬é ä¸­åŒ…å«çš„é é¢ (連鎖ä¿è­·ï¼‰',
'protect-cantedit' => '您無法更改這個é é¢çš„ä¿è­·ç­‰ç´šï¼Œå› ç‚ºæ‚¨æ²’有權é™åŽ»ç·¨è¼¯å®ƒã€‚',
@@ -2259,13 +2311,13 @@ $UNWATCHURL
'undeletereset' => 'é‡è¨­',
'undeleteinvert' => 'åå‘é¸æ“‡',
'undeletecomment' => 'ç†ç”±ï¼š',
-'undeletedarticle' => '已經æ¢å¾©ã€Œ$1ã€',
'undeletedrevisions' => '$1個修訂版本已經æ¢å¾©',
'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被æ¢å¾©',
'undeletedfiles' => '$1 個檔案被æ¢å¾©',
'cannotundelete' => 'æ¢å¾©å¤±æ•—ï¼›å¯èƒ½ä¹‹å‰å·²ç¶“被其他人æ¢å¾©ã€‚',
'undeletedpage' => "'''$1已經被æ¢å¾©''' è«‹åƒè€ƒ[[Special:Log/delete|刪除日誌]]來查詢刪除åŠæ¢å¾©è¨˜éŒ„。",
'undelete-header' => '如è¦æŸ¥è©¢æœ€è¿‘的記錄請åƒé–±[[Special:Log/delete|刪除日誌]]。',
+'undelete-search-title' => 'æœç´¢å·²åˆªé™¤é é¢',
'undelete-search-box' => 'æœå°‹å·²åˆªé™¤é é¢',
'undelete-search-prefix' => '顯示é é¢è‡ª:',
'undelete-search-submit' => 'æœå°‹',
@@ -2274,6 +2326,7 @@ $UNWATCHURL
'undelete-bad-store-key' => 'ä¸èƒ½åˆªé™¤å¸¶æœ‰æ™‚間截記的檔案修訂 $1: 檔案於刪除å‰éºå¤±ã€‚',
'undelete-cleanup-error' => '刪除無用的存檔檔案 "$1" 時發生錯誤。',
'undelete-missing-filearchive' => '由於檔案存檔 ID $1 ä¸åœ¨è³‡æ–™åº«ä¸­ï¼Œä¸èƒ½åœ¨æª”案存檔中æ¢å¾©ã€‚它å¯èƒ½å·²ç¶“å刪除了。',
+'undelete-error' => 'æ¢å¾©å·²åˆªé™¤é é¢æ™‚出錯',
'undelete-error-short' => 'å刪除檔案時發生錯誤: $1',
'undelete-error-long' => '當進行å刪除檔案時é‡åˆ°éŒ¯èª¤:
@@ -2395,6 +2448,7 @@ $1',
'blocklist-userblocks' => 'éš±è—用戶å°ç¦',
'blocklist-tempblocks' => 'éš±è—臨時å°ç¦',
'blocklist-addressblocks' => 'éš±è—單一IPå°ç¦',
+'blocklist-rangeblocks' => 'éš±è—IP段å°ç¦',
'blocklist-timestamp' => '時間',
'blocklist-target' => '目標',
'blocklist-expiry' => 'éŽæœŸ',
@@ -2417,6 +2471,7 @@ $1',
'unblocklink' => '解除ç¦å°',
'change-blocklink' => '更改å°ç¦',
'contribslink' => 'è²¢ç»',
+'emaillink' => '傳é€é›»éƒµ',
'autoblocker' => '因為您與“[[User:$1|$1]]â€å…±äº«ä¸€å€‹IP地å€è€Œè¢«è‡ªå‹•æŸ¥å°ã€‚
$1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'blocklogpage' => '查å°æ—¥èªŒ',
@@ -2543,9 +2598,6 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'movepage-page-moved' => 'é é¢ $1 已經移動到 $2。',
'movepage-page-unmoved' => 'é é¢ $1 ä¸å¯ä»¥ç§»å‹•åˆ° $2。',
'movepage-max-pages' => '最多有$1個é é¢å·²ç¶“移動åŒæ™‚ä¸å¯ä»¥è‡ªå‹•åœ°å†ç§»å‹•æ›´å¤šã€‚',
-'1movedto2' => '[[$1]]移動到[[$2]]',
-'1movedto2_redir' => '[[$1]]移動到é‡å®šå‘é [[$2]]',
-'move-redirect-suppressed' => 'å·²ç¦æ­¢é‡æ–°å®šå‘',
'movelogpage' => '移動日誌',
'movelogpagetext' => '以下是所有移動的é é¢æ¸…å–®:',
'movesubpage' => '{{PLURAL:$1|å­é é¢|å­é é¢}}',
@@ -2558,7 +2610,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
目標é é¢"[[:$1]]"已經存在。{{GENDER:|ä½ |妳|ä½ }}確èªéœ€è¦åˆªé™¤åŽŸé é¢ä¸¦ä»¥é€²è¡Œç§»å‹•å—Žï¼Ÿ',
'delete_and_move_confirm' => '是的,刪除此é é¢',
-'delete_and_move_reason' => '刪除以便移動',
+'delete_and_move_reason' => '刪除以便移動[[$1]]',
'selfmove' => '原始標題與目標標題相åŒï¼Œæ‚¨ä¸èƒ½ç§»å‹•ä¸€é è¦†è“‹æœ¬èº«ã€‚',
'immobile-source-namespace' => 'ä¸å¯ä»¥åœ¨ç©ºé–“å「$1ã€ä¸Šç§»å‹•é é¢',
'immobile-target-namespace' => 'ä¸å¯ä»¥å°‡é é¢ç§»å‹•åˆ°ã€Œ$1ã€ç©ºé–“å中',
@@ -2589,9 +2641,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
或是åªé¸æ“‡åŒ¯å‡ºå¸¶æœ‰æœ€å¾Œä¸€æ¬¡ç·¨è¼¯è¨Šæ¯çš„ç›®å‰ä¿®è¨‚版本。
此外{{GENDER:|ä½ |妳|ä½ }}é‚„å¯ä»¥åˆ©ç”¨é€£çµåŒ¯å‡ºæª”案,例如{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥ä½¿ç”¨ [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 匯出「[[{{MediaWiki:Mainpage}}]]ã€é é¢ã€‚',
+'exportall' => '導出所有é é¢',
'exportcuronly' => '僅包å«ç›®å‰çš„修訂,而ä¸æ˜¯å…¨éƒ¨çš„æ­·å²ã€‚',
'exportnohistory' => "----
'''注æ„:''' 由於性能原因,從此表單匯出é é¢çš„全部歷å²å·²è¢«åœç”¨ã€‚",
+'exportlistauthors' => '為æ¯å€‹é é¢åŒ…å«è²¢ç»è€…的完整列表',
'export-submit' => '匯出',
'export-addcattext' => '由分類中加入é é¢:',
'export-addcat' => '新增',
@@ -2624,6 +2678,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'thumbnail_error' => '創建縮圖錯誤: $1',
'djvu_page_error' => 'DjVué é¢è¶…出範åœ',
'djvu_no_xml' => '無法在DjVu檔案中擷å–XML',
+'thumbnail-temp-create' => '無法創建臨時縮略圖文件',
+'thumbnail-dest-create' => '無法將縮略圖ä¿å­˜åˆ°ç›®æ¨™åœ°é»ž',
'thumbnail_invalid_params' => 'ä¸æ­£ç¢ºçš„縮圖åƒæ•¸',
'thumbnail_dest_directory' => '無法建立目標目錄',
'thumbnail_image-type' => '圖片類型ä¸æ”¯æ´',
@@ -2668,6 +2724,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'import-upload' => '上傳XML資料',
'import-token-mismatch' => 'å°ç¯€è³‡æ–™éºå¤±ã€‚è«‹å†å˜—試。',
'import-invalid-interwiki' => 'ä¸èƒ½åœ¨æŒ‡å®šçš„wiki匯入。',
+'import-error-edit' => '「$1ã€ç„¡æ³•å°Žå…¥ï¼Œå› ç‚ºæ‚¨ä¸å‡†ç·¨è¼¯å®ƒã€‚',
+'import-error-create' => '「$1ã€ç„¡æ³•å°Žå…¥ï¼Œå› ç‚ºæ‚¨ä¸å‡†å‰µé€ å®ƒã€‚',
+'import-error-interwiki' => 'é é¢"$1"未能導入,這是因為他的é é¢å稱é ç•™äº†ä¾›è·¨ç¶­åŸºé€£çµä½¿ç”¨ã€‚',
+'import-error-special' => '"$1"未能導入因為該é é¢ä½¿ç”¨ä¸€å€‹ä¸èƒ½å‰µå»ºé é¢çš„特殊å字空間。',
+'import-error-invalid' => '"$1"ä¸èƒ½å°Žå…¥ï¼Œå› ç‚ºå字無效。',
# Import log
'importlogpage' => '匯入日誌',
@@ -2677,72 +2738,85 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'import-logentry-interwiki' => 'è·¨ wiki $1',
'import-logentry-interwiki-detail' => '來自$2的$1個修訂',
+# JavaScriptTest
+'javascripttest' => 'JavaScript測試',
+'javascripttest-disabled' => '此功能已ç¦ç”¨ã€‚',
+'javascripttest-title' => 'é‹è¡Œ$1測試。',
+'javascripttest-pagetext-noframework' => '這個é é¢é ç•™äº†ä½œJavaScript測試。',
+'javascripttest-pagetext-unknownframework' => '未知框架"$1"',
+'javascripttest-pagetext-frameworks' => 'è«‹é¸æ“‡ä»¥ä¸‹å…¶ä¸­ä¸€å€‹æ¸¬è©¦æ¡†æž¶ï¼š$1',
+'javascripttest-pagetext-skins' => 'é¸æ“‡é‹è¡Œæ¸¬è©¦çš„外觀:',
+'javascripttest-qunit-intro' => '請看mediawiki.org的[$1 測試說明]',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit 測試套件',
+
# Tooltip help for the actions
-'tooltip-pt-userpage' => '您的使用者é é¢',
-'tooltip-pt-anonuserpage' => '您編輯本站所用IPçš„å°æ‡‰ç”¨æˆ¶é ',
-'tooltip-pt-mytalk' => '您的å°è©±é ',
-'tooltip-pt-anontalk' => 'å°æ–¼ä¾†è‡ªæ­¤IP地å€ç·¨è¼¯çš„å°è©±',
-'tooltip-pt-preferences' => '您的å好設定',
-'tooltip-pt-watchlist' => '您所監視é é¢çš„更改列表',
-'tooltip-pt-mycontris' => '您的貢ç»åˆ—表',
-'tooltip-pt-login' => '建議您登入,儘管並éžå¿…須。',
-'tooltip-pt-anonlogin' => '建議您登入,儘管並éžå¿…須。',
-'tooltip-pt-logout' => '登出',
-'tooltip-ca-talk' => '關於é é¢æ­£æ–‡çš„討論',
-'tooltip-ca-edit' => '您å¯ä»¥ç·¨è¼¯æ­¤é ï¼Œè«‹åœ¨ä¿å­˜ä¹‹å‰å…ˆé è¦½ä¸€ä¸‹ã€‚',
-'tooltip-ca-addsection' => '開始一個新å°ç¯€',
-'tooltip-ca-viewsource' => '該é é¢å·²è¢«ä¿è­·ã€‚{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥æª¢è¦–該é åŽŸå§‹ç¢¼ã€‚',
-'tooltip-ca-history' => '本é é¢çš„æ—©å‰ä¿®è¨‚版本',
-'tooltip-ca-protect' => 'ä¿è­·é€™å€‹é é¢',
-'tooltip-ca-unprotect' => '更改此é ä¿è­·',
-'tooltip-ca-delete' => '刪除本é ',
-'tooltip-ca-undelete' => '將這個é é¢æ¢å¾©åˆ°è¢«åˆªé™¤ä»¥å‰çš„狀態',
-'tooltip-ca-move' => '移動本é ',
-'tooltip-ca-watch' => '將此é é¢åŠ å…¥ç›£è¦–列表',
-'tooltip-ca-unwatch' => '將此é é¢å¾žç›£è¦–列表中移除',
-'tooltip-search' => 'æœå°‹è©²ç¶²ç«™',
-'tooltip-search-go' => '如果相åŒçš„標題存在的話便直接å‰å¾€è©²é é¢',
-'tooltip-search-fulltext' => 'æœå°‹è©²æ–‡å­—çš„é é¢',
-'tooltip-p-logo' => '訪å•é¦–é ',
-'tooltip-n-mainpage' => '訪å•é¦–é ',
-'tooltip-n-mainpage-description' => '訪å•é¦–é ',
-'tooltip-n-portal' => '關於本計劃ã€{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥åšä»€éº¼ã€æ‡‰è©²å¦‚何åš',
-'tooltip-n-currentevents' => 'æ供目å‰æ–°èžäº‹ä»¶çš„背景資料',
-'tooltip-n-recentchanges' => '列出該網站中的最近修改',
-'tooltip-n-randompage' => '隨機載入一個é é¢',
-'tooltip-n-help' => '尋求幫助',
-'tooltip-t-whatlinkshere' => '列出所有與本é ç›¸é€£çš„é é¢',
-'tooltip-t-recentchangeslinked' => 'é é¢é€£å‡ºæ‰€æœ‰é é¢çš„更改',
-'tooltip-feed-rss' => '訂閱本é é¢æ­·å²çš„RSS資訊',
-'tooltip-feed-atom' => '訂閱本é é¢æ­·å²çš„Atom訊æ¯',
-'tooltip-t-contributions' => '檢視該用戶的貢ç»åˆ—表',
-'tooltip-t-emailuser' => 'å‘該用戶發é€é›»å­éƒµä»¶',
-'tooltip-t-upload' => '上傳檔案',
-'tooltip-t-specialpages' => '全部特殊é é¢çš„列表',
-'tooltip-t-print' => '這個é é¢çš„å¯åˆ—å°ç‰ˆæœ¬',
-'tooltip-t-permalink' => '這個é é¢ä¿®è¨‚版本的永久連çµ',
-'tooltip-ca-nstab-main' => '檢視é é¢å…§å®¹',
-'tooltip-ca-nstab-user' => '檢視使用者é é¢',
-'tooltip-ca-nstab-media' => '檢視多媒體檔案資訊é é¢',
-'tooltip-ca-nstab-special' => '本é é¢æœƒéš¨è‘—資料庫的數據å³æ™‚更新,任何人å‡ä¸èƒ½ç›´æŽ¥ç·¨è¼¯',
-'tooltip-ca-nstab-project' => '檢視項目é é¢',
-'tooltip-ca-nstab-image' => '檢視檔案é é¢',
-'tooltip-ca-nstab-mediawiki' => '檢視系統資訊',
-'tooltip-ca-nstab-template' => '檢視模æ¿',
-'tooltip-ca-nstab-help' => '檢視幫助é é¢',
-'tooltip-ca-nstab-category' => '檢視分類é é¢',
-'tooltip-minoredit' => '標記為å°ä¿®æ”¹',
-'tooltip-save' => 'ä¿å­˜æ‚¨çš„修改',
-'tooltip-preview' => 'é è¦½æ‚¨çš„編輯,請先使用本功能å†ä¿å­˜ï¼',
-'tooltip-diff' => '顯示您å°é é¢çš„è²¢ç»',
-'tooltip-compareselectedversions' => '檢視本é è¢«é»žé¸çš„兩個修訂版本間的差異',
-'tooltip-watch' => '將此é åŠ å…¥æ‚¨çš„監視列表',
-'tooltip-recreate' => 'é‡å»ºè©²é é¢ï¼Œç„¡è«–是å¦è¢«åˆªé™¤ã€‚',
-'tooltip-upload' => '開始上傳',
-'tooltip-rollback' => '『å轉ã€å¯ä»¥ä¸€æŒ‰æ¢å¾©ä¸Šä¸€ä½è²¢ç»è€…å°é€™å€‹é é¢çš„編輯',
-'tooltip-undo' => '『復原ã€å¯ä»¥åœ¨ç·¨è¼¯æ¨¡å¼ä¸Šé–‹å•Ÿç·¨è¼¯è¡¨æ ¼ä»¥ä¾¿å¾©åŽŸã€‚它容許在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
-'tooltip-preferences-save' => '儲存使用å好',
-'tooltip-summary' => '輸入一個簡短的摘è¦',
+'tooltip-pt-userpage' => '您的使用者é é¢',
+'tooltip-pt-anonuserpage' => '您編輯本站所用IPçš„å°æ‡‰ç”¨æˆ¶é ',
+'tooltip-pt-mytalk' => '您的å°è©±é ',
+'tooltip-pt-anontalk' => 'å°æ–¼ä¾†è‡ªæ­¤IP地å€ç·¨è¼¯çš„å°è©±',
+'tooltip-pt-preferences' => '您的å好設定',
+'tooltip-pt-watchlist' => '您所監視é é¢çš„更改列表',
+'tooltip-pt-mycontris' => '您的貢ç»åˆ—表',
+'tooltip-pt-login' => '建議您登入,儘管並éžå¿…須。',
+'tooltip-pt-anonlogin' => '建議您登入,儘管並éžå¿…須。',
+'tooltip-pt-logout' => '登出',
+'tooltip-ca-talk' => '關於é é¢æ­£æ–‡çš„討論',
+'tooltip-ca-edit' => '您å¯ä»¥ç·¨è¼¯æ­¤é ï¼Œè«‹åœ¨ä¿å­˜ä¹‹å‰å…ˆé è¦½ä¸€ä¸‹ã€‚',
+'tooltip-ca-addsection' => '開始一個新å°ç¯€',
+'tooltip-ca-viewsource' => '該é é¢å·²è¢«ä¿è­·ã€‚{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥æª¢è¦–該é åŽŸå§‹ç¢¼ã€‚',
+'tooltip-ca-history' => '本é é¢çš„æ—©å‰ä¿®è¨‚版本',
+'tooltip-ca-protect' => 'ä¿è­·é€™å€‹é é¢',
+'tooltip-ca-unprotect' => '更改此é ä¿è­·',
+'tooltip-ca-delete' => '刪除本é ',
+'tooltip-ca-undelete' => '將這個é é¢æ¢å¾©åˆ°è¢«åˆªé™¤ä»¥å‰çš„狀態',
+'tooltip-ca-move' => '移動本é ',
+'tooltip-ca-watch' => '將此é é¢åŠ å…¥ç›£è¦–列表',
+'tooltip-ca-unwatch' => '將此é é¢å¾žç›£è¦–列表中移除',
+'tooltip-search' => 'æœå°‹è©²ç¶²ç«™',
+'tooltip-search-go' => '如果相åŒçš„標題存在的話便直接å‰å¾€è©²é é¢',
+'tooltip-search-fulltext' => 'æœå°‹è©²æ–‡å­—çš„é é¢',
+'tooltip-p-logo' => '訪å•é¦–é ',
+'tooltip-n-mainpage' => '訪å•é¦–é ',
+'tooltip-n-mainpage-description' => '訪å•é¦–é ',
+'tooltip-n-portal' => '關於本計劃ã€{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥åšä»€éº¼ã€æ‡‰è©²å¦‚何åš',
+'tooltip-n-currentevents' => 'æ供目å‰æ–°èžäº‹ä»¶çš„背景資料',
+'tooltip-n-recentchanges' => '列出該網站中的最近修改',
+'tooltip-n-randompage' => '隨機載入一個é é¢',
+'tooltip-n-help' => '尋求幫助',
+'tooltip-t-whatlinkshere' => '列出所有與本é ç›¸é€£çš„é é¢',
+'tooltip-t-recentchangeslinked' => 'é é¢é€£å‡ºæ‰€æœ‰é é¢çš„更改',
+'tooltip-feed-rss' => '訂閱本é é¢æ­·å²çš„RSS資訊',
+'tooltip-feed-atom' => '訂閱本é é¢æ­·å²çš„Atom訊æ¯',
+'tooltip-t-contributions' => '檢視該用戶的貢ç»åˆ—表',
+'tooltip-t-emailuser' => 'å‘該用戶發é€é›»å­éƒµä»¶',
+'tooltip-t-upload' => '上傳檔案',
+'tooltip-t-specialpages' => '全部特殊é é¢çš„列表',
+'tooltip-t-print' => '這個é é¢çš„å¯åˆ—å°ç‰ˆæœ¬',
+'tooltip-t-permalink' => '這個é é¢ä¿®è¨‚版本的永久連çµ',
+'tooltip-ca-nstab-main' => '檢視é é¢å…§å®¹',
+'tooltip-ca-nstab-user' => '檢視使用者é é¢',
+'tooltip-ca-nstab-media' => '檢視多媒體檔案資訊é é¢',
+'tooltip-ca-nstab-special' => '本é é¢æœƒéš¨è‘—資料庫的數據å³æ™‚更新,任何人å‡ä¸èƒ½ç›´æŽ¥ç·¨è¼¯',
+'tooltip-ca-nstab-project' => '檢視項目é é¢',
+'tooltip-ca-nstab-image' => '檢視檔案é é¢',
+'tooltip-ca-nstab-mediawiki' => '檢視系統資訊',
+'tooltip-ca-nstab-template' => '檢視模æ¿',
+'tooltip-ca-nstab-help' => '檢視幫助é é¢',
+'tooltip-ca-nstab-category' => '檢視分類é é¢',
+'tooltip-minoredit' => '標記為å°ä¿®æ”¹',
+'tooltip-save' => 'ä¿å­˜æ‚¨çš„修改',
+'tooltip-preview' => 'é è¦½æ‚¨çš„編輯,請先使用本功能å†ä¿å­˜ï¼',
+'tooltip-diff' => '顯示您å°é é¢çš„è²¢ç»',
+'tooltip-compareselectedversions' => '檢視本é è¢«é»žé¸çš„兩個修訂版本間的差異',
+'tooltip-watch' => '將此é åŠ å…¥æ‚¨çš„監視列表',
+'tooltip-watchlistedit-normal-submit' => '移除標題',
+'tooltip-watchlistedit-raw-submit' => '更新監視列表',
+'tooltip-recreate' => 'é‡å»ºè©²é é¢ï¼Œç„¡è«–是å¦è¢«åˆªé™¤ã€‚',
+'tooltip-upload' => '開始上傳',
+'tooltip-rollback' => '『å轉ã€å¯ä»¥ä¸€æŒ‰æ¢å¾©ä¸Šä¸€ä½è²¢ç»è€…å°é€™å€‹é é¢çš„編輯',
+'tooltip-undo' => '『復原ã€å¯ä»¥åœ¨ç·¨è¼¯æ¨¡å¼ä¸Šé–‹å•Ÿç·¨è¼¯è¡¨æ ¼ä»¥ä¾¿å¾©åŽŸã€‚它容許在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
+'tooltip-preferences-save' => '儲存使用å好',
+'tooltip-summary' => '輸入一個簡短的摘è¦',
# Stylesheets
'common.css' => '/* 此處的 CSS 將應用於所有的é¢æ¿ */',
@@ -2828,9 +2902,6 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
# Patrol log
'patrol-log-page' => '巡查日誌',
'patrol-log-header' => '這是已巡查的修訂版本的日誌。',
-'patrol-log-line' => '$2的版本$1已被標記為已巡查$3',
-'patrol-log-auto' => '(自動)',
-'patrol-log-diff' => '修訂 $1',
'log-show-hide-patrol' => '$1巡查記錄',
# Image deletion
@@ -2857,11 +2928,11 @@ $1',
'file-info' => '檔案大å°: $1, MIME é¡žåž‹: $2',
'file-info-size' => '$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3,MIME類型:$4',
'file-info-size-pages' => '$1 × $2åƒç´ ï¼Œæª”案大å°: $3,檔案類型: $4, $5 {{PLURAL:$5|é |é }}',
-'file-nohires' => '<small>無更高解åƒåº¦å¯æ供。</small>',
+'file-nohires' => '無更高解åƒåº¦å¯æ供。',
'svg-long-desc' => 'SVG 檔案,表é¢å¤§å°ï¼š$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3',
'show-big-image' => '完整解åƒåº¦',
-'show-big-image-preview' => '<small>æ­¤é è¦½çš„大å°ï¼š$1.</small>',
-'show-big-image-other' => '<small>其他大å°ï¼š$1。</small>',
+'show-big-image-preview' => 'æ­¤é è¦½çš„大å°ï¼š$1.',
+'show-big-image-other' => '其他{{PLURAL:$2||}}解æžåº¦ï¼š$1。',
'show-big-image-size' => '$1 × $2 åƒç´ ',
'file-info-gif-looped' => '循環',
'file-info-gif-frames' => '$1å¹€',
@@ -2881,6 +2952,13 @@ $1',
'bydate' => '按日期',
'sp-newimages-showfrom' => '從$1 $2開始顯示新檔案',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '$1秒',
+'minutes' => '$1分é¾',
+'hours' => '$1å°æ™‚',
+'days' => '$1天',
+'ago' => '$1å‰',
+
# Bad image list
'bad_image_list' => '請按照下列格å¼ç·¨å¯«ï¼š
@@ -3390,13 +3468,6 @@ $5
'scarytranscludefailed' => '[模æ¿$1讀å–失敗]',
'scarytranscludetoolong' => '[URL 地å€å¤ªé•·]',
-# Trackbacks
-'trackbackbox' => 'æ­¤é é¢çš„引用:<br />
-$1',
-'trackbackremove' => '([$1刪除])',
-'trackbacklink' => '迴響',
-'trackbackdeleteok' => 'Trackback 刪除æˆåŠŸã€‚',
-
# Delete conflict
'deletedwhileediting' => '警告: æ­¤é åœ¨æ‚¨é–‹å§‹ç·¨è¼¯ä¹‹å¾Œå·²ç¶“被刪除﹗',
'confirmrecreate' => "在您開始編輯這個é é¢å¾Œï¼Œç”¨æˆ¶[[User:$1|$1]] ([[User talk:$1|å°è©±]])以下列原因刪除了這個é é¢ï¼š
@@ -3482,6 +3553,9 @@ $1',
'watchlisttools-edit' => '檢視並編輯監視列表',
'watchlisttools-raw' => '編輯原始監視列表',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|留言]])',
+
# Core parser functions
'unknown_extension_tag' => 'ä¸æ˜Žçš„擴展標籤 "$1"',
'duplicate-defaultsort' => '警告: é è¨­çš„排åºéµ "$2" 覆蓋先å‰çš„é è¨­æŽ’åºéµ "$1"。',
@@ -3579,13 +3653,16 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'tags-hitcount' => '$1次更改',
# Special:ComparePages
-'comparepages' => '比較é é¢',
-'compare-selector' => '比較é é¢çš„修訂',
-'compare-page1' => '第1é ',
-'compare-page2' => '第2é ',
-'compare-rev1' => '修訂版本1',
-'compare-rev2' => '修訂版本2',
-'compare-submit' => '比較',
+'comparepages' => '比較é é¢',
+'compare-selector' => '比較é é¢çš„修訂',
+'compare-page1' => '第1é ',
+'compare-page2' => '第2é ',
+'compare-rev1' => '修訂版本1',
+'compare-rev2' => '修訂版本2',
+'compare-submit' => '比較',
+'compare-invalid-title' => '所指定標題無效。',
+'compare-title-not-exists' => '所指定的話題ä¸å­˜åœ¨ã€‚',
+'compare-revision-not-exists' => '所指定的修訂ä¸å­˜åœ¨ã€‚',
# Database error messages
'dberr-header' => '這個 wiki 出ç¾äº†å•é¡Œ',
@@ -3613,4 +3690,89 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'sqlite-has-fts' => '帶全文æœå°‹çš„版本$1',
'sqlite-no-fts' => 'ä¸å¸¶å…¨æ–‡æœå°‹çš„版本$1',
+# New logging system
+'logentry-delete-delete' => '$1刪除é é¢$3',
+'logentry-delete-restore' => '$1æ¢å¾©é é¢$3',
+'logentry-delete-event' => '$1已更改$3中$5項日誌的å¯è¦‹æ€§ï¼š$4',
+'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5個歷å²ç‰ˆæœ¬|$5個歷å²ç‰ˆæœ¬}}çš„å¯è¦‹æ€§ï¼š$4',
+'logentry-delete-event-legacy' => '$1已更改$3中日誌的å¯è¦‹æ€§',
+'logentry-delete-revision-legacy' => '$1已更改$3中歷å²ç‰ˆæœ¬çš„å¯è¦‹æ€§',
+'logentry-suppress-delete' => '$1已隱è—é é¢$3',
+'logentry-suppress-event' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中{{PLURAL:$5|$5項日誌|$5項日誌}}çš„å¯è¦‹æ€§ï¼š$4',
+'logentry-suppress-revision' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中{{PLURAL:$5|$5個歷å²ç‰ˆæœ¬|$5個歷å²ç‰ˆæœ¬}}çš„å¯è¦‹æ€§ï¼š$4',
+'logentry-suppress-event-legacy' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中日誌的å¯è¦‹æ€§',
+'logentry-suppress-revision-legacy' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中歷å²ç‰ˆæœ¬çš„å¯è¦‹æ€§',
+'revdelete-content-hid' => 'éš±è—內容',
+'revdelete-summary-hid' => 'éš±è—編輯摘è¦',
+'revdelete-uname-hid' => 'éš±è—用戶å',
+'revdelete-content-unhid' => 'æ¢å¾©å…§å®¹',
+'revdelete-summary-unhid' => 'æ¢å¾©ç·¨è¼¯æ‘˜è¦',
+'revdelete-uname-unhid' => 'æ¢å¾©ç”¨æˆ¶å',
+'revdelete-restricted' => '已應用é™åˆ¶è‡³æ“作員',
+'revdelete-unrestricted' => '已移除å°æ–¼æ“作員的é™åˆ¶',
+'logentry-move-move' => '$1移動$3é é¢è‡³$4',
+'logentry-move-move-noredirect' => '$1移動$3é é¢è‡³$4,ä¸ç•™é‡å®šå‘',
+'logentry-move-move_redir' => '$1通éŽé‡å®šå‘移動$3é é¢è‡³$4',
+'logentry-move-move_redir-noredirect' => '$1通éŽé‡å®šå‘移動$3é é¢è‡³$4,ä¸ç•™é‡å®šå‘',
+'logentry-patrol-patrol' => '$1標記é é¢$3的版本$4為已巡查',
+'logentry-patrol-patrol-auto' => '$1自動標記é é¢$3的版本$4為已巡查',
+'logentry-newusers-newusers' => '$1建立新帳號',
+'logentry-newusers-create' => '$1創建賬戶',
+'logentry-newusers-create2' => '$1創建賬戶$3',
+'logentry-newusers-autocreate' => '帳戶$1被自動創建',
+'newuserlog-byemail' => '密碼已由電å­éƒµä»¶å¯„出',
+
+# Feedback
+'feedback-bugornote' => '如果您準備好了詳細æ述一個技術å•é¡Œï¼Œè«‹[$1 報告一個bug]。或者,您å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„簡易表單。您的評論將被添加到é é¢â€œ[$3 $2]â€ï¼Œä¸¦å¸¶æœ‰æ‚¨çš„用戶å和使用的ç€è¦½å™¨ã€‚',
+'feedback-subject' => '主旨:',
+'feedback-message' => '訊æ¯ï¼š',
+'feedback-cancel' => 'å–消',
+'feedback-submit' => 'æ交å饋',
+'feedback-adding' => '正在é é¢æ·»åŠ å饋...',
+'feedback-error1' => '錯誤:從API返回無法識別的çµæžœ',
+'feedback-error2' => '錯誤:編輯失敗',
+'feedback-error3' => '錯誤:API 沒有響應',
+'feedback-thanks' => 'è¬è¬ï¼æ‚¨çš„å饋已被發布到é é¢â€œ[$2 $1]â€ã€‚',
+'feedback-close' => '完æˆ',
+'feedback-bugcheck' => '請檢查此bug是å¦ç‚º[$1 已知bug]。',
+'feedback-bugnew' => '我已經檢查éŽã€‚報告一個新的bug',
+
+# API errors
+'api-error-badaccess-groups' => '您沒有權é™åœ¨æ­¤ç¶­åŸºé …目上傳文件。',
+'api-error-badtoken' => '內部錯誤:標記無效。',
+'api-error-copyuploaddisabled' => '通éŽURL上傳的功能已被此伺æœå™¨ç¦ç”¨ã€‚',
+'api-error-duplicate' => '在網站上已經具有相åŒå…§å®¹çš„{{PLURAL:$1|[$2 å¦ä¸€å€‹æ–‡ä»¶]|[$2 å¦ä¸€äº›æ–‡ä»¶]}}。',
+'api-error-duplicate-archive' => '在網站上曾經具有相åŒå…§å®¹çš„{{PLURAL:$1|[$2 å¦ä¸€å€‹æ–‡ä»¶]|[$2 å¦ä¸€äº›æ–‡ä»¶]}},但已被刪除。',
+'api-error-duplicate-archive-popup-title' => '已被刪除的é‡è¤‡{{PLURAL:$1|文件|文件}}',
+'api-error-duplicate-popup-title' => 'é‡è¤‡çš„{{PLURAL:$1|文件|文件}}',
+'api-error-empty-file' => '您æ交的檔案是空的。',
+'api-error-emptypage' => 'ä¸è¨±å‰µå»ºæ²’有內容的新é é¢ã€‚',
+'api-error-fetchfileerror' => '內部錯誤:ç²å–文件時發生錯誤。',
+'api-error-file-too-large' => '您æ交的檔案太大了。',
+'api-error-filename-tooshort' => '檔案åéŽçŸ­ã€‚',
+'api-error-filetype-banned' => '這種類型的檔案是被ç¦æ­¢çš„。',
+'api-error-filetype-missing' => '本檔案缺少了副檔å。',
+'api-error-hookaborted' => '你試圖進行的修改被一個擴展鉤å­çµ‚止。',
+'api-error-http' => '內部錯誤:無法連接到伺æœå™¨ã€‚',
+'api-error-illegal-filename' => '檔案åä¸å…許。',
+'api-error-internal-error' => '內部錯誤:此維基項目在處ç†ä½ çš„上傳數據時出ç¾äº†éŒ¯èª¤ã€‚',
+'api-error-invalid-file-key' => '內部錯誤:臨時存儲中找ä¸åˆ°æ–‡ä»¶ã€‚',
+'api-error-missingparam' => '內部錯誤:請求中缺少åƒæ•¸ã€‚',
+'api-error-missingresult' => '內部錯誤:無法確定複製是å¦æˆåŠŸã€‚',
+'api-error-mustbeloggedin' => '您必須登錄後å†ä¸Šå‚³æ–‡ä»¶ã€‚',
+'api-error-mustbeposted' => 'å…§éƒ¨éŒ¯èª¤ï¼šè«‹æ±‚éœ€è¦ HTTP POST。',
+'api-error-noimageinfo' => '文件æˆåŠŸï¼Œä½†ä¼ºæœå™¨æ²’有給我們任何該文件的信æ¯ã€‚',
+'api-error-nomodule' => '內部錯誤:缺少上傳模塊集。',
+'api-error-ok-but-empty' => '內部錯誤:伺æœå™¨æ²’有響應。',
+'api-error-overwrite' => 'ä¸å…許覆蓋ç¾æœ‰æª”案。',
+'api-error-stashfailed' => '內部錯誤:伺æœå™¨ä¿å­˜è‡¨æ™‚文件失敗。',
+'api-error-timeout' => '伺æœå™¨æ²’有在é æœŸçš„時間內回應。',
+'api-error-unclassified' => '發生未知錯誤。',
+'api-error-unknown-code' => '未知錯誤:$1',
+'api-error-unknown-error' => '內部錯誤:嘗試上傳文件時出錯。',
+'api-error-unknown-warning' => '未知的警告:$1',
+'api-error-unknownerror' => '未知錯誤:$1。',
+'api-error-uploaddisabled' => '本wiki的上傳檔案功能已åœç”¨ã€‚',
+'api-error-verification-error' => '本檔案å¯èƒ½å·²æ壞,或副檔å錯誤。',
+
);
diff --git a/languages/messages/MessagesZh_hk.php b/languages/messages/MessagesZh_hk.php
index 83a41f20..91be2ec6 100644
--- a/languages/messages/MessagesZh_hk.php
+++ b/languages/messages/MessagesZh_hk.php
@@ -18,7 +18,7 @@
* @author Yuyu
*/
-$fallback = 'zh-hant';
+$fallback = 'zh-hant, zh-hans';
$fallback8bitEncoding = 'Big5-HKSCS';
@@ -80,7 +80,6 @@ $messages = array(
'revdelete-suppress-text' => "壓制'''åª'''應用於以下的情æ³:
* ä¸åˆé©çš„個人資料
*: ''地å€ã€é›»è©±è™Ÿç¢¼ã€èº«ä»½è­‰è™Ÿç¢¼ç­‰ã€‚''",
-'revdelete-logentry' => '已更改「[[$1]]ã€ä¹‹ä¿®è¨‚å¯è¦‹åº¦',
# Diffs
'editundo' => '撤銷',
diff --git a/languages/messages/MessagesZh_mo.php b/languages/messages/MessagesZh_mo.php
index 6772ef0a..37be152b 100644
--- a/languages/messages/MessagesZh_mo.php
+++ b/languages/messages/MessagesZh_mo.php
@@ -10,4 +10,4 @@
*/
# Inherit everything for now
-$fallback = 'zh-hk';
+$fallback = 'zh-hk, zh-hant, zh-hans';
diff --git a/languages/messages/MessagesZh_my.php b/languages/messages/MessagesZh_my.php
index a27ed45f..01b5524a 100644
--- a/languages/messages/MessagesZh_my.php
+++ b/languages/messages/MessagesZh_my.php
@@ -10,4 +10,4 @@
*/
# Inherit everything for now
-$fallback = 'zh-sg';
+$fallback = 'zh-sg, zh-hans';
diff --git a/languages/messages/MessagesZh_tw.php b/languages/messages/MessagesZh_tw.php
index e07b65fa..512bc858 100644
--- a/languages/messages/MessagesZh_tw.php
+++ b/languages/messages/MessagesZh_tw.php
@@ -23,6 +23,8 @@
* @author לערי ריינה×רט
*/
+$fallback = 'zh-hant, zh-hans';
+
$specialPageAliases = array(
'Ancientpages' => array( '最舊é é¢' ),
'Block' => array( '查å°ç”¨æˆ¶' ),
@@ -44,8 +46,6 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( '沒有跨語言éˆæŽ¥çš„é é¢' ),
);
-$fallback = 'zh-hant';
-
$namespaceNames = array(
NS_USER => '使用者',
NS_USER_TALK => '使用者討論',
@@ -395,7 +395,6 @@ $messages = array(
'revdelete-hide-restricted' => '將此é™åˆ¶åŒæ¨£æ‡‰ç”¨æ–¼ç®¡ç†å“¡',
'revdelete-suppress' => 'åŒæ™‚壓制由æ“作員以åŠå…¶ä»–使用者的資料',
'revdelete-unsuppress' => '在已復原的修訂中移除é™åˆ¶',
-'revdelete-logentry' => '已更改「[[$1]]ã€ä¹‹ä¿®è¨‚å¯è¦‹åº¦',
'revdelete-success' => '修訂的å¯è¦‹æ€§å·²ç¶“æˆåŠŸè¨­å®šã€‚',
'logdelete-success' => '事件的å¯è¦‹æ€§å·²ç¶“æˆåŠŸè¨­å®šã€‚',
@@ -646,7 +645,6 @@ $NEWPAGE
請確定您è¦é€²è¡Œæ­¤é …æ“作,並且了解其後果,åŒæ™‚您的行為符åˆ[[{{MediaWiki:Policy-url}}]]。',
'deletedtext' => '「$1ã€å·²ç¶“被刪除。
最近刪除的紀錄請åƒè¦‹$2。',
-'deletedarticle' => '已刪除「[[$1]]ã€',
'dellogpagetext' => '以下是最近刪除的紀錄列表。
所有的時間都是使用伺æœå™¨æ™‚間。',
'reverted' => '復原到早期版本',
@@ -691,7 +689,6 @@ $NEWPAGE
'undelete-revision' => '刪除$1時由$3(在$2)所編寫的修訂版本:',
'undeleterevision-missing' => '此版本的內容ä¸æ­£ç¢ºæˆ–已經éºå¤±ã€‚å¯èƒ½é€£çµéŒ¯èª¤ã€è¢«ç§»é™¤æˆ–已經被復原。',
'undeletebtn' => '復原',
-'undeletedarticle' => '已經復原「$1ã€',
'undeletedrevisions' => '$1個修訂版本已經復原',
'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被復原',
'undeletedfiles' => '$1 個檔案被復原',
@@ -858,7 +855,6 @@ $NEWPAGE
# Patrol log
'patrol-log-page' => '巡查記錄',
-'patrol-log-line' => '已經標示$1/$2版åšå·²å·¡æŸ¥çš„$3',
# Browsing diffs
'previousdiff' => 'â†ä¸Šä¸€å€‹',
@@ -866,7 +862,7 @@ $NEWPAGE
# Media information
'imagemaxsize' => '在圖片æè¿°é å°åœ–片大å°é™åˆ¶ç‚º:',
-'file-nohires' => '<small>無更高解æžåº¦å¯æ供。</small>',
+'file-nohires' => '無更高解æžåº¦å¯æ供。',
'show-big-image' => '完整解æžåº¦',
# Special:NewFiles
diff --git a/languages/messages/MessagesZu.php b/languages/messages/MessagesZu.php
index d10bbbd4..a7768fcb 100644
--- a/languages/messages/MessagesZu.php
+++ b/languages/messages/MessagesZu.php
@@ -7,6 +7,8 @@
* @ingroup Language
* @file
*
+ * @author Jose77 (on zu.wikipedia.org)
+ * @author Joziboy (on zu.wikipedia.org)
* @author לערי ריינה×רט
*/
@@ -240,9 +242,6 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
'allinnamespace' => 'Onke amakhasi ($1 namespace)',
'allpagessubmit' => 'Hamba',
-# Special:Log/newusers
-'newuserlog-create-entry' => 'Umsebenzi omusha',
-
# E-mail user
'emailuser' => 'Thumela umlayezo lo msebenzisi',
'noemailtitle' => 'Akukho ikheli likaposi',
diff --git a/maintenance/Doxyfile b/maintenance/Doxyfile
index 7d7849c8..b7c1e5e8 100644
--- a/maintenance/Doxyfile
+++ b/maintenance/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.5.6
+# Doxyfile 1.7.5.1
#
# Some placeholders have been added for MediaWiki usage:
@@ -8,14 +8,16 @@
# {{SVNSTAT}}
# {{INPUT}}
#
-# A number of MediaWiki-specific aliases are near the end of this file.
# To generate documentation run: php mwdocgen.php --no-extensions
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = MediaWiki
PROJECT_NUMBER = {{CURRENT_VERSION}}
+PROJECT_BRIEF =
+PROJECT_LOGO =
OUTPUT_DIRECTORY = {{OUTPUT_DIRECTORY}}
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
@@ -36,18 +38,47 @@ ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = YES
STRIP_FROM_PATH = {{STRIP_FROM_PATH}}
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
+QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
+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>:" \
+ "arrayof{2}=<b> Array </b> of \2" \
+ "null=\type{Null}" \
+ "boolean=\type{Boolean}" \
+ "bool=\type{Boolean}" \
+ "integer=\type{Integer}" \
+ "int=\type{Integer}" \
+ "string=\type{String}" \
+ "str=\type{String}" \
+ "mixed=\type{Mixed}" \
+ "access=\par Access:\n" \
+ "private=\access private" \
+ "protected=\access protected" \
+ "public=\access public" \
+ "copyright=\note" \
+ "license=\note"
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = NO
DISTRIBUTE_GROUP_DOC = YES
SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+SYMBOL_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
@@ -56,6 +87,7 @@ EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
@@ -64,20 +96,27 @@ INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
+FORCE_LOCAL_INCLUDES = NO
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
-SORT_BRIEF_DOCS = NO
+SORT_BRIEF_DOCS = YES
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
-ENABLED_SECTIONS =
+ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
-SHOW_DIRECTORIES = NO
+SHOW_DIRECTORIES = YES
+SHOW_FILES = YES
SHOW_NAMESPACES = NO
FILE_VERSION_FILTER = {{SVNSTAT}}
+LAYOUT_FILE =
+CITE_BIB_FILES =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
@@ -87,11 +126,12 @@ WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
-WARN_LOGFILE =
+WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = {{INPUT}}
+INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.cc \
*.cxx \
@@ -134,16 +174,18 @@ FILE_PATTERNS = *.c \
*.MM \
*.PY
RECURSIVE = YES
-EXCLUDE = {{EXCLUDE}}
+EXCLUDE = {{EXCLUDE}}
EXCLUDE_SYMLINKS = YES
EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
-EXAMPLE_PATH =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
-IMAGE_PATH =
-INPUT_FILTER =
-FILTER_PATTERNS =
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
@@ -152,6 +194,7 @@ INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
+REFERENCES_LINK_SOURCE = YES
USE_HTAGS = NO
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
@@ -159,27 +202,58 @@ VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
-IGNORE_PREFIX =
+IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
-HTML_HEADER =
-HTML_FOOTER =
-HTML_STYLESHEET =
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_FILES =
+HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_GAMMA = 80
+HTML_TIMESTAMP = YES
HTML_ALIGN_MEMBERS = YES
+HTML_DYNAMIC_SECTIONS = NO
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
GENERATE_HTMLHELP = NO
-CHM_FILE =
-HHC_LOCATION =
+CHM_FILE =
+HHC_LOCATION =
GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = YES
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
+USE_INLINE_TREES = YES
TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+USE_MATHJAX = NO
+MATHJAX_RELPATH = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS =
+SEARCHENGINE = YES
+SERVER_BASED_SEARCH = YES
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
@@ -189,12 +263,15 @@ LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
-EXTRA_PACKAGES =
-LATEX_HEADER =
+EXTRA_PACKAGES =
+LATEX_HEADER =
+LATEX_FOOTER =
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
+LATEX_SOURCE_CODE = NO
+LATEX_BIB_STYLE = plain
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
@@ -202,12 +279,12 @@ GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
-RTF_STYLESHEET_FILE =
-RTF_EXTENSIONS_FILE =
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
-GENERATE_MAN = NO
+GENERATE_MAN = {{GENERATE_MAN}}
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
@@ -216,8 +293,8 @@ MAN_LINKS = NO
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
-XML_SCHEMA =
-XML_DTD =
+XML_SCHEMA =
+XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
@@ -229,33 +306,38 @@ GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
-PERLMOD_MAKEVAR_PREFIX =
+PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
-INCLUDE_PATH =
-INCLUDE_FILE_PATTERNS =
-PREDEFINED =
-EXPAND_AS_DEFINED =
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration::additions related to external references
#---------------------------------------------------------------------------
-TAGFILES =
+TAGFILES =
GENERATE_TAGFILE = {{OUTPUT_DIRECTORY}}/html/tagfile.xml
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
+MSCGEN_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = {{HAVE_DOT}}
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
@@ -268,34 +350,14 @@ CALLER_GRAPH = YES
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
-DOT_PATH =
-DOTFILE_DIRS =
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-SEARCHENGINE = NO
-
-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>:" \
- "arrayof{2}=<b> Array </b> of \2" \
- "null=\type{Null}" \
- "boolean=\type{Boolean}" \
- "bool=\type{Boolean}" \
- "integer=\type{Integer}" \
- "int=\type{Integer}" \
- "string=\type{String}" \
- "str=\type{String}" \
- "mixed=\type{Mixed}" \
- "access=\par Access:\n" \
- "private=\access private" \
- "protected=\access protected" \
- "public=\access public" \
- "copyright=\note" \
- "license=\note"
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index 3618515a..082cf8be 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -20,6 +20,11 @@
* @defgroup Maintenance Maintenance
*/
+/**
+ * @defgroup MaintenanceArchive Maintenance archives
+ * @ingroup Maintenance
+ */
+
// Define this so scripts can easily find doMaintenance.php
define( 'RUN_MAINTENANCE_IF_MAIN', dirname( __FILE__ ) . '/doMaintenance.php' );
define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
@@ -130,14 +135,15 @@ abstract class Maintenance {
*/
public static function shouldExecute() {
$bt = debug_backtrace();
- if ( count( $bt ) < 2 ) {
+ $count = count( $bt );
+ if ( $count < 2 ) {
return false; // sanity
}
if ( $bt[0]['class'] !== 'Maintenance' || $bt[0]['function'] !== 'shouldExecute' ) {
return false; // last call should be to this function
}
- $includeFuncs = array( 'require_once', 'require', 'include' );
- for( $i=1; $i < count( $bt ); $i++ ) {
+ $includeFuncs = array( 'require_once', 'require', 'include', 'include_once' );
+ for( $i=1; $i < $count; $i++ ) {
if ( !in_array( $bt[$i]['function'], $includeFuncs ) ) {
return false; // previous calls should all be "requires"
}
@@ -247,6 +253,20 @@ abstract class Maintenance {
*/
protected function setBatchSize( $s = 0 ) {
$this->mBatchSize = $s;
+
+ // If we support $mBatchSize, show the option.
+ // Used to be in addDefaultParams, but in order for that to
+ // work, subclasses would have to call this function in the constructor
+ // before they called parent::__construct which is just weird
+ // (and really wasn't done).
+ if ( $this->mBatchSize ) {
+ $this->addOption( 'batch-size', 'Run this many operations ' .
+ 'per batch, default: ' . $this->mBatchSize, false, true );
+ if ( isset( $this->mParams['batch-size'] ) ) {
+ // This seems a little ugly...
+ $this->mDependantParameters['batch-size'] = $this->mParams['batch-size'];
+ }
+ }
}
/**
@@ -299,8 +319,7 @@ abstract class Maintenance {
} else {
print( $out );
}
- }
- else {
+ } else {
$out = preg_replace( '/\n\z/', '', $out );
$this->outputChanneled( $out, $channel );
}
@@ -427,11 +446,7 @@ abstract class Maintenance {
$this->addOption( 'dbuser', 'The DB user to use for this script', false, true );
$this->addOption( 'dbpass', 'The password to use for this script', false, true );
}
- // If we support $mBatchSize, show the option
- if ( $this->mBatchSize ) {
- $this->addOption( 'batch-size', 'Run this many operations ' .
- 'per batch, default: ' . $this->mBatchSize, false, true );
- }
+
# Save additional script dependant options to display
# them separately in help
$this->mDependantParameters = array_diff_key( $this->mParams, $this->mGenericParameters );
@@ -455,6 +470,9 @@ abstract class Maintenance {
}
}
+ /**
+ * @var $child Maintenance
+ */
$child = new $maintClass();
$child->loadParamsAndArgs( $this->mSelf, $this->mOptions, $this->mArgs );
if ( !is_null( $this->mDb ) ) {
@@ -525,6 +543,7 @@ abstract class Maintenance {
* to allow sysadmins to explicitly set one if they'd prefer to override
* defaults (or for people using Suhosin which yells at you for trying
* to disable the limits)
+ * @return string
*/
public function memoryLimit() {
$limit = $this->getOption( 'memory-limit', 'max' );
@@ -851,6 +870,9 @@ abstract class Maintenance {
$wgDBpassword = $wgDBadminpassword;
if ( $wgDBservers ) {
+ /**
+ * @var $wgDBservers array
+ */
foreach ( $wgDBservers as $i => $server ) {
$wgDBservers[$i]['user'] = $wgDBuser;
$wgDBservers[$i]['password'] = $wgDBpassword;
@@ -890,57 +912,6 @@ abstract class Maintenance {
}
/**
- * Do setup specific to WMF
- */
- public function loadWikimediaSettings() {
- global $IP, $wgNoDBParam, $wgUseNormalUser, $wgConf, $site, $lang;
-
- if ( empty( $wgNoDBParam ) ) {
- # Check if we were passed a db name
- if ( isset( $this->mOptions['wiki'] ) ) {
- $db = $this->mOptions['wiki'];
- } else {
- $db = array_shift( $this->mArgs );
- }
- list( $site, $lang ) = $wgConf->siteFromDB( $db );
-
- # If not, work out the language and site the old way
- if ( is_null( $site ) || is_null( $lang ) ) {
- if ( !$db ) {
- $lang = 'aa';
- } else {
- $lang = $db;
- }
- if ( isset( $this->mArgs[0] ) ) {
- $site = array_shift( $this->mArgs );
- } else {
- $site = 'wikipedia';
- }
- }
- } else {
- $lang = 'aa';
- $site = 'wikipedia';
- }
-
- # This is for the IRC scripts, which now run as the apache user
- # The apache user doesn't have access to the wikiadmin_pass command
- if ( $_ENV['USER'] == 'apache' ) {
- # if ( posix_geteuid() == 48 ) {
- $wgUseNormalUser = true;
- }
-
- putenv( 'wikilang=' . $lang );
-
- ini_set( 'include_path', ".:$IP:$IP/includes:$IP/languages:$IP/maintenance" );
-
- if ( $lang == 'test' && $site == 'wikipedia' ) {
- if ( !defined( 'TESTWIKI' ) ) {
- define( 'TESTWIKI', 1 );
- }
- }
- }
-
- /**
* Generic setup for most installs. Returns the location of LocalSettings
* @return String
*/
@@ -1030,6 +1001,7 @@ abstract class Maintenance {
/**
* Get the maintenance directory.
+ * @return string
*/
protected function getDir() {
return dirname( __FILE__ );
@@ -1177,6 +1149,7 @@ abstract class Maintenance {
* Update the searchindex table for a given pageid
* @param $dbw Database: a database write handle
* @param $pageId Integer: the page ID to update.
+ * @return null|string
*/
public function updateSearchIndexForPage( $dbw, $pageId ) {
// Get current revision
@@ -1208,7 +1181,7 @@ abstract class Maintenance {
} else {
return posix_isatty( $fd );
}
-}
+ }
/**
* Prompt the console for input
@@ -1274,6 +1247,9 @@ abstract class Maintenance {
}
}
+/**
+ * Fake maintenance wrapper, mostly used for the web installer/updater
+ */
class FakeMaintenance extends Maintenance {
protected $mSelf = "FakeMaintenanceScript";
public function execute() {
@@ -1347,4 +1323,4 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
* @return String
*/
abstract protected function getUpdateKey();
-} \ No newline at end of file
+}
diff --git a/maintenance/Makefile b/maintenance/Makefile
index a92751c9..30b568dc 100644
--- a/maintenance/Makefile
+++ b/maintenance/Makefile
@@ -1,6 +1,7 @@
help:
@echo "Run 'make test' to run the parser tests."
@echo "Run 'make doc' to run the doxygen generation."
+ @echo "Run 'make man' to run the doxygen generation with man pages."
test:
php tests/parserTests.php --quiet
@@ -8,3 +9,9 @@ test:
doc:
php mwdocgen.php --all
@echo 'Doc generation done. Look at ./docs/html/'
+
+man:
+ php mwdocgen.php --all --generate-man
+ @echo 'Doc generation done. Look at ./docs/html/ and ./docs/man'
+ @echo 'You might want to update your MANPATH currently:'
+ @echo 'MANPATH: $(MANPATH)'
diff --git a/maintenance/Site.php b/maintenance/Site.php
deleted file mode 100644
index 87d637b4..00000000
--- a/maintenance/Site.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
- * @todo document
- * @ingroup Maintenance
- */
-class Site {
- var $suffix, $lateral, $url;
-
- function __construct( $s, $l, $u ) {
- $this->suffix = $s;
- $this->lateral = $l;
- $this->url = $u;
- }
-
- function getURL( $lang, $urlprotocol ) {
- $xlang = str_replace( '_', '-', $lang );
- return "$urlprotocol//$xlang.{$this->url}/wiki/\$1";
- }
-}
diff --git a/maintenance/addwiki.php b/maintenance/addwiki.php
deleted file mode 100644
index 43f42be5..00000000
--- a/maintenance/addwiki.php
+++ /dev/null
@@ -1,479 +0,0 @@
-<?php
-/**
- * @defgroup Wikimedia Wikimedia
- */
-
-/**
- * Add a new wiki
- * Wikimedia specific!
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to 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
- * @ingroup Wikimedia
- */
-
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
-class AddWiki extends Maintenance {
- public function __construct() {
- global $wgNoDBParam;
-
- parent::__construct();
- $this->mDescription = "Add a new wiki to the family. Wikimedia specific!";
- $this->addArg( 'language', 'Language code of new site, e.g. en' );
- $this->addArg( 'site', 'Type of site, e.g. wikipedia' );
- $this->addArg( 'dbname', 'Name of database to create, e.g. enwiki' );
- $this->addArg( 'domain', 'Domain name of the wiki, e.g. en.wikipedia.org' );
-
- $wgNoDBParam = true;
- }
-
- public function getDbType() {
- return Maintenance::DB_ADMIN;
- }
-
- public function execute() {
- global $IP, $wgDefaultExternalStore, $wgVersionNumber;
- if ( !$wgVersionNumber ) { // set in CommonSettings.php
- $this->error( '$wgVersionNumber is not set, please use MWScript.php wrapper.', true );
- }
-
- $lang = $this->getArg( 0 );
- $site = $this->getArg( 1 );
- $dbName = $this->getArg( 2 );
- $domain = $this->getArg( 3 );
- $languageNames = Language::getLanguageNames();
-
- if ( !isset( $languageNames[$lang] ) ) {
- $this->error( "Language $lang not found in Names.php", true );
- }
- $name = $languageNames[$lang];
-
- $dbw = wfGetDB( DB_MASTER );
- $common = "/home/wikipedia/common";
-
- $this->output( "Creating database $dbName for $lang.$site ($name)\n" );
-
- # Set up the database
- $dbw->query( "SET table_type=Innodb" );
- $dbw->query( "CREATE DATABASE $dbName" );
- $dbw->selectDB( $dbName );
-
- $this->output( "Initialising tables\n" );
- $dbw->sourceFile( $this->getDir() . '/tables.sql' );
- $dbw->sourceFile( "$IP/extensions/OAI/update_table.sql" );
- $dbw->sourceFile( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql" );
- $dbw->sourceFile( "$IP/extensions/CheckUser/cu_changes.sql" );
- $dbw->sourceFile( "$IP/extensions/CheckUser/cu_log.sql" );
- $dbw->sourceFile( "$IP/extensions/TitleKey/titlekey.sql" );
- $dbw->sourceFile( "$IP/extensions/Oversight/hidden.sql" );
- $dbw->sourceFile( "$IP/extensions/GlobalBlocking/localdb_patches/setup-global_block_whitelist.sql" );
- $dbw->sourceFile( "$IP/extensions/AbuseFilter/abusefilter.tables.sql" );
- $dbw->sourceFile( "$IP/extensions/PrefStats/patches/PrefStats.sql" );
- $dbw->sourceFile( "$IP/extensions/ProofreadPage/ProofreadPage.sql" );
- $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTrackingEvents.sql" );
- $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTracking.sql" );
- $dbw->sourceFile( "$IP/extensions/UserDailyContribs/patches/UserDailyContribs.sql" );
-
- $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" );
-
- # Initialise external storage
- if ( is_array( $wgDefaultExternalStore ) ) {
- $stores = $wgDefaultExternalStore;
- } elseif ( $wgDefaultExternalStore ) {
- $stores = array( $wgDefaultExternalStore );
- } else {
- $stores = array();
- }
- if ( count( $stores ) ) {
- global $wgDBuser, $wgDBpassword, $wgExternalServers;
- foreach ( $stores as $storeURL ) {
- $m = array();
- if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
- continue;
- }
-
- $cluster = $m[1];
- $this->output( "Initialising external storage $cluster...\n" );
-
- # Hack
- $wgExternalServers[$cluster][0]['user'] = $wgDBuser;
- $wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
-
- $store = new ExternalStoreDB;
- $extdb = $store->getMaster( $cluster );
- $extdb->query( "SET table_type=InnoDB" );
- $extdb->query( "CREATE DATABASE $dbName" );
- $extdb->selectDB( $dbName );
-
- # Hack x2
- $blobsTable = $store->getTable( $extdb );
- $sedCmd = "sed s/blobs\\\\\\>/$blobsTable/ " . $this->getDir() . "/storage/blobs.sql";
- $blobsFile = popen( $sedCmd, 'r' );
- $extdb->sourceStream( $blobsFile );
- pclose( $blobsFile );
- $extdb->commit();
- }
- }
-
- $title = Title::newFromText( wfMessage( 'mainpage' )->inLanguage( $lang )->useDatabase( false )->plain() );
- $this->output( "Writing main page to " . $title->getPrefixedDBkey() . "\n" );
- $article = new Article( $title );
- $ucsite = ucfirst( $site );
-
- $article->doEdit( $this->getFirstArticle( $ucsite, $name ), '', EDIT_NEW | EDIT_AUTOSUMMARY );
-
- $this->output( "Adding to dblists\n" );
-
- # Add to dblist
- $file = fopen( "$common/all.dblist", "a" );
- fwrite( $file, "$dbName\n" );
- fclose( $file );
-
- # Update the sublists
- shell_exec( "cd $common && ./refresh-dblist" );
-
- # Add to wikiversions.dat
- $file = fopen( "$common/wikiversions.dat", "a" );
- fwrite( $file, "$dbName php-$wgVersionNumber\n" );
- fclose( $file );
- # Rebuild wikiversions.cdb
- shell_exec( "cd $common/multiversion && ./refreshWikiversionsCDB" );
-
- # print "Constructing interwiki SQL\n";
- # Rebuild interwiki tables
- # passthru( '/home/wikipedia/conf/interwiki/update' );
-
- $time = wfTimestamp( TS_RFC2822 );
- // These arguments need to be escaped twice: once for echo and once for at
- $escDbName = wfEscapeShellArg( wfEscapeShellArg( $dbName ) );
- $escTime = wfEscapeShellArg( wfEscapeShellArg( $time ) );
- $escUcsite = wfEscapeShellArg( wfEscapeShellArg( $ucsite ) );
- $escName = wfEscapeShellArg( wfEscapeShellArg( $name ) );
- $escLang = wfEscapeShellArg( wfEscapeShellArg( $lang ) );
- $escDomain = wfEscapeShellArg( wfEscapeShellArg( $domain ) );
- shell_exec( "echo notifyNewProjects $escDbName $escTime $escUcsite $escName $escLang $escDomain | at now + 15 minutes" );
-
- $this->output( "Script ended. You still have to:
- * Add any required settings in InitialiseSettings.php
- * Run sync-common-all
- * Run /home/wikipedia/conf/interwiki/update
- " );
- }
-
- private function getFirstArticle( $ucsite, $name ) {
- return <<<EOT
-==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language==
-
-* Please '''do not start editing''' this new site. This site has a test project on the [[incubator:|Wikimedia Incubator]] (or on the [[betawikiversity:|BetaWikiversity]] or on the [[oldwikisource:|Old Wikisource]]) and it will be imported to here.
-
-* If you would like to help translating the interface to this language, please do not translate here, but go to [[translatewiki:|translatewiki]], a special wiki for translating the interface. That way everyone can use it on every wiki using the [[mw:|same software]].
-
-* For information about how to edit and for other general help, see [[m:Help:Contents|Help on Wikimedia's Meta-Wiki]] or [[mw:Help:Contents|Help on MediaWiki.org]].
-
-== Sister projects ==
-<span class="plainlinks">
-[http://www.wikipedia.org Wikipedia] |
-[http://www.wiktionary.org Wiktonary] |
-[http://www.wikibooks.org Wikibooks] |
-[http://www.wikinews.org Wikinews] |
-[http://www.wikiquote.org Wikiquote] |
-[http://www.wikisource.org Wikisource]
-[http://www.wikiversity.org Wikiversity]
-</span>
-
-See Wikimedia's [[m:|Meta-Wiki]] for the coordination of these projects.
-
-[[aa:]]
-[[ab:]]
-[[ace:]]
-[[af:]]
-[[ak:]]
-[[als:]]
-[[am:]]
-[[an:]]
-[[ang:]]
-[[ar:]]
-[[arc:]]
-[[arz:]]
-[[as:]]
-[[ast:]]
-[[av:]]
-[[ay:]]
-[[az:]]
-[[ba:]]
-[[bar:]]
-[[bat-smg:]]
-[[bcl:]]
-[[be:]]
-[[be-x-old:]]
-[[bg:]]
-[[bh:]]
-[[bi:]]
-[[bm:]]
-[[bn:]]
-[[bo:]]
-[[bpy:]]
-[[br:]]
-[[bs:]]
-[[bug:]]
-[[bxr:]]
-[[ca:]]
-[[cbk-zam:]]
-[[cdo:]]
-[[ce:]]
-[[ceb:]]
-[[ch:]]
-[[cho:]]
-[[chr:]]
-[[chy:]]
-[[ckb:]]
-[[co:]]
-[[cr:]]
-[[crh:]]
-[[cs:]]
-[[csb:]]
-[[cu:]]
-[[cv:]]
-[[cy:]]
-[[da:]]
-[[de:]]
-[[diq:]]
-[[dk:]]
-[[dsb:]]
-[[dv:]]
-[[dz:]]
-[[ee:]]
-[[el:]]
-[[eml:]]
-[[en:]]
-[[eo:]]
-[[es:]]
-[[et:]]
-[[eu:]]
-[[ext:]]
-[[fa:]]
-[[ff:]]
-[[fi:]]
-[[fiu-vro:]]
-[[fj:]]
-[[fo:]]
-[[fr:]]
-[[frp:]]
-[[fur:]]
-[[fy:]]
-[[ga:]]
-[[gan:]]
-[[gd:]]
-[[gl:]]
-[[glk:]]
-[[gn:]]
-[[got:]]
-[[gu:]]
-[[gv:]]
-[[ha:]]
-[[hak:]]
-[[haw:]]
-[[he:]]
-[[hi:]]
-[[hif:]]
-[[ho:]]
-[[hr:]]
-[[hsb:]]
-[[ht:]]
-[[hu:]]
-[[hy:]]
-[[hz:]]
-[[ia:]]
-[[id:]]
-[[ie:]]
-[[ig:]]
-[[ii:]]
-[[ik:]]
-[[ilo:]]
-[[io:]]
-[[is:]]
-[[it:]]
-[[iu:]]
-[[ja:]]
-[[jbo:]]
-[[jv:]]
-[[ka:]]
-[[kaa:]]
-[[kab:]]
-[[kg:]]
-[[ki:]]
-[[kj:]]
-[[kk:]]
-[[kl:]]
-[[km:]]
-[[kn:]]
-[[ko:]]
-[[kr:]]
-[[ks:]]
-[[ksh:]]
-[[ku:]]
-[[kv:]]
-[[kw:]]
-[[ky:]]
-[[la:]]
-[[lad:]]
-[[lb:]]
-[[lbe:]]
-[[lg:]]
-[[li:]]
-[[lij:]]
-[[lmo:]]
-[[ln:]]
-[[lo:]]
-[[lt:]]
-[[lv:]]
-[[map-bms:]]
-[[mdf:]]
-[[mg:]]
-[[mh:]]
-[[mhr:]]
-[[mi:]]
-[[mk:]]
-[[ml:]]
-[[mn:]]
-[[mo:]]
-[[mr:]]
-[[ms:]]
-[[mt:]]
-[[mus:]]
-[[mwl:]]
-[[my:]]
-[[myv:]]
-[[mzn:]]
-[[na:]]
-[[nan:]]
-[[nap:]]
-[[nds:]]
-[[nds-nl:]]
-[[ne:]]
-[[new:]]
-[[ng:]]
-[[nl:]]
-[[nn:]]
-[[no:]]
-[[nov:]]
-[[nrm:]]
-[[nv:]]
-[[ny:]]
-[[oc:]]
-[[om:]]
-[[or:]]
-[[os:]]
-[[pa:]]
-[[pag:]]
-[[pam:]]
-[[pap:]]
-[[pdc:]]
-[[pi:]]
-[[pih:]]
-[[pl:]]
-[[pms:]]
-[[pnt:]]
-[[pnb:]]
-[[ps:]]
-[[pt:]]
-[[qu:]]
-[[rm:]]
-[[rmy:]]
-[[rn:]]
-[[ro:]]
-[[roa-tara:]]
-[[ru:]]
-[[rup:]]
-[[rw:]]
-[[sa:]]
-[[sah:]]
-[[sc:]]
-[[scn:]]
-[[sco:]]
-[[sd:]]
-[[se:]]
-[[sg:]]
-[[sh:]]
-[[si:]]
-[[simple:]]
-[[sk:]]
-[[sl:]]
-[[sm:]]
-[[sn:]]
-[[so:]]
-[[sq:]]
-[[sr:]]
-[[srn:]]
-[[ss:]]
-[[st:]]
-[[stq:]]
-[[su:]]
-[[sv:]]
-[[sw:]]
-[[szl:]]
-[[ta:]]
-[[te:]]
-[[tet:]]
-[[tg:]]
-[[th:]]
-[[ti:]]
-[[tk:]]
-[[tl:]]
-[[tn:]]
-[[to:]]
-[[tpi:]]
-[[tr:]]
-[[ts:]]
-[[tt:]]
-[[tum:]]
-[[tw:]]
-[[ty:]]
-[[udm:]]
-[[ug:]]
-[[uk:]]
-[[ur:]]
-[[uz:]]
-[[ve:]]
-[[vec:]]
-[[vi:]]
-[[vls:]]
-[[vo:]]
-[[wa:]]
-[[war:]]
-[[wo:]]
-[[wuu:]]
-[[xal:]]
-[[xh:]]
-[[yi:]]
-[[yo:]]
-[[za:]]
-[[zea:]]
-[[zh:]]
-[[zh-classical:]]
-[[zh-min-nan:]]
-[[zh-yue:]]
-[[zu:]]
-
-EOT;
- }
-}
-
-$maintClass = "AddWiki";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/archives/patch-ar_sha1.sql b/maintenance/archives/patch-ar_sha1.sql
new file mode 100644
index 00000000..1c7d8e91
--- /dev/null
+++ b/maintenance/archives/patch-ar_sha1.sql
@@ -0,0 +1,3 @@
+-- Adding ar_sha1 field
+ALTER TABLE /*$wgDBprefix*/archive
+ ADD ar_sha1 varbinary(32) NOT NULL default '';
diff --git a/maintenance/archives/patch-drop-user_options.sql b/maintenance/archives/patch-drop-user_options.sql
new file mode 100644
index 00000000..15b7d278
--- /dev/null
+++ b/maintenance/archives/patch-drop-user_options.sql
@@ -0,0 +1 @@
+ALTER TABLE /*_*/user DROP COLUMN user_options; \ No newline at end of file
diff --git a/maintenance/archives/patch-jobs-add-timestamp.sql b/maintenance/archives/patch-jobs-add-timestamp.sql
new file mode 100644
index 00000000..c5e6e711
--- /dev/null
+++ b/maintenance/archives/patch-jobs-add-timestamp.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/job ADD COLUMN job_timestamp varbinary(14) NULL default NULL;
+CREATE INDEX /*i*/job_timestamp ON /*_*/job(job_timestamp);
diff --git a/maintenance/archives/patch-logging-type-action-index.sql b/maintenance/archives/patch-logging-type-action-index.sql
new file mode 100644
index 00000000..5edc61a5
--- /dev/null
+++ b/maintenance/archives/patch-logging-type-action-index.sql
@@ -0,0 +1 @@
+CREATE INDEX /*i*/type_action ON /*_*/logging(log_type, log_action, log_timestamp);
diff --git a/maintenance/archives/patch-page_redirect_namespace_len.sql b/maintenance/archives/patch-page_redirect_namespace_len.sql
new file mode 100644
index 00000000..392945fb
--- /dev/null
+++ b/maintenance/archives/patch-page_redirect_namespace_len.sql
@@ -0,0 +1,6 @@
+--
+-- Add the page_redirect_namespace_len index
+--
+
+CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
+
diff --git a/maintenance/archives/patch-rev_sha1.sql b/maintenance/archives/patch-rev_sha1.sql
new file mode 100644
index 00000000..0100c365
--- /dev/null
+++ b/maintenance/archives/patch-rev_sha1.sql
@@ -0,0 +1,3 @@
+-- Adding rev_sha1 field
+ALTER TABLE /*$wgDBprefix*/revision
+ ADD rev_sha1 varbinary(32) NOT NULL default '';
diff --git a/maintenance/archives/patch-trackbacks.sql b/maintenance/archives/patch-trackbacks.sql
deleted file mode 100644
index e3a47aae..00000000
--- a/maintenance/archives/patch-trackbacks.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE /*$wgDBprefix*/trackbacks (
- tb_id INTEGER AUTO_INCREMENT PRIMARY KEY,
- tb_page INTEGER REFERENCES page(page_id) ON DELETE CASCADE,
- tb_title VARCHAR(255) NOT NULL,
- tb_url BLOB NOT NULL,
- tb_ex TEXT,
- tb_name VARCHAR(255),
-
- INDEX (tb_page)
-);
diff --git a/maintenance/archives/patch-ufg_group-length-increase.sql b/maintenance/archives/patch-ufg_group-length-increase.sql
new file mode 100644
index 00000000..e24cba02
--- /dev/null
+++ b/maintenance/archives/patch-ufg_group-length-increase.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/user_former_groups
+ MODIFY COLUMN ufg_group varbinary(32) NOT NULL default '';
diff --git a/maintenance/archives/patch-ug_group-length-increase.sql b/maintenance/archives/patch-ug_group-length-increase.sql
new file mode 100644
index 00000000..e944a858
--- /dev/null
+++ b/maintenance/archives/patch-ug_group-length-increase.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/user_groups
+ MODIFY COLUMN ug_group varbinary(32) NOT NULL default '';
diff --git a/maintenance/archives/patch-uploadstash_chunk.sql b/maintenance/archives/patch-uploadstash_chunk.sql
new file mode 100644
index 00000000..29e41870
--- /dev/null
+++ b/maintenance/archives/patch-uploadstash_chunk.sql
@@ -0,0 +1,3 @@
+-- Adding us_chunk_inx field
+ALTER TABLE /*$wgDBprefix*/uploadstash
+ ADD us_chunk_inx int unsigned NULL;
diff --git a/maintenance/archives/patch-user_former_groups.sql b/maintenance/archives/patch-user_former_groups.sql
index ed18b2b6..ef56db06 100644
--- a/maintenance/archives/patch-user_former_groups.sql
+++ b/maintenance/archives/patch-user_former_groups.sql
@@ -3,7 +3,7 @@
CREATE TABLE /*_*/user_former_groups (
-- Key to user_id
ufg_user int unsigned NOT NULL default 0,
- ufg_group varbinary(16) NOT NULL default ''
+ ufg_group varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
diff --git a/maintenance/attachLatest.php b/maintenance/attachLatest.php
index e6287f43..6e09671a 100644
--- a/maintenance/attachLatest.php
+++ b/maintenance/attachLatest.php
@@ -65,8 +65,8 @@ class AttachLatest extends Maintenance {
$id = $revision->getId();
$this->output( wfWikiID() . " $pageId [[$name]] latest time $latestTime, rev id $id\n" );
if ( $this->hasOption( 'fix' ) ) {
- $article = new Article( $title );
- $article->updateRevisionOn( $dbw, $revision );
+ $page = WikiPage::factory( $title );
+ $page->updateRevisionOn( $dbw, $revision );
}
$n++;
}
diff --git a/maintenance/backup.inc b/maintenance/backup.inc
index 4cb9c58a..9f67a1ac 100644
--- a/maintenance/backup.inc
+++ b/maintenance/backup.inc
@@ -47,6 +47,8 @@ class BackupDumper {
var $skipFooter = false; // don't output </mediawiki>
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 $dumpUploads = false;
@@ -56,7 +58,14 @@ class BackupDumper {
var $revCountLast = 0;
var $ID = 0;
- function BackupDumper( $args ) {
+ var $outputTypes = array(), $filterTypes = array();
+
+ /**
+ * @var LoadBalancer
+ */
+ protected $lb;
+
+ function __construct( $args ) {
$this->stderr = fopen( "php://stderr", "wt" );
// Built-in output and filter plugins
@@ -247,6 +256,7 @@ class BackupDumper {
* @todo Fixme: the --server parameter is currently not respected, as it
* doesn't seem terribly easy to ask the load balancer for a particular
* connection by name.
+ * @return DatabaseBase
*/
function backupDb() {
$this->lb = wfGetLBFactory()->newMainLB();
@@ -332,7 +342,7 @@ class BackupDumper {
}
class ExportProgressFilter extends DumpFilter {
- function ExportProgressFilter( &$sink, &$progress ) {
+ function __construct( &$sink, &$progress ) {
parent::__construct( $sink );
$this->progress = $progress;
}
diff --git a/maintenance/backupPrefetch.inc b/maintenance/backupPrefetch.inc
index 93f75c65..0e12a1ce 100644
--- a/maintenance/backupPrefetch.inc
+++ b/maintenance/backupPrefetch.inc
@@ -133,6 +133,7 @@ class BaseDump {
/**
* @access private
+ * @return string
*/
function nextText() {
$this->skipTo( 'text' );
@@ -141,6 +142,9 @@ class BaseDump {
/**
* @access private
+ * @param $name string
+ * @param $parent string
+ * @return bool|null
*/
function skipTo( $name, $parent = 'page' ) {
if ( $this->atEnd ) {
@@ -192,6 +196,7 @@ class BaseDump {
/**
* @access private
+ * @return null
*/
function close() {
$this->reader->close();
diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php
index 57fb8759..0056c3c7 100644
--- a/maintenance/benchmarks/Benchmarker.php
+++ b/maintenance/benchmarks/Benchmarker.php
@@ -1,6 +1,7 @@
<?php
/**
* @defgroup Benchmark Benchmark
+ * @ingroup Maintenance
*/
/**
@@ -23,7 +24,7 @@
*
* @todo Report PHP version, OS ..
* @file
- * @ingroup Maintenance Benchmark
+ * @ingroup Benchmark
*/
require_once( dirname( __FILE__ ) . '/../Maintenance.php' );
diff --git a/maintenance/benchmarks/bench_HTTP_HTTPS.php b/maintenance/benchmarks/bench_HTTP_HTTPS.php
index 0038b2d1..cf62aadb 100644
--- a/maintenance/benchmarks/bench_HTTP_HTTPS.php
+++ b/maintenance/benchmarks/bench_HTTP_HTTPS.php
@@ -18,8 +18,8 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Maintenance
- * @author Platonides
+ * @ingroup Benchmark
+ * @author Platonides
*/
require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
diff --git a/maintenance/benchmarks/bench_delete_truncate.php b/maintenance/benchmarks/bench_delete_truncate.php
index 9fe9bea9..71385520 100644
--- a/maintenance/benchmarks/bench_delete_truncate.php
+++ b/maintenance/benchmarks/bench_delete_truncate.php
@@ -1,4 +1,8 @@
<?php
+/**
+ * @file
+ * @ingroup Benchmark
+ */
require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
diff --git a/maintenance/benchmarks/bench_if_switch.php b/maintenance/benchmarks/bench_if_switch.php
index 11c00b3c..dafce050 100644
--- a/maintenance/benchmarks/bench_if_switch.php
+++ b/maintenance/benchmarks/bench_if_switch.php
@@ -18,8 +18,8 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Maintenance
- * @author Platonides
+ * @ingroup Benchmark
+ * @author Platonides
*/
require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
diff --git a/maintenance/benchmarks/bench_strtr_str_replace.php b/maintenance/benchmarks/bench_strtr_str_replace.php
index ae576981..73ace2bd 100644
--- a/maintenance/benchmarks/bench_strtr_str_replace.php
+++ b/maintenance/benchmarks/bench_strtr_str_replace.php
@@ -1,4 +1,8 @@
<?php
+/**
+ * @file
+ * @ingroup Benchmark
+ */
require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
diff --git a/maintenance/benchmarks/bench_wfIsWindows.php b/maintenance/benchmarks/bench_wfIsWindows.php
index 4c35221d..4caebc5e 100644
--- a/maintenance/benchmarks/bench_wfIsWindows.php
+++ b/maintenance/benchmarks/bench_wfIsWindows.php
@@ -18,8 +18,8 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Maintenance
- * @author Platonides
+ * @ingroup Benchmark
+ * @author Platonides
*/
require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
diff --git a/maintenance/benchmarks/benchmarkHooks.php b/maintenance/benchmarks/benchmarkHooks.php
new file mode 100644
index 00000000..4ec26168
--- /dev/null
+++ b/maintenance/benchmarks/benchmarkHooks.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Benchmark
+ */
+
+require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
+
+class BenchmarkHooks extends Benchmarker {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Benchmark MediaWiki Hooks.';
+ }
+
+ public function execute() {
+ global $wgHooks;
+ $wgHooks['Test'] = array();
+
+ $time = $this->benchHooks();
+ $this->output( 'Empty hook: ' . $time . "\n" );
+
+ $wgHooks['Test'][] = array( $this, 'test' );
+ $time = $this->benchHooks();
+ $this->output( 'Loaded (one) hook: ' . $time . "\n" );
+
+ for( $i = 0; $i < 9; $i++ ) {
+ $wgHooks['Test'][] = array( $this, 'test' );
+ }
+ $time = $this->benchHooks();
+ $this->output( 'Loaded (ten) hook: ' . $time . "\n" );
+
+ for( $i = 0; $i < 90; $i++ ) {
+ $wgHooks['Test'][] = array( $this, 'test' );
+ }
+ $time = $this->benchHooks();
+ $this->output( 'Loaded (one hundred) hook: ' . $time . "\n" );
+ $this->output( "\n" );
+ }
+
+ /**
+ * @param $trials int
+ * @return string
+ */
+ private function benchHooks( $trials = 10 ) {
+ $start = wfTime();
+ for ( $i = 0; $i < $trials; $i++ ) {
+ wfRunHooks( 'Test' );
+ }
+ $delta = wfTime() - $start;
+ $pertrial = $delta / $trials;
+ return sprintf( "Took %6.2fs",
+ $pertrial );
+ }
+
+ /**
+ * @return bool
+ */
+ public function test() {
+ return true;
+ }
+}
+
+$maintClass = 'BenchmarkHooks';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/benchmarks/benchmarkPurge.php b/maintenance/benchmarks/benchmarkPurge.php
index 4ab7aa10..e9d2ec7a 100644
--- a/maintenance/benchmarks/benchmarkPurge.php
+++ b/maintenance/benchmarks/benchmarkPurge.php
@@ -18,7 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Maintenance
+ * @ingroup Benchmark
*/
require_once( dirname( __FILE__ ) . '/Benchmarker.php' );
@@ -54,6 +54,7 @@ class BenchmarkPurge extends Benchmarker {
* to benchmark Squid response times.
* @param $urls array A bunch of URLs to purge
* @param $trials int How many times to run the test?
+ * @return string
*/
private function benchSquid( $urls, $trials = 1 ) {
$start = wfTime();
@@ -70,6 +71,7 @@ class BenchmarkPurge extends Benchmarker {
/**
* Get an array of randomUrl()'s.
* @param $length int How many urls to add to the array
+ * @return array
*/
private function randomUrlList( $length ) {
$list = array();
@@ -82,6 +84,7 @@ class BenchmarkPurge extends Benchmarker {
/**
* Return a random URL of the wiki. Not necessarily an actual title in the
* database, but at least a URL that looks like one.
+ * @return string
*/
private function randomUrl() {
global $wgServer, $wgArticlePath;
@@ -91,6 +94,7 @@ class BenchmarkPurge extends Benchmarker {
/**
* Create a random title string (not necessarily a Title object).
* For use with randomUrl().
+ * @return string
*/
private function randomTitle() {
$str = '';
diff --git a/maintenance/changePassword.php b/maintenance/changePassword.php
index ef87dfbd..cfcac406 100644
--- a/maintenance/changePassword.php
+++ b/maintenance/changePassword.php
@@ -43,7 +43,7 @@ class ChangePassword extends Maintenance {
} else {
$this->error( "A \"user\" or \"userid\" must be set to change the password for" , true );
}
- if ( !$user->getId() ) {
+ if ( !$user || !$user->getId() ) {
$this->error( "No such user: " . $this->getOption( 'user' ), true );
}
try {
diff --git a/maintenance/checkImages.php b/maintenance/checkImages.php
index 96b93f22..484217d9 100644
--- a/maintenance/checkImages.php
+++ b/maintenance/checkImages.php
@@ -49,7 +49,9 @@ class CheckImages extends Maintenance {
$this->output( "{$row->img_name}: not locally accessible\n" );
continue;
}
- $stat = @stat( $file->getPath() );
+ wfSuppressWarnings();
+ $stat = stat( $file->getPath() );
+ wfRestoreWarnings();
if ( !$stat ) {
$this->output( "{$row->img_name}: missing\n" );
continue;
diff --git a/maintenance/checkSyntax.php b/maintenance/checkSyntax.php
index 83f73be5..cc4e5af5 100644
--- a/maintenance/checkSyntax.php
+++ b/maintenance/checkSyntax.php
@@ -165,6 +165,8 @@ class CheckSyntax extends Maintenance {
/**
* Returns true if $file is of a type we can check
+ * @param $file string
+ * @return bool
*/
private function isSuitableFile( $file ) {
$file = str_replace( '\\', '/', $file );
@@ -181,6 +183,8 @@ class CheckSyntax extends Maintenance {
/**
* Add given path to file list, searching it in include path if needed
+ * @param $path string
+ * @return bool
*/
private function addPath( $path ) {
global $IP;
@@ -188,8 +192,10 @@ class CheckSyntax extends Maintenance {
}
/**
- * Add given file to file list, or, if it's a directory, add its content
- */
+ * Add given file to file list, or, if it's a directory, add its content
+ * @param $path string
+ * @return bool
+ */
private function addFileOrDir( $path ) {
if ( is_dir( $path ) ) {
$this->addDirectoryContent( $path );
diff --git a/maintenance/cleanupCaps.php b/maintenance/cleanupCaps.php
index 2d945a52..6f8e180c 100644
--- a/maintenance/cleanupCaps.php
+++ b/maintenance/cleanupCaps.php
@@ -40,11 +40,15 @@ class CapsCleanup extends TableCleanup {
public function execute() {
global $wgCapitalLinks, $wgUser;
+
+ if ( $wgCapitalLinks ) {
+ $this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
+ }
+
+ $wgUser = User::newFromName( 'Conversion script' );
+
$this->namespace = intval( $this->getOption( 'namespace', 0 ) );
$this->dryrun = $this->hasOption( 'dry-run' );
- $wgUser->setName( 'Conversion script' );
- if ( $wgCapitalLinks )
- $this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
$this->runTable( array(
'table' => 'page',
@@ -88,9 +92,8 @@ class CapsCleanup extends TableCleanup {
return $this->processRow( $row );
}
}
- } else {
- $this->progress( 0 );
}
+ return $this->progress( 0 );
}
}
diff --git a/maintenance/cleanupImages.php b/maintenance/cleanupImages.php
index c8e90958..81d1c85b 100644
--- a/maintenance/cleanupImages.php
+++ b/maintenance/cleanupImages.php
@@ -73,8 +73,9 @@ class ImageCleanup extends TableCleanup {
if ( is_null( $title ) ) {
$this->output( "page $source ($cleaned) is illegal.\n" );
$safe = $this->buildSafeTitle( $cleaned );
- if ( $safe === false )
+ if ( $safe === false ) {
return $this->progress( 0 );
+ }
$this->pokeFile( $source, $safe );
return $this->progress( 1 );
}
@@ -86,9 +87,12 @@ class ImageCleanup extends TableCleanup {
return $this->progress( 1 );
}
- $this->progress( 0 );
+ return $this->progress( 0 );
}
+ /**
+ * @param $name string
+ */
private function killRow( $name ) {
if ( $this->dryrun ) {
$this->output( "DRY RUN: would delete bogus row '$name'\n" );
@@ -120,7 +124,8 @@ class ImageCleanup extends TableCleanup {
$path = $this->filePath( $orig );
if ( !file_exists( $path ) ) {
$this->output( "missing file: $path\n" );
- return $this->killRow( $orig );
+ $this->killRow( $orig );
+ return;
}
$db = wfGetDB( DB_MASTER );
@@ -135,7 +140,7 @@ class ImageCleanup extends TableCleanup {
$version = 0;
$final = $new;
$conflict = ( $this->imageExists( $final, $db ) ||
- ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
+ ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
while ( $conflict ) {
$this->output( "Rename conflicts with '$final'...\n" );
@@ -166,8 +171,8 @@ class ImageCleanup extends TableCleanup {
__METHOD__ );
$dir = dirname( $finalPath );
if ( !file_exists( $dir ) ) {
- if ( !wfMkdirParents( $dir ) ) {
- $this->log( "RENAME FAILED, COULD NOT CREATE $dir" );
+ if ( !wfMkdirParents( $dir, null, __METHOD__ ) ) {
+ $this->output( "RENAME FAILED, COULD NOT CREATE $dir" );
$db->rollback();
return;
}
diff --git a/maintenance/cleanupSpam.php b/maintenance/cleanupSpam.php
index 8561281d..ca1e302b 100644
--- a/maintenance/cleanupSpam.php
+++ b/maintenance/cleanupSpam.php
@@ -36,6 +36,9 @@ class CleanupSpam extends Maintenance {
$username = wfMsg( 'spambot_username' );
$wgUser = User::newFromName( $username );
+ if ( !$wgUser ) {
+ $this->error( "Invalid username", true );
+ }
// Create the user if necessary
if ( !$wgUser->getId() ) {
$wgUser->addToDatabase();
@@ -91,36 +94,29 @@ class CleanupSpam extends Maintenance {
$this->output( $title->getPrefixedDBkey() . " ..." );
$rev = Revision::newFromTitle( $title );
- $revId = $rev->getId();
- $currentRevId = $revId;
+ $currentRevId = $rev->getId();
- while ( $rev && LinkFilter::matchEntry( $rev->getText() , $domain ) ) {
- # Revision::getPrevious can't be used in this way before MW 1.6 (Revision.php 1.26)
- # $rev = $rev->getPrevious();
- $revId = $title->getPreviousRevisionID( $revId );
- if ( $revId ) {
- $rev = Revision::newFromTitle( $title, $revId );
- } else {
- $rev = false;
- }
+ while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT ) || LinkFilter::matchEntry( $rev->getText() , $domain ) ) ) {
+ $rev = $rev->getPrevious();
}
- if ( $revId == $currentRevId ) {
+
+ if ( $rev && $rev->getId() == $currentRevId ) {
// The regex didn't match the current article text
// This happens e.g. when a link comes from a template rather than the page itself
$this->output( "False match\n" );
} else {
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
+ $page = WikiPage::factory( $title );
if ( !$rev ) {
// Didn't find a non-spammy revision, blank the page
$this->output( "blanking\n" );
- $article = new Article( $title );
- $article->doEdit( '', wfMsg( 'spam_blanking', $domain ) );
+ $page->doEdit( '', wfMsgForContent( 'spam_blanking', $domain ) );
} else {
// Revert to this revision
$this->output( "reverting\n" );
- $article = new Article( $title );
- $article->doEdit( $rev->getText(), wfMsg( 'spam_reverting', $domain ), EDIT_UPDATE );
+ $page->doEdit( $rev->getText(), wfMsgForContent( 'spam_reverting', $domain ),
+ EDIT_UPDATE, $rev->getId() );
}
$dbw->commit();
}
diff --git a/maintenance/cleanupTable.inc b/maintenance/cleanupTable.inc
index f63c6d74..1c279762 100644
--- a/maintenance/cleanupTable.inc
+++ b/maintenance/cleanupTable.inc
@@ -43,7 +43,7 @@ class TableCleanup extends Maintenance {
public function execute() {
global $wgUser;
- $wgUser->setName( 'Conversion script' );
+ $wgUser = User::newFromName( 'Conversion script' );
$this->dryrun = $this->hasOption( 'dry-run' );
if ( $this->dryrun ) {
$this->output( "Checking for bad titles...\n" );
diff --git a/maintenance/cleanupTitles.php b/maintenance/cleanupTitles.php
index f03b7957..4fc6415e 100644
--- a/maintenance/cleanupTitles.php
+++ b/maintenance/cleanupTitles.php
@@ -145,8 +145,7 @@ class TitleCleanup extends TableCleanup {
),
array( 'page_id' => $row->page_id ),
__METHOD__ );
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
+ LinkCache::singleton()->clear();
}
}
}
diff --git a/maintenance/cleanupUploadStash.php b/maintenance/cleanupUploadStash.php
index 1926c05a..5f57ffdf 100644
--- a/maintenance/cleanupUploadStash.php
+++ b/maintenance/cleanupUploadStash.php
@@ -32,44 +32,52 @@ class UploadStashCleanup extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Clean up abandoned files in temporary uploaded file stash";
- }
+ }
- public function execute() {
+ public function execute() {
$repo = RepoGroup::singleton()->getLocalRepo();
-
+
$dbr = $repo->getSlaveDb();
-
+
+ // how far back should this look for files to delete?
+ global $wgUploadStashMaxAge;
+
$this->output( "Getting list of files to clean up...\n" );
$res = $dbr->select(
'uploadstash',
'us_key',
- 'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( time() - UploadStash::REPO_AGE * 3600 ) ),
+ 'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( time() - $wgUploadStashMaxAge ) ),
__METHOD__
);
-
+
if( !is_object( $res ) || $res->numRows() == 0 ) {
+ $this->output( "No files to cleanup!\n" );
// nothing to do.
- return false;
+ return;
}
// finish the read before starting writes.
$keys = array();
- foreach($res as $row) {
+ foreach( $res as $row ) {
array_push( $keys, $row->us_key );
}
-
+
$this->output( 'Removing ' . count($keys) . " file(s)...\n" );
// this could be done some other, more direct/efficient way, but using
// UploadStash's own methods means it's less likely to fall accidentally
// out-of-date someday
$stash = new UploadStash( $repo );
-
+
foreach( $keys as $key ) {
- $stash->getFile( $key, true );
- $stash->removeFileNoAuth( $key );
+ try {
+ $stash->getFile( $key, true );
+ $stash->removeFileNoAuth( $key );
+ } catch ( UploadStashBadPathException $ex ) {
+ $this->output( "Failed removing stashed upload with key: $key\n" );
+ }
}
}
}
$maintClass = "UploadStashCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN ); \ No newline at end of file
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clear_stats.php b/maintenance/clear_stats.php
index 8f91864e..61314e67 100644
--- a/maintenance/clear_stats.php
+++ b/maintenance/clear_stats.php
@@ -36,7 +36,6 @@ class clear_stats extends Maintenance {
$wgMemc->delete( "$db:stats:request_with_session" );
$wgMemc->delete( "$db:stats:request_without_session" );
$wgMemc->delete( "$db:stats:pcache_hit" );
- $wgMemc->delete( "$db:stats:pcache_miss_invalid" );
$wgMemc->delete( "$db:stats:pcache_miss_expired" );
$wgMemc->delete( "$db:stats:pcache_miss_absent" );
$wgMemc->delete( "$db:stats:pcache_miss_stub" );
@@ -46,6 +45,8 @@ class clear_stats extends Maintenance {
$wgMemc->delete( "$db:stats:diff_cache_hit" );
$wgMemc->delete( "$db:stats:diff_cache_miss" );
$wgMemc->delete( "$db:stats:diff_uncacheable" );
+ $wgMemc->delete( "$db:stats:job-insert" );
+ $wgMemc->delete( "$db:stats:job-pop" );
}
}
}
diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc
index f57c0b67..c7adbfbc 100644
--- a/maintenance/commandLine.inc
+++ b/maintenance/commandLine.inc
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
global $optionsWithArgs;
if ( !isset( $optionsWithArgs ) ) {
@@ -37,19 +37,13 @@ class CommandLineInc extends Maintenance {
}
}
- public function getDbType() {
- global $wgUseNormalUser;
-
- return ( isset( $wgUseNormalUser ) && $wgUseNormalUser ) ?
- Maintenance::DB_STD : Maintenance::DB_ADMIN;
- }
-
/**
* No help, it would just be misleading since it misses custom options
*/
protected function maybeHelp( $force = false ) {
- if ( !$force )
+ if ( !$force ) {
return;
+ }
parent::maybeHelp( true );
}
diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php
index f46f710d..da6ff9b6 100644
--- a/maintenance/convertUserOptions.php
+++ b/maintenance/convertUserOptions.php
@@ -33,27 +33,38 @@ class ConvertUserOptions extends Maintenance {
}
public function execute() {
- $this->output( "Beginning batch conversion of user options.\n" );
+ $this->output( "...batch conversion of user_options: " );
$id = 0;
$dbw = wfGetDB( DB_MASTER );
+ if ( !$dbw->fieldExists( 'user', 'user_options', __METHOD__ ) ) {
+ $this->output( "nothing to migrate. " );
+ return;
+ }
while ( $id !== null ) {
- $idCond = 'user_id>' . $dbw->addQuotes( $id );
- $optCond = "user_options!=" . $dbw->addQuotes( '' ); // For compatibility
+ $idCond = 'user_id > ' . $dbw->addQuotes( $id );
+ $optCond = "user_options != " . $dbw->addQuotes( '' ); // For compatibility
$res = $dbw->select( 'user', '*',
- array( $optCond, $idCond ), __METHOD__,
- array( 'LIMIT' => 50, 'FOR UPDATE' ) );
+ array( $optCond, $idCond ), __METHOD__,
+ array( 'LIMIT' => 50, 'FOR UPDATE' )
+ );
$id = $this->convertOptionBatch( $res, $dbw );
$dbw->commit();
wfWaitForSlaves();
- if ( $id )
+ if ( $id ) {
$this->output( "--Converted to ID $id\n" );
+ }
}
- $this->output( "Conversion done. Converted " . $this->mConversionCount . " user records.\n" );
+ $this->output( "done. Converted " . $this->mConversionCount . " user records.\n" );
}
+ /**
+ * @param $res
+ * @param $dbw DatabaseBase
+ * @return null|int
+ */
function convertOptionBatch( $res, $dbw ) {
$id = null;
foreach ( $res as $row ) {
@@ -62,6 +73,14 @@ class ConvertUserOptions extends Maintenance {
$u = User::newFromRow( $row );
$u->saveSettings();
+
+ // Do this here as saveSettings() doesn't set user_options to '' anymore!
+ $dbw->update(
+ 'user',
+ array( 'user_options' => '' ),
+ array( 'user_id' => $row->user_id ),
+ __METHOD__
+ );
$id = $row->user_id;
}
diff --git a/maintenance/deleteBatch.php b/maintenance/deleteBatch.php
index eb2e1f34..56fe13a4 100644
--- a/maintenance/deleteBatch.php
+++ b/maintenance/deleteBatch.php
@@ -49,9 +49,16 @@ class DeleteBatch extends Maintenance {
chdir( $oldCwd );
# Options processing
- $user = $this->getOption( 'u', 'Delete page script' );
+ $username = $this->getOption( 'u', 'Delete page script' );
$reason = $this->getOption( 'r', '' );
$interval = $this->getOption( 'i', 0 );
+
+ $user = User::newFromName( $username );
+ if ( !$user ) {
+ $this->error( "Invalid username", true );
+ }
+ $wgUser = $user;
+
if ( $this->hasArg() ) {
$file = fopen( $this->getArg(), 'r' );
} else {
@@ -62,7 +69,7 @@ class DeleteBatch extends Maintenance {
if ( !$file ) {
$this->error( "Unable to read file, exiting", true );
}
- $wgUser = User::newFromName( $user );
+
$dbw = wfGetDB( DB_MASTER );
# Handle each entry
@@ -71,31 +78,27 @@ class DeleteBatch extends Maintenance {
if ( $line == '' ) {
continue;
}
- $page = Title::newFromText( $line );
- if ( is_null( $page ) ) {
+ $title = Title::newFromText( $line );
+ if ( is_null( $title ) ) {
$this->output( "Invalid title '$line' on line $linenum\n" );
continue;
}
- if ( !$page->exists() ) {
+ if ( !$title->exists() ) {
$this->output( "Skipping nonexistent page '$line'\n" );
continue;
}
-
- $this->output( $page->getPrefixedText() );
+ $this->output( $title->getPrefixedText() );
$dbw->begin();
- if ( $page->getNamespace() == NS_FILE ) {
- $art = new ImagePage( $page );
- $img = wfFindFile( $art->mTitle );
- if ( !$img
- || !$img->isLocal()
- || !$img->delete( $reason ) ) {
- $this->output( " FAILED to delete image file... " );
+ if ( $title->getNamespace() == NS_FILE ) {
+ $img = wfFindFile( $title );
+ if ( $img && $img->isLocal() && !$img->delete( $reason ) ) {
+ $this->output( " FAILED to delete associated file... " );
}
- } else {
- $art = new Article( $page );
}
- $success = $art->doDeleteArticle( $reason );
+ $page = WikiPage::factory( $title );
+ $error = '';
+ $success = $page->doDeleteArticle( $reason, false, 0, false, $error, $user );
$dbw->commit();
if ( $success ) {
$this->output( " Deleted!\n" );
@@ -107,7 +110,7 @@ class DeleteBatch extends Maintenance {
sleep( $interval );
}
wfWaitForSlaves();
-}
+ }
}
}
diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php
index a33921b1..21d7755f 100644
--- a/maintenance/deleteDefaultMessages.php
+++ b/maintenance/deleteDefaultMessages.php
@@ -31,9 +31,7 @@ class DeleteDefaultMessages extends Maintenance {
}
public function execute() {
-
- $user = 'MediaWiki default';
- $reason = 'No longer required';
+ global $wgUser;
$this->output( "Checking existence of old default messages..." );
$dbr = wfGetDB( DB_SLAVE );
@@ -54,9 +52,12 @@ class DeleteDefaultMessages extends Maintenance {
# Deletions will be made by $user temporarly added to the bot group
# in order to hide it in RecentChanges.
- global $wgUser;
- $wgUser = User::newFromName( $user );
- $wgUser->addGroup( 'bot' );
+ $user = User::newFromName( 'MediaWiki default' );
+ if ( !$user ) {
+ $this->error( "Invalid username", true );
+ }
+ $user->addGroup( 'bot' );
+ $wgUser = $user;
# Handle deletion
$this->output( "\n...deleting old default messages (this may take a long time!)...", 'msg' );
@@ -66,9 +67,10 @@ class DeleteDefaultMessages extends Maintenance {
wfWaitForSlaves();
$dbw->ping();
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $article = new Article( $title );
+ $page = WikiPage::factory( $title );
$dbw->begin();
- $article->doDeleteArticle( $reason );
+ $error = ''; // Passed by ref
+ $page->doDeleteArticle( 'No longer required', false, 0, false, $error, $user );
$dbw->commit();
}
diff --git a/maintenance/dev/README b/maintenance/dev/README
new file mode 100644
index 00000000..ca47d136
--- /dev/null
+++ b/maintenance/dev/README
@@ -0,0 +1,7 @@
+maintenance/dev/ scripts can help quickly setup a local MediaWiki for development purposes.
+
+Wikis setup in this way are NOT meant to be publicly available. They use a development database not acceptible for use in production. Place a sqlite database in an unsafe location a real wiki should never place it in. And use predictable default logins for the initial administrator user.
+
+Running maintenance/dev/install.sh will download and install a local copy of php 5.4, install a sqlite powered instance of MW for development, and then start up a local webserver to view the wiki.
+
+After installation you can bring the webserver back up at any time you want with maintenance/dev/start.sh
diff --git a/maintenance/dev/includes/php.sh b/maintenance/dev/includes/php.sh
new file mode 100644
index 00000000..3021b93b
--- /dev/null
+++ b/maintenance/dev/includes/php.sh
@@ -0,0 +1,12 @@
+# Include-able script to determine the location of our php if any
+
+if [ -d "$DEV/php" -a -x "$DEV/php/bin/php" ]; then
+ # Quick local copy
+ PHP="$DEV/php/bin/php"
+elif [ -d "$HOME/.mediawiki/php" -a -x "$HOME/.mediawiki/php/bin/php" ]; then
+ # Previous home directory location to install php in
+ PHP="$HOME/.mediawiki/php/bin/php"
+elif [ -d "$HOME/.mwphp" -a -x "$HOME/.mwphp/bin/php" ]; then
+ # Previous home directory location to install php in
+ PHP="$HOME/.mwphp/bin/php"
+fi
diff --git a/maintenance/dev/includes/require-php.sh b/maintenance/dev/includes/require-php.sh
new file mode 100644
index 00000000..470e6eb8
--- /dev/null
+++ b/maintenance/dev/includes/require-php.sh
@@ -0,0 +1,8 @@
+# Include-able script to require that we have a known php binary we can execute
+
+. "$DEV/includes/php.sh"
+
+if [ "x$PHP" == "x" -o ! -x "$PHP" ]; then
+ echo "Local copy of PHP is not installed"
+ exit 1
+fi
diff --git a/maintenance/dev/includes/router.php b/maintenance/dev/includes/router.php
new file mode 100644
index 00000000..f6a062b6
--- /dev/null
+++ b/maintenance/dev/includes/router.php
@@ -0,0 +1,82 @@
+<?php
+
+# Router for the php cli-server built-in webserver
+# http://ca2.php.net/manual/en/features.commandline.webserver.php
+
+if ( php_sapi_name() != 'cli-server' ) {
+ die( "This script can only be run by php's cli-server sapi." );
+}
+
+ini_set('display_errors', 1);
+error_reporting(E_ALL);
+
+if ( isset( $_SERVER["SCRIPT_FILENAME"] ) ) {
+ # Known resource, sometimes a script sometimes a file
+ $file = $_SERVER["SCRIPT_FILENAME"];
+} elseif ( isset( $_SERVER["SCRIPT_NAME"] ) ) {
+ # Usually unknown, document root relative rather than absolute
+ # Happens with some cases like /wiki/File:Image.png
+ if ( is_readable( $_SERVER['DOCUMENT_ROOT'] . $_SERVER["SCRIPT_NAME"] ) ) {
+ # Just in case this actually IS a file, set it here
+ $file = $_SERVER['DOCUMENT_ROOT'] . $_SERVER["SCRIPT_NAME"];
+ } else {
+ # Otherwise let's pretend that this is supposed to go to index.php
+ $file = $_SERVER['DOCUMENT_ROOT'] . '/index.php';
+ }
+} else {
+ # Meh, we'll just give up
+ return false;
+}
+
+# And now do handling for that $file
+
+if ( !is_readable( $file ) ) {
+ # Let the server throw the error if it doesn't exist
+ return false;
+}
+$ext = pathinfo( $file, PATHINFO_EXTENSION );
+if ( $ext == 'php' || $ext == 'php5' ) {
+ # Execute php files
+ # 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 );
+ return true;
+}
+$mime = false;
+$lines = explode( "\n", file_get_contents( "includes/mime.types" ) );
+foreach ( $lines as $line ) {
+ $exts = explode( " ", $line );
+ $mime = array_shift( $exts );
+ if ( in_array( $ext, $exts ) ) {
+ break; # this is the right value for $mime
+ }
+ $mime = false;
+}
+if ( !$mime ) {
+ $basename = basename( $file );
+ if ( $basename == strtoupper( $basename ) ) {
+ # IF it's something like README serve it as text
+ $mime = "text/plain";
+ }
+}
+if ( $mime ) {
+ # Use custom handling to serve files with a known mime type
+ # 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');
+ 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");
+ } else {
+ header("Content-Type: $mime");
+ }
+ header("Content-Length: " . filesize($file));
+ // Stream that out to the browser
+ fpassthru($f);
+ return true;
+}
+
+# Let the php server handle things on it's own otherwise
+return false;
diff --git a/maintenance/dev/install.sh b/maintenance/dev/install.sh
new file mode 100644
index 00000000..2219894d
--- /dev/null
+++ b/maintenance/dev/install.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+if [ "x$BASH_SOURCE" == "x" ]; then echo '$BASH_SOURCE not set'; exit 1; fi
+DEV=$(cd -P "$(dirname "${BASH_SOURCE[0]}" )" && pwd)
+
+"$DEV/installphp.sh"
+"$DEV/installmw.sh"
+"$DEV/start.sh"
diff --git a/maintenance/dev/installmw.sh b/maintenance/dev/installmw.sh
new file mode 100644
index 00000000..9ae3c593
--- /dev/null
+++ b/maintenance/dev/installmw.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+if [ "x$BASH_SOURCE" == "x" ]; then echo '$BASH_SOURCE not set'; exit 1; fi
+DEV=$(cd -P "$(dirname "${BASH_SOURCE[0]}" )" && pwd)
+
+. "$DEV/includes/require-php.sh"
+
+set -e
+
+PORT=4881
+
+cd "$DEV/../../"; # $IP
+
+mkdir -p "$DEV/data"
+"$PHP" maintenance/install.php --server="http://localhost:$PORT" --scriptpath="" --dbtype=sqlite --dbpath="$DEV/data" --pass=admin "Trunk Test" "$USER"
+echo ""
+echo "Development wiki created with admin user $USER and password 'admin'."
+echo ""
diff --git a/maintenance/dev/installphp.sh b/maintenance/dev/installphp.sh
new file mode 100644
index 00000000..d26ffa67
--- /dev/null
+++ b/maintenance/dev/installphp.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+if [ "x$BASH_SOURCE" == "x" ]; then echo '$BASH_SOURCE not set'; exit 1; fi
+DEV=$(cd -P "$(dirname "${BASH_SOURCE[0]}" )" && pwd)
+
+set -e # DO NOT USE PIPES unless this is rewritten
+
+. "$DEV/includes/php.sh"
+
+if [ "x$PHP" != "x" -a -x "$PHP" ]; then
+ echo "PHP is already installed"
+ exit 0
+fi
+
+TAR=php5.4-latest.tar.gz
+PHPURL="http://snaps.php.net/$TAR"
+
+cd "$DEV"
+
+echo "Preparing to download and install a local copy of PHP 5.4, note that this can take some time to do."
+echo "If you wish to avoid re-doing this for uture dev installations of MediaWiki we suggest installing php in ~/.mediawiki/php"
+echo -n "Install PHP in ~/.mediawiki/php [y/N]: "
+read INSTALLINHOME
+
+case "$INSTALLINHOME" in
+ [Yy] | [Yy][Ee][Ss] )
+ PREFIX="$HOME/.mediawiki/php"
+ ;;
+ *)
+ PREFIX="$DEV/php/"
+ ;;
+esac
+
+# Some debain-like systems bundle wget but not curl, some other systems
+# like os x bundle curl but not wget... use whatever is available
+echo -n "Downloading PHP 5.4"
+if command -v wget &>/dev/null; then
+ echo "- using wget"
+ wget "$PHPURL"
+elif command -v curl &>/dev/null; then
+ echo "- using curl"
+ curl -O "$PHPURL"
+else
+ echo "- aborting"
+ echo "Could not find curl or wget." >&2;
+ exit 1;
+fi
+
+echo "Extracting php 5.4"
+tar -xzf "$TAR"
+
+cd php5.4-*/
+
+echo "Configuring and installing php 5.4 in $PREFIX"
+./configure --prefix="$PREFIX"
+make
+make install
diff --git a/maintenance/dev/start.sh b/maintenance/dev/start.sh
new file mode 100644
index 00000000..dd7363a8
--- /dev/null
+++ b/maintenance/dev/start.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+if [ "x$BASH_SOURCE" == "x" ]; then echo '$BASH_SOURCE not set'; exit 1; fi
+DEV=$(cd -P "$(dirname "${BASH_SOURCE[0]}" )" && pwd)
+
+. "$DEV/includes/require-php.sh"
+
+PORT=4881
+
+echo "Starting up MediaWiki at http://localhost:$PORT/"
+echo ""
+
+cd "$DEV/../../"; # $IP
+"$PHP" -S "localhost:$PORT" "$DEV/includes/router.php"
diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php
index 44e00032..6b29c5fd 100644
--- a/maintenance/doMaintenance.php
+++ b/maintenance/doMaintenance.php
@@ -74,18 +74,18 @@ require_once( MWInit::compiledPath( 'includes/DefaultSettings.php' ) );
if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
# Use a callback function to configure MediaWiki
MWFunction::call( MW_CONFIG_CALLBACK );
-} elseif ( file_exists( "$IP/../wmf-config/wikimedia-mode" ) ) {
- // Load settings, using wikimedia-mode if needed
- // @todo FIXME: Replace this hack with general farm-friendly code
- # @todo FIXME: Wikimedia-specific stuff needs to go away to an ext
- # Maybe a hook?
- global $cluster;
- $cluster = 'pmtpa';
- require( MWInit::interpretedPath( '../wmf-config/wgConf.php' ) );
- $maintenance->loadWikimediaSettings();
- require( MWInit::interpretedPath( '../wmf-config/CommonSettings.php' ) );
} else {
- require_once( $maintenance->loadSettings() );
+ if ( file_exists( "$IP/../wmf-config/wikimedia-mode" ) ) {
+ // Load settings, using wikimedia-mode if needed
+ // @todo FIXME: Replace this hack with general farm-friendly code
+ # @todo FIXME: Wikimedia-specific stuff needs to go away to an ext
+ # Maybe a hook?
+ global $cluster;
+ $cluster = 'pmtpa';
+ require( MWInit::interpretedPath( '../wmf-config/wgConf.php' ) );
+ }
+ // Require the configuration (probably LocalSettings.php)
+ require( $maintenance->loadSettings() );
}
if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
diff --git a/maintenance/dtrace/counts.d b/maintenance/dtrace/counts.d
deleted file mode 100644
index bedb4547..00000000
--- a/maintenance/dtrace/counts.d
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * This software is in the public domain.
- *
- * $Id$
- */
-
-#pragma D option quiet
-
-self int tottime;
-BEGIN {
- tottime = timestamp;
-}
-
-php$target:::function-entry
- @counts[copyinstr(arg0)] = count();
-}
-
-END {
- printf("Total time: %dus\n", (timestamp - tottime) / 1000);
- printf("# calls by function:\n");
- printa("%-40s %@d\n", @counts);
-}
-
diff --git a/maintenance/dtrace/tree.d b/maintenance/dtrace/tree.d
deleted file mode 100644
index a799cb12..00000000
--- a/maintenance/dtrace/tree.d
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * This software is in the public domain.
- *
- * $Id$
- */
-
-#pragma D option quiet
-
-self int indent;
-self int times[int];
-
-php$target:::function-entry
-{
- @counts[copyinstr(arg0)] = count();
- printf("%*s", self->indent, "");
- printf("-> %s\n", copyinstr(arg0));
- self->times[self->indent] = timestamp;
- self->indent += 2;
-}
-
-php$target:::function-return
-{
- self->indent -= 2;
- printf("%*s", self->indent, "");
- printf("<- %s %dus\n", copyinstr(arg0), (timestamp - self->times[self->indent]) / 1000);
-}
diff --git a/maintenance/dumpBackup.php b/maintenance/dumpBackup.php
index 15189261..c49a2963 100644
--- a/maintenance/dumpBackup.php
+++ b/maintenance/dumpBackup.php
@@ -119,7 +119,7 @@ Options:
Fancy stuff: (Works? Add examples please.)
--plugin=<class>[:<file>] Load a dump plugin class
--output=<type>:<file> Begin a filtered output stream;
- <type>s: file, gzip, bzip2, 7zip
+ <type>s: file, gzip, bzip2, 7zip
--filter=<type>[:<options>] Add a filter on an output branch
ENDS
diff --git a/maintenance/dumpHTML.php b/maintenance/dumpHTML.php
deleted file mode 100644
index bd94958e..00000000
--- a/maintenance/dumpHTML.php
+++ /dev/null
@@ -1,7 +0,0 @@
-dumpHTML has moved to the DumpHTML extension.
-
-WebDAV/SVN:
-http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/DumpHTML/
-
-Web:
-http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/DumpHTML/
diff --git a/maintenance/dumpInterwiki.php b/maintenance/dumpInterwiki.php
deleted file mode 100644
index 217afd88..00000000
--- a/maintenance/dumpInterwiki.php
+++ /dev/null
@@ -1,251 +0,0 @@
-<?php
-/**
- * Build constant slightly compact database of interwiki prefixes
- * Wikimedia specific!
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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
- * @ingroup Maintenance
- * @ingroup Wikimedia
- */
-
-require_once( dirname( __FILE__ ) . '/Site.php' );
-
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
-class DumpInterwiki extends Maintenance {
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Build constant slightly compact database of interwiki prefixes.";
- $this->addOption( 'langlist', 'File with one language code per line', false, true );
- $this->addOption( 'dblist', 'File with one db per line', false, true );
- $this->addOption( 'specialdbs', "File with one 'special' db per line", false, true );
- $this->addOption( 'o', 'Cdb output file', false, true );
- $this->addOption( 'protocolrelative', 'Output wikimedia interwiki urls as protocol relative', false, false );
- }
-
- function execute() {
- # List of language prefixes likely to be found in multi-language sites
- $this->langlist = array_map( "trim", file( $this->getOption( 'langlist', "/home/wikipedia/common/langlist" ) ) );
-
- # List of all database names
- $this->dblist = array_map( "trim", file( $this->getOption( 'dblist', "/home/wikipedia/common/all.dblist" ) ) );
-
- # Special-case databases
- $this->specials = array_flip( array_map( "trim", file( $this->getOption( 'specialdbs', "/home/wikipedia/common/special.dblist" ) ) ) );
-
- if ( $this->hasOption( 'o' ) ) {
- $this->dbFile = CdbWriter::open( $this->getOption( 'o' ) ) ;
- } else {
- $this->dbFile = false;
- }
-
- if ( $this->hasOption( 'protocolrelative' ) ) {
- $this->urlprotocol = '';
- } else {
- $this->urlprotocol = 'http:';
- }
-
- $this->getRebuildInterwikiDump();
- }
-
- function getRebuildInterwikiDump() {
- global $wgContLang;
-
- # Multi-language sites
- # db suffix => db suffix, iw prefix, hostname
- $sites = array(
- 'wiki' => new Site( 'wiki', 'w', 'wikipedia.org' ),
- 'wiktionary' => new Site( 'wiktionary', 'wikt', 'wiktionary.org' ),
- 'wikiquote' => new Site( 'wikiquote', 'q', 'wikiquote.org' ),
- 'wikibooks' => new Site( 'wikibooks', 'b', 'wikibooks.org' ),
- 'wikinews' => new Site( 'wikinews', 'n', 'wikinews.org' ),
- 'wikisource' => new Site( 'wikisource', 's', 'wikisource.org' ),
- 'wikimedia' => new Site( 'wikimedia', 'chapter', 'wikimedia.org' ),
- 'wikiversity' => new Site( 'wikiversity', 'v', 'wikiversity.org' ),
- );
-
- # Extra interwiki links that can't be in the intermap for some reason
- $extraLinks = array(
- array( 'm', $this->urlprotocol . '//meta.wikimedia.org/wiki/$1', 1 ),
- array( 'meta', $this->urlprotocol . '//meta.wikimedia.org/wiki/$1', 1 ),
- array( 'sep11', $this->urlprotocol . '//sep11.wikipedia.org/wiki/$1', 1 ),
- );
-
- # Language aliases, usually configured as redirects to the real wiki in apache
- # Interlanguage links are made directly to the real wiki
- # Something horrible happens if you forget to list an alias here, I can't
- # remember what
- $this->languageAliases = array(
- 'zh-cn' => 'zh',
- 'zh-tw' => 'zh',
- 'dk' => 'da',
- 'nb' => 'no',
- );
-
- # Special case prefix rewrites, for the benefit of Swedish which uses s:t
- # as an abbreviation for saint
- $this->prefixRewrites = array(
- 'svwiki' => array( 's' => 'src' ),
- );
-
- # Construct a list of reserved prefixes
- $reserved = array();
- foreach ( $this->langlist as $lang ) {
- $reserved[$lang] = 1;
- }
- foreach ( $this->languageAliases as $alias => $lang ) {
- $reserved[$alias] = 1;
- }
- foreach ( $sites as $site ) {
- $reserved[$site->lateral] = 1;
- }
-
- # Extract the intermap from meta
- $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 );
- $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) );
-
- if ( !$lines || count( $lines ) < 2 ) {
- $this->error( "m:Interwiki_map not found", true );
- }
-
- # Global iterwiki map
- foreach ( $lines as $line ) {
- if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(.*?)\s*$/', $line, $matches ) ) {
- $prefix = $wgContLang->lc( $matches[1] );
- $prefix = str_replace( ' ', '_', $prefix );
-
- $url = $matches[2];
- if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia)\.org/', $url ) ) {
- if ( $this->hasOption( 'protocolrelative' ) ) {
- if ( substr( $url, 0, 5 ) == 'http:' ) {
- $url = substr( $url, 5 );
- } else if ( substr( $url, 0, 6 ) == 'https:' ) {
- $url = substr( $url, 6 );
- }
- }
- $local = 1;
- } else {
- $local = 0;
- }
-
- if ( empty( $reserved[$prefix] ) ) {
- $imap = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local );
- $this->makeLink ( $imap, "__global" );
- }
- }
- }
-
- # Exclude Wikipedia for Wikipedia
- $this->makeLink ( array ( 'iw_prefix' => 'wikipedia', 'is_url' => null ), "_wiki" );
-
- # Multilanguage sites
- foreach ( $sites as $site ) {
- $this->makeLanguageLinks ( $site, "_" . $site->suffix );
- }
-
- foreach ( $this->dblist as $db ) {
- if ( isset( $this->specials[$db] ) ) {
- # Special wiki
- # Has interwiki links and interlanguage links to wikipedia
-
- $this->makeLink( array( 'iw_prefix' => $db, 'iw_url' => "wiki" ), "__sites" );
- # Links to multilanguage sites
- foreach ( $sites as $targetSite ) {
- $this->makeLink( array( 'iw_prefix' => $targetSite->lateral,
- 'iw_url' => $targetSite->getURL( 'en', $this->urlprotocol ),
- 'iw_local' => 1 ), $db );
- }
- } else {
- # Find out which site this DB belongs to
- $site = false;
- foreach ( $sites as $candidateSite ) {
- $suffix = $candidateSite->suffix;
- if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) {
- $site = $candidateSite;
- break;
- }
- }
- $this->makeLink( array( 'iw_prefix' => $db, 'iw_url' => $site->suffix ), "__sites" );
- if ( !$site ) {
- $this->error( "Invalid database $db\n" );
- continue;
- }
- $lang = $matches[1];
-
- # Lateral links
- foreach ( $sites as $targetSite ) {
- if ( $targetSite->suffix != $site->suffix ) {
- $this->makeLink( array( 'iw_prefix' => $targetSite->lateral,
- 'iw_url' => $targetSite->getURL( $lang, $this->urlprotocol ),
- 'iw_local' => 1 ), $db );
- }
- }
-
- if ( $site->suffix == "wiki" ) {
- $this->makeLink( array( 'iw_prefix' => 'w',
- 'iw_url' => $this->urlprotocol . "//en.wikipedia.org/wiki/$1",
- 'iw_local' => 1 ), $db );
- }
-
- }
- }
- foreach ( $extraLinks as $link ) {
- $this->makeLink( $link, "__global" );
- }
- }
-
- # ------------------------------------------------------------------------------------------
-
- # Executes part of an INSERT statement, corresponding to all interlanguage links to a particular site
- function makeLanguageLinks( &$site, $source ) {
- # Actual languages with their own databases
- foreach ( $this->langlist as $targetLang ) {
- $this->makeLink( array( $targetLang, $site->getURL( $targetLang, $this->urlprotocol ), 1 ), $source );
- }
-
- # Language aliases
- foreach ( $this->languageAliases as $alias => $lang ) {
- $this->makeLink( array( $alias, $site->getURL( $lang, $this->urlprotocol ), 1 ), $source );
- }
- }
-
- function makeLink( $entry, $source ) {
- if ( isset( $this->prefixRewrites[$source] ) && isset( $this->prefixRewrites[$source][$entry[0]] ) )
- $entry[0] = $this->prefixRewrites[$source][$entry[0]];
-
- if ( !array_key_exists( "iw_prefix", $entry ) ) {
- $entry = array( "iw_prefix" => $entry[0], "iw_url" => $entry[1], "iw_local" => $entry[2] );
- }
- if ( array_key_exists( $source, $this->prefixRewrites ) &&
- array_key_exists( $entry['iw_prefix'], $this->prefixRewrites[$source] ) ) {
- $entry['iw_prefix'] = $this->prefixRewrites[$source][$entry['iw_prefix']];
- }
-
- if ( $this->dbFile ) {
- $this->dbFile->set( "{$source}:{$entry['iw_prefix']}", trim( "{$entry['iw_local']} {$entry['iw_url']}" ) );
- } else {
- $this->output( "{$source}:{$entry['iw_prefix']} {$entry['iw_url']} {$entry['iw_local']}\n" );
- }
- }
-}
-
-$maintClass = "DumpInterwiki";
-require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/dumpLinks.php b/maintenance/dumpLinks.php
index 39a9e955..0101dc8d 100644
--- a/maintenance/dumpLinks.php
+++ b/maintenance/dumpLinks.php
@@ -26,7 +26,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
- * @ingroup Mainatenance
+ * @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
index 4e85e64e..0fed29fc 100644
--- a/maintenance/dumpTextPass.php
+++ b/maintenance/dumpTextPass.php
@@ -2,7 +2,7 @@
/**
* Script that postprocesses XML dumps from dumpBackup.php to add page text
*
- * Copyright © 2005 Brion Vibber <brion@pobox.com>, 2010 Alexandre Emsenhuber
+ * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
*
* This program is free software; you can redistribute it and/or modify
@@ -66,6 +66,11 @@ class TextPassDumper extends BackupDumper {
var $checkpointJustWritten = false;
var $checkpointFiles = array();
+ /**
+ * @var DatabaseBase
+ */
+ protected $db;
+
function initProgress( $history ) {
parent::initProgress();
$this->timeOfCheckpoint = $this->startTime;
@@ -169,7 +174,8 @@ class TextPassDumper extends BackupDumper {
*/
function showReport() {
if ( !$this->prefetch ) {
- return parent::showReport();
+ parent::showReport();
+ return;
}
if ( $this->reporting ) {
@@ -186,8 +192,7 @@ class TextPassDumper extends BackupDumper {
$etats = wfTimestamp( TS_DB, intval( $eta ) );
if ( $this->fetchCount ) {
$fetchRate = 100.0 * $this->prefetchCount / $this->fetchCount;
- }
- else {
+ } else {
$fetchRate = '-';
}
$pageRate = $this->pageCount / $deltaAll;
@@ -201,8 +206,7 @@ class TextPassDumper extends BackupDumper {
if ( $deltaPart ) {
if ( $this->fetchCountLast ) {
$fetchRatePart = 100.0 * $this->prefetchCountLast / $this->fetchCountLast;
- }
- else {
+ } else {
$fetchRatePart = '-';
}
$pageRatePart = $this->pageCountPart / $deltaPart;
@@ -228,9 +232,9 @@ class TextPassDumper extends BackupDumper {
function checkIfTimeExceeded() {
if ( $this->maxTimeAllowed && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed ) ) {
- return True;
+ return true;
}
- return False;
+ return false;
}
function finalOptionCheck() {
@@ -286,7 +290,7 @@ class TextPassDumper extends BackupDumper {
// we wrote some stuff after last checkpoint that needs renamed
if (file_exists($filenameList[0])) {
$newFilenames = array();
- # we might have just written the header and footer and had no
+ # we might have just written the header and footer and had no
# pages or revisions written... perhaps they were all deleted
# there's no pageID 0 so we use that. the caller is responsible
# for deciding what to do with a file containing only the
@@ -332,7 +336,6 @@ class TextPassDumper extends BackupDumper {
}
private function doGetText( $id ) {
-
$id = intval( $id );
$this->failures = 0;
$ex = new MWException( "Graceful storage failure" );
@@ -345,9 +348,9 @@ class TextPassDumper extends BackupDumper {
$this->closeSpawn();
$this->openSpawn();
}
- $text = $this->getTextSpawned( $id );
+ $text = $this->getTextSpawned( $id );
} else {
- $text = $this->getTextDbSafe( $id );
+ $text = $this->getTextDbSafe( $id );
}
if ( $text === false ) {
$this->failures++;
@@ -359,11 +362,10 @@ class TextPassDumper extends BackupDumper {
$this->failedTextRetrievals++;
if ($this->failedTextRetrievals > $this->maxConsecutiveFailedTextRetrievals) {
throw $ex;
- }
- else {
+ } else {
// would be nice to return something better to the caller someday,
// log what we know about the failure and about the revision
- return("");
+ return "";
}
} else {
$this->progress( "Error $this->failures " .
@@ -373,16 +375,18 @@ class TextPassDumper extends BackupDumper {
}
} else {
$this->failedTextRetrievals= 0;
- return( $text );
+ return $text;
}
}
-
+ return '';
}
/**
* Fetch a text revision from the database, retrying in case of failure.
* This may survive some transitory errors by reconnecting, but
* may not survive a long-term server outage.
+ *
+ * FIXME: WTF? Why is it using a loop and then returning unconditionally?
*/
private function getTextDbSafe( $id ) {
while ( true ) {
@@ -397,6 +401,8 @@ class TextPassDumper extends BackupDumper {
/**
* May throw a database error if, say, the server dies during query.
+ * @param $id
+ * @return bool|string
*/
private function getTextDb( $id ) {
global $wgContLang;
@@ -584,15 +590,15 @@ class TextPassDumper extends BackupDumper {
$this->egress->writeClosePage( $this->buffer );
// nasty hack, we can't just write the chardata after the
// page tag, it will include leading blanks from the next line
- $this->egress->sink->write("\n");
-
+ $this->egress->sink->write("\n");
+
$this->buffer = $this->xmlwriterobj->closeStream();
$this->egress->writeCloseStream( $this->buffer );
$this->buffer = "";
$this->thisPage = "";
// this could be more than one file if we had more than one output arg
- $checkpointFilenames = array();
+
$filenameList = (array)$this->egress->getFilenames();
$newFilenames = array();
$firstPageID = str_pad($this->firstPageWritten,9,"0",STR_PAD_LEFT);
@@ -669,10 +675,10 @@ Options:
pressure on the database.
(Requires the XMLReader extension)
--maxtime=<minutes> Write out checkpoint file after this many minutes (writing
- out complete page, closing xml file properly, and opening new one
+ out complete page, closing xml file properly, and opening new one
with header). This option requires the checkpointfile option.
--checkpointfile=<filenamepattern> Use this string for checkpoint filenames,
- substituting first pageid written for the first %s (required) and the
+ substituting first pageid written for the first %s (required) and the
last pageid written for the second %s if it exists.
--quiet Don't dump status reports to stderr.
--report=n Report position and speed after every n pages processed.
@@ -684,3 +690,5 @@ Options:
ENDS
);
}
+
+
diff --git a/maintenance/edit.php b/maintenance/edit.php
index fb462a40..88573714 100644
--- a/maintenance/edit.php
+++ b/maintenance/edit.php
@@ -58,14 +58,14 @@ class EditCLI extends Maintenance {
$this->error( "Invalid title", true );
}
- $article = new Article( $wgTitle );
+ $page = WikiPage::factory( $wgTitle );
# Read the text
$text = $this->getStdin( Maintenance::STDIN_ALL );
# Do the edit
$this->output( "Saving... " );
- $status = $article->doEdit( $text, $summary,
+ $status = $page->doEdit( $text, $summary,
( $minor ? EDIT_MINOR : 0 ) |
( $bot ? EDIT_FORCE_BOT : 0 ) |
( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
diff --git a/maintenance/eval.php b/maintenance/eval.php
index 1502ad3e..3bd164fd 100644
--- a/maintenance/eval.php
+++ b/maintenance/eval.php
@@ -31,12 +31,10 @@
* @ingroup Maintenance
*/
-$wgUseNormalUser = (bool)getenv( 'MW_WIKIUSER' );
-
$optionsWithArgs = array( 'd' );
/** */
-require_once( "commandLine.inc" );
+require_once( dirname( __FILE__ ) . "/commandLine.inc" );
if ( isset( $options['d'] ) ) {
$d = $options['d'];
@@ -57,13 +55,8 @@ if ( isset( $options['d'] ) ) {
}
}
-if ( function_exists( 'readline_add_history' )
- && Maintenance::posix_isatty( 0 /*STDIN*/ ) )
-{
- $useReadline = true;
-} else {
- $useReadline = false;
-}
+$useReadline = function_exists( 'readline_add_history' )
+ && Maintenance::posix_isatty( 0 /*STDIN*/ );
if ( $useReadline ) {
$historyFile = isset( $_ENV['HOME'] ) ?
diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php
index 067ffe45..3b43bcd5 100644
--- a/maintenance/fetchText.php
+++ b/maintenance/fetchText.php
@@ -29,7 +29,7 @@ class FetchText extends Maintenance {
$this->mDescription = "Fetch the revision text from an old_id";
}
- /*
+ /**
* returns a string containing the following in order:
* textid
* \n
diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php
index 5996fd3a..cb582857 100644
--- a/maintenance/findHooks.php
+++ b/maintenance/findHooks.php
@@ -12,7 +12,7 @@
*
* Any instance of wfRunHooks that doesn't meet these parameters will be noted.
*
- * Copyright © Ashar Voultoiz
+ * Copyright © Antoine Musso
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
*
* @file
* @ingroup Maintenance
- * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Antoine Musso <hashar at free dot fr>
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
@@ -59,6 +59,7 @@ class FindHooks extends Maintenance {
$IP . '/includes/actions/',
$IP . '/includes/api/',
$IP . '/includes/cache/',
+ $IP . '/includes/context/',
$IP . '/includes/db/',
$IP . '/includes/diff/',
$IP . '/includes/filerepo/',
@@ -106,6 +107,29 @@ class FindHooks extends Maintenance {
*/
private function getHooksFromDoc( $doc ) {
if ( $this->hasOption( 'online' ) ) {
+ return $this->getHooksFromOnlineDoc( );
+ } else {
+ return $this->getHooksFromLocalDoc( $doc );
+ }
+ }
+
+ /**
+ * Get hooks from a local file (for example docs/hooks.txt)
+ * @param $doc string: filename to look in
+ * @return array of documented hooks
+ */
+ private function getHooksFromLocalDoc( $doc ) {
+ $m = array();
+ $content = file_get_contents( $doc );
+ preg_match_all( "/\n'(.*?)'/", $content, $m );
+ return array_unique( $m[1] );
+ }
+
+ /**
+ * Get hooks from www.mediawiki.org using the API
+ * @return array of documented hooks
+ */
+ private function getHooksFromOnlineDoc( ) {
// All hooks
$allhookdata = Http::get( 'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php' );
$allhookdata = unserialize( $allhookdata );
@@ -129,12 +153,6 @@ class FindHooks extends Maintenance {
}
}
return array_diff( $allhooks, $removed );
- } else {
- $m = array();
- $content = file_get_contents( $doc );
- preg_match_all( "/\n'(.*?)'/", $content, $m );
- return array_unique( $m[1] );
- }
}
/**
diff --git a/maintenance/fixExtLinksProtocolRelative.php b/maintenance/fixExtLinksProtocolRelative.php
index 1a7025ad..0cabe816 100644
--- a/maintenance/fixExtLinksProtocolRelative.php
+++ b/maintenance/fixExtLinksProtocolRelative.php
@@ -37,7 +37,7 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
protected function updateSkippedMessage() {
return 'protocol-relative URLs in externallinks table already fixed.';
}
-
+
protected function doDBUpdates() {
$db = wfGetDB( DB_MASTER );
if ( !$db->tableExists( 'externallinks' ) ) {
@@ -53,7 +53,7 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
foreach ( $res as $row ) {
$count++;
if ( $count % 100 == 0 ) {
- $this->output( $count );
+ $this->output( $count . "\n" );
wfWaitForSlaves();
}
$db->insert( 'externallinks',
diff --git a/maintenance/formatInstallDoc.php b/maintenance/formatInstallDoc.php
index 9acc16a7..b3bb50ca 100644
--- a/maintenance/formatInstallDoc.php
+++ b/maintenance/formatInstallDoc.php
@@ -1,4 +1,7 @@
<?php
+/**
+ * @ingroup Maintenance
+ */
require_once( dirname( __FILE__ ) .'/Maintenance.php' );
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php
index 18af4de4..d87d6281 100644
--- a/maintenance/fuzz-tester.php
+++ b/maintenance/fuzz-tester.php
@@ -108,7 +108,6 @@ Wiki configuration for testing:
$wgGroupPermissions['*']['reupload-shared'] = true;
$wgGroupPermissions['*']['rollback'] = true;
$wgGroupPermissions['*']['siteadmin'] = true;
- $wgGroupPermissions['*']['trackback'] = true;
$wgGroupPermissions['*']['unwatchedpages'] = true;
$wgGroupPermissions['*']['upload'] = true;
$wgGroupPermissions['*']['userrights'] = true;
@@ -121,7 +120,6 @@ Wiki configuration for testing:
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.
- //$wgUseTrackbacks = true; // enable trackbacks; However this breaks the viewPageTest, so currently disabled.
$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).
$wgShowExceptionDetails = true; // want backtraces.
@@ -139,11 +137,7 @@ Wiki configuration for testing:
// Install & enable Special Page extensions to increase code coverage. E.g.:
require_once("extensions/Cite/SpecialCite.php");
- require_once("extensions/Filepath/SpecialFilepath.php");
- require_once("extensions/Makebot/Makebot.php");
- require_once("extensions/Makesysop/SpecialMakesysop.php");
require_once("extensions/Renameuser/SpecialRenameuser.php");
- require_once("extensions/LinkSearch/LinkSearch.php");
// --------- End ---------
If you want to try E_STRICT error logging, add this to the above:
@@ -763,14 +757,18 @@ class wikiFuzz {
static private $maxparams = 10;
/**
- ** Returns random number between finish and start.
+ * Returns random number between finish and start.
+ * @param $finish
+ * @param $start int
+ * @return int
*/
static public function randnum( $finish, $start = 0 ) {
return mt_rand( $start, $finish );
}
/**
- ** Returns a mix of random text and random wiki syntax.
+ * Returns a mix of random text and random wiki syntax.
+ * @return string
*/
static private function randstring() {
$thestring = "";
@@ -800,18 +798,17 @@ class wikiFuzz {
}
/**
- ** Returns either random text, or random wiki syntax, or random data from "ints",
- ** or random data from "other".
+ * Returns either random text, or random wiki syntax, or random data from "ints",
+ * or random data from "other".
+ * @return string
*/
static private function makestring() {
$what = wikiFuzz::randnum( 2 );
if ( $what == 0 ) {
return wikiFuzz::randstring();
- }
- elseif ( $what == 1 ) {
+ } elseif ( $what == 1 ) {
return wikiFuzz::$ints[wikiFuzz::randnum( count( wikiFuzz::$ints ) - 1 )];
- }
- else {
+ } else {
return wikiFuzz::$other[wikiFuzz::randnum( count( wikiFuzz::$other ) - 1 )];
}
}
@@ -819,6 +816,8 @@ class wikiFuzz {
/**
* Returns the matched character slash-escaped as in a C string
* Helper for makeTitleSafe callback
+ * @param $matches
+ * @return atring
*/
static private function stringEscape( $matches ) {
return sprintf( "\\x%02x", ord( $matches[1] ) );
@@ -827,6 +826,8 @@ class wikiFuzz {
/**
** Strips out the stuff that Mediawiki balks at in a page's title.
** Implementation copied/pasted from cleanupTable.inc & cleanupImages.php
+ * @param $str string
+ * @return string
*/
static public function makeTitleSafe( $str ) {
$legalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF";
@@ -837,6 +838,7 @@ class wikiFuzz {
/**
** Returns a string of fuzz text.
+ * @return string
*/
static private function loop() {
switch ( wikiFuzz::randnum( 3 ) ) {
@@ -864,7 +866,8 @@ class wikiFuzz {
}
/**
- ** Returns one of the three styles of random quote: ', ", and nothing.
+ * Returns one of the three styles of random quote: ', ", and nothing.
+ * @return string
*/
static private function getRandQuote() {
switch ( wikiFuzz::randnum( 3 ) ) {
@@ -876,6 +879,8 @@ class wikiFuzz {
/**
** Returns fuzz text, with the parameter indicating approximately how many lines of text you want.
+ * @param $maxtypes int
+ * @return string
*/
static public function makeFuzz( $maxtypes = 2 ) {
$page = "";
@@ -1812,32 +1817,6 @@ class thumbTest extends pageTest {
}
}
-
-/**
- ** a test for trackback.php
- */
-class trackbackTest extends pageTest {
- function __construct() {
- $this->pagePath = "trackback.php";
-
- $this->params = array (
- "url" => wikiFuzz::makeFuzz( 2 ),
- "blog_name" => wikiFuzz::chooseInput( array( "80", wikiFuzz::randnum( 6000, -200 ), wikiFuzz::makeFuzz( 2 ) ) ),
- "article" => wikiFuzz::chooseInput( array( "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
- "title" => wikiFuzz::chooseInput( array( "Main Page", wikiFuzz::makeFuzz( 2 ) ) ),
- "excerpt" => wikiFuzz::makeFuzz( 2 ),
- );
-
- // sometimes we don't want to specify certain parameters.
- if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["title"] );
- if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["excerpt"] );
-
- // page does not produce HTML.
- $this->tidyValidate = false;
- }
-}
-
-
/**
** a test for profileinfo.php
*/
@@ -1892,52 +1871,6 @@ class specialFilepathPageTest extends pageTest {
/**
- ** a test for Special:Makebot (extension Special page).
- */
-class specialMakebot extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Makebot";
-
- $this->params = array (
- "username" => wikiFuzz::chooseInput( array( "Nickj2", "192.168.0.2", wikiFuzz::makeFuzz( 1 ) ) ),
- "dosearch" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
- "grant" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
- "comment" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
- "token" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
- );
-
- // sometimes we don't want to specify certain parameters.
- if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["dosearch"] );
- if ( wikiFuzz::randnum( 2 ) == 0 ) unset( $this->params["grant"] );
- if ( wikiFuzz::randnum( 5 ) == 0 ) unset( $this->params["token"] );
- }
-}
-
-
-/**
- ** a test for Special:Makesysop (extension Special page).
- */
-class specialMakesysop extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Makesysop";
-
- $this->params = array (
- "wpMakesysopUser" => wikiFuzz::chooseInput( array( "Nickj2", "192.168.0.2", wikiFuzz::makeFuzz( 1 ) ) ),
- "action" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
- "wpMakesysopSubmit" => wikiFuzz::chooseInput( array( "0", "1", "++--34234", wikiFuzz::makeFuzz( 2 ) ) ),
- "wpEditToken" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
- "wpSetBureaucrat" => wikiFuzz::chooseInput( array( "20398702394", "", wikiFuzz::makeFuzz( 2 ) ) ),
- );
-
- // sometimes we don't want to specify certain parameters.
- if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpMakesysopSubmit"] );
- if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpEditToken"] );
- if ( wikiFuzz::randnum( 3 ) == 0 ) unset( $this->params["wpSetBureaucrat"] );
- }
-}
-
-
-/**
** a test for Special:Renameuser (extension Special page).
*/
class specialRenameuserPageTest extends pageTest {
@@ -2224,9 +2157,10 @@ 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
*/
function selectPageTest( $count ) {
@@ -2275,17 +2209,14 @@ function selectPageTest( $count ) {
case 33: return new specialRevisionDeletePageTest();
case 34: return new specialImportPageTest();
case 35: return new thumbTest();
- case 36: return new trackbackTest();
case 37: return new profileInfo();
case 38: return new specialCitePageTest();
case 39: return new specialFilepathPageTest();
- case 40: return new specialMakebot();
- case 41: return new specialMakesysop();
- case 42: return new specialRenameuserPageTest();
- case 43: return new specialLinksearch();
- case 44: return new specialCategoryTree();
- case 45: return new api();
- case 45: return new specialChemicalsourcesTest();
+ case 40: return new specialRenameuserPageTest();
+ case 41: return new specialLinksearch();
+ case 42: return new specialCategoryTree();
+ case 43: return new api();
+ case 44: return new specialChemicalsourcesTest();
default: return new editPageTest();
}
}
@@ -2300,11 +2231,12 @@ function saveFile( $data, $name ) {
file_put_contents( $name, $data );
}
-
/**
** Returns a test as an experimental GET-to-POST URL.
** This doesn't seem to always work though, and sometimes the output is too long
** to be a valid GET URL, so we also save in other formats.
+ * @param $test pageTest
+ * @return string
*/
function getAsURL( pageTest $test ) {
$used_question_mark = ( strpos( $test->getPagePath(), "?" ) !== false );
@@ -2356,11 +2288,12 @@ function saveTestAsPHP( pageTest $test, $filename ) {
saveFile( $str, $filename );
}
-
/**
- ** Escapes a value so that it can be used on the command line by Curl.
- ** Specifically, "<" and "@" need to be escaped if they are the first character,
- ** otherwise curl interprets these as meaning that we want to insert a file.
+ * Escapes a value so that it can be used on the command line by Curl.
+ * Specifically, "<" and "@" need to be escaped if they are the first character,
+ * otherwise curl interprets these as meaning that we want to insert a file.
+ * @param $input_params array
+ * @return array
*/
function escapeForCurl( array $input_params ) {
$output_params = array();
@@ -2411,18 +2344,21 @@ function saveTest( pageTest $test, $testname ) {
saveTestData ( $test, $base_name . DATA_FILE );
}
-
// ////////////////// MEDIAWIKI OUTPUT /////////////////////////
/**
- ** Asks MediaWiki for the HTML output of a test.
+ * Asks MediaWiki for the HTML output of a test.
+ * @param $test pageTest
+ * @return string
*/
function wikiTestOutput( pageTest $test ) {
$ch = curl_init();
// specify the cookie, if required.
- if ( $test->getCookie() ) curl_setopt( $ch, CURLOPT_COOKIE, $test->getCookie() );
+ if ( $test->getCookie() ) {
+ curl_setopt( $ch, CURLOPT_COOKIE, $test->getCookie() );
+ }
curl_setopt( $ch, CURLOPT_POST, 1 ); // save form using a POST
$params = escapeForCurl( $test->getParams() );
@@ -2447,8 +2383,10 @@ function wikiTestOutput( pageTest $test ) {
// ////////////////// HTML VALIDATION /////////////////////////
-/*
- ** Asks the validator whether this is valid HTML, or not.
+/**
+ * Asks the validator whether this is valid HTML, or not.
+ * @param $text string
+ * @return array
*/
function validateHTML( $text ) {
@@ -2477,9 +2415,10 @@ function validateHTML( $text ) {
return array( $valid, $result );
}
-
/**
- ** Get tidy to check for no HTML errors in the output file (e.g. unescaped strings).
+ * Get tidy to check for no HTML errors in the output file (e.g. unescaped strings).
+ * @param $name
+ * @return bool
*/
function tidyCheckFile( $name ) {
$file = DIRECTORY . "/" . $name;
@@ -2498,10 +2437,10 @@ function tidyCheckFile( $name ) {
}
}
-
/**
** Returns whether or not an database error log file has changed in size since
** the last time this was run. This is used to tell if a test caused a DB error.
+ * @return bool
*/
function dbErrorLogged() {
static $filesize;
@@ -2529,8 +2468,12 @@ function dbErrorLogged() {
// //////////////// TOP-LEVEL PROBLEM-FINDING FUNCTION ////////////////////////
/**
- ** takes a page test, and runs it and tests it for problems in the output.
- ** Returns: False on finding a problem, or True on no problems being found.
+ * takes a page test, and runs it and tests it for problems in the output.
+ * Returns: False on finding a problem, or True on no problems being found.
+ * @param $test pageTest
+ * @param $testname
+ * @param $can_overwrite bool
+ * @return bool
*/
function runWikiTest( pageTest $test, &$testname, $can_overwrite = false ) {
diff --git a/maintenance/gearman/gearman.inc b/maintenance/gearman/gearman.inc
deleted file mode 100644
index 15f80e62..00000000
--- a/maintenance/gearman/gearman.inc
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-require( 'Net/Gearman/Client.php' );
-require( 'Net/Gearman/Worker.php' );
-
-class MWGearmanJob extends Net_Gearman_Job_Common {
- function switchWiki( $wiki, $params ) {
- echo "Switching to $wiki\n";
-
- # Pretend that we have completed it right now, because the new process won't do it
- $this->complete( array( 'result' => true ) );
- socket_close( $this->conn );
-
- # Close some more sockets
- LBFactory::destroyInstance();
- global $wgMemc;
- $wgMemc->disconnect_all();
-
- # Find PHP
- $php = readlink( '/proc/' . posix_getpid() . '/exe' );
-
- # Run the worker script
- $args = array( $_SERVER['PHP_SELF'],
- '--wiki', $wiki,
- '--fake-job', serialize( $params ) );
- $args = array_merge( $args, $GLOBALS['args'] );
- pcntl_exec( $php, $args, $_ENV );
- echo "Error running exec\n";
- }
-
- function run( $params ) {
- if ( wfWikiID() !== $params['wiki'] ) {
- $this->switchWiki( $params['wiki'], $params );
- }
- return self::runNoSwitch( $params );
- }
-
- static function runNoSwitch( $params ) {
- echo implode( ' ', $params ) . "\n";
- $title = Title::newFromText( $params['title'] );
- $mwJob = Job::factory( $params['command'], $title, $params['params'] );
- return $mwJob->run();
- }
-}
-
-class NonScaryGearmanWorker extends Net_Gearman_Worker {
-
- /**
- * Copied from Net_Gearman_Worker but with the scary "run any PHP file in
- * the filesystem" feature removed.
- */
- protected function doWork($socket) {
- Net_Gearman_Connection::send($socket, 'grab_job');
-
- $resp = array('function' => 'noop');
- while (count($resp) && $resp['function'] == 'noop') {
- $resp = Net_Gearman_Connection::blockingRead($socket);
- }
-
- if (in_array($resp['function'], array('noop', 'no_job'))) {
- return false;
- }
-
- if ($resp['function'] != 'job_assign') {
- throw new Net_Gearman_Exception('Holy Cow! What are you doing?!');
- }
-
- $name = $resp['data']['func'];
- $handle = $resp['data']['handle'];
- $arg = array();
-
- if (isset($resp['data']['arg']) &&
- Net_Gearman_Connection::stringLength($resp['data']['arg'])) {
- $arg = json_decode($resp['data']['arg'], true);
- }
-
- ### START MW DIFFERENT BIT
- if ( $name != 'mw_job' ) {
- throw new Net_Gearman_Job_Exception('Invalid function');
- }
- $job = new MWGearmanJob($socket, $handle);
- ### END MW DIFFERENT BIT
-
- try {
- $this->start($handle, $name, $arg);
- $res = $job->run($arg);
- if (!is_array($res)) {
- $res = array('result' => $res);
- }
-
- $job->complete($res);
- $this->complete($handle, $name, $res);
- } catch (Net_Gearman_Job_Exception $e) {
- $job->fail();
- $this->fail($handle, $name, $e);
- }
-
- // Force the job's destructor to run
- $job = null;
-
- return true;
- }
-}
-
diff --git a/maintenance/gearman/gearmanRefreshLinks.php b/maintenance/gearman/gearmanRefreshLinks.php
deleted file mode 100644
index 730db96b..00000000
--- a/maintenance/gearman/gearmanRefreshLinks.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-$optionsWithArgs = array( 'fake-job' );
-
-require( dirname( __FILE__ ) . '/../commandLine.inc' );
-require( dirname( __FILE__ ) . '/gearman.inc' );
-
-if ( !$args ) {
- $args = array( 'localhost' );
-}
-$client = new Net_Gearman_Client( $args );
-$batchSize = 1000;
-
-$dbr = wfGetDB( DB_SLAVE );
-$startId = 0;
-$endId = $dbr->selectField( 'page', 'MAX(page_id)', false, __METHOD__ );
-while ( true ) {
- $res = $dbr->select(
- 'page',
- array( 'page_namespace', 'page_title', 'page_id' ),
- array( 'page_id > ' . intval( $startId ) ),
- __METHOD__,
- array( 'LIMIT' => $batchSize )
- );
-
- if ( $res->numRows() == 0 ) {
- break;
- }
- $set = new Net_Gearman_Set;
- foreach ( $res as $row ) {
- $startId = $row->page_id;
- $title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $params = array(
- 'wiki' => wfWikiID(),
- 'title' => $title->getPrefixedDBkey(),
- 'command' => 'refreshLinks',
- 'params' => false,
- );
- $task = new Net_Gearman_Task( 'mw_job', $params );
- $set->addTask( $task );
- }
- $client->runSet( $set );
- print "$startId / $endId\n";
-}
-
diff --git a/maintenance/gearman/gearmanWorker.php b/maintenance/gearman/gearmanWorker.php
deleted file mode 100644
index 3ea10081..00000000
--- a/maintenance/gearman/gearmanWorker.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-$optionsWithArgs = array( 'fake-job', 'procs' );
-require( dirname( __FILE__ ) . '/../commandLine.inc' );
-require( dirname( __FILE__ ) . '/gearman.inc' );
-
-ini_set( 'memory_limit', '150M' );
-
-if ( isset( $options['procs'] ) ) {
- $procs = $options['procs'];
- if ( $procs < 1 || $procs > 1000 ) {
- echo "Invalid number of processes, please specify a number between 1 and 1000\n";
- exit( 1 );
- }
- $fc = new ForkController( $procs, ForkController::RESTART_ON_ERROR );
- if ( $fc->start() != 'child' ) {
- exit( 0 );
- }
-}
-
-if ( !$args ) {
- $args = array( 'localhost' );
-}
-
-if ( isset( $options['fake-job'] ) ) {
- $params = unserialize( $options['fake-job'] );
- MWGearmanJob::runNoSwitch( $params );
-}
-
-$worker = new NonScaryGearmanWorker( $args );
-$worker->addAbility( 'mw_job' );
-$worker->beginWork( 'wfGearmanMonitor' );
-
-function wfGearmanMonitor( $idle, $lastJob ) {
- static $lastSleep = 0;
- $interval = 5;
- $now = time();
- if ( $now - $lastSleep >= $interval ) {
- wfWaitForSlaves();
- $lastSleep = $now;
- }
- return false;
-}
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index 403e5a24..80d31f97 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -162,6 +162,8 @@ class GenerateSitemap extends Maintenance {
}
private function setNamespacePriorities() {
+ global $wgSitemapNamespacesPriorities;
+
// Custom main namespaces
$this->priorities[self::GS_MAIN] = '0.5';
// Custom talk namesspaces
@@ -183,10 +185,28 @@ class GenerateSitemap extends Maintenance {
$this->priorities[NS_HELP_TALK] = '0.1';
$this->priorities[NS_CATEGORY] = '0.5';
$this->priorities[NS_CATEGORY_TALK] = '0.1';
+
+ // Custom priorities
+ if ( $wgSitemapNamespacesPriorities !== false ) {
+ /**
+ * @var $wgSitemapNamespacesPriorities array
+ */
+ foreach ( $wgSitemapNamespacesPriorities as $namespace => $priority ) {
+ $float = floatval( $priority );
+ if ( $float > 1.0 ) {
+ $priority = '1.0';
+ } elseif ( $float < 0.0 ) {
+ $priority = '0.0';
+ }
+ $this->priorities[$namespace] = $priority;
+ }
+ }
}
/**
* Create directory if it does not exist and return pathname with a trailing slash
+ * @param $fspath string
+ * @return null|string
*/
private static function init_path( $fspath ) {
if ( !isset( $fspath ) ) {
@@ -194,7 +214,7 @@ class GenerateSitemap extends Maintenance {
}
# Create directory if needed
if ( $fspath && !is_dir( $fspath ) ) {
- wfMkdirParents( $fspath ) or die( "Can not create directory $fspath.\n" );
+ wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
}
return realpath( $fspath ) . DIRECTORY_SEPARATOR ;
@@ -327,13 +347,20 @@ class GenerateSitemap extends Maintenance {
* @return Resource
*/
function open( $file, $flags ) {
- return $this->compress ? gzopen( $file, $flags ) : fopen( $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?" );
+ }
+ return $resource;
}
/**
* gzwrite() / fwrite() wrapper
*/
function write( &$handle, $str ) {
+ if( $handle === true || $handle === false ) {
+ wfDebugDieBacktrace( __METHOD__ . " was passed a boolean as a file handle.\n" );
+ }
if ( $this->compress )
gzwrite( $handle, $str );
else
diff --git a/maintenance/getSlaveServer.php b/maintenance/getSlaveServer.php
index a9d93f1d..3d13bc4e 100644
--- a/maintenance/getSlaveServer.php
+++ b/maintenance/getSlaveServer.php
@@ -32,15 +32,13 @@ class GetSlaveServer extends Maintenance {
global $wgAllDBsAreLocalhost;
if ( $wgAllDBsAreLocalhost ) {
$host = 'localhost';
+ } elseif ( $this->hasOption( 'group' ) ) {
+ $db = wfGetDB( DB_SLAVE, $this->getOption( 'group' ) );
+ $host = $db->getServer();
} else {
- if ( $this->hasOption( 'group' ) ) {
- $db = wfGetDB( DB_SLAVE, $this->getOption( 'group' ) );
- $host = $db->getServer();
- } else {
- $lb = wfGetLB();
- $i = $lb->getReaderIndex();
- $host = $lb->getServerName( $i );
- }
+ $lb = wfGetLB();
+ $i = $lb->getReaderIndex();
+ $host = $lb->getServerName( $i );
}
$this->output( "$host\n" );
}
diff --git a/maintenance/hiphop/extra-files b/maintenance/hiphop/extra-files
index 15f48577..f07f7c7c 100644
--- a/maintenance/hiphop/extra-files
+++ b/maintenance/hiphop/extra-files
@@ -1,5 +1,4 @@
img_auth.php
-includes/AjaxFunctions.php
includes/AutoLoader.php
includes/DefaultSettings.php
includes/Defines.php
diff --git a/maintenance/hiphop/make b/maintenance/hiphop/make
index e792e08b..2bb9951f 100644
--- a/maintenance/hiphop/make
+++ b/maintenance/hiphop/make
@@ -1,9 +1,12 @@
#!/usr/bin/hphpi -f
<?php
+define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
require( dirname( __FILE__ ) . '/../Maintenance.php' );
class MakeHipHop extends Maintenance {
+ function noConfigNeeded() {}
+
function execute() {
global $wgHipHopBuildDirectory;
diff --git a/maintenance/ibm_db2/foreignkeys.sql b/maintenance/ibm_db2/foreignkeys.sql
index 81a88eb9..4f1450d9 100644
--- a/maintenance/ibm_db2/foreignkeys.sql
+++ b/maintenance/ibm_db2/foreignkeys.sql
@@ -93,11 +93,6 @@ ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_NAME_FK FOREIGN KEY (oi_name) REFER
ALTER TABLE watchlist ADD CONSTRAINT WATCHLIST_USER_FK FOREIGN KEY (wl_user) REFERENCES user(user_id) ON DELETE CASCADE
;
--- good
--- already in MySQL schema
-ALTER TABLE trackbacks ADD CONSTRAINT TRACKBACKS_PAGE_FK FOREIGN KEY (tb_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
-- cannot contain null values
-- ALTER TABLE protected_titles ADD CONSTRAINT PROTECTED_TITLES_USER_FK FOREIGN KEY (pt_user) REFERENCES user(user_id) ON DELETE SET NULL
--;
diff --git a/maintenance/ibm_db2/tables.sql b/maintenance/ibm_db2/tables.sql
index 261a3a2b..66fc6564 100644
--- a/maintenance/ibm_db2/tables.sql
+++ b/maintenance/ibm_db2/tables.sql
@@ -1,16 +1,20 @@
--- DB2
+-- IBM DB2
-- SQL to create the initial tables for the MediaWiki database.
-- This is read and executed by the install script; you should
-- not have to run it by itself unless doing a manual install.
--- This is the IBM DB2 version.
--- For information about each table, please see the notes in maintenance/tables.sql
+
+-- Notes:
+-- * DB2 will convert all table and column names to all caps internally.
+-- * DB2 has a 32k limit on SQL filesize, so it may be necessary
+-- to split this into two files soon.
CREATE TABLE user (
-- Needs to start with 0
- user_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
- user_name VARCHAR(255) NOT NULL UNIQUE,
+ user_id BIGINT
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
+ user_name VARCHAR(255) NOT NULL UNIQUE,
user_real_name VARCHAR(255),
user_password VARCHAR(1024),
user_newpassword VARCHAR(1024),
@@ -21,225 +25,277 @@ CREATE TABLE user (
user_email_token_expires TIMESTAMP(3),
user_email_authenticated TIMESTAMP(3),
-- obsolete, replace by user_properties table
- user_options CLOB(64K) INLINE LENGTH 4096,
+ -- user_options CLOB(64K) INLINE LENGTH 4096,
user_touched TIMESTAMP(3),
user_registration TIMESTAMP(3),
user_editcount INTEGER
);
-CREATE INDEX user_email_token_idx ON user (user_email_token);
---leonsp:
+CREATE INDEX user_email_token_idx
+ ON user (user_email_token);
CREATE UNIQUE INDEX user_include_idx
- ON user(user_id)
- INCLUDE (user_name, user_real_name, user_password, user_newpassword, user_newpass_time, user_token,
- user_email, user_email_token, user_email_token_expires, user_email_authenticated,
- user_touched, user_registration, user_editcount);
+ ON user (user_id)
+ INCLUDE (user_name, user_real_name, user_password, user_newpassword,
+ user_newpass_time, user_token,
+ user_email, user_email_token, user_email_token_expires,
+ user_email_authenticated,
+ user_touched, user_registration, user_editcount);
+CREATE UNIQUE INDEX user_email
+ ON user (user_email);
+
+
-- Create a dummy user to satisfy fk contraints especially with revisions
INSERT INTO user(
-user_name, user_real_name, user_password, user_newpassword, user_newpass_time,
-user_email, user_email_authenticated, user_options, user_token, user_registration, user_editcount)
+ user_name, user_real_name, user_password, user_newpassword, user_newpass_time,
+ user_email, user_email_authenticated, user_token, user_registration, user_editcount
+)
VALUES (
-'Anonymous','', NULL, NULL, CURRENT_TIMESTAMP,
-NULL, NULL, NULL, NULL, CURRENT_timestamp, 0);
+ 'Anonymous', '', NULL, NULL, CURRENT_TIMESTAMP,
+ NULL, NULL, NULL, CURRENT_TIMESTAMP, 0
+);
+
CREATE TABLE user_groups (
ug_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE CASCADE,
- ug_group VARCHAR(255) NOT NULL
+ ug_group VARCHAR(255) NOT NULL
);
-CREATE INDEX user_groups_unique ON user_groups (ug_user, ug_group);
+CREATE INDEX user_groups_unique
+ ON user_groups (ug_user, ug_group);
+
CREATE TABLE user_newtalk (
-- registered users key
- user_id BIGINT NOT NULL DEFAULT 0,
+ user_id BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE CASCADE,
-- anonymous users key
user_ip VARCHAR(40),
user_last_timestamp TIMESTAMP(3)
);
-CREATE INDEX user_newtalk_id_idx ON user_newtalk (user_id);
-CREATE INDEX user_newtalk_ip_idx ON user_newtalk (user_ip);
---leonsp:
+CREATE INDEX user_newtalk_id_idx
+ ON user_newtalk (user_id);
+CREATE INDEX user_newtalk_ip_idx
+ ON user_newtalk (user_ip);
CREATE UNIQUE INDEX user_newtalk_include_idx
- ON user_newtalk(user_id, user_ip)
- INCLUDE (user_last_timestamp);
+ ON user_newtalk (user_id, user_ip)
+ INCLUDE (user_last_timestamp);
+
CREATE TABLE page (
- page_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- page_namespace SMALLINT NOT NULL,
- page_title VARCHAR(255) NOT NULL,
+ page_id BIGINT
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ page_namespace SMALLINT NOT NULL,
+ page_title VARCHAR(255) NOT NULL,
page_restrictions VARCHAR(1024),
- page_counter BIGINT NOT NULL DEFAULT 0,
- page_is_redirect SMALLINT NOT NULL DEFAULT 0,
- page_is_new SMALLINT NOT NULL DEFAULT 0,
+ page_counter BIGINT NOT NULL DEFAULT 0,
+ page_is_redirect SMALLINT NOT NULL DEFAULT 0,
+ page_is_new SMALLINT NOT NULL DEFAULT 0,
page_random NUMERIC(15,14) NOT NULL,
page_touched TIMESTAMP(3),
- page_latest BIGINT NOT NULL, -- FK?
- page_len BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX page_unique_name ON page (page_namespace, page_title);
-CREATE INDEX page_random_idx ON page (page_random);
-CREATE INDEX page_len_idx ON page (page_len);
---leonsp:
+ page_latest BIGINT NOT NULL, -- FK?
+ page_len BIGINT NOT NULL
+);
+CREATE UNIQUE INDEX page_unique_name
+ ON page (page_namespace, page_title);
+CREATE INDEX page_random_idx
+ ON page (page_random);
+CREATE INDEX page_len_idx
+ ON page (page_len);
CREATE UNIQUE INDEX page_id_include
- ON page (page_id)
- INCLUDE (page_namespace, page_title, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
+ ON page (page_id)
+ INCLUDE (page_namespace, page_title, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
CREATE UNIQUE INDEX page_name_include
- ON page (page_namespace, page_title)
- INCLUDE (page_id, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
+ ON page (page_namespace, page_title)
+ INCLUDE (page_id, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
+
CREATE TABLE revision (
- rev_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- rev_page BIGINT NOT NULL DEFAULT 0,
+ rev_id BIGINT
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ rev_page BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page (page_id) ON DELETE CASCADE,
- rev_text_id BIGINT, -- FK
- rev_comment VARCHAR(1024),
- rev_user BIGINT NOT NULL DEFAULT 0,
+ rev_text_id BIGINT, -- FK
+ rev_comment VARCHAR(1024),
+ rev_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE RESTRICT,
- rev_user_text VARCHAR(255) NOT NULL,
- rev_timestamp TIMESTAMP(3) NOT NULL,
- rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
- rev_deleted SMALLINT NOT NULL DEFAULT 0,
- rev_len BIGINT,
- rev_parent_id BIGINT DEFAULT NULL
-);
-CREATE UNIQUE INDEX revision_unique ON revision (rev_page, rev_id);
-CREATE INDEX rev_text_id_idx ON revision (rev_text_id);
-CREATE INDEX rev_timestamp_idx ON revision (rev_timestamp);
-CREATE INDEX rev_user_idx ON revision (rev_user);
-CREATE INDEX rev_user_text_idx ON revision (rev_user_text);
+ rev_user_text VARCHAR(255) NOT NULL,
+ rev_timestamp TIMESTAMP(3) NOT NULL,
+ rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
+ rev_deleted SMALLINT NOT NULL DEFAULT 0,
+ rev_len BIGINT,
+ rev_parent_id BIGINT DEFAULT NULL,
+ rev_sha1 VARCHAR(255) NOT NULL DEFAULT ''
+);
+CREATE UNIQUE INDEX revision_unique
+ ON revision (rev_page, rev_id);
+CREATE INDEX rev_text_id_idx
+ ON revision (rev_text_id);
+CREATE INDEX rev_timestamp_idx
+ ON revision (rev_timestamp);
+CREATE INDEX rev_user_idx
+ ON revision (rev_user);
+CREATE INDEX rev_user_text_idx
+ ON revision (rev_user_text);
CREATE TABLE text ( -- replaces reserved word 'text'
- old_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ old_id INTEGER
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
old_text CLOB(16M) INLINE LENGTH 4096,
old_flags VARCHAR(1024)
);
+
CREATE TABLE page_restrictions (
- --pr_id INTEGER NOT NULL UNIQUE, --DEFAULT nextval('pr_id_val'),
- --pr_id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- pr_id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- pr_page INTEGER NOT NULL DEFAULT 0,
+ pr_id BIGINT
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ pr_page INTEGER NOT NULL DEFAULT 0,
--(used to be nullable)
-- REFERENCES page (page_id) ON DELETE CASCADE,
- pr_type VARCHAR(60) NOT NULL,
- pr_level VARCHAR(60) NOT NULL,
- pr_cascade SMALLINT NOT NULL,
+ pr_type VARCHAR(60) NOT NULL,
+ pr_level VARCHAR(60) NOT NULL,
+ pr_cascade SMALLINT NOT NULL,
pr_user INTEGER,
pr_expiry TIMESTAMP(3)
--PRIMARY KEY (pr_page, pr_type)
);
---ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page,pr_type);
-CREATE UNIQUE INDEX pr_pagetype ON page_restrictions (pr_page,pr_type);
-CREATE INDEX pr_typelevel ON page_restrictions (pr_type,pr_level);
-CREATE INDEX pr_level ON page_restrictions (pr_level);
-CREATE INDEX pr_cascade ON page_restrictions (pr_cascade);
+--ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page, pr_type);
+CREATE UNIQUE INDEX pr_pagetype
+ ON page_restrictions (pr_page, pr_type);
+CREATE INDEX pr_typelevel
+ ON page_restrictions (pr_type, pr_level);
+CREATE INDEX pr_level
+ ON page_restrictions (pr_level);
+CREATE INDEX pr_cascade
+ ON page_restrictions (pr_cascade);
+
+
CREATE TABLE page_props (
- pp_page INTEGER NOT NULL DEFAULT 0,
+ pp_page INTEGER NOT NULL DEFAULT 0,
-- REFERENCES page (page_id) ON DELETE CASCADE,
- pp_propname VARCHAR(255) NOT NULL,
- pp_value CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- PRIMARY KEY (pp_page,pp_propname)
+ pp_propname VARCHAR(255) NOT NULL,
+ pp_value CLOB(64K) INLINE LENGTH 4096 NOT NULL,
+ PRIMARY KEY (pp_page, pp_propname)
);
---ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_propname);
-CREATE INDEX page_props_propname ON page_props (pp_propname);
+CREATE INDEX page_props_propname
+ ON page_props (pp_propname);
CREATE TABLE archive (
- ar_namespace SMALLINT NOT NULL,
- ar_title VARCHAR(255) NOT NULL,
+ ar_namespace SMALLINT NOT NULL,
+ ar_title VARCHAR(255) NOT NULL,
ar_text CLOB(16M) INLINE LENGTH 4096,
ar_comment VARCHAR(1024),
ar_user BIGINT NOT NULL,
-- no foreign keys in MySQL
-- REFERENCES user(user_id) ON DELETE SET NULL,
- ar_user_text VARCHAR(255) NOT NULL,
- ar_timestamp TIMESTAMP(3) NOT NULL,
- ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
+ ar_user_text VARCHAR(255) NOT NULL,
+ ar_timestamp TIMESTAMP(3) NOT NULL,
+ ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
ar_flags VARCHAR(1024),
ar_rev_id INTEGER,
ar_text_id INTEGER,
- ar_deleted SMALLINT NOT NULL DEFAULT 0,
+ ar_deleted SMALLINT NOT NULL DEFAULT 0,
ar_len INTEGER,
ar_page_id INTEGER,
- ar_parent_id INTEGER
+ ar_parent_id INTEGER,
+ ar_sha1 VARCHAR(255) NOT NULL DEFAULT ''
);
-CREATE INDEX archive_name_title_timestamp ON archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX archive_user_text ON archive (ar_user_text);
+CREATE INDEX archive_name_title_timestamp
+ ON archive (ar_namespace, ar_title, ar_timestamp);
+CREATE INDEX archive_user_text
+ ON archive (ar_user_text);
CREATE TABLE redirect (
- rd_from BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ rd_from BIGINT NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
--REFERENCES page(page_id) ON DELETE CASCADE,
- rd_namespace SMALLINT NOT NULL DEFAULT 0,
- rd_title VARCHAR(255) NOT NULL DEFAULT '',
- rd_interwiki varchar(32),
+ rd_namespace SMALLINT NOT NULL DEFAULT 0,
+ rd_title VARCHAR(255) NOT NULL DEFAULT '',
+ rd_interwiki VARCHAR(32),
rd_fragment VARCHAR(255)
);
-CREATE INDEX redirect_ns_title ON redirect (rd_namespace,rd_title,rd_from);
+CREATE INDEX redirect_ns_title
+ ON redirect (rd_namespace, rd_title, rd_from);
CREATE TABLE pagelinks (
- pl_from BIGINT NOT NULL DEFAULT 0,
+ pl_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
- pl_namespace SMALLINT NOT NULL,
- pl_title VARCHAR(255) NOT NULL
+ pl_namespace SMALLINT NOT NULL,
+ pl_title VARCHAR(255) NOT NULL
);
-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);
+
+
CREATE TABLE templatelinks (
- tl_from BIGINT NOT NULL DEFAULT 0,
+ tl_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
tl_namespace SMALLINT NOT NULL,
- tl_title VARCHAR(255) NOT NULL
+ tl_title VARCHAR(255) NOT NULL
);
-CREATE UNIQUE INDEX templatelinks_unique ON templatelinks (tl_namespace,tl_title,tl_from);
-CREATE UNIQUE INDEX tl_from_idx ON templatelinks (tl_from,tl_namespace,tl_title);
+CREATE UNIQUE INDEX templatelinks_unique
+ ON templatelinks (tl_namespace, tl_title, tl_from);
+CREATE UNIQUE INDEX tl_from_idx
+ ON templatelinks (tl_from, tl_namespace, tl_title);
+
+
CREATE TABLE imagelinks (
- il_from BIGINT NOT NULL DEFAULT 0,
+ il_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
- il_to VARCHAR(255) NOT NULL
+ il_to VARCHAR(255) NOT NULL
);
-CREATE UNIQUE INDEX il_from_idx ON imagelinks (il_to,il_from);
-CREATE UNIQUE INDEX il_to_idx ON imagelinks (il_from,il_to);
+CREATE UNIQUE INDEX il_from_idx
+ ON imagelinks (il_to, il_from);
+CREATE UNIQUE INDEX il_to_idx
+ ON imagelinks (il_from, il_to);
+
+
CREATE TABLE categorylinks (
- cl_from BIGINT NOT NULL DEFAULT 0,
+ cl_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
- cl_to VARCHAR(255) NOT NULL,
+ cl_to VARCHAR(255) NOT NULL,
-- cl_sortkey has to be at least 86 wide
-- in order to be compatible with the old MySQL schema from MW 1.10
--cl_sortkey VARCHAR(86),
- cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL ,
- cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL ,
- cl_timestamp TIMESTAMP(3) NOT NULL,
- cl_collation VARCHAR(32) FOR BIT DATA NOT NULL ,
- cl_type VARCHAR(6) FOR BIT DATA NOT NULL
+ cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL,
+ cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL,
+ cl_timestamp TIMESTAMP(3) NOT NULL,
+ cl_collation VARCHAR(32) FOR BIT DATA NOT NULL,
+ cl_type VARCHAR(6) FOR BIT DATA NOT NULL
);
-CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to);
-CREATE INDEX cl_sortkey ON categorylinks (cl_to, cl_sortkey, cl_from);
+CREATE UNIQUE INDEX cl_from
+ ON categorylinks (cl_from, cl_to);
+CREATE INDEX cl_sortkey
+ ON categorylinks (cl_to, cl_sortkey, cl_from);
CREATE TABLE externallinks (
- el_from BIGINT NOT NULL DEFAULT 0,
+ el_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE CASCADE,
- el_to VARCHAR(1024) NOT NULL,
- el_index VARCHAR(1024) NOT NULL
+ el_to VARCHAR(1024) NOT NULL,
+ el_index VARCHAR(1024) NOT NULL
);
-CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
-CREATE INDEX externallinks_index ON externallinks (el_index);
+CREATE INDEX externallinks_from_to
+ ON externallinks (el_from, el_to);
+CREATE INDEX externallinks_index
+ ON externallinks (el_index);
+
--
@@ -247,494 +303,636 @@ CREATE INDEX externallinks_index ON externallinks (el_index);
--
CREATE TABLE external_user (
-- Foreign key to user_id
- eu_local_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ eu_local_id BIGINT NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-- Some opaque identifier provided by the external database
- eu_external_id VARCHAR(255) NOT NULL
+ eu_external_id VARCHAR(255) NOT NULL
);
CREATE UNIQUE INDEX eu_external_id_idx
- ON external_user (eu_external_id)
- INCLUDE (eu_local_id);
+ ON external_user (eu_external_id)
+ INCLUDE (eu_local_id);
CREATE UNIQUE INDEX eu_local_id_idx
- ON external_user (eu_local_id)
- INCLUDE (eu_external_id);
+ ON external_user (eu_local_id)
+ INCLUDE (eu_external_id);
CREATE TABLE langlinks (
- ll_from BIGINT NOT NULL DEFAULT 0,
+ ll_from BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page (page_id) ON DELETE CASCADE,
ll_lang VARCHAR(20),
ll_title VARCHAR(255)
);
-CREATE UNIQUE INDEX langlinks_unique ON langlinks (ll_from,ll_lang);
-CREATE INDEX langlinks_lang_title ON langlinks (ll_lang,ll_title);
+CREATE UNIQUE INDEX langlinks_unique
+ ON langlinks (ll_from, ll_lang);
+CREATE INDEX langlinks_lang_title
+ ON langlinks (ll_lang, ll_title);
+
CREATE TABLE site_stats (
- ss_row_id BIGINT NOT NULL UNIQUE,
- ss_total_views BIGINT DEFAULT 0,
- ss_total_edits BIGINT DEFAULT 0,
- ss_good_articles BIGINT DEFAULT 0,
- ss_total_pages INTEGER DEFAULT -1,
- ss_users INTEGER DEFAULT -1,
- ss_active_users INTEGER DEFAULT -1,
- ss_admins INTEGER DEFAULT -1,
- ss_images INTEGER DEFAULT 0
+ ss_row_id BIGINT NOT NULL UNIQUE,
+ ss_total_views BIGINT DEFAULT 0,
+ ss_total_edits BIGINT DEFAULT 0,
+ ss_good_articles BIGINT DEFAULT 0,
+ ss_total_pages INTEGER DEFAULT -1,
+ ss_users INTEGER DEFAULT -1,
+ ss_active_users INTEGER DEFAULT -1,
+ ss_admins INTEGER DEFAULT -1,
+ ss_images INTEGER DEFAULT 0
);
+
+
CREATE TABLE hitcounter (
- hc_id BIGINT NOT NULL
+ hc_id BIGINT NOT NULL
);
+
+
CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --DEFAULT nextval('ipblocks_ipb_id_val'),
+ ipb_id INTEGER NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
ipb_address VARCHAR(1024),
ipb_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
- ipb_by BIGINT NOT NULL DEFAULT 0,
+ ipb_by BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE CASCADE,
- ipb_by_text VARCHAR(255) NOT NULL DEFAULT '',
- ipb_reason VARCHAR(1024) NOT NULL,
- ipb_timestamp TIMESTAMP(3) NOT NULL,
- ipb_auto SMALLINT NOT NULL DEFAULT 0,
- ipb_anon_only SMALLINT NOT NULL DEFAULT 0,
- ipb_create_account SMALLINT NOT NULL DEFAULT 1,
- ipb_enable_autoblock SMALLINT NOT NULL DEFAULT 1,
- ipb_expiry TIMESTAMP(3) NOT NULL,
+ ipb_by_text VARCHAR(255) NOT NULL DEFAULT '',
+ ipb_reason VARCHAR(1024) NOT NULL,
+ ipb_timestamp TIMESTAMP(3) NOT NULL,
+ ipb_auto SMALLINT NOT NULL DEFAULT 0,
+ ipb_anon_only SMALLINT NOT NULL DEFAULT 0,
+ ipb_create_account SMALLINT NOT NULL DEFAULT 1,
+ ipb_enable_autoblock SMALLINT NOT NULL DEFAULT 1,
+ ipb_expiry TIMESTAMP(3) NOT NULL,
ipb_range_start VARCHAR(1024),
ipb_range_end VARCHAR(1024),
- ipb_deleted SMALLINT NOT NULL DEFAULT 0,
- ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0
+ ipb_deleted SMALLINT NOT NULL DEFAULT 0,
+ ipb_block_email SMALLINT NOT NULL DEFAULT 0,
+ ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0
);
-CREATE INDEX ipb_address ON ipblocks (ipb_address);
-CREATE INDEX ipb_user ON ipblocks (ipb_user);
-CREATE INDEX ipb_range ON ipblocks (ipb_range_start,ipb_range_end);
+CREATE INDEX ipb_address
+ ON ipblocks (ipb_address);
+CREATE INDEX ipb_user
+ ON ipblocks (ipb_user);
+CREATE INDEX ipb_range
+ ON ipblocks (ipb_range_start, ipb_range_end);
CREATE TABLE image (
- img_name VARCHAR(255) NOT NULL PRIMARY KEY,
- img_size BIGINT NOT NULL,
- img_width INTEGER NOT NULL,
- img_height INTEGER NOT NULL,
- img_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
+ img_name VARCHAR(255) NOT NULL
+ PRIMARY KEY,
+ img_size BIGINT NOT NULL,
+ img_width INTEGER NOT NULL,
+ img_height INTEGER NOT NULL,
+ img_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
img_bits SMALLINT,
img_media_type VARCHAR(255),
- img_major_mime VARCHAR(255) DEFAULT 'unknown',
- img_minor_mime VARCHAR(32) DEFAULT 'unknown',
- img_description VARCHAR(1024) NOT NULL DEFAULT '',
+ img_major_mime VARCHAR(255) DEFAULT 'unknown',
+ img_minor_mime VARCHAR(32) DEFAULT 'unknown',
+ img_description VARCHAR(1024) NOT NULL DEFAULT '',
img_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
- img_user_text VARCHAR(255) NOT NULL DEFAULT '',
+ img_user_text VARCHAR(255) NOT NULL DEFAULT '',
img_timestamp TIMESTAMP(3),
- img_sha1 VARCHAR(255) NOT NULL DEFAULT ''
+ img_sha1 VARCHAR(255) NOT NULL DEFAULT ''
);
-CREATE INDEX img_size_idx ON image (img_size);
-CREATE INDEX img_timestamp_idx ON image (img_timestamp);
-CREATE INDEX img_sha1 ON image (img_sha1);
+CREATE INDEX img_size_idx
+ ON image (img_size);
+CREATE INDEX img_timestamp_idx
+ ON image (img_timestamp);
+CREATE INDEX img_sha1
+ ON image (img_sha1);
+
CREATE TABLE oldimage (
- oi_name VARCHAR(255) NOT NULL DEFAULT '',
- oi_archive_name VARCHAR(255) NOT NULL,
- oi_size BIGINT NOT NULL,
- oi_width INTEGER NOT NULL,
- oi_height INTEGER NOT NULL,
- oi_bits SMALLINT NOT NULL,
+ oi_name VARCHAR(255) NOT NULL DEFAULT '',
+ oi_archive_name VARCHAR(255) NOT NULL,
+ oi_size BIGINT NOT NULL,
+ oi_width INTEGER NOT NULL,
+ oi_height INTEGER NOT NULL,
+ oi_bits SMALLINT NOT NULL,
oi_description VARCHAR(1024),
oi_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
- oi_user_text VARCHAR(255) NOT NULL,
- oi_timestamp TIMESTAMP(3) NOT NULL,
- oi_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- oi_media_type VARCHAR(255) ,
- oi_major_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
- oi_minor_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
- oi_deleted SMALLINT NOT NULL DEFAULT 0,
- oi_sha1 VARCHAR(255) NOT NULL DEFAULT ''
+ oi_user_text VARCHAR(255) NOT NULL,
+ oi_timestamp TIMESTAMP(3) NOT NULL,
+ oi_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
+ oi_media_type VARCHAR(255),
+ oi_major_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
+ oi_minor_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
+ oi_deleted SMALLINT NOT NULL DEFAULT 0,
+ oi_sha1 VARCHAR(255) NOT NULL DEFAULT ''
--FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
);
-CREATE INDEX oi_name_timestamp ON oldimage (oi_name,oi_timestamp);
-CREATE INDEX oi_name_archive_name ON oldimage (oi_name,oi_archive_name);
-CREATE INDEX oi_sha1 ON oldimage (oi_sha1);
+CREATE INDEX oi_name_timestamp
+ ON oldimage (oi_name, oi_timestamp);
+CREATE INDEX oi_name_archive_name
+ ON oldimage (oi_name, oi_archive_name);
+CREATE INDEX oi_sha1
+ ON oldimage (oi_sha1);
CREATE TABLE filearchive (
- fa_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('filearchive_fa_id_seq'),
- fa_name VARCHAR(255) NOT NULL,
+ fa_id INTEGER NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ fa_name VARCHAR(255) NOT NULL,
fa_archive_name VARCHAR(255),
fa_storage_group VARCHAR(255),
- fa_storage_key VARCHAR(64) DEFAULT '',
- fa_deleted_user BIGINT NOT NULL DEFAULT 0,
+ fa_storage_key VARCHAR(64) DEFAULT '',
+ fa_deleted_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
- fa_deleted_timestamp TIMESTAMP(3) NOT NULL,
+ fa_deleted_timestamp TIMESTAMP(3) NOT NULL,
fa_deleted_reason VARCHAR(255),
- fa_size BIGINT NOT NULL,
- fa_width INTEGER NOT NULL,
- fa_height INTEGER NOT NULL,
- fa_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
+ fa_size BIGINT NOT NULL,
+ fa_width INTEGER NOT NULL,
+ fa_height INTEGER NOT NULL,
+ fa_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
fa_bits SMALLINT,
fa_media_type VARCHAR(255),
- fa_major_mime VARCHAR(255) DEFAULT 'unknown',
- fa_minor_mime VARCHAR(255) DEFAULT 'unknown',
- fa_description VARCHAR(1024) NOT NULL,
+ fa_major_mime VARCHAR(255) DEFAULT 'unknown',
+ fa_minor_mime VARCHAR(255) DEFAULT 'unknown',
+ fa_description VARCHAR(1024) NOT NULL,
fa_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
- fa_user_text VARCHAR(255) NOT NULL,
+ fa_user_text VARCHAR(255) NOT NULL,
fa_timestamp TIMESTAMP(3),
- fa_deleted SMALLINT NOT NULL DEFAULT 0
+ fa_deleted SMALLINT NOT NULL DEFAULT 0
);
-CREATE INDEX fa_name_time ON filearchive (fa_name, fa_timestamp);
-CREATE INDEX fa_dupe ON filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX fa_notime ON filearchive (fa_deleted_timestamp);
-CREATE INDEX fa_nouser ON filearchive (fa_deleted_user);
+CREATE INDEX fa_name_time
+ ON filearchive (fa_name, fa_timestamp);
+CREATE INDEX fa_dupe
+ ON filearchive (fa_storage_group, fa_storage_key);
+CREATE INDEX fa_notime
+ ON filearchive (fa_deleted_timestamp);
+CREATE INDEX fa_nouser
+ ON filearchive (fa_deleted_user);
+
CREATE TABLE recentchanges (
- rc_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('rc_rc_id_seq'),
- rc_timestamp TIMESTAMP(3) NOT NULL,
- rc_cur_time TIMESTAMP(3) NOT NULL,
+ rc_id INTEGER NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ rc_timestamp TIMESTAMP(3) NOT NULL,
+ rc_cur_time TIMESTAMP(3) NOT NULL,
rc_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
- rc_user_text VARCHAR(255) NOT NULL,
- rc_namespace SMALLINT NOT NULL,
- rc_title VARCHAR(255) NOT NULL,
+ rc_user_text VARCHAR(255) NOT NULL,
+ rc_namespace SMALLINT NOT NULL,
+ rc_title VARCHAR(255) NOT NULL,
rc_comment VARCHAR(255),
- rc_minor SMALLINT NOT NULL DEFAULT 0,
- rc_bot SMALLINT NOT NULL DEFAULT 0,
- rc_new SMALLINT NOT NULL DEFAULT 0,
+ rc_minor SMALLINT NOT NULL DEFAULT 0,
+ rc_bot SMALLINT NOT NULL DEFAULT 0,
+ rc_new SMALLINT NOT NULL DEFAULT 0,
rc_cur_id BIGINT NOT NULL DEFAULT 0,
-- REFERENCES page(page_id) ON DELETE SET NULL,
- rc_this_oldid BIGINT NOT NULL,
- rc_last_oldid BIGINT NOT NULL,
- rc_type SMALLINT NOT NULL DEFAULT 0,
+ rc_this_oldid BIGINT NOT NULL,
+ rc_last_oldid BIGINT NOT NULL,
+ rc_type SMALLINT NOT NULL DEFAULT 0,
rc_moved_to_ns SMALLINT,
rc_moved_to_title VARCHAR(255),
- rc_patrolled SMALLINT NOT NULL DEFAULT 0,
- rc_ip VARCHAR(40), -- was CIDR type
+ rc_patrolled SMALLINT NOT NULL DEFAULT 0,
+ rc_ip VARCHAR(40), -- was CIDR type
rc_old_len INTEGER,
rc_new_len INTEGER,
- rc_deleted SMALLINT NOT NULL DEFAULT 0,
- rc_logid BIGINT NOT NULL DEFAULT 0,
+ rc_deleted SMALLINT NOT NULL DEFAULT 0,
+ rc_logid BIGINT NOT NULL DEFAULT 0,
rc_log_type VARCHAR(255),
rc_log_action VARCHAR(255),
rc_params CLOB(64K) INLINE LENGTH 4096
);
-CREATE INDEX rc_timestamp ON recentchanges (rc_timestamp);
-CREATE INDEX rc_namespace_title ON recentchanges (rc_namespace, rc_title);
-CREATE INDEX rc_cur_id ON recentchanges (rc_cur_id);
-CREATE INDEX new_name_timestamp ON recentchanges (rc_new, rc_namespace, rc_timestamp);
-CREATE INDEX rc_ip ON recentchanges (rc_ip);
+CREATE INDEX rc_timestamp
+ ON recentchanges (rc_timestamp);
+CREATE INDEX rc_namespace_title
+ ON recentchanges (rc_namespace, rc_title);
+CREATE INDEX rc_cur_id
+ ON recentchanges (rc_cur_id);
+CREATE INDEX new_name_timestamp
+ ON recentchanges (rc_new, rc_namespace, rc_timestamp);
+CREATE INDEX rc_ip
+ ON recentchanges (rc_ip);
CREATE TABLE watchlist (
- wl_user BIGINT NOT NULL DEFAULT 0,
+ wl_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE CASCADE,
- wl_namespace SMALLINT NOT NULL DEFAULT 0,
- wl_title VARCHAR(255) NOT NULL,
+ wl_namespace SMALLINT NOT NULL DEFAULT 0,
+ wl_title VARCHAR(255) NOT NULL,
wl_notificationtimestamp TIMESTAMP(3)
);
-CREATE UNIQUE INDEX wl_user_namespace_title ON watchlist (wl_namespace, wl_title, wl_user);
+CREATE UNIQUE INDEX wl_user_namespace_title
+ ON watchlist (wl_namespace, wl_title, wl_user);
+
CREATE TABLE interwiki (
- iw_prefix VARCHAR(32) NOT NULL UNIQUE,
- iw_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_wikiid varchar(64) NOT NULL,
- iw_local SMALLINT NOT NULL,
- iw_trans SMALLINT NOT NULL DEFAULT 0
+ iw_prefix VARCHAR(32) NOT NULL UNIQUE,
+ iw_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
+ iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL,
+ iw_wikiid VARCHAR(64) NOT NULL,
+ iw_local SMALLINT NOT NULL,
+ iw_trans SMALLINT NOT NULL DEFAULT 0
);
+
CREATE TABLE querycache (
- qc_type VARCHAR(255) NOT NULL,
- qc_value BIGINT NOT NULL,
- qc_namespace INTEGER NOT NULL,
- qc_title VARCHAR(255) NOT NULL
+ qc_type VARCHAR(255) NOT NULL,
+ qc_value BIGINT NOT NULL,
+ qc_namespace INTEGER NOT NULL,
+ qc_title VARCHAR(255) NOT NULL
);
-CREATE INDEX querycache_type_value ON querycache (qc_type, qc_value);
+CREATE INDEX querycache_type_value
+ ON querycache (qc_type, qc_value);
-CREATE TABLE querycache_info (
- qci_type VARCHAR(255) UNIQUE NOT NULL,
- qci_timestamp TIMESTAMP(3)
+CREATE TABLE querycache_info (
+ qci_type VARCHAR(255) UNIQUE NOT NULL,
+ qci_timestamp TIMESTAMP(3)
);
+
CREATE TABLE querycachetwo (
- qcc_type VARCHAR(255) NOT NULL,
- qcc_value BIGINT NOT NULL DEFAULT 0,
- qcc_namespace INTEGER NOT NULL DEFAULT 0,
- qcc_title VARCHAR(255) NOT NULL DEFAULT '',
- qcc_namespacetwo INTEGER NOT NULL DEFAULT 0,
- qcc_titletwo VARCHAR(255) NOT NULL DEFAULT ''
+ qcc_type VARCHAR(255) NOT NULL,
+ qcc_value BIGINT NOT NULL DEFAULT 0,
+ qcc_namespace INTEGER NOT NULL DEFAULT 0,
+ qcc_title VARCHAR(255) NOT NULL DEFAULT '',
+ qcc_namespacetwo INTEGER NOT NULL DEFAULT 0,
+ qcc_titletwo VARCHAR(255) NOT NULL DEFAULT ''
);
-CREATE INDEX querycachetwo_type_value ON querycachetwo (qcc_type, qcc_value);
-CREATE INDEX querycachetwo_title ON querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX querycachetwo_titletwo ON querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
+CREATE INDEX querycachetwo_type_value
+ ON querycachetwo (qcc_type, qcc_value);
+CREATE INDEX querycachetwo_title
+ ON querycachetwo (qcc_type, qcc_namespace, qcc_title);
+CREATE INDEX querycachetwo_titletwo
+ ON querycachetwo (qcc_type, qcc_namespacetwo, qcc_titletwo);
+
+
CREATE TABLE objectcache (
- keyname VARCHAR(255) NOT NULL UNIQUE, -- was nullable
- value CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- exptime TIMESTAMP(3) NOT NULL
+ keyname VARCHAR(255) NOT NULL UNIQUE, -- was nullable
+ value CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
+ exptime TIMESTAMP(3) NOT NULL
);
-CREATE INDEX objectcacache_exptime ON objectcache (exptime);
+CREATE INDEX objectcacache_exptime
+ ON objectcache (exptime);
CREATE TABLE transcache (
- tc_url VARCHAR(255) NOT NULL UNIQUE,
- tc_contents CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- tc_time TIMESTAMP(3) NOT NULL
+ tc_url VARCHAR(255) NOT NULL UNIQUE,
+ tc_contents CLOB(64K) INLINE LENGTH 4096 NOT NULL,
+ tc_time TIMESTAMP(3) NOT NULL
);
+
CREATE TABLE logging (
- log_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('log_log_id_seq'),
- log_type VARCHAR(32) NOT NULL,
- log_action VARCHAR(32) NOT NULL,
- log_timestamp TIMESTAMP(3) NOT NULL,
- log_user BIGINT NOT NULL DEFAULT 0,
+ log_id BIGINT NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ log_type VARCHAR(32) NOT NULL,
+ log_action VARCHAR(32) NOT NULL,
+ log_timestamp TIMESTAMP(3) NOT NULL,
+ log_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
-- Name of the user who performed this action
- log_user_text VARCHAR(255) NOT NULL default '',
- log_namespace SMALLINT NOT NULL,
- log_title VARCHAR(255) NOT NULL,
- log_page BIGINT,
- log_comment VARCHAR(255),
- log_params CLOB(64K) INLINE LENGTH 4096,
- log_deleted SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX logging_type_name ON logging (log_type, log_timestamp);
-CREATE INDEX logging_user_time ON logging (log_timestamp, log_user);
-CREATE INDEX logging_page_time ON logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX log_user_type_time ON logging (log_user, log_type, log_timestamp);
-CREATE INDEX log_page_id_time ON logging (log_page,log_timestamp);
+ log_user_text VARCHAR(255) NOT NULL DEFAULT '',
+ log_namespace SMALLINT NOT NULL,
+ log_title VARCHAR(255) NOT NULL,
+ log_page BIGINT,
+ log_comment VARCHAR(255),
+ log_params CLOB(64K) INLINE LENGTH 4096,
+ log_deleted SMALLINT NOT NULL DEFAULT 0
+);
+CREATE INDEX logging_type_name
+ ON logging (log_type, log_timestamp);
+CREATE INDEX logging_user_time
+ ON logging (log_timestamp, log_user);
+CREATE INDEX logging_page_time
+ ON logging (log_namespace, log_title, log_timestamp);
+CREATE INDEX log_user_type_time
+ ON logging (log_user, log_type, log_timestamp);
+CREATE INDEX log_page_id_time
+ ON logging (log_page, log_timestamp);
+CREATE UNIQUE INDEX type_action
+ ON logging (log_type, log_action, log_timestamp);
CREATE TABLE trackbacks (
- tb_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('trackbacks_tb_id_seq'),
+ tb_id INTEGER NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-- foreign key also in MySQL
tb_page INTEGER,
-- REFERENCES page(page_id) ON DELETE CASCADE,
- tb_title VARCHAR(255) NOT NULL,
- tb_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
+ tb_title VARCHAR(255) NOT NULL,
+ tb_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
tb_ex CLOB(64K) INLINE LENGTH 4096,
tb_name VARCHAR(255)
);
-CREATE INDEX trackback_page ON trackbacks (tb_page);
+CREATE INDEX trackback_page
+ ON trackbacks (tb_page);
CREATE TABLE job (
- job_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
- job_cmd VARCHAR(255) NOT NULL,
- job_namespace SMALLINT NOT NULL,
- job_title VARCHAR(255) NOT NULL,
- job_params CLOB(64K) INLINE LENGTH 4096 NOT NULL
+ job_id BIGINT NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ job_cmd VARCHAR(255) NOT NULL,
+ job_namespace SMALLINT NOT NULL,
+ job_title VARCHAR(255) NOT NULL,
+ job_params CLOB(64K) INLINE LENGTH 4096 NOT NULL
);
-CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
+CREATE INDEX job_cmd_namespace_title
+ ON job (job_cmd, job_namespace, job_title);
+
--TODO
---CREATE FUNCTION add_interwiki (TEXT,INT,SMALLINT) RETURNS INT LANGUAGE SQL AS
+--CREATE FUNCTION add_interwiki (TEXT, INT, SMALLINT) RETURNS INT LANGUAGE SQL AS
--$mw$
-- INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES ($1,$2,$3);
-- SELECT 1;
--$mw$;
+
+
-- hack implementation
-- should be replaced with OmniFind, Contains(), etc
CREATE TABLE searchindex (
- si_page BIGINT NOT NULL,
- si_title varchar(255) NOT NULL default '',
- si_text clob NOT NULL
+ si_page BIGINT NOT NULL,
+ si_title VARCHAR(255) NOT NULL DEFAULT '',
+ si_text CLOB NOT NULL
);
+
+
-- 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_name VARCHAR(255) NOT NULL,
- pf_server VARCHAR(255)
+ 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_name VARCHAR(255) NOT NULL,
+ pf_server VARCHAR(255)
);
-CREATE UNIQUE INDEX pf_name_server ON profiling (pf_name, pf_server);
+CREATE UNIQUE INDEX pf_name_server
+ ON profiling (pf_name, pf_server);
+
+
CREATE TABLE protected_titles (
- pt_namespace INTEGER NOT NULL,
- pt_title VARCHAR(255) NOT NULL,
+ pt_namespace INTEGER NOT NULL,
+ pt_title VARCHAR(255) NOT NULL,
pt_user BIGINT NOT NULL DEFAULT 0,
-- REFERENCES user(user_id) ON DELETE SET NULL,
pt_reason VARCHAR(1024),
pt_timestamp TIMESTAMP(3) NOT NULL,
- pt_expiry TIMESTAMP(3) ,
- pt_create_perm VARCHAR(60) NOT NULL DEFAULT ''
+ pt_expiry TIMESTAMP(3),
+ pt_create_perm VARCHAR(60) NOT NULL DEFAULT ''
);
-CREATE UNIQUE INDEX protected_titles_unique ON protected_titles(pt_namespace, pt_title);
+CREATE UNIQUE INDEX protected_titles_unique
+ ON protected_titles (pt_namespace, pt_title);
CREATE TABLE updatelog (
- ul_key VARCHAR(255) NOT NULL PRIMARY KEY
+ ul_key VARCHAR(255) NOT NULL
+ PRIMARY KEY
);
+
CREATE TABLE category (
- cat_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('category_id_seq'),
- cat_title VARCHAR(255) NOT NULL,
- cat_pages INTEGER NOT NULL DEFAULT 0,
- cat_subcats INTEGER NOT NULL DEFAULT 0,
- cat_files INTEGER NOT NULL DEFAULT 0,
- cat_hidden SMALLINT NOT NULL DEFAULT 0
+ cat_id INTEGER NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ cat_title VARCHAR(255) NOT NULL,
+ cat_pages INTEGER NOT NULL DEFAULT 0,
+ cat_subcats INTEGER NOT NULL DEFAULT 0,
+ cat_files INTEGER NOT NULL DEFAULT 0,
+ cat_hidden SMALLINT NOT NULL DEFAULT 0
);
-CREATE UNIQUE INDEX category_title ON category(cat_title);
-CREATE INDEX category_pages ON category(cat_pages);
+CREATE UNIQUE INDEX category_title
+ ON category (cat_title);
+CREATE INDEX category_pages
+ ON category (cat_pages);
+
--- added for 1.15
-- A table to track tags for revisions, logs and recent changes.
CREATE TABLE change_tag (
- ct_rc_id INTEGER,
- ct_log_id INTEGER,
- ct_rev_id INTEGER,
- ct_tag varchar(255) NOT NULL,
- ct_params CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag ON change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag (ct_rev_id,ct_tag);
+ ct_rc_id INTEGER,
+ ct_log_id INTEGER,
+ ct_rev_id INTEGER,
+ ct_tag VARCHAR(255) NOT NULL,
+ ct_params CLOB(64K) INLINE LENGTH 4096
+);
+CREATE UNIQUE INDEX change_tag_rc_tag
+ ON change_tag (ct_rc_id, ct_tag);
+CREATE UNIQUE INDEX change_tag_log_tag
+ ON change_tag (ct_log_id, ct_tag);
+CREATE UNIQUE INDEX change_tag_rev_tag
+ ON change_tag (ct_rev_id, ct_tag);
-- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id ON change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
+CREATE INDEX 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
CREATE TABLE tag_summary (
- ts_rc_id INTEGER,
+ ts_rc_id INTEGER,
ts_log_id INTEGER,
ts_rev_id INTEGER,
- ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
+ ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
);
-CREATE UNIQUE INDEX tag_summary_rc_id ON tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id ON tag_summary (ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id ON tag_summary (ts_rev_id);
+CREATE UNIQUE INDEX tag_summary_rc_id
+ ON tag_summary (ts_rc_id);
+CREATE UNIQUE INDEX tag_summary_log_id
+ ON tag_summary (ts_log_id);
+CREATE UNIQUE INDEX tag_summary_rev_id
+ ON tag_summary (ts_rev_id);
+
CREATE TABLE valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
+ vt_tag VARCHAR(255) NOT NULL
+ PRIMARY KEY
);
+
+
--
-- User preferences and perhaps other fun stuff. :)
-- Replaces the old user.user_options blob, with a couple nice properties:
--
--- 1) We only store non-default settings, so changes to the defaults
+-- 1) We only store non-default settings, so changes to the DEFAULTs
-- are now reflected for everybody, not just new accounts.
-- 2) We can more easily do bulk lookups, statistics, or modifications of
-- saved options since it's a sane table structure.
--
CREATE TABLE user_properties (
-- Foreign key to user.user_id
- up_user BIGINT NOT NULL,
-
+ up_user BIGINT NOT NULL,
-- Name of the option being saved. This is indexed for bulk lookup.
- up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-
+ up_property VARCHAR(255) FOR BIT DATA NOT NULL,
-- Property value as a string.
- up_value CLOB(64K) INLINE LENGTH 4096
+ up_value CLOB(64K) INLINE LENGTH 4096
);
-CREATE UNIQUE INDEX user_properties_user_property ON user_properties (up_user,up_property);
-CREATE INDEX user_properties_property ON user_properties (up_property);
+CREATE UNIQUE INDEX user_properties_user_property
+ ON user_properties (up_user, up_property);
+CREATE INDEX user_properties_property
+ ON user_properties (up_property);
CREATE TABLE log_search (
-- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
+ ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
-- The value of the ID
- ls_value varchar(255) NOT NULL,
+ ls_value VARCHAR(255) NOT NULL,
-- Key to log_id
- ls_log_id BIGINT NOT NULL default 0
+ ls_log_id BIGINT NOT NULL DEFAULT 0
);
-CREATE UNIQUE INDEX ls_field_val ON log_search (ls_field,ls_value,ls_log_id);
-CREATE INDEX ls_log_id ON log_search (ls_log_id);
+CREATE UNIQUE INDEX ls_field_val
+ ON log_search (ls_field, ls_value, ls_log_id);
+CREATE INDEX ls_log_id
+ ON log_search (ls_log_id);
+
+
-- Table for storing localisation data
CREATE TABLE l10n_cache (
-- Language code
- lc_lang VARCHAR(32) NOT NULL,
+ lc_lang VARCHAR(32) NOT NULL,
-- Cache key
- lc_key VARCHAR(255) NOT NULL,
+ lc_key VARCHAR(255) NOT NULL,
-- Value
- lc_value CLOB(16M) INLINE LENGTH 4096 NOT NULL
+ lc_value CLOB(16M) INLINE LENGTH 4096 NOT NULL
);
-CREATE INDEX lc_lang_key ON l10n_cache (lc_lang, lc_key);
+CREATE INDEX lc_lang_key
+ ON l10n_cache (lc_lang, lc_key);
-CREATE TABLE "MSG_RESOURCE_LINKS"
-(
-"MRL_RESOURCE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MRL_MESSAGE" VARCHAR(255) FOR BIT DATA NOT NULL
-)
-;
-CREATE UNIQUE INDEX "UQ61_MSG_RESOURCE_LINKS" ON "MSG_RESOURCE_LINKS"
+CREATE TABLE msg_resource_links
(
-"MRL_MESSAGE",
-"MRL_RESOURCE"
-)
-ALLOW REVERSE SCANS
-;
+ mrl_resource VARCHAR(255) FOR BIT DATA NOT NULL,
+ mrl_message VARCHAR(255) FOR BIT DATA NOT NULL
+);
+CREATE UNIQUE INDEX uq61_msg_resource_links
+ ON msg_resource_links (mrl_message, mrl_resource);
+-- All DB2 indexes DEFAULT to allowing reverse scans
-CREATE TABLE "MSG_RESOURCE"
-(
-"MR_RESOURCE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MR_LANG" VARCHAR(32) FOR BIT DATA NOT NULL ,
-"MR_BLOB" BLOB NOT NULL ,
-"MR_TIMESTAMP" TIMESTAMP(3) NOT NULL
-)
-;
-CREATE UNIQUE INDEX "UQ81_MSG_RESOURCE" ON "MSG_RESOURCE"
+
+CREATE TABLE msg_resource
(
-"MR_RESOURCE"
-,"MR_LANG"
-)
-ALLOW REVERSE SCANS
-;
+ mr_resource VARCHAR(255) FOR BIT DATA NOT NULL,
+ mr_lang VARCHAR(32) FOR BIT DATA NOT NULL,
+ mr_blob CLOB(64K) INLINE LENGTH 4096 NOT NULL,
+ mr_timestamp TIMESTAMP(3) NOT NULL
+);
+CREATE UNIQUE INDEX uq81_msg_resource
+ ON msg_resource (mr_resource, mr_lang);
+-- All DB2 indexes DEFAULT to allowing reverse scans
+
+
+
+CREATE TABLE module_deps (
+ md_module VARCHAR(255) FOR BIT DATA NOT NULL,
+ md_skin VARCHAR(32) FOR BIT DATA NOT NULL,
+ md_deps CLOB(16M) INLINE LENGTH 4096 NOT NULL
+);
+CREATE UNIQUE INDEX uq96_module_deps
+ ON module_deps (md_module, md_skin);
+-- All DB2 indexes DEFAULT to allowing reverse scans
-CREATE TABLE "MODULE_DEPS" (
-"MD_MODULE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MD_SKIN" VARCHAR(32) FOR BIT DATA NOT NULL ,
-"MD_DEPS" CLOB(16M) INLINE LENGTH 4096 NOT NULL
-)
-;
-CREATE UNIQUE INDEX "UQ96_MODULE_DEPS" ON "MODULE_DEPS"
-(
-"MD_MODULE"
-,"MD_SKIN"
-)
-ALLOW REVERSE SCANS
-;
-CREATE TABLE "IWLINKS"
+CREATE TABLE iwlinks
(
-"IWL_FROM" INT NOT NULL ,
-"IWL_PREFIX" VARCHAR(20) FOR BIT DATA NOT NULL ,
-"IWL_TITLE" VARCHAR(255) FOR BIT DATA NOT NULL
-)
-;
+ iwl_from INTEGER NOT NULL,
+ iwl_prefix VARCHAR(20) FOR BIT DATA NOT NULL,
+ iwl_title VARCHAR(255) FOR BIT DATA NOT NULL
+);
+
+
+
+--
+-- Store information about newly uploaded files before they're
+-- moved into the actual filestore
+--
+CREATE TABLE uploadstash (
+ us_id BIGINT NOT NULL
+ PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
+ -- the user who uploaded the file.
+ us_user BIGINT NOT NULL,
+ -- file key. this is how applications actually search for the file.
+ -- this might go away, or become the primary key.
+ us_key VARCHAR(255) NOT NULL,
+ -- the original path
+ us_orig_path VARCHAR(255) NOT NULL,
+ -- the temporary path at which the file is actually stored
+ us_path VARCHAR(255) NOT NULL,
+ -- which type of upload the file came from (sometimes)
+ us_source_type VARCHAR(50),
+ -- the date/time on which the file was added
+ us_timestamp TIMESTAMP(3) NOT NULL,
+ us_status VARCHAR(50) NOT NULL,
+ -- file properties from File::getPropsFromPath. these may prove unnecessary.
+ --
+ us_size BIGINT NOT NULL,
+ -- this hash comes from File::sha1Base36(), and is 31 characters
+ us_sha1 VARCHAR(31) NOT NULL,
+ us_mime VARCHAR(255),
+ -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
+ us_media_type VARCHAR(30)
+ CONSTRAINT my_constraint
+ CHECK (
+ us_media_type in (
+ 'UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA',
+ 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'
+ )
+ ) DEFAULT NULL,
+ -- image-specific properties
+ us_image_width BIGINT,
+ us_image_height BIGINT,
+ us_image_bits INTEGER
+);
+-- sometimes there's a delete for all of a user's stuff.
+CREATE INDEX us_user
+ ON uploadstash (us_user);
+-- pick out files by key, enforce key UNIQUEness
+CREATE UNIQUE INDEX us_key
+ ON uploadstash (us_key);
+-- the abandoned upload cleanup script needs this
+CREATE INDEX us_timestamp
+ ON uploadstash (us_timestamp);
+
+
+
+-- Stores the groups the user has once belonged to.
+-- The user may still belong these groups. Check user_groups.
+CREATE TABLE user_former_groups (
+ ufg_user BIGINT NOT NULL DEFAULT 0,
+ ufg_group VARCHAR(16) FOR BIT DATA NOT NULL
+);
+CREATE UNIQUE INDEX ufg_user_group
+ ON user_former_groups (ufg_user, ufg_group);
+
+
+
+-- Table for holding configuration changes
+CREATE TABLE config (
+ cf_name VARCHAR(255) NOT NULL
+ PRIMARY KEY,
+ cf_value CLOB(64K) INLINE LENGTH 4096 NOT NULL
+);
+
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index 099b7895..2ad0872f 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -57,12 +57,13 @@ TEXT;
$this->stderr = fopen( "php://stderr", "wt" );
$this->addOption( 'report',
'Report position and speed after every n pages processed', false, true );
- $this->addOption( 'namespaces',
+ $this->addOption( 'namespaces',
'Import only the pages from namespaces belonging to the list of ' .
'pipe-separated namespace names or namespace indexes', false, true );
$this->addOption( 'dry-run', 'Parse dump without actually importing pages' );
$this->addOption( 'debug', 'Output extra verbose debug information' );
$this->addOption( 'uploads', 'Process file upload data if included (experimental)' );
+ $this->addOption( 'no-updates', 'Disable link table updates. Is faster but leaves the wiki in an inconsistent state' );
$this->addOption( 'image-base-path', 'Import files from a specified path', false, true );
$this->addArg( 'file', 'Dump file to import [else use stdin]', false );
}
@@ -73,6 +74,10 @@ TEXT;
}
$this->reportingInterval = intval( $this->getOption( 'report', 100 ) );
+ if ( !$this->reportingInterval ) {
+ $this->reportingInterval = 100; // avoid division by zero
+ }
+
$this->dryRun = $this->hasOption( 'dry-run' );
$this->uploads = $this->hasOption( 'uploads' ); // experimental!
if ( $this->hasOption( 'image-base-path' ) ) {
@@ -112,6 +117,10 @@ TEXT;
$this->error( "Unknown namespace text / index specified: $namespace", true );
}
+ /**
+ * @param $obj Title|Revision
+ * @return bool
+ */
private function skippedNamespace( $obj ) {
if ( $obj instanceof Title ) {
$ns = $obj->getNamespace();
@@ -130,6 +139,10 @@ TEXT;
$this->pageCount++;
}
+ /**
+ * @param $rev Revision
+ * @return mixed
+ */
function handleRevision( $rev ) {
$title = $rev->getTitle();
if ( !$title ) {
@@ -149,6 +162,10 @@ TEXT;
}
}
+ /**
+ * @param $revision Revision
+ * @return bool
+ */
function handleUpload( $revision ) {
if ( $this->uploads ) {
if ( $this->skippedNamespace( $revision ) ) {
@@ -186,7 +203,7 @@ TEXT;
}
function showReport() {
- if ( $this->mQuiet ) {
+ if ( !$this->mQuiet ) {
$delta = wfTime() - $this->startTime;
if ( $delta ) {
$rate = sprintf( "%.2f", $this->pageCount / $delta );
@@ -204,7 +221,7 @@ TEXT;
}
wfWaitForSlaves();
// XXX: Don't let deferred jobs array get absurdly large (bug 24375)
- wfDoUpdates( 'commit' );
+ DeferredUpdates::doUpdates( 'commit' );
}
function progress( $string ) {
@@ -214,11 +231,9 @@ TEXT;
function importFromFile( $filename ) {
if ( preg_match( '/\.gz$/', $filename ) ) {
$filename = 'compress.zlib://' . $filename;
- }
- elseif ( preg_match( '/\.bz2$/', $filename ) ) {
+ } elseif ( preg_match( '/\.bz2$/', $filename ) ) {
$filename = 'compress.bzip2://' . $filename;
- }
- elseif ( preg_match( '/\.7z$/', $filename ) ) {
+ } elseif ( preg_match( '/\.7z$/', $filename ) ) {
$filename = 'mediawiki.compress.7z://' . $filename;
}
@@ -243,6 +258,9 @@ TEXT;
if( $this->hasOption( 'debug' ) ) {
$importer->setDebug( true );
}
+ if ( $this->hasOption( 'no-updates' ) ) {
+ $importer->setNoUpdates( true );
+ }
$importer->setPageCallback( array( &$this, 'reportPage' ) );
$this->importCallback = $importer->setRevisionCallback(
array( &$this, 'handleRevision' ) );
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index f3b10ea9..bd077ff9 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -40,255 +40,265 @@ $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
echo( "Import Images\n\n" );
# Need a path
-if ( count( $args ) > 0 ) {
-
- $dir = $args[0];
-
- # Check Protection
- if ( isset( $options['protect'] ) && isset( $options['unprotect'] ) )
- die( "Cannot specify both protect and unprotect. Only 1 is allowed.\n" );
-
- if ( isset( $options['protect'] ) && $options['protect'] == 1 )
- die( "You must specify a protection option.\n" );
-
- # Prepare the list of allowed extensions
- global $wgFileExtensions;
- $extensions = isset( $options['extensions'] )
- ? explode( ',', strtolower( $options['extensions'] ) )
- : $wgFileExtensions;
-
- # Search the path provided for candidates for import
- $files = findFiles( $dir, $extensions );
-
- # Initialise the user for this operation
- $user = isset( $options['user'] )
- ? User::newFromName( $options['user'] )
- : User::newFromName( 'Maintenance script' );
- if ( !$user instanceof User )
- $user = User::newFromName( 'Maintenance script' );
- $wgUser = $user;
-
- # Get block check. If a value is given, this specified how often the check is performed
- if ( isset( $options['check-userblock'] ) ) {
- if ( !$options['check-userblock'] ) $checkUserBlock = 1;
- else $checkUserBlock = (int)$options['check-userblock'];
+if ( count( $args ) == 0 ) {
+ showUsage();
+}
+
+$dir = $args[0];
+
+# Check Protection
+if ( isset( $options['protect'] ) && isset( $options['unprotect'] ) ) {
+ die( "Cannot specify both protect and unprotect. Only 1 is allowed.\n" );
+}
+
+if ( isset( $options['protect'] ) && $options['protect'] == 1 ) {
+ die( "You must specify a protection option.\n" );
+}
+
+# Prepare the list of allowed extensions
+global $wgFileExtensions;
+$extensions = isset( $options['extensions'] )
+ ? explode( ',', strtolower( $options['extensions'] ) )
+ : $wgFileExtensions;
+
+# Search the path provided for candidates for import
+$files = findFiles( $dir, $extensions );
+
+# Initialise the user for this operation
+$user = isset( $options['user'] )
+ ? User::newFromName( $options['user'] )
+ : User::newFromName( 'Maintenance script' );
+if ( !$user instanceof User ) {
+ $user = User::newFromName( 'Maintenance script' );
+}
+$wgUser = $user;
+
+# Get block check. If a value is given, this specified how often the check is performed
+if ( isset( $options['check-userblock'] ) ) {
+ if ( !$options['check-userblock'] ) {
+ $checkUserBlock = 1;
} else {
- $checkUserBlock = false;
+ $checkUserBlock = (int)$options['check-userblock'];
}
+} else {
+ $checkUserBlock = false;
+}
- # Get --from
- $from = @$options['from'];
+# Get --from
+$from = @$options['from'];
- # Get sleep time.
- $sleep = @$options['sleep'];
- if ( $sleep ) $sleep = (int)$sleep;
+# Get sleep time.
+$sleep = @$options['sleep'];
+if ( $sleep ) {
+ $sleep = (int)$sleep;
+}
- # Get limit number
- $limit = @$options['limit'];
- if ( $limit ) $limit = (int)$limit;
+# Get limit number
+$limit = @$options['limit'];
+if ( $limit ) {
+ $limit = (int)$limit;
+}
- # Get the upload comment. Provide a default one in case there's no comment given.
- $comment = 'Importing image file';
+# Get the upload comment. Provide a default one in case there's no comment given.
+$comment = 'Importing image file';
- if ( isset( $options['comment-file'] ) ) {
- $comment = file_get_contents( $options['comment-file'] );
- if ( $comment === false || $comment === NULL ) {
- die( "failed to read comment file: {$options['comment-file']}\n" );
- }
- }
- elseif ( isset( $options['comment'] ) ) {
- $comment = $options['comment'];
+if ( isset( $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'];
+}
+
+$commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
- $commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
+# Get the license specifier
+$license = isset( $options['license'] ) ? $options['license'] : '';
- # Get the license specifier
- $license = isset( $options['license'] ) ? $options['license'] : '';
+# Batch "upload" operation
+$count = count( $files );
+if ( $count > 0 ) {
- # Batch "upload" operation
- if ( ( $count = count( $files ) ) > 0 ) {
+ foreach ( $files as $file ) {
+ $base = wfBaseName( $file );
- foreach ( $files as $file ) {
- $base = wfBaseName( $file );
+ # 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" );
+ continue;
+ }
- # 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" );
+ if ( $from ) {
+ if ( $from == $title->getDBkey() ) {
+ $from = null;
+ } else {
+ $ignored++;
continue;
}
+ }
- if ( $from ) {
- if ( $from == $title->getDBkey() ) {
- $from = NULL;
- } else {
- $ignored++;
- continue;
- }
+ if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
+ $user->clearInstanceCache( 'name' ); // reload from DB!
+ if ( $user->isBlocked() ) {
+ echo( $user->getName() . " was blocked! Aborting.\n" );
+ break;
}
+ }
- if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
- $user->clearInstanceCache( 'name' ); // reload from DB!
- if ( $user->isBlocked() ) {
- echo( $user->getName() . " was blocked! Aborting.\n" );
- break;
- }
+ # Check existence
+ $image = wfLocalFile( $title );
+ if ( $image->exists() ) {
+ if ( isset( $options['overwrite'] ) ) {
+ echo( "{$base} exists, overwriting..." );
+ $svar = 'overwritten';
+ } else {
+ echo( "{$base} exists, skipping\n" );
+ $skipped++;
+ continue;
}
+ } else {
+ if ( isset( $options['skip-dupes'] ) ) {
+ $repo = $image->getRepo();
+ $sha1 = File::sha1Base36( $file ); # XXX: we end up calculating this again when actually uploading. that sucks.
- # Check existence
- $image = wfLocalFile( $title );
- if ( $image->exists() ) {
- if ( isset( $options['overwrite'] ) ) {
- echo( "{$base} exists, overwriting..." );
- $svar = 'overwritten';
- } else {
- echo( "{$base} exists, skipping\n" );
+ $dupes = $repo->findBySha1( $sha1 );
+
+ if ( $dupes ) {
+ echo( "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n" );
$skipped++;
continue;
}
- } else {
- if ( isset( $options['skip-dupes'] ) ) {
- $repo = $image->getRepo();
- $sha1 = File::sha1Base36( $file ); # XXX: we end up calculating this again when actually uploading. that sucks.
+ }
- $dupes = $repo->findBySha1( $sha1 );
+ echo( "Importing {$base}..." );
+ $svar = 'added';
+ }
- if ( $dupes ) {
- echo( "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n" );
- $skipped++;
- continue;
- }
+ if ( isset( $options['source-wiki-url'] ) ) {
+ /* find comment text directly from source wiki, through MW's API */
+ $real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
+ if ( $real_comment === false )
+ $commentText = $comment;
+ else
+ $commentText = $real_comment;
+
+ /* find user directly from source wiki, through MW's API */
+ $real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
+ if ( $real_user === false ) {
+ $wgUser = $user;
+ } else {
+ $wgUser = User::newFromName( $real_user );
+ if ( $wgUser === false ) {
+ # user does not exist in target wiki
+ echo ( "failed: user '$real_user' does not exist in target wiki." );
+ continue;
}
-
- 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 )
- $commentText = $comment;
- else
- $commentText = $real_comment;
-
- /* find user directly from source wiki, through MW's API */
- $real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
- if ( $real_user === false ) {
- $wgUser = $user;
+ } else {
+ # Find comment text
+ $commentText = false;
+
+ if ( $commentExt ) {
+ $f = findAuxFile( $file, $commentExt );
+ if ( !$f ) {
+ echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
} else {
- $wgUser = User::newFromName( $real_user );
- if ( $wgUser === false ) {
- # user does not exist in target wiki
- echo ( "failed: user '$real_user' does not exist in target wiki." );
- continue;
+ $commentText = file_get_contents( $f );
+ if ( !$commentText ) {
+ echo( " Failed to load comment file {$f}, using default comment. " );
}
}
- } else {
- # Find comment text
- $commentText = false;
-
- if ( $commentExt ) {
- $f = findAuxFile( $file, $commentExt );
- if ( !$f ) {
- echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
- } else {
- $commentText = file_get_contents( $f );
- if ( !$f ) {
- echo( " Failed to load comment file {$f}, using default comment. " );
- }
- }
- }
-
- if ( !$commentText ) {
- $commentText = $comment;
- }
}
+ if ( !$commentText ) {
+ $commentText = $comment;
+ }
+ }
- # Import the file
- if ( isset( $options['dry'] ) ) {
- echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
- } else {
- $archive = $image->publish( $file );
- if ( !$archive->isGood() ) {
- echo( "failed. (" .
- $archive->getWikiText() .
- ")\n" );
- $failed++;
- continue;
- }
+ # Import the file
+ if ( isset( $options['dry'] ) ) {
+ echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
+ } else {
+ $archive = $image->publish( $file );
+ if ( !$archive->isGood() ) {
+ echo( "failed. (" .
+ $archive->getWikiText() .
+ ")\n" );
+ $failed++;
+ continue;
}
+ }
+
+ if ( isset( $options['dry'] ) ) {
+ echo( "done.\n" );
+ } elseif ( $image->recordUpload( $archive->value, $commentText, $license ) ) {
+ # We're done!
+ echo( "done.\n" );
$doProtect = false;
- $restrictions = array();
global $wgRestrictionLevels;
$protectLevel = isset( $options['protect'] ) ? $options['protect'] : null;
if ( $protectLevel && in_array( $protectLevel, $wgRestrictionLevels ) ) {
- $restrictions['move'] = $protectLevel;
- $restrictions['edit'] = $protectLevel;
- $doProtect = true;
+ $doProtect = true;
}
if ( isset( $options['unprotect'] ) ) {
- $restrictions['move'] = '';
- $restrictions['edit'] = '';
- $doProtect = true;
+ $protectLevel = '';
+ $doProtect = true;
}
+ if ( $doProtect ) {
+ # Protect the file
+ echo "\nWaiting for slaves...\n";
+ // Wait for slaves.
+ sleep( 2.0 ); # Why this sleep?
+ wfWaitForSlaves();
- if ( isset( $options['dry'] ) ) {
- echo( "done.\n" );
- } elseif ( $image->recordUpload( $archive->value, $commentText, $license ) ) {
- # We're done!
- echo( "done.\n" );
- if ( $doProtect ) {
- # Protect the file
- $article = new Article( $title );
- echo "\nWaiting for slaves...\n";
- // Wait for slaves.
- sleep( 2.0 ); # Why this sleep?
- wfWaitForSlaves();
-
- echo( "\nSetting image restrictions ... " );
- if ( $article->updateRestrictions( $restrictions ) )
- echo( "done.\n" );
- else
- echo( "failed.\n" );
- }
+ echo( "\nSetting image restrictions ... " );
- } else {
- echo( "failed. (at recordUpload stage)\n" );
- $svar = 'failed';
+ $cascade = false;
+ $restrictions = array();
+ 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" );
}
- $$svar++;
- $processed++;
+ } else {
+ echo( "failed. (at recordUpload stage)\n" );
+ $svar = 'failed';
+ }
- if ( $limit && $processed >= $limit )
- break;
+ $$svar++;
+ $processed++;
- if ( $sleep )
- sleep( $sleep );
+ if ( $limit && $processed >= $limit ) {
+ break;
}
- # Print out some statistics
- 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 ( $sleep ) {
+ sleep( $sleep );
}
+ }
- } else {
- echo( "No suitable files could be found for import.\n" );
+ # Print out some statistics
+ 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" );
}
} else {
- showUsage();
+ echo( "No suitable files could be found for import.\n" );
}
exit( 0 );
diff --git a/maintenance/importSiteScripts.php b/maintenance/importSiteScripts.php
index 849c7b1b..0dc200ec 100644
--- a/maintenance/importSiteScripts.php
+++ b/maintenance/importSiteScripts.php
@@ -1,8 +1,11 @@
<?php
/**
- * Maintenance script to import all scripts in the MediaWiki namespace from a
+ * Maintenance script to import all scripts in the MediaWiki namespace from a
* local site.
+ * @file
+ * @ingroup Maintenance
*/
+
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class ImportSiteScripts extends Maintenance {
@@ -16,22 +19,29 @@ class ImportSiteScripts extends Maintenance {
public function execute() {
global $wgUser;
- $wgUser = User::newFromName( $this->getOption( 'username', 'ScriptImporter' ) );
+
+ $user = User::newFromName( $this->getOption( 'username', 'ScriptImporter' ) );
+ $wgUser = $user;
$baseUrl = $this->getArg( 1 );
$pageList = $this->fetchScriptList();
$this->output( 'Importing ' . count( $pageList ) . " pages\n" );
foreach ( $pageList as $page ) {
+ $title = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
+ if ( !$title ) {
+ $this->error( "$page is an invalid title; it will not be imported\n" );
+ continue;
+ }
+
$this->output( "Importing $page\n" );
$url = wfAppendQuery( $baseUrl, array(
'action' => 'raw',
'title' => "MediaWiki:{$page}" ) );
$text = Http::get( $url );
-
- $title = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
- $article = new Article( $title );
- $article->doEdit( $text, "Importing from $url", 0 );
+
+ $wikiPage = WikiPage::factory( $title );
+ $wikiPage->doEdit( $text, "Importing from $url", 0, false, $user );
}
}
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
index b78ae039..ec9ff001 100644
--- a/maintenance/importTextFile.php
+++ b/maintenance/importTextFile.php
@@ -57,8 +57,8 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
$flags = 0 | ( isset( $options['norc'] ) ? EDIT_SUPPRESS_RC : 0 );
echo( "\nPerforming edit..." );
- $article = new Article( $title );
- $article->doEdit( $text, $comment, $flags );
+ $page = WikiPage::factory( $title );
+ $page->doEdit( $text, $comment, $flags, false, $user );
echo( "done.\n" );
} else {
diff --git a/maintenance/importUseModWiki.php b/maintenance/importUseModWiki.php
deleted file mode 100644
index a28d57a5..00000000
--- a/maintenance/importUseModWiki.php
+++ /dev/null
@@ -1,375 +0,0 @@
-<?php
-/**
- * Import data from a UseModWiki into a MediaWiki wiki
- * 2003-02-09 Brion VIBBER <brion@pobox.com>
- * Based loosely on Magnus's code from 2001-2002
- *
- * Updated limited version to get something working temporarily
- * 2003-10-09
- * Be sure to run the link & index rebuilding scripts!
- *
- * Some more munging for charsets etc
- * 2003-11-28
- *
- * Partial fix for pages starting with lowercase letters (??)
- * and CamelCase and /Subpage link conversion
- * 2004-11-17
- *
- * Rewrite output to create Special:Export format for import
- * instead of raw SQL. Should be 'future-proof' against future
- * schema changes.
- * 2005-03-14
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @todo document
- * @file
- * @ingroup Maintenance
- */
-
-require_once( "Maintenance.php" );
-
-class ImportUseModWiki extends Maintenance {
-
- private $encoding, $rootDirectory = '';
-
- /**
- * Field separators
- * @var String
- */
- private $FS1, $FS2, $FS3 = '';
-
- /**
- * @var Array
- */
- private $usercache, $nowiki = array();
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Import pages from UseMod wikis";
- $this->addOption( 'encoding', 'Encoding of the imported text, default CP1252', false, true );
- /**
- * If UseModWiki's New File System is used:
- * $NewFS = 1; # 1 = new multibyte $FS, 0 = old $FS
- * Use "\xb3"; for the Old File System
- * Changed with UTF-8 UseModWiki
- * http://www.usemod.com/cgi-bin/wiki.pl?SupportForUtf8
- * http://www.usemod.com/cgi-bin/wiki.pl?WikiBugs/NewFieldSeparatorWronglyTreated
- * http://www.meatballwiki.org/wiki/WikiEngine#Q_amp_A
- */
- $this->addOption( 'separator', 'Field separator to use, default \x1E\xFF\xFE\x1E', false, true );
- $this->addArg( 'path', 'Path to your UseMod wiki' );
- }
-
- public function execute() {
- $this->rootDirectory = $this->getArg();
- $this->encoding = $this->getOption( 'encoding', 'CP1252' );
- $sep = $this->getOption( 'separator', "\x1E\xFF\xFE\x1E" );
- $this->FS1 = "{$sep}1";
- $this->FS2 = "{$sep}2";
- $this->FS3 = "{$sep}3";
-
- echo <<<XML
-<?xml version="1.0" encoding="UTF-8" ?>
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.1/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.1/
- http://www.mediawiki.org/xml/export-0.1.xsd"
- version="0.1"
- xml:lang="en">
-<!-- generated by importUseModWiki.php -->
-
-XML;
- $letters = array(
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
- 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
- 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'other' );
- foreach ( $letters as $letter ) {
- $dir = "{$this->rootDirectory}/page/$letter";
- if ( is_dir( $dir ) )
- $this->importPageDirectory( $dir );
- }
- echo <<<XML
-</mediawiki>
-
-XML;
- }
-
- private function importPageDirectory( $dir, $prefix = "" ) {
- echo "\n<!-- Checking page directory " . $this->xmlCommentSafe( $dir ) . " -->\n";
- $mydir = opendir( $dir );
- while ( $entry = readdir( $mydir ) ) {
- $m = array();
- if ( preg_match( '/^(.+)\.db$/', $entry, $m ) ) {
- echo $this->importPage( $prefix . $m[1] );
- } else {
- if ( is_dir( "$dir/$entry" ) ) {
- if ( $entry != '.' && $entry != '..' ) {
- $this->importPageDirectory( "$dir/$entry", "$entry/" );
- }
- } else {
- echo "<!-- File '" . $this->xmlCommentSafe( $entry ) . "' doesn't seem to contain an article. Skipping. -->\n";
- }
- }
- }
- }
-
- private function useModFilename( $title ) {
- $c = substr( $title, 0, 1 );
- if ( preg_match( '/[A-Z]/i', $c ) ) {
- return strtoupper( $c ) . "/$title";
- }
- return "other/$title";
- }
-
- private function fetchPage( $title ) {
- $fname = $this->rootDirectory . "/page/" . $this->useModFilename( $title ) . ".db";
- if ( !file_exists( $fname ) ) {
- echo "Couldn't open file '$fname' for page '$title'.\n";
- die( -1 );
- }
-
- $page = $this->splitHash( $this->FS1, file_get_contents( $fname ) );
- $section = $this->splitHash( $this->FS2, $page["text_default"] );
- $text = $this->splitHash( $this->FS3, $section["data"] );
-
- return $this->array2object( array( "text" => $text["text"] , "summary" => $text["summary"] ,
- "minor" => $text["minor"] , "ts" => $section["ts"] ,
- "username" => $section["username"] , "host" => $section["host"] ) );
- }
-
- private function fetchKeptPages( $title ) {
- $fname = $this->rootDirectory . "/keep/" . $this->useModFilename( $title ) . ".kp";
- if ( !file_exists( $fname ) ) return array();
-
- $keptlist = explode( $this->FS1, file_get_contents( $fname ) );
- array_shift( $keptlist ); # Drop the junk at beginning of file
-
- $revisions = array();
- foreach ( $keptlist as $rev ) {
- $section = $this->splitHash( $this->FS2, $rev );
- $text = $this->splitHash( $this->FS3, $section["data"] );
- if ( $text["text"] && $text["minor"] != "" && ( $section["ts"] * 1 > 0 ) ) {
- array_push( $revisions, $this->array2object( array ( "text" => $text["text"] , "summary" => $text["summary"] ,
- "minor" => $text["minor"] , "ts" => $section["ts"] ,
- "username" => $section["username"] , "host" => $section["host"] ) ) );
- } else {
- echo "<!-- skipped a bad old revision -->\n";
- }
- }
- return $revisions;
- }
-
- private function splitHash( $sep , $str ) {
- $temp = explode ( $sep , $str ) ;
- $ret = array () ;
- for ( $i = 0; $i + 1 < count ( $temp ) ; $i++ ) {
- $ret[$temp[$i]] = $temp[++$i] ;
- }
- return $ret ;
- }
-
- private function checkUserCache( $name, $host ) {
- if ( $name ) {
- if ( in_array( $name, $this->usercache ) ) {
- $userid = $this->usercache[$name];
- } else {
- # If we haven't imported user accounts
- $userid = 0;
- }
- $username = str_replace( '_', ' ', $name );
- } else {
- $userid = 0;
- $username = $host;
- }
- return array( $userid, $username );
- }
-
- private function importPage( $title ) {
- echo "\n<!-- Importing page " . $this->xmlCommentSafe( $title ) . " -->\n";
- $page = $this->fetchPage( $title );
-
- $newtitle = $this->xmlsafe( str_replace( '_', ' ', $this->recodeText( $title ) ) );
-
- $munged = $this->mungeFormat( $page->text );
- if ( $munged != $page->text ) {
- /**
- * Save a *new* revision with the conversion, and put the
- * previous last version into the history.
- */
- $next = $this->array2object( array(
- 'text' => $munged,
- 'minor' => 1,
- 'username' => 'Conversion script',
- 'host' => '127.0.0.1',
- 'ts' => time(),
- 'summary' => 'link fix',
- ) );
- $revisions = array( $page, $next );
- } else {
- /**
- * Current revision:
- */
- $revisions = array( $page );
- }
- $xml = <<<XML
- <page>
- <title>$newtitle</title>
-
-XML;
-
- # History
- $revisions = array_merge( $revisions, $this->fetchKeptPages( $title ) );
- if ( count( $revisions ) == 0 ) {
- return NULL; // Was "$sql", which does not appear to be defined.
- }
-
- foreach ( $revisions as $rev ) {
- $text = $this->xmlsafe( $this->recodeText( $rev->text ) );
- $minor = ( $rev->minor ? '<minor/>' : '' );
- list( /* $userid */ , $username ) = $this->checkUserCache( $rev->username, $rev->host );
- $username = $this->xmlsafe( $this->recodeText( $username ) );
- $timestamp = $this->xmlsafe( $this->timestamp2ISO8601( $rev->ts ) );
- $comment = $this->xmlsafe( $this->recodeText( $rev->summary ) );
-
- $xml .= <<<XML
- <revision>
- <timestamp>$timestamp</timestamp>
- <contributor><username>$username</username></contributor>
- $minor
- <comment>$comment</comment>
- <text>$text</text>
- </revision>
-
-XML;
- }
- $xml .= "</page>\n\n";
- return $xml;
- }
-
- private function recodeText( $string ) {
- # For currently latin-1 wikis
- $string = str_replace( "\r\n", "\n", $string );
- $string = @iconv( $this->encoding, "UTF-8", $string );
- $string = $this->mungeToUtf8( $string ); # Any old &#1234; stuff
- return $string;
- }
-
- /**
- * @todo FIXME: Don't use /e
- */
- private function mungeToUtf8( $string ) {
- $string = preg_replace ( '/&#([0-9]+);/e', 'wfUtf8Sequence($1)', $string );
- $string = preg_replace ( '/&#x([0-9a-f]+);/ie', 'wfUtf8Sequence(0x$1)', $string );
- # Should also do named entities here
- return $string;
- }
-
- private function timestamp2ISO8601( $ts ) {
- # 2003-08-05T18:30:02Z
- return gmdate( 'Y-m-d', $ts ) . 'T' . gmdate( 'H:i:s', $ts ) . 'Z';
- }
-
- /**
- * The page may contain old data which has not been properly normalized.
- * Invalid UTF-8 sequences or forbidden control characters will make our
- * XML output invalid, so be sure to strip them out.
- * @param String $string Text to clean up
- * @return String
- */
- private function xmlsafe( $string ) {
- $string = UtfNormal::cleanUp( $string );
- $string = htmlspecialchars( $string );
- return $string;
- }
-
- private function xmlCommentSafe( $text ) {
- return str_replace( '--', '\\-\\-', $this->xmlsafe( $this->recodeText( $text ) ) );
- }
-
- private function array2object( $arr ) {
- $o = (object)0;
- foreach ( $arr as $x => $y ) {
- $o->$x = $y;
- }
- return $o;
- }
-
- /**
- * Make CamelCase and /Talk links work
- */
- private function mungeFormat( $text ) {
- $this->nowiki = array();
- $staged = preg_replace_callback(
- '/(<nowiki>.*?<\\/nowiki>|(?:http|https|ftp):\\S+|\[\[[^]\\n]+]])/s',
- array( $this, 'nowikiPlaceholder' ), $text );
-
- # This is probably not 100% correct, I'm just
- # glancing at the UseModWiki code.
- $upper = "[A-Z]";
- $lower = "[a-z_0-9]";
- $any = "[A-Za-z_0-9]";
- $camel = "(?:$upper+$lower+$upper+$any*)";
- $subpage = "(?:\\/$any+)";
- $substart = "(?:\\/$upper$any*)";
-
- $munged = preg_replace( "/(?!\\[\\[)($camel$subpage*|$substart$subpage*)\\b(?!\\]\\]|>)/",
- '[[$1]]', $staged );
-
- $final = preg_replace( '/' . preg_quote( $this->placeholder() ) . '/s',
- array( $this, 'nowikiShift' ), $munged );
- return $final;
- }
-
- private function placeholder( $x = null ) {
- return '\xffplaceholder\xff';
- }
-
- public function nowikiPlaceholder( $matches ) {
- $this->nowiki[] = $matches[1];
- return $this->placeholder();
- }
-
- public function nowikiShift() {
- return array_shift( $this->nowiki );
- }
-}
-
-function wfUtf8Sequence( $codepoint ) {
- if ( $codepoint < 0x80 ) {
- return chr( $codepoint );
- }
- if ( $codepoint < 0x800 ) {
- return chr( $codepoint >> 6 & 0x3f | 0xc0 ) .
- chr( $codepoint & 0x3f | 0x80 );
- }
- if ( $codepoint < 0x10000 ) {
- return chr( $codepoint >> 12 & 0x0f | 0xe0 ) .
- chr( $codepoint >> 6 & 0x3f | 0x80 ) .
- chr( $codepoint & 0x3f | 0x80 );
- }
- if ( $codepoint < 0x100000 ) {
- return chr( $codepoint >> 18 & 0x07 | 0xf0 ) . # Double-check this
- chr( $codepoint >> 12 & 0x3f | 0x80 ) .
- chr( $codepoint >> 6 & 0x3f | 0x80 ) .
- chr( $codepoint & 0x3f | 0x80 );
- }
- # Doesn't yet handle outside the BMP
- return "&#$codepoint;";
-}
-
-$maintClass = 'ImportUseModWiki';
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/importUseModWikipedia.php b/maintenance/importUseModWikipedia.php
deleted file mode 100644
index c4b8112f..00000000
--- a/maintenance/importUseModWikipedia.php
+++ /dev/null
@@ -1,892 +0,0 @@
-<?php
-
-/**
- * A script to read a dump of the English Wikipedia from the UseModWiki period, and to
- * generate an XML dump in MediaWiki format.
- *
- * Some relevant code was ported from UseModWiki 0.92.
- *
- */
-
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-require_once( dirname( __FILE__ ) .'/../includes/normal/UtfNormalUtil.php' );
-
-
-class ImportUseModWikipedia extends Maintenance {
- var $encodeMap, $decodeMap;
-
- var $deepRenames = array(
- 'JimboWales' => 983862286,
- 'TexaS' => 983918410,
- 'HistoryOfUnitedStatesTalk' => 984795423,
- 'MetallicA' => 985128533,
- 'PythagoreanTheorem' => 985225545,
- 'TheCanonofScripture' => 985368223,
- 'TaoTehChing' => 985368222,
- //'TheMostRemarkableFormulaInTheWorld' => 985368221,
- 'TheRecorder' => 985368220,
- 'GladstoneOregon' => 985368219,
- 'PacificBeach' => '?',
- 'AaRiver' => '?',
- );
-
- var $replacements = array();
-
- var $renameTextLinksOps = array(
- 983846265 => array(
- 'TestIgnore' => 'IgnoreTest',
- ),
- 983848080 => array(
- 'UnitedLocomotiveWorks' => 'Atlas Shrugged/United Locomotive Works'
- ),
- 983856376 => array(
- 'WikiPedia' => 'Wikipedia',
- ),
- 983896152 => array(
- 'John_F_Kennedy' => 'John_F._Kennedy',
- ),
- 983905871 => array(
- 'LarrySanger' => 'Larry_Sanger'
- ),
- 984697068 => array(
- 'UnitedStates' => 'United States',
- ),
- 984792748 => array(
- 'LibertarianisM' => 'Libertarianism'
- ),
- 985327832 => array(
- 'AnarchisM' => 'Anarchism',
- ),
- 985290063 => array(
- 'HistoryOfUnitedStatesDiscussion' => 'History_Of_United_States_Discussion'
- ),
- 985290091 => array(
- 'BritishEmpire' => 'British Empire'
- ),
- /*
- 985468958 => array(
- 'ScienceFiction' => 'Science fiction',
- ),*/
- );
-
- /**
- * Hack for observed substitution issues
- */
- var $skipSelfSubstitution = array(
- 'Pythagorean_Theorem',
- 'The_Most_Remarkable_Formula_In_The_World',
- 'Wine',
- );
-
- var $unixLineEndingsOps = array(
- 987743732 => 'Wikipedia_FAQ'
- );
-
- var $replacementsDone = array();
-
- var $moveLog = array();
- var $moveDests = array();
- var $revId;
-
- var $rc = array();
- var $textCache = array();
- var $blacklist = array();
-
- var $FS, $FS1, $FS2, $FS3;
- var $FreeLinkPattern, $UrlPattern, $LinkPattern, $InterLinkPattern;
-
- var $cp1252Table = array(
-0x80 => 0x20ac,
-0x81 => 0x0081,
-0x82 => 0x201a,
-0x83 => 0x0192,
-0x84 => 0x201e,
-0x85 => 0x2026,
-0x86 => 0x2020,
-0x87 => 0x2021,
-0x88 => 0x02c6,
-0x89 => 0x2030,
-0x8a => 0x0160,
-0x8b => 0x2039,
-0x8c => 0x0152,
-0x8d => 0x008d,
-0x8e => 0x017d,
-0x8f => 0x008f,
-0x90 => 0x0090,
-0x91 => 0x2018,
-0x92 => 0x2019,
-0x93 => 0x201c,
-0x94 => 0x201d,
-0x95 => 0x2022,
-0x96 => 0x2013,
-0x97 => 0x2014,
-0x98 => 0x02dc,
-0x99 => 0x2122,
-0x9a => 0x0161,
-0x9b => 0x203a,
-0x9c => 0x0153,
-0x9d => 0x009d,
-0x9e => 0x017e,
-0x9f => 0x0178);
-
- public function __construct() {
- parent::__construct();
- $this->addOption( 'datadir', 'the value of $DataDir from wiki.cgi', true, true );
- $this->addOption( 'outfile', 'the name of the output XML file', true, true );
- $this->initLinkPatterns();
-
- $this->encodeMap = $this->decodeMap = array();
-
- for ($source = 0; $source <= 0xff; $source++) {
- if ( isset( $this->cp1252Table[$source] ) ) {
- $dest = $this->cp1252Table[$source];
- } else {
- $dest = $source;
- }
- $sourceChar = chr( $source );
- $destChar = codepointToUtf8( $dest );
- $this->encodeMap[$sourceChar] = $destChar;
- $this->decodeMap[$destChar] = $sourceChar;
- }
- }
-
- function initLinkPatterns() {
- # Field separators are used in the URL-style patterns below.
- $this->FS = "\xb3"; # The FS character is a superscript "3"
- $this->FS1 = $this->FS . "1"; # The FS values are used to separate fields
- $this->FS2 = $this->FS . "2"; # in stored hashtables and other data structures.
- $this->FS3 = $this->FS . "3"; # The FS character is not allowed in user data.
-
- $UpperLetter = "[A-Z";
- $LowerLetter = "[a-z";
- $AnyLetter = "[A-Za-z";
- $AnyLetter .= "_0-9";
- $UpperLetter .= "]"; $LowerLetter .= "]"; $AnyLetter .= "]";
-
- # Main link pattern: lowercase between uppercase, then anything
- $LpA = $UpperLetter . "+" . $LowerLetter . "+" . $UpperLetter
- . $AnyLetter . "*";
- # Optional subpage link pattern: uppercase, lowercase, then anything
- $LpB = $UpperLetter . "+" . $LowerLetter . "+" . $AnyLetter . "*";
-
- # Loose pattern: If subpage is used, subpage may be simple name
- $this->LinkPattern = "((?:(?:$LpA)?\\/$LpB)|$LpA)";
- $QDelim = '(?:"")?'; # Optional quote delimiter (not in output)
- $this->LinkPattern .= $QDelim;
-
- # Inter-site convention: sites must start with uppercase letter
- # (Uppercase letter avoids confusion with URLs)
- $InterSitePattern = $UpperLetter . $AnyLetter . "+";
- $this->InterLinkPattern = "((?:$InterSitePattern:[^\\]\\s\"<>{$this->FS}]+)$QDelim)";
-
- $AnyLetter = "[-,. _0-9A-Za-z]";
- $this->FreeLinkPattern = "($AnyLetter+)";
- $this->FreeLinkPattern = "((?:(?:$AnyLetter+)?\\/)?$AnyLetter+)";
- $this->FreeLinkPattern .= $QDelim;
-
- # Url-style links are delimited by one of:
- # 1. Whitespace (kept in output)
- # 2. Left or right angle-bracket (< or >) (kept in output)
- # 3. Right square-bracket (]) (kept in output)
- # 4. A single double-quote (") (kept in output)
- # 5. A $FS (field separator) character (kept in output)
- # 6. A double double-quote ("") (removed from output)
-
- $UrlProtocols = "http|https|ftp|afs|news|nntp|mid|cid|mailto|wais|"
- . "prospero|telnet|gopher";
- $UrlProtocols .= '|file';
- $this->UrlPattern = "((?:(?:$UrlProtocols):[^\\]\\s\"<>{$this->FS}]+)$QDelim)";
- $ImageExtensions = "(gif|jpg|png|bmp|jpeg)";
- $RFCPattern = "RFC\\s?(\\d+)";
- $ISBNPattern = "ISBN:?([0-9- xX]{10,})";
- }
-
- function execute() {
- $this->articleFileName = '/tmp/importUseMod.' . mt_rand( 0, 0x7ffffff ) . '.tmp';
- $this->patchFileName = '/tmp/importUseMod.' . mt_rand( 0, 0x7ffffff ) . '.tmp';
- $this->dataDir = $this->getOption( 'datadir' );
- $this->outFile = fopen( $this->getOption( 'outfile' ), 'w' );
- if ( !$this->outFile ) {
- echo "Unable to open output file\n";
- return 1;
- }
- $this->writeXmlHeader();
- $this->readRclog();
- $this->writeMoveLog();
- $this->writeRevisions();
- $this->reconcileCurrentRevs();
- $this->writeXmlFooter();
- unlink( $this->articleFileName );
- unlink( $this->patchFileName );
- return 0;
- }
-
- function writeXmlHeader() {
- fwrite( $this->outFile, <<<EOT
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
- <siteinfo>
- <sitename>Wikipedia</sitename>
- <base>http://www.wikipedia.com/</base>
- <generator>MediaWiki 1.18alpha importUseModWikipedia.php</generator>
- <case>case-sensitive</case>
- <namespaces>
- <namespace key="0" />
- </namespaces>
- </siteinfo>
-
-EOT
- );
- }
-
- function writeXmlFooter() {
- fwrite( $this->outFile, "</mediawiki>\n" );
- }
-
- function readRclog() {
- $rcFile = fopen( "{$this->dataDir}/rclog", 'r' );
- while ( $line = fgets( $rcFile ) ) {
- $bits = explode( $this->FS3, $line );
- if ( count( $bits ) !== 7 ) {
- echo "Error reading rclog\n";
- return;
- }
- $params = array(
- 'timestamp' => $bits[0],
- 'rctitle' => $bits[1],
- 'summary' => $bits[2],
- 'minor' => $bits[3],
- 'host' => $bits[4],
- 'kind' => $bits[5],
- 'extra' => array()
- );
- $extraList = explode( $this->FS2, $bits[6] );
-
- for ( $i = 0; $i < count( $extraList ); $i += 2 ) {
- $params['extra'][$extraList[$i]] = $extraList[$i + 1];
- }
- $this->rc[$params['timestamp']][] = $params;
- }
- }
-
- function writeMoveLog() {
- $this->moveLog = array();
- $deepRenames = $this->deepRenames;
- echo "Calculating move log...\n";
- $this->processDiffFile( array( $this, 'moveLogCallback' ) );
-
- // We have the timestamp intervals, now make a guess at the actual timestamp
- foreach ( $this->moveLog as $newTitle => $params ) {
- // Is there a time specified?
- $drTime = false;
- if ( isset( $deepRenames[$params['old']] ) ) {
- $drTime = $deepRenames[$params['old']];
- if ( $drTime !== '?' ) {
- if ( ( !isset( $params['endTime'] ) || $drTime < $params['endTime'] )
- && $drTime > $params['startTime'] )
- {
- $this->moveLog[$newTitle]['timestamp'] = $drTime;
- $this->moveLog[$newTitle]['deep'] = true;
-
- echo "{$params['old']} -> $newTitle at $drTime\n";
- unset( $deepRenames[$params['old']] );
- continue;
- } else {
- echo "WARNING: deep rename time invalid: {$params['old']}\n";
- unset( $deepRenames[$params['old']] );
- }
- }
- }
-
- // Guess that it is one second after the last edit to the page before it was moved
- $this->moveLog[$newTitle]['timestamp'] = $params['startTime'] + 1;
- if ( $drTime === '?' ) {
- $this->moveLog[$newTitle]['deep'] = true;
- unset( $deepRenames[$params['old']] );
- }
- if ( isset( $params['endTime'] ) ) {
- $this->printLatin1( "{$params['old']} -> $newTitle between " .
- "{$params['startTime']} and {$params['endTime']}\n" );
- } else {
- $this->printLatin1( "{$params['old']} -> $newTitle after " .
- "{$params['startTime']}\n" );
- }
- }
-
- // Write the move log to the XML file
- $id = 1;
- foreach ( $this->moveLog as $newTitle => $params ) {
- $out = "<logitem>\n" .
- $this->element( 'id', $id++ ) .
- $this->element( 'timestamp', wfTimestamp( TS_ISO_8601, $params['timestamp'] ) ) .
- "<contributor>\n" .
- $this->element( 'username', 'UseModWiki admin' ) .
- "</contributor>" .
- $this->element( 'type', 'move' ) .
- $this->element( 'action', 'move' ) .
- $this->element( 'logtitle', $params['old'] ) .
- "<params xml:space=\"preserve\">" .
- htmlspecialchars( $this->encode( "{$newTitle}\n1" ) ) .
- "</params>\n" .
- "</logitem>\n";
- fwrite( $this->outFile, $out );
- }
-
- // Check for remaining deep rename entries
- if ( $deepRenames ) {
- echo "WARNING: the following entries in \$this->deepRenames are " .
- "invalid, since no such move exists:\n" .
- implode( "\n", array_keys( $deepRenames ) ) .
- "\n\n";
- }
-
- }
-
- function element( $name, $value ) {
- return "<$name>" . htmlspecialchars( $this->encode( $value ) ) . "</$name>\n";
- }
-
- function moveLogCallback( $entry ) {
- $rctitle = $entry['rctitle'];
- $title = $entry['title'];
- $this->moveDests[$rctitle] = $title;
-
- if ( $rctitle === $title ) {
- if ( isset( $this->moveLog[$rctitle] )
- && !isset( $this->moveLog[$rctitle]['endTime'] ) )
- {
- // This is the latest time that the page could have been moved
- $this->moveLog[$rctitle]['endTime'] = $entry['timestamp'];
- }
- } else {
- if ( !isset( $this->moveLog[$rctitle] ) ) {
- // Initialise the move log entry
- $this->moveLog[$rctitle] = array(
- 'old' => $title
- );
- }
- // Update the earliest time the page could have been moved
- $this->moveLog[$rctitle]['startTime'] = $entry['timestamp'];
- }
- }
-
- function writeRevisions() {
- $this->numGoodRevs = 0;
- $this->revId = 1;
- $this->processDiffFile( array( $this, 'revisionCallback' ) );
- echo "\n\nImported {$this->numGoodRevs} out of {$this->numRevs}\n";
- }
-
- function revisionCallback( $params ) {
- $title = $params['rctitle'];
- $editTime = $params['timestamp'];
-
- if ( isset( $this->blacklist[$title] ) ) {
- return;
- }
- $this->doPendingOps( $editTime );
-
- $origText = $this->getText( $title );
- $text = $this->patch( $origText, $params['diff'] );
- if ( $text === false ) {
- echo "$editTime $title attempting resolution...\n";
- $linkSubstitutes = $this->resolveFailedDiff( $origText, $params['diff'] );
- if ( !$linkSubstitutes ) {
- $this->printLatin1( "$editTime $title DIFF FAILED\n" );
- $this->blacklist[$title] = true;
- return;
- }
- $this->printLatin1( "$editTime $title requires substitutions:\n" );
- $time = $editTime - 1;
- foreach ( $linkSubstitutes as $old => $new ) {
- $this->printLatin1( "SUBSTITUTE $old -> $new\n" );
- $this->renameTextLinks( $old, $new, $time-- );
- }
- $origText = $this->getText( $title );
- $text = $this->patch( $origText, $params['diff'] );
- if ( $text === false ) {
- $this->printLatin1( "$editTime $title STILL FAILS!\n" );
- $this->blacklist[$title] = true;
- return;
- }
-
- echo "\n";
- }
-
- $params['text'] = $text;
- $this->saveRevision( $params );
- $this->numGoodRevs++;
- #$this->printLatin1( "$editTime $title\n" );
- }
-
- function doPendingOps( $editTime ) {
- foreach ( $this->moveLog as $newTitle => $entry ) {
- if ( $entry['timestamp'] <= $editTime ) {
- unset( $this->moveLog[$newTitle] );
- if ( isset( $entry['deep'] ) ) {
- $this->renameTextLinks( $entry['old'], $newTitle, $entry['timestamp'] );
- }
- }
- }
-
- foreach ( $this->renameTextLinksOps as $renameTime => $replacements ) {
- if ( $editTime >= $renameTime ) {
- foreach ( $replacements as $old => $new ) {
- $this->printLatin1( "SUBSTITUTE $old -> $new\n" );
- $this->renameTextLinks( $old, $new, $renameTime );
- }
- unset( $this->renameTextLinksOps[$renameTime] );
- }
- }
-
- foreach ( $this->unixLineEndingsOps as $fixTime => $title ) {
- if ( $editTime >= $fixTime ) {
- $this->printLatin1( "$fixTime $title FIXING LINE ENDINGS\n" );
- $text = $this->getText( $title );
- $text = str_replace( "\r", '', $text );
- $this->saveRevision( array(
- 'rctitle' => $title,
- 'timestamp' => $fixTime,
- 'extra' => array( 'name' => 'UseModWiki admin' ),
- 'text' => $text,
- 'summary' => 'Fixing line endings',
- ) );
- unset( $this->unixLineEndingsOps[$fixTime] );
- }
- }
- }
-
- function patch( $source, $diff ) {
- file_put_contents( $this->articleFileName, $source );
- file_put_contents( $this->patchFileName, $diff );
- $error = wfShellExec(
- wfEscapeShellArg(
- 'patch',
- '-n',
- '-r', '-',
- '--no-backup-if-mismatch',
- '--binary',
- $this->articleFileName,
- $this->patchFileName
- ) . ' 2>&1',
- $status
- );
- $text = file_get_contents( $this->articleFileName );
- if ( $status || $text === false ) {
- return false;
- } else {
- return $text;
- }
- }
-
- function resolveFailedDiff( $origText, $diff ) {
- $context = array();
- $diffLines = explode( "\n", $diff );
- for ( $i = 0; $i < count( $diffLines ); $i++ ) {
- $diffLine = $diffLines[$i];
- if ( !preg_match( '/^(\d+)(?:,\d+)?[acd]\d+(?:,\d+)?$/', $diffLine, $m ) ) {
- continue;
- }
-
- $sourceIndex = intval( $m[1] );
- $i++;
- while ( $i < count( $diffLines ) && substr( $diffLines[$i], 0, 1 ) === '<' ) {
- $context[$sourceIndex - 1] = substr( $diffLines[$i], 2 );
- $sourceIndex++;
- $i++;
- }
- $i--;
- }
-
- $changedLinks = array();
- $origLines = explode( "\n", $origText );
- foreach ( $context as $i => $contextLine ) {
- $origLine = isset( $origLines[$i] ) ? $origLines[$i] : '';
- if ( $contextLine === $origLine ) {
- continue;
- }
- $newChanges = $this->resolveTextChange( $origLine, $contextLine );
- if ( is_array( $newChanges ) ) {
- $changedLinks += $newChanges;
- } else {
- echo "Resolution failure on line " . ( $i + 1 ) . "\n";
- $this->printLatin1( $newChanges );
- }
- }
-
- return $changedLinks;
- }
-
- function resolveTextChange( $source, $dest ) {
- $changedLinks = array();
- $sourceLinks = $this->getLinkList( $source );
- $destLinks = $this->getLinkList( $dest );
- $newLinks = array_diff( $destLinks, $sourceLinks );
- $removedLinks = array_diff( $sourceLinks, $destLinks );
-
- // Match up the removed links with the new links
- foreach ( $newLinks as $newLink ) {
- $minDistance = 100000000;
- $bestRemovedLink = false;
- foreach ( $removedLinks as $removedLink ) {
- $editDistance = levenshtein( $newLink, $removedLink );
- if ( $editDistance < $minDistance ) {
- $minDistance = $editDistance;
- $bestRemovedLink = $removedLink;
- }
- }
- if ( $bestRemovedLink !== false ) {
- $changedLinks[$bestRemovedLink] = $newLink;
- $newLinks = array_diff( $newLinks, array( $newLink ) );
- $removedLinks = array_diff( $removedLinks, array( $bestRemovedLink ) );
- }
- }
-
- $proposal = $source;
- foreach ( $changedLinks as $removedLink => $newLink ) {
- $proposal = $this->substituteTextLinks( $removedLink, $newLink, $proposal );
- }
- if ( $proposal !== $dest ) {
- // Resolution failed
- $msg = "Source line: $source\n" .
- "Source links: " . implode( ', ', $sourceLinks ) . "\n" .
- "Context line: $dest\n" .
- "Context links: " . implode( ', ', $destLinks ) . "\n" .
- "Proposal: $proposal\n";
- return $msg;
- }
- return $changedLinks;
- }
-
- function processDiffFile( $callback ) {
- $diffFile = fopen( "{$this->dataDir}/diff_log", 'r' );
-
- $delimiter = "------\n";
- file_put_contents( $this->articleFileName, "Describe the new page here.\n" );
-
- $line = fgets( $diffFile );
- $lineNum = 1;
- if ( $line !== $delimiter ) {
- echo "Invalid diff file\n";
- return false;
- }
- $lastReportLine = 0;
- $this->numRevs = 0;
-
- while ( true ) {
- $line = fgets( $diffFile );
- $lineNum++;
- if ( $line === false ) {
- break;
- }
- if ( $lineNum > $lastReportLine + 1000 ) {
- $lastReportLine = $lineNum;
- fwrite( STDERR, "$lineNum \r" );
- fflush( STDERR );
- }
- $line = trim( $line );
- if ( !preg_match( '/^([^|]+)\|(\d+)$/', $line, $matches ) ) {
- echo "Invalid header on line $lineNum\n";
- return true;
- }
- list( , $title, $editTime ) = $matches;
-
- $diff = '';
- $diffStartLine = $lineNum;
- while ( true ) {
- $line = fgets( $diffFile );
- $lineNum++;
- if ( $line === $delimiter ) {
- break;
- }
- if ( $line === false ) {
- break 2;
- }
- $diff .= $line;
- }
-
- $this->numRevs++;
-
- if ( !isset( $this->rc[$editTime] ) ) {
- $this->printLatin1( "$editTime $title DELETED, skipping\n" );
- continue;
- }
-
- if ( count( $this->rc[$editTime] ) == 1 ) {
- $params = $this->rc[$editTime][0];
- } else {
- $params = false;
- $candidates = '';
- foreach ( $this->rc[$editTime] as $rc ) {
- if ( $rc['rctitle'] === $title ) {
- $params = $rc;
- break;
- }
- if ( $candidates === '' ) {
- $candidates = $rc['rctitle'];
- } else {
- $candidates .= ', ' . $rc['rctitle'];
- }
- }
- if ( !$params ) {
- $this->printLatin1( "$editTime $title ERROR cannot resolve rclog\n" );
- $this->printLatin1( "$editTime $title CANDIDATES: $candidates\n" );
- continue;
- }
- }
- $params['diff'] = $diff;
- $params['title'] = $title;
- $params['diffStartLine'] = $diffStartLine;
- call_user_func( $callback, $params );
- }
- echo "\n";
-
- if ( !feof( $diffFile ) ) {
- echo "Stopped at line $lineNum\n";
- }
- return true;
- }
-
- function reconcileCurrentRevs() {
- foreach ( $this->textCache as $title => $text ) {
- $fileName = "{$this->dataDir}/page/";
- if ( preg_match( '/^[A-Z]/', $title, $m ) ) {
- $fileName .= $m[0];
- } else {
- $fileName .= 'other';
- }
- $fileName .= "/$title.db";
-
- if ( !file_exists( $fileName ) ) {
- $this->printLatin1( "ERROR: Cannot find page file for {$title}\n" );
- continue;
- }
-
- $fileContents = file_get_contents( $fileName );
- $page = $this->unserializeUseMod( $fileContents, $this->FS1 );
- $section = $this->unserializeUseMod( $page['text_default'], $this->FS2 );
- $data = $this->unserializeUseMod( $section['data'], $this->FS3 );
- $pageText = $data['text'];
- if ( $text !== $pageText ) {
- $substs = $this->resolveTextChange( $text, $pageText );
- if ( is_array( $substs ) ) {
- foreach ( $substs as $source => $dest ) {
- if ( isset( $this->moveLog[$dest] ) ) {
- $this->printLatin1( "ERROR: need deep rename: $source\n" );
- } else {
- $this->printLatin1( "ERROR: need substitute: $source -> $dest\n" );
- }
- }
- } else {
- $this->printLatin1( "ERROR: unresolved diff in $title:\n" );
- wfSuppressWarnings();
- $diff = xdiff_string_diff( $text, $pageText ) . '';
- wfRestoreWarnings();
- $this->printLatin1( "$diff\n" );
- }
- }
- }
- }
-
- function makeTitle( $titleText ) {
- return Title::newFromText( $this->encode( $titleText ) );
- }
-
- function getText( $titleText ) {
- if ( !isset( $this->textCache[$titleText] ) ) {
- return "Describe the new page here.\n";
- } else {
- return $this->textCache[$titleText];
- }
- }
-
- function saveRevision( $params ) {
- $this->textCache[$params['rctitle']] = $params['text'];
-
- $out = "<page>\n" .
- $this->element( 'title', $params['rctitle'] ) .
- "<revision>\n" .
- $this->element( 'id', $this->revId ++ ) .
- $this->element( 'timestamp', wfTimestamp( TS_ISO_8601, $params['timestamp'] ) ) .
- "<contributor>\n";
- if ( isset( $params['extra']['name'] ) ) {
- $out .= $this->element( 'username', $params['extra']['name'] );
- }
- if ( isset( $params['extra']['id'] ) ) {
- $out .= $this->element( 'id', $params['extra']['id'] );
- }
- if ( isset( $params['host'] ) ) {
- $out .= $this->element( 'ip', $params['host'] );
- }
- $out .=
- "</contributor>\n" .
- $this->element( 'comment', $params['summary'] ) .
- "<text xml:space=\"preserve\">" .
- htmlspecialchars( $this->encode( $params['text'] ) ) .
- "</text>\n" .
- "</revision>\n" .
- "</page>\n";
- fwrite( $this->outFile, $out );
- }
-
- function renameTextLinks( $old, $new, $timestamp ) {
- $newWithUnderscores = $new;
- $old = str_replace( '_', ' ', $old );
- $new = str_replace( '_', ' ', $new );
-
- foreach ( $this->textCache as $title => $oldText ) {
- if ( $newWithUnderscores === $title
- && in_array( $title, $this->skipSelfSubstitution ) )
- {
- // Hack to make Pythagorean_Theorem etc. work
- continue;
- }
-
- $newText = $this->substituteTextLinks( $old, $new, $oldText );
- if ( $oldText !== $newText ) {
- $this->saveRevision( array(
- 'rctitle' => $title,
- 'timestamp' => $timestamp,
- 'text' => $newText,
- 'extra' => array( 'name' => 'Page move link fixup script' ),
- 'summary' => '',
- 'minor' => true
- ) );
- }
- }
- }
-
- function substituteTextLinks( $old, $new, $text ) {
- $this->saveUrl = array();
- $this->old = $old;
- $this->new = $new;
-
- $text = str_replace( $this->FS, '', $text ); # Remove separators (paranoia)
- $text = preg_replace_callback( '/(<pre>(.*?)<\/pre>)/is',
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( '/(<code>(.*?)<\/code>)/is',
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( '/(<nowiki>(.*?)<\/nowiki>)/s',
- array( $this, 'storeRaw' ), $text );
-
- $text = preg_replace_callback( "/\[\[{$this->FreeLinkPattern}\|([^\]]+)\]\]/",
- array( $this, 'subFreeLink' ), $text );
- $text = preg_replace_callback( "/\[\[{$this->FreeLinkPattern}\]\]/",
- array( $this, 'subFreeLink' ), $text );
- $text = preg_replace_callback( "/(\[{$this->UrlPattern}\s+([^\]]+?)\])/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/(\[{$this->InterLinkPattern}\s+([^\]]+?)\])/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/(\[?{$this->UrlPattern}\]?)/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/(\[?{$this->InterLinkPattern}\]?)/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/{$this->LinkPattern}/",
- array( $this, 'subWikiLink' ), $text );
-
- $text = preg_replace_callback( "/{$this->FS}(\d+){$this->FS}/",
- array( $this, 'restoreRaw' ), $text ); # Restore saved text
- return $text;
- }
-
- function getLinkList( $text ) {
- $this->saveUrl = array();
- $this->linkList = array();
-
- $text = str_replace( $this->FS, '', $text ); # Remove separators (paranoia)
- $text = preg_replace_callback( '/(<pre>(.*?)<\/pre>)/is',
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( '/(<code>(.*?)<\/code>)/is',
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( '/(<nowiki>(.*?)<\/nowiki>)/s',
- array( $this, 'storeRaw' ), $text );
-
- $text = preg_replace_callback( "/\[\[{$this->FreeLinkPattern}\|([^\]]+)\]\]/",
- array( $this, 'storeLink' ), $text );
- $text = preg_replace_callback( "/\[\[{$this->FreeLinkPattern}\]\]/",
- array( $this, 'storeLink' ), $text );
- $text = preg_replace_callback( "/(\[{$this->UrlPattern}\s+([^\]]+?)\])/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/(\[{$this->InterLinkPattern}\s+([^\]]+?)\])/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/(\[?{$this->UrlPattern}\]?)/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/(\[?{$this->InterLinkPattern}\]?)/",
- array( $this, 'storeRaw' ), $text );
- $text = preg_replace_callback( "/{$this->LinkPattern}/",
- array( $this, 'storeLink' ), $text );
-
- return $this->linkList;
- }
-
- function storeRaw( $m ) {
- $this->saveUrl[] = $m[1];
- return $this->FS . (count( $this->saveUrl ) - 1) . $this->FS;
- }
-
- function subFreeLink( $m ) {
- $link = $m[1];
- if ( isset( $m[2] ) ) {
- $name = $m[2];
- } else {
- $name = '';
- }
- $oldlink = $link;
- $link = preg_replace( '/^\s+/', '', $link );
- $link = preg_replace( '/\s+$/', '', $link );
- if ( $link == $this->old ) {
- $link = $this->new;
- } else {
- $link = $oldlink; # Preserve spaces if no match
- }
- $link = "[[$link";
- if ( $name !== "" ) {
- $link .= "|$name";
- }
- $link .= "]]";
- return $this->storeRaw( array( 1 => $link ) );
- }
-
- function subWikiLink( $m ) {
- $link = $m[1];
- if ( $link == $this->old ) {
- $link = $this->new;
- if ( !preg_match( "/^{$this->LinkPattern}$/", $this->new ) ) {
- $link = "[[$link]]";
- }
- }
- return $this->storeRaw( array( 1 => $link ) );
- }
-
- function restoreRaw( $m ) {
- return $this->saveUrl[$m[1]];
- }
-
- function storeLink( $m ) {
- $this->linkList[] = $m[1];
- return $this->storeRaw( $m );
- }
-
- function encode( $s ) {
- return strtr( $s, $this->encodeMap );
- }
-
- function decode( $s ) {
- return strtr( $s, $this->decodeMap );
- }
-
- function printLatin1( $s ) {
- echo $this->encode( $s );
- }
-
- function unserializeUseMod( $s, $sep ) {
- $parts = explode( $sep, $s );
- $result = array();
- for ( $i = 0; $i < count( $parts ); $i += 2 ) {
- $result[$parts[$i]] = $parts[$i+1];
- }
- return $result;
- }
-}
-
-$maintClass = 'ImportUseModWikipedia';
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/install.php b/maintenance/install.php
index dba43400..9a408aa6 100644
--- a/maintenance/install.php
+++ b/maintenance/install.php
@@ -51,6 +51,7 @@ class CommandLineInstaller extends Maintenance {
$this->addOption( 'dbport', 'The database port; only for PostgreSQL (5432)', false, true );
$this->addOption( 'dbname', 'The database name (my_wiki)', false, true );
$this->addOption( 'dbpath', 'The path for the SQLite DB (/var/data)', false, true );
+ $this->addOption( 'dbprefix', 'Optional database table name prefix', false, true );
$this->addOption( 'installdbuser', 'The user to use for installing (root)', false, true );
$this->addOption( 'installdbpass', 'The pasword for the DB user to install as.', false, true );
$this->addOption( 'dbuser', 'The user to use for normal operations (wikiuser)', false, true );
diff --git a/maintenance/jsparse.php b/maintenance/jsparse.php
index ae6f1f1d..da6798e1 100644
--- a/maintenance/jsparse.php
+++ b/maintenance/jsparse.php
@@ -32,7 +32,6 @@ class JSParseHelper extends Maintenance {
}
public function execute() {
- $iterations = $this->getOption( 'i', 100 );
if ( $this->hasArg() ) {
$files = $this->mArgs;
} else {
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php
index c6d03641..befd0d72 100644
--- a/maintenance/language/StatOutputs.php
+++ b/maintenance/language/StatOutputs.php
@@ -21,7 +21,7 @@ if ( !defined( 'MEDIAWIKI' ) ) die();
* @file
* @ingroup MaintenanceLanguage
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Antoine Musso <hashar at free dot fr>
*/
/** A general output object. Need to be overriden */
@@ -54,7 +54,7 @@ class wikiStatsOutput extends statsOutput {
echo 'English (en) is excluded because it is the default localization';
if( is_array( $wgDummyLanguageCodes ) ) {
$dummyCodes = array();
- foreach( $wgDummyLanguageCodes as $dummyCode ) {
+ foreach( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
$dummyCodes[] = $wgContLang->getLanguageName( $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 );
diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc
index 1e4b94a2..8ab6125b 100644
--- a/maintenance/language/checkLanguage.inc
+++ b/maintenance/language/checkLanguage.inc
@@ -304,17 +304,17 @@ ENDS;
/**
* Check a language.
- * @param $code The language code.
- * @return The results.
+ * @param $code string The language code.
+ * @return array The results.
*/
protected function checkLanguage( $code ) {
# Syntax check only
+ $results = array();
if ( $this->level === 0 ) {
$this->L->getMessages( $code );
- return;
+ return $results;
}
- $results = array();
$checkFunctions = $this->getChecks();
$checkBlacklist = $this->getCheckBlacklist();
foreach ( $this->checks as $check ) {
@@ -643,7 +643,7 @@ ENDS;
/**
* Check a language and show the results.
- * @param $code The language code.
+ * @param $code string The language code.
*/
protected function checkLanguage( $code ) {
foreach( $this->extensions as $extension ) {
diff --git a/maintenance/language/function-list.php b/maintenance/language/function-list.php
deleted file mode 100644
index 7b0e57c2..00000000
--- a/maintenance/language/function-list.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-define( 'MEDIAWIKI', 1 );
-define( 'NOT_REALLY_MEDIAWIKI', 1 );
-
-class Language { }
-foreach ( glob( 'Language*.php' ) as $file ) {
- if ( $file != 'Language.php' ) {
- require_once( $file );
- }
-}
-
-$removedFunctions = array( 'date', 'time', 'timeanddate', 'formatMonth', 'formatDay',
- 'getMonthName', 'getMonthNameGen', 'getMonthAbbreviation', 'getWeekdayName',
- 'userAdjust', 'dateFormat', 'timeSeparator', 'timeDateSeparator', 'timeBeforeDate',
- 'monthByLatinNumber', 'getSpecialMonthName',
-
- 'commafy'
-);
-
-$numRemoved = 0;
-$total = 0;
-$classes = get_declared_classes();
-ksort( $classes );
-foreach ( $classes as $class ) {
- if ( !preg_match( '/^Language/', $class ) || $class == 'Language' || $class == 'LanguageConverter' ) {
- continue;
- }
-
- print "$class\n";
- $methods = get_class_methods( $class );
- print_r( $methods );
-
- if ( !count( array_diff( $methods, $removedFunctions ) ) ) {
- print "removed\n";
- $numRemoved++;
- }
- $total++;
- print "\n";
-}
-
-print "$numRemoved will be removed out of $total\n";
-
-
diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php
index 2c3ffedc..e5ce5c87 100644
--- a/maintenance/language/generateCollationData.php
+++ b/maintenance/language/generateCollationData.php
@@ -1,4 +1,8 @@
<?php
+/**
+ * @ingroup Maintenance
+ * @file
+ */
require_once( dirname( __FILE__ ) .'/../Maintenance.php' );
@@ -12,7 +16,7 @@ class GenerateCollationData extends Maintenance {
/** The primary weights, indexed by codepoint */
var $weights;
- /**
+ /**
* A hashtable keyed by codepoint, where presence indicates that a character
* has a decomposition mapping. This makes it non-preferred for group header
* selection.
@@ -30,7 +34,7 @@ class GenerateCollationData extends Maintenance {
public function __construct() {
parent::__construct();
$this->addOption( 'data-dir', 'A directory on the local filesystem ' .
- 'containing allkeys.txt and ucd.all.grouped.xml from unicode.org',
+ 'containing allkeys.txt and ucd.all.grouped.xml from unicode.org',
false, true );
$this->addOption( 'debug-output', 'Filename for sending debug output to',
false, true );
@@ -72,7 +76,7 @@ class GenerateCollationData extends Maintenance {
// but do not skip a normal space (U+0020) since
// people like to use that as a fake no header symbol.
$category = substr( $data['gc'], 0, 1 );
- if ( strpos( 'LNPS', $category ) === false
+ if ( strpos( 'LNPS', $category ) === false
&& $data['cp'] !== '0020' ) {
return;
}
@@ -84,7 +88,7 @@ class GenerateCollationData extends Maintenance {
return;
}
- // Skip the composed Hangul syllables, we will use the bare Jamo
+ // Skip the composed Hangul syllables, we will use the bare Jamo
// as first letters
if ( $data['block'] == 'Hangul Syllables' ) {
return;
@@ -163,7 +167,7 @@ class GenerateCollationData extends Maintenance {
}
$this->weights[$cp] = $primary;
if ( $tertiary === '.0008'
- || $tertiary === '.000E' )
+ || $tertiary === '.000E' )
{
$goodTertiaryChars[$cp] = true;
}
@@ -192,8 +196,8 @@ class GenerateCollationData extends Maintenance {
}
// If one character has a given primary weight sequence, and a second
- // character has a longer primary weight sequence with an initial
- // portion equal to the first character, then remove the second
+ // character has a longer primary weight sequence with an initial
+ // portion equal to the first character, then remove the second
// character. This avoids having characters like U+A732 (double A)
// polluting the basic latin sort area.
@@ -306,11 +310,12 @@ class UcdXmlReader {
while ( $this->xml->name !== 'ucd' && $this->xml->read() );
$this->xml->read();
return $this->xml;
- }
+ }
/**
- * Read the attributes of the current element node and return them
+ * Read the attributes of the current element node and return them
* as an array
+ * @return array
*/
protected function readAttributes() {
$attrs = array();
diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc
index 60b1112f..06102ac1 100644
--- a/maintenance/language/languages.inc
+++ b/maintenance/language/languages.inc
@@ -61,7 +61,7 @@ class languages {
/**
* Get the language list.
*
- * @return The language list.
+ * @return array The language list.
*/
public function getLanguages() {
return $this->mLanguages;
@@ -70,7 +70,7 @@ class languages {
/**
* Get the ignored messages list.
*
- * @return The ignored messages list.
+ * @return array The ignored messages list.
*/
public function getIgnoredMessages() {
return $this->mIgnoredMessages;
@@ -79,7 +79,7 @@ class languages {
/**
* Get the optional messages list.
*
- * @return The optional messages list.
+ * @return array The optional messages list.
*/
public function getOptionalMessages() {
return $this->mOptionalMessages;
@@ -137,7 +137,7 @@ class languages {
* obsolete - messages which should not be translated, either because they do not exist, or they are ignored messages.
* translated - messages which are either required or optional, but translated from English and needed.
*
- * @param $code The language code.
+ * @param $code string The language code.
*/
private function loadMessages( $code ) {
if ( isset( $this->mMessages[$code] ) ) {
@@ -203,7 +203,7 @@ class languages {
* obsolete - messages which should not be translated, either because they do not exist, or they are ignored messages.
* translated - messages which are either required or optional, but translated from English and needed.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
* @return string The messages in this language.
*/
@@ -220,7 +220,7 @@ class languages {
* ignored - messages which should not be translated to other languages.
* translatable - messages which are either required or optional, but can be translated from English.
*
- * @return The general English messages.
+ * @return array The general English messages.
*/
public function getGeneralMessages() {
$this->loadGeneralMessages();
@@ -230,9 +230,9 @@ class languages {
/**
* Get fallback language code for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return Fallback code.
+ * @return string Fallback code.
*/
public function getFallback( $code ) {
$this->loadFile( $code );
@@ -242,7 +242,7 @@ class languages {
/**
* Get namespace names for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
* @return Namespace names.
*/
@@ -254,7 +254,7 @@ class languages {
/**
* Get namespace aliases for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
* @return Namespace aliases.
*/
@@ -266,7 +266,7 @@ class languages {
/**
* Get magic words for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
* @return Magic words.
*/
@@ -278,7 +278,7 @@ class languages {
/**
* Get special page aliases for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
* @return Special page aliases.
*/
@@ -290,9 +290,9 @@ class languages {
/**
* Get the untranslated messages for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The untranslated messages for this language.
+ * @return array The untranslated messages for this language.
*/
public function getUntranslatedMessages( $code ) {
$this->loadGeneralMessages();
@@ -303,9 +303,9 @@ class languages {
/**
* Get the duplicate messages for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The duplicate messages for this language.
+ * @return array The duplicate messages for this language.
*/
public function getDuplicateMessages( $code ) {
$this->loadGeneralMessages();
@@ -322,9 +322,9 @@ class languages {
/**
* Get the obsolete messages for a specific language.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The obsolete messages for this language.
+ * @return array The obsolete messages for this language.
*/
public function getObsoleteMessages( $code ) {
$this->loadGeneralMessages();
@@ -335,9 +335,9 @@ class languages {
/**
* Get the messages whose variables do not match the original ones.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The messages whose variables do not match the original ones.
+ * @return array The messages whose variables do not match the original ones.
*/
public function getMessagesWithMismatchVariables( $code ) {
$this->loadGeneralMessages();
@@ -366,9 +366,9 @@ class languages {
/**
* Get the messages which do not use plural.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The messages which do not use plural in this language.
+ * @return array The messages which do not use plural in this language.
*/
public function getMessagesWithoutPlural( $code ) {
$this->loadGeneralMessages();
@@ -385,9 +385,9 @@ class languages {
/**
* Get the empty messages.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The empty messages for this language.
+ * @return array The empty messages for this language.
*/
public function getEmptyMessages( $code ) {
$this->loadGeneralMessages();
@@ -404,9 +404,9 @@ class languages {
/**
* Get the messages with trailing whitespace.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The messages with trailing whitespace in this language.
+ * @return array The messages with trailing whitespace in this language.
*/
public function getMessagesWithWhitespace( $code ) {
$this->loadGeneralMessages();
@@ -423,9 +423,9 @@ class languages {
/**
* Get the non-XHTML messages.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The non-XHTML messages for this language.
+ * @return array The non-XHTML messages for this language.
*/
public function getNonXHTMLMessages( $code ) {
$this->loadGeneralMessages();
@@ -451,9 +451,9 @@ class languages {
/**
* Get the messages which include wrong characters.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The messages which include wrong characters in this language.
+ * @return array The messages which include wrong characters in this language.
*/
public function getMessagesWithWrongChars( $code ) {
$this->loadGeneralMessages();
@@ -488,9 +488,9 @@ class languages {
/**
* Get the messages which include dubious links.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The messages which include dubious links in this language.
+ * @return array The messages which include dubious links in this language.
*/
public function getMessagesWithDubiousLinks( $code ) {
$this->loadGeneralMessages();
@@ -517,9 +517,9 @@ class languages {
/**
* Get the messages which include unbalanced brackets.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The messages which include unbalanced brackets in this language.
+ * @return array The messages which include unbalanced brackets in this language.
*/
public function getMessagesWithUnbalanced( $code ) {
$this->loadGeneralMessages();
@@ -547,7 +547,7 @@ class languages {
if ( $a !== $b || $c !== $d ) {
$messages[$key] = "$a, $b, $c, $d";
}
-
+
}
return $messages;
}
@@ -555,9 +555,9 @@ class languages {
/**
* Get the untranslated namespace names.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The untranslated namespace names in this language.
+ * @return array The untranslated namespace names in this language.
*/
public function getUntranslatedNamespaces( $code ) {
$this->loadFile( 'en' );
@@ -570,9 +570,9 @@ class languages {
/**
* Get the project talk namespace names with no $1.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The problematic project talk namespaces in this language.
+ * @return array The problematic project talk namespaces in this language.
*/
public function getProblematicProjectTalks( $code ) {
$this->loadFile( $code );
@@ -599,9 +599,9 @@ class languages {
/**
* Get the untranslated magic words.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The untranslated magic words in this language.
+ * @return array The untranslated magic words in this language.
*/
public function getUntranslatedMagicWords( $code ) {
$this->loadFile( 'en' );
@@ -618,9 +618,9 @@ class languages {
/**
* Get the obsolete magic words.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The obsolete magic words in this language.
+ * @return array The obsolete magic words in this language.
*/
public function getObsoleteMagicWords( $code ) {
$this->loadFile( 'en' );
@@ -637,9 +637,9 @@ class languages {
/**
* Get the magic words that override the original English magic word.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The overriding magic words in this language.
+ * @return array The overriding magic words in this language.
*/
public function getOverridingMagicWords( $code ) {
$this->loadFile( 'en' );
@@ -666,9 +666,9 @@ class languages {
/**
* Get the magic words which do not match the case-sensitivity of the original words.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The magic words whose case does not match in this language.
+ * @return array The magic words whose case does not match in this language.
*/
public function getCaseMismatchMagicWords( $code ) {
$this->loadFile( 'en' );
@@ -689,9 +689,9 @@ class languages {
/**
* Get the untranslated special page names.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The untranslated special page names in this language.
+ * @return array The untranslated special page names in this language.
*/
public function getUntraslatedSpecialPages( $code ) {
$this->loadFile( 'en' );
@@ -708,9 +708,9 @@ class languages {
/**
* Get the obsolete special page names.
*
- * @param $code The language code.
+ * @param $code string The language code.
*
- * @return The obsolete special page names in this language.
+ * @return array The obsolete special page names in this language.
*/
public function getObsoleteSpecialPages( $code ) {
$this->loadFile( 'en' );
@@ -726,7 +726,11 @@ class languages {
}
class extensionLanguages extends languages {
- private $mMessageGroup; # The message group
+
+ /**
+ * @var MessageGroup
+ */
+ private $mMessageGroup;
/**
* Load the messages group.
@@ -743,7 +747,7 @@ class extensionLanguages extends languages {
/**
* Get the extension name.
*
- * @return The extension name.
+ * @return string The extension name.
*/
public function name() {
return $this->mMessageGroup->getLabel();
@@ -752,7 +756,7 @@ class extensionLanguages extends languages {
/**
* Load the language file.
*
- * @param $code The language code.
+ * @param $code string The language code.
*/
protected function loadFile( $code ) {
if( !isset( $this->mRawMessages[$code] ) ) {
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
index 62374500..1c33667a 100644
--- a/maintenance/language/messageTypes.inc
+++ b/maintenance/language/messageTypes.inc
@@ -90,6 +90,8 @@ $wgIgnoredMessages = array(
'accesskey-blockip-block',
'accesskey-export',
'accesskey-import',
+ 'accesskey-watchlistedit-normal-submit',
+ 'accesskey-watchlistedit-raw-submit',
'addsection',
'talkpageheader',
'anonnotice',
@@ -125,7 +127,6 @@ $wgIgnoredMessages = array(
'revision-nav',
'rfcurl',
'shareddescriptionfollows',
- 'signature',
'signature-anon',
'signupstart',
'signupend',
@@ -181,7 +182,6 @@ $wgIgnoredMessages = array(
'unusedtemplates-summary',
'fewestrevisions-summary',
'upload-summary',
- 'newuserlogentry',
'wantedtemplates-summary',
'activeusers-summary',
'search-summary',
@@ -189,6 +189,8 @@ $wgIgnoredMessages = array(
'addsection-preload',
'addsection-editintro',
'longpage-hint',
+ 'javascripttest-backlink',
+ 'javascripttest-qunit-name',
);
/** Optional messages, which may be translated only if changed in the target language. */
@@ -197,7 +199,6 @@ $wgOptionalMessages = array(
'editsection-brackets',
'feed-atom',
'feed-rss',
- 'sectionlink',
'unit-pixel',
'userrights-irreversible-marker',
'tog-nolangconversion',
@@ -233,6 +234,9 @@ $wgOptionalMessages = array(
'variantname-ike-cans',
'variantname-ike-latn',
'variantname-iu',
+ 'variantname-shi-tfng',
+ 'variantname-shi-latn',
+ 'variantname-shi',
'rc-change-size',
'resetpass_text',
'image_sample',
@@ -314,10 +318,6 @@ $wgOptionalMessages = array(
'minutes-abbrev',
'hours-abbrev',
'days-abbrev',
- 'filerevert-backlink',
- 'filedelete-backlink',
- 'delete-backlink',
- 'protect-backlink',
'pagetitle',
'filename-prefix-blacklist',
'edittools',
@@ -326,6 +326,20 @@ $wgOptionalMessages = array(
'size-kilobytes',
'size-megabytes',
'size-gigabytes',
+ 'size-terabytes',
+ 'size-petabytes',
+ 'size-exabytes',
+ 'size-zetabytes',
+ 'size-yottabytes',
+ 'bitrate-bits',
+ 'bitrate-kilobits',
+ 'bitrate-megabits',
+ 'bitrate-gigabits',
+ 'bitrate-terabits',
+ 'bitrate-petabits',
+ 'bitrate-exabits',
+ 'bitrate-zetabits',
+ 'bitrate-yottabits',
'iranian-calendar-m1',
'iranian-calendar-m2',
'iranian-calendar-m3',
@@ -392,13 +406,10 @@ $wgOptionalMessages = array(
'listgrouprights-right-display',
'listgrouprights-right-revoked',
'timezone-utc',
- 'whatlinkshere-backlink',
- 'recentchangeslinked-backlink',
'unpatrolledletter',
'diff-with-additional',
'pagetitle-view-mainpage',
- 'trackback',
- 'trackbackexcerpt',
+ 'backlinksubtitle',
'prefs-registration-date-time',
'prefs-memberingroups-type',
'shared-repo-name-wikimediacommons',
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
index d707cf5d..bdd4d397 100644
--- a/maintenance/language/messages.inc
+++ b/maintenance/language/messages.inc
@@ -301,6 +301,7 @@ $wgMessageStructure = array(
'ok',
'pagetitle',
'pagetitle-view-mainpage',
+ 'backlinksubtitle',
'retrievedfrom',
'youhavenewmessages',
'newmessageslink',
@@ -385,6 +386,7 @@ $wgMessageStructure = array(
'formerror',
'badarticleerror',
'cannotdelete',
+ 'cannotdelete-title',
'badtitle',
'badtitletext',
'perfcached',
@@ -392,11 +394,12 @@ $wgMessageStructure = array(
'querypage-no-updates',
'wrong_wfQuery_params',
'viewsource',
- 'viewsourcefor',
+ 'viewsource-title',
'actionthrottled',
'actionthrottledtext',
'protectedpagetext',
'viewsourcetext',
+ 'viewyourtext',
'protectedinterface',
'editinginterface',
'sqlhidden',
@@ -480,6 +483,7 @@ $wgMessageStructure = array(
'noemailprefs',
'emailconfirmlink',
'invalidemailaddress',
+ 'cannotchangeemail',
'accountcreated',
'accountcreatedtext',
'createaccount-title',
@@ -495,6 +499,7 @@ $wgMessageStructure = array(
'pear-mail-error',
'php-mail-error',
'php-mail-error-unknown',
+ 'user-mail-no-addy',
),
'resetpass' => array(
'resetpass',
@@ -521,12 +526,27 @@ $wgMessageStructure = array(
'passwordreset-pretext',
'passwordreset-username',
'passwordreset-domain',
+ 'passwordreset-capture',
+ 'passwordreset-capture-help',
'passwordreset-email',
'passwordreset-emailtitle',
'passwordreset-emailtext-ip',
'passwordreset-emailtext-user',
'passwordreset-emailelement',
'passwordreset-emailsent',
+ 'passwordreset-emailsent-capture',
+ 'passwordreset-emailerror-capture',
+ ),
+ 'changeemail' => array(
+ 'changeemail',
+ 'changeemail-header',
+ 'changeemail-text',
+ 'changeemail-no-info',
+ 'changeemail-oldemail',
+ 'changeemail-newemail',
+ 'changeemail-none',
+ 'changeemail-submit',
+ 'changeemail-cancel',
),
'toolbar' => array(
'bold_sample',
@@ -569,9 +589,6 @@ $wgMessageStructure = array(
'blockedtext',
'autoblockedtext',
'blockednoreason',
- 'blockedoriginalsource',
- 'blockededitsource',
- 'whitelistedittitle',
'whitelistedittext',
'confirmedittext',
'nosuchsectiontitle',
@@ -755,10 +772,6 @@ $wgMessageStructure = array(
'revdelete-unsuppress',
'revdelete-log',
'revdelete-submit',
- 'revdelete-logentry',
- 'logdelete-logentry',
- 'revdelete-logaction',
- 'logdelete-logaction',
'revdelete-success',
'revdelete-failure',
'logdelete-success',
@@ -768,15 +781,6 @@ $wgMessageStructure = array(
'revdel-restore-visible',
'pagehist',
'deletedhist',
- 'revdelete-content',
- 'revdelete-summary',
- 'revdelete-uname',
- 'revdelete-restricted',
- 'revdelete-unrestricted',
- 'revdelete-hid',
- 'revdelete-unhid',
- 'revdelete-log-message',
- 'logdelete-log-message',
'revdelete-hide-current',
'revdelete-show-no-access',
'revdelete-modify-no-access',
@@ -938,6 +942,8 @@ $wgMessageStructure = array(
'prefs-watchlist-token',
'prefs-misc', // continue checking if used from here on (r49916)
'prefs-resetpass',
+ 'prefs-changeemail',
+ 'prefs-setemail',
'prefs-email',
'prefs-rendering',
'saveprefs',
@@ -997,6 +1003,7 @@ $wgMessageStructure = array(
'yourrealname',
'yourlanguage',
'yourvariant',
+ 'prefs-help-variant',
'yournick',
'prefs-help-signature',
'badsig',
@@ -1009,7 +1016,7 @@ $wgMessageStructure = array(
'email',
'prefs-help-realname',
- # 3 messages depending upon wgEmailConfirmToEdit and $wgEnableUserEmail
+ # 3 messages depending upon $wgEmailConfirmToEdit and $wgEnableUserEmail
'prefs-help-email',
'prefs-help-email-others',
'prefs-help-email-required',
@@ -1133,13 +1140,13 @@ $wgMessageStructure = array(
'right-autopatrol',
'right-patrolmarks',
'right-unwatchedpages',
- 'right-trackback',
'right-mergehistory',
'right-userrights',
'right-userrights-interwiki',
'right-siteadmin',
'right-override-export-depth',
'right-sendemail',
+ 'right-passwordreset',
),
'rightslog' => array(
'rightslog',
@@ -1173,16 +1180,17 @@ $wgMessageStructure = array(
'action-suppressionlog',
'action-block',
'action-protect',
+ 'action-rollback',
'action-import',
'action-importupload',
'action-patrol',
'action-autopatrol',
'action-unwatchedpages',
- 'action-trackback',
'action-mergehistory',
'action-userrights',
'action-userrights-interwiki',
'action-siteadmin',
+ 'action-sendemail',
),
'recentchanges' => array(
'nchanges',
@@ -1213,12 +1221,12 @@ $wgMessageStructure = array(
'newpageletter',
'boteditletter',
'unpatrolledletter',
- 'sectionlink',
'number_of_watching_users_RCview',
'number_of_watching_users_pageview',
'rc_categories',
'rc_categories_any',
'rc-change-size',
+ 'rc-change-size-new',
'newsectionsummary',
'rc-enhanced-expand',
'rc-enhanced-hide',
@@ -1228,7 +1236,6 @@ $wgMessageStructure = array(
'recentchangeslinked-feed',
'recentchangeslinked-toolbox',
'recentchangeslinked-title',
- 'recentchangeslinked-backlink',
'recentchangeslinked-noresult',
'recentchangeslinked-summary',
'recentchangeslinked-page',
@@ -1265,6 +1272,7 @@ $wgMessageStructure = array(
'ignorewarnings',
'minlength1',
'illegalfilename',
+ 'filename-toolong',
'badfilename',
'filetype-mime-mismatch',
'filetype-badmime',
@@ -1339,6 +1347,43 @@ $wgMessageStructure = array(
'upload-http-error',
),
+ 'filebackend-errors' => array(
+ 'backend-fail-stream',
+ 'backend-fail-backup',
+ 'backend-fail-notexists',
+ 'backend-fail-hashes',
+ 'backend-fail-notsame',
+ 'backend-fail-invalidpath',
+ 'backend-fail-delete',
+ 'backend-fail-alreadyexists',
+ 'backend-fail-store',
+ 'backend-fail-copy',
+ 'backend-fail-move',
+ 'backend-fail-opentemp',
+ 'backend-fail-writetemp',
+ 'backend-fail-closetemp',
+ 'backend-fail-read',
+ 'backend-fail-create',
+ 'backend-fail-readonly',
+ 'backend-fail-synced',
+ 'backend-fail-connect',
+ 'backend-fail-internal',
+ 'backend-fail-contenttype',
+ 'backend-fail-batchsize'
+ ),
+
+ 'lockmanager-errors' => array(
+ 'lockmanager-notlocked',
+ 'lockmanager-fail-closelock',
+ 'lockmanager-fail-deletelock',
+ 'lockmanager-fail-acquirelock',
+ 'lockmanager-fail-openlock',
+ 'lockmanager-fail-releaselock',
+ 'lockmanager-fail-db-bucket',
+ 'lockmanager-fail-db-release',
+ 'lockmanager-fail-svr-release'
+ ),
+
'zip' => array(
'zip-file-open-error',
'zip-wrong-format',
@@ -1354,6 +1399,7 @@ $wgMessageStructure = array(
'uploadstash-badtoken',
'uploadstash-errclear',
'uploadstash-refresh',
+ 'invalid-chunk-offset',
),
'img-auth' => array(
@@ -1448,7 +1494,6 @@ $wgMessageStructure = array(
),
'filerevert' => array(
'filerevert',
- 'filerevert-backlink',
'filerevert-legend',
'filerevert-intro',
'filerevert-comment',
@@ -1459,7 +1504,6 @@ $wgMessageStructure = array(
),
'filedelete' => array(
'filedelete',
- 'filedelete-backlink',
'filedelete-legend',
'filedelete-intro',
'filedelete-intro-old',
@@ -1474,6 +1518,7 @@ $wgMessageStructure = array(
'filedelete-reason-dropdown',
'filedelete-edit-reasonlist',
'filedelete-maintenance',
+ 'filedelete-maintenance-title',
),
'mimesearch' => array(
'mimesearch',
@@ -1591,6 +1636,8 @@ $wgMessageStructure = array(
'wantedpages-badtitle',
'wantedfiles',
'wantedfiles-summary',
+ 'wantedfiletext-cat',
+ 'wantedfiletext-nocat',
'wantedtemplates',
'wantedtemplates-summary',
'mostlinked',
@@ -1606,6 +1653,7 @@ $wgMessageStructure = array(
'mostrevisions',
'mostrevisions-summary',
'prefixindex',
+ 'prefixindex-namespace',
'prefixindex-summary',
'shortpages',
'shortpages-summary',
@@ -1730,11 +1778,6 @@ $wgMessageStructure = array(
'newuserlog' => array(
'newuserlogpage',
'newuserlogpagetext',
- 'newuserlogentry',
- 'newuserlog-byemail',
- 'newuserlog-create-entry',
- 'newuserlog-create2-entry',
- 'newuserlog-autocreate-entry',
),
'listgrouprights' => array(
'listgrouprights',
@@ -1847,15 +1890,12 @@ $wgMessageStructure = array(
'exbeforeblank',
'exblank',
'delete-confirm',
- 'delete-backlink',
'delete-legend',
'historywarning',
'confirmdeletetext',
'actioncomplete',
'actionfailed',
'deletedtext',
- 'deletedarticle',
- 'suppressedarticle',
'dellogpage',
'dellogpagetext',
'deletionlog',
@@ -1892,8 +1932,10 @@ $wgMessageStructure = array(
'unprotectedarticle',
'movedarticleprotection',
'protect-title',
+ 'protect-title-notallowed',
'prot_1movedto2',
- 'protect-backlink',
+ 'protect-badnamespace-title',
+ 'protect-badnamespace-text',
'protect-legend',
'protectcomment',
'protectexpiry',
@@ -1911,6 +1953,7 @@ $wgMessageStructure = array(
'protect-level-sysop',
'protect-summary-cascade',
'protect-expiring',
+ 'protect-expiring-local',
'protect-expiry-indefinite',
'protect-cascade',
'protect-cantedit',
@@ -1960,13 +2003,13 @@ $wgMessageStructure = array(
'undeletereset',
'undeleteinvert',
'undeletecomment',
- 'undeletedarticle',
'undeletedrevisions',
'undeletedrevisions-files',
'undeletedfiles',
'cannotundelete',
'undeletedpage',
'undelete-header',
+ 'undelete-search-title',
'undelete-search-box',
'undelete-search-prefix',
'undelete-search-submit',
@@ -1975,6 +2018,7 @@ $wgMessageStructure = array(
'undelete-bad-store-key',
'undelete-cleanup-error',
'undelete-missing-filearchive',
+ 'undelete-error',
'undelete-error-short',
'undelete-error-long',
'undelete-show-file-confirm',
@@ -2023,7 +2067,6 @@ $wgMessageStructure = array(
'whatlinkshere-title',
'whatlinkshere-summary',
'whatlinkshere-page',
- 'whatlinkshere-backlink',
'linkshere',
'nolinkshere',
'nolinkshere-ns',
@@ -2088,6 +2131,7 @@ $wgMessageStructure = array(
'blocklist-userblocks',
'blocklist-tempblocks',
'blocklist-addressblocks',
+ 'blocklist-rangeblocks',
'blocklist-timestamp',
'blocklist-target',
'blocklist-expiry',
@@ -2112,6 +2156,7 @@ $wgMessageStructure = array(
'unblocklink',
'change-blocklink',
'contribslink',
+ 'emaillink',
'autoblocker',
'blocklogpage',
'blocklog-showlog',
@@ -2202,9 +2247,6 @@ $wgMessageStructure = array(
'movepage-page-moved',
'movepage-page-unmoved',
'movepage-max-pages',
- '1movedto2',
- '1movedto2_redir',
- 'move-redirect-suppressed',
'movelogpage',
'movelogpagetext',
'movesubpage',
@@ -2237,8 +2279,10 @@ $wgMessageStructure = array(
'export' => array(
'export',
'exporttext',
+ 'exportall',
'exportcuronly',
'exportnohistory',
+ 'exportlistauthors',
'export-submit',
'export-addcattext',
'export-addcat',
@@ -2270,6 +2314,8 @@ $wgMessageStructure = array(
'thumbnail_error',
'djvu_page_error',
'djvu_no_xml',
+ 'thumbnail-temp-create',
+ 'thumbnail-dest-create',
'thumbnail_invalid_params',
'thumbnail_dest_directory',
'thumbnail_image-type',
@@ -2311,6 +2357,11 @@ $wgMessageStructure = array(
'import-upload',
'import-token-mismatch',
'import-invalid-interwiki',
+ 'import-error-edit',
+ 'import-error-create',
+ 'import-error-interwiki',
+ 'import-error-special',
+ 'import-error-invalid',
),
'importlog' => array(
'importlogpage',
@@ -2320,6 +2371,19 @@ $wgMessageStructure = array(
'import-logentry-interwiki',
'import-logentry-interwiki-detail',
),
+ 'javaccripttest' => array(
+ 'javascripttest',
+ 'javascripttest-backlink',
+ 'javascripttest-disabled',
+ 'javascripttest-title',
+ 'javascripttest-pagetext-noframework',
+ 'javascripttest-pagetext-unknownframework',
+ 'javascripttest-pagetext-frameworks',
+ 'javascripttest-pagetext-skins' ,
+ 'javascripttest-qunit-name',
+ 'javascripttest-qunit-intro',
+ 'javascripttest-qunit-heading',
+ ),
'accesskeys' => array(
'accesskey-pt-userpage',
'accesskey-pt-anonuserpage',
@@ -2388,6 +2452,8 @@ $wgMessageStructure = array(
'accesskey-blockip-block',
'accesskey-export',
'accesskey-import',
+ 'accesskey-watchlistedit-normal-submit',
+ 'accesskey-watchlistedit-raw-submit',
),
'tooltips' => array(
'tooltip-pt-userpage',
@@ -2450,6 +2516,8 @@ $wgMessageStructure = array(
'tooltip-diff',
'tooltip-compareselectedversions',
'tooltip-watch',
+ 'tooltip-watchlistedit-normal-submit',
+ 'tooltip-watchlistedit-raw-submit',
'tooltip-recreate',
'tooltip-upload',
'tooltip-rollback',
@@ -2554,9 +2622,6 @@ $wgMessageStructure = array(
'patrol-log' => array(
'patrol-log-page',
'patrol-log-header',
- 'patrol-log-line',
- 'patrol-log-auto',
- 'patrol-log-diff',
'log-show-hide-patrol',
),
'imagedeletion' => array(
@@ -2611,6 +2676,11 @@ $wgMessageStructure = array(
'minutes-abbrev',
'hours-abbrev',
'days-abbrev',
+ 'seconds',
+ 'minutes',
+ 'hours',
+ 'days',
+ 'ago',
),
'badimagelist' => array(
'bad_image_list',
@@ -2660,6 +2730,11 @@ $wgMessageStructure = array(
'variantname-ike-latn',
'variantname-iu',
),
+ 'variantname-shi' => array(
+ 'variantname-shi-tfng',
+ 'variantname-shi-latn',
+ 'variantname-shi',
+ ),
'metadata' => array(
'metadata',
'metadata-help',
@@ -3168,14 +3243,6 @@ $wgMessageStructure = array(
'scarytranscludefailed',
'scarytranscludetoolong',
),
- 'trackbacks' => array(
- 'trackbackbox',
- 'trackback',
- 'trackbackexcerpt',
- 'trackbackremove',
- 'trackbacklink',
- 'trackbackdeleteok',
- ),
'deleteconflict' => array(
'deletedwhileediting',
'confirmrecreate',
@@ -3239,6 +3306,22 @@ $wgMessageStructure = array(
'size-kilobytes',
'size-megabytes',
'size-gigabytes',
+ 'size-terabytes',
+ 'size-petabytes',
+ 'size-exabytes',
+ 'size-zetabytes',
+ 'size-yottabytes',
+ ),
+ 'bitrateunits' => array(
+ 'bitrate-bits',
+ 'bitrate-kilobits',
+ 'bitrate-megabits',
+ 'bitrate-gigabits',
+ 'bitrate-terabits',
+ 'bitrate-petabits',
+ 'bitrate-exabits',
+ 'bitrate-zetabits',
+ 'bitrate-yottabits',
),
'livepreview' => array(
'livepreview-loading',
@@ -3431,6 +3514,9 @@ $wgMessageStructure = array(
'compare-rev1',
'compare-rev2',
'compare-submit',
+ 'compare-invalid-title',
+ 'compare-title-not-exists',
+ 'compare-revision-not-exists',
),
'db-error-messages' => array(
'dberr-header',
@@ -3460,6 +3546,91 @@ $wgMessageStructure = array(
'unwatch' => array(
'confirm-unwatch-button',
),
+ 'logging' => array(
+ 'logentry-delete-delete',
+ 'logentry-delete-restore',
+ 'logentry-delete-event',
+ 'logentry-delete-revision',
+ 'logentry-delete-event-legacy',
+ 'logentry-delete-revision-legacy',
+ 'logentry-suppress-delete',
+ 'logentry-suppress-event',
+ 'logentry-suppress-revision',
+ 'logentry-suppress-event-legacy',
+ 'logentry-suppress-revision-legacy',
+ 'revdelete-content-hid',
+ 'revdelete-summary-hid',
+ 'revdelete-uname-hid',
+ 'revdelete-content-unhid',
+ 'revdelete-summary-unhid',
+ 'revdelete-uname-unhid',
+ 'revdelete-restricted',
+ 'revdelete-unrestricted',
+ 'logentry-move-move',
+ 'logentry-move-move-noredirect',
+ 'logentry-move-move_redir',
+ 'logentry-move-move_redir-noredirect',
+ 'logentry-patrol-patrol',
+ 'logentry-patrol-patrol-auto',
+ 'logentry-newusers-newusers',
+ 'logentry-newusers-create',
+ 'logentry-newusers-create2',
+ 'logentry-newusers-autocreate',
+ 'newuserlog-byemail',
+ ),
+ 'feedback' => 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',
+ ),
+ 'apierrors' => array(
+ 'api-error-badaccess-groups',
+ 'api-error-badtoken',
+ 'api-error-copyuploaddisabled',
+ 'api-error-duplicate',
+ 'api-error-duplicate-archive',
+ 'api-error-duplicate-archive-popup-title',
+ 'api-error-duplicate-popup-title',
+ 'api-error-empty-file',
+ 'api-error-emptypage',
+ 'api-error-fetchfileerror',
+ 'api-error-file-too-large',
+ 'api-error-filename-tooshort',
+ 'api-error-filetype-banned',
+ 'api-error-filetype-missing',
+ 'api-error-hookaborted',
+ 'api-error-http',
+ 'api-error-illegal-filename',
+ 'api-error-internal-error',
+ 'api-error-invalid-file-key',
+ 'api-error-missingparam',
+ 'api-error-missingresult',
+ 'api-error-mustbeloggedin',
+ 'api-error-mustbeposted',
+ 'api-error-noimageinfo',
+ 'api-error-nomodule',
+ 'api-error-ok-but-empty',
+ 'api-error-overwrite',
+ 'api-error-stashfailed',
+ 'api-error-timeout',
+ 'api-error-unclassified',
+ 'api-error-unknown-code',
+ 'api-error-unknown-error',
+ 'api-error-unknown-warning',
+ 'api-error-unknownerror',
+ 'api-error-uploaddisabled',
+ 'api-error-verification-error',
+ ),
);
/** Comments for each block */
@@ -3493,6 +3664,7 @@ XHTML id names.",
'passwordstrength' => 'JavaScript password checks',
'resetpass' => 'Change password dialog',
'passwordreset' => 'Special:PasswordReset',
+ 'changeemail' => 'Special:ChangeEmail',
'toolbar' => 'Edit page toolbar',
'edit' => 'Edit pages',
'parserwarnings' => 'Parser/template warnings',
@@ -3522,6 +3694,8 @@ XHTML id names.",
'upload' => 'Upload',
'zip' => 'ZipDirectoryReader',
'upload-errors' => '',
+ 'filebackend-errors' => 'File backend',
+ 'lockmanager-errors' => 'Lock manager',
'uploadstash' => 'Special:UploadStash',
'img-auth' => 'img_auth script messages',
'http-errors' => 'HTTP errors',
@@ -3579,6 +3753,7 @@ XHTML id names.",
'thumbnails' => 'Thumbnails',
'import' => 'Special:Import',
'importlog' => 'Import log',
+ 'javaccripttest' => 'JavaScriptTest',
'accesskeys' => 'Keyboard access keys for power users',
'tooltips' => 'Tooltip help for the actions',
'stylesheets' => 'Stylesheets',
@@ -3605,6 +3780,7 @@ Variants for Chinese language",
'variantname-ku' => 'Variants for Kurdish language',
'variantname-tg' => 'Variants for Tajiki language',
'variantname-iu' => 'Variants for Inuktitut language',
+ 'variantname-shi' => 'Variants for Tachelhit language',
'media-info' => 'Media information',
'metadata' => 'Metadata',
'exif' => 'EXIF tags',
@@ -3657,7 +3833,6 @@ Variants for Chinese language",
'all' => "'all' in various places, this might be different for inflected languages",
'confirmemail' => 'E-mail address confirmation',
'scarytransclusion' => 'Scary transclusion',
- 'trackbacks' => 'Trackbacks',
'deleteconflict' => 'Delete conflict',
'unit-pixel' => '',
'purge' => 'action=purge',
@@ -3668,6 +3843,7 @@ Variants for Chinese language",
'autosumm' => 'Auto-summaries',
'autoblock_whitelist' => 'Autoblock whitelist',
'sizeunits' => 'Size units',
+ 'bitrateunits' => 'Bitrate units',
'livepreview' => 'Live preview',
'lagwarning' => 'Friendlier slave lag warnings',
'watchlisteditor' => 'Watchlist editor',
@@ -3688,5 +3864,7 @@ Variants for Chinese language",
'db-error-messages' => 'Database error messages',
'html-forms' => 'HTML forms',
'sqlite' => 'SQLite database support',
- 'ajax-category' => 'Add categories per AJAX',
+ 'logging' => 'New logging system',
+ 'feedback' => 'Feedback',
+ 'apierrors' => 'API errors',
);
diff --git a/maintenance/language/transstat.php b/maintenance/language/transstat.php
index a3213266..fb08b7d0 100644
--- a/maintenance/language/transstat.php
+++ b/maintenance/language/transstat.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Antoine Musso <hashar at free dot fr>
*
* Output is posted from time to time on:
* http://www.mediawiki.org/wiki/Localisation_statistics
@@ -97,7 +97,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 ) &&
- in_array( $code, $wgDummyLanguageCodes ) ) ) {
+ isset( $wgDummyLanguageCodes[$code] ) ) ) {
continue;
}
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
index 093359ca..524c2ba6 100644
--- a/maintenance/language/writeMessagesArray.inc
+++ b/maintenance/language/writeMessagesArray.inc
@@ -106,6 +106,9 @@ class MessageWriter {
# Sort messages to blocks
$sortedMessages['unknown'] = $messages;
foreach( self::$messageStructure as $blockName => $block ) {
+ /**
+ * @var $block array
+ */
foreach( $block as $key ) {
if( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
$sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
diff --git a/maintenance/locking/LockServerDaemon.php b/maintenance/locking/LockServerDaemon.php
new file mode 100644
index 00000000..1a4a928e
--- /dev/null
+++ b/maintenance/locking/LockServerDaemon.php
@@ -0,0 +1,617 @@
+<?php
+/**
+ * @file
+ * @ingroup LockManager Maintenance
+ */
+
+/**
+ * This code should not require MediaWiki setup or PHP files.
+ */
+if ( php_sapi_name() !== 'cli' ) {
+ die( "This is not a valid entry point.\n" );
+}
+error_reporting( E_ALL );
+
+// Run the server...
+set_time_limit( 0 );
+LockServerDaemon::init(
+ getopt( '', array(
+ 'address:', 'port:', 'authKey:',
+ 'lockTimeout::', 'maxClients::', 'maxBacklog::', 'maxLocks::',
+ ) )
+)->main();
+
+/**
+ * Simple lock server daemon that accepts lock/unlock requests
+ */
+class LockServerDaemon {
+ /** @var resource */
+ protected $sock; // socket to listen/accept on
+ /** @var Array */
+ protected $sessions = array(); // (session => resource)
+ /** @var Array */
+ protected $deadSessions = array(); // (session => UNIX timestamp)
+
+ /** @var LockHolder */
+ protected $lockHolder;
+
+ protected $address; // string IP address
+ protected $port; // integer
+ protected $authKey; // string key
+ protected $lockTimeout; // integer number of seconds
+ protected $maxBacklog; // integer
+ protected $maxClients; // integer
+
+ protected $startTime; // integer UNIX timestamp
+ protected $ticks = 0; // integer counter
+
+ /* @var LockServerDaemon */
+ protected static $instance = null;
+
+ /**
+ * @params $config Array
+ * @return LockServerDaemon
+ */
+ public static function init( array $config ) {
+ if ( self::$instance ) {
+ throw new Exception( 'LockServer already initialized.' );
+ }
+ foreach ( array( 'address', 'port', 'authKey' ) as $par ) {
+ if ( !isset( $config[$par] ) ) {
+ die( "Usage: php LockServerDaemon.php " .
+ "--address <address> --port <port> --authkey <key> " .
+ "[--lockTimeout <seconds>] " .
+ "[--maxLocks <integer>] [--maxClients <integer>] [--maxBacklog <integer>]"
+ );
+ }
+ }
+ self::$instance = new self( $config );
+ return self::$instance;
+ }
+
+ /**
+ * @params $config Array
+ */
+ protected function __construct( array $config ) {
+ // Required parameters...
+ $this->address = $config['address'];
+ $this->port = $config['port'];
+ $this->authKey = $config['authKey'];
+ // Parameters with defaults...
+ $this->lockTimeout = isset( $config['lockTimeout'] )
+ ? (int)$config['lockTimeout']
+ : 60;
+ $this->maxClients = isset( $config['maxClients'] )
+ ? (int)$config['maxClients']
+ : 1000; // less than default FD_SETSIZE
+ $this->maxBacklog = isset( $config['maxBacklog'] )
+ ? (int)$config['maxBacklog']
+ : 100;
+ $maxLocks = isset( $config['maxLocks'] )
+ ? (int)$config['maxLocks']
+ : 10000;
+
+ $this->lockHolder = new LockHolder( $maxLocks );
+ }
+
+ /**
+ * @return void
+ */
+ protected function setupServerSocket() {
+ if ( !function_exists( 'socket_create' ) ) {
+ throw new Exception( "PHP sockets extension missing from PHP CLI mode." );
+ }
+ $sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
+ if ( $sock === false ) {
+ throw new Exception( "socket_create(): " . socket_strerror( socket_last_error() ) );
+ }
+ socket_set_option( $sock, SOL_SOCKET, SO_REUSEADDR, 1 ); // bypass 2MLS
+ socket_set_nonblock( $sock ); // don't block on accept()
+ if ( socket_bind( $sock, $this->address, $this->port ) === false ) {
+ throw new Exception( "socket_bind(): " .
+ socket_strerror( socket_last_error( $sock ) ) );
+ } elseif ( socket_listen( $sock, $this->maxBacklog ) === false ) {
+ throw new Exception( "socket_listen(): " .
+ socket_strerror( socket_last_error( $sock ) ) );
+ }
+ $this->sock = $sock;
+ $this->startTime = time();
+ }
+
+ /**
+ * Entry-point function that listens to the server socket, accepts
+ * new clients, and recieves/responds to requests to lock resources.
+ */
+ public function main() {
+ $this->setupServerSocket(); // setup listening socket
+ $socketArray = new SocketArray(); // sockets being serviced
+ $socketArray->addSocket( $this->sock ); // add listening socket
+ do {
+ list( $read, $write ) = $socketArray->socketsForSelect();
+ if ( socket_select( $read, $write, $except = NULL, NULL ) < 1 ) {
+ continue; // wait
+ }
+ // Check if there is a client trying to connect...
+ if ( in_array( $this->sock, $read ) && $socketArray->size() < $this->maxClients ) {
+ $newSock = socket_accept( $this->sock );
+ if ( $newSock ) {
+ socket_set_option( $newSock, SOL_SOCKET, SO_KEEPALIVE, 1 );
+ socket_set_nonblock( $newSock ); // don't block on read()/write()
+ $socketArray->addSocket( $newSock );
+ }
+ }
+ // Loop through all the clients that have data to read...
+ foreach ( $read as $read_sock ) {
+ if ( $read_sock === $this->sock ) {
+ continue; // skip listening socket
+ }
+ // Avoids PHP_NORMAL_READ per https://bugs.php.net/bug.php?id=33471
+ $data = socket_read( $read_sock, 65535 );
+ // Check if the client is disconnected
+ if ( $data === false || $data === '' ) {
+ $socketArray->closeSocket( $read_sock );
+ $this->recordDeadSocket( $read_sock ); // remove session
+ // Check if we reached the end of a message
+ } elseif ( substr( $data, -1 ) === "\n" ) {
+ // Newline is the last char (given ping-pong message usage)
+ $cmd = $socketArray->readRcvBuffer( $read_sock ) . $data;
+ // Perform the requested command...
+ $response = $this->doCommand( rtrim( $cmd ), $read_sock );
+ // Send the response to the client...
+ $socketArray->appendSndBuffer( $read_sock, $response . "\n" );
+ // Otherwise, we just have more message data to append
+ } elseif ( !$socketArray->appendRcvBuffer( $read_sock, $data ) ) {
+ $socketArray->closeSocket( $read_sock ); // too big
+ $this->recordDeadSocket( $read_sock ); // remove session
+ }
+ }
+ // Loop through all the clients that have data to write...
+ foreach ( $write as $write_sock ) {
+ $bytes = socket_write( $write_sock, $socketArray->readSndBuffer( $write_sock ) );
+ // Check if the client is disconnected
+ if ( $bytes === false ) {
+ $socketArray->closeSocket( $write_sock );
+ $this->recordDeadSocket( $write_sock ); // remove session
+ // Otherwise, truncate these bytes from the start of the write buffer
+ } else {
+ $socketArray->consumeSndBuffer( $write_sock, $bytes );
+ }
+ }
+ // Prune dead locks every few socket events...
+ if ( ++$this->ticks >= 9 ) {
+ $this->ticks = 0;
+ $this->purgeExpiredLocks();
+ }
+ } while ( true );
+ }
+
+ /**
+ * @param $data string
+ * @param $sourceSock resource
+ * @return string
+ */
+ protected function doCommand( $data, $sourceSock ) {
+ $cmdArr = $this->getCommand( $data );
+ if ( is_string( $cmdArr ) ) {
+ return $cmdArr; // error
+ }
+ list( $function, $session, $type, $resources ) = $cmdArr;
+ // On first command, track the session => sock correspondence
+ if ( !isset( $this->sessions[$session] ) ) {
+ $this->sessions[$session] = $sourceSock;
+ unset( $this->deadSessions[$session] ); // renew if dead
+ }
+ if ( $function === 'ACQUIRE' ) {
+ return $this->lockHolder->lock( $session, $type, $resources );
+ } elseif ( $function === 'RELEASE' ) {
+ return $this->lockHolder->unlock( $session, $type, $resources );
+ } elseif ( $function === 'RELEASE_ALL' ) {
+ return $this->lockHolder->release( $session );
+ } elseif ( $function === 'STAT' ) {
+ return $this->stat();
+ }
+ return 'INTERNAL_ERROR';
+ }
+
+ /**
+ * @param $data string
+ * @return Array
+ */
+ protected function getCommand( $data ) {
+ $m = explode( ':', $data ); // <session, key, command, type, values>
+ if ( count( $m ) == 5 ) {
+ list( $session, $key, $command, $type, $values ) = $m;
+ if ( sha1( $session . $command . $type . $values . $this->authKey ) !== $key ) {
+ return 'BAD_KEY';
+ } elseif ( strlen( $session ) !== 31 ) {
+ return 'BAD_SESSION';
+ }
+ $values = explode( '|', $values );
+ if ( $command === 'ACQUIRE' ) {
+ $needsLockArgs = true;
+ } elseif ( $command === 'RELEASE' ) {
+ $needsLockArgs = true;
+ } elseif ( $command === 'RELEASE_ALL' ) {
+ $needsLockArgs = false;
+ } elseif ( $command === 'STAT' ) {
+ $needsLockArgs = false;
+ } else {
+ return 'BAD_COMMAND';
+ }
+ if ( $needsLockArgs ) {
+ if ( $type !== 'SH' && $type !== 'EX' ) {
+ return 'BAD_TYPE';
+ }
+ foreach ( $values as $value ) {
+ if ( strlen( $value ) !== 31 ) {
+ return 'BAD_FORMAT';
+ }
+ }
+ }
+ return array( $command, $session, $type, $values );
+ }
+ return 'BAD_FORMAT';
+ }
+
+ /**
+ * Remove a socket's corresponding session from tracking and
+ * store it in the dead session tracking if it still has locks.
+ *
+ * @param $socket resource
+ * @return book
+ */
+ protected function recordDeadSocket( $socket ) {
+ $session = array_search( $socket, $this->sessions );
+ if ( $session !== false ) {
+ unset( $this->sessions[$session] );
+ // Record recently killed sessions that still have locks
+ if ( $this->lockHolder->sessionHasLocks( $session ) ) {
+ $this->deadSessions[$session] = time();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Clear locks for sessions that have been dead for a while
+ *
+ * @return integer Number of sessions purged
+ */
+ protected function purgeExpiredLocks() {
+ $count = 0;
+ $now = time();
+ foreach ( $this->deadSessions as $session => $timestamp ) {
+ if ( ( $now - $timestamp ) > $this->lockTimeout ) {
+ $this->lockHolder->release( $session );
+ unset( $this->deadSessions[$session] );
+ ++$count;
+ }
+ }
+ return $count;
+ }
+
+ /**
+ * Get the current timestamp and memory usage
+ *
+ * @return string
+ */
+ protected function stat() {
+ return ( time() - $this->startTime ) . ':' . memory_get_usage();
+ }
+}
+
+/**
+ * LockServerDaemon helper class that keeps track socket states
+ */
+class SocketArray {
+ /* @var Array */
+ protected $clients = array(); // array of client sockets
+ /* @var Array */
+ protected $rBuffers = array(); // corresponding socket read buffers
+ /* @var Array */
+ protected $wBuffers = array(); // corresponding socket write buffers
+
+ const BUFFER_SIZE = 65535;
+
+ /**
+ * @return Array (list of sockets to read, list of sockets to write)
+ */
+ public function socketsForSelect() {
+ $rSockets = array();
+ $wSockets = array();
+ foreach ( $this->clients as $key => $socket ) {
+ if ( $this->wBuffers[$key] !== '' ) {
+ $wSockets[] = $socket; // wait for writing to unblock
+ } else {
+ $rSockets[] = $socket; // wait for reading to unblock
+ }
+ }
+ return array( $rSockets, $wSockets );
+ }
+
+ /**
+ * @return integer Number of client sockets
+ */
+ public function size() {
+ return count( $this->clients );
+ }
+
+ /**
+ * @param $sock resource
+ * @return bool
+ */
+ public function addSocket( $sock ) {
+ $this->clients[] = $sock;
+ $this->rBuffers[] = '';
+ $this->wBuffers[] = '';
+ return true;
+ }
+
+ /**
+ * @param $sock resource
+ * @return bool
+ */
+ public function closeSocket( $sock ) {
+ $key = array_search( $sock, $this->clients );
+ if ( $key === false ) {
+ return false;
+ }
+ socket_close( $sock );
+ unset( $this->clients[$key] );
+ unset( $this->rBuffers[$key] );
+ unset( $this->wBuffers[$key] );
+ return true;
+ }
+
+ /**
+ * @param $sock resource
+ * @param $data string
+ * @return bool
+ */
+ public function appendRcvBuffer( $sock, $data ) {
+ $key = array_search( $sock, $this->clients );
+ if ( $key === false ) {
+ return false;
+ } elseif ( ( strlen( $this->rBuffers[$key] ) + strlen( $data ) ) > self::BUFFER_SIZE ) {
+ return false;
+ }
+ $this->rBuffers[$key] .= $data;
+ return true;
+ }
+
+ /**
+ * @param $sock resource
+ * @return string|false
+ */
+ public function readRcvBuffer( $sock ) {
+ $key = array_search( $sock, $this->clients );
+ if ( $key === false ) {
+ return false;
+ }
+ $data = $this->rBuffers[$key];
+ $this->rBuffers[$key] = ''; // consume data
+ return $data;
+ }
+
+ /**
+ * @param $sock resource
+ * @param $data string
+ * @return bool
+ */
+ public function appendSndBuffer( $sock, $data ) {
+ $key = array_search( $sock, $this->clients );
+ if ( $key === false ) {
+ return false;
+ } elseif ( ( strlen( $this->wBuffers[$key] ) + strlen( $data ) ) > self::BUFFER_SIZE ) {
+ return false;
+ }
+ $this->wBuffers[$key] .= $data;
+ return true;
+ }
+
+ /**
+ * @param $sock resource
+ * @return bool
+ */
+ public function readSndBuffer( $sock ) {
+ $key = array_search( $sock, $this->clients );
+ if ( $key === false ) {
+ return false;
+ }
+ return $this->wBuffers[$key];
+ }
+
+ /**
+ * @param $sock resource
+ * @param $bytes integer
+ * @return bool
+ */
+ public function consumeSndBuffer( $sock, $bytes ) {
+ $key = array_search( $sock, $this->clients );
+ if ( $key === false ) {
+ return false;
+ }
+ $this->wBuffers[$key] = (string)substr( $this->wBuffers[$key], $bytes );
+ return true;
+ }
+}
+
+/**
+ * LockServerDaemon helper class that keeps track of the locks
+ */
+class LockHolder {
+ /** @var Array */
+ protected $shLocks = array(); // (key => session => 1)
+ /** @var Array */
+ protected $exLocks = array(); // (key => session)
+
+ /** @var Array */
+ protected $sessionIndexSh = array(); // (session => key => 1)
+ /** @var Array */
+ protected $sessionIndexEx = array(); // (session => key => 1)
+ protected $lockCount = 0; // integer
+
+ protected $maxLocks; // integer
+
+ /**
+ * @params $maxLocks integer Maximum number of locks to allow
+ */
+ public function __construct( $maxLocks ) {
+ $this->maxLocks = $maxLocks;
+ }
+
+ /**
+ * @param $session string
+ * @return bool
+ */
+ public function sessionHasLocks( $session ) {
+ return isset( $this->sessionIndexSh[$session] )
+ || isset( $this->sessionIndexEx[$session] );
+ }
+
+ /**
+ * @param $session string
+ * @param $type string
+ * @param $keys Array
+ * @return string
+ */
+ public function lock( $session, $type, array $keys ) {
+ if ( ( $this->lockCount + count( $keys ) ) > $this->maxLocks ) {
+ return 'TOO_MANY_LOCKS';
+ }
+ if ( $type === 'SH' ) {
+ // Check if any keys are already write-locked...
+ foreach ( $keys as $key ) {
+ if ( isset( $this->exLocks[$key] ) && $this->exLocks[$key] !== $session ) {
+ return 'CANT_ACQUIRE';
+ }
+ }
+ // Acquire the read-locks...
+ foreach ( $keys as $key ) {
+ $this->set_sh_lock( $key, $session );
+ }
+ return 'ACQUIRED';
+ } elseif ( $type === 'EX' ) {
+ // Check if any keys are already read-locked or write-locked...
+ foreach ( $keys as $key ) {
+ if ( isset( $this->exLocks[$key] ) && $this->exLocks[$key] !== $session ) {
+ return 'CANT_ACQUIRE';
+ }
+ if ( isset( $this->shLocks[$key] ) ) {
+ foreach ( $this->shLocks[$key] as $otherSession => $x ) {
+ if ( $otherSession !== $session ) {
+ return 'CANT_ACQUIRE';
+ }
+ }
+ }
+ }
+ // Acquire the write-locks...
+ foreach ( $keys as $key ) {
+ $this->set_ex_lock( $key, $session );
+ }
+ return 'ACQUIRED';
+ }
+ return 'INTERNAL_ERROR';
+ }
+
+ /**
+ * @param $session string
+ * @param $type string
+ * @param $keys Array
+ * @return string
+ */
+ public function unlock( $session, $type, array $keys ) {
+ if ( $type === 'SH' ) {
+ foreach ( $keys as $key ) {
+ $this->unset_sh_lock( $key, $session );
+ }
+ return 'RELEASED';
+ } elseif ( $type === 'EX' ) {
+ foreach ( $keys as $key ) {
+ $this->unset_ex_lock( $key, $session );
+ }
+ return 'RELEASED';
+ }
+ return 'INTERNAL_ERROR';
+ }
+
+ /**
+ * @param $session string
+ * @return string
+ */
+ public function release( $session ) {
+ if ( isset( $this->sessionIndexSh[$session] ) ) {
+ foreach ( $this->sessionIndexSh[$session] as $key => $x ) {
+ $this->unset_sh_lock( $key, $session );
+ }
+ }
+ if ( isset( $this->sessionIndexEx[$session] ) ) {
+ foreach ( $this->sessionIndexEx[$session] as $key => $x ) {
+ $this->unset_ex_lock( $key, $session );
+ }
+ }
+ return 'RELEASED_ALL';
+ }
+
+ /**
+ * @param $key string
+ * @param $session string
+ * @return void
+ */
+ protected function set_sh_lock( $key, $session ) {
+ if ( !isset( $this->shLocks[$key][$session] ) ) {
+ $this->shLocks[$key][$session] = 1;
+ $this->sessionIndexSh[$session][$key] = 1;
+ ++$this->lockCount; // we are adding a lock
+ }
+ }
+
+ /**
+ * @param $key string
+ * @param $session string
+ * @return void
+ */
+ protected function set_ex_lock( $key, $session ) {
+ if ( !isset( $this->exLocks[$key][$session] ) ) {
+ $this->exLocks[$key] = $session;
+ $this->sessionIndexEx[$session][$key] = 1;
+ ++$this->lockCount; // we are adding a lock
+ }
+ }
+
+ /**
+ * @param $key string
+ * @param $session string
+ * @return void
+ */
+ protected function unset_sh_lock( $key, $session ) {
+ if ( isset( $this->shLocks[$key][$session] ) ) {
+ unset( $this->shLocks[$key][$session] );
+ if ( !count( $this->shLocks[$key] ) ) {
+ unset( $this->shLocks[$key] );
+ }
+ unset( $this->sessionIndexSh[$session][$key] );
+ if ( !count( $this->sessionIndexSh[$session] ) ) {
+ unset( $this->sessionIndexSh[$session] );
+ }
+ --$this->lockCount;
+ }
+ }
+
+ /**
+ * @param $key string
+ * @param $session string
+ * @return void
+ */
+ protected function unset_ex_lock( $key, $session ) {
+ if ( isset( $this->exLocks[$key] ) && $this->exLocks[$key] === $session ) {
+ unset( $this->exLocks[$key] );
+ unset( $this->sessionIndexEx[$session][$key] );
+ if ( !count( $this->sessionIndexEx[$session] ) ) {
+ unset( $this->sessionIndexEx[$session] );
+ }
+ --$this->lockCount;
+ }
+ }
+}
diff --git a/maintenance/locking/file_locks.sql b/maintenance/locking/file_locks.sql
new file mode 100644
index 00000000..f51d06b3
--- /dev/null
+++ b/maintenance/locking/file_locks.sql
@@ -0,0 +1,11 @@
+-- Table to handle resource locking (EX) with row-level locking
+CREATE TABLE /*_*/filelocks_exclusive (
+ fle_key binary(31) NOT NULL PRIMARY KEY
+) ENGINE=InnoDB, CHECKSUM=0;
+
+-- Table to handle resource locking (SH) with row-level locking
+CREATE TABLE /*_*/filelocks_shared (
+ fls_key binary(31) NOT NULL,
+ fls_session binary(31) NOT NULL,
+ PRIMARY KEY (fls_key,fls_session)
+) ENGINE=InnoDB, CHECKSUM=0;
diff --git a/maintenance/mctest.php b/maintenance/mctest.php
index 651b2958..359cd248 100644
--- a/maintenance/mctest.php
+++ b/maintenance/mctest.php
@@ -29,15 +29,16 @@ class mcTest extends Maintenance {
$this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every"
. " memcached server and shows a report";
$this->addOption( 'i', 'Number of iterations', false, true );
- $this->addArg( 'server', 'Memcached server to test', false );
+ $this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
}
public function execute() {
global $wgMemCachedServers;
$iterations = $this->getOption( 'i', 100 );
- if ( $this->hasArg() )
+ if ( $this->hasArg() ) {
$wgMemCachedServers = array( $this->getArg() );
+ }
foreach ( $wgMemCachedServers as $server ) {
$this->output( $server . " ", $server );
diff --git a/maintenance/mergeMessageFileList.php b/maintenance/mergeMessageFileList.php
index 8cfefcbd..b5a911aa 100644
--- a/maintenance/mergeMessageFileList.php
+++ b/maintenance/mergeMessageFileList.php
@@ -26,25 +26,18 @@
define( 'MW_NO_EXTENSION_MESSAGES', 1 );
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-$maintClass = 'MergeMessageFileList';
-$mmfl = false;
+
class MergeMessageFileList extends Maintenance {
function __construct() {
parent::__construct();
- $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', false, true );
+ $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', true, true );
$this->addOption( 'output', 'Send output to this file (omit for stdout)', false, true );
$this->mDescription = 'Merge $wgExtensionMessagesFiles from various extensions to produce a ' .
'single array containing all message files.';
}
public function execute() {
- global $mmfl;
- if ( !$this->hasOption( 'list-file' ) ) {
- $this->error( 'The --list-file option must be specified.' );
- return;
- }
-
$lines = file( $this->getOption( 'list-file' ) );
if ( $lines === false ) {
$this->error( 'Unable to open list file.' );
@@ -53,43 +46,43 @@ class MergeMessageFileList extends Maintenance {
if ( $this->hasOption( 'output' ) ) {
$mmfl['output'] = $this->getOption( 'output' );
}
- }
-}
-
-require_once( RUN_MAINTENANCE_IF_MAIN );
-foreach ( $mmfl['setupFiles'] as $fileName ) {
- if ( strval( $fileName ) === '' ) {
- continue;
- }
- $fileName = str_replace( '$IP', $IP, $fileName );
- fwrite( STDERR, "Loading data from $fileName\n" );
- include_once( $fileName );
-}
-fwrite( STDERR, "\n" );
-$s =
- "<" . "?php\n" .
- "## This file is generated by mergeMessageFileList.php. Do not edit it directly.\n\n" .
- "if ( defined( 'MW_NO_EXTENSION_MESSAGES' ) ) return;\n\n" .
- '$wgExtensionMessagesFiles = ' . var_export( $wgExtensionMessagesFiles, true ) . ";\n\n" .
- '$wgExtensionAliasesFiles = ' . var_export( $wgExtensionAliasesFiles, true ) . ";\n";
+ global $IP, $wgExtensionMessagesFiles;
+ foreach ( $mmfl['setupFiles'] as $fileName ) {
+ if ( strval( $fileName ) === '' ) {
+ continue;
+ }
+ $fileName = str_replace( '$IP', $IP, $fileName );
+ fwrite( STDERR, "Loading data from $fileName\n" );
+ include_once( $fileName );
+ }
+ fwrite( STDERR, "\n" );
+ $s =
+ "<" . "?php\n" .
+ "## This file is generated by mergeMessageFileList.php. Do not edit it directly.\n\n" .
+ "if ( defined( 'MW_NO_EXTENSION_MESSAGES' ) ) return;\n\n" .
+ '$wgExtensionMessagesFiles = ' . var_export( $wgExtensionMessagesFiles, true ) . ";\n";
-$dirs = array(
- $IP,
- dirname( dirname( __FILE__ ) ),
- realpath( $IP )
-);
+ $dirs = array(
+ $IP,
+ dirname( dirname( __FILE__ ) ),
+ realpath( $IP )
+ );
-foreach ( $dirs as $dir ) {
- $s = preg_replace(
- "/'" . preg_quote( $dir, '/' ) . "([^']*)'/",
- '"$IP\1"',
- $s );
-}
+ foreach ( $dirs as $dir ) {
+ $s = preg_replace(
+ "/'" . preg_quote( $dir, '/' ) . "([^']*)'/",
+ '"$IP\1"',
+ $s );
+ }
-if ( isset( $mmfl['output'] ) ) {
- file_put_contents( $mmfl['output'], $s );
-} else {
- echo $s;
+ if ( isset( $mmfl['output'] ) ) {
+ file_put_contents( $mmfl['output'], $s );
+ } else {
+ echo $s;
+ }
+ }
}
+$maintClass = 'MergeMessageFileList';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/moveBatch.php b/maintenance/moveBatch.php
index 9b9f9105..6ecc775e 100644
--- a/maintenance/moveBatch.php
+++ b/maintenance/moveBatch.php
@@ -67,6 +67,9 @@ class MoveBatch extends Maintenance {
$this->error( "Unable to read file, exiting", true );
}
$wgUser = User::newFromName( $user );
+ if ( !$wgUser ) {
+ $this->error( "Invalid username", true );
+ }
# Setup complete, now start
$dbw = wfGetDB( DB_MASTER );
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index dca64f17..8c4d5008 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -642,16 +642,6 @@ CREATE UNIQUE INDEX /*$wgDBprefix*/ls_field_val ON /*$wgDBprefix*/log_search (ls
CREATE INDEX /*$wgDBprefix*/ls_log_id ON /*$wgDBprefix*/log_search (ls_log_id);
-CREATE TABLE /*$wgDBprefix*/trackbacks (
- tb_id INT PRIMARY KEY,
- tb_page INT REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
- tb_title NVARCHAR(255) NOT NULL,
- tb_url NVARCHAR(255) NOT NULL,
- tb_ex NVARCHAR(MAX),
- tb_name NVARCHAR(255),
-);
-CREATE INDEX /*$wgDBprefix*/trackbacks_page ON /*$wgDBprefix*/trackbacks(tb_page);
-
-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*$wgDBprefix*/job (
job_id INT NOT NULL PRIMARY KEY,
diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php
index ed511f74..0c3b262e 100644
--- a/maintenance/mwdocgen.php
+++ b/maintenance/mwdocgen.php
@@ -33,7 +33,7 @@
* @todo document
* @ingroup Maintenance
*
- * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Antoine Musso <hashar at free dot fr>
* @author Brion Vibber
* @author Alexandre Emsenhuber
* @version first release
@@ -89,6 +89,7 @@ require_once( "$mwPath/includes/GlobalFunctions.php" );
/**
* Read a line from the shell
* @param $prompt String
+ * @return string
*/
function readaline( $prompt = '' ) {
print $prompt;
@@ -151,9 +152,12 @@ function getSvnRevision( $dir ) {
* @param $exclude String: Additionals path regex to exclude
* @param $exclude_patterns String: Additionals path regex to exclude
* (LocalSettings.php, AdminSettings.php, .svn and .git directories are always excluded)
+ * @return string
*/
function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude, $exclude_patterns ) {
+ global $wgDoxyGenerateMan;
+
$template = file_get_contents( $doxygenTemplate );
// Replace template placeholders by correct values.
@@ -166,6 +170,7 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
'{{EXCLUDE}}' => $exclude,
'{{EXCLUDE_PATTERNS}}' => $exclude_patterns,
'{{HAVE_DOT}}' => `which dot` ? 'YES' : 'NO',
+ '{{GENERATE_MAN}}' => $wgDoxyGenerateMan ? 'YES' : 'NO',
);
$tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
$tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
@@ -180,20 +185,56 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
unset( $file );
-if ( is_array( $argv ) && isset( $argv[1] ) ) {
- switch( $argv[1] ) {
- 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;
- if ( isset( $argv[2] ) ) {
- $file = $argv[2];
+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 '--generate-man':
+ $wgDoxyGenerateMan = true;
+ break;
+ case '--help':
+ print <<<END
+Usage: php mwdocgen.php [<command>] [<options>]
+
+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
+
+If no command is given, you will be prompted.
+
+Other options:
+ --output <dir> Set output directory (default $doxyOutput)
+ --generate-man Generates man page documentation
+ --help Show this help and exit.
+
+
+END;
+ exit(0);
+ break;
}
- break;
- case '--no-extensions': $input = 6; break;
}
}
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php
index b883ea68..0a5fec33 100644
--- a/maintenance/namespaceDupes.php
+++ b/maintenance/namespaceDupes.php
@@ -26,6 +26,12 @@
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
class NamespaceConflictChecker extends Maintenance {
+
+ /**
+ * @var DatabaseBase
+ */
+ protected $db;
+
public function __construct() {
parent::__construct();
$this->mDescription = "";
@@ -64,6 +70,8 @@ class NamespaceConflictChecker extends Maintenance {
* @todo Document
* @param $fix Boolean: whether or not to fix broken entries
* @param $suffix String: suffix to append to renamed articles
+ *
+ * @return bool
*/
private function checkAll( $fix, $suffix = '' ) {
global $wgContLang, $wgNamespaceAliases, $wgCapitalLinks;
@@ -150,6 +158,7 @@ class NamespaceConflictChecker extends Maintenance {
* @param $name String
* @param $fix Boolean: whether to fix broken entries
* @param $suffix String: suffix to append to renamed articles
+ * @return bool
*/
private function checkNamespace( $ns, $name, $fix, $suffix = '' ) {
$conflicts = $this->getConflicts( $ns, $name );
@@ -171,6 +180,11 @@ class NamespaceConflictChecker extends Maintenance {
/**
* @todo: do this for reals
+ * @param $key
+ * @param $prefix
+ * @param $fix
+ * @param $suffix string
+ * @return bool
*/
private function checkPrefix( $key, $prefix, $fix, $suffix = '' ) {
$this->output( "Checking prefix \"$prefix\" vs namespace $key\n" );
@@ -183,6 +197,8 @@ class NamespaceConflictChecker extends Maintenance {
*
* @param $ns Integer: namespace id (id for new namespace?)
* @param $name String: prefix that is being made a namespace
+ *
+ * @return array
*/
private function getConflicts( $ns, $name ) {
$page = 'page';
@@ -217,6 +233,8 @@ class NamespaceConflictChecker extends Maintenance {
/**
* Report any conflicts we find
+ *
+ * @return bool
*/
private function reportConflict( $row, $suffix ) {
$newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
@@ -254,6 +272,7 @@ class NamespaceConflictChecker extends Maintenance {
* @param $row Object: row from the page table to fix
* @param $resolvable Boolean
* @param $suffix String: suffix to append to the fixed page
+ * @return bool
*/
private function resolveConflict( $row, $resolvable, $suffix ) {
if ( !$resolvable ) {
@@ -285,6 +304,7 @@ class NamespaceConflictChecker extends Maintenance {
* @param $row Object: row from the old broken entry
* @param $table String: table to update
* @param $prefix String: prefix for column name, like page or ar
+ * @return bool
*/
private function resolveConflictOn( $row, $table, $prefix ) {
$this->output( "... resolving on $table... " );
diff --git a/maintenance/nextJobDB.php b/maintenance/nextJobDB.php
index 2d3608d5..67aa3088 100644
--- a/maintenance/nextJobDB.php
+++ b/maintenance/nextJobDB.php
@@ -37,7 +37,7 @@ class nextJobDB extends Maintenance {
$memcKey = 'jobqueue:dbs:v2';
$pendingDBs = $wgMemc->get( $memcKey );
- // If the cache entry wasn't present, or in 1% of cases otherwise,
+ // If the cache entry wasn't present, or in 1% of cases otherwise,
// regenerate the cache.
if ( !$pendingDBs || mt_rand( 0, 100 ) == 0 ) {
$pendingDBs = $this->getPendingDbs();
@@ -65,7 +65,7 @@ class nextJobDB extends Maintenance {
$candidates = array_values( $candidates );
$db = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
if ( !$this->checkJob( $type, $db ) ) {
- // This job is not available in the current database. Remove it from
+ // This job is not available in the current database. Remove it from
// the cache.
if ( $type === false ) {
foreach ( $pendingDBs as $type2 => $dbs ) {
@@ -85,7 +85,10 @@ class nextJobDB extends Maintenance {
/**
* Check if the specified database has a job of the specified type in it.
- * The type may be false to indicate "all".
+ * The type may be false to indicate "all".
+ * @param $type string
+ * @param $dbName string
+ * @return bool
*/
function checkJob( $type, $dbName ) {
$lb = wfGetLB( $dbName );
@@ -103,7 +106,6 @@ class nextJobDB extends Maintenance {
/**
* Get all databases that have a pending job
- * @param $type String Job type
* @return array
*/
private function getPendingDbs() {
diff --git a/maintenance/nukeNS.php b/maintenance/nukeNS.php
index c89fa94b..57417508 100644
--- a/maintenance/nukeNS.php
+++ b/maintenance/nukeNS.php
@@ -41,11 +41,13 @@ class NukeNS extends Maintenance {
$this->mDescription = "Remove pages with only 1 revision from any namespace";
$this->addOption( 'delete', "Actually delete the page" );
$this->addOption( 'ns', 'Namespace to delete from, default NS_MEDIAWIKI', false, true );
+ $this->addOption( 'all', 'Delete everything regardless of revision count' );
}
public function execute() {
$ns = $this->getOption( 'ns', NS_MEDIAWIKI );
$delete = $this->getOption( 'delete', false );
+ $all = $this->getOption( 'all', false );
$dbw = wfGetDB( DB_MASTER );
$dbw->begin();
@@ -70,7 +72,7 @@ class NukeNS extends Maintenance {
$count = count( $revs );
// skip anything that looks modified (i.e. multiple revs)
- if ( $count == 1 ) {
+ if ( $all || $count == 1 ) {
# echo $title->getPrefixedText(), "\t", $count, "\n";
$this->output( "delete: " . $title->getPrefixedText() . "\n" );
@@ -80,7 +82,7 @@ class NukeNS extends Maintenance {
$dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" );
$dbw->commit();
// Delete revisions as appropriate
- $child = $this->runChild( 'NukePage', 'NukePage.php' );
+ $child = $this->runChild( 'NukePage', 'nukePage.php' );
$child->deleteRevisions( $revs );
$this->purgeRedundantText( true );
$n_deleted ++;
diff --git a/maintenance/oracle/archives/patch-ar_sha1_field.sql b/maintenance/oracle/archives/patch-ar_sha1_field.sql
new file mode 100644
index 00000000..de723ce7
--- /dev/null
+++ b/maintenance/oracle/archives/patch-ar_sha1_field.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD ar_sha1 VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-config.sql b/maintenance/oracle/archives/patch-config.sql
deleted file mode 100644
index 66714a73..00000000
--- a/maintenance/oracle/archives/patch-config.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE TABLE &mw_prefix.config (
- cf_name VARCHAR2(255) NOT NULL,
- cf_value blob NOT NULL
-);
-ALTER TABLE &mw_prefix.config ADD CONSTRAINT &mw_prefix.config_pk PRIMARY KEY (cf_name);
-
diff --git a/maintenance/oracle/archives/patch-job_timestamp_field.sql b/maintenance/oracle/archives/patch-job_timestamp_field.sql
new file mode 100644
index 00000000..4901c87c
--- /dev/null
+++ b/maintenance/oracle/archives/patch-job_timestamp_field.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.job ADD job_timestamp TIMESTAMP(6) WITH TIME ZONE NULL;
+
diff --git a/maintenance/oracle/archives/patch-job_timestamp_index.sql b/maintenance/oracle/archives/patch-job_timestamp_index.sql
new file mode 100644
index 00000000..6db43046
--- /dev/null
+++ b/maintenance/oracle/archives/patch-job_timestamp_index.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.job_i02 ON &mw_prefix.job (job_timestamp);
+
diff --git a/maintenance/oracle/archives/patch-logging_type_action_index.sql b/maintenance/oracle/archives/patch-logging_type_action_index.sql
new file mode 100644
index 00000000..d30e0cfc
--- /dev/null
+++ b/maintenance/oracle/archives/patch-logging_type_action_index.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action, log_timestamp);
+
diff --git a/maintenance/oracle/archives/patch-page_redirect_namespace_len.sql b/maintenance/oracle/archives/patch-page_redirect_namespace_len.sql
new file mode 100644
index 00000000..1f8b9d9a
--- /dev/null
+++ b/maintenance/oracle/archives/patch-page_redirect_namespace_len.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_namespace, page_len);
+
diff --git a/maintenance/oracle/archives/patch-rev_sha1_field.sql b/maintenance/oracle/archives/patch-rev_sha1_field.sql
new file mode 100644
index 00000000..80544e89
--- /dev/null
+++ b/maintenance/oracle/archives/patch-rev_sha1_field.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.revision ADD rev_sha1 VARCHAR2(32);
+
diff --git a/maintenance/oracle/archives/patch-ug_group-length-increase.sql b/maintenance/oracle/archives/patch-ug_group-length-increase.sql
new file mode 100644
index 00000000..00a3d0c9
--- /dev/null
+++ b/maintenance/oracle/archives/patch-ug_group-length-increase.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.user_groups MODIFY ug_group VARCHAR2(32) NOT NULL;
diff --git a/maintenance/oracle/archives/patch-us_chunk_inx_field.sql b/maintenance/oracle/archives/patch-us_chunk_inx_field.sql
new file mode 100644
index 00000000..43ee16ec
--- /dev/null
+++ b/maintenance/oracle/archives/patch-us_chunk_inx_field.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.uploadstash ADD us_chunk_inx NUMBER;
+
diff --git a/maintenance/oracle/archives/patch_fk_rename_deferred.sql b/maintenance/oracle/archives/patch_fk_rename_deferred.sql
index ce5be9af..ca9c997f 100644
--- a/maintenance/oracle/archives/patch_fk_rename_deferred.sql
+++ b/maintenance/oracle/archives/patch_fk_rename_deferred.sql
@@ -35,7 +35,6 @@ ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk1
ALTER TABLE &mw_prefix.recentchanges ADD CONSTRAINT &mw_prefix.recentchanges_fk2 FOREIGN KEY (rc_cur_id) REFERENCES &mw_prefix.page(page_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.watchlist ADD CONSTRAINT &mw_prefix.watchlist_fk1 FOREIGN KEY (wl_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.logging ADD CONSTRAINT &mw_prefix.logging_fk1 FOREIGN KEY (log_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
-ALTER TABLE &mw_prefix.trackbacks ADD CONSTRAINT &mw_prefix.trackbacks_fk1 FOREIGN KEY (tb_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.redirect ADD CONSTRAINT &mw_prefix.redirect_fk1 FOREIGN KEY (rd_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE &mw_prefix.page_restrictions ADD CONSTRAINT &mw_prefix.page_restrictions_fk1 FOREIGN KEY (pr_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
diff --git a/maintenance/oracle/archives/patch_rebuild_dupfunc.sql b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql
index 0a232dbc..56ee5b3e 100644
--- a/maintenance/oracle/archives/patch_rebuild_dupfunc.sql
+++ b/maintenance/oracle/archives/patch_rebuild_dupfunc.sql
@@ -10,7 +10,7 @@ CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname IN VARCHAR2,
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
- ' CASCADE CONSTRAINTS';
+ ' CASCADE CONSTRAINTS PURGE';
EXCEPTION
WHEN e_table_not_exist THEN
NULL;
@@ -20,8 +20,9 @@ BEGIN
END IF;
IF (l_temporary) THEN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
- p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
- p_tabname || ' WHERE ROWNUM = 0';
+ p_tabname ||
+ ' ON COMMIT PRESERVE ROWS AS SELECT * FROM ' ||
+ p_oldprefix || p_tabname || ' WHERE ROWNUM = 0';
ELSE
EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
@@ -68,7 +69,8 @@ BEGIN
FROM user_constraints uc
WHERE table_name = p_oldprefix || p_tabname
AND constraint_type = 'R') LOOP
- IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+ IF nvl(length(l_temp_ei_sql), 0) > 0 AND
+ INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
EXECUTE IMMEDIATE l_temp_ei_sql;
END IF;
END LOOP;
@@ -142,5 +144,6 @@ BEGIN
END IF;
END LOOP;
END;
+
/*$mw$*/
diff --git a/maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql b/maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql
new file mode 100644
index 00000000..f7a38a05
--- /dev/null
+++ b/maintenance/oracle/archives/patch_remove_not_null_empty_defs2.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.ipblocks MODIFY ipb_by_text DEFAULT NULL NULL;
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
index c6162753..9f875aed 100644
--- a/maintenance/oracle/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -31,12 +31,19 @@ INSERT INTO &mw_prefix.mwuser
CREATE TABLE &mw_prefix.user_groups (
ug_user NUMBER DEFAULT 0 NOT NULL,
- ug_group VARCHAR2(16) NOT NULL
+ ug_group VARCHAR2(32) NOT NULL
);
ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.user_groups_u01 ON &mw_prefix.user_groups (ug_user,ug_group);
CREATE INDEX &mw_prefix.user_groups_i01 ON &mw_prefix.user_groups (ug_group);
+CREATE TABLE &mw_prefix.user_former_groups (
+ ufg_user NUMBER DEFAULT 0 NOT NULL,
+ ufg_group VARCHAR2(16) NOT NULL
+);
+ALTER TABLE &mw_prefix.user_former_groups ADD CONSTRAINT &mw_prefix.user_former_groups_fk1 FOREIGN KEY (ufg_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
+CREATE UNIQUE INDEX &mw_prefix.user_former_groups_u01 ON &mw_prefix.user_former_groups (ufg_user,ufg_group);
+
CREATE TABLE &mw_prefix.user_newtalk (
user_id NUMBER DEFAULT 0 NOT NULL,
user_ip VARCHAR2(40) NULL,
@@ -72,6 +79,7 @@ ALTER TABLE &mw_prefix.page ADD CONSTRAINT &mw_prefix.page_pk PRIMARY KEY (page_
CREATE UNIQUE INDEX &mw_prefix.page_u01 ON &mw_prefix.page (page_namespace,page_title);
CREATE INDEX &mw_prefix.page_i01 ON &mw_prefix.page (page_random);
CREATE INDEX &mw_prefix.page_i02 ON &mw_prefix.page (page_len);
+CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_namespace, page_len);
-- Create a dummy page to satisfy fk contraints especially with revisions
INSERT INTO &mw_prefix.page
@@ -97,7 +105,8 @@ CREATE TABLE &mw_prefix.revision (
rev_minor_edit CHAR(1) DEFAULT '0' NOT NULL,
rev_deleted CHAR(1) DEFAULT '0' NOT NULL,
rev_len NUMBER NULL,
- rev_parent_id NUMBER DEFAULT NULL
+ rev_parent_id NUMBER DEFAULT NULL,
+ rev_sha1 VARCHAR2(32) NULL
);
ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_pk PRIMARY KEY (rev_id);
ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
@@ -131,7 +140,8 @@ CREATE TABLE &mw_prefix.archive (
ar_deleted CHAR(1) DEFAULT '0' NOT NULL,
ar_len NUMBER,
ar_page_id NUMBER,
- ar_parent_id NUMBER
+ ar_parent_id NUMBER,
+ ar_sha1 VARCHAR2(32) NULL
);
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);
@@ -250,7 +260,7 @@ CREATE TABLE &mw_prefix.ipblocks (
ipb_address VARCHAR2(255) NULL,
ipb_user NUMBER DEFAULT 0 NOT NULL,
ipb_by NUMBER DEFAULT 0 NOT NULL,
- ipb_by_text VARCHAR2(255) NOT NULL,
+ ipb_by_text VARCHAR2(255) NULL,
ipb_reason VARCHAR2(255) NOT NULL,
ipb_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
ipb_auto CHAR(1) DEFAULT '0' NOT NULL,
@@ -355,6 +365,31 @@ CREATE INDEX &mw_prefix.filearchive_i02 ON &mw_prefix.filearchive (fa_storage_gr
CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_timestamp);
CREATE INDEX &mw_prefix.filearchive_i04 ON &mw_prefix.filearchive (fa_user_text,fa_timestamp);
+CREATE SEQUENCE uploadstash_us_id_seq;
+CREATE TABLE &mw_prefix.uploadstash (
+ us_id NUMBER NOT NULL,
+ us_user NUMBER DEFAULT 0 NOT NULL,
+ us_key VARCHAR2(255) NOT NULL,
+ us_orig_path VARCHAR2(255) NOT NULL,
+ us_path VARCHAR2(255) NOT NULL,
+ us_source_type VARCHAR2(50),
+ us_timestamp TIMESTAMP(6) WITH TIME ZONE,
+ us_status VARCHAR2(50) NOT NULL,
+ us_chunk_inx NUMBER,
+ us_size NUMBER NOT NULL,
+ us_sha1 VARCHAR2(32) NOT NULL,
+ us_mime VARCHAR2(255),
+ us_media_type VARCHAR2(32) DEFAULT NULL,
+ us_image_width NUMBER,
+ us_image_height NUMBER,
+ us_image_bits NUMBER
+);
+ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_pk PRIMARY KEY (us_id);
+ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_fk1 FOREIGN KEY (us_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+CREATE INDEX &mw_prefix.uploadstash_i01 ON &mw_prefix.uploadstash (us_user);
+CREATE INDEX &mw_prefix.uploadstash_i02 ON &mw_prefix.uploadstash (us_timestamp);
+CREATE UNIQUE INDEX &mw_prefix.uploadstash_u01 ON &mw_prefix.uploadstash (us_key);
+
CREATE SEQUENCE recentchanges_rc_id_seq;
CREATE TABLE &mw_prefix.recentchanges (
rc_id NUMBER NOT NULL,
@@ -467,6 +502,7 @@ CREATE INDEX &mw_prefix.logging_i01 ON &mw_prefix.logging (log_type, log_timesta
CREATE INDEX &mw_prefix.logging_i02 ON &mw_prefix.logging (log_user, log_timestamp);
CREATE INDEX &mw_prefix.logging_i03 ON &mw_prefix.logging (log_namespace, log_title, log_timestamp);
CREATE INDEX &mw_prefix.logging_i04 ON &mw_prefix.logging (log_timestamp);
+CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action, log_timestamp);
CREATE TABLE &mw_prefix.log_search (
ls_field VARCHAR2(32) NOT NULL,
@@ -476,18 +512,6 @@ CREATE TABLE &mw_prefix.log_search (
ALTER TABLE &mw_prefix.log_search ADD CONSTRAINT log_search_pk PRIMARY KEY (ls_field,ls_value,ls_log_id);
CREATE INDEX &mw_prefix.log_search_i01 ON &mw_prefix.log_search (ls_log_id);
-CREATE SEQUENCE trackbacks_tb_id_seq;
-CREATE TABLE &mw_prefix.trackbacks (
- tb_id NUMBER NOT NULL,
- tb_page NUMBER,
- tb_title VARCHAR2(255) NOT NULL,
- tb_url VARCHAR2(255) NOT NULL,
- tb_ex CLOB,
- tb_name VARCHAR2(255)
-);
-ALTER TABLE &mw_prefix.trackbacks ADD CONSTRAINT &mw_prefix.trackbacks_pk PRIMARY KEY (tb_id);
-ALTER TABLE &mw_prefix.trackbacks ADD CONSTRAINT &mw_prefix.trackbacks_fk1 FOREIGN KEY (tb_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
-CREATE INDEX &mw_prefix.trackbacks_i01 ON &mw_prefix.trackbacks (tb_page);
CREATE SEQUENCE job_job_id_seq;
CREATE TABLE &mw_prefix.job (
@@ -495,10 +519,12 @@ CREATE TABLE &mw_prefix.job (
job_cmd VARCHAR2(60) NOT NULL,
job_namespace NUMBER DEFAULT 0 NOT NULL,
job_title VARCHAR2(255) NOT NULL,
+ job_timestamp TIMESTAMP(6) WITH TIME ZONE NULL,
job_params CLOB NOT NULL
);
ALTER TABLE &mw_prefix.job ADD CONSTRAINT &mw_prefix.job_pk PRIMARY KEY (job_id);
CREATE INDEX &mw_prefix.job_i01 ON &mw_prefix.job (job_cmd, job_namespace, job_title);
+CREATE INDEX &mw_prefix.job_i02 ON &mw_prefix.job (job_timestamp);
CREATE TABLE &mw_prefix.querycache_info (
qci_type VARCHAR2(32) NOT NULL,
@@ -642,8 +668,7 @@ CREATE TABLE &mw_prefix.config (
cf_value blob NOT NULL
);
ALTER TABLE &mw_prefix.config ADD CONSTRAINT &mw_prefix.config_pk PRIMARY KEY (cf_name);
--- leaving index out for now ...
-
+-- leaving index out for now ...
-- do not prefix this table as it breaks parserTests
CREATE TABLE wiki_field_info_full (
@@ -653,9 +678,9 @@ data_default VARCHAR2(4000),
data_length NUMBER NOT NULL,
data_type VARCHAR2(106),
not_null CHAR(1) NOT NULL,
-prim NUMBER(1),
+prim NUMBER(1),
uniq NUMBER(1),
-nonuniq NUMBER(1)
+nonuniq NUMBER(1)
);
ALTER TABLE wiki_field_info_full ADD CONSTRAINT wiki_field_info_full_pk PRIMARY KEY (table_name, column_name);
@@ -722,7 +747,7 @@ CREATE OR REPLACE PROCEDURE duplicate_table(p_tabname IN VARCHAR2,
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || p_newprefix || p_tabname ||
- ' CASCADE CONSTRAINTS';
+ ' CASCADE CONSTRAINTS PURGE';
EXCEPTION
WHEN e_table_not_exist THEN
NULL;
@@ -732,8 +757,9 @@ BEGIN
END IF;
IF (l_temporary) THEN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE ' || p_newprefix ||
- p_tabname || ' AS SELECT * FROM ' || p_oldprefix ||
- p_tabname || ' WHERE ROWNUM = 0';
+ p_tabname ||
+ ' ON COMMIT PRESERVE ROWS AS SELECT * FROM ' ||
+ p_oldprefix || p_tabname || ' WHERE ROWNUM = 0';
ELSE
EXECUTE IMMEDIATE 'CREATE TABLE ' || p_newprefix || p_tabname ||
' AS SELECT * FROM ' || p_oldprefix || p_tabname ||
@@ -780,7 +806,8 @@ BEGIN
FROM user_constraints uc
WHERE table_name = p_oldprefix || p_tabname
AND constraint_type = 'R') LOOP
- IF nvl(length(l_temp_ei_sql), 0) > 0 THEN
+ IF nvl(length(l_temp_ei_sql), 0) > 0 AND
+ INSTR(l_temp_ei_sql, 'PRIMARY KEY') = 0 THEN
EXECUTE IMMEDIATE l_temp_ei_sql;
END IF;
END LOOP;
diff --git a/maintenance/orphans.php b/maintenance/orphans.php
index 1986ff35..faaadd37 100644
--- a/maintenance/orphans.php
+++ b/maintenance/orphans.php
@@ -53,10 +53,11 @@ class Orphans extends Maintenance {
* @param $db DatabaseBase object
* @param $extraTable String The name of any extra tables to lock (eg: text)
*/
- private function lockTables( &$db, $extraTable = null ) {
+ private function lockTables( $db, $extraTable = array() ) {
$tbls = array( 'page', 'revision', 'redirect' );
- if ( $extraTable )
- $tbls[] = $extraTable;
+ if ( $extraTable ) {
+ $tbls = array_merge( $tbls, $extraTable );
+ }
$db->lockTables( array(), $tbls, __METHOD__, false );
}
@@ -167,7 +168,7 @@ class Orphans extends Maintenance {
$revision = $dbw->tableName( 'revision' );
if ( $fix ) {
- $dbw->lockTables( $dbw, 'text', __METHOD__ );
+ $this->lockTables( $dbw, array( 'user', 'text' ) );
}
$this->output( "\nChecking for pages whose page_latest links are incorrect... (this may take a while on a large wiki)\n" );
@@ -206,7 +207,7 @@ class Orphans extends Maintenance {
$this->output( "... updating to revision $maxId\n" );
$maxRev = Revision::newFromId( $maxId );
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $article = new Article( $title );
+ $article = WikiPage::factory( $title );
$article->updateRevisionOn( $dbw, $maxRev );
}
}
diff --git a/maintenance/ourusers.php b/maintenance/ourusers.php
deleted file mode 100644
index c8578e24..00000000
--- a/maintenance/ourusers.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Wikimedia specific
- *
- * This script generates SQL used to update MySQL users on a hardcoded
- * list of hosts. It takes care of setting the wikiuser for every
- * database as well as setting up wikiadmin.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @todo document
- * @file
- * @ingroup Maintenance
- * @ingroup Wikimedia
- */
-
-/** */
-$wikiuser_pass = `wikiuser_pass`;
-$wikiadmin_pass = `wikiadmin_pass`;
-$nagios_pass = `nagios_sql_pass`;
-
-$hosts = array(
- 'localhost',
- '10.0.%',
- '66.230.200.%',
- '208.80.152.%',
-);
-
-$databases = array(
- '%wik%',
- 'centralauth',
-);
-
-print "/*!40100 set old_passwords=1 */;\n";
-print "/*!40100 set global old_passwords=1 */;\n";
-
-foreach ( $hosts as $host ) {
- print "--\n-- $host\n--\n";
- print "\n-- wikiuser\n\n";
- print "GRANT REPLICATION CLIENT,PROCESS ON *.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
- print "GRANT ALL PRIVILEGES ON `boardvote%`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
- foreach ( $databases as $db ) {
- print "GRANT SELECT, INSERT, UPDATE, DELETE ON `$db`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
- }
-
- print "\n-- wikiadmin\n\n";
- print "GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'wikiadmin'@'$host' IDENTIFIED BY '$wikiadmin_pass';\n";
- print "GRANT ALL PRIVILEGES ON `boardvote%`.* TO wikiadmin@'$host' IDENTIFIED BY '$wikiadmin_pass';\n";
- foreach ( $databases as $db ) {
- print "GRANT ALL PRIVILEGES ON `$db`.* TO wikiadmin@'$host' IDENTIFIED BY '$wikiadmin_pass';\n";
- }
- print "\n-- nagios\n\n";
- print "GRANT REPLICATION CLIENT ON *.* TO 'nagios'@'$host' IDENTIFIED BY '$nagios_pass';\n";
-
- print "\n";
-}
-
diff --git a/maintenance/parse.php b/maintenance/parse.php
new file mode 100644
index 00000000..876f28e9
--- /dev/null
+++ b/maintenance/parse.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * CLI script to easily parse some wikitext.
+ * Wikitext can be given by stdin or using a file. The wikitext will be parsed
+ * using 'CLIParser' as a title. This can be overriden with --title option.
+ *
+ * Example1:
+ * @code
+ * $ php parse.php --title foo
+ * ''[[foo]]''^D
+ * <p><i><strong class="selflink">foo</strong></i>
+ * </p>
+ * @endcode
+ *
+ * Example2:
+ * @code
+ * $ echo "'''bold'''" > /tmp/foo.txt
+ * $ php parse.php /tmp/foo.txt
+ * <p><b>bold</b>
+ * </p>$
+ * @endcode
+ *
+ * Example3:
+ * @code
+ * $ cat /tmp/foo | php parse.php
+ * <p><b>bold</b>
+ * </p>$
+ * @endcode
+ *
+ * @ingroup Maintenance
+ * @author Antoine Musso <hashar at free dot fr>
+ * @license GNU General Public License 2.0 or later
+ */
+require_once( dirname(__FILE__) . '/Maintenance.php' );
+
+class CLIParser extends Maintenance {
+ protected $parser;
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Parse a given wikitext";
+ $this->addOption( 'title', 'Title name for the given wikitext (Default: \'CLIParser\')', false, true );
+ $this->addArg( 'file', 'File containing wikitext (Default: stdin)', false );
+ }
+
+ public function execute() {
+ $this->initParser();
+ print $this->render( $this->WikiText() );
+ }
+
+ /**
+ * @param string $wikitext Wikitext to get rendered
+ * @return string HTML Rendering
+ */
+ public function render( $wikitext ) {
+ return $this->parse( $wikitext )->getText();
+ }
+
+ /**
+ * Get wikitext from a the file passed as argument or STDIN
+ * @return string Wikitext
+ */
+ protected function Wikitext() {
+
+ $php_stdin = 'php://stdin';
+ $input_file = $this->getArg( 0, $php_stdin );
+
+ if( $input_file === $php_stdin ) {
+ $this->error( basename(__FILE__) .": warning: reading wikitext from STDIN\n" );
+ }
+
+ return file_get_contents( $input_file );
+ }
+
+ protected function initParser() {
+ global $wgParserConf;
+ $parserClass = $wgParserConf['class'];
+ $this->parser = new $parserClass();
+ }
+
+ /**
+ * Title object to use for CLI parsing.
+ * Default title is 'CLIParser', it can be overriden with the option
+ * --title <Your:Title>
+ *
+ * @return Title object
+ */
+ protected function getTitle( ) {
+ $title =
+ $this->getOption( 'title' )
+ ? $this->getOption( 'title' )
+ : 'CLIParser' ;
+ return Title::newFromText( $title );
+ }
+
+ /**
+ * @param string $wikitext Wikitext to parse
+ * @return ParserOutput
+ */
+ protected function parse( $wikitext ) {
+ return $this->parser->parse(
+ $wikitext
+ , $this->getTitle()
+ , new ParserOptions()
+ );
+ }
+}
+
+$maintClass = "CLIParser";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php
index 4e9c44c4..0b45493e 100644
--- a/maintenance/populateCategory.php
+++ b/maintenance/populateCategory.php
@@ -22,8 +22,6 @@
* @author Simetrical
*/
-$optionsWithArgs = array( 'begin', 'max-slave-lag', 'throttle' );
-
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
diff --git a/maintenance/populateSha1.php b/maintenance/populateImageSha1.php
index 1ab9109d..4cd2747c 100644
--- a/maintenance/populateSha1.php
+++ b/maintenance/populateImageSha1.php
@@ -22,7 +22,7 @@
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-class PopulateSha1 extends Maintenance {
+class PopulateImageSha1 extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Populate the img_sha1 field";
@@ -31,26 +31,46 @@ class PopulateSha1 extends Maintenance {
$this->addOption( 'file', 'Fix for a specific file, without File: namespace prefixed', false, true );
}
+ protected function getUpdateKey() {
+ return 'populate img_sha1';
+ }
+
+ protected function updateSkippedMessage() {
+ return 'img_sha1 column of image table already populated.';
+ }
+
public function execute() {
+ if ( $this->getOption( 'file' ) ) {
+ $this->doDBUpdates(); // skip update log checks/saves
+ } else {
+ parent::execute();
+ }
+ }
+
+ public function doDBUpdates() {
$method = $this->getOption( 'method', 'normal' );
$file = $this->getOption( 'file' );
$t = -microtime( true );
$dbw = wfGetDB( DB_MASTER );
if ( $file ) {
- $res = $dbw->selectRow(
+ $res = $dbw->select(
'image',
array( 'img_name' ),
- array( 'img_name' => $dbw->addQuotes( $file ) ),
+ array( 'img_name' => $file ),
__METHOD__
);
if ( !$res ) {
$this->error( "No such file: $file", true );
- return;
+ return false;
}
+ $this->output( "Populating img_sha1 field for specified files\n" );
} else {
- $res = $dbw->select( 'image', array( 'img_name' ), array( 'img_sha1' => '' ), __METHOD__ );
+ $res = $dbw->select( 'image',
+ array( 'img_name' ), array( 'img_sha1' => '' ), __METHOD__ );
+ $this->output( "Populating img_sha1 field\n" );
}
+
$imageTable = $dbw->tableName( 'image' );
if ( $method == 'pipe' ) {
@@ -66,7 +86,7 @@ class PopulateSha1 extends Maintenance {
$numRows = $res->numRows();
$i = 0;
foreach ( $res as $row ) {
- if ( $i % 100 == 0 ) {
+ if ( $i % $this->mBatchSize == 0 ) {
$this->output( sprintf( "Done %d of %d, %5.3f%% \r", $i, $numRows, $i / $numRows * 100 ) );
wfWaitForSlaves();
}
@@ -74,7 +94,7 @@ class PopulateSha1 extends Maintenance {
if ( !$file ) {
continue;
}
- $sha1 = File::sha1Base36( $file->getPath() );
+ $sha1 = $file->getRepo()->getFileSha1( $file->getPath() );
if ( strval( $sha1 ) !== '' ) {
$sql = "UPDATE $imageTable SET img_sha1=" . $dbw->addQuotes( $sha1 ) .
" WHERE img_name=" . $dbw->addQuotes( $row->img_name );
@@ -92,8 +112,10 @@ class PopulateSha1 extends Maintenance {
}
$t += microtime( true );
$this->output( sprintf( "\nDone %d files in %.1f seconds\n", $numRows, $t ) );
+
+ return !$file; // we only updated *some* files, don't log
}
}
-$maintClass = "PopulateSha1";
+$maintClass = "PopulateImageSha1";
require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateLogSearch.php b/maintenance/populateLogSearch.php
index f13873cb..e3f6067f 100644
--- a/maintenance/populateLogSearch.php
+++ b/maintenance/populateLogSearch.php
@@ -23,21 +23,28 @@
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-class PopulateLogSearch extends Maintenance {
-
- const LOG_SEARCH_BATCH_SIZE = 100;
-
+class PopulateLogSearch extends LoggedUpdateMaintenance {
static $tableMap = array( 'rev' => 'revision', 'fa' => 'filearchive', 'oi' => 'oldimage', 'ar' => 'archive' );
public function __construct() {
parent::__construct();
$this->mDescription = "Migrate log params to new table and index for searching";
+ $this->setBatchSize( 100 );
+ }
+
+ protected function getUpdateKey() {
+ return 'populate log_search';
+ }
+
+ protected function updateSkippedMessage() {
+ return 'log_search table already populated.';
}
- public function execute() {
+ protected function doDBUpdates() {
$db = $this->getDB( DB_MASTER );
if ( !$db->tableExists( 'log_search' ) ) {
- $this->error( "log_search does not exist", true );
+ $this->error( "log_search does not exist" );
+ return false;
}
$start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ );
if ( !$start ) {
@@ -47,9 +54,9 @@ class PopulateLogSearch extends Maintenance {
$end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ );
# Do remaining chunk
- $end += self::LOG_SEARCH_BATCH_SIZE - 1;
+ $end += $this->mBatchSize - 1;
$blockStart = $start;
- $blockEnd = $start + self::LOG_SEARCH_BATCH_SIZE - 1;
+ $blockEnd = $start + $this->mBatchSize - 1;
$delTypes = array( 'delete', 'suppress' ); // revisiondelete types
while ( $blockEnd <= $end ) {
@@ -128,23 +135,12 @@ class PopulateLogSearch extends Maintenance {
$log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
}
}
- $blockStart += self::LOG_SEARCH_BATCH_SIZE;
- $blockEnd += self::LOG_SEARCH_BATCH_SIZE;
+ $blockStart += $this->mBatchSize;
+ $blockEnd += $this->mBatchSize;
wfWaitForSlaves();
}
- if ( $db->insert(
- 'updatelog',
- array( 'ul_key' => 'populate log_search' ),
- __FUNCTION__,
- 'IGNORE'
- )
- ) {
- $this->output( "log_search population complete.\n" );
- return true;
- } else {
- $this->output( "Could not insert log_search population row.\n" );
- return false;
- }
+ $this->output( "Done populating log_search table.\n" );
+ return true;
}
}
diff --git a/maintenance/populateLogUsertext.php b/maintenance/populateLogUsertext.php
index e9e6926e..2b0e2d64 100644
--- a/maintenance/populateLogUsertext.php
+++ b/maintenance/populateLogUsertext.php
@@ -25,14 +25,22 @@
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-class PopulateLogUsertext extends Maintenance {
+class PopulateLogUsertext extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
- $this->mDescription = "Populates the log_user_text";
+ $this->mDescription = "Populates the log_user_text field";
$this->setBatchSize( 100 );
}
- public function execute() {
+ protected function getUpdateKey() {
+ return 'populate log_usertext';
+ }
+
+ protected function updateSkippedMessage() {
+ return 'log_user_text column of logging table already populated.';
+ }
+
+ protected function doDBUpdates() {
$db = $this->getDB( DB_MASTER );
$start = $db->selectField( 'logging', 'MIN(log_id)', false, __METHOD__ );
if ( !$start ) {
@@ -61,19 +69,8 @@ class PopulateLogUsertext extends Maintenance {
$blockEnd += $this->mBatchSize;
wfWaitForSlaves();
}
- if ( $db->insert(
- 'updatelog',
- array( 'ul_key' => 'populate log_usertext' ),
- __METHOD__,
- 'IGNORE'
- )
- ) {
- $this->output( "log_usertext population complete.\n" );
- return true;
- } else {
- $this->output( "Could not insert log_usertext population row.\n" );
- return false;
- }
+ $this->output( "Done populating log_user_text field.\n" );
+ return true;
}
}
diff --git a/maintenance/populateParentId.php b/maintenance/populateParentId.php
index 7cbc267b..14f158c9 100644
--- a/maintenance/populateParentId.php
+++ b/maintenance/populateParentId.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Makes the required database updates for rev_parent_id
* to be of any use. It can be used for some simple tracking
* and to find new page edits by users.
@@ -24,28 +24,32 @@
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-class PopulateParentId extends Maintenance {
+class PopulateParentId extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Populates rev_parent_id";
- $this->setBatchSize( 200 );
}
- public function execute() {
+ protected function getUpdateKey() {
+ return 'populate rev_parent_id';
+ }
+
+ protected function updateSkippedMessage() {
+ return 'rev_parent_id column of revision table already populated.';
+ }
+
+ protected function doDBUpdates() {
$db = wfGetDB( DB_MASTER );
if ( !$db->tableExists( 'revision' ) ) {
- $this->error( "revision table does not exist", true );
+ $this->error( "revision table does not exist" );
+ return false;
}
$this->output( "Populating rev_parent_id column\n" );
$start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
$end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
if ( is_null( $start ) || is_null( $end ) ) {
- $this->output( "...revision table seems to be empty.\n" );
- $db->insert( 'updatelog',
- array( 'ul_key' => 'populate rev_parent_id' ),
- __METHOD__,
- 'IGNORE' );
- return;
+ $this->output( "...revision table seems to be empty, nothing to do.\n" );
+ return true;
}
# Do remaining chunk
$blockStart = intval( $start );
@@ -100,17 +104,8 @@ class PopulateParentId extends Maintenance {
$blockEnd += $this->mBatchSize;
wfWaitForSlaves();
}
- $logged = $db->insert( 'updatelog',
- array( 'ul_key' => 'populate rev_parent_id' ),
- __METHOD__,
- 'IGNORE' );
- if ( $logged ) {
- $this->output( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
- return true;
- } else {
- $this->output( "Could not insert rev_parent_id population row.\n" );
- return false;
- }
+ $this->output( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
+ return true;
}
}
diff --git a/maintenance/populateRevisionLength.php b/maintenance/populateRevisionLength.php
index d020b4cb..6626cbc1 100644
--- a/maintenance/populateRevisionLength.php
+++ b/maintenance/populateRevisionLength.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Populates the rev_len field for old revisions created before MW 1.10.
*
* This program is free software; you can redistribute it and/or modify
@@ -22,29 +22,35 @@
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-class PopulateRevisionLength extends Maintenance {
+class PopulateRevisionLength extends LoggedUpdateMaintenance {
public function __construct() {
parent::__construct();
- $this->mDescription = "Populates rev_len";
+ $this->mDescription = "Populates the rev_len field";
$this->setBatchSize( 200 );
}
- public function execute() {
+ protected function getUpdateKey() {
+ return 'populate rev_len';
+ }
+
+ protected function updateSkippedMessage() {
+ return 'rev_len column of revision table already populated.';
+ }
+
+ public function doDBUpdates() {
$db = $this->getDB( DB_MASTER );
if ( !$db->tableExists( 'revision' ) ) {
$this->error( "revision table does not exist", true );
}
$this->output( "Populating rev_len column\n" );
- $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
- $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
- if ( is_null( $start ) || is_null( $end ) ) {
+
+ $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __METHOD__ );
+ $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
+ if ( !$start || !$end ) {
$this->output( "...revision table seems to be empty.\n" );
- $db->insert( 'updatelog',
- array( 'ul_key' => 'populate rev_len' ),
- __METHOD__,
- 'IGNORE' );
- return;
+ return true;
}
+
# Do remaining chunks
$blockStart = intval( $start );
$blockEnd = intval( $start ) + $this->mBatchSize - 1;
@@ -80,17 +86,9 @@ class PopulateRevisionLength extends Maintenance {
$blockEnd += $this->mBatchSize;
wfWaitForSlaves();
}
- $logged = $db->insert( 'updatelog',
- array( 'ul_key' => 'populate rev_len' ),
- __METHOD__,
- 'IGNORE' );
- if ( $logged ) {
- $this->output( "rev_len population complete ... {$count} rows changed ({$missing} missing)\n" );
- return true;
- } else {
- $this->output( "Could not insert rev_len population row.\n" );
- return false;
- }
+
+ $this->output( "rev_len population complete ... {$count} rows changed ({$missing} missing)\n" );
+ return true;
}
}
diff --git a/maintenance/populateRevisionSha1.php b/maintenance/populateRevisionSha1.php
new file mode 100644
index 00000000..55e2a93d
--- /dev/null
+++ b/maintenance/populateRevisionSha1.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ * Fills the rev_sha1 and ar_sha1 columns of revision
+ * and archive tables for revisions created before MW 1.19.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Populates the rev_sha1 and ar_sha1 fields";
+ $this->setBatchSize( 200 );
+ }
+
+ protected function getUpdateKey() {
+ return 'populate rev_sha1';
+ }
+
+ protected function doDBUpdates() {
+ $db = $this->getDB( DB_MASTER );
+
+ if ( !$db->tableExists( 'revision' ) ) {
+ $this->error( "revision table does not exist", true );
+ } elseif ( !$db->tableExists( 'archive' ) ) {
+ $this->error( "archive table does not exist", true );
+ }
+
+ $this->output( "Populating rev_sha1 column\n" );
+ $rc = $this->doSha1Updates( 'revision', 'rev_id', 'rev' );
+
+ $this->output( "Populating ar_sha1 column\n" );
+ $ac = $this->doSha1Updates( 'archive', 'ar_rev_id', 'ar' );
+ $this->output( "Populating ar_sha1 column legacy rows\n" );
+ $ac += $this->doSha1LegacyUpdates();
+
+ $this->output( "rev_sha1 and ar_sha1 population complete [$rc revision rows, $ac archive rows].\n" );
+ return true;
+ }
+
+ /**
+ * @param $table string
+ * @param $idCol
+ * @param $prefix string
+ * @return Integer Rows changed
+ */
+ protected function doSha1Updates( $table, $idCol, $prefix ) {
+ $db = $this->getDB( DB_MASTER );
+ $start = $db->selectField( $table, "MIN($idCol)", false, __METHOD__ );
+ $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ );
+ if ( !$start || !$end ) {
+ $this->output( "...$table table seems to be empty.\n" );
+ return 0;
+ }
+
+ $count = 0;
+ # Do remaining chunk
+ $end += $this->mBatchSize - 1;
+ $blockStart = $start;
+ $blockEnd = $start + $this->mBatchSize - 1;
+ while ( $blockEnd <= $end ) {
+ $this->output( "...doing $idCol from $blockStart to $blockEnd\n" );
+ $cond = "$idCol BETWEEN $blockStart AND $blockEnd
+ AND $idCol IS NOT NULL AND {$prefix}_sha1 = ''";
+ $res = $db->select( $table, '*', $cond, __METHOD__ );
+
+ $db->begin();
+ foreach ( $res as $row ) {
+ if ( $this->upgradeRow( $row, $table, $idCol, $prefix ) ) {
+ $count++;
+ }
+ }
+ $db->commit();
+
+ $blockStart += $this->mBatchSize;
+ $blockEnd += $this->mBatchSize;
+ wfWaitForSlaves();
+ }
+ return $count;
+ }
+
+ /**
+ * @return int
+ */
+ protected function doSha1LegacyUpdates() {
+ $count = 0;
+ $db = $this->getDB( DB_MASTER );
+ $res = $db->select( 'archive', '*', array( 'ar_rev_id IS NULL' ), __METHOD__ );
+
+ $updateSize = 0;
+ $db->begin();
+ foreach ( $res as $row ) {
+ if ( $this->upgradeLegacyArchiveRow( $row ) ) {
+ ++$count;
+ }
+ if ( ++$updateSize >= 100 ) {
+ $updateSize = 0;
+ $db->commit();
+ $this->output( "Commited row with ar_timestamp={$row->ar_timestamp}\n" );
+ wfWaitForSlaves();
+ $db->begin();
+ }
+ }
+ $db->commit();
+ return $count;
+ }
+
+ /**
+ * @param $row
+ * @param $table
+ * @param $idCol
+ * @param $prefix
+ * @return bool
+ */
+ protected function upgradeRow( $row, $table, $idCol, $prefix ) {
+ $db = $this->getDB( DB_MASTER );
+ if ( $table === 'archive' ) {
+ $rev = Revision::newFromArchiveRow( $row );
+ } else {
+ $rev = new Revision( $row );
+ }
+ $text = $rev->getRawText();
+ if ( !is_string( $text ) ) {
+ # This should not happen, but sometimes does (bug 20757)
+ $this->output( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+ return false;
+ } else {
+ $db->update( $table,
+ array( "{$prefix}_sha1" => Revision::base36Sha1( $text ) ),
+ array( $idCol => $row->$idCol ),
+ __METHOD__
+ );
+ return true;
+ }
+ }
+
+ /**
+ * @param $row
+ * @return bool
+ */
+ protected function upgradeLegacyArchiveRow( $row ) {
+ $db = $this->getDB( DB_MASTER );
+ $rev = Revision::newFromArchiveRow( $row );
+ $text = $rev->getRawText();
+ if ( !is_string( $text ) ) {
+ # This should not happen, but sometimes does (bug 20757)
+ $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+ return false;
+ } else {
+ # Archive table as no PK, but (NS,title,time) should be near unique.
+ # Any duplicates on those should also have duplicated text anyway.
+ $db->update( 'archive',
+ array( 'ar_sha1' => Revision::base36Sha1( $text ) ),
+ array(
+ 'ar_namespace' => $row->ar_namespace,
+ 'ar_title' => $row->ar_title,
+ 'ar_timestamp' => $row->ar_timestamp,
+ 'ar_len' => $row->ar_len // extra sanity
+ ),
+ __METHOD__
+ );
+ return true;
+ }
+ }
+}
+
+$maintClass = "PopulateRevisionSha1";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/postgres/mediawiki_mysql2postgres.pl b/maintenance/postgres/mediawiki_mysql2postgres.pl
index 9133477e..8f170abc 100644
--- a/maintenance/postgres/mediawiki_mysql2postgres.pl
+++ b/maintenance/postgres/mediawiki_mysql2postgres.pl
@@ -417,7 +417,6 @@ SELECT setval('page_restrictions_pr_id_seq', 1+coalesce(max(pr_id) ,0),false) F
SELECT setval('recentchanges_rc_id_seq', 1+coalesce(max(rc_id) ,0),false) FROM recentchanges;
SELECT setval('revision_rev_id_seq', 1+coalesce(max(rev_id) ,0),false) FROM revision;
SELECT setval('text_old_id_seq', 1+coalesce(max(old_id) ,0),false) FROM pagecontent;
-SELECT setval('trackbacks_tb_id_seq', 1+coalesce(max(tb_id) ,0),false) FROM trackbacks;
SELECT setval('user_user_id_seq', 1+coalesce(max(user_id),0),false) FROM mwuser;
};
@@ -437,7 +436,6 @@ profiling
objectcache
## Which tables to ignore depending on the version
-VERSION 1.5: trackback
VERSION 1.6: externallinks job templatelinks transcache
VERSION 1.7: filearchive langlinks querycache_info
VERSION 1.9: querycachetwo page_restrictions redirect
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 9f6b8049..6890df91 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -16,7 +16,6 @@ DROP SEQUENCE IF EXISTS page_restrictions_id_seq CASCADE;
DROP SEQUENCE IF EXISTS ipblocks_ipb_id_seq CASCADE;
DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE;
DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE;
-DROP SEQUENCE IF EXISTS trackbacks_tb_id_seq CASCADE;
DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE;
DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE;
DROP FUNCTION IF EXISTS page_deleted() CASCADE;
@@ -116,7 +115,8 @@ CREATE TABLE revision (
rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
rev_deleted SMALLINT NOT NULL DEFAULT 0,
rev_len INTEGER NULL,
- rev_parent_id INTEGER NULL
+ rev_parent_id INTEGER NULL,
+ rev_sha1 TEXT NOT NULL DEFAULT ''
);
CREATE UNIQUE INDEX revision_unique ON revision (rev_page, rev_id);
CREATE INDEX rev_text_id_idx ON revision (rev_text_id);
@@ -159,6 +159,7 @@ CREATE TABLE archive (
ar_text TEXT, -- technically should be bytea, but not used anymore
ar_page_id INTEGER NULL,
ar_parent_id INTEGER NULL,
+ ar_sha1 TEXT NOT NULL DEFAULT '',
ar_comment TEXT,
ar_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
ar_user_text TEXT NOT NULL,
@@ -358,11 +359,11 @@ CREATE INDEX fa_dupe ON filearchive (fa_storage_group, fa_storage_key);
CREATE INDEX fa_notime ON filearchive (fa_deleted_timestamp);
CREATE INDEX fa_nouser ON filearchive (fa_deleted_user);
-CREATE SEQUENCE us_id_seq;
+CREATE SEQUENCE uploadstash_us_id_seq;
CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE');
CREATE TABLE uploadstash (
- us_id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('us_id_seq'),
+ us_id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('uploadstash_us_id_seq'),
us_user INTEGER,
us_key TEXT,
us_orig_path TEXT,
@@ -370,6 +371,7 @@ CREATE TABLE uploadstash (
us_source_type TEXT,
us_timestamp TIMESTAMPTZ,
us_status TEXT,
+ us_chunk_inx INTEGER NULL,
us_size INTEGER,
us_sha1 TEXT,
us_mime TEXT,
@@ -510,17 +512,6 @@ CREATE TABLE log_search (
);
CREATE INDEX ls_log_id ON log_search (ls_log_id);
-CREATE SEQUENCE trackbacks_tb_id_seq;
-CREATE TABLE trackbacks (
- tb_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('trackbacks_tb_id_seq'),
- tb_page INTEGER REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
- tb_title TEXT NOT NULL,
- tb_url TEXT NOT NULL,
- tb_ex TEXT,
- tb_name TEXT
-);
-CREATE INDEX trackback_page ON trackbacks (tb_page);
-
CREATE SEQUENCE job_job_id_seq;
CREATE TABLE job (
@@ -528,9 +519,11 @@ CREATE TABLE job (
job_cmd TEXT NOT NULL,
job_namespace SMALLINT NOT NULL,
job_title TEXT NOT NULL,
+ job_timestamp TIMESTAMPTZ,
job_params TEXT NOT NULL
);
CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
+CREATE INDEX job_timestamp_idx ON job (job_timestamp);
-- Tsearch2 2 stuff. Will fail if we don't have proper access to the tsearch2 tables
-- Version 8.3 or higher only. Previous versions would need another parmeter for to_tsvector.
diff --git a/maintenance/protect.php b/maintenance/protect.php
index aab84d68..56958ea7 100644
--- a/maintenance/protect.php
+++ b/maintenance/protect.php
@@ -28,8 +28,9 @@ class Protect extends Maintenance {
$this->mDescription = "Protect or unprotect an article from the command line.";
$this->addOption( 'unprotect', 'Removes protection' );
$this->addOption( 'semiprotect', 'Adds semi-protection' );
- $this->addOption( 'u', 'Username to protect with', false, true );
- $this->addOption( 'r', 'Reason for un/protection', false, true );
+ $this->addOption( 'cascade', 'Add cascading protection' );
+ $this->addOption( 'user', 'Username to protect with', false, true, 'u' );
+ $this->addOption( 'reason', 'Reason for un/protection', false, true, 'r' );
$this->addArg( 'title', 'Title to protect', true );
}
@@ -39,6 +40,8 @@ class Protect extends Maintenance {
$userName = $this->getOption( 'u', 'Maintenance script' );
$reason = $this->getOption( 'r', '' );
+ $cascade = $this->hasOption( 'cascade' );
+
$protection = "sysop";
if ( $this->hasOption( 'semiprotect' ) ) {
$protection = "autoconfirmed";
@@ -46,7 +49,11 @@ class Protect extends Maintenance {
$protection = "";
}
- $wgUser = User::newFromName( $userName );
+ $user = User::newFromName( $userName );
+ if ( !$user ) {
+ $this->error( "Invalid username", true );
+ }
+
$restrictions = array( 'edit' => $protection, 'move' => $protection );
$t = Title::newFromText( $this->getArg() );
@@ -54,12 +61,18 @@ class Protect extends Maintenance {
$this->error( "Invalid title", true );
}
- $article = new Article( $t );
+ $restrictions = array();
+ foreach( $t->getRestrictionTypes() as $type ) {
+ $restrictions[$type] = $protection;
+ }
# un/protect the article
$this->output( "Updating protection status... " );
- $success = $article->updateRestrictions( $restrictions, $reason );
- if ( $success ) {
+
+ $page = WikiPage::factory( $t );
+ $status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, $reason, $user );
+
+ if ( $status->isOK() ) {
$this->output( "done\n" );
} else {
$this->output( "failed\n" );
diff --git a/maintenance/proxy_check.php b/maintenance/proxy_check.php
index 2bc46c0d..9c5f32b2 100644
--- a/maintenance/proxy_check.php
+++ b/maintenance/proxy_check.php
@@ -3,6 +3,7 @@
* Command line script to check for an open proxy at a specified location
*
* @file
+ * @ingroup Maintenance
*/
if( php_sapi_name() != 'cli' ) {
diff --git a/maintenance/pruneFileCache.php b/maintenance/pruneFileCache.php
new file mode 100644
index 00000000..f1a1cfd4
--- /dev/null
+++ b/maintenance/pruneFileCache.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Prune file cache for pages, objects, resources, ect...
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class PruneFileCache extends Maintenance {
+
+ protected $minSurviveTimestamp;
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Build file cache for content pages";
+ $this->addOption( 'agedays', 'How many days old files must be in order to delete', true, true );
+ $this->addOption( 'subdir', 'Prune one $wgFileCacheDirectory subdirectory name', false, true );
+ }
+
+ public function execute() {
+ global $wgUseFileCache, $wgFileCacheDirectory;
+
+ if ( !$wgUseFileCache ) {
+ $this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true );
+ }
+
+ $age = $this->getOption( 'agedays' );
+ if ( !ctype_digit( $age ) ) {
+ $this->error( "Non-integer 'age' parameter given.", true );
+ }
+ // Delete items with a TS older than this
+ $this->minSurviveTimestamp = time() - ( 86400 * $age );
+
+ $dir = $wgFileCacheDirectory;
+ if ( !is_dir( $dir ) ) {
+ $this->error( "Nothing to do -- \$wgFileCacheDirectory directory not found.", true );
+ }
+
+ $subDir = $this->getOption( 'subdir' );
+ if ( $subDir !== null ) {
+ if ( !is_dir( "$dir/$subDir" ) ) {
+ $this->error( "The specified subdirectory `$subDir` does not exist.", true );
+ }
+ $this->output( "Pruning `$dir/$subDir` directory...\n" );
+ $this->prune_directory( "$dir/$subDir", 'report' );
+ $this->output( "Done pruning `$dir/$subDir` directory\n" );
+ } else {
+ $this->output( "Pruning `$dir` directory...\n" );
+ // Note: don't prune things like .cdb files on the top level!
+ $this->prune_directory( $dir, 'report' );
+ $this->output( "Done pruning `$dir` directory\n" );
+ }
+ }
+
+ /**
+ * @param $dir string
+ * @param $report string|bool Use 'report' to report the directories being scanned
+ */
+ protected function prune_directory( $dir, $report = false ) {
+ $tsNow = time();
+ $dirHandle = opendir( $dir );
+ while ( false !== ( $file = readdir( $dirHandle ) ) ) {
+ // Skip ".", "..", and also any dirs or files like ".svn" or ".htaccess"
+ if ( $file[0] != "." ) {
+ $path = $dir . '/' . $file; // absolute
+ if ( is_dir( $path ) ) {
+ if ( $report === 'report' ) {
+ $this->output( "Scanning `$path`...\n" );
+ }
+ $this->prune_directory( $path );
+ } else {
+ $mts = filemtime( $path );
+ // Sanity check the file extension against known cache types
+ if ( $mts < $this->minSurviveTimestamp
+ && preg_match( '/\.(?:html|cache)(?:\.gz)?$/', $file )
+ && unlink( $path ) )
+ {
+ $daysOld = round( ( $tsNow - $mts ) / 86400, 2 );
+ $this->output( "Deleted `$path` [days=$daysOld]\n" );
+ }
+ }
+ }
+ }
+ closedir( $dirHandle );
+ }
+}
+
+$maintClass = "PruneFileCache";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php
new file mode 100644
index 00000000..c8d4fc07
--- /dev/null
+++ b/maintenance/purgeDeletedFiles.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Scans 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
+ *
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+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 85a7aae2..f1452bca 100644
--- a/maintenance/purgeList.php
+++ b/maintenance/purgeList.php
@@ -47,7 +47,7 @@ class PurgeList extends Maintenance {
while ( !feof( $stdin ) ) {
$page = trim( fgets( $stdin ) );
- if ( substr( $page, 0, 7 ) == 'http://' ) {
+ if ( preg_match( '%^https?://%', $page ) ) {
$urls[] = $page;
} elseif ( $page !== '' ) {
$title = Title::newFromText( $page );
diff --git a/maintenance/purgeParserCache.php b/maintenance/purgeParserCache.php
index 4b550b6e..4d775f95 100644
--- a/maintenance/purgeParserCache.php
+++ b/maintenance/purgeParserCache.php
@@ -1,8 +1,14 @@
<?php
+/**
+ * @ingroup Maintenance
+ * @file
+ */
require( dirname( __FILE__ ) . '/Maintenance.php' );
class PurgeParserCache extends Maintenance {
+ var $lastProgress;
+
function __construct() {
parent::__construct();
$this->addDescription( "Remove old objects from the parser cache. " .
@@ -31,12 +37,26 @@ class PurgeParserCache extends Maintenance {
echo "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n";
$pc = wfGetParserCacheStorage();
- $success = $pc->deleteObjectsExpiringBefore( $date );
+ $success = $pc->deleteObjectsExpiringBefore( $date, array( $this, 'showProgress' ) );
if ( !$success ) {
- echo "Cannot purge this kind of parser cache.\n";
+ echo "\nCannot purge this kind of parser cache.\n";
exit( 1 );
}
- echo "Done\n";
+ $this->showProgress( 100 );
+ echo "\nDone\n";
+ }
+
+ function showProgress( $percent ) {
+ $percentString = sprintf( "%.2f", $percent );
+ if ( $percentString === $this->lastProgress ) {
+ return;
+ }
+ $this->lastProgress = $percentString;
+
+ $stars = floor( $percent / 2 );
+ echo '[' . str_repeat( '*', $stars ), str_repeat( '.', 50 - $stars ) . '] ' .
+ "$percentString%\r";
+
}
}
$maintClass = 'PurgeParserCache';
diff --git a/maintenance/purgeStaleMemcachedText.php b/maintenance/purgeStaleMemcachedText.php
index c4f5006f..fc9a6a89 100644
--- a/maintenance/purgeStaleMemcachedText.php
+++ b/maintenance/purgeStaleMemcachedText.php
@@ -1,4 +1,8 @@
<?php
+/**
+ * @ingroup Maintenance Memcached
+ * @file
+ */
require_once( dirname( __FILE__ ) . '/commandLine.inc' );
diff --git a/maintenance/reassignEdits.php b/maintenance/reassignEdits.php
index bb34e51c..3830fe38 100644
--- a/maintenance/reassignEdits.php
+++ b/maintenance/reassignEdits.php
@@ -139,8 +139,8 @@ class ReassignEdits extends Maintenance {
* i.e. user => id, user_text => text
*
* @param $user User for the spec
- * @param $idfield Field name containing the identifier
- * @param $utfield Field name containing the user text
+ * @param $idfield string Field name containing the identifier
+ * @param $utfield string Field name containing the user text
* @return array
*/
private function userSpecification( &$user, $idfield, $utfield ) {
@@ -160,6 +160,9 @@ class ReassignEdits extends Maintenance {
$user->setName( $username );
} else {
$user = User::newFromName( $username );
+ if ( !$user ) {
+ $this->error( "Invalid username", true );
+ }
}
$user->load();
return $user;
diff --git a/maintenance/rebuildFileCache.php b/maintenance/rebuildFileCache.php
index 84ada11c..e7ce3521 100644
--- a/maintenance/rebuildFileCache.php
+++ b/maintenance/rebuildFileCache.php
@@ -26,29 +26,52 @@ class RebuildFileCache extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Build file cache for content pages";
- $this->addArg( 'start', 'Page_id to start from', true );
- $this->addArg( 'overwrite', 'Refresh page cache', false );
+ $this->addOption( 'start', 'Page_id to start from', false, true );
+ $this->addOption( 'end', 'Page_id to end on', false, true );
+ $this->addOption( 'overwrite', 'Refresh page cache' );
$this->setBatchSize( 100 );
}
+ public function finalSetup() {
+ global $wgDebugToolbar;
+
+ // Debug toolbar makes content uncacheable so we disable it.
+ // Has to be done before Setup.php initialize MWDebug
+ $wgDebugToolbar = false;
+ parent::finalSetup();
+ }
+
public function execute() {
- global $wgUseFileCache, $wgDisableCounters, $wgContentNamespaces, $wgRequestTime;
+ global $wgUseFileCache, $wgReadOnly, $wgContentNamespaces, $wgRequestTime;
global $wgTitle, $wgOut;
if ( !$wgUseFileCache ) {
$this->error( "Nothing to do -- \$wgUseFileCache is disabled.", true );
}
- $wgDisableCounters = false;
- $start = $this->getArg( 0, "0" );
+
+ $wgReadOnly = 'Building cache'; // avoid DB writes (like enotif/counters)
+
+ $start = $this->getOption( 'start', "0" );
if ( !ctype_digit( $start ) ) {
$this->error( "Invalid value for start parameter.", true );
}
$start = intval( $start );
- $overwrite = $this->hasArg( 1 ) && $this->getArg( 1 ) === 'overwrite';
+
+ $end = $this->getOption( 'end', "0" );
+ if ( !ctype_digit( $end ) ) {
+ $this->error( "Invalid value for end parameter.", true );
+ }
+ $end = intval( $end );
+
$this->output( "Building content page file cache from page {$start}!\n" );
$dbr = wfGetDB( DB_SLAVE );
- $start = $start > 0 ? $start : $dbr->selectField( 'page', 'MIN(page_id)', false, __FUNCTION__ );
- $end = $dbr->selectField( 'page', 'MAX(page_id)', false, __FUNCTION__ );
+ $overwrite = $this->getOption( 'overwrite', false );
+ $start = ( $start > 0 )
+ ? $start
+ : $dbr->selectField( 'page', 'MIN(page_id)', false, __FUNCTION__ );
+ $end = ( $end > 0 )
+ ? $end
+ : $dbr->selectField( 'page', 'MAX(page_id)', false, __FUNCTION__ );
if ( !$start ) {
$this->error( "Nothing to do.", true );
}
@@ -69,22 +92,29 @@ class RebuildFileCache extends Maintenance {
"page_id BETWEEN $blockStart AND $blockEnd" ),
array( 'ORDER BY' => 'page_id ASC', 'USE INDEX' => 'PRIMARY' )
);
+
+ $dbw->begin(); // for any changes
foreach ( $res as $row ) {
$rebuilt = false;
- $wgRequestTime = wfTime(); # bug 22852
- $context = new RequestContext;
+ $wgRequestTime = microtime( true ); # bug 22852
+
$wgTitle = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- $context->setTitle( $wgTitle );
if ( null == $wgTitle ) {
$this->output( "Page {$row->page_id} has bad title\n" );
continue; // broken title?
}
+
+ $context = new RequestContext;
+ $context->setTitle( $wgTitle );
+ $article = Article::newFromTitle( $wgTitle, $context );
+ $context->setWikiPage( $article->getPage() );
+
$wgOut = $context->getOutput(); // set display title
- $article = new Article( $wgTitle );
+
// If the article is cacheable, then load it
if ( $article->isFileCacheable() ) {
- $cache = new HTMLFileCache( $wgTitle );
- if ( $cache->isFileCacheGood() ) {
+ $cache = HTMLFileCache::newFromTitle( $wgTitle, 'view' );
+ if ( $cache->isCacheGood() ) {
if ( $overwrite ) {
$rebuilt = true;
} else {
@@ -100,18 +130,19 @@ class RebuildFileCache extends Maintenance {
wfRestoreWarnings();
$wgUseFileCache = true;
ob_end_clean(); // clear buffer
- if ( $rebuilt )
+ if ( $rebuilt ) {
$this->output( "Re-cached page {$row->page_id}\n" );
- else
+ } else {
$this->output( "Cached page {$row->page_id}\n" );
+ }
} else {
$this->output( "Page {$row->page_id} not cacheable\n" );
}
- $dbw->commit(); // commit any changes
}
+ $dbw->commit(); // commit any changes (just for sanity)
+
$blockStart += $this->mBatchSize;
$blockEnd += $this->mBatchSize;
- wfWaitForSlaves();
}
$this->output( "Done!\n" );
diff --git a/maintenance/rebuildImages.php b/maintenance/rebuildImages.php
index 17111831..fe3b35c9 100644
--- a/maintenance/rebuildImages.php
+++ b/maintenance/rebuildImages.php
@@ -27,7 +27,7 @@
*
* @file
* @author Brion Vibber <brion at pobox.com>
- * @ingroup maintenance
+ * @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
@@ -148,8 +148,7 @@ class ImageBuilder extends Maintenance {
}
function buildOldImage() {
- $this->buildTable( 'oldimage', 'oi_archive_name',
- array( $this, 'oldimageCallback' ) );
+ $this->buildTable( 'oldimage', 'oi_archive_name', array( $this, 'oldimageCallback' ) );
}
function oldimageCallback( $row, $copy ) {
@@ -164,42 +163,33 @@ class ImageBuilder extends Maintenance {
}
function crawlMissing() {
- $repo = RepoGroup::singleton()->getLocalRepo();
- $repo->enumFilesInFS( array( $this, 'checkMissingImage' ) );
+ $this->getRepo()->enumFiles( array( $this, 'checkMissingImage' ) );
}
function checkMissingImage( $fullpath ) {
$filename = wfBaseName( $fullpath );
- if ( is_dir( $fullpath ) ) {
- return;
- }
- if ( is_link( $fullpath ) ) {
- $this->output( "skipping symlink at $fullpath\n" );
- return;
- }
$row = $this->dbw->selectRow( 'image',
array( 'img_name' ),
array( 'img_name' => $filename ),
__METHOD__ );
- if ( $row ) {
- // already known, move on
- return;
- } else {
+ if ( !$row ) { // file not registered
$this->addMissingImage( $filename, $fullpath );
}
}
function addMissingImage( $filename, $fullpath ) {
- $timestamp = $this->dbw->timestamp( filemtime( $fullpath ) );
-
global $wgContLang;
+
+ $timestamp = $this->dbw->timestamp( $this->getRepo()->getFileTimestamp( $fullpath ) );
+
$altname = $wgContLang->checkTitleEncoding( $filename );
if ( $altname != $filename ) {
if ( $this->dryrun ) {
$filename = $altname;
$this->output( "Estimating transcoding... $altname\n" );
} else {
+ # @FIXME: create renameFile()
$filename = $this->renameFile( $filename );
}
}
diff --git a/maintenance/rebuildInterwiki.php b/maintenance/rebuildInterwiki.php
deleted file mode 100644
index 25aea2de..00000000
--- a/maintenance/rebuildInterwiki.php
+++ /dev/null
@@ -1,275 +0,0 @@
-<?php
-/**
- * Rebuild interwiki table using the file on meta and the language list
- * Wikimedia specific!
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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
- * @ingroup Maintenance
- * @ingroup Wikimedia
- */
-
-require_once( dirname( __FILE__ ) . '/Site.php' );
-
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
-class RebuildInterwiki extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Rebuild the interwiki table using the file on meta and the language list.";
- $this->addOption( 'langlist', 'File with one language code per line', false, true );
- $this->addOption( 'dblist', 'File with one db per line', false, true );
- $this->addOption( 'd', 'Output folder', false, true );
- }
-
- function execute() {
- # List of language prefixes likely to be found in multi-language sites
- $this->langlist = array_map( "trim", file( $this->getOption( 'langlist', "/home/wikipedia/common/langlist" ) ) );
-
- # List of all database names
- $this->dblist = array_map( "trim", file( $this->getOption( 'dblist', "/home/wikipedia/common/all.dblist" ) ) );
-
- # Special-case databases
- //$this->specials = array_flip( array_map( "trim", file( $this->getOption( 'specialdbs', "/home/wikipedia/common/special.dblist" ) ) ) );
-
- $this->makeInterwikiSQL( $this->getOption( 'd', '/home/wikipedia/conf/interwiki/sql' ) );
- }
-
- function makeInterwikiSQL( $destDir ) {
- $this->output( "Making new interwiki SQL files in $destDir\n" );
-
- # Multi-language sites
- # db suffix => db suffix, iw prefix, hostname
- $sites = array(
- 'wiki' => new Site( 'wiki', 'w', 'wikipedia.org' ),
- 'wiktionary' => new Site( 'wiktionary', 'wikt', 'wiktionary.org' ),
- 'wikiquote' => new Site( 'wikiquote', 'q', 'wikiquote.org' ),
- 'wikibooks' => new Site( 'wikibooks', 'b', 'wikibooks.org' ),
- 'wikinews' => new Site( 'wikinews', 'n', 'wikinews.org' ),
- 'wikisource' => new Site( 'wikisource', 's', 'wikisource.org' ),
- 'wikimedia' => new Site( 'wikimedia', 'chapter', 'wikimedia.org' ),
- 'wikiversity' => new Site( 'wikiversity', 'v', 'wikiversity.org' ),
- );
-
- # Special-case hostnames
- $this->specials = array(
- 'sourceswiki' => 'sources.wikipedia.org',
- 'quotewiki' => 'wikiquote.org',
- 'textbookwiki' => 'wikibooks.org',
- 'sep11wiki' => 'sep11.wikipedia.org',
- 'metawiki' => 'meta.wikimedia.org',
- 'commonswiki' => 'commons.wikimedia.org',
- 'specieswiki' => 'species.wikimedia.org',
- );
-
- # Extra interwiki links that can't be in the intermap for some reason
- $extraLinks = array(
- array( 'm', 'http://meta.wikimedia.org/wiki/$1', 1 ),
- array( 'meta', 'http://meta.wikimedia.org/wiki/$1', 1 ),
- array( 'sep11', 'http://sep11.wikipedia.org/wiki/$1', 1 ),
- );
-
- # Language aliases, usually configured as redirects to the real wiki in apache
- # Interlanguage links are made directly to the real wiki
- # Something horrible happens if you forget to list an alias here, I can't
- # remember what
- $this->languageAliases = array(
- 'zh-cn' => 'zh',
- 'zh-tw' => 'zh',
- 'dk' => 'da',
- 'nb' => 'no',
- );
-
- # Special case prefix rewrites, for the benefit of Swedish which uses s:t
- # as an abbreviation for saint
- $this->prefixRewrites = array(
- 'svwiki' => array( 's' => 'src' ),
- );
-
- # Construct a list of reserved prefixes
- $reserved = array();
- foreach ( $this->langlist as $lang ) {
- $reserved[$lang] = 1;
- }
- foreach ( $this->languageAliases as $alias => $lang ) {
- $reserved[$alias] = 1;
- }
- foreach ( $sites as $site ) {
- $reserved[$site->lateral] = 1;
- }
-
- # Extract the intermap from meta
- $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 );
- $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) );
-
- if ( !$lines || count( $lines ) < 2 ) {
- $this->error( "m:Interwiki_map not found", true );
- }
-
- $iwArray = array();
-
- foreach ( $lines as $line ) {
- $matches = array();
- if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(https?:\/\/.*?)\s*$/', $line, $matches ) ) {
- $prefix = strtolower( $matches[1] );
- $url = $matches[2];
- if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia)\.org/', $url ) ) {
- $local = 1;
- } else {
- $local = 0;
- }
-
- if ( empty( $reserved[$prefix] ) ) {
- $iwArray[$prefix] = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local );
- }
- }
- }
-
- foreach ( $this->dblist as $db ) {
- $sql = "-- Generated by rebuildInterwiki.php";
- if ( isset( $this->specials[$db] ) ) {
- # Special wiki
- # Has interwiki links and interlanguage links to wikipedia
-
- $host = $this->specials[$db];
- $sql .= "\n--$host\n\n";
- $sql .= "USE $db;\n" .
- "TRUNCATE TABLE interwiki;\n" .
- "INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES \n";
- $first = true;
-
- # Intermap links
- foreach ( $iwArray as $iwEntry ) {
- $sql .= $this->makeLink( $iwEntry, $first, $db );
- }
-
- # Links to multilanguage sites
- foreach ( $sites as $targetSite ) {
- $sql .= $this->makeLink( array( $targetSite->lateral, $targetSite->getURL( 'en' ), 1 ), $first, $db );
- }
-
- # Interlanguage links to wikipedia
- $sql .= $this->makeLanguageLinks( $sites['wiki'], $first, $db );
-
- # Extra links
- foreach ( $extraLinks as $link ) {
- $sql .= $this->makeLink( $link, $first, $db );
- }
-
- $sql .= ";\n";
- } else {
- # Find out which site this DB belongs to
- $site = false;
- foreach ( $sites as $candidateSite ) {
- $suffix = $candidateSite->suffix;
- if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) {
- $site = $candidateSite;
- break;
- }
- }
- if ( !$site ) {
- print "Invalid database $db\n";
- continue;
- }
- $lang = $matches[1];
- $host = "$lang." . $site->url;
- $sql .= "\n--$host\n\n";
-
- $sql .= "USE $db;\n" .
- "TRUNCATE TABLE interwiki;\n" .
- "INSERT INTO interwiki (iw_prefix,iw_url,iw_local) VALUES\n";
- $first = true;
-
- # Intermap links
- foreach ( $iwArray as $iwEntry ) {
- # Suppress links with the same name as the site
- if ( ( $suffix == 'wiki' && $iwEntry['iw_prefix'] != 'wikipedia' ) ||
- ( $suffix != 'wiki' && $suffix != $iwEntry['iw_prefix'] ) )
- {
- $sql .= $this->makeLink( $iwEntry, $first, $db );
- }
- }
-
- # Lateral links
- foreach ( $sites as $targetSite ) {
- # Suppress link to self
- if ( $targetSite->suffix != $site->suffix ) {
- $sql .= $this->makeLink( array( $targetSite->lateral, $targetSite->getURL( $lang ), 1 ), $first, $db );
- }
- }
-
- # Interlanguage links
- $sql .= $this->makeLanguageLinks( $site, $first, $db );
-
- # w link within wikipedias
- # Other sites already have it as a lateral link
- if ( $site->suffix == "wiki" ) {
- $sql .= $this->makeLink( array( "w", "http://en.wikipedia.org/wiki/$1", 1 ), $first, $db );
- }
-
- # Extra links
- foreach ( $extraLinks as $link ) {
- $sql .= $this->makeLink( $link, $first, $db );
- }
- $sql .= ";\n";
- }
- file_put_contents( "$destDir/$db.sql", $sql );
- }
- }
-
- # ------------------------------------------------------------------------------------------
-
- # Returns part of an INSERT statement, corresponding to all interlanguage links to a particular site
- function makeLanguageLinks( &$site, &$first, $source ) {
- $sql = "";
-
- # Actual languages with their own databases
- foreach ( $this->langlist as $targetLang ) {
- $sql .= $this->makeLink( array( $targetLang, $site->getURL( $targetLang ), 1 ), $first, $source );
- }
-
- # Language aliases
- foreach ( $this->languageAliases as $alias => $lang ) {
- $sql .= $this->makeLink( array( $alias, $site->getURL( $lang ), 1 ), $first, $source );
- }
- return $sql;
- }
-
- # Make SQL for a single link from an array
- function makeLink( $entry, &$first, $source ) {
-
- if ( isset( $this->prefixRewrites[$source] ) && isset($entry[0]) && isset( $this->prefixRewrites[$source][$entry[0]] ) ) {
- $entry[0] = $this->prefixRewrites[$source][$entry[0]];
- }
-
- $sql = "";
- # Add comma
- if ( $first ) {
- $first = false;
- } else {
- $sql .= ",\n";
- }
- $dbr = wfGetDB( DB_SLAVE );
- $sql .= "(" . $dbr->makeList( $entry ) . ")";
- return $sql;
- }
-}
-
-$maintClass = "RebuildInterwiki";
-require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/rebuildrecentchanges.php b/maintenance/rebuildrecentchanges.php
index 5cacac65..92d60902 100644
--- a/maintenance/rebuildrecentchanges.php
+++ b/maintenance/rebuildrecentchanges.php
@@ -119,11 +119,11 @@ class RebuildRecentchanges extends Maintenance {
if ( $row ) {
$lastOldId = intval( $row->rev_id );
# Grab the last text size if available
- $lastSize = !is_null( $row->rev_len ) ? intval( $row->rev_len ) : 'NULL';
+ $lastSize = !is_null( $row->rev_len ) ? intval( $row->rev_len ) : null;
} else {
# No previous edit
$lastOldId = 0;
- $lastSize = 'NULL';
+ $lastSize = null;
$new = 1; // probably true
}
}
diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php
index 04606c75..494e0a75 100644
--- a/maintenance/rebuildtextindex.php
+++ b/maintenance/rebuildtextindex.php
@@ -112,7 +112,7 @@ class RebuildTextIndex extends Maintenance {
*/
private function dropMysqlTextIndex() {
$searchindex = $this->db->tableName( 'searchindex' );
- if ( $this->db->indexExists( 'searchindex', 'si_title' ) ) {
+ if ( $this->db->indexExists( 'searchindex', 'si_title', __METHOD__ ) ) {
$this->output( "Dropping index...\n" );
$sql = "ALTER TABLE $searchindex DROP INDEX si_title, DROP INDEX si_text";
$this->db->query( $sql, __METHOD__ );
diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php
index ec612183..958b2ba1 100644
--- a/maintenance/refreshImageMetadata.php
+++ b/maintenance/refreshImageMetadata.php
@@ -24,7 +24,7 @@
*
* @file
* @author Brian Wolff
- * @ingroup maintenance
+ * @ingroup Maintenance
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
@@ -156,6 +156,10 @@ class RefreshImageMetadata extends Maintenance {
}
}
+ /**
+ * @param $dbw DatabaseBase
+ * @return array
+ */
function getConditions( $dbw ) {
$conds = array();
@@ -179,8 +183,12 @@ class RefreshImageMetadata extends Maintenance {
return $conds;
}
+ /**
+ * @param $force bool
+ * @param $brokenOnly bool
+ */
function setupParameters( $force, $brokenOnly ) {
- global $wgUpdateCompatibleMetadata, $wgReadOnly;
+ global $wgUpdateCompatibleMetadata;
if ( $brokenOnly ) {
$wgUpdateCompatibleMetadata = false;
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 0515ef1b..c16b6963 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -184,17 +184,15 @@ class RefreshLinks extends Maintenance {
__METHOD__ );
return;
}
- $article = new Article( $title );
- $rt = $article->followRedirect();
+ $page = WikiPage::factory( $title );
+ $rt = $page->getRedirectTarget();
- if ( !$rt || !is_object( $rt ) ) {
+ if ( $rt === null ) {
// $title is not a redirect
// Delete any redirect table entry for it
$dbw->delete( 'redirect', array( 'rd_from' => $id ),
__METHOD__ );
- } else {
- $article->updateRedirectOn( $dbw, $rt );
}
}
@@ -213,13 +211,14 @@ class RefreshLinks extends Maintenance {
if ( is_null( $title ) ) {
return;
}
- $dbw->begin();
$revision = Revision::newFromTitle( $title );
if ( !$revision ) {
return;
}
+ $dbw->begin();
+
$options = new ParserOptions;
$parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
$update = new LinksUpdate( $title, $parserOutput, false );
@@ -229,7 +228,7 @@ class RefreshLinks extends Maintenance {
/**
* Removes non-existing links from pages from pagelinks, imagelinks,
- * categorylinks, templatelinks and externallinks tables.
+ * categorylinks, templatelinks, externallinks, interwikilinks, langlinks and redirect tables.
*
* @param $maxLag
* @param $batchSize The size of deletion batches
@@ -254,6 +253,7 @@ class RefreshLinks extends Maintenance {
'iwlinks' => 'iwl_from',
'langlinks' => 'll_from',
'redirect' => 'rd_from',
+ 'page_props' => 'pp_page',
);
foreach ( $linksTables as $table => $field ) {
@@ -271,7 +271,6 @@ class RefreshLinks extends Maintenance {
$counter = 0;
$list = array();
$this->output( "0.." );
-
foreach ( $results as $row ) {
$counter++;
$list[] = $row->$field;
diff --git a/maintenance/removeUnusedAccounts.php b/maintenance/removeUnusedAccounts.php
index 44c27b35..ba25efdd 100644
--- a/maintenance/removeUnusedAccounts.php
+++ b/maintenance/removeUnusedAccounts.php
@@ -92,7 +92,7 @@ class RemoveUnusedAccounts extends Maintenance {
private function isInactiveAccount( $id, $master = false ) {
$dbo = wfGetDB( $master ? DB_MASTER : DB_SLAVE );
$checks = array( 'revision' => 'rev', 'archive' => 'ar', 'logging' => 'log',
- 'image' => 'img', 'oldimage' => 'oi' );
+ 'image' => 'img', 'oldimage' => 'oi', 'filearchive' => 'fa' );
$count = 0;
$dbo->begin();
diff --git a/maintenance/renamewiki.php b/maintenance/renamewiki.php
deleted file mode 100644
index 4146525e..00000000
--- a/maintenance/renamewiki.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/**
- * Why yes, this *is* another special-purpose Wikimedia maintenance script!
- * Should be fixed up and generalized.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to 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
- * @ingroup Wikimedia
- */
-
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
-
-class RenameWiki extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Rename external storage dbs and leave a new one";
- $this->addArg( 'olddb', 'Old DB name' );
- $this->addArg( 'newdb', 'New DB name' );
- }
-
- public function getDbType() {
- return Maintenance::DB_ADMIN;
- }
-
- public function execute() {
- global $wgDefaultExternalStore;
-
- # Setup
- $from = $this->getArg( 0 );
- $to = $this->getArg( 1 );
- $this->output( "Renaming blob tables in ES from $from to $to...\n" );
- $this->output( "Sleeping 5 seconds...\n" );
- sleep( 5 );
-
- # Initialise external storage
- if ( is_array( $wgDefaultExternalStore ) ) {
- $stores = $wgDefaultExternalStore;
- } elseif ( $wgDefaultExternalStore ) {
- $stores = array( $wgDefaultExternalStore );
- } else {
- $stores = array();
- }
-
- if ( count( $stores ) ) {
- $this->output( "Initialising external storage...\n" );
- global $wgDBuser, $wgDBpassword, $wgExternalServers;
- foreach ( $stores as $storeURL ) {
- $m = array();
- if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
- continue;
- }
-
- $cluster = $m[1];
-
- # Hack
- $wgExternalServers[$cluster][0]['user'] = $wgDBuser;
- $wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
-
- $store = new ExternalStoreDB;
- $extdb =& $store->getMaster( $cluster );
- $extdb->query( "SET table_type=InnoDB" );
- $extdb->query( "CREATE DATABASE {$to}" );
- $extdb->query( "ALTER TABLE {$from}.blobs RENAME TO {$to}.blobs" );
- $extdb->selectDB( $from );
- $extdb->sourceFile( $this->getDir() . '/storage/blobs.sql' );
- $extdb->commit();
- }
- }
- $this->output( "done.\n" );
- }
-}
-
-$maintClass = "RenameWiki";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/rollbackEdits.php b/maintenance/rollbackEdits.php
index e1c126e1..3e57e01f 100644
--- a/maintenance/rollbackEdits.php
+++ b/maintenance/rollbackEdits.php
@@ -62,10 +62,12 @@ class RollbackEdits extends Maintenance {
return;
}
+ $doer = User::newFromName( 'Maintenance script' );
+
foreach ( $titles as $t ) {
- $a = new Article( $t );
- $this->output( 'Processing ' . $t->getPrefixedText() . '...' );
- if ( !$a->commitRollback( $user, $summary, $bot, $results ) ) {
+ $page = WikiPage::factory( $t );
+ $this->output( 'Processing ' . $t->getPrefixedText() . '... ' );
+ if ( !$page->commitRollback( $user, $summary, $bot, $results, $doer ) ) {
$this->output( "done\n" );
} else {
$this->output( "failed\n" );
@@ -76,6 +78,7 @@ class RollbackEdits extends Maintenance {
/**
* Get all pages that should be rolled back for a given user
* @param $user String a name to check against rev_user_text
+ * @return array
*/
private function getRollbackTitles( $user ) {
$dbr = wfGetDB( DB_SLAVE );
diff --git a/maintenance/runBatchedQuery.php b/maintenance/runBatchedQuery.php
index 9a6b6383..83e0cab8 100644
--- a/maintenance/runBatchedQuery.php
+++ b/maintenance/runBatchedQuery.php
@@ -36,7 +36,6 @@ class BatchedQueryRunner extends Maintenance {
$this->error( "No query specified. Specify the query as a command line parameter.", true );
$query = $this->getArg();
- $wait = $this->getOption( 'wait', 5 );
$n = 1;
$dbw = wfGetDB( DB_MASTER );
do {
diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index 0edf7ac9..6068311e 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -61,16 +61,18 @@ class RunJobs extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$n = 0;
$conds = '';
- if ( $type !== false )
+ if ( $type !== false ) {
$conds = "job_cmd = " . $dbw->addQuotes( $type );
+ }
while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
$offset = 0;
for ( ; ; ) {
$job = !$type ? Job::pop( $offset ) : Job::pop_type( $type );
- if ( !$job )
+ if ( !$job ) {
break;
+ }
wfWaitForSlaves();
$t = microtime( true );
diff --git a/maintenance/showJobs.php b/maintenance/showJobs.php
index 886d7d45..ff7d3fc0 100644
--- a/maintenance/showJobs.php
+++ b/maintenance/showJobs.php
@@ -21,7 +21,7 @@
*
* @ingroup Maintenance
* @author Tim Starling
- * @author Ashar Voultoiz
+ * @author Antoine Musso
*/
require_once( dirname( __FILE__ ) . '/Maintenance.php' );
diff --git a/maintenance/showStats.php b/maintenance/showStats.php
index f695c440..b284a9ac 100644
--- a/maintenance/showStats.php
+++ b/maintenance/showStats.php
@@ -20,7 +20,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @ingroup Maintenance
- * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Antoine Musso <hashar at free dot fr>
* Based on initStats.php by:
* @author Brion Vibber
* @author Rob Church <robchur@gmail.com>
@@ -42,7 +42,6 @@ class ShowStats extends Maintenance {
'ss_good_articles' => 'Number of articles',
'ss_total_pages' => 'Total pages',
'ss_users' => 'Number of users',
- 'ss_admins' => 'Number of admins',
'ss_images' => 'Number of images',
);
diff --git a/maintenance/sql.php b/maintenance/sql.php
index e1f2bb5f..c4af6307 100644
--- a/maintenance/sql.php
+++ b/maintenance/sql.php
@@ -30,32 +30,59 @@ class MwSql extends Maintenance {
}
public function execute() {
+ $dbw = wfGetDB( DB_MASTER );
if ( $this->hasArg() ) {
$fileName = $this->getArg();
$file = fopen( $fileName, 'r' );
- $promptCallback = false;
- } else {
- $file = $this->getStdin();
- $promptObject = new SqlPromptPrinter( "> " );
- $promptCallback = $promptObject->cb();
+ if ( !$file ) {
+ $this->error( "Unable to open input file", true );
+ }
+
+ $error = $dbw->sourceStream( $file, false, array( $this, 'sqlPrintResult' ) );
+ if ( $error !== true ) {
+ $this->error( $error, true );
+ } else {
+ exit( 0 );
+ }
}
- if ( !$file )
- $this->error( "Unable to open input file", true );
+ $useReadline = function_exists( 'readline_add_history' )
+ && Maintenance::posix_isatty( 0 /*STDIN*/ );
- $dbw = wfGetDB( DB_MASTER );
- $error = $dbw->sourceStream( $file, $promptCallback, array( $this, 'sqlPrintResult' ) );
- if ( $error !== true ) {
- $this->error( $error, true );
- } else {
- exit( 0 );
+ if ( $useReadline ) {
+ global $IP;
+ $historyFile = isset( $_ENV['HOME'] ) ?
+ "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history";
+ readline_read_history( $historyFile );
+ }
+
+ $wholeLine = '';
+ while ( ( $line = Maintenance::readconsole() ) !== false ) {
+ $done = $dbw->streamStatementEnd( $wholeLine, $line );
+
+ $wholeLine .= $line;
+
+ if ( !$done ) {
+ continue;
+ }
+ if ( $useReadline ) {
+ readline_add_history( $wholeLine );
+ readline_write_history( $historyFile );
+ }
+ try{
+ $res = $dbw->query( $wholeLine );
+ $this->sqlPrintResult( $res, $dbw );
+ $wholeLine = '';
+ } catch (DBQueryError $e) {
+ $this->error( $e, true );
+ }
}
}
/**
* Print the results, callback for $db->sourceStream()
- * @param $res The results object
- * @param $db Database object
+ * @param $res ResultWrapper The results object
+ * @param $db DatabaseBase object
*/
public function sqlPrintResult( $res, $db ) {
if ( !$res ) {
@@ -70,24 +97,13 @@ class MwSql extends Maintenance {
}
}
+ /**
+ * @return int DB_TYPE constant
+ */
public function getDbType() {
return Maintenance::DB_ADMIN;
}
}
-class SqlPromptPrinter {
- function __construct( $prompt ) {
- $this->prompt = $prompt;
- }
-
- function cb() {
- return array( $this, 'printPrompt' );
- }
-
- function printPrompt() {
- echo $this->prompt;
- }
-}
-
$maintClass = "MwSql";
require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/sqlite.php b/maintenance/sqlite.php
index dc8a430e..864d5ab6 100644
--- a/maintenance/sqlite.php
+++ b/maintenance/sqlite.php
@@ -35,6 +35,8 @@ class SqliteMaintenance extends Maintenance {
/**
* While we use database connection, this simple lie prevents useless --dbpass and
* --dbuser options from appearing in help message for this script.
+ *
+ * @return int DB constant
*/
public function getDbType() {
return Maintenance::DB_NONE;
@@ -129,4 +131,4 @@ class SqliteMaintenance extends Maintenance {
}
$maintClass = "SqliteMaintenance";
-require_once( RUN_MAINTENANCE_IF_MAIN ); \ No newline at end of file
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/sqlite/archives/initial-indexes.sql b/maintenance/sqlite/archives/initial-indexes.sql
index 2573ca13..73b008cc 100644
--- a/maintenance/sqlite/archives/initial-indexes.sql
+++ b/maintenance/sqlite/archives/initial-indexes.sql
@@ -3,7 +3,7 @@
-- Unique indexes need to be handled with INSERT SELECT since just running
-- the CREATE INDEX statement will fail if there are duplicate values.
--
--- Ignore duplicates, several tables will have them (e.g. bug 16966) but in
+-- Ignore duplicates, several tables will have them (e.g. bug 16966) but in
-- most cases it's harmless to discard them.
--------------------------------------------------------------------------------
@@ -218,7 +218,7 @@ CREATE TABLE /*_*/math_tmp (
math_outputhash varbinary(16) NOT NULL,
math_html_conservativeness tinyint NOT NULL,
math_html text,
- math_mathml text
+ math_mathml text
);
CREATE UNIQUE INDEX /*i*/math_inputhash ON /*_*/math_tmp (math_inputhash);
@@ -406,7 +406,6 @@ CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
CREATE INDEX /*i*/job_cmd_namespace_title ON /*_*/job (job_cmd, job_namespace, job_title);
CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
diff --git a/maintenance/sqlite/archives/patch-drop-user_options.sql b/maintenance/sqlite/archives/patch-drop-user_options.sql
new file mode 100644
index 00000000..5bc6a47c
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-drop-user_options.sql
@@ -0,0 +1,31 @@
+-- Remove user_options field from user table
+
+CREATE TABLE /*_*/user_tmp (
+ user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ user_name varchar(255) binary NOT NULL default '',
+ user_real_name varchar(255) binary NOT NULL default '',
+ user_password tinyblob NOT NULL,
+ user_newpassword tinyblob NOT NULL,
+ user_newpass_time binary(14),
+ user_email tinytext NOT NULL,
+ user_touched binary(14) NOT NULL default '',
+ user_token binary(32) NOT NULL default '',
+ user_email_authenticated binary(14),
+ user_email_token binary(32),
+ user_email_token_expires binary(14),
+ user_registration binary(14),
+ user_editcount int
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/user_tmp
+ SELECT user_id, user_name, user_real_name, user_password, user_newpassword, user_newpass_time, user_email, user_touched,
+ user_token, user_email_authenticated, user_email_token, user_email_token_expires, user_registration, user_editcount
+ FROM /*_*/user;
+
+DROP TABLE /*_*/user;
+
+ALTER TABLE /*_*/user_tmp RENAME TO /*_*/user;
+
+CREATE UNIQUE INDEX /*i*/user_name ON /*_*/user (user_name);
+CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
+CREATE INDEX /*i*/user_email ON /*_*/user (user_email(50));
diff --git a/maintenance/sqlite/archives/patch-jobs-add-timestamp.sql b/maintenance/sqlite/archives/patch-jobs-add-timestamp.sql
new file mode 100644
index 00000000..c5e6e711
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-jobs-add-timestamp.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/job ADD COLUMN job_timestamp varbinary(14) NULL default NULL;
+CREATE INDEX /*i*/job_timestamp ON /*_*/job(job_timestamp);
diff --git a/maintenance/sqlite/archives/patch-page_redirect_namespace_len.sql b/maintenance/sqlite/archives/patch-page_redirect_namespace_len.sql
new file mode 100644
index 00000000..d9eedadd
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-page_redirect_namespace_len.sql
@@ -0,0 +1,7 @@
+--
+-- Add the page_redirect_namespace_len index
+--
+
+CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
+
+
diff --git a/maintenance/sqlite/archives/patch-ufg_group-length-increase.sql b/maintenance/sqlite/archives/patch-ufg_group-length-increase.sql
new file mode 100644
index 00000000..c6dcea5e
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-ufg_group-length-increase.sql
@@ -0,0 +1,15 @@
+CREATE TABLE /*_*/user_former_groups_tmp (
+ ug_user int unsigned NOT NULL default 0,
+ ug_group varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/user_former_groups_tmp
+ SELECT ug_user, ug_group
+ FROM /*_*/user_groups;
+
+DROP TABLE /*_*/user_former_groups;
+
+ALTER TABLE /*_*/user_former_groups_tmp RENAME TO /*_*/user_former_groups;
+
+CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
+
diff --git a/maintenance/sqlite/archives/patch-ug_group-length-increase.sql b/maintenance/sqlite/archives/patch-ug_group-length-increase.sql
new file mode 100644
index 00000000..5e810937
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-ug_group-length-increase.sql
@@ -0,0 +1,15 @@
+CREATE TABLE /*_*/user_groups_tmp (
+ ug_user int unsigned NOT NULL default 0,
+ ug_group varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/user_groups_tmp
+ SELECT ug_user, ug_group
+ FROM /*_*/user_groups;
+
+DROP TABLE /*_*/user_groups;
+
+ALTER TABLE /*_*/user_groups_tmp RENAME TO /*_*/user_groups;
+
+CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
+CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
diff --git a/maintenance/stats.php b/maintenance/stats.php
index 1fb46fa9..46926dd0 100644
--- a/maintenance/stats.php
+++ b/maintenance/stats.php
@@ -54,14 +54,12 @@ class CacheStats extends Maintenance {
$this->output( "\nParser cache\n" );
$hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
- $invalid = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_invalid' ) ) );
$expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
$absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
$stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
- $total = $hits + $invalid + $expired + $absent + $stub;
+ $total = $hits + $expired + $absent + $stub;
if ( $total ) {
$this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "invalid: %-10d %6.2f%%\n", $invalid, $invalid / $total * 100 ) );
$this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
$this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
$this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php
index c372b9c4..af1f9ee2 100644
--- a/maintenance/storage/checkStorage.php
+++ b/maintenance/storage/checkStorage.php
@@ -21,8 +21,6 @@
* @ingroup Maintenance ExternalStorage
*/
-define( 'CONCAT_HEADER', 'O:27:"concatenatedgziphistoryblob"' );
-
if ( !defined( 'MEDIAWIKI' ) ) {
require_once( dirname( __FILE__ ) . '/../commandLine.inc' );
@@ -43,6 +41,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
* @ingroup Maintenance ExternalStorage
*/
class CheckStorage {
+ const CONCAT_HEADER = 'O:27:"concatenatedgziphistoryblob"';
var $oldIdMap, $errors;
var $dbStore = null;
@@ -55,15 +54,13 @@ class CheckStorage {
);
function check( $fix = false, $xml = '' ) {
- $fname = 'checkStorage';
$dbr = wfGetDB( DB_SLAVE );
if ( $fix ) {
- $dbw = wfGetDB( DB_MASTER );
print "Checking, will fix errors if possible...\n";
} else {
print "Checking...\n";
}
- $maxRevId = $dbr->selectField( 'revision', 'MAX(rev_id)', false, $fname );
+ $maxRevId = $dbr->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
$chunkSize = 1000;
$flagStats = array();
$objectStats = array();
@@ -84,7 +81,7 @@ class CheckStorage {
$this->oldIdMap = array();
$dbr->ping();
$res = $dbr->select( 'revision', array( 'rev_id', 'rev_text_id' ),
- array( "rev_id BETWEEN $chunkStart AND $chunkEnd" ), $fname );
+ array( "rev_id BETWEEN $chunkStart AND $chunkEnd" ), __METHOD__ );
foreach ( $res as $row ) {
$this->oldIdMap[$row->rev_id] = $row->rev_text_id;
}
@@ -99,8 +96,11 @@ class CheckStorage {
$externalRevs = array();
$objectRevs = array();
$res = $dbr->select( 'text', array( 'old_id', 'old_flags' ),
- 'old_id IN (' . implode( ',', $this->oldIdMap ) . ')', $fname );
+ 'old_id IN (' . implode( ',', $this->oldIdMap ) . ')', __METHOD__ );
foreach ( $res as $row ) {
+ /**
+ * @var $flags int
+ */
$flags = $row->old_flags;
$id = $row->old_id;
@@ -133,7 +133,7 @@ class CheckStorage {
$dbw = wfGetDB( DB_MASTER );
$dbw->ping();
$dbw->update( 'text', array( 'old_flags' => '' ),
- array( 'old_id' => $id ), $fname );
+ array( 'old_id' => $id ), __METHOD__ );
echo "Fixed\n";
} else {
$this->error( 'fixable', "Warning: old_flags set to 0", $id );
@@ -154,7 +154,7 @@ class CheckStorage {
$externalNormalBlobs = array();
if ( count( $externalRevs ) ) {
$res = $dbr->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
- array( 'old_id IN (' . implode( ',', $externalRevs ) . ')' ), $fname );
+ array( 'old_id IN (' . implode( ',', $externalRevs ) . ')' ), __METHOD__ );
foreach ( $res as $row ) {
$urlParts = explode( '://', $row->old_text, 2 );
if ( count( $urlParts ) !== 2 || $urlParts[1] == '' ) {
@@ -192,7 +192,7 @@ class CheckStorage {
$blobsTable = $this->dbStore->getTable( $extDb );
$res = $extDb->select( $blobsTable,
array( 'blob_id' ),
- array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), $fname );
+ array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), __METHOD__ );
foreach ( $res as $row ) {
unset( $xBlobIds[$row->blob_id] );
}
@@ -211,7 +211,7 @@ class CheckStorage {
if ( count( $objectRevs ) ) {
$headerLength = 300;
$res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
- array( 'old_id IN (' . implode( ',', $objectRevs ) . ')' ), $fname );
+ array( 'old_id IN (' . implode( ',', $objectRevs ) . ')' ), __METHOD__ );
foreach ( $res as $row ) {
$oldId = $row->old_id;
$matches = array();
@@ -262,7 +262,7 @@ class CheckStorage {
if ( count( $concatBlobs ) ) {
$headerLength = 300;
$res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
- array( 'old_id IN (' . implode( ',', array_keys( $concatBlobs ) ) . ')' ), $fname );
+ array( 'old_id IN (' . implode( ',', array_keys( $concatBlobs ) ) . ')' ), __METHOD__ );
foreach ( $res as $row ) {
$flags = explode( ',', $row->old_flags );
if ( in_array( 'external', $flags ) ) {
@@ -285,7 +285,7 @@ class CheckStorage {
$this->error( 'unfixable', "Error: invalid flags \"{$row->old_flags}\" on concat bulk row {$row->old_id}",
$concatBlobs[$row->old_id] );
}
- } elseif ( strcasecmp( substr( $row->header, 0, strlen( CONCAT_HEADER ) ), CONCAT_HEADER ) ) {
+ } elseif ( strcasecmp( substr( $row->header, 0, strlen( self::CONCAT_HEADER ) ), self::CONCAT_HEADER ) ) {
$this->error( 'restore text', "Error: Incorrect object header for concat bulk row {$row->old_id}",
$concatBlobs[$row->old_id] );
} # else good
@@ -354,7 +354,6 @@ class CheckStorage {
}
function checkExternalConcatBlobs( $externalConcatBlobs ) {
- $fname = 'CheckStorage::checkExternalConcatBlobs';
if ( !count( $externalConcatBlobs ) ) {
return;
}
@@ -367,12 +366,12 @@ class CheckStorage {
$blobIds = array_keys( $oldIds );
$extDb =& $this->dbStore->getSlave( $cluster );
$blobsTable = $this->dbStore->getTable( $extDb );
- $headerLength = strlen( CONCAT_HEADER );
+ $headerLength = strlen( self::CONCAT_HEADER );
$res = $extDb->select( $blobsTable,
array( 'blob_id', "LEFT(blob_text, $headerLength) AS header" ),
- array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), $fname );
+ array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), __METHOD__ );
foreach ( $res as $row ) {
- if ( strcasecmp( $row->header, CONCAT_HEADER ) ) {
+ if ( strcasecmp( $row->header, self::CONCAT_HEADER ) ) {
$this->error( 'restore text', "Error: invalid header on target $cluster/{$row->blob_id} of two-part ES URL",
$oldIds[$row->blob_id] );
}
@@ -440,8 +439,6 @@ class CheckStorage {
}
function importRevision( &$revision, &$importer ) {
- $fname = 'CheckStorage::importRevision';
-
$id = $revision->getID();
$text = $revision->getText();
if ( $text === '' ) {
@@ -462,7 +459,7 @@ class CheckStorage {
// Find text row again
$dbr = wfGetDB( DB_SLAVE );
- $oldId = $dbr->selectField( 'revision', 'rev_text_id', array( 'rev_id' => $id ), $fname );
+ $oldId = $dbr->selectField( 'revision', 'rev_text_id', array( 'rev_id' => $id ), __METHOD__ );
if ( !$oldId ) {
echo "Missing revision row for rev_id $id\n";
return;
@@ -476,7 +473,7 @@ class CheckStorage {
$dbw->update( 'text',
array( 'old_flags' => $flags, 'old_text' => $text ),
array( 'old_id' => $oldId ),
- $fname, array( 'LIMIT' => 1 )
+ __METHOD__, array( 'LIMIT' => 1 )
);
// Remove it from the unfixed list and add it to the fixed list
diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php
index da82d93b..afe01458 100644
--- a/maintenance/storage/compressOld.php
+++ b/maintenance/storage/compressOld.php
@@ -70,7 +70,7 @@ class CompressOld extends Maintenance {
$type = $this->getOption( 'type', 'concat' );
$chunkSize = $this->getOption( 'chunksize', 20 );
- $startId = $this->getOption( 'start-id', 0 );
+ $startId = $this->getOption( 'startid', 0 );
$beginDate = $this->getOption( 'begin-date', '' );
$endDate = $this->getOption( 'end-date', '' );
$extDB = $this->getOption( 'extdb', '' );
@@ -123,7 +123,12 @@ class CompressOld extends Maintenance {
} while( true );
}
- /** @todo document */
+ /**
+ * @todo document
+ * @param $row
+ * @param $extdb
+ * @return bool
+ */
private function compressPage( $row, $extdb ) {
if ( false !== strpos( $row->old_flags, 'gzip' ) || false !== strpos( $row->old_flags, 'object' ) ) {
#print "Already compressed row {$row->old_id}\n";
@@ -156,7 +161,15 @@ class CompressOld extends Maintenance {
return true;
}
- /** @todo document */
+ /**
+ * @param $startId
+ * @param $maxChunkSize
+ * @param $beginDate
+ * @param $endDate
+ * @param $extdb string
+ * @param $maxPageId bool|int
+ * @return bool
+ */
private function compressWithConcat( $startId, $maxChunkSize, $beginDate,
$endDate, $extdb = "", $maxPageId = false )
{
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
index b6def2da..cb2663d1 100644
--- a/maintenance/storage/fixBug20757.php
+++ b/maintenance/storage/fixBug20757.php
@@ -302,6 +302,9 @@ class FixBug20757 extends Maintenance {
/**
* This is based on part of HistoryBlobStub::getText().
* Determine if the text can be retrieved from the row in the normal way.
+ * @param $stub
+ * @param $secondaryRow
+ * @return bool
*/
function isUnbrokenStub( $stub, $secondaryRow ) {
$flags = explode( ',', $secondaryRow->old_flags );
diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php
index 09ab3e57..c8aac64b 100644
--- a/maintenance/storage/recompressTracked.php
+++ b/maintenance/storage/recompressTracked.php
@@ -169,6 +169,7 @@ class RecompressTracked {
/**
* Make sure the tracking table exists and isn't empty
+ * @return bool
*/
function checkTrackingTable() {
$dbr = wfGetDB( DB_SLAVE );
@@ -588,6 +589,7 @@ class RecompressTracked {
/**
* Returns the name of the next target cluster
+ * @return string
*/
function getTargetCluster() {
$cluster = next( $this->destClusters );
@@ -599,6 +601,8 @@ class RecompressTracked {
/**
* Gets a DB master connection for the given external cluster name
+ * @param $cluster string
+ * @return DatabaseBase
*/
function getExtDB( $cluster ) {
$lb = wfGetLBFactory()->getExternalLB( $cluster );
@@ -684,6 +688,9 @@ class CgzCopyTransaction {
/**
* Add text.
* Returns false if it's ready to commit.
+ * @param $text string
+ * @param $textId
+ * @return bool
*/
function addItem( $text, $textId ) {
if ( !$this->cgz ) {
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index f879f02f..db89c37e 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -86,12 +86,6 @@ CREATE TABLE /*_*/user (
-- Same with passwords.
user_email tinytext NOT NULL,
- -- Newline-separated list of name=value defining the user
- -- preferences
- -- Now obsolete in favour of user_properties table;
- -- old values will be migrated from here transparently.
- user_options blob NOT NULL,
-
-- This is a timestamp which is updated when a user
-- logs in, logs out, changes preferences, or performs
-- some other action requiring HTML cache invalidation
@@ -158,7 +152,7 @@ CREATE TABLE /*_*/user_groups (
-- with particular permissions. A user will have the combined
-- permissions of any group they're explicitly in, plus
-- the implicit '*' and 'user' groups.
- ug_group varbinary(16) NOT NULL default ''
+ ug_group varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
@@ -169,7 +163,7 @@ CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
CREATE TABLE /*_*/user_former_groups (
-- Key to user_id
ufg_user int unsigned NOT NULL default 0,
- ufg_group varbinary(16) NOT NULL default ''
+ ufg_group varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
@@ -271,7 +265,7 @@ CREATE TABLE /*_*/page (
CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-
+CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
--
-- Every edit of a page creates also a revision row.
@@ -279,6 +273,7 @@ CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-- to the text storage backend.
--
CREATE TABLE /*_*/revision (
+ -- Unique ID to identify each revision
rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- Key to page_id. This should _never_ be invalid.
@@ -302,14 +297,14 @@ CREATE TABLE /*_*/revision (
-- Text username or IP address of the editor.
rev_user_text varchar(255) binary NOT NULL default '',
- -- Timestamp
+ -- Timestamp of when revision was created
rev_timestamp binary(14) NOT NULL default '',
-- Records whether the user marked the 'minor edit' checkbox.
-- Many automated edits are marked as minor.
rev_minor_edit tinyint unsigned NOT NULL default 0,
- -- Not yet used; reserved for future changes to the deletion system.
+ -- Restrictions on who can access this revision
rev_deleted tinyint unsigned NOT NULL default 0,
-- Length of this revision in bytes
@@ -317,7 +312,10 @@ CREATE TABLE /*_*/revision (
-- Key to revision.rev_id
-- This field is used to add support for a tree structure (The Adjacency List Model)
- rev_parent_id int unsigned default NULL
+ rev_parent_id int unsigned default NULL,
+
+ -- SHA-1 text content hash in base-36
+ rev_sha1 varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
@@ -424,7 +422,10 @@ CREATE TABLE /*_*/archive (
ar_page_id int unsigned,
-- Original previous revision
- ar_parent_id int unsigned default NULL
+ ar_parent_id int unsigned default NULL,
+
+ -- SHA-1 text content hash in base-36
+ ar_sha1 varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
@@ -966,6 +967,9 @@ CREATE TABLE /*_*/uploadstash (
us_status varchar(50) not null,
+ -- chunk counter starts at 0, current offset is stored in us_size
+ us_chunk_inx int unsigned NULL,
+
-- file properties from File::getPropsFromPath. these may prove unnecessary.
--
us_size int unsigned NOT NULL,
@@ -997,6 +1001,8 @@ CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp);
CREATE TABLE /*_*/recentchanges (
rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
rc_timestamp varbinary(14) NOT NULL default '',
+
+ -- This is no longer used
rc_cur_time varbinary(14) NOT NULL default '',
-- As in revision
@@ -1016,6 +1022,7 @@ CREATE TABLE /*_*/recentchanges (
-- default view.
rc_bot tinyint unsigned NOT NULL default 0,
+ -- Set if this change corresponds to a page creation
rc_new tinyint unsigned NOT NULL default 0,
-- Key to page_id (was cur_id prior to 1.5).
@@ -1029,8 +1036,10 @@ CREATE TABLE /*_*/recentchanges (
-- rev_id of the prior revision, for generating diff links.
rc_last_oldid int unsigned NOT NULL default 0,
- -- These may no longer be used, with the new move log.
+ -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG)
rc_type tinyint unsigned NOT NULL default 0,
+
+ -- These may no longer be used, with the new move log.
rc_moved_to_ns tinyint unsigned NOT NULL default 0,
rc_moved_to_title varchar(255) binary NOT NULL default '',
@@ -1226,6 +1235,7 @@ CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_times
CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
+CREATE INDEX /*i*/type_action ON /*_*/logging(log_type, log_action, log_timestamp);
CREATE TABLE /*_*/log_search (
@@ -1240,17 +1250,6 @@ CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_l
CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
-CREATE TABLE /*_*/trackbacks (
- tb_id int PRIMARY KEY AUTO_INCREMENT,
- tb_page int REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url blob NOT NULL,
- tb_ex text,
- tb_name varchar(255)
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
-
-
-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*_*/job (
job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
@@ -1264,12 +1263,17 @@ CREATE TABLE /*_*/job (
job_namespace int NOT NULL,
job_title varchar(255) binary NOT NULL,
+ -- Timestamp of when the job was inserted
+ -- NULL for jobs added before addition of the timestamp
+ job_timestamp varbinary(14) NULL default NULL,
+
-- Any other parameters to the command
-- Stored as a PHP serialized array, or an empty string if there are no parameters
job_params blob NOT NULL
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
+CREATE INDEX /*i*/job_timestamp ON /*_*/job(job_timestamp);
-- Details of updates to cached special pages
diff --git a/maintenance/term/MWTerm.php b/maintenance/term/MWTerm.php
new file mode 100644
index 00000000..36fb8eec
--- /dev/null
+++ b/maintenance/term/MWTerm.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @ingroup Testing
+ *
+ * Set of classes to help with test output and such. Right now pretty specific
+ * to the parser tests but could be more useful one day :)
+ *
+ * @todo Fixme: Make this more generic
+ */
+
+class AnsiTermColorer {
+ function __construct() {
+ }
+
+ /**
+ * Return ANSI terminal escape code for changing text attribs/color
+ *
+ * @param $color String: semicolon-separated list of attribute/color codes
+ * @return String
+ */
+ public function color( $color ) {
+ global $wgCommandLineDarkBg;
+
+ $light = $wgCommandLineDarkBg ? "1;" : "0;";
+
+ return "\x1b[{$light}{$color}m";
+ }
+
+ /**
+ * Return ANSI terminal escape code for restoring default text attributes
+ *
+ * @return String
+ */
+ public function reset() {
+ return $this->color( 0 );
+ }
+}
+
+/* A colour-less terminal */
+class DummyTermColorer {
+ public function color( $color ) {
+ return '';
+ }
+
+ public function reset() {
+ return '';
+ }
+}
+
diff --git a/maintenance/undelete.php b/maintenance/undelete.php
index 7213d096..1c3b14a5 100644
--- a/maintenance/undelete.php
+++ b/maintenance/undelete.php
@@ -44,6 +44,9 @@ class Undelete extends Maintenance {
$this->error( "Invalid title", true );
}
$wgUser = User::newFromName( $user );
+ if ( !$wgUser ) {
+ $this->error( "Invalid username", true );
+ }
$archive = new PageArchive( $title );
$this->output( "Undeleting " . $title->getPrefixedDBkey() . '...' );
$archive->undelete( array(), $reason );
diff --git a/maintenance/update.php b/maintenance/update.php
index 6173befd..c4bf3b22 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -89,6 +89,8 @@ class UpdateMediaWiki extends Maintenance {
$this->output( "MediaWiki {$wgVersion} Updater\n\n" );
+ wfWaitForSlaves( 5 ); // let's not kill databases, shall we? ;) --tor
+
if ( !$this->hasOption( 'skip-compat-checks' ) ) {
$this->compatChecks();
} else {
@@ -119,8 +121,12 @@ class UpdateMediaWiki extends Maintenance {
$updater->doUpdates( $updates );
foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
+ if ( $updater->updateRowExists( $maint ) ) {
+ continue;
+ }
$child = $this->runChild( $maint );
$child->execute();
+ $updater->insertUpdateRow( $maint );
}
$this->output( "\nDone.\n" );
diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php
index 7e8a7ee0..023409fa 100644
--- a/maintenance/updateCollation.php
+++ b/maintenance/updateCollation.php
@@ -43,7 +43,7 @@ using the page title and cl_sortkey_prefix. If everything's collation is
up-to-date, it will do nothing.
TEXT;
- $this->addOption( 'force', 'Run on all rows, even if the collation is ' .
+ $this->addOption( 'force', 'Run on all rows, even if the collation is ' .
'supposed to be up-to-date.' );
$this->addOption( 'previous-collation', 'Set the previous value of ' .
'$wgCategoryCollation here to speed up this script, especially if your ' .
@@ -111,7 +111,7 @@ TEXT;
# This is an old-style row, so the sortkey needs to be
# converted.
if ( $row->cl_sortkey == $title->getText()
- || $row->cl_sortkey == $title->getPrefixedText() ) {
+ || $row->cl_sortkey == $title->getPrefixedText() ) {
$prefix = '';
} else {
# Custom sortkey, use it as a prefix
@@ -148,14 +148,14 @@ TEXT;
if ( $force && $row ) {
$encFrom = $dbw->addQuotes( $row->cl_from );
$encTo = $dbw->addQuotes( $row->cl_to );
- $batchConds = array(
+ $batchConds = array(
"(cl_from = $encFrom AND cl_to > $encTo) " .
" OR cl_from > $encFrom" );
}
$count += $res->numRows();
$this->output( "$count done.\n" );
-
+
if ( ++$batchCount % self::SYNC_INTERVAL == 0 ) {
$this->output( "Waiting for slaves ... " );
wfWaitForSlaves();
diff --git a/maintenance/upgrade1_5.php b/maintenance/upgrade1_5.php
index 730e7637..1577c237 100644
--- a/maintenance/upgrade1_5.php
+++ b/maintenance/upgrade1_5.php
@@ -39,6 +39,12 @@ define( 'MW_UPGRADE_CALLBACK', null ); // for self-documentation only
* @ingroup Maintenance
*/
class FiveUpgrade extends Maintenance {
+
+ /**
+ * @var DatabaseBase
+ */
+ protected $db;
+
function __construct() {
parent::__construct();
@@ -321,6 +327,8 @@ class FiveUpgrade extends Maintenance {
/**
* Helper function for copyTable array_filter
+ * @param $x
+ * @return bool
*/
static private function notUpgradeNull( $x ) {
return $x !== MW_UPGRADE_NULL;
@@ -800,8 +808,10 @@ END;
* Rename a given image or archived image file to the converted filename,
* leaving a symlink for URL compatibility.
*
- * @param string $oldname pre-conversion filename
- * @param string $basename pre-conversion base filename for dir hashing, if an archive
+ * @param $oldname string pre-conversion filename
+ * @param $subdirCallback string
+ * @param $basename string pre-conversion base filename for dir hashing, if an archive
+ * @return bool|string
* @access private
*/
function renameFile( $oldname, $subdirCallback = 'wfImageDir', $basename = null ) {
diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc
index 6edef9d9..a6659fe7 100644
--- a/maintenance/userOptions.inc
+++ b/maintenance/userOptions.inc
@@ -50,7 +50,14 @@ class userOptions {
}
- /** This is used to check options. Only needed on construction */
+ /**
+ * This is used to check options. Only needed on construction
+ *
+ * @param $opts array
+ * @param $args array
+ *
+ * @return bool
+ */
private function checkOpts( $opts, $args ) {
// The three possible ways to run the script:
$list = isset( $opts['list'] );
@@ -63,7 +70,14 @@ class userOptions {
return $isValid;
}
- /** load script options in the object */
+ /**
+ * load script options in the object
+ *
+ * @param $opts array
+ * @param $args array
+ *
+ * @return true
+ */
private function initializeOpts( $opts, $args ) {
$this->mQuick = isset( $opts['nowarn'] );
@@ -94,8 +108,8 @@ class userOptions {
return false;
}
- $this-> { $this->mMode } ( );
-
+ $this->{ $this->mMode } ( );
+ return true;
}
#
@@ -206,8 +220,10 @@ class userOptions {
}
}
-
- /** Return an array of option names */
+ /**
+ * Return an array of option names
+ * @return array
+ */
public static function getDefaultOptionsNames() {
$def = User::getDefaultOptions();
$ret = array();
@@ -217,7 +233,6 @@ class userOptions {
return $ret;
}
-
#
# Helper methods
#
@@ -250,7 +265,10 @@ USAGE;
exit( 0 );
}
- /** The warning message and countdown */
+ /**
+ * The warning message and countdown
+ * @return bool
+ */
public function warn() {
if ( $this->mQuick ) {
diff --git a/maintenance/userOptions.php b/maintenance/userOptions.php
index 6e1681c3..64368f63 100644
--- a/maintenance/userOptions.php
+++ b/maintenance/userOptions.php
@@ -23,7 +23,7 @@
*
* @file
* @ingroup Maintenance
- * @author Ashar Voultoiz <hashar at free dot fr>
+ * @author Antoine Musso <hashar at free dot fr>
*/
// This is a command line script, load tools and parse args
diff --git a/maintenance/wikipedia-interwiki.sql b/maintenance/wikipedia-interwiki.sql
deleted file mode 100644
index 6a213166..00000000
--- a/maintenance/wikipedia-interwiki.sql
+++ /dev/null
@@ -1,289 +0,0 @@
--- For convenience, here are the *in-project* interwiki prefixes
--- for Wikipedia.
-
-REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
--- Non-Wikipedia sites:
-('q','http://en.wikiquote.org/wiki/$1',1),
-('b','http://en.wikibooks.org/wiki/$1',1),
-('s','http://en.wikisource.org/wiki/$1',1),
-('n','http://en.wikinews.org/wiki/$1',1),
-('v','http://en.wikiversity.org/wiki/$1',1),
-('meta','http://meta.wikimedia.org/wiki/$1',1),
-('m','http://meta.wikimedia.org/wiki/$1',1),
--- An alphabetical list of Wikipedia sites:
-('aa','http://aa.wikipedia.org/wiki/$1',1),
-('ab','http://ab.wikipedia.org/wiki/$1',1),
-('ace','http://ace.wikipedia.org/wiki/$1',1),
-('af','http://af.wikipedia.org/wiki/$1',1),
-('ak','http://ak.wikipedia.org/wiki/$1',1),
-('als','http://als.wikipedia.org/wiki/$1',1),
-('am','http://am.wikipedia.org/wiki/$1',1),
-('an','http://an.wikipedia.org/wiki/$1',1),
-('ang','http://ang.wikipedia.org/wiki/$1',1),
-('ar','http://ar.wikipedia.org/wiki/$1',1),
-('arc','http://arc.wikipedia.org/wiki/$1',1),
-('arz','http://arz.wikipedia.org/wiki/$1',1),
-('as','http://as.wikipedia.org/wiki/$1',1),
-('ast','http://ast.wikipedia.org/wiki/$1',1),
-('av','http://av.wikipedia.org/wiki/$1',1),
-('ay','http://ay.wikipedia.org/wiki/$1',1),
-('az','http://az.wikipedia.org/wiki/$1',1),
-('ba','http://ba.wikipedia.org/wiki/$1',1),
-('bar','http://bar.wikipedia.org/wiki/$1',1),
-('bat-smg','http://bat-smg.wikipedia.org/wiki/$1',1),
-('bcl','http://bcl.wikipedia.org/wiki/$1',1),
-('be','http://be.wikipedia.org/wiki/$1',1),
-('be-x-old','http://be-x-old.wikipedia.org/wiki/$1',1),
-('bg','http://bg.wikipedia.org/wiki/$1',1),
-('bh','http://bh.wikipedia.org/wiki/$1',1),
-('bi','http://bi.wikipedia.org/wiki/$1',1),
-('bm','http://bm.wikipedia.org/wiki/$1',1),
-('bn','http://bn.wikipedia.org/wiki/$1',1),
-('bo','http://bo.wikipedia.org/wiki/$1',1),
-('bpy','http://bpy.wikipedia.org/wiki/$1',1),
-('br','http://br.wikipedia.org/wiki/$1',1),
-('bs','http://bs.wikipedia.org/wiki/$1',1),
-('bug','http://bug.wikipedia.org/wiki/$1',1),
-('bxr','http://bxr.wikipedia.org/wiki/$1',1),
-('ca','http://ca.wikipedia.org/wiki/$1',1),
-('cbk-zam','http://cbk-zam.wikipedia.org/wiki/$1',1),
-('cdo','http://cdo.wikipedia.org/wiki/$1',1),
-('ce','http://ce.wikipedia.org/wiki/$1',1),
-('ceb','http://ceb.wikipedia.org/wiki/$1',1),
-('ch','http://ch.wikipedia.org/wiki/$1',1),
-('cho','http://cho.wikipedia.org/wiki/$1',1),
-('chr','http://chr.wikipedia.org/wiki/$1',1),
-('chy','http://chy.wikipedia.org/wiki/$1',1),
-('ckb','http://ckb.wikipedia.org/wiki/$1',1),
-('co','http://co.wikipedia.org/wiki/$1',1),
-('cr','http://cr.wikipedia.org/wiki/$1',1),
-('crh','http://crh.wikipedia.org/wiki/$1',1),
-('cs','http://cs.wikipedia.org/wiki/$1',1),
-('csb','http://csb.wikipedia.org/wiki/$1',1),
-('cu','http://cu.wikipedia.org/wiki/$1',1),
-('cv','http://cv.wikipedia.org/wiki/$1',1),
-('cy','http://cy.wikipedia.org/wiki/$1',1),
-('da','http://da.wikipedia.org/wiki/$1',1),
-('de','http://de.wikipedia.org/wiki/$1',1),
-('diq','http://diq.wikipedia.org/wiki/$1',1),
-('dk','http://da.wikipedia.org/wiki/$1',1),
-('dsb','http://dsb.wikipedia.org/wiki/$1',1),
-('dv','http://dv.wikipedia.org/wiki/$1',1),
-('dz','http://dz.wikipedia.org/wiki/$1',1),
-('ee','http://ee.wikipedia.org/wiki/$1',1),
-('el','http://el.wikipedia.org/wiki/$1',1),
-('en','http://en.wikipedia.org/wiki/$1',1),
-('eo','http://eo.wikipedia.org/wiki/$1',1),
-('es','http://es.wikipedia.org/wiki/$1',1),
-('et','http://et.wikipedia.org/wiki/$1',1),
-('eu','http://eu.wikipedia.org/wiki/$1',1),
-('ext','http://ext.wikipedia.org/wiki/$1',1),
-('fa','http://fa.wikipedia.org/wiki/$1',1),
-('ff','http://ff.wikipedia.org/wiki/$1',1),
-('fi','http://fi.wikipedia.org/wiki/$1',1),
-('fiu-vro','http://fiu-vro.wikipedia.org/wiki/$1',1),
-('fj','http://fj.wikipedia.org/wiki/$1',1),
-('fo','http://fo.wikipedia.org/wiki/$1',1),
-('fr','http://fr.wikipedia.org/wiki/$1',1),
-('frp','http://frp.wikipedia.org/wiki/$1',1),
-('fur','http://fur.wikipedia.org/wiki/$1',1),
-('fy','http://fy.wikipedia.org/wiki/$1',1),
-('ga','http://ga.wikipedia.org/wiki/$1',1),
-('gan','http://gan.wikipedia.org/wiki/$1',1),
-('gd','http://gd.wikipedia.org/wiki/$1',1),
-('gl','http://gl.wikipedia.org/wiki/$1',1),
-('glk','http://glk.wikipedia.org/wiki/$1',1),
-('gn','http://gn.wikipedia.org/wiki/$1',1),
-('got','http://got.wikipedia.org/wiki/$1',1),
-('gu','http://gu.wikipedia.org/wiki/$1',1),
-('gv','http://gv.wikipedia.org/wiki/$1',1),
-('ha','http://ha.wikipedia.org/wiki/$1',1),
-('hak','http://hak.wikipedia.org/wiki/$1',1),
-('haw','http://haw.wikipedia.org/wiki/$1',1),
-('he','http://he.wikipedia.org/wiki/$1',1),
-('hi','http://hi.wikipedia.org/wiki/$1',1),
-('hif','http://hif.wikipedia.org/wiki/$1',1),
-('ho','http://ho.wikipedia.org/wiki/$1',1),
-('hr','http://hr.wikipedia.org/wiki/$1',1),
-('hsb','http://hsb.wikipedia.org/wiki/$1',1),
-('ht','http://ht.wikipedia.org/wiki/$1',1),
-('hu','http://hu.wikipedia.org/wiki/$1',1),
-('hy','http://hy.wikipedia.org/wiki/$1',1),
-('hz','http://hz.wikipedia.org/wiki/$1',1),
-('ia','http://ia.wikipedia.org/wiki/$1',1),
-('id','http://id.wikipedia.org/wiki/$1',1),
-('ie','http://ie.wikipedia.org/wiki/$1',1),
-('ig','http://ig.wikipedia.org/wiki/$1',1),
-('ii','http://ii.wikipedia.org/wiki/$1',1),
-('ik','http://ik.wikipedia.org/wiki/$1',1),
-('ilo','http://ilo.wikipedia.org/wiki/$1',1),
-('io','http://io.wikipedia.org/wiki/$1',1),
-('is','http://is.wikipedia.org/wiki/$1',1),
-('it','http://it.wikipedia.org/wiki/$1',1),
-('iu','http://iu.wikipedia.org/wiki/$1',1),
-('ja','http://ja.wikipedia.org/wiki/$1',1),
-('jbo','http://jbo.wikipedia.org/wiki/$1',1),
-('jv','http://jv.wikipedia.org/wiki/$1',1),
-('ka','http://ka.wikipedia.org/wiki/$1',1),
-('kab','http://kab.wikipedia.org/wiki/$1',1),
-('kg','http://kg.wikipedia.org/wiki/$1',1),
-('ki','http://ki.wikipedia.org/wiki/$1',1),
-('kj','http://kj.wikipedia.org/wiki/$1',1),
-('kk','http://kk.wikipedia.org/wiki/$1',1),
-('kl','http://kl.wikipedia.org/wiki/$1',1),
-('km','http://km.wikipedia.org/wiki/$1',1),
-('kn','http://kn.wikipedia.org/wiki/$1',1),
-('ko','http://ko.wikipedia.org/wiki/$1',1),
-('kr','http://kr.wikipedia.org/wiki/$1',1),
-('ks','http://ks.wikipedia.org/wiki/$1',1),
-('ksh','http://ksh.wikipedia.org/wiki/$1',1),
-('ku','http://ku.wikipedia.org/wiki/$1',1),
-('kv','http://kv.wikipedia.org/wiki/$1',1),
-('kw','http://kw.wikipedia.org/wiki/$1',1),
-('ky','http://ky.wikipedia.org/wiki/$1',1),
-('la','http://la.wikipedia.org/wiki/$1',1),
-('lad','http://lad.wikipedia.org/wiki/$1',1),
-('lb','http://lb.wikipedia.org/wiki/$1',1),
-('lbe','http://lbe.wikipedia.org/wiki/$1',1),
-('lg','http://lg.wikipedia.org/wiki/$1',1),
-('li','http://li.wikipedia.org/wiki/$1',1),
-('lij','http://lij.wikipedia.org/wiki/$1',1),
-('lmo','http://lmo.wikipedia.org/wiki/$1',1),
-('ln','http://ln.wikipedia.org/wiki/$1',1),
-('lo','http://lo.wikipedia.org/wiki/$1',1),
-('lt','http://lt.wikipedia.org/wiki/$1',1),
-('lv','http://lv.wikipedia.org/wiki/$1',1),
-('map-bms','http://map-bms.wikipedia.org/wiki/$1',1),
-('mdf','http://mdf.wikipedia.org/wiki/$1',1),
-('mg','http://mg.wikipedia.org/wiki/$1',1),
-('mh','http://mh.wikipedia.org/wiki/$1',1),
-('mhr','http://mhr.wikipedia.org/wiki/$1',1),
-('mi','http://mi.wikipedia.org/wiki/$1',1),
-('minnan','http://zh-min-nan.wikipedia.org/wiki/$1',1),
-('mk','http://mk.wikipedia.org/wiki/$1',1),
-('ml','http://ml.wikipedia.org/wiki/$1',1),
-('mn','http://mn.wikipedia.org/wiki/$1',1),
-('mo','http://mo.wikipedia.org/wiki/$1',1),
-('mr','http://mr.wikipedia.org/wiki/$1',1),
-('ms','http://ms.wikipedia.org/wiki/$1',1),
-('mt','http://mt.wikipedia.org/wiki/$1',1),
-('mus','http://mus.wikipedia.org/wiki/$1',1),
-('mwl','http://mwl.wikipedia.org/wiki/$1',1),
-('my','http://my.wikipedia.org/wiki/$1',1),
-('myv','http://myv.wikipedia.org/wiki/$1',1),
-('mzn','http://mzn.wikipedia.org/wiki/$1',1),
-('na','http://na.wikipedia.org/wiki/$1',1),
-('nah','http://nah.wikipedia.org/wiki/$1',1),
-('nan','http://zh-min-nan.wikipedia.org/wiki/$1',1),
-('nap','http://nap.wikipedia.org/wiki/$1',1),
-('nb','http://nb.wikipedia.org/wiki/$1',1),
-('nds','http://nds.wikipedia.org/wiki/$1',1),
-('nds-nl','http://nds-nl.wikipedia.org/wiki/$1',1),
-('ne','http://ne.wikipedia.org/wiki/$1',1),
-('ng','http://ng.wikipedia.org/wiki/$1',1),
-('nl','http://nl.wikipedia.org/wiki/$1',1),
-('nn','http://nn.wikipedia.org/wiki/$1',1),
-('no','http://no.wikipedia.org/wiki/$1',1),
-('nov','http://nov.wikipedia.org/wiki/$1',1),
-('nrm','http://nrm.wikipedia.org/wiki/$1',1),
-('nv','http://nv.wikipedia.org/wiki/$1',1),
-('ny','http://ny.wikipedia.org/wiki/$1',1),
-('oc','http://oc.wikipedia.org/wiki/$1',1),
-('om','http://om.wikipedia.org/wiki/$1',1),
-('or','http://or.wikipedia.org/wiki/$1',1),
-('os','http://os.wikipedia.org/wiki/$1',1),
-('pa','http://pa.wikipedia.org/wiki/$1',1),
-('pag','http://pag.wikipedia.org/wiki/$1',1),
-('pam','http://pam.wikipedia.org/wiki/$1',1),
-('pap','http://pap.wikipedia.org/wiki/$1',1),
-('pdc','http://pdc.wikipedia.org/wiki/$1',1),
-('pi','http://pi.wikipedia.org/wiki/$1',1),
-('pih','http://pih.wikipedia.org/wiki/$1',1),
-('pl','http://pl.wikipedia.org/wiki/$1',1),
-('pms','http://pms.wikipedia.org/wiki/$1',1),
-('pnb','http://pnb.wikipedia.org/wiki/$1',1),
-('ps','http://ps.wikipedia.org/wiki/$1',1),
-('pt','http://pt.wikipedia.org/wiki/$1',1),
-('qu','http://qu.wikipedia.org/wiki/$1',1),
-('rm','http://rm.wikipedia.org/wiki/$1',1),
-('rmy','http://rmy.wikipedia.org/wiki/$1',1),
-('rn','http://rn.wikipedia.org/wiki/$1',1),
-('ro','http://ro.wikipedia.org/wiki/$1',1),
-('roa-rup','http://roa-rup.wikipedia.org/wiki/$1',1),
-('roa-tara','http://roa-tara.wikipedia.org/wiki/$1',1),
-('ru','http://ru.wikipedia.org/wiki/$1',1),
-('rw','http://rw.wikipedia.org/wiki/$1',1),
-('sa','http://sa.wikipedia.org/wiki/$1',1),
-('sah','http://sah.wikipedia.org/wiki/$1',1),
-('sc','http://sc.wikipedia.org/wiki/$1',1),
-('scn','http://scn.wikipedia.org/wiki/$1',1),
-('sco','http://sco.wikipedia.org/wiki/$1',1),
-('sd','http://sd.wikipedia.org/wiki/$1',1),
-('se','http://se.wikipedia.org/wiki/$1',1),
-('sep11','http://sep11.wikipedia.org/wiki/$1',1),
-('sg','http://sg.wikipedia.org/wiki/$1',1),
-('sh','http://sh.wikipedia.org/wiki/$1',1),
-('si','http://si.wikipedia.org/wiki/$1',1),
-('simple','http://simple.wikipedia.org/wiki/$1',1),
-('sk','http://sk.wikipedia.org/wiki/$1',1),
-('sl','http://sl.wikipedia.org/wiki/$1',1),
-('sm','http://sm.wikipedia.org/wiki/$1',1),
-('sn','http://sn.wikipedia.org/wiki/$1',1),
-('so','http://so.wikipedia.org/wiki/$1',1),
-('sq','http://sq.wikipedia.org/wiki/$1',1),
-('sr','http://sr.wikipedia.org/wiki/$1',1),
-('srn','http://srn.wikipedia.org/wiki/$1',1),
-('ss','http://ss.wikipedia.org/wiki/$1',1),
-('st','http://st.wikipedia.org/wiki/$1',1),
-('stq','http://stq.wikipedia.org/wiki/$1',1),
-('su','http://su.wikipedia.org/wiki/$1',1),
-('sv','http://sv.wikipedia.org/wiki/$1',1),
-('sw','http://sw.wikipedia.org/wiki/$1',1),
-('szl','http://szl.wikipedia.org/wiki/$1',1),
-('ta','http://ta.wikipedia.org/wiki/$1',1),
-('te','http://te.wikipedia.org/wiki/$1',1),
-('tet','http://tet.wikipedia.org/wiki/$1',1),
-('tg','http://tg.wikipedia.org/wiki/$1',1),
-('th','http://th.wikipedia.org/wiki/$1',1),
-('ti','http://ti.wikipedia.org/wiki/$1',1),
-('tk','http://tk.wikipedia.org/wiki/$1',1),
-('tl','http://tl.wikipedia.org/wiki/$1',1),
-('tn','http://tn.wikipedia.org/wiki/$1',1),
-('to','http://to.wikipedia.org/wiki/$1',1),
-('tpi','http://tpi.wikipedia.org/wiki/$1',1),
-('tr','http://tr.wikipedia.org/wiki/$1',1),
-('ts','http://ts.wikipedia.org/wiki/$1',1),
-('tt','http://tt.wikipedia.org/wiki/$1',1),
-('tum','http://tum.wikipedia.org/wiki/$1',1),
-('tw','http://tw.wikipedia.org/wiki/$1',1),
-('ty','http://ty.wikipedia.org/wiki/$1',1),
-('udm','http://udm.wikipedia.org/wiki/$1',1),
-('ug','http://ug.wikipedia.org/wiki/$1',1),
-('uk','http://uk.wikipedia.org/wiki/$1',1),
-('ur','http://ur.wikipedia.org/wiki/$1',1),
-('uz','http://uz.wikipedia.org/wiki/$1',1),
-('ve','http://ve.wikipedia.org/wiki/$1',1),
-('vec','http://vec.wikipedia.org/wiki/$1',1),
-('vi','http://vi.wikipedia.org/wiki/$1',1),
-('vls','http://vls.wikipedia.org/wiki/$1',1),
-('vo','http://vo.wikipedia.org/wiki/$1',1),
-('w','http://en.wikipedia.org/wiki/$1',1),
-('wa','http://wa.wikipedia.org/wiki/$1',1),
-('war','http://war.wikipedia.org/wiki/$1',1),
-('wo','http://wo.wikipedia.org/wiki/$1',1),
-('wuu','http://wuu.wikipedia.org/wiki/$1',1),
-('xal','http://xal.wikipedia.org/wiki/$1',1),
-('xh','http://xh.wikipedia.org/wiki/$1',1),
-('yi','http://yi.wikipedia.org/wiki/$1',1),
-('yo','http://yo.wikipedia.org/wiki/$1',1),
-('yue','http://zh-yue.wikipedia.org/wiki/$1',1),
-('za','http://za.wikipedia.org/wiki/$1',1),
-('zea','http://zea.wikipedia.org/wiki/$1',1),
-('zh','http://zh.wikipedia.org/wiki/$1',1),
-('zh-cfr','http://zh-min-nan.wikipedia.org/wiki/$1',1),
-('zh-classical','http://zh-classical.wikipedia.org/wiki/$1',1),
-('zh-cn','http://zh.wikipedia.org/wiki/$1',1),
-('zh-min-nan','http://zh-min-nan.wikipedia.org/wiki/$1',1),
-('zh-tw','http://zh.wikipedia.org/wiki/$1',1),
-('zh-yue','http://zh-yue.wikipedia.org/wiki/$1',1),
-('zu','http://zu.wikipedia.org/wiki/$1',1);
diff --git a/maintenance/wiktionary-interwiki.sql b/maintenance/wiktionary-interwiki.sql
deleted file mode 100644
index f55235b1..00000000
--- a/maintenance/wiktionary-interwiki.sql
+++ /dev/null
@@ -1,184 +0,0 @@
--- For convenience, here are the *in-project* interwiki prefixes
--- for Wiktionary.
-
-REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
-('w','http://www.wikipedia.org/wiki/$1',1),
-('m','http://meta.wikipedia.org/wiki/$1',1),
-('meta','http://meta.wikipedia.org/wiki/$1',1),
-('sep11','http://sep11.wikipedia.org/wiki/$1',1),
-('simple','http://simple.wiktionary.org/wiki/$1',1),
-('aa','http://aa.wiktionary.org/wiki/$1',1),
-('ab','http://ab.wiktionary.org/wiki/$1',1),
-('af','http://af.wiktionary.org/wiki/$1',1),
-('ak','http://ak.wiktionary.org/wiki/$1',1),
-('als','http://als.wiktionary.org/wiki/$1',1),
-('am','http://am.wiktionary.org/wiki/$1',1),
-('an','http://an.wiktionary.org/wiki/$1',1),
-('ang','http://ang.wiktionary.org/wiki/$1',1),
-('ar','http://ar.wiktionary.org/wiki/$1',1),
-('as','http://as.wiktionary.org/wiki/$1',1),
-('ast','http://ast.wiktionary.org/wiki/$1',1),
-('av','http://av.wiktionary.org/wiki/$1',1),
-('ay','http://ay.wiktionary.org/wiki/$1',1),
-('az','http://az.wiktionary.org/wiki/$1',1),
-('ba','http://ba.wiktionary.org/wiki/$1',1),
-('be','http://be.wiktionary.org/wiki/$1',1),
-('bg','http://bg.wiktionary.org/wiki/$1',1),
-('bh','http://bh.wiktionary.org/wiki/$1',1),
-('bi','http://bi.wiktionary.org/wiki/$1',1),
-('bm','http://bm.wiktionary.org/wiki/$1',1),
-('bn','http://bn.wiktionary.org/wiki/$1',1),
-('bo','http://bo.wiktionary.org/wiki/$1',1),
-('br','http://br.wiktionary.org/wiki/$1',1),
-('bs','http://bs.wiktionary.org/wiki/$1',1),
-('ca','http://ca.wiktionary.org/wiki/$1',1),
-('ch','http://ch.wiktionary.org/wiki/$1',1),
-('chr','http://chr.wiktionary.org/wiki/$1',1),
-('co','http://co.wiktionary.org/wiki/$1',1),
-('cr','http://cr.wiktionary.org/wiki/$1',1),
-('cs','http://cs.wiktionary.org/wiki/$1',1),
-('csb','http://csb.wiktionary.org/wiki/$1',1),
-('cy','http://cy.wiktionary.org/wiki/$1',1),
-('da','http://da.wiktionary.org/wiki/$1',1),
-('de','http://de.wiktionary.org/wiki/$1',1),
-('dk','http://da.wiktionary.org/wiki/$1',1),
-('dv','http://dv.wiktionary.org/wiki/$1',1),
-('dz','http://dz.wiktionary.org/wiki/$1',1),
-('el','http://el.wiktionary.org/wiki/$1',1),
-('en','http://en.wiktionary.org/wiki/$1',1),
-('eo','http://eo.wiktionary.org/wiki/$1',1),
-('es','http://es.wiktionary.org/wiki/$1',1),
-('et','http://et.wiktionary.org/wiki/$1',1),
-('eu','http://eu.wiktionary.org/wiki/$1',1),
-('fa','http://fa.wiktionary.org/wiki/$1',1),
-('fi','http://fi.wiktionary.org/wiki/$1',1),
-('fj','http://fj.wiktionary.org/wiki/$1',1),
-('fo','http://fo.wiktionary.org/wiki/$1',1),
-('fr','http://fr.wiktionary.org/wiki/$1',1),
-('fy','http://fy.wiktionary.org/wiki/$1',1),
-('ga','http://ga.wiktionary.org/wiki/$1',1),
-('gd','http://gd.wiktionary.org/wiki/$1',1),
-('gl','http://gl.wiktionary.org/wiki/$1',1),
-('gn','http://gn.wiktionary.org/wiki/$1',1),
-('gu','http://gu.wiktionary.org/wiki/$1',1),
-('gv','http://gv.wiktionary.org/wiki/$1',1),
-('ha','http://ha.wiktionary.org/wiki/$1',1),
-('he','http://he.wiktionary.org/wiki/$1',1),
-('hi','http://hi.wiktionary.org/wiki/$1',1),
-('hr','http://hr.wiktionary.org/wiki/$1',1),
-('hsb','http://hsb.wiktionary.org/wiki/$1',1),
-('hu','http://hu.wiktionary.org/wiki/$1',1),
-('hy','http://hy.wiktionary.org/wiki/$1',1),
-('ia','http://ia.wiktionary.org/wiki/$1',1),
-('id','http://id.wiktionary.org/wiki/$1',1),
-('ie','http://ie.wiktionary.org/wiki/$1',1),
-('ik','http://ik.wiktionary.org/wiki/$1',1),
-('io','http://io.wiktionary.org/wiki/$1',1),
-('is','http://is.wiktionary.org/wiki/$1',1),
-('it','http://it.wiktionary.org/wiki/$1',1),
-('iu','http://iu.wiktionary.org/wiki/$1',1),
-('ja','http://ja.wiktionary.org/wiki/$1',1),
-('jbo','http://jbo.wiktionary.org/wiki/$1',1),
-('jv','http://jv.wiktionary.org/wiki/$1',1),
-('ka','http://ka.wiktionary.org/wiki/$1',1),
-('kk','http://kk.wiktionary.org/wiki/$1',1),
-('kl','http://kl.wiktionary.org/wiki/$1',1),
-('km','http://km.wiktionary.org/wiki/$1',1),
-('kn','http://kn.wiktionary.org/wiki/$1',1),
-('ko','http://ko.wiktionary.org/wiki/$1',1),
-('ks','http://ks.wiktionary.org/wiki/$1',1),
-('ku','http://ku.wiktionary.org/wiki/$1',1),
-('kw','http://kw.wiktionary.org/wiki/$1',1),
-('ky','http://ky.wiktionary.org/wiki/$1',1),
-('la','http://la.wiktionary.org/wiki/$1',1),
-('lb','http://lb.wiktionary.org/wiki/$1',1),
-('li','http://li.wiktionary.org/wiki/$1',1),
-('ln','http://ln.wiktionary.org/wiki/$1',1),
-('lo','http://lo.wiktionary.org/wiki/$1',1),
-('lt','http://lt.wiktionary.org/wiki/$1',1),
-('lv','http://lv.wiktionary.org/wiki/$1',1),
-('mg','http://mg.wiktionary.org/wiki/$1',1),
-('mh','http://mh.wiktionary.org/wiki/$1',1),
-('mi','http://mi.wiktionary.org/wiki/$1',1),
-('mk','http://mk.wiktionary.org/wiki/$1',1),
-('ml','http://ml.wiktionary.org/wiki/$1',1),
-('mn','http://mn.wiktionary.org/wiki/$1',1),
-('mo','http://mo.wiktionary.org/wiki/$1',1),
-('mr','http://mr.wiktionary.org/wiki/$1',1),
-('ms','http://ms.wiktionary.org/wiki/$1',1),
-('mt','http://mt.wiktionary.org/wiki/$1',1),
-('my','http://my.wiktionary.org/wiki/$1',1),
-('na','http://na.wiktionary.org/wiki/$1',1),
-('nah','http://nah.wiktionary.org/wiki/$1',1),
-('nb', 'http://no.wiktionary.org/wiki/$1',1),
-('nds','http://nds.wiktionary.org/wiki/$1',1),
-('ne','http://ne.wiktionary.org/wiki/$1',1),
-('nl','http://nl.wiktionary.org/wiki/$1',1),
-('nn','http://nn.wiktionary.org/wiki/$1',1),
-('no','http://no.wiktionary.org/wiki/$1',1),
-('oc','http://oc.wiktionary.org/wiki/$1',1),
-('om','http://om.wiktionary.org/wiki/$1',1),
-('or','http://or.wiktionary.org/wiki/$1',1),
-('pa','http://pa.wiktionary.org/wiki/$1',1),
-('pi','http://pi.wiktionary.org/wiki/$1',1),
-('pl','http://pl.wiktionary.org/wiki/$1',1),
-('ps','http://ps.wiktionary.org/wiki/$1',1),
-('pt','http://pt.wiktionary.org/wiki/$1',1),
-('qu','http://qu.wiktionary.org/wiki/$1',1),
-('rm','http://rm.wiktionary.org/wiki/$1',1),
-('rn','http://rn.wiktionary.org/wiki/$1',1),
-('ro','http://ro.wiktionary.org/wiki/$1',1),
-('roa-rup','http://roa-rup.wiktionary.org/wiki/$1',1),
-('ru','http://ru.wiktionary.org/wiki/$1',1),
-('rw','http://rw.wiktionary.org/wiki/$1',1),
-('sa','http://sa.wiktionary.org/wiki/$1',1),
-('sc','http://sc.wiktionary.org/wiki/$1',1),
-('scn','http://scn.wiktionary.org/wiki/$1',1),
-('sd','http://sd.wiktionary.org/wiki/$1',1),
-('sg','http://sg.wiktionary.org/wiki/$1',1),
-('sh','http://sh.wiktionary.org/wiki/$1',1),
-('si','http://si.wiktionary.org/wiki/$1',1),
-('sk','http://sk.wiktionary.org/wiki/$1',1),
-('sl','http://sl.wiktionary.org/wiki/$1',1),
-('sm','http://sm.wiktionary.org/wiki/$1',1),
-('sn','http://sn.wiktionary.org/wiki/$1',1),
-('so','http://so.wiktionary.org/wiki/$1',1),
-('sq','http://sq.wiktionary.org/wiki/$1',1),
-('sr','http://sr.wiktionary.org/wiki/$1',1),
-('ss','http://ss.wiktionary.org/wiki/$1',1),
-('st','http://st.wiktionary.org/wiki/$1',1),
-('su','http://su.wiktionary.org/wiki/$1',1),
-('sv','http://sv.wiktionary.org/wiki/$1',1),
-('sw','http://sw.wiktionary.org/wiki/$1',1),
-('ta','http://ta.wiktionary.org/wiki/$1',1),
-('te','http://te.wiktionary.org/wiki/$1',1),
-('tg','http://tg.wiktionary.org/wiki/$1',1),
-('th','http://th.wiktionary.org/wiki/$1',1),
-('ti','http://ti.wiktionary.org/wiki/$1',1),
-('tk','http://tk.wiktionary.org/wiki/$1',1),
-('tl','http://tl.wiktionary.org/wiki/$1',1),
-('tn','http://tn.wiktionary.org/wiki/$1',1),
-('to','http://to.wiktionary.org/wiki/$1',1),
-('tpi','http://tpi.wiktionary.org/wiki/$1',1),
-('tr','http://tr.wiktionary.org/wiki/$1',1),
-('ts','http://ts.wiktionary.org/wiki/$1',1),
-('tt','http://tt.wiktionary.org/wiki/$1',1),
-('tw','http://tw.wiktionary.org/wiki/$1',1),
-('ug','http://ug.wiktionary.org/wiki/$1',1),
-('uk','http://uk.wiktionary.org/wiki/$1',1),
-('ur','http://ur.wiktionary.org/wiki/$1',1),
-('uz','http://uz.wiktionary.org/wiki/$1',1),
-('vi','http://vi.wiktionary.org/wiki/$1',1),
-('vo','http://vo.wiktionary.org/wiki/$1',1),
-('wa','http://wa.wiktionary.org/wiki/$1',1),
-('wo','http://wo.wiktionary.org/wiki/$1',1),
-('xh','http://xh.wiktionary.org/wiki/$1',1),
-('yi','http://yi.wiktionary.org/wiki/$1',1),
-('yo','http://yo.wiktionary.org/wiki/$1',1),
-('za','http://za.wiktionary.org/wiki/$1',1),
-('zh','http://zh.wiktionary.org/wiki/$1',1),
-('zh-cn','http://zh.wiktionary.org/wiki/$1',1),
-('zh-min-nan','http://zh-min-nan.wiktionary.org/wiki/$1',1),
-('zh-tw','http://zh.wiktionary.org/wiki/$1',1),
-('zu','http://zu.wiktionary.org/wiki/$1',1);
-
diff --git a/mw-config/index.php b/mw-config/index.php
index 1e6d0e4f..c65be69c 100644
--- a/mw-config/index.php
+++ b/mw-config/index.php
@@ -34,10 +34,10 @@ function wfInstallerMain() {
$session = array();
}
- if ( isset( $session['settings']['_UserLang'] ) ) {
+ if ( !is_null( $wgRequest->getVal( 'uselang' ) ) ) {
+ $langCode = $wgRequest->getVal( 'uselang' );
+ } elseif ( isset( $session['settings']['_UserLang'] ) ) {
$langCode = $session['settings']['_UserLang'];
- } elseif ( !is_null( $wgRequest->getVal( 'UserLang' ) ) ) {
- $langCode = $wgRequest->getVal( 'UserLang' );
} else {
$langCode = 'en';
}
diff --git a/profileinfo.php b/profileinfo.php
index 3117db31..1549349b 100644
--- a/profileinfo.php
+++ b/profileinfo.php
@@ -78,6 +78,17 @@ if ( !$wgEnableProfileInfo ) {
exit( 1 );
}
+$dbr = wfGetDB( DB_SLAVE );
+
+if( !$dbr->tableExists( 'profiling' ) ) {
+ echo "<p>No 'profiling' table exists, so we can't show you anything.</p>\n";
+ echo "<p>If you want to log profiling data, create the table using "
+ . "<tt>maintenance/archives/patch-profiling.sql</tt> and enable "
+ . "<tt>\$wgProfileToDatabase</tt>.</p>\n";
+ echo "</body></html>";
+ exit( 1 );
+}
+
$expand = array();
if ( isset( $_REQUEST['expand'] ) )
foreach( explode( ',', $_REQUEST['expand'] ) as $f )
@@ -188,7 +199,7 @@ class profile_point {
}
};
-function compare_point( $a, $b ) {
+function compare_point(profile_point $a, profile_point $b) {
global $sort;
switch ( $sort ) {
case "name":
@@ -218,8 +229,6 @@ $sort = 'time';
if ( isset( $_REQUEST['sort'] ) && in_array( $_REQUEST['sort'], $sorts ) )
$sort = $_REQUEST['sort'];
-
-$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'profiling', '*', array(), 'profileinfo.php', array( 'ORDER BY' => 'pf_name ASC' ) );
if (isset( $_REQUEST['filter'] ) )
diff --git a/redirect.php b/redirect.php
index c0a16021..eb15c6b9 100644
--- a/redirect.php
+++ b/redirect.php
@@ -18,4 +18,4 @@ $page = $wgRequest->getVal( 'wpDropdown' );
$url = str_replace( "$1", urlencode( $page ), $wgArticlePath );
-header( "Location: {$url}" );
+header( "Location: {$url}", true, 301 );
diff --git a/resources/Resources.php b/resources/Resources.php
index 940d646d..ca64263a 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -2,7 +2,7 @@
return array(
- /* Special resources who have their own classes */
+ /* Special modules who have their own classes */
'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
'noscript' => array( 'class' => 'ResourceLoaderNoscriptModule' ),
@@ -10,19 +10,35 @@ return array(
'user' => array( 'class' => 'ResourceLoaderUserModule' ),
'user.groups' => array( 'class' => 'ResourceLoaderUserGroupsModule' ),
'user.options' => array( 'class' => 'ResourceLoaderUserOptionsModule' ),
+ 'user.cssprefs' => array( 'class' => 'ResourceLoaderUserCSSPrefsModule' ),
'user.tokens' => array( 'class' => 'ResourceLoaderUserTokensModule' ),
'filepage' => array( 'class' => 'ResourceLoaderFilePageModule' ),
/* Skins */
- 'skins.vector' => array(
- 'styles' => array( 'vector/screen.css' => array( 'media' => 'screen' ) ),
- 'scripts' => 'vector/vector.js',
+ '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'],
@@ -30,6 +46,9 @@ return array(
),
'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' ),
@@ -38,36 +57,29 @@ 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.chick' => array(
- 'styles' => array( 'chick/main.css' => array( 'media' => 'screen,handheld' ) ),
+ 'skins.standard' => array(
+ 'styles' => array( 'common/wikistandard.css' => array( 'media' => 'screen' ) ),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
- 'skins.modern' => array(
+ 'skins.vector' => array(
'styles' => array(
- 'modern/main.css' => array( 'media' => 'screen' ),
- 'modern/print.css' => array( 'media' => 'print' ),
+ 'common/commonElements.css' => array( 'media' => 'screen' ),
+ 'common/commonContent.css' => array( 'media' => 'screen' ),
+ 'common/commonInterface.css' => array( 'media' => 'screen' ),
+ 'vector/screen.css' => array( 'media' => 'screen' ),
),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.cologneblue' => array(
- 'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.nostalgia' => array(
- 'styles' => array( 'nostalgia/screen.css' => array( 'media' => 'screen' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.standard' => array(
- 'styles' => array( 'common/wikistandard.css' => array( 'media' => 'screen' ) ),
+ 'scripts' => 'vector/vector.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
@@ -76,17 +88,21 @@ return array(
'jquery' => array(
'scripts' => 'resources/jquery/jquery.js',
- 'debugRaw' => false
+ 'debugRaw' => false,
),
/* jQuery Plugins */
- 'jquery.async' => array(
- 'scripts' => 'resources/jquery/jquery.async.js',
- ),
'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',
@@ -107,13 +123,13 @@ return array(
'jquery.collapsibleTabs' => array(
'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
),
- 'jquery.colorUtil' => array(
- 'scripts' => 'resources/jquery/jquery.colorUtil.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',
),
@@ -124,6 +140,15 @@ return 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',
),
@@ -136,13 +161,6 @@ return array(
'jquery.hoverIntent' => array(
'scripts' => 'resources/jquery/jquery.hoverIntent.js',
),
- 'jquery.messageBox' => array(
- 'scripts' => 'resources/jquery/jquery.messageBox.js',
- 'styles' => 'resources/jquery/jquery.messageBox.css',
- ),
- 'jquery.placeholder' => array(
- 'scripts' => 'resources/jquery/jquery.placeholder.js',
- ),
'jquery.json' => array(
'scripts' => 'resources/jquery/jquery.json.js',
),
@@ -154,12 +172,34 @@ return array(
'styles' => 'resources/jquery/jquery.makeCollapsible.css',
'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
),
- 'jquery.mwPrototypes' => array(
- 'scripts' => 'resources/jquery/jquery.mwPrototypes.js',
+ 'jquery.messageBox' => array(
+ 'scripts' => 'resources/jquery/jquery.messageBox.js',
+ 'styles' => 'resources/jquery/jquery.messageBox.css',
+ ),
+ '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.suggestions' => array(
'scripts' => 'resources/jquery/jquery.suggestions.js',
@@ -177,6 +217,15 @@ return array(
'jquery.textSelection' => array(
'scripts' => 'resources/jquery/jquery.textSelection.js',
),
+ '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',
@@ -305,6 +354,7 @@ return array(
'fo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
'fr-ch' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js',
'fr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
+ 'gl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
'hr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js',
'hu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js',
@@ -313,14 +363,20 @@ return array(
'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',
+ 'kk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-kk.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',
@@ -415,6 +471,11 @@ return array(
'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',
@@ -458,48 +519,113 @@ return array(
'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
'debugRaw' => false,
),
- 'mediawiki.Title' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.Title.js',
+ 'mediawiki.api' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
'dependencies' => 'mediawiki.util',
),
- 'mediawiki.Uri' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
+ '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', 'mediawiki.user'),
+ ),
+ '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.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.page.startup' => array(
- 'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
- 'dependencies' => array(
- 'jquery.client',
- ),
- 'position' => 'top',
- ),
- 'mediawiki.page.ready' => array(
- 'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
- 'dependencies' => array(
- 'jquery.checkboxShiftClick',
- 'jquery.makeCollapsible',
- 'jquery.placeholder',
- ),
- ),
'mediawiki.util' => array(
'scripts' => 'resources/mediawiki/mediawiki.util.js',
'dependencies' => array(
'jquery.client',
'jquery.cookie',
'jquery.messageBox',
- 'jquery.mwPrototypes',
+ 'jquery.mwExtension',
),
+ 'messages' => array( 'showtoc', 'hidetoc' ),
+ 'position' => 'top', // For $wgPreloadJavaScriptMwUtil
),
- 'mediawiki.libs.jpegmeta' => array(
- 'scripts' => 'resources/mediawiki.libs/mediawiki.libs.jpegmeta.js',
+
+ /* MediaWiki Action */
+
+ 'mediawiki.action.edit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
+ 'dependencies' => array(
+ 'jquery.textSelection',
+ 'jquery.byteLimit',
+ ),
),
'mediawiki.action.history' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
@@ -510,22 +636,26 @@ return array(
'styles' => 'resources/mediawiki.action/mediawiki.action.history.diff.css',
'group' => 'mediawiki.action.history',
),
- 'mediawiki.action.edit' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
- 'dependencies' => array(
- 'jquery.textSelection',
- 'jquery.byteLimit',
+ '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',
),
- 'mediawiki.action.view.metadata' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.metadata.js',
- 'messages' => array( 'metadata-expand', 'metadata-collapse' ),
- ),
'mediawiki.action.watch.ajax' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.watch.ajax.js',
+ 'dependencies' => array(
+ 'mediawiki.api.watch',
+ 'mediawiki.util',
+ ),
'messages' => array(
'watch',
'unwatch',
@@ -537,53 +667,7 @@ return array(
),
),
- /* Special pages */
-
- 'mediawiki.special' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.css',
- ),
- 'mediawiki.special.preferences' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
- 'messages' => array( 'email-address-validity-valid', 'email-address-validity-invalid' ),
- ),
- 'mediawiki.special.changeslist' => array(
- 'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
- 'dependencies' => array( 'jquery.makeCollapsible' ),
- ),
- 'mediawiki.special.search' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.search.css',
- ),
- 'mediawiki.special.block' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.block.js',
- ),
- 'mediawiki.special.undelete' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
- ),
- 'mediawiki.special.movePage' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
- 'dependencies' => 'jquery.byteLimit',
- ),
- 'mediawiki.special.recentchanges' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
- 'dependencies' => array( 'mediawiki.special' ),
- 'position' => 'top',
- ),
- '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 Language */
'mediawiki.language' => array(
'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
@@ -638,13 +722,132 @@ return array(
),
),
- /* mediawiki Legacy */
+ 'mediawiki.jqueryMsg' => array(
+ 'dependencies' => array( 'mediawiki.language', 'mediawiki.util' ),
+ 'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js'
+ ),
+
+ /* 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 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',
+ ),
+ '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',
+ ),
+ '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' => 'mediawiki.legacy.wikibits',
+ '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' ) ),
@@ -685,6 +888,7 @@ return array(
'mediawiki.legacy.wikibits',
'jquery.byteLimit',
),
+ 'position' => 'top',
),
'mediawiki.legacy.shared' => array(
'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
@@ -700,14 +904,19 @@ return array(
'scripts' => 'common/upload.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
- 'dependencies' => 'mediawiki.legacy.wikibits',
+ 'dependencies' => array(
+ 'mediawiki.legacy.wikibits',
+ 'mediawiki.util',
+ ),
),
'mediawiki.legacy.wikibits' => array(
'scripts' => 'common/wikibits.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
- 'dependencies' => 'mediawiki.language',
- 'messages' => array( 'showtoc', 'hidetoc' ),
+ 'dependencies' => array(
+ 'mediawiki.util',
+ ),
+ 'position' => 'top',
),
'mediawiki.legacy.wikiprintable' => array(
'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
diff --git a/resources/jquery.effects/jquery.effects.blind.js b/resources/jquery.effects/jquery.effects.blind.js
index d9a3b06b..2ecbbed3 100644
--- a/resources/jquery.effects/jquery.effects.blind.js
+++ b/resources/jquery.effects/jquery.effects.blind.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Blind 1.8.2
+ * jQuery UI Effects Blind 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Blind
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.blind = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left'];
+ var el = $(this), props = ['position','top','bottom','left','right'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
diff --git a/resources/jquery.effects/jquery.effects.bounce.js b/resources/jquery.effects/jquery.effects.bounce.js
index 010585bf..f8e44730 100644
--- a/resources/jquery.effects/jquery.effects.bounce.js
+++ b/resources/jquery.effects/jquery.effects.bounce.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Bounce 1.8.2
+ * jQuery UI Effects Bounce 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Bounce
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.bounce = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left'];
+ var el = $(this), props = ['position','top','bottom','left','right'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
diff --git a/resources/jquery.effects/jquery.effects.clip.js b/resources/jquery.effects/jquery.effects.clip.js
index 796ba89e..74845c08 100644
--- a/resources/jquery.effects/jquery.effects.clip.js
+++ b/resources/jquery.effects/jquery.effects.clip.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Clip 1.8.2
+ * jQuery UI Effects Clip 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Clip
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.clip = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left','height','width'];
+ var el = $(this), props = ['position','top','bottom','left','right','height','width'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
diff --git a/resources/jquery.effects/jquery.effects.core.js b/resources/jquery.effects/jquery.effects.core.js
index 4589fe21..7f568964 100644
--- a/resources/jquery.effects/jquery.effects.core.js
+++ b/resources/jquery.effects/jquery.effects.core.js
@@ -1,13 +1,13 @@
/*
- * jQuery UI Effects 1.8.2
+ * jQuery UI Effects 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/
*/
-;jQuery.effects || (function($) {
+;jQuery.effects || (function($, undefined) {
$.effects = {};
@@ -19,7 +19,7 @@ $.effects = {};
// override the animation for color styles
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
- 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'],
+ 'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
function(i, attr) {
$.fx.step[attr] = function(fx) {
if (!fx.colorInit) {
@@ -52,7 +52,7 @@ function getRGB(color) {
return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
// Look for rgb(num%,num%,num%)
- if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec(color))
+ if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
// Look for #a0b1c2
@@ -231,13 +231,12 @@ $.effects.animateClass = function(value, duration, easing, callback) {
easing = null;
}
- return this.each(function() {
-
+ return this.queue(function() {
var that = $(this),
originalStyleAttr = that.attr('style') || ' ',
originalStyle = filterStyles(getElementStyles.call(this)),
newStyle,
- className = that.attr('className');
+ className = that.attr('class');
$.each(classAnimationActions, function(i, action) {
if (value[action]) {
@@ -245,20 +244,26 @@ $.effects.animateClass = function(value, duration, easing, callback) {
}
});
newStyle = filterStyles(getElementStyles.call(this));
- that.attr('className', className);
-
- that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
- $.each(classAnimationActions, function(i, action) {
- if (value[action]) { that[action + 'Class'](value[action]); }
- });
- // work around bug in IE by clearing the cssText before setting it
- if (typeof that.attr('style') == 'object') {
- that.attr('style').cssText = '';
- that.attr('style').cssText = originalStyleAttr;
- } else {
- that.attr('style', originalStyleAttr);
+ that.attr('class', className);
+
+ that.animate(styleDifference(originalStyle, newStyle), {
+ queue: false,
+ duration: duration,
+ easing: easing,
+ complete: function() {
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) { that[action + 'Class'](value[action]); }
+ });
+ // work around bug in IE by clearing the cssText before setting it
+ if (typeof that.attr('style') == 'object') {
+ that.attr('style').cssText = '';
+ that.attr('style').cssText = originalStyleAttr;
+ } else {
+ that.attr('style', originalStyleAttr);
+ }
+ if (callback) { callback.apply(this, arguments); }
+ $.dequeue( this );
}
- if (callback) { callback.apply(this, arguments); }
});
});
};
@@ -301,7 +306,7 @@ $.fn.extend({
/******************************************************************************/
$.extend($.effects, {
- version: "1.8.2",
+ version: "1.8.17",
// Saves a set of properties in a data storage
save: function(element, set) {
@@ -362,9 +367,16 @@ $.extend($.effects, {
border: 'none',
margin: 0,
padding: 0
- });
+ }),
+ active = document.activeElement;
element.wrap(wrapper);
+
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+
wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
// transfer positioning properties to the wrapper
@@ -382,15 +394,25 @@ $.extend($.effects, {
props[pos] = 'auto';
}
});
- element.css({position: 'relative', top: 0, left: 0 });
+ element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
}
return wrapper.css(props).show();
},
removeWrapper: function(element) {
- if (element.parent().is('.ui-effects-wrapper'))
- return element.parent().replaceWith(element);
+ var parent,
+ active = document.activeElement;
+
+ if (element.parent().is('.ui-effects-wrapper')) {
+ parent = element.parent().replaceWith(element);
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+ return parent;
+ }
+
return element;
},
@@ -418,44 +440,72 @@ function _normalizeArguments(effect, options, speed, callback) {
speed = null;
options = {};
}
- if ($.isFunction(speed)) {
- callback = speed;
- speed = null;
- }
- if (typeof options == 'number' || $.fx.speeds[options]) {
+ if (typeof options == 'number' || $.fx.speeds[options]) {
callback = speed;
speed = options;
options = {};
}
+ if ($.isFunction(speed)) {
+ callback = speed;
+ speed = null;
+ }
options = options || {};
speed = speed || options.duration;
speed = $.fx.off ? 0 : typeof speed == 'number'
- ? speed : $.fx.speeds[speed] || $.fx.speeds._default;
+ ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
callback = callback || options.complete;
return [effect, options, speed, callback];
}
+function standardSpeed( speed ) {
+ // valid standard speeds
+ if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+ return true;
+ }
+
+ // invalid strings - treat as "normal" speed
+ if ( typeof speed === "string" && !$.effects[ speed ] ) {
+ return true;
+ }
+
+ return false;
+}
+
$.fn.extend({
effect: function(effect, options, speed, callback) {
var args = _normalizeArguments.apply(this, arguments),
- // TODO: make effects takes actual parameters instead of a hash
+ // TODO: make effects take actual parameters instead of a hash
args2 = {
options: args[1],
duration: args[2],
callback: args[3]
},
+ mode = args2.options.mode,
effectMethod = $.effects[effect];
- return effectMethod && !$.fx.off ? effectMethod.call(this, args2) : this;
+ if ( $.fx.off || !effectMethod ) {
+ // delegate to the original method (e.g., .show()) if possible
+ if ( mode ) {
+ return this[ mode ]( args2.duration, args2.callback );
+ } else {
+ return this.each(function() {
+ if ( args2.callback ) {
+ args2.callback.call( this );
+ }
+ });
+ }
+ }
+
+ return effectMethod.call(this, args2);
},
_show: $.fn.show,
show: function(speed) {
- if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
+ if ( standardSpeed( speed ) ) {
return this._show.apply(this, arguments);
} else {
var args = _normalizeArguments.apply(this, arguments);
@@ -466,7 +516,7 @@ $.fn.extend({
_hide: $.fn.hide,
hide: function(speed) {
- if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
+ if ( standardSpeed( speed ) ) {
return this._hide.apply(this, arguments);
} else {
var args = _normalizeArguments.apply(this, arguments);
@@ -475,11 +525,10 @@ $.fn.extend({
}
},
- // jQuery core overloads toggle and create _toggle
+ // jQuery core overloads toggle and creates _toggle
__toggle: $.fn.toggle,
toggle: function(speed) {
- if (!speed || typeof speed == 'number' || $.fx.speeds[speed] ||
- typeof speed == 'boolean' || $.isFunction(speed)) {
+ if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
return this.__toggle.apply(this, arguments);
} else {
var args = _normalizeArguments.apply(this, arguments);
diff --git a/resources/jquery.effects/jquery.effects.drop.js b/resources/jquery.effects/jquery.effects.drop.js
index 0059c033..4bbd1087 100644
--- a/resources/jquery.effects/jquery.effects.drop.js
+++ b/resources/jquery.effects/jquery.effects.drop.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Drop 1.8.2
+ * jQuery UI Effects Drop 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Drop
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.drop = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left','opacity'];
+ var el = $(this), props = ['position','top','bottom','left','right','opacity'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
diff --git a/resources/jquery.effects/jquery.effects.explode.js b/resources/jquery.effects/jquery.effects.explode.js
index 85ba1dcc..2c12fdb4 100644
--- a/resources/jquery.effects/jquery.effects.explode.js
+++ b/resources/jquery.effects/jquery.effects.explode.js
@@ -1,16 +1,16 @@
/*
- * jQuery UI Effects Explode 1.8.2
+ * jQuery UI Effects Explode 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Explode
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.explode = function(o) {
diff --git a/resources/jquery.effects/jquery.effects.fade.js b/resources/jquery.effects/jquery.effects.fade.js
new file mode 100644
index 00000000..bae63661
--- /dev/null
+++ b/resources/jquery.effects/jquery.effects.fade.js
@@ -0,0 +1,32 @@
+/*
+ * jQuery UI Effects Fade 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+ elem.animate({ opacity: mode }, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
diff --git a/resources/jquery.effects/jquery.effects.fold.js b/resources/jquery.effects/jquery.effects.fold.js
index 946831bf..8e732739 100644
--- a/resources/jquery.effects/jquery.effects.fold.js
+++ b/resources/jquery.effects/jquery.effects.fold.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Fold 1.8.2
+ * jQuery UI Effects Fold 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Fold
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.fold = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left'];
+ var el = $(this), props = ['position','top','bottom','left','right'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
diff --git a/resources/jquery.effects/jquery.effects.highlight.js b/resources/jquery.effects/jquery.effects.highlight.js
index 5e03e9ec..306d515b 100644
--- a/resources/jquery.effects/jquery.effects.highlight.js
+++ b/resources/jquery.effects/jquery.effects.highlight.js
@@ -1,16 +1,16 @@
/*
- * jQuery UI Effects Highlight 1.8.2
+ * jQuery UI Effects Highlight 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Highlight
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.highlight = function(o) {
return this.queue(function() {
diff --git a/resources/jquery.effects/jquery.effects.pulsate.js b/resources/jquery.effects/jquery.effects.pulsate.js
index 11c5af13..766690fb 100644
--- a/resources/jquery.effects/jquery.effects.pulsate.js
+++ b/resources/jquery.effects/jquery.effects.pulsate.js
@@ -1,16 +1,16 @@
/*
- * jQuery UI Effects Pulsate 1.8.2
+ * jQuery UI Effects Pulsate 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Pulsate
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.pulsate = function(o) {
return this.queue(function() {
diff --git a/resources/jquery.effects/jquery.effects.scale.js b/resources/jquery.effects/jquery.effects.scale.js
index 1efb781a..4cb73822 100644
--- a/resources/jquery.effects/jquery.effects.scale.js
+++ b/resources/jquery.effects/jquery.effects.scale.js
@@ -1,16 +1,16 @@
/*
- * jQuery UI Effects Scale 1.8.2
+ * jQuery UI Effects Scale 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Scale
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.puff = function(o) {
return this.queue(function() {
@@ -84,8 +84,8 @@ $.effects.size = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
- var props1 = ['position','top','left','overflow','opacity']; // Always restore
+ var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+ var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
var props2 = ['width','height','overflow']; // Copy for children
var cProps = ['fontSize'];
var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
diff --git a/resources/jquery.effects/jquery.effects.shake.js b/resources/jquery.effects/jquery.effects.shake.js
index 050894b4..b5a7352e 100644
--- a/resources/jquery.effects/jquery.effects.shake.js
+++ b/resources/jquery.effects/jquery.effects.shake.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Shake 1.8.2
+ * jQuery UI Effects Shake 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Shake
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.shake = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left'];
+ var el = $(this), props = ['position','top','bottom','left','right'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
diff --git a/resources/jquery.effects/jquery.effects.slide.js b/resources/jquery.effects/jquery.effects.slide.js
index d0719a7f..e41869b9 100644
--- a/resources/jquery.effects/jquery.effects.slide.js
+++ b/resources/jquery.effects/jquery.effects.slide.js
@@ -1,23 +1,23 @@
/*
- * jQuery UI Effects Slide 1.8.2
+ * jQuery UI Effects Slide 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Slide
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.slide = function(o) {
return this.queue(function() {
// Create element
- var el = $(this), props = ['position','top','left'];
+ var el = $(this), props = ['position','top','bottom','left','right'];
// Set options
var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
@@ -29,7 +29,7 @@ $.effects.slide = function(o) {
var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
- if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift
+ if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
// Animation
var animation = {};
diff --git a/resources/jquery.effects/jquery.effects.transfer.js b/resources/jquery.effects/jquery.effects.transfer.js
index 4c212ca0..d51b9c43 100644
--- a/resources/jquery.effects/jquery.effects.transfer.js
+++ b/resources/jquery.effects/jquery.effects.transfer.js
@@ -1,16 +1,16 @@
/*
- * jQuery UI Effects Transfer 1.8.2
+ * jQuery UI Effects Transfer 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Effects/Transfer
*
* Depends:
* jquery.effects.core.js
*/
-(function($) {
+(function( $, undefined ) {
$.effects.transfer = function(o) {
return this.queue(function() {
diff --git a/resources/jquery.tipsy/jquery.tipsy.css b/resources/jquery.tipsy/jquery.tipsy.css
index 2e504c32..3680fbe2 100644
--- a/resources/jquery.tipsy/jquery.tipsy.css
+++ b/resources/jquery.tipsy/jquery.tipsy.css
@@ -11,7 +11,6 @@
border: solid 1px #a7d7f9;
color: black;
max-width: 15em;
- text-align: left;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
@@ -30,36 +29,36 @@
width: 11px;
height: 6px;
}
-.tipsy-n .tipsy-arrow {
+/* @noflip */ .tipsy-n .tipsy-arrow {
top: 0px;
left: 50%;
margin-left: -5px;
}
-.tipsy-nw .tipsy-arrow {
+/* @noflip */ .tipsy-nw .tipsy-arrow {
top: 1px;
left: 10px;
}
-.tipsy-ne .tipsy-arrow {
+/* @noflip */ .tipsy-ne .tipsy-arrow {
top: 1px;
right: 10px;
}
-.tipsy-s .tipsy-arrow {
+/* @noflip */ .tipsy-s .tipsy-arrow {
bottom: 0px;
left: 50%;
margin-left: -5px;
background-position: bottom left;
}
-.tipsy-sw .tipsy-arrow {
+/* @noflip */ .tipsy-sw .tipsy-arrow {
bottom: 0px;
left: 10px;
background-position: bottom left;
}
-.tipsy-se .tipsy-arrow {
+/* @noflip */ .tipsy-se .tipsy-arrow {
bottom: 0px;
right: 10px;
background-position: bottom left;
}
-.tipsy-e .tipsy-arrow {
+/* @noflip */ .tipsy-e .tipsy-arrow {
top: 50%;
margin-top: -5px;
right: 1px;
@@ -67,7 +66,7 @@
height: 11px;
background-position: top right;
}
-.tipsy-w .tipsy-arrow {
+/* @noflip */ .tipsy-w .tipsy-arrow {
top: 50%;
margin-top: -5px;
left: 0px;
diff --git a/resources/jquery.tipsy/jquery.tipsy.js b/resources/jquery.tipsy/jquery.tipsy.js
index 7c808734..a9fcec8f 100644
--- a/resources/jquery.tipsy/jquery.tipsy.js
+++ b/resources/jquery.tipsy/jquery.tipsy.js
@@ -1,10 +1,17 @@
// tipsy, facebook style tooltips for jquery
-// version 1.0.0a
+// version 1.0.0a*
// (c) 2008-2010 jason frame [jason@onehackoranother.com]
-// releated under the MIT license
+// released under the MIT license
+
+// * This installation of tipsy includes several local modifications to both Javascript and CSS.
+// Please be careful when upgrading.
(function($) {
-
+
+ function maybeCall(thing, ctx) {
+ return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
+ };
+
function fixTitle($ele) {
if ($ele.attr('title') || typeof($ele.attr('original-title')) != 'string') {
$ele.attr('original-title', $ele.attr('title') || '').removeAttr('title');
@@ -71,6 +78,9 @@
}
$tip.css(tp).addClass('tipsy-' + gravity);
+ if (this.options.className) {
+ $tip.addClass(maybeCall(this.options.className, this.$element[0]));
+ }
if (this.options.fade) {
$tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}, 100);
@@ -174,6 +184,7 @@
};
$.fn.tipsy.defaults = {
+ className: null,
delayIn: 0,
delayOut: 0,
fade: true,
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js
index 43fbf6cd..0922ef7a 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-af.js
@@ -1,4 +1,4 @@
-/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
/* Written by Renier Pretorius. */
jQuery(function($){
$.datepicker.regional['af'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
index c799b48d..743a15db 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
@@ -1,6 +1,5 @@
-/* Arabic Translation for jQuery UI date picker plugin. */
-/* Khaled Al Horani -- koko.dw@gmail.com */
-/* خالد الحوراني -- koko.dw@gmail.com */
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name Ùبراير - يناير and there isn't any Arabic roots for these months */
jQuery(function($){
$.datepicker.regional['ar'] = {
@@ -8,15 +7,15 @@ jQuery(function($){
prevText: '&#x3c;السابق',
nextText: 'التالي&#x3e;',
currentText: 'اليوم',
- monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران',
+ monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
- monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
- dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],
- dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
- dayNamesMin: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],
+ monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
weekHeader: 'أسبوع',
dateFormat: 'dd/mm/yy',
- firstDay: 0,
+ firstDay: 6,
isRTL: true,
showMonthAfterYear: false,
yearSuffix: ''};
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js
index b5434057..57802a40 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-az.js
@@ -1,4 +1,4 @@
-/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
/* Written by Jamil Najafov (necefov33@gmail.com). */
jQuery(function($) {
$.datepicker.regional['az'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js
index b5113f78..c19d20fb 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js
@@ -1,4 +1,4 @@
-/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
/* Written by Stoyan Kyosev (http://svest.org). */
jQuery(function($){
$.datepicker.regional['bg'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js
index 30ab826b..d4dc8b0e 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js
@@ -1,4 +1,4 @@
-/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Bosnian i18n for the jQuery UI date picker plugin. */
/* Written by Kenan Konjo. */
jQuery(function($){
$.datepicker.regional['bs'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js
index c3c07ea6..9805bcdb 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js
@@ -1,4 +1,4 @@
-/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Czech initialisation for the jQuery UI date picker plugin. */
/* Written by Tomas Muller (tomas@tomas-muller.net). */
jQuery(function($){
$.datepicker.regional['cs'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js
index 4a99a583..176044e1 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-da.js
@@ -1,4 +1,4 @@
-/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Danish initialisation for the jQuery UI date picker plugin. */
/* Written by Jan Christensen ( deletestuff@gmail.com). */
jQuery(function($){
$.datepicker.regional['da'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
index ac2d516a..166f5371 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
@@ -1,4 +1,4 @@
-/* German initialisation for the jQuery UI date picker plugin. */
+/* German initialisation for the jQuery UI date picker plugin. */
/* Written by Milian Wolff (mail@milianw.de). */
jQuery(function($){
$.datepicker.regional['de'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js
index 9542769d..6d775f99 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-el.js
@@ -1,4 +1,4 @@
-/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
/* Written by Alex Cicovic (http://www.alexcicovic.com) */
jQuery(function($){
$.datepicker.regional['el'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
index aac7b619..16a096e7 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js
@@ -1,4 +1,4 @@
-/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* English/UK initialisation for the jQuery UI date picker plugin. */
/* Written by Stuart. */
jQuery(function($){
$.datepicker.regional['en-GB'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js
index ba571568..6cabc2c4 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js
@@ -1,4 +1,4 @@
-/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
/* Written by Olivier M. (olivierweb@ifrance.com). */
jQuery(function($){
$.datepicker.regional['eo'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
index f97311f3..92f81f63 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
@@ -1,4 +1,4 @@
-/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Estonian initialisation for the jQuery UI date picker plugin. */
/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
jQuery(function($){
$.datepicker.regional['et'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
index 9ba6ee22..bee4bfba 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
@@ -1,4 +1,4 @@
-/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
/* Karrikas-ek itzulia (karrikas@karrikas.com) */
jQuery(function($){
$.datepicker.regional['eu'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
index adb3709f..81de4da4 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
@@ -1,4 +1,4 @@
-/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
/* Javad Mowlanezhad -- jmowla@gmail.com */
/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
jQuery(function($) {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js
index c1436221..8a6cb99c 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js
@@ -1,4 +1,4 @@
-/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Faroese initialisation for the jQuery UI date picker plugin */
/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
jQuery(function($){
$.datepicker.regional['fo'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
index 38212d54..244eacff 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
@@ -1,4 +1,4 @@
-/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
jQuery(function($){
$.datepicker.regional['fr-CH'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js
index 134bda65..7e793639 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js
@@ -1,23 +1,25 @@
-/* French initialisation for the jQuery UI date picker plugin. */
-/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+ Stéphane Nahmani (sholby@sholby.net),
+ Stéphane Raimbault <stephane.raimbault@gmail.com> */
jQuery(function($){
$.datepicker.regional['fr'] = {
closeText: 'Fermer',
- prevText: '&#x3c;Préc',
- nextText: 'Suiv&#x3e;',
- currentText: 'Courant',
+ prevText: 'Précédent',
+ nextText: 'Suivant',
+ currentText: 'Aujourd\'hui',
monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
- monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
- 'Jul','Aoû','Sep','Oct','Nov','Déc'],
+ monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
+ 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
- dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
- dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
- weekHeader: 'Sm',
+ dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+ dayNamesMin: ['D','L','M','M','J','V','S'],
+ weekHeader: 'Sem.',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.setDefaults($.datepicker.regional['fr']);
-}); \ No newline at end of file
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js
new file mode 100644
index 00000000..278403e8
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js
@@ -0,0 +1,23 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+ $.datepicker.regional['gl'] = {
+ closeText: 'Pechar',
+ prevText: '&#x3c;Ant',
+ nextText: 'Seg&#x3e;',
+ currentText: 'Hoxe',
+ monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+ 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+ monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+ 'Xul','Ago','Set','Out','Nov','Dec'],
+ dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+ dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+ dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['gl']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js
index 3b3dc387..88a78668 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-he.js
@@ -1,4 +1,4 @@
-/* Hebrew initialisation for the UI Datepicker extension. */
+/* Hebrew initialisation for the UI Datepicker extension. */
/* Written by Amir Hardon (ahardon at gmail dot com). */
jQuery(function($){
$.datepicker.regional['he'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js
index 0285c1aa..1eb3dd92 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js
@@ -1,4 +1,4 @@
-/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Croatian i18n for the jQuery UI date picker plugin. */
/* Written by Vjekoslav Nesek. */
jQuery(function($){
$.datepicker.regional['hr'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js
index 249e7b0e..b28c268c 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js
@@ -2,22 +2,22 @@
/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
jQuery(function($){
$.datepicker.regional['hu'] = {
- closeText: 'bezárás',
- prevText: '&laquo;&nbsp;vissza',
- nextText: 'előre&nbsp;&raquo;',
+ closeText: 'bezár',
+ prevText: 'vissza',
+ nextText: 'előre',
currentText: 'ma',
monthNames: ['Január', 'Február', 'Március', 'Ãprilis', 'Május', 'Június',
'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
monthNamesShort: ['Jan', 'Feb', 'Már', 'Ãpr', 'Máj', 'Jún',
'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
- dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ dayNames: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
- weekHeader: 'Hé',
- dateFormat: 'yy-mm-dd',
+ weekHeader: 'Hét',
+ dateFormat: 'yy.mm.dd.',
firstDay: 1,
isRTL: false,
- showMonthAfterYear: false,
+ showMonthAfterYear: true,
yearSuffix: ''};
$.datepicker.setDefaults($.datepicker.regional['hu']);
});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js
index 79cd827c..7eb4268d 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js
@@ -1,4 +1,4 @@
-/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Japanese initialisation for the jQuery UI date picker plugin. */
/* Written by Kentaro SATO (kentaro@ranvis.com). */
jQuery(function($){
$.datepicker.regional['ja'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js
new file mode 100644
index 00000000..79e3f248
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js
@@ -0,0 +1,23 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['kk'] = {
+ closeText: 'Жабу',
+ prevText: '&#x3c;Ðлдыңғы',
+ nextText: 'КелеÑÑ–&#x3e;',
+ currentText: 'Бүгін',
+ monthNames: ['Қаңтар','Ðқпан','Ðаурыз','Сәуір','Мамыр','МауÑым',
+ 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','ЖелтоқÑан'],
+ monthNamesShort: ['Қаң','Ðқп','Ðау','Сәу','Мам','Мау',
+ 'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+ dayNames: ['ЖекÑенбі','ДүйÑенбі','СейÑенбі','СәрÑенбі','БейÑенбі','Жұма','Сенбі'],
+ dayNamesShort: ['жкÑ','дÑн','ÑÑн','ÑÑ€Ñ','бÑн','жма','Ñнб'],
+ dayNamesMin: ['Жк','ДÑ','СÑ','Ср','БÑ','Жм','Сн'],
+ weekHeader: 'Ðе',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['kk']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js
new file mode 100644
index 00000000..87c79d59
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js
@@ -0,0 +1,23 @@
+/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
+/* Written by Michel Weimerskirch <michel@weimerskirch.net> */
+jQuery(function($){
+ $.datepicker.regional['lb'] = {
+ closeText: 'Fäerdeg',
+ prevText: 'Zréck',
+ nextText: 'Weider',
+ currentText: 'Haut',
+ monthNames: ['Januar','Februar','Mäerz','Abrëll','Mee','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
+ dayNames: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],
+ dayNamesShort: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],
+ dayNamesMin: ['So','Mé','Dë','Më','Do','Fr','Sa'],
+ weekHeader: 'W',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lb']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js
new file mode 100644
index 00000000..554ad20b
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js
@@ -0,0 +1,23 @@
+/* Macedonian i18n for the jQuery UI date picker plugin. */
+/* Written by Stojce Slavkovski. */
+jQuery(function($){
+ $.datepicker.regional['mk'] = {
+ closeText: 'Затвори',
+ prevText: '&#x3C;',
+ nextText: '&#x3E;',
+ currentText: 'ДенеÑ',
+ monthNames: ['Јануари','Фебруари','Март','Ðприл','Мај','Јуни',
+ 'Јули','ÐвгуÑÑ‚','Септември','Октомври','Ðоември','Декември'],
+ monthNamesShort: ['Јан','Феб','Мар','Ðпр','Мај','Јун',
+ 'Јул','Ðвг','Сеп','Окт','Ðое','Дек'],
+ dayNames: ['Ðедела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
+ dayNamesShort: ['Ðед','Пон','Вто','Сре','Чет','Пет','Саб'],
+ dayNamesMin: ['Ðе','По','Ð’Ñ‚','Ср','Че','Пе','Са'],
+ weekHeader: 'Сед',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['mk']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js
new file mode 100644
index 00000000..1e3432c0
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js
@@ -0,0 +1,23 @@
+/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ml'] = {
+ closeText: 'ശരി',
+ prevText: 'à´®àµà´¨àµà´¨à´¤àµà´¤àµ†',
+ nextText: 'à´…à´Ÿàµà´¤àµà´¤à´¤àµ ',
+ currentText: 'ഇനàµà´¨àµ',
+ monthNames: ['ജനàµà´µà´°à´¿','ഫെബàµà´°àµà´µà´°à´¿','മാരàµâ€à´šàµà´šàµ','à´à´ªàµà´°à´¿à´²àµâ€','മേയàµ','ജൂണàµâ€',
+ 'ജൂലൈ','ആഗസàµà´±àµà´±àµ','സെപàµà´±àµà´±à´‚ബരàµâ€','à´’à´•àµà´Ÿàµ‹à´¬à´°àµâ€','നവംബരàµâ€','ഡിസംബരàµâ€'],
+ monthNamesShort: ['ജനàµ', 'ഫെബàµ', 'മാരàµâ€', 'à´à´ªàµà´°à´¿', 'മേയàµ', 'ജൂണàµâ€',
+ 'ജൂലാ', 'ആഗ', 'സെപàµ', 'à´’à´•àµà´Ÿàµ‹', 'നവം', 'à´¡à´¿à´¸'],
+ dayNames: ['ഞായരàµâ€', 'തിങàµà´•à´³àµâ€', 'ചൊവàµà´µ', 'à´¬àµà´§à´¨àµâ€', 'à´µàµà´¯à´¾à´´à´‚', 'വെളàµà´³à´¿', 'ശനി'],
+ dayNamesShort: ['ഞായ', 'തിങàµà´•', 'ചൊവàµà´µ', 'à´¬àµà´§', 'à´µàµà´¯à´¾à´´à´‚', 'വെളàµà´³à´¿', 'ശനി'],
+ dayNamesMin: ['à´žà´¾','തി','ചൊ','à´¬àµ','à´µàµà´¯à´¾','വെ','à´¶'],
+ weekHeader: 'à´†',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ml']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js
index 663d6bb2..781fe619 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js
@@ -1,4 +1,4 @@
-/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
/* Written by Mathias Bynens <http://mathiasbynens.be/> */
jQuery(function($){
$.datepicker.regional.nl = {
@@ -8,13 +8,13 @@ jQuery(function($){
currentText: 'Vandaag',
monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
- monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+ monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
weekHeader: 'Wk',
- dateFormat: 'dd/mm/yy',
+ dateFormat: 'dd-mm-yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js
index 12b2356b..2507043a 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-no.js
@@ -1,23 +1,23 @@
/* Norwegian initialisation for the jQuery UI date picker plugin. */
/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
jQuery(function($){
- $.datepicker.regional['no'] = {
- closeText: 'Lukk',
- prevText: '&laquo;Forrige',
- nextText: 'Neste&raquo;',
- currentText: 'I dag',
- monthNames: ['Januar','Februar','Mars','April','Mai','Juni',
- 'Juli','August','September','Oktober','November','Desember'],
- monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun',
- 'Jul','Aug','Sep','Okt','Nov','Des'],
- dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
- dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
- dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
- weekHeader: 'Uke',
- dateFormat: 'yy-mm-dd',
- firstDay: 0,
- isRTL: false,
- showMonthAfterYear: false,
- yearSuffix: ''};
- $.datepicker.setDefaults($.datepicker.regional['no']);
+ $.datepicker.regional['no'] = {
+ closeText: 'Lukk',
+ prevText: '&laquo;Forrige',
+ nextText: 'Neste&raquo;',
+ currentText: 'I dag',
+ monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+ monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+ dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+ dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+ dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+ weekHeader: 'Uke',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''
+ };
+ $.datepicker.setDefaults($.datepicker.regional['no']);
});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
index 38818637..3cc8c796 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
@@ -10,9 +10,9 @@ jQuery(function($){
'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
'Jul','Ago','Set','Out','Nov','Dez'],
- dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sabado'],
- dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'],
- dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'],
+ dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
weekHeader: 'Sm',
dateFormat: 'dd/mm/yy',
firstDay: 0,
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js
new file mode 100644
index 00000000..f09f5aeb
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js
@@ -0,0 +1,22 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+ $.datepicker.regional['pt'] = {
+ closeText: 'Fechar',
+ prevText: '&#x3c;Anterior',
+ nextText: 'Seguinte',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+ weekHeader: 'Sem',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt']);
+}); \ No newline at end of file
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js
new file mode 100644
index 00000000..cf03cd4c
--- /dev/null
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js
@@ -0,0 +1,21 @@
+/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+ $.datepicker.regional['rm'] = {
+ closeText: 'Serrar',
+ prevText: '&#x3c;Suandant',
+ nextText: 'Precedent&#x3e;',
+ currentText: 'Actual',
+ monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+ monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+ dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+ dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+ dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+ weekHeader: 'emna',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['rm']);
+});
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js
index 4fe95aea..6b140aff 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js
@@ -1,4 +1,4 @@
-/* Romanian initialisation for the jQuery UI date picker plugin.
+/* Romanian initialisation for the jQuery UI date picker plugin.
*
* Written by Edmond L. (ll_edmond@walla.com)
* and Ionut G. Stan (ionut.g.stan@gmail.com)
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js
index b8091f9e..50a46135 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js
@@ -13,7 +13,7 @@ jQuery(function($){
dayNames: ['воÑкреÑенье','понедельник','вторник','Ñреда','четверг','пÑтница','Ñуббота'],
dayNamesShort: ['вÑк','пнд','втр','Ñрд','чтв','птн','Ñбт'],
dayNamesMin: ['Ð’Ñ','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'],
- weekHeader: 'Ðе',
+ weekHeader: 'Ðед',
dateFormat: 'dd.mm.yy',
firstDay: 1,
isRTL: false,
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js
index 8a6771c1..078d1b0f 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js
@@ -10,7 +10,7 @@ jQuery(function($){
'Júl','August','September','Október','November','December'],
monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
'Júl','Aug','Sep','Okt','Nov','Dec'],
- dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota'],
+ dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
dayNamesShort: ['Ned','Pon','Uto','Str','Å tv','Pia','Sob'],
dayNamesMin: ['Ne','Po','Ut','St','Å t','Pia','So'],
weekHeader: 'Ty',
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js
index be84104c..21974c56 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js
@@ -1,4 +1,4 @@
-/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Albanian initialisation for the jQuery UI date picker plugin. */
/* Written by Flakron Bytyqi (flakron@gmail.com). */
jQuery(function($){
$.datepicker.regional['sq'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
index 8f8ea5e6..e7a8683e 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
@@ -1,4 +1,4 @@
-/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Serbian i18n for the jQuery UI date picker plugin. */
/* Written by Dejan Dimić. */
jQuery(function($){
$.datepicker.regional['sr-SR'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js
index 49c9b4a3..0bd240e6 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js
@@ -1,4 +1,4 @@
-/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Serbian i18n for the jQuery UI date picker plugin. */
/* Written by Dejan Dimić. */
jQuery(function($){
$.datepicker.regional['sr'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js
index 8236b62b..e5f549fb 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js
@@ -1,4 +1,4 @@
-/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Swedish initialisation for the jQuery UI date picker plugin. */
/* Written by Anders Ekdahl ( anders@nomadiz.se). */
jQuery(function($){
$.datepicker.regional['sv'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js
index 91116d38..40431ed8 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js
@@ -1,4 +1,4 @@
-/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
/* Written by S A Sureshkumar (saskumar@live.com). */
jQuery(function($){
$.datepicker.regional['ta'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js
index 978500ab..2e5300cf 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-th.js
@@ -1,4 +1,4 @@
-/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Thai initialisation for the jQuery UI date picker plugin. */
/* Written by pipo (pipo@sixhead.com). */
jQuery(function($){
$.datepicker.regional['th'] = {
@@ -7,7 +7,7 @@ jQuery(function($){
nextText: 'ถัดไป&nbsp;&raquo;',
currentText: 'วันนี้',
monthNames: ['มà¸à¸£à¸²à¸„ม','à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
- 'à¸à¸£à¸à¸à¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'],
+ 'à¸à¸£à¸à¸Žà¸²à¸„ม','สิงหาคม','à¸à¸±à¸™à¸¢à¸²à¸¢à¸™','ตุลาคม','พฤศจิà¸à¸²à¸¢à¸™','ธันวาคม'],
monthNamesShort: ['ม.ค.','à¸.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
'à¸.ค.','ส.ค.','à¸.ย.','ต.ค.','พ.ย.','ธ.ค.'],
dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุà¸à¸£à¹Œ','เสาร์'],
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js
index 112b40e7..2718f5d1 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js
@@ -1,5 +1,6 @@
/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
jQuery(function($){
$.datepicker.regional['uk'] = {
closeText: 'Закрити',
@@ -13,7 +14,7 @@ jQuery(function($){
dayNames: ['неділÑ','понеділок','вівторок','Ñереда','четвер','п’ÑтницÑ','Ñубота'],
dayNamesShort: ['нед','пнд','вів','Ñрд','чтв','птн','Ñбт'],
dayNamesMin: ['Ðд','Пн','Ð’Ñ‚','Ср','Чт','Пт','Сб'],
- weekHeader: 'Ðе',
+ weekHeader: 'Тиж',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js
index 9813a59e..1d8f7bbd 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js
@@ -1,4 +1,4 @@
-/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
jQuery(function($){
$.datepicker.regional['vi'] = {
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
index d211573c..dd51e359 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
@@ -1,4 +1,4 @@
-/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Chinese initialisation for the jQuery UI date picker plugin. */
/* Written by Ressol (ressol@gmail.com). */
jQuery(function($){
$.datepicker.regional['zh-TW'] = {
diff --git a/resources/jquery.ui/jquery.ui.accordion.js b/resources/jquery.ui/jquery.ui.accordion.js
index 898160a1..8fa8c0b8 100644
--- a/resources/jquery.ui/jquery.ui.accordion.js
+++ b/resources/jquery.ui/jquery.ui.accordion.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Accordion 1.8.11
+ * jQuery UI Accordion 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -518,7 +518,7 @@ $.widget( "ui.accordion", {
});
$.extend( $.ui.accordion, {
- version: "1.8.11",
+ version: "1.8.17",
animations: {
slide: function( options, additions ) {
options = $.extend({
@@ -550,11 +550,11 @@ $.extend( $.ui.accordion, {
// fix width before calculating height of hidden element
var s = options.toShow;
originalWidth = s[0].style.width;
- s.width( parseInt( s.parent().width(), 10 )
- - parseInt( s.css( "paddingLeft" ), 10 )
- - parseInt( s.css( "paddingRight" ), 10 )
- - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
- - ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+ s.width( s.parent().width()
+ - parseFloat( s.css( "paddingLeft" ) )
+ - parseFloat( s.css( "paddingRight" ) )
+ - ( parseFloat( s.css( "borderLeftWidth" ) ) || 0 )
+ - ( parseFloat( s.css( "borderRightWidth" ) ) || 0 ) );
$.each( fxAttrs, function( i, prop ) {
hideProps[ prop ] = "hide";
diff --git a/resources/jquery.ui/jquery.ui.autocomplete.js b/resources/jquery.ui/jquery.ui.autocomplete.js
index 41c13930..48ede20b 100644
--- a/resources/jquery.ui/jquery.ui.autocomplete.js
+++ b/resources/jquery.ui/jquery.ui.autocomplete.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Autocomplete 1.8.14
+ * jQuery UI Autocomplete 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -48,7 +48,7 @@ $.widget( "ui.autocomplete", {
"aria-haspopup": "true"
})
.bind( "keydown.autocomplete", function( event ) {
- if ( self.options.disabled || self.element.attr( "readonly" ) ) {
+ if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
return;
}
@@ -215,6 +215,13 @@ $.widget( "ui.autocomplete", {
if ( $.fn.bgiframe ) {
this.menu.element.bgiframe();
}
+ // turning off autocomplete prevents the browser from remembering the
+ // value when navigating through history, so we re-enable autocomplete
+ // if the page is unloaded before the widget is destroyed. #7790
+ self.beforeunloadHandler = function() {
+ self.element.removeAttr( "autocomplete" );
+ };
+ $( window ).bind( "beforeunload", self.beforeunloadHandler );
},
destroy: function() {
@@ -225,6 +232,7 @@ $.widget( "ui.autocomplete", {
.removeAttr( "aria-autocomplete" )
.removeAttr( "aria-haspopup" );
this.menu.element.remove();
+ $( window ).unbind( "beforeunload", this.beforeunloadHandler );
$.Widget.prototype.destroy.call( this );
},
@@ -375,7 +383,9 @@ $.widget( "ui.autocomplete", {
_resizeMenu: function() {
var ul = this.menu.element;
ul.outerWidth( Math.max(
- ul.width( "" ).outerWidth(),
+ // Firefox wraps long text (possibly a rounding bug)
+ // so we add 1px to avoid the wrapping (#7513)
+ ul.width( "" ).outerWidth() + 1,
this.element.outerWidth()
) );
},
diff --git a/resources/jquery.ui/jquery.ui.button.js b/resources/jquery.ui/jquery.ui.button.js
index 9a70a01d..94dce1c3 100644
--- a/resources/jquery.ui/jquery.ui.button.js
+++ b/resources/jquery.ui/jquery.ui.button.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Button 1.8.11
+ * jQuery UI Button 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -13,17 +13,15 @@
*/
(function( $, undefined ) {
-var lastActive,
+var lastActive, startXPos, startYPos, clickDragged,
baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
stateClasses = "ui-state-hover ui-state-active ",
typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
- formResetHandler = function( event ) {
- $( ":ui-button", event.target.form ).each(function() {
- var inst = $( this ).data( "button" );
- setTimeout(function() {
- inst.refresh();
- }, 1 );
- });
+ formResetHandler = function() {
+ var buttons = $( this ).find( ":ui-button" );
+ setTimeout(function() {
+ buttons.button( "refresh" );
+ }, 1 );
},
radioGroup = function( radio ) {
var name = radio.name,
@@ -58,7 +56,7 @@ $.widget( "ui.button", {
.bind( "reset.button", formResetHandler );
if ( typeof this.options.disabled !== "boolean" ) {
- this.options.disabled = this.element.attr( "disabled" );
+ this.options.disabled = this.element.propAttr( "disabled" );
}
this._determineButtonType();
@@ -96,23 +94,54 @@ $.widget( "ui.button", {
}
$( this ).removeClass( hoverClass );
})
+ .bind( "click.button", function( event ) {
+ if ( options.disabled ) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+ });
+
+ this.element
.bind( "focus.button", function() {
// no need to check disabled, focus won't be triggered anyway
- $( this ).addClass( focusClass );
+ self.buttonElement.addClass( focusClass );
})
.bind( "blur.button", function() {
- $( this ).removeClass( focusClass );
+ self.buttonElement.removeClass( focusClass );
});
if ( toggleButton ) {
this.element.bind( "change.button", function() {
+ if ( clickDragged ) {
+ return;
+ }
self.refresh();
});
+ // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+ // prevents issue where button state changes but checkbox/radio checked state
+ // does not in Firefox (see ticket #6970)
+ this.buttonElement
+ .bind( "mousedown.button", function( event ) {
+ if ( options.disabled ) {
+ return;
+ }
+ clickDragged = false;
+ startXPos = event.pageX;
+ startYPos = event.pageY;
+ })
+ .bind( "mouseup.button", function( event ) {
+ if ( options.disabled ) {
+ return;
+ }
+ if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+ clickDragged = true;
+ }
+ });
}
if ( this.type === "checkbox" ) {
this.buttonElement.bind( "click.button", function() {
- if ( options.disabled ) {
+ if ( options.disabled || clickDragged ) {
return false;
}
$( this ).toggleClass( "ui-state-active" );
@@ -120,11 +149,11 @@ $.widget( "ui.button", {
});
} else if ( this.type === "radio" ) {
this.buttonElement.bind( "click.button", function() {
- if ( options.disabled ) {
+ if ( options.disabled || clickDragged ) {
return false;
}
$( this ).addClass( "ui-state-active" );
- self.buttonElement.attr( "aria-pressed", true );
+ self.buttonElement.attr( "aria-pressed", "true" );
var radio = self.element[ 0 ];
radioGroup( radio )
@@ -133,7 +162,7 @@ $.widget( "ui.button", {
return $( this ).button( "widget" )[ 0 ];
})
.removeClass( "ui-state-active" )
- .attr( "aria-pressed", false );
+ .attr( "aria-pressed", "false" );
});
} else {
this.buttonElement
@@ -179,29 +208,26 @@ $.widget( "ui.button", {
// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
// be overridden by individual plugins
this._setOption( "disabled", options.disabled );
+ this._resetButton();
},
_determineButtonType: function() {
-
+
if ( this.element.is(":checkbox") ) {
this.type = "checkbox";
+ } else if ( this.element.is(":radio") ) {
+ this.type = "radio";
+ } else if ( this.element.is("input") ) {
+ this.type = "input";
} else {
- if ( this.element.is(":radio") ) {
- this.type = "radio";
- } else {
- if ( this.element.is("input") ) {
- this.type = "input";
- } else {
- this.type = "button";
- }
- }
+ this.type = "button";
}
-
+
if ( this.type === "checkbox" || this.type === "radio" ) {
// we don't search against the document in case the element
// is disconnected from the DOM
var ancestor = this.element.parents().filter(":last"),
- labelSelector = "label[for=" + this.element.attr("id") + "]";
+ labelSelector = "label[for='" + this.element.attr("id") + "']";
this.buttonElement = ancestor.find( labelSelector );
if ( !this.buttonElement.length ) {
ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
@@ -246,10 +272,11 @@ $.widget( "ui.button", {
$.Widget.prototype._setOption.apply( this, arguments );
if ( key === "disabled" ) {
if ( value ) {
- this.element.attr( "disabled", true );
+ this.element.propAttr( "disabled", true );
} else {
- this.element.removeAttr( "disabled" );
+ this.element.propAttr( "disabled", false );
}
+ return;
}
this._resetButton();
},
@@ -264,22 +291,22 @@ $.widget( "ui.button", {
if ( $( this ).is( ":checked" ) ) {
$( this ).button( "widget" )
.addClass( "ui-state-active" )
- .attr( "aria-pressed", true );
+ .attr( "aria-pressed", "true" );
} else {
$( this ).button( "widget" )
.removeClass( "ui-state-active" )
- .attr( "aria-pressed", false );
+ .attr( "aria-pressed", "false" );
}
});
} else if ( this.type === "checkbox" ) {
if ( this.element.is( ":checked" ) ) {
this.buttonElement
.addClass( "ui-state-active" )
- .attr( "aria-pressed", true );
+ .attr( "aria-pressed", "true" );
} else {
this.buttonElement
.removeClass( "ui-state-active" )
- .attr( "aria-pressed", false );
+ .attr( "aria-pressed", "false" );
}
}
},
@@ -292,7 +319,7 @@ $.widget( "ui.button", {
return;
}
var buttonElement = this.buttonElement.removeClass( typeClasses ),
- buttonText = $( "<span></span>" )
+ buttonText = $( "<span></span>", this.element[0].ownerDocument )
.addClass( "ui-button-text" )
.html( this.options.label )
.appendTo( buttonElement.empty() )
@@ -350,6 +377,8 @@ $.widget( "ui.buttonset", {
},
refresh: function() {
+ var rtl = this.element.css( "direction" ) === "rtl";
+
this.buttons = this.element.find( this.options.items )
.filter( ":ui-button" )
.button( "refresh" )
@@ -362,10 +391,10 @@ $.widget( "ui.buttonset", {
})
.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
.filter( ":first" )
- .addClass( "ui-corner-left" )
+ .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
.end()
.filter( ":last" )
- .addClass( "ui-corner-right" )
+ .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
.end()
.end();
},
diff --git a/resources/jquery.ui/jquery.ui.core.js b/resources/jquery.ui/jquery.ui.core.js
index 4589a47e..6d82ff13 100644
--- a/resources/jquery.ui/jquery.ui.core.js
+++ b/resources/jquery.ui/jquery.ui.core.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI 1.8.11
+ * jQuery UI 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -18,7 +18,7 @@ if ( $.ui.version ) {
}
$.extend( $.ui, {
- version: "1.8.11",
+ version: "1.8.17",
keyCode: {
ALT: 18,
@@ -58,6 +58,8 @@ $.extend( $.ui, {
// plugins
$.fn.extend({
+ propAttr: $.fn.prop || $.fn.attr,
+
_focus: $.fn.focus,
focus: function( delay, fn ) {
return typeof delay === "number" ?
@@ -174,6 +176,27 @@ $.each( [ "Width", "Height" ], function( i, name ) {
});
// selectors
+function focusable( element, isTabIndexNotNaN ) {
+ var nodeName = element.nodeName.toLowerCase();
+ if ( "area" === nodeName ) {
+ var map = element.parentNode,
+ mapName = map.name,
+ img;
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+ return false;
+ }
+ img = $( "img[usemap=#" + mapName + "]" )[0];
+ return !!img && visible( img );
+ }
+ return ( /input|select|textarea|button|object/.test( nodeName )
+ ? !element.disabled
+ : "a" == nodeName
+ ? element.href || isTabIndexNotNaN
+ : isTabIndexNotNaN)
+ // the element and all of its ancestors must be visible
+ && visible( element );
+}
+
function visible( element ) {
return !$( element ).parents().andSelf().filter(function() {
return $.curCSS( this, "visibility" ) === "hidden" ||
@@ -187,30 +210,13 @@ $.extend( $.expr[ ":" ], {
},
focusable: function( element ) {
- var nodeName = element.nodeName.toLowerCase(),
- tabIndex = $.attr( element, "tabindex" );
- if ( "area" === nodeName ) {
- var map = element.parentNode,
- mapName = map.name,
- img;
- if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
- return false;
- }
- img = $( "img[usemap=#" + mapName + "]" )[0];
- return !!img && visible( img );
- }
- return ( /input|select|textarea|button|object/.test( nodeName )
- ? !element.disabled
- : "a" == nodeName
- ? element.href || !isNaN( tabIndex )
- : !isNaN( tabIndex ))
- // the element and all of its ancestors must be visible
- && visible( element );
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
},
tabbable: function( element ) {
- var tabIndex = $.attr( element, "tabindex" );
- return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" );
+ var tabIndex = $.attr( element, "tabindex" ),
+ isTabIndexNaN = isNaN( tabIndex );
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
}
});
diff --git a/resources/jquery.ui/jquery.ui.datepicker.js b/resources/jquery.ui/jquery.ui.datepicker.js
index cad1d58c..bbf59175 100644
--- a/resources/jquery.ui/jquery.ui.datepicker.js
+++ b/resources/jquery.ui/jquery.ui.datepicker.js
@@ -1,22 +1,22 @@
/*
- * jQuery UI Datepicker 1.8.2
+ * jQuery UI Datepicker 1.8.17
*
- * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
*
* http://docs.jquery.com/UI/Datepicker
*
* Depends:
* jquery.ui.core.js
*/
+(function( $, undefined ) {
-(function($) { // hide the namespace
-
-$.extend($.ui, { datepicker: { version: "1.8.2" } });
+$.extend($.ui, { datepicker: { version: "1.8.17" } });
var PROP_NAME = 'datepicker';
var dpuuid = new Date().getTime();
+var instActive;
/* Date picker manager.
Use the singleton instance of this class, $.datepicker, to interact with the date picker.
@@ -105,15 +105,19 @@ function Datepicker() {
altFormat: '', // The date format to use for the alternate field
constrainInput: true, // The input is constrained by the current date format
showButtonPanel: false, // True to show button panel, false to not show it
- autoSize: false // True to size the input for the date format, false to leave as is
+ autoSize: false, // True to size the input for the date format, false to leave as is
+ disabled: false // The initial disabled state
};
$.extend(this._defaults, this.regional['']);
- this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>');
+ this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
}
$.extend(Datepicker.prototype, {
/* Class name added to elements to indicate already configured with a date picker. */
markerClassName: 'hasDatepicker',
+
+ //Keep track of the maximum number of rows displayed (see #7043)
+ maxRows: 4,
/* Debug logging (if enabled). */
log: function () {
@@ -168,13 +172,13 @@ $.extend(Datepicker.prototype, {
/* Create a new instance object. */
_newInst: function(target, inline) {
- var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\$1'); // escape jQuery meta chars
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
return {id: id, input: target, // associated target
selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
drawMonth: 0, drawYear: 0, // month being drawn
inline: inline, // is datepicker inline or not
dpDiv: (!inline ? this.dpDiv : // presentation div
- $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
+ bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
},
/* Attach the date picker to an input field. */
@@ -194,6 +198,10 @@ $.extend(Datepicker.prototype, {
});
this._autoSize(inst);
$.data(target, PROP_NAME, inst);
+ //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
},
/* Make attachments based on settings. */
@@ -273,6 +281,13 @@ $.extend(Datepicker.prototype, {
this._setDate(inst, this._getDefaultDate(inst), true);
this._updateDatepicker(inst);
this._updateAlternate(inst);
+ //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+ // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+ inst.dpDiv.css( "display", "block" );
},
/* Pop-up the date picker in a "dialog" box.
@@ -363,6 +378,8 @@ $.extend(Datepicker.prototype, {
else if (nodeName == 'div' || nodeName == 'span') {
var inline = $target.children('.' + this._inlineClass);
inline.children().removeClass('ui-state-disabled');
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ removeAttr("disabled");
}
this._disabledInputs = $.map(this._disabledInputs,
function(value) { return (value == target ? null : value); }); // delete entry
@@ -386,6 +403,8 @@ $.extend(Datepicker.prototype, {
else if (nodeName == 'div' || nodeName == 'span') {
var inline = $target.children('.' + this._inlineClass);
inline.children().addClass('ui-state-disabled');
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ attr("disabled", "disabled");
}
this._disabledInputs = $.map(this._disabledInputs,
function(value) { return (value == target ? null : value); }); // delete entry
@@ -444,10 +463,18 @@ $.extend(Datepicker.prototype, {
this._hideDatepicker();
}
var date = this._getDateDatepicker(target, true);
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
extendRemove(inst.settings, settings);
+ // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+ if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
+ inst.settings.minDate = this._formatDate(inst, minDate);
+ if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
+ inst.settings.maxDate = this._formatDate(inst, maxDate);
this._attachments($(target), inst);
this._autoSize(inst);
- this._setDateDatepicker(target, date);
+ this._setDate(inst, date);
+ this._updateAlternate(inst);
this._updateDatepicker(inst);
}
},
@@ -500,10 +527,17 @@ $.extend(Datepicker.prototype, {
case 9: $.datepicker._hideDatepicker();
handled = false;
break; // hide on tab out
- case 13: var sel = $('td.' + $.datepicker._dayOverClass, inst.dpDiv).
- add($('td.' + $.datepicker._currentClass, inst.dpDiv));
+ case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
+ $.datepicker._currentClass + ')', inst.dpDiv);
if (sel[0])
$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+ var onSelect = $.datepicker._get(inst, 'onSelect');
+ if (onSelect) {
+ var dateStr = $.datepicker._formatDate(inst);
+
+ // trigger custom callback
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+ }
else
$.datepicker._hideDatepicker();
return false; // don't submit the form
@@ -565,7 +599,7 @@ $.extend(Datepicker.prototype, {
if ($.datepicker._get(inst, 'constrainInput')) {
var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
- return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+ return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
}
},
@@ -591,6 +625,7 @@ $.extend(Datepicker.prototype, {
},
/* Pop-up the date picker for a given input field.
+ If false returned from beforeShow event handler do not show.
@param input element - the input field attached to the date picker or
event - if triggered by focus */
_showDatepicker: function(input) {
@@ -602,9 +637,17 @@ $.extend(Datepicker.prototype, {
var inst = $.datepicker._getInst(input);
if ($.datepicker._curInst && $.datepicker._curInst != inst) {
$.datepicker._curInst.dpDiv.stop(true, true);
+ if ( inst && $.datepicker._datepickerShowing ) {
+ $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
+ }
}
var beforeShow = $.datepicker._get(inst, 'beforeShow');
- extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+ if(beforeShowSettings === false){
+ //false
+ return;
+ }
+ extendRemove(inst.settings, beforeShowSettings);
inst.lastVal = null;
$.datepicker._lastInput = input;
$.datepicker._setDateFromField(inst);
@@ -625,6 +668,8 @@ $.extend(Datepicker.prototype, {
}
var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
$.datepicker._pos = null;
+ //to avoid flashes on Firefox
+ inst.dpDiv.empty();
// determine sizing offscreen
inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
$.datepicker._updateDatepicker(inst);
@@ -638,13 +683,15 @@ $.extend(Datepicker.prototype, {
var showAnim = $.datepicker._get(inst, 'showAnim');
var duration = $.datepicker._get(inst, 'duration');
var postProcess = function() {
- $.datepicker._datepickerShowing = true;
- var borders = $.datepicker._getBorders(inst.dpDiv);
- inst.dpDiv.find('iframe.ui-datepicker-cover'). // IE6- only
- css({left: -borders[0], top: -borders[1],
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !! cover.length ){
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ cover.css({left: -borders[0], top: -borders[1],
width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+ }
};
inst.dpDiv.zIndex($(input).zIndex()+1);
+ $.datepicker._datepickerShowing = true;
if ($.effects && $.effects[showAnim])
inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
else
@@ -660,44 +707,41 @@ $.extend(Datepicker.prototype, {
/* Generate the date picker content. */
_updateDatepicker: function(inst) {
var self = this;
+ self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
var borders = $.datepicker._getBorders(inst.dpDiv);
- inst.dpDiv.empty().append(this._generateHTML(inst))
- .find('iframe.ui-datepicker-cover') // IE6- only
- .css({left: -borders[0], top: -borders[1],
- width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
- .end()
- .find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
- .bind('mouseout', function(){
- $(this).removeClass('ui-state-hover');
- if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
- if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
- })
- .bind('mouseover', function(){
- if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
- $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
- $(this).addClass('ui-state-hover');
- if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
- if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
- }
- })
- .end()
- .find('.' + this._dayOverClass + ' a')
- .trigger('mouseover')
- .end();
+ instActive = inst; // for delegate hover events
+ inst.dpDiv.empty().append(this._generateHTML(inst));
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+ cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+ }
+ inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
var numMonths = this._getNumberOfMonths(inst);
var cols = numMonths[1];
var width = 17;
+ inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
if (cols > 1)
inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
- else
- inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
'Class']('ui-datepicker-multi');
inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
'Class']('ui-datepicker-rtl');
if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
- inst.input.is(':visible') && !inst.input.is(':disabled'))
+ // #6694 - don't focus the input if it's already focused
+ // this breaks the change event in IE
+ inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
inst.input.focus();
+ // deffered render of the years select (to avoid flashes on Firefox)
+ if( inst.yearshtml ){
+ var origyearshtml = inst.yearshtml;
+ setTimeout(function(){
+ //assure that inst.yearshtml didn't change.
+ if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+ inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+ }
+ origyearshtml = inst.yearshtml = null;
+ }, 0);
+ }
},
/* Retrieve the size of left and top borders for an element.
@@ -737,7 +781,7 @@ $.extend(Datepicker.prototype, {
_findPos: function(obj) {
var inst = this._getInst(obj);
var isRTL = this._get(inst, 'isRTL');
- while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
}
var position = $(obj).offset();
@@ -753,9 +797,10 @@ $.extend(Datepicker.prototype, {
if (this._datepickerShowing) {
var showAnim = this._get(inst, 'showAnim');
var duration = this._get(inst, 'duration');
+ var self = this;
var postProcess = function() {
$.datepicker._tidyDialog(inst);
- this._curInst = null;
+ self._curInst = null;
};
if ($.effects && $.effects[showAnim])
inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
@@ -764,11 +809,11 @@ $.extend(Datepicker.prototype, {
(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
if (!showAnim)
postProcess();
+ this._datepickerShowing = false;
var onClose = this._get(inst, 'onClose');
if (onClose)
onClose.apply((inst.input ? inst.input[0] : null),
- [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
- this._datepickerShowing = false;
+ [(inst.input ? inst.input.val() : ''), inst]);
this._lastInput = null;
if (this._inDialog) {
this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
@@ -790,12 +835,16 @@ $.extend(Datepicker.prototype, {
_checkExternalClick: function(event) {
if (!$.datepicker._curInst)
return;
- var $target = $(event.target);
- if ($target[0].id != $.datepicker._mainDivId &&
+
+ var $target = $(event.target),
+ inst = $.datepicker._getInst($target[0]);
+
+ if ( ( ( $target[0].id != $.datepicker._mainDivId &&
$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
!$target.hasClass($.datepicker.markerClassName) &&
!$target.hasClass($.datepicker._triggerClass) &&
- $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
+ ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
$.datepicker._hideDatepicker();
},
@@ -835,7 +884,6 @@ $.extend(Datepicker.prototype, {
_selectMonthYear: function(id, select, period) {
var target = $(id);
var inst = this._getInst(target[0]);
- inst._selectingMonthYear = false;
inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
parseInt(select.options[select.selectedIndex].value,10);
@@ -843,15 +891,6 @@ $.extend(Datepicker.prototype, {
this._adjustDate(target);
},
- /* Restore input focus after not changing month/year. */
- _clickMonthYear: function(id) {
- var target = $(id);
- var inst = this._getInst(target[0]);
- if (inst.input && inst._selectingMonthYear && !$.browser.msie)
- inst.input.focus();
- inst._selectingMonthYear = !inst._selectingMonthYear;
- },
-
/* Action for selecting a day. */
_selectDay: function(id, month, year, td) {
var target = $(id);
@@ -948,6 +987,8 @@ $.extend(Datepicker.prototype, {
if (value == '')
return null;
var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
@@ -966,9 +1007,9 @@ $.extend(Datepicker.prototype, {
};
// Extract a number from the string value
var getNumber = function(match) {
- lookAhead(match);
+ var isDoubled = lookAhead(match);
var size = (match == '@' ? 14 : (match == '!' ? 20 :
- (match == 'y' ? 4 : (match == 'o' ? 3 : 2))));
+ (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
var digits = new RegExp('^\\d{1,' + size + '}');
var num = value.substring(iValue).match(digits);
if (!num)
@@ -978,14 +1019,24 @@ $.extend(Datepicker.prototype, {
};
// Extract a name from the string value and convert to an index
var getName = function(match, shortNames, longNames) {
- var names = (lookAhead(match) ? longNames : shortNames);
- for (var i = 0; i < names.length; i++) {
- if (value.substr(iValue, names[i].length) == names[i]) {
- iValue += names[i].length;
- return i + 1;
+ var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+ return [ [k, v] ];
+ }).sort(function (a, b) {
+ return -(a[1].length - b[1].length);
+ });
+ var index = -1;
+ $.each(names, function (i, pair) {
+ var name = pair[1];
+ if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
+ index = pair[0];
+ iValue += name.length;
+ return false;
}
- }
- throw 'Unknown name at position ' + iValue;
+ });
+ if (index != -1)
+ return index + 1;
+ else
+ throw 'Unknown name at position ' + iValue;
};
// Confirm that a literal character matches the string value
var checkLiteral = function() {
@@ -1042,6 +1093,9 @@ $.extend(Datepicker.prototype, {
checkLiteral();
}
}
+ if (iValue < value.length){
+ throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+ }
if (year == -1)
year = new Date().getFullYear();
else if (year < 100)
@@ -1060,7 +1114,7 @@ $.extend(Datepicker.prototype, {
}
var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
- throw 'Invalid date'; // E.g. 31/02/*
+ throw 'Invalid date'; // E.g. 31/02/00
return date;
},
@@ -1153,7 +1207,7 @@ $.extend(Datepicker.prototype, {
break;
case 'o':
output += formatNumber('o',
- (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
+ Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
break;
case 'm':
output += formatNumber('m', date.getMonth() + 1, 2);
@@ -1298,16 +1352,16 @@ $.extend(Datepicker.prototype, {
}
return new Date(year, month, day);
};
- date = (date == null ? defaultDate : (typeof date == 'string' ? offsetString(date) :
- (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date)));
- date = (date && date.toString() == 'Invalid Date' ? defaultDate : date);
- if (date) {
- date.setHours(0);
- date.setMinutes(0);
- date.setSeconds(0);
- date.setMilliseconds(0);
+ var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+ (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+ newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+ if (newDate) {
+ newDate.setHours(0);
+ newDate.setMinutes(0);
+ newDate.setSeconds(0);
+ newDate.setMilliseconds(0);
}
- return this._daylightSavingAdjust(date);
+ return this._daylightSavingAdjust(newDate);
},
/* Handle switch to/from daylight saving.
@@ -1324,13 +1378,13 @@ $.extend(Datepicker.prototype, {
/* Set the date(s) directly. */
_setDate: function(inst, date, noChange) {
- var clear = !(date);
+ var clear = !date;
var origMonth = inst.selectedMonth;
var origYear = inst.selectedYear;
- date = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
- inst.selectedDay = inst.currentDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear();
+ var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+ inst.selectedDay = inst.currentDay = newDate.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
this._notifyChange(inst);
this._adjustInstDate(inst);
@@ -1428,6 +1482,7 @@ $.extend(Datepicker.prototype, {
var html = '';
for (var row = 0; row < numMonths[0]; row++) {
var group = '';
+ this.maxRows = 4;
for (var col = 0; col < numMonths[1]; col++) {
var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
var cornerClass = ' ui-corner-all';
@@ -1462,7 +1517,9 @@ $.extend(Datepicker.prototype, {
if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
- var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
+ var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
+ var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
+ this.maxRows = numRows;
var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
calender += '<tr>';
@@ -1532,7 +1589,6 @@ $.extend(Datepicker.prototype, {
var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
monthHtml += '<select class="ui-datepicker-month" ' +
'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
- 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
'>';
for (var month = 0; month < 12; month++) {
if ((!inMinYear || month >= minDate.getMonth()) &&
@@ -1546,32 +1602,37 @@ $.extend(Datepicker.prototype, {
if (!showMonthAfterYear)
html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
// year selection
- if (secondary || !changeYear)
- html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
- else {
- // determine range of years to display
- var years = this._get(inst, 'yearRange').split(':');
- var thisYear = new Date().getFullYear();
- var determineYear = function(value) {
- var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
- (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
- parseInt(value, 10)));
- return (isNaN(year) ? thisYear : year);
- };
- var year = determineYear(years[0]);
- var endYear = Math.max(year, determineYear(years[1] || ''));
- year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
- endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
- html += '<select class="ui-datepicker-year" ' +
- 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
- 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
- '>';
- for (; year <= endYear; year++) {
- html += '<option value="' + year + '"' +
- (year == drawYear ? ' selected="selected"' : '') +
- '>' + year + '</option>';
+ if ( !inst.yearshtml ) {
+ inst.yearshtml = '';
+ if (secondary || !changeYear)
+ html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+ else {
+ // determine range of years to display
+ var years = this._get(inst, 'yearRange').split(':');
+ var thisYear = new Date().getFullYear();
+ var determineYear = function(value) {
+ var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ var year = determineYear(years[0]);
+ var endYear = Math.max(year, determineYear(years[1] || ''));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ inst.yearshtml += '<select class="ui-datepicker-year" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+ '>';
+ for (; year <= endYear; year++) {
+ inst.yearshtml += '<option value="' + year + '"' +
+ (year == drawYear ? ' selected="selected"' : '') +
+ '>' + year + '</option>';
+ }
+ inst.yearshtml += '</select>';
+
+ html += inst.yearshtml;
+ inst.yearshtml = null;
}
- html += '</select>';
}
html += this._get(inst, 'yearSuffix');
if (showMonthAfterYear)
@@ -1599,9 +1660,9 @@ $.extend(Datepicker.prototype, {
_restrictMinMax: function(inst, date) {
var minDate = this._getMinMaxDate(inst, 'min');
var maxDate = this._getMinMaxDate(inst, 'max');
- date = (minDate && date < minDate ? minDate : date);
- date = (maxDate && date > maxDate ? maxDate : date);
- return date;
+ var newDate = (minDate && date < minDate ? minDate : date);
+ newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+ return newDate;
},
/* Notify change of month/year. */
@@ -1625,7 +1686,7 @@ $.extend(Datepicker.prototype, {
/* Find the number of days in a given month. */
_getDaysInMonth: function(year, month) {
- return 32 - new Date(year, month, 32).getDate();
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
},
/* Find the day of the week of the first of a month. */
@@ -1675,6 +1736,33 @@ $.extend(Datepicker.prototype, {
}
});
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */
+function bindHover(dpDiv) {
+ var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
+ return dpDiv.bind('mouseout', function(event) {
+ var elem = $( event.target ).closest( selector );
+ if ( !elem.length ) {
+ return;
+ }
+ elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+ })
+ .bind('mouseover', function(event) {
+ var elem = $( event.target ).closest( selector );
+ if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
+ !elem.length ) {
+ return;
+ }
+ elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+ elem.addClass('ui-state-hover');
+ if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
+ if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
+ });
+}
+
/* jQuery extend now ignores nulls! */
function extendRemove(target, props) {
$.extend(target, props);
@@ -1695,7 +1783,12 @@ function isArray(a) {
Object - settings for attaching new datepicker functionality
@return jQuery object */
$.fn.datepicker = function(options){
-
+
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
+ if ( !this.length ) {
+ return this;
+ }
+
/* Initialise the date picker. */
if (!$.datepicker.initialized) {
$(document).mousedown($.datepicker._checkExternalClick).
@@ -1721,7 +1814,7 @@ $.fn.datepicker = function(options){
$.datepicker = new Datepicker(); // singleton instance
$.datepicker.initialized = false;
$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.2";
+$.datepicker.version = "1.8.17";
// Workaround for #4055
// Add another global to avoid noConflict issues with inline event handlers
diff --git a/resources/jquery.ui/jquery.ui.dialog.js b/resources/jquery.ui/jquery.ui.dialog.js
index f0656a2f..33119af2 100644
--- a/resources/jquery.ui/jquery.ui.dialog.js
+++ b/resources/jquery.ui/jquery.ui.dialog.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Dialog 1.8.11
+ * jQuery UI Dialog 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -37,6 +37,18 @@ var uiDialogClasses =
maxWidth: true,
minHeight: true,
minWidth: true
+ },
+ // support for jQuery 1.3.2 - handle common attrFn methods for dialog
+ attrFn = $.attrFn || {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true,
+ click: true
};
$.widget("ui.dialog", {
@@ -98,7 +110,7 @@ $.widget("ui.dialog", {
// setting tabIndex makes the div focusable
// setting outline to 0 prevents a border on focus in Mozilla
.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
- if (options.closeOnEscape && event.keyCode &&
+ if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE) {
self.close(event);
@@ -294,7 +306,7 @@ $.widget("ui.dialog", {
//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
// http://ui.jquery.com/bugs/ticket/3193
- saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
+ saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
$.ui.dialog.maxZ += 1;
self.uiDialog.css('z-index', $.ui.dialog.maxZ);
self.element.attr(saveScroll);
@@ -317,9 +329,9 @@ $.widget("ui.dialog", {
self.moveToTop(true);
// prevent tabbing out of modal dialogs
- if (options.modal) {
- uiDialog.bind('keypress.ui-dialog', function(event) {
- if (event.keyCode !== $.ui.keyCode.TAB) {
+ if ( options.modal ) {
+ uiDialog.bind( "keydown.ui-dialog", function( event ) {
+ if ( event.keyCode !== $.ui.keyCode.TAB ) {
return;
}
@@ -376,12 +388,21 @@ $.widget("ui.dialog", {
{ click: props, text: name } :
props;
var button = $('<button type="button"></button>')
- .attr( props, true )
- .unbind('click')
.click(function() {
props.click.apply(self.element[0], arguments);
})
.appendTo(uiButtonSet);
+ // can't use .attr( props, true ) with jQuery 1.3.2.
+ $.each( props, function( key, value ) {
+ if ( key === "click" ) {
+ return;
+ }
+ if ( key in attrFn ) {
+ button[ key ]( value );
+ } else {
+ button.attr( key, value );
+ }
+ });
if ($.fn.button) {
button.button();
}
@@ -681,7 +702,7 @@ $.widget("ui.dialog", {
});
$.extend($.ui.dialog, {
- version: "1.8.11",
+ version: "1.8.17",
uuid: 0,
maxZ: 0,
@@ -727,7 +748,7 @@ $.extend($.ui.dialog.overlay, {
// allow closing by pressing the escape key
$(document).bind('keydown.dialog-overlay', function(event) {
- if (dialog.options.closeOnEscape && event.keyCode &&
+ if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
event.keyCode === $.ui.keyCode.ESCAPE) {
dialog.close(event);
@@ -802,8 +823,8 @@ $.extend($.ui.dialog.overlay, {
width: function() {
var scrollWidth,
offsetWidth;
- // handle IE 6
- if ($.browser.msie && $.browser.version < 7) {
+ // handle IE
+ if ( $.browser.msie ) {
scrollWidth = Math.max(
document.documentElement.scrollWidth,
document.body.scrollWidth
diff --git a/resources/jquery.ui/jquery.ui.draggable.js b/resources/jquery.ui/jquery.ui.draggable.js
index 5f367616..41aba9d6 100644
--- a/resources/jquery.ui/jquery.ui.draggable.js
+++ b/resources/jquery.ui/jquery.ui.draggable.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Draggable 1.8.11
+ * jQuery UI Draggable 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -79,6 +79,18 @@ $.widget("ui.draggable", $.ui.mouse, {
this.handle = this._getHandle(event);
if (!this.handle)
return false;
+
+ if ( o.iframeFix ) {
+ $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+ $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+ .css({
+ width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+ position: "absolute", opacity: "0.001", zIndex: 1000
+ })
+ .css($(this).offset())
+ .appendTo("body");
+ });
+ }
return true;
@@ -153,6 +165,10 @@ $.widget("ui.draggable", $.ui.mouse, {
this.helper.addClass("ui-draggable-dragging");
this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+ if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
+
return true;
},
@@ -212,6 +228,19 @@ $.widget("ui.draggable", $.ui.mouse, {
return false;
},
+ _mouseUp: function(event) {
+ if (this.options.iframeFix === true) {
+ $("div.ui-draggable-iframeFix").each(function() {
+ this.parentNode.removeChild(this);
+ }); //Remove frame helpers
+ }
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+ if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
+
+ return $.ui.mouse.prototype._mouseUp.call(this, event);
+ },
+
cancel: function() {
if(this.helper.is(".ui-draggable-dragging")) {
@@ -241,7 +270,7 @@ $.widget("ui.draggable", $.ui.mouse, {
_createHelper: function(event) {
var o = this.options;
- var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
if(!helper.parents('body').length)
helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
@@ -335,23 +364,26 @@ $.widget("ui.draggable", $.ui.mouse, {
var o = this.options;
if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
if(o.containment == 'document' || o.containment == 'window') this.containment = [
- (o.containment == 'document' ? 0 : $(window).scrollLeft()) - this.offset.relative.left - this.offset.parent.left,
- (o.containment == 'document' ? 0 : $(window).scrollTop()) - this.offset.relative.top - this.offset.parent.top,
+ o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+ o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
];
if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
- var ce = $(o.containment)[0]; if(!ce) return;
- var co = $(o.containment).offset();
+ var c = $(o.containment);
+ var ce = c[0]; if(!ce) return;
+ var co = c.offset();
var over = ($(ce).css("overflow") != 'hidden');
this.containment = [
- co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
- co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
- co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
- co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom
+ (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
+ (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
+ (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
+ (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom
];
+ this.relative_container = c;
+
} else if(o.containment.constructor == Array) {
this.containment = o.containment;
}
@@ -393,20 +425,32 @@ $.widget("ui.draggable", $.ui.mouse, {
*/
if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-
- if(this.containment) {
- if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
- if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
- if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
- if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ var containment;
+ if(this.containment) {
+ if (this.relative_container){
+ var co = this.relative_container.offset();
+ containment = [ this.containment[0] + co.left,
+ this.containment[1] + co.top,
+ this.containment[2] + co.left,
+ this.containment[3] + co.top ];
+ }
+ else {
+ containment = this.containment;
+ }
+
+ if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
}
if(o.grid) {
- var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
- pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+ //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+ var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+ pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
- var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
- pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+ pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
}
}
@@ -461,7 +505,7 @@ $.widget("ui.draggable", $.ui.mouse, {
});
$.extend($.ui.draggable, {
- version: "1.8.11"
+ version: "1.8.17"
});
$.ui.plugin.add("draggable", "connectToSortable", {
@@ -546,7 +590,7 @@ $.ui.plugin.add("draggable", "connectToSortable", {
//Now we fake the start of dragging for the sortable instance,
//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
- this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
+ this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
this.instance.options.helper = function() { return ui.helper[0]; };
@@ -616,24 +660,6 @@ $.ui.plugin.add("draggable", "cursor", {
}
});
-$.ui.plugin.add("draggable", "iframeFix", {
- start: function(event, ui) {
- var o = $(this).data('draggable').options;
- $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
- $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
- .css({
- width: this.offsetWidth+"px", height: this.offsetHeight+"px",
- position: "absolute", opacity: "0.001", zIndex: 1000
- })
- .css($(this).offset())
- .appendTo("body");
- });
- },
- stop: function(event, ui) {
- $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
- }
-});
-
$.ui.plugin.add("draggable", "opacity", {
start: function(event, ui) {
var t = $(ui.helper), o = $(this).data('draggable').options;
diff --git a/resources/jquery.ui/jquery.ui.droppable.js b/resources/jquery.ui/jquery.ui.droppable.js
index 7d6b8975..afce00aa 100644
--- a/resources/jquery.ui/jquery.ui.droppable.js
+++ b/resources/jquery.ui/jquery.ui.droppable.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Droppable 1.8.11
+ * jQuery UI Droppable 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -147,7 +147,7 @@ $.widget("ui.droppable", {
});
$.extend($.ui.droppable, {
- version: "1.8.11"
+ version: "1.8.17"
});
$.ui.intersect = function(draggable, droppable, toleranceMode) {
@@ -227,7 +227,7 @@ $.ui.ddmanager = {
if(!this.options) return;
if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
- dropped = dropped || this._drop.call(this, event);
+ dropped = this._drop.call(this, event) || dropped;
if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
this.isout = 1; this.isover = 0;
@@ -238,6 +238,12 @@ $.ui.ddmanager = {
return dropped;
},
+ dragStart: function( draggable, event ) {
+ //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+ draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+ if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+ });
+ },
drag: function(draggable, event) {
//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
@@ -279,6 +285,11 @@ $.ui.ddmanager = {
}
});
+ },
+ dragStop: function( draggable, event ) {
+ draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+ //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+ if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
}
};
diff --git a/resources/jquery.ui/jquery.ui.mouse.js b/resources/jquery.ui/jquery.ui.mouse.js
index b8db85ce..6bb65de0 100644
--- a/resources/jquery.ui/jquery.ui.mouse.js
+++ b/resources/jquery.ui/jquery.ui.mouse.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Mouse 1.8.11
+ * jQuery UI Mouse 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -12,6 +12,11 @@
*/
(function( $, undefined ) {
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+ mouseHandled = false;
+});
+
$.widget("ui.mouse", {
options: {
cancel: ':input,option',
@@ -44,9 +49,7 @@ $.widget("ui.mouse", {
_mouseDown: function(event) {
// don't let more than one widget handle mouseStart
- // TODO: figure out why we have to use originalEvent
- event.originalEvent = event.originalEvent || {};
- if (event.originalEvent.mouseHandled) { return; }
+ if( mouseHandled ) { return };
// we may have missed mouseup (out of window)
(this._mouseStarted && this._mouseUp(event));
@@ -55,7 +58,9 @@ $.widget("ui.mouse", {
var self = this,
btnIsLeft = (event.which == 1),
- elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
+ // event.target.nodeName works around a bug in IE 8 with
+ // disabled inputs (#7620)
+ elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
return true;
}
@@ -92,7 +97,8 @@ $.widget("ui.mouse", {
.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
event.preventDefault();
- event.originalEvent.mouseHandled = true;
+
+ mouseHandled = true;
return true;
},
diff --git a/resources/jquery.ui/jquery.ui.position.js b/resources/jquery.ui/jquery.ui.position.js
index b66e59ef..8eb30f62 100644
--- a/resources/jquery.ui/jquery.ui.position.js
+++ b/resources/jquery.ui/jquery.ui.position.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Position 1.8.11
+ * jQuery UI Position 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -14,6 +14,7 @@ $.ui = $.ui || {};
var horizontalPositions = /left|center|right/,
verticalPositions = /top|center|bottom/,
center = "center",
+ support = {},
_position = $.fn.position,
_offset = $.fn.offset;
@@ -121,9 +122,11 @@ $.fn.position = function( options ) {
position.top -= elemHeight / 2;
}
- // prevent fractions (see #5280)
- position.left = Math.round( position.left );
- position.top = Math.round( position.top );
+ // prevent fractions if jQuery version doesn't support them (see #5280)
+ if ( !support.fractions ) {
+ position.left = Math.round( position.left );
+ position.top = Math.round( position.top );
+ }
collisionPosition = {
left: position.left - marginLeft,
@@ -249,4 +252,47 @@ if ( !$.offset.setOffset ) {
};
}
+// fraction support test (older versions of jQuery don't support fractions)
+(function () {
+ var body = document.getElementsByTagName( "body" )[ 0 ],
+ div = document.createElement( "div" ),
+ testElement, testElementParent, testElementStyle, offset, offsetTotal;
+
+ //Create a "fake body" for testing based on method used in jQuery.support
+ testElement = document.createElement( body ? "div" : "body" );
+ testElementStyle = {
+ visibility: "hidden",
+ width: 0,
+ height: 0,
+ border: 0,
+ margin: 0,
+ background: "none"
+ };
+ if ( body ) {
+ jQuery.extend( testElementStyle, {
+ position: "absolute",
+ left: "-1000px",
+ top: "-1000px"
+ });
+ }
+ for ( var i in testElementStyle ) {
+ testElement.style[ i ] = testElementStyle[ i ];
+ }
+ testElement.appendChild( div );
+ testElementParent = body || document.documentElement;
+ testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+ div.style.cssText = "position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;";
+
+ offset = $( div ).offset( function( _, offset ) {
+ return offset;
+ }).offset();
+
+ testElement.innerHTML = "";
+ testElementParent.removeChild( testElement );
+
+ offsetTotal = offset.top + offset.left + ( body ? 2000 : 0 );
+ support.fractions = offsetTotal > 21 && offsetTotal < 22;
+})();
+
}( jQuery ));
diff --git a/resources/jquery.ui/jquery.ui.progressbar.js b/resources/jquery.ui/jquery.ui.progressbar.js
index c432132a..27bae872 100644
--- a/resources/jquery.ui/jquery.ui.progressbar.js
+++ b/resources/jquery.ui/jquery.ui.progressbar.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Progressbar 1.8.11
+ * jQuery UI Progressbar 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -95,6 +95,7 @@ $.widget( "ui.progressbar", {
}
this.valueDiv
+ .toggle( value > this.min )
.toggleClass( "ui-corner-right", value === this.options.max )
.width( percentage.toFixed(0) + "%" );
this.element.attr( "aria-valuenow", value );
@@ -102,7 +103,7 @@ $.widget( "ui.progressbar", {
});
$.extend( $.ui.progressbar, {
- version: "1.8.11"
+ version: "1.8.17"
});
})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.resizable.js b/resources/jquery.ui/jquery.ui.resizable.js
index 1d1c906e..52b1fc4f 100644
--- a/resources/jquery.ui/jquery.ui.resizable.js
+++ b/resources/jquery.ui/jquery.ui.resizable.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Resizable 1.8.11
+ * jQuery UI Resizable 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -176,10 +176,12 @@ $.widget("ui.resizable", $.ui.mouse, {
$(this.element)
.addClass("ui-resizable-autohide")
.hover(function() {
+ if (o.disabled) return;
$(this).removeClass("ui-resizable-autohide");
self._handles.show();
},
function(){
+ if (o.disabled) return;
if (!self.resizing) {
$(this).addClass("ui-resizable-autohide");
self._handles.hide();
@@ -291,6 +293,8 @@ $.widget("ui.resizable", $.ui.mouse, {
// Calculate the attrs that will be change
var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+ // Put this in the mouseDrag handler since the user can start pressing shift while resizing
+ this._updateVirtualBoundaries(event.shiftKey);
if (this._aspectRatio || event.shiftKey)
data = this._updateRatio(data, event);
@@ -349,6 +353,32 @@ $.widget("ui.resizable", $.ui.mouse, {
},
+ _updateVirtualBoundaries: function(forceAspectRatio) {
+ var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+ b = {
+ minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+ maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+ minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+ maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+ };
+
+ if(this._aspectRatio || forceAspectRatio) {
+ // We want to create an enclosing box whose aspect ration is the requested one
+ // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+ pMinWidth = b.minHeight * this.aspectRatio;
+ pMinHeight = b.minWidth / this.aspectRatio;
+ pMaxWidth = b.maxHeight * this.aspectRatio;
+ pMaxHeight = b.maxWidth / this.aspectRatio;
+
+ if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+ if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+ if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+ if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+ }
+ this._vBoundaries = b;
+ },
+
_updateCache: function(data) {
var o = this.options;
this.offset = this.helper.offset();
@@ -362,8 +392,8 @@ $.widget("ui.resizable", $.ui.mouse, {
var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
- if (data.height) data.width = (csize.height * this.aspectRatio);
- else if (data.width) data.height = (csize.width / this.aspectRatio);
+ if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+ else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
if (a == 'sw') {
data.left = cpos.left + (csize.width - data.width);
@@ -379,7 +409,7 @@ $.widget("ui.resizable", $.ui.mouse, {
_respectSize: function(data, event) {
- var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+ var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
@@ -519,7 +549,7 @@ $.widget("ui.resizable", $.ui.mouse, {
});
$.extend($.ui.resizable, {
- version: "1.8.11"
+ version: "1.8.17"
});
/*
diff --git a/resources/jquery.ui/jquery.ui.selectable.js b/resources/jquery.ui/jquery.ui.selectable.js
index e3b91328..d790ac0d 100644
--- a/resources/jquery.ui/jquery.ui.selectable.js
+++ b/resources/jquery.ui/jquery.ui.selectable.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Selectable 1.8.11
+ * jQuery UI Selectable 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -33,6 +33,7 @@ $.widget("ui.selectable", $.ui.mouse, {
var selectees;
this.refresh = function() {
selectees = $(self.options.filter, self.element[0]);
+ selectees.addClass("ui-selectee");
selectees.each(function() {
var $this = $(this);
var pos = $this.offset();
@@ -102,7 +103,7 @@ $.widget("ui.selectable", $.ui.mouse, {
this.selectees.filter('.ui-selected').each(function() {
var selectee = $.data(this, "selectable-item");
selectee.startselected = true;
- if (!event.metaKey) {
+ if (!event.metaKey && !event.ctrlKey) {
selectee.$element.removeClass('ui-selected');
selectee.selected = false;
selectee.$element.addClass('ui-unselecting');
@@ -117,7 +118,7 @@ $.widget("ui.selectable", $.ui.mouse, {
$(event.target).parents().andSelf().each(function() {
var selectee = $.data(this, "selectable-item");
if (selectee) {
- var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+ var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
selectee.$element
.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
@@ -187,7 +188,7 @@ $.widget("ui.selectable", $.ui.mouse, {
} else {
// UNSELECT
if (selectee.selecting) {
- if (event.metaKey && selectee.startselected) {
+ if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
selectee.$element.removeClass('ui-selecting');
selectee.selecting = false;
selectee.$element.addClass('ui-selected');
@@ -206,7 +207,7 @@ $.widget("ui.selectable", $.ui.mouse, {
}
}
if (selectee.selected) {
- if (!event.metaKey && !selectee.startselected) {
+ if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
selectee.$element.removeClass('ui-selected');
selectee.selected = false;
@@ -260,7 +261,7 @@ $.widget("ui.selectable", $.ui.mouse, {
});
$.extend($.ui.selectable, {
- version: "1.8.11"
+ version: "1.8.17"
});
})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.slider.js b/resources/jquery.ui/jquery.ui.slider.js
index f02a922f..53fdc42a 100644
--- a/resources/jquery.ui/jquery.ui.slider.js
+++ b/resources/jquery.ui/jquery.ui.slider.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Slider 1.8.11
+ * jQuery UI Slider 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -36,7 +36,11 @@ $.widget( "ui.slider", $.ui.mouse, {
_create: function() {
var self = this,
- o = this.options;
+ o = this.options,
+ existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+ handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+ handleCount = ( o.values && o.values.length ) || 1,
+ handles = [];
this._keySliding = false;
this._mouseSliding = false;
@@ -50,57 +54,35 @@ $.widget( "ui.slider", $.ui.mouse, {
" ui-slider-" + this.orientation +
" ui-widget" +
" ui-widget-content" +
- " ui-corner-all" );
-
- if ( o.disabled ) {
- this.element.addClass( "ui-slider-disabled ui-disabled" );
- }
+ " ui-corner-all" +
+ ( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
this.range = $([]);
if ( o.range ) {
if ( o.range === true ) {
- this.range = $( "<div></div>" );
if ( !o.values ) {
o.values = [ this._valueMin(), this._valueMin() ];
}
if ( o.values.length && o.values.length !== 2 ) {
o.values = [ o.values[0], o.values[0] ];
}
- } else {
- this.range = $( "<div></div>" );
- }
-
- this.range
- .appendTo( this.element )
- .addClass( "ui-slider-range" );
-
- if ( o.range === "min" || o.range === "max" ) {
- this.range.addClass( "ui-slider-range-" + o.range );
}
- // note: this isn't the most fittingly semantic framework class for this element,
- // but worked best visually with a variety of themes
- this.range.addClass( "ui-widget-header" );
- }
-
- if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
- $( "<a href='#'></a>" )
+ this.range = $( "<div></div>" )
.appendTo( this.element )
- .addClass( "ui-slider-handle" );
+ .addClass( "ui-slider-range" +
+ // note: this isn't the most fittingly semantic framework class for this element,
+ // but worked best visually with a variety of themes
+ " ui-widget-header" +
+ ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
}
- if ( o.values && o.values.length ) {
- while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
- $( "<a href='#'></a>" )
- .appendTo( this.element )
- .addClass( "ui-slider-handle" );
- }
+ for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+ handles.push( handle );
}
- this.handles = $( ".ui-slider-handle", this.element )
- .addClass( "ui-state-default" +
- " ui-corner-all" );
+ this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
this.handle = this.handles.eq( 0 );
@@ -466,6 +448,7 @@ $.widget( "ui.slider", $.ui.mouse, {
this.options.value = this._trimAlignValue( newValue );
this._refreshValue();
this._change( null, 0 );
+ return;
}
return this._value();
@@ -480,6 +463,7 @@ $.widget( "ui.slider", $.ui.mouse, {
this.options.values[ index ] = this._trimAlignValue( newValue );
this._refreshValue();
this._change( null, index );
+ return;
}
if ( arguments.length ) {
@@ -518,10 +502,10 @@ $.widget( "ui.slider", $.ui.mouse, {
if ( value ) {
this.handles.filter( ".ui-state-focus" ).blur();
this.handles.removeClass( "ui-state-hover" );
- this.handles.attr( "disabled", "disabled" );
+ this.handles.propAttr( "disabled", true );
this.element.addClass( "ui-disabled" );
} else {
- this.handles.removeAttr( "disabled" );
+ this.handles.propAttr( "disabled", false );
this.element.removeClass( "ui-disabled" );
}
break;
@@ -592,7 +576,7 @@ $.widget( "ui.slider", $.ui.mouse, {
return this._valueMax();
}
var step = ( this.options.step > 0 ) ? this.options.step : 1,
- valModStep = (val - this._valueMin()) % step;
+ valModStep = (val - this._valueMin()) % step,
alignValue = val - valModStep;
if ( Math.abs(valModStep) * 2 >= step ) {
@@ -676,7 +660,7 @@ $.widget( "ui.slider", $.ui.mouse, {
});
$.extend( $.ui.slider, {
- version: "1.8.11"
+ version: "1.8.17"
});
}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.sortable.js b/resources/jquery.ui/jquery.ui.sortable.js
index 1a06dcae..26ba85f0 100644
--- a/resources/jquery.ui/jquery.ui.sortable.js
+++ b/resources/jquery.ui/jquery.ui.sortable.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Sortable 1.8.11
+ * jQuery UI Sortable 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -50,7 +50,7 @@ $.widget("ui.sortable", $.ui.mouse, {
this.refresh();
//Let's determine if the items are being displayed horizontally
- this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
+ this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
//Let's determine the parent's offset
this.offset = this.element.offset();
@@ -62,13 +62,11 @@ $.widget("ui.sortable", $.ui.mouse, {
destroy: function() {
this.element
- .removeClass("ui-sortable ui-sortable-disabled")
- .removeData("sortable")
- .unbind(".sortable");
+ .removeClass("ui-sortable ui-sortable-disabled");
this._mouseDestroy();
for ( var i = this.items.length - 1; i >= 0; i-- )
- this.items[i].item.removeData("sortable-item");
+ this.items[i].item.removeData(this.widgetName + "-item");
return this;
},
@@ -86,6 +84,7 @@ $.widget("ui.sortable", $.ui.mouse, {
},
_mouseCapture: function(event, overrideHandle) {
+ var that = this;
if (this.reverting) {
return false;
@@ -98,12 +97,12 @@ $.widget("ui.sortable", $.ui.mouse, {
//Find out if the clicked node (or one of its parents) is a actual item in this.items
var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
- if($.data(this, 'sortable-item') == self) {
+ if($.data(this, that.widgetName + '-item') == self) {
currentItem = $(this);
return false;
}
});
- if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+ if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
if(!currentItem) return false;
if(this.options.handle && !overrideHandle) {
@@ -528,7 +527,7 @@ $.widget("ui.sortable", $.ui.mouse, {
for (var i = connectWith.length - 1; i >= 0; i--){
var cur = $(connectWith[i]);
for (var j = cur.length - 1; j >= 0; j--){
- var inst = $.data(cur[j], 'sortable');
+ var inst = $.data(cur[j], this.widgetName);
if(inst && inst != this && !inst.options.disabled) {
queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
}
@@ -550,7 +549,7 @@ $.widget("ui.sortable", $.ui.mouse, {
_removeCurrentsFromItems: function() {
- var list = this.currentItem.find(":data(sortable-item)");
+ var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
for (var i=0; i < this.items.length; i++) {
@@ -576,7 +575,7 @@ $.widget("ui.sortable", $.ui.mouse, {
for (var i = connectWith.length - 1; i >= 0; i--){
var cur = $(connectWith[i]);
for (var j = cur.length - 1; j >= 0; j--){
- var inst = $.data(cur[j], 'sortable');
+ var inst = $.data(cur[j], this.widgetName);
if(inst && inst != this && !inst.options.disabled) {
queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
this.containers.push(inst);
@@ -592,7 +591,7 @@ $.widget("ui.sortable", $.ui.mouse, {
for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
var item = $(_queries[j]);
- item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+ item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
items.push({
item: item,
@@ -615,6 +614,10 @@ $.widget("ui.sortable", $.ui.mouse, {
for (var i = this.items.length - 1; i >= 0; i--){
var item = this.items[i];
+ //We ignore calculating positions of all connected containers when we're not over them
+ if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
+ continue;
+
var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
if (!fast) {
@@ -980,7 +983,7 @@ $.widget("ui.sortable", $.ui.mouse, {
// We first have to update the dom position of the actual currentItem
// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
- if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
+ if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
this._noFinalSort = null;
if(this.helper[0] == this.currentItem[0]) {
@@ -1067,7 +1070,7 @@ $.widget("ui.sortable", $.ui.mouse, {
});
$.extend($.ui.sortable, {
- version: "1.8.11"
+ version: "1.8.17"
});
})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.tabs.js b/resources/jquery.ui/jquery.ui.tabs.js
index 3be7ff49..ff7938ce 100644
--- a/resources/jquery.ui/jquery.ui.tabs.js
+++ b/resources/jquery.ui/jquery.ui.tabs.js
@@ -1,5 +1,5 @@
/*
- * jQuery UI Tabs 1.8.11
+ * jQuery UI Tabs 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -698,7 +698,7 @@ $.widget( "ui.tabs", {
});
$.extend( $.ui.tabs, {
- version: "1.8.11"
+ version: "1.8.17"
});
/*
diff --git a/resources/jquery.ui/jquery.ui.widget.js b/resources/jquery.ui/jquery.ui.widget.js
index b6b1beea..facd77b3 100644
--- a/resources/jquery.ui/jquery.ui.widget.js
+++ b/resources/jquery.ui/jquery.ui.widget.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Widget 1.8.11
+ * jQuery UI Widget 1.8.17
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -14,7 +14,10 @@ if ( $.cleanData ) {
var _cleanData = $.cleanData;
$.cleanData = function( elems ) {
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- $( elem ).triggerHandler( "remove" );
+ try {
+ $( elem ).triggerHandler( "remove" );
+ // http://bugs.jquery.com/ticket/8235
+ } catch( e ) {}
}
_cleanData( elems );
};
@@ -25,7 +28,10 @@ if ( $.cleanData ) {
if ( !keepData ) {
if ( !selector || $.filter( selector, [ this ] ).length ) {
$( "*", this ).add( [ this ] ).each(function() {
- $( this ).triggerHandler( "remove" );
+ try {
+ $( this ).triggerHandler( "remove" );
+ // http://bugs.jquery.com/ticket/8235
+ } catch( e ) {}
});
}
}
@@ -233,21 +239,25 @@ $.Widget.prototype = {
},
_trigger: function( type, event, data ) {
- var callback = this.options[ type ];
+ var prop, orig,
+ callback = this.options[ type ];
+ data = data || {};
event = $.Event( event );
event.type = ( type === this.widgetEventPrefix ?
type :
this.widgetEventPrefix + type ).toLowerCase();
- data = data || {};
+ // the original event may come from any element
+ // so we need to reset the target on the new event
+ event.target = this.element[ 0 ];
// copy original event properties over to the new event
- // this would happen if we could call $.event.fix instead of $.Event
- // but we don't have a way to force an event to be fixed multiple times
- if ( event.originalEvent ) {
- for ( var i = $.event.props.length, prop; i; ) {
- prop = $.event.props[ --i ];
- event[ prop ] = event.originalEvent[ prop ];
+ orig = event.originalEvent;
+ if ( orig ) {
+ for ( prop in orig ) {
+ if ( !( prop in event ) ) {
+ event[ prop ] = orig[ prop ];
+ }
}
}
diff --git a/resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gif b/resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gif
deleted file mode 100644
index 085ccaec..00000000
--- a/resources/jquery.ui/themes/default/images/ui-anim_basic_16x16.gif
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.png
deleted file mode 100644
index 062f5807..00000000
--- a/resources/jquery.ui/themes/default/images/ui-bg_flat_55_fbf9ee_40x100.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.png
deleted file mode 100644
index ac8b229a..00000000
--- a/resources/jquery.ui/themes/default/images/ui-bg_flat_65_ffffff_40x100.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.png
deleted file mode 100644
index 5473afff..00000000
--- a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_cccccc_40x100.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.png
deleted file mode 100644
index 7b7b0744..00000000
--- a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_dadada_40x100.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.png
deleted file mode 100644
index 5b4ca1a0..00000000
--- a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_e6e6e6_40x100.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.png
deleted file mode 100644
index c61aad2e..00000000
--- a/resources/jquery.ui/themes/default/images/ui-bg_flat_95_fef1ec_40x100.png
+++ /dev/null
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
new file mode 100644
index 00000000..ad3d6346
--- /dev/null
+++ 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
new file mode 100644
index 00000000..42ccba26
--- /dev/null
+++ 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
new file mode 100644
index 00000000..5a46b47c
--- /dev/null
+++ 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_glass_75_e6e6e6_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 00000000..86c2baa6
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 00000000..4443fdc1
--- /dev/null
+++ b/resources/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_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
new file mode 100644
index 00000000..7c9fa6c6
--- /dev/null
+++ 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 b273ff11..ee039dc0 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 84defe6e..45e8928e 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 59bd45b9..7ec70d11 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 6d02426c..5ba708c3 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 2ab019b7..7930a558 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/default/jquery.ui.accordion.css b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
index 8d8a1a6e..e426c762 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.accordion.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
@@ -1,12 +1,19 @@
-/* Accordion
-----------------------------------*/
+/*
+ * jQuery UI Accordion 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
.ui-accordion .ui-accordion-li-fix { display: inline; }
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-/* IE7-/Win - Fix extra vertical space in lists */
-.ui-accordion a { zoom: 1; }
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; } \ No newline at end of file
+.ui-accordion .ui-accordion-content-active { display: block; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
index f287dbe9..4613938a 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
@@ -1,13 +1,26 @@
-/* Autocomplete
-----------------------------------*/
+/*
+ * jQuery UI Autocomplete 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
.ui-autocomplete { position: absolute; cursor: default; }
-.ui-autocomplete-loading { background: white /* @embed */ url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
/* workarounds */
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-/* Menu
-----------------------------------*/
+/*
+ * jQuery UI Menu 1.8.17
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
.ui-menu {
list-style:none;
padding: 2px;
diff --git a/resources/jquery.ui/themes/default/jquery.ui.button.css b/resources/jquery.ui/themes/default/jquery.ui.button.css
index 47777a42..a7565af8 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.button.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.button.css
@@ -1,6 +1,12 @@
-/* Button
-----------------------------------*/
-
+/*
+ * jQuery UI Button 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: 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 */
@@ -11,15 +17,17 @@ button.ui-button-icons-only { width: 3.7em; }
.ui-button .ui-button-text { display: block; line-height: 1.4; }
.ui-button-text-only .ui-button-text { padding: .4em 1em; }
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
-.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
/* no icon support for input elements, provide padding by default */
input.ui-button { padding: .4em 1em; }
/*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
/*button sets*/
@@ -28,8 +36,3 @@ input.ui-button { padding: .4em 1em; }
/* workarounds */
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
-
-
-
-
-
diff --git a/resources/jquery.ui/themes/default/jquery.ui.core.css b/resources/jquery.ui/themes/default/jquery.ui.core.css
index b3e81930..bde176d2 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.core.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.core.css
@@ -1,20 +1,21 @@
/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-*/
+ * jQuery UI CSS Framework 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
/* Layout helpers
----------------------------------*/
.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
-.ui-helper-clearfix { display: inline-block; }
-/* required comment for clearfix to work in Opera \*/
-* html .ui-helper-clearfix { height:1%; }
-.ui-helper-clearfix { display:block; }
-/* end clearfix */
+.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
+.ui-helper-clearfix:after { clear: both; }
+.ui-helper-clearfix { zoom: 1; }
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
index 580a2929..6cb5aefc 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
@@ -1,6 +1,13 @@
-/* Datepicker
-----------------------------------*/
-.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+/*
+ * jQuery UI Datepicker 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
@@ -32,20 +39,20 @@
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
/* RTL support */
-/* @noflip */ .ui-datepicker-rtl { direction: rtl; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group { float:right; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-/* @noflip */ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
.ui-datepicker-cover {
diff --git a/resources/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
index f8354642..a5914ff1 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.dialog.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
@@ -1,13 +1,21 @@
-/* Dialog
-----------------------------------*/
+/*
+ * jQuery UI Dialog 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
index bc0939ec..630fab39 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
@@ -1,4 +1,11 @@
-/* Progressbar
-----------------------------------*/
-.ui-progressbar { height:2em; text-align: left; }
+/*
+ * jQuery UI Progressbar 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
index 366643b5..582bcb31 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.resizable.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
@@ -1,7 +1,14 @@
-/* Resizable
-----------------------------------*/
+/*
+ * jQuery UI Resizable 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
index c5d46ce2..b36b8988 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.selectable.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
@@ -1,3 +1,10 @@
-/* Selectable
-----------------------------------*/
-.ui-selectable-helper { border:1px dotted black }
+/*
+ * jQuery UI Selectable 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.slider.css b/resources/jquery.ui/themes/default/jquery.ui.slider.css
index 07c6f4e5..4cc54810 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.slider.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.slider.css
@@ -1,5 +1,12 @@
-/* Slider
-----------------------------------*/
+/*
+ * jQuery UI Slider 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
.ui-slider { position: relative; text-align: left; }
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
index 99e16dbd..fb827458 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.tabs.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
@@ -1,5 +1,12 @@
-/* Tabs
-----------------------------------*/
+/*
+ * jQuery UI Tabs 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
diff --git a/resources/jquery.ui/themes/default/jquery.ui.theme.css b/resources/jquery.ui/themes/default/jquery.ui.theme.css
index 7a425f73..d0c93afb 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.theme.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.theme.css
@@ -1,40 +1,43 @@
-
-
/*
-* jQuery UI CSS Framework
-* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
-* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=1em&cornerRadius=0&bgColorHeader=cccccc&bgTextureHeader=01_flat.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=01_flat.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=01_flat.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=01_flat.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=01_flat.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-*/
+ * jQuery UI CSS Framework 1.8.17
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */
/* Component containers
----------------------------------*/
-.ui-widget { font-family: sans-serif; font-size: 1em; }
+.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: sans-serif; font-size: 1em; }
-.ui-widget-content { border: 1px solid #aaaaaa; /* @embed */ background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
-.ui-widget-content a { color: #222222; }
-.ui-widget-header { border: 1px solid #aaaaaa; /* @embed */ background: #cccccc url(images/ui-bg_flat_75_cccccc_40x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
-.ui-widget-header a { color: #222222; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
+.ui-widget-content a { color: #222222/*{fcContent}*/; }
+.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
+.ui-widget-header a { color: #222222/*{fcHeader}*/; }
/* Interaction states
----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; /* @embed */ background: #e6e6e6 url(images/ui-bg_flat_75_e6e6e6_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; /* @embed */ background: #dadada url(images/ui-bg_flat_75_dadada_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; /* @embed */ background: #ffffff url(images/ui-bg_flat_65_ffffff_40x100.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
.ui-widget :active { outline: none; }
/* Interaction Cues
----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; /* @embed */ background: #fbf9ee url(images/ui-bg_flat_55_fbf9ee_40x100.png) 50% 50% repeat-x; color: #363636; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; /* @embed */ background: #fef1ec url(images/ui-bg_flat_95_fef1ec_40x100.png) 50% 50% repeat-x; color: #cd0a0a; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
@@ -43,12 +46,14 @@
----------------------------------*/
/* states and images */
-.ui-icon { width: 16px; height: 16px; }
-.ui-icon, .ui-widget-content .ui-icon, .ui-widget-header .ui-icon { /* @embed */ background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-state-default .ui-icon { /* @embed */ background-image: url(images/ui-icons_888888_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-state-active .ui-icon { /* @embed */ background-image: url(images/ui-icons_454545_256x240.png); }
-.ui-state-highlight .ui-icon { /* @embed */ background-image: url(images/ui-icons_2e83ff_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon { /* @embed */ background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
/* positioning */
.ui-icon-carat-1-n { background-position: 0 0; }
@@ -232,17 +237,11 @@
----------------------------------*/
/* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; border-top-left-radius: 0; }
-.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; border-bottom-left-radius: 0; }
-.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; border-bottom-right-radius: 0; }
-.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; border-bottom-right-radius: 0; }
-.ui-corner-right { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; border-bottom-right-radius: 0; }
-.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; border-bottom-left-radius: 0; }
-.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; }
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
/* Overlays */
-.ui-widget-overlay, .ui-widget-shadow { /* @embed */ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; }
-.ui-widget-overlay { opacity: .30;filter:Alpha(Opacity=30); }
-.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } \ No newline at end of file
+.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
+.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
index cde520b5..16209389 100644
--- a/resources/jquery.ui/themes/vector/images/button-disabled-green.png
+++ b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-green.png b/resources/jquery.ui/themes/vector/images/button-down-green.png
index 1e54a0c4..edfd4275 100644
--- a/resources/jquery.ui/themes/vector/images/button-down-green.png
+++ b/resources/jquery.ui/themes/vector/images/button-down-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-green.png b/resources/jquery.ui/themes/vector/images/button-off-green.png
index cdf46e7e..c6f5ee4f 100644
--- a/resources/jquery.ui/themes/vector/images/button-off-green.png
+++ b/resources/jquery.ui/themes/vector/images/button-off-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-green.png b/resources/jquery.ui/themes/vector/images/button-over-green.png
index 0b8f6ef4..d47eb758 100644
--- a/resources/jquery.ui/themes/vector/images/button-over-green.png
+++ b/resources/jquery.ui/themes/vector/images/button-over-green.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css b/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css
index 81022250..871bf690 100644
--- a/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css
+++ b/resources/jquery.ui/themes/vector/jquery.ui.datepicker.css
@@ -1,6 +1,6 @@
/* Datepicker
----------------------------------*/
-.ui-datepicker { width: 17em; padding: .2em .2em 0; }
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.dialog.css b/resources/jquery.ui/themes/vector/jquery.ui.dialog.css
index 2b19fcdd..cd85f14e 100644
--- a/resources/jquery.ui/themes/vector/jquery.ui.dialog.css
+++ b/resources/jquery.ui/themes/vector/jquery.ui.dialog.css
@@ -8,7 +8,7 @@
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane button { float: right; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }
/* Customizations */
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png
new file mode 100644
index 00000000..0de1ae9c
--- /dev/null
+++ 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
new file mode 100644
index 00000000..f3f06519
--- /dev/null
+++ 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
new file mode 100644
index 00000000..dbcc71b9
--- /dev/null
+++ 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
new file mode 100644
index 00000000..760798bf
--- /dev/null
+++ 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
new file mode 100644
index 00000000..61340fa8
--- /dev/null
+++ b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png
Binary files differ
diff --git a/resources/jquery/images/jquery.arrowSteps.tail-rtl.png b/resources/jquery/images/jquery.arrowSteps.tail-rtl.png
new file mode 100644
index 00000000..dd2d8e8a
--- /dev/null
+++ b/resources/jquery/images/jquery.arrowSteps.tail-rtl.png
Binary files differ
diff --git a/resources/jquery/images/marker.png b/resources/jquery/images/marker.png
new file mode 100644
index 00000000..3929bbb5
--- /dev/null
+++ b/resources/jquery/images/marker.png
Binary files differ
diff --git a/resources/jquery/images/mask.png b/resources/jquery/images/mask.png
new file mode 100644
index 00000000..b0a4d406
--- /dev/null
+++ b/resources/jquery/images/mask.png
Binary files differ
diff --git a/resources/jquery/images/spinner.gif b/resources/jquery/images/spinner.gif
new file mode 100644
index 00000000..37d3a43d
--- /dev/null
+++ b/resources/jquery/images/spinner.gif
Binary files differ
diff --git a/resources/jquery/images/wheel.png b/resources/jquery/images/wheel.png
new file mode 100644
index 00000000..97b343d9
--- /dev/null
+++ b/resources/jquery/images/wheel.png
Binary files differ
diff --git a/resources/jquery/jquery.arrowSteps.css b/resources/jquery/jquery.arrowSteps.css
new file mode 100644
index 00000000..60461032
--- /dev/null
+++ b/resources/jquery/jquery.arrowSteps.css
@@ -0,0 +1,45 @@
+.arrowSteps {
+ list-style-type: none;
+ list-style-image: none;
+ border: 1px solid #666666;
+ position: relative;
+}
+
+.arrowSteps li {
+ float: left;
+ padding: 0px;
+ margin: 0px;
+ border: 0 none;
+}
+
+.arrowSteps li div {
+ padding: 0.5em;
+ text-align: center;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.arrowSteps li.arrow div {
+ /* @embed */
+ background: url(images/jquery.arrowSteps.divider-ltr.png) no-repeat right center;
+}
+
+/* applied to the element preceding the highlighted step */
+.arrowSteps li.arrow.tail div {
+ /* @embed */
+ background: url(images/jquery.arrowSteps.tail-ltr.png) no-repeat right center;
+}
+
+/* this applies to all highlighted, including the last */
+.arrowSteps li.head div {
+ /* @embed */
+ background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat left center;
+ font-weight: bold;
+}
+
+/* this applies to all highlighted arrows except the last */
+.arrowSteps li.arrow.head div {
+ /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
+ /* @embed */
+ background: url(images/jquery.arrowSteps.head-ltr.png) no-repeat right center;
+} \ No newline at end of file
diff --git a/resources/jquery/jquery.arrowSteps.js b/resources/jquery/jquery.arrowSteps.js
new file mode 100644
index 00000000..f9637545
--- /dev/null
+++ b/resources/jquery/jquery.arrowSteps.js
@@ -0,0 +1,81 @@
+/**
+ * jQuery arrowSteps plugin
+ * Copyright Neil Kandalgaonkar, 2010
+ *
+ * This work 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.
+ *
+ *
+ * DESCRIPTION
+ *
+ * Show users their progress through a series of steps, via a row of items that fit
+ * together like arrows. One item can be highlighted at a time.
+ *
+ *
+ * SYNOPSIS
+ *
+ * <ul id="robin-hood-daffy">
+ * <li id="guard"><div>Guard!</div></li>
+ * <li id="turn"><div>Turn!</div></li>
+ * <li id="parry"><div>Parry!</div></li>
+ * <li id="dodge"><div>Dodge!</div></li>
+ * <li id="spin"><div>Spin!</div></li>
+ * <li id="ha"><div>Ha!</div></li>
+ * <li id="thrust"><div>Thrust!</div></li>
+ * </ul>
+ *
+ * <script language="javascript"><!--
+ * $( '#robin-hood-daffy' ).arrowSteps();
+ *
+ * $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
+ * // 'Guard!' is highlighted.
+ *
+ * // ... user completes the 'guard' step ...
+ *
+ * $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
+ * // 'Turn!' is highlighted.
+ *
+ * //-->
+ * </script>
+ *
+ */
+
+( function( $j ) {
+ $j.fn.arrowSteps = function() {
+ this.addClass( 'arrowSteps' );
+ var $steps = this.find( 'li' );
+
+ var width = parseInt( 100 / $steps.length, 10 );
+ $steps.css( 'width', width + '%' );
+
+ // every step except the last one has an arrow at the right hand side. Also add in the padding
+ // for the calculated arrow width.
+ var arrowWidth = parseInt( this.outerHeight(), 10 );
+ $steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
+ .find( 'div' ).css( 'padding-right', arrowWidth.toString() + 'px' );
+
+ this.data( 'arrowSteps', $steps );
+ return this;
+ };
+
+ $j.fn.arrowStepsHighlight = function( selector ) {
+ var $steps = this.data( 'arrowSteps' );
+ var $previous;
+ $j.each( $steps, function( i, step ) {
+ var $step = $j( step );
+ if ( $step.is( selector ) ) {
+ if ($previous) {
+ $previous.addClass( 'tail' );
+ }
+ $step.addClass( 'head' );
+ } else {
+ $step.removeClass( 'head tail lasthead' );
+ }
+ $previous = $step;
+ } );
+ };
+
+} )( jQuery );
diff --git a/resources/jquery/jquery.autoEllipsis.js b/resources/jquery/jquery.autoEllipsis.js
index 7d726894..9a5fcc9c 100644
--- a/resources/jquery/jquery.autoEllipsis.js
+++ b/resources/jquery/jquery.autoEllipsis.js
@@ -25,7 +25,7 @@ $.fn.autoEllipsis = function( options ) {
$el.text( $el.data( 'autoEllipsis.originalText' ) );
}
}
-
+
// container element - used for measuring against
var $container = $el;
// trimmable text element - only the text within this element will be trimmed
@@ -43,7 +43,7 @@ $.fn.autoEllipsis = function( options ) {
.empty()
.append( $trimmableText );
}
-
+
var text = $container.text();
var trimmableText = $trimmableText.text();
var w = $container.width();
@@ -81,7 +81,7 @@ $.fn.autoEllipsis = function( options ) {
return;
}
}
-
+
if ( $trimmableText.width() + pw > w ) {
switch ( options.position ) {
case 'right':
@@ -136,7 +136,7 @@ $.fn.autoEllipsis = function( options ) {
} else {
cache[text][w][options.position] = $container.html();
}
-
+
} );
};
diff --git a/resources/jquery/jquery.byteLimit.js b/resources/jquery/jquery.byteLimit.js
index c1d26fc4..10411924 100644
--- a/resources/jquery/jquery.byteLimit.js
+++ b/resources/jquery/jquery.byteLimit.js
@@ -6,24 +6,54 @@
( function( $ ) {
/**
- * Enforces a byte limit to a textbox, so that UTF-8 entries are not arbitrarily truncated.
+ * Enforces a byte limit to a textbox, so that UTF-8 entries are counted as well, when, for example,
+ * a databae field has a byte limit rather than a character limit.
+ * Plugin rationale: Browser has native maxlength for number of characters, this plugin exists to
+ * limit number of bytes instead.
+ *
+ * Can be called with a custom limit (to use that limit instead of the maxlength attribute value),
+ * a filter function (in case the limit should apply to something other than the exact input value),
+ * or both. Order of arguments is important!
+ *
+ * @context {jQuery} Instance of jQuery for one or more input elements
+ * @param limit {Number} (optional) Limit to enforce, fallsback to maxLength-attribute,
+ * called with fetched value as argument.
+ * @param fn {Function} (optional) Function to call on the input string before assessing the length
+ * @return {jQuery} The context
*/
- $.fn.byteLimit = function( limit ) {
+ $.fn.byteLimit = function( limit, fn ) {
+ // If the first argument is the function,
+ // set fn to the first argument's value and ignore the second argument.
+ if ( $.isFunction( limit ) ) {
+ fn = limit;
+ limit = undefined;
+ }
- // Default to current attribute value
- if ( limit == null ) {
- limit = this.attr( 'maxLength' );
+ // Default limit to current attribute value
+ if ( limit === undefined ) {
+ limit = this.prop( 'maxLength' );
+ }
- // If passed, update/set attribute value instead
+ // Update/set attribute value, but only if there is no callback set.
+ // If there's a callback set, it's possible that the limit being enforced
+ // is too low (ie. if the callback would return "Foo" for "User:Foo").
+ // Usually this isn't a problem since browsers ignore maxLength when setting
+ // the value property through JavaScript, but Safari 4 violates that rule, so
+ // we have to remove or not set the property if we have a callback.
+ if ( fn == undefined ) {
+ this.prop( 'maxLength', limit );
} else {
- this.attr( 'maxLength', limit );
+ this.removeProp( 'maxLength' );
}
// Nothing passed and/or empty attribute, return without binding an event.
- if ( limit == null ) {
+ if ( limit === undefined ) {
return this;
}
+ // Save function for reference
+ this.data( 'byteLimit-callback', fn );
+
// We've got something, go for it:
return this.keypress( function( e ) {
// First check to see if this is actually a character key
@@ -31,21 +61,22 @@
// Based on key-event info from http://unixpapa.com/js/key.html
// jQuery should also normalize e.which to be consistent cross-browser,
// however the same check is still needed regardless of jQuery.
-
+
// Note: At the moment, for some older opera versions (~< 10.5)
// some special keys won't be recognized (aka left arrow key).
// Backspace will be, so not big issue.
-
+
if ( e.which === 0 || e.charCode === 0 || e.which === 8 ||
e.ctrlKey || e.altKey || e.metaKey )
{
return true; //a special key (backspace, etc) so don't interfere.
}
-
- var len = $.byteLength( this.value );
- // Note that keypress returns a character code point, not a keycode.
- // However, this may not be super reliable depending on how keys come in...
- var charLen = $.byteLength( String.fromCharCode( e.which ) );
+
+ var val = fn !== undefined ? fn( $( this ).val() ): $( this ).val(),
+ len = $.byteLength( val ),
+ // Note that keypress returns a character code point, not a keycode.
+ // However, this may not be super reliable depending on how keys come in...
+ charLen = $.byteLength( String.fromCharCode( e.which ) );
if ( ( len + charLen ) > limit ) {
e.preventDefault();
diff --git a/resources/jquery/jquery.checkboxShiftClick.js b/resources/jquery/jquery.checkboxShiftClick.js
index cfa696d4..0a1d7d7d 100644
--- a/resources/jquery/jquery.checkboxShiftClick.js
+++ b/resources/jquery/jquery.checkboxShiftClick.js
@@ -16,9 +16,9 @@ $.fn.checkboxShiftClick = function( text ) {
if ( prevCheckbox !== null && e.shiftKey ) {
// Check or uncheck this one and all in-between checkboxes
$box.slice(
- Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
- Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
- ).attr( {checked: e.target.checked ? 'checked' : ''} );
+ Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
+ Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
+ ).prop( 'checked', e.target.checked ? true : false );
}
// 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 8082fa7d..ae74a324 100644
--- a/resources/jquery/jquery.client.js
+++ b/resources/jquery/jquery.client.js
@@ -14,7 +14,7 @@
/* Public Methods */
$.client = {
-
+
/**
* Get an object containing information about the client.
*
@@ -37,18 +37,18 @@
}
// Use the cached version if possible
if ( profileCache[nav.userAgent] === undefined ) {
-
+
/* Configuration */
-
+
// Name of browsers or layout engines we don't recognize
var uk = 'unknown';
// Generic version digit
var x = 'x';
// Strings found in user agent strings that need to be conformed
- var wildUserAgents = [ 'Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'];
+ var wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'];
// Translations for conforming user agent strings
var userAgentTranslations = [
- // Tons of browsers lie about being something they are not
+ // Tons of browsers lie about being something they are not
[/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
// Chrome lives in the shadow of Safari still
['Chrome Safari', 'Chrome'],
@@ -86,9 +86,9 @@
var platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'];
// Translations for conforming operating system names
var platformTranslations = [['sunos', 'solaris']];
-
+
/* Methods */
-
+
// Performs multiple replacements on a string
var translate = function( source, translations ) {
for ( var i = 0; i < translations.length; i++ ) {
@@ -96,9 +96,9 @@
}
return source;
};
-
- /* Pre-processing */
-
+
+ /* Pre-processing */
+
var ua = nav.userAgent,
match,
name = uk,
@@ -113,9 +113,9 @@
}
// Everything will be in lowercase from now on
ua = ua.toLowerCase();
-
+
/* Extraction */
-
+
if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
name = translate( match[1], nameTranslations );
}
@@ -131,9 +131,9 @@
if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( ua ) ) {
version = match[3];
}
-
+
/* Edge Cases -- did I mention about how user agent string lie? */
-
+
// Decode Safari's crazy 400+ version numbers
if ( name.match( /safari/ ) && version > 400 ) {
version = '2.0';
@@ -143,9 +143,9 @@
version = ua.match( /version\/([0-9\.]*)/i )[1] || 10;
}
var versionNumber = parseFloat( version, 10 ) || 0.0;
-
+
/* Caching */
-
+
profileCache[nav.userAgent] = {
'name': name,
'layout': layout,
@@ -158,7 +158,7 @@
}
return profileCache[nav.userAgent];
},
-
+
/**
* 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
diff --git a/resources/jquery/jquery.collapsibleTabs.js b/resources/jquery/jquery.collapsibleTabs.js
index b2399727..1784f86a 100644
--- a/resources/jquery/jquery.collapsibleTabs.js
+++ b/resources/jquery/jquery.collapsibleTabs.js
@@ -7,7 +7,7 @@
if( !this.length ) return this;
//merge options into the defaults
var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
-
+
this.each( function() {
var $this = $( this );
// add the element to our array of collapsible managers
@@ -20,7 +20,7 @@
$.collapsibleTabs.addData( $( this ) );
} );
} );
-
+
// if we haven't already bound our resize hanlder, bind it now
if( !$.collapsibleTabs.boundEvent ) {
$( window )
@@ -70,15 +70,15 @@
$.collapsibleTabs.instances.each( function() {
var $this = $( this ), data = $.collapsibleTabs.getSettings( $this );
if( data.shifting ) return;
-
+
// if the two navigations are colliding
if( $this.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
-
+
$this.trigger( "beforeTabCollapse" );
// move the element to the dropdown menu
$.collapsibleTabs.moveToCollapsed( $this.children( data.collapsible + ':last' ) );
}
-
+
// if there are still moveable items in the dropdown menu,
// and there is sufficient space to place them in the tab container
if( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
diff --git a/resources/jquery/jquery.color.js b/resources/jquery/jquery.color.js
index b0419428..8a619b5c 100644
--- a/resources/jquery/jquery.color.js
+++ b/resources/jquery/jquery.color.js
@@ -15,7 +15,7 @@
fx.start = getColor( fx.elem, attr );
fx.end = $.colorUtil.getRGB( fx.end );
}
-
+
fx.elem.style[attr] = 'rgb(' + [
Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
@@ -24,7 +24,7 @@
}
}
);
-
+
function getColor(elem, attr) {
var color;
@@ -33,12 +33,12 @@
// Keep going until we find an element that has color, or we hit the body
if ( color != '' && color != 'transparent' || $.nodeName(elem, 'body') )
- break;
+ break;
attr = 'backgroundColor';
} while ( elem = elem.parentNode );
return $.colorUtil.getRGB(color);
};
-
+
} )( jQuery );
diff --git a/resources/jquery/jquery.cycle.all.js b/resources/jquery/jquery.cycle.all.js
new file mode 100644
index 00000000..d57fb720
--- /dev/null
+++ b/resources/jquery/jquery.cycle.all.js
@@ -0,0 +1,1529 @@
+/*!
+ * jQuery Cycle Plugin (with Transition Definitions)
+ * Examples and documentation at: http://jquery.malsup.com/cycle/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Version: 2.9999 (13-NOV-2011)
+ * Dual licensed under the MIT and GPL licenses.
+ * http://jquery.malsup.com/license.html
+ * Requires: jQuery v1.3.2 or later
+ */
+;(function($, undefined) {
+
+var ver = '2.9999';
+
+// if $.support is not defined (pre jQuery 1.3) add what I need
+if ($.support == undefined) {
+ $.support = {
+ opacity: !($.browser.msie)
+ };
+}
+
+function debug(s) {
+ $.fn.cycle.debug && log(s);
+}
+function log() {
+ window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
+}
+$.expr[':'].paused = function(el) {
+ return el.cyclePause;
+}
+
+
+// the options arg can be...
+// a number - indicates an immediate transition should occur to the given slide index
+// a string - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
+// an object - properties to control the slideshow
+//
+// the arg2 arg can be...
+// the name of an fx (only used in conjunction with a numeric value for 'options')
+// the value true (only used in first arg == 'resume') and indicates
+// that the resume should occur immediately (not wait for next timeout)
+
+$.fn.cycle = function(options, arg2) {
+ var o = { s: this.selector, c: this.context };
+
+ // in 1.3+ we can fix mistakes with the ready state
+ if (this.length === 0 && options != 'stop') {
+ if (!$.isReady && o.s) {
+ log('DOM not ready, queuing slideshow');
+ $(function() {
+ $(o.s,o.c).cycle(options,arg2);
+ });
+ return this;
+ }
+ // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+ log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+ return this;
+ }
+
+ // iterate the matched nodeset
+ return this.each(function() {
+ var opts = handleArguments(this, options, arg2);
+ if (opts === false)
+ return;
+
+ opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
+
+ // stop existing slideshow for this container (if there is one)
+ if (this.cycleTimeout)
+ clearTimeout(this.cycleTimeout);
+ this.cycleTimeout = this.cyclePause = 0;
+
+ var $cont = $(this);
+ var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
+ var els = $slides.get();
+
+ var opts2 = buildOptions($cont, $slides, els, opts, o);
+ if (opts2 === false)
+ return;
+
+ if (els.length < 2) {
+ log('terminating; too few slides: ' + els.length);
+ return;
+ }
+
+ var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
+
+ // if it's an auto slideshow, kick it off
+ if (startTime) {
+ startTime += (opts2.delay || 0);
+ if (startTime < 10)
+ startTime = 10;
+ debug('first timeout: ' + startTime);
+ this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime);
+ }
+ });
+};
+
+function triggerPause(cont, byHover, onPager) {
+ var opts = $(cont).data('cycle.opts');
+ var paused = !!cont.cyclePause;
+ if (paused && opts.paused)
+ opts.paused(cont, opts, byHover, onPager);
+ else if (!paused && opts.resumed)
+ opts.resumed(cont, opts, byHover, onPager);
+}
+
+// process the args that were passed to the plugin fn
+function handleArguments(cont, options, arg2) {
+ if (cont.cycleStop == undefined)
+ cont.cycleStop = 0;
+ if (options === undefined || options === null)
+ options = {};
+ if (options.constructor == String) {
+ switch(options) {
+ case 'destroy':
+ case 'stop':
+ var opts = $(cont).data('cycle.opts');
+ if (!opts)
+ return false;
+ cont.cycleStop++; // callbacks look for change
+ if (cont.cycleTimeout)
+ clearTimeout(cont.cycleTimeout);
+ cont.cycleTimeout = 0;
+ opts.elements && $(opts.elements).stop();
+ $(cont).removeData('cycle.opts');
+ if (options == 'destroy')
+ destroy(opts);
+ return false;
+ case 'toggle':
+ cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
+ checkInstantResume(cont.cyclePause, arg2, cont);
+ triggerPause(cont);
+ return false;
+ case 'pause':
+ cont.cyclePause = 1;
+ triggerPause(cont);
+ return false;
+ case 'resume':
+ cont.cyclePause = 0;
+ checkInstantResume(false, arg2, cont);
+ triggerPause(cont);
+ return false;
+ case 'prev':
+ case 'next':
+ var opts = $(cont).data('cycle.opts');
+ if (!opts) {
+ log('options not found, "prev/next" ignored');
+ return false;
+ }
+ $.fn.cycle[options](opts);
+ return false;
+ default:
+ options = { fx: options };
+ };
+ return options;
+ }
+ else if (options.constructor == Number) {
+ // go to the requested slide
+ var num = options;
+ options = $(cont).data('cycle.opts');
+ if (!options) {
+ log('options not found, can not advance slide');
+ return false;
+ }
+ if (num < 0 || num >= options.elements.length) {
+ log('invalid slide index: ' + num);
+ return false;
+ }
+ options.nextSlide = num;
+ if (cont.cycleTimeout) {
+ clearTimeout(cont.cycleTimeout);
+ cont.cycleTimeout = 0;
+ }
+ if (typeof arg2 == 'string')
+ options.oneTimeFx = arg2;
+ go(options.elements, options, 1, num >= options.currSlide);
+ return false;
+ }
+ return options;
+
+ function checkInstantResume(isPaused, arg2, cont) {
+ if (!isPaused && arg2 === true) { // resume now!
+ var options = $(cont).data('cycle.opts');
+ if (!options) {
+ log('options not found, can not resume');
+ return false;
+ }
+ if (cont.cycleTimeout) {
+ clearTimeout(cont.cycleTimeout);
+ cont.cycleTimeout = 0;
+ }
+ go(options.elements, options, 1, !options.backwards);
+ }
+ }
+};
+
+function removeFilter(el, opts) {
+ if (!$.support.opacity && opts.cleartype && el.style.filter) {
+ try { el.style.removeAttribute('filter'); }
+ catch(smother) {} // handle old opera versions
+ }
+};
+
+// unbind event handlers
+function destroy(opts) {
+ if (opts.next)
+ $(opts.next).unbind(opts.prevNextEvent);
+ if (opts.prev)
+ $(opts.prev).unbind(opts.prevNextEvent);
+
+ if (opts.pager || opts.pagerAnchorBuilder)
+ $.each(opts.pagerAnchors || [], function() {
+ this.unbind().remove();
+ });
+ opts.pagerAnchors = null;
+ if (opts.destroy) // callback
+ opts.destroy(opts);
+};
+
+// one-time initialization
+function buildOptions($cont, $slides, els, options, o) {
+ var startingSlideSpecified;
+ // support metadata plugin (v1.0 and v2.0)
+ var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
+ var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
+ if (meta)
+ opts = $.extend(opts, meta);
+ if (opts.autostop)
+ opts.countdown = opts.autostopCount || els.length;
+
+ var cont = $cont[0];
+ $cont.data('cycle.opts', opts);
+ opts.$cont = $cont;
+ opts.stopCount = cont.cycleStop;
+ opts.elements = els;
+ opts.before = opts.before ? [opts.before] : [];
+ opts.after = opts.after ? [opts.after] : [];
+
+ // push some after callbacks
+ if (!$.support.opacity && opts.cleartype)
+ opts.after.push(function() { removeFilter(this, opts); });
+ if (opts.continuous)
+ opts.after.push(function() { go(els,opts,0,!opts.backwards); });
+
+ saveOriginalOpts(opts);
+
+ // clearType corrections
+ if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
+ clearTypeFix($slides);
+
+ // container requires non-static position so that slides can be position within
+ if ($cont.css('position') == 'static')
+ $cont.css('position', 'relative');
+ if (opts.width)
+ $cont.width(opts.width);
+ if (opts.height && opts.height != 'auto')
+ $cont.height(opts.height);
+
+ if (opts.startingSlide != undefined) {
+ opts.startingSlide = parseInt(opts.startingSlide,10);
+ if (opts.startingSlide >= els.length || opts.startSlide < 0)
+ opts.startingSlide = 0; // catch bogus input
+ else
+ startingSlideSpecified = true;
+ }
+ else if (opts.backwards)
+ opts.startingSlide = els.length - 1;
+ else
+ opts.startingSlide = 0;
+
+ // if random, mix up the slide array
+ if (opts.random) {
+ opts.randomMap = [];
+ for (var i = 0; i < els.length; i++)
+ opts.randomMap.push(i);
+ opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+ if (startingSlideSpecified) {
+ // try to find the specified starting slide and if found set start slide index in the map accordingly
+ for ( var cnt = 0; cnt < els.length; cnt++ ) {
+ if ( opts.startingSlide == opts.randomMap[cnt] ) {
+ opts.randomIndex = cnt;
+ }
+ }
+ }
+ else {
+ opts.randomIndex = 1;
+ opts.startingSlide = opts.randomMap[1];
+ }
+ }
+ else if (opts.startingSlide >= els.length)
+ opts.startingSlide = 0; // catch bogus input
+ opts.currSlide = opts.startingSlide || 0;
+ var first = opts.startingSlide;
+
+ // set position and zIndex on all the slides
+ $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
+ var z;
+ if (opts.backwards)
+ z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
+ else
+ z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
+ $(this).css('z-index', z)
+ });
+
+ // make sure first slide is visible
+ $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
+ removeFilter(els[first], opts);
+
+ // stretch slides
+ if (opts.fit) {
+ if (!opts.aspect) {
+ if (opts.width)
+ $slides.width(opts.width);
+ if (opts.height && opts.height != 'auto')
+ $slides.height(opts.height);
+ } else {
+ $slides.each(function(){
+ var $slide = $(this);
+ var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
+ if( opts.width && $slide.width() != opts.width ) {
+ $slide.width( opts.width );
+ $slide.height( opts.width / ratio );
+ }
+
+ if( opts.height && $slide.height() < opts.height ) {
+ $slide.height( opts.height );
+ $slide.width( opts.height * ratio );
+ }
+ });
+ }
+ }
+
+ if (opts.center && ((!opts.fit) || opts.aspect)) {
+ $slides.each(function(){
+ var $slide = $(this);
+ $slide.css({
+ "margin-left": opts.width ?
+ ((opts.width - $slide.width()) / 2) + "px" :
+ 0,
+ "margin-top": opts.height ?
+ ((opts.height - $slide.height()) / 2) + "px" :
+ 0
+ });
+ });
+ }
+
+ if (opts.center && !opts.fit && !opts.slideResize) {
+ $slides.each(function(){
+ var $slide = $(this);
+ $slide.css({
+ "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
+ "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
+ });
+ });
+ }
+
+ // stretch container
+ var reshape = opts.containerResize && !$cont.innerHeight();
+ if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
+ var maxw = 0, maxh = 0;
+ for(var j=0; j < els.length; j++) {
+ var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
+ if (!w) w = e.offsetWidth || e.width || $e.attr('width');
+ if (!h) h = e.offsetHeight || e.height || $e.attr('height');
+ maxw = w > maxw ? w : maxw;
+ maxh = h > maxh ? h : maxh;
+ }
+ if (maxw > 0 && maxh > 0)
+ $cont.css({width:maxw+'px',height:maxh+'px'});
+ }
+
+ var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
+ if (opts.pause)
+ $cont.hover(
+ function(){
+ pauseFlag = true;
+ this.cyclePause++;
+ triggerPause(cont, true);
+ },
+ function(){
+ pauseFlag && this.cyclePause--;
+ triggerPause(cont, true);
+ }
+ );
+
+ if (supportMultiTransitions(opts) === false)
+ return false;
+
+ // apparently a lot of people use image slideshows without height/width attributes on the images.
+ // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
+ var requeue = false;
+ options.requeueAttempts = options.requeueAttempts || 0;
+ $slides.each(function() {
+ // try to get height/width of each slide
+ var $el = $(this);
+ this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
+ this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
+
+ if ( $el.is('img') ) {
+ // sigh.. sniffing, hacking, shrugging... this crappy hack tries to account for what browsers do when
+ // an image is being downloaded and the markup did not include sizing info (height/width attributes);
+ // there seems to be some "default" sizes used in this situation
+ var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
+ var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
+ var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
+ var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
+ // don't requeue for images that are still loading but have a valid size
+ if (loadingIE || loadingFF || loadingOp || loadingOther) {
+ if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
+ log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
+ setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
+ requeue = true;
+ return false; // break each loop
+ }
+ else {
+ log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
+ }
+ }
+ }
+ return true;
+ });
+
+ if (requeue)
+ return false;
+
+ opts.cssBefore = opts.cssBefore || {};
+ opts.cssAfter = opts.cssAfter || {};
+ opts.cssFirst = opts.cssFirst || {};
+ opts.animIn = opts.animIn || {};
+ opts.animOut = opts.animOut || {};
+
+ $slides.not(':eq('+first+')').css(opts.cssBefore);
+ $($slides[first]).css(opts.cssFirst);
+
+ if (opts.timeout) {
+ opts.timeout = parseInt(opts.timeout,10);
+ // ensure that timeout and speed settings are sane
+ if (opts.speed.constructor == String)
+ opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
+ if (!opts.sync)
+ opts.speed = opts.speed / 2;
+
+ var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
+ while((opts.timeout - opts.speed) < buffer) // sanitize timeout
+ opts.timeout += opts.speed;
+ }
+ if (opts.easing)
+ opts.easeIn = opts.easeOut = opts.easing;
+ if (!opts.speedIn)
+ opts.speedIn = opts.speed;
+ if (!opts.speedOut)
+ opts.speedOut = opts.speed;
+
+ opts.slideCount = els.length;
+ opts.currSlide = opts.lastSlide = first;
+ if (opts.random) {
+ if (++opts.randomIndex == els.length)
+ opts.randomIndex = 0;
+ opts.nextSlide = opts.randomMap[opts.randomIndex];
+ }
+ else if (opts.backwards)
+ opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1;
+ else
+ opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
+
+ // run transition init fn
+ if (!opts.multiFx) {
+ var init = $.fn.cycle.transitions[opts.fx];
+ if ($.isFunction(init))
+ init($cont, $slides, opts);
+ else if (opts.fx != 'custom' && !opts.multiFx) {
+ log('unknown transition: ' + opts.fx,'; slideshow terminating');
+ return false;
+ }
+ }
+
+ // fire artificial events
+ var e0 = $slides[first];
+ if (!opts.skipInitializationCallbacks) {
+ if (opts.before.length)
+ opts.before[0].apply(e0, [e0, e0, opts, true]);
+ if (opts.after.length)
+ opts.after[0].apply(e0, [e0, e0, opts, true]);
+ }
+ if (opts.next)
+ $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)});
+ if (opts.prev)
+ $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});
+ if (opts.pager || opts.pagerAnchorBuilder)
+ buildPager(els,opts);
+
+ exposeAddSlide(opts, els);
+
+ return opts;
+};
+
+// save off original opts so we can restore after clearing state
+function saveOriginalOpts(opts) {
+ opts.original = { before: [], after: [] };
+ opts.original.cssBefore = $.extend({}, opts.cssBefore);
+ opts.original.cssAfter = $.extend({}, opts.cssAfter);
+ opts.original.animIn = $.extend({}, opts.animIn);
+ opts.original.animOut = $.extend({}, opts.animOut);
+ $.each(opts.before, function() { opts.original.before.push(this); });
+ $.each(opts.after, function() { opts.original.after.push(this); });
+};
+
+function supportMultiTransitions(opts) {
+ var i, tx, txs = $.fn.cycle.transitions;
+ // look for multiple effects
+ if (opts.fx.indexOf(',') > 0) {
+ opts.multiFx = true;
+ opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
+ // discard any bogus effect names
+ for (i=0; i < opts.fxs.length; i++) {
+ var fx = opts.fxs[i];
+ tx = txs[fx];
+ if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
+ log('discarding unknown transition: ',fx);
+ opts.fxs.splice(i,1);
+ i--;
+ }
+ }
+ // if we have an empty list then we threw everything away!
+ if (!opts.fxs.length) {
+ log('No valid transitions named; slideshow terminating.');
+ return false;
+ }
+ }
+ else if (opts.fx == 'all') { // auto-gen the list of transitions
+ opts.multiFx = true;
+ opts.fxs = [];
+ for (p in txs) {
+ tx = txs[p];
+ if (txs.hasOwnProperty(p) && $.isFunction(tx))
+ opts.fxs.push(p);
+ }
+ }
+ if (opts.multiFx && opts.randomizeEffects) {
+ // munge the fxs array to make effect selection random
+ var r1 = Math.floor(Math.random() * 20) + 30;
+ for (i = 0; i < r1; i++) {
+ var r2 = Math.floor(Math.random() * opts.fxs.length);
+ opts.fxs.push(opts.fxs.splice(r2,1)[0]);
+ }
+ debug('randomized fx sequence: ',opts.fxs);
+ }
+ return true;
+};
+
+// provide a mechanism for adding slides after the slideshow has started
+function exposeAddSlide(opts, els) {
+ opts.addSlide = function(newSlide, prepend) {
+ var $s = $(newSlide), s = $s[0];
+ if (!opts.autostopCount)
+ opts.countdown++;
+ els[prepend?'unshift':'push'](s);
+ if (opts.els)
+ opts.els[prepend?'unshift':'push'](s); // shuffle needs this
+ opts.slideCount = els.length;
+
+ // add the slide to the random map and resort
+ if (opts.random) {
+ opts.randomMap.push(opts.slideCount-1);
+ opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+ }
+
+ $s.css('position','absolute');
+ $s[prepend?'prependTo':'appendTo'](opts.$cont);
+
+ if (prepend) {
+ opts.currSlide++;
+ opts.nextSlide++;
+ }
+
+ if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
+ clearTypeFix($s);
+
+ if (opts.fit && opts.width)
+ $s.width(opts.width);
+ if (opts.fit && opts.height && opts.height != 'auto')
+ $s.height(opts.height);
+ s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
+ s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
+
+ $s.css(opts.cssBefore);
+
+ if (opts.pager || opts.pagerAnchorBuilder)
+ $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
+
+ if ($.isFunction(opts.onAddSlide))
+ opts.onAddSlide($s);
+ else
+ $s.hide(); // default behavior
+ };
+}
+
+// reset internal state; we do this on every pass in order to support multiple effects
+$.fn.cycle.resetState = function(opts, fx) {
+ fx = fx || opts.fx;
+ opts.before = []; opts.after = [];
+ opts.cssBefore = $.extend({}, opts.original.cssBefore);
+ opts.cssAfter = $.extend({}, opts.original.cssAfter);
+ opts.animIn = $.extend({}, opts.original.animIn);
+ opts.animOut = $.extend({}, opts.original.animOut);
+ opts.fxFn = null;
+ $.each(opts.original.before, function() { opts.before.push(this); });
+ $.each(opts.original.after, function() { opts.after.push(this); });
+
+ // re-init
+ var init = $.fn.cycle.transitions[fx];
+ if ($.isFunction(init))
+ init(opts.$cont, $(opts.elements), opts);
+};
+
+// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
+function go(els, opts, manual, fwd) {
+ // opts.busy is true if we're in the middle of an animation
+ if (manual && opts.busy && opts.manualTrump) {
+ // let manual transitions requests trump active ones
+ debug('manualTrump in go(), stopping active transition');
+ $(els).stop(true,true);
+ opts.busy = 0;
+ }
+ // don't begin another timeout-based transition if there is one active
+ if (opts.busy) {
+ debug('transition active, ignoring new tx request');
+ return;
+ }
+
+ var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
+
+ // stop cycling if we have an outstanding stop request
+ if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
+ return;
+
+ // check to see if we should stop cycling based on autostop options
+ if (!manual && !p.cyclePause && !opts.bounce &&
+ ((opts.autostop && (--opts.countdown <= 0)) ||
+ (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
+ if (opts.end)
+ opts.end(opts);
+ return;
+ }
+
+ // if slideshow is paused, only transition on a manual trigger
+ var changed = false;
+ if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
+ changed = true;
+ var fx = opts.fx;
+ // keep trying to get the slide size if we don't have it yet
+ curr.cycleH = curr.cycleH || $(curr).height();
+ curr.cycleW = curr.cycleW || $(curr).width();
+ next.cycleH = next.cycleH || $(next).height();
+ next.cycleW = next.cycleW || $(next).width();
+
+ // support multiple transition types
+ if (opts.multiFx) {
+ if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length))
+ opts.lastFx = 0;
+ else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0))
+ opts.lastFx = opts.fxs.length - 1;
+ fx = opts.fxs[opts.lastFx];
+ }
+
+ // one-time fx overrides apply to: $('div').cycle(3,'zoom');
+ if (opts.oneTimeFx) {
+ fx = opts.oneTimeFx;
+ opts.oneTimeFx = null;
+ }
+
+ $.fn.cycle.resetState(opts, fx);
+
+ // run the before callbacks
+ if (opts.before.length)
+ $.each(opts.before, function(i,o) {
+ if (p.cycleStop != opts.stopCount) return;
+ o.apply(next, [curr, next, opts, fwd]);
+ });
+
+ // stage the after callacks
+ var after = function() {
+ opts.busy = 0;
+ $.each(opts.after, function(i,o) {
+ if (p.cycleStop != opts.stopCount) return;
+ o.apply(next, [curr, next, opts, fwd]);
+ });
+ if (!p.cycleStop) {
+ // queue next transition
+ queueNext();
+ }
+ };
+
+ debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
+
+ // get ready to perform the transition
+ opts.busy = 1;
+ if (opts.fxFn) // fx function provided?
+ opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+ else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
+ $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+ else
+ $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
+ }
+ else {
+ queueNext();
+ }
+
+ if (changed || opts.nextSlide == opts.currSlide) {
+ // calculate the next slide
+ opts.lastSlide = opts.currSlide;
+ if (opts.random) {
+ opts.currSlide = opts.nextSlide;
+ if (++opts.randomIndex == els.length) {
+ opts.randomIndex = 0;
+ opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
+ }
+ opts.nextSlide = opts.randomMap[opts.randomIndex];
+ if (opts.nextSlide == opts.currSlide)
+ opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
+ }
+ else if (opts.backwards) {
+ var roll = (opts.nextSlide - 1) < 0;
+ if (roll && opts.bounce) {
+ opts.backwards = !opts.backwards;
+ opts.nextSlide = 1;
+ opts.currSlide = 0;
+ }
+ else {
+ opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
+ opts.currSlide = roll ? 0 : opts.nextSlide+1;
+ }
+ }
+ else { // sequence
+ var roll = (opts.nextSlide + 1) == els.length;
+ if (roll && opts.bounce) {
+ opts.backwards = !opts.backwards;
+ opts.nextSlide = els.length-2;
+ opts.currSlide = els.length-1;
+ }
+ else {
+ opts.nextSlide = roll ? 0 : opts.nextSlide+1;
+ opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
+ }
+ }
+ }
+ if (changed && opts.pager)
+ opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
+
+ function queueNext() {
+ // stage the next transition
+ var ms = 0, timeout = opts.timeout;
+ if (opts.timeout && !opts.continuous) {
+ ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
+ if (opts.fx == 'shuffle')
+ ms -= opts.speedOut;
+ }
+ else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
+ ms = 10;
+ if (ms > 0)
+ p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms);
+ }
+};
+
+// invoked after transition
+$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
+ $(pager).each(function() {
+ $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
+ });
+};
+
+// calculate timeout value for current transition
+function getTimeout(curr, next, opts, fwd) {
+ if (opts.timeoutFn) {
+ // call user provided calc fn
+ var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
+ while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
+ t += opts.speed;
+ debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
+ if (t !== false)
+ return t;
+ }
+ return opts.timeout;
+};
+
+// expose next/prev function, caller must pass in state
+$.fn.cycle.next = function(opts) { advance(opts,1); };
+$.fn.cycle.prev = function(opts) { advance(opts,0);};
+
+// advance slide forward or back
+function advance(opts, moveForward) {
+ var val = moveForward ? 1 : -1;
+ var els = opts.elements;
+ var p = opts.$cont[0], timeout = p.cycleTimeout;
+ if (timeout) {
+ clearTimeout(timeout);
+ p.cycleTimeout = 0;
+ }
+ if (opts.random && val < 0) {
+ // move back to the previously display slide
+ opts.randomIndex--;
+ if (--opts.randomIndex == -2)
+ opts.randomIndex = els.length-2;
+ else if (opts.randomIndex == -1)
+ opts.randomIndex = els.length-1;
+ opts.nextSlide = opts.randomMap[opts.randomIndex];
+ }
+ else if (opts.random) {
+ opts.nextSlide = opts.randomMap[opts.randomIndex];
+ }
+ else {
+ opts.nextSlide = opts.currSlide + val;
+ if (opts.nextSlide < 0) {
+ if (opts.nowrap) return false;
+ opts.nextSlide = els.length - 1;
+ }
+ else if (opts.nextSlide >= els.length) {
+ if (opts.nowrap) return false;
+ opts.nextSlide = 0;
+ }
+ }
+
+ var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
+ if ($.isFunction(cb))
+ cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
+ go(els, opts, 1, moveForward);
+ return false;
+};
+
+function buildPager(els, opts) {
+ var $p = $(opts.pager);
+ $.each(els, function(i,o) {
+ $.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
+ });
+ opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
+};
+
+$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
+ var a;
+ if ($.isFunction(opts.pagerAnchorBuilder)) {
+ a = opts.pagerAnchorBuilder(i,el);
+ debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
+ }
+ else
+ a = '<a href="#">'+(i+1)+'</a>';
+
+ if (!a)
+ return;
+ var $a = $(a);
+ // don't reparent if anchor is in the dom
+ if ($a.parents('body').length === 0) {
+ var arr = [];
+ if ($p.length > 1) {
+ $p.each(function() {
+ var $clone = $a.clone(true);
+ $(this).append($clone);
+ arr.push($clone[0]);
+ });
+ $a = $(arr);
+ }
+ else {
+ $a.appendTo($p);
+ }
+ }
+
+ opts.pagerAnchors = opts.pagerAnchors || [];
+ opts.pagerAnchors.push($a);
+
+ var pagerFn = function(e) {
+ e.preventDefault();
+ opts.nextSlide = i;
+ var p = opts.$cont[0], timeout = p.cycleTimeout;
+ if (timeout) {
+ clearTimeout(timeout);
+ p.cycleTimeout = 0;
+ }
+ var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
+ if ($.isFunction(cb))
+ cb(opts.nextSlide, els[opts.nextSlide]);
+ go(els,opts,1,opts.currSlide < i); // trigger the trans
+// return false; // <== allow bubble
+ }
+
+ if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
+ $a.hover(pagerFn, function(){/* no-op */} );
+ }
+ else {
+ $a.bind(opts.pagerEvent, pagerFn);
+ }
+
+ if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
+ $a.bind('click.cycle', function(){return false;}); // suppress click
+
+ var cont = opts.$cont[0];
+ var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
+ if (opts.pauseOnPagerHover) {
+ $a.hover(
+ function() {
+ pauseFlag = true;
+ cont.cyclePause++;
+ triggerPause(cont,true,true);
+ }, function() {
+ pauseFlag && cont.cyclePause--;
+ triggerPause(cont,true,true);
+ }
+ );
+ }
+};
+
+// helper fn to calculate the number of slides between the current and the next
+$.fn.cycle.hopsFromLast = function(opts, fwd) {
+ var hops, l = opts.lastSlide, c = opts.currSlide;
+ if (fwd)
+ hops = c > l ? c - l : opts.slideCount - l;
+ else
+ hops = c < l ? l - c : l + opts.slideCount - c;
+ return hops;
+};
+
+// fix clearType problems in ie6 by setting an explicit bg color
+// (otherwise text slides look horrible during a fade transition)
+function clearTypeFix($slides) {
+ debug('applying clearType background-color hack');
+ function hex(s) {
+ s = parseInt(s,10).toString(16);
+ return s.length < 2 ? '0'+s : s;
+ };
+ function getBg(e) {
+ for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
+ var v = $.css(e,'background-color');
+ if (v && v.indexOf('rgb') >= 0 ) {
+ var rgb = v.match(/\d+/g);
+ return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
+ }
+ if (v && v != 'transparent')
+ return v;
+ }
+ return '#ffffff';
+ };
+ $slides.each(function() { $(this).css('background-color', getBg(this)); });
+};
+
+// reset common props before the next transition
+$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
+ $(opts.elements).not(curr).hide();
+ if (typeof opts.cssBefore.opacity == 'undefined')
+ opts.cssBefore.opacity = 1;
+ opts.cssBefore.display = 'block';
+ if (opts.slideResize && w !== false && next.cycleW > 0)
+ opts.cssBefore.width = next.cycleW;
+ if (opts.slideResize && h !== false && next.cycleH > 0)
+ opts.cssBefore.height = next.cycleH;
+ opts.cssAfter = opts.cssAfter || {};
+ opts.cssAfter.display = 'none';
+ $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
+ $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
+};
+
+// the actual fn for effecting a transition
+$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
+ var $l = $(curr), $n = $(next);
+ var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
+ $n.css(opts.cssBefore);
+ if (speedOverride) {
+ if (typeof speedOverride == 'number')
+ speedIn = speedOut = speedOverride;
+ else
+ speedIn = speedOut = 1;
+ easeIn = easeOut = null;
+ }
+ var fn = function() {
+ $n.animate(opts.animIn, speedIn, easeIn, function() {
+ cb();
+ });
+ };
+ $l.animate(opts.animOut, speedOut, easeOut, function() {
+ $l.css(opts.cssAfter);
+ if (!opts.sync)
+ fn();
+ });
+ if (opts.sync) fn();
+};
+
+// transition definitions - only fade is defined here, transition pack defines the rest
+$.fn.cycle.transitions = {
+ fade: function($cont, $slides, opts) {
+ $slides.not(':eq('+opts.currSlide+')').css('opacity',0);
+ opts.before.push(function(curr,next,opts) {
+ $.fn.cycle.commonReset(curr,next,opts);
+ opts.cssBefore.opacity = 0;
+ });
+ opts.animIn = { opacity: 1 };
+ opts.animOut = { opacity: 0 };
+ opts.cssBefore = { top: 0, left: 0 };
+ }
+};
+
+$.fn.cycle.ver = function() { return ver; };
+
+// override these globally if you like (they are all optional)
+$.fn.cycle.defaults = {
+ activePagerClass: 'activeSlide', // class name used for the active pager link
+ after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag)
+ allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
+ animIn: null, // properties that define how the slide animates in
+ animOut: null, // properties that define how the slide animates out
+ aspect: false, // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
+ autostop: 0, // true to end slideshow after X transitions (where X == slide count)
+ autostopCount: 0, // number of transitions (optionally used with autostop to define X)
+ backwards: false, // true to start slideshow at last slide and move backwards through the stack
+ before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag)
+ center: null, // set to true to have cycle add top/left margin to each slide (use with width and height options)
+ cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE)
+ cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
+ containerResize: 1, // resize container to fit largest slide
+ continuous: 0, // true to start next transition immediately after current one completes
+ cssAfter: null, // properties that defined the state of the slide after transitioning out
+ cssBefore: null, // properties that define the initial state of the slide before transitioning in
+ delay: 0, // additional delay (in ms) for first transition (hint: can be negative)
+ easeIn: null, // easing for "in" transition
+ easeOut: null, // easing for "out" transition
+ easing: null, // easing method for both in and out transitions
+ end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
+ fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
+ fit: 0, // force slides to fit container
+ fx: 'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
+ fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
+ height: 'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well)
+ manualTrump: true, // causes manual transition to stop an active transition instead of being ignored
+ metaAttr: 'cycle',// data- attribute that holds the option data for the slideshow
+ next: null, // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
+ nowrap: 0, // true to prevent slideshow from wrapping
+ onPagerEvent: null, // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
+ onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
+ pager: null, // element, jQuery object, or jQuery selector string for the element to use as pager container
+ pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement)
+ pagerEvent: 'click.cycle', // name of event which drives the pager navigation
+ pause: 0, // true to enable "pause on hover"
+ pauseOnPagerHover: 0, // true to pause when hovering over pager link
+ prev: null, // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
+ prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide
+ random: 0, // true for random, false for sequence (not applicable to shuffle fx)
+ randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random
+ requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
+ requeueTimeout: 250, // ms delay for requeue
+ rev: 0, // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
+ shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 }
+ skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
+ slideExpr: null, // expression for selecting slides (if something other than all children is required)
+ slideResize: 1, // force slide width/height to fixed size before every transition
+ speed: 1000, // speed of the transition (any valid fx speed value)
+ speedIn: null, // speed of the 'in' transition
+ speedOut: null, // speed of the 'out' transition
+ startingSlide: undefined, // zero-based index of the first slide to be displayed
+ sync: 1, // true if in/out transitions should occur simultaneously
+ timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance)
+ timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag)
+ updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style)
+ width: null // container width (if the 'fit' option is true, the slides will be set to this width as well)
+};
+
+})(jQuery);
+
+
+/*!
+ * jQuery Cycle Plugin Transition Definitions
+ * This script is a plugin for the jQuery Cycle Plugin
+ * Examples and documentation at: http://malsup.com/jquery/cycle/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Version: 2.73
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+(function($) {
+
+//
+// These functions define slide initialization and properties for the named
+// transitions. To save file size feel free to remove any of these that you
+// don't need.
+//
+$.fn.cycle.transitions.none = function($cont, $slides, opts) {
+ opts.fxFn = function(curr,next,opts,after){
+ $(next).show();
+ $(curr).hide();
+ after();
+ };
+};
+
+// not a cross-fade, fadeout only fades out the top slide
+$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
+ $slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
+ opts.before.push(function(curr,next,opts,w,h,rev) {
+ $(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0));
+ $(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1));
+ });
+ opts.animIn.opacity = 1;
+ opts.animOut.opacity = 0;
+ opts.cssBefore.opacity = 1;
+ opts.cssBefore.display = 'block';
+ opts.cssAfter.zIndex = 0;
+};
+
+// scrollUp/Down/Left/Right
+$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
+ $cont.css('overflow','hidden');
+ opts.before.push($.fn.cycle.commonReset);
+ var h = $cont.height();
+ opts.cssBefore.top = h;
+ opts.cssBefore.left = 0;
+ opts.cssFirst.top = 0;
+ opts.animIn.top = 0;
+ opts.animOut.top = -h;
+};
+$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
+ $cont.css('overflow','hidden');
+ opts.before.push($.fn.cycle.commonReset);
+ var h = $cont.height();
+ opts.cssFirst.top = 0;
+ opts.cssBefore.top = -h;
+ opts.cssBefore.left = 0;
+ opts.animIn.top = 0;
+ opts.animOut.top = h;
+};
+$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
+ $cont.css('overflow','hidden');
+ opts.before.push($.fn.cycle.commonReset);
+ var w = $cont.width();
+ opts.cssFirst.left = 0;
+ opts.cssBefore.left = w;
+ opts.cssBefore.top = 0;
+ opts.animIn.left = 0;
+ opts.animOut.left = 0-w;
+};
+$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
+ $cont.css('overflow','hidden');
+ opts.before.push($.fn.cycle.commonReset);
+ var w = $cont.width();
+ opts.cssFirst.left = 0;
+ opts.cssBefore.left = -w;
+ opts.cssBefore.top = 0;
+ opts.animIn.left = 0;
+ opts.animOut.left = w;
+};
+$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
+ $cont.css('overflow','hidden').width();
+ opts.before.push(function(curr, next, opts, fwd) {
+ if (opts.rev)
+ fwd = !fwd;
+ $.fn.cycle.commonReset(curr,next,opts);
+ opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
+ opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
+ });
+ opts.cssFirst.left = 0;
+ opts.cssBefore.top = 0;
+ opts.animIn.left = 0;
+ opts.animOut.top = 0;
+};
+$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
+ $cont.css('overflow','hidden');
+ opts.before.push(function(curr, next, opts, fwd) {
+ if (opts.rev)
+ fwd = !fwd;
+ $.fn.cycle.commonReset(curr,next,opts);
+ opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
+ opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
+ });
+ opts.cssFirst.top = 0;
+ opts.cssBefore.left = 0;
+ opts.animIn.top = 0;
+ opts.animOut.left = 0;
+};
+
+// slideX/slideY
+$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $(opts.elements).not(curr).hide();
+ $.fn.cycle.commonReset(curr,next,opts,false,true);
+ opts.animIn.width = next.cycleW;
+ });
+ opts.cssBefore.left = 0;
+ opts.cssBefore.top = 0;
+ opts.cssBefore.width = 0;
+ opts.animIn.width = 'show';
+ opts.animOut.width = 0;
+};
+$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $(opts.elements).not(curr).hide();
+ $.fn.cycle.commonReset(curr,next,opts,true,false);
+ opts.animIn.height = next.cycleH;
+ });
+ opts.cssBefore.left = 0;
+ opts.cssBefore.top = 0;
+ opts.cssBefore.height = 0;
+ opts.animIn.height = 'show';
+ opts.animOut.height = 0;
+};
+
+// shuffle
+$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
+ var i, w = $cont.css('overflow', 'visible').width();
+ $slides.css({left: 0, top: 0});
+ opts.before.push(function(curr,next,opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,true,true);
+ });
+ // only adjust speed once!
+ if (!opts.speedAdjusted) {
+ opts.speed = opts.speed / 2; // shuffle has 2 transitions
+ opts.speedAdjusted = true;
+ }
+ opts.random = 0;
+ opts.shuffle = opts.shuffle || {left:-w, top:15};
+ opts.els = [];
+ for (i=0; i < $slides.length; i++)
+ opts.els.push($slides[i]);
+
+ for (i=0; i < opts.currSlide; i++)
+ opts.els.push(opts.els.shift());
+
+ // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
+ opts.fxFn = function(curr, next, opts, cb, fwd) {
+ if (opts.rev)
+ fwd = !fwd;
+ var $el = fwd ? $(curr) : $(next);
+ $(next).css(opts.cssBefore);
+ var count = opts.slideCount;
+ $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
+ var hops = $.fn.cycle.hopsFromLast(opts, fwd);
+ for (var k=0; k < hops; k++)
+ fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
+ if (fwd) {
+ for (var i=0, len=opts.els.length; i < len; i++)
+ $(opts.els[i]).css('z-index', len-i+count);
+ }
+ else {
+ var z = $(curr).css('z-index');
+ $el.css('z-index', parseInt(z,10)+1+count);
+ }
+ $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
+ $(fwd ? this : curr).hide();
+ if (cb) cb();
+ });
+ });
+ };
+ $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
+};
+
+// turnUp/Down/Left/Right
+$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,false);
+ opts.cssBefore.top = next.cycleH;
+ opts.animIn.height = next.cycleH;
+ opts.animOut.width = next.cycleW;
+ });
+ opts.cssFirst.top = 0;
+ opts.cssBefore.left = 0;
+ opts.cssBefore.height = 0;
+ opts.animIn.top = 0;
+ opts.animOut.height = 0;
+};
+$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,false);
+ opts.animIn.height = next.cycleH;
+ opts.animOut.top = curr.cycleH;
+ });
+ opts.cssFirst.top = 0;
+ opts.cssBefore.left = 0;
+ opts.cssBefore.top = 0;
+ opts.cssBefore.height = 0;
+ opts.animOut.height = 0;
+};
+$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,false,true);
+ opts.cssBefore.left = next.cycleW;
+ opts.animIn.width = next.cycleW;
+ });
+ opts.cssBefore.top = 0;
+ opts.cssBefore.width = 0;
+ opts.animIn.left = 0;
+ opts.animOut.width = 0;
+};
+$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,false,true);
+ opts.animIn.width = next.cycleW;
+ opts.animOut.left = curr.cycleW;
+ });
+ $.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
+ opts.animIn.left = 0;
+ opts.animOut.width = 0;
+};
+
+// zoom
+$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,false,false,true);
+ opts.cssBefore.top = next.cycleH/2;
+ opts.cssBefore.left = next.cycleW/2;
+ $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
+ $.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
+ });
+ opts.cssFirst.top = 0;
+ opts.cssFirst.left = 0;
+ opts.cssBefore.width = 0;
+ opts.cssBefore.height = 0;
+};
+
+// fadeZoom
+$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,false,false);
+ opts.cssBefore.left = next.cycleW/2;
+ opts.cssBefore.top = next.cycleH/2;
+ $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
+ });
+ opts.cssBefore.width = 0;
+ opts.cssBefore.height = 0;
+ opts.animOut.opacity = 0;
+};
+
+// blindX
+$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
+ var w = $cont.css('overflow','hidden').width();
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts);
+ opts.animIn.width = next.cycleW;
+ opts.animOut.left = curr.cycleW;
+ });
+ opts.cssBefore.left = w;
+ opts.cssBefore.top = 0;
+ opts.animIn.left = 0;
+ opts.animOut.left = w;
+};
+// blindY
+$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
+ var h = $cont.css('overflow','hidden').height();
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts);
+ opts.animIn.height = next.cycleH;
+ opts.animOut.top = curr.cycleH;
+ });
+ opts.cssBefore.top = h;
+ opts.cssBefore.left = 0;
+ opts.animIn.top = 0;
+ opts.animOut.top = h;
+};
+// blindZ
+$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
+ var h = $cont.css('overflow','hidden').height();
+ var w = $cont.width();
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts);
+ opts.animIn.height = next.cycleH;
+ opts.animOut.top = curr.cycleH;
+ });
+ opts.cssBefore.top = h;
+ opts.cssBefore.left = w;
+ opts.animIn.top = 0;
+ opts.animIn.left = 0;
+ opts.animOut.top = h;
+ opts.animOut.left = w;
+};
+
+// growX - grow horizontally from centered 0 width
+$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,false,true);
+ opts.cssBefore.left = this.cycleW/2;
+ opts.animIn.left = 0;
+ opts.animIn.width = this.cycleW;
+ opts.animOut.left = 0;
+ });
+ opts.cssBefore.top = 0;
+ opts.cssBefore.width = 0;
+};
+// growY - grow vertically from centered 0 height
+$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,false);
+ opts.cssBefore.top = this.cycleH/2;
+ opts.animIn.top = 0;
+ opts.animIn.height = this.cycleH;
+ opts.animOut.top = 0;
+ });
+ opts.cssBefore.height = 0;
+ opts.cssBefore.left = 0;
+};
+
+// curtainX - squeeze in both edges horizontally
+$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,false,true,true);
+ opts.cssBefore.left = next.cycleW/2;
+ opts.animIn.left = 0;
+ opts.animIn.width = this.cycleW;
+ opts.animOut.left = curr.cycleW/2;
+ opts.animOut.width = 0;
+ });
+ opts.cssBefore.top = 0;
+ opts.cssBefore.width = 0;
+};
+// curtainY - squeeze in both edges vertically
+$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,false,true);
+ opts.cssBefore.top = next.cycleH/2;
+ opts.animIn.top = 0;
+ opts.animIn.height = next.cycleH;
+ opts.animOut.top = curr.cycleH/2;
+ opts.animOut.height = 0;
+ });
+ opts.cssBefore.height = 0;
+ opts.cssBefore.left = 0;
+};
+
+// cover - curr slide covered by next slide
+$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
+ var d = opts.direction || 'left';
+ var w = $cont.css('overflow','hidden').width();
+ var h = $cont.height();
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts);
+ if (d == 'right')
+ opts.cssBefore.left = -w;
+ else if (d == 'up')
+ opts.cssBefore.top = h;
+ else if (d == 'down')
+ opts.cssBefore.top = -h;
+ else
+ opts.cssBefore.left = w;
+ });
+ opts.animIn.left = 0;
+ opts.animIn.top = 0;
+ opts.cssBefore.top = 0;
+ opts.cssBefore.left = 0;
+};
+
+// uncover - curr slide moves off next slide
+$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
+ var d = opts.direction || 'left';
+ var w = $cont.css('overflow','hidden').width();
+ var h = $cont.height();
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,true,true);
+ if (d == 'right')
+ opts.animOut.left = w;
+ else if (d == 'up')
+ opts.animOut.top = -h;
+ else if (d == 'down')
+ opts.animOut.top = h;
+ else
+ opts.animOut.left = -w;
+ });
+ opts.animIn.left = 0;
+ opts.animIn.top = 0;
+ opts.cssBefore.top = 0;
+ opts.cssBefore.left = 0;
+};
+
+// toss - move top slide and fade away
+$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
+ var w = $cont.css('overflow','visible').width();
+ var h = $cont.height();
+ opts.before.push(function(curr, next, opts) {
+ $.fn.cycle.commonReset(curr,next,opts,true,true,true);
+ // provide default toss settings if animOut not provided
+ if (!opts.animOut.left && !opts.animOut.top)
+ $.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
+ else
+ opts.animOut.opacity = 0;
+ });
+ opts.cssBefore.left = 0;
+ opts.cssBefore.top = 0;
+ opts.animIn.left = 0;
+};
+
+// wipe - clip animation
+$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
+ var w = $cont.css('overflow','hidden').width();
+ var h = $cont.height();
+ opts.cssBefore = opts.cssBefore || {};
+ var clip;
+ if (opts.clip) {
+ if (/l2r/.test(opts.clip))
+ clip = 'rect(0px 0px '+h+'px 0px)';
+ else if (/r2l/.test(opts.clip))
+ clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
+ else if (/t2b/.test(opts.clip))
+ clip = 'rect(0px '+w+'px 0px 0px)';
+ else if (/b2t/.test(opts.clip))
+ clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
+ else if (/zoom/.test(opts.clip)) {
+ var top = parseInt(h/2,10);
+ var left = parseInt(w/2,10);
+ clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
+ }
+ }
+
+ opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
+
+ var d = opts.cssBefore.clip.match(/(\d+)/g);
+ var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
+
+ opts.before.push(function(curr, next, opts) {
+ if (curr == next) return;
+ var $curr = $(curr), $next = $(next);
+ $.fn.cycle.commonReset(curr,next,opts,true,true,false);
+ opts.cssAfter.display = 'block';
+
+ var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
+ (function f() {
+ var tt = t ? t - parseInt(step * (t/count),10) : 0;
+ var ll = l ? l - parseInt(step * (l/count),10) : 0;
+ var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
+ var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
+ $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
+ (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
+ })();
+ });
+ $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
+ opts.animIn = { left: 0 };
+ opts.animOut = { left: 0 };
+};
+
+})(jQuery);
diff --git a/resources/jquery/jquery.expandableField.js b/resources/jquery/jquery.expandableField.js
index ebe29a41..3c65d016 100644
--- a/resources/jquery/jquery.expandableField.js
+++ b/resources/jquery/jquery.expandableField.js
@@ -1,5 +1,5 @@
/**
- * This plugin provides functionallity to expand a text box on focus to double it's current width
+ * This plugin provides functionality to expand a text box on focus to double it's current width
*
* Usage:
*
diff --git a/resources/jquery/jquery.farbtastic.css b/resources/jquery/jquery.farbtastic.css
new file mode 100644
index 00000000..1c6428f8
--- /dev/null
+++ b/resources/jquery/jquery.farbtastic.css
@@ -0,0 +1,54 @@
+/**
+ * Farbtastic Color Picker 1.2
+ * © 2008 Steven Wittens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+.farbtastic {
+ position: relative;
+}
+.farbtastic * {
+ position: absolute;
+ cursor: crosshair;
+}
+.farbtastic, .farbtastic .wheel {
+ width: 195px;
+ height: 195px;
+}
+.farbtastic .color, .farbtastic .overlay {
+ top: 47px;
+ left: 47px;
+ width: 101px;
+ height: 101px;
+}
+.farbtastic .wheel {
+ /* @embed */
+ background: url(images/wheel.png) no-repeat;
+ width: 195px;
+ height: 195px;
+}
+.farbtastic .overlay {
+ /* @embed */
+ background: url(images/mask.png) no-repeat;
+}
+.farbtastic .marker {
+ width: 17px;
+ height: 17px;
+ margin: -8px 0 0 -8px;
+ overflow: hidden;
+ /* @embed */
+ background: url(images/marker.png) no-repeat;
+}
+
diff --git a/resources/jquery/jquery.farbtastic.js b/resources/jquery/jquery.farbtastic.js
new file mode 100644
index 00000000..18810857
--- /dev/null
+++ b/resources/jquery/jquery.farbtastic.js
@@ -0,0 +1,286 @@
+/**
+ * Farbtastic Color Picker 1.2
+ * © 2008 Steven Wittens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+//Adapted to uniform style with jQuery UI widgets and slightly change behavior
+//TODO:
+// - remove duplicated code by replacing it with jquery.colorUtils and modern jQuery
+// - uniform code style
+
+jQuery.fn.farbtastic = function (callback) {
+ $.farbtastic(this, callback);
+ return this;
+};
+
+jQuery.farbtastic = function (container, callback) {
+ var container = $(container).get(0);
+ return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
+}
+
+jQuery._farbtastic = function (container, callback) {
+ // Store farbtastic object
+ var fb = this;
+
+ // Insert markup
+ $(container).html('<div class="farbtastic ui-widget-content"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
+ $(container).addClass('ui-widget');
+ var e = $('.farbtastic', container);
+ fb.wheel = $('.wheel', container).get(0);
+ // Dimensions
+ fb.radius = 84;
+ fb.square = 100;
+ fb.width = 194;
+
+ // Fix background PNGs in IE6
+ if (navigator.appVersion.match(/MSIE [0-6]\./)) {
+ $('*', e).each(function () {
+ if (this.currentStyle.backgroundImage != 'none') {
+ var image = this.currentStyle.backgroundImage;
+ image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
+ $(this).css({
+ 'backgroundImage': 'none',
+ 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+ });
+ }
+ });
+ }
+
+ /**
+ * Link to the given element(s) or callback.
+ */
+ fb.linkTo = function (callback) {
+ // Unbind previous nodes
+ if (typeof fb.callback == 'object') {
+ $(fb.callback).unbind('keyup', fb.updateValue);
+ }
+
+ // Reset color
+ fb.color = null;
+
+ // Bind callback or elements
+ if (typeof callback == 'function') {
+ fb.callback = callback;
+ }
+ else if (typeof callback == 'object' || typeof callback == 'string') {
+ fb.callback = $(callback);
+ fb.callback.bind('keyup', fb.updateValue);
+ if (fb.callback.get(0).value) {
+ fb.setColor(fb.callback.get(0).value);
+ }
+ }
+ return this;
+ }
+ fb.updateValue = function (event) {
+ if (this.value != fb.color) {
+ fb.setColor(this.value);
+ }
+ }
+
+ /**
+ * Change color with HTML syntax #123456
+ */
+ fb.setColor = function (color) {
+ var rgb = $.colorUtil.getRGB( color );
+ if (fb.color != color && rgb) {
+ rgb = rgb.slice( 0 ); //make a clone
+ //TODO: rewrite code so that this is not needed
+ rgb[0] /= 255;
+ rgb[1] /= 255;
+ rgb[2] /= 255;
+ fb.color = color;
+ fb.rgb = rgb;
+ fb.hsl = fb.RGBToHSL(fb.rgb);
+ fb.updateDisplay();
+ }
+ return this;
+ }
+
+ /**
+ * Change color with HSL triplet [0..1, 0..1, 0..1]
+ */
+ fb.setHSL = function (hsl) {
+ fb.hsl = hsl;
+ fb.rgb = fb.HSLToRGB(hsl);
+ fb.color = fb.pack(fb.rgb);
+ fb.updateDisplay();
+ return this;
+ }
+
+ /////////////////////////////////////////////////////
+
+ /**
+ * Retrieve the coordinates of the given event relative to the center
+ * of the widget.
+ */
+ fb.widgetCoords = function (event) {
+ var ref = $( fb.wheel ).offset();
+ return {
+ x: event.pageX - ref.left - fb.width / 2,
+ y: event.pageY - ref.top - fb.width / 2
+ };
+ }
+
+ /**
+ * Mousedown handler
+ */
+ fb.mousedown = function (event) {
+ // Capture mouse
+ if (!document.dragging) {
+ $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
+ document.dragging = true;
+ }
+
+ // Check which area is being dragged
+ var pos = fb.widgetCoords(event);
+ fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;
+
+ // Process
+ fb.mousemove(event);
+ return false;
+ }
+
+ /**
+ * Mousemove handler
+ */
+ fb.mousemove = function (event) {
+ // Get coordinates relative to color picker center
+ var pos = fb.widgetCoords(event);
+
+ // Set new HSL parameters
+ if (fb.circleDrag) {
+ var hue = Math.atan2(pos.x, -pos.y) / 6.28;
+ if (hue < 0) hue += 1;
+ fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
+ }
+ else {
+ var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
+ var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
+ fb.setHSL([fb.hsl[0], sat, lum]);
+ }
+ return false;
+ }
+
+ /**
+ * Mouseup handler
+ */
+ fb.mouseup = function () {
+ // Uncapture mouse
+ $(document).unbind('mousemove', fb.mousemove);
+ $(document).unbind('mouseup', fb.mouseup);
+ document.dragging = false;
+ }
+
+ /**
+ * Update the markers and styles
+ */
+ fb.updateDisplay = function () {
+ // Markers
+ var angle = fb.hsl[0] * 6.28;
+ $('.h-marker', e).css({
+ left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
+ top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
+ });
+
+ $('.sl-marker', e).css({
+ left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
+ top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
+ });
+
+ // Saturation/Luminance gradient
+ $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));
+
+ // Linked elements or callback
+ if (typeof fb.callback == 'object') {
+ // Set background/foreground color
+ $(fb.callback).css({
+ backgroundColor: fb.color,
+ color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
+ });
+
+ // Change linked value
+ $(fb.callback).each(function() {
+ if ( $( this ).val() != fb.color) {
+ $( this ).val( fb.color ).change();
+ }
+ });
+ }
+ else if (typeof fb.callback == 'function') {
+ fb.callback.call(fb, fb.color);
+ }
+ }
+
+ /* Various color utility functions */
+ fb.pack = function (rgb) {
+ var r = Math.round(rgb[0] * 255);
+ var g = Math.round(rgb[1] * 255);
+ var b = Math.round(rgb[2] * 255);
+ return '#' + (r < 16 ? '0' : '') + r.toString(16) +
+ (g < 16 ? '0' : '') + g.toString(16) +
+ (b < 16 ? '0' : '') + b.toString(16);
+ }
+
+ fb.HSLToRGB = function (hsl) {
+ var m1, m2, r, g, b;
+ var h = hsl[0], s = hsl[1], l = hsl[2];
+ m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
+ m1 = l * 2 - m2;
+ return [this.hueToRGB(m1, m2, h+0.33333),
+ this.hueToRGB(m1, m2, h),
+ this.hueToRGB(m1, m2, h-0.33333)];
+ }
+
+ fb.hueToRGB = function (m1, m2, h) {
+ h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
+ if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
+ if (h * 2 < 1) return m2;
+ if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
+ return m1;
+ }
+
+ fb.RGBToHSL = function (rgb) {
+ var min, max, delta, h, s, l;
+ var r = rgb[0], g = rgb[1], b = rgb[2];
+ min = Math.min(r, Math.min(g, b));
+ max = Math.max(r, Math.max(g, b));
+ delta = max - min;
+ l = (min + max) / 2;
+ s = 0;
+ if (l > 0 && l < 1) {
+ s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
+ }
+ h = 0;
+ if (delta > 0) {
+ if (max == r && max != g) h += (g - b) / delta;
+ if (max == g && max != b) h += (2 + (b - r) / delta);
+ if (max == b && max != r) h += (4 + (r - g) / delta);
+ h /= 6;
+ }
+ return [h, s, l];
+ }
+
+ // Install mousedown handler (the others are set on the document on-demand)
+ $('*', e).mousedown(fb.mousedown);
+
+ // Init color
+ fb.setColor('#000000');
+
+ // Set linked elements/callback
+ if (callback) {
+ fb.linkTo(callback);
+ }
+}
diff --git a/resources/jquery/jquery.footHovzer.css b/resources/jquery/jquery.footHovzer.css
new file mode 100644
index 00000000..77d9514c
--- /dev/null
+++ b/resources/jquery/jquery.footHovzer.css
@@ -0,0 +1,6 @@
+#jquery-foot-hovzer {
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ z-index: 1000;
+}
diff --git a/resources/jquery/jquery.footHovzer.js b/resources/jquery/jquery.footHovzer.js
new file mode 100644
index 00000000..56fc32d4
--- /dev/null
+++ b/resources/jquery/jquery.footHovzer.js
@@ -0,0 +1,45 @@
+/**
+ * Utility to stack stuff in an overlay fixed on the bottom of the page.
+ *
+ * Usage:
+ * <code>
+ * var hovzer = $.getFootHovzer();
+ * hovzer.$.append( $myCollection );
+ * hovzer.update();
+ * </code>
+ *
+ * @author Timo Tijhof, 2012
+ */
+( function ( $ ) {
+ var $hovzer, footHovzer, prevHeight, newHeight;
+
+ function getHovzer() {
+ if ( $hovzer === undefined ) {
+ $hovzer = $( '<div id="jquery-foot-hovzer"></div>' ).appendTo( 'body' );
+ }
+ return $hovzer;
+ }
+
+ footHovzer = {
+ update: function () {
+ var $body;
+
+ $body = $( 'body' );
+ if ( prevHeight === undefined ) {
+ prevHeight = getHovzer().outerHeight( /*includeMargin=*/true );
+ $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
+ } else {
+ newHeight = getHovzer().outerHeight( true );
+ $body.css( 'paddingBottom', ( parseFloat( $body.css( 'paddingBottom' ) ) - prevHeight ) + newHeight );
+
+ prevHeight = newHeight;
+ }
+ }
+ };
+
+ $.getFootHovzer = function () {
+ footHovzer.$ = getHovzer();
+ return footHovzer;
+ };
+
+}( jQuery ) );
diff --git a/resources/jquery/jquery.form.js b/resources/jquery/jquery.form.js
index 53c078f9..fdcdd15a 100644
--- a/resources/jquery/jquery.form.js
+++ b/resources/jquery/jquery.form.js
@@ -1,6 +1,6 @@
/*!
* jQuery Form Plugin
- * version: 2.52 (07-DEC-2010)
+ * version: 2.84 (12-AUG-2011)
* @requires jQuery v1.3.2 or later
*
* Examples and documentation at: http://malsup.com/jquery/form/
@@ -8,7 +8,7 @@
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
-(function($) {
+;(function($) {
/*
Usage Note:
@@ -49,22 +49,26 @@ $.fn.ajaxSubmit = function(options) {
log('ajaxSubmit: skipping submit process - no element selected');
return this;
}
+
+ var method, action, url, $form = this;
if (typeof options == 'function') {
options = { success: options };
}
- var action = this.attr('action');
- var url = (typeof action === 'string') ? $.trim(action) : '';
+ method = this.attr('method');
+ action = this.attr('action');
+ url = (typeof action === 'string') ? $.trim(action) : '';
+ url = url || window.location.href || '';
if (url) {
// clean url (don't include hash vaue)
url = (url.match(/^([^#]+)/)||[])[1];
}
- url = url || window.location.href || '';
options = $.extend(true, {
url: url,
- type: this.attr('method') || 'GET',
+ success: $.ajaxSettings.success,
+ type: method || 'GET',
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
}, options);
@@ -87,7 +91,7 @@ $.fn.ajaxSubmit = function(options) {
if (options.data) {
options.extraData = options.data;
for (n in options.data) {
- if(options.data[n] instanceof Array) {
+ if( $.isArray(options.data[n]) ) {
for (var k in options.data[n]) {
a.push( { name: n, value: options.data[n][k] } );
}
@@ -123,7 +127,7 @@ $.fn.ajaxSubmit = function(options) {
options.data = q; // data is the query string for 'post'
}
- var $form = this, callbacks = [];
+ var callbacks = [];
if (options.resetForm) {
callbacks.push(function() { $form.resetForm(); });
}
@@ -161,14 +165,20 @@ $.fn.ajaxSubmit = function(options) {
// hack to fix Safari hang (thanks to Tim Molendijk for this)
// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
if (options.closeKeepAlive) {
- $.get(options.closeKeepAlive, fileUpload);
+ $.get(options.closeKeepAlive, function() { fileUpload(a); });
}
else {
- fileUpload();
+ fileUpload(a);
}
}
else {
- $.ajax(options);
+ // IE7 massage (see issue 57)
+ if ($.browser.msie && method == 'get') {
+ var ieMeth = $form[0].getAttribute('method');
+ if (typeof ieMeth === 'string')
+ options.type = ieMeth;
+ }
+ $.ajax(options);
}
// fire 'notify' event
@@ -177,8 +187,17 @@ $.fn.ajaxSubmit = function(options) {
// private function for handling file uploads (hat tip to YAHOO!)
- function fileUpload() {
- var form = $form[0];
+ function fileUpload(a) {
+ var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
+ var useProp = !!$.fn.prop;
+
+ if (a) {
+ // ensure that every serialized input is still enabled
+ for (i=0; i < a.length; i++) {
+ el = $(form[a[i].name]);
+ el[ useProp ? 'prop' : 'attr' ]('disabled', false);
+ }
+ }
if ($(':input[name=submit],:input[id=submit]', form).length) {
// if there is an input with a name or id of 'submit' then we won't be
@@ -187,23 +206,25 @@ $.fn.ajaxSubmit = function(options) {
return;
}
- var s = $.extend(true, {}, $.ajaxSettings, options);
+ s = $.extend(true, {}, $.ajaxSettings, options);
s.context = s.context || s;
- var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
- window[fn] = function() {
- var f = $io.data('form-plugin-onload');
- if (f) {
- f();
- window[fn] = undefined;
- try { delete window[fn]; } catch(e){}
- }
- };
- var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" onload="window[\'_\'+this.id]()" />');
- var io = $io[0];
+ id = 'jqFormIO' + (new Date().getTime());
+ if (s.iframeTarget) {
+ $io = $(s.iframeTarget);
+ n = $io.attr('name');
+ if (n == null)
+ $io.attr('name', id);
+ else
+ id = n;
+ }
+ else {
+ $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
+ $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+ }
+ io = $io[0];
- $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
- var xhr = { // mock object
+ xhr = { // mock object
aborted: 0,
responseText: null,
responseXML: null,
@@ -212,13 +233,19 @@ $.fn.ajaxSubmit = function(options) {
getAllResponseHeaders: function() {},
getResponseHeader: function() {},
setRequestHeader: function() {},
- abort: function() {
+ abort: function(status) {
+ var e = (status === 'timeout' ? 'timeout' : 'aborted');
+ log('aborting upload... ' + e);
this.aborted = 1;
$io.attr('src', s.iframeSrc); // abort op in progress
+ xhr.error = e;
+ s.error && s.error.call(s.context, xhr, e, status);
+ g && $.event.trigger("ajaxError", [xhr, s, e]);
+ s.complete && s.complete.call(s.context, xhr, e);
}
};
- var g = s.global;
+ g = s.global;
// trigger ajax global events so that activity/block indicators work like normal
if (g && ! $.active++) {
$.event.trigger("ajaxStart");
@@ -228,7 +255,7 @@ $.fn.ajaxSubmit = function(options) {
}
if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
- if (s.global) {
+ if (s.global) {
$.active--;
}
return;
@@ -237,13 +264,10 @@ $.fn.ajaxSubmit = function(options) {
return;
}
- var cbInvoked = false;
- var timedOut = 0;
-
// add submitting element to data if we know it
- var sub = form.clk;
+ sub = form.clk;
if (sub) {
- var n = sub.name;
+ n = sub.name;
if (n && !sub.disabled) {
s.extraData = s.extraData || {};
s.extraData[n] = sub.value;
@@ -253,7 +277,15 @@ $.fn.ajaxSubmit = function(options) {
}
}
}
+
+ var CLIENT_TIMEOUT_ABORT = 1;
+ var SERVER_ABORT = 2;
+ function getDoc(frame) {
+ var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
+ return doc;
+ }
+
// take a breath so that pending repaints get some cpu time before the upload starts
function doSubmit() {
// make sure form attrs are set
@@ -261,15 +293,15 @@ $.fn.ajaxSubmit = function(options) {
// update form attrs in IE friendly way
form.setAttribute('target',id);
- if (form.getAttribute('method') != 'POST') {
+ if (!method) {
form.setAttribute('method', 'POST');
}
- if (form.getAttribute('action') != s.url) {
+ if (a != s.url) {
form.setAttribute('action', s.url);
}
// ie borks in some cases when setting encoding
- if (! s.skipEncodingOverride) {
+ if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
$form.attr({
encoding: 'multipart/form-data',
enctype: 'multipart/form-data'
@@ -278,7 +310,23 @@ $.fn.ajaxSubmit = function(options) {
// support timout
if (s.timeout) {
- setTimeout(function() { timedOut = true; cb(); }, s.timeout);
+ timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
+ }
+
+ // look for server aborts
+ function checkState() {
+ try {
+ var state = getDoc(io).readyState;
+ log('state = ' + state);
+ if (state.toLowerCase() == 'uninitialized')
+ setTimeout(checkState,50);
+ }
+ catch(e) {
+ log('Server abort: ' , e, ' (', e.name, ')');
+ cb(SERVER_ABORT);
+ timeoutHandle && clearTimeout(timeoutHandle);
+ timeoutHandle = undefined;
+ }
}
// add "extra" data to form if provided in options
@@ -287,14 +335,17 @@ $.fn.ajaxSubmit = function(options) {
if (s.extraData) {
for (var n in s.extraData) {
extraInputs.push(
- $('<input type="hidden" name="'+n+'" value="'+s.extraData[n]+'" />')
+ $('<input type="hidden" name="'+n+'" />').attr('value',s.extraData[n])
.appendTo(form)[0]);
}
}
- // add iframe to doc and submit the form
- $io.appendTo('body');
- $io.data('form-plugin-onload', cb);
+ if (!s.iframeTarget) {
+ // add iframe to doc and submit the form
+ $io.appendTo('body');
+ io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+ }
+ setTimeout(checkState,15);
form.submit();
}
finally {
@@ -315,24 +366,42 @@ $.fn.ajaxSubmit = function(options) {
else {
setTimeout(doSubmit, 10); // this lets dom updates render
}
-
- var data, doc, domCheckCount = 50;
- function cb() {
- if (cbInvoked) {
+ var data, doc, domCheckCount = 50, callbackProcessed;
+
+ function cb(e) {
+ if (xhr.aborted || callbackProcessed) {
+ return;
+ }
+ try {
+ doc = getDoc(io);
+ }
+ catch(ex) {
+ log('cannot access response document: ', ex);
+ e = SERVER_ABORT;
+ }
+ if (e === CLIENT_TIMEOUT_ABORT && xhr) {
+ xhr.abort('timeout');
+ return;
+ }
+ else if (e == SERVER_ABORT && xhr) {
+ xhr.abort('server abort');
return;
}
- $io.removeData('form-plugin-onload');
-
- var ok = true;
+ if (!doc || doc.location.href == s.iframeSrc) {
+ // response not received yet
+ if (!timedOut)
+ return;
+ }
+ io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+ var status = 'success', errMsg;
try {
if (timedOut) {
throw 'timeout';
}
- // extract the server response from the iframe
- doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
-
+
var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
log('isXml='+isXml);
if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
@@ -349,76 +418,104 @@ $.fn.ajaxSubmit = function(options) {
}
//log('response detected');
- cbInvoked = true;
- xhr.responseText = doc.documentElement ? doc.documentElement.innerHTML : null;
+ var docRoot = doc.body ? doc.body : doc.documentElement;
+ xhr.responseText = docRoot ? docRoot.innerHTML : null;
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+ if (isXml)
+ s.dataType = 'xml';
xhr.getResponseHeader = function(header){
var headers = {'content-type': s.dataType};
return headers[header];
};
-
- var scr = /(json|script)/.test(s.dataType);
+ // support for XHR 'status' & 'statusText' emulation :
+ if (docRoot) {
+ xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
+ xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
+ }
+
+ var dt = s.dataType || '';
+ var scr = /(json|script|text)/.test(dt.toLowerCase());
if (scr || s.textarea) {
// see if user embedded response in textarea
var ta = doc.getElementsByTagName('textarea')[0];
if (ta) {
xhr.responseText = ta.value;
+ // support for XHR 'status' & 'statusText' emulation :
+ xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
+ xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
}
else if (scr) {
// account for browsers injecting pre around json response
var pre = doc.getElementsByTagName('pre')[0];
var b = doc.getElementsByTagName('body')[0];
if (pre) {
- xhr.responseText = pre.textContent;
+ xhr.responseText = pre.textContent ? pre.textContent : pre.innerHTML;
}
else if (b) {
xhr.responseText = b.innerHTML;
}
- }
+ }
}
else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
xhr.responseXML = toXml(xhr.responseText);
}
- data = $.httpData(xhr, s.dataType);
+
+ try {
+ data = httpData(xhr, s.dataType, s);
+ }
+ catch (e) {
+ status = 'parsererror';
+ xhr.error = errMsg = (e || status);
+ }
}
- catch(e){
- log('error caught:',e);
- ok = false;
- xhr.error = e;
- $.handleError(s, xhr, 'error', e);
+ catch (e) {
+ log('error caught: ',e);
+ status = 'error';
+ xhr.error = errMsg = (e || status);
}
-
+
if (xhr.aborted) {
log('upload aborted');
- ok = false;
+ status = null;
}
+ if (xhr.status) { // we've set xhr.status
+ status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
+ }
+
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
- if (ok) {
- s.success.call(s.context, data, 'success', xhr);
- if (g) {
- $.event.trigger("ajaxSuccess", [xhr, s]);
- }
- }
- if (g) {
- $.event.trigger("ajaxComplete", [xhr, s]);
+ if (status === 'success') {
+ s.success && s.success.call(s.context, data, 'success', xhr);
+ g && $.event.trigger("ajaxSuccess", [xhr, s]);
}
+ else if (status) {
+ if (errMsg == undefined)
+ errMsg = xhr.statusText;
+ s.error && s.error.call(s.context, xhr, status, errMsg);
+ g && $.event.trigger("ajaxError", [xhr, s, errMsg]);
+ }
+
+ g && $.event.trigger("ajaxComplete", [xhr, s]);
+
if (g && ! --$.active) {
$.event.trigger("ajaxStop");
}
- if (s.complete) {
- s.complete.call(s.context, xhr, ok ? 'success' : 'error');
- }
+
+ s.complete && s.complete.call(s.context, xhr, status);
+
+ callbackProcessed = true;
+ if (s.timeout)
+ clearTimeout(timeoutHandle);
// clean up
setTimeout(function() {
- $io.removeData('form-plugin-onload');
- $io.remove();
+ if (!s.iframeTarget)
+ $io.remove();
xhr.responseXML = null;
}, 100);
}
- function toXml(s, doc) {
+ var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
if (window.ActiveXObject) {
doc = new ActiveXObject('Microsoft.XMLDOM');
doc.async = 'false';
@@ -427,8 +524,33 @@ $.fn.ajaxSubmit = function(options) {
else {
doc = (new DOMParser()).parseFromString(s, 'text/xml');
}
- return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
- }
+ return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+ };
+ var parseJSON = $.parseJSON || function(s) {
+ return window['eval']('(' + s + ')');
+ };
+
+ var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+
+ var ct = xhr.getResponseHeader('content-type') || '',
+ xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if (xml && data.documentElement.nodeName === 'parsererror') {
+ $.error && $.error('parsererror');
+ }
+ if (s && s.dataFilter) {
+ data = s.dataFilter(data, type);
+ }
+ if (typeof data === 'string') {
+ if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+ data = parseJSON(data);
+ } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+ $.globalEval(data);
+ }
+ }
+ return data;
+ };
}
};
@@ -462,7 +584,7 @@ $.fn.ajaxForm = function(options) {
log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
return this;
}
-
+
return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
e.preventDefault();
@@ -526,7 +648,7 @@ $.fn.formToArray = function(semantic) {
if (!els) {
return a;
}
-
+
var i,j,n,v,el,max,jmax;
for(i=0, max=els.length; i < max; i++) {
el = els[i];
@@ -711,9 +833,10 @@ $.fn.clearForm = function() {
* Clears the selected form elements.
*/
$.fn.clearFields = $.fn.clearInputs = function() {
+ var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
return this.each(function() {
var t = this.type, tag = this.tagName.toLowerCase();
- if (t == 'text' || t == 'password' || tag == 'textarea') {
+ if (re.test(t) || tag == 'textarea') {
this.value = '';
}
else if (t == 'checkbox' || t == 'radio') {
@@ -775,16 +898,13 @@ $.fn.selected = function(select) {
};
// helper fn for console logging
-// set $.fn.ajaxSubmit.debug to true to enable debug logging
function log() {
- if ($.fn.ajaxSubmit.debug) {
- var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
- if (window.console && window.console.log) {
- window.console.log(msg);
- }
- else if (window.opera && window.opera.postError) {
- window.opera.postError(msg);
- }
+ var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+ else if (window.opera && window.opera.postError) {
+ window.opera.postError(msg);
}
};
diff --git a/resources/jquery/jquery.js b/resources/jquery/jquery.js
index 11e6d067..8ccd0ea7 100644
--- a/resources/jquery/jquery.js
+++ b/resources/jquery/jquery.js
@@ -1,5 +1,5 @@
/*!
- * jQuery JavaScript Library v1.6.4
+ * jQuery JavaScript Library v1.7.1
* http://jquery.com/
*
* Copyright 2011, John Resig
@@ -11,7 +11,7 @@
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
- * Date: Mon Sep 12 18:54:48 2011 -0400
+ * Date: Mon Nov 21 21:11:03 2011 -0500
*/
(function( window, undefined ) {
@@ -47,9 +47,6 @@ var jQuery = function( selector, context ) {
trimLeft = /^\s+/,
trimRight = /\s+$/,
- // Check for digits
- rdigit = /\d/,
-
// Match a standalone tag
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
@@ -140,7 +137,7 @@ jQuery.fn = jQuery.prototype = {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
- doc = (context ? context.ownerDocument || context : document);
+ doc = ( context ? context.ownerDocument || context : document );
// If a single string is passed in and it's a single tag
// just do a createElement and skip the rest
@@ -157,7 +154,7 @@ jQuery.fn = jQuery.prototype = {
} else {
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+ selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
}
return jQuery.merge( this, selector );
@@ -187,7 +184,7 @@ jQuery.fn = jQuery.prototype = {
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
- return (context || rootjQuery).find( selector );
+ return ( context || rootjQuery ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
@@ -201,7 +198,7 @@ jQuery.fn = jQuery.prototype = {
return rootjQuery.ready( selector );
}
- if (selector.selector !== undefined) {
+ if ( selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
@@ -213,7 +210,7 @@ jQuery.fn = jQuery.prototype = {
selector: "",
// The current version of jQuery being used
- jquery: "1.6.4",
+ jquery: "1.7.1",
// The default length of a jQuery object is 0
length: 0,
@@ -258,7 +255,7 @@ jQuery.fn = jQuery.prototype = {
ret.context = this.context;
if ( name === "find" ) {
- ret.selector = this.selector + (this.selector ? " " : "") + selector;
+ ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
} else if ( name ) {
ret.selector = this.selector + "." + name + "(" + selector + ")";
}
@@ -279,15 +276,16 @@ jQuery.fn = jQuery.prototype = {
jQuery.bindReady();
// Add the callback
- readyList.done( fn );
+ readyList.add( fn );
return this;
},
eq: function( i ) {
+ i = +i;
return i === -1 ?
this.slice( i ) :
- this.slice( i, +i + 1 );
+ this.slice( i, i + 1 );
},
first: function() {
@@ -434,11 +432,11 @@ jQuery.extend({
}
// If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
+ readyList.fireWith( document, [ jQuery ] );
// Trigger any bound ready events
if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).unbind( "ready" );
+ jQuery( document ).trigger( "ready" ).off( "ready" );
}
}
},
@@ -448,7 +446,7 @@ jQuery.extend({
return;
}
- readyList = jQuery._Deferred();
+ readyList = jQuery.Callbacks( "once memory" );
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
@@ -504,8 +502,8 @@ jQuery.extend({
return obj && typeof obj === "object" && "setInterval" in obj;
},
- isNaN: function( obj ) {
- return obj == null || !rdigit.test( obj ) || isNaN( obj );
+ isNumeric: function( obj ) {
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
},
type: function( obj ) {
@@ -551,7 +549,7 @@ jQuery.extend({
},
error: function( msg ) {
- throw msg;
+ throw new Error( msg );
},
parseJSON: function( data ) {
@@ -573,7 +571,7 @@ jQuery.extend({
.replace( rvalidtokens, "]" )
.replace( rvalidbraces, "")) ) {
- return (new Function( "return " + data ))();
+ return ( new Function( "return " + data ) )();
}
jQuery.error( "Invalid JSON: " + data );
@@ -688,8 +686,6 @@ jQuery.extend({
if ( array != null ) {
// The window, strings (and functions) also have 'length'
- // The extra typeof function check is to prevent crashes
- // in Safari 2 (See: #3039)
// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
var type = jQuery.type( array );
@@ -703,18 +699,22 @@ jQuery.extend({
return ret;
},
- inArray: function( elem, array ) {
- if ( !array ) {
- return -1;
- }
+ inArray: function( elem, array, i ) {
+ var len;
- if ( indexOf ) {
- return indexOf.call( array, elem );
- }
+ if ( array ) {
+ if ( indexOf ) {
+ return indexOf.call( array, elem, i );
+ }
+
+ len = array.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
- for ( var i = 0, length = array.length; i < length; i++ ) {
- if ( array[ i ] === elem ) {
- return i;
+ for ( ; i < len; i++ ) {
+ // Skip accessing in sparse arrays
+ if ( i in array && array[ i ] === elem ) {
+ return i;
+ }
}
}
@@ -850,7 +850,7 @@ jQuery.extend({
},
now: function() {
- return (new Date()).getTime();
+ return ( new Date() ).getTime();
},
// Use of jQuery.browser is frowned upon.
@@ -957,188 +957,360 @@ return jQuery;
})();
-var // Promise methods
- promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
- // Static reference to slice
- sliceDeferred = [].slice;
+// String to Object flags format cache
+var flagsCache = {};
-jQuery.extend({
- // Create a simple deferred (one callbacks list)
- _Deferred: function() {
- var // callbacks list
- callbacks = [],
- // stored [ context , args ]
- fired,
- // to avoid firing when already doing so
- firing,
- // flag to know if the deferred has been cancelled
- cancelled,
- // the deferred itself
- deferred = {
-
- // done( f1, f2, ...)
- done: function() {
- if ( !cancelled ) {
- var args = arguments,
- i,
- length,
- elem,
- type,
- _fired;
- if ( fired ) {
- _fired = fired;
- fired = 0;
- }
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- deferred.done.apply( deferred, elem );
- } else if ( type === "function" ) {
- callbacks.push( elem );
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+ var object = flagsCache[ flags ] = {},
+ i, length;
+ flags = flags.split( /\s+/ );
+ for ( i = 0, length = flags.length; i < length; i++ ) {
+ object[ flags[i] ] = true;
+ }
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * flags: an optional list of space-separated flags that will change how
+ * the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+ // Convert flags from String-formatted to Object-formatted
+ // (we check in cache first)
+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+ var // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = [],
+ // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Add one or several callbacks to the list
+ add = function( args ) {
+ var i,
+ length,
+ elem,
+ type,
+ actual;
+ for ( i = 0, length = args.length; i < length; i++ ) {
+ elem = args[ i ];
+ type = jQuery.type( elem );
+ if ( type === "array" ) {
+ // Inspect recursively
+ add( elem );
+ } else if ( type === "function" ) {
+ // Add if not in unique mode and callback is not in
+ if ( !flags.unique || !self.has( elem ) ) {
+ list.push( elem );
+ }
+ }
+ }
+ },
+ // Fire callbacks
+ fire = function( context, args ) {
+ args = args || [];
+ memory = !flags.memory || [ context, args ];
+ firing = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+ memory = true; // Mark as halted
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( !flags.once ) {
+ if ( stack && stack.length ) {
+ memory = stack.shift();
+ self.fireWith( memory[ 0 ], memory[ 1 ] );
+ }
+ } else if ( memory === true ) {
+ self.disable();
+ } else {
+ list = [];
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ var length = list.length;
+ add( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away, unless previous
+ // firing was halted (stopOnFalse)
+ } else if ( memory && memory !== true ) {
+ firingStart = length;
+ fire( memory[ 0 ], memory[ 1 ] );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ var args = arguments,
+ argIndex = 0,
+ argLength = args.length;
+ for ( ; argIndex < argLength ; argIndex++ ) {
+ for ( var i = 0; i < list.length; i++ ) {
+ if ( args[ argIndex ] === list[ i ] ) {
+ // Handle firingIndex and firingLength
+ if ( firing ) {
+ if ( i <= firingLength ) {
+ firingLength--;
+ if ( i <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ // Remove the element
+ list.splice( i--, 1 );
+ // If we have some unicity property then
+ // we only need to do this once
+ if ( flags.unique ) {
+ break;
+ }
}
}
- if ( _fired ) {
- deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
- }
}
- return this;
- },
-
- // resolve with given context and args
- resolveWith: function( context, args ) {
- if ( !cancelled && !fired && !firing ) {
- // make sure args are available (#8421)
- args = args || [];
- firing = 1;
- try {
- while( callbacks[ 0 ] ) {
- callbacks.shift().apply( context, args );
- }
+ }
+ return this;
+ },
+ // Control if a given callback is in the list
+ has: function( fn ) {
+ if ( list ) {
+ var i = 0,
+ length = list.length;
+ for ( ; i < length; i++ ) {
+ if ( fn === list[ i ] ) {
+ return true;
}
- finally {
- fired = [ context, args ];
- firing = 0;
+ }
+ }
+ return false;
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory || memory === true ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( stack ) {
+ if ( firing ) {
+ if ( !flags.once ) {
+ stack.push( [ context, args ] );
}
+ } else if ( !( flags.once && memory ) ) {
+ fire( context, args );
}
- return this;
- },
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!memory;
+ }
+ };
- // resolve with this as context and given arguments
- resolve: function() {
- deferred.resolveWith( this, arguments );
- return this;
- },
+ return self;
+};
- // Has this deferred been resolved?
- isResolved: function() {
- return !!( firing || fired );
- },
- // Cancel
- cancel: function() {
- cancelled = 1;
- callbacks = [];
- return this;
- }
- };
- return deferred;
- },
- // Full fledged deferred (two callbacks list)
+var // Static reference to slice
+ sliceDeferred = [].slice;
+
+jQuery.extend({
+
Deferred: function( func ) {
- var deferred = jQuery._Deferred(),
- failDeferred = jQuery._Deferred(),
- promise;
- // Add errorDeferred methods, then and promise
- jQuery.extend( deferred, {
- then: function( doneCallbacks, failCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks );
- return this;
- },
- always: function() {
- return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+ var doneList = jQuery.Callbacks( "once memory" ),
+ failList = jQuery.Callbacks( "once memory" ),
+ progressList = jQuery.Callbacks( "memory" ),
+ state = "pending",
+ lists = {
+ resolve: doneList,
+ reject: failList,
+ notify: progressList
},
- fail: failDeferred.done,
- rejectWith: failDeferred.resolveWith,
- reject: failDeferred.resolve,
- isRejected: failDeferred.isResolved,
- pipe: function( fnDone, fnFail ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
+ promise = {
+ done: doneList.add,
+ fail: failList.add,
+ progress: progressList.add,
+
+ state: function() {
+ return state;
+ },
+
+ // Deprecated
+ isResolved: doneList.fired,
+ isRejected: failList.fired,
+
+ then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+ deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+ return this;
+ },
+ always: function() {
+ deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+ return this;
+ },
+ pipe: function( fnDone, fnFail, fnProgress ) {
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( {
+ done: [ fnDone, "resolve" ],
+ fail: [ fnFail, "reject" ],
+ progress: [ fnProgress, "notify" ]
+ }, function( handler, data ) {
+ var fn = data[ 0 ],
+ action = data[ 1 ],
+ returned;
+ if ( jQuery.isFunction( fn ) ) {
+ deferred[ handler ](function() {
+ returned = fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+ }
+ });
+ } else {
+ deferred[ handler ]( newDefer[ action ] );
+ }
+ });
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ if ( obj == null ) {
+ obj = promise;
+ } else {
+ for ( var key in promise ) {
+ obj[ key ] = promise[ key ];
}
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- if ( promise ) {
- return promise;
}
- promise = obj = {};
+ return obj;
}
- var i = promiseMethods.length;
- while( i-- ) {
- obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
- }
- return obj;
- }
- });
- // Make sure only one callback list will be used
- deferred.done( failDeferred.cancel ).fail( deferred.cancel );
- // Unexpose cancel
- delete deferred.cancel;
+ },
+ deferred = promise.promise({}),
+ key;
+
+ for ( key in lists ) {
+ deferred[ key ] = lists[ key ].fire;
+ deferred[ key + "With" ] = lists[ key ].fireWith;
+ }
+
+ // Handle state
+ deferred.done( function() {
+ state = "resolved";
+ }, failList.disable, progressList.lock ).fail( function() {
+ state = "rejected";
+ }, doneList.disable, progressList.lock );
+
// Call given func if any
if ( func ) {
func.call( deferred, deferred );
}
+
+ // All done!
return deferred;
},
// Deferred helper
when: function( firstParam ) {
- var args = arguments,
+ var args = sliceDeferred.call( arguments, 0 ),
i = 0,
length = args.length,
+ pValues = new Array( length ),
count = length,
+ pCount = length,
deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
firstParam :
- jQuery.Deferred();
+ jQuery.Deferred(),
+ promise = deferred.promise();
function resolveFunc( i ) {
return function( value ) {
args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
if ( !( --count ) ) {
- // Strange bug in FF4:
- // Values changed onto the arguments object sometimes end up as undefined values
- // outside the $.when method. Cloning the object into a fresh array solves the issue
- deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+ deferred.resolveWith( deferred, args );
}
};
}
+ function progressFunc( i ) {
+ return function( value ) {
+ pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+ deferred.notifyWith( promise, pValues );
+ };
+ }
if ( length > 1 ) {
- for( ; i < length; i++ ) {
- if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject );
+ for ( ; i < length; i++ ) {
+ if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+ args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
} else {
--count;
}
@@ -1149,39 +1321,35 @@ jQuery.extend({
} else if ( deferred !== firstParam ) {
deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
}
- return deferred.promise();
+ return promise;
}
});
+
jQuery.support = (function() {
- var div = document.createElement( "div" ),
- documentElement = document.documentElement,
+ var support,
all,
a,
select,
opt,
input,
marginDiv,
- support,
fragment,
- body,
- testElementParent,
- testElement,
- testElementStyle,
tds,
events,
eventName,
i,
- isSupported;
+ isSupported,
+ div = document.createElement( "div" ),
+ documentElement = document.documentElement;
// Preliminary tests
div.setAttribute("className", "t");
div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
all = div.getElementsByTagName( "*" );
a = div.getElementsByTagName( "a" )[ 0 ];
@@ -1201,11 +1369,11 @@ jQuery.support = (function() {
// Make sure that tbody elements aren't automatically inserted
// IE will insert them into empty tables
- tbody: !div.getElementsByTagName( "tbody" ).length,
+ tbody: !div.getElementsByTagName("tbody").length,
// Make sure that link elements get serialized correctly by innerHTML
// This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+ htmlSerialize: !!div.getElementsByTagName("link").length,
// Get the style information from getAttribute
// (IE uses .cssText instead)
@@ -1213,12 +1381,12 @@ jQuery.support = (function() {
// Make sure that URLs aren't manipulated
// (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+ hrefNormalized: ( a.getAttribute("href") === "/a" ),
// Make sure that element opacity exists
// (IE uses filter instead)
// Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55$/.test( a.style.opacity ),
+ opacity: /^0.55/.test( a.style.opacity ),
// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
@@ -1236,6 +1404,13 @@ jQuery.support = (function() {
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t",
+ // Tests for enctype support on a form(#6743)
+ enctype: !!document.createElement("form").enctype,
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
// Will be defined later
submitBubbles: true,
changeBubbles: true,
@@ -1273,7 +1448,7 @@ jQuery.support = (function() {
div.cloneNode( true ).fireEvent( "onclick" );
}
- // Check if a radio maintains it's value
+ // Check if a radio maintains its value
// after being appended to the DOM
input = document.createElement("input");
input.value = "t";
@@ -1283,82 +1458,18 @@ jQuery.support = (function() {
input.setAttribute("checked", "checked");
div.appendChild( input );
fragment = document.createDocumentFragment();
- fragment.appendChild( div.firstChild );
+ fragment.appendChild( div.lastChild );
// WebKit doesn't clone checked state correctly in fragments
support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
- div.innerHTML = "";
-
- // Figure out if the W3C box model works as expected
- div.style.width = div.style.paddingLeft = "1px";
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- // We use our own, invisible, body unless the body is already present
- // in which case we use a div (#9239)
- testElement = document.createElement( body ? "div" : "body" );
- testElementStyle = {
- visibility: "hidden",
- width: 0,
- height: 0,
- border: 0,
- margin: 0,
- background: "none"
- };
- if ( body ) {
- jQuery.extend( testElementStyle, {
- position: "absolute",
- left: "-1000px",
- top: "-1000px"
- });
- }
- for ( i in testElementStyle ) {
- testElement.style[ i ] = testElementStyle[ i ];
- }
- testElement.appendChild( div );
- testElementParent = body || documentElement;
- testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
// Check if a disconnected checkbox will retain its checked
// value of true after appended to the DOM (IE6/7)
support.appendChecked = input.checked;
- support.boxModel = div.offsetWidth === 2;
-
- if ( "zoom" in div.style ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "";
- div.innerHTML = "<div style='width:4px;'></div>";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
- }
-
- div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
- tds = div.getElementsByTagName( "td" );
+ fragment.removeChild( input );
+ fragment.appendChild( div );
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE < 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
div.innerHTML = "";
// Check if div with explicit width and no margin-right incorrectly
@@ -1366,21 +1477,18 @@ jQuery.support = (function() {
// info see bug #3333
// Fails in WebKit before Feb 2011 nightlies
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ if ( window.getComputedStyle ) {
marginDiv = document.createElement( "div" );
marginDiv.style.width = "0";
marginDiv.style.marginRight = "0";
+ div.style.width = "2px";
div.appendChild( marginDiv );
support.reliableMarginRight =
- ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+ ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
}
- // Remove the body element we added
- testElement.innerHTML = "";
- testElementParent.removeChild( testElement );
-
// Technique from Juriy Zaytsev
- // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+ // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
// We only care about the case where non-standard event systems
// are used, namely in IE. Short-circuiting here helps us to
// avoid an eval call (in setAttribute) which can cause CSP
@@ -1390,7 +1498,7 @@ jQuery.support = (function() {
submit: 1,
change: 1,
focusin: 1
- } ) {
+ }) {
eventName = "on" + i;
isSupported = ( eventName in div );
if ( !isSupported ) {
@@ -1401,15 +1509,111 @@ jQuery.support = (function() {
}
}
- // Null connected elements to avoid leaks in IE
- testElement = fragment = select = opt = body = marginDiv = div = input = null;
+ fragment.removeChild( div );
+
+ // Null elements to avoid leaks in IE
+ fragment = select = opt = marginDiv = div = input = null;
+
+ // Run tests that need a body at doc ready
+ jQuery(function() {
+ var container, outer, inner, table, td, offsetSupport,
+ conMarginTop, ptlm, vb, style, html,
+ body = document.getElementsByTagName("body")[0];
+
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ conMarginTop = 1;
+ ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+ vb = "visibility:hidden;border:0;";
+ style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+ html = "<div " + style + "><div></div></div>" +
+ "<table " + style + " cellpadding='0' cellspacing='0'>" +
+ "<tr><td></td></tr></table>";
+
+ container = document.createElement("div");
+ container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+ body.insertBefore( container, body.firstChild );
+
+ // Construct the test element
+ div = document.createElement("div");
+ container.appendChild( div );
+
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ // (only IE 8 fails this test)
+ div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+ tds = div.getElementsByTagName( "td" );
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+ tds[ 0 ].style.display = "";
+ tds[ 1 ].style.display = "none";
+
+ // Check if empty table cells still have offsetWidth/Height
+ // (IE <= 8 fail this test)
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+ // Figure out if the W3C box model works as expected
+ div.innerHTML = "";
+ div.style.width = div.style.paddingLeft = "1px";
+ jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+ if ( typeof div.style.zoom !== "undefined" ) {
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ // (IE < 8 does this)
+ div.style.display = "inline";
+ div.style.zoom = 1;
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+ // Check if elements with layout shrink-wrap their children
+ // (IE 6 does this)
+ div.style.display = "";
+ div.innerHTML = "<div style='width:4px;'></div>";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+ }
+
+ div.style.cssText = ptlm + vb;
+ div.innerHTML = html;
+
+ outer = div.firstChild;
+ inner = outer.firstChild;
+ td = outer.nextSibling.firstChild.firstChild;
+
+ offsetSupport = {
+ doesNotAddBorder: ( inner.offsetTop !== 5 ),
+ doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+ };
+
+ inner.style.position = "fixed";
+ inner.style.top = "20px";
+
+ // safari subtracts parent border width here which is 5px
+ offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+ inner.style.position = inner.style.top = "";
+
+ outer.style.overflow = "hidden";
+ outer.style.position = "relative";
+
+ offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+ offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+ body.removeChild( container );
+ div = container = null;
+
+ jQuery.extend( support, offsetSupport );
+ });
return support;
})();
-// Keep track of boxModel
-jQuery.boxModel = jQuery.support.boxModel;
-
@@ -1437,7 +1641,6 @@ jQuery.extend({
hasData: function( elem ) {
elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-
return !!elem && !isEmptyDataObject( elem );
},
@@ -1446,7 +1649,7 @@ jQuery.extend({
return;
}
- var thisCache, ret,
+ var privateCache, thisCache, ret,
internalKey = jQuery.expando,
getByName = typeof name === "string",
@@ -1460,11 +1663,12 @@ jQuery.extend({
// Only defining an ID for JS objects if its cache already exists allows
// the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+ isEvents = name === "events";
// Avoid doing any more work than we need to when trying to get data on an
// object that has no data at all
- if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
+ if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
return;
}
@@ -1472,18 +1676,17 @@ jQuery.extend({
// Only DOM nodes need a new unique ID for each element since their data
// ends up in the global cache
if ( isNode ) {
- elem[ jQuery.expando ] = id = ++jQuery.uuid;
+ elem[ internalKey ] = id = ++jQuery.uuid;
} else {
- id = jQuery.expando;
+ id = internalKey;
}
}
if ( !cache[ id ] ) {
cache[ id ] = {};
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
+ // Avoids exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
if ( !isNode ) {
cache[ id ].toJSON = jQuery.noop;
}
@@ -1493,34 +1696,33 @@ jQuery.extend({
// shallow copied over onto the existing cache
if ( typeof name === "object" || typeof name === "function" ) {
if ( pvt ) {
- cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+ cache[ id ] = jQuery.extend( cache[ id ], name );
} else {
- cache[ id ] = jQuery.extend(cache[ id ], name);
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
}
}
- thisCache = cache[ id ];
+ privateCache = thisCache = cache[ id ];
- // Internal jQuery data is stored in a separate object inside the object's data
+ // jQuery data() is stored in a separate object inside the object's internal data
// cache in order to avoid key collisions between internal data and user-defined
- // data
- if ( pvt ) {
- if ( !thisCache[ internalKey ] ) {
- thisCache[ internalKey ] = {};
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
}
- thisCache = thisCache[ internalKey ];
+ thisCache = thisCache.data;
}
if ( data !== undefined ) {
thisCache[ jQuery.camelCase( name ) ] = data;
}
- // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
- // not attempt to inspect the internal events object using jQuery.data, as this
- // internal data object is undocumented and subject to change.
- if ( name === "events" && !thisCache[name] ) {
- return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+ // Users should not attempt to inspect the internal events object using jQuery.data,
+ // it is undocumented and subject to change. But does anyone listen? No.
+ if ( isEvents && !thisCache[ name ] ) {
+ return privateCache.events;
}
// Check for both converted-to-camel and non-converted data property names
@@ -1548,7 +1750,7 @@ jQuery.extend({
return;
}
- var thisCache,
+ var thisCache, i, l,
// Reference to internal data cache key
internalKey = jQuery.expando,
@@ -1559,7 +1761,7 @@ jQuery.extend({
cache = isNode ? jQuery.cache : elem,
// See jQuery.data for more information
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+ id = isNode ? elem[ internalKey ] : internalKey;
// If there is already no cache entry for this object, there is no
// purpose in continuing
@@ -1569,28 +1771,43 @@ jQuery.extend({
if ( name ) {
- thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
if ( thisCache ) {
- // Support interoperable removal of hyphenated or camelcased keys
- if ( !thisCache[ name ] ) {
- name = jQuery.camelCase( name );
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
+
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split( " " );
+ }
+ }
}
- delete thisCache[ name ];
+ for ( i = 0, l = name.length; i < l; i++ ) {
+ delete thisCache[ name[i] ];
+ }
// If there is no data left in the cache, we want to continue
// and let the cache object itself get destroyed
- if ( !isEmptyDataObject(thisCache) ) {
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
return;
}
}
}
// See jQuery.data for more information
- if ( pvt ) {
- delete cache[ id ][ internalKey ];
+ if ( !pvt ) {
+ delete cache[ id ].data;
// Don't destroy the parent cache unless the internal data object
// had been the only thing left in it
@@ -1599,8 +1816,6 @@ jQuery.extend({
}
}
- var internalCache = cache[ id ][ internalKey ];
-
// Browsers that fail expando deletion also refuse to delete expandos on
// the window, but it will allow it on all other JS objects; other browsers
// don't care
@@ -1611,32 +1826,18 @@ jQuery.extend({
cache[ id ] = null;
}
- // We destroyed the entire user cache at once because it's faster than
- // iterating through each key, but we need to continue to persist internal
- // data if it existed
- if ( internalCache ) {
- cache[ id ] = {};
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
-
- cache[ id ][ internalKey ] = internalCache;
-
- // Otherwise, we need to eliminate the expando on the node to avoid
+ // We destroyed the cache and need to eliminate the expando on the node to avoid
// false lookups in the cache for entries that no longer exist
- } else if ( isNode ) {
+ if ( isNode ) {
// IE does not allow us to delete expando properties from nodes,
// nor does it have a removeAttribute function on Document nodes;
// we must handle all of these cases
if ( jQuery.support.deleteExpando ) {
- delete elem[ jQuery.expando ];
+ delete elem[ internalKey ];
} else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
+ elem.removeAttribute( internalKey );
} else {
- elem[ jQuery.expando ] = null;
+ elem[ internalKey ] = null;
}
}
},
@@ -1662,14 +1863,15 @@ jQuery.extend({
jQuery.fn.extend({
data: function( key, value ) {
- var data = null;
+ var parts, attr, name,
+ data = null;
if ( typeof key === "undefined" ) {
if ( this.length ) {
data = jQuery.data( this[0] );
- if ( this[0].nodeType === 1 ) {
- var attr = this[0].attributes, name;
+ if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+ attr = this[0].attributes;
for ( var i = 0, l = attr.length; i < l; i++ ) {
name = attr[i].name;
@@ -1679,6 +1881,7 @@ jQuery.fn.extend({
dataAttr( this[0], name, data[ name ] );
}
}
+ jQuery._data( this[0], "parsedAttrs", true );
}
}
@@ -1690,7 +1893,7 @@ jQuery.fn.extend({
});
}
- var parts = key.split(".");
+ parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
if ( value === undefined ) {
@@ -1708,12 +1911,12 @@ jQuery.fn.extend({
} else {
return this.each(function() {
- var $this = jQuery( this ),
+ var self = jQuery( this ),
args = [ parts[0], value ];
- $this.triggerHandler( "setData" + parts[1] + "!", args );
+ self.triggerHandler( "setData" + parts[1] + "!", args );
jQuery.data( this, key, value );
- $this.triggerHandler( "changeData" + parts[1] + "!", args );
+ self.triggerHandler( "changeData" + parts[1] + "!", args );
});
}
},
@@ -1739,7 +1942,7 @@ function dataAttr( elem, key, data ) {
data = data === "true" ? true :
data === "false" ? false :
data === "null" ? null :
- !jQuery.isNaN( data ) ? parseFloat( data ) :
+ jQuery.isNumeric( data ) ? parseFloat( data ) :
rbrace.test( data ) ? jQuery.parseJSON( data ) :
data;
} catch( e ) {}
@@ -1755,11 +1958,14 @@ function dataAttr( elem, key, data ) {
return data;
}
-// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
-// property to be considered empty objects; this property always exists in
-// order to make sure JSON.stringify does not expose internal metadata
+// checks a cache object for emptiness
function isEmptyDataObject( obj ) {
for ( var name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+ continue;
+ }
if ( name !== "toJSON" ) {
return false;
}
@@ -1775,17 +1981,17 @@ function handleQueueMarkDefer( elem, type, src ) {
var deferDataKey = type + "defer",
queueDataKey = type + "queue",
markDataKey = type + "mark",
- defer = jQuery.data( elem, deferDataKey, undefined, true );
+ defer = jQuery._data( elem, deferDataKey );
if ( defer &&
- ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
- ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+ ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+ ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
// Give room for hard-coded callbacks to fire first
// and eventually mark/queue something else on the element
setTimeout( function() {
- if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
- !jQuery.data( elem, markDataKey, undefined, true ) ) {
+ if ( !jQuery._data( elem, queueDataKey ) &&
+ !jQuery._data( elem, markDataKey ) ) {
jQuery.removeData( elem, deferDataKey, true );
- defer.resolve();
+ defer.fire();
}
}, 0 );
}
@@ -1795,8 +2001,8 @@ jQuery.extend({
_mark: function( elem, type ) {
if ( elem ) {
- type = (type || "fx") + "mark";
- jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+ type = ( type || "fx" ) + "mark";
+ jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
}
},
@@ -1809,9 +2015,9 @@ jQuery.extend({
if ( elem ) {
type = type || "fx";
var key = type + "mark",
- count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+ count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
if ( count ) {
- jQuery.data( elem, key, count, true );
+ jQuery._data( elem, key, count );
} else {
jQuery.removeData( elem, key, true );
handleQueueMarkDefer( elem, type, "mark" );
@@ -1820,13 +2026,15 @@ jQuery.extend({
},
queue: function( elem, type, data ) {
+ var q;
if ( elem ) {
- type = (type || "fx") + "queue";
- var q = jQuery.data( elem, type, undefined, true );
+ type = ( type || "fx" ) + "queue";
+ q = jQuery._data( elem, type );
+
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
if ( !q || jQuery.isArray(data) ) {
- q = jQuery.data( elem, type, jQuery.makeArray(data), true );
+ q = jQuery._data( elem, type, jQuery.makeArray(data) );
} else {
q.push( data );
}
@@ -1840,7 +2048,7 @@ jQuery.extend({
var queue = jQuery.queue( elem, type ),
fn = queue.shift(),
- defer;
+ hooks = {};
// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === "inprogress" ) {
@@ -1851,16 +2059,17 @@ jQuery.extend({
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === "fx" ) {
- queue.unshift("inprogress");
+ queue.unshift( "inprogress" );
}
- fn.call(elem, function() {
- jQuery.dequeue(elem, type);
- });
+ jQuery._data( elem, type + ".run", hooks );
+ fn.call( elem, function() {
+ jQuery.dequeue( elem, type );
+ }, hooks );
}
if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue", true );
+ jQuery.removeData( elem, type + "queue " + type + ".run", true );
handleQueueMarkDefer( elem, type, "queue" );
}
}
@@ -1892,14 +2101,14 @@ jQuery.fn.extend({
// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
type = type || "fx";
- return this.queue( type, function() {
- var elem = this;
- setTimeout(function() {
- jQuery.dequeue( elem, type );
- }, time );
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
});
},
clearQueue: function( type ) {
@@ -1930,9 +2139,9 @@ jQuery.fn.extend({
if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
+ jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
count++;
- tmp.done( resolve );
+ tmp.add( resolve );
}
}
resolve();
@@ -1950,7 +2159,8 @@ var rclass = /[\n\t\r]/g,
rfocusable = /^(?:button|input|object|select|textarea)$/i,
rclickable = /^a(?:rea)?$/i,
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- nodeHook, boolHook;
+ getSetAttribute = jQuery.support.getSetAttribute,
+ nodeHook, boolHook, fixSpecified;
jQuery.fn.extend({
attr: function( name, value ) {
@@ -1962,11 +2172,11 @@ jQuery.fn.extend({
jQuery.removeAttr( this, name );
});
},
-
+
prop: function( name, value ) {
return jQuery.access( this, name, value, true, jQuery.prop );
},
-
+
removeProp: function( name ) {
name = jQuery.propFix[ name ] || name;
return this.each(function() {
@@ -2025,7 +2235,7 @@ jQuery.fn.extend({
}
if ( (value && typeof value === "string") || value === undefined ) {
- classNames = (value || "").split( rspace );
+ classNames = ( value || "" ).split( rspace );
for ( i = 0, l = this.length; i < l; i++ ) {
elem = this[ i ];
@@ -2086,8 +2296,10 @@ jQuery.fn.extend({
},
hasClass: function( selector ) {
- var className = " " + selector + " ";
- for ( var i = 0, l = this.length; i < l; i++ ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
return true;
}
@@ -2097,9 +2309,9 @@ jQuery.fn.extend({
},
val: function( value ) {
- var hooks, ret,
+ var hooks, ret, isFunction,
elem = this[0];
-
+
if ( !arguments.length ) {
if ( elem ) {
hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
@@ -2110,17 +2322,17 @@ jQuery.fn.extend({
ret = elem.value;
- return typeof ret === "string" ?
+ return typeof ret === "string" ?
// handle most common string cases
- ret.replace(rreturn, "") :
+ ret.replace(rreturn, "") :
// handle cases where value is null/undef or number
ret == null ? "" : ret;
}
- return undefined;
+ return;
}
- var isFunction = jQuery.isFunction( value );
+ isFunction = jQuery.isFunction( value );
return this.each(function( i ) {
var self = jQuery(this), val;
@@ -2168,7 +2380,7 @@ jQuery.extend({
},
select: {
get: function( elem ) {
- var value,
+ var value, i, max, option,
index = elem.selectedIndex,
values = [],
options = elem.options,
@@ -2180,8 +2392,10 @@ jQuery.extend({
}
// Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
+ i = one ? index : 0;
+ max = one ? index + 1 : options.length;
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
// Don't return options that are disabled or in a disabled optgroup
if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
@@ -2233,18 +2447,14 @@ jQuery.extend({
height: true,
offset: true
},
-
- attrFix: {
- // Always normalize to ensure hook usage
- tabindex: "tabIndex"
- },
-
+
attr: function( elem, name, value, pass ) {
- var nType = elem.nodeType;
-
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
// don't get/set attributes on text, comment and attribute nodes
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
+ return;
}
if ( pass && name in jQuery.attrFn ) {
@@ -2252,36 +2462,24 @@ jQuery.extend({
}
// Fallback to prop when attributes are not supported
- if ( !("getAttribute" in elem) ) {
+ if ( typeof elem.getAttribute === "undefined" ) {
return jQuery.prop( elem, name, value );
}
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
- // Normalize the name if needed
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
if ( notxml ) {
- name = jQuery.attrFix[ name ] || name;
-
- hooks = jQuery.attrHooks[ name ];
-
- if ( !hooks ) {
- // Use boolHook for boolean attributes
- if ( rboolean.test( name ) ) {
- hooks = boolHook;
-
- // Use nodeHook if available( IE6/7 )
- } else if ( nodeHook ) {
- hooks = nodeHook;
- }
- }
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
}
if ( value !== undefined ) {
if ( value === null ) {
jQuery.removeAttr( elem, name );
- return undefined;
+ return;
} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
return ret;
@@ -2305,17 +2503,29 @@ jQuery.extend({
}
},
- removeAttr: function( elem, name ) {
- var propName;
- if ( elem.nodeType === 1 ) {
- name = jQuery.attrFix[ name ] || name;
+ removeAttr: function( elem, value ) {
+ var propName, attrNames, name, l,
+ i = 0;
+
+ if ( value && elem.nodeType === 1 ) {
+ attrNames = value.toLowerCase().split( rspace );
+ l = attrNames.length;
+
+ for ( ; i < l; i++ ) {
+ name = attrNames[ i ];
+
+ if ( name ) {
+ propName = jQuery.propFix[ name ] || name;
- jQuery.attr( elem, name, "" );
- elem.removeAttribute( name );
+ // See #9699 for explanation of this approach (setting first, then removal)
+ jQuery.attr( elem, name, "" );
+ elem.removeAttribute( getSetAttribute ? name : propName );
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
- elem[ propName ] = false;
+ // Set corresponding property to false for boolean attributes
+ if ( rboolean.test( name ) && propName in elem ) {
+ elem[ propName ] = false;
+ }
+ }
}
}
},
@@ -2374,17 +2584,17 @@ jQuery.extend({
frameborder: "frameBorder",
contenteditable: "contentEditable"
},
-
+
prop: function( elem, name, value ) {
- var nType = elem.nodeType;
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
// don't get/set properties on text, comment and attribute nodes
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
+ return;
}
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
if ( notxml ) {
// Fix name and attach hooks
@@ -2397,7 +2607,7 @@ jQuery.extend({
return ret;
} else {
- return (elem[ name ] = value);
+ return ( elem[ name ] = value );
}
} else {
@@ -2409,7 +2619,7 @@ jQuery.extend({
}
}
},
-
+
propHooks: {
tabIndex: {
get: function( elem ) {
@@ -2427,16 +2637,17 @@ jQuery.extend({
}
});
-// Add the tabindex propHook to attrHooks for back-compat
-jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
// Hook for boolean attributes
boolHook = {
get: function( elem, name ) {
// Align boolean attributes with corresponding properties
// Fall back to attribute presence where some booleans are not supported
- var attrNode;
- return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
+ var attrNode,
+ property = jQuery.prop( elem, name );
+ return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
name.toLowerCase() :
undefined;
},
@@ -2461,16 +2672,20 @@ boolHook = {
};
// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !jQuery.support.getSetAttribute ) {
-
+if ( !getSetAttribute ) {
+
+ fixSpecified = {
+ name: true,
+ id: true
+ };
+
// Use this for any attribute in IE6/7
// This fixes almost every IE6/7 issue
nodeHook = jQuery.valHooks.button = {
get: function( elem, name ) {
var ret;
ret = elem.getAttributeNode( name );
- // Return undefined if nodeValue is empty string
- return ret && ret.nodeValue !== "" ?
+ return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
ret.nodeValue :
undefined;
},
@@ -2481,10 +2696,13 @@ if ( !jQuery.support.getSetAttribute ) {
ret = document.createAttribute( name );
elem.setAttributeNode( ret );
}
- return (ret.nodeValue = value + "");
+ return ( ret.nodeValue = value + "" );
}
};
+ // Apply the nodeHook to tabindex
+ jQuery.attrHooks.tabindex.set = nodeHook.set;
+
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
// This is for removals
jQuery.each([ "width", "height" ], function( i, name ) {
@@ -2497,6 +2715,18 @@ if ( !jQuery.support.getSetAttribute ) {
}
});
});
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ get: nodeHook.get,
+ set: function( elem, value, name ) {
+ if ( value === "" ) {
+ value = "false";
+ }
+ nodeHook.set( elem, value, name );
+ }
+ };
}
@@ -2520,7 +2750,7 @@ if ( !jQuery.support.style ) {
return elem.style.cssText.toLowerCase() || undefined;
},
set: function( elem, value ) {
- return (elem.style.cssText = "" + value);
+ return ( elem.style.cssText = "" + value );
}
};
}
@@ -2545,6 +2775,11 @@ if ( !jQuery.support.optSelected ) {
});
}
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+ jQuery.propFix.enctype = "encoding";
+}
+
// Radios and checkboxes getter/setter
if ( !jQuery.support.checkOn ) {
jQuery.each([ "radio", "checkbox" ], function() {
@@ -2560,7 +2795,7 @@ jQuery.each([ "radio", "checkbox" ], function() {
jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
set: function( elem, value ) {
if ( jQuery.isArray( value ) ) {
- return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
}
}
});
@@ -2569,116 +2804,118 @@ jQuery.each([ "radio", "checkbox" ], function() {
-var rnamespaces = /\.(.*)$/,
- rformElems = /^(?:textarea|input|select)$/i,
- rperiod = /\./g,
- rspaces = / /g,
- rescape = /[^\w\s.|`]/g,
- fcleanup = function( nm ) {
- return nm.replace(rescape, "\\$&");
+var rformElems = /^(?:textarea|input|select)$/i,
+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+ rhoverHack = /\bhover(\.\S+)?\b/,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+ quickParse = function( selector ) {
+ var quick = rquickIs.exec( selector );
+ if ( quick ) {
+ // 0 1 2 3
+ // [ _, tag, id, class ]
+ quick[1] = ( quick[1] || "" ).toLowerCase();
+ quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+ }
+ return quick;
+ },
+ quickIs = function( elem, m ) {
+ var attrs = elem.attributes || {};
+ return (
+ (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+ (!m[2] || (attrs.id || {}).value === m[2]) &&
+ (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+ );
+ },
+ hoverHack = function( events ) {
+ return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
};
/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code originated from
- * Dean Edwards' addEvent library.
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
*/
jQuery.event = {
- // Bind an event to an element
- // Original by Dean Edwards
- add: function( elem, types, handler, data ) {
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
+ add: function( elem, types, handler, data, selector ) {
+
+ var elemData, eventHandle, events,
+ t, tns, type, namespaces, handleObj,
+ handleObjIn, quick, handlers, special;
- if ( handler === false ) {
- handler = returnFalse;
- } else if ( !handler ) {
- // Fixes bug #7229. Fix recommended by jdalton
+ // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+ if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
return;
}
- var handleObjIn, handleObj;
-
+ // Caller can pass in an object of custom data in lieu of the handler
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
}
- // Make sure that the function being executed has a unique ID
+ // Make sure that the handler has a unique ID, used to find/remove it later
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}
- // Init the element's event structure
- var elemData = jQuery._data( elem );
-
- // If no elemData is found then we must be trying to bind to one of the
- // banned noData elements
- if ( !elemData ) {
- return;
- }
-
- var events = elemData.events,
- eventHandle = elemData.handle;
-
+ // Init the element's event structure and main handler, if this is the first
+ events = elemData.events;
if ( !events ) {
elemData.events = events = {};
}
-
+ eventHandle = elemData.handle;
if ( !eventHandle ) {
elemData.handle = eventHandle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
undefined;
};
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
}
- // Add elem as a property of the handle function
- // This is to prevent a memory leak with non-native events in IE.
- eventHandle.elem = elem;
-
// Handle multiple events separated by a space
// jQuery(...).bind("mouseover mouseout", fn);
- types = types.split(" ");
+ types = jQuery.trim( hoverHack(types) ).split( " " );
+ for ( t = 0; t < types.length; t++ ) {
- var type, i = 0, namespaces;
+ tns = rtypenamespace.exec( types[t] ) || [];
+ type = tns[1];
+ namespaces = ( tns[2] || "" ).split( "." ).sort();
- while ( (type = types[ i++ ]) ) {
- handleObj = handleObjIn ?
- jQuery.extend({}, handleObjIn) :
- { handler: handler, data: data };
-
- // Namespaced event handlers
- if ( type.indexOf(".") > -1 ) {
- namespaces = type.split(".");
- type = namespaces.shift();
- handleObj.namespace = namespaces.slice(0).sort().join(".");
-
- } else {
- namespaces = [];
- handleObj.namespace = "";
- }
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
- handleObj.type = type;
- if ( !handleObj.guid ) {
- handleObj.guid = handler.guid;
- }
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
- // Get the current list of functions bound to this event
- var handlers = events[ type ],
- special = jQuery.event.special[ type ] || {};
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
- // Init the event handler queue
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: tns[1],
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ quick: quickParse( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ handlers = events[ type ];
if ( !handlers ) {
handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
- // Check for a special event handler
- // Only use addEventListener/attachEvent if the special
- // events handler returns false
+ // Only use addEventListener/attachEvent if the special events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
// Bind the global event handler to the element
if ( elem.addEventListener ) {
@@ -2698,10 +2935,14 @@ jQuery.event = {
}
}
- // Add the function to the element's handler list
- handlers.push( handleObj );
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
- // Keep track of which events have been used, for event optimization
+ // Keep track of which events have ever been used, for event optimization
jQuery.event.global[ type ] = true;
}
@@ -2712,129 +2953,80 @@ jQuery.event = {
global: {},
// Detach an event or set of events from an element
- remove: function( elem, types, handler, pos ) {
- // don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- }
+ remove: function( elem, types, handler, selector, mappedTypes ) {
- var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- events = elemData && elemData.events;
+ var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+ t, tns, type, origType, namespaces, origCount,
+ j, events, special, handle, eventType, handleObj;
- if ( !elemData || !events ) {
+ if ( !elemData || !(events = elemData.events) ) {
return;
}
- // types is actually an event object here
- if ( types && types.type ) {
- handler = types.handler;
- types = types.type;
- }
-
- // Unbind all events for the element
- if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
- types = types || "";
+ // Once for each type.namespace in types; type may be omitted
+ types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+ for ( t = 0; t < types.length; t++ ) {
+ tns = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tns[1];
+ namespaces = tns[2];
- for ( type in events ) {
- jQuery.event.remove( elem, type + types );
- }
-
- return;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).unbind("mouseover mouseout", fn);
- types = types.split(" ");
-
- while ( (type = types[ i++ ]) ) {
- origType = type;
- handleObj = null;
- all = type.indexOf(".") < 0;
- namespaces = [];
-
- if ( !all ) {
- // Namespaced event handlers
- namespaces = type.split(".");
- type = namespaces.shift();
-
- namespace = new RegExp("(^|\\.)" +
- jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- eventType = events[ type ];
-
- if ( !eventType ) {
- continue;
- }
-
- if ( !handler ) {
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( all || namespace.test( handleObj.namespace ) ) {
- jQuery.event.remove( elem, origType, handleObj.handler, j );
- eventType.splice( j--, 1 );
- }
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
}
-
continue;
}
special = jQuery.event.special[ type ] || {};
+ type = ( selector? special.delegateType : special.bindType ) || type;
+ eventType = events[ type ] || [];
+ origCount = eventType.length;
+ namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
- for ( j = pos || 0; j < eventType.length; j++ ) {
+ // Remove matching events
+ for ( j = 0; j < eventType.length; j++ ) {
handleObj = eventType[ j ];
- if ( handler.guid === handleObj.guid ) {
- // remove the given handler for the given type
- if ( all || namespace.test( handleObj.namespace ) ) {
- if ( pos == null ) {
- eventType.splice( j--, 1 );
- }
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ eventType.splice( j--, 1 );
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
+ if ( handleObj.selector ) {
+ eventType.delegateCount--;
}
-
- if ( pos != null ) {
- break;
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
}
}
}
- // remove generic event handler if no more handlers exist
- if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( eventType.length === 0 && origCount !== eventType.length ) {
if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
jQuery.removeEvent( elem, type, elemData.handle );
}
- ret = null;
delete events[ type ];
}
}
// Remove the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
- var handle = elemData.handle;
+ handle = elemData.handle;
if ( handle ) {
handle.elem = null;
}
- delete elemData.events;
- delete elemData.handle;
-
- if ( jQuery.isEmptyObject( elemData ) ) {
- jQuery.removeData( elem, undefined, true );
- }
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery.removeData( elem, [ "events", "handle" ], true );
}
},
-
+
// Events that are safe to short-circuit if no handlers are attached.
// Native DOM events should not be added, they may have inline handlers.
customEvent: {
@@ -2844,18 +3036,28 @@ jQuery.event = {
},
trigger: function( event, data, elem, onlyHandlers ) {
+ // Don't do events on text and comment nodes
+ if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+ return;
+ }
+
// Event object or event type
var type = event.type || event,
namespaces = [],
- exclusive;
+ cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
- if ( type.indexOf("!") >= 0 ) {
+ if ( type.indexOf( "!" ) >= 0 ) {
// Exclusive events trigger only for the exact event (no namespaces)
type = type.slice(0, -1);
exclusive = true;
}
- if ( type.indexOf(".") >= 0 ) {
+ if ( type.indexOf( "." ) >= 0 ) {
// Namespaced trigger; create a regexp to match event type in handle()
namespaces = type.split(".");
type = namespaces.shift();
@@ -2877,230 +3079,299 @@ jQuery.event = {
new jQuery.Event( type );
event.type = type;
+ event.isTrigger = true;
event.exclusive = exclusive;
- event.namespace = namespaces.join(".");
- event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
-
- // triggerHandler() and global events don't bubble or run the default action
- if ( onlyHandlers || !elem ) {
- event.preventDefault();
- event.stopPropagation();
- }
+ event.namespace = namespaces.join( "." );
+ event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+ ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
// Handle a global trigger
if ( !elem ) {
+
// TODO: Stop taunting the data cache; remove global events and always attach to document
- jQuery.each( jQuery.cache, function() {
- // internalKey variable is just used to make it easier to find
- // and potentially change this stuff later; currently it just
- // points to jQuery.expando
- var internalKey = jQuery.expando,
- internalCache = this[ internalKey ];
- if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
- jQuery.event.trigger( event, data, internalCache.handle.elem );
+ cache = jQuery.cache;
+ for ( i in cache ) {
+ if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+ jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
}
- });
- return;
- }
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ }
return;
}
// Clean up the event in case it is being reused
event.result = undefined;
- event.target = elem;
+ if ( !event.target ) {
+ event.target = elem;
+ }
// Clone any incoming data and prepend the event, creating the handler arg list
data = data != null ? jQuery.makeArray( data ) : [];
data.unshift( event );
- var cur = elem,
- // IE doesn't like method names with a colon (#3533, #8272)
- ontype = type.indexOf(":") < 0 ? "on" + type : "";
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ eventPath = [[ elem, special.bindType || type ]];
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
- // Fire event on the current element, then bubble up the DOM tree
- do {
- var handle = jQuery._data( cur, "handle" );
+ bubbleType = special.delegateType || type;
+ cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+ old = null;
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push([ cur, bubbleType ]);
+ old = cur;
+ }
- event.currentTarget = cur;
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( old && old === elem.ownerDocument ) {
+ eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+ }
+ }
+
+ // Fire handlers on the event path
+ for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+ cur = eventPath[i][0];
+ event.type = eventPath[i][1];
+
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
-
- // Trigger an inline bound script
- if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
- event.result = false;
+ // Note that this is a bare JS function and not a jQuery handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
event.preventDefault();
}
-
- // Bubble up to document, then to window
- cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
- } while ( cur && !event.isPropagationStopped() );
+ }
+ event.type = type;
// If nobody prevented the default action, do it now
- if ( !event.isDefaultPrevented() ) {
- var old,
- special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
- if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
// Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction)() check here because IE6/7 fails that test.
- // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
- try {
- if ( ontype && elem[ type ] ) {
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ // IE<9 dies on focus/blur to hidden element (#1486)
+ if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
- if ( old ) {
- elem[ ontype ] = null;
- }
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ old = elem[ ontype ];
- jQuery.event.triggered = type;
- elem[ type ]();
+ if ( old ) {
+ elem[ ontype ] = null;
}
- } catch ( ieError ) {}
- if ( old ) {
- elem[ ontype ] = old;
- }
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
- jQuery.event.triggered = undefined;
+ if ( old ) {
+ elem[ ontype ] = old;
+ }
+ }
}
}
-
+
return event.result;
},
- handle: function( event ) {
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
event = jQuery.event.fix( event || window.event );
- // Snapshot the handlers list since a called handler may add/remove events.
- var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+
+ var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+ delegateCount = handlers.delegateCount,
+ args = [].slice.call( arguments, 0 ),
run_all = !event.exclusive && !event.namespace,
- args = Array.prototype.slice.call( arguments, 0 );
+ handlerQueue = [],
+ i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
- // Use the fix-ed Event rather than the (read-only) native event
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
args[0] = event;
- event.currentTarget = this;
-
- for ( var j = 0, l = handlers.length; j < l; j++ ) {
- var handleObj = handlers[ j ];
-
- // Triggered event must 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event.
- if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- event.handler = handleObj.handler;
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- var ret = handleObj.handler.apply( this, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
+ event.delegateTarget = this;
+
+ // Determine handlers that should run if there are delegated events
+ // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+ // Pregenerate a single jQuery object for reuse with .is()
+ jqcur = jQuery(this);
+ jqcur.context = this.ownerDocument || this;
+
+ for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+ selMatch = {};
+ matches = [];
+ jqcur[0] = cur;
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+ sel = handleObj.selector;
+
+ if ( selMatch[ sel ] === undefined ) {
+ selMatch[ sel ] = (
+ handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+ );
+ }
+ if ( selMatch[ sel ] ) {
+ matches.push( handleObj );
}
}
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, matches: matches });
+ }
+ }
+ }
- if ( event.isImmediatePropagationStopped() ) {
- break;
+ // Add the remaining (directly-bound) handlers
+ if ( handlers.length > delegateCount ) {
+ handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+ }
+
+ // Run delegates first; they may want to stop propagation beneath us
+ for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+ matched = handlerQueue[ i ];
+ event.currentTarget = matched.elem;
+
+ for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+ handleObj = matched.matches[ j ];
+
+ // Triggered event must either 1) be non-exclusive and have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
}
}
}
+
return event.result;
},
- props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+ // Includes some event props shared by KeyEvent and MouseEvent
+ // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+ props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button,
+ fromElement = original.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && fromElement ) {
+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
fix: function( event ) {
if ( event[ jQuery.expando ] ) {
return event;
}
- // store a copy of the original event object
- // and "clone" to set read-only properties
- var originalEvent = event;
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop,
+ originalEvent = event,
+ fixHook = jQuery.event.fixHooks[ event.type ] || {},
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
event = jQuery.Event( originalEvent );
- for ( var i = this.props.length, prop; i; ) {
- prop = this.props[ --i ];
+ for ( i = copy.length; i; ) {
+ prop = copy[ --i ];
event[ prop ] = originalEvent[ prop ];
}
- // Fix target property, if necessary
+ // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
if ( !event.target ) {
- // Fixes #1925 where srcElement might not be defined either
- event.target = event.srcElement || document;
+ event.target = originalEvent.srcElement || document;
}
- // check if target is a textnode (safari)
+ // Target should not be a text node (#504, Safari)
if ( event.target.nodeType === 3 ) {
event.target = event.target.parentNode;
}
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement ) {
- event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
- }
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var eventDocument = event.target.ownerDocument || document,
- doc = eventDocument.documentElement,
- body = eventDocument.body;
-
- event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
- event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
- }
-
- // Add which for key events
- if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
- event.which = event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey ) {
+ // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+ if ( event.metaKey === undefined ) {
event.metaKey = event.ctrlKey;
}
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button !== undefined ) {
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
- }
-
- return event;
+ return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
},
- // Deprecated, use jQuery.guid instead
- guid: 1E8,
-
- // Deprecated, use jQuery.proxy instead
- proxy: jQuery.proxy,
-
special: {
ready: {
// Make sure the ready event is setup
- setup: jQuery.bindReady,
- teardown: jQuery.noop
+ setup: jQuery.bindReady
},
- live: {
- add: function( handleObj ) {
- jQuery.event.add( this,
- liveConvert( handleObj.origType, handleObj.selector ),
- jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
- },
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
- remove: function( handleObj ) {
- jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
- }
+ focus: {
+ delegateType: "focusin"
+ },
+ blur: {
+ delegateType: "focusout"
},
beforeunload: {
@@ -3117,9 +3388,35 @@ jQuery.event = {
}
}
}
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ { type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
}
};
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
jQuery.removeEvent = document.removeEventListener ?
function( elem, type, handle ) {
if ( elem.removeEventListener ) {
@@ -3134,7 +3431,7 @@ jQuery.removeEvent = document.removeEventListener ?
jQuery.Event = function( src, props ) {
// Allow instantiation without the 'new' keyword
- if ( !this.preventDefault ) {
+ if ( !(this instanceof jQuery.Event) ) {
return new jQuery.Event( src, props );
}
@@ -3145,8 +3442,8 @@ jQuery.Event = function( src, props ) {
// Events bubbling up the document may have been marked as prevented
// by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
// Event type
} else {
@@ -3158,9 +3455,8 @@ jQuery.Event = function( src, props ) {
jQuery.extend( this, props );
}
- // timeStamp is buggy for some events on Firefox(#3843)
- // So we won't rely on the native value
- this.timeStamp = jQuery.now();
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
// Mark it as fixed
this[ jQuery.expando ] = true;
@@ -3216,216 +3512,130 @@ jQuery.Event.prototype = {
isImmediatePropagationStopped: returnFalse
};
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function( event ) {
-
- // Check if mouse(over|out) are still within the same parent element
- var related = event.relatedTarget,
- inside = false,
- eventType = event.type;
-
- event.type = event.data;
-
- if ( related !== this ) {
-
- if ( related ) {
- inside = jQuery.contains( this, related );
- }
-
- if ( !inside ) {
-
- jQuery.event.handle.apply( this, arguments );
-
- event.type = eventType;
- }
- }
-},
-
-// In case of event delegation, we only need to rename the event.type,
-// liveHandler will take care of the rest.
-delegate = function( event ) {
- event.type = event.data;
- jQuery.event.handle.apply( this, arguments );
-};
-
-// Create mouseenter and mouseleave events
+// Create mouseenter/leave events using mouseover/out and event-time checks
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout"
}, function( orig, fix ) {
jQuery.event.special[ orig ] = {
- setup: function( data ) {
- jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
- },
- teardown: function( data ) {
- jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj,
+ selector = handleObj.selector,
+ ret;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
}
};
});
-// submit delegation
+// IE submit delegation
if ( !jQuery.support.submitBubbles ) {
jQuery.event.special.submit = {
- setup: function( data, namespaces ) {
- if ( !jQuery.nodeName( this, "form" ) ) {
- jQuery.event.add(this, "click.specialSubmit", function( e ) {
- // Avoid triggering error on non-existent type attribute in IE VML (#7071)
- var elem = e.target,
- type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
-
- if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
- trigger( "submit", this, arguments );
- }
- });
-
- jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
- var elem = e.target,
- type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+ setup: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
- if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
- trigger( "submit", this, arguments );
- }
- });
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
+ jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+ // Node name check avoids a VML-related crash in IE (#9807)
+ var elem = e.target,
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+ if ( form && !form._submit_attached ) {
+ jQuery.event.add( form, "submit._submit", function( event ) {
+ // If form was submitted by the user, bubble the event up the tree
+ if ( this.parentNode && !event.isTrigger ) {
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
+ }
+ });
+ form._submit_attached = true;
+ }
+ });
+ // return undefined since we don't need an event listener
+ },
- } else {
+ teardown: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
return false;
}
- },
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialSubmit" );
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+ jQuery.event.remove( this, "._submit" );
}
};
-
}
-// change delegation, happens here so we have bind.
+// IE change delegation and checkbox/radio fix
if ( !jQuery.support.changeBubbles ) {
- var changeFilters,
-
- getVal = function( elem ) {
- var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
- val = elem.value;
-
- if ( type === "radio" || type === "checkbox" ) {
- val = elem.checked;
-
- } else if ( type === "select-multiple" ) {
- val = elem.selectedIndex > -1 ?
- jQuery.map( elem.options, function( elem ) {
- return elem.selected;
- }).join("-") :
- "";
-
- } else if ( jQuery.nodeName( elem, "select" ) ) {
- val = elem.selectedIndex;
- }
-
- return val;
- },
-
- testChange = function testChange( e ) {
- var elem = e.target, data, val;
-
- if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
- return;
- }
-
- data = jQuery._data( elem, "_change_data" );
- val = getVal(elem);
-
- // the current data will be also retrieved by beforeactivate
- if ( e.type !== "focusout" || elem.type !== "radio" ) {
- jQuery._data( elem, "_change_data", val );
- }
-
- if ( data === undefined || val === data ) {
- return;
- }
-
- if ( data != null || val ) {
- e.type = "change";
- e.liveFired = undefined;
- jQuery.event.trigger( e, arguments[1], elem );
- }
- };
-
jQuery.event.special.change = {
- filters: {
- focusout: testChange,
- beforedeactivate: testChange,
+ setup: function() {
- click: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
- testChange.call( this, e );
+ if ( rformElems.test( this.nodeName ) ) {
+ // IE doesn't fire change on a check/radio until blur; trigger it on click
+ // after a propertychange. Eat the blur-change in special.change.handle.
+ // This still fires onchange a second time for check/radio after blur.
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ jQuery.event.add( this, "propertychange._change", function( event ) {
+ if ( event.originalEvent.propertyName === "checked" ) {
+ this._just_changed = true;
+ }
+ });
+ jQuery.event.add( this, "click._change", function( event ) {
+ if ( this._just_changed && !event.isTrigger ) {
+ this._just_changed = false;
+ jQuery.event.simulate( "change", this, event, true );
+ }
+ });
}
- },
-
- // Change has to be called before submit
- // Keydown will be called before keypress, which is used in submit-event delegation
- keydown: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+ return false;
+ }
+ // Delegated event; lazy-add a change handler on descendant inputs
+ jQuery.event.add( this, "beforeactivate._change", function( e ) {
+ var elem = e.target;
- if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
- (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
- type === "select-multiple" ) {
- testChange.call( this, e );
+ if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+ jQuery.event.add( elem, "change._change", function( event ) {
+ if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+ jQuery.event.simulate( "change", this.parentNode, event, true );
+ }
+ });
+ elem._change_attached = true;
}
- },
-
- // Beforeactivate happens also before the previous element is blurred
- // with this event you can't trigger a change event, but you can store
- // information
- beforeactivate: function( e ) {
- var elem = e.target;
- jQuery._data( elem, "_change_data", getVal(elem) );
- }
+ });
},
- setup: function( data, namespaces ) {
- if ( this.type === "file" ) {
- return false;
- }
+ handle: function( event ) {
+ var elem = event.target;
- for ( var type in changeFilters ) {
- jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+ // Swallow native change events from checkbox/radio, we already triggered them above
+ if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+ return event.handleObj.handler.apply( this, arguments );
}
-
- return rformElems.test( this.nodeName );
},
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialChange" );
+ teardown: function() {
+ jQuery.event.remove( this, "._change" );
return rformElems.test( this.nodeName );
}
};
-
- changeFilters = jQuery.event.special.change.filters;
-
- // Handle when the input is .focus()'d
- changeFilters.focus = changeFilters.beforeactivate;
-}
-
-function trigger( type, elem, args ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- // Don't pass args or remember liveFired; they apply to the donor event.
- var event = jQuery.extend( {}, args[ 0 ] );
- event.type = type;
- event.originalEvent = {};
- event.liveFired = undefined;
- jQuery.event.handle.call( elem, event );
- if ( event.isDefaultPrevented() ) {
- args[ 0 ].preventDefault();
- }
}
// Create "bubbling" focus and blur events
@@ -3433,7 +3643,10 @@ if ( !jQuery.support.focusinBubbles ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
// Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0;
+ var attaches = 0,
+ handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
jQuery.event.special[ fix ] = {
setup: function() {
@@ -3447,89 +3660,120 @@ if ( !jQuery.support.focusinBubbles ) {
}
}
};
-
- function handler( donor ) {
- // Donor event is always a native one; fix it and switch its type.
- // Let focusin/out handler cancel the donor focus/blur event.
- var e = jQuery.event.fix( donor );
- e.type = fix;
- e.originalEvent = {};
- jQuery.event.trigger( e, null, e.target );
- if ( e.isDefaultPrevented() ) {
- donor.preventDefault();
- }
- }
});
}
-jQuery.each(["bind", "one"], function( i, name ) {
- jQuery.fn[ name ] = function( type, data, fn ) {
- var handler;
+jQuery.fn.extend({
- // Handle object literals
- if ( typeof type === "object" ) {
- for ( var key in type ) {
- this[ name ](key, data, type[key], fn);
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
}
return this;
}
- if ( arguments.length === 2 || data === false ) {
- fn = data;
- data = undefined;
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
}
- if ( name === "one" ) {
- handler = function( event ) {
- jQuery( this ).unbind( event, handler );
- return fn.apply( this, arguments );
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
};
- handler.guid = fn.guid || jQuery.guid++;
- } else {
- handler = fn;
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
}
-
- if ( type === "unload" && name !== "one" ) {
- this.one( type, data, fn );
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.add( this[i], type, handler, data );
- }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on.call( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ var handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
}
-
- return this;
- };
-});
-
-jQuery.fn.extend({
- unbind: function( type, fn ) {
- // Handle object literals
- if ( typeof type === "object" && !type.preventDefault ) {
- for ( var key in type ) {
- this.unbind(key, type[key]);
- }
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.remove( this[i], type, fn );
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( var type in types ) {
+ this.off( type, selector, types[ type ] );
}
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
}
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+ live: function( types, data, fn ) {
+ jQuery( this.context ).on( types, this.selector, data, fn );
+ return this;
+ },
+ die: function( types, fn ) {
+ jQuery( this.context ).off( types, this.selector || "**", fn );
return this;
},
delegate: function( selector, types, data, fn ) {
- return this.live( types, data, fn, selector );
+ return this.on( types, selector, data, fn );
},
-
undelegate: function( selector, types, fn ) {
- if ( arguments.length === 0 ) {
- return this.unbind( "live" );
-
- } else {
- return this.die( types, null, fn, selector );
- }
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
},
trigger: function( type, data ) {
@@ -3537,7 +3781,6 @@ jQuery.fn.extend({
jQuery.event.trigger( type, data, this );
});
},
-
triggerHandler: function( type, data ) {
if ( this[0] ) {
return jQuery.event.trigger( type, data, this[0], true );
@@ -3551,8 +3794,8 @@ jQuery.fn.extend({
i = 0,
toggler = function( event ) {
// Figure out which function to execute
- var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
// Make sure that clicks stop
event.preventDefault();
@@ -3575,178 +3818,9 @@ jQuery.fn.extend({
}
});
-var liveMap = {
- focus: "focusin",
- blur: "focusout",
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-};
-
-jQuery.each(["live", "die"], function( i, name ) {
- jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
- var type, i = 0, match, namespaces, preType,
- selector = origSelector || this.selector,
- context = origSelector ? this : jQuery( this.context );
-
- if ( typeof types === "object" && !types.preventDefault ) {
- for ( var key in types ) {
- context[ name ]( key, data, types[key], selector );
- }
-
- return this;
- }
-
- if ( name === "die" && !types &&
- origSelector && origSelector.charAt(0) === "." ) {
-
- context.unbind( origSelector );
-
- return this;
- }
-
- if ( data === false || jQuery.isFunction( data ) ) {
- fn = data || returnFalse;
- data = undefined;
- }
-
- types = (types || "").split(" ");
-
- while ( (type = types[ i++ ]) != null ) {
- match = rnamespaces.exec( type );
- namespaces = "";
-
- if ( match ) {
- namespaces = match[0];
- type = type.replace( rnamespaces, "" );
- }
-
- if ( type === "hover" ) {
- types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
- continue;
- }
-
- preType = type;
-
- if ( liveMap[ type ] ) {
- types.push( liveMap[ type ] + namespaces );
- type = type + namespaces;
-
- } else {
- type = (liveMap[ type ] || type) + namespaces;
- }
-
- if ( name === "live" ) {
- // bind live handler
- for ( var j = 0, l = context.length; j < l; j++ ) {
- jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
- { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
- }
-
- } else {
- // unbind live handler
- context.unbind( "live." + liveConvert( type, selector ), fn );
- }
- }
-
- return this;
- };
-});
-
-function liveHandler( event ) {
- var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
- elems = [],
- selectors = [],
- events = jQuery._data( this, "events" );
-
- // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
- if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
- return;
- }
-
- if ( event.namespace ) {
- namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- event.liveFired = this;
-
- var live = events.live.slice(0);
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
- selectors.push( handleObj.selector );
-
- } else {
- live.splice( j--, 1 );
- }
- }
-
- match = jQuery( event.target ).closest( selectors, event.currentTarget );
-
- for ( i = 0, l = match.length; i < l; i++ ) {
- close = match[i];
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
- elem = close.elem;
- related = null;
-
- // Those two events require additional checking
- if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
- event.type = handleObj.preType;
- related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
-
- // Make sure not to accidentally match a child element with the same selector
- if ( related && jQuery.contains( elem, related ) ) {
- related = elem;
- }
- }
-
- if ( !related || related !== elem ) {
- elems.push({ elem: elem, handleObj: handleObj, level: close.level });
- }
- }
- }
- }
-
- for ( i = 0, l = elems.length; i < l; i++ ) {
- match = elems[i];
-
- if ( maxLevel && match.level > maxLevel ) {
- break;
- }
-
- event.currentTarget = match.elem;
- event.data = match.handleObj.data;
- event.handleObj = match.handleObj;
-
- ret = match.handleObj.origHandler.apply( match.elem, arguments );
-
- if ( ret === false || event.isPropagationStopped() ) {
- maxLevel = match.level;
-
- if ( ret === false ) {
- stop = false;
- }
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
-
- return stop;
-}
-
-function liveConvert( type, selector ) {
- return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
-}
-
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
// Handle event binding
jQuery.fn[ name ] = function( data, fn ) {
@@ -3756,13 +3830,21 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
}
return arguments.length > 0 ?
- this.bind( name, data, fn ) :
+ this.on( name, null, data, fn ) :
this.trigger( name );
};
if ( jQuery.attrFn ) {
jQuery.attrFn[ name ] = true;
}
+
+ if ( rkeyEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+ }
+
+ if ( rmouseEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+ }
});
@@ -3776,11 +3858,13 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
(function(){
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ expando = "sizcache" + (Math.random() + '').replace('.', ''),
done = 0,
toString = Object.prototype.toString,
hasDuplicate = false,
baseHasDuplicate = true,
rBackslash = /\\/g,
+ rReturn = /\r\n/g,
rNonWord = /\W/;
// Here we check if the JavaScript engine is using some sort of
@@ -3832,7 +3916,7 @@ var Sizzle = function( selector, context, results, seed ) {
if ( parts.length > 1 && origPOS.exec( selector ) ) {
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context );
+ set = posProcess( parts[0] + parts[1], context, seed );
} else {
set = Expr.relative[ parts[0] ] ?
@@ -3846,7 +3930,7 @@ var Sizzle = function( selector, context, results, seed ) {
selector += parts.shift();
}
- set = posProcess( selector, set );
+ set = posProcess( selector, set, seed );
}
}
@@ -3965,18 +4049,17 @@ Sizzle.matchesSelector = function( node, expr ) {
};
Sizzle.find = function( expr, context, isXML ) {
- var set;
+ var set, i, len, match, type, left;
if ( !expr ) {
return [];
}
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var match,
- type = Expr.order[i];
+ for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+ type = Expr.order[i];
if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- var left = match[1];
+ left = match[1];
match.splice( 1, 1 );
if ( left.substr( left.length - 1 ) !== "\\" ) {
@@ -4002,17 +4085,18 @@ Sizzle.find = function( expr, context, isXML ) {
Sizzle.filter = function( expr, set, inplace, not ) {
var match, anyFound,
+ type, found, item, filter, left,
+ i, pass,
old = expr,
result = [],
curLoop = set,
isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
+ for ( type in Expr.filter ) {
if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- var found, item,
- filter = Expr.filter[ type ],
- left = match[1];
+ filter = Expr.filter[ type ];
+ left = match[1];
anyFound = false;
@@ -4038,10 +4122,10 @@ Sizzle.filter = function( expr, set, inplace, not ) {
}
if ( match ) {
- for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ for ( i = 0; (item = curLoop[i]) != null; i++ ) {
if ( item ) {
found = filter( item, match, i, curLoop );
- var pass = not ^ !!found;
+ pass = not ^ found;
if ( inplace && found != null ) {
if ( pass ) {
@@ -4092,7 +4176,46 @@ Sizzle.filter = function( expr, set, inplace, not ) {
};
Sizzle.error = function( msg ) {
- throw "Syntax error, unrecognized expression: " + msg;
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+ var i, node,
+ nodeType = elem.nodeType,
+ ret = "";
+
+ if ( nodeType ) {
+ if ( nodeType === 1 || nodeType === 9 ) {
+ // Use textContent || innerText for elements
+ if ( typeof elem.textContent === 'string' ) {
+ return elem.textContent;
+ } else if ( typeof elem.innerText === 'string' ) {
+ // Replace IE's carriage returns
+ return elem.innerText.replace( rReturn, '' );
+ } else {
+ // Traverse it's children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ } else {
+
+ // If no nodeType, this is expected to be an array
+ for ( i = 0; (node = elem[i]); i++ ) {
+ // Do not traverse comment nodes
+ if ( node.nodeType !== 8 ) {
+ ret += getText( node );
+ }
+ }
+ }
+ return ret;
};
var Expr = Sizzle.selectors = {
@@ -4482,7 +4605,7 @@ var Expr = Sizzle.selectors = {
return filter( elem, i, match, array );
} else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
} else if ( name === "not" ) {
var not = match[3];
@@ -4501,7 +4624,10 @@ var Expr = Sizzle.selectors = {
},
CHILD: function( elem, match ) {
- var type = match[1],
+ var first, last,
+ doneName, parent, cache,
+ count, diff,
+ type = match[1],
node = elem;
switch ( type ) {
@@ -4529,18 +4655,18 @@ var Expr = Sizzle.selectors = {
return true;
case "nth":
- var first = match[2],
- last = match[3];
+ first = match[2];
+ last = match[3];
if ( first === 1 && last === 0 ) {
return true;
}
- var doneName = match[0],
- parent = elem.parentNode;
+ doneName = match[0];
+ parent = elem.parentNode;
- if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
- var count = 0;
+ if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+ count = 0;
for ( node = parent.firstChild; node; node = node.nextSibling ) {
if ( node.nodeType === 1 ) {
@@ -4548,10 +4674,10 @@ var Expr = Sizzle.selectors = {
}
}
- parent.sizcache = doneName;
+ parent[ expando ] = doneName;
}
- var diff = elem.nodeIndex - last;
+ diff = elem.nodeIndex - last;
if ( first === 0 ) {
return diff === 0;
@@ -4567,7 +4693,7 @@ var Expr = Sizzle.selectors = {
},
TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+ return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
},
CLASS: function( elem, match ) {
@@ -4577,7 +4703,9 @@ var Expr = Sizzle.selectors = {
ATTR: function( elem, match ) {
var name = match[1],
- result = Expr.attrHandle[ name ] ?
+ result = Sizzle.attr ?
+ Sizzle.attr( elem, name ) :
+ Expr.attrHandle[ name ] ?
Expr.attrHandle[ name ]( elem ) :
elem[ name ] != null ?
elem[ name ] :
@@ -4588,6 +4716,8 @@ var Expr = Sizzle.selectors = {
return result == null ?
type === "!=" :
+ !type && Sizzle.attr ?
+ result != null :
type === "=" ?
value === check :
type === "*=" ?
@@ -4768,26 +4898,6 @@ if ( document.documentElement.compareDocumentPosition ) {
};
}
-// Utility function for retreiving the text value of an array of DOM nodes
-Sizzle.getText = function( elems ) {
- var ret = "", elem;
-
- for ( var i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += Sizzle.getText( elem.childNodes );
- }
- }
-
- return ret;
-};
-
// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
@@ -5065,13 +5175,13 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
elem = elem[dir];
while ( elem ) {
- if ( elem.sizcache === doneName ) {
+ if ( elem[ expando ] === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 && !isXML ){
- elem.sizcache = doneName;
+ elem[ expando ] = doneName;
elem.sizset = i;
}
@@ -5098,14 +5208,14 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
elem = elem[dir];
while ( elem ) {
- if ( elem.sizcache === doneName ) {
+ if ( elem[ expando ] === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 ) {
if ( !isXML ) {
- elem.sizcache = doneName;
+ elem[ expando ] = doneName;
elem.sizset = i;
}
@@ -5153,7 +5263,7 @@ Sizzle.isXML = function( elem ) {
return documentElement ? documentElement.nodeName !== "HTML" : false;
};
-var posProcess = function( selector, context ) {
+var posProcess = function( selector, context, seed ) {
var match,
tmpSet = [],
later = "",
@@ -5169,13 +5279,16 @@ var posProcess = function( selector, context ) {
selector = Expr.relative[selector] ? selector + "*" : selector;
for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet );
+ Sizzle( selector, root[i], tmpSet, seed );
}
return Sizzle.filter( later, tmpSet );
};
// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
@@ -5261,43 +5374,33 @@ jQuery.fn.extend({
},
is: function( selector ) {
- return !!selector && ( typeof selector === "string" ?
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
+ return !!selector && (
+ typeof selector === "string" ?
+ // If this is a positional selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ POS.test( selector ) ?
+ jQuery( selector, this.context ).index( this[0] ) >= 0 :
+ jQuery.filter( selector, this ).length > 0 :
+ this.filter( selector ).length > 0 );
},
closest: function( selectors, context ) {
var ret = [], i, l, cur = this[0];
- // Array
+ // Array (deprecated as of jQuery 1.7)
if ( jQuery.isArray( selectors ) ) {
- var match, selector,
- matches = {},
- level = 1;
-
- if ( cur && selectors.length ) {
- for ( i = 0, l = selectors.length; i < l; i++ ) {
- selector = selectors[i];
-
- if ( !matches[ selector ] ) {
- matches[ selector ] = POS.test( selector ) ?
- jQuery( selector, context || this.context ) :
- selector;
- }
- }
+ var level = 1;
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( selector in matches ) {
- match = matches[ selector ];
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( i = 0; i < selectors.length; i++ ) {
- if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
- ret.push({ selector: selector, elem: cur, level: level });
- }
+ if ( jQuery( cur ).is( selectors[ i ] ) ) {
+ ret.push({ selector: selectors[ i ], elem: cur, level: level });
}
-
- cur = cur.parentNode;
- level++;
}
+
+ cur = cur.parentNode;
+ level++;
}
return ret;
@@ -5414,12 +5517,7 @@ jQuery.each({
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until ),
- // The variable 'args' was introduced in
- // https://github.com/jquery/jquery/commit/52a0238
- // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
- // http://code.google.com/p/v8/issues/detail?id=1050
- args = slice.call(arguments);
+ var ret = jQuery.map( this, fn, until );
if ( !runtil.test( name ) ) {
selector = until;
@@ -5435,7 +5533,7 @@ jQuery.each({
ret = ret.reverse();
}
- return this.pushStack( ret, name, args.join(",") );
+ return this.pushStack( ret, name, slice.call( arguments ).join(",") );
};
});
@@ -5504,7 +5602,7 @@ function winnow( elements, qualifier, keep ) {
} else if ( qualifier.nodeType ) {
return jQuery.grep(elements, function( elem, i ) {
- return (elem === qualifier) === keep;
+ return ( elem === qualifier ) === keep;
});
} else if ( typeof qualifier === "string" ) {
@@ -5520,20 +5618,38 @@ function winnow( elements, qualifier, keep ) {
}
return jQuery.grep(elements, function( elem, i ) {
- return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+ return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
});
}
-var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+function createSafeFragment( document ) {
+ var list = nodeNames.split( "|" ),
+ safeFrag = document.createDocumentFragment();
+
+ if ( safeFrag.createElement ) {
+ while ( list.length ) {
+ safeFrag.createElement(
+ list.pop()
+ );
+ }
+ }
+ return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+ "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+ rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
rleadingWhitespace = /^\s+/,
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
rtagName = /<([\w:]+)/,
rtbody = /<tbody/i,
rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style)/i,
rnocache = /<(?:script|object|embed|option|style)/i,
+ rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
// checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rscriptType = /\/(java|ecma)script/i,
@@ -5547,7 +5663,8 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
area: [ 1, "<map>", "</map>" ],
_default: [ 0, "", "" ]
- };
+ },
+ safeFragment = createSafeFragment( document );
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
@@ -5625,8 +5742,10 @@ jQuery.fn.extend({
},
wrap: function( html ) {
- return this.each(function() {
- jQuery( this ).wrapAll( html );
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function(i) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
});
},
@@ -5660,7 +5779,7 @@ jQuery.fn.extend({
this.parentNode.insertBefore( elem, this );
});
} else if ( arguments.length ) {
- var set = jQuery(arguments[0]);
+ var set = jQuery.clean( arguments );
set.push.apply( set, this.toArray() );
return this.pushStack( set, "before", arguments );
}
@@ -5673,7 +5792,7 @@ jQuery.fn.extend({
});
} else if ( arguments.length ) {
var set = this.pushStack( this, "after", arguments );
- set.push.apply( set, jQuery(arguments[0]).toArray() );
+ set.push.apply( set, jQuery.clean(arguments) );
return set;
}
},
@@ -5728,7 +5847,7 @@ jQuery.fn.extend({
null;
// See if we can take a shortcut and just use innerHTML
- } else if ( typeof value === "string" && !rnocache.test( value ) &&
+ } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
@@ -5854,7 +5973,7 @@ jQuery.fn.extend({
// in certain situations (Bug #8070).
// Fragments from the fragment cache must always be cloned and never used
// in place.
- results.cacheable || (l > 1 && i < lastIndex) ?
+ results.cacheable || ( l > 1 && i < lastIndex ) ?
jQuery.clone( fragment, true, true ) :
fragment
);
@@ -5883,27 +6002,26 @@ function cloneCopyEvent( src, dest ) {
return;
}
- var internalKey = jQuery.expando,
- oldData = jQuery.data( src ),
- curData = jQuery.data( dest, oldData );
-
- // Switch to use the internal data object, if it exists, for the next
- // stage of data copying
- if ( (oldData = oldData[ internalKey ]) ) {
- var events = oldData.events;
- curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+ var type, i, l,
+ oldData = jQuery._data( src ),
+ curData = jQuery._data( dest, oldData ),
+ events = oldData.events;
- if ( events ) {
- delete curData.handle;
- curData.events = {};
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
- for ( var type in events ) {
- for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
- }
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
}
}
}
+
+ // make the cloned public data object a copy from the original
+ if ( curData.data ) {
+ curData.data = jQuery.extend( {}, curData.data );
+ }
}
function cloneFixAttributes( src, dest ) {
@@ -5965,16 +6083,17 @@ function cloneFixAttributes( src, dest ) {
}
jQuery.buildFragment = function( args, nodes, scripts ) {
- var fragment, cacheable, cacheresults, doc;
-
- // nodes may contain either an explicit document object,
- // a jQuery collection or context object.
- // If nodes[0] contains a valid object to assign to doc
- if ( nodes && nodes[0] ) {
- doc = nodes[0].ownerDocument || nodes[0];
- }
+ var fragment, cacheable, cacheresults, doc,
+ first = args[ 0 ];
+
+ // nodes may contain either an explicit document object,
+ // a jQuery collection or context object.
+ // If nodes[0] contains a valid object to assign to doc
+ if ( nodes && nodes[0] ) {
+ doc = nodes[0].ownerDocument || nodes[0];
+ }
- // Ensure that an attr object doesn't incorrectly stand in as a document object
+ // Ensure that an attr object doesn't incorrectly stand in as a document object
// Chrome and Firefox seem to allow this to occur and will throw exception
// Fixes #8950
if ( !doc.createDocumentFragment ) {
@@ -5985,12 +6104,15 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
// Cloning options loses the selected state, so don't cache them
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
- args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+ // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+ if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+ first.charAt(0) === "<" && !rnocache.test( first ) &&
+ (jQuery.support.checkClone || !rchecked.test( first )) &&
+ (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
cacheable = true;
- cacheresults = jQuery.fragments[ args[0] ];
+ cacheresults = jQuery.fragments[ first ];
if ( cacheresults && cacheresults !== 1 ) {
fragment = cacheresults;
}
@@ -6002,7 +6124,7 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
}
if ( cacheable ) {
- jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+ jQuery.fragments[ first ] = cacheresults ? fragment : 1;
}
return { fragment: fragment, cacheable: cacheable };
@@ -6028,7 +6150,7 @@ jQuery.each({
} else {
for ( var i = 0, l = insert.length; i < l; i++ ) {
- var elems = (i > 0 ? this.clone(true) : this).get();
+ var elems = ( i > 0 ? this.clone(true) : this ).get();
jQuery( insert[i] )[ original ]( elems );
ret = ret.concat( elems );
}
@@ -6039,10 +6161,10 @@ jQuery.each({
});
function getAll( elem ) {
- if ( "getElementsByTagName" in elem ) {
+ if ( typeof elem.getElementsByTagName !== "undefined" ) {
return elem.getElementsByTagName( "*" );
- } else if ( "querySelectorAll" in elem ) {
+ } else if ( typeof elem.querySelectorAll !== "undefined" ) {
return elem.querySelectorAll( "*" );
} else {
@@ -6058,19 +6180,33 @@ function fixDefaultChecked( elem ) {
}
// Finds all inputs and passes them to fixDefaultChecked
function findInputs( elem ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "input" ) {
fixDefaultChecked( elem );
- } else if ( "getElementsByTagName" in elem ) {
+ // Skip scripts, get other children
+ } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
}
}
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+ var div = document.createElement( "div" );
+ safeFragment.appendChild( div );
+
+ div.innerHTML = elem.outerHTML;
+ return div.firstChild;
+}
+
jQuery.extend({
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var clone = elem.cloneNode(true),
- srcElements,
- destElements,
- i;
+ var srcElements,
+ destElements,
+ i,
+ // IE<=8 does not properly clone detached, unknown element nodes
+ clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+ elem.cloneNode( true ) :
+ shimCloneNode( elem );
if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
@@ -6082,8 +6218,7 @@ jQuery.extend({
cloneFixAttributes( elem, clone );
- // Using Sizzle here is crazy slow, so we use getElementsByTagName
- // instead
+ // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
srcElements = getAll( elem );
destElements = getAll( clone );
@@ -6148,11 +6283,20 @@ jQuery.extend({
elem = elem.replace(rxhtmlTag, "<$1></$2>");
// Trim whitespace, otherwise indexOf won't work as expected
- var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+ var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement("div");
+ // Append wrapper element to unknown element safe doc fragment
+ if ( context === document ) {
+ // Use the fragment we've already created for this document
+ safeFragment.appendChild( div );
+ } else {
+ // Use a fragment created with the owner document
+ createSafeFragment( context ).appendChild( div );
+ }
+
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];
@@ -6233,7 +6377,9 @@ jQuery.extend({
},
cleanData: function( elems ) {
- var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+ var data, id,
+ cache = jQuery.cache,
+ special = jQuery.event.special,
deleteExpando = jQuery.support.deleteExpando;
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
@@ -6244,7 +6390,7 @@ jQuery.extend({
id = elem[ jQuery.expando ];
if ( id ) {
- data = cache[ id ] && cache[ id ][ internalKey ];
+ data = cache[ id ];
if ( data && data.events ) {
for ( var type in data.events ) {
@@ -6506,7 +6652,7 @@ if ( !jQuery.support.opacity ) {
set: function( elem, value ) {
var style = elem.style,
currentStyle = elem.currentStyle,
- opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
+ opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
filter = currentStyle && currentStyle.filter || style.filter || "";
// IE has trouble with opacity if it does not have layout
@@ -6563,11 +6709,8 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) {
name = name.replace( rupper, "-$1" ).toLowerCase();
- if ( !(defaultView = elem.ownerDocument.defaultView) ) {
- return undefined;
- }
-
- if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+ if ( (defaultView = elem.ownerDocument.defaultView) &&
+ (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
ret = computedStyle.getPropertyValue( name );
if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
ret = jQuery.style( elem, name );
@@ -6580,25 +6723,32 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) {
if ( document.documentElement.currentStyle ) {
currentStyle = function( elem, name ) {
- var left,
+ var left, rsLeft, uncomputed,
ret = elem.currentStyle && elem.currentStyle[ name ],
- rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
style = elem.style;
+ // Avoid setting ret to empty string here
+ // so we don't default to auto
+ if ( ret === null && style && (uncomputed = style[ name ]) ) {
+ ret = uncomputed;
+ }
+
// From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels
if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
// Remember the original values
left = style.left;
+ rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
// Put in the new values to get a computed value out
if ( rsLeft ) {
elem.runtimeStyle.left = elem.currentStyle.left;
}
- style.left = name === "fontSize" ? "1em" : (ret || 0);
+ style.left = name === "fontSize" ? "1em" : ( ret || 0 );
ret = style.pixelLeft + "px";
// Revert the changed values
@@ -6618,20 +6768,22 @@ function getWH( elem, name, extra ) {
// Start with offset property
var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- which = name === "width" ? cssWidth : cssHeight;
+ which = name === "width" ? cssWidth : cssHeight,
+ i = 0,
+ len = which.length;
if ( val > 0 ) {
if ( extra !== "border" ) {
- jQuery.each( which, function() {
+ for ( ; i < len; i++ ) {
if ( !extra ) {
- val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+ val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
}
if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+ val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
} else {
- val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+ val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
}
- });
+ }
}
return val + "px";
@@ -6647,15 +6799,15 @@ function getWH( elem, name, extra ) {
// Add padding, border, margin
if ( extra ) {
- jQuery.each( which, function() {
- val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+ for ( ; i < len; i++ ) {
+ val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
if ( extra !== "padding" ) {
- val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+ val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
}
if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+ val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
}
- });
+ }
}
return val + "px";
@@ -6666,7 +6818,7 @@ if ( jQuery.expr && jQuery.expr.filters ) {
var width = elem.offsetWidth,
height = elem.offsetHeight;
- return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+ return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
};
jQuery.expr.filters.visible = function( elem ) {
@@ -6720,7 +6872,7 @@ var r20 = /%20/g,
// Document location segments
ajaxLocParts,
-
+
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
allTypes = ["*/"] + ["*"];
@@ -6759,7 +6911,7 @@ function addToPrefiltersOrTransports( structure ) {
placeBefore;
// For each dataType in the dataTypeExpression
- for(; i < length; i++ ) {
+ for ( ; i < length; i++ ) {
dataType = dataTypes[ i ];
// We control if we're asked to add before
// any existing element
@@ -6790,7 +6942,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
executeOnly = ( structure === prefilters ),
selection;
- for(; i < length && ( executeOnly || !selection ); i++ ) {
+ for ( ; i < length && ( executeOnly || !selection ); i++ ) {
selection = list[ i ]( options, originalOptions, jqXHR );
// If we got redirected to another dataType
// we try there if executing only and not done already
@@ -6821,7 +6973,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
function ajaxExtend( target, src ) {
var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
- for( key in src ) {
+ for ( key in src ) {
if ( src[ key ] !== undefined ) {
( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
}
@@ -6938,7 +7090,7 @@ jQuery.fn.extend({
// Attach a bunch of functions for handling common AJAX events
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
jQuery.fn[ o ] = function( f ){
- return this.bind( o, f );
+ return this.on( o, f );
};
});
@@ -7080,7 +7232,7 @@ jQuery.extend({
jQuery( callbackContext ) : jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
- completeDeferred = jQuery._Deferred(),
+ completeDeferred = jQuery.Callbacks( "once memory" ),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// ifModified key
@@ -7230,7 +7382,7 @@ jQuery.extend({
// We extract error from statusText
// then normalize statusText and status for non-aborts
error = statusText;
- if( !statusText || status ) {
+ if ( !statusText || status ) {
statusText = "error";
if ( status < 0 ) {
status = 0;
@@ -7259,7 +7411,7 @@ jQuery.extend({
}
// Complete
- completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
@@ -7274,14 +7426,14 @@ jQuery.extend({
deferred.promise( jqXHR );
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
- jqXHR.complete = completeDeferred.done;
+ jqXHR.complete = completeDeferred.add;
// Status-dependent callbacks
jqXHR.statusCode = function( map ) {
if ( map ) {
var tmp;
if ( state < 2 ) {
- for( tmp in map ) {
+ for ( tmp in map ) {
statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
}
} else {
@@ -7358,7 +7510,7 @@ jQuery.extend({
ret = s.url.replace( rts, "$1_=" + ts );
// if nothing was replaced, add timestamp to the end
- s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+ s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
}
}
@@ -7432,7 +7584,7 @@ jQuery.extend({
done( -1, e );
// Simply rethrow otherwise
} else {
- jQuery.error( e );
+ throw e;
}
}
}
@@ -7536,7 +7688,7 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
firstDataType;
// Fill responseXXX fields
- for( type in responseFields ) {
+ for ( type in responseFields ) {
if ( type in responses ) {
jqXHR[ responseFields[type] ] = responses[ type ];
}
@@ -7615,13 +7767,13 @@ function ajaxConvert( s, response ) {
conv2;
// For each dataType in the chain
- for( i = 1; i < length; i++ ) {
+ for ( i = 1; i < length; i++ ) {
// Create converters map
// with lowercased keys
if ( i === 1 ) {
- for( key in s.converters ) {
- if( typeof key === "string" ) {
+ for ( key in s.converters ) {
+ if ( typeof key === "string" ) {
converters[ key.toLowerCase() ] = s.converters[ key ];
}
}
@@ -7632,7 +7784,7 @@ function ajaxConvert( s, response ) {
current = dataTypes[ i ];
// If current is auto dataType, update it to prev
- if( current === "*" ) {
+ if ( current === "*" ) {
current = prev;
// If no auto and dataTypes are actually different
} else if ( prev !== "*" && prev !== current ) {
@@ -7644,7 +7796,7 @@ function ajaxConvert( s, response ) {
// If there is no direct converter, search transitively
if ( !conv ) {
conv2 = undefined;
- for( conv1 in converters ) {
+ for ( conv1 in converters ) {
tmp = conv1.split( " " );
if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
conv2 = converters[ tmp[1] + " " + current ];
@@ -8083,11 +8235,11 @@ jQuery.fn.extend({
var elem, display;
if ( speed || speed === 0 ) {
- return this.animate( genFx("show", 3), speed, easing, callback);
+ return this.animate( genFx("show", 3), speed, easing, callback );
} else {
for ( var i = 0, j = this.length; i < j; i++ ) {
- elem = this[i];
+ elem = this[ i ];
if ( elem.style ) {
display = elem.style.display;
@@ -8101,8 +8253,8 @@ jQuery.fn.extend({
// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
- if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
- jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+ if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+ jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
}
}
}
@@ -8110,13 +8262,13 @@ jQuery.fn.extend({
// Set the display of most of the elements in a second loop
// to avoid the constant reflow
for ( i = 0; i < j; i++ ) {
- elem = this[i];
+ elem = this[ i ];
if ( elem.style ) {
display = elem.style.display;
if ( display === "" || display === "none" ) {
- elem.style.display = jQuery._data(elem, "olddisplay") || "";
+ elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
}
}
}
@@ -8130,12 +8282,17 @@ jQuery.fn.extend({
return this.animate( genFx("hide", 3), speed, easing, callback);
} else {
- for ( var i = 0, j = this.length; i < j; i++ ) {
- if ( this[i].style ) {
- var display = jQuery.css( this[i], "display" );
+ var elem, display,
+ i = 0,
+ j = this.length;
+
+ for ( ; i < j; i++ ) {
+ elem = this[i];
+ if ( elem.style ) {
+ display = jQuery.css( elem, "display" );
- if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
- jQuery._data( this[i], "olddisplay", display );
+ if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+ jQuery._data( elem, "olddisplay", display );
}
}
}
@@ -8180,7 +8337,7 @@ jQuery.fn.extend({
},
animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed(speed, easing, callback);
+ var optall = jQuery.speed( speed, easing, callback );
if ( jQuery.isEmptyObject( prop ) ) {
return this.each( optall.complete, [ false ] );
@@ -8189,7 +8346,7 @@ jQuery.fn.extend({
// Do not change referenced properties as per-property easing will be lost
prop = jQuery.extend( {}, prop );
- return this[ optall.queue === false ? "each" : "queue" ](function() {
+ function doAnimation() {
// XXX 'this' does not always have a nodeName when running the
// test suite
@@ -8200,9 +8357,9 @@ jQuery.fn.extend({
var opt = jQuery.extend( {}, optall ),
isElement = this.nodeType === 1,
hidden = isElement && jQuery(this).is(":hidden"),
- name, val, p,
- display, e,
- parts, start, end, unit;
+ name, val, p, e,
+ parts, start, end, unit,
+ method;
// will store per property easing and be used to determine when an animation is complete
opt.animatedProperties = {};
@@ -8238,25 +8395,17 @@ jQuery.fn.extend({
opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
// Set display property to inline-block for height/width
- // animations on inline elements that are having width/height
- // animated
+ // animations on inline elements that are having width/height animated
if ( jQuery.css( this, "display" ) === "inline" &&
jQuery.css( this, "float" ) === "none" ) {
- if ( !jQuery.support.inlineBlockNeedsLayout ) {
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
this.style.display = "inline-block";
} else {
- display = defaultDisplay( this.nodeName );
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( display === "inline" ) {
- this.style.display = "inline-block";
-
- } else {
- this.style.display = "inline";
- this.style.zoom = 1;
- }
+ this.style.zoom = 1;
}
}
}
@@ -8270,8 +8419,17 @@ jQuery.fn.extend({
e = new jQuery.fx( this, opt, p );
val = prop[ p ];
- if ( rfxtypes.test(val) ) {
- e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+ if ( rfxtypes.test( val ) ) {
+
+ // Tracks whether to show or hide based on private
+ // data attached to the element
+ method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+ if ( method ) {
+ jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+ e[ method ]();
+ } else {
+ e[ val ]();
+ }
} else {
parts = rfxnum.exec( val );
@@ -8284,7 +8442,7 @@ jQuery.fn.extend({
// We need to compute starting value
if ( unit !== "px" ) {
jQuery.style( this, p, (end || 1) + unit);
- start = ((end || 1) / e.cur()) * start;
+ start = ( (end || 1) / e.cur() ) * start;
jQuery.style( this, p, start + unit);
}
@@ -8303,39 +8461,71 @@ jQuery.fn.extend({
// For JS strict compliance
return true;
- });
+ }
+
+ return optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
},
- stop: function( clearQueue, gotoEnd ) {
- if ( clearQueue ) {
- this.queue([]);
+ stop: function( type, clearQueue, gotoEnd ) {
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
}
- this.each(function() {
- var timers = jQuery.timers,
- i = timers.length;
+ return this.each(function() {
+ var index,
+ hadTimers = false,
+ timers = jQuery.timers,
+ data = jQuery._data( this );
+
// clear marker counters if we know they won't be
if ( !gotoEnd ) {
jQuery._unmark( true, this );
}
- while ( i-- ) {
- if ( timers[i].elem === this ) {
- if (gotoEnd) {
- // force the next step to be the last
- timers[i](true);
- }
- timers.splice(i, 1);
+ function stopQueue( elem, data, index ) {
+ var hooks = data[ index ];
+ jQuery.removeData( elem, index, true );
+ hooks.stop( gotoEnd );
+ }
+
+ if ( type == null ) {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+ stopQueue( this, data, index );
+ }
}
+ } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+ stopQueue( this, data, index );
}
- });
- // start the next in the queue if the last step wasn't forced
- if ( !gotoEnd ) {
- this.dequeue();
- }
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ if ( gotoEnd ) {
- return this;
+ // force the next step to be the last
+ timers[ index ]( true );
+ } else {
+ timers[ index ].saveState();
+ }
+ hadTimers = true;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( !( gotoEnd && hadTimers ) ) {
+ jQuery.dequeue( this, type );
+ }
+ });
}
});
@@ -8354,7 +8544,7 @@ function clearFxNow() {
function genFx( type, num ) {
var obj = {};
- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
obj[ this ] = type;
});
@@ -8363,9 +8553,9 @@ function genFx( type, num ) {
// Generate shortcuts for custom animations
jQuery.each({
- slideDown: genFx("show", 1),
- slideUp: genFx("hide", 1),
- slideToggle: genFx("toggle", 1),
+ slideDown: genFx( "show", 1 ),
+ slideUp: genFx( "hide", 1 ),
+ slideToggle: genFx( "toggle", 1 ),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }
@@ -8377,25 +8567,31 @@ jQuery.each({
jQuery.extend({
speed: function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
complete: fn || !fn && easing ||
jQuery.isFunction( speed ) && speed,
duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
};
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
// Queueing
opt.old = opt.complete;
+
opt.complete = function( noUnmark ) {
if ( jQuery.isFunction( opt.old ) ) {
opt.old.call( this );
}
- if ( opt.queue !== false ) {
- jQuery.dequeue( this );
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
} else if ( noUnmark !== false ) {
jQuery._unmark( this );
}
@@ -8409,7 +8605,7 @@ jQuery.extend({
return firstNum + diff * p;
},
swing: function( p, n, firstNum, diff ) {
- return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
}
},
@@ -8432,12 +8628,12 @@ jQuery.fx.prototype = {
this.options.step.call( this.elem, this.now, this );
}
- (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+ ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
},
// Get the current size
cur: function() {
- if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+ if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
return this.elem[ this.prop ];
}
@@ -8455,17 +8651,22 @@ jQuery.fx.prototype = {
fx = jQuery.fx;
this.startTime = fxNow || createFxNow();
- this.start = from;
this.end = to;
- this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
- this.now = this.start;
+ this.now = this.start = from;
this.pos = this.state = 0;
+ this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
function t( gotoEnd ) {
- return self.step(gotoEnd);
+ return self.step( gotoEnd );
}
+ t.queue = this.options.queue;
t.elem = this.elem;
+ t.saveState = function() {
+ if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+ jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+ }
+ };
if ( t() && jQuery.timers.push(t) && !timerId ) {
timerId = setInterval( fx.tick, fx.interval );
@@ -8474,14 +8675,20 @@ jQuery.fx.prototype = {
// Simple 'show' function
show: function() {
+ var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
// Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
this.options.show = true;
// Begin the animation
- // Make sure that we start at a small width/height to avoid any
- // flash of content
- this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+ // Make sure that we start at a small width/height to avoid any flash of content
+ if ( dataShow !== undefined ) {
+ // This show is picking up where a previous hide or show left off
+ this.custom( this.cur(), dataShow );
+ } else {
+ this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+ }
// Start by showing the element
jQuery( this.elem ).show();
@@ -8490,20 +8697,20 @@ jQuery.fx.prototype = {
// Simple 'hide' function
hide: function() {
// Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
this.options.hide = true;
// Begin the animation
- this.custom(this.cur(), 0);
+ this.custom( this.cur(), 0 );
},
// Each step of an animation
step: function( gotoEnd ) {
- var t = fxNow || createFxNow(),
+ var p, n, complete,
+ t = fxNow || createFxNow(),
done = true,
elem = this.elem,
- options = this.options,
- i, n;
+ options = this.options;
if ( gotoEnd || t >= options.duration + this.startTime ) {
this.now = this.end;
@@ -8512,8 +8719,8 @@ jQuery.fx.prototype = {
options.animatedProperties[ this.prop ] = true;
- for ( i in options.animatedProperties ) {
- if ( options.animatedProperties[i] !== true ) {
+ for ( p in options.animatedProperties ) {
+ if ( options.animatedProperties[ p ] !== true ) {
done = false;
}
}
@@ -8522,25 +8729,36 @@ jQuery.fx.prototype = {
// Reset the overflow
if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
- jQuery.each( [ "", "X", "Y" ], function (index, value) {
- elem.style[ "overflow" + value ] = options.overflow[index];
+ jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+ elem.style[ "overflow" + value ] = options.overflow[ index ];
});
}
// Hide the element if the "hide" operation was done
if ( options.hide ) {
- jQuery(elem).hide();
+ jQuery( elem ).hide();
}
// Reset the properties, if the item has been hidden or shown
if ( options.hide || options.show ) {
- for ( var p in options.animatedProperties ) {
- jQuery.style( elem, p, options.orig[p] );
+ for ( p in options.animatedProperties ) {
+ jQuery.style( elem, p, options.orig[ p ] );
+ jQuery.removeData( elem, "fxshow" + p, true );
+ // Toggle data is no longer needed
+ jQuery.removeData( elem, "toggle" + p, true );
}
}
// Execute the complete function
- options.complete.call( elem );
+ // in the event that the complete function throws an exception
+ // we must ensure it won't be called twice. #5684
+
+ complete = options.complete;
+ if ( complete ) {
+
+ options.complete = false;
+ complete.call( elem );
+ }
}
return false;
@@ -8554,8 +8772,8 @@ jQuery.fx.prototype = {
this.state = n / options.duration;
// Perform the easing function, defaults to swing
- this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
- this.now = this.start + ((this.end - this.start) * this.pos);
+ this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+ this.now = this.start + ( (this.end - this.start) * this.pos );
}
// Perform the next step of the animation
this.update();
@@ -8567,9 +8785,15 @@ jQuery.fx.prototype = {
jQuery.extend( jQuery.fx, {
tick: function() {
- for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
- if ( !timers[i]() ) {
- timers.splice(i--, 1);
+ var timer,
+ timers = jQuery.timers,
+ i = 0;
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
}
}
@@ -8599,7 +8823,7 @@ jQuery.extend( jQuery.fx, {
_default: function( fx ) {
if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
- fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+ fx.elem.style[ fx.prop ] = fx.now + fx.unit;
} else {
fx.elem[ fx.prop ] = fx.now;
}
@@ -8607,6 +8831,14 @@ jQuery.extend( jQuery.fx, {
}
});
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+ jQuery.fx.step[ prop ] = function( fx ) {
+ jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+ };
+});
+
if ( jQuery.expr && jQuery.expr.filters ) {
jQuery.expr.filters.animated = function( elem ) {
return jQuery.grep(jQuery.timers, function( fn ) {
@@ -8623,7 +8855,6 @@ function defaultDisplay( nodeName ) {
var body = document.body,
elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
display = elem.css( "display" );
-
elem.remove();
// If the simple way fails,
@@ -8651,7 +8882,6 @@ function defaultDisplay( nodeName ) {
iframeDoc.body.appendChild( elem );
display = jQuery.css( elem, "display" );
-
body.removeChild( iframe );
}
@@ -8728,8 +8958,6 @@ if ( "getBoundingClientRect" in document.documentElement ) {
return jQuery.offset.bodyOffset( elem );
}
- jQuery.offset.initialize();
-
var computedStyle,
offsetParent = elem.offsetParent,
prevOffsetParent = elem,
@@ -8742,7 +8970,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
left = elem.offsetLeft;
while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
- if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
break;
}
@@ -8754,7 +8982,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
top += elem.offsetTop;
left += elem.offsetLeft;
- if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+ if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
top += parseFloat( computedStyle.borderTopWidth ) || 0;
left += parseFloat( computedStyle.borderLeftWidth ) || 0;
}
@@ -8763,7 +8991,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
offsetParent = elem.offsetParent;
}
- if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+ if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
top += parseFloat( computedStyle.borderTopWidth ) || 0;
left += parseFloat( computedStyle.borderLeftWidth ) || 0;
}
@@ -8776,7 +9004,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
left += body.offsetLeft;
}
- if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
top += Math.max( docElem.scrollTop, body.scrollTop );
left += Math.max( docElem.scrollLeft, body.scrollLeft );
}
@@ -8786,46 +9014,12 @@ if ( "getBoundingClientRect" in document.documentElement ) {
}
jQuery.offset = {
- initialize: function() {
- var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
- html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-
- jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
-
- container.innerHTML = html;
- body.insertBefore( container, body.firstChild );
- innerDiv = container.firstChild;
- checkDiv = innerDiv.firstChild;
- td = innerDiv.nextSibling.firstChild.firstChild;
-
- this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
- this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
-
- checkDiv.style.position = "fixed";
- checkDiv.style.top = "20px";
-
- // safari subtracts parent border width here which is 5px
- this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
- checkDiv.style.position = checkDiv.style.top = "";
-
- innerDiv.style.overflow = "hidden";
- innerDiv.style.position = "relative";
-
- this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
-
- this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
-
- body.removeChild( container );
- jQuery.offset.initialize = jQuery.noop;
- },
bodyOffset: function( body ) {
var top = body.offsetTop,
left = body.offsetLeft;
- jQuery.offset.initialize();
-
- if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+ if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
}
@@ -8845,7 +9039,7 @@ jQuery.offset = {
curOffset = curElem.offset(),
curCSSTop = jQuery.css( elem, "top" ),
curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+ calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
props = {}, curPosition = {}, curTop, curLeft;
// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
@@ -8862,11 +9056,11 @@ jQuery.offset = {
options = options.call( elem, i, curOffset );
}
- if (options.top != null) {
- props.top = (options.top - curOffset.top) + curTop;
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
}
- if (options.left != null) {
- props.left = (options.left - curOffset.left) + curLeft;
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
}
if ( "using" in options ) {
@@ -8879,6 +9073,7 @@ jQuery.offset = {
jQuery.fn.extend({
+
position: function() {
if ( !this[0] ) {
return null;
@@ -8981,16 +9176,20 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
// innerHeight and innerWidth
jQuery.fn[ "inner" + name ] = function() {
var elem = this[0];
- return elem && elem.style ?
+ return elem ?
+ elem.style ?
parseFloat( jQuery.css( elem, type, "padding" ) ) :
+ this[ type ]() :
null;
};
// outerHeight and outerWidth
jQuery.fn[ "outer" + name ] = function( margin ) {
var elem = this[0];
- return elem && elem.style ?
+ return elem ?
+ elem.style ?
parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+ this[ type ]() :
null;
};
@@ -9030,7 +9229,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
var orig = jQuery.css( elem, type ),
ret = parseFloat( orig );
- return jQuery.isNaN( ret ) ? orig : ret;
+ return jQuery.isNumeric( ret ) ? ret : orig;
// Set the width or height on the element (default to pixels if value is unitless)
} else {
@@ -9041,6 +9240,27 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
});
+
+
// Expose jQuery to the global object
window.jQuery = window.$ = jQuery;
-})(window);
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+ define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/resources/jquery/jquery.makeCollapsible.js b/resources/jquery/jquery.makeCollapsible.js
index a84f405c..7a1897ce 100644
--- a/resources/jquery/jquery.makeCollapsible.js
+++ b/resources/jquery/jquery.makeCollapsible.js
@@ -38,13 +38,13 @@ $.fn.makeCollapsible = function() {
if ( typeof $defaultToggle == 'undefined' ) {
$defaultToggle = null;
}
- if ( $defaultToggle !== null && !($defaultToggle instanceof jQuery) ) {
+ if ( $defaultToggle !== null && !($defaultToggle instanceof $) ) {
// is optional (may be undefined), but if defined it must be an instance of jQuery.
// If it's not, abort right away.
// After this $defaultToggle is either null or a valid jQuery instance.
return;
}
-
+
var $containers = null;
if ( action == 'collapse' ) {
@@ -55,17 +55,17 @@ $.fn.makeCollapsible = function() {
// Slide doens't work with tables, but fade does as of jQuery 1.1.3
// http://stackoverflow.com/questions/467336#920480
$containers = $collapsible.find( '>tbody>tr' );
- if ( $defaultToggle ) {
+ if ( $defaultToggle ) {
// Exclude tablerow containing togglelink
$containers.not( $defaultToggle.closest( 'tr' ) ).stop(true, true).fadeOut();
} else {
- if ( instantHide ) {
+ if ( instantHide ) {
$containers.hide();
} else {
$containers.stop( true, true ).fadeOut();
}
}
-
+
} else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
$containers = $collapsible.find( '> li' );
if ( $defaultToggle ) {
@@ -78,10 +78,10 @@ $.fn.makeCollapsible = function() {
$containers.stop( true, true ).slideUp();
}
}
-
+
} else { // <div>, <p> etc.
var $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
-
+
// If a collapsible-content is defined, collapse it
if ( $collapsibleContent.length ) {
if ( instantHide ) {
@@ -102,7 +102,7 @@ $.fn.makeCollapsible = function() {
}
} else {
-
+
// Expand the element
if ( $collapsible.is( 'table' ) ) {
$containers = $collapsible.find( '>tbody>tr' );
@@ -112,7 +112,7 @@ $.fn.makeCollapsible = function() {
} else {
$containers.stop(true, true).fadeIn();
}
-
+
} else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
$containers = $collapsible.find( '> li' );
if ( $defaultToggle ) {
@@ -121,10 +121,10 @@ $.fn.makeCollapsible = function() {
} else {
$containers.stop( true, true ).slideDown();
}
-
+
} else { // <div>, <p> etc.
var $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
-
+
// If a collapsible-content is defined, collapse it
if ( $collapsibleContent.length ) {
$collapsibleContent.slideDown();
@@ -147,7 +147,7 @@ $.fn.makeCollapsible = function() {
$collapsible = $that.closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
e.preventDefault();
e.stopPropagation();
-
+
// It's expanded right now
if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
// Change link to "Show"
@@ -182,7 +182,7 @@ $.fn.makeCollapsible = function() {
}
e.preventDefault();
e.stopPropagation();
-
+
// It's expanded right now
if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
// Change toggle to collapsed
@@ -210,7 +210,7 @@ $.fn.makeCollapsible = function() {
var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse';
$collapsible.toggleClass( 'mw-collapsed' );
toggleElement( $collapsible, action, $that );
-
+
};
// Use custom text or default ?
@@ -239,7 +239,7 @@ $.fn.makeCollapsible = function() {
} else {
$that.addClass( 'mw-made-collapsible' );
}
-
+
// Check if this element has a custom position for the toggle link
// (ie. outside the container or deeper inside the tree)
// Then: Locate the custom toggle link(s) and bind them
@@ -248,7 +248,7 @@ $.fn.makeCollapsible = function() {
var thatId = $that.attr( 'id' ),
$customTogglers = $( '.' + thatId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
mw.log( _fn + 'Found custom collapsible: #' + thatId );
-
+
// Double check that there is actually a customtoggle link
if ( $customTogglers.length ) {
$customTogglers.bind( 'click.mw-collapse', function( e ) {
@@ -257,7 +257,7 @@ $.fn.makeCollapsible = function() {
} else {
mw.log( _fn + '#' + thatId + ': Missing toggler!' );
}
-
+
// Initial state
if ( $that.hasClass( 'mw-collapsed' ) ) {
$that.removeClass( 'mw-collapsed' );
@@ -265,7 +265,7 @@ $.fn.makeCollapsible = function() {
}
// If this is not a custom case, do the default:
- // Wrap the contents add the toggle link
+ // Wrap the contents add the toggle link
} else {
// Elements are treated differently
@@ -273,7 +273,7 @@ $.fn.makeCollapsible = function() {
// The toggle-link will be in one the the cells (td or th) of the first row
var $firstRowCells = $( 'tr:first th, tr:first td', that ),
$toggle = $firstRowCells.find( '> .mw-collapsible-toggle' );
-
+
// If theres no toggle link, add it to the last cell
if ( !$toggle.length ) {
$firstRowCells.eq(-1).prepend( $toggleLink );
@@ -282,19 +282,19 @@ $.fn.makeCollapsible = function() {
toggleLinkPremade( $toggle, e );
} );
}
-
+
} else if ( $that.is( 'ul' ) || $that.is( 'ol' ) ) {
// The toggle-link will be in the first list-item
var $firstItem = $( 'li:first', $that),
$toggle = $firstItem.find( '> .mw-collapsible-toggle' );
-
+
// If theres no toggle link, add it
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.
var firstval = $firstItem.attr( 'value' );
- if ( firstval === undefined || !firstval || firstval == '-1' ) {
+ if ( firstval === undefined || !firstval || firstval == '-1' ) {
$firstItem.attr( 'value', '1' );
}
$that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
@@ -303,9 +303,9 @@ $.fn.makeCollapsible = function() {
toggleLinkPremade( $toggle, e );
} );
}
-
+
} else { // <div>, <p> etc.
-
+
// The toggle-link will be the first child of the element
var $toggle = $that.find( '> .mw-collapsible-toggle' );
@@ -313,7 +313,7 @@ $.fn.makeCollapsible = function() {
if ( !$that.find( '> .mw-collapsible-content' ).length ) {
$that.wrapInner( '<div class="mw-collapsible-content"></div>' );
}
-
+
// If theres no toggle link, add it
if ( !$toggle.length ) {
$that.prepend( $toggleLink );
@@ -336,4 +336,4 @@ $.fn.makeCollapsible = function() {
}
} );
};
-} )( jQuery, mediaWiki ); \ No newline at end of file
+} )( jQuery, mediaWiki );
diff --git a/resources/jquery/jquery.messageBox.js b/resources/jquery/jquery.messageBox.js
index a69fca59..690fedd2 100644
--- a/resources/jquery/jquery.messageBox.js
+++ b/resources/jquery/jquery.messageBox.js
@@ -11,7 +11,7 @@
* @license CC-BY 3.0 <http://creativecommons.org/licenses/by/3.0>
* @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
*/
-( function( $, mw ) {
+( function( $ ) {
// @return jQuery object of the message box
$.messageBoxNew = function( options ) {
options = $.extend( {
@@ -19,16 +19,16 @@ $.messageBoxNew = function( options ) {
'parent': 'body', // jQuery/CSS selector
'insert': 'prepend' // 'prepend' or 'append'
}, options );
- var $curBox = $( '#'+ options.id );
+ var $curBox = $( '#' + options.id );
// Only create a new box if it doesn't exist already
- if ( $curBox.size() > 0 ) {
+ if ( $curBox.length > 0 ) {
if ( $curBox.hasClass( 'js-messagebox' ) ) {
return $curBox;
} else {
return $curBox.addClass( 'js-messagebox' );
}
} else {
- var $newBox = $( '<div/>', {
+ var $newBox = $( '<div>', {
'id': options.id,
'class': 'js-messagebox',
'css': {
@@ -58,13 +58,13 @@ $.messageBox = function( options ) {
'group': 'default',
'replace': false, // if true replaces any previous message in this group
'target': 'js-messagebox'
- }, options );
+ }, options );
var $target = $.messageBoxNew( { id: options.target } );
var groupID = options.target + '-' + options.group;
var $group = $( '#' + groupID );
// Create group container if not existant
- if ( $group.size() < 1 ) {
- $group = $( '<div/>', {
+ if ( $group.length < 1 ) {
+ $group = $( '<div>', {
'id': groupID,
'class': 'js-messagebox-group'
});
@@ -79,12 +79,12 @@ $.messageBox = function( options ) {
$group.hide();
} else {
// Actual message addition
- $group.prepend( $( '<p/>' ).append( options.message ) ).show();
+ $group.prepend( $( '<p>' ).append( options.message ) ).show();
$target.slideDown();
}
// If the last visible group was just hidden, slide the entire box up
// Othere wise slideDown (if already visible nothing will happen)
- if ( $target.find( '> *:visible' ).size() === 0 ) {
+ if ( $target.find( '> *:visible' ).length === 0 ) {
// to avoid a sudden dissapearance of the last group followed by
// a slide up of only the outline, show it for a second
$group.show();
@@ -95,4 +95,4 @@ $.messageBox = function( options ) {
}
return $group;
};
-} )( jQuery, mediaWiki ); \ No newline at end of file
+} )( jQuery );
diff --git a/resources/jquery/jquery.mockjax.js b/resources/jquery/jquery.mockjax.js
new file mode 100644
index 00000000..5f6e1306
--- /dev/null
+++ b/resources/jquery/jquery.mockjax.js
@@ -0,0 +1,382 @@
+/*!
+ * MockJax - jQuery Plugin to Mock Ajax requests
+ *
+ * Version: 1.4.0
+ * Released: 2011-02-04
+ * Source: http://github.com/appendto/jquery-mockjax
+ * Docs: http://enterprisejquery.com/2010/07/mock-your-ajax-requests-with-mockjax-for-rapid-development
+ * Plugin: mockjax
+ * Author: Jonathan Sharp (http://jdsharp.com)
+ * License: MIT,GPL
+ *
+ * Copyright (c) 2010 appendTo LLC.
+ * Dual licensed under the MIT or GPL licenses.
+ * http://appendto.com/open-source-licenses
+ */
+(function($) {
+ var _ajax = $.ajax,
+ mockHandlers = [];
+
+ function parseXML(xml) {
+ if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
+ DOMParser = function() { };
+ DOMParser.prototype.parseFromString = function( xmlString ) {
+ var doc = new ActiveXObject('Microsoft.XMLDOM');
+ doc.async = 'false';
+ doc.loadXML( xmlString );
+ return doc;
+ };
+ }
+
+ try {
+ var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
+ if ( $.isXMLDoc( xmlDoc ) ) {
+ var err = $('parsererror', xmlDoc);
+ if ( err.length == 1 ) {
+ throw('Error: ' + $(xmlDoc).text() );
+ }
+ } else {
+ throw('Unable to parse XML');
+ }
+ } catch( e ) {
+ var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
+ $(document).trigger('xmlParseError', [ msg ]);
+ return undefined;
+ }
+ return xmlDoc;
+ }
+
+ $.extend({
+ ajax: function(origSettings) {
+ var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
+ mock = false;
+ // Iterate over our mock handlers (in registration order) until we find
+ // one that is willing to intercept the request
+ $.each(mockHandlers, function(k, v) {
+ if ( !mockHandlers[k] ) {
+ return;
+ }
+ var m = null;
+ // If the mock was registered with a function, let the function decide if we
+ // want to mock this request
+ if ( $.isFunction(mockHandlers[k]) ) {
+ m = mockHandlers[k](s);
+ } else {
+ m = mockHandlers[k];
+ // Inspect the URL of the request and check if the mock handler's url
+ // matches the url for this ajax request
+ if ( $.isFunction(m.url.test) ) {
+ // The user provided a regex for the url, test it
+ if ( !m.url.test( s.url ) ) {
+ m = null;
+ }
+ } else {
+ // Look for a simple wildcard '*' or a direct URL match
+ var star = m.url.indexOf('*');
+ if ( ( m.url != '*' && m.url != s.url && star == -1 ) ||
+ ( star > -1 && m.url.substr(0, star) != s.url.substr(0, star) ) ) {
+ // The url we tested did not match the wildcard *
+ m = null;
+ }
+ }
+ if ( m ) {
+ // Inspect the data submitted in the request (either POST body or GET query string)
+ if ( m.data && s.data ) {
+ var identical = false;
+ // Deep inspect the identity of the objects
+ (function ident(mock, live) {
+ // Test for situations where the data is a querystring (not an object)
+ if (typeof live === 'string') {
+ // Querystring may be a regex
+ identical = $.isFunction( mock.test ) ? mock.test(live) : mock == live;
+ return identical;
+ }
+ $.each(mock, function(k, v) {
+ if ( live[k] === undefined ) {
+ identical = false;
+ return false;
+ } else {
+ identical = true;
+ if ( typeof live[k] == 'object' ) {
+ return ident(mock[k], live[k]);
+ } else {
+ if ( $.isFunction( mock[k].test ) ) {
+ identical = mock[k].test(live[k]);
+ } else {
+ identical = ( mock[k] == live[k] );
+ }
+ return identical;
+ }
+ }
+ });
+ })(m.data, s.data);
+ // They're not identical, do not mock this request
+ if ( identical == false ) {
+ m = null;
+ }
+ }
+ // Inspect the request type
+ if ( m && m.type && m.type != s.type ) {
+ // The request type doesn't match (GET vs. POST)
+ m = null;
+ }
+ }
+ }
+ if ( m ) {
+ mock = true;
+
+ // Handle console logging
+ var c = $.extend({}, $.mockjaxSettings, m);
+ if ( c.log && $.isFunction(c.log) ) {
+ c.log('MOCK ' + s.type.toUpperCase() + ': ' + s.url, $.extend({}, s));
+ }
+
+ var jsre = /=\?(&|$)/, jsc = (new Date()).getTime();
+
+ // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
+ // because there isn't an easy hook for the cross domain script tag of jsonp
+ if ( s.dataType === "jsonp" ) {
+ if ( s.type.toUpperCase() === "GET" ) {
+ if ( !jsre.test( s.url ) ) {
+ s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+ }
+ } else if ( !s.data || !jsre.test(s.data) ) {
+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+ }
+ s.dataType = "json";
+ }
+
+ // Build temporary JSONP function
+ if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
+ jsonp = s.jsonpCallback || ("jsonp" + jsc++);
+
+ // Replace the =? sequence both in the query string and the data
+ if ( s.data ) {
+ s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+ }
+
+ s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+ // We need to make sure
+ // that a JSONP style response is executed properly
+ s.dataType = "script";
+
+ // Handle JSONP-style loading
+ window[ jsonp ] = window[ jsonp ] || function( tmp ) {
+ data = tmp;
+ success();
+ complete();
+ // Garbage collect
+ window[ jsonp ] = undefined;
+
+ try {
+ delete window[ jsonp ];
+ } catch(e) {}
+
+ if ( head ) {
+ head.removeChild( script );
+ }
+ };
+ }
+
+ var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+ parts = rurl.exec( s.url ),
+ remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
+
+ // Test if we are going to create a script tag (if so, intercept & mock)
+ if ( s.dataType === "script" && s.type.toUpperCase() === "GET" && remote ) {
+ // Synthesize the mock request for adding a script tag
+ var callbackContext = origSettings && origSettings.context || s;
+
+ function success() {
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success ) {
+ s.success.call( callbackContext, ( m.response ? m.response.toString() : m.responseText || ''), status, {} );
+ }
+
+ // Fire the global callback
+ if ( s.global ) {
+ trigger( "ajaxSuccess", [{}, s] );
+ }
+ }
+
+ function complete() {
+ // Process result
+ if ( s.complete ) {
+ s.complete.call( callbackContext, {} , status );
+ }
+
+ // The request was completed
+ if ( s.global ) {
+ trigger( "ajaxComplete", [{}, s] );
+ }
+
+ // Handle the global AJAX counter
+ if ( s.global && ! --jQuery.active ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ }
+
+ function trigger(type, args) {
+ (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
+ }
+
+ if ( m.response && $.isFunction(m.response) ) {
+ m.response(origSettings);
+ } else {
+ $.globalEval(m.responseText);
+ }
+ success();
+ complete();
+ return false;
+ }
+ mock = _ajax.call($, $.extend(true, {}, origSettings, {
+ // Mock the XHR object
+ xhr: function() {
+ // Extend with our default mockjax settings
+ m = $.extend({}, $.mockjaxSettings, m);
+
+ if ( m.contentType ) {
+ m.headers['content-type'] = m.contentType;
+ }
+
+ // Return our mock xhr object
+ return {
+ status: m.status,
+ readyState: 1,
+ open: function() { },
+ send: function() {
+ // This is a substitute for < 1.4 which lacks $.proxy
+ var process = (function(that) {
+ return function() {
+ return (function() {
+ // The request has returned
+ this.status = m.status;
+ this.readyState = 4;
+
+ // We have an executable function, call it to give
+ // the mock handler a chance to update it's data
+ if ( $.isFunction(m.response) ) {
+ m.response(origSettings);
+ }
+ // Copy over our mock to our xhr object before passing control back to
+ // jQuery's onreadystatechange callback
+ if ( s.dataType == 'json' && ( typeof m.responseText == 'object' ) ) {
+ this.responseText = JSON.stringify(m.responseText);
+ } else if ( s.dataType == 'xml' ) {
+ if ( typeof m.responseXML == 'string' ) {
+ this.responseXML = parseXML(m.responseXML);
+ } else {
+ this.responseXML = m.responseXML;
+ }
+ } else {
+ this.responseText = m.responseText;
+ }
+ // jQuery < 1.4 doesn't have onreadystate change for xhr
+ if ( $.isFunction(this.onreadystatechange) ) {
+ this.onreadystatechange( m.isTimeout ? 'timeout' : undefined );
+ }
+ }).apply(that);
+ };
+ })(this);
+
+ if ( m.proxy ) {
+ // We're proxying this request and loading in an external file instead
+ _ajax({
+ global: false,
+ url: m.proxy,
+ type: m.proxyType,
+ data: m.data,
+ dataType: s.dataType,
+ complete: function(xhr, txt) {
+ m.responseXML = xhr.responseXML;
+ m.responseText = xhr.responseText;
+ this.responseTimer = setTimeout(process, m.responseTime || 0);
+ }
+ });
+ } else {
+ // type == 'POST' || 'GET' || 'DELETE'
+ if ( s.async === false ) {
+ // TODO: Blocking delay
+ process();
+ } else {
+ this.responseTimer = setTimeout(process, m.responseTime || 50);
+ }
+ }
+ },
+ abort: function() {
+ clearTimeout(this.responseTimer);
+ },
+ setRequestHeader: function() { },
+ getResponseHeader: function(header) {
+ // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
+ if ( m.headers && m.headers[header] ) {
+ // Return arbitrary headers
+ return m.headers[header];
+ } else if ( header.toLowerCase() == 'last-modified' ) {
+ return m.lastModified || (new Date()).toString();
+ } else if ( header.toLowerCase() == 'etag' ) {
+ return m.etag || '';
+ } else if ( header.toLowerCase() == 'content-type' ) {
+ return m.contentType || 'text/plain';
+ }
+ },
+ getAllResponseHeaders: function() {
+ var headers = '';
+ $.each(m.headers, function(k, v) {
+ headers += k + ': ' + v + "\n";
+ });
+ return headers;
+ }
+ };
+ }
+ }));
+ return false;
+ }
+ });
+ // We don't have a mock request, trigger a normal request
+ if ( !mock ) {
+ return _ajax.apply($, arguments);
+ } else {
+ return mock;
+ }
+ }
+ });
+
+ $.mockjaxSettings = {
+ //url: null,
+ //type: 'GET',
+ log: function(msg) {
+ window['console'] && window.console.log && window.console.log(msg);
+ },
+ status: 200,
+ responseTime: 500,
+ isTimeout: false,
+ contentType: 'text/plain',
+ response: '',
+ responseText: '',
+ responseXML: '',
+ proxy: '',
+ proxyType: 'GET',
+
+ lastModified: null,
+ etag: '',
+ headers: {
+ etag: 'IJF@H#@923uf8023hFO@I#H#',
+ 'content-type' : 'text/plain'
+ }
+ };
+
+ $.mockjax = function(settings) {
+ var i = mockHandlers.length;
+ mockHandlers[i] = settings;
+ return i;
+ };
+ $.mockjaxClear = function(i) {
+ if ( arguments.length == 1 ) {
+ mockHandlers[i] = null;
+ } else {
+ mockHandlers = [];
+ }
+ };
+})(jQuery);
diff --git a/resources/jquery/jquery.mw-jump.js b/resources/jquery/jquery.mw-jump.js
new file mode 100644
index 00000000..36b6690c
--- /dev/null
+++ b/resources/jquery/jquery.mw-jump.js
@@ -0,0 +1,15 @@
+/**
+ * JavaScript to show jump links to motor-impaired users when they are focused.
+ */
+jQuery( function( $ ) {
+
+ $('.mw-jump').delegate( 'a', 'focus blur', function( e ) {
+ // Confusingly jQuery leaves e.type as "focusout" for delegated blur events
+ if ( e.type === "blur" || e.type === "focusout" ) {
+ $( this ).closest( '.mw-jump' ).css({ height: '0' });
+ } else {
+ $( this ).closest( '.mw-jump' ).css({ height: 'auto' });
+ }
+ } );
+
+} );
diff --git a/resources/jquery/jquery.mwExtension.js b/resources/jquery/jquery.mwExtension.js
new file mode 100644
index 00000000..023ea7f3
--- /dev/null
+++ b/resources/jquery/jquery.mwExtension.js
@@ -0,0 +1,121 @@
+/*
+ * JavaScript backwards-compatibility alternatives and other convenience functions
+ */
+( function( $ ) {
+
+ $.extend({
+ trimLeft: function( str ) {
+ return str === null ? '' : str.toString().replace( /^\s+/, '' );
+ },
+ trimRight: function( str ) {
+ return str === null ?
+ '' : str.toString().replace( /\s+$/, '' );
+ },
+ ucFirst: function( str ) {
+ return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
+ },
+ escapeRE: function( str ) {
+ return str.replace ( /([\\{}()|.?*+\-^$\[\]])/g, "\\$1" );
+ },
+ isDomElement: function( el ) {
+ return !!el && !!el.nodeType;
+ },
+ isEmpty: function( v ) {
+ if ( v === '' || v === 0 || v === '0' || v === null
+ || v === false || v === undefined )
+ {
+ return true;
+ }
+ // the for-loop could potentially contain prototypes
+ // to avoid that we check it's length first
+ if ( v.length === 0 ) {
+ return true;
+ }
+ if ( typeof v === 'object' ) {
+ for ( var key in v ) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ },
+ compareArray: function( arrThis, arrAgainst ) {
+ if ( arrThis.length != arrAgainst.length ) {
+ return false;
+ }
+ for ( var i = 0; i < arrThis.length; i++ ) {
+ if ( $.isArray( arrThis[i] ) ) {
+ if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
+ return false;
+ }
+ } else if ( arrThis[i] !== arrAgainst[i] ) {
+ return false;
+ }
+ }
+ return true;
+ },
+ compareObject: function( objectA, objectB ) {
+
+ // Do a simple check if the types match
+ if ( typeof objectA == typeof objectB ) {
+
+ // Only loop over the contents if it really is an object
+ if ( typeof objectA == 'object' ) {
+ // If they are aliases of the same object (ie. mw and mediaWiki) return now
+ if ( objectA === objectB ) {
+ return true;
+ } else {
+ var prop;
+ // Iterate over each property
+ for ( prop in objectA ) {
+ // Check if this property is also present in the other object
+ if ( prop in objectB ) {
+ // Compare the types of the properties
+ var type = typeof objectA[prop];
+ if ( type == typeof objectB[prop] ) {
+ // Recursively check objects inside this one
+ switch ( type ) {
+ case 'object' :
+ if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
+ return false;
+ }
+ break;
+ case 'function' :
+ // Functions need to be strings to compare them properly
+ if ( objectA[prop].toString() !== objectB[prop].toString() ) {
+ return false;
+ }
+ break;
+ default:
+ // Strings, numbers
+ if ( objectA[prop] !== objectB[prop] ) {
+ return false;
+ }
+ break;
+ }
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ // Check for properties in B but not in A
+ // This is about 15% faster (tested in Safari 5 and Firefox 3.6)
+ // ...than incrementing a count variable in the above and below loops
+ // See also: http://www.mediawiki.org/wiki/ResourceLoader/Default_modules/compareObject_test#Results
+ for ( prop in objectB ) {
+ if ( !( prop in objectA ) ) {
+ return false;
+ }
+ }
+ }
+ }
+ } else {
+ return false;
+ }
+ return true;
+ }
+ });
+
+} )( jQuery );
diff --git a/resources/jquery/jquery.mwPrototypes.js b/resources/jquery/jquery.mwPrototypes.js
deleted file mode 100644
index e26a6be6..00000000
--- a/resources/jquery/jquery.mwPrototypes.js
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * JavaScript backwards-compatibility alternatives and other convenience functions
- */
-
-jQuery.extend({
- trimLeft : function( str ) {
- return str === null ? '' : str.toString().replace( /^\s+/, '' );
- },
- trimRight : function( str ) {
- return str === null ?
- '' : str.toString().replace( /\s+$/, '' );
- },
- ucFirst : function( str ) {
- return str.substr( 0, 1 ).toUpperCase() + str.substr( 1 );
- },
- escapeRE : function( str ) {
- return str.replace ( /([\\{}()|.?*+\-^$\[\]])/g, "\\$1" );
- },
- isDomElement : function( el ) {
- return !!el && !!el.nodeType;
- },
- isEmpty : function( v ) {
- var key;
- if ( v === "" || v === 0 || v === "0" || v === null
- || v === false || typeof v === 'undefined' )
- {
- return true;
- }
- // the for-loop could potentially contain prototypes
- // to avoid that we check it's length first
- if ( v.length === 0 ) {
- return true;
- }
- if ( typeof v === 'object' ) {
- for ( key in v ) {
- return false;
- }
- return true;
- }
- return false;
- },
- compareArray : function( arrThis, arrAgainst ) {
- if ( arrThis.length != arrAgainst.length ) {
- return false;
- }
- for ( var i = 0; i < arrThis.length; i++ ) {
- if ( arrThis[i] instanceof Array ) {
- if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
- return false;
- }
- } else if ( arrThis[i] !== arrAgainst[i] ) {
- return false;
- }
- }
- return true;
- },
- compareObject : function( objectA, objectB ) {
-
- // Do a simple check if the types match
- if ( typeof objectA == typeof objectB ) {
-
- // Only loop over the contents if it really is an object
- if ( typeof objectA == 'object' ) {
- // If they are aliases of the same object (ie. mw and mediaWiki) return now
- if ( objectA === objectB ) {
- return true;
- } else {
- var prop;
- // Iterate over each property
- for ( prop in objectA ) {
- // Check if this property is also present in the other object
- if ( prop in objectB ) {
- // Compare the types of the properties
- var type = typeof objectA[prop];
- if ( type == typeof objectB[prop] ) {
- // Recursively check objects inside this one
- switch ( type ) {
- case 'object' :
- if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
- return false;
- }
- break;
- case 'function' :
- // Functions need to be strings to compare them properly
- if ( objectA[prop].toString() !== objectB[prop].toString() ) {
- return false;
- }
- break;
- default:
- // Strings, numbers
- if ( objectA[prop] !== objectB[prop] ) {
- return false;
- }
- break;
- }
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
- // Check for properties in B but not in A
- // This is about 15% faster (tested in Safari 5 and Firefox 3.6)
- // ...than incrementing a count variable in the above and below loops
- // See also: http://www.mediawiki.org/wiki/ResourceLoader/Default_modules/compareObject_test#Results
- for ( prop in objectB ) {
- if ( !( prop in objectA ) ) {
- return false;
- }
- }
- }
- }
- } else {
- return false;
- }
- return true;
- }
-});
-
diff --git a/resources/jquery/jquery.placeholder.js b/resources/jquery/jquery.placeholder.js
index 1bb69f00..8310cef9 100644
--- a/resources/jquery/jquery.placeholder.js
+++ b/resources/jquery/jquery.placeholder.js
@@ -46,7 +46,7 @@ $.fn.placeholder = function() {
// text somewhere in the middle of the placeholder string,
// we want to set the contents of the search box to the
// dropped text.
-
+
// IE wants getData( 'text' ) but Firefox wants getData( 'text/plain' )
// Firefox fails gracefully with an empty string, IE barfs with an error
try {
@@ -56,7 +56,7 @@ $.fn.placeholder = function() {
// Got an exception, so use the IE way
this.value = e.originalEvent.dataTransfer.getData( 'text' );
}
-
+
// On Firefox, drop fires after the dropped text has been inserted,
// but on IE it fires before. If we don't prevent the default action,
// IE will insert the dropped text twice.
diff --git a/resources/jquery/jquery.qunit.completenessTest.js b/resources/jquery/jquery.qunit.completenessTest.js
index 2244237c..5abb8691 100644
--- a/resources/jquery/jquery.qunit.completenessTest.js
+++ b/resources/jquery/jquery.qunit.completenessTest.js
@@ -2,10 +2,10 @@
* jQuery QUnit CompletenessTest 0.3
*
* Tests the completeness of test suites for object oriented javascript
- * libraries. Written to be used in enviroments with jQuery and QUnit.
+ * libraries. Written to be used in environments with jQuery and QUnit.
* Requires jQuery 1.5.2 or higher.
*
- * Globals: jQuery, $, QUnit, console.log
+ * Globals: jQuery, QUnit, console.log
*
* Built for and tested with:
* - Safari 5
@@ -13,11 +13,7 @@
*
* @author Timo Tijhof, 2011
*/
-(function(){
-
-/* Private members */
-var TYPE_SIMPLEFUNC = 101;
-var TYPE_OBJCONSTRFUNC = 100;
+( function( $ ) {
/**
* CompletenessTest
@@ -159,7 +155,7 @@ CompletenessTest.fn = CompletenessTest.prototype = {
$.each( currVar.prototype, function( key, value ) {
if ( key === 'constructor' ) return;
- // Clone and brake reference to parentPathArray
+ // Clone and break reference to parentPathArray
var tmpPathArray = $.extend( [], parentPathArray );
tmpPathArray.push( 'prototype' ); tmpPathArray.push( key );
@@ -174,11 +170,9 @@ CompletenessTest.fn = CompletenessTest.prototype = {
if ( !currVar.prototype || $.isEmptyObject( currVar.prototype ) ) {
// Inject check
- that.injectCheck( masterVariable, parentPathArray, function(){
-
+ that.injectCheck( masterVariable, parentPathArray, function() {
that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
-
- }, TYPE_SIMPLEFUNC );
+ } );
// We don't support checking object constructors yet...
} else {
@@ -187,7 +181,7 @@ CompletenessTest.fn = CompletenessTest.prototype = {
$.each( currVar.prototype, function( key, value ) {
if ( key === 'constructor' ) return;
- // Clone and brake reference to parentPathArray
+ // Clone and break reference to parentPathArray
var tmpPathArray = $.extend( [], parentPathArray );
tmpPathArray.push( 'prototype' ); tmpPathArray.push( key );
@@ -197,12 +191,12 @@ CompletenessTest.fn = CompletenessTest.prototype = {
}
- // Recursively. After all, this *is* the completness test
+ // Recursively. After all, this *is* the completeness test
} else if ( type === 'object' ) {
$.each( currVar, function( key, value ) {
- // Clone and brake reference to parentPathArray
+ // Clone and break reference to parentPathArray
var tmpPathArray = $.extend( [], parentPathArray );
tmpPathArray.push( key );
@@ -211,8 +205,6 @@ CompletenessTest.fn = CompletenessTest.prototype = {
} );
}
-
- return 'End of checkTests';
},
/**
@@ -220,13 +212,13 @@ CompletenessTest.fn = CompletenessTest.prototype = {
*
* Checks if the given method name (ie. 'my.foo.bar')
* was called during the test suite (as far as the tracker knows).
- * If so it adds it to missingTests.
+ * If not it adds it to missingTests.
*
* @param fnName {String}
* @return {Boolean}
*/
hasTest: function( fnName ) {
- if ( !(fnName in this.methodCallTracker) ) {
+ if ( !( fnName in this.methodCallTracker ) ) {
this.missingTests[fnName] = true;
return false;
}
@@ -248,14 +240,14 @@ CompletenessTest.fn = CompletenessTest.prototype = {
curr = masterVariable,
lastMember;
- $.each( objectPathArray, function(i, memberName){
+ $.each( objectPathArray, function( i, memberName ) {
prev = curr;
curr = prev[memberName];
lastMember = memberName;
});
// Objects are by reference, members (unless objects) are not.
- prev[lastMember] = function(){
+ prev[lastMember] = function() {
injectFn();
return curr.apply( this, arguments );
};
@@ -264,4 +256,4 @@ CompletenessTest.fn = CompletenessTest.prototype = {
window.CompletenessTest = CompletenessTest;
-})();
+} )( jQuery );
diff --git a/resources/jquery/jquery.qunit.css b/resources/jquery/jquery.qunit.css
index fa9156f9..bcecc4c0 100644
--- a/resources/jquery/jquery.qunit.css
+++ b/resources/jquery/jquery.qunit.css
@@ -1,9 +1,9 @@
/**
- * QUnit - A JavaScript Unit Testing Framework
- *
+ * QUnit v1.2.0 - A JavaScript Unit Testing Framework
+ *
* http://docs.jquery.com/QUnit
*
- * Copyright (c) 2011 John Resig, Jörn Zaefferer
+ * Copyright (c) 2011 John Resig, Jörn Zaefferer
* Dual licensed under the MIT (MIT-LICENSE.txt)
* or GPL (GPL-LICENSE.txt) licenses.
*/
@@ -11,7 +11,7 @@
/** Font Family and Sizes */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
- font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
}
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
@@ -37,7 +37,7 @@
font-size: 1.5em;
line-height: 1em;
font-weight: normal;
-
+
border-radius: 15px 15px 0 0;
-moz-border-radius: 15px 15px 0 0;
-webkit-border-top-right-radius: 15px;
@@ -105,13 +105,13 @@
#qunit-tests ol {
margin-top: 0.5em;
padding: 0.5em;
-
+
background-color: #fff;
-
+
border-radius: 15px;
-moz-border-radius: 15px;
-webkit-border-radius: 15px;
-
+
box-shadow: inset 0px 2px 13px #999;
-moz-box-shadow: inset 0px 2px 13px #999;
-webkit-box-shadow: inset 0px 2px 13px #999;
@@ -174,7 +174,7 @@
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
#qunit-tests .pass .test-name { color: #366097; }
-
+
#qunit-tests .pass .test-actual,
#qunit-tests .pass .test-expected { color: #999999; }
@@ -186,6 +186,7 @@
color: #710909;
background-color: #fff;
border-left: 26px solid #EE5757;
+ white-space: pre;
}
#qunit-tests > li:last-child {
@@ -222,4 +223,4 @@
position: absolute;
top: -10000px;
left: -10000px;
-} \ No newline at end of file
+}
diff --git a/resources/jquery/jquery.qunit.js b/resources/jquery/jquery.qunit.js
index 1405e797..6d2a8a7b 100644
--- a/resources/jquery/jquery.qunit.js
+++ b/resources/jquery/jquery.qunit.js
@@ -1,6 +1,6 @@
/**
- * QUnit - A JavaScript Unit Testing Framework
- *
+ * QUnit v1.2.0 - A JavaScript Unit Testing Framework
+ *
* http://docs.jquery.com/QUnit
*
* Copyright (c) 2011 John Resig, Jörn Zaefferer
@@ -15,13 +15,15 @@ var defined = {
sessionStorage: (function() {
try {
return !!sessionStorage.getItem;
- } catch(e){
+ } catch(e) {
return false;
}
- })()
+ })()
};
-var testId = 0;
+var testId = 0,
+ toString = Object.prototype.toString,
+ hasOwn = Object.prototype.hasOwnProperty;
var Test = function(name, testName, expected, testEnvironmentArg, async, callback) {
this.name = name;
@@ -48,7 +50,7 @@ Test.prototype = {
setup: function() {
if (this.module != config.previousModule) {
if ( config.previousModule ) {
- QUnit.moduleDone( {
+ runLoggingCallbacks('moduleDone', QUnit, {
name: config.previousModule,
failed: config.moduleStats.bad,
passed: config.moduleStats.all - config.moduleStats.bad,
@@ -57,7 +59,7 @@ Test.prototype = {
}
config.previousModule = this.module;
config.moduleStats = { all: 0, bad: 0 };
- QUnit.moduleStart( {
+ runLoggingCallbacks( 'moduleStart', QUnit, {
name: this.module
} );
}
@@ -71,14 +73,15 @@ Test.prototype = {
extend(this.testEnvironment, this.testEnvironmentArg);
}
- QUnit.testStart( {
- name: this.testName
- } );
+ runLoggingCallbacks( 'testStart', QUnit, {
+ name: this.testName,
+ module: this.module
+ });
// allow utility functions to access the current test environment
// TODO why??
QUnit.current_testEnvironment = this.testEnvironment;
-
+
try {
if ( !config.pollution ) {
saveGlobal();
@@ -90,6 +93,7 @@ Test.prototype = {
}
},
run: function() {
+ config.current = this;
if ( this.async ) {
QUnit.stop();
}
@@ -108,23 +112,25 @@ Test.prototype = {
// Restart the tests if they're blocking
if ( config.blocking ) {
- start();
+ QUnit.start();
}
}
},
teardown: function() {
+ config.current = this;
try {
- checkPollution();
this.testEnvironment.teardown.call(this.testEnvironment);
+ checkPollution();
} catch(e) {
QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message );
}
},
finish: function() {
- if ( this.expected && this.expected != this.assertions.length ) {
+ config.current = this;
+ if ( this.expected != null && this.expected != this.assertions.length ) {
QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
}
-
+
var good = 0, bad = 0,
tests = id("qunit-tests");
@@ -132,7 +138,7 @@ Test.prototype = {
config.moduleStats.all += this.assertions.length;
if ( tests ) {
- var ol = document.createElement("ol");
+ var ol = document.createElement("ol");
for ( var i = 0; i < this.assertions.length; i++ ) {
var assertion = this.assertions[i];
@@ -166,17 +172,17 @@ Test.prototype = {
var b = document.createElement("strong");
b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
+
var a = document.createElement("a");
a.innerHTML = "Rerun";
a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
-
+
addEvent(b, "click", function() {
var next = b.nextSibling.nextSibling,
display = next.style.display;
next.style.display = display === "none" ? "block" : "none";
});
-
+
addEvent(b, "dblclick", function(e) {
var target = e && e.target ? e.target : window.event.srcElement;
if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
@@ -210,14 +216,15 @@ Test.prototype = {
fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset);
}
- QUnit.testDone( {
+ runLoggingCallbacks( 'testDone', QUnit, {
name: this.testName,
+ module: this.module,
failed: bad,
passed: this.assertions.length - bad,
total: this.assertions.length
} );
},
-
+
queue: function() {
var test = this;
synchronize(function() {
@@ -243,10 +250,10 @@ Test.prototype = {
if (bad) {
run();
} else {
- synchronize(run);
+ synchronize(run, true);
};
}
-
+
};
var QUnit = {
@@ -260,12 +267,12 @@ var QUnit = {
asyncTest: function(testName, expected, callback) {
if ( arguments.length === 2 ) {
callback = expected;
- expected = 0;
+ expected = null;
}
QUnit.test(testName, expected, callback, true);
},
-
+
test: function(testName, expected, callback, async) {
var name = '<span class="test-name">' + testName + '</span>', testEnvironmentArg;
@@ -275,7 +282,7 @@ var QUnit = {
}
// is 2nd argument a testEnvironment?
if ( expected && typeof expected === 'object') {
- testEnvironmentArg = expected;
+ testEnvironmentArg = expected;
expected = null;
}
@@ -286,13 +293,13 @@ var QUnit = {
if ( !validTest(config.currentModule + ": " + testName) ) {
return;
}
-
+
var test = new Test(name, testName, expected, testEnvironmentArg, async, callback);
test.module = config.currentModule;
test.moduleTestEnvironment = config.currentModuleTestEnviroment;
test.queue();
},
-
+
/**
* Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
*/
@@ -310,8 +317,8 @@ var QUnit = {
result: a,
message: msg
};
- msg = escapeHtml(msg);
- QUnit.log(details);
+ msg = escapeInnerText(msg);
+ runLoggingCallbacks( 'log', QUnit, details );
config.current.assertions.push({
result: a,
message: msg
@@ -337,7 +344,7 @@ var QUnit = {
notEqual: function(actual, expected, message) {
QUnit.push(expected != actual, actual, expected, message);
},
-
+
deepEqual: function(actual, expected, message) {
QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
},
@@ -356,39 +363,39 @@ var QUnit = {
raises: function(block, expected, message) {
var actual, ok = false;
-
+
if (typeof expected === 'string') {
message = expected;
expected = null;
}
-
+
try {
block();
} catch (e) {
actual = e;
}
-
+
if (actual) {
// we don't want to validate thrown error
if (!expected) {
ok = true;
- // expected is a regexp
+ // expected is a regexp
} else if (QUnit.objectType(expected) === "regexp") {
ok = expected.test(actual);
- // expected is a constructor
+ // expected is a constructor
} else if (actual instanceof expected) {
ok = true;
- // expected is a validation function which returns true is validation passed
+ // expected is a validation function which returns true is validation passed
} else if (expected.call({}, actual) === true) {
ok = true;
}
}
-
+
QUnit.ok(ok, message);
},
- start: function() {
- config.semaphore--;
+ start: function(count) {
+ config.semaphore -= count || 1;
if (config.semaphore > 0) {
// don't start until equal number of stop-calls
return;
@@ -400,33 +407,46 @@ var QUnit = {
// A slight delay, to avoid any current callbacks
if ( defined.setTimeout ) {
window.setTimeout(function() {
+ if (config.semaphore > 0) {
+ return;
+ }
if ( config.timeout ) {
clearTimeout(config.timeout);
}
config.blocking = false;
- process();
+ process(true);
}, 13);
} else {
config.blocking = false;
- process();
+ process(true);
}
},
-
- stop: function(timeout) {
- config.semaphore++;
+
+ stop: function(count) {
+ config.semaphore += count || 1;
config.blocking = true;
- if ( timeout && defined.setTimeout ) {
+ if ( config.testTimeout && defined.setTimeout ) {
clearTimeout(config.timeout);
config.timeout = window.setTimeout(function() {
QUnit.ok( false, "Test timed out" );
+ config.semaphore = 1;
QUnit.start();
- }, timeout);
+ }, config.testTimeout);
}
}
};
+//We want access to the constructor's prototype
+(function() {
+ function F(){};
+ F.prototype = QUnit;
+ QUnit = new F();
+ //Make F QUnit's constructor so that we can add to the prototype later
+ QUnit.constructor = F;
+})();
+
// Backwards compatibility, deprecated
QUnit.equals = QUnit.equal;
QUnit.same = QUnit.deepEqual;
@@ -438,13 +458,28 @@ var config = {
// block until document ready
blocking: true,
-
+
+ // when enabled, show only failing tests
+ // gets persisted through sessionStorage and can be changed in UI via checkbox
+ hidepassed: false,
+
// by default, run previously failed tests first
// very useful in combination with "Hide passed tests" checked
reorder: true,
- noglobals: false,
- notrycatch: false
+ // by default, modify document.title when suite is done
+ altertitle: true,
+
+ urlConfig: ['noglobals', 'notrycatch'],
+
+ //logging callback queues
+ begin: [],
+ done: [],
+ log: [],
+ testStart: [],
+ testDone: [],
+ moduleStart: [],
+ moduleDone: []
};
// Load paramaters
@@ -462,9 +497,6 @@ var config = {
// allow just a key to turn on a flag, e.g., test.html?noglobals
current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
urlParams[ current[ 0 ] ] = current[ 1 ];
- if ( current[ 0 ] in config ) {
- config[ current[ 0 ] ] = current[ 1 ];
- }
}
}
@@ -519,7 +551,7 @@ extend(QUnit, {
if ( result ) {
result.parentNode.removeChild( result );
}
-
+
if ( tests ) {
result = document.createElement( "p" );
result.id = "qunit-testresult";
@@ -528,10 +560,10 @@ extend(QUnit, {
result.innerHTML = 'Running...<br/>&nbsp;';
}
},
-
+
/**
* Resets the test setup. Useful for tests that modify the DOM.
- *
+ *
* If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
*/
reset: function() {
@@ -544,7 +576,7 @@ extend(QUnit, {
}
}
},
-
+
/**
* Trigger an event on an element.
*
@@ -564,12 +596,12 @@ extend(QUnit, {
elem.fireEvent("on"+type);
}
},
-
+
// Safe object type checking
is: function( type, obj ) {
return QUnit.objectType( obj ) == type;
},
-
+
objectType: function( obj ) {
if (typeof obj === "undefined") {
return "undefined";
@@ -580,8 +612,7 @@ extend(QUnit, {
return "null";
}
- var type = Object.prototype.toString.call( obj )
- .match(/^\[object\s(.*)\]$/)[1] || '';
+ var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || '';
switch (type) {
case 'Number':
@@ -603,7 +634,7 @@ extend(QUnit, {
}
return undefined;
},
-
+
push: function(result, actual, expected, message) {
var details = {
result: result,
@@ -611,11 +642,11 @@ extend(QUnit, {
actual: actual,
expected: expected
};
-
- message = escapeHtml(message) || (result ? "okay" : "failed");
+
+ message = escapeInnerText(message) || (result ? "okay" : "failed");
message = '<span class="test-message">' + message + "</span>";
- expected = escapeHtml(QUnit.jsDump.parse(expected));
- actual = escapeHtml(QUnit.jsDump.parse(actual));
+ expected = escapeInnerText(QUnit.jsDump.parse(expected));
+ actual = escapeInnerText(QUnit.jsDump.parse(actual));
var output = message + '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';
if (actual != expected) {
output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';
@@ -625,54 +656,66 @@ extend(QUnit, {
var source = sourceFromStacktrace();
if (source) {
details.source = source;
- output += '<tr class="test-source"><th>Source: </th><td><pre>' + source +'</pre></td></tr>';
+ output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeInnerText(source) + '</pre></td></tr>';
}
}
output += "</table>";
-
- QUnit.log(details);
-
+
+ runLoggingCallbacks( 'log', QUnit, details );
+
config.current.assertions.push({
result: !!result,
message: output
});
},
-
+
url: function( params ) {
params = extend( extend( {}, QUnit.urlParams ), params );
var querystring = "?",
key;
for ( key in params ) {
+ if ( !hasOwn.call( params, key ) ) {
+ continue;
+ }
querystring += encodeURIComponent( key ) + "=" +
encodeURIComponent( params[ key ] ) + "&";
}
return window.location.pathname + querystring.slice( 0, -1 );
},
-
+
+ extend: extend,
+ id: id,
+ addEvent: addEvent
+});
+
+//QUnit.constructor is set to the empty F() above so that we can add to it's prototype later
+//Doing this allows us to tell if the following methods have been overwritten on the actual
+//QUnit object, which is a deprecated way of using the callbacks.
+extend(QUnit.constructor.prototype, {
// Logging callbacks; all receive a single argument with the listed properties
// run test/logs.html for any related changes
- begin: function() {},
+ begin: registerLoggingCallback('begin'),
// done: { failed, passed, total, runtime }
- done: function() {},
+ done: registerLoggingCallback('done'),
// log: { result, actual, expected, message }
- log: function() {},
+ log: registerLoggingCallback('log'),
// testStart: { name }
- testStart: function() {},
+ testStart: registerLoggingCallback('testStart'),
// testDone: { name, failed, passed, total }
- testDone: function() {},
+ testDone: registerLoggingCallback('testDone'),
// moduleStart: { name }
- moduleStart: function() {},
+ moduleStart: registerLoggingCallback('moduleStart'),
// moduleDone: { name, failed, passed, total }
- moduleDone: function() {}
+ moduleDone: registerLoggingCallback('moduleDone')
});
if ( typeof document === "undefined" || document.readyState === "complete" ) {
config.autorun = true;
}
-addEvent(window, "load", function() {
- QUnit.begin({});
-
+QUnit.load = function() {
+ runLoggingCallbacks( 'begin', QUnit, {} );
+
// Initialize the config, saving the execution queue
var oldconfig = extend({}, config);
QUnit.init();
@@ -680,22 +723,26 @@ addEvent(window, "load", function() {
config.blocking = false;
+ var urlConfigHtml = '', len = config.urlConfig.length;
+ for ( var i = 0, val; i < len, val = config.urlConfig[i]; i++ ) {
+ config[val] = QUnit.urlParams[val];
+ urlConfigHtml += '<label><input name="' + val + '" type="checkbox"' + ( config[val] ? ' checked="checked"' : '' ) + '>' + val + '</label>';
+ }
+
var userAgent = id("qunit-userAgent");
if ( userAgent ) {
userAgent.innerHTML = navigator.userAgent;
}
var banner = id("qunit-header");
if ( banner ) {
- banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' +
- '<label><input name="noglobals" type="checkbox"' + ( config.noglobals ? ' checked="checked"' : '' ) + '>noglobals</label>' +
- '<label><input name="notrycatch" type="checkbox"' + ( config.notrycatch ? ' checked="checked"' : '' ) + '>notrycatch</label>';
+ banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;
addEvent( banner, "change", function( event ) {
var params = {};
params[ event.target.name ] = event.target.checked ? true : undefined;
window.location = QUnit.url( params );
});
}
-
+
var toolbar = id("qunit-testrunner-toolbar");
if ( toolbar ) {
var filter = document.createElement("input");
@@ -711,13 +758,13 @@ addEvent(window, "load", function() {
}
if ( defined.sessionStorage ) {
if (filter.checked) {
- sessionStorage.setItem("qunit-filter-passed-tests", "true");
+ sessionStorage.setItem("qunit-filter-passed-tests", "true");
} else {
sessionStorage.removeItem("qunit-filter-passed-tests");
}
}
});
- if ( defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
+ if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
filter.checked = true;
var ol = document.getElementById("qunit-tests");
ol.className = ol.className + " hidepass";
@@ -738,14 +785,27 @@ addEvent(window, "load", function() {
if (config.autostart) {
QUnit.start();
}
-});
+};
+
+addEvent(window, "load", QUnit.load);
+
+// addEvent(window, "error") gives us a useless event object
+window.onerror = function( message, file, line ) {
+ if ( QUnit.config.current ) {
+ ok( false, message + ", " + file + ":" + line );
+ } else {
+ test( "global failure", function() {
+ ok( false, message + ", " + file + ":" + line );
+ });
+ }
+};
function done() {
config.autorun = true;
// Log the last module results
if ( config.currentModule ) {
- QUnit.moduleDone( {
+ runLoggingCallbacks( 'moduleDone', QUnit, {
name: config.currentModule,
failed: config.moduleStats.bad,
passed: config.moduleStats.all - config.moduleStats.bad,
@@ -774,13 +834,22 @@ function done() {
banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
}
- if ( tests ) {
+ if ( tests ) {
id( "qunit-testresult" ).innerHTML = html;
}
- QUnit.done( {
+ if ( config.altertitle && typeof document !== "undefined" && document.title ) {
+ // show ✖ for good, ✔ for bad suite result in title
+ // use escape sequences in case file gets loaded with non-utf-8-charset
+ document.title = [
+ (config.stats.bad ? "\u2716" : "\u2714"),
+ document.title.replace(/^[\u2714\u2716] /i, "")
+ ].join(" ");
+ }
+
+ runLoggingCallbacks( 'done', QUnit, {
failed: config.stats.bad,
- passed: passed,
+ passed: passed,
total: config.stats.all,
runtime: runtime
} );
@@ -794,7 +863,7 @@ function validTest( name ) {
return true;
}
- not = filter.charAt( 0 ) === "!";
+ var not = filter.charAt( 0 ) === "!";
if ( not ) {
filter = filter.slice( 1 );
}
@@ -822,20 +891,22 @@ function sourceFromStacktrace() {
} else if (e.stack) {
// Firefox, Chrome
return e.stack.split("\n")[4];
+ } else if (e.sourceURL) {
+ // Safari, PhantomJS
+ // TODO sourceURL points at the 'throw new Error' line above, useless
+ //return e.sourceURL + ":" + e.line;
}
}
}
-function escapeHtml(s) {
+function escapeInnerText(s) {
if (!s) {
return "";
}
s = s + "";
- return s.replace(/[\&"<>\\]/g, function(s) {
+ return s.replace(/[\&<>]/g, function(s) {
switch(s) {
case "&": return "&amp;";
- case "\\": return "\\\\";
- case '"': return '\"';
case "<": return "&lt;";
case ">": return "&gt;";
default: return s;
@@ -843,35 +914,42 @@ function escapeHtml(s) {
});
}
-function synchronize( callback ) {
+function synchronize( callback, last ) {
config.queue.push( callback );
if ( config.autorun && !config.blocking ) {
- process();
+ process(last);
}
}
-function process() {
- var start = (new Date()).getTime();
+function process( last ) {
+ var start = new Date().getTime();
+ config.depth = config.depth ? config.depth + 1 : 1;
while ( config.queue.length && !config.blocking ) {
- if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {
+ if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
config.queue.shift()();
} else {
- window.setTimeout( process, 13 );
+ window.setTimeout( function(){
+ process( last );
+ }, 13 );
break;
}
}
- if (!config.blocking && !config.queue.length) {
- done();
- }
+ config.depth--;
+ if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
+ done();
+ }
}
function saveGlobal() {
config.pollution = [];
-
+
if ( config.noglobals ) {
for ( var key in window ) {
+ if ( !hasOwn.call( window, key ) ) {
+ continue;
+ }
config.pollution.push( key );
}
}
@@ -880,7 +958,7 @@ function saveGlobal() {
function checkPollution( name ) {
var old = config.pollution;
saveGlobal();
-
+
var newGlobals = diff( config.pollution, old );
if ( newGlobals.length > 0 ) {
ok( false, "Introduced global variable(s): " + newGlobals.join(", ") );
@@ -922,7 +1000,9 @@ function extend(a, b) {
for ( var prop in b ) {
if ( b[prop] === undefined ) {
delete a[prop];
- } else {
+
+ // Avoid "Member not found" error in IE8 caused by setting window.constructor
+ } else if ( prop !== "constructor" || a !== window ) {
a[prop] = b[prop];
}
}
@@ -945,176 +1025,216 @@ function id(name) {
document.getElementById( name );
}
+function registerLoggingCallback(key){
+ return function(callback){
+ config[key].push( callback );
+ };
+}
+
+// Supports deprecated method of completely overwriting logging callbacks
+function runLoggingCallbacks(key, scope, args) {
+ //debugger;
+ var callbacks;
+ if ( QUnit.hasOwnProperty(key) ) {
+ QUnit[key].call(scope, args);
+ } else {
+ callbacks = config[key];
+ for( var i = 0; i < callbacks.length; i++ ) {
+ callbacks[i].call( scope, args );
+ }
+ }
+}
+
// Test for equality any JavaScript type.
-// Discussions and reference: http://philrathe.com/articles/equiv
-// Test suites: http://philrathe.com/tests/equiv
// Author: Philippe Rathé <prathe@gmail.com>
QUnit.equiv = function () {
- var innerEquiv; // the real equiv function
- var callers = []; // stack to decide between skip/abort functions
- var parents = []; // stack to avoiding loops from circular referencing
-
- // Call the o related callback with the given arguments.
- function bindCallbacks(o, callbacks, args) {
- var prop = QUnit.objectType(o);
- if (prop) {
- if (QUnit.objectType(callbacks[prop]) === "function") {
- return callbacks[prop].apply(callbacks, args);
- } else {
- return callbacks[prop]; // or undefined
- }
- }
- }
-
- var callbacks = function () {
-
- // for string, boolean, number and null
- function useStrictEquality(b, a) {
- if (b instanceof a.constructor || a instanceof b.constructor) {
- // to catch short annotaion VS 'new' annotation of a declaration
- // e.g. var i = 1;
- // var j = new Number(1);
- return a == b;
- } else {
- return a === b;
- }
- }
-
- return {
- "string": useStrictEquality,
- "boolean": useStrictEquality,
- "number": useStrictEquality,
- "null": useStrictEquality,
- "undefined": useStrictEquality,
-
- "nan": function (b) {
- return isNaN(b);
- },
-
- "date": function (b, a) {
- return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf();
- },
-
- "regexp": function (b, a) {
- return QUnit.objectType(b) === "regexp" &&
- a.source === b.source && // the regex itself
- a.global === b.global && // and its modifers (gmi) ...
- a.ignoreCase === b.ignoreCase &&
- a.multiline === b.multiline;
- },
-
- // - skip when the property is a method of an instance (OOP)
- // - abort otherwise,
- // initial === would have catch identical references anyway
- "function": function () {
- var caller = callers[callers.length - 1];
- return caller !== Object &&
- typeof caller !== "undefined";
- },
-
- "array": function (b, a) {
- var i, j, loop;
- var len;
-
- // b could be an object literal here
- if ( ! (QUnit.objectType(b) === "array")) {
- return false;
- }
-
- len = a.length;
- if (len !== b.length) { // safe and faster
- return false;
- }
-
- //track reference to avoid circular references
- parents.push(a);
- for (i = 0; i < len; i++) {
- loop = false;
- for(j=0;j<parents.length;j++){
- if(parents[j] === a[i]){
- loop = true;//dont rewalk array
- }
- }
- if (!loop && ! innerEquiv(a[i], b[i])) {
- parents.pop();
- return false;
- }
- }
- parents.pop();
- return true;
- },
-
- "object": function (b, a) {
- var i, j, loop;
- var eq = true; // unless we can proove it
- var aProperties = [], bProperties = []; // collection of strings
-
- // comparing constructors is more strict than using instanceof
- if ( a.constructor !== b.constructor) {
- return false;
- }
+ var innerEquiv; // the real equiv function
+ var callers = []; // stack to decide between skip/abort functions
+ var parents = []; // stack to avoiding loops from circular referencing
- // stack constructor before traversing properties
- callers.push(a.constructor);
- //track reference to avoid circular references
- parents.push(a);
-
- for (i in a) { // be strict: don't ensures hasOwnProperty and go deep
- loop = false;
- for(j=0;j<parents.length;j++){
- if(parents[j] === a[i])
- loop = true; //don't go down the same path twice
- }
- aProperties.push(i); // collect a's properties
-
- if (!loop && ! innerEquiv(a[i], b[i])) {
- eq = false;
- break;
- }
- }
+ // Call the o related callback with the given arguments.
+ function bindCallbacks(o, callbacks, args) {
+ var prop = QUnit.objectType(o);
+ if (prop) {
+ if (QUnit.objectType(callbacks[prop]) === "function") {
+ return callbacks[prop].apply(callbacks, args);
+ } else {
+ return callbacks[prop]; // or undefined
+ }
+ }
+ }
- callers.pop(); // unstack, we are done
- parents.pop();
+ var getProto = Object.getPrototypeOf || function (obj) {
+ return obj.__proto__;
+ };
- for (i in b) {
- bProperties.push(i); // collect b's properties
- }
+ var callbacks = function () {
+
+ // for string, boolean, number and null
+ function useStrictEquality(b, a) {
+ if (b instanceof a.constructor || a instanceof b.constructor) {
+ // to catch short annotaion VS 'new' annotation of a
+ // declaration
+ // e.g. var i = 1;
+ // var j = new Number(1);
+ return a == b;
+ } else {
+ return a === b;
+ }
+ }
+
+ return {
+ "string" : useStrictEquality,
+ "boolean" : useStrictEquality,
+ "number" : useStrictEquality,
+ "null" : useStrictEquality,
+ "undefined" : useStrictEquality,
+
+ "nan" : function(b) {
+ return isNaN(b);
+ },
+
+ "date" : function(b, a) {
+ return QUnit.objectType(b) === "date"
+ && a.valueOf() === b.valueOf();
+ },
+
+ "regexp" : function(b, a) {
+ return QUnit.objectType(b) === "regexp"
+ && a.source === b.source && // the regex itself
+ a.global === b.global && // and its modifers
+ // (gmi) ...
+ a.ignoreCase === b.ignoreCase
+ && a.multiline === b.multiline;
+ },
+
+ // - skip when the property is a method of an instance (OOP)
+ // - abort otherwise,
+ // initial === would have catch identical references anyway
+ "function" : function() {
+ var caller = callers[callers.length - 1];
+ return caller !== Object && typeof caller !== "undefined";
+ },
+
+ "array" : function(b, a) {
+ var i, j, loop;
+ var len;
+
+ // b could be an object literal here
+ if (!(QUnit.objectType(b) === "array")) {
+ return false;
+ }
+
+ len = a.length;
+ if (len !== b.length) { // safe and faster
+ return false;
+ }
- // Ensures identical properties name
- return eq && innerEquiv(aProperties.sort(), bProperties.sort());
- }
- };
- }();
-
- innerEquiv = function () { // can take multiple arguments
- var args = Array.prototype.slice.apply(arguments);
- if (args.length < 2) {
- return true; // end transition
- }
-
- return (function (a, b) {
- if (a === b) {
- return true; // catch the most you can
- } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || QUnit.objectType(a) !== QUnit.objectType(b)) {
- return false; // don't lose time with error prone cases
- } else {
- return bindCallbacks(a, callbacks, [b, a]);
- }
-
- // apply transition with (1..n) arguments
- })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1));
- };
-
- return innerEquiv;
+ // track reference to avoid circular references
+ parents.push(a);
+ for (i = 0; i < len; i++) {
+ loop = false;
+ for (j = 0; j < parents.length; j++) {
+ if (parents[j] === a[i]) {
+ loop = true;// dont rewalk array
+ }
+ }
+ if (!loop && !innerEquiv(a[i], b[i])) {
+ parents.pop();
+ return false;
+ }
+ }
+ parents.pop();
+ return true;
+ },
+
+ "object" : function(b, a) {
+ var i, j, loop;
+ var eq = true; // unless we can proove it
+ var aProperties = [], bProperties = []; // collection of
+ // strings
+
+ // comparing constructors is more strict than using
+ // instanceof
+ if (a.constructor !== b.constructor) {
+ // Allow objects with no prototype to be equivalent to
+ // objects with Object as their constructor.
+ if (!((getProto(a) === null && getProto(b) === Object.prototype) ||
+ (getProto(b) === null && getProto(a) === Object.prototype)))
+ {
+ return false;
+ }
+ }
+
+ // stack constructor before traversing properties
+ callers.push(a.constructor);
+ // track reference to avoid circular references
+ parents.push(a);
+
+ for (i in a) { // be strict: don't ensures hasOwnProperty
+ // and go deep
+ loop = false;
+ for (j = 0; j < parents.length; j++) {
+ if (parents[j] === a[i])
+ loop = true; // don't go down the same path
+ // twice
+ }
+ aProperties.push(i); // collect a's properties
+
+ if (!loop && !innerEquiv(a[i], b[i])) {
+ eq = false;
+ break;
+ }
+ }
+
+ callers.pop(); // unstack, we are done
+ parents.pop();
+
+ for (i in b) {
+ bProperties.push(i); // collect b's properties
+ }
+
+ // Ensures identical properties name
+ return eq
+ && innerEquiv(aProperties.sort(), bProperties
+ .sort());
+ }
+ };
+ }();
+
+ innerEquiv = function() { // can take multiple arguments
+ var args = Array.prototype.slice.apply(arguments);
+ if (args.length < 2) {
+ return true; // end transition
+ }
+
+ return (function(a, b) {
+ if (a === b) {
+ return true; // catch the most you can
+ } else if (a === null || b === null || typeof a === "undefined"
+ || typeof b === "undefined"
+ || QUnit.objectType(a) !== QUnit.objectType(b)) {
+ return false; // don't lose time with error prone cases
+ } else {
+ return bindCallbacks(a, callbacks, [ b, a ]);
+ }
+
+ // apply transition with (1..n) arguments
+ })(args[0], args[1])
+ && arguments.callee.apply(this, args.splice(1,
+ args.length - 1));
+ };
+
+ return innerEquiv;
}();
/**
- * jsDump
- * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
- * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php)
- * Date: 5/15/2008
+ * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
+ * http://flesler.blogspot.com Licensed under BSD
+ * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
+ *
* @projectDescription Advanced and extensible data dumping for Javascript.
* @version 1.0.0
* @author Ariel Flesler
@@ -1125,7 +1245,7 @@ QUnit.jsDump = (function() {
return '"' + str.toString().replace(/"/g, '\\"') + '"';
};
function literal( o ) {
- return o + '';
+ return o + '';
};
function join( pre, arr, post ) {
var s = jsDump.separator(),
@@ -1137,25 +1257,35 @@ QUnit.jsDump = (function() {
return pre + post;
return [ pre, inner + arr, base + post ].join(s);
};
- function array( arr ) {
- var i = arr.length, ret = Array(i);
+ function array( arr, stack ) {
+ var i = arr.length, ret = Array(i);
this.up();
while ( i-- )
- ret[i] = this.parse( arr[i] );
+ ret[i] = this.parse( arr[i] , undefined , stack);
this.down();
return join( '[', ret, ']' );
};
-
+
var reName = /^function (\w+)/;
-
+
var jsDump = {
- parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance
- var parser = this.parsers[ type || this.typeOf(obj) ];
- type = typeof parser;
-
- return type == 'function' ? parser.call( this, obj ) :
- type == 'string' ? parser :
- this.parsers.error;
+ parse:function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
+ stack = stack || [ ];
+ var parser = this.parsers[ type || this.typeOf(obj) ];
+ type = typeof parser;
+ var inStack = inArray(obj, stack);
+ if (inStack != -1) {
+ return 'recursion('+(inStack - stack.length)+')';
+ }
+ //else
+ if (type == 'function') {
+ stack.push(obj);
+ var res = parser.call( this, obj, stack );
+ stack.pop();
+ return res;
+ }
+ // else
+ return (type == 'string') ? parser : this.parsers.error;
},
typeOf:function( obj ) {
var type;
@@ -1175,7 +1305,12 @@ QUnit.jsDump = (function() {
type = "document";
} else if (obj.nodeType) {
type = "node";
- } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) {
+ } else if (
+ // native arrays
+ toString.call( obj ) === "[object Array]" ||
+ // NodeList objects
+ ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
+ ) {
type = "array";
} else {
type = typeof obj;
@@ -1203,7 +1338,7 @@ QUnit.jsDump = (function() {
this.parsers[name] = parser;
},
// The next 3 are exposed so you can use them
- quote:quote,
+ quote:quote,
literal:literal,
join:join,
//
@@ -1222,28 +1357,30 @@ QUnit.jsDump = (function() {
if ( name )
ret += ' ' + name;
ret += '(';
-
+
ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
},
array: array,
nodelist: array,
arguments: array,
- object:function( map ) {
+ object:function( map, stack ) {
var ret = [ ];
QUnit.jsDump.up();
- for ( var key in map )
- ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(map[key]) );
+ for ( var key in map ) {
+ var val = map[key];
+ ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(val, undefined, stack));
+ }
QUnit.jsDump.down();
return join( '{', ret, '}' );
},
node:function( node ) {
var open = QUnit.jsDump.HTML ? '&lt;' : '<',
close = QUnit.jsDump.HTML ? '&gt;' : '>';
-
+
var tag = node.nodeName.toLowerCase(),
ret = open + tag;
-
+
for ( var a in QUnit.jsDump.DOMAttrs ) {
var val = node[QUnit.jsDump.DOMAttrs[a]];
if ( val )
@@ -1253,8 +1390,8 @@ QUnit.jsDump = (function() {
},
functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function
var l = fn.length;
- if ( !l ) return '';
-
+ if ( !l ) return '';
+
var args = Array(l);
while ( l-- )
args[l] = String.fromCharCode(97+l);//97 is 'a'
@@ -1302,6 +1439,21 @@ function getText( elems ) {
return ret;
};
+//from jquery.js
+function inArray( elem, array ) {
+ if ( array.indexOf ) {
+ return array.indexOf( elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
/*
* Javascript Diff Algorithm
* By John Resig (http://ejohn.org/)
@@ -1311,35 +1463,38 @@ function getText( elems ) {
*
* More Info:
* http://ejohn.org/projects/javascript-diff-algorithm/
- *
+ *
* Usage: QUnit.diff(expected, actual)
- *
+ *
* QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
*/
QUnit.diff = (function() {
- function diff(o, n){
- var ns = new Object();
- var os = new Object();
-
+ function diff(o, n) {
+ var ns = {};
+ var os = {};
+
for (var i = 0; i < n.length; i++) {
- if (ns[n[i]] == null)
+ if (ns[n[i]] == null)
ns[n[i]] = {
- rows: new Array(),
+ rows: [],
o: null
};
ns[n[i]].rows.push(i);
}
-
+
for (var i = 0; i < o.length; i++) {
- if (os[o[i]] == null)
+ if (os[o[i]] == null)
os[o[i]] = {
- rows: new Array(),
+ rows: [],
n: null
};
os[o[i]].rows.push(i);
}
-
+
for (var i in ns) {
+ if ( !hasOwn.call( ns, i ) ) {
+ continue;
+ }
if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
n[ns[i].rows[0]] = {
text: n[ns[i].rows[0]],
@@ -1351,7 +1506,7 @@ QUnit.diff = (function() {
};
}
}
-
+
for (var i = 0; i < n.length - 1; i++) {
if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
n[i + 1] == o[n[i].row + 1]) {
@@ -1365,7 +1520,7 @@ QUnit.diff = (function() {
};
}
}
-
+
for (var i = n.length - 1; i > 0; i--) {
if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
n[i - 1] == o[n[i].row - 1]) {
@@ -1379,20 +1534,20 @@ QUnit.diff = (function() {
};
}
}
-
+
return {
o: o,
n: n
};
}
-
- return function(o, n){
+
+ return function(o, n) {
o = o.replace(/\s+$/, '');
n = n.replace(/\s+$/, '');
var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/));
var str = "";
-
+
var oSpace = o.match(/\s+/g);
if (oSpace == null) {
oSpace = [" "];
@@ -1407,7 +1562,7 @@ QUnit.diff = (function() {
else {
nSpace.push(" ");
}
-
+
if (out.n.length == 0) {
for (var i = 0; i < out.o.length; i++) {
str += '<del>' + out.o[i] + oSpace[i] + "</del>";
@@ -1419,14 +1574,14 @@ QUnit.diff = (function() {
str += '<del>' + out.o[n] + oSpace[n] + "</del>";
}
}
-
+
for (var i = 0; i < out.n.length; i++) {
if (out.n[i].text == null) {
str += '<ins>' + out.n[i] + nSpace[i] + "</ins>";
}
else {
var pre = "";
-
+
for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
pre += '<del>' + out.o[n] + oSpace[n] + "</del>";
}
@@ -1434,9 +1589,9 @@ QUnit.diff = (function() {
}
}
}
-
+
return str;
};
})();
-})(this); \ No newline at end of file
+})(this);
diff --git a/resources/jquery/jquery.spinner.css b/resources/jquery/jquery.spinner.css
new file mode 100644
index 00000000..150a51b4
--- /dev/null
+++ b/resources/jquery/jquery.spinner.css
@@ -0,0 +1,12 @@
+.mw-spinner {
+ /* @embed */
+ background: transparent url(images/spinner.gif);
+ height: 20px;
+ width: 20px;
+ display: inline-block;
+ vertical-align: middle;
+
+ /* IE < 8 Hacks */
+ zoom: 1;
+ *display: inline;
+} \ No newline at end of file
diff --git a/resources/jquery/jquery.spinner.js b/resources/jquery/jquery.spinner.js
new file mode 100644
index 00000000..87e45382
--- /dev/null
+++ b/resources/jquery/jquery.spinner.js
@@ -0,0 +1,44 @@
+/**
+ * jQuery spinner
+ *
+ * Simple jQuery plugin to create, inject and remove spinners.
+ */
+( function( $ ) {
+
+$.extend( {
+ /**
+ * Creates a spinner element.
+ *
+ * @param id {String} id of the spinner
+ * @return {jQuery} spinner
+ */
+ createSpinner: function( id ) {
+ return $( '<div>' ).attr( {
+ id: 'mw-spinner-' + id,
+ 'class': 'mw-spinner',
+ title: '...'
+ } );
+ },
+
+ /**
+ * Removes a spinner element.
+ *
+ * @param id {String}
+ * @return {jQuery} spinner
+ */
+ removeSpinner: function( id ) {
+ return $( '#mw-spinner-' + id ).remove();
+ }
+} );
+
+/**
+ * Injects a spinner after the elements in the jQuery collection.
+ *
+ * @param id String id of the spinner
+ * @return {jQuery}
+ */
+$.fn.injectSpinner = function( id ) {
+ return this.after( $.createSpinner( id ) );
+};
+
+} )( jQuery );
diff --git a/resources/jquery/jquery.suggestions.css b/resources/jquery/jquery.suggestions.css
index 74094c53..3cbdad22 100644
--- a/resources/jquery/jquery.suggestions.css
+++ b/resources/jquery/jquery.suggestions.css
@@ -3,9 +3,9 @@
.suggestions {
overflow: hidden;
position: absolute;
- top: 0px;
- left: 0px;
- width: 0px;
+ top: 0;
+ left: 0;
+ width: 0;
border: none;
z-index: 1099;
padding: 0;
@@ -17,7 +17,7 @@ html > body .suggestions {
}
.suggestions-special {
position: relative;
- background-color: Window;
+ background-color: white;
font-size: 0.8em;
cursor: pointer;
border: solid 1px #aaaaaa;
@@ -30,7 +30,6 @@ html > body .suggestions {
}
.suggestions-results {
background-color: white;
- background-color: Window;
font-size: 0.8em;
cursor: pointer;
border: solid 1px #aaaaaa;
@@ -39,7 +38,6 @@ html > body .suggestions {
}
.suggestions-result {
color: black;
- color: WindowText;
margin: 0;
line-height: 1.5em;
padding: 0.01em 0.25em;
@@ -47,9 +45,7 @@ html > body .suggestions {
}
.suggestions-result-current {
background-color: #4C59A6;
- background-color: Highlight;
color: white;
- color: HighlightText;
}
.suggestions-special .special-label {
font-size: 0.8em;
@@ -67,7 +63,6 @@ html > body .suggestions {
.suggestions-result-current .special-label,
.suggestions-result-current .special-query {
color: white;
- color: HighlightText;
}
.autoellipsis-matched,
.highlight {
diff --git a/resources/jquery/jquery.suggestions.js b/resources/jquery/jquery.suggestions.js
index 90cf53b2..55c30010 100644
--- a/resources/jquery/jquery.suggestions.js
+++ b/resources/jquery/jquery.suggestions.js
@@ -4,36 +4,36 @@
* Usage:
*
* Set options:
- * $('#textbox').suggestions( { option1: value1, option2: value2 } );
- * $('#textbox').suggestions( option, value );
+ * $( '#textbox' ).suggestions( { option1: value1, option2: value2 } );
+ * $( '#textbox' ).suggestions( option, value );
* Get option:
- * value = $('#textbox').suggestions( option );
+ * value = $( '#textbox' ).suggestions( option );
* Initialize:
- * $('#textbox').suggestions();
+ * $( '#textbox' ).suggestions();
*
* Options:
*
* fetch(query): Callback that should fetch suggestions and set the suggestions property. Executed in the context of the
- * textbox
- * Type: Function
+ * textbox
+ * Type: Function
* cancel: Callback function to call when any pending asynchronous suggestions fetches should be canceled.
- * Executed in the context of the textbox
+ * Executed in the context of the textbox
* Type: Function
* special: Set of callbacks for rendering and selecting
* Type: Object of Functions 'render' and 'select'
* result: Set of callbacks for rendering and selecting
* Type: Object of Functions 'render' and 'select'
* $region: jQuery selection of element to place the suggestions below and match width of
- * Type: jQuery Object, Default: $(this)
+ * Type: jQuery Object, Default: $(this)
* suggestions: Suggestions to display
- * Type: Array of strings
+ * Type: Array of strings
* maxRows: Maximum number of suggestions to display at one time
- * Type: Number, Range: 1 - 100, Default: 7
+ * Type: Number, Range: 1 - 100, Default: 7
* delay: Number of ms to wait for the user to stop typing
- * Type: Number, Range: 0 - 1200, Default: 120
+ * Type: Number, Range: 0 - 1200, Default: 120
* submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
* Type: Boolean, Default: false
- * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set to e.g. 2, the suggestions box
+ * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set to e.g. 2, the suggestions box
* will never be grown beyond 2 times the width of the textbox.
* Type: Number, Range: 1 - infinity, Default: 3
* positionFromLeft: Whether to position the suggestion box with the left attribute or the right
@@ -52,7 +52,7 @@ $.suggestions = {
if ( context.data.timerID != null ) {
clearTimeout( context.data.timerID );
}
- if ( typeof context.config.cancel == 'function' ) {
+ if ( $.isFunction( context.config.cancel ) ) {
context.config.cancel.call( context.data.$textbox );
}
},
@@ -66,7 +66,7 @@ $.suggestions = {
},
/**
* Ask the user-specified callback for new suggestions. Any previous delayed call to this function still pending
- * will be canceled. If the value in the textbox is empty or hasn't changed since the last time suggestions were fetched, this
+ * will be canceled. If the value in the textbox is empty or hasn't changed since the last time suggestions were fetched, this
* function does nothing.
* @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
*/
@@ -74,12 +74,12 @@ $.suggestions = {
// Only fetch if the value in the textbox changed and is not empty
// if the textbox is empty then clear the result div, but leave other settings intouched
function maybeFetch() {
- if ( context.data.$textbox.val().length == 0 ) {
+ if ( context.data.$textbox.val().length === 0 ) {
context.data.$container.hide();
context.data.prevText = '';
} else if ( context.data.$textbox.val() !== context.data.prevText ) {
- if ( typeof context.config.fetch == 'function' ) {
- context.data.prevText = context.data.$textbox.val();
+ if ( typeof context.config.fetch === 'function' ) {
+ context.data.prevText = context.data.$textbox.val();
context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
}
}
@@ -99,7 +99,7 @@ $.suggestions = {
},
special: function( context ) {
// Allow custom rendering - but otherwise don't do any rendering
- if ( typeof context.config.special.render == 'function' ) {
+ if ( typeof context.config.special.render === 'function' ) {
// Wait for the browser to update the value
setTimeout( function() {
// Render special
@@ -126,8 +126,8 @@ $.suggestions = {
case 'suggestions':
context.config[property] = value;
// Update suggestions
- if ( typeof context.data !== 'undefined' ) {
- if ( context.data.$textbox.val().length == 0 ) {
+ if ( context.data !== undefined ) {
+ if ( context.data.$textbox.val().length === 0 ) {
// Hide the div when no suggestion exist
context.data.$container.hide();
} else {
@@ -135,17 +135,17 @@ $.suggestions = {
context.data.$container.show();
// Update the size and position of the list
var newCSS = {
- 'top': context.config.$region.offset().top + context.config.$region.outerHeight(),
- 'bottom': 'auto',
- 'width': context.config.$region.outerWidth(),
- 'height': 'auto'
+ top: context.config.$region.offset().top + context.config.$region.outerHeight(),
+ bottom: 'auto',
+ width: context.config.$region.outerWidth(),
+ height: 'auto'
};
if ( context.config.positionFromLeft ) {
- newCSS['left'] = context.config.$region.offset().left;
- newCSS['right'] = 'auto';
+ newCSS.left = context.config.$region.offset().left;
+ newCSS.right = 'auto';
} else {
- newCSS['left'] = 'auto';
- newCSS['right'] = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+ newCSS.left = 'auto';
+ newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
}
context.data.$container.css( newCSS );
var $results = context.data.$container.children( '.suggestions-results' );
@@ -155,7 +155,7 @@ $.suggestions = {
var matchedText = null;
for ( var i = 0; i < context.config.suggestions.length; i++ ) {
var text = context.config.suggestions[i];
- var $result = $( '<div />' )
+ var $result = $( '<div>' )
.addClass( 'suggestions-result' )
.attr( 'rel', i )
.data( 'text', context.config.suggestions[i] )
@@ -167,18 +167,18 @@ $.suggestions = {
} )
.appendTo( $results );
// Allow custom rendering
- if ( typeof context.config.result.render == 'function' ) {
+ if ( typeof context.config.result.render === 'function' ) {
context.config.result.render.call( $result, context.config.suggestions[i] );
} else {
// Add <span> with text
if( context.config.highlightInput ) {
matchedText = context.data.prevText;
}
- $result.append( $( '<span />' )
+ $result.append( $( '<span>' )
.css( 'whiteSpace', 'nowrap' )
.text( text )
);
-
+
// Widen results box if needed
// New width is only calculated here, applied later
var $span = $result.children( 'span' );
@@ -223,25 +223,25 @@ $.suggestions = {
highlight: function( context, result, updateTextbox ) {
var selected = context.data.$container.find( '.suggestions-result-current' );
if ( !result.get || selected.get( 0 ) != result.get( 0 ) ) {
- if ( result == 'prev' ) {
+ if ( result === 'prev' ) {
if( selected.is( '.suggestions-special' ) ) {
- result = context.data.$container.find( '.suggestions-result:last' )
+ result = context.data.$container.find( '.suggestions-result:last' );
} else {
result = selected.prev();
- if ( selected.length == 0 ) {
+ if ( selected.length === 0 ) {
// we are at the beginning, so lets jump to the last item
- if ( context.data.$container.find( '.suggestions-special' ).html() != "" ) {
+ if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
result = context.data.$container.find( '.suggestions-special' );
} else {
result = context.data.$container.find( '.suggestions-results div:last' );
}
}
}
- } else if ( result == 'next' ) {
- if ( selected.length == 0 ) {
+ } else if ( result === 'next' ) {
+ if ( selected.length === 0 ) {
// No item selected, go to the first one
result = context.data.$container.find( '.suggestions-results div:first' );
- if ( result.length == 0 && context.data.$container.find( '.suggestions-special' ).html() != "" ) {
+ if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
// No suggestion exists, go to the special one directly
result = context.data.$container.find( '.suggestions-special' );
}
@@ -250,8 +250,8 @@ $.suggestions = {
if ( selected.is( '.suggestions-special' ) ) {
result = $( [] );
} else if (
- result.length == 0 &&
- context.data.$container.find( '.suggestions-special' ).html() != ""
+ result.length === 0 &&
+ context.data.$container.find( '.suggestions-special' ).html() !== ''
) {
// We were at the last item, jump to the specials!
result = context.data.$container.find( '.suggestions-special' );
@@ -262,7 +262,7 @@ $.suggestions = {
result.addClass( 'suggestions-result-current' );
}
if ( updateTextbox ) {
- if ( result.length == 0 || result.is( '.suggestions-special' ) ) {
+ if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
$.suggestions.restore( context );
} else {
context.data.$textbox.val( result.data( 'text' ) );
@@ -278,8 +278,8 @@ $.suggestions = {
* @param key Integer Code of key pressed
*/
keypress: function( e, context, key ) {
- var wasVisible = context.data.$container.is( ':visible' );
- var preventDefault = false;
+ var wasVisible = context.data.$container.is( ':visible' ),
+ preventDefault = false;
switch ( key ) {
// Arrow down
case 40:
@@ -312,17 +312,17 @@ $.suggestions = {
context.data.$container.hide();
preventDefault = wasVisible;
selected = context.data.$container.find( '.suggestions-result-current' );
- if ( selected.size() == 0 || context.data.selectedWithMouse ) {
- // if nothing is selected OR if something was selected with the mouse,
+ if ( selected.length === 0 || context.data.selectedWithMouse ) {
+ // if nothing is selected OR if something was selected with the mouse,
// cancel any current requests and submit the form
$.suggestions.cancel( context );
context.config.$region.closest( 'form' ).submit();
} else if ( selected.is( '.suggestions-special' ) ) {
- if ( typeof context.config.special.select == 'function' ) {
+ if ( typeof context.config.special.select === 'function' ) {
context.config.special.select.call( selected, context.data.$textbox );
}
} else {
- if ( typeof context.config.result.select == 'function' ) {
+ if ( typeof context.config.result.select === 'function' ) {
$.suggestions.highlight( context, selected, true );
context.config.result.select.call( selected, context.data.$textbox );
} else {
@@ -341,17 +341,17 @@ $.suggestions = {
}
};
$.fn.suggestions = function() {
-
+
// Multi-context fields
var returnValue = null;
var args = arguments;
-
+
$(this).each( function() {
/* Construction / Loading */
-
+
var context = $(this).data( 'suggestions-context' );
- if ( typeof context == 'undefined' || context == null ) {
+ if ( context === undefined || context === null ) {
context = {
config: {
'fetch' : function() {},
@@ -369,17 +369,17 @@ $.fn.suggestions = function() {
}
};
}
-
+
/* API */
-
+
// Handle various calling styles
if ( args.length > 0 ) {
- if ( typeof args[0] == 'object' ) {
+ if ( typeof args[0] === 'object' ) {
// Apply set of properties
for ( var key in args[0] ) {
$.suggestions.configure( context, key, args[0][key] );
}
- } else if ( typeof args[0] == 'string' ) {
+ } else if ( typeof args[0] === 'string' ) {
if ( args.length > 1 ) {
// Set property values
$.suggestions.configure( context, args[0], args[1] );
@@ -389,10 +389,10 @@ $.fn.suggestions = function() {
}
}
}
-
+
/* Initialization */
-
- if ( typeof context.data == 'undefined' ) {
+
+ if ( context.data === undefined ) {
context.data = {
// ID of running timer
'timerID': null,
@@ -407,23 +407,23 @@ $.fn.suggestions = function() {
};
// Setup the css for positioning the results box
var newCSS = {
- 'top': Math.round( context.data.$textbox.offset().top + context.data.$textbox.outerHeight() ),
- 'width': context.data.$textbox.outerWidth(),
- 'display': 'none'
+ top: Math.round( context.data.$textbox.offset().top + context.data.$textbox.outerHeight() ),
+ width: context.data.$textbox.outerWidth(),
+ display: 'none'
};
if ( context.config.positionFromLeft ) {
- newCSS['left'] = context.config.$region.offset().left;
- newCSS['right'] = 'auto';
+ newCSS.left = context.config.$region.offset().left;
+ newCSS.right = 'auto';
} else {
- newCSS['left'] = 'auto';
- newCSS['right'] = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+ newCSS.left = 'auto';
+ newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
}
-
- context.data.$container = $( '<div />' )
+
+ context.data.$container = $( '<div>' )
.css( newCSS )
.addClass( 'suggestions' )
.append(
- $( '<div />' ).addClass( 'suggestions-results' )
+ $( '<div>' ).addClass( 'suggestions-results' )
// Can't use click() because the container div is hidden when the textbox loses focus. Instead,
// listen for a mousedown followed by a mouseup on the same div
.mousedown( function( e ) {
@@ -438,14 +438,14 @@ $.fn.suggestions = function() {
}
$.suggestions.highlight( context, $result, true );
context.data.$container.hide();
- if ( typeof context.config.result.select == 'function' ) {
+ if ( typeof context.config.result.select === 'function' ) {
context.config.result.select.call( $result, context.data.$textbox );
}
context.data.$textbox.focus();
} )
)
.append(
- $( '<div />' ).addClass( 'suggestions-special' )
+ $( '<div>' ).addClass( 'suggestions-special' )
// Can't use click() because the container div is hidden when the textbox loses focus. Instead,
// listen for a mousedown followed by a mouseup on the same div
.mousedown( function( e ) {
@@ -459,7 +459,7 @@ $.fn.suggestions = function() {
return;
}
context.data.$container.hide();
- if ( typeof context.config.special.select == 'function' ) {
+ if ( typeof context.config.special.select === 'function' ) {
context.config.special.select.call( $special, context.data.$textbox );
}
context.data.$textbox.focus();
@@ -477,9 +477,9 @@ $.fn.suggestions = function() {
.attr( 'autocomplete', 'off')
.keydown( function( e ) {
// Store key pressed to handle later
- context.data.keypressed = ( e.keyCode == undefined ) ? e.which : e.keyCode;
+ context.data.keypressed = ( e.keyCode === undefined ) ? e.which : e.keyCode;
context.data.keypressedCount = 0;
-
+
switch ( context.data.keypressed ) {
// This preventDefault logic is duplicated from
// $.suggestions.keypress(), which sucks
@@ -503,7 +503,7 @@ $.fn.suggestions = function() {
.keyup( function( e ) {
// Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
// keypress in between, solve it
- if ( context.data.keypressedCount == 0 ) {
+ if ( context.data.keypressedCount === 0 ) {
$.suggestions.keypress( e, context, context.data.keypressed );
}
} )
diff --git a/resources/jquery/jquery.tabIndex.js b/resources/jquery/jquery.tabIndex.js
index 33e06047..75731d7c 100644
--- a/resources/jquery/jquery.tabIndex.js
+++ b/resources/jquery/jquery.tabIndex.js
@@ -4,13 +4,13 @@
( function( $ ) {
/**
* Finds the lowerst tabindex in use within a selection
- *
+ *
* @return number Lowest tabindex on the page
*/
$.fn.firstTabIndex = function() {
var minTabIndex = null;
$(this).find( '[tabindex]' ).each( function() {
- var tabIndex = parseInt( $(this).attr( 'tabindex' ), 10 );
+ var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
// In IE6/IE7 the above jQuery selector returns all elements,
// becuase it has a default value for tabIndex in IE6/IE7 of 0
// (rather than null/undefined). Therefore check "> 0" as well.
@@ -29,13 +29,13 @@ $.fn.firstTabIndex = function() {
/**
* Finds the highest tabindex in use within a selection
- *
+ *
* @return number Highest tabindex on the page
*/
$.fn.lastTabIndex = function() {
var maxTabIndex = null;
$(this).find( '[tabindex]' ).each( function() {
- var tabIndex = parseInt( $(this).attr( 'tabindex' ), 10 );
+ var tabIndex = parseInt( $(this).prop( 'tabindex' ), 10 );
if ( tabIndex > 0 && !isNaN( tabIndex ) ) {
// Initial value
if ( maxTabIndex === null ) {
diff --git a/resources/jquery/jquery.tablesorter.css b/resources/jquery/jquery.tablesorter.css
index 87719810..a88acc09 100644
--- a/resources/jquery/jquery.tablesorter.css
+++ b/resources/jquery/jquery.tablesorter.css
@@ -1,17 +1,17 @@
/* Table Sorting */
table.jquery-tablesorter th.headerSort {
/* @embed */
- background-image: url(images/sort_both.gif) !important;
+ background-image: url(images/sort_both.gif);
cursor: pointer;
- background-repeat: no-repeat !important;
- background-position: center right !important;
- padding-right: 21px !important;
+ background-repeat: no-repeat;
+ background-position: center right;
+ padding-right: 21px;
}
table.jquery-tablesorter th.headerSortUp {
/* @embed */
- background-image: url(images/sort_up.gif) !important;
+ background-image: url(images/sort_up.gif);
}
table.jquery-tablesorter th.headerSortDown {
/* @embed */
- background-image: url(images/sort_down.gif) !important;
+ background-image: url(images/sort_down.gif);
}
diff --git a/resources/jquery/jquery.tablesorter.js b/resources/jquery/jquery.tablesorter.js
index 5af27cc4..ea86b64e 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,
+ * Depends on mw.config (wgDigitTransformTable, wgMonthNames, wgMonthNamesShort,
* wgDefaultDateFormat, wgContentLanguage)
+ * Uses 'tableSorterCollation' in mw.config (if available)
*/
/**
*
@@ -240,7 +241,7 @@
}
$thead.append( this );
} );
- $table.children('tbody').before( $thead );
+ $table.find(' > tbody:first').before( $thead );
}
if( !$table.get(0).tFoot ) {
var $tfoot = $( '<tfoot>' );
@@ -259,9 +260,9 @@
var maxSeen = 0,
longest,
realCellIndex = 0,
- $tableHeaders = $( 'thead:eq(0) tr', table );
+ $tableHeaders = $( 'thead:eq(0) > tr', table );
if ( $tableHeaders.length > 1 ) {
- $tableHeaders.each(function() {
+ $tableHeaders.each( function() {
if ( this.cells.length > maxSeen ) {
maxSeen = this.cells.length;
longest = this;
@@ -594,7 +595,7 @@
if ( firstTime ) {
firstTime = false;
-
+
// 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>
@@ -604,10 +605,10 @@
if ( $tfoot.length ) {
$tfoot.eq(0).prepend( $sortbottoms );
} else {
- $table.append( $( '<tfoot>' ).append( $sortbottoms ) )
+ $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
}
}
-
+
explodeRowspans( $table );
// try to auto detect column type, and store in tables config
table.config.parsers = buildParserCache( table, $headers );
diff --git a/resources/jquery/jquery.textSelection.js b/resources/jquery/jquery.textSelection.js
index f3d1a146..91b6e75d 100644
--- a/resources/jquery/jquery.textSelection.js
+++ b/resources/jquery/jquery.textSelection.js
@@ -87,7 +87,7 @@ getSelection: function() {
encapsulateSelection: function( options ) {
return this.each( function() {
var pre = options.pre, post = options.post;
-
+
/**
* Check if the selected text is the same as the insert text
*/
@@ -110,10 +110,10 @@ encapsulateSelection: function( options ) {
}
}
}
-
+
/**
* Do the splitlines stuff.
- *
+ *
* Wrap each line of the selected text with pre and post
*/
function doSplitLines( selText, pre, post ) {
@@ -127,12 +127,62 @@ encapsulateSelection: function( options ) {
}
return insertText;
}
-
+
var isSample = false;
if ( this.style.display == 'none' ) {
// Do nothing
+ } else if ( document.selection && document.selection.createRange ) {
+ // IE
+
+ // Note that IE9 will trigger the next section unless we check this first.
+ // See bug 35201.
+
+ activateElementOnIE( this );
+ if ( context ) {
+ context.fn.restoreCursorAndScrollTop();
+ }
+ if ( options.selectionStart !== undefined ) {
+ $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+ }
+
+ var selText = $(this).textSelection( 'getSelection' );
+ var scrollTop = this.scrollTop;
+ var range = document.selection.createRange();
+
+ checkSelectedText();
+ var insertText = pre + selText + post;
+ if ( options.splitlines ) {
+ insertText = doSplitLines( selText, pre, post );
+ }
+ if ( options.ownline && range.moveStart ) {
+ var range2 = document.selection.createRange();
+ range2.collapse();
+ range2.moveStart( 'character', -1 );
+ // FIXME: Which check is correct?
+ if ( range2.text != "\r" && range2.text != "\n" && range2.text != "" ) {
+ insertText = "\n" + insertText;
+ pre += "\n";
+ }
+ var range3 = document.selection.createRange();
+ range3.collapse( false );
+ range3.moveEnd( 'character', 1 );
+ if ( range3.text != "\r" && range3.text != "\n" && range3.text != "" ) {
+ insertText += "\n";
+ post += "\n";
+ }
+ }
+
+ range.text = insertText;
+ if ( isSample && options.selectPeri && range.moveStart ) {
+ range.moveStart( 'character', - post.length - selText.length );
+ range.moveEnd( 'character', - post.length );
+ }
+ range.select();
+ // Restore the scroll position
+ this.scrollTop = scrollTop;
} else if ( this.selectionStart || this.selectionStart == '0' ) {
// Mozilla/Opera
+
$(this).focus();
if ( options.selectionStart !== undefined ) {
$(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
@@ -143,7 +193,6 @@ encapsulateSelection: function( options ) {
var endPos = this.selectionEnd;
var scrollTop = this.scrollTop;
checkSelectedText();
-
if ( options.selectionStart !== undefined
&& endPos - startPos != options.selectionEnd - options.selectionStart )
{
@@ -158,11 +207,13 @@ encapsulateSelection: function( options ) {
insertText = doSplitLines( selText, pre, post );
}
if ( options.ownline ) {
- if ( startPos != 0 && this.value.charAt( startPos - 1 ) != "\n" ) {
+ if ( startPos != 0 && this.value.charAt( startPos - 1 ) != "\n" && this.value.charAt( startPos - 1 ) != "\r" ) {
insertText = "\n" + insertText;
+ pre += "\n";
}
- if ( this.value.charAt( endPos ) != "\n" ) {
+ if ( this.value.charAt( endPos ) != "\n" && this.value.charAt( endPos ) != "\r" ) {
insertText += "\n";
+ post += "\n";
}
}
this.value = this.value.substring( 0, startPos ) + insertText +
@@ -181,49 +232,6 @@ encapsulateSelection: function( options ) {
this.selectionStart = startPos + insertText.length;
this.selectionEnd = this.selectionStart;
}
- } else if ( document.selection && document.selection.createRange ) {
- // IE
- activateElementOnIE( this );
- if ( context ) {
- context.fn.restoreCursorAndScrollTop();
- }
- if ( options.selectionStart !== undefined ) {
- $(this).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
- }
-
- var selText = $(this).textSelection( 'getSelection' );
- var scrollTop = this.scrollTop;
- var range = document.selection.createRange();
-
- checkSelectedText();
- var insertText = pre + selText + post;
- if ( options.splitlines ) {
- insertText = doSplitLines( selText, pre, post );
- }
- if ( options.ownline && range.moveStart ) {
- var range2 = document.selection.createRange();
- range2.collapse();
- range2.moveStart( 'character', -1 );
- // FIXME: Which check is correct?
- if ( range2.text != "\r" && range2.text != "\n" && range2.text != "" ) {
- insertText = "\n" + insertText;
- }
- var range3 = document.selection.createRange();
- range3.collapse( false );
- range3.moveEnd( 'character', 1 );
- if ( range3.text != "\r" && range3.text != "\n" && range3.text != "" ) {
- insertText += "\n";
- }
- }
-
- range.text = insertText;
- if ( isSample && options.selectPeri && range.moveStart ) {
- range.moveStart( 'character', - post.length - selText.length );
- range.moveEnd( 'character', - post.length );
- }
- range.select();
- // Restore the scroll position
- this.scrollTop = scrollTop;
}
$(this).trigger( 'encapsulateSelection', [ options.pre, options.peri, options.post, options.ownline,
options.replace, options.spitlines ] );
@@ -349,10 +357,10 @@ setSelection: function( options ) {
var length = this.value.length;
// IE doesn't count \n when computing the offset, so we won't either
var newLines = this.value.match( /\n/g );
- if ( newLines) length = length - newLines.length;
+ if ( newLines ) length = length - newLines.length;
selection.moveStart( 'character', options.start );
selection.moveEnd( 'character', -length + options.end );
-
+
// This line can cause an error under certain circumstances (textarea empty, no selection)
// Silence that error
try {
@@ -503,14 +511,14 @@ scrollToCaretPosition: function( options ) {
}
var context = $(this).data( 'wikiEditor-context' );
var hasIframe = typeof context !== 'undefined' && context && typeof context.$iframe !== 'undefined';
-
+
// IE selection restore voodoo
var needSave = false;
if ( hasIframe && context.savedSelection !== null ) {
context.fn.restoreSelection();
needSave = true;
}
- retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
+ var retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
if ( hasIframe && needSave ) {
context.fn.saveSelection();
}
diff --git a/resources/jquery/jquery.validate.js b/resources/jquery/jquery.validate.js
new file mode 100644
index 00000000..72296a61
--- /dev/null
+++ b/resources/jquery/jquery.validate.js
@@ -0,0 +1,1166 @@
+/**
+ * jQuery Validation Plugin 1.8.1
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
+ * http://docs.jquery.com/Plugins/Validation
+ *
+ * Copyright (c) 2006 - 2011 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($) {
+
+$.extend($.fn, {
+ // http://docs.jquery.com/Plugins/Validation/validate
+ validate: function( options ) {
+
+ // if nothing is selected, return nothing; can't chain anyway
+ if (!this.length) {
+ options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
+ return;
+ }
+
+ // check if a validator for this form was already created
+ var validator = $.data(this[0], 'validator');
+ if ( validator ) {
+ return validator;
+ }
+
+ validator = new $.validator( options, this[0] );
+ $.data(this[0], 'validator', validator);
+
+ if ( validator.settings.onsubmit ) {
+
+ // allow suppresing validation by adding a cancel class to the submit button
+ this.find("input, button").filter(".cancel").click(function() {
+ validator.cancelSubmit = true;
+ });
+
+ // when a submitHandler is used, capture the submitting button
+ if (validator.settings.submitHandler) {
+ this.find("input, button").filter(":submit").click(function() {
+ validator.submitButton = this;
+ });
+ }
+
+ // validate the form on submit
+ this.submit( function( event ) {
+ if ( validator.settings.debug )
+ // prevent form submit to be able to see console output
+ event.preventDefault();
+
+ function handle() {
+ if ( validator.settings.submitHandler ) {
+ if (validator.submitButton) {
+ // insert a hidden input as a replacement for the missing submit button
+ var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
+ }
+ validator.settings.submitHandler.call( validator, validator.currentForm );
+ if (validator.submitButton) {
+ // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
+ hidden.remove();
+ }
+ return false;
+ }
+ return true;
+ }
+
+ // prevent submit for invalid forms or custom submit handlers
+ if ( validator.cancelSubmit ) {
+ validator.cancelSubmit = false;
+ return handle();
+ }
+ if ( validator.form() ) {
+ if ( validator.pendingRequest ) {
+ validator.formSubmitted = true;
+ return false;
+ }
+ return handle();
+ } else {
+ validator.focusInvalid();
+ return false;
+ }
+ });
+ }
+
+ return validator;
+ },
+ // http://docs.jquery.com/Plugins/Validation/valid
+ valid: function() {
+ if ( $(this[0]).is('form')) {
+ return this.validate().form();
+ } else {
+ var valid = true;
+ var validator = $(this[0].form).validate();
+ this.each(function() {
+ valid &= validator.element(this);
+ });
+ return valid;
+ }
+ },
+ // attributes: space seperated list of attributes to retrieve and remove
+ removeAttrs: function(attributes) {
+ var result = {},
+ $element = this;
+ $.each(attributes.split(/\s/), function(index, value) {
+ result[value] = $element.attr(value);
+ $element.removeAttr(value);
+ });
+ return result;
+ },
+ // http://docs.jquery.com/Plugins/Validation/rules
+ rules: function(command, argument) {
+ var element = this[0];
+
+ if (command) {
+ var settings = $.data(element.form, 'validator').settings;
+ var staticRules = settings.rules;
+ var existingRules = $.validator.staticRules(element);
+ switch(command) {
+ case "add":
+ $.extend(existingRules, $.validator.normalizeRule(argument));
+ staticRules[element.name] = existingRules;
+ if (argument.messages)
+ settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
+ break;
+ case "remove":
+ if (!argument) {
+ delete staticRules[element.name];
+ return existingRules;
+ }
+ var filtered = {};
+ $.each(argument.split(/\s/), function(index, method) {
+ filtered[method] = existingRules[method];
+ delete existingRules[method];
+ });
+ return filtered;
+ }
+ }
+
+ var data = $.validator.normalizeRules(
+ $.extend(
+ {},
+ $.validator.metadataRules(element),
+ $.validator.classRules(element),
+ $.validator.attributeRules(element),
+ $.validator.staticRules(element)
+ ), element);
+
+ // make sure required is at front
+ if (data.required) {
+ var param = data.required;
+ delete data.required;
+ data = $.extend({required: param}, data);
+ }
+
+ return data;
+ }
+});
+
+// Custom selectors
+$.extend($.expr[":"], {
+ // http://docs.jquery.com/Plugins/Validation/blank
+ blank: function(a) {return !$.trim("" + a.value);},
+ // http://docs.jquery.com/Plugins/Validation/filled
+ filled: function(a) {return !!$.trim("" + a.value);},
+ // http://docs.jquery.com/Plugins/Validation/unchecked
+ unchecked: function(a) {return !a.checked;}
+});
+
+// constructor for validator
+$.validator = function( options, form ) {
+ this.settings = $.extend( true, {}, $.validator.defaults, options );
+ this.currentForm = form;
+ this.init();
+};
+
+$.validator.format = function(source, params) {
+ if ( arguments.length == 1 )
+ return function() {
+ var args = $.makeArray(arguments);
+ args.unshift(source);
+ return $.validator.format.apply( this, args );
+ };
+ if ( arguments.length > 2 && params.constructor != Array ) {
+ params = $.makeArray(arguments).slice(1);
+ }
+ if ( params.constructor != Array ) {
+ params = [ params ];
+ }
+ $.each(params, function(i, n) {
+ source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
+ });
+ return source;
+};
+
+$.extend($.validator, {
+
+ defaults: {
+ messages: {},
+ groups: {},
+ rules: {},
+ errorClass: "error",
+ validClass: "valid",
+ errorElement: "label",
+ focusInvalid: true,
+ errorContainer: $( [] ),
+ errorLabelContainer: $( [] ),
+ onsubmit: true,
+ ignore: [],
+ ignoreTitle: false,
+ onfocusin: function(element) {
+ this.lastActive = element;
+
+ // hide error label and remove error class on focus if enabled
+ if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
+ this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
+ this.addWrapper(this.errorsFor(element)).hide();
+ }
+ },
+ onfocusout: function(element) {
+ if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
+ this.element(element);
+ }
+ },
+ onkeyup: function(element) {
+ if ( element.name in this.submitted || element == this.lastElement ) {
+ this.element(element);
+ }
+ },
+ onclick: function(element) {
+ // click on selects, radiobuttons and checkboxes
+ if ( element.name in this.submitted )
+ this.element(element);
+ // or option elements, check parent select in that case
+ else if (element.parentNode.name in this.submitted)
+ this.element(element.parentNode);
+ },
+ highlight: function(element, errorClass, validClass) {
+ if (element.type === 'radio') {
+ this.findByName(element.name).addClass(errorClass).removeClass(validClass);
+ } else {
+ $(element).addClass(errorClass).removeClass(validClass);
+ }
+ },
+ unhighlight: function(element, errorClass, validClass) {
+ if (element.type === 'radio') {
+ this.findByName(element.name).removeClass(errorClass).addClass(validClass);
+ } else {
+ $(element).removeClass(errorClass).addClass(validClass);
+ }
+ }
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
+ setDefaults: function(settings) {
+ $.extend( $.validator.defaults, settings );
+ },
+
+ messages: {
+ required: "This field is required.",
+ remote: "Please fix this field.",
+ email: "Please enter a valid email address.",
+ url: "Please enter a valid URL.",
+ date: "Please enter a valid date.",
+ dateISO: "Please enter a valid date (ISO).",
+ number: "Please enter a valid number.",
+ digits: "Please enter only digits.",
+ creditcard: "Please enter a valid credit card number.",
+ equalTo: "Please enter the same value again.",
+ accept: "Please enter a value with a valid extension.",
+ maxlength: $.validator.format("Please enter no more than {0} characters."),
+ minlength: $.validator.format("Please enter at least {0} characters."),
+ rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
+ range: $.validator.format("Please enter a value between {0} and {1}."),
+ max: $.validator.format("Please enter a value less than or equal to {0}."),
+ min: $.validator.format("Please enter a value greater than or equal to {0}.")
+ },
+
+ autoCreateRanges: false,
+
+ prototype: {
+
+ init: function() {
+ this.labelContainer = $(this.settings.errorLabelContainer);
+ this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
+ this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
+ this.submitted = {};
+ this.valueCache = {};
+ this.pendingRequest = 0;
+ this.pending = {};
+ this.invalid = {};
+ this.reset();
+
+ var groups = (this.groups = {});
+ $.each(this.settings.groups, function(key, value) {
+ $.each(value.split(/\s/), function(index, name) {
+ groups[name] = key;
+ });
+ });
+ var rules = this.settings.rules;
+ $.each(rules, function(key, value) {
+ rules[key] = $.validator.normalizeRule(value);
+ });
+
+ function delegate(event) {
+ var validator = $.data(this[0].form, "validator"),
+ eventType = "on" + event.type.replace(/^validate/, "");
+ validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );
+ }
+ $(this.currentForm)
+ .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate)
+ .validateDelegate(":radio, :checkbox, select, option", "click", delegate);
+
+ if (this.settings.invalidHandler)
+ $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Validator/form
+ form: function() {
+ this.checkForm();
+ $.extend(this.submitted, this.errorMap);
+ this.invalid = $.extend({}, this.errorMap);
+ if (!this.valid())
+ $(this.currentForm).triggerHandler("invalid-form", [this]);
+ this.showErrors();
+ return this.valid();
+ },
+
+ checkForm: function() {
+ this.prepareForm();
+ for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
+ this.check( elements[i] );
+ }
+ return this.valid();
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Validator/element
+ element: function( element ) {
+ element = this.clean( element );
+ this.lastElement = element;
+ this.prepareElement( element );
+ this.currentElements = $(element);
+ var result = this.check( element );
+ if ( result ) {
+ delete this.invalid[element.name];
+ } else {
+ this.invalid[element.name] = true;
+ }
+ if ( !this.numberOfInvalids() ) {
+ // Hide error containers on last error
+ this.toHide = this.toHide.add( this.containers );
+ }
+ this.showErrors();
+ return result;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Validator/showErrors
+ showErrors: function(errors) {
+ if(errors) {
+ // add items to error list and map
+ $.extend( this.errorMap, errors );
+ this.errorList = [];
+ for ( var name in errors ) {
+ this.errorList.push({
+ message: errors[name],
+ element: this.findByName(name)[0]
+ });
+ }
+ // remove items from success list
+ this.successList = $.grep( this.successList, function(element) {
+ return !(element.name in errors);
+ });
+ }
+ this.settings.showErrors
+ ? this.settings.showErrors.call( this, this.errorMap, this.errorList )
+ : this.defaultShowErrors();
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Validator/resetForm
+ resetForm: function() {
+ if ( $.fn.resetForm )
+ $( this.currentForm ).resetForm();
+ this.submitted = {};
+ this.prepareForm();
+ this.hideErrors();
+ this.elements().removeClass( this.settings.errorClass );
+ },
+
+ numberOfInvalids: function() {
+ return this.objectLength(this.invalid);
+ },
+
+ objectLength: function( obj ) {
+ var count = 0;
+ for ( var i in obj )
+ count++;
+ return count;
+ },
+
+ hideErrors: function() {
+ this.addWrapper( this.toHide ).hide();
+ },
+
+ valid: function() {
+ return this.size() == 0;
+ },
+
+ size: function() {
+ return this.errorList.length;
+ },
+
+ focusInvalid: function() {
+ if( this.settings.focusInvalid ) {
+ try {
+ $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
+ .filter(":visible")
+ .focus()
+ // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+ .trigger("focusin");
+ } catch(e) {
+ // ignore IE throwing errors when focusing hidden elements
+ }
+ }
+ },
+
+ findLastActive: function() {
+ var lastActive = this.lastActive;
+ return lastActive && $.grep(this.errorList, function(n) {
+ return n.element.name == lastActive.name;
+ }).length == 1 && lastActive;
+ },
+
+ elements: function() {
+ var validator = this,
+ rulesCache = {};
+
+ // select all valid inputs inside the form (no submit or reset buttons)
+ return $(this.currentForm)
+ .find("input, select, textarea")
+ .not(":submit, :reset, :image, [disabled]")
+ .not( this.settings.ignore )
+ .filter(function() {
+ !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
+
+ // select only the first element for each name, and only those with rules specified
+ if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
+ return false;
+
+ rulesCache[this.name] = true;
+ return true;
+ });
+ },
+
+ clean: function( selector ) {
+ return $( selector )[0];
+ },
+
+ errors: function() {
+ return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
+ },
+
+ reset: function() {
+ this.successList = [];
+ this.errorList = [];
+ this.errorMap = {};
+ this.toShow = $([]);
+ this.toHide = $([]);
+ this.currentElements = $([]);
+ },
+
+ prepareForm: function() {
+ this.reset();
+ this.toHide = this.errors().add( this.containers );
+ },
+
+ prepareElement: function( element ) {
+ this.reset();
+ this.toHide = this.errorsFor(element);
+ },
+
+ check: function( element ) {
+ element = this.clean( element );
+
+ // if radio/checkbox, validate first element in group instead
+ if (this.checkable(element)) {
+ element = this.findByName( element.name ).not(this.settings.ignore)[0];
+ }
+
+ var rules = $(element).rules();
+ var dependencyMismatch = false;
+ for (var method in rules ) {
+ var rule = { method: method, parameters: rules[method] };
+ try {
+ var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
+
+ // if a method indicates that the field is optional and therefore valid,
+ // don't mark it as valid when there are no other rules
+ if ( result == "dependency-mismatch" ) {
+ dependencyMismatch = true;
+ continue;
+ }
+ dependencyMismatch = false;
+
+ if ( result == "pending" ) {
+ this.toHide = this.toHide.not( this.errorsFor(element) );
+ return;
+ }
+
+ if( !result ) {
+ this.formatAndAdd( element, rule );
+ return false;
+ }
+ } catch(e) {
+ this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
+ + ", check the '" + rule.method + "' method", e);
+ throw e;
+ }
+ }
+ if (dependencyMismatch)
+ return;
+ if ( this.objectLength(rules) )
+ this.successList.push(element);
+ return true;
+ },
+
+ // return the custom message for the given element and validation method
+ // specified in the element's "messages" metadata
+ customMetaMessage: function(element, method) {
+ if (!$.metadata)
+ return;
+
+ var meta = this.settings.meta
+ ? $(element).metadata()[this.settings.meta]
+ : $(element).metadata();
+
+ return meta && meta.messages && meta.messages[method];
+ },
+
+ // return the custom message for the given element name and validation method
+ customMessage: function( name, method ) {
+ var m = this.settings.messages[name];
+ return m && (m.constructor == String
+ ? m
+ : m[method]);
+ },
+
+ // return the first defined argument, allowing empty strings
+ findDefined: function() {
+ for(var i = 0; i < arguments.length; i++) {
+ if (arguments[i] !== undefined)
+ return arguments[i];
+ }
+ return undefined;
+ },
+
+ defaultMessage: function( element, method) {
+ return this.findDefined(
+ this.customMessage( element.name, method ),
+ this.customMetaMessage( element, method ),
+ // title is never undefined, so handle empty string as undefined
+ !this.settings.ignoreTitle && element.title || undefined,
+ $.validator.messages[method],
+ "<strong>Warning: No message defined for " + element.name + "</strong>"
+ );
+ },
+
+ formatAndAdd: function( element, rule ) {
+ var message = this.defaultMessage( element, rule.method ),
+ theregex = /\$?\{(\d+)\}/g;
+ if ( typeof message == "function" ) {
+ message = message.call(this, rule.parameters, element);
+ } else if (theregex.test(message)) {
+ message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);
+ }
+ this.errorList.push({
+ message: message,
+ element: element
+ });
+
+ this.errorMap[element.name] = message;
+ this.submitted[element.name] = message;
+ },
+
+ addWrapper: function(toToggle) {
+ if ( this.settings.wrapper )
+ toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
+ return toToggle;
+ },
+
+ defaultShowErrors: function() {
+ for ( var i = 0; this.errorList[i]; i++ ) {
+ var error = this.errorList[i];
+ this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
+ this.showLabel( error.element, error.message );
+ }
+ if( this.errorList.length ) {
+ this.toShow = this.toShow.add( this.containers );
+ }
+ if (this.settings.success) {
+ for ( var i = 0; this.successList[i]; i++ ) {
+ this.showLabel( this.successList[i] );
+ }
+ }
+ if (this.settings.unhighlight) {
+ for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
+ this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
+ }
+ }
+ this.toHide = this.toHide.not( this.toShow );
+ this.hideErrors();
+ this.addWrapper( this.toShow ).show();
+ },
+
+ validElements: function() {
+ return this.currentElements.not(this.invalidElements());
+ },
+
+ invalidElements: function() {
+ return $(this.errorList).map(function() {
+ return this.element;
+ });
+ },
+
+ showLabel: function(element, message) {
+ var label = this.errorsFor( element );
+ if ( label.length ) {
+ // refresh error/success class
+ label.removeClass().addClass( this.settings.errorClass );
+
+ // check if we have a generated label, replace the message then
+ label.attr("generated") && label.html(message);
+ } else {
+ // create label
+ label = $("<" + this.settings.errorElement + "/>")
+ .attr({"for": this.idOrName(element), generated: true})
+ .addClass(this.settings.errorClass)
+ .html(message || "");
+ if ( this.settings.wrapper ) {
+ // make sure the element is visible, even in IE
+ // actually showing the wrapped element is handled elsewhere
+ label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
+ }
+ if ( !this.labelContainer.append(label).length )
+ this.settings.errorPlacement
+ ? this.settings.errorPlacement(label, $(element) )
+ : label.insertAfter(element);
+ }
+ if ( !message && this.settings.success ) {
+ label.text("");
+ typeof this.settings.success == "string"
+ ? label.addClass( this.settings.success )
+ : this.settings.success( label );
+ }
+ this.toShow = this.toShow.add(label);
+ },
+
+ errorsFor: function(element) {
+ var name = this.idOrName(element);
+ return this.errors().filter(function() {
+ return $(this).attr('for') == name;
+ });
+ },
+
+ idOrName: function(element) {
+ return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
+ },
+
+ checkable: function( element ) {
+ return /radio|checkbox/i.test(element.type);
+ },
+
+ findByName: function( name ) {
+ // select by name and filter by form for performance over form.find("[name=...]")
+ var form = this.currentForm;
+ return $(document.getElementsByName(name)).map(function(index, element) {
+ return element.form == form && element.name == name && element || null;
+ });
+ },
+
+ getLength: function(value, element) {
+ switch( element.nodeName.toLowerCase() ) {
+ case 'select':
+ return $("option:selected", element).length;
+ case 'input':
+ if( this.checkable( element) )
+ return this.findByName(element.name).filter(':checked').length;
+ }
+ return value.length;
+ },
+
+ depend: function(param, element) {
+ return this.dependTypes[typeof param]
+ ? this.dependTypes[typeof param](param, element)
+ : true;
+ },
+
+ dependTypes: {
+ "boolean": function(param, element) {
+ return param;
+ },
+ "string": function(param, element) {
+ return !!$(param, element.form).length;
+ },
+ "function": function(param, element) {
+ return param(element);
+ }
+ },
+
+ optional: function(element) {
+ return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
+ },
+
+ startRequest: function(element) {
+ if (!this.pending[element.name]) {
+ this.pendingRequest++;
+ this.pending[element.name] = true;
+ }
+ },
+
+ stopRequest: function(element, valid) {
+ this.pendingRequest--;
+ // sometimes synchronization fails, make sure pendingRequest is never < 0
+ if (this.pendingRequest < 0)
+ this.pendingRequest = 0;
+ delete this.pending[element.name];
+ if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
+ $(this.currentForm).submit();
+ this.formSubmitted = false;
+ } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
+ $(this.currentForm).triggerHandler("invalid-form", [this]);
+ this.formSubmitted = false;
+ }
+ },
+
+ previousValue: function(element) {
+ return $.data(element, "previousValue") || $.data(element, "previousValue", {
+ old: null,
+ valid: true,
+ message: this.defaultMessage( element, "remote" )
+ });
+ }
+
+ },
+
+ classRuleSettings: {
+ required: {required: true},
+ email: {email: true},
+ url: {url: true},
+ date: {date: true},
+ dateISO: {dateISO: true},
+ dateDE: {dateDE: true},
+ number: {number: true},
+ numberDE: {numberDE: true},
+ digits: {digits: true},
+ creditcard: {creditcard: true}
+ },
+
+ addClassRules: function(className, rules) {
+ className.constructor == String ?
+ this.classRuleSettings[className] = rules :
+ $.extend(this.classRuleSettings, className);
+ },
+
+ classRules: function(element) {
+ var rules = {};
+ var classes = $(element).attr('class');
+ classes && $.each(classes.split(' '), function() {
+ if (this in $.validator.classRuleSettings) {
+ $.extend(rules, $.validator.classRuleSettings[this]);
+ }
+ });
+ return rules;
+ },
+
+ attributeRules: function(element) {
+ var rules = {};
+ var $element = $(element);
+
+ for (var method in $.validator.methods) {
+ var value = $element.attr(method);
+ if (value) {
+ rules[method] = value;
+ }
+ }
+
+ // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
+ if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
+ delete rules.maxlength;
+ }
+
+ return rules;
+ },
+
+ metadataRules: function(element) {
+ if (!$.metadata) return {};
+
+ var meta = $.data(element.form, 'validator').settings.meta;
+ return meta ?
+ $(element).metadata()[meta] :
+ $(element).metadata();
+ },
+
+ staticRules: function(element) {
+ var rules = {};
+ var validator = $.data(element.form, 'validator');
+ if (validator.settings.rules) {
+ rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
+ }
+ return rules;
+ },
+
+ normalizeRules: function(rules, element) {
+ // handle dependency check
+ $.each(rules, function(prop, val) {
+ // ignore rule when param is explicitly false, eg. required:false
+ if (val === false) {
+ delete rules[prop];
+ return;
+ }
+ if (val.param || val.depends) {
+ var keepRule = true;
+ switch (typeof val.depends) {
+ case "string":
+ keepRule = !!$(val.depends, element.form).length;
+ break;
+ case "function":
+ keepRule = val.depends.call(element, element);
+ break;
+ }
+ if (keepRule) {
+ rules[prop] = val.param !== undefined ? val.param : true;
+ } else {
+ delete rules[prop];
+ }
+ }
+ });
+
+ // evaluate parameters
+ $.each(rules, function(rule, parameter) {
+ rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
+ });
+
+ // clean number parameters
+ $.each(['minlength', 'maxlength', 'min', 'max'], function() {
+ if (rules[this]) {
+ rules[this] = Number(rules[this]);
+ }
+ });
+ $.each(['rangelength', 'range'], function() {
+ if (rules[this]) {
+ rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
+ }
+ });
+
+ if ($.validator.autoCreateRanges) {
+ // auto-create ranges
+ if (rules.min && rules.max) {
+ rules.range = [rules.min, rules.max];
+ delete rules.min;
+ delete rules.max;
+ }
+ if (rules.minlength && rules.maxlength) {
+ rules.rangelength = [rules.minlength, rules.maxlength];
+ delete rules.minlength;
+ delete rules.maxlength;
+ }
+ }
+
+ // To support custom messages in metadata ignore rule methods titled "messages"
+ if (rules.messages) {
+ delete rules.messages;
+ }
+
+ return rules;
+ },
+
+ // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
+ normalizeRule: function(data) {
+ if( typeof data == "string" ) {
+ var transformed = {};
+ $.each(data.split(/\s/), function() {
+ transformed[this] = true;
+ });
+ data = transformed;
+ }
+ return data;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Validator/addMethod
+ addMethod: function(name, method, message) {
+ $.validator.methods[name] = method;
+ $.validator.messages[name] = message != undefined ? message : $.validator.messages[name];
+ if (method.length < 3) {
+ $.validator.addClassRules(name, $.validator.normalizeRule(name));
+ }
+ },
+
+ methods: {
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/required
+ required: function(value, element, param) {
+ // check if dependency is met
+ if ( !this.depend(param, element) )
+ return "dependency-mismatch";
+ switch( element.nodeName.toLowerCase() ) {
+ case 'select':
+ // could be an array for select-multiple or a string, both are fine this way
+ var val = $(element).val();
+ return val && val.length > 0;
+ case 'input':
+ if ( this.checkable(element) )
+ return this.getLength(value, element) > 0;
+ default:
+ return $.trim(value).length > 0;
+ }
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/remote
+ remote: function(value, element, param) {
+ if ( this.optional(element) )
+ return "dependency-mismatch";
+
+ var previous = this.previousValue(element);
+ if (!this.settings.messages[element.name] )
+ this.settings.messages[element.name] = {};
+ previous.originalMessage = this.settings.messages[element.name].remote;
+ this.settings.messages[element.name].remote = previous.message;
+
+ param = typeof param == "string" && {url:param} || param;
+
+ if ( this.pending[element.name] ) {
+ return "pending";
+ }
+ if ( previous.old === value ) {
+ return previous.valid;
+ }
+
+ previous.old = value;
+ var validator = this;
+ this.startRequest(element);
+ var data = {};
+ data[element.name] = value;
+ $.ajax($.extend(true, {
+ url: param,
+ mode: "abort",
+ port: "validate" + element.name,
+ dataType: "json",
+ data: data,
+ success: function(response) {
+ validator.settings.messages[element.name].remote = previous.originalMessage;
+ var valid = response === true;
+ if ( valid ) {
+ var submitted = validator.formSubmitted;
+ validator.prepareElement(element);
+ validator.formSubmitted = submitted;
+ validator.successList.push(element);
+ validator.showErrors();
+ } else {
+ var errors = {};
+ var message = response || validator.defaultMessage( element, "remote" );
+ errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
+ validator.showErrors(errors);
+ }
+ previous.valid = valid;
+ validator.stopRequest(element, valid);
+ }
+ }, param));
+ return "pending";
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/minlength
+ minlength: function(value, element, param) {
+ return this.optional(element) || this.getLength($.trim(value), element) >= param;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/maxlength
+ maxlength: function(value, element, param) {
+ return this.optional(element) || this.getLength($.trim(value), element) <= param;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/rangelength
+ rangelength: function(value, element, param) {
+ var length = this.getLength($.trim(value), element);
+ return this.optional(element) || ( length >= param[0] && length <= param[1] );
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/min
+ min: function( value, element, param ) {
+ return this.optional(element) || value >= param;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/max
+ max: function( value, element, param ) {
+ return this.optional(element) || value <= param;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/range
+ range: function( value, element, param ) {
+ return this.optional(element) || ( value >= param[0] && value <= param[1] );
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/email
+ email: function(value, element) {
+ // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
+ return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/url
+ url: function(value, element) {
+ // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
+ return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/date
+ date: function(value, element) {
+ return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/dateISO
+ dateISO: function(value, element) {
+ return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/number
+ number: function(value, element) {
+ return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/digits
+ digits: function(value, element) {
+ return this.optional(element) || /^\d+$/.test(value);
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/creditcard
+ // based on http://en.wikipedia.org/wiki/Luhn
+ creditcard: function(value, element) {
+ if ( this.optional(element) )
+ return "dependency-mismatch";
+ // accept only digits and dashes
+ if (/[^0-9-]+/.test(value))
+ return false;
+ var nCheck = 0,
+ nDigit = 0,
+ bEven = false;
+
+ value = value.replace(/\D/g, "");
+
+ for (var n = value.length - 1; n >= 0; n--) {
+ var cDigit = value.charAt(n);
+ var nDigit = parseInt(cDigit, 10);
+ if (bEven) {
+ if ((nDigit *= 2) > 9)
+ nDigit -= 9;
+ }
+ nCheck += nDigit;
+ bEven = !bEven;
+ }
+
+ return (nCheck % 10) == 0;
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/accept
+ accept: function(value, element, param) {
+ param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
+ return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
+ },
+
+ // http://docs.jquery.com/Plugins/Validation/Methods/equalTo
+ equalTo: function(value, element, param) {
+ // bind to the blur event of the target in order to revalidate whenever the target field is updated
+ // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
+ var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
+ $(element).valid();
+ });
+ return value == target.val();
+ }
+
+ }
+
+});
+
+// deprecated, use $.validator.format instead
+$.format = $.validator.format;
+
+})(jQuery);
+
+// ajax mode: abort
+// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
+// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
+;(function($) {
+ var pendingRequests = {};
+ // Use a prefilter if available (1.5+)
+ if ( $.ajaxPrefilter ) {
+ $.ajaxPrefilter(function(settings, _, xhr) {
+ var port = settings.port;
+ if (settings.mode == "abort") {
+ if ( pendingRequests[port] ) {
+ pendingRequests[port].abort();
+ }
+ pendingRequests[port] = xhr;
+ }
+ });
+ } else {
+ // Proxy ajax
+ var ajax = $.ajax;
+ $.ajax = function(settings) {
+ var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
+ port = ( "port" in settings ? settings : $.ajaxSettings ).port;
+ if (mode == "abort") {
+ if ( pendingRequests[port] ) {
+ pendingRequests[port].abort();
+ }
+ return (pendingRequests[port] = ajax.apply(this, arguments));
+ }
+ return ajax.apply(this, arguments);
+ };
+ }
+})(jQuery);
+
+// provides cross-browser focusin and focusout events
+// IE has native support, in other browsers, use event caputuring (neither bubbles)
+
+// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
+// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
+;(function($) {
+ // only implement if not provided by jQuery core (since 1.4)
+ // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs
+ if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {
+ $.each({
+ focus: 'focusin',
+ blur: 'focusout'
+ }, function( original, fix ){
+ $.event.special[fix] = {
+ setup:function() {
+ this.addEventListener( original, handler, true );
+ },
+ teardown:function() {
+ this.removeEventListener( original, handler, true );
+ },
+ handler: function(e) {
+ arguments[0] = $.event.fix(e);
+ arguments[0].type = fix;
+ return $.event.handle.apply(this, arguments);
+ }
+ };
+ function handler(e) {
+ e = $.event.fix(e);
+ e.type = fix;
+ return $.event.handle.call(this, e);
+ }
+ });
+ };
+ $.extend($.fn, {
+ validateDelegate: function(delegate, type, handler) {
+ return this.bind(type, function(event) {
+ var target = $(event.target);
+ if (target.is(delegate)) {
+ return handler.apply(target, arguments);
+ }
+ });
+ }
+ });
+})(jQuery);
diff --git a/resources/jquery/jquery.xmldom.js b/resources/jquery/jquery.xmldom.js
new file mode 100644
index 00000000..85d0083d
--- /dev/null
+++ b/resources/jquery/jquery.xmldom.js
@@ -0,0 +1,46 @@
+/*!
+ * jQuery xmlDOM Plugin v1.0
+ * http://outwestmedia.com/jquery-plugins/xmldom/
+ *
+ * Released: 2009-04-06
+ * Version: 1.0
+ *
+ * Copyright (c) 2009 Jonathan Sharp, Out West Media LLC.
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ */
+(function($) {
+ // IE DOMParser wrapper
+ if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
+ DOMParser = function() { };
+ DOMParser.prototype.parseFromString = function( xmlString ) {
+ var doc = new ActiveXObject('Microsoft.XMLDOM');
+ doc.async = 'false';
+ doc.loadXML( xmlString );
+ return doc;
+ };
+ }
+
+ $.xmlDOM = function(xml, onErrorFn) {
+ try {
+ var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
+ if ( $.isXMLDoc( xmlDoc ) ) {
+ var err = $('parsererror', xmlDoc);
+ if ( err.length == 1 ) {
+ throw('Error: ' + $(xmlDoc).text() );
+ }
+ } else {
+ throw('Unable to parse XML');
+ }
+ } catch( e ) {
+ var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
+ if ( $.isFunction( onErrorFn ) ) {
+ onErrorFn( msg );
+ } else {
+ $(document).trigger('xmlParseError', [ msg ]);
+ }
+ return $([]);
+ }
+ return $( xmlDoc );
+ };
+})(jQuery); \ No newline at end of file
diff --git a/resources/mediawiki.action/mediawiki.action.edit.js b/resources/mediawiki.action/mediawiki.action.edit.js
index b121d34f..e685ca94 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.js
@@ -1,101 +1,134 @@
-(function( $ ) {
- // currentFocus is used to determine where to insert tags
- var currentFocused = $( '#wpTextbox1' );
-
- mw.toolbar = {
- $toolbar : $( '#toolbar' ),
- buttons : [],
- // If you want to add buttons, use
- // mw.toolbar.addButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId, selectText );
- addButton : function() {
- this.buttons.push( [].slice.call( arguments ) );
+( function ( $, mw ) {
+ var isReady, toolbar, currentFocused;
+
+ isReady = false;
+
+ toolbar = {
+ $toolbar: false,
+ buttons: [],
+ /**
+ * If you want to add buttons, use
+ * mw.toolbar.addButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId, selectText );
+ */
+ addButton: function () {
+ if ( isReady ) {
+ toolbar.insertButton.apply( toolbar, arguments );
+ } else {
+ toolbar.buttons.push( [].slice.call( arguments ) );
+ }
},
- insertButton : function( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
+ insertButton: function ( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
var image = $('<img>', {
- width : 23,
- height : 22,
- src : imageFile,
- alt : speedTip,
- title : speedTip,
- id : imageId || '',
+ width : 23,
+ height: 22,
+ src : imageFile,
+ alt : speedTip,
+ title : speedTip,
+ id : imageId || '',
'class': 'mw-toolbar-editbutton'
- } ).click( function() {
+ } ).click( function () {
mw.toolbar.insertTags( tagOpen, tagClose, sampleText, selectText );
return false;
} );
- this.$toolbar.append( image );
+ toolbar.$toolbar.append( image );
return true;
},
- // apply tagOpen/tagClose to selection in textarea,
- // use sampleText instead of selection if there is none
- insertTags : function( tagOpen, tagClose, sampleText, selectText) {
- if ( currentFocused.length ) {
+ /**
+ * apply tagOpen/tagClose to selection in textarea,
+ * use sampleText instead of selection if there is none.
+ */
+ insertTags: function ( tagOpen, tagClose, sampleText, selectText ) {
+ if ( currentFocused && currentFocused.length ) {
currentFocused.textSelection(
- 'encapsulateSelection', { 'pre': tagOpen, 'peri': sampleText, 'post': tagClose }
+ 'encapsulateSelection', {
+ 'pre': tagOpen,
+ 'peri': sampleText,
+ 'post': tagClose
+ }
);
}
- },
- init : function() {
- // Legacy
- // Merge buttons from mwCustomEditButtons
- var buttons = [].concat( this.buttons, window.mwCustomEditButtons );
- for ( var i = 0; i < buttons.length; i++ ) {
- if ( $.isArray( buttons[i] ) ) {
- // Passes our button array as arguments
- mw.toolbar.insertButton.apply( this, buttons[i] );
- } else {
- // Legacy mwCustomEditButtons is an object
- var c = buttons[i];
- mw.toolbar.insertButton( c.imageFile, c.speedTip, c.tagOpen, c.tagClose, c.sampleText, c.imageId, c.selectText );
- }
+ },
+
+ // For backwards compatibility
+ init: function () {}
+ };
+
+ // Legacy (for compatibility with the code previously in skins/common.edit.js)
+ window.addButton = toolbar.addButton;
+ window.insertTags = toolbar.insertTags;
+
+ // Explose publicly
+ mw.toolbar = toolbar;
+
+ $( document ).ready( function () {
+ var buttons, i, c, iframe;
+
+ // currentFocus is used to determine where to insert tags
+ currentFocused = $( '#wpTextbox1' );
+
+ // Populate the selector cache for $toolbar
+ toolbar.$toolbar = $( '#toolbar' );
+
+ // Legacy: Merge buttons from mwCustomEditButtons
+ buttons = [].concat( toolbar.buttons, window.mwCustomEditButtons );
+ for ( i = 0; i < buttons.length; i++ ) {
+ if ( $.isArray( buttons[i] ) ) {
+ // Passes our button array as arguments
+ toolbar.insertButton.apply( toolbar, buttons[i] );
+ } else {
+ // Legacy mwCustomEditButtons is an object
+ c = buttons[i];
+ toolbar.insertButton( c.imageFile, c.speedTip, c.tagOpen,
+ c.tagClose, c.sampleText, c.imageId, c.selectText );
}
- return true;
}
- };
- //Legacy
- window.addButton = mw.toolbar.addButton;
- window.insertTags = mw.toolbar.insertTags;
+ // This causes further calls to addButton to go to insertion directly
+ // instead of to the toolbar.buttons queue.
+ // It is important that this is after the one and only loop through
+ // the the toolbar.buttons queue
+ isReady = true;
+
+ // Make sure edit summary does not exceed byte limit
+ $( '#wpSummary' ).byteLimit( 250 );
- //make sure edit summary does not exceed byte limit
- $( '#wpSummary' ).byteLimit( 250 );
-
- $( document ).ready( function() {
/**
* Restore the edit box scroll state following a preview operation,
* and set up a form submission handler to remember this state
*/
- var scrollEditBox = function() {
- var editBox = document.getElementById( 'wpTextbox1' );
- var scrollTop = document.getElementById( 'wpScrolltop' );
- var $editForm = $( '#editform' );
- if( $editForm.length && editBox && scrollTop ) {
- if( scrollTop.value ) {
+ ( 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() {
+ $editForm.submit( function () {
scrollTop.value = editBox.scrollTop;
});
}
- };
- scrollEditBox();
-
- // Create button bar
- mw.toolbar.init();
-
- $( 'textarea, input:text' ).focus( function() {
+ }() );
+
+ $( 'textarea, input:text' ).focus( function () {
currentFocused = $(this);
});
// HACK: make currentFocused work with the usability iframe
// With proper focus detection support (HTML 5!) this'll be much cleaner
- var iframe = $( '.wikiEditor-ui-text iframe' );
+ iframe = $( '.wikiEditor-ui-text iframe' );
if ( iframe.length > 0 ) {
$( iframe.get( 0 ).contentWindow.document )
- .add( iframe.get( 0 ).contentWindow.document.body ) // for IE
- .focus( function() { currentFocused = iframe; } );
+ // for IE
+ .add( iframe.get( 0 ).contentWindow.document.body )
+ .focus( function () {
+ currentFocused = iframe;
+ } );
}
});
-})(jQuery);
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/mediawiki.action/mediawiki.action.history.js b/resources/mediawiki.action/mediawiki.action.history.js
index 1b5b3a00..76b0e6cd 100644
--- a/resources/mediawiki.action/mediawiki.action.history.js
+++ b/resources/mediawiki.action/mediawiki.action.history.js
@@ -1,53 +1,126 @@
-/*
+/**
* JavaScript for History action
*/
-jQuery( function( $ ) {
- var $lis = $( 'ul#pagehistory li' );
- var updateDiffRadios = function() {
+jQuery( document ).ready( function ( $ ) {
+ var $historyCompareForm = $( '#mw-history-compare' ),
+ $historySubmitter,
+ $lis = $( '#pagehistory > li' );
+
+ /**
+ * @context {Element} input
+ * @param e {jQuery.Event}
+ */
+ function updateDiffRadios() {
var diffLi = false, // the li where the diff radio is checked
oldLi = false; // the li where the oldid radio is checked
if ( !$lis.length ) {
return true;
}
- $lis.removeClass( 'selected' );
- $lis.each( function() {
- var $this = $(this);
- var $inputs = $this.find( 'input[type="radio"]' );
- if ( $inputs.length !== 2 ) {
+
+ $lis
+ .removeClass( 'selected' )
+ .each( function () {
+ var $li = $(this),
+ $inputs = $li.find( 'input[type="radio"]' ),
+ $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq(0),
+ $diffRadio = $inputs.filter( '[name="diff"]' ).eq(0);
+
+ if ( !$oldidRadio.length || !$diffRadio.length ) {
return true;
}
- // this row has a checked radio button
- if ( $inputs.get(0).checked ) {
+ if ( $oldidRadio.prop( 'checked' ) ) {
oldLi = true;
- $this.addClass( 'selected' );
- $inputs.eq(0).css( 'visibility', 'visible' );
- $inputs.eq(1).css( 'visibility', 'hidden' );
- } else if ( $inputs.get(1).checked ) {
+ $li.addClass( 'selected' );
+ $oldidRadio.css( 'visibility', 'visible' );
+ $diffRadio.css( 'visibility', 'hidden' );
+
+ } else if ( $diffRadio.prop( 'checked' ) ) {
diffLi = true;
- $this.addClass( 'selected' );
- $inputs.eq(0).css( 'visibility', 'hidden' );
- $inputs.eq(1).css( 'visibility', 'visible' );
+ $li.addClass( 'selected' );
+ $oldidRadio.css( 'visibility', 'hidden' );
+ $diffRadio.css( 'visibility', 'visible' );
+
+ // This list item has neither checked
} else {
- // no radio is checked in this row
+ // We're below the selected radios
if ( diffLi && oldLi ) {
- // We're below the selected radios
- $inputs.eq(0).css( 'visibility', 'visible' );
- $inputs.eq(1).css( 'visibility', 'hidden' );
- } else if ( diffLi ) {
- // We're between the selected radios
- $inputs.css( 'visibility', 'visible' );
+ $oldidRadio.css( 'visibility', 'visible' );
+ $diffRadio.css( 'visibility', 'hidden' );
+
+ // We're between the selected radios
+ } else if ( diffLi ) {
+ $diffRadio.css( 'visibility', 'visible' );
+ $oldidRadio.css( 'visibility', 'visible' );
+
+ // We're above the selected radios
} else {
- // We're above the selected radios
- $inputs.eq(1).css( 'visibility', 'visible' );
- $inputs.eq(0).css( 'visibility', 'hidden' );
+ $diffRadio.css( 'visibility', 'visible' );
+ $oldidRadio.css( 'visibility', 'hidden' );
}
}
});
+
return true;
- };
+ }
+
+ $lis.find( 'input[name="diff"], input[name="oldid"]' ).click( updateDiffRadios );
- $( '#pagehistory li input[name="diff"], #pagehistory li input[name="oldid"]' ).click( updateDiffRadios );
+ // Set initial state
updateDiffRadios();
-}); \ No newline at end of file
+
+
+ // Prettify url output for HistoryAction submissions,
+ // to cover up action=historysubmit construction.
+
+ // Ideally we'd use e.target instead of $historySubmitter, but e.target points
+ // to the form element for submit actions, so.
+ $historyCompareForm.find( '.historysubmit' ).click( function () {
+ $historySubmitter = $(this);
+ } );
+
+ // On submit we clone the form element, remove unneeded fields in the clone
+ // that pollute the query parameter with stuff from the other "use case",
+ // and then submit the clone.
+ // Without the cloning we'd be changing the real form, which is slower, could make
+ // the page look broken for a second in slow browsers and might show the form broken
+ // again when coming back from a "next" page.
+ $historyCompareForm.submit( function ( e ) {
+ var $copyForm, $copyRadios, $copyAction;
+
+ if ( $historySubmitter ) {
+ $copyForm = $historyCompareForm.clone();
+ $copyRadios = $copyForm.find( '#pagehistory > li' ).find( 'input[name="diff"], input[name="oldid"]' );
+ $copyAction = $copyForm.find( '> [name="action"]');
+
+ // Remove action=historysubmit and ids[..]=..
+ if ( $historySubmitter.hasClass( 'mw-history-compareselectedversions-button' ) ) {
+ $copyAction.remove();
+ $copyForm.find( 'input[name^="ids["]:checked' ).prop( 'checked', false );
+
+ // Remove diff=&oldid=, change action=historysubmit to revisiondelete, remove revisiondelete
+ } else if ( $historySubmitter.hasClass( 'mw-history-revisiondelete-button' ) ) {
+ $copyRadios.remove();
+ $copyAction.val( $historySubmitter.attr( 'name' ) );
+ $copyForm.find( ':submit' ).remove();
+ }
+
+ // IE7 doesn't do submission from an off-DOM clone, so insert hidden into document first
+ // Also remove potentially conflicting id attributes that we don't need anyway
+ $copyForm
+ .css( 'display', 'none' )
+ .find('[id]')
+ .removeAttr('id')
+ .end()
+ .insertAfter( $historyCompareForm )
+ .submit();
+
+ e.preventDefault();
+ return false; // Because the submit is special, return false as well.
+ }
+
+ // Continue natural browser handling other wise
+ return true;
+ } );
+} );
diff --git a/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
new file mode 100644
index 00000000..b1d906f6
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
@@ -0,0 +1,12 @@
+/**
+ * This module enables double-click-to-edit functionality
+ */
+jQuery( document ).ready( function( $ ) {
+ var url = $( '#ca-edit a' ).attr( 'href' );
+ if ( url ) {
+ mw.util.$content.dblclick( function( e ) {
+ e.preventDefault();
+ window.location = url;
+ } );
+ }
+} );
diff --git a/resources/mediawiki.action/mediawiki.action.view.metadata.js b/resources/mediawiki.action/mediawiki.action.view.metadata.js
index 378dd155..b791cabd 100644
--- a/resources/mediawiki.action/mediawiki.action.view.metadata.js
+++ b/resources/mediawiki.action/mediawiki.action.view.metadata.js
@@ -14,7 +14,7 @@ jQuery( document ).ready( function( $ ) {
return;
}
- var $row = $( '<tr></tr>' );
+ var $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
var $col = $( '<td colspan="2"></td>' );
var $link = $( '<a></a>', {
diff --git a/resources/mediawiki.action/mediawiki.action.watch.ajax.js b/resources/mediawiki.action/mediawiki.action.watch.ajax.js
index 93aa29c9..f5f09f52 100644
--- a/resources/mediawiki.action/mediawiki.action.watch.ajax.js
+++ b/resources/mediawiki.action/mediawiki.action.watch.ajax.js
@@ -1,174 +1,155 @@
/**
* Animate watch/unwatch links to use asynchronous API requests to
- * watch pages, rather than clicking on links. Requires jQuery.
+ * watch pages, rather than navigating to a different URI.
*/
-( function( $ ) {
-var $links;
-
-var setLinkText = function( $link, action ) {
- if ( action == 'watch' || action == 'unwatch' ) {
- // save the accesskey from the title
- var keyCommand = $link.attr( 'title' ).match( /\[.*?\]$/ ) ? $link.attr( 'title' ).match( /\[.*?\]$/ )[0] : '';
- $link.attr( 'title', mw.msg( 'tooltip-ca-' + action ) + ' ' + keyCommand );
- }
- if ( $link.data( 'icon' ) ) {
- $link.attr( 'alt', mw.msg( action ) );
- if ( action == 'watching' || action == 'unwatching' ) {
+( function ( $, mw, undefined ) {
+
+/**
+ * The name of the page to watch or unwatch.
+ */
+var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
+
+/**
+ * Update the link text, link href attribute and (if applicable)
+ * "loading" class.
+ *
+ * @param $link {jQuery} Anchor tag of (un)watch link
+ * @param action {String} One of 'watch', 'unwatch'.
+ * @param state {String} [optional] 'idle' or 'loading'. Default is 'idle'.
+ */
+function updateWatchLink( $link, action, state ) {
+ // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
+ var msgKey = state === 'loading' ? action + 'ing' : action,
+ accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp ),
+ $li = $link.closest( 'li' );
+
+ $link
+ .text( mw.msg( msgKey ) )
+ .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
+ ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
+ )
+ .attr( 'href', mw.util.wikiScript() + '?' + $.param({
+ title: title,
+ action: action
+ })
+ );
+
+ // Special case for vector icon
+ if ( $li.hasClass( 'icon' ) ) {
+ if ( state === 'loading' ) {
$link.addClass( 'loading' );
} else {
$link.removeClass( 'loading' );
}
- } else {
- $link.html( mw.msg( action ) );
}
-};
-
-var errorHandler = function( $link ) {
-
- // Reset link text to whatever it was before we switching it to the '(un)watch'+ing message.
- setLinkText( $link, $link.data( 'action' ) );
-
- // Format error message
- var cleanTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
- var link = mw.html.element(
- 'a', {
- 'href': mw.util.wikiGetlink( mw.config.get( 'wgPageName' ) ),
- 'title': cleanTitle
- }, cleanTitle
- );
- var msg = mw.msg( 'watcherrortext', link );
-
- // Report to user about the error
- mw.util.jsMessage( msg, 'watch' );
-};
+}
/**
- * Process the result of the API watch action.
- *
- * @param response Data object from API request.
- * @param $link jQuery object of the watch link.
- * @return Boolean true on success, false otherwise.
+ * @todo This should be moved somewhere more accessible.
+ * @param url {String}
+ * @return {String} The extracted action, defaults to 'view'.
*/
-var processResult = function( response, $link ) {
-
- if ( ( 'error' in response ) || !response.watch ) {
- errorHandler( $link );
- return false;
+function mwUriGetAction( url ) {
+ var actionPaths = mw.config.get( 'wgActionPaths' ),
+ key, parts, m, action;
+
+ // @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 ) {
+ return action;
}
- var watchResponse = response.watch;
-
- // To ensure we set the same status for all watch links with the
- // same target we trigger a custom event on *all* watch links.
- if ( watchResponse.watched !== undefined ) {
- $links.trigger( 'mw-ajaxwatch', [watchResponse.title, 'watch', $link] );
- } else if ( watchResponse.unwatched !== undefined ) {
- $links.trigger( 'mw-ajaxwatch', [watchResponse.title, 'unwatch', $link] );
- } else {
- // Either we got an error code or it just plain broke.
- window.location.href = $link[0].href;
- return false;
+ for ( key in actionPaths ) {
+ if ( actionPaths.hasOwnProperty( key ) ) {
+ parts = actionPaths[key].split( '$1' );
+ for ( i = 0; i < parts.length; i += 1 ) {
+ parts[i] = $.escapeRE( parts[i] );
+ }
+ m = new RegExp( parts.join( '(.+)' ) ).exec( url );
+ if ( m && m[1] ) {
+ return key;
+ }
+
+ }
}
- mw.util.jsMessage( watchResponse.message, 'watch' );
-
- // Bug 12395 - update the watch checkbox on edit pages when the
- // page is watched or unwatched via the tab.
- if ( watchResponse.watched !== undefined ) {
- $( '#wpWatchthis' ).attr( 'checked', 'checked' );
- } else {
- $( '#wpWatchthis' ).removeAttr( 'checked' );
- }
- return true;
-};
+ return 'view';
+}
$( document ).ready( function() {
- $links = $( '.mw-watchlink a, a.mw-watchlink' );
- // BC with older skins
- $links = $links
- .add( '#ca-watch a, #ca-unwatch a, a#mw-unwatch-link1, ' +
- 'a#mw-unwatch-link2, a#mw-watch-link2, a#mw-watch-link1' );
- // allowing people to add inline animated links is a little scary
- $links = $links.filter( ':not( #bodyContent *, #content * )' );
+ 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' );
- $links.each( function() {
- var $link = $( this );
- var link = this;
- $link
- .data( 'icon', $link.closest( 'li' ).hasClass( 'icon' ) )
- .data( 'action', mw.util.getParamValue( 'action', link.href ) == 'unwatch' ? 'unwatch' : 'watch' );
- var title = mw.util.getParamValue( 'title', link.href );
- $link.data( 'target', title.replace( /_/g, ' ' ) );
- });
+ // Allowing people to add inline animated links is a little scary
+ $links = $links.filter( ':not( #bodyContent *, #content * )' );
- $links.click( function( event ) {
- var $link = $( this );
+ $links.click( function( e ) {
+ var $link, api,
+ action = mwUriGetAction( this.href );
- if ( !mw.config.get( 'wgEnableWriteAPI' ) ) {
- // Lazy initialization so we don't toss up
- // ActiveX warnings on initial page load
- // for IE 6 users with security settings.
- $links.unbind( 'click' );
+ if ( action !== 'watch' && action !== 'unwatch' ) {
+ // Could not extract target action from link url,
+ // let native browsing handle it further
return true;
}
-
- setLinkText( $link, $link.data( 'action' ) + 'ing' );
-
- var reqData = {
- 'action': 'watch',
- 'format': 'json',
- 'title': $link.data( 'target' ),
- 'token': mw.user.tokens.get( 'watchToken' ),
- // API return contains a localized data.watch.message string.
- 'uselang': mw.config.get( 'wgUserLanguage' )
- };
-
- if ( $link.data( 'action' ) == 'unwatch' ) {
- reqData.unwatch = '';
- }
-
- $.ajax({
- url: mw.util.wikiScript( 'api' ),
- dataType: 'json',
- type: 'POST',
- data: reqData,
- success: function( data, textStatus, xhr ) {
- processResult( data, $link );
+ e.preventDefault();
+ e.stopPropagation();
+
+ $link = $( this );
+
+ updateWatchLink( $link, action, 'loading' );
+
+ api = new mw.Api();
+ api[action](
+ title,
+ // Success
+ function( watchResponse ) {
+ var otherAction = action === 'watch' ? 'unwatch' : 'watch',
+ $li = $link.closest( 'li' );
+
+ mw.util.jsMessage( watchResponse.message, 'ajaxwatch' );
+
+ // Set link to opposite
+ updateWatchLink( $link, otherAction );
+
+ // Most common ID style
+ if ( $li.prop( 'id' ) === 'ca-' + otherAction || $li.prop( 'id' ) === 'ca-' + action ) {
+ $li.prop( 'id', 'ca-' + otherAction );
+ }
+
+ // Bug 12395 - update the watch checkbox on edit pages when the
+ // page is watched or unwatched via the tab.
+ if ( watchResponse.watched !== undefined ) {
+ $( '#wpWatchthis' ).prop( 'checked', true );
+ } else {
+ $( '#wpWatchthis' ).removeProp( 'checked' );
+ }
},
- error: function(){
- processResult( {}, $link );
- }
- });
+ // Error
+ function(){
+
+ // Reset link to non-loading mode
+ updateWatchLink( $link, action );
+
+ // Format error message
+ var cleanTitle = title.replace( /_/g, ' ' );
+ var link = mw.html.element(
+ 'a', {
+ 'href': mw.util.wikiGetlink( title ),
+ 'title': cleanTitle
+ }, cleanTitle
+ );
+ var html = mw.msg( 'watcherrortext', link );
+
+ // Report to user about the error
+ mw.util.jsMessage( html, 'ajaxwatch' );
- return false;
- });
-
- // When a request returns, a custom event 'mw-ajaxwatch' is triggered
- // on *all* watch links, so they can be updated if necessary
- $links.bind( 'mw-ajaxwatch', function( event, target, action, $link ) {
- var foo = $link.data( 'target' );
- if ( $link.data( 'target' ) == target ) {
- var otheraction = action == 'watch'
- ? 'unwatch'
- : 'watch';
-
- $link.data( 'action', otheraction );
- setLinkText( $link, otheraction );
- $link.attr( 'href',
- mw.config.get( 'wgScript' )
- + '?title=' + mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) )
- + '&action=' + otheraction
- );
- if ( $link.closest( 'li' ).attr( 'id' ) == 'ca-' + action ) {
- $link.closest( 'li' ).attr( 'id', 'ca-' + otheraction );
- // update the link text with the new message
- $link.text( mw.msg( otheraction ) );
}
- }
-
- return false;
+ );
});
});
-})( jQuery );
+})( jQuery, mediaWiki );
diff --git a/resources/mediawiki.api/mediawiki.api.category.js b/resources/mediawiki.api/mediawiki.api.category.js
new file mode 100644
index 00000000..c8c18e69
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.category.js
@@ -0,0 +1,105 @@
+/**
+ * Additional mw.Api methods to assist with API calls related to categories.
+ */
+
+( function( $, mw, undefined ) {
+
+ $.extend( mw.Api.prototype, {
+ /**
+ * Determine if a category exists.
+ * @param title {mw.Title}
+ * @param success {Function} callback to pass boolean of category's existence
+ * @param err {Function} optional callback to run if api error
+ * @return ajax call object
+ */
+ isCategory: function( title, success, err ) {
+ var params = {
+ prop: 'categoryinfo',
+ titles: title.toString()
+ },
+ ok = function( data ) {
+ var exists = false;
+ if ( data.query && data.query.pages ) {
+ $.each( data.query.pages, function( id, page ) {
+ if ( page.categoryinfo ) {
+ exists = true;
+ }
+ } );
+ }
+ success( exists );
+ };
+
+ return this.get( params, { ok: ok, err: err } );
+ },
+
+ /**
+ * Get a list of categories that match a certain prefix.
+ * e.g. given "Foo", return "Food", "Foolish people", "Foosball tables" ...
+ * @param prefix {String} prefix to match
+ * @param success {Function} callback to pass matched categories to
+ * @param err {Function} optional callback to run if api error
+ * @return {jqXHR}
+ */
+ getCategoriesByPrefix: function( prefix, success, err ) {
+
+ // fetch with allpages to only get categories that have a corresponding description page.
+ var params = {
+ 'list': 'allpages',
+ 'apprefix': prefix,
+ 'apnamespace': mw.config.get('wgNamespaceIds').category
+ };
+
+ var ok = function( data ) {
+ var texts = [];
+ if ( data.query && data.query.allpages ) {
+ $.each( data.query.allpages, function( i, category ) {
+ texts.push( new mw.Title( category.title ).getNameText() );
+ } );
+ }
+ success( texts );
+ };
+
+ return this.get( params, { ok: ok, err: err } );
+ },
+
+
+ /**
+ * Get the categories that a particular page on the wiki belongs to
+ * @param title {mw.Title}
+ * @param success {Function} callback to pass categories to (or false, if title not found)
+ * @param err {Function} optional callback to run if api error
+ * @param async {Boolean} optional asynchronousness (default = true = async)
+ * @return {jqXHR}
+ */
+ getCategories: function( title, success, err, async ) {
+ var params, ok;
+ params = {
+ prop: 'categories',
+ titles: title.toString()
+ };
+ if ( async === undefined ) {
+ async = true;
+ }
+ ok = function( data ) {
+ var ret = false;
+ if ( data.query && data.query.pages ) {
+ $.each( data.query.pages, function( id, page ) {
+ if ( page.categories ) {
+ if ( typeof ret !== 'object' ) {
+ ret = [];
+ }
+ $.each( page.categories, function( i, cat ) {
+ ret.push( new mw.Title( cat.title ) );
+ } );
+ }
+ } );
+ }
+ success( ret );
+ };
+
+ return this.get( params, { ok: ok, err: err, async: async } );
+ }
+
+ } );
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.api/mediawiki.api.edit.js b/resources/mediawiki.api/mediawiki.api.edit.js
new file mode 100644
index 00000000..a9d488a8
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.edit.js
@@ -0,0 +1,119 @@
+/**
+ * Additional mw.Api methods to assist with API calls related to editing wiki pages.
+ */
+
+( function( $, mw, undefined ) {
+
+ // Cache token so we don't have to keep fetching new ones for every single request.
+ var cachedToken = null;
+
+ $.extend( mw.Api.prototype, {
+
+ /**
+ * Post to API with edit 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.
+ *
+ * @param params {Object} API parameters
+ * @param ok {Function} callback for success
+ * @param err {Function} [optional] error callback
+ * @return {jqXHR}
+ */
+ postWithEditToken: function( params, ok, err ) {
+ var api = this, useTokenToPost, getTokenIfBad;
+ 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' ) {
+ cachedToken = null; // force a new token
+ api.postWithEditToken( params, ok, err );
+ } else {
+ err( code, result );
+ }
+ };
+ return api.post( params, { ok : ok, err : getTokenIfBad });
+ }
+ },
+
+ /**
+ * Api helper to grab an edit token
+ *
+ * token callback has signature ( String token )
+ * error callback has signature ( String code, Object results, XmlHttpRequest xhr, Exception exception )
+ * Note that xhr and exception are only available for 'http_*' errors
+ * code may be any http_* error code (see mw.Api), or 'token_missing'
+ *
+ * @param tokenCallback {Function} received token callback
+ * @param err {Function} error callback
+ * @return {jqXHR}
+ */
+ getEditToken: function( tokenCallback, err ) {
+ var parameters = {
+ prop: 'info',
+ intoken: 'edit',
+ // we need some kind of dummy page to get a token from. This will return a response
+ // complaining that the page is missing, but we should also get an edit token
+ titles: 'DummyPageForEditToken'
+ },
+ ok = function( data ) {
+ var token;
+ $.each( data.query.pages, function( i, page ) {
+ if ( page.edittoken ) {
+ token = page.edittoken;
+ return false;
+ }
+ } );
+ if ( token !== undefined ) {
+ cachedToken = token;
+ tokenCallback( token );
+ } else {
+ err( 'token-missing', data );
+ }
+ },
+ ajaxOptions = {
+ ok: ok,
+ err: err,
+ // 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.
+ jsonp: false
+ };
+
+ return this.get( parameters, ajaxOptions );
+ },
+
+ /**
+ * Create a new section of the page.
+ * @param title {mw.Title|String} target page
+ * @param header {String}
+ * @param message {String} wikitext message
+ * @param ok {Function} success handler
+ * @param err {Function} error handler
+ * @return {jqXHR}
+ */
+ newSection: function( title, header, message, ok, err ) {
+ var params = {
+ action: 'edit',
+ section: 'new',
+ format: 'json',
+ title: title.toString(),
+ summary: header,
+ text: message
+ };
+ return this.postWithEditToken( params, ok, err );
+ }
+
+ } );
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.api/mediawiki.api.js b/resources/mediawiki.api/mediawiki.api.js
new file mode 100644
index 00000000..225093b3
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.js
@@ -0,0 +1,224 @@
+/* mw.Api objects represent the API of a particular MediaWiki server. */
+
+( function( $, mw, undefined ) {
+
+ /**
+ * @var defaultOptions {Object}
+ * We allow people to omit these default parameters from API requests
+ * there is very customizable error handling here, on a per-call basis
+ * wondering, would it be simpler to make it easy to clone the api object,
+ * change error handling, and use that instead?
+ */
+ var defaultOptions = {
+
+ // Query parameters for API requests
+ parameters: {
+ action: 'query',
+ format: 'json'
+ },
+
+ // Ajax options for jQuery.ajax()
+ ajax: {
+ url: mw.util.wikiScript( 'api' ),
+
+ ok: function() {},
+
+ // caller can supply handlers for http transport error or api errors
+ err: function( code, result ) {
+ mw.log( 'mw.Api error: ' + code, 'debug' );
+ },
+
+ timeout: 30000, // 30 seconds
+
+ dataType: 'json'
+ }
+ };
+
+ /**
+ * Constructor to create an object to interact with the API of a particular MediaWiki server.
+ *
+ * @todo Share API objects with exact same config.
+ * @example
+ * <code>
+ * var api = new mw.Api();
+ * api.get( {
+ * action: 'query',
+ * meta: 'userinfo'
+ * }, {
+ * ok: function () { console.log( arguments ); }
+ * } );
+ * </code>
+ *
+ * @constructor
+ * @param options {Object} See defaultOptions documentation above. Ajax options can also be
+ * overridden for each individual request to jQuery.ajax() later on.
+ */
+ mw.Api = function( options ) {
+
+ if ( options === undefined ) {
+ options = {};
+ }
+
+ // Force toString if we got a mw.Uri object
+ if ( options.ajax && options.ajax.url !== undefined ) {
+ options.ajax.url = String( options.ajax.url );
+ }
+
+ options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
+ options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
+
+ this.defaults = options;
+ };
+
+ mw.Api.prototype = {
+
+ /**
+ * For api queries, in simple cases the caller just passes a success callback.
+ * In complex cases they pass an object with a success property as callback and
+ * probably other options.
+ * Normalize the argument so that it's always the latter case.
+ *
+ * @param {Object|Function} An object contaning one or more of options.ajax,
+ * or just a success function (options.ajax.ok).
+ * @return {Object} Normalized ajax options.
+ */
+ normalizeAjaxOptions: function( arg ) {
+ var opt = arg;
+ if ( typeof arg === 'function' ) {
+ opt = { 'ok': arg };
+ }
+ if ( !opt.ok ) {
+ throw new Error( 'ajax options must include ok callback' );
+ }
+ return opt;
+ },
+
+ /**
+ * Perform API get request
+ *
+ * @param {Object} request parameters
+ * @param {Object|Function} ajax options, or just a success function
+ * @return {jqXHR}
+ */
+ get: function( parameters, ajaxOptions ) {
+ ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
+ ajaxOptions.type = 'GET';
+ return this.ajax( parameters, ajaxOptions );
+ },
+
+ /**
+ * Perform API post request
+ * @todo Post actions for nonlocal will need proxy
+ *
+ * @param {Object} request parameters
+ * @param {Object|Function} ajax options, or just a success function
+ * @return {jqXHR}
+ */
+ post: function( parameters, ajaxOptions ) {
+ ajaxOptions = this.normalizeAjaxOptions( ajaxOptions );
+ ajaxOptions.type = 'POST';
+ return this.ajax( parameters, ajaxOptions );
+ },
+
+ /**
+ * Perform the API call.
+ *
+ * @param {Object} request parameters
+ * @param {Object} ajax options
+ * @return {jqXHR}
+ */
+ ajax: function( parameters, ajaxOptions ) {
+ parameters = $.extend( {}, this.defaults.parameters, parameters );
+ ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
+
+ // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
+ // So let's escape them here. See bug #28235
+ // This works because jQuery accepts data as a query string or as an Object
+ ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
+
+ ajaxOptions.error = function( xhr, textStatus, exception ) {
+ ajaxOptions.err( 'http', {
+ xhr: xhr,
+ textStatus: textStatus,
+ exception: exception
+ } );
+ };
+
+ // Success just means 200 OK; also check for output and API errors
+ ajaxOptions.success = function( result ) {
+ if ( result === undefined || result === null || result === '' ) {
+ ajaxOptions.err( 'ok-but-empty',
+ 'OK response but empty result (check HTTP headers?)' );
+ } else if ( result.error ) {
+ var code = result.error.code === undefined ? 'unknown' : result.error.code;
+ ajaxOptions.err( code, result );
+ } else {
+ ajaxOptions.ok( result );
+ }
+ };
+
+ return $.ajax( ajaxOptions );
+ }
+
+ };
+
+ /**
+ * @var {Array} List of errors we might receive from the API.
+ * For now, this just documents our expectation that there should be similar messages
+ * available.
+ */
+ mw.Api.errors = [
+ // occurs when POST aborted
+ // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
+ 'ok-but-empty',
+
+ // timeout
+ 'timeout',
+
+ // really a warning, but we treat it like an error
+ 'duplicate',
+ 'duplicate-archive',
+
+ // upload succeeded, but no image info.
+ // this is probably impossible, but might as well check for it
+ 'noimageinfo',
+ // remote errors, defined in API
+ 'uploaddisabled',
+ 'nomodule',
+ 'mustbeposted',
+ 'badaccess-groups',
+ 'stashfailed',
+ 'missingresult',
+ 'missingparam',
+ 'invalid-file-key',
+ 'copyuploaddisabled',
+ 'mustbeloggedin',
+ 'empty-file',
+ 'file-too-large',
+ 'filetype-missing',
+ 'filetype-banned',
+ 'filename-tooshort',
+ 'illegal-filename',
+ 'verification-error',
+ 'hookaborted',
+ 'unknown-error',
+ 'internal-error',
+ 'overwrite',
+ 'badtoken',
+ 'fetchfileerror',
+ 'fileexists-shared-forbidden',
+ 'invalidtitle',
+ 'notloggedin'
+ ];
+
+ /**
+ * @var {Array} List of warnings we might receive from the API.
+ * For now, this just documents our expectation that there should be similar messages
+ * available.
+ */
+ mw.Api.warnings = [
+ 'duplicate',
+ 'exists'
+ ];
+
+})( jQuery, mediaWiki );
diff --git a/resources/mediawiki.api/mediawiki.api.parse.js b/resources/mediawiki.api/mediawiki.api.parse.js
new file mode 100644
index 00000000..1cc68f29
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.parse.js
@@ -0,0 +1,31 @@
+/**
+ * Additional mw.Api methods to assist with API calls related to parsing wikitext.
+ */
+
+( function( $, mw ) {
+
+ $.extend( mw.Api.prototype, {
+ /**
+ * Convinience method for 'action=parse'. Parses wikitext into HTML.
+ *
+ * @param wikiText {String}
+ * @param success {Function} callback to which to pass success HTML
+ * @param err {Function} callback if error (optional)
+ * @return {jqXHR}
+ */
+ parse: function( wikiText, success, err ) {
+ var params = {
+ text: wikiText,
+ action: 'parse'
+ },
+ ok = function( data ) {
+ if ( data.parse && data.parse.text && data.parse.text['*'] ) {
+ success( data.parse.text['*'] );
+ }
+ };
+ return this.get( params, { ok: ok, err: err } );
+ }
+
+ } );
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.api/mediawiki.api.titleblacklist.js b/resources/mediawiki.api/mediawiki.api.titleblacklist.js
new file mode 100644
index 00000000..5435945b
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.titleblacklist.js
@@ -0,0 +1,51 @@
+/**
+ * Additional mw.Api methods to assist with API calls to the API module of the TitleBlacklist extension.
+ */
+
+( function( $, mw, undefined ) {
+
+ $.extend( mw.Api.prototype, {
+ /**
+ * Convinience method for 'action=titleblacklist'.
+ * Note: This action is not provided by MediaWiki core, but as part of the TitleBlacklist extension.
+ *
+ * @param title {mw.Title}
+ * @param success {Function} Called on successfull request. First argument is false if title wasn't blacklisted,
+ * object with 'reason', 'line' and 'message' properties if title was blacklisted.
+ * @param err {Function} optional callback to run if api error
+ * @return {jqXHR}
+ */
+ isBlacklisted: function( title, success, err ) {
+ var params = {
+ action: 'titleblacklist',
+ tbaction: 'create',
+ tbtitle: title.toString()
+ },
+ ok = function( data ) {
+ var result;
+
+ // this fails open (if nothing valid is returned by the api, allows the title)
+ // also fails open when the API is not present, which will be most of the time
+ // as this API module is part of the TitleBlacklist extension.
+ if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted') {
+ if ( data.titleblacklist.reason ) {
+ result = {
+ reason: data.titleblacklist.reason,
+ line: data.titleblacklist.line,
+ message: data.titleblacklist.message
+ };
+ } else {
+ mw.log('mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug');
+ result = { reason: 'Blacklisted, but no reason supplied', line: 'Unknown', message: null };
+ }
+ success( result );
+ } else {
+ success ( false );
+ }
+ };
+
+ return this.get( params, { ok: ok, err: err } );
+ }
+
+ } );
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.api/mediawiki.api.watch.js b/resources/mediawiki.api/mediawiki.api.watch.js
new file mode 100644
index 00000000..3f2525ad
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.watch.js
@@ -0,0 +1,58 @@
+/**
+ * Additional mw.Api methods to assist with (un)watching wiki pages.
+ * @since 1.19
+ */
+( function( $, mw ) {
+
+ $.extend( mw.Api.prototype, {
+ /**
+ * Convinience method for 'action=watch'.
+ *
+ * @param page {String|mw.Title} Full page name or instance of mw.Title
+ * @param success {Function} callback to which the watch object will be passed
+ * watch object contains 'title' (full page name), 'watched' (boolean) and
+ * 'message' (parsed HTML of the 'addedwatchtext' message).
+ * @param err {Function} callback if error (optional)
+ * @return {jqXHR}
+ */
+ watch: function( page, success, err ) {
+ var params, ok;
+ params = {
+ action: 'watch',
+ title: String( page ),
+ token: mw.user.tokens.get( 'watchToken' ),
+ uselang: mw.config.get( 'wgUserLanguage' )
+ };
+ ok = function( data ) {
+ success( data.watch );
+ };
+ return this.post( params, { ok: ok, err: err } );
+ },
+ /**
+ * Convinience method for 'action=watch&unwatch='.
+ *
+ * @param page {String|mw.Title} Full page name or instance of mw.Title
+ * @param success {Function} callback to which the watch object will be passed
+ * watch object contains 'title' (full page name), 'unwatched' (boolean) and
+ * 'message' (parsed HTML of the 'removedwatchtext' message).
+ * @param err {Function} callback if error (optional)
+ * @return {jqXHR}
+ */
+ unwatch: function( page, success, err ) {
+ var params, ok;
+ params = {
+ action: 'watch',
+ unwatch: 1,
+ title: String( page ),
+ token: mw.user.tokens.get( 'watchToken' ),
+ uselang: mw.config.get( 'wgUserLanguage' )
+ };
+ ok = function( data ) {
+ success( data.watch );
+ };
+ return this.post( params, { ok: ok, err: err } );
+ }
+
+ } );
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.language/languages/cs.js b/resources/mediawiki.language/languages/cs.js
index 0b77909d..04dda99d 100644
--- a/resources/mediawiki.language/languages/cs.js
+++ b/resources/mediawiki.language/languages/cs.js
@@ -7,12 +7,10 @@ mediaWiki.language.convertPlural = function( count, forms ) {
switch ( count ) {
case 1:
return forms[0];
- break;
case 2:
case 3:
case 4:
return forms[1];
- break;
default:
return forms[2];
}
diff --git a/resources/mediawiki.language/languages/lt.js b/resources/mediawiki.language/languages/lt.js
index ee0a609b..04964aff 100644
--- a/resources/mediawiki.language/languages/lt.js
+++ b/resources/mediawiki.language/languages/lt.js
@@ -3,6 +3,7 @@
*/
mediaWiki.language.convertPlural = function( count, forms ) {
+ // if the number is not mentioned in message, then use $form[0] for singular and $form[1] for plural or zero
if ( forms.length == 2 ) {
return count == 1 ? forms[0] : forms[1];
}
@@ -11,7 +12,7 @@ mediaWiki.language.convertPlural = function( count, forms ) {
return forms[0];
}
if ( count % 10 >= 2 && ( count % 100 < 10 || count % 100 >= 20 ) ) {
- return forms[1];
+ return forms[1];
}
return forms[2];
};
diff --git a/resources/mediawiki.language/languages/mk.js b/resources/mediawiki.language/languages/mk.js
index 5105025c..c89bbac5 100644
--- a/resources/mediawiki.language/languages/mk.js
+++ b/resources/mediawiki.language/languages/mk.js
@@ -4,5 +4,5 @@
mediaWiki.language.convertPlural = function( count, forms ) {
forms = mediaWiki.language.preConvertPlural( forms, 2 );
- return ( count % 10 === 1 ) ? forms[0] : forms[1];
+ return ( ( count % 10 === 1 ) && ( count % 100 !== 11 ) ) ? forms[0] : forms[1];
};
diff --git a/resources/mediawiki.language/languages/se.js b/resources/mediawiki.language/languages/se.js
index 51ebaf25..e1ae5b9a 100644
--- a/resources/mediawiki.language/languages/se.js
+++ b/resources/mediawiki.language/languages/se.js
@@ -3,15 +3,15 @@
*/
mediaWiki.language.convertPlural = function( count, forms ) {
- if ( count == 0 ) {
- return '';
+ if ( !forms || forms.length === 0 ) {
+ return '';
}
forms = mediaWiki.language.preConvertPlural( forms, 3 );
if ( count == 1 ) {
- return forms[1];
+ return forms[0];
}
if ( count == 2 ) {
- return forms[2];
+ return forms[1];
}
- return ''
+ return forms[2];
};
diff --git a/resources/mediawiki.language/languages/sma.js b/resources/mediawiki.language/languages/sma.js
index d3ccf625..8163c42c 100644
--- a/resources/mediawiki.language/languages/sma.js
+++ b/resources/mediawiki.language/languages/sma.js
@@ -3,12 +3,15 @@
*/
mediaWiki.language.convertPlural = function( count, forms ) {
- forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( !forms || forms.length === 0 ) {
+ return '';
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
if ( count == 1 ) {
- return forms[1];
+ return forms[0];
}
if ( count == 2 ) {
- return forms[2];
+ return forms[1];
}
- return forms[3];
+ return forms[2];
};
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
index fa7aa8d5..4abfa4ba 100644
--- a/resources/mediawiki.language/mediawiki.language.js
+++ b/resources/mediawiki.language/mediawiki.language.js
@@ -22,7 +22,7 @@ mw.language = {
'procPLURAL': function( template ) {
if ( template.title && template.parameters && mw.language.convertPlural ) {
// Check if we have forms to replace
- if ( template.parameters.length == 0 ) {
+ if ( template.parameters.length === 0 ) {
return '';
}
// Restore the count into a Number ( if it got converted earlier )
@@ -44,7 +44,7 @@ mw.language = {
* @return string Correct form for quantifier in this language
*/
'convertPlural': function( count, forms ){
- if ( !forms || forms.length == 0 ) {
+ if ( !forms || forms.length === 0 ) {
return '';
}
return ( parseInt( count, 10 ) == 1 ) ? forms[0] : forms[1];
@@ -96,6 +96,32 @@ mw.language = {
}
return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
},
+ /**
+ * Provides an alternative text depending on specified gender.
+ * Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
+ * If second or third parameter are not specified, masculine is used.
+ *
+ * These details may be overriden per language.
+ *
+ * @param gender string male, female, or anything else for neutral.
+ * @param forms array List of gender forms
+ *
+ * @return string
+ */
+ 'gender': function( gender, forms ) {
+ if ( !forms || forms.length === 0 ) {
+ return '';
+ }
+ forms = mw.language.preConvertPlural( forms, 2 );
+ if ( gender === 'male' ) {
+ return forms[0];
+ }
+ if ( gender === 'female' ) {
+ return forms[1];
+ }
+ return ( forms.length === 3 ) ? forms[2] : forms[0];
+ },
+
// Digit Transform Table, populated by language classes where applicable
'digitTransformTable': null
};
diff --git a/resources/mediawiki.page/images/AJAXCategorySprite.png b/resources/mediawiki.page/images/AJAXCategorySprite.png
deleted file mode 100644
index d5f9cf48..00000000
--- a/resources/mediawiki.page/images/AJAXCategorySprite.png
+++ /dev/null
Binary files differ
diff --git a/resources/mediawiki.page/mediawiki.page.ajaxCategories.css b/resources/mediawiki.page/mediawiki.page.ajaxCategories.css
deleted file mode 100644
index dd991aaf..00000000
--- a/resources/mediawiki.page/mediawiki.page.ajaxCategories.css
+++ /dev/null
@@ -1,64 +0,0 @@
-.mw-addcategory-prompt {
- display: inline;
-}
-
-.mw-addcategory-prompt input {
- margin-left: 0.5em;
- margin-right: 0.5em;
-}
-
-.mw-remove-category {
- padding: 2px 8px;
- display:inline;
-}
-.mw-removed-category {
- text-decoration: line-through;
-}
-#catlinks:hover .icon {
- opacity: 1;
-}
-
-.mw-ajax-addcategory {
- padding-left: 30px;
- margin-right: 1em;
- cursor: pointer;
-}
-#catlinks .icon {
- cursor: pointer;
- padding: 1px 8px;
- margin: 0;
- background: url('images/AJAXCategorySprite.png') 0 0 no-repeat;
- opacity: 0.5;
-}
-#catlinks .icon-parent {
- cursor: pointer;
-}
-#catlinks .icon-parent:hover .icon {
- background-position-y: -16px;
-}
-#catlinks .no-text {
-}
-#catlinks .icon-close {
- background-position: 0 0;
-}
-#catlinks .icon-edit {
- background-position: -16px 0;
-}
-#catlinks .icon-tick {
- background-position: -32px 0;
-}
-#catlinks .icon-add {
- background-position: -64px 0;
-}
-#catlinks .icon-close:hover {
- background-position: 0 -16px;
-}
-#catlinks .icon-edit:hover {
- background-position: -16px -16px;
-}
-#catlinks .icon-tick:hover {
- background-position: -32px -16px;
-}
-#catlinks .icon-add:hover {
- background-position: -64px -16px;
-} \ No newline at end of file
diff --git a/resources/mediawiki.page/mediawiki.page.ready.js b/resources/mediawiki.page/mediawiki.page.ready.js
index eba5db11..370c3a19 100644
--- a/resources/mediawiki.page/mediawiki.page.ready.js
+++ b/resources/mediawiki.page/mediawiki.page.ready.js
@@ -5,7 +5,7 @@ jQuery( document ).ready( function( $ ) {
$( 'input[placeholder]' ).placeholder();
}
- /* Enable makeCollapse */
+ /* Enable makeCollapsible */
$( '.mw-collapsible' ).makeCollapsible();
/* Lazy load jquery.tablesorter */
diff --git a/resources/mediawiki.page/mediawiki.page.startup.js b/resources/mediawiki.page/mediawiki.page.startup.js
index 8af2fad9..a5541ef9 100644
--- a/resources/mediawiki.page/mediawiki.page.startup.js
+++ b/resources/mediawiki.page/mediawiki.page.startup.js
@@ -1,10 +1,18 @@
-( function( $ ) {
+( function ( $ ) {
- /* Client profile classes for <html> */
- /* Allows for easy hiding/showing of JS or no-JS-specific UI elements */
+ mw.page = {};
+ // Client profile classes for <html>
+ // Allows for easy hiding/showing of JS or no-JS-specific UI elements
$( 'html' )
.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 );
+
} )( jQuery );
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.css b/resources/mediawiki.special/mediawiki.special.changeemail.css
index 8f628a95..3d53e8db 100644
--- a/resources/mediawiki.special/mediawiki.special.preferences.css
+++ b/resources/mediawiki.special/mediawiki.special.changeemail.css
@@ -1,14 +1,10 @@
#mw-emailaddress-validity {
padding: 2px 1em;
}
-body.ltr #mw-emailaddress-validity {
+#mw-emailaddress-validity {
border-bottom-right-radius: 0.8em;
border-top-right-radius: 0.8em;
}
-body.rtl #mw-emailaddress-validity {
- border-bottom-left-radius: 0.8em;
- border-top-left-radius: 0.8em;
-}
#mw-emailaddress-validity.valid {
border: 1px solid #80FF80;
background-color: #C0FFC0;
diff --git a/resources/mediawiki.special/mediawiki.special.changeemail.js b/resources/mediawiki.special/mediawiki.special.changeemail.js
new file mode 100644
index 00000000..6b4ed81d
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.changeemail.js
@@ -0,0 +1,40 @@
+/*
+ * JavaScript for Special:ChangeEmail
+ */
+( function( $, mw ) {
+
+/**
+ * Given an email validity status (true, false, null) update the label CSS class
+ */
+var updateMailValidityLabel = function( mail ) {
+ var isValid = mw.util.validateEmail( mail ),
+ $label = $( '#mw-emailaddress-validity' );
+
+ // We allow empty address
+ if( isValid === null ) {
+ $label.text( '' ).removeClass( 'valid invalid' );
+
+ // Valid
+ } else if ( isValid ) {
+ $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
+
+ // Not valid
+ } else {
+ $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
+ }
+};
+
+// Lame tip to let user know if its email is valid. See bug 22449
+// Only bind once for 'blur' so that the user can fill it in without errors
+// After that look at every keypress for direct feedback if it was invalid onblur
+$( '#wpNewEmail' ).one( 'blur', function() {
+ if ( $( '#mw-emailaddress-validity' ).length === 0 ) {
+ $(this).after( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' );
+ }
+ updateMailValidityLabel( $(this).val() );
+ $(this).keyup( function() {
+ updateMailValidityLabel( $(this).val() );
+ } );
+} );
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.css b/resources/mediawiki.special/mediawiki.special.changeslist.css
index cb4d2156..42afbcd7 100644
--- a/resources/mediawiki.special/mediawiki.special.changeslist.css
+++ b/resources/mediawiki.special/mediawiki.special.changeslist.css
@@ -7,7 +7,8 @@ table.mw-enhanced-rc {
border-spacing: 0;
}
-table.mw-enhanced-rc th, table.mw-enhanced-rc td {
+table.mw-enhanced-rc th,
+table.mw-enhanced-rc td {
padding: 0;
vertical-align: top;
}
@@ -30,8 +31,10 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
float: none;
}
-/* If JS is disabled, the arrow is still needed
- for spacing, but ideally shouldn't be shown */
+/**
+ * If JS is disabled, the arrow is still needed
+ * for spacing, but ideally shouldn't be shown
+ */
.mw-enhanced-rc .mw-rc-openarrow {
visibility: hidden;
}
diff --git a/resources/mediawiki.special/mediawiki.special.javaScriptTest.js b/resources/mediawiki.special/mediawiki.special.javaScriptTest.js
new file mode 100644
index 00000000..d413f602
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.javaScriptTest.js
@@ -0,0 +1,33 @@
+/*
+ * JavaScript for Special:JavaScriptTest
+ */
+jQuery( document ).ready( function( $ ) {
+
+ // Create useskin dropdown menu and reload onchange to the selected skin
+ // (only if a framework was found, not on error pages).
+ $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function() {
+
+ var $html = $( '<p><label for="useskin">'
+ + mw.message( 'javascripttest-pagetext-skins' ).escaped()
+ + ' '
+ + '</label></p>' ),
+ select = '<select name="useskin" id="useskin">';
+
+ // Build <select> further
+ $.each( mw.config.get( 'wgAvailableSkins' ), function( id ) {
+ select += '<option value="' + id + '"'
+ + ( mw.config.get( 'skin' ) === id ? ' selected="selected"' : '' )
+ + '>' + mw.message( 'skinname-' + id ).escaped() + '</option>';
+ } );
+ select += '</select>';
+
+ // Bind onchange event handler and append to form
+ $html.append(
+ $( select ).change( function() {
+ window.location = QUnit.url( { useskin: $(this).val() } );
+ } )
+ );
+
+ return $html;
+ } );
+} );
diff --git a/resources/mediawiki.special/mediawiki.special.movePage.js b/resources/mediawiki.special/mediawiki.special.movePage.js
index 2f94cc06..68c2ed07 100644
--- a/resources/mediawiki.special/mediawiki.special.movePage.js
+++ b/resources/mediawiki.special/mediawiki.special.movePage.js
@@ -1,5 +1,5 @@
/* JavaScript for Special:MovePage */
jQuery( function( $ ) {
- $( '#wpReason' ).byteLimit();
+ $( '#wpReason, #wpNewTitleMain' ).byteLimit();
});
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js
index 2e07e7f1..b7200826 100644
--- a/resources/mediawiki.special/mediawiki.special.preferences.js
+++ b/resources/mediawiki.special/mediawiki.special.preferences.js
@@ -22,7 +22,7 @@ $legends.each( function( i, legend ) {
$legend.parent().show();
}
var ident = $legend.parent().attr( 'id' );
-
+
var $li = $( '<li/>', {
'class' : ( i === 0 ) ? 'selected' : null
});
@@ -37,7 +37,7 @@ $legends.each( function( i, legend ) {
var scrollTop = $(window).scrollTop();
window.location.hash = $(this).attr('href');
$(window).scrollTop(scrollTop);
-
+
$preftoc.find( 'li' ).removeClass( 'selected' );
$(this).parent().addClass( 'selected' );
$( '#preferences > fieldset' ).hide();
@@ -58,41 +58,6 @@ $( function() {
}
} );
-/**
- * Given an email validity status (true, false, null) update the label CSS class
- */
-var updateMailValidityLabel = function( mail ) {
- var isValid = mw.util.validateEmail( mail ),
- $label = $( '#mw-emailaddress-validity' );
-
- // We allow empty address
- if( isValid === null ) {
- $label.text( '' ).removeClass( 'valid invalid' );
-
- // Valid
- } else if ( isValid ) {
- $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
-
- // Not valid
- } else {
- $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
- }
-};
-
-// Lame tip to let user know if its email is valid. See bug 22449
-// Only bind once for 'blur' so that the user can fill it in without errors
-// After that look at every keypress for direct feedback if it was invalid onblur
-$( '#mw-input-wpemailaddress' ).one( 'blur', function() {
- if ( $( '#mw-emailaddress-validity' ).length === 0 ) {
- $(this).after( '<label for="mw-input-wpemailaddress" id="mw-emailaddress-validity"></label>' );
- }
- updateMailValidityLabel( $(this).val() );
- $(this).keyup( function() {
- updateMailValidityLabel( $(this).val() );
- } );
-} );
-
-
/**
* Timezone functions.
@@ -145,7 +110,7 @@ var updateTimezoneSelection = function() {
$tzTextbox.val( minutesToHours( minuteDiff ) );
$tzSelect.val( 'other' );
$tzTextbox.get( 0 ).disabled = false;
- } else if ( type == 'other' ) {
+ } else if ( type == 'other' ) {
// Grab data from the textbox, parse it.
minuteDiff = hoursToMinutes( $tzTextbox.val() );
} else {
@@ -172,4 +137,4 @@ if ( $tzSelect.length && $tzTextbox.length ) {
$tzTextbox.blur( function() { updateTimezoneSelection(); } );
updateTimezoneSelection();
}
-} )( jQuery, mediaWiki );
+} )( jQuery, mediaWiki ); \ No newline at end of file
diff --git a/resources/mediawiki.special/mediawiki.special.recentchanges.js b/resources/mediawiki.special/mediawiki.special.recentchanges.js
index 7e284fbd..3d520f5e 100644
--- a/resources/mediawiki.special/mediawiki.special.recentchanges.js
+++ b/resources/mediawiki.special/mediawiki.special.recentchanges.js
@@ -9,24 +9,24 @@
var $select = null;
var rc = mw.special.recentchanges = {
-
+
/**
* Handler to disable/enable the namespace selector checkboxes when the
* special 'all' namespace is selected/unselected respectively.
*/
- updateCheckboxes: function() {
+ updateCheckboxes: function() {
// The option element for the 'all' namespace has an empty value
var isAllNS = ('' === $select.find('option:selected').val() );
// Iterates over checkboxes and propagate the selected option
$.each( checkboxes, function( i, id ) {
- $( '#' + id ).attr( 'disabled', isAllNS );
+ $( '#' + id ).prop( 'disabled', isAllNS );
});
},
init: function() {
// Populate
- $select = $( '#namespace' );
+ $select = $( '#namespace' );
// Bind to change event, and trigger once to set the initial state of the checkboxes.
$select.change( rc.updateCheckboxes ).change();
diff --git a/resources/mediawiki.special/mediawiki.special.search.css b/resources/mediawiki.special/mediawiki.special.search.css
index 89d55b0b..914e47e3 100644
--- a/resources/mediawiki.special/mediawiki.special.search.css
+++ b/resources/mediawiki.special/mediawiki.special.search.css
@@ -1,10 +1,10 @@
/**
- * Fixes sister projects box moving down the extract
+ * Fixes sister projects box moving down the extract
* of the first result (bug #16886).
- * It only happens when the window is small and
- * This changes slightly the layout for big screens
- * where there was space for the extracts and the
- * sister projects and thus it showed like in any
+ * It only happens when the window is small and
+ * This changes slightly the layout for big screens
+ * where there was space for the extracts and the
+ * sister projects and thus it showed like in any
* other browser.
*
* This will only affect IE 7 and lower
diff --git a/resources/mediawiki.special/mediawiki.special.search.js b/resources/mediawiki.special/mediawiki.special.search.js
index bac27fc6..8865d04c 100644
--- a/resources/mediawiki.special/mediawiki.special.search.js
+++ b/resources/mediawiki.special/mediawiki.special.search.js
@@ -22,7 +22,7 @@ var headerLinks = $('.search-types a');
$('#searchText, #powerSearchText').change(function() {
var searchterm = $(this).val();
headerLinks.each( function() {
- var parts = this.href.split( 'search=' );
+ var parts = $(this).attr('href').split( 'search=' );
var lastpart = '';
var prefix = 'search=';
if( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
@@ -34,4 +34,4 @@ $('#searchText, #powerSearchText').change(function() {
});
}).trigger('change');
-} ); \ No newline at end of file
+} );
diff --git a/resources/mediawiki.special/mediawiki.special.upload.js b/resources/mediawiki.special/mediawiki.special.upload.js
index 4a8622f5..85b3f3f5 100644
--- a/resources/mediawiki.special/mediawiki.special.upload.js
+++ b/resources/mediawiki.special/mediawiki.special.upload.js
@@ -25,7 +25,7 @@ jQuery( function( $ ) {
* @return boolean
*/
function fileIsPreviewable( file ) {
- var known = ['image/png', 'image/gif', 'image/jpeg'],
+ var known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
tooHuge = 10 * 1024 * 1024;
return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
}
@@ -46,27 +46,22 @@ jQuery( function( $ ) {
var previewSize = 180,
thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
'<div class="thumbinner">' +
- '<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>' +
+ '<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
'<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
'</div>' +
'</div>' );
thumb.find( '.filename' ).text( file.name ).end()
.find( '.fileinfo' ).text( prettySize( file.size ) ).end();
-
- var ctx = thumb.find( 'canvas' )[0].getContext( '2d' ),
- spinner = new Image();
- spinner.onload = function() {
- ctx.drawImage( spinner, (previewSize - spinner.width) / 2,
- (previewSize - spinner.height) / 2 );
- };
- spinner.src = mw.config.get( 'wgScriptPath' ) + '/skins/common/images/spinner.gif';
+
+ var $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>'),
+ ctx = $canvas[0].getContext( '2d' );
$( '#mw-htmlform-source' ).parent().prepend( thumb );
var meta;
fetchPreview( file, function( dataURL ) {
var img = new Image(),
rotation = 0;
-
+
if ( meta && meta.tiff && meta.tiff.Orientation ) {
rotation = (360 - function () {
// See includes/media/Bitmap.php
@@ -82,7 +77,7 @@ jQuery( function( $ ) {
}
}() ) % 360;
}
-
+
img.onload = function() {
var width, height, x, y, dx, dy, logicalWidth, logicalHeight;
// Fit the image within the previewSizexpreviewSize box
@@ -98,7 +93,7 @@ jQuery( function( $ ) {
dy = (180 - height) / 2;
switch ( rotation ) {
// If a rotation is applied, the direction of the axis
- // changes as well. You can derive the values below by
+ // changes as well. You can derive the values below by
// drawing on paper an axis system, rotate it and see
// where the positive axis direction is
case 0:
@@ -108,7 +103,7 @@ jQuery( function( $ ) {
logicalHeight = img.height;
break;
case 90:
-
+
x = dx;
y = dy - previewSize;
logicalWidth = img.height;
@@ -127,11 +122,12 @@ jQuery( function( $ ) {
logicalHeight = img.width;
break;
}
-
+
ctx.clearRect( 0, 0, 180, 180 );
ctx.rotate( rotation / 180 * Math.PI );
ctx.drawImage( img, x, y, width, height );
-
+ thumb.find('.mw-small-spinner').replaceWith($canvas);
+
// Image size
var info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
', ' + prettySize( file.size );
@@ -160,20 +156,33 @@ jQuery( function( $ ) {
*/
function fetchPreview( file, callback, callbackBinary ) {
var reader = new FileReader();
- reader.onload = function() {
- if ( callbackBinary ) {
- callbackBinary( reader.result );
- reader.onload = function() {
- callback( reader.result );
- };
- reader.readAsDataURL( file );
- } else {
- callback( reader.result );
- }
- };
if ( callbackBinary ) {
+ // To fetch JPEG metadata we need a binary string; start there.
+ // todo:
+ reader.onload = function() {
+ callbackBinary( reader.result );
+
+ // Now run back through the regular code path.
+ fetchPreview(file, callback );
+ };
reader.readAsBinaryString( file );
+ } else if ('URL' in window && 'createObjectURL' in window.URL) {
+ // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
+ // WebKit has it in a namespace for now but that's ok. ;)
+ //
+ // Lifetime of this URL is until document close, which is fine
+ // for Special:Upload -- if this code gets used on longer-running
+ // pages, add a revokeObjectURL() when it's no longer needed.
+ //
+ // Prefer this over readAsDataURL for Firefox 7 due to bug reading
+ // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
+ callback(window.URL.createObjectURL(file));
} else {
+ // This ends up decoding the file to base-64 and back again, which
+ // feels horribly inefficient.
+ reader.onload = function() {
+ callback( reader.result );
+ };
reader.readAsDataURL( file );
}
}
@@ -200,7 +209,7 @@ jQuery( function( $ ) {
function clearPreview() {
$( '#mw-upload-thumbnail' ).remove();
}
-
+
/**
* Check if the file does not exceed the maximum size
*/
@@ -213,18 +222,18 @@ jQuery( function( $ ) {
return sizes['*'];
}
$( '.mw-upload-source-error' ).remove();
-
- var maxSize = getMaxUploadSize( 'file' );
+
+ var maxSize = getMaxUploadSize( 'file' );
if ( file.size > maxSize ) {
- var error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
+ var error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
$( '#wpUploadFile' ).after( error );
return false;
}
return true;
}
-
-
+
+
/**
* Initialization
*/
@@ -235,11 +244,11 @@ jQuery( function( $ ) {
if ( this.files && this.files.length ) {
// Note: would need to be updated to handle multiple files.
var file = this.files[0];
-
+
if ( !checkMaxUploadSize( file ) ) {
return;
}
-
+
if ( fileIsPreviewable( file ) ) {
showPreview( file );
}
@@ -261,9 +270,9 @@ jQuery( function ( $ ) {
$( '.mw-upload-source-error' ).remove();
if ( this.checked ) {
// Disable all inputs
- $( 'input[name!="wpSourceType"]', rows ).attr( 'disabled', true );
+ $( 'input[name!="wpSourceType"]', rows ).prop( 'disabled', 'disabled' );
// Re-enable the current one
- $( 'input', currentRow ).attr( 'disabled', false );
+ $( 'input', currentRow ).prop( 'disabled', false );
}
};
}() );
diff --git a/resources/mediawiki/mediawiki.Uri.js b/resources/mediawiki/mediawiki.Uri.js
index 7ff8dda4..26fdfa9e 100644
--- a/resources/mediawiki/mediawiki.Uri.js
+++ b/resources/mediawiki/mediawiki.Uri.js
@@ -56,7 +56,7 @@
*
*/
-( function( $ ) {
+( function( $, mw ) {
/**
* Function that's useful when constructing the URI string -- we frequently encounter the pattern of
@@ -89,172 +89,213 @@
'host', // www.test.com
'port', // 81
'path', // /dir/dir.2/index.htm
- 'query', // q1=0&&test1&test2=value (will become { q1: 0, test1: '', test2: 'value' } )
+ 'query', // q1=0&&test1&test2=value (will become { q1: '0', test1: '', test2: 'value' } )
'fragment' // top
];
- /**
- * Constructs URI object. Throws error if arguments are illegal/impossible, or otherwise don't parse.
- * @constructor
- * @param {!Object|String} URI string, or an Object with appropriate properties (especially another URI object to clone). Object must have non-blank 'protocol', 'host', and 'path' properties.
- * @param {Boolean} strict mode (when parsing a string)
- */
- mw.Uri = function( uri, strictMode ) {
- strictMode = !!strictMode;
- if ( uri !== undefined && uri !== null || uri !== '' ) {
- if ( typeof uri === 'string' ) {
- this._parse( uri, strictMode );
- } else if ( typeof uri === 'object' ) {
- var _this = this;
- $.each( properties, function( i, property ) {
- _this[property] = uri[property];
- } );
- if ( this.query === undefined ) {
- this.query = {};
- }
- }
- }
- if ( !( this.protocol && this.host && this.path ) ) {
- throw new Error( 'Bad constructor arguments' );
- }
- };
/**
- * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more compliant with RFC 3986
- * Similar to rawurlencode from PHP and our JS library mw.util.rawurlencode, but we also replace space with a +
- * @param {String} string
- * @return {String} encoded for URI
+ * We use a factory to inject a document location, for relative URLs, including protocol-relative URLs.
+ * so the library is still testable & purely functional.
*/
- mw.Uri.encode = function( s ) {
- return encodeURIComponent( s )
- .replace( /!/g, '%21').replace( /'/g, '%27').replace( /\(/g, '%28')
- .replace( /\)/g, '%29').replace( /\*/g, '%2A')
- .replace( /%20/g, '+' );
- };
-
- /**
- * Standard decodeURIComponent, with '+' to space
- * @param {String} string encoded for URI
- * @return {String} decoded string
- */
- mw.Uri.decode = function( s ) {
- return decodeURIComponent( s ).replace( /\+/g, ' ' );
- };
-
- mw.Uri.prototype = {
+ mw.UriRelative = function( documentLocation ) {
/**
- * Parse a string and set our properties accordingly.
- * @param {String} URI
- * @param {Boolean} strictness
- * @return {Boolean} success
+ * Constructs URI object. Throws error if arguments are illegal/impossible, or otherwise don't parse.
+ * @constructor
+ * @param {Object|String} URI string, or an Object with appropriate properties (especially another URI object to clone).
+ * Object must have non-blank 'protocol', 'host', and 'path' properties.
+ * @param {Object|Boolean} Object with options, or (backwards compatibility) a boolean for strictMode
+ * - strictMode {Boolean} Trigger strict mode parsing of the url. Default: false
+ * - overrideKeys {Boolean} Wether to let duplicate query parameters override eachother (true) or automagically
+ * convert to an array (false, default).
*/
- _parse: function( str, strictMode ) {
- var matches = parser[ strictMode ? 'strict' : 'loose' ].exec( str );
- var uri = this;
- $.each( properties, function( i, property ) {
- uri[ property ] = matches[ i+1 ];
- } );
+ function Uri( uri, options ) {
+ options = typeof options === 'object' ? options : { strictMode: !!options };
+ options = $.extend( {
+ strictMode: false,
+ overrideKeys: false
+ }, options );
- // uri.query starts out as the query string; we will parse it into key-val pairs then make
- // that object the "query" property.
- // we overwrite query in uri way to make cloning easier, it can use the same list of properties.
- var q = {};
- // using replace to iterate over a string
- if ( uri.query ) {
- uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
- if ( $1 ) {
- var k = mw.Uri.decode( $1 );
- var v = ( $2 === '' || $2 === undefined ) ? null : mw.Uri.decode( $3 );
- if ( typeof q[ k ] === 'string' ) {
- q[ k ] = [ q[ k ] ];
- }
- if ( typeof q[ k ] === 'object' ) {
- q[ k ].push( v );
- } else {
- q[ k ] = v;
- }
+ if ( uri !== undefined && uri !== null || uri !== '' ) {
+ if ( typeof uri === 'string' ) {
+ this._parse( uri, options );
+ } else if ( typeof uri === 'object' ) {
+ var _this = this;
+ $.each( properties, function( i, property ) {
+ _this[property] = uri[property];
+ } );
+ if ( this.query === undefined ) {
+ this.query = {};
}
- } );
+ }
}
- this.query = q;
- },
- /**
- * Returns user and password portion of a URI.
- * @return {String}
- */
- getUserInfo: function() {
- return cat( '', this.user, cat( ':', this.password, '' ) );
- },
+ // protocol-relative URLs
+ if ( !this.protocol ) {
+ this.protocol = defaultProtocol;
+ }
- /**
- * Gets host and port portion of a URI.
- * @return {String}
- */
- getHostPort: function() {
- return this.host + cat( ':', this.port, '' );
- },
+ if ( !( this.protocol && this.host && this.path ) ) {
+ throw new Error( 'Bad constructor arguments' );
+ }
+ }
/**
- * Returns the userInfo and host and port portion of the URI.
- * In most real-world URLs, this is simply the hostname, but it is more general.
- * @return {String}
+ * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more compliant with RFC 3986
+ * Similar to rawurlencode from PHP and our JS library mw.util.rawurlencode, but we also replace space with a +
+ * @param {String} string
+ * @return {String} encoded for URI
*/
- getAuthority: function() {
- return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
- },
+ Uri.encode = function( s ) {
+ return encodeURIComponent( s )
+ .replace( /!/g, '%21').replace( /'/g, '%27').replace( /\(/g, '%28')
+ .replace( /\)/g, '%29').replace( /\*/g, '%2A')
+ .replace( /%20/g, '+' );
+ };
/**
- * Returns the query arguments of the URL, encoded into a string
- * Does not preserve the order of arguments passed into the URI. Does handle escaping.
- * @return {String}
+ * Standard decodeURIComponent, with '+' to space
+ * @param {String} string encoded for URI
+ * @return {String} decoded string
*/
- getQueryString: function() {
- var args = [];
- $.each( this.query, function( key, val ) {
- var k = mw.Uri.encode( key );
- var vals = val === null ? [ null ] : $.makeArray( val );
- $.each( vals, function( i, v ) {
- args.push( k + ( v === null ? '' : '=' + mw.Uri.encode( v ) ) );
+ Uri.decode = function( s ) {
+ return decodeURIComponent( s.replace( /\+/g, '%20' ) );
+ };
+
+ Uri.prototype = {
+
+ /**
+ * Parse a string and set our properties accordingly.
+ * @param {String} URI
+ * @param {Object} options
+ * @return {Boolean} success
+ */
+ _parse: function( str, options ) {
+ var matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
+ var uri = this;
+ $.each( properties, function( i, property ) {
+ uri[ property ] = matches[ i+1 ];
} );
- } );
- return args.join( '&' );
- },
- /**
- * Returns everything after the authority section of the URI
- * @return {String}
- */
- getRelativePath: function() {
- return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
- },
+ // uri.query starts out as the query string; we will parse it into key-val pairs then make
+ // that object the "query" property.
+ // we overwrite query in uri way to make cloning easier, it can use the same list of properties.
+ var q = {};
+ // using replace to iterate over a string
+ if ( uri.query ) {
+ uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
+ if ( $1 ) {
+ var k = Uri.decode( $1 );
+ var v = ( $2 === '' || $2 === undefined ) ? null : Uri.decode( $3 );
- /**
- * Gets the entire URI string. May not be precisely the same as input due to order of query arguments.
- * @return {String} the URI string
- */
- toString: function() {
- return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
- },
+ // If overrideKeys, always (re)set top level value.
+ // If not overrideKeys but this key wasn't set before, then we set it as well.
+ if ( options.overrideKeys || q[ k ] === undefined ) {
+ q[ k ] = v;
- /**
- * Clone this URI
- * @return {Object} new URI object with same properties
- */
- clone: function() {
- return new mw.Uri( this );
- },
+ // Use arrays if overrideKeys is false and key was already seen before
+ } else {
+ // Once before, still a string, turn into an array
+ if ( typeof q[ k ] === 'string' ) {
+ q[ k ] = [ q[ k ] ];
+ }
+ // Add to the array
+ if ( $.isArray( q[ k ] ) ) {
+ q[ k ].push( v );
+ }
+ }
+ }
+ } );
+ }
+ this.query = q;
+ },
- /**
- * Extend the query -- supply query parameters to override or add to ours
- * @param {Object} query parameters in key-val form to override or add
- * @return {Object} this URI object
- */
- extend: function( parameters ) {
- $.extend( this.query, parameters );
- return this;
- }
+ /**
+ * Returns user and password portion of a URI.
+ * @return {String}
+ */
+ getUserInfo: function() {
+ return cat( '', this.user, cat( ':', this.password, '' ) );
+ },
+
+ /**
+ * Gets host and port portion of a URI.
+ * @return {String}
+ */
+ getHostPort: function() {
+ return this.host + cat( ':', this.port, '' );
+ },
+
+ /**
+ * Returns the userInfo and host and port portion of the URI.
+ * In most real-world URLs, this is simply the hostname, but it is more general.
+ * @return {String}
+ */
+ getAuthority: function() {
+ return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
+ },
+
+ /**
+ * Returns the query arguments of the URL, encoded into a string
+ * Does not preserve the order of arguments passed into the URI. Does handle escaping.
+ * @return {String}
+ */
+ getQueryString: function() {
+ var args = [];
+ $.each( this.query, function( key, val ) {
+ var k = Uri.encode( key );
+ var vals = val === null ? [ null ] : $.makeArray( val );
+ $.each( vals, function( i, v ) {
+ args.push( k + ( v === null ? '' : '=' + Uri.encode( v ) ) );
+ } );
+ } );
+ return args.join( '&' );
+ },
+
+ /**
+ * Returns everything after the authority section of the URI
+ * @return {String}
+ */
+ getRelativePath: function() {
+ return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
+ },
+
+ /**
+ * Gets the entire URI string. May not be precisely the same as input due to order of query arguments.
+ * @return {String} the URI string
+ */
+ toString: function() {
+ return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
+ },
+
+ /**
+ * Clone this URI
+ * @return {Object} new URI object with same properties
+ */
+ clone: function() {
+ return new Uri( this );
+ },
+
+ /**
+ * Extend the query -- supply query parameters to override or add to ours
+ * @param {Object} query parameters in key-val form to override or add
+ * @return {Object} this URI object
+ */
+ extend: function( parameters ) {
+ $.extend( this.query, parameters );
+ return this;
+ }
+ };
+
+ var defaultProtocol = ( new Uri( documentLocation ) ).protocol;
+
+ return Uri;
};
-} )( jQuery );
+ // if we are running in a browser, inject the current document location, for relative URLs
+ if ( document && document.location && document.location.href ) {
+ mw.Uri = mw.UriRelative( document.location.href );
+ }
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki/mediawiki.debug.css b/resources/mediawiki/mediawiki.debug.css
new file mode 100644
index 00000000..923d4a47
--- /dev/null
+++ b/resources/mediawiki/mediawiki.debug.css
@@ -0,0 +1,185 @@
+.mw-debug {
+ width: 100%;
+ text-align: left;
+ background-color: #eee;
+ border-top: 1px solid #aaa;
+}
+
+.mw-debug pre {
+ font-family: Monaco, "Consolas", "Lucida Console", "Courier New", monospace;
+ font-size: 11px;
+ padding: 0;
+ margin: 0;
+ background: none;
+ border: none;
+}
+
+.mw-debug table {
+ border-spacing: 0;
+ width: 100%;
+ table-layout: fixed;
+}
+
+.mw-debug table tr {
+ background-color: #fff;
+}
+
+.mw-debug table tr:nth-child(even) {
+ background-color: #f9f9f9;
+}
+
+.mw-debug table td, .mw-debug table th {
+ padding: 4px 10px;
+}
+
+.mw-debug table td {
+ border-bottom: 1px solid #eee;
+ word-wrap: break-word;
+}
+
+.mw-debug table td.nr {
+ text-align: right;
+}
+
+.mw-debug table td span.stats {
+ color: #808080;
+}
+
+.mw-debug ul {
+ margin: 0;
+ list-style: none;
+}
+
+.mw-debug li {
+ padding: 4px 0;
+ width: 100%;
+}
+
+.mw-debug-bits {
+ text-align: center;
+ border-bottom: 1px solid #aaa;
+}
+
+.mw-debug-bit {
+ display: inline-block;
+ padding: 10px 5px;
+ font-size: 13px;
+ /* IE-hack for display: inline-block */
+ zoom: 1;
+ *display:inline;
+}
+
+.mw-debug-panelink {
+ background-color: #eee;
+ border-right: 1px solid #ccc;
+}
+
+.mw-debug-panelink:first-child {
+ border-left: 1px solid #ccc;
+}
+
+.mw-debug-panelink:hover {
+ background-color: #fefefe;
+ cursor: pointer;
+}
+.mw-debug-panelink.current {
+ background-color: #dedede;
+
+}
+a.mw-debug-panelabel,
+a.mw-debug-panelabel:visited {
+ color: #000;
+}
+
+.mw-debug-pane {
+ height: 300px;
+ overflow: scroll;
+ display: none;
+ font-size: 11px;
+ background-color: #e1eff2;
+ box-sizing: border-box;
+}
+
+#mw-debug-pane-debuglog,
+#mw-debug-pane-request {
+ padding: 20px;
+}
+
+#mw-debug-pane-request table {
+ width: 100%;
+ margin: 10px 0 30px;
+}
+
+#mw-debug-pane-request tr,
+#mw-debug-pane-request th,
+#mw-debug-pane-request td,
+#mw-debug-pane-request table {
+ border: 1px solid #D0DBB3;
+ border-collapse: collapse;
+ margin: 0;
+}
+
+#mw-debug-pane-request th,
+#mw-debug-pane-request td {
+ font-size: 12px;
+ padding: 8px 10px;
+}
+
+#mw-debug-pane-request th {
+ background-color: #F1F7E2;
+ font-weight: bold;
+}
+
+#mw-debug-pane-request td {
+ background-color: white;
+}
+
+#mw-debug-console tr td:first-child {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+#mw-debug-console tr td:last-child {
+ vertical-align: top;
+}
+
+.mw-debug-console-log {
+ background-color: #add8e6;
+}
+
+.mw-debug-console-warn {
+ background-color: #ffa07a;
+}
+
+.mw-debug-console-deprecated {
+ background-color: #ffb6c1;
+}
+
+.mw-debug-backtrace {
+ padding: 5px 10px;
+ margin: 5px;
+ background-color: #dedede;
+}
+
+.mw-debug-backtrace span {
+ font-weight: bold;
+ color: #111;
+}
+
+.mw-debug-backtrace ul {
+ padding-left: 10px;
+}
+
+.mw-debug-backtrace li {
+ width: auto;
+ padding: 0;
+ color: #333;
+ font-size: 10px;
+ margin-bottom: 0;
+ line-height: 1em;
+}
+
+/* Cheapo hack to hide the first 3 lines of the backtrace */
+.mw-debug-backtrace li:nth-child(-n+3) {
+ display: none;
+}
diff --git a/resources/mediawiki/mediawiki.debug.init.js b/resources/mediawiki/mediawiki.debug.init.js
new file mode 100644
index 00000000..0f85e80d
--- /dev/null
+++ b/resources/mediawiki/mediawiki.debug.init.js
@@ -0,0 +1,3 @@
+jQuery( function () {
+ mediaWiki.Debug.init();
+} );
diff --git a/resources/mediawiki/mediawiki.debug.js b/resources/mediawiki/mediawiki.debug.js
new file mode 100644
index 00000000..a2bfbcbe
--- /dev/null
+++ b/resources/mediawiki/mediawiki.debug.js
@@ -0,0 +1,351 @@
+/**
+ * JavaScript for the new debug toolbar, enabled through $wgDebugToolbar.
+ *
+ * @author John Du Hart
+ * @since 1.19
+ */
+
+( function ( $, mw, undefined ) {
+"use strict";
+
+ var hovzer = $.getFootHovzer();
+
+ var debug = mw.Debug = {
+ /**
+ * Toolbar container element
+ *
+ * @var {jQuery}
+ */
+ $container: null,
+
+ /**
+ * Object containing data for the debug toolbar
+ *
+ * @var {Object}
+ */
+ data: {},
+
+ /**
+ * Initializes the debugging pane.
+ * Shouldn't be called before the document is ready
+ * (since it binds to elements on the page).
+ *
+ * @param {Object} data, defaults to 'debugInfo' from mw.config
+ */
+ init: function ( data ) {
+
+ this.data = data || mw.config.get( 'debugInfo' );
+ this.buildHtml();
+
+ // Insert the container into the DOM
+ hovzer.$.append( this.$container );
+ hovzer.update();
+
+ $( '.mw-debug-panelink' ).click( this.switchPane );
+ },
+
+ /**
+ * Switches between panes
+ *
+ * @todo Store cookie for last pane open
+ * @context {Element}
+ * @param {jQuery.Event} e
+ */
+ switchPane: function ( e ) {
+ var currentPaneId = debug.$container.data( 'currentPane' ),
+ requestedPaneId = $(this).prop( 'id' ).substr( 9 ),
+ $currentPane = $( '#mw-debug-pane-' + currentPaneId ),
+ $requestedPane = $( '#mw-debug-pane-' + requestedPaneId ),
+ hovDone = false;
+
+ function updateHov() {
+ if ( !hovDone ) {
+ hovzer.update();
+ hovDone = true;
+ }
+ }
+
+ // Skip hash fragment handling. Prevents screen from jumping.
+ e.preventDefault();
+
+ $( this ).addClass( 'current ');
+ $( '.mw-debug-panelink' ).not( this ).removeClass( 'current ');
+
+ // Hide the current pane
+ if ( requestedPaneId === currentPaneId ) {
+ $currentPane.slideUp( updateHov );
+ debug.$container.data( 'currentPane', null );
+ return;
+ }
+
+ debug.$container.data( 'currentPane', requestedPaneId );
+
+ if ( currentPaneId === undefined || currentPaneId === null ) {
+ $requestedPane.slideDown( updateHov );
+ } else {
+ $currentPane.hide();
+ $requestedPane.show();
+ updateHov();
+ }
+ },
+
+ /**
+ * Constructs the HTML for the debugging toolbar
+ */
+ buildHtml: function () {
+ var $container, $bits, panes, id;
+
+ $container = $( '<div id="mw-debug-toolbar" class="mw-debug"></div>' );
+
+ $bits = $( '<div class="mw-debug-bits"></div>' );
+
+ /**
+ * Returns a jQuery element for a debug-bit div
+ *
+ * @param id
+ * @return {jQuery}
+ */
+ function bitDiv( id ) {
+ return $( '<div>' ).attr({
+ id: 'mw-debug-' + id,
+ 'class': 'mw-debug-bit'
+ })
+ .appendTo( $bits );
+ }
+
+ /**
+ * Returns a jQuery element for a pane link
+ *
+ * @param id
+ * @param text
+ * @return {jQuery}
+ */
+ function paneLabel( id, text ) {
+ return $( '<a>' )
+ .attr({
+ 'class': 'mw-debug-panelabel',
+ href: '#mw-debug-pane-' + id
+ })
+ .text( text );
+ }
+
+ /**
+ * Returns a jQuery element for a debug-bit div with a for a pane link
+ *
+ * @param id CSS id snippet. Will be prefixed with 'mw-debug-'
+ * @param text Text to show
+ * @param count Optional count to show
+ * @return {jQuery}
+ */
+ function paneTriggerBitDiv( id, text, count ) {
+ if( count ) {
+ text = text + ' (' + count + ')';
+ }
+ return $( '<div>' ).attr({
+ id: 'mw-debug-' + id,
+ 'class': 'mw-debug-bit mw-debug-panelink'
+ })
+ .append( paneLabel( id, text ) )
+ .appendTo( $bits );
+ }
+
+ paneTriggerBitDiv( 'console', 'Console', this.data.log.length );
+
+ paneTriggerBitDiv( 'querylist', 'Queries', this.data.queries.length );
+
+ paneTriggerBitDiv( 'debuglog', 'Debug log', this.data.debugLog.length );
+
+ paneTriggerBitDiv( 'request', 'Request' );
+
+ paneTriggerBitDiv( 'includes', 'PHP includes', this.data.includes.length );
+
+ bitDiv( 'mwversion' )
+ .append( $( '<a href="//www.mediawiki.org/"></a>' ).text( 'MediaWiki' ) )
+ .append( ': ' + this.data.mwVersion );
+
+ bitDiv( 'phpversion' )
+ .append( $( '<a href="//www.php.net/"></a>' ).text( 'PHP' ) )
+ .append( ': ' + this.data.phpVersion );
+
+ bitDiv( 'time' )
+ .text( 'Time: ' + this.data.time.toFixed( 5 ) );
+
+ bitDiv( 'memory' )
+ .text( 'Memory: ' + this.data.memory )
+ .append( $( '<span title="Peak usage"></span>' ).text( ' (' + this.data.memoryPeak + ')' ) );
+
+
+ $bits.appendTo( $container );
+
+ panes = {
+ console: this.buildConsoleTable(),
+ querylist: this.buildQueryTable(),
+ debuglog: this.buildDebugLogTable(),
+ request: this.buildRequestPane(),
+ includes: this.buildIncludesPane()
+ };
+
+ for ( id in panes ) {
+ if ( !panes.hasOwnProperty( id ) ) {
+ continue;
+ }
+
+ $( '<div>' )
+ .attr({
+ 'class': 'mw-debug-pane',
+ id: 'mw-debug-pane-' + id
+ })
+ .append( panes[id] )
+ .appendTo( $container );
+ }
+
+ this.$container = $container;
+ },
+
+ /**
+ * Builds the console panel
+ */
+ buildConsoleTable: function () {
+ var $table, entryTypeText, i, length, entry;
+
+ $table = $( '<table id="mw-debug-console">' );
+
+ $('<colgroup>').css( 'width', /*padding=*/20 + ( 10*/*fontSize*/11 ) ).appendTo( $table );
+ $('<colgroup>').appendTo( $table );
+ $('<colgroup>').css( 'width', 350 ).appendTo( $table );
+
+
+ entryTypeText = function( entryType ) {
+ switch ( entryType ) {
+ case 'log':
+ return 'Log';
+ case 'warn':
+ return 'Warning';
+ case 'deprecated':
+ return 'Deprecated';
+ default:
+ return 'Unknown';
+ }
+ };
+
+ for ( i = 0, length = this.data.log.length; i < length; i += 1 ) {
+ entry = this.data.log[i];
+ entry.typeText = entryTypeText( entry.type );
+
+ $( '<tr>' )
+ .append( $( '<td>' )
+ .text( entry.typeText )
+ .attr( 'class', 'mw-debug-console-' + entry.type )
+ )
+ .append( $( '<td>' ).html( entry.msg ) )
+ .append( $( '<td>' ).text( entry.caller ) )
+ .appendTo( $table );
+ }
+
+ return $table;
+ },
+
+ /**
+ * Query list pane
+ */
+ buildQueryTable: function () {
+ var $table, i, length, query;
+
+ $table = $( '<table id="mw-debug-querylist"></table>' );
+
+ $( '<tr>' )
+ .append( $('<th>#</th>').css( 'width', '4em' ) )
+ .append( $('<th>SQL</th>') )
+ .append( $('<th>Time</th>').css( 'width', '8em' ) )
+ .append( $('<th>Call</th>').css( 'width', '18em' ) )
+ .appendTo( $table );
+
+ for ( i = 0, length = this.data.queries.length; i < length; i += 1 ) {
+ query = this.data.queries[i];
+
+ $( '<tr>' )
+ .append( $( '<td>' ).text( i + 1 ) )
+ .append( $( '<td>' ).text( query.sql ) )
+ .append( $( '<td class="stats">' ).text( ( query.time * 1000 ).toFixed( 4 ) + 'ms' ) )
+ .append( $( '<td>' ).text( query['function'] ) )
+ .appendTo( $table );
+ }
+
+
+ return $table;
+ },
+
+ /**
+ * Legacy debug log pane
+ */
+ buildDebugLogTable: function () {
+ var $list, i, length, line;
+ $list = $( '<ul>' );
+
+ for ( i = 0, length = this.data.debugLog.length; i < length; i += 1 ) {
+ line = this.data.debugLog[i];
+ $( '<li>' )
+ .html( mw.html.escape( line ).replace( /\n/g, "<br />\n" ) )
+ .appendTo( $list );
+ }
+
+ return $list;
+ },
+
+ /**
+ * Request information pane
+ */
+ buildRequestPane: function () {
+
+ function buildTable( title, data ) {
+ var $unit, $table, key;
+
+ $unit = $( '<div>' ).append( $( '<h2>' ).text( title ) );
+
+ $table = $( '<table>' ).appendTo( $unit );
+
+ $( '<tr>' )
+ .html( '<th>Key</th><th>Value</th>' )
+ .appendTo( $table );
+
+ for ( key in data ) {
+ if ( !data.hasOwnProperty( key ) ) {
+ continue;
+ }
+
+ $( '<tr>' )
+ .append( $( '<th>' ).text( key ) )
+ .append( $( '<td>' ).text( data[key] ) )
+ .appendTo( $table );
+ }
+
+ return $unit;
+ }
+
+ return $( '<div>' )
+ .text( this.data.request.method + ' ' + this.data.request.url )
+ .append( buildTable( 'Headers', this.data.request.headers ) )
+ .append( buildTable( 'Parameters', this.data.request.params ) );
+ },
+
+ /**
+ * Included files pane
+ */
+ buildIncludesPane: function () {
+ var $table, i, length, file;
+
+ $table = $( '<table>' );
+
+ for ( i = 0, length = this.data.includes.length; i < length; i += 1 ) {
+ file = this.data.includes[i];
+ $( '<tr>' )
+ .append( $( '<td>' ).text( file.name ) )
+ .append( $( '<td class="nr">' ).text( file.size ) )
+ .appendTo( $table );
+ }
+
+ return $table;
+ }
+ };
+
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki/mediawiki.feedback.css b/resources/mediawiki/mediawiki.feedback.css
new file mode 100644
index 00000000..6bd47bb2
--- /dev/null
+++ b/resources/mediawiki/mediawiki.feedback.css
@@ -0,0 +1,9 @@
+.feedback-spinner {
+ display: inline-block;
+ zoom: 1;
+ *display: inline; /* IE7 and below */
+ /* @embed */
+ background: url(mediawiki.feedback.spinner.gif);
+ width: 18px;
+ height: 18px;
+}
diff --git a/resources/mediawiki/mediawiki.feedback.js b/resources/mediawiki/mediawiki.feedback.js
new file mode 100644
index 00000000..9a4a7298
--- /dev/null
+++ b/resources/mediawiki/mediawiki.feedback.js
@@ -0,0 +1,242 @@
+/**
+ * mediawiki.Feedback
+ *
+ * @author Ryan Kaldari, 2010
+ * @author Neil Kandalgaonkar, 2010-11
+ * @since 1.19
+ *
+ * This is a way of getting simple feedback from users. It's useful
+ * for testing new features -- users can give you feedback without
+ * the difficulty of opening a whole new talk page. For this reason,
+ * it also tends to collect a wider range of both positive and negative
+ * comments. However you do need to tend to the feedback page. It will
+ * get long relatively quickly, and you often get multiple messages
+ * reporting the same issue.
+ *
+ * It takes the form of thing on your page which, when clicked, opens a small
+ * dialog box. Submitting that dialog box appends its contents to a
+ * wiki page that you specify, as a new section.
+ *
+ * Not compatible with LiquidThreads.
+ *
+ * Minimal example in how to use it:
+ *
+ * var feedback = new mw.Feedback();
+ * $( '#myButton' ).click( function() { feedback.launch(); } );
+ *
+ * You can also launch the feedback form with a prefilled subject and body.
+ * See the docs for the launch() method.
+ */
+( function( mw, $, undefined ) {
+ /**
+ * Thingy for collecting user feedback on a wiki page
+ * @param {Array} options -- optional, all properties optional.
+ * api: {mw.Api} if omitted, will just create a standard API
+ * title: {mw.Title} the title of the page where you collect feedback. Defaults to "Feedback".
+ * dialogTitleMessageKey: {String} message key for the title of the dialog box
+ * bugsLink: {mw.Uri|String} url where bugs can be posted
+ * bugsListLink: {mw.Uri|String} url where bugs can be listed
+ */
+ mw.Feedback = function( options ) {
+ if ( options === undefined ) {
+ options = {};
+ }
+
+ if ( options.api === undefined ) {
+ options.api = new mw.Api();
+ }
+
+ if ( options.title === undefined ) {
+ options.title = new mw.Title( 'Feedback' );
+ }
+
+ if ( options.dialogTitleMessageKey === undefined ) {
+ options.dialogTitleMessageKey = 'feedback-submit';
+ }
+
+ if ( options.bugsLink === undefined ) {
+ options.bugsLink = '//bugzilla.wikimedia.org/enter_bug.cgi';
+ }
+
+ if ( options.bugsListLink === undefined ) {
+ options.bugsListLink = '//bugzilla.wikimedia.org/query.cgi';
+ }
+
+ $.extend( this, options );
+ this.setup();
+ };
+
+ mw.Feedback.prototype = {
+ setup: function() {
+ var _this = this;
+
+ var $feedbackPageLink = $( '<a></a>' )
+ .attr( { 'href': _this.title.getUrl(), 'target': '_blank' } )
+ .css( { 'white-space': 'nowrap' } );
+
+ var $bugNoteLink = $( '<a></a>' ).attr( { 'href': '#' } ).click( function() { _this.displayBugs(); } );
+
+ var $bugsListLink = $( '<a></a>' ).attr( { 'href': _this.bugsListLink, 'target': '_blank' } );
+
+ this.$dialog =
+ $( '<div style="position:relative;"></div>' ).append(
+ $( '<div class="feedback-mode feedback-form"></div>' ).append(
+ $( '<small></small>' ).append(
+ $( '<p></p>' ).msg(
+ 'feedback-bugornote',
+ $bugNoteLink,
+ _this.title.getNameText(),
+ $feedbackPageLink.clone()
+ )
+ ),
+ $( '<div style="margin-top:1em;"></div>' ).append(
+ mw.msg( 'feedback-subject' ),
+ $( '<br/>' ),
+ $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width:99%;"/>' )
+ ),
+ $( '<div style="margin-top:0.4em;"></div>' ).append(
+ mw.msg( 'feedback-message' ),
+ $( '<br/>' ),
+ $( '<textarea name="message" class="feedback-message" style="width:99%;" rows="5" cols="60"></textarea>' )
+ )
+ ),
+ $( '<div class="feedback-mode feedback-bugs"></div>' ).append(
+ $( '<p>' ).msg( 'feedback-bugcheck', $bugsListLink )
+ ),
+ $( '<div class="feedback-mode feedback-submitting" style="text-align:center;margin:3em 0;"></div>' ).append(
+ mw.msg( 'feedback-adding' ),
+ $( '<br/>' ),
+ $( '<span class="feedback-spinner"></span>' )
+ ),
+ $( '<div class="feedback-mode feedback-thanks" style="text-align:center;margin:1em"></div>' ).msg(
+ 'feedback-thanks', _this.title.getNameText(), $feedbackPageLink.clone()
+ ),
+ $( '<div class="feedback-mode feedback-error" style="position:relative;"></div>' ).append(
+ $( '<div class="feedback-error-msg style="color:#990000;margin-top:0.4em;"></div>' )
+ )
+ );
+
+ // undo some damage from dialog css
+ this.$dialog.find( 'a' ).css( { 'color': '#0645ad' } );
+
+ this.$dialog.dialog({
+ width: 500,
+ autoOpen: false,
+ title: mw.msg( this.dialogTitleMessageKey ),
+ modal: true,
+ buttons: _this.buttons
+ });
+
+ this.subjectInput = this.$dialog.find( 'input.feedback-subject' ).get(0);
+ this.messageInput = this.$dialog.find( 'textarea.feedback-message' ).get(0);
+
+ },
+
+ display: function( s ) {
+ this.$dialog.dialog( { buttons:{} } ); // hide the buttons
+ this.$dialog.find( '.feedback-mode' ).hide(); // hide everything
+ this.$dialog.find( '.feedback-' + s ).show(); // show the desired div
+ },
+
+ displaySubmitting: function() {
+ this.display( 'submitting' );
+ },
+
+ displayBugs: function() {
+ var _this = this;
+ this.display( 'bugs' );
+ var bugsButtons = {};
+ bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function() { window.open( _this.bugsLink, '_blank' ); };
+ bugsButtons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); };
+ this.$dialog.dialog( { buttons: bugsButtons } );
+ },
+
+ displayThanks: function() {
+ var _this = this;
+ this.display( 'thanks' );
+ var closeButton = {};
+ closeButton[ mw.msg( 'feedback-close' ) ] = function() { _this.$dialog.dialog( 'close' ); };
+ this.$dialog.dialog( { buttons: closeButton } );
+ },
+
+ /**
+ * Display the feedback form
+ * @param {Object} optional prefilled contents for the feedback form. Object with properties:
+ * subject: {String}
+ * message: {String}
+ */
+ displayForm: function( contents ) {
+ var _this = this;
+ this.subjectInput.value = (contents && contents.subject) ? contents.subject : '';
+ this.messageInput.value = (contents && contents.message) ? contents.message : '';
+
+ this.display( 'form' );
+
+ // Set up buttons for dialog box. We have to do it the hard way since the json keys are localized
+ var formButtons = {};
+ formButtons[ mw.msg( 'feedback-submit' ) ] = function() { _this.submit(); };
+ formButtons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); };
+ this.$dialog.dialog( { buttons: formButtons } ); // put the buttons back
+ },
+
+ displayError: function( message ) {
+ var _this = this;
+ this.display( 'error' );
+ this.$dialog.find( '.feedback-error-msg' ).msg( message );
+ var closeButton = {};
+ closeButton[ mw.msg( 'feedback-close' ) ] = function() { _this.$dialog.dialog( 'close' ); };
+ this.$dialog.dialog( { buttons: closeButton } );
+ },
+
+ cancel: function() {
+ this.$dialog.dialog( 'close' );
+ },
+
+ submit: function() {
+ var _this = this;
+
+ // get the values to submit
+ var subject = this.subjectInput.value;
+
+ var message = "<small>User agent: " + navigator.userAgent + "</small>\n\n"
+ + this.messageInput.value;
+ if ( message.indexOf( '~~~' ) == -1 ) {
+ message += " ~~~~";
+ }
+
+ this.displaySubmitting();
+
+ var ok = function( result ) {
+ if ( result.edit !== undefined ) {
+ if ( result.edit.result === 'Success' ) {
+ _this.displayThanks();
+ } else {
+ _this.displayError( 'feedback-error1' ); // unknown API result
+ }
+ } else {
+ _this.displayError( 'feedback-error2' ); // edit failed
+ }
+ };
+
+ var err = function( code, info ) {
+ _this.displayError( 'feedback-error3' ); // ajax request failed
+ };
+
+ this.api.newSection( this.title, subject, message, ok, err );
+ }, // close submit button function
+
+ /**
+ * Modify the display form, and then open it, focusing interface on the subject.
+ * @param {Object} optional prefilled contents for the feedback form. Object with properties:
+ * subject: {String}
+ * message: {String}
+ */
+ launch: function( contents ) {
+ this.displayForm( contents );
+ this.$dialog.dialog( 'open' );
+ this.subjectInput.focus();
+ }
+
+ };
+
+} )( window.mediaWiki, jQuery );
diff --git a/resources/mediawiki/mediawiki.feedback.spinner.gif b/resources/mediawiki/mediawiki.feedback.spinner.gif
new file mode 100644
index 00000000..aed0ea41
--- /dev/null
+++ b/resources/mediawiki/mediawiki.feedback.spinner.gif
Binary files differ
diff --git a/resources/mediawiki/mediawiki.htmlform.js b/resources/mediawiki/mediawiki.htmlform.js
index 1a6acd6f..17a02cf4 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( $ ) {
/**
* jQuery plugin to fade or snap to visible state.
@@ -10,7 +10,7 @@
* @return jQuery
*/
$.fn.goIn = function( instantToggle ) {
- if ( instantToggle !== undefined && instantToggle === true ) {
+ if ( instantToggle === true ) {
return $(this).show();
}
return $(this).stop( true, true ).fadeIn();
@@ -23,7 +23,7 @@ $.fn.goIn = function( instantToggle ) {
* @return jQuery
*/
$.fn.goOut = function( instantToggle ) {
- if ( instantToggle !== undefined && instantToggle === true ) {
+ if ( instantToggle === true ) {
return $(this).hide();
}
return $(this).stop( true, true ).fadeOut();
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.js b/resources/mediawiki/mediawiki.jqueryMsg.js
new file mode 100644
index 00000000..6c00bd15
--- /dev/null
+++ b/resources/mediawiki/mediawiki.jqueryMsg.js
@@ -0,0 +1,685 @@
+/**
+ * Experimental advanced wikitext parser-emitter.
+ * See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
+ *
+ * @author neilk@wikimedia.org
+ */
+
+( function( mw, $, undefined ) {
+
+ mw.jqueryMsg = {};
+
+ /**
+ * 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}
+ */
+ function getFailableParserFn( options ) {
+ var parser = new mw.jqueryMsg.parser( options );
+ /**
+ * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
+ * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
+ * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
+ *
+ * @param {Array} first element is the key, replacements may be in array in 2nd element, or remaining elements.
+ * @return {jQuery}
+ */
+ return function( args ) {
+ var key = args[0];
+ var argsArray = $.isArray( args[1] ) ? args[1] : $.makeArray( args ).slice( 1 );
+ var escapedArgsArray = $.map( argsArray, function( arg ) {
+ return typeof arg === 'string' ? mw.html.escape( arg ) : arg;
+ } );
+ try {
+ return parser.parse( key, escapedArgsArray );
+ } catch ( e ) {
+ return $( '<span></span>' ).append( key + ': ' + e.message );
+ }
+ };
+ }
+
+ /**
+ * Class method.
+ * Returns a function suitable for use as a global, to construct strings from the message key (and optional replacements).
+ * e.g.
+ * window.gM = mediaWiki.parser.getMessageFunction( options );
+ * $( 'p#headline' ).html( gM( 'hello-user', username ) );
+ *
+ * Like the old gM() function this returns only strings, so it destroys any bindings. If you want to preserve bindings use the
+ * jQuery plugin version instead. This is only included for backwards compatibility with gM().
+ *
+ * @param {Array} parser options
+ * @return {Function} function suitable for assigning to window.gM
+ */
+ mw.jqueryMsg.getMessageFunction = function( options ) {
+ var failableParserFn = getFailableParserFn( options );
+ /**
+ * N.B. replacements are variadic arguments or an array in second parameter. In other words:
+ * somefunction(a, b, c, d)
+ * is equivalent to
+ * somefunction(a, [b, c, d])
+ *
+ * @param {String} message key
+ * @param {Array} optional replacements (can also specify variadically)
+ * @return {String} rendered HTML as string
+ */
+ return function( /* key, replacements */ ) {
+ return failableParserFn( arguments ).html();
+ };
+ };
+
+ /**
+ * Class method.
+ * Returns a jQuery plugin which parses the message in the message key, doing replacements optionally, and appends the nodes to
+ * the current selector. Bindings to passed-in jquery elements are preserved. Functions become click handlers for [$1 linktext] links.
+ * e.g.
+ * $.fn.msg = mediaWiki.parser.getJqueryPlugin( options );
+ * var userlink = $( '<a>' ).click( function() { alert( "hello!!") } );
+ * $( 'p#headline' ).msg( 'hello-user', userlink );
+ *
+ * @param {Array} parser options
+ * @return {Function} function suitable for assigning to jQuery plugin, such as $.fn.msg
+ */
+ mw.jqueryMsg.getPlugin = function( options ) {
+ var failableParserFn = getFailableParserFn( options );
+ /**
+ * N.B. replacements are variadic arguments or an array in second parameter. In other words:
+ * somefunction(a, b, c, d)
+ * is equivalent to
+ * somefunction(a, [b, c, d])
+ *
+ * We append to 'this', which in a jQuery plugin context will be the selected elements.
+ * @param {String} message key
+ * @param {Array} optional replacements (can also specify variadically)
+ * @return {jQuery} this
+ */
+ return function( /* key, replacements */ ) {
+ var $target = this.empty();
+ $.each( failableParserFn( arguments ).contents(), function( i, node ) {
+ $target.append( node );
+ } );
+ return $target;
+ };
+ };
+
+ var parserDefaults = {
+ 'magic' : {},
+ 'messages' : mw.messages,
+ 'language' : mw.language
+ };
+
+ /**
+ * The parser itself.
+ * Describes an object, whose primary duty is to .parse() message keys.
+ * @param {Array} options
+ */
+ mw.jqueryMsg.parser = function( options ) {
+ this.settings = $.extend( {}, parserDefaults, options );
+ this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
+ };
+
+ mw.jqueryMsg.parser.prototype = {
+
+ // cache, map of mediaWiki message key to the AST of the message. In most cases, the message is a string so this is identical.
+ // (This is why we would like to move this functionality server-side).
+ astCache: {},
+
+ /**
+ * Where the magic happens.
+ * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
+ * If an error is thrown, returns original key, and logs the error
+ * @param {String} message key
+ * @param {Array} replacements for $1, $2... $n
+ * @return {jQuery}
+ */
+ parse: function( key, replacements ) {
+ return this.emitter.emit( this.getAst( key ), replacements );
+ },
+
+ /**
+ * Fetch the message string associated with a key, return parsed structure. Memoized.
+ * Note that we pass '[' + key + ']' back for a missing message here.
+ * @param {String} key
+ * @return {String|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
+ */
+ getAst: function( key ) {
+ if ( this.astCache[ key ] === undefined ) {
+ var wikiText = this.settings.messages.get( key );
+ if ( typeof wikiText !== 'string' ) {
+ wikiText = "\\[" + key + "\\]";
+ }
+ this.astCache[ key ] = this.wikiTextToAst( wikiText );
+ }
+ return this.astCache[ key ];
+ },
+
+ /*
+ * Parses the input wikiText into an abstract syntax tree, essentially an s-expression.
+ *
+ * CAVEAT: This does not parse all wikitext. It could be more efficient, but it's pretty good already.
+ * n.b. We want to move this functionality to the server. Nothing here is required to be on the client.
+ *
+ * @param {String} message string wikitext
+ * @throws Error
+ * @return {Mixed} abstract syntax tree
+ */
+ wikiTextToAst: function( input ) {
+
+ // Indicates current position in input as we parse through it.
+ // Shared among all parsing functions below.
+ var pos = 0;
+
+ // =========================================================
+ // parsing combinators - could be a library on its own
+ // =========================================================
+
+
+ // Try parsers until one works, if none work return null
+ function choice( ps ) {
+ return function() {
+ for ( var i = 0; i < ps.length; i++ ) {
+ var result = ps[i]();
+ if ( result !== null ) {
+ return result;
+ }
+ }
+ return null;
+ };
+ }
+
+ // try several ps in a row, all must succeed or return null
+ // this is the only eager one
+ function sequence( ps ) {
+ var originalPos = pos;
+ var result = [];
+ for ( var i = 0; i < ps.length; i++ ) {
+ var res = ps[i]();
+ if ( res === null ) {
+ pos = originalPos;
+ return null;
+ }
+ result.push( res );
+ }
+ return result;
+ }
+
+ // run the same parser over and over until it fails.
+ // must succeed a minimum of n times or return null
+ function nOrMore( n, p ) {
+ return function() {
+ var originalPos = pos;
+ var result = [];
+ var parsed = p();
+ while ( parsed !== null ) {
+ result.push( parsed );
+ parsed = p();
+ }
+ if ( result.length < n ) {
+ pos = originalPos;
+ return null;
+ }
+ return result;
+ };
+ }
+
+ // There is a general pattern -- parse a thing, if that worked, apply transform, otherwise return null.
+ // But using this as a combinator seems to cause problems when combined with nOrMore().
+ // May be some scoping issue
+ function transform( p, fn ) {
+ return function() {
+ var result = p();
+ return result === null ? null : fn( result );
+ };
+ }
+
+ // Helpers -- just make ps out of simpler JS builtin types
+
+ function makeStringParser( s ) {
+ var len = s.length;
+ return function() {
+ var result = null;
+ if ( input.substr( pos, len ) === s ) {
+ result = s;
+ pos += len;
+ }
+ return result;
+ };
+ }
+
+ function makeRegexParser( regex ) {
+ return function() {
+ var matches = input.substr( pos ).match( regex );
+ if ( matches === null ) {
+ return null;
+ }
+ pos += matches[0].length;
+ return matches[0];
+ };
+ }
+
+
+ /**
+ * ===================================================================
+ * General patterns above this line -- wikitext specific parsers below
+ * ===================================================================
+ */
+
+ // Parsing functions follow. All parsing functions work like this:
+ // They don't accept any arguments.
+ // Instead, they just operate non destructively on the string 'input'
+ // As they can consume parts of the string, they advance the shared variable pos,
+ // and return tokens (or whatever else they want to return).
+
+ // some things are defined as closures and other things as ordinary functions
+ // converting everything to a closure makes it a lot harder to debug... errors pop up
+ // 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
+
+
+ var regularLiteral = makeRegexParser( /^[^{}[\]$\\]/ );
+ var regularLiteralWithoutBar = makeRegexParser(/^[^{}[\]$\\|]/);
+ var regularLiteralWithoutSpace = makeRegexParser(/^[^{}[\]$\s]/);
+
+ var backslash = makeStringParser( "\\" );
+ var anyCharacter = makeRegexParser( /^./ );
+
+ function escapedLiteral() {
+ var result = sequence( [
+ backslash,
+ anyCharacter
+ ] );
+ return result === null ? null : result[1];
+ }
+
+ var escapedOrLiteralWithoutSpace = choice( [
+ escapedLiteral,
+ regularLiteralWithoutSpace
+ ] );
+
+ var escapedOrLiteralWithoutBar = choice( [
+ escapedLiteral,
+ regularLiteralWithoutBar
+ ] );
+
+ var escapedOrRegularLiteral = choice( [
+ escapedLiteral,
+ regularLiteral
+ ] );
+
+ // Used to define "literals" without spaces, in space-delimited situations
+ function literalWithoutSpace() {
+ var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
+ return result === null ? null : result.join('');
+ }
+
+ // Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default
+ // it is not a literal in the parameter
+ function literalWithoutBar() {
+ var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
+ return result === null ? null : result.join('');
+ }
+
+ function literal() {
+ var result = nOrMore( 1, escapedOrRegularLiteral )();
+ return result === null ? null : result.join('');
+ }
+
+ var whitespace = makeRegexParser( /^\s+/ );
+ var dollar = makeStringParser( '$' );
+ var digits = makeRegexParser( /^\d+/ );
+
+ function replacement() {
+ var result = sequence( [
+ dollar,
+ digits
+ ] );
+ if ( result === null ) {
+ return null;
+ }
+ return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+ }
+
+
+ var openExtlink = makeStringParser( '[' );
+ var closeExtlink = makeStringParser( ']' );
+
+ // this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
+ function extlink() {
+ var result = null;
+ var parsedResult = sequence( [
+ openExtlink,
+ nonWhitespaceExpression,
+ whitespace,
+ expression,
+ closeExtlink
+ ] );
+ if ( parsedResult !== null ) {
+ result = [ 'LINK', parsedResult[1], parsedResult[3] ];
+ }
+ return result;
+ }
+
+ var openLink = makeStringParser( '[[' );
+ var closeLink = makeStringParser( ']]' );
+
+ function link() {
+ var result = null;
+ var parsedResult = sequence( [
+ openLink,
+ expression,
+ closeLink
+ ] );
+ if ( parsedResult !== null ) {
+ result = [ 'WLINK', parsedResult[1] ];
+ }
+ return result;
+ }
+
+ var templateName = transform(
+ // see $wgLegalTitleChars
+ // not allowing : due to the need to catch "PLURAL:$1"
+ makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+-]+/ ),
+ function( result ) { return result.toString(); }
+ );
+
+ function templateParam() {
+ var result = sequence( [
+ pipe,
+ nOrMore( 0, paramExpression )
+ ] );
+ if ( result === null ) {
+ return null;
+ }
+ var expr = result[1];
+ // use a "CONCAT" operator if there are multiple nodes, otherwise return the first node, raw.
+ return expr.length > 1 ? [ "CONCAT" ].concat( expr ) : expr[0];
+ }
+
+ var pipe = makeStringParser( '|' );
+
+ function templateWithReplacement() {
+ var result = sequence( [
+ templateName,
+ colon,
+ replacement
+ ] );
+ return result === null ? null : [ result[0], result[2] ];
+ }
+
+ var colon = makeStringParser(':');
+
+ var templateContents = choice( [
+ function() {
+ var res = sequence( [
+ templateWithReplacement,
+ nOrMore( 0, templateParam )
+ ] );
+ return res === null ? null : res[0].concat( res[1] );
+ },
+ function() {
+ var res = sequence( [
+ templateName,
+ nOrMore( 0, templateParam )
+ ] );
+ if ( res === null ) {
+ return null;
+ }
+ return [ res[0] ].concat( res[1] );
+ }
+ ] );
+
+ var openTemplate = makeStringParser('{{');
+ var closeTemplate = makeStringParser('}}');
+
+ function template() {
+ var result = sequence( [
+ openTemplate,
+ templateContents,
+ closeTemplate
+ ] );
+ return result === null ? null : result[1];
+ }
+
+ var nonWhitespaceExpression = choice( [
+ template,
+ link,
+ extlink,
+ replacement,
+ literalWithoutSpace
+ ] );
+
+ var paramExpression = choice( [
+ template,
+ link,
+ extlink,
+ replacement,
+ literalWithoutBar
+ ] );
+
+ var expression = choice( [
+ template,
+ link,
+ extlink,
+ replacement,
+ literal
+ ] );
+
+ function start() {
+ var result = nOrMore( 0, expression )();
+ if ( result === null ) {
+ return null;
+ }
+ return [ "CONCAT" ].concat( result );
+ }
+
+ // everything above this point is supposed to be stateless/static, but
+ // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
+
+ // finally let's do some actual work...
+
+ var result = start();
+
+ /*
+ * For success, the p must have gotten to the end of the input
+ * and returned a non-null.
+ * n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
+ */
+ if (result === null || pos !== input.length) {
+ throw new Error( "Parse error at position " + pos.toString() + " in input: " + input );
+ }
+ return result;
+ }
+
+ };
+
+ /**
+ * htmlEmitter - object which primarily exists to emit HTML from parser ASTs
+ */
+ mw.jqueryMsg.htmlEmitter = function( language, magic ) {
+ this.language = language;
+ var _this = this;
+
+ $.each( magic, function( key, val ) {
+ _this[ key.toLowerCase() ] = function() { return val; };
+ } );
+
+ /**
+ * (We put this method definition here, and not in prototype, to make sure it's not overwritten by any magic.)
+ * Walk entire node structure, applying replacements and template functions when appropriate
+ * @param {Mixed} abstract syntax tree (top node or subnode)
+ * @param {Array} replacements for $1, $2, ... $n
+ * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
+ */
+ this.emit = function( node, replacements ) {
+ var ret = null;
+ var _this = this;
+ switch( typeof node ) {
+ case 'string':
+ case 'number':
+ ret = node;
+ break;
+ case 'object': // node is an array of nodes
+ var subnodes = $.map( node.slice( 1 ), function( n ) {
+ return _this.emit( n, replacements );
+ } );
+ var operation = node[0].toLowerCase();
+ if ( typeof _this[operation] === 'function' ) {
+ ret = _this[ operation ]( subnodes, replacements );
+ } else {
+ throw new Error( 'unknown operation "' + operation + '"' );
+ }
+ break;
+ case 'undefined':
+ // Parsing the empty string (as an entire expression, or as a paramExpression in a template) results in undefined
+ // Perhaps a more clever parser can detect this, and return the empty string? Or is that useful information?
+ // The logical thing is probably to return the empty string here when we encounter undefined.
+ ret = '';
+ break;
+ default:
+ throw new Error( 'unexpected type in AST: ' + typeof node );
+ }
+ return ret;
+ };
+
+ };
+
+ // For everything in input that follows double-open-curly braces, there should be an equivalent parser
+ // function. For instance {{PLURAL ... }} will be processed by 'plural'.
+ // If you have 'magic words' then configure the parser to have them upon creation.
+ //
+ // An emitter method takes the parent node, the array of subnodes and the array of replacements (the values that $1, $2... should translate to).
+ // Note: all such functions must be pure, with the exception of referring to other pure functions via this.language (convertPlural and so on)
+ mw.jqueryMsg.htmlEmitter.prototype = {
+
+ /**
+ * Parsing has been applied depth-first we can assume that all nodes here are single nodes
+ * Must return a single node to parents -- a jQuery with synthetic span
+ * However, unwrap any other synthetic spans in our children and pass them upwards
+ * @param {Array} nodes - mixed, some single nodes, some arrays of nodes
+ * @return {jQuery}
+ */
+ concat: function( nodes ) {
+ var span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
+ $.each( nodes, function( i, node ) {
+ if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+ $.each( node.contents(), function( j, childNode ) {
+ span.append( childNode );
+ } );
+ } else {
+ // strings, integers, anything else
+ span.append( node );
+ }
+ } );
+ return span;
+ },
+
+ /**
+ * Return replacement of correct index, or string if unavailable.
+ * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
+ * if the specified parameter is not found return the same string
+ * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
+ * TODO throw error if nodes.length > 1 ?
+ * @param {Array} of one element, integer, n >= 0
+ * @return {String} replacement
+ */
+ replace: function( nodes, replacements ) {
+ var index = parseInt( nodes[0], 10 );
+ return index < replacements.length ? replacements[index] : '$' + ( index + 1 );
+ },
+
+ /**
+ * Transform wiki-link
+ * TODO unimplemented
+ */
+ wlink: function( nodes ) {
+ return "unimplemented";
+ },
+
+ /**
+ * 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
+ * ... string, treat it as a URI
+ * TODO: throw an error if nodes.length > 2 ?
+ * @param {Array} of two elements, {jQuery|Function|String} and {String}
+ * @return {jQuery}
+ */
+ link: function( nodes ) {
+ var arg = nodes[0];
+ var contents = nodes[1];
+ var $el;
+ if ( arg instanceof jQuery ) {
+ $el = arg;
+ } else {
+ $el = $( '<a>' );
+ if ( typeof arg === 'function' ) {
+ $el.click( arg ).attr( 'href', '#' );
+ } else {
+ $el.attr( 'href', arg.toString() );
+ }
+ }
+ $el.append( contents );
+ return $el;
+ },
+
+ /**
+ * Transform parsed structure into pluralization
+ * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
+ * So convert it back with the current language's convertNumber.
+ * @param {Array} of nodes, [ {String|Number}, {String}, {String} ... ]
+ * @return {String} selected pluralized form according to current language
+ */
+ plural: function( nodes ) {
+ var count = parseInt( this.language.convertNumber( nodes[0], true ), 10 );
+ var forms = nodes.slice(1);
+ return forms.length ? this.language.convertPlural( count, forms ) : '';
+ },
+
+ /**
+ * Transform parsed structure into gender
+ * Usage {{gender:[gender| mw.user object ] | masculine|feminine|neutral}}.
+ * @param {Array} of nodes, [ {String|mw.User}, {String}, {String} , {String} ]
+ * @return {String} selected gender form according to current language
+ */
+ gender: function( nodes ) {
+ var gender;
+ if ( nodes[0] && nodes[0].options instanceof mw.Map ){
+ gender = nodes[0].options.get( 'gender' );
+ } else {
+ gender = nodes[0];
+ }
+ var forms = nodes.slice(1);
+ return this.language.gender( gender, forms );
+ }
+
+ };
+
+ // TODO figure out a way to make magic work with common globals like wgSiteName, without requiring init from library users...
+ // var options = { magic: { 'SITENAME' : mw.config.get( 'wgSiteName' ) } };
+
+ // deprecated! don't rely on gM existing.
+ // the window.gM ought not to be required - or if required, not required here. But moving it to extensions breaks it (?!)
+ // Need to fix plugin so it could do attributes as well, then will be okay to remove this.
+ window.gM = mw.jqueryMsg.getMessageFunction();
+
+ $.fn.msg = mw.jqueryMsg.getPlugin();
+
+ // Replace the default message parser with jqueryMsg
+ var oldParser = mw.Message.prototype.parser;
+ mw.Message.prototype.parser = function() {
+ // TODO: should we cache the message function so we don't create a new one every time? Benchmark this maybe?
+ // 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.map.get( this.key ).indexOf( '{{' ) < 0 ) {
+ // Fall back to mw.msg's simple parser
+ return oldParser.apply( this );
+ }
+
+ var messageFunction = mw.jqueryMsg.getMessageFunction( { 'messages': this.map } );
+ return messageFunction( this.key, this.parameters );
+ };
+
+} )( mediaWiki, jQuery );
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.peg b/resources/mediawiki/mediawiki.jqueryMsg.peg
new file mode 100644
index 00000000..74c57e4b
--- /dev/null
+++ b/resources/mediawiki/mediawiki.jqueryMsg.peg
@@ -0,0 +1,76 @@
+/* PEG grammar for a subset of wikitext, useful in the MediaWiki frontend */
+
+start
+ = e:expression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
+
+expression
+ = template
+ / link
+ / extlink
+ / replacement
+ / literal
+
+paramExpression
+ = template
+ / link
+ / extlink
+ / replacement
+ / literalWithoutBar
+
+template
+ = "{{" t:templateContents "}}" { return t; }
+
+templateContents
+ = twr:templateWithReplacement p:templateParam* { return twr.concat(p) }
+ / t:templateName p:templateParam* { return p.length ? [ t, p ] : [ t ] }
+
+templateWithReplacement
+ = t:templateName ":" r:replacement { return [ t, r ] }
+
+templateParam
+ = "|" e:paramExpression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }
+
+templateName
+ = tn:[A-Za-z_]+ { return tn.join('').toUpperCase() }
+
+link
+ = "[[" w:expression "]]" { return [ 'WLINK', w ]; }
+
+extlink
+ = "[" url:url whitespace text:expression "]" { return [ 'LINK', url, text ] }
+
+url
+ = url:[^ ]+ { return url.join(''); }
+
+whitespace
+ = [ ]+
+
+replacement
+ = '$' digits:digits { return [ 'REPLACE', parseInt( digits, 10 ) - 1 ] }
+
+digits
+ = [0-9]+
+
+literal
+ = lit:escapedOrRegularLiteral+ { return lit.join(''); }
+
+literalWithoutBar
+ = lit:escapedOrLiteralWithoutBar+ { return lit.join(''); }
+
+escapedOrRegularLiteral
+ = escapedLiteral
+ / regularLiteral
+
+escapedOrLiteralWithoutBar
+ = escapedLiteral
+ / regularLiteralWithoutBar
+
+escapedLiteral
+ = "\\" escaped:. { return escaped; }
+
+regularLiteral
+ = [^{}\[\]$\\]
+
+regularLiteralWithoutBar
+ = [^{}\[\]$\\|]
+
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
index aca59e4e..121d5399 100644
--- a/resources/mediawiki/mediawiki.js
+++ b/resources/mediawiki/mediawiki.js
@@ -2,16 +2,12 @@
* Core MediaWiki JavaScript Library
*/
-// Attach to window
-window.mediaWiki = new ( function( $ ) {
+var mw = ( function ( $, undefined ) {
+"use strict";
/* Private Members */
- /**
- * @var object List of messages that have been requested to be loaded.
- */
- var messageQueue = {};
-
+ var hasOwn = Object.prototype.hasOwnProperty;
/* Object constructors */
/**
@@ -21,87 +17,95 @@ window.mediaWiki = new ( function( $ ) {
* that allow both single and multiple variables at once.
*
* @param global boolean Whether to store the values in the global window
- * object or a exclusively in the object property 'values'.
+ * object or a exclusively in the object property 'values'.
* @return Map
*/
function Map( global ) {
- this.values = ( global === true ) ? window : {};
+ this.values = global === true ? window : {};
return this;
}
- /**
- * Get the value of one or multiple a keys.
- *
- * 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).
- * @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
- * objects are always passed by reference in JavaScript!).
- * @return Values as a string or object, null if invalid/inexistant.
- */
- Map.prototype.get = function( selection, fallback ) {
- if ( $.isArray( selection ) ) {
- selection = $.makeArray( selection );
- var results = {};
- for ( var i = 0; i < selection.length; i++ ) {
- results[selection[i]] = this.get( selection[i], fallback );
- }
- return results;
- } else if ( typeof selection === 'string' ) {
- if ( this.values[selection] === undefined ) {
- if ( fallback !== undefined ) {
- return fallback;
+ Map.prototype = {
+ /**
+ * Get the value of one or multiple a keys.
+ *
+ * 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).
+ * @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
+ * objects are always passed by reference in JavaScript!).
+ * @return Values as a string or object, null if invalid/inexistant.
+ */
+ get: function ( selection, fallback ) {
+ var results, i;
+
+ if ( $.isArray( selection ) ) {
+ selection = $.makeArray( selection );
+ results = {};
+ for ( i = 0; i < selection.length; i += 1 ) {
+ results[selection[i]] = this.get( selection[i], fallback );
}
- return null;
+ return results;
+ } else if ( typeof selection === 'string' ) {
+ if ( this.values[selection] === undefined ) {
+ if ( fallback !== undefined ) {
+ return fallback;
+ }
+ return null;
+ }
+ return this.values[selection];
}
- return this.values[selection];
- }
- if ( selection === undefined ) {
- return this.values;
- } else {
- return null; // invalid selection key
- }
- };
+ if ( selection === undefined ) {
+ return this.values;
+ } else {
+ return null; // invalid selection key
+ }
+ },
- /**
- * 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)
- * @return bool This returns true on success, false on failure.
- */
- Map.prototype.set = function( selection, value ) {
- if ( $.isPlainObject( selection ) ) {
- for ( var s in selection ) {
- this.values[s] = selection[s];
+ /**
+ * 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)
+ * @return {Boolean} This returns true on success, false on failure.
+ */
+ set: function ( selection, value ) {
+ var s;
+
+ if ( $.isPlainObject( selection ) ) {
+ for ( s in selection ) {
+ this.values[s] = selection[s];
+ }
+ return true;
+ } else if ( typeof selection === 'string' && value !== undefined ) {
+ this.values[selection] = value;
+ return true;
}
- return true;
- } else if ( typeof selection === 'string' && value !== undefined ) {
- this.values[selection] = value;
- return true;
- }
- return false;
- };
+ return false;
+ },
- /**
- * Checks if one or multiple keys exist.
- *
- * @param selection mixed String key or array of keys to check
- * @return boolean Existence of key(s)
- */
- Map.prototype.exists = function( selection ) {
- if ( typeof selection === 'object' ) {
- for ( var s = 0; s < selection.length; s++ ) {
- if ( !( selection[s] in this.values ) ) {
- return false;
+ /**
+ * Checks if one or multiple keys exist.
+ *
+ * @param selection {mixed} String key or array of keys to check
+ * @return {Boolean} Existence of key(s)
+ */
+ exists: function ( selection ) {
+ var s;
+
+ if ( $.isArray( selection ) ) {
+ for ( s = 0; s < selection.length; s += 1 ) {
+ if ( this.values[selection[s]] === undefined ) {
+ return false;
+ }
}
+ return true;
+ } else {
+ return this.values[selection] !== undefined;
}
- return true;
- } else {
- return selection in this.values;
}
};
@@ -117,418 +121,630 @@ window.mediaWiki = new ( function( $ ) {
* @return Message
*/
function Message( map, key, parameters ) {
- this.format = 'parse';
+ this.format = 'plain';
this.map = map;
this.key = key;
this.parameters = parameters === undefined ? [] : $.makeArray( parameters );
return this;
}
- /**
- * Appends (does not replace) parameters for replacement to the .parameters property.
- *
- * @param parameters Array
- * @return Message
- */
- Message.prototype.params = function( parameters ) {
- for ( var i = 0; i < parameters.length; i++ ) {
- this.parameters.push( parameters[i] );
- }
- return this;
- };
-
- /**
- * Converts message object to it's string form based on the state of format.
- *
- * @return string Message as a string in the current form or <key> if key does not exist.
- */
- Message.prototype.toString = function() {
- if ( !this.map.exists( this.key ) ) {
- // Use <key> as text if key does not exist
- if ( this.format !== 'plain' ) {
- // format 'escape' and 'parse' need to have the brackets and key html escaped
- return mw.html.escape( '<' + this.key + '>' );
+ Message.prototype = {
+ /**
+ * Simple message parser, does $N replacement and nothing else.
+ * This may be overridden to provide a more complex message parser.
+ *
+ * This function will not be called for nonexistent messages.
+ */
+ parser: function() {
+ var parameters = this.parameters;
+ return this.map.get( this.key ).replace( /\$(\d+)/g, function ( str, match ) {
+ var index = parseInt( match, 10 ) - 1;
+ return parameters[index] !== undefined ? parameters[index] : '$' + match;
+ } );
+ },
+
+ /**
+ * Appends (does not replace) parameters for replacement to the .parameters property.
+ *
+ * @param parameters Array
+ * @return Message
+ */
+ params: function ( parameters ) {
+ var i;
+ for ( i = 0; i < parameters.length; i += 1 ) {
+ this.parameters.push( parameters[i] );
}
- return '<' + this.key + '>';
- }
- var text = this.map.get( this.key );
- var parameters = this.parameters;
- text = text.replace( /\$(\d+)/g, function( string, match ) {
- var index = parseInt( match, 10 ) - 1;
- return index in parameters ? parameters[index] : '$' + match;
- } );
-
- if ( this.format === 'plain' ) {
- return text;
- }
- if ( this.format === 'escaped' ) {
- // According to Message.php this needs {{-transformation, which is
- // still todo
- return mw.html.escape( text );
- }
-
- /* This should be fixed up when we have a parser
- if ( this.format === 'parse' && 'language' in mediaWiki ) {
- text = mw.language.parse( text );
- }
- */
- return text;
- };
-
- /**
- * Changes format to parse and converts message to string
- *
- * @return {string} String form of parsed message
- */
- Message.prototype.parse = function() {
- this.format = 'parse';
- return this.toString();
- };
-
- /**
- * Changes format to plain and converts message to string
- *
- * @return {string} String form of plain message
- */
- Message.prototype.plain = function() {
- this.format = 'plain';
- return this.toString();
- };
-
- /**
- * Changes the format to html escaped and converts message to string
- *
- * @return {string} String form of html escaped message
- */
- Message.prototype.escaped = function() {
- this.format = 'escaped';
- return this.toString();
- };
-
- /**
- * Checks if message exists
- *
- * @return {string} String form of parsed message
- */
- Message.prototype.exists = function() {
- return this.map.exists( this.key );
- };
+ return this;
+ },
- /* Public Members */
+ /**
+ * Converts message object to it's string form based on the state of format.
+ *
+ * @return string Message as a string in the current form or <key> if key does not exist.
+ */
+ toString: function() {
+ var text;
+
+ if ( !this.exists() ) {
+ // Use <key> as text if key does not exist
+ if ( this.format !== 'plain' ) {
+ // format 'escape' and 'parse' need to have the brackets and key html escaped
+ return mw.html.escape( '<' + this.key + '>' );
+ }
+ return '<' + this.key + '>';
+ }
- /*
- * Dummy function which in debug mode can be replaced with a function that
- * emulates console.log in console-less environments.
- */
- this.log = function() { };
+ if ( this.format === 'plain' ) {
+ // @todo FIXME: Although not applicable to core Message,
+ // Plugins like jQueryMsg should be able to distinguish
+ // between 'plain' (only variable replacement and plural/gender)
+ // and actually parsing wikitext to HTML.
+ text = this.parser();
+ }
- /**
- * @var constructor Make the Map-class publicly available.
- */
- this.Map = Map;
+ if ( this.format === 'escaped' ) {
+ text = this.parser();
+ text = mw.html.escape( text );
+ }
+
+ if ( this.format === 'parse' ) {
+ text = this.parser();
+ }
- /**
- * List 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.
- */
- this.config = null;
+ return text;
+ },
- /**
- * @var object
- *
- * Empty object that plugins can be installed in.
- */
- this.libs = {};
+ /**
+ * Changes format to parse and converts message to string
+ *
+ * @return {string} String form of parsed message
+ */
+ parse: function() {
+ this.format = 'parse';
+ return this.toString();
+ },
- /*
- * Localization system
- */
- this.messages = new this.Map();
+ /**
+ * Changes format to plain and converts message to string
+ *
+ * @return {string} String form of plain message
+ */
+ plain: function() {
+ this.format = 'plain';
+ return this.toString();
+ },
- /* Public Methods */
+ /**
+ * Changes the format to html escaped and converts message to string
+ *
+ * @return {string} String form of html escaped message
+ */
+ escaped: function() {
+ this.format = 'escaped';
+ return this.toString();
+ },
- /**
- * Gets a message object, similar to wfMessage()
- *
- * @param key string Key of message to get
- * @param parameter_1 mixed First argument in a list of variadic arguments,
- * each a parameter for $N replacement in messages.
- * @return Message
- */
- this.message = function( key, parameter_1 /* [, parameter_2] */ ) {
- var parameters;
- // Support variadic arguments
- if ( parameter_1 !== undefined ) {
- parameters = $.makeArray( arguments );
- parameters.shift();
- } else {
- parameters = [];
+ /**
+ * Checks if message exists
+ *
+ * @return {string} String form of parsed message
+ */
+ exists: function() {
+ return this.map.exists( this.key );
}
- return new Message( mw.messages, key, parameters );
};
- /**
- * Gets a message string, similar to wfMsg()
- *
- * @param key string Key of message to get
- * @param parameters mixed First argument in a list of variadic arguments,
- * each a parameter for $N replacement in messages.
- * @return String.
- */
- this.msg = function( key, parameters ) {
- return mw.message.apply( mw.message, arguments ).toString();
- };
+ return {
+ /* Public Members */
- /**
- * Client-side module loader which integrates with the MediaWiki ResourceLoader
- */
- this.loader = new ( function() {
-
- /* Private Members */
+ /**
+ * Dummy function which in debug mode can be replaced with a function that
+ * emulates console.log in console-less environments.
+ */
+ log: function() { },
+
+ /**
+ * @var constructor Make the Map constructor publicly available.
+ */
+ Map: Map,
/**
- * Mapping of registered modules
+ * @var constructor Make the Message constructor publicly available.
+ */
+ Message: Message,
+
+ /**
+ * List of configuration values
*
- * The jquery module is pre-registered, because it must have already
- * been provided for this object to have been built, and in debug mode
- * jquery would have been provided through a unique loader request,
- * making it impossible to hold back registration of jquery until after
- * mediawiki.
+ * 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.
+ */
+ config: null,
+
+ /**
+ * @var object
*
- * Format:
- * {
- * 'moduleName': {
- * 'dependencies': ['required module', 'required module', ...], (or) function() {}
- * 'state': 'registered', 'loading', 'loaded', 'ready', or 'error'
- * 'script': function() {},
- * 'style': 'css code string',
- * 'messages': { 'key': 'value' },
- * 'version': ############## (unix timestamp)
- * }
- * }
+ * Empty object that plugins can be installed in.
*/
- var registry = {};
- // List of modules which will be loaded as when ready
- var batch = [];
- // List of modules to be loaded
- var queue = [];
- // List of callback functions waiting for modules to be ready to be called
- var jobs = [];
- // Flag inidicating that document ready has occured
- var ready = false;
- // Selector cache for the marker element. Use getMarker() to get/use the marker!
- var $marker = null;
-
- /* Private Methods */
-
- function getMarker(){
- // Cached ?
- if ( $marker ) {
- return $marker;
+ libs: {},
+
+ /* Extension points */
+
+ legacy: {},
+
+ /**
+ * Localization system
+ */
+ messages: new Map(),
+
+ /* Public Methods */
+
+ /**
+ * Gets a message object, similar to wfMessage()
+ *
+ * @param key string Key of message to get
+ * @param parameter_1 mixed First argument in a list of variadic arguments,
+ * each a parameter for $N replacement in messages.
+ * @return Message
+ */
+ message: function ( key, parameter_1 /* [, parameter_2] */ ) {
+ var parameters;
+ // Support variadic arguments
+ if ( parameter_1 !== undefined ) {
+ parameters = $.makeArray( arguments );
+ parameters.shift();
} else {
- $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
- if ( $marker.length ) {
+ parameters = [];
+ }
+ return new Message( mw.messages, key, parameters );
+ },
+
+ /**
+ * Gets a message string, similar to wfMsg()
+ *
+ * @param key string Key of message to get
+ * @param parameters mixed First argument in a list of variadic arguments,
+ * each a parameter for $N replacement in messages.
+ * @return String.
+ */
+ msg: function ( key, parameters ) {
+ return mw.message.apply( mw.message, arguments ).toString();
+ },
+
+ /**
+ * Client-side module loader which integrates with the MediaWiki ResourceLoader
+ */
+ loader: ( function() {
+
+ /* Private Members */
+
+ /**
+ * Mapping of registered modules
+ *
+ * The jquery module is pre-registered, because it must have already
+ * been provided for this object to have been built, and in debug mode
+ * jquery would have been provided through a unique loader request,
+ * making it impossible to hold back registration of jquery until after
+ * mediawiki.
+ *
+ * For exact details on support for script, style and messages, look at
+ * mw.loader.implement.
+ *
+ * Format:
+ * {
+ * 'moduleName': {
+ * 'version': ############## (unix timestamp),
+ * 'dependencies': ['required.foo', 'bar.also', ...], (or) function() {}
+ * 'group': 'somegroup', (or) null,
+ * 'source': 'local', 'someforeignwiki', (or) null
+ * 'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
+ * 'script': ...,
+ * 'style': ...,
+ * 'messages': { 'key': 'value' },
+ * }
+ * }
+ */
+ var registry = {},
+ /**
+ * Mapping of sources, keyed by source-id, values are objects.
+ * Format:
+ * {
+ * 'sourceId': {
+ * 'loadScript': 'http://foo.bar/w/load.php'
+ * }
+ * }
+ */
+ sources = {},
+ // List of modules which will be loaded as when ready
+ batch = [],
+ // List of modules to be loaded
+ queue = [],
+ // List of callback functions waiting for modules to be ready to be called
+ jobs = [],
+ // Flag indicating that document ready has occured
+ ready = false,
+ // Selector cache for the marker element. Use getMarker() to get/use the marker!
+ $marker = null;
+
+ /* Cache document ready status */
+
+ $(document).ready( function () {
+ ready = true;
+ } );
+
+ /* Private methods */
+
+ function getMarker() {
+ // Cached ?
+ if ( $marker ) {
+ return $marker;
+ } else {
+ $marker = $( 'meta[name="ResourceLoaderDynamicStyles"]' );
+ if ( $marker.length ) {
+ return $marker;
+ }
+ mw.log( 'getMarker> No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically.' );
+ $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
return $marker;
}
- mw.log( 'getMarker> No <meta name="ResourceLoaderDynamicStyles"> found, inserting dynamically.' );
- $marker = $( '<meta>' ).attr( 'name', 'ResourceLoaderDynamicStyles' ).appendTo( 'head' );
- return $marker;
- }
- }
-
- function compare( a, b ) {
- if ( a.length != b.length ) {
- return false;
}
- for ( var i = 0; i < b.length; i++ ) {
- if ( $.isArray( a[i] ) ) {
- if ( !compare( a[i], b[i] ) ) {
- return false;
+
+ function addInlineCSS( css, media ) {
+ var $style = getMarker().prev(),
+ $newStyle,
+ attrs = { 'type': 'text/css', 'media': media };
+ if ( $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+ // There's already a dynamic <style> tag present, append to it
+ // This recycling of <style> tags is for bug 31676 (can't have
+ // more than 32 <style> tags in IE)
+
+ // Also, calling .append() on a <style> tag explodes with a JS error in IE,
+ // so if the .append() fails we fall back to building a new <style> tag and
+ // replacing the existing one
+ try {
+ // Do cdata sanitization on the provided CSS, and prepend a double newline
+ css = $( mw.html.element( 'style', {}, new mw.html.Cdata( "\n\n" + css ) ) ).html();
+ $style.append( css );
+ } catch ( e ) {
+ // Generate a new tag with the combined CSS
+ css = $style.html() + "\n\n" + css;
+ $newStyle = $( mw.html.element( 'style', attrs, new mw.html.Cdata( css ) ) )
+ .data( 'ResourceLoaderDynamicStyleTag', true );
+ // Prevent a flash of unstyled content by inserting the new tag
+ // before removing the old one
+ $style.after( $newStyle );
+ $style.remove();
}
+ } else {
+ // Create a new <style> tag and insert it
+ $style = $( mw.html.element( 'style', attrs, new mw.html.Cdata( css ) ) );
+ $style.data( 'ResourceLoaderDynamicStyleTag', true );
+ getMarker().before( $style );
}
- if ( a[i] !== b[i] ) {
+ }
+
+ function compare( a, b ) {
+ var i;
+ if ( a.length !== b.length ) {
return false;
}
+ for ( i = 0; i < b.length; i += 1 ) {
+ if ( $.isArray( a[i] ) ) {
+ if ( !compare( a[i], b[i] ) ) {
+ return false;
+ }
+ }
+ if ( a[i] !== b[i] ) {
+ return false;
+ }
+ }
+ return true;
}
- return true;
- }
-
- /**
- * Generates an ISO8601 "basic" string from a UNIX timestamp
- */
- function formatVersionNumber( timestamp ) {
- function pad( a, b, c ) {
- return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
- }
- var d = new Date();
- d.setTime( timestamp * 1000 );
- return [
- pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
- pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
- ].join( '' );
- }
-
- /**
- * Recursively resolves dependencies and detects circular references
- */
- function recurse( module, resolved, unresolved ) {
- if ( registry[module] === undefined ) {
- throw new Error( 'Unknown dependency: ' + module );
+
+ /**
+ * Generates an ISO8601 "basic" string from a UNIX timestamp
+ */
+ function formatVersionNumber( timestamp ) {
+ var pad = function ( a, b, c ) {
+ return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
+ },
+ d = new Date();
+ d.setTime( timestamp * 1000 );
+ return [
+ pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
+ pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
+ ].join( '' );
}
- // Resolves dynamic loader function and replaces it with its own results
- if ( $.isFunction( registry[module].dependencies ) ) {
- registry[module].dependencies = registry[module].dependencies();
- // Ensures the module's dependencies are always in an array
- if ( typeof registry[module].dependencies !== 'object' ) {
- registry[module].dependencies = [registry[module].dependencies];
+
+ /**
+ * Recursively resolves dependencies and detects circular references
+ */
+ function recurse( module, resolved, unresolved ) {
+ var n, deps, len;
+
+ if ( registry[module] === undefined ) {
+ throw new Error( 'Unknown dependency: ' + module );
}
- }
- // Tracks down dependencies
- for ( var n = 0; n < registry[module].dependencies.length; n++ ) {
- if ( $.inArray( registry[module].dependencies[n], resolved ) === -1 ) {
- if ( $.inArray( registry[module].dependencies[n], unresolved ) !== -1 ) {
- throw new Error(
- 'Circular reference detected: ' + module +
- ' -> ' + registry[module].dependencies[n]
- );
+ // Resolves dynamic loader function and replaces it with its own results
+ if ( $.isFunction( registry[module].dependencies ) ) {
+ registry[module].dependencies = registry[module].dependencies();
+ // Ensures the module's dependencies are always in an array
+ if ( typeof registry[module].dependencies !== 'object' ) {
+ registry[module].dependencies = [registry[module].dependencies];
}
- recurse( registry[module].dependencies[n], resolved, unresolved );
}
- }
- resolved[resolved.length] = module;
- unresolved.splice( $.inArray( module, unresolved ), 1 );
- }
+ // Tracks down dependencies
+ deps = registry[module].dependencies;
+ len = deps.length;
+ for ( n = 0; n < len; n += 1 ) {
+ if ( $.inArray( deps[n], resolved ) === -1 ) {
+ if ( $.inArray( deps[n], unresolved ) !== -1 ) {
+ throw new Error(
+ 'Circular reference detected: ' + module +
+ ' -> ' + deps[n]
+ );
+ }
- /**
- * Gets a list of module names that a module depends on in their proper dependency order
- *
- * @param module string module name or array of string module names
- * @return list of dependencies
- * @throws Error if circular reference is detected
- */
- function resolve( module ) {
- // Allow calling with an array of module names
- if ( typeof module === 'object' ) {
- var modules = [];
- for ( var m = 0; m < module.length; m++ ) {
- var dependencies = resolve( module[m] );
- for ( var n = 0; n < dependencies.length; n++ ) {
- modules[modules.length] = dependencies[n];
+ // Add to unresolved
+ unresolved[unresolved.length] = module;
+ recurse( deps[n], resolved, unresolved );
+ // module is at the end of unresolved
+ unresolved.pop();
}
}
- return modules;
- } else if ( typeof module === 'string' ) {
- // Undefined modules have no dependencies
- if ( !( module in registry ) ) {
- return [];
- }
- var resolved = [];
- recurse( module, resolved, [] );
- return resolved;
+ resolved[resolved.length] = module;
}
- throw new Error( 'Invalid module argument: ' + module );
- }
-
- /**
- * Narrows a list of module names down to those matching a specific
- * state. Possible states are 'undefined', 'registered', 'loading',
- * 'loaded', or 'ready'
- *
- * @param states string or array of strings of module states to filter by
- * @param modules array list of module names to filter (optional, all modules
- * will be used by default)
- * @return array list of filtered module names
- */
- function filter( states, modules ) {
- // Allow states to be given as a string
- if ( typeof states === 'string' ) {
- states = [states];
+
+ /**
+ * Gets a list of module names that a module depends on in their proper dependency order
+ *
+ * @param module string module name or array of string module names
+ * @return list of dependencies, including 'module'.
+ * @throws Error if circular reference is detected
+ */
+ function resolve( module ) {
+ var modules, m, deps, n, resolved;
+
+ // Allow calling with an array of module names
+ if ( $.isArray( module ) ) {
+ modules = [];
+ for ( m = 0; m < module.length; m += 1 ) {
+ deps = resolve( module[m] );
+ for ( n = 0; n < deps.length; n += 1 ) {
+ modules[modules.length] = deps[n];
+ }
+ }
+ return modules;
+ } else if ( typeof module === 'string' ) {
+ resolved = [];
+ recurse( module, resolved, [] );
+ return resolved;
+ }
+ throw new Error( 'Invalid module argument: ' + module );
}
- // If called without a list of modules, build and use a list of all modules
- var list = [], module;
- if ( modules === undefined ) {
- modules = [];
- for ( module in registry ) {
- modules[modules.length] = module;
+
+ /**
+ * Narrows a list of module names down to those matching a specific
+ * state (see comment on top of this scope for a list of valid states).
+ * One can also filter for 'unregistered', which will return the
+ * modules names that don't have a registry entry.
+ *
+ * @param states string or array of strings of module states to filter by
+ * @param modules array list of module names to filter (optional, by default the entire
+ * registry is used)
+ * @return array list of filtered module names
+ */
+ function filter( states, modules ) {
+ var list, module, s, m;
+
+ // Allow states to be given as a string
+ if ( typeof states === 'string' ) {
+ states = [states];
+ }
+ // If called without a list of modules, build and use a list of all modules
+ list = [];
+ if ( modules === undefined ) {
+ modules = [];
+ for ( module in registry ) {
+ modules[modules.length] = module;
+ }
}
+ // Build a list of modules which are in one of the specified states
+ for ( s = 0; s < states.length; s += 1 ) {
+ for ( m = 0; m < modules.length; m += 1 ) {
+ if ( registry[modules[m]] === undefined ) {
+ // Module does not exist
+ if ( states[s] === 'unregistered' ) {
+ // OK, undefined
+ list[list.length] = modules[m];
+ }
+ } else {
+ // Module exists, check state
+ if ( registry[modules[m]].state === states[s] ) {
+ // OK, correct state
+ list[list.length] = modules[m];
+ }
+ }
+ }
+ }
+ return list;
}
- // Build a list of modules which are in one of the specified states
- for ( var s = 0; s < states.length; s++ ) {
- for ( var m = 0; m < modules.length; m++ ) {
- if ( registry[modules[m]] === undefined ) {
- // Module does not exist
- if ( states[s] == 'undefined' ) {
- // OK, undefined
- list[list.length] = modules[m];
+
+ /**
+ * Automatically executes jobs and modules which are pending with satistifed dependencies.
+ *
+ * This is used when dependencies are satisfied, such as when a module is executed.
+ */
+ function handlePending( module ) {
+ var j, r;
+
+ try {
+ // Run jobs whose dependencies have just been met
+ for ( j = 0; j < jobs.length; j += 1 ) {
+ if ( compare(
+ filter( 'ready', jobs[j].dependencies ),
+ jobs[j].dependencies ) )
+ {
+ var callback = jobs[j].ready;
+ jobs.splice( j, 1 );
+ j -= 1;
+ if ( $.isFunction( callback ) ) {
+ callback();
+ }
}
- } else {
- // Module exists, check state
- if ( registry[modules[m]].state === states[s] ) {
- // OK, correct state
- list[list.length] = modules[m];
+ }
+ // Execute modules whose dependencies have just been met
+ for ( r in registry ) {
+ if ( registry[r].state === 'loaded' ) {
+ if ( compare(
+ filter( ['ready'], registry[r].dependencies ),
+ registry[r].dependencies ) )
+ {
+ execute( r );
+ }
+ }
+ }
+ } catch ( e ) {
+ // Run error callbacks of jobs affected by this condition
+ for ( j = 0; j < jobs.length; j += 1 ) {
+ if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) {
+ if ( $.isFunction( jobs[j].error ) ) {
+ jobs[j].error( e, module );
+ }
+ jobs.splice( j, 1 );
+ j -= 1;
}
}
+ throw e;
}
}
- return list;
- }
-
- /**
- * Executes a loaded module, making it ready to use
- *
- * @param module string module name to execute
- */
- function execute( module, callback ) {
- var _fn = 'mw.loader::execute> ';
- if ( registry[module] === undefined ) {
- throw new Error( 'Module has not been registered yet: ' + module );
- } else if ( registry[module].state === 'registered' ) {
- throw new Error( 'Module has not been requested from the server yet: ' + module );
- } else if ( registry[module].state === 'loading' ) {
- throw new Error( 'Module has not completed loading yet: ' + module );
- } else if ( registry[module].state === 'ready' ) {
- throw new Error( 'Module has already been loaded: ' + module );
+
+ /**
+ * Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
+ * depending on whether document-ready has occured yet and whether we are in async mode.
+ *
+ * @param src String: URL to script, will be used as the src attribute in the script tag
+ * @param callback Function: Optional callback which will be run when the script is done
+ */
+ function addScript( src, callback, async ) {
+ var done = false, script, head;
+ if ( ready || async ) {
+ // jQuery's getScript method is NOT better than doing this the old-fashioned way
+ // because jQuery will eval the script's code, and errors will not have sane
+ // line numbers.
+ script = document.createElement( 'script' );
+ script.setAttribute( 'src', src );
+ script.setAttribute( 'type', 'text/javascript' );
+ if ( $.isFunction( callback ) ) {
+ // Attach handlers for all browsers (based on jQuery.ajax)
+ script.onload = script.onreadystatechange = function() {
+
+ if (
+ !done
+ && (
+ !script.readyState
+ || /loaded|complete/.test( script.readyState )
+ )
+ ) {
+
+ done = true;
+
+ callback();
+
+ // Handle memory leak in IE. This seems to fail in
+ // IE7 sometimes (Permission Denied error when
+ // accessing script.parentNode) so wrap it in
+ // a try catch.
+ try {
+ script.onload = script.onreadystatechange = null;
+ if ( script.parentNode ) {
+ script.parentNode.removeChild( script );
+ }
+
+ // Dereference the script
+ script = undefined;
+ } catch ( e ) { }
+ }
+ };
+ }
+
+ if ( window.opera ) {
+ // Appending to the <head> blocks rendering completely in Opera,
+ // so append to the <body> after document ready. This means the
+ // scripts only start loading after the document has been rendered,
+ // but so be it. Opera users don't deserve faster web pages if their
+ // browser makes it impossible
+ $( function() { document.body.appendChild( script ); } );
+ } else {
+ // IE-safe way of getting the <head> . document.documentElement.head doesn't
+ // work in scripts that run in the <head>
+ head = document.getElementsByTagName( 'head' )[0];
+ ( document.body || head ).appendChild( script );
+ }
+ } else {
+ document.write( mw.html.element(
+ 'script', { 'type': 'text/javascript', 'src': src }, ''
+ ) );
+ if ( $.isFunction( callback ) ) {
+ // Document.write is synchronous, so this is called when it's done
+ // FIXME: that's a lie. doc.write isn't actually synchronous
+ callback();
+ }
+ }
}
- // Add styles
- if ( $.isPlainObject( registry[module].style ) ) {
- for ( var media in registry[module].style ) {
- var style = registry[module].style[media];
- if ( $.isArray( style ) ) {
- for ( var i = 0; i < style.length; i++ ) {
- getMarker().before( mw.html.element( 'link', {
- 'type': 'text/css',
- 'media': media,
- 'rel': 'stylesheet',
- 'href': style[i]
- } ) );
+
+ /**
+ * Executes a loaded module, making it ready to use
+ *
+ * @param module string module name to execute
+ */
+ function execute( module, callback ) {
+ var style, media, i, script, markModuleReady, nestedAddScript;
+
+ if ( registry[module] === undefined ) {
+ throw new Error( 'Module has not been registered yet: ' + module );
+ } else if ( registry[module].state === 'registered' ) {
+ throw new Error( 'Module has not been requested from the server yet: ' + module );
+ } else if ( registry[module].state === 'loading' ) {
+ throw new Error( 'Module has not completed loading yet: ' + module );
+ } else if ( registry[module].state === 'ready' ) {
+ throw new Error( 'Module has already been loaded: ' + module );
+ }
+
+ // Add styles
+ if ( $.isPlainObject( registry[module].style ) ) {
+ for ( media in registry[module].style ) {
+ style = registry[module].style[media];
+ if ( $.isArray( style ) ) {
+ for ( i = 0; i < style.length; i += 1 ) {
+ getMarker().before( mw.html.element( 'link', {
+ 'type': 'text/css',
+ 'media': media,
+ 'rel': 'stylesheet',
+ 'href': style[i]
+ } ) );
+ }
+ } else if ( typeof style === 'string' ) {
+ addInlineCSS( style, media );
}
- } else if ( typeof style === 'string' ) {
- getMarker().before( mw.html.element(
- 'style',
- { 'type': 'text/css', 'media': media },
- new mw.html.Cdata( style )
- ) );
}
}
- }
- // Add localizations to message system
- if ( $.isPlainObject( registry[module].messages ) ) {
- mw.messages.set( registry[module].messages );
- }
- // Execute script
- try {
- var script = registry[module].script,
+ // Add localizations to message system
+ if ( $.isPlainObject( registry[module].messages ) ) {
+ mw.messages.set( registry[module].messages );
+ }
+ // Execute script
+ try {
+ script = registry[module].script;
markModuleReady = function() {
registry[module].state = 'ready';
handlePending( module );
if ( $.isFunction( callback ) ) {
callback();
}
- },
- nestedAddScript = function( arr, callback, i ) {
+ };
+ nestedAddScript = function ( arr, callback, async, i ) {
// Recursively call addScript() in its own callback
// for each element of arr.
if ( i >= arr.length ) {
@@ -536,666 +752,702 @@ window.mediaWiki = new ( function( $ ) {
callback();
return;
}
-
+
addScript( arr[i], function() {
- nestedAddScript( arr, callback, i + 1 );
- } );
+ nestedAddScript( arr, callback, async, i + 1 );
+ }, async );
};
-
- if ( $.isArray( script ) ) {
- registry[module].state = 'loading';
- nestedAddScript( script, markModuleReady, 0 );
- } else if ( $.isFunction( script ) ) {
- script( jQuery );
- markModuleReady();
- }
- } 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
- if ( window.console && typeof window.console.log === 'function' ) {
- console.log( _fn + 'Exception thrown by ' + module + ': ' + e.message );
+
+ if ( $.isArray( script ) ) {
+ registry[module].state = 'loading';
+ nestedAddScript( script, markModuleReady, registry[module].async, 0 );
+ } else if ( $.isFunction( script ) ) {
+ script( $ );
+ markModuleReady();
+ }
+ } 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
+ if ( window.console && typeof window.console.log === 'function' ) {
+ console.log( 'mw.loader::execute> Exception thrown by ' + module + ': ' + e.message );
+ }
+ registry[module].state = 'error';
}
- registry[module].state = 'error';
- throw e;
}
- }
-
- /**
- * Automatically executes jobs and modules which are pending with satistifed dependencies.
- *
- * This is used when dependencies are satisfied, such as when a module is executed.
- */
- function handlePending( module ) {
- try {
- // Run jobs who's dependencies have just been met
- for ( var j = 0; j < jobs.length; j++ ) {
- if ( compare(
- filter( 'ready', jobs[j].dependencies ),
- jobs[j].dependencies ) )
- {
- if ( $.isFunction( jobs[j].ready ) ) {
- jobs[j].ready();
+
+ /**
+ * Adds a dependencies to the queue with optional callbacks to be run
+ * when the dependencies are ready or fail
+ *
+ * @param dependencies string module name or array of string module names
+ * @param ready function callback to execute when all dependencies are ready
+ * @param error function callback to execute when any dependency fails
+ * @param async (optional) If true, load modules asynchronously even if
+ * document ready has not yet occurred
+ */
+ function request( dependencies, ready, error, async ) {
+ var regItemDeps, regItemDepLen, n;
+
+ // Allow calling by single module name
+ if ( typeof dependencies === 'string' ) {
+ dependencies = [dependencies];
+ if ( registry[dependencies[0]] !== undefined ) {
+ // Cache repetitively accessed deep level object member
+ regItemDeps = registry[dependencies[0]].dependencies;
+ // Cache to avoid looped access to length property
+ regItemDepLen = regItemDeps.length;
+ for ( n = 0; n < regItemDepLen; n += 1 ) {
+ dependencies[dependencies.length] = regItemDeps[n];
}
- jobs.splice( j, 1 );
- j--;
}
}
- // Execute modules who's dependencies have just been met
- for ( var r in registry ) {
- if ( registry[r].state == 'loaded' ) {
- if ( compare(
- filter( ['ready'], registry[r].dependencies ),
- registry[r].dependencies ) )
- {
- execute( r );
- }
- }
+ // Add ready and error callbacks if they were given
+ if ( arguments.length > 1 ) {
+ jobs[jobs.length] = {
+ 'dependencies': filter(
+ ['registered', 'loading', 'loaded'],
+ dependencies
+ ),
+ 'ready': ready,
+ 'error': error
+ };
}
- } catch ( e ) {
- // Run error callbacks of jobs affected by this condition
- for ( var j = 0; j < jobs.length; j++ ) {
- if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) {
- if ( $.isFunction( jobs[j].error ) ) {
- jobs[j].error();
+ // Queue up any dependencies that are registered
+ dependencies = filter( ['registered'], dependencies );
+ for ( n = 0; n < dependencies.length; n += 1 ) {
+ if ( $.inArray( dependencies[n], queue ) === -1 ) {
+ queue[queue.length] = dependencies[n];
+ if ( async ) {
+ // Mark this module as async in the registry
+ registry[dependencies[n]].async = true;
}
- jobs.splice( j, 1 );
- j--;
}
}
+ // Work the queue
+ mw.loader.work();
}
- }
-
- /**
- * Adds a dependencies to the queue with optional callbacks to be run
- * when the dependencies are ready or fail
- *
- * @param dependencies string module name or array of string module names
- * @param ready function callback to execute when all dependencies are ready
- * @param error function callback to execute when any dependency fails
- */
- function request( dependencies, ready, error ) {
- // Allow calling by single module name
- if ( typeof dependencies === 'string' ) {
- dependencies = [dependencies];
- if ( dependencies[0] in registry ) {
- for ( var n = 0; n < registry[dependencies[0]].dependencies.length; n++ ) {
- dependencies[dependencies.length] =
- registry[dependencies[0]].dependencies[n];
+
+ function sortQuery(o) {
+ var sorted = {}, key, a = [];
+ for ( key in o ) {
+ if ( hasOwn.call( o, key ) ) {
+ a.push( key );
}
}
- }
- // Add ready and error callbacks if they were given
- if ( arguments.length > 1 ) {
- jobs[jobs.length] = {
- 'dependencies': filter(
- ['undefined', 'registered', 'loading', 'loaded'],
- dependencies ),
- 'ready': ready,
- 'error': error
- };
- }
- // Queue up any dependencies that are undefined or registered
- dependencies = filter( ['undefined', 'registered'], dependencies );
- for ( var n = 0; n < dependencies.length; n++ ) {
- if ( $.inArray( dependencies[n], queue ) === -1 ) {
- queue[queue.length] = dependencies[n];
+ a.sort();
+ for ( key = 0; key < a.length; key += 1 ) {
+ sorted[a[key]] = o[a[key]];
}
+ return sorted;
}
- // Work the queue
- mw.loader.work();
- }
-
- function sortQuery(o) {
- var sorted = {}, key, a = [];
- for ( key in o ) {
- if ( o.hasOwnProperty( key ) ) {
- a.push( key );
+
+ /**
+ * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
+ * to a query string of the form foo.bar,baz|bar.baz,quux
+ */
+ function buildModulesString( moduleMap ) {
+ var arr = [], p, prefix;
+ for ( prefix in moduleMap ) {
+ p = prefix === '' ? '' : prefix + '.';
+ arr.push( p + moduleMap[prefix].join( ',' ) );
}
+ return arr.join( '|' );
}
- a.sort();
- for ( key = 0; key < a.length; key++ ) {
- sorted[a[key]] = o[a[key]];
- }
- return sorted;
- }
-
- /**
- * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
- * to a query string of the form foo.bar,baz|bar.baz,quux
- */
- function buildModulesString( moduleMap ) {
- var arr = [];
- for ( var prefix in moduleMap ) {
- var p = prefix === '' ? '' : prefix + '.';
- arr.push( p + moduleMap[prefix].join( ',' ) );
+
+ /**
+ * Asynchronously append a script tag to the end of the body
+ * that invokes load.php
+ * @param moduleMap {Object}: Module map, see buildModulesString()
+ * @param currReqBase {Object}: Object with other parameters (other than 'modules') to use in the request
+ * @param sourceLoadScript {String}: URL of load.php
+ * @param async {Boolean}: If true, use an asynchrounous request even if document ready has not yet occurred
+ */
+ function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
+ var request = $.extend(
+ { 'modules': buildModulesString( moduleMap ) },
+ currReqBase
+ );
+ request = sortQuery( request );
+ // Asynchronously append a script tag to the end of the body
+ // Append &* to avoid triggering the IE6 extension check
+ addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
}
- return arr.join( '|' );
- }
-
- /**
- * Adds a script tag to the body, either using document.write or low-level DOM manipulation,
- * depending on whether document-ready has occured yet.
- *
- * @param src String: URL to script, will be used as the src attribute in the script tag
- * @param callback Function: Optional callback which will be run when the script is done
- */
- function addScript( src, callback ) {
- if ( ready ) {
- // jQuery's getScript method is NOT better than doing this the old-fashioned way
- // because jQuery will eval the script's code, and errors will not have sane
- // line numbers.
- var script = document.createElement( 'script' );
- script.setAttribute( 'src', src );
- script.setAttribute( 'type', 'text/javascript' );
- if ( $.isFunction( callback ) ) {
- var done = false;
- // Attach handlers for all browsers -- this is based on jQuery.getScript
- script.onload = script.onreadystatechange = function() {
- if (
- !done
- && (
- !this.readyState
- || this.readyState === 'loaded'
- || this.readyState === 'complete'
- )
- ) {
- done = true;
- callback();
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
- if ( script.parentNode ) {
- script.parentNode.removeChild( script );
+
+ /* Public Methods */
+ return {
+ /**
+ * Requests dependencies from server, loading and executing when things when ready.
+ */
+ work: function () {
+ var reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
+ source, group, g, i, modules, maxVersion, sourceLoadScript,
+ currReqBase, currReqBaseLength, moduleMap, l,
+ lastDotIndex, prefix, suffix, bytesAdded, async;
+
+ // Build a list of request parameters common to all requests.
+ reqBase = {
+ skin: mw.config.get( 'skin' ),
+ lang: mw.config.get( 'wgUserLanguage' ),
+ debug: mw.config.get( 'debug' )
+ };
+ // Split module batch by source and by group.
+ splits = {};
+ maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
+
+ // Appends a list of modules from the queue to the batch
+ for ( q = 0; q < queue.length; q += 1 ) {
+ // Only request modules which are registered
+ if ( registry[queue[q]] !== undefined && registry[queue[q]].state === 'registered' ) {
+ // Prevent duplicate entries
+ if ( $.inArray( queue[q], batch ) === -1 ) {
+ batch[batch.length] = queue[q];
+ // Mark registered modules as loading
+ registry[queue[q]].state = 'loading';
+ }
+ }
+ }
+ // Early exit if there's nothing to load...
+ if ( !batch.length ) {
+ return;
+ }
+
+ // The queue has been processed into the batch, clear up the queue.
+ queue = [];
+
+ // Always order modules alphabetically to help reduce cache
+ // misses for otherwise identical content.
+ batch.sort();
+
+ // Split batch by source and by group.
+ for ( b = 0; b < batch.length; b += 1 ) {
+ bSource = registry[batch[b]].source;
+ bGroup = registry[batch[b]].group;
+ if ( splits[bSource] === undefined ) {
+ splits[bSource] = {};
+ }
+ if ( splits[bSource][bGroup] === undefined ) {
+ splits[bSource][bGroup] = [];
+ }
+ bSourceGroup = splits[bSource][bGroup];
+ bSourceGroup[bSourceGroup.length] = batch[b];
+ }
+
+ // Clear the batch - this MUST happen before we append any
+ // script elements to the body or it's possible that a script
+ // will be locally cached, instantly load, and work the batch
+ // again, all before we've cleared it causing each request to
+ // include modules which are already loaded.
+ batch = [];
+
+ for ( source in splits ) {
+
+ sourceLoadScript = sources[source].loadScript;
+
+ for ( group in splits[source] ) {
+
+ // Cache access to currently selected list of
+ // modules for this group from this source.
+ modules = splits[source][group];
+
+ // Calculate the highest timestamp
+ maxVersion = 0;
+ for ( g = 0; g < modules.length; g += 1 ) {
+ if ( registry[modules[g]].version > maxVersion ) {
+ maxVersion = registry[modules[g]].version;
+ }
+ }
+
+ currReqBase = $.extend( { 'version': formatVersionNumber( maxVersion ) }, reqBase );
+ currReqBaseLength = $.param( currReqBase ).length;
+ async = true;
+ // We may need to split up the request to honor the query string length limit,
+ // so build it piece by piece.
+ l = currReqBaseLength + 9; // '&modules='.length == 9
+
+ moduleMap = {}; // { prefix: [ suffixes ] }
+
+ for ( i = 0; i < modules.length; i += 1 ) {
+ // Determine how many bytes this module would add to the query string
+ lastDotIndex = modules[i].lastIndexOf( '.' );
+ // Note that these substr() calls work even if lastDotIndex == -1
+ prefix = modules[i].substr( 0, lastDotIndex );
+ suffix = modules[i].substr( lastDotIndex + 1 );
+ bytesAdded = moduleMap[prefix] !== undefined
+ ? suffix.length + 3 // '%2C'.length == 3
+ : modules[i].length + 3; // '%7C'.length == 3
+
+ // If the request would become too long, create a new one,
+ // but don't create empty requests
+ if ( maxQueryLength > 0 && !$.isEmptyObject( moduleMap ) && l + bytesAdded > maxQueryLength ) {
+ // This request would become too long, create a new one
+ // and fire off the old one
+ doRequest( moduleMap, currReqBase, sourceLoadScript, async );
+ moduleMap = {};
+ async = true;
+ l = currReqBaseLength + 9;
+ }
+ if ( moduleMap[prefix] === undefined ) {
+ moduleMap[prefix] = [];
+ }
+ moduleMap[prefix].push( suffix );
+ if ( !registry[modules[i]].async ) {
+ // If this module is blocking, make the entire request blocking
+ // This is slightly suboptimal, but in practice mixing of blocking
+ // and async modules will only occur in debug mode.
+ async = false;
+ }
+ l += bytesAdded;
+ }
+ // If there's anything left in moduleMap, request that too
+ if ( !$.isEmptyObject( moduleMap ) ) {
+ doRequest( moduleMap, currReqBase, sourceLoadScript, async );
}
}
+ }
+ },
+
+ /**
+ * Register a source.
+ *
+ * @param id {String}: Short lowercase a-Z string representing a source, only used internally.
+ * @param props {Object}: Object containing only the loadScript property which is a url to
+ * the load.php location of the source.
+ * @return {Boolean}
+ */
+ addSource: function ( id, props ) {
+ var source;
+ // Allow multiple additions
+ if ( typeof id === 'object' ) {
+ for ( source in id ) {
+ mw.loader.addSource( source, id[source] );
+ }
+ return true;
+ }
+
+ if ( sources[id] !== undefined ) {
+ throw new Error( 'source already registered: ' + id );
+ }
+
+ sources[id] = props;
+
+ return true;
+ },
+
+ /**
+ * Registers a module, letting the system know about it and its
+ * properties. Startup modules contain calls to this function.
+ *
+ * @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
+ * 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.
+ */
+ register: function ( module, version, dependencies, group, source ) {
+ var m;
+ // Allow multiple registration
+ if ( typeof module === 'object' ) {
+ for ( m = 0; m < module.length; m += 1 ) {
+ // module is an array of module names
+ if ( typeof module[m] === 'string' ) {
+ mw.loader.register( module[m] );
+ // module is an array of arrays
+ } else if ( typeof module[m] === 'object' ) {
+ mw.loader.register.apply( mw.loader, module[m] );
+ }
+ }
+ return;
+ }
+ // Validate input
+ if ( typeof module !== 'string' ) {
+ throw new Error( 'module must be a string, not a ' + typeof module );
+ }
+ if ( registry[module] !== undefined ) {
+ throw new Error( 'module already registered: ' + module );
+ }
+ // List the module as registered
+ registry[module] = {
+ 'version': version !== undefined ? parseInt( version, 10 ) : 0,
+ 'dependencies': [],
+ 'group': typeof group === 'string' ? group : null,
+ 'source': typeof source === 'string' ? source: 'local',
+ 'state': 'registered'
};
- }
- document.body.appendChild( script );
- } else {
- document.write( mw.html.element(
- 'script', { 'type': 'text/javascript', 'src': src }, ''
- ) );
- if ( $.isFunction( callback ) ) {
- // Document.write is synchronous, so this is called when it's done
- callback();
- }
- }
- }
-
- /* Public Methods */
-
- /**
- * Requests dependencies from server, loading and executing when things when ready.
- */
- this.work = function() {
- // Appends a list of modules to the batch
- for ( var q = 0; q < queue.length; q++ ) {
- // Only request modules which are undefined or registered
- if ( !( queue[q] in registry ) || registry[queue[q]].state == 'registered' ) {
- // Prevent duplicate entries
- if ( $.inArray( queue[q], batch ) === -1 ) {
- batch[batch.length] = queue[q];
- // Mark registered modules as loading
- if ( queue[q] in registry ) {
- registry[queue[q]].state = 'loading';
+ if ( typeof dependencies === 'string' ) {
+ // Allow dependencies to be given as a single module name
+ registry[module].dependencies = [dependencies];
+ } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
+ // Allow dependencies to be given as an array of module names
+ // or a function which returns an array
+ registry[module].dependencies = dependencies;
+ }
+ },
+
+ /**
+ * Implements a module, giving the system a course of action to take
+ * upon loading. Results of a request for one or more modules contain
+ * calls to this function.
+ *
+ * All arguments are required.
+ *
+ * @param module String: Name of module
+ * @param script Mixed: Function of module code or String of URL to be used as the src
+ * attribute when adding a script element to the body
+ * @param style Object: Object of CSS strings keyed by media-type or Object of lists of URLs
+ * keyed by media-type
+ * @param msgs Object: List of key/value pairs to be passed through mw.messages.set
+ */
+ implement: function ( module, script, style, msgs ) {
+ // Validate input
+ if ( typeof module !== 'string' ) {
+ throw new Error( 'module must be a string, not a ' + typeof module );
+ }
+ if ( !$.isFunction( script ) && !$.isArray( script ) ) {
+ throw new Error( 'script must be a function or an array, not a ' + typeof script );
+ }
+ if ( !$.isPlainObject( style ) ) {
+ throw new Error( 'style must be an object, not a ' + typeof style );
+ }
+ if ( !$.isPlainObject( msgs ) ) {
+ throw new Error( 'msgs must be an object, not a ' + typeof msgs );
+ }
+ // Automatically register module
+ if ( registry[module] === undefined ) {
+ mw.loader.register( module );
+ }
+ // Check for duplicate implementation
+ if ( registry[module] !== undefined && registry[module].script !== undefined ) {
+ throw new Error( 'module already implemented: ' + module );
+ }
+ // Mark module as loaded
+ registry[module].state = 'loaded';
+ // Attach components
+ registry[module].script = script;
+ registry[module].style = style;
+ registry[module].messages = msgs;
+ // Execute or queue callback
+ if ( compare(
+ filter( ['ready'], registry[module].dependencies ),
+ registry[module].dependencies ) )
+ {
+ execute( module );
+ }
+ },
+
+ /**
+ * Executes 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
+ * 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)
+ */
+ using: function ( dependencies, ready, error ) {
+ var tod = typeof dependencies;
+ // Validate input
+ if ( tod !== 'object' && tod !== 'string' ) {
+ throw new Error( 'dependencies must be a string or an array, not a ' + tod );
+ }
+ // Allow calling with a single dependency as a string
+ if ( tod === 'string' ) {
+ dependencies = [dependencies];
+ }
+ // Resolve entire dependency map
+ dependencies = resolve( dependencies );
+ // If all dependencies are met, execute ready immediately
+ if ( compare( filter( ['ready'], dependencies ), dependencies ) ) {
+ if ( $.isFunction( ready ) ) {
+ ready();
}
}
- }
- }
- // Early exit if there's nothing to load
- if ( !batch.length ) {
- return;
- }
- // Clean up the queue
- queue = [];
- // Always order modules alphabetically to help reduce cache
- // misses for otherwise identical content
- batch.sort();
- // Build a list of request parameters
- var base = {
- 'skin': mw.config.get( 'skin' ),
- 'lang': mw.config.get( 'wgUserLanguage' ),
- 'debug': mw.config.get( 'debug' )
- };
- // Extend request parameters with a list of modules in the batch
- var requests = [];
- // Split into groups
- var groups = {};
- for ( var b = 0; b < batch.length; b++ ) {
- var group = registry[batch[b]].group;
- if ( !( group in groups ) ) {
- groups[group] = [];
- }
- groups[group][groups[group].length] = batch[b];
- }
- for ( var group in groups ) {
- // Calculate the highest timestamp
- var version = 0;
- for ( var g = 0; g < groups[group].length; g++ ) {
- if ( registry[groups[group][g]].version > version ) {
- version = registry[groups[group][g]].version;
+ // If any dependencies have errors execute error immediately
+ else if ( filter( ['error'], dependencies ).length ) {
+ if ( $.isFunction( error ) ) {
+ error( new Error( 'one or more dependencies have state "error"' ),
+ dependencies );
+ }
}
- }
- var reqBase = $.extend( { 'version': formatVersionNumber( version ) }, base );
- var reqBaseLength = $.param( reqBase ).length;
- var reqs = [];
- var limit = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
- // We may need to split up the request to honor the query string length limit
- // So build it piece by piece
- var l = reqBaseLength + 9; // '&modules='.length == 9
- var r = 0;
- reqs[0] = {}; // { prefix: [ suffixes ] }
- for ( var i = 0; i < groups[group].length; i++ ) {
- // Determine how many bytes this module would add to the query string
- var lastDotIndex = groups[group][i].lastIndexOf( '.' );
- // Note that these substr() calls work even if lastDotIndex == -1
- var prefix = groups[group][i].substr( 0, lastDotIndex );
- var suffix = groups[group][i].substr( lastDotIndex + 1 );
- var bytesAdded = prefix in reqs[r] ?
- suffix.length + 3 : // '%2C'.length == 3
- groups[group][i].length + 3; // '%7C'.length == 3
-
- // If the request would become too long, create a new one,
- // but don't create empty requests
- if ( limit > 0 && reqs[r] != {} && l + bytesAdded > limit ) {
- // This request would become too long, create a new one
- r++;
- reqs[r] = {};
- l = reqBaseLength + 9;
+ // Since some dependencies are not yet ready, queue up a request
+ else {
+ request( dependencies, ready, error );
}
- if ( !( prefix in reqs[r] ) ) {
- reqs[r][prefix] = [];
+ },
+
+ /**
+ * Loads an external script or one or more modules for future use
+ *
+ * @param modules {mixed} Either the name of a module, array of modules,
+ * or a URL of an external script or style
+ * @param type {String} mime-type to use if calling with a URL of an
+ * external script or style; acceptable values are "text/css" and
+ * "text/javascript"; if no type is provided, text/javascript is assumed.
+ * @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.
+ */
+ load: function ( modules, type, async ) {
+ var filtered, m;
+
+ // Validate input
+ if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
+ throw new Error( 'modules must be a string or an array, not a ' + typeof modules );
}
- reqs[r][prefix].push( suffix );
- l += bytesAdded;
- }
- for ( var r = 0; r < reqs.length; r++ ) {
- requests[requests.length] = $.extend(
- { 'modules': buildModulesString( reqs[r] ) }, reqBase
- );
- }
- }
- // Clear the batch - this MUST happen before we append the
- // script element to the body or it's possible that the script
- // will be locally cached, instantly load, and work the batch
- // again, all before we've cleared it causing each request to
- // include modules which are already loaded
- batch = [];
- // Asynchronously append a script tag to the end of the body
- for ( var r = 0; r < requests.length; r++ ) {
- requests[r] = sortQuery( requests[r] );
- // Append &* to avoid triggering the IE6 extension check
- var src = mw.config.get( 'wgLoadScript' ) + '?' + $.param( requests[r] ) + '&*';
- addScript( src );
- }
- };
-
- /**
- * Registers a module, letting the system know about it and its
- * dependencies. loader.js files contain calls to this function.
- */
- this.register = function( module, version, dependencies, group ) {
- // Allow multiple registration
- if ( typeof module === 'object' ) {
- for ( var m = 0; m < module.length; m++ ) {
- if ( typeof module[m] === 'string' ) {
- mw.loader.register( module[m] );
- } else if ( typeof module[m] === 'object' ) {
- mw.loader.register.apply( mw.loader, module[m] );
+ // Allow calling with an external url or single dependency as a string
+ if ( typeof modules === 'string' ) {
+ // Support adding arbitrary external scripts
+ if ( /^(https?:)?\/\//.test( modules ) ) {
+ if ( async === undefined ) {
+ // Assume async for bug 34542
+ async = true;
+ }
+ if ( type === 'text/css' ) {
+ $( 'head' ).append( $( '<link>', {
+ rel: 'stylesheet',
+ type: 'text/css',
+ href: modules
+ } ) );
+ return;
+ } else if ( type === 'text/javascript' || type === undefined ) {
+ addScript( modules, null, async );
+ return;
+ }
+ // Unknown type
+ throw new Error( 'invalid type for external url, must be text/css or text/javascript. not ' + type );
+ }
+ // Called with single module
+ modules = [modules];
}
- }
- return;
- }
- // Validate input
- if ( typeof module !== 'string' ) {
- throw new Error( 'module must be a string, not a ' + typeof module );
- }
- if ( registry[module] !== undefined ) {
- throw new Error( 'module already implemented: ' + module );
- }
- // List the module as registered
- registry[module] = {
- 'state': 'registered',
- 'group': typeof group === 'string' ? group : null,
- 'dependencies': [],
- 'version': version !== undefined ? parseInt( version, 10 ) : 0
- };
- if ( typeof dependencies === 'string' ) {
- // Allow dependencies to be given as a single module name
- registry[module].dependencies = [dependencies];
- } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
- // Allow dependencies to be given as an array of module names
- // or a function which returns an array
- registry[module].dependencies = dependencies;
- }
- };
- /**
- * Implements a module, giving the system a course of action to take
- * upon loading. Results of a request for one or more modules contain
- * calls to this function.
- *
- * All arguments are required.
- *
- * @param module String: Name of module
- * @param script Mixed: Function of module code or String of URL to be used as the src
- * attribute when adding a script element to the body
- * @param style Object: Object of CSS strings keyed by media-type or Object of lists of URLs
- * keyed by media-type
- * @param msgs Object: List of key/value pairs to be passed through mw.messages.set
- */
- this.implement = function( module, script, style, msgs ) {
- // Validate input
- if ( typeof module !== 'string' ) {
- throw new Error( 'module must be a string, not a ' + typeof module );
- }
- if ( !$.isFunction( script ) && !$.isArray( script ) ) {
- throw new Error( 'script must be a function or an array, not a ' + typeof script );
- }
- if ( !$.isPlainObject( style ) ) {
- throw new Error( 'style must be an object, not a ' + typeof style );
- }
- if ( !$.isPlainObject( msgs ) ) {
- throw new Error( 'msgs must be an object, not a ' + typeof msgs );
- }
- // Automatically register module
- if ( registry[module] === undefined ) {
- mw.loader.register( module );
- }
- // Check for duplicate implementation
- if ( registry[module] !== undefined && registry[module].script !== undefined ) {
- throw new Error( 'module already implemeneted: ' + module );
- }
- // Mark module as loaded
- registry[module].state = 'loaded';
- // Attach components
- registry[module].script = script;
- registry[module].style = style;
- registry[module].messages = msgs;
- // Execute or queue callback
- if ( compare(
- filter( ['ready'], registry[module].dependencies ),
- registry[module].dependencies ) )
- {
- execute( module );
- } else {
- request( module );
- }
- };
-
- /**
- * Executes a function as soon as one or more required modules are ready
- *
- * @param dependencies string or array of strings of modules names the callback
- * dependencies to be ready before
- * executing
- * @param ready function callback to execute when all dependencies are ready (optional)
- * @param error function callback to execute when if dependencies have a errors (optional)
- */
- this.using = function( dependencies, ready, error ) {
- // Validate input
- if ( typeof dependencies !== 'object' && typeof dependencies !== 'string' ) {
- throw new Error( 'dependencies must be a string or an array, not a ' +
- typeof dependencies );
- }
- // Allow calling with a single dependency as a string
- if ( typeof dependencies === 'string' ) {
- dependencies = [dependencies];
- }
- // Resolve entire dependency map
- dependencies = resolve( dependencies );
- // If all dependencies are met, execute ready immediately
- if ( compare( filter( ['ready'], dependencies ), dependencies ) ) {
- if ( $.isFunction( ready ) ) {
- ready();
- }
- }
- // If any dependencies have errors execute error immediately
- else if ( filter( ['error'], dependencies ).length ) {
- if ( $.isFunction( error ) ) {
- error();
- }
- }
- // Since some dependencies are not yet ready, queue up a request
- else {
- request( dependencies, ready, error );
- }
- };
+ // Filter out undefined modules, otherwise resolve() will throw
+ // an exception for trying to load an undefined module.
+ // Undefined modules are acceptable here in load(), because load() takes
+ // an array of unrelated modules, whereas the modules passed to
+ // using() are related and must all be loaded.
+ for ( filtered = [], m = 0; m < modules.length; m += 1 ) {
+ if ( registry[modules[m]] !== undefined ) {
+ filtered[filtered.length] = modules[m];
+ }
+ }
- /**
- * Loads an external script or one or more modules for future use
- *
- * @param modules mixed either the name of a module, array of modules,
- * or a URL of an external script or style
- * @param type string mime-type to use if calling with a URL of an
- * external script or style; acceptable values are "text/css" and
- * "text/javascript"; if no type is provided, text/javascript is
- * assumed
- */
- this.load = function( modules, type ) {
- // Validate input
- if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
- throw new Error( 'modules must be a string or an array, not a ' +
- typeof modules );
- }
- // Allow calling with an external script or single dependency as a string
- if ( typeof modules === 'string' ) {
- // Support adding arbitrary external scripts
- if ( modules.substr( 0, 7 ) === 'http://' || modules.substr( 0, 8 ) === 'https://' || modules.substr( 0, 2 ) === '//' ) {
- if ( type === 'text/css' ) {
- $( 'head' ).append( $( '<link />', {
- rel: 'stylesheet',
- type: 'text/css',
- href: modules
- } ) );
- return true;
- } else if ( type === 'text/javascript' || type === undefined ) {
- addScript( modules );
- return true;
+ // Resolve entire dependency map
+ filtered = resolve( filtered );
+ // If all modules are ready, nothing dependency be done
+ if ( compare( filter( ['ready'], filtered ), filtered ) ) {
+ return;
}
- // Unknown type
- return false;
+ // If any modules have errors
+ else if ( filter( ['error'], filtered ).length ) {
+ return;
+ }
+ // Since some modules are not yet ready, queue up a request
+ else {
+ request( filtered, null, null, async );
+ return;
+ }
+ },
+
+ /**
+ * Changes the state of a module
+ *
+ * @param module {String|Object} module name or object of module name/state pairs
+ * @param state {String} state name
+ */
+ state: function ( module, state ) {
+ var m;
+ if ( typeof module === 'object' ) {
+ for ( m in module ) {
+ mw.loader.state( m, module[m] );
+ }
+ return;
+ }
+ if ( registry[module] === undefined ) {
+ mw.loader.register( module );
+ }
+ registry[module].state = state;
+ },
+
+ /**
+ * Gets the version of a module
+ *
+ * @param module string name of module to get version for
+ */
+ getVersion: function ( module ) {
+ if ( registry[module] !== undefined && registry[module].version !== undefined ) {
+ return formatVersionNumber( registry[module].version );
+ }
+ return null;
+ },
+
+ /**
+ * @deprecated since 1.18 use mw.loader.getVersion() instead
+ */
+ version: function () {
+ return mw.loader.getVersion.apply( mw.loader, arguments );
+ },
+
+ /**
+ * Gets the state of a module
+ *
+ * @param module string name of module to get state for
+ */
+ getState: function ( module ) {
+ if ( registry[module] !== undefined && registry[module].state !== undefined ) {
+ return registry[module].state;
+ }
+ return null;
+ },
+
+ /**
+ * Get names of all registered modules.
+ *
+ * @return {Array}
+ */
+ getModuleNames: function () {
+ return $.map( registry, function ( i, key ) {
+ return key;
+ } );
+ },
+
+ /**
+ * For backwards-compatibility with Squid-cached pages. Loads mw.user
+ */
+ go: function () {
+ mw.loader.load( 'mediawiki.user' );
}
- // Called with single module
- modules = [modules];
- }
- // Resolve entire dependency map
- modules = resolve( modules );
- // If all modules are ready, nothing dependency be done
- if ( compare( filter( ['ready'], modules ), modules ) ) {
- return true;
- }
- // If any modules have errors return false
- else if ( filter( ['error'], modules ).length ) {
- return false;
- }
- // Since some modules are not yet ready, queue up a request
- else {
- request( modules );
- return true;
- }
- };
-
- /**
- * Changes the state of a module
- *
- * @param module string module name or object of module name/state pairs
- * @param state string state name
- */
- this.state = function( module, state ) {
- if ( typeof module === 'object' ) {
- for ( var m in module ) {
- mw.loader.state( m, module[m] );
+ };
+ }() ),
+
+ /** HTML construction helper functions */
+ html: ( function () {
+ function escapeCallback( s ) {
+ switch ( s ) {
+ case "'":
+ return '&#039;';
+ case '"':
+ return '&quot;';
+ case '<':
+ return '&lt;';
+ case '>':
+ return '&gt;';
+ case '&':
+ return '&amp;';
}
- return;
}
- if ( !( module in registry ) ) {
- mw.loader.register( module );
- }
- registry[module].state = state;
- };
-
- /**
- * Gets the version of a module
- *
- * @param module string name of module to get version for
- */
- this.getVersion = function( module ) {
- if ( module in registry && 'version' in registry[module] ) {
- return formatVersionNumber( registry[module].version );
- }
- return null;
- };
- /**
- * @deprecated use mw.loader.getVersion() instead
- */
- this.version = function() {
- return mediaWiki.loader.getVersion.apply( mediaWiki.loader, arguments );
- };
- /**
- * Gets the state of a module
- *
- * @param module string name of module to get state for
- */
- this.getState = function( module ) {
- if ( module in registry && 'state' in registry[module] ) {
- return registry[module].state;
- }
- return null;
- };
+ return {
+ /**
+ * Escape a string for HTML. Converts special characters to HTML entities.
+ * @param s The string to escape
+ */
+ escape: function ( s ) {
+ return s.replace( /['"<>&]/g, escapeCallback );
+ },
- /**
- * For backwards-compatibility with Squid-cached pages. Loads mw.user
- */
- this.go = function() { mw.loader.load( 'mediawiki.user' ); };
-
- /* Cache document ready status */
-
- $(document).ready( function() { ready = true; } );
- } )();
-
- /** HTML construction helper functions */
- this.html = new ( function () {
- var escapeCallback = function( s ) {
- switch ( s ) {
- case "'":
- return '&#039;';
- case '"':
- return '&quot;';
- case '<':
- return '&lt;';
- case '>':
- return '&gt;';
- case '&':
- return '&amp;';
- }
- };
-
- /**
- * Escape a string for HTML. Converts special characters to HTML entities.
- * @param s The string to escape
- */
- this.escape = function( s ) {
- return s.replace( /['"<>&]/g, escapeCallback );
- };
-
- /**
- * Wrapper object for raw HTML passed to mw.html.element().
- */
- this.Raw = function( value ) {
- this.value = value;
- };
-
- /**
- * Wrapper object for CDATA element contents passed to mw.html.element()
- */
- this.Cdata = function( value ) {
- this.value = value;
- };
-
- /**
- * Create an HTML element string, with safe escaping.
- *
- * @param name The tag name.
- * @param attrs An object with members mapping element names to values
- * @param contents The contents of the element. May be either:
- * - string: The string is escaped.
- * - null or undefined: The short closing form is used, e.g. <br/>.
- * - this.Raw: The value attribute is included without escaping.
- * - this.Cdata: The value attribute is included, and an exception is
- * thrown if it contains an illegal ETAGO delimiter.
- * See http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2
- *
- * Example:
- * var h = mw.html;
- * return h.element( 'div', {},
- * new h.Raw( h.element( 'img', {src: '<'} ) ) );
- * Returns <div><img src="&lt;"/></div>
- */
- this.element = function( name, attrs, contents ) {
- var v, s = '<' + name;
- for ( var attrName in attrs ) {
- v = attrs[attrName];
- // Convert name=true, to name=name
- if ( v === true ) {
- v = attrName;
- // Skip name=false
- } else if ( v === false ) {
- continue;
- }
- s += ' ' + attrName + '="' + this.escape( '' + v ) + '"';
- }
- if ( contents === undefined || contents === null ) {
- // Self close tag
- s += '/>';
- return s;
- }
- // Regular open tag
- s += '>';
- switch ( typeof contents ) {
- case 'string':
- // Escaped
- s += this.escape( contents );
- break;
- case 'number':
- case 'boolean':
- // Convert to string
- s += '' + contents;
- break;
- default:
- if ( contents instanceof this.Raw ) {
- // Raw HTML inclusion
- s += contents.value;
- } else if ( contents instanceof this.Cdata ) {
- // CDATA
- if ( /<\/[a-zA-z]/.test( contents.value ) ) {
- throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+ /**
+ * Wrapper object for raw HTML passed to mw.html.element().
+ * @constructor
+ */
+ Raw: function ( value ) {
+ this.value = value;
+ },
+
+ /**
+ * Wrapper object for CDATA element contents passed to mw.html.element()
+ * @constructor
+ */
+ Cdata: function ( value ) {
+ this.value = value;
+ },
+
+ /**
+ * Create an HTML element string, with safe escaping.
+ *
+ * @param name The tag name.
+ * @param attrs An object with members mapping element names to values
+ * @param contents The contents of the element. May be either:
+ * - string: The string is escaped.
+ * - null or undefined: The short closing form is used, e.g. <br/>.
+ * - this.Raw: The value attribute is included without escaping.
+ * - this.Cdata: The value attribute is included, and an exception is
+ * thrown if it contains an illegal ETAGO delimiter.
+ * See http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2
+ *
+ * Example:
+ * var h = 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;
+
+ for ( attrName in attrs ) {
+ v = attrs[attrName];
+ // Convert name=true, to name=name
+ if ( v === true ) {
+ v = attrName;
+ // Skip name=false
+ } else if ( v === false ) {
+ continue;
}
- s += contents.value;
- } else {
- throw new Error( 'mw.html.element: Invalid type of contents' );
+ s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
}
- }
- s += '</' + name + '>';
- return s;
- };
- } )();
-
- /* Extension points */
-
- this.legacy = {};
+ if ( contents === undefined || contents === null ) {
+ // Self close tag
+ s += '/>';
+ return s;
+ }
+ // Regular open tag
+ s += '>';
+ switch ( typeof contents ) {
+ case 'string':
+ // Escaped
+ s += this.escape( contents );
+ break;
+ case 'number':
+ case 'boolean':
+ // Convert to string
+ s += String( contents );
+ break;
+ default:
+ if ( contents instanceof this.Raw ) {
+ // Raw HTML inclusion
+ s += contents.value;
+ } else if ( contents instanceof this.Cdata ) {
+ // CDATA
+ if ( /<\/[a-zA-z]/.test( contents.value ) ) {
+ throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+ }
+ s += contents.value;
+ } else {
+ throw new Error( 'mw.html.element: Invalid type of contents' );
+ }
+ }
+ s += '</' + name + '>';
+ return s;
+ }
+ };
+ })(),
-} )( jQuery );
+ // Skeleton user object. mediawiki.user.js extends this
+ user: {
+ options: new Map(),
+ tokens: new Map()
+ }
+ };
+
+})( jQuery );
// Alias $j to jQuery for backwards compatibility
window.$j = jQuery;
-// Global alias
-window.mw = mediaWiki;
-
-/* Auto-register from pre-loaded startup scripts */
+// Attach to window and globally alias
+window.mw = window.mediaWiki = mw;
-if ( jQuery.isFunction( startUp ) ) {
+// Auto-register from pre-loaded startup scripts
+if ( typeof startUp !== 'undefined' && jQuery.isFunction( startUp ) ) {
startUp();
- delete startUp;
+ startUp = undefined;
}
diff --git a/resources/mediawiki/mediawiki.log.js b/resources/mediawiki/mediawiki.log.js
index 38f3411f..ad4c73df 100644
--- a/resources/mediawiki/mediawiki.log.js
+++ b/resources/mediawiki/mediawiki.log.js
@@ -1,67 +1,70 @@
-/*
- * Implementation for mediaWiki.log stub
+/**
+ * Logger for MediaWiki javascript.
+ * Implements the stub left by the main 'mediawiki' module.
+ *
+ * @author Michael Dale <mdale@wikimedia.org>
+ * @author Trevor Parscal <tparscal@wikimedia.org>
*/
-(function( $ ) {
+( function ( $ ) {
/**
- * Log output to the console.
+ * Logs a message to the console.
*
- * In the case that the browser does not have a console available, one is created by appending a
- * <div> element to the bottom of the body and then appending a <div> element to that for each
- * message.
+ * 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
+ * messages to that, instead of the console.
*
- * @author Michael Dale <mdale@wikimedia.org>
- * @author Trevor Parscal <tparscal@wikimedia.org>
- * @param logmsg string Message to output to console.
+ * @param {String} First in list of variadic messages to output to console.
*/
- mw.log = function( logmsg ) {
- // Allow log messages to use a configured prefix to identify the source window (ie. frame)
- if ( mw.config.exists( 'mw.log.prefix' ) ) {
- logmsg = mw.config.get( 'mw.log.prefix' ) + '> ' + logmsg;
- }
+ mw.log = function( /* logmsg, logmsg, */ ) {
+ // 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)
+ prefix = mw.config.exists( 'mw.log.prefix' ) ? mw.config.get( 'mw.log.prefix' ) + '> ' : '';
+
// Try to use an existing console
if ( window.console !== undefined && $.isFunction( window.console.log ) ) {
- window.console.log( logmsg );
- } else {
- // Set timestamp
- var d = new Date();
- var time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
+ args.unshift( prefix );
+ window.console.log.apply( window.console, args );
+ return;
+ }
+
+ // If there is no console, use our own log box
+ mw.loader.using( 'jquery.footHovzer', function () {
+
+ var d = new Date(),
+ // Create HH:MM:SS.MIL timestamp
+ time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
- '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) );
- // Show a log box for console-less browsers
- var $log = $( '#mw-log-console' );
+ '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
+ $log = $( '#mw-log-console' );
+
if ( !$log.length ) {
- $log = $( '<div id="mw-log-console"></div>' )
- .css( {
- 'position': 'fixed',
- 'overflow': 'auto',
- 'z-index': 500,
- 'bottom': '0px',
- 'left': '0px',
- 'right': '0px',
- 'height': '150px',
- 'background-color': 'white',
- 'border-top': 'solid 2px #ADADAD'
+ $log = $( '<div id="mw-log-console"></div>' ).css( {
+ overflow: 'auto',
+ height: '150px',
+ backgroundColor: 'white',
+ borderTop: 'solid 2px #ADADAD'
} );
- $( 'body' )
- .css( 'padding-bottom', '150px' ) // don't hide anything
- .append( $log );
+ var hovzer = $.getFootHovzer();
+ hovzer.$.append( $log );
+ hovzer.update();
}
$log.append(
$( '<div></div>' )
.css( {
- 'border-bottom': 'solid 1px #DDDDDD',
- 'font-size': 'small',
- 'font-family': 'monospace',
- 'white-space': 'pre-wrap',
- 'padding': '0.125em 0.25em'
+ borderBottom: 'solid 1px #DDDDDD',
+ fontSize: 'small',
+ fontFamily: 'monospace',
+ whiteSpace: 'pre-wrap',
+ padding: '0.125em 0.25em'
} )
- .text( logmsg )
- .prepend( '<span style="float:right">[' + time + ']</span>' )
+ .text( prefix + args.join( ', ' ) )
+ .prepend( '<span style="float: right;">[' + time + ']</span>' )
);
- }
+ } );
};
-})(jQuery);
+})( jQuery );
diff --git a/resources/mediawiki/mediawiki.user.js b/resources/mediawiki/mediawiki.user.js
index b0176cf4..7f881b0e 100644
--- a/resources/mediawiki/mediawiki.user.js
+++ b/resources/mediawiki/mediawiki.user.js
@@ -1,5 +1,5 @@
/*
- * Implementation for mediaWiki.log stub
+ * Implementation for mediaWiki.user
*/
(function( $ ) {
@@ -7,7 +7,7 @@
/**
* User object
*/
- function User() {
+ function User( options, tokens ) {
/* Private Members */
@@ -15,9 +15,9 @@
/* Public Members */
- this.options = new mw.Map();
+ this.options = options || new mw.Map();
- this.tokens = new mw.Map();
+ this.tokens = tokens || new mw.Map();
/* Public Methods */
@@ -176,6 +176,8 @@
};
}
- mw.user = new User();
+ // 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 );
})(jQuery); \ No newline at end of file
diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki/mediawiki.util.js
index 59727b3d..0a95d102 100644
--- a/resources/mediawiki/mediawiki.util.js
+++ b/resources/mediawiki/mediawiki.util.js
@@ -1,109 +1,112 @@
/**
- * Utilities
+ * Implements mediaWiki.util library
*/
-( function( $ ) {
+( function ( $, mw ) {
+ "use strict";
// Local cache and alias
- var util = mw.util = {
+ var util = {
- /* Initialisation */
/**
- * @var boolean Wether or not already initialised
+ * Initialisation
+ * (don't call before document ready)
*/
- 'initialised' : false,
- 'init' : function() {
- if ( this.initialised === false ) {
- this.initialised = true;
-
- // Folllowing the initialisation after the DOM is ready
- $(document).ready( function() {
-
- /* Set up $.messageBox */
- $.messageBoxNew( {
- 'id': 'mw-js-message',
- 'parent': '#content'
- } );
+ init: function () {
+ var profile, $tocTitle, $tocToggleLink, hideTocCookie;
- // Shortcut to client profile return
- var profile = $.client.profile();
-
- /* Set tooltipAccessKeyPrefix */
-
- // Opera on any platform
- if ( profile.name == 'opera' ) {
- util.tooltipAccessKeyPrefix = 'shift-esc-';
-
- // Chrome on any platform
- } else if ( profile.name == 'chrome' ) {
- // Chrome on Mac or Chrome on other platform ?
- util.tooltipAccessKeyPrefix = ( profile.platform == 'mac'
- ? 'ctrl-option-' : 'alt-' );
-
- // Non-Windows Safari with webkit_version > 526
- } else if ( profile.platform !== 'win'
- && profile.name == 'safari'
- && profile.layoutVersion > 526 ) {
- util.tooltipAccessKeyPrefix = 'ctrl-alt-';
-
- // Safari/Konqueror on any platform, or any browser on Mac
- // (but not Safari on Windows)
- } else if ( !( profile.platform == 'win' && profile.name == 'safari' )
- && ( profile.name == 'safari'
- || profile.platform == 'mac'
- || profile.name == 'konqueror' ) ) {
- util.tooltipAccessKeyPrefix = 'ctrl-';
-
- // Firefox 2.x and later
- } else if ( profile.name == 'firefox' && profile.versionBase > '1' ) {
- util.tooltipAccessKeyPrefix = 'alt-shift-';
- }
+ /* Set up $.messageBox */
+ $.messageBoxNew( {
+ id: 'mw-js-message',
+ parent: '#content'
+ } );
- /* Fill $content var */
- if ( $( '#bodyContent' ).length ) {
- // Vector, Monobook, Chick etc.
- util.$content = $( '#bodyContent' );
+ /* Set tooltipAccessKeyPrefix */
+ profile = $.client.profile();
+
+ // Opera on any platform
+ if ( profile.name === 'opera' ) {
+ util.tooltipAccessKeyPrefix = 'shift-esc-';
+
+ // Chrome on any platform
+ } else if ( profile.name === 'chrome' ) {
+
+ util.tooltipAccessKeyPrefix = (
+ profile.platform === 'mac'
+ // Chrome on Mac
+ ? 'ctrl-option-'
+ : profile.platform === 'win'
+ // Chrome on Windows
+ // (both alt- and alt-shift work, but alt-f triggers Chrome wrench menu
+ // which alt-shift-f does not)
+ ? 'alt-shift-'
+ // Chrome on other (Ubuntu?)
+ : 'alt-'
+ );
- } else if ( $( '#mw_contentholder' ).length ) {
- // Modern
- util.$content = $( '#mw_contentholder' );
+ // Non-Windows Safari with webkit_version > 526
+ } else if ( profile.platform !== 'win'
+ && profile.name === 'safari'
+ && profile.layoutVersion > 526 ) {
+ util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+
+ // Safari/Konqueror on any platform, or any browser on Mac
+ // (but not Safari on Windows)
+ } else if ( !( profile.platform === 'win' && profile.name === 'safari' )
+ && ( profile.name === 'safari'
+ || profile.platform === 'mac'
+ || profile.name === 'konqueror' ) ) {
+ util.tooltipAccessKeyPrefix = 'ctrl-';
+
+ // Firefox 2.x and later
+ } else if ( profile.name === 'firefox' && profile.versionBase > '1' ) {
+ util.tooltipAccessKeyPrefix = 'alt-shift-';
+ }
- } else if ( $( '#article' ).length ) {
- // Standard, CologneBlue
- util.$content = $( '#article' );
+ /* Fill $content var */
+ if ( $( '#bodyContent' ).length ) {
+ // Vector, Monobook, Chick etc.
+ util.$content = $( '#bodyContent' );
- } else {
- // #content is present on almost all if not all skins. Most skins (the above cases)
- // have #content too, but as an outer wrapper instead of the article text container.
- // The skins that don't have an outer wrapper do have #content for everything
- // so it's a good fallback
- util.$content = $( '#content' );
- }
+ } else if ( $( '#mw_contentholder' ).length ) {
+ // Modern
+ util.$content = $( '#mw_contentholder' );
- /* Table of Contents toggle */
- var $tocContainer = $( '#toc' ),
- $tocTitle = $( '#toctitle' ),
- $tocToggleLink = $( '#togglelink' );
- // Only add it if there is a TOC and there is no toggle added already
- if ( $tocContainer.size() && $tocTitle.size() && !$tocToggleLink.size() ) {
- var 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' ) {
- // Cookie says user want toc hidden
- $tocToggleLink.click();
- }
- }
- } );
+ } else if ( $( '#article' ).length ) {
+ // Standard, CologneBlue
+ util.$content = $( '#article' );
- return true;
+ } else {
+ // #content is present on almost all if not all skins. Most skins (the above cases)
+ // have #content too, but as an outer wrapper instead of the article text container.
+ // The skins that don't have an outer wrapper do have #content for everything
+ // so it's a good fallback
+ util.$content = $( '#content' );
+ }
+
+ // 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' );
+ $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 );
+ }
}
- return false;
},
/* Main body */
@@ -113,8 +116,8 @@
*
* @param str string String to be encoded
*/
- 'rawurlencode' : function( str ) {
- str = ( str + '' ).toString();
+ rawurlencode: function ( str ) {
+ str = String( str );
return encodeURIComponent( str )
.replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
.replace( /\)/g, '%29' ).replace( /\*/g, '%2A' ).replace( /~/g, '%7E' );
@@ -127,20 +130,20 @@
*
* @param str string String to be encoded
*/
- 'wikiUrlencode' : function( str ) {
- return this.rawurlencode( str )
+ wikiUrlencode: function ( str ) {
+ return util.rawurlencode( str )
.replace( /%20/g, '_' ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' );
},
/**
* Get the link to a page name (relative to wgServer)
*
- * @param str string Page name to get the link for.
- * @return string Location for a page with name of 'str' or boolean false on error.
+ * @param str String: Page name to get the link for.
+ * @return String: Location for a page with name of 'str' or boolean false on error.
*/
- 'wikiGetlink' : function( str ) {
+ wikiGetlink: function ( str ) {
return mw.config.get( 'wgArticlePath' ).replace( '$1',
- this.wikiUrlencode( str || mw.config.get( 'wgPageName' ) ) );
+ util.wikiUrlencode( typeof str === 'string' ? str : mw.config.get( 'wgPageName' ) ) );
},
/**
@@ -150,8 +153,9 @@
* @param str string Name of script (eg. 'api'), defaults to 'index'
* @return string Address to script (eg. '/w/api.php' )
*/
- 'wikiScript' : function( str ) {
- return mw.config.get( 'wgScriptPath' ) + '/' + ( str || 'index' ) + mw.config.get( 'wgScriptExtension' );
+ wikiScript: function ( str ) {
+ return mw.config.get( 'wgScriptPath' ) + '/' + ( str || 'index' ) +
+ mw.config.get( 'wgScriptExtension' );
},
/**
@@ -160,7 +164,7 @@
* @param text string CSS to be appended
* @return CSSStyleSheet
*/
- 'addCSS' : function( text ) {
+ addCSS: function ( text ) {
var s = document.createElement( 'style' );
s.type = 'text/css';
s.rel = 'stylesheet';
@@ -169,7 +173,8 @@
if ( s.styleSheet ) {
s.styleSheet.cssText = text; // IE
} else {
- s.appendChild( document.createTextNode( text + '' ) ); // Safari sometimes borks on null
+ // Safari sometimes borks on null
+ s.appendChild( document.createTextNode( String( text ) ) );
}
return s.sheet || s;
},
@@ -183,12 +188,12 @@
* @return mixed Boolean visibility of the toc (true if it's visible)
* or Null if there was no table of contents.
*/
- 'toggleToc' : function( $toggleLink, callback ) {
+ toggleToc: function ( $toggleLink, callback ) {
var $tocList = $( '#toc ul:first' );
// This function shouldn't be called if there's no TOC,
// but just in case...
- if ( $tocList.size() ) {
+ if ( $tocList.length ) {
if ( $tocList.is( ':hidden' ) ) {
$tocList.slideDown( 'fast', callback );
$toggleLink.text( mw.msg( 'hidetoc' ) );
@@ -221,11 +226,11 @@
* @param url string URL to search through (optional)
* @return mixed Parameter value or null.
*/
- 'getParamValue' : function( param, url ) {
- url = url ? url : document.location.href;
+ getParamValue: function ( param, url ) {
+ url = url || document.location.href;
// Get last match, stop at hash
- var re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' );
- var m = re.exec( url );
+ var re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
+ m = re.exec( url );
if ( m && m.length > 1 ) {
// Beware that decodeURIComponent is not required to understand '+'
// by spec, as encodeURIComponent does not produce it.
@@ -239,13 +244,13 @@
* Access key prefix. Will be re-defined based on browser/operating system
* detection in mw.util.init().
*/
- 'tooltipAccessKeyPrefix' : 'alt-',
+ tooltipAccessKeyPrefix: 'alt-',
/**
* @var RegExp
* Regex to match accesskey tooltips.
*/
- 'tooltipAccessKeyRegexp': /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+ tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
/**
* Add the appropriate prefix to the accesskey shown in the tooltip.
@@ -253,36 +258,25 @@
* otherwise, all the nodes that will probably have accesskeys by
* default are updated.
*
- * @param nodeList {Array|jQuery} (optional) A jQuery object, or array of elements to update.
+ * @param $nodes {Array|jQuery} [optional] A jQuery object, or array
+ * of elements to update.
*/
- 'updateTooltipAccessKeys' : function( nodeList ) {
- var $nodes;
- if ( !nodeList ) {
-
- // Rather than scanning all links, just the elements that
- // contain the relevant links
- this.updateTooltipAccessKeys(
- $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a' ) );
-
- // these are rare enough that no such optimization is needed
- this.updateTooltipAccessKeys( $( 'input' ) );
- this.updateTooltipAccessKeys( $( 'label' ) );
-
- return;
-
- } else if ( nodeList instanceof jQuery ) {
- $nodes = nodeList;
- } else {
- $nodes = $( nodeList );
+ updateTooltipAccessKeys: function ( $nodes ) {
+ if ( !$nodes ) {
+ // Rather than going into a loop of all anchor tags, limit to few elements that
+ // contain the relevant anchor tags.
+ // Input and label are rare enough that no such optimization is needed
+ $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label' );
+ } else if ( !( $nodes instanceof $ ) ) {
+ $nodes = $( $nodes );
}
- $nodes.each( function ( i ) {
- var tip = $(this).attr( 'title' );
- if ( !!tip && util.tooltipAccessKeyRegexp.exec( tip ) ) {
- tip = tip.replace( util.tooltipAccessKeyRegexp,
- '[' + util.tooltipAccessKeyPrefix + "$5]" );
- $(this).attr( 'title', tip );
+ $nodes.attr( 'title', function ( i, val ) {
+ if ( val && util.tooltipAccessKeyRegexp.exec( val ) ) {
+ return val.replace( util.tooltipAccessKeyRegexp,
+ '[' + util.tooltipAccessKeyPrefix + '$5]' );
}
+ return val;
} );
},
@@ -291,7 +285,7 @@
* A jQuery object that refers to the page-content element
* Populated by init().
*/
- '$content' : null,
+ $content: null,
/**
* Add a link to a portlet menu on the page, such as:
@@ -328,14 +322,15 @@
* @return mixed The DOM Node of the added item (a ListItem or Anchor element,
* depending on the skin) or null if no element was added to the document.
*/
- 'addPortletLink' : function( portlet, href, text, id, tooltip, accesskey, nextnode ) {
+ addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
+ var $item, $link, $portlet, $ul;
// Check if there's atleast 3 arguments to prevent a TypeError
if ( arguments.length < 3 ) {
return null;
}
// Setup the anchor tag
- var $link = $( '<a></a>' ).attr( 'href', href ).text( text );
+ $link = $( '<a>' ).attr( 'href', href ).text( text );
if ( tooltip ) {
$link.attr( 'title', tooltip );
}
@@ -343,22 +338,22 @@
// 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' :
- case 'cologneblue' :
- $( '#quickbar' ).append( $link.after( '<br />' ) );
+ case 'standard':
+ case 'cologneblue':
+ $( '#quickbar' ).append( $link.after( '<br/>' ) );
return $link[0];
- case 'nostalgia' :
- $( '#searchform' ).before( $link).before( ' &#124; ' );
+ case 'nostalgia':
+ $( '#searchform' ).before( $link ).before( ' &#124; ' );
return $link[0];
- default : // Skins like chick, modern, monobook, myskin, simple, vector...
+ default: // Skins like chick, modern, monobook, myskin, simple, vector...
// Select the specified portlet
- var $portlet = $( '#' + portlet );
+ $portlet = $( '#' + portlet );
if ( $portlet.length === 0 ) {
return null;
}
// Select the first (most likely only) unordered list inside the portlet
- var $ul = $portlet.find( 'ul' );
+ $ul = $portlet.find( 'ul' );
// If it didn't have an unordered list yet, create it
if ( $ul.length === 0 ) {
@@ -383,7 +378,6 @@
// 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
- var $item;
if ( $portlet.hasClass( 'vectorTabs' ) ) {
$item = $link.wrap( '<li><span></span></li>' ).parent().parent();
} else {
@@ -400,19 +394,18 @@
$link.attr( 'title', tooltip );
}
if ( accesskey && tooltip ) {
- this.updateTooltipAccessKeys( $link );
+ util.updateTooltipAccessKeys( $link );
}
// Where to put our node ?
- // - nextnode is a DOM element (before MW 1.17, in wikibits.js, this was the only option)
- if ( nextnode && nextnode.parentNode == $ul[0] ) {
+ // - 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 ) {
+ } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
$ul.find( nextnode ).eq( 0 ).before( $item );
-
// 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 behaviour)
@@ -430,15 +423,13 @@
* something, replacing any previous message.
* Calling with no arguments, with an empty string or null will hide the message
*
- * @param message mixed The DOM-element or HTML-string to be put inside the message box.
- * @param className string Used in adding a class; should be different for each call
+ * @param message {mixed} The DOM-element, jQuery object or HTML-string to be put inside the message box.
+ * @param className {String} Used in adding a class; should be different for each call
* to allow CSS/JS to hide different boxes. null = no class used.
- * @return boolean True on success, false on failure.
+ * @return {Boolean} True on success, false on failure.
*/
- 'jsMessage' : function( message, className ) {
-
+ jsMessage: function ( message, className ) {
if ( !arguments.length || message === '' || message === null ) {
-
$( '#mw-js-message' ).empty().hide();
return true; // Emptying and hiding message is intended behaviour, return true
@@ -448,7 +439,7 @@
// an mw-js-message div to start with.
var $messageDiv = $( '#mw-js-message' );
if ( !$messageDiv.length ) {
- $messageDiv = $( '<div id="mw-js-message">' );
+ $messageDiv = $( '<div id="mw-js-message"></div>' );
if ( util.$content.parent().length ) {
util.$content.parent().prepend( $messageDiv );
} else {
@@ -457,12 +448,12 @@
}
if ( className ) {
- $messageDiv.attr( 'class', 'mw-js-message-' + className );
+ $messageDiv.prop( 'class', 'mw-js-message-' + className );
}
if ( typeof message === 'object' ) {
$messageDiv.empty();
- $messageDiv.append( message ); // Append new content
+ $messageDiv.append( message );
} else {
$messageDiv.html( message );
}
@@ -483,8 +474,10 @@
* @return mixed Null if mailtxt was an empty string, otherwise true/false
* is determined by validation.
*/
- 'validateEmail' : function( mailtxt ) {
- if( mailtxt === '' ) {
+ validateEmail: function ( mailtxt ) {
+ var rfc5322_atext, rfc1034_ldh_str, HTML5_email_regexp;
+
+ if ( mailtxt === '' ) {
return null;
}
@@ -500,7 +493,7 @@
*/
/**
- * First, define the RFC 5322 'atext' which is pretty easy :
+ * First, define the RFC 5322 'atext' which is pretty easy:
* atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
@@ -513,7 +506,7 @@
"|" / "}" /
"~"
*/
- var rfc5322_atext = "a-z0-9!#$%&'*+\\-/=?^_`{|}~",
+ rfc5322_atext = "a-z0-9!#$%&'*+\\-/=?^_`{|}~";
/**
* Next define the RFC 1034 'ldh-str'
@@ -524,29 +517,29 @@
* <let-dig-hyp> ::= <let-dig> | "-"
* <let-dig> ::= <letter> | <digit>
*/
- rfc1034_ldh_str = "a-z0-9\\-",
-
- HTML5_email_regexp = new RegExp(
- // start of string
- '^'
- +
- // User part which is liberal :p
- '[' + rfc5322_atext + '\\.]+'
- +
- // 'at'
- '@'
- +
- // Domain first part
- '[' + rfc1034_ldh_str + ']+'
- +
- // Optional second part and following are separated by a dot
- '(?:\\.[' + rfc1034_ldh_str + ']+)*'
- +
- // End of string
- '$',
- // RegExp is case insensitive
- 'i'
- );
+ rfc1034_ldh_str = "a-z0-9\\-";
+
+ HTML5_email_regexp = new RegExp(
+ // start of string
+ '^'
+ +
+ // User part which is liberal :p
+ '[' + rfc5322_atext + '\\.]+'
+ +
+ // 'at'
+ '@'
+ +
+ // Domain first part
+ '[' + rfc1034_ldh_str + ']+'
+ +
+ // Optional second part and following are separated by a dot
+ '(?:\\.[' + rfc1034_ldh_str + ']+)*'
+ +
+ // End of string
+ '$',
+ // RegExp is case insensitive
+ 'i'
+ );
return (null !== mailtxt.match( HTML5_email_regexp ) );
},
@@ -557,12 +550,18 @@
* @param allowBlock boolean
* @return boolean
*/
- 'isIPv4Address' : function( address, allowBlock ) {
- var block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '';
- var RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])';
- var RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
- return typeof address === 'string' && address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) != -1;
+ isIPv4Address: function ( address, allowBlock ) {
+ if ( typeof address !== 'string' ) {
+ return false;
+ }
+
+ var block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '',
+ RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
+ RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
+
+ return address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) !== -1;
},
+
/**
* Note: borrows from IP::isIPv6
*
@@ -570,12 +569,13 @@
* @param allowBlock boolean
* @return boolean
*/
- 'isIPv6Address' : function( address, allowBlock ) {
+ isIPv6Address: function ( address, allowBlock ) {
if ( typeof address !== 'string' ) {
return false;
}
- var block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '';
- var RE_IPV6_ADD =
+
+ var block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '',
+ RE_IPV6_ADD =
'(?:' + // starts with "::" (including "::")
':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
'|' + // ends with "::" (except "::")
@@ -583,17 +583,19 @@
'|' + // contains no "::"
'[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
')';
- if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) != -1 ) {
+
+ if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1 ) {
return true;
}
+
RE_IPV6_ADD = // contains one "::" in the middle (single '::' check below)
'[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
- return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) != -1
- && address.search( /::/ ) != -1 && address.search( /::.*::/ ) == -1;
- }
+ return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) !== -1
+ && address.search( /::/ ) !== -1 && address.search( /::.*::/ ) === -1;
+ }
};
- util.init();
+ mw.util = util;
-} )( jQuery );
+} )( jQuery, mediaWiki );
diff --git a/skins/ArchLinux.php b/skins/ArchLinux.php
index 02598641..7a30b6e2 100644
--- a/skins/ArchLinux.php
+++ b/skins/ArchLinux.php
@@ -20,6 +20,9 @@ class SkinArchLinux extends SkinTemplate {
var $skinname = 'archlinux', $stylename = 'archlinux',
$template = 'ArchLinuxTemplate', $useHeadElement = true;
+ /**
+ * @param $out OutputPage
+ */
function setupSkinUserCss( OutputPage $out ) {
global $wgHandheldStyle;
parent::setupSkinUserCss( $out );
@@ -33,8 +36,6 @@ class SkinArchLinux extends SkinTemplate {
}
// TODO: Migrate all of these
- $out->addStyle( 'archlinux/IE50Fixes.css', 'screen', 'lt IE 5.5000' );
- $out->addStyle( 'archlinux/IE55Fixes.css', 'screen', 'IE 5.5000' );
$out->addStyle( 'archlinux/IE60Fixes.css', 'screen', 'IE 6' );
$out->addStyle( 'archlinux/IE70Fixes.css', 'screen', 'IE 7' );
@@ -48,11 +49,6 @@ class SkinArchLinux extends SkinTemplate {
class ArchLinuxTemplate extends BaseTemplate {
/**
- * @var Skin
- */
- var $skin;
-
- /**
* Template filter callback for ArchLinux skin.
* Takes an associative array of data set from a SkinTemplate-based
* class, and a wrapper for MediaWiki's localization database, and
@@ -62,8 +58,6 @@ class ArchLinuxTemplate extends BaseTemplate {
*/
function execute() {
global $wgArchNavBar, $wgArchHome, $wgArchNavBarSelected, $wgArchNavBarSelectedDefault;
- $this->skin = $this->data['skin'];
-
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
@@ -98,8 +92,8 @@ class ArchLinuxTemplate extends BaseTemplate {
<a id="top"></a>
<?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
- <h1 id="firstHeading" class="firstHeading"><?php $this->html('title') ?></h1>
- <div id="bodyContent">
+ <h1 id="firstHeading" class="firstHeading"><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']) { ?>
@@ -107,7 +101,7 @@ class ArchLinuxTemplate extends BaseTemplate {
<?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"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a>, <a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+ <div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a>, <a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
<?php } ?>
<!-- start content -->
<?php $this->html('bodytext') ?>
@@ -131,15 +125,13 @@ class ArchLinuxTemplate extends BaseTemplate {
</div>
</div>
<div class="portlet" id="p-logo">
- <?php
- $logoAttribs = array() + Linker::tooltipAndAccesskeyAttribs('p-logo');
- $logoAttribs['style'] = "background-image: url({$this->data['logopath']});";
- $logoAttribs['href'] = $this->data['nav_urls']['mainpage']['href'];
- echo Html::element( 'a', $logoAttribs );
- ?>
+<?php
+ echo Html::element( 'a', array(
+ 'href' => $this->data['nav_urls']['mainpage']['href'],
+ 'style' => "background-image: url({$this->data['logopath']});" )
+ + Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
</div>
- <script type="<?php $this->text('jsmimetype') ?>"> if (window.isMSIE55) fixalpha(); </script>
<?php
$this->renderPortals( $this->data['sidebar'] );
?>
@@ -159,7 +151,7 @@ class ArchLinuxTemplate extends BaseTemplate {
foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
<div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
<?php foreach ( $footerIcons as $icon ) { ?>
- <?php echo $this->skin->makeFooterIcon( $icon ); ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
<?php }
?>
@@ -245,25 +237,8 @@ echo $footerEnd;
<div class="pBody">
<ul><?php
foreach($this->data['content_actions'] as $key => $tab) {
- $linkAttribs = array( 'href' => $tab['href'] );
-
- if( isset( $tab["tooltiponly"] ) && $tab["tooltiponly"] ) {
- $title = Linker::titleAttrib( "ca-$key" );
- if ( $title !== false ) {
- $linkAttribs['title'] = $title;
- }
- } else {
- $linkAttribs += Linker::tooltipAndAccesskeyAttribs( "ca-$key" );
- }
- $linkHtml = Html::element( 'a', $linkAttribs, $tab['text'] );
-
- /* Surround with a <li> */
- $liAttribs = array( 'id' => Sanitizer::escapeId( "ca-$key" ) );
- if( $tab['class'] ) {
- $liAttribs['class'] = $tab['class'];
- }
- echo '
- ' . Html::rawElement( 'li', $liAttribs, $linkHtml );
+ echo '
+ ' . $this->makeListItem( $key, $tab );
} ?>
</ul>
diff --git a/skins/Chick.php b/skins/Chick.php
index b7cef695..2362263c 100644
--- a/skins/Chick.php
+++ b/skins/Chick.php
@@ -21,14 +21,15 @@ 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/IE50Fixes.css', 'screen,handheld', 'lt IE 5.5000' );
- $out->addStyle( 'chick/IE55Fixes.css', 'screen,handheld', 'IE 5.5000' );
$out->addStyle( 'chick/IE60Fixes.css', 'screen,handheld', 'IE 6' );
}
}
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index 58b00fc6..c5b3b11d 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -19,6 +19,9 @@ class SkinCologneBlue extends SkinLegacy {
var $skinname = 'cologneblue', $stylename = 'cologneblue',
$template = 'CologneBlueTemplate';
+ /**
+ * @param $out OutputPage
+ */
function setupSkinUserCss( OutputPage $out ){
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.cologneblue' );
@@ -55,6 +58,9 @@ class SkinCologneBlue extends SkinLegacy {
class CologneBlueTemplate extends LegacyTemplate {
+ /**
+ * @return string
+ */
function doBeforeContent() {
$mainPageObj = Title::newMainPage();
@@ -62,7 +68,7 @@ class CologneBlueTemplate extends LegacyTemplate {
'<table width="100%" border="0" cellspacing="0" cellpadding="8"><tr>';
$s .= '<td class="top" nowrap="nowrap">';
- $s .= '<a href="' . $mainPageObj->escapeLocalURL() . '">';
+ $s .= '<a href="' . htmlspecialchars( $mainPageObj->getLocalURL() ) . '">';
$s .= '<span id="sitetitle">' . wfMsg( 'sitetitle' ) . '</span></a>';
$s .= '</td><td class="top" id="top-syslinks" width="100%">';
@@ -75,10 +81,9 @@ class CologneBlueTemplate extends LegacyTemplate {
$s .= '<font size="-1"><span id="langlinks">';
$s .= str_replace( '<br />', '', $this->otherLanguages() );
- $cat = '<div id="catlinks" class="catlinks">' . $this->getSkin()->getCategoryLinks() . '</div>';
- if( $cat ) {
- $s .= "<br />$cat\n";
- }
+
+ $s .= $this->getSkin()->getCategories();
+
$s .= '<br />' . $this->pageTitleLinks();
$s .= '</span></font>';
@@ -95,9 +100,10 @@ class CologneBlueTemplate extends LegacyTemplate {
return $s;
}
+ /**
+ * @return string
+ */
function doAfterContent(){
- global $wgLang;
-
$s = "\n</div><br clear='all' />\n";
$s .= "\n<div id='footer'>";
@@ -106,7 +112,7 @@ class CologneBlueTemplate extends LegacyTemplate {
$s .= '<td class="bottom">';
$s .= $this->bottomLinks();
- $s .= $wgLang->pipeList( array(
+ $s .= $this->getSkin()->getLanguage()->pipeList( array(
"\n<br />" . Linker::link(
Title::newMainPage(),
null,
@@ -129,8 +135,10 @@ class CologneBlueTemplate extends LegacyTemplate {
return $s;
}
+ /**
+ * @return string
+ */
function sysLinks() {
- global $wgUser, $wgLang;
$li = SpecialPage::getTitleFor( 'Userlogin' );
$lo = SpecialPage::getTitleFor( 'Userlogout' );
@@ -165,7 +173,7 @@ class CologneBlueTemplate extends LegacyTemplate {
if( $this->extensionTabLinks() ) {
$s[] = $this->extensionTabLinks();
}
- if ( $wgUser->isLoggedIn() ) {
+ if ( $this->data['loggedin'] ) {
$s[] = Linker::linkKnown(
$lo,
wfMsg( 'logout' ),
@@ -181,18 +189,16 @@ class CologneBlueTemplate extends LegacyTemplate {
);
}
- return $wgLang->pipeList( $s );
+ return $this->getSkin()->getLanguage()->pipeList( $s );
}
/**
* Compute the sidebar
* @access private
+ *
+ * @return string
*/
function quickBar(){
- global $wgOut, $wgUser;
-
- $tns = $this->getSkin()->getTitle()->getNamespace();
-
$s = "\n<div id='quickbar'>";
$sep = '<br />';
@@ -229,7 +235,9 @@ class CologneBlueTemplate extends LegacyTemplate {
$barnumber++;
}
- if ( $wgOut->isArticle() ) {
+ $user = $this->getSkin()->getUser();
+
+ if ( $this->data['isarticle'] ) {
$s .= $this->menuHead( 'qbedit' );
$s .= '<strong>' . $this->editThisPage() . '</strong>';
@@ -238,16 +246,16 @@ class CologneBlueTemplate extends LegacyTemplate {
wfMsg( 'edithelp' )
);
- if( $wgUser->isLoggedIn() ) {
+ if( $this->data['loggedin'] ) {
$s .= $sep . $this->moveThisPage();
}
- if ( $wgUser->isAllowed( 'delete' ) ) {
+ if ( $user->isAllowed( 'delete' ) ) {
$dtp = $this->deleteThisPage();
if ( $dtp != '' ) {
$s .= $sep . $dtp;
}
}
- if ( $wgUser->isAllowed( 'protect' ) ) {
+ if ( $user->isAllowed( 'protect' ) ) {
$ptp = $this->protectThisPage();
if ( $ptp != '' ) {
$s .= $sep . $ptp;
@@ -259,7 +267,7 @@ class CologneBlueTemplate extends LegacyTemplate {
$s .= $this->talkLink()
. $sep . $this->commentLink()
. $sep . $this->printableLink();
- if ( $wgUser->isLoggedIn() ) {
+ if ( $this->data['loggedin'] ) {
$s .= $sep . $this->watchThisPage();
}
@@ -270,8 +278,10 @@ class CologneBlueTemplate extends LegacyTemplate {
. $sep . $this->whatLinksHere()
. $sep . $this->watchPageLinksLink();
- if( $tns == NS_USER || $tns == NS_USER_TALK ) {
- $id = User::idFromName( $this->getSkin()->getTitle()->getText() );
+ $title = $this->getSkin()->getTitle();
+ $tns = $title->getNamespace();
+ if ( $tns == NS_USER || $tns == NS_USER_TALK ) {
+ $id = User::idFromName( $title->getText() );
if( $id != 0 ) {
$s .= $sep . $this->userContribsLink();
if( $this->getSkin()->showEmailUser( $id ) ) {
@@ -283,20 +293,20 @@ class CologneBlueTemplate extends LegacyTemplate {
}
$s .= $this->menuHead( 'qbmyoptions' );
- if ( $wgUser->isLoggedIn() ) {
+ if ( $this->data['loggedin'] ) {
$tl = Linker::link(
- $wgUser->getTalkPage(),
+ $user->getTalkPage(),
wfMsg( 'mytalk' ),
array(),
array(),
array( 'known', 'noclasses' )
);
- if ( $wgUser->getNewtalk() ) {
+ if ( $user->getNewtalk() ) {
$tl .= ' *';
}
$s .= Linker::link(
- $wgUser->getUserPage(),
+ $user->getUserPage(),
wfMsg( 'mypage' ),
array(),
array(),
@@ -304,7 +314,7 @@ class CologneBlueTemplate extends LegacyTemplate {
) . $sep . $tl . $sep . Linker::specialLink( 'Watchlist' )
. $sep .
Linker::link(
- SpecialPage::getSafeTitleFor( 'Contributions', $wgUser->getName() ),
+ SpecialPage::getSafeTitleFor( 'Contributions', $user->getName() ),
wfMsg( 'mycontris' ),
array(),
array(),
@@ -319,7 +329,7 @@ class CologneBlueTemplate extends LegacyTemplate {
. Linker::specialLink( 'Newpages' )
. $sep . Linker::specialLink( 'Listfiles' )
. $sep . Linker::specialLink( 'Statistics' );
- if( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
$s .= $sep . $this->getUploadLink();
}
@@ -342,15 +352,23 @@ class CologneBlueTemplate extends LegacyTemplate {
return $s;
}
+ /**
+ * @param $key string
+ * @return string
+ */
function menuHead( $key ) {
$s = "\n<h6>" . wfMsg( $key ) . "</h6>";
return $s;
}
+ /**
+ * @param $label string
+ * @return string
+ */
function searchForm( $label = '' ) {
- global $wgRequest, $wgUseTwoButtonsSearchForm;
+ global $wgUseTwoButtonsSearchForm;
- $search = $wgRequest->getText( 'search' );
+ $search = $this->getSkin()->getRequest()->getText( 'search' );
$action = $this->data['searchaction'];
$s = "<form id=\"searchform{$this->searchboxes}\" method=\"get\" class=\"inline\" action=\"$action\">";
if( $label != '' ) {
diff --git a/skins/Modern.php b/skins/Modern.php
index c4070b5d..ebd574f4 100644
--- a/skins/Modern.php
+++ b/skins/Modern.php
@@ -21,6 +21,9 @@ class SkinModern extends SkinTemplate {
var $skinname = 'modern', $stylename = 'modern',
$template = 'ModernTemplate', $useHeadElement = true;
+ /**
+ * @param $out OutputPage
+ */
function setupSkinUserCss( OutputPage $out ){
parent::setupSkinUserCss( $out );
$out->addModuleStyles ('skins.modern');
@@ -34,10 +37,6 @@ class SkinModern extends SkinTemplate {
class ModernTemplate extends MonoBookTemplate {
/**
- * @var Skin
- */
- var $skin;
- /**
* Template filter callback for Modern skin.
* Takes an associative array of data set from a SkinTemplate-based
* class, and a wrapper for MediaWiki's localization database, and
@@ -46,8 +45,6 @@ class ModernTemplate extends MonoBookTemplate {
* @access private
*/
function execute() {
- $this->skin = $skin = $this->data['skin'];
-
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
@@ -55,7 +52,7 @@ class ModernTemplate extends MonoBookTemplate {
?>
<!-- heading -->
- <div id="mw_header"><h1 id="firstHeading"><?php $this->html('title') ?></h1></div>
+ <div id="mw_header"><h1 id="firstHeading"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
<div id="mw_main">
<div id="mw_contentwrapper">
@@ -134,7 +131,7 @@ class ModernTemplate extends MonoBookTemplate {
<div id="mw_<?php echo htmlspecialchars($blockName); ?>">
<?php
foreach ( $footerIcons as $icon ) { ?>
- <?php echo $this->skin->makeFooterIcon( $icon, 'withoutImage' ); ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
<?php
} ?>
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index 0cf72e93..f1fe5090 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -23,6 +23,9 @@ class SkinMonoBook extends SkinTemplate {
var $skinname = 'monobook', $stylename = 'monobook',
$template = 'MonoBookTemplate', $useHeadElement = true;
+ /**
+ * @param $out OutputPage
+ */
function setupSkinUserCss( OutputPage $out ) {
global $wgHandheldStyle;
parent::setupSkinUserCss( $out );
@@ -36,8 +39,6 @@ class SkinMonoBook extends SkinTemplate {
}
// TODO: Migrate all of these
- $out->addStyle( 'monobook/IE50Fixes.css', 'screen', 'lt IE 5.5000' );
- $out->addStyle( 'monobook/IE55Fixes.css', 'screen', 'IE 5.5000' );
$out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
$out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
@@ -51,11 +52,6 @@ class SkinMonoBook extends SkinTemplate {
class MonoBookTemplate extends BaseTemplate {
/**
- * @var Skin
- */
- var $skin;
-
- /**
* Template filter callback for MonoBook skin.
* Takes an associative array of data set from a SkinTemplate-based
* class, and a wrapper for MediaWiki's localization database, and
@@ -64,8 +60,6 @@ class MonoBookTemplate extends BaseTemplate {
* @access private
*/
function execute() {
- $this->skin = $this->data['skin'];
-
// Suppress warnings to prevent notices about missing indexes in $this->data
wfSuppressWarnings();
@@ -75,8 +69,8 @@ class MonoBookTemplate extends BaseTemplate {
<a id="top"></a>
<?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
- <h1 id="firstHeading" class="firstHeading"><?php $this->html('title') ?></h1>
- <div id="bodyContent">
+ <h1 id="firstHeading" class="firstHeading"><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']) { ?>
@@ -84,7 +78,7 @@ class MonoBookTemplate extends BaseTemplate {
<?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"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a>, <a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+ <div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a>, <a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
<?php } ?>
<!-- start content -->
<?php $this->html('bodytext') ?>
@@ -108,15 +102,13 @@ class MonoBookTemplate extends BaseTemplate {
</div>
</div>
<div class="portlet" id="p-logo">
- <?php
- $logoAttribs = array() + Linker::tooltipAndAccesskeyAttribs('p-logo');
- $logoAttribs['style'] = "background-image: url({$this->data['logopath']});";
- $logoAttribs['href'] = $this->data['nav_urls']['mainpage']['href'];
- echo Html::element( 'a', $logoAttribs );
- ?>
+<?php
+ echo Html::element( 'a', array(
+ 'href' => $this->data['nav_urls']['mainpage']['href'],
+ 'style' => "background-image: url({$this->data['logopath']});" )
+ + Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
</div>
- <script type="<?php $this->text('jsmimetype') ?>"> if (window.isMSIE55) fixalpha(); </script>
<?php
$this->renderPortals( $this->data['sidebar'] );
?>
@@ -136,7 +128,7 @@ class MonoBookTemplate extends BaseTemplate {
foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
<div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
<?php foreach ( $footerIcons as $icon ) { ?>
- <?php echo $this->skin->makeFooterIcon( $icon ); ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
<?php }
?>
@@ -222,25 +214,8 @@ echo $footerEnd;
<div class="pBody">
<ul><?php
foreach($this->data['content_actions'] as $key => $tab) {
- $linkAttribs = array( 'href' => $tab['href'] );
-
- if( isset( $tab["tooltiponly"] ) && $tab["tooltiponly"] ) {
- $title = Linker::titleAttrib( "ca-$key" );
- if ( $title !== false ) {
- $linkAttribs['title'] = $title;
- }
- } else {
- $linkAttribs += Linker::tooltipAndAccesskeyAttribs( "ca-$key" );
- }
- $linkHtml = Html::element( 'a', $linkAttribs, $tab['text'] );
-
- /* Surround with a <li> */
- $liAttribs = array( 'id' => Sanitizer::escapeId( "ca-$key" ) );
- if( $tab['class'] ) {
- $liAttribs['class'] = $tab['class'];
- }
- echo '
- ' . Html::rawElement( 'li', $liAttribs, $linkHtml );
+ echo '
+ ' . $this->makeListItem( $key, $tab );
} ?>
</ul>
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
index a4fd985d..21d3578d 100644
--- a/skins/Nostalgia.php
+++ b/skins/Nostalgia.php
@@ -18,6 +18,9 @@ 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' );
@@ -27,6 +30,9 @@ class SkinNostalgia extends SkinLegacy {
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>';
@@ -48,10 +54,7 @@ class NostalgiaTemplate extends LegacyTemplate {
$s .= '<br />' . $ol;
}
- $cat = '<div id="catlinks" class="catlinks">' . $this->getSkin()->getCategoryLinks() . '</div>';
- if( $cat ) {
- $s .= '<br />' . $cat;
- }
+ $s .= $this->getSkin()->getCategories();
$s .= "<br clear='all' /></div><hr />\n</div>\n";
$s .= "\n<div id='article'>";
@@ -59,14 +62,16 @@ class NostalgiaTemplate extends LegacyTemplate {
return $s;
}
+ /**
+ * @return string
+ */
function topLinks() {
- global $wgOut, $wgUser;
$sep = " |\n";
$s = $this->getSkin()->mainPageLink() . $sep
. Linker::specialLink( 'Recentchanges' );
- if ( $wgOut->isArticle() ) {
+ if ( $this->data['isarticle'] ) {
$s .= $sep . '<strong>' . $this->editThisPage() . '</strong>' . $sep . $this->talkLink() .
$sep . $this->historyLink();
}
@@ -74,30 +79,31 @@ class NostalgiaTemplate extends LegacyTemplate {
/* show links to different language variants */
$s .= $this->variantLinks();
$s .= $this->extensionTabLinks();
- if ( $wgUser->isAnon() ) {
+ if ( !$this->data['loggedin'] ) {
$s .= $sep . Linker::specialLink( 'Userlogin' );
} else {
/* show user page and user talk links */
- $s .= $sep . Linker::link( $wgUser->getUserPage(), wfMsgHtml( 'mypage' ) );
- $s .= $sep . Linker::link( $wgUser->getTalkPage(), wfMsgHtml( 'mytalk' ) );
- if ( $wgUser->getNewtalk() ) {
+ $user = $this->getSkin()->getUser();
+ $s .= $sep . Linker::link( $user->getUserPage(), wfMsgHtml( 'mypage' ) );
+ $s .= $sep . Linker::link( $user->getTalkPage(), wfMsgHtml( 'mytalk' ) );
+ if ( $user->getNewtalk() ) {
$s .= ' *';
}
/* show watchlist link */
$s .= $sep . Linker::specialLink( 'Watchlist' );
/* show my contributions link */
$s .= $sep . Linker::link(
- SpecialPage::getSafeTitleFor( 'Contributions', $wgUser->getName() ),
+ SpecialPage::getSafeTitleFor( 'Contributions', $this->data['username'] ),
wfMsgHtml( 'mycontris' ) );
/* show my preferences link */
$s .= $sep . Linker::specialLink( 'Preferences' );
/* show upload file link */
- if( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
$s .= $sep . $this->getUploadLink();
}
/* show log out link */
- $s .= $sep . $this->getSkin()->specialLink( 'Userlogout' );
+ $s .= $sep . Linker::specialLink( 'Userlogout' );
}
$s .= $sep . $this->specialPagesList();
@@ -105,6 +111,9 @@ class NostalgiaTemplate extends LegacyTemplate {
return $s;
}
+ /**
+ * @return string
+ */
function doAfterContent() {
$s = "\n</div><br clear='all' />\n";
diff --git a/skins/Simple.php b/skins/Simple.php
index 61b6e786..54be9f7d 100644
--- a/skins/Simple.php
+++ b/skins/Simple.php
@@ -21,22 +21,24 @@ 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 */
- global $wgUser;
$rules = array();
$underline = "";
- if ( $wgUser->getOption( 'underline' ) < 2 ) {
- $underline = "text-decoration: " . $wgUser->getOption( 'underline' ) ? 'underline !important' : 'none' . ";";
+ if ( $this->getUser()->getOption( 'underline' ) < 2 ) {
+ $underline = "text-decoration: " . $this->getUser()->getOption( 'underline' ) ? 'underline !important' : 'none' . ";";
}
/* Also inherits from resourceloader */
- if( !$wgUser->getOption( 'highlightbroken' ) ) {
+ if( !$this->getUser()->getOption( 'highlightbroken' ) ) {
$rules[] = "a.new, a.stub { color: inherit; text-decoration: inherit;}";
$rules[] = "a.new:after { color: #CC2200; $underline;}";
$rules[] = "a.stub:after { $underline; }";
diff --git a/skins/Standard.php b/skins/Standard.php
index 8ae4b3b1..bd0c41a5 100644
--- a/skins/Standard.php
+++ b/skins/Standard.php
@@ -18,9 +18,12 @@ 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' );
+ $out->addModuleStyles( 'skins.standard' );
$qb = $this->qbSetting();
$rules = array();
@@ -37,12 +40,12 @@ class SkinStandard extends SkinLegacy {
$rules[] = "/* @noflip */#quickbar { position: fixed; padding: 4px; }";
}
} elseif ( 4 == $qb ) {
- $rules[] = "/* @noflip */#quickbar { position: fixed; right: 0px; top: 0px; padding: 4px;}";
+ $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 );
+ $style = implode( "\n", $rules );
$out->addInlineStyle( $style, 'flip' );
}
@@ -50,8 +53,10 @@ class SkinStandard extends SkinLegacy {
class StandardTemplate extends LegacyTemplate {
+ /**
+ * @return string
+ */
function doAfterContent() {
- global $wgContLang, $wgLang;
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-1' );
@@ -61,11 +66,11 @@ class StandardTemplate extends LegacyTemplate {
wfProfileOut( __METHOD__ . '-1' );
wfProfileIn( __METHOD__ . '-2' );
- $l = $this->getSkin()->getLang()->alignStart();
+ $l = $this->getSkin()->getLanguage()->alignStart();
$s .= "<td class='bottom' align='$l' valign='top'>";
$s .= $this->bottomLinks();
- $s .= "\n<br />" . $wgLang->pipeList( array(
+ $s .= "\n<br />" . $this->getSkin()->getLanguage()->pipeList( array(
$this->getSkin()->mainPageLink(),
$this->getSkin()->aboutLink(),
Linker::specialLink( 'Recentchanges' ),
@@ -85,14 +90,18 @@ class StandardTemplate extends LegacyTemplate {
return $s;
}
+ /**
+ * @return string
+ */
function quickBar() {
- global $wgOut, $wgUser, $wgRequest, $wgContLang;
+ global $wgContLang;
wfProfileIn( __METHOD__ );
- $action = $wgRequest->getText( 'action' );
- $wpPreview = $wgRequest->getBool( 'wpPreview' );
- $tns = $this->getSkin()->getTitle()->getNamespace();
+ $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' />";
@@ -120,13 +129,13 @@ class StandardTemplate extends LegacyTemplate {
}
if ( $barnumber == 1 ) {
// only show watchlist link if logged in
- if( $wgUser->isLoggedIn() ) {
+ if( $this->data['loggedin'] ) {
$s.= Linker::specialLink( 'Watchlist' ) ;
$s .= $sep . Linker::linkKnown(
SpecialPage::getTitleFor( 'Contributions' ),
wfMsg( 'mycontris' ),
array(),
- array( 'target' => $wgUser->getName() )
+ array( 'target' => $this->data['username'] )
);
}
}
@@ -134,9 +143,9 @@ class StandardTemplate extends LegacyTemplate {
}
$s .= "\n<hr class='sep' />";
- $articleExists = $this->getSkin()->getTitle()->getArticleId();
- if ( $wgOut->isArticle() || $action == 'edit' || $action == 'history' || $wpPreview ) {
- if( $wgOut->isArticle() ) {
+ $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
@@ -179,14 +188,14 @@ class StandardTemplate extends LegacyTemplate {
$text = wfMsg( 'articlepage' );
}
- $link = $this->getSkin()->getTitle()->getText();
+ $link = $title->getText();
$nstext = $wgContLang->getNsText( $tns );
if( $nstext ) { # add namespace if necessary
$link = $nstext . ':' . $link;
}
$s .= Linker::link( Title::newFromText( $link ), $text );
- } elseif( $this->getSkin()->getTitle()->getNamespace() != NS_SPECIAL ) {
+ } 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>' . wfMsg( 'newpage' ) . '</strong>';
@@ -194,32 +203,31 @@ class StandardTemplate extends LegacyTemplate {
}
# "Post a comment" link
- if( ( $this->getSkin()->getTitle()->isTalkPage() || $wgOut->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
- $s .= '<br />' . $this->getSkin()->link(
- $this->getSkin()->getTitle(),
+ if( ( $title->isTalkPage() || $this->getSkin()->getOutput()->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
+ $s .= '<br />' . Linker::link(
+ $title,
wfMsg( 'postcomment' ),
array(),
array(
'action' => 'edit',
'section' => 'new'
- ),
- array( 'known', 'noclasses' )
+ )
);
- /*
- 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 ( $wgUser->isLoggedIn() && $articleExists ) {
+ /**
+ * 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 ( $this->getSkin()->getTitle()->userCan( 'edit' ) )
+ if ( $title->userCan( 'edit' ) )
$s .= $sep . $this->moveThisPage();
}
- if ( $wgUser->isAllowed( 'delete' ) && $articleExists ) {
+ if ( $this->getSkin()->getUser()->isAllowed( 'delete' ) && $articleExists ) {
$s .= $sep . $this->deleteThisPage() .
$sep . $this->protectThisPage();
}
@@ -229,17 +237,17 @@ class StandardTemplate extends LegacyTemplate {
}
$s .= $sep . $this->whatLinksHere();
- if( $wgOut->isArticleRelated() ) {
+ if( $this->getSkin()->getOutput()->isArticleRelated() ) {
$s .= $sep . $this->watchPageLinksLink();
}
if (
- NS_USER == $this->getSkin()->getTitle()->getNamespace() ||
- $this->getSkin()->getTitle()->getNamespace() == NS_USER_TALK
+ NS_USER == $title->getNamespace() ||
+ $title->getNamespace() == NS_USER_TALK
) {
- $id = User::idFromName( $this->getSkin()->getTitle()->getText() );
- $ip = User::isIP( $this->getSkin()->getTitle()->getText() );
+ $id = User::idFromName( $title->getText() );
+ $ip = User::isIP( $title->getText() );
if( $id || $ip ){
$s .= $sep . $this->userContribsLink();
@@ -251,7 +259,7 @@ class StandardTemplate extends LegacyTemplate {
$s .= "\n<br /><hr class='sep' />";
}
- if( UploadBase::isEnabled() && UploadBase::isAllowed( $wgUser ) === true ) {
+ if( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getSkin()->getUser() ) === true ) {
$s .= $this->getUploadLink() . $sep;
}
@@ -260,7 +268,7 @@ class StandardTemplate extends LegacyTemplate {
global $wgSiteSupportPage;
if( $wgSiteSupportPage ) {
$s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
- '" class="internal">' . wfMsg( 'sitesupport' ) . '</a>';
+ '" class="internal">' . wfMsg( 'sitesupport' ) . '</a>';
}
$s .= "\n<br /></div>\n";
diff --git a/skins/Vector.php b/skins/Vector.php
index 97161611..4b6433d6 100644
--- a/skins/Vector.php
+++ b/skins/Vector.php
@@ -26,14 +26,14 @@ class SkinVector extends SkinTemplate {
* @param $out OutputPage object to initialize
*/
public function initPage( OutputPage $out ) {
- global $wgLocalStylePath, $wgRequest;
+ global $wgLocalStylePath;
parent::initPage( $out );
// Append CSS which includes IE only behavior fixes for hover support -
// this is better than including this in a CSS fille since it doesn't
// wait for the CSS file to load before fetching the HTC file.
- $min = $wgRequest->getFuzzyBool( 'debug' ) ? '' : '.min';
+ $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
$out->addHeadItem( 'csshover',
'<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
htmlspecialchars( $wgLocalStylePath ) .
@@ -60,29 +60,19 @@ class SkinVector extends SkinTemplate {
*/
class VectorTemplate extends BaseTemplate {
- /* Members */
-
- /**
- * @var Skin Cached skin object
- */
- var $skin;
-
/* Functions */
/**
* Outputs the entire contents of the (X)HTML page
*/
public function execute() {
- global $wgLang, $wgVectorUseIconWatch;
-
- $this->skin = $this->data['skin'];
+ global $wgVectorUseIconWatch;
// Build additional attributes for navigation urls
- //$nav = $this->skin->buildNavigationUrls();
$nav = $this->data['content_navigation'];
if ( $wgVectorUseIconWatch ) {
- $mode = $this->skin->getTitle()->userIsWatching() ? 'unwatch' : 'watch';
+ $mode = $this->getSkin()->getTitle()->userIsWatching() ? 'unwatch' : 'watch';
if ( isset( $nav['actions'][$mode] ) ) {
$nav['views'][$mode] = $nav['actions'][$mode];
$nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
@@ -121,7 +111,7 @@ class VectorTemplate extends BaseTemplate {
$this->data['variant_urls'] = $nav['variants'];
// Reverse horizontally rendered navigation elements
- if ( $wgLang->isRTL() ) {
+ if ( $this->data['rtl'] ) {
$this->data['view_urls'] =
array_reverse( $this->data['view_urls'] );
$this->data['namespace_urls'] =
@@ -135,7 +125,7 @@ class VectorTemplate extends BaseTemplate {
<div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
<!-- content -->
- <div id="content">
+ <div id="content" class="mw-body">
<a id="top"></a>
<div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
<?php if ( $this->data['sitenotice'] ): ?>
@@ -144,7 +134,9 @@ class VectorTemplate extends BaseTemplate {
<!-- /sitenotice -->
<?php endif; ?>
<!-- firstHeading -->
- <h1 id="firstHeading" class="firstHeading"><?php $this->html( 'title' ) ?></h1>
+ <h1 id="firstHeading" class="firstHeading">
+ <span dir="auto"><?php $this->html( 'title' ) ?></span>
+ </h1>
<!-- /firstHeading -->
<!-- bodyContent -->
<div id="bodyContent">
@@ -168,7 +160,7 @@ class VectorTemplate extends BaseTemplate {
<?php endif; ?>
<?php if ( $this->data['showjumplinks'] ): ?>
<!-- jumpto -->
- <div id="jump-to-nav">
+ <div id="jump-to-nav" class="mw-jump">
<?php $this->msg( 'jumpto' ) ?> <a href="#mw-head"><?php $this->msg( 'jumptonavigation' ) ?></a>,
<a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
</div>
@@ -236,7 +228,7 @@ class VectorTemplate extends BaseTemplate {
<?php foreach ( $footericons as $blockName => $footerIcons ): ?>
<li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
<?php foreach ( $footerIcons as $icon ): ?>
- <?php echo $this->skin->makeFooterIcon( $icon ); ?>
+ <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
<?php endforeach; ?>
</li>
@@ -246,9 +238,6 @@ class VectorTemplate extends BaseTemplate {
<div style="clear:both"></div>
</div>
<!-- /footer -->
- <!-- fixalpha -->
- <script type="<?php $this->text( 'jsmimetype' ) ?>"> if ( window.isMSIE55 ) fixalpha(); </script>
- <!-- /fixalpha -->
<?php $this->printTrail(); ?>
</body>
@@ -298,7 +287,7 @@ class VectorTemplate extends BaseTemplate {
}
private function renderPortal( $name, $content, $msg = null, $hook = null ) {
- if ( !isset( $msg ) ) {
+ if ( $msg === null ) {
$msg = $name;
}
?>
@@ -314,7 +303,7 @@ class VectorTemplate extends BaseTemplate {
<?php
endforeach;
- if ( isset( $hook ) ) {
+ if ( $hook !== null ) {
wfRunHooks( $hook, array( &$this, true ) );
}
?>
@@ -332,16 +321,18 @@ class VectorTemplate extends BaseTemplate {
/**
* Render one or more navigations elements by name, automatically reveresed
* when UI is in RTL mode
+ *
+ * @param $elements array
*/
private function renderNavigation( $elements ) {
- global $wgVectorUseSimpleSearch, $wgVectorShowVariantName, $wgUser, $wgLang;
+ global $wgVectorUseSimpleSearch;
// If only one element was given, wrap it in an array, allowing more
// flexible arguments
if ( !is_array( $elements ) ) {
$elements = array( $elements );
// If there's a series of elements, reverse them when in RTL mode
- } elseif ( $wgLang->isRTL() ) {
+ } elseif ( $this->data['rtl'] ) {
$elements = array_reverse( $elements );
}
// Render elements
@@ -363,15 +354,13 @@ class VectorTemplate extends BaseTemplate {
case 'VARIANTS':
?>
<div id="p-variants" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <?php if ( $wgVectorShowVariantName ): ?>
- <h4>
- <?php foreach ( $this->data['variant_urls'] as $link ): ?>
- <?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
- <?php echo htmlspecialchars( $link['text'] ) ?>
- <?php endif; ?>
- <?php endforeach; ?>
- </h4>
- <?php endif; ?>
+ <h4>
+ <?php foreach ( $this->data['variant_urls'] as $link ): ?>
+ <?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
+ <?php echo htmlspecialchars( $link['text'] ) ?>
+ <?php endif; ?>
+ <?php endforeach; ?>
+ </h4>
<h5><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h5>
<div class="menu">
<ul<?php $this->html( 'userlangattributes' ) ?>>
@@ -432,22 +421,23 @@ class VectorTemplate extends BaseTemplate {
<div id="p-search">
<h5<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h5>
<form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
- <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
- <?php if ( $wgVectorUseSimpleSearch && $wgUser->getOption( 'vector-simplesearch' ) ): ?>
+ <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ): ?>
<div id="simpleSearch">
<?php if ( $this->data['rtl'] ): ?>
- <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->skin->getSkinStylePath( 'images/search-rtl.png' ) ) ); ?>
+ <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-rtl.png' ) ) ); ?>
<?php endif; ?>
<?php echo $this->makeSearchInput( array( 'id' => 'searchInput', 'type' => 'text' ) ); ?>
<?php if ( !$this->data['rtl'] ): ?>
- <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->skin->getSkinStylePath( 'images/search-ltr.png' ) ) ); ?>
+ <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-ltr.png' ) ) ); ?>
<?php endif; ?>
- </div>
<?php else: ?>
- <?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' ) ); ?>
+ <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; ?>
+ <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+ </div>
</form>
</div>
<?php
diff --git a/skins/archlinux/IE50Fixes.css b/skins/archlinux/IE50Fixes.css
deleted file mode 100644
index a054a91f..00000000
--- a/skins/archlinux/IE50Fixes.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-** IE5.0 Fix Stylesheet
-*/
-
-div#column-content {
- margin: 0 !important;
- float: none;
-}
-div#column-content #content {
- margin-top: 3em;
- height: 1%;
-}
-div#column-one {
- position: absolute;
- overflow: visible;
- top: 0;
- left: 0;
- z-index: 3;
-}
-div#footer {
- margin: 0 0 0 13.6em;
-}
-
-/* IE 5 & 5.5 interpret keyword sizes one off */
-body { font-size: xx-small; }
-/*
-** the edit tabs
-*/
-#p-cactions li {
- float: left;
- padding-top: 0;
- padding-bottom: 0 !important;
- height: 0.9em;
-}
-#p-cactions li a {
- display: block;
- padding-bottom: 0.045em;
-}
-#p-cactions li.selected a {
- padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
- padding-bottom: 0.17em;
-}
-/* 5.0 doesn't like the background icon for external links and user */
-.link-external,
-.external {
- background: none;
- padding: 0;
-}
-#p-personal ul { float: right }
-#p-personal li { float: left }
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login,
-li#pt-logout {
- background: none;
- padding-left: none;
-}
-.visualClear {
- width: 100%;
- height: 0px;
- padding:0;
- margin: 0;
-}
-#firstHeading { margin-bottom: .3em; }
-/*div{ border:1px solid Red !important;}*/
diff --git a/skins/archlinux/IE55Fixes.css b/skins/archlinux/IE55Fixes.css
deleted file mode 100644
index f3c2cde7..00000000
--- a/skins/archlinux/IE55Fixes.css
+++ /dev/null
@@ -1,85 +0,0 @@
-/* IE5.5/win- only fixes */
-
-div#column-content {
- float: none;
- margin-left: 0;
- height: 1%;
-}
-div#column-content #content {
- position: relative;
- z-index: 5;
- margin-left: 12.2em;
- margin-top: 3em;
- height: 1%;
-}
-div#column-one {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 4;
- width: 100%;
-}
-div#footer {
- margin-left: 13.6em;
- border-left: 1px solid #fabd23;
-}
-
-/*#bodyContent div,
-#bodyContent pre { overflow: auto; }*/
-
-#p-personal { padding-bottom: .1em; }
-
-body { font-size: xx-small; }
-
-#p-cactions {
- width: 76% !important;
- z-index: 3 !important;
- float: none;
-}
-#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;
-}
-#p-navigation a {
- display: inline-block;
- width: 100%;
-}
-.portlet {
- overflow: hidden;
-}
-#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;
-}
-.visualClear {
- width: 90%;
- height: 1px;
- padding: 0;
- margin: 0;
-}
-
-#editform {
- width: 100%;
-}
diff --git a/skins/archlinux/IE60Fixes.css b/skins/archlinux/IE60Fixes.css
index 3bcd0479..ec1ce430 100644
--- a/skins/archlinux/IE60Fixes.css
+++ b/skins/archlinux/IE60Fixes.css
@@ -36,9 +36,6 @@ div#footer {
border-right: 1px solid #fabd23;
}
- /* the tabs */
-
-
/* the tabs */
#p-cactions {
diff --git a/skins/archlinux/IE70Fixes.css b/skins/archlinux/IE70Fixes.css
index fc009e6e..e8d3a8f8 100644
--- a/skins/archlinux/IE70Fixes.css
+++ b/skins/archlinux/IE70Fixes.css
@@ -8,8 +8,10 @@ div#column-content div#content {
margin-top: 3em;
height: 1%;
}
-
-.rtl div#column-content div#content { margin-right: 12.2em; margin-left: 0; }
+.rtl div#column-content div#content {
+ margin-right: 12.2em;
+ margin-left: 0;
+}
.rtl div#column-one {
diff --git a/skins/archlinux/main.css b/skins/archlinux/main.css
index edf79abb..9a8eac1c 100644
--- a/skins/archlinux/main.css
+++ b/skins/archlinux/main.css
@@ -59,135 +59,21 @@ div#globalWrapper {
}
/* general styles */
-
-table {
- font-size: 100%;
-}
a {
- text-decoration: none;
color: #002bb8;
- background: none;
}
a:visited {
color: #5a3696;
}
-a:active {
- color: #faa700;
-}
-a:hover {
- text-decoration: underline;
-}
-a.stub {
- color: #772233;
-}
-a.new, #p-personal a.new {
+a.new,
+#p-personal a.new {
color: #cc2200;
}
-a.new:visited, #p-personal a.new:visited {
- color: #a55858;
-}
-
-img {
- border: none;
- vertical-align: middle;
-}
-p {
- margin: .4em 0 .5em 0;
- line-height: 1.5em;
-}
-p img {
- margin: 0;
-}
-
-hr {
- height: 1px;
- color: #aaa;
- background-color: #aaa;
- border: 0;
- margin: .2em 0 .2em 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: black;
- background: none;
- font-weight: normal;
- margin: 0;
- overflow: hidden;
- padding-top: .5em;
- padding-bottom: .17em;
- border-bottom: 1px solid #aaa;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 67%; }
-h3, h4, h5, h6 {
- border-bottom: none;
- font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 76%; font-weight: normal; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86%; font-weight: normal; }
-h5 { font-size: 100%; }
-h5 .editsection { font-weight: normal; }
-h6 { font-size: 80%; }
-h6 .editsection { font-size: 125%; font-weight: normal; }
ul {
- line-height: 1.5em;
- list-style-type: square;
- margin: .3em 0 0 1.5em;
- padding: 0;
/* @embed */
list-style-image: url(bullet.gif);
}
-ol {
- line-height: 1.5em;
- margin: .3em 0 0 3.2em;
- padding: 0;
- list-style-image: none;
-}
-li {
- margin-bottom: .1em;
-}
-dt {
- font-weight: bold;
- margin-bottom: .1em;
-}
-dl {
- margin-top: .2em;
- margin-bottom: .5em;
-}
-dd {
- line-height: 1.5em;
- margin-left: 2em;
- margin-bottom: .1em;
-}
-
-fieldset {
- border: 1px solid #2f6fab;
- margin: 1em 0 1em 0;
- padding: 0 1em 1em;
- line-height: 1.5em;
-}
-fieldset.nested {
- margin: 0 0 0.5em 0;
- padding: 0 0.5em 0.5em;
-}
-legend {
- padding: .5em;
- font-size: 95%;
-}
-form {
- border: none;
- margin: 0;
-}
-
-textarea {
- width: 100%;
- padding: .1em;
-}
input.historysubmit {
padding: 0 .3em .3em .3em !important;
@@ -196,26 +82,8 @@ input.historysubmit {
height: 1.7em !important;
margin-left: 1.6em;
}
-select {
- vertical-align: top;
-}
-q {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}
-/* disabled for now
-blockquote {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}*/
-code {
- background-color: #f9f9f9;
-}
+
pre {
- padding: 1em;
- border: 1px dashed #2f6fab;
- color: black;
- background-color: #f9f9f9;
line-height: 1.1em;
}
@@ -223,211 +91,16 @@ pre {
** the main content area
*/
-#siteSub {
- display: none;
-}
-#jump-to-nav {
- display: none;
-}
-
-#contentSub, #contentSub2 {
- font-size: 84%;
- line-height: 1.2em;
- margin: 0 0 1.4em 1em;
- color: #7d7d7d;
- width: auto;
-}
-span.subpages {
- display: block;
-}
-
-/* Some space under the headers in the content area */
-#bodyContent h1, #bodyContent h2 {
- margin-bottom: .6em;
-}
-#bodyContent h3, #bodyContent h4, #bodyContent h5 {
- margin-bottom: .3em;
-}
-#firstHeading {
- margin-bottom: .1em;
- /* These two rules hack around bug 2013 (fix for more limited bug 11325).
- When bug 2013 is fixed properly, they should be removed. */
- line-height: 1.2em;
- padding-bottom: 0;
-}
-
-/* user notification thing */
-.usermessage {
- background-color: #ffce7b;
- border: 1px solid #ffa500;
- color: black;
- font-weight: bold;
- margin: 2em 0 1em;
- padding: .5em 1em;
- vertical-align: middle;
-}
#siteNotice {
- position: relative;
- text-align: center;
font-size: 95%;
padding: 0 0.9em;
}
-#siteNotice p {
+#localNotice {
margin: 0;
- padding: 0;
}
-
-.catlinks {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- margin-top: 1em;
- clear: both;
-}
-/* currently unused, intended to be used by a metadata box
-in the bottom-right corner of the content area */
-.documentDescription {
- /* The summary text describing the document */
- font-weight: bold;
- display: block;
- margin: 1em 0;
- line-height: 1.5em;
-}
-.documentByLine {
- text-align: right;
- font-size: 90%;
- clear: both;
- font-weight: normal;
- color: #76797c;
-}
-
-/* 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,
-.toc,
-.mw-warning {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
-#toc h2,
-.toc h2 {
- display: inline;
- border: none;
- padding: 0;
- font-size: 100%;
- font-weight: bold;
-}
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
- text-align: center;
-}
-#toc ul,
-.toc ul {
- list-style-type: none;
- list-style-image: none;
- margin-left: 0;
+#siteNotice p {
+ margin: 0;
padding: 0;
- text-align: left;
-}
-#toc ul ul,
-.toc ul ul {
- margin: 0 0 0 2em;
-}
-#toc .toctoggle,
-.toc .toctoggle {
- font-size: 94%;
-}
-
-.mw-warning {
- margin-left: 50px;
- margin-right: 50px;
- text-align: center;
-}
-
-/* images */
-/* @noflip */div.floatright, table.floatright {
- margin: 0 0 .5em .5em;
- border: 0;
-/*
- border: .5em solid white;
- border-width: .5em 0 .8em 1.4em;
-*/
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
- margin: 0 .5em .5em 0;
- border: 0;
-/*
- margin: .3em .5em .5em 0;
- border: .5em solid white;
- border-width: .5em 1.4em .8em 0;
-*/
-}
-div.floatleft p { font-style: italic; }
-/* thumbnails */
-div.thumb {
- margin-bottom: .5em;
- width: auto;
-}
-div.thumbinner {
- border: 1px solid #ccc;
- padding: 3px !important;
- background-color: #f9f9f9;
- font-size: 94%;
- text-align: center;
- overflow: hidden;
-}
-html .thumbimage {
- border: 1px solid #ccc;
-}
-html .thumbcaption {
- border: none;
- text-align: left;
- line-height: 1.4em;
- padding: 3px !important;
- font-size: 94%;
-}
-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: .5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
- margin: .5em 1.4em 1.3em 0;
-}
-img.thumbborder {
- border: 1px solid #dddddd;
}
/*
@@ -446,12 +119,6 @@ table.rimage {
margin-bottom: 1em;
text-align: center;
}
-.toccolours {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
/*
** edit views etc
@@ -484,7 +151,7 @@ table.rimage {
background: url(mail_icon.gif) center right no-repeat;
padding-right: 18px;
}
-#bodyContent a.external[href ^="news://"] {
+#bodyContent a.external[href ^="news:"] {
/* @embed */
background: url(news_icon.png) center right no-repeat;
padding-right: 18px;
@@ -510,7 +177,7 @@ table.rimage {
#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
.link-audio {
/* @embed */
- background: url("audio.png") center right no-repeat;
+ background: url(audio.png) center right no-repeat;
padding-right: 13px;
}
#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
@@ -519,7 +186,7 @@ table.rimage {
#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
.link-video {
/* @embed */
- background: url("video.png") center right no-repeat;
+ background: url(video.png) center right no-repeat;
padding-right: 13px;
}
#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
@@ -527,35 +194,20 @@ table.rimage {
#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
.link-document {
/* @embed */
- background: url("document.png") center right no-repeat;
+ background: url(document.png) center right no-repeat;
padding-right: 12px;
}
-
+
/* Interwiki Styling */
#bodyContent a.extiw,
#bodyContent a.extiw:active {
color: #36b;
- /* Don't show icons for interwiki links */
- background: none;
- padding: 0;
-}
-#bodyContent a.extiw:visited {
- color: #636;
-}
-#bodyContent a.extiw:active {
- color: #b63;
}
/* External links */
#bodyContent a.external {
color: #36b;
}
-#bodyContent a.external:visited {
- color: #636; /* bug 3112 */
-}
-#bodyContent a.external:active {
- color: #b63;
-}
/*
** Structural Elements
@@ -839,7 +491,10 @@ li#pt-login {
li#ca-talk {
margin-right: 1.6em;
}
-li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
+li#ca-watch,
+li#ca-unwatch,
+li#ca-varlang-0,
+li#ca-print {
margin-left: 1.6em;
}
#p-cactions .pBody {
@@ -997,8 +652,8 @@ td.htmlform-tip {
margin-top: 2em;
}
-div#userloginForm form,
-div#userlogin form#userlogin2 {
+div#userloginForm,
+div#userlogin {
margin: 0 3em 1em 0;
border: 1px solid #aaa;
clear: both;
@@ -1008,12 +663,12 @@ div#userlogin form#userlogin2 {
}
div#userloginForm table,
-div#userlogin form#userlogin2 table {
+div#userlogin table {
background-color: #f9f9f9;
}
div#userloginForm h2,
-div#userlogin form#userlogin2 h2 {
+div#userlogin h2 {
padding-top: 0;
}
@@ -1052,15 +707,21 @@ div#userloginForm .captcha {
** @import("IEMacFixes.css");
*/
/* tabs: border on the a, not the div */
-* > html #p-cactions li { border: none; }
+* > html #p-cactions li {
+ border: none;
+}
* > html #p-cactions li a {
border: 1px solid #aaa;
border-bottom: none;
}
-* > html #p-cactions li.selected a { border-color: #fabd23; }
+* > html #p-cactions li.selected a {
+ border-color: #fabd23;
+}
/* footer icons need a fixed width */
* > html #f-poweredbyico,
-* > html #f-copyrightico { width: 88px; }
+* > html #f-copyrightico {
+ width: 88px;
+}
* > html #bodyContent,
* > html #bodyContent pre {
overflow-x: auto;
@@ -1070,12 +731,16 @@ div#userloginForm .captcha {
/* more IE fixes */
/* float/negative margin brokenness */
-* html div#footer {margin-top: 0;}
+* html div#footer {
+ margin-top: 0;
+}
* html div#column-content {
display: inline;
margin-bottom: 0;
}
-#pagehistory li.selected { position: relative; }
+#pagehistory li.selected {
+ position: relative;
+}
/* Mac IE 5.0 fix; floated content turns invisible */
* > html div#column-content {
@@ -1131,7 +796,8 @@ span.updatedmarker {
}
/* @bug 1714 */
-input#wpSave, input#wpDiff {
+input#wpSave,
+input#wpDiff {
margin-right: 0.33em;
}
@@ -1148,17 +814,17 @@ div.noarticletext {
}
div#searchTargetContainer {
- left: 10px;
- top: 10px;
- width: 90%;
+ left: 10px;
+ top: 10px;
+ width: 90%;
background: white;
}
div#searchTarget {
- padding: 3px;
- margin: 5px;
+ padding: 3px;
+ margin: 5px;
background: #F0F0F0;
- border: solid 1px blue;
+ border: solid 1px blue;
}
div#searchTarget ul li {
@@ -1171,10 +837,10 @@ div#searchTarget ul li:before {
}
div#searchTargetHide {
- float:right;
- border:solid 1px black;
- background:#DCDCDC;
- padding:2px;
+ float: right;
+ border: solid 1px black;
+ background: #DCDCDC;
+ padding: 2px;
}
#powersearch p {
@@ -1202,7 +868,9 @@ table.multipageimage td {
text-align: center;
}
-.templatesUsed { margin-top: 1.5em; }
+.templatesUsed {
+ margin-top: 1.5em;
+}
.mw-summary-preview {
margin: 0.1em 0;
diff --git a/skins/chick/IE50Fixes.css b/skins/chick/IE50Fixes.css
deleted file mode 100644
index 4a193e94..00000000
--- a/skins/chick/IE50Fixes.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-** IE5.0 Fix Stylesheet
-*/
-
-#column-content {
- margin: 0 !important;
- float: none;
-}
-#column-content #content {
- margin-top: 3em;
- height: 1%;
-}
-#column-one {
- position: absolute;
- overflow: visible;
- top: 0;
- left: 0;
- z-index: 3;
-}
-#footer {
- margin: 0 0 0 13.6em;
-}
-
-/* IE 5 & 5.5 interpret keyword sizes one off */
-body { font-size: xx-small; }
-/*
-** the edit tabs
-*/
-#p-cactions li {
- float: left;
- padding-top: 0;
- padding-bottom: 0 !important;
- height: 0.9em;
-}
-#p-cactions li a {
- display: block;
- padding-bottom: 0.045em;
-}
-#p-cactions li.selected a {
- padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
- padding-bottom: 0.17em;
-}
-/* 5.0 doesn't like the background icon for external links and user */
-.link-external,
-.external {
- background: none;
- padding: 0;
-}
-#p-personal ul { float: right }
-#p-personal li { float: left }
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login,
-li#pt-logout {
- background: none;
- padding-left: none;
-}
-.visualClear {
- width:100%;
- height: 0px;
- padding:0;
- margin:0;
-}
-#firstHeading { margin-bottom: 0.3em; }
-/*div{ border:1px solid Red !important;}*/
diff --git a/skins/chick/IE55Fixes.css b/skins/chick/IE55Fixes.css
deleted file mode 100644
index 2f785612..00000000
--- a/skins/chick/IE55Fixes.css
+++ /dev/null
@@ -1,81 +0,0 @@
-/* IE5.5/win- only fixes */
-
-#column-content {
- float: none;
- margin-left: 0;
- height: 1%;
-}
-#column-content #content {
- position: relative;
- z-index: 5;
- margin-left: 12.2em;
- margin-top: 3em;
- height: 1%;
-}
-#column-one {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 4;
- width: 100%;
-}
-#footer {
- margin-left: 13.6em;
- border-left: 1px solid #fabd23;
-}
-
-/*#bodyContent div,
-#bodyContent pre { overflow: auto; }*/
-
-#p-personal { padding-bottom: 0.1em; }
-
-body { font-size: xx-small; }
-
-#p-cactions {
- width: 76% !important;
- z-index: 3 !important;
- float: none;
-}
-#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;
-}
-.portlet {
- overflow:hidden;
-}
-#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;
-}
-.visualClear {
- width:90%;
- height: 1px;
- padding:0;
- margin:0;
-}
-
-#editform {
- width: 100%;
-}
diff --git a/skins/chick/IE60Fixes.css b/skins/chick/IE60Fixes.css
index feec15f1..18e9655d 100644
--- a/skins/chick/IE60Fixes.css
+++ b/skins/chick/IE60Fixes.css
@@ -1,8 +1,8 @@
/* 6.0 - only fixes */
-/* content area */
+/* content area */
/* workaround for various ie float bugs */
-#column-content {
- float: none;
+#column-content {
+ float: none;
margin-left: 0;
height: 1%;
}
diff --git a/skins/chick/main.css b/skins/chick/main.css
index 4501ccd0..3787d820 100644
--- a/skins/chick/main.css
+++ b/skins/chick/main.css
@@ -203,24 +203,6 @@ span.subpages { display: block; }
}
.catlinks { margin: 0; padding: 0; }
-
-/* currently unused, intended to be used by a metadata box
-in the bottom-right corner of the content area */
-.documentDescription {
- /* The summary text describing the document */
- font-weight: bold;
- display: block;
- margin: 1em 0em;
- line-height: 1.5em;
-}
-.documentByLine {
- text-align: right;
- font-size: 90%;
- clear: both;
- font-weight: normal;
- color: #76797c;
-}
-
/* emulate center */
.center {
width: 100%;
diff --git a/skins/cologneblue/screen.css b/skins/cologneblue/screen.css
index 03504b99..cf8ca12e 100644
--- a/skins/cologneblue/screen.css
+++ b/skins/cologneblue/screen.css
@@ -1,6 +1,6 @@
body {
- margin: 0px;
- padding: 0px;
+ margin: 0;
+ padding: 0;
color: black;
}
@@ -21,7 +21,7 @@ body {
}
#topbar {
- padding: 0px;
+ padding: 0;
}
#powersearch {
@@ -103,10 +103,6 @@ td#top-syslinks {
td.top-linkcollection {
text-align: right;
}
-td.top-subheader {
- vertical-align: top;
-}
-
/**
* Overrides text justification (user preference)
* See bug 31990
@@ -114,6 +110,9 @@ td.top-subheader {
td.top-linkcollection #catlinks {
text-align: right;
}
+td.top-subheader {
+ vertical-align: top;
+}
td.bottom {
font-family: Verdana, Arial, sans-serif;
font-size: 10pt;
diff --git a/skins/common/IE80Fixes.css b/skins/common/IE80Fixes.css
index b6360f60..6e5cb8a4 100644
--- a/skins/common/IE80Fixes.css
+++ b/skins/common/IE80Fixes.css
@@ -1,5 +1,5 @@
/**
- * Fixes textarea scrolling bug (bug #19334). The bug only occurs when a
+ * Fixes textarea scrolling bug (bug #19334). The bug only occurs when a
* percentage width is given, so instead of width: 100%, use min-width: 100%;
* max-width: 100%. We also need to give a fixed width for the actual width
* property for the hack to work, although the actual value (500px here) ends
diff --git a/skins/common/IEFixes.js b/skins/common/IEFixes.js
index 7f3b9c0f..dd999ed4 100644
--- a/skins/common/IEFixes.js
+++ b/skins/common/IEFixes.js
@@ -63,6 +63,11 @@ window.fixalpha = function( logoId ) {
}
};
+if ( isMSIE55 ) {
+ // ondomready
+ $( fixalpha );
+}
+
// fix ie6 disappering float bug
window.relativeforfloats = function() {
var bc = document.getElementById( 'bodyContent' );
diff --git a/skins/common/ajax.js b/skins/common/ajax.js
index 2a93373f..121f9d12 100644
--- a/skins/common/ajax.js
+++ b/skins/common/ajax.js
@@ -84,9 +84,7 @@ window.sajax_do_call = function(func_name, args, target) {
var i, x, n;
var uri;
var post_data;
- uri = wgServer +
- ( ( wgScript == null ) ? ( wgScriptPath + '/index.php' ) : wgScript ) +
- '?action=ajax';
+ uri = mw.util.wikiScript() + '?action=ajax';
if ( sajax_request_type == 'GET' ) {
if ( uri.indexOf( '?' ) == -1 ) {
uri = uri + '?rs=' + encodeURIComponent( func_name );
diff --git a/skins/common/commonContent.css b/skins/common/commonContent.css
new file mode 100644
index 00000000..61799187
--- /dev/null
+++ b/skins/common/commonContent.css
@@ -0,0 +1,122 @@
+/*
+** MediaWiki style sheet for general styles on complex content
+*/
+
+/* Table of Contents */
+#toc,
+.toc,
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin-left: 0;
+ padding: 0;
+ text-align: left;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+
+/* Warning */
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+
+/* Images */
+/* @noflip */div.floatright, table.floatright {
+ margin: 0 0 .5em .5em;
+ border: 0;
+}
+div.floatright p { font-style: italic; }
+/* @noflip */div.floatleft, table.floatleft {
+ margin: 0 .5em .5em 0;
+ border: 0;
+}
+div.floatleft p { font-style: italic; }
+/* Thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ width: auto;
+ background-color: transparent;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+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: .5em 0 1.3em 1.4em;
+}
+/* @noflip */div.tleft {
+ margin: .5em 1.4em 1.3em 0;
+}
+img.thumbborder {
+ border: 1px solid #dddddd;
+}
+
+/**
+ * Basic styles for the user login and create account forms
+ */
+#userlogin, #userloginForm {
+ border: solid 1px #cccccc;
+ padding: 1.2em;
+ margin: .5em;
+ float: left;
+}
diff --git a/skins/common/commonElements.css b/skins/common/commonElements.css
new file mode 100644
index 00000000..5590bfa1
--- /dev/null
+++ b/skins/common/commonElements.css
@@ -0,0 +1,251 @@
+/*
+** MediaWiki style sheet for general styles on basic content elements
+*/
+
+/* Links */
+a {
+ text-decoration: none;
+ color: #0645ad;
+ background: none;
+}
+a:visited {
+ color: #0b0080;
+}
+a:active {
+ color: #faa700;
+}
+a:hover, a:focus {
+ text-decoration: underline;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #ba0000;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a55858;
+}
+
+/* Interwiki Styling */
+.mw-body a.extiw,
+.mw-body a.extiw:active {
+ color: #36b;
+}
+.mw-body a.extiw:visited {
+ color: #636;
+}
+.mw-body a.extiw:active {
+ color: #b63;
+}
+
+/* External links */
+.mw-body a.external {
+ color: #36b;
+}
+.mw-body a.external:visited {
+ color: #636; /* bug 3112 */
+}
+.mw-body a.external:active {
+ color: #b63;
+}
+
+/* Inline Elements */
+img {
+ border: none;
+ vertical-align: middle;
+}
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ overflow: hidden;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+ width: auto;
+}
+h1 {
+ font-size: 188%;
+}
+h1 .editsection {
+ font-size: 53%;
+}
+h2 {
+ font-size: 150%;
+}
+h2 .editsection {
+ font-size: 67%;
+}
+h3,
+h4,
+h5,
+h6 {
+ border-bottom: none;
+ font-weight: bold;
+}
+h3 {
+ font-size: 132%;
+}
+h3 .editsection {
+ font-size: 76%;
+ font-weight: normal;
+}
+h4 {
+ font-size: 116%;
+}
+h4 .editsection {
+ font-size: 86%;
+ font-weight: normal; }
+h5 {
+ font-size: 100%;
+}
+h5 .editsection {
+ font-weight: normal;
+}
+h6 {
+ font-size: 80%;
+}
+h6 .editsection {
+ font-size: 125%;
+ font-weight: normal;
+}
+
+/* Some space under the headers in the content area */
+h1,
+h2 {
+ margin-bottom: .6em;
+}
+h3,
+h4,
+h5 {
+ margin-bottom: .3em;
+}
+
+p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+}
+p img {
+ margin: 0;
+}
+
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.6em;
+ padding: 0;
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 0 0 3.2em;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+dd {
+ line-height: 1.5em;
+ margin-left: 1.6em;
+ margin-bottom: .1em;
+}
+
+q {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}
+/* Disabled for now
+blockquote {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}*/
+pre, code, tt, kbd, samp {
+ /*
+ * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
+ * Specifying any valid, second value will trigger correct behaviour without forcing a different font.
+ */
+ font-family: monospace, Courier;
+}
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+}
+
+/* Tables */
+table {
+ font-size: 100%;
+}
+
+/* Forms */
+fieldset {
+ border: 1px solid #2f6fab;
+ margin: 1em 0 1em 0;
+ padding: 0 1em 1em;
+ line-height: 1.5em;
+}
+fieldset.nested {
+ margin: 0 0 0.5em 0;
+ padding: 0 0.5em 0.5em;
+}
+legend {
+ padding: .5em;
+ font-size: 95%;
+}
+form {
+ border: none;
+ margin: 0;
+}
+textarea {
+ width: 100%;
+ padding: .1em;
+}
+select {
+ vertical-align: top;
+}
+
+/* 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%;
+}
+
diff --git a/skins/common/commonInterface.css b/skins/common/commonInterface.css
new file mode 100644
index 00000000..60d6436b
--- /dev/null
+++ b/skins/common/commonInterface.css
@@ -0,0 +1,64 @@
+/*
+** MediaWiki style sheet for common core styles on interfaces
+*/
+
+/* Categories */
+.catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+
+/* User Message */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+ position: relative;
+ text-align: center;
+ margin: 0;
+}
+#localNotice {
+ margin-bottom: 0.9em;
+}
+
+/* First h1 */
+.firstHeading,
+#firstHeading {
+ margin-bottom: .1em;
+ /* These two rules hack around bug 2013 (fix for more limited bug 11325).
+ * When bug 2013 is fixed properly, they should be removed. */
+ line-height: 1.2em;
+ padding-bottom: 0;
+}
+
+/* Sub-navigation */
+#siteSub {
+ display: none;
+}
+#jump-to-nav {
+ /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
+ margin-top: -1.4em;
+ margin-bottom: 1.4em
+}
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 0 1.4em 1em;
+ color: #7d7d7d;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 58703a33..4efabee3 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -1,10 +1,10 @@
-/*
-** MediaWiki Print style sheet for CSS2-capable browsers.
-** Copyright Gabriel Wicke, http://www.aulinx.de/
-**
-** Derived from the plone (http://plone.org/) styles
-** Copyright Alexander Limi
-*/
+/**
+ * MediaWiki Print style sheet for CSS2-capable browsers.
+ * Copyright Gabriel Wicke, http://www.aulinx.de/
+ *
+ * Derived from the plone (http://plone.org/) styles
+ * Copyright Alexander Limi
+ */
/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
a.stub,
@@ -18,12 +18,6 @@ a.new {
background-color: #f9f9f9;
padding: 5px;
}
-.tocindent {
- margin-left: 2em;
-}
-.tocline {
- margin-bottom: 0px;
-}
/* images */
div.floatright {
@@ -105,15 +99,15 @@ table.rimage {
}
body {
- background: White;
- /*font-size: 11pt !important;*/
- color: Black;
+ background: white;
+ color: black;
margin: 0;
padding: 0;
}
.noprint,
div#jump-to-nav,
+.mw-jump,
div.top,
div#column-one,
#colophon,
@@ -125,9 +119,13 @@ div#f-copyrightico,
li#viewcount,
li#about,
li#disclaimer,
+li#mobileview,
li#privacy,
#footer-places,
-#mw-hidden-catlinks {
+.mw-hidden-catlinks,
+tr.mw-metadata-show-hide-extended,
+span.mw-filepage-other-resolutions,
+#filetoc {
/* Hides all the elements irrelevant for printing */
display: none;
}
@@ -138,9 +136,9 @@ ul {
#content {
background: none;
- border: none ! important;
- padding: 0 ! important;
- margin: 0 ! important;
+ border: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
direction: ltr;
}
#footer {
@@ -155,15 +153,11 @@ h1, h2, h3, h4, h5, h6 {
font-weight: bold;
}
-p, .documentDescription {
- margin: 1em 0 ! important;
+p {
+ margin: 1em 0;
line-height: 1.2em;
}
-.tocindent p {
- margin: 0 0 0 0 ! important;
-}
-
pre {
border: 1pt dashed black;
white-space: pre;
@@ -181,7 +175,7 @@ table.listing td {
}
a {
- color: Black !important;
+ color: black !important;
background: none !important;
padding: 0 !important;
}
@@ -192,7 +186,8 @@ a:link, a:visited {
text-decoration: underline;
}
-#content a.external.text:after, #content a.external.autonumber:after {
+#content a.external.text:after,
+#content a.external.autonumber:after {
/* Expand URLs for printing */
content: " (" attr(href) ") ";
}
@@ -215,16 +210,23 @@ a:link, a:visited {
padding: 1em;
margin: 0 !important;
}
+
/* MSIE/Win doesn't understand 'inherit' */
-a, a.external, a.new, a.stub {
- color: black ! important;
- text-decoration: none ! important;
+a,
+a.external,
+a.new,
+a.stub {
+ color: black !important;
+ text-decoration: none !important;
}
/* Continue ... */
-a, a.external, a.new, a.stub {
- color: inherit ! important;
- text-decoration: inherit ! important;
+a,
+a.external,
+a.new,
+a.stub {
+ color: inherit !important;
+ text-decoration: inherit !important;
}
img {
@@ -233,9 +235,13 @@ img {
}
/* math */
-span.texhtml { font-family: serif; }
+span.texhtml {
+ font-family: serif;
+}
-#siteNotice { display: none; }
+#siteNotice {
+ display: none;
+}
/* Galleries (see shared.css for more info) */
li.gallerybox {
@@ -275,9 +281,10 @@ div.gallerytext {
padding: 2px 4px;
word-wrap: break-word;
}
-/*
-** Diff rendering
-*/
+
+/**
+ * Diff rendering
+ */
table.diff {
background: white;
}
@@ -307,31 +314,37 @@ td.diff-context {
text-decoration: underline;
}
-/*
-** Table rendering
-** As on shared.css but with white background.
-*/
-table.wikitable {
+/**
+ * Table rendering
+ * As on shared.css but with white background.
+ */
+table.wikitable,
+table.mw_metadata {
margin: 1em 1em 1em 0;
border: 1px #aaa solid;
background: white;
border-collapse: collapse;
}
-.wikitable th, .wikitable td {
+table.wikitable > tr > th, table.wikitable > tr > td,
+table.wikitable > * > tr > th, table.wikitable > * > tr > td,
+.mw_metadata th, .mw_metadata td {
border: 1px #aaa solid;
padding: 0.2em;
}
-.wikitable th {
+table.wikitable > tr > th,
+table.wikitable > * > tr > th,
+.mw_metadata th {
text-align: center;
background: white;
font-weight: bold;
}
-.wikitable caption {
+table.wikitable > caption,
+.mw_metadata caption {
font-weight: bold;
}
a.sortheader {
- margin: 0px 0.3em;
+ margin: 0 0.3em;
}
/* Some pagination options */
@@ -351,7 +364,8 @@ p {
*/
.catlinks ul {
display: inline;
- margin: 0px;
+ margin: 0;
+ padding: 0;
list-style: none;
list-style-type: none;
list-style-image: none;
@@ -372,4 +386,3 @@ p {
padding-left: .2em;
border-left: none;
}
-
diff --git a/skins/common/config-cc.css b/skins/common/config-cc.css
index c629ad3f..d81218ec 100644
--- a/skins/common/config-cc.css
+++ b/skins/common/config-cc.css
@@ -3,54 +3,55 @@
*/
body {
- margin:0px;
- background:#eee;
- font-family:verdana;
- color:#333;
+ margin: 0;
+ background: #eee;
+ font-family: Verdana;
+ color: #333;
}
#main {
- border:1px solid #D0D0D0;
- background:#fff;
+ border: 1px solid #D0D0D0;
+ background: #fff;
margin: 0.5em;
}
-/* Looks like you have to specify the width of #menu
-or IE5 Mac stretches it all the way across the div, and
-Opera streches it half way. */
+/**
+ * Looks like you have to specify the width of #menu
+ * or IE5 Mac stretches it all the way across the div, and
+ * Opera streches it half way.
+ */
#main #menu {
- border-left:1px dotted #ccc;
- /* border-bottom:1px solid #000;*/
- float:right;
- width:230px;
- background:white;
- margin:0px 0px 10px 10px;
+ border-left: 1px dotted #ccc;
+ float: right;
+ width: 230px;
+ background: white;
+ margin: 0 0 10px 10px;
}
-td, h3, p,h1,pre {
- margin:0px 20px 20px 20px;
- font-size:11px;
- line-height:140%;
+td, h3, p, h1, pre {
+ margin: 0 20px 20px 20px;
+ font-size: 11px;
+ line-height: 140%;
}
.header {
padding-left: 10px;
- padding-top:10px;
+ padding-top: 10px;
}
.nav {
- padding-left:10px;
- padding-bottom:10px;
- font-size:11px;
- margin-bottom:16px;
+ padding-left: 10px;
+ padding-bottom: 10px;
+ font-size: 11px;
+ margin-bottom: 16px;
}
-#menu p {
- font-size:11px;
+#menu p {
+ font-size: 11px;
}
.dent {
- margin-left:64px;
+ margin-left: 64px;
}
diff --git a/skins/common/config.css b/skins/common/config.css
index 434f27d5..aa982d32 100644
--- a/skins/common/config.css
+++ b/skins/common/config.css
@@ -133,9 +133,6 @@
padding: 0 !important;
}
-#config-memcachewrapper {
- display: none;
-}
.config-download-link {
font-size: 1.8em;
margin-left: 2em;
diff --git a/skins/common/config.js b/skins/common/config.js
index e5af7d14..23f7302c 100644
--- a/skins/common/config.js
+++ b/skins/common/config.js
@@ -67,9 +67,9 @@
$( '.enableForOther' ).click( function() {
var $textbox = $( '#' + $(this).attr( 'rel' ) );
if ( $(this).val() == 'other' ) { // FIXME: Ugh, this is ugly
- $textbox.removeAttr( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
+ $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
} else {
- $textbox.attr( 'readonly', 'readonly' ).closest( '.config-block' ).slideUp( 'fast' );
+ $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
}
} );
diff --git a/skins/common/images/add.png b/skins/common/images/add.png
index 3418db2c..f82f45db 100644
--- a/skins/common/images/add.png
+++ b/skins/common/images/add.png
Binary files differ
diff --git a/skins/common/images/cc-0.png b/skins/common/images/cc-0.png
index 59f27f30..18eb1773 100644
--- a/skins/common/images/cc-0.png
+++ b/skins/common/images/cc-0.png
Binary files differ
diff --git a/skins/common/images/cc-by.png b/skins/common/images/cc-by.png
index 822491ed..2658ee4d 100644
--- a/skins/common/images/cc-by.png
+++ b/skins/common/images/cc-by.png
Binary files differ
diff --git a/skins/common/images/closewindow19x19.png b/skins/common/images/closewindow19x19.png
new file mode 100644
index 00000000..762fd2a2
--- /dev/null
+++ b/skins/common/images/closewindow19x19.png
Binary files differ
diff --git a/skins/common/images/critical-32.png b/skins/common/images/critical-32.png
index 2bff7511..0b238c22 100644
--- a/skins/common/images/critical-32.png
+++ b/skins/common/images/critical-32.png
Binary files differ
diff --git a/skins/common/images/sort_both.gif b/skins/common/images/sort_both.gif
deleted file mode 100644
index 50ad15a0..00000000
--- a/skins/common/images/sort_both.gif
+++ /dev/null
Binary files differ
diff --git a/skins/common/images/sort_down.gif b/skins/common/images/sort_down.gif
deleted file mode 100644
index d97e8285..00000000
--- a/skins/common/images/sort_down.gif
+++ /dev/null
Binary files differ
diff --git a/skins/common/images/sort_up.gif b/skins/common/images/sort_up.gif
deleted file mode 100644
index 488cf279..00000000
--- a/skins/common/images/sort_up.gif
+++ /dev/null
Binary files differ
diff --git a/skins/common/mwsuggest.js b/skins/common/mwsuggest.js
index 6dbce050..dac59546 100644
--- a/skins/common/mwsuggest.js
+++ b/skins/common/mwsuggest.js
@@ -30,8 +30,8 @@ window.os_mouse_moved = false;
// delay between keypress and suggestion (in ms)
window.os_search_timeout = 250;
// these pairs of inputs/forms will be autoloaded at startup
-window.os_autoload_inputs = new Array('searchInput', 'searchInput2', 'powerSearchText', 'searchText');
-window.os_autoload_forms = new Array('searchform', 'searchform2', 'powersearch', 'search' );
+window.os_autoload_inputs = ['searchInput', 'searchInput2', 'powerSearchText', 'searchText'];
+window.os_autoload_forms = ['searchform', 'searchform2', 'powersearch', 'search'];
// if we stopped the service
window.os_is_stopped = false;
// max lines to show in suggest table
@@ -423,7 +423,7 @@ window.os_setupDatalist = function( r, results ) {
}
s.setAttribute( 'list', r.container );
- r.results = new Array();
+ r.results = [];
r.resultCount = results.length;
r.visible = true;
for ( i = 0; i < results.length; i++ ) {
@@ -436,7 +436,7 @@ window.os_setupDatalist = function( r, results ) {
};
/** Fetch namespaces from checkboxes or hidden fields in the search form,
- if none defined use wgSearchNamespaces global */
+ if none defined use wgSearchNamespaces */
window.os_getNamespaces = function( r ) {
var namespaces = '';
var elements = document.forms[r.searchform].elements;
@@ -455,7 +455,7 @@ window.os_getNamespaces = function( r ) {
}
}
if( namespaces == '' ) {
- namespaces = wgSearchNamespaces.join('|');
+ namespaces = mw.config.get( 'wgSearchNamespaces' ).join('|');
}
return namespaces;
};
@@ -478,7 +478,7 @@ window.os_delayedFetch = function() {
var query = os_timer.query;
os_timer = null;
var path = mw.config.get( 'wgMWSuggestTemplate' ).replace( "{namespaces}", os_getNamespaces( r ) )
- .replace( "{dbname}", wgDBname )
+ .replace( "{dbname}", mw.config.get( 'wgDBname' ) )
.replace( "{searchTerms}", os_encodeQuery( query ) );
// try to get from cache, if not fetch using ajax
@@ -643,7 +643,7 @@ window.os_createResultTable = function( r, results ) {
var c = document.getElementById( r.container );
var width = c.offsetWidth - os_operaWidthFix( c.offsetWidth );
var html = '<table class="os-suggest-results" id="' + r.resultTable + '" style="width: ' + width + 'px;">';
- r.results = new Array();
+ r.results = [];
r.resultCount = results.length;
for( i = 0; i < results.length; i++ ) {
var title = os_decodeValue( results[i] );
diff --git a/skins/common/oldshared.css b/skins/common/oldshared.css
index 4be14f37..84d42c9f 100644
--- a/skins/common/oldshared.css
+++ b/skins/common/oldshared.css
@@ -1,11 +1,12 @@
-/*
+/**
* oldshared.css
* This file contains CSS settings common to Wikistandard, Nostalgia and
* CologneBlue, the old pre-Monobook skins
*/
-/* For clarity, explicitly state some recommendations from <http://www.w3.org/
- TR/CSS21/sample.html> to make sure the editsection links scale right */
+/* 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; }
@@ -99,7 +100,8 @@ div.magnify {
border: none !important;
background: none !important;
}
-div.magnify a, div.magnify img {
+div.magnify a,
+div.magnify img {
display: block;
border: none !important;
background: none !important;
@@ -306,7 +308,8 @@ table.mw_metadata {
border: none;
border-collapse: collapse;
}
-table.mw_metadata td, table.mw_metadata th {
+table.mw_metadata td,
+table.mw_metadata th {
border: 1px solid #aaaaaa;
padding-left: 4px;
padding-right: 4px;
@@ -386,7 +389,9 @@ table.multipageimage td {
.TablePager {
border-collapse: collapse;
}
-.TablePager, .TablePager td, .TablePager th {
+.TablePager,
+.TablePager td,
+.TablePager th {
border: 0.15em solid #777777;
padding: 0 0.15em 0 0.15em;
}
@@ -400,7 +405,8 @@ table.multipageimage td {
background-color: #eeeeff;
}
-.imagelist td, .imagelist th {
+.imagelist td,
+.imagelist th {
white-space: nowrap;
}
.imagelist .TablePager_col_links {
diff --git a/skins/common/preview.js b/skins/common/preview.js
index 82b27bc1..9e76ca09 100644
--- a/skins/common/preview.js
+++ b/skins/common/preview.js
@@ -37,8 +37,8 @@
// with the content of the loaded page
var copyContent = page.find( copyElements[i] ).contents();
$(copyElements[i]).empty().append( copyContent );
- var newClasses = page.find( copyElements[i] ).attr('class');
- $(copyElements[i]).attr( 'class', newClasses );
+ var newClasses = page.find( copyElements[i] ).prop('class');
+ $(copyElements[i]).prop( 'class', newClasses );
}
$.each( copyElements, function(k,v) {
diff --git a/skins/common/protect.js b/skins/common/protect.js
index b77c2e06..a23c0cbd 100644
--- a/skins/common/protect.js
+++ b/skins/common/protect.js
@@ -77,16 +77,20 @@ window.ProtectionForm = {
},
/**
- * Is this protection level cascadeable?
- * @param level String
- *
- * @return boolean
- *
+ * Checks if a cerain protection level is cascadeable.
+ * @param level {String}
+ * @return {Boolean}
*/
'isCascadeableLevel': function( level ) {
- for (var k = 0; k < wgCascadeableLevels.length; k++) {
- if ( wgCascadeableLevels[k] == level ) {
- return true;
+ var cascadeLevels, len, i;
+
+ cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
+ // cascadeLevels isn't defined on all pages
+ if ( cascadeLevels ) {
+ for ( i = 0, len = cascadeLevels.length; i < len; i += 1 ) {
+ if ( cascadeLevels[i] === level ) {
+ return true;
+ }
}
}
return false;
@@ -252,7 +256,7 @@ window.ProtectionForm = {
*/
'getLevelSelectors': function() {
var all = document.getElementsByTagName("select");
- var ours = new Array();
+ var ours = [];
for (var i = 0; i < all.length; i++) {
var element = all[i];
if (element.id.match(/^mwProtect-level-/)) {
@@ -281,7 +285,7 @@ window.ProtectionForm = {
*/
'getExpiryInputs': function() {
var all = document.getElementsByTagName("input");
- var ours = new Array();
+ var ours = [];
for (var i = 0; i < all.length; i++) {
var element = all[i];
if (element.name.match(/^mwProtect-expiry-/)) {
@@ -309,7 +313,7 @@ window.ProtectionForm = {
*/
'getExpirySelectors': function() {
var all = document.getElementsByTagName("select");
- var ours = new Array();
+ var ours = [];
for (var i = 0; i < all.length; i++) {
var element = all[i];
if (element.id.match(/^mwProtectExpirySelection-/)) {
diff --git a/skins/common/shared.css b/skins/common/shared.css
index 3612ee0f..824e3687 100644
--- a/skins/common/shared.css
+++ b/skins/common/shared.css
@@ -1,41 +1,86 @@
/**
- * CSS in this file is used by *all* skins (that have any CSS at all). Be
+ * CSS in this file is used by *all* skins (that have any CSS at all). Be
* careful what you put in here, since what looks good in one skin may not in
* another, but don't ignore the poor pre-Monobook users either.
*/
/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
-/* These classes should be used for text depending on the content direction.
-Content stuff like editsection, ul/ol and TOC depend on this. */
- /* @noflip */.mw-content-ltr { direction: ltr; }
-/* @noflip */.mw-content-rtl { direction: rtl; }
+
+/**
+ * These classes should be used for text depending on the content direction.
+ * Content stuff like editsection, ul/ol and TOC depend on this.
+ */
+.mw-content-ltr {
+ /* @noflip */
+ direction: ltr;
+}
+.mw-content-rtl {
+ /* @noflip */
+ direction: rtl;
+}
+
/* Most input fields should be in site direction */
-/* @noflip */.sitedir-ltr textarea, .sitedir-ltr input { direction: ltr; }
-/* @noflip */.sitedir-rtl textarea, .sitedir-rtl input { direction: rtl; }
+.sitedir-ltr textarea,
+.sitedir-ltr input {
+ /* @noflip */
+ direction: ltr;
+}
+.sitedir-rtl textarea,
+.sitedir-rtl input {
+ /* @noflip */
+ direction: rtl;
+}
+
/* Input types that should follow user direction, like buttons */
-input[type="submit"], input[type="button"], input[type="reset"], input[type="file"] { direction: ltr; }
+/* TODO: What about buttons in wikipage content ? */
+input[type="submit"],
+input[type="button"],
+input[type="reset"],
+input[type="file"] {
+ direction: ltr;
+}
+
/* Override default values */
-/* @noflip */textarea[dir="ltr"], input[dir="ltr"] { direction: ltr; }
-/* @noflip */textarea[dir="rtl"], input[dir="rtl"] { direction: rtl; }
+textarea[dir="ltr"],
+input[dir="ltr"] {
+ /* @noflip */
+ direction: ltr;
+}
+textarea[dir="rtl"],
+input[dir="rtl"] {
+ /* @noflip */
+ direction: rtl;
+}
/* Default style for semantic tags */
-abbr, acronym, .explain {
- border-bottom: 1px dotted black;
+abbr,
+acronym,
+.explain {
+ border-bottom: 1px dotted;
cursor: help;
}
/* Colored watchlist and recent changes numbers */
-.mw-plusminus-pos { color: #006400; } /* dark green */
-.mw-plusminus-neg { color: #8b0000; } /* dark red */
-.mw-plusminus-null { color: #aaa; } /* gray */
+.mw-plusminus-pos {
+ color: #006400; /* dark green */
+}
+.mw-plusminus-neg {
+ color: #8b0000; /* dark red */
+}
+.mw-plusminus-null {
+ color: #aaa; /* gray */
+}
-/* Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
- [[Special:Watchlist/edit]] and in category listings */
-.allpagesredirect, .redirect-in-category, .watchlistredir {
+/**
+ * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
+ * [[Special:Watchlist/edit]] and in category listings.
+ */
+.allpagesredirect,
+.redirect-in-category,
+.watchlistredir {
font-style: italic;
}
-
/* Comment and username portions of RC entries */
span.comment {
font-style: italic;
@@ -50,15 +95,25 @@ span.changedby {
direction: ltr;
unicode-bidi: embed;
}
-img.tex { vertical-align: middle; }
-span.texhtml { font-family: serif; }
+img.tex {
+ vertical-align: middle;
+}
+span.texhtml {
+ font-family: serif;
+}
-/* add a bit of margin space between the preview and the toolbar */
-/* this replaces the ugly <p><br /></p> we used to insert into the page source */
-#wikiPreview.ontop { margin-bottom: 1em; }
+/**
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+ margin-bottom: 1em;
+}
/* Stop floats from intruding into edit area in previews */
-#editform, #toolbar, #wpTextbox1 {
+#editform,
+#toolbar,
+#wpTextbox1 {
clear: both;
}
#toolbar img {
@@ -77,8 +132,25 @@ div#mw-js-message {
margin-left: 5px;
}
/* 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; }
-/* @noflip */.mw-content-rtl .editsection, .mw-content-ltr .mw-content-rtl .editsection { float: left; }
+.mw-content-ltr .editsection,
+.mw-content-rtl .mw-content-ltr .editsection {
+ /* @noflip */
+ float: right;
+}
+.mw-content-rtl .editsection,
+.mw-content-ltr .mw-content-rtl .editsection {
+ /* @noflip */
+ float: left;
+}
+
+/**
+ * File description page
+ */
+
+div.mw-filepage-resolutioninfo {
+ font-size: smaller;
+}
+
/**
* File histories
*/
@@ -102,10 +174,21 @@ table.filehistory td.filehistory-selected {
font-weight: bold;
}
-/*
+/**
+ * Add a checkered background image on hover for file
+ * description pages. (bug 26470)
+ */
+.filehistory a img,
+#file img:hover {
+ /* @embed */
+ background: white url(images/Checker-16x16.png) repeat;
+}
+
+/**
* rev_deleted stuff
*/
-li span.deleted, span.history-deleted {
+li span.deleted,
+span.history-deleted {
text-decoration: line-through;
color: #888;
font-style: italic;
@@ -131,17 +214,31 @@ div.patrollink {
/**
* Forms
*/
-td.mw-label { text-align: right; }
-td.mw-input { text-align: left; }
-td.mw-submit { text-align: left; }
+td.mw-label {
+ text-align: right;
+}
+td.mw-input {
+ text-align: left;
+}
+td.mw-submit {
+ text-align: left;
+}
-td.mw-label { vertical-align: top; }
-.prefsection td.mw-label { width: 20%; }
-.prefsection table { width: 100%; }
-td.mw-submit { white-space: nowrap; }
+td.mw-label {
+ vertical-align: top;
+}
+.prefsection td.mw-label {
+ width: 20%;
+}
+.prefsection table {
+ width: 100%;
+}
+td.mw-submit {
+ white-space: nowrap;
+}
table.mw-htmlform-nolabel td.mw-label {
- width: 0 !important;
+ width: 1px;
}
tr.mw-htmlform-vertical-label td.mw-label {
@@ -151,7 +248,8 @@ tr.mw-htmlform-vertical-label td.mw-label {
.mw-htmlform-invalid-input td.mw-input input {
border-color: red;
}
-.mw-htmlform-multiselect-flatlist div.mw-htmlform-multiselect-item {
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
display: inline;
margin-right: 1em;
white-space: nowrap;
@@ -164,8 +262,12 @@ input#wpSummary {
/**
* Image captions
*/
-.thumbcaption { text-align: left; }
-.magnify { float: right; }
+.thumbcaption {
+ text-align: left;
+}
+.magnify {
+ float: right;
+}
/**
* Categories
@@ -177,56 +279,61 @@ input#wpSummary {
*/
text-align: left;
}
-#catlinks ul {
- display:inline;
- margin: 0px;
- padding: 0px;
+.catlinks ul {
+ display: inline;
+ margin: 0;
+ padding: 0;
list-style: none;
list-style-type: none;
list-style-image: none;
vertical-align: middle !ie;
}
-#catlinks li {
- display:inline-block;
- line-height: 1.35em;
- padding: 0 .7em;
+.catlinks li {
+ display: inline-block;
+ line-height: 1.25em;
border-left: 1px solid #AAA;
- margin: 0.3em 0;
+ margin: 0.125em 0;
+ padding: 0 0.5em;
zoom: 1;
- display:inline !ie;
+ display: inline !ie;
}
-#catlinks li:first-child {
- padding-left: .4em;
+.catlinks li:first-child {
+ padding-left: 0.25em;
border-left: none;
}
/**
* Hidden categories
*/
-.mw-hidden-cats-hidden { display: none; }
-.catlinks-allhidden { display: none; }
+.mw-hidden-cats-hidden {
+ display: none;
+}
+.catlinks-allhidden {
+ display: none;
+}
/* Convenience links to edit block, delete and protect reasons */
-p.mw-ipb-conveniencelinks, p.mw-protect-editreasons,
-p.mw-filedelete-editreasons, p.mw-delete-editreasons,
+p.mw-ipb-conveniencelinks,
+p.mw-protect-editreasons,
+p.mw-filedelete-editreasons,
+p.mw-delete-editreasons,
p.mw-revdel-editreasons {
font-size: 90%;
text-align: right;
}
-/*
+/**
* OpenSearch ajax suggestions
*/
.os-suggest {
overflow: auto;
overflow-x: hidden;
position: absolute;
- top: 0px;
- left: 0px;
- width: 0px;
+ top: 0;
+ left: 0;
+ width: 0;
background-color: white;
- background-color: Window;
border-style: solid;
border-color: #AAAAAA;
border-width: 1px;
@@ -242,12 +349,11 @@ table.os-suggest-results {
width: 100%;
}
-.os-suggest-result, .os-suggest-result-hl {
+.os-suggest-result,
+.os-suggest-result-hl {
white-space: nowrap;
background-color: white;
- background-color: Window;
color: black;
- color: WindowText;
padding: 2px;
}
.os-suggest-result-hl,
@@ -255,12 +361,6 @@ table.os-suggest-results {
background-color: #4C59A6;
color: white;
}
-.os-suggest-result-hl {
- /* System colors are misimplemented in Safari 3.0 and earlier,
- making highlighted text illegible... */
- background-color: Highlight;
- color: HighlightText;
-}
.os-suggest-toggle {
position: relative;
@@ -269,15 +369,18 @@ table.os-suggest-results {
}
.os-suggest-toggle-def {
position: absolute;
- top: 0px;
- left: 0px;
+ top: 0;
+ left: 0;
font-size: 65%;
visibility: hidden;
}
/* Page history styling */
-/* the auto-generated edit comments */
-.autocomment { color: gray; }
+
+/* The auto-generated edit comments */
+.autocomment {
+ color: gray;
+}
#pagehistory .history-user {
margin-left: 0.4em;
margin-right: 0.2em;
@@ -297,16 +400,19 @@ table.os-suggest-results {
float: right;
}
-/** Generic minor/bot/newpage styling */
-.newpage, .minor, .bot {
+/** Generic minor/bot/newpage styling (recent changes) */
+.newpage,
+.minoredit,
+.botedit {
font-weight: bold;
}
-#shared-image-dup, #shared-image-conflict {
+#shared-image-dup,
+#shared-image-conflict {
font-style: italic;
}
-/*
+/**
* Recreating deleted page warning
* Reupload file warning
* Page protection warning
@@ -332,7 +438,8 @@ input.mw-revdelundel-hidden {
visibility: hidden;
}
-td.mw-revdel-checkbox, th.mw-revdel-checkbox {
+td.mw-revdel-checkbox,
+th.mw-revdel-checkbox {
padding-right: 10px;
text-align: center;
}
@@ -340,7 +447,7 @@ td.mw-revdel-checkbox, th.mw-revdel-checkbox {
/* feed links */
a.feedlink {
/* @embed */
- background: url("images/feed-icon.png") center left no-repeat;
+ background: url(images/feed-icon.png) center left no-repeat;
padding-left: 16px;
}
@@ -351,30 +458,36 @@ a.feedlink {
padding: 0 !important;
}
/* External URLs should always be treated as LTR (bug 4330) */
-/* @noflip */ .rtl a.external.free, .rtl a.external.autonumber {
+/* @noflip */ .rtl a.external.free,
+.rtl a.external.autonumber {
direction: ltr;
unicode-bidi: embed;
}
-/* wikitable class for skinning normal tables
- * keep on sync with commonPrint.css
+/**
+ * wikitable class for skinning normal tables
+ * keep in sync with commonPrint.css
*/
table.wikitable {
margin: 1em 1em 1em 0;
- background: #f9f9f9;
+ background-color: #f9f9f9;
border: 1px #aaa solid;
border-collapse: collapse;
color: black;
}
-.wikitable th, .wikitable td {
+table.wikitable > tr > th,
+table.wikitable > tr > td,
+table.wikitable > * > tr > th,
+table.wikitable > * > tr > td {
border: 1px #aaa solid;
padding: 0.2em;
}
-.wikitable th {
- background: #f2f2f2;
+table.wikitable > tr > th,
+table.wikitable > * > tr > th {
+ background-color: #f2f2f2;
text-align: center;
}
-.wikitable caption {
+table.wikitable > caption {
font-weight: bold;
}
@@ -396,7 +509,9 @@ table.collapsed tr.collapsable {
color: red;
font-size: larger;
}
-.errorbox, .warningbox, .successbox {
+.errorbox,
+.warningbox,
+.successbox {
font-size: larger;
border: 2px solid;
padding: .5em 1em;
@@ -416,7 +531,9 @@ table.collapsed tr.collapsable {
border-color: green;
background-color: #dfd;
}
-.errorbox h2, .warningbox h2, .successbox h2 {
+.errorbox h2,
+.warningbox h2,
+.successbox h2 {
font-size: 1em;
font-weight: bold;
display: inline;
@@ -463,17 +580,38 @@ table.collapsed tr.collapsable {
padding: 0.2em;
}
-/*
- Table pager (e.g. Special:ListFiles)
- - remove underlines from the navigation link
- - collapse borders
- - set the borders to outsets (similar to Special:AllMessages)
- - remove line wrapping for all td and th, set background color
- - restore line wrapping for the last two table cells (description and size)
-*/
+/**
+ * Data table style
+ *
+ * Transparent table with suddle borders
+ * and blue row-highlighting.
+ */
+.mw-datatable {
+ border-collapse: collapse;
+}
+.mw-datatable,
+.mw-datatable td,
+.mw-datatable th {
+ border: 1px solid #aaaaaa;
+ padding: 0 0.15em 0 0.15em;
+}
+.mw-datatable th {
+ background-color: #ddddff;
+}
+.mw-datatable td {
+ background-color: #ffffff;
+}
+.mw-datatable tr:hover td {
+ background-color: #eeeeff;
+}
+
+
+/**
+ * TablePager tables generated by the TablePager PHP class
+ * in MediaWiki (e.g. Special:ListFiles).
+ */
.TablePager {
min-width: 80%;
- border-collapse: collapse;
}
.TablePager_nav {
margin: 0 auto;
@@ -485,21 +623,9 @@ table.collapsed tr.collapsable {
.TablePager_nav a {
text-decoration: none;
}
-.TablePager, .TablePager td, .TablePager th {
- border: 1px solid #aaaaaa;
- padding: 0 0.15em 0 0.15em;
-}
-.TablePager th {
- background-color: #eeeeff;
-}
-.TablePager td {
- background-color: #ffffff;
-}
-.TablePager tr:hover td {
- background-color: #eeeeff;
-}
-.imagelist td, .imagelist th {
+.imagelist td,
+.imagelist th {
white-space: nowrap;
}
.imagelist .TablePager_col_links {
@@ -555,7 +681,8 @@ table.mw_metadata {
border-collapse: collapse;
}
-table.mw_metadata td, table.mw_metadata th {
+table.mw_metadata td,
+table.mw_metadata th {
text-align: center;
border: 1px solid #aaaaaa;
padding-left: 5px;
@@ -582,13 +709,13 @@ table.mw_metadata ul.metadata-langlist {
.mw-content-ltr ul,
.mw-content-rtl .mw-content-ltr ul {
/* @noflip */
- margin: 0.3em 0 0 1.5em;
+ margin: 0.3em 0 0 1.6em;
padding: 0;
}
.mw-content-rtl ul,
.mw-content-ltr .mw-content-rtl ul {
/* @noflip */
- margin: 0.3em 1.5em 0 0;
+ margin: 0.3em 1.6em 0 0;
padding: 0;
}
.mw-content-ltr ol,
@@ -603,19 +730,17 @@ table.mw_metadata ul.metadata-langlist {
margin: 0.3em 3.2em 0 0;
padding: 0;
}
-
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */.mw-content-ltr ul, .mw-content-rtl .mw-content-ltr ul {
- margin: .3em 0 0 1.5em;
-}
-/* @noflip */.mw-content-rtl ul, .mw-content-ltr .mw-content-rtl ul {
- margin: .3em 1.5em 0 0;
-}
-/* @noflip */.mw-content-ltr ol, .mw-content-rtl .mw-content-ltr ol {
- margin: .3em 0 0 3.2em;
+/* @noflip */
+.mw-content-ltr dd,
+.mw-content-rtl .mw-content-ltr dd {
+ margin-left: 1.6em;
+ margin-right: 0;
}
-/* @noflip */.mw-content-rtl ol, .mw-content-ltr .mw-content-rtl ol {
- margin: .3em 3.2em 0 0;
+/* @noflip */
+.mw-content-rtl dd,
+.mw-content-ltr .mw-content-rtl dd {
+ margin-right: 1.6em;
+ margin-left: 0;
}
/* Galleries */
@@ -628,7 +753,8 @@ li.gallerybox {
display: inline-block;
}
-ul.gallery, li.gallerybox {
+ul.gallery,
+li.gallerybox {
zoom: 1;
*display: inline;
}
@@ -684,6 +810,37 @@ div.gallerytext {
background-repeat: no-repeat;
}
+/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
+/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
+h1:lang(as),
+h1:lang(bn),
+h1:lang(gu),
+h1:lang(hi),
+h1:lang(kn),
+h1:lang(ml),
+h1:lang(mr),
+h1:lang(or),
+h1:lang(pa),
+h1:lang(sa),
+h1:lang(ta),
+h1:lang(te) {
+ line-height: 1.5em !important;
+}
+h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
+h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
+h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
+h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
+h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
+h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
+h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
+h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
+h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
+h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
+h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
+h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
+ line-height: 1.2em;
+}
+
/* Localised ordered list numbering for some languages */
ol:lang(bcc) li,
ol:lang(bqi) li,
@@ -716,20 +873,28 @@ ol:lang(or) li {
}
/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */.mw-content-ltr .toc ul, .mw-content-ltr #toc ul,
-.mw-content-rtl .mw-content-ltr .toc ul, .mw-content-rtl .mw-content-ltr #toc ul {
+/* @noflip */ .mw-content-ltr .toc ul,
+.mw-content-ltr #toc ul,
+.mw-content-rtl .mw-content-ltr .toc ul,
+.mw-content-rtl .mw-content-ltr #toc ul {
text-align: left;
}
-/* @noflip */.mw-content-rtl .toc ul, .mw-content-rtl #toc ul,
-.mw-content-ltr .mw-content-rtl .toc ul, .mw-content-ltr .mw-content-rtl #toc ul {
+/* @noflip */ .mw-content-rtl .toc ul,
+.mw-content-rtl #toc ul,
+.mw-content-ltr .mw-content-rtl .toc ul,
+.mw-content-ltr .mw-content-rtl #toc ul {
text-align: right;
}
-/* @noflip */.mw-content-ltr .toc ul ul, .mw-content-ltr #toc ul ul,
-.mw-content-rtl .mw-content-ltr .toc ul ul, .mw-content-rtl .mw-content-ltr #toc ul ul {
+/* @noflip */ .mw-content-ltr .toc ul ul,
+.mw-content-ltr #toc ul ul,
+.mw-content-rtl .mw-content-ltr .toc ul ul,
+.mw-content-rtl .mw-content-ltr #toc ul ul {
margin: 0 0 0 2em;
}
-/* @noflip */.mw-content-rtl .toc ul ul, .mw-content-rtl #toc ul ul,
-.mw-content-ltr .mw-content-rtl .toc ul ul, .mw-content-ltr .mw-content-rtl #toc ul ul {
+/* @noflip */ .mw-content-rtl .toc ul ul,
+.mw-content-rtl #toc ul ul,
+.mw-content-ltr .mw-content-rtl .toc ul ul,
+.mw-content-ltr .mw-content-rtl #toc ul ul {
margin: 0 2em 0 0;
}
@@ -745,7 +910,7 @@ ol:lang(or) li {
display: none;
margin-left: 2px;
margin-bottom: -8px;
- padding: 0px 0px 0px 15px;
+ padding: 0 0 0 15px;
/* @embed */
background-image: url('images/help-question.gif');
background-position: left center;
@@ -793,35 +958,19 @@ ol:lang(or) li {
right: 10px;
background-position: 0% 100%;
}
-/* Table Sorting */
-table.sortable th.headerSort {
- background-image: url(images/sort_both.gif);
- cursor: pointer;
- background-repeat: no-repeat;
- background-position: center right;
- padding-right: 21px;
-}
-table.sortable th.headerSortUp {
- background-image: url(images/sort_up.gif);
-}
-table.sortable th.headerSortDown {
- background-image: url(images/sort_down.gif);
-}
-/* LTR content in RTL layout */
-.ltr {
- /* @noflip */
- direction: ltr;
- unicode-bidi: embed;
-}
-
-#mw-clearyourcache, #mw-sitecsspreview, #mw-sitejspreview, #mw-usercsspreview, #mw-userjspreview {
+#mw-clearyourcache,
+#mw-sitecsspreview,
+#mw-sitejspreview,
+#mw-usercsspreview,
+#mw-userjspreview {
direction: ltr;
unicode-bidi: embed;
}
/* Correct user & content directionality when viewing a diff */
-.diff-currentversion-title, .diff {
+.diff-currentversion-title,
+.diff {
direction: ltr;
unicode-bidi: embed;
}
@@ -833,27 +982,56 @@ table.sortable th.headerSortDown {
direction: ltr;
unicode-bidi: embed;
}
-.diff-otitle, .diff-ntitle, .diff-lineno {
+.diff-otitle,
+.diff-ntitle,
+.diff-lineno {
direction: ltr !important;
unicode-bidi: embed;
}
-#mw-revision-info, #mw-revision-nav {
+#mw-revision-info,
+#mw-revision-info-current,
+#mw-revision-nav {
direction: ltr;
+ display: inline;
}
/* Images */
-/* @noflip */div.tright, div.floatright, table.floatright {
+
+/* @noflip */ div.tright,
+div.floatright,
+table.floatright {
clear: right;
float: right;
}
-/* @noflip */div.tleft, div.floatleft, table.floatleft {
+/* @noflip */ div.tleft,
+div.floatleft,
+table.floatleft {
float: left;
clear: left;
}
-div.floatright, table.floatright, div.floatleft, table.floatleft {
+div.floatright,
+table.floatright,
+div.floatleft,
+table.floatleft {
position: relative;
}
/* bug 12205 */
-#mw-credits a { unicode-bidi: embed; }
+#mw-credits a {
+ unicode-bidi: embed;
+}
+
+/* Accessibility */
+.mw-jump,
+#jump-to-nav {
+ overflow: hidden;
+ height: 0;
+ zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
+}
+
+/* For developpers */
+.xdebug-error {
+ position: absolute;
+ z-index: 99;
+}
diff --git a/skins/common/upload.js b/skins/common/upload.js
index 99917c75..8e08af31 100644
--- a/skins/common/upload.js
+++ b/skins/common/upload.js
@@ -1,3 +1,7 @@
+( function () {
+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;
@@ -11,7 +15,7 @@ window.licenseSelectorCheck = function() {
wgUploadLicenseObj.fetchPreview( selection );
};
-window.wgUploadSetup = function() {
+function uploadSetup() {
// Disable URL box if the URL copy upload source type is not selected
var e = document.getElementById( 'wpSourceTypeurl' );
if( e ) {
@@ -34,49 +38,51 @@ window.wgUploadSetup = function() {
}
}
}
-
-
+
// AJAX wpDestFile warnings
- if ( wgAjaxUploadDestCheck ) {
+ if ( ajaxUploadDestCheck ) {
// Insert an event handler that fetches upload warnings when wpDestFile
// has been changed
- document.getElementById( 'wpDestFile' ).onchange = function ( e ) {
+ document.getElementById( 'wpDestFile' ).onchange = function ( e ) {
wgUploadWarningObj.checkNow(this.value);
};
- // Insert a row where the warnings will be displayed just below the
+ // 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' );
td.id = 'wpDestFile-warning';
td.colSpan = 2;
-
+
row.appendChild( td );
}
-
+
var wpLicense = document.getElementById( 'wpLicense' );
- if ( wgAjaxLicensePreview && 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;
-
+
var row = document.createElement( 'tr' );
var td = document.createElement( 'td' );
row.appendChild( td );
td = document.createElement( 'td' );
td.id = 'mw-license-preview';
row.appendChild( td );
-
+
wpLicenseTbody.insertBefore( row, wpLicenseRow.nextSibling );
}
-
-
+
+
// fillDestFile setup
- for ( var i = 0; i < wgUploadSourceIds.length; i++ )
- document.getElementById( wgUploadSourceIds[i] ).onchange = function (e) {
+ 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 );
};
};
@@ -90,7 +96,7 @@ window.wgUploadWarningObj = {
'timeoutID': false,
'keypress': function () {
- if ( !wgAjaxUploadDestCheck || !sajax_init_object() ) return;
+ if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
// Find file to upload
var destFile = document.getElementById('wpDestFile');
@@ -115,7 +121,7 @@ window.wgUploadWarningObj = {
},
'checkNow': function (fname) {
- if ( !wgAjaxUploadDestCheck || !sajax_init_object() ) return;
+ if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
if ( this.timeoutID ) {
window.clearTimeout( this.timeoutID );
}
@@ -124,7 +130,7 @@ window.wgUploadWarningObj = {
},
'timeout' : function() {
- if ( !wgAjaxUploadDestCheck || !sajax_init_object() ) return;
+ if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
// Get variables into local scope so that they will be preserved for the
@@ -150,7 +156,7 @@ window.wgUploadWarningObj = {
var ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
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;' ) {
@@ -169,7 +175,7 @@ window.wgUploadWarningObj = {
};
window.fillDestFilename = function(id) {
- if (!wgUploadAutoFill) {
+ if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
return;
}
if (!document.getElementById) {
@@ -196,14 +202,14 @@ window.fillDestFilename = function(id) {
}
// Clear the filename if it does not have a valid extension.
- // URLs are less likely to have a useful extension, so don't include them in the
+ // URLs are less likely to have a useful extension, so don't include them in the
// extension check.
- if( wgStrictFileExtensions && wgFileExtensions && id != 'wpUploadFileURL' ) {
+ if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
var found = false;
- if( fname.lastIndexOf( '.' ) != -1 ) {
+ if ( fname.lastIndexOf( '.' ) !== -1 ) {
var ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
- for( var i = 0; i < wgFileExtensions.length; i++ ) {
- if( wgFileExtensions[i].toLowerCase() == ext.toLowerCase() ) {
+ for ( var i = 0; i < fileExtensions.length; i += 1 ) {
+ if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
found = true;
break;
}
@@ -230,7 +236,7 @@ window.fillDestFilename = function(id) {
// Replace spaces by underscores
fname = fname.replace( / /g, '_' );
// Capitalise first letter if needed
- if ( wgCapitalizeUploads ) {
+ if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1, 10000 ) );
}
@@ -254,7 +260,7 @@ window.wgUploadLicenseObj = {
'responseCache' : { '' : '' },
'fetchPreview': function( license ) {
- if( !wgAjaxLicensePreview ) return;
+ if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) return;
for (cached in this.responseCache) {
if (cached == license) {
this.showPreview( this.responseCache[license] );
@@ -262,15 +268,15 @@ window.wgUploadLicenseObj = {
}
}
injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
-
+
var title = document.getElementById('wpDestFile').value;
if ( !title ) title = 'File:Sample.jpg';
-
- var url = wgScriptPath + '/api' + wgScriptExtension
+
+ var url = mw.util.wikiScript( 'api' )
+ '?action=parse&text={{' + encodeURIComponent( license ) + '}}'
- + '&title=' + encodeURIComponent( title )
+ + '&title=' + encodeURIComponent( title )
+ '&prop=text&pst&format=json';
-
+
var req = sajax_init_object();
req.onreadystatechange = function() {
if ( req.readyState == 4 && req.status == 200 )
@@ -284,7 +290,6 @@ window.wgUploadLicenseObj = {
removeSpinner( 'license' );
this.responseCache[license] = result['parse']['text']['*'];
this.showPreview( this.responseCache[license] );
-
},
'showPreview' : function( preview ) {
@@ -295,4 +300,6 @@ window.wgUploadLicenseObj = {
};
-addOnloadHook( wgUploadSetup );
+$( document ).ready( uploadSetup );
+
+}() );
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
index 5cb037be..8f47499c 100644
--- a/skins/common/wikibits.js
+++ b/skins/common/wikibits.js
@@ -1,4 +1,7 @@
-// MediaWiki JavaScript support functions
+/**
+ * MediaWiki legacy wikibits
+ */
+(function(){
window.clientPC = navigator.userAgent.toLowerCase(); // Get client info
window.is_gecko = /gecko/.test( clientPC ) &&
@@ -46,9 +49,6 @@ if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null
ie6_bugs = true;
}
-// Global external objects used by this script.
-/*extern ta, stylepath, skin */
-
// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
window.doneOnloadHook = undefined;
@@ -66,9 +66,8 @@ window.addOnloadHook = function( hookFunct ) {
};
window.importScript = function( page ) {
- // TODO: might want to introduce a utility function to match wfUrlencode() in PHP
- var uri = wgScript + '?title=' +
- encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') +
+ var uri = mw.config.get( 'wgScript' ) + '?title=' +
+ mw.util.wikiUrlencode( page ) +
'&action=raw&ctype=text/javascript';
return importScriptURI( uri );
};
@@ -87,7 +86,7 @@ window.importScriptURI = function( url ) {
};
window.importStylesheet = function( page ) {
- return importStylesheetURI( wgScript + '?action=raw&ctype=text/css&title=' + encodeURIComponent( page.replace(/ /g,'_') ) );
+ return importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
};
window.importStylesheetURI = function( url, media ) {
@@ -116,20 +115,20 @@ window.appendCSS = function( text ) {
};
// Special stylesheet links for Monobook only (see bug 14717)
-if ( typeof stylepath != 'undefined' && skin == 'monobook' ) {
+var skinpath = mw.config.get( 'stylepath' ) + '/' + mw.config.get( 'skin' );
+if ( mw.config.get( 'skin' ) === 'monobook' ) {
if ( opera6_bugs ) {
- importStylesheetURI( stylepath + '/' + skin + '/Opera6Fixes.css' );
+ importStylesheetURI( skinpath + '/Opera6Fixes.css' );
} else if ( opera7_bugs ) {
- importStylesheetURI( stylepath + '/' + skin + '/Opera7Fixes.css' );
+ importStylesheetURI( skinpath + '/Opera7Fixes.css' );
} else if ( opera95_bugs ) {
- importStylesheetURI( stylepath + '/' + skin + '/Opera9Fixes.css' );
+ importStylesheetURI( skinpath + '/Opera9Fixes.css' );
} else if ( ff2_bugs ) {
- importStylesheetURI( stylepath + '/' + skin + '/FF2Fixes.css' );
+ importStylesheetURI( skinpath + '/FF2Fixes.css' );
}
}
-
-if ( 'wgBreakFrames' in window && window.wgBreakFrames ) {
+if ( mw.config.get( 'wgBreakFrames' ) ) {
// Un-trap us from framesets
if ( window.top != window ) {
window.top.location = window.location;
@@ -319,7 +318,7 @@ window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, n
link.setAttribute( 'title', tooltip );
}
if ( accesskey && tooltip ) {
- updateTooltipAccessKeys( new Array( link ) );
+ updateTooltipAccessKeys( [link] );
}
if ( nextnode && nextnode.parentNode == node ) {
@@ -367,11 +366,6 @@ window.getInnerText = function( el ) {
return str;
};
-/* Dummy for deprecated function */
-window.ta = [];
-window.akeytt = function( doId ) {
-};
-
window.checkboxes = undefined;
window.lastCheckbox = undefined;
@@ -445,7 +439,7 @@ window.checkboxClickHandler = function( e ) {
From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
- var arrReturnElements = new Array();
+ var arrReturnElements = [];
if ( typeof( oElm.getElementsByClassName ) == 'function' ) {
/* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
@@ -460,7 +454,7 @@ window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
return arrReturnElements;
}
var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
- var arrRegExpClassNames = new Array();
+ var arrRegExpClassNames = [];
if( typeof oClassNames == 'object' ) {
for( var i = 0; i < oClassNames.length; i++ ) {
arrRegExpClassNames[arrRegExpClassNames.length] =
@@ -581,7 +575,7 @@ window.jsMsg = function( message, className ) {
window.injectSpinner = function( element, id ) {
var spinner = document.createElement( 'img' );
spinner.id = 'mw-spinner-' + id;
- spinner.src = stylepath + '/common/images/spinner.gif';
+ spinner.src = mw.config.get( 'stylepath' ) + '/common/images/spinner.gif';
spinner.alt = spinner.title = '...';
if( element.nextSibling ) {
element.parentNode.insertBefore( spinner, element.nextSibling );
@@ -666,5 +660,7 @@ window.removeHandler = function( element, remove, handler ) {
hookEvent( 'load', runOnloadHook );
if ( ie6_bugs ) {
- importScriptURI( stylepath + '/common/IEFixes.js' );
-} \ No newline at end of file
+ importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
+}
+
+})();
diff --git a/skins/common/wikiprintable.css b/skins/common/wikiprintable.css
index a80c8307..95fcfef3 100644
--- a/skins/common/wikiprintable.css
+++ b/skins/common/wikiprintable.css
@@ -6,41 +6,54 @@ body {
}
/* MSIE/Win doesn't understand 'inherit' */
-a, a.external, a.new, a.stub {
- color: black ! important;
- text-decoration: none ! important;
+a,
+a.external,
+a.new,
+a.stub {
+ color: black !important;
+ text-decoration: none !important;
}
#article {
- margin: 0 ! important;
+ margin: 0 !important;
}
/* Continue ... */
-a, a.external, a.new, a.stub {
- color: inherit ! important;
- text-decoration: inherit ! important;
+a,
+a.external,
+a.new,
+a.stub {
+ color: inherit !important;
+ text-decoration: inherit !important;
}
-/* Hide ugly UI stuff */
-#quickbar, #topbar, #logo, #footer, #siteNotice,
-.editsection, .toctoggle {
+/* Hide UI stuff */
+#quickbar,
+#topbar,
+#logo,
+#footer,
+#siteNotice,
+.editsection,
+.toctoggle {
display: none;
}
/* */
#article {
position: relative;
- margin: inherit ! important;
+ margin: inherit !important;
}
.printfooter {
border-top: solid 1px black;
- display: block ! important;
+ display: block !important;
}
-/* Old stuff, fixme:
+/* Old stuff. @todo FIXME:
a.CBlink { color: #0000AA; text-decoration: none; font-size: 12pt; }
-a.interwiki, a.external { color: #3333BB; text-decoration: none; }
+a.interwiki,
+a.external { color: #3333BB; text-decoration: none; }
h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
-i.link, u.link { color: #000066; }
+i.link,
+u.link { color: #000066; }
p.subtitle { padding-top: 0; margin-top: 0; }
*/
diff --git a/skins/common/wikistandard.css b/skins/common/wikistandard.css
index 62050922..e47dc42d 100644
--- a/skins/common/wikistandard.css
+++ b/skins/common/wikistandard.css
@@ -39,13 +39,14 @@
}
/* Table of contents */
-.toctoggle, .editsection {
+.toctoggle,
+.editsection {
font-size: smaller;
}
/* ... */
#toolbar {
- padding: 0px;
+ padding: 0;
}
#infobox {
@@ -57,7 +58,8 @@
margin-top: 1px;
}
-a.interwiki, a.external {
+a.interwiki,
+a.external {
color: #3366BB;
}
@@ -75,7 +77,7 @@ a:visited {
}
body {
- margin: 0px;
+ margin: 0;
padding: 4px;
color: black;
}
diff --git a/skins/modern/main.css b/skins/modern/main.css
index 910a53bc..17481562 100644
--- a/skins/modern/main.css
+++ b/skins/modern/main.css
@@ -1,7 +1,6 @@
body {
margin: 0 0 0 0;
padding: 0 0 0 0;
- /*font-size: 10pt;*/
font-size: x-small;
@@ -371,9 +370,6 @@ h1, h2, h3, h4, h5, h6 {
border: none;
}
-#preferences h2 {
-}
-
.mainLegend {
display: none;
}
@@ -428,7 +424,7 @@ h1, h2, h3, h4, h5, h6 {
background: url(mail_icon.gif) center right no-repeat;
padding-right: 18px;
}
-#mw_content a.external[href ^="news://"] {
+#mw_content a.external[href ^="news:"] {
/* @embed */
background: url(news_icon.png) center right no-repeat;
padding-right: 18px;
@@ -455,7 +451,7 @@ h1, h2, h3, h4, h5, h6 {
#mw_content a.external[href $=".wma"], #mw_content a.external[href $=".WMA"],
.link-audio {
/* @embed */
- background: url("audio.png") center right no-repeat;
+ background: url(audio.png) center right no-repeat;
padding-right: 13px;
}
#mw_content a.external[href $=".ogm"], #mw_content a.external[href $=".OGM"],
@@ -464,7 +460,7 @@ h1, h2, h3, h4, h5, h6 {
#mw_content a.external[href $=".mpg"], #mw_content a.external[href $=".MPG"],
.link-video {
/* @embed */
- background: url("video.png") center right no-repeat;
+ background: url(video.png) center right no-repeat;
padding-right: 13px;
}
#mw_content a.external[href $=".pdf"], #mw_content a.external[href $=".PDF"],
@@ -472,7 +468,7 @@ h1, h2, h3, h4, h5, h6 {
#mw_content a.external[href *=".pdf?"], #mw_content a.external[href *=".PDF?"],
.link-document {
/* @embed */
- background: url("document.png") center right no-repeat;
+ background: url(document.png) center right no-repeat;
padding-right: 12px;
}
@@ -480,22 +476,18 @@ h1, h2, h3, h4, h5, h6 {
/* @noflip */div.floatright, table.floatright {
margin: 0 0 .5em .5em;
border: 0;
-/*
- border: .5em solid white;
- border-width: .5em 0 .8em 1.4em;
-*/
}
-div.floatright p { font-style: italic; }
+div.floatright p {
+ font-style: italic;
+}
/* @noflip */div.floatleft, table.floatleft {
margin: 0 .5em .5em 0;
border: 0;
-/*
- margin: .3em .5em .5em 0;
- border: .5em solid white;
- border-width: .5em 1.4em .8em 0;
-*/
}
-div.floatleft p { font-style: italic; }
+div.floatleft p {
+ font-style: italic;
+}
+
/* thumbnails */
div.thumb {
margin-bottom: .5em;
@@ -704,17 +696,17 @@ div.noarticletext {
}
div#searchTargetContainer {
- left: 10px;
- top: 10px;
- width: 90%;
+ left: 10px;
+ top: 10px;
+ width: 90%;
background: white;
}
div#searchTarget {
- padding: 3px;
- margin: 5px;
+ padding: 3px;
+ margin: 5px;
background: #F0F0F0;
- border: solid 1px blue;
+ border: solid 1px blue;
}
div#searchTarget ul li {
@@ -729,7 +721,7 @@ div#searchTarget ul li:before {
div#searchTargetHide {
float: right;
border: solid 1px black;
- background: gainsboro;
+ background: #DCDCDC;
padding: 2px;
}
@@ -754,7 +746,9 @@ table.multipageimage td {
text-align: center;
}
-.templatesUsed { margin-top: 1.5em; }
+.templatesUsed {
+ margin-top: 1.5em;
+}
.mw-summary-preview {
margin: 0.1em 0;
diff --git a/skins/monobook/IE50Fixes.css b/skins/monobook/IE50Fixes.css
deleted file mode 100644
index a054a91f..00000000
--- a/skins/monobook/IE50Fixes.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-** IE5.0 Fix Stylesheet
-*/
-
-div#column-content {
- margin: 0 !important;
- float: none;
-}
-div#column-content #content {
- margin-top: 3em;
- height: 1%;
-}
-div#column-one {
- position: absolute;
- overflow: visible;
- top: 0;
- left: 0;
- z-index: 3;
-}
-div#footer {
- margin: 0 0 0 13.6em;
-}
-
-/* IE 5 & 5.5 interpret keyword sizes one off */
-body { font-size: xx-small; }
-/*
-** the edit tabs
-*/
-#p-cactions li {
- float: left;
- padding-top: 0;
- padding-bottom: 0 !important;
- height: 0.9em;
-}
-#p-cactions li a {
- display: block;
- padding-bottom: 0.045em;
-}
-#p-cactions li.selected a {
- padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
- padding-bottom: 0.17em;
-}
-/* 5.0 doesn't like the background icon for external links and user */
-.link-external,
-.external {
- background: none;
- padding: 0;
-}
-#p-personal ul { float: right }
-#p-personal li { float: left }
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login,
-li#pt-logout {
- background: none;
- padding-left: none;
-}
-.visualClear {
- width: 100%;
- height: 0px;
- padding:0;
- margin: 0;
-}
-#firstHeading { margin-bottom: .3em; }
-/*div{ border:1px solid Red !important;}*/
diff --git a/skins/monobook/IE55Fixes.css b/skins/monobook/IE55Fixes.css
deleted file mode 100644
index f3c2cde7..00000000
--- a/skins/monobook/IE55Fixes.css
+++ /dev/null
@@ -1,85 +0,0 @@
-/* IE5.5/win- only fixes */
-
-div#column-content {
- float: none;
- margin-left: 0;
- height: 1%;
-}
-div#column-content #content {
- position: relative;
- z-index: 5;
- margin-left: 12.2em;
- margin-top: 3em;
- height: 1%;
-}
-div#column-one {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 4;
- width: 100%;
-}
-div#footer {
- margin-left: 13.6em;
- border-left: 1px solid #fabd23;
-}
-
-/*#bodyContent div,
-#bodyContent pre { overflow: auto; }*/
-
-#p-personal { padding-bottom: .1em; }
-
-body { font-size: xx-small; }
-
-#p-cactions {
- width: 76% !important;
- z-index: 3 !important;
- float: none;
-}
-#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;
-}
-#p-navigation a {
- display: inline-block;
- width: 100%;
-}
-.portlet {
- overflow: hidden;
-}
-#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;
-}
-.visualClear {
- width: 90%;
- height: 1px;
- padding: 0;
- margin: 0;
-}
-
-#editform {
- width: 100%;
-}
diff --git a/skins/monobook/IE60Fixes.css b/skins/monobook/IE60Fixes.css
index 3bcd0479..ec1ce430 100644
--- a/skins/monobook/IE60Fixes.css
+++ b/skins/monobook/IE60Fixes.css
@@ -36,9 +36,6 @@ div#footer {
border-right: 1px solid #fabd23;
}
- /* the tabs */
-
-
/* the tabs */
#p-cactions {
diff --git a/skins/monobook/IE70Fixes.css b/skins/monobook/IE70Fixes.css
index fc009e6e..e8d3a8f8 100644
--- a/skins/monobook/IE70Fixes.css
+++ b/skins/monobook/IE70Fixes.css
@@ -8,8 +8,10 @@ div#column-content div#content {
margin-top: 3em;
height: 1%;
}
-
-.rtl div#column-content div#content { margin-right: 12.2em; margin-left: 0; }
+.rtl div#column-content div#content {
+ margin-right: 12.2em;
+ margin-left: 0;
+}
.rtl div#column-one {
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index edf79abb..9a8eac1c 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -59,135 +59,21 @@ div#globalWrapper {
}
/* general styles */
-
-table {
- font-size: 100%;
-}
a {
- text-decoration: none;
color: #002bb8;
- background: none;
}
a:visited {
color: #5a3696;
}
-a:active {
- color: #faa700;
-}
-a:hover {
- text-decoration: underline;
-}
-a.stub {
- color: #772233;
-}
-a.new, #p-personal a.new {
+a.new,
+#p-personal a.new {
color: #cc2200;
}
-a.new:visited, #p-personal a.new:visited {
- color: #a55858;
-}
-
-img {
- border: none;
- vertical-align: middle;
-}
-p {
- margin: .4em 0 .5em 0;
- line-height: 1.5em;
-}
-p img {
- margin: 0;
-}
-
-hr {
- height: 1px;
- color: #aaa;
- background-color: #aaa;
- border: 0;
- margin: .2em 0 .2em 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: black;
- background: none;
- font-weight: normal;
- margin: 0;
- overflow: hidden;
- padding-top: .5em;
- padding-bottom: .17em;
- border-bottom: 1px solid #aaa;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 67%; }
-h3, h4, h5, h6 {
- border-bottom: none;
- font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 76%; font-weight: normal; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86%; font-weight: normal; }
-h5 { font-size: 100%; }
-h5 .editsection { font-weight: normal; }
-h6 { font-size: 80%; }
-h6 .editsection { font-size: 125%; font-weight: normal; }
ul {
- line-height: 1.5em;
- list-style-type: square;
- margin: .3em 0 0 1.5em;
- padding: 0;
/* @embed */
list-style-image: url(bullet.gif);
}
-ol {
- line-height: 1.5em;
- margin: .3em 0 0 3.2em;
- padding: 0;
- list-style-image: none;
-}
-li {
- margin-bottom: .1em;
-}
-dt {
- font-weight: bold;
- margin-bottom: .1em;
-}
-dl {
- margin-top: .2em;
- margin-bottom: .5em;
-}
-dd {
- line-height: 1.5em;
- margin-left: 2em;
- margin-bottom: .1em;
-}
-
-fieldset {
- border: 1px solid #2f6fab;
- margin: 1em 0 1em 0;
- padding: 0 1em 1em;
- line-height: 1.5em;
-}
-fieldset.nested {
- margin: 0 0 0.5em 0;
- padding: 0 0.5em 0.5em;
-}
-legend {
- padding: .5em;
- font-size: 95%;
-}
-form {
- border: none;
- margin: 0;
-}
-
-textarea {
- width: 100%;
- padding: .1em;
-}
input.historysubmit {
padding: 0 .3em .3em .3em !important;
@@ -196,26 +82,8 @@ input.historysubmit {
height: 1.7em !important;
margin-left: 1.6em;
}
-select {
- vertical-align: top;
-}
-q {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}
-/* disabled for now
-blockquote {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}*/
-code {
- background-color: #f9f9f9;
-}
+
pre {
- padding: 1em;
- border: 1px dashed #2f6fab;
- color: black;
- background-color: #f9f9f9;
line-height: 1.1em;
}
@@ -223,211 +91,16 @@ pre {
** the main content area
*/
-#siteSub {
- display: none;
-}
-#jump-to-nav {
- display: none;
-}
-
-#contentSub, #contentSub2 {
- font-size: 84%;
- line-height: 1.2em;
- margin: 0 0 1.4em 1em;
- color: #7d7d7d;
- width: auto;
-}
-span.subpages {
- display: block;
-}
-
-/* Some space under the headers in the content area */
-#bodyContent h1, #bodyContent h2 {
- margin-bottom: .6em;
-}
-#bodyContent h3, #bodyContent h4, #bodyContent h5 {
- margin-bottom: .3em;
-}
-#firstHeading {
- margin-bottom: .1em;
- /* These two rules hack around bug 2013 (fix for more limited bug 11325).
- When bug 2013 is fixed properly, they should be removed. */
- line-height: 1.2em;
- padding-bottom: 0;
-}
-
-/* user notification thing */
-.usermessage {
- background-color: #ffce7b;
- border: 1px solid #ffa500;
- color: black;
- font-weight: bold;
- margin: 2em 0 1em;
- padding: .5em 1em;
- vertical-align: middle;
-}
#siteNotice {
- position: relative;
- text-align: center;
font-size: 95%;
padding: 0 0.9em;
}
-#siteNotice p {
+#localNotice {
margin: 0;
- padding: 0;
}
-
-.catlinks {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- margin-top: 1em;
- clear: both;
-}
-/* currently unused, intended to be used by a metadata box
-in the bottom-right corner of the content area */
-.documentDescription {
- /* The summary text describing the document */
- font-weight: bold;
- display: block;
- margin: 1em 0;
- line-height: 1.5em;
-}
-.documentByLine {
- text-align: right;
- font-size: 90%;
- clear: both;
- font-weight: normal;
- color: #76797c;
-}
-
-/* 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,
-.toc,
-.mw-warning {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
-#toc h2,
-.toc h2 {
- display: inline;
- border: none;
- padding: 0;
- font-size: 100%;
- font-weight: bold;
-}
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
- text-align: center;
-}
-#toc ul,
-.toc ul {
- list-style-type: none;
- list-style-image: none;
- margin-left: 0;
+#siteNotice p {
+ margin: 0;
padding: 0;
- text-align: left;
-}
-#toc ul ul,
-.toc ul ul {
- margin: 0 0 0 2em;
-}
-#toc .toctoggle,
-.toc .toctoggle {
- font-size: 94%;
-}
-
-.mw-warning {
- margin-left: 50px;
- margin-right: 50px;
- text-align: center;
-}
-
-/* images */
-/* @noflip */div.floatright, table.floatright {
- margin: 0 0 .5em .5em;
- border: 0;
-/*
- border: .5em solid white;
- border-width: .5em 0 .8em 1.4em;
-*/
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
- margin: 0 .5em .5em 0;
- border: 0;
-/*
- margin: .3em .5em .5em 0;
- border: .5em solid white;
- border-width: .5em 1.4em .8em 0;
-*/
-}
-div.floatleft p { font-style: italic; }
-/* thumbnails */
-div.thumb {
- margin-bottom: .5em;
- width: auto;
-}
-div.thumbinner {
- border: 1px solid #ccc;
- padding: 3px !important;
- background-color: #f9f9f9;
- font-size: 94%;
- text-align: center;
- overflow: hidden;
-}
-html .thumbimage {
- border: 1px solid #ccc;
-}
-html .thumbcaption {
- border: none;
- text-align: left;
- line-height: 1.4em;
- padding: 3px !important;
- font-size: 94%;
-}
-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: .5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
- margin: .5em 1.4em 1.3em 0;
-}
-img.thumbborder {
- border: 1px solid #dddddd;
}
/*
@@ -446,12 +119,6 @@ table.rimage {
margin-bottom: 1em;
text-align: center;
}
-.toccolours {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
/*
** edit views etc
@@ -484,7 +151,7 @@ table.rimage {
background: url(mail_icon.gif) center right no-repeat;
padding-right: 18px;
}
-#bodyContent a.external[href ^="news://"] {
+#bodyContent a.external[href ^="news:"] {
/* @embed */
background: url(news_icon.png) center right no-repeat;
padding-right: 18px;
@@ -510,7 +177,7 @@ table.rimage {
#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
.link-audio {
/* @embed */
- background: url("audio.png") center right no-repeat;
+ background: url(audio.png) center right no-repeat;
padding-right: 13px;
}
#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
@@ -519,7 +186,7 @@ table.rimage {
#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
.link-video {
/* @embed */
- background: url("video.png") center right no-repeat;
+ background: url(video.png) center right no-repeat;
padding-right: 13px;
}
#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
@@ -527,35 +194,20 @@ table.rimage {
#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
.link-document {
/* @embed */
- background: url("document.png") center right no-repeat;
+ background: url(document.png) center right no-repeat;
padding-right: 12px;
}
-
+
/* Interwiki Styling */
#bodyContent a.extiw,
#bodyContent a.extiw:active {
color: #36b;
- /* Don't show icons for interwiki links */
- background: none;
- padding: 0;
-}
-#bodyContent a.extiw:visited {
- color: #636;
-}
-#bodyContent a.extiw:active {
- color: #b63;
}
/* External links */
#bodyContent a.external {
color: #36b;
}
-#bodyContent a.external:visited {
- color: #636; /* bug 3112 */
-}
-#bodyContent a.external:active {
- color: #b63;
-}
/*
** Structural Elements
@@ -839,7 +491,10 @@ li#pt-login {
li#ca-talk {
margin-right: 1.6em;
}
-li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
+li#ca-watch,
+li#ca-unwatch,
+li#ca-varlang-0,
+li#ca-print {
margin-left: 1.6em;
}
#p-cactions .pBody {
@@ -997,8 +652,8 @@ td.htmlform-tip {
margin-top: 2em;
}
-div#userloginForm form,
-div#userlogin form#userlogin2 {
+div#userloginForm,
+div#userlogin {
margin: 0 3em 1em 0;
border: 1px solid #aaa;
clear: both;
@@ -1008,12 +663,12 @@ div#userlogin form#userlogin2 {
}
div#userloginForm table,
-div#userlogin form#userlogin2 table {
+div#userlogin table {
background-color: #f9f9f9;
}
div#userloginForm h2,
-div#userlogin form#userlogin2 h2 {
+div#userlogin h2 {
padding-top: 0;
}
@@ -1052,15 +707,21 @@ div#userloginForm .captcha {
** @import("IEMacFixes.css");
*/
/* tabs: border on the a, not the div */
-* > html #p-cactions li { border: none; }
+* > html #p-cactions li {
+ border: none;
+}
* > html #p-cactions li a {
border: 1px solid #aaa;
border-bottom: none;
}
-* > html #p-cactions li.selected a { border-color: #fabd23; }
+* > html #p-cactions li.selected a {
+ border-color: #fabd23;
+}
/* footer icons need a fixed width */
* > html #f-poweredbyico,
-* > html #f-copyrightico { width: 88px; }
+* > html #f-copyrightico {
+ width: 88px;
+}
* > html #bodyContent,
* > html #bodyContent pre {
overflow-x: auto;
@@ -1070,12 +731,16 @@ div#userloginForm .captcha {
/* more IE fixes */
/* float/negative margin brokenness */
-* html div#footer {margin-top: 0;}
+* html div#footer {
+ margin-top: 0;
+}
* html div#column-content {
display: inline;
margin-bottom: 0;
}
-#pagehistory li.selected { position: relative; }
+#pagehistory li.selected {
+ position: relative;
+}
/* Mac IE 5.0 fix; floated content turns invisible */
* > html div#column-content {
@@ -1131,7 +796,8 @@ span.updatedmarker {
}
/* @bug 1714 */
-input#wpSave, input#wpDiff {
+input#wpSave,
+input#wpDiff {
margin-right: 0.33em;
}
@@ -1148,17 +814,17 @@ div.noarticletext {
}
div#searchTargetContainer {
- left: 10px;
- top: 10px;
- width: 90%;
+ left: 10px;
+ top: 10px;
+ width: 90%;
background: white;
}
div#searchTarget {
- padding: 3px;
- margin: 5px;
+ padding: 3px;
+ margin: 5px;
background: #F0F0F0;
- border: solid 1px blue;
+ border: solid 1px blue;
}
div#searchTarget ul li {
@@ -1171,10 +837,10 @@ div#searchTarget ul li:before {
}
div#searchTargetHide {
- float:right;
- border:solid 1px black;
- background:#DCDCDC;
- padding:2px;
+ float: right;
+ border: solid 1px black;
+ background: #DCDCDC;
+ padding: 2px;
}
#powersearch p {
@@ -1202,7 +868,9 @@ table.multipageimage td {
text-align: center;
}
-.templatesUsed { margin-top: 1.5em; }
+.templatesUsed {
+ margin-top: 1.5em;
+}
.mw-summary-preview {
margin: 0.1em 0;
diff --git a/skins/nostalgia/screen.css b/skins/nostalgia/screen.css
index 1cac7a73..d6183623 100644
--- a/skins/nostalgia/screen.css
+++ b/skins/nostalgia/screen.css
@@ -1,5 +1,5 @@
body {
- /* Background color is set separately on page type */
+ /* background color is set separately on page type */
color: black;
}
@@ -14,7 +14,8 @@ body {
padding: 2px;
}
-a.interwiki, a.external {
+a.interwiki,
+a.external {
color: #3366BB;
}
diff --git a/skins/simple/main.css b/skins/simple/main.css
index b4b24d23..3e086586 100644
--- a/skins/simple/main.css
+++ b/skins/simple/main.css
@@ -1,12 +1,26 @@
-/* For clarity, explicitly state some recommendations from <http://www.w3.org/
- TR/CSS21/sample.html> to make sure the editsection links scale right */
+/**
+ * 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 }
+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 */
@@ -14,296 +28,321 @@ h1, h2, h3, h4, h5, h6 { font-weight: bolder }
.editsection {
font-weight: normal;
}
-h1 .editsection { font-size: 50% }
-h2 .editsection { font-size: 66.7% }
-h3 .editsection { font-size: 85.5% }
-h5 .editsection { font-size: 120% }
-h6 .editsection { font-size: 133% }
-
+h1 .editsection {
+ font-size: 50%;
+}
+h2 .editsection {
+ font-size: 66.7%;
+}
+h3 .editsection {
+ font-size: 85.5%;
+}
+h5 .editsection {
+ font-size: 120%;
+}
+h6 .editsection {
+ font-size: 133%;
+}
#toolbar {
- display: none;
+ display: none;
}
div.center {
- text-align: center;
+ text-align: center;
}
#contentSub {
- padding-left: 2em;
+ padding-left: 2em;
}
a {
- text-decoration: none;
+ text-decoration: none;
}
a:hover {
- text-decoration: underline;
+ text-decoration: underline;
}
#column-content {
- width: 100%;
- float: right;
- margin: 0 0 0.6em -12.2em;
- padding:0;
+ 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;
+ 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: 0px; left: 0px;
-}
-
-#footer {
- display: none;
+ position: absolute;
+ top: 0;
+ left: 0;
}
body {
- margin: 0;
- padding: 0;
+ margin: 0;
+ padding: 0;
}
#globalWrapper {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+}
+.visualClear {
+ clear: both;
}
-.visualClear { clear: both; }
img {
- border: none;
+ border: none;
}
p {
- margin: 0.4em 0em 0.5em 0em;
- line-height: 1.5em;
+ margin: 0.4em 0em 0.5em 0em;
+ line-height: 1.5em;
+}
+p img {
+ margin: 0;
}
-p img { margin: 0; }
h1, h2, h3, h4, h5, h6 {
- margin: 0;
- padding-top: 0.5em;
- padding-bottom: 0.17em;
+ margin: 0;
+ padding-top: 0.5em;
+ padding-bottom: 0.17em;
}
fieldset {
- margin: 1em 0em 1em 0em;
- padding: 0em 1em 1em 1em;
+ 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;
+ 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;
+ color: red;
+ font-size: larger;
}
table.rimage {
- float:right;
- position:relative;
- margin-left:1em;
- margin-bottom:1em;
- text-align:center;
+ 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;
+ border: none;
+ float: none;
+ padding: 0;
+ width: 11.8em;
+ overflow: hidden;
}
.portlet h4 {
- font-weight: normal;
- white-space: nowrap;
+ font-weight: normal;
+ white-space: nowrap;
}
.portlet h5 {
- padding: 0em 1em 0em 0.5em;
- display: inline;
- height: 1em;
- font-weight: normal;
- white-space: nowrap;
+ 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;
+ 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;
+ 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;
+ margin: 0;
+ padding: 0;
+ font-size: small;
}
#p-search .pBody {
- text-align: center;
+ text-align: center;
}
#searchInput {
- width: 100%;
- clear: both;
- margin: 0 0 0 0;
+ width: 100%;
+ clear: both;
+ margin: 0 0 0 0;
}
input.searchButton {
- margin-top:1px;
- padding: 0 0.4em;
- cursor: pointer;
+ margin-top: 1px;
+ padding: 0 0.4em;
+ cursor: pointer;
}
#p-search .pBody {
- padding: 0.5em 0.4em 0.4em 0.4em;
+ padding: 0.5em 0.4em 0.4em 0.4em;
}
/* feed links */
a.feedlink {
- background: url("../common/images/feed-icon.png") center left no-repeat;
+ background: url(../common/images/feed-icon.png) center left no-repeat;
padding-left: 16px;
}
textarea {
- width: 100%;
+ width: 100%;
}
-.pBody li, .pBody ul {
+.pBody li,
+.pBody ul {
padding-left: 0em;
margin-left: 0.5em;
}
pre {
- margin: 2em;
- border: solid 1px black;
+ margin: 2em;
+ border: solid 1px black;
}
-h1.firstHeading, h2 {
- border-bottom: 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;
+ 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;
+ 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;
+ 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 ^="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;
+ 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;
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
}
#bodyContent a.extiw,
#bodyContent a.extiw:active {
- color: #5E7CFF;
+ color: #5E7CFF;
}
td.diff-addedline {
- background-color: #B9FFB0;
+ background-color: #B9FFB0;
}
td.diff-deletedline {
- background-color: #f8ffaa;
+ background-color: #f8ffaa;
}
-.diffchange { background-color: #FFCDF3; text-decoration: none; }
+.diffchange {
+ background-color: #FFCDF3;
+ text-decoration: none;
+}
-#pagehistory li { border: none; }
+#pagehistory li {
+ border: none;
+}
div.tocindent {
- margin-left: 2em;
+ margin-left: 2em;
}
#toc {
- text-align: left;
- border-top: solid 1px black;
- border-bottom: solid 1px black;
+ 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;
+ margin: 0;
+ border-width: 0.5em 0 0.8em 1.4em;
+}
+div.floatright p {
+ font-style: italic;
}
-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;
+ margin: 0.3em 0.5em 0.5em 0;
+ border-width: 0.5em 1.4em 0.8em 0;
}
-div.floatleft p { font-style: italic; }
+div.floatleft p {
+ font-style: italic;
+}
+
/* thumbnails */
div.thumb {
- margin-bottom: 0.5em;
- width: auto;
+ margin-bottom: 0.5em;
+ width: auto;
}
div.thumbinner {
- padding: 3px !important;
- text-align: center;
- overflow: hidden;
+ 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;
+ 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;
+ float: right;
+ border: none !important;
+ background: none !important;
}
-div.magnify a, div.magnify img {
- display: block;
- 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;
+ 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;
+ margin-right: 0.5em;
+ border-width: 0.5em 1.4em 0.8em 0;
}
img.thumbborder {
border: 1px solid #dddddd;
}
-a.stub { color: #772233; }
+a.stub {
+ color: #772233;
+}
a.new,
#p-personal a.new {
text-decoration: line-through;
@@ -319,47 +358,51 @@ li.new {
text-align: center;
}
.catlinks {
- text-align: center;
- width: 80%;
- margin-left: auto;
- margin-right: auto;
- padding: 3px;
+ text-align: center;
+ width: 80%;
+ margin-left: auto;
+ margin-right: auto;
+ padding: 3px;
}
#mytabs {
- background-color: inherit;
+ background-color: inherit;
}
#p-cactions {
- background-color: inherit;
+ background-color: inherit;
}
div.printfooter {
- display: none;
+ display: none;
+}
+
+#footer {
+ padding-left: 11.8em;
}
#n-portal,
#n-currentevents,
#n-help,
#n-sitesupport {
- display: none;
+ display: none;
}
#preftoc {
- float: left;
- margin: 1em;
- width: 13em;
+ float: left;
+ margin: 1em;
+ width: 13em;
}
#preftoc li {
}
#preftoc li.selected {
- border: 1px dashed #aaa;
+ border: 1px dashed #aaa;
}
#preftoc a,
#preftoc a:active {
- display: block;
+ display: block;
}
div.htmlform-tip {
- font-size: 95%;
- margin-top: 1em;
+ font-size: 95%;
+ margin-top: 1em;
}
#mw_trackbacks {
@@ -367,12 +410,14 @@ div.htmlform-tip {
}
#jump-to-nav {
- display: none;
+ display: none;
}
table.collapsed tr.collapsable {
display: none;
}
-.templatesUsed { margin-top: 1.5em; }
+.templatesUsed {
+ margin-top: 1.5em;
+}
diff --git a/skins/vector/images/arrow-down-focus-icon.png b/skins/vector/images/arrow-down-focus-icon.png
new file mode 100644
index 00000000..e20dc4b6
--- /dev/null
+++ b/skins/vector/images/arrow-down-focus-icon.png
Binary files differ
diff --git a/skins/vector/images/arrow-down-icon.png b/skins/vector/images/arrow-down-icon.png
index 90c907bf..437b9518 100644
--- a/skins/vector/images/arrow-down-icon.png
+++ b/skins/vector/images/arrow-down-icon.png
Binary files differ
diff --git a/skins/vector/screen.css b/skins/vector/screen.css
index a7428473..ded0a005 100644
--- a/skins/vector/screen.css
+++ b/skins/vector/screen.css
@@ -2,7 +2,7 @@
* 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.
- *
+ *
* This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
* browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
* a rule that makes things work in IE6, and then following it with a rule that begins with
@@ -211,7 +211,7 @@ div#mw-head h5 {
float: left;
/* @embed */
background-image: url(images/arrow-down-icon.png);
- background-position: 0px 60%;
+ background-position: 100% 60%;
background-repeat: no-repeat;
cursor: pointer;
}
@@ -293,7 +293,8 @@ div#mw-head h5 {
margin-left: 23px;
}
/* Enable forcing showing of the menu for accessibility */
- div.vectorMenu:hover div.menu, div.vectorMenu div.menuForceShow {
+ div.vectorMenu:hover div.menu,
+ div.vectorMenu div.menuForceShow {
display: block;
}
div.vectorMenu ul {
@@ -395,7 +396,7 @@ div#mw-head h5 {
div#simpleSearch input.placeholder {
color: #999999;
}
- div#simpleSearch input::-webkit-input-placeholder {
+ div#simpleSearch input::-webkit-input-placeholder {
color: #999999;
}
div#simpleSearch input#searchInput {
@@ -561,7 +562,7 @@ div#footer #footer-places li {
}
/*
- *
+ *
* The following code is highly modified from monobook. It would be nice if the
* preftoc id was more human readable like preferences-toc for instance,
* howerver this would require backporting the other skins.
@@ -663,26 +664,8 @@ div#footer #footer-places li {
margin-right: 0.25em;
}
-/*
- * Styles for the user login and create account forms
- */
-#userlogin, #userloginForm {
- border: solid 1px #cccccc;
- padding: 1.2em;
- margin: .5em;
- float: left;
-}
-
-#userlogin {
- min-width: 20em;
- max-width: 90%;
- width: 40em;
-}
-
-/*
- *
+/**
* The following code is slightly modified from monobook
- *
*/
div#content {
line-height: 1.5em;
@@ -690,349 +673,29 @@ div#content {
#bodyContent {
font-size: 0.8em;
}
-/* Links */
-a {
- text-decoration: none;
- color: #0645ad;
- background: none;
-}
-a:visited {
- color: #0b0080;
-}
-a:active {
- color: #faa700;
-}
-a:hover, a:focus {
- text-decoration: underline;
-}
-a.stub {
- color: #772233;
-}
-a.new, #p-personal a.new {
- color: #ba0000;
-}
-a.new:visited, #p-personal a.new:visited {
- color: #a55858;
-}
-/* Inline Elements */
-img {
- border: none;
- vertical-align: middle;
-}
-hr {
- height: 1px;
- color: #aaa;
- background-color: #aaa;
- border: 0;
- margin: .2em 0 .2em 0;
+.editsection {
+ float: right;
}
-/* Structural Elements */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- color: black;
- background: none;
- font-weight: normal;
- margin: 0;
- overflow: hidden;
- padding-top: .5em;
- padding-bottom: .17em;
- border-bottom: 1px solid #aaa;
- width: auto;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 67%; }
-h3,
-h4,
-h5,
-h6 {
- border-bottom: none;
- font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 76%; font-weight: normal; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86%; font-weight: normal; }
-h5 { font-size: 100%; }
-h5 .editsection { font-weight: normal; }
-h6 { font-size: 80%; }
-h6 .editsection { font-size: 125%; font-weight: normal; }
-.editsection { float: right; }
-p {
- margin: .4em 0 .5em 0;
- line-height: 1.5em;
-}
-p img {
- margin: 0;
-}
-q {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}
-/* Disabled for now
-blockquote {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}*/
-pre, code, tt, kbd, samp {
- /*
- * It's important for this rule to first reference an actual font name, some browsers will render the monospace text
- * too small otherwise, namely Firefox, Chrome and Safari
- */
- font-family: monospace, "Courier New";
-}
-code {
- background-color: #f9f9f9;
-}
-pre {
- padding: 1em;
- border: 1px dashed #2f6fab;
- color: black;
- background-color: #f9f9f9;
- line-height: 1.3em;
-}
ul {
- line-height: 1.5em;
- list-style-type: square;
- margin: .3em 0 0 1.5em;
- padding: 0;
/* @embed */
list-style-image: url(images/bullet-icon.png);
}
-ol {
- line-height: 1.5em;
- margin: .3em 0 0 3.2em;
- padding: 0;
- list-style-image: none;
-}
-li {
- margin-bottom: .1em;
-}
-dt {
- font-weight: bold;
- margin-bottom: .1em;
-}
-dl {
- margin-top: .2em;
- margin-bottom: .5em;
-}
-dd {
- line-height: 1.5em;
- margin-left: 2em;
- margin-bottom: .1em;
-}
-/* Tables */
-table {
- font-size: 100%;
-}
-/* Forms */
-fieldset {
- border: 1px solid #2f6fab;
- margin: 1em 0 1em 0;
- padding: 0 1em 1em;
- line-height: 1.5em;
-}
- fieldset.nested {
- margin: 0 0 0.5em 0;
- padding: 0 0.5em 0.5em;
- }
-legend {
- padding: .5em;
- font-size: 95%;
-}
-form {
- border: none;
- margin: 0;
-}
-textarea {
- width: 100%;
- padding: .1em;
-}
-select {
- vertical-align: top;
-}
-/* Table of Contents */
-#toc,
-.toc,
-.mw-warning {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
-#toc h2,
-.toc h2 {
- display: inline;
- border: none;
- padding: 0;
- font-size: 100%;
- font-weight: bold;
-}
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
- text-align: center;
-}
-#toc ul,
-.toc ul {
- list-style-type: none;
- list-style-image: none;
- margin-left: 0;
- padding: 0;
- text-align: left;
-}
-#toc ul ul,
-.toc ul ul {
- margin: 0 0 0 2em;
-}
-#toc .toctoggle,
-.toc .toctoggle {
- font-size: 94%;
-}
-/* Images */
-/* @noflip */div.floatright, table.floatright {
- margin: 0 0 .5em .5em;
- border: 0;
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
- margin: 0 .5em .5em 0;
- border: 0;
-}
-div.floatleft p { font-style: italic; }
-/* Thumbnails */
-div.thumb {
- margin-bottom: .5em;
- width: auto;
- background-color: transparent;
-}
-div.thumbinner {
- border: 1px solid #ccc;
- padding: 3px !important;
- background-color: #f9f9f9;
- font-size: 94%;
- text-align: center;
- overflow: hidden;
-}
-html .thumbimage {
- border: 1px solid #ccc;
-}
-html .thumbcaption {
- border: none;
- text-align: left;
- line-height: 1.4em;
- padding: 3px !important;
- font-size: 94%;
-}
-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: .5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
- margin: .5em 1.4em 1.3em 0;
-}
-img.thumbborder {
- border: 1px solid #dddddd;
-}
-/* Warning */
-.mw-warning {
- margin-left: 50px;
- margin-right: 50px;
- text-align: center;
-}
-/* User Message */
-.usermessage {
- background-color: #ffce7b;
- border: 1px solid #ffa500;
- color: black;
- font-weight: bold;
- margin: 2em 0 1em;
- padding: .5em 1em;
- vertical-align: middle;
+
+pre {
+ line-height: 1.3em;
}
+
/* Site Notice (includes notices from CentralNotice extension) */
#siteNotice {
- position: relative;
- text-align: center;
font-size: 0.8em;
- margin: 0;
-}
-#localNotice {
- margin-bottom: 0.9em;
-}
-/* Categories */
-.catlinks {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- margin-top: 1em;
- clear: both;
-}
-/* Sub-navigation */
-#siteSub {
- display: none;
-}
-#jump-to-nav {
- display: none;
-}
-#contentSub, #contentSub2 {
- font-size: 84%;
- line-height: 1.2em;
- margin: 0 0 1.4em 1em;
- color: #7d7d7d;
- width: auto;
-}
-span.subpages {
- display: block;
-}
-/* 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%;
-}
-/* Edge Cases for Content */
-h1, h2 {
- margin-bottom: .6em;
-}
-h3, h4, h5 {
- margin-bottom: .3em;
}
#firstHeading {
padding-top: 0;
margin-top: 0;
padding-top: 0;
- margin-bottom: 0.1em;
- line-height: 1.2em;
font-size: 1.6em;
- padding-bottom: 0;
}
div#content a.external,
div#content a.external[href ^="gopher://"] {
@@ -1052,7 +715,7 @@ div#content a.external[href ^="mailto:"],
background: url(images/mail-icon.png) center right no-repeat;
padding-right: 13px;
}
-div#content a.external[href ^="news://"] {
+div#content a.external[href ^="news:"] {
/* @embed */
background: url(images/news-icon.png) center right no-repeat;
padding-right: 13px;
@@ -1078,7 +741,7 @@ 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?2") center right no-repeat;
+ 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"],
@@ -1087,7 +750,7 @@ 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?2") center right no-repeat;
+ 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"],
@@ -1095,37 +758,10 @@ 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?2") center right no-repeat;
+ background: url(images/document-icon.png) center right no-repeat;
padding-right: 13px;
}
-/* Interwiki Styling */
-div#content a.extiw,
-div#content a.extiw:active {
- color: #36b;
- /* Don't show icons for interwiki links */
- background: none;
- padding: 0;
-}
-div#content a.extiw:visited {
- color: #636;
-}
-div#content a.extiw:active {
- color: #b63;
-}
-
-/* External links */
-div#content a.external {
- color: #36b;
-}
-div#content a.external:visited {
- color: #636; /* bug 3112 */
-}
-div#content a.external:active {
- color: #b63;
-}
-
-
div#content .printfooter {
display: none;
}
@@ -1147,12 +783,6 @@ div#content .printfooter {
vertical-align: text-bottom;
}
-.toccolours {
- border: 1px solid #aaa;
- background-color: #f9f9f9;
- padding: 5px;
- font-size: 95%;
-}
#bodyContent {
position: relative;
width: 100%;
diff --git a/skins/vector/vector.js b/skins/vector/vector.js
index 757f7c8c..cc76b328 100644
--- a/skins/vector/vector.js
+++ b/skins/vector/vector.js
@@ -2,18 +2,20 @@
* Vector-specific scripts
*/
jQuery( function( $ ) {
- var $pCactions = $( '#p-cactions' );
- $pCactions.find( 'h5 a' )
- // For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
- .click( function( e ) {
- $pCactions.find( '.menu' ).toggleClass( 'menuForceShow' );
- e.preventDefault();
- })
- // When the hidden link has focus, also set a class that will change the arrow icon
- .focus( function() {
- $pCactions.addClass( 'vectorMenuFocus' );
- })
- .blur( function() {
- $pCactions.removeClass( 'vectorMenuFocus' );
- });
+ $( 'div.vectorMenu' ).each( function() {
+ var self = this;
+ $( 'h5:first a:first', this )
+ // For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
+ .click( function( e ) {
+ $( '.menu:first', self ).toggleClass( 'menuForceShow' );
+ e.preventDefault();
+ })
+ // When the hidden link has focus, also set a class that will change the arrow icon
+ .focus( function() {
+ $( self ).addClass( 'vectorMenuFocus' );
+ })
+ .blur( function() {
+ $( self ).removeClass( 'vectorMenuFocus' );
+ });
+ });
});
diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php
index cccf7bf2..41bddfcd 100644
--- a/tests/TestsAutoLoader.php
+++ b/tests/TestsAutoLoader.php
@@ -21,9 +21,6 @@ $wgAutoloadClasses += array(
'RandomImageGenerator' => "$testFolder/phpunit/includes/api/RandomImageGenerator.php",
'UserWrapper' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
- //Parser
- 'ParserTestFileIterator' => "$testFolder/phpunit/includes/parser/NewParserHelpers.php",
-
//Selenium
'SeleniumTestConstants' => "$testFolder/selenium/SeleniumTestConstants.php",
diff --git a/tests/jasmine/.htaccess b/tests/jasmine/.htaccess
new file mode 100644
index 00000000..605d2f4c
--- /dev/null
+++ b/tests/jasmine/.htaccess
@@ -0,0 +1 @@
+Allow from all
diff --git a/tests/jasmine/SpecRunner.html b/tests/jasmine/SpecRunner.html
new file mode 100644
index 00000000..6af9b0c3
--- /dev/null
+++ b/tests/jasmine/SpecRunner.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>Jasmine Test Runner</title>
+ <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
+ <script type="text/javascript" src="lib/jasmine-1.0.1/jasmine.js"></script>
+ <script type="text/javascript" src="lib/jasmine-1.0.1/jasmine-html.js"></script>
+
+ <!-- include source files here... -->
+ <script type="text/javascript" src="../../load.php?debug=true&lang=en&modules=jquery%7Cmediawiki&only=scripts&skin=vector"></script>
+
+ <script type="text/javascript" src="../../resources/mediawiki/mediawiki.js"></script>
+
+ <script type="text/javascript" src="../../resources/mediawiki.language/mediawiki.language.js"></script>
+ <script type="text/javascript" src="../../resources/mediawiki/mediawiki.jqueryMsg.js"></script>
+ <script type="text/javascript" src="../../resources/mediawiki/mediawiki.Uri.js"></script>
+<!--
+ <script type="text/javascript" src="../../resources/mediawiki/mediawiki.api.js"></script>
+ <script type="text/javascript" src="../../resources/mediawiki/mediawiki.api.edit.js"></script>
+-->
+
+ <!-- insert test data files here -->
+ <script type="text/javascript" src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
+
+ <!-- include spec files here... -->
+ <script type="text/javascript" src="spec/mediawiki.Uri.spec.js"></script>
+ <!--
+ <script type="text/javascript" src="spec/mw.Api.spec.js"></script>
+ <script type="text/javascript" src="spec/mw.Api.edit.spec.js"></script>
+ -->
+ <script type="text/javascript" src="spec/mediawiki.jqueryMsg.spec.js"></script>
+
+</head>
+<body>
+<script type="text/javascript">
+ jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
+ jasmine.getEnv().execute();
+</script>
+
+</body>
+</html>
diff --git a/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE b/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
new file mode 100644
index 00000000..1eb9b49e
--- /dev/null
+++ b/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2010 Pivotal Labs
+
+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/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
new file mode 100644
index 00000000..81402b9c
--- /dev/null
+++ b/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
@@ -0,0 +1,188 @@
+jasmine.TrivialReporter = function(doc) {
+ this.document = doc || document;
+ this.suiteDivs = {};
+ this.logRunningSpecs = false;
+};
+
+jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
+ var el = document.createElement(type);
+
+ for (var i = 2; i < arguments.length; i++) {
+ var child = arguments[i];
+
+ if (typeof child === 'string') {
+ el.appendChild(document.createTextNode(child));
+ } else {
+ if (child) { el.appendChild(child); }
+ }
+ }
+
+ for (var attr in attrs) {
+ if (attr == "className") {
+ el[attr] = attrs[attr];
+ } else {
+ el.setAttribute(attr, attrs[attr]);
+ }
+ }
+
+ return el;
+};
+
+jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
+ var showPassed, showSkipped;
+
+ this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
+ this.createDom('div', { className: 'banner' },
+ this.createDom('div', { className: 'logo' },
+ this.createDom('a', { href: 'http://pivotal.github.com/jasmine/', target: "_blank" }, "Jasmine"),
+ this.createDom('span', { className: 'version' }, runner.env.versionString())),
+ this.createDom('div', { className: 'options' },
+ "Show ",
+ showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
+ showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
+ )
+ ),
+
+ this.runnerDiv = this.createDom('div', { className: 'runner running' },
+ this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
+ this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
+ this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
+ );
+
+ this.document.body.appendChild(this.outerDiv);
+
+ var suites = runner.suites();
+ for (var i = 0; i < suites.length; i++) {
+ var suite = suites[i];
+ var suiteDiv = this.createDom('div', { className: 'suite' },
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
+ this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
+ this.suiteDivs[suite.id] = suiteDiv;
+ var parentDiv = this.outerDiv;
+ if (suite.parentSuite) {
+ parentDiv = this.suiteDivs[suite.parentSuite.id];
+ }
+ parentDiv.appendChild(suiteDiv);
+ }
+
+ this.startedAt = new Date();
+
+ var self = this;
+ showPassed.onclick = function(evt) {
+ if (showPassed.checked) {
+ self.outerDiv.className += ' show-passed';
+ } else {
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
+ }
+ };
+
+ showSkipped.onclick = function(evt) {
+ if (showSkipped.checked) {
+ self.outerDiv.className += ' show-skipped';
+ } else {
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
+ }
+ };
+};
+
+jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
+ var results = runner.results();
+ var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
+ this.runnerDiv.setAttribute("class", className);
+ //do it twice for IE
+ this.runnerDiv.setAttribute("className", className);
+ var specs = runner.specs();
+ var specCount = 0;
+ for (var i = 0; i < specs.length; i++) {
+ if (this.specFilter(specs[i])) {
+ specCount++;
+ }
+ }
+ var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
+ message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
+ this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
+
+ this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
+};
+
+jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
+ var results = suite.results();
+ var status = results.passed() ? 'passed' : 'failed';
+ if (results.totalCount == 0) { // todo: change this to check results.skipped
+ status = 'skipped';
+ }
+ this.suiteDivs[suite.id].className += " " + status;
+};
+
+jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
+ if (this.logRunningSpecs) {
+ this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
+ }
+};
+
+jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
+ var results = spec.results();
+ var status = results.passed() ? 'passed' : 'failed';
+ if (results.skipped) {
+ status = 'skipped';
+ }
+ var specDiv = this.createDom('div', { className: 'spec ' + status },
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
+ this.createDom('a', {
+ className: 'description',
+ href: '?spec=' + encodeURIComponent(spec.getFullName()),
+ title: spec.getFullName()
+ }, spec.description));
+
+
+ var resultItems = results.getItems();
+ var messagesDiv = this.createDom('div', { className: 'messages' });
+ for (var i = 0; i < resultItems.length; i++) {
+ var result = resultItems[i];
+
+ if (result.type == 'log') {
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
+ } else if (result.type == 'expect' && result.passed && !result.passed()) {
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
+
+ if (result.trace.stack) {
+ messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
+ }
+ }
+ }
+
+ if (messagesDiv.childNodes.length > 0) {
+ specDiv.appendChild(messagesDiv);
+ }
+
+ this.suiteDivs[spec.suite.id].appendChild(specDiv);
+};
+
+jasmine.TrivialReporter.prototype.log = function() {
+ var console = jasmine.getGlobal().console;
+ if (console && console.log) {
+ if (console.log.apply) {
+ console.log.apply(console, arguments);
+ } else {
+ console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
+ }
+ }
+};
+
+jasmine.TrivialReporter.prototype.getLocation = function() {
+ return this.document.location;
+};
+
+jasmine.TrivialReporter.prototype.specFilter = function(spec) {
+ var paramMap = {};
+ var params = this.getLocation().search.substring(1).split('&');
+ for (var i = 0; i < params.length; i++) {
+ var p = params[i].split('=');
+ paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
+ }
+
+ if (!paramMap["spec"]) return true;
+ return spec.getFullName().indexOf(paramMap["spec"]) == 0;
+};
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.css b/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
new file mode 100644
index 00000000..6583fe7c
--- /dev/null
+++ b/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
@@ -0,0 +1,166 @@
+body {
+ font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
+}
+
+
+.jasmine_reporter a:visited, .jasmine_reporter a {
+ color: #303;
+}
+
+.jasmine_reporter a:hover, .jasmine_reporter a:active {
+ color: blue;
+}
+
+.run_spec {
+ float:right;
+ padding-right: 5px;
+ font-size: .8em;
+ text-decoration: none;
+}
+
+.jasmine_reporter {
+ margin: 0 5px;
+}
+
+.banner {
+ color: #303;
+ background-color: #fef;
+ padding: 5px;
+}
+
+.logo {
+ float: left;
+ font-size: 1.1em;
+ padding-left: 5px;
+}
+
+.logo .version {
+ font-size: .6em;
+ padding-left: 1em;
+}
+
+.runner.running {
+ background-color: yellow;
+}
+
+
+.options {
+ text-align: right;
+ font-size: .8em;
+}
+
+
+
+
+.suite {
+ border: 1px outset gray;
+ margin: 5px 0;
+ padding-left: 1em;
+}
+
+.suite .suite {
+ margin: 5px;
+}
+
+.suite.passed {
+ background-color: #dfd;
+}
+
+.suite.failed {
+ background-color: #fdd;
+}
+
+.spec {
+ margin: 5px;
+ padding-left: 1em;
+ clear: both;
+}
+
+.spec.failed, .spec.passed, .spec.skipped {
+ padding-bottom: 5px;
+ border: 1px solid gray;
+}
+
+.spec.failed {
+ background-color: #fbb;
+ border-color: red;
+}
+
+.spec.passed {
+ background-color: #bfb;
+ border-color: green;
+}
+
+.spec.skipped {
+ background-color: #bbb;
+}
+
+.messages {
+ border-left: 1px dashed gray;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+
+.passed {
+ background-color: #cfc;
+ display: none;
+}
+
+.failed {
+ background-color: #fbb;
+}
+
+.skipped {
+ color: #777;
+ background-color: #eee;
+ display: none;
+}
+
+
+/*.resultMessage {*/
+ /*white-space: pre;*/
+/*}*/
+
+.resultMessage span.result {
+ display: block;
+ line-height: 2em;
+ color: black;
+}
+
+.resultMessage .mismatch {
+ color: black;
+}
+
+.stackTrace {
+ white-space: pre;
+ font-size: .8em;
+ margin-left: 10px;
+ max-height: 5em;
+ overflow: auto;
+ border: 1px inset red;
+ padding: 1em;
+ background: #eef;
+}
+
+.finished-at {
+ padding-left: 1em;
+ font-size: .6em;
+}
+
+.show-passed .passed,
+.show-skipped .skipped {
+ display: block;
+}
+
+
+#jasmine_content {
+ position:fixed;
+ right: 100%;
+}
+
+.runner {
+ border: 1px solid gray;
+ display: block;
+ margin: 5px 0;
+ padding: 2px 0 2px 10px;
+}
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
new file mode 100644
index 00000000..964f99ed
--- /dev/null
+++ b/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
@@ -0,0 +1,2421 @@
+/**
+ * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
+ *
+ * @namespace
+ */
+var jasmine = {};
+
+/**
+ * @private
+ */
+jasmine.unimplementedMethod_ = function() {
+ throw new Error("unimplemented method");
+};
+
+/**
+ * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just
+ * a plain old variable and may be redefined by somebody else.
+ *
+ * @private
+ */
+jasmine.undefined = jasmine.___undefined___;
+
+/**
+ * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
+ *
+ */
+jasmine.DEFAULT_UPDATE_INTERVAL = 250;
+
+/**
+ * Default timeout interval in milliseconds for waitsFor() blocks.
+ */
+jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
+
+jasmine.getGlobal = function() {
+ function getGlobal() {
+ return this;
+ }
+
+ return getGlobal();
+};
+
+/**
+ * Allows for bound functions to be compared. Internal use only.
+ *
+ * @ignore
+ * @private
+ * @param base {Object} bound 'this' for the function
+ * @param name {Function} function to find
+ */
+jasmine.bindOriginal_ = function(base, name) {
+ var original = base[name];
+ if (original.apply) {
+ return function() {
+ return original.apply(base, arguments);
+ };
+ } else {
+ // IE support
+ return jasmine.getGlobal()[name];
+ }
+};
+
+jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
+jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
+jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
+jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
+
+jasmine.MessageResult = function(values) {
+ this.type = 'log';
+ this.values = values;
+ this.trace = new Error(); // todo: test better
+};
+
+jasmine.MessageResult.prototype.toString = function() {
+ var text = "";
+ for(var i = 0; i < this.values.length; i++) {
+ if (i > 0) text += " ";
+ if (jasmine.isString_(this.values[i])) {
+ text += this.values[i];
+ } else {
+ text += jasmine.pp(this.values[i]);
+ }
+ }
+ return text;
+};
+
+jasmine.ExpectationResult = function(params) {
+ this.type = 'expect';
+ this.matcherName = params.matcherName;
+ this.passed_ = params.passed;
+ this.expected = params.expected;
+ this.actual = params.actual;
+
+ this.message = this.passed_ ? 'Passed.' : params.message;
+ this.trace = this.passed_ ? '' : new Error(this.message);
+};
+
+jasmine.ExpectationResult.prototype.toString = function () {
+ return this.message;
+};
+
+jasmine.ExpectationResult.prototype.passed = function () {
+ return this.passed_;
+};
+
+/**
+ * Getter for the Jasmine environment. Ensures one gets created
+ */
+jasmine.getEnv = function() {
+ return jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isArray_ = function(value) {
+ return jasmine.isA_("Array", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isString_ = function(value) {
+ return jasmine.isA_("String", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isNumber_ = function(value) {
+ return jasmine.isA_("Number", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param {String} typeName
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isA_ = function(typeName, value) {
+ return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
+};
+
+/**
+ * Pretty printer for expecations. Takes any object and turns it into a human-readable string.
+ *
+ * @param value {Object} an object to be outputted
+ * @returns {String}
+ */
+jasmine.pp = function(value) {
+ var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
+ stringPrettyPrinter.format(value);
+ return stringPrettyPrinter.string;
+};
+
+/**
+ * Returns true if the object is a DOM Node.
+ *
+ * @param {Object} obj object to check
+ * @returns {Boolean}
+ */
+jasmine.isDomNode = function(obj) {
+ return obj['nodeType'] > 0;
+};
+
+/**
+ * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter.
+ *
+ * @example
+ * // don't care about which function is passed in, as long as it's a function
+ * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
+ *
+ * @param {Class} clazz
+ * @returns matchable object of the type clazz
+ */
+jasmine.any = function(clazz) {
+ return new jasmine.Matchers.Any(clazz);
+};
+
+/**
+ * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
+ *
+ * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine
+ * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
+ *
+ * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
+ *
+ * Spies are torn down at the end of every spec.
+ *
+ * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
+ *
+ * @example
+ * // a stub
+ * var myStub = jasmine.createSpy('myStub'); // can be used anywhere
+ *
+ * // spy example
+ * var foo = {
+ * not: function(bool) { return !bool; }
+ * }
+ *
+ * // actual foo.not will not be called, execution stops
+ * spyOn(foo, 'not');
+
+ // foo.not spied upon, execution will continue to implementation
+ * spyOn(foo, 'not').andCallThrough();
+ *
+ * // fake example
+ * var foo = {
+ * not: function(bool) { return !bool; }
+ * }
+ *
+ * // foo.not(val) will return val
+ * spyOn(foo, 'not').andCallFake(function(value) {return value;});
+ *
+ * // mock example
+ * foo.not(7 == 7);
+ * expect(foo.not).toHaveBeenCalled();
+ * expect(foo.not).toHaveBeenCalledWith(true);
+ *
+ * @constructor
+ * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
+ * @param {String} name
+ */
+jasmine.Spy = function(name) {
+ /**
+ * The name of the spy, if provided.
+ */
+ this.identity = name || 'unknown';
+ /**
+ * Is this Object a spy?
+ */
+ this.isSpy = true;
+ /**
+ * The actual function this spy stubs.
+ */
+ this.plan = function() {
+ };
+ /**
+ * Tracking of the most recent call to the spy.
+ * @example
+ * var mySpy = jasmine.createSpy('foo');
+ * mySpy(1, 2);
+ * mySpy.mostRecentCall.args = [1, 2];
+ */
+ this.mostRecentCall = {};
+
+ /**
+ * Holds arguments for each call to the spy, indexed by call count
+ * @example
+ * var mySpy = jasmine.createSpy('foo');
+ * mySpy(1, 2);
+ * mySpy(7, 8);
+ * mySpy.mostRecentCall.args = [7, 8];
+ * mySpy.argsForCall[0] = [1, 2];
+ * mySpy.argsForCall[1] = [7, 8];
+ */
+ this.argsForCall = [];
+ this.calls = [];
+};
+
+/**
+ * Tells a spy to call through to the actual implemenatation.
+ *
+ * @example
+ * var foo = {
+ * bar: function() { // do some stuff }
+ * }
+ *
+ * // defining a spy on an existing property: foo.bar
+ * spyOn(foo, 'bar').andCallThrough();
+ */
+jasmine.Spy.prototype.andCallThrough = function() {
+ this.plan = this.originalValue;
+ return this;
+};
+
+/**
+ * For setting the return value of a spy.
+ *
+ * @example
+ * // defining a spy from scratch: foo() returns 'baz'
+ * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() returns 'baz'
+ * spyOn(foo, 'bar').andReturn('baz');
+ *
+ * @param {Object} value
+ */
+jasmine.Spy.prototype.andReturn = function(value) {
+ this.plan = function() {
+ return value;
+ };
+ return this;
+};
+
+/**
+ * For throwing an exception when a spy is called.
+ *
+ * @example
+ * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
+ * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
+ * spyOn(foo, 'bar').andThrow('baz');
+ *
+ * @param {String} exceptionMsg
+ */
+jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
+ this.plan = function() {
+ throw exceptionMsg;
+ };
+ return this;
+};
+
+/**
+ * Calls an alternate implementation when a spy is called.
+ *
+ * @example
+ * var baz = function() {
+ * // do some stuff, return something
+ * }
+ * // defining a spy from scratch: foo() calls the function baz
+ * var foo = jasmine.createSpy('spy on foo').andCall(baz);
+ *
+ * // defining a spy on an existing property: foo.bar() calls an anonymnous function
+ * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
+ *
+ * @param {Function} fakeFunc
+ */
+jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
+ this.plan = fakeFunc;
+ return this;
+};
+
+/**
+ * Resets all of a spy's the tracking variables so that it can be used again.
+ *
+ * @example
+ * spyOn(foo, 'bar');
+ *
+ * foo.bar();
+ *
+ * expect(foo.bar.callCount).toEqual(1);
+ *
+ * foo.bar.reset();
+ *
+ * expect(foo.bar.callCount).toEqual(0);
+ */
+jasmine.Spy.prototype.reset = function() {
+ this.wasCalled = false;
+ this.callCount = 0;
+ this.argsForCall = [];
+ this.calls = [];
+ this.mostRecentCall = {};
+};
+
+jasmine.createSpy = function(name) {
+
+ var spyObj = function() {
+ spyObj.wasCalled = true;
+ spyObj.callCount++;
+ var args = jasmine.util.argsToArray(arguments);
+ spyObj.mostRecentCall.object = this;
+ spyObj.mostRecentCall.args = args;
+ spyObj.argsForCall.push(args);
+ spyObj.calls.push({object: this, args: args});
+ return spyObj.plan.apply(this, arguments);
+ };
+
+ var spy = new jasmine.Spy(name);
+
+ for (var prop in spy) {
+ spyObj[prop] = spy[prop];
+ }
+
+ spyObj.reset();
+
+ return spyObj;
+};
+
+/**
+ * Determines whether an object is a spy.
+ *
+ * @param {jasmine.Spy|Object} putativeSpy
+ * @returns {Boolean}
+ */
+jasmine.isSpy = function(putativeSpy) {
+ return putativeSpy && putativeSpy.isSpy;
+};
+
+/**
+ * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something
+ * large in one call.
+ *
+ * @param {String} baseName name of spy class
+ * @param {Array} methodNames array of names of methods to make spies
+ */
+jasmine.createSpyObj = function(baseName, methodNames) {
+ if (!jasmine.isArray_(methodNames) || methodNames.length == 0) {
+ throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
+ }
+ var obj = {};
+ for (var i = 0; i < methodNames.length; i++) {
+ obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
+ }
+ return obj;
+};
+
+/**
+ * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
+ *
+ * Be careful not to leave calls to <code>jasmine.log</code> in production code.
+ */
+jasmine.log = function() {
+ var spec = jasmine.getEnv().currentSpec;
+ spec.log.apply(spec, arguments);
+};
+
+/**
+ * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy.
+ *
+ * @example
+ * // spy example
+ * var foo = {
+ * not: function(bool) { return !bool; }
+ * }
+ * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
+ *
+ * @see jasmine.createSpy
+ * @param obj
+ * @param methodName
+ * @returns a Jasmine spy that can be chained with all spy methods
+ */
+var spyOn = function(obj, methodName) {
+ return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
+};
+
+/**
+ * Creates a Jasmine spec that will be added to the current suite.
+ *
+ * // TODO: pending tests
+ *
+ * @example
+ * it('should be true', function() {
+ * expect(true).toEqual(true);
+ * });
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var it = function(desc, func) {
+ return jasmine.getEnv().it(desc, func);
+};
+
+/**
+ * Creates a <em>disabled</em> Jasmine spec.
+ *
+ * A convenience method that allows existing specs to be disabled temporarily during development.
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var xit = function(desc, func) {
+ return jasmine.getEnv().xit(desc, func);
+};
+
+/**
+ * Starts a chain for a Jasmine expectation.
+ *
+ * It is passed an Object that is the actual value and should chain to one of the many
+ * jasmine.Matchers functions.
+ *
+ * @param {Object} actual Actual value to test against and expected value
+ */
+var expect = function(actual) {
+ return jasmine.getEnv().currentSpec.expect(actual);
+};
+
+/**
+ * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
+ *
+ * @param {Function} func Function that defines part of a jasmine spec.
+ */
+var runs = function(func) {
+ jasmine.getEnv().currentSpec.runs(func);
+};
+
+/**
+ * Waits a fixed time period before moving to the next block.
+ *
+ * @deprecated Use waitsFor() instead
+ * @param {Number} timeout milliseconds to wait
+ */
+var waits = function(timeout) {
+ jasmine.getEnv().currentSpec.waits(timeout);
+};
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next block.
+ *
+ * @param {Function} latchFunction
+ * @param {String} optional_timeoutMessage
+ * @param {Number} optional_timeout
+ */
+var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
+ jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
+};
+
+/**
+ * A function that is called before each spec in a suite.
+ *
+ * Used for spec setup, including validating assumptions.
+ *
+ * @param {Function} beforeEachFunction
+ */
+var beforeEach = function(beforeEachFunction) {
+ jasmine.getEnv().beforeEach(beforeEachFunction);
+};
+
+/**
+ * A function that is called after each spec in a suite.
+ *
+ * Used for restoring any state that is hijacked during spec execution.
+ *
+ * @param {Function} afterEachFunction
+ */
+var afterEach = function(afterEachFunction) {
+ jasmine.getEnv().afterEach(afterEachFunction);
+};
+
+/**
+ * Defines a suite of specifications.
+ *
+ * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
+ * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
+ * of setup in some tests.
+ *
+ * @example
+ * // TODO: a simple suite
+ *
+ * // TODO: a simple suite with a nested describe block
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var describe = function(description, specDefinitions) {
+ return jasmine.getEnv().describe(description, specDefinitions);
+};
+
+/**
+ * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var xdescribe = function(description, specDefinitions) {
+ return jasmine.getEnv().xdescribe(description, specDefinitions);
+};
+
+
+// Provide the XMLHttpRequest class for IE 5.x-6.x:
+jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP.6.0");
+ } catch(e) {
+ }
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP.3.0");
+ } catch(e) {
+ }
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP");
+ } catch(e) {
+ }
+ try {
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ } catch(e) {
+ }
+ throw new Error("This browser does not support XMLHttpRequest.");
+} : XMLHttpRequest;
+/**
+ * @namespace
+ */
+jasmine.util = {};
+
+/**
+ * Declare that a child class inherit it's prototype from the parent class.
+ *
+ * @private
+ * @param {Function} childClass
+ * @param {Function} parentClass
+ */
+jasmine.util.inherit = function(childClass, parentClass) {
+ /**
+ * @private
+ */
+ var subclass = function() {
+ };
+ subclass.prototype = parentClass.prototype;
+ childClass.prototype = new subclass;
+};
+
+jasmine.util.formatException = function(e) {
+ var lineNumber;
+ if (e.line) {
+ lineNumber = e.line;
+ }
+ else if (e.lineNumber) {
+ lineNumber = e.lineNumber;
+ }
+
+ var file;
+
+ if (e.sourceURL) {
+ file = e.sourceURL;
+ }
+ else if (e.fileName) {
+ file = e.fileName;
+ }
+
+ var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
+
+ if (file && lineNumber) {
+ message += ' in ' + file + ' (line ' + lineNumber + ')';
+ }
+
+ return message;
+};
+
+jasmine.util.htmlEscape = function(str) {
+ if (!str) return str;
+ return str.replace(/&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;');
+};
+
+jasmine.util.argsToArray = function(args) {
+ var arrayOfArgs = [];
+ for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
+ return arrayOfArgs;
+};
+
+jasmine.util.extend = function(destination, source) {
+ for (var property in source) destination[property] = source[property];
+ return destination;
+};
+
+/**
+ * Environment for Jasmine
+ *
+ * @constructor
+ */
+jasmine.Env = function() {
+ this.currentSpec = null;
+ this.currentSuite = null;
+ this.currentRunner_ = new jasmine.Runner(this);
+
+ this.reporter = new jasmine.MultiReporter();
+
+ this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
+ this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
+ this.lastUpdate = 0;
+ this.specFilter = function() {
+ return true;
+ };
+
+ this.nextSpecId_ = 0;
+ this.nextSuiteId_ = 0;
+ this.equalityTesters_ = [];
+
+ // wrap matchers
+ this.matchersClass = function() {
+ jasmine.Matchers.apply(this, arguments);
+ };
+ jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
+
+ jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
+};
+
+
+jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
+jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
+jasmine.Env.prototype.setInterval = jasmine.setInterval;
+jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
+
+/**
+ * @returns an object containing jasmine version build info, if set.
+ */
+jasmine.Env.prototype.version = function () {
+ if (jasmine.version_) {
+ return jasmine.version_;
+ } else {
+ throw new Error('Version not set');
+ }
+};
+
+/**
+ * @returns string containing jasmine version build info, if set.
+ */
+jasmine.Env.prototype.versionString = function() {
+ if (jasmine.version_) {
+ var version = this.version();
+ return version.major + "." + version.minor + "." + version.build + " revision " + version.revision;
+ } else {
+ return "version unknown";
+ }
+};
+
+/**
+ * @returns a sequential integer starting at 0
+ */
+jasmine.Env.prototype.nextSpecId = function () {
+ return this.nextSpecId_++;
+};
+
+/**
+ * @returns a sequential integer starting at 0
+ */
+jasmine.Env.prototype.nextSuiteId = function () {
+ return this.nextSuiteId_++;
+};
+
+/**
+ * Register a reporter to receive status updates from Jasmine.
+ * @param {jasmine.Reporter} reporter An object which will receive status updates.
+ */
+jasmine.Env.prototype.addReporter = function(reporter) {
+ this.reporter.addReporter(reporter);
+};
+
+jasmine.Env.prototype.execute = function() {
+ this.currentRunner_.execute();
+};
+
+jasmine.Env.prototype.describe = function(description, specDefinitions) {
+ var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
+
+ var parentSuite = this.currentSuite;
+ if (parentSuite) {
+ parentSuite.add(suite);
+ } else {
+ this.currentRunner_.add(suite);
+ }
+
+ this.currentSuite = suite;
+
+ var declarationError = null;
+ try {
+ specDefinitions.call(suite);
+ } catch(e) {
+ declarationError = e;
+ }
+
+ this.currentSuite = parentSuite;
+
+ if (declarationError) {
+ this.it("encountered a declaration exception", function() {
+ throw declarationError;
+ });
+ }
+
+ return suite;
+};
+
+jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
+ if (this.currentSuite) {
+ this.currentSuite.beforeEach(beforeEachFunction);
+ } else {
+ this.currentRunner_.beforeEach(beforeEachFunction);
+ }
+};
+
+jasmine.Env.prototype.currentRunner = function () {
+ return this.currentRunner_;
+};
+
+jasmine.Env.prototype.afterEach = function(afterEachFunction) {
+ if (this.currentSuite) {
+ this.currentSuite.afterEach(afterEachFunction);
+ } else {
+ this.currentRunner_.afterEach(afterEachFunction);
+ }
+
+};
+
+jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
+ return {
+ execute: function() {
+ }
+ };
+};
+
+jasmine.Env.prototype.it = function(description, func) {
+ var spec = new jasmine.Spec(this, this.currentSuite, description);
+ this.currentSuite.add(spec);
+ this.currentSpec = spec;
+
+ if (func) {
+ spec.runs(func);
+ }
+
+ return spec;
+};
+
+jasmine.Env.prototype.xit = function(desc, func) {
+ return {
+ id: this.nextSpecId(),
+ runs: function() {
+ }
+ };
+};
+
+jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
+ if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
+ return true;
+ }
+
+ a.__Jasmine_been_here_before__ = b;
+ b.__Jasmine_been_here_before__ = a;
+
+ var hasKey = function(obj, keyName) {
+ return obj != null && obj[keyName] !== jasmine.undefined;
+ };
+
+ for (var property in b) {
+ if (!hasKey(a, property) && hasKey(b, property)) {
+ mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
+ }
+ }
+ for (property in a) {
+ if (!hasKey(b, property) && hasKey(a, property)) {
+ mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
+ }
+ }
+ for (property in b) {
+ if (property == '__Jasmine_been_here_before__') continue;
+ if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
+ mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
+ }
+ }
+
+ if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
+ mismatchValues.push("arrays were not the same length");
+ }
+
+ delete a.__Jasmine_been_here_before__;
+ delete b.__Jasmine_been_here_before__;
+ return (mismatchKeys.length == 0 && mismatchValues.length == 0);
+};
+
+jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
+ mismatchKeys = mismatchKeys || [];
+ mismatchValues = mismatchValues || [];
+
+ for (var i = 0; i < this.equalityTesters_.length; i++) {
+ var equalityTester = this.equalityTesters_[i];
+ var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
+ if (result !== jasmine.undefined) return result;
+ }
+
+ if (a === b) return true;
+
+ if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
+ return (a == jasmine.undefined && b == jasmine.undefined);
+ }
+
+ if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
+ return a === b;
+ }
+
+ if (a instanceof Date && b instanceof Date) {
+ return a.getTime() == b.getTime();
+ }
+
+ if (a instanceof jasmine.Matchers.Any) {
+ return a.matches(b);
+ }
+
+ if (b instanceof jasmine.Matchers.Any) {
+ return b.matches(a);
+ }
+
+ if (jasmine.isString_(a) && jasmine.isString_(b)) {
+ return (a == b);
+ }
+
+ if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
+ return (a == b);
+ }
+
+ if (typeof a === "object" && typeof b === "object") {
+ return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
+ }
+
+ //Straight check
+ return (a === b);
+};
+
+jasmine.Env.prototype.contains_ = function(haystack, needle) {
+ if (jasmine.isArray_(haystack)) {
+ for (var i = 0; i < haystack.length; i++) {
+ if (this.equals_(haystack[i], needle)) return true;
+ }
+ return false;
+ }
+ return haystack.indexOf(needle) >= 0;
+};
+
+jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
+ this.equalityTesters_.push(equalityTester);
+};
+/** No-op base class for Jasmine reporters.
+ *
+ * @constructor
+ */
+jasmine.Reporter = function() {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSpecResults = function(spec) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.log = function(str) {
+};
+
+/**
+ * Blocks are functions with executable code that make up a spec.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {Function} func
+ * @param {jasmine.Spec} spec
+ */
+jasmine.Block = function(env, func, spec) {
+ this.env = env;
+ this.func = func;
+ this.spec = spec;
+};
+
+jasmine.Block.prototype.execute = function(onComplete) {
+ try {
+ this.func.apply(this.spec);
+ } catch (e) {
+ this.spec.fail(e);
+ }
+ onComplete();
+};
+/** JavaScript API reporter.
+ *
+ * @constructor
+ */
+jasmine.JsApiReporter = function() {
+ this.started = false;
+ this.finished = false;
+ this.suites_ = [];
+ this.results_ = {};
+};
+
+jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
+ this.started = true;
+ var suites = runner.topLevelSuites();
+ for (var i = 0; i < suites.length; i++) {
+ var suite = suites[i];
+ this.suites_.push(this.summarize_(suite));
+ }
+};
+
+jasmine.JsApiReporter.prototype.suites = function() {
+ return this.suites_;
+};
+
+jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
+ var isSuite = suiteOrSpec instanceof jasmine.Suite;
+ var summary = {
+ id: suiteOrSpec.id,
+ name: suiteOrSpec.description,
+ type: isSuite ? 'suite' : 'spec',
+ children: []
+ };
+
+ if (isSuite) {
+ var children = suiteOrSpec.children();
+ for (var i = 0; i < children.length; i++) {
+ summary.children.push(this.summarize_(children[i]));
+ }
+ }
+ return summary;
+};
+
+jasmine.JsApiReporter.prototype.results = function() {
+ return this.results_;
+};
+
+jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
+ return this.results_[specId];
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
+ this.finished = true;
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
+ this.results_[spec.id] = {
+ messages: spec.results().getItems(),
+ result: spec.results().failedCount > 0 ? "failed" : "passed"
+ };
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.log = function(str) {
+};
+
+jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
+ var results = {};
+ for (var i = 0; i < specIds.length; i++) {
+ var specId = specIds[i];
+ results[specId] = this.summarizeResult_(this.results_[specId]);
+ }
+ return results;
+};
+
+jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
+ var summaryMessages = [];
+ var messagesLength = result.messages.length;
+ for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
+ var resultMessage = result.messages[messageIndex];
+ summaryMessages.push({
+ text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
+ passed: resultMessage.passed ? resultMessage.passed() : true,
+ type: resultMessage.type,
+ message: resultMessage.message,
+ trace: {
+ stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
+ }
+ });
+ }
+
+ return {
+ result : result.result,
+ messages : summaryMessages
+ };
+};
+
+/**
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param actual
+ * @param {jasmine.Spec} spec
+ */
+jasmine.Matchers = function(env, actual, spec, opt_isNot) {
+ this.env = env;
+ this.actual = actual;
+ this.spec = spec;
+ this.isNot = opt_isNot || false;
+ this.reportWasCalled_ = false;
+};
+
+// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
+jasmine.Matchers.pp = function(str) {
+ throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
+};
+
+// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
+jasmine.Matchers.prototype.report = function(result, failing_message, details) {
+ throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
+};
+
+jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
+ for (var methodName in prototype) {
+ if (methodName == 'report') continue;
+ var orig = prototype[methodName];
+ matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
+ }
+};
+
+jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
+ return function() {
+ var matcherArgs = jasmine.util.argsToArray(arguments);
+ var result = matcherFunction.apply(this, arguments);
+
+ if (this.isNot) {
+ result = !result;
+ }
+
+ if (this.reportWasCalled_) return result;
+
+ var message;
+ if (!result) {
+ if (this.message) {
+ message = this.message.apply(this, arguments);
+ if (jasmine.isArray_(message)) {
+ message = message[this.isNot ? 1 : 0];
+ }
+ } else {
+ var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
+ message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
+ if (matcherArgs.length > 0) {
+ for (var i = 0; i < matcherArgs.length; i++) {
+ if (i > 0) message += ",";
+ message += " " + jasmine.pp(matcherArgs[i]);
+ }
+ }
+ message += ".";
+ }
+ }
+ var expectationResult = new jasmine.ExpectationResult({
+ matcherName: matcherName,
+ passed: result,
+ expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
+ actual: this.actual,
+ message: message
+ });
+ this.spec.addMatcherResult(expectationResult);
+ return jasmine.undefined;
+ };
+};
+
+
+
+
+/**
+ * toBe: compares the actual to the expected using ===
+ * @param expected
+ */
+jasmine.Matchers.prototype.toBe = function(expected) {
+ return this.actual === expected;
+};
+
+/**
+ * toNotBe: compares the actual to the expected using !==
+ * @param expected
+ * @deprecated as of 1.0. Use not.toBe() instead.
+ */
+jasmine.Matchers.prototype.toNotBe = function(expected) {
+ return this.actual !== expected;
+};
+
+/**
+ * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
+ *
+ * @param expected
+ */
+jasmine.Matchers.prototype.toEqual = function(expected) {
+ return this.env.equals_(this.actual, expected);
+};
+
+/**
+ * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
+ * @param expected
+ * @deprecated as of 1.0. Use not.toNotEqual() instead.
+ */
+jasmine.Matchers.prototype.toNotEqual = function(expected) {
+ return !this.env.equals_(this.actual, expected);
+};
+
+/**
+ * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes
+ * a pattern or a String.
+ *
+ * @param expected
+ */
+jasmine.Matchers.prototype.toMatch = function(expected) {
+ return new RegExp(expected).test(this.actual);
+};
+
+/**
+ * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
+ * @param expected
+ * @deprecated as of 1.0. Use not.toMatch() instead.
+ */
+jasmine.Matchers.prototype.toNotMatch = function(expected) {
+ return !(new RegExp(expected).test(this.actual));
+};
+
+/**
+ * Matcher that compares the actual to jasmine.undefined.
+ */
+jasmine.Matchers.prototype.toBeDefined = function() {
+ return (this.actual !== jasmine.undefined);
+};
+
+/**
+ * Matcher that compares the actual to jasmine.undefined.
+ */
+jasmine.Matchers.prototype.toBeUndefined = function() {
+ return (this.actual === jasmine.undefined);
+};
+
+/**
+ * Matcher that compares the actual to null.
+ */
+jasmine.Matchers.prototype.toBeNull = function() {
+ return (this.actual === null);
+};
+
+/**
+ * Matcher that boolean not-nots the actual.
+ */
+jasmine.Matchers.prototype.toBeTruthy = function() {
+ return !!this.actual;
+};
+
+
+/**
+ * Matcher that boolean nots the actual.
+ */
+jasmine.Matchers.prototype.toBeFalsy = function() {
+ return !this.actual;
+};
+
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was called.
+ */
+jasmine.Matchers.prototype.toHaveBeenCalled = function() {
+ if (arguments.length > 0) {
+ throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
+ }
+
+ if (!jasmine.isSpy(this.actual)) {
+ throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+ }
+
+ this.message = function() {
+ return [
+ "Expected spy " + this.actual.identity + " to have been called.",
+ "Expected spy " + this.actual.identity + " not to have been called."
+ ];
+ };
+
+ return this.actual.wasCalled;
+};
+
+/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
+jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was not called.
+ *
+ * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
+ */
+jasmine.Matchers.prototype.wasNotCalled = function() {
+ if (arguments.length > 0) {
+ throw new Error('wasNotCalled does not take arguments');
+ }
+
+ if (!jasmine.isSpy(this.actual)) {
+ throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+ }
+
+ this.message = function() {
+ return [
+ "Expected spy " + this.actual.identity + " to not have been called.",
+ "Expected spy " + this.actual.identity + " to have been called."
+ ];
+ };
+
+ return !this.actual.wasCalled;
+};
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
+ *
+ * @example
+ *
+ */
+jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
+ var expectedArgs = jasmine.util.argsToArray(arguments);
+ if (!jasmine.isSpy(this.actual)) {
+ throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+ }
+ this.message = function() {
+ if (this.actual.callCount == 0) {
+ // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
+ return [
+ "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
+ "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
+ ];
+ } else {
+ return [
+ "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
+ "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
+ ];
+ }
+ };
+
+ return this.env.contains_(this.actual.argsForCall, expectedArgs);
+};
+
+/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
+jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
+
+/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
+jasmine.Matchers.prototype.wasNotCalledWith = function() {
+ var expectedArgs = jasmine.util.argsToArray(arguments);
+ if (!jasmine.isSpy(this.actual)) {
+ throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+ }
+
+ this.message = function() {
+ return [
+ "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
+ "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
+ ]
+ };
+
+ return !this.env.contains_(this.actual.argsForCall, expectedArgs);
+};
+
+/**
+ * Matcher that checks that the expected item is an element in the actual Array.
+ *
+ * @param {Object} expected
+ */
+jasmine.Matchers.prototype.toContain = function(expected) {
+ return this.env.contains_(this.actual, expected);
+};
+
+/**
+ * Matcher that checks that the expected item is NOT an element in the actual Array.
+ *
+ * @param {Object} expected
+ * @deprecated as of 1.0. Use not.toNotContain() instead.
+ */
+jasmine.Matchers.prototype.toNotContain = function(expected) {
+ return !this.env.contains_(this.actual, expected);
+};
+
+jasmine.Matchers.prototype.toBeLessThan = function(expected) {
+ return this.actual < expected;
+};
+
+jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
+ return this.actual > expected;
+};
+
+/**
+ * Matcher that checks that the expected exception was thrown by the actual.
+ *
+ * @param {String} expected
+ */
+jasmine.Matchers.prototype.toThrow = function(expected) {
+ var result = false;
+ var exception;
+ if (typeof this.actual != 'function') {
+ throw new Error('Actual is not a function');
+ }
+ try {
+ this.actual();
+ } catch (e) {
+ exception = e;
+ }
+ if (exception) {
+ result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
+ }
+
+ var not = this.isNot ? "not " : "";
+
+ this.message = function() {
+ if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
+ return ["Expected function " + not + "to throw", expected ? expected.message || expected : " an exception", ", but it threw", exception.message || exception].join(' ');
+ } else {
+ return "Expected function to throw an exception.";
+ }
+ };
+
+ return result;
+};
+
+jasmine.Matchers.Any = function(expectedClass) {
+ this.expectedClass = expectedClass;
+};
+
+jasmine.Matchers.Any.prototype.matches = function(other) {
+ if (this.expectedClass == String) {
+ return typeof other == 'string' || other instanceof String;
+ }
+
+ if (this.expectedClass == Number) {
+ return typeof other == 'number' || other instanceof Number;
+ }
+
+ if (this.expectedClass == Function) {
+ return typeof other == 'function' || other instanceof Function;
+ }
+
+ if (this.expectedClass == Object) {
+ return typeof other == 'object';
+ }
+
+ return other instanceof this.expectedClass;
+};
+
+jasmine.Matchers.Any.prototype.toString = function() {
+ return '<jasmine.any(' + this.expectedClass + ')>';
+};
+
+/**
+ * @constructor
+ */
+jasmine.MultiReporter = function() {
+ this.subReporters_ = [];
+};
+jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
+
+jasmine.MultiReporter.prototype.addReporter = function(reporter) {
+ this.subReporters_.push(reporter);
+};
+
+(function() {
+ var functionNames = [
+ "reportRunnerStarting",
+ "reportRunnerResults",
+ "reportSuiteResults",
+ "reportSpecStarting",
+ "reportSpecResults",
+ "log"
+ ];
+ for (var i = 0; i < functionNames.length; i++) {
+ var functionName = functionNames[i];
+ jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
+ return function() {
+ for (var j = 0; j < this.subReporters_.length; j++) {
+ var subReporter = this.subReporters_[j];
+ if (subReporter[functionName]) {
+ subReporter[functionName].apply(subReporter, arguments);
+ }
+ }
+ };
+ })(functionName);
+ }
+})();
+/**
+ * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
+ *
+ * @constructor
+ */
+jasmine.NestedResults = function() {
+ /**
+ * The total count of results
+ */
+ this.totalCount = 0;
+ /**
+ * Number of passed results
+ */
+ this.passedCount = 0;
+ /**
+ * Number of failed results
+ */
+ this.failedCount = 0;
+ /**
+ * Was this suite/spec skipped?
+ */
+ this.skipped = false;
+ /**
+ * @ignore
+ */
+ this.items_ = [];
+};
+
+/**
+ * Roll up the result counts.
+ *
+ * @param result
+ */
+jasmine.NestedResults.prototype.rollupCounts = function(result) {
+ this.totalCount += result.totalCount;
+ this.passedCount += result.passedCount;
+ this.failedCount += result.failedCount;
+};
+
+/**
+ * Adds a log message.
+ * @param values Array of message parts which will be concatenated later.
+ */
+jasmine.NestedResults.prototype.log = function(values) {
+ this.items_.push(new jasmine.MessageResult(values));
+};
+
+/**
+ * Getter for the results: message & results.
+ */
+jasmine.NestedResults.prototype.getItems = function() {
+ return this.items_;
+};
+
+/**
+ * Adds a result, tracking counts (total, passed, & failed)
+ * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
+ */
+jasmine.NestedResults.prototype.addResult = function(result) {
+ if (result.type != 'log') {
+ if (result.items_) {
+ this.rollupCounts(result);
+ } else {
+ this.totalCount++;
+ if (result.passed()) {
+ this.passedCount++;
+ } else {
+ this.failedCount++;
+ }
+ }
+ }
+ this.items_.push(result);
+};
+
+/**
+ * @returns {Boolean} True if <b>everything</b> below passed
+ */
+jasmine.NestedResults.prototype.passed = function() {
+ return this.passedCount === this.totalCount;
+};
+/**
+ * Base class for pretty printing for expectation results.
+ */
+jasmine.PrettyPrinter = function() {
+ this.ppNestLevel_ = 0;
+};
+
+/**
+ * Formats a value in a nice, human-readable string.
+ *
+ * @param value
+ */
+jasmine.PrettyPrinter.prototype.format = function(value) {
+ if (this.ppNestLevel_ > 40) {
+ throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
+ }
+
+ this.ppNestLevel_++;
+ try {
+ if (value === jasmine.undefined) {
+ this.emitScalar('undefined');
+ } else if (value === null) {
+ this.emitScalar('null');
+ } else if (value === jasmine.getGlobal()) {
+ this.emitScalar('<global>');
+ } else if (value instanceof jasmine.Matchers.Any) {
+ this.emitScalar(value.toString());
+ } else if (typeof value === 'string') {
+ this.emitString(value);
+ } else if (jasmine.isSpy(value)) {
+ this.emitScalar("spy on " + value.identity);
+ } else if (value instanceof RegExp) {
+ this.emitScalar(value.toString());
+ } else if (typeof value === 'function') {
+ this.emitScalar('Function');
+ } else if (typeof value.nodeType === 'number') {
+ this.emitScalar('HTMLNode');
+ } else if (value instanceof Date) {
+ this.emitScalar('Date(' + value + ')');
+ } else if (value.__Jasmine_been_here_before__) {
+ this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');
+ } else if (jasmine.isArray_(value) || typeof value == 'object') {
+ value.__Jasmine_been_here_before__ = true;
+ if (jasmine.isArray_(value)) {
+ this.emitArray(value);
+ } else {
+ this.emitObject(value);
+ }
+ delete value.__Jasmine_been_here_before__;
+ } else {
+ this.emitScalar(value.toString());
+ }
+ } finally {
+ this.ppNestLevel_--;
+ }
+};
+
+jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
+ for (var property in obj) {
+ if (property == '__Jasmine_been_here_before__') continue;
+ fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) != null) : false);
+ }
+};
+
+jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
+
+jasmine.StringPrettyPrinter = function() {
+ jasmine.PrettyPrinter.call(this);
+
+ this.string = '';
+};
+jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
+
+jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
+ this.append(value);
+};
+
+jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
+ this.append("'" + value + "'");
+};
+
+jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
+ this.append('[ ');
+ for (var i = 0; i < array.length; i++) {
+ if (i > 0) {
+ this.append(', ');
+ }
+ this.format(array[i]);
+ }
+ this.append(' ]');
+};
+
+jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
+ var self = this;
+ this.append('{ ');
+ var first = true;
+
+ this.iterateObject(obj, function(property, isGetter) {
+ if (first) {
+ first = false;
+ } else {
+ self.append(', ');
+ }
+
+ self.append(property);
+ self.append(' : ');
+ if (isGetter) {
+ self.append('<getter>');
+ } else {
+ self.format(obj[property]);
+ }
+ });
+
+ this.append(' }');
+};
+
+jasmine.StringPrettyPrinter.prototype.append = function(value) {
+ this.string += value;
+};
+jasmine.Queue = function(env) {
+ this.env = env;
+ this.blocks = [];
+ this.running = false;
+ this.index = 0;
+ this.offset = 0;
+ this.abort = false;
+};
+
+jasmine.Queue.prototype.addBefore = function(block) {
+ this.blocks.unshift(block);
+};
+
+jasmine.Queue.prototype.add = function(block) {
+ this.blocks.push(block);
+};
+
+jasmine.Queue.prototype.insertNext = function(block) {
+ this.blocks.splice((this.index + this.offset + 1), 0, block);
+ this.offset++;
+};
+
+jasmine.Queue.prototype.start = function(onComplete) {
+ this.running = true;
+ this.onComplete = onComplete;
+ this.next_();
+};
+
+jasmine.Queue.prototype.isRunning = function() {
+ return this.running;
+};
+
+jasmine.Queue.LOOP_DONT_RECURSE = true;
+
+jasmine.Queue.prototype.next_ = function() {
+ var self = this;
+ var goAgain = true;
+
+ while (goAgain) {
+ goAgain = false;
+
+ if (self.index < self.blocks.length && !this.abort) {
+ var calledSynchronously = true;
+ var completedSynchronously = false;
+
+ var onComplete = function () {
+ if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
+ completedSynchronously = true;
+ return;
+ }
+
+ if (self.blocks[self.index].abort) {
+ self.abort = true;
+ }
+
+ self.offset = 0;
+ self.index++;
+
+ var now = new Date().getTime();
+ if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
+ self.env.lastUpdate = now;
+ self.env.setTimeout(function() {
+ self.next_();
+ }, 0);
+ } else {
+ if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
+ goAgain = true;
+ } else {
+ self.next_();
+ }
+ }
+ };
+ self.blocks[self.index].execute(onComplete);
+
+ calledSynchronously = false;
+ if (completedSynchronously) {
+ onComplete();
+ }
+
+ } else {
+ self.running = false;
+ if (self.onComplete) {
+ self.onComplete();
+ }
+ }
+ }
+};
+
+jasmine.Queue.prototype.results = function() {
+ var results = new jasmine.NestedResults();
+ for (var i = 0; i < this.blocks.length; i++) {
+ if (this.blocks[i].results) {
+ results.addResult(this.blocks[i].results());
+ }
+ }
+ return results;
+};
+
+
+/**
+ * Runner
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ */
+jasmine.Runner = function(env) {
+ var self = this;
+ self.env = env;
+ self.queue = new jasmine.Queue(env);
+ self.before_ = [];
+ self.after_ = [];
+ self.suites_ = [];
+};
+
+jasmine.Runner.prototype.execute = function() {
+ var self = this;
+ if (self.env.reporter.reportRunnerStarting) {
+ self.env.reporter.reportRunnerStarting(this);
+ }
+ self.queue.start(function () {
+ self.finishCallback();
+ });
+};
+
+jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
+ beforeEachFunction.typeName = 'beforeEach';
+ this.before_.splice(0,0,beforeEachFunction);
+};
+
+jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
+ afterEachFunction.typeName = 'afterEach';
+ this.after_.splice(0,0,afterEachFunction);
+};
+
+
+jasmine.Runner.prototype.finishCallback = function() {
+ this.env.reporter.reportRunnerResults(this);
+};
+
+jasmine.Runner.prototype.addSuite = function(suite) {
+ this.suites_.push(suite);
+};
+
+jasmine.Runner.prototype.add = function(block) {
+ if (block instanceof jasmine.Suite) {
+ this.addSuite(block);
+ }
+ this.queue.add(block);
+};
+
+jasmine.Runner.prototype.specs = function () {
+ var suites = this.suites();
+ var specs = [];
+ for (var i = 0; i < suites.length; i++) {
+ specs = specs.concat(suites[i].specs());
+ }
+ return specs;
+};
+
+jasmine.Runner.prototype.suites = function() {
+ return this.suites_;
+};
+
+jasmine.Runner.prototype.topLevelSuites = function() {
+ var topLevelSuites = [];
+ for (var i = 0; i < this.suites_.length; i++) {
+ if (!this.suites_[i].parentSuite) {
+ topLevelSuites.push(this.suites_[i]);
+ }
+ }
+ return topLevelSuites;
+};
+
+jasmine.Runner.prototype.results = function() {
+ return this.queue.results();
+};
+/**
+ * Internal representation of a Jasmine specification, or test.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {jasmine.Suite} suite
+ * @param {String} description
+ */
+jasmine.Spec = function(env, suite, description) {
+ if (!env) {
+ throw new Error('jasmine.Env() required');
+ }
+ if (!suite) {
+ throw new Error('jasmine.Suite() required');
+ }
+ var spec = this;
+ spec.id = env.nextSpecId ? env.nextSpecId() : null;
+ spec.env = env;
+ spec.suite = suite;
+ spec.description = description;
+ spec.queue = new jasmine.Queue(env);
+
+ spec.afterCallbacks = [];
+ spec.spies_ = [];
+
+ spec.results_ = new jasmine.NestedResults();
+ spec.results_.description = description;
+ spec.matchersClass = null;
+};
+
+jasmine.Spec.prototype.getFullName = function() {
+ return this.suite.getFullName() + ' ' + this.description + '.';
+};
+
+
+jasmine.Spec.prototype.results = function() {
+ return this.results_;
+};
+
+/**
+ * All parameters are pretty-printed and concatenated together, then written to the spec's output.
+ *
+ * Be careful not to leave calls to <code>jasmine.log</code> in production code.
+ */
+jasmine.Spec.prototype.log = function() {
+ return this.results_.log(arguments);
+};
+
+jasmine.Spec.prototype.runs = function (func) {
+ var block = new jasmine.Block(this.env, func, this);
+ this.addToQueue(block);
+ return this;
+};
+
+jasmine.Spec.prototype.addToQueue = function (block) {
+ if (this.queue.isRunning()) {
+ this.queue.insertNext(block);
+ } else {
+ this.queue.add(block);
+ }
+};
+
+/**
+ * @param {jasmine.ExpectationResult} result
+ */
+jasmine.Spec.prototype.addMatcherResult = function(result) {
+ this.results_.addResult(result);
+};
+
+jasmine.Spec.prototype.expect = function(actual) {
+ var positive = new (this.getMatchersClass_())(this.env, actual, this);
+ positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
+ return positive;
+};
+
+/**
+ * Waits a fixed time period before moving to the next block.
+ *
+ * @deprecated Use waitsFor() instead
+ * @param {Number} timeout milliseconds to wait
+ */
+jasmine.Spec.prototype.waits = function(timeout) {
+ var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
+ this.addToQueue(waitsFunc);
+ return this;
+};
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next block.
+ *
+ * @param {Function} latchFunction
+ * @param {String} optional_timeoutMessage
+ * @param {Number} optional_timeout
+ */
+jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
+ var latchFunction_ = null;
+ var optional_timeoutMessage_ = null;
+ var optional_timeout_ = null;
+
+ for (var i = 0; i < arguments.length; i++) {
+ var arg = arguments[i];
+ switch (typeof arg) {
+ case 'function':
+ latchFunction_ = arg;
+ break;
+ case 'string':
+ optional_timeoutMessage_ = arg;
+ break;
+ case 'number':
+ optional_timeout_ = arg;
+ break;
+ }
+ }
+
+ var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
+ this.addToQueue(waitsForFunc);
+ return this;
+};
+
+jasmine.Spec.prototype.fail = function (e) {
+ var expectationResult = new jasmine.ExpectationResult({
+ passed: false,
+ message: e ? jasmine.util.formatException(e) : 'Exception'
+ });
+ this.results_.addResult(expectationResult);
+};
+
+jasmine.Spec.prototype.getMatchersClass_ = function() {
+ return this.matchersClass || this.env.matchersClass;
+};
+
+jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
+ var parent = this.getMatchersClass_();
+ var newMatchersClass = function() {
+ parent.apply(this, arguments);
+ };
+ jasmine.util.inherit(newMatchersClass, parent);
+ jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
+ this.matchersClass = newMatchersClass;
+};
+
+jasmine.Spec.prototype.finishCallback = function() {
+ this.env.reporter.reportSpecResults(this);
+};
+
+jasmine.Spec.prototype.finish = function(onComplete) {
+ this.removeAllSpies();
+ this.finishCallback();
+ if (onComplete) {
+ onComplete();
+ }
+};
+
+jasmine.Spec.prototype.after = function(doAfter) {
+ if (this.queue.isRunning()) {
+ this.queue.add(new jasmine.Block(this.env, doAfter, this));
+ } else {
+ this.afterCallbacks.unshift(doAfter);
+ }
+};
+
+jasmine.Spec.prototype.execute = function(onComplete) {
+ var spec = this;
+ if (!spec.env.specFilter(spec)) {
+ spec.results_.skipped = true;
+ spec.finish(onComplete);
+ return;
+ }
+
+ this.env.reporter.reportSpecStarting(this);
+
+ spec.env.currentSpec = spec;
+
+ spec.addBeforesAndAftersToQueue();
+
+ spec.queue.start(function () {
+ spec.finish(onComplete);
+ });
+};
+
+jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
+ var runner = this.env.currentRunner();
+ var i;
+
+ for (var suite = this.suite; suite; suite = suite.parentSuite) {
+ for (i = 0; i < suite.before_.length; i++) {
+ this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
+ }
+ }
+ for (i = 0; i < runner.before_.length; i++) {
+ this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
+ }
+ for (i = 0; i < this.afterCallbacks.length; i++) {
+ this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
+ }
+ for (suite = this.suite; suite; suite = suite.parentSuite) {
+ for (i = 0; i < suite.after_.length; i++) {
+ this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
+ }
+ }
+ for (i = 0; i < runner.after_.length; i++) {
+ this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
+ }
+};
+
+jasmine.Spec.prototype.explodes = function() {
+ throw 'explodes function should not have been called';
+};
+
+jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
+ if (obj == jasmine.undefined) {
+ throw "spyOn could not find an object to spy upon for " + methodName + "()";
+ }
+
+ if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
+ throw methodName + '() method does not exist';
+ }
+
+ if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
+ throw new Error(methodName + ' has already been spied upon');
+ }
+
+ var spyObj = jasmine.createSpy(methodName);
+
+ this.spies_.push(spyObj);
+ spyObj.baseObj = obj;
+ spyObj.methodName = methodName;
+ spyObj.originalValue = obj[methodName];
+
+ obj[methodName] = spyObj;
+
+ return spyObj;
+};
+
+jasmine.Spec.prototype.removeAllSpies = function() {
+ for (var i = 0; i < this.spies_.length; i++) {
+ var spy = this.spies_[i];
+ spy.baseObj[spy.methodName] = spy.originalValue;
+ }
+ this.spies_ = [];
+};
+
+/**
+ * Internal representation of a Jasmine suite.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {String} description
+ * @param {Function} specDefinitions
+ * @param {jasmine.Suite} parentSuite
+ */
+jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
+ var self = this;
+ self.id = env.nextSuiteId ? env.nextSuiteId() : null;
+ self.description = description;
+ self.queue = new jasmine.Queue(env);
+ self.parentSuite = parentSuite;
+ self.env = env;
+ self.before_ = [];
+ self.after_ = [];
+ self.children_ = [];
+ self.suites_ = [];
+ self.specs_ = [];
+};
+
+jasmine.Suite.prototype.getFullName = function() {
+ var fullName = this.description;
+ for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
+ fullName = parentSuite.description + ' ' + fullName;
+ }
+ return fullName;
+};
+
+jasmine.Suite.prototype.finish = function(onComplete) {
+ this.env.reporter.reportSuiteResults(this);
+ this.finished = true;
+ if (typeof(onComplete) == 'function') {
+ onComplete();
+ }
+};
+
+jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
+ beforeEachFunction.typeName = 'beforeEach';
+ this.before_.unshift(beforeEachFunction);
+};
+
+jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
+ afterEachFunction.typeName = 'afterEach';
+ this.after_.unshift(afterEachFunction);
+};
+
+jasmine.Suite.prototype.results = function() {
+ return this.queue.results();
+};
+
+jasmine.Suite.prototype.add = function(suiteOrSpec) {
+ this.children_.push(suiteOrSpec);
+ if (suiteOrSpec instanceof jasmine.Suite) {
+ this.suites_.push(suiteOrSpec);
+ this.env.currentRunner().addSuite(suiteOrSpec);
+ } else {
+ this.specs_.push(suiteOrSpec);
+ }
+ this.queue.add(suiteOrSpec);
+};
+
+jasmine.Suite.prototype.specs = function() {
+ return this.specs_;
+};
+
+jasmine.Suite.prototype.suites = function() {
+ return this.suites_;
+};
+
+jasmine.Suite.prototype.children = function() {
+ return this.children_;
+};
+
+jasmine.Suite.prototype.execute = function(onComplete) {
+ var self = this;
+ this.queue.start(function () {
+ self.finish(onComplete);
+ });
+};
+jasmine.WaitsBlock = function(env, timeout, spec) {
+ this.timeout = timeout;
+ jasmine.Block.call(this, env, null, spec);
+};
+
+jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
+
+jasmine.WaitsBlock.prototype.execute = function (onComplete) {
+ this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
+ this.env.setTimeout(function () {
+ onComplete();
+ }, this.timeout);
+};
+/**
+ * A block which waits for some condition to become true, with timeout.
+ *
+ * @constructor
+ * @extends jasmine.Block
+ * @param {jasmine.Env} env The Jasmine environment.
+ * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
+ * @param {Function} latchFunction A function which returns true when the desired condition has been met.
+ * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
+ * @param {jasmine.Spec} spec The Jasmine spec.
+ */
+jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
+ this.timeout = timeout || env.defaultTimeoutInterval;
+ this.latchFunction = latchFunction;
+ this.message = message;
+ this.totalTimeSpentWaitingForLatch = 0;
+ jasmine.Block.call(this, env, null, spec);
+};
+jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
+
+jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
+
+jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
+ this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
+ var latchFunctionResult;
+ try {
+ latchFunctionResult = this.latchFunction.apply(this.spec);
+ } catch (e) {
+ this.spec.fail(e);
+ onComplete();
+ return;
+ }
+
+ if (latchFunctionResult) {
+ onComplete();
+ } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
+ var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
+ this.spec.fail({
+ name: 'timeout',
+ message: message
+ });
+
+ this.abort = true;
+ onComplete();
+ } else {
+ this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
+ var self = this;
+ this.env.setTimeout(function() {
+ self.execute(onComplete);
+ }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
+ }
+};
+// Mock setTimeout, clearTimeout
+// Contributed by Pivotal Computer Systems, www.pivotalsf.com
+
+jasmine.FakeTimer = function() {
+ this.reset();
+
+ var self = this;
+ self.setTimeout = function(funcToCall, millis) {
+ self.timeoutsMade++;
+ self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
+ return self.timeoutsMade;
+ };
+
+ self.setInterval = function(funcToCall, millis) {
+ self.timeoutsMade++;
+ self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
+ return self.timeoutsMade;
+ };
+
+ self.clearTimeout = function(timeoutKey) {
+ self.scheduledFunctions[timeoutKey] = jasmine.undefined;
+ };
+
+ self.clearInterval = function(timeoutKey) {
+ self.scheduledFunctions[timeoutKey] = jasmine.undefined;
+ };
+
+};
+
+jasmine.FakeTimer.prototype.reset = function() {
+ this.timeoutsMade = 0;
+ this.scheduledFunctions = {};
+ this.nowMillis = 0;
+};
+
+jasmine.FakeTimer.prototype.tick = function(millis) {
+ var oldMillis = this.nowMillis;
+ var newMillis = oldMillis + millis;
+ this.runFunctionsWithinRange(oldMillis, newMillis);
+ this.nowMillis = newMillis;
+};
+
+jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
+ var scheduledFunc;
+ var funcsToRun = [];
+ for (var timeoutKey in this.scheduledFunctions) {
+ scheduledFunc = this.scheduledFunctions[timeoutKey];
+ if (scheduledFunc != jasmine.undefined &&
+ scheduledFunc.runAtMillis >= oldMillis &&
+ scheduledFunc.runAtMillis <= nowMillis) {
+ funcsToRun.push(scheduledFunc);
+ this.scheduledFunctions[timeoutKey] = jasmine.undefined;
+ }
+ }
+
+ if (funcsToRun.length > 0) {
+ funcsToRun.sort(function(a, b) {
+ return a.runAtMillis - b.runAtMillis;
+ });
+ for (var i = 0; i < funcsToRun.length; ++i) {
+ try {
+ var funcToRun = funcsToRun[i];
+ this.nowMillis = funcToRun.runAtMillis;
+ funcToRun.funcToCall();
+ if (funcToRun.recurring) {
+ this.scheduleFunction(funcToRun.timeoutKey,
+ funcToRun.funcToCall,
+ funcToRun.millis,
+ true);
+ }
+ } catch(e) {
+ }
+ }
+ this.runFunctionsWithinRange(oldMillis, nowMillis);
+ }
+};
+
+jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
+ this.scheduledFunctions[timeoutKey] = {
+ runAtMillis: this.nowMillis + millis,
+ funcToCall: funcToCall,
+ recurring: recurring,
+ timeoutKey: timeoutKey,
+ millis: millis
+ };
+};
+
+/**
+ * @namespace
+ */
+jasmine.Clock = {
+ defaultFakeTimer: new jasmine.FakeTimer(),
+
+ reset: function() {
+ jasmine.Clock.assertInstalled();
+ jasmine.Clock.defaultFakeTimer.reset();
+ },
+
+ tick: function(millis) {
+ jasmine.Clock.assertInstalled();
+ jasmine.Clock.defaultFakeTimer.tick(millis);
+ },
+
+ runFunctionsWithinRange: function(oldMillis, nowMillis) {
+ jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
+ },
+
+ scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
+ jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
+ },
+
+ useMock: function() {
+ if (!jasmine.Clock.isInstalled()) {
+ var spec = jasmine.getEnv().currentSpec;
+ spec.after(jasmine.Clock.uninstallMock);
+
+ jasmine.Clock.installMock();
+ }
+ },
+
+ installMock: function() {
+ jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
+ },
+
+ uninstallMock: function() {
+ jasmine.Clock.assertInstalled();
+ jasmine.Clock.installed = jasmine.Clock.real;
+ },
+
+ real: {
+ setTimeout: jasmine.getGlobal().setTimeout,
+ clearTimeout: jasmine.getGlobal().clearTimeout,
+ setInterval: jasmine.getGlobal().setInterval,
+ clearInterval: jasmine.getGlobal().clearInterval
+ },
+
+ assertInstalled: function() {
+ if (!jasmine.Clock.isInstalled()) {
+ throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
+ }
+ },
+
+ isInstalled: function() {
+ return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
+ },
+
+ installed: null
+};
+jasmine.Clock.installed = jasmine.Clock.real;
+
+//else for IE support
+jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
+ if (jasmine.Clock.installed.setTimeout.apply) {
+ return jasmine.Clock.installed.setTimeout.apply(this, arguments);
+ } else {
+ return jasmine.Clock.installed.setTimeout(funcToCall, millis);
+ }
+};
+
+jasmine.getGlobal().setInterval = function(funcToCall, millis) {
+ if (jasmine.Clock.installed.setInterval.apply) {
+ return jasmine.Clock.installed.setInterval.apply(this, arguments);
+ } else {
+ return jasmine.Clock.installed.setInterval(funcToCall, millis);
+ }
+};
+
+jasmine.getGlobal().clearTimeout = function(timeoutKey) {
+ if (jasmine.Clock.installed.clearTimeout.apply) {
+ return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
+ } else {
+ return jasmine.Clock.installed.clearTimeout(timeoutKey);
+ }
+};
+
+jasmine.getGlobal().clearInterval = function(timeoutKey) {
+ if (jasmine.Clock.installed.clearTimeout.apply) {
+ return jasmine.Clock.installed.clearInterval.apply(this, arguments);
+ } else {
+ return jasmine.Clock.installed.clearInterval(timeoutKey);
+ }
+};
+
+
+jasmine.version_= {
+ "major": 1,
+ "minor": 0,
+ "build": 1,
+ "revision": 1286311016
+};
diff --git a/tests/jasmine/spec/mediawiki.Uri.spec.js b/tests/jasmine/spec/mediawiki.Uri.spec.js
new file mode 100644
index 00000000..721ccb38
--- /dev/null
+++ b/tests/jasmine/spec/mediawiki.Uri.spec.js
@@ -0,0 +1,307 @@
+( function() {
+
+ // ensure we have a generic URI parser if not running in a browser
+ if ( !mw.Uri ) {
+ mw.Uri = mw.UriRelative( 'http://example.com/' );
+ }
+
+ describe( "mw.Uri", function() {
+
+ describe( "should work well in loose and strict mode", function() {
+
+ function basicTests( strict ) {
+
+ describe( "should parse a simple HTTP URI correctly", function() {
+
+ var uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
+ var uri;
+ if ( strict ) {
+ uri = new mw.Uri( uriString, strict );
+ } else {
+ uri = new mw.Uri( uriString );
+ }
+
+ it( "should have basic object properties", function() {
+ expect( uri.protocol ).toEqual( 'http' );
+ expect( uri.host ).toEqual( 'www.ietf.org' );
+ expect( uri.port ).not.toBeDefined();
+ expect( uri.path ).toEqual( '/rfc/rfc2396.txt' );
+ expect( uri.query ).toEqual( {} );
+ expect( uri.fragment ).not.toBeDefined();
+ } );
+
+ describe( "should construct composite components of URI on request", function() {
+ it( "should have empty userinfo", function() {
+ expect( uri.getUserInfo() ).toEqual( '' );
+ } );
+
+ it( "should have authority equal to host", function() {
+ expect( uri.getAuthority() ).toEqual( 'www.ietf.org' );
+ } );
+
+ it( "should have hostport equal to host", function() {
+ expect( uri.getHostPort() ).toEqual( 'www.ietf.org' );
+ } );
+
+ it( "should have empty string as query string", function() {
+ expect( uri.getQueryString() ).toEqual( '' );
+ } );
+
+ it( "should have path as relative path", function() {
+ expect( uri.getRelativePath() ).toEqual( '/rfc/rfc2396.txt' );
+ } );
+
+ it( "should return a uri string equivalent to original", function() {
+ expect( uri.toString() ).toEqual( uriString );
+ } );
+ } );
+ } );
+ }
+
+ describe( "should work in loose mode", function() {
+ basicTests( false );
+ } );
+
+ describe( "should work in strict mode", function() {
+ basicTests( true );
+ } );
+
+ } );
+
+ it( "should parse a simple ftp URI correctly with user and password", function() {
+ var uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
+ expect( uri.protocol ).toEqual( 'ftp' );
+ expect( uri.user ).toEqual( 'usr' );
+ expect( uri.password ).toEqual( 'pwd' );
+ expect( uri.host ).toEqual( '192.0.2.16' );
+ expect( uri.port ).not.toBeDefined();
+ expect( uri.path ).toEqual( '/' );
+ expect( uri.query ).toEqual( {} );
+ expect( uri.fragment ).not.toBeDefined();
+ } );
+
+ it( "should parse a simple querystring", function() {
+ var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
+ expect( uri.protocol ).toEqual( 'http' );
+ expect( uri.host ).toEqual( 'www.google.com' );
+ expect( uri.port ).not.toBeDefined();
+ expect( uri.path ).toEqual( '/' );
+ expect( uri.query ).toBeDefined();
+ expect( uri.query ).toEqual( { q: 'uri' } );
+ expect( uri.fragment ).not.toBeDefined();
+ expect( uri.getQueryString() ).toEqual( 'q=uri' );
+ } );
+
+ describe( "should handle multiple value query args (overrideKeys on)", function() {
+ var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { overrideKeys: true } );
+ it ( "should parse with multiple values", function() {
+ expect( uri.query.m ).toEqual( 'bar' );
+ expect( uri.query.n ).toEqual( '1' );
+ } );
+ it ( "should accept multiple values", function() {
+ uri.query.n = [ "x", "y", "z" ];
+ expect( uri.toString() ).toContain( 'm=bar' );
+ expect( uri.toString() ).toContain( 'n=x&n=y&n=z' );
+ expect( uri.toString().length ).toEqual( 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length );
+ } );
+ } );
+
+ describe( "should handle multiple value query args (overrideKeys off)", function() {
+ var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { overrideKeys: false } );
+ it ( "should parse with multiple values", function() {
+ expect( uri.query.m.length ).toEqual( 2 );
+ expect( uri.query.m[0] ).toEqual( 'foo' );
+ expect( uri.query.m[1] ).toEqual( 'bar' );
+ expect( uri.query.n ).toEqual( '1' );
+ } );
+ it ( "should accept multiple values", function() {
+ uri.query.n = [ "x", "y", "z" ];
+ expect( uri.toString() ).toContain( 'm=foo&m=bar' );
+ expect( uri.toString() ).toContain( 'n=x&n=y&n=z' );
+ expect( uri.toString().length ).toEqual( 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length );
+ } );
+ it ( "should be okay with removing values", function() {
+ uri.query.m.splice( 0, 1 );
+ delete uri.query.n;
+ expect( uri.toString() ).toEqual( 'http://www.example.com/dir/?m=bar' );
+ uri.query.m.splice( 0, 1 );
+ expect( uri.toString() ).toEqual( 'http://www.example.com/dir/' );
+ } );
+ } );
+
+ describe( "should deal with an all-dressed URI with everything", function() {
+ var uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
+
+ it( "should have basic object properties", function() {
+ expect( uri.protocol ).toEqual( 'http' );
+ expect( uri.user ).toEqual( 'auth' );
+ expect( uri.password ).not.toBeDefined();
+ expect( uri.host ).toEqual( 'www.example.com' );
+ expect( uri.port ).toEqual( '81' );
+ expect( uri.path ).toEqual( '/dir/dir.2/index.htm' );
+ expect( uri.query ).toEqual( { q1: '0', test1: null, test2: 'value (escaped)' } );
+ expect( uri.fragment ).toEqual( 'top' );
+ } );
+
+ describe( "should construct composite components of URI on request", function() {
+ it( "should have userinfo", function() {
+ expect( uri.getUserInfo() ).toEqual( 'auth' );
+ } );
+
+ it( "should have authority equal to auth@hostport", function() {
+ expect( uri.getAuthority() ).toEqual( 'auth@www.example.com:81' );
+ } );
+
+ it( "should have hostport equal to host:port", function() {
+ expect( uri.getHostPort() ).toEqual( 'www.example.com:81' );
+ } );
+
+ it( "should have query string which contains all components", function() {
+ var queryString = uri.getQueryString();
+ expect( queryString ).toContain( 'q1=0' );
+ expect( queryString ).toContain( 'test1' );
+ expect( queryString ).not.toContain( 'test1=' );
+ expect( queryString ).toContain( 'test2=value+%28escaped%29' );
+ } );
+
+ it( "should have path as relative path", function() {
+ expect( uri.getRelativePath() ).toContain( uri.path );
+ expect( uri.getRelativePath() ).toContain( uri.getQueryString() );
+ expect( uri.getRelativePath() ).toContain( uri.fragment );
+ } );
+
+ } );
+ } );
+
+ describe( "should be able to clone itself", function() {
+ var original = new mw.Uri( 'http://en.wiki.local/w/api.php?action=query&foo=bar' );
+ var clone = original.clone();
+
+ it( "should make clones equivalent", function() {
+ expect( original ).toEqual( clone );
+ expect( original.toString() ).toEqual( clone.toString() );
+ } );
+
+ it( "should be able to manipulate clones independently", function() {
+ // but they are still different objects
+ expect( original ).not.toBe( clone );
+ // and can diverge
+ clone.host = 'fr.wiki.local';
+ expect( original.host ).not.toEqual( clone.host );
+ expect( original.toString() ).not.toEqual( clone.toString() );
+ } );
+ } );
+
+ describe( "should be able to construct URL from object", function() {
+ it ( "should construct given basic arguments", function() {
+ var uri = new mw.Uri( { protocol: 'http', host: 'www.foo.local', path: '/this' } );
+ expect( uri.toString() ).toEqual( 'http://www.foo.local/this' );
+ } );
+
+ it ( "should construct given more complex arguments", function() {
+ var uri = new mw.Uri( {
+ protocol: 'http',
+ host: 'www.foo.local',
+ path: '/this',
+ query: { hi: 'there' },
+ fragment: 'blah'
+ } );
+ expect( uri.toString() ).toEqual( 'http://www.foo.local/this?hi=there#blah' );
+ } );
+
+ it ( "should fail to construct without required properties", function() {
+ expect( function() {
+ var uri = new mw.Uri( { protocol: 'http', host: 'www.foo.local' } );
+ } ).toThrow( "Bad constructor arguments" );
+ } );
+ } );
+
+ describe( "should be able to manipulate properties", function() {
+ var uri;
+
+ beforeEach( function() {
+ uri = new mw.Uri( 'http://en.wiki.local/w/api.php' );
+ } );
+
+ it( "can add a fragment", function() {
+ uri.fragment = 'frag';
+ expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php#frag' );
+ } );
+
+ it( "can change host and port", function() {
+ uri.host = 'fr.wiki.local';
+ uri.port = '8080';
+ expect( uri.toString() ).toEqual( 'http://fr.wiki.local:8080/w/api.php' );
+ } );
+
+ it ( "can add query arguments", function() {
+ uri.query.foo = 'bar';
+ expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
+ } );
+
+ it ( "can extend query arguments", function() {
+ uri.query.foo = 'bar';
+ expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
+ uri.extend( { foo: 'quux', pif: 'paf' } );
+ expect( uri.toString() ).toContain( 'foo=quux' );
+ expect( uri.toString() ).not.toContain( 'foo=bar' );
+ expect( uri.toString() ).toContain( 'pif=paf' );
+ } );
+
+ it ( "can remove query arguments", function() {
+ uri.query.foo = 'bar';
+ expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
+ delete( uri.query.foo );
+ expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php' );
+ } );
+
+ } );
+
+ describe( "should handle protocol-relative URLs", function() {
+
+ it ( "should create protocol-relative URLs with same protocol as document", function() {
+ var uriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
+ var uri = new uriRel( '//en.wiki.local/w/api.php' );
+ expect( uri.protocol ).toEqual( 'glork' );
+ } );
+
+ } );
+
+ it( "should throw error on no arguments to constructor", function() {
+ expect( function() {
+ var uri = new mw.Uri();
+ } ).toThrow( "Bad constructor arguments" );
+ } );
+
+ it( "should throw error on empty string as argument to constructor", function() {
+ expect( function() {
+ var uri = new mw.Uri( '' );
+ } ).toThrow( "Bad constructor arguments" );
+ } );
+
+ it( "should throw error on non-URI as argument to constructor", function() {
+ expect( function() {
+ var uri = new mw.Uri( 'glaswegian penguins' );
+ } ).toThrow( "Bad constructor arguments" );
+ } );
+
+ it( "should throw error on improper URI as argument to constructor", function() {
+ expect( function() {
+ var uri = new mw.Uri( 'http:/foo.com' );
+ } ).toThrow( "Bad constructor arguments" );
+ } );
+
+ it( "should throw error on URI without protocol or // in strict mode", function() {
+ expect( function() {
+ var uri = new mw.Uri( 'foo.com/bar/baz', true );
+ } ).toThrow( "Bad constructor arguments" );
+ } );
+
+ it( "should normalize URI without protocol or // in loose mode", function() {
+ var uri = new mw.Uri( 'foo.com/bar/baz', false );
+ expect( uri.toString() ).toEqual( 'http://foo.com/bar/baz' );
+ } );
+
+ } );
+
+} )();
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
new file mode 100644
index 00000000..a867f72c
--- /dev/null
+++ b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
@@ -0,0 +1,488 @@
+// This file stores the results from the PHP parser for certain messages and arguments,
+// so we can test the equivalent Javascript libraries.
+// Last generated with makeLanguageSpec.php at 2011-01-28T02:04:09+00:00
+
+mediaWiki.messages.set( {
+ "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+ "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+ "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
+ "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
+ "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1|\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644|$1 \u062a\u0639\u062f\u064a\u0644\u0627}}",
+ "ar_category-subcat-count": "{{PLURAL:$2|\u0644\u0627 \u062a\u0635\u0627\u0646\u064a\u0641 \u0641\u0631\u0639\u064a\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 {{PLURAL:$1||\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u0647\u0630\u064a\u0646 \u0627\u0644\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0627\u0644\u0641\u0631\u0639\u064a\u064a\u0646|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641\u0627 \u0641\u0631\u0639\u064a\u0627|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641 \u0641\u0631\u0639\u064a}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
+ "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+ "jp_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+ "zh_undelete_short": "\u6062\u590d\u88ab\u5220\u9664\u7684$1\u9879\u4fee\u8ba2",
+ "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u5217$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u6709$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
+} );
+var jasmineMsgSpec = [
+ {
+ "name": "en undelete_short 0",
+ "key": "en_undelete_short",
+ "args": [
+ 0
+ ],
+ "result": "Undelete 0 edits",
+ "lang": "en"
+ },
+ {
+ "name": "en undelete_short 1",
+ "key": "en_undelete_short",
+ "args": [
+ 1
+ ],
+ "result": "Undelete one edit",
+ "lang": "en"
+ },
+ {
+ "name": "en undelete_short 2",
+ "key": "en_undelete_short",
+ "args": [
+ 2
+ ],
+ "result": "Undelete 2 edits",
+ "lang": "en"
+ },
+ {
+ "name": "en undelete_short 5",
+ "key": "en_undelete_short",
+ "args": [
+ 5
+ ],
+ "result": "Undelete 5 edits",
+ "lang": "en"
+ },
+ {
+ "name": "en undelete_short 21",
+ "key": "en_undelete_short",
+ "args": [
+ 21
+ ],
+ "result": "Undelete 21 edits",
+ "lang": "en"
+ },
+ {
+ "name": "en undelete_short 101",
+ "key": "en_undelete_short",
+ "args": [
+ 101
+ ],
+ "result": "Undelete 101 edits",
+ "lang": "en"
+ },
+ {
+ "name": "en category-subcat-count 0,10",
+ "key": "en_category-subcat-count",
+ "args": [
+ 0,
+ 10
+ ],
+ "result": "This category has the following 0 subcategories, out of 10 total.",
+ "lang": "en"
+ },
+ {
+ "name": "en category-subcat-count 1,1",
+ "key": "en_category-subcat-count",
+ "args": [
+ 1,
+ 1
+ ],
+ "result": "This category has only the following subcategory.",
+ "lang": "en"
+ },
+ {
+ "name": "en category-subcat-count 1,2",
+ "key": "en_category-subcat-count",
+ "args": [
+ 1,
+ 2
+ ],
+ "result": "This category has the following subcategory, out of 2 total.",
+ "lang": "en"
+ },
+ {
+ "name": "en category-subcat-count 3,30",
+ "key": "en_category-subcat-count",
+ "args": [
+ 3,
+ 30
+ ],
+ "result": "This category has the following 3 subcategories, out of 30 total.",
+ "lang": "en"
+ },
+ {
+ "name": "fr undelete_short 0",
+ "key": "fr_undelete_short",
+ "args": [
+ 0
+ ],
+ "result": "Restaurer 0 modification",
+ "lang": "fr"
+ },
+ {
+ "name": "fr undelete_short 1",
+ "key": "fr_undelete_short",
+ "args": [
+ 1
+ ],
+ "result": "Restaurer 1 modification",
+ "lang": "fr"
+ },
+ {
+ "name": "fr undelete_short 2",
+ "key": "fr_undelete_short",
+ "args": [
+ 2
+ ],
+ "result": "Restaurer 2 modifications",
+ "lang": "fr"
+ },
+ {
+ "name": "fr undelete_short 5",
+ "key": "fr_undelete_short",
+ "args": [
+ 5
+ ],
+ "result": "Restaurer 5 modifications",
+ "lang": "fr"
+ },
+ {
+ "name": "fr undelete_short 21",
+ "key": "fr_undelete_short",
+ "args": [
+ 21
+ ],
+ "result": "Restaurer 21 modifications",
+ "lang": "fr"
+ },
+ {
+ "name": "fr undelete_short 101",
+ "key": "fr_undelete_short",
+ "args": [
+ 101
+ ],
+ "result": "Restaurer 101 modifications",
+ "lang": "fr"
+ },
+ {
+ "name": "fr category-subcat-count 0,10",
+ "key": "fr_category-subcat-count",
+ "args": [
+ 0,
+ 10
+ ],
+ "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
+ "lang": "fr"
+ },
+ {
+ "name": "fr category-subcat-count 1,1",
+ "key": "fr_category-subcat-count",
+ "args": [
+ 1,
+ 1
+ ],
+ "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
+ "lang": "fr"
+ },
+ {
+ "name": "fr category-subcat-count 1,2",
+ "key": "fr_category-subcat-count",
+ "args": [
+ 1,
+ 2
+ ],
+ "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
+ "lang": "fr"
+ },
+ {
+ "name": "fr category-subcat-count 3,30",
+ "key": "fr_category-subcat-count",
+ "args": [
+ 3,
+ 30
+ ],
+ "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
+ "lang": "fr"
+ },
+ {
+ "name": "ar undelete_short 0",
+ "key": "ar_undelete_short",
+ "args": [
+ 0
+ ],
+ "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
+ "lang": "ar"
+ },
+ {
+ "name": "ar undelete_short 1",
+ "key": "ar_undelete_short",
+ "args": [
+ 1
+ ],
+ "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
+ "lang": "ar"
+ },
+ {
+ "name": "ar undelete_short 2",
+ "key": "ar_undelete_short",
+ "args": [
+ 2
+ ],
+ "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 2 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
+ "lang": "ar"
+ },
+ {
+ "name": "ar undelete_short 5",
+ "key": "ar_undelete_short",
+ "args": [
+ 5
+ ],
+ "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644",
+ "lang": "ar"
+ },
+ {
+ "name": "ar undelete_short 21",
+ "key": "ar_undelete_short",
+ "args": [
+ 21
+ ],
+ "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627",
+ "lang": "ar"
+ },
+ {
+ "name": "ar undelete_short 101",
+ "key": "ar_undelete_short",
+ "args": [
+ 101
+ ],
+ "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644\u0627",
+ "lang": "ar"
+ },
+ {
+ "name": "ar category-subcat-count 0,10",
+ "key": "ar_category-subcat-count",
+ "args": [
+ 0,
+ 10
+ ],
+ "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
+ "lang": "ar"
+ },
+ {
+ "name": "ar category-subcat-count 1,1",
+ "key": "ar_category-subcat-count",
+ "args": [
+ 1,
+ 1
+ ],
+ "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.",
+ "lang": "ar"
+ },
+ {
+ "name": "ar category-subcat-count 1,2",
+ "key": "ar_category-subcat-count",
+ "args": [
+ 1,
+ 2
+ ],
+ "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
+ "lang": "ar"
+ },
+ {
+ "name": "ar category-subcat-count 3,30",
+ "key": "ar_category-subcat-count",
+ "args": [
+ 3,
+ 30
+ ],
+ "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0647 \u0627\u06443 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
+ "lang": "ar"
+ },
+ {
+ "name": "jp undelete_short 0",
+ "key": "jp_undelete_short",
+ "args": [
+ 0
+ ],
+ "result": "Undelete 0 edits",
+ "lang": "jp"
+ },
+ {
+ "name": "jp undelete_short 1",
+ "key": "jp_undelete_short",
+ "args": [
+ 1
+ ],
+ "result": "Undelete one edit",
+ "lang": "jp"
+ },
+ {
+ "name": "jp undelete_short 2",
+ "key": "jp_undelete_short",
+ "args": [
+ 2
+ ],
+ "result": "Undelete 2 edits",
+ "lang": "jp"
+ },
+ {
+ "name": "jp undelete_short 5",
+ "key": "jp_undelete_short",
+ "args": [
+ 5
+ ],
+ "result": "Undelete 5 edits",
+ "lang": "jp"
+ },
+ {
+ "name": "jp undelete_short 21",
+ "key": "jp_undelete_short",
+ "args": [
+ 21
+ ],
+ "result": "Undelete 21 edits",
+ "lang": "jp"
+ },
+ {
+ "name": "jp undelete_short 101",
+ "key": "jp_undelete_short",
+ "args": [
+ 101
+ ],
+ "result": "Undelete 101 edits",
+ "lang": "jp"
+ },
+ {
+ "name": "jp category-subcat-count 0,10",
+ "key": "jp_category-subcat-count",
+ "args": [
+ 0,
+ 10
+ ],
+ "result": "This category has the following 0 subcategories, out of 10 total.",
+ "lang": "jp"
+ },
+ {
+ "name": "jp category-subcat-count 1,1",
+ "key": "jp_category-subcat-count",
+ "args": [
+ 1,
+ 1
+ ],
+ "result": "This category has only the following subcategory.",
+ "lang": "jp"
+ },
+ {
+ "name": "jp category-subcat-count 1,2",
+ "key": "jp_category-subcat-count",
+ "args": [
+ 1,
+ 2
+ ],
+ "result": "This category has the following subcategory, out of 2 total.",
+ "lang": "jp"
+ },
+ {
+ "name": "jp category-subcat-count 3,30",
+ "key": "jp_category-subcat-count",
+ "args": [
+ 3,
+ 30
+ ],
+ "result": "This category has the following 3 subcategories, out of 30 total.",
+ "lang": "jp"
+ },
+ {
+ "name": "zh undelete_short 0",
+ "key": "zh_undelete_short",
+ "args": [
+ 0
+ ],
+ "result": "\u6062\u590d\u88ab\u5220\u9664\u76840\u9879\u4fee\u8ba2",
+ "lang": "zh"
+ },
+ {
+ "name": "zh undelete_short 1",
+ "key": "zh_undelete_short",
+ "args": [
+ 1
+ ],
+ "result": "\u6062\u590d\u88ab\u5220\u9664\u76841\u9879\u4fee\u8ba2",
+ "lang": "zh"
+ },
+ {
+ "name": "zh undelete_short 2",
+ "key": "zh_undelete_short",
+ "args": [
+ 2
+ ],
+ "result": "\u6062\u590d\u88ab\u5220\u9664\u76842\u9879\u4fee\u8ba2",
+ "lang": "zh"
+ },
+ {
+ "name": "zh undelete_short 5",
+ "key": "zh_undelete_short",
+ "args": [
+ 5
+ ],
+ "result": "\u6062\u590d\u88ab\u5220\u9664\u76845\u9879\u4fee\u8ba2",
+ "lang": "zh"
+ },
+ {
+ "name": "zh undelete_short 21",
+ "key": "zh_undelete_short",
+ "args": [
+ 21
+ ],
+ "result": "\u6062\u590d\u88ab\u5220\u9664\u768421\u9879\u4fee\u8ba2",
+ "lang": "zh"
+ },
+ {
+ "name": "zh undelete_short 101",
+ "key": "zh_undelete_short",
+ "args": [
+ 101
+ ],
+ "result": "\u6062\u590d\u88ab\u5220\u9664\u7684101\u9879\u4fee\u8ba2",
+ "lang": "zh"
+ },
+ {
+ "name": "zh category-subcat-count 0,10",
+ "key": "zh_category-subcat-count",
+ "args": [
+ 0,
+ 10
+ ],
+ "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52170\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670910\u4e2a\u5b50\u5206\u7c7b\u3002",
+ "lang": "zh"
+ },
+ {
+ "name": "zh category-subcat-count 1,1",
+ "key": "zh_category-subcat-count",
+ "args": [
+ 1,
+ 1
+ ],
+ "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002",
+ "lang": "zh"
+ },
+ {
+ "name": "zh category-subcat-count 1,2",
+ "key": "zh_category-subcat-count",
+ "args": [
+ 1,
+ 2
+ ],
+ "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52171\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u67092\u4e2a\u5b50\u5206\u7c7b\u3002",
+ "lang": "zh"
+ },
+ {
+ "name": "zh category-subcat-count 3,30",
+ "key": "zh_category-subcat-count",
+ "args": [
+ 3,
+ 30
+ ],
+ "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52173\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670930\u4e2a\u5b50\u5206\u7c7b\u3002",
+ "lang": "zh"
+ }
+];
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
new file mode 100644
index 00000000..46dcaa80
--- /dev/null
+++ b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
@@ -0,0 +1,389 @@
+/* spec for language & message behaviour in MediaWiki */
+
+mw.messages.set( {
+ "en_empty": "",
+ "en_simple": "Simple message",
+ "en_replace": "Simple $1 replacement",
+ "en_replace2": "Simple $1 $2 replacements",
+ "en_link": "Simple [http://example.com link to example].",
+ "en_link_replace": "Complex [$1 $2] behaviour.",
+ "en_simple_magic": "Simple {{ALOHOMORA}} message",
+ "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+ "en_undelete_empty_param": "Undelete{{PLURAL:$1|| multiple edits}}",
+ "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+ "en_escape0": "Escape \\to fantasy island",
+ "en_escape1": "I had \\$2.50 in my pocket",
+ "en_escape2": "I had {{PLURAL:$1|the absolute \\|$1\\| which came out to \\$3.00 in my C:\\\\drive| some stuff}}",
+ "en_fail": "This should fail to {{parse",
+ "en_fail_magic": "There is no such magic word as {{SIETNAME}}",
+ "en_evil": "This has <script type='text/javascript'>window.en_evil = true;</script> tags"
+} );
+
+/**
+ * Tests
+ */
+( function( mw, $, undefined ) {
+
+ describe( "mediaWiki.jqueryMsg", function() {
+
+ describe( "basic message functionality", function() {
+
+ it( "should return identity for empty string", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_empty' ).html() ).toEqual( '' );
+ } );
+
+
+ it( "should return identity for simple string", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_simple' ).html() ).toEqual( 'Simple message' );
+ } );
+
+ } );
+
+ describe( "escaping", function() {
+
+ it ( "should handle simple escaping", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_escape0' ).html() ).toEqual( 'Escape to fantasy island' );
+ } );
+
+ it ( "should escape dollar signs found in ordinary text when backslashed", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_escape1' ).html() ).toEqual( 'I had $2.50 in my pocket' );
+ } );
+
+ it ( "should handle a complicated escaping case, including escaped pipe chars in template args", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_escape2', [ 1 ] ).html() ).toEqual( 'I had the absolute |1| which came out to $3.00 in my C:\\drive' );
+ } );
+
+ } );
+
+ describe( "replacing", function() {
+
+ it ( "should handle simple replacing", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_replace', [ 'foo' ] ).html() ).toEqual( 'Simple foo replacement' );
+ } );
+
+ it ( "should return $n if replacement not there", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_replace', [] ).html() ).toEqual( 'Simple $1 replacement' );
+ expect( parser.parse( 'en_replace2', [ 'bar' ] ).html() ).toEqual( 'Simple bar $2 replacements' );
+ } );
+
+ } );
+
+ describe( "linking", function() {
+
+ it ( "should handle a simple link", function() {
+ var parser = new mw.jqueryMsg.parser();
+ var parsed = parser.parse( 'en_link' );
+ var contents = parsed.contents();
+ expect( contents.length ).toEqual( 3 );
+ expect( contents[0].nodeName ).toEqual( '#text' );
+ expect( contents[0].nodeValue ).toEqual( 'Simple ' );
+ expect( contents[1].nodeName ).toEqual( 'A' );
+ expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com' );
+ expect( contents[1].childNodes[0].nodeValue ).toEqual( 'link to example' );
+ expect( contents[2].nodeName ).toEqual( '#text' );
+ expect( contents[2].nodeValue ).toEqual( '.' );
+ } );
+
+ it ( "should replace a URL into a link", function() {
+ var parser = new mw.jqueryMsg.parser();
+ var parsed = parser.parse( 'en_link_replace', [ 'http://example.com/foo', 'linking' ] );
+ var contents = parsed.contents();
+ expect( contents.length ).toEqual( 3 );
+ expect( contents[0].nodeName ).toEqual( '#text' );
+ expect( contents[0].nodeValue ).toEqual( 'Complex ' );
+ expect( contents[1].nodeName ).toEqual( 'A' );
+ expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com/foo' );
+ expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
+ expect( contents[2].nodeName ).toEqual( '#text' );
+ expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
+ } );
+
+ it ( "should bind a click handler into a link", function() {
+ var parser = new mw.jqueryMsg.parser();
+ var clicked = false;
+ var click = function() { clicked = true; };
+ var parsed = parser.parse( 'en_link_replace', [ click, 'linking' ] );
+ var contents = parsed.contents();
+ expect( contents.length ).toEqual( 3 );
+ expect( contents[0].nodeName ).toEqual( '#text' );
+ expect( contents[0].nodeValue ).toEqual( 'Complex ' );
+ expect( contents[1].nodeName ).toEqual( 'A' );
+ expect( contents[1].getAttribute( 'href' ) ).toEqual( '#' );
+ expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
+ expect( contents[2].nodeName ).toEqual( '#text' );
+ expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
+ // determining bindings is hard in IE
+ var anchor = parsed.find( 'a' );
+ if ( ( $.browser.mozilla || $.browser.webkit ) && anchor.click ) {
+ expect( clicked ).toEqual( false );
+ anchor.click();
+ expect( clicked ).toEqual( true );
+ }
+ } );
+
+ it ( "should wrap a jquery arg around link contents -- even another element", function() {
+ var parser = new mw.jqueryMsg.parser();
+ var clicked = false;
+ var click = function() { clicked = true; };
+ var button = $( '<button>' ).click( click );
+ var parsed = parser.parse( 'en_link_replace', [ button, 'buttoning' ] );
+ var contents = parsed.contents();
+ expect( contents.length ).toEqual( 3 );
+ expect( contents[0].nodeName ).toEqual( '#text' );
+ expect( contents[0].nodeValue ).toEqual( 'Complex ' );
+ expect( contents[1].nodeName ).toEqual( 'BUTTON' );
+ expect( contents[1].childNodes[0].nodeValue ).toEqual( 'buttoning' );
+ expect( contents[2].nodeName ).toEqual( '#text' );
+ expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
+ // determining bindings is hard in IE
+ if ( ( $.browser.mozilla || $.browser.webkit ) && button.click ) {
+ expect( clicked ).toEqual( false );
+ parsed.find( 'button' ).click();
+ expect( clicked ).toEqual( true );
+ }
+ } );
+
+
+ } );
+
+
+ describe( "magic keywords", function() {
+ it( "should substitute magic keywords", function() {
+ var options = {
+ magic: {
+ 'alohomora' : 'open'
+ }
+ };
+ var parser = new mw.jqueryMsg.parser( options );
+ expect( parser.parse( 'en_simple_magic' ).html() ).toEqual( 'Simple open message' );
+ } );
+ } );
+
+ describe( "error conditions", function() {
+ it( "should return non-existent key in square brackets", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( parser.parse( 'en_does_not_exist' ).html() ).toEqual( '[en_does_not_exist]' );
+ } );
+
+
+ it( "should fail to parse", function() {
+ var parser = new mw.jqueryMsg.parser();
+ expect( function() { parser.parse( 'en_fail' ); } ).toThrow(
+ 'Parse error at position 20 in input: This should fail to {{parse'
+ );
+ } );
+ } );
+
+ describe( "empty parameters", function() {
+ it( "should deal with empty parameters", function() {
+ var parser = new mw.jqueryMsg.parser();
+ var ast = parser.getAst( 'en_undelete_empty_param' );
+ expect( parser.parse( 'en_undelete_empty_param', [ 1 ] ).html() ).toEqual( 'Undelete' );
+ expect( parser.parse( 'en_undelete_empty_param', [ 3 ] ).html() ).toEqual( 'Undelete multiple edits' );
+
+ } );
+ } );
+
+ describe( "easy message interface functions", function() {
+ it( "should allow a global that returns strings", function() {
+ var gM = mw.jqueryMsg.getMessageFunction();
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ // a surrounding <SPAN> is needed for html() to work right
+ var expectedHtml = $( '<span>Complex <a href="http://example.com/foo">linking</a> behaviour.</span>' ).html();
+ var result = gM( 'en_link_replace', 'http://example.com/foo', 'linking' );
+ expect( typeof result ).toEqual( 'string' );
+ expect( result ).toEqual( expectedHtml );
+ } );
+
+ it( "should allow a jQuery plugin that appends to nodes", function() {
+ $.fn.msg = mw.jqueryMsg.getPlugin();
+ var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
+ var clicked = false;
+ var $button = $( '<button>' ).click( function() { clicked = true; } );
+ $div.find( '.foo' ).msg( 'en_link_replace', $button, 'buttoning' );
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ // a surrounding <SPAN> is needed for html() to work right
+ var expectedHtml = $( '<span>Complex <button>buttoning</button> behaviour.</span>' ).html();
+ var createdHtml = $div.find( '.foo' ).html();
+ // it is hard to test for clicks with IE; also it inserts or removes spaces around nodes when creating HTML tags, depending on their type.
+ // so need to check the strings stripped of spaces.
+ if ( ( $.browser.mozilla || $.browser.webkit ) && $button.click ) {
+ expect( createdHtml ).toEqual( expectedHtml );
+ $div.find( 'button ').click();
+ expect( clicked ).toEqual( true );
+ } else if ( $.browser.ie ) {
+ expect( createdHtml.replace( /\s/, '' ) ).toEqual( expectedHtml.replace( /\s/, '' ) );
+ }
+ delete $.fn.msg;
+ } );
+
+ it( "jQuery plugin should escape incoming string arguments", function() {
+ $.fn.msg = mw.jqueryMsg.getPlugin();
+ var $div = $( '<div>' ).addClass( 'foo' );
+ $div.msg( 'en_replace', '<p>x</p>' ); // looks like HTML, but as a string, should be escaped.
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ var expectedHtml = $( '<div class="foo">Simple &lt;p&gt;x&lt;/p&gt; replacement</div>' ).html();
+ var createdHtml = $div.html();
+ expect( expectedHtml ).toEqual( createdHtml );
+ delete $.fn.msg;
+ } );
+
+
+ it( "jQuery plugin should never execute scripts", function() {
+ window.en_evil = false;
+ $.fn.msg = mw.jqueryMsg.getPlugin();
+ var $div = $( '<div>' );
+ $div.msg( 'en_evil' );
+ expect( window.en_evil ).toEqual( false );
+ delete $.fn.msg;
+ } );
+
+
+ // n.b. this passes because jQuery already seems to strip scripts away; however, it still executes them if they are appended to any element.
+ it( "jQuery plugin should never emit scripts", function() {
+ $.fn.msg = mw.jqueryMsg.getPlugin();
+ var $div = $( '<div>' );
+ $div.msg( 'en_evil' );
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ var expectedHtml = $( '<div>This has tags</div>' ).html();
+ var createdHtml = $div.html();
+ expect( expectedHtml ).toEqual( createdHtml );
+ console.log( 'expected: ' + expectedHtml );
+ console.log( 'created: ' + createdHtml );
+ delete $.fn.msg;
+ } );
+
+
+
+ } );
+
+ // The parser functions can throw errors, but let's not actually blow up for the user -- instead dump the error into the interface so we have
+ // a chance at fixing this
+ describe( "easy message interface functions with graceful failures", function() {
+ it( "should allow a global that returns strings, with graceful failure", function() {
+ var gM = mw.jqueryMsg.getMessageFunction();
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ // a surrounding <SPAN> is needed for html() to work right
+ var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
+ var result = gM( 'en_fail' );
+ expect( typeof result ).toEqual( 'string' );
+ expect( result ).toEqual( expectedHtml );
+ } );
+
+ it( "should allow a global that returns strings, with graceful failure on missing magic words", function() {
+ var gM = mw.jqueryMsg.getMessageFunction();
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ // a surrounding <SPAN> is needed for html() to work right
+ var expectedHtml = $( '<span>en_fail_magic: unknown operation "sietname"</span>' ).html();
+ var result = gM( 'en_fail_magic' );
+ expect( typeof result ).toEqual( 'string' );
+ expect( result ).toEqual( expectedHtml );
+ } );
+
+
+ it( "should allow a jQuery plugin, with graceful failure", function() {
+ $.fn.msg = mw.jqueryMsg.getPlugin();
+ var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
+ $div.find( '.foo' ).msg( 'en_fail' );
+ // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
+ // a surrounding <SPAN> is needed for html() to work right
+ var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
+ var createdHtml = $div.find( '.foo' ).html();
+ expect( createdHtml ).toEqual( expectedHtml );
+ delete $.fn.msg;
+ } );
+
+ } );
+
+
+
+
+ describe( "test plurals and other language-specific functions", function() {
+ /* copying some language definitions in here -- it's hard to make this test fast and reliable
+ otherwise, and we don't want to have to know the mediawiki URL from this kind of test either.
+ We also can't preload the langs for the test since they clobber the same namespace.
+ In principle Roan said it was okay to change how languages worked so that didn't happen... maybe
+ someday. We'd have to the same kind of importing of the default rules for most rules, or maybe
+ come up with some kind of subclassing scheme for languages */
+ var languageClasses = {
+ ar: {
+ /**
+ * Arabic (العربية) language functions
+ */
+
+ convertPlural: function( count, forms ) {
+ forms = mw.language.preConvertPlural( forms, 6 );
+ if ( count === 0 ) {
+ return forms[0];
+ }
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ if ( count % 100 >= 3 && count % 100 <= 10 ) {
+ return forms[3];
+ }
+ if ( count % 100 >= 11 && count % 100 <= 99 ) {
+ return forms[4];
+ }
+ return forms[5];
+ },
+
+ digitTransformTable: {
+ '0': 'Ù ', // &#x0660;
+ '1': 'Ù¡', // &#x0661;
+ '2': 'Ù¢', // &#x0662;
+ '3': 'Ù£', // &#x0663;
+ '4': 'Ù¤', // &#x0664;
+ '5': 'Ù¥', // &#x0665;
+ '6': 'Ù¦', // &#x0666;
+ '7': 'Ù§', // &#x0667;
+ '8': 'Ù¨', // &#x0668;
+ '9': 'Ù©', // &#x0669;
+ '.': 'Ù«', // &#x066b; wrong table ?
+ ',': 'Ù¬' // &#x066c;
+ }
+
+ },
+ en: { },
+ fr: {
+ convertPlural: function( count, forms ) {
+ forms = mw.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+ }
+ },
+ jp: { },
+ zh: { }
+ };
+
+ /* simulate how the language classes override, or don't, the standard functions in mw.language */
+ $.each( languageClasses, function( langCode, rules ) {
+ $.each( [ 'convertPlural', 'convertNumber' ], function( i, propertyName ) {
+ if ( typeof rules[ propertyName ] === 'undefined' ) {
+ rules[ propertyName ] = mw.language[ propertyName ];
+ }
+ } );
+ } );
+
+ $.each( jasmineMsgSpec, function( i, test ) {
+ it( "should parse " + test.name, function() {
+ // using language override so we don't have to muck with global namespace
+ var parser = new mw.jqueryMsg.parser( { language: languageClasses[ test.lang ] } );
+ var parsedHtml = parser.parse( test.key, test.args ).html();
+ expect( parsedHtml ).toEqual( test.result );
+ } );
+ } );
+
+ } );
+
+ } );
+} )( window.mediaWiki, jQuery );
diff --git a/tests/jasmine/spec_makers/makeJqueryMsgSpec.php b/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
new file mode 100644
index 00000000..1ac8dcba
--- /dev/null
+++ b/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * This PHP script defines the spec that the Javascript message parser should conform to.
+ *
+ * It does this by looking up the results of various string kinds of string parsing, with various languages,
+ * in the current installation of MediaWiki. It then outputs a static specification, mapping expected inputs to outputs,
+ * which can be used with the JasmineBDD framework. This specification can then be used by simply including it into
+ * the SpecRunner.html file.
+ *
+ * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the
+ * API results while doing the test, so the Jasmine run is much faster(at the cost of being out of date in rare
+ * circumstances. But mostly the parsing that we are doing in Javascript doesn't change much.)
+ *
+ */
+
+$maintenanceDir = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) ) . '/maintenance';
+
+require( "$maintenanceDir/Maintenance.php" );
+
+class MakeLanguageSpec extends Maintenance {
+
+ static $keyToTestArgs = array(
+ 'undelete_short' => array(
+ array( 0 ),
+ array( 1 ),
+ array( 2 ),
+ array( 5 ),
+ array( 21 ),
+ array( 101 )
+ ),
+ 'category-subcat-count' => array(
+ array( 0, 10 ),
+ array( 1, 1 ),
+ array( 1, 2 ),
+ array( 3, 30 )
+ )
+ );
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Create a JasmineBDD-compatible specification for message parsing";
+ // add any other options here
+ }
+
+ public function execute() {
+ list( $messages, $tests ) = $this->getMessagesAndTests();
+ $this->writeJavascriptFile( $messages, $tests, "spec/mediawiki.language.parser.spec.data.js" );
+ }
+
+ private function getMessagesAndTests() {
+ $messages = array();
+ $tests = array();
+ $wfMsgExtOptions = array( 'parsemag' );
+ foreach ( array( 'en', 'fr', 'ar', 'jp', 'zh' ) as $languageCode ) {
+ $wfMsgExtOptions['language'] = $languageCode;
+ foreach ( self::$keyToTestArgs as $key => $testArgs ) {
+ foreach ($testArgs as $args) {
+ // get the raw template, without any transformations
+ $template = wfMsgGetKey( $key, /* useDb */ true, $languageCode, /* transform */ false );
+
+ // get the magic-parsed version with args
+ $wfMsgExtArgs = array_merge( array( $key, $wfMsgExtOptions ), $args );
+ $result = call_user_func_array( 'wfMsgExt', $wfMsgExtArgs );
+
+ // record the template, args, language, and expected result
+ // fake multiple languages by flattening them together
+ $langKey = $languageCode . '_' . $key;
+ $messages[ $langKey ] = $template;
+ $tests[] = array(
+ 'name' => $languageCode . " " . $key . " " . join( ",", $args ),
+ 'key' => $langKey,
+ 'args' => $args,
+ 'result' => $result,
+ 'lang' => $languageCode
+ );
+ }
+ }
+ }
+ return array( $messages, $tests );
+ }
+
+ private function writeJavascriptFile( $messages, $tests, $dataSpecFile ) {
+ global $argv;
+ $arguments = count($argv) ? $argv : $_SERVER[ 'argv' ];
+
+ $json = new Services_JSON;
+ $json->pretty = true;
+ $javascriptPrologue = "// This file stores the results from the PHP parser for certain messages and arguments,\n"
+ . "// so we can test the equivalent Javascript libraries.\n"
+ . '// Last generated with ' . join(' ', $arguments) . ' at ' . gmdate('c') . "\n\n";
+ $javascriptMessages = "mediaWiki.messages.set( " . $json->encode( $messages, true ) . " );\n";
+ $javascriptTests = 'var jasmineMsgSpec = ' . $json->encode( $tests, true ) . ";\n";
+
+ $fp = fopen( $dataSpecFile, 'w' );
+ if ( !$fp ) {
+ die( "couldn't open $dataSpecFile for writing" );
+ }
+ $success = fwrite( $fp, $javascriptPrologue . $javascriptMessages . $javascriptTests );
+ if ( !$success ) {
+ die( "couldn't write to $dataSpecFile" );
+ }
+ $success = fclose( $fp );
+ if ( !$success ) {
+ die( "couldn't close $dataSpecFile" );
+ }
+ }
+}
+
+$maintClass = "MakeLanguageSpec";
+require_once( "$maintenanceDir/doMaintenance.php" );
+
+
+
diff --git a/tests/parser/README b/tests/parser/README
new file mode 100644
index 00000000..8b413376
--- /dev/null
+++ b/tests/parser/README
@@ -0,0 +1,8 @@
+Parser tests are run using our PHPUnit test suite in tests/phpunit:
+
+ $ cd tests/phpunit
+ ./phpunit.php --group Parser
+
+You can optionally filter by title using --regex. I.e. :
+
+ ./phpunit.php --group Parser --regex="Bug 6200"
diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc
index 0ce7c997..30e451b3 100644
--- a/tests/parser/parserTest.inc
+++ b/tests/parser/parserTest.inc
@@ -105,6 +105,9 @@ class ParserTest {
$this->showOutput = isset( $options['show-output'] );
+ if ( isset( $options['filter'] ) ) {
+ $options['regex'] = $options['filter'];
+ }
if ( isset( $options['regex'] ) ) {
if ( isset( $options['record'] ) ) {
@@ -132,45 +135,65 @@ class ParserTest {
}
static function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgDeferredUpdateList,
+ global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
$wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
$wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
$parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath;
+ $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
+ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
$wgScript = '/index.php';
$wgScriptPath = '/';
$wgArticlePath = '/wiki/$1';
$wgStyleSheetPath = '/skins';
$wgStylePath = '/skins';
+ $wgExtensionAssetsPath = '/extensions';
$wgThumbnailScriptPath = false;
$wgLocalFileRepo = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => wfTempDir() . '/test-repo',
- 'url' => 'http://example.com/images',
- 'deletedDir' => wfTempDir() . '/test-repo/delete',
- 'hashLevels' => 2,
+ 'class' => 'LocalRepo',
+ 'name' => 'local',
+ 'url' => 'http://example.com/images',
+ 'hashLevels' => 2,
'transformVia404' => false,
+ 'backend' => new FSFileBackend( array(
+ 'name' => 'local-backend',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ 'local-public' => wfTempDir() . '/test-repo/public',
+ 'local-thumb' => wfTempDir() . '/test-repo/thumb',
+ 'local-temp' => wfTempDir() . '/test-repo/temp',
+ 'local-deleted' => wfTempDir() . '/test-repo/deleted',
+ )
+ ) )
);
$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
$wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
+ // XXX: tests won't run without this (for CACHE_DB)
+ if ( $wgMainCacheType === CACHE_DB ) {
+ $wgMainCacheType = CACHE_NONE;
+ }
+ if ( $wgMessageCacheType === CACHE_DB ) {
+ $wgMessageCacheType = CACHE_NONE;
+ }
+ if ( $wgParserCacheType === CACHE_DB ) {
+ $wgParserCacheType = CACHE_NONE;
+ }
$wgEnableParserCache = false;
- $wgDeferredUpdateList = array();
- $wgMemc = wfGetMainCache();
+ DeferredUpdates::clearPendingUpdates();
+ $wgMemc = wfGetMainCache(); // checks $wgMainCacheType
$messageMemc = wfGetMessageCacheStorage();
$parserMemc = wfGetParserCacheStorage();
// $wgContLang = new StubContLang;
$wgUser = new User;
$context = new RequestContext;
- $wgLang = $context->getLang();
+ $wgLang = $context->getLanguage();
$wgOut = $context->getOutput();
$wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = new WebRequest;
+ $wgRequest = $context->getRequest();
if ( $wgStyleDirectory === false ) {
$wgStyleDirectory = "$IP/skins";
@@ -423,10 +446,10 @@ class ParserTest {
}
$opts = $this->parseOptions( $opts );
- $this->setupGlobals( $opts, $config );
+ $context = $this->setupGlobals( $opts, $config );
- $user = new User();
- $options = ParserOptions::newFromUser( $user );
+ $user = $context->getUser();
+ $options = ParserOptions::newFromContext( $context );
if ( isset( $opts['title'] ) ) {
$titleText = $opts['title'];
@@ -452,8 +475,7 @@ class ParserTest {
$replace = $opts['replace'][1];
$out = $parser->replaceSection( $input, $section, $replace );
} elseif ( isset( $opts['comment'] ) ) {
- $linker = $user->getSkin();
- $out = $linker->formatComment( $input, $title, $local );
+ $out = Linker::formatComment( $input, $title, $local );
} elseif ( isset( $opts['preload'] ) ) {
$out = $parser->getpreloadText( $input, $title, $options );
} else {
@@ -471,10 +493,9 @@ class ParserTest {
if ( isset( $opts['ill'] ) ) {
$out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
} elseif ( isset( $opts['cat'] ) ) {
- global $wgOut;
-
- $wgOut->addCategoryLinks( $output->getCategories() );
- $cats = $wgOut->getCategoryLinks();
+ $outputPage = $context->getOutput();
+ $outputPage->addCategoryLinks( $output->getCategories() );
+ $cats = $outputPage->getCategoryLinks();
if ( isset( $cats['normal'] ) ) {
$out = $this->tidy( implode( ' ', $cats['normal'] ) );
@@ -609,10 +630,19 @@ class ParserTest {
'wgLocalFileRepo' => array(
'class' => 'LocalRepo',
'name' => 'local',
- 'directory' => $this->uploadDir,
'url' => 'http://example.com/images',
'hashLevels' => 2,
'transformVia404' => false,
+ 'backend' => new FSFileBackend( array(
+ 'name' => 'local-backend',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ 'local-public' => $this->uploadDir,
+ 'local-thumb' => $this->uploadDir . '/thumb',
+ 'local-temp' => $this->uploadDir . '/temp',
+ 'local-deleted' => $this->uploadDir . '/delete',
+ )
+ ) )
),
'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
'wgStylePath' => '/skins',
@@ -650,6 +680,7 @@ class ParserTest {
'wgExternalLinkTarget' => false,
'wgAlwaysUseTidy' => false,
'wgHtml5' => true,
+ 'wgCleanupPresentationalAttributes' => true,
'wgWellFormedXml' => true,
'wgAllowMicrodataAttributes' => true,
'wgAdaptiveMessageCache' => true,
@@ -681,7 +712,7 @@ class ParserTest {
$GLOBALS['wgMemc'] = new EmptyBagOStuff;
$context = new RequestContext();
- $GLOBALS['wgLang'] = $context->getLang();
+ $GLOBALS['wgLang'] = $context->getLanguage();
$GLOBALS['wgOut'] = $context->getOutput();
$GLOBALS['wgUser'] = new User();
@@ -689,10 +720,11 @@ class ParserTest {
global $wgHooks;
$wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserTestParser'][] = 'ParserTestStaticParserHook::setup';
$wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
MagicWord::clearCache();
+
+ return $context;
}
/**
@@ -700,7 +732,7 @@ class ParserTest {
* Some of these probably aren't necessary.
*/
private function listTables() {
- $tables = array( 'user', 'user_properties', 'page', 'page_restrictions',
+ $tables = array( 'user', 'user_properties', 'user_former_groups', 'page', 'page_restrictions',
'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks',
'categorylinks', 'templatelinks', 'externallinks', 'langlinks', 'iwlinks',
'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage',
@@ -709,8 +741,9 @@ class ParserTest {
'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links'
);
- if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) )
+ if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) ) {
array_push( $tables, 'searchindex' );
+ }
// Allow extensions to add to the list of tables to duplicate;
// may be necessary if they hook into page save or other code
@@ -753,17 +786,14 @@ class ParserTest {
}
$temporary = $this->useTemporaryTables || $dbType == 'postgres';
- $tables = $this->listTables();
$prefix = $dbType != 'oracle' ? 'parsertest_' : 'pt_';
$this->dbClone = new CloneDatabase( $this->db, $this->listTables(), $prefix );
$this->dbClone->useTemporaryTables( $temporary );
$this->dbClone->cloneTableStructure();
- if ( $dbType == 'oracle' )
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-
if ( $dbType == 'oracle' ) {
+ $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
# Insert 0 user to prevent FK violations
# Anonymous user
@@ -807,7 +837,6 @@ class ParserTest {
'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 ) );
@@ -908,9 +937,9 @@ class ParserTest {
return $dir;
}
- wfMkdirParents( $dir . '/3/3a' );
+ wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
- wfMkdirParents( $dir . '/0/09' );
+ wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
return $dir;
@@ -1077,7 +1106,9 @@ class ParserTest {
$shellInfile = wfEscapeShellArg($infile);
$shellOutfile = wfEscapeShellArg($outfile);
- $diff = wfIsWindows()
+ global $wgDiff3;
+ // we assume that people with diff3 also have usual diff
+ $diff = ( wfIsWindows() && !$wgDiff3 )
? `fc $shellInfile $shellOutfile`
: `diff -au $shellInfile $shellOutfile`;
unlink( $infile );
@@ -1130,30 +1161,35 @@ class ParserTest {
* @param $name String: the title, including any prefix
* @param $text String: the article text
* @param $line Integer: the input line number, for reporting errors
+ * @param $ignoreDuplicate Boolean: whether to silently ignore duplicate pages
*/
- static public function addArticle( $name, $text, $line = 'unknown' ) {
+ static public function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) {
global $wgCapitalLinks;
- $text = self::chomp($text);
-
$oldCapitalLinks = $wgCapitalLinks;
$wgCapitalLinks = true; // We only need this from SetupGlobals() See r70917#c8637
+ $text = self::chomp( $text );
$name = self::chomp( $name );
+
$title = Title::newFromText( $name );
if ( is_null( $title ) ) {
- throw new MWException( "invalid title ('$name' => '$title') at line $line\n" );
+ throw new MWException( "invalid title '$name' at line $line\n" );
}
- $aid = $title->getArticleID( Title::GAID_FOR_UPDATE );
+ $page = WikiPage::factory( $title );
+ $page->loadPageData( 'fromdbmaster' );
- if ( $aid != 0 ) {
- throw new MWException( "duplicate article '$name' at line $line\n" );
+ if ( $page->exists() ) {
+ if ( $ignoreDuplicate == 'ignoreduplicate' ) {
+ return;
+ } else {
+ throw new MWException( "duplicate article '$name' at line $line\n" );
+ }
}
- $art = new Article( $title );
- $art->doEdit( $text, '', EDIT_NEW );
+ $page->doEdit( $text, '', EDIT_NEW );
$wgCapitalLinks = $oldCapitalLinks;
}
@@ -1204,7 +1240,7 @@ class ParserTest {
return true;
}
- /*
+ /**
* Run the "tidy" command on text if the $wgUseTidy
* global is true
*
diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
index 999cd717..d304b19c 100644
--- a/tests/parser/parserTests.txt
+++ b/tests/parser/parserTests.txt
@@ -615,6 +615,26 @@ disabled
</dl>
!! end
+!! test
+Definition and unordered list using wiki syntax nested in unordered list using html tags.
+!! input
+<ul><li>
+; term : description
+* unordered
+</li>
+</ul>
+!! result
+<ul><li>
+<dl><dt> term&#160;</dt><dd> description
+</dd></dl>
+<ul><li> unordered
+</li></ul>
+</li>
+</ul>
+
+!! end
+
+
###
### External links
###
@@ -1050,8 +1070,10 @@ http://www.example.com/?title=AT%26T
</p>
!! end
+# According to http://dev.w3.org/html5/spec/Overview.html#parsing-urls a plain
+# % is actually legal in HTML5. Any change in output would need testing though.
!! test
-Bug 4781, 5267: %26 in URL
+Bug 4781, 5267: %25 in URL
!! input
http://www.example.com/?title=100%25_Bran
!! result
@@ -1169,6 +1191,29 @@ URL-encoding in URL functions (multiple parameters)
</p>
!! end
+!! test
+Brackets in urls
+!! input
+http://example.com/index.php?foozoid%5B%5D=bar
+
+http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
+!! result
+<p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
+</p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
+</p>
+!! end
+
+!! test
+IPv6 urls (bug 21261)
+!! options
+disabled
+!! input
+http://[2404:130:0:1000::187:2]/index.php
+!! result
+<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
+</p>
+!! end
+
###
### Quotes
###
@@ -1346,7 +1391,7 @@ Multiplication table
!! test
Table rowspan
!! input
-{| align=right border=1
+{| border=1
| Cell 1, row 1
|rowspan=2| Cell 2, row 1 (and 2)
| Cell 3, row 1
@@ -1355,7 +1400,7 @@ Table rowspan
| Cell 3, row 2
|}
!! result
-<table align="right" border="1">
+<table border="1">
<tr>
<td> Cell 1, row 1
</td>
@@ -1435,6 +1480,28 @@ Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitec
!! end
+!! test
+Indented table markup mixed with indented pre content (proposed in bug 6200)
+!! input
+ <table>
+ <tr>
+ <td>
+ Text that should be rendered preformatted
+ </td>
+ </tr>
+ </table>
+!! result
+ <table>
+ <tr>
+ <td>
+<pre>Text that should be rendered preformatted
+</pre>
+ </td>
+ </tr>
+ </table>
+
+!! end
+
###
### Internal links
@@ -1872,7 +1939,7 @@ Inline interwiki link with empty title (bug 2372)
!! input
[[MeatBall:]]
!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?" class="extiw" title="meatball:">MeatBall:</a>
+<p><a href="http://www.usemod.com/cgi-bin/mb.pl" class="extiw" title="meatball:">MeatBall:</a>
</p>
!! end
@@ -1969,13 +2036,13 @@ Incorrecly removing closing slashes from correctly formed XHTML
!! test
Failing to transform badly formed HTML into correct XHTML
!! input
-<br clear=left>
-<br clear=right>
-<br clear=all>
+<br style="clear: left;">
+<br style="clear: right;">
+<br style="clear: both;">
!! result
-<p><br clear="left" />
-<br clear="right" />
-<br clear="all" />
+<p><br style="clear: left;" />
+<br style="clear: right;" />
+<br style="clear: both;" />
</p>
!!end
@@ -3027,35 +3094,6 @@ section=1
!! result
==Section 1==
!! end
-!! article
-Template:Top-level template
-!! text
-{{Nested template}}
-!! endarticle
-
-!! article
-Template:Nested template
-!! text
-*Item 1
-*Item 2
-!! endarticle
-
-!! test
-Line-start flag in a nested template call
-!! input
-*Item A
-*Item B
-
-{{Top-level template}}
-!! result
-<ul><li>Item A
-</li><li>Item B
-</li></ul>
-<ul><li>Item 1
-</li><li>Item 2
-</li></ul>
-
-!! end
###
### Pre-save transform tests
@@ -3421,6 +3459,66 @@ pst title=[[Ns:Somearticle (IGNORED), Context]]
!! end
!! test
+pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
+!! options
+pst
+!! input
+[[Article(context)|]]
+[[Bar:Article(context)|]]
+[[:Bar:Article(context)|]]
+[[|Article(context)]]
+[[Bar:X (Y) Z|]]
+[[:Bar:X (Y) Z|]]
+!! result
+[[Article(context)|Article]]
+[[Bar:Article(context)|Article]]
+[[:Bar:Article(context)|Article]]
+[[Article(context)]]
+[[Bar:X (Y) Z|X (Y) Z]]
+[[:Bar:X (Y) Z|X (Y) Z]]
+!! end
+
+!! test
+pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
+!! options
+pst
+!! input
+[[Article (context)|]]
+[[Bar:Article (context)|]]
+[[:Bar:Article (context)|]]
+[[|Article (context)]]
+[[Bar:X (Y) Z|]]
+[[:Bar:X (Y) Z|]]
+!! result
+[[Article (context)|Article]]
+[[Bar:Article (context)|Article]]
+[[:Bar:Article (context)|Article]]
+[[Article (context)]]
+[[Bar:X (Y) Z|X (Y) Z]]
+[[:Bar:X (Y) Z|X (Y) Z]]
+!! end
+
+!! test
+pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
+!! options
+pst
+!! input
+[[Article(context)|]]
+[[Bar:Article(context)|]]
+[[:Bar:Article(context)|]]
+[[|Article(context)]]
+[[Bar:X(Y)Z|]]
+[[:Bar:X(Y)Z|]]
+!! result
+[[Article(context)|Article]]
+[[Bar:Article(context)|Article]]
+[[:Bar:Article(context)|Article]]
+[[Article(context)]]
+[[Bar:X(Y)Z|X(Y)Z]]
+[[:Bar:X(Y)Z|X(Y)Z]]
+!! end
+
+!! test
pre-save transform: trim trailing empty lines
!! options
pst
@@ -4487,9 +4585,9 @@ div with unquoted attribute
!! test
div with illegal double attributes
!! input
-<div align="center" align="right">HTML rocks</div>
+<div id="a" id="b">HTML rocks</div>
!! result
-<div align="right">HTML rocks</div>
+<div id="b">HTML rocks</div>
!!end
@@ -4519,9 +4617,9 @@ Table multiple attributes correction
!! test
DIV IN UPPERCASE
!! input
-<DIV ALIGN="center">HTML ROCKS</DIV>
+<DIV ID="x">HTML ROCKS</DIV>
!! result
-<div align="center">HTML ROCKS</div>
+<div id="x">HTML ROCKS</div>
!!end
@@ -8381,7 +8479,17 @@ comment title=[[Main Page]]
!! input
/* External links */ removed bogus entries
!! result
-<span class="autocomment"><a href="/wiki/Main_Page#External_links" title="Main Page">→</a>External links: </span> removed bogus entries
+<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
+Edit comment with section link and text before it (non-local, eg in history list)
+!! options
+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>
!!end
!! test
@@ -8391,7 +8499,7 @@ comment local title=[[Main Page]]
!! input
/* External links */ removed bogus entries
!! result
-<span class="autocomment"><a href="#External_links">→</a>External links: </span> removed bogus entries
+<a href="#External_links">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
!!end
!! test
@@ -8478,7 +8586,7 @@ title=[[Main Page]]
!!input
/* __hello__world__ */
!! result
-<span class="autocomment"><a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>__hello__world__</span>
+<a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">__hello__world__</span></span>
!! end
!! test
@@ -8493,6 +8601,8 @@ comment
!! test
Bad images - basic functionality
+!! options
+disabled
!! input
[[File:Bad.jpg]]
!! result
@@ -8500,6 +8610,8 @@ Bad images - basic functionality
!! test
Bad images - bug 16039: text after bad image disappears
+!! options
+disabled
!! input
Foo bar
[[File:Bad.jpg]]
@@ -8713,6 +8825,33 @@ Text&apos;s been normalized?
</p>
!! end
+!! test
+Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
+!! input
+http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
+!! result
+<p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> &lt;-- U+3000 (vim: ^Vu3000)
+</p>
+!! end
+
+!! test
+Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
+!! input
+[http://www.example.org/ ideograms]
+!! result
+<p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
+</p>
+!! end
+
+!! test
+Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
+!! input
+http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
+!! result
+<p><img src="http://www.example.org/pic.png" alt="pic.png" /> &lt;-- U+3000 (vim: ^Vu3000)
+</p>
+!! end
+
!! article
Mediawiki:loop1
!! text
@@ -8743,6 +8882,22 @@ Bug 31098 Template which includes system messages which includes the template
!! end
!! test
+Deprecated presentational attributes are converted to css
+!! input
+{|
+| valign=top align=left width=100 height=25% | Asdf
+|}
+<ul type="disc"></ul>
+!! result
+<table>
+<tr>
+<td style="text-align: left; height: 25%; vertical-align: top; width: 100px;"> Asdf
+</td></tr></table>
+<ul style="list-style-type: disc;"></ul>
+
+!! end
+
+!! test
Bug31490 Turkish: ucfirst 'blah'
!! options
language=tr
@@ -8797,6 +8952,132 @@ language=en
</p>
!! end
+!! test
+Bug 26375: TOC with italics
+!! options
+title=[[Main Page]]
+!! input
+__TOC__
+== ''Lost'' episodes ==
+!! result
+<table id="toc" class="toc"><tr><td><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>
+
+!! end
+
+!! test
+Bug 26375: TOC with bold
+!! options
+title=[[Main Page]]
+!! input
+__TOC__
+== '''should be bold''' then normal text ==
+!! result
+<table id="toc" class="toc"><tr><td><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>
+
+!! end
+
+!! test
+Bug 33845: Headings become cursive in TOC when they contain an image
+!! options
+title=[[Main Page]]
+!! input
+__TOC__
+== Image [[Image:foobar.jpg]] ==
+!! result
+<table id="toc" class="toc"><tr><td><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>
+
+!! end
+
+!! test
+Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
+!! options
+title=[[Main Page]]
+!! input
+__TOC__
+== <blockquote>Quote</blockquote> ==
+!! result
+<table id="toc" class="toc"><tr><td><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>
+
+!! end
+
+!! test
+Unclosed tags in TOC
+!! options
+title=[[Main Page]]
+!! input
+__TOC__
+== Proof: 2 < 3 ==
+<small>Hanc marginis exiguitas non caperet.</small>
+QED
+!! result
+<table id="toc" class="toc"><tr><td><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>
+<p><small>Hanc marginis exiguitas non caperet.</small>
+QED
+</p>
+!! end
+
+!! test
+Multiple tags in TOC
+!! input
+__TOC__
+== <i>Foo</i> <b>Bar</b> ==
+
+== <i>Foo</i> <blockquote>Bar</blockquote> ==
+!! result
+<table id="toc" class="toc"><tr><td><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>
+
+!! end
+
+!! test
+Tags with parameters in TOC
+!! input
+__TOC__
+== <sup class="in-h2">Hello</sup> ==
+
+== <sup class="a > b">Evilbye</sup> ==
+!! result
+<table id="toc" class="toc"><tr><td><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>
+
+!! end
!! article
MediaWiki:Bug32057
@@ -8895,6 +9176,15 @@ Strip marker in anchorencode
</p>
!! end
+!! test
+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>
+
+!! end
+
TODO:
more images
diff --git a/tests/parser/parserTestsParserHook.php b/tests/parser/parserTestsParserHook.php
index 324b8e5c..24d852c5 100644
--- a/tests/parser/parserTestsParserHook.php
+++ b/tests/parser/parserTestsParserHook.php
@@ -29,7 +29,7 @@ class ParserTestParserHook {
static function setup( &$parser ) {
$parser->setHook( 'tag', array( __CLASS__, 'dumpHook' ) );
-
+ $parser->setHook( 'statictag', array( __CLASS__, 'staticTagHook' ) );
return true;
}
@@ -43,4 +43,28 @@ class ParserTestParserHook {
return "<pre>\n$ret</pre>";
}
+
+ static function staticTagHook( $in, $argv, $parser ) {
+ if ( ! count( $argv ) ) {
+ $parser->static_tag_buf = $in;
+ return '';
+ } elseif ( count( $argv ) === 1 && isset( $argv['action'] )
+ && $argv['action'] === 'flush' && $in === null )
+ {
+ // Clear the buffer, we probably don't need to
+ if ( isset( $parser->static_tag_buf ) ) {
+ $tmp = $parser->static_tag_buf;
+ } else {
+ $tmp = '';
+ }
+ $parser->static_tag_buf = null;
+ return $tmp;
+ } else
+ // wtf?
+ return
+ "\nCall this extension as <statictag>string</statictag> or as" .
+ " <statictag action=flush/>, not in any other way.\n" .
+ "text: " . var_export( $in, true ) . "\n" .
+ "argv: " . var_export( $argv, true ) . "\n";
+ }
}
diff --git a/tests/parser/parserTestsStaticParserHook.php b/tests/parser/parserTestsStaticParserHook.php
deleted file mode 100644
index e82f7f3f..00000000
--- a/tests/parser/parserTestsStaticParserHook.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * A basic extension that's used by the parser tests to test whether the parser
- * calls extensions when they're called inside comments, it shouldn't do that
- *
- * Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Testing
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- */
-
-class ParserTestStaticParserHook {
- static function setup( &$parser ) {
- $parser->setHook( 'statictag', array( __CLASS__, 'hook' ) );
-
- return true;
- }
-
- static function hook( $in, $argv, $parser ) {
- if ( ! count( $argv ) ) {
- $parser->static_tag_buf = $in;
- return '';
- } elseif ( count( $argv ) === 1 && isset( $argv['action'] )
- && $argv['action'] === 'flush' && $in === null )
- {
- // Clear the buffer, we probably don't need to
- if ( isset( $parser->static_tag_buf ) ) {
- $tmp = $parser->static_tag_buf;
- } else {
- $tmp = '';
- }
- $parser->static_tag_buf = null;
- return $tmp;
- } else
- // wtf?
- return
- "\nCall this extension as <statictag>string</statictag> or as" .
- " <statictag action=flush/>, not in any other way.\n" .
- "text: " . var_export( $in, true ) . "\n" .
- "argv: " . var_export( $argv, true ) . "\n";
- }
-}
diff --git a/tests/parser/preprocess/All_system_messages.expected b/tests/parser/preprocess/All_system_messages.expected
index 96d4569b..897c5fb0 100644
--- a/tests/parser/preprocess/All_system_messages.expected
+++ b/tests/parser/preprocess/All_system_messages.expected
@@ -1,4 +1,4 @@
-<root><template lineStart="1"><title>int:allmessagestext</title></template>
+<root><template><title>int:allmessagestext</title></template>
&lt;table border=1 width=100%&gt;&lt;tr&gt;&lt;td&gt;
'''Name'''
diff --git a/tests/parser/preprocess/Factorial.expected b/tests/parser/preprocess/Factorial.expected
index 099029c0..a10fd6ca 100644
--- a/tests/parser/preprocess/Factorial.expected
+++ b/tests/parser/preprocess/Factorial.expected
@@ -1,4 +1,4 @@
-<root><template lineStart="1"><title>#expr:<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=00</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>01<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=01</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*01<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=02</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*02<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=03</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*03<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=04</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*04<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=05</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*05<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=06</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*06<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=07</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*07<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=08</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*08<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=09</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*09<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=10</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*10<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=11</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*11<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=12</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*12<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=13</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*13<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=14</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*14<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=15</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*15<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=16</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*16<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=17</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*17<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=18</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*18<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=19</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*19<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=20</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*20<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=21</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*21<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=22</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*22<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=23</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*23<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=24</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*24<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=25</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*25<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=26</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*26<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=27</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*27<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=28</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*28<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=29</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*29<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=30</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*30<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=31</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*31<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=32</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*32<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=33</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*33<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=34</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*34<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=35</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*35<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=36</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*36<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=37</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*37<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=38</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*38<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=39</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*39<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=40</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*40<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=41</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*41<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=42</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*42<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=43</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*43<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=44</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*44<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=45</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*45<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=46</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*46<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=47</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*47<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=48</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*48<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=49</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*49<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=50</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*50<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=51</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*51<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=52</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*52<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=53</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*53<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=54</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*54<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=55</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*55<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=56</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*56<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=57</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*57<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=58</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*58<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=59</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*59<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=60</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*60<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=61</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*61<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=62</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*62<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=63</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*63<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=64</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*64<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=65</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*65<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=66</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*66<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=67</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*67<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=68</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*68<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=69</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*69<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=70</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*70<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=71</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*71<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=72</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*72<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=73</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*73<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=74</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*74<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=75</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*75<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=76</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*76<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=77</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*77<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=78</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*78<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=79</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*79<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=80</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*80<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=81</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*81<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=82</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*82<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=83</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*83<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=84</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*84<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=85</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*85<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=86</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*86<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=87</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*87<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=88</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*88<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=89</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*89<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=90</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*90<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=91</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*91<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=92</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*92<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=93</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*93<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=94</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*94<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=95</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*95<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=96</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*96<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=97</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*97<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=98</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*98<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=99</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*99</value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></title></template><ignore>&lt;noinclude&gt;</ignore>
+<root><template><title>#expr:<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=00</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>01<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=01</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*01<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=02</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*02<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=03</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*03<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=04</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*04<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=05</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*05<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=06</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*06<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=07</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*07<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=08</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*08<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=09</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*09<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=10</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*10<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=11</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*11<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=12</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*12<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=13</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*13<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=14</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*14<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=15</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*15<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=16</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*16<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=17</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*17<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=18</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*18<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=19</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*19<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=20</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*20<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=21</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*21<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=22</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*22<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=23</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*23<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=24</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*24<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=25</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*25<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=26</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*26<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=27</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*27<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=28</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*28<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=29</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*29<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=30</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*30<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=31</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*31<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=32</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*32<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=33</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*33<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=34</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*34<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=35</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*35<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=36</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*36<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=37</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*37<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=38</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*38<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=39</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*39<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=40</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*40<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=41</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*41<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=42</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*42<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=43</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*43<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=44</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*44<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=45</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*45<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=46</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*46<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=47</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*47<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=48</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*48<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=49</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*49<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=50</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*50<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=51</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*51<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=52</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*52<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=53</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*53<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=54</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*54<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=55</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*55<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=56</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*56<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=57</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*57<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=58</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*58<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=59</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*59<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=60</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*60<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=61</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*61<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=62</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*62<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=63</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*63<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=64</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*64<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=65</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*65<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=66</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*66<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=67</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*67<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=68</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*68<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=69</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*69<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=70</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*70<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=71</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*71<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=72</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*72<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=73</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*73<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=74</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*74<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=75</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*75<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=76</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*76<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=77</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*77<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=78</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*78<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=79</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*79<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=80</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*80<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=81</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*81<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=82</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*82<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=83</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*83<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=84</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*84<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=85</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*85<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=86</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*86<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=87</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*87<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=88</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*88<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=89</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*89<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=90</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*90<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=91</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*91<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=92</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*92<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=93</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*93<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=94</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*94<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=95</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*95<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=96</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*96<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=97</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*97<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=98</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*98<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=99</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*99</value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></title></template><ignore>&lt;noinclude&gt;</ignore>
<template lineStart="1"><title>Template documentation</title></template>
This template finds the [[factorial]] of a number. To use it, enter:&lt;br /&gt;
&lt;code&gt;&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>input</value></part></template>&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
diff --git a/tests/parserTests.php b/tests/parserTests.php
index 99ea2ed4..d930ac5a 100644
--- a/tests/parserTests.php
+++ b/tests/parserTests.php
@@ -24,8 +24,8 @@
* @ingroup Testing
*/
-$options = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
-$optionsWithArgs = array( 'regex', 'seed', 'setversion' );
+$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
+$optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
require_once( dirname( __FILE__ ) . '/../maintenance/commandLine.inc' );
@@ -39,13 +39,14 @@ Options:
--quiet Suppress notification of passed tests (shows only failed tests)
--show-output Show expected and actual output
--color[=yes|no] Override terminal detection and force color output on or off
- use wgCommandLineDarkBg = true; if your term is dark
+ use wgCommandLineDarkBg = true; if your term is dark
--regex Only run tests whose descriptions which match given regex
+ --filter Alias for --regex
--file=<testfile> Run test cases from a custom file instead of parserTests.txt
--record Record tests in database
--compare Compare with recorded results, without updating the database.
--setversion When using --record, set the version string to use (useful
- with git-svn so that you can get the exact revision)
+ with git-svn so that you can get the exact revision)
--keep-uploads Re-use the same upload directory for each test, don't delete it
--fuzz Do a fuzz test instead of a normal test
--seed <n> Start the fuzz test from the specified seed
diff --git a/tests/phpunit/Makefile b/tests/phpunit/Makefile
index 24536efc..8a55dae0 100644
--- a/tests/phpunit/Makefile
+++ b/tests/phpunit/Makefile
@@ -46,17 +46,26 @@ coverage:
parser:
${PU} --group Parser
+parserfuzz:
+ @echo "******************************************************************"
+ @echo "* This WILL kill your computer by eating all memory AND all swap *"
+ @echo "* *"
+ @echo "* If you are on a production machine. ABORT NOW!! *"
+ @echo "* Press control+C to stop *"
+ @echo "* *"
+ @echo "******************************************************************"
+ ${PU} --group Parser,ParserFuzz
noparser:
- ${PU} --exclude-group Parser,Broken,Stub
+ ${PU} --exclude-group Parser,Broken,ParserFuzz,Stub
safe:
- ${PU} --exclude-group Broken,Destructive,Stub
+ ${PU} --exclude-group Broken,ParserFuzz,Destructive,Stub
databaseless:
- ${PU} --exclude-group Broken,Destructive,Database,Stub
+ ${PU} --exclude-group Broken,ParserFuzz,Destructive,Database,Stub
database:
- ${PU} --exclude-group Broken,Destructive,Stub --group Database
+ ${PU} --exclude-group Broken,ParserFuzz,Destructive,Stub --group Database
list-groups:
${PU} --list-groups
diff --git a/tests/phpunit/MediaWikiLangTestCase.php b/tests/phpunit/MediaWikiLangTestCase.php
index 1cd6a3ba..783f0315 100644
--- a/tests/phpunit/MediaWikiLangTestCase.php
+++ b/tests/phpunit/MediaWikiLangTestCase.php
@@ -13,7 +13,11 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
self::$oldLang = $wgLang;
self::$oldContLang = $wgContLang;
- if( $wgLanguageCode != $wgContLang->getCode() ) die("nooo!");
+ if( $wgLanguageCode != $wgContLang->getCode() ) {
+ throw new MWException("Error in MediaWikiLangTestCase::setUp(): " .
+ "\$wgLanguageCode ('$wgLanguageCode') is different from " .
+ "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
+ }
$wgLanguageCode = 'en'; # For mainpage to be 'Main Page'
diff --git a/tests/phpunit/MediaWikiPHPUnitCommand.php b/tests/phpunit/MediaWikiPHPUnitCommand.php
index c0d9f363..ea385ad9 100644
--- a/tests/phpunit/MediaWikiPHPUnitCommand.php
+++ b/tests/phpunit/MediaWikiPHPUnitCommand.php
@@ -5,7 +5,10 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
static $additionalOptions = array(
'regex=' => false,
'file=' => false,
+ 'use-filebackend=' => false,
'keep-uploads' => false,
+ 'use-normal-tables' => false,
+ 'reuse-db' => false,
);
public function __construct() {
@@ -17,6 +20,28 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
public static function main( $exit = true ) {
$command = new self;
+
+ if( wfIsWindows() ) {
+ # Windows does not come anymore with ANSI.SYS loaded by default
+ # PHPUnit uses the suite.xml parameters to enable/disable colors
+ # which can be then forced to be enabled with --colors.
+ # The below code inject a parameter just like if the user called
+ # phpunit with a --no-color option (which does not exist). It
+ # overrides the suite.xml setting.
+ # Probably fix bug 29226
+ $command->arguments['colors'] = false;
+ }
+
+ # Makes MediaWiki PHPUnit directory includable so the PHPUnit will
+ # be able to resolve relative files inclusion such as suites/*
+ # PHPUnit uses stream_resolve_include_path() internally
+ # See bug 32022
+ set_include_path(
+ dirname( __FILE__ )
+ .PATH_SEPARATOR
+ . get_include_path()
+ );
+
$command->run($_SERVER['argv'], $exit);
}
@@ -40,6 +65,11 @@ ParserTest-specific options:
--keep-uploads Re-use the same upload directory for each test, don't delete it
+Database options:
+ --use-normal-tables Use normal DB tables.
+ --reuse-db Init DB only if tables are missing and keep after finish.
+
+
EOT;
}
diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php
index 64cb486b..6ec8bdc7 100644
--- a/tests/phpunit/MediaWikiTestCase.php
+++ b/tests/phpunit/MediaWikiTestCase.php
@@ -11,6 +11,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
protected $db;
protected $oldTablePrefix;
protected $useTemporaryTables = true;
+ protected $reuseDB = false;
+ protected $tablesUsed = array(); // tables with data
+
private static $dbSetup = false;
/**
@@ -22,6 +25,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
protected $supportedDBs = array(
'mysql',
'sqlite',
+ 'postgres',
'oracle'
);
@@ -40,8 +44,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
if( $this->needsDB() ) {
-
global $wgDBprefix;
+
+ $this->useTemporaryTables = !$this->getCliArg( 'use-normal-tables' );
+ $this->reuseDB = $this->getCliArg('reuse-db');
$this->db = wfGetDB( DB_MASTER );
@@ -81,6 +87,34 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
function addDBData() {}
private function addCoreDBData() {
+ # disabled for performance
+ #$this->tablesUsed[] = 'page';
+ #$this->tablesUsed[] = 'revision';
+
+ if ( $this->db->getType() == 'oracle' ) {
+
+ # Insert 0 user to prevent FK violations
+ # Anonymous user
+ $this->db->insert( 'user', array(
+ 'user_id' => 0,
+ 'user_name' => 'Anonymous' ), __METHOD__, array( 'IGNORE' ) );
+
+ # Insert 0 page to prevent FK violations
+ # Blank page
+ $this->db->insert( 'page', array(
+ 'page_id' => 0,
+ 'page_namespace' => 0,
+ 'page_title' => ' ',
+ 'page_restrictions' => NULL,
+ 'page_counter' => 0,
+ 'page_is_redirect' => 0,
+ 'page_is_new' => 0,
+ 'page_random' => 0,
+ 'page_touched' => $this->db->timestamp(),
+ 'page_latest' => 0,
+ 'page_len' => 0 ), __METHOD__, array( 'IGNORE' ) );
+
+ }
User::resetIdByNameCache();
@@ -98,12 +132,14 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
//Make 1 page with 1 revision
- $article = new Article( Title::newFromText( 'UTPage' ) );
- $article->doEdit( 'UTContent',
+ $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
+ if ( !$page->getId() == 0 ) {
+ $page->doEdit( 'UTContent',
'UTPageSummary',
EDIT_NEW,
false,
User::newFromName( 'UTSysop' ) );
+ }
}
private function initDB() {
@@ -112,18 +148,20 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
throw new MWException( 'Cannot run unit tests, the database prefix is already "unittest_"' );
}
- $dbClone = new CloneDatabase( $this->db, $this->listTables(), $this->dbPrefix() );
+ $tablesCloned = $this->listTables();
+ $dbClone = new CloneDatabase( $this->db, $tablesCloned, $this->dbPrefix() );
$dbClone->useTemporaryTables( $this->useTemporaryTables );
- $dbClone->cloneTableStructure();
+
+ if ( ( $this->db->getType() == 'oracle' || !$this->useTemporaryTables ) && $this->reuseDB ) {
+ CloneDatabase::changePrefix( $this->dbPrefix() );
+ $this->resetDB();
+ return;
+ } else {
+ $dbClone->cloneTableStructure();
+ }
if ( $this->db->getType() == 'oracle' ) {
$this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-
- # Insert 0 user to prevent FK violations
- # Anonymous user
- $this->db->insert( 'user', array(
- 'user_id' => 0,
- 'user_name' => 'Anonymous' ) );
}
}
@@ -132,35 +170,25 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
*/
private function resetDB() {
if( $this->db ) {
- foreach( $this->listTables() as $tbl ) {
- if( $tbl == 'interwiki' || $tbl == 'user' ) continue;
- $this->db->delete( $tbl, '*', __METHOD__ );
+ if ( $this->db->getType() == 'oracle' ) {
+ if ( $this->useTemporaryTables ) {
+ wfGetLB()->closeAll();
+ $this->db = wfGetDB( DB_MASTER );
+ } else {
+ foreach( $this->tablesUsed as $tbl ) {
+ if( $tbl == 'interwiki') continue;
+ $this->db->query( 'TRUNCATE TABLE '.$this->db->tableName($tbl), __METHOD__ );
+ }
+ }
+ } else {
+ foreach( $this->tablesUsed as $tbl ) {
+ if( $tbl == 'interwiki' || $tbl == 'user' ) continue;
+ $this->db->delete( $tbl, '*', __METHOD__ );
+ }
}
}
}
- protected function destroyDB() {
- if ( $this->useTemporaryTables || is_null( $this->db ) ) {
- # Don't need to do anything
- return;
- }
-
- $tables = $this->db->listTables( $this->dbPrefix(), __METHOD__ );
-
- foreach ( $tables as $table ) {
- try {
- $sql = $this->db->getType() == 'oracle' ? "DROP TABLE $table CASCADE CONSTRAINTS PURGE" : "DROP TABLE `$table`";
- $this->db->query( $sql, __METHOD__ );
- } catch( MWException $mwe ) {}
- }
-
- if ( $this->db->getType() == 'oracle' )
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;', __METHOD__ );
-
- CloneDatabase::changePrefix( $this->oldTablePrefix );
- }
-
-
function __call( $func, $args ) {
static $compatibility = array(
'assertInternalType' => 'assertType',
@@ -235,5 +263,16 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
public static function disableInterwikis( $prefix, &$data ) {
return false;
}
-}
+ /**
+ * Don't throw a warning if $function is deprecated and called later
+ *
+ * @param $function String
+ * @return null
+ */
+ function hideDeprecated( $function ) {
+ wfSuppressWarnings();
+ wfDeprecated( $function );
+ wfRestoreWarnings();
+ }
+}
diff --git a/tests/phpunit/StructureTest.php b/tests/phpunit/StructureTest.php
new file mode 100644
index 00000000..f967c18d
--- /dev/null
+++ b/tests/phpunit/StructureTest.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * The tests here verify the structure of the code. This is for outright bugs,
+ * not just style issues.
+ */
+
+class StructureTest extends MediaWikiTestCase {
+ /**
+ * Verify all files that appear to be tests have file names ending in
+ * Test. If the file names do not end in Test, they will not be run.
+ */
+ public function testUnitTestFileNamesEndWithTest() {
+ if ( wfIsWindows() ) {
+ $this->markTestSkipped( 'This test does not work on Windows' );
+ }
+ $rootPath = escapeshellarg( __DIR__ );
+ $testClassRegex = implode( '|', array(
+ 'ApiFormatTestBase',
+ 'ApiTestCase',
+ 'MediaWikiLangTestCase',
+ 'MediaWikiTestCase',
+ 'PHPUnit_Framework_TestCase',
+ ) );
+ $testClassRegex = "^class .* extends ($testClassRegex)";
+ $finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
+ " | xargs grep -El '$testClassRegex|function suite\('";
+
+ $results = null;
+ $exitCode = null;
+ exec($finder, $results, $exitCode);
+
+ $this->assertEquals(
+ 0,
+ $exitCode,
+ 'Verify find/grep command succeeds.'
+ );
+
+ $results = array_filter(
+ $results,
+ array( $this, 'filterSuites' )
+ );
+
+ $this->assertEquals(
+ array(),
+ $results,
+ 'Unit test file names must end with Test.'
+ );
+ }
+
+ /**
+ * Filter to remove testUnitTestFileNamesEndWithTest false positives.
+ */
+ public function filterSuites( $filename ) {
+ return strpos( $filename, __DIR__ . '/suites/' ) !== 0;
+ }
+}
diff --git a/tests/phpunit/data/db/mysql/functions.sql b/tests/phpunit/data/db/mysql/functions.sql
new file mode 100644
index 00000000..9e5e470f
--- /dev/null
+++ b/tests/phpunit/data/db/mysql/functions.sql
@@ -0,0 +1,12 @@
+-- MySQL test file for DatabaseTest::testStoredFunctions()
+
+DELIMITER //
+
+CREATE FUNCTION mw_test_function()
+RETURNS int DETERMINISTIC
+BEGIN
+ SET @foo = 21;
+ RETURN @foo * 2;
+END//
+
+DELIMITER //
diff --git a/tests/phpunit/data/db/postgres/functions.sql b/tests/phpunit/data/db/postgres/functions.sql
new file mode 100644
index 00000000..3086d4d5
--- /dev/null
+++ b/tests/phpunit/data/db/postgres/functions.sql
@@ -0,0 +1,12 @@
+-- Postgres test file for DatabaseTest::testStoredFunctions()
+
+CREATE FUNCTION mw_test_function()
+RETURNS INTEGER
+LANGUAGE plpgsql AS
+$mw$
+DECLARE foo INTEGER;
+BEGIN
+ foo := 21;
+ RETURN foo * 2;
+END
+$mw$;
diff --git a/tests/phpunit/includes/db/sqlite/tables-1.13.sql b/tests/phpunit/data/db/sqlite/tables-1.13.sql
index a0dcb553..66847ab1 100644
--- a/tests/phpunit/includes/db/sqlite/tables-1.13.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.13.sql
@@ -123,7 +123,7 @@ CREATE TABLE /*$wgDBprefix*/site_stats (
ss_images INTEGER default '0') /*$wgDBTableOptions*/;
CREATE TABLE /*$wgDBprefix*/hitcounter (
- hc_id INTEGER
+ hc_id INTEGER
) ;
CREATE TABLE /*$wgDBprefix*/ipblocks (
diff --git a/tests/phpunit/includes/db/sqlite/tables-1.15.sql b/tests/phpunit/data/db/sqlite/tables-1.15.sql
index 901bac52..6b3a628e 100644
--- a/tests/phpunit/includes/db/sqlite/tables-1.15.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.15.sql
@@ -141,7 +141,7 @@ CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
CREATE TABLE /*_*/langlinks (
ll_from int unsigned NOT NULL default 0,
-
+
ll_lang varbinary(20) NOT NULL default '',
ll_title varchar(255) binary NOT NULL default ''
) /*$wgDBTableOptions*/;
@@ -181,7 +181,7 @@ CREATE TABLE /*_*/ipblocks (
ipb_block_email bool NOT NULL default 0,
ipb_allow_usertalk bool NOT NULL default 0
) /*$wgDBTableOptions*/;
-
+
CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
diff --git a/tests/phpunit/includes/db/sqlite/tables-1.16.sql b/tests/phpunit/data/db/sqlite/tables-1.16.sql
index 6e56add2..6e56add2 100644
--- a/tests/phpunit/includes/db/sqlite/tables-1.16.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.16.sql
diff --git a/tests/phpunit/includes/db/sqlite/tables-1.17.sql b/tests/phpunit/data/db/sqlite/tables-1.17.sql
index 69ae3764..69ae3764 100644
--- a/tests/phpunit/includes/db/sqlite/tables-1.17.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.17.sql
diff --git a/tests/phpunit/data/db/sqlite/tables-1.18.sql b/tests/phpunit/data/db/sqlite/tables-1.18.sql
new file mode 100644
index 00000000..bedf6c33
--- /dev/null
+++ b/tests/phpunit/data/db/sqlite/tables-1.18.sql
@@ -0,0 +1,535 @@
+-- This is a copy of MediaWiki 1.18 schema shared by MySQL and SQLite.
+-- It is used for updater testing. Comments are stripped to decrease
+-- file size, as we don't need to maintain it.
+
+CREATE TABLE /*_*/user (
+ user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ user_name varchar(255) binary NOT NULL default '',
+ user_real_name varchar(255) binary NOT NULL default '',
+ user_password tinyblob NOT NULL,
+ user_newpassword tinyblob NOT NULL,
+ user_newpass_time binary(14),
+ user_email tinytext NOT NULL,
+ user_options blob NOT NULL,
+ user_touched binary(14) NOT NULL default '',
+ user_token binary(32) NOT NULL default '',
+ user_email_authenticated binary(14),
+ user_email_token binary(32),
+ user_email_token_expires binary(14),
+ user_registration binary(14),
+ user_editcount int
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/user_name ON /*_*/user (user_name);
+CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
+CREATE INDEX /*i*/user_email ON /*_*/user (user_email(50));
+CREATE TABLE /*_*/user_groups (
+ ug_user int unsigned NOT NULL default 0,
+ ug_group varbinary(16) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
+CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
+CREATE TABLE /*_*/user_former_groups (
+ ufg_user int unsigned NOT NULL default 0,
+ ufg_group varbinary(16) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
+CREATE TABLE /*_*/user_newtalk (
+ user_id int NOT NULL default 0,
+ user_ip varbinary(40) NOT NULL default '',
+ user_last_timestamp varbinary(14) NULL default NULL
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
+CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
+CREATE TABLE /*_*/user_properties (
+ up_user int NOT NULL,
+ up_property varbinary(255) NOT NULL,
+ up_value blob
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property);
+CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property);
+CREATE TABLE /*_*/page (
+ page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ page_namespace int NOT NULL,
+ page_title varchar(255) binary NOT NULL,
+ page_restrictions tinyblob NOT NULL,
+ page_counter bigint unsigned NOT NULL default 0,
+ page_is_redirect tinyint unsigned NOT NULL default 0,
+ page_is_new tinyint unsigned NOT NULL default 0,
+ page_random real unsigned NOT NULL,
+ page_touched binary(14) NOT NULL default '',
+ page_latest int unsigned NOT NULL,
+ page_len int unsigned NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
+CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
+CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
+CREATE TABLE /*_*/revision (
+ rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ rev_page int unsigned NOT NULL,
+ rev_text_id int unsigned NOT NULL,
+ rev_comment tinyblob NOT NULL,
+ rev_user int unsigned NOT NULL default 0,
+ rev_user_text varchar(255) binary NOT NULL default '',
+ rev_timestamp binary(14) NOT NULL default '',
+ rev_minor_edit tinyint unsigned NOT NULL default 0,
+ rev_deleted tinyint unsigned NOT NULL default 0,
+ rev_len int unsigned,
+ rev_parent_id int unsigned default NULL
+) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
+CREATE UNIQUE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
+CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
+CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
+CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
+CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
+CREATE TABLE /*_*/text (
+ old_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ old_text mediumblob NOT NULL,
+ old_flags tinyblob NOT NULL
+) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
+CREATE TABLE /*_*/archive (
+ 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
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+CREATE TABLE /*_*/pagelinks (
+ pl_from int unsigned NOT NULL default 0,
+ pl_namespace int NOT NULL default 0,
+ pl_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
+CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
+CREATE TABLE /*_*/templatelinks (
+ tl_from int unsigned NOT NULL default 0,
+ tl_namespace int NOT NULL default 0,
+ tl_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
+CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
+CREATE TABLE /*_*/imagelinks (
+ il_from int unsigned NOT NULL default 0,
+ il_to varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
+CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
+CREATE TABLE /*_*/categorylinks (
+ cl_from int unsigned NOT NULL default 0,
+ cl_to varchar(255) binary NOT NULL default '',
+ cl_sortkey varbinary(230) NOT NULL default '',
+ cl_sortkey_prefix varchar(255) binary NOT NULL default '',
+ cl_timestamp timestamp NOT NULL,
+ cl_collation varbinary(32) NOT NULL default '',
+ cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page'
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
+CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
+CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
+CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
+CREATE TABLE /*_*/category (
+ cat_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ cat_title varchar(255) binary NOT NULL,
+ cat_pages int signed NOT NULL default 0,
+ cat_subcats int signed NOT NULL default 0,
+ cat_files int signed NOT NULL default 0,
+ cat_hidden tinyint unsigned NOT NULL default 0
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
+CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
+CREATE TABLE /*_*/externallinks (
+ el_from int unsigned NOT NULL default 0,
+ el_to blob NOT NULL,
+ el_index blob NOT NULL
+) /*$wgDBTableOptions*/;
+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 '',
+ ll_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
+CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
+CREATE TABLE /*_*/iwlinks (
+ iwl_from int unsigned NOT NULL default 0,
+ iwl_prefix varbinary(20) NOT NULL default '',
+ iwl_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
+CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE TABLE /*_*/site_stats (
+ ss_row_id int unsigned NOT NULL,
+ ss_total_views bigint unsigned default 0,
+ ss_total_edits bigint unsigned default 0,
+ ss_good_articles bigint unsigned default 0,
+ ss_total_pages bigint default '-1',
+ ss_users bigint default '-1',
+ ss_active_users bigint default '-1',
+ ss_admins int default '-1',
+ ss_images int default 0
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
+CREATE TABLE /*_*/hitcounter (
+ hc_id int unsigned NOT NULL
+) ENGINE=HEAP MAX_ROWS=25000;
+CREATE TABLE /*_*/ipblocks (
+ ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ ipb_address tinyblob NOT NULL,
+ ipb_user int unsigned NOT NULL default 0,
+ ipb_by int unsigned NOT NULL default 0,
+ ipb_by_text varchar(255) binary NOT NULL default '',
+ ipb_reason tinyblob NOT NULL,
+ ipb_timestamp binary(14) NOT NULL default '',
+ ipb_auto bool NOT NULL default 0,
+ ipb_anon_only bool NOT NULL default 0,
+ ipb_create_account bool NOT NULL default 1,
+ ipb_enable_autoblock bool 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 bool NOT NULL default 0,
+ ipb_block_email bool NOT NULL default 0,
+ ipb_allow_usertalk bool NOT NULL default 0
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
+CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
+CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
+CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
+CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE TABLE /*_*/image (
+ img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
+ img_size int unsigned NOT NULL default 0,
+ img_width int NOT NULL default 0,
+ img_height int NOT NULL default 0,
+ img_metadata mediumblob NOT NULL,
+ img_bits int 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 unsigned NOT NULL default 0,
+ img_user_text varchar(255) binary NOT NULL,
+ img_timestamp varbinary(14) NOT NULL default '',
+ img_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
+CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
+CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
+CREATE TABLE /*_*/oldimage (
+ oi_name varchar(255) binary NOT NULL default '',
+ oi_archive_name varchar(255) binary NOT NULL default '',
+ oi_size int unsigned NOT NULL default 0,
+ oi_width int NOT NULL default 0,
+ oi_height int NOT NULL default 0,
+ oi_bits int NOT NULL default 0,
+ oi_description tinyblob NOT NULL,
+ oi_user int unsigned NOT NULL default 0,
+ oi_user_text varchar(255) binary NOT NULL,
+ oi_timestamp binary(14) NOT NULL default '',
+ 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 unsigned NOT NULL default 0,
+ oi_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
+CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
+CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
+CREATE TABLE /*_*/filearchive (
+ fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ fa_name varchar(255) binary NOT NULL default '',
+ fa_archive_name varchar(255) binary default '',
+ fa_storage_group varbinary(16),
+ fa_storage_key varbinary(64) default '',
+ fa_deleted_user int,
+ fa_deleted_timestamp binary(14) default '',
+ fa_deleted_reason text,
+ fa_size int unsigned default 0,
+ fa_width int default 0,
+ fa_height int default 0,
+ fa_metadata mediumblob,
+ fa_bits int 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 unsigned default 0,
+ fa_user_text varchar(255) binary,
+ fa_timestamp binary(14) default '',
+ fa_deleted tinyint unsigned NOT NULL default 0
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
+CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
+CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
+CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+CREATE TABLE /*_*/uploadstash (
+ us_id int unsigned NOT NULL PRIMARY KEY auto_increment,
+ us_user int unsigned NOT NULL,
+ us_key varchar(255) NOT NULL,
+ us_orig_path varchar(255) NOT NULL,
+ us_path varchar(255) NOT NULL,
+ us_source_type varchar(50),
+ us_timestamp varbinary(14) not null,
+ us_status varchar(50) not null,
+ us_size int unsigned NOT NULL,
+ us_sha1 varchar(31) NOT NULL,
+ us_mime varchar(255),
+ us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+ us_image_width int unsigned,
+ us_image_height int unsigned,
+ us_image_bits smallint unsigned
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/us_user ON /*_*/uploadstash (us_user);
+CREATE UNIQUE INDEX /*i*/us_key ON /*_*/uploadstash (us_key);
+CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp);
+CREATE TABLE /*_*/recentchanges (
+ rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ rc_timestamp varbinary(14) NOT NULL default '',
+ rc_cur_time varbinary(14) NOT NULL default '',
+ rc_user int unsigned NOT NULL default 0,
+ rc_user_text varchar(255) binary NOT NULL,
+ rc_namespace int NOT NULL default 0,
+ rc_title varchar(255) binary NOT NULL default '',
+ rc_comment varchar(255) binary NOT NULL default '',
+ rc_minor tinyint unsigned NOT NULL default 0,
+ rc_bot tinyint unsigned NOT NULL default 0,
+ rc_new tinyint unsigned NOT NULL default 0,
+ rc_cur_id int unsigned NOT NULL default 0,
+ rc_this_oldid int unsigned NOT NULL default 0,
+ rc_last_oldid int unsigned NOT NULL default 0,
+ rc_type tinyint unsigned NOT NULL default 0,
+ rc_moved_to_ns tinyint unsigned NOT NULL default 0,
+ rc_moved_to_title varchar(255) binary NOT NULL default '',
+ rc_patrolled tinyint unsigned NOT NULL default 0,
+ rc_ip varbinary(40) NOT NULL default '',
+ rc_old_len int,
+ rc_new_len int,
+ rc_deleted tinyint unsigned NOT NULL default 0,
+ rc_logid int unsigned NOT NULL default 0,
+ rc_log_type varbinary(255) NULL default NULL,
+ rc_log_action varbinary(255) NULL default NULL,
+ rc_params blob NULL
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
+CREATE TABLE /*_*/watchlist (
+ wl_user int unsigned NOT NULL,
+ wl_namespace int NOT NULL default 0,
+ wl_title varchar(255) binary NOT NULL default '',
+ wl_notificationtimestamp varbinary(14)
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
+CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
+CREATE TABLE /*_*/searchindex (
+ si_page int unsigned NOT NULL,
+ si_title varchar(255) NOT NULL default '',
+ si_text mediumtext NOT NULL
+) ENGINE=MyISAM;
+CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
+CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
+CREATE FULLTEXT INDEX /*i*/si_text ON /*_*/searchindex (si_text);
+CREATE TABLE /*_*/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 bool NOT NULL,
+ iw_trans tinyint NOT NULL default 0
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
+CREATE TABLE /*_*/querycache (
+ qc_type varbinary(32) NOT NULL,
+ qc_value int unsigned NOT NULL default 0,
+ qc_namespace int NOT NULL default 0,
+ qc_title varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
+CREATE TABLE /*_*/objectcache (
+ keyname varbinary(255) NOT NULL default '' PRIMARY KEY,
+ value mediumblob,
+ exptime datetime
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
+CREATE TABLE /*_*/transcache (
+ tc_url varbinary(255) NOT NULL,
+ tc_contents text,
+ tc_time binary(14) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url);
+CREATE TABLE /*_*/logging (
+ log_id int unsigned NOT NULL PRIMARY KEY 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 unsigned NOT NULL default 0,
+ log_user_text varchar(255) binary NOT NULL default '',
+ log_namespace int NOT NULL default 0,
+ log_title varchar(255) binary NOT NULL default '',
+ log_page int unsigned NULL,
+ log_comment varchar(255) NOT NULL default '',
+ log_params blob NOT NULL,
+ log_deleted tinyint unsigned NOT NULL default 0
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
+CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
+CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
+CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
+CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
+CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
+CREATE TABLE /*_*/log_search (
+ ls_field varbinary(32) NOT NULL,
+ ls_value varchar(255) NOT NULL,
+ ls_log_id int unsigned NOT NULL default 0
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
+CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
+CREATE TABLE /*_*/trackbacks (
+ tb_id int PRIMARY KEY AUTO_INCREMENT,
+ tb_page int REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
+ tb_title varchar(255) NOT NULL,
+ tb_url blob NOT NULL,
+ tb_ex text,
+ tb_name varchar(255)
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
+CREATE TABLE /*_*/job (
+ job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ job_cmd varbinary(60) NOT NULL default '',
+ job_namespace int NOT NULL,
+ job_title varchar(255) binary NOT NULL,
+ job_params blob NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
+CREATE TABLE /*_*/querycache_info (
+ qci_type varbinary(32) NOT NULL default '',
+ qci_timestamp binary(14) NOT NULL default '19700101000000'
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
+CREATE TABLE /*_*/redirect (
+ rd_from int unsigned NOT NULL default 0 PRIMARY KEY,
+ rd_namespace int NOT NULL default 0,
+ rd_title varchar(255) binary NOT NULL default '',
+ rd_interwiki varchar(32) default NULL,
+ rd_fragment varchar(255) binary default NULL
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
+CREATE TABLE /*_*/querycachetwo (
+ qcc_type varbinary(32) NOT NULL,
+ qcc_value int unsigned NOT NULL default 0,
+ qcc_namespace int NOT NULL default 0,
+ qcc_title varchar(255) binary NOT NULL default '',
+ qcc_namespacetwo int NOT NULL default 0,
+ qcc_titletwo varchar(255) binary NOT NULL default ''
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
+CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
+CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
+CREATE TABLE /*_*/page_restrictions (
+ pr_page int NOT NULL,
+ pr_type varbinary(60) NOT NULL,
+ pr_level varbinary(60) NOT NULL,
+ pr_cascade tinyint NOT NULL,
+ pr_user int NULL,
+ pr_expiry varbinary(14) NULL,
+ pr_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
+CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
+CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
+CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
+CREATE TABLE /*_*/protected_titles (
+ pt_namespace int NOT NULL,
+ pt_title varchar(255) binary NOT NULL,
+ pt_user int 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
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
+CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
+CREATE TABLE /*_*/page_props (
+ pp_page int NOT NULL,
+ pp_propname varbinary(60) NOT NULL,
+ pp_value blob NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
+CREATE TABLE /*_*/updatelog (
+ ul_key varchar(255) NOT NULL PRIMARY KEY,
+ ul_value blob
+) /*$wgDBTableOptions*/;
+CREATE TABLE /*_*/change_tag (
+ ct_rc_id int NULL,
+ ct_log_id int NULL,
+ ct_rev_id int NULL,
+ ct_tag varchar(255) NOT NULL,
+ ct_params blob NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
+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);
+CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
+CREATE TABLE /*_*/tag_summary (
+ ts_rc_id 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*/;
+CREATE TABLE /*_*/l10n_cache (
+ lc_lang varbinary(32) NOT NULL,
+ lc_key varchar(255) NOT NULL,
+ lc_value mediumblob NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
+CREATE TABLE /*_*/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
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
+CREATE TABLE /*_*/msg_resource_links (
+ mrl_resource varbinary(255) NOT NULL,
+ mrl_message varbinary(255) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
+CREATE TABLE /*_*/module_deps (
+ md_module varbinary(255) NOT NULL,
+ md_skin varbinary(32) NOT NULL,
+ md_deps mediumblob NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
+
diff --git a/tests/phpunit/data/media/80x60-2layers.xcf b/tests/phpunit/data/media/80x60-2layers.xcf
new file mode 100644
index 00000000..c51e980c
--- /dev/null
+++ b/tests/phpunit/data/media/80x60-2layers.xcf
Binary files differ
diff --git a/tests/phpunit/data/media/80x60-Greyscale.xcf b/tests/phpunit/data/media/80x60-Greyscale.xcf
new file mode 100644
index 00000000..84bf3e67
--- /dev/null
+++ b/tests/phpunit/data/media/80x60-Greyscale.xcf
Binary files differ
diff --git a/tests/phpunit/data/media/80x60-RGB.xcf b/tests/phpunit/data/media/80x60-RGB.xcf
new file mode 100644
index 00000000..1d58f16d
--- /dev/null
+++ b/tests/phpunit/data/media/80x60-RGB.xcf
Binary files differ
diff --git a/tests/phpunit/data/media/Toll_Texas_1.svg b/tests/phpunit/data/media/Toll_Texas_1.svg
new file mode 100644
index 00000000..73004e3e
--- /dev/null
+++ b/tests/phpunit/data/media/Toll_Texas_1.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="385" height="385.0004883"
+ viewBox="0 0 385 385.0004883" overflow="visible" enable-background="new 0 0 385 385.0004883" xml:space="preserve">
+<g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M0.5,24.5c0-13.2548828,10.7451172-24,24-24h336c13.2548828,0,24,10.7451172,24,24v336.0004883
+ c0,13.2548828-10.7451172,24-24,24h-336c-13.2548828,0-24-10.7451172-24-24V24.5L0.5,24.5z"/>
+ <path fill="#FFFFFF" d="M192.5,192.5004883"/>
+ </g>
+ <g>
+ <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" d="M0.5,24.5
+ c0-13.2548828,10.7451172-24,24-24h336c13.2548828,0,24,10.7451172,24,24v336.0004883c0,13.2548828-10.7451172,24-24,24h-336
+ c-13.2548828,0-24-10.7451172-24-24V24.5L0.5,24.5z"/>
+ <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" d="
+ M192.5,192.5004883"/>
+ </g>
+ </g>
+ <g>
+ <path fill="#003882" d="M24.5,0.5h336c13.2548828,0,24,10.7451172,24,24v232.0004883H0.5V24.5
+ C0.5,11.2451172,11.2451172,0.5,24.5,0.5z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M10.5,24.5c0-7.7319336,6.2680664-14,14-14h336c7.7324219,0,14,6.2680664,14,14v222.0004883h-364V24.5z"/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="93.809082,348.2397461 91.6787109,347.8666992
+ 89.5478516,347.7368164 85.2929688,347.7368164 83.1640625,347.8666992 78.9042969,348.6157227 76.7763672,349.1166992
+ 72.7666016,350.3706055 70.7631836,351.246582 68.8837891,352.121582 67.0053711,353.1254883 65.1254883,354.253418
+ 63.3740234,355.5063477 60.1210938,358.2602539 58.4926758,359.762207 57.1132813,361.2641602 55.7338867,362.8959961
+ 54.3603516,364.6459961 21.2949219,301.3999023 21.168457,301.3999023 22.5478516,299.6469727 23.9248047,298.0200195
+ 25.3022461,296.5180664 26.9296875,295.0141602 30.1875,292.2592773 31.9404297,291.0073242 33.8188477,289.8793945
+ 35.6972656,288.8774414 37.5761719,288.0004883 39.5791016,287.1245117 43.5878906,285.8706055 45.7148438,285.3706055
+ 49.9755859,284.6176758 52.1020508,284.4946289 56.3632813,284.4946289 58.4926758,284.6176758 60.6201172,284.9946289
+ 60.6201172,284.8696289 "/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="32.8154297,319.559082 45.0898438,312.4233398
+ 42.2080078,298.5209961 52.7299805,308.0375977 65.1254883,300.9008789 59.2421875,313.9243164 69.8867188,323.4428711
+ 55.7338867,321.9389648 49.8476563,334.965332 46.9677734,321.0629883 "/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#B01C2E" points="132.0053711,306.6606445 148.5385742,338.2211914
+ 147.4101563,339.7241211 146.1577148,341.2270508 144.9052734,342.6020508 143.5302734,343.9848633 142.1494141,345.2358398
+ 140.6484375,346.4868164 139.2705078,347.6157227 137.765625,348.6157227 136.1381836,349.6176758 134.6357422,350.621582
+ 133.0083008,351.3696289 131.3798828,352.246582 129.625,352.8745117 128,353.5024414 126.2441406,354.0004883
+ 124.4921875,354.5043945 122.737793,354.8774414 120.9853516,355.1293945 117.4785156,355.3793945 113.9707031,355.3793945
+ 112.09375,355.2543945 110.3408203,355.003418 108.5854492,354.6274414 106.9589844,354.253418 103.4501953,353.2485352
+ 101.8232422,352.6254883 100.0688477,351.871582 98.4428711,351.1235352 96.9389648,350.1176758 95.3095703,349.2426758
+ 93.809082,348.2397461 93.809082,348.1147461 93.809082,348.2397461 77.1523438,316.4282227 77.2753906,316.4282227
+ 77.2753906,316.5551758 78.78125,317.5581055 80.4057617,318.4350586 81.9116211,319.4360352 83.5395508,320.1860352
+ 85.2929688,320.9399414 86.9208984,321.5649414 90.4257813,322.5668945 92.0551758,322.9418945 93.809082,323.3188477
+ 95.5620117,323.5688477 97.4423828,323.6948242 100.9462891,323.6948242 102.6992188,323.5688477 104.4521484,323.4428711
+ 106.2060547,323.1928711 107.9609375,322.8168945 111.4682617,321.8168945 113.0947266,321.1889648 114.8481445,320.5639648
+ 116.4765625,319.6879883 118.1035156,318.9350586 119.6083984,317.934082 121.2363281,316.9301758 122.737793,315.9282227
+ 124.1152344,314.8012695 125.6196289,313.5483398 126.9960938,312.2983398 128.3759766,310.9194336 129.625,309.5424805
+ 130.8789063,308.0375977 132.0053711,306.5366211 132.1328125,306.5366211 "/>
+ </g>
+ <g>
+
+ <polyline fill="none" stroke="#003882" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" points="
+ 60.7441406,285.1196289 63,286.4956055 65.2529297,287.7485352 67.5068359,288.8774414 69.8867188,289.8793945
+ 72.3916016,290.6313477 74.8955078,291.3813477 77.4008789,291.7583008 80.0302734,292.1333008 82.5366211,292.2592773
+ 85.1655273,292.2592773 87.6708984,292.0083008 90.3022461,291.6313477 92.8066406,291.1313477 95.3095703,290.3793945
+ 97.6904297,289.5024414 100.0688477,288.5004883 102.3256836,287.2504883 104.578125,285.8706055 106.7070313,284.4946289
+ 108.7124023,282.8637695 110.5888672,281.1108398 112.3427734,279.2329102 114.0986328,277.2290039 115.5976563,275.1010742 "/>
+ </g>
+ <g>
+
+ <line fill="none" stroke="#003882" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" x1="115.4746094" y1="275.1010742" x2="131.8793945" y2="306.2836914"/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="215.1650391,349.1166992 213.1601563,348.2397461
+ 211.2832031,347.237793 207.7773438,344.7329102 206.1503906,343.2319336 204.6435547,341.7270508 203.2685547,340.0991211
+ 202.0166016,338.347168 200.8867188,336.5942383 199.8857422,334.590332 199.0097656,332.7114258 198.2578125,330.7075195
+ 197.6328125,328.5776367 197.1289063,326.5756836 196.7548828,324.4458008 196.6318359,322.3168945 196.6318359,320.0629883
+ 196.7548828,317.934082 197.0058594,315.8041992 197.3818359,313.6743164 198.6357422,309.6665039 199.5107422,307.6635742
+ 200.5126953,305.7827148 201.6386719,303.9067383 202.890625,302.152832 204.2685547,300.3989258 205.6464844,298.8969727
+ 207.2744141,297.3920898 208.9023438,296.0161133 210.6572266,294.887207 212.5361328,293.7602539 214.4130859,292.7602539
+ 216.4179688,291.8833008 218.5449219,291.0073242 220.6767578,290.2543945 222.9306641,289.6274414 227.4384766,288.8774414
+ 229.6933594,288.6254883 231.9482422,288.5004883 234.2011719,288.5004883 236.4541016,288.6254883 238.7119141,288.8774414
+ 240.9638672,289.253418 243.21875,289.7543945 245.3476563,290.3793945 247.6025391,291.1313477 249.6054688,292.0083008
+ 251.7363281,293.0083008 251.7363281,292.8852539 253.6132813,294.137207 255.4931641,295.5151367 257.2460938,297.0161133
+ 258.8740234,298.6459961 260.5019531,300.3989258 261.8808594,302.277832 263.1328125,304.1577148 264.2578125,306.2836914
+ 266.0117188,310.543457 266.6386719,312.7983398 267.390625,317.3051758 267.5136719,319.6879883 267.390625,321.9418945
+ 267.265625,324.3188477 266.2626953,328.8286133 265.5117188,330.9575195 264.6347656,333.2114258 263.6318359,335.2163086
+ 262.5058594,337.2192383 261.1298828,339.0981445 259.625,340.9770508 258.1240234,342.6020508 256.3701172,344.1079102
+ 254.4902344,345.6098633 252.6142578,346.8618164 250.609375,347.9926758 248.4785156,348.9926758 246.3496094,349.8696289
+ 244.2216797,350.621582 242.0927734,351.246582 239.8359375,351.7485352 237.5830078,352.121582 235.3291016,352.3754883
+ 232.9501953,352.4985352 230.6933594,352.4985352 228.4414063,352.3754883 226.1865234,352.121582 223.9296875,351.7485352
+ 221.6777344,351.246582 219.421875,350.746582 217.2949219,349.9946289 "/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="219.9238281,303.6547852 221.9287109,301.5258789
+ 224.4335938,299.8999023 227.1904297,298.8969727 230.1943359,298.2700195 233.0742188,298.3959961 235.9550781,299.0219727
+ 238.7119141,300.2739258 241.0898438,301.9018555 243.0957031,304.1577148 244.5957031,306.5366211 245.9746094,308.9145508
+ 246.9765625,311.4204102 247.8535156,314.0512695 248.4785156,316.8051758 248.8535156,319.559082 248.9804688,322.3168945
+ 248.9804688,325.0727539 248.6035156,327.8256836 248.1035156,330.5805664 247.3496094,333.2114258 246.3496094,335.7172852
+ 244.9726563,337.8442383 243.34375,339.6000977 241.3408203,341.1020508 239.2109375,342.355957 236.8330078,343.2319336
+ 234.4511719,343.6049805 231.9482422,343.7319336 229.4414063,343.3579102 227.1904297,342.6020508 224.9326172,341.4770508
+ 222.9306641,340.0991211 221.1757813,338.347168 219.6748047,336.3422852 218.5449219,334.2114258 217.7949219,331.8334961
+ 217.0449219,329.7036133 216.0419922,325.4477539 215.7910156,323.1928711 215.6660156,320.9399414 215.6660156,318.684082
+ 215.9169922,316.4282227 216.1669922,314.300293 216.6679688,312.0454102 217.2949219,309.918457 218.0458984,307.7895508
+ 218.9208984,305.7827148 219.9238281,303.7817383 "/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="150.4169922,290.0063477 196.3789063,289.7543945
+ 192.7470703,304.4067383 192.6220703,304.5307617 192.1210938,303.7817383 191.4960938,303.1567383 190.8681641,302.5288086
+ 190.1162109,302.027832 189.2421875,301.652832 188.4887695,301.2768555 187.6113281,301.0258789 186.7353516,300.7758789
+ 179.9741211,300.7758789 179.8481445,345.1098633 179.8481445,345.2358398 180.0966797,346.1118164 180.3486328,347.1157227
+ 180.7246094,347.9926758 181.1005859,348.7407227 181.6015625,349.6176758 182.8549805,351.1235352 183.6054688,351.7485352
+ 158.5556641,351.7485352 158.5556641,351.871582 159.3095703,351.246582 160.0595703,350.4956055 160.6845703,349.7426758
+ 161.1875,348.9926758 161.6879883,347.9926758 161.9384766,347.1157227 162.1894531,346.1118164 162.3144531,345.1098633
+ 162.4375,300.9008789 156.5527344,300.9008789 155.1767578,301.0258789 153.9248047,301.2768555 152.671875,301.5258789
+ 151.4204102,301.9018555 150.1660156,302.4008789 148.9135742,303.0297852 146.6601563,304.2797852 146.6601563,304.4067383 "/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="275.7822266,344.3598633 276.03125,298.1450195
+ 275.90625,297.769043 275.90625,297.894043 275.7822266,296.7661133 275.5302734,295.7670898 275.15625,294.6391602
+ 274.7792969,293.637207 272.8984375,291.0073242 272.0234375,290.2543945 272.1484375,290.2543945 297.4492188,290.1313477
+ 296.4453125,290.8803711 295.5683594,291.6313477 294.6904297,292.5083008 294.0673828,293.5102539 293.5644531,294.6391602
+ 293.1904297,295.7670898 293.0644531,297.0161133 293.0644531,298.2700195 293.0644531,298.1450195 293.1904297,298.1450195
+ 293.0644531,340.7260742 292.9394531,340.7260742 294.8183594,341.3540039 296.8222656,341.8540039 298.7011719,342.1040039
+ 300.7050781,342.355957 302.7070313,342.4799805 304.5878906,342.355957 306.5917969,342.2299805 308.46875,341.8540039
+ 311.4746094,340.7260742 312.4765625,340.2231445 313.3535156,339.7241211 314.3535156,339.2241211 316.109375,337.972168
+ 311.8505859,351.621582 271.3984375,351.7485352 272.3994141,351.1235352 273.2753906,350.3706055 274.0292969,349.6176758
+ 275.2802734,347.6157227 275.53125,346.4868164 275.7822266,345.4858398 275.90625,344.2348633 "/>
+ </g>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="327.5058594,344.3598633 327.7539063,298.1450195
+ 327.6308594,297.769043 327.6308594,297.894043 327.5058594,296.7661133 327.2539063,295.7670898 326.8769531,294.6391602
+ 326.5029297,293.637207 324.6259766,291.0073242 323.7480469,290.2543945 323.8740234,290.2543945 349.171875,290.1313477
+ 348.1708984,290.8803711 347.2929688,291.6313477 346.4179688,292.5083008 345.7890625,293.5102539 345.2871094,294.6391602
+ 344.9121094,295.7670898 344.7890625,297.0161133 344.7890625,298.2700195 344.7890625,298.1450195 344.9121094,298.1450195
+ 344.7890625,340.7260742 344.6640625,340.7260742 346.5410156,341.3540039 348.5458984,341.8540039 350.4238281,342.1040039
+ 352.4277344,342.355957 354.4316406,342.4799805 356.3105469,342.355957 358.3144531,342.2299805 360.1933594,341.8540039
+ 361.1933594,341.4770508 363.1992188,340.7260742 364.2011719,340.2231445 365.078125,339.7241211 366.0820313,339.2241211
+ 367.8320313,337.972168 363.5751953,351.621582 323.1220703,351.7485352 324.125,351.1235352 325.0019531,350.3706055
+ 325.7519531,349.6176758 327.0058594,347.6157227 327.2539063,346.4868164 327.5058594,345.4858398 327.6308594,344.2348633 "/>
+ </g>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" fill="#003882" d="M188.4228516,211.0395508V89.7011719h-23.2304688V66.4711914
+ c7.4140625-0.3291016,13.8393555-2.3886719,19.2763672-6.1782227c5.4365234-3.7890625,9.3085938-8.7314453,11.6152344-14.8276367
+ h23.7236328v165.5742188H188.4228516z"/>
+</svg>
diff --git a/tests/phpunit/data/media/iptc-invalid-psir.jpg b/tests/phpunit/data/media/iptc-invalid-psir.jpg
new file mode 100644
index 00000000..01b9acf3
--- /dev/null
+++ b/tests/phpunit/data/media/iptc-invalid-psir.jpg
Binary files differ
diff --git a/tests/phpunit/includes/ArticleTablesTest.php b/tests/phpunit/includes/ArticleTablesTest.php
index 01776c95..02571b55 100644
--- a/tests/phpunit/includes/ArticleTablesTest.php
+++ b/tests/phpunit/includes/ArticleTablesTest.php
@@ -6,29 +6,28 @@
class ArticleTablesTest extends MediaWikiLangTestCase {
function testbug14404() {
- global $wgUser, $wgContLang, $wgLanguageCode, $wgLang;
-
- $title = Title::newFromText("Bug 14404");
- $article = new Article( $title );
- $wgUser = new User();
- $wgUser->mRights = array( 'createpage', 'edit', 'purge' );
+ global $wgContLang, $wgLanguageCode, $wgLang;
+
+ $title = Title::newFromText( 'Bug 14404' );
+ $page = WikiPage::factory( $title );
+ $user = new User();
+ $user->mRights = array( 'createpage', 'edit', 'purge' );
$wgLanguageCode = 'es';
$wgContLang = Language::factory( 'es' );
-
+
$wgLang = Language::factory( 'fr' );
- $status = $article->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', 0 );
- $templates1 = $article->getUsedTemplates();
+ $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', 0, false, $user );
+ $templates1 = $page->getUsedTemplates();
$wgLang = Language::factory( 'de' );
- $article->mParserOptions = null; // Let it pick the new user language
- $article->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
-
+ $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 = $article->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', EDIT_UPDATE );
- $templates2 = $article->getUsedTemplates();
-
+ $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', EDIT_UPDATE, false, $user );
+ $templates2 = $page->getUsedTemplates();
+
$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 285efee9..846d2b86 100644
--- a/tests/phpunit/includes/ArticleTest.php
+++ b/tests/phpunit/includes/ArticleTest.php
@@ -19,25 +19,25 @@ class ArticleTest extends MediaWikiTestCase {
}
- function testImplementsGetMagic() {
- $this->assertEquals( -1, $this->article->mCounter, "Article __get magic" );
+ function testImplementsGetMagic() {
+ $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
}
/**
* @depends testImplementsGetMagic
*/
function testImplementsSetMagic() {
-
- $this->article->mCounter = 2;
- $this->assertEquals( 2, $this->article->mCounter, "Article __set magic" );
+ $this->article->mLatest = 2;
+ $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
}
/**
* @depends testImplementsSetMagic
*/
function testImplementsCallMagic() {
- $this->article->mCounter = 33;
- $this->assertEquals( 33, $this->article->getCount(), "Article __call magic" );
+ $this->article->mLatest = 33;
+ $this->article->mDataLoaded = true;
+ $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
}
function testGetOrSetOnNewProperty() {
diff --git a/tests/phpunit/includes/BlockTest.php b/tests/phpunit/includes/BlockTest.php
index 2f224ba8..749f40b4 100644
--- a/tests/phpunit/includes/BlockTest.php
+++ b/tests/phpunit/includes/BlockTest.php
@@ -2,11 +2,10 @@
/**
* @group Database
+ * @group Blocking
*/
class BlockTest extends MediaWikiLangTestCase {
- const REASON = "Some reason";
-
private $block, $madeAt;
/* variable used to save up the blockID we insert in this test suite */
@@ -36,8 +35,8 @@ class BlockTest extends MediaWikiLangTestCase {
$oldBlock->delete();
}
- $this->block = new Block( 'UTBlockee', 1, 0,
- self::REASON
+ $this->block = new Block( 'UTBlockee', $user->getID(), 0,
+ 'Parce que', 0, false, time() + 100500
);
$this->madeAt = wfTimestamp( TS_MW );
@@ -68,7 +67,7 @@ class BlockTest extends MediaWikiLangTestCase {
// $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");
}
@@ -77,8 +76,9 @@ class BlockTest extends MediaWikiLangTestCase {
* per bug 26425
*/
function testBug26425BlockTimestampDefaultsToTime() {
-
- $this->assertEquals( $this->madeAt, $this->block->mTimestamp, "If no timestamp is specified, the block is recorded as time()");
+ // 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,6 +91,8 @@ class BlockTest extends MediaWikiLangTestCase {
* @dataProvider dataBug29116
*/
function testBug29116LoadWithEmptyIp( $vagueTarget ) {
+ $this->hideDeprecated( 'Block::load' );
+
$uid = User::idFromName( 'UTBlockee' );
$this->assertTrue( ($uid > 0), 'Must be able to look up the target user during tests' );
@@ -121,4 +123,3 @@ class BlockTest extends MediaWikiLangTestCase {
);
}
}
-
diff --git a/tests/phpunit/includes/EditPageTest.php b/tests/phpunit/includes/EditPageTest.php
new file mode 100644
index 00000000..e98e9707
--- /dev/null
+++ b/tests/phpunit/includes/EditPageTest.php
@@ -0,0 +1,33 @@
+<?php
+
+class EditPageTest extends MediaWikiTestCase {
+
+ /**
+ * @dataProvider dataExtractSectionTitle
+ */
+ function testExtractSectionTitle( $section, $title ) {
+ $extracted = EditPage::extractSectionTitle( $section );
+ $this->assertEquals( $title, $extracted );
+ }
+
+ function dataExtractSectionTitle() {
+ return array(
+ array(
+ "== Test ==\n\nJust a test section.",
+ "Test"
+ ),
+ array(
+ "An initial section, no header.",
+ false
+ ),
+ array(
+ "An initial section with a fake heder (bug 32617)\n\n== Test == ??\nwtf",
+ false
+ ),
+ array(
+ "== Section ==\nfollowed by a fake == Non-section == ??\nnoooo",
+ "Section"
+ )
+ );
+ }
+}
diff --git a/tests/phpunit/includes/ExtraParserTest.php b/tests/phpunit/includes/ExtraParserTest.php
index 5b0aa98b..a9088cb2 100644
--- a/tests/phpunit/includes/ExtraParserTest.php
+++ b/tests/phpunit/includes/ExtraParserTest.php
@@ -10,11 +10,13 @@ class ExtraParserTest extends MediaWikiTestCase {
global $wgContLang;
global $wgShowDBErrorBacktrace;
global $wgLanguageCode;
+ global $wgAlwaysUseTidy;
$wgShowDBErrorBacktrace = true;
$wgLanguageCode = 'en';
$wgContLang = new Language( 'en' );
$wgMemc = new EmptyBagOStuff;
+ $wgAlwaysUseTidy = false;
$this->options = new ParserOptions;
$this->options->setTemplateCallback( array( __CLASS__, 'statelessFetchTemplate' ) );
@@ -61,20 +63,48 @@ class ExtraParserTest extends MediaWikiTestCase {
* cleanSig() makes all templates substs and removes tildes
*/
function testCleanSig() {
+ global $wgCleanSignatures;
+ $oldCleanSignature = $wgCleanSignatures;
+ $wgCleanSignatures = true;
+
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
+
+ $wgCleanSignatures = $oldCleanSignature;
$this->assertEquals( "{{SUBST:Foo}} ", $outputText );
}
-
+
/**
- * cleanSigInSig() just removes tildes
+ * cleanSig() should do nothing if disabled
*/
- function testCleanSigInSig() {
+ function testCleanSigDisabled() {
+ global $wgCleanSignatures;
+ $oldCleanSignature = $wgCleanSignatures;
+ $wgCleanSignatures = false;
+
$title = Title::newFromText( __FUNCTION__ );
- $outputText = $this->parser->cleanSigInSig( "{{Foo}} ~~~~" );
+ $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
+
+ $wgCleanSignatures = $oldCleanSignature;
- $this->assertEquals( "{{Foo}} ", $outputText );
+ $this->assertEquals( "{{Foo}} ~~~~", $outputText );
+ }
+
+ /**
+ * cleanSigInSig() just removes tildes
+ * @dataProvider provideStringsForCleanSigInSig
+ */
+ function testCleanSigInSig( $in, $out ) {
+ $this->assertEquals( Parser::cleanSigInSig( $in), $out );
+ }
+
+ function provideStringsForCleanSigInSig() {
+ return array(
+ array( "{{Foo}} ~~~~", "{{Foo}} " ),
+ array( "~~~", "" ),
+ array( "~~~~~", "" ),
+ );
}
function testGetSection() {
@@ -110,4 +140,28 @@ class ExtraParserTest extends MediaWikiTestCase {
'finalTitle' => $title,
'deps' => $deps );
}
+
+ /**
+ * @group Database
+ */
+ function testTrackingCategory() {
+ $title = Title::newFromText( __FUNCTION__ );
+ $catName = wfMsgForContent( 'broken-file-category' );
+ $cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
+ $expected = array( $cat->getDBkey() );
+ $parserOutput = $this->parser->parse( "[[file:nonexistent]]" , $title, $this->options );
+ $result = $parserOutput->getCategoryLinks();
+ $this->assertEquals( $expected, $result );
+ }
+
+ /**
+ * @group Database
+ */
+ function testTrackingCategorySpecial() {
+ // Special pages shouldn't have tracking cats.
+ $title = SpecialPage::getTitleFor( 'Contributions' );
+ $parserOutput = $this->parser->parse( "[[file:nonexistent]]" , $title, $this->options );
+ $result = $parserOutput->getCategoryLinks();
+ $this->assertEmpty( $result );
+ }
}
diff --git a/tests/phpunit/includes/FormOptionsInitializationTest.php b/tests/phpunit/includes/FormOptionsInitializationTest.php
index 85d76271..d86c95d7 100644
--- a/tests/phpunit/includes/FormOptionsInitializationTest.php
+++ b/tests/phpunit/includes/FormOptionsInitializationTest.php
@@ -25,9 +25,9 @@ class FormOptionsExposed extends FormOptions {
*
* Generated by PHPUnit on 2011-02-28 at 20:46:27.
*
- * Copyright © 2011, Ashar Voultoiz
+ * Copyright © 2011, Antoine Musso
*
- * @author Ashar Voultoiz
+ * @author Antoine Musso
*/
class FormOptionsInitializationTest extends MediaWikiTestCase {
/**
diff --git a/tests/phpunit/includes/FormOptionsTest.php b/tests/phpunit/includes/FormOptionsTest.php
index 86618d93..749343ec 100644
--- a/tests/phpunit/includes/FormOptionsTest.php
+++ b/tests/phpunit/includes/FormOptionsTest.php
@@ -12,9 +12,9 @@
* Test class for FormOptions methods.
* Generated by PHPUnit on 2011-02-28 at 20:46:27.
*
- * Copyright © 2011, Ashar Voultoiz
+ * Copyright © 2011, Antoine Musso
*
- * @author Ashar Voultoiz
+ * @author Antoine Musso
*/
class FormOptionsTest extends MediaWikiTestCase {
/**
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
index 3d157d0a..3cb42f12 100644
--- a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
@@ -94,24 +94,80 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertTrue( $end > $start, "Time is running backwards!" );
}
- function testArrayToCGI() {
+ function dataArrayToCGI() {
+ return array(
+ array( array(), '' ), // empty
+ array( array( 'foo' => 'bar' ), 'foo=bar' ), // string test
+ array( array( 'foo' => '' ), 'foo=' ), // empty string test
+ array( array( 'foo' => 1 ), 'foo=1' ), // number test
+ array( array( 'foo' => true ), 'foo=1' ), // true test
+ array( array( 'foo' => false ), '' ), // false test
+ array( array( 'foo' => null ), '' ), // null test
+ array( array( 'foo' => 'A&B=5+6@!"\'' ), 'foo=A%26B%3D5%2B6%40%21%22%27' ), // urlencoding test
+ array( array( 'foo' => 'bar', 'baz' => 'is', 'asdf' => 'qwerty' ), 'foo=bar&baz=is&asdf=qwerty' ), // multi-item test
+ array( array( 'foo' => array( 'bar' => 'baz' ) ), 'foo%5Bbar%5D=baz' ),
+ array( array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ), 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf' ),
+ array( array( 'foo' => array( 'bar', 'baz' ) ), 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
+ array( array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ), 'foo%5Bbar%5D%5Bbar%5D=baz' ),
+ );
+ }
+
+ /**
+ * @dataProvider dataArrayToCGI
+ */
+ function testArrayToCGI( $array, $result ) {
+ $this->assertEquals( $result, wfArrayToCGI( $array ) );
+ }
+
+
+ function testArrayToCGI2() {
$this->assertEquals(
- "baz=AT%26T&foo=bar",
+ "baz=bar&foo=bar",
wfArrayToCGI(
- array( 'baz' => 'AT&T', 'ignore' => '' ),
+ array( 'baz' => 'bar' ),
array( 'foo' => 'bar', 'baz' => 'overridden value' ) ) );
- $this->assertEquals(
- "path%5B0%5D=wiki&path%5B1%5D=test&cfg%5Bservers%5D%5Bhttp%5D=localhost",
- wfArrayToCGI( array(
- 'path' => array( 'wiki', 'test' ),
- 'cfg' => array( 'servers' => array( 'http' => 'localhost' ) ) ) ) );
}
- function testCgiToArray() {
- $this->assertEquals(
- array( 'path' => array( 'wiki', 'test' ),
- 'cfg' => array( 'servers' => array( 'http' => 'localhost' ) ) ),
- wfCgiToArray( 'path%5B0%5D=wiki&path%5B1%5D=test&cfg%5Bservers%5D%5Bhttp%5D=localhost' ) );
+ function dataCgiToArray() {
+ return array(
+ array( '', array() ), // empty
+ array( 'foo=bar', array( 'foo' => 'bar' ) ), // string
+ array( 'foo=', array( 'foo' => '' ) ), // empty string
+ array( 'foo', array( 'foo' => '' ) ), // missing =
+ array( 'foo=bar&qwerty=asdf', array( 'foo' => 'bar', 'qwerty' => 'asdf' ) ), // multiple value
+ array( 'foo=A%26B%3D5%2B6%40%21%22%27', array( 'foo' => 'A&B=5+6@!"\'' ) ), // urldecoding test
+ array( 'foo%5Bbar%5D=baz', array( 'foo' => array( 'bar' => 'baz' ) ) ),
+ array( 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf', array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ) ),
+ array( 'foo%5B0%5D=bar&foo%5B1%5D=baz', array( 'foo' => array( 0 => 'bar', 1 => 'baz' ) ) ),
+ array( 'foo%5Bbar%5D%5Bbar%5D=baz', array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ) ),
+ );
+ }
+
+ /**
+ * @dataProvider dataCgiToArray
+ */
+ function testCgiToArray( $cgi, $result ) {
+ $this->assertEquals( $result, wfCgiToArray( $cgi ) );
+ }
+
+ function dataCgiRoundTrip() {
+ return array(
+ array( '' ),
+ array( 'foo=bar' ),
+ array( 'foo=' ),
+ array( 'foo=bar&baz=biz' ),
+ array( 'foo=A%26B%3D5%2B6%40%21%22%27' ),
+ array( 'foo%5Bbar%5D=baz' ),
+ array( 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
+ array( 'foo%5Bbar%5D%5Bbar%5D=baz' ),
+ );
+ }
+
+ /**
+ * @dataProvider dataCgiRoundTrip
+ */
+ function testCgiRoundTrip( $cgi ) {
+ $this->assertEquals( $cgi, wfArrayToCGI( wfCgiToArray( $cgi ) ) );
}
function testMimeTypeMatch() {
@@ -176,263 +232,6 @@ class GlobalTest extends MediaWikiTestCase {
array( 'text/*' => 1.0 ),
array( 'application/xhtml+xml' => 1.0 ) ) );
}
-
- function testTimestamp() {
- $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, $t ),
- 'TS_UNIX to TS_MW' );
- $this->assertEquals(
- '19690115123456',
- wfTimestamp( TS_MW, -30281104 ),
- 'Negative TS_UNIX to TS_MW' );
- $this->assertEquals(
- 979562096,
- wfTimestamp( TS_UNIX, $t ),
- 'TS_UNIX to TS_UNIX' );
- $this->assertEquals(
- '2001-01-15 12:34:56',
- wfTimestamp( TS_DB, $t ),
- 'TS_UNIX to TS_DB' );
- $this->assertEquals(
- '20010115T123456Z',
- wfTimestamp( TS_ISO_8601_BASIC, $t ),
- 'TS_ISO_8601_BASIC to TS_DB' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, '20010115123456' ),
- 'TS_MW to TS_MW' );
- $this->assertEquals(
- 979562096,
- wfTimestamp( TS_UNIX, '20010115123456' ),
- 'TS_MW to TS_UNIX' );
- $this->assertEquals(
- '2001-01-15 12:34:56',
- wfTimestamp( TS_DB, '20010115123456' ),
- 'TS_MW to TS_DB' );
- $this->assertEquals(
- '20010115T123456Z',
- wfTimestamp( TS_ISO_8601_BASIC, '20010115123456' ),
- 'TS_MW to TS_ISO_8601_BASIC' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_MW' );
- $this->assertEquals(
- 979562096,
- wfTimestamp( TS_UNIX, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_UNIX' );
- $this->assertEquals(
- '2001-01-15 12:34:56',
- wfTimestamp( TS_DB, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_DB' );
- $this->assertEquals(
- '20010115T123456Z',
- wfTimestamp( TS_ISO_8601_BASIC, '2001-01-15 12:34:56' ),
- 'TS_DB to TS_ISO_8601_BASIC' );
-
- # rfc2822 section 3.3
-
- $this->assertEquals(
- 'Mon, 15 Jan 2001 12:34:56 GMT',
- wfTimestamp( TS_RFC2822, '20010115123456' ),
- 'TS_MW to TS_RFC2822' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, 'Mon, 15 Jan 2001 12:34:56 GMT' ),
- 'TS_RFC2822 to TS_MW' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, ' Mon, 15 Jan 2001 12:34:56 GMT' ),
- 'TS_RFC2822 with leading space to TS_MW' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, '15 Jan 2001 12:34:56 GMT' ),
- 'TS_RFC2822 without optional day-of-week to TS_MW' );
-
- # FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space
- # obs-FWS = 1*WSP *(CRLF 1*WSP) ; Section 4.2
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, 'Mon, 15 Jan 2001 12:34:56 GMT' ),
- 'TS_RFC2822 to TS_MW' );
-
- # WSP = SP / HTAB ; rfc2234
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, "Mon, 15 Jan\x092001 12:34:56 GMT" ),
- 'TS_RFC2822 with HTAB to TS_MW' );
-
- $this->assertEquals(
- '20010115123456',
- wfTimestamp( TS_MW, "Mon, 15 Jan\x09 \x09 2001 12:34:56 GMT" ),
- 'TS_RFC2822 with HTAB and SP to TS_MW' );
-
- $this->assertEquals(
- '19941106084937',
- wfTimestamp( TS_MW, "Sun, 6 Nov 94 08:49:37 GMT" ),
- 'TS_RFC2822 with obsolete year to TS_MW' );
- }
-
- /**
- * This test checks wfTimestamp() with values outside.
- * It needs PHP 64 bits or PHP > 5.1.
- * See r74778 and bug 25451
- */
- function testOldTimestamps() {
- $this->assertEquals( 'Fri, 13 Dec 1901 20:45:54 GMT',
- wfTimestamp( TS_RFC2822, '19011213204554' ),
- 'Earliest time according to php documentation' );
-
- $this->assertEquals( 'Tue, 19 Jan 2038 03:14:07 GMT',
- wfTimestamp( TS_RFC2822, '20380119031407' ),
- 'Latest 32 bit time' );
-
- $this->assertEquals( '-2147483648',
- wfTimestamp( TS_UNIX, '19011213204552' ),
- 'Earliest 32 bit unix time' );
-
- $this->assertEquals( '2147483647',
- wfTimestamp( TS_UNIX, '20380119031407' ),
- 'Latest 32 bit unix time' );
-
- $this->assertEquals( 'Fri, 13 Dec 1901 20:45:52 GMT',
- wfTimestamp( TS_RFC2822, '19011213204552' ),
- 'Earliest 32 bit time' );
-
- $this->assertEquals( 'Fri, 13 Dec 1901 20:45:51 GMT',
- wfTimestamp( TS_RFC2822, '19011213204551' ),
- 'Earliest 32 bit time - 1' );
-
- $this->assertEquals( 'Tue, 19 Jan 2038 03:14:08 GMT',
- wfTimestamp( TS_RFC2822, '20380119031408' ),
- 'Latest 32 bit time + 1' );
-
- $this->assertEquals( '19011212000000',
- wfTimestamp(TS_MW, '19011212000000'),
- 'Convert to itself r74778#c10645' );
-
- $this->assertEquals( '-2147483649',
- wfTimestamp( TS_UNIX, '19011213204551' ),
- 'Earliest 32 bit unix time - 1' );
-
- $this->assertEquals( '2147483648',
- wfTimestamp( TS_UNIX, '20380119031408' ),
- 'Latest 32 bit unix time + 1' );
-
- $this->assertEquals( '19011213204551',
- wfTimestamp( TS_MW, '-2147483649' ),
- '1901 negative unix time to MediaWiki' );
-
- $this->assertEquals( '18010115123456',
- wfTimestamp( TS_MW, '-5331871504' ),
- '1801 negative unix time to MediaWiki' );
-
- $this->assertEquals( 'Tue, 09 Aug 0117 12:34:56 GMT',
- wfTimestamp( TS_RFC2822, '0117-08-09 12:34:56'),
- 'Death of Roman Emperor [[Trajan]]');
-
- /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
-
- $this->assertEquals( 'Sun, 01 Jan 0101 00:00:00 GMT',
- wfTimestamp( TS_RFC2822, '-58979923200'),
- '1/1/101');
-
- $this->assertEquals( 'Mon, 01 Jan 0001 00:00:00 GMT',
- wfTimestamp( TS_RFC2822, '-62135596800'),
- 'Year 1');
-
- /* It is not clear if we should generate a year 0 or not
- * We are completely off RFC2822 requirement of year being
- * 1900 or later.
- */
- $this->assertEquals( 'Wed, 18 Oct 0000 00:00:00 GMT',
- wfTimestamp( TS_RFC2822, '-62142076800'),
- 'ISO 8601:2004 [[year 0]], also called [[1 BC]]');
- }
-
- function testHttpDate() {
- # The Resource Loader uses wfTimestamp() to convert timestamps
- # from If-Modified-Since header.
- # Thus it must be able to parse all rfc2616 date formats
- # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
-
- $this->assertEquals(
- '19941106084937',
- wfTimestamp( TS_MW, 'Sun, 06 Nov 1994 08:49:37 GMT' ),
- 'RFC 822 date' );
-
- $this->assertEquals(
- '19941106084937',
- wfTimestamp( TS_MW, 'Sunday, 06-Nov-94 08:49:37 GMT' ),
- 'RFC 850 date' );
-
- $this->assertEquals(
- '19941106084937',
- wfTimestamp( TS_MW, 'Sun Nov 6 08:49:37 1994' ),
- "ANSI C's asctime() format" );
-
- // See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html and r77171
- $this->assertEquals(
- '20101122141242',
- wfTimestamp( TS_MW, 'Mon, 22 Nov 2010 14:12:42 GMT; length=52626' ),
- "Netscape extension to HTTP/1.0" );
-
- }
-
- function testTimestampParameter() {
- // 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
-
- $now = wfTimestamp( TS_UNIX );
- // 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 );
- $this->assertNotEquals( false, $zero );
- $this->assertLessThan( 5, $zero - $now );
-
- $empty = wfTimestamp( TS_UNIX, '' );
- $this->assertNotEquals( false, $empty );
- $this->assertLessThan( 5, $empty - $now );
-
- $null = wfTimestamp( TS_UNIX, null );
- $this->assertNotEquals( false, $null );
- $this->assertLessThan( 5, $null - $now );
- }
-
- function testBasename() {
- $sets = array(
- '' => '',
- '/' => '',
- '\\' => '',
- '//' => '',
- '\\\\' => '',
- 'a' => 'a',
- 'aaaa' => 'aaaa',
- '/a' => 'a',
- '\\a' => 'a',
- '/aaaa' => 'aaaa',
- '\\aaaa' => 'aaaa',
- '/aaaa/' => 'aaaa',
- '\\aaaa\\' => 'aaaa',
- '\\aaaa\\' => 'aaaa',
- '/mnt/upload3/wikipedia/en/thumb/8/8b/Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg' => '93px-Zork_Grand_Inquisitor_box_cover.jpg',
- 'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE' => 'VIEWER.EXE',
- 'Östergötland_coat_of_arms.png' => 'Östergötland_coat_of_arms.png',
- );
- foreach ( $sets as $from => $to ) {
- $this->assertEquals( $to, wfBaseName( $from ),
- "wfBaseName('$from') => '$to'" );
- }
- }
-
function testFallbackMbstringFunctions() {
@@ -701,135 +500,6 @@ class GlobalTest extends MediaWikiTestCase {
);
}
-
- /**
- * test @see wfBCP47().
- * Please note the BCP explicitly state that language codes are case
- * insensitive, there are some exceptions to the rule :)
- * This test is used to verify our formatting against all lower and
- * all upper cases language code.
- *
- * @see http://tools.ietf.org/html/bcp47
- * @dataProvider provideLanguageCodes()
- */
- function testBCP47( $code, $expected ) {
- $code = strtolower( $code );
- $this->assertEquals( $expected, wfBCP47($code),
- "Applying BCP47 standard to lower case '$code'"
- );
-
- $code = strtoupper( $code );
- $this->assertEquals( $expected, wfBCP47($code),
- "Applying BCP47 standard to upper case '$code'"
- );
- }
-
- /**
- * Array format is ($code, $expected)
- */
- function provideLanguageCodes() {
- return array(
- // Extracted from BCP47 (list not exhaustive)
- # 2.1.1
- array( 'en-ca-x-ca' , 'en-CA-x-ca' ),
- array( 'sgn-be-fr' , 'sgn-BE-FR' ),
- array( 'az-latn-x-latn', 'az-Latn-x-latn' ),
- # 2.2
- array( 'sr-Latn-RS', 'sr-Latn-RS' ),
- array( 'az-arab-ir', 'az-Arab-IR' ),
-
- # 2.2.5
- array( 'sl-nedis' , 'sl-nedis' ),
- array( 'de-ch-1996', 'de-CH-1996' ),
-
- # 2.2.6
- array(
- 'en-latn-gb-boont-r-extended-sequence-x-private',
- 'en-Latn-GB-boont-r-extended-sequence-x-private'
- ),
-
- // Examples from BCP47 Appendix A
- # Simple language subtag:
- array( 'DE', 'de' ),
- array( 'fR', 'fr' ),
- array( 'ja', 'ja' ),
-
- # Language subtag plus script subtag:
- array( 'zh-hans', 'zh-Hans'),
- array( 'sr-cyrl', 'sr-Cyrl'),
- array( 'sr-latn', 'sr-Latn'),
-
- # Extended language subtags and their primary language subtag
- # counterparts:
- array( 'zh-cmn-hans-cn', 'zh-cmn-Hans-CN' ),
- array( 'cmn-hans-cn' , 'cmn-Hans-CN' ),
- array( 'zh-yue-hk' , 'zh-yue-HK' ),
- array( 'yue-hk' , 'yue-HK' ),
-
- # Language-Script-Region:
- array( 'zh-hans-cn', 'zh-Hans-CN' ),
- array( 'sr-latn-RS', 'sr-Latn-RS' ),
-
- # Language-Variant:
- array( 'sl-rozaj' , 'sl-rozaj' ),
- array( 'sl-rozaj-biske', 'sl-rozaj-biske' ),
- array( 'sl-nedis' , 'sl-nedis' ),
-
- # Language-Region-Variant:
- array( 'de-ch-1901' , 'de-CH-1901' ),
- array( 'sl-it-nedis' , 'sl-IT-nedis' ),
-
- # Language-Script-Region-Variant:
- array( 'hy-latn-it-arevela', 'hy-Latn-IT-arevela' ),
-
- # Language-Region:
- array( 'de-de' , 'de-DE' ),
- array( 'en-us' , 'en-US' ),
- array( 'es-419', 'es-419'),
-
- # Private use subtags:
- array( 'de-ch-x-phonebk' , 'de-CH-x-phonebk' ),
- array( 'az-arab-x-aze-derbend', 'az-Arab-x-aze-derbend' ),
- /**
- * Previous test does not reflect the BCP which states:
- * az-Arab-x-AZE-derbend
- * AZE being private, it should be lower case, hence the test above
- * should probably be:
- #array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
- */
-
- # Private use registry values:
- array( 'x-whatever', 'x-whatever' ),
- array( 'qaa-qaaa-qm-x-southern', 'qaa-Qaaa-QM-x-southern' ),
- array( 'de-qaaa' , 'de-Qaaa' ),
- array( 'sr-latn-qm', 'sr-Latn-QM' ),
- array( 'sr-qaaa-rs', 'sr-Qaaa-RS' ),
-
- # Tags that use extensions
- array( 'en-us-u-islamcal', 'en-US-u-islamcal' ),
- array( 'zh-cn-a-myext-x-private', 'zh-CN-a-myext-x-private' ),
- array( 'en-a-myext-b-another', 'en-a-myext-b-another' ),
-
- # Invalid:
- // 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)
- */);
- }
-
/**
* @dataProvider provideMakeUrlIndexes()
*/
@@ -886,7 +556,63 @@ class GlobalTest extends MediaWikiTestCase {
),
);
}
+
+ /**
+ * @dataProvider provideWfMatchesDomainList
+ */
+ function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
+ $actual = wfMatchesDomainList( $url, $domains );
+ $this->assertEquals( $expected, $actual, $description );
+ }
+
+ function provideWfMatchesDomainList() {
+ $a = array();
+ $protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
+ foreach ( $protocols as $pDesc => $p ) {
+ $a = array_merge( $a, array(
+ array( "$p//www.example.com", array(), false, "No matches for empty domains array, $pDesc URL" ),
+ array( "$p//www.example.com", array( 'www.example.com' ), true, "Exact match in domains array, $pDesc URL" ),
+ array( "$p//www.example.com", array( 'example.com' ), true, "Match without subdomain in domains array, $pDesc URL" ),
+ 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" ),
+ ) );
+ }
+ return $a;
+ }
+ /**
+ * @dataProvider provideWfShellMaintenanceCmdList
+ */
+ function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
+ if( wfIsWindows() ) {
+ // Approximation that's good enough for our purposes just now
+ $expected = str_replace( "'", '"', $expected );
+ }
+ $actual = wfShellMaintenanceCmd( $script, $parameters, $options );
+ $this->assertEquals( $expected, $actual, $description );
+ }
+
+ function provideWfShellMaintenanceCmdList() {
+ global $wgPhpCli;
+ return array(
+ array( 'eval.php', array( '--help', '--test' ), array(),
+ "'$wgPhpCli' 'eval.php' '--help' '--test'",
+ "Called eval.php --help --test" ),
+ array( 'eval.php', array( '--help', '--test space' ), array('php' => 'php5'),
+ "'php5' 'eval.php' '--help' '--test space'",
+ "Called eval.php --help --test with php option" ),
+ array( 'eval.php', array( '--help', '--test', 'X' ), array('wrapper' => 'MWScript.php'),
+ "'$wgPhpCli' 'MWScript.php' 'eval.php' '--help' '--test' 'X'",
+ "Called eval.php --help --test with wrapper option" ),
+ array( 'eval.php', array( '--help', '--test', 'y' ), array('php' => 'php5', 'wrapper' => 'MWScript.php'),
+ "'php5' 'MWScript.php' 'eval.php' '--help' '--test' 'y'",
+ "Called eval.php --help --test with wrapper and php option" ),
+ );
+ }
/* TODO: many more! */
}
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
new file mode 100644
index 00000000..4879a38d
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @group Database
+ */
+class GlobalWithDBTest extends MediaWikiTestCase {
+ /**
+ * @dataProvider provideWfIsBadImageList
+ */
+ function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
+ $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
+ }
+
+ function provideWfIsBadImageList() {
+ $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
+ return array(
+ array( 'Bad.jpg', false, $blacklist, true,
+ 'Called on a bad image' ),
+ array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'A page' ), $blacklist, true,
+ 'Called on a bad image' ),
+ array( 'NotBad.jpg', false, $blacklist, false,
+ 'Called on a non-bad image' ),
+ array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'Nasty page' ), $blacklist, false,
+ 'Called on a bad image but is on a whitelisted page' ),
+ array( 'File:Bad.jpg', false, $blacklist, false,
+ 'Called on a bad image with File:' ),
+ );
+ }
+}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
new file mode 100644
index 00000000..be6c99e7
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Unit tests for wfAssembleUrl()
+ */
+
+class wfAssembleUrl extends MediaWikiTestCase {
+ /** @dataProvider provideURLParts */
+ public function testWfAssembleUrl( $parts, $output ) {
+ $partsDump = print_r( $parts, true );
+ $this->assertEquals(
+ $output,
+ wfAssembleUrl( $parts ),
+ "Testing $partsDump assembles to $output"
+ );
+ }
+
+ /**
+ * Provider of URL parts for testing wfAssembleUrl()
+ *
+ * @return array
+ */
+ public function provideURLParts() {
+ $schemes = array(
+ '' => array(),
+ '//' => array(
+ 'delimiter' => '//',
+ ),
+ 'http://' => array(
+ 'scheme' => 'http',
+ 'delimiter' => '://',
+ ),
+ );
+
+ $hosts = array(
+ '' => array(),
+ 'example.com' => array(
+ 'host' => 'example.com',
+ ),
+ 'example.com:123' => array(
+ 'host' => 'example.com',
+ 'port' => 123,
+ ),
+ 'id@example.com' => array(
+ 'user' => 'id',
+ 'host' => 'example.com',
+ ),
+ 'id@example.com:123' => array(
+ 'user' => 'id',
+ 'host' => 'example.com',
+ 'port' => 123,
+ ),
+ 'id:key@example.com' => array(
+ 'user' => 'id',
+ 'pass' => 'key',
+ 'host' => 'example.com',
+ ),
+ 'id:key@example.com:123' => array(
+ 'user' => 'id',
+ 'pass' => 'key',
+ 'host' => 'example.com',
+ 'port' => 123,
+ ),
+ );
+
+ $cases = array();
+ foreach ( $schemes as $scheme => $schemeParts ) {
+ foreach ( $hosts as $host => $hostParts ) {
+ foreach ( array( '', '/path' ) as $path ) {
+ foreach ( array( '', 'query' ) as $query ) {
+ foreach ( array( '', 'fragment' ) as $fragment ) {
+ $parts = array_merge(
+ $schemeParts,
+ $hostParts
+ );
+ $url = $scheme .
+ $host .
+ $path;
+
+ if ( $path ) {
+ $parts['path'] = $path;
+ }
+ if ( $query ) {
+ $parts['query'] = $query;
+ $url .= '?' . $query;
+ }
+ if( $fragment ) {
+ $parts['fragment'] = $fragment;
+ $url .= '#' . $fragment;
+ }
+
+
+ $cases[] = array(
+ $parts,
+ $url,
+ );
+ }
+ }
+ }
+ }
+ }
+
+ $complexURL = 'http://id:key@example.org:321' .
+ '/over/there?name=ferret&foo=bar#nose';
+ $cases[] = array(
+ wfParseUrl( $complexURL ),
+ $complexURL,
+ );
+
+ return $cases;
+ }
+}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
new file mode 100644
index 00000000..f4ec7a5f
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Unit tests for wfBCP47()
+ */
+class wfBCP47 extends MediaWikiTestCase {
+ /**
+ * test @see wfBCP47().
+ * Please note the BCP explicitly state that language codes are case
+ * insensitive, there are some exceptions to the rule :)
+ * This test is used to verify our formatting against all lower and
+ * all upper cases language code.
+ *
+ * @see http://tools.ietf.org/html/bcp47
+ * @dataProvider provideLanguageCodes()
+ */
+ function testBCP47( $code, $expected ) {
+ $code = strtolower( $code );
+ $this->assertEquals( $expected, wfBCP47($code),
+ "Applying BCP47 standard to lower case '$code'"
+ );
+
+ $code = strtoupper( $code );
+ $this->assertEquals( $expected, wfBCP47($code),
+ "Applying BCP47 standard to upper case '$code'"
+ );
+ }
+
+ /**
+ * Array format is ($code, $expected)
+ */
+ function provideLanguageCodes() {
+ return array(
+ // Extracted from BCP47 (list not exhaustive)
+ # 2.1.1
+ array( 'en-ca-x-ca' , 'en-CA-x-ca' ),
+ array( 'sgn-be-fr' , 'sgn-BE-FR' ),
+ array( 'az-latn-x-latn', 'az-Latn-x-latn' ),
+ # 2.2
+ array( 'sr-Latn-RS', 'sr-Latn-RS' ),
+ array( 'az-arab-ir', 'az-Arab-IR' ),
+
+ # 2.2.5
+ array( 'sl-nedis' , 'sl-nedis' ),
+ array( 'de-ch-1996', 'de-CH-1996' ),
+
+ # 2.2.6
+ array(
+ 'en-latn-gb-boont-r-extended-sequence-x-private',
+ 'en-Latn-GB-boont-r-extended-sequence-x-private'
+ ),
+
+ // Examples from BCP47 Appendix A
+ # Simple language subtag:
+ array( 'DE', 'de' ),
+ array( 'fR', 'fr' ),
+ array( 'ja', 'ja' ),
+
+ # Language subtag plus script subtag:
+ array( 'zh-hans', 'zh-Hans'),
+ array( 'sr-cyrl', 'sr-Cyrl'),
+ array( 'sr-latn', 'sr-Latn'),
+
+ # Extended language subtags and their primary language subtag
+ # counterparts:
+ array( 'zh-cmn-hans-cn', 'zh-cmn-Hans-CN' ),
+ array( 'cmn-hans-cn' , 'cmn-Hans-CN' ),
+ array( 'zh-yue-hk' , 'zh-yue-HK' ),
+ array( 'yue-hk' , 'yue-HK' ),
+
+ # Language-Script-Region:
+ array( 'zh-hans-cn', 'zh-Hans-CN' ),
+ array( 'sr-latn-RS', 'sr-Latn-RS' ),
+
+ # Language-Variant:
+ array( 'sl-rozaj' , 'sl-rozaj' ),
+ array( 'sl-rozaj-biske', 'sl-rozaj-biske' ),
+ array( 'sl-nedis' , 'sl-nedis' ),
+
+ # Language-Region-Variant:
+ array( 'de-ch-1901' , 'de-CH-1901' ),
+ array( 'sl-it-nedis' , 'sl-IT-nedis' ),
+
+ # Language-Script-Region-Variant:
+ array( 'hy-latn-it-arevela', 'hy-Latn-IT-arevela' ),
+
+ # Language-Region:
+ array( 'de-de' , 'de-DE' ),
+ array( 'en-us' , 'en-US' ),
+ array( 'es-419', 'es-419'),
+
+ # Private use subtags:
+ array( 'de-ch-x-phonebk' , 'de-CH-x-phonebk' ),
+ array( 'az-arab-x-aze-derbend', 'az-Arab-x-aze-derbend' ),
+ /**
+ * Previous test does not reflect the BCP which states:
+ * az-Arab-x-AZE-derbend
+ * AZE being private, it should be lower case, hence the test above
+ * should probably be:
+ #array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
+ */
+
+ # Private use registry values:
+ array( 'x-whatever', 'x-whatever' ),
+ array( 'qaa-qaaa-qm-x-southern', 'qaa-Qaaa-QM-x-southern' ),
+ array( 'de-qaaa' , 'de-Qaaa' ),
+ array( 'sr-latn-qm', 'sr-Latn-QM' ),
+ array( 'sr-qaaa-rs', 'sr-Qaaa-RS' ),
+
+ # Tags that use extensions
+ array( 'en-us-u-islamcal', 'en-US-u-islamcal' ),
+ array( 'zh-cn-a-myext-x-private', 'zh-CN-a-myext-x-private' ),
+ array( 'en-a-myext-b-another', 'en-a-myext-b-another' ),
+
+ # Invalid:
+ // 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/wfBaseNameTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
new file mode 100644
index 00000000..59954b23
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Tests for wfBaseName()
+ */
+class wfBaseName extends MediaWikiTestCase {
+ /**
+ * @dataProvider providePaths
+ */
+ function testBaseName( $fullpath, $basename ) {
+ $this->assertEquals( $basename, wfBaseName( $fullpath ),
+ "wfBaseName('$fullpath') => '$basename'" );
+ }
+
+ function providePaths() {
+ return array(
+ array( '', '' ),
+ array( '/', '' ),
+ array( '\\', '' ),
+ array( '//', '' ),
+ array( '\\\\', '' ),
+ array( 'a', 'a' ),
+ array( 'aaaa', 'aaaa' ),
+ array( '/a', 'a' ),
+ array( '\\a', 'a' ),
+ array( '/aaaa', 'aaaa' ),
+ array( '\\aaaa', 'aaaa' ),
+ array( '/aaaa/', 'aaaa' ),
+ array( '\\aaaa\\', 'aaaa' ),
+ array( '\\aaaa\\', 'aaaa' ),
+ array( '/mnt/upload3/wikipedia/en/thumb/8/8b/Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg',
+ '93px-Zork_Grand_Inquisitor_box_cover.jpg' ),
+ array( 'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE', 'VIEWER.EXE' ),
+ array( 'Östergötland_coat_of_arms.png', 'Östergötland_coat_of_arms.png' ),
+ );
+ }
+}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfExpandUrl.php b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
index b388b266..192689f8 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfExpandUrl.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Unit tests for wfExpandUrl()
*/
@@ -12,16 +12,16 @@ class wfExpandUrl extends MediaWikiTestCase {
$oldCanServer = $wgCanonicalServer;
$wgServer = $server;
$wgCanonicalServer = $canServer;
-
+
// Fake $_SERVER['HTTPS'] if needed
if ( $httpsMode ) {
$_SERVER['HTTPS'] = 'on';
} else {
unset( $_SERVER['HTTPS'] );
}
-
+
$this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
+
// Restore $wgServer and $wgCanonicalServer
$wgServer = $oldServer;
$wgCanonicalServer = $oldCanServer;
@@ -29,12 +29,14 @@ class wfExpandUrl extends MediaWikiTestCase {
/**
* Provider of URL examples for testing wfExpandUrl()
+ *
+ * @return array
*/
public function provideExpandableUrls() {
$modes = array( 'http', 'https' );
$servers = array( 'http' => 'http://example.com', 'https' => 'https://example.com', 'protocol-relative' => '//example.com' );
$defaultProtos = array( 'http' => PROTO_HTTP, 'https' => PROTO_HTTPS, 'protocol-relative' => PROTO_RELATIVE, 'current' => PROTO_CURRENT, 'canonical' => PROTO_CANONICAL );
-
+
$retval = array();
foreach ( $modes as $mode ) {
$httpsMode = $mode == 'https';
@@ -46,14 +48,14 @@ class wfExpandUrl extends MediaWikiTestCase {
$retval[] = array( 'https://example.com', 'https://example.com', $defaultProto, $server, $canServer, $httpsMode, "Testing fully qualified https URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
# Would be nice to support this, see fixme on wfExpandUrl()
$retval[] = array( "wiki/FooBar", 'wiki/FooBar', $defaultProto, $server, $canServer, $httpsMode, "Test non-expandable relative URLs (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
-
+
// Determine expected protocol
$p = $protoDesc . ':'; // default case
if ( $protoDesc == 'protocol-relative' ) {
$p = '';
- } else if ( $protoDesc == 'current' ) {
+ } elseif ( $protoDesc == 'current' ) {
$p = "$mode:";
- } else if ( $protoDesc == 'canonical' ) {
+ } elseif ( $protoDesc == 'canonical' ) {
$p = "$canServerMode:";
} else {
$p = $protoDesc . ':';
@@ -61,12 +63,12 @@ class wfExpandUrl extends MediaWikiTestCase {
// Determine expected server name
if ( $protoDesc == 'canonical' ) {
$srv = $canServer;
- } else if ( $serverDesc == 'protocol-relative' ) {
+ } elseif ( $serverDesc == 'protocol-relative' ) {
$srv = $p . $server;
} else {
$srv = $server;
}
-
+
$retval[] = array( "$p//wikipedia.org", '//wikipedia.org', $defaultProto, $server, $canServer, $httpsMode, "Test protocol-relative URL (defaultProto: $protoDesc, wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
$retval[] = array( "$srv/wiki/FooBar", '/wiki/FooBar', $defaultProto, $server, $canServer, $httpsMode, "Testing expanding URL beginning with / (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
new file mode 100644
index 00000000..1cf0e0fb
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Unit tests for wfRemoveDotSegments()
+ */
+
+class wfRemoveDotSegments extends MediaWikiTestCase {
+ /** @dataProvider providePaths */
+ public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
+ $this->assertEquals(
+ $outputPath,
+ wfRemoveDotSegments( $inputPath ),
+ "Testing $inputPath expands to $outputPath"
+ );
+ }
+
+ /**
+ * Provider of URL paths for testing wfRemoveDotSegments()
+ *
+ * @return array
+ */
+ public function providePaths() {
+ return array(
+ array( '/a/b/c/./../../g', '/a/g' ),
+ array( 'mid/content=5/../6', 'mid/6' ),
+ array( '/a//../b', '/a/b' ),
+ array( '/.../a', '/.../a' ),
+ array( '.../a', '.../a' ),
+ array( '', '' ),
+ array( '/', '/' ),
+ array( '//', '//' ),
+ array( '.', '' ),
+ array( '..', '' ),
+ array( '...', '...' ),
+ array( '/.', '/' ),
+ array( '/..', '/' ),
+ array( './', '' ),
+ array( '../', '' ),
+ array( './a', 'a' ),
+ array( '../a', 'a' ),
+ array( '../../a', 'a' ),
+ array( '.././a', 'a' ),
+ array( './../a', 'a' ),
+ array( '././a', 'a' ),
+ array( '../../', '' ),
+ array( '.././', '' ),
+ array( './../', '' ),
+ array( '././', '' ),
+ array( '../..', '' ),
+ array( '../.', '' ),
+ array( './..', '' ),
+ array( './.', '' ),
+ array( '/../../a', '/a' ),
+ array( '/.././a', '/a' ),
+ array( '/./../a', '/a' ),
+ array( '/././a', '/a' ),
+ array( '/../../', '/' ),
+ array( '/.././', '/' ),
+ array( '/./../', '/' ),
+ array( '/././', '/' ),
+ array( '/../..', '/' ),
+ array( '/../.', '/' ),
+ array( '/./..', '/' ),
+ array( '/./.', '/' ),
+ array( 'b/../../a', '/a' ),
+ array( 'b/.././a', '/a' ),
+ array( 'b/./../a', '/a' ),
+ array( 'b/././a', 'b/a' ),
+ array( 'b/../../', '/' ),
+ array( 'b/.././', '/' ),
+ array( 'b/./../', '/' ),
+ array( 'b/././', 'b/' ),
+ array( 'b/../..', '/' ),
+ array( 'b/../.', '/' ),
+ array( 'b/./..', '/' ),
+ array( 'b/./.', 'b/' ),
+ array( '/b/../../a', '/a' ),
+ array( '/b/.././a', '/a' ),
+ array( '/b/./../a', '/a' ),
+ array( '/b/././a', '/b/a' ),
+ array( '/b/../../', '/' ),
+ array( '/b/.././', '/' ),
+ array( '/b/./../', '/' ),
+ array( '/b/././', '/b/' ),
+ array( '/b/../..', '/' ),
+ array( '/b/../.', '/' ),
+ array( '/b/./..', '/' ),
+ array( '/b/./.', '/b/' ),
+ );
+ }
+}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
new file mode 100644
index 00000000..1df26d2c
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
@@ -0,0 +1,28 @@
+<?php
+
+class wfShorthandToIntegerTest extends MediaWikiTestCase {
+ /**
+ * @dataProvider provideABunchOfShorthands
+ */
+ function testWfShorthandToInteger( $input, $output, $description ) {
+ $this->assertEquals(
+ wfShorthandToInteger( $input ),
+ $output,
+ $description
+ );
+ }
+
+ function provideABunchOfShorthands() {
+ return array(
+ array( '', -1, 'Empty string' ),
+ array( ' ', -1, 'String of spaces' ),
+ array( '1G', 1024 * 1024 * 1024, 'One gig uppercased' ),
+ array( '1g', 1024 * 1024 * 1024, 'One gig lowercased' ),
+ array( '1M', 1024 * 1024, 'One meg uppercased' ),
+ array( '1m', 1024 * 1024, 'One meg lowercased' ),
+ array( '1K', 1024, 'One kb uppercased' ),
+ array( '1k', 1024, 'One kb lowercased' ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
new file mode 100644
index 00000000..505c28c7
--- /dev/null
+++ b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * Tests for wfTimestamp()
+ */
+class wfTimestamp extends MediaWikiTestCase {
+ /**
+ * @dataProvider provideNormalTimestamps
+ */
+ function testNormalTimestamps( $input, $format, $output, $desc ) {
+ $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
+ }
+
+ function provideNormalTimestamps() {
+ $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
+ return array (
+ // TS_UNIX
+ array( $t, TS_MW, '20010115123456', 'TS_UNIX to TS_MW' ),
+ array( -30281104, TS_MW, '19690115123456', 'Negative TS_UNIX to TS_MW' ),
+ array( $t, TS_UNIX, 979562096, 'TS_UNIX to TS_UNIX' ),
+ array( $t, TS_DB, '2001-01-15 12:34:56', 'TS_UNIX to TS_DB' ),
+
+ array( $t, TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_ISO_8601_BASIC to TS_DB' ),
+
+ // TS_MW
+ array( '20010115123456', TS_MW, '20010115123456', 'TS_MW to TS_MW' ),
+ array( '20010115123456', TS_UNIX, 979562096, 'TS_MW to TS_UNIX' ),
+ array( '20010115123456', TS_DB, '2001-01-15 12:34:56', 'TS_MW to TS_DB' ),
+ array( '20010115123456', TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_MW to TS_ISO_8601_BASIC' ),
+
+ // TS_DB
+ array( '2001-01-15 12:34:56', TS_MW, '20010115123456', 'TS_DB to TS_MW' ),
+ array( '2001-01-15 12:34:56', TS_UNIX, 979562096, 'TS_DB to TS_UNIX' ),
+ array( '2001-01-15 12:34:56', TS_DB, '2001-01-15 12:34:56', 'TS_DB to TS_DB' ),
+ array( '2001-01-15 12:34:56', TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_DB to TS_ISO_8601_BASIC' ),
+
+ # rfc2822 section 3.3
+ array( '20010115123456', TS_RFC2822, 'Mon, 15 Jan 2001 12:34:56 GMT', 'TS_MW to TS_RFC2822' ),
+ array( 'Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 to TS_MW' ),
+ array( ' Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 with leading space to TS_MW' ),
+ array( '15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 without optional day-of-week to TS_MW' ),
+
+ # FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space
+ # obs-FWS = 1*WSP *(CRLF 1*WSP) ; Section 4.2
+ array( 'Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 to TS_MW' ),
+
+ # WSP = SP / HTAB ; rfc2234
+ array( "Mon, 15 Jan\x092001 12:34:56 GMT", TS_MW, '20010115123456', 'TS_RFC2822 with HTAB to TS_MW' ),
+ array( "Mon, 15 Jan\x09 \x09 2001 12:34:56 GMT", TS_MW, '20010115123456', 'TS_RFC2822 with HTAB and SP to TS_MW' ),
+ array( 'Sun, 6 Nov 94 08:49:37 GMT', TS_MW, '19941106084937', 'TS_RFC2822 with obsolete year to TS_MW' ),
+ );
+ }
+
+ /**
+ * This test checks wfTimestamp() with values outside.
+ * It needs PHP 64 bits or PHP > 5.1.
+ * See r74778 and bug 25451
+ * @dataProvider provideOldTimestamps
+ */
+ function testOldTimestamps( $input, $format, $output, $desc ) {
+ $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
+ }
+
+ 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' ),
+ array( '19011213204552', TS_UNIX, '-2147483648', 'Earliest 32 bit unix time' ),
+ array( '20380119031407', TS_UNIX, '2147483647', 'Latest 32 bit unix time' ),
+ array( '19011213204552', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:52 GMT', 'Earliest 32 bit time' ),
+ array( '19011213204551', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:51 GMT', 'Earliest 32 bit time - 1' ),
+ array( '20380119031408', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:08 GMT', 'Latest 32 bit time + 1' ),
+ array( '19011212000000', TS_MW, '19011212000000', 'Convert to itself r74778#c10645' ),
+ array( '19011213204551', TS_UNIX, '-2147483649', 'Earliest 32 bit unix time - 1' ),
+ array( '20380119031408', TS_UNIX, '2147483648', 'Latest 32 bit unix time + 1' ),
+ array( '-2147483649', TS_MW, '19011213204551', '1901 negative unix time to MediaWiki' ),
+ array( '-5331871504', TS_MW, '18010115123456', '1801 negative unix time to MediaWiki' ),
+ array( '0117-08-09 12:34:56', TS_RFC2822, 'Tue, 09 Aug 0117 12:34:56 GMT', 'Death of Roman Emperor [[Trajan]]' ),
+
+ /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
+ array( '-58979923200', TS_RFC2822, 'Sun, 01 Jan 0101 00:00:00 GMT', '1/1/101' ),
+ array( '-62135596800', TS_RFC2822, 'Mon, 01 Jan 0001 00:00:00 GMT', 'Year 1' ),
+
+ /* It is not clear if we should generate a year 0 or not
+ * We are completely off RFC2822 requirement of year being
+ * 1900 or later.
+ */
+ array( '-62142076800', TS_RFC2822, 'Wed, 18 Oct 0000 00:00:00 GMT', 'ISO 8601:2004 [[year 0]], also called [[1 BC]]' ),
+ );
+ }
+
+ /**
+ * The Resource Loader uses wfTimestamp() to convert timestamps
+ * from If-Modified-Since header. Thus it must be able to parse all
+ * rfc2616 date formats
+ * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
+ * @dataProvider provideHttpDates
+ */
+ function testHttpDate( $input, $output, $desc ) {
+ $this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
+ }
+
+ 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' ),
+ array( 'Sun Nov 6 08:49:37 1994', '19941106084937', "ANSI C's asctime() format" ),
+ // See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html and r77171
+ array( 'Mon, 22 Nov 2010 14:12:42 GMT; length=52626', '20101122141242', 'Netscape extension to HTTP/1.0' ),
+ );
+ }
+
+ /**
+ * 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() {
+ $now = wfTimestamp( TS_UNIX );
+ // 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 );
+ $this->assertNotEquals( false, $zero );
+ $this->assertLessThan( 5, $zero - $now );
+
+ $empty = wfTimestamp( TS_UNIX, '' );
+ $this->assertNotEquals( false, $empty );
+ $this->assertLessThan( 5, $empty - $now );
+
+ $null = wfTimestamp( TS_UNIX, null );
+ $this->assertNotEquals( false, $null );
+ $this->assertLessThan( 5, $null - $now );
+ }
+}
diff --git a/tests/phpunit/includes/HtmlTest.php b/tests/phpunit/includes/HtmlTest.php
index 96bb1803..67b60d32 100644
--- a/tests/phpunit/includes/HtmlTest.php
+++ b/tests/phpunit/includes/HtmlTest.php
@@ -3,58 +3,90 @@
class HtmlTest extends MediaWikiTestCase {
private static $oldLang;
+ private static $oldContLang;
+ private static $oldLanguageCode;
+ private static $oldNamespaces;
public function setUp() {
- global $wgLang, $wgLanguageCode;
+ global $wgLang, $wgContLang, $wgLanguageCode;
self::$oldLang = $wgLang;
+ self::$oldContLang = $wgContLang;
+ self::$oldNamespaces = $wgContLang->getNamespaces();
+ self::$oldLanguageCode = $wgLanguageCode;
+
$wgLanguageCode = 'en';
- $wgLang = Language::factory( $wgLanguageCode );
+ $wgContLang = $wgLang = Language::factory( $wgLanguageCode );
+
+ // Hardcode namespaces during test runs,
+ // so that html output based on existing namespaces
+ // can be properly evaluated.
+ $wgContLang->setNamespaces( array(
+ -2 => 'Media',
+ -1 => 'Special',
+ 0 => '',
+ 1 => 'Talk',
+ 2 => 'User',
+ 3 => 'User_talk',
+ 4 => 'MyWiki',
+ 5 => 'MyWiki_Talk',
+ 6 => 'File',
+ 7 => 'File_talk',
+ 8 => 'MediaWiki',
+ 9 => 'MediaWiki_talk',
+ 10 => 'Template',
+ 11 => 'Template_talk',
+ 100 => 'Custom',
+ 101 => 'Custom_talk',
+ ) );
}
public function tearDown() {
- global $wgLang, $wgLanguageCode;
+ global $wgLang, $wgContLang, $wgLanguageCode;
+
+ $wgContLang->setNamespaces( self::$oldNamespaces );
$wgLang = self::$oldLang;
- $wgLanguageCode = $wgLang->getCode();
+ $wgContLang = self::$oldContLang;
+ $wgLanguageCode = self::$oldLanguageCode;
}
public function testExpandAttributesSkipsNullAndFalse() {
### EMPTY ########
$this->AssertEmpty(
- Html::expandAttributes( array( 'foo'=>null) ),
+ Html::expandAttributes( array( 'foo' => null ) ),
'skip keys with null value'
);
$this->AssertEmpty(
- Html::expandAttributes( array( 'foo'=>false) ),
+ Html::expandAttributes( array( 'foo' => false ) ),
'skip keys with false value'
);
$this->AssertNotEmpty(
- Html::expandAttributes( array( 'foo'=>'') ),
+ Html::expandAttributes( array( 'foo' => '' ) ),
'keep keys with an empty string'
);
}
public function testExpandAttributesForBooleans() {
+ global $wgHtml5;
$this->AssertEquals(
'',
- Html::expandAttributes( array( 'selected'=>false) ),
+ Html::expandAttributes( array( 'selected' => false ) ),
'Boolean attributes do not generates output when value is false'
);
$this->AssertEquals(
'',
- Html::expandAttributes( array( 'selected'=>null) ),
+ Html::expandAttributes( array( 'selected' => null ) ),
'Boolean attributes do not generates output when value is null'
);
- ### FIXME: maybe they should just output 'selected'
$this->AssertEquals(
- ' selected=""',
- Html::expandAttributes( array( 'selected'=>true ) ),
+ $wgHtml5 ? ' selected=""' : ' selected="selected"',
+ Html::expandAttributes( array( 'selected' => true ) ),
'Boolean attributes skip value output'
);
$this->AssertEquals(
- ' selected=""',
+ $wgHtml5 ? ' selected=""' : ' selected="selected"',
Html::expandAttributes( array( 'selected' ) ),
'Boolean attributes (ex: selected) do not need a value'
);
@@ -68,23 +100,234 @@ class HtmlTest extends MediaWikiTestCase {
### NOT EMPTY ####
$this->AssertEquals(
' empty_string=""',
- Html::expandAttributes( array( 'empty_string'=>'') ),
+ Html::expandAttributes( array( 'empty_string' => '' ) ),
'Value with an empty string'
);
$this->AssertEquals(
' key="value"',
- Html::expandAttributes( array( 'key'=>'value') ),
+ Html::expandAttributes( array( 'key' => 'value' ) ),
'Value is a string'
);
$this->AssertEquals(
' one="1"',
- Html::expandAttributes( array( 'one'=>1) ),
+ Html::expandAttributes( array( 'one' => 1 ) ),
'Value is a numeric one'
);
$this->AssertEquals(
' zero="0"',
- Html::expandAttributes( array( 'zero'=>0) ),
+ Html::expandAttributes( array( 'zero' => 0 ) ),
'Value is a numeric zero'
);
}
+
+ /**
+ * Html::expandAttributes has special features for HTML
+ * attributes that use space separated lists and also
+ * allows arrays to be used as values.
+ */
+ public function testExpandAttributesListValueAttributes() {
+ ### STRING VALUES
+ $this->AssertEquals(
+ ' class="redundant spaces here"',
+ Html::expandAttributes( array( 'class' => ' redundant spaces here ' ) ),
+ 'Normalization should strip redundant spaces'
+ );
+ $this->AssertEquals(
+ ' class="foo bar"',
+ Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
+ 'Normalization should remove duplicates in string-lists'
+ );
+ ### "EMPTY" ARRAY VALUES
+ $this->AssertEquals(
+ ' class=""',
+ Html::expandAttributes( array( 'class' => array() ) ),
+ 'Value with an empty array'
+ );
+ $this->AssertEquals(
+ ' class=""',
+ Html::expandAttributes( array( 'class' => array( null, '', ' ', ' ' ) ) ),
+ 'Array with null, empty string and spaces'
+ );
+ ### NON-EMPTY ARRAY VALUES
+ $this->AssertEquals(
+ ' class="foo bar"',
+ Html::expandAttributes( array( 'class' => array(
+ 'foo',
+ 'bar',
+ 'foo',
+ 'bar',
+ 'bar',
+ ) ) ),
+ 'Normalization should remove duplicates in the array'
+ );
+ $this->AssertEquals(
+ ' class="foo bar"',
+ Html::expandAttributes( array( 'class' => array(
+ 'foo bar',
+ 'bar foo',
+ 'foo',
+ 'bar bar',
+ ) ) ),
+ 'Normalization should remove duplicates in string-lists in the array'
+ );
+ }
+
+ /**
+ * Test feature added by r96188, let pass attributes values as
+ * a PHP array. Restricted to class,rel, accesskey.
+ */
+ function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
+ $this->assertEquals(
+ ' class="booltrue one"',
+ Html::expandAttributes( array( 'class' => array(
+ 'booltrue' => true,
+ 'one' => 1,
+
+ # Method use isset() internally, make sure we do discard
+ # attributes values which have been assigned well known values
+ 'emptystring' => '',
+ 'boolfalse' => false,
+ 'zero' => 0,
+ 'null' => null,
+ )))
+ );
+ }
+
+ /**
+ * How do we handle duplicate keys in HTML attributes expansion?
+ * We could pass a "class" the values: 'GREEN' and array( 'GREEN' => false )
+ * The later will take precedence.
+ *
+ * Feature added by r96188
+ */
+ function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
+ $this->assertEquals(
+ ' class=""',
+ Html::expandAttributes( array( 'class' => array(
+ 'GREEN',
+ 'GREEN' => false,
+ 'GREEN',
+ )))
+ );
+ }
+
+ function testNamespaceSelector() {
+ $this->assertEquals(
+ '<select id="namespace" name="namespace">' . "\n" .
+'<option value="0">(Main)</option>' . "\n" .
+'<option value="1">Talk</option>' . "\n" .
+'<option value="2">User</option>' . "\n" .
+'<option value="3">User talk</option>' . "\n" .
+'<option value="4">MyWiki</option>' . "\n" .
+'<option value="5">MyWiki Talk</option>' . "\n" .
+'<option value="6">File</option>' . "\n" .
+'<option value="7">File talk</option>' . "\n" .
+'<option value="8">MediaWiki</option>' . "\n" .
+'<option value="9">MediaWiki talk</option>' . "\n" .
+'<option value="10">Template</option>' . "\n" .
+'<option value="11">Template talk</option>' . "\n" .
+'<option value="100">Custom</option>' . "\n" .
+'<option value="101">Custom talk</option>' . "\n" .
+'</select>',
+ Html::namespaceSelector(),
+ 'Basic namespace selector without custom options'
+ );
+ $this->assertEquals(
+ '<label for="mw-test-namespace">Select a namespace:</label>&#160;' .
+'<select id="mw-test-namespace" name="wpNamespace">' . "\n" .
+'<option value="all">all</option>' . "\n" .
+'<option value="0">(Main)</option>' . "\n" .
+'<option value="1">Talk</option>' . "\n" .
+'<option value="2" selected="">User</option>' . "\n" .
+'<option value="3">User talk</option>' . "\n" .
+'<option value="4">MyWiki</option>' . "\n" .
+'<option value="5">MyWiki Talk</option>' . "\n" .
+'<option value="6">File</option>' . "\n" .
+'<option value="7">File talk</option>' . "\n" .
+'<option value="8">MediaWiki</option>' . "\n" .
+'<option value="9">MediaWiki talk</option>' . "\n" .
+'<option value="10">Template</option>' . "\n" .
+'<option value="11">Template talk</option>' . "\n" .
+'<option value="100">Custom</option>' . "\n" .
+'<option value="101">Custom talk</option>' . "\n" .
+'</select>',
+ Html::namespaceSelector(
+ array( 'selected' => '2', 'all' => 'all', 'label' => 'Select a namespace:' ),
+ array( 'name' => 'wpNamespace', 'id' => 'mw-test-namespace' )
+ ),
+ 'Basic namespace selector with custom values'
+ );
+ }
+
+ function testNamespaceSelectorIdAndNameDefaultsAttributes() {
+
+ $this->assertNsSelectorIdAndName(
+ 'namespace', 'namespace',
+ Html::namespaceSelector( array(), array(
+ # neither 'id' nor 'name' key given
+ )),
+ "Neither 'id' nor 'name' key given"
+ );
+
+ $this->assertNsSelectorIdAndName(
+ 'namespace', 'select_name',
+ Html::namespaceSelector( array(), array(
+ 'name' => 'select_name',
+ # no 'id' key given
+ )),
+ "No 'id' key given, 'name' given"
+ );
+
+ $this->assertNsSelectorIdAndName(
+ 'select_id', 'namespace',
+ Html::namespaceSelector( array(), array(
+ 'id' => 'select_id',
+ # no 'name' key given
+ )),
+ "'id' given, no 'name' key given"
+ );
+
+ $this->assertNsSelectorIdAndName(
+ 'select_id', 'select_name',
+ Html::namespaceSelector( array(), array(
+ 'id' => 'select_id',
+ 'name' => 'select_name',
+ )),
+ "Both 'id' and 'name' given"
+ );
+ }
+
+ /**
+ * Helper to verify <select> attributes generated by Html::namespaceSelector()
+ * This helper expect the Html method to use 'namespace' as a default value for
+ * both 'id' and 'name' attributes.
+ *
+ * @param String $expectedId <select> id attribute value
+ * @param String $expectedName <select> name attribute value
+ * @param String $html Output of a call to Html::namespaceSelector()
+ * @param String $msg Optional message (default: '')
+ */
+ function assertNsSelectorIdAndName( $expectedId, $expectedName, $html, $msg = '' ) {
+ $actualId = 'namespace';
+ if( 1 === preg_match( '/id="(.+?)"/', $html, $m ) ) {
+ $actualId = $m[1];
+ }
+
+ $actualName = 'namespace';
+ if( 1 === preg_match( '/name="(.+?)"/', $html, $m ) ) {
+ $actualName = $m[1];
+ }
+ $this->assertEquals(
+ array( #expected
+ 'id' => $expectedId,
+ 'name' => $expectedName,
+ ),
+ array( #actual
+ 'id' => $actualId,
+ 'name' => $actualName,
+ ),
+ 'Html::namespaceSelector() got wrong id and/or name attribute(s). ' . $msg
+ );
+ }
+
}
diff --git a/tests/phpunit/includes/HttpTest.php b/tests/phpunit/includes/HttpTest.php
index 1a99af7d..263383f1 100644
--- a/tests/phpunit/includes/HttpTest.php
+++ b/tests/phpunit/includes/HttpTest.php
@@ -1,325 +1,12 @@
<?php
-
-class MockCookie extends Cookie {
- public function canServeDomain( $arg ) { return parent::canServeDomain( $arg ); }
- public function canServePath( $arg ) { return parent::canServePath( $arg ); }
- public function isUnExpired() { return parent::isUnExpired(); }
-}
-
/**
* @group Broken
*/
class HttpTest extends MediaWikiTestCase {
- static $content;
- static $headers;
- static $has_curl;
- static $has_fopen;
- static $has_proxy = false;
- static $proxy = "http://hulk:8080/";
- var $test_geturl = array(
- "http://en.wikipedia.org/robots.txt",
- "https://secure.wikimedia.org/",
- "http://pecl.php.net/feeds/pkg_apc.rss",
- "http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw",
- "http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:MediaWiki_hooks&format=php",
- );
- var $test_requesturl = array( "http://en.wikipedia.org/wiki/Special:Export/User:MarkAHershberger" );
-
- var $test_posturl = array( "http://www.comp.leeds.ac.uk/cgi-bin/Perl/environment-example" => "review=test" );
-
- function setUp() {
- putenv( "http_proxy" ); /* Remove any proxy env var, so curl doesn't get confused */
- if ( is_array( self::$content ) ) {
- return;
- }
- self::$has_curl = function_exists( 'curl_init' );
- self::$has_fopen = wfIniGetBool( 'allow_url_fopen' );
-
- if ( !file_exists( "/usr/bin/curl" ) ) {
- $this->markTestIncomplete( "This test requires the curl binary at /usr/bin/curl. If you have curl, please file a bug on this test, or, better yet, provide a patch." );
- }
-
- $content = tempnam( wfTempDir(), "" );
- $headers = tempnam( wfTempDir(), "" );
- if ( !$content && !$headers ) {
- die( "Couldn't create temp file!" );
- }
-
- // This probably isn't the best test for a proxy, but it works on my system!
- system( "curl -0 -o $content -s " . self::$proxy );
- $out = file_get_contents( $content );
- if ( $out ) {
- self::$has_proxy = true;
- }
-
- /* Maybe use wget instead of curl here ... just to use a different codebase? */
- foreach ( $this->test_geturl as $u ) {
- system( "curl -0 -s -D $headers '$u' -o $content" );
- self::$content["GET $u"] = file_get_contents( $content );
- self::$headers["GET $u"] = file_get_contents( $headers );
- }
- foreach ( $this->test_requesturl as $u ) {
- system( "curl -0 -s -X POST -H 'Content-Length: 0' -D $headers '$u' -o $content" );
- self::$content["POST $u"] = file_get_contents( $content );
- self::$headers["POST $u"] = file_get_contents( $headers );
- }
- foreach ( $this->test_posturl as $u => $postData ) {
- system( "curl -0 -s -X POST -d '$postData' -D $headers '$u' -o $content" );
- self::$content["POST $u => $postData"] = file_get_contents( $content );
- self::$headers["POST $u => $postData"] = file_get_contents( $headers );
- }
- unlink( $content );
- unlink( $headers );
- }
-
-
- function testInstantiation() {
- Http::$httpEngine = false;
-
- $r = MWHttpRequest::factory( "http://www.example.com/" );
- if ( self::$has_curl ) {
- $this->assertThat( $r, $this->isInstanceOf( 'CurlHttpRequest' ) );
- } else {
- $this->assertThat( $r, $this->isInstanceOf( 'PhpHttpRequest' ) );
- }
- unset( $r );
-
- if ( !self::$has_fopen ) {
- $this->setExpectedException( 'MWException' );
- }
- Http::$httpEngine = 'php';
- $r = MWHttpRequest::factory( "http://www.example.com/" );
- $this->assertThat( $r, $this->isInstanceOf( 'PhpHttpRequest' ) );
- unset( $r );
-
- if ( !self::$has_curl ) {
- $this->setExpectedException( 'MWException' );
- }
- Http::$httpEngine = 'curl';
- $r = MWHttpRequest::factory( "http://www.example.com/" );
- if ( self::$has_curl ) {
- $this->assertThat( $r, $this->isInstanceOf( 'CurlHttpRequest' ) );
- }
- }
-
- function runHTTPFailureChecks() {
- // Each of the following requests should result in a failure.
-
- $timeout = 1;
- $start_time = time();
- $r = Http::get( "http://www.example.com:1/", $timeout );
- $end_time = time();
- $this->assertLessThan( $timeout + 2, $end_time - $start_time,
- "Request took less than {$timeout}s via " . Http::$httpEngine );
- $this->assertEquals( $r, false, "false -- what we get on error from Http::get()" );
-
- $r = Http::get( "http://www.mediawiki.org/xml/made-up-url", $timeout );
- $this->assertFalse( $r, "False on 404s" );
-
-
- $r = MWHttpRequest::factory( "http://www.mediawiki.org/xml/made-up-url" );
- $er = $r->execute();
- if ( $r instanceof PhpHttpRequest && version_compare( '5.2.10', phpversion(), '>' ) ) {
- $this->assertRegexp( "/HTTP request failed/", $er->getWikiText() );
- } else {
- $this->assertRegexp( "/404 Not Found/", $er->getWikiText() );
- }
- }
-
- function testFailureDefault() {
- Http::$httpEngine = false;
- $this->runHTTPFailureChecks();
- }
-
- function testFailurePhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- $this->runHTTPFailureChecks();
- }
-
- function testFailureCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- $this->runHTTPFailureChecks();
- }
-
- /* ./phase3/includes/Import.php:1108: $data = Http::request( $method, $url ); */
- /* ./includes/Import.php:1124: $link = Title::newFromText( "$interwiki:Special:Export/$page" ); */
- /* ./includes/Import.php:1134: return ImportStreamSource::newFromURL( $url, "POST" ); */
- function runHTTPRequests( $proxy = null ) {
- $opt = array();
-
- if ( $proxy ) {
- $opt['proxy'] = $proxy;
- } elseif ( $proxy === false ) {
- $opt['noProxy'] = true;
- }
-
- /* no postData here because the only request I could find in code so far didn't have any */
- foreach ( $this->test_requesturl as $u ) {
- $r = Http::request( "POST", $u, $opt );
- $this->assertEquals( self::$content["POST $u"], "$r", "POST $u with " . Http::$httpEngine );
- }
- }
-
- function testRequestDefault() {
- Http::$httpEngine = false;
- $this->runHTTPRequests();
- }
-
- function testRequestPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- $this->runHTTPRequests();
- }
-
- function testRequestCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- $this->runHTTPRequests();
- }
-
- function runHTTPGets( $proxy = null ) {
- $opt = array();
-
- if ( $proxy ) {
- $opt['proxy'] = $proxy;
- } elseif ( $proxy === false ) {
- $opt['noProxy'] = true;
- }
-
- foreach ( $this->test_geturl as $u ) {
- $r = Http::get( $u, 30, $opt ); /* timeout of 30s */
- $this->assertEquals( self::$content["GET $u"], "$r", "Get $u with " . Http::$httpEngine );
- }
- }
-
- function testGetDefault() {
- Http::$httpEngine = false;
- $this->runHTTPGets();
- }
-
- function testGetPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- $this->runHTTPGets();
- }
-
- function testGetCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- $this->runHTTPGets();
- }
-
- function runHTTPPosts( $proxy = null ) {
- $opt = array();
-
- if ( $proxy ) {
- $opt['proxy'] = $proxy;
- } elseif ( $proxy === false ) {
- $opt['noProxy'] = true;
- }
-
- foreach ( $this->test_posturl as $u => $postData ) {
- $opt['postData'] = $postData;
- $r = Http::post( $u, $opt );
- $this->assertEquals( self::$content["POST $u => $postData"], "$r",
- "POST $u (postData=$postData) with " . Http::$httpEngine );
- }
- }
-
- function testPostDefault() {
- Http::$httpEngine = false;
- $this->runHTTPPosts();
- }
-
- function testPostPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = "php";
- $this->runHTTPPosts();
- }
-
- function testPostCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = "curl";
- $this->runHTTPPosts();
- }
-
- function runProxyRequests() {
- if ( !self::$has_proxy ) {
- $this->markTestIncomplete( "This test requires a proxy." );
- }
- $this->runHTTPGets( self::$proxy );
- $this->runHTTPPosts( self::$proxy );
- $this->runHTTPRequests( self::$proxy );
-
- // Set false here to do noProxy
- $this->runHTTPGets( false );
- $this->runHTTPPosts( false );
- $this->runHTTPRequests( false );
- }
-
- function testProxyDefault() {
- Http::$httpEngine = false;
- $this->runProxyRequests();
- }
-
- function testProxyPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = 'php';
- $this->runProxyRequests();
- }
-
- function testProxyCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = 'curl';
- $this->runProxyRequests();
- }
-
- function testIsLocalUrl() {
- }
-
- /* ./extensions/DonationInterface/payflowpro_gateway/payflowpro_gateway.body.php:559: $user_agent = Http::userAgent(); */
- function testUserAgent() {
- }
-
- function testIsValidUrl() {
- }
-
/**
* @dataProvider cookieDomains
*/
- function testValidateCookieDomain( $expected, $domain, $origin=null ) {
+ function testValidateCookieDomain( $expected, $domain, $origin = null ) {
if ( $origin ) {
$ok = Cookie::validateCookieDomain( $domain, $origin );
$msg = "$domain against origin $origin";
@@ -329,7 +16,7 @@ class HttpTest extends MediaWikiTestCase {
}
$this->assertEquals( $expected, $ok, $msg );
}
-
+
function cookieDomains() {
return array(
array( false, "org"),
@@ -359,189 +46,11 @@ class HttpTest extends MediaWikiTestCase {
);
}
- function testSetCooke() {
- $c = new MockCookie( "name", "value",
- array(
- "domain" => "ac.th",
- "path" => "/path/",
- ) );
- $this->assertFalse( $c->canServeDomain( "ac.th" ) );
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => "example.com",
- "path" => "/path/",
- ) );
-
- $this->assertTrue( $c->canServeDomain( "example.com" ) );
- $this->assertFalse( $c->canServeDomain( "www.example.com" ) );
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- ) );
-
- $this->assertFalse( $c->canServeDomain( "www.example.net" ) );
- $this->assertFalse( $c->canServeDomain( "example.com" ) );
- $this->assertTrue( $c->canServeDomain( "www.example.com" ) );
-
- $this->assertFalse( $c->canServePath( "/" ) );
- $this->assertFalse( $c->canServePath( "/bogus/path/" ) );
- $this->assertFalse( $c->canServePath( "/path" ) );
- $this->assertTrue( $c->canServePath( "/path/" ) );
-
- $this->assertTrue( $c->isUnExpired() );
-
- $this->assertEquals( "", $c->serializeToHttpRequest( "/path/", "www.example.net" ) );
- $this->assertEquals( "", $c->serializeToHttpRequest( "/", "www.example.com" ) );
- $this->assertEquals( "name=value", $c->serializeToHttpRequest( "/path/", "www.example.com" ) );
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => "www.example.com",
- "path" => "/path/",
- ) );
- $this->assertFalse( $c->canServeDomain( "example.com" ) );
- $this->assertFalse( $c->canServeDomain( "www.example.net" ) );
- $this->assertTrue( $c->canServeDomain( "www.example.com" ) );
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- "expires" => "-1 day",
- ) );
- $this->assertFalse( $c->isUnExpired() );
- $this->assertEquals( "", $c->serializeToHttpRequest( "/path/", "www.example.com" ) );
-
- $c = new MockCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- "expires" => "+1 day",
- ) );
- $this->assertTrue( $c->isUnExpired() );
- $this->assertEquals( "name=value", $c->serializeToHttpRequest( "/path/", "www.example.com" ) );
- }
-
- function testCookieJarSetCookie() {
- $cj = new CookieJar;
- $cj->setCookie( "name", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/",
- ) );
- $cj->setCookie( "name2", "value",
- array(
- "domain" => ".example.com",
- "path" => "/path/sub",
- ) );
- $cj->setCookie( "name3", "value",
- array(
- "domain" => ".example.com",
- "path" => "/",
- ) );
- $cj->setCookie( "name4", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- ) );
- $cj->setCookie( "name5", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- "expires" => "-1 day",
- ) );
-
- $this->assertEquals( "name4=value", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) );
- $this->assertEquals( "name3=value", $cj->serializeToHttpRequest( "/", "www.example.com" ) );
- $this->assertEquals( "name=value; name3=value", $cj->serializeToHttpRequest( "/path/", "www.example.com" ) );
-
- $cj->setCookie( "name5", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- "expires" => "+1 day",
- ) );
- $this->assertEquals( "name4=value; name5=value", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) );
-
- $cj->setCookie( "name4", "value",
- array(
- "domain" => ".example.net",
- "path" => "/path/",
- "expires" => "-1 day",
- ) );
- $this->assertEquals( "name5=value", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) );
- }
-
- function testParseResponseHeader() {
- $cj = new CookieJar;
-
- $h[] = "Set-Cookie: name4=value; domain=.example.com; path=/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[0], "www.example.com" );
- $this->assertEquals( "name4=value", $cj->serializeToHttpRequest( "/", "www.example.com" ) );
-
- $h[] = "name4=value2; domain=.example.com; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[1], "www.example.com" );
- $this->assertEquals( "", $cj->serializeToHttpRequest( "/", "www.example.com" ) );
- $this->assertEquals( "name4=value2", $cj->serializeToHttpRequest( "/path/", "www.example.com" ) );
-
- $h[] = "name5=value3; domain=.example.com; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[2], "www.example.com" );
- $this->assertEquals( "name4=value2; name5=value3", $cj->serializeToHttpRequest( "/path/", "www.example.com" ) );
-
- $h[] = "name6=value3; domain=.example.net; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[3], "www.example.com" );
- $this->assertEquals( "", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) );
-
- $h[] = "name6=value0; domain=.example.net; path=/path/; expires=Mon, 09-Dec-1999 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[4], "www.example.net" );
- $this->assertEquals( "", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) );
-
- $h[] = "name6=value4; domain=.example.net; path=/path/; expires=Mon, 09-Dec-2029 13:46:00 GMT";
- $cj->parseCookieResponseHeader( $h[5], "www.example.net" );
- $this->assertEquals( "name6=value4", $cj->serializeToHttpRequest( "/path/", "www.example.net" ) );
- }
-
- function runCookieRequests() {
- $r = MWHttpRequest::factory( "http://www.php.net/manual", array( 'followRedirects' => true ) );
- $r->execute();
-
- $jar = $r->getCookieJar();
- $this->assertThat( $jar, $this->isInstanceOf( 'CookieJar' ) );
-
- $serialized = $jar->serializeToHttpRequest( "/search?q=test", "www.php.net" );
- $this->assertRegExp( '/\bCOUNTRY=[^=;]+/', $serialized );
- $this->assertRegExp( '/\bLAST_LANG=[^=;]+/', $serialized );
- $this->assertEquals( '', $jar->serializeToHttpRequest( "/search?q=test", "www.php.com" ) );
- }
-
- function testCookieRequestDefault() {
- Http::$httpEngine = false;
- $this->runCookieRequests();
- }
- function testCookieRequestPhp() {
- if ( !self::$has_fopen ) {
- $this->markTestIncomplete( "This test requires allow_url_fopen=true." );
- }
-
- Http::$httpEngine = 'php';
- $this->runCookieRequests();
- }
- function testCookieRequestCurl() {
- if ( !self::$has_curl ) {
- $this->markTestIncomplete( "This test requires curl." );
- }
-
- Http::$httpEngine = 'curl';
- $this->runCookieRequests();
- }
-
/**
* Test Http::isValidURI()
- * @bug 27854 : Http::isValidURI is to lax
- *@dataProvider provideURI */
+ * @bug 27854 : Http::isValidURI is too lax
+ * @dataProvider provideURI
+ */
function testIsValidUri( $expect, $URI, $message = '' ) {
$this->assertEquals(
$expect,
@@ -567,7 +76,7 @@ class HttpTest extends MediaWikiTestCase {
array( false, '\\host\directory', 'CIFS share' ),
array( false, 'gopher://host/dir', 'Reject gopher scheme' ),
array( false, 'telnet://host', 'Reject telnet scheme' ),
-
+
# :\/\/ - double slashes
array( false, 'http//example.org', 'Reject missing colon in protocol' ),
array( false, 'http:/example.org', 'Reject missing slash in protocol' ),
@@ -615,4 +124,57 @@ class HttpTest extends MediaWikiTestCase {
);
}
+ /**
+ * Warning:
+ *
+ * These tests are for code that makes use of an artifact of how CURL
+ * handles header reporting on redirect pages, and will need to be
+ * rewritten when bug 29232 is taken care of (high-level handling of
+ * HTTP redirects).
+ */
+ function testRelativeRedirections() {
+ $h = new MWHttpRequestTester( 'http://oldsite/file.ext' );
+ # Forge a Location header
+ $h->setRespHeaders( 'location', array(
+ 'http://newsite/file.ext',
+ '/newfile.ext',
+ )
+ );
+ # Verify we correctly fix the Location
+ $this->assertEquals(
+ 'http://newsite/newfile.ext',
+ $h->getFinalUrl(),
+ "Relative file path Location: interpreted as full URL"
+ );
+
+ $h->setRespHeaders( 'location', array(
+ 'https://oldsite/file.ext'
+ )
+ );
+ $this->assertEquals(
+ 'https://oldsite/file.ext',
+ $h->getFinalUrl(),
+ "Location to the HTTPS version of the site"
+ );
+
+ $h->setRespHeaders( 'location', array(
+ '/anotherfile.ext',
+ 'http://anotherfile/hoster.ext',
+ 'https://anotherfile/hoster.ext'
+ )
+ );
+ $this->assertEquals(
+ 'https://anotherfile/hoster.ext',
+ $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!")
+ );
+ }
+}
+
+/**
+ * Class to let us overwrite MWHttpREquest respHeaders variable
+ */
+class MWHttpRequestTester extends MWHttpRequest {
+ function setRespHeaders( $name, $value ) {
+ $this->respHeaders[$name] = $value ;
+ }
}
diff --git a/tests/phpunit/includes/IPTest.php b/tests/phpunit/includes/IPTest.php
index c77dd852..4397b879 100644
--- a/tests/phpunit/includes/IPTest.php
+++ b/tests/phpunit/includes/IPTest.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
*/
@@ -43,20 +43,20 @@ class IPTest extends MediaWikiTestCase {
$this->assertFalse( IP::isIPv6( 'fc:100:::' ), 'IPv6 ending with a ":::"' );
$this->assertFalse( IP::isIPv6( 'fc:300' ), 'IPv6 with only 2 words' );
$this->assertFalse( IP::isIPv6( 'fc:100:300' ), 'IPv6 with only 3 words' );
-
+
$this->assertTrue( IP::isIPv6( 'fc:100::' ) );
$this->assertTrue( IP::isIPv6( 'fc:100:a::' ) );
$this->assertTrue( IP::isIPv6( 'fc:100:a:d::' ) );
$this->assertTrue( IP::isIPv6( 'fc:100:a:d:1::' ) );
$this->assertTrue( IP::isIPv6( 'fc:100:a:d:1:e::' ) );
$this->assertTrue( IP::isIPv6( 'fc:100:a:d:1:e:ac::' ) );
-
+
$this->assertFalse( IP::isIPv6( 'fc:100:a:d:1:e:ac:0::' ), 'IPv6 with 8 words ending with "::"' );
$this->assertFalse( IP::isIPv6( 'fc:100:a:d:1:e:ac:0:1::' ), 'IPv6 with 9 words ending with "::"' );
$this->assertFalse( IP::isIPv6( ':::' ) );
$this->assertFalse( IP::isIPv6( '::0:' ), 'IPv6 ending in a lone ":"' );
-
+
$this->assertTrue( IP::isIPv6( '::' ), 'IPv6 zero address' );
$this->assertTrue( IP::isIPv6( '::0' ) );
$this->assertTrue( IP::isIPv6( '::fc' ) );
@@ -66,14 +66,14 @@ class IPTest extends MediaWikiTestCase {
$this->assertTrue( IP::isIPv6( '::fc:100:a:d:1' ) );
$this->assertTrue( IP::isIPv6( '::fc:100:a:d:1:e' ) );
$this->assertTrue( IP::isIPv6( '::fc:100:a:d:1:e:ac' ) );
-
+
$this->assertFalse( IP::isIPv6( '::fc:100:a:d:1:e:ac:0' ), 'IPv6 with "::" and 8 words' );
$this->assertFalse( IP::isIPv6( '::fc:100:a:d:1:e:ac:0:1' ), 'IPv6 with 9 words' );
$this->assertFalse( IP::isIPv6( ':fc::100' ), 'IPv6 starting with lone ":"' );
$this->assertFalse( IP::isIPv6( 'fc::100:' ), 'IPv6 ending with lone ":"' );
$this->assertFalse( IP::isIPv6( 'fc:::100' ), 'IPv6 with ":::" in the middle' );
-
+
$this->assertTrue( IP::isIPv6( 'fc::100' ), 'IPv6 with "::" and 2 words' );
$this->assertTrue( IP::isIPv6( 'fc::100:a' ), 'IPv6 with "::" and 3 words' );
$this->assertTrue( IP::isIPv6( 'fc::100:a:d', 'IPv6 with "::" and 4 words' ) );
@@ -83,7 +83,7 @@ class IPTest extends MediaWikiTestCase {
$this->assertTrue( IP::isIPv6( '2001::df'), 'IPv6 with "::" and 2 words' );
$this->assertTrue( IP::isIPv6( '2001:5c0:1400:a::df'), 'IPv6 with "::" and 5 words' );
$this->assertTrue( IP::isIPv6( '2001:5c0:1400:a::df:2'), 'IPv6 with "::" and 6 words' );
-
+
$this->assertFalse( IP::isIPv6( 'fc::100:a:d:1:e:ac:0' ), 'IPv6 with "::" and 8 words' );
$this->assertFalse( IP::isIPv6( 'fc::100:a:d:1:e:ac:0:1' ), 'IPv6 with 9 words' );
@@ -135,11 +135,11 @@ class IPTest extends MediaWikiTestCase {
$this->assertFalse( IP::isValid( 'fc:100:::' ), 'IPv6 ending with a ":::"' );
$this->assertFalse( IP::isValid( 'fc:300' ), 'IPv6 with only 2 words' );
$this->assertFalse( IP::isValid( 'fc:100:300' ), 'IPv6 with only 3 words' );
-
+
$this->assertTrue( IP::isValid( 'fc:100::' ) );
$this->assertTrue( IP::isValid( 'fc:100:a:d:1:e::' ) );
$this->assertTrue( IP::isValid( 'fc:100:a:d:1:e:ac::' ) );
-
+
$this->assertTrue( IP::isValid( 'fc::100' ), 'IPv6 with "::" and 2 words' );
$this->assertTrue( IP::isValid( 'fc::100:a' ), 'IPv6 with "::" and 3 words' );
$this->assertTrue( IP::isValid( '2001::df'), 'IPv6 with "::" and 2 words' );
@@ -147,7 +147,7 @@ class IPTest extends MediaWikiTestCase {
$this->assertTrue( IP::isValid( '2001:5c0:1400:a::df:2'), 'IPv6 with "::" and 6 words' );
$this->assertTrue( IP::isValid( 'fc::100:a:d:1' ), 'IPv6 with "::" and 5 words' );
$this->assertTrue( IP::isValid( 'fc::100:a:d:1:e:ac' ), 'IPv6 with "::" and 7 words' );
-
+
$this->assertFalse( IP::isValid( 'fc:100:a:d:1:e:ac:0::' ), 'IPv6 with 8 words ending with "::"' );
$this->assertFalse( IP::isValid( 'fc:100:a:d:1:e:ac:0:1::' ), 'IPv6 with 9 words ending with "::"' );
}
@@ -276,7 +276,7 @@ class IPTest extends MediaWikiTestCase {
foreach ( $private as $p ) {
$this->assertFalse( IP::isPublic( $p ), "$p is not a public IP address" );
}
- $public = array( '2001:5c0:1000:a::133', 'fc::3' );
+ $public = array( '2001:5c0:1000:a::133', 'fc::3', '00FC::' );
foreach ( $public as $p ) {
$this->assertTrue( IP::isPublic( $p ), "$p is a public IP address" );
}
@@ -332,7 +332,7 @@ class IPTest extends MediaWikiTestCase {
$this->assertEquals( '0:0:0:0:0:0:FCCF:FAFF', IP::hexToOctet( 'FCCFFAFF' ) );
}
- /*
+ /**
* IP::parseCIDR() returns an array containing a signed IP address
* representing the network mask and the bit mask.
* @covers IP::parseCIDR
@@ -391,7 +391,7 @@ class IPTest extends MediaWikiTestCase {
}
/**
- * Issues there are most probably from IP::toHex() or IP::parseRange()
+ * Issues there are most probably from IP::toHex() or IP::parseRange()
* @covers IP::isInRange
* @dataProvider provideIPsAndRanges
*/
@@ -464,9 +464,9 @@ class IPTest extends MediaWikiTestCase {
*/
function testCombineHostAndPort( $expected, $input, $description ) {
list( $host, $port, $defaultPort ) = $input;
- $this->assertEquals(
- $expected,
- IP::combineHostAndPort( $host, $port, $defaultPort ),
+ $this->assertEquals(
+ $expected,
+ IP::combineHostAndPort( $host, $port, $defaultPort ),
$description );
}
diff --git a/tests/phpunit/includes/LocalFileTest.php b/tests/phpunit/includes/LocalFileTest.php
index e08d4d7e..5b26b89c 100644
--- a/tests/phpunit/includes/LocalFileTest.php
+++ b/tests/phpunit/includes/LocalFileTest.php
@@ -10,12 +10,21 @@ class LocalFileTest extends MediaWikiTestCase {
global $wgCapitalLinks;
$wgCapitalLinks = true;
+
$info = array(
- 'name' => 'test',
- 'directory' => '/testdir',
- 'url' => '/testurl',
- 'hashLevels' => 2,
+ 'name' => 'test',
+ 'directory' => '/testdir',
+ 'url' => '/testurl',
+ 'hashLevels' => 2,
'transformVia404' => false,
+ 'backend' => new FSFileBackend( array(
+ 'name' => 'local-backend',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ 'cont1' => "/testdir/local-backend/tempimages/cont1",
+ 'cont2' => "/testdir/local-backend/tempimages/cont2"
+ )
+ ) )
);
$this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
$this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
@@ -44,17 +53,17 @@ class LocalFileTest extends MediaWikiTestCase {
}
function testGetArchivePath() {
- $this->assertEquals( '/testdir/archive', $this->file_hl0->getArchivePath() );
- $this->assertEquals( '/testdir/archive/a/a2', $this->file_hl2->getArchivePath() );
- $this->assertEquals( '/testdir/archive/!', $this->file_hl0->getArchivePath( '!' ) );
- $this->assertEquals( '/testdir/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
+ $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() {
- $this->assertEquals( '/testdir/thumb/Test!', $this->file_hl0->getThumbPath() );
- $this->assertEquals( '/testdir/thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
- $this->assertEquals( '/testdir/thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
- $this->assertEquals( '/testdir/thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
+ $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() {
diff --git a/tests/phpunit/includes/MWNamespaceTest.php b/tests/phpunit/includes/MWNamespaceTest.php
index 462afc24..6b231fc5 100644
--- a/tests/phpunit/includes/MWNamespaceTest.php
+++ b/tests/phpunit/includes/MWNamespaceTest.php
@@ -1,7 +1,7 @@
<?php
/**
- * @author Ashar Voultoiz
- * @copyright Copyright © 2011, Ashar Voultoiz
+ * @author Antoine Musso
+ * @copyright Copyright © 2011, Antoine Musso
* @file
*/
@@ -39,40 +39,55 @@ class MWNamespaceTest extends MediaWikiTestCase {
/**
* Please make sure to change testIsTalk() if you change the assertions below
*/
- public function testIsMain() {
+ public function testIsSubject() {
// Special namespaces
- $this->assertTrue( MWNamespace::isMain( NS_MEDIA ) );
- $this->assertTrue( MWNamespace::isMain( NS_SPECIAL ) );
+ $this->assertIsSubject( NS_MEDIA );
+ $this->assertIsSubject( NS_SPECIAL );
// Subject pages
- $this->assertTrue( MWNamespace::isMain( NS_MAIN ) );
- $this->assertTrue( MWNamespace::isMain( NS_USER ) );
- $this->assertTrue( MWNamespace::isMain( 100 ) ); # user defined
+ $this->assertIsSubject( NS_MAIN );
+ $this->assertIsSubject( NS_USER );
+ $this->assertIsSubject( 100 ); # user defined
// Talk pages
- $this->assertFalse( MWNamespace::isMain( NS_TALK ) );
- $this->assertFalse( MWNamespace::isMain( NS_USER_TALK ) );
- $this->assertFalse( MWNamespace::isMain( 101 ) ); # user defined
+ $this->assertIsNotSubject( NS_TALK );
+ $this->assertIsNotSubject( NS_USER_TALK );
+ $this->assertIsNotSubject( 101 ); # user defined
+
+ // Back compat
+ $this->assertTrue( MWNamespace::isMain( NS_MAIN ) == MWNamespace::isSubject( NS_MAIN ) );
+ $this->assertTrue( MWNamespace::isMain( NS_USER_TALK ) == MWNamespace::isSubject( NS_USER_TALK ) );
}
/**
- * Reverse of testIsMain().
- * Please update testIsMain() if you change assertions below
+ * Reverse of testIsSubject().
+ * Please update testIsSubject() if you change assertions below
*/
public function testIsTalk() {
// Special namespaces
- $this->assertFalse( MWNamespace::isTalk( NS_MEDIA ) );
- $this->assertFalse( MWNamespace::isTalk( NS_SPECIAL ) );
+ $this->assertIsNotTalk( NS_MEDIA );
+ $this->assertIsNotTalk( NS_SPECIAL );
// Subject pages
- $this->assertFalse( MWNamespace::isTalk( NS_MAIN ) );
- $this->assertFalse( MWNamespace::isTalk( NS_USER ) );
- $this->assertFalse( MWNamespace::isTalk( 100 ) ); # user defined
+ $this->assertIsNotTalk( NS_MAIN );
+ $this->assertIsNotTalk( NS_USER );
+ $this->assertIsNotTalk( 100 ); # user defined
// Talk pages
- $this->assertTrue( MWNamespace::isTalk( NS_TALK ) );
- $this->assertTrue( MWNamespace::isTalk( NS_USER_TALK ) );
- $this->assertTrue( MWNamespace::isTalk( 101 ) ); # user defined
+ $this->assertIsTalk( NS_TALK );
+ $this->assertIsTalk( NS_USER_TALK );
+ $this->assertIsTalk( 101 ); # user defined
+ }
+
+ /**
+ */
+ public function testGetSubject() {
+ // Special namespaces are their own subjects
+ $this->assertEquals( NS_MEDIA, MWNamespace::getSubject( NS_MEDIA ) );
+ $this->assertEquals( NS_SPECIAL, MWNamespace::getSubject( NS_SPECIAL ) );
+
+ $this->assertEquals( NS_MAIN, MWNamespace::getSubject( NS_TALK ) );
+ $this->assertEquals( NS_USER, MWNamespace::getSubject( NS_USER_TALK ) );
}
/**
@@ -82,6 +97,9 @@ class MWNamespaceTest extends MediaWikiTestCase {
*/
public function testGetTalk() {
$this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_MAIN ) );
+ $this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_TALK ) );
+ $this->assertEquals( NS_USER_TALK, MWNamespace::getTalk( NS_USER ) );
+ $this->assertEquals( NS_USER_TALK, MWNamespace::getTalk( NS_USER_TALK ) );
}
/**
@@ -93,7 +111,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
$this->assertNull( MWNamespace::getTalk( NS_MEDIA ) );
}
- /**
+ /**
* Exceptions with getTalk()
* NS_SPECIAL does not have talk pages. MediaWiki raise an exception for them.
* @expectedException MWException
@@ -108,7 +126,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
* the function testGetAssociatedExceptions()
*/
public function testGetAssociated() {
- $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
+ $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
$this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
}
@@ -131,80 +149,122 @@ class MWNamespaceTest extends MediaWikiTestCase {
}
/**
- */
- public function testGetSubject() {
- // Special namespaces are their own subjects
- $this->assertEquals( NS_MEDIA, MWNamespace::getSubject( NS_MEDIA ) );
- $this->assertEquals( NS_SPECIAL, MWNamespace::getSubject( NS_SPECIAL ) );
-
- $this->assertEquals( NS_MAIN, MWNamespace::getSubject( NS_TALK ) );
- $this->assertEquals( NS_USER, MWNamespace::getSubject( NS_USER_TALK ) );
- }
-
- /**
* @todo Implement testExists().
*/
+/*
public function testExists() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
+*/
+
+ /**
+ * Test MWNamespace::equals
+ * Note if we add a namespace registration system with keys like 'MAIN'
+ * we should add tests here for equivilance on things like 'MAIN' == 0
+ * and 'MAIN' == NS_MAIN.
+ */
+ public function testEquals() {
+ $this->assertTrue( MWNamespace::equals( NS_MAIN, NS_MAIN ) );
+ $this->assertTrue( MWNamespace::equals( NS_MAIN, 0 ) ); // In case we make NS_MAIN 'MAIN'
+ $this->assertTrue( MWNamespace::equals( NS_USER, NS_USER ) );
+ $this->assertTrue( MWNamespace::equals( NS_USER, 2 ) );
+ $this->assertTrue( MWNamespace::equals( NS_USER_TALK, NS_USER_TALK ) );
+ $this->assertTrue( MWNamespace::equals( NS_SPECIAL, NS_SPECIAL ) );
+ $this->assertFalse( MWNamespace::equals( NS_MAIN, NS_TALK ) );
+ $this->assertFalse( MWNamespace::equals( NS_USER, NS_USER_TALK ) );
+ $this->assertFalse( MWNamespace::equals( NS_PROJECT, NS_TEMPLATE ) );
+ }
+
+ /**
+ * Test MWNamespace::subjectEquals
+ */
+ public function testSubjectEquals() {
+ $this->assertSameSubject( NS_MAIN, NS_MAIN );
+ $this->assertSameSubject( NS_MAIN, 0 ); // In case we make NS_MAIN 'MAIN'
+ $this->assertSameSubject( NS_USER, NS_USER );
+ $this->assertSameSubject( NS_USER, 2 );
+ $this->assertSameSubject( NS_USER_TALK, NS_USER_TALK );
+ $this->assertSameSubject( NS_SPECIAL, NS_SPECIAL );
+ $this->assertSameSubject( NS_MAIN, NS_TALK );
+ $this->assertSameSubject( NS_USER, NS_USER_TALK );
+
+ $this->assertDifferentSubject( NS_PROJECT, NS_TEMPLATE );
+ $this->assertDifferentSubject( NS_SPECIAL, NS_MAIN );
+ }
+
+ public function testSpecialAndMediaAreDifferentSubjects() {
+ $this->assertDifferentSubject(
+ NS_MEDIA, NS_SPECIAL,
+ "NS_MEDIA and NS_SPECIAL are different subject namespaces"
+ );
+ $this->assertDifferentSubject(
+ NS_SPECIAL, NS_MEDIA,
+ "NS_SPECIAL and NS_MEDIA are different subject namespaces"
+ );
+
+ }
/**
* @todo Implement testGetCanonicalNamespaces().
*/
+/*
public function testGetCanonicalNamespaces() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
-
+*/
/**
* @todo Implement testGetCanonicalName().
*/
+/*
public function testGetCanonicalName() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
-
+*/
/**
* @todo Implement testGetCanonicalIndex().
*/
+/*
public function testGetCanonicalIndex() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
-
+*/
/**
* @todo Implement testGetValidNamespaces().
*/
+/*
public function testGetValidNamespaces() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
-
+*/
/**
*/
public function testCanTalk() {
- $this->assertFalse( MWNamespace::canTalk( NS_MEDIA ) );
- $this->assertFalse( MWNamespace::canTalk( NS_SPECIAL ) );
+ $this->assertCanNotTalk( NS_MEDIA );
+ $this->assertCanNotTalk( NS_SPECIAL );
- $this->assertTrue( MWNamespace::canTalk( NS_MAIN ) );
- $this->assertTrue( MWNamespace::canTalk( NS_TALK ) );
- $this->assertTrue( MWNamespace::canTalk( NS_USER ) );
- $this->assertTrue( MWNamespace::canTalk( NS_USER_TALK ) );
+ $this->assertCanTalk( NS_MAIN );
+ $this->assertCanTalk( NS_TALK );
+ $this->assertCanTalk( NS_USER );
+ $this->assertCanTalk( NS_USER_TALK );
// User defined namespaces
- $this->assertTrue( MWNamespace::canTalk( 100 ) );
- $this->assertTrue( MWNamespace::canTalk( 101 ) );
+ $this->assertCanTalk( 100 );
+ $this->assertCanTalk( 101 );
}
/**
@@ -212,16 +272,47 @@ class MWNamespaceTest extends MediaWikiTestCase {
public function testIsContent() {
// NS_MAIN is a content namespace per DefaultSettings.php
// and per function definition.
- $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+ $this->assertIsContent( NS_MAIN );
+
+ global $wgContentNamespaces;
+
+ $saved = $wgContentNamespaces;
+
+ $wgContentNamespaces[] = NS_MAIN;
+ $this->assertIsContent( NS_MAIN );
// Other namespaces which are not expected to be content
- $this->assertFalse( MWNamespace::isContent( NS_MEDIA ) );
- $this->assertFalse( MWNamespace::isContent( NS_SPECIAL ) );
- $this->assertFalse( MWNamespace::isContent( NS_TALK ) );
- $this->assertFalse( MWNamespace::isContent( NS_USER ) );
- $this->assertFalse( MWNamespace::isContent( NS_CATEGORY ) );
- // User defined namespace:
- $this->assertFalse( MWNamespace::isContent( 100 ) );
+ if ( isset( $wgContentNamespaces[NS_MEDIA] ) ) {
+ unset( $wgContentNamespaces[NS_MEDIA] );
+ }
+ $this->assertIsNotContent( NS_MEDIA );
+
+ if ( isset( $wgContentNamespaces[NS_SPECIAL] ) ) {
+ unset( $wgContentNamespaces[NS_SPECIAL] );
+ }
+ $this->assertIsNotContent( NS_SPECIAL );
+
+ if ( isset( $wgContentNamespaces[NS_TALK] ) ) {
+ unset( $wgContentNamespaces[NS_TALK] );
+ }
+ $this->assertIsNotContent( NS_TALK );
+
+ if ( isset( $wgContentNamespaces[NS_USER] ) ) {
+ unset( $wgContentNamespaces[NS_USER] );
+ }
+ $this->assertIsNotContent( NS_USER );
+
+ if ( isset( $wgContentNamespaces[NS_CATEGORY] ) ) {
+ unset( $wgContentNamespaces[NS_CATEGORY] );
+ }
+ $this->assertIsNotContent( NS_CATEGORY );
+
+ if ( isset( $wgContentNamespaces[100] ) ) {
+ unset( $wgContentNamespaces[100] );
+ }
+ $this->assertIsNotContent( 100 );
+
+ $wgContentNamespaces = $saved;
}
/**
@@ -231,47 +322,47 @@ class MWNamespaceTest extends MediaWikiTestCase {
public function testIsContentWithAdditionsInWgContentNamespaces() {
// NS_MAIN is a content namespace per DefaultSettings.php
// and per function definition.
- $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+ $this->assertIsContent( NS_MAIN );
// Tests that user defined namespace #252 is not content:
- $this->assertFalse( MWNamespace::isContent( 252 ) );
+ $this->assertIsNotContent( 252 );
# @todo FIXME: Is global saving really required for PHPUnit?
// Bless namespace # 252 as a content namespace
global $wgContentNamespaces;
$savedGlobal = $wgContentNamespaces;
$wgContentNamespaces[] = 252;
- $this->assertTrue( MWNamespace::isContent( 252 ) );
+ $this->assertIsContent( 252 );
// Makes sure NS_MAIN was not impacted
- $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
+ $this->assertIsContent( NS_MAIN );
// Restore global
$wgContentNamespaces = $savedGlobal;
// Verify namespaces after global restauration
- $this->assertTrue( MWNamespace::isContent( NS_MAIN ) );
- $this->assertFalse( MWNamespace::isContent( 252 ) );
+ $this->assertIsContent( NS_MAIN );
+ $this->assertIsNotContent( 252 );
}
public function testIsWatchable() {
// Specials namespaces are not watchable
- $this->assertFalse( MWNamespace::isWatchable( NS_MEDIA ) );
- $this->assertFalse( MWNamespace::isWatchable( NS_SPECIAL ) );
+ $this->assertIsNotWatchable( NS_MEDIA );
+ $this->assertIsNotWatchable( NS_SPECIAL );
// Core defined namespaces are watchables
- $this->assertTrue( MWNamespace::isWatchable( NS_MAIN ) );
- $this->assertTrue( MWNamespace::isWatchable( NS_TALK ) );
+ $this->assertIsWatchable( NS_MAIN );
+ $this->assertIsWatchable( NS_TALK );
// Additional, user defined namespaces are watchables
- $this->assertTrue( MWNamespace::isWatchable( 100 ) );
- $this->assertTrue( MWNamespace::isWatchable( 101 ) );
+ $this->assertIsWatchable( 100 );
+ $this->assertIsWatchable( 101 );
}
public function testHasSubpages() {
// Special namespaces:
- $this->assertFalse( MWNamespace::hasSubpages( NS_MEDIA ) );
- $this->assertFalse( MWNamespace::hasSubpages( NS_SPECIAL ) );
+ $this->assertHasNotSubpages( NS_MEDIA );
+ $this->assertHasNotSubpages( NS_SPECIAL );
// namespaces without subpages
# save up global
@@ -282,12 +373,12 @@ class MWNamespaceTest extends MediaWikiTestCase {
unset( $wgNamespacesWithSubpages[NS_MAIN] );
}
- $this->assertFalse( MWNamespace::hasSubpages( NS_MAIN ) );
+ $this->assertHasNotSubpages( NS_MAIN );
$wgNamespacesWithSubpages[NS_MAIN] = true;
- $this->assertTrue( MWNamespace::hasSubpages( NS_MAIN ) );
+ $this->assertHasSubpages( NS_MAIN );
$wgNamespacesWithSubpages[NS_MAIN] = false;
- $this->assertFalse( MWNamespace::hasSubpages( NS_MAIN ) );
+ $this->assertHasNotSubpages( NS_MAIN );
# restore global
if( $saved !== null ) {
@@ -295,9 +386,9 @@ class MWNamespaceTest extends MediaWikiTestCase {
}
// Some namespaces with subpages
- $this->assertTrue( MWNamespace::hasSubpages( NS_TALK ) );
- $this->assertTrue( MWNamespace::hasSubpages( NS_USER ) );
- $this->assertTrue( MWNamespace::hasSubpages( NS_USER_TALK ) );
+ $this->assertHasSubpages( NS_TALK );
+ $this->assertHasSubpages( NS_USER );
+ $this->assertHasSubpages( NS_USER_TALK );
}
/**
@@ -311,6 +402,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
global $wgContentNamespaces;
+ $saved = $wgContentNamespaces;
# test !is_array( $wgcontentNamespaces )
$wgContentNamespaces = '';
$this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
@@ -330,7 +422,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
$this->assertEquals(
array( NS_MAIN, NS_USER, NS_CATEGORY ),
MWNamespace::getcontentNamespaces(),
- 'NS_MAIN is forced in wgContentNamespaces even if unwanted'
+ 'NS_MAIN is forced in $wgContentNamespaces even if unwanted'
);
# test other cases, return $wgcontentNamespaces as is
@@ -346,6 +438,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
MWNamespace::getcontentNamespaces()
);
+ $wgContentNamespaces = $saved;
}
/**
@@ -361,14 +454,14 @@ class MWNamespaceTest extends MediaWikiTestCase {
);
// Boths are capitalized by default
- $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIA ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_FILE ) );
+ $this->assertIsCapitalized( NS_MEDIA );
+ $this->assertIsCapitalized( NS_FILE );
// Always capitalized namespaces
// @see MWNamespace::$alwaysCapitalizedNamespaces
- $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+ $this->assertIsCapitalized( NS_SPECIAL );
+ $this->assertIsCapitalized( NS_USER );
+ $this->assertIsCapitalized( NS_MEDIAWIKI );
}
/**
@@ -389,17 +482,17 @@ class MWNamespaceTest extends MediaWikiTestCase {
$savedGlobal = $wgCapitalLinks;
$wgCapitalLinks = true;
- $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT_TALK ) );
+ $this->assertIsCapitalized( NS_PROJECT );
+ $this->assertIsCapitalized( NS_PROJECT_TALK );
$wgCapitalLinks = false;
// hardcoded namespaces (see above function) are still capitalized:
- $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+ $this->assertIsCapitalized( NS_SPECIAL );
+ $this->assertIsCapitalized( NS_USER );
+ $this->assertIsCapitalized( NS_MEDIAWIKI );
// setting is correctly applied
- $this->assertFalse( MWNamespace::isCapitalized( NS_PROJECT ) );
- $this->assertFalse( MWNamespace::isCapitalized( NS_PROJECT_TALK ) );
+ $this->assertIsNotCapitalized( NS_PROJECT );
+ $this->assertIsNotCapitalized( NS_PROJECT_TALK );
// reset global state:
$wgCapitalLinks = $savedGlobal;
@@ -417,28 +510,28 @@ class MWNamespaceTest extends MediaWikiTestCase {
$savedGlobal = $wgCapitalLinkOverrides;
// Test default settings
- $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT_TALK ) );
+ $this->assertIsCapitalized( NS_PROJECT );
+ $this->assertIsCapitalized( NS_PROJECT_TALK );
// hardcoded namespaces (see above function) are capitalized:
- $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+ $this->assertIsCapitalized( NS_SPECIAL );
+ $this->assertIsCapitalized( NS_USER );
+ $this->assertIsCapitalized( NS_MEDIAWIKI );
// Hardcoded namespaces remains capitalized
$wgCapitalLinkOverrides[NS_SPECIAL] = false;
$wgCapitalLinkOverrides[NS_USER] = false;
$wgCapitalLinkOverrides[NS_MEDIAWIKI] = false;
- $this->assertTrue( MWNamespace::isCapitalized( NS_SPECIAL ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_USER ) );
- $this->assertTrue( MWNamespace::isCapitalized( NS_MEDIAWIKI ) );
+ $this->assertIsCapitalized( NS_SPECIAL );
+ $this->assertIsCapitalized( NS_USER );
+ $this->assertIsCapitalized( NS_MEDIAWIKI );
$wgCapitalLinkOverrides = $savedGlobal;
$wgCapitalLinkOverrides[NS_PROJECT] = false;
- $this->assertFalse( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $this->assertIsNotCapitalized( NS_PROJECT );
$wgCapitalLinkOverrides[NS_PROJECT] = true ;
- $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $this->assertIsCapitalized( NS_PROJECT );
unset( $wgCapitalLinkOverrides[NS_PROJECT] );
- $this->assertTrue( MWNamespace::isCapitalized( NS_PROJECT ) );
+ $this->assertIsCapitalized( NS_PROJECT );
// reset global state:
$wgCapitalLinkOverrides = $savedGlobal;
@@ -456,5 +549,45 @@ class MWNamespaceTest extends MediaWikiTestCase {
$this->assertFalse( MWNamespace::hasGenderDistinction( NS_TALK ) );
}
+
+ ####### HELPERS ###########################################################
+ function __call( $method, $args ) {
+ // Call the real method if it exists
+ if( method_exists($this, $method ) ) {
+ return $this->$method( $args );
+ }
+
+ if( preg_match( '/^assert(Has|Is|Can)(Not|)(Subject|Talk|Watchable|Content|Subpages|Capitalized)$/', $method, $m ) ) {
+ # Interprets arguments:
+ $ns = $args[0];
+ $msg = isset($args[1]) ? $args[1] : " dummy message";
+
+ # Forge the namespace constant name:
+ if( $ns === 0 ) {
+ $ns_name = "NS_MAIN";
+ } else {
+ $ns_name = "NS_" . strtoupper( MWNamespace::getCanonicalName( $ns ) );
+ }
+ # ... and the MWNamespace method name
+ $nsMethod = strtolower( $m[1] ) . $m[3];
+
+ $expect = ($m[2] === '');
+ $expect_name = $expect ? 'TRUE' : 'FALSE';
+
+ return $this->assertEquals( $expect,
+ MWNamespace::$nsMethod( $ns, $msg ),
+ "MWNamespace::$nsMethod( $ns_name ) should returns $expect_name"
+ );
+ }
+
+ throw new Exception( __METHOD__ . " could not find a method named $method\n" );
+ }
+
+ function assertSameSubject( $ns1, $ns2, $msg = '' ) {
+ $this->assertTrue( MWNamespace::subjectEquals( $ns1, $ns2, $msg ) );
+ }
+ function assertDifferentSubject( $ns1, $ns2, $msg = '' ) {
+ $this->assertFalse( MWNamespace::subjectEquals( $ns1, $ns2, $msg ) );
+ }
}
diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php
index 45c02bbe..295b6d74 100644
--- a/tests/phpunit/includes/MessageTest.php
+++ b/tests/phpunit/includes/MessageTest.php
@@ -47,7 +47,7 @@ class MessageTest extends MediaWikiLangTestCase {
$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
$wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
$this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
-
+
/* Restore globals */
$wgLang = $oldLang;
unset( $wgForceUIMsgAsContentMsg['testInContentLanguage'] );
diff --git a/tests/phpunit/includes/ParserOptionsTest.php b/tests/phpunit/includes/ParserOptionsTest.php
index 58c89146..59c955fe 100644
--- a/tests/phpunit/includes/ParserOptionsTest.php
+++ b/tests/phpunit/includes/ParserOptionsTest.php
@@ -6,10 +6,9 @@ class ParserOptionsTest extends MediaWikiTestCase {
private $pcache;
function setUp() {
- ParserTest::setUp(); //reuse setup from parser tests
global $wgContLang, $wgUser, $wgLanguageCode;
$wgContLang = Language::factory( $wgLanguageCode );
- $this->popts = new ParserOptions( $wgUser );
+ $this->popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
$this->pcache = ParserCache::singleton();
}
@@ -26,11 +25,11 @@ class ParserOptionsTest extends MediaWikiTestCase {
$wgUseDynamicDates = true;
$title = Title::newFromText( "Some test article" );
- $article = new Article( $title );
+ $page = WikiPage::factory( $title );
- $pcacheKeyBefore = $this->pcache->getKey( $article, $this->popts );
+ $pcacheKeyBefore = $this->pcache->getKey( $page, $this->popts );
$this->assertNotNull( $this->popts->getDateFormat() );
- $pcacheKeyAfter = $this->pcache->getKey( $article, $this->popts );
+ $pcacheKeyAfter = $this->pcache->getKey( $page, $this->popts );
$this->assertEquals( $pcacheKeyBefore, $pcacheKeyAfter );
}
}
diff --git a/tests/phpunit/includes/PathRouterTest.php b/tests/phpunit/includes/PathRouterTest.php
new file mode 100644
index 00000000..f6274584
--- /dev/null
+++ b/tests/phpunit/includes/PathRouterTest.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * Tests for the PathRouter parsing
+ */
+
+class PathRouterTest extends MediaWikiTestCase {
+
+ public function setUp() {
+ $router = new PathRouter;
+ $router->add("/wiki/$1");
+ $this->basicRouter = $router;
+ }
+
+ /**
+ * Test basic path parsing
+ */
+ public function testBasic() {
+ $matches = $this->basicRouter->parse( "/wiki/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo" ) );
+ }
+
+ /**
+ * Test loose path auto-$1
+ */
+ public function testLoose() {
+ $router = new PathRouter;
+ $router->add("/"); # Should be the same as "/$1"
+ $matches = $router->parse( "/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo" ) );
+
+ $router = new PathRouter;
+ $router->add("/wiki"); # Should be the same as /wiki/$1
+ $matches = $router->parse( "/wiki/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo" ) );
+
+ $router = new PathRouter;
+ $router->add("/wiki/"); # Should be the same as /wiki/$1
+ $matches = $router->parse( "/wiki/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo" ) );
+ }
+
+ /**
+ * Test to ensure that path is based on specifity, not order
+ */
+ public function testOrder() {
+ $router = new PathRouter;
+ $router->add("/$1");
+ $router->add("/a/$1");
+ $router->add("/b/$1");
+ $matches = $router->parse( "/a/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo" ) );
+
+ $router = new PathRouter;
+ $router->add("/b/$1");
+ $router->add("/a/$1");
+ $router->add("/$1");
+ $matches = $router->parse( "/a/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo" ) );
+ }
+
+ /**
+ * Test the handling of key based arrays with a url parameter
+ */
+ public function testKeyParameter() {
+ $router = new PathRouter;
+ $router->add( array( 'edit' => "/edit/$1" ), array( 'action' => '$key' ) );
+ $matches = $router->parse( "/edit/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo", 'action' => 'edit' ) );
+ }
+
+ /**
+ * Test the handling of $2 inside paths
+ */
+ public function testAdditionalParameter() {
+ // Basic $2
+ $router = new PathRouter;
+ $router->add( '/$2/$1', array( 'test' => '$2' ) );
+ $matches = $router->parse( "/asdf/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo", 'test' => 'asdf' ) );
+ }
+
+ /**
+ * Test additional restricted value parameter
+ */
+ public function testRestrictedValue() {
+ $router = new PathRouter;
+ $router->add( '/$2/$1',
+ array( 'test' => '$2' ),
+ array( '$2' => array( 'a', 'b' ) )
+ );
+ $router->add( '/$2/$1',
+ array( 'test2' => '$2' ),
+ array( '$2' => 'c' )
+ );
+ $router->add( '/$1' );
+
+ $matches = $router->parse( "/asdf/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "asdf/Foo" ) );
+
+ $matches = $router->parse( "/a/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo", 'test' => 'a' ) );
+
+ $matches = $router->parse( "/c/Foo" );
+ $this->assertEquals( $matches, array( 'title' => "Foo", 'test2' => 'c' ) );
+ }
+
+ public function callbackForTest( &$matches, $data ) {
+ $matches['x'] = $data['$1'];
+ $matches['foo'] = $data['foo'];
+ }
+
+ public function testCallback() {
+ $router = new PathRouter;
+ $router->add( "/$1",
+ array( 'a' => 'b', 'data:foo' => 'bar' ),
+ array( 'callback' => array( $this, 'callbackForTest' ) )
+ );
+ $matches = $router->parse( '/Foo' );
+ $this->assertEquals( $matches, array(
+ 'title' => "Foo",
+ 'x' => 'Foo',
+ 'a' => 'b',
+ 'foo' => 'bar'
+ ) );
+ }
+
+ /**
+ * Test to ensure that matches are not made if a parameter expects nonexistent input
+ */
+ public function testFail() {
+ $router = new PathRouter;
+ $router->add( "/wiki/$1", array( 'title' => "$1$2" ) );
+ $matches = $router->parse( "/wiki/A" );
+ $this->assertEquals( array(), $matches );
+ }
+
+ /**
+ * Test to ensure weight of paths is handled correctly
+ */
+ public function testWeight() {
+ $router = new PathRouter;
+ $router->addStrict( "/Bar", array( 'ping' => 'pong' ) );
+ $router->add( "/asdf-$1", array( 'title' => 'qwerty-$1' ) );
+ $router->add( "/$1" );
+ $router->add( "/qwerty-$1", array( 'title' => 'asdf-$1' ) );
+ $router->addStrict( "/Baz", array( 'marco' => 'polo' ) );
+ $router->add( "/a/$1" );
+ $router->add( "/asdf/$1" );
+ $router->add( "/$2/$1", array( 'unrestricted' => '$2' ) );
+ $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 ) {
+ $this->assertEquals( $router->parse( $path ), $result );
+ }
+ }
+
+ /**
+ * Make sure the router handles titles like Special:Recentchanges correctly
+ */
+ public function testSpecial() {
+ $matches = $this->basicRouter->parse( "/wiki/Special:Recentchanges" );
+ $this->assertEquals( $matches, array( 'title' => "Special:Recentchanges" ) );
+ }
+
+ /**
+ * Make sure the router decodes urlencoding properly
+ */
+ public function testUrlencoding() {
+ $matches = $this->basicRouter->parse( "/wiki/Title_With%20Space" );
+ $this->assertEquals( $matches, array( 'title' => "Title_With Space" ) );
+ }
+
+ public function dataRegexpChars() {
+ return array(
+ array( "$" ),
+ array( "$1" ),
+ array( "\\" ),
+ array( "\\$1" ),
+ );
+ }
+
+ /**
+ * Make sure the router doesn't break on special characters like $ used in regexp replacements
+ * @dataProvider dataRegexpChars
+ */
+ public function testRegexpChars( $char ) {
+ $matches = $this->basicRouter->parse( "/wiki/$char" );
+ $this->assertEquals( $matches, array( 'title' => "$char" ) );
+ }
+
+ /**
+ * Make sure the router handles characters like +&() properly
+ */
+ public function testCharacters() {
+ $matches = $this->basicRouter->parse( "/wiki/Plus+And&Dollar\\Stuff();[]{}*" );
+ $this->assertEquals( $matches, array( 'title' => "Plus+And&Dollar\\Stuff();[]{}*" ) );
+ }
+
+ /**
+ * Make sure the router handles unicode characters correctly
+ * @depends testSpecial
+ * @depends testUrlencoding
+ * @depends testCharacters
+ */
+ public function testUnicode() {
+ $matches = $this->basicRouter->parse( "/wiki/Spécial:Modifications_récentes" );
+ $this->assertEquals( $matches, array( 'title' => "Spécial:Modifications_récentes" ) );
+
+ $matches = $this->basicRouter->parse( "/wiki/Sp%C3%A9cial:Modifications_r%C3%A9centes" );
+ $this->assertEquals( $matches, array( 'title' => "Spécial:Modifications_récentes" ) );
+ }
+
+ /**
+ * Ensure the router doesn't choke on long paths.
+ */
+ public function testLength() {
+ $matches = $this->basicRouter->parse( "/wiki/Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." );
+ $this->assertEquals( $matches, array( 'title' => "Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." ) );
+ }
+
+
+ /**
+ * Ensure that the php passed site of parameter values are not urldecoded
+ */
+ public function testPatternUrlencoding() {
+ $router = new PathRouter;
+ $router->add( "/wiki/$1", array( 'title' => '%20:$1' ) );
+ $matches = $router->parse( "/wiki/Foo" );
+ $this->assertEquals( $matches, array( 'title' => '%20:Foo' ) );
+ }
+
+ /**
+ * Ensure that raw parameter values do not have any variable replacements or urldecoding
+ */
+ public function testRawParamValue() {
+ $router = new PathRouter;
+ $router->add( "/wiki/$1", array( 'title' => array( 'value' => 'bar%20$1' ) ) );
+ $matches = $router->parse( "/wiki/Foo" );
+ $this->assertEquals( $matches, array( 'title' => 'bar%20$1' ) );
+ }
+
+}
diff --git a/tests/phpunit/includes/Providers.php b/tests/phpunit/includes/Providers.php
index 02898673..f451f8a0 100644
--- a/tests/phpunit/includes/Providers.php
+++ b/tests/phpunit/includes/Providers.php
@@ -2,8 +2,8 @@
/**
* Generic providers for the MediaWiki PHPUnit test suite
*
- * @author Ashar Voultoiz
- * @copyright Copyright © 2011, Ashar Voultoiz
+ * @author Antoine Musso
+ * @copyright Copyright © 2011, Antoine Musso
* @file
*/
diff --git a/tests/phpunit/includes/ResourceLoaderTest.php b/tests/phpunit/includes/ResourceLoaderTest.php
index 30a69c5e..ab704839 100644
--- a/tests/phpunit/includes/ResourceLoaderTest.php
+++ b/tests/phpunit/includes/ResourceLoaderTest.php
@@ -1,6 +1,6 @@
<?php
-class ResourceLoaderTest extends PHPUnit_Framework_TestCase {
+class ResourceLoaderTest extends MediaWikiTestCase {
protected static $resourceLoaderRegisterModulesHook;
diff --git a/tests/phpunit/includes/SanitizerTest.php b/tests/phpunit/includes/SanitizerTest.php
index 40d6cf77..b76aa5c7 100644
--- a/tests/phpunit/includes/SanitizerTest.php
+++ b/tests/phpunit/includes/SanitizerTest.php
@@ -109,5 +109,48 @@ class SanitizerTest extends MediaWikiTestCase {
$this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&amp;&quot;' ), array( 'foo' => '&"' ), 'Special chars can be provided as entities' );
$this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&foobar;' ), array( 'foo' => '&foobar;' ), 'Entity-like items are accepted' );
}
+
+ function testDeprecatedAttributes() {
+ $GLOBALS['wgCleanupPresentationalAttributes'] = true;
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'clear="left"', 'br' ), ' style="clear: left;"', 'Deprecated attributes are converted to styles when enabled.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'clear="all"', 'br' ), ' style="clear: both;"', 'clear=all is converted to clear: both; not clear: all;' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'CLEAR="ALL"', 'br' ), ' style="clear: both;"', 'clear=ALL is not treated differently from clear=all' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'width="100"', 'td' ), ' style="width: 100px;"', 'Numeric sizes use pixels instead of numbers.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'width="100%"', 'td' ), ' style="width: 100%;"', 'Units are allowed in sizes.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'WIDTH="100%"', 'td' ), ' style="width: 100%;"', 'Uppercase WIDTH is treated as lowercase width.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'WiDTh="100%"', 'td' ), ' style="width: 100%;"', 'Mixed case does not break WiDTh.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'nowrap="true"', 'td' ), ' style="white-space: nowrap;"', 'nowrap attribute is output as white-space: nowrap; not something else.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'nowrap=""', 'td' ), ' style="white-space: nowrap;"', 'nowrap="" is considered true, not false' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'NOWRAP="true"', 'td' ), ' style="white-space: nowrap;"', 'nowrap attribute works when uppercase.' );
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'NoWrAp="true"', 'td' ), ' style="white-space: nowrap;"', 'nowrap attribute works when mixed-case.' );
+ $GLOBALS['wgCleanupPresentationalAttributes'] = false;
+ $this->assertEquals( Sanitizer::fixTagAttributes( 'clear="left"', 'br' ), ' clear="left"', 'Deprecated attributes are not converted to styles when enabled.' );
+ }
+
+ /**
+ * @dataProvider provideCssCommentsFixtures
+ */
+ function testCssCommentsChecking( $expected, $css, $message = '' ) {
+ $this->assertEquals(
+ $expected,
+ Sanitizer::checkCss( $css ),
+ $message
+ );
+ }
+
+ function provideCssCommentsFixtures() {
+ /** array( <expected>, <css>, [message] ) */
+ return array(
+ array( ' ', '/**/' ),
+ array( ' ', '/****/' ),
+ array( ' ', '/* comment */' ),
+ array( ' ', "\\2f\\2a foo \\2a\\2f",
+ 'Backslash-escaped comments must be stripped (bug 28450)' ),
+ array( '', '/* unfinished comment structure',
+ 'Remove anything after a comment-start token' ),
+ array( '', "\\2f\\2a unifinished comment'",
+ 'Remove anything after a backslash-escaped comment-start token' ),
+ );
+ }
}
diff --git a/tests/phpunit/includes/UserIsValidEmailAddrTest.php b/tests/phpunit/includes/SanitizerValidateEmailTest.php
index 99bf718e..14d799cf 100644
--- a/tests/phpunit/includes/UserIsValidEmailAddrTest.php
+++ b/tests/phpunit/includes/SanitizerValidateEmailTest.php
@@ -1,12 +1,12 @@
<?php
-class UserIsValidEmailAddrTest extends MediaWikiTestCase {
+class SanitizerValidateEmailTest extends MediaWikiTestCase {
private function checkEmail( $addr, $expected = true, $msg = '') {
if( $msg == '' ) { $msg = "Testing $addr"; }
$this->assertEquals(
$expected,
- User::isValidEmailAddr( $addr ),
+ Sanitizer::validateEmail( $addr ),
$msg
);
}
diff --git a/tests/phpunit/includes/SeleniumConfigurationTest.php b/tests/phpunit/includes/SeleniumConfigurationTest.php
index 750524eb..8589c188 100644
--- a/tests/phpunit/includes/SeleniumConfigurationTest.php
+++ b/tests/phpunit/includes/SeleniumConfigurationTest.php
@@ -2,13 +2,13 @@
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 =
@@ -32,14 +32,14 @@ runAgainstGrid = false
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(
@@ -55,7 +55,7 @@ testSuite[TestSuiteName] = "testSuitePath"
'jUnitLogFile' => null,
'runAgainstGrid' => null
);
- /*
+ /**
* Array of expected testSuites from $testConfig0
*/
private $testSuites0 = array(
@@ -64,7 +64,7 @@ testSuite[TestSuiteName] = "testSuitePath"
);
- /*
+ /**
* Another sample selenium settings file contents
*/
private $testConfig1 =
@@ -73,11 +73,11 @@ testSuite[TestSuiteName] = "testSuitePath"
host = "localhost"
testBrowser = "firefox"
';
- /*
+ /**
* Expected browsers from $testConfig1
*/
private $testBrowsers1 = null;
- /*
+ /**
* Expected selenium settings from $testConfig1
*/
private $testSettings1 = array(
@@ -93,7 +93,7 @@ testBrowser = "firefox"
'jUnitLogFile' => null,
'runAgainstGrid' => null
);
- /*
+ /**
* Expected test suites from $testConfig1
*/
private $testSuites1 = null;
@@ -105,7 +105,7 @@ testBrowser = "firefox"
}
}
- /*
+ /**
* Clean up the temporary file used to store the selenium settings.
*/
public function tearDown() {
@@ -199,7 +199,7 @@ testBrowser = "firefox"
}
- /*
+ /**
* create a temp file and write text to it.
* @param $testToWrite the text to write to the temp file
*/
@@ -210,7 +210,7 @@ testBrowser = "firefox"
fclose($tempFile);
}
- /*
+ /**
* Returns an array containing:
* The contents of the selenium cingiguration ini file
* The expected selenium configuration array that getSeleniumSettings should return
diff --git a/tests/phpunit/includes/TemplateCategoriesTest.php b/tests/phpunit/includes/TemplateCategoriesTest.php
new file mode 100644
index 00000000..de9d6dc6
--- /dev/null
+++ b/tests/phpunit/includes/TemplateCategoriesTest.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @group Database
+ */
+require dirname( __FILE__ ) . "/../../../maintenance/runJobs.php";
+
+class TemplateCategoriesTest extends MediaWikiLangTestCase {
+
+ function testTemplateCategories() {
+ global $wgUser;
+
+ $title = Title::newFromText( "Categorized from template" );
+ $article = new Article( $title );
+ $wgUser = new User();
+ $wgUser->mRights['*'] = array( 'createpage', 'edit', 'purge' );
+
+ $status = $article->doEdit( '{{Categorising template}}', 'Create a page with a template', 0 );
+ $this->assertEquals(
+ array()
+ , $title->getParentCategories()
+ );
+
+ $template = new Article( Title::newFromText( 'Template:Categorising template' ) );
+ $status = $template->doEdit( '[[Category:Solved bugs]]', 'Add a category through a template', 0 );
+
+ // Run the job queue
+ $jobs = new RunJobs;
+ $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+ $jobs->execute();
+
+ $this->assertEquals(
+ array( 'Category:Solved_bugs' => $title->getPrefixedText() )
+ , $title->getParentCategories()
+ );
+ }
+
+}
diff --git a/tests/phpunit/includes/TitleMethodsTest.php b/tests/phpunit/includes/TitleMethodsTest.php
new file mode 100644
index 00000000..2f1103e8
--- /dev/null
+++ b/tests/phpunit/includes/TitleMethodsTest.php
@@ -0,0 +1,78 @@
+<?php
+
+class TitleMethodsTest extends MediaWikiTestCase {
+
+ public function dataEquals() {
+ return array(
+ array( 'Main Page', 'Main Page', true ),
+ array( 'Main Page', 'Not The Main Page', false ),
+ array( 'Main Page', 'Project:Main Page', false ),
+ array( 'File:Example.png', 'Image:Example.png', true ),
+ array( 'Special:Version', 'Special:Version', true ),
+ array( 'Special:Version', 'Special:Recentchanges', false ),
+ array( 'Special:Version', 'Main Page', false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataEquals
+ */
+ public function testEquals( $titleA, $titleB, $expectedBool ) {
+ $titleA = Title::newFromText( $titleA );
+ $titleB = Title::newFromText( $titleB );
+
+ $this->assertEquals( $titleA->equals( $titleB ), $expectedBool );
+ $this->assertEquals( $titleB->equals( $titleA ), $expectedBool );
+ }
+
+ public function dataInNamespace() {
+ return array(
+ array( 'Main Page', NS_MAIN, true ),
+ array( 'Main Page', NS_TALK, false ),
+ array( 'Main Page', NS_USER, false ),
+ array( 'User:Foo', NS_USER, true ),
+ array( 'User:Foo', NS_USER_TALK, false ),
+ array( 'User:Foo', NS_TEMPLATE, false ),
+ array( 'User_talk:Foo', NS_USER_TALK, true ),
+ array( 'User_talk:Foo', NS_USER, false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataInNamespace
+ */
+ public function testInNamespace( $title, $ns, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $title->inNamespace( $ns ), $expectedBool );
+ }
+
+ public function testInNamespaces() {
+ $mainpage = Title::newFromText( 'Main Page' );
+ $this->assertTrue( $mainpage->inNamespaces( NS_MAIN, NS_USER ) );
+ $this->assertTrue( $mainpage->inNamespaces( array( NS_MAIN, NS_USER ) ) );
+ $this->assertTrue( $mainpage->inNamespaces( array( NS_USER, NS_MAIN ) ) );
+ $this->assertFalse( $mainpage->inNamespaces( array( NS_PROJECT, NS_TEMPLATE ) ) );
+ }
+
+ public function dataHasSubjectNamespace() {
+ return array(
+ array( 'Main Page', NS_MAIN, true ),
+ array( 'Main Page', NS_TALK, true ),
+ array( 'Main Page', NS_USER, false ),
+ array( 'User:Foo', NS_USER, true ),
+ array( 'User:Foo', NS_USER_TALK, true ),
+ array( 'User:Foo', NS_TEMPLATE, false ),
+ array( 'User_talk:Foo', NS_USER_TALK, true ),
+ array( 'User_talk:Foo', NS_USER, true ),
+ );
+ }
+
+ /**
+ * @dataProvider dataHasSubjectNamespace
+ */
+ public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
+ $title = Title::newFromText( $title );
+ $this->assertEquals( $title->hasSubjectNamespace( $ns ), $expectedBool );
+ }
+
+}
diff --git a/tests/phpunit/includes/TitlePermissionTest.php b/tests/phpunit/includes/TitlePermissionTest.php
index 1b179686..f62ac5dd 100644
--- a/tests/phpunit/includes/TitlePermissionTest.php
+++ b/tests/phpunit/includes/TitlePermissionTest.php
@@ -5,12 +5,16 @@
*/
class TitlePermissionTest extends MediaWikiLangTestCase {
protected $title;
- protected $user;
- protected $anonUser;
- protected $userUser;
- protected $altUser;
- protected $userName;
- protected $altUserName;
+
+ /**
+ * @var User
+ */
+ protected $user, $anonUser, $userUser, $altUser;
+
+ /**
+ * @var string
+ */
+ protected $userName, $altUserName;
function setUp() {
global $wgLocaltimezone, $wgLocalTZoffset, $wgMemc, $wgContLang, $wgLang;
@@ -56,6 +60,8 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
}
function setUserPerm( $perm ) {
+ // Setting member variables is evil!!!
+
if ( is_array( $perm ) ) {
$this->user->mRights = $perm;
} else {
@@ -299,7 +305,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->assertEquals( $check[$action][3],
$this->title->userCan( $action, true ) );
$this->assertEquals( $check[$action][3],
- $this->title->quickUserCan( $action, false ) );
+ $this->title->quickUserCan( $action ) );
# count( User::getGroupsWithPermissions( $action ) ) < 1
}
@@ -451,7 +457,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->user ) );
$this->assertEquals( true,
- $this->title->quickUserCan( 'edit', false ) );
+ $this->title->quickUserCan( 'edit' ) );
$this->title->mRestrictions = array( "edit" => array( 'bogus', "sysop", "protect", "" ),
"bogus" => array( 'bogus', "sysop", "protect", "" ) );
@@ -491,9 +497,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->user ) );
$this->title->mCascadeRestriction = true;
$this->assertEquals( false,
- $this->title->quickUserCan( 'bogus', false ) );
+ $this->title->quickUserCan( 'bogus' ) );
$this->assertEquals( false,
- $this->title->quickUserCan( 'edit', false ) );
+ $this->title->quickUserCan( 'edit' ) );
$this->assertEquals( array( array( 'badaccess-group0' ),
array( 'protectedpagetext', 'bogus' ),
array( 'protectedpagetext', 'protect' ),
@@ -537,7 +543,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->setTitle( NS_MAIN, "test page" );
$this->title->mTitleProtection['pt_create_perm'] = '';
$this->title->mTitleProtection['pt_user'] = $this->user->getID();
- $this->title->mTitleProtection['pt_expiry'] = Block::infinity();
+ $this->title->mTitleProtection['pt_expiry'] = wfGetDB( DB_SLAVE )->getInfinity();
$this->title->mTitleProtection['pt_reason'] = 'test';
$this->title->mCascadeRestriction = false;
@@ -574,7 +580,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->title->userCan( 'move' ) );
$this->title->mInterwiki = "no";
- $this->assertEquals( array( array( 'immobile-page' ) ),
+ $this->assertEquals( array( array( 'immobile-source-page' ) ),
$this->title->getUserPermissionsErrors( 'move', $this->user ) );
$this->assertEquals( false,
$this->title->userCan( 'move' ) );
@@ -623,7 +629,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$prev = time();
$now = time() + 120;
$this->user->mBlockedby = $this->user->getId();
- $this->user->mBlock = new Block( '127.0.8.1', $this->user->getId(), $this->user->getId(),
+ $this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
'no reason given', $prev + 3600, 1, 0 );
$this->user->mBlock->mTimestamp = 0;
$this->assertEquals( array( array( 'autoblockedtext',
@@ -640,7 +646,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
global $wgLocalTZoffset;
$wgLocalTZoffset = -60;
$this->user->mBlockedby = $this->user->getName();
- $this->user->mBlock = new Block( '127.0.8.1', 2, 1, 'no reason given', $now, 0, 10 );
+ $this->user->mBlock = new Block( '127.0.8.1', 0, 1, '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',
diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php
index e7bb98ac..1c8be5f9 100644
--- a/tests/phpunit/includes/TitleTest.php
+++ b/tests/phpunit/includes/TitleTest.php
@@ -41,10 +41,10 @@ class TitleTest extends MediaWikiTestCase {
/**
* Auth-less test of Title::isValidMoveOperation
*
+ * @group Database
* @param string $source
* @param string $target
- * @param array|string|true $requiredErrors
- * @group Database
+ * @param array|string|true $expected Required error
* @dataProvider dataTestIsValidMoveOperation
*/
function testIsValidMoveOperation( $source, $target, $expected ) {
diff --git a/tests/phpunit/includes/UserTest.php b/tests/phpunit/includes/UserTest.php
index df91aca8..ef03e835 100644
--- a/tests/phpunit/includes/UserTest.php
+++ b/tests/phpunit/includes/UserTest.php
@@ -1,47 +1,67 @@
<?php
+define( 'NS_UNITTEST', 5600 );
+define( 'NS_UNITTEST_TALK', 5601 );
+
+/**
+ * @group Database
+ */
class UserTest extends MediaWikiTestCase {
protected $savedGroupPermissions, $savedRevokedPermissions;
-
+
+ /**
+ * @var User
+ */
+ protected $user;
+
public function setUp() {
parent::setUp();
-
+
$this->savedGroupPermissions = $GLOBALS['wgGroupPermissions'];
$this->savedRevokedPermissions = $GLOBALS['wgRevokePermissions'];
-
+
$this->setUpPermissionGlobals();
+ $this->setUpUser();
}
private function setUpPermissionGlobals() {
global $wgGroupPermissions, $wgRevokePermissions;
-
+
+ # Data for regular $wgGroupPermissions test
$wgGroupPermissions['unittesters'] = array(
+ 'test' => true,
'runtest' => true,
'writetest' => false,
'nukeworld' => false,
);
$wgGroupPermissions['testwriters'] = array(
+ 'test' => true,
'writetest' => true,
'modifytest' => true,
);
-
+ # Data for regular $wgRevokePermissions test
$wgRevokePermissions['formertesters'] = array(
'runtest' => true,
);
}
+ private function setUpUser() {
+ $this->user = new User;
+ $this->user->addGroup( 'unittesters' );
+ }
+
public function tearDown() {
parent::tearDown();
-
+
$GLOBALS['wgGroupPermissions'] = $this->savedGroupPermissions;
$GLOBALS['wgRevokePermissions'] = $this->savedRevokedPermissions;
}
-
+
public function testGroupPermissions() {
$rights = User::getGroupPermissions( array( 'unittesters' ) );
$this->assertContains( 'runtest', $rights );
$this->assertNotContains( 'writetest', $rights );
$this->assertNotContains( 'modifytest', $rights );
$this->assertNotContains( 'nukeworld', $rights );
-
+
$rights = User::getGroupPermissions( array( 'unittesters', 'testwriters' ) );
$this->assertContains( 'runtest', $rights );
$this->assertContains( 'writetest', $rights );
@@ -53,6 +73,71 @@ class UserTest extends MediaWikiTestCase {
$this->assertNotContains( 'runtest', $rights );
$this->assertNotContains( 'writetest', $rights );
$this->assertNotContains( 'modifytest', $rights );
- $this->assertNotContains( 'nukeworld', $rights );
+ $this->assertNotContains( 'nukeworld', $rights );
+ }
+
+ public function testUserPermissions() {
+ $rights = $this->user->getRights();
+ $this->assertContains( 'runtest', $rights );
+ $this->assertNotContains( 'writetest', $rights );
+ $this->assertNotContains( 'modifytest', $rights );
+ $this->assertNotContains( 'nukeworld', $rights );
+ }
+
+ /**
+ * @dataProvider provideGetGroupsWithPermission
+ */
+ public function testGetGroupsWithPermission( $expected, $right ) {
+ $result = User::getGroupsWithPermission( $right );
+ sort( $result );
+ sort( $expected );
+
+ $this->assertEquals( $expected, $result, "Groups with permission $right" );
+ }
+
+ public function provideGetGroupsWithPermission() {
+ return array(
+ array(
+ array( 'unittesters', 'testwriters' ),
+ 'test'
+ ),
+ array(
+ array( 'unittesters' ),
+ 'runtest'
+ ),
+ array(
+ array( 'testwriters' ),
+ 'writetest'
+ ),
+ array(
+ array( 'testwriters' ),
+ 'modifytest'
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideUserNames
+ */
+ public function testIsValidUserName( $username, $result, $message ) {
+ $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
+ }
+
+ public function provideUserNames() {
+ return array(
+ array( '', false, 'Empty string' ),
+ array( ' ', false, 'Blank space' ),
+ array( 'abcd', false, 'Starts with small letter' ),
+ array( 'Ab/cd', false, 'Contains slash' ),
+ array( 'Ab cd' , true, 'Whitespace' ),
+ array( '192.168.1.1', false, 'IP' ),
+ array( 'User:Abcd', false, 'Reserved Namespace' ),
+ array( '12abcd232' , true , 'Starts with Numbers' ),
+ array( '?abcd' , true, 'Start with ? mark' ),
+ array( '#abcd', false, 'Start with #' ),
+ array( 'Abcdà´•à´–à´—à´˜', true, ' Mixed scripts' ),
+ array( 'ജോസàµâ€Œà´¤àµ‹à´®à´¸àµ', false, 'ZWNJ- Format control character' ),
+ array( 'Ab cd', false, ' Ideographic space' ),
+ );
}
-} \ No newline at end of file
+}
diff --git a/tests/phpunit/includes/WebRequestTest.php b/tests/phpunit/includes/WebRequestTest.php
index 1cfbd3fc..e72408f6 100644
--- a/tests/phpunit/includes/WebRequestTest.php
+++ b/tests/phpunit/includes/WebRequestTest.php
@@ -85,4 +85,101 @@ class WebRequestTest extends MediaWikiTestCase {
),
);
}
+
+ /**
+ * @dataProvider provideGetIP
+ */
+ function testGetIP( $expected, $input, $squid, $private, $description ) {
+ global $wgSquidServersNoPurge, $wgUsePrivateIPs;
+ $oldServer = $_SERVER;
+ $_SERVER = $input;
+ $wgSquidServersNoPurge = $squid;
+ $wgUsePrivateIPs = $private;
+ $request = new WebRequest();
+ $result = $request->getIP();
+ $_SERVER = $oldServer;
+ $this->assertEquals( $expected, $result, $description );
+ }
+
+ function provideGetIP() {
+ return array(
+ array(
+ '127.0.0.1',
+ array(
+ 'REMOTE_ADDR' => '127.0.0.1'
+ ),
+ array(),
+ false,
+ 'Simple IPv4'
+ ),
+ array(
+ '::1',
+ array(
+ 'REMOTE_ADDR' => '::1'
+ ),
+ array(),
+ false,
+ 'Simple IPv6'
+ ),
+ 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' ),
+ false,
+ 'With X-Forwaded-For'
+ ),
+ array(
+ '12.0.0.1',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.1',
+ 'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+ ),
+ array(),
+ false,
+ 'With X-Forwaded-For and disallowed server'
+ ),
+ 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( '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( '12.0.0.1', '12.0.0.2' ),
+ false,
+ 'With X-Forwaded-For and private IP'
+ ),
+ array(
+ '10.0.0.3',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.2',
+ 'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+ ),
+ array( '12.0.0.1', '12.0.0.2' ),
+ true,
+ 'With X-Forwaded-For and private IP (allowed)'
+ ),
+ );
+ }
+
+ /**
+ * @expectedException MWException
+ */
+ function testGetIpLackOfRemoteAddrThrowAnException() {
+ $request = new WebRequest();
+ # Next call throw an exception about lacking an IP
+ $request->getIP();
+ }
}
diff --git a/tests/phpunit/includes/XmlSelectTest.php b/tests/phpunit/includes/XmlSelectTest.php
index bf761e3d..2407c151 100644
--- a/tests/phpunit/includes/XmlSelectTest.php
+++ b/tests/phpunit/includes/XmlSelectTest.php
@@ -80,7 +80,7 @@ class XmlSelectTest extends MediaWikiTestCase {
$this->select->addOption( 'foo2' );
$this->assertEquals(
'<select><option value="foo1">foo1</option>' . "\n" .
-'<option value="bar1" selected="selected">bar1</option>' . "\n" .
+'<option value="bar1" selected="">bar1</option>' . "\n" .
'<option value="foo2">foo2</option></select>', $this->select->getHTML() );
}
@@ -96,7 +96,7 @@ class XmlSelectTest extends MediaWikiTestCase {
$this->select->setDefault( 'bar1' ); # setting default after adding options
$this->assertEquals(
'<select><option value="foo1">foo1</option>' . "\n" .
-'<option value="bar1" selected="selected">bar1</option>' . "\n" .
+'<option value="bar1" selected="">bar1</option>' . "\n" .
'<option value="foo2">foo2</option></select>', $this->select->getHTML() );
}
diff --git a/tests/phpunit/includes/XmlTest.php b/tests/phpunit/includes/XmlTest.php
index a6058ef6..1d9361f2 100644
--- a/tests/phpunit/includes/XmlTest.php
+++ b/tests/phpunit/includes/XmlTest.php
@@ -2,19 +2,43 @@
class XmlTest extends MediaWikiTestCase {
private static $oldLang;
+ private static $oldNamespaces;
public function setUp() {
- global $wgLang, $wgLanguageCode;
-
+ global $wgLang, $wgContLang;
+
self::$oldLang = $wgLang;
- $wgLanguageCode = 'en';
- $wgLang = Language::factory( $wgLanguageCode );
+ $wgLang = Language::factory( 'en' );
+
+ // Hardcode namespaces during test runs,
+ // so that html output based on existing namespaces
+ // can be properly evaluated.
+ self::$oldNamespaces = $wgContLang->getNamespaces();
+ $wgContLang->setNamespaces( array(
+ -2 => 'Media',
+ -1 => 'Special',
+ 0 => '',
+ 1 => 'Talk',
+ 2 => 'User',
+ 3 => 'User_talk',
+ 4 => 'MyWiki',
+ 5 => 'MyWiki_Talk',
+ 6 => 'File',
+ 7 => 'File_talk',
+ 8 => 'MediaWiki',
+ 9 => 'MediaWiki_talk',
+ 10 => 'Template',
+ 11 => 'Template_talk',
+ 100 => 'Custom',
+ 101 => 'Custom_talk',
+ ) );
}
-
+
public function tearDown() {
- global $wgLang, $wgLanguageCode;
+ global $wgLang, $wgContLang;
$wgLang = self::$oldLang;
- $wgLanguageCode = $wgLang->getCode();
+
+ $wgContLang->setNamespaces( self::$oldNamespaces );
}
public function testExpandAttributes() {
@@ -88,6 +112,9 @@ class XmlTest extends MediaWikiTestCase {
$this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
}
+ /**
+ * @group Broken
+ */
public function testDateMenu( ) {
$curYear = intval(gmdate('Y'));
$prevYear = $curYear - 1;
@@ -98,11 +125,10 @@ class XmlTest extends MediaWikiTestCase {
$nextMonth = $curMonth + 1;
if( $nextMonth == 13 ) { $nextMonth = 1; }
-
$this->assertEquals(
'<label for="year">From year (and earlier):</label> <input name="year" size="4" value="2011" id="year" maxlength="4" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
'<option value="1">January</option>' . "\n" .
-'<option value="2" selected="selected">February</option>' . "\n" .
+'<option value="2" selected="">February</option>' . "\n" .
'<option value="3">March</option>' . "\n" .
'<option value="4">April</option>' . "\n" .
'<option value="5">May</option>' . "\n" .
@@ -139,7 +165,6 @@ class XmlTest extends MediaWikiTestCase {
"Date menu year is the current one when not specified"
);
- $this->markTestIncomplete( "Broken" );
// @todo FIXME: next month can be in the next year
// test failing because it is now december
$this->assertEquals(
@@ -163,11 +188,57 @@ class XmlTest extends MediaWikiTestCase {
'<option value="10">October</option>' . "\n" .
'<option value="11">November</option>' . "\n" .
'<option value="12">December</option></select>',
- Xml::dateMenu( '', ''),
+ Xml::dateMenu( '', '' ),
"Date menu with neither year or month"
);
}
+ function testNamespaceSelector() {
+ $this->assertEquals(
+ '<select class="namespaceselector" id="namespace" name="namespace">' . "\n" .
+'<option value="0">(Main)</option>' . "\n" .
+'<option value="1">Talk</option>' . "\n" .
+'<option value="2">User</option>' . "\n" .
+'<option value="3">User talk</option>' . "\n" .
+'<option value="4">MyWiki</option>' . "\n" .
+'<option value="5">MyWiki Talk</option>' . "\n" .
+'<option value="6">File</option>' . "\n" .
+'<option value="7">File talk</option>' . "\n" .
+'<option value="8">MediaWiki</option>' . "\n" .
+'<option value="9">MediaWiki talk</option>' . "\n" .
+'<option value="10">Template</option>' . "\n" .
+'<option value="11">Template talk</option>' . "\n" .
+'<option value="100">Custom</option>' . "\n" .
+'<option value="101">Custom talk</option>' . "\n" .
+'</select>',
+ Xml::namespaceSelector(),
+ 'Basic namespace selector without custom options'
+ );
+ $this->assertEquals(
+ '<label for="namespace">Select a namespace:</label>' .
+'&#160;<select class="namespaceselector" id="namespace" name="myname">' . "\n" .
+'<option value="all">all</option>' . "\n" .
+'<option value="0">(Main)</option>' . "\n" .
+'<option value="1">Talk</option>' . "\n" .
+'<option value="2" selected="">User</option>' . "\n" .
+'<option value="3">User talk</option>' . "\n" .
+'<option value="4">MyWiki</option>' . "\n" .
+'<option value="5">MyWiki Talk</option>' . "\n" .
+'<option value="6">File</option>' . "\n" .
+'<option value="7">File talk</option>' . "\n" .
+'<option value="8">MediaWiki</option>' . "\n" .
+'<option value="9">MediaWiki talk</option>' . "\n" .
+'<option value="10">Template</option>' . "\n" .
+'<option value="11">Template talk</option>' . "\n" .
+'<option value="100">Custom</option>' . "\n" .
+'<option value="101">Custom talk</option>' . "\n" .
+'</select>',
+ Xml::namespaceSelector( $selected = '2', $all = 'all', $element_name = 'myname', $label = 'Select a namespace:' ),
+ 'Basic namespace selector with custom values'
+ );
+ }
+
+
#
# textarea
#
@@ -255,12 +326,12 @@ class XmlTest extends MediaWikiTestCase {
function testEncodeJsVarArray() {
$this->assertEquals(
- '["a", 1]',
+ '["a",1]',
Xml::encodeJsVar( array( 'a', 1 ) ),
'encodeJsVar() with array'
);
$this->assertEquals(
- '{"a": "a", "b": 1}',
+ '{"a":"a","b":1}',
Xml::encodeJsVar( array( 'a' => 'a', 'b' => 1 ) ),
'encodeJsVar() with associative array'
);
@@ -268,7 +339,7 @@ class XmlTest extends MediaWikiTestCase {
function testEncodeJsVarObject() {
$this->assertEquals(
- '{"a": "a", "b": 1}',
+ '{"a":"a","b":1}',
Xml::encodeJsVar( (object)array( 'a' => 'a', 'b' => 1 ) ),
'encodeJsVar() with object'
);
diff --git a/tests/phpunit/includes/api/ApiBlockTest.php b/tests/phpunit/includes/api/ApiBlockTest.php
index 227555eb..b95d8214 100644
--- a/tests/phpunit/includes/api/ApiBlockTest.php
+++ b/tests/phpunit/includes/api/ApiBlockTest.php
@@ -15,24 +15,34 @@ class ApiBlockTest extends ApiTestCase {
}
function addDBData() {
- $user = User::newFromName( 'UTBlockee' );
+ $user = User::newFromName( 'UTApiBlockee' );
if ( $user->getId() == 0 ) {
$user->addToDatabase();
- $user->setPassword( 'UTBlockeePassword' );
+ $user->setPassword( 'UTApiBlockeePassword' );
$user->saveSettings();
}
}
+ /**
+ * This test has probably always been broken and use an invalid token
+ * Bug tracking brokenness is https://bugzilla.wikimedia.org/35646
+ *
+ * Root cause is https://gerrit.wikimedia.org/r/3434
+ * Which made the Block/Unblock API to actually verify the token
+ * previously always considered valid (bug 34212).
+ *
+ * @group Broken
+ */
function testMakeNormalBlock() {
$data = $this->getTokens();
- $user = User::newFromName( 'UTBlockee' );
+ $user = User::newFromName( 'UTApiBlockee' );
if ( !$user->getId() ) {
- $this->markTestIncomplete( "The user UTBlockee does not exist" );
+ $this->markTestIncomplete( "The user UTApiBlockee does not exist" );
}
if( !isset( $data[0]['query']['pages'] ) ) {
@@ -45,15 +55,15 @@ class ApiBlockTest extends ApiTestCase {
$data = $this->doApiRequest( array(
'action' => 'block',
- 'user' => 'UTBlockee',
- 'reason' => BlockTest::REASON,
- 'token' => $pageinfo['blocktoken'] ), $data );
+ 'user' => 'UTApiBlockee',
+ 'reason' => 'Some reason',
+ 'token' => $pageinfo['blocktoken'] ), $data, false, self::$users['sysop']->user );
- $block = Block::newFromTarget('UTBlockee');
+ $block = Block::newFromTarget('UTApiBlockee');
$this->assertTrue( !is_null( $block ), 'Block is valid' );
- $this->assertEquals( 'UTBlockee', (string)$block->getTarget() );
+ $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
$this->assertEquals( 'Some reason', $block->mReason );
$this->assertEquals( 'infinity', $block->mExpiry );
diff --git a/tests/phpunit/includes/api/ApiPurgeTest.php b/tests/phpunit/includes/api/ApiPurgeTest.php
index db1563e9..70c20746 100644
--- a/tests/phpunit/includes/api/ApiPurgeTest.php
+++ b/tests/phpunit/includes/api/ApiPurgeTest.php
@@ -9,33 +9,31 @@ class ApiPurgeTest extends ApiTestCase {
parent::setUp();
$this->doLogin();
}
-
+
+ /**
+ * @group Broken
+ */
function testPurgeMainPage() {
-
if ( !Title::newFromText( 'UTPage' )->exists() ) {
$this->markTestIncomplete( "The article [[UTPage]] does not exist" );
}
-
+
$somePage = mt_rand();
$data = $this->doApiRequest( array(
'action' => 'purge',
'titles' => 'UTPage|' . $somePage . '|%5D' ) );
-
- $this->assertArrayHasKey( 'purge', $data[0] );
-
- $this->assertArrayHasKey( 0, $data[0]['purge'] );
- $this->assertArrayHasKey( 'purged', $data[0]['purge'][0] );
- $this->assertEquals( 'UTPage', $data[0]['purge'][0]['title'] );
-
- $this->assertArrayHasKey( 1, $data[0]['purge'] );
- $this->assertArrayHasKey( 'missing', $data[0]['purge'][1] );
- $this->assertEquals( $somePage, $data[0]['purge'][1]['title'] );
-
- $this->assertArrayHasKey( 2, $data[0]['purge'] );
- $this->assertArrayHasKey( 'invalid', $data[0]['purge'][2] );
- $this->assertEquals( '%5D', $data[0]['purge'][2]['title'] );
-
+
+ $this->assertArrayHasKey( 'purge', $data[0],
+ "Must receive a 'purge' result from API" );
+
+ $this->assertEquals( 3, count( $data[0]['purge'] ),
+ "Purge request for three articles should give back three results received: " . var_export( $data[0]['purge'], true ) );
+
+ $pages = array( 'UTPage' => 'purged', $somePage => 'missing', '%5D' => 'invalid' );
+ foreach( $data[0]['purge'] as $v ) {
+ $this->assertArrayHasKey( $pages[$v['title']], $v );
+ }
}
}
diff --git a/tests/phpunit/includes/api/ApiQueryTest.php b/tests/phpunit/includes/api/ApiQueryTest.php
index 114eadf3..ae05a30a 100644
--- a/tests/phpunit/includes/api/ApiQueryTest.php
+++ b/tests/phpunit/includes/api/ApiQueryTest.php
@@ -22,10 +22,13 @@ class ApiQueryTest extends ApiTestCase {
$this->assertArrayHasKey( 'query', $data[0] );
$this->assertArrayHasKey( 'normalized', $data[0]['query'] );
+ // Forge a normalized title
+ $to = Title::newFromText( $wgMetaNamespace.':ArticleA' );
+
$this->assertEquals(
array(
'from' => 'Project:articleA',
- 'to' => $wgMetaNamespace . ':ArticleA'
+ 'to' => $to->getPrefixedText(),
),
$data[0]['query']['normalized'][0]
);
@@ -50,7 +53,6 @@ class ApiQueryTest extends ApiTestCase {
'action' => 'query',
'titles' => $title . '|Talk:' ) );
-
$this->assertArrayHasKey( 'query', $data[0] );
$this->assertArrayHasKey( 'pages', $data[0]['query'] );
$this->assertEquals( 2, count( $data[0]['query']['pages'] ) );
@@ -60,8 +62,6 @@ 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/ApiTest.php b/tests/phpunit/includes/api/ApiTest.php
index a587e6b1..1d9c3238 100644
--- a/tests/phpunit/includes/api/ApiTest.php
+++ b/tests/phpunit/includes/api/ApiTest.php
@@ -96,7 +96,7 @@ class ApiTest extends ApiTestCase {
"lgtoken" => $token,
"lgname" => $user->username,
"lgpassword" => "badnowayinhell",
- )
+ ), $ret[2]
);
$result = $ret[0];
@@ -137,7 +137,7 @@ class ApiTest extends ApiTestCase {
"lgtoken" => $token,
"lgname" => $user->username,
"lgpassword" => $user->password,
- )
+ ), $ret[2]
);
$result = $ret[0];
@@ -148,6 +148,9 @@ class ApiTest extends ApiTestCase {
$this->assertEquals( "Success", $a );
}
+ /**
+ * @group Broken
+ */
function testApiGotCookie() {
$this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
@@ -192,24 +195,23 @@ class ApiTest extends ApiTestCase {
}
/**
- * @depends testApiGotCookie
+ * @todo Finish filling me out...what are we trying to test here?
*/
- function testApiListPages( CookieJar $cj ) {
- $this->markTestIncomplete( "Not done with this yet" );
+ function testApiListPages() {
global $wgServer;
-
- if ( $wgServer == "http://localhost" ) {
+ if ( !isset( $wgServer ) ) {
$this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
}
- $req = MWHttpRequest::factory( self::$apiUrl . "?action=query&format=xml&prop=revisions&" .
- "titles=Main%20Page&rvprop=timestamp|user|comment|content" );
- $req->setCookieJar( $cj );
- $req->execute();
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $req->getContent() );
- $this->assertNotInternalType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $a = $sxe->query[0]->pages[0]->page[0]->attributes();
+
+ $ret = $this->doApiRequest( array(
+ 'action' => 'query',
+ 'prop' => 'revisions',
+ 'titles' => 'Main Page',
+ 'rvprop' => 'timestamp|user|comment|content',
+ ) );
+
+ $result = $ret[0]['query']['pages'];
+ $this->markTestIncomplete( "Somebody needs to finish loving me" );
}
function testRunLogin() {
@@ -228,7 +230,7 @@ class ApiTest extends ApiTestCase {
'action' => 'login',
"lgtoken" => $token,
"lgname" => $sysopUser->username,
- "lgpassword" => $sysopUser->password ), $data );
+ "lgpassword" => $sysopUser->password ), $data[2] );
$this->assertArrayHasKey( "login", $data[0] );
$this->assertArrayHasKey( "result", $data[0]['login'] );
diff --git a/tests/phpunit/includes/api/ApiTestCase.php b/tests/phpunit/includes/api/ApiTestCase.php
index 2917c880..8801391f 100644
--- a/tests/phpunit/includes/api/ApiTestCase.php
+++ b/tests/phpunit/includes/api/ApiTestCase.php
@@ -7,6 +7,11 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
public static $users;
protected static $apiUrl;
+ /**
+ * @var ApiTestContext
+ */
+ protected $apiContext;
+
function setUp() {
global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
@@ -21,31 +26,37 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
'sysop' => new ApiTestUser(
'Apitestsysop',
'Api Test Sysop',
- 'api_test_sysop@sample.com',
+ 'api_test_sysop@example.com',
array( 'sysop' )
),
'uploader' => new ApiTestUser(
'Apitestuser',
'Api Test User',
- 'api_test_user@sample.com',
+ 'api_test_user@example.com',
array()
)
);
$wgUser = self::$users['sysop']->user;
+ $this->apiContext = new ApiTestContext();
+
}
- protected function doApiRequest( $params, $session = null, $appendModule = false ) {
+ protected function doApiRequest( $params, $session = null, $appendModule = false, $user = null ) {
if ( is_null( $session ) ) {
$session = array();
}
- $request = new FauxRequest( $params, true, $session );
- $module = new ApiMain( $request, true );
+ $context = $this->apiContext->newTestContext( $params, $session, $user );
+ $module = new ApiMain( $context, true );
$module->execute();
- $results = array( $module->getResultData(), $request, $request->getSessionArray() );
+ $results = array(
+ $module->getResultData(),
+ $context->getRequest(),
+ $context->getRequest()->getSessionArray()
+ );
if( $appendModule ) {
$results[] = $module;
}
@@ -59,14 +70,15 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
* request, without actually requesting a "real" edit token
* @param $params: key-value API params
* @param $session: session array
+ * @param $user String|null A User object for the context
*/
- protected function doApiRequestWithToken( $params, $session ) {
+ protected function doApiRequestWithToken( $params, $session, $user = null ) {
if ( $session['wsToken'] ) {
// add edit token to fake session
$session['wsEditToken'] = $session['wsToken'];
// add token to request parameters
$params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
- return $this->doApiRequest( $params, $session );
+ return $this->doApiRequest( $params, $session, false, $user );
} else {
throw new Exception( "request data not in right format" );
}
@@ -91,12 +103,11 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
}
protected function getTokenList( $user ) {
- $GLOBALS['wgUser'] = $user->user;
$data = $this->doApiRequest( array(
'action' => 'query',
'titles' => 'Main Page',
'intoken' => 'edit|delete|protect|move|block|unblock',
- 'prop' => 'info' ) );
+ 'prop' => 'info' ), false, $user->user );
return $data;
}
}
@@ -137,3 +148,23 @@ class MockApi extends ApiBase {
);
}
}
+
+class ApiTestContext extends RequestContext {
+
+ /**
+ * Returns a DerivativeContext with the request variables in place
+ *
+ * @param $params Array key-value API params
+ * @param $session Array session data
+ * @param $user User or null
+ * @return DerivativeContext
+ */
+ public function newTestContext( $params, $session, $user = null ) {
+ $context = new DerivativeContext( $this );
+ $context->setRequest( new FauxRequest( $params, true, $session ) );
+ 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 e51e7214..39c79547 100644
--- a/tests/phpunit/includes/api/ApiTestCaseUpload.php
+++ b/tests/phpunit/includes/api/ApiTestCaseUpload.php
@@ -19,6 +19,10 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
$this->clearFakeUploads();
}
+ public function tearDown() {
+ $this->clearTempUpload();
+ }
+
/**
* Helper function -- remove files and associated articles by Title
* @param $title Title: title to be removed
@@ -33,8 +37,8 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
if ( !$status->isGood() ) {
return false;
}
- $article = new Article( $title );
- $article->doDeleteArticle( "removing for test" );
+ $page = WikiPage::factory( $title );
+ $page->doDeleteArticle( "removing for test" );
// see if it now doesn't exist; reload
$title = Title::newFromText( $title->getText(), NS_FILE );
@@ -56,7 +60,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
* @param $filePath String: path to file on the filesystem
*/
public function deleteFileByContent( $filePath ) {
- $hash = File::sha1Base36( $filePath );
+ $hash = FSFile::getSha1Base36FromPath( $filePath );
$dupes = RepoGroup::singleton()->findBySha1( $hash );
$success = true;
foreach ( $dupes as $dupe ) {
@@ -100,6 +104,36 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
return true;
}
+ function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ){
+ $tmpName = tempnam( wfTempDir(), "" );
+ // copy the chunk data to temp location:
+ if ( !file_put_contents( $tmpName, $chunkData ) ) {
+ throw new Exception( "couldn't copy chunk data to $tmpName" );
+ }
+
+ clearstatcache();
+ $size = filesize( $tmpName );
+ if ( $size === false ) {
+ throw new Exception( "couldn't stat $tmpName" );
+ }
+
+ $_FILES[ $fieldName ] = array(
+ 'name' => $fileName,
+ 'type' => $type,
+ 'tmp_name' => $tmpName,
+ 'size' => $size,
+ 'error' => null
+ );
+ }
+
+ function clearTempUpload() {
+ if( isset( $_FILES['file']['tmp_name'] ) ) {
+ $tmp = $_FILES['file']['tmp_name'];
+ if( file_exists( $tmp ) ) {
+ unlink( $tmp );
+ }
+ }
+ }
/**
* Remove traces of previous fake uploads
diff --git a/tests/phpunit/includes/api/ApiTestUser.php b/tests/phpunit/includes/api/ApiTestUser.php
index df60682f..8d5f61a7 100644
--- a/tests/phpunit/includes/api/ApiTestUser.php
+++ b/tests/phpunit/includes/api/ApiTestUser.php
@@ -8,7 +8,7 @@ class ApiTestUser {
public $groups;
public $user;
- function __construct( $username, $realname = 'Real Name', $email = 'sample@sample.com', $groups = array() ) {
+ function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
$this->username = $username;
$this->realname = $realname;
$this->email = $email;
diff --git a/tests/phpunit/includes/api/ApiUploadTest.php b/tests/phpunit/includes/api/ApiUploadTest.php
index 5c929784..7a700326 100644
--- a/tests/phpunit/includes/api/ApiUploadTest.php
+++ b/tests/phpunit/includes/api/ApiUploadTest.php
@@ -19,6 +19,9 @@ require_once( 'ApiTestCaseUpload.php' );
/**
* @group Database
+ * @group Broken
+ * Broken test, reports false errors from time to time.
+ * See https://bugzilla.wikimedia.org/26169
*
* This is pretty sucky... needs to be prettified.
*/
@@ -54,6 +57,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->assertEquals( "Success", $result['login']['result'] );
$this->assertArrayHasKey( 'lgtoken', $result['login'] );
+ $this->assertNotEmpty( $session, 'API Login must return a session' );
return $session;
}
@@ -78,14 +82,11 @@ class ApiUploadTest extends ApiTestCaseUpload {
* @depends testLogin
*/
public function testUploadMissingParams( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
-
$exception = false;
try {
$this->doApiRequestWithToken( array(
'action' => 'upload',
- ), $session );
+ ), $session, self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
$this->assertEquals( "One of the parameters filekey, file, url, statuskey is required",
@@ -99,20 +100,17 @@ class ApiUploadTest extends ApiTestCaseUpload {
* @depends testLogin
*/
public function testUpload( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
-
$extension = 'png';
$mimeType = 'image/png';
try {
$randomImageGenerator = new RandomImageGenerator();
+ $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
}
catch ( Exception $e ) {
$this->markTestIncomplete( $e->getMessage() );
}
- $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
$filePath = $filePaths[0];
$fileSize = filesize( $filePath );
$fileName = basename( $filePath );
@@ -135,7 +133,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, , ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
}
@@ -155,9 +154,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
* @depends testLogin
*/
public function testUploadZeroLength( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
-
$mimeType = 'image/png';
$filePath = tempnam( wfTempDir(), "" );
@@ -179,7 +175,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- $this->doApiRequestWithToken( $params, $session );
+ $this->doApiRequestWithToken( $params, $session, self::$users['uploader']->user );
} catch ( UsageException $e ) {
$this->assertContains( 'The file you submitted was empty', $e->getMessage() );
$exception = true;
@@ -196,20 +192,17 @@ class ApiUploadTest extends ApiTestCaseUpload {
* @depends testLogin
*/
public function testUploadSameFileName( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
-
$extension = 'png';
$mimeType = 'image/png';
try {
$randomImageGenerator = new RandomImageGenerator();
+ $filePaths = $randomImageGenerator->writeImages( 2, $extension, wfTempDir() );
}
catch ( Exception $e ) {
$this->markTestIncomplete( $e->getMessage() );
}
- $filePaths = $randomImageGenerator->writeImages( 2, $extension, wfTempDir() );
// we'll reuse this filename
$fileName = basename( $filePaths[0] );
@@ -233,7 +226,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
}
@@ -249,7 +243,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, , ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user ); // FIXME: leaks a temporary file
} catch ( UsageException $e ) {
$exception = true;
}
@@ -270,19 +265,17 @@ class ApiUploadTest extends ApiTestCaseUpload {
* @depends testLogin
*/
public function testUploadSameContent( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
-
$extension = 'png';
$mimeType = 'image/png';
try {
$randomImageGenerator = new RandomImageGenerator();
+ $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
}
catch ( Exception $e ) {
$this->markTestIncomplete( $e->getMessage() );
}
- $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
+
$fileNames[0] = basename( $filePaths[0] );
$fileNames[1] = "SameContentAs" . $fileNames[0];
@@ -307,7 +300,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
}
@@ -332,7 +326,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user ); // FIXME: leaks a temporary file
} catch ( UsageException $e ) {
$exception = true;
}
@@ -354,19 +349,19 @@ class ApiUploadTest extends ApiTestCaseUpload {
*/
public function testUploadStash( $session ) {
global $wgUser;
- $wgUser = self::$users['uploader']->user;
+ $wgUser = self::$users['uploader']->user; // @todo FIXME: still used somewhere
$extension = 'png';
$mimeType = 'image/png';
try {
$randomImageGenerator = new RandomImageGenerator();
+ $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
}
catch ( Exception $e ) {
$this->markTestIncomplete( $e->getMessage() );
}
- $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
$filePath = $filePaths[0];
$fileSize = filesize( $filePath );
$fileName = basename( $filePath );
@@ -389,7 +384,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user ); // FIXME: leaks a temporary file
} catch ( UsageException $e ) {
$exception = true;
}
@@ -417,17 +413,156 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->clearFakeUploads();
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session );
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
}
$this->assertTrue( isset( $result['upload'] ) );
$this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertFalse( $exception );
+ $this->assertFalse( $exception, "No UsageException exception." );
// clean up
$this->deleteFileByFilename( $fileName );
unlink( $filePath );
}
-}
+
+
+ /**
+ * @depends testLogin
+ */
+ public function testUploadChunks( $session ) {
+ global $wgUser;
+ $wgUser = self::$users['uploader']->user; // @todo FIXME: still used somewhere
+
+ $chunkSize = 1048576;
+ // Download a large image file
+ // ( using RandomImageGenerator for large files is not stable )
+ $mimeType = 'image/jpeg';
+ $url = 'http://upload.wikimedia.org/wikipedia/commons/e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
+ $filePath = wfTempDir() . '/Oberaargletscher_from_Oberaar.jpg';
+ try {
+ // Only download if the file is not avaliable in the temp location:
+ if( !is_file( $filePath ) ){
+ copy($url, $filePath);
+ }
+ }
+ catch ( Exception $e ) {
+ $this->markTestIncomplete( $e->getMessage() );
+ }
+ $fileSize = filesize( $filePath );
+ $fileName = basename( $filePath );
+
+ $this->deleteFileByFileName( $fileName );
+ $this->deleteFileByContent( $filePath );
+
+ // Base upload params:
+ $params = array(
+ 'action' => 'upload',
+ 'stash' => 1,
+ 'filename' => $fileName,
+ 'filesize' => $fileSize,
+ 'offset' => 0,
+ );
+
+ // Upload chunks
+ $chunkSessionKey = false;
+ $resultOffset = 0;
+ // Open the file:
+ $handle = @fopen ($filePath, "r");
+ if( $handle === false ){
+ $this->markTestIncomplete( "could not open file: $filePath" );
+ }
+ while (!feof ($handle)) {
+ // Get the current chunk
+ $chunkData = @fread( $handle, $chunkSize );
+
+ // Upload the current chunk into the $_FILE object:
+ $this->fakeUploadChunk( 'chunk', 'blob', $mimeType, $chunkData );
+
+ // Check for chunkSessionKey
+ if( !$chunkSessionKey ){
+ // Upload fist chunk ( and get the session key )
+ try {
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
+ } catch ( UsageException $e ) {
+ $this->markTestIncomplete( $e->getMessage() );
+ }
+ // 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( ! isset( $result['upload']['filekey'] ) ){
+ $this->markTestIncomplete( "no filekey provided" );
+ }
+ $chunkSessionKey = $result['upload']['filekey'];
+ $this->assertEquals( 'Continue', $result['upload']['result'] );
+ // First chunk should have chunkSize == offset
+ $this->assertEquals( $chunkSize, $result['upload']['offset'] );
+ $resultOffset = $result['upload']['offset'];
+ continue;
+ }
+ // Filekey set to chunk session
+ $params['filekey'] = $chunkSessionKey;
+ // Update the offset ( always add chunkSize for subquent chunks should be in-sync with $result['upload']['offset'] )
+ $params['offset'] += $chunkSize;
+ // Make sure param offset is insync with resultOffset:
+ $this->assertEquals( $resultOffset, $params['offset'] );
+ // Upload current chunk
+ try {
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
+ } catch ( UsageException $e ) {
+ $this->markTestIncomplete( $e->getMessage() );
+ }
+ // 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:
+ if( $params['offset'] + $chunkSize >= $fileSize ){
+ $this->assertEquals( 'Success', $result['upload']['result'] );
+ break;
+ } else {
+ $this->assertEquals( 'Continue', $result['upload']['result'] );
+ // update $resultOffset
+ $resultOffset = $result['upload']['offset'];
+ }
+ }
+ fclose ($handle);
+
+ // Check that we got a valid file result:
+ wfDebug( __METHOD__ . " hohoh filesize {$fileSize} info {$result['upload']['imageinfo']['size']}\n\n");
+ $this->assertEquals( $fileSize, $result['upload']['imageinfo']['size'] );
+ $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
+ $this->assertTrue( isset( $result['upload']['filekey'] ) );
+ $filekey = $result['upload']['filekey'];
+
+ // Now we should try to release the file from stash
+ $params = array(
+ 'action' => 'upload',
+ 'filekey' => $filekey,
+ 'filename' => $fileName,
+ 'comment' => 'dummy comment',
+ 'text' => "This is the page text for $fileName, altered",
+ );
+ $this->clearFakeUploads();
+ $exception = false;
+ try {
+ list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ self::$users['uploader']->user );
+ } catch ( UsageException $e ) {
+ $exception = true;
+ }
+ $this->assertTrue( isset( $result['upload'] ) );
+ $this->assertEquals( 'Success', $result['upload']['result'] );
+ $this->assertFalse( $exception );
+
+ // clean up
+ $this->deleteFileByFilename( $fileName );
+ // 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 3c7ff304..b7803746 100644
--- a/tests/phpunit/includes/api/ApiWatchTest.php
+++ b/tests/phpunit/includes/api/ApiWatchTest.php
@@ -41,6 +41,7 @@ class ApiWatchTest extends ApiTestCase {
/**
* @depends testWatchEdit
+ * @group Broken
*/
function testWatchClear() {
@@ -92,7 +93,9 @@ class ApiWatchTest extends ApiTestCase {
$this->assertArrayHasKey( 'edit', $data[0]['protect']['protections'][0] );
}
-
+ /**
+ * @group Broken
+ */
function testGetRollbackToken() {
$data = $this->getTokens();
diff --git a/tests/phpunit/includes/api/RandomImageGenerator.php b/tests/phpunit/includes/api/RandomImageGenerator.php
index ae349978..86c0a828 100644
--- a/tests/phpunit/includes/api/RandomImageGenerator.php
+++ b/tests/phpunit/includes/api/RandomImageGenerator.php
@@ -1,6 +1,6 @@
<?php
-/*
+/**
* RandomImageGenerator -- does what it says on the tin.
* Requires Imagick, the ImageMagick library for PHP, or the command line equivalent (usually 'convert').
*
@@ -27,12 +27,11 @@
class RandomImageGenerator {
private $dictionaryFile;
- private $minWidth = 400;
- private $maxWidth = 800;
- private $minHeight = 400;
- private $maxHeight = 800;
- private $shapesToDraw = 5;
- private $imageWriteMethod;
+ private $minWidth = 400 ;
+ private $maxWidth = 800 ;
+ private $minHeight = 400 ;
+ private $maxHeight = 800 ;
+ private $shapesToDraw = 5 ;
/**
* Orientations: 0th row, 0th column, EXIF orientation code, rotation 2x2 matrix that is opposite of orientation
@@ -41,35 +40,35 @@ class RandomImageGenerator {
* (we also would need a non-symmetric shape for the images to test those, like a letter F)
*/
private static $orientations = array(
- array(
- '0thRow' => 'top',
- '0thCol' => 'left',
- 'exifCode' => 1,
- 'counterRotation' => array( array( 1, 0 ), array( 0, 1 ) )
+ array(
+ '0thRow' => 'top',
+ '0thCol' => 'left',
+ 'exifCode' => 1,
+ 'counterRotation' => array( array( 1, 0 ), array( 0, 1 ) )
),
- array(
+ array(
'0thRow' => 'bottom',
- '0thCol' => 'right',
- 'exifCode' => 3,
- 'counterRotation' => array( array( -1, 0 ), array( 0, -1 ) )
+ '0thCol' => 'right',
+ 'exifCode' => 3,
+ 'counterRotation' => array( array( -1, 0 ), array( 0, -1 ) )
),
- array(
- '0thRow' => 'right',
- '0thCol' => 'top',
- 'exifCode' => 6,
- 'counterRotation' => array( array( 0, 1 ), array( 1, 0 ) )
+ array(
+ '0thRow' => 'right',
+ '0thCol' => 'top',
+ 'exifCode' => 6,
+ 'counterRotation' => array( array( 0, 1 ), array( 1, 0 ) )
),
- array(
- '0thRow' => 'left',
- '0thCol' => 'bottom',
- 'exifCode' => 8,
- 'counterRotation' => array( array( 0, -1 ), array( -1, 0 ) )
+ array(
+ '0thRow' => 'left',
+ '0thCol' => 'bottom',
+ 'exifCode' => 8,
+ 'counterRotation' => array( array( 0, -1 ), array( -1, 0 ) )
)
);
public function __construct( $options = array() ) {
- foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight', 'maxHeight', 'shapesToDraw' ) as $property ) {
+ foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight', 'shapesToDraw' ) as $property ) {
if ( isset( $options[$property] ) ) {
$this->$property = $options[$property];
}
@@ -77,10 +76,10 @@ class RandomImageGenerator {
// find the dictionary file, to generate random names
if ( !isset( $this->dictionaryFile ) ) {
- foreach ( array(
- '/usr/share/dict/words',
- '/usr/dict/words',
- dirname( __FILE__ ) . '/words.txt' )
+ foreach ( array(
+ '/usr/share/dict/words',
+ '/usr/dict/words',
+ dirname( __FILE__ ) . '/words.txt' )
as $dictionaryFile ) {
if ( is_file( $dictionaryFile ) and is_readable( $dictionaryFile ) ) {
$this->dictionaryFile = $dictionaryFile;
@@ -91,14 +90,6 @@ class RandomImageGenerator {
if ( !isset( $this->dictionaryFile ) ) {
throw new Exception( "RandomImageGenerator: dictionary file not found or not specified properly" );
}
-
- if ( !class_exists( 'Imagick' ) ) {
- throw new Exception( 'No Imagick extension' );
- }
- global $wgExiv2Command;
- if ( !$wgExiv2Command || !is_executable( $wgExiv2Command ) ) {
- throw new Exception( 'exiv2 not executable or $wgExiv2Command not set' );
- }
}
/**
@@ -125,15 +116,16 @@ class RandomImageGenerator {
*/
function getImageWriteMethod( $format ) {
global $wgUseImageMagick, $wgImageMagickConvertCommand;
- if ( $format === 'svg' ) {
+ if ( $format === 'svg' ) {
return 'writeSvg';
} else {
// figure out how to write images
- if ( class_exists( 'Imagick' ) ) {
+ global $wgExiv2Command;
+ if ( class_exists( 'Imagick' ) && $wgExiv2Command && is_executable( $wgExiv2Command ) ) {
return 'writeImageWithApi';
} elseif ( $wgUseImageMagick && $wgImageMagickConvertCommand && is_executable( $wgImageMagickConvertCommand ) ) {
return 'writeImageWithCommandLine';
- }
+ }
}
throw new Exception( "RandomImageGenerator: could not find a suitable method to write images in '$format' format" );
}
@@ -219,7 +211,7 @@ class RandomImageGenerator {
*/
static function shapePointsToString( $shape ) {
$points = array();
- foreach ( $shape as $point ) {
+ foreach ( $shape as $point ) {
$points[] = $point['x'] . ',' . $point['y'];
}
return join( " ", $points );
@@ -232,16 +224,16 @@ class RandomImageGenerator {
* @param $format: file format to write (which is obviously always svg here)
* @param $filename: filename to write to
*/
- public function writeSvg( $spec, $format, $filename ) {
+ public function writeSvg( $spec, $format, $filename ) {
$svg = new SimpleXmlElement( '<svg/>' );
$svg->addAttribute( 'xmlns', 'http://www.w3.org/2000/svg' );
- $svg->addAttribute( 'version', '1.1' );
- $svg->addAttribute( 'width', $spec['width'] );
- $svg->addAttribute( 'height', $spec['height'] );
+ $svg->addAttribute( 'version', '1.1' );
+ $svg->addAttribute( 'width', $spec['width'] );
+ $svg->addAttribute( 'height', $spec['height'] );
$g = $svg->addChild( 'g' );
foreach ( $spec['draws'] as $drawSpec ) {
$shape = $g->addChild( 'polygon' );
- $shape->addAttribute( 'fill', $drawSpec['fill'] );
+ $shape->addAttribute( 'fill', $drawSpec['fill'] );
$shape->addAttribute( 'points', self::shapePointsToString( $drawSpec['shape'] ) );
};
if ( ! $fh = fopen( $filename, 'w' ) ) {
@@ -260,20 +252,20 @@ class RandomImageGenerator {
* @param $filename: filename to write to
*/
public function writeImageWithApi( $spec, $format, $filename ) {
- // this is a hack because I can't get setImageOrientation() to work. See below.
+ // this is a hack because I can't get setImageOrientation() to work. See below.
global $wgExiv2Command;
$image = new Imagick();
/**
- * If the format is 'jpg', will also add a random orientation -- the image will be drawn rotated with triangle points
+ * If the format is 'jpg', will also add a random orientation -- the image will be drawn rotated with triangle points
* facing in some direction (0, 90, 180 or 270 degrees) and a countering rotation should turn the triangle points upward again
*/
$orientation = self::$orientations[0]; // default is normal orientation
if ( $format == 'jpg' ) {
$orientation = self::$orientations[ array_rand( self::$orientations ) ];
- $spec = self::rotateImageSpec( $spec, $orientation['counterRotation'] );
+ $spec = self::rotateImageSpec( $spec, $orientation['counterRotation'] );
}
-
+
$image->newImage( $spec['width'], $spec['height'], new ImagickPixel( $spec['fill'] ) );
foreach ( $spec['draws'] as $drawSpec ) {
@@ -296,7 +288,7 @@ class RandomImageGenerator {
$cmd = wfEscapeShellArg( $wgExiv2Command )
. " -M "
. wfEscapeShellArg( "set Exif.Image.Orientation " . $orientation['exifCode'] )
- . " "
+ . " "
. wfEscapeShellArg( $filename );
$retval = 0;
@@ -304,15 +296,13 @@ class RandomImageGenerator {
if ( $retval !== 0 ) {
print "Error with $cmd: $retval, $err\n";
}
- }
-
-
+ }
}
/**
* Given an image specification, produce rotated version
* This is used when simulating a rotated image capture with EXIF orientation
- * @param $spec Object returned by getImageSpec
+ * @param $spec Object returned by getImageSpec
* @param $matrix 2x2 transformation matrix
* @return transformed Spec
*/
@@ -323,8 +313,8 @@ class RandomImageGenerator {
$correctionY = 0;
if ( $dims['x'] < 0 ) {
$correctionX = abs( $dims['x'] );
- }
- if ( $dims['y'] < 0 ) {
+ }
+ if ( $dims['y'] < 0 ) {
$correctionY = abs( $dims['y'] );
}
$tSpec['width'] = abs( $dims['x'] );
@@ -332,7 +322,7 @@ class RandomImageGenerator {
$tSpec['fill'] = $spec['fill'];
$tSpec['draws'] = array();
foreach( $spec['draws'] as $draw ) {
- $tDraw = array(
+ $tDraw = array(
'fill' => $draw['fill'],
'shape' => array()
);
@@ -349,13 +339,13 @@ class RandomImageGenerator {
/**
* Given a matrix and a pair of images, return new position
- * @param $matrix: 2x2 rotation matrix
+ * @param $matrix: 2x2 rotation matrix
* @param $x: x-coordinate number
* @param $y: y-coordinate number
- * @return Array transformed with properties x, y
+ * @return Array transformed with properties x, y
*/
private static function matrixMultiply2x2( $matrix, $x, $y ) {
- return array(
+ return array(
'x' => $x * $matrix[0][0] + $y * $matrix[0][1],
'y' => $x * $matrix[1][0] + $y * $matrix[1][1]
);
@@ -366,10 +356,10 @@ class RandomImageGenerator {
* Based on an image specification, write such an image to disk, using the command line ImageMagick program ('convert').
*
* Sample command line:
- * $ convert -size 100x60 xc:rgb(90,87,45) \
- * -draw 'fill rgb(12,34,56) polygon 41,39 44,57 50,57 41,39' \
- * -draw 'fill rgb(99,123,231) circle 59,39 56,57' \
- * -draw 'fill rgb(240,12,32) circle 50,21 50,3' filename.png
+ * $ convert -size 100x60 xc:rgb(90,87,45) \
+ * -draw 'fill rgb(12,34,56) polygon 41,39 44,57 50,57 41,39' \
+ * -draw 'fill rgb(99,123,231) circle 59,39 56,57' \
+ * -draw 'fill rgb(240,12,32) circle 50,21 50,3' filename.png
*
* @param $spec: spec describing background and shapes to draw
* @param $format: file format to write (unused by this method but kept so it has the same signature as writeImageWithApi)
diff --git a/tests/phpunit/includes/db/DatabaseSqliteTest.php b/tests/phpunit/includes/db/DatabaseSqliteTest.php
index 914ab27c..067c731a 100644
--- a/tests/phpunit/includes/db/DatabaseSqliteTest.php
+++ b/tests/phpunit/includes/db/DatabaseSqliteTest.php
@@ -19,6 +19,7 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
/**
* @group sqlite
+ * @group Database
*/
class DatabaseSqliteTest extends MediaWikiTestCase {
var $db;
@@ -98,7 +99,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$this->assertEquals( 'sqlite_master', $db->tableName( 'sqlite_master' ) );
$this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
}
-
+
public function testDuplicateTableStructure() {
$db = new DatabaseSqliteStandalone( ':memory:' );
$db->query( 'CREATE TABLE foo(foo, barfoo)' );
@@ -119,7 +120,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
'Create a temporary duplicate only'
);
}
-
+
public function testDuplicateTableStructureVirtual() {
$db = new DatabaseSqliteStandalone( ':memory:' );
if ( $db->getFulltextSearchModule() != 'FTS3' ) {
@@ -191,13 +192,14 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
'1.15',
'1.16',
'1.17',
+ '1.18',
);
// Mismatches for these columns we can safely ignore
$ignoredColumns = array(
'user_newtalk.user_last_timestamp', // r84185
);
-
+
$currentDB = new DatabaseSqliteStandalone( ':memory:' );
$currentDB->sourceFile( "$IP/maintenance/tables.sql" );
$currentTables = $this->getTables( $currentDB );
@@ -254,9 +256,10 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$maint = new FakeMaintenance();
$maint->loadParamsAndArgs( null, array( 'quiet' => 1 ) );
}
-
+
+ global $IP;
$db = new DatabaseSqliteStandalone( ':memory:' );
- $db->sourceFile( dirname( __FILE__ ) . "/sqlite/tables-$version.sql" );
+ $db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
$updater = DatabaseUpdater::newForDB( $db, false, $maint );
$updater->doUpdates( array( 'core' ) );
return $db;
@@ -266,6 +269,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$list = array_flip( $db->listTables() );
$excluded = array(
'math', // moved out of core in 1.18
+ 'trackbacks', // removed from core in 1.19
'searchindex',
'searchindex_content',
'searchindex_segments',
diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php
index d480ac6e..672e6645 100644
--- a/tests/phpunit/includes/db/DatabaseTest.php
+++ b/tests/phpunit/includes/db/DatabaseTest.php
@@ -2,12 +2,20 @@
/**
* @group Database
+ * @group DatabaseBase
*/
class DatabaseTest extends MediaWikiTestCase {
- var $db;
+ var $db, $functionTest = false;
function setUp() {
- $this->db = wfGetDB( DB_SLAVE );
+ $this->db = wfGetDB( DB_MASTER );
+ }
+
+ function tearDown() {
+ if ( $this->functionTest ) {
+ $this->dropFunctions();
+ $this->functionTest = false;
+ }
}
function testAddQuotesNull() {
@@ -90,6 +98,26 @@ class DatabaseTest extends MediaWikiTestCase {
$sql );
}
+ /**
+ * @group Broken
+ */
+ function testStoredFunctions() {
+ if ( !in_array( wfGetDB( DB_MASTER )->getType(), array( 'mysql', 'postgres' ) ) ) {
+ $this->markTestSkipped( 'MySQL or Postgres required' );
+ }
+ global $IP;
+ $this->dropFunctions();
+ $this->functionTest = true;
+ $this->assertTrue( $this->db->sourceFile( "$IP/tests/phpunit/data/db/{$this->db->getType()}/functions.sql" ) );
+ $res = $this->db->query( 'SELECT mw_test_function() AS test', __METHOD__ );
+ $this->assertEquals( 42, $res->fetchObject()->test );
+ }
+
+ private function dropFunctions() {
+ $this->db->query( 'DROP FUNCTION IF EXISTS mw_test_function'
+ . ( $this->db->getType() == 'postgres' ? '()' : '' )
+ );
+ }
}
diff --git a/tests/phpunit/includes/debug/MWDebugTest.php b/tests/phpunit/includes/debug/MWDebugTest.php
new file mode 100644
index 00000000..5a4e66d4
--- /dev/null
+++ b/tests/phpunit/includes/debug/MWDebugTest.php
@@ -0,0 +1,63 @@
+<?php
+
+class MWDebugTest extends MediaWikiTestCase {
+
+
+ function setUp() {
+ // Make sure MWDebug class is enabled
+ static $MWDebugEnabled = false;
+ if( !$MWDebugEnabled ) {
+ MWDebug::init();
+ $MWDebugEnabled = true;
+ }
+ /** Clear log before each test */
+ MWDebug::clearLog();
+ }
+
+ function testAddLog() {
+ MWDebug::log( 'logging a string' );
+ $this->assertEquals( array( array(
+ 'msg' => 'logging a string',
+ 'type' => 'log',
+ 'caller' => __METHOD__ ,
+ ) ),
+ MWDebug::getLog()
+ );
+ }
+
+ function testAddWarning() {
+ MWDebug::warning( 'Warning message' );
+ $this->assertEquals( array( array(
+ 'msg' => 'Warning message',
+ 'type' => 'warn',
+ 'caller' => 'MWDebug::warning',
+ ) ),
+ MWDebug::getLog()
+ );
+ }
+
+ function testAvoidDuplicateDeprecations() {
+ MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
+ MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
+
+ // assertCount() not available on WMF integration server
+ $this->assertEquals( 1,
+ count( MWDebug::getLog() ),
+ "Only one deprecated warning per function should be kept"
+ );
+ }
+
+ function testAvoidNonConsecutivesDuplicateDeprecations() {
+ MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
+ MWDebug::warning( 'some warning' );
+ MWDebug::log( 'we could have logged something too' );
+ // Another deprecation
+ MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
+
+ // assertCount() not available on WMF integration server
+ $this->assertEquals( 3,
+ count( MWDebug::getLog() ),
+ "Only one deprecated warning per function should be kept"
+ );
+ }
+}
diff --git a/tests/phpunit/includes/filerepo/FileBackendTest.php b/tests/phpunit/includes/filerepo/FileBackendTest.php
new file mode 100644
index 00000000..da44797a
--- /dev/null
+++ b/tests/phpunit/includes/filerepo/FileBackendTest.php
@@ -0,0 +1,1358 @@
+<?php
+
+/**
+ * @group FileRepo
+ * @group FileBackend
+ */
+class FileBackendTest extends MediaWikiTestCase {
+ private $backend, $multiBackend;
+ private $filesToPrune = array();
+ private $dirsToPrune = array();
+ private static $backendToUse;
+
+ function setUp() {
+ global $wgFileBackends;
+ parent::setUp();
+ $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
+ if ( $this->getCliArg( 'use-filebackend=' ) ) {
+ if ( self::$backendToUse ) {
+ $this->singleBackend = self::$backendToUse;
+ } else {
+ $name = $this->getCliArg( 'use-filebackend=' );
+ $useConfig = array();
+ foreach ( $wgFileBackends as $conf ) {
+ if ( $conf['name'] == $name ) {
+ $useConfig = $conf;
+ }
+ }
+ $useConfig['name'] = 'localtesting'; // swap name
+ $class = $conf['class'];
+ self::$backendToUse = new $class( $useConfig );
+ $this->singleBackend = self::$backendToUse;
+ }
+ } else {
+ $this->singleBackend = new FSFileBackend( array(
+ 'name' => 'localtesting',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ 'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
+ 'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
+ ) );
+ }
+ $this->multiBackend = new FileBackendMultiWrite( array(
+ 'name' => 'localtesting',
+ 'lockManager' => 'fsLockManager',
+ 'backends' => array(
+ array(
+ 'name' => 'localmutlitesting1',
+ 'class' => 'FSFileBackend',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array(
+ 'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
+ 'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
+ 'isMultiMaster' => false
+ ),
+ array(
+ 'name' => 'localmutlitesting2',
+ 'class' => 'FSFileBackend',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array(
+ 'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
+ 'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
+ 'isMultiMaster' => true
+ )
+ )
+ ) );
+ $this->filesToPrune = array();
+ }
+
+ private function baseStorePath() {
+ return 'mwstore://localtesting';
+ }
+
+ private function backendClass() {
+ return get_class( $this->backend );
+ }
+
+ /**
+ * @dataProvider provider_testIsStoragePath
+ */
+ public function testIsStoragePath( $path, $isStorePath ) {
+ $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
+ "FileBackend::isStoragePath on path '$path'" );
+ }
+
+ function provider_testIsStoragePath() {
+ return array(
+ array( 'mwstore://', true ),
+ array( 'mwstore://backend', true ),
+ array( 'mwstore://backend/container', true ),
+ array( 'mwstore://backend/container/', true ),
+ array( 'mwstore://backend/container/path', true ),
+ array( 'mwstore://backend//container/', true ),
+ array( 'mwstore://backend//container//', true ),
+ array( 'mwstore://backend//container//path', true ),
+ array( 'mwstore:///', true ),
+ array( 'mwstore:/', false ),
+ array( 'mwstore:', false ),
+ );
+ }
+
+ /**
+ * @dataProvider provider_testSplitStoragePath
+ */
+ public function testSplitStoragePath( $path, $res ) {
+ $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
+ "FileBackend::splitStoragePath on path '$path'" );
+ }
+
+ function provider_testSplitStoragePath() {
+ return array(
+ array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
+ array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
+ array( 'mwstore://backend/container/path', array( 'backend', 'container', 'path' ) ),
+ array( 'mwstore://backend/container//path', array( 'backend', 'container', '/path' ) ),
+ array( 'mwstore://backend//container/path', array( null, null, null ) ),
+ array( 'mwstore://backend//container//path', array( null, null, null ) ),
+ array( 'mwstore://', array( null, null, null ) ),
+ array( 'mwstore://backend', array( null, null, null ) ),
+ array( 'mwstore:///', array( null, null, null ) ),
+ array( 'mwstore:/', array( null, null, null ) ),
+ array( 'mwstore:', array( null, null, null ) )
+ );
+ }
+
+ /**
+ * @dataProvider provider_normalizeStoragePath
+ */
+ public function testNormalizeStoragePath( $path, $res ) {
+ $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
+ "FileBackend::normalizeStoragePath on path '$path'" );
+ }
+
+ function provider_normalizeStoragePath() {
+ return array(
+ array( 'mwstore://backend/container', 'mwstore://backend/container' ),
+ array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
+ array( 'mwstore://backend/container/path', 'mwstore://backend/container/path' ),
+ array( 'mwstore://backend/container//path', 'mwstore://backend/container/path' ),
+ array( 'mwstore://backend/container///path', 'mwstore://backend/container/path' ),
+ array( 'mwstore://backend/container///path//to///obj', 'mwstore://backend/container/path/to/obj',
+ array( 'mwstore://', null ),
+ array( 'mwstore://backend', null ),
+ array( 'mwstore://backend//container/path', null ),
+ array( 'mwstore://backend//container//path', null ),
+ array( 'mwstore:///', null ),
+ array( 'mwstore:/', null ),
+ array( 'mwstore:', null ), )
+ );
+ }
+
+ /**
+ * @dataProvider provider_testParentStoragePath
+ */
+ public function testParentStoragePath( $path, $res ) {
+ $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
+ "FileBackend::parentStoragePath on path '$path'" );
+ }
+
+ 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' ),
+ array( 'mwstore://backend/container/path', 'mwstore://backend/container' ),
+ array( 'mwstore://backend/container', null ),
+ array( 'mwstore://backend/container/path/to/obj/', 'mwstore://backend/container/path/to' ),
+ array( 'mwstore://backend/container/path/to/', 'mwstore://backend/container/path' ),
+ array( 'mwstore://backend/container/path/', 'mwstore://backend/container' ),
+ array( 'mwstore://backend/container/', null ),
+ );
+ }
+
+ /**
+ * @dataProvider provider_testExtensionFromPath
+ */
+ public function testExtensionFromPath( $path, $res ) {
+ $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
+ "FileBackend::extensionFromPath on path '$path'" );
+ }
+
+ function provider_testExtensionFromPath() {
+ return array(
+ array( 'mwstore://backend/container/path.txt', 'txt' ),
+ array( 'mwstore://backend/container/path.svg.png', 'png' ),
+ array( 'mwstore://backend/container/path', '' ),
+ array( 'mwstore://backend/container/path.', '' ),
+ );
+ }
+
+ /**
+ * @dataProvider provider_testStore
+ */
+ public function testStore( $op ) {
+ $this->filesToPrune[] = $op['src'];
+
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestStore( $op );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestStore( $op );
+ $this->filesToPrune[] = $op['src']; # avoid file leaking
+ $this->tearDownFiles();
+ }
+
+ function doTestStore( $op ) {
+ $backendName = $this->backendClass();
+
+ $source = $op['src'];
+ $dest = $op['dst'];
+ $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+ file_put_contents( $source, "Unit test file" );
+
+ if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
+ $this->backend->store( $op );
+ }
+
+ $status = $this->backend->doOperation( $op );
+
+ $this->assertEquals( array(), $status->errors,
+ "Store from $source to $dest succeeded without warnings ($backendName)." );
+ $this->assertEquals( array(), $status->errors,
+ "Store from $source to $dest succeeded ($backendName)." );
+ $this->assertEquals( array( 0 => true ), $status->success,
+ "Store from $source to $dest has proper 'success' field in Status ($backendName)." );
+ $this->assertEquals( true, file_exists( $source ),
+ "Source file $source still exists ($backendName)." );
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+ "Destination file $dest exists ($backendName)." );
+
+ $this->assertEquals( filesize( $source ),
+ $this->backend->getFileSize( array( 'src' => $dest ) ),
+ "Destination file $dest has correct size ($backendName)." );
+
+ $props1 = FSFile::getPropsFromPath( $source );
+ $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
+ $this->assertEquals( $props1, $props2,
+ "Source and destination have the same props ($backendName)." );
+ }
+
+ public function provider_testStore() {
+ $cases = array();
+
+ $tmpName = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+ $toPath = $this->baseStorePath() . '/unittest-cont1/fun/obj1.txt';
+ $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
+ $cases[] = array(
+ $op, // operation
+ $tmpName, // source
+ $toPath, // dest
+ );
+
+ $op2 = $op;
+ $op2['overwrite'] = true;
+ $cases[] = array(
+ $op2, // operation
+ $tmpName, // source
+ $toPath, // dest
+ );
+
+ $op2 = $op;
+ $op2['overwriteSame'] = true;
+ $cases[] = array(
+ $op2, // operation
+ $tmpName, // source
+ $toPath, // dest
+ );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testCopy
+ */
+ public function testCopy( $op ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestCopy( $op );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestCopy( $op );
+ $this->tearDownFiles();
+ }
+
+ function doTestCopy( $op ) {
+ $backendName = $this->backendClass();
+
+ $source = $op['src'];
+ $dest = $op['dst'];
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+ $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $source succeeded ($backendName)." );
+
+ if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
+ $this->backend->copy( $op );
+ }
+
+ $status = $this->backend->doOperation( $op );
+
+ $this->assertEquals( array(), $status->errors,
+ "Copy from $source to $dest succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Copy from $source to $dest succeeded ($backendName)." );
+ $this->assertEquals( array( 0 => true ), $status->success,
+ "Copy from $source to $dest has proper 'success' field in Status ($backendName)." );
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $source ) ),
+ "Source file $source still exists ($backendName)." );
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+ "Destination file $dest exists after copy ($backendName)." );
+
+ $this->assertEquals(
+ $this->backend->getFileSize( array( 'src' => $source ) ),
+ $this->backend->getFileSize( array( 'src' => $dest ) ),
+ "Destination file $dest has correct size ($backendName)." );
+
+ $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
+ $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
+ $this->assertEquals( $props1, $props2,
+ "Source and destination have the same props ($backendName)." );
+ }
+
+ public function provider_testCopy() {
+ $cases = array();
+
+ $source = $this->baseStorePath() . '/unittest-cont1/file.txt';
+ $dest = $this->baseStorePath() . '/unittest-cont2/fileMoved.txt';
+
+ $op = array( 'op' => 'copy', 'src' => $source, 'dst' => $dest );
+ $cases[] = array(
+ $op, // operation
+ $source, // source
+ $dest, // dest
+ );
+
+ $op2 = $op;
+ $op2['overwrite'] = true;
+ $cases[] = array(
+ $op2, // operation
+ $source, // source
+ $dest, // dest
+ );
+
+ $op2 = $op;
+ $op2['overwriteSame'] = true;
+ $cases[] = array(
+ $op2, // operation
+ $source, // source
+ $dest, // dest
+ );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testMove
+ */
+ public function testMove( $op ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestMove( $op );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestMove( $op );
+ $this->tearDownFiles();
+ }
+
+ private function doTestMove( $op ) {
+ $backendName = $this->backendClass();
+
+ $source = $op['src'];
+ $dest = $op['dst'];
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+ $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $source succeeded ($backendName)." );
+
+ if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
+ $this->backend->copy( $op );
+ }
+
+ $status = $this->backend->doOperation( $op );
+ $this->assertEquals( array(), $status->errors,
+ "Move from $source to $dest succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Move from $source to $dest succeeded ($backendName)." );
+ $this->assertEquals( array( 0 => true ), $status->success,
+ "Move from $source to $dest has proper 'success' field in Status ($backendName)." );
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
+ "Source file $source does not still exists ($backendName)." );
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+ "Destination file $dest exists after move ($backendName)." );
+
+ $this->assertNotEquals(
+ $this->backend->getFileSize( array( 'src' => $source ) ),
+ $this->backend->getFileSize( array( 'src' => $dest ) ),
+ "Destination file $dest has correct size ($backendName)." );
+
+ $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
+ $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
+ $this->assertEquals( false, $props1['fileExists'],
+ "Source file does not exist accourding to props ($backendName)." );
+ $this->assertEquals( true, $props2['fileExists'],
+ "Destination file exists accourding to props ($backendName)." );
+ }
+
+ public function provider_testMove() {
+ $cases = array();
+
+ $source = $this->baseStorePath() . '/unittest-cont1/file.txt';
+ $dest = $this->baseStorePath() . '/unittest-cont2/fileMoved.txt';
+
+ $op = array( 'op' => 'move', 'src' => $source, 'dst' => $dest );
+ $cases[] = array(
+ $op, // operation
+ $source, // source
+ $dest, // dest
+ );
+
+ $op2 = $op;
+ $op2['overwrite'] = true;
+ $cases[] = array(
+ $op2, // operation
+ $source, // source
+ $dest, // dest
+ );
+
+ $op2 = $op;
+ $op2['overwriteSame'] = true;
+ $cases[] = array(
+ $op2, // operation
+ $source, // source
+ $dest, // dest
+ );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testDelete
+ */
+ public function testDelete( $op, $withSource, $okStatus ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestDelete( $op, $withSource, $okStatus );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestDelete( $op, $withSource, $okStatus );
+ $this->tearDownFiles();
+ }
+
+ private function doTestDelete( $op, $withSource, $okStatus ) {
+ $backendName = $this->backendClass();
+
+ $source = $op['src'];
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+
+ if ( $withSource ) {
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $source succeeded ($backendName)." );
+ }
+
+ $status = $this->backend->doOperation( $op );
+ if ( $okStatus ) {
+ $this->assertEquals( array(), $status->errors,
+ "Deletion of file at $source succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Deletion of file at $source succeeded ($backendName)." );
+ $this->assertEquals( array( 0 => true ), $status->success,
+ "Deletion of file at $source has proper 'success' field in Status ($backendName)." );
+ } else {
+ $this->assertEquals( false, $status->isOK(),
+ "Deletion of file at $source failed ($backendName)." );
+ }
+
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
+ "Source file $source does not exist after move ($backendName)." );
+
+ $this->assertFalse(
+ $this->backend->getFileSize( array( 'src' => $source ) ),
+ "Source file $source has correct size (false) ($backendName)." );
+
+ $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
+ $this->assertFalse( $props1['fileExists'],
+ "Source file $source does not exist according to props ($backendName)." );
+ }
+
+ public function provider_testDelete() {
+ $cases = array();
+
+ $source = $this->baseStorePath() . '/unittest-cont1/myfacefile.txt';
+
+ $op = array( 'op' => 'delete', 'src' => $source );
+ $cases[] = array(
+ $op, // operation
+ true, // with source
+ true // succeeds
+ );
+
+ $cases[] = array(
+ $op, // operation
+ false, // without source
+ false // fails
+ );
+
+ $op['ignoreMissingSource'] = true;
+ $cases[] = array(
+ $op, // operation
+ false, // without source
+ true // succeeds
+ );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testCreate
+ */
+ public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
+ $this->tearDownFiles();
+ }
+
+ private function doTestCreate( $op, $alreadyExists, $okStatus, $newSize ) {
+ $backendName = $this->backendClass();
+
+ $dest = $op['dst'];
+ $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+ $oldText = 'blah...blah...waahwaah';
+ if ( $alreadyExists ) {
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => $oldText, 'dst' => $dest ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $dest succeeded ($backendName)." );
+ }
+
+ $status = $this->backend->doOperation( $op );
+ if ( $okStatus ) {
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $dest succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Creation of file at $dest succeeded ($backendName)." );
+ $this->assertEquals( array( 0 => true ), $status->success,
+ "Creation of file at $dest has proper 'success' field in Status ($backendName)." );
+ } else {
+ $this->assertEquals( false, $status->isOK(),
+ "Creation of file at $dest failed ($backendName)." );
+ }
+
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+ "Destination file $dest exists after creation ($backendName)." );
+
+ $props1 = $this->backend->getFileProps( array( 'src' => $dest ) );
+ $this->assertEquals( true, $props1['fileExists'],
+ "Destination file $dest exists according to props ($backendName)." );
+ if ( $okStatus ) { // file content is what we saved
+ $this->assertEquals( $newSize, $props1['size'],
+ "Destination file $dest has expected size according to props ($backendName)." );
+ $this->assertEquals( $newSize,
+ $this->backend->getFileSize( array( 'src' => $dest ) ),
+ "Destination file $dest has correct size ($backendName)." );
+ } else { // file content is some other previous text
+ $this->assertEquals( strlen( $oldText ), $props1['size'],
+ "Destination file $dest has original size according to props ($backendName)." );
+ $this->assertEquals( strlen( $oldText ),
+ $this->backend->getFileSize( array( 'src' => $dest ) ),
+ "Destination file $dest has original size according to props ($backendName)." );
+ }
+ }
+
+ /**
+ * @dataProvider provider_testCreate
+ */
+ public function provider_testCreate() {
+ $cases = array();
+
+ $dest = $this->baseStorePath() . '/unittest-cont2/myspacefile.txt';
+
+ $op = array( 'op' => 'create', 'content' => 'test test testing', 'dst' => $dest );
+ $cases[] = array(
+ $op, // operation
+ false, // no dest already exists
+ true, // succeeds
+ strlen( $op['content'] )
+ );
+
+ $op2 = $op;
+ $op2['content'] = "\n";
+ $cases[] = array(
+ $op2, // operation
+ false, // no dest already exists
+ true, // succeeds
+ strlen( $op2['content'] )
+ );
+
+ $op2 = $op;
+ $op2['content'] = "fsf\n waf 3kt";
+ $cases[] = array(
+ $op2, // operation
+ true, // dest already exists
+ false, // fails
+ strlen( $op2['content'] )
+ );
+
+ $op2 = $op;
+ $op2['content'] = "egm'g gkpe gpqg eqwgwqg";
+ $op2['overwrite'] = true;
+ $cases[] = array(
+ $op2, // operation
+ true, // dest already exists
+ true, // succeeds
+ strlen( $op2['content'] )
+ );
+
+ $op2 = $op;
+ $op2['content'] = "39qjmg3-qg";
+ $op2['overwriteSame'] = true;
+ $cases[] = array(
+ $op2, // operation
+ true, // dest already exists
+ false, // succeeds
+ strlen( $op2['content'] )
+ );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testConcatenate
+ */
+ public function testConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
+ $this->filesToPrune[] = $op['dst'];
+
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+ $this->filesToPrune[] = $op['dst']; # avoid file leaking
+ $this->tearDownFiles();
+ }
+
+ public function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
+ $backendName = $this->backendClass();
+
+ $expContent = '';
+ // Create sources
+ $ops = array();
+ foreach ( $srcs as $i => $source ) {
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+ $ops[] = array(
+ 'op' => 'create', // operation
+ 'dst' => $source, // source
+ 'content' => $srcsContent[$i]
+ );
+ $expContent .= $srcsContent[$i];
+ }
+ $status = $this->backend->doOperations( $ops );
+
+ $this->assertEquals( array(), $status->errors,
+ "Creation of source files succeeded ($backendName)." );
+
+ $dest = $params['dst'];
+ if ( $alreadyExists ) {
+ $ok = file_put_contents( $dest, 'blah...blah...waahwaah' ) !== false;
+ $this->assertEquals( true, $ok,
+ "Creation of file at $dest succeeded ($backendName)." );
+ } else {
+ $ok = file_put_contents( $dest, '' ) !== false;
+ $this->assertEquals( true, $ok,
+ "Creation of 0-byte file at $dest succeeded ($backendName)." );
+ }
+
+ // Combine the files into one
+ $status = $this->backend->concatenate( $params );
+ if ( $okStatus ) {
+ $this->assertEquals( array(), $status->errors,
+ "Creation of concat file at $dest succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Creation of concat file at $dest succeeded ($backendName)." );
+ } else {
+ $this->assertEquals( false, $status->isOK(),
+ "Creation of concat file at $dest failed ($backendName)." );
+ }
+
+ if ( $okStatus ) {
+ $this->assertEquals( true, is_file( $dest ),
+ "Dest concat file $dest exists after creation ($backendName)." );
+ } else {
+ $this->assertEquals( true, is_file( $dest ),
+ "Dest concat file $dest exists after failed creation ($backendName)." );
+ }
+
+ $contents = file_get_contents( $dest );
+ $this->assertNotEquals( false, $contents, "File at $dest exists ($backendName)." );
+
+ if ( $okStatus ) {
+ $this->assertEquals( $expContent, $contents,
+ "Concat file at $dest has correct contents ($backendName)." );
+ } else {
+ $this->assertNotEquals( $expContent, $contents,
+ "Concat file at $dest has correct contents ($backendName)." );
+ }
+ }
+
+ function provider_testConcatenate() {
+ $cases = array();
+
+ $rand = mt_rand( 0, 2000000000 ) . time();
+ $dest = wfTempDir() . "/randomfile!$rand.txt";
+ $srcs = array(
+ $this->baseStorePath() . '/unittest-cont1/file1.txt',
+ $this->baseStorePath() . '/unittest-cont1/file2.txt',
+ $this->baseStorePath() . '/unittest-cont1/file3.txt',
+ $this->baseStorePath() . '/unittest-cont1/file4.txt',
+ $this->baseStorePath() . '/unittest-cont1/file5.txt',
+ $this->baseStorePath() . '/unittest-cont1/file6.txt',
+ $this->baseStorePath() . '/unittest-cont1/file7.txt',
+ $this->baseStorePath() . '/unittest-cont1/file8.txt',
+ $this->baseStorePath() . '/unittest-cont1/file9.txt',
+ $this->baseStorePath() . '/unittest-cont1/file10.txt'
+ );
+ $content = array(
+ 'egfage',
+ 'ageageag',
+ 'rhokohlr',
+ 'shgmslkg',
+ 'kenga',
+ 'owagmal',
+ 'kgmae',
+ 'g eak;g',
+ 'lkaem;a',
+ 'legma'
+ );
+ $params = array( 'srcs' => $srcs, 'dst' => $dest );
+
+ $cases[] = array(
+ $params, // operation
+ $srcs, // sources
+ $content, // content for each source
+ false, // no dest already exists
+ true, // succeeds
+ );
+
+ $cases[] = array(
+ $params, // operation
+ $srcs, // sources
+ $content, // content for each source
+ true, // dest already exists
+ false, // succeeds
+ );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testGetFileStat
+ */
+ public function testGetFileStat( $path, $content, $alreadyExists ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetFileStat( $path, $content, $alreadyExists );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetFileStat( $path, $content, $alreadyExists );
+ $this->tearDownFiles();
+ }
+
+ private function doTestGetFileStat( $path, $content, $alreadyExists ) {
+ $backendName = $this->backendClass();
+
+ if ( $alreadyExists ) {
+ $this->prepare( array( 'dir' => dirname( $path ) ) );
+ $status = $this->backend->create( array( 'dst' => $path, 'content' => $content ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $path succeeded ($backendName)." );
+
+ $size = $this->backend->getFileSize( array( 'src' => $path ) );
+ $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
+ $stat = $this->backend->getFileStat( array( 'src' => $path ) );
+
+ $this->assertEquals( strlen( $content ), $size,
+ "Correct file size of '$path'" );
+ $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 5,
+ "Correct file timestamp of '$path'" );
+
+ $size = $stat['size'];
+ $time = $stat['mtime'];
+ $this->assertEquals( strlen( $content ), $size,
+ "Correct file size of '$path'" );
+ $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 5,
+ "Correct file timestamp of '$path'" );
+ } else {
+ $size = $this->backend->getFileSize( array( 'src' => $path ) );
+ $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
+ $stat = $this->backend->getFileStat( array( 'src' => $path ) );
+
+ $this->assertFalse( $size, "Correct file size of '$path'" );
+ $this->assertFalse( $time, "Correct file timestamp of '$path'" );
+ $this->assertFalse( $stat, "Correct file stat of '$path'" );
+ }
+ }
+
+ function provider_testGetFileStat() {
+ $cases = array();
+
+ $base = $this->baseStorePath();
+ $cases[] = array( "$base/unittest-cont1/b/z/some_file.txt", "some file contents", true );
+ $cases[] = array( "$base/unittest-cont1/b/some-other_file.txt", "", true );
+ $cases[] = array( "$base/unittest-cont1/b/some-diff_file.txt", null, false );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testGetFileContents
+ */
+ public function testGetFileContents( $source, $content ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetFileContents( $source, $content );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetFileContents( $source, $content );
+ $this->tearDownFiles();
+ }
+
+ public function doTestGetFileContents( $source, $content ) {
+ $backendName = $this->backendClass();
+
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $source succeeded ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Creation of file at $source succeeded with OK status ($backendName)." );
+
+ $newContents = $this->backend->getFileContents( array( 'src' => $source, 'latest' => 1 ) );
+ $this->assertNotEquals( false, $newContents,
+ "Read of file at $source succeeded ($backendName)." );
+
+ $this->assertEquals( $content, $newContents,
+ "Contents read match data at $source ($backendName)." );
+ }
+
+ function provider_testGetFileContents() {
+ $cases = array();
+
+ $base = $this->baseStorePath();
+ $cases[] = array( "$base/unittest-cont1/b/z/some_file.txt", "some file contents" );
+ $cases[] = array( "$base/unittest-cont1/b/some-other_file.txt", "more file contents" );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testGetLocalCopy
+ */
+ public function testGetLocalCopy( $source, $content ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetLocalCopy( $source, $content );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetLocalCopy( $source, $content );
+ $this->tearDownFiles();
+ }
+
+ public function doTestGetLocalCopy( $source, $content ) {
+ $backendName = $this->backendClass();
+
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $source succeeded ($backendName)." );
+
+ $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
+ $this->assertNotNull( $tmpFile,
+ "Creation of local copy of $source succeeded ($backendName)." );
+
+ $contents = file_get_contents( $tmpFile->getPath() );
+ $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
+ }
+
+ function provider_testGetLocalCopy() {
+ $cases = array();
+
+ $base = $this->baseStorePath();
+ $cases[] = array( "$base/unittest-cont1/a/z/some_file.txt", "some file contents" );
+ $cases[] = array( "$base/unittest-cont1/a/some-other_file.txt", "more file contents" );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testGetLocalReference
+ */
+ public function testGetLocalReference( $source, $content ) {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetLocalReference( $source, $content );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetLocalReference( $source, $content );
+ $this->tearDownFiles();
+ }
+
+ private function doTestGetLocalReference( $source, $content ) {
+ $backendName = $this->backendClass();
+
+ $this->prepare( array( 'dir' => dirname( $source ) ) );
+
+ $status = $this->backend->doOperation(
+ array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of file at $source succeeded ($backendName)." );
+
+ $tmpFile = $this->backend->getLocalReference( array( 'src' => $source ) );
+ $this->assertNotNull( $tmpFile,
+ "Creation of local copy of $source succeeded ($backendName)." );
+
+ $contents = file_get_contents( $tmpFile->getPath() );
+ $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
+ }
+
+ function provider_testGetLocalReference() {
+ $cases = array();
+
+ $base = $this->baseStorePath();
+ $cases[] = array( "$base/unittest-cont1/a/z/some_file.txt", "some file contents" );
+ $cases[] = array( "$base/unittest-cont1/a/some-other_file.txt", "more file contents" );
+
+ return $cases;
+ }
+
+ /**
+ * @dataProvider provider_testPrepareAndClean
+ */
+ public function testPrepareAndClean( $path, $isOK ) {
+ $this->backend = $this->singleBackend;
+ $this->doTestPrepareAndClean( $path, $isOK );
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->doTestPrepareAndClean( $path, $isOK );
+ $this->tearDownFiles();
+ }
+
+ function provider_testPrepareAndClean() {
+ $base = $this->baseStorePath();
+ return array(
+ array( "$base/unittest-cont1/a/z/some_file1.txt", true ),
+ array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
+ # Specific to FS backend with no basePath field set
+ #array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
+ );
+ }
+
+ function doTestPrepareAndClean( $path, $isOK ) {
+ $backendName = $this->backendClass();
+
+ $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
+ if ( $isOK ) {
+ $this->assertEquals( array(), $status->errors,
+ "Preparing dir $path succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Preparing dir $path succeeded ($backendName)." );
+ } else {
+ $this->assertEquals( false, $status->isOK(),
+ "Preparing dir $path failed ($backendName)." );
+ }
+
+ $status = $this->backend->clean( array( 'dir' => dirname( $path ) ) );
+ if ( $isOK ) {
+ $this->assertEquals( array(), $status->errors,
+ "Cleaning dir $path succeeded without warnings ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Cleaning dir $path succeeded ($backendName)." );
+ } else {
+ $this->assertEquals( false, $status->isOK(),
+ "Cleaning dir $path failed ($backendName)." );
+ }
+ }
+
+ // @TODO: testSecure
+
+ public function testDoOperations() {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestDoOperations();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestDoOperations();
+ $this->tearDownFiles();
+
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestDoOperationsFailing();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestDoOperationsFailing();
+ $this->tearDownFiles();
+
+ // @TODO: test some cases where the ops should fail
+ }
+
+ function doTestDoOperations() {
+ $base = $this->baseStorePath();
+
+ $fileA = "$base/unittest-cont1/a/b/fileA.txt";
+ $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
+ $fileB = "$base/unittest-cont1/a/b/fileB.txt";
+ $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
+ $fileC = "$base/unittest-cont1/a/b/fileC.txt";
+ $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
+ $fileD = "$base/unittest-cont1/a/b/fileD.txt";
+
+ $this->prepare( array( 'dir' => dirname( $fileA ) ) );
+ $this->backend->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+ $this->prepare( array( 'dir' => dirname( $fileB ) ) );
+ $this->backend->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
+ $this->prepare( array( 'dir' => dirname( $fileC ) ) );
+ $this->backend->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+
+ $status = $this->backend->doOperations( array(
+ array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
+ array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<empty>
+ array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
+ // Now: A:<A>, B:<B>, C:<empty>, D:<A>
+ array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
+ // Now: A:<A>, B:<empty>, C:<B>, D:<A>
+ array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
+ // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
+ array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
+ // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
+ array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
+ // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
+ array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
+ // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
+ array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+ // Does nothing
+ array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+ // Does nothing
+ array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+ // Does nothing
+ array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+ // Does nothing
+ array( 'op' => 'null' ),
+ // Does nothing
+ ) );
+
+ $this->assertEquals( array(), $status->errors, "Operation batch succeeded" );
+ $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
+ $this->assertEquals( 13, count( $status->success ),
+ "Operation batch has correct success array" );
+
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
+ "File does not exist at $fileA" );
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
+ "File does not exist at $fileB" );
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
+ "File does not exist at $fileD" );
+
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
+ "File exists at $fileC" );
+ $this->assertEquals( $fileBContents,
+ $this->backend->getFileContents( array( 'src' => $fileC ) ),
+ "Correct file contents of $fileC" );
+ $this->assertEquals( strlen( $fileBContents ),
+ $this->backend->getFileSize( array( 'src' => $fileC ) ),
+ "Correct file size of $fileC" );
+ $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+ $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
+ "Correct file SHA-1 of $fileC" );
+ }
+
+ function doTestDoOperationsFailing() {
+ $base = $this->baseStorePath();
+
+ $fileA = "$base/unittest-cont2/a/b/fileA.txt";
+ $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
+ $fileB = "$base/unittest-cont2/a/b/fileB.txt";
+ $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
+ $fileC = "$base/unittest-cont2/a/b/fileC.txt";
+ $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
+ $fileD = "$base/unittest-cont2/a/b/fileD.txt";
+
+ $this->prepare( array( 'dir' => dirname( $fileA ) ) );
+ $this->backend->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+ $this->prepare( array( 'dir' => dirname( $fileB ) ) );
+ $this->backend->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
+ $this->prepare( array( 'dir' => dirname( $fileC ) ) );
+ $this->backend->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+
+ $status = $this->backend->doOperations( array(
+ array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
+ array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<empty>
+ array( 'op' => 'copy', 'src' => $fileB, 'dst' => $fileD, 'overwrite' => 1 ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<B>
+ array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
+ array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC, 'overwriteSame' => 1 ),
+ // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
+ array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileA, 'overwrite' => 1 ),
+ // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
+ array( 'op' => 'delete', 'src' => $fileD ),
+ // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
+ array( 'op' => 'null' ),
+ // Does nothing
+ ), array( 'force' => 1 ) );
+
+ $this->assertNotEquals( array(), $status->errors, "Operation had warnings" );
+ $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
+ $this->assertEquals( 8, count( $status->success ),
+ "Operation batch has correct success array" );
+
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
+ "File does not exist at $fileB" );
+ $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
+ "File does not exist at $fileD" );
+
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileA ) ),
+ "File does not exist at $fileA" );
+ $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
+ "File exists at $fileC" );
+ $this->assertEquals( $fileBContents,
+ $this->backend->getFileContents( array( 'src' => $fileA ) ),
+ "Correct file contents of $fileA" );
+ $this->assertEquals( strlen( $fileBContents ),
+ $this->backend->getFileSize( array( 'src' => $fileA ) ),
+ "Correct file size of $fileA" );
+ $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+ $this->backend->getFileSha1Base36( array( 'src' => $fileA ) ),
+ "Correct file SHA-1 of $fileA" );
+ }
+
+ public function testGetFileList() {
+ $this->backend = $this->singleBackend;
+ $this->tearDownFiles();
+ $this->doTestGetFileList();
+ $this->tearDownFiles();
+
+ $this->backend = $this->multiBackend;
+ $this->tearDownFiles();
+ $this->doTestGetFileList();
+ $this->tearDownFiles();
+ }
+
+ private function doTestGetFileList() {
+ $backendName = $this->backendClass();
+
+ $base = $this->baseStorePath();
+ $files = array(
+ "$base/unittest-cont1/test1.txt",
+ "$base/unittest-cont1/test2.txt",
+ "$base/unittest-cont1/test3.txt",
+ "$base/unittest-cont1/subdir1/test1.txt",
+ "$base/unittest-cont1/subdir1/test2.txt",
+ "$base/unittest-cont1/subdir2/test3.txt",
+ "$base/unittest-cont1/subdir2/test4.txt",
+ "$base/unittest-cont1/subdir2/subdir/test1.txt",
+ "$base/unittest-cont1/subdir2/subdir/test2.txt",
+ "$base/unittest-cont1/subdir2/subdir/test3.txt",
+ "$base/unittest-cont1/subdir2/subdir/test4.txt",
+ "$base/unittest-cont1/subdir2/subdir/test5.txt",
+ "$base/unittest-cont1/subdir2/subdir/sub/test0.txt",
+ "$base/unittest-cont1/subdir2/subdir/sub/120-px-file.txt",
+ );
+
+ // Add the files
+ $ops = array();
+ foreach ( $files as $file ) {
+ $this->prepare( array( 'dir' => dirname( $file ) ) );
+ $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
+ }
+ $status = $this->backend->doOperations( $ops );
+ $this->assertEquals( array(), $status->errors,
+ "Creation of files succeeded ($backendName)." );
+ $this->assertEquals( true, $status->isOK(),
+ "Creation of files succeeded with OK status ($backendName)." );
+
+ // Expected listing
+ $expected = array(
+ "test1.txt",
+ "test2.txt",
+ "test3.txt",
+ "subdir1/test1.txt",
+ "subdir1/test2.txt",
+ "subdir2/test3.txt",
+ "subdir2/test4.txt",
+ "subdir2/subdir/test1.txt",
+ "subdir2/subdir/test2.txt",
+ "subdir2/subdir/test3.txt",
+ "subdir2/subdir/test4.txt",
+ "subdir2/subdir/test5.txt",
+ "subdir2/subdir/sub/test0.txt",
+ "subdir2/subdir/sub/120-px-file.txt",
+ );
+ sort( $expected );
+
+ // Actual listing (no trailing slash)
+ $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)." );
+
+ // Actual listing (with trailing slash)
+ $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 = array(
+ "test1.txt",
+ "test2.txt",
+ "test3.txt",
+ "test4.txt",
+ "test5.txt",
+ "sub/test0.txt",
+ "sub/120-px-file.txt",
+ );
+ sort( $expected );
+
+ // Actual listing (no trailing slash)
+ $list = array();
+ $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) );
+ foreach ( $iter as $file ) {
+ $list[] = $file;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+
+ // Actual listing (with trailing slash)
+ $list = array();
+ $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/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;
+ }
+ sort( $list );
+
+ $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
+
+ foreach ( $files as $file ) { // clean up
+ $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
+ }
+
+ $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
+ foreach ( $iter as $iter ) {} // no errors
+ }
+
+ // test helper wrapper for backend prepare() function
+ private function prepare( array $params ) {
+ $this->dirsToPrune[] = $params['dir'];
+ return $this->backend->prepare( $params );
+ }
+
+ function tearDownFiles() {
+ foreach ( $this->filesToPrune as $file ) {
+ @unlink( $file );
+ }
+ $containers = array( 'unittest-cont1', 'unittest-cont2', 'unittest-cont3' );
+ foreach ( $containers as $container ) {
+ $this->deleteFiles( $container );
+ }
+ foreach ( $this->dirsToPrune as $dir ) {
+ $this->recursiveClean( $dir );
+ }
+ $this->filesToPrune = $this->dirsToPrune = array();
+ }
+
+ private function deleteFiles( $container ) {
+ $base = $this->baseStorePath();
+ $iter = $this->backend->getFileList( array( 'dir' => "$base/$container" ) );
+ if ( $iter ) {
+ foreach ( $iter as $file ) {
+ $this->backend->delete( array( 'src' => "$base/$container/$file" ), array( 'force' => 1 ) );
+ }
+ }
+ }
+
+ private function recursiveClean( $dir ) {
+ do {
+ if ( !$this->backend->clean( array( 'dir' => $dir ) )->isOK() ) {
+ break;
+ }
+ } while ( $dir = FileBackend::parentStoragePath( $dir ) );
+ }
+
+ function tearDown() {
+ parent::tearDown();
+ }
+}
diff --git a/tests/phpunit/includes/filerepo/FileRepoTest.php b/tests/phpunit/includes/filerepo/FileRepoTest.php
new file mode 100644
index 00000000..0f023138
--- /dev/null
+++ b/tests/phpunit/includes/filerepo/FileRepoTest.php
@@ -0,0 +1,41 @@
+<?php
+
+class FileRepoTest extends MediaWikiTestCase {
+
+ /**
+ * @expectedException MWException
+ */
+ function testFileRepoConstructionOptionCanNotBeNull() {
+ $f = new FileRepo();
+ }
+ /**
+ * @expectedException MWException
+ */
+ function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
+ $f = new FileRepo( array() );
+ }
+ /**
+ * @expectedException MWException
+ */
+ function testFileRepoConstructionOptionNeedNameKey() {
+ $f = new FileRepo( array(
+ 'backend' => 'foobar'
+ ) );
+ }
+ /**
+ * @expectedException MWException
+ */
+ function testFileRepoConstructionOptionNeedBackendKey() {
+ $f = new FileRepo( array(
+ 'name' => 'foobar'
+ ) );
+ }
+
+ function testFileRepoConstructionWithRequiredOptions() {
+ $f = new FileRepo( array(
+ 'name' => 'FileRepoTestRepository',
+ 'backend' => 'local-backend',
+ ));
+ $this->assertInstanceOf( 'FileRepo', $f );
+ }
+}
diff --git a/tests/phpunit/includes/filerepo/StoreBatchTest.php b/tests/phpunit/includes/filerepo/StoreBatchTest.php
new file mode 100644
index 00000000..6abceeb3
--- /dev/null
+++ b/tests/phpunit/includes/filerepo/StoreBatchTest.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * @group FileRepo
+ */
+class StoreBatchTest extends MediaWikiTestCase {
+
+ public function setUp() {
+ global $wgFileBackends;
+ parent::setUp();
+
+ # Forge a FSRepo object to not have to rely on local wiki settings
+ $tmpPrefix = wfTempDir() . '/storebatch-test-' . time() . '-' . mt_rand();
+ if ( $this->getCliArg( 'use-filebackend=' ) ) {
+ $name = $this->getCliArg( 'use-filebackend=' );
+ $useConfig = array();
+ foreach ( $wgFileBackends as $conf ) {
+ if ( $conf['name'] == $name ) {
+ $useConfig = $conf;
+ }
+ }
+ $useConfig['name'] = 'local-testing'; // swap name
+ $class = $useConfig['class'];
+ $backend = new $class( $useConfig );
+ } else {
+ $backend = new FSFileBackend( array(
+ 'name' => 'local-testing',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array(
+ 'unittests-public' => "{$tmpPrefix}-public",
+ 'unittests-thumb' => "{$tmpPrefix}-thumb",
+ 'unittests-temp' => "{$tmpPrefix}-temp",
+ 'unittests-deleted' => "{$tmpPrefix}-deleted",
+ )
+ ) );
+ }
+ $this->repo = new FileRepo( array(
+ 'name' => 'unittests',
+ 'backend' => $backend
+ ) );
+
+ $this->date = gmdate( "YmdHis" );
+ $this->createdFiles = array();
+ }
+
+ /**
+ * Store a file or virtual URL source into a media file name.
+ *
+ * @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().
+ */
+ private function storeit($originalName, $srcPath, $flags) {
+ $hashPath = $this->repo->getHashPath( $originalName );
+ $dstRel = "$hashPath{$this->date}!$originalName";
+ $dstUrlRel = $hashPath . $this->date . '!' . rawurlencode( $originalName );
+
+ $result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
+ $result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
+ $this->createdFiles[] = $result->value;
+ return $result;
+ }
+
+ /**
+ * Test storing a file using different flags.
+ *
+ * @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.
+ */
+ private function storecohort($fn, $infn, $otherfn, $fromrepo) {
+ $f = $this->storeit( $fn, $infn, 0 );
+ $this->assertTrue( $f->isOK(), 'failed to store a new file' );
+ $this->assertEquals( $f->failCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
+ $this->assertEquals( $f->successCount, 1 , "counts wrong {$f->successCount} {$f->failCount}" );
+ if ( $fromrepo ) {
+ $f = $this->storeit( "Other-$fn", $infn, FileRepo::OVERWRITE);
+ $infn = $f->value;
+ }
+ // This should work because we're allowed to overwrite
+ $f = $this->storeit( $fn, $infn, FileRepo::OVERWRITE );
+ $this->assertTrue( $f->isOK(), 'We should be allowed to overwrite' );
+ $this->assertEquals( $f->failCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
+ $this->assertEquals( $f->successCount, 1 , "counts wrong {$f->successCount} {$f->failCount}" );
+ // This should fail because we're overwriting.
+ $f = $this->storeit( $fn, $infn, 0 );
+ $this->assertFalse( $f->isOK(), 'We should not be allowed to overwrite' );
+ $this->assertEquals( $f->failCount, 1, "counts wrong {$f->successCount} {$f->failCount}" );
+ $this->assertEquals( $f->successCount, 0 , "counts wrong {$f->successCount} {$f->failCount}" );
+ // This should succeed because we're overwriting the same content.
+ $f = $this->storeit( $fn, $infn, FileRepo::OVERWRITE_SAME );
+ $this->assertTrue( $f->isOK(), 'We should be able to overwrite the same content' );
+ $this->assertEquals( $f->failCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
+ $this->assertEquals( $f->successCount, 1 , "counts wrong {$f->successCount} {$f->failCount}" );
+ // This should fail because we're overwriting different content.
+ if ( $fromrepo ) {
+ $f = $this->storeit( "Other-$fn", $otherfn, FileRepo::OVERWRITE);
+ $otherfn = $f->value;
+ }
+ $f = $this->storeit( $fn, $otherfn, FileRepo::OVERWRITE_SAME );
+ $this->assertFalse( $f->isOK(), 'We should not be allowed to overwrite different content' );
+ $this->assertEquals( $f->failCount, 1, "counts wrong {$f->successCount} {$f->failCount}" );
+ $this->assertEquals( $f->successCount, 0 , "counts wrong {$f->successCount} {$f->failCount}" );
+ }
+
+ public function teststore() {
+ global $IP;
+ $this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
+ $this->storecohort( "Test2.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", true );
+ }
+
+ public function tearDown() {
+ $this->repo->cleanupBatch( $this->createdFiles ); // delete files
+ foreach ( $this->createdFiles as $tmp ) { // delete dirs
+ $tmp = $this->repo->resolveVirtualUrl( $tmp );
+ while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
+ $this->repo->getBackend()->clean( array( 'dir' => $tmp ) );
+ }
+ }
+ parent::tearDown();
+ }
+}
diff --git a/tests/phpunit/includes/json/ServicesJsonTest.php b/tests/phpunit/includes/json/ServicesJsonTest.php
new file mode 100644
index 00000000..8f2421a2
--- /dev/null
+++ b/tests/phpunit/includes/json/ServicesJsonTest.php
@@ -0,0 +1,93 @@
+<?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/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
index aa05500e..d2bfeedf 100644
--- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
+++ b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
@@ -84,6 +84,13 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
// And also per spec unicode char escape values should work in identifiers,
// as long as it's a valid char. In future it might get normalized.
array( "var Ka\\u015dSkatolVal = {}", 'var Ka\\u015dSkatolVal={}'),
+
+ /* Some structures that might look invalid at first sight */
+ array( "var a = 5.;", "var a=5.;" ),
+ array( "5.0.toString();", "5.0.toString();" ),
+ array( "5..toString();", "5..toString();" ),
+ array( "5...toString();", false ),
+ array( "5.\n.toString();", '5..toString();' ),
);
}
@@ -102,4 +109,40 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
$this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
}
+
+ /**
+ * @dataProvider provideBug32548
+ */
+ 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.
+ $prefix = 'var longVarName' . str_repeat('_', 973) . '=';
+ $suffix = ',shortVarName=0;';
+
+ $input = $prefix . $num . $suffix;
+ $expected = $prefix . "\n" . $num . $suffix;
+
+ $minified = JavaScriptMinifier::minify( $input );
+
+ $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent");
+ }
+
+ function provideBug32548() {
+ return array(
+ array(
+ // This one gets interpreted all together by the prior code;
+ // no break at the 'E' happens.
+ '1.23456789E55',
+ ),
+ array(
+ // This one breaks under the bad code; splits between 'E' and '+'
+ '1.23456789E+5',
+ ),
+ array(
+ // This one breaks under the bad code; splits between 'E' and '-'
+ '1.23456789E-5',
+ ),
+ );
+ }
}
diff --git a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
index a0d5cd86..f4f52dd8 100644
--- a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
+++ b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
@@ -14,10 +14,15 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
* translation (to en) where XMP should win.
*/
public function testMultilingualCascade() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
+ if ( !wfDl( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
+ if ( !wfDl( 'xml' ) ) {
+ $this->markTestSkipped( "This test needs the xml extension." );
}
+ global $wgShowEXIF;
+ $oldExif = $wgShowEXIF;
+ $wgShowEXIF = true;
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'/Xmp-exif-multilingual_test.jpg' );
@@ -32,6 +37,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
'Did not extract any ImageDescription info?!' );
$this->assertEquals( $expected, $meta['ImageDescription'] );
+
+ $wgShowEXIF = $oldExif;
}
/**
@@ -49,6 +56,16 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
$meta['JPEGFileComment'][0] );
}
+ /**
+ * Make sure a bad iptc block doesn't stop the other metadata
+ * from being extracted.
+ */
+ public function testBadIPTC() {
+ $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
+ 'iptc-invalid-psir.jpg' );
+ $this->assertEquals( 'Created with GIMP', $meta['JPEGFileComment'][0] );
+ }
+
public function testIPTCDates() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'iptc-timetest.jpg' );
@@ -95,6 +112,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
}
public function testPNGXMP() {
+ if ( !wfDl( 'xml' ) ) {
+ $this->markTestSkipped( "This test needs the xml extension." );
+ }
$handler = new BitmapMetadataHandler();
$result = $handler->png( $this->filePath . 'xmp.png' );
$expected = array (
diff --git a/tests/phpunit/includes/media/BitmapScalingTest.php b/tests/phpunit/includes/media/BitmapScalingTest.php
index 5bcd3232..11d9dc47 100644
--- a/tests/phpunit/includes/media/BitmapScalingTest.php
+++ b/tests/phpunit/includes/media/BitmapScalingTest.php
@@ -3,13 +3,16 @@
class BitmapScalingTest extends MediaWikiTestCase {
function setUp() {
- global $wgMaxImageArea;
+ global $wgMaxImageArea, $wgCustomConvertCommand;
$this->oldMaxImageArea = $wgMaxImageArea;
+ $this->oldCustomConvertCommand = $wgCustomConvertCommand;
$wgMaxImageArea = 1.25e7; // 3500x3500
+ $wgCustomConvertCommand = 'dummy'; // Set so that we don't get client side rendering
}
function tearDown() {
- global $wgMaxImageArea;
+ global $wgMaxImageArea, $wgCustomConvertCommand;
$wgMaxImageArea = $this->oldMaxImageArea;
+ $wgCustomConvertCommand = $this->oldCustomConvertCommand;
}
/**
* @dataProvider provideNormaliseParams
@@ -105,14 +108,22 @@ class BitmapScalingTest extends MediaWikiTestCase {
$file = new FakeDimensionFile( array( 4000, 4000 ) );
$handler = new BitmapHandler;
$params = array( 'width' => '3700' ); // Still bigger than max size.
- $this->assertFalse( $handler->normaliseParams( $file, $params ) );
+ $this->assertEquals( 'TransformParameterError',
+ get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
}
function testTooBigMustRenderImage() {
$file = new FakeDimensionFile( array( 4000, 4000 ) );
$file->mustRender = true;
$handler = new BitmapHandler;
$params = array( 'width' => '5000' ); // Still bigger than max size.
- $this->assertFalse( $handler->normaliseParams( $file, $params ) );
+ $this->assertEquals( 'TransformParameterError',
+ get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
+ }
+
+ function testImageArea() {
+ $file = new FakeDimensionFile( array( 7, 9 ) );
+ $handler = new BitmapHandler;
+ $this->assertEquals( 63, $handler->getImageArea( $file ) );
}
}
@@ -120,7 +131,8 @@ class FakeDimensionFile extends File {
public $mustRender = false;
public function __construct( $dimensions ) {
- parent::__construct( Title::makeTitle( NS_FILE, 'Test' ), null );
+ parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
+ new NullRepo( null ) );
$this->dimensions = $dimensions;
}
@@ -133,4 +145,7 @@ class FakeDimensionFile extends File {
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 4282d3c8..b2f6b7ba 100644
--- a/tests/phpunit/includes/media/ExifBitmapTest.php
+++ b/tests/phpunit/includes/media/ExifBitmapTest.php
@@ -1,4 +1,5 @@
<?php
+
class ExifBitmapTest extends MediaWikiTestCase {
public function setUp() {
@@ -17,42 +18,23 @@ class ExifBitmapTest extends MediaWikiTestCase {
}
public function testIsOldBroken() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$res = $this->handler->isMetadataValid( null, ExifBitmapHandler::OLD_BROKEN_FILE );
$this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
}
public function testIsBrokenFile() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$res = $this->handler->isMetadataValid( null, ExifBitmapHandler::BROKEN_FILE );
$this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
}
public function testIsInvalid() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$res = $this->handler->isMetadataValid( null, 'Something Invalid Here.' );
$this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
}
public function testGoodMetadata() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$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 );
}
public function testIsOldGood() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$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 );
@@ -60,10 +42,6 @@ class ExifBitmapTest extends MediaWikiTestCase {
// Handle metadata from paged tiff handler (gotten via instant commons)
// gracefully.
public function testPagedTiffHandledGracefully() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$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 );
diff --git a/tests/phpunit/includes/media/ExifRotationTest.php b/tests/phpunit/includes/media/ExifRotationTest.php
index 639091d0..25149a05 100644
--- a/tests/phpunit/includes/media/ExifRotationTest.php
+++ b/tests/phpunit/includes/media/ExifRotationTest.php
@@ -5,15 +5,26 @@
*/
class ExifRotationTest extends MediaWikiTestCase {
+ /** track directories creations. Content will be deleted. */
+ private $createdDirs = array();
+
function setUp() {
parent::setUp();
- $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
$this->handler = new BitmapHandler();
- $this->repo = new FSRepo(array(
- 'name' => 'temp',
- 'directory' => wfTempDir() . '/exif-test-' . time() . '-' . mt_rand(),
- 'url' => 'http://localhost/thumbtest'
- ));
+ $filePath = dirname( __FILE__ ) . '/../../data/media';
+
+ $tmpDir = wfTempDir() . '/exif-test-' . time() . '-' . mt_rand();
+ $this->createdDirs[] = $tmpDir;
+
+ $this->repo = new FSRepo( array(
+ 'name' => 'temp',
+ 'url' => 'http://localhost/thumbtest',
+ 'backend' => new FSFileBackend( array(
+ 'name' => 'localtesting',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array( 'temp-thumb' => $tmpDir, 'data' => $filePath )
+ ) )
+ ) );
if ( !wfDl( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
@@ -25,10 +36,23 @@ class ExifRotationTest extends MediaWikiTestCase {
$this->oldAuto = $wgEnableAutoRotation;
$wgEnableAutoRotation = true;
}
+
public function tearDown() {
global $wgShowEXIF, $wgEnableAutoRotation;
$wgShowEXIF = $this->show;
$wgEnableAutoRotation = $this->oldAuto;
+
+ $this->tearDownFiles();
+ }
+
+ private function tearDownFiles() {
+ foreach( $this->createdDirs as $dir ) {
+ wfRecursiveRemoveDir( $dir );
+ }
+ }
+
+ function __destruct() {
+ $this->tearDownFiles();
}
/**
@@ -39,7 +63,7 @@ class ExifRotationTest extends MediaWikiTestCase {
if ( !BitmapHandler::canRotate() ) {
$this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
}
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $name, $type );
+ $file = $this->dataFile( $name, $type );
$this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
$this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
}
@@ -66,13 +90,13 @@ class ExifRotationTest extends MediaWikiTestCase {
throw new MWException('bogus test data format ' . $size);
}
- $file = $this->localFile( $name, $type );
- $thumb = $file->transform( $params, File::RENDER_NOW );
+ $file = $this->dataFile( $name, $type );
+ $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
$this->assertEquals( $out[0], $thumb->getWidth(), "$name: thumb reported width check for $size" );
$this->assertEquals( $out[1], $thumb->getHeight(), "$name: thumb reported height check for $size" );
- $gis = getimagesize( $thumb->getPath() );
+ $gis = getimagesize( $thumb->getLocalCopyPath() );
if ($out[0] > $info['width']) {
// Physical image won't be scaled bigger than the original.
$this->assertEquals( $info['width'], $gis[0], "$name: thumb actual width check for $size");
@@ -84,8 +108,9 @@ class ExifRotationTest extends MediaWikiTestCase {
}
}
- private function localFile( $name, $type ) {
- return new UnregisteredLocalFile( false, $this->repo, $this->filePath . $name, $type );
+ private function dataFile( $name, $type ) {
+ return new UnregisteredLocalFile( false, $this->repo,
+ "mwstore://localtesting/data/$name", $type );
}
function providerFiles() {
@@ -129,7 +154,7 @@ class ExifRotationTest extends MediaWikiTestCase {
global $wgEnableAutoRotation;
$wgEnableAutoRotation = false;
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $name, $type );
+ $file = $this->dataFile( $name, $type );
$this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
$this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
@@ -158,13 +183,13 @@ class ExifRotationTest extends MediaWikiTestCase {
throw new MWException('bogus test data format ' . $size);
}
- $file = $this->localFile( $name, $type );
- $thumb = $file->transform( $params, File::RENDER_NOW );
+ $file = $this->dataFile( $name, $type );
+ $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
$this->assertEquals( $out[0], $thumb->getWidth(), "$name: thumb reported width check for $size" );
$this->assertEquals( $out[1], $thumb->getHeight(), "$name: thumb reported height check for $size" );
- $gis = getimagesize( $thumb->getPath() );
+ $gis = getimagesize( $thumb->getLocalCopyPath() );
if ($out[0] > $info['width']) {
// Physical image won't be scaled bigger than the original.
$this->assertEquals( $info['width'], $gis[0], "$name: thumb actual width check for $size");
@@ -242,7 +267,7 @@ class ExifRotationTest extends MediaWikiTestCase {
array(
270,
array( self::TEST_HEIGHT, self::TEST_WIDTH )
- ),
+ ),
);
}
}
diff --git a/tests/phpunit/includes/media/ExifTest.php b/tests/phpunit/includes/media/ExifTest.php
index 9b490e92..b39c15e4 100644
--- a/tests/phpunit/includes/media/ExifTest.php
+++ b/tests/phpunit/includes/media/ExifTest.php
@@ -4,6 +4,9 @@ class ExifTest extends MediaWikiTestCase {
public function setUp() {
$this->mediaPath = dirname( __FILE__ ) . '/../../data/media/';
+ if ( !wfDl( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
global $wgShowEXIF;
$this->showExif = $wgShowEXIF;
$wgShowEXIF = true;
@@ -14,9 +17,6 @@ class ExifTest extends MediaWikiTestCase {
}
public function testGPSExtraction() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$filename = $this->mediaPath . 'exif-gps.jpg';
$seg = JpegMetadataExtractor::segmentSplitter( $filename );
@@ -32,9 +32,6 @@ class ExifTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $data, '', 0.0000000001 );
}
public function testUnicodeUserComment() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$filename = $this->mediaPath . 'exif-user-comment.jpg';
$seg = JpegMetadataExtractor::segmentSplitter( $filename );
diff --git a/tests/phpunit/includes/media/FormatMetadataTest.php b/tests/phpunit/includes/media/FormatMetadataTest.php
index db36dea3..8a632f52 100644
--- a/tests/phpunit/includes/media/FormatMetadataTest.php
+++ b/tests/phpunit/includes/media/FormatMetadataTest.php
@@ -1,13 +1,31 @@
<?php
class FormatMetadataTest extends MediaWikiTestCase {
- public function testInvalidDate() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
+ public function setUp() {
+ if ( !wfDl( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
}
-
- $file = UnregisteredLocalFile::newFromPath( dirname( __FILE__ ) .
- '/../../data/media/broken_exif_date.jpg', 'image/jpeg' );
+ $filePath = dirname( __FILE__ ) . '/../../data/media';
+ $this->backend = new FSFileBackend( array(
+ 'name' => 'localtesting',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array( 'data' => $filePath )
+ ) );
+ $this->repo = new FSRepo( array(
+ 'name' => 'temp',
+ 'url' => 'http://localhost/thumbtest',
+ 'backend' => $this->backend
+ ) );
+ global $wgShowEXIF;
+ $this->show = $wgShowEXIF;
+ $wgShowEXIF = true;
+ }
+ public function tearDown() {
+ global $wgShowEXIF;
+ $wgShowEXIF = $this->show;
+ }
+
+ public function testInvalidDate() {
+ $file = $this->dataFile( 'broken_exif_date.jpg', 'image/jpeg' );
// Throws an error if bug hit
$meta = $file->formatMetadata();
@@ -26,4 +44,9 @@ class FormatMetadataTest extends MediaWikiTestCase {
$meta['visible'][$dateIndex]['value'],
'File with invalid date metadata (bug 29471)' );
}
-} \ No newline at end of file
+
+ private function dataFile( $name, $type ) {
+ return new UnregisteredLocalFile( false, $this->repo,
+ "mwstore://localtesting/data/$name", $type );
+ }
+}
diff --git a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
index 59b30441..47fc368b 100644
--- a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
@@ -63,6 +63,7 @@ class GIFMetadataExtractorTest extends MediaWikiTestCase {
<?xpacket end='w'?>
EOF;
+ $xmpNugget = str_replace( "\r", '', $xmpNugget ); // Windows compat
return array(
array( 'nonanimated.gif', array(
diff --git a/tests/phpunit/includes/media/GIFTest.php b/tests/phpunit/includes/media/GIFTest.php
index 42c25ca5..36658358 100644
--- a/tests/phpunit/includes/media/GIFTest.php
+++ b/tests/phpunit/includes/media/GIFTest.php
@@ -2,12 +2,22 @@
class GIFHandlerTest extends MediaWikiTestCase {
public function setUp() {
- $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+ $this->filePath = dirname( __FILE__ ) . '/../../data/media';
+ $this->backend = new FSFileBackend( array(
+ 'name' => 'localtesting',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array( 'data' => $this->filePath )
+ ) );
+ $this->repo = new FSRepo( array(
+ 'name' => 'temp',
+ 'url' => 'http://localhost/thumbtest',
+ 'backend' => $this->backend
+ ) );
$this->handler = new GIFHandler();
}
public function testInvalidFile() {
- $res = $this->handler->getMetadata( null, $this->filePath . 'README' );
+ $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
$this->assertEquals( GIFHandler::BROKEN_FILE, $res );
}
/**
@@ -16,8 +26,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @dataProvider dataIsAnimated
*/
public function testIsAnimanted( $filename, $expected ) {
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $filename,
- 'image/gif' );
+ $file = $this->dataFile( $filename, 'image/gif' );
$actual = $this->handler->isAnimatedImage( $file );
$this->assertEquals( $expected, $actual );
}
@@ -34,8 +43,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @dataProvider dataGetImageArea
*/
public function testGetImageArea( $filename, $expected ) {
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $filename,
- 'image/gif' );
+ $file = $this->dataFile( $filename, 'image/gif' );
$actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
$this->assertEquals( $expected, $actual );
}
@@ -71,15 +79,20 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @dataProvider dataGetMetadata
*/
public function testGetMetadata( $filename, $expected ) {
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $filename,
- 'image/gif' );
- $actual = $this->handler->getMetadata( $file, $this->filePath . $filename );
+ $file = $this->dataFile( $filename, 'image/gif' );
+ $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
$this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
}
+
public function dataGetMetadata() {
return array(
array( 'nonanimated.gif', 'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file â• Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
array( 'animated-xmp.gif', 'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
);
}
+
+ private function dataFile( $name, $type ) {
+ return new UnregisteredLocalFile( false, $this->repo,
+ "mwstore://localtesting/data/$name", $type );
+ }
}
diff --git a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
index 61fc9c81..f48382a4 100644
--- a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* @todo Could use a test of extended XMP segments. Hard to find programs that
* create example files, and creating my own in vim propbably wouldn't
* serve as a very good "test". (Adobe photoshop probably creates such files
@@ -59,7 +59,7 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
public function testPSIRExtraction() {
$res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
$expected = '50686f746f73686f7020332e30003842494d04040000000000181c02190004746573741c02190003666f6f1c020000020004';
- $this->assertEquals( $expected, bin2hex( $res['PSIR'] ) );
+ $this->assertEquals( $expected, bin2hex( $res['PSIR'][0] ) );
}
public function testXMPExtractionAltAppId() {
$res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-alt.jpg' );
@@ -70,19 +70,19 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
public function testIPTCHashComparisionNoHash() {
$segments = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
- $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'] );
+ $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'][0] );
$this->assertEquals( 'iptc-no-hash', $res );
}
public function testIPTCHashComparisionBadHash() {
$segments = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-iptc-bad-hash.jpg' );
- $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'] );
+ $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'][0] );
$this->assertEquals( 'iptc-bad-hash', $res );
}
public function testIPTCHashComparisionGoodHash() {
$segments = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-iptc-good-hash.jpg' );
- $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'] );
+ $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'][0] );
$this->assertEquals( 'iptc-good-hash', $res );
}
diff --git a/tests/phpunit/includes/media/JpegTest.php b/tests/phpunit/includes/media/JpegTest.php
index 713a3410..ddabf5b8 100644
--- a/tests/phpunit/includes/media/JpegTest.php
+++ b/tests/phpunit/includes/media/JpegTest.php
@@ -3,22 +3,24 @@ class JpegTest extends MediaWikiTestCase {
public function setUp() {
$this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+ if ( !wfDl( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
+ global $wgShowEXIF;
+ $this->show = $wgShowEXIF;
+ $wgShowEXIF = true;
+ }
+ public function tearDown() {
+ global $wgShowEXIF;
+ $wgShowEXIF = $this->show;
}
public function testInvalidFile() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$jpeg = new JpegHandler;
$res = $jpeg->getMetadata( null, $this->filePath . 'README' );
$this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
}
public function testJpegMetadataExtraction() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$h = new JpegHandler;
$res = $h->getMetadata( null, $this->filePath . 'test.jpg' );
$expected = 'a:7:{s:16:"ImageDescription";s:9:"Test file";s:11:"XResolution";s:4:"72/1";s:11:"YResolution";s:4:"72/1";s:14:"ResolutionUnit";i:2;s:16:"YCbCrPositioning";i:1;s:15:"JPEGFileComment";a:1:{i:0;s:17:"Created with GIMP";}s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
diff --git a/tests/phpunit/includes/ImageFunctionsTest.php b/tests/phpunit/includes/media/MediaHandlerTest.php
index cb7e67f3..99df4f80 100644
--- a/tests/phpunit/includes/ImageFunctionsTest.php
+++ b/tests/phpunit/includes/media/MediaHandlerTest.php
@@ -1,6 +1,6 @@
<?php
-class ImageFunctionsTest extends MediaWikiTestCase {
+class MediaHandlerTest extends MediaWikiTestCase {
function testFitBoxWidth() {
$vals = array(
array(
@@ -32,10 +32,12 @@ class ImageFunctionsTest extends MediaWikiTestCase {
17 => 4,
18 => 4 ) ) );
foreach ( $vals as $row ) {
- extract( $row );
+ $tests = $row['tests'];
+ $height = $row['height'];
+ $width = $row['width'];
foreach ( $tests as $max => $expected ) {
$y = round( $expected * $height / $width );
- $result = wfFitBoxWidth( $width, $height, $max );
+ $result = MediaHandler::fitBoxWidth( $width, $height, $max );
$y2 = round( $result * $height / $width );
$this->assertEquals( $expected,
$result,
diff --git a/tests/phpunit/includes/media/PNGTest.php b/tests/phpunit/includes/media/PNGTest.php
index b782918c..b6f911fd 100644
--- a/tests/phpunit/includes/media/PNGTest.php
+++ b/tests/phpunit/includes/media/PNGTest.php
@@ -2,12 +2,22 @@
class PNGHandlerTest extends MediaWikiTestCase {
public function setUp() {
- $this->filePath = dirname( __FILE__ ) . '/../../data/media/';
+ $this->filePath = dirname( __FILE__ ) . '/../../data/media';
+ $this->backend = new FSFileBackend( array(
+ 'name' => 'localtesting',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array( 'data' => $this->filePath )
+ ) );
+ $this->repo = new FSRepo( array(
+ 'name' => 'temp',
+ 'url' => 'http://localhost/thumbtest',
+ 'backend' => $this->backend
+ ) );
$this->handler = new PNGHandler();
}
public function testInvalidFile() {
- $res = $this->handler->getMetadata( null, $this->filePath . 'README' );
+ $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
$this->assertEquals( PNGHandler::BROKEN_FILE, $res );
}
/**
@@ -16,8 +26,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @dataProvider dataIsAnimated
*/
public function testIsAnimanted( $filename, $expected ) {
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $filename,
- 'image/png' );
+ $file = $this->dataFile( $filename, 'image/png' );
$actual = $this->handler->isAnimatedImage( $file );
$this->assertEquals( $expected, $actual );
}
@@ -34,8 +43,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @dataProvider dataGetImageArea
*/
public function testGetImageArea( $filename, $expected ) {
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $filename,
- 'image/png' );
+ $file = $this->dataFile($filename, 'image/png' );
$actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
$this->assertEquals( $expected, $actual );
}
@@ -73,9 +81,8 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @dataProvider dataGetMetadata
*/
public function testGetMetadata( $filename, $expected ) {
- $file = UnregisteredLocalFile::newFromPath( $this->filePath . $filename,
- 'image/png' );
- $actual = $this->handler->getMetadata( $file, $this->filePath . $filename );
+ $file = $this->dataFile( $filename, 'image/png' );
+ $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
// $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
$this->assertEquals( ( $expected ), ( $actual ) );
}
@@ -85,4 +92,9 @@ class PNGHandlerTest extends MediaWikiTestCase {
array( 'xmp.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}' ),
);
}
+
+ private function dataFile( $name, $type ) {
+ return new UnregisteredLocalFile( false, $this->repo,
+ "mwstore://localtesting/data/$name", $type );
+ }
}
diff --git a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
index c2c81b98..526beae8 100644
--- a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
@@ -62,23 +62,33 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
'height' => 60
)
),
+ array(
+ "$base/Toll_Texas_1.svg",
+ // This file triggered bug 31719, needs entity expansion in the xmlns checks
+ array(
+ 'width' => 385,
+ 'height' => 385
+ )
+ )
);
}
function providerSvgFilesWithXMLMetadata() {
$base = dirname( __FILE__ ) . '/../../data/media';
- return array(
- array(
- "$base/US_states_by_total_state_tax_revenue.svg",
- array(
- 'height' => 593,
- 'metadata' =>
+ $metadata =
'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<ns4:Work xmlns:ns4="http://creativecommons.org/ns#" rdf:about="">
<ns5:format xmlns:ns5="http://purl.org/dc/elements/1.1/">image/svg+xml</ns5:format>
<ns5:type xmlns:ns5="http://purl.org/dc/elements/1.1/" rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
</ns4:Work>
- </rdf:RDF>',
+ </rdf:RDF>';
+ $metadata = str_replace( "\r", '', $metadata ); // Windows compat
+ return array(
+ array(
+ "$base/US_states_by_total_state_tax_revenue.svg",
+ array(
+ 'height' => 593,
+ 'metadata' => $metadata,
'width' => 959
)
),
diff --git a/tests/phpunit/includes/media/TiffTest.php b/tests/phpunit/includes/media/TiffTest.php
index 0a7e8e8c..d4cf503b 100644
--- a/tests/phpunit/includes/media/TiffTest.php
+++ b/tests/phpunit/includes/media/TiffTest.php
@@ -15,16 +15,15 @@ class TiffTest extends MediaWikiTestCase {
}
public function testInvalidFile() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
+ 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 );
}
+
public function testTiffMetadataExtraction() {
- global $wgShowEXIF;
- if ( !$wgShowEXIF ) {
+ if ( !wfDl( 'exif' ) ) {
$this->markTestIncomplete( "This test needs the exif extension." );
}
$res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
diff --git a/tests/phpunit/includes/media/XMPTest.php b/tests/phpunit/includes/media/XMPTest.php
index d1ec4767..c952b23c 100644
--- a/tests/phpunit/includes/media/XMPTest.php
+++ b/tests/phpunit/includes/media/XMPTest.php
@@ -1,6 +1,12 @@
<?php
class XMPTest extends MediaWikiTestCase {
+ function setUp() {
+ if ( !wfDl( 'xml' ) ) {
+ $this->markTestSkipped( 'Requires libxml to do XMP parsing' );
+ }
+ }
+
/**
* Put XMP in, compare what comes out...
*
@@ -11,9 +17,6 @@ class XMPTest extends MediaWikiTestCase {
* @dataProvider dataXMPParse
*/
public function testXMPParse( $xmp, $expected, $info ) {
- if ( !function_exists( 'xml_parser_create_ns' ) ) {
- $this->markIncomplete( 'Requires libxml to do XMP parsing' );
- }
if ( !is_string( $xmp ) || !is_array( $expected ) ) {
throw new Exception( "Invalid data provided to " . __METHOD__ );
}
diff --git a/tests/phpunit/includes/media/XMPValidateTest.php b/tests/phpunit/includes/media/XMPValidateTest.php
new file mode 100644
index 00000000..e2bb8d8d
--- /dev/null
+++ b/tests/phpunit/includes/media/XMPValidateTest.php
@@ -0,0 +1,47 @@
+<?php
+class XMPValidateTest extends MediaWikiTestCase {
+
+ /**
+ * @dataProvider providerDate
+ */
+ function testValidateDate( $value, $expected ) {
+ // The method should modify $value.
+ XMPValidate::validateDate( array(), $value, true );
+ $this->assertEquals( $expected, $value );
+ }
+
+ function providerDate() {
+ /* For reference valid date formats are:
+ * YYYY
+ * YYYY-MM
+ * YYYY-MM-DD
+ * YYYY-MM-DDThh:mmTZD
+ * YYYY-MM-DDThh:mm:ssTZD
+ * YYYY-MM-DDThh:mm:ss.sTZD
+ * (Time zone is optional)
+ */
+ return array(
+ array( '1992', '1992' ),
+ array( '1992-04', '1992:04' ),
+ array( '1992-02-01', '1992:02:01' ),
+ array( '2011-09-29', '2011:09:29' ),
+ array( '1982-12-15T20:12', '1982:12:15 20:12' ),
+ array( '1982-12-15T20:12Z', '1982:12:15 20:12' ),
+ array( '1982-12-15T20:12+02:30', '1982:12:15 22:42' ),
+ array( '1982-12-15T01:12-02:30', '1982:12:14 22:42' ),
+ array( '1982-12-15T20:12:11', '1982:12:15 20:12:11' ),
+ array( '1982-12-15T20:12:11Z', '1982:12:15 20:12:11' ),
+ array( '1982-12-15T20:12:11+01:10', '1982:12:15 21:22:11' ),
+ array( '2045-12-15T20:12:11', '2045:12:15 20:12:11' ),
+ array( '1867-06-01T15:00:00', '1867:06:01 15:00:00' ),
+ /* some invalid ones */
+ array( '2001--12', null ),
+ array( '2001-5-12', null ),
+ array( '2001-5-12TZ', null ),
+ array( '2001-05-12T15', null ),
+ array( '2001-12T15:13', null ),
+ );
+
+ }
+
+}
diff --git a/tests/phpunit/includes/parser/MagicVariableTest.php b/tests/phpunit/includes/parser/MagicVariableTest.php
index a47653e3..31645313 100644
--- a/tests/phpunit/includes/parser/MagicVariableTest.php
+++ b/tests/phpunit/includes/parser/MagicVariableTest.php
@@ -6,8 +6,8 @@
* As of february 2011, it only tests some revisions and date related
* magic variables.
*
- * @author Ashar Voultoiz
- * @copyright Copyright © 2011, Ashar Voultoiz
+ * @author Antoine Musso
+ * @copyright Copyright © 2011, Antoine Musso
* @file
*/
@@ -38,6 +38,12 @@ class MagicVariableTest extends MediaWikiTestCase {
# initialize parser output
$this->testParser->clearState();
+
+ # Needs a title to do magic word stuff
+ $title = Title::newFromText( 'Tests' );
+ $title->mRedirect = false; # Else it needs a db connection just to check if it's a redirect (when deciding the page language)
+
+ $this->testParser->setTitle( $title );
}
/** destroy parser (TODO: is it really neded?)*/
diff --git a/tests/phpunit/includes/parser/MediaWikiParserTest.php b/tests/phpunit/includes/parser/MediaWikiParserTest.php
index 18510d9a..816c017a 100644
--- a/tests/phpunit/includes/parser/MediaWikiParserTest.php
+++ b/tests/phpunit/includes/parser/MediaWikiParserTest.php
@@ -1,10 +1,8 @@
<?php
-
-require_once( dirname( __FILE__ ) . '/ParserHelpers.php' );
require_once( dirname( __FILE__ ) . '/NewParserTest.php' );
/**
- * The UnitTest must be either a class that inherits from PHPUnit_Framework_TestCase
+ * The UnitTest must be either a class that inherits from MediaWikiTestCase
* or a class that provides a public static suite() method which returns
* an PHPUnit_Framework_Test object
*
@@ -20,9 +18,13 @@ class MediaWikiParserTest {
foreach ( $wgParserTestFiles as $filename ) {
$testsName = basename( $filename, '.txt' );
- $className = /*ucfirst( basename( dirname( $filename ) ) ) .*/ ucfirst( basename( $filename, '.txt' ) );
+ /* 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( basename( $filename, '.txt' ) ) );
- eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = \"" . addslashes( $filename ) . "\"; } " );
+ eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
$parserTester = new $className( $testsName );
$suite->addTestSuite( new ReflectionClass ( $parserTester ) );
diff --git a/tests/phpunit/includes/parser/NewParserTest.php b/tests/phpunit/includes/parser/NewParserTest.php
index f4d5f757..d1221ca8 100644
--- a/tests/phpunit/includes/parser/NewParserTest.php
+++ b/tests/phpunit/includes/parser/NewParserTest.php
@@ -8,13 +8,12 @@
* @group Stub
*/
class NewParserTest extends MediaWikiTestCase {
-
static protected $articles = array(); // Array of test articles defined by the tests
/* The dataProvider is run on a different instance than the test, so it must be static
* When running tests from several files, all tests will see all articles.
*/
-
- public $uploadDir;
+ static protected $backendToUse;
+
public $keepUploads = false;
public $runDisabled = false;
public $regex = '';
@@ -31,16 +30,12 @@ class NewParserTest extends MediaWikiTestCase {
public $memoryLimit = 50;
protected $file = false;
-
- /*function __construct($a = null,$b = array(),$c = null ) {
- parent::__construct($a,$b,$c);
- }*/
-
+
function setUp() {
global $wgContLang, $wgNamespaceProtection, $wgNamespaceAliases;
global $wgHooks, $IP;
$wgContLang = Language::factory( 'en' );
-
+
//Setup CLI arguments
if ( $this->getCliArg( 'regex=' ) ) {
$this->regex = $this->getCliArg( 'regex=' );
@@ -48,11 +43,11 @@ class NewParserTest extends MediaWikiTestCase {
# Matches anything
$this->regex = '';
}
-
+
$this->keepUploads = $this->getCliArg( 'keep-uploads' );
-
+
$tmpGlobals = array();
-
+
$tmpGlobals['wgScript'] = '/index.php';
$tmpGlobals['wgScriptPath'] = '/';
$tmpGlobals['wgArticlePath'] = '/wiki/$1';
@@ -60,15 +55,14 @@ class NewParserTest extends MediaWikiTestCase {
$tmpGlobals['wgStylePath'] = '/skins';
$tmpGlobals['wgThumbnailScriptPath'] = false;
$tmpGlobals['wgLocalFileRepo'] = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => wfTempDir() . '/test-repo',
- 'url' => 'http://example.com/images',
- 'deletedDir' => wfTempDir() . '/test-repo/delete',
- 'hashLevels' => 2,
+ 'class' => 'LocalRepo',
+ 'name' => 'local',
+ 'url' => 'http://example.com/images',
+ 'hashLevels' => 2,
'transformVia404' => false,
+ 'backend' => 'local-backend'
);
-
+ $tmpGlobals['wgForeignFileRepos'] = array();
$tmpGlobals['wgEnableParserCache'] = false;
$tmpGlobals['wgHooks'] = $wgHooks;
$tmpGlobals['wgDeferredUpdateList'] = array();
@@ -79,16 +73,16 @@ class NewParserTest extends MediaWikiTestCase {
// $tmpGlobals['wgContLang'] = new StubContLang;
$tmpGlobals['wgUser'] = new User;
$context = new RequestContext();
- $tmpGlobals['wgLang'] = $context->getLang();
+ $tmpGlobals['wgLang'] = $context->getLanguage();
$tmpGlobals['wgOut'] = $context->getOutput();
$tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
- $tmpGlobals['wgRequest'] = new WebRequest;
+ $tmpGlobals['wgRequest'] = $context->getRequest();
if ( $GLOBALS['wgStyleDirectory'] === false ) {
$tmpGlobals['wgStyleDirectory'] = "$IP/skins";
}
-
-
+
+
foreach ( $tmpGlobals as $var => $val ) {
if ( array_key_exists( $var, $GLOBALS ) ) {
$this->savedInitialGlobals[$var] = $GLOBALS[$var];
@@ -96,31 +90,38 @@ class NewParserTest extends MediaWikiTestCase {
$GLOBALS[$var] = $val;
}
-
+
$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;
-
}
-
+
public function tearDown() {
-
foreach ( $this->savedInitialGlobals as $var => $val ) {
$GLOBALS[$var] = $val;
}
-
+
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'];
+
+ // Restore backends
+ RepoGroup::destroySingleton();
+ FileBackendGroup::destroySingleton();
}
-
+
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(
@@ -158,17 +159,14 @@ class NewParserTest extends MediaWikiTestCase {
* @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' ) );
+ ), __METHOD__, array( 'IGNORE' )
+ );
# Update certain things in site_stats
- $this->db->insert( 'site_stats',
+ $this->db->insert( 'site_stats',
array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ),
- __METHOD__,
- /**
- * @todo Fixme! Same as above!
- */
- array( 'IGNORE' )
+ __METHOD__
);
# Reinitialise the LocalisationCache to match the database state
@@ -177,50 +175,66 @@ class NewParserTest extends MediaWikiTestCase {
# Clear the message cache
MessageCache::singleton()->clear();
- $this->uploadDir = $this->setupUploadDir();
-
$user = User::newFromId( 0 );
LinkCache::singleton()->clear(); # Avoids the odd failure at creating the nullRevision
-
+
+ # Upload DB table entries for files.
+ # 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.
$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
- $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
- 'size' => 12345,
- 'width' => 1941,
- 'height' => 220,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
+ if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+ $image->recordUpload2(
+ '', // archive name
+ 'Upload of some lame file',
+ 'Some lame file',
+ array(
+ 'size' => 12345,
+ 'width' => 1941,
+ 'height' => 220,
+ 'bits' => 24,
+ 'media_type' => MEDIATYPE_BITMAP,
+ 'mime' => 'image/jpeg',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'fileExists' => true ),
+ $this->db->timestamp( '20010115123500' ), $user
+ );
+ }
# This image will be blacklisted in [[MediaWiki:Bad image list]]
$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
- $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
- 'size' => 12345,
- 'width' => 320,
- 'height' => 240,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
-
+ if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+ $image->recordUpload2(
+ '', // archive name
+ 'zomgnotcensored',
+ 'Borderline image',
+ array(
+ 'size' => 12345,
+ 'width' => 320,
+ 'height' => 240,
+ 'bits' => 24,
+ 'media_type' => MEDIATYPE_BITMAP,
+ 'mime' => 'image/jpeg',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'fileExists' => true ),
+ $this->db->timestamp( '20010115123500' ), $user
+ );
+ }
}
-
-
-
-
+
+
+
+
//ParserTest setup/teardown functions
-
+
/**
* Set up the global variables for a consistent environment for each test.
* Ideally this should replace the global configuration entirely.
*/
protected function setupGlobals( $opts = '', $config = '' ) {
+ global $wgFileBackends;
# Find out values for some special options.
$lang =
self::getOptionValue( 'language', $opts, 'en' );
@@ -231,19 +245,48 @@ class NewParserTest extends MediaWikiTestCase {
$linkHolderBatchSize =
self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
+ $uploadDir = $this->getUploadDir();
+ if ( $this->getCliArg( 'use-filebackend=' ) ) {
+ if ( self::$backendToUse ) {
+ $backend = self::$backendToUse;
+ } else {
+ $name = $this->getCliArg( 'use-filebackend=' );
+ $useConfig = array();
+ foreach ( $wgFileBackends as $conf ) {
+ if ( $conf['name'] == $name ) {
+ $useConfig = $conf;
+ }
+ }
+ $useConfig['name'] = 'local-backend'; // swap name
+ $class = $conf['class'];
+ self::$backendToUse = new $class( $useConfig );
+ $backend = self::$backendToUse;
+ }
+ } else {
+ $backend = new FSFileBackend( array(
+ 'name' => 'local-backend',
+ 'lockManager' => 'nullLockManager',
+ 'containerPaths' => array(
+ 'local-public' => "$uploadDir",
+ 'local-thumb' => "$uploadDir/thumb",
+ )
+ ) );
+ }
+
$settings = array(
'wgServer' => 'http://Britney-Spears',
'wgScript' => '/index.php',
'wgScriptPath' => '/',
'wgArticlePath' => '/wiki/$1',
+ 'wgExtensionAssetsPath' => '/extensions',
'wgActionPaths' => array(),
'wgLocalFileRepo' => array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => $this->uploadDir,
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
+ 'class' => 'LocalRepo',
+ 'name' => 'local',
+ 'url' => 'http://example.com/images',
+ 'hashLevels' => 2,
'transformVia404' => false,
+ 'backend' => $backend
),
'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
'wgStylePath' => '/skins',
@@ -262,7 +305,7 @@ class NewParserTest extends MediaWikiTestCase {
'wgThumbnailScriptPath' => false,
'wgUseImageResize' => false,
'wgUseTeX' => isset( $opts['math'] ),
- 'wgMathDirectory' => $this->uploadDir . '/math',
+ 'wgMathDirectory' => $uploadDir . '/math',
'wgLocaltimezone' => 'UTC',
'wgAllowExternalImages' => true,
'wgUseTidy' => false,
@@ -283,6 +326,7 @@ class NewParserTest extends MediaWikiTestCase {
'wgExternalLinkTarget' => false,
'wgAlwaysUseTidy' => false,
'wgHtml5' => true,
+ 'wgCleanupPresentationalAttributes' => true,
'wgWellFormedXml' => true,
'wgAllowMicrodataAttributes' => true,
'wgAdaptiveMessageCache' => true,
@@ -312,39 +356,41 @@ class NewParserTest extends MediaWikiTestCase {
$langObj = Language::factory( $lang );
$GLOBALS['wgContLang'] = $langObj;
$context = new RequestContext();
- $GLOBALS['wgLang'] = $context->getLang();
+ $GLOBALS['wgLang'] = $context->getLanguage();
$GLOBALS['wgMemc'] = new EmptyBagOStuff;
$GLOBALS['wgOut'] = $context->getOutput();
+ $GLOBALS['wgUser'] = $context->getUser();
global $wgHooks;
$wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserTestParser'][] = 'ParserTestStaticParserHook::setup';
$wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
MagicWord::clearCache();
+ RepoGroup::destroySingleton();
+ FileBackendGroup::destroySingleton();
+
+ # Create dummy files in storage
+ $this->setupUploads();
# 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::singleton()->destroyInstance();
-
- global $wgUser;
- $wgUser = new User();
+
+ return $context;
}
/**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
+ * Get an FS upload directory (only applies to FSFileBackend)
*
* @return String: the directory
*/
- protected function setupUploadDir() {
- global $IP;
-
+ protected function getUploadDir() {
if ( $this->keepUploads ) {
$dir = wfTempDir() . '/mwParser-images';
@@ -361,70 +407,67 @@ class NewParserTest extends MediaWikiTestCase {
return $dir;
}
- wfMkdirParents( $dir . '/3/3a' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
- wfMkdirParents( $dir . '/0/09' );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
return $dir;
}
-
+
+ /**
+ * Create a dummy uploads directory which will contain a couple
+ * of files in order to pass existence tests.
+ *
+ * @return String: the directory
+ */
+ protected function setupUploads() {
+ global $IP;
+
+ $base = $this->getBaseDir();
+ $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
+ $backend->prepare( array( 'dir' => "$base/local-public/3/3a" ) );
+ $backend->store( array(
+ 'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
+ ) );
+ $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"
+ ) );
+ }
+
/**
* Restore default values and perform any necessary clean-up
* after each test runs.
*/
protected function teardownGlobals() {
- RepoGroup::destroySingleton();
- LinkCache::singleton()->clear();
+ $this->teardownUploads();
foreach ( $this->savedGlobals as $var => $val ) {
$GLOBALS[$var] = $val;
}
-
- $this->teardownUploadDir( $this->uploadDir );
+
+ RepoGroup::destroySingleton();
+ LinkCache::singleton()->clear();
}
/**
* Remove the dummy uploads directory
*/
- private function teardownUploadDir( $dir ) {
+ private function teardownUploads() {
if ( $this->keepUploads ) {
return;
}
+ $base = $this->getBaseDir();
// delete the files first, then the dirs.
self::deleteFiles(
array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
+ "$base/local-public/3/3a/Foobar.jpg",
+ "$base/local-thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
+ "$base/local-thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
+ "$base/local-thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
+ "$base/local-thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
- "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
- )
- );
+ "$base/local-public/0/09/Bad.jpg",
+ "$base/local-thumb/0/09/Bad.jpg",
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
- "$dir/thumb",
- "$dir/math/f/a/5",
- "$dir/math/f/a",
- "$dir/math/f",
- "$dir/math",
- "$dir",
+ "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
)
);
}
@@ -434,25 +477,24 @@ class NewParserTest extends MediaWikiTestCase {
* @param $files Array: full paths to files to delete.
*/
private static function deleteFiles( $files ) {
+ $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
foreach ( $files as $file ) {
- if ( file_exists( $file ) ) {
- unlink( $file );
+ $backend->delete( array( 'src' => $file ), array( 'force' => 1 ) );
+ }
+ foreach ( $files as $file ) {
+ $tmp = $file;
+ while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
+ if ( !$backend->clean( array( 'dir' => $tmp ) )->isOK() ) {
+ break;
+ }
}
}
}
- /**
- * Delete the specified directories, if they exist. Must be empty.
- * @param $dirs Array: full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach ( $dirs as $dir ) {
- if ( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
+ protected function getBaseDir() {
+ return 'mwstore://local-backend';
}
-
+
public function parserTestProvider() {
if ( $this->file === false ) {
global $wgParserTestFiles;
@@ -460,25 +502,29 @@ class NewParserTest extends MediaWikiTestCase {
}
return new TestFileIterator( $this->file, $this );
}
-
+
/**
* Set the file from whose tests will be run by this instance
*/
public function setParserTestFile( $filename ) {
$this->file = $filename;
}
-
+
/** @dataProvider parserTestProvider */
public function testParserTest( $desc, $input, $result, $opts, $config ) {
- if ( !preg_match( '/' . $this->regex . '/', $desc ) ) return; //$this->markTestSkipped( 'Filtered out by the user' );
+ if ( $this->regex != '' && !preg_match( '/' . $this->regex . '/', $desc ) ) {
+ $this->assertTrue( true ); // XXX: don't flood output with "test made no assertions"
+ //$this->markTestSkipped( 'Filtered out by the user' );
+ return;
+ }
wfDebug( "Running parser test: $desc\n" );
$opts = $this->parseOptions( $opts );
- $this->setupGlobals( $opts, $config );
+ $context = $this->setupGlobals( $opts, $config );
- $user = new User();
- $options = ParserOptions::newFromUser( $user );
+ $user = $context->getUser();
+ $options = ParserOptions::newFromContext( $context );
if ( isset( $opts['title'] ) ) {
$titleText = $opts['title'];
@@ -490,7 +536,7 @@ class NewParserTest extends MediaWikiTestCase {
$local = isset( $opts['local'] );
$preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
$parser = $this->getParser( $preprocessor );
-
+
$title = Title::newFromText( $titleText );
if ( isset( $opts['pst'] ) ) {
@@ -505,8 +551,7 @@ class NewParserTest extends MediaWikiTestCase {
$replace = $opts['replace'][1];
$out = $parser->replaceSection( $input, $section, $replace );
} elseif ( isset( $opts['comment'] ) ) {
- $linker = $user->getSkin();
- $out = $linker->formatComment( $input, $title, $local );
+ $out = Linker::formatComment( $input, $title, $local );
} elseif ( isset( $opts['preload'] ) ) {
$out = $parser->getpreloadText( $input, $title, $options );
} else {
@@ -524,10 +569,9 @@ class NewParserTest extends MediaWikiTestCase {
if ( isset( $opts['ill'] ) ) {
$out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
} elseif ( isset( $opts['cat'] ) ) {
- global $wgOut;
-
- $wgOut->addCategoryLinks( $output->getCategories() );
- $cats = $wgOut->getCategoryLinks();
+ $outputPage = $context->getOutput();
+ $outputPage->addCategoryLinks( $output->getCategories() );
+ $cats = $outputPage->getCategoryLinks();
if ( isset( $cats['normal'] ) ) {
$out = $this->tidy( implode( ' ', $cats['normal'] ) );
@@ -541,38 +585,41 @@ class NewParserTest extends MediaWikiTestCase {
}
$this->teardownGlobals();
-
+
$this->assertEquals( $result, $out, $desc );
}
-
+
/**
* Run a fuzz test series
* Draw input from a set of test files
+ *
+ * @todo @fixme Needs some work to not eat memory until the world explodes
+ *
+ * @group ParserFuzz
*/
function testFuzzTests() {
-
- $this->markTestIncomplete( "Somebody is serializing PDO objects, that's a no-no" );
-
global $wgParserTestFiles;
-
+
$files = $wgParserTestFiles;
-
+
if( $this->getCliArg( 'file=' ) ) {
$files = array( $this->getCliArg( 'file=' ) );
}
-
+
$dict = $this->getFuzzInput( $files );
$dictSize = strlen( $dict );
$logMaxLength = log( $this->maxFuzzTestLength );
+ ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
+
$user = new User;
$opts = ParserOptions::newFromUser( $user );
$title = Title::makeTitle( NS_MAIN, 'Parser_test' );
$id = 1;
-
+
while ( true ) {
-
+
// Generate test input
mt_srand( ++$this->fuzzSeed );
$totalLength = mt_rand( 1, $this->maxFuzzTestLength );
@@ -594,7 +641,7 @@ class NewParserTest extends MediaWikiTestCase {
$this->assertTrue( true, "Test $id, fuzz seed {$this->fuzzSeed}" );
} 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()}" );
}
@@ -611,18 +658,18 @@ class NewParserTest extends MediaWikiTestCase {
foreach ( $memStats as $name => $usage ) {
$ret .= "$name: $usage\n";
}
-
+
throw new MWException( $ret );
}
}
-
+
$id++;
-
+
}
}
//Various getter functions
-
+
/**
* Get an input dictionary from a set of parser test files
*/
@@ -640,7 +687,7 @@ class NewParserTest extends MediaWikiTestCase {
return $dict;
}
-
+
/**
* Get a memory usage breakdown
*/
@@ -675,7 +722,7 @@ class NewParserTest extends MediaWikiTestCase {
return $memStats;
}
-
+
/**
* Get a Parser object
*/
@@ -693,23 +740,20 @@ class NewParserTest extends MediaWikiTestCase {
//Various action functions
public function addArticle( $name, $text, $line ) {
- self::$articles[$name] = $text;
- }
-
+ self::$articles[$name] = array( $text, $line );
+ }
+
public function publishTestArticles() {
if ( empty( self::$articles ) ) {
return;
}
- foreach ( self::$articles as $name => $text ) {
- $title = Title::newFromText( $name );
-
- if ( $title->getArticleID( Title::GAID_FOR_UPDATE ) == 0 ) {
- ParserTest::addArticle( $name, $text );
- }
+ foreach ( self::$articles as $name => $info ) {
+ list( $text, $line ) = $info;
+ ParserTest::addArticle( $name, $text, $line, 'ignoreduplicate' );
}
}
-
+
/**
* Steal a callback function from the primary parser, save it for
* application to our scary parser. If the hook is not installed,
@@ -730,8 +774,8 @@ class NewParserTest extends MediaWikiTestCase {
return isset( $wgParser->mFunctionHooks[$name] );
}
//Various "cleanup" functions
-
- /*
+
+ /**
* Run the "tidy" command on text if the $wgUseTidy
* global is true
*
@@ -747,7 +791,7 @@ class NewParserTest extends MediaWikiTestCase {
return $text;
}
-
+
/**
* Remove last character if it is a newline
*/
@@ -760,12 +804,8 @@ class NewParserTest extends MediaWikiTestCase {
}
}
- public function showRunFile( $file ) {
- /* NOP */
- }
-
//Test options parser functions
-
+
protected function parseOptions( $instring ) {
$opts = array();
// foo
@@ -820,7 +860,7 @@ class NewParserTest extends MediaWikiTestCase {
}
return $opts;
}
-
+
protected function cleanupOption( $opt ) {
if ( substr( $opt, 0, 1 ) == '"' ) {
return substr( $opt, 1, -1 );
@@ -831,7 +871,7 @@ class NewParserTest extends MediaWikiTestCase {
}
return $opt;
}
-
+
/**
* Use a regex to find out the value of an option
* @param $key String: name of option val to retrieve
diff --git a/tests/phpunit/includes/parser/ParserHelpers.php b/tests/phpunit/includes/parser/ParserHelpers.php
deleted file mode 100644
index 4a6ce7c4..00000000
--- a/tests/phpunit/includes/parser/ParserHelpers.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-class PHPUnitParserTest extends ParserTest {
- function showTesting( $desc ) {
- /* Do nothing since we don't want to show info during PHPUnit testing. */
- }
-
- public function showSuccess( $desc ) {
- PHPUnit_Framework_Assert::assertTrue( true, $desc );
- return true;
- }
-
- public function showFailure( $desc, $expected, $got ) {
- PHPUnit_Framework_Assert::assertEquals( $expected, $got, $desc );
- return false;
- }
-
- public function setupRecorder( $options ) {
- $this->recorder = new PHPUnitTestRecorder( $this );
- }
-}
-
-class ParserUnitTest extends MediaWikiTestCase {
- private $test = "";
-
- public function __construct( $suite, $test = null ) {
- parent::__construct();
- $this->test = $test;
- $this->suite = $suite;
- }
-
- function count() { return 1; }
-
- public function run( PHPUnit_Framework_TestResult $result = null ) {
- PHPUnit_Framework_Assert::resetCount();
- if ( $result === NULL ) {
- $result = new PHPUnit_Framework_TestResult;
- }
-
- $this->suite->publishTestArticles(); // Add articles needed by the tests.
- $backend = new ParserTestSuiteBackend;
- $result->startTest( $this );
-
- // Support the transition to PHPUnit 3.5 where PHPUnit_Util_Timer is replaced with PHP_Timer
- if ( class_exists( 'PHP_Timer' ) ) {
- PHP_Timer::start();
- } else {
- PHPUnit_Util_Timer::start();
- }
-
- $r = false;
- try {
- # Run the test.
- # On failure, the subclassed backend will throw an exception with
- # the details.
- $pt = new PHPUnitParserTest;
- $r = $pt->runTest( $this->test['test'], $this->test['input'],
- $this->test['result'], $this->test['options'], $this->test['config']
- );
- }
- catch ( PHPUnit_Framework_AssertionFailedError $e ) {
-
- // PHPUnit_Util_Timer -> PHP_Timer support (see above)
- if ( class_exists( 'PHP_Timer' ) ) {
- $result->addFailure( $this, $e, PHP_Timer::stop() );
- } else {
- $result->addFailure( $this, $e, PHPUnit_Util_Timer::stop() );
- }
- }
- catch ( Exception $e ) {
- // PHPUnit_Util_Timer -> PHP_Timer support (see above)
- if ( class_exists( 'PHP_Timer' ) ) {
- $result->addFailure( $this, $e, PHP_Timer::stop() );
- } else {
- $result->addFailure( $this, $e, PHPUnit_Util_Timer::stop() );
- }
- }
-
- // PHPUnit_Util_Timer -> PHP_Timer support (see above)
- if ( class_exists( 'PHP_Timer' ) ) {
- $result->endTest( $this, PHP_Timer::stop() );
- } else {
- $result->endTest( $this, PHPUnit_Util_Timer::stop() );
- }
-
- $backend->recorder->record( $this->test['test'], $r );
- $this->addToAssertionCount( PHPUnit_Framework_Assert::getCount() );
-
- return $result;
- }
-
- public function toString() {
- return $this->test['test'];
- }
-
-}
-
-class ParserTestSuiteBackend extends PHPUnit_FrameWork_TestSuite {
- public $recorder;
- public $term;
- static $usePHPUnit = false;
-
- function __construct() {
- parent::__construct();
- $this->setupRecorder(null);
- self::$usePHPUnit = method_exists('PHPUnit_Framework_Assert', 'assertEquals');
- }
-
- function showTesting( $desc ) {
- }
-
- function showRunFile( $path ) {
- }
-
- function showTestResult( $desc, $result, $out ) {
- if ( $result === $out ) {
- return self::showSuccess( $desc, $result, $out );
- } else {
- return self::showFailure( $desc, $result, $out );
- }
- }
-
- public function setupRecorder( $options ) {
- $this->recorder = new PHPUnitTestRecorder( $this );
- }
-}
-
-class PHPUnitTestRecorder extends TestRecorder {
- function record( $test, $result ) {
- $this->total++;
- $this->success += $result;
-
- }
-
- function reportPercentage( $success, $total ) { }
-}
diff --git a/tests/phpunit/includes/parser/ParserPreloadTest.php b/tests/phpunit/includes/parser/ParserPreloadTest.php
new file mode 100644
index 00000000..0e8ef530
--- /dev/null
+++ b/tests/phpunit/includes/parser/ParserPreloadTest.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Basic tests for Parser::getPreloadText
+ * @author Antoine Musso
+ */
+class ParserPreloadTest extends MediaWikiTestCase {
+ private $testParser;
+ private $testParserOptions;
+ private $title;
+
+ function setUp() {
+ $this->testParserOptions = new ParserOptions();
+
+ $this->testParser = new Parser();
+ $this->testParser->Options( $this->testParserOptions );
+ $this->testParser->clearState();
+
+ $this->title = Title::newFromText( 'Preload Test' );
+ }
+
+ function tearDown() {
+ unset( $this->testParser );
+ unset( $this->title );
+ }
+
+ /**
+ * @covers Parser::getPreloadText
+ */
+ function testPreloadSimpleText() {
+ $this->assertPreloaded( 'simple', 'simple' );
+ }
+
+ /**
+ * @covers Parser::getPreloadText
+ */
+ function testPreloadedPreIsUnstripped() {
+ $this->assertPreloaded(
+ '<pre>monospaced</pre>',
+ '<pre>monospaced</pre>',
+ '<pre> in preloaded text must be unstripped (bug 27467)'
+ );
+ }
+
+ /**
+ * @covers Parser::getPreloadText
+ */
+ function testPreloadedNowikiIsUnstripped() {
+ $this->assertPreloaded(
+ '<nowiki>[[Dummy title]]</nowiki>',
+ '<nowiki>[[Dummy title]]</nowiki>',
+ '<nowiki> in preloaded text must be unstripped (bug 27467)'
+ );
+ }
+
+ function assertPreloaded( $expected, $text, $msg='') {
+ $this->assertEquals(
+ $expected,
+ $this->testParser->getPreloadText(
+ $text,
+ $this->title,
+ $this->testParserOptions
+ ),
+ $msg
+ );
+ }
+
+}
diff --git a/tests/phpunit/includes/parser/PreprocessorTest.php b/tests/phpunit/includes/parser/PreprocessorTest.php
index 7a5948d4..9d3499a0 100644
--- a/tests/phpunit/includes/parser/PreprocessorTest.php
+++ b/tests/phpunit/includes/parser/PreprocessorTest.php
@@ -49,43 +49,45 @@ class PreprocessorTest extends MediaWikiTestCase {
array( "== Foo ==\n== Bar == \n", "<root><h level=\"2\" i=\"1\">== Foo ==</h>\n<h level=\"2\" i=\"2\">== Bar == </h>\n</root>" ),
array( "===========", "<root><h level=\"5\" i=\"1\">===========</h></root>" ),
array( "Foo\n=\n==\n=\n", "<root>Foo\n=\n==\n=\n</root>" ),
- array( "{{Foo}}", "<root><template lineStart=\"1\"><title>Foo</title></template></root>" ),
+ array( "{{Foo}}", "<root><template><title>Foo</title></template></root>" ),
array( "\n{{Foo}}", "<root>\n<template lineStart=\"1\"><title>Foo</title></template></root>" ),
- array( "{{Foo|bar}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template></root>" ),
- array( "{{Foo|bar}}a", "<root><template lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template>a</root>" ),
- array( "{{Foo|bar|baz}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></template></root>" ),
- array( "{{Foo|1=bar}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name>1</name>=<value>bar</value></part></template></root>" ),
- array( "{{Foo|=bar}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name></name>=<value>bar</value></part></template></root>" ),
- array( "{{Foo|bar=baz}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name>bar</name>=<value>baz</value></part></template></root>" ),
- array( "{{Foo|1=bar|baz}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name index=\"1\" /><value>baz</value></part></template></root>" ),
- array( "{{Foo|1=bar|2=baz}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name>2</name>=<value>baz</value></part></template></root>" ),
- array( "{{Foo|bar|foo=baz}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name>foo</name>=<value>baz</value></part></template></root>" ),
- array( "{{{1}}}", "<root><tplarg lineStart=\"1\"><title>1</title></tplarg></root>" ),
- array( "{{{1|}}}", "<root><tplarg lineStart=\"1\"><title>1</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ),
- array( "{{{Foo}}}", "<root><tplarg lineStart=\"1\"><title>Foo</title></tplarg></root>" ),
- array( "{{{Foo|}}}", "<root><tplarg lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ),
- array( "{{{Foo|bar|baz}}}", "<root><tplarg lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></tplarg></root>" ),
+ array( "{{Foo|bar}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template></root>" ),
+ array( "{{Foo|bar}}a", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template>a</root>" ),
+ array( "{{Foo|bar|baz}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></template></root>" ),
+ array( "{{Foo|1=bar}}", "<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part></template></root>" ),
+ array( "{{Foo|=bar}}", "<root><template><title>Foo</title><part><name></name>=<value>bar</value></part></template></root>" ),
+ array( "{{Foo|bar=baz}}", "<root><template><title>Foo</title><part><name>bar</name>=<value>baz</value></part></template></root>" ),
+ array( "{{Foo|{{bar}}=baz}}", "<root><template><title>Foo</title><part><name><template><title>bar</title></template></name>=<value>baz</value></part></template></root>" ),
+ array( "{{Foo|1=bar|baz}}", "<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name index=\"1\" /><value>baz</value></part></template></root>" ),
+ array( "{{Foo|1=bar|2=baz}}", "<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name>2</name>=<value>baz</value></part></template></root>" ),
+ array( "{{Foo|bar|foo=baz}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name>foo</name>=<value>baz</value></part></template></root>" ),
+ array( "{{{1}}}", "<root><tplarg><title>1</title></tplarg></root>" ),
+ array( "{{{1|}}}", "<root><tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ),
+ array( "{{{Foo}}}", "<root><tplarg><title>Foo</title></tplarg></root>" ),
+ array( "{{{Foo|}}}", "<root><tplarg><title>Foo</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ),
+ array( "{{{Foo|bar|baz}}}", "<root><tplarg><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></tplarg></root>" ),
array( "{<!-- -->{Foo}}", "<root>{<comment>&lt;!-- --&gt;</comment>{Foo}}</root>" ),
array( "{{{{Foobar}}}}", "<root>{<tplarg><title>Foobar</title></tplarg>}</root>" ),
- array( "{{{ {{Foo}} }}}", "<root><tplarg lineStart=\"1\"><title> <template><title>Foo</title></template> </title></tplarg></root>" ),
- array( "{{ {{{Foo}}} }}", "<root><template lineStart=\"1\"><title> <tplarg><title>Foo</title></tplarg> </title></template></root>" ),
- array( "{{{{{Foo}}}}}", "<root><template lineStart=\"1\"><title><tplarg><title>Foo</title></tplarg></title></template></root>" ),
- array( "{{{{{Foo}} }}}", "<root><tplarg lineStart=\"1\"><title><template><title>Foo</title></template> </title></tplarg></root>" ),
- array( "{{{{{{Foo}}}}}}", "<root><tplarg lineStart=\"1\"><title><tplarg><title>Foo</title></tplarg></title></tplarg></root>" ),
+ array( "{{{ {{Foo}} }}}", "<root><tplarg><title> <template><title>Foo</title></template> </title></tplarg></root>" ),
+ array( "{{ {{{Foo}}} }}", "<root><template><title> <tplarg><title>Foo</title></tplarg> </title></template></root>" ),
+ array( "{{{{{Foo}}}}}", "<root><template><title><tplarg><title>Foo</title></tplarg></title></template></root>" ),
+ array( "{{{{{Foo}} }}}", "<root><tplarg><title><template><title>Foo</title></template> </title></tplarg></root>" ),
+ array( "{{{{{{Foo}}}}}}", "<root><tplarg><title><tplarg><title>Foo</title></tplarg></title></tplarg></root>" ),
array( "{{{{{{Foo}}}}}", "<root>{<template><title><tplarg><title>Foo</title></tplarg></title></template></root>" ),
array( "[[[Foo]]", "<root>[[[Foo]]</root>" ),
- array( "{{Foo|[[[[bar]]|baz]]}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name index=\"1\" /><value>[[[[bar]]|baz]]</value></part></template></root>" ), // This test is important, since it means the difference between having the [[ rule stacked or not
+ array( "{{Foo|[[[[bar]]|baz]]}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>[[[[bar]]|baz]]</value></part></template></root>" ), // This test is important, since it means the difference between having the [[ rule stacked or not
array( "{{Foo|[[[[bar]|baz]]}}", "<root>{{Foo|[[[[bar]|baz]]}}</root>" ),
array( "{{Foo|Foo [[[[bar]|baz]]}}", "<root>{{Foo|Foo [[[[bar]|baz]]}}</root>" ),
array( "Foo <display map>Bar</display map >Baz", "<root>Foo <ext><name>display map</name><attr></attr><inner>Bar</inner><close>&lt;/display map &gt;</close></ext>Baz</root>" ),
array( "Foo <display map foo>Bar</display map >Baz", "<root>Foo <ext><name>display map</name><attr> foo</attr><inner>Bar</inner><close>&lt;/display map &gt;</close></ext>Baz</root>" ),
array( "Foo <gallery bar=\"baz\" />", "<root>Foo <ext><name>gallery</name><attr> bar=&quot;baz&quot; </attr></ext></root>" ),
+ array( "Foo <gallery bar=\"1\" baz=2 />", "<root>Foo <ext><name>gallery</name><attr> bar=&quot;1&quot; baz=2 </attr></ext></root>" ),
array( "</foo>Foo<//foo>", "<root><ext><name>/foo</name><attr></attr><inner>Foo</inner><close>&lt;//foo&gt;</close></ext></root>" ), # Worth blacklisting IMHO
- array( "{{#ifexpr: ({{{1|1}}} = 2) | Foo | Bar }}", "<root><template lineStart=\"1\"><title>#ifexpr: (<tplarg><title>1</title><part><name index=\"1\" /><value>1</value></part></tplarg> = 2) </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | Foo | {{Bar}} }}", "<root><template lineStart=\"1\"><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> <template><title>Bar</title></template> </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | Foo | [[Bar]] }}", "<root><template lineStart=\"1\"><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> [[Bar]] </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | [[Foo]] | Bar }}", "<root><template lineStart=\"1\"><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> [[Foo]] </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | 1 | {{#if: {{{1|}}} | 2 | 3 }} }}", "<root><template lineStart=\"1\"><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 1 </value></part><part><name index=\"2\" /><value> <template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 2 </value></part><part><name index=\"2\" /><value> 3 </value></part></template> </value></part></template></root>"),
+ array( "{{#ifexpr: ({{{1|1}}} = 2) | Foo | Bar }}", "<root><template><title>#ifexpr: (<tplarg><title>1</title><part><name index=\"1\" /><value>1</value></part></tplarg> = 2) </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>"),
+ array( "{{#if: {{{1|}}} | Foo | {{Bar}} }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> <template><title>Bar</title></template> </value></part></template></root>"),
+ array( "{{#if: {{{1|}}} | Foo | [[Bar]] }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> [[Bar]] </value></part></template></root>"),
+ array( "{{#if: {{{1|}}} | [[Foo]] | Bar }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> [[Foo]] </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>"),
+ array( "{{#if: {{{1|}}} | 1 | {{#if: {{{1|}}} | 2 | 3 }} }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 1 </value></part><part><name index=\"2\" /><value> <template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 2 </value></part><part><name index=\"2\" /><value> 3 </value></part></template> </value></part></template></root>"),
array( "{{ {{Foo}}", "<root>{{ <template><title>Foo</title></template></root>"),
array( "{{Foobar {{Foo}} {{Bar}} {{Baz}} ", "<root>{{Foobar <template><title>Foo</title></template> <template><title>Bar</title></template> <template><title>Baz</title></template> </root>"),
array( "[[Foo]] |", "<root>[[Foo]] |</root>"),
@@ -97,19 +99,54 @@ class PreprocessorTest extends MediaWikiTestCase {
array( "{{Foo|bar=[[baz]}}", "<root>{{Foo|bar=[[baz]}}</root>"),
array( "{{foo|", "<root>{{foo|</root>"),
array( "{{foo|}", "<root>{{foo|}</root>"),
- array( "{{foo|} }}", "<root><template lineStart=\"1\"><title>foo</title><part><name index=\"1\" /><value>} </value></part></template></root>"),
+ array( "{{foo|} }}", "<root><template><title>foo</title><part><name index=\"1\" /><value>} </value></part></template></root>"),
array( "{{foo|bar=|}", "<root>{{foo|bar=|}</root>"),
array( "{{Foo|} Bar=", "<root>{{Foo|} Bar=</root>"),
- array( "{{Foo|} Bar=}}", "<root><template lineStart=\"1\"><title>Foo</title><part><name>} Bar</name>=<value></value></part></template></root>"),
+ array( "{{Foo|} Bar=}}", "<root><template><title>Foo</title><part><name>} Bar</name>=<value></value></part></template></root>"),
/* array( file_get_contents( dirname( __FILE__ ) . '/QuoteQuran.txt' ), file_get_contents( dirname( __FILE__ ) . '/QuoteQuranExpanded.txt' ) ), */
);
}
/**
+ * Get XML preprocessor tree from the preprocessor (which may not be the
+ * native XML-based one).
+ *
+ * @param string $wikiText
+ * @return string
+ */
+ function preprocessToXml( $wikiText ) {
+ if ( method_exists( $this->mPreprocessor, 'preprocessToXml' ) ) {
+ return $this->normalizeXml( $this->mPreprocessor->preprocessToXml( $wikiText ) );
+ }
+
+ $dom = $this->mPreprocessor->preprocessToObj( $wikiText );
+ if ( is_callable( array( $dom, 'saveXML' ) ) ) {
+ return $dom->saveXML();
+ } else {
+ return $this->normalizeXml( $dom->__toString() );
+ }
+ }
+
+ /**
+ * Normalize XML string to the form that a DOMDocument saves out.
+ *
+ * @param string $xml
+ * @return string
+ */
+ function normalizeXml( $xml ) {
+ return preg_replace( '!<([a-z]+)/>!', '<$1></$1>', str_replace( ' />', '/>', $xml ) );
+
+ $dom = new DOMDocument();
+ // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
+ $dom->loadXML( $xml, 1 << 19 );
+ return $dom->saveXML();
+ }
+
+ /**
* @dataProvider provideCases
*/
function testPreprocessorOutput( $wikiText, $expectedXml ) {
- $this->assertEquals( $expectedXml, $this->mPreprocessor->preprocessToXml( $wikiText ) );
+ $this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
}
/**
@@ -130,11 +167,12 @@ class PreprocessorTest extends MediaWikiTestCase {
function testPreprocessorOutputFiles( $filename ) {
$folder = dirname( __FILE__ ) . "/../../../parser/preprocess";
$wikiText = file_get_contents( "$folder/$filename.txt" );
- $output = $this->mPreprocessor->preprocessToXml( $wikiText );
+ $output = $this->preprocessToXml( $wikiText );
$expectedFilename = "$folder/$filename.expected";
if ( file_exists( $expectedFilename ) ) {
- $this->assertStringEqualsFile( $expectedFilename, $output );
+ $expectedXml = $this->normalizeXml( file_get_contents( $expectedFilename ) );
+ $this->assertEquals( $expectedXml, $output );
} else {
$tempFilename = tempnam( $folder, "$filename." );
file_put_contents( $tempFilename, $output );
@@ -189,7 +227,7 @@ class PreprocessorTest extends MediaWikiTestCase {
* @dataProvider provideHeadings
*/
function testHeadings( $wikiText, $expectedXml ) {
- $this->assertEquals( $expectedXml, $this->mPreprocessor->preprocessToXml( $wikiText ) );
+ $this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
}
}
diff --git a/tests/phpunit/includes/parser/TagHooks.php b/tests/phpunit/includes/parser/TagHooksTest.php
index 713ce846..713ce846 100644
--- a/tests/phpunit/includes/parser/TagHooks.php
+++ b/tests/phpunit/includes/parser/TagHooksTest.php
diff --git a/tests/phpunit/includes/search/SearchEngineTest.php b/tests/phpunit/includes/search/SearchEngineTest.php
index 1a0fcd31..957907c7 100644
--- a/tests/phpunit/includes/search/SearchEngineTest.php
+++ b/tests/phpunit/includes/search/SearchEngineTest.php
@@ -12,7 +12,7 @@ class SearchEngineTest extends MediaWikiTestCase {
unset( $this->search );
}
- /*
+ /**
* Checks for database type & version.
* Will skip current test if DB does not support search.
*/
@@ -64,8 +64,10 @@ class SearchEngineTest extends MediaWikiTestCase {
$this->assertTrue( is_object( $results ) );
$matches = array();
- while ( $row = $results->next() ) {
+ $row = $results->next();
+ while ( $row ) {
$matches[] = $row->getTitle()->getPrefixedText();
+ $row = $results->next();
}
$results->free();
# Search is not guaranteed to return results in a certain order;
@@ -83,20 +85,18 @@ class SearchEngineTest extends MediaWikiTestCase {
* @param $n Integer: unused
*/
function insertPage( $pageName, $text, $ns ) {
- $dbw = $this->db;
$title = Title::newFromText( $pageName );
$user = User::newFromName( 'WikiSysop' );
$comment = 'Search Test';
// avoid memory leak...?
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
+ LinkCache::singleton()->clear();
- $article = new Article( $title );
- $article->doEdit( $text, $comment, 0, false, $user );
+ $page = WikiPage::factory( $title );
+ $page->doEdit( $text, $comment, 0, false, $user );
- $this->pageList[] = array( $title, $article->getId() );
+ $this->pageList[] = array( $title, $page->getId() );
return true;
}
diff --git a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
new file mode 100644
index 00000000..a33c7b68
--- /dev/null
+++ b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Test class to run the query of most of all our special pages
+ *
+ * Copyright © 2011, Antoine Musso
+ *
+ * @author Antoine Musso
+ * @group Database
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( 1 );
+}
+
+global $IP;
+require_once "$IP/includes/QueryPage.php"; // Needed to populate $wgQueryPages
+
+class QueryAllSpecialPagesTest extends MediaWikiTestCase {
+
+ /** List query pages that can not be tested automatically */
+ protected $manualTest = array(
+ 'LinkSearchPage'
+ );
+
+ /**
+ * Pages whose query use the same DB table more than once.
+ * This is used to skip testing those pages when run against a MySQL backend
+ * which does not support reopening a temporary table. See upstream bug:
+ * http://bugs.mysql.com/bug.php?id=10327
+ */
+ protected $reopensTempTable = array(
+ 'BrokenRedirects',
+ );
+
+ /**
+ * Initialize all query page objects
+ */
+ function __construct() {
+ parent::__construct();
+
+ global $wgQueryPages;
+ foreach( $wgQueryPages as $page ) {
+ $class = $page[0];
+ if( ! in_array( $class, $this->manualTest ) ) {
+ $this->queryPages[$class] = new $class;
+ }
+ }
+ }
+
+ /**
+ * Test SQL for each of our QueryPages objects
+ * @group Database
+ */
+ function testQuerypageSqlQuery() {
+ global $wgDBtype;
+
+ foreach( $this->queryPages as $page ) {
+
+ // With MySQL, skips special pages reopening a temporary table
+ // See http://bugs.mysql.com/bug.php?id=10327
+ if(
+ $wgDBtype === 'mysql'
+ && in_array( $page->getName(), $this->reopensTempTable )
+ ) {
+ $this->markTestSkipped( "SQL query for page {$page->getName()} can not be tested on MySQL backend (it reopens a temporary table)" );
+ continue;
+ }
+
+ $msg = "SQL query for page {$page->getName()} should give a result wrapper object" ;
+
+ $result = $page->reallyDoQuery( 50 );
+ if( $result instanceof ResultWrapper ) {
+ $this->assertTrue( true, $msg );
+ } else {
+ $this->assertFalse( false, $msg );
+ }
+ }
+ }
+}
diff --git a/tests/phpunit/includes/specials/SpecialRecentchanges.php b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
index a98e7c1a..2e4f4b09 100644
--- a/tests/phpunit/includes/specials/SpecialRecentchanges.php
+++ b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
@@ -2,9 +2,10 @@
/**
* Test class for SpecialRecentchanges class
*
- * Copyright © 2011, Ashar Voultoiz
+ * Copyright © 2011, Antoine Musso
*
- * @author Ashar Voultoiz
+ * @author Antoine Musso
+ * @group Database
*/
class SpecialRecentchangesTest extends MediaWikiTestCase {
@@ -18,13 +19,12 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
/** helper to test SpecialRecentchanges::buildMainQueryConds() */
private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
- global $wgRequest;
- $savedGlobal = $wgRequest;
+ $context = new RequestContext;
+ $context->setRequest( new FauxRequest( $requestOptions ) );
- # Initialize a WebRequest object ...
- $wgRequest = new FauxRequest( $requestOptions );
- # ... then setup the rc object (which use wgRequest internally)
+ # setup the rc object
$this->rc = new SpecialRecentChanges();
+ $this->rc->setContext( $context );
$formOptions = $this->rc->setup( null );
# Filter out rc_timestamp conditions which depends on the test runtime
@@ -40,8 +40,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
$queryConditions,
$message
);
-
- $wgRequest = $savedGlobal;
}
/** return false if condition begin with 'rc_timestamp ' */
diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php
new file mode 100644
index 00000000..ea9d5533
--- /dev/null
+++ b/tests/phpunit/includes/specials/SpecialSearchTest.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Test class for SpecialSearch class
+ * Copyright © 2012, Antoine Musso
+ *
+ * @author Antoine Musso
+ * @group Database
+ */
+
+class SpecialSearchTest extends MediaWikiTestCase {
+ private $search;
+
+ function setUp() { }
+ function tearDown() { }
+
+ /**
+ * @covers SpecialSearch::load
+ * @dataProvider provideSearchOptionsTests
+ * @param $requested Array Request parameters. For example array( 'ns5' => true, 'ns6' => true). NULL to use default options.
+ * @param $userOptions Array User options to test with. For example array('searchNs5' => 1 );. NULL to use default options.
+ * @param $expectedProfile An expected search profile name
+ * @param $expectedNs Array Expected namespaces
+ */
+ function testProfileAndNamespaceLoading(
+ $requested, $userOptions, $expectedProfile, $expectedNS,
+ $message = 'Profile name and namespaces mismatches!'
+ ) {
+ $context = new RequestContext;
+ $context->setUser(
+ $this->newUserWithSearchNS( $userOptions )
+ );
+ /*
+ $context->setRequest( new FauxRequest( array(
+ 'ns5'=>true,
+ 'ns6'=>true,
+ ) ));
+ */
+ $context->setRequest( new FauxRequest( $requested ));
+ $search = new SpecialSearch();
+ $search->setContext( $context );
+ $search->load();
+
+ /**
+ * Verify profile name and namespace in the same assertion to make
+ * sure we will be able to fully compare the above code. PHPUnit stop
+ * after an assertion fail.
+ */
+ $this->assertEquals(
+ array( /** Expected: */
+ 'ProfileName' => $expectedProfile,
+ 'Namespaces' => $expectedNS,
+ )
+ , array( /** Actual: */
+ 'ProfileName' => $search->getProfile(),
+ 'Namespaces' => $search->getNamespaces(),
+ )
+ , $message
+ );
+
+ }
+
+ function provideSearchOptionsTests() {
+ $defaultNS = SearchEngine::defaultNamespaces();
+ $EMPTY_REQUEST = array();
+ $NO_USER_PREF = null;
+
+ return array(
+ /**
+ * Parameters:
+ * <Web Request>, <User options>
+ * Followed by expected values:
+ * <ProfileName>, <NSList>
+ * Then an optional message.
+ */
+ array(
+ $EMPTY_REQUEST, $NO_USER_PREF,
+ 'default', $defaultNS,
+ 'Bug 33270: No request nor user preferences should give default profile'
+ ),
+ array(
+ array( 'ns5' => 1 ), $NO_USER_PREF,
+ 'advanced', array( 5),
+ 'Web request with specific NS should override user preference'
+ ),
+ array(
+ $EMPTY_REQUEST, array( 'searchNs2' => 1, 'searchNs14' => 1 ),
+ 'advanced', array( 2, 14 ),
+ 'Bug 33583: search with no option should honor User search preferences'
+ ),
+ );
+ }
+
+ /**
+ * Helper to create a new User object with given options
+ * User remains anonymous though
+ */
+ function newUserWithSearchNS( $opt = null ) {
+ $u = User::newFromId(0);
+ if( $opt === null ) {
+ return $u;
+ }
+ foreach($opt as $name => $value) {
+ $u->setOption( $name, $value );
+ }
+ return $u;
+ }
+}
+
diff --git a/tests/phpunit/includes/upload/UploadFromUrlTest.php b/tests/phpunit/includes/upload/UploadFromUrlTest.php
index 4722d408..d56cce31 100644
--- a/tests/phpunit/includes/upload/UploadFromUrlTest.php
+++ b/tests/phpunit/includes/upload/UploadFromUrlTest.php
@@ -20,7 +20,7 @@ class UploadFromUrlTest extends ApiTestCase {
}
}
- protected function doApiRequest( $params, $unused = null, $appendModule = false ) {
+ protected function doApiRequest( $params, $unused = null, $appendModule = false, $user = null ) {
$sessionId = session_id();
session_write_close();
@@ -36,7 +36,10 @@ class UploadFromUrlTest extends ApiTestCase {
* Ensure that the job queue is empty before continuing
*/
public function testClearQueue() {
- while ( $job = Job::pop() ) { }
+ $job = Job::pop();
+ while ( $job ) {
+ $job = Job::pop();
+ }
$this->assertFalse( $job );
}
@@ -73,7 +76,7 @@ class UploadFromUrlTest extends ApiTestCase {
* @depends testClearQueue
*/
public function testSetupUrlDownload( $data ) {
- $token = $this->user->editToken();
+ $token = $this->user->getEditToken();
$exception = false;
try {
@@ -147,7 +150,7 @@ class UploadFromUrlTest extends ApiTestCase {
* @depends testClearQueue
*/
public function testAsyncUpload( $data ) {
- $token = $this->user->editToken();
+ $token = $this->user->getEditToken();
$this->user->addGroup( 'users' );
@@ -166,7 +169,7 @@ class UploadFromUrlTest extends ApiTestCase {
* @depends testClearQueue
*/
public function testAsyncUploadWarning( $data ) {
- $token = $this->user->editToken();
+ $token = $this->user->getEditToken();
$this->user->addGroup( 'users' );
@@ -197,7 +200,7 @@ class UploadFromUrlTest extends ApiTestCase {
* @depends testClearQueue
*/
public function testSyncDownload( $data ) {
- $token = $this->user->editToken();
+ $token = $this->user->getEditToken();
$job = Job::pop();
$this->assertFalse( $job, 'Starting with an empty jobqueue' );
@@ -221,7 +224,7 @@ class UploadFromUrlTest extends ApiTestCase {
}
public function testLeaveMessage() {
- $token = $this->user->user->editToken();
+ $token = $this->user->user->getEditToken();
$talk = $this->user->user->getTalkPage();
if ( $talk->exists() ) {
@@ -274,7 +277,7 @@ class UploadFromUrlTest extends ApiTestCase {
return;
- /**
+ /*
// Broken until using leavemessage with ignorewarnings is supported
$job->run();
diff --git a/tests/phpunit/includes/upload/UploadStashTest.php b/tests/phpunit/includes/upload/UploadStashTest.php
index e644a259..c9dbb138 100644
--- a/tests/phpunit/includes/upload/UploadStashTest.php
+++ b/tests/phpunit/includes/upload/UploadStashTest.php
@@ -1,5 +1,7 @@
<?php
-
+/**
+ * @group Database
+ */
class UploadStashTest extends MediaWikiTestCase {
/**
* @var Array of UploadStashTestUser
@@ -8,49 +10,68 @@ class UploadStashTest extends MediaWikiTestCase {
public function setUp() {
parent::setUp();
-
+
// Setup a file for bug 29408
$this->bug29408File = dirname( __FILE__ ) . '/bug29408';
- file_put_contents( $this->bug29408File, "\x00" );
-
+ file_put_contents( $this->bug29408File, "\x00" );
+
self::$users = array(
'sysop' => new ApiTestUser(
'Uploadstashtestsysop',
'Upload Stash Test Sysop',
- 'upload_stash_test_sysop@sample.com',
+ 'upload_stash_test_sysop@example.com',
array( 'sysop' )
),
'uploader' => new ApiTestUser(
'Uploadstashtestuser',
'Upload Stash Test User',
- 'upload_stash_test_user@sample.com',
+ 'upload_stash_test_user@example.com',
array()
)
);
}
- /**
- * @group Database
- */
public function testBug29408() {
global $wgUser;
$wgUser = self::$users['uploader']->user;
-
+
$repo = RepoGroup::singleton()->getLocalRepo();
$stash = new UploadStash( $repo );
-
+
// Throws exception caught by PHPUnit on failure
$file = $stash->stashFile( $this->bug29408File );
// We'll never reach this point if we hit bug 29408
$this->assertTrue( true, 'Unrecognized file without extension' );
-
+
$stash->removeFile( $file->getFileKey() );
}
-
+
+ public function testValidRequest() {
+ $request = new FauxRequest( array( 'wpFileKey' => 'foo') );
+ $this->assertFalse( UploadFromStash::isValidRequest($request), 'Check failure on bad wpFileKey' );
+
+ $request = new FauxRequest( array( 'wpSessionKey' => 'foo') );
+ $this->assertFalse( UploadFromStash::isValidRequest($request), 'Check failure on bad wpSessionKey' );
+
+ $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test') );
+ $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check good wpFileKey' );
+
+ $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test') );
+ $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check good wpSessionKey' );
+
+ $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test', 'wpSessionKey' => 'foo') );
+ $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check key precedence' );
+ }
+
public function tearDown() {
parent::tearDown();
-
- unlink( $this->bug29408File . "." );
-
+
+ if( file_exists( $this->bug29408File . "." ) ) {
+ unlink( $this->bug29408File . "." );
+ }
+
+ if( file_exists( $this->bug29408File ) ) {
+ unlink( $this->bug29408File );
+ }
}
}
diff --git a/tests/phpunit/includes/upload/UploadTest.php b/tests/phpunit/includes/upload/UploadTest.php
index 69c29032..4293d23b 100644
--- a/tests/phpunit/includes/upload/UploadTest.php
+++ b/tests/phpunit/includes/upload/UploadTest.php
@@ -20,53 +20,14 @@ class UploadTest extends MediaWikiTestCase {
$wgHooks = $this->hooks;
}
- /**
- * Test various forms of valid and invalid titles that can be supplied.
- */
- public function testTitleValidation() {
-
-
- /* Test a valid title */
- $this->assertUploadTitleAndCode( 'ValidTitle.jpg',
- 'ValidTitle.jpg', UploadBase::OK,
- 'upload valid title' );
-
- /* A title with a slash */
- $this->assertUploadTitleAndCode( 'A/B.jpg',
- 'B.jpg', UploadBase::OK,
- 'upload title with slash' );
-
- /* A title with illegal char */
- $this->assertUploadTitleAndCode( 'A:B.jpg',
- 'A-B.jpg', UploadBase::OK,
- 'upload title with colon' );
-
- /* Stripping leading File: prefix */
- $this->assertUploadTitleAndCode( 'File:C.jpg',
- 'C.jpg', UploadBase::OK,
- 'upload title with File prefix' );
- /* Test illegal suggested title (r94601) */
- $this->assertUploadTitleAndCode( '%281%29.JPG',
- null, UploadBase::ILLEGAL_FILENAME,
- 'illegal title for upload' );
-
- /* A title without extension */
- $this->assertUploadTitleAndCode( 'A',
- null, UploadBase::FILETYPE_MISSING,
- 'upload title without extension' );
-
- /* A title with no basename */
- $this->assertUploadTitleAndCode( '.jpg',
- null, UploadBase::MIN_LENGTH_PARTNAME,
- 'upload title without basename' );
-
- }
/**
- * Helper function for testTitleValidation. First checks the return code
- * of UploadBase::getTitle() and then the actual returned titl
+ * First checks the return code
+ * of UploadBase::getTitle() and then the actual returned title
+ *
+ * @dataProvider dataTestTitleValidation
*/
- private function assertUploadTitleAndCode( $srcFilename, $dstFilename, $code, $msg ) {
+ public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
/* Check the result code */
$this->assertEquals( $code,
$this->upload->testTitleValidation( $srcFilename ),
@@ -79,6 +40,41 @@ class UploadTest extends MediaWikiTestCase {
"$msg text" );
}
}
+
+ /**
+ * Test various forms of valid and invalid titles that can be supplied.
+ */
+ public function dataTestTitleValidation() {
+ return array(
+ /* Test a valid title */
+ array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
+ 'upload valid title' ),
+ /* A title with a slash */
+ array( 'A/B.jpg', 'B.jpg', UploadBase::OK,
+ 'upload title with slash' ),
+ /* A title with illegal char */
+ array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
+ 'upload title with colon' ),
+ /* Stripping leading File: prefix */
+ array( 'File:C.jpg', 'C.jpg', UploadBase::OK,
+ 'upload title with File prefix' ),
+ /* Test illegal suggested title (r94601) */
+ array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME,
+ 'illegal title for upload' ),
+ /* A title without extension */
+ array( 'A', null, UploadBase::FILETYPE_MISSING,
+ 'upload title without extension' ),
+ /* A title with no basename */
+ array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME,
+ 'upload title without basename' ),
+ /* A title that is longer than 255 bytes */
+ array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
+ 'upload title longer than 255 bytes' ),
+ /* A title that is longer than 240 bytes */
+ array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
+ 'upload title longer than 240 bytes' ),
+ );
+ }
/**
* Test the upload verification functions
@@ -104,7 +100,7 @@ class UploadTest extends MediaWikiTestCase {
}
/**
- * test uploading a 100 bytes file with wgMaxUploadSize = 100
+ * test uploading a 100 bytes file with $wgMaxUploadSize = 100
*
* This method should be abstracted so we can test different settings.
*/
@@ -134,6 +130,7 @@ class UploadTestHandler extends UploadBase {
public function testTitleValidation( $name ) {
$this->mTitle = false;
$this->mDesiredDestName = $name;
+ $this->mTitleError = UploadBase::OK;
$this->getTitle();
return $this->mTitleError;
}
diff --git a/tests/phpunit/languages/LanguageAmTest.php b/tests/phpunit/languages/LanguageAmTest.php
new file mode 100644
index 00000000..3a648ded
--- /dev/null
+++ b/tests/phpunit/languages/LanguageAmTest.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageAm.php */
+class LanguageAmTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Am' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageArTest.php b/tests/phpunit/languages/LanguageArTest.php
new file mode 100644
index 00000000..b23e0534
--- /dev/null
+++ b/tests/phpunit/languages/LanguageArTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Based on LanguagMlTest
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageAr.php */
+class LanguageArTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Ar' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ function testFormatNum() {
+ $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->lang->formatNum( '1234567' ) );
+ $this->assertEquals( '-١٢٫٨٩', $this->lang->formatNum( -12.89 ) );
+ }
+
+ /**
+ * Mostly to test the raw ascii feature.
+ * @dataProvider providerSprintfDate
+ */
+ function testSprintfDate( $format, $date, $expected ) {
+ $this->assertEquals( $expected, $this->lang->sprintfDate( $format, $date ) );
+ }
+
+ function providerSprintfDate() {
+ return array(
+ array(
+ 'xg "vs" g',
+ '20120102030410',
+ 'يناير vs ٣'
+ ),
+ array(
+ 'xmY',
+ '20120102030410',
+ '١٤٣٣'
+ ),
+ array(
+ 'xnxmY',
+ '20120102030410',
+ '1433'
+ ),
+ array(
+ 'xN xmj xmn xN xmY',
+ '20120102030410',
+ ' 7 2 ١٤٣٣'
+ ),
+ );
+ }
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providePlural() {
+ return array (
+ array( 'zero', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 9 ),
+ array( 'few', 110 ),
+ array( 'many', 11 ),
+ array( 'many', 15 ),
+ array( 'many', 99 ),
+ array( 'many', 9999 ),
+ array( 'other', 100 ),
+ array( 'other', 102 ),
+ array( 'other', 1000 ),
+ array( 'other', 1.7 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageBeTest.php b/tests/phpunit/languages/LanguageBeTest.php
new file mode 100644
index 00000000..735ccc63
--- /dev/null
+++ b/tests/phpunit/languages/LanguageBeTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageBe.php */
+class LanguageBeTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Be' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 1 ),
+ array( 'many', 11 ),
+ array( 'one', 91 ),
+ array( 'one', 121 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'few', 334 ),
+ array( 'many', 5 ),
+ array( 'many', 15 ),
+ array( 'many', 120 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageBe_taraskTest.php b/tests/phpunit/languages/LanguageBe_taraskTest.php
index e7fdb7ca..765cdb8f 100644
--- a/tests/phpunit/languages/LanguageBe_taraskTest.php
+++ b/tests/phpunit/languages/LanguageBe_taraskTest.php
@@ -27,4 +27,39 @@ class LanguageBeTaraskTest extends MediaWikiTestCase {
function testDoesNotCommafyFourDigitsNumber() {
$this->assertEquals( '1234', $this->lang->commafy( '1234' ) );
}
+ /** @dataProvider providePluralFourForms */
+ function testPluralFourForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePluralFourForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'many', 11 ),
+ array( 'one', 91 ),
+ array( 'one', 121 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'few', 334 ),
+ array( 'many', 5 ),
+ array( 'many', 15 ),
+ array( 'many', 120 ),
+ );
+ }
+ /** @dataProvider providePluralTwoForms */
+ function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'several' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providePluralTwoForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'several', 11 ),
+ array( 'several', 91 ),
+ array( 'several', 121 ),
+ );
+ }
+
}
diff --git a/tests/phpunit/languages/LanguageBhTest.php b/tests/phpunit/languages/LanguageBhTest.php
new file mode 100644
index 00000000..e1e2a13e
--- /dev/null
+++ b/tests/phpunit/languages/LanguageBhTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageBh.php */
+class LanguageBhTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Bh' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageBsTest.php b/tests/phpunit/languages/LanguageBsTest.php
new file mode 100644
index 00000000..b6631c03
--- /dev/null
+++ b/tests/phpunit/languages/LanguageBsTest.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageBs.php */
+class LanguageBsTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Bs' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'many', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 4 ),
+ array( 'many', 5 ),
+ array( 'many', 11 ),
+ array( 'many', 20 ),
+ array( 'one', 21 ),
+ array( 'few', 24 ),
+ array( 'many', 25 ),
+ array( 'many', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageCsTest.php b/tests/phpunit/languages/LanguageCsTest.php
new file mode 100644
index 00000000..dda29f9a
--- /dev/null
+++ b/tests/phpunit/languages/LanguageCsTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/Languagecs.php */
+class LanguageCsTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'cs' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'other', 5 ),
+ array( 'other', 11 ),
+ array( 'other', 20 ),
+ array( 'other', 25 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageCuTest.php b/tests/phpunit/languages/LanguageCuTest.php
new file mode 100644
index 00000000..f8186d7b
--- /dev/null
+++ b/tests/phpunit/languages/LanguageCuTest.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageCu.php */
+class LanguageCuTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'cu' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'many', 3 ),
+ array( 'many', 4 ),
+ array( 'other', 5 ),
+ array( 'one', 11 ),
+ array( 'other', 20 ),
+ array( 'few', 22 ),
+ array( 'many', 223 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageCyTest.php b/tests/phpunit/languages/LanguageCyTest.php
new file mode 100644
index 00000000..e9f9e410
--- /dev/null
+++ b/tests/phpunit/languages/LanguageCyTest.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageCy.php */
+class LanguageCyTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'cy' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'zero', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'few', 3 ),
+ array( 'many', 6 ),
+ array( 'other', 4 ),
+ array( 'other', 5 ),
+ array( 'other', 11 ),
+ array( 'other', 20 ),
+ array( 'other', 22 ),
+ array( 'other', 223 ),
+ array( 'other', 200.00 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageDsbTest.php b/tests/phpunit/languages/LanguageDsbTest.php
new file mode 100644
index 00000000..ab7f9313
--- /dev/null
+++ b/tests/phpunit/languages/LanguageDsbTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageDsb.php */
+class LanguageDsbTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'dsb' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'one', 101 ),
+ array( 'one', 90001 ),
+ array( 'two', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 203 ),
+ array( 'few', 4 ),
+ array( 'other', 99 ),
+ array( 'other', 555 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageFrTest.php b/tests/phpunit/languages/LanguageFrTest.php
new file mode 100644
index 00000000..8538744e
--- /dev/null
+++ b/tests/phpunit/languages/LanguageFrTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageFr.php */
+class LanguageFrTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'fr' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageGaTest.php b/tests/phpunit/languages/LanguageGaTest.php
new file mode 100644
index 00000000..fbd9f11d
--- /dev/null
+++ b/tests/phpunit/languages/LanguageGaTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageGa.php */
+class LanguageGaTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'ga' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageGdTest.php b/tests/phpunit/languages/LanguageGdTest.php
new file mode 100644
index 00000000..24574bda
--- /dev/null
+++ b/tests/phpunit/languages/LanguageGdTest.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageGd.php */
+class LanguageGdTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'gd' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ // The CLDR ticket for this plural forms is not same as mw plural forms. See http://unicode.org/cldr/trac/ticket/2883
+ $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4', 'Form 5', 'Form 6' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providerPlural() {
+ return array (
+ array( 'Form 6', 0 ),
+ array( 'Form 1', 1 ),
+ array( 'Form 2', 2 ),
+ array( 'Form 3', 11 ),
+ array( 'Form 4', 12 ),
+ array( 'Form 5', 3 ),
+ array( 'Form 5', 19 ),
+ array( 'Form 6', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageGvTest.php b/tests/phpunit/languages/LanguageGvTest.php
new file mode 100644
index 00000000..3d298b9b
--- /dev/null
+++ b/tests/phpunit/languages/LanguageGvTest.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageGv.php */
+class LanguageGvTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'gv' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ 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
+ $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providerPlural() {
+ return array (
+ array( 'Form 4', 0 ),
+ array( 'Form 2', 1 ),
+ array( 'Form 3', 2 ),
+ array( 'Form 4', 3 ),
+ array( 'Form 1', 20 ),
+ array( 'Form 2', 21 ),
+ array( 'Form 3', 22 ),
+ array( 'Form 4', 23 ),
+ array( 'Form 4', 50 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageHeTest.php b/tests/phpunit/languages/LanguageHeTest.php
new file mode 100644
index 00000000..9ac0f952
--- /dev/null
+++ b/tests/phpunit/languages/LanguageHeTest.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageHe.php */
+class LanguageHeTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'he' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPluralDual */
+ function testPluralDual( $result, $value ) {
+ $forms = array( 'one', 'many', 'two' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralDual() {
+ return array (
+ array( 'many', 0 ), // Zero -> plural
+ array( 'one', 1 ), // Singular
+ array( 'two', 2 ), // Dual
+ array( 'many', 3 ), // Plural
+ );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'many', 0 ), // Zero -> plural
+ array( 'one', 1 ), // Singular
+ array( 'many', 2 ), // Plural, no dual provided
+ array( 'many', 3 ), // Plural
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageHiTest.php b/tests/phpunit/languages/LanguageHiTest.php
new file mode 100644
index 00000000..ead9e020
--- /dev/null
+++ b/tests/phpunit/languages/LanguageHiTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageHi.php */
+class LanguageHiTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Hi' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageHrTest.php b/tests/phpunit/languages/LanguageHrTest.php
new file mode 100644
index 00000000..4f1c66bf
--- /dev/null
+++ b/tests/phpunit/languages/LanguageHrTest.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageHr.php */
+class LanguageHrTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'hr' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'many', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 4 ),
+ array( 'many', 5 ),
+ array( 'many', 11 ),
+ array( 'many', 20 ),
+ array( 'one', 21 ),
+ array( 'few', 24 ),
+ array( 'many', 25 ),
+ array( 'many', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageHsbTest.php b/tests/phpunit/languages/LanguageHsbTest.php
new file mode 100644
index 00000000..803c7721
--- /dev/null
+++ b/tests/phpunit/languages/LanguageHsbTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageHsb.php */
+class LanguageHsbTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'hsb' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'one', 101 ),
+ array( 'one', 90001 ),
+ array( 'two', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 203 ),
+ array( 'few', 4 ),
+ array( 'other', 99 ),
+ array( 'other', 555 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageHyTest.php b/tests/phpunit/languages/LanguageHyTest.php
new file mode 100644
index 00000000..7990bdfc
--- /dev/null
+++ b/tests/phpunit/languages/LanguageHyTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageHy.php */
+class LanguageHyTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'hy' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageKshTest.php b/tests/phpunit/languages/LanguageKshTest.php
new file mode 100644
index 00000000..ab889464
--- /dev/null
+++ b/tests/phpunit/languages/LanguageKshTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageKsh.php */
+class LanguageKshTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'ksh' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other', 'zero' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'zero', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageLnTest.php b/tests/phpunit/languages/LanguageLnTest.php
new file mode 100644
index 00000000..0fd9167e
--- /dev/null
+++ b/tests/phpunit/languages/LanguageLnTest.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageLn.php */
+class LanguageLnTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'ln' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageLtTest.php b/tests/phpunit/languages/LanguageLtTest.php
new file mode 100644
index 00000000..0d7c7d3e
--- /dev/null
+++ b/tests/phpunit/languages/LanguageLtTest.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageLt.php */
+class LanguageLtTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Lt' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider provideOneFewOtherCases */
+ function testOneFewOtherPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ /** @dataProvider provideOneFewCases */
+ function testOneFewPlural( $result, $value ) {
+ $forms = array( 'one', 'few' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function provideOneFewOtherCases() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 9 ),
+ array( 'other', 10 ),
+ array( 'other', 11 ),
+ array( 'other', 20 ),
+ array( 'one', 21 ),
+ array( 'few', 32 ),
+ array( 'one', 41 ),
+ array( 'one', 40001 ),
+ );
+ }
+
+ function provideOneFewCases() {
+ return array (
+ array( 'one', 1 ),
+ array( 'few', 15 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageLvTest.php b/tests/phpunit/languages/LanguageLvTest.php
new file mode 100644
index 00000000..0636da5f
--- /dev/null
+++ b/tests/phpunit/languages/LanguageLvTest.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageLv.php */
+class LanguageLvTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'lv' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ), #this must be zero form as per CLDR
+ array( 'one', 1 ),
+ array( 'other', 11 ),
+ array( 'one', 21 ),
+ array( 'other', 411 ),
+ array( 'other', 12.345 ),
+ array( 'other', 20 ),
+ array( 'one', 31 ),
+ array( 'other', 200 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageMgTest.php b/tests/phpunit/languages/LanguageMgTest.php
new file mode 100644
index 00000000..06b56547
--- /dev/null
+++ b/tests/phpunit/languages/LanguageMgTest.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMg.php */
+class LanguageMgTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'mg' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 200 ),
+ array( 'other', 123.3434 ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/languages/LanguageMkTest.php b/tests/phpunit/languages/LanguageMkTest.php
new file mode 100644
index 00000000..cf5ec3d9
--- /dev/null
+++ b/tests/phpunit/languages/LanguageMkTest.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMk.php */
+class LanguageMkTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'mk' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 11 ),
+ array( 'one', 21 ),
+ array( 'other', 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
new file mode 100644
index 00000000..8c4b0b2f
--- /dev/null
+++ b/tests/phpunit/languages/LanguageMlTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2011, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageMl.php */
+class LanguageMlTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Ml' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** see bug 29495 */
+ /** @dataProvider providerFormatNum*/
+ function testFormatNum( $result, $value ) {
+ $this->assertEquals( $result, $this->lang->formatNum( $value ) );
+ }
+
+ function providerFormatNum() {
+ return array(
+ array( '12,34,567', '1234567' ),
+ array( '12,345', '12345' ),
+ array( '1', '1' ),
+ array( '123', '123' ) ,
+ array( '1,234', '1234' ),
+ array( '12,345.56', '12345.56' ),
+ array( '12,34,56,79,81,23,45,678', '12345679812345678' ),
+ array( '.12345', '.12345' ),
+ array( '-12,00,000', '-1200000' ),
+ array( '-98', '-98' ),
+ array( '-98', -98 ),
+ array( '-1,23,45,678', -12345678 ),
+ array( '', '' ),
+ array( '', null ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageMoTest.php b/tests/phpunit/languages/LanguageMoTest.php
new file mode 100644
index 00000000..533e590f
--- /dev/null
+++ b/tests/phpunit/languages/LanguageMoTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMo.php */
+class LanguageMoTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'mo' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'few', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 19 ),
+ array( 'other', 20 ),
+ array( 'other', 99 ),
+ array( 'other', 100 ),
+ array( 'few', 101 ),
+ array( 'few', 119 ),
+ array( 'other', 120 ),
+ array( 'other', 200 ),
+ array( 'few', 201 ),
+ array( 'few', 219 ),
+ array( 'other', 220 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageMtTest.php b/tests/phpunit/languages/LanguageMtTest.php
new file mode 100644
index 00000000..421bb388
--- /dev/null
+++ b/tests/phpunit/languages/LanguageMtTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageMt.php */
+class LanguageMtTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'mt' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPluralAllForms */
+ function testPluralAllForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralAllForms() {
+ return array (
+ array( 'few', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 10 ),
+ array( 'many', 11 ),
+ array( 'many', 19 ),
+ array( 'other', 20 ),
+ array( 'other', 99 ),
+ array( 'other', 100 ),
+ array( 'other', 101 ),
+ array( 'few', 102 ),
+ array( 'few', 110 ),
+ array( 'many', 111 ),
+ array( 'many', 119 ),
+ array( 'other', 120 ),
+ array( 'other', 201 ),
+ );
+ }
+
+ /** @dataProvider providerPluralTwoForms */
+ function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralTwoForms() {
+ return array (
+ array( 'many', 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 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageNlTest.php b/tests/phpunit/languages/LanguageNlTest.php
new file mode 100644
index 00000000..cf979cd2
--- /dev/null
+++ b/tests/phpunit/languages/LanguageNlTest.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2011, Santhosh Thottingal
+ * @file
+ */
+
+/** Tests for MediaWiki languages/LanguageNl.php */
+class LanguageNlTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Nl' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ function testFormatNum() {
+ $this->assertEquals( '1.234.567', $this->lang->formatNum( '1234567' ) );
+ $this->assertEquals( '12.345', $this->lang->formatNum( '12345' ) );
+ $this->assertEquals( '1', $this->lang->formatNum( '1' ) );
+ $this->assertEquals( '123', $this->lang->formatNum( '123' ) );
+ $this->assertEquals( '1.234', $this->lang->formatNum( '1234' ) );
+ $this->assertEquals( '12.345,56', $this->lang->formatNum( '12345.56' ) );
+ $this->assertEquals( ',1234556', $this->lang->formatNum( '.1234556' ) );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageNsoTest.php b/tests/phpunit/languages/LanguageNsoTest.php
new file mode 100644
index 00000000..ea393628
--- /dev/null
+++ b/tests/phpunit/languages/LanguageNsoTest.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageNso.php */
+class LanguageNsoTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'nso' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'many', 2 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguagePlTest.php b/tests/phpunit/languages/LanguagePlTest.php
new file mode 100644
index 00000000..e56d4b77
--- /dev/null
+++ b/tests/phpunit/languages/LanguagePlTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguagePl.php */
+class LanguagePlTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'pl' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPluralFourForms */
+ function testPluralFourForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralFourForms() {
+ return array (
+ array( 'many', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'many', 5 ),
+ array( 'many', 9 ),
+ array( 'many', 10 ),
+ array( 'many', 11 ),
+ array( 'many', 21 ),
+ array( 'few', 22 ),
+ array( 'few', 23 ),
+ array( 'few', 24 ),
+ array( 'many', 25 ),
+ array( 'many', 200 ),
+ array( 'many', 201 ),
+ );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'many', 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 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageRoTest.php b/tests/phpunit/languages/LanguageRoTest.php
new file mode 100644
index 00000000..5270f6fe
--- /dev/null
+++ b/tests/phpunit/languages/LanguageRoTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageRo.php */
+class LanguageRoTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'ro' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'few', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 19 ),
+ array( 'other', 20 ),
+ array( 'other', 99 ),
+ array( 'other', 100 ),
+ array( 'few', 101 ),
+ array( 'few', 119 ),
+ array( 'other', 120 ),
+ array( 'other', 200 ),
+ array( 'few', 201 ),
+ array( 'few', 219 ),
+ array( 'other', 220 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageRuTest.php b/tests/phpunit/languages/LanguageRuTest.php
new file mode 100644
index 00000000..7a1f193b
--- /dev/null
+++ b/tests/phpunit/languages/LanguageRuTest.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * based on LanguageBe_tarask.php
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageRu.php */
+class LanguageRuTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'ru' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePluralFourForms */
+ function testPluralFourForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePluralFourForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'many', 11 ),
+ array( 'one', 91 ),
+ array( 'one', 121 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'few', 334 ),
+ array( 'many', 5 ),
+ array( 'many', 15 ),
+ array( 'many', 120 ),
+ );
+ }
+ /** @dataProvider providePluralTwoForms */
+ function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'several' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providePluralTwoForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'several', 11 ),
+ array( 'several', 91 ),
+ array( 'several', 121 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageSeTest.php b/tests/phpunit/languages/LanguageSeTest.php
new file mode 100644
index 00000000..065ec29e
--- /dev/null
+++ b/tests/phpunit/languages/LanguageSeTest.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSe.php */
+class LanguageSeTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'se' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPluralThreeForms */
+ function testPluralThreeForms( $result, $value ) {
+ $forms = array( 'one', 'two', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralThreeForms() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'other', 3 ),
+ );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 3 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageSgsTest.php b/tests/phpunit/languages/LanguageSgsTest.php
new file mode 100644
index 00000000..931c82f0
--- /dev/null
+++ b/tests/phpunit/languages/LanguageSgsTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSgs.php */
+class LanguageSgsTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Sgs' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePluralAllForms */
+ function testPluralAllForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePluralAllForms() {
+ return array (
+ array( 'many', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'other', 3 ),
+ array( 'many', 10 ),
+ array( 'many', 11 ),
+ array( 'many', 12 ),
+ array( 'many', 19 ),
+ array( 'other', 20 ),
+ array( 'many', 100 ),
+ array( 'one', 101 ),
+ array( 'many', 111 ),
+ array( 'many', 112 ),
+ );
+ }
+
+ /** @dataProvider providePluralTwoForms */
+ function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePluralTwoForms() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 3 ),
+ array( 'other', 10 ),
+ array( 'other', 11 ),
+ array( 'other', 12 ),
+ array( 'other', 19 ),
+ array( 'other', 20 ),
+ array( 'other', 100 ),
+ array( 'one', 101 ),
+ array( 'other', 111 ),
+ array( 'other', 112 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageShTest.php b/tests/phpunit/languages/LanguageShTest.php
new file mode 100644
index 00000000..b8169aed
--- /dev/null
+++ b/tests/phpunit/languages/LanguageShTest.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSh.php */
+class LanguageShTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'sh' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'many', 0 ),
+ array( 'one', 1 ),
+ array( 'many', 2 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageSkTest.php b/tests/phpunit/languages/LanguageSkTest.php
new file mode 100644
index 00000000..4cfd840e
--- /dev/null
+++ b/tests/phpunit/languages/LanguageSkTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * based on LanguageSkTest.php
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSk.php */
+class LanguageSkTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'sk' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'other', 5 ),
+ array( 'other', 11 ),
+ array( 'other', 20 ),
+ array( 'other', 25 ),
+ array( 'other', 200 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageSlTest.php b/tests/phpunit/languages/LanguageSlTest.php
new file mode 100644
index 00000000..c1f75691
--- /dev/null
+++ b/tests/phpunit/languages/LanguageSlTest.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @author Santhosh Thottingal
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * based on LanguageSkTest.php
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSl.php */
+class LanguageSlTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'sl' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'few', 'other', 'zero' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'zero', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'other', 5 ),
+ array( 'other', 99 ),
+ array( 'other', 100 ),
+ array( 'one', 101 ),
+ array( 'two', 102 ),
+ array( 'few', 103 ),
+ array( 'one', 201 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageSmaTest.php b/tests/phpunit/languages/LanguageSmaTest.php
new file mode 100644
index 00000000..b7e72e97
--- /dev/null
+++ b/tests/phpunit/languages/LanguageSmaTest.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageSma.php */
+class LanguageSmaTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'sma' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPluralThreeForms */
+ function testPluralThreeForms( $result, $value ) {
+ $forms = array( 'one', 'two', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPluralThreeForms() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'other', 3 ),
+ );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'other', 2 ),
+ array( 'other', 3 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageSrTest.php b/tests/phpunit/languages/LanguageSrTest.php
new file mode 100644
index 00000000..a50547c6
--- /dev/null
+++ b/tests/phpunit/languages/LanguageSrTest.php
@@ -0,0 +1,199 @@
+<?php
+/**
+ * PHPUnit tests for the Serbian language.
+ * The language can be represented using two scripts:
+ * - Latin (SR_el)
+ * - Cyrillic (SR_ec)
+ * Both representations seems to be bijective, hence MediaWiki can convert
+ * from one script to the other.
+ *
+ * @author Antoine Musso <hashar at free dot fr>
+ * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
+ * @file
+ */
+
+require_once dirname( dirname( __FILE__ ) ) . '/bootstrap.php';
+
+/** Tests for MediaWiki languages/LanguageTr.php */
+class LanguageSrTest extends MediaWikiTestCase {
+ /* Language object. Initialized before each test */
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'sr' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ ##### TESTS #######################################################
+
+ function testEasyConversions( ) {
+ $this->assertCyrillic(
+ 'шђчћжШЂЧЋЖ',
+ 'Cyrillic guessing characters'
+ );
+ $this->assertLatin(
+ 'Å¡Ä‘Ä枊ÄČĆŽ',
+ 'Latin guessing characters'
+ );
+ }
+
+ function testMixedConversions() {
+ $this->assertCyrillic(
+ 'шђчћжШЂЧЋЖ - Å¡Ä‘Äćž',
+ 'Mostly cyrillic characters'
+ );
+ $this->assertLatin(
+ 'Å¡Ä‘Ä枊ÄČĆŽ - шђчћж',
+ 'Mostly latin characters'
+ );
+ }
+
+ function testSameAmountOfLatinAndCyrillicGetConverted() {
+ $this->assertConverted(
+ '4 latin: Å¡Ä‘Äć | 4 cyrillic: шђчћ',
+ 'sr-ec'
+ );
+ $this->assertConverted(
+ '4 latin: Å¡Ä‘Äć | 4 cyrillic: шђчћ',
+ 'sr-el'
+ );
+ }
+
+ /**
+ * @author Nikola Smolenski
+ */
+ function testConversionToCyrillic() {
+ $this->assertEquals( 'абвг',
+ $this->convertToCyrillic( 'abvg' )
+ );
+ $this->assertEquals( 'абвг',
+ $this->convertToCyrillic( 'абвг' )
+ );
+ $this->assertEquals( 'abvgшђжчћ',
+ $this->convertToCyrillic( 'abvgшђжчћ' )
+ );
+ $this->assertEquals( 'абвгшђжчћ',
+ $this->convertToCyrillic( 'абвгšđžÄć' )
+ );
+ // Roman numerals are not converted
+ $this->assertEquals( 'а I б II в III г IV шђжчћ',
+ $this->convertToCyrillic( 'a I b II v III g IV šđžÄć' )
+ );
+ }
+
+ function testConversionToLatin() {
+ $this->assertEquals( 'abcd',
+ $this->convertToLatin( 'abcd' )
+ );
+ $this->assertEquals( 'abcd',
+ $this->convertToLatin( 'абцд' )
+ );
+ $this->assertEquals( 'abcdšđžÄć',
+ $this->convertToLatin( 'abcdшђжчћ' )
+ );
+ $this->assertEquals( 'абцдšđžÄć',
+ $this->convertToLatin( 'абцдšđžÄć' )
+ );
+ }
+
+ /** @dataProvider providePluralFourForms */
+ function testPluralFourForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePluralFourForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'many', 11 ),
+ array( 'one', 91 ),
+ array( 'one', 121 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'few', 334 ),
+ array( 'many', 5 ),
+ array( 'many', 15 ),
+ array( 'many', 120 ),
+ );
+ }
+ /** @dataProvider providePluralTwoForms */
+ function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'several' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providePluralTwoForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'several', 11 ),
+ array( 'several', 91 ),
+ array( 'several', 121 ),
+ );
+ }
+
+ ##### HELPERS #####################################################
+ /**
+ *Wrapper to verify text stay the same after applying conversion
+ * @param $text string Text to convert
+ * @param $variant string Language variant 'sr-ec' or 'sr-el'
+ * @param $msg string Optional message
+ */
+ function assertUnConverted( $text, $variant, $msg = '' ) {
+ $this->assertEquals(
+ $text,
+ $this->convertTo( $text, $variant ),
+ $msg
+ );
+ }
+ /**
+ * Wrapper to verify a text is different once converted to a variant.
+ * @param $text string Text to convert
+ * @param $variant string Language variant 'sr-ec' or 'sr-el'
+ * @param $msg string Optional message
+ */
+ function assertConverted( $text, $variant, $msg = '' ) {
+ $this->assertNotEquals(
+ $text,
+ $this->convertTo( $text, $variant ),
+ $msg
+ );
+ }
+
+ /**
+ * Verifiy the given Cyrillic text is not converted when using
+ * using the cyrillic variant and converted to Latin when using
+ * the Latin variant.
+ */
+ function assertCyrillic( $text, $msg = '' ) {
+ $this->assertUnConverted( $text, 'sr-ec', $msg );
+ $this->assertConverted( $text, 'sr-el', $msg );
+ }
+ /**
+ * Verifiy the given Latin text is not converted when using
+ * using the Latin variant and converted to Cyrillic when using
+ * the Cyrillic variant.
+ */
+ 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 ) {
+ return $this
+ ->lang
+ ->mConverter
+ ->convertTo(
+ $text, $variant
+ );
+ }
+ function convertToCyrillic( $text ) {
+ return $this->convertTo( $text, 'sr-ec' );
+ }
+ function convertToLatin( $text ) {
+ return $this->convertTo( $text, 'sr-el' );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php
index aaad9c31..c83e01ea 100644
--- a/tests/phpunit/languages/LanguageTest.php
+++ b/tests/phpunit/languages/LanguageTest.php
@@ -1,6 +1,10 @@
<?php
class LanguageTest extends MediaWikiTestCase {
+
+ /**
+ * @var Language
+ */
private $lang;
function setUp() {
@@ -19,97 +23,46 @@ class LanguageTest extends MediaWikiTestCase {
'convertDoubleWidth() with the full alphabet and digits'
);
}
-
- function testFormatTimePeriod() {
- $this->assertEquals(
- "9.5s",
- $this->lang->formatTimePeriod( 9.45 ),
- 'formatTimePeriod() rounding (<10s)'
- );
-
- $this->assertEquals(
- "10s",
- $this->lang->formatTimePeriod( 9.95 ),
- 'formatTimePeriod() rounding (<10s)'
- );
-
- $this->assertEquals(
- "1m 0s",
- $this->lang->formatTimePeriod( 59.55 ),
- 'formatTimePeriod() rounding (<60s)'
- );
-
- $this->assertEquals(
- "2m 0s",
- $this->lang->formatTimePeriod( 119.55 ),
- 'formatTimePeriod() rounding (<1h)'
- );
-
- $this->assertEquals(
- "1h 0m 0s",
- $this->lang->formatTimePeriod( 3599.55 ),
- 'formatTimePeriod() rounding (<1h)'
- );
-
- $this->assertEquals(
- "2h 0m 0s",
- $this->lang->formatTimePeriod( 7199.55 ),
- 'formatTimePeriod() rounding (>=1h)'
- );
-
- $this->assertEquals(
- "2h 0m",
- $this->lang->formatTimePeriod( 7199.55, 'avoidseconds' ),
- 'formatTimePeriod() rounding (>=1h), avoidseconds'
- );
-
- $this->assertEquals(
- "2h 0m",
- $this->lang->formatTimePeriod( 7199.55, 'avoidminutes' ),
- 'formatTimePeriod() rounding (>=1h), avoidminutes'
- );
-
- $this->assertEquals(
- "48h 0m",
- $this->lang->formatTimePeriod( 172799.55, 'avoidseconds' ),
- 'formatTimePeriod() rounding (=48h), avoidseconds'
- );
-
- $this->assertEquals(
- "3d 0h",
- $this->lang->formatTimePeriod( 259199.55, 'avoidminutes' ),
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- );
-
- $this->assertEquals(
- "2d 1h 0m",
- $this->lang->formatTimePeriod( 176399.55, 'avoidseconds' ),
- 'formatTimePeriod() rounding (>48h), avoidseconds'
- );
-
- $this->assertEquals(
- "2d 1h",
- $this->lang->formatTimePeriod( 176399.55, 'avoidminutes' ),
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- );
-
- $this->assertEquals(
- "3d 0h 0m",
- $this->lang->formatTimePeriod( 259199.55, 'avoidseconds' ),
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- );
-
- $this->assertEquals(
- "2d 0h 0m",
- $this->lang->formatTimePeriod( 172801.55, 'avoidseconds' ),
- 'formatTimePeriod() rounding, (>48h), avoidseconds'
- );
-
- $this->assertEquals(
- "2d 1h 1m 1s",
- $this->lang->formatTimePeriod( 176460.55 ),
- 'formatTimePeriod() rounding, recursion, (>48h)'
+
+ /** @dataProvider provideFormattableTimes */
+ function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
+ $this->assertEquals( $expected, $this->lang->formatTimePeriod( $seconds, $format ), $desc );
+ }
+
+ function provideFormattableTimes() {
+ return array(
+ array( 9.45, array(), '9.5s', 'formatTimePeriod() rounding (<10s)' ),
+ array( 9.45, array( 'noabbrevs' => true ), '9.5 seconds', 'formatTimePeriod() rounding (<10s)' ),
+ array( 9.95, array(), '10s', 'formatTimePeriod() rounding (<10s)' ),
+ array( 9.95, array( 'noabbrevs' => true ), '10 seconds', 'formatTimePeriod() rounding (<10s)' ),
+ array( 59.55, array(), '1m 0s', 'formatTimePeriod() rounding (<60s)' ),
+ array( 59.55, array( 'noabbrevs' => true ), '1 minute 0 seconds', 'formatTimePeriod() rounding (<60s)' ),
+ array( 119.55, array(), '2m 0s', 'formatTimePeriod() rounding (<1h)' ),
+ array( 119.55, array( 'noabbrevs' => true ), '2 minutes 0 seconds', 'formatTimePeriod() rounding (<1h)' ),
+ array( 3599.55, array(), '1h 0m 0s', 'formatTimePeriod() rounding (<1h)' ),
+ array( 3599.55, array( 'noabbrevs' => true ), '1 hour 0 minutes 0 seconds', 'formatTimePeriod() rounding (<1h)' ),
+ array( 7199.55, array(), '2h 0m 0s', 'formatTimePeriod() rounding (>=1h)' ),
+ array( 7199.55, array( 'noabbrevs' => true ), '2 hours 0 minutes 0 seconds', 'formatTimePeriod() rounding (>=1h)' ),
+ array( 7199.55, 'avoidseconds', '2h 0m', 'formatTimePeriod() rounding (>=1h), avoidseconds' ),
+ array( 7199.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '2 hours 0 minutes', 'formatTimePeriod() rounding (>=1h), avoidseconds' ),
+ array( 7199.55, 'avoidminutes', '2h 0m', 'formatTimePeriod() rounding (>=1h), avoidminutes' ),
+ array( 7199.55, array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ), '2 hours 0 minutes', 'formatTimePeriod() rounding (>=1h), avoidminutes' ),
+ array( 172799.55, 'avoidseconds', '48h 0m', 'formatTimePeriod() rounding (=48h), avoidseconds' ),
+ array( 172799.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '48 hours 0 minutes', 'formatTimePeriod() rounding (=48h), avoidseconds' ),
+ array( 259199.55, 'avoidminutes', '3d 0h', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
+ array( 259199.55, array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ), '3 days 0 hours', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
+ array( 176399.55, 'avoidseconds', '2d 1h 0m', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
+ array( 176399.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '2 days 1 hour 0 minutes', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
+ array( 176399.55, 'avoidminutes', '2d 1h', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
+ array( 176399.55, array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ), '2 days 1 hour', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
+ array( 259199.55, 'avoidseconds', '3d 0h 0m', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
+ array( 259199.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '3 days 0 hours 0 minutes', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
+ array( 172801.55, 'avoidseconds', '2d 0h 0m', 'formatTimePeriod() rounding, (>48h), avoidseconds' ),
+ array( 172801.55, array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ), '2 days 0 hours 0 minutes', 'formatTimePeriod() rounding, (>48h), avoidseconds' ),
+ array( 176460.55, array(), '2d 1h 1m 1s', 'formatTimePeriod() rounding, recursion, (>48h)' ),
+ array( 176460.55, array( 'noabbrevs' => true ), '2 days 1 hour 1 minute 1 second', 'formatTimePeriod() rounding, recursion, (>48h)' ),
);
+
}
function testTruncate() {
@@ -243,4 +196,462 @@ class LanguageTest extends MediaWikiTestCase {
array( 'Be-x-old', 'With extension (two dashes)' ),
);
}
+
+ /**
+ * @dataProvider provideSprintfDateSamples
+ */
+ function testSprintfDate( $format, $ts, $expected, $msg ) {
+ $this->assertEquals(
+ $expected,
+ $this->lang->sprintfDate( $format, $ts ),
+ "sprintfDate('$format', '$ts'): $msg"
+ );
+ }
+ /**
+ * bug 33454. sprintfDate should always use UTC.
+ * @dataProvider provideSprintfDateSamples
+ */
+ function testSprintfDateTZ( $format, $ts, $expected, $msg ) {
+ $oldTZ = date_default_timezone_get();
+ $res = date_default_timezone_set( 'Asia/Seoul' );
+ if ( !$res ) {
+ $this->markTestSkipped( "Error setting Timezone" );
+ }
+
+ $this->assertEquals(
+ $expected,
+ $this->lang->sprintfDate( $format, $ts ),
+ "sprintfDate('$format', '$ts'): $msg"
+ );
+
+ date_default_timezone_set( $oldTZ );
+ }
+
+ function provideSprintfDateSamples() {
+ return array(
+ array(
+ 'xiY',
+ '20111212000000',
+ '1390', // note because we're testing English locale we get Latin-standard digits
+ 'Iranian calendar full year'
+ ),
+ array(
+ 'xiy',
+ '20111212000000',
+ '90',
+ 'Iranian calendar short year'
+ ),
+ array(
+ 'o',
+ '20120101235000',
+ '2011',
+ 'ISO 8601 (week) year'
+ ),
+ array(
+ 'W',
+ '20120101235000',
+ '52',
+ 'Week number'
+ ),
+ array(
+ 'W',
+ '20120102235000',
+ '1',
+ 'Week number'
+ ),
+ array(
+ 'o-\\WW-N',
+ '20091231235000',
+ '2009-W53-4',
+ 'leap week'
+ ),
+ // What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
+ array(
+ 'Y',
+ '20120102090705',
+ '2012',
+ 'Full year'
+ ),
+ array(
+ 'y',
+ '20120102090705',
+ '12',
+ '2 digit year'
+ ),
+ array(
+ 'L',
+ '20120102090705',
+ '1',
+ 'Leap year'
+ ),
+ array(
+ 'n',
+ '20120102090705',
+ '1',
+ 'Month index, not zero pad'
+ ),
+ array(
+ 'N',
+ '20120102090705',
+ '01',
+ 'Month index. Zero pad'
+ ),
+ array(
+ 'M',
+ '20120102090705',
+ 'Jan',
+ 'Month abbrev'
+ ),
+ array(
+ 'F',
+ '20120102090705',
+ 'January',
+ 'Full month'
+ ),
+ array(
+ 'xg',
+ '20120102090705',
+ 'January',
+ 'Genitive month name (same in EN)'
+ ),
+ array(
+ 'j',
+ '20120102090705',
+ '2',
+ 'Day of month (not zero pad)'
+ ),
+ array(
+ 'd',
+ '20120102090705',
+ '02',
+ 'Day of month (zero-pad)'
+ ),
+ array(
+ 'z',
+ '20120102090705',
+ '1',
+ 'Day of year (zero-indexed)'
+ ),
+ array(
+ 'D',
+ '20120102090705',
+ 'Mon',
+ 'Day of week (abbrev)'
+ ),
+ array(
+ 'l',
+ '20120102090705',
+ 'Monday',
+ 'Full day of week'
+ ),
+ array(
+ 'N',
+ '20120101090705',
+ '7',
+ 'Day of week (Mon=1, Sun=7)'
+ ),
+ array(
+ 'w',
+ '20120101090705',
+ '0',
+ 'Day of week (Sun=0, Sat=6)'
+ ),
+ array(
+ 'N',
+ '20120102090705',
+ '1',
+ 'Day of week'
+ ),
+ array(
+ 'a',
+ '20120102090705',
+ 'am',
+ 'am vs pm'
+ ),
+ array(
+ 'A',
+ '20120102120000',
+ 'PM',
+ 'AM vs PM'
+ ),
+ array(
+ 'a',
+ '20120102000000',
+ 'am',
+ 'AM vs PM'
+ ),
+ array(
+ 'g',
+ '20120102090705',
+ '9',
+ '12 hour, not Zero'
+ ),
+ array(
+ 'h',
+ '20120102090705',
+ '09',
+ '12 hour, zero padded'
+ ),
+ array(
+ 'G',
+ '20120102090705',
+ '9',
+ '24 hour, not zero'
+ ),
+ array(
+ 'H',
+ '20120102090705',
+ '09',
+ '24 hour, zero'
+ ),
+ array(
+ 'H',
+ '20120102110705',
+ '11',
+ '24 hour, zero'
+ ),
+ array(
+ 'i',
+ '20120102090705',
+ '07',
+ 'Minutes'
+ ),
+ array(
+ 's',
+ '20120102090705',
+ '05',
+ 'seconds'
+ ),
+ array(
+ 'U',
+ '20120102090705',
+ '1325495225',
+ 'unix time'
+ ),
+ array(
+ 't',
+ '20120102090705',
+ '31',
+ 'Days in current month'
+ ),
+ array(
+ 'c',
+ '20120102090705',
+ '2012-01-02T09:07:05+00:00',
+ 'ISO 8601 timestamp'
+ ),
+ array(
+ 'r',
+ '20120102090705',
+ 'Mon, 02 Jan 2012 09:07:05 +0000',
+ 'RFC 5322'
+ ),
+ array(
+ 'xmj xmF xmn xmY',
+ '20120102090705',
+ '7 Safar 2 1433',
+ 'Islamic'
+ ),
+ array(
+ 'xij xiF xin xiY',
+ '20120102090705',
+ '12 Dey 10 1390',
+ 'Iranian'
+ ),
+ array(
+ 'xjj xjF xjn xjY',
+ '20120102090705',
+ '7 Tevet 4 5772',
+ 'Hebrew'
+ ),
+ array(
+ 'xjt',
+ '20120102090705',
+ '29',
+ 'Hebrew number of days in month'
+ ),
+ array(
+ 'xjx',
+ '20120102090705',
+ 'Tevet',
+ 'Hebrew genitive month name (No difference in EN)'
+ ),
+ array(
+ 'xkY',
+ '20120102090705',
+ '2555',
+ 'Thai year'
+ ),
+ array(
+ 'xoY',
+ '20120102090705',
+ '101',
+ 'Minguo'
+ ),
+ array(
+ 'xtY',
+ '20120102090705',
+ 'å¹³æˆ24',
+ 'nengo'
+ ),
+ array(
+ 'xrxkYY',
+ '20120102090705',
+ 'MMDLV2012',
+ 'Roman numerals'
+ ),
+ array(
+ 'xhxjYY',
+ '20120102090705',
+ 'ה\'תשע"ב2012',
+ 'Hebrew numberals'
+ ),
+ array(
+ 'xnY',
+ '20120102090705',
+ '2012',
+ 'Raw numerals (doesn\'t mean much in EN)'
+ ),
+ array(
+ '[[Y "(yea"\\r)]] \\"xx\\"',
+ '20120102090705',
+ '[[2012 (year)]] "x"',
+ 'Various escaping'
+ ),
+
+ );
+ }
+
+ /**
+ * @dataProvider provideFormatSizes
+ */
+ function testFormatSize( $size, $expected, $msg ) {
+ $this->assertEquals(
+ $expected,
+ $this->lang->formatSize( $size ),
+ "formatSize('$size'): $msg"
+ );
+ }
+
+ function provideFormatSizes() {
+ return array(
+ array(
+ 0,
+ "0 B",
+ "Zero bytes"
+ ),
+ array(
+ 1024,
+ "1 KB",
+ "1 kilobyte"
+ ),
+ array(
+ 1024 * 1024,
+ "1 MB",
+ "1,024 megabytes"
+ ),
+ array(
+ 1024 * 1024 * 1024,
+ "1 GB",
+ "1 gigabytes"
+ ),
+ array(
+ pow( 1024, 4 ),
+ "1 TB",
+ "1 terabyte"
+ ),
+ array(
+ pow( 1024, 5 ),
+ "1 PB",
+ "1 petabyte"
+ ),
+ array(
+ pow( 1024, 6 ),
+ "1 EB",
+ "1,024 exabyte"
+ ),
+ array(
+ pow( 1024, 7 ),
+ "1 ZB",
+ "1 zetabyte"
+ ),
+ array(
+ pow( 1024, 8 ),
+ "1 YB",
+ "1 yottabyte"
+ ),
+ // How big!? THIS BIG!
+ );
+ }
+
+ /**
+ * @dataProvider provideFormatBitrate
+ */
+ function testFormatBitrate( $bps, $expected, $msg ) {
+ $this->assertEquals(
+ $expected,
+ $this->lang->formatBitrate( $bps ),
+ "formatBitrate('$bps'): $msg"
+ );
+ }
+
+ function provideFormatBitrate() {
+ return array(
+ array(
+ 0,
+ "0bps",
+ "0 bits per second"
+ ),
+ array(
+ 999,
+ "999bps",
+ "999 bits per second"
+ ),
+ array(
+ 1000,
+ "1kbps",
+ "1 kilobit per second"
+ ),
+ array(
+ 1000 * 1000,
+ "1Mbps",
+ "1 megabit per second"
+ ),
+ array(
+ pow( 10, 9 ),
+ "1Gbps",
+ "1 gigabit per second"
+ ),
+ array(
+ pow( 10, 12 ),
+ "1Tbps",
+ "1 terabit per second"
+ ),
+ array(
+ pow( 10, 15 ),
+ "1Pbps",
+ "1 petabit per second"
+ ),
+ array(
+ pow( 10, 18 ),
+ "1Ebps",
+ "1 exabit per second"
+ ),
+ array(
+ pow( 10, 21 ),
+ "1Zbps",
+ "1 zetabit per second"
+ ),
+ array(
+ pow( 10, 24 ),
+ "1Ybps",
+ "1 yottabit per second"
+ ),
+ array(
+ pow( 10, 27 ),
+ "1,000Ybps",
+ "1,000 yottabits per second"
+ ),
+ );
+ }
}
diff --git a/tests/phpunit/languages/LanguageTiTest.php b/tests/phpunit/languages/LanguageTiTest.php
new file mode 100644
index 00000000..4bfaa009
--- /dev/null
+++ b/tests/phpunit/languages/LanguageTiTest.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageTi.php */
+class LanguageTiTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Ti' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'many', 2 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageTlTest.php b/tests/phpunit/languages/LanguageTlTest.php
new file mode 100644
index 00000000..a1facd14
--- /dev/null
+++ b/tests/phpunit/languages/LanguageTlTest.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageTl.php */
+class LanguageTlTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Tl' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'many', 2 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageTrTest.php b/tests/phpunit/languages/LanguageTrTest.php
index d2a5ff36..bda4c9d9 100644
--- a/tests/phpunit/languages/LanguageTrTest.php
+++ b/tests/phpunit/languages/LanguageTrTest.php
@@ -1,7 +1,7 @@
<?php
/**
- * @author Ashar Voultoiz
- * @copyright Copyright © 2011, Ashar Voultoiz
+ * @author Antoine Musso
+ * @copyright Copyright © 2011, Antoine Musso
* @file
*/
@@ -18,7 +18,10 @@ class LanguageTrTest extends MediaWikiTestCase {
/**
* See @bug 28040
- * Credits to #wikipedia-tr users berm, []LuCkY[] and Emperyan
+ * Credits to irc://irc.freenode.net/wikipedia-tr users:
+ * - berm
+ * - []LuCkY[]
+ * - Emperyan
* @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
* @dataProvider provideDottedAndDotlessI
*/
diff --git a/tests/phpunit/languages/LanguageUkTest.php b/tests/phpunit/languages/LanguageUkTest.php
new file mode 100644
index 00000000..60fafb0d
--- /dev/null
+++ b/tests/phpunit/languages/LanguageUkTest.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * based on LanguageBe_tarask.php
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageUk.php */
+class LanguageUkTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Uk' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providePluralFourForms */
+ function testPluralFourForms( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providePluralFourForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'many', 11 ),
+ array( 'one', 91 ),
+ array( 'one', 121 ),
+ array( 'few', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
+ array( 'few', 334 ),
+ array( 'many', 5 ),
+ array( 'many', 15 ),
+ array( 'many', 120 ),
+ );
+ }
+ /** @dataProvider providePluralTwoForms */
+ function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'several' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+ function providePluralTwoForms() {
+ return array (
+ array( 'one', 1 ),
+ array( 'several', 11 ),
+ array( 'several', 91 ),
+ array( 'several', 121 ),
+ );
+ }
+}
diff --git a/tests/phpunit/languages/LanguageWaTest.php b/tests/phpunit/languages/LanguageWaTest.php
new file mode 100644
index 00000000..172f19b9
--- /dev/null
+++ b/tests/phpunit/languages/LanguageWaTest.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * @author Amir E. Aharoni
+ * @copyright Copyright © 2012, Amir E. Aharoni
+ * @file
+ */
+
+/** Tests for MediaWiki languages/classes/LanguageWa.php */
+class LanguageWaTest extends MediaWikiTestCase {
+ private $lang;
+
+ function setUp() {
+ $this->lang = Language::factory( 'Wa' );
+ }
+ function tearDown() {
+ unset( $this->lang );
+ }
+
+ /** @dataProvider providerPlural */
+ function testPlural( $result, $value ) {
+ $forms = array( 'one', 'many' );
+ $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+ }
+
+ function providerPlural() {
+ return array (
+ array( 'one', 0 ),
+ array( 'one', 1 ),
+ array( 'many', 2 ),
+ );
+ }
+}
diff --git a/tests/phpunit/phpunit.php b/tests/phpunit/phpunit.php
index 39cccf80..92eeffa2 100644
--- a/tests/phpunit/phpunit.php
+++ b/tests/phpunit/phpunit.php
@@ -46,8 +46,8 @@ require( RUN_MAINTENANCE_IF_MAIN );
if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
//Hack to eliminate the need to use the Makefile (which sucks ATM)
- $_SERVER['argv'][] = '--configuration';
- $_SERVER['argv'][] = $IP . '/tests/phpunit/suite.xml';
+ array_splice( $_SERVER['argv'], 1, 0,
+ array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
}
require_once( 'PHPUnit/Runner/Version.php' );
diff --git a/tests/phpunit/skins/SideBarTest.php b/tests/phpunit/skins/SideBarTest.php
index bf79e760..912d7602 100644
--- a/tests/phpunit/skins/SideBarTest.php
+++ b/tests/phpunit/skins/SideBarTest.php
@@ -37,6 +37,7 @@ class SideBarTest extends MediaWikiLangTestCase {
parent::setUp();
$this->initMessagesHref();
$this->skin = new SkinTemplate();
+ $this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
}
function tearDown() {
parent::tearDown();
@@ -106,7 +107,7 @@ class SideBarTest extends MediaWikiLangTestCase {
}
/**
- * bug 33321
+ * bug 33321 - Make sure there's a | after transforming.
* @group Database
*/
function testTrickyPipe() {
@@ -168,7 +169,7 @@ class SideBarTest extends MediaWikiLangTestCase {
}
/**
- * Test wgNoFollowLinks in sidebar
+ * Test $wgNoFollowLinks in sidebar
*/
function testRespectWgnofollowlinks() {
global $wgNoFollowLinks;
@@ -177,7 +178,7 @@ class SideBarTest extends MediaWikiLangTestCase {
$attribs = $this->getAttribs();
$this->assertArrayNotHasKey( 'rel', $attribs,
- 'External URL in sidebar do not have rel=nofollow when wgNoFollowLinks = false'
+ 'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
);
// Restore global
@@ -185,7 +186,7 @@ class SideBarTest extends MediaWikiLangTestCase {
}
/**
- * Test wgExternaLinkTarget in sidebar
+ * Test $wgExternaLinkTarget in sidebar
*/
function testRespectExternallinktarget() {
global $wgExternalLinkTarget;
diff --git a/tests/phpunit/suite.xml b/tests/phpunit/suite.xml
index e6649beb..1227a17a 100644
--- a/tests/phpunit/suite.xml
+++ b/tests/phpunit/suite.xml
@@ -2,35 +2,42 @@
<!-- colors don't work on Windows! -->
<phpunit bootstrap="./bootstrap.php"
- colors="false"
+ colors="true"
backupGlobals="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="false"
+ timeoutForSmallTests="2"
+ timeoutForMediumTests="10"
+ timeoutForLargeTests="60"
strict="true"
verbose="true">
<testsuites>
<testsuite name="includes">
- <directory>./includes</directory>
+ <directory>includes</directory>
</testsuite>
<testsuite name="languages">
- <directory>./languages</directory>
+ <directory>languages</directory>
</testsuite>
<testsuite name="skins">
- <directory>./skins</directory>
+ <directory>skins</directory>
+ </testsuite>
+ <testsuite name="structure">
+ <file>StructureTest.php</file>
</testsuite>
<testsuite name="uploadfromurl">
- <file>./suites/UploadFromUrlTestSuite.php</file>
+ <file>suites/UploadFromUrlTestSuite.php</file>
</testsuite>
<testsuite name="extensions">
- <file>./suites/ExtensionsTestSuite.php</file>
+ <file>suites/ExtensionsTestSuite.php</file>
</testsuite>
</testsuites>
<groups>
<exclude>
<group>Utility</group>
<group>Broken</group>
+ <group>ParserFuzz</group>
<group>Stub</group>
</exclude>
</groups>
diff --git a/tests/phpunit/suites/UploadFromUrlTestSuite.php b/tests/phpunit/suites/UploadFromUrlTestSuite.php
index 9b666825..6779ad47 100644
--- a/tests/phpunit/suites/UploadFromUrlTestSuite.php
+++ b/tests/phpunit/suites/UploadFromUrlTestSuite.php
@@ -3,6 +3,8 @@
require_once( dirname( dirname( __FILE__ ) ) . '/includes/upload/UploadFromUrlTest.php' );
class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
+ public $savedGlobals = array();
+
public static function addTables( &$tables ) {
$tables[] = 'user_properties';
$tables[] = 'filearchive';
@@ -14,34 +16,49 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
}
function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgDeferredUpdateList,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
- $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath;
-
- $wgScript = '/index.php';
- $wgScriptPath = '/';
- $wgArticlePath = '/wiki/$1';
- $wgStyleSheetPath = '/skins';
- $wgStylePath = '/skins';
- $wgThumbnailScriptPath = false;
- $wgLocalFileRepo = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'directory' => wfTempDir() . '/test-repo',
- 'url' => 'http://example.com/images',
- 'deletedDir' => wfTempDir() . '/test-repo/delete',
- 'hashLevels' => 2,
+ 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(
+ 'class' => 'LocalRepo',
+ 'name' => 'local',
+ 'url' => 'http://example.com/images',
+ 'hashLevels' => 2,
'transformVia404' => false,
+ 'backend' => new FSFileBackend( array(
+ 'name' => 'local-backend',
+ 'lockManager' => 'fsLockManager',
+ 'containerPaths' => array(
+ 'local-public' => wfTempDir() . '/test-repo/public',
+ 'local-thumb' => wfTempDir() . '/test-repo/thumb',
+ 'local-temp' => wfTempDir() . '/test-repo/temp',
+ 'local-deleted' => wfTempDir() . '/test-repo/delete',
+ )
+ ) ),
);
+ foreach ( $tmpGlobals as $var => $val ) {
+ if ( array_key_exists( $var, $GLOBALS ) ) {
+ $this->savedGlobals[$var] = $GLOBALS[$var];
+ }
+ $GLOBALS[$var] = $val;
+ }
+
$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
$wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
$wgEnableParserCache = false;
- $wgDeferredUpdateList = array();
+ DeferredUpdates::clearPendingUpdates();
$wgMemc = wfGetMainCache();
$messageMemc = wfGetMessageCacheStorage();
$parserMemc = wfGetParserCacheStorage();
@@ -49,18 +66,27 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
// $wgContLang = new StubContLang;
$wgUser = new User;
$context = new RequestContext;
- $wgLang = $context->getLang();
+ $wgLang = $context->getLanguage();
$wgOut = $context->getOutput();
$wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = new WebRequest;
+ $wgRequest = $context->getRequest();
if ( $wgStyleDirectory === false ) {
$wgStyleDirectory = "$IP/skins";
}
+ RepoGroup::destroySingleton();
+ FileBackendGroup::destroySingleton();
}
public function tearDown() {
+ foreach ( $this->savedGlobals as $var => $val ) {
+ $GLOBALS[$var] = $val;
+ }
+ // Restore backends
+ RepoGroup::destroySingleton();
+ FileBackendGroup::destroySingleton();
+
$this->teardownUploadDir( $this->uploadDir );
}
@@ -159,10 +185,10 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
return $dir;
}
- wfMkdirParents( $dir . '/3/3a' );
+ wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
- wfMkdirParents( $dir . '/0/09' );
+ wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
return $dir;
diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php
new file mode 100644
index 00000000..670e3d11
--- /dev/null
+++ b/tests/qunit/QUnitTestResources.php
@@ -0,0 +1,52 @@
+<?php
+
+return array(
+
+ /* Test suites for MediaWiki core modules */
+
+ 'mediawiki.tests.qunit.suites' => array(
+ 'scripts' => array(
+ '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',
+ 'tests/qunit/suites/resources/jquery/jquery.client.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.getAttrs.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.mwExtension.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.textSelection.test.js',
+ 'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
+ 'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
+ 'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
+ 'tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js',
+ 'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
+ 'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
+ "tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js",
+ ),
+ 'dependencies' => array(
+ 'jquery.autoEllipsis',
+ 'jquery.byteLength',
+ 'jquery.byteLimit',
+ 'jquery.client',
+ 'jquery.colorUtil',
+ 'jquery.delayedBind',
+ 'jquery.getAttrs',
+ 'jquery.highlightText',
+ 'jquery.localize',
+ 'jquery.mwExtension',
+ 'jquery.tabIndex',
+ 'jquery.tablesorter',
+ 'jquery.textSelection',
+ 'mediawiki',
+ 'mediawiki.Title',
+ 'mediawiki.user',
+ 'mediawiki.util',
+ 'mediawiki.special.recentchanges',
+ 'mediawiki.jqueryMsg',
+ ),
+ )
+);
diff --git a/tests/qunit/data/qunitOkCall.js b/tests/qunit/data/qunitOkCall.js
new file mode 100644
index 00000000..2fb6e01d
--- /dev/null
+++ b/tests/qunit/data/qunitOkCall.js
@@ -0,0 +1,2 @@
+start();
+ok( true, 'Successfully loaded!');
diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js
index dbfe9fad..fdd3116b 100644
--- a/tests/qunit/data/testrunner.js
+++ b/tests/qunit/data/testrunner.js
@@ -1,36 +1,61 @@
-( function( $ ) {
+( function ( $, mw, QUnit, undefined ) {
+"use strict";
+
+var mwTestIgnore, mwTester, addons;
/**
* Add bogus to url to prevent IE crazy caching
*
- * @param value {String} a relative path (eg. 'data/defineTestCallback.js' or 'data/test.php?foo=bar')
+ * @param value {String} a relative path (eg. 'data/defineTestCallback.js'
+ * or 'data/test.php?foo=bar').
* @return {String} Such as 'data/defineTestCallback.js?131031765087663960'
*/
-QUnit.fixurl = function(value) {
- return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000);
+QUnit.fixurl = function (value) {
+ return value + (/\?/.test( value ) ? '&' : '?')
+ + String( new Date().getTime() )
+ + String( parseInt( Math.random()*100000, 10 ) );
};
/**
+ * Configuration
+ */
+QUnit.config.testTimeout = 5000;
+
+/**
+ * MediaWiki debug mode
+ */
+QUnit.config.urlConfig.push( 'debug' );
+
+/**
* Load TestSwarm agent
*/
if ( QUnit.urlParams.swarmURL ) {
- document.write("<scr" + "ipt src='" + QUnit.fixurl( 'data/testwarm.inject.js' ) + "'></scr" + "ipt>");
+ document.write( "<scr" + "ipt src='" + QUnit.fixurl( mw.config.get( 'wgScriptPath' )
+ + '/tests/qunit/data/testwarm.inject.js' ) + "'></scr" + "ipt>" );
}
/**
- * Load completenesstest
+ * CompletenessTest
*/
+// Adds toggle checkbox to header
+QUnit.config.urlConfig.push( 'completenesstest' );
+
+// Initiate when enabled
if ( QUnit.urlParams.completenesstest ) {
// Return true to ignore
- var mwTestIgnore = function( val, tester, funcPath ) {
+ mwTestIgnore = function ( val, tester, funcPath ) {
// Don't record methods of the properties of constructors,
// to avoid getting into a loop (prototype.constructor.prototype..).
// Since we're therefor skipping any injection for
// "new mw.Foo()", manually set it to true here.
if ( val instanceof mw.Map ) {
- tester.methodCallTracker['Map'] = true;
+ tester.methodCallTracker.Map = true;
+ return true;
+ }
+ if ( val instanceof mw.Title ) {
+ tester.methodCallTracker.Title = true;
return true;
}
@@ -42,42 +67,113 @@ if ( QUnit.urlParams.completenesstest ) {
return false;
};
- var mwTester = new CompletenessTest( mw, mwTestIgnore );
+ mwTester = new CompletenessTest( mw, mwTestIgnore );
}
/**
+ * Test environment recommended for all QUnit test modules
+ */
+// Whether to log environment changes to the console
+QUnit.config.urlConfig.push( 'mwlogenv' );
+
+/**
+ * Reset mw.config to a fresh copy of the live config for each test();
+ * @param override {Object} [optional]
+ * @example:
+ * <code>
+ * module( .., newMwEnvironment() );
+ *
+ * test( .., function () {
+ * mw.config.set( 'foo', 'bar' ); // just for this test
+ * } );
+ *
+ * test( .., function () {
+ * mw.config.get( 'foo' ); // doesn't exist
+ * } );
+ *
+ *
+ * module( .., newMwEnvironment({ quux: 'corge' }) );
+ *
+ * test( .., function () {
+ * mw.config.get( 'quux' ); // "corge"
+ * mw.config.set( 'quux', "grault" );
+ * } );
+ *
+ * test( .., function () {
+ * mw.config.get( 'quux' ); // "corge"
+ * } );
+ * </code>
+ */
+QUnit.newMwEnvironment = ( function () {
+ var liveConfig, freshConfigCopy, log;
+
+ liveConfig = mw.config.values;
+
+ freshConfigCopy = function ( custom ) {
+ // "deep=true" is important here.
+ // Otherwise we just create a new object with values referring to live config.
+ // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
+ // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
+ // was passed by reference in $.extend's loop.
+ return $.extend({}, liveConfig, custom, /*deep=*/true );
+ };
+
+ log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
+
+ return function ( override ) {
+ override = override || {};
+
+ return {
+ setup: function () {
+ log( 'MwEnvironment> SETUP for "' + QUnit.config.current.module
+ + ': ' + QUnit.config.current.testName + '"' );
+ // Greetings, mock configuration!
+ mw.config.values = freshConfigCopy( override );
+ },
+
+ teardown: function () {
+ log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
+ + ': ' + QUnit.config.current.testName + '"' );
+ // Farewell, mock configuration!
+ mw.config.values = liveConfig;
+ }
+ };
+ };
+}() );
+
+/**
* Add-on assertion helpers
*/
// Define the add-ons
-var addons = {
+addons = {
// Expect boolean true
- assertTrue: function( actual, message ) {
+ assertTrue: function ( actual, message ) {
strictEqual( actual, true, message );
},
// Expect boolean false
- assertFalse: function( actual, message ) {
+ assertFalse: function ( actual, message ) {
strictEqual( actual, false, message );
},
// Expect numerical value less than X
- lt: function( actual, expected, message ) {
+ lt: function ( actual, expected, message ) {
QUnit.push( actual < expected, actual, 'less than ' + expected, message );
},
// Expect numerical value less than or equal to X
- ltOrEq: function( actual, expected, message ) {
+ ltOrEq: function ( actual, expected, message ) {
QUnit.push( actual <= expected, actual, 'less than or equal to ' + expected, message );
},
// Expect numerical value greater than X
- gt: function( actual, expected, message ) {
+ gt: function ( actual, expected, message ) {
QUnit.push( actual > expected, actual, 'greater than ' + expected, message );
},
// Expect numerical value greater than or equal to X
- gtOrEq: function( actual, expected, message ) {
+ gtOrEq: function ( actual, expected, message ) {
QUnit.push( actual >= expected, actual, 'greater than or equal to ' + expected, message );
},
@@ -89,4 +185,4 @@ var addons = {
$.extend( QUnit, addons );
$.extend( window, addons );
-})( jQuery );
+})( jQuery, mediaWiki, QUnit );
diff --git a/tests/qunit/index.html b/tests/qunit/index.html
index f748b87f..ef7ff8de 100644
--- a/tests/qunit/index.html
+++ b/tests/qunit/index.html
@@ -9,6 +9,43 @@
<script>
function startUp(){
mw.config = new mw.Map( false );
+
+ /**
+ * Simulate an average mw.config context
+ */
+ /* StartUp module */
+ mw.config.set({"wgLoadScript": "/mw/trunk/phase3/load.php", "debug": true, "skin": "vector", "stylepath": "/mw/trunk/phase3/skins", "wgUrlProtocols": "http\\:\\/\\/|https\\:\\/\\/|ftp\\:\\/\\/|irc\\:\\/\\/|ircs\\:\\/\\/|gopher\\:\\/\\/|telnet\\:\\/\\/|nntp\\:\\/\\/|worldwind\\:\\/\\/|mailto\\:|news\\:|svn\\:\\/\\/|git\\:\\/\\/|mms\\:\\/\\/|\\/\\/", "wgArticlePath": "/mw/trunk/phase3/index.php/$1", "wgScriptPath": "/mw/trunk/phase3", "wgScriptExtension": ".php", "wgScript": "/mw/trunk/phase3/index.php", "wgVariantArticlePath": false, "wgActionPaths": [], "wgServer": "http://localhost", "wgUserLanguage": "en", "wgContentLanguage": "en", "wgVersion": "1.19alpha", "wgEnableAPI": true, "wgEnableWriteAPI": true, "wgDefaultDateFormat": "dmy", "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"], "wgMainPageTitle": "Main Page", "wgFormattedNamespaces": {"-2": "Media", "-1": "Special", "0": "", "1": "Talk", "2": "User", "3": "User talk", "4": "Testopedia", "5": "Testopedia talk", "6": "File", "7": "File talk", "8": "MediaWiki", "9": "MediaWiki talk", "10": "Template", "11": "Template talk", "12": "Help", "13": "Help talk", "14": "Category", "15": "Category talk"}, "wgNamespaceIds": {"media": -2, "special": -1, "": 0, "talk": 1, "user": 2, "user_talk": 3, "testopedia": 4, "testopedia_talk": 5, "file": 6, "file_talk": 7, "mediawiki": 8, "mediawiki_talk": 9, "template": 10, "template_talk": 11, "help": 12, "help_talk": 13, "category": 14, "category_talk": 15, "image": 6, "image_talk": 7, "project": 4, "project_talk": 5}, "wgSiteName": "Testopedia", "wgFileExtensions": ["png", "gif", "jpg", "jpeg"], "wgDBname": "mediawiki", "wgFileCanRotate": true, "wgAvailableSkins": {"chick": "Chick", "cologneblue": "CologneBlue", "modern": "Modern", "monobook": "MonoBook", "myskin": "MySkin", "nostalgia": "Nostalgia", "simple": "Simple", "standard": "Standard", "vector": "Vector"}, "wgExtensionAssetsPath": "/mw/trunk/phase3/extensions", "wgCookiePrefix": "mediawiki", "wgResourceLoaderMaxQueryLength": -1, "wgCaseSensitiveNamespaces": []});
+
+ /* WikiPage specific */
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "Sandbox", "wgTitle": "Sandbox", "wgCurRevisionId": 486, "wgArticleId": 84, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": [], "wgBreakFrames": false, "wgPageContentLanguage": "en", "wgSeparatorTransformTable": ["", ""], "wgDigitTransformTable": ["", ""], "wgRestrictionEdit": [], "wgRestrictionMove": [], "wgRedirectedFrom": "Sandbox"});
+
+ /**
+ * Fix wgScriptPath and the like to the real thing,
+ * instead of fake ones (for access to /tests/qunit/data/)
+ */
+
+ // Regular expression to extract the path for the QUnit tests
+ // Takes into account that tests could be run from a file:// URL
+ // by excluding the 'index.html' part from the URL
+ var rePath = /(?:[^#\?](?!index.html))*\/?/;
+
+ // Extract path to /tests/qunit/
+ var qunitTestsPath = rePath.exec( location.pathname )[0];
+
+ // Traverse up to script path
+ var pathParts = qunitTestsPath.split( '/' );
+ pathParts.pop(); pathParts.pop(); pathParts.pop();
+ var scriptPath = pathParts.join( '/' );
+
+ mw.config.set({
+ "wgServer": location.protocol + '//' + location.host,
+ "wgScriptPath": scriptPath,
+ "wgLoadScript": scriptPath + '/load.php',
+ "stylepath": scriptPath + '/skins',
+ "wgArticlePath": scriptPath + '/index.php/$1',
+ "wgScript": scriptPath + '/index.php',
+ "wgExtensionAssetsPath": scriptPath + '/extensions'
+ });
}
</script>
@@ -18,15 +55,15 @@
<!-- MW: mediawiki.page.startup -->
<script src="../../resources/jquery/jquery.client.js"></script>
+ <script src="../../resources/mediawiki/mediawiki.util.js"></script>
<script src="../../resources/mediawiki.page/mediawiki.page.startup.js"></script>
- <!-- MW: mediawiki.user|mediawiki.util|mediawiki.page.ready -->
+ <!-- MW: mediawiki.user|mediawiki.page.ready -->
<script src="../../resources/jquery/jquery.cookie.js"></script>
<script src="../../resources/mediawiki/mediawiki.user.js"></script>
<script src="../../resources/jquery/jquery.messageBox.js"></script>
- <script src="../../resources/jquery/jquery.mwPrototypes.js"></script>
- <script src="../../resources/mediawiki/mediawiki.util.js"></script>
+ <script src="../../resources/jquery/jquery.mwExtension.js"></script>
<script src="../../resources/jquery/jquery.checkboxShiftClick.js"></script>
<script src="../../resources/jquery/jquery.makeCollapsible.js"></script>
@@ -45,9 +82,14 @@
<script src="../../resources/jquery/jquery.colorUtil.js"></script>
<script src="../../resources/jquery/jquery.delayedBind.js"></script>
<script src="../../resources/jquery/jquery.getAttrs.js"></script>
+ <script src="../../resources/jquery/jquery.highlightText.js"></script>
<script src="../../resources/jquery/jquery.localize.js"></script>
<script src="../../resources/jquery/jquery.tabIndex.js"></script>
<script src="../../resources/jquery/jquery.tablesorter.js"></script>
+ <script src="../../resources/jquery/jquery.textSelection.js"></script>
+ <script src="../../resources/mediawiki/mediawiki.Title.js"></script>
+ <script src="../../resources/mediawiki.language/mediawiki.language.js"></script>
+ <script src="../../resources/mediawiki/mediawiki.jqueryMsg.js"></script>
<script src="../../resources/mediawiki.special/mediawiki.special.js"></script>
<script src="../../resources/mediawiki.special/mediawiki.special.recentchanges.js"></script>
@@ -59,23 +101,27 @@
<!-- QUnit: Load test suites (maintain the same order as above please) -->
<script src="suites/resources/mediawiki/mediawiki.jscompat.test.js"></script>
- <script src="suites/resources/mediawiki/mediawiki.js"></script>
- <script src="suites/resources/mediawiki/mediawiki.user.js"></script>
+ <script src="suites/resources/mediawiki/mediawiki.test.js"></script>
+ <script src="suites/resources/mediawiki/mediawiki.user.test.js"></script>
- <script src="suites/resources/jquery/jquery.client.js"></script>
- <script src="suites/resources/jquery/jquery.mwPrototypes.js"></script>
- <script src="suites/resources/mediawiki/mediawiki.util.js"></script>
+ <script src="suites/resources/jquery/jquery.client.test.js"></script>
+ <script src="suites/resources/jquery/jquery.mwExtension.test.js"></script>
+ <script src="suites/resources/mediawiki/mediawiki.util.test.js"></script>
- <script src="suites/resources/jquery/jquery.autoEllipsis.js"></script>
- <script src="suites/resources/jquery/jquery.byteLength.js"></script>
- <script src="suites/resources/jquery/jquery.byteLimit.js"></script>
- <script src="suites/resources/jquery/jquery.colorUtil.js"></script>
+ <script src="suites/resources/jquery/jquery.autoEllipsis.test.js"></script>
+ <script src="suites/resources/jquery/jquery.byteLength.test.js"></script>
+ <script src="suites/resources/jquery/jquery.byteLimit.test.js"></script>
+ <script src="suites/resources/jquery/jquery.colorUtil.test.js"></script>
<script src="suites/resources/jquery/jquery.delayedBind.test.js"></script>
- <script src="suites/resources/jquery/jquery.getAttrs.js"></script>
- <script src="suites/resources/jquery/jquery.localize.js"></script>
- <script src="suites/resources/jquery/jquery.tabIndex.js"></script>
+ <script src="suites/resources/jquery/jquery.getAttrs.test.js"></script>
+ <script src="suites/resources/jquery/jquery.highlightText.test.js"></script>
+ <script src="suites/resources/jquery/jquery.localize.test.js"></script>
+ <script src="suites/resources/jquery/jquery.tabIndex.test.js"></script>
<script src="suites/resources/jquery/jquery.tablesorter.test.js" charset="UTF-8"></script>
- <script src="suites/resources/mediawiki.special/mediawiki.special.recentchanges.js"></script>
+ <script src="suites/resources/jquery/jquery.textSelection.test.js" charset="UTF-8"></script>
+ <script src="suites/resources/mediawiki/mediawiki.Title.test.js"></script>
+ <script src="suites/resources/mediawiki/mediawiki.jqueryMsg.test.js"></script>
+ <script src="suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js"></script>
</head>
<body>
<h1 id="qunit-header">MediaWiki JavaScript Test Suite</h1>
@@ -85,6 +131,7 @@
</div>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
+ <div id="qunit-fixture"></div>
<!-- Scripts inserting stuff here shall remove it themselfs! -->
<div id="content"></div>
diff --git a/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js b/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
index caf5a6f1..6e371384 100644
--- a/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js
+++ b/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
@@ -1,4 +1,4 @@
-module( 'jquery.autoEllipsis.js' );
+module( 'jquery.autoEllipsis', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
@@ -6,8 +6,8 @@ test( '-- Initial check', function() {
});
function createWrappedDiv( text, width ) {
- var $wrapper = $( '<div />' ).css( 'width', width );
- var $div = $( '<div />' ).text( text );
+ var $wrapper = $( '<div>' ).css( 'width', width );
+ var $div = $( '<div>' ).text( text );
$wrapper.append( $div );
return $wrapper;
}
@@ -26,7 +26,7 @@ test( 'Position right', function() {
// We need this thing to be visible, so append it to the DOM
var origText = 'This is a really long random string and there is no way it fits in 100 pixels.';
var $wrapper = createWrappedDiv( origText, '100px' );
- $( 'body' ).append( $wrapper );
+ $( '#qunit-fixture' ).append( $wrapper );
$wrapper.autoEllipsis( { position: 'right' } );
// Verify that, and only one, span element was created
@@ -47,12 +47,9 @@ test( 'Position right', function() {
// Put this text in the span and verify it doesn't fit
$span.text( spanTextNew );
// In IE6 width works like min-width, allow IE6's width to be "equal to"
- if ( $.browser.msie && Number( $.browser.version ) == 6 ) {
+ if ( $.browser.msie && Number( $.browser.version ) === 6 ) {
gtOrEq( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more) - IE6: Maybe equal to as well due to width behaving like min-width in IE6' );
} else {
gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
}
-
- // Clean up
- $wrapper.remove();
});
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLength.js b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
index f82fda27..15fac691 100644
--- a/tests/qunit/suites/resources/jquery/jquery.byteLength.js
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
@@ -1,4 +1,4 @@
-module( 'jquery.byteLength.js' );
+module( 'jquery.byteLength', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
@@ -25,7 +25,7 @@ test( 'Simple text', function() {
test( 'Special text', window.foo = function() {
expect(5);
- // http://en.wikipedia.org/wiki/UTF-8
+ // http://en.wikipedia.org/wiki/UTF-8
var U_0024 = '\u0024',
U_00A2 = '\u00A2',
U_20AC = '\u20AC',
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
index 461ea49b..3346c2d5 100644
--- a/tests/qunit/suites/resources/jquery/jquery.byteLimit.js
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
@@ -1,4 +1,6 @@
-module( 'jquery.byteLimit.js' );
+( function () {
+
+module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
@@ -23,46 +25,47 @@ $.addChars = function( $input, charstr ) {
}
}
};
-var blti = 0;
+
/**
* Test factory for $.fn.byteLimit
*
* @param $input {jQuery} jQuery object in an input element
- * @param useLimit {Boolean} Wether a limit should apply at all
+ * @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)
+ * The limit should be less than 20 (the sample data's length)
*/
var byteLimitTest = function( options ) {
var opt = $.extend({
description: '',
$input: null,
sample: '',
- useLimit: false,
- expected: 0,
+ hasLimit: false,
+ expected: '',
limit: null
}, options);
- var i = blti++;
test( opt.description, function() {
- opt.$input.appendTo( 'body' );
-
+ opt.$input.appendTo( '#qunit-fixture' );
+
// Simulate pressing keys for each of the sample characters
$.addChars( opt.$input, opt.sample );
- var newVal = opt.$input.val();
-
- if ( opt.useLimit ) {
- expect(2);
-
+ var rawVal = opt.$input.val(),
+ fn = opt.$input.data( 'byteLimit-callback' ),
+ newVal = $.isFunction( fn ) ? fn( rawVal ) : rawVal;
+
+ if ( opt.hasLimit ) {
+ expect(3);
+
ltOrEq( $.byteLength( newVal ), opt.limit, 'Prevent keypresses after byteLimit was reached, length never exceeded the limit' );
- equal( $.byteLength( newVal ), opt.expected, 'Not preventing keypresses too early, length has reached the expected length' );
-
+ equal( $.byteLength( rawVal ), $.byteLength( opt.expected ), 'Not preventing keypresses too early, length has reached the expected length' );
+ equal( rawVal, opt.expected, 'New value matches the expected string' );
+
} else {
- expect(1);
- equal( $.byteLength( newVal ), opt.expected, 'Unlimited scenarios are not affected, expected length reached' );
+ expect(2);
+ equal( newVal, opt.expected, 'New value matches the expected string' );
+ equal( $.byteLength( newVal ), $.byteLength( opt.expected ), 'Unlimited scenarios are not affected, expected length reached' );
}
-
- opt.$input.remove();
} );
};
@@ -79,77 +82,106 @@ var
byteLimitTest({
description: 'Plain text input',
$input: $( '<input>' )
- .attr( {
- 'type': 'text'
- }),
+ .attr( 'type', 'text' ),
sample: simpleSample,
- useLimit: false,
- expected: $.byteLength( simpleSample )
+ hasLimit: false,
+ expected: simpleSample
});
byteLimitTest({
description: 'Limit using the maxlength attribute',
$input: $( '<input>' )
- .attr( {
- 'type': 'text',
- 'maxlength': '10'
- })
+ .attr( 'type', 'text' )
+ .prop( 'maxLength', '10' )
.byteLimit(),
sample: simpleSample,
- useLimit: true,
+ hasLimit: true,
limit: 10,
- expected: 10
+ expected: '1234567890'
});
byteLimitTest({
description: 'Limit using a custom value',
$input: $( '<input>' )
- .attr( {
- 'type': 'text'
- })
+ .attr( 'type', 'text' )
.byteLimit( 10 ),
sample: simpleSample,
- useLimit: true,
+ hasLimit: true,
limit: 10,
- expected: 10
+ expected: '1234567890'
});
byteLimitTest({
description: 'Limit using a custom value, overriding maxlength attribute',
$input: $( '<input>' )
- .attr( {
- 'type': 'text',
- 'maxLength': '10'
- })
+ .attr( 'type', 'text' )
+ .prop( 'maxLength', '10' )
.byteLimit( 15 ),
sample: simpleSample,
- useLimit: true,
+ hasLimit: true,
limit: 15,
- expected: 15
+ expected: '123456789012345'
});
byteLimitTest({
description: 'Limit using a custom value (multibyte)',
$input: $( '<input>' )
- .attr( {
- 'type': 'text'
- })
+ .attr( 'type', 'text' )
.byteLimit( 14 ),
sample: mbSample,
- useLimit: true,
+ hasLimit: true,
limit: 14,
- expected: 14 // (10 x 1-byte char) + (1 x 3-byte char) + (1 x 1-byte char)
+ expected: '1234567890' + U_20AC + '1'
});
byteLimitTest({
description: 'Limit using a custom value (multibyte) overlapping a byte',
$input: $( '<input>' )
- .attr( {
- 'type': 'text'
- })
+ .attr( 'type', 'text' )
.byteLimit( 12 ),
sample: mbSample,
- useLimit: true,
+ hasLimit: true,
limit: 12,
- expected: 12 // 10 x 1-byte char. The next 3-byte char exceeds limit of 12, but 2 more 1-byte chars come in after.
+ expected: '1234567890' + '12'
});
+
+byteLimitTest({
+ description: 'Pass the limit and a callback as input filter',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .byteLimit( 6, function( val ) {
+ // Invalid title
+ if ( val == '' ) {
+ return '';
+ }
+
+ // Return without namespace prefix
+ return new mw.Title( '' + val ).getMain();
+ } ),
+ sample: 'User:Sample',
+ hasLimit: true,
+ limit: 6, // 'Sample' length
+ expected: 'User:Sample'
+});
+
+byteLimitTest({
+ description: 'Limit using the maxlength attribute and pass a callback as input filter',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .prop( 'maxLength', '6' )
+ .byteLimit( function( val ) {
+ // Invalid title
+ if ( val === '' ) {
+ return '';
+ }
+
+ // Return without namespace prefix
+ return new mw.Title( '' + val ).getMain();
+ } ),
+ sample: 'User:Sample',
+ hasLimit: true,
+ limit: 6, // 'Sample' length
+ expected: 'User:Sample'
+});
+
+}() ); \ No newline at end of file
diff --git a/tests/qunit/suites/resources/jquery/jquery.client.js b/tests/qunit/suites/resources/jquery/jquery.client.test.js
index 50df2928..7be41971 100644
--- a/tests/qunit/suites/resources/jquery/jquery.client.js
+++ b/tests/qunit/suites/resources/jquery/jquery.client.test.js
@@ -1,12 +1,14 @@
-module( 'jquery.client.js' );
+module( 'jquery.client', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
ok( jQuery.client, 'jQuery.client defined' );
});
-test( 'profile userAgent support', function() {
- expect(8);
+/** Number of user-agent defined */
+var uacount = 0;
+
+var uas = (function() {
// 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/
@@ -24,11 +26,32 @@ test( 'profile userAgent support', function() {
"version": "7.0",
"versionBase": "7",
"versionNumber": 7
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: false
}
},
// Internet Explorer 8
// Internet Explorer 9
// Internet Explorer 10
+ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)': {
+ title: 'Internet Explorer 10',
+ platform: 'Win32',
+ profile: {
+ "name": "msie",
+ "layout": "trident",
+ "layoutVersion": "unknown", // should be able to report 6?
+ "platform": "win",
+ "version": "10.0",
+ "versionBase": "10",
+ "versionNumber": 10
+ },
+ 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': {
@@ -42,6 +65,10 @@ test( 'profile userAgent support', function() {
"version": "3.5.19",
"versionBase": "3",
"versionNumber": 3.5
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
}
},
// Firefox 3.6
@@ -56,6 +83,10 @@ test( 'profile userAgent support', function() {
"version": "3.6.17",
"versionBase": "3",
"versionNumber": 3.6
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
}
},
// Firefox 4
@@ -70,7 +101,29 @@ test( 'profile userAgent support', function() {
"version": "4.0.1",
"versionBase": "4",
"versionNumber": 4
- }
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
+ // Firefox 10 nightly build
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0a1) Gecko/20111103 Firefox/10.0a1': {
+ title: 'Firefox 10 nightly',
+ platform: 'Linux',
+ profile: {
+ "name": "firefox",
+ "layout": "gecko",
+ "layoutVersion": 20111103,
+ "platform": "linux",
+ "version": "10.0a1",
+ "versionBase": "10",
+ "versionNumber": 10
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
},
// Firefox 5
// Safari 3
@@ -86,7 +139,11 @@ test( 'profile userAgent support', function() {
"version": "4.0.5",
"versionBase": "4",
"versionNumber": 4
- }
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
},
'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7': {
title: 'Safari 4',
@@ -99,6 +156,10 @@ test( 'profile userAgent support', function() {
"version": "4.0.5",
"versionBase": "4",
"versionNumber": 4
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
}
},
// Safari 5
@@ -122,6 +183,10 @@ test( 'profile userAgent support', function() {
"version": "12.0.742.112",
"versionBase": "12",
"versionNumber": 12
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
}
},
'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30': {
@@ -135,9 +200,19 @@ test( 'profile userAgent support', function() {
"version": "12.0.742.68",
"versionBase": "12",
"versionNumber": 12
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
}
}
};
+ $.each( uas, function() { uacount++ });
+ return uas;
+})();
+
+test( 'profile userAgent support', function() {
+ expect(uacount);
// Generate a client profile object and compare recursively
var uaTest = function( rawUserAgent, data ) {
@@ -168,34 +243,37 @@ test( 'profile return validation for current user agent', function() {
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" :)
+var 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
+ }
+};
+
test( 'test', function() {
expect(1);
- // Example from WikiEditor
- var testMap = {
- 'ltr': {
- 'msie': [['>=', 7]],
- '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
- }
- };
// .test() uses eval, make sure no exceptions are thrown
// then do a basic return value type check
var testMatch = $.client.test( testMap );
@@ -203,3 +281,29 @@ test( 'test', function() {
equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
});
+
+test( 'User-agent matches against WikiEditor\'s compatibility map', function() {
+ expect( uacount * 2 ); // double since we test both LTR and RTL
+
+ var $body = $( 'body' ),
+ bodyClasses = $body.attr( 'class' );
+
+ // Loop through and run tests
+ $.each( uas, function ( agent, data ) {
+ $.each( ['ltr', 'rtl'], function ( i, dir ) {
+ $body.removeClass( 'ltr rtl' ).addClass( dir );
+ var profile = $.client.profile( {
+ userAgent: agent,
+ platform: data.platform
+ } );
+ var testMatch = $.client.test( testMap, profile );
+ $body.removeClass( dir );
+
+ equal( testMatch, data.wikiEditor[dir], 'testing comparison based on ' + dir + ', ' + agent );
+ });
+ });
+
+ // Restore body classes
+ $body.attr( 'class', bodyClasses );
+});
+
diff --git a/tests/qunit/suites/resources/jquery/jquery.colorUtil.js b/tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
index 93f12b82..655ee564 100644
--- a/tests/qunit/suites/resources/jquery/jquery.colorUtil.js
+++ b/tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
@@ -1,4 +1,4 @@
-module( 'jquery.colorUtil.js' );
+module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
diff --git a/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js b/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
index 8688f12e..6489a1f1 100644
--- a/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
@@ -1,5 +1,5 @@
test('jquery.delayedBind with data option', function() {
- var $fixture = $('<div>').appendTo('body'),
+ var $fixture = $('<div>').appendTo('#qunit-fixture'),
data = { magic: "beeswax" },
delay = 50;
@@ -20,7 +20,7 @@ test('jquery.delayedBind with data option', function() {
});
test('jquery.delayedBind without data option', function() {
- var $fixture = $('<div>').appendTo('body'),
+ var $fixture = $('<div>').appendTo('#qunit-fixture'),
data = { magic: "beeswax" },
delay = 50;
diff --git a/tests/qunit/suites/resources/jquery/jquery.getAttrs.js b/tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
index 3d3d01e1..9377a2f6 100644
--- a/tests/qunit/suites/resources/jquery/jquery.getAttrs.js
+++ b/tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
@@ -1,4 +1,4 @@
-module( 'jquery.getAttrs.js' );
+module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
diff --git a/tests/qunit/suites/resources/jquery/jquery.highlightText.test.js b/tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
new file mode 100644
index 00000000..4750d2b8
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
@@ -0,0 +1,239 @@
+module( 'jquery.highlightText', QUnit.newMwEnvironment() );
+
+test( '-- Initial check', function() {
+ expect(1);
+ ok( $.fn.highlightText, 'jQuery.fn.highlightText defined' );
+} );
+
+test( 'Check', function() {
+ var cases = [
+ {
+ desc: 'Test 001',
+ text: 'Blue Öyster Cult',
+ highlight: 'Blue',
+ expected: '<span class="highlight">Blue</span> Öyster Cult'
+ },
+ {
+ desc: 'Test 002',
+ text: 'Blue Öyster Cult',
+ highlight: 'Blue ',
+ expected: '<span class="highlight">Blue</span> Öyster Cult'
+ },
+ {
+ desc: 'Test 003',
+ text: 'Blue Öyster Cult',
+ highlight: 'Blue Ö',
+ expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+ },
+ {
+ desc: 'Test 004',
+ text: 'Blue Öyster Cult',
+ highlight: 'Blue Öy',
+ expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+ },
+ {
+ desc: 'Test 005',
+ text: 'Blue Öyster Cult',
+ highlight: ' Blue',
+ expected: '<span class="highlight">Blue</span> Öyster Cult'
+ },
+ {
+ desc: 'Test 006',
+ text: 'Blue Öyster Cult',
+ highlight: ' Blue ',
+ expected: '<span class="highlight">Blue</span> Öyster Cult'
+ },
+ {
+ desc: 'Test 007',
+ text: 'Blue Öyster Cult',
+ highlight: ' Blue Ö',
+ expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+ },
+ {
+ desc: 'Test 008',
+ text: 'Blue Öyster Cult',
+ highlight: ' Blue Öy',
+ expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+ },
+ {
+ desc: 'Test 009: Highlighter broken on starting Umlaut?',
+ text: 'Österreich',
+ highlight: 'Österreich',
+ expected: '<span class="highlight">Österreich</span>'
+ },
+ {
+ desc: 'Test 010: Highlighter broken on starting Umlaut?',
+ text: 'Österreich',
+ highlight: 'Ö',
+ expected: '<span class="highlight">Ö</span>sterreich'
+ },
+ {
+ desc: 'Test 011: Highlighter broken on starting Umlaut?',
+ text: 'Österreich',
+ highlight: 'Öst',
+ expected: '<span class="highlight">Öst</span>erreich'
+ },
+ {
+ desc: 'Test 012: Highlighter broken on starting Umlaut?',
+ text: 'Österreich',
+ highlight: 'Oe',
+ expected: 'Österreich'
+ },
+ {
+ desc: 'Test 013: Highlighter broken on punctuation mark?',
+ text: 'So good. To be there',
+ highlight: 'good',
+ expected: 'So <span class="highlight">good</span>. To be there'
+ },
+ {
+ desc: 'Test 014: Highlighter broken on space?',
+ text: 'So good. To be there',
+ highlight: 'be',
+ expected: 'So good. To <span class="highlight">be</span> there'
+ },
+ {
+ desc: 'Test 015: Highlighter broken on space?',
+ text: 'So good. To be there',
+ highlight: ' be',
+ expected: 'So good. To <span class="highlight">be</span> there'
+ },
+ {
+ desc: 'Test 016: Highlighter broken on space?',
+ text: 'So good. To be there',
+ highlight: 'be ',
+ expected: 'So good. To <span class="highlight">be</span> there'
+ },
+ {
+ desc: 'Test 017: Highlighter broken on space?',
+ text: 'So good. To be there',
+ highlight: ' be ',
+ expected: 'So good. To <span class="highlight">be</span> there'
+ },
+ {
+ desc: 'Test 018: en de Highlighter broken on special character at the end?',
+ text: 'So good. xbß',
+ highlight: 'xbß',
+ expected: 'So good. <span class="highlight">xbß</span>'
+ },
+ {
+ desc: 'Test 019: en de Highlighter broken on special character at the end?',
+ text: 'So good. xbß.',
+ highlight: 'xbß.',
+ expected: 'So good. <span class="highlight">xbß.</span>'
+ },
+ {
+ desc: 'Test 020: RTL he Hebrew',
+ text: 'חסיד ×ומות העול×',
+ highlight: 'חסיד ×ומות העול×',
+ expected: '<span class="highlight">חסיד</span> <span class="highlight">×ומות</span> <span class="highlight">העול×</span>'
+ },
+ {
+ desc: 'Test 021: RTL he Hebrew',
+ text: 'חסיד ×ומות העול×',
+ highlight: 'חסי',
+ expected: '<span class="highlight">חסי</span>ד ×ומות העול×'
+ },
+ {
+ desc: 'Test 022: ja Japanese',
+ text: '諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº',
+ highlight: '諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº',
+ expected: '<span class="highlight">諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº</span>'
+ },
+ {
+ desc: 'Test 023: ja Japanese',
+ text: '諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº',
+ highlight: '諸国',
+ expected: '<span class="highlight">諸国</span>æ°‘ã®ä¸­ã®æ­£ç¾©ã®äºº'
+ },
+ {
+ desc: 'Test 024: fr French text and « french quotes » (guillemets)',
+ text: "« L'oiseau est sur l’île »",
+ highlight: "« L'oiseau est sur l’île »",
+ expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
+ },
+ {
+ desc: 'Test 025: fr French text and « french quotes » (guillemets)',
+ text: "« L'oiseau est sur l’île »",
+ highlight: "« L'oise",
+ expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
+ },
+ {
+ desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
+ text: "« L'oiseau est sur l’île »",
+ highlight: "« L",
+ expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
+ },
+ {
+ desc: 'Test 026: ru Russian',
+ text: 'Праведники мира',
+ highlight: 'Праведники мира',
+ expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
+ },
+ {
+ desc: 'Test 027: ru Russian',
+ text: 'Праведники мира',
+ highlight: 'Праве',
+ expected: '<span class="highlight">Праве</span>дники мира'
+ },
+ {
+ desc: 'Test 028 ka Georgian',
+ text: 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
+ highlight: 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
+ expected: '<span class="highlight">მთáƒáƒ•áƒáƒ áƒ˜</span> <span class="highlight">გვერდი</span>'
+ },
+ {
+ desc: 'Test 029 ka Georgian',
+ text: 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
+ highlight: 'მთáƒ',
+ expected: '<span class="highlight">მთáƒ</span>ვáƒáƒ áƒ˜ გვერდი'
+ },
+ {
+ desc: 'Test 030 hy Armenian',
+ text: 'Õ†Õ¸Õ¶Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«',
+ highlight: 'Õ†Õ¸Õ¶Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«',
+ expected: '<span class="highlight">Õ†Õ¸Õ¶Õ¡</span> <span class="highlight">Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«</span>'
+ },
+ {
+ desc: 'Test 031 hy Armenian',
+ text: 'Õ†Õ¸Õ¶Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«',
+ highlight: 'Õ†Õ¸Õ¶',
+ expected: '<span class="highlight">Õ†Õ¸Õ¶</span>Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«'
+ },
+ {
+ desc: 'Test 032: th Thai',
+ text: 'พอล à¹à¸­à¸£à¹Œà¸”ิช',
+ highlight: 'พอล à¹à¸­à¸£à¹Œà¸”ิช',
+ expected: '<span class="highlight">พอล</span> <span class="highlight">à¹à¸­à¸£à¹Œà¸”ิช</span>'
+ },
+ {
+ desc: 'Test 033: th Thai',
+ text: 'พอล à¹à¸­à¸£à¹Œà¸”ิช',
+ highlight: 'พอ',
+ expected: '<span class="highlight">พอ</span>ล à¹à¸­à¸£à¹Œà¸”ิช'
+ },
+ {
+ desc: 'Test 034: RTL ar Arabic',
+ text: 'بول إيردوس',
+ highlight: 'بول إيردوس',
+ expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
+ },
+ {
+ desc: 'Test 035: RTL ar Arabic',
+ text: 'بول إيردوس',
+ highlight: 'بو',
+ expected: '<span class="highlight">بو</span>ل إيردوس'
+ }
+ ];
+ expect(cases.length);
+ var $fixture;
+
+ $.each(cases, function( i, item ) {
+ $fixture = $( '<p></p>' ).text( item.text );
+ $fixture.highlightText( item.highlight );
+ equals(
+ $fixture.html(),
+ $('<p>' + item.expected + '</p>').html(), // re-parse to normalize!
+ item.desc || undefined
+ );
+ } );
+} );
diff --git a/tests/qunit/suites/resources/jquery/jquery.localize.js b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
index 40b58687..cd828634 100644
--- a/tests/qunit/suites/resources/jquery/jquery.localize.js
+++ b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
@@ -1,4 +1,4 @@
-module( 'jquery.localize.js' );
+module( 'jquery.localize', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
diff --git a/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js b/tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
index bb6d2a1b..3a2d0d83 100644
--- a/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js
+++ b/tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
@@ -1,10 +1,10 @@
-module( 'jquery.mwPrototypes.js' );
+module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
test( 'String functions', function() {
equal( $.trimLeft( ' foo bar ' ), 'foo bar ', 'trimLeft' );
equal( $.trimRight( ' foo bar ' ), ' foo bar', 'trimRight' );
- equal( $.ucFirst( 'foo'), 'Foo', 'ucFirst' );
+ equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
equal( $.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
'<!\\-\\- \\(\\[\\{\\+mW\\+\\}\\]\\) \\$\\^\\|\\?>', 'escapeRE - Escape specials' );
@@ -36,6 +36,8 @@ test( 'Is functions', function() {
strictEqual( $.isEmpty( 'string' ), false, 'isEmptry: "string"' );
strictEqual( $.isEmpty( '0' ), true, 'isEmptry: "0"' );
+ strictEqual( $.isEmpty( '' ), true, 'isEmptry: ""' );
+ strictEqual( $.isEmpty( 1 ), false, 'isEmptry: 1' );
strictEqual( $.isEmpty( [] ), true, 'isEmptry: []' );
strictEqual( $.isEmpty( {} ), true, 'isEmptry: {}' );
diff --git a/tests/qunit/suites/resources/jquery/jquery.tabIndex.js b/tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
index 1ff81e58..98ff5508 100644
--- a/tests/qunit/suites/resources/jquery/jquery.tabIndex.js
+++ b/tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
@@ -1,4 +1,4 @@
-module( 'jquery.tabIndex.js' );
+module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(2);
@@ -18,14 +18,11 @@ test( 'firstTabIndex', function() {
'<textarea tabindex="5">Foobar</textarea>' +
'</form>';
- var $testA = $( '<div>' ).html( testEnvironment ).appendTo( 'body' );
+ var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
strictEqual( $testA.firstTabIndex(), 2, 'First tabindex should be 2 within this context.' );
var $testB = $( '<div>' );
strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
-
- // Clean up
- $testA.add( $testB ).remove();
});
test( 'lastTabIndex', function() {
@@ -39,12 +36,9 @@ test( 'lastTabIndex', function() {
'<textarea tabindex="5">Foobar</textarea>' +
'</form>';
- var $testA = $( '<div>' ).html( testEnvironment ).appendTo( 'body' );
+ var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
strictEqual( $testA.lastTabIndex(), 9, 'Last tabindex should be 9 within this context.' );
var $testB = $( '<div>' );
strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
-
- // Clean up
- $testA.add( $testB ).remove();
});
diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
index f47b7f40..7ecdc4b1 100644
--- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
@@ -1,11 +1,13 @@
-(function() {
+( function () {
-module( 'jquery.tablesorter.test.js' );
+var config = {
+ 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',
+ wgContentLanguage: 'en'
+};
-// setup hack
-mw.config.set('wgMonthNames', window.wgMonthNames = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']);
-mw.config.set('wgMonthNamesShort', window.wgMonthNamesShort = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
-mw.config.set('wgDefaultDateFormat', window.wgDefaultDateFormat = 'dmy');
+module( 'jquery.tablesorter', QUnit.newMwEnvironment( config ) );
test( '-- Initial check', function() {
expect(1);
@@ -21,23 +23,24 @@ test( '-- Initial check', function() {
* @return jQuery
*/
var tableCreate = function( header, data ) {
- var $table = $('<table class="sortable"><thead></thead><tbody></tbody></table>'),
- $thead = $table.find('thead'),
- $tbody = $table.find('tbody');
- var $tr = $('<tr>');
- $.each(header, function(i, str) {
- var $th = $('<th>');
- $th.text(str).appendTo($tr);
+ var $table = $( '<table class="sortable"><thead></thead><tbody></tbody></table>' ),
+ $thead = $table.find( 'thead' ),
+ $tbody = $table.find( 'tbody' ),
+ $tr = $( '<tr>' );
+
+ $.each( header, function( i, str ) {
+ var $th = $( '<th>' );
+ $th.text( str ).appendTo( $tr );
});
- $tr.appendTo($thead);
+ $tr.appendTo( $thead );
for (var i = 0; i < data.length; i++) {
- $tr = $('<tr>');
- $.each(data[i], function(j, str) {
- var $td = $('<td>');
- $td.text(str).appendTo($tr);
+ $tr = $( '<tr>' );
+ $.each( data[i], function( j, str ) {
+ var $td = $( '<td>' );
+ $td.text( str ).appendTo( $tr );
});
- $tr.appendTo($tbody);
+ $tr.appendTo( $tbody );
}
return $table;
};
@@ -50,12 +53,13 @@ var tableCreate = function( header, data ) {
*/
var tableExtract = function( $table ) {
var data = [];
- $table.find('tbody').find('tr').each(function(i, tr) {
+
+ $table.find( 'tbody' ).find( 'tr' ).each( function( i, tr ) {
var row = [];
- $(tr).find('td,th').each(function(i, td) {
- row.push($(td).text());
+ $( tr ).find( 'td,th' ).each( function( i, td ) {
+ row.push( $( td ).text() );
});
- data.push(row);
+ data.push( row );
});
return data;
};
@@ -75,7 +79,6 @@ var tableTest = function( msg, header, data, expected, callback ) {
expect(1);
var $table = tableCreate( header, data );
- //$('body').append($table);
// Give caller a chance to set up sorting and manipulate the table.
callback( $table );
@@ -93,18 +96,18 @@ var reversed = function(arr) {
return arr2;
};
-// Sample data set: some planets!
-var header = ['Planet', 'Radius (km)'],
- mercury = ['Mercury', '2439.7'],
- venus = ['Venus', '6051.8'],
- earth = ['Earth', '6371.0'],
- mars = ['Mars', '3390.0'],
- jupiter = ['Jupiter', '69911'],
- saturn = ['Saturn', '58232'];
+// Sample data set using planets named and their radius
+var header = [ 'Planet' , 'Radius (km)'],
+ mercury = [ 'Mercury', '2439.7' ],
+ venus = [ 'Venus' , '6051.8' ],
+ earth = [ 'Earth' , '6371.0' ],
+ mars = [ 'Mars' , '3390.0' ],
+ jupiter = [ 'Jupiter', '69911' ],
+ saturn = [ 'Saturn' , '58232' ];
// Initial data set
-var planets = [mercury, venus, earth, mars, jupiter, saturn];
-var ascendingName = [earth, jupiter, mars, mercury, saturn, venus];
+var planets = [mercury, venus, earth, mars, jupiter, saturn];
+var ascendingName = [earth, jupiter, mars, mercury, saturn, venus];
var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
tableTest(
@@ -114,7 +117,7 @@ tableTest(
ascendingName,
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
tableTest(
@@ -124,7 +127,7 @@ tableTest(
ascendingName,
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
tableTest(
@@ -134,7 +137,7 @@ tableTest(
reversed(ascendingName),
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click().click();
+ $table.find( '.headerSort:eq(0)' ).click().click();
}
);
tableTest(
@@ -144,7 +147,7 @@ tableTest(
ascendingRadius,
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(1)').click();
+ $table.find( '.headerSort:eq(1)' ).click();
}
);
tableTest(
@@ -154,25 +157,23 @@ tableTest(
reversed(ascendingRadius),
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(1)').click().click();
+ $table.find( '.headerSort:eq(1)' ).click().click();
}
);
// Regression tests!
tableTest(
- 'Bug 28775: German-style short numeric dates',
+ 'Bug 28775: German-style (dmy) short numeric dates',
['Date'],
- [
- // German-style dates are day-month-year
+ [ // German-style dates are day-month-year
['11.11.2011'],
['01.11.2011'],
['02.10.2011'],
['03.08.2011'],
['09.11.2011']
],
- [
- // Sorted by ascending date
+ [ // Sorted by ascending date
['03.08.2011'],
['02.10.2011'],
['01.11.2011'],
@@ -180,25 +181,25 @@ tableTest(
['11.11.2011']
],
function( $table ) {
- // @fixme reset it at end or change module to allow us to override it
- mw.config.set('wgDefaultDateFormat', window.wgDefaultDateFormat = 'dmy');
+ mw.config.set( 'wgDefaultDateFormat', 'dmy' );
+ mw.config.set( 'wgContentLanguage', 'de' );
+
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
+
tableTest(
- 'Bug 28775: American-style short numeric dates',
+ 'Bug 28775: American-style (mdy) short numeric dates',
['Date'],
- [
- // American-style dates are month-day-year
+ [ // American-style dates are month-day-year
['11.11.2011'],
['01.11.2011'],
['02.10.2011'],
['03.08.2011'],
['09.11.2011']
],
- [
- // Sorted by ascending date
+ [ // Sorted by ascending date
['01.11.2011'],
['02.10.2011'],
['03.08.2011'],
@@ -206,10 +207,10 @@ tableTest(
['11.11.2011']
],
function( $table ) {
- // @fixme reset it at end or change module to allow us to override it
- mw.config.set('wgDefaultDateFormat', window.wgDefaultDateFormat = 'mdy');
+ mw.config.set( 'wgDefaultDateFormat', 'mdy' );
+
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
@@ -235,6 +236,7 @@ var ipv4Sorted = [
['204.204.132.158'],
['247.240.82.209']
];
+
tableTest(
'Bug 17141: IPv4 address sorting',
['IP'],
@@ -242,7 +244,7 @@ tableTest(
ipv4Sorted,
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
tableTest(
@@ -252,7 +254,7 @@ tableTest(
reversed(ipv4Sorted),
function( $table ) {
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click().click();
+ $table.find( '.headerSort:eq(0)' ).click().click();
}
);
@@ -286,27 +288,36 @@ tableTest(
umlautWords,
umlautWordsSorted,
function( $table ) {
- mw.config.set('tableSorterCollation', {'ä':'ae', 'ö' : 'oe', 'ß': 'ss', 'ü':'ue'});
+ mw.config.set( 'tableSorterCollation', {
+ 'ä': 'ae',
+ 'ö': 'oe',
+ 'ß': 'ss',
+ 'ü':'ue'
+ } );
+
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
- mw.config.set('tableSorterCollation', {});
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
-var planetsRowspan =[["Earth","6051.8"], jupiter, ["Mars","6051.8"], mercury, saturn, venus];
-var planetsRowspanII =[jupiter, mercury, saturn, ['Venus', '6371.0'], venus, ['Venus', '3390.0']];
+var planetsRowspan = [["Earth","6051.8"], jupiter, ["Mars","6051.8"], mercury, saturn, venus];
+var planetsRowspanII = [jupiter, mercury, saturn, ['Venus', '6371.0'], venus, ['Venus', '3390.0']];
tableTest(
- 'Basic planet table: Same value for multiple rows via rowspan',
+ 'Basic planet table: same value for multiple rows via rowspan',
header,
planets,
planetsRowspan,
function( $table ) {
- //Quick&Dirty mod
- $table.find('tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)').remove();
- $table.find('tr:eq(2) td:eq(1)').attr('rowspan', '3');
+ // Modify the table to have a multiuple-row-spanning cell:
+ // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
+ $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.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
tableTest(
@@ -315,11 +326,15 @@ tableTest(
planets,
planetsRowspanII,
function( $table ) {
- //Quick&Dirty mod
- $table.find('tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)').remove();
- $table.find('tr:eq(2) td:eq(0)').attr('rowspan', '3');
+ // Modify the table to have a multiuple-row-spanning cell:
+ // - Remove 1st cell of 4th row, and, 1st cell or 5th row.
+ $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.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
@@ -346,9 +361,10 @@ tableTest(
complexMDYDates,
complexMDYSorted,
function( $table ) {
- mw.config.set('wgDefaultDateFormat', window.wgDefaultDateFormat = 'mdy');
+ mw.config.set( 'wgDefaultDateFormat', 'mdy' );
+
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
@@ -362,9 +378,9 @@ tableTest(
planets,
ascendingNameLegacy,
function( $table ) {
- $table.find('tr:last').addClass('sortbottom');
+ $table.find( 'tr:last' ).addClass( 'sortbottom' );
$table.tablesorter();
- $table.find('.headerSort:eq(0)').click();
+ $table.find( '.headerSort:eq(0)' ).click();
}
);
@@ -472,4 +488,65 @@ test( 'data-sort-value attribute, when available, should override sorting positi
});
+var numbers = [
+ [ '12' ],
+ [ '7' ],
+ [ '13,000'],
+ [ '9' ],
+ [ '14' ],
+ [ '8.0' ]
+];
+var numbersAsc = [
+ [ '7' ],
+ [ '8.0' ],
+ [ '9' ],
+ [ '12' ],
+ [ '14' ],
+ [ '13,000']
+];
+
+tableTest( 'bug 8115: sort numbers with commas (ascending)',
+ ['Numbers'], numbers, numbersAsc,
+ function( $table ) {
+ $table.tablesorter();
+ $table.find( '.headerSort:eq(0)' ).click();
+ }
+);
+
+tableTest( 'bug 8115: sort numbers with commas (descending)',
+ ['Numbers'], numbers, reversed(numbersAsc),
+ function( $table ) {
+ $table.tablesorter();
+ $table.find( '.headerSort:eq(0)' ).click().click();
+ }
+);
+// TODO add numbers sorting tests for bug 8115 with a different language
+
+test( 'bug 32888 - Tables inside a tableheader cell', function() {
+ expect(2);
+
+ var $table;
+ $table = $(
+ '<table class="sortable" id="32888">' +
+ '<tr><th>header<table id="32888-2">'+
+ '<tr><th>1</th><th>2</th></tr>' +
+ '</table></th></tr>' +
+ '<tr><td>A</td></tr>' +
+ '<tr><td>B</td></tr>' +
+ '</table>'
+ );
+ $table.tablesorter();
+
+ equals(
+ $table.find('> thead:eq(0) > tr > th.headerSort').length,
+ 1,
+ 'Child tables inside a headercell should not interfere with sortable headers (bug 32888)'
+ );
+ equals(
+ $('#32888-2').find('th.headerSort').length,
+ 0,
+ 'The headers of child tables inside a headercell should not be sortable themselves (bug 32888)'
+ );
+});
+
})();
diff --git a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
new file mode 100644
index 00000000..1b2f3024
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
@@ -0,0 +1,279 @@
+module( 'jquery.textSelection', QUnit.newMwEnvironment() );
+
+test( '-- Initial check', function() {
+ expect(1);
+ ok( $.fn.textSelection, 'jQuery.fn.textSelection defined' );
+} );
+
+/**
+ * Test factory for $.fn.textSelection( 'encapsulateText' )
+ *
+ * @param options {object} associative array containing:
+ * description {string}
+ * input {string}
+ * output {string}
+ * start {int} starting char for selection
+ * end {int} ending char for selection
+ * params {object} add'l parameters for $().textSelection( 'encapsulateText' )
+ */
+var encapsulateTest = function( options ) {
+ var opt = $.extend({
+ description: '',
+ before: {},
+ after: {},
+ replace: {}
+ }, options);
+
+ opt.before = $.extend({
+ text: '',
+ start: 0,
+ end: 0
+ }, opt.before);
+ opt.after = $.extend({
+ text: '',
+ selected: null
+ }, opt.after);
+
+ test( opt.description, function() {
+ var tests = 1;
+ if ( opt.after.selected !== null ) {
+ tests++;
+ }
+ expect( tests );
+
+ var $textarea = $( '<textarea>' );
+
+ $( '#qunit-fixture' ).append( $textarea );
+
+ //$textarea.textSelection( 'setContents', opt.before.text); // this method is actually missing atm...
+ $textarea.val( opt.before.text ); // won't work with the WikiEditor iframe?
+
+ 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;
+ options.selectionEnd = end;
+ $textarea.textSelection( 'encapsulateSelection', options );
+
+ var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, "\n" );
+
+ equal( text, opt.after.text, 'Checking full text after encapsulation' );
+
+ if (opt.after.selected !== null) {
+ var selected = $textarea.textSelection( 'getSelection' );
+ equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
+ }
+
+ } );
+};
+
+var sig = {
+ 'pre': "--~~~~"
+}, bold = {
+ pre: "'''",
+ peri: 'Bold text',
+ post: "'''"
+}, h2 = {
+ 'pre': '== ',
+ 'peri': 'Heading 2',
+ 'post': ' ==',
+ 'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
+ 'regexReplace': "\$1==\$3==\$4",
+ 'ownline': true
+}, ulist = {
+ 'pre': "* ",
+ 'peri': 'Bulleted list item',
+ 'post': "",
+ 'ownline': true,
+ 'splitlines': true
+};
+
+encapsulateTest({
+ description: "Adding sig to end of text",
+ before: {
+ text: "Wikilove dude! ",
+ start: 15,
+ end: 15
+ },
+ after: {
+ text: "Wikilove dude! --~~~~",
+ selected: ""
+ },
+ replace: sig
+});
+
+encapsulateTest({
+ description: "Adding bold to empty",
+ before: {
+ text: "",
+ start: 0,
+ end: 0
+ },
+ after: {
+ text: "'''Bold text'''",
+ selected: "Bold text" // selected because it's the default
+ },
+ replace: bold
+});
+
+encapsulateTest({
+ description: "Adding bold to existing text",
+ before: {
+ text: "Now is the time for all good men to come to the aid of their country",
+ start: 20,
+ end: 32
+ },
+ after: {
+ text: "Now is the time for '''all good men''' to come to the aid of their country",
+ selected: "" // empty because it's not the default'
+ },
+ replace: bold
+});
+
+encapsulateTest({
+ description: "ownline option: adding new h2",
+ before: {
+ text:"Before\nAfter",
+ start: 7,
+ end: 7
+ },
+ after: {
+ text: "Before\n== Heading 2 ==\nAfter",
+ selected: "Heading 2"
+ },
+ replace: h2
+});
+
+encapsulateTest({
+ description: "ownline option: turn a whole line into new h2",
+ before: {
+ text:"Before\nMy heading\nAfter",
+ start: 7,
+ end: 17
+ },
+ after: {
+ text: "Before\n== My heading ==\nAfter",
+ selected: ""
+ },
+ replace: h2
+});
+
+
+encapsulateTest({
+ description: "ownline option: turn a partial line into new h2",
+ before: {
+ text:"BeforeMy headingAfter",
+ start: 6,
+ end: 16
+ },
+ after: {
+ text: "Before\n== My heading ==\nAfter",
+ selected: ""
+ },
+ replace: h2
+});
+
+
+encapsulateTest({
+ description: "splitlines option: no selection, insert new list item",
+ before: {
+ text: "Before\nAfter",
+ start: 7,
+ end: 7
+ },
+ after: {
+ text: "Before\n* Bulleted list item\nAfter"
+ },
+ replace: ulist
+});
+
+encapsulateTest({
+ description: "splitlines option: single partial line selection, insert new list item",
+ before: {
+ text: "BeforeMy List ItemAfter",
+ start: 6,
+ end: 18
+ },
+ after: {
+ text: "Before\n* My List Item\nAfter"
+ },
+ replace: ulist
+});
+
+encapsulateTest({
+ description: "splitlines option: multiple lines",
+ before: {
+ text: "Before\nFirst\nSecond\nThird\nAfter",
+ start: 7,
+ end: 25
+ },
+ after: {
+ text: "Before\n* First\n* Second\n* Third\nAfter"
+ },
+ replace: ulist
+});
+
+
+var caretTest = function(options) {
+ test(options.description, function() {
+ expect(2);
+
+ var $textarea = $( '<textarea>' ).text(options.text);
+
+ $( '#qunit-fixture' ).append( $textarea );
+
+ if (options.mode == 'set') {
+ $textarea.textSelection('setSelection', {
+ start: options.start,
+ end: options.end
+ });
+ }
+
+ var among = function(actual, expected, message) {
+ if ($.isArray(expected)) {
+ ok($.inArray(actual, expected) !== -1 , message + ' (got ' + actual + '; expected one of ' + expected.join(', ') + ')');
+ } else {
+ equal(actual, expected, message);
+ }
+ };
+
+ var pos = $textarea.textSelection('getCaretPosition', {startAndEnd: true});
+ among(pos[0], options.start, 'Caret start should be where we set it.');
+ among(pos[1], options.end, 'Caret end should be where we set it.');
+ });
+}
+
+var caretSample = "Some big text that we like to work with. Nothing fancy... you know what I mean?";
+
+caretTest({
+ description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
+ text: caretSample,
+ start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
+ end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
+ mode: 'get'
+});
+
+caretTest({
+ description: 'set/getCaretPosition with forced empty selection',
+ text: caretSample,
+ start: 7,
+ end: 7,
+ mode: 'set'
+});
+
+caretTest({
+ description: 'set/getCaretPosition with small selection',
+ text: caretSample,
+ start: 6,
+ end: 11,
+ mode: 'set'
+});
+
diff --git a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.js b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
index bcc9b96b..d73fe5a6 100644
--- a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.js
+++ b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
@@ -1,13 +1,9 @@
-module( 'mediawiki.special.recentchanges.js' );
+module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect( 2 );
- ok( mw.special.recentchanges.init,
- 'mw.special.recentchanges.init defined'
- );
- ok( mw.special.recentchanges.updateCheckboxes,
- 'mw.special.recentchanges.updateCheckboxes defined'
- );
+ ok( mw.special.recentchanges.init, 'mw.special.recentchanges.init defined' );
+ ok( mw.special.recentchanges.updateCheckboxes, 'mw.special.recentchanges.updateCheckboxes defined' );
// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
});
@@ -37,34 +33,34 @@ test( '"all" namespace disable checkboxes', function() {
// TODO abstract the double strictEquals
// At first checkboxes are enabled
- strictEqual( $( '#nsinvert' ).attr( 'disabled' ), undefined );
- strictEqual( $( '#nsassociated' ).attr( 'disabled' ), undefined );
+ strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
+ strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
// Initiate the recentchanges module
mw.special.recentchanges.init();
// By default
- strictEqual( $( '#nsinvert' ).attr( 'disabled' ), 'disabled' );
- strictEqual( $( '#nsassociated' ).attr( 'disabled' ), 'disabled' );
+ strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
+ strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
// select second option...
var $options = $( '#namespace' ).find( 'option' );
- $options.eq(0).removeAttr( 'selected' );
- $options.eq(1).attr( 'selected', 'selected' );
+ $options.eq(0).removeProp( 'selected' );
+ $options.eq(1).prop( 'selected', true );
$( '#namespace' ).change();
// ... and checkboxes should be enabled again
- strictEqual( $( '#nsinvert' ).attr( 'disabled' ), undefined );
- strictEqual( $( '#nsassociated' ).attr( 'disabled' ), undefined );
+ strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
+ strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
// select first option ( 'all' namespace)...
- $options.eq(1).removeAttr( 'selected' );
- $options.eq(0).attr( 'selected', 'selected' );;
+ $options.eq(1).removeProp( 'selected' );
+ $options.eq(0).prop( 'selected', true );
$( '#namespace' ).change();
-
+
// ... and checkboxes should now be disabled
- strictEqual( $( '#nsinvert' ).attr( 'disabled' ), 'disabled' );
- strictEqual( $( '#nsassociated' ).attr( 'disabled' ), 'disabled' );
+ strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
+ strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
// DOM cleanup
$env.remove();
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
new file mode 100644
index 00000000..e04111f1
--- /dev/null
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
@@ -0,0 +1,201 @@
+( function () {
+
+// mw.Title relies on these three config vars
+// Restore them after each test run
+var config = {
+ "wgFormattedNamespaces": {
+ "-2": "Media",
+ "-1": "Special",
+ "0": "",
+ "1": "Talk",
+ "2": "User",
+ "3": "User talk",
+ "4": "Wikipedia",
+ "5": "Wikipedia talk",
+ "6": "File",
+ "7": "File talk",
+ "8": "MediaWiki",
+ "9": "MediaWiki talk",
+ "10": "Template",
+ "11": "Template talk",
+ "12": "Help",
+ "13": "Help talk",
+ "14": "Category",
+ "15": "Category talk",
+ // testing custom / localized namespace
+ "100": "Penguins"
+ },
+ "wgNamespaceIds": {
+ "media": -2,
+ "special": -1,
+ "": 0,
+ "talk": 1,
+ "user": 2,
+ "user_talk": 3,
+ "wikipedia": 4,
+ "wikipedia_talk": 5,
+ "file": 6,
+ "file_talk": 7,
+ "mediawiki": 8,
+ "mediawiki_talk": 9,
+ "template": 10,
+ "template_talk": 11,
+ "help": 12,
+ "help_talk": 13,
+ "category": 14,
+ "category_talk": 15,
+ "image": 6,
+ "image_talk": 7,
+ "project": 4,
+ "project_talk": 5,
+ /* testing custom / alias */
+ "penguins": 100,
+ "antarctic_waterfowl": 100
+ },
+ "wgCaseSensitiveNamespaces": []
+};
+
+module( 'mediawiki.Title', QUnit.newMwEnvironment( config ) );
+
+test( '-- Initial check', function () {
+ expect(1);
+ ok( mw.Title, 'mw.Title defined' );
+});
+
+test( 'Transformation', function () {
+ expect(8);
+
+ var title;
+
+ title = new mw.Title( 'File:quux pif.jpg' );
+ equal( title.getName(), 'Quux_pif' );
+
+ title = new mw.Title( 'File:Glarg_foo_glang.jpg' );
+ equal( title.getNameText(), 'Glarg foo glang' );
+
+ title = new mw.Title( 'User:ABC.DEF' );
+ equal( title.toText(), 'User:ABC.DEF' );
+ equal( title.getNamespaceId(), 2 );
+ equal( title.getNamespacePrefix(), 'User:' );
+
+ title = new mw.Title( 'uSEr:hAshAr' );
+ equal( title.toText(), 'User:HAshAr' );
+ equal( title.getNamespaceId(), 2 );
+
+ 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
+ equal( title.getName(), 'Foo_bar_.js', "Merge multiple spaces to a single space." );
+});
+
+test( 'Main text for filename', function () {
+ expect(8);
+
+ var title = new mw.Title( 'File:foo_bar.JPG' );
+
+ equal( title.getNamespaceId(), 6 );
+ equal( title.getNamespacePrefix(), 'File:' );
+ equal( title.getName(), 'Foo_bar' );
+ equal( title.getNameText(), 'Foo bar' );
+ equal( title.getMain(), 'Foo_bar.JPG' );
+ equal( title.getMainText(), 'Foo bar.JPG' );
+ equal( title.getExtension(), 'JPG' );
+ equal( title.getDotExtension(), '.JPG' );
+});
+
+test( 'Namespace detection and conversion', function () {
+ expect(6);
+
+ var title;
+
+ title = new mw.Title( 'something.PDF', 6 );
+ equal( title.toString(), 'File:Something.PDF' );
+
+ title = new mw.Title( 'NeilK', 3 );
+ equal( title.toString(), 'User_talk:NeilK' );
+ equal( title.toText(), 'User talk:NeilK' );
+
+ title = new mw.Title( 'Frobisher', 100 );
+ equal( title.toString(), 'Penguins:Frobisher' );
+
+ title = new mw.Title( 'antarctic_waterfowl:flightless_yet_cute.jpg' );
+ equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
+
+ title = new mw.Title( 'Penguins:flightless_yet_cute.jpg' );
+ equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
+});
+
+test( 'Throw error on invalid title', function () {
+ expect(1);
+
+ raises(function () {
+ var title = new mw.Title( '' );
+ }, 'Throw error on empty string' );
+});
+
+test( 'Case-sensivity', function () {
+ expect(3);
+
+ var title;
+
+ // Default config
+ mw.config.set( 'wgCaseSensitiveNamespaces', [] );
+
+ title = new mw.Title( 'article' );
+ equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
+
+ // $wgCapitalLinks = false;
+ mw.config.set( 'wgCaseSensitiveNamespaces', [0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15] );
+
+ title = new mw.Title( 'article' );
+ equal( title.toString(), 'article', '$wgCapitalLinks=false: Article namespace is sensitive, first-letter case stays lowercase' );
+
+ title = new mw.Title( 'john', 2 );
+ equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
+});
+
+test( 'toString / toText', function () {
+ expect(2);
+
+ var title = new mw.Title( 'Some random page' );
+
+ equal( title.toString(), title.getPrefixedDb() );
+ equal( title.toText(), title.getPrefixedText() );
+});
+
+test( 'Exists', function () {
+ expect(3);
+
+ var title;
+
+ // Empty registry, checks default to null
+
+ title = new mw.Title( 'Some random page', 4 );
+ strictEqual( title.exists(), null, 'Return null with empty existance registry' );
+
+ // Basic registry, checks default to boolean
+ mw.Title.exist.set( ['Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules'], true );
+ mw.Title.exist.set( ['Does_not_exist', 'User:John', 'Foobar'], false );
+
+ title = new mw.Title( 'Project:Sandbox rules' );
+ assertTrue( title.exists(), 'Return true for page titles marked as existing' );
+ title = new mw.Title( 'Foobar' );
+ assertFalse( title.exists(), 'Return false for page titles marked as nonexistent' );
+
+});
+
+test( 'Url', function () {
+ expect(2);
+
+ var title;
+
+ // Config
+ mw.config.set( 'wgArticlePath', '/wiki/$1' );
+
+ title = new mw.Title( 'Foobar' );
+ equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, toString passing to wikiGetlink' );
+
+ title = new mw.Title( 'John Doe', 3 );
+ equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
+});
+
+}() ); \ No newline at end of file
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
new file mode 100644
index 00000000..265ec2ae
--- /dev/null
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
@@ -0,0 +1,43 @@
+module( 'mediawiki.jqueryMsg' );
+
+test( '-- Initial check', function() {
+ expect( 1 );
+ ok( mw.jqueryMsg, 'mw.jqueryMsg defined' );
+} );
+
+test( 'mw.jqueryMsg Plural', function() {
+ expect( 5 );
+ var parser = mw.jqueryMsg.getMessageFunction();
+ ok( parser, 'Parser Function initialized' );
+ ok( mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
+ equal( parser( 'plural-msg', 0 ) , 'Found 0 items', 'Plural test for english with zero as count' );
+ equal( parser( 'plural-msg', 1 ) , 'Found 1 item', 'Singular test for english' );
+ equal( parser( 'plural-msg', 2 ) , 'Found 2 items', 'Plural test for english' );
+} );
+
+
+test( 'mw.jqueryMsg Gender', function() {
+ expect( 16 );
+ //TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
+ var user = mw.user;
+ user.options.set( 'gender', 'male' );
+ var parser = mw.jqueryMsg.getMessageFunction();
+ ok( parser, 'Parser Function initialized' );
+ //TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
+ ok( mw.messages.set( 'gender-msg', '$1 reverted {{GENDER:$2|his|her|their}} last edit' ), 'mw.messages.set: Register' );
+ equal( parser( 'gender-msg', 'Bob', 'male' ) , 'Bob reverted his last edit', 'Gender masculine' );
+ equal( parser( 'gender-msg', 'Bob', user ) , 'Bob reverted his last edit', 'Gender masculine' );
+ user.options.set( 'gender', 'unknown' );
+ equal( parser( 'gender-msg', 'They', user ) , 'They reverted their last edit', 'Gender neutral or unknown' );
+ equal( parser( 'gender-msg', 'Alice', 'female' ) , 'Alice reverted her last edit', 'Gender feminine' );
+ equal( parser( 'gender-msg', 'User' ) , 'User reverted their last edit', 'Gender neutral' );
+ equal( parser( 'gender-msg', 'User', 'unknown' ) , 'User reverted their last edit', 'Gender neutral' );
+ ok( mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}} reverted last $2 {{PLURAL:$2|edit|edits}}' ), 'mw.messages.set: Register' );
+ equal( parser( 'gender-msg-one-form', 'male', 10 ) , 'User reverted last 10 edits', 'Gender neutral and plural form' );
+ equal( parser( 'gender-msg-one-form', 'female', 1 ) , 'User reverted last 1 edit', 'Gender neutral and singular form' );
+ ok( mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' ), 'mw.messages.set: Register' );
+ equal( parser( 'gender-msg-lowercase', 'male' ) , 'he is awesome', 'Gender masculine' );
+ equal( parser( 'gender-msg-lowercase', 'female' ) , 'she is awesome', 'Gender feminine' );
+ ok( mw.messages.set( 'gender-msg-wrong', '{{gender}} is awesome' ), 'mw.messages.set: Register' );
+ equal( parser( 'gender-msg-wrong', 'female' ) , ' is awesome', 'Wrong syntax used, but ignore the {{gender}}' );
+} );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
index 52cd32c8..24005b64 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
@@ -1,6 +1,6 @@
/* Some misc JavaScript compatibility tests, just to make sure the environments we run in are consistent */
-module( 'mediawiki.jscompat' );
+module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
test( 'Variable with Unicode letter in name', function() {
expect(3);
@@ -33,3 +33,30 @@ test( 'Keyword workaround: "if" as member variable name using Unicode escapes',
deepEqual( foo.\u0069\u0066, orig, 'foo.\\u0069\\u0066' );
});
*/
+
+test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function() {
+ var maxn = 4;
+ expect(maxn * 2);
+
+ var repeat = function(str, n) {
+ if (n <= 0) {
+ return '';
+ } else {
+ var out = Array(n);
+ for (var i = 0; i < n; i++) {
+ out[i] = str;
+ }
+ return out.join('');
+ }
+ };
+
+ for (var n = 0; n < maxn; n++) {
+ var expected = repeat('\n', n) + 'some text';
+
+ var $textarea = $('<textarea>\n' + expected + '</textarea>');
+ equal($textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')');
+
+ var $textarea2 = $('<textarea>').val(expected);
+ equal($textarea2.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')');
+ }
+});
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
index 4beed881..e6934eda 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
@@ -1,4 +1,4 @@
-module( 'mediawiki.js' );
+module( 'mediawiki', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(8);
@@ -80,7 +80,7 @@ test( 'mw.config', function() {
});
test( 'mw.message & mw.messages', function() {
- expect(17);
+ expect(20);
ok( mw.messages, 'messages defined' );
ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
@@ -88,7 +88,7 @@ test( 'mw.message & mw.messages', function() {
var hello = mw.message( 'hello' );
- equal( hello.format, 'parse', 'Message property "format" defaults to "parse"' );
+ equal( hello.format, 'plain', 'Message property "format" defaults to "plain"' );
strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
equal( hello.key, 'hello', 'Message property "key" (currect key)' );
deepEqual( hello.parameters, [], 'Message property "parameters" defaults to an empty array' );
@@ -111,59 +111,45 @@ test( 'mw.message & mw.messages', function() {
strictEqual( hello.exists(), true, 'Message.exists returns true for existing messages' );
var goodbye = mw.message( 'goodbye' );
- strictEqual( goodbye.exists(), false, 'Message.exists returns false for inexisting messages' );
+ strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
// bug 30684
equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
+
+ ok( mw.messages.set( 'pluraltestmsg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
+ var pluralMessage = mw.message( 'pluraltestmsg' , 6 );
+ equal( pluralMessage.plain(), 'There are 6 results', 'plural get resolved when format is plain' );
+ equal( pluralMessage.parse(), 'There are 6 results', 'plural get resolved when format is parse' );
+
});
test( 'mw.msg', function() {
- expect(3);
+ expect(11);
ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
-
equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
- equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (inexisting message)' );
-});
+ equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
-test( 'mw.loader', function() {
- expect(5);
+ ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ) );
+ equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
+ equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
+ equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
- // Regular expression to extract the path for the QUnit tests
- // Takes into account that tests could be run from a file:// URL
- // by excluding the 'index.html' part from the URL
- var rePath = /(?:[^#\?](?!index.html))*\/?/;
+ ok( mw.messages.set('gender-plural-msg' , '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome' ) );
+ equal( mw.msg( 'gender-plural-msg', 'male', 1 ), 'he is awesome', 'Gender test for male, plural count 1' );
+ equal( mw.msg( 'gender-plural-msg', 'female', '1' ), 'she is awesome', 'Gender test for female, plural count 1' );
+ equal( mw.msg( 'gender-plural-msg', 'unknown', 10 ), 'they are awesome', 'Gender test for neutral, plural count 10' );
- // Four assertions to test the above regular expression:
- equal(
- rePath.exec( 'http://path/to/tests/?foobar' )[0],
- "http://path/to/tests/",
- "Extracting path from http URL with query"
- );
- equal(
- rePath.exec( 'http://path/to/tests/#frag' )[0],
- "http://path/to/tests/",
- "Extracting path from http URL with fragment"
- );
- equal(
- rePath.exec( 'file://path/to/tests/index.html?foobar' )[0],
- "file://path/to/tests/",
- "Extracting path from local URL (file://) with query"
- );
- equal(
- rePath.exec( 'file://path/to/tests/index.html#frag' )[0],
- "file://path/to/tests/",
- "Extracting path from local URL (file://) with fragment"
- );
+});
- // Asynchronous ahead
- stop(5000);
+test( 'mw.loader', function() {
+ expect(1);
- // Extract path
- var tests_path = rePath.exec( location.href );
+ // Asynchronous ahead
+ stop();
- mw.loader.implement( 'is.awesome', [QUnit.fixurl( tests_path + 'data/defineTestCallback.js')], {}, {} );
+ mw.loader.implement( 'is.awesome', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/defineTestCallback.js' )], {}, {} );
mw.loader.using( 'is.awesome', function() {
@@ -185,9 +171,9 @@ test( 'mw.loader.bug29107' , function() {
// Message doesn't exist already
ok( !mw.messages.exists( 'bug29107' ) );
- // Async! Include a timeout, as failure in this test leads to neither the
- // success nor failure callbacks getting called.
- stop(5000);
+ // Async! Failure in this test may lead to neither the success nor error callbacks getting called.
+ // Due to QUnit's timeout feauture we won't hang here forever if this happends.
+ stop();
mw.loader.implement( 'bug29107.messages-only', [], {}, {'bug29107': 'loaded'} );
mw.loader.using( 'bug29107.messages-only', function() {
@@ -199,8 +185,31 @@ test( 'mw.loader.bug29107' , function() {
});
});
+test( 'mw.loader.bug30825', function() {
+ // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
+ // Test is for regressions!
+
+ expect(2);
+
+ // Forge an URL to the test callback script
+ var target = QUnit.fixurl(
+ mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
+ );
+
+ // Confirm that mw.loader.load() works with protocol-relative URLs
+ target = target.replace( /https?:/, '' );
+
+ equal( target.substr( 0, 2 ), '//',
+ 'URL must be relative to test relative URLs!'
+ );
+
+ // Async!
+ stop();
+ mw.loader.load( target );
+});
+
test( 'mw.html', function() {
- expect(7);
+ expect(11);
raises( function(){
mw.html.escape();
@@ -214,11 +223,40 @@ test( 'mw.html', function() {
equal( mw.html.element( 'div' ), '<div/>', 'html.element DIV (simple)' );
- equal( mw.html.element( 'div',
- { id: 'foobar' } ),
+ equal(
+ mw.html.element(
+ 'div', {
+ id: 'foobar'
+ }
+ ),
'<div id="foobar"/>',
'html.element DIV (attribs)' );
+ equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
+
+ equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
+
+ equal(
+ mw.html.element(
+ 'option', {
+ selected: true
+ }, 'Foo'
+ ),
+ '<option selected="selected">Foo</option>',
+ 'Attributes may have boolean values. True copies the attribute name to the value.'
+ );
+
+ equal(
+ mw.html.element(
+ 'option', {
+ value: 'foo',
+ selected: false
+ }, 'Foo'
+ ),
+ '<option value="foo">Foo</option>',
+ 'Attributes may have boolean values. False keeps the attribute from output.'
+ );
+
equal( mw.html.element( 'div',
null, 'a' ),
'<div>a</div>',
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.user.js b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
index d5c6baad..15265db5 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.user.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
@@ -1,4 +1,4 @@
-module( 'mediawiki.user.js' );
+module( 'mediawiki.user', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
@@ -16,6 +16,16 @@ test( 'options', function() {
test( 'User login status', function() {
expect(5);
+ /**
+ * Tests can be run under three different conditions:
+ * 1) From tests/qunit/index.html, user will be anonymous.
+ * 2) Logged in on [[Special:JavaScriptTest/qunit]]
+ * 3) Anonymously at the same special page.
+ */
+
+ // Forge an anonymous user:
+ mw.config.set( 'wgUserName', null);
+
strictEqual( mw.user.name(), null, 'user.name should return null when anonymous' );
ok( mw.user.anonymous(), 'user.anonymous should reutrn true when anonymous' );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.util.js b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
index 9c05d9b2..ea28935e 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.util.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
@@ -1,4 +1,4 @@
-module( 'mediawiki.util.js' );
+module( 'mediawiki.util', QUnit.newMwEnvironment() );
test( '-- Initial check', function() {
expect(1);
@@ -47,13 +47,12 @@ test( 'wikiScript', function() {
equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ), 'Defaults to index.php and is equal to wgScript' );
equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
-
});
test( 'addCSS', function() {
expect(3);
- var $testEl = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( 'body' );
+ var $testEl = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
var style = mw.util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
equal( typeof style, 'object', 'addCSS returned an object' );
@@ -62,9 +61,7 @@ test( 'addCSS', function() {
equal( $testEl.css( 'visibility' ), 'hidden', 'Added style properties are in effect' );
// Clean up
- $( style.ownerNode )
- .add( $testEl )
- .remove();
+ $( style.ownerNode ).remove();
});
test( 'toggleToc', function() {
@@ -80,7 +77,7 @@ test( 'toggleToc', function() {
'</div>' +
'<ul><li></li></ul>' +
'</td></tr></table>',
- $toc = $(tocHtml).appendTo( 'body' ),
+ $toc = $(tocHtml).appendTo( '#qunit-fixture' ),
$toggleLink = $( '#togglelink' );
strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
@@ -91,9 +88,6 @@ test( 'toggleToc', function() {
var actionC = function() {
start();
-
- // Clean up
- $toc.remove();
};
var actionB = function() {
start(); stop();
@@ -109,18 +103,18 @@ test( 'toggleToc', function() {
test( 'getParamValue', function() {
expect(5);
- var url1 = 'http://mediawiki.org/?foo=wrong&foo=right#&foo=bad';
+ var url1 = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
equal( mw.util.getParamValue( 'foo', url1 ), 'right', 'Use latest one, ignore hash' );
strictEqual( mw.util.getParamValue( 'bar', url1 ), null, 'Return null when not found' );
- var url2 = 'http://mediawiki.org/#&foo=bad';
+ var url2 = 'http://example.org/#&foo=bad';
strictEqual( mw.util.getParamValue( 'foo', url2 ), null, 'Ignore hash if param is not in querystring but in hash (bug 27427)' );
- var url3 = 'example.com?' + $.param({ 'TEST': 'a b+c' });
+ var url3 = 'example.org?' + $.param({ 'TEST': 'a b+c' });
strictEqual( mw.util.getParamValue( 'TEST', url3 ), 'a b+c', 'Bug 30441: getParamValue must understand "+" encoding of space' );
- var url4 = 'example.com?' + $.param({ 'TEST': 'a b+c d' }); // check for sloppy code from r95332 :)
+ var url4 = 'example.org?' + $.param({ 'TEST': 'a b+c d' }); // check for sloppy code from r95332 :)
strictEqual( mw.util.getParamValue( 'TEST', url4 ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
});
@@ -139,51 +133,55 @@ test( '$content', function() {
strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
});
+
+/**
+ * Portlet names are prefixed with 'p-test' to avoid conflict with core
+ * when running the test suite under a wiki page.
+ * Previously, test elements where invisible to the selector since only
+ * one element can have a given id.
+ */
test( 'addPortletLink', function() {
expect(7);
var mwPanel = '<div id="mw-panel" class="noprint">\
<h5>Toolbox</h5>\
- <div class="portlet" id="p-tb">\
+ <div class="portlet" id="p-test-tb">\
<ul class="body"></ul>\
</div>\
</div>',
- vectorTabs = '<div id="p-views" class="vectorTabs">\
+ vectorTabs = '<div id="p-test-views" class="vectorTabs">\
<h5>Views</h5>\
<ul></ul>\
</div>',
- $mwPanel = $(mwPanel).appendTo( 'body' ),
- $vectorTabs = $(vectorTabs).appendTo( 'body' );
+ $mwPanel = $(mwPanel).appendTo( '#qunit-fixture' ),
+ $vectorTabs = $(vectorTabs).appendTo( '#qunit-fixture' );
- var tbRL = mw.util.addPortletLink( 'p-tb', 'http://mediawiki.org/wiki/ResourceLoader',
+ var tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
- var tbMW = mw.util.addPortletLink( 'p-tb', 'http://mediawiki.org/',
+ var tbMW = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL ),
$tbMW = $( tbMW );
-
+
equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
- equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-tb', 'Link was inserted within correct portlet' );
+ equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
- var tbRLDM = mw.util.addPortletLink( 'p-tb', 'http://mediawiki.org/wiki/RL/DM',
+ var tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
equal( $( tbRLDM ).next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing CSS selector)' );
- var caFoo = mw.util.addPortletLink( 'p-views', '#', 'Foo' );
+ var caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
strictEqual( $tbMW.find( 'span').length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
strictEqual( $( caFoo ).find( 'span').length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
-
+
// Clean up
- $( [tbRL, tbMW, tbRLDM, caFoo] )
- .add( $mwPanel )
- .add( $vectorTabs )
- .remove();
+ $( [tbRL, tbMW, tbRLDM, caFoo] ).remove();
});
test( 'jsMessage', function() {
diff --git a/tests/selenium/SeleniumConfig.php b/tests/selenium/SeleniumConfig.php
index b8cdf1c5..b1487154 100644
--- a/tests/selenium/SeleniumConfig.php
+++ b/tests/selenium/SeleniumConfig.php
@@ -5,7 +5,7 @@ if ( !defined( 'SELENIUMTEST' ) ) {
class SeleniumConfig {
- /*
+ /**
* Retreives the Selenium configuration values from an ini file.
* See sample config file in selenium_settings.ini.sample
*
@@ -72,14 +72,14 @@ class SeleniumConfig {
return false;
}
$header = '';
-
+
$configArray = array();
-
+
while ( ( $line = fgets( $file ) ) !== false ) {
$line = strtok( $line, "\r\n" );
-
+
if ( !$line || $line[0] == ';' ) continue;
-
+
if ( $line[0] == '[' && substr( $line, -1 ) == ']' ) {
$header = substr( $line, 1, -1 );
$configArray[$header] = array();
@@ -95,19 +95,19 @@ class SeleniumConfig {
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/data/SimpleSeleniumTestDB.sql b/tests/selenium/data/SimpleSeleniumTestDB.sql
index 7944c45f..1a3196c3 100644
--- a/tests/selenium/data/SimpleSeleniumTestDB.sql
+++ b/tests/selenium/data/SimpleSeleniumTestDB.sql
@@ -1295,7 +1295,6 @@ CREATE TABLE `mw_user` (
`user_newpassword` tinyblob NOT NULL,
`user_newpass_time` binary(14) DEFAULT NULL,
`user_email` tinytext NOT NULL,
- `user_options` blob 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,
diff --git a/tests/selenium/data/mediawiki118_fresh_installation.sql b/tests/selenium/data/mediawiki118_fresh_installation.sql
index 89bc3191..2724bad5 100644
--- a/tests/selenium/data/mediawiki118_fresh_installation.sql
+++ b/tests/selenium/data/mediawiki118_fresh_installation.sql
@@ -767,13 +767,13 @@ CREATE 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½v7ìÿ‚ä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Þ\nRJTª®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½œüÄ”Ô\"½â’Ä’Tj¥âÌ’T%+¥¢ÔÄ”J¥ZMk.%k\0','2038-01-19 03:14:07');
+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;
@@ -1384,7 +1384,6 @@ CREATE TABLE `mw_user` (
`user_newpassword` tinyblob NOT NULL,
`user_newpass_time` binary(14) DEFAULT NULL,
`user_email` tinytext NOT NULL,
- `user_options` blob 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,
diff --git a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php b/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
index 3557f516..bf5b379d 100644
--- a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
+++ b/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
@@ -30,7 +30,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php b/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
index 4afcdc0e..f1b79459 100644
--- a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
+++ b/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
@@ -30,7 +30,7 @@
require_once ( dirname( __FILE__ ) . '/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
diff --git a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php b/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
index b6a0fc09..2d623afc 100644
--- a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
+++ b/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
@@ -29,7 +29,7 @@
require_once ( dirname( __FILE__ ) . '/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).
diff --git a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php b/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
index 3642a8ef..b112bc0e 100644
--- a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
+++ b/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
@@ -30,7 +30,7 @@
require_once ( dirname( __FILE__ ) . '/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
diff --git a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php b/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
index d70dcc42..024fe5d6 100644
--- a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
+++ b/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
@@ -27,7 +27,7 @@
*
*/
-/*
+/**
* 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
diff --git a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php b/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
index 355a2857..806fcfde 100644
--- a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
+++ b/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
@@ -27,7 +27,7 @@
*
*/
-/*
+/**
* 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
diff --git a/tests/selenium/installer/MediaWikiInstallationConfig.php b/tests/selenium/installer/MediaWikiInstallationConfig.php
index d3067d69..d86bcb85 100644
--- a/tests/selenium/installer/MediaWikiInstallationConfig.php
+++ b/tests/selenium/installer/MediaWikiInstallationConfig.php
@@ -28,7 +28,7 @@
*/
-/*
+/**
* 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
@@ -39,7 +39,7 @@ 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
diff --git a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
index abf9ddf2..399ed4e5 100644
--- a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
+++ b/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
@@ -30,7 +30,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
index fe704a42..f57c1a55 100644
--- a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
+++ b/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
@@ -30,7 +30,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php b/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
index e8b8f9b0..4c052666 100644
--- a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
+++ b/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
@@ -31,7 +31,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php b/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
index b0a38000..b9ca8305 100644
--- a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
+++ b/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
@@ -31,7 +31,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php b/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
index 346f24f8..700172c2 100644
--- a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
+++ b/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
@@ -30,7 +30,7 @@
require_once (dirname(__FILE__).'/'.'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.
diff --git a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php b/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
index 0ab5e659..eb82071e 100644
--- a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
+++ b/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
@@ -30,7 +30,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php b/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
index 7be39c04..0994892f 100644
--- a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
+++ b/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
@@ -29,7 +29,7 @@
require_once (dirname(__FILE__).'/'.'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
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php b/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
index 7b9525af..5fc1a5a6 100644
--- a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
+++ b/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
@@ -1,44 +1,44 @@
<?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() .
@@ -48,10 +48,10 @@ class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
$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' );
@@ -64,6 +64,6 @@ class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
ucfirst( $this->filename ) . '.*has been deleted.' );
*/
}
-
+
}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php b/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
index 5d5ef518..a9a9b4d6 100644
--- a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
+++ b/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
@@ -1,5 +1,5 @@
<?php
-/*
+/**
* Stubs for now. We're going to start populating this test.
*/
class MediawikiCoreSmokeTestSuite extends SeleniumTestSuite
diff --git a/tests/selenium/suites/SimpleSeleniumTestCase.php b/tests/selenium/suites/SimpleSeleniumTestCase.php
index 99a75c12..b87172e6 100644
--- a/tests/selenium/suites/SimpleSeleniumTestCase.php
+++ b/tests/selenium/suites/SimpleSeleniumTestCase.php
@@ -1,11 +1,11 @@
<?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() .
+ $this->open( $this->getUrl() .
'/index.php?title=Selenium&action=edit' );
$this->type( "wpTextbox1", "This is a basic test" );
$this->click( "wpPreview" );
@@ -16,8 +16,8 @@ class SimpleSeleniumTestCase extends SeleniumTestCase {
$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
*/
@@ -26,9 +26,9 @@ class SimpleSeleniumTestCase extends SeleniumTestCase {
$bodyClass = $this->getAttribute( "//body/@class" );
$this-> assertContains('skin-chick', $bodyClass, 'Chick skin not set');
}
-
- /*
- * Just verify that the test db was loaded correctly
+
+ /**
+ * Just verify that the test db was loaded correctly
*/
public function testDatabaseResourceLoadedCorrectly() {
$this->open( $this->getUrl() . '/index.php/TestResources?action=purge' );
diff --git a/tests/selenium/suites/SimpleSeleniumTestSuite.php b/tests/selenium/suites/SimpleSeleniumTestSuite.php
index 3f5e3645..2e0c4ee2 100644
--- a/tests/selenium/suites/SimpleSeleniumTestSuite.php
+++ b/tests/selenium/suites/SimpleSeleniumTestSuite.php
@@ -1,5 +1,5 @@
<?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
diff --git a/tests/testHelpers.inc b/tests/testHelpers.inc
index 5d56e625..7fc60a5c 100644
--- a/tests/testHelpers.inc
+++ b/tests/testHelpers.inc
@@ -1,53 +1,5 @@
<?php
-/**
- * @ingroup Testing
- *
- * Set of classes to help with test output and such. Right now pretty specific
- * to the parser tests but could be more useful one day :)
- *
- * @todo Fixme: Make this more generic
- */
-
-class AnsiTermColorer {
- function __construct() {
- }
-
- /**
- * Return ANSI terminal escape code for changing text attribs/color
- *
- * @param $color String: semicolon-separated list of attribute/color codes
- * @return String
- */
- public function color( $color ) {
- global $wgCommandLineDarkBg;
-
- $light = $wgCommandLineDarkBg ? "1;" : "0;";
-
- return "\x1b[{$light}{$color}m";
- }
-
- /**
- * Return ANSI terminal escape code for restoring default text attributes
- *
- * @return String
- */
- public function reset() {
- return $this->color( 0 );
- }
-}
-
-/* A colour-less terminal */
-class DummyTermColorer {
- public function color( $color ) {
- return '';
- }
-
- public function reset() {
- return '';
- }
-}
-
class TestRecorder {
var $parent;
var $term;
@@ -121,8 +73,8 @@ class DbTestPreviewer extends TestRecorder {
function start() {
parent::start();
- if ( ! $this->db->tableExists( 'testrun' )
- or ! $this->db->tableExists( 'testitem' ) )
+ if ( ! $this->db->tableExists( 'testrun', __METHOD__ )
+ || ! $this->db->tableExists( 'testitem', __METHOD__ ) )
{
print "WARNING> `testrun` table not found in database.\n";
$this->prevRun = false;
@@ -305,7 +257,7 @@ class DbTestRecorder extends DbTestPreviewer {
$this->db->begin();
if ( ! $this->db->tableExists( 'testrun' )
- or ! $this->db->tableExists( 'testitem' ) )
+ || ! $this->db->tableExists( 'testitem' ) )
{
print "WARNING> `testrun` table not found in database. Trying to create table.\n";
$this->db->sourceFile( $this->db->patchPath( 'patch-testrun.sql' ) );
@@ -355,12 +307,12 @@ class TestFileIterator implements Iterator {
private $parserTest; /* An instance of ParserTest (parserTests.php) or MediaWikiParserTest (phpunit) */
private $index = 0;
private $test;
+ private $section = null; /** String|null: current test section being analyzed */
+ private $sectionData = array();
private $lineNum;
private $eof;
function __construct( $file, $parserTest ) {
- global $IP;
-
$this->file = $file;
$this->fh = fopen( $this->file, "rt" );
@@ -369,7 +321,6 @@ class TestFileIterator implements Iterator {
}
$this->parserTest = $parserTest;
- $this->parserTest->showRunFile( wfRelativePath( $this->file, $IP ) );
$this->lineNum = $this->index = 0;
}
@@ -409,128 +360,223 @@ class TestFileIterator implements Iterator {
}
function readNextTest() {
- $data = array();
- $section = null;
+ $this->clearSection();
+
+ # Create a fake parser tests which never run anything unless
+ # asked to do so. This will avoid running hooks for a disabled test
+ $delayedParserTest = new DelayedParserTest();
while ( false !== ( $line = fgets( $this->fh ) ) ) {
$this->lineNum++;
$matches = array();
if ( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
- $section = strtolower( $matches[1] );
+ $this->section = strtolower( $matches[1] );
- if ( $section == 'endarticle' ) {
- if ( !isset( $data['text'] ) ) {
- throw new MWException( "'endarticle' without 'text' at line {$this->lineNum} of $this->file\n" );
- }
-
- if ( !isset( $data['article'] ) ) {
- throw new MWException( "'endarticle' without 'article' at line {$this->lineNum} of $this->file\n" );
- }
+ if ( $this->section == 'endarticle' ) {
+ $this->checkSection( 'text' );
+ $this->checkSection( 'article' );
- $this->parserTest->addArticle( ParserTest::chomp( $data['article'] ), $data['text'], $this->lineNum );
+ $this->parserTest->addArticle( ParserTest::chomp( $this->sectionData['article'] ), $this->sectionData['text'], $this->lineNum );
- $data = array();
- $section = null;
+ $this->clearSection();
continue;
}
- if ( $section == 'endhooks' ) {
- if ( !isset( $data['hooks'] ) ) {
- throw new MWException( "'endhooks' without 'hooks' at line {$this->lineNum} of $this->file\n" );
- }
+ if ( $this->section == 'endhooks' ) {
+ $this->checkSection( 'hooks' );
- foreach ( explode( "\n", $data['hooks'] ) as $line ) {
+ foreach ( explode( "\n", $this->sectionData['hooks'] ) as $line ) {
$line = trim( $line );
if ( $line ) {
- if ( !$this->parserTest->requireHook( $line ) ) {
- return false;
- }
+ $delayedParserTest->requireHook( $line );
}
}
- $data = array();
- $section = null;
+ $this->clearSection();
continue;
}
- if ( $section == 'endfunctionhooks' ) {
- if ( !isset( $data['functionhooks'] ) ) {
- throw new MWException( "'endfunctionhooks' without 'functionhooks' at line {$this->lineNum} of $this->file\n" );
- }
+ if ( $this->section == 'endfunctionhooks' ) {
+ $this->checkSection( 'functionhooks' );
- foreach ( explode( "\n", $data['functionhooks'] ) as $line ) {
+ foreach ( explode( "\n", $this->sectionData['functionhooks'] ) as $line ) {
$line = trim( $line );
if ( $line ) {
- if ( !$this->parserTest->requireFunctionHook( $line ) ) {
- return false;
- }
+ $delayedParserTest->requireFunctionHook( $line );
}
}
- $data = array();
- $section = null;
+ $this->clearSection();
continue;
}
- if ( $section == 'end' ) {
- if ( !isset( $data['test'] ) ) {
- throw new MWException( "'end' without 'test' at line {$this->lineNum} of $this->file\n" );
- }
-
- if ( !isset( $data['input'] ) ) {
- throw new MWException( "'end' without 'input' at line {$this->lineNum} of $this->file\n" );
- }
+ if ( $this->section == 'end' ) {
+ $this->checkSection( 'test' );
+ $this->checkSection( 'input' );
+ $this->checkSection( 'result' );
- if ( !isset( $data['result'] ) ) {
- throw new MWException( "'end' without 'result' at line {$this->lineNum} of $this->file\n" );
+ if ( !isset( $this->sectionData['options'] ) ) {
+ $this->sectionData['options'] = '';
}
- if ( !isset( $data['options'] ) ) {
- $data['options'] = '';
+ if ( !isset( $this->sectionData['config'] ) ) {
+ $this->sectionData['config'] = '';
}
- if ( !isset( $data['config'] ) )
- $data['config'] = '';
-
- if ( ( ( preg_match( '/\\bdisabled\\b/i', $data['options'] ) && !$this->parserTest->runDisabled )
- || !preg_match( "/" . $this->parserTest->regex . "/i", $data['test'] ) ) ) {
+ if ( ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
+ || !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) ) ) {
# disabled test
- $data = array();
- $section = null;
+ $this->clearSection();
+
+ # Forget any pending hooks call since test is disabled
+ $delayedParserTest->reset();
continue;
}
+ # We are really going to run the test, run pending hooks and hooks function
+ wfDebug( __METHOD__ . " unleashing delayed test for: {$this->sectionData['test']}" );
+ $hooksResult = $delayedParserTest->unleash( $this->parserTest );
+ if( !$hooksResult ) {
+ # Some hook reported an issue. Abort.
+ return false;
+ }
+
$this->test = array(
- 'test' => ParserTest::chomp( $data['test'] ),
- 'input' => ParserTest::chomp( $data['input'] ),
- 'result' => ParserTest::chomp( $data['result'] ),
- 'options' => ParserTest::chomp( $data['options'] ),
- 'config' => ParserTest::chomp( $data['config'] ) );
+ 'test' => ParserTest::chomp( $this->sectionData['test'] ),
+ 'input' => ParserTest::chomp( $this->sectionData['input'] ),
+ 'result' => ParserTest::chomp( $this->sectionData['result'] ),
+ 'options' => ParserTest::chomp( $this->sectionData['options'] ),
+ 'config' => ParserTest::chomp( $this->sectionData['config'] ),
+ );
return true;
}
- if ( isset ( $data[$section] ) ) {
+ if ( isset ( $this->sectionData[$this->section] ) ) {
throw new MWException( "duplicate section '$section' at line {$this->lineNum} of $this->file\n" );
}
- $data[$section] = '';
+ $this->sectionData[$this->section] = '';
continue;
}
- if ( $section ) {
- $data[$section] .= $line;
+ if ( $this->section ) {
+ $this->sectionData[$this->section] .= $line;
}
}
return false;
}
+
+
+ /**
+ * Clear section name and its data
+ */
+ private function clearSection() {
+ $this->sectionData = array();
+ $this->section = null;
+
+ }
+
+ /**
+ * Verify the current section data has some value for the given token
+ * name (first parameter).
+ * Throw an exception if it is not set, referencing current section
+ * and adding the current file name and line number
+ *
+ * @param $token String: expected token that should have been mentionned before closing this section
+ */
+ private function checkSection( $token ) {
+ if( is_null( $this->section ) ) {
+ throw new MWException( __METHOD__ . " can not verify a null section!\n" );
+ }
+
+ if( !isset($this->sectionData[$token]) ) {
+ throw new MWException( sprintf(
+ "'%s' without '%s' at line %s of %s\n",
+ $this->section,
+ $token,
+ $this->lineNum,
+ $this->file
+ ));
+ }
+ return true;
+ }
}
+
+/**
+ * A class to delay execution of a parser test hooks.
+ */
+class DelayedParserTest {
+
+ /** Initialized on construction */
+ private $hooks;
+ private $fnHooks;
+
+ public function __construct() {
+ $this->reset();
+ }
+
+ /**
+ * Init/reset or forgot about the current delayed test.
+ * Call to this will erase any hooks function that were pending.
+ */
+ public function reset() {
+ $this->hooks = array();
+ $this->fnHooks = array();
+ }
+
+ /**
+ * Called whenever we actually want to run the hook.
+ * Should be the case if we found the parserTest is not disabled
+ */
+ public function unleash( &$parserTest ) {
+ if( !($parserTest instanceof ParserTest || $parserTest instanceof NewParserTest
+ ) ) {
+ throw new MWException( __METHOD__ . " must be passed an instance of ParserTest or NewParserTest classes\n" );
+ }
+
+ # Trigger delayed hooks. Any failure will make us abort
+ foreach( $this->hooks as $hook ) {
+ $ret = $parserTest->requireHook( $hook );
+ if( !$ret ) {
+ return false;
+ }
+ }
+
+ # Trigger delayed function hooks. Any failure will make us abort
+ foreach( $this->fnHooks as $fnHook ) {
+ $ret = $parserTest->requireFunctionHook( $fnHook );
+ if( !$ret ) {
+ return false;
+ }
+ }
+
+ # Delayed execution was successful.
+ return true;
+ }
+
+ /**
+ * Similar to ParserTest object but does not run anything
+ * Use unleash() to really execute the hook
+ */
+ public function requireHook( $hook ) {
+ $this->hooks[] = $hook;
+ }
+ /**
+ * Similar to ParserTest object but does not run anything
+ * Use unleash() to really execute the hook function
+ */
+ public function requireFunctionHook( $fnHook ) {
+ $this->fnHooks[] = $fnHook;
+ }
+
+} \ No newline at end of file
diff --git a/thumb.php b/thumb.php
index 1fe564d8..60a7ffb6 100644
--- a/thumb.php
+++ b/thumb.php
@@ -8,32 +8,80 @@
*/
define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'phase3/includes/WebStart.php' );
+ require( 'phase3/includes/WebStart.php' );
} else {
- require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
+ require( dirname( __FILE__ ) . '/includes/WebStart.php' );
}
-$wgTrivialMimeDetection = true; //don't use fancy mime detection, just check the file extension for jpg/gif/png.
+// Don't use fancy mime detection, just check the file extension for jpg/gif/png
+$wgTrivialMimeDetection = true;
-require_once( "$IP/includes/StreamFile.php" );
-
-wfThumbMain();
+if ( defined( 'THUMB_HANDLER' ) ) {
+ // Called from thumb_handler.php via 404; extract params from the URI...
+ wfThumbHandle404();
+} else {
+ // Called directly, use $_REQUEST params
+ wfThumbHandleRequest();
+}
wfLogProfilingData();
//--------------------------------------------------------------------------
-function wfThumbMain() {
- wfProfileIn( __METHOD__ );
+/**
+ * Handle a thumbnail request via query parameters
+ *
+ * @return void
+ */
+function wfThumbHandleRequest() {
+ $params = get_magic_quotes_gpc()
+ ? array_map( 'stripslashes', $_REQUEST )
+ : $_REQUEST;
- $headers = array();
+ wfStreamThumb( $params ); // stream the thumbnail
+}
- // Get input parameters
- if ( get_magic_quotes_gpc() ) {
- $params = array_map( 'stripslashes', $_REQUEST );
+/**
+ * Handle a thumbnail request via thumbnail file URL
+ *
+ * @return void
+ */
+function wfThumbHandle404() {
+ # lighttpd puts the original request in REQUEST_URI, while sjs sets
+ # that to the 404 handler, and puts the original request in REDIRECT_URL.
+ if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
+ # The URL is un-encoded, so put it back how it was
+ $uri = str_replace( "%2F", "/", urlencode( $_SERVER['REDIRECT_URL'] ) );
+ # Just get the URI path (REDIRECT_URL is either a full URL or a path)
+ if ( $uri[0] !== '/' ) {
+ $bits = wfParseUrl( $uri );
+ if ( $bits && isset( $bits['path'] ) ) {
+ $uri = $bits['path'];
+ }
+ }
} else {
- $params = $_REQUEST;
+ $uri = $_SERVER['REQUEST_URI'];
+ }
+
+ $params = wfExtractThumbParams( $uri ); // basic wiki URL param extracting
+ if ( $params == null ) {
+ wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+ return;
}
+ wfStreamThumb( $params ); // stream the thumbnail
+}
+
+/**
+ * Stream a thumbnail specified by parameters
+ *
+ * @param $params Array
+ * @return void
+ */
+function wfStreamThumb( array $params ) {
+ wfProfileIn( __METHOD__ );
+
+ $headers = array(); // HTTP headers to send
+
$fileName = isset( $params['f'] ) ? $params['f'] : '';
unset( $params['f'] );
@@ -48,23 +96,23 @@ function wfThumbMain() {
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']);
+ $isOld = ( isset( $params['archived'] ) && $params['archived'] );
unset( $params['archived'] );
// Some basic input validation
$fileName = strtr( $fileName, '\\/', '__' );
// Actually fetch the image. Method depends on whether it is archived or not.
- if( $isOld ) {
+ if ( $isOld ) {
// Format is <timestamp>!<name>
$bits = explode( '!', $fileName, 2 );
- if( !isset($bits[1]) ) {
+ if ( count( $bits ) != 2 ) {
wfThumbError( 404, wfMsg( 'badtitletext' ) );
wfProfileOut( __METHOD__ );
return;
}
$title = Title::makeTitleSafe( NS_FILE, $bits[1] );
- if( is_null($title) ) {
+ if ( !$title ) {
wfThumbError( 404, wfMsg( 'badtitletext' ) );
wfProfileOut( __METHOD__ );
return;
@@ -76,8 +124,8 @@ function wfThumbMain() {
// Check permissions if there are read restrictions
if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
- if ( !$img->getTitle()->userCanRead() ) {
- wfThumbError( 403, 'Access denied. You do not have permission to access ' .
+ if ( !$img->getTitle()->userCan( 'read' ) ) {
+ wfThumbError( 403, 'Access denied. You do not have permission to access ' .
'the source file.' );
wfProfileOut( __METHOD__ );
return;
@@ -86,6 +134,7 @@ function wfThumbMain() {
$headers[] = 'Vary: Cookie';
}
+ // Check the source file storage path
if ( !$img ) {
wfThumbError( 404, wfMsg( 'badtitletext' ) );
wfProfileOut( __METHOD__ );
@@ -111,22 +160,33 @@ function wfThumbMain() {
// Calculate time
wfSuppressWarnings();
$imsUnix = strtotime( $imsString );
- $stat = stat( $sourcePath );
wfRestoreWarnings();
- if ( $stat['mtime'] <= $imsUnix ) {
+ $sourceTsUnix = wfTimestamp( TS_UNIX, $img->getTimestamp() );
+ if ( $sourceTsUnix <= $imsUnix ) {
header( 'HTTP/1.1 304 Not Modified' );
wfProfileOut( __METHOD__ );
return;
}
}
- // Stream the file if it exists already
+ // Stream the file if it exists already...
try {
- if ( false != ( $thumbName = $img->thumbName( $params ) ) ) {
+ $thumbName = $img->thumbName( $params );
+ if ( strlen( $thumbName ) ) { // valid params?
+ // For 404 handled thumbnails, we only use the the base name of the URI
+ // for the thumb params and the parent directory for the source file name.
+ // Check that the zone relative path matches up so squid caches won't pick
+ // up thumbs that would not be purged on source file deletion (bug 34231).
+ if ( isset( $params['rel404'] ) // thumbnail was handled via 404
+ && urldecode( $params['rel404'] ) !== $img->getThumbRel( $thumbName ) )
+ {
+ wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
$thumbPath = $img->getThumbPath( $thumbName );
-
- if ( is_file( $thumbPath ) ) {
- wfStreamFile( $thumbPath, $headers );
+ if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+ $img->getRepo()->streamFile( $thumbPath, $headers );
wfProfileOut( __METHOD__ );
return;
}
@@ -137,35 +197,106 @@ function wfThumbMain() {
return;
}
+ // Thumbnail isn't already there, so create the new thumbnail...
try {
$thumb = $img->transform( $params, File::RENDER_NOW );
- } catch( Exception $ex ) {
+ } catch ( Exception $ex ) {
// Tried to select a page on a non-paged file?
$thumb = false;
}
+ // Check for thumbnail generation errors...
$errorMsg = false;
if ( !$thumb ) {
$errorMsg = wfMsgHtml( 'thumbnail_error', 'File::transform() returned false' );
} elseif ( $thumb->isError() ) {
$errorMsg = $thumb->getHtmlMsg();
- } elseif ( !$thumb->getPath() ) {
+ } elseif ( !$thumb->hasFile() ) {
$errorMsg = wfMsgHtml( 'thumbnail_error', 'No path supplied in thumbnail object' );
- } elseif ( $thumb->getPath() == $img->getPath() ) {
- $errorMsg = wfMsgHtml( 'thumbnail_error', 'Image was not scaled, ' .
- 'is the requested width bigger than the source?' );
- } else {
- wfStreamFile( $thumb->getPath(), $headers );
+ } elseif ( $thumb->fileIsSource() ) {
+ $errorMsg = wfMsgHtml( 'thumbnail_error',
+ 'Image was not scaled, is the requested width bigger than the source?' );
}
+
if ( $errorMsg !== false ) {
wfThumbError( 500, $errorMsg );
+ } else {
+ // 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.
+ *
+ * @param $uri String Thumbnail request URI path
+ * @return Array|null associative params array or null
+ */
+function wfExtractThumbParams( $uri ) {
+ $repo = RepoGroup::singleton()->getLocalRepo();
+
+ $zoneURI = $repo->getZoneUrl( 'thumb' );
+ if ( substr( $zoneURI, 0, 1 ) !== '/' ) {
+ $bits = wfParseUrl( $zoneURI );
+ if ( $bits && isset( $bits['path'] ) ) {
+ $zoneURI = $bits['path'];
+ } else {
+ return null;
+ }
+ }
+ $zoneUrlRegex = preg_quote( $zoneURI );
+
+ $hashDirRegex = $subdirRegex = '';
+ for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) {
+ $subdirRegex .= '[0-9a-f]';
+ $hashDirRegex .= "$subdirRegex/";
+ }
+
+ $thumbUrlRegex = "!^$zoneUrlRegex/((archive/|temp/)?$hashDirRegex([^/]*)/([^/]*))$!";
+
+ // Check if this is a valid looking thumbnail request...
+ if ( preg_match( $thumbUrlRegex, $uri, $matches ) ) {
+ list( /* all */, $rel, $archOrTemp, $filename, $thumbname ) = $matches;
+ $filename = urldecode( $filename );
+ $thumbname = urldecode( $thumbname );
+
+ $params = array( 'f' => $filename, 'rel404' => $rel );
+ if ( $archOrTemp == 'archive/' ) {
+ $params['archived'] = 1;
+ } elseif ( $archOrTemp == 'temp/' ) {
+ $params['temp'] = 1;
+ }
+
+ // Check if the parameters can be extracted from the thumbnail name...
+ if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
+ list( /* all */, $pagefull, $pagenum, $size ) = $matches;
+ $params['width'] = $size;
+ if ( $pagenum ) {
+ $params['page'] = $pagenum;
+ }
+ return $params; // valid thumbnail URL
+ // Hooks return false if they manage to *resolve* the parameters
+ } elseif ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
+ return $params; // valid thumbnail URL (via extension or config)
+ }
+ }
+
+ return null; // not a valid thumbnail URL
+}
+
+/**
+ * Output a thumbnail generation error message
+ *
+ * @param $status integer
+ * @param $msg string
+ * @return void
+ */
function wfThumbError( $status, $msg ) {
global $wgShowHostnames;
+
header( 'Cache-Control: no-cache' );
header( 'Content-Type: text/html; charset=utf-8' );
if ( $status == 404 ) {
@@ -176,7 +307,7 @@ function wfThumbError( $status, $msg ) {
} else {
header( 'HTTP/1.1 500 Internal server error' );
}
- if( $wgShowHostnames ) {
+ if ( $wgShowHostnames ) {
$url = htmlspecialchars( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
$hostname = htmlspecialchars( wfHostname() );
$debug = "<!-- $url -->\n<!-- $hostname -->\n";
@@ -196,4 +327,3 @@ $debug
EOT;
}
-
diff --git a/thumb_handler.php b/thumb_handler.php
new file mode 100644
index 00000000..35a855f8
--- /dev/null
+++ b/thumb_handler.php
@@ -0,0 +1,8 @@
+<?php
+
+# Valid web server entry point
+define( 'THUMB_HANDLER', true );
+
+# Execute thumb.php, having set THUMB_HANDLER so that
+# it knows to extract params from a thumbnail file URL.
+require( dirname( __FILE__ ) . '/thumb.php' );
diff --git a/thumb_handler.php5 b/thumb_handler.php5
new file mode 100644
index 00000000..9090b01c
--- /dev/null
+++ b/thumb_handler.php5
@@ -0,0 +1 @@
+<?php require './thumb_handler.php';
diff --git a/trackback.php b/trackback.php
deleted file mode 100644
index 0e2036a9..00000000
--- a/trackback.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/**
- * Provide functions to handle article trackbacks.
- * @file
- * @ingroup SpecialPage
- */
-
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'phase3/includes/WebStart.php' );
-} else {
- require ( dirname( __FILE__ ) . '/includes/WebStart.php' );
-}
-
-class TrackBack {
-
- private $r, $url, $title = null;
-
- private function XMLsuccess() {
- header( "Content-Type: application/xml; charset=utf-8" );
- echo <<<XML
-<?xml version="1.0" encoding="utf-8"?>
-<response>
- <error>0</error>
-</response>
-XML;
- exit;
- }
-
- private function XMLerror( $err = "Invalid request." ) {
- header( "HTTP/1.0 400 Bad Request" );
- header( "Content-Type: application/xml; charset=utf-8" );
- echo <<<XML
-<?xml version="1.0" encoding="utf-8"?>
-<response>
- <error>1</error>
- <message>Invalid request: $err</message>
-</response>
-XML;
- exit;
- }
-
- public function __construct() {
- global $wgUseTrackbacks, $wgRequest;
-
- if( !$wgUseTrackbacks )
- $this->XMLerror( "Trackbacks are disabled" );
-
- $this->r = $wgRequest;
-
- if( !$this->r->wasPosted() ) {
- $this->XMLerror( "Must be posted" );
- }
-
- $this->url = $wgRequest->getText( 'url' );
- $article = $wgRequest->getText( 'article' );
-
- if( !$this->url || !$article ) {
- $this->XMLerror( "Required field not specified" );
- }
-
- $this->title = Title::newFromText( $article );
- if( !$this->title || !$this->title->exists() ) {
- $this->XMLerror( "Specified article does not exist." );
- }
- }
-
- public function write() {
- $dbw = wfGetDB( DB_MASTER );
-
- $tbtitle = $this->r->getText( 'title' );
- $tbex = $this->r->getText( 'excerpt' );
- $tbname = $this->r->getText( 'blog_name' );
-
- $dbw->insert('trackbacks', array(
- 'tb_page' => $this->title->getArticleID(),
- 'tb_title' => $tbtitle,
- 'tb_url' => $this->url,
- 'tb_ex' => $tbex,
- 'tb_name' => $tbname
- ));
-
- $dbw->commit();
-
- $this->XMLsuccess();
- }
-}
-
-$tb = new TrackBack();
-$tb->write();
diff --git a/trackback.php5 b/trackback.php5
deleted file mode 100644
index fe811760..00000000
--- a/trackback.php5
+++ /dev/null
@@ -1 +0,0 @@
-<?php require './trackback.php'; \ No newline at end of file